【问题标题】:Add "All" option to ComboBox used to filter for report in MS Access将“全部”选项添加到用于在 MS Access 中过滤报告的组合框
【发布时间】:2011-05-05 16:37:39
【问题描述】:

我正在尝试关注Microsoft's example,了解如何在 Microsoft Access 中向 ComboBox 添加“全部”选项,但除了指定代码之外,他们的文章在提供指导方面做得不够。

我要做的是构建一个表单,允许用户从 ComboBox 中选择一个选项(这些选项是从表中的记录生成的),然后构建一个根据用户选择的选项过滤的报告。 ComboBox 由 2 列组成:记录的主键/ID 及其可显示的名称。

我无法理解 Microsoft 提供的足以弄清楚发生了什么的 VBA 代码,但我希望我的 ComboBox 中的“全部”选项有一个空白主键/ID,或者一个 = 0。情况并非如此,因为在使用表单时选择“全部”选项会导致错误消息“您输入的值对此字段无效”。这使我相信“​​全部”文本正在填充到主键/ID 列而不是显示列中。该示例指示我将显示列号分配为组合框的“标记”属性 - 在这种情况下,我的显示列号是 2。但是,这(以及我添加的几乎所有其他值)会导致上述错误信息。

知道微软的例子是否适用于我的案例,还是我需要以某种方式调整他们的代码?

【问题讨论】:

    标签: ms-access forms combobox ms-access-2003


    【解决方案1】:

    检查组合框的控制源属性。听起来它可能绑定到表单记录源中的一个字段。如果您将其设为 unbound 控件(在 Control Source 属性中没有任何内容),您应该能够从组合的 Row Source 中选择任何项目,而 Access 不会向您抱怨。

    假设你的组合的行源是这样的查询:

    SELECT id, disp_name
    FROM YourTable
    ORDER BY disp_name;
    

    您可以使用 UNION 查询添加“全部”行:

    SELECT id, disp_name
    FROM YourTable
    UNION ALL
    SELECT TOP 1 0, "**ALL**"
    FROM AnyTable
    ORDER BY disp_name;
    

    AnyTable 可以就是这样。如果您碰巧有一个只包含一行的表,请使用该表...您甚至不需要 TOP 1 部分。只是尽量不要将一些真正的大表用作 AnyTable。

    编辑:实际上,如果 RealBigTable 有一个主键或其他唯一字段,您可以在 WHERE 子句中使用这些字段来检索单行:

    SELECT id, disp_name
    FROM YourTable
    UNION ALL
    SELECT 0, "**ALL**"
    FROM ReallyBigTable
    WHERE pk_field = 1
    ORDER BY disp_name;
    

    UNION ALL 将返回所有合并的行。如果您有任何重复的行,您可以通过仅使用 UNION 而不是 UNION ALL 来精简它们。

    【讨论】:

    • 看起来可行!我唯一想知道的是如何才能将“全部”放在首位。如果按字母排序,字母表中“All”之前的任何内容都会首先出现。
    • 我用 * 认为它会排在任何字母之前。它与我的语言环境有关。替换一个不同的字符,该字符将在您现有的任何条目之前排序。
    • 如果您实际上没有在 TOP N 查询中使用索引字段,我不确定为什么索引会有所作为。一些SHOWPLANning可以让你确定答案。
    • 好的,你是对的。您没有建议 TOP N(我总是这样做),但是使用 UNION 而不是 UNION ALL,将消除欺骗,就像 TOP N 一样,在 SELECT 中没有被重复数据删除的索引字段,不会有任何索引可用于优化流程。所以,在我看来,选择一张小桌子确实很重要。但正如我所说,您必须查看 SHOWPLAN 才能找到答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多