sql >> データベース >  >> RDS >> Oracle

ClientDataSetTBCDFieldの丸め

    私は別の解決策で問題を解決しました。

    type
       TInternalQuery = class(TQuery)
       protected
          procedure InternalInitFieldDefs; override;
       public
          constructor Create(AOwner: TComponent; const qryGen: TQuery); reintroduce;
       end;
    
    constructor TInternalQuery.Create(AOwner: TComponent; const qryGen: TQuery);
    var
       intCont: Integer;
    begin
       inherited Create(AOwner);
       Self.DatabaseName := qryGen.DatabaseName;
       Self.UpdateObject := qryGen.UpdateObject;
    
       Self.SQL.Text := qryGen.SQL.Text;
    
       for intCont := 0 to Self.ParamCount - 1 do
       begin
         Self.Params[intCont].Value := qryGen.Params[intCont].Value;
       end;  
    end;
    
    procedure TInternalQuery.InternalInitFieldDefs;
    var
       intCont: Integer;
    begin
       inherited InternalInitFieldDefs;
       for intCont := 0 to FieldDefs.Count - 1 do
       begin
          if (FieldDefs[intCont].Size = 0) and (FieldDefs[intCont].DataType = ftBCD) then
          begin
             FieldDefs[intCont].Precision := 64;
             FieldDefs[intCont].Size := 32;
          end;  
       end;  
    end;
    

    問題は((FieldDefs [intCont] .Size =0)および(FieldDefs [intCont] .DataType =ftBCD))です。 ClientDataSetが作成されると、フィールドは切り捨てられます。これは、oracleに「SUM(TOTAL)」のような関数がある場合、結果フィールドはサイズ0で作成されるため、clientdatasetはフィールドを整数フィールドとして処理するためです。



    1. 複数の条件がSafeMysqlに一致する場所の選択

    2. オラクルの千のセパレータ関数?

    3. OracleSQLで2つの日付間の経過時間を検索します

    4. 一意性の制約を処理するためにSQLiteUPDATEでORDERBYをシミュレートします