Chamar relatório com Ireport [Resolvido]

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

[code]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);
    }
}

}
[/code]

Classe que conecta com o banco de dados

[code]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);
    }
    }

}[/code]

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

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…

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

tentei fazer como vc falou mas não adiantou

obrigado

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…

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

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

[quote=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…[/quote]

Obrigado pela dica, estou verificando isso

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?

[quote=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?[/quote]

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

faz isso

[code]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());}
[/code]

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

[quote=cembjr]faz isso

[code]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());}
[/code]

Verifique se os parametros estão corretos … e com esse código ai mostra o erro![/quote]

Está dando erro: Null

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

[quote=cembjr]Você fez a query no seu relatorio?
Se fez, colocou parametros?[/quote]

A query no relatório eu fiz

mas sem parametros

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

   p.put("param1", param1);    

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

p.put("param1", param1); [/quote]

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

o que vc acha??

abraços

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?

[quote=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?[/quote]

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

o código é este:

[code]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());}
}

}
[/code]

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

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?

[quote=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?[/quote]

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

[quote=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?[/quote]

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