Chamar relatório com Ireport [Resolvido]

30 respostas
Panuci

Olá pessoal estou com um erro ao tentar chamar relatório com Ireport

já procurei em outros tópicos e não me ajudou, continua dando o mesmo erro

segue: Classe que chama o relatório

public class rel_clientes{
    CriaConexao con = new CriaConexao(); //está é a minha conexão com o banco de dados MySQL



    protected String getReportFullPath() {
    return "relatorio/rel_clientes.jasper";

}

    public rel_clientes() throws JRException{
        try
        {
            HashMap parametros = new HashMap();// crio os parametros

            CriaConexao.getConexao();
            con.executeSQL("SELECT * from cliente;");

            InputStream in = ClassLoader.getSystemClassLoader().getClass().getResourceAsStream(getReportFullPath());
            JasperViewer jrv = new JasperViewer(in,false);// Crio o JasperViewer  que recebe como parametro o JasperPrint
            jrv.setVisible(true);// Mando exibir o relatório

        }catch(SQLException erro){
            JOptionPane.showMessageDialog(null, "Erro!" +erro);
            erro.printStackTrace(System.err);
        }
    }

}

Classe que conecta com o banco de dados

public class CriaConexao {
    private static Connection conexao;
     public static Statement statement = null;
     public static ResultSet resultset = null;


     public static Connection getConexao() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conectando ao Banco!");
            return DriverManager.getConnection("jdbc:mysql://localhost/salao", "root", "admin");
        } catch (ClassNotFoundException e) {
            throw new SQLException(e.getMessage());
        }
    }

    public void executeSQL(String sql) {
    try {
        if (conexao == null) {
            this.getConexao();
        }
            java.sql.PreparedStatement ps =  conexao.prepareStatement(sql);
            resultset = ps.executeQuery();
        } catch(SQLException sqlex) {
            JOptionPane.showMessageDialog(null,"Não foi possível executar o comando sql, " + sqlex + ", o sql passado foi " + sql);
        }
        }

}

O erro que da é este

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at salao.bancodados.CriaConexao.executeSQL(CriaConexao.java:41)
        at salao.relatorio.rel_clientes.<init>(rel_clientes.java:28)
        at salao.forms.JFTelaPrincipal.jMRelatorioClientesActionPerformed(JFTelaPrincipal.java:189)
        at salao.forms.JFTelaPrincipal.access$600(JFTelaPrincipal.java:23)
        at salao.forms.JFTelaPrincipal$7.actionPerformed(JFTelaPrincipal.java:143)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)

Agradeço antecipadamente aos que puderem dar uma força

Que sejam iluminados pela Luz que veio ao mundo para nos salvar, Jesus

30 Respostas

GusMcCart

Bom… pelo que vi a maneira que você implementou, você não tem um “Connection Factory”, e sim uma classe que se auto-conecta e executa um SQL… o problema é esse método / você está retornando a conexão pra quem???

public static Connection getConexao() throws SQLException {  
        try {  
            Class.forName("com.mysql.jdbc.Driver");  
            System.out.println("Conectando ao Banco!");  
            return DriverManager.getConnection("jdbc:mysql://localhost/salao", "root", "admin");  
        } catch (ClassNotFoundException e) {  
            throw new SQLException(e.getMessage());  
        }
}

Tenta assim:

public static void getConexao() throws SQLException {  
        try {  
            Class.forName("com.mysql.jdbc.Driver");  
            System.out.println("Conectando ao Banco!");  
            this.conexao = DriverManager.getConnection("jdbc:mysql://localhost/salao", "root", "admin");  
        } catch (ClassNotFoundException e) {  
            throw new SQLException(e.getMessage());  
        }  
}

Não sei em que tipo de projeto você está utilizando isso, mas sugiro seriamente caso vá usar muito o banco de dados mudar essa implementação…

Panuci

Desculpe-me, mas não entendi o porquê de sua colocação

tentei fazer como vc falou mas não adiantou

obrigado

GusMcCart

Bom… tentei montar mais ou menos o código com a mudança… mas tem bastante coisa a mudar.

