У меня проблема с этим расчетом. Я могу делать сложение, вычитать и т.д., Но я пытаюсь сделать это ((a-b)/b) в отчетах Jasper.
Вот что я пробовал до сих пор
${Budget}.subtract($F{Actual})/$F{Budget}
но когда я его компилирую. В нем говорится, что у меня проблема с выражением. Я использую редактор выражений Jasper Studio
Оба $ F {Budget} и $ F {Actual} являются текстовыми полями и классом java.math.BigDecimal
Здесь трассировка трассы
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
${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})
Посмотрите на свою трассировку стека. Он имеет эту линию.
Caused by: java.lang.ArithmeticException: Division by zero
Таким образом, $F{Budget}
равен нулю, и это только право, что вы не можете разделить его.
Вам не хватает пары()?
Это создаст двусмысленность вашего выражения, если ассоциация не указана. (Компилятор/синтаксический анализ)