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 个或更多报告。目前,我一次只能生成一份报告。

所以我的第一个猜测是获取一个参数,该参数会提示用户一个值,该值将指示要打印多少个条形码,每个条形码都有一个单独的编号。

我不确定我关于解决这个问题的想法是否正确以及如何去做。

有人可以帮忙吗?

4

2 回答 2

3

只需对查询进行少量修改即可轻松完成,而无需通过多种方式进行编程。

解决方案 1. 在 Detail 带中使用带有 Barcode 组件的单个报告

您可以使用单个报告的模板在一份报告中生成多个条形码。

在这种情况下,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}

Barcode组件的表达式为:

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

解决方案 2. 使用组头带

您可以使用与第一个解决方案中相同的queryString表达式。rownum字段上的组将帮助我们生成单个报告,其中包含许多属于其自己组的条形码(一组 - 一个条形码)。Barcode组件应放置在Group Header带中。

使用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. 使用子报表

我们可以将Subreport组件添加到Detail带区(参见第一个解决方案)或Group Header参见第二个解决方案)带区。在这种情况下,您不仅可以向子报表添加Barcode组件,还可以添加您想要的所有内容。

于 2012-09-19T14:31:52.000 回答
0

一种可能的方式:

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 回答