Je dois transmettre à mon sous-rapport un dataSource avec l'aide du rapport principal List<String>
paramètre. Je ne sais pas ce qu'est un type de dataSource est correct et comment obtenir une valeur dans le sous-rapport.
L'extrait de mon rapport principal:
<parameter name="seznamPriloh" class="Java.util.List" isForPrompting="false"/>
....
<subreport>
<reportElement x="0" y="56" width="555" height="76"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression>
<subreportExpression><![CDATA[cz.alis.keong.jasjdr.reporting.ReportCompiler.compile("R79_SeznamPriloh")]]></subreportExpression>
</subreport>
L'extrait de mon sous-rapport:
<detail>
<band height="23">
<textField>
<reportElement x="56" y="3" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{}]]></textFieldExpression>
</textField>
</band>
</detail>
Veuillez m'indiquer comment transmettre la source de données au sous-rapport via le paramètre du rapport principal de Java.util.List<String>
type.
Edit: 08.14 14:20 Ajouter des balises à Java
Edit: 08.14 15:30 concerne Comment imprimer une liste de chaînes contenues dans une autre liste dans iReport? et fonctionne pour 4.5.0 Et List<String>
Vous devez spécifier le champ que vous utilisez dans votre sous-rapport. Vous passez $F{}
et lorsque vous passez un List<String>
comme DataSource, vous devez mettre $F{_THIS}
. Bien sûr, vous devez également ajouter un champ avec ce nom, mais en faisant cela, vous pouvez utiliser l'expression $F{somefield}
.
Oui cela fonctionne. Ce n'est pas du tout clairement documenté mais cela fonctionne avec jasperreport 4.5.1.
Vous devez déclarer un champ dans votre sous-rapport nommé "_THIS", tapé avec votre type primitif que vous souhaitez afficher. Dans ce cas, un String.
Sous-rapport
<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="testSubReport" pageWidth="555" pageHeight="802" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" isSummaryWithPageHeaderAndFooter="true" whenResourceMissingType="Empty">
<queryString>
<![CDATA[]]>
</queryString>
<field name="_THIS" class="Java.lang.String"/>
<pageHeader>
...
Ensuite, dans ce sous-rapport où vous souhaitez afficher la valeur String, utilisez simplement $ F {_THIS}.
<detail>
<band height="25">
<textField isStretchWithOverflow="true">
<reportElement x="37" y="5" width="503" height="15">
</reportElement>
<textFieldExpression><![CDATA[$F{_THIS}]]></textFieldExpression>
</textField>
</band>
</detail>
Rapport principal
Le rapport parent fournit la liste comme datasourceExpression
<subreport>
<reportElement positionType="Float" x="0" y="4" width="554" height="1"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{bean}.getListeOfStringsMethode())]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{subreportPrimitiveTypeList}]]></subreportExpression>
</subreport>
J'ai pris l'inspiration ici
Vous pouvez utiliser cette expression de source de données pour passer Java.util.List (via paramètre) au sous-rapport:
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression>
L'échantillon de travail, rapport principal:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
<parameter name="listParam" class="Java.util.List"/>
<parameter name="SUBREPORT_DIR" class="Java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["<subreport_dir>"]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[SELECT id, street, city FROM address]]>
</queryString>
<field name="ID" class="Java.lang.Integer"/>
<field name="STREET" class="Java.lang.String"/>
<field name="CITY" class="Java.lang.String"/>
<detail>
<band height="57" splitType="Stretch">
<frame>
<reportElement x="0" y="0" width="539" height="57"/>
<box>
<topPen lineWidth="1.0"/>
<leftPen lineWidth="1.0"/>
<bottomPen lineWidth="1.0"/>
<rightPen lineWidth="1.0"/>
</box>
<subreport>
<reportElement x="0" y="32" width="523" height="17"/>
<subreportParameter name="cityParam">
<subreportParameterExpression><![CDATA[$F{CITY}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{listParam})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport_list_as_param.jasper"]]></subreportExpression>
</subreport>
<textField>
<reportElement x="300" y="0" width="208" height="20"/>
<box leftPadding="10"/>
<textElement>
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA["City: " + $F{CITY}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="200" height="20"/>
<box leftPadding="10"/>
<textElement>
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA["Street: " + $F{STREET}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<box leftPadding="10"/>
<textElement>
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA["Id: " + $F{ID}]]></textFieldExpression>
</textField>
</frame>
</band>
</detail>
</jasperReport>
Le sous-rapport:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
<parameter name="cityParam" class="Java.lang.String"/>
<field name="id" class="Java.lang.Integer"/>
<field name="station" class="Java.lang.String"/>
<field name="city" class="Java.lang.String"/>
<filterExpression><![CDATA[$F{city}.equals($P{cityParam})]]></filterExpression>
<title>
<band height="39">
<textField>
<reportElement x="220" y="14" width="161" height="20"/>
<box leftPadding="10"/>
<textElement>
<font isBold="true" isItalic="true"/>
</textElement>
<textFieldExpression><![CDATA["City param: " + $P{cityParam}]]></textFieldExpression>
</textField>
</band>
</title>
<detail>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<box leftPadding="10"/>
<textElement/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="100" height="20"/>
<box leftPadding="10"/>
<textElement/>
<textFieldExpression><![CDATA[$F{station}]]></textFieldExpression>
</textField>
</band>
</detail>
<noData>
<band height="50">
<textField>
<reportElement x="220" y="17" width="161" height="20"/>
<box leftPadding="10"/>
<textElement>
<font isBold="true" isItalic="true"/>
</textElement>
<textFieldExpression><![CDATA["No data for city param: " + $P{cityParam}]]></textFieldExpression>
</textField>
</band>
</noData>
</jasperReport>
Le Java code pour passer Liste:
Map<String, Object> params = new HashMap<String, Object>();
List<TestBean> beansList = new ArrayList<TestBean>();
// The TestBean class constructor is:
//public TestBean(String city, Integer id, String station)
TestBean bean = new TestBean("Dallas", 10, "Central park st.");
beansList.add(bean);
bean = new TestBean("Dallas", 11, "Railway st.");
beansList.add(bean);
bean = new TestBean("Dallas", 12, "Market st.");
beansList.add(bean);
bean = new TestBean("Lyon", 20, "Airport st.");
beansList.add(bean);
params.put("listParam", beansList);
JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDemoHsqldbConnection());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
Le résultat sera (vue du fichier généré PDF fichier):
Vous pouvez regarder les implémentations de net.sf.jasperreports.engine.JRDataSource . Les plus appropriés pour votre cas sont: JRBeanCollectionDataSource et JRBeanArrayDataSource. Comme vous pouvez le voir, ils sont tous les deux basés sur Bean.
Je pense que vous pouvez facilement convertir votre List<String>
au List<StringBean>
.
Ou vous pouvez implémenter votre propre JRDataSource.