Возврат значения из подотчета в основной отчет в iReport - PullRequest
10 голосов
/ 08 сентября 2011

Привет всем, я использую iReports для создания одного из отчетов и застрял в одном месте.

Ситуация такая:

Я использую один подчиненный отчет в своем основном отчете и хочу вернуть переменную (float) обратно в основной отчет из подчиненного отчета после выполнения запроса. И я просто возвращаю нулевые значения в основной отчет. Я потратил 2 дня на поиск и поиск, но проблема все еще есть ...

ниже приведен мой фиктивный код моего JRXMLS (абсолютно такой же) и снимки ...

Основной отчет 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="anuj" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <property name="ireport.zoom" value="1.0"/>
        <property name="ireport.x" value="0"/>
        <property name="ireport.y" value="0"/>
        <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
            <defaultValueExpression><![CDATA["/home/anuj/Reports/"]]></defaultValueExpression>
        </parameter>
        <queryString language="SQL">
            <![CDATA[select * from "SensorType"]]>
        </queryString>
        <field name="SensorTypeId" class="java.lang.Integer"/>
        <field name="SensorTypeName" class="java.lang.String"/>
        <variable name="A" class="java.lang.Integer" resetType="None" calculation="System"/>
        <background>
            <band splitType="Stretch"/>
        </background>
        <title>
            <band splitType="Stretch"/>
        </title>
        <pageHeader>
            <band splitType="Stretch"/>
        </pageHeader>
        <columnHeader>
            <band splitType="Stretch"/>
        </columnHeader>
        <detail>
            <band height="23" splitType="Stretch">
                <textField>
                    <reportElement x="71" y="3" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{SensorTypeId}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="202" y="3" width="112" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{SensorTypeName}]]></textFieldExpression>
                </textField>
            </band>
        </detail>
        <columnFooter>
            <band height="5" splitType="Stretch"/>
        </columnFooter>
        <pageFooter>
            <band height="1" splitType="Stretch"/>
        </pageFooter>
        <summary>
            <band height="42" splitType="Stretch">
                <subreport>
                    <reportElement x="183" y="16" width="257" height="26"/>
                    <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                    <returnValue subreportVariable="A" toVariable="A"/>
                    <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "anuj_subreport1.jasper"]]></subreportExpression>
                </subreport>
                <textField>
                    <reportElement x="71" y="22" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$V{A}]]></textFieldExpression>
                </textField>
            </band>
        </summary>
    </jasperReport>

Подотчет 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="anuj_subreport1" language="groovy" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="149"/>
    <queryString>
        <![CDATA[select Sum("SensorTypeId") from "SensorType";]]>
    </queryString>
    <field name="sum" class="java.lang.Long"/>
    <variable name="A" class="java.lang.Integer" resetType="None" calculation="System">
        <variableExpression><![CDATA[$F{sum}]]></variableExpression>
    </variable>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="79" splitType="Stretch">
            <staticText>
                <reportElement x="169" y="59" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[sum]]></text>
            </staticText>
            <textField>
                <reportElement x="216" y="59" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{sum}]]></textFieldExpression>
            </textField>
        </band>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band height="61" splitType="Stretch"/>
    </columnHeader>
    <detail>
        <band height="125" splitType="Stretch"/>
    </detail>
        <columnFooter>
        <band height="45" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="42" splitType="Stretch"/>
    </summary>
</jasperReport>

Заранее спасибо ..

Ответы [ 5 ]

7 голосов
/ 29 ноября 2012

Хотя на этот вопрос уже дан ответ, я хотел бы подчеркнуть важность наличия calculation="System" для переменной в Основном отчете (отчете, вызывающем подотчет).

Я потратил много времени, прежде чем понять это ...

В фиктивном коде для основного отчета JRXML выше переменная "A" правильно имеет calculation="System". NB. Ответ @GenericJon охватывает переменную в SubReport .

6 голосов
/ 13 сентября 2011

В переменной подотчета у вас есть calculation=System. Это следует использовать, когда вы сами вычисляете переменную с помощью скриптлета. У вас нет соответствующего скриптлета, присоединенного к отчету, поэтому переменная никогда не вычисляется.

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

<variable name="A" class="java.lang.Integer" resetType="Report" calculation="Nothing">
    <variableExpression><![CDATA[$F{sum}]]></variableExpression>
</variable>

resetType="Report" никогда не будет сбрасывать переменную во время работы отчета. calculation="Nothing" будет оценивать выражение переменной для каждой строки в наборе данных.

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

4 голосов
/ 10 июня 2015

Из JasperReports Ultimate Guide :

Значение, полученное из подотчета, доступно только при печати всей полосы, содержащей подотчет.Если вам нужно напечатать это значение, используя текстовое поле, расположенное в той же полосе, что и ваш подотчет, установите время оценки текстового поля равным Band

1 голос
/ 05 июня 2014

Примечание, в более ранних версиях JasperReports:

При использовании подотчета returnValue возвращаемая переменная не должна быть в той же полосе, что и сам подотчет.

Аффект сделан, я думаю, в конце рендеринга группы.

Так что добавьте еще одну полосу и используйте вашу переменную внутри.

1 голос
/ 07 ноября 2013

Я согласен с @ bubba_hego99, тип расчета приведен ниже:

Система не рассчитана, просто установлена ​​как система или оценена как другой оператор.

ничего, нет расчета, просто установите переменную.

сумма выполнения сумма ($ Feild ("A")).

....

Подробности, которые вы хотите узнать о другой калькуляции, вы должны увидеть документ ireport.

...