我有一表A(id,name)为主要表。另一表B(sn,id,power)为次要表。分别用adoquery1,adoquery2连接。并分别显示在grideh1,grideh2中。
当在grideh1中选取一条纪录时。adoquery2在表B中查找B.id=A.id的纪录并显示在grideh2中。并可在grideh2中修改这些记录。
以上这些都可实现,最难的部分在于:*重点*
adoquery2用的是ltBatchOptimistic模式。并且所有B表中的记录必须在点击一个Btn_save后才能全部更新保存。可是每次在grideh1中选取记录之后。还要求Grideh2中的内容更新。如果上一次的数据没有updatebatch的话。就不会被保存了。如果updatebatch也不行,因为要求必须在最后点按钮时才能全部保存!!!小弟想了很久,试着用动态创建adoquery的方法解决。但是极不好控制,并且巨耗资源。

解决方案 »

  1.   

    当grideh1中选取一条纪录时 如果Grideh2中的内容更新了 提示用户保存一次不可以吗?当grideh1中选取一条纪录时 是不是adoquery2要更换查询语句呢
      

  2.   

    如果数据量不大,可以一次性用adoquery2.open打开所有记录。
    然后采用adoquery2.filter来控制显示的记录。
    这样能够满足你的需求。
      

  3.   

    同意 windindance(风舞轻扬)的做法,
    對於數據量大的,只能用 yleiou(生活真痛苦) 的做法了,
    沒有什麼不方便的,大家也都是這麼做的。
      

  4.   

    to:yleiou(生活真痛苦) 
       如果是那样就好了,用户就是要求最后统一保存。我也没办法!to:windindance(风舞轻扬)  
       请详细一点好吗。谢谢。filter怎么控制?
      

  5.   

    grideh2肯定不能通过查询数据库来显示,所以只能另僻溪径,ADOQuery2中取出所有表2中的bookid在adoquery1中出现的记录,这样grideh2来自ADOQuery2而不是数据库中
      

  6.   

    ADOQuery2.SQL.Text := 'select * From t';
    ADOQuery2.Open;ADOQuery1.AfterScroll:
    ADOQuery2.Filter := 'id = ' + VarToStr(ADOQuery1['id']);
    ADOQuery2.FIltered := true;
      

  7.   

    filter之后,没有提交的数据不会丢失吧
      

  8.   

    filter 只会对ADO 的缓冲中的数据排序不会丢失数据吧
      

  9.   

    哈哈,终于解决了。用的windindance(风舞轻扬)的方法

    ADOQuery2.SQL.Text := 'select * From t';
    ADOQuery2.Open;在每次选择时
    ADOQuery2.Filter := 'id = ' + VarToStr(ADOQuery1['id']);
    ADOQuery2.FIltered := true;没问题的话就要结贴了