想象一下以下数据集:
在JasperReports中获取 TOTAL_CUMULATIVE
的值的正确方法是什么?
即:在“VW”行中,它应该将所有值(COST - EXPENSE
)加起来直到“VW”,这意味着:(500 - 150)+(400- 200)= 550。
列xml代码:
<textField isStretchWithOverflow="true" pattern="#,##0.00" isBlankWhenNull="true">
<reportElement x="746" y="0" width="65" height="13"/>
<box topPadding="1" leftPadding="1" bottomPadding="1" rightPadding="1"/>
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$V{BALANCE_BY_ACCOUNTING}]]></textFieldExpression>
</textField>
变量:
<variable name="BALANCE_BY_ACCOUNTING" class="java.lang.Double" resetType="Group" resetGroup="groupByAccounting" calculation="Sum">
<variableExpression><![CDATA[$F{cost} - $F{expense}]]></variableExpression>
</variable>
在“VW”行中,代码将TOTAL_CUMULATIVE
列值设置为:200。它不应该。它应设置为累积和550.这同样适用于其他行。在“MERCEDES”行中,它设置值600(应为11500),依此类推。
答案 0 :(得分:1)
为了获得累积总和,可以使用没有为组中的每个新enrty设置值的简单总和。
car 字段将帮助我们解决任务和两类变量:
resetType="Group" resetGroup="carGroup"
)resetType=Report
)所有数据都将放置在 groupFooter 频段。
要获得有效结果,数据应按 car 订购。
使用简单的 csv 数据源就足够了。
car,cost,expense
BMW,200,50
BMW,100,50
BMW,200,50
VW,200,100
VW,200,100
MERCEDES,200,50
MERCEDES,500,50
以下示例中此数据源的数据适配器名称为 cars.csv 。跳过文件的第一行 - 它包含列的名称。
我们需要显示累积总和的变量是:
<variable name="total" class="java.lang.Integer" calculation="Sum">
<variableExpression><![CDATA[$F{cost} - $F{expense}]]></variableExpression>
</variable>
带有$V{total}
表达式的 textField 放置在 groupFooter 中。
jrxml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Grouping, sum" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" >
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="cars.csv"/>
<field name="car" class="java.lang.String"/>
<field name="cost" class="java.lang.Integer"/>
<field name="expense" class="java.lang.Integer"/>
<variable name="costForCar" class="java.lang.Integer" resetType="Group" resetGroup="carGroup" calculation="Sum">
<variableExpression><![CDATA[$F{cost}]]></variableExpression>
</variable>
<variable name="expenseForCar" class="java.lang.Integer" resetType="Group" resetGroup="carGroup" calculation="Sum">
<variableExpression><![CDATA[$F{expense}]]></variableExpression>
</variable>
<variable name="totalForCar" class="java.lang.Integer" resetType="Group" resetGroup="carGroup" calculation="Sum">
<variableExpression><![CDATA[$F{cost} - $F{expense}]]></variableExpression>
</variable>
<variable name="total" class="java.lang.Integer" resetType="Report" calculation="Sum">
<variableExpression><![CDATA[$F{cost} - $F{expense}]]></variableExpression>
</variable>
<group name="carGroup">
<groupExpression><![CDATA[$F{car}]]></groupExpression>
<groupFooter>
<band height="15">
<textField>
<reportElement x="0" y="0" width="100" height="15" />
<textFieldExpression><![CDATA[$F{car}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="110" height="15" />
<textFieldExpression><![CDATA[$V{costForCar}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="210" y="0" width="110" height="15" />
<textFieldExpression><![CDATA[$V{expenseForCar}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="320" y="0" width="110" height="15" />
<textFieldExpression><![CDATA[$V{totalForCar}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="430" y="0" width="110" height="15" />
<textFieldExpression><![CDATA[$V{total}]]></textFieldExpression>
</textField>
</band>
</groupFooter>
</group>
<columnHeader>
<band height="15" splitType="Stretch">
<staticText>
<reportElement x="0" y="0" width="100" height="15" />
<textElement textAlignment="Center"/>
<text><![CDATA[Car]]></text>
</staticText>
<staticText>
<reportElement x="100" y="0" width="110" height="15" />
<textElement textAlignment="Center"/>
<text><![CDATA[Cost]]></text>
</staticText>
<staticText>
<reportElement x="210" y="0" width="110" height="15" />
<textElement textAlignment="Center"/>
<text><![CDATA[Expense]]></text>
</staticText>
<staticText>
<reportElement x="320" y="0" width="110" height="15" />
<textElement textAlignment="Center"/>
<text><![CDATA[Total]]></text>
</staticText>
<staticText>
<reportElement x="430" y="0" width="110" height="15" />
<textElement textAlignment="Center"/>
<text><![CDATA[Total, cumulative]]></text>
</staticText>
</band>
</columnHeader>
</jasperReport>
借助详细信息频段和 textField 元素的 evaluationTime 属性,可以实现同样的效果。
Jaspersoft Studio(JSS)的结果: