Parâmetros do IReport no JasperReport

Estou com uma dúvida. Já procurei aqui no GUJ e na Internet mas não encontrei a resposta.

Eu utilizo o Crystal Reports como solução de relatórios para minha aplicação Java. Ele permite que eu crie o relatório numa ferramenta de design, defina os parâmetros de consulta e salve como um arquivo que pode ser chamado de dentro da aplicação. Quando eu chamo o relatório, eu não preciso passar os parâmetros, a API do crystal recupera os parâmetros que foram definidos e exibe-os automaticamente para o usuário preencher.

No caso do JasperReports não ocorre o mesmo. Eu defino o design e os parâmetros de consulta do relatório no IReport, mas quando chamo na aplicação eu preciso passar os parâmetros novamente, via HashMap. Eu gostaria de não ter que passar os parâmetros, como faço com o Crystal.

Alguém sabe se isso é possível?

E ai gente boa, eu nunca usei Crystal Reports…
Vou te dar uma dica:

public void geraRelatorio1(JanRelatorioEtiqChenille relatorio1) throws JRException, Exception { 
	Connection con = conexao.criaConeccao();
	con.setAutoCommit(false);
	
	PreparedStatement consulta = con.prepareStatement
	( 
			" select * from chenille " +
			" where codEtiqueta = ? " 
	); 
	try{
		consulta.setInt(1,Integer.parseInt(relatorio1.campo1.getText())); //PEGA O PARAMETRO DA SUA APLICAÇÃO
		ResultSet rs = consulta.executeQuery();
		
		/* implementação da interface JRDataSource para DataSource ResultSet */ 
		JRResultSetDataSource jrRS = new JRResultSetDataSource(rs); 
		
		/* HashMap de parametros utilizados no relatório. Sempre instanciados */ 
		HashMap parameters = new HashMap(); 
		JasperFillManager.fillReportToFile(path+"TextilETQGUI/Relatorio/EtiquetasChenilleZebra.jasper", parameters, jrRS); 
		JasperViewer.viewReport(path+"TextilETQGUI/Relatorio/EtiquetasChenilleZebra.jrprint",false,false); 
		
		con.commit();
	}
	catch(Exception e){
		JOptionPane.showMessageDialog(null,"Relatorio nao pode ser exibido, Erro "+e,"Mensagem", 0);
		con.rollback();
		consulta.close();
	}
	
}


   Espero ter ajudado vc, valeu

Oi Leandro,

Obrigado pela resposta!!!
Vou testar aqui e logo retorno se tive sucesso.

Eu testei mas não é exatamente o que preciso. Essa classe pega parâmetros da aplicação, no caso de um formulário. O que preciso é que os parâmetros definidos no IReport sejam pedidos para o usuário automaticamente, não via código.

Exemplo:
1 - usuário seleciona o relatório
2 - abre uma tela pedindo os parâmetros do relatório
3 - o usuário informa os parâmetros
4 - o relatório é gerado

O passo 2 no CrystalReports é realizado automaticamente pela API do próprio crystal.
No caso gostaria que o JasperReports fizesse o mesmo, exibisse automaticamente a tela pedindo os parâmetros que foram definidos no IReport.

entao tenta fazer assim amigo… entao vc quer que os parâmetros definidos no IReport sejam pedidos automaticamente, não via código

[/img]






Continuaçao…[img]




Por favor colocar em ordem isso, nao consegui colocar em seguencia, pra vcs fazer no seus projetos …valeu!

1º JasperIreport_Paramentros01
2º JasperIreport_Paramentros02
3º JasperIreport_Paramentros03
4º JasperIreport_Paramentros04
5º JasperIreport_Paramentros05

Eu não estou conseguindo ler os textos das imagens, mas acredito que seja isso:

1 - criar parâmetro
2 - alterar sql para filtrar pelo parâmetro
3 - gerar relatório (aqui o IReport gera uma tela pedindo o parâmetro)

Se for isso, eu consegui realizar - o IReport apresenta a tela automática para preenchimento dos parâmetros! Porém quando chamo o relatório.jasper de dentro da aplicação, os parâmetros definidos no IReport são deixados de lado. Eu tenho que passá-los novamente via código. Essa janela que aparece pedindo os parâmetros no IReport não aparece na aplicação.

Mais fácil…
Como posso usar o Select que eu defini no IReport, sem precisar redefini-lo na aplicação?

