【问题标题】:Looking for a working example of JasperStudio xml subdatasource寻找 JasperStudio xml 子数据源的工作示例
【发布时间】:2016-04-02 01:37:50
【问题描述】:

我已经在这里和 Jasper 搜索过,但找不到使用 xml 子数据源的可下载的工作示例。我了解有关必须投射等的问题,但对 Jasper 不够熟悉,无法知道我做错了什么,到处都是各种笔记。因此,如果我的 XML 看起来像...

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

我可以轻松地对提供 b 和 f 的 /a 进行父级报告。但是我所有使用子数据源(在 /a/c 上)构建子报告的尝试都失败了。如果有人有一个非常简单并且可以工作的人,我将不胜感激,因为我在网上找不到一个工作示例——即使是 Jasper 6.2 示例代码也是使用不同的机制构建的。

【问题讨论】:

    标签: xml jasper-reports


    【解决方案1】:

    要将 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 查询如下所示:&lt;queryString language="xPath"&gt;&lt;![CDATA[Orders]]&gt;&lt;/queryString&gt;

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

    【讨论】:

    • Narcis - 谢谢你,但它对我不起作用 - 因此请求一个工作示例。
    • 我的一个困惑是文档暗示 subDataSource 引用应该是(在我的情况下)“预订/客户”,但它也说它基于当前 XML 节点,这是一个预订节点所以也许它应该只是“客户”(根据您的示例),但如果是这种情况,为什么需要根据您的最后一句话使用 [booking_id= 进行限定。
    • 你说得对,我的回答有些混乱。我添加了一些小的说明并更正了答案和示例的 subDataSource API 调用。谢谢
    猜你喜欢
    • 2020-11-11
    • 2019-04-28
    • 2022-01-20
    • 2022-11-07
    • 2023-01-09
    • 2016-12-09
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多