Formatting 在JasperReports中打印(到达最后一个元素)表达式的时间

Formatting 在JasperReports中打印(到达最后一个元素)表达式的时间,formatting,jasper-reports,Formatting,Jasper Reports,是否可以生成一个“打印时表达式”,用于检测XML数据源文件中的最后一个元素 基本上,我有一个报告,在明细栏中的子报告之后插入一个分栏符,这样我就可以清楚地定义新记录开头的新页面。但它总是给我留下空白的最后一页。所以我希望,如果我有一个print-when条件,如果它是XML数据源中的最后一个记录元素,那么我可以防止这种情况 这可能吗?问题是,在查找下一个元素之前,您不知道它是最后一个元素。我认为没有简单的方法 原则上,这样做是可以的: 围绕整个报告创建超级报告。在超级报告中运行相同的查询。数一数

是否可以生成一个“打印时表达式”,用于检测XML数据源文件中的最后一个元素

基本上,我有一个报告,在明细栏中的子报告之后插入一个分栏符,这样我就可以清楚地定义新记录开头的新页面。但它总是给我留下空白的最后一页。所以我希望,如果我有一个print-when条件,如果它是XML数据源中的最后一个记录元素,那么我可以防止这种情况


这可能吗?

问题是,在查找下一个元素之前,您不知道它是最后一个元素。我认为没有简单的方法

原则上,这样做是可以的:
围绕整个报告创建超级报告。在超级报告中运行相同的查询。数一数行。然后将行数传递给原始报表(现在是子报表),然后再次运行查询。显然,运行两次查询是另一个缺点

如果数据源是SQL,那么我建议修改SQL以返回作为结果集一部分的行数。但是对于非SQL数据源,在到达最后一行之前,您需要知道行数的某种方法(嗯……某种识别最后一行的方法)。。。 如果您确定数据源是JRBeanCollectionDataSource,则可以使用:

$V{REPORT_COUNT} == ((net.sf.jasperreports.engine.data.JRBeanCollectionDataSource)ORIGINAL_DATA_SOURCE( )).getData().size()

另一种可能是创建两个变量:
previous
current
。在
当前
之前声明
上一个
。将
previous
的表达式设置为
$V{current}
;将初始值表达式留空。将
current
的表达式设置为
$F
字段值。现在printWheenexpression:
$V{previous}==null
只应在最后一行触发。可能需要
$V{current}.equals($V{previous})
也一样。我想用我自己的解决方法来做一些贡献。我只是将要打印的记录数作为参数传递,比如记录数。然后,在报告中,我创建了一个布尔变量,表达式为$V{report\u COUNT}==$P{RECORDS\u NUMBER}。在此之后,您已经可以在任何“Print When Expression”中使用de new变量,该表达式的内容需要在最后一条记录之后打印。您可以再次检查吗?它被标记为一个无效的表达式。是的,它抱怨,但它工作。您需要确保您的数据源是JRBeanCollectionDataSource。您可以使用原始数据源()来查看类型