Если вы отследите вызов до своего DataSetProvider1BeforeUpdateRecord
, вы увидите, что набор данных, переданный в качестве параметра SourceDS, является набором данных Source
из UpdateTree
, то есть AFAICS, набором данных, для которого установлено свойство DataSet
провайдера. Конечно, это не CDS, из которого была получена дельта (в моем тестовом примере это на самом деле TAdoQuery).
Глядя на исходный код в Provider.Pas, я не могу сразу найти способ определить идентичность исходного CDS Delta. Я не думаю, что это особенно удивительно, потому что операция провайдера вызывается CDS, а не наоборот, и все данные, которые требуются провайдеру от CDS, являются его дельтой.
С другой стороны, вполне справедливо предположить, что событие BeforeUpdateRecord было инициировано самым последним, все еще ожидающим, вызовом ApplyUpdates на одном из ваших CDS, поэтому, если вы отметите это в их BeforeApplyUpdates
событии (ах) , это, вероятно, скажет вам то, что вы хотите знать. Я ожидал, что это сработает для одноуровневого обновления, но это может быть сложнее, если UpdateTree
работает на вложенных CDS.
Если у всех ваших CDS есть отдельные поставщики, но они совместно используют событие BeforeUpdateRecord, вы можете идентифицировать CDS для данного провайдера, используя следующий код:
function TCDSForm.FindCDSForProvider(DataSetProvider: TDataSetProvider):
TClientDataSet;
var
i : Integer;
begin
Result := Nil;
for i := 0 to ComponentCount - 1 do begin
if Components[i] is TClientDataSet then
if TClientDataSet(Components[i]).ProviderName = DataSetProvider.Name then begin
Result := TClientDataSet(Components[i]);
Exit;
end;
end;
end;
person
MartynA
schedule
08.08.2016
SourceDS
- это исходный (исходный) набор данных, аDeltaDS
содержит изменения, которые произошли вSourceDS
. - person Ken White   schedule 08.08.2016