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
Problemas com relatorios no iReport [RESOLVIDO]
21 Respostas
Está um bocado vago esse seu problema, mas cheira a caminho do relatório sendo informado errado dentro da sua aplicação.
sammarino,
Trabalhamos com código…
Então posta código da classe que faz a chamada e onde está o relatório.
uma pergunta vc esta montando sua aplicação no netbeans?
abrx
…
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 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.
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.
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.
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.
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.
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á.
.
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…
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?
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í??
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.
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();
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
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).
Obrigado amigo, como eu não sabia, copiei tudo rsrsrs.
Valeu.
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.