根据查询将复选框显示为已选中

Have checkbox displayed as checked based on query

在 Access 2013 中,是否可以根据查询将复选框显示为已选中?我到处搜索但没有找到答案。如果记录在查询结果中,我需要让复选框显示为已选中,否则它会保持未选中状态。

我知道这个问题可能有一个简单的答案,但我就是找不到正确的单词组合来解锁 Google 的答案。 :)

谢谢!

编辑以添加 SQL 查询我想将复选框绑定到:

SELECT DBA_WellZoneIntrvlValue.UWI, DBA_WellZoneIntrvlValue.ZONE_NAME, DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME, Format([ZATTRIBUTE_VALUE_STRING],"True/False") AS ZATTRIBUTE_VALUE
FROM DBA_WellZoneIntrvlValue INNER JOIN WELL_MASTER ON DBA_WellZoneIntrvlValue.UWI = WELL_MASTER.UWI
WHERE (((DBA_WellZoneIntrvlValue.ZONE_NAME)="NFX_HEADER") AND ((DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME)="NFX_OBO_WELL"));

CPerkins,我希望这就是您所要求的。这是我无法想出的复选框的表达式代码。我希望我所要做的就是将查询的名称和列添加到复选框中,但这并不是那么简单。这是我的:

[qry_OBO_WELLS]![ZATTRIBUTE_VALUE]

如果这看起来像一个愚蠢的问题,我深表歉意,但我是自学成才的,所以我在 Access 编程方面的教育存在很大漏洞。感谢您抽出宝贵时间来帮助解决这个问题。

好吧,我刚刚发现我正站在独木舟上,试图以艰难的方式做到这一点。

考虑 CPerkins 发布的内容后,我返回到我的表单查询并添加了我想用于复选框的 table。然后,我使用了我在 OBO_WELL 字段的评论中发布的 IIf 语句。然后我将复选框绑定到 OBO_WELL 字段,它起作用了。

谢谢 CPerkins 的帮助。 :)

有不止一种方法可以将控件(在本例中为复选框)绑定到 SQL 表达式。出于此处的目的,我将其称为次要查询以将其与绑定到 form/report 的主要查询区分开来。取决于以下条件:1) 绑定到 form/report 的主记录集的大小,2) 主查询是否必须保持可更新,以及 3) 辅助 SQL 查询的效率,例如是否基于索引值等。这里我概述两种方法。

直接对每条记录执行查询

基本方法已在 SQL as Control Source for Access Form field 中概述,因为复选框与任何其他控件一样。但是,该问题和答案集中在仅获取值的狭隘方法上。

既然你已经有一个保存的查询并且你只需要测试返回的记录是否存在,那么你可以使用域聚合函数。将 Checkbox.ControlSource 属性 设置为

=DCount("UWI","qry_OBO_WELLS","UWI = " & [UWI])

这假设主要 form/report 有一个名为 [UWI] 的关键字段,它将被传递给聚合函数。

如果您需要执行未保存的查询,您可以创建自己的 VBA 函数,然后以类似的方式调用它。只需确保传递的键值需要 select 正确的值。将 Checkbox.ControlSource 属性 设置为

=GetCheckBoxValue([UWI])

指的是您的客户 VBA 功能

Public Sub GetCheckBoxValue(vUWI as Variant) As Boolean
    GetCheckBoxValue = False 'Set default return value

    If IsNull(vUWI) Then
        Exit Function
    End If

    Dim rs As RecordSet2
    '* Only TOP 1 is required to test for existence of records
    Set rs = CurrentDB.Openrecordset( _
       "SELECT TOP 1 [qry_OBO_WELLS].UWI FROM [qry_OBO_WELLS]" & _
       " WHERE [qry_OBO_WELLS].UWI = " & vUWI
    If Not rs.EOF Then
      GetCheckBoxValue = True
    End If
    rs.Close
End Sub

这里我假设 UWI 是数字。如果它是一个字符串值,您需要适当注意将其正确注入 SQL 查询,但使用引号和可能的 SQL 参数。

这种方法的缺点是它必须为每个主记录重复打开和关闭新的记录集对象(和数据库连接)。如果处理许多记录,这可能会很慢。可以通过一些聪明的代码来减少一次打开和关闭连接和记录,但这超出了这个答案的范围。

将辅助查询作为 form/report 记录源的一部分包含在内

以下任一替代查询应该比在控件级别绑定到单独的查询更有效。但是这两种方法都可以使查询不可更新,这可以有效地使可编辑表单无效。不可能在这里预测或讨论使查询可更新或不可更新的所有条件,因此您只需要测试每个条件。

对于任一查询,CheckBox 都可以像其他任何查询一样绑定到查询列,例如 CheckBox.Control Source = [CheckBoxValue]

将主要查询加入次要查询。将 form/report 记录源设置为合并的 SQL 语句。

SELECT Primary.UWI, Primary.OtherData, (Secondary.records) > 0 AS CheckBoxValue
FROM Primary INNER JOIN 
   (SELECT Count(DBA_WellZoneIntrvlValue.UWI) As records
    FROM DBA_WellZoneIntrvlValue INNER JOIN WELL_MASTER ON DBA_WellZoneIntrvlValue.UWI = WELL_MASTER.UWI
    WHERE (((DBA_WellZoneIntrvlValue.ZONE_NAME)="NFX_HEADER") AND ((DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME)="NFX_OBO_WELL")))
   AS Secondary
   ON Primary.UWI = Secondary.UWI

或者您可以将参数化查询作为单独的列包含在内。这更有可能保留其他主查询列的可更新性,但可能不如上面的 SQL 连接语句高效:

SELECT Primary.UWI, Primary.OtherData, 
    ((SELECT Count(DBA_WellZoneIntrvlValue.UWI) As records
        FROM DBA_WellZoneIntrvlValue INNER JOIN WELL_MASTER ON DBA_WellZoneIntrvlValue.UWI = WELL_MASTER.UWI
        WHERE ((DBA_WellZoneIntrvlValue.ZONE_NAME="NFX_HEADER") AND (DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME="NFX_OBO_WELL")
          AND WellZoneIntrvlValue.UWI = Primary.UWI ))
   >) 0 As CheckBoxValue
FROM Primary