选中“复选框”表示“字段值”的“访问项”

时间:2018-06-19 00:18:44

标签: ms-access

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

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

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

例如,

  • 如果我选中表单上的box1,则应显示列表框中包含field1的任何项。
  • 如果我选中表单上的box2和box3,包含field2 AND field3的任何项应显示在列表框中。如果某个项目没有field3 AND field3,则它们的条目不应显示在列表中,因为不会选中这些框。

表单上的每个控件都使用一个on-click事件过程来使列表重新查询。

现在,这对我来说不合适。我的列表框仅在所有值与复选框匹配时显示项目。因此,如果我选中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)
);

1 个答案:

答案 0 :(得分:1)

不确定是否要在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