根据查询显示已选中的复选框

时间:2017-08-18 15:28:41

标签: ms-access checkbox ms-access-2013

在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编程教育中存在很大漏洞。感谢您抽出宝贵时间来帮助解决这个问题。

2 个答案:

答案 0 :(得分:0)

好吧,我刚刚发现我站在独木舟上,努力做到这一点。

在考虑了CPerkins发布的内容之后,我回到了表单查询并添加了我想要用于复选框的表格。然后我使用了我在OBO_WELL字段的注释中发布的IIf语句。然后我将复选框绑定到OBO_WELL字段,它就可以了。

感谢CPerkins,感谢您的帮助。 :)

答案 1 :(得分:0)

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

直接为每条记录执行查询

由于Checkbox与任何其他控件一样,因此已在SQL as Control Source for Access Form field中概述了已接触的基本内容。然而,这个问题和答案集中在一种仅仅获得价值观的狭隘方法上。

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

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

这假定主表单/报表有一个名为[UWI]的键字段,它将被传递给聚合函数。

如果您需要执行未保存的查询,您可以创建自己的VBA函数,然后以类似的方式调用它。只需确保传入键值需要选择正确的值。将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参数。

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

将二级查询作为表单/报告记录源的一部分包含在内

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

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

将主查询加入辅助查询。将表单/报告记录源设置为组合的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