子报表在“详细信息”带中重复自身



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

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

我搜索了互联网,解决方案是添加

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

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

因此,我认为它仍在重复,但只是没有打印数据,因为我添加了一个表达式,人们说细节带的性质应该是这样的,我不应该把子报表放在细节带中,但如果我把它放在其他带中,我会得到这个错误:

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

如果我有很多数据,可能会占用一页以上的时间,就会出现上面的错误。

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

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

如果您想将子报表保留在Detail带中(顺便说一句,这很正常),您可以执行以下操作之一:

  • 要么有一个只返回一条记录的伪查询,这样Detail带只生成一次。然后,将报表连接传递到您的子报表。你可能已经这么做了。通过这种方式,您可以独立于主报表运行查询
  • 或者保持报表原样,并将printWhen表达式($V{REPORT_COUNT}.intValue()==1)直接添加到Detail带上,而不是子报表上。请注意,这只是一个丑陋的黑客攻击,可能会影响报告性能。您的主查询仍然返回许多您没有使用的数据,因此您应该考虑其他选项

如果可以将子报表移出"详细信息"标注栏,请将其放置在允许溢出的标注栏中,如"标题"或"摘要"标注栏。然后:

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

相关内容

最新更新