如何实现任意的组合查询(200分)

  • 主题发起人 主题发起人 tommei
  • 开始时间 开始时间
T

tommei

Unregistered / Unconfirmed
GUEST, unregistred user!
现有三个条件:姓名,年龄,性别,要求可单独使用任一条件进行查询,也可混合条件查询
如按姓名+年龄或姓名+性别或年龄+性别或姓名+年龄+性别。如此类推,大约有8中组合的查询
条件。我一开始用判断语句进行查询,共八组,但后来想想,这办法似乎太土了,如再加条件
的话,那组合将是非常多,一个个判断太烦了,不知有何简单方法进行处理。要求使用
以下几个控件。ADOConnection,tadoQuery(不是tquery),因为我是查询服务器上sql表中的
资料。
谢谢!
tommei
 
下面是一个举例
var
strDesSql : string ;
id :integer ;

strDesSql :='Select * from db where ';
id := 0 ;
if strName<>'' then
begin
inc(id );
strDesSql := format( '%s %s=''%s''' ,[strDesSql ,'name' , strName] );
end;

if strOld <>'' then
begin
if id=0 then
strDesSql := format( '%s %s=''%s''' ,[strDesSql ,'name' , strName] )
else
strDesSql := format( '%s and %s=''%s''' ,[strDesSql ,'name' , strName] );
inc(id);
end;

...
类推
或者 不要id,在最后判断strDesSql的末尾是否是'and'
如果是,将and删除。
 
这个问题以前讨论了很多,查查吧!~
 
看看吧:
procedure TForm1.Button1Click(Sender: TObject);
var
sqlstring:string;
begin
sqlstring:='';
if edit1.text<>'' then
begin
sqlstring:=' field='''+edit1.text+'''';
end;
if edit2.text<>'' then
begin
if sqlstring<>'' then
begin
sqlstring:=sqlstring+' and field2='''+edit2.text+'''';
end
else
begin
sqlstring:=' field2='''+edit2.text+'''';
end;
end;
if edit3.text<>'' then
begin
if sqlstring<>'' then
begin
sqlstring:=sqlstring+' and field3='''+edit3.text+'''';
end
else
begin
sqlstring:=' field3='''+edit3.text+'''';
end;
end;
with query1 do
begin
clsoe
sql.clear;
sql.add('select * from table1 where');
sql.add(sqlstring);
open;
end;
end;
 
以上两位方法还不如我的呢
procedure AddQueryTj(Qry:Tquery;const FieldName,Value:string);
begin
With Qry do
begin
Sql.add(' And '+FieldName+'=:P '+FieldName);
ParamByName('p'+Fieldname).asstring:=Value;
end;
end;
调用
with query1 do
begin
close;
sql.clear;
sql.add('select * from youtable where 1=1')
if edit1.text<>'' then
AddQueryTj(query1,field1,edit1.text);
if edit2.text<>'' then
AddQueryTj(query1,field2,edit2.text);
if edit3.text<>'' then
AddQueryTj(query1,field3,edit3.text);
open;
end;
修改一下ADDQUERYTJ还可以进行别的 ><等运算
 
关键是不要检测AND的位置
一定要用
SELECT * FROM YOURTABLE WHERE 1<>1
 
改版
procedure AddQueryTj(Qry:Tquery;const Logical,FieldName,Oprt,Value:string);
begin
With Qry do
begin
If Logical='And' then
Sql.add(' And '+FieldName+Oprt+':P '+FieldName);
If Logical='Or' then
Sql.add(' Or '+FieldName+Oprt+':P '+FieldName);
ParamByName('p'+Fieldname).asstring:=Value;
end;
end;
调用
with query1 do
begin
close;
sql.clear;
sql.add('select * from youtable where 1=1')
if edit1.text<>'' then
AddQueryTj(query1,'And',field1,'=',edit1.text);
if edit2.text<>'' then
AddQueryTj(query1,'Or',field2,'<>'edit2.text);
if edit3.text<>'' then
AddQueryTj(query1,'and',field3,'=',edit3.text);
open;
end;
 
armd的如果是使用tADOquery好像有问题,估计是ParamByName('p'+Fieldname).asstring:=Value;
这里的问题,使用tquery则没事
 
》》armd的如果是使用tADOquery好像有问题,
》》估计是ParamByName('p'+Fieldname).asstring:=Value;
》》 这里的问题,使用tquery则没事
关键是
procedure AddQueryTj(Qry:Tquery;const FieldName,Value:string);
begin
With Qry do
begin
Sql.add(' And '+FieldName+'=:P '+FieldName);
ParamByName('p'+Fieldname).asstring:=Value;
end;
end;
QRY传入的是TQUERY 换成你想要的类即可
 
后退
顶部