当我在Jaspersoft Studio中划分两个BigDecimal变量时,为什么我变为null?

时间:2015-03-03 20:23:50

标签: java jasper-reports bigdecimal

我设置了一些变量。前两个将一个字段的整数值设置为BigDecimal:

$V{Active Unit}.valueOf( $F{Price Qty} ) 
$V{Reg Unit}.valueOf( $F{Reg Retail Unit} )

我创建的下两个变量然后用该变量划分一个字段。 (我在这一点上发现单价2美元兑换1.00美元显示为.50这种方式)。这些都返回NULL!

$F{Price}.divide($V{Current Unit Price})
$F{Reg Retail}.divide($V{Regular Unit Price})

然后我从彼此中减去两个新创建的变量(这是为了找出我打折商品的降价.75 - .50是每件商品的.25降价)。这也是返回NULL!

$F{Reg Retail}.divide($V{Regular Unit Price})

任何想法我做错了什么?我知道很少java,我通过Jaspersoft Studio使用它。根据我所读到的内容,我相信我已正确地解决了这个问题。有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我相信你必须做这样的事情:.valueOf($F{Price Qty}.doubleValue())。您可能想要做的另一件事是检查NULL,如下所示:($F{myField} != null) ? $F{myField}.doSomething() : null。这样,如果未设置该值,则代码将知道如何处理该字段的值为null。

<强>更新

如果所需的值为BigDecimal但值为其他数字类型(即 Integer ),则必须在调用{之前将值转换为BigDecimal {1}}方法:

divide()

上述内容应该有效。

答案 1 :(得分:0)

我也有类似的情况。我的变量“ SALDO”从“ TOTAL_ENTRADA”中减去“ TOTAL_SAIDA”,在大多数情况下显示正确,但是有一天我们发现了一组报告参数,使该变量显示为空!

这是变量的声明方式:

<variable name="TOTAL_ENTRADA" class="java.math.BigDecimal" calculation="Sum">
    <variableExpression><![CDATA[$F{es_case}.equals("E") ? $F{valor_total_nota_fiscal} : new BigDecimal(0.0)]]></variableExpression>
</variable>
<variable name="TOTAL_SAIDA" class="java.math.BigDecimal" calculation="Sum">
    <variableExpression><![CDATA[$F{es_case}.equals("S") ? $F{valor_total_nota_fiscal} : new BigDecimal(0.0)]]></variableExpression>
</variable>
<variable name="SALDO" class="java.math.BigDecimal" resetType="Column">
    <variableExpression><![CDATA[$V{TOTAL_ENTRADA}.subtract($V{TOTAL_SAIDA})]]></variableExpression>
</variable>

然后将该变量放在一个文本字段中,该文本字段位于填充了报表查询数据的表格之后。

要弄清情况,我必须了解“ resetType”配置,如《 iReport Ultimate指南》所述:

  

这指定何时必须将变量值重置为初始值(或者,如果未提供初始值表达式,则将其重置为null)[...]

重置类型“列”的意思是:

  

在每个新列中(如果报告仅由一列组成,则在每个页面中)再次初始化变量。

在阅读之后,我注意到包含“ SALDO”的文本字段是页面上首先出现的内容(在上述特定情况下)。 “ SALDO”的值已重置为null,并且由于报表查询没有更多结果,因此它没有更改。如果文本字段之前的表格在页面上仅显示一行,则“ SALDO”将正确显示。

使用iReport,我将此配置更改为“ Report”,这使变量在创建报表时仅初始化一次。在文本字段中弹出正确的“ SALDO”值。