如何避免填写打印时出错、计算表达式时出错?

问题描述 投票:0回答:1

目前,我在 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后,它解决了我的问题。

jasper-reports
1个回答
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 更好地理解为什么......

© www.soinside.com 2019 - 2024. All rights reserved.