Aonde está o erro desse relatorio?!?!?!

35 respostas
Willdoidao

Tenho um sistema que era para gerar um sistema simples de relatorio atraves do Jasper, mas está apresentando erro no relatorio, a seguir tem o conteudo do botão e do erro apresentado:

Conteudo do botão:

try {
            Class.forName("com.mysql.jdbc.Driver");
            String banco = "jdbc:mysql://localhost:3306/otica";
            Connection conn = DriverManager.getConnection(banco, "root", "will@958");

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        HashMap mapa = new HashMap();
        JasperPrint relatorio = null;
        try {


            relatorio = JasperFillManager.fillReport("Armação.jasper", mapa,conn);
            JasperViewer.viewReport(relatorio, false);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

e o erro que o sistema apresenta é esse:

net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: Armação.jasper
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:79)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:232)
        at Produtos.Armacao.JB_RelatorioActionPerformed(Armacao.java:551)
        at Produtos.Armacao.access$400(Armacao.java:43)
        at Produtos.Armacao$5.actionPerformed(Armacao.java:329)
        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.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Caused by: java.io.FileNotFoundException: Armação.jasper
        ... 30 more

35 Respostas

T

O sistema não está encontrando o relatório
Coloque o seu relatório em um pacote
Crie uma classe sem nada dentro desse pacote

Ex.:

public class Relatorio
{
}

E acesse o relatório dessa forma

relatorio = JasperFillManager.fillReport(Relatorio.class.getResourceAsStream(“Armação.jasper”, mapa,conn);

Dessa forma ele busca o relatório no mesmo pacote da classe.

Dica.: Procure não criar os nomes dos relatórios com acentos.

Willdoidao

Cara troquei o nome e criei uma classe vazia como vc falou, os relatorios já estão em um pacote separado mas está dando erro a sentença que vc passou:

relatorio = JasperFillManager.fillReport(Relatorio.class.getResourceAsStream("Armacao.jasper", mapa,conn));

o erro é esse:

method getResourceAsStream in class java.lang.Class cannot be applied to given types
required: java.lang.String
found: java.lang.String, java.util.HashMap, java.sql.Connection

a unica string que tem ai é a conn que já está declarada:

Connection conn;
davidbuzatto

Não está funcionando pq a chamada está errada.

Faça assim:

JasperFillManager.fillReport(Relatorio.class.getResourceAsStream("Armação.jasper"), mapa,conn);

O thiago errou na hora de colocar o parêntes no lugar certo :wink:

[]´s

Willdoidao

Caras perfeito funcionou a chamada, mas estou com um outro erro agora que é esse:

15/01/2010 16:36:58 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
WARNING: The supplied java.sql.Connection object is null.

E fala que não há paginas no relatorio, sendo que existe dados na tabela em questão!!!

T

Faltou uma chave depois do “Armacao.jasper” foi mals kkkk

Esse erro ocorreu porque o objeto Connection está nulo
Posta a classe inteira para a gente dar uma olhada

davidbuzatto

Will, leia a excessão: The supplied java.sql.Connection object is null
A conexão que você está passando não está sendo criada.
Confira se os dados parâmetros passados para a criação da conexão estão corretos.

[]´s

Willdoidao
Caras muito obrigado pela ajuda que vcs estão dando !!! Consegui resolver o problema d aconecção com o banco de dados nesse caso o Mysql, só que apareceu outro, o relatorio não está gerando os dados, ele monta o relatorio só que nw preenche nada, não dá erro, ele está conectando ao banco, criei uma classe só para cuidar da conecção mas não está preenchendo o relatorio!! o que pode ser, preciso fazer um select ante? segue a baixo o conteudo do botão:
Connection conn = new conecao().conectar();
        if (conn != null) {

            HashMap mapa = new HashMap();
            JasperPrint relatorio = null;
            try {

                //relatorio = JasperFillManager.fillReport("Armacao.jasper", mapa, conn);
               relatorio = JasperFillManager.fillReport(Relatorio.class.getResourceAsStream("Arma.jasper"), mapa, conn);

                JasperViewer.viewReport(relatorio, false);
            } catch (Exception ex) {
                ex.printStackTrace();
            }

        } else {
            JOptionPane.showMessageDialog(null, "Não foi possivel conctar ao banco!!! Tente novamente!!!", "ERRO", JOptionPane.ERROR_MESSAGE);
        }
Willdoidao

Galera realmente não sei o pq nw está sendo preenchido o relatorio já refiz a conecção do plugin do netbeans a classe o botão, e só está sendo preenchindo o cabeçario do relatorio nada mais, preciso desse relatorio e nada de conseguir alguma sugestão??!?!?

Classe responsável pela conecção:

public class conecao {
    
    public Connection conectar(){
  // base de dados é "test"
  String url = "jdbc:mysql://localhost:3306/otica";
  String usuario = "root";
  String senha = "will@958";
  try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    Connection conn = DriverManager.getConnection(url, usuario,senha);
    return conn;
  }
  catch(SQLException ex){
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
    return null;
  }
  catch(Exception e){
    System.out.println("Problemas ao tentar conectar com o bancode dados: " + e);
      return null;
    }
  }
}

E no botão está assim:

try {
           Connection conn = new conecao().conectar();
             ResultSet rs = null;
       

        HashMap mapa = new HashMap();
        JasperPrint relatorio = null;
   


            relatorio = JasperFillManager.fillReport("Novas.jasper", mapa, conn);
            JasperViewer.viewReport(relatorio, false);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

Já fiz como o davidbuzatto me falaram tb para jogar o arquivo jasper na raiz do projeto e os dois acontece a mesma coisa só preenche o cabeçario!

Willdoidao
Galera realmente não sei o pq nw está sendo preenchido o relatorio  refiz a conecção do plugin do netbeans a classe o botão, e  está sendo preenchindo o cabeçario do relatorio nada mais, preciso desse relatorio e nada de conseguir alguma sugestão??!?!?

Classe responsável pela conecção:

[code]public class conecao {
    
    public Connection conectar(){
  // base de dados é "test"
  String url = "jdbc:mysql://localhost:3306/otica";
  String usuario = "root";
  String senha = "will@958";
  try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    Connection conn = DriverManager.getConnection(url, usuario,senha);
    return conn;
  }
  catch(SQLException ex){
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
    return null;
  }
  catch(Exception e){
    System.out.println("Problemas ao tentar conectar com o bancode dados: " + e);
      return null;
    }
  }
}

E no botão está assim:

