【问题标题】:Access Query Form with multiple Checkboxes使用多个复选框访问查询表单
【发布时间】:2015-03-24 08:28:31
【问题描述】:

我有一个新手问题,希望能得到每一个帮助。 我有一个运行查询的表单。查询基于一个表。 在这个表中有几个项目。(项目1,项目2,项目3....等)

表单中有几个复选框,用户可以在其中选择他想要检查的项目。如果我检查 2 个项目,问题在于我的代码,他只显示在表中选择了两个项目的记录。但我希望它显示显示其中任何一个的所有记录。 前任。如果我选中 Project1 的框和 Project2 的复选框,它应该显示选中 Project 1 的记录以及选中 Project 2 的记录。

SELECT Vergabeumfang.S63T4, *
FROM Vergabeumfang
WHERE (    
        ((Vergabeumfang.VSS_LAW) Like "*" & [Forms]![Vergabeumfang]![VSS_LAW_Box] & "*" 
            Or (Vergabeumfang.VSS_LAW) Is Null
        )     
        And ((IIf([Forms]![Vergabeumfang]![S63T4_box]=-1,([Vergabeumfang].[S63T4])=True,([Vergabeumfang].[S63T4])=False 
                or ((Vergabeumfang.[S63T4])=True )))
        )                    
        And ((IIf([Forms]![Vergabeumfang]![S63T2_box]=-1,([Vergabeumfang].[S63T2])=True,([Vergabeumfang].[S63T2])=False 
            or ((Vergabeumfang.[S63T2])=True )))
        )
        AND ((Vergabeumfang.V_Commodity_Name) Like "*" & [Forms]![Vergabeumfang]![Commodity_Name_Box] & "*" 
            Or (Vergabeumfang.V_Commodity_Name) Is Null
        ) 

【问题讨论】:

    标签: ms-access checkbox ms-access-2007


    【解决方案1】:

    假设我的理解是正确的,以下查询应该适合您,但我会在最后提到一些注意事项。此外,由于 * 将检索它,因此无需在开头专门选择字段 S63T4:

    SELECT *
    FROM Vergabeumfang
    WHERE 
    (
        Vergabeumfang.VSS_LAW Like "*" & [Forms]![Vergabeumfang]![VSS_LAW_Box] & "*" Or Vergabeumfang.VSS_LAW Is Null
    )
    AND 
    (
        Vergabeumfang.V_Commodity_Name Like "*" & [Forms]![Vergabeumfang]![Commodity_Name_Box] & "*" Or Vergabeumfang.V_Commodity_Name Is Null
    )
    AND 
    (
        (
            Vergabeumfang.S63T2 = iif([Forms]![Vergabeumfang]![S63T2_box]=-1, True, -999)
        )
        OR
        (
            Vergabeumfang.S63T4 = iif([Forms]![Vergabeumfang]![S63T4_box]=-1, True, -999)
        )
    )
    

    在您粘贴查询后,Access 将重新格式化查询,但这些缩进使逻辑更加清晰。 -999 是一个虚拟值,在是/否字段上永远不会为真,以确保在未选中标准复选框时它始终返回假。 我根据给定的信息重建了你的桌子,这看起来对吗?为了实验,在文本字段中添加了无意义的数据:

    当表单第一次打开时,它不会显示任何数据,如下所示:

    当您勾选 S63T4 并点击 Requery 时(您需要一些方法来告诉 Access 重新查询,因为它不会自动执行 - 按钮是最简单的方法,Me.Requery 用于按钮的点击事件,但您也可以将其添加到条件复选框/文本框的 AfterUpdate 事件中),它看起来像这样:

    您似乎想进一步过滤部分文本条目,因此这张图片显示了在该字段中输入字母“t”以及空值时的进一步过滤:

    这是第二个复选框的图片过滤:

    现在,当您同时选中这两个复选框时,我不确定您是否要显示的项目是

    a) 任一 S63T2 S63T4

    b) S63T2 S63T4

    在我看来,您希望能够展示这两种类型的项目,这就是这张图片所展示的:

    现在,有几个提示:

    1. 在代码中构造 SQL 语句然后将其应用到表单的 Recordsource 属性更容易,尤其是当您开始添加更多条件选项时。尝试使用有限的 IIF 语句来控制所有这一切将在某一点之后变得完全无法管理,因为您开始不得不嵌套它们。
    2. 如果一个项目可以有多种类型(我假设“S63T4”和“S63T4”是项目类型),并且将来可能会获得更多,那么有一天一个项目可能有10种类型,那就很多了更灵活地创建链接在 ID 键上的项目类型的新表,如下所示:

    标准表单现在看起来像这样:

    现在,当您添加新的项目类型时,您的表单不需要进行编辑;它会自动出现在列表框中。

    无论如何,祝项目顺利!

    【讨论】:

    • 非常感谢詹姆斯,我会试试 2moro 并写回它的进展情况。
    • 您不会碰巧有这个示例数据库可供下载吗?
    • 我也在做同样的事情,但我需要b) only S63T2 and S63T4。如何调整 SQL 语句?除了我的问题,我有 15 个复选框可供使用。
    • @bgmCoder,我没有样本数据库,但我想我可以根据重新阅读我的答案来重建它。待会儿回复……
    • @JamesToomey 实际上,我在这里提出了自己的问题:stackoverflow.com/questions/50919043/… 我认为我想要的和 OP 正在做的事情之间存在一两个差异。如果您能看一下,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多