Duvida com a classe!

5 respostas
The_Rogue

Gente estou com uma grande dificuldade eu consegui unir o relatorio feito no ireport com a minha aplicação. Procurei em varios exemplos e tentei utiliza-los porém nao obtive sucesso. Por ultimo encontrei um exemplo so que como meu nivel java é muito iniciante não consegui adptar para meu caso pois não soube como realizar as configurações necessarias.

A Classe de exemplo foi essa: encontrada nesse tópico: http://www.guj.com.br/java/35242-ireport---chamar-relatorio-da-aplicacao

/*
 * @(#)Relatorio.java   1.0 28/04/2006
 *
 * Copyright 2006 Marcos Vinícius Soares. Todos os direitos reservados. 
 * [email removido]
 *
 */

import java.sql.*;
import java.net.URL;
import java.util.HashMap;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import net.sf.jasperreports.engine.*;
import conexao.Conexao;

/**
 * Relatorio.java<br>
 *
 * <p>A classe Relatorio deve ser utilizada para emissão de relatórios. Após a 
 * criação de algum relatório é possível exibí-lo na tela, exportá-lo para um 
 * arquivo pdf/html ou enviá-lo direto para impressão.</p>
 *
 * <p>A classe manipula relatórios desenvolvidos utilizando-se a ferramenta
 * iReport e utiliza a ferramenta JasperReports para emissão dos relatórios</p> 
 *
 * @author  Marcos Vinícius Soares
 */
public class Relatorio {
        
    /** Representa o relatório gerado. */
    private JasperPrint jasperPrint_;
    
