4

TClientDataSet での時間のかかる操作中に、一時的にOnCalcFieldsイベントを無効にしたいとします (例: を設定することにより)。cdsCalcFields := nilメソッドを再アタッチするときに計算フィールドの再計算を実行するように TClientDataSet に指示するにはどうすればよいOnCalcFieldsですか?

手動での再計算が必要になる可能性のある別の状況としては、一部の計算フィールドが他のデータセットに依存している状況があります (たとえば、計算フィールドが他のデータセットからの集計値を一時的に保持するために使用されている場合など)。OnCalcFieldsイベントは他のデータセットから正しい値を取得するのに十分な頻度で実行されるため、ほとんどの場合、これは問題なく機能します。ただし、状況によっては、他のデータセットから正しい値を取得するために再計算が必要になることがあります。

AutoCalcFieldsプロパティを に設定するFalseと、手動での再計算が必要になる場合もあります。

イベントの実行を減らす方法についていくつかの説明を見てきましたOnCalcFieldsが、再計算を実行する簡単な方法が見つかりません...

助言がありますか?

4

3 に答える 3

6

計算フィールドは、レコードがデータベースから取得されるときに計算されるためRefresh、データセットに対して呼び出し (または [閉じる] -> [開く]) を実行して再計算を強制します。

(質問のコメントに関して)、データセットで呼び出すことができる 1 つのレコードのみで再計算を強制するRefreshRecordには。特定のデータセットの子孫がメソッドを実装していない場合、呼び出しがEdit続くCancelと同じことが達成されます。

于 2011-05-26T10:52:36.550 に答える
2

Refresh または Close-> を呼び出すと、テーブル全体がデータベースから再ロードされる可能性があります。これが望ましくない場合は、CDS を渡して OnCalc メソッドを呼び出すことができます。ただし、カーソルを手動でスライドする必要がある場合があります。

with DisplayAcctListCDS do begin
  First;
  while not Eof do begin
    Edit;
    DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
    Next;
  end;
end;

DisplayAcctListCDS が計算フィールドを持つ TClientDataSet であり、DisplayAcctListCDSCalcFields が OnCalcFields に対して生成されたイベント メソッドであると仮定します。

于 2011-12-06T17:26:26.587 に答える
0

これはちょっとしたハックですが、この質問に対する 100% の回答です!

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)
于 2017-09-17T12:11:31.440 に答える