【问题标题】:Why am I getting null when I divide two BigDecimal variables in Jaspersoft Studio?当我在 Jaspersoft Studio 中划分两个 BigDecimal 变量时,为什么我得到空值?
【发布时间】:2015-03-03 20:23:50
【问题描述】:

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

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

我创建的接下来的两个变量然后将一个字段除以该变量。 (此时我发现 1.00 美元的单价 2 显示为 0.50)。这些都返回 NULL!

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

然后我将两个新创建的变量相互减去(这是为了找出我对打折商品的降价 0.75 - 0.50 是每件商品的 0.25 降价)。这也是返回NULL!

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

任何想法我做错了什么?我对 java 知之甚少,我通过 Jaspersoft Studio 使用它。根据我所阅读的内容,我相信我已经正确地解释了这一点。有人有什么想法吗?

【问题讨论】:

  • 您为价格、Reg Retail、当前单价和常规单价分配了什么?
  • 你不必这样做:.valueOf($F{Price Qty}.doubleValue())?
  • 我试过这个 $V{Active Unit}.valueOf( $F{Price Qty}.BigDecimal()) 但我收到以下错误:方法 BigDecimal() 未定义整数类型。

标签: java jasper-reports bigdecimal


【解决方案1】:

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

更新

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

new BigDecimal($F{var1}).divide(new BigDecimal($F{var2}))

上面的方法应该可以工作。

【讨论】:

  • 我尝试了上面的方法,但是我现在收到以下错误 The method BigDecimal is undefined for the type Integer.因为我在计算货币,所以我必须使用 BigDecimal,但是我也尝试了 doubleValue 并得到了相同的错误消息。
  • @AaronMartin,这些方法必须与您定义的数据类型兼容。如果您获得的值是整数,则必须先将其转换为BigDecimal(如果这是您需要的)。为此,您可以使用BigDecimal(int) 构造函数。拥有BigDecimal 实例后,您可以使用它来调用BigDecimal.divide(BigDecimal) 方法。
【解决方案2】:

我也遇到过类似的情况。我的变量“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 终极指南所述:

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

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

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

读完之后,我注意到包含“SALDO”的文本字段是页面上出现的第一件事(在具体提到的情况下)。 “SALDO”的值被重置为 null,并且由于报告查询没有更多结果,因此它没有更改。如果文本字段之前的表格只有一行出现在页面上,“SALDO”将正确显示。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多