Calculos Matematicos, Condicionais e Lógicos no IReport

10 respostas
Gabriel_Rocha

Boa tarde a Todos!

Sou iniciante com java, anteriormente "brincava" com .net estou tentando migrar, por isso, por favor, me desculpem caso ocorran deslizes. 
  Pesquisei em alguns foruns e não consegui assimilar, como fazer calculos (operações básicas, condicionais, lógicas e agregadas) no IReport. Tentei fazer uma simples divisão através de uma variavel para um field não relacionado ao banco, pois estou passando RESULTSET atraves do JRResultSetDataSource, e deu erro.

Tentei dentro de uma variavel e depois referenciei a um TextFiel, das seguintes formas:

$F{EST_FINAL}).divide($F{EST_FINAL}) //Primeira tentativa
divide($F{EST_FINAL},$F{EST_FINAL})) //Segunda tentativa

Tenho o retorno abaixo no momento da compilação:

Compilation exceptions: com.jaspersoft.ireport.designer.compiler.ErrorsCollector@fec89 net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. Syntax error on token ")", delete this token value = ((java.math.BigDecimal)field_EST_FINAL.getValue())).divide(((java.math.BigDecimal)field_EST_FINAL.getValue())); //$JR_EXPR_ID=8$ ^ 2. Syntax error on token ")", delete this token value = ((java.math.BigDecimal)field_EST_FINAL.getOldValue())).divide(((java.math.BigDecimal)field_EST_FINAL.getOldValue())); //$JR_EXPR_ID=8$ ^ 3. Syntax error on token ")", delete this token value = ((java.math.BigDecimal)field_EST_FINAL.getValue())).divide(((java.math.BigDecimal)field_EST_FINAL.getValue())); //$JR_EXPR_ID=8$ ^ 3 errors at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:204) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:512) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1452) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2032) Compilation running time: 424

Preciso talvez um “passo-a-passo” como utilizar operadores de cálculo, onde referencia-los e qual sitaxe para realiza-los no IReport, que alias está me dando uma canseira danada. Eu utilizava o ReportViewer, acho que acabei viciando em algumas funcionalidades.

Obrigado.

10 Respostas

B

http://jasperforge.org/plugins/espforum/view.php?group_id=83&forumid=101&topicid=19988

Gabriel_Rocha

bezier curve, obrigado pela resposta.

Mas fiz conforme a orientação do link e não deu certo. Criei uma variavel e em sua propriedade VARIEBLE EXPRESSION coloquei o seguinte código:
new java.math.BigDecimal($F{EST_FINAL}.devide($F{EST_FINAL}.doubleValue()))
No momento da compilação o retorno foi esse:

Compiling to file... C:\Users\Controladoria 1\Documents\NetBeansProjects\Controladoria\src\Relatorios\Estoque\EstNegativo.jasper Errors compiling C:\Users\Controladoria 1\Documents\NetBeansProjects\Controladoria\src\Relatorios\Estoque\EstNegativo.jasper! Compilation exceptions: com.jaspersoft.ireport.designer.compiler.ErrorsCollector@103fa67 net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. The method devide(double) is undefined for the type BigDecimal value = new java.math.BigDecimal(((java.math.BigDecimal)field_EST_FINAL.getValue()).devide(((java.math.BigDecimal)field_EST_FINAL.getValue()).doubleValue())); //$JR_EXPR_ID=10$ <----> 2. The method devide(double) is undefined for the type BigDecimal value = new java.math.BigDecimal(((java.math.BigDecimal)field_EST_FINAL.getOldValue()).devide(((java.math.BigDecimal)field_EST_FINAL.getOldValue()).doubleValue())); //$JR_EXPR_ID=10$ <----> 3. The method devide(double) is undefined for the type BigDecimal value = new java.math.BigDecimal(((java.math.BigDecimal)field_EST_FINAL.getValue()).devide(((java.math.BigDecimal)field_EST_FINAL.getValue()).doubleValue())); //$JR_EXPR_ID=10$ <----> 3 errors at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:204) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:512) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1452) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2032) Compilation running time: 332

Não consigo entender, como é dificil fazer algo que parece ser simples. Por favor, caso alguém tenha algum material que possa compartilhar, ficarei grato.

Obrigado,

leoramos

Tem um erro de digitação ali… é “divide” e tá “devide”.

=)

Gabriel_Rocha

leoramos, Obrigado pela observação.

Logo que postei acabei percebendo e corrigi no código mas  o erro é o mesmo, não deu certo mesmo com a grafia correta. Mesmo assim valeu, o ficando maluco o dia todo e não consegui.
leoramos

