Z
zhang_j29
Unregistered / Unconfirmed
GUEST, unregistred user!
新人分不高,请大家多包含,谢谢!<br>我有5张表A、B、C、D、E。其中B是A的明细表,D是C的明细表。因为B与D之间存在多对多关系,所以A与C之间也存在多对多关系,故产生关系表E。E中只有4项A_ID,B_ID,C_ID,D_ID,分别存储的是ABCD表的关键字段,以表明其关系。<br><br>在程序中用4个DBgrid对应 ABCD 4张表,用5个ADOquery,datasource分别对应 ABCDE 5张表<br>(分别为adoquery1,datasource1对A表;adoquery2,datasource2对B表...adoquery5,datasource5对E表,方法比较笨,见笑。可帮我提下好方法)<br>我想通过选择查询方式(用checkbox判断)在窗体上实现任意以一张表为主,其它DBgrid中出现其相关记录。我的程序基本以实现这个功能,但出现个怪问题。以选B或D为主为例:<br>选B时查询一切正常,再换以D为主查询时程序出错(出错内容:adoquery4没找到B_ID);若重新进入程序,先以D为主查询则一切正常,再换以B为主查询则程序再出错(出错内容:adoquery2没找到D_ID)。我的程序如下,请各位帮忙分析一下。谢谢!!!<br>var<br>s1,s2,s3,s4,s5:string;<br>begin<br>adoquery1.close;<br>adoquery2.close;<br>adoquery3.close;<br>adoquery4.close;<br>adoquery5.close;<br>adoquery1.DataSource:=nil; //避免循环套用<br>adoquery2.DataSource:=nil;<br>adoquery3.DataSource:=nil;<br>adoquery4.DataSource:=nil;<br>adoquery5.DataSource:=nil;<br><br>if checkbox1.check then //以B为主查询<br> begin<br> s1:='select * from A where A_ID=:A_ID'; //B表中有A_ID字段<br> s2:='select * from B ';<br> s3:='select * from C where C_ID=:C_ID'; //D表中有C_ID字段<br> s4:='select * from D where D_ID=_ID';<br> S5:='select * from E where B_ID=:B_ID'; //关系:C->D->E->B<-A<br> adoquery1.datasource:=datasource2;<br> adoquery3.datasource:=datasource4;<br> adoquery4.datasource:=datasource5;<br> adoquery5.datasource:=datasource2;<br><br> adoquery2.sql.clear; //执行SQL<br> adoquery2.sql.add(s2);<br> adoquery2.open;<br> adoquery1.sql.clear;<br> adoquery1.sql.add(s1);<br> adoquery1.open;<br> adoquery5.sql.clear;<br> adoquery5.sql.add(s5);<br> adoquery5.open;<br> adoquery4.sql.clear;<br> adoquery4.sql.add(s4);<br> adoquery4.open;<br> adoquery3.sql.clear;<br> adoquery3.sql.add(s3);<br> adoquery3.open;<br> end<br> else //以D为主查询<br> begin<br> s1:='select * from A where A_ID=:A_ID'; //B表中有A_ID字段<br> s2:='select * from B where B_ID=:B_ID';<br> s3:='select * from C where C_ID=:C_ID'; //D表中有C_ID字段<br> s4:='select * from D ';<br> S5:='select * from E where D_ID=_ID'; //关系:A->B->E->D<-C<br> adoquery1.datasource:=datasource2;<br> adoquery2.datasource:=datasource5;<br> adoquery3.datasource:=datasource4;<br> adoquery5.datasource:=datasource4;<br><br> adoquery4.sql.clear; //执行SQL<br> adoquery4.sql.add(s4);<br> adoquery4.open;<br> adoquery3.sql.clear;<br> adoquery3.sql.add(s3);<br> adoquery3.open;<br> adoquery5.sql.clear;<br> adoquery5.sql.add(s5);<br> adoquery5.open;<br> adoquery2.sql.clear;<br> adoquery2.sql.add(s2);<br> adoquery2.open;<br> adoquery1.sql.clear;<br> adoquery1.sql.add(s1);<br> adoquery1.open;<br> end;<br>END;