如何从 java 代码 JasperReports 将参数传递给子子报表

How to pass parameters to sub subreports from java code JasperReports

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

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

mainReport

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

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

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

有人可以帮我吗?

主要报告代码

<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>

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

您需要做的是为sub-report的每个级别传递上一级的参数,例如如果您在顶层有一个参数,您需要通过关联的 sub-report 参数将其传递给 sub-level,然后将此级别的参数传递给子 sub-report 即下一个降级。

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

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

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

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

对于您的第 3 级也是最后一级参数(sub-sub-report),我们将传递 sub-report 参数值:

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

这将导致主要报表参数正确传递到线路中。

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

--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>