iReport - passar query como parâmetro [RESOLVIDO]

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

Parece que no finalzinho da query tem algum lixo de código:

AND Produto.idFamilia = Familia.idFamilia $P!{idFamilia} AND Familia.exibir = 1 ORDER BY Produto.codigo

[quote=Roselito Fávero da Silva]Parece que no finalzinho da query tem algum lixo de código:

AND Produto.idFamilia = Familia.idFamilia $P!{idFamilia} AND Familia.exibir = 1 ORDER BY Produto.codigo [/quote]

$P!{idFamilia} é o parâmetro que eu passo na minha classe:

parametros.put(parametro, "AND Familia.idFamilia = " + request.getParameter("idFamilia"));

Portanto se o usuário selecionar alguma família, a query vai ser alterada e ficará, por exemplo, assim (caso o id da família selecionada seja 1):
AND Produto.idFamilia = Familia.idFamilia AND Familia.idFamilia = 1 AND Familia.exibir = 1 ORDER BY Produto.codigo

E você mandou imprimir (no relatório) apenas os valores dos parâmetros para ver se eles chegaram corretamente?

E depois o valor (sem executar a query) da query para ver se o texto montado está ok?

Vlw Roselito.

Coloquei o paramêtro para ser impresso no relatório e consegui identificar o erro.

O problema era que tinha uma parte do meu código que estava sobreescrevendo o valor do parâmetro, e por isso dava o erro.

Mto obrigado pela ajuda.