Как отображать суммы сумм в 3D-гистограммах Jasper Reports? - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь создать трехмерную гистограмму, которая группирует по типу и показывает сумму значений в квадратных футах для каждого типа. Я не мог заставить столбцы показывать сумму квадратных футов для каждого типа для каждого цвета. Вместо этого он, кажется, показывает значение последних квадратных футов, когда существует более одного значения квадратных футов для одного типа и цвета.

data

current chart

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 6.6.0  -->
<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">
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="hsqlCon"/>
    <queryString language="SQL">
        <![CDATA[select * from Item where id IN (select itemId from TempItem )]]>
    </queryString>
    <field name="COLOR" class="java.lang.String">
        <property name="com.jaspersoft.studio.field.label" value="COLOR"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="ITEM"/>
    </field>
    <field name="SQUAREFEET" class="java.lang.Double">
        <property name="com.jaspersoft.studio.field.label" value="SQUAREFEET"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="ITEM"/>
    </field>
    <field name="TYPE" class="java.lang.String">
        <property name="com.jaspersoft.studio.field.label" value="TYPE"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="ITEM"/>
    </field>
    <group name="TYPE">
        <groupExpression><![CDATA[$F{TYPE}]]></groupExpression>
    </group>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="79" splitType="Stretch"/>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <detail>
        <band height="257" splitType="Stretch">
            <bar3DChart>
                <chart evaluationTime="Report">
                    <reportElement x="139" y="0" width="581" height="257" uuid="f2ceb018-5078-4aeb-90df-125419604d39"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <categoryDataset>
                    <categorySeries>
                        <seriesExpression><![CDATA[$F{COLOR}]]></seriesExpression>
                        <categoryExpression><![CDATA[$F{TYPE}]]></categoryExpression>
                        <valueExpression><![CDATA[SUM($F{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>
    </detail>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
</jasperReport>

1 Ответ

0 голосов
/ 02 января 2019

ВНИМАНИЕ: Я бы порекомендовал, чтобы все вычисления выполнялись в запросе 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>

Вывод

output

...