[AJUDA] - Não consigo conectar o Ireport ao NetBeans

25 respostas
M

Olá pessoal, meu problema é o seguinte:

possuo minha conexão com o banco de dados:

import java.sql.*;
import javax.swing.*;

public class conexao{
    
    final private String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    final private String url = "Jdbc:Odbc:Estoque";
    final private String usuario = "";
    final private String senha = "";
    private Connection conexao; 
    public Statement statement;
    public ResultSet resultset;
    
    public boolean conecta(){
        boolean result = true;
        try{
            Class.forName(driver);
            conexao = DriverManager.getConnection(url, usuario, senha);
            JOptionPane.showMessageDialog(null, "Conectado com o Banco de Dados!");
        }
        catch(ClassNotFoundException Driver){
            JOptionPane.showMessageDialog(null, "Driver não Localizado " + Driver);
            result = false;
        }
        catch(SQLException Fonte){
            JOptionPane.showMessageDialog(null, "Deu erro na conexão " + "com a fonte de dados " + Fonte);
            result = false;
        }
        return result;        
    }

public void executeSQL(String sql){
        try{
            statement = conexao.createStatement();
            statement = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultset = statement.executeQuery(sql);
        }
        catch(SQLException sqlex){
            JOptionPane.showMessageDialog(null, "Não foi possivel " +
                    "executar o comando sql, " + sqlex + ", o sql passado foi " + sql);
        }        
 }

já tenho meu Relatório criado no Ireport (estoque.jasper), porém estou tendo dificuldades
na hora de efetuar a conexão do mesmo com o Netbeans (chamar o relatório através de um jButton por exemplo)

tentei montar a “classe Relatorio” e é aqui que minha dificuldade entra, aqui está minha classe:

package utilitarios;

import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
import java.sql.*;
import java.util.*;
import utilitarios.conexao;


public class Relatorio {
    conexao con = new conexao();

    public void rel() {
        try {
            con.conecta();
            con.executeSQL("select * from estoque");
            
            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);  //nao sei se está certo
            
            /* dentro do fillReport vao 3 parâmetros: nao sei qual é o primeiro então a principio
             chamarei de reticências (...), o segundo imagino que seja new HashMap() pois nao vou adicionar 
             nada ao relatorio, e o terceiro deve ser o jrRS declarado acima */
            JasperPrint jasperPrint = JasperFillManager.fillReport(... , new HashMap(), jrRS); 
            
            //a partir daqui nao sei mais o que fazer            
                         
        } catch (Exception erro){
            JOptionPane.showMessageDialog(null, "Erro = " + erro);
        }
    }

    public static void main(String args[]) {
        new Relatorio().rel();
    } 
}

já olhei um monte de tutoriais + mesmo assim não consigo entender, se alguém puder me ajudar
ficarei grato. :smiley:

25 Respostas

W

Altere sua classe Relatorio de:

package utilitarios;   
  
import javax.swing.JOptionPane;   
import net.sf.jasperreports.engine.*;   
import net.sf.jasperreports.view.*;   
import java.sql.*;   
import java.util.*;   
import utilitarios.conexao;   
  
  
public class Relatorio {   
    conexao con = new conexao();   
  
    public void rel() {   
        try {   
            con.conecta();   
            con.executeSQL("select * from estoque");   
               
            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);  //nao sei se está certo   
               
            /* dentro do fillReport vao 3 parâmetros: nao sei qual é o primeiro então a principio  
             chamarei de reticências (...), o segundo imagino que seja new HashMap() pois nao vou adicionar  
             nada ao relatorio, e o terceiro deve ser o jrRS declarado acima */   
            JasperPrint jasperPrint = JasperFillManager.fillReport(... , new HashMap(), jrRS);   
               
            //a partir daqui nao sei mais o que fazer               
                           
        } catch (Exception erro){   
            JOptionPane.showMessageDialog(null, "Erro = " + erro);   
        }   
    }   
  
    public static void main(String args[]) {   
        new Relatorio().rel();   
    }   
}
Para:
package utilitarios;   
  
