我有一个条形码报告,该报告使用序列( 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个或更多报告。此刻,我一次只能生成一个报告。
所以我的第一个猜测是获取一个参数,提示用户输入一个值,该值将指示要打印的条形码的数量,并且每个都有一个单独的数字。
我不确定我解决这个问题的想法是否正确以及如何做到这一点。
有人可以帮忙吗?
答案 0 :(得分:2)
只需对您的查询进行少量修改即可轻松完成,无需通过多种方式进行编程。
您可以使用单个报告的模板在一个报告中生成多个条形码。
在这种情况下, 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}
Barcode 组件的表达式为:
new com.pepkorit.BarbecueRotateRenderer(
net.sourceforge.barbecue.BarcodeFactory.createCode128C($F{barcode}),
false, true, 1, 50, 190, 50)
您可以使用与第一个解决方案相同的 queryString 表达式。 rownum 字段中的组将帮助我们生成单个报告,其中包含许多属于其自己组的条形码(一个组 - 一个条形码)。 条形码组件应放在 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 ):
如果组 rownumGroup 的 isStartNewPage =“true” ,结果将是( $ P {quantity} == 5 ):
我们可以将子报告组件添加到详细信息频段(参见第一个解决方案)或组标题(< em>看第二个解决方案)乐队。在这种情况下,您不仅可以将条形码组件添加到子报表中,还可以添加所需的所有内容。
答案 1 :(得分: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个这样的豆子
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