    /**
     * Cria um novo Relatorio.
     *
     * @param  conn  Conexão com o banco de dados.
     * @param  parameters  Parâmetros a serem exibidos no relatório.
     * @param  localRelatorio  Localização do relatório.
     * @throws  JRException  Caso o relatório não seja encontrado ou haja
     * algum problema com ele, uma exceção é gerada.
     */
    public Relatorio(Conexao conn, HashMap parameters, URL localRelatorio) throws JRException{
        
        try {
            
            // O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
            // Ou seja, o arquivo .jasper
            JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
            
            // JasperPrint representa o relatório gerado.
            // É criado um JasperPrint a partir de um JasperReport, contendo o relatório preenchido.
            this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, conn.getConnection());

	} catch (JRException e) { throw e; }
    }
    
    
    
    /**
     * Cria um novo Relatorio.
     *
     * @param  conn  Conexão com o banco de dados.
     * @param  parameters  Parâmetros a serem exibidos no relatório.
     * @param  localRelatorio  Localização do relatório.
     * @throws  JRException  Caso o relatório não seja encontrado ou haja
     * algum problema com ele, uma exceção é gerada.
     */
    public Relatorio(Conexao conn, HashMap parameters, String localRelatorio) throws JRException{
        
        try {

            // O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
            // Ou seja, o arquivo .jasper
            JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
            
            // JasperPrint representa o relatório gerado.
            // É criado um JasperPrint a partir de um JasperReport, contendo o relatório preenchido.
            this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, conn.getConnection());

	} catch (JRException e) { throw e; }
    }
    
    
    
    /**
     * Cria um novo Relatorio.
     *
     * @param  conn  Conexão com o banco de dados.
     * @param  sql  Expressão SQL (SELECT...) a ser utilizada para preenchimento do relatório
     * @param  parameters  Parâmetros a serem exibidos no relatório.
     * @param  localRelatorio  Localização do relatório.
     * @throws  JRException  Caso o relatório não seja encontrado ou haja
     * algum problema com ele, uma exceção é gerada.
     * @throws  SQLException  Caso exista alguma divergência ou problema com 
     * a Expressão SQL passada como parâmetro, uma exceção é gerada.
     */
    public Relatorio(Conexao conn, String sql,
            HashMap parameters, URL localRelatorio) throws SQLException, JRException {
        
        try {
            
            // O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
            // Ou seja, o arquivo .jasper
            JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
            
            // Resultado da consulta
            ResultSet rs = conn.executeQuery(sql);
            
            // JRResultSetDataSource é uma implementaçao de JRDataSource, o qual é requerido
            // como parametro para preencher o relatório criado.
            // Ele armazena o dados do ResultSet
            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
            
            // JasperPrint representa o relatório gerado.
            // É criado um JasperPrint a partir de um JasperReport, contendo o
            // relatório preenchido.
            this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrRS);
            
            rs.close();
            
        } 
        catch (SQLException e) { throw e; } 
        catch (JRException e) { throw e; }        
    }
    
    
    
    /**
     * Cria um novo Relatorio.
     *
     * @param  conn  Conexão com o banco de dados.
     * @param  sql  Expressão SQL (SELECT...) a ser utilizada para preenchimento do relatório
     * @param  parameters  Parâmetros a serem exibidos no relatório.
     * @param  localRelatorio  Localização do relatório.
     * @throws  JRException  Caso o relatório não seja encontrado ou haja
     * algum problema com ele, uma exceção é gerada.
     * @throws  SQLException  Caso exista alguma divergência ou problema com 
     * a Expressão SQL passada como parâmetro, uma exceção é gerada.
     */
    public Relatorio(Conexao conn, String sql,
            HashMap parameters, String localRelatorio) throws SQLException, JRException {
        
        try {
            
            // O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
            // Ou seja, o arquivo .jasper
            JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
            
            // Resultado da consulta
            ResultSet rs = conn.executeQuery(sql);
            
            // JRResultSetDataSource é uma implementaçao de JRDataSource, o qual é requerido
            // como parametro para preencher o relatório criado.
            // Ele armazena o dados do ResultSet
            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
            
            // JasperPrint representa o relatório gerado.
            // É criado um JasperPrint a partir de um JasperReport, contendo o
            // relatório preenchido.
            this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrRS);
            
            rs.close();
            
        } 
        catch (SQLException e) { throw e; } 
        catch (JRException e) { throw e; }        
    }
    
    
    
    /**
     * Cria um novo Relatorio.
     *
     * @param  parameters  Parâmetros a serem exibidos no relatório.
     * @param  localRelatorio  Localização do relatório.
     * @throws  JRException  Caso o relatório não seja encontrado ou haja
     * algum problema com ele, uma exceção é gerada.
     */
    public Relatorio(HashMap parameters, URL localRelatorio) throws JRException {
        
        try {
            
            // O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
            // Ou seja, o arquivo .jasper
            JasperReport jr = (JasperReport) JRLoader.loadObject(localRelatorio);
            
            // JREmptyDataSource é uma implementaçao de JRDataSource, o qual é requerido
            // como parametro para preencher o relatório criado.
            // Ele armazena o dados do ResultSet, que, neste caso, é vazio
            JREmptyDataSource jrEDS = new JREmptyDataSource();
            
            // Jasper Print representa o relatório gerado.
            // É criado um JasperPrint a partir de um JasperReport, contendo o
            // relatório preenchido.
            this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrEDS);
            
        } catch (JRException e) { throw e; }        
    }
    
    
    
    /**
     * Cria um novo Relatorio
     *
     * @param  parameters  Parâmetros a serem exibidos no relatório.
     * @param  localRelatorio  Localização do relatório.
     * @throws  JRException  Caso o relatório não seja encontrado ou haja
     * algum problema com ele, uma exceção é gerada.
     */
    public Relatorio(HashMap parameters, String localRelatorio) throws JRException {
        
        try {
            
            // O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
            // Ou seja, o arquivo .jasper
            JasperReport jr = (JasperReport) JRLoader.loadObject(localRelatorio);
            
            // JREmptyDataSource é uma implementaçao de JRDataSource, o qual é requerido
            // como parametro para preencher o relatório criado.
            // Ele armazena o dados do ResultSet, que, neste caso, é vazio
            JREmptyDataSource jrEDS = new JREmptyDataSource();
            
            // Jasper Print representa o relatório gerado.
            // É criado um JasperPrint a partir de um JasperReport, contendo o
            // relatório preenchido.
            this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrEDS);
            
        } catch (JRException e) { throw e; }        
    }
    
    
    
    /**
     * Exibe o relatório na tela.
     */
    public void exibirRelatorio() {
        // emite o relatório na tela
        // false indica que a aplicação não será finalizada caso o relatório seja fechado
        JasperViewer.viewReport(this.jasperPrint_, false);
    }
    
    
    
    /**
     * Grava o relatório em um arquivo de formato pdf.
     *
     * @param  caminhoDestino  Caminho onde o arquivo será gravado.
     */
    public void exportaParaPdf(String caminhoDestino) throws JRException {
        
        try {
            // Gera o arquivo PDF
            JasperExportManager.exportReportToPdfFile(this.jasperPrint_, caminhoDestino);
        } catch (JRException e) { throw e; }
        
    }
    
    
    
    /**
     * Grava o relatório em um arquivo de formato html.
     *
     * @param  caminhoDestino  Caminho onde o arquivo será gravado.
     */
    public void exportaParaHtml(String caminhoDestino) throws JRException {
        
        try {
            // Gera o arquivo PDF
            JasperExportManager.exportReportToHtmlFile(this.jasperPrint_, caminhoDestino);
        } catch (JRException e) { throw e; }
        
    }
    
    
    
    /**
     * Envia o relatório para impressão, exibindo uma caixa de dialogo de impressão ou não.
     * 
     * @param  exibeCaixaDialogo  Boolean indicando se será exibida uma caixa de diálogo ou não.
     */
    public void imprimir(boolean exibeCaixaDialogo) throws JRException {
        
        try {
            // Imprime o relatório
            // o segundo parâmetro indica se existirá uma caixa de dialogo antes ou nao
            JasperPrintManager.printReport(this.jasperPrint_, exibeCaixaDialogo);
        } catch (JRException e) { throw e; }
        
    }
    
    
    
}
A questão é que quando eu chamo essa classe ele solicita informações:
Conexao conn = new Conexao();
			 	HashMap parameters = new HashMap();
				parameters.put("PARAM1", null);
				 
				String sql = "SELECT lote.`n_lote` AS lote_n_lote,lote.`dt_validade` AS lote_dt_validade,medicamento.`nome_produto` AS medicamento_nome_produto,lote.`qtd_lote` AS lote_qtd_lote,lote.`medicamento_idproduto` AS lote_medicamento_idproduto FROM `medicamento` medicamento INNER JOIN `lote` lote ON medicamento.`idproduto` = lote.`medicamento_idproduto`";
				String localRelatorio = "relatorios\\lote.jasper";
				
				try {
					Relatorio rl = new Relatorio(conn, sql, parameters, localRelatorio);
					rl.exibirRelatorio();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (JRException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

Eu não entendo o que passar nesse parameters, pois minha consulta não tem nenhum parâmetro assim eu acho. Será que alguém pode me ajudar?

5 Respostas

Fexx

Veja isso, acho que vai lhe ajudar:

http://www.k19.com.br/artigos/relatorios-em-java-jasperreports-e-irepor/

Boa sorte.

The_Rogue

@Fexx

Fui no link li e fiz o passo a passo que o mesmo ensina. Executou normal gerando o pdf. Porém no meu caso a lista de dado vendo do banco então ao inves de uma lista eu uso uma string sql. Tentei adaptar para a minha situação, porem quando executa exibe-se duas mensagens:

"Não foi possível recuperar os dados."

Clico no ok que aparece, ele processa um pouco e exibe a segunda mensagem:

"O documento não contem paginas"

E exibe a janela do jasperView vazia!!

Será que poderia dar uma olhada?

Segue o código de exemplo
package visao;

import java.util.*;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

import persistencia.Conexao;

public class relatCidade {

	Conexao con = new Conexao();

	public relatCidade() {
		try {
			con.Conectar();
			String sql = "SELECT lote.`n_lote` AS lote_n_lote,lote.`dt_validade` AS lote_dt_validade,medicamento.`nome_produto` AS medicamento_nome_produto,lote.`qtd_lote` AS lote_qtd_lote,lote.`medicamento_idproduto` AS lote_medicamento_idproduto FROM `medicamento` medicamento INNER JOIN `lote` lote ON medicamento.`idproduto` = lote.`medicamento_idproduto`";

			JRResultSetDataSource jrRS = new JRResultSetDataSource(con
					.executarSQL(sql));

			JasperReport report = JasperCompileManager
					.compileReport("relatorios/lote.jrxml");

			JasperPrint jasperPrint = JasperFillManager.fillReport(report,
					null, jrRS);

			// JasperPrint jasperPrint =
			// JasperFillManager.fillReport("relatorios/lote.jasper", new
			// HashMap<String, Object>(), jrRS);
			JasperViewer.viewReport(jasperPrint);

		} catch (Exception erro) {
			erro.printStackTrace();
			JOptionPane.showMessageDialog(null, "Deu erro = " + erro);
		}
	}

	public static void main(String args[]) {

		new relatCidade();
	}

}
O metodo executarSQL é essa: Tenho quase certeza que o problema é nesse)
public ResultSet executarSQL(String sql) {
		try {
			Statement st = con.createStatement();
			ResultSet rs = st.executeQuery(sql);
			return rs;
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null,
					"Não foi possivel recuperar dados.");
			return null;
		}
	}
