当前位置: 首页 > 面试题库 >

如何打印多个带有条形码\的报告或一个报告中的多个条形码

连坚白
2023-03-14
问题内容

我有一个 条形码 报告,该报告使用序列( 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.将单个报告与明细栏中的条形码组件一起使用

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

在这种情况下, queryString 表达式(适用于 Oracle DB)将如下所示:

SELECT seq_barcode.nextval AS barcode, rownum FROM dual CONNECT BY LEVEL <= $P{quantity}

-它会根据需要多次从序列中生成一个值。的 $ P {量} 参数确定要生成的行(条形码)的数量。

工作的 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 表达式。 rownum 上的group 字段将帮助我们生成
单个 报告,其中包含多个属于其自身组的条形码(一组-一个条形码)。所述 条形码 组分应放置到 组页眉 带。

使用 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 =“
false”

如果对于 rownumGroup* 组为 isStartNewPage =“ true” ,则结果为( $ P
{quantity} == 5
):
__*

通过iReport中的预览结果为isStartNewPage =“
true”

解决方案3.使用子报表

我们可以将 Subreport 组件添加到 Detail区域请参阅第一个解决方案 )或 Group Header
请参阅第二个解决方案 )区域。在这种情况下,您不仅可以将 条形码 组件添加到子报表中,还可以添加所需的所有内容。



 类似资料:
  • 我有一个使用JSF和PrimeFaces开发的项目。我需要用Jasper在PDF上显示条形码。我怎样才能做到这一点?

  • 我是Jasper报告的新手。我有一个包含2组的报告。根据查询,正在打印多页。 第一组高度 - 95分,第二组高度 - 144分 我希望这些多页打印在一页中(我希望一页中包含5页)。每页高度为239点。(即使页面内容小于239分,我希望将剩余部分保留为空白,并在239分后开始下一页)。我尝试创建一个报告,并将上述报告作为子报告,并设置主报告的高度为1195(239*5)点。尽管如此,这些都被打印在不

  • https://docs.gradle.org/current/userguide/jacoco_plugin.html 并使用Gradle过滤JaCoCo覆盖报告 但没有发现任何线索 以下是gradle文件的内容 下面看我自己的答案

  • 我现在一筹莫展。 请求代码收集在一个ArrayList中,这样当程序退出时,另一个函数可以清除所有警报。 现在的问题是:我的警报器打不响。我能够找到这个函数的错误。AlarmManager实例很好。我在底部设置了一个测试警报(在带有星号的行之后)。着火了。为什么???

  • 我的POM现在看起来像, 这将生成一个报告,但仅使用最后一个功能。我有多个跑步者,所以我试图找出: A.如何将多个JSON组合成一个报告或 B.当每个测试完成时,我如何附加到一个JSON文件上? 这两种方法似乎都是可行的解决方案,但我更喜欢一种,因为我在pom.xml中似乎只遗漏了一行,因为我目前已经生成了多个JSON文件

  • 我想在多个浏览器中运行同一组测试用例。为此,我将测试(每个测试针对单个浏览器)放在testng xml的一个套件下。运行之后,我从testng获得一个html报告,如果其中一个浏览器中出现测试失败,它在报告中不可见。还有别的办法吗?