【问题标题】:How to use dynamic variable in "print when expression"?如何在“print when expression”中使用动态变量?
【发布时间】:2013-10-01 02:42:26
【问题描述】:

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

我想在 print when 表达式中做这样的事情:

  • text field = print when expression : $V{pgnum} % 6 == 1
  • frameA = print when expression : $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

【问题讨论】:

  • 你应该发布 jrxml 文件
  • Alex K,你可以查看链接希望你能帮我解决这个问题,谢谢
  • 那么测试的数据源呢?
  • 我正在使用从列表创建的 JRBeanCollectionDataSource。数据应该是机密的。我在这里想要实现的实际上是创建一个具有不同参数和框架高度的不同标题(框架)的报表,基于页码 mod 6 等于 1 等条件,然后使用的报表标题是标题 a,否则使用标题 b。

标签: jasper-reports ireport


【解决方案1】:

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

正确的表达式是如果您想以 0 值开始计算,并为每个新页面增加 pgnum1

<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 Ultimate Guide - 主题变量

变量名 就像参数和字段一样,‹variable›元素的name属性是 强制并允许通过报表表达式中声明的名称引用变量。 重置类型 报表变量的值可以随着每次迭代而改变,但可以带 在指定时间返回其初始值表达式返回的值 报告填写过程。此行为由 resetType 属性控制, 它指示在报告填充过程中何时应重新初始化变量。 变量有五种重置类型: * No reset:变量永远不会使用它的初始值表达式初始化 并且只包含通过评估变量的表达式 (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› 多变的> 如果你想要每个页面的这个字段的总和,这里是完整的变量声明: ‹变量名="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>

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

对于第 2 页:

【讨论】:

  • +1 精美的解释、示例代码、文档链接以及有关变量的信息!
  • Sir Alex K,我已将dataSource,new jrxml 包含在新链接中,请看一下。谢谢楼主
  • @AlexK 我正在等待您的回复先生,请帮助我
  • @Skyeres 这是另一个问题。不是吗?
  • @AlexK 不是先生,仍然是同一个问题(在表达式中使用动态变量打印框架 A 和文本字段),但现在我使用子报表制作 dummyData、jrxml 以及其他要制作的信息这个问题很清楚先生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多