Delphi: доступ к основной информации о вложенном наборе данных при применении обновления - PullRequest
5 голосов
/ 02 июня 2011

Можно ли получить доступ к информации о родительском наборе данных (например, MyField.NewValue) в событии BeforeUpdateRecord поставщика при применении обновлений к вложенному набору данных?

Причина:

Когда я применяю обновления к CDS, который имеет вложенную информацию, мастер PK генерируется базовым запросом (TIBCQuery) и распространяется на мастер CDS.

Но новый ключ не отображается в BeforeUpdateRecord детали, поскольку поле обновляется в AfterUpdateRecord:

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

и дельта еще не объединена.

Похоже, что параметр DeltaDS события BeforeUpdateRecord содержит только информацию для вложенного набора данных, когда происходит вызов для получения подробной информации.

Было бы неплохо, если бы я мог сделать что-то вроде:

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

Edit:

При использовании вложенных наборов данных событие BeforeUpdateRecord вызывается дважды, один раз для мастера и один раз для детализации (если у нас есть одна запись обоих). Когда для детализации вызывается событие, есть ли способ получить доступ к основной информации, содержащейся в DeltaDS?

В данный момент мы не можем получить доступ к данным главной CDS, так как изменения еще не объединены. Я надеюсь, что это не добавляет больше путаницы.

1 Ответ

2 голосов
/ 03 июня 2011

Вы можете использовать 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;
...