2012-11-29 125 views
0

我用來計算計算字段的平衡,但是當我連接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

什麼是'我'?它在哪裏初始化?問題很不清楚。你正在使用哪個版本的Delphi? –

+0

在formshow.delphi xe3中的初始值。當您使用字段計算移動鼠標或鍵盤時,dbgrid是錯誤的。 – hamid

+1

爲什麼你要標記delphi-7和delphi-xe2呢?請儘量準確。至於這個問題,我無法理解它。我真的不知道你在做什麼以及你在問什麼。也許更多的代碼會有所幫助。 –

回答

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 
+0

謝謝。但是用這個方法再次吃的問題。[鏈接](http://stackoverflow.com/questions/13439687/running-total-order-by-date-in-sqlite) – hamid

3

的計算字段旨在顯示值計算行級不是(基於一組行計算)設計進行聚合。

例如,數據庫層將以特定順序觸發OnCalc事件,並且每次都需要獲取該字段的值(例如,用於顯示pruposes),因爲該值未被存儲並且可能(和通常這樣做)取決於其他領域的價值。

在一組的10行,你可以得到它呼籲行1,2,3,4,5,然後在1再次...

您可以使用它,例如,在line_total列是quantityunit_price的乘積,但不能用它來表示例如所有行的sum(line_total),因爲我推斷你正在試圖在所示的代碼中做。

如何執行聚合呢?

您可能想要將您的DataSet鏈接到一個ClientDataSet,它具有AggregateFields,您可以在其中基於索引對整個行集或子集執行計算,如SUM(Quantity * Price)

要了解有關AggregateFields的更多信息,請閱讀Cary Jensen在EDN中的ClientDataSet Aggregates and GroupState