3

我有一个带有两个表的 Access 数据库:“联系人”和“国家”,每个表都包含许多字段。

我有一个查询“过滤器”,它将这两个表放在一起。

我想创建一个包含与查询中的字段一样多的列表框的表单。用户可以打开表单并从每个列表框中选择多个数据 - 行源与上面的两个表相关联。然后单击按钮,将显示查询,并根据列表框中的用户选择应用过滤器。如果未选择任何内容,则显示不带过滤器的查询。类似地,用户不需要从所有列表框中进行选择。

任何帮助将非常感激。我从其他网站上提取了一些代码,这些代码允许我为单个列表框应用过滤器。困难在于扩展多个列表框。这是一个荒谬的要求吗??

PS我可以发布我现有的代码,但是我相信这现在是一个“红鲱鱼”,最好从头开始。

4

1 回答 1

4

我的理解是您有一个带有未绑定多选列表框的表单,并且您想在数据表视图中打开一个查询并根据列表框选择进行查询。

这意味着您必须检查ItemsSelected每个列表框的集合并SQL相应地更新查询的属性。

在我的测试表单上,其中包括一个名为lstFname的多选列表框,在列表框中选择名称Jack、Dave 和 Tim,然后单击命令按钮 ( cmdOpenQuery ),创建此SELECT语句。

SELECT c.*
FROM Contacts AS c
WHERE c.fname IN ('Dave','Jack','Tim')

然后将该语句保存为SQL名为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
于 2013-10-24T16:34:56.903 回答