Cela peut être facilement fait avec de petites modifications de votre requête sans programmation de plusieurs manières.
Solution 1. Utilisation d'un seul rapport avec un composant de code-barres dans la bande Détail
Vous pouvez utiliser le modèle de rapport unique pour générer plusieurs codes-barres en un rapport.
Dans ce cas, la queryString expression (fonctionne pour Oracle DB) ressemblera à ceci :
SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}
- il génère une valeur à partir de la séquence autant de fois que nécessaire. La $P{quantité} paramètre détermine le nombre de lignes (codes-barres) à générer.
Le rjxml fonctionnel fichier :
<jasperReport ...>
<parameter name="quantity" class="java.lang.Integer">
<defaultValueExpression><![CDATA[20]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}]]>
</queryString>
<field name="BARCODE" class="java.lang.Integer"/>
<field name="ROWNUM" class="java.lang.Integer"/>
<title>
<band height="82" splitType="Stretch">
<textField>
<reportElement x="145" y="18" width="240" height="20"/>
<textElement/>
<textFieldExpression><![CDATA["The number of barcodes is: " + $P{quantity}]]></textFieldExpression>
</textField>
</band>
</title>
<detail>
<band height="47" splitType="Stretch">
<componentElement>
<reportElement x="145" y="10" width="200" height="28"/>
<jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="2of7" drawText="false" checksumRequired="false">
<jr:codeExpression><![CDATA[$F{BARCODE}]]></jr:codeExpression>
</jr:barbecue>
</componentElement>
</band>
</detail>
</jasperReport>
Le résultat sera ($P{quantity} ==5 ):
Dans votre cas, le queryString l'expression sera comme ceci :
SELECT to_char(PALLET_ID_NO_SEQ.nextval) AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}
et l'expression de Barcode composant sera :
new com.pepkorit.BarbecueRotateRenderer(
net.sourceforge.barbecue.BarcodeFactory.createCode128C($F{barcode}),
false, true, 1, 50, 190, 50)
Solution 2. Utiliser la bande d'en-tête de groupe
Vous pouvez utiliser le même queryString expression comme dans la première solution. Le groupe sur rownum champ nous aidera à générer unique rapport avec de nombreux codes-barres appartenant à son propre groupe (un groupe - un code-barres). Le code-barres le composant doit être placé dans l'En-tête de groupe bande.
Utilisation de isStartNewPage propriété que nous pouvons gérer pour générer un groupe sur une nouvelle page ou non.
Le rjxml fichier :
<jasperReport ...>
<parameter name="quantity" class="java.lang.Integer">
<defaultValueExpression><![CDATA[20]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}]]>
</queryString>
<field name="BARCODE" class="java.lang.Integer"/>
<field name="ROWNUM" class="java.lang.Integer"/>
<group name="rownumGroup" isStartNewPage="true">
<groupExpression><![CDATA[$F{ROWNUM}]]></groupExpression>
<groupHeader>
<band height="50">
<componentElement>
<reportElement x="145" y="11" width="200" height="28"/>
<jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="2of7" drawText="false" checksumRequired="false">
<jr:codeExpression><![CDATA[$F{BARCODE}]]></jr:codeExpression>
</jr:barbecue>
</componentElement>
</band>
</groupHeader>
</group>
<title>
<band height="82" splitType="Stretch">
<textField>
<reportElement x="145" y="18" width="240" height="20"/>
<textElement/>
<textFieldExpression><![CDATA["The number of barcodes is: " + $P{quantity}]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
Au cas où isStartNewPage="false" pour le groupe rownumGroup le résultat sera ($P{quantity}==7 ):
Au cas où isStartNewPage="true" pour le groupe rownumGroup le résultat sera ($P{quantity} ==5 ):
Solution 3. Utiliser un sous-rapport
Nous pouvons ajouter un sous-rapport composant au Détail bande (voir première solution ) ou En-tête de groupe (voir deuxième solution ) bande. Dans ce cas, vous pouvez ajouter au sous-rapport non seulement le code à barres composant, mais tout ce que vous voulez.