kra fiz tutorial so com imagem … ta facil amigo!
valeu!!!

[img]

Coloque em ordem

1º Jasper_Ireport_Conexao_Banco_MySQL01.JPG
2º Jasper_Ireport_Conexao_Banco_MySQL02.JPG
3º Jasper_Ireport_Relatorio.JPG






Puxa ate issu tenho q ensina colega clique em Download e baixa a imagem … abra com o paint do windows, ai vc vai consegui enxerga as imagens ou senao compre um software pra aumenta o zoom, heheheheh !

Leandro, obrigado pelo tempo dispendido para elaborar os tutoriais. Repito, eu consegui realizar tudo o que foi passado nos tutoriais, mas não é esse meu objetivo. Talvez você não tenha entendido a minha necessidade. Mesmo assim muito obrigado.

Mais alguém pode me ajudar?

Abaixo segue o código que uso para acesso ao relatório.
Veja que uso uma query para puxar os dados.

A primeira questão é: como puxar os dados sem usar a query no código, mas sim a definida no IReport?

String relatorio = "c:/comissao.jasper";
Connection con = getConnection();
Statement stmt = con.createStatement();
		
String query = 	"SELECT   num_pedido, " +
			"         data, " +
			"         comissao " +
			"FROM     alb_comis_controle " +
			"WHERE    versao_atual = 'S' " +
			"AND      comissao > 0 " +
			"AND      data BETWEEN '01/10/2007' AND '01/11/2007' " + 
			"ORDER    BY comissao";

ResultSet rs = stmt.executeQuery(query);
		
JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
		
// Cria uma varável de parâmetros (não utilizada)
HashMap param = new HashMap();
		
// Recupera o arquivo compilado para um objeto Java
JasperPrint print = JasperFillManager.fillReport(relatorio, param, jrRS);

// Exporta o arquivo compilado para um arquivo pdf
JasperExportManager.exportReportToPdfFile(print, "c:/comissao.pdf");
		

entaoo eu te passei os dois jeito nao existe milagre …
1º vc usa o aplicativo java e passa o parametro
2º vc usa a ferramenta e passa o parametro digitando
3º jeito vc coloca o valor do parametro pra nao fica digitando toda hora, assim…


Oi Leandro,

A questão não é nem milagre, rs. É que se eu não conseguir puxar os parâmetros na aplicação (sem chamá-los por código) como faço com o Crystal, eu não poderei usar o Jasper. Continuarei usando o Crystal. (ps: o motivo da troca do crystal por jasper é a performance).

Pesquisei aqui e caminhei um pouco, veja.

Usando esse código posso chamar um relatório na aplicação com o SQL definido no IReport (já que não passo um datasource no método de preenchimento do relatório):

Connection con = getConnection();
Map param = new HashMap();

JasperDesign jdesign = JRXmlLoader.load("c:/comissao.jrxml");
JasperReport jreport = JasperCompileManager.compileReport(jdesign);
JasperPrint jprint = JasperFillManager.fillReport(jreport, param, con);
JasperExportManager.exportReportToPdfFile(jprint, "c:/comissao.pdf");

O problema é que no SQL do IReport há um parâmetro, e como não especifico parâmetro nenhum ele adota o valor padrão para gerar o relatório. Eu poderia então definir um valor para o parâmetro no código, mas não quero isso. Quero que o prompt que aparece no IReport para o usuário preencher, quando dou um run, apareça também na aplicação, sem eu ter que programar nada. No Crystal é assim. Mas estou começando a achar que não existe essa possibilidade no Jasper.

Então pensei numa solução mais ou menos assim:

JRParameter[] jrp = jr.getParameters();
int x = 0;
while (x < jrp.length) {
	if (jrp[x].isSystemDefined() == false) {
		// Pedir para o usuário digitar o valor do parâmetro
        // Colocar o valor digitado no HashMap 
	}
	x++;
}

É uma solução pouco elegante, mas até agora vejo como única.
Vou continuar pesquisando e coloco aqui o final da história…

PS: Eu poderia criar uma tela fixa para passagem dos parâmetros pelo usuário, por exemplo data1, data2… mas são muitos relatórios e cada um deles tem parâmetros diferentes - teria que criar diversas telas. Por isso estou buscando recuperar esses parâmetros dinamicamente.

