我习惯于计算计算字段的余额。但是当我连接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中移动滚动列号(总计)将更改。 我想知道如何阻止这种变化。
答案 0 :(得分:3)
计算字段设计为在行级别显示值计算,未设计以进行聚合(基于一组行进行计算)。
例如,数据库层将以无特定顺序触发OnCalc
事件,并且每次都需要获取字段的值(例如,对于显示目标),因为该值未存储且可能(通常也会)取决于其他领域的价值。
在一组10行中,你可以为行1,2,3,4,5调用它,然后再调用1行......
例如,您可以在line_total列中使用它,该列是quantity
和unit_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