delphi 数据集计算字段在DBGrid中出现问题

jq6vz3qz  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(148)

我有一个计算字段'余额'显示两个数据集字段之间的余额金额,我用下一个代码来计算它的值:

var
  Balance : Currency;

...

procedure TMyForm.MyQueryCalcFields(DataSet: TDataSet);
begin
  if MyQuery.FieldByName('MyFirst Field').AsCurrency > 0 then    
    Balance := Balance+MyQuery.FieldByName('MyFirst Field').AsCurrency;

  if MyQuery.FieldByName('MySecond Field').AsCurrency > 0 then   
    Balance := Balance-MyQuery.FieldByName('MySecond Field').AsCurrency;

  MyQuery.FieldByName('Balance').AsCurrency := Balance;
end;

并且我使用TDBGrid来显示我的查询结果,dbgrid显示正确的值,直到我开始滚动它的垂直滚动条,在本例中它显示错误的值。
我尝试将“0”分配给余额,但结果相同(开始滚动时的值错误)。
如何使dbgrid保持显示正确的值?

js81xvg6

js81xvg61#

OnCalcField事件处理程序是为仅依赖于当前记录值的计算而设计的。
如果您使用的数据集类允许这样做,我建议您在加载数据后立即计算一次balance字段,例如:

var
    Balance : Currency;
begin
    Balance := 0;

    MyQuery.DisableControls();
    try
        //loading data
        MyQuery.Open;

        //calculating balance
        while(not MyQuery.Eof) do
        begin
            MyQuery.Edit;
            Balance := Balance + MyQuery.FieldByName('MyFirst Field').AsCurrency - MyQuery.FieldByName('MySecond Field').AsCurrency;
            MyQuery.FieldByName('Balance').AsCurrency := Balance;
            MyQuery.Post;

            MyQuery.Next;
        end;
        MyQuery.First;
    finally
        MyQuery.EnableControls();
    end;
end;

相关问题