import javax.swing.JOptionPane;   
import net.sf.jasperreports.engine.*;   
import net.sf.jasperreports.view.*;   
import java.sql.*;   
import java.util.*;   
import utilitarios.conexao;   
  
  
public class Relatorio {   
    conexao con = new conexao();   
  
    public void rel() {   
        try {   
            con.conecta();   
            con.executeSQL("select * from estoque");   
               
             //Implementação da interface JRDataSource para DataSource ResultSet
             JRResultSetDataSource jrRS = new JRResultSetDataSource( con.resultset );
            
             //HashMap de parametros utilizados no relatório. Sempre instanciados mesmo sem parametros
             Map parameters = new HashMap();
             //parameters.put("COLUNA", valor);
            
              //Preenche o relatório com os dados. Gera o arquivo lancamentosjuridico.jrprint
             JasperFillManager.fillReportToFile( "caminnhoDoSeu.jasper", parameters, jrRS );
                                    
             //Exporta para o formato PDF 
             JasperExportManager.exportReportToPdfFile( "caminhoDoSeu.jrprint" );
            
             //Visualiza o relatório em formato PDF
             JasperViewer.viewReport( "caminhoDoSeu.jrprint" , false , false);
                           
        } catch (Exception erro){   
            JOptionPane.showMessageDialog(null, "Erro = " + erro);   
        }   
    }   
  
    public static void main(String args[]) {   
        new Relatorio().rel();   
    }   
}
Nesse exemplo não consegui visualizar em pdf, então visualizei com o viewer do Jasper mesmo. Acho que assim funciona. Tenta ai :D T+
M

opa… obrigado mesmo cara…
só que aqui ainda está dando erro.

aparece esse erro aqui:
digamos que meu .jasper está em D:/Nova Pasta/estoque.jasper

entao na linha onde eu teria que colocar o caminho ficaria:

JasperFillManager.fillReportToFile("D:/Nova Pasta/estoque.jasper", parameters, jrRS );

certo?

se for isto, aparece esse erro:

Erro = net.sf.jasperreports.engine.JRException: Class not found when loading object from file: D:\Nova Pasta\estoque.jasper

o que estou fazendo de errado? :?

W

merso:
opa… obrigado mesmo cara…
só que aqui ainda está dando erro.

aparece esse erro aqui:
digamos que meu .jasper está em D:/Nova Pasta/estoque.jasper

entao na linha onde eu teria que colocar o caminho ficaria:

JasperFillManager.fillReportToFile("D:/Nova Pasta/estoque.jasper", parameters, jrRS );

certo?

se for isto, aparece esse erro:

Erro = net.sf.jasperreports.engine.JRException: Class not found when loading object from file: D:\Nova Pasta\estoque.jasper

o que estou fazendo de errado? :?


Bom, uma opção seria:

JasperFillManager.fillReportToFile("D:\\Nova Pasta\\estoque.jasper", parameters, jrRS );

ou, coloque o relatorio.jasper e o relatorio.jrprint dentro da pasta do seu projeto.
Abraços

M

cara… fiz exatamente como vc falou:

primeiro troquei C:\Nova Pasta\estoque.jasper por C:\Nova Pasta\estoque.jasper

e nao deu certo.

Depois coloquei o arquivo (já estava também) na pasta do projeto, e também nao funcionou.

O que mais posso fazer?
:?

M

outra coisa, eu nao sei onde fica esse tal “estoque.jrprint”

W

Provavelmente está no diretório do iReport.

Do contrário mande o assistente de pesquisa do windows procurá-lo para vc e o coloque dentro da pasta raiz do projeto juntamente com o estoque.jasper.

M

ok.

Mas este .jrprint é para criar o pdf?

Se for isto, não estou querendo criar pdf, eu apenas fiz a classe
para mostrar o relatoro a tela. (só implementei um “main” ali para ver se funcionava minha classe).

