填写打印时如何避免错误,错误评估表达式?

时间:2016-02-09 04:06:29

标签: jasper-reports

目前,我在JasperReport Server和iReport工作。 JasperReport 5.5.0和iReport的版本是5.5.0。数据库是MYSQL。

我将变量Dr声明为以下am_primeamt来自SQL查询的变量。

<variable name="Dr" class="java.lang.Double">
    <variableExpression><![CDATA[($F{am_primeamt} > 0 ? $F{am_primeamt} : 0 )]]></variableExpression>
</variable>

试图表现如下:

<textField pattern="#,##0.00">
<reportElement x="427" y="0" width="82" height="20" uuid="332ceda3-5237-40b5-a0ef-3aad009a7911">
    <printWhenExpression><![CDATA[$V{Dr} != 0]]></printWhenExpression>
</reportElement>
<textElement textAlignment="Right"/>
<textFieldExpression><![CDATA[$V{Dr}]]></textFieldExpression>

当我试图查看预览时,它显示以下错误:

  

填写打印时出错...评估表达式时出错:源文本:$ V {Dr}!= 0   net.sf.jasperreports.engine.fill.JRExpressionEvalException:评估表达式时出错:源文本:$ V {Dr}!= 0 at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:244)at net .sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:591)at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:559)at net.sf.jasperreports.engine.fill .JRFillElement.evaluateExpression(JRFillElement.java:1016)at net.sf.jasperreports.engine.fill.JRFillElement.evaluatePrintWhenExpression(JRFillElement.java:795)at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java) :482)net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259)at net.sf. net.f上的net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:456)。 jasperreports.engine.fill.JRVerticalFiller.fillColumnB和(JRVerticalFiller.java:2057)net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:778)at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:288) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151)at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:932)at net.sf.jasperreports.engine .fill.JRBaseFiller.fill(JRBaseFiller.java:845)at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87)at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java) :446)at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:276)at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:745)at com.jaspersoft.ireport.designer。编译器.IReportCompiler.run(IReportCompiler.java:891)at或g.openide.util.RequestProcessor $ Task.run(RequestProcessor.java:572)atg.openide.util.RequestProcessor $ Processor.run(RequestProcessor.java:997)引起:java.lang.ClassCastException:java.math。无法在gl_transaction_1454989470091_439976.evaluate(gl_transaction_1454989470091_439976:363)的net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:231)中将BigDecimal强制转换为java.lang.Double ... 20更多   打印未填写。尝试使用EmptyDataSource ...

编辑: 语言从头开始设置为java,并显示如下错误。在使它变得常规之后,它解决了我的问题。

1 个答案:

答案 0 :(得分:0)

接受的答案并没有解决问题,因为它对被删除的用户进行了投票(问自己为什么),即使问题没有完整mcve我也决定回答以帮助未来的观众了解问题。 主持人已删除已接受的答案,但问题仍然存在,并且已指出设置语言groovy的解决方案

问题是:

  

java.lang.ClassCastException:java.math.BigDecimal无法强制转换为   java.lang.Double中

这很可能是因为字段$F{am_primeamt}被定义为java.math.BigDecimal

<field name="am_primeamt" class="java.math.BigDecimal">
    <fieldDescription><![CDATA[]]></fieldDescription>
</field>

正确的解决方案是将当前变量声明更改为同一类或返回声明的类

同一课程

<variable name="Dr" class="java.math.BigDecimal">
   <variableExpression><![CDATA[($F{am_primeamt}.doubleValue() > 0 ? $F{am_primeamt} : new java.math.BigDecimal(0) )]]></variableExpression>
</variable>

注意:printWhenExpression不能更改为示例$V{Dr}.doubleValue() != 0

宣布课程

<variable name="Dr" class="java.lang.Double">
   <variableExpression><![CDATA[($F{am_primeamt}.doubleValue() > 0 ? $F{am_primeamt}.doubleValue() : 0d )]]></variableExpression>
</variable>

为什么groovy工作?,它使用java.lang.Number进行自动转换并使用运算符重载来允许对BigDecimal对象进行直接数学运算,请参阅http://www.groovy-lang.org/,但在选择它而不是java之前,最好是明白为什么.......