【问题标题】:Select Access Items where Checkboxes indicate Field Values选择复选框指示字段值的访问项
【发布时间】:2018-06-19 00:18:44
【问题描述】:

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

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

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

例如,

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

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

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

【问题讨论】:

  • 据我了解 Where 子句应该是动态的,例如,如果 [Forms]![Ability Finder]![box1] 有一个值(已选择),那么应该包括以下行:MyQuery.field1) 喜欢[Forms]![Ability Finder]![box1] 否则此行应省略。
  • 您需要添加类似[Forms]![Ability Finder]![box3] OR [Forms]![Ability Finder]![box3]is Null 的内容才能忽略未使用的查询条件。
  • 但是只有当我从未点击过复选框时,复选框才会为空?如果我打开和关闭一个,那么它的空状态就会丢失。但是添加 is null 部分并没有任何帮助。
  • @BData 您说得对,该子句应该是动态的,这就是为什么我需要查阅 box1 的值等。但是您说如果不选中该框,我应该忽略该框。好吧,它已经这样做了。如果我取消选中某个框,则不会对其进行过滤。我的问题是另一个方向。

标签: ms-access


【解决方案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

【讨论】:

  • 我不介意在 VBA 中这样做!我想知道我是否最终会这样做。谢谢你的例子 - 我会试试看。
  • 这个想法奏效了!不过,我在这里使用了一个控制循环:stackoverflow.com/questions/3344649/…,所以我也可以循环遍历文本框。但是使用 sql 查询加载行源的想法就是这样做的。
  • @bgmCoder,非常酷!很高兴它奏效了。另一个循环看起来更优雅,因为它处理表单上的所有控件类型;这是一个方便的链接。
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多