【问题标题】:Access - Modular reusable subreport访问 - 模块化可重用子报表
【发布时间】:2014-09-17 20:02:51
【问题描述】:

我想创建一个可以在同一个父报表上多次用作子报表的报表。但是,每次出现的子报表都应该有不同的值。

例如,有一个名为 DailyReport 的表。 此表中的记录包含: 日期、成员、团队、描述

子报告应针对特定日期范围内的每个团队。但是,每个子报表/团队的日期范围不会相同。


因此,如果所有团队的日期范围是一致的,那么我可以创建一个子报表,并对结果记录进行一些排序,以将事物分成多个团队。 但是,由于日期范围不一致,我无法使用单个查询,因此我看到的最直接的解决方案是为每个团队的每个范围创建单独的子报表和查询。 这个解决方案的问题是,如果我决定更改子报表的格式,我必须在每个特定的子报表中都这样做——很多重复的工作。

我想创建一个通用查询和子报表。查询和子报表将调用将返回相关值的 VB 函数。 这意味着我的父报告多次具有相同的通用报告。在呈现每个子报表时,我想在幕后增加一个值,以便通用查询和子报表调用的函数知道返回不同的值。

但是,Access 中的工作方式似乎并非如此。报表上的子报表不是线性呈现的。创建一个子报表,然后在需要的地方“标记”到报表上。这意味着我所有的通用子报表都有相同的数据。


如何定义通用报告和查询?然后将不同的值插入报表并查询,同时在同一个父报表上多次重复使用报表。

【问题讨论】:

  • 如果您放置同一个子报表的多个实例,它们每个都可以有自己的过滤条件。基础查询可能需要多个列来表示每个报告所需的日期范围。
  • 您需要查看报表的 LinkMasterFields 和 LinkChildFields 属性。它们正是为此目的而设计的——根据主报表中的当前数据过滤子报表,无需任何代码甚至查询。
  • @pteranodon 是的,我现在明白了。这正是我需要的。谢谢。
  • @pteranodon 实际上,这似乎仅适用于过滤值,例如团队名称。但我不明白这如何适用于日期范围。我错过了什么吗?
  • @JeffO 这似乎是一个可行的解决方案。但是,我似乎无法为每个子报表实例设置过滤器,而只能在报表本身上设置。或者尝试通过 vb 做到这一点;看来我不能在父报告 Open 或 Load 事件中使用 Report.Filter 。你还有什么想法吗?

标签: ms-access


【解决方案1】:

您需要查看报表的 LinkMasterFields 和 LinkChildFields 属性。它们正是为此目的而设计的——根据主报表中的当前数据过滤子报表,无需任何代码甚至查询。

您是正确的,LMF/LCF 不适用于日期范围,仅适用于值。所以使用 LMF/LCF 作为团队过滤器。

对于日期范围过滤,您可以使用未绑定的表单作为基本查询中定义的两个参数启动报告。创建 frmLaunch,并添加两个文本框 minDatemaxDate。将它们的 Format 属性设置为 Short Date,以便 Access 正确解释它们并提供日期选择器。现在修改基本查询,添加两个日期/时间参数[Forms]![frmLaunch]![minDate][Forms]![frmLaunch]![maxDate]。现在,找到您的日期字段并将其条件设置为Between [Forms]![frmLaunch]![minDate][Forms]![frmLaunch]![maxDate]。将一个按钮添加到运行代码 DoCmd.OpenReport "YourReportName", acViewPreview 的 frmLaunch。

【讨论】:

  • 嗯,所以您的解决方案有效,但我认为它不能让我在同一个父报表上以不同的日期范围多次重复使用同一个子报表。我承认,我认为我在最初的问题中并没有很清楚地说明这个要求。
  • 不同日期范围的性质是什么?如果是当月与上个月或按季度进行对比,我认为可以解决一些问题。如果它们只是每个子报表的自定义范围,那就更难了。
  • 是的,不幸的是,它们可以是完全任意且不相关的范围。
  • 好的,我明白了。谢谢你的帮助。所以我最终做了一些类似于我在原始帖子中描述的事情(有一个返回不同值的 vb 函数)。这里的不同之处在于我使用了 onPaint/OnPrint 事件。此外,我必须重组我的表单,以便从描述团队的表中提取父表单的数据源。所以现在我每个团队都有一个记录,在表单的详细信息部分,我可以调用我的 onPaint/Print 脚本,然后我使用 LMF/LCF 链接到子表单。这些子表单使用的查询在其标准中使用函数来返回正确的日期。
  • 其实这也没用。这些值确实在子报表上正确更新,但在查询中似乎并非如此。我猜所有的查询都是一次性运行的,然后报告就建好了——或者我可能犯了一个错误。无论哪种方式,我都愿意接受解决方案。
【解决方案2】:

因此,我们的目标是让在同一个父报表上多次重复使用同一个子报表成为可能,并且在子报表如何检索数据方面具有完全的灵活性。

我在父报表上放置了同一个子报表的多个实例。在子报表打开事件上,我放置了一行

Me.Report.RecordSource = "SELECT * FROM someTable WHERE " & getCriteria()
nextCriteria()

也许可以将一个值传递给 getCriteria 函数,该值标识子报表的哪个实例正在打开。可能像getCriteria(Me.Report.Name)。但在这种情况下,我会跟踪在 vb 中生成了多少子报表。 不幸的是,如果您的子报表具有数据源是 vb 函数的控件,则所有报表都将显示该控件的相同值。为了解决这个问题,我在上面的 SQL 语句的 SELECT 中添加了类似 getSomeValue() & "As [Some Value]" 的内容。如果您要传递字符串或日期,请不要忘记在 getSomeValue() 周围添加单引号或哈希。

基本上就是这样,这很痛苦。但我找不到更优雅的方法。

编辑: 我在这样做时遇到的一个主要警告是,尽管打印预览工作正常,但在实际打印或导出为 PDF 时,一些子报告将不包括在内。也许还有其他原因导致这种情况......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2021-03-16
    • 2017-03-02
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多