5

这让我发疯.. 上一小时我试图弄清楚为什么我的报告在我添加子报告后立即停止工作.. 我已经在这里这里这里检查并尝试了所有类似的问题。没有成功..子报表肯定在同一目录中..定义如下:

<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>

$P{SUBREPORT_DIR} 在哪里"/valid/path/sub.report.jasper"

而且我仍然收到错误消息:Resource not found at /valid/path/sub.report.jasper

为什么??

4

4 回答 4

8

在第一条消息中,作者说:

$P{SUBREPORT_DIR}/valid/path/sub.report.jasper”在哪里

$P{SUBREPORT_DIR}目录,但不是文件名。这是第一个错误。

第二种:有时jasper找不到子报表,连路径都正确。

解决这个问题的方法:

  1. 传入报表(本例中:“ ”),将此参数放入$P{SUBREPORT_DIR}-标准方式将参数传入 jasper。/valid/path/HashMap<String, Object>
  2. $P{SUBREPORT_DIR} 从主报表传递到子报表作为参数:$P{SUBREPORT_DIR}主报表->$P{SUBREPORT_DIR}子报表(当存在子报表时使用此方式,从子报表调用)
  3. 在主报表中将表达式设置为子报表为$P{SUBREPORT_DIR}+“ sub.report.jasper
于 2013-09-09T08:25:21.713 回答
1

我之前遇到过这个问题。我的方法是 - 我在参数中发送绝对文件夹,比如 folder_path 。然后在我正在使用的子报告表达式中
new File(($P{folder_path} + "*.jasper" )
此 *.jasper 文件可以替换为"\\inner_folder\\*.jasper". 这完美地工作

于 2013-09-09T06:31:01.600 回答
0

这种情况时常发生在我身上,它始终是一个平台操作系统,它是决定某些代码为何有效而其他代码无效的关键决定因素。然而,一直有效的是相对引用而不是绝对引用。

我的建议是,如果 cjava 的解决方案不起作用,那就是找出 JasperReports 在磁盘上所做的事情。根据您的平台、*nix、Windows,您可能需要弄清楚 JasperReports 正在运行的系统调用以找到它正在使用的路径。在我的应用程序中,我发现即使我指定了以前有效的无路径引用,某些平台也会以不同的方式进行路径搜索并且无法找到报告。

关于如何解决系统调用的其他一些问题:

*nix - 追踪

strace java小程序

Windows - 进程监视器

在 Windows 上,如何找到给定进程正在使用的文件?有没有这样的软件?

Mac-DTruss

osx 的 ltrace 等价物?

祝你好运。

于 2013-09-09T07:10:13.213 回答
0

尝试从代码发送SUBREPORT_DIR参数。也许它丢失了...如果您使用 maven,请检查 pom.xml 中的资源目录标签并进行比较。

params.put("SUBREPORT_DIR", "reports/report/blablaFolder/");
于 2016-03-21T13:43:11.540 回答