如何实现delphi多条件查询

2025-03-06 16:52:39
推荐回答(1个)
回答1:

根据你的条件,我做了一下:
edit1: 学号, edit2: 职务, edit3: 籍贯,edit4: 面貌.与你的条件有些出入的地方是:我添加了一个radiogroup控件来让用户选择,是按学号查询还是按其他类别查询.
当选择按学号查询时,其它按钮不可用;按其它查询,edit1不可用(这个你自己可以设置是否可用.)如果edit2等中有内容即被当作查询条件,如果为空则不作查询条件.
代码大致如下:
//控制按钮是否可用:
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case radiogroup1.ItemIndex of
0:
begin
radiobutton1.Enabled := false;
radiobutton2.Enabled := false;
datetimepicker1.Enabled := false;
datetimepicker2.Enabled := false;
edit2.Enabled := false;
edit3.Enabled := false;
edit4.Enabled := false;
end;
1:
begin
edit1.Enabled := false;
radiobutton1.Enabled := true;
radiobutton2.Enabled := true;
datetimepicker1.Enabled := true;
datetimepicker2.Enabled := true;
edit2.Enabled := true;
edit3.Enabled := true;
edit4.Enabled := true;
end;
end;
查询按钮
procedure TForm1.Button1Click(Sender: TObject);
var
sql, v_sex : string;
begin
if radiogroup1.ItemIndex = 0 then//按学号查询
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from students where num =''' + trim(edit1.Text)+'''');
open;
end;
end
else
begin
sql := 'select * from students where ';
if trim(edit2.Text) <> '' then
sql := sql + 'duty = ' + Ansiquotedstr(edit2.Text, #39);
if trim(edit3.Text) <> '' then
begin
if trim(edit2.Text) = '' then
sql := sql + 'nation=' + Ansiquotedstr(edit3.Text, #39)
else
sql := sql + 'and nation= '+ Ansiquotedstr(edit3.Text, #39);
end;

if trim(edit4.Text) <> '' then
begin
if (trim(edit2.Text) = '') and (trim(edit3.Text) ='') then
sql := sql + 'mianmao = ' + Ansiquotedstr(edit4.Text, #39)
else if (trim(edit2.Text) <> '') or (trim(edit3.Text) <> '') then
sql := sql + 'and mianmao = ' + Ansiquotedstr(edit4.Text, #39);
end;

if radiobutton1.Checked then
begin
v_sex := radiobutton1.Caption;
if (trim(edit2.Text) = '') and (trim(edit3.Text) ='') and (trim(edit4.Text) = '') then
sql := sql + 'sex =' + Ansiquotedstr(radiobutton1.Caption, #39)
else if (trim(edit2.Text) <> '') or (trim(edit3.Text) <> '') or (trim(edit4.Text) <> '') then
sql := sql + 'and sex =' + Ansiquotedstr(radiobutton1.Caption, #39);
end;

if radiobutton2.Checked then
begin
v_sex := radiobutton2.Caption;
if (trim(edit2.Text) = '') and (trim(edit3.Text) ='') and (trim(edit4.Text) = '') then
sql := sql + 'sex =' + Ansiquotedstr(radiobutton2.Caption, #39)
else if (trim(edit2.Text) <> '') or (trim(edit3.Text) <> '') or (trim(edit4.Text) <> '') then
sql := sql + 'and sex =' + Ansiquotedstr(radiobutton2.Caption, #39);
end;

if (trim(edit2.Text) = '') and (trim(edit3.Text) = '' ) and (trim(edit4.Text) = '') and (v_sex = '') then//如果edit控件全为空,就显示所有记录,这里可以自己设置.
sql := 'select * from students';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Append(sql);
adoquery1.Open;
end;
这里我没有实现日期查询,因为还不知道..(很少使用ACCESS,惭愧..)