Passar instrução sql pro ireport

9 respostas
M

O negócio é o seguinte, tenho um jframe com alguns jtextfields que eu puxo os valores do banco de dados, todos esses campos são referentes a apenas um ID da tabela.
Gostaria de montar um relatório contendo apenas esses campos, utilizando o ireport.
pra isso eu teria que passar o sql (select * from tabela where tabela_id=xxx), porem no ireport vc faz a instrução sql dentro do proprio relatório, aí nao da pra enviar o id do qual eu quero pegar os dados…
Tem algum jeito de fazer isso?
ou algum jeito de fazer um relatório pra imprimir sem usar o ireport?

9 Respostas

D

É possível, o iReport permite criação de queries dinâmicas (que recebem parâmetros).
Aqui mesmo no guj tem vários exemplos, dá uma pesquisada

M

Só pra nao criar outro tópico, como eu adiciono o driver do firebird no ireport?
Pois ele não mostra o driver do firebird, só dos outros databases.

D

mateusviccari:
Só pra nao criar outro tópico, como eu adiciono o driver do firebird no ireport?
Pois ele não mostra o driver do firebird, só dos outros databases.

Quer economizar árvores?
O assunto não tem nada a ver com esta pergunta, portanto, outro tópico deve ser aberto.

Ah, e não no fórum de java avançado, mas de ferramentas e utilitários

A

Siga os passos:

  1. Monte o relatório no i-Report.

  2. No painel do lado esquerdo (provavelmente) você verá o ReportInspector, com a subentrada Fields, clique com o botão direito sobre ela e clique em Adicional Field. Faça isso para quntos campos sua consulta SQL retornar e renomeie-os para os nomos dos campos que sua consulta irá retornar ex.
    ID
    NOME
    TELEFONE

  3. Depois, na entrada na entrada parameters crie um novo parametro e renomei-o. Ex:
    COD.

  4. Ainda no ReportInspector clique na primeira entrada (a com o nome do relatório) e no painel Properties edite o campo SQL colocando sua consulta colocando o parametro como condição, ex:
    SELECT ID, NOME, TELEFONE FROM CLIENTES WHERE ID=$P{COD}

  5. Em cada TexField do seu relatório clique com o botaõ direito e clique em Edit expression, delete o $F{field} em vermelho, procure o field específico na lista em baixo dê duplo clique sobre ele e o mesmo aparecerá na parte superior. Clique em aplicar.
    Repita o procedimento para todos os TextFields.

  6. Compile o relatório. (o ícone do martelo). Se dudo estiver correto ele criará o arquivo .jasper correspondente. Cole esse arquivo no patch do seu programa JAVA.

  7. Na hora de chamar o relatório crie um objeto map e passe o código como parâmetro de busca para a SQL ex.:
    
    Map<String, String> param = new HashMap<String, String>();
    
    param.put(COD, CodCliente);
    
    JasperFillManager.fillReportToFile(relatorio+".jasper", param, conn);
    
    JasperViewer jv = new JasperViewer(relatorio+".jrprint",false);
    
    jv.setVisible(true);
    

onde conn é sua conexão com o banco de dados, CodCliente é a varável com o código de busca para o Jasper relatorio é o nome do seu arquivo.

PS.: certifique-se de importar as biblitecas necessárias para esses procedimentos

M

Olá andresim, desde já obrigado pela ajuda.
Fiz exatamento como você postou, e na hora de mostrar o relatório apareceu essa mensagem de erro:

error preparing statement for executing the report query:

SELECT ORDID, EQUIPAMENTO FROM ORD_INFORMATICA WHERE ORDID=?

O meu método pra chamar o relatório ficou assim:

