Если у вас есть источник ClientDataSet CDS1, вы должны быть в состоянии скопировать измененные записи на второй ClientDataSet CDS2 делая
if CDS1.ChangeCount > 0 then
CDS2.Data := CDS1.Delta;
Как вы увидите, если вы попытаетесь это сделать, это дает вам " перед записью и записью с изменениями. Возможно, это не обязательно то, что вы хотите - честно говоря, вы бы лучше всего прочитали статью Whipple, опубликованную в комментарии и в OLH, чтобы получить точный результат, которого вы, возможно, захотите достичь. Дело в том, что вся необходимая информация находится в исходном CDS, пока вы не очистите его (вызвав ApplyUpdates() - после этого, если это произойдет, журнал изменений пуст).
Если вы посмотрите на строки в CDS2, не сразу видно, как вы определяете, содержит ли определенное поле измененное значение, и как вы отличаете тот, который делает только тот, который только пуст. У Истра была очень хорошая публикация довольно давно в одной из групп новостей Borland NTTP их Марк Эдингтон, я думаю, объясняя, как это сделать. В основном, это вопрос оценки VarIsClear на имущество NEWVALUE месторождения:
if VarIsClear(CDS2.Fields[i].NewValue) then
// means Fields[i] does not have a changed value
Кстати, так как вы можете сохранить состояние CDS в XML, вы можете использовать XML манипуляции, например, с парсером DOM, такой как встроенный Windows (см. MSXML.Pas), чтобы легко сделать много вещей, которые могут возникнуть с использованием парадигмы TDataSet.
Вы хотите, чтобы ChangeDataset содержал * только * записи в вашем первом ClientDataSet, которые были изменены, или все из них? – MartynA
только изменен – Tarasov