目前,我在 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) 在 net.sf.jasperreports.engine.fill.JRFillElement.evaluatePrintWhenExpression(JRFillElement.java:795) 在 net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java :482) 位于 net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259) 位于 net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:456) 位于 net.sf。 jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2057) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:778) at net.sf.jasperreports.engine.fill.JRVerticalFiller。 fillReportStart(JRVerticalFiller.java:288) 位于 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151) 位于 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:932)在 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845) 在 net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87) 在 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.compiler.IReportCompiler.run(IReportCompiler.java:891) 位于 org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) 位于 org.openide.util.RequestProcessor$Processor。运行(RequestProcessor.java:997) 引起:java.lang.ClassCastException:java.math.BigDecimal无法转换为java.lang.Double at gl_transaction_1454989470091_439976.evaluate(gl_transaction_1454989470091_439976:3 63) 位于 net.sf.jasperreports.engine.fill .JREvaluator.evaluate(JREvaluator.java:231) ... 20 多个 打印未填写。尝试使用 EmptyDataSource...
编辑: 语言从一开始就设置为java,并显示这样的错误。使它变得groovy后,它解决了我的问题。
接受的答案没有解决问题,因为它被删除的用户投票(问问自己为什么),即使问题没有完整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 更好地理解为什么......