Eu dei um “debug file” e o erro acontece quando chega na linha:

JasperFillManager.fillReportToFile("D:\\Hemerson\\JAVA\\Projetos\\Lactovel\\estoque1.jasper", parameters, jrRS );

quando vou passar dela já aparece o erro na tela.

M

e não tem nenhum. jrprint na pasta do ireport. :frowning:

W

pra gerar o arquivo .pdf,
teria que ser:

JasperExportManager.exportReportToPdfFile( "estoque1.jrprint" );

porém comigo eu não consegui visualizá-lo com .pdf somente com .jrprint.

Onde estão os arquivos gerado pelo jasper?

Obs.: configurou corretamente o CLASSPATH?

M

vamos lá:
no meu CLASSPATH eu tenho o seguinte:

Nome da variável: CLASSPATH
Valor da variável: C:\Arquivos de programas\Java\jdk1.5.0_06\lib\tools.jar;C:\Arquivos de programas\JasperSoft\iReport-1.2.7\lib;

falta alguma coisa?

M

até agora esse tópico tava dando problema,
agora voltou a funcionar?

:?

W

merso:
até agora esse tópico tava dando problema,
agora voltou a funcionar?

:?

É verdade, também não entendi :!: :?:

Tente o seguinte:

Vá até janela no netbeans depois arquivos, click com o botão direito do mouse em cima do seu projeto, vá até propriedades depois em bibliotecas clique em adicionar JAR localize a pasta lib do ireport e adicione todo conteúdo dela ao projeto.

Pode ser falta de alguma biblioteca.

Outra coisa, no ireport consegue visualizar o relatório?

M

Opa… 1 coisa boa e outra ruim.

Olha só o que aconteceu agora: ^^

  1. fiz aquele negócio de adicionar o conteúdo da pasta lib lá em Propriedades/Bibliotecas/adicionar…
  2. eu dei um “debug file”, dai quando chegou na linha que estava dando problema:
JasperFillManager.fillReportToFile("D:\\JAVA\\Projetos\\Lactovel\\estoque1.jasper", parameters, jrRS );

ele passou \o/\o/…

  1. quando foi para a próxima linha:
JasperExportManager.exportReportToPdfFile( "D:\\JAVA\\Projetos\\Lactovel\\estoque1.jrprint" );

deu o seguinte erro: Erro = net.sf.jasperreports.engine.JRException:java.io.FileNotFoundException: D:\JAVA\Projetos\Lactovel\estoque1.jrprint
deve ser porque ele nao achou o arquivo jrprint. Mas beleza, eu nem quero criar o pdf. (por enquanto)

  1. dai eu coloquei a linha acima em comentário e troquei a linha que vinha depois:
JasperViewer.viewReport( "D:\\JAVA\\Projetos\\Lactovel\\estoque1.jrprint" , false , false);

por

JasperViewer.viewReport( "D:\\JAVA\\Projetos\\Lactovel\\estoque1.jasper" , false , false);

para ver o que aconteceu… dai deu o seguinte erro:

Erro = java.lang.ClassCastException: net.sf.jasperreports.engine.JasperReport cannot be cast to net.sf.jasperreports.engine.JasperPrint

isso eu nao sei o que significa.

  1. Abri o Ireport e rodei meu relatório, e lá funcionou perfeitamente, inclusive a impressão.

O que eu faço agora??
Posso estar errado, mas acho que agora falta pouco.

Obrigado por enquanto e ainda conto com sua ajuda. :wink:

W

Por algum motivo ele não está gerando o .jrprint que é para visualizar com viewer do jasper e fazer a impressão.

Verifique se os parametros do resultSet são os mesmos esperados pelo relatório do jasper.
Teste o resultSet pra saber se está recebendo os dados da consulta.

Com relação a:

não iria funcionar mesmo, ele espera um arquivo .pdf, .jrprint, .html, .xml etc.

