首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClientDataSet TBCDField舍入

ClientDataSet TBCDField舍入
EN

Stack Overflow用户
提问于 2014-03-10 14:42:19
回答 2查看 413关注 0票数 0

我正在使用Delphi 5+ BDE + Oracle。我的职能如下:

代码语言:javascript
复制
class function TClientDataSetFactory.GetClientDataSet(
      const qryGen: TDataSet): TClientDataSet;
    var
       dspDados: TDataSetProvider;
    begin
       Result := nil;
       try
          try
             Result := TClientDataSet.Create(nil);
             dspDados := TDataSetProvider.Create(Result);
             dspDados.DataSet := qryGen;
             qryGen.Active := True;
             qryGen.First;

             Result.Data := dspDados.Data;

             Result.First;
          except
             on E: Exception do
             begin
                raise;
             end;
          end;
       finally
       end;
    end;

因此,当运行如下:

代码语言:javascript
复制
var
   qryGen: TQuery;
   cdsGen: TClientDataSet;
begin
   qryGen := nil;
   try
      try
         qryGen := CriaQuery();
         qryGen.SQL.Text :=
            'SELECT SUM(TOTAL) AS TOTAL FROM MYTABLE';
         cdsGen :=  TClientDataSetFactory.GetClientDataSet(qryGen);
         ShowMessageFmt('Total: %f', [cdsGen.FieldByName('TOTAL').AsFloat]);
      except
         on E: Exception do
         begin
            raise;
         end;
      end;
   finally
      if Assigned(qryGen) then FreeAndNil(qryGen);
   end;
end;

我有"159,00“,但是,如果我运行这个:

ShowMessageFmt('Total:%f',qryGen.FieldByName('TOTAL').AsFloat);

我得到了"159,25“

有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 14:00:58

我用另一个解决办法解决了这个问题。

代码语言:javascript
复制
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;

问题是((FieldDefsintCont.Size = 0)和(FieldDefsintCont.DataType = ftBCD))。当创建ClientDataSet时,字段会被截断,因为当oracle具有类似于"SUM(TOTAL)“的函数时,结果字段将被创建为0大小,因此clientdataset将该字段处理为Integer字段。

票数 1
EN

Stack Overflow用户

发布于 2014-03-13 18:49:59

试着

ShowMessageFmt('Total: %n', [cdsGen.FieldByName('TOTAL').AsFloat])

或者这个

cdsGen := TClientDataSetFactory.GetClientDataSet(qryGen); **(cdsGen.FieldByName('Total') as TFloatField).DisplayFormat := '0.00';** ShowMessageFmt('Total: %f', [cdsGen.FieldByName('TOTAL').AsFloat])

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22303298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档