【问题标题】:Have checkbox displayed as checked based on query根据查询将复选框显示为选中状态
【发布时间】:2017-08-21 23:23:04
【问题描述】:

在 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 编程方面的教育存在很大的漏洞。感谢您抽出宝贵时间提供帮助。

【问题讨论】:

  • 你熟悉绑定控件吗?您可以将复选框控件绑定到布尔字段(a.k.a. Yes/No 或 True/False 字段)。如果这不是您的意思,您需要提供更多细节,因为您所描述的对我来说听起来有点奇怪。如果一条记录不在查询结果中,则它根本不会显示在表单或报告中。这意味着您描述的此类复选框将始终被选中,因为只会显示查询中的记录。相反,您是指与主表单/报告的查询不同的另一个查询吗?
  • 是的,我专门为复选框创建了一个单独的查询。
  • 这可能是 stackoverflow.com/questions/1311885/… 的副本。关键思想是将复选框控件绑定到以某种方式执行查询的表达式。但是,如果您发布主要记录源查询(表单/报告)和您想要作为复选框源的补充查询,也许有更具体、更有效的解决方案。 (除非您只想要模糊、近似甚至没有答案,否则即使您在询问时认为细节并不重要,我也会始终发布示例代码或 SQL。)
  • 我将代码添加到原始问题以及更多细节。希望这会有所帮助。
  • 针对在 Google 中解锁答案,我建议始终先查看文档。在这种情况下,首先搜索access checkbox control source,您将获得this page。我承认,您不能绑定到单独的 SQL 语句并不清楚。相反,绑定到“表、查询或 SQL 语句”意味着 表单/报告的记录源。您只能将控制源设置为单个字段或 VBA 表达式(请参阅上一条评论中的链接)。

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


【解决方案1】:

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

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

感谢 CPerkins 的所有帮助。 :)

【讨论】:

  • 太棒了!听起来您在我完成发布之前就已经了解了我的长答案的要点。当然,我不知道您的表结构或主查询的详细信息,因此可能会回答比需要的复杂得多。很好,您可以在主查询中包含您的简单字段。
【解决方案2】:

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

直接为每条记录执行查询

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

由于您已经保存了查询,并且您只需要测试返回记录是否存在,那么您可以使用域聚合函数。将 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

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2018-12-25
    • 2020-02-29
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多