Problemas com relatorios no iReport [RESOLVIDO]

21 respostas
S

Oi amigos, estou com um problema com meu relatorio iReport.
Estou desenvolvendo uma aplicação no NetBenas 6.9.1, e fiz um relatoriono IReport 4.0.
Quando estou dentro do NetBeans, o meu relatorio é exibido normalmente, porem quando mando limpar e construir e rodo a aplicação no windows, quando mando chamar o relatorio ele não é exibido, não da erro nem nada, só não mostra nada, como se o botão estivesse sem função nenhuma.
Por favor me ajudem a resolver este problema, ja procurei aqui varios post mas não consegui resolver.
Um abraço

21 Respostas

A

Está um bocado vago esse seu problema, mas cheira a caminho do relatório sendo informado errado dentro da sua aplicação.

T

sammarino,
Trabalhamos com código…
Então posta código da classe que faz a chamada e onde está o relatório.

L

uma pergunta vc esta montando sua aplicação no netbeans?

abrx

S

S

Two - Vou postar o codigo sim, obrigado.

lokit´s - Sim, estou desenvolvendo no NetBeans 6.9.1, dentro dele funciona perfeitamente, mas quando construo o projeto e executo pelo arquivo jar da pasta dist, só´o relatório é que não aparece quando clico no botão que corresponde a ele, o resto funciona normalmente. Obrigado.

A

A chamada do seu relatório bem provavelmente está cercada por um try-catch. Na captura da exceção coloque um ex.printStackTrace(); e então chame sua aplicação já compilada pela linha de comando usando java -jar suaAplicacao.jar Clique no botão para chamar seu relatório e veja o que foi mostrado no console. Serão essas mensagens que darão pistas concretas do problema.

S

Boa noite a todos, este é o codigo fonte da classe que chama o relatorio:

package Utilitarios;

import java.util.HashMap;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.view.JasperViewer;

public class AutCaixa{

Conexao con = new Conexao();

public AutCaixa(){
    
    try
    {
       con.conecta();
       con.executeSQL("select * from pagamentos");
       JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
       JasperPrint jasperPrint = JasperFillManager.fillReport
       ("C:/Users/sammarino1975/Documents/NetBeansProjects/Pagamentos/relatorios/autcaixa.jasper", new HashMap(), jrRS);
       JasperViewer .viewReport(jasperPrint);
     }

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

public static void main (String args[])
{
    AutCaixa app = new AutCaixa();
    
}


}

Chama perfeitamente o relatorio dentro do Netbeans, mas fora não.
O meu relatorio está salvo neste local: C:/Users/sammarino1975/Documents/NetBeansProjects/Pagamentos/relatorios/autcaixa.jasper
Ah, uso o windows 7, e esse endereço ai eu consegui pelas propriedades do relatorio.

S

Caros amigos, tenho outra duvida, quando clico no botão de fechar o relatorio, ele está fechando a aplicação toda, nao estou conseguindo colocar o codigo DISPOSE_ON_CLOSE nesta classe, onde exatamente ele deveria ficar no meu codigo e qual a sintaxe correta dele? Obrigado.

A

Sobre sua última pergunta… nessa linha:

JasperViewer .viewReport(jasperPrint);

coloque assim:

JasperViewer .viewReport(jasperPrint, false);

E sobre a chamada do relatório, aqui eu faço assim:

JasperReport report = (JasperReport) JRLoader.loadObject("meuRelatorio.jasper");
relatorio = JasperFillManager.fillReport(report, parametros, conexao); // parametros é o HashMap e conexao é o Connection

Dessa forma, só preciso deixar o meuRelatorio.jasper na mesma pasta em que está o jar da minha aplicação e funciona. Inclusive essa aplicação fica numa pasta compartilhada, e o pessoal acessa pela rede e já era.

S

ENTÃO MEU CODIGO FICARIA ASSIM?

package Utilitarios;

import java.util.HashMap;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.view.JasperViewer;

public class AutCaixa{

Conexao con = new Conexao();

public AutCaixa(){

try

{

con.conecta();

con.executeSQL(select * from pagamentos);

JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);

JasperReport report = (JasperReport) JRLoader.loadObject(“autcaixa.jasper”);

relatorio = JasperFillManager.fillReport (report, new HashMap(), jrRS);

JasperViewer .viewReport(relatorio, false);
}

catch (Exception erro)

{

JOptionPane.showMessageDialog(null, " erro " + erro);

}

}
public static void main (String args[])

{

AutCaixa app = new AutCaixa();

}

}

