[Resolvido] Classe em Java para chamar Relatório criado no iReport

24 respostas
franzzita

Olá Pessoal,

Tenho visitado vários Tópicos aqui no Fórum sobre relatórios utilizando iReport e nenhum deles infelizmente deu resultado para minha dúvida.
Gostaria da ajuda de vocês, se alguém puder ajudar ficarei muito agradecida!
Vamos lá...

Já tenho meu relatório que foi criado no iReport, ele está funcionamento corretamente dentro do iReport Designer. Porém quando chamo dele dentro da minha Classe Java, aparece a seguinte mensagem de erro:

[color=red]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)
at Relatórios.relOC.(relOC.java:29)
at Principal.MenuPrincipal.jMenuItem10ActionPerformed(MenuPrincipal.java:859)
at Principal.MenuPrincipal.access$3000(MenuPrincipal.java:38)
at Principal.MenuPrincipal$31.actionPerformed(MenuPrincipal.java:528)
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:1225)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1266)
at java.awt.Component.processMouseEvent(Component.java:6216)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
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)[/color]

Não faço o mínima idéia do que seja isso, estou enviando abaixo código da Classe criada, a SQL que estou passando é a minha query usada no iReport, é grande, mas nela tem tudo o que vai ser utilizado no relatório que é bem extenso tbm. Obrigada pela atenção de vocês! ^^

package Relatorios;

import java.util.HashMap;
import Conexao.ConexaoServicos;
import Principal.Opcoes;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;

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

    public static int opcao = Opcoes.opcao;
    public static int teste = 4; //variavel criada para ser usada como parametro dentro da minha consulta SQL
    
    public relOC()
    {
        try
        {
            con.conecta(opcao);

            con.executeSQL("SELECT ordem_compra.`id_ordem_compra` AS ordem_compra_id_ordem_compra, ordem_compra.`data_emissao` AS ordem_compra_data_emissao, ordem_compra.`valor_total` AS ordem_compra_valor_total, fornecedor.`Nome_Fantasia` AS fornecedor_Nome_Fantasia, fornecedor.`Endereco` AS fornecedor_Endereco, fornecedor.`Complemento` AS fornecedor_Complemento, fornecedor.`Bairro` AS fornecedor_Bairro, fornecedor.`Cidade` AS fornecedor_Cidade, fornecedor.`CEP` AS fornecedor_CEP, forma_pagamento.`Forma_Pagamento` AS forma_pagamento_Forma_Pagamento, forma_pagamento.`Parcelamento` AS forma_pagamento_Parcelamento, forma_pagamento.`Dias_parcelas` AS forma_pagamento_Dias_parcelas, dados_ordem_compra.`quantidade` AS dados_ordem_compra_quantidade, dados_ordem_compra.`data_entrega` AS dados_ordem_compra_data_entrega, dados_ordem_compra.`valor_unitario` AS dados_ordem_compra_valor_unitario, dados_ordem_compra.`nome_produto` AS dados_ordem_compra_nome_produto, dados_ordem_compra.`valor_total` AS dados_ordem_compra_valor_total, dados_ordem_compra.`id_dados_ordem` AS dados_ordem_compra_id_dados_ordem FROM `ordem_compra` ordem_compra INNER JOIN `fornecedor` fornecedor ON ordem_compra.`fornecedor_id_fornecedor` = fornecedor.`id_fornecedor` INNER JOIN `forma_pagamento` forma_pagamento ON ordem_compra.`forma_pagamento_id_Formas_Pagamento` = forma_pagamento.`id_Formas_Pagamento` INNER JOIN `dados_ordem_compra` dados_ordem_compra ON ordem_compra.`id_ordem_compra` = dados_ordem_compra.`ordem_compra_id_ordem_compra` WHERE ordem_compra.`id_ordem_compra` = '"+teste+"' ORDER BY ordem_compra.`id_ordem_compra` ASC");

            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
            JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/relOC.jasper", new HashMap(), jrRS);
            JasperViewer.viewReport(jasperPrint, false);
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possivel gerar relatório!"+erro);
        }
    }
}

Fico aguardando um Help!

24 Respostas

drsmachado

Para qual linha o erro aponta?
Perceba que ali existe um nullpointerexception, ou seja, alguma coisa não foi instanciada e está sendo chamada…

franzzita
drsmachado:
Para qual linha o erro aponta? Perceba que ali existe um nullpointerexception, ou seja, alguma coisa não foi instanciada e está sendo chamada...