luxu

kra monta a seu relatório só com uma consulta simples e vai mudando, tipow “selet * from produto” e v se dá resultado, se der vai mudando saka? pq tenho hibernate e nele a consulta facilita e muito, mas no seu caso fosse eu faria assim…dica!

The_Rogue

Bom galera consegui fazer dar certo, vlws a todos. Deixo aqui como eu fiz para caso alguem necessite não fique se batendo para fazer.

Obs: Não tava dando certo pq o resultset não ta retornando valores. Uso um classe de conecção diferente que aprendi a fazer, como não tava conseguindo fazer o resultset, peguei outra classe so que ela tava com problemas. Ai parei e fui fazer na minha a função para o rs retornar valores.

Classe DAO que uso:
package persistencia;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class DAO {
	Connection con;
	
	PreparedStatement pstmt;
	
	ResultSet rs;
	
	public void getConexao()throws Exception{
        String url = "jdbc:mysql://localhost:3306/siscef_db";
        String user = "root";
        String password = "";
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(url, user, password);
	}
	
}
Classe que chamo de EstoqueDAO nela contem todas as funções sql
package persistencia;

import java.sql.ResultSet;


public class EstoqueDAO extends DAO {

	public void cadmedicamento(String nome_produto, int qtd_minima)
			throws Exception {
		getConexao();
		String query = "INSERT INTO medicamento(nome_produto,qtd_minima)VALUES(?,?)";
		pstmt = con.prepareStatement(query);
		pstmt.setString(1, nome_produto);
		pstmt.setInt(2, qtd_minima);
		pstmt.execute();
	}

