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

Jasper reports Jasper子报告的子报告-以编程方式,jasper-reports,Jasper Reports,在web上的Jasper中有许多运行子报表的示例,但是在运行包含另一个子报表的子报表时,似乎没有人遇到我遇到的问题。 我们将报告定义存储在关系数据库中,并通过java服务生成和运行报告。首先,我们只使用GUI来设计和测试每个报告。 这些报告是在运行时编译和填充的,我可以通过使用记录良好的功能,在填充时使用报告表达式将编译的子报告添加到主报告中,并将子报告用作参数,从而使子报告运行。 那很好。但是,如何用树下下下一个子报表的编译输出填充第一个子报表 为了进一步解释,在JasperStudio中,我

在web上的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>

所以,当我预览面时,它填充第一个子,然后填充下一个子,没问题

但是,为了从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);
//编译子报表
InputStream childStream=new ByteArrayInputStream(subReport.getChildXml().getBytes());
JasperReport compiledChild=jaspecompilemanager.compileReport(childStream);
//编写主要报告
InputStream xmlStream=newbytearrayinputstream(report.getXml().getBytes());
JasperReport compiledReport=jaspecompilemanager.compileReport(xmlStream);
//生成报表参数映射
Map params=新的HashMap();
参数put(“SUB1”,compiledChild);
//填写主报告
JasperPrint JasperPrint=JasperFillManager.fillReport(compiledReport,params,conn);

到目前为止,一切顺利。但是,如何将子报表传递到子报表中。我不能使用“fillReport”,因为在主报表运行之前,子报表将没有主记录可处理。

将子报表作为参数传递给Superport。 在java代码中:

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

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

这就是你想要的