Ah, tem um detalhe: tu tá fazendo a divisão por um double. O método divide recebe é um BigDecimal, cara. Não vai funcionar porquê esse método não existe com essa assinatura.

Gabriel_Rocha

leoramos, valeu pela dica.

Mudei para BigDecimal, mas não funcionou do mesmo jeito.

Criei uma nova variavel, e nas propriedades fiz da seguinte forma:

Nome: Variavel1
                 Varieble Class: java.math.BigDecimal
                 Reset type: Report
                 Variable Expression: new java.math.BigDecimal($F{EST_FINAL}.devide($F{EST_FINAL}.BigDecimal()))

Também tentei assim:

Nome: Variavel1
                 Varieble Class: java.math.BigDecimal
                 Reset type: Report
                 Variable Expression: new java.math.BigDecimal($F{EST_FINAL}.devide($F{EST_FINAL}))

Também tentei assim:

Nome: Variavel1
                 Varieble Class: java.math.BigDecimal
                 Reset type: Report
                 Variable Expression: $F{EST_FINAL}.devide($F{EST_FINAL})

O campo (field) $F{EST_FINAL} esta definido como BigDecimal. E sempre traz o mesmo tipo de erro: The method BigDecimal() is undefined for the type BigDecimal

Quando tento compilar o relatorio aparece o seguinte erro:

/* Compiling to file... C:\Users\Controladoria 1\Documents\NetBeansProjects\Controladoria\src\Relatorios\Estoque\EstNegativo.jasper
Errors compiling C:\Users\Controladoria 1\Documents\NetBeansProjects\Controladoria\src\Relatorios\Estoque\EstNegativo.jasper!
Compilation exceptions: com.jaspersoft.ireport.designer.compiler.ErrorsCollector@15169a9  net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. The method BigDecimal() is undefined for the type BigDecimal                 value = new java.math.BigDecimal(((java.math.BigDecimal)field_EST_FINAL.getValue()).devide(((java.math.BigDecimal)field_EST_FINAL.getValue()).BigDecimal())); //$JR_EXPR_ID=10$                                                                                                                                                               <--------> 2. The method BigDecimal() is undefined for the type BigDecimal                 value = new java.math.BigDecimal(((java.math.BigDecimal)field_EST_FINAL.getOldValue()).devide(((java.math.BigDecimal)field_EST_FINAL.getOldValue()).BigDecimal())); //$JR_EXPR_ID=10$                                                                                                                                                                     <--------> 3. The method BigDecimal() is undefined for the type BigDecimal                 value = new java.math.BigDecimal(((java.math.BigDecimal)field_EST_FINAL.getValue()).devide(((java.math.BigDecimal)field_EST_FINAL.getValue()).BigDecimal())); //$JR_EXPR_ID=10$                                                                                                                                                               <--------> 3 errors      at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:204)     at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:512)     at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1452)     at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2032) 
Compilation running time: 12.944 */

Obrigado.

Gabriel_Rocha
Consegui compilar o reltório da seguinte forma:
$F{EST_FINAL}.divide($F{EST_FINAL})
Eu estava cometendo um erro de gráfica colocando um "(" a mais no código e postei o correto. Desculpe.

Mas quando coloco o relatório para rodar dá erro em tempo de execução:

Exception in thread "main" net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
	Source text : $F{EST_FINAL}.divide($F{EST_FINAL})
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:267)
	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:1220)
	at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1194)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1544)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:142)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841)
	at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88)
	at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
	at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:542)
	at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:522)
	at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:888)
	at Relatorios.GerarRelatorio.EstoqueRel(GerarRelatorio.java:116)
	at controladoria.Controladoria.main(Controladoria.java:26)
Caused by: java.lang.ArithmeticException: Division undefined
	at java.math.BigDecimal.divide(BigDecimal.java:1586)
	at null_1347539273730_589324.evaluateEstimated(null_1347539273730_589324:469)
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:254)
	... 15 more
Java Result: 1
leoramos

O teu problema não é o iReport mesmo, mestre, é no código Java mesmo.
Oh:
http://jasperforge.org/plugins/espforum/view.php?group_id=83&forumid=101&topicid=74249

Tu tá com alguma divisão por zero ou coisa do gênero aí. Coloca um operador ternário aí que teu problema se resolve :slight_smile:

Abraço!

Gabriel_Rocha

leoramos, Vlw cara.

Voltarei a prancheta e vou estudar mais...
Gabriel_Rocha

leoramos, Vlw cara.

Voltarei a prancheta e vou estudar mais…

Criado 12 de setembro de 2012
Ultima resposta 18 de set. de 2012
Respostas 10
Participantes 3