两张表,主表用 DBGridEh1 显示,其中的 name 字段值是从表 (DBGridEh2) 中的一个字段值。当主表点击某行时,从表根据该 name 字段值显示包含该值的记录,主表更改该字段值时从表相应记录跟着变化。要怎么设置?要求在代码里动态设置,不能固定列。谢谢。主表:
ID   name    data1
1    abc      879
2    cfd      097
......从表:
ID   vname     cname
1     abc       tsmc
2     cfd       umc
3     abc       cmc
4     abc       umsi
......
比如上面,主表点击第一条记录,从表就显示第1,3,4 条记录,当主表的 abc 改变为 cba 的时候,从表也跟着改变成 cba 的 1,3,4 条记录。请指教!

解决方案 »

  1.   

    主从表的设置,相关联的字段,在从表中必须是主键字段,所以你这两张表不好做主从关联,不过有一种方法,你可以在主表的dataset的onscroll()事件中编程,取出当前name 的值,然后更据此值过滤从表的记录集,即可,这也是常用的主从表关联的一种方法。
      

  2.   

    只需要将dbgrideh2的adoquery的datasource属性设为dbgrideh1的adoquery就可以了,ado会根据主键自动连接
      

  3.   

    onscroll 怎么取?用什么函数?
      

  4.   

    还有,第二个表中,有很多vname需要更新成主表中的修改值,怎么更新简单快捷?
      

  5.   

    如果你不怕麻烦的话,你可以用table数据集来设置主从关系
      

  6.   

    正如zhangheaaa(竹) 所说的,我的 vname 不是主键,是不是主从关系就不太好做了?最方便的方法是不是就是 filter 了?可是第一张表的数据变更以后,第二张表的数据怎么更新?怎么写 code ?高手给一段代码参考一下啊。
      

  7.   

    假如 :第一表用是ADOQuery1 ,第二表用是ADOQuery21:在ADOQuery1  的ONScroll事件中设置ADOQuery2的Filter
    2:在ADOQuery1  的BeforePost事件中 
     if (State=dsEdit) and (dsNewValue<>dsOldValue) then
      begin
        更新ADOQuery2中对应的记录
      end
      

  8.   

    可是我的 client 只有 socketconnection, clientdataset,datasource, dbgrideh ,怎么都找不到 onscroll 事件啊?难道要在中间层(三层结构)改?
      

  9.   

    多谢 三友 指点,我基本搞定 update 问题了。但是还有,我想当第一个表的记录被删除后,删除经过 filter 的第二个表的全部记录,其它记录不删,怎么办?我用 DBGridEh2.selectedrows.delete 没反应嘛。我是在 clientdataset.afterdelete 事件里面写的。高手指教?