有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我在Jaspersoft Studio中除掉两个BigDecimal变量时会得到null?

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

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

接下来我创建的两个变量将字段除以该变量。(此时,我发现单价为1.00美元的单价为2,以这种方式显示为.50)。这些返回空值

$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) 个答案

  1. # 1 楼答案

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

    以下是变量的声明方式:

    <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指南所述:

    This specifies when a variable value has to be reset to the initial value (or to null if no initial value expression has been provided) [...]

    重置类型“列”是指:

    The variable is initialized again in each new column (or in each page if the report is composed of only one column).

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

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

  2. # 2 楼答案

    我相信你必须这样做:.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}))
    

    像上面这样的东西应该会起作用