0

背景

下图中的总计部分显示了趋势列的奇怪结果。当名为Previous的列下的值等于名为Current的列下的值时,文本应该为

打印时表达式和文本字段表达式

表达式使用相同的代码进行评估:

new java.lang.Boolean(
    $V{LAST_WEEK_TALLY_0}.add(
    $V{LAST_WEEK_TALLY_1} ).add(
    $V{LAST_WEEK_TALLY_2} ).add(
    $V{LAST_WEEK_TALLY_3} ).longValue() ==
    $V{THIS_WEEK_TALLY_0}.add(
    $V{THIS_WEEK_TALLY_1} ).add(
    $V{THIS_WEEK_TALLY_2} ).add(
    $V{THIS_WEEK_TALLY_3} ).longValue()
)

文本字段的评估时间设置为Band

问题

看起来好像表达式代码正在为一列和当前列下的值计算打印时为时已晚。正在打印的值对于该行是正确的。这意味着Print When ExpressionText Field Expression的计算时间不会同时计算。

问题

当表达式和文本字段表达式同时评估相同的结果时,我需要做什么才能使打印?这将在任何时候为Totals' Trend列生成单词true Previous == Current

4

2 回答 2

1

我有两个建议,不确定是否可行:

1.使用iReport的求和
假设您使用的是交叉表,有一个功能可以在行或列上求和。使上一个总计等于上一个总计的数量,当前总计也是如此。
然后在趋势列中,写一个表达式 Current_Value - Previous_value ==0

2. 在 Query 中求和
这是更强大的解决方案,但可能更复杂一些。我通常不太依赖 iReport,总是给它准备好的数据。
如果您使用 Java 生成报表数据,则在调用报表之前将很容易填写所有值。

于 2010-04-01T13:52:03.107 回答
0

一个不雅但实用的解决方案是将静态文本字段合并在一起,避免必须同步Print When ExpressionText Field Expression以支持后者。

($V{LAST_WEEK_TALLY_0}.add(
  $V{LAST_WEEK_TALLY_1} ).add(
  $V{LAST_WEEK_TALLY_2} ).add(
  $V{LAST_WEEK_TALLY_3} ).longValue() ==
$V{THIS_WEEK_TALLY_0}.add(
  $V{THIS_WEEK_TALLY_1} ).add(
  $V{THIS_WEEK_TALLY_2} ).add(
  $V{THIS_WEEK_TALLY_3} ).longValue()) ? "-" :
($V{LAST_WEEK_TALLY_0}.add(
  $V{LAST_WEEK_TALLY_1} ).add(
  $V{LAST_WEEK_TALLY_2} ).add(
  $V{LAST_WEEK_TALLY_3} ).longValue() <
$V{THIS_WEEK_TALLY_0}.add(
  $V{THIS_WEEK_TALLY_1} ).add(
  $V{THIS_WEEK_TALLY_2} ).add(
  $V{THIS_WEEK_TALLY_3} ).longValue()) ? "Up" : "Down"
于 2010-04-01T16:02:28.210 回答