将当前页码与最后一页编号进行比较

时间:2011-02-28 04:59:24

标签: jasper-reports

如何检查当前打印的页面是否实际上是最后打印的页面?

我尝试了以下内容:

$V{currentPage}.intValue() == $V{totalNumberOfPages} ?
  Boolean.TRUE : Boolean.FALSE

3 个答案:

答案 0 :(得分:14)

等了很久..但Stackoverflow没有回复...... 无论如何,我找到了我的解决方案..

首先在你的摘要乐队中放置这一行

<printWhenExpression><![CDATA[new Boolean($P{REPORT_PARAMETERS_MAP}.put("LastPageNumber",$V{PAGE_NUMBER}).equals("dummyPrintWhen"))]]></printWhenExpression>

请记住,上述行必须仅在报告的摘要范围内。

之后,您可以在报告中的任何时间点比较此参数,以查找最后一页的编号。

例如

<printWhenExpression><![CDATA[new Boolean(!$V{PAGE_NUMBER}.equals($P{REPORT_PARAMETERS_MAP}.get("LastPageNumber")))]]></printWhenExpression>

答案 1 :(得分:3)

使用以下打印时表达式再次打印摘要带:

new Boolean(($P{REPORT_PARAMETERS_MAP}.put(
"LastPageNumber",$V{PAGE_NUMBER}).equals("dummyPrintWhen")) ||
Boolean.TRUE)

您还可以使用containskey tot test来存在密钥:

new Boolean(!$P{REPORT_PARAMETERS_MAP}.containsKey("LastPageNumber"))

Nummeric表达式也有效,除了设置参数的那个页面之外,该表达式在每个页面上的计算结果为true:

new Boolean($P{REPORT_PARAMETERS_MAP}.get("LastPageNumber") < $V{PAGE_NUMBER})

我的问题是我在报告的末尾为多个交叉表创建了多个组页脚,并且使用常量作为组表达式,因此它们只打印一次。通过在第一个页脚中设置参数,我现在可以最终压缩列标题而无需借助子报表。干得好!!

浆果。

答案 2 :(得分:2)

不幸的是你的方法对我不起作用我不知道为什么..有一些关于你的代码有些像这样的错误

<![CDATA[new Boolean($P{REPORT_PARAMETERS_MAP}.put("LastPageNumber",$V{PAGE_NUMBER}).equals("dummyPrintWhen"))]]></printWhenExpression>

我认为事实上Summary Band只被调用一次,但你的编程实践很糟糕,因为如果没有KEY in the MAP的关键关联,它将返回null并且你调用方法equals就可以获得NULLPOINTEREXCEPTION,但我认为不是这种情况。

你应该像这样反转

<![CDATA[new Boolean("dummyPrintWhen".equals($P{REPORT_PARAMETERS_MAP}.put("LastPageNumber",$V{PAGE_NUMBER})))]]></printWhenExpression>

我在这个问题上使用的解决方法如下。

1)。在jasperreports

中创建参数
parameter name="totalRecordsOnReport" class="java.lang.Integer"

2)。将您的详细信息的总记录作为参数传递。

HashMap<Object,Object>parameters=....
parameters.put("totalRecordsOnReport",yourDetailRowCount);

我只需要在详细信息下方的最后一页打印一些内容,然后使用此代码。

component print when expression

$V{REPORT_COUNT}.equals($P{totalRecordsOnReport})

并在最后一页打印。