计算的现场运行总数

时间:2012-11-29 10:22:38

标签: delphi

我习惯于计算计算字段的余额。但是当我连接dbgrid时。通过移动滚动计算错误。 请求帮助

var
 Form1: TForm1;
 i : Integer;

procedure TForm1.FormShow(Sender: TObject);
 begin
 i := 0;
 DataSource1.DataSet := ADOTable1;
 DBGrid1.DataSource := DataSource1;
end;

 procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet);
  begin
   i := (ADOTable1Debtor.AsInteger - ADOTable1creditor.AsInteger) + i;
   ADOTable1Total.AsInteger := i;
  end;

现在运行应用程序并在dbgrid中移动滚动列号(总计)将更改。 我想知道如何阻止这种变化。

2 个答案:

答案 0 :(得分:3)

计算字段设计为在行级别显示值计算未设计以进行聚合(基于一组行进行计算)。

例如,数据库层将以无特定顺序触发OnCalc事件,并且每次都需要获取字段的值(例如,对于显示目标),因为该值未存储且可能(通常也会)取决于其他领域的价值。

在一组10行中,你可以为行1,2,3,4,5调用它,然后再调用1行......

例如,您可以在line_total列中使用它,该列是quantityunit_price的乘积,但您无法使用它来显示,例如所有行的sum(line_total),正如我推断您在显示的代码中尝试做的那样。

如何执行聚合?

您可能希望将DataSet链接到具有AggregateFields的ClientDataSet,您可以在其中根据索引对整个行集或子集执行SUM(Quantity * Price)等计算。

要了解有关AggregateFields的更多信息,请阅读Cary Jensen在EDN中的ClientDataSet Aggregates and GroupState

答案 1 :(得分:0)

您正在尝试的内容无法使用,因为任何滚动都会更改结果。 使用AdoDataset代替Commandtext

select ID, creditor, Debtor,(Select sum (Debtor-Creditor) from Table1 t where t.ID<=Table1.ID) as Total
from Table1 order by ID