5

在将更新应用到嵌套数据集时,如果提供者可以访问父数据集信息(如MyField.NewValue)吗?BeforeUpdateRecord

原因:

当我对具有嵌套详细信息的 CDS 应用更新时,主 PK 由基础查询 ( TIBCQuery) 生成并传播到主 CDS。

但是新键在详细信息中不可见,BeforeUpdateRecord因为该字段在 中更新AfterUpdateRecord

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

并且增量尚未合并。

DeltaDS当调用细节时,事件的参数似乎BeforeUpdateRecord只包含嵌套数据集的信息。

如果我能做这样的事情会很好:

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

编辑:

使用嵌套数据集时,该BeforeUpdateRecord事件被调用两次,一次用于主数据,一次用于细节(如果我们对两者都有一个记录)。当为细节调用事件时,有没有办法访问包含在 中的主信息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 回答