如何在 Jaspersoft iReport Designer 中汇总列值?
支付阿杰
结论
$V{COLUMN_COUNT} 统计的是当前列中的记录数,不能用于汇总字段值。要计算 Doctor Payment 的总额,需要在 iReport 中创建一个 calculation="Sum" 的变量,对每条记录的付款字段进行累加,再将结果显示在 Summary 或 Report Footer 区域。
配置步骤
假设付款字段名为 doctorPayment,类型为 java.math.BigDecimal:
-
在 Report Inspector 中右键单击 Variables。
-
选择 Add Variable。
-
设置以下变量属性:
- Variable Name:
DoctorPaymentSum - Variable Class:
java.math.BigDecimal - Calculation:
Sum - Reset Type:
Report - Variable Expression:
- Variable Name:
$F{doctorPayment}
- 在报表的
Summary或Report Footer区域添加一个 Text Field。 - 将 Text Field Expression 设置为:
$V{DoctorPaymentSum}
查询无论返回 5 行还是更多行,JasperReports 都会在处理明细记录时逐条累加,最后得到整份报表的总金额。
对应的 JRXML 配置
<variable name="DoctorPaymentSum"
class="java.math.BigDecimal"
calculation="Sum"
resetType="Report">
<variableExpression><![CDATA[$F{doctorPayment}]]></variableExpression>
<initialValueExpression><![CDATA[java.math.BigDecimal.ZERO]]></initialValueExpression>
</variable>
用于显示总计的 Text Field 可以这样配置:
<textField pattern="#,##0.00">
<reportElement x="100" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$V{DoctorPaymentSum}]]></textFieldExpression>
</textField>
如果付款金额不需要小数,可以将格式改为:
<textField pattern="#,##0">
处理空值
如果数据库字段可能为 null,可以在变量表达式中将空值明确按零处理:
$F{doctorPayment} == null
? java.math.BigDecimal.ZERO
: $F{doctorPayment}
完整配置如下:
<variable name="DoctorPaymentSum"
class="java.math.BigDecimal"
calculation="Sum"
resetType="Report">
<variableExpression><![CDATA[
$F{doctorPayment} == null
? java.math.BigDecimal.ZERO
: $F{doctorPayment}
]]></variableExpression>
<initialValueExpression><![CDATA[java.math.BigDecimal.ZERO]]></initialValueExpression>
</variable>
数据类型注意事项
变量类型应与字段类型一致:
- 字段是
java.math.BigDecimal:变量使用java.math.BigDecimal - 字段是
java.lang.Integer:变量可以使用java.lang.Integer - 字段是
java.lang.Long:变量可以使用java.lang.Long - 字段是
java.lang.Double:变量可以使用java.lang.Double
金额字段建议使用 java.math.BigDecimal,以免 Double 浮点运算产生精度误差。
如果字段目前是 Integer,但希望用 BigDecimal 计算总计,可以显式转换:
$F{doctorPayment} == null
? java.math.BigDecimal.ZERO
: new java.math.BigDecimal($F{doctorPayment}.toString())
总计应该放在哪里
整份报表的最终总计通常放在以下区域:
Summary:在所有明细数据处理完成后显示,适合放置报表总计。Report Footer:位于整份报表末尾,也可以显示总计。
如果将变量放在 Detail 中,显示的会是逐行增长的累计值。放在 Page Footer 中时,显示结果还会受分页和求值时间影响,因此不适合直接用于展示整份报表的最终总计。
对于示例数据,$V{DoctorPaymentSum} 最终返回:
123 + 223 + 234 + 678 + 343 = 1601
也可以直接在 SQL 查询中使用 SUM()。不过,如果报表既要展示每位医生的记录,又要在末尾显示总计,使用 JasperReports 的 Sum 变量通常更直接。
备注:内容仅供参考。
