Jasper子报告的子报告 - 以编程方式

时间:2015-03-12 16:37:14

标签: jasper-reports

在网上有很多在Jasper中运行子报告的例子,但是当运行包含另一个子报告的子报告时,似乎没有人遇到过我的问题。 我们将报告定义存储在关系数据库中,并从Java服务生成并运行报告。我们只使用GUI来设计和测试每个报告。 报告在运行时进行编译和填充,我可以使用在报告表达式使用子报告时在填充时将已编译的子报告添加到主报告的详细记录功能,使子报告运行作为参数。 这一切都很好。但是,如何使用树下的下一个子报告的编译输出填充第一个子报告?

任何帮助将不胜感激

为了进一步解释,在JasperStudio中,我可以在主报告中做到这一点:

<subreport>
            <reportElement x="4" y="100" width="547" height="310" uuid="f9364882-a530-475d-97af-8d6d2d47ae57"/>
            <subreportParameter name="INSP_ID">
                <subreportParameterExpression><![CDATA[$F{jobid}]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
            <subreportExpression><![CDATA["InspectionFrogSubReport.jasper"]]></subreportExpression>
        </subreport>

然后在第一个子报告中,为了参考下一个,我可以这样做:

            <subreport>
            <reportElement x="280" y="56" width="270" height="294" uuid="b4cbe376-1b54-471c-a6d4-0d45afeab2c8"/>
            <subreportParameter name="FROG_ID">
                <subreportParameterExpression><![CDATA[$F{frog_id}]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
            <subreportExpression><![CDATA["InspectionDamageSubReport.jasper"]]></subreportExpression>
        </subreport>

所以,当我预览mian时,它会填充第一个sub,然后填充下一个sub,没问题。

但是,要从Java方法填充,我将主子报表表达式更改为:

<subreport>
            <reportElement x="4" y="100" width="547" height="310" uuid="f9364882-a530-475d-97af-8d6d2d47ae57"/>
            <subreportParameter name="INSP_ID">
                <subreportParameterExpression><![CDATA[$F{jobid}]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
            <subreportExpression><![CDATA["$P!{SUB1}"]]></subreportExpression>
        </subreport>

然后在我的代码中:

    // Compile sub report
InputStream childStream = new ByteArrayInputStream(subReport.getChildXml().getBytes());
JasperReport compiledChild = JasperCompileManager.compileReport(childStream);
// Compile Main report
InputStream xmlStream = new ByteArrayInputStream(report.getXml().getBytes());
JasperReport compiledReport = JasperCompileManager.compileReport(xmlStream);
// Build report parameter map
Map<String, Object> params = new HashMap<>();
params.put("SUB1", compiledChild);
// Fill main report
JasperPrint jasperPrint = JasperFillManager.fillReport(compiledReport, params, conn);
到目前为止,这么好。但是,如何将子子报告传递到子报告中。我不能使用&#39; fillReport&#39;因为子报告在主报告运行之前不会有主记录。

1 个答案:

答案 0 :(得分:0)

将子SubReport作为param传递给subReport。 在java代码中:

params.put("SUB_SUB_REPORT", compiledSubSubreport);
主报告模板xml中的

<subreportParameter name="SUB_SUB_REPORT">
    <subreportParameterExpression><![CDATA[$P{SUB_SUB_REPORT}]]></subreportParameterExpression>
</subreportParameter>

这是你想要的吗?