var sign:string; fstr:string; begin case ComboBox1.ItemIndex of 0: sign:='='; 1: sign:='>'; 2: sign:='<'; 3: sign:=' like '; 4: sign:='<>'; end; case ComboBox1.ItemIndex of 0,4:fstr:='select * from tabel1 where(%s%s%s) order by %s'; 19: fstr:='select * from tabel1 where(%s%s#%s#) order by %s'; else fstr:='select * from tabel1 where(%s%s''%s'') order by %s'; end; with ADOQuery1 do begin SQL.Clear; SQL.Add(Format(fstr,[ComboBox1.Text,sign,Edit1.Text,ComboBox1.Text])); Prepared; Open; end;
我是使用TStringGrid实现的 For i:=1 to SgrdHide.rowcount-1 do begin IF SgrdHide.cells[0,i]='' THEN Continue; //当为空时,跳到下循环 Fsql:=Fsql+SgrdHide.cells[0,i]; //条件累加 Case comSign.Items.IndexOf(SgrdHide.cells[1,i]) of 0: Fsql:=Fsql+'='''+SgrdHide.cells[2,i]+''''; 1: Fsql:=Fsql+'>'''+SgrdHide.cells[2,i]+''''; 2: Fsql:=Fsql+'>='''+SgrdHide.cells[2,i]+''''; 3: Fsql:=Fsql+'<'''+SgrdHide.cells[2,i]+''''; 4: Fsql:=Fsql+'<='''+SgrdHide.cells[2,i]+''''; 5: Fsql:=Fsql+'<>'''+SgrdHide.cells[2,i]+''''; 6: Fsql:=Fsql+' LIKE '''+'%'+SgrdHide.cells[2,i]+'%'+''''; end; Case comLink.Items.IndexOf(SgrdHide.cells[3,i]) of 0: Fsql:=Fsql+' AND '; 1: Fsql:=Fsql+' OR '; end; IF Pos(SgrdHide.cells[0,i],FieldName)<=0 then //取得要排序的字段 FieldName:=FieldName+SgrdHide.cells[0,i]+',' End; Delete(Fsql,length(Fsql)-4,4); //删除最后一个连接符号 Delete(FieldName,length(FieldName),1); //删除最后一个逗号 Adoquery.close; if Fsql<>'' then //当FSQL不为空时 Begin if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) AND //当涵有WHERE 和不涵有GROUP BY 时 (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then Begin Adoquery.Sql.text:=FDefaultSQL+' AND '+Fsql+' Order by '+FieldName; end Else if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) and //当涵有WHERE 和涵有GROUP BY 时 (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then Begin NewSql:=FDefaultSQL; insert(' AND '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL))); Adoquery.Sql.text:=NewSql+' Order by '+FieldName; end ELSE if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0) AND //当不涵有WHERE 和不涵有GROUP BY 时 (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then Begin Adoquery.Sql.text:=FDefaultSQL+' WHERE '+Fsql+' Order by '+FieldName; end ELSE if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0) AND //当不有WHERE 和涵有GROUP BY 时 (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then Begin NewSql:=FDefaultSQL; insert(' Where '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL))); AdoQuery.Sql.text:=NewSql+' Order by '+FieldName; end ; END ELSE Adoquery.Sql.text:=FoldSql; Try Adoquery.open; Except Showmessage('查找出错: '+AdoQuery.sql.text); end; if AdoQuery.Filtered Then AdoQuery.Filtered:=false;
sign:string;
fstr:string;
begin
case ComboBox1.ItemIndex of
0: sign:='=';
1: sign:='>';
2: sign:='<';
3: sign:=' like ';
4: sign:='<>';
end;
case ComboBox1.ItemIndex of
0,4:fstr:='select * from tabel1 where(%s%s%s) order by %s';
19: fstr:='select * from tabel1 where(%s%s#%s#) order by %s';
else fstr:='select * from tabel1 where(%s%s''%s'') order by %s';
end;
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add(Format(fstr,[ComboBox1.Text,sign,Edit1.Text,ComboBox1.Text]));
Prepared;
Open;
end;
For i:=1 to SgrdHide.rowcount-1 do
begin
IF SgrdHide.cells[0,i]='' THEN
Continue; //当为空时,跳到下循环
Fsql:=Fsql+SgrdHide.cells[0,i]; //条件累加
Case comSign.Items.IndexOf(SgrdHide.cells[1,i]) of
0: Fsql:=Fsql+'='''+SgrdHide.cells[2,i]+'''';
1: Fsql:=Fsql+'>'''+SgrdHide.cells[2,i]+'''';
2: Fsql:=Fsql+'>='''+SgrdHide.cells[2,i]+'''';
3: Fsql:=Fsql+'<'''+SgrdHide.cells[2,i]+'''';
4: Fsql:=Fsql+'<='''+SgrdHide.cells[2,i]+'''';
5: Fsql:=Fsql+'<>'''+SgrdHide.cells[2,i]+'''';
6: Fsql:=Fsql+' LIKE '''+'%'+SgrdHide.cells[2,i]+'%'+'''';
end;
Case comLink.Items.IndexOf(SgrdHide.cells[3,i]) of
0: Fsql:=Fsql+' AND ';
1: Fsql:=Fsql+' OR ';
end;
IF Pos(SgrdHide.cells[0,i],FieldName)<=0 then //取得要排序的字段
FieldName:=FieldName+SgrdHide.cells[0,i]+','
End;
Delete(Fsql,length(Fsql)-4,4); //删除最后一个连接符号
Delete(FieldName,length(FieldName),1); //删除最后一个逗号
Adoquery.close;
if Fsql<>'' then //当FSQL不为空时
Begin
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) AND //当涵有WHERE 和不涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then
Begin
Adoquery.Sql.text:=FDefaultSQL+' AND '+Fsql+' Order by '+FieldName;
end
Else
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) and //当涵有WHERE 和涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then
Begin
NewSql:=FDefaultSQL;
insert(' AND '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL)));
Adoquery.Sql.text:=NewSql+' Order by '+FieldName;
end
ELSE
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0) AND //当不涵有WHERE 和不涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then
Begin
Adoquery.Sql.text:=FDefaultSQL+' WHERE '+Fsql+' Order by '+FieldName;
end
ELSE
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0) AND //当不有WHERE 和涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then
Begin
NewSql:=FDefaultSQL;
insert(' Where '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL)));
AdoQuery.Sql.text:=NewSql+' Order by '+FieldName;
end ;
END
ELSE
Adoquery.Sql.text:=FoldSql;
Try
Adoquery.open;
Except
Showmessage('查找出错: '+AdoQuery.sql.text);
end;
if AdoQuery.Filtered Then
AdoQuery.Filtered:=false;