try {
           Connection conn = new conecao().conectar();
             ResultSet rs = null;
       

        HashMap mapa = new HashMap();
        JasperPrint relatorio = null;
   


            relatorio = JasperFillManager.fillReport("Novas.jasper", mapa, conn);
            JasperViewer.viewReport(relatorio, false);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

Já fiz como o davidbuzatto me falaram tb para jogar o arquivo jasper na raiz do projeto e os dois acontece a mesma coisa só preenche o cabeçario!

TheKill

Amigo, de uma olhada em sua conexao com o banco,

Onde está o seu result set com as informações que vão ser enviadas para o relatório???

PS.: Relatório sem informação = nao recebeu informação :wink:

Att. Jonas

TheKill

Esta enviando:

relatorio = JasperFillManager.fillReport("Novas.jasper", mapa, conn);

conn = null ?!

e o result set com a consulta do banco?

Willdoidao

Amigo refiz o botão mas ainda nw consegui resolver, poderia me ajudar? É a primeira vez que mexo com o ireport e to apanhando demais! O botão ficou assim agora:

CallableStatement CS = null;
            Connection conn = new conecao().conectar();

        if (conn != null) {
            try {
                HashMap mapa = new HashMap();
                JasperPrint relatorio = null;
                relatorio = JasperFillManager.fillReport("Novas.jasper", mapa, conn);
                JasperViewer.viewReport(relatorio, false);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } else {
            JOptionPane.showMessageDialog(null, "Não foi possivel conctar ao banco!!! Tente novamente!!!", "ERRO", JOptionPane.ERROR_MESSAGE);
        }
TheKill

vc nao entendeu…

onde esta o result set?

o “select * from table” da vida?

Att. Jonas

Willdoidao

Então pq em outros topicos tinham dito que com o plugin do netbeans nw era necessario fazer o select que ele faria isso sozinho!

TheKill

então tá…

se o seu netbeans consegue adivinhar onde os dados estão…
parabens :wink: pois ainda desconheço isso…

Salvo, se vc está usando a conexao de banco diretamente no relatório

att. Jonas

Willdoidao

Então cara como falei to perdidão é a primeira vez que mexo com relatorios! Nw faço nem ideia de como recriar essa classe para poder fazer a conecção direta com o banco ou de como preencher esse relatorio!

TheKill

Faça a consulta com o result set … e ao invés de mandar um simples conn que nao tem nada dentro…

vc vai enviar o result set com as informações já consultadas…

ps.: … os famosos select da vida, rs.next();
o basicao de consulta a banco de dados.

att. Jonas

Willdoidao

Seguindo o conselho do TheKill pesquisei mais um pouco na net e achei alguns exemplos que tentei aplicar ao meu relatorio mas sem conseguir o resultado esperado o botão está da seguiinte maneira:

try {
            CallableStatement CS = null;
            Connection conn = new conecao().conectar();

            if (conn != null) {
                JOptionPane.showMessageDialog(null, "Conexão efetuada com sucesso!");
            } else {
                JOptionPane.showMessageDialog(null, "Conexão não efetuada com sucesso!");
            }

            Statement stm = conn.createStatement();
            String query = "select * from arma";
            ResultSet rs = stm.executeQuery(query);
            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);

            HashMap mapa = new HashMap();
            JasperPrint relatorio = null;
            relatorio = JasperFillManager.fillReport("report1.jasper", mapa, conn);
            JasperViewer.viewReport(relatorio, true);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

E continua a não preencher o relatorio! Nw sei mais o que fazer para esse relatorio funcionar!

TheKill

olha bem oque esta fazendo:

ResultSet rs = stm.executeQuery(query);  
 JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
relatorio = JasperFillManager.fillReport("report1.jasper", mapa, conn);

Vejamos… por que esta enviando conn para o relatório? conn esta vazio. envie rs

att. Jonas

ManoJava

Bom dia

Parece que vc esta passando um HashMap vazio para o relatorio, tente popular seu Hash.

private HashMap<String, Object> parametros = new HashMap<String, Object>();

Att.

Willdoidao

Caras obrigado pela paciencia e pela ajuda, mas tá fogo de conseguir fazer esse relatorio, qundo faço o que o TheKill passou :

relatorio = JasperFillManager.fillReport("report1.jasper", mapa, rs);

o fillReport fica marcado como errado e nw achei nada no lugar para substituir sem dá o erro, e mano java como preencheo isso? pq nos exemplos que achei inclusive aqui do forum (tanto outros topicos como o tutorial) o Map está declarado daquela maneira!

TheKill

relatorio = JasperFillManager.fillReport(“report1.jasper”, mapa, rs);

???

relatorio = JasperFillManager.fillReport(“report1.jasper”, mapa, rs);

o map pode ir null, desde que nao teja esperando $P em seu relatorio

Willdoidao

Cara passei esses dias tentando e pesquisando, mas realmente nw sei o que fazer, nw consigo fazer funcionar de jeito nenhum cara!

ManoJava

Manda uma cópia do .jrxml pra gente dar uma analisada.

TheKill

Ps.:

Envie aqui no GUJ um copy do seu result set para analisar…

system.out.println(rs);
ao meu ver, seu result set esta indo null para o relatório

att. Jonas

Willdoidao

Blz vou mandar o resultado logo mais, primeiro vou mandar o que o ManoJava pediu jundo com uma copia do banco e da tela que chama o relatorio.
E assim que sair de uma reunião coloco o resultado, a tela em questão está com o primeiro codigo postado por mim aqui.
Caras mais uma vez obrigado pela ajuda! Muito obrigado!

TheKill

Segue dúvida.

Você esta querendo que as informações venham da aplicação, ou sejam geradas diretamente do relatório?
ou seja relatório Dinâmico ou Stático…

Se for Dinâmico, retire do seu relatório o Report Query que contem SQL. isso vai ser enviado de sua aplicação
e o relatório vai ser moldado de acordo com os dados enviados pela mesma.

Caso contrario, verifique se está sendo feito a conexao corretamente no seu Report Query, utilizando da opcao de teste de conexão
e também no Preview.

Att. Jonas

Willdoidao

Então estatico mesmo! Então nos dois casos ele funciona, tanto no teste como no preview, só quando chamo o maldido relatorio ele aparece em branco!

TheKill

Huuum, entendi.

Olha, eu nunca trabalhe desta forma com o iReport…
sempre passei o SQL ou HashMap pela aplicação entao nao sei como te ajudar…

Att. Jonas

ManoJava

Boa tarde

Tava analisando sua query e notei que vc nao colocou nenhuma clausula WHERE no codigo, quais as condições para esse retorno do relatório where ? = ?

Att.

Willdoidao

Mano não coloquei nada pq é um relatorio geral mesmo quero que retorne tudo dele, pq vai ser usado para conferir o material.

Thekill poderia dar um exemplo de como vc trabalha? um codigo de exemplo cara pq sendo sincero nw sei mais o que fazer, olho para o codigo e tá batendo é desespero cara!

TheKill

Amigo, poste o result set conforme comentado anteriormente…

e altere seu sql para select campo1, campo2, campo3, etc from tabela …

ps.: campos conforme os que existem no relatorio.
obs.: se os nomes estiverem diferente utilize da sintaxe AS nomeCampoRelatorio.
exemplo: select codigo as cd_mercadoria

bd campo: codigo
relatorio campo: cd_mercadoria
sql: select codigo as cd_mercadoria from …

Att. Jonas

Willdoidao

Caras o select ficou assim, to usando o assistente do ireport para fazer o select:

SELECT arma.`Tamanho` AS arma_Tamanho, arma.`Quanti` AS arma_Quanti, arma.`Fabricante` AS arma_Fabricante, arma.`Cor` AS arma_Cor, arma.`Modelo` AS arma_Modelo, arma.`Tipo` AS arma_Tipo FROM `arma` arma

e o a saida está assim:

com.mysql.jdbc.JDBC4ResultSet@df503

TheKill

se a sua resposta de resultset é esta que vc postou,
seu sql esta errado,

veja seu banco e olhe as respostas de cada item da tabela…
e vai verificar que não é este resultado:

com.mysql.jdbc.JDBC4ResultSet@df503

onde tá os resultados da consulta SQL ?

TheKill

eu fiz um teste, alterei apenas 1 campo para buscar do meu banco de dados.

tirei todos e deixei apenas 1 campo, vou anexar o arquivo para vc olhar, e verifique corretamente seus campos e FIELDS do relatorio…

att. Jonas

Criado 15 de janeiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 35
Participantes 5