5

ネストされたデータセットに更新を適用するときにプロバイダーのイベントで親データセット情報 (などMyField.NewValue)にアクセスできますか?BeforeUpdateRecord

理由:

ネストされた詳細を持つ CDS に更新を適用すると、基になるクエリ ( TIBCQuery) によってマスター PK が生成され、マスター CDS に伝達されます。

BeforeUpdateRecordただし、フィールドが で更新されるため、新しいキーは詳細には表示されませんAfterUpdateRecord

DeltaDS.FieldByName(FieldName).NewValue := SourceDS.FieldByName(FieldName).NewValue) 

デルタはまだマージされていません。

詳細の呼び出しが発生したときに、イベントのDeltaDSパラメーターにはBeforeUpdateRecord、ネストされたデータセットへの情報のみが含まれているようです。

次のようなことができればいいのですが:

DeltaDS.ParentDS.FieldByName('FIELDNAME').NewValue.

編集:

ネストされたデータセットを使用する場合、BeforeUpdateRecordイベントはマスター用に 1 回、詳細用に 1 回 (両方のレコードが 1 つある場合) の 2 回呼び出されます。イベントが詳細に対して呼び出されたときに、に含まれるマスター情報にアクセスする方法はありDeltaDSますか?

変更がまだマージされていないため、現時点ではマスター CDS のデータにアクセスできません。これがこれ以上の混乱を招かないことを願っています。

4

1 に答える 1

3

プロバイダーを使用Resolverして、対応する を検索できTUpdateTreeます。

function FindDeltaUpdateTree(Tree: TUpdateTree; DeltaDS: TCustomClientDataSet): TUpdateTree;
var
  I: Integer;
begin
  Result := nil;
  if Tree.Delta = DeltaDS then
    Result := Tree
  else
    for I := 0 to Tree.DetailCount - 1 do
    begin
      Result := FindDeltaUpdateTree(Tree.Details[I], DeltaDS);
      if Assigned(Result) then
        Break;
    end;
end;

OnBeforeUpdateこれをハンドラーで使用できます。

var
  Tree, ParentTree: TUpdateTree;
begin
  if SourceDS = MyDetailDataSet then
  begin
    Tree := FindDeltaUpdateTree(TDataSetProvider(Sender).Resolver.UpdateTree, DeltaDS);
    if Assigned(Tree) then
    begin
      ParentTree := Tree.Parent;
      // here you can use ParentTree.Source (the dataset) and ParentTree.Delta (the delta)
    end;
  end;
end;
于 2011-06-03T09:01:41.170 に答える