drsmachado,

Como faço pra descobrir para qual linha o erro aponta?
Eu creio que se estiver algo relacionado é com a linha 29...
Já li muito sobre esse NullPointer, mas mesmo assim não consigo encontrar pra onde ele está apontando que está vazio, minha conexão com o banco de dados é essa caso seja necessaria.

package Conexao;

import java.sql.*;
import javax.swing.*;

public class ConexaoServicos
{     
	private static Connection conexao;	     
	public static Statement statement;
        public static ResultSet resultset;
        
	public static String driver = "org.gjt.mm.mysql.Driver";	     
	public static String usuario = "root";	     
	public static String senha = "senhaqualquer";	     
	public static String url;	
	
	public boolean conecta(int opcaoSelecionada)
	{	      
           
		if (opcaoSelecionada == 1)	        		   
			url = "jdbc:mysql://localhost:3306/BancoS";

		if (opcaoSelecionada == 2)
                        url = "jdbc:mysql://localhost:3306/BancoE";
	
		try	            
		{		                
			Class.forName(driver);                
			conexao = DriverManager.getConnection(url, usuario, senha);	             
			//JOptionPane.showMessageDialog(null,"Pronto para cadastrar!");	                
			statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			resultset = statement.executeQuery("SHOW TABLES");
			return true;          
                }
		catch(ClassNotFoundException Driver)	            
		{                
			JOptionPane.showMessageDialog(null,"Driver nao localizado: "+Driver);
			return false;	            
		}	            
		catch(SQLException Fonte)	            
		{	                
			JOptionPane.showMessageDialog(null,"Deu erro na conexao "+"com a fonte de dados: "+Fonte);
			return false;	            
		}	            
		catch(Exception erro)	            
		{	           
			JOptionPane.showMessageDialog(null,"Nao foi possivel cria Conexao com o Banco de Dados! "+erro);
			return false;	    
		}	
	} 
	
	public void executeSQL(String sql)	     
	{         
		try	         
		{	             
			statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			resultset = statement.executeQuery(sql);
		}	         
		catch(SQLException sqlex)	         
		{	         
			JOptionPane.showMessageDialog(null,"Nao foi possivel"+"executar o comando sql, "+sqlex+"O sql passado foi "+sql);
		}	     
	}
drsmachado
Relatórios.relOC.<init>(relOC.java:29)

Então, não sei se é a mesma linha 29 da classe relOC
Pode apontar qual é a linha 29 nessa classe, caso não seja a mesma que está postada?

franzzita
JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/relOC.jasper", new HashMap(), jrRS);

Me desculpa! Não percebi que a numeração não tinha ficado igual…
Essa linha acima é a linha 29 aqui no meu código.

drsmachado

Certamente um dos parâmetros está nulo.
Eliminando, você tem uma String em hardcode (foi feita na mão), um new HashMap() e

JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);

Provável que o jrRS esteja nulo.

franzzita

drsmachado:
Certamente um dos parâmetros está nulo.
Eliminando, você tem uma String em hardcode (foi feita na mão), um new HashMap() e

JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);

Provável que o jrRS esteja nulo.

Vou fazer alguns teste aqui, tentar declarar o jrRS de outra maneira…
Depois posto aqui o resultado dos testes.

Obrigada por enquanto!!

drsmachado

Conseguiu resolver, fran?

marcospaulo.suporte

Amiga…
Acho que o problema está em carregar o arquivo do .jasper

Onde você colocou o seu arquivo de relatorio compilado?

Se tiver junto do seu projeto, por exemplo na raiz dele, a melhor maneira é:

JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relOC.jasper"));

Agora se ele estiver dentro de algum package interno, você deve informar também, assim:

JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relatorio/relOC.jasper"));

vc está usando alguma ide?

franzzita

Oie drsmachado,

Não consegui ainda, infelizmente, tentei declarar o JRResultSetDataSource fora do método para ver se estava com problema na maneira de instaciar. Acontinuou persistindo o erro.
O que eu não consigo entender é que eu tenho outros Relatórios que exibem normalmente utilizando da mesma Classe. Relatório de produtos, clientes, fornecedores, funcionarios… esse de ordem e de produto em estoque é que estão me complicando a vida, acho mesmo que tem algo de errado na minha SQL, o que você acha?
Os relatórios que estão exibindo utilizam instruções sql simples por exemplo “SELECT * FROM cliente” …

Obrigada pela ajuda…
^^

franzzita

