Pas*_*l D 5 delphi tclientdataset
在将更新应用于嵌套数据集时,是否可以在提供者MyField.NewValue的情况BeforeUpdateRecord下访问父数据集信息(如)?
原因:
当我将更新应用于具有嵌套详细信息的CDS时,主PK由基础查询(TIBCQuery)生成并传播到主CDS.
但由于BeforeUpdateRecord字段在以下位置更新,因此新密钥在详细信息中不可见AfterUpdateRecord:
DeltaDS.FieldByName(FieldName).NewValue := SourceDS.FieldByName(FieldName).NewValue)
Run Code Online (Sandbox Code Playgroud)
并且delta尚未合并.
看起来事件的DeltaDS参数BeforeUpdateRecord仅包含对详细信息进行调用时嵌套数据集的信息.
如果我可以这样做,那将是很好的:
DeltaDS.ParentDS.FieldByName('FIELDNAME').NewValue.
Run Code Online (Sandbox Code Playgroud)
编辑:
使用嵌套数据集时,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;
Run Code Online (Sandbox Code Playgroud)
您可以在处理程序中使用它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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1280 次 |
| 最近记录: |