4

我正在使用iReport制作 PDF 报告。我的目标是我想在我的 3 个对象元素中
使用动态变量(变量的名称是pgnum ),并在“表达式时打印”对象属性中使用pgnum 。
我有三个对象元素,它们是文本字段、框架名称的 frameA 和框架名称的 frameB。

我想在 print when expression 中做这样的事情:

  • 文本字段 = 表达式时打印:$V{pgnum} % 6 == 1
  • frameA = 表达式时打印:$V{pgnum} % 6 == 1
  • frameB = 表达式时打印:$V{pgnum} % 6 != 1

如果我的 PDF 共有 14 页,那么我想要的结果是:

  • 当第 7 页和第 13 页时,将打印文本字段和 frameA。
  • 其他页面(第 7 页和第 13 页除外)仅会打印 frameB。

我在iReport中一直尝试,但pgnum始终是静态结果,即使在文本字段中,评估时间属性也适用于每个页面。并且帧 A 也永远不会被打印,因为我认为pgnum始终设置为零 (0) 值,并且永远不会增加。所以结果是框架 B 总是打印在所有页面中。

你能帮我用iReport解决这个问题吗?或者你能建议甚至帮助我使用其他 jasper 报告,比如动态报告或动态 jasper 来解决这个问题吗?

注意:

  • 动态变量的名称是 pgnum。
  • 我的 pgnum 的初始值为 0(零)
  • 并具有这样的属性 => class="java.lang.Integer" incrementType="Page" calculation="Sum"

谢谢阅读。我正在等待您的回复。

这是我的jrxml文件:

