请教查询的好办法(100分)

  • 主题发起人 主题发起人 camcap
  • 开始时间 开始时间
C

camcap

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(!][:D]初次到来.[:)]
写得多,麻烦耐心看完.呵呵!
我要做一个三层的结构.使用的是socketconnection,应用层使用的adodataset,
客户端用的是clientdataset,在客户端进行查询,我使用了四个edit,准备输入
四个查询的条件,现在我想要的结果是任何一个条件可以单独查询,也可以满足
任何两个条件查询,还要可以满足其中三个条件进行查询,或同时满足四个条件
通俗的讲就是随便在这四个条件集合中查询条件的组合.
的查询我使用了一些方法,在adodataset修改where语句,在客户端每个edit前加
checkbox,这种效果很不好.
烦请教我实现这种功能的方法!最好是sql语句的操作
 
简单些,你可以设几个变量 然后组成SQL语句
还可以做一个表,然后就是对表进行读写
还可以找一些万能查询控件
 
通过判断各edit是否为空来决定在查询条件中是否加入该edit的内容。下面是我的一个
实例。

//G_String是SQL语句用的字符串,这里先给出初始部分,在后面根据各edit内容增加。
G_String:='select Da_Nytd.*,T_Client.Hm,Dm_Nytd.Dm_Nytd_Mc from Da_Nytd,T_Client,Dm_Nytd where Da_Nytd.hh=T_Client.Hh and Da_Nytd.Xh=Dm_Nytd.Dm_Nytd_Xh';
G_Bool:=false; //G_Bool为false时表示各edit内容均为空,先将其初始化为false.
if trim(Edt_TjKhh.text)<>'' then //各以Edt_打头的都是edit控件。
begin
G_Bool:=true; //一有edit控件内容不为空,将G_Bool置为true.
if Pos('*',Edt_TjKhh.text)>0 then
G_String:=G_String+' and Da_Nytd.hh like '''+MP_ReplaceStr(trim(Edt_TjKhh.text),'*','%',true,true)+''''
else G_String:=G_String+' and Da_Nytd.Hh='''+trim(Edt_TjKhh.text)+'''';
end;
if trim(Edt_TjKhm.text)<>'' then
begin
G_Bool:=true;
if pos('*',Edt_TjKhm.text)>0 then
G_String:=G_String+' and T_Client.Hm like '''+MP_ReplaceStr(trim(Edt_TjKhm.text),'*','%',true,true)+''''
else G_String:=G_String+' and T_Client.Hm='''+Trim(Edt_TjKhm.text)+'''';
end;
if trim(Edt_TjGllx.text)<>'' then
begin
G_Bool:=true;
if pos('*',Edt_TjGllx.text)>0 then
G_String:=G_String+' and Da_Nytd.Xh like '''+MP_ReplaceStr(Edt_Tjgllx.text,'*','%',true,true)+''''
else G_String:=G_String+' and Da_Nytd.Xh='''+Trim(Edt_TjGllx.text)+'''';
end;
if Trim(Edt_TjGlm.text)<>'' then
begin
G_Bool:=true;
if pos('*',Edt_TjGlm.text)>0 then
G_String:=G_String+' and Da_Nytd.Sbmc like '''+MP_ReplaceStr(Edt_Tjglm.text,'*','%',true,true)+''''
else G_String:=G_String+' and Da_Nytd.Sbmc='''+Trim(Edt_TjGlm.text)+'''';
end;
if not G_Bool then
begin
Application.MessageBox(PChar('请输入'+Btn_Exe.Caption+'条件'),'提示',mb_ok+mb_iconWarning);
exit;
end
else DataSet.CommandText:=G_String;
 
看看我的事不是简单点,功能虽没有那么强大:
sqltxt:='select * from 表名 where 1=1 ';
if trim(edit1.text)<>'' then
sqltxt:=sqltxt+' and 字段名1='''+edit1.text+'''';//精确
if trim(edit2.text)<>'' then
sqltxt:=sqltxt+' and 字段名2 like '''+edit1.text+'''';//模糊 也可用%
............
最后要根据你的数据类型进行转换
也可以保存导一个表去
表结构:
左括号 字段名 操作符 值 右括号 连接符
具体的你自己喜欢怎么设计就怎么设计
 
var
tempsql:string;
begin
if trim(参数1)<>'' then
tempsql:=' where ...........'
if trim(参数2)<>'' then begin
if tempsql='' them
tempsql:=' where ..........'
else tempsql:=tempsql+' and .........'
end;
参数3......
参数4......
with query do
begin
close;
sql.clear;
sql.add('select * .......'+ tempsql);
open;
end



end;
 
多人接受答案了。
 
后退
顶部