我有一个显示2列col1,col2
的JasperReports报告报告必须显示
col1 col2
d1 abc
d2 def
d3 ghi
我的代码看起来不错,并在服务器和网络上都经过测试。它运作良好。
最近,我们从客户那里得到一个错误,说数据显示如下
col1 col2
d1 abc
d2 abc
d3 abc
我删除了$ F {col2}并重新添加了它。报告再次开始正常工作
当我查看 jrxml 时,我看到的唯一区别是,评估时间从报告更改为自动
有人可以解释这种奇怪的行为吗?
答案 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 的帮助下生成的结果如下所示:
- 我们有3行具有相同的值。这是我们数据集重复3次的最后一个值。
- 我们拥有原始数据集中的所有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 )。