Aqui está a solução implementada.


public static void main(String args[]) throws ClassNotFoundException, SQLException, JRException {

	Connection con = getConnection();
	
	JasperDesign jdesign = JRXmlLoader.load("c:/comissao.jrxml");
	JasperReport jreport = JasperCompileManager.compileReport(jdesign);	
		
	String valor;
	Map param = new HashMap();
	JRParameter[] jparam = jreport.getParameters();
	int x = 0;
	while (x < jparam.length) {
		if (jparam[x].isSystemDefined() == false && jparam[x].isForPrompting() == true) {
			// Pede parâmetro ao usuário
			valor = JOptionPane.showInputDialog("Digite o valor para: " + jparam[x].getName() + "\n " + jparam[x].getDescription());
			// Preenche o Map de parâmetros
			param.put(jparam[x].getName(), valor);
		}
		x++;
	}
		
	JasperPrint jprint = JasperFillManager.fillReport(jreport, param, con);
	JasperViewer.viewReport(jprint);
		
}

O que eu queria realmente era que o jasper fizesse o trabalho de exibir os parâmetros do relatório para o usuário preencher. Como estou fazendo na mão, estou pegando todos os parâmetros como String. Agora restam 2 dúvidas:

1 - Como obter um objeto JasperReport diretamente de um arquivo já compilado? (no código obtenho de um .jrxml).

2 - Como saber qual é o tipo de dados que um parâmetro espera.

Para a questão 1, depois de muito procurar achei!!

Substituí as linhas

JasperDesign jdesign = JRXmlLoader.load("c:/comissao.jrxml");  
JasperReport jreport = JasperCompileManager.compileReport(jdesign);

Por

JasperReport jreport = (JasperReport) JRLoader.loadObject("c:/comissao.jasper"); 

Agora só falta a segunda questão.

Como obter os tipos dos parâmetros definidos no IReport? Sabe essa Leandro?

pode ser que isso ajude:

http://www.guj.com.br/posts/list/51368.java#271117

abraço

Olá o que o Leandro passou, realmente tá de parabens, mas para detalhar o que vc quer fazer, eu fiz o seguinte SERVLET:

package Servlets;

import java.io.;
import java.net.
;
import java.sql.Connection;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.;
import javax.servlet.http.
;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;
import pacSocial.ConexaoMySQL;

/**
*

  • @author Carlos Mazzi

*/

public class RelatorioParam1 extends HttpServlet {

protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
throws ServletException, IOException {
    
    String aux=request.getParameter("aux");
    int data_inicio=20071101; //os parametros aqui vc pega num edit, fiz só de exemplo pra tu ver
    int data_fim=20071212; ////os parametros aqui vc pega num edit, fiz só de exemplo pra tu ver
    
    
    
    ServletContext context = this.getServletConfig().getServletContext();
    File relatorioJasper = new 
             File(context.getRealPath("/WEB-INF/reports/"+aux));
   
    Connection conn=   (Connection) ConexaoMySQL.getConexaoMySQL();
    Map parametros = new HashMap();
    parametros.put("data_ini", data_inicio);  //aqui o 'put', pega o 
                                                               //  NOME do parametro criado no jasper, e o nome da variavel no servlet
    parametros.put("data_fim", data_fim);   //idem
    
    
    byte[] bytes = null;
    
    try{
       JasperPrint impressao = 
               JasperFillManager.fillReport(relatorioJasper.getPath() , parametros, conn);   

       bytes = JasperRunManager.runReportToPdf(relatorioJasper.getPath(),parametros,conn); //aqui a conversao para o formato
    
    }
    catch(Exception e){
       e.printStackTrace();
    
    }
    if (bytes != null && bytes.length >0) {
       response.setContentType("application/pdf"); //aqui tu escolhe o formato q vai ser visualizado por um prog. externo.
       response.setContentLength(bytes.length);
       ServletOutputStream outputStream = response.getOutputStream();
       outputStream.write(bytes,0,bytes.length);
       outputStream.flush();
       outputStream.close();
       
     
    }    
} 

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** 
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
} 

/** 
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/** 
* Returns a short description of the servlet.
*/
public String getServletInfo() {
    return "Short description";
}
// </editor-fold>

}

Olá Vinicios,

Estou com o mesmo problema que o seu.
Você chegou a descobri como fazer?

Att.