Basicamente é o seguinte, você tem uma classe com métodos estáticos realizando a conexão e executando a Query, porém em nenhum momento por exemplo o atributo “conexao” tem seu conteúdo alterado (você não estava retornando nada pra ele). O ResultSet da query não está sendo passado para o relatório (public void executeSQL).

Uma dica: a implementação da classe “CriaConexao” deveria apenas retornar uma conexão (ou abrir uma nova), e não executar querys…

C

Tenta assim

public static Connection conectar()
      {
          try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost/salao", "root", "admin");
                return con;
            }
          catch(ClassNotFoundException c)
            {
                JOptionPane.showMessageDialog(null, "Classe "+servidor+" não encontrada \n"
                        + "Erro :"+c.getMessage());                
            }
          catch(SQLException sqlE){JOptionPane.showMessageDialog(null, "Erro SQL "+ sqlE.getMessage());
          }
          return null;
      }

No seu relatorio

public class rel_clientes{  
    CriaConexao con = new CriaConexao(); //está é a minha conexão com o banco de dados MySQL  
  
  
  
    protected String getReportFullPath() {  
    return "relatorio/rel_clientes.jasper";  
  
}  
  
    public rel_clientes() throws JRException{  
        try  
        {  
            HashMap parametros = new HashMap();// crio os parametros  
  
            java.sql.Connection con = Conexao.conectar();

            con.executeSQL("SELECT * from cliente;");  
  
            InputStream in = ClassLoader.getSystemClassLoader().getClass().getResourceAsStream(getReportFullPath());  
            JasperViewer jrv = new JasperViewer(in,false);// Crio o JasperViewer  que recebe como parametro o JasperPrint  
            jrv.setVisible(true);// Mando exibir o relatório  
  
        }catch(SQLException erro){  
            JOptionPane.showMessageDialog(null, "Erro!" +erro);  
            erro.printStackTrace(System.err);  
        }  
    }  
  
}

Você fez seu relatorio com iReport né? eu custumo chamar assim …

public void geraRelatorio(){
java.sql.Connection con = Conexao.conectar();
HashMap p = new HashMap();
p.put("param1", param1);

File arquivo = new File("caminho/relatorio.jasper");

JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, con);
JasperExportManager.exportReportToPdfFile(jp,"relatorio.pdf");
}

Tudo isso em try{}catch(){} … Espero ter ajudado

Panuci

sr cembjr,

Fiz como vc falou, realmente não da mais erro algum, mas o relatório não aparece

apenas executa

saberia me dizer se o local do arquivo .jasper tem de ser especifico??

e no código

JasperExportManager.exportReportToPdfFile(jp, "relatorio.pdf");

o arquivo .pdf é no caso o nome do arquivo do relatório, que no meu seria rel_clientes???

obrigado

Panuci

GusMcCart:
Bom… tentei montar mais ou menos o código com a mudança… mas tem bastante coisa a mudar.

Basicamente é o seguinte, você tem uma classe com métodos estáticos realizando a conexão e executando a Query, porém em nenhum momento por exemplo o atributo “conexao” tem seu conteúdo alterado (você não estava retornando nada pra ele). O ResultSet da query não está sendo passado para o relatório (public void executeSQL).

Uma dica: a implementação da classe “CriaConexao” deveria apenas retornar uma conexão (ou abrir uma nova), e não executar querys…

Obrigado pela dica, estou verificando isso

C

Essa parte

JasperExportManager.exportReportToPdfFile(jp, "relatorio.pdf");

Vai mandar o seu relatorio exportado como pdf na pasta raiz do seu projeto …
o nome “relatorio.pdf” seria o nome que ele seria exportado, creio eu que no seu caso seja “Relatorios de Clientes.pdf”

Ele está salvo corretamente na sua pasta raiz ou está em branco?

Panuci

cembjr:
Essa parte

JasperExportManager.exportReportToPdfFile(jp, "relatorio.pdf");

Vai mandar o seu relatorio exportado como pdf na pasta raiz do seu projeto …
o nome “relatorio.pdf” seria o nome que ele seria exportado, creio eu que no seu caso seja “Relatorios de Clientes.pdf”

