ВНИМАНИЕ: Я бы порекомендовал, чтобы все вычисления выполнялись в запросе sql, в вашем примере это может быть SELECT TYPE, COLOR, SUM(SQUAREFEET) AS SQUAREFEET FROM Item WHERE id IN (SELECT itemId FROM TempItem) GROUP BY TYPE, COLOR
.Это даст вам «плоский» источник данных, и вам не нужно добавлять группы, переменные и т. Д. В jasper-report, а также меньше извлекаемых данных, что сократит время выполнения отчета.В приведенном ниже примере для создания диаграммы с текущими данными с использованием групп и переменных предполагается, что ваши данные упорядочены по TYPE
и COLOR
(группировка в отчетах jasper работает, только если вы упорядочили данные)
Некоторые ключевые моменты / быстрые советы перед полным примером
Диаграмма должна идти в сводной полосе, подробная полоса выполняется для каждой записи, вместо этого мы хотим, чтобы 1 диаграмма для всех записей.
Ваша группа находится как в TYPE, так и в COLOR (когда одно из этих изменений приводит к созданию новой группы), поэтому выражение группировки должно быть примерно таким:
<group name="TYPE_COLOR">
<groupExpression><![CDATA[$F{TYPE}+"_"+$F{COLOR}]]></groupExpression>
</group>
Нам нужна переменная, которая собираетзначение нашей суммы (сбрасывается при смене группы), которое мы будем использовать в выражении значения серии категорий.
<variable name="SUM_SQUAREFEET" class="java.lang.Double" resetType="Group" resetGroup="TYPE_COLOR" calculation="Sum">
<variableExpression><![CDATA[$F{SQUAREFEET}]]></variableExpression>
</variable>
и нам нужно указать диаграмме, когда собирать данные (когда добавлять данные в диаграмму)
<dataset incrementType="Group" incrementGroup="TYPE_COLOR"/>
Полный 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="barChart" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4f80af00-8345-4feb-bd0c-5b0b3b2b6232">
<queryString language="SQL">
<![CDATA[select * from Item where id IN (select itemId from TempItem )]]>
</queryString>
<field name="TYPE" class="java.lang.String"/>
<field name="COLOR" class="java.lang.String"/>
<field name="SQUAREFEET" class="java.lang.Double"/>
<variable name="SUM_SQUAREFEET" class="java.lang.Double" resetType="Group" resetGroup="TYPE_COLOR" calculation="Sum">
<variableExpression><![CDATA[$F{SQUAREFEET}]]></variableExpression>
</variable>
<group name="TYPE_COLOR">
<groupExpression><![CDATA[$F{TYPE}+"_"+$F{COLOR}]]></groupExpression>
</group>
<summary>
<band height="267">
<bar3DChart>
<chart>
<reportElement x="90" y="10" width="581" height="257" uuid="bcbac117-a9ab-424c-ae81-6f68d1b01f0c"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<categoryDataset>
<dataset incrementType="Group" incrementGroup="TYPE_COLOR"/>
<categorySeries>
<seriesExpression><![CDATA[$F{COLOR}]]></seriesExpression>
<categoryExpression><![CDATA[$F{TYPE}]]></categoryExpression>
<valueExpression><![CDATA[$V{SUM_SQUAREFEET}]]></valueExpression>
</categorySeries>
</categoryDataset>
<bar3DPlot>
<plot/>
<itemLabel/>
<categoryAxisFormat>
<axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
</categoryAxisFormat>
<valueAxisFormat>
<axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
</valueAxisFormat>
</bar3DPlot>
</bar3DChart>
</band>
</summary>
</jasperReport>
Вывод