我在解决这个问题时遇到了问题。我可以做加法,减法等... 但我想要做的就是这个((a - b)/ b)在Jasper的报告中。
这是我到目前为止所尝试的内容
${Budget}.subtract($F{Actual})/$F{Budget}
但是当我编译它时。它说我有表达问题。我正在使用Jasper Studio表达式编辑器
$ F {Budget}和$ F {Actual}都是文本字段,类java.math.BigDecimal
这是stace trace
net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : $F{Budgeted}.subtract($F{Actual}.divide($F{Budgeted}))
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:475)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$18(ReportControler.java:450)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler$4.run(ReportControler.java:337)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : $F{Budgeted}.subtract($F{Actual}.divide($F{Budgeted}))
at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:308)
at net.sf.jasperreports.engine.fill.JRCalculator.evaluateEstimated(JRCalculator.java:582)
at net.sf.jasperreports.engine.fill.JRCalculator.estimateVariables(JRCalculator.java:181)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1261)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1588)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:149)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:939)
at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:120)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ArithmeticException: Division by zero
at java.math.BigDecimal.divide(Unknown Source)
at ProjectSummary_1398114778002_614232.evaluateEstimated(ProjectSummary_1398114778002_614232:405)
at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:295)
... 9 more
答案 0 :(得分:2)
${Budget}.subtract($F{Actual})
将返回BigDecimal
引用,因此您不能使用除法符号/
,因为这仅支持基元(以及取消装箱时的类包装)。因此,您应该使用BigDecimal#divide
代替。
${Budget}.subtract($F{Actual}).divide($F{Budget})
从你的问题编辑:
引起:java.lang.ArithmeticException:除以零
您的$F{Budget}
变量的值不应为零。您可以使用三元运算符来解决此问题:
${Budget}.subtract($F{Actual}).divide( ($F{Budget}.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : $F{Budget}) )
来自新评论:
如果$ F {Budget}为零,我需要将计算字段分配为零,并将其他数字指定为零。
只需修改三元运算符的用法:
($F{Budget} == null || $F{Budget}.compareTo(BigDecimal.ZERO) == 0)) ? BigDecimal.ZERO : $F{Budget}.subtract($F{Actual}).divide($F{Budget})
答案 1 :(得分:0)
你错过了一对()吗?
如果未指定关联,将导致表达式的歧义。 (编译器/分析器)
答案 2 :(得分:0)
查看堆栈跟踪。它有这条线。
Caused by: java.lang.ArithmeticException: Division by zero
所以$F{Budget}
为零,只是你应该无法除以它。