marcospaulo.suporte:
Amiga…
Acho que o problema está em carregar o arquivo do .jasper

Onde você colocou o seu arquivo de relatorio compilado?

Se tiver junto do seu projeto, por exemplo na raiz dele, a melhor maneira é:

JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relOC.jasper"));

Agora se ele estiver dentro de algum package interno, você deve informar também, assim:

JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relatorio/relOC.jasper"));

vc está usando alguma ide?

Olá Marcos,

Estou utilizando Netbeans versão 7.0.1.
Meu .jasper está na mesma pasta “relatorio” onde está o arquivo .jrxml dentro do meu projeto.

Vou tentar utilizar essas instruções que você me passou… ^^

marcospaulo.suporte

Ou Então…
ai tiramos da duvida…

JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("../relatorio/relOC.jasper"));
franzzita
public class relOC
{
    ConexaoServicos con = new ConexaoServicos();
    JRResultSetDataSource jrRS;
    
    public static int teste = 4;
    
    public relOC()
    {
        try
        {
            con.conecta();
            con.executeSQL("SELECT ordem_compra.`id_ordem_compra` AS ordem_compra_id_ordem_compra, ordem_compra.`data_emissao` AS ordem_compra_data_emissao, ordem_compra.`valor_total` AS ordem_compra_valor_total, fornecedor.`Nome_Fantasia` AS fornecedor_Nome_Fantasia, fornecedor.`Endereco` AS fornecedor_Endereco, fornecedor.`Complemento` AS fornecedor_Complemento, fornecedor.`Bairro` AS fornecedor_Bairro, fornecedor.`Cidade` AS fornecedor_Cidade, fornecedor.`CEP` AS fornecedor_CEP, forma_pagamento.`Forma_Pagamento` AS forma_pagamento_Forma_Pagamento, forma_pagamento.`Parcelamento` AS forma_pagamento_Parcelamento, forma_pagamento.`Dias_parcelas` AS forma_pagamento_Dias_parcelas, dados_ordem_compra.`quantidade` AS dados_ordem_compra_quantidade, dados_ordem_compra.`data_entrega` AS dados_ordem_compra_data_entrega, dados_ordem_compra.`valor_unitario` AS dados_ordem_compra_valor_unitario, dados_ordem_compra.`nome_produto` AS dados_ordem_compra_nome_produto, dados_ordem_compra.`valor_total` AS dados_ordem_compra_valor_total, dados_ordem_compra.`id_dados_ordem` AS dados_ordem_compra_id_dados_ordem FROM `ordem_compra` ordem_compra INNER JOIN `fornecedor` fornecedor ON ordem_compra.`fornecedor_id_fornecedor` = fornecedor.`id_fornecedor` INNER JOIN `forma_pagamento` forma_pagamento ON ordem_compra.`forma_pagamento_id_Formas_Pagamento` = forma_pagamento.`id_Formas_Pagamento` INNER JOIN `dados_ordem_compra` dados_ordem_compra ON ordem_compra.`id_ordem_compra` = dados_ordem_compra.`ordem_compra_id_ordem_compra` WHERE ordem_compra.`id_ordem_compra` = '"+teste+"' ORDER BY ordem_compra.`id_ordem_compra` ASC");
            jrRS = new JRResultSetDataSource(con.resultset);
            JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relatorio/relOC.jasper"));
            JasperPrint jasperPrint = JasperFillManager.fillReport(relatorio, new HashMap(), jrRS);
            JasperViewer.viewReport(jasperPrint, false);
  
        }
        catch(JRException erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possivel gerar relatório!"+erro);
        }
    }
}

Marcos, alterei o código... mas ainda está dando erro...
=/

franzzita
JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("SistemaGerenFinan/relatorio/relOC.jasper"));

Assim também não deu…

Esse SistemaGerenFinan é meu projeto, está localizado no C://

marcospaulo.suporte

Vamos tentar isso.

JasperPrint jasperPrint = JasperFillManager.fillReport("../relatorio/relOC.jasper", parameters, jrRS);
JasperViewer.viewReport(jasperPrint, false);

ou

JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/relOC.jasper", parameters, jrRS);
JasperViewer.viewReport(jasperPrint, false);
marcospaulo.suporte

franzzita:
JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("SistemaGerenFinan/relatorio/relOC.jasper"));

Assim também não deu…

Esse SistemaGerenFinan é meu projeto, está localizado no C://

Como está a estrutura das pastas?

