5个下拉菜单~~
实现动态多条件查询统计功能高手指点 谢谢

解决方案 »

  1.   

    我最怕碰到这种问问题的人了,根本没有说清楚啊。等搞明白估计后面的问题接二连三的冒出来。
    5个下拉菜单是用来干吗的?
    是条件呢还是描述性的要求,比如按月,按排名等等
    如果是条件好办一些,但是这些条件间是 AND 还是 OR 有些是否需模糊查询等等。
    描述性的就要按你自己的定义来考虑了。先看看相关SQL语句的基础,这样遇到问题也知道如何描述了。
      

  2.   

    晕~~5个 combobox 设置成dropdown模式
    已经在每个combobox里面添加了若干item
    这每个combobox的内容 是 一张表5个的字段的所有取值,每个combobox表示一个字段
    那么 我需要统计 任意选择几个条件 然后就可以动态的查询我需要统计的内容难点是动态生成where子句~~另外 select count(*)计算得出的值 如何传递给delphi中定义的变量,用什么方法呢?
      

  3.   

    select count(*) as Num
    Num作为字段名
      

  4.   

    我不要传递给字段~
    我要传递给delphi环境里面的变量~~
    var aaa:integer;
    然后 将select count(*) from T1计算的总数传递给aaa
      

  5.   

    sql.text := 'select * from tablename where col1 ='''+Cbx1.Text+''' and col2='''+Cbx2.text+'''……'
      

  6.   

    1、下拉菜单不管多少都可以应付自如,不过建议你在下拉框前设置一个复选框,这样才不致于用户要取消某个字段做条件时反而做不了。function TForm1.GetQueryCondition(var strWhere: String): Boolean;
    var
      strConn: String;
    begin
      Result := False;
      strConn := ' AND ';
      strWhere := '';
      // 条件字段1
      if CheckBox1.Checked then begin
        if ComboBox1.ItemIndex < 0 then Exit;
        strWhere := strWhere + strConn + ' Field1 = ' + ComboBox1.Items[ComboBox1.ItemIndex];
        // 如果field1是字符型,这样写:
       //strWhere := strWhere + strConn + ' Field1 = ' + QuotedStr(ComboBox1.Items[ComboBox1.ItemIndex]);
      end;
      // 条件字段2
      if CheckBox2.Checked then begin
        if ComboBox2.ItemIndex < 0 then Exit;
        strWhere := strWhere + strConn + ' Field2 = ' + ComboBox2.Items[ComboBox2.ItemIndex];
      end;
      ....
      // 条件字段n
      if CheckBoxn.Checked then begin
        if ComboBoxn.ItemIndex < 0 then Exit;
        strWhere := strWhere + strConn + ' Fieldn = ' + ComboBoxn.Items[ComboBoxn.ItemIndex];
      end;
      Result := True;
    end;函数返回值为False 时,表示有个复选框选中了但对应的下拉框却没有选择一个值。你也可以根据需要在此时弹出对话框提示用户输入,或者修改上面的代码直接忽略这个条件。
    得到的 where 语句可以直接拼在SQL语句后面。如果原来没有使用条件,可以添加一个
    var strWhere: String;
    begin
      if GetQueryCondition(strWhere) = False then Exit;
      with Query1 do begin
        Sql.Text := 'select ... from ... where 1=1 ' + strWhere;
        Open ;
      end;
      ...
    end;
      

  7.   

    5个combobox啊,我觉得用case做也可以,就是有点麻烦了,不知道你 5个combobox之间有没有关系,比如第一个combobox是决定查询哪张表,第二个是决定查询哪个字段。,如果可以这样区分那用case 做也可以,反正给几个变量存combobox的值,最后套在where语句中就OK,我做的是3个comboboxif ComboBox1.ItemIndex=0 then begin
    Case ComboBox2.ItemIndex of
    0:begin
       Case ComboBox3.intemIndex of 
       0:begin
       end;
    end; 
    Sql:='select '+str+' from '+str1+'where '+.....(+' like "%'+)
      

  8.   

    靠,说了半天原来是这个意思啊?这个问题用数组解决最好,
    给你个例子自己看看吧:
    var
    STR:STRING;
    arrstr:array[1..6] of string;
    I:INTEGER;
    begin
    if Trim(Combox1.Text)<>'' then
    arrstr[1]:='('''+Trim(Combox1.Text)+'''=值)';//值可以为你设置为动态的,例如一个COMBOX
    if Trim(Combox2.Text)<>'' then
    arrstr[2]:='('''+Trim(Combox2.Text)+'''=值)';//值可以为你设置为动态的,例如一个COMBOX
    if Trim(Combox3.Text)<>'' then
    arrstr[3]:='('''+Trim(Combox3.Text)+'''=值)';//值可以为你设置为动态的,例如一个COMBOX
    if Trim(Combox4.Text)<>'' then
    arrstr[4]:='('''+Trim(Combox4.Text)+'''=值)';//值可以为你设置为动态的,例如一个COMBOX
    if Trim(Combox5.Text)<>'' then
    arrstr[5]:='('''+Trim(Combox5.Text)+'''=值)';//值可以为你设置为动态的,例如一个COMBOX
    arrstr[6]:='';
    for i:=1 to 5 do
    begin
    if arrstr[i]<>'' then
    ARRSTR[6]:=ARRSTR[6]+ARRSTR[I];IF tRIM(ARRSTR[6])<>'' then
    STR:=‘SELECT * FROM table where  ’+arrstr
    else str='select * from Table'
    with query do begin
    Close;
    SQL.Clear;
    SQL.Text:=str;
    Open;
    end;
    end;
    结贴
    呵呵
      

  9.   

    对于你所说的第二个问题,你怎么就没明白地主的意思呢?
    var
    s:integer;
    begin
    With query do begin
    Close;
    SQL.Clear;
    SQL.Text:='select count(*) as Num from Table'
    Open;
    s:=FieldByName('Num').Value;
    Close;
    end;
    end;
      

  10.   

    注:
    IF tRIM(ARRSTR[6])<>'' then
    STR:=‘SELECT * FROM table where  ’+arrstr//不小心写错了,应该为arrstr[6]
      

  11.   

    谢谢!!
    动态生成SQL语句 我昨天自己想办法解决了~~
    以后可以对付随便多少的条件 呵呵早上过来看帖子 和 yjs_lh(长风浪子) ( ) 信誉:100          的方法差不多
    我很感激大家的帮助地主 你的意思 我现在也明白了 呵呵 谢谢!!
    我第一次开发winform的程序 如果 今天完工 我就发给大家看看
    呵呵