JasperReports: Can't locate subreport

nKognito picture nKognito · Sep 6, 2013 · Viewed 18.1k times · Source

It's drives me crazy.. Last hour I am trying to figure out why my report stopped to worked right after I added a subreport to it.. I already checked and tried all similar issues here, here and here. Without success.. Subreport is in the same directory for sure.. The definition looks like:

<subreport isUsingCache="false">
                <reportElement uuid="db816b3c-a13d-440f-a6a2-f899762e61e4" x="0" y="89" width="555" height="100"/>
                <subreportParameter name="footerAddress">
                    <subreportParameterExpression><![CDATA[$P{footerAddress}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="footerManager">
                    <subreportParameterExpression><![CDATA[$P{footerManager}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="footerContact">
                    <subreportParameterExpression><![CDATA[$P{footerContact}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="footerBank">
                    <subreportParameterExpression><![CDATA[$P{footerBank}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{SUBREPORT_DIR}]]></subreportExpression>
            </subreport>

Where $P{SUBREPORT_DIR} is "/valid/path/sub.report.jasper"

And I still getting an error: Resource not found at /valid/path/sub.report.jasper

WHY??

Answer

sanBez picture sanBez · Sep 9, 2013

In first message author says:

Where $P{SUBREPORT_DIR} is "/valid/path/sub.report.jasper"

$P{SUBREPORT_DIR} is a directory, but not a filename. It is the first error.

The second: sometimes jasper can't find subreport, even the path is correct.

The way for solving this problem:

  1. Pass $P{SUBREPORT_DIR} into main report (In this case: "/valid/path/"), put this parameter into a HashMap<String, Object> - standard way pass parameters into jasper.
  2. Pass $P{SUBREPORT_DIR} from main report into subreport as parameter: $P{SUBREPORT_DIR} main report -> $P{SUBREPORT_DIR} of subreport (this way used when exist subsubreport, which calling from subreport)
  3. In main report set expression to subreport as $P{SUBREPORT_DIR} + "sub.report.jasper"