首页 > 解决方案 > 选择复选框指示字段值的访问项

问题描述

在我的数据库中,我有一个包含几个是/否列的表。

现在,我有一个未绑定的表单,其中包含一些未绑定的复选框和一个绑定到一个特殊查询的列表框。

我想使用表单上的复选框来过滤列表框并显示列表中具有匹配值的项目。

例如,

窗体上的每个控件都使用单击事件过程来重新查询列表。

现在,这不适合我。我的列表框仅在所有值与复选框匹配时才显示项目。所以,如果我选中 box1 和 box2,我只会从只有field1 和 field2的项目中获得结果。如果该项目有 field3,它不会显示 - 这是我的问题。

这是我的查询到目前为止的样子:

SELECT MyQuery.title, field1, MyQuery.field2, MyQuery.field3
FROM MyQuery
WHERE (
(
(MyQuery.field1) like [Forms]![Ability Finder]![box1]
)AND(
(MyQuery.field2) like [Forms]![Ability Finder]![box2]
)AND(
(MyQuery.field2) like [Forms]![Ability Finder]![box3]
)

);

也许我正在以错误的方式处理这一切。此外,我有大约 20 个复选框需要执行此操作。

SELECT MyQuery.cat, MyQuery.nickname, MyQuery.title, MyQuery.level, MyQuery.field1, MyQuery.field2, MyQuery.field3
FROM MyQuery
WHERE (
((MyQuery.field1)=[Forms]![Ability Finder]![box1] Or [Forms]![Ability Finder]![box1] Is Null) 
AND ((MyQuery.field2)=[Forms]![Ability Finder]![box2] Or [Forms]![Ability Finder]![box2] Is Null) 
AND ((MyQuery.field3)=[Forms]![Ability Finder]![box3] Or [Forms]![Ability Finder]![box3] Is Null)
);

标签: ms-access

解决方案


不确定您是否想尝试在 VBA 中编写事件处理,但它会使这项任务变得容易得多。您可以在每次单击复选框时动态构建 SQL 查询,如果您只需通过调整 For 循环将它们添加到行中,它就可以处理任何其他复选框。您为每个复选框的 Click 事件调用 Sql 构造函数,然后在构造函数中设置列表框的行源。

Private Sub Check1_Click()

ConstructSqlQuery

End Sub

Private Sub Check2_Click()

ConstructSqlQuery

End Sub

Private Sub Check3_Click()

ConstructSqlQuery

End Sub

...

Private Sub ConstructSqlQuery()

Dim sql As String
Dim numChecked As Integer
Dim checkboxName As String
Dim criteriaBoxName As String

numChecked = 0

'the 1=1 is a dummy value that always returns true. It makes it easier to append additional "and" clauses.
sql = "select field1, field2, field3, ... from MyQuery where 1=1"

For x = 1 To 15
    checkboxName = "Check" & x
    criteriaBoxName = "Text" & x
    If Me.Controls(checkboxName).Value = -1 Then
        sql = sql & " and field" & x & " like '*" & Me.Controls(criteriaBoxName).Value & "*'"
        numChecked = numChecked + 1
    End If
Next

If numChecked = 0 Then
    'if nothing is checked, don't show anything.
    Me.List0.RowSource = ""
Else
    Me.List0.RowSource = sql
End If

Me.List0.Requery

End Sub

推荐阅读