Ele está salvo corretamente na sua pasta raiz ou está em branco?

Na verdade ele não foi exportado, eu acho!

C
faz isso
try{
   java.sql.Connection con = Conexao.conectar();   
   HashMap p = new HashMap();  
   p.put("param1", param1);  
  
   File arquivo = new File("caminho/relatorio.jasper");  
   
   if(arquivo.exists())
   {
      JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, con);  
     JasperExportManager.exportReportToPdfFile(jp, "relatorio.pdf");  
     JOptionPane.showMessageDialog(null, "Exportado");
   } else JOptionPane.showMessageDialog(null, "Arquivo Inexistente");
} 
catch(Exception e){ JOptionPane.showMessageDialog(null, "Erro .: "+ex.getMessage());}

Verifique se os parametros estão corretos ... e com esse código ai mostra o erro!

Panuci
cembjr:
faz isso
try{
   java.sql.Connection con = Conexao.conectar();   
   HashMap p = new HashMap();  
   p.put("param1", param1);  
  
   File arquivo = new File("caminho/relatorio.jasper");  
   
   if(arquivo.exists())
   {
      JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, con);  
     JasperExportManager.exportReportToPdfFile(jp, "relatorio.pdf");  
     JOptionPane.showMessageDialog(null, "Exportado");
   } else JOptionPane.showMessageDialog(null, "Arquivo Inexistente");
} 
catch(Exception e){ JOptionPane.showMessageDialog(null, "Erro .: "+ex.getMessage());}

Verifique se os parametros estão corretos ... e com esse código ai mostra o erro!

Está dando erro:
Null
C

Você fez a query no seu relatorio?
Se fez, colocou parametros?

Panuci

cembjr:
Você fez a query no seu relatorio?
Se fez, colocou parametros?

A query no relatório eu fiz

mas sem parametros

C

Estranho, deveria funcionar!
Já que não tem parametros, você tirou este trecho do código então né?

p.put("param1", param1);
Panuci

cembjr:
Estranho, deveria funcionar!
Já que não tem parametros, você tirou este trecho do código então né?

p.put("param1", param1);

Exatamente, tirei mas continua dando o mesmo erro, ta embaçado viu!!!

o que vc acha??

abraços

C

Quando você compila no iReport da certo né?
Coloca o seu código ai pra eu dar uma olhada por favor …
O Query do iReport e o que você está usando para chamar o relatório.
Quando você executa a conexão em outro lugar ela funciona certinho tbm?

Panuci
cembjr:
Quando você compila no iReport da certo né? Coloca o seu código ai pra eu dar uma olhada por favor ... O Query do iReport e o que você está usando para chamar o relatório. Quando você executa a conexão em outro lugar ela funciona certinho tbm?

Sim cembjr, quando compilo no iReport da certo, tanto é que o arquivo .jasper e .jsxml são gerados

o código é este:

public class rel_clientes{
    private Object param1;

    private static class Conexao {
        private static Connection getConexao;

        public Conexao() {
        }
    }
    CriaConexao con = new CriaConexao();

 public void geraRelatorio(){
     
  try{
   java.sql.Connection conn = Conexao.getConexao;
   HashMap p = new HashMap();
   //p.put("param1", param1);

   File arquivo = new File("D:/salao/salao/relatorios/rel_clientes.jasper");

   if(arquivo.exists())
   {
      JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, conn);
     JasperExportManager.exportReportToPdfFile(jp, "rel_clientes.pdf");
     JOptionPane.showMessageDialog(null, "Exportado");
   } else JOptionPane.showMessageDialog(null, "Arquivo Inexistente");
}
catch(Exception ex)
       { JOptionPane.showMessageDialog(null, "Erro .: "+ex.getMessage());}
    }

}

E o query do iReport é simples, uso para que funcione e depois usarei uma query mais complexa

select * from cliente;

Ahh e a respeito da conexão, funcione perfeitamente em outras classes

tanto é que o sisteminha está praticamente pronto, falta o relatório e um outro form

Valeu, abraços

