[Resolvido]Parâmetros ireport

7 respostas
G

Bom dia,
estou fazendo um relatório web aqui, e estou tendo um grande problema que não consigo resolver de jeito nenhum, agradeceria se alguém pudesse me ajudar, tenho que mostrar um relatório que funciona perfeitamente sem parametros, mas com parametros ele dá uns erros, postarei aqui o código:

//variáveis e etc..
mapa.put("statuss", statuss);
mapa.put("secao", secao);
mapa.put("dataa", dataa);
mapa.put("dataf", dataf);
JasperPrint relatorio = JasperFillManager.fillReport(path+rel, mapa, cnn);
JasperViewer.viewReport(relatorio);
//fechando conexões

a string sql do relatório é essa

//no java eu coloco os %% do like, por isso não tem nenhum aqui..
select * from atendimentos where statuss 
like('$P{statuss}') 
and secao like('$P{secao}') 
and dataa between '$P{dataa}' and '$P{dataf}'

e agora o erro

Error preparing statement for executing the report query : 

select * from atendimentos where statuss 
like('?') 
and secao like('?') 
and dataa between '?' and '?'


	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:238)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:129)
	at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:681)
	at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:601)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1247)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:877)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:826)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:59)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)
	at br.com.dae.relatorios.Relatorios.GeraRelatorio(Relatorios.java:67)
	at br.com.dae.relatorios.Relatorios.service(Relatorios.java:27)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
	at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3646)
	at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3630)
	at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4481)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.setStatementParameter(JRJdbcQueryExecuter.java:409)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.setStatementParameter(JRJdbcQueryExecuter.java:255)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:230)
	... 24 more

agradeço desde já…

7 Respostas

Mero_Aprendiz

Olá.
Coloque uma exclamção(!) depois do $P.
Vai ficar assim:

select * from atendimentos where statuss 
like('$P!{statuss}') 
and secao like('$P!{secao}') 
and dataa between '$P!{dataa}' and '$P!{dataf}'

[]'s
JL

P.S.: Tem um tempo que não meixo com JasperReports/iReport, então não me lembro bem se o ! é antes ou depois do P. Teste ai e diga pra gente.

G

valeu, o erro parou, mas não está trazendo nenhum valor no relatório, diz que ele não tem páginas, o que esse “!” faz ?

emmanuelrock

Amigo, eu faço assim: no iReport eu faço a consulta sem join:

select * from atendimentos

isso só para pegar os campos.

A consulta com o join eu faço no Java, e depois passo o result set para o Jasper.

Não sei sé é a melhor abordagem, mas é assim que faço. E dá certo. Caso as páginas não sejam geradas, um indício é que a consulta não retornou linhas. Execute a consulta no BD e depois cole no código. Flow!

G

o script da consulta tá certim, eu já testei,
mas então diz, eu vo faze uma rotina que passe a consulta por todos os filtros que eu quero
e depois pra passar esse resultset pro relatorio eu faço como?
passo pelo map ?

emmanuelrock

Olha um exemplo, um método que fiz:

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JFrame;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.view.JasperViewer;
import org.hibernate.Session;

public class Relatorio {

    private static Session session;
    private static PreparedStatement stmt;
    private static Connection conexao;
    private static ResultSet rs;
    private JasperPrint impressao;
    private JRResultSetDataSource jr;

    public Relatorio() {
        session = util.HibernateUtil.getSession();
        conexao = session.connection();
    }
 
   public boolean imprimirRelatorio(String path, String consulta, Map mapa) {
        try {
            stmt = conexao.prepareStatement(consulta);
            rs = stmt.executeQuery();

            jr = new JRResultSetDataSource(rs);//aqui vc passa o result set
            impressao = JasperFillManager.fillReport(new File(path.trim()).getAbsolutePath(), mapa, jr);
            JasperPrintManager.printReport(impressao, false);
            return true;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (JRException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}

Está meio precário, dá uma melhorada.

G

valeu cara, consegui organizar ae e meu relatório funcionou, obrigado gente!

carolino

acompanhando o código tenho uma duvida…

public Relatorio() {  
         session = util.HibernateUtil.getSession();  
         conexao = session.connection();  
}

esse método funcionou sem problemas?
de onde veio esse util?

não vi nenhum import ou declaração referente a ele :S

Criado 31 de março de 2010
Ultima resposta 8 de abr. de 2010
Respostas 7
Participantes 4