Office中国论坛/Access中国论坛

标题: 列表框和文本框混合一起,如何实现查询? [打印本页]

作者: snryga    时间: 2019-5-11 20:44
标题: 列表框和文本框混合一起,如何实现查询?
本帖最后由 snryga 于 2019-5-11 20:45 编辑

如何将列表框和文本框(或组合框)混合在一起查询子窗体,请大侠帮忙改写一下查询语句?谢谢!!!

附件中前3个是列表框,最后一个是文本框。

作者: roych    时间: 2019-5-12 14:29
把里面的strWhere改成left(strWhere,len(strWhere)-1)再试试。
  1. Private Sub Command4_Click()
  2.     Dim strSQl As String
  3.     Dim strWhere As String
  4.     Dim ctl As Control
  5.     Dim varI As Variant
  6.     strSQl = "select * from 设备 where True "
  7.     If Me.设备名称.ItemsSelected.Count > 0 Then
  8.         Set ctl = Me.设备名称
  9.         strWhere = ""
  10.         For Each varI In ctl.ItemsSelected
  11.             strWhere = strWhere & "'" & ctl.Column(0, varI) & "',"
  12.         Next
  13.         strSQl = strSQl & " And 设备名称 in (" & Left(strWhere, Len(strWhere) - 1) & ")  "
  14.     End If
  15.         If Me.型号.ItemsSelected.Count > 0 Then
  16.         Set ctl = Me.型号
  17.         strWhere = ""
  18.         For Each varI In ctl.ItemsSelected
  19.             strWhere = strWhere & "'" & ctl.Column(0, varI) & "',"
  20.         Next
  21.         strSQl = strSQl & " And 型号 in (" & Left(strWhere, Len(strWhere) - 1) & ")  "
  22.     End If
  23.     If Me.生产厂家.ItemsSelected.Count > 0 Then
  24.         Set ctl = Me.生产厂家
  25.         strWhere = ""
  26.         For Each varI In ctl.ItemsSelected
  27.             strWhere = strWhere & "'" & ctl.Column(0, varI) & "',"
  28.         Next
  29.         strSQl = strSQl & " And 生产厂家 in (" & Left(strWhere, Len(strWhere) - 1) & ")  "
  30.     End If
  31.    
  32.     Debug.Print strSQl
  33.     Me.Child5.Form.RecordSource = strSQl

  34. End Sub
复制代码

[attach]63358[/attach]


作者: snryga    时间: 2019-5-12 15:21
没有对呢,设备名称、型号、生产厂家是列表框,我需要的是再增加文本框“使用单位”的查询
作者: roych    时间: 2019-5-12 23:40
同样道理的。先判断文本框是否为空,如果不为空,再把strSQL与文本框拼接一下,如果为空,则直接使用前面的strSQL。
大体这样:
strSQL=strSQL & IIF(IsNull(txt文本),"",txt文本)
当然,你也可以写成if,例如:
if IsNull(txt文本)=False then
    strSQL=strSQL & txt文本
end if

作者: snryga    时间: 2019-5-13 09:07
If Me.使用单位.ItemsSelected.Count > 0 Then
        Set ctl = Me.使用单位
        strWhere = ""
        For Each varI In ctl.ItemsSelected
            strWhere = strWhere & "'" & ctl.Column(0, varI) & "',"
        Next
        strSQl = strSQl & IIf(IsNull(Me.使用单位), "", Me.使用单位)
    End If

提示出错,“ItemsSelected”
作者: roych    时间: 2019-5-13 15:14
snryga 发表于 2019-5-13 09:07
If Me.使用单位.ItemsSelected.Count > 0 Then
        Set ctl = Me.使用单位
        strWhere = ""

你放if里面是几个意思?不是应该另起一行直接判断文本框的吗?[attach]63361[/attach]看来你并没有理解这段代码啊(不会是抄别人的吧?)。
[attach]63360[/attach]



作者: snryga    时间: 2019-5-13 21:37
这个还真是抄的
作者: snryga    时间: 2019-5-13 23:33
本帖最后由 snryga 于 2019-5-13 23:40 编辑

再问一个问题,如果是在查询中参数查询条件。在窗体代码中就只需一句进行更新语句,查询中条件如下:
Like IIf(IsNull([Forms]![统计]![型号]),'*','*' & [Forms]![统计]![型号] & '*')

如果是这样,那么在窗体中又要使用“列表框”,该如何写代码呢?
作者: roych    时间: 2019-5-14 14:55
snryga 发表于 2019-5-13 23:33
再问一个问题,如果是在查询中参数查询条件。在窗体代码中就只需一句进行更新语句,查询中条件如下:
Like ...

建议统一吧。
要么用查询,要么有筛选(这个例子用的是筛选),而不要混着用。虽然从程序的角度来看,这并不存在做不到的情况,但从业务逻辑理解上来看,很容易引起混乱。
作者: snryga    时间: 2019-5-14 15:10
谢谢!!!
作者: snryga    时间: 2019-5-14 17:19
又出新问题,不在查询中设置参数查询后,导出的数据不是查询的结果,是整表内容。

这个需要怎么整呢?
作者: roych    时间: 2019-5-15 08:55
那个不是查询,是筛选,OK?导出的话,当然得导出筛选后的数据,你在论坛搜索下“刘小军常用窗体查询”看看,印象中应该是第二个文件,看看别人是怎么处理的。
作者: snryga    时间: 2019-5-15 21:24
刘小军的查询导出代码如下:
Private Sub 导出_Click()
On Error GoTo Err_导出_Click

    Dim qdf As DAO.QueryDef 'qdf
    Dim strWhere, strSQL As String
   
    strWhere = Me.子窗体.Form.Filter
    If strWhere = "" Then
        '没有条件
        strSQL = "SELECT * FROM [查询1]"
    Else
        '有条件
        strSQL = "SELECT * FROM [查询1] WHERE " & strWhere
    End If
   
    Set qdf = CurrentDb.QueryDefs("查询结果")
    qdf.Sql = strSQL
    qdf.Close
   
    Set qdf = Nothing
   
    DoCmd.OutputTo acOutputQuery, "查询结果", acFormatXLS, , True

   
Exit_导出_Click:
    Exit Sub

Err_导出_Click:
    MsgBox Err.Description
    Resume Exit_导出_Click
End Sub

以上运用到有列表框的窗体查询中无法实现筛选后的数据导出,导出是全部数据。

但在没有列表框的窗体查询中,则能正确导出筛选后的数据。

这是怎么回事呢?
作者: roych    时间: 2019-5-18 17:51
snryga 发表于 2019-5-15 21:24
刘小军的查询导出代码如下:
Private Sub 导出_Click()
On Error GoTo Err_导出_Click

你要把修改后的筛选条件加到预设的查询里才能完成的。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3