2

バーコード番号を生成するためにシーケンス ( Oracleバックエンド) を使用しているバーコードレポートがあります。

これは私のクエリにあります:

SELECT to_char(PALLET_ID_NO_SEQ.nextval) FROM dual

バーコード値を表示するデザイナー ウィンドウにこのフィールドを配置しました。

私は表現のある画像を持っています:

new com.pepkorit.BarbecueRotateRenderer(
    net.sourceforge.barbecue.BarcodeFactory.createCode128C(
    $F{TO_CHAR(PALLET_ID_NO_SEQ.NEXTVAL)}), false, true, 1, 50, 190, 50)

上記は、シーケンス値を使用したバーコードです。

100 以上のレポートを印刷/生成できるようにしたいと考えています。現時点では、一度に 1 つのレポートしか生成できません。

したがって、私の最初の推測は、ユーザーに値を求めるパラメーターを取得することです。その値は、印刷するバーコードの数とそれぞれに個別の番号を示します。

この問題を解決するための私の考えが正しいかどうか、またどのようにすればよいか確信が持てません。

誰か助けてくれませんか?

4

2 に答える 2

3

いくつかの方法でプログラミングすることなく、クエリを少し変更するだけで簡単に実行できます。

解決策 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 ):

iReport のプレビューによる結果


あなたの場合、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 ):

iReport のプレビューによる結果、isStartNewPage=

グループrownumGroupのisStartNewPage="true"の場合、結果は次のようになります ( $P{quantity} == 5 ):

iReport のプレビューによる結果、isStartNewPage=

解決策 3. サブレポートの使用

サブレポートコンポーネントを詳細バンド (最初のソリューションを参照) またはグループ ヘッダー( 2 番目のソリューションを参照) バンドに追加できます。この場合、バーコードコンポーネントだけでなく、必要なものすべてをサブレポートに追加できます。

于 2012-09-19T14:31:52.000 に答える
0

1 つの可能な方法:

1) Bean を作成します。

public class Entity {
    private Image image;

    public Entity(Image image) {
        this.image = image;
    }

    public Entity() {}

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }
}

2)100個のそのようなBeanにデータを入力します(バーコードの画像)

3) 次のようなジャスパー レポートを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<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="ExtendedPortReport" language="groovy" pageWidth="1190" pageHeight="842" orientation="Landscape" columnWidth="1150" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="ireport.zoom" value="0.75"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <field name="image" class="java.awt.Image"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="750" splitType="Stretch">
            <image scaleImage="RetainShape" hAlign="Center" vAlign="Top" isUsingCache="true" onErrorType="Blank">
                <reportElement isPrintRepeatedValues="false" x="0" y="0" width="1150" height="750"/>
                <box>
                    <pen lineWidth="0.0"/>
                    <topPen lineWidth="0.0"/>
                    <leftPen lineWidth="0.0"/>
                    <bottomPen lineWidth="0.0"/>
                    <rightPen lineWidth="0.0"/>
                </box>
                <imageExpression><![CDATA[$F{image}]]></imageExpression>
            </image>
        </band>
    </detail>
</jasperReport>

4) 画像フィールドのタイプ (レポート内) を java.awt.Image に設定します。

5)レポートをデスクトップアプリケーションとして作成します(あなたの場合、必要に応じて他の方法を使用してください)

    final JasperReport report = (JasperReport)JRLoader.loadObjectFromFile(MAIN_BINARY_PATH);
    final JRDataSource dataSource = new JRBeanCollectionDataSource(/*there is your list of entities*/);

    final JasperPrint jasperPrint = JasperFillManager.fillReport(report, null, dataSource);
    JRViewer viewer = new JRViewer(jasperPrint);
    //add viewer to a frame/panel
于 2012-09-19T12:57:46.330 に答える