我想创建一个报告,我可以在同一个父报告上多次用作子报告。但是,每次出现的子报表都应具有不同的值。
例如,有一个名为DailyReport的表。 此表中的记录包含: 日期,成员,团队,描述
子报告应该针对特定日期范围内的每个团队。但是,每个子报告/团队的日期范围将不同。
因此,如果所有团队的日期范围一致,那么我可以创建一个子报表,并对结果记录进行一些排序,将事物分成小组。 但是,由于日期范围不一致,我无法使用单个查询,因此我看到的最直接的解决方案是为每个团队的每个范围创建单独的子报表和查询。 这个解决方案的问题是,如果我决定更改子报表的格式,我必须在每个特定的子报表中这样做 - 很多重复的工作。
我想创建一个通用查询和子报表。查询和子报告将调用将返回相关值的VB函数。 这意味着我的父报告多次具有相同的通用报告。在渲染每个子报表时,我想在后台增加一个值,以便通用查询和子报表调用的函数知道返回不同的值。
然而,似乎并非Access中的工作方式。报表上的子报表不会线性呈现。创建子报表,然后将其“标记”到需要的报表上。这意味着我的所有通用子报表都具有相同的数据。
如何定义通用报告和查询?然后,在同一个父报表上多次重复使用报表时,将不同的值插入报表和查询中。
答案 0 :(得分:0)
您需要查看报告的LinkMasterFields和LinkChildFields属性。它们专门用于此目的 - 根据主报表中的当前数据过滤子报表,而无需任何代码甚至查询。
你是正确的,LMF / LCF不适用于日期范围,只适用于值。因此,使用LMF / LCF进行团队过滤。
对于日期范围过滤,您可以使用启动报表的未绑定表单作为基本查询中定义的两个参数。创建frmLaunch,并添加两个文本框minDate
和maxDate
。将其Format属性设置为Short Date
,以便Access正确解释它们并提供日期选择器。现在修改基本查询,添加两个日期/时间参数[Forms]![frmLaunch]![minDate]
和[Forms]![frmLaunch]![maxDate]
。现在,找到您的日期字段并将其标准设置为Between [Forms]![frmLaunch]![minDate]
和[Forms]![frmLaunch]![maxDate]
。向运行代码DoCmd.OpenReport "YourReportName", acViewPreview
的frmLaunch添加一个按钮。
答案 1 :(得分:0)
因此,目标是在同一个父报告上多次重复使用相同的子报告,并充分灵活地了解子报告如何检索数据。
我在父报表上放置了同一子报表的多个实例。在子报表Open事件中,我放置了一行像
Me.Report.RecordSource = "SELECT * FROM someTable WHERE " & getCriteria()
nextCriteria()
也许可以传递一个值,该值标识子报表的哪个实例向getCriteria函数打开。可能像getCriteria(Me.Report.Name)
。但在这种情况下,我记录了在vb中生成了多少子报告。
遗憾的是,如果子报表具有数据源为vb函数的控件,则所有报表都将显示该控件的相同值。为了解决这个问题,我在上面的SQL语句的SELECT中添加了getSomeValue() & "As [Some Value]"
之类的东西。如果要传递字符串或日期,请不要忘记在getSomeValue()
周围添加单引号或哈希值。
基本上就是这样,这是一种痛苦。但我找不到更优雅的方式去做。
编辑: 我这样做的一个主要警告是,尽管打印预览正常工作,但在实际打印或导出为PDF时,某些子报表将不会包含在内。也许还有其他原因引起了这个......