É ISSO? SE ESTIVER ERRADO, VC ME FARIA O FAVOR DE COLOCAR CORRETAMENTE PARA MIM?
A PALAVRA RELATORIO EM NEGRITO DEVE SER SUBSTITUIDA POR ALGUMA COISA OU FICA RELATORIO MESMO?
OBRIGADO PELA AJUDA.

S

Ola, mudei o codigo e ele ficou assim:

package Utilitarios;

import java.util.HashMap;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.util.JRLoader;

import net.sf.jasperreports.view.JasperViewer;

public class TedCaixa{

Conexao con = new Conexao();

public TedCaixa(){
    
    try
    {
       con.conecta();
       con.executeSQL("select * from pagamentos");
       JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
       JasperReport report = (JasperReport) JRLoader.loadObject
       ("C:/Users/sammarino1975/Documents/NetBeansProjects/Pagamentos/relatorios/tedcaixa.jasper");
       JasperPrint relatorio = JasperFillManager.fillReport(report, new HashMap(), jrRS);
       JasperViewer .viewReport(relatorio, false);
       
    }

    catch (Exception erro)
    {
        JOptionPane.showMessageDialog(null, " erro " + erro);

    }
}

public static void main (String args[])
{
    TedCaixa app = new TedCaixa();
    
}

}

O problema de fechar toda a aplicação foi resolvido, mas continua só aparecendo o relatorio dentro do netBeans.
Fiz tambem com JasperReport report = (JasperReport) JRLoader.loadObject(“tedcaixa.jasper”);
mas não deu certo. Copiei o relatorio para a pasta dist do meu projeto, pois é lá que fica o jar da aplicação, ele simplesmente sumiu de la, e tambem nao deu certo.
Quando mando executar dentor do netbeans aparece o seguinte no console, mas executa normalmente:

run:
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment).
log4j:WARN Please initialize the log4j system properly.
CONSTRUÍDO COM SUCESSO (tempo total: 26 segundos)

Tem outra coisa, a bliblioteca ant, que veio no iReport dá o maior pau se estiver copiada dentro da pasta java\jdk1.6_22\jre\lib\ext, só funciona se eu deletar esta biblioteca de lá.

S

.

A

O teu último código tá mais perto de dar certo. Nesta linha

JasperReport report = (JasperReport) JRLoader.loadObject("C:/Users/sammarino1975/Documents/NetBeansProjects/Pagamentos/relatorios/tedcaixa.jasper");

Eu tiraria o caminho completo do relatório e deixaria apenas

JasperReport report = (JasperReport) JRLoader.loadObject("tedcaixa.jasper");

Enquanto estiver desenvolvendo, salve o seuRelatorio.jasper na pasta acima da pasta dist. Essa pasta dist é recriada pelo NetBeans quando compila a aplicação, então é por isso que o relatório some de lá. É só na hora de distribuir a aplicação que você deve adicionar os seus .jasper na pasta dist (ou em outra que vc desejar, o lance é estar tudo dentro do mesmo lugar - o jar da aplicação e os .jasper).

Nunca copiei a pasta ant pra lugar nenhum…

S

Oi Ademilston, fiz como vc disse, salvei o jasper na pasta pagamentos e mudei o codigo conforme vc havia me instruido, so mostrou o relatorio dentro do netbeans. Fiz o teste de, depois de compilar, como se tivesse terminado a aplicação, copiar o tedcaixa.jasper na pasta dist e mandei executar, mas ainda não mostrou o tal do relatorio. Eu tenho que instalar algo no PC alem do iReport? Mudar alguma coisa nas variaveis de ambiente?

A

Nada a instalar… teria que ser simples assim… De tudo o que te falei antes, faltou só mencionar isto:

JasperViewer viewer = new JasperViewer(relatorio, false); // nessa linha você diz que ao fechar a janela do visualizador o restante da aplicação ficará aberta
   viewer.setVisible(true); //será esta a cerejinha do bolo que te falta aí??
S

Oi Ademilton, ainda não deu certo, quando clico no botão que imprime o relatorio, ele fica parecendo que esta chamando mas nada aparece na tela, so dentro do NetBeans. Será que é algo no meu PC? Nas variaveis de ambiente? Mas volto a agradecer pela atenção.

S

Oi, veja se está correto o que estou fazendo, fiz uma classe em branco pra fazer a conexao com o banco de dados e com o formulario do ireport,

package Relatorios;

import Utilitarios.Conexao;

import java.util.HashMap;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.util.JRLoader;

