走过路过的大侠帮帮忙,给新人一点帮助吧!多级表处理问题!(32分)

  • 主题发起人 weibinggui
  • 开始时间
W

weibinggui

Unregistered / Unconfirmed
GUEST, unregistred user!
刚接触DEPHI没多久,在处理多级表的时侯老是出错,下面的问题请大家帮我看看该如何改。我有两三个表,M ,D1,D1_D1,在界面的ONSHOW事件里,中取得数据。<br>//取子表信息:<br>with &nbsp;Adoquery_d1 do<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; close;<br>&nbsp; &nbsp; &nbsp; sql.Clear ;<br>&nbsp; &nbsp; &nbsp; sql.Add('select * from d1 where zbxh=' + quotedstr(intTostr(clientdataset_M.fieldbyname('xh').AsInteger)));<br>&nbsp; &nbsp; &nbsp; open;<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; &nbsp; clientdataset_d1.Close ;<br>&nbsp; &nbsp; &nbsp; clientdataset_d1.Open ;<br>//取孙表信息!<br>&nbsp; &nbsp;with Adoquery_D1_D1 DO<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; close;<br>&nbsp; &nbsp; &nbsp; sql.Clear ;<br>&nbsp; &nbsp; &nbsp; sql.Add('select * from d1_d1 where zbxh &nbsp;in <br>&nbsp; &nbsp; &nbsp; (select xh from d1 where zbxh = '<br>&nbsp; &nbsp; &nbsp; + Quotedstr(intTostr(clientdataset_m.fieldbyname('xh').AsInteger)) &nbsp;+ ')' &nbsp;);<br>&nbsp; &nbsp; &nbsp; open;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp;cds_SC_ZBZYD_d1_d1.Close ;<br>&nbsp; &nbsp; &nbsp;cds_SC_ZBZYD_d1_d1.Open ;<br><br>下面是我地dbgrod的,rowchange事件中加入的过滤代码。<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; cds_sc_zbzyd_d1_d1.Filtered :=false;<br>&nbsp; &nbsp; &nbsp; cds_sc_zbzyd_d1_d1.Filtered :=true;<br>&nbsp; &nbsp; &nbsp; cds_sc_zbzyd_d1_d1.Filtered :=false;<br>&nbsp; &nbsp; &nbsp; cds_sc_zbzyd_d1_d1.Filter :='zbxh=' <br>&nbsp; &nbsp; &nbsp; + IntTostr(clientdataset_d1.fieldbyname'xh').AsInteger);<br>&nbsp; &nbsp; &nbsp; cds_sc_zbzyd_d1_d1.Filtered :=true;<br>问题:<br>但是在运行时,只要d1中按向下方向键,增加一行时,就会出现,“at beginning of tabel ”的报错,代码放在其它的事件中又不能解决只孙表d1_d1只显示子表D1中的当前记录计录。<br>因为是看书自学,没有人指导,代码是按自已想的写出来的,如何改进,也希望大家给点意见。大虾们如果有这一块的书,能介绍几本吗?很多时侯都找不着头绪,我AODQUERY 和CLIENTDATASET这样用是不是错的,该如何用!
 
没有回答,郁闷阿!
 
今天没事,玩玩。<br>没细看你的代码,关于主从表我给你兴个简单的小例子说明一下,“{}”表示字段:<br>A1{ID,F1,f2}<br>A2{ID,PID,F1,f2}<br>A3{ID,PID}<br>A3表通过 PID和t A2表中的ID关联,A2表通过PID和A1表的PID关联。<br>建三个TADOQEURY和DataAccess<br>A1的sql:select * from A1<br>A2的sql:select * from A2 where PID=:ID<br>A3的SQL:select * from A3 where PID=:ID<br>把A3的datasource设成A2对应的Dataaccess组件,<br>把A2的datasource设成A1对应的DDataAccess组件。
 
建议你不要用sql执行插入来实现父子表的插入,一般会遵循以下原则<br>1.所有数据集都用adodataset<br>2.把sql写在adodataset里,其中的参数用:param的形式,通过外部传入参数执行sql<br>3.把父子数据集设置级联关系,好像是设置MasterSource属性,然后再映射字段,这样父子表就有关系了。<br><br>这样的好处是<br>1.处理事务更容易<br>2.不会出现主外键不一致的情况,避免了错误<br>3.降低了复杂度。<br>4.大大减少了代码量
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
824
SUNSTONE的Delphi笔记
S
L
回复
2
查看
373
lostangelnj
L
顶部