如何从 java 代码 JasperReports 将参数传递给子子报表
How to pass parameters to sub subreports from java code JasperReports
我在尝试弄清楚如何从 java 代码将参数传递给 jasperreports 中的子子报表时遇到严重问题。
我所说的层次结构如下所示:
mainReport
----------------> subReport
----------------------------> subSubReport
到目前为止,我尝试将 subSubReport 中所需的参数传递给 mainReport,然后从那里传递给 subReport 并从那里到 subSubReport 但这不起作用。事实上,我确实得到了一个 pdf 文件,其中包含 mainReport 和 subReport 的内容,但 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>
我在尝试弄清楚如何从 java 代码将参数传递给 jasperreports 中的子子报表时遇到严重问题。
我所说的层次结构如下所示:
mainReport
----------------> subReport
----------------------------> subSubReport
到目前为止,我尝试将 subSubReport 中所需的参数传递给 mainReport,然后从那里传递给 subReport 并从那里到 subSubReport 但这不起作用。事实上,我确实得到了一个 pdf 文件,其中包含 mainReport 和 subReport 的内容,但 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>