import net.sf.jasperreports.view.JasperViewer;

public class TedCaixa{

Conexao con = new Conexao();

public TedCaixa(){
    
    try
    {
       con.conecta();
       con.executeSQL("select * from pagamentos");
       JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
       JasperReport report = (JasperReport) JRLoader.loadObject("tedcaixa.jasper");
       JasperPrint relatorio = JasperFillManager.fillReport(report, new HashMap(), jrRS);
       JasperViewer viewer = new JasperViewer(relatorio,false);
       viewer.setTitle("Relatório de Pagamentos");
       viewer.setVisible(true);
       viewer.show();
       
       //viewer.setBounds(0,0,800,600);   Determina o tamanho da janela

       
    }

    catch (Exception erro)
    {
        JOptionPane.showMessageDialog(null, " erro " + erro);

    }
}

public static void main (String args[])
{
    TedCaixa app = new TedCaixa();
    
}

}

e no botao que chama esta classe para mostrar o relatorio pra que ele seja impresso, fiz assim, events, action, actionperformed:

new Relatorios.TedCaixa();

S

Ola amigos, consegui resolver o problema.
Tem que adicionar as bibliotecas instaladas no iReport ao projeto pelo netbeans para poder funcionar.
No meu caso, estou usando o iReport 4.0, as blibliotecas dele ficam na pasta C:\Program Files\JasperSoft\iReport-4.0.0\ireport\modules\ext, adicione todas, (no meu caso a ant-1.7.1, eu nao instalei porque dava erro), e adicionei tambem a biblioteca ireport.jar, do iReport 3.1. Para adicionar as bibliotecas ao projeto, clique com o botão direito sobre o projeto, dentro do netbeans, propriedades, Bibliotecas, aba Compilar, Adicionar JAR/Pasta, selecione todas e de um ok. Depois de tudo pronto, mande limpar e construir. Feito isso, vá a pasta do seu projeto e na pasta dist, onde fica o jar que vai executar a aplicação, e copie os relatorios .jasper para esta pasta dist que da certinho. Mas lembre-se, se for limpar e construir outra vez, copie novamente, pois esta pasta dist e substituida toda vez que mandamos limpar e construir o projeto. Obrigado a todos pela ajuda. Não teria conseguido sem vcs, um grande abraço. Segue o codigo fonte da classe que chama o relatorio:

package Relatorios;

import Utilitarios.Conexao;

import java.util.HashMap;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRResultSetDataSource;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.util.JRLoader;

import net.sf.jasperreports.view.JasperViewer;

public class TedCaixa{

Conexao con = new Conexao();

public TedCaixa(){
    
    try
    {
       con.conecta();
       con.executeSQL("select * from pagamentos");
       JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
       JasperReport report = (JasperReport) JRLoader.loadObject("tedcaixa.jasper");
       JasperPrint relatorio = JasperFillManager.fillReport(report, new HashMap(), jrRS);
       JasperViewer viewer = new JasperViewer(relatorio,false);
       viewer.setTitle("Relatório de Pagamentos");
       viewer.setVisible(true);
       viewer.show();
                           
    }

    catch (Exception erro)
    {
        JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);

    }
}

public static void main (String args[])
{
    TedCaixa app = new TedCaixa();
    
}

}

Neste caso, dava tudo certo dentro do NetBeans, mas quando eu rodava o aplicativo o relatorio não era exibido, pois faltava adicionar as bibliotecas ao projeto. Espero que estas informações ajudem alguem assim como me ajudaram. Abraços a todos. Obrigado

A

Parabéns, cara… A determinação te leva onde quiser chegar!!

Só um comentário sobre a solução que você encontrou: Não há necessidade de adicionar TODAS as bibliotecas que o iReports traz. Aqui em meu projeto, por exemplo uso só estas:

commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-digester-1.7.jar
commons-logging-1.1.jar
iText-2.1.7.jar
jasperreports-4.0.0.jar
poi-3.6-20091214.jar

Faço assim desde a versão 3.0.0 do iReport (os jars são os mesmos, apenas versões anteriores).

S

Obrigado amigo, como eu não sabia, copiei tudo rsrsrs.
Valeu.

S

Agora estou com outro probleminha pra resolver, vou abrir outro topico, se vc puder me dar uma mão vou agradecer. O topico vai se chamar: SELECIONAR APENAS UM REGISTRO DA TABELA NO RELATORIO IREPORT.

Criado 18 de janeiro de 2011
Ultima resposta 25 de jan. de 2011
Respostas 21
Participantes 4