<?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="deploy_details" language="groovy" pageWidth="502" pageHeight="842" columnWidth="502" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <style name="table_CH" mode="Opaque" backcolor="#999999">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <variable name="pgnum" class="java.lang.Integer" incrementType="Page" calculation="Count">
        <variableExpression><![CDATA[pgnum+1]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <detail>
        <band height="762" splitType="Stretch">
            <frame>
                <reportElement isPrintRepeatedValues="false" mode="Opaque" x="56" y="66" width="114" height="43" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true" backcolor="#000000">
                    <printWhenExpression><![CDATA[$V{pgnum} % 6 == 1]]></printWhenExpression>
                </reportElement>
                <staticText>
                    <reportElement mode="Transparent" x="15" y="12" width="83" height="18" forecolor="#FFFFFF"/>
                    <textElement/>
                    <text><![CDATA[FrameA]]></text>
                </staticText>
            </frame>
            <frame>
                <reportElement isPrintRepeatedValues="false" mode="Opaque" x="185" y="66" width="114" height="43" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true" backcolor="#000000">
                    <printWhenExpression><![CDATA[$V{pgnum} % 6 != 1]]></printWhenExpression>
                </reportElement>
                <staticText>
                    <reportElement mode="Transparent" x="15" y="12" width="83" height="18" forecolor="#FFFFFF"/>
                    <textElement/>
                    <text><![CDATA[FrameB]]></text>
                </staticText>
            </frame>
            <textField isStretchWithOverflow="true" evaluationTime="Page" isBlankWhenNull="true">
                <reportElement isPrintRepeatedValues="false" x="122" y="35" width="100" height="20" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true">
                    <printWhenExpression><![CDATA[$V{pgnum} % 6 == 1]]></printWhenExpression>
                </reportElement>
                <box>
                    <topPen lineWidth="3.25"/>
                    <leftPen lineWidth="3.25"/>
                    <bottomPen lineWidth="3.25"/>
                    <rightPen lineWidth="3.25"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA["textField"]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

感谢 Alex K 的回复,但你的回答仍然没有解决我的问题,我已经尝试并按照你的所有命令来解决这个问题,但我仍然得到静态值(不是增量)的 pgnum。

您之前曾向我建议过有关 dataSource 的建议,现在我已将新 jrxml 和 dataSource 示例文件的问题包含在测试包中。但是我有一个新问题,我创建的结果(dummyData)总是在 test.pdf 中打印“空”,您能再帮我一次吗,先生?你能解决我之前的主要目标吗?

谢谢我在等你的回复

这是链接: dataSource,jrxml

4

1 回答 1

14

你的变量的表达式是错误的。

正确的表达式是,如果您想从0值开始计算并为每个新页面将 pgnum值增加1 :

<variable name="pgnum" class="java.lang.Integer" incrementType="Page">
    <variableExpression><![CDATA[$V{pgnum} + 1]]></variableExpression>
    <initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>

它类似于此伪代码:

int pgnum = 0;

// iterating thru records
// ....
    if (isNewPageStart()) {
        pgnum = pgnum + 1; 
    }

如果要为pgnum设置初始值(例如在参数initialValue的帮助下)并为每个新页面将pgnum值增加1,则表达式将是:

<parameter name="initialValue" class="java.lang.Integer" isForPrompting="false">
    <defaultValueExpression><![CDATA[5]]></defaultValueExpression>
</parameter>

<variable name="pgnum" class="java.lang.Integer" incrementType="Page">
    <variableExpression><![CDATA[$V{pgnum} + 1]]></variableExpression>
    <initialValueExpression><![CDATA[$P{initialValue}]]></initialValueExpression>
</variable>

它类似于此伪代码:

int initialValue = 5;
int pgnum = initialValue;

// iterating thru records
// ....
    if (isNewPageStart()) {
        pgnum = pgnum + 1; 
    }

您还可以借助以下表达式将每个新页面的pgnum的值增加 1:

<variable name="pgnum" class="java.lang.Integer" incrementType="Page" calculation="Count">
    <variableExpression><![CDATA[100]]></variableExpression>
    <initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>

variableExpression应该包含任何非空值。我设置了100值,但我可以设置例如59


关于变量的信息

JasperReports 终极指南引述- 主题变量

变量的名称
就像参数和字段一样,‹variable›元素的name属性是
强制并允许通过报表表达式中声明的名称引用变量。

重置类型
报表变量的值可以随着每次迭代而改变,但可以带
在指定时间返回其初始值表达式返回的值
报告填写过程。此行为由 resetType 属性控制,
它指示在报告填充过程中何时应重新初始化变量。

变量有五种重置类型:
*不重置:变量永远不会使用其初始值表达式进行初始化
并且仅包含通过评估变量的表达式 (resetType="None") 获得的值。
*报告级重置:变量只初始化一次,在开始时
 报表填充过程,返回值由变量的初始值表达式(resetType="Report")。
*页面级重置:变量在每个新页面的开头重新初始化(resetType="Page")。
*列级重置:变量在每个新列的开头重新初始化(resetType="Column")。
*组级重置:每次指定的组时,变量都会重新初始化
resetGroup 属性中断(resetType="Group")。此属性的默认值为 resetType="Report"。


增量类型
此属性允许您选择增加变量的确切时刻。默认,
变量随着数据源中的每条记录而递增,但在具有多个
数据分组级别,一些变量可能会计算更高级别的总数,并且需要
只是偶尔增加,而不是随着数据源的每次迭代而增加。

此属性使用与 resetType 属性相同的值,如下所示:
*行级增量:变量在通过数据源的迭代过程中随每条记录递增(incrementType="None")。
*报告级增量:变量在报告填充过程中永远不会增加(incrementType="Report")。
*页面级增量:变量随每个新页面递增(incrementType=“Page”)。
*列级增量:变量随每个新列递增(incrementType="Column")。
*组级增量:每次由 incrementGroup 属性指定的组中断(incrementType="Group")时,变量都会递增。

计算
如前所述,变量可以对其对应的执行内置类型的计算
表达式值。以下小节描述了所有可能的值
元素的计算属性。

无计算
这是变量执行的默认计算类型。这意味着变量的
数据源中的每次迭代都会重新计算值,并且返回的值是
通过简单地评估变量的表达式获得。

计算计数
计数变量包括在计算后返回的非空值
 变量的主要表达式,数据源中的每次迭代。计数变量必须
 始终为数字类型。但是,它们可以将非数字表达式作为主要
 表达式,因为引擎不关心表达式类型,而只计算
 返回非空值,无论其类型如何。

只有变量的初始值表达式应该是数字的并且与
 变量的类型,因为这个值会在初始化时直接赋值给 count 变量。

计算 DistinctCount
这种类型的计算就像 Count 计算一样工作,唯一的区别是
 它忽略重复值并仅计算不同的非空值。

计算总和
报告引擎可以汇总变量的主表达式返回的值,如果您
 选择这种类型的计算;但请确保变量具有数字类型。你不能
 计算报告变量的 java.lang.String 或 java.util.Date 类型的总和,除非
 使用自定义变量增量器,如本章后面的“增量器”部分所述。

计算平均值
报告引擎还可以计算通过以下方式获得的一系列值的平均值
 计算数据源中每条记录的变量表达式。这类
 只能对数值变量执行计算(参见下面的“增量器”
 部分,本章后面的详细信息)。

计算最低和最高
当您想获得计算中的最低或最高值时选择这种计算
 通过评估每个数据源记录的变量表达式获得的一系列值。

计算标准偏差和方差
在某些特殊报告中,您可能希望执行更高级的计算类型
 数值表达式。JasperReports 有内置算法来获取标准差
 以及通过评估报告变量的表达式返回的一系列值的方差。

计算系统
仅当您不希望引擎计算任何
 您的变量的值。这意味着您正在计算该变量的值
 你自己,几乎可以肯定使用 JasperReports 的脚本功能。

对于这种类型的计算,引擎所做的唯一事情就是保存您的值
 从数据源中的一次迭代到下一次迭代,您自己计算过。

先计算
使用计算类型时,变量会保留计算后得到的值
第一次递增并且在重置事件发生之前不会改变它。

这是一个简单的报表变量声明,用于计算数字报表的总和
称为数量的字段:
    ‹变量名="QuantitySum" class="java.lang.Double"计算="Sum"›
        ‹variableExpression>$F{数量}‹/variableExpression›
    </多变的>
如果你想要每个页面的这个字段的总和,这里是完整的变量声明:
    ‹variable name="QuantitySum" class="java.lang.Double" resetType="Page" 计算="Sum"›
        ‹variableExpression›$F{数量}‹/variableExpression›
        ‹initialValueExpression>new Double(0)‹/initialValueExpression›
    </多变的>
在此示例中,我们的页面总和变量将在每个新页面的开头初始化为零。

在您的情况下,工作模板将是:

<?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="deploy_details" language="groovy" pageWidth="502" pageHeight="842" columnWidth="502" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="7e1f4be9-dd35-4266-9eb3-ca71387dda65">
    <style name="table_CH" mode="Opaque" backcolor="#999999">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <variable name="pgnum" class="java.lang.Integer" incrementType="Page">
        <variableExpression><![CDATA[$V{pgnum} + 1]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <detail>
        <band height="762" splitType="Stretch">
            <frame>
                <reportElement uuid="e15c7831-1b8e-4f62-beb2-61e268dfbd73" mode="Opaque" x="56" y="66" width="114" height="43" backcolor="#000000">
                    <printWhenExpression><![CDATA[$V{pgnum} % 6 == 1]]></printWhenExpression>
                </reportElement>
                <staticText>
                    <reportElement uuid="ac19b45c-2ff9-41a9-9dd4-8189e51c7bdc" x="15" y="12" width="83" height="18" forecolor="#FFFFFF"/>
                    <textElement markup="none"/>
                    <text><![CDATA[FrameA]]></text>
                </staticText>
            </frame>
            <frame>
                <reportElement uuid="983ad5a2-5d79-4b6d-b1de-41428e4c7ccb" mode="Opaque" x="185" y="66" width="114" height="43" backcolor="#000000">
                    <printWhenExpression><![CDATA[$V{pgnum} % 6 != 1]]></printWhenExpression>
                </reportElement>
                <staticText>
                    <reportElement uuid="bbd99be7-18c1-4e11-a77e-6ab9e5b79500" x="15" y="12" width="83" height="18" forecolor="#FFFFFF"/>
                    <textElement/>
                    <text><![CDATA[FrameB]]></text>
                </staticText>
            </frame>
            <textField isStretchWithOverflow="true" evaluationTime="Page" isBlankWhenNull="true">
                <reportElement uuid="ba06215f-ef20-463c-baf3-891c33472f72" isPrintRepeatedValues="false" x="122" y="35" width="100" height="20" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true">
                    <printWhenExpression><![CDATA[$V{pgnum} % 6 == 1]]></printWhenExpression>
                </reportElement>
                <box>
                    <topPen lineWidth="3.25"/>
                    <leftPen lineWidth="3.25"/>
                    <bottomPen lineWidth="3.25"/>
                    <rightPen lineWidth="3.25"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA["textField"]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

对于第 1 页,结果将是(通过iReport中的预览):

在此处输入图像描述

对于第 2 页:

在此处输入图像描述

于 2013-10-01T16:21:53.970 回答