2016-08-08 14 views
1

TDatasetProvider.OnBeforeUpdateRecordで、 は、 のDeltaDSパラメータのソースまたは元のクライアントデータセットにどのようにアクセスしますか?Delphi:デルタ経由でclientdatasetにアクセスする方法

procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject; 
    SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; 
    var Applied: Boolean); 
var 
    sourceCDS: TClientDataset; 
begin 
    sourceCDS := DeltaDS.???; 
    ... 
end; 

対応するクライアントデータセットからいくつかのプロパティにアクセスする必要があります。セットアップはTSQLDataset/TDatasetProvider/TClientDatasetです。

編集: すべてこの手間の原因は、私がTDatasetProviderからコンポーネントを引き出すと、デフォルトOnBeforeUpdateRecordを割り当てるたかったです。

+0

SourceDSは何? –

+1

あなたは幾分混乱しているようです。 'SourceDS'はソース(元の)データセットであり、' DeltaDS'は 'SourceDS'で発生した変更を含みます。 –

+0

Kenに感謝しますが、私は混乱しません。私はSourceDSが何であるか知っています。私が知りたいのは、ClientDataSetが問題のDeltaDSを生成したものです。 – JeffP

答えて

0

私はSourceDSが探しているものだと思います。

送信者パラメータは、更新プログラムを適用しているプロバイダを識別します。

SourceDSパラメータは、データの発信元となるデータセットです。 ソースデータセットがない場合、この値はnil(Delphi)またはNULL (C++)です。イベントが発生したときにソースデータセットがアクティブでない可能性があります。したがって、 は、そのデータにアクセスする前にActiveプロパティをtrueに設定しています。

DeltaDSパラメータは、適用されているすべての更新 を含むクライアントデータセットです。現在のレコードは、 が適用される直前の更新を表します。

UpdateKindパラメータは、このアップデートは (ukInsert)を挿入するための既存のレコード(ukModify)、新たなレコードの 修正、または削除する既存のレコード(ukDelete)であるかどうかを示します。

パラメータは、イベント ハンドラを終了した後に何が起こるかを制御します。イベントハンドラがAppliedをtrueに設定した場合、プロバイダ は更新を無視します。更新を適用しようとしても、更新が適用されなかったことを示す エラーが記録されることもありません。 イベントハンドラがfalseをAppliedのままにした場合、プロバイダは の後に更新を適用しようとします。例えば

procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject; 
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; 
var Applied: Boolean); 
begin 
    ShowMessage(TClientDataSet(SourceDS).Name); // get source name 
    ... 
end; 

編集

または

procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject; 
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; 
var Applied: Boolean); 
begin 
    if SourceDS.Name = 'Name1'then 
    ...do something ... 
    if SourceDS.Name = 'Name2'then 
    ...do something ... 
end; 
+0

ありがとうございます。しかし、あなたはTClientdatasetとしてSourceDSを隠し/キャストできますか?私のセットアップでは、SourceDSはTSQLDatasetになります。私のセットアップ(SQLDS =>プロバイダ=> CDS)では、私が探しているのはCDS(ソース)の参照方法です。設計時には問題ありませんが、実行時にカプセル化するためにこれを実行しようとしています。 – JeffP

+0

いいえわからない。しかし、あなたの質問とセットアップ(SQLDS =>プロバイダ=> CDS)でそれはTClientDataSetです。 –

+0

しかし、わからない場合は( 'TDataSet')そのまま使用することができます。 –

0

あなたDataSetProvider1BeforeUpdateRecordへの呼び出しの外にトレースする場合は、データセットていることがわかります SourceDSパラメータとして渡されるのはですデータセット UpdateTree、つまりAFAICSは のDataSetプロパティが設定されているデータセットです。もちろん、これはではなく、デルタ が由来するCDSです(私のテストケースでは実際はTAdoQueryです)。

Provider.Pasのソースコードを見ると、DeltaのソースCDSの識別情報を見つける方法はすぐには見つかりません。 プロバイダの操作がCDSによって呼び出され、その逆ではなく、プロバイダがCDSから必要とするすべてのデータがデルタだから、特に驚くことではないと思います。

一方、それはBeforeUpdateRecordイベントがまだ保留中、最も最近で トリガされたことはかなり公正な賭けだ、あなたのCDSの1にApplyUpdatesメソッドを呼び出すに、そうあなたがそれを書き留めます 場合彼らのBeforeApplyUpdatesイベントは、おそらく あなたが知りたいことを教えてくれます。私はそれが単一レベルのアップデートのために働くことを期待していますが、UpdateTreeがネストされたCDSで動作しているならば、もっと難しいかもしれません。

あなたのCDSはすべて、個々のプロバイダを持っていますが、プロバイダはBeforeUpdateRecordイベントを共有し、あなたはこのようなコードを使用して、指定されたプロバイダのCDSを特定できた場合:

function TCDSForm.FindCDSForProvider(DataSetProvider: TDataSetProvider): 
    TClientDataSet; 
var 
    i : Integer; 
begin 
    Result := Nil; 
    for i := 0 to ComponentCount - 1 do begin 
    if Components[i] is TClientDataSet then 
     if TClientDataSet(Components[i]).ProviderName = DataSetProvider.Name then begin 
     Result := TClientDataSet(Components[i]); 
     Exit; 
     end; 
    end; 
end; 
+0

これはおそらく、クライアントのデータセットに到達する唯一の方法です。私は今夜​​これを試してみる。 – JeffP

関連する問題