关于ClientDataSet更新数据后,希望取消操作的问题(200分)

  • 主题发起人 主题发起人 pp虫
  • 开始时间 开始时间
P

pp虫

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用ClientDataSet更新一批数据后(更新的数据库包含添加、删除、修改的数据),现在我希望取消所有添加的数据,保留所有修改和删除的数据然后提交。不知道如何实现,请各位大虾指点一下。谢先了。
CancelUpdates取消了所有更新的数据,不行。
 
在BeforePost里进行判断,通过数据集的状态,如果是dsInsert就不提交了!
 
这好像不容易做到吧,定义一个全局数组变量,在OnNewRecord记下增加的记录,在Before Cancel中删除表中对应数组中所有记录,在AfterCancel中清空数组以便重新记录,数组中只须记录某一表中有唯一值的字段(如主键)可以了
 
自已寫接口函數
 
MIDAS中,client端回传的更新数据放在Delta数据封包中.并对每一笔更新纪录增加一个额外字段 UPDATE TYPE纪录更新类型,如修改为Modify
你在clientdataset.delta中取得被修改的数据集,在cacle时让该字段的值等于
clientdataset.fieldbyname('name').oldvalue
 
谢谢大家的回答,但问题还没有解决
to Carson_zzd :我的数据都是已经post了的,所以你的方法不行。
to yue_shan :我开始也想通过你所说的方法实现,但新添加的数据有可能存在相同的记录。(在未提交前即使有关键字约束,也不会报错的),如果在Before Cancel中删除记录时,定位就会出错。不知道你还有没有其他的方法.
to hcm0790 : 小弟菜鸟,不知道如何用接口实现,请指点一二。
to 落木潇潇 :真不好意思,我没有明白你的意思。
 
找本李维的书,好好的看一下ClientDataSet的Delta属性,相信它可以解决问题的。
 
看看李维的书吧,很详细的
这是delphi midas的底层机制,你的要求只能从这里入手,否则无法区分update,delete,还是insert
 
落木潇潇:
Delta确实是可以区分出insert,update,以及delete的记录,但是区分出来后又有什么办法取消呢。
 
有没有类似rollback之类的取消事务的语句?
 
pp虫:
区分出insert,update的记录,然后删除insert的,不知道可以不。
 
能不能采用一个笨办法,因为在Delta封包中更新的数据保存了新旧值及当前值,在取消时,将旧值代入修改字段,而将insert,delete提交。
在cancle的procedure中加两个参数:
DeltaDS:TClientDataSet;UpDateKind:TUpDateKind
再加一个判断
if UpdateKind=ukModify then
clientdataset1.parambyname('fieldname').value:=DeltaDS.fieldByname('fieldname').oldvalue;
 
谢谢大家了,问题没有得到解决,不过分还是发给大家吧
 
Carson_zzd的方法没问题,ClientDataSet控件post并未存入数据库,只存在内存中。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
744
SUNSTONE的Delphi笔记
S
后退
顶部