在我的数据库中,我有一个包含几个是/否列的表。
现在,我有一个未绑定的表单,其中包含一些未绑定的复选框和一个仅为其绑定到特殊查询的列表框。
我想使用表单上的复选框来过滤列表框,并在列表中显示具有匹配值的项目。
例如,
表单上的每个控件都使用一个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)
);
答案 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