2012-04-25 27 views
2

を使用して、次のように私は、マスター/ディテールClientDataSetのを持っている(これらは作成されている/実行時に読み込まとデータが移入API呼び出し、無データベース接続から返された):DELPHI:マスター・ディテールClientDataSetのとCalcFields

Services: 
    ID 
    Name 
    BasePrice 
    etc. 

AddOns: 
    Selected 
    ID 
    ServiceID 
    Name 
    Quantity 
    UnitCost 
    TotalCost 
    etc. 

サービスをドロップダウンフィールドとして表示し、そのサービスの利用可能なアドオンをグリッドに入力します。フィールド 'TotalCost'は、それ自身の列のグリッドに表示される計算フィールドです。 「選択済み」フィールドは、グリッドに表示されたチェックボックスを追跡して、顧客がその特定のアドオンを必要としていることを示すために使用されます。

これはすべて正常に動作します。私は今、サービスとアドオンの合計コストを計算する必要があります。

ClientDataSetServices.FieldByName('BasePrice').Value 

ただし、私は各選択されたアドオンからTotalCostを取得することができません。私はAggregateフィールドを使うことができると思っていましたが、私の検索ではマスター/ディテールの設定を使用することができませんでした。また、ClientsDataSetの詳細を次のように繰り返してみました。

(within the CalcFields method of the details ClientDataSet) 
    // Add parts to parts cost 
    grdMain.DataSource.DataSet.First; 
    while not grdMain.DataSource.DataSet.Eof do begin 

    if (grdMain.DataSource.DataSet.FieldByName('Selected').Value) then begin 
     FPartsCost := FPartsCost +  
        grdMain.DataSource.DataSet.FieldByName('TotalPrice').Value; 
    end; 

    grdMain.DataSource.DataSet.Next; 
    end; 

ただし、これによって無限ループが発生します。このコード部分をデバッグすると、DataSet.FirstがCalcFields(またはCalcFieldsを呼び出している何か)を呼び出しています。

選択したアドオンのデータセットを反復処理して、選択または数量が変更されたときに、合計コストを動的に計算する方法を教えてください。

--EDIT--

次のように私はセットアップに詳細テーブルに集計を試してみました: アクティブを次のようにフィールドを設定します

  • を追加しましたTAggregate 'AggregatePrice'
  • - True 名前 - 集計価格 ' 式 - SUM(合計価格) グループ化レベル - 1 IndexName - ServiceId 可視 - 真

私はこれを実行すると、私は「internalcalcを使用し、フィールド 『TotalPrice』集計に使用するcalcualtedフィールドの正しいタイプではありません」というエラーメッセージが取得

+0

*「これはマスター/詳細設定を使用して実行できません」* - これは正しくありません。「TAggregateFieldまたは「TAggregate」についてはまだ読んでいますか? –

+0

元の質問のEDITを参照してください。 – BrianKE

+0

私は編集を見ることができません... –

答えて

5

あなたの編集後、答えは明らかです:簡単なCalcFieldの代わりにInternalCalcフィールドを使用してください!

計算はまだOnCalcField内で行われますが、dsInternalCalcのTDataset.Stateをチェックする必要があります。

これは、dsInternalCalcの後でdsCalcFields状態の前に集計が計算されるため必要です。

補足として、InternalCalcフィールドはインデックスに使用できますが、単純なCalcFieldでは使用できません。

+0

私はInternalCalcフィールドを使用して多くを見つけることはできませんので、私はこれを正しく行ったかどうか教えてください? TotalPriceをInternalCalcFieldに変更しました。私はAggregateを削除し、その場所でAggregateField(AggregatePrice)を式 "SUM(TotalPrice)"で作成し、実行時のIndexNameをField:TotalPriceとGroupingLevel:1に設定しました。唯一の問題は、CalcFieldsが呼び出されたときにAggregatePriceが常にNull。 – BrianKE

+0

TotalPriceがあなたの質問のTotalCostと同じであると仮定して、TotalPriceの代わりにIndexNameをSelectedに設定する必要があります。さもなければ、集計はTotalPriceのそれぞれの異なる値に基づいて構築されます。 –

+0

とにかく、Cary Jensensの優れた本[Delphi in Depth:ClientDataSets](http://jensendatasystems.com/cdsbook/) –

0

一つの方法だろう詳細についてはクローンカーソルを使用すること - ソースの内容と同期して保持されますが、独立してナビゲートできるデータセットのコピー。

例えば、

あなたが必要な場合は、再度それらを設定する必要がありますので、クローン化されたカーソルは、任意の計算フィールドまたは元に関連付けられたイベントのいずれかを持っていないことを念頭に置い
CopyCDS.CloneCursor(OriginalCDS,False); // check params in help to see options 
CopyCDS.First; 
while not CopyCDS.EOF do 
    begin 
    // do stuff to calculate what you need 
    CopyCDS.Next; 
    end; 

ベア。

関連する問題