Não consigo pegar os parâmetros no iReport

7 respostas
S
Olá pessoal, estou com problemas para pegar os parâmetros no iReport. Eu sei que consigo chegar até eles, pois já testei a visualização... mas qndo chamo o relatório ele imprime as informações como se eu tivesse passado o String[] todo com 0 parâmetros... vou colocar o código de como estou pegando as informações:
package estudo;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.design.JRJdtCompiler;
import net.sf.jasperreports.engine.design.JasperDesign;

public class geraRelatorio extends HttpServlet{

    private static Connection getConnection( ) throws ClassNotFoundException, SQLException{
        //faço a conexão com o banco.
        }
    
  
    public void doPost (HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        doGet(request, response);
    }
    
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
     throws IOException, ServletException  {  
           
         String[] vlParametro = request.getParameterValues("clientes");  
         
                  
       // obtém a conexão com o banco de dados  
         Connection con = null; 
         try {  
             Class.forName("oracle.jdbc.driver.OracleDriver");  
             con = getConnection(); 
         } catch (Exception e) {  
             System.out.println("Erro ao obter conexao via DriverManager: " + e.getMessage());  
         }  
           
         // gera o relatório  
         ServletContext context = getServletContext();
        
        
         
         
         byte[] bytes = null;  
         try {  
               
               
             // carrega os arquivos jasper  
//             JasperReport compiledReport = (JasperReport)JRLoader.loadObject(  
//                     context.getRealPath("\web\relatorioNomeAlunos.jasper"));  
               
             java.io.File jrxmlFile = new java.io.File("F:\Documents and Settings\Samara\Meus documentos\CódigoNTI\TestePRPG\web\TesteOra.jrxml");
             JasperDesign design = net.sf.jasperreports.engine.xml.JRXmlLoader.load(jrxmlFile);
             JRJdtCompiler comp = new JRJdtCompiler();
    	     JasperReport compiledReport = comp.compileReport(design);
             
                           
             // parâmetros, se houverem  
             Map parametros = new HashMap();  
             for(int i=0; i < vlParametro.length; i++){
                parametros.put("nr_op", vlParametro[i]); 
             }
             // direciona a saída do relatório para um stream  
             bytes = JasperRunManager.runReportToPdf(compiledReport,parametros,con);  
         } catch (JRException e) {  
             e.printStackTrace();  
         }  
         if (bytes != null && bytes.length > 0) {  
             // envia o relatório em formato PDF para o browser  
             response.setContentType("application/pdf");  
               
             response.setContentLength(bytes.length);  
             ServletOutputStream ouputStream = response.getOutputStream();  
             ouputStream.write(bytes, 0, bytes.length);  
             ouputStream.flush();  
             ouputStream.close();  
         }
}
}

E minha query no iReport tah assim:

SELECT DISTINCT
     A."ALU_MATRICULA",
     P."PES_NOME",
     P."PES_DT_NASCIMENTO",
     O."OSA_DESCRICAO"
FROM
     "PRPG"."ALUNOS" A,
     "PRPG"."PESSOAS" P,
     "PRPG"."OBSERVACOES_SITUACOES_ALUNOS" O
WHERE
     A.ALU_PES_COD_PESSOA = P.PES_COD_PESSOA
 AND A.ALU_OBS_SITUACAO_ALUNO = O.OSA_COD_OBSERVACAO
 AND A.ALU_ECU_NIV_PRG_COD_PROGRAMA = $P{programa} 
 AND A.ALU_OBS_SITUACAO_ALUNO = $P{situacao} 

ORDER BY
     P.PES_NOME ASC

Será que alguém pode me ajudar? Ah.. esses parametros no banco estão declarados como number.

7 Respostas

luiscesarinfo
Se eu compreendi bem o seu codigo, os parametros que vc precisa na query são :

$P{situacao}

$P{programa}

e no seu HashMap(), vc está passando “nr_op”.

Os parametros que vc vai passar atraves do HashMap() tem que ter o mesmo nome dos parametros que vc vez no relatorio do iReport. tipo :

//Parametros do relatorio
Map parametros = new HashMap();
for(int i=0; i < vlParametro.length; i++)
{   
    parametros.put("situacao", vlParametro[i]);
    parametros.put("programa", vlParametro[i]);
}

Pelo menos é assim que eu faço e funciona…

qquer coisa faz outro post ai…

[]'s Luis Cesar

S

Ow Luis… tentei mudar isso e agora não apareceu mais nada… nem se quer gera o pdf em branco… :cry:

luiscesarinfo

Verifique os nomes dos parametro no iReport. Veja se estão batendo e também a questão do caminho… (só uma dica, as vezes passou algo despercebido).

[]'s

S

Teoricamente acho que o que deve tah errado é que estou passando como parametro para a consulta uma variavel do tipo String, mas ela não deveria ser do tipo number não? Tipo… eu não deveria passar ela pra Long não? Tentei passar mas diz q eh invalido… =/

luiscesarinfo

Se o campo no seu banco for number, faça o seguinte :

no seu parametro do iReport coloque no campo “Tipo de Classe do Parametro” : java.lang.Integer
e no campo “Valor Padrão da Expressão”: new Integer(1)

tenta isso ai…

[]'s

B

O tipo do seu parametro no relatório tem que bater com o tipo do seu parametro na sua classe java,se for necessario
faça a conversão na classe mesmo…

String idade = jTextFieldIdade.getText(); HashMap parameters = new HashMap(); parameters.put("idadep",Integer.parseInt(idade)); //idadep é o nome do parametro que criei no relatório

E como o luiscesarinfo falou no relatorio você deve configurar o tipo como inteiro e também colocar um valor padrão para expressão:
new Integerr(1)
select *
from tabela
where idade = $P{idadep}

S

Valeu pessoal, deu certo sim. Agora eu forcei ele receber os dados… só pra ver se gerava o relatório, e gerou bonitinho -

Aí agora tou passando por outro probleminha… não consigo pegar os dados certos fazendo assim:

Map parametros = new HashMap();  
for(int i=0; i < vlParametro.length; i++)  
 {     
      parametros.put("programa", vlParametro[i]);
      parametros.put("situacao", vlParametro[i]);
            
  }

Sempre exibe dados errados…será que tem problema usar esse for? =/

Criado 29 de novembro de 2007
Ultima resposta 4 de dez. de 2007
Respostas 7
Participantes 3