我在这里和Jasper一起搜索过,找不到使用xml子数据源的可下载的工作示例。我理解有关必须演员等问题,但我不熟悉Jasper知道我做错了什么,各处都有各种各样的音符。所以如果我的XML看起来像......
<a>
<b>
<c>
<d>
<e>
</c>
<f>
</a>
我可以轻松地在/ a上创建一个提供b和f的父报告。但是我使用subdatasource(on / a / c)构建子报告的所有尝试都失败了。如果有人有一个很简单的工作,我会非常感激,因为我真的无法在网上找到一个有效的例子 - 即使Jasper 6.2示例代码是使用不同的机制构建的。
答案 0 :(得分:2)
要将subDataSource传递给子报表,您需要向其添加数据源表达式。
此表达式通常是对JRXmlDataSource的一个API方法的调用:dataSource([...])
或subDataSource([...])
,如javadoc中所述:http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JRXmlDataSource.html#method_summary
您可以手动或在JasperSoft Studio(JSS)的帮助下添加/编辑数据源表达式。在这两种情况下,我们都假设你已经在迭代了#34; a&#34;从XML中键入节点。
使用JSS时,只需编辑子报表属性&#34;数据源表达式&#34;用这个表达式:
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE})
.subDataSource("/c")
如果您从报表的高级属性中导入报表中的类,则表达式可以更短,通常在此路径中:Misc&gt;进口
如果您选择手动执行此操作,那么您应该在JRXML中使用类似的内容:
<jasperReport ...>
<import value="net.sf.jasperreports.engine.data.JRXmlDataSource"/>
...
<subreport>
<reportElement .../>
<dataSourceExpression><![CDATA[
((JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/c")
]]></dataSourceExpression>
<subreportExpression><![CDATA["path/to/subreport"]]></subreportExpression>
</subreport>
...
</jasperReport>
通过一些修改,您可以让JasperReports xmldatasource示例使用子数据源:
步骤#1。确保CustomersReport.jrxml仅包含子报表部分的以下代码:
<subreport>
<reportElement isPrintRepeatedValues="false" x="5" y="25" width="507" height="20" isRemoveLineWhenBlank="true" backcolor="#FFCC99" uuid="e7de82f1-2e1c-4459-bef3-307e57903e0b"/>
<dataSourceExpression><![CDATA[
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("/Northwind/Orders[CustomerID='" + $F{CustomerID} + "']")
]]></dataSourceExpression>
<subreportExpression><![CDATA["OrdersReport.jasper"]]></subreportExpression>
</subreport>
步骤#2。在OrdersReport.jrxml中确保:
<queryString language="xPath"><![CDATA[Orders]]></queryString>
重要提示:
在这种情况下,我使用了JRXmlDataSource的dataSource(expr)
方法,因为Customers和Orders是XML文件中的兄弟。
如果订单是每个客户(嵌套在客户中),我可能会使用subDataSource("Orders")
方法。