问题描述:
在我的数据库有两张表,一是产品表,其中 有ID,产品名称,规格,类别等字段,第二张表是“产品销售清单”,有字段ID,年,月,日,客户名称,业务员,客户名称,数量,单价,金额等字段。我现在想做一个查询,是按类别来查询,我不知道这个SQL该如何写了?是通过窗体来实现,并非在数据库中直接做视图。下面的代码是我的SQL前半部份,
      Sql = "SELECT ID,年,月,日,发货单号,业务员,客户名称,产品名称,规格,单位,数量,单价,金额" &" FROM sale" & _
   " WHERE (((CDate([月] & '-' & [日] & '-' & [年])) Between #" & CDate(TextBox1.Text) & "# And #" & CDate(TextBox2.Text) & "#))"&_问题就出在下面这句上,因为我是要求通过在窗体上输入产品类别在ComboBox1.Text 输入,所以接下来的这个SQL语句该如何写?
      If ComboBox1.Text <> "" Then Sql = Sql & "and (????(cpda.cpmc = sale.产品名称))cpda.cprb='%" & ComboBox1.Text & "%')"

解决方案 »

  1.   

    你上面的前部分写法不是很对,根本不需要那么多连接符。
    Sql = "SELECT ID,年,月,日,发货单号,业务员,客户名称,产品名称,规格,单位,数量,单价,金额" &" FROM sale" & _
       " WHERE (((CDate([月] & '-' & [日] & '-' & [年])) Between #" & CDate(TextBox1.Text) & "# And #" & CDate(TextBox2.Text) & "#))"&_改为:
    Sql = "SELECT ID,年,月,日,发货单号,业务员,客户名称,产品名称,规格,单位,数量,单价,金额 FROM sale " & _
       "WHERE cDate([月] & '-' & [日] & '-' & [年]) Between #" & CDate(TextBox1.Text) & "# And #" & CDate(TextBox2.Text) & "#)"&_....
      

  2.   

    你的后半部分,应该是用户输入验证...这个部分应该是放在程序部分完成,而不是放在SQL部分来完成的。
    你可以在查询的事件中这样写:
    1>验证输入,有误Exit Sub
    2>验证无误后才生产连接字符串1>:
      ComboBox1.Text=TRIM(ComboBox1.Text)
      If comboBox1.text="" then
          msgbox "请输入什么什么,不能为空!"
          exit sub
      End if
      ....如果还有其它的很多验证,同理.2>组合SQL:  
    Sql = "SELECT ID,年,月,日,发货单号,业务员,客户名称,产品名称,规格,单位,数量,单价,金额 FROM sale WHERE " & cDate([月] & '-' & [日] & '-' & [年]) Between #" & CDate(TextBox1.Text) & "# And #" & CDate(TextBox2.Text) & "# AND....后面的照写(...注:(????(cpda.cpmc = sale.产品名称))  看不太明白...如果是两个表这间的关联查询,两个表的名称,应该放到From后面   FROM 表1,表2...WHERE 表1.某列=表2.某列  这样来联接..
    你自已改改罢
      

  3.   

    非常感谢wwh999(印钞机V2.0...开发中....) 的回复,这句SQL是放在窗体中的SUB过程中的,是要单击命令按钮后,在验证后才能查询出结果,因此并非你所说的改改这么简单而已。是SQL这话该怎么说的事情!
      

  4.   

    这句SQL是放在窗体中的SUB过程中的,是要单击命令按钮后,在验证后才能查询出结果,因此并非你所说的改改这么简单而已。是SQL这话该怎么说的事情!
    ------------------------------------------------------------------------------
    你显然没有仔细看清楚我的回答,,,对于验证输入的情况,是由你在程序代码中去分辩的,而不是用SQL来分辩的。
      

  5.   

    Sql = "SELECT ID,年,月,日,发货单号,业务员,客户名称,产品名称,规格,单位,数量,单价,金额 FROM sale,cpda.cpmc WHERE sale.产品名称=cpda.cpmc AND " & cDate([月] & '-' & [日] & '-' & [年]) Between #" & CDate(TextBox1.Text) & "# And #" & CDate(TextBox2.Text) & "# AND cpda.cprb Like '%" & ComboBox1.Text & "%'"要下班了,这条SQL是个思路,你自己看看吧。
      

  6.   

    Sql = "SELECT ID,年,月,日,发货单号,业务员,客户名称,产品名称,规格,单位,数量,单价,金额" & _
       " FROM sale" & _
       " WHERE (((CDate([月] & '-' & [日] & '-' & [年])) Between #" & CDate(TextBox1.Text) & "# And #" & CDate(TextBox2.Text) & "#))"
        If TextBox4.Text <> "" Then Sql = Sql & "and 客户名称 like '%" & TextBox4.Text & "%'"
          If TextBox5.Text <> "" Then Sql = Sql & "and 产品名称&规格 like '%" & TextBox5.Text & "%'"
             If TextBox6.Text <> "" Then Sql = Sql & "and 业务员 like '%" & TextBox6.Text & "%'"
               If ComboBox1.Text <> "" Then Sql = Sql & "and( SELECT cpda.cprb FROM cpda LEFT OUTER JOIN sale ON (cpda.cpmc = sale.产品名称)) and cpda.cprb='%" & ComboBox1.Text & "%'"
                 If CheckBox1.Value = False Then Sql = Sql & "and 发货单号 not like '%★%'"
                   If CheckBox1.Value = True Then Sql = Sql & "and 发货单号 like '%★%'"
                     Sql = Sql & " ORDER BY 月,日,发货单号"这是全部的SQL语句,其中我问的就是在类别查询不为空的情况下要求查询的结果,我还是看不明白你的思路!能否直接帮我改出来!谢谢!
      

  7.   

    你的条件的多少,可用要用 sql=sql & ""  这种方式来添加。你上面的有什么问题吗?只最后说下:如果你的数据要用到两表关联的话。尽可能将两张表的写法SELECT ....FROM 表1 INNER JOIN 表2 ON 连接条件  这种方式,不要放到手面WHERE后面再用相关查询..你上面的情况,须要根据你的业务逻辑和表结构关系来确定。从你的代码中看,你的不同的字段涉及到不同的表条件。无从判断。
      

  8.   

    If ComboBox1.Text <> "" Then Sql = Sql & "and( SELECT cpda.cprb FROM cpda LEFT OUTER JOIN sale ON (cpda.cpmc = sale.产品名称)) and cpda.cprb='%" & ComboBox1.Text & "%'
    除了上述这一条,其他的均无问题。至于表也只有这一条是汲及两张表,其他的均是在SALE这一张表上工作!