【问题标题】:How to pass parameters to sub subreports from java code JasperReports如何从 java 代码 JasperReports 将参数传递给子子报表
【发布时间】:2017-02-13 18:26:37
【问题描述】:

我在试图弄清楚如何从 java 代码中将参数传递给 jasperreports 中的子子报表时遇到了严重的问题。

我所说的层次结构如下所示:

主报告

-------------> subReport

---------------> subSubReport

到目前为止,我尝试将 subSubReport 中所需的参数传递给 ma​​inReport 并从那里将其传递给 subReport 并从subSubReport 那里,但这不起作用。事实上,我确实得到了一个包含 ma​​inReportsubReport 内容的 pdf 文件,但 subSubReport 的内容没有显示。这就是为什么我猜我的问题是我不应该将 subSubReport 的参数(更具体地说是 SUBREPORT_DIR)传递给 ma​​inReport 而是传递给 subReport 这就是我不知道如何实现的。此外,网络上关于它的信息很少(且不完整)。

有人可以帮帮我吗?

ma​​inReport代码

<subreport>
                <reportElement key="" x="0" y="0" width="554" height="30" isRemoveLineWhenBlank="true" uuid="18ff5513-835d-4910-b39c-6d41252b4679"/>
                <subreportParameter name="REPORT_CONNECTION">
                    <subreportParameterExpression><![CDATA[$P{REPORT_CONNECTION}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="REPORT_DATA_SOURCE">
                    <subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="SUBREPORT_DIR">
                    <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="SUBREPORT1LEVEL1">
                    <subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL1}]]></subreportParameterExpression>
                </subreportParameter>
                <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                <subreportExpression><![CDATA[$P{SUBREPORT1LEVEL1}]]></subreportExpression>
</subreport>

子报告代码

<subreport>
                <reportElement x="50" y="10" width="457" height="40" uuid="4528914e-bb9a-4300-8173-14be2ff2db85"/>
                <subreportParameter name="REPORT_CONNECTION">
                    <subreportParameterExpression><![CDATA[$P{REPORT_CONNECTION}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="REPORT_DATA_SOURCE">
                    <subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="SUBREPORT_DIR">
                    <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="SUBREPORT1LEVEL2">
                    <subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL2}]]></subreportParameterExpression>
                </subreportParameter>
                <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                <subreportExpression><![CDATA[$P{SUBREPORT1LEVEL2}]]></subreportExpression>
            </subreport>

【问题讨论】:

    标签: java jasper-reports subreport


    【解决方案1】:

    目前,您正在使用等于自身的参数设置每个报告级别,而不是向下传递。

    您需要做的是从上面的级别为每个级别的子报告传递参数,例如如果顶层有参数,则需要通过关联的子报表参数将其传递给子层,然后将此层的参数传递给子子报表,即下一层。

    例如,假设我们要从顶层到底层传递一个布尔服务器检查参数,每个报表级别都有参数“IsOnserver”、“IsOnserverL1”和“IsOnserverL2”。在主报告级别,我们会这样:

    <parameter name="IsOnServer" class="java.lang.Boolean">
        <defaultValueExpression><![CDATA[true]]></defaultValueExpression>
    </parameter>
    

    对于下一个级别(子报告),我们将执行以下操作,用主报告参数的值填充它:

    <parameter name="IsOnServerL1" class="java.lang.Boolean">
        <defaultValueExpression><![CDATA[$P{IsOnServer}]]></defaultValueExpression>
    </parameter>
    

    对于您的第三级和最后一级参数(子子报告),我们将传递子报告参数值:

    <parameter name="IsOnServerL2" class="java.lang.Boolean">
        <defaultValueExpression><![CDATA[$P{IsOnServerL1}]]</defaultValueExpression>
    </parameter>
    

    这将导致主报告参数正确地向下传递。

    【讨论】:

    • 嗨@philipbrien,你的回答奏效了!非常感谢!现在我只需要在 java xD 上编写这种行为
    • 没问题,很高兴它有帮助。
    • 再问一个问题,当我的 SUBREPORT_DIR 对于每个子报表都是唯一的时会发生什么?例如:当它们存储在数据库中并且每个寄存器描述一个报告/子报告时,这里我不能说 defaultValueExpression 与主报告相同,对吗?在这种情况下,您将如何解决?
    • 没有看到确切的结构很难说,但可以应用相同的原理。给我几分钟,我会发布一个单独的答案,显示一个可能的解决方案。
    【解决方案2】:

    在顶层,您将设置并传递初始参数,如下所示:

    --set all parameters at top level
    <parameter name="SUBREPORT_DIR0" class="java.lang.String">
        <defaultValueExpression><![CDATA["level0Dir"]]></defaultValueExpression>
    </parameter>
    <parameter name="SUBREPORT_DIR1" class="java.lang.String">
        <defaultValueExpression><![CDATA["level1Dir"]]></defaultValueExpression>
    </parameter>
    <parameter name="SUBREPORT_DIR2" class="java.lang.String">
        <defaultValueExpression><![CDATA["level2Dir"]]></defaultValueExpression>
    </parameter>
    --
    -- pass parameters to level 1
    <subreportParameter name="SUBREPORT_DIR1">
        <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR1}]]></subreportParameterExpression>
    </subreportParameter>
    <subreportParameter name="SUBREPORT_DIR2">
        <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR2}]]></subreportParameterExpression>
    </subreportParameter>
    

    对于级别 1,您将设置并传递下一组参数:

    --set parameters at level 1
    <parameter name="SUBREPORT_DIR1" class="java.lang.String">
        <defaultValueExpression><![CDATA[CDATA[$P{SUBREPORT_DIR1}]]></defaultValueExpression>
    </parameter>
    <parameter name="SUBREPORT_DIR2" class="java.lang.String">
        <defaultValueExpression><![CDATA[CDATA[$P{SUBREPORT_DIR2}]]></defaultValueExpression>
    </parameter>
    
    --
    -- pass parameter to level 2
    <subreportParameter name="SUBREPORT_DIR2">
        <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR2}]]></subreportParameterExpression>
    </subreportParameter>
    

    对于最终级别,您将设置剩余的传递参数:

    -- set parameter at level 2
    <parameter name="SUBREPORT_DIR2" class="java.lang.String">
        <defaultValueExpression><![CDATA[CDATA[$P{SUBREPORT_DIR2}]]></defaultValueExpression>
    </parameter>
    

    【讨论】:

    • 所以,如果我理解正确,在你的解释下,我必须将 subReports 中需要的所有参数传递给 mainReport,它将是负责“传递“它到子报告中,对吧?我试图实现一种递归方法,试图为每个报告(subReport/subSubReport)分配特定参数的值(例如:SUBREPORT_DIR1 到一级等),但它并没有完全起作用。我会试试这个,将所有参数分配给 mainReport 并像你展示的那样定义 xml。感谢您的帮助,我认为这个答案对很多人都会很有帮助!
    • 是的,可能有更聪明的方法来做到这一点,但这似乎是最明显和最快的实施方式。
    • 我第一次尝试了你建议的这个,但是从 java 代码实现它有点棘手(至少对我来说,对 JR 的工作原理不太了解)并且没有太多信息(几乎没有)关于如何做到这一点或这是java的最佳方式。我什至在尝试时在这里发布了一个问题:link ...但显然没有多少人使用 JR。现在的问题是,哪种方法最好(最快)? PS:这首先应该是我的问题
    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2012-11-23
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多