C:\SistemaGerenFinan
– build
– dist
– nbproject
– relatorio
– src
??

Se tiver assim… tem que procurar o relatorio assim:

"../relatorio/relOC.jasper"

Se tiver assim:
C:\SistemaGerenFinan
– build
– dist --> relatorio
– nbproject
– src

"relatorio/relOC.jasper"
Como esta?

franzzita

marcospaulo.suporte:
Vamos tentar isso.

JasperPrint jasperPrint = JasperFillManager.fillReport("../relatorio/relOC.jasper", parameters, jrRS);
JasperViewer.viewReport(jasperPrint, false);

ou

JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/relOC.jasper", parameters, jrRS);
JasperViewer.viewReport(jasperPrint, false);

Fiz os teste, alterei e não deu certo ainda…
Mesmos erros ainda persistem.

franzzita

marcospaulo.suporte:
franzzita:
JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("SistemaGerenFinan/relatorio/relOC.jasper"));

Assim também não deu…

Esse SistemaGerenFinan é meu projeto, está localizado no C://

Como está a estrutura das pastas?

C:\SistemaGerenFinan
– build
– dist
– nbproject
– relatorio
– src
??

Se tiver assim… tem que procurar o relatorio assim:

"../relatorio/relOC.jasper"

Se tiver assim:
C:\SistemaGerenFinan
– build
– dist --> relatorio
– nbproject
– src

"relatorio/relOC.jasper"
Como esta?

Está assim:

C:\SistemaGerenFinan
– build
– dist
– nbproject
– relatorio
– src
??

Dentro da pasta relatorio ali estão meus arquivos .jasper e .jrxml…
Tenso, já tentei das duas maneiras…
Será que não é problema no meu sql?

franzzita

Utilizando a classe JRException exibiu o seguinte erro…

Não foi possivel gerar relatório! net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: SistemaGerenFinan\relatorio\relOC.jasper
marcospaulo.suporte

[quote=franzzita]Utilizando a classe JRException exibiu o seguinte erro…

Não foi possivel gerar relatório! net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: SistemaGerenFinan\relatorio\relOC.jasper

Certo… esta dizendo que nao achou o relatorio…
Como vc ta usando o netbeans… acho que está executando o programa direto pelo netbeans correto?

Compila o codigo e executa direto pelo programa…

dist. > projeto.jar

É pra funcionar…

franzzita

Nossa, está acontecendo umas coisas bem doidas, LIMPEI E CONSTRUI depois executei meu .jar e nenhum relatório exibiu… nem aqueles que estavam exibindo!
Será que tem algum problema com Classpath?

Esse é meu primeiro projeto… estou terminando já, mas algumas coisas ainda não peguei a manhã de como fazer…
Milhares de dúvidas surgem em volta de um único erro…

Obrigada pela paciência, Marcos!

marcospaulo.suporte

Copia a pasta ‘relatorio’ dentro da dist e tenta?
Te mandei um mp. olhe pf.

Se tivesse problema no class path ele nem abriria

franzzita

Oie,

Acabei de responder a MP, te adicionei no Email…

Olha, copiei para a dist e mesmo assim, ele continua exibindo o erro para a seguinte linha:

JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/relOC.jasper", new HashMap(), jrRS);

=/

franzzita

Problema resolvido!!!!

A solução adotada foi a seguinte:

Código do relatório...

package Relatórios;

import java.util.HashMap;
import Conexao.ConexaoServicos;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;

public class relOC
{
    ConexaoServicos con = new ConexaoServicos();
    private JRResultSetDataSource jrRS;
    
    public relOC(String teste)
    {
        try
        {
            con.conecta();
            con.executeSQL("minha_consulta_sql");
            jrRS = new JRResultSetDataSource(con.resultset);
            JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/relOC.jasper", new HashMap(), jrRS);  
            JasperViewer.viewReport(jasperPrint, false);  
        }
        catch(JRException erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possivel gerar relatório!"+erro);
        }
    }
}

Depois dissso com o conselho do Marcos, desistalei o Netbeans, o JDK e o iReport... instalei tudo novamente e importei as bibliotecas do JasperSoft para o Netbeans.

Obrigada pela ajuda! ^^
Esse fórum é ótimo...
:D

marcospaulo.suporte

O jdk tava com pau… O ireport tava meio bixado por causa do jdk…

Q bom que deu certo… Vlw. T+

Criado 27 de setembro de 2011
Ultima resposta 29 de set. de 2011
Respostas 24
Participantes 3