Ms access 基于表单上列表框中的多个选择将筛选器应用于access查询
我试图让用户能够创建在多个地点工作的员工列表。我基本上希望通过表单对查询应用过滤器。如果用户需要在位置1和位置3工作的人员列表,他们将单击这两个框并输出分配给这些位置的人员列表。因此,过滤器将根据他们想要列出的位置的多少而改变 我有一个名为“QryRosterRaw”的查询,其中包含来自所有位置的数据。我想筛选一个名为“位置”的列。只是不确定如何应用表单中的过滤器 我已经看过了: 似乎无法让它在我的情况下发挥作用。可能是因为我不了解它是如何更新查询上的SQL的 好的,回到基本点。我现在只是想让上面提到的问题对我有用,然后让它为我的问题构造SQL,从而将它应用到我的情况中。然而,我甚至不能让它工作 我创建了一个表单并放入了一个名为“cmdOpenQuery”的按钮,我还创建了一个名为“lstFname”的列表框,其中包含一些随机名称以及一个名为“qrySearchForm”的查询。我将以下代码准确复制到我的表单代码中:Ms access 基于表单上列表框中的多个选择将筛选器应用于access查询,ms-access,Ms Access,我试图让用户能够创建在多个地点工作的员工列表。我基本上希望通过表单对查询应用过滤器。如果用户需要在位置1和位置3工作的人员列表,他们将单击这两个框并输出分配给这些位置的人员列表。因此,过滤器将根据他们想要列出的位置的多少而改变 我有一个名为“QryRosterRaw”的查询,其中包含来自所有位置的数据。我想筛选一个名为“位置”的列。只是不确定如何应用表单中的过滤器 我已经看过了: 似乎无法让它在我的情况下发挥作用。可能是因为我不了解它是如何更新查询上的SQL的 好的,回到基本点。我现在只是想让
Option Compare Database
Option Explicit ' <- include this in ALL modules!
Private Sub cmdOpenQuery_Click()
Const cstrQuery As String = "qrySearchForm"
Dim strNames As String
Dim strSelect As String
Dim varItm As Variant
strSelect = "SELECT c.*" & vbCrLf & "FROM Contacts AS c"
For Each varItm In Me.lstFname.ItemsSelected
strNames = strNames & ",'" & _
Me.lstFname.ItemData(varItm) & "'"
Next varItm
If Len(strNames) > 0 Then
strNames = Mid(strNames, 2) ' discard leading comma
strSelect = strSelect & vbCrLf & _
"WHERE c.fname IN (" & strNames & ")"
End If
Debug.Print strSelect
CurrentDb.QueryDefs(cstrQuery).Sql = strSelect
DoCmd.OpenQuery cstrQuery
End Sub
选项比较数据库
选项显式“0”,然后
strNames=Mid(strNames,2)“放弃前导逗号
strSelect=strSelect&vbCrLf&_
其中c.fname在(“&strNames&”)中
如果结束
调试。打印strSelect
CurrentDb.querydfs(cstrQuery).Sql=strSelect
DoCmd.OpenQuery cstrQuery
端接头
当我尝试运行代码时,查询没有发生任何变化。SQL语句未更新,查询也未打开。我做错了什么?我想,如果我能想出如何实现这一点,我可以根据自己的情况构建自己的自定义语句,但我甚至无法实现这一点。设置表单的筛选器可能很简单: 已选择Me.lstFname.items中每个varItm的
strNames=strNames&“,”&”_
Me.lstFname.ItemData(varItm)和“”
下一个varItm
如果Len(strNames)>0,则
strNames=Mid(strNames,2)“放弃前导逗号
Me.Filter=“fName In(“&strNames&”)
Me.FilterOn=正确
其他的
Me.FilterOn=False
如果结束
我不确定,但是如果我从您的描述中理解了,但是您有一个表单,并且希望通过列表框对其进行过滤。。。
如果是这种情况,那么就这样做
Debug.Print strSelect ' Just Modifying your code from this point
Me.RecordSource = strSelect
Me.Requery
End Sub
而myselection
是例如“1或3或5”,这将不起作用。Access将比较整个字符串
SELECT * FROM foo WHERE bar IN ( Forms!myForm!mySelections )
使用myselection
=“1,3,5”也不起作用
因此,我认为您的第一种方法(从头开始构建整个SELECT SQL)是一条可行之路。很好。我调整了我的答案以反映这一点。我在上面做了一个重大的改变。我试图从另一个角度来处理这个问题,因为我并不真正理解我在原始方法中试图做什么。因此,我是在Access中创建查询,还是VBA为我创建查询。以前,当我处理它时,它没有打开查询,SQL也没有更改。好的,我明白你的意思了。然而,当我尝试使用上面的例子时,它没有起作用。我认为,如果我能让这个例子发挥作用,我应该能够找出如何重新编写代码以满足我的需要。然而,我甚至不能让这个例子起作用。现在有什么建议吗?上面的问题已经从原来的问题中进行了重大修改。我无法使用原来的方法,这似乎是一个更简单的选择(对我来说)。请参阅编辑我的答案。我没有看到任何明显的错误。请使用以下链接:1。-查看单击按钮时发生的具体情况。-2. - 查看
strSelect
的构造是否正确(部分内容已经准备就绪)。
SELECT * FROM foo WHERE bar = Forms!myForm!mySelections
SELECT * FROM foo WHERE bar IN ( Forms!myForm!mySelections )