【问题标题】:How can I generate same row multiple times?如何多次生成同一行?
【发布时间】:2016-06-14 16:35:05
【问题描述】:

我正在尝试使用 jasper 报告制作贴纸。

下图显示了结构。

我正在传递一个查询来生成碧玉报告。 我在jasper报告的“详细字段”中设计了上述结构,所以它不能重复,现在我需要多次生成我的查询结果。

这意味着如果当前我的查询给我以下结果:-

我希望产生相同的结果 n 次。

所以如果我的查询重复同一行 n 次,那么它将自动生成此结构 4 或 n 次

所以任何人都知道如何在 mysql 结果查询中重复同一行,或者任何人都有比这更好的解决方案来完成这项工作。

我的预期结果如下

【问题讨论】:

  • 我不明白你想问什么。
  • 嗨 tobi6 我已经编辑了我的问题,你现在可以检查一下吗。
  • 扩展细节带并复制/粘贴三遍。由于数据库只给出一行,报告应该处理乘法。
  • 但是我只想要4次并不是固定的,它可能会改变,计数可能会减少或增加。
  • 好的。那么最好的方法可能是创建一个根据参数将结果相乘的 SQL。也有可能使用一个结果乘以多次的 bean。

标签: mysql jasper-reports


【解决方案1】:

修改查询是使用联合的一种解决方案

SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10); 

但我会给你一个纯粹的 jasper-reports 解决方案,定义一个参数来指示你的打印应该重复多少次

纯碧玉报告解决方案使用子报告,传递 JREmptyDatasource(nrOfPrints) 和作为参数的字段。子报表将重复详细信息带与nrOfPrints 一样多次,您可以在其中输出参数(您的主报表字段)。

示例

主要报告

定义重复多少次的参数是RepeatNumber 也看看我是如何将字段作为参数传递给子报表的,你需要传递所有字段。

<?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="RepatDataSource" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="ceca1b98-d43c-4ee0-8339-661aa2ea53a9">
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA["C:\\jdd\\projects\\StackTrace\\jasper\\"]]></defaultValueExpression>
    </parameter>
    <parameter name="RepeatNumber" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[3]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[Your query]]>
    </queryString>
    <field name="field1" class="java.lang.String">
        <fieldDescription><![CDATA[]]></fieldDescription>
    </field>
    <detail>
        <band height="100" splitType="Stretch">
            <subreport>
                <reportElement x="0" y="0" width="555" height="100" uuid="9d56da00-c1c9-4b2b-94e2-4019e4f58c8f"/>
                <subreportParameter name="NR_REPEAT">
                    <subreportParameterExpression><![CDATA[$P{RepeatNumber}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="field1">
                    <subreportParameterExpression><![CDATA[$F{field1}]]></subreportParameterExpression>
                </subreportParameter>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource($P{RepeatNumber}.intValue())]]></dataSourceExpression>
                <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "RepatDataSource_subreport.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

子报告

<?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="RepatDataSource_subreport" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="98ddead4-e116-4c91-9ecb-416c10c3065c">
    <parameter name="NR_REPEAT" class="java.lang.Integer"/>
    <parameter name="field1" class="java.lang.String" isForPrompting="false"/>
    <detail>
        <band height="108" splitType="Stretch">
            <textField>
                <reportElement x="328" y="1" width="100" height="20" uuid="c5642fd7-9f63-4aa5-8503-16b1388c156b"/>
                <textElement verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$V{REPORT_COUNT} + "/" +$P{NR_REPEAT}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="45" y="35" width="125" height="20" uuid="5c2bb49a-ba95-4cb7-8c46-c32a0769e5e9"/>
                <textElement verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$P{field1}]]></textFieldExpression>
            </textField>
            <line>
                <reportElement x="0" y="0" width="555" height="1" uuid="dd3e7e6c-979e-421b-9f71-479e64c8023b"/>
            </line>
            <staticText>
                <reportElement x="0" y="35" width="45" height="20" uuid="0443e2f4-25bd-4837-9c95-bca2b26b3996"/>
                <textElement verticalAlignment="Middle"/>
                <text><![CDATA[Name]]></text>
            </staticText>
            <staticText>
                <reportElement x="214" y="1" width="114" height="20" uuid="0e20ec29-0092-41a3-b977-f8f64ff842ea"/>
                <textElement verticalAlignment="Middle"/>
                <text><![CDATA[Print Educational Books]]></text>
            </staticText>
        </band>
    </detail>
</jasperReport>

输出(我的数据库中有 1 条记录)

【讨论】:

  • 感谢 Petter Friberg,抱歉回复晚了,我正在研究您的纯 jasper-reports 解决方案,我认为它对我有用。你能用查询来解释你的第二个解决方案吗?如果我的查询是“select * from abc where id =1”,我该如何重复这一行?
  • 也了解 REPEAT() 解决方案,谢谢 Petter Friberg
  • @JayshreeKharate REPEAT 只是关键字 UNION 的示例,但也许在您的查询中有更好的方法(但没有足够的信息),但是纯碧玉解决方案来自性能问题可能更快(您需要从网络加载更少的数据),唯一的缺点是您需要将所有字段作为参数传递
  • 是的,我也发现纯碧玉解决方案可靠。
猜你喜欢
  • 2014-09-10
  • 2012-06-21
  • 2022-07-05
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多