Как получить сумму на страницу столбца в компоненте таблицы и вернуться к основному отчету для отображения значения? - PullRequest
1 голос
/ 26 июня 2019

Недавно я начал работать с отчетом о яшме и столкнулся с некоторой проблемой.У меня есть таблица с записями, а также есть метка с текстовым полем, где я должен поместить сумму столбца на страницу.(Я добавил нижний колонтитул таблицы для отладки).Вот картинка: enter image description here

Я сделал это следующим образом: в таблицу добавляю переменную «сумма» со следующими свойствами: enter image description here enter image description here

Примечание: тип сброса - страница, потому что я должен отображать сумму на страницу .

В основной отчет я добавил переменную "sumPerList"согласно Как вернуть значение из источника данных таблицы в основной отчет в iReport? и попытался поиграть со временем оценки, но это не помогло (не имеет значения, какое время оценки я установил, значение равновсегда неправильно), я не мог отобразить в поле «Общая сумма Главная» то же значение, что и в поле «Общая сумма» (область видимости таблицы).Причина, по которой я решил отображать итоговую сумму отдельно от таблицы, потому что между ними пустое пространство, но я не могу добавить пустую строку в таблицу.Также я попытался установить здесь функцию суммирования: enter image description here enter image description here

Но это тоже не помогает.Может быть, есть другой способ сделать это?(Я использую TIBCO Jaspersoft® Studio 6.8.0 - Visual Designer для JasperReports 6.8.0.)

1 Ответ

1 голос
/ 26 июня 2019

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

Один (хакерский) способ сделать это - передать объект-держатель значениявложенный набор данных таблицы и запишите в таблицу выражение, которое устанавливает значение объекта в качестве побочного эффекта.

Вы можете использовать, например, AtomicInteger в качестве держателя значения, обратите внимание, что нам не нужноатомарность, и мы используем его только как изменяемое целое число.

Решение будет выглядеть примерно так:

  • В отчете есть переменная TableTotal, инициализированная как AtomicInteger
  • TableTotal передается в набор данных таблицы в качестве параметра с именем PageTotalHolder
  • В набор данных таблицы входит переменная с именем PageTotal (значение которой мы хотим отобразить в нижнем колонтитуле страницы)
  • В нижнем колонтитуле столбца таблицы мы используем выражение печати когда, которое устанавливает текущее значение PageTotal равным PageTotalHolder (и всегда возвращает значение true): $P{PageTotalHolder}.getAndSet($V{PageTotal}) >= Integer.MIN_VALUE
  • Нижний колонтитул страницы отчета показывает$V{TableTotal}.get()

Для удобства вставьте сюда полный JRXML.Вы можете запустить его в Jaspersoft Studio с помощью одной пустой записи.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.8.0.final using JasperReports Library version 6.8.0-2ed8dfabb690ff337a5797129f2cd92902b0c87b  -->
<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="Blank_A4_10" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f750af4c-d61b-4bdb-b537-6d71b6754832">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <style name="Table_TH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Table_CH" mode="Opaque" backcolor="#BFE1FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <subDataset name="Dataset1" uuid="8668793a-f800-4489-9589-c9b6d2ee97a0">
        <parameter name="PageTotalHolder" class="java.util.concurrent.atomic.AtomicInteger"/>
        <variable name="Value" class="java.lang.Integer">
            <variableExpression><![CDATA[(int) (10 + 10 * Math.sin($V{REPORT_COUNT}))]]></variableExpression>
        </variable>
        <variable name="PageTotal" class="java.lang.Integer" resetType="Page" calculation="Sum">
            <variableExpression><![CDATA[$V{Value}]]></variableExpression>
        </variable>
    </subDataset>
    <variable name="TableTotal" class="java.util.concurrent.atomic.AtomicInteger" calculation="System">
        <initialValueExpression><![CDATA[new java.util.concurrent.atomic.AtomicInteger()]]></initialValueExpression>
    </variable>
    <detail>
        <band height="203" splitType="Stretch">
            <componentElement>
                <reportElement x="0" y="0" width="200" height="200" uuid="657ddbb8-e98b-43de-be5e-10645069dc44"/>
                <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                    <datasetRun subDataset="Dataset1" uuid="2eb1dde6-8cf9-45c1-94ce-0bdcb26e120a">
                        <datasetParameter name="PageTotalHolder">
                            <datasetParameterExpression><![CDATA[$V{TableTotal}]]></datasetParameterExpression>
                        </datasetParameter>
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource(200)]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="120" uuid="51f2b0c5-0655-4cc3-8d57-75149a7514f6">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:columnHeader style="Table_CH" height="30"/>
                        <jr:columnFooter style="Table_CH" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="120" height="30" uuid="95a0ff6d-cab6-44df-9aa0-3e41774194e2">
                                    <printWhenExpression><![CDATA[$P{PageTotalHolder}.getAndSet($V{PageTotal}) >= Integer.MIN_VALUE]]></printWhenExpression>
                                </reportElement>
                                <textElement textAlignment="Right"/>
                                <textFieldExpression><![CDATA[$V{PageTotal}]]></textFieldExpression>
                            </textField>
                        </jr:columnFooter>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="120" height="30" uuid="c3ee39f0-59fd-47a3-8cba-90f009dc42ca"/>
                                <textElement textAlignment="Right"/>
                                <textFieldExpression><![CDATA[$V{Value}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </detail>
    <pageFooter>
        <band height="54" splitType="Stretch">
            <textField>
                <reportElement x="200" y="0" width="100" height="30" uuid="eb1905ee-50d5-4601-b8ed-62864e6caea5"/>
                <textFieldExpression><![CDATA[$V{TableTotal}.get()]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
</jasperReport>
...