1

計算フィールドのバランスを計算するのに慣れていますが、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 の列数 (合計) が変化します。変更を停止する方法を知りたいです。

4

2 に答える 2

3

計算フィールドは、行レベルで値の計算を表示するように設計されており、集計 (一連の行に基づく計算) を行うようには設計されていません。

たとえば、データベース層はOnCalc特定の順序でイベントを発生させず、フィールドの値を取得するために毎回必要になります (たとえば、表示目的のため)。他のフィールドの値。

10 行のセットでは、行 1、2、3、4、5 に対して呼び出され、次に 1 で呼び出されます...

たとえば、quantityandの積である line_total 列で使用できますが、表示されたコードで行おうとしていると推測されるように、すべての行などunit_priceを表示するために使用することはできません。sum(line_total)

集計を実行する方法は?

DataSet を AggregateFields を持つ ClientDataSet にリンクするとSUM(Quantity * Price)、インデックスに基づいて行セット全体またはサブセットに対して計算を実行できます。

AggregateFields の詳細については、EDN の Cary Jensen によるClientDataSet Aggregates と GroupState を参照してください。

于 2012-11-29T21:30:59.770 に答える
0

スクロールすると結果が変わるため、あなたが試みていることはうまくいきません。次の Commandtext を使用して、代わりに AdoDataset を取得します。

select ID, creditor, Debtor,(Select sum (Debtor-Creditor) from Table1 t where t.ID<=Table1.ID) as Total
from Table1 order by ID
于 2012-11-29T11:49:46.053 に答える