Microsoft Access 报告 - 子报告超过 2 页,但 Access 认为它是一页?
Microsoft Access Report - Sub Report carries over 2 pages, but access thinks it is one?
我改写了标题和这个描述,因为最后一个没有多大意义。
基本上,我有一个显示业务详细信息的报告。其中一些详细信息包括:
- 企业名称
- 地址
- 文档
- 客户
设置报表格式(打印视图)后,公司名称及其对应的页码将添加到 table(BusinessPage)。这个的代码放在第一组header的'On Format'事件中,我把代码列在下面:
Dim RST As DAO.Recordset
Set RST = CurrentDb.OpenRecordset("BusinessPage", dbOpenTable)
RST.AddNew
RST![Business Name] = BUSName
RST![Business Page] = Me.Page
RST.Update
RST.Close
CurrentDb.Execute "SELECT DISTINCT * INTO t_temp FROM BusinessPage"
CurrentDb.Execute "DELETE FROM BusinessPage"
CurrentDb.Execute "INSERT INTO BusinessPage SELECT * FROM t_temp"
CurrentDb.Execute "DROP TABLE t_temp"
table 看起来像这样:
Business Name Page No
Business 1 3
Business 2 4
Business 3 6 'This indicates that Business 2 spans over two pages as page 5 is skipped'
Business 4 7
在报告header中,我有两件事:
- 封面
- 一个索引子 Report/Page
索引页(子报表)从 table(BusinessPage) 获取信息并列出报表中的所有业务以及页码他们开始。
现在您已经了解了它的工作原理,下面是我的问题:
如果子报告只占用一页,它就可以正常工作。我遇到的问题是当子报告列出了太多记录并且它转移到第二页时。出于某种原因,访问仍然认为子报表在一页上,即使它创建了另一页。尽管它这么认为,但包含代码 ([Page]) 的页脚显示正确。但是,显示总页数 ([Pages]) 的代码是错误的。在报告的最后,页脚会这样说:
第 50 页,共 49 页
我遇到的另一个问题是,当子报告超过一页时,添加到 table 的信息是错误的。添加的信息假设子报告仍在一页上。
例如子报表占一页时:
Page 1: Cover Page
Page 2: Sub Report/Index
Page 3: Business 1
子报表将正确显示:
Business 1 Page 3
当子报表占2页时:
Page 1: Cover Page
Page 2: Sub Report/Index
Page 3: Sub Report/Index
Page 4: Business 1
子report/index页面仍会显示:
Business 1 Page 3
而它应该显示为:
Business 1 Page 4
有人知道我该如何纠正这个问题吗?我有一种感觉,这可能是因为子报告在报告 header 中(但我需要它,因为它只会在报告开始时显示一次)。是否有另一种方法可以创建二级报告 header 来检验这一理论?
如果有人想到任何其他解决方案,请告诉我!
编辑:
我将子报告移到了它自己的 group/header 中,远离了报告 Header。
这并没有改变任何东西,access 仍然认为它显示在一个页面上,即使它不是。由于设计视图中子报表的大小,我有另一种预感认为它在一页上?在引入数据之前,设计视图中的子报表将适合一页,这可能是问题所在吗?我将如何解决这个问题?
我在想,也许是一个if语句来决定子报告结果有多大,如果是2页的长度,那么把代码改成:
RST![Business page] = Me.Page + 1
虽然这仍然是一个很糟糕的修复,我不确定我将如何编写 if 语句来计算页面的长度
这里发生了什么(我认为):
当主报表打开时,BusinessPage
是空的,因此您的索引子报表有一些最小高度。
然后 Access 看到您使用 [Pages]
,因此它必须准备整个报表,即运行所有页面的 Format
事件,将记录添加到 BusinessPage
。在此期间,Access 仍采用最小子报表并相应地分配页码。
在生成索引之后,使用原始页码 - 如果索引涵盖 >1 页,这将是错误的。
所以我认为你应该这样做:
在打开报告之前(或者可能在 Report_Open
中),预填充 BusinessPage
table 中将包含的所有记录,但使用虚拟页码(例如 0 ).
因此索引子报表将具有正确的高度,并且在 Format
事件中生成的页码应该是正确的。
我改写了标题和这个描述,因为最后一个没有多大意义。
基本上,我有一个显示业务详细信息的报告。其中一些详细信息包括:
- 企业名称
- 地址
- 文档
- 客户
设置报表格式(打印视图)后,公司名称及其对应的页码将添加到 table(BusinessPage)。这个的代码放在第一组header的'On Format'事件中,我把代码列在下面:
Dim RST As DAO.Recordset
Set RST = CurrentDb.OpenRecordset("BusinessPage", dbOpenTable)
RST.AddNew
RST![Business Name] = BUSName
RST![Business Page] = Me.Page
RST.Update
RST.Close
CurrentDb.Execute "SELECT DISTINCT * INTO t_temp FROM BusinessPage"
CurrentDb.Execute "DELETE FROM BusinessPage"
CurrentDb.Execute "INSERT INTO BusinessPage SELECT * FROM t_temp"
CurrentDb.Execute "DROP TABLE t_temp"
table 看起来像这样:
Business Name Page No
Business 1 3
Business 2 4
Business 3 6 'This indicates that Business 2 spans over two pages as page 5 is skipped'
Business 4 7
在报告header中,我有两件事:
- 封面
- 一个索引子 Report/Page
索引页(子报表)从 table(BusinessPage) 获取信息并列出报表中的所有业务以及页码他们开始。
现在您已经了解了它的工作原理,下面是我的问题:
如果子报告只占用一页,它就可以正常工作。我遇到的问题是当子报告列出了太多记录并且它转移到第二页时。出于某种原因,访问仍然认为子报表在一页上,即使它创建了另一页。尽管它这么认为,但包含代码 ([Page]) 的页脚显示正确。但是,显示总页数 ([Pages]) 的代码是错误的。在报告的最后,页脚会这样说:
第 50 页,共 49 页
我遇到的另一个问题是,当子报告超过一页时,添加到 table 的信息是错误的。添加的信息假设子报告仍在一页上。
例如子报表占一页时:
Page 1: Cover Page
Page 2: Sub Report/Index
Page 3: Business 1
子报表将正确显示:
Business 1 Page 3
当子报表占2页时:
Page 1: Cover Page
Page 2: Sub Report/Index
Page 3: Sub Report/Index
Page 4: Business 1
子report/index页面仍会显示:
Business 1 Page 3
而它应该显示为:
Business 1 Page 4
有人知道我该如何纠正这个问题吗?我有一种感觉,这可能是因为子报告在报告 header 中(但我需要它,因为它只会在报告开始时显示一次)。是否有另一种方法可以创建二级报告 header 来检验这一理论?
如果有人想到任何其他解决方案,请告诉我!
编辑:
我将子报告移到了它自己的 group/header 中,远离了报告 Header。
这并没有改变任何东西,access 仍然认为它显示在一个页面上,即使它不是。由于设计视图中子报表的大小,我有另一种预感认为它在一页上?在引入数据之前,设计视图中的子报表将适合一页,这可能是问题所在吗?我将如何解决这个问题?
我在想,也许是一个if语句来决定子报告结果有多大,如果是2页的长度,那么把代码改成:
RST![Business page] = Me.Page + 1
虽然这仍然是一个很糟糕的修复,我不确定我将如何编写 if 语句来计算页面的长度
这里发生了什么(我认为):
当主报表打开时,BusinessPage
是空的,因此您的索引子报表有一些最小高度。
然后 Access 看到您使用 [Pages]
,因此它必须准备整个报表,即运行所有页面的 Format
事件,将记录添加到 BusinessPage
。在此期间,Access 仍采用最小子报表并相应地分配页码。
在生成索引之后,使用原始页码 - 如果索引涵盖 >1 页,这将是错误的。
所以我认为你应该这样做:
在打开报告之前(或者可能在 Report_Open
中),预填充 BusinessPage
table 中将包含的所有记录,但使用虚拟页码(例如 0 ).
因此索引子报表将具有正确的高度,并且在 Format
事件中生成的页码应该是正确的。