【发布时间】:2019-11-16 19:24:03
【问题描述】:
网络上有很多在 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);
到目前为止,一切都很好。但是,如何将 sub-sub-report 传递到 sub-report 中。我不能使用“fillReport”,因为在主报告运行之前,子报告没有可处理的主记录。
【问题讨论】:
标签: jasper-reports