	public void cadfabricante(String nome_fabricante, String endereco,
			String tele_contato, String email, String marca) throws Exception {
		getConexao();
		String query = "INSERT INTO fabricante (nome_fabri,end_fabri,telcontato_fabri,email_fabri,marca_fabri) VALUES (?,?,?,?,?)";
		pstmt = con.prepareStatement(query);
		pstmt.setString(1, nome_fabricante);
		pstmt.setString(2, endereco);
		pstmt.setString(3, tele_contato);
		pstmt.setString(4, email);
		pstmt.setString(5, marca);
		pstmt.execute();
	}

	public void cadlote(int medicamento, String nlote, int fabri,
			String qtdlote, String valilote) throws Exception {
		getConexao();
		String query = "INSERT INTO lote (n_lote,dt_validade,qtd_lote,fabricante_idfabricante,medicamento_idproduto) VALUES (?,?,?,?,?)";
		pstmt = con.prepareStatement(query);
		pstmt.setString(1, nlote);
		pstmt.setString(2, valilote);
		pstmt.setString(3, qtdlote);
		pstmt.setInt(4, fabri);
		pstmt.setInt(5, medicamento);
		pstmt.execute();
	}

	public boolean constlote(int id, String lote) throws Exception {
		boolean retorno = false;
		
		getConexao();
		String query = "Select * from lote where medicamento_idproduto='"+id+"'"+"and n_lote='"+lote+"'";
		pstmt = con.prepareStatement(query);
		rs = pstmt.executeQuery();
		
		while(rs.next()){
			if(rs.getRow()>=1){
				retorno = true;
			}
		}
		return retorno;
	}
	
