отслеживать измененные строки и обновлять вручную из дельты TClientDataSet - PullRequest
4 голосов
/ 12 июня 2010

Есть ли способ вручную отследить изменения, внесенные в дельту набора данных клиента, и вручную обновить изменения до уровня db. я динамически создал набор данных клиента и без поставщика я могу загрузить его с помощью запроса, теперь пользователь выполнит некоторые операции вставки обновления и удаления данных, доступных на компакт-дисках, и на заключительном этапе эти данные (измененные) отправить в базу данных с помощью запроса (не применять обновления) ..

Ответы [ 2 ]

5 голосов
/ 12 июня 2010

После заполнения набора данных из вызова TQuery MergeChangeLog, чтобы записи не выделялись как вновь вставленные, и убедитесь, что установлено LogChanges.

Затем, когда на последнем этапе, перед обновлением запроса набором данных, установите StatusFilter, чтобы отображались только те записи, над которыми вы хотите выполнить действие. Например;

ClientDataSet1.StatusFilter := [usDeleted];

Вы также можете использовать UpdateStatus в записи, чтобы увидеть, была ли она изменена и т. Д.

Но будьте осторожны, похоже, что существует несколько версий записи, и немного трудно понять, как отслеживает «журнал изменений». Также может быть несколько действий с записью, например, несколько раз ее изменить, а затем удалить.

0 голосов
/ 12 июня 2010
Change:= TPacketDataSet.create;

Change.Data:= YourClientDataSet.Delta;
while not Change.Eof do
begin
 Change.InitAltRecBuffers(False);
 if Change.UpdateStatus = usUnmodified then
   Change.InitAltRecBuffers(True);

 case Change.UpdateStatus of
  usModified:  ;//your logic read codes in Provider.pas for further hint
  usInserted:  ;//your logic read codes in Provider.pas for further hint
  usDeleted: ;//your logic read codes in Provider.pas for further hint
 end;

 Change.Next;
end;

Выше должно работать независимо от количества модифицированных Cheers Pham

...