2013-07-28 58 views
10

私はClientDatSetに2,のフィールドがあります。 CDSはどのプロバイダにもリンクされていません。代わりに、その場で満たされています。 CDSに「計算可能な」すべてのフィールドを再計算させるにはどうすればよいですか? Refresh()にデータを更新するプロバイダがないため、私は電話することができません。私が今までに来た唯一の方法は、すべてのレコードをナビゲートすることです。これは最善の方法ではありません。クライアントデータセットで計算フィールドと内部計算フィールドを再計算する方法

PS:私はthis questionthis postを読んでいますが、私はよりエレガントな方法を望んでいます。

+0

したがって、データセットを閉じることはできません。 –

+0

@SertacAkyuzまだ試したことはありません。クライアントデータセットを閉じても、その中のすべてのデータがクリアされませんか? –

+0

......... –

答えて

8

ヘルパー(これは必要に応じて削除されています)を使用すると、保護されたメソッドをハックすることなく呼び出すことができます。 fCInternalCalcフィールドのOnCalcFields内にあるDataSet.State = dsInternalCalcを確認してください。

type 
    TClientDataSetHelper = class helper for TClientDataSet 
    public 
    function AssureEditing: Boolean; 
    procedure InternalCalc; 
    end; 

function TClientDataSetHelper.AssureEditing: Boolean; 
begin 
    result := not (State in [dsEdit, dsInsert]); 
    if result then 
    Edit; 
end; 

procedure TClientDataSetHelper.InternalCalc; 
var 
    needsPost: Boolean; 
    saveState: TDataSetState; 
begin 
    needsPost := AssureEditing; 
    saveState := setTempState(dsInternalCalc); 
    try 
    RefreshInternalCalcFields(ActiveBuffer); 
    finally 
    RestoreState(saveState); 
    end; 
    if needsPost then 
    Post; 
end; 

これは、CalculateFieldsを使用して通常の計算フィールドで簡単に拡張できます。これは必須ではありませんが、他のデータフィールドが変更されるたびに計算フィールドが再計算されるためです。

+0

私はこれを試して、 "[dcc32エラー] dMyDataModule.pas(151)を取得します:E2389保護されたメンバー 'TDataSet.RefreshInternalCalcFields'はここではアクセスできません" *。 – GolezTrol

+0

@GolezTrolは、バグのようです。 XE3では動作しますが、XE7とXE8では動作しません(現在はXE4からXE6を確認できません)。他の保護されたメンバーは完全にアクセス可能です: "setTempState"、 "RestoreState"。ちょうどRSP-11337として報告されました。 –

+0

これを絞り込むために、私はXE5を使いました。テストをありがとう!私は今、より古典的なクラスヘルパーを使用してそれを解決しました:局所的に定義された 'THackClientDataSet =クラス(TClientDataSet)'への型キャスティング。 – GolezTrol

-1

これは少しハックですが、機能します!

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first 
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure) 
+0

これはすでに受け入れられている回答をどのように改善しますか? –

+0

1. Delphiのデフォルト関数 を使用2.ショット 3.簡単 –

+0

4.変更状態を早く使用してください! –

関連する問題