组合查询是怎么做的(如果哪个edit为空,就表示不用它作为查询条件)?一个接一个地对edit进行判断,如果不为空,就queryCondition:=queryCondition+'And...',最后再sql.add(queryCondition)? 如果一个表有20多个字段,任何字段组合都可作为查询条件,怎么办?写20多个if语句呀?我想过用一个labeledEdit类型的数组来接收查询条件,写一个循环:
if labeledEdit[i].text<>'' then  queryCondition:=queryCondition+'And '+labeledEdit[i].caption+...(具体细节不讨论了).这样可以吗?如果可以,怎么让一组labeledEdit变成一个数组呢?它的名字不允许有[]啊?教教我怎么做啊,谢谢大家!!!!!

解决方案 »

  1.   

    你参考一下:
            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;
      

  2.   

    呵呵,想偷懒的方法阿:)我喜欢这样做,写:
    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;
      

  3.   

    楼上的办法,不可行,因为每个edit框对应一个数据库里的字段
    我以前的做法就是写了十几个if语句,学习一下,还有没有好的方法
      

  4.   

    设置好用于查询的Edit的Tag
    然后循环所有的Edit判断是对应Tag值得进行处理
      

  5.   

    madyak(无天) 的办法是可以的就是开始的时候写上选取所有的结果的 where 条件是where 1=1
    然后根据哪个edit不为空再and 条件就好了
      

  6.   

    楼主可以这样,这只是个思路:
    建一个表,字段是:字段名,数据,符号,连接符;
    然后加3个组合框,分别做为字段名,符号(=,><等),连接符(AND,OR)并初始化好,以便用户不用输入,直接选择
    接着,用户每输入一个条件就加入到表中,当选择查询时,就把表记录一条条读出来连起来就是一个SQL语句了,也可把那3个组合框嵌到DBGRID中去
      

  7.   

    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;
      

  8.   

    >>>>>回复人: wolf2005() ( ) 信誉:94  2003-12-12 13:05:00  得分:0 
     
     
      楼上的办法,不可行,因为每个edit框对应一个数据库里的字段
    我以前的做法就是写了十几个if语句,学习一下,还有没有好的方法
      
    俺都用了n次了,除了tag,还可以用hint属性,保存字段名的!!!
      

  9.   

    你看这样行不行首先分析出表的字段列表和类型
    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可以选择到全部表的列,并为该列输入查询条件。
      

  10.   

    我觉得可以这样:
      如果有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)) ...
      

  11.   

    sundayboysII(空):
    你的方法,怎么使得labelededit和数组联系在一起呢(怎么设置labelededit的name,怎么定义数组?)谢谢!!!
      

  12.   

    myyanghua(水手) :你的方法我没想到过呢,你试过吗?
      

  13.   

    定义数组:array[0..X] of TLabeledEdit;
    不过你为什么一定要和数组联系在一起呢?毕竟可以利用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语句的。
      

  14.   

    sundayboysII(空)的方法是可行的
      

  15.   

    declare @pEdit1 varchar(20), @pEdit2 varchar(20), @pEdit3 varchar(20)select @pEdit1=:@pEdit1, @pEdit2=:@pEdit2, @pEdit3=:@pEdit3if isnull(@pEdit1, '')='' set @pEdit1='%'
    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;
      

  16.   

    sundayboysII(空):我明白了。原来不大清楚self是什么,所以才问了这么苯的问题,呵呵。谢谢你!!!!!
      

  17.   

    for i:=0 to  componentcount-1 do
    begin
       if  (components[i] is  TEdit)  then
       begin
          if  TEdit(Components[i]).text='' then
             ...
             ;;
      

  18.   

    sundayboysII(空):只可以查询相等的条件啊!不过可以稍微改造一下,加入一个条件让用户选择更好!
      

  19.   

    kylix2003(Jelly) ,sql语句中把 = 变成 like ,就是模糊查询了,适合类型为char的字段
    对我的问题来说,足够了,呵呵
      

  20.   

    谢谢大家!(排名不分先后)
    1)zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之)的帖子使我突然想起,模糊查询不用判断edit是否为空,用like就行了(我怎么原来没有想到呢~)
    2)sundayboysII(空)的方法很好!我非常喜欢,那么多个查询条件,用一个循环语句就搞定了。而且我学到了一个特别有用的方法,知道怎样用循环处理form上的组件了。特别要感谢你!
    3)wyr521(论坛王子)的方法应该和sundayboysII(空)的差不多吧,我没试过,但把它记住了 :)
    4)xiaoqiang123(xiaoqiang),getit911(你的Windows蓝屏啦):其实我在另一些表的查询中用的就类似你们的方法,呵呵
    5)myyanghua(水手)的思路也很好,不过我试了没成功,不知道错哪了 :(
    6)xiaocuo_zrf(刀未锋)提的判断tag和sundayboysII(空)的判断hint,又使我学到了两招!
    7)其他人的意见也很有参考价值,谢谢你们!!!
    揭贴咯~~
      

  21.   

    why??!! alert:"贴子回复次数大于跟给分次数 "
    我总不能给自己分吧?!
      

  22.   

    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;