	public int quantidadeLote (int id, String lote) throws Exception{
		int qtd = 0;
		
		getConexao();
		String query = "Select qtd_lote from lote where medicamento_idproduto='"+id+"'"+"and n_lote='"+lote+"'";
		pstmt = con.prepareStatement(query);
		rs = pstmt.executeQuery();
		
		while(rs.next()){
			qtd = rs.getInt("qtd_lote");
		}
		return qtd;
	}
	
	public void alteraProduto(int qtd, String lote) throws Exception{
		getConexao();
		String query = "UPDATE lote SET qtd_lote='"+qtd+"'"+" WHERE n_lote='"+lote+"'";
		pstmt = con.prepareStatement(query);
		pstmt.execute();
	}
	
	public ResultSet executarSQL(String sql) throws Exception {
		getConexao();
		
		pstmt = con.prepareStatement(sql);
		rs = pstmt.executeQuery();
		
		return rs;
	}

}
Modelo de exemplo para teste do relatorio
package visao;

import java.util.*;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

import persistencia.EstoqueDAO;

public class relatCidade {


	public relatCidade() {
		try {
			EstoqueDAO pd = new EstoqueDAO();
			String sql = "SELECT lote.`n_lote` AS lote_n_lote,lote.`dt_validade` AS lote_dt_validade,medicamento.`nome_produto` AS medicamento_nome_produto,lote.`qtd_lote` AS lote_qtd_lote,lote.`medicamento_idproduto` AS lote_medicamento_idproduto FROM `medicamento` medicamento INNER JOIN `lote` lote ON medicamento.`idproduto` = lote.`medicamento_idproduto`";

			JRResultSetDataSource jrRS = new JRResultSetDataSource(pd.executarSQL(sql));

			JasperReport report = JasperCompileManager
					.compileReport("relatorios/lote.jrxml");

			JasperPrint jasperPrint = JasperFillManager.fillReport(report,
					null, jrRS);

			// JasperPrint jasperPrint =
			// JasperFillManager.fillReport("relatorios/lote.jasper", new
			// HashMap<String, Object>(), jrRS);
			JasperViewer.viewReport(jasperPrint);

		} catch (Exception erro) {
			erro.printStackTrace();
			JOptionPane.showMessageDialog(null, "Deu erro = " + erro);
		}
	}

	public static void main(String args[]) {

		new relatCidade();
	}

}

Muito obrigado a todos, lembrando que segui o modelo do artigo postado por Jexx, organizando da mesma forma as libs e o arquivo de relatório.

Fexx

havia mexido, no seu código, mas já que conseguiu solucionar o problema, parabéns. :smiley:

Aqui o que mexi, mas com algumas coisas do meu banco.

public void relatCidade() {

		try {
			String sql = "select * from carro where descricao = 'aaaaaaa'";

			JRResultSetDataSource jrRS = new JRResultSetDataSource(
					executarSQL(sql));

			JasperReport report = JasperCompileManager
					.compileReport("relatorios/TodosOsCarros.jrxml");

			JasperPrint jasperPrint = JasperFillManager.fillReport(report,
					null, jrRS);

			JasperViewer.viewReport(jasperPrint);

		} catch (Exception erro) {
			erro.printStackTrace();
			System.out.println("Erro");
		}

	}

	public ResultSet executarSQL(String sql) {
		Connection con = Conexao.abrirConexao();

		try {
			PreparedStatement st = con.prepareStatement(sql);
			ResultSet rs = st.executeQuery();
			return rs;
		} catch (Exception e) {
			System.out.println("Não foi possivel recuperar dados.");
			return null;
		}
	}

	public static void main(String[] args) {
		Connection conn = Conexao.abrirConexao();
		CarroDAO dao = new CarroDAO(conn);
		dao.relatCidade();
	}
}
Criado 14 de fevereiro de 2012
Ultima resposta 14 de fev. de 2012
Respostas 5
Participantes 3