我有一对主从表,主表为录入单,从表为单据所需付的价钱列表
主表:
单号, 日期,  录入员,复核员
01   20050101  张三   李四从表:
收费项目,  价格
运输费  30
制单费  10
关口费  20每当我新建一条主表的记录时,自动在从表中添加多条预先定义好的收费项目记录,在POST的时候一并提交,如果是出错了,就一起出错,在客户端出提错误提示,并保持未POST之前的状态。
现在的问题就是在于,由于主表与从表分别用了两个表DataSet1和DataSet2,我要怎样才能让他们两个一起提交,且出错时可以恢复到未POST之前的状态呢?我现在是从表用BatchOptimism的形式,我定义了一个方法
procedure Save()
begin
  conMain.BeginTrans;
  try
    DataSet1.Post;
    DataSet2.UpdateBatch();
    conMain.CommitTrans;
  except
    conMain.RollBackTrans;
  end;
end;
虽说把这两个表用事务圈了起来,但是会出现这种情况:
当DataSet1提交成功后,DataSet2提交失败,此时服务器端数据库将会被回滚Rollback,但由于在客户端DataSet1已经提交成功,它并不知道数据库被回滚了,所以它的状态被设成了已提交,而非编辑状态,再者由于它已被设为成功,则这条记录已存在于客户端,可是服务器端已经没有这条记录了,所以再次编辑的时候将会出错。同志们,我该如何是好,我不想重新刷新客户端,我希望有一种方法,在不刷新整个DataSet1的情况下,如果提交失败,则DataSet1重新回到未POST之前,也就像在单个DataSet的时候,如果添加一条记录的时候POST出错,它会停留在原来的状态下,等你修改错误后再POST。

解决方案 »

  1.   

    印象中Delphi好像不支持这样的机制。
    可考虑编辑数据的时候不要使用数据敏感的控件(例如,用普通的edit或者StringGrid等控件),提交数据通过存储过程来提交,则你编辑的内容不受是否回滚事务的影响
      

  2.   

    如果单纯依靠DataSet不能实现你需要的效果,只能使用SQL来实现。我看李维做一些Master/Detail的Demo都是结合SQL完成的。:(
      

  3.   

    采用生成sql来完成的。
    无论你做多少改动,你体现到sql语句中,再保存到一个tstringlist中。
    最后采用事务来批量执行这个sql,就ok了啊!
      

  4.   

    控件本身的功能毕竟很弱,想做大的尽量用sql
      

  5.   

    数据库的操作都用sql 语句来执行
    DataSet只用作显示的作用
      

  6.   

    有些控件有CachedUpdate功能,会自动处理出错的情况如果没有,错了就重读数据库,或者如果服务器比较繁忙的话,自己留个本地备份,错了就重载
      

  7.   

    我的想法提DASET1提交的同时。记录他的提交前的操作数据。
    如果DASET2失败了就重新返回DASET1的提交前的数据