要将 subDataSource 传递给子报表,您需要向其添加数据源表达式。
此表达式通常是对 JRXmlDataSource 的 API 方法之一的调用:dataSource([...]) 或 subDataSource([...]),如此处的 javadoc 中所述:http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JRXmlDataSource.html#method_summary
您可以手动或在 JasperSoft Studio (JSS) 的帮助下添加/编辑数据源表达式。在这两种情况下,假设您已经从 XML 中迭代“a”类型节点。
使用 JSS 时,只需使用此表达式编辑子报表属性“数据源表达式”:
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE})
.subDataSource("/c")
如果您从报表的高级属性中导入报表中的类,则表达式可以更短,通常在此路径上:杂项 > 导入
如果您选择手动执行此操作,那么您的 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 中确保:
- 您删除了 CustomerID 参数
- 您的 XPATH 查询如下所示:
<queryString language="xPath"><![CDATA[Orders]]></queryString>
重要提示:
在本例中,我使用了 JRXmlDataSource 的 dataSource(expr) 方法,因为客户和订单是 XML 文件中的兄弟。
如果订单是针对每个客户的(嵌套在客户中),我可能会使用 subDataSource("Orders") 方法。