C

Tenta assim

view plaincopy to clipboardprint?
public class rel_clientes{  
    private Object param1;  
  
    private static class Conexao {  
        private static Connection getConexao;  
  
        public Conexao() {  
        }  
    }  
    CriaConexao con = new CriaConexao();  
  
public void geraRelatorio(){  
       
  try{  
   java.sql.Connection conn = Conexao.getConexao;  
   HashMap p = new HashMap();  
   //p.put("param1", param1);  
  
   File arquivo = new File("rel/rel_clientes.jasper");  
  
   if(arquivo.exists())  
   {  
     JOptionPane.showMessageDialog(null, "Arquivo .jasper Encontrado");
      if(conn != null){
         JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, conn);  
         JasperExportManager.exportReportToPdfFile(jp, "rel_clientes.pdf");  
         JOptionPane.showMessageDialog(null, "Exportado");  
     } else      JOptionPane.showMessageDialog(null, "Conexao Nula");
   } else JOptionPane.showMessageDialog(null, "Arquivo Inexistente");  
}  
catch(Exception ex)  
       { JOptionPane.showMessageDialog(null, "Erro .: "+ex.getMessage());}  
    }  
  
}

Assim vce vai verificar se o caminha do arquivo e a conexao estão ok!
Então, no seu projeto cria uma pasta rel e coloca o seu relatorio nela! Na raiz mesmo!
Tenta assim pra ver se funciona!

Qual é o seu SO?

Panuci

cembjr:
Tenta assim

view plaincopy to clipboardprint?
public class rel_clientes{  
    private Object param1;  
  
    private static class Conexao {  
        private static Connection getConexao;  
  
        public Conexao() {  
        }  
    }  
    CriaConexao con = new CriaConexao();  
  
public void geraRelatorio(){  
       
  try{  
   java.sql.Connection conn = Conexao.getConexao;  
   HashMap p = new HashMap();  
   //p.put("param1", param1);  
  
   File arquivo = new File("rel/rel_clientes.jasper");  
  
   if(arquivo.exists())  
   {  
     JOptionPane.showMessageDialog(null, "Arquivo .jasper Encontrado");
      if(conn != null){
         JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, conn);  
         JasperExportManager.exportReportToPdfFile(jp, "rel_clientes.pdf");  
         JOptionPane.showMessageDialog(null, "Exportado");  
     } else      JOptionPane.showMessageDialog(null, "Conexao Nula");
   } else JOptionPane.showMessageDialog(null, "Arquivo Inexistente");  
}  
catch(Exception ex)  
       { JOptionPane.showMessageDialog(null, "Erro .: "+ex.getMessage());}  
    }  
  
}

Assim vce vai verificar se o caminha do arquivo e a conexao estão ok!
Então, no seu projeto cria uma pasta rel e coloca o seu relatorio nela! Na raiz mesmo!
Tenta assim pra ver se funciona!

Qual é o seu SO?

Ei cembjr, realmente as condicionais que vc colocou achou o lugar do erro,

mas eu não sei como resolver

o sistema parou nos dois IFs

arquivo não encontrado - e olha que coloquei o endereço inteiro e nada

e

conexão nula - não sei o porquê disso também

por favor

agradeço

abraços

Panuci

cembjr:
Tenta assim

view plaincopy to clipboardprint?
public class rel_clientes{  
    private Object param1;  
  
    private static class Conexao {  
        private static Connection getConexao;  
  
        public Conexao() {  
        }  
    }  
    CriaConexao con = new CriaConexao();  
  
public void geraRelatorio(){  
       
  try{  
   java.sql.Connection conn = Conexao.getConexao;  
   HashMap p = new HashMap();  
   //p.put("param1", param1);  
  
   File arquivo = new File("rel/rel_clientes.jasper");  
  
   if(arquivo.exists())  
   {  
     JOptionPane.showMessageDialog(null, "Arquivo .jasper Encontrado");
      if(conn != null){
         JasperPrint jp = JasperFillManager.fillReport(arquivo.getAbsolutePath(), p, conn);  
         JasperExportManager.exportReportToPdfFile(jp, "rel_clientes.pdf");  
         JOptionPane.showMessageDialog(null, "Exportado");  
     } else      JOptionPane.showMessageDialog(null, "Conexao Nula");
   } else JOptionPane.showMessageDialog(null, "Arquivo Inexistente");  
}  
catch(Exception ex)  
       { JOptionPane.showMessageDialog(null, "Erro .: "+ex.getMessage());}  
    }  
  
}

