本人在为单位编写一个投递邮件登单程序时,设计了一个多重查询,把它拿出来和大家共同研究,望能对设计数据库查询的网友们有点帮助。
一、建立一窗体form1,放入控件:combobox1,combobox2,combobox3,分别命名为:cmb21,cmb22,cmb23,并放入相应的三个标签:label1,label2,label3;再放入button1,button2两个按钮用来执行查询和清除查询条件,再放入query1,dbgrid1,datasource1数据库控件,设置好对应的数据库。(这里以一个DBF数据库YJBAK为例)
二、编写代码:
1、 对cmb21,cmb22赋初值: cmb21.items的属性中加入: 邮件号码、收寄局名、投递日期、投递段道、大宗用户、封发人员 cmb22.items的属性中加入: > 、< 、> =、< =、=、< > 等值
2、申明全局变量 var selid:integer;//查询状态标识变量 sel:string;//查询语句变量
3、窗体激活时,初始化查询状态标识。(用以标识是否做过查询,初始值为未做查询) procedure TForm1. FormActivate(Sender: TObject); begin selid:=0; end;
4、执行查询按钮代码 procedure TForm1.Button1Click(Sender: TObject); var tj:string;//查询条件变量 begin //获取选择的条件名对应的数据库字段名 if cmb21.text='邮件号码' then tj:='yjhm'; if cmb21.text='收寄局名' then tj:='sjjm'; if cmb21.text='投递日期' then tj:='ffrq'; if cmb21.text='投递段道' then tj:='tdddm'; if cmb21.text='大宗用户' then tj:='dzyhm'; if cmb21.text='封发人员' then tj:='ffry'; //判断是否是第一次查询 if selid=0 then begin sel:='select * from yjbak where '+tj+cmb22.text+'"'+cmb23.text+'"'; selid:=1; end //第二次查询时,条件后加AND,并加上相应的条件及值 else sel:=sel+' and '+tj+cmb22.text+'"'+cmb23.text+'"'; query1.close; query1.SQL.Clear; //判断条件值是否为空 if cmb23.text< > '' then query1.SQL.Add(sel) //条件值为空时查询所有的值 else query1.sql.add('select * from yjbak'); query1.open; end;
5、清除查询条件按钮,初始化查询语句,清除查询条件 procedure TForm1.Button2Click(Sender: TObject); begin query1.close; query1.sql.Clear; selid:=0; end;
6、条件选择框值变动时,做相应处理。 当选择条件时,对条件对应的值的选择框赋初值,这里以"段道"为例,也可以建立起数据字典,对查询条件值取数据库中的值。 procedure TForm1.cmb21Change(Sender: TObject); var i:integer; begin if cmb21.text='投递段道' then begin for i:=1 to 10 do cmb23.items.Add('投递'+inttostr(i)+'段'); end else cmb23.Items.Clear; end;
以上的多重查询是多次筛选式的查询,如果要加入并列式的查询,SQL语句条件之间用OR连接,还可加入一条件选项,即筛选式查询(AND)和并列式查询(OR)选择,如果这样,以上程序的功能就更丰富了。由于我所编写的这个程序不设汲此方面功能,因此没有把此项功能考虑进去。 程序在DELPHI5、WINDOWS98下运行。
|