子报表在 Detail 带中重复自身

The subreport repeats itself in Detail band

我是 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.

如果我有大量数据,可能会占用超过一页,就会出现上述错误。

如何删除那些空白页?如果我被要求不要把它放在细节带中,那我该怎么办?或者有什么解决办法?

详细信息带的生成次数与主数据集中的记录数相同(由 top-level 查询填充)。

如果您想将子报表保留在详细信息带中,这很正常,您可以执行以下操作之一:

  • 要么有一个虚拟查询,returns只有一条记录,这样 Detail 带只生成一次。然后,将报表连接传递给您的子报表。你可能已经这样做了。这样您就可以 运行 独立于主报告进行查询。
  • 或离开报表 as-is 并直接在详细信息带上添加您的 printWhen 表达式 ($V{REPORT_COUNT}.intValue()==1),而不是在子报表上。请注意,这只是一个丑陋的 hack,可能会影响报告的性能。您的主要查询仍然 returns 大量您不使用的数据,因此您应该考虑其他选项。

如果您可以将子报表移出详细信息区域,请将其放置在允许溢出的区域,例如标题或摘要区域。那么:

  • 让您的主数据集的查询为空,这样就不会生成详细信息带
  • 在报告级别(在 <jasperReport> 标记中)设置 whenNoDataType="AllSectionsNoDetail",以便生成除详细信息之外的所有其他部分
  • 与上面的第一个选项完全一样,将报表连接传递到您的子报表并从那里开始工作