Tente agora colocar ao invéz do caminho o arquivo, ou seja:

JRResultSetDataSource jrRS = new JRResultSetDataSource( con.resultset ); Map parameters = new HashMap(); //parameters.put("COLUNA", valor); JasperFillManager.fillReportToFile( "estoque1.jasper", parameters, jrRS ); JasperExportManager.exportReportToPdfFile( "estoque1.jrprint" ); JasperViewer.viewReport( "estoque1.jrprint" , false , false);
Colocando o último arquivo compilado do jasper, o estoque1.jasper na pasta raiz do projeto.

M

fiz algumas mudanças na minha classe e consegui
fazer o que queria! \o

só que ainda tenho uma duvida:

Se eu não usar o tal .jrprint eu não vou conseguir imprimir?

do jeito que está o código, se eu usar a classe através de um jButton,
a aplicação exibe o relatório tudo certo. Dai se eu clicar no botãozinho da impressora,
aparece o seguinte erro: “Erro ao imprimir relatório. Verifique o donsole para detalhes.”

meu código está assim:

import javax.swing.JOptionPane;     
import net.sf.jasperreports.engine.*;     
import net.sf.jasperreports.view.*;     
import java.sql.*;     
import java.util.*;     
import utilitarios.conexao;     


public class Relatorio {     
    //conexão ao banco de dados
    conexao con = new conexao();     

    public void rel() {     
        try {     
            con.conecta();     
            con.executeSQL("select * from estoque");     

            //Implementação da interface JRDataSource para DataSource ResultSet  
            JRResultSetDataSource jrRS = new JRResultSetDataSource( con.resultset );  

            //HashMap de parametros utilizados no relatório.   
            Map parameters = new HashMap();  
            
            //JasperFillManager.fillReportToFile("D:\\JAVA\\Projetos\\Lactovel\\Relatorio\\Estoque.jasper", parameters, jrRS );  
            
            //Exporta para o formato PDF   
            //JasperExportManager.exportReportToPdfFile( "D:\\JAVA\\Projetos\\Lactovel\\Relatorio\\Estoque.jrprint" );  

            //Visualiza o relatório em formato PDF
            //JasperViewer.viewReport( "D:\\JAVA\\Projetos\\Lactovel\\Relatorio\\Estoque.jasper" , false , false);  
            
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    "D:\\JAVA\\Projetos\\Lactovel\\Relatorio\\Estoque.jasper", parameters, jrRS);
            
            JasperViewer.viewReport(jasperPrint, false);
        } catch (Exception erro){     
            JOptionPane.showMessageDialog(null, "Erro = " + erro);     
        }     
    }     

    public static void main(String args[]) {     
        new Relatorio().rel();     
    }     
}

se eu conseguir criar o tal do .jrprint e mostrar o arquivo .pdf, eu consigo fazer a impressão?

M

estou com dificuldades com esse .jrprint.

Gostaria da sua ajuda. :smiley:

M

ATUALIZANDO:

depois das alterações que vc falou anteriormente, meu código está assim:

import javax.swing.JOptionPane;     
import net.sf.jasperreports.engine.*;     
import net.sf.jasperreports.view.*;     
import java.sql.*;     
import java.util.*;     
import utilitarios.conexao;     


public class Relatorio {     
    //conexão ao banco de dados
    conexao con = new conexao();     

    public void rel() {     
        try {     
            con.conecta();     
            con.executeSQL("select * from estoque");     

            //Implementação da interface JRDataSource para DataSource ResultSet  
            JRResultSetDataSource jrRS = new JRResultSetDataSource( con.resultset );  

            //HashMap de parametros utilizados no relatório.   
            Map parameters = new HashMap();  
            
            JasperFillManager.fillReportToFile( "Estoque.jasper", parameters, jrRS );     
            JasperExportManager.exportReportToPdfFile( "Estoque.jrprint" );  //Exporta para o formato PDF    
            JasperViewer.viewReport( "Estoque.jrprint" , false , false);     //Visualiza o relatório em formato PDF
            
            /*JasperPrint jasperPrint = JasperFillManager.fillReport(
                    "Estoque.jasper", parameters, jrRS);
            
            JasperViewer.viewReport(jasperPrint, false);*/
        } catch (Exception erro){     
            JOptionPane.showMessageDialog(null, "Erro = " + erro);     
        }     
    }     

