【问题标题】:Returning a value from Sub Report to Main Report in iReport在 iReport 中将值从子报表返回到主报表
【发布时间】:2011-09-08 12:58:47
【问题描述】:

大家好,我正在使用 iReports 生成一份报告并停留在一个地方。

情况是这样的:

我在我的主报告中使用了一个子报告,我想在执行查询后将一个变量(浮点数)从子报告返回到主报告。而且我只是将空值返回到主报告中,我浪费了 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>

提前致谢..

【问题讨论】:

    标签: jasper-reports ireport


    【解决方案1】:

    虽然问题已经得到解答,但我想强调在主报告(调用子报告的报告)中的变量上使用calculation="System" 的重要性。

    我浪费了很多时间才弄明白...

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

    【讨论】:

      【解决方案2】:

      在子报表变量中,您有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。

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

      【讨论】:

        【解决方案3】:

        来自JasperReports Ultimate Guide

        来自子报表的值仅在打印包含子报表的整个波段时可用。如果您需要使用与子报表放置在同一波段中的文本字段打印此值,请将文本字段的评估时间设置为波段

        【讨论】:

          【解决方案4】:

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

          系统不计算,只设置为系统,或赋值为其他算子。

          nothing 不计算,只是设置变量。

          sum 执行 sum($Feild("A")).

          ....

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

          【讨论】:

            【解决方案5】:

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

            使用子报表returnValue 时,返回的变量不得与子报表本身在同一个带区。

            我认为在乐队渲染结束时做作。

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

            【讨论】:

            • 实际上,您可以在相同的详细信息波段中使用returnValue,至少从 6.4 开始。我目前使用它来控制乐队的外观(将returnValue设置为变量,然后使用printWhenExpression中的变量),以及控制textField的内容(同样,使用returnValue设置变量$V{something},用于textFieldExpression的逻辑,evaluationTime="Report"textField)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-03
            • 2015-04-11
            • 1970-01-01
            • 2010-10-14
            相关资源
            最近更新 更多