【问题标题】:manual variable increment手动变量增量
【发布时间】:2013-06-17 09:20:48
【问题描述】:

我找不到在报告生成期间创建变量并对其进行修改的方法。

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

<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 的值?

【问题讨论】:

  • 最好用术语行包含。您有字段(例如来自 XML 数据源),您可以在变量的表达式中使用此字段

标签: xml jasper-reports


【解决方案1】:

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

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

【讨论】:

  • 有效!我刚刚对初始值表达式有一点问题,您必须使用完整的类路径:new java.util.concurrent.atomic.AtomicInteger(1) 而不仅仅是new AtomicInteger(1)。谢谢@dada67
  • 我建议 AtomicInteger 的唯一原因是它是一个现成的可变 int 类。正如我在回复中指出的那样,原子性/线程安全实际上并不是必需的,如果你手头有一个,你可以使用其他可变 int 类(你还需要一个递增并返回值的方法,因为你不能使用 void报告表达式中的方法)。
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 2017-12-03
  • 2020-11-16
  • 1970-01-01
  • 2014-05-01
  • 2017-12-12
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多