【问题标题】:Access 2007: Filtering a report's results using a drop-down boxAccess 2007:使用下拉框过滤报表结果
【发布时间】:2012-03-22 18:36:24
【问题描述】:

我的问题是双重的。

  • 我的数据库中有大约 20 个分类表。餐桌布局多样;一个共同点是它们都有一个“县”字段。

我需要设置一系列报告,允许用户从下拉框中选择一个县,触发报告运行并仅返回附加到该特定县的记录。

这在数据表级别使用按表单过滤是可行的,但这很笨拙,而且我有几个表/查询需要这个相同的县过滤器。

我可能已经完成了以下几点:


创建一个未绑定的表单。 添加一个组合框。 将组合框的行来源设置为包括县字段。 将其 Bound 列设置为 1。 将其 Column Count 属性设置为 2。 将列宽属性设置为 0";1" 将组合框命名为“ChooseCounty”。

在表单中添加一个命令按钮。 按钮的点击事件代码如下:

(注意:要编写代码,请在表单设计视图中选择命令按钮。显示按钮的属性表。 单击事件选项卡。 在 On Click 行上,写:

【事件流程】

单击该行上显示的带有 3 个点的小按钮。 当代码窗口打开时,光标将在两行已经存在的代码之间闪烁。 在这两行之间,编写以下代码。)

Me.Visible = 假

关闭代码窗口。

将此表单命名为“ChooseCounty”。

在作为报表记录源 [County] 字段的查询中 标准行,写:

表格!ChooseCounty!ChooseCounty

接下来,编写报告的 Open 事件: (使用与上述相同的方法)

DoCmd.OpenForm "ChooseCounty", , , , , acDialog

对报表的关闭事件进行编码:

DoCmd.Close acForm, "ChooseCounty"

准备好运行报告后,打开报告。 表格将打开并等待公司选择。 单击命令按钮,然后报告将运行。 当报表关闭时,它会关闭表单。


我可以说服报告触发表单,但只有一次 - 我似乎无法弄清楚“表单!ChooseCounty!ChooseCounty”需要去哪里。也许有人可以澄清或提供更优雅的方式来做到这一点?

  • 我需要在所有表格上设置一个包含子报告的大型元报告 - 并且,使用相同的下拉“选择县”表单,我需要让该选择向下传递到所有子报告.我不知道该怎么做。欢迎提出建议!

~T

【问题讨论】:

    标签: ms-access-2007


    【解决方案1】:

    您似乎在问两个问题,最后一个我很清楚,但第一个不是。第二个是关于如何将过滤器级联到子表单。您可以通过以下两种方式之一执行此操作:

    1. 将表单控件引用作为标准放在每个子报表的记录源中,或者

    2. 在具有控制源“=Forms!ChooseCounty!ChooseCounty”的报表上创建一个不可见的控件。将该控件命名为“CountyFilter”。然后,将 CountyFilter 添加到链接属性。例如,如果您要链接 ID 上的子报表,您将拥有:

      • LinkMaster: ID;CountyFilter
      • LinkChild:ID;县

    (当然,假设 ID 是子报表的链接字段,而“County”是子子报表中的字段名称)。

    现在,我想知道为什么不仅在父记录中而且在子记录中都有县数据——这没有任何意义。如果你有它,那么上面的解决方案就可以了。

    如果你不这样做,那么我不明白这个问题,因为子报表背后的整个想法是它们被父记录过滤,所以如果父记录是一个人,而你按 COUNTY 过滤,你'只会获取该人的子报表中的子记录,根据定义,这些子记录已被 COUNTY 过滤,因为父项已被过滤。

    至于前面的问题,你写:

    我可以说服报告触发 表格,但只有一次 - 我看不到 找出确切的位置 '表格!ChooseCounty!ChooseCounty' 需要去

    你有两个选择:

    1. 硬连线报表的记录源以使用表单控件引用,因此报表的 WHERE 子句将是“WHERE County=Forms!ChooseCounty!ChooseCounty”(您应该将其设置为文本类型的参数以确保它得到正确处理)。

    2. 更好的方法是在报表的 OnOpen 事件中设置记录源。

    将表单作为对话框打开后,您会看到如下内容:

    Me.Recordsource = "SELECT * FROM MyTable WHERE County='" _
      & Forms!ChooseCounty!ChooseCounty & "'"
    

    在该行之后,您可以立即关闭表单,因为不再需要它。

    对于没有返回记录的情况,您可能需要一个 OnNoData 事件。这通常很简单,例如:

      MsgBox "No records found!"
      DoCmd.Close acReport, Me.Name
    

    我希望这能回答您的问题,但如果没有,我很乐意提供更多解释。

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多