Jasper子报表在嵌入Title属性时仅显示JSON数据源中的一个条目

我在主报表的标题区域中的子报表中填充数据时遇到问题。 数据在主报表的详细信息区域中的子报表中正确填充。 我试图找到JSON查询中可能出错的地方。 任何帮助表示赞赏。

在此处输入图像描述

JSON示例数据源(expenses.json)

{ "expenses": { "date": "8 Sep 2016", "accounts": [ { "title": "XYZ Corp (111)", "accountName": "XYZ Corp", "accountNumber": "111", "transactions": [ { "date": "21 Jun 2016", "name": "gas", "price": "17.50" }, { "date": "12 May 2016", "name": "shopping", "price": "111.99" }, { "date": "30 Apr 2016", "name": "movies", "price": "7.50" } ] }, { "title": "ABC Corp (222)", "accountName": "ABC Corp", "accountNumber": "222", "transactions": [ { "date": "2 Jun 2016", "name": "coffee", "price": "3.25" }, { "date": "21 May 2016", "name": "tea", "price": "1.90" }, { "date": "20 Apr 2016", "name": "juice", "price": "4.50" } ] } ] } } 

主要报告(main.jrxml)

                                                     

Subreport1(sub1.jrxml)

                       <font />                                                       

Subreport2(sub2.jrxml)

                                                                                         

PDF使用Jasper Reports 6.3.0 Java API生成。

 import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.query.JsonQueryExecuterFactory; import net.sf.jasperreports.engine.util.JRLoader; import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; public class JasperTest { public static void main(String[] args) throws Exception { JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile("/Users/arul/JaspersoftWorkspaceV2/reports/main.jasper"); Map jasperParameters = new HashMap(); jasperParameters.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, new FileInputStream("/Users/arul/JaspersoftWorkspaceV2/data/expenses.json")); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, jasperParameters); JasperExportManager.exportReportToPdfFile(jasperPrint, "report.pdf"); } } 

您将深入了解最初的json查询

    

Date超出范围。

解决方案是保持费用范围

    

您将使用subDataSource("accounts")表达式调用子报表1( sub1.jasper

  

但是,您现在只有1个详细的乐队记录(费用),要解决此问题,您可以引入另一个子报表。

而不是直接调用子报表2引入子报表1_2( sub1_2.jasper )再次在帐户subDataSource("accounts")上进行迭代,这将显示标题并包含子报表2( sub2.jasper )和事务上的数据源.subDataSource("transactions")


主要报告( main.jrxml

              <band height="71" splitType="Stretch"> <statictext> <reportelement x="2" y="0" width="201" height="16" uuid="2e947a01-8b6b-4169-beaa-6b2dac0d4141"></reportelement> <text><![CDATA[Expense Report]]></text> </statictext> <subreport> <reportelement x="2" y="44" width="550" height="22" uuid="1d364987-9047-4660-bd58-8a2bcfc8493d"></reportelement> <datasourceexpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("accounts")]]></datasourceexpression> <subreportexpression><![CDATA["sub1.jasper"]]></subreportexpression> </subreport> <textfield> <reportelement x="442" y="0" width="100" height="16" uuid="1cfbe11b-4f85-4bad-9280-d8712b80a65c"></reportelement> <textfieldexpression><![CDATA[$F{date}]]></textfieldexpression> </textfield> <statictext> <reportelement x="410" y="1" width="31" height="15" uuid="ee159651-5d7b-4e0e-a52a-cb71338891cc"></reportelement> <text><![CDATA[Date: ]]></text> </statictext> </band>            

子报告1_2( sub1_2.jasper

                       

子报告1和2( sub1.jrxmlsub2.jrxml

没有变化


结果

产量