我有十个查询条件,提供了十个编辑框或组合框供用户输入查询信息,有什么好的办法来判断应该使用那些信息来组成SQL语句。例如:(50分)

  • 主题发起人 主题发起人 seeme0526
  • 开始时间 开始时间
S

seeme0526

Unregistered / Unconfirmed
GUEST, unregistred user!
strsql:='select * from table1 where ';
if (edit1.text<>'') and (edit2.text='') and (cob_dw.text='') then strsql:=strsql+' d1='+edit1.text;
if (edit.text<>'') and (edit2.text<>'') and (cob_dw.text='') then strsql:=strsql+' d1='+edit1.text+' d2='+edit2.text;

谢了。
 
每一个选择条件前面加上一个复选框

由一个就加一个条件

然后用and连起来
 
加复选框是多些一举,就按楼主自己的就行了,我自己的也是这样做的。
 
但我觉得这样会写很多代码,而且易出错,因为要排列组合所有条件呀。
 
'select * from table1 where 1=1 '
再往上加吧 and and and
 
支持if
我以前也做过,是容易出错,不过也很容易找错,呵呵
 
把那些用来做查询条件的TEdit控件放在一个容器里,比如:Panel1,代码如下:
AnsiString SQLStr = "select * from xxx where "
TEdit* TmpEdit;
for(int i=0; i<Panel1->ControlCount; i++)
if(Panel1->Controls->ClassNameIs("TEdit"))
{
TmpEdit = (TEdit*)Panel1->Controls;
if( (TmpEdit->Text != "") &amp;&amp; (i != Panel1->ControlCount-1) )
SQLStr = SQLStr + " d" + IntToStr(i) + " = " + TmpEdit->Text + " and ";
else
SQLStr = SQLStr + " d" + IntToStr(i) + " = " + TmpEdit->Text;
}
我没仔细斟酌,大致是这样的,如果有错你自己改一下吧。注意:条件字段名要规整一些,
比如:tj1,tj2,tj3......这样的就比较好

其实,你这个还不算困难,就上面这么一小段代码就可以了,我以前做过一个数据库程序,其中有
三组组条件,A组中有3个条件;B组中有5个条件;C组中有4个条件。每组中选一个,组合查询。
我当时是将每组的每个条件用TRadioButton表示,然后分别将他们的Tag设成顺序的数字
然后用他们组成一个三位数,A组中的占百位,B组中的占10位,C组中的占个位
这样就成了a1*100 + b2*10 + c3 = 123
就这样省了一些事,不过,由于比较全都组合到,所以也仅仅是减少的代码,不过思路是可以值得
借鉴的
 
HD_Copy:
先谢谢你,不过很不好意思,我不懂C,不过好像有点概念,先试试。
 
用类的方法
...
var
i:integer;
get:string;
begin
...
for i:=0 to Form1.ControlCount-1 do
if (Form1.Controls is TEdit) then
if (Form1.Controls as TEdit).Text<>'' then
begin
if get<>'' then get:=get+',';
get:=get+(Form1.Controls as TEdit).Text;
end;
strsql:='select * from table1 where '+get;
end;

我把思路给你,代码自己改一下.
 
我是这样的:这样不用做判断
如有edit1、edit2、edit3.....edit10
with query1 do begin
close;
sql.clear;
sql.add('select * from table where ');
sql.add(e1 like :p_e1 ');
sql.add(and e2 like :p_e2');
sql.add(and e3 like :p_e3');
parambyname('p_e1').asstring:='%'+edit1.text+'%';
parambyname('p_e2').asstring:='%'+edit2.text+'%';
parambyname('p_e3').asstring:='%'+edit3.text+'%';
......
open;
end;


end;
 
samcrm的方法应该可行,试试先。
tonylo的方法如果字段 is null可能会出现。
 
samcrm 谢谢
有不同意见吗?
 
with Form1 do
begin
for i:=0 to ControlCount-1 do
begin
if (Controls is TComboBox) then
if (Controls as TComboBox).Text<>'' then
begin
if get<>'' then
get:=get+' and ';
get:=get+(Controls as TComboBox).Name+'='''+(Controls as TComboBox).Text+'''';
end;
if (Controls is TEdit) then
if (Controls as TEdit).Text<>'' then
begin
if get<>'' then get:=get+' and ';
if isNumber((Controls as TEdit).Text) then
get:=get+(Controls as TEdit).Name+'='+(Controls as TEdit).Text
else
get:=get+(Controls as TEdit).Name+'='''+(Controls as TEdit).Text+'''';
end;
end;
end;
if get<>'' then
strsql:='select * from cxcpmx where '+get
else
strsql:='select * from cxcpmx';
 
可以不用这么复杂
定义一个全局数据组变量,
var
SearchStr:Array[1..10] of string;

把edit的tag编码从1到10,然后在其中一个edit的Onchange事件中加入如下代码,其它edit引用就可以(或写成Porcedur加入OnChange事件中)
begin
if (sender as TEdit).text<>'' then
SearchStr[(sender as TEdit).tag]:='and(FieldName='+#39+(sender as TEdit).text+#39+')'
else SearchStr[(sender as TEdit).tag]:='';
end;
(注:FieldName(字段名)也可以昨为一个变量,如用一个ComboBox作为字段选择,再加edit值的组合,
这样灵活性更好,当然这样做上述语句就要稍作改变了,再复习一点把条件连接的"and"都作为变量等).

再后用
for i:=0 to 10 do
SqlStr:=SqlStr+SearchStr;
SqlStr:='select * from table1 where (1=1) '+SqlStr;
(用1=1是为了条件全空时不会出错,连判断的语句也省去,更显简洁)
结束。
上述代码相对简单,但没测试过,应该没大问题,有兴趣试试吧。

 
上述补充,
如果上面语句中FieldName不是设置为变量而其它edit又是引用该事件的话,
就要换成Case语句,根据tag来对应固定的FieldName值
 
ugvanxk的方法最好 大家怎么没看到呀
 
> ugvanxk的方法最好 大家怎么没看到呀
其实方法都差不多,问题是在应该如何处理and and and ……这块条件再为简便嘛。
 
同意ugvanxk,此乃本人常用方法,简洁安全有效。
 
不用那么麻烦
使用LIKE语句,有就是like edit1.text, 如果为空 就是 like '%'
这样包你简单过关
 
我觉的jiao_he的方法最好,在获取form中的参数条件最精练,而且用=比用like号,可以
在各数据库版本通用,否则用like的话,在oracle上是有问题的。
 
后退
顶部