我有一个包含两个表的Access数据库:“contacts”和“country” 它们包含许多字段。
我有一个查询“过滤器”,它将这两个表组合在一起。
我想创建一个包含与查询中的字段一样多的列表框的表单。用户可以打开表单并从每个列表框中选择多个数据 - 行源与上面的两个表绑定。然后,在单击按钮时,将显示查询,并将根据列表框中的用户选择应用过滤器。如果未选择任何内容,则显示的查询不带过滤器。同样,用户无需从所有列表框中进行选择。
非常感谢任何帮助。我已经从其他网站上提取了一些代码,这些代码允许我为单个列表框应用过滤器。难以扩展多个列表框。这是一个荒谬的要求吗?
PS我可以发布我现有的代码,但我相信这是一个'红鲱鱼',最好是重新开始。
答案 0 :(得分:3)
我的理解是你有一个带有未绑定的多选列表框的表单,你想在数据表视图中打开一个查询,并根据列表框选择进行查询。
这意味着您必须检查每个列表框的ItemsSelected
集合,并相应地更新查询的SQL
属性。
在我的测试表单上,其中包含一个名为 lstFname 的多选列表框,在列表框中选择名称 Jack,Dave和Tim ,然后单击命令按钮( cmdOpenQuery ),创建此SELECT
语句。
SELECT c.*
FROM Contacts AS c
WHERE c.fname IN ('Dave','Jack','Tim')
然后该语句将保存为名为 qrySearchForm 的查询的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