to 楼上:[email protected] 我现在是这个用途,clientdataset的数据并没有保存的必要,因为它里面的数据是临时生成的,没有数据源,甚至连里面的字段都是随机生成的,数据集创建好后,我调用MergeChangeLog,这样就提交了所有修改,以后做任何事情,假如我想全部回滚掉,呵呵,调用CancelUpdates就可以取消全部修改,但我发现它有毛病,假如我本来排序,经这么一搞,乱了,呵呵,还好,我MergeChangelog后马上SaveToFile,要全部恢复只要load一下,就行,但还没有达到任意的,每部都可以修改,UndoLastChange的确可以每次恢复一点,但它也存在前面问题,所以要实现任意恢复,还需要讨论(比如我现在对某一列取了自然对数,实际上提交了记录条数次,但要回滚的时候却应该只要一次就能回到取对数前状态,这样UndoLastChange达不到要求)
to happy1123(飞天神鼠) : SavePoint在什么事件里调用呢?如果我对某列操作(比如前面说的取对数)当然可以自己调用它,但现在数据是任意可以修改的,可以这样想,操作者任意修改后提交,算一步,我自己那样应要求调整某列,虽然提交了n次,只算一步,现在的要求就是提攻类似这样的n(比如32步)步撤销
如果想实现无论提交多少次都只要一步就恢复到原始状态的话,我这里有一个方法,你可以参考。 procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin if (ClientDataSet1.UpdateStatus = usMOdified) then begin ClientDataSet1.Edit; for i := 0 to ClientDataSet1.Fields.Count - 1 do ClientDataSet1.FieldByName(ClientDataSet1.Fields.Fields[i].FieldName).Value := ClientDataSet1.Fields.Fields[i].OldValue; ClientDataSet1.Post; end; end;
呵呵,你那方法行不通,首先我所有的数据都是缓冲进去的,一cancelupdates,我所有的工作都白干了,呵呵,再想想别的?
cds1.XmlData := cds.XmlData;
//修改
if sucesss then
Cds1.Free
else
cds.XmlData := cds1.xmlData;
你的EMail是什么,我写的源码,给你发过去。
我现在是这个用途,clientdataset的数据并没有保存的必要,因为它里面的数据是临时生成的,没有数据源,甚至连里面的字段都是随机生成的,数据集创建好后,我调用MergeChangeLog,这样就提交了所有修改,以后做任何事情,假如我想全部回滚掉,呵呵,调用CancelUpdates就可以取消全部修改,但我发现它有毛病,假如我本来排序,经这么一搞,乱了,呵呵,还好,我MergeChangelog后马上SaveToFile,要全部恢复只要load一下,就行,但还没有达到任意的,每部都可以修改,UndoLastChange的确可以每次恢复一点,但它也存在前面问题,所以要实现任意恢复,还需要讨论(比如我现在对某一列取了自然对数,实际上提交了记录条数次,但要回滚的时候却应该只要一次就能回到取对数前状态,这样UndoLastChange达不到要求)
SavePoint在什么事件里调用呢?如果我对某列操作(比如前面说的取对数)当然可以自己调用它,但现在数据是任意可以修改的,可以这样想,操作者任意修改后提交,算一步,我自己那样应要求调整某列,虽然提交了n次,只算一步,现在的要求就是提攻类似这样的n(比如32步)步撤销
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
if (ClientDataSet1.UpdateStatus = usMOdified) then begin
ClientDataSet1.Edit;
for i := 0 to ClientDataSet1.Fields.Count - 1 do
ClientDataSet1.FieldByName(ClientDataSet1.Fields.Fields[i].FieldName).Value
:= ClientDataSet1.Fields.Fields[i].OldValue;
ClientDataSet1.Post;
end;
end;
至于用SavePoint,则是对整个表的,它可以分步还原,即你对同一条记录修改过n次,你可以只还原到上一次的状态,而无需一次还原到原始状态。它的前提也是你没有ApplyUpdate。