Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Access-模块化可重用子报表_Ms Access - Fatal编程技术网

Ms access Access-模块化可重用子报表

Ms access Access-模块化可重用子报表,ms-access,Ms Access,我想创建一个报表,可以在同一父报表上多次用作子报表。但是,子报表的每次出现都应具有不同的值 例如,有一个名为DailyReport的表。 此表中的记录包括: 日期、成员、团队、描述 子报告应针对特定日期范围内的每个团队。但是,每个子报告/团队的日期范围将不同 因此,如果所有团队的日期范围都是一致的,那么我可以创建一个子报告,并对结果记录进行排序,以将内容划分为团队。 但是,由于日期范围不一致,我无法使用单个查询,因此我看到的最直接的解决方案是为每个团队的每个范围创建单独的子报告和查询。 这个解

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

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

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


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

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

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



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

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

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


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

因此,我们的目标是使同一子报表能够在同一父报表上重复使用同一子报表多次,并且在子报表检索数据的方式上具有完全的灵活性

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

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

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

编辑:
我在这方面遇到的一个主要警告是,尽管打印预览工作正常,但在实际打印或导出为PDF时,某些子报表将不包括在内。可能是其他原因造成了这种情况…

如果您将同一子报表的多个实例放在一起,它们可以各自有自己的筛选条件。基础查询可能需要多个列来表示每个报表所需的日期范围。您需要查看报表的LinkMasterFields和LinkChildFields属性。它们正是为了这个目的而设计的——根据主报表中的当前数据过滤子报表,而不需要任何代码,甚至不需要查询。这正是我需要的。谢谢。@pteranodon实际上,这似乎只适用于筛选一个值,例如团队名称。但我不认为这对约会范围有效。我遗漏了什么吗?@JeffO这似乎是一个可行的解决方案。但是,我似乎无法为每个子报表实例设置过滤器,只能在报表本身上设置过滤器。或者尝试通过vb实现这一点;似乎我无法在父报表打开或加载事件中使用Report.Filter。你还有别的想法吗?嗯,你的解决方案是可行的,但我不认为它能让我在同一父报表的不同日期范围内多次重复使用同一子报表。我承认,我认为我在最初的问题中没有明确提出这一要求。不同日期范围的性质是什么?如果是本月对上个月,或者是季度对季度,我认为可以解决一些问题。如果它们只是每个子报表的自定义范围,则会更加困难。是的,不幸的是,它们可能是完全任意和不相关的范围。好的,我知道了。谢谢你的帮助。所以我最终做了一些类似于我在原始帖子中描述的事情(有一个返回不同值的vb函数)。这里的区别是t