user10931326
user10931326

Reputation: 929

How to refer to subreport in main Jasper report if no jasper file is generated?

In my Tomcat webapp I have a Java file that is responsible for loading and compiling Jasper jrxml files.

JasperReport jasperReport = reportMap.get(reportName);
if (jasperReport == null) {
    synchronized (reportMap) {
        jasperReport = reportMap.get(reportName);
        if (jasperReport == null) {
            InputStream in;
            if (reportName.contains("csv"))
                in = getClass().getClassLoader().getResourceAsStream(
                        "report/" + reportName + "_CSV.jrxml");
            else
                in = getClass().getClassLoader().getResourceAsStream(
                        "report/" + reportName + ".jrxml");
            JasperDesign design = JRXmlLoader.load(in);
            jasperReport = JasperCompileManager.compileReport(design);
            reportMap.put(reportName, jasperReport);
        }
    }
}
return jasperReport;

This has worked fine so far because the report templates I inherited don't have subreports, but the problem I'm facing now is that I'm developing a new report template, and its requirements necessitate the use of subreports.

These are the steps I've done so far:

  1. Created subreport.jrxml file in the same folder as all my other jrxml files - in this case, the report folder (i.e report/subreport.jrxml)

  2. Added the following parameter for the subreport in mainreport.jrxml:

<parameter name="SUBREPORT_DATA" class="java.util.List" isForPrompting="false">
    <parameterDescription><![CDATA[Subreport Data]]></parameterDescription>
</parameter>
  1. Added two subreport elements, one in the normal report detail band and the other in the no-data band:
<subreport>
    <reportElement x="20" y="150" width="410" height="60"/>
    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUBREPORT_DATA})]]></dataSourceExpression>
    <subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
</subreport>

To test whether the subreport is being displayed correctly, subreport.jrxml is all string stubs for now.

When I test this in my webapp, I get the following exception:

Caused by: net.sf.jasperreports.engine.JRException: Resource not found at : subreport.jasper
    at net.sf.jasperreports.repo.RepositoryUtil.getResource(RepositoryUtil.java:155) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.repo.RepositoryUtil.getReport(RepositoryUtil.java:126) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:317) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:347) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:275) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:473) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillNoData(JRVerticalFiller.java:2192) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:207) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
...

Obviously the subreport expression is wrong, but I don't know what I should change it to (report/subreport.jasper didn't work either.) - I did a quick search of my file system and it seems like no jasper file is being generated?

Upvotes: 0

Views: 361

Answers (1)

dada67
dada67

Reputation: 5093

If you know in advance the subreport that the main report is using, you can compile the subreport into a JasperReport object (using the same code as for the main report), pass the JasperReport object as a parameter and use the parameter in the subreport expression.

Something like this:

JasperReports subreport = compileReport("subreport.jrxml");
...
parameters.put("SUBREPORT", subreport);

In the report:

<parameter name="SUBREPORT" class="net.sf.jasperreports.engine.JasperReport" isForPrompting="false">
    <parameterDescription><![CDATA[Subreport]]></parameterDescription>
</parameter>
...
<subreportExpression><![CDATA[$P{SUBREPORT}]]></subreportExpression>

Upvotes: 0

Related Questions