Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 基于表单上列表框中的多个选择将筛选器应用于access查询_Ms Access - Fatal编程技术网

Ms access 基于表单上列表框中的多个选择将筛选器应用于access查询

Ms access 基于表单上列表框中的多个选择将筛选器应用于access查询,ms-access,Ms Access,我试图让用户能够创建在多个地点工作的员工列表。我基本上希望通过表单对查询应用过滤器。如果用户需要在位置1和位置3工作的人员列表,他们将单击这两个框并输出分配给这些位置的人员列表。因此,过滤器将根据他们想要列出的位置的多少而改变 我有一个名为“QryRosterRaw”的查询,其中包含来自所有位置的数据。我想筛选一个名为“位置”的列。只是不确定如何应用表单中的过滤器 我已经看过了: 似乎无法让它在我的情况下发挥作用。可能是因为我不了解它是如何更新查询上的SQL的 好的,回到基本点。我现在只是想让

我试图让用户能够创建在多个地点工作的员工列表。我基本上希望通过表单对查询应用过滤器。如果用户需要在位置1和位置3工作的人员列表,他们将单击这两个框并输出分配给这些位置的人员列表。因此,过滤器将根据他们想要列出的位置的多少而改变

我有一个名为“QryRosterRaw”的查询,其中包含来自所有位置的数据。我想筛选一个名为“位置”的列。只是不确定如何应用表单中的过滤器

我已经看过了:

似乎无法让它在我的情况下发挥作用。可能是因为我不了解它是如何更新查询上的SQL的

好的,回到基本点。我现在只是想让上面提到的问题对我有用,然后让它为我的问题构造SQL,从而将它应用到我的情况中。然而,我甚至不能让它工作

我创建了一个表单并放入了一个名为“cmdOpenQuery”的按钮,我还创建了一个名为“lstFname”的列表框,其中包含一些随机名称以及一个名为“qrySearchForm”的查询。我将以下代码准确复制到我的表单代码中:

 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 )