ms-access - 选择复选框指示字段值的访问项
问题描述
在我的数据库中,我有一个包含几个是/否列的表。
现在,我有一个未绑定的表单,其中包含一些未绑定的复选框和一个绑定到一个特殊查询的列表框。
我想使用表单上的复选框来过滤列表框并显示列表中具有匹配值的项目。
例如,
- 如果我在表单上选中 box1,则应显示列表框中包含 field1 的 任何项目。
- 如果我在表单上选中 box2 和 box3,则任何包含 field2 AND field3 的项目都应显示在列表框中。如果一个项目没有 field3 和 field3,则它们的条目不应显示在列表中,因为未选中这些框。
窗体上的每个控件都使用单击事件过程来重新查询列表。
现在,这不适合我。我的列表框仅在所有值与复选框匹配时才显示项目。所以,如果我选中 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)
);
解决方案
不确定您是否想尝试在 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
推荐阅读
- reactjs - 使用 Reactjs 将表单数据存储到谷歌表格
- c# - 实体框架核心迁移不是从数据库中复制我的数据
- c# - 在具有多个未知十六进制值的字符串中查找模式并获取它们
- tensorflow - 更改自定义层 Keras 的训练和测试行为
- c# - 如何在 C# 中序列化 64 位枚举
- c++ - 为什么在自定义 STL、C++ VS2019 中创建 2 个变量会导致崩溃?
- android - 在 Kotlin 上将 JSON 字符串解析为 JsonObject/Map/MutableMap
- javascript - 如何将新日期列填充到现有 CSV 文件
- asp.net-core - Asp.net DirectoryBrowser Feature,如何控制排序?
- javascript - 正则表达式从 Js 转换为 C#