Bom dia.
Estou usando o iReport para gerar um relatório com a tabela de preço dos produtos. Antes de gerar o relatório, aparece uma tela para o usuário selecionar os filtros que ele deseja usar na lista de produtos.
Por exemplo, ele pode selecionar qual a familia dos produtos que ele deseja saber os preços.
Na minha classe uso o seguinte código para determinar o parâmetro:
if(parametro.equals("idFamilia")){
if(!request.getParameter("idFamilia").equals("0")){
parametros.put(parametro, "AND Familia.idFamilia = " + request.getParameter("idFamilia"));
}
}
Esse parâmetro é passado para o relatório onde tenho um parâmetro com o nome idFamilia, do tipo text e com o expressão default “” (ou seja, vazio, para o caso do usuário não selecionar o filtro e portanto o parâmetro ser nulo).
A query no iReport está assim:
SELECT DATE_FORMAT(NOW(),'%d/%m/%Y') hoje, tabela1.codigo codigoInstituicao, tabela1.nomeFantasia, Produto.codigo, Produto.descricao, Produto.quantidadePedra, IF(Produto.unidade+0=1,'-',CONCAT(FORMAT(Produto.peso,2),'x',IF(Produto.fatorPeso=Produto.preco AND tabela1.fatorGR < Produto.fatorPeso,Produto.fatorPeso,tabela1.fatorGR),IF(Produto.pedraOF<>0,CONCAT('+',Produto.pedraOF),''))) valor, IF(Produto.unidade+0=1,Produto.preco*tabela1.fatorPC,Produto.peso*IF(Produto.fatorPeso=Produto.preco AND tabela1.fatorGR < Produto.fatorPeso,Produto.fatorPeso,tabela1.fatorGR)+Produto.pedraOF) precoFinal FROM Familia, Produto LEFT JOIN (SELECT TabelaVendas.*, Instituicao.codigo, Instituicao.nomeFantasia, Cliente.idCliente FROM TabelaVendas, Cliente, Instituicao WHERE Cliente.idInstituicao = Instituicao.idInstituicao AND Cliente.idTabelaVendas = TabelaVendas.idTabelaVendas AND Cliente.idCliente = $P{idCliente}) tabela1 ON tabela1.idCliente = $P{idCliente} WHERE Produto.dataForaLinha = '0000-00-00' AND Produto.idFamilia = Familia.idFamilia $P!{idFamilia} AND Familia.exibir = 1 ORDER BY Produto.codigo
No iReport os campos são mostrados e o relatório funciona, mas qd tento usar na aplicação dá o erro:
2013-10-07 10:03:16,301 [http-bio-8080-exec-5] ERROR br.com.progold.core.GeradorRelatorio - Error executing SQL statement for : PrecosCliente2
net.sf.jasperreports.engine.JRException: Error executing SQL statement for : PrecosCliente2
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:229)
at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:758)
at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:623)
at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1160)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:802)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:746)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)
at br.com.progold.core.GeradorRelatorio.doGet(GeradorRelatorio.java:136)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1 AND Familia.exibir = 1 ORDER BY Produto.codigo' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:97)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:97)
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:222)
... 27 more
Alguém sabe como resolver?
Grato desde já!
João Carlos