超简单问题。高分。。。(300分)

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

sword_liu

Unregistered / Unconfirmed
GUEST, unregistred user!
for i:=0 to Length(TermList)-1 do
begin
for j:=0 to Length(Term)-1 do
begin
if (Term=Term[j]) and (i<>j) then
TermList:='(('+TermList+')'+'or ('+Term+'>='+''''+Trim(ComboBox4.Text)+''''+' AND '+Term+'<='+''''+Trim(ComboBox5.Text)+''''+'))'
else
TermList[Length(TermList)-1]:=Term+'>='+''''+Trim(ComboBox4.Text)+''''+' AND '+Term+'<='+''''+Trim(ComboBox5.Text)+'''';
end;
end;
如何让TermList中如果有的话,自动增加一个or条件,而如果没有,则加入一个and条件
但不要重复。
我的代码有重复。
 
说清楚点,什么or条件 and条件?
 
你的循环有问题:
1:for i:=0 to Length(TermList)-1 :是不变化的,运行起来达不到你的目的,;
2:你提出的问题是有点不清楚;
 
看一下程序就明白了
 
没有看懂,你再说明白一点,
还有,怎么一会是TermList,一会是Term,是不是你写错了
还是本来就是两个数组.
 
TermList中如果有的话,自动增加一个or条件,而如果没有,则加入一个and条件
但不要重复。
指哪里插入or 或and ,
程序中有好几个or 和 and 呢!
 
不知道你的Term是个什么东西。不过我觉得好像应该是
for j:=0 to Length(Term)-1 do
改成
for j:=i to Length(Term)-1 do
这是个最简单的排序嘛。
 
请说明白点
 
for i:=0 to Length(TermList)-1 do
begin
for j:=0 to Length(Term)-1 do
begin
if (Term=Term[j]) and (i<>j) then
begin
s:= '(('+TermList+')'+'or ('+Term+'>='+''''+Trim(ComboBox4.Text)+''''+' AND '+Term+'<='+''''+Trim(ComboBox5.Text)+''''+'))'
//////////////////////////////////////////////
if termlist.indexof( s)=-1 then
TermList:=s;
////////////////////////////
end;

else
begin
s:=Term+'>='+''''+Trim(ComboBox4.Text)+''''+' AND '+Term+'<='+''''+Trim(ComboBox5.Text)+'''';
//////////////////////////
if termlist.indexof( s)=-1 then
TermList[Length(TermList)-1]:=s;
//////////////////////////////
end;
end;
end;
 
to all
我的term和termlist是两个数组。
这是个动态SQL语句查询的过程。
上面一段是在where后面
它是在一个CheckListBox中加入条件。
如果有多组同样的栏位,我得用or将它们分开。如果不是,用and筛选。
现在它的问题出在有重复。
 
要用循环吗?直接在事件中加条件啊。
这里有个例子,希望对你有帮助

你可以对一个条件判断,如果用户需要该条件,就在where 语句中加上该条件,
如果不需要就不加,对6个条件做一样的判断。给你个例子吧。我这是三个条件的,但是
6个条件的原理也一样。在每个条件前放了一个选择框,表示是否选择该条件。
procedure tfrmmain.jxjlcx;
var
sql:string;
begin
//查询条件都没选中
if (chkfzr.Checked =false) and (chkgznr.Checked =false) and (chkgzrq.Checked =false) then
begin
dtsjx.Close;
dtsjx.CommandText :='select * from yx_jxjl';
dtsjx.Open;
jlsx(dtsjx.fieldbyname('cpbh').asstring);
exit;
end;
sql:='';
//负责人
if chkfzr.Checked then
sql:='fzr='''+lkpfzr.Text+'''';
//工作内容
if chkgznr.Checked then
begin
if sql<>'' then
sql:=sql+' and gzrw='''+lkpgznr.Text +''''
else
sql:='gzrw='''+lkpgznr.Text +'''';
end;
//工作日期范围
if chkgzrq.Checked then
begin
if sql<>'' then
sql:=sql+' and gzrq>=to_date('''+dtqsrq.text+''',''yyyy-mm-dd'') and gzrq<= '+
'to_date('''+dtzzrq.Text+''',''yyyy-mm-dd'')'
else
sql:=' gzrq>=to_date('''+dtqsrq.text+''',''yyyy-mm-dd'') and gzrq<= '+
'to_date('''+dtzzrq.Text+''',''yyyy-mm-dd'')';
end;
dtsjx.Close;
dtsjx.CommandText :='select * from yx_jxjl where '+sql;
dtsjx.Open;
jlsx(dtsjx.fieldbyname('cpbh').asstring);
end;
 
老大,要真有那么简单的话,我就不用作了。
要求是这样的。
第一个ListBox是所有的数据栏位。
第二个ListBox是要查询的栏位
一个CheckListBox是查询的条件,选择第二个ListBox的一个栏位时,在通过两个ComboBox
选择数据范围。加入到CheckListBox后即产生条件,如果该Items的Checked为True的话
就按它排序。
这样的功能我已实现,现在最要紧的是用户加了要求,即在CheckListBox中要求有相同的
栏位不同的数据取值。
上面的就是我在产生Where后面的语句时有重复的条件。
 
你的思路有问题啦 ,试试换种思路
 
具体功能我已实现,现在就是这个循环的时候有问题。我想,可能各位大虾有
更简单的解决办法,所以在提的问题。
 
就是较为通用一点的查询吗?
 
>>(Term=Term[j]) and (i<>j)
这样肯定会有重复的条件出现,只要你的Term里有
重复元素,那么你所说的or条件就会出现重复。。。
 
那怎样解决呢?
 
当出现重复时是因为i 和 j 的循环,因为i 循环在j 的循环的外面,所以当出现
Term=Term[j]时肯定是i<=j的,当重复时肯定是i>j的,利用这一点可以将程序改写:
if (Term=Term[j]) and (i<j) then
TermList:='(('+TermList+')'+'or ('+Term+'>='+''''+Trim(ComboBox4.Text)+''''+' AND '+Term+'<='+''''+Trim(ComboBox5.Text)+''''+'))'
else
if (Term=Term[j]) and (i>j) then
TermList:=TermList[j]
else
......
 
多人接受答案了。
 
后退
顶部