主表:
 TB1 (PK) ID,
           SINFO;
从表:
 TB2 (PK) FID,
     (FK) ID [TB1的]。    
且两个表之间建立了约束。 主表对应: ADOMain【ADOQuery】-->dsMain【DataSource】
          ADOMain.DataSource:为空;
从表对应: ADODetail【ADOQuery】-->dsDetail【DataSource】
          ADODetail.DataSource:dsMain;ADOMain和ADODetail的LockType设置为:ltBatchOptimistic;提交按钮Button1:
  try
  adoconn.BeginTrans;
  adoMaster.UpdateBatch;
  adoDetail.UpdateBatch;
  adoconn.CommitTrans;
  except
  adoconn.RollbackTrans;
  end;  在DBEdit1(DataSource:Master,
                     DataField:ID)
  !问题:
  a. 为什么?运行程序,必须先POST主表内容,才能添加明细表的内容?
  b. 为什么?运行提交按钮Button1,从表的内容一个没留都丢了?
  希望明白或做过类似程序的兄弟们帮助。最好有理论结合实际! 很急!

解决方案 »

  1.   

    如果照你这样的设置,在提交前先将ADODetail.DataSource := nil,提交后才恢复ADODetail.DataSource := dsMain;
      

  2.   

    有点不懂,能说得明白一点吗?为什么?如果ADODetail.DataSource := dsMain;不这样的话,我怎么建立主从关系啊? 那样的话显示的话主表和从表不就没有关系了吗? 真的不懂。Faint....
      

  3.   

    两个表之间建立了约束?子表的外键是主表的主键对吧。
    那就是说子表的外键值必须在主表中存在,所以主表提交后,子表才能添加记录。设置了主从关系后,子表记录中的外键值就自动设置了主表的主键值。
    先修改程序,先提交主表,然后在提交子表。主要提交主表后不要对主表的记录进行滚动否则提交的子表会添加到其他主表对应的子表记录中。
    还有删除主表记录的话,如果数据库两个表的关系中没有设置级联更新或级联删除的话,必须手工删除所有对应子表的记录后才能删除主表记录。
    希望你先看看Delphi中主从表的例子。
      

  4.   

    a、因为有约束,所以必须先添加主表数据,再添加细表数据;
    b、你先UpdateBatch细表,再UpdateBatch主表,试试。我的建议是,如果只用于查询浏览,可以使用VCL的主细表功能;如果涉及到新增、修改、删除,最好自己做,这样容易控制,也很清晰。
      

  5.   

    ADODetail.DataSource := nil
    try
      adoconn.BeginTrans;
      adoMaster.UpdateBatch;
      adoDetail.UpdateBatch;
      adoconn.CommitTrans;
      ADODetail.DataSource := dsMain;
    except
      ADODetail.DataSource := dsMain;
      adoconn.RollbackTrans;
    end;
    这就是例子,当然还有其它的方法。
      

  6.   

    to: crownsoft(希望) 
    非常谢谢你给出的代码,经测试通过。50大分预分配给这位大哥了,不过我还有一个大大的问题 :)
    不知道哪位大哥能不能帮忙解决一下。
    是这样的。我的主表填写完内容以后,必须POST一下才能在从表中添加记录,请问这种问题如何解决呢?我得意思是说我想在主表填完内容后立即填写从表,然后一下子全部提交到数据源。可是现在只能先POST一下,然后才能UpdateBatch;有什么好的办法吗?
    能不能给出一段Code? 谢谢了。
    如果谁答出问题,觉得给的分数不够,小弟愿意++++++++++++++++++++++++.....
      

  7.   

    新增数据最好用ADOQUERY或ADOCOMMAND及SQL语法进行插入数据库操作,插入时候用事务来保证
    插入正确后将主表刷新下就可以了 requery()
      

  8.   

    用内存表吧, 
    主表和从表的记录先全班记录在内存表中,不要UpdateBatch到数据源; 
    完成所有操作后才将内存表数据append 到主-从表,UpdateBatch到数据源;
      

  9.   

    帮ding一下 家产能不能分点给我 其实我建议你可以看下李老大的书。