Jasper Report分组变量sum计算值错误问题求助
Jaspersoft 6.3分组变量求和重复累加问题排查
问题根源
同一order_number对应多条记录时,ticket_somma_numero_ordine变量默认每行都会执行计算,导致sommatoria_ticket在组内每条记录都累加一次同一个ticket值,最终结果是正确值的N倍(N为该order_number下的记录数)。
现有变量配置的错误点
ticket_somma_numero_ordine未限定计算时机:
未设置calculation属性,默认值为EveryRow,组内每条记录都会重新计算一次该变量,产生多个相同的ticket值。sommatoria_ticket手动累加逻辑缺陷:
手动累加依赖ticket_somma_numero_ordine的行级值而非组级唯一值,导致组内多次重复累加。
修正方案
方案1:通过calculation属性限定组级计算
修改ticket_somma_numero_ordine变量,添加calculation="First"(或Last),确保组内仅取第一次(或最后一次)计算的结果:
<variable name="ticket_somma_numero_ordine" class="java.lang.Double" resetType="Group" resetGroup="Gruppo_NUMERO_ORDINE" calculation="First"> <variableExpression><![CDATA[$V{totale_importo_numero_ordine}.compareTo(new BigDecimal(36.15)) > 0 ? 36.15 : $V{totale_importo_numero_ordine}.doubleValue()]]></variableExpression> </variable>
同时将sommatoria_ticket改为自动求和模式,避免手动累加的错误:
<variable name="sommatoria_ticket" class="java.lang.Double" resetType="Group" resetGroup="Gruppo_REGIONE" incrementType="Group" incrementGroup="Gruppo_NUMERO_ORDINE" calculation="Sum"> <variableExpression><![CDATA[$V{ticket_somma_numero_ordine}]]></variableExpression> <initialValueExpression><![CDATA[0.0]]></initialValueExpression> </variable>
方案2:通过组计数控制仅累加一次
修改ticket_somma_numero_ordine的变量表达式,仅在组的第一条记录返回有效值,其余行返回0:
<variable name="ticket_somma_numero_ordine" class="java.lang.Double" resetType="Group" resetGroup="Gruppo_NUMERO_ORDINE"> <variableExpression><![CDATA[$V{Gruppo_NUMERO_ORDINE_COUNT} == 1 ? ($V{totale_importo_numero_ordine}.compareTo(new BigDecimal(36.15)) > 0 ? 36.15 : $V{totale_importo_numero_ordine}.doubleValue()) : 0.0]]></variableExpression> </variable>
此时原sommatoria_ticket的手动累加逻辑可保留,因为组内仅第一条记录会贡献有效值,其余行累加0,不会重复计算。
内容的提问来源于stack exchange,提问作者FrancescoDS
相关产品推荐
相关产品推荐

