给高手送分了!!!《两表关联问题》200分!!!(200分)

  • 主题发起人 主题发起人 jking
  • 开始时间 开始时间
J

jking

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中设有两个dataset,其中一个(dataset1)作浏览导航,另一个(dataset2)作数
据的修改,我想这样进行关联,选择dataset1,会出现与dataset1相对应的dataset2
的记录,选择dataset2,会出现与dataset2相对应的dataset1记录。也就是说两个
dataset是平等的,无主细之分。两个dataset是一一对应关系,请问如何实现?
请高手赐教!
 
选择dataset1,会出现与dataset1相对应的dataset2:
afterscroll
locate dataset2
反之亦然
 
可以
1)用DataSet的过滤功能(Fliter)
2)用SQL语句实现
 
用SQL语句可以更灵活的实现
 
比如说,你用DBGRID1,DBGRID2显示TABLE1,TABLE2的内容,通过字段'AA'来关联,
那么在DBGRID1的ONCLICK事件里:
Table2.fliter:='AA = '''+Table1['AA']+'''';
Table2.flitered:=true;
同样在DBGRID2的ONCLICK事件里修改Table1的fliter

当然别忘了做一个按键把两个Table的flitered属性设为false,不然的话能显示的记录就会
越过滤越少了
 
不用两个TDataSet,改用两个DBGrid
 
一如果物理上是兩個不同的表依然可以用主從表;
二如物理上是同一個表用過濾比較好.在第一個表的afterScroll事件中只要有一句(假設關聯字段是key)
table2.filter:='key='+#39+table1['key']+#39
如果table2的Filtered屬必設為真, 則記錄會自動定位.
 
两个Tdataset关联同一表时,可以使用Tdataset的同步设置属性
Tdataset1.GotoCurrent(Tdataset2)
注:我只知道TTable 可以
 
我認為以上各位說的都可以, 畢竟條條大路通羅馬.
用查詢速度較快,但不能自動同步.
利用表一的afterscroll事件對表二進行搜索, 優點是不容易產生記錄鎖定, 也不會造成
記錄中關鍵字段變動后記錄被濾掉不顯示的問題; 缺點是要屏蔽某個事件比較麻煩, 如果
屏蔽不掉, 會對該表的其他操作帶來极大的影響, 比如說速度极慢.
過濾的自動同步也不大好, 因為filter不會自動更新, 但它的操作方法簡單.

綜上所述, 我認為較好的做法是在表一的afterscroll事件中設置表二的filter屬性,只一
條語句即可完成, 即使該事件屏蔽不掉, 由于afterscroll事件中所做的事不多, 對速度
的影響也很少. 至于表二是過濾是否有效, 則由該表的filtered決定, 但它不用反复設置,
一次性長期有效.
 
根据关联的字段进行过滤的方法很多,
换个角度,根据你界面的定制来选择最优的关联方法。比如你用到了几个GRID,
或是GRID加上一大堆的EDIT等。
 
如果是两个 DBGrid 连接到同一个 DataSet 上,自己就会同步啊。
 
你的两个dataset应该有一个一一对应的关键字段相联吧!
当你定位一个dataset其在另一个dataset中依据关键字段进行定位(locate,findfirst)不就
可以了。如果连记录的先后顺序都是严格对应的话可以直接用move(或者moveby)的方法进行
定位。
 
如果是两个 DBGrid 连接到同一个 DataSet 上,自己会同步。
把浏览导航的那个dbgrid的readonly设为true就可以了噻.:)
 
关键是那个表是修改了的,一条记录改过没关系,多个记录修改,如果修改了关键字段
不就完了,怎么同步?
我不知道在DBGRID中记录移动产生的事件是什么?
有这个事件后再给另一个定位不就完了。
 
Answer ZhangJianBo:
In DBGRID ,when skip record , the even is the AfterScroll of Dataset .
Because my OS is Big5 Chinese now, so I have to write with English.
 
多人接受答案了。
 
后退
顶部