いくつかの方法でプログラミングすることなく、クエリを少し変更するだけで簡単に実行できます。
解決策 1. 詳細バンドでバーコード コンポーネントを含む単一レポートを使用する
単一レポートのテンプレートを使用して、1 つのレポートで複数のバーコードを生成できます。
この場合、queryString式 ( Oracle DB で機能) は次のようになります。
SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}
- 必要な回数だけシーケンスから値を生成します。$P{quantity}パラメータは、生成される行 (バーコード) の数を決定します。
作業rjxmlファイル:
<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>
結果は次のようになります ( $P{quantity} == 5 ):
あなたの場合、queryString式は次のようになります。
SELECT to_char(PALLET_ID_NO_SEQ.nextval) AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}
バーコードコンポーネントの式は次のようになります。
new com.pepkorit.BarbecueRotateRenderer(
net.sourceforge.barbecue.BarcodeFactory.createCode128C($F{barcode}),
false, true, 1, 50, 190, 50)
解決策 2. グループ ヘッダー バンドを使用する
最初のソリューションと同じqueryString式を使用できます。group on rownumフィールドは、独自のグループ (1 つのグループ - 1 つのバーコード) に属する多くのバーコードを含む単一のレポートを生成するのに役立ちます。バーコードコンポーネントは、グループ ヘッダー バンドに配置する必要があります。
isStartNewPageプロパティを使用して、新しいページにグループを生成するかどうかを管理できます。
rjxmlファイル:
<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>
グループrownumGroupのisStartNewPage="false"の場合、結果は次のようになります ( $P{quantity}== 7 ):
グループrownumGroupのisStartNewPage="true"の場合、結果は次のようになります ( $P{quantity} == 5 ):
解決策 3. サブレポートの使用
サブレポートコンポーネントを詳細バンド (最初のソリューションを参照) またはグループ ヘッダー( 2 番目のソリューションを参照) バンドに追加できます。この場合、バーコードコンポーネントだけでなく、必要なものすべてをサブレポートに追加できます。