    public static void main(String args[]) {     
        new Relatorio().rel();     
    }   
}

Está tudo funcionando!
Agora eu queria saber como eu faço para conseguir imprimir. Continua dando o mesmo erro quando eu clico na impressora.

W

fiz alguns testes aqui e sem o .jrprint ele não imprime, mas vc disse que esle está funcionando corretamene.

O que seria esse corretamente, ele gerou o .jrprint?
Está visualizando o relatório atravéz da aplicação ou pelo ireport?

M

O que seria esse corretamente, ele gerou o .jrprint?
Está visualizando o relatório atravéz da aplicação ou pelo ireport?

Nas linhas onde tem que colocar o diretório, eu só coloquei “Estoque.jasper” (troquei o nome de estoque1 para Estoque)
e só tinha esse arquivo .jasper na pasta do meu projeto.

Quando eu executo toda a aplicação, logo que eu clico no botão que chama a classe Relatório,
ele mostra o relatório perfeitamente, mas mostra pelo JasperViewer.

até ai tudo ok.

Dai eu fecho a aplicação, e vou na pasta do projeto.
Lá tem o arquivo .jasper, o .jrprint e o .pdf também.

Mas ainda dá erro quando eu clico para imprimir.

O que eu faço?

M

e para mudar o nome do .jasper, eu abri o ireport, fiz as mudanças que eu queria e salvei
com outro nome. Dai eu colei esse arquivo .jasper na pasta do projeto. E SÓ com esse arquivo
que ele está gerando o .jrprint e o .pdf

W

Já verificou as configurações da sua impressora, pois com o relatório realmente agora está perfeito.

Acho que o problema agora é com sua impressora.

M

OK!
agora funcionou tudo mesmo.

Só mais duas perguntas:

  1. Ele sempre vai abrir pelo JasperViewer?

  2. Se eu executar minha aplicação em outra máquina, o Ireport vai ter que estar instalado também?

W

merso:
OK!
agora funcionou tudo mesmo.

Só mais duas perguntas:

  1. Ele sempre vai abrir pelo JasperViewer?

  2. Se eu executar minha aplicação em outra máquina, o Ireport vai ter que estar instalado também?

Cara, acho que isso ai teremos que descobrir juntos que eu tambem não sei, uma vez que tentei de tudo visualizar em pdf mas, não consegui. Busquei alguns tutoriais à repeito mas mesmo assim também não consegui.
Mas quando descobri eu post novamente, vlw?!. :smiley:
Boa sorte em sua aplicação
abraços

M

OK!

Vou fazer assim, estou saindo agora e vou a um lugar onde há outro computador.
Vou levar minha aplicação e testar lá.

De todo caso eu posto aqui também para avisar se consegui ou não.

De qualquer forma, MUITO OBRIGADO mesmo cara, vc me ajudou pra caramba!

Assim que conseguir resultado eu volto a te avisar.

Abraço. o/

M

Olha eu denovo hehehe

bom… testei o arquivo varias vezes aqui na minha máquina e tudo funciona perfeitamente.
Dai quando fui testar minha aplicação em outra máquina, eu colei a pasta inteira do projeto (é claro)

e quando fui executar pela extensão .jar, para minha surpresa funcionou,
mas foram as partes que nao envolvem o relatório, pq quando eu clico no botaozinho “Relatório”,
logo de cara já aparece o erro de que não existe o arquivo “Estoque.jasper” :shock: :x

E agora? ^^

Criado 10 de dezembro de 2007
Ultima resposta 11 de dez. de 2007
Respostas 25
Participantes 2