手动变量增量

时间:2013-06-17 09:20:48

标签: xml jasper-reports

我找不到在报告生成过程中创建变量并修改它的方法。

我已经声明了一个整数变量:

<variable name="my_counter" class="java.lang.Integer" calculation="System">
    <initialValueExpression><![CDATA[new Integer(0)]]></initialValueExpression>
</variable>

这似乎有效,我可以毫无问题地打印它的价值。但我想在报告生成期间增加该值:当XML(报告的数据源)包含某些参数时,我想增加值(my_counter ++)。

我想要实现的目标,在伪代码中:

<textField printWhenExpression="$P{BANANAS}!=null"> ($V{my_counter}++)+" The XML contains <bananas>" </textField>
<textField printWhenExpression="$P{APPLES}!=null"> ($V{my_counter}++)+" The XML contains <apples>" </textField>
<textField printWhenExpression="$P{GRAPES}!=null"> ($V{my_counter}++)+" The XML contains <grapes>" </textField>
<textField printWhenExpression="$P{ORANGES}!=null"> ($V{my_counter}++)+" The XML contains <oranges>" </textField>

包含香蕉,苹果和橙子的XML文件的预期结果将是:

1. The XML contains <bananas>
2. The XML contains <apples>
3. The XML contains <oranges>

我试过了,但目前的结果看起来更像是这样:

0. The XML contains <bananas>
0. The XML contains <apples>
0. The XML contains <oranges>

因此似乎没有修改变量my_counter。为什么?如何修改每个显示的textField的值?

1 个答案:

答案 0 :(得分:2)

您必须为变量使用可变值持有者而不是java.lang.Integer。例如java.util.concurrent.atomic.AtomicInteger会做(你不需要原子性,你也可以使用Commons Lang的MutableInt)。

将变量声明为AtomicInteger后,您可以在表达式中执行$V{my_counter}.getAndIncrement()