我做了一个程序,需要对数据库中的几张表进行综合查询,而且查询的条件有10个左右,我想任意的组合起来,这样的话,用Query控件实现。
比如有以下几个条件的输入框:
edit1/edit2.....edit8/combobox1....combobox3,共11个输入、选择框,请问,要是用Query来查询,那应该如何写SQL语句呢?

解决方案 »

  1.   

    非常简单
    TCombobox选择字段
    TEdit输入数据
    TCombobox选择 (And/Or)
    再组合如:
    有字段:F1,F2,F3,F4
    cmbSearchType.add('字段1')....
    TEdit1,....
    cmbJoin1,....我写两句,其它以此类推
    var
     tmpField,tmpJoin1,tmpValue1,tmpJoin2,tmpValue2,tmpSQL: String;
    case cmbSearchType.ItemIndex of
      0:tmpField := 'F1';
      1:tmpField := 'F2';
      2:tmpField := 'F3';
    end;tmpSQL := 'SELECT * FROM [TABLE] WEHRE ' + tmpField ' = ' + tmpValue1 + ' tmpJoin1' ...大概就是这样,稍加变通,可以写Like,日期,>=,<=等等查询,我这些代码写得粗,你看看应该明白意思
      

  2.   

    我建了两个查询,其中一个查询条件是10个,另一个查询条件是3个,要不就以3个的,请各位帮忙看看具体怎么写
    eidt1、edit2、edit3
    我写的语句:
    var
     sq1:string; //定义一个字符型变量if CheckBox1.Checked=true then
     begin
      sq1:='select jbxx.zhh as 总户号,jbxx.hm as 户名,jbxx.dh as 段号,jbxx.dxh as 段序号,jbxx.dz as 地址,jhxx.jbh as 局编号 from jbxx,jhxx where jbxx.zhh=jhxx.zhh and jbxx.zhh='+edit1.Text;
     end;
     memo1.Text:=sq1;
     with cfglDM.Query1 do
     begin
      Close;
      SQL.Clear;
      SQL.Add(sq1);
      Open
     end;可是在运行时就会报错:
    标准表达式中数据类型不匹配我也没找出是哪里不对。
      

  3.   

    jbxx.zhh='+edit1.Text;jbxx.zhh 是什么形的啊  如果是str 的的话 那你写成jbxx.zhh='''+edit1.Text+'''';
      

  4.   

    通过改进后,只选择一个条件时运行正常,程序如下:
    var
     a1,sq1:string; sq1:='select jbxx.zhh as 总户号,jbxx.hm as 户名,jbxx.dh as 段号,jbxx.dxh as 段序号,jbxx.dz as 地址,jhxx.jbh as 局编号 from jbxx,jhxx where jbxx.zhh=jhxx.zhh ';
     if CheckBox1.Checked=true then sq1:=sq1+'and jbxx.zhh=:a1';
     memo1.Text:=sq1;
     with cfglDM.Query1 do
     begin
      Close;
      SQL.Clear;
      SQL.Add(sq1);
      ParamByName('a1').asstring:=edit1.Text;
      Open
     end;可是要是把另两个条件放进去,在运行时,只选择一个条件时就会出现错误,程序如下:
    var
     a1,a2,a3,sq1:string; sq1:='select jbxx.zhh as 总户号,jbxx.hm as 户名,jbxx.dh as 段号,jbxx.dxh as 段序号,jbxx.dz as 地址,jhxx.jbh as 局编号 from jbxx,jhxx where jbxx.zhh=jhxx.zhh ';
     if CheckBox1.Checked=true then sq1:=sq1+'and jbxx.zhh=:a1';
     if CheckBox2.Checked=true then sq1:=sq1+'and jbxx.dh=:a2';
     if CheckBox3.Checked=true then sq1:=sq1+'and jbxx.hm=:a3';
     memo1.Text:=sq1;
     with cfglDM.Query1 do
     begin
      Close;
      SQL.Clear;
      SQL.Add(sq1);
      ParamByName('a1').asstring:=edit1.Text;
      ParamByName('a2').asstring:=edit2.Text;
      ParamByName('a3').asstring:=edit3.Text;
      Open
     end;出现的错误是:
    Query1:Parameter 'a2' not found
    请教Query1的参数要怎么解决?
      

  5.   

    ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('select * from records  ');
      ADOQuery1.SQL.Add('where kehmc like ''%'+ trim(kehmc.Text) +'%''');
      ADOQuery1.SQL.Add('and leib like ''%'+ trim(leib.Text) +'%''');
      ADOQuery1.SQL.Add('and jinbr like ''%'+ trim(jinbr.Text) +'%''');
      ADOQuery1.SQL.Add('and shenf like ''%'+ trim(shenf.Text) +'%''');
      ADOQuery1.SQL.Add('and riq >'''+datetostr(DateStart.date)+'''and riq <'''+ datetostr(DateEnd.date)+'''' );
      ADOQuery1.SQL.Add('order by ±ào? desc' ) ;
      ADOQuery1.Open;====CSDN 小助手 V2.0 2005年10月16日发布====
    CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
    界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/10/16/504620.aspx
    下载:http://szlawbook.com/csdnv2/csdnv2.rar为神六喝彩,向所有科技工作者致敬!
    拒绝日货。
      

  6.   

    用个比较简单的办法
    AdoQuery1.SQL.Text:='Select * from Table Where 1=1'
    if Edit1.text<>'' then
     AdoQuery1.SQL.Add(' and 条件1='+#39+Edit1.text+#39);
    if Edit2.text<>'' then
     AdoQuery1.SQL.Add(' and 条件2='+#39+Edit2.text+#39);
    if Edit3.text<>'' then
     AdoQuery1.SQL.Add(' and 条件3='+#39+Edit3.text+#39);
    if Edit1.text<>'' then
     AdoQuery4.SQL.Add(' and 条件1='+#39+Edit4.text+#39);
    .
    .
    .
    if Edit11.text<>'' then
     AdoQuery1.SQL.Add(' and 条件11='+#39+Edit11.text+#39);
    AdoQuery1.Open;
    //如果条件是数字刚不加“#39”。“#39”表示“'“。
      

  7.   

    sqlstr:='select * from table1 where 1<2';
    if Edit1.Text<>'' then sqlstr:=sqlstr+' and field1='''+Edit1.Text+'''';
    if Edit2.Text<>'' then sqlstr:=sqlstr+' and field2='''+Edit2.Text+'''';
    if Edit3.Text<>'' then sqlstr:=sqlstr+' and field3='''+Edit3.Text+'''';
    if Edit4.Text<>'' then sqlstr:=sqlstr+' and field4='''+Edit4.Text+'''';
    if Edit5.Text<>'' then sqlstr:=sqlstr+' and field5='''+Edit5.Text+'''';
    ....
      

  8.   

    '''+Edit1.Text+'''
    能不能把这几个引号和加号说明一下。
    程序虽然运行成功,但我想了解一下。
      

  9.   

    “+”号是用来连接字符串的。把上一个SQL连起来。
      

  10.   

    巧妙!我做类似的语句时,还经常删除最后几个字符,也就是' and '
      

  11.   

    var sql,s,strlik,strlike1,strlike2:string;
    begin
    sql:='SELECT 客户编号, 客户名称, 编码, 品名, 单位, 厚, SUM(件数) AS 件数, SUM(数量) AS 数量,  '
         +' 单价, SUM(数量 * 单价) AS 金额 , COUNT(单号) AS 付单 ,是否打印'
          +' FROM CCMD  ' ;s:='';if CheckBox1.Checked then //这里是不是模糊查询
    begin
     strlik:=' like ' ;
     strlike1:='''%';
     strlike2:='%''';
     end else begin
      strlik:=' = ';
      strlike1:='''';
      strlike2:='''';
      end;if trim(Edit1.Text)<>'' then
      begin
      s:= ' where 单号 ' +strlik+ strlike1 +Edit1.Text+strlike2;
      end;
     if trim(ComboBox2.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  单据类型 ' +strlik+ strlike1 +ComboBox2.Text+strlike2;
      end; if trim(cxLookupComboBox1.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  客户编号 ' +strlik+ strlike1 +cxLookupComboBox1.Text+strlike2;
      end; if trim(ComboBox1.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  销售部门 ' +strlik+ strlike1 +ComboBox1.Text+strlike2;
      end;
     if trim(ComboBox3.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  付款方式 ' +strlik+ strlike1 +ComboBox3.Text+strlike2;
      end;
    //======================================
     if trim(ComboBox4.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  编码 ' +strlik+ strlike1 +ComboBox4.Text+strlike2;
      end; if trim(ComboBox5.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  品名 ' +strlik+ strlike1 +ComboBox5.Text+strlike2;
      end;    if trim(Edit5.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  厚 = '+Edit5.Text;
      end;
    //----------------------------------------------------  
     if trim(Edit3.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  长 = '+Edit3.Text+' or 装箱长 = '+Edit3.Text;
      end;  if trim(Edit4.Text)<>'' then
     begin
      if s<>'' then s:=S+' and ' else s:=' where ';
      s:= S+ '  宽 = '+Edit4.Text+' or 装箱宽 = '+Edit4.Text;
      end;
    //---------------------------------------if CheckBox3.State = cbChecked then
         begin
         if s<>'' then s:=S+' and ' else s:=' where ';
          S:=S+' 是否打印 = 1';
         end
         else
         if CheckBox3.State = cbUnchecked then
          begin
          if s<>'' then s:=S+' and ' else s:=' where ';
          S:=S+' 是否打印 = 0';
          end;//=============================================== 这里是打开 DM.CDanHao.open 这里的
    SQL:=SQL+S+' GROUP BY 客户编号, 编码, 品名, 单价, 客户名称, 厚, 单位 ,是否打印' );
    我是这样写的~~~~~