寻找JasperStudio xml子数据源的工作示例

时间:2016-04-02 01:37:51

标签: xml jasper-reports

我在这里和Jasper一起搜索过,找不到使用xml子数据源的可下载的工作示例。我理解有关必须演员等问题,但我不熟悉Jasper知道我做错了什么,各处都有各种各样的音符。所以如果我的XML看起来像......

<a>
    <b>
    <c>
       <d>
       <e>
    </c>
    <f>
</a>

我可以轻松地在/ a上创建一个提供b和f的父报告。但是我使用subdatasource(on / a / c)构建子报告的所有尝试都失败了。如果有人有一个很简单的工作,我会非常感激,因为我真的无法在网上找到一个有效的例子 - 即使Jasper 6.2示例代码是使用不同的机制构建的。

1 个答案:

答案 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中确保:

  • 删除CustomerID参数
  • 您的XPATH查询如下所示:<queryString language="xPath"><![CDATA[Orders]]></queryString>

重要提示: 在这种情况下,我使用了JRXmlDataSource的dataSource(expr)方法,因为Customers和Orders是XML文件中的兄弟。 如果订单是每个客户(嵌套在客户中),我可能会使用subDataSource("Orders")方法。