已知界面如下:
□CheckBox1 ComboBox1(等于、不等于) Edit1
□CheckBox2 ComboBox2(等于、不等于) Edit2
…………
…………
若干项!
当选中CheckBox1 则 s := CheckBox1.Caption + ComboBox1.Items[ComboBox1.ItemIndex] + '=' + Edit1.text;当选中若干项时,用And连接~各位一般怎么处理?或者用存储过程也行?给出代码!谢谢~
□CheckBox1 ComboBox1(等于、不等于) Edit1
□CheckBox2 ComboBox2(等于、不等于) Edit2
…………
…………
若干项!
当选中CheckBox1 则 s := CheckBox1.Caption + ComboBox1.Items[ComboBox1.ItemIndex] + '=' + Edit1.text;当选中若干项时,用And连接~各位一般怎么处理?或者用存储过程也行?给出代码!谢谢~
var i:integer;
str_xor,str_value,str_c,str_f:string;
begin
WhereNewStr:='';
if b_no>0 then
with stringgrid1 do
begin
for i:=1 to rowcount-1 do
begin
if cells[0,i]='且' then str_c:=' and '
else str_c:=' or ';
str_xor:=cells[2,i];
str_f:=f_field(cells[1,i]);
str_xor:=chntoen(str_xor);
if (str_xor=' like ') or (str_xor=' not like ') then
str_value:='%'+cells[3,i]+'%'
else if str_xor='% like ' then
begin
str_value:=cells[3,i]+'%';
str_xor:=' like ';
end
else if str_xor=' like %' then
begin
str_value:='%'+cells[3,i];
str_xor:=' like ';
end
else str_value:=cells[3,i];
if i=1 then WhereNewStr:=str_f+str_xor+''''+str_value+''''
else WhereNewStr:=WhereNewStr+str_c+str_f+str_xor+''''+str_value+'''';
end;
end;
//showmessage(WhereNewStr);
end;
2 将checkbox和edit做成控件数组,
procedure OnAdd(Sender :TObject);
var
tmp :string;
begin
tmp := TComboBox(FindComponent('ComboBox' + IntToStr(TCheckBox(Sender).Tag))).Items[ComboBox1.ItemIndex] + TEdit(FindComponent('Edit' + IntToStr(TCheckBox(Sender).Tag))).Text;
if s = '' then
s :=TCheckBox(Sender).Caption + tmp
else
s :='And' + TCheckBox(Sender).Caption + tmp;
end;
最后把每个CheckBox1的OnClick事件关联到这个过程
if cbbdate.Checked =true then
StrSql:=StrSql+'and sfdate between '+'#'+datetostr(dtpsfdate.Date)+
'#'+' and '+'#'+datetostr(dtpsfend.Date)+'#';
//如果选择客户
if cbkh1.Checked=true then
begin
StrSql:=StrSql+'and khdm='''+adofind.fieldbyname('khdm').AsString+'''';
end;
//如果选择表名
if cbbm1.Checked=true then
begin
StrSql:=StrSql+'and khbh='''+adofind.fieldbyname('khbh').AsString+'''';
end;
//如果选择收费员
if cbsfy1.Checked=true then
begin
StrSql:=StrSql+'and yff='''+adofind.fieldbyname('czybm').AsString+'''';
end;
//如果选择开票员
if cbkpy1.Checked=true then
begin
StrSql:=StrSql+'and ykp='''+adofind.fieldbyname('czybm').AsString+'''';
end;
//开始查找数据
StrSql:=copy(StrSql,5,255);
if StrSql='' then
begin
showmessage('请选择一个查询条件,在其前面打钩即可');
exit;
end;
with dmmain.ADOQCfsf do
begin
sql.Clear;
sql.Add('select * from cfff where');
sql.Add(StrSql);
open;
end;
调不通呀!晕~~
你的程序一定有问题!不够健壮! 如果前边的CheckBox我都不选,只选中间的一项为真,你的程序就出错了!
不好意思,刚才看错了!~没有留意到你的Copy!可以得到我想要的结果!感谢!~
不过,我想求更为精简的方法!
为此,我重载了QrySelect方法!但是代码太长了!~这里紧紧两个CheckBox就这么长的代码!
不知各位有没有更为完美的做法?procedure TForm5.QrySelect(s, s1, s2, s3: String; i, i1: Integer);
var
sign, sign1: String;
begin
case i of
0:
begin
sign := '=';
end;
1:
begin
sign := '<>';
end;
2:
begin
sign := 'like';
end;
end; case i1 of
0:
begin
sign1 := '=';
end;
1:
begin
sign1 := '<>';
end;
2:
begin
sign1 := 'like';
end;
end; ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select empid as "用户名", empname as "姓名", empqx as "权限" from employee where');
if i <> 2 then
begin
ADOQuery1.SQL.Add(s + sign + '''' + s1 + '''');
end
else
begin
ADOQuery1.SQL.Add(s + ' ' +sign + '''' + s1 + '%''')
end;
if i1 <> 2 then
begin
ADOQuery1.SQL.Add('and ' + s2 + sign1 + '''' + s3 + '''');
end
else
begin
ADOQuery1.SQL.Add('and ' + s2 + ' ' + sign1 + '''' + s3 + '%''');
end;
ADOQuery1.Open;
end;