组合查询是怎么做的(如果哪个edit为空,就表示不用它作为查询条件)?一个接一个地对edit进行判断,如果不为空,就queryCondition:=queryCondition+'And...',最后再sql.add(queryCondition)? 如果一个表有20多个字段,任何字段组合都可作为查询条件,怎么办?写20多个if语句呀?我想过用一个labeledEdit类型的数组来接收查询条件,写一个循环:
if labeledEdit[i].text<>'' then queryCondition:=queryCondition+'And '+labeledEdit[i].caption+...(具体细节不讨论了).这样可以吗?如果可以,怎么让一组labeledEdit变成一个数组呢?它的名字不允许有[]啊?教教我怎么做啊,谢谢大家!!!!!
if labeledEdit[i].text<>'' then queryCondition:=queryCondition+'And '+labeledEdit[i].caption+...(具体细节不讨论了).这样可以吗?如果可以,怎么让一组labeledEdit变成一个数组呢?它的名字不允许有[]啊?教教我怎么做啊,谢谢大家!!!!!
解决方案 »
- 关于实现多首歌曲循的问题
- 请教:如何获得其它进程的命令行参数..?
- 麻烦帮我把这段vb程序改为delphi的,谢谢
- 怎样把adoquery从数据库表中从取出的多条返回值显示在memo里?
- 在dbgrid中选择其中的几条记录保存到他它表中。以上的代码怎么写??????
- 请问,在delphi中怎么调用word,excel等应用程序?
- 那位前辈研究过<<DELPHI COM开发>>这本书,觉得这本书怎么样.直得买吗,跟帖有分
- 100分低手问题:请问如何使TSaveDialog组件能自动给用户指定的文件名后加扩展名?(内详)
- 居然会这样
- 怎样控制在Delphi中取数据集中的任意的数据。。。
- 在线求助:Filter问题
- 怎样关闭excel文件
SqlStr := 'SELECT * FROM V_DEPTITEMOUT WHERE 1>0 ';
if EdtRegion.ItemIndex >= 0 then
SqlStr := SqlStr + ' AND Dept_Name LIKE ''' + Trim(EdtRegion.Text) + ''' ';
if EdtProduct.ItemIndex >= 0 then
SqlStr := SqlStr + ' AND Item_Name LIKE ''' + Trim(EdtProduct.Text) + ''' ';
if Trim(edtBillNo.Text) <> '' then
SqlStr := SqlStr + ' AND DanjuNo=''' + Trim(edtBillNo.Text) + ''' ';
if Trim(edtMadeNo.Text) <> '' then
SqlStr := SqlStr + ' AND MadeNo=''' + Trim(edtMadeNo.Text) + ''' ';
AdoQryOut.SQL.Text := SqlStr;
AdoQryOut.Open;
for I := 0 to Self.ControlCount - 1 do
begin
if Self.Controls[I] is TLabeledEdit then
begin
if Trim(TLabeledEdit(Controls[I])).Text <> '' then
QueryCondition := QueryCondition + '...';
end;
end;
我以前的做法就是写了十几个if语句,学习一下,还有没有好的方法
然后循环所有的Edit判断是对应Tag值得进行处理
然后根据哪个edit不为空再and 条件就好了
建一个表,字段是:字段名,数据,符号,连接符;
然后加3个组合框,分别做为字段名,符号(=,><等),连接符(AND,OR)并初始化好,以便用户不用输入,直接选择
接着,用户每输入一个条件就加入到表中,当选择查询时,就把表记录一条条读出来连起来就是一个SQL语句了,也可把那3个组合框嵌到DBGRID中去
if EdtRegion.ItemIndex >= 0 then
SqlStr := SqlStr + ' AND Dept_Name LIKE ''' + Trim(EdtRegion.Text) + ''' ';
if EdtProduct.ItemIndex >= 0 then
SqlStr := SqlStr + ' AND Item_Name LIKE ''' + Trim(EdtProduct.Text) + ''' ';
if Trim(edtBillNo.Text) <> '' then
SqlStr := SqlStr + ' AND DanjuNo=''' + Trim(edtBillNo.Text) + ''' ';
if Trim(edtMadeNo.Text) <> '' then
SqlStr := SqlStr + ' AND MadeNo=''' + Trim(edtMadeNo.Text) + ''' ';
AdoQryOut.SQL.Text := SqlStr;
AdoQryOut.Open;
楼上的办法,不可行,因为每个edit框对应一个数据库里的字段
我以前的做法就是写了十几个if语句,学习一下,还有没有好的方法
俺都用了n次了,除了tag,还可以用hint属性,保存字段名的!!!
T是TCombobox,Tq是Tdataset。
for i1:=0 to tq.FieldCount-1 do
T.AddObject(Tq.Fields[i1].FullName,Tobject(TQ.Fields.Fields[i1].datatype));
这样T中就保存了表的全部列名和列类型信息。
在T的Onclick消息中判断是那个列以及列类型
a是TFieldType;
A:=TFieldType(T.Items.Objects[T.ItemIndex]);
case a of
ftString:begin
//处理输入选择列的查询条件,字符类型
end
//处理其他类型
end;
这样一个Combobox可以选择到全部表的列,并为该列输入查询条件。
如果有20个Edit框,每个Edit框都在SQL语句中表示出来,但是如果为空,该处条件就为1。
即:对于每一个Edit框,可以写成:
Select * From t
Where
((:Dept_NO = '') Or (Dept_NO = :Dept_NO)) And
((:Dept_Name = '') Or (Dept_NO = :Dept_Name)) ...
你的方法,怎么使得labelededit和数组联系在一起呢(怎么设置labelededit的name,怎么定义数组?)谢谢!!!
不过你为什么一定要和数组联系在一起呢?毕竟可以利用ControlCount来循环遍历的
for I := 0 to Self.ControlCount - 1 do
begin
if Self.Controls[I] is TLabeledEdit then
begin
if Trim(TLabeledEdit(Controls[I])).Text <> '' then
QueryCondition := QueryCondition + ' and ' + Trim(TLabeledEdit(Controls[I])).Hint + '=' + Trim(TLabeledEdit(Controls[I])).Text;
end;
end;
我最早就是用这种方式来写了通用的方法来拼sql语句的。
if isnull(@pEdit2, '')='' set @pEdit2='%'
if isnull(@pEdit3, '')='' set @pEdit3='%'select *
from Table1
where vcEdit1 like @pEdit1
and vcEdit2 like @pEdit2
and vcEdit3 like @pEdit3--以上为SQL,
--以下为调用方法
with Query1 do
begin
Acitive:=False;
SQL.Add('以上的SQL语句');
ParamByName('@pEdit1').AsString:=Edit1.Text;
ParamByName('@pEdit2').AsString:=Edit2.Text;
ParamByName('@pEdit3').AsString:=Edit3.Text;
Active:=True;
end;
begin
if (components[i] is TEdit) then
begin
if TEdit(Components[i]).text='' then
...
;;
对我的问题来说,足够了,呵呵
1)zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之)的帖子使我突然想起,模糊查询不用判断edit是否为空,用like就行了(我怎么原来没有想到呢~)
2)sundayboysII(空)的方法很好!我非常喜欢,那么多个查询条件,用一个循环语句就搞定了。而且我学到了一个特别有用的方法,知道怎样用循环处理form上的组件了。特别要感谢你!
3)wyr521(论坛王子)的方法应该和sundayboysII(空)的差不多吧,我没试过,但把它记住了 :)
4)xiaoqiang123(xiaoqiang),getit911(你的Windows蓝屏啦):其实我在另一些表的查询中用的就类似你们的方法,呵呵
5)myyanghua(水手)的思路也很好,不过我试了没成功,不知道错哪了 :(
6)xiaocuo_zrf(刀未锋)提的判断tag和sundayboysII(空)的判断hint,又使我学到了两招!
7)其他人的意见也很有参考价值,谢谢你们!!!
揭贴咯~~
我总不能给自己分吧?!
if EdtRegion.ItemIndex >= 0 then
SqlStr := SqlStr + ' AND Dept_Name LIKE ''' + Trim(EdtRegion.Text) + ''' ';
if EdtProduct.ItemIndex >= 0 then
SqlStr := SqlStr + ' AND Item_Name LIKE ''' + Trim(EdtProduct.Text) + ''' ';
if Trim(edtBillNo.Text) <> '' then
SqlStr := SqlStr + ' AND DanjuNo=''' + Trim(edtBillNo.Text) + ''' ';
if Trim(edtMadeNo.Text) <> '' then
SqlStr := SqlStr + ' AND MadeNo=''' + Trim(edtMadeNo.Text) + ''' ';
AdoQryOut.SQL.Text := SqlStr;
AdoQryOut.Open;