private void chamarRelatorio(String diretorio){ JasperPrint rel = null; String arquivoJasper = diretorio; try { Map<String, String> parametros = new HashMap<String, String>(); parametros.put("COD", pegaIdCliente(ListaClientes.getSelectedItem().toString())); rel = JasperFillManager.fillReport(arquivoJasper, parametros, Conexao.getConexao() ); //tem q criar a classe conexao! JasperViewer jv = new JasperViewer(rel, false); jv.setExtendedState(jv.MAXIMIZED_BOTH); jv.setVisible(true); } catch (Exception e) { JOptionPane.showMessageDialog(null, e.getMessage()); } }

M

Opa, ja descobri porque dava esse erro, acontece que tem que por o “!” depois do $P, é assim que iReport reconhece aquilo como parametro.

D

Sinceramente, desconhecia isto.
Parâmetro no iReport sempre foi $P{param}

S

Sinceramente, desconhecia isto.
Parâmetro no iReport sempre foi $P{param}

Parâmetros simples, não precisam da “!”, agora se você quer mandar uma query inteira dinamicamente pro ireport, é necessário a “!”, por exemplo:

$P!{PARAM_SQL_QUERY}

jasper entende que deve executar o parâmetro como script, foi foda lembrar isso, não é bem documentado.

L

Primeiro crie o relatório jasper com a simples query select * from tabela...

Aplicação:
Esta seria a forma que eu estabeleceria a conexão com o SGBD.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class ConexaoBD implements IDatabase {

public static Connection con = null;


   public void carregarDriver(){
    try{

        Class.forName( DRIVER );

   }
        catch ( ClassNotFoundException cnfe ) {
		System.out.println( "Não tem drive JDBC para conexao : " +
							   cnfe.getMessage() );
	}

    }

   public Connection getConexao(){


	try{
	/* Instanciando a classe do driver através do seu nome */

            //if (con==null)
             con = DriverManager.getConnection(URL, USER, PASSWORD);
             return con;

	}
	  catch ( SQLException sqle ) {
		System.out.println( "Erro na conexão com BD : " +
							            sqle.getMessage() );
	}
	    return null;
	}

	public void fecharConexao(){

          try {
                    con.close();

	   }
	    catch ( SQLException sqle ) {
		System.out.println( "Erro na conexão com BD : " +
							            sqle.getMessage() );
	    }

	}
}

Esta classe irá alimentar o .jasper

import java.awt.Desktop;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JOptionPane;

import br.difere.ti.database.ConexaoBD;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;

public class GeradorRelatorio {
	private ConexaoBD database = null;
	private PreparedStatement ps;
	private Connection con;
	private ResultSet rs;
   
	public GeradorRelatorio() {
	}
   
	public void gerar( String jasperFile, String query, String exportPrint, String pdf ) throws JRException , SQLException, ClassNotFoundException {
		
	       database = new ConexaoBD();
               con = database.getConexao();
        
		Statement stm = con.createStatement();
			
		ResultSet rs = stm.executeQuery( query );

		//implementação da interface JRDataSource para DataSource ResultSet
		JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );
   
		//executa o relatório
		Map parametros = new HashMap();
		

		/* Preenche o relatório com os dados. Gera o arquivo .jrprint    */
		JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );
  
		/* Exporta para o formato PDF */	
		JasperExportManager.exportReportToPdfFile( exportPrint );
		
		abrirPdf(pdf);
	}
	
	 private static void abrirPdf(String caminho) {
	        File pdf = new File(caminho);
	        try {
	            Desktop.getDesktop().open(pdf);
	        } catch (Exception ex) {
	            ex.printStackTrace();
	            JOptionPane.showMessageDialog(null, "Erro ao abrir arquivo: " + ex);
	        }
	    }
   
	
}
GeradorRelatorio gerador = new GeradorRelatorio();
String consulta = "";
String jasperFile = "";
String exportaPrint = "";
String pdf = "";
...
consulta = "SELECT * FROM tabela WHERE id = "+id+"";
jasperFile = "path\\tabela.jasper";
exportaPrint = "path\\tabela.jrprint";
pdf = "path\\tabela.pdf";

 try {
    gerador.gerar(jasperFile, consulta, exportaPrint, pdf);

   } catch (JRException e1) {
	e1.printStackTrace();
   } catch (SQLException e1) {
       e1.printStackTrace();
   } catch (ClassNotFoundException e1) {
       e1.printStackTrace();
   }
...
Criado 28 de setembro de 2011
Ultima resposta 3 de out. de 2011
Respostas 9
Participantes 5