子报表在详细信息区域中重复

问题描述 投票:0回答:1

我是 JasperReports 的新手,基本上我想将子报表放在主报表中。

问题是我将子报表放在“详细信息”区域中,因此当我查询包含多个数据的数据库时,当我将报表输出为 pdf 时,子报表总是会重复多次。我想要一份不会重复的报告,无论我连接的数据库中有多少数据。

网上查了解决办法是添加:

new Boolean($V{REPORT_COUNT}.intValue()==1)

在子报表的 print when expression 属性中,这确实解决了我的部分问题,因为现在我的子报表只打印一次,但在显示子报表后仍然留下一些空白页。

所以我认为它仍然在重复,但只是因为我添加的表达式而没有打印数据,人们说细节带的性质应该以这种方式工作,并且我不应该将子报表放入细节带,但如果我把它放在其他带中,我会收到此错误:

Error filling print... Subreport overflowed on a band that does not support overflow.

如果我的数据很多,甚至超过一页,就会出现上面的错误。

如何删除这些空白页?如果我不要求将其放入详细区域,那么我应该做什么?或者有什么解决办法?

jasper-reports subreport
1个回答
11
投票

详细信息带将生成与主数据集中的记录数一样多的次数(由顶级查询填充)。

如果您想将子报表保留在详细信息区域中(顺便说一下,这是正常的),您可以执行以下操作之一:

  • 要么有一个仅返回一条记录的虚拟查询,以便详细信息带仅生成一次。然后,将报表连接传递到您的子报表。您可能已经这样做了。这样您就可以独立于主报告运行查询。
  • 或者按原样保留报表并将 printWhen 表达式 (
    $V{REPORT_COUNT}.intValue()==1
    ) 直接添加到“详细信息”区域上,而不是添加到子报表上。请注意,这只是一个丑陋的黑客行为,可能会影响报告的性能。您的主查询仍然返回大量您不使用的数据,因此您应该考虑其他选项。

如果您可以将子报表移出“详细信息”区域,请将其放置在允许溢出的区域(例如“标题”或“摘要”区域)中。然后:

  • 将主数据集的查询清空,这样就不会生成详细信息带
  • 在报告级别(在
    <jasperReport>
    标签中)设置whenNoDataType =“AllSectionsNoDetail”,以便生成除详细信息之外的所有其他部分
  • 与上面第一个选项完全相同,将报表连接传递到子报表并从那里开始工作
© www.soinside.com 2019 - 2024. All rights reserved.