Delphi:在应用更新时访问嵌套数据集的主信息

5
我能在提供程序的BeforeUpdateRecord事件中访问父数据集信息(例如MyField.NewValue)并应用更新到嵌套数据集吗?
原因:
当我对具有嵌套细节的CDS应用更新时,主键由基础查询(TIBCQuery)生成并传播到主CDS。
但是,在细节的BeforeUpdateRecord中,新的键不可见,因为该字段在AfterUpdateRecord中更新:
DeltaDS.FieldByName(FieldName).NewValue := SourceDS.FieldByName(FieldName).NewValue) 

而且这个增量还没有合并。

看起来,当针对详细信息进行调用时,BeforeUpdateRecord事件的DeltaDS参数仅包含嵌套数据集的信息。

如果我能做类似以下的操作就好了:

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

编辑:

使用嵌套数据集时,BeforeUpdateRecord事件会被调用两次,一次是主数据集,一次是详细数据集(如果我们有一个记录都有)。当详细数据集调用该事件时,是否有一种方法可以访问包含在DeltaDS中的主信息?

此时我们无法访问主CDS的数据,因为更改尚未合并。希望这不会增加更多的困惑。


我相信问题出在我这里,但您能否请重新措辞一下问题? - Andrea Raimondi
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接