gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:13:46 24 4
gpt4 key购买 nike

将更新应用到嵌套数据集时,我可以在提供程序的 BeforeUpdateRecord 事件中访问父数据集信息(例如 MyField.NewValue)吗?

原因:

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

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

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

并且增量尚未合并。

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

如果我能做这样的事情那就太好了:

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

编辑:

当使用嵌套数据集时,BeforeUpdateRecord 事件会被调用两次,一次用于主数据集,一次用于详细数据集(如果我们两者都有一条记录)。当调用详细信息事件时,有没有办法访问 DeltaDS 中包含的主信息?

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

最佳答案

您可以使用提供者的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;

关于Delphi:应用更新时访问嵌套数据集主信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com