在iReport中将子报表中的值返回到主报表

时间:2011-09-08 12:58:48

标签: jasper-reports ireport

大家好我每个人都在使用iReports生成其中一个报告而且卡在一个地方。

情况是这样的:

我在主报表中使用了一个子报表,并且我希望在执行查询后将变量(浮点数)从子报表返回到主报表。而我只是将空值返回主报告我已经浪费了2天谷歌搜索和搜索但问题仍然存在..

bellow是我的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 个答案:

答案 0 :(得分:7)

虽然这个问题已经得到解答,但我想强调在主要报告(调用SubReport的报告)中对变量进行calculation="System"的重要性。

在弄清楚之前我浪费了很多时间......

在上面的主要报告JRXML的虚拟代码中,变量“A”正确地具有calculation="System"。注意:@GenericJon的答案涵盖了 SubReport 中的变量。

答案 1 :(得分:6)

在子报表变量中,您有calculation=System。当您使用scriptlet自己计算变量时,应该使用此方法。您没有在报告中附加适当的scriptlet,因此永远不会计算变量。

您可能希望更改变量定义,以便在子报表的开头计算它,如下所示:

<variable name="A" class="java.lang.Integer" resetType="Report" calculation="Nothing">
    <variableExpression><![CDATA[$F{sum}]]></variableExpression>
</variable>
在报告运行时,

resetType="Report"永远不会重置变量。 calculation="Nothing"将为数据集中的每一行评估variableExpression。

但是这些属性可以省略,因为它们是使用的默认值。然后,您应该发现变量已正确初始化。

答案 2 :(得分:4)

来自JasperReports Ultimate Guide

  

仅当打印包含子报表的整个波段时,才会显示来自子报表的值。如果需要使用与子报表位于同一波段的文本字段打印此值,请将文本字段的评估时间设置为波段

答案 3 :(得分:1)

我同意@ bubba_hego99,计算类型如下:

系统没有计算,只需设置为系统,或者作为其他运算符进行估算。

没有任何计算,只需设置变量。

总和执行总和($ Feild(“A”))。

...

你想知道其他计算的细节,你应该看到ireport文件。

答案 4 :(得分:1)

注意,在早期版本的JasperReports中:

  

使用子报表returnValue时,返回的变量不得与子报表本身位于同一波段。

我认为在乐队的渲染结束时完成了做法。

所以添加另一个乐队并在里面使用你的变量。