将评估时间从“报告”更改为“自动”后,报告中的值错误

时间:2017-03-21 07:04:19

标签: jasper-reports

我有一个显示2列col1,col2

的JasperReports报告

报告必须显示

col1  col2
d1    abc
d2    def
d3    ghi

我的代码看起来不错,并在服务器和网络上都经过测试。它运作良好。

最近,我们从客户那里得到一个错误,说数据显示如下

col1 col2
  d1   abc
  d2   abc
  d3   abc

我删除了$ F {col2}并重新添加了它。报告再次开始正常工作

当我查看 jrxml 时,我看到的唯一区别是,评估时间从报告更改为自动

有人可以解释这种奇怪的行为吗?

1 个答案:

答案 0 :(得分:0)

评估时间是 JasperReports 引擎的一个有趣功能。蛋糕上的糖衣。

让我们看看Java代码。我们需要 net.sf.jasperreports.engine.type.EvaluationTimeEnum 类。

public enum EvaluationTimeEnum implements JREnum {
    /**
     * A constant specifying that an expression should be evaluated at the exact moment in the filling process
     * when it is encountered.
     */
    NOW((byte)1, "Now"),

    /**
     * A constant specifying that an expression should be evaluated at the end of the filling process.
     */
    REPORT((byte)2, "Report"),

    /**
     * A constant specifying that an expression should be evaluated after each page is filled.
     */
    PAGE((byte)3, "Page"),

    /**
     * A constant specifying that an expression should be evaluated after each column is filled.
     */
    COLUMN((byte)4, "Column"),

    /**
     * A constant specifying that an expression should be evaluated after each group break.
     */
    GROUP((byte)5, "Group"),

    /**
     * The element will be evaluated at band end.
     */
    BAND((byte)6, "Band"),

    /**
     * Evaluation time indicating that each variable participating in the expression
     * should be evaluated at a time decided by the engine.
     * <p/>
     * Variables will be evaluated at a time corresponding to their reset type.
     * Fields are evaluated "now", i.e. at the time the band the element lies on gets filled.
     * <p/>
     * This evaluation type should be used when report elements having expressions that combine 
     * values evaluated at different times are required (e.g. percentage out of a total).
     * <p/>
     * NB: avoid using this evaluation type when other types suffice as it can lead
     * to performance loss.
     */
    AUTO((byte)7, "Auto"),

    /**
     * Used for elements that are evaluated at the moment the master report ends.
     * 
     * @see JRVariable#MASTER_CURRENT_PAGE
     * @see JRVariable#MASTER_TOTAL_PAGES
     */
    MASTER((byte) 8, "Master");

对所有类型的评估时间进行了详尽的描述。

如果我们设置 报告 评估时间 - 结果将是数据源中重复的最后一条记录。

实施例

我们可以用小样本检查不同类型的评估时间。

模板

我们可以使用 JRBeanCollectionDataSource 进行测试。

<?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="Check evaluation time" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <subDataset name="ds">
        <field name="value" class="java.lang.String">
            <fieldDescription><![CDATA[_THIS]]></fieldDescription>
        </field>
    </subDataset>
    <summary>
        <band height="15">
            <componentElement>
                <reportElement x="0" y="0" width="311" height="15"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="ds">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(Arrays.asList("abc", "def", "ghi"))]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="15" width="311">
                        <textField evaluationTime="Report">
                            <reportElement x="0" y="0" width="311" height="15"/>
                            <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </summary>
</jasperReport>

输出结果

JRPdfExporter 的帮助下生成的结果如下所示:

  • evaluationTime = “报告”

Result for Report evaluationTime

- 我们有3行具有相同的值。这是我们数据集重复3次的最后一个值。

  • evaluationTime = “自动”

Result for Auto evaluationTime

- 我们拥有原始数据集中的所有3个不同的行。

结论

如果我们的示例使用 自动 评估时间,我们应该阅读以下部分说明: Fields are evaluated "now", i.e. at the time the band the element lies on gets filled

这意味着这次(对于这个基本情况) JasperReports 引擎应用了简单的stradegy - 完全类比 现在 评估时间

最好删除 textField evaluationTime 或将其设置为evaluationTime="Now"(它是 evaluationTime )。