Возврат значения из вложенного отчета в основной отчет в iReport

Привет всем я использую 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>

Sub Report 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 ответов


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

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

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

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

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


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

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

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


с JasperReports Ultimate Guide:

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


Я согласен с @bubba_hego99, типом расчета, как показано ниже:

system нет caculation, просто установите как system или valued как другой оператор.

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

sum execute sum($Feild("A")).

....

деталь вы хотите знать другое caculation, вы должны быть увидеть документ ireport.


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

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

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

поэтому добавьте другую полосу и используйте переменную внутри.