When using an abstract report and content pages plus a bean collection as a data source the first element of the collection is skipped
Has someone stumbled upon the same problem? I've tried multiple things and read quite a few posts here and in the Jasper Reports community without success
Code of the abstract book (main):
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Abstract_refactored" pageWidth="595" pageHeight="842" sectionType="Part" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" uuid="d2716064-8ae4-40cf-a575-33afba400e3a">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<property name="net.sf.jasperreports.print.create.bookmarks" value="true"/>
<property name="com.jaspersoft.studio.book.group.cover.header" value="Cover and Table of Contents"/>
<property name="com.jaspersoft.studio.book.group.cover.footer" value="Backcover"/>
<parameter name="ubersichtCollectionRefactored" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" evaluationTime="Early">
<defaultValueExpression><![CDATA["/Users/Beer/JaspersoftWorkspace/MyReports/"]]></defaultValueExpression>
</parameter>
<parameter name="CollectionBeanParam" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
<group name="cover"/>
<detail>
<part evaluationTime="Now" uuid="6b9e8284-92b6-4004-a896-77e6650f3afa">
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd" usingCache="false">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{ubersichtCollectionRefactored}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="ubersichtCollectionRefactored">
<subreportParameterExpression><![CDATA[$P{ubersichtCollectionRefactored}]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "ubersicht_refactored.jasper"]]></subreportExpression>
</p:subreportPart>
</part>
<part uuid="3bbe9fbc-42db-4b15-8120-416514e99d4c">
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="CollectionBeanParam">
<subreportParameterExpression><![CDATA[$P{CollectionBeanParam}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{CollectionBeanParam}]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "investmentcosts.jasper"]]></subreportExpression>
</p:subreportPart>
</part>
</detail>
</jasperReport>
Content page:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="investmentcosts" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="febeabfd-a22b-490f-8e0b-ff52efdc9ffa">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<style name="Table_TH" mode="Opaque" backcolor="#F0F8FF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Table_CH" mode="Opaque" backcolor="#BFE1FF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<subDataset name="investmentCostDataset" uuid="1fe5fdcb-a4b2-4546-bd90-2f5578170233">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<field name="product" class="java.lang.String"/>
<field name="quantity" class="java.lang.Integer"/>
<field name="cost" class="java.lang.String"/>
</subDataset>
<parameter name="CollectionBeanParam" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
<detail>
<band height="257" splitType="Stretch">
<componentElement>
<reportElement x="0" y="10" width="524" height="150" uuid="5922b981-1b64-4daa-b492-c1b03192d003">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
<property name="com.jaspersoft.studio.table.style.table_header" value="Table_TH"/>
<property name="com.jaspersoft.studio.table.style.column_header" value="Table_CH"/>
<property name="com.jaspersoft.studio.table.style.detail" value="Table_TD"/>
</reportElement>
<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" whenNoDataType="AllSectionsNoDetail">
<datasetRun subDataset="investmentCostDataset" uuid="9d4a3bba-0367-4a02-9a12-5d69ea0f77c8">
<datasetParameter name="REPORT_DATA_SOURCE">
<datasetParameterExpression><![CDATA[$P{CollectionBeanParam}]]></datasetParameterExpression>
</datasetParameter>
<dataSourceExpression><![CDATA[$P{CollectionBeanParam}]]></dataSourceExpression>
</datasetRun>
<jr:column width="260" uuid="7e3b0b3c-03c7-438d-8d74-c70c439d2ac6">
<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
<jr:columnHeader style="Table_CH" height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="260" height="30" uuid="88e907e3-8090-4c62-8b42-692390955241"/>
<textElement textAlignment="Center" rotation="None"/>
<text><![CDATA[Produkt]]></text>
</staticText>
</jr:columnHeader>
<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
<jr:detailCell style="Table_TD" height="30">
<textField>
<reportElement x="0" y="0" width="260" height="30" uuid="66da7f58-d69f-4a13-b6d5-a8e37d7707b8"/>
<textElement textAlignment="Left">
<paragraph leftIndent="2"/>
</textElement>
<textFieldExpression><![CDATA[$F{product}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
<jr:column width="130" uuid="c098c3a0-7e77-4a47-9b72-530d5a4b10ff">
<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
<jr:columnHeader style="Table_CH" height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="130" height="30" uuid="f64de092-ac20-4984-9b55-569910a31b6c"/>
<textElement textAlignment="Center" rotation="None"/>
<text><![CDATA[Menge]]></text>
</staticText>
</jr:columnHeader>
<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
<jr:detailCell style="Table_TD" height="30">
<textField>
<reportElement x="0" y="0" width="130" height="30" uuid="a62bdcb7-9257-4b0e-a0e9-10a94efc65f1"/>
<textElement textAlignment="Center"/>
<textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
<jr:column width="130" uuid="2fe1cd34-cfc4-426b-b37a-9c1393bffe5b">
<jr:tableHeader style="Table_TH" height="30" rowSpan="1"/>
<jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
<jr:columnHeader style="Table_CH" height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="130" height="30" uuid="67b1e188-c745-4651-a9a9-892d71c31255"/>
<textElement textAlignment="Center" rotation="None"/>
<text><![CDATA[Preis]]></text>
</staticText>
</jr:columnHeader>
<jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
<jr:detailCell style="Table_TD" height="30">
<textField>
<reportElement x="0" y="0" width="130" height="30" uuid="2888a61e-7a85-4117-91fc-cab41dc5e00a"/>
<textElement textAlignment="Center"/>
<textFieldExpression><![CDATA[$F{cost}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
</jr:table>
</componentElement>
</band>
</detail>
</jasperReport>
Adding the java code:
File fileAbstractBook = ResourceUtils.getFile("classpath:report/Abstract_refactored.jrxml");
InputStream inputAbstractBook = new FileInputStream(fileAbstractBook.getAbsolutePath());
JasperDesign jasperAbstractBook = JRXmlLoader.load(inputAbstractBook);
JasperReport abstractBook = JasperCompileManager.compileReport(jasperAbstractBook);
JRBeanCollectionDataSource dataSource1 = new JRBeanCollectionDataSource(investmentCostsList);
JRBeanCollectionDataSource dataSource2 = new JRBeanCollectionDataSource(ubersichtList);
Map<String, Object> params = new HashMap<>();
//Path path = Paths.get(fileInvestmentCosts.getAbsolutePath());
Path path = Paths.get(fileSub.getAbsolutePath());
System.out.println("Path of the report resources"+ path.getParent());
params.put("CollectionBeanParam", dataSource1);//ubersichtCollectionBeanParam
params.put("ubersichtCollectionRefactored", dataSource2);//ubersichtCollectionBeanParam
params.put("SUBREPORT_DIR", path.getParent() + "/");
JasperPrint print = JasperFillManager.fillReport(abstractBook, params, new JREmptyDataSource());
You're passing $P{CollectionBeanParam}
both as REPORT_DATA_SOURCE
, which is used for the main report dataset, and as CollectionBeanParam
, which gets passed as data source to the table subdataset. The main dataset consumes the first record from the data source instance and then passes it to the table subdataset which iterates on the remaining records.
From the looks of it, the main dataset of the investmentcosts
part doesn't read anything from the data source, therefore what you should do is to pass an empty data source as REPORT_DATA_SOURCE
for the part. As in
<part uuid="3bbe9fbc-42db-4b15-8120-416514e99d4c">
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
<subreportParameter name="CollectionBeanParam">
<subreportParameterExpression><![CDATA[$P{CollectionBeanParam}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "investmentcosts.jasper"]]></subreportExpression>
</p:subreportPart>
</part>
As a note, in the table datasetRun
you have both REPORT_DATA_SOURCE
as parameter and dataSourceExpression
. You only need one, although having both shouldn't break anything.