Assim vce vai verificar se o caminha do arquivo e a conexao estão ok!
Então, no seu projeto cria uma pasta rel e coloca o seu relatorio nela! Na raiz mesmo!
Tenta assim pra ver se funciona!

Qual é o seu SO?

Ei cembjr, realmente as condicionais que vc colocou achou o lugar do erro,

mas eu não sei como resolver

o sistema parou nos dois IFs

arquivo não encontrado - e olha que coloquei o endereço inteiro e nada

e

conexão nula - não sei o porquê disso também

por favor

agradeço

abraços

Panuci

Então cembjr, agora eu mexi no endereço e está caindo apenas na condicional:

arquivo inexistente

o que vc acha???

valeu

C

Tem que ver certinho o diretorio e o nome do arquivo!!!
Tipo coloca assim /projeto/rel
E coloca no /projeto/dist/rel
e coloca no /projeto/src/rel

Assim não tem como ele não existir!!!

Panuci

cembjr:
Tem que ver certinho o diretorio e o nome do arquivo!!!
Tipo coloca assim /projeto/rel
E coloca no /projeto/dist/rel
e coloca no /projeto/src/rel

Assim não tem como ele não existir!!!

cembjr, agora sim o caminho está correto,

cai no If

arquivo .jasper encontrado

mas depois cai no If

conexão nula

por que dá conexão nula???

como resolver isso???

vejo que só falta este detalhe

por favor

valeu

C

Faz assim no seu Conexao

public class Conexao {
    private static String servidor = "com.mysql.jdbc.Driver";
    private static String usuario = "root";
    private static String senha = "suaSenha";
    private static String banco = "seuBanco";
    private static String server = "localhost";
    private static String url  = "jdbc:mysql://"+Conexao.server+"/"+Conexao.banco;

    
    public Conexao(){}    

    public static Connection conectar()
      {
          try
            {
                Class.forName(Conexao.servidor);
                Connection con = DriverManager.getConnection(Conexao.url, Conexao.usuario, Conexao.senha);
                return con;
            }
          catch(ClassNotFoundException c)
            {
                JOptionPane.showMessageDialog(null, "Classe "+servidor+" não encontrada \n"
                        + "Erro :"+c.getMessage());                
            }
          catch(SQLException sqlE){JOptionPane.showMessageDialog(null, "Erro SQL "+ sqlE.getMessage());
          }
          return null;
      }
}

E na hora que for chamar a conexao no seu geraRelatorio faz assim

java.sql.Connection con = Conexao.conectar();

Assim vai funcionar com certeza!!! :slight_smile:

C

Com esse método para conectar se der algum erro você verá o que é com JOptionPane!!!

Panuci

Então, não deu erro na conexão

veja bem

cai no primeiro If >>>> Arquivo .jasper encontrado

e depois da erro Null no try catch

isso tá me deixando maluco!!!

me ajuda ai cembjr

valeu

C

Seu iReport está configurado para rodar em java? as vezes pode ser por isso!

Panuci

Agora deu certo, está rodando e exportando para PDF, maravilhaaaaaaa

mas por que ele não está mostrando o relatório quando é chamado???

obrigado, abraços

C

É só você mandar mostrar!!! Tipo com esse comando ai ele apenas exporta para a raiz. Com o seu código antigo ele vai mostrar!!

Panuci

Haa ta

vou mexer aqui, legal

mas já agradeço tua ajuda e tua disposição

até mais, valeu

C

Se precisar pode perguntar!!! :slight_smile:
Se puder vou ajudar!

Criado 5 de julho de 2012
Ultima resposta 10 de jul. de 2012
Respostas 30
Participantes 3