Возврат значения из вложенного отчета в основной отчет в 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
, возвращаемая переменная не должна находиться в том же диапазоне, что и сам вложенный отчет.
аффектация делается, я думаю, в конце рендеринга группы.
поэтому добавьте другую полосу и используйте переменную внутри.