Problemas com subrelatorio (Urgente!) Resolvido!

30 respostas
S

Bom Dia Galera,

Esse eh o meu primeiro post mas sou um frequentador nato do forum, a questão eh que não encontrei a resposta aki e nem local nenhum para o meu problema.
É o seguinte:

Uso Java SE 1.6.0.17, iReport 3.7.0, NetBeans 6.7.

Importei todas as bibliotecas que se encontram na pasta: C:\Program Files\JasperSoft\iReport-3.7.0\ireport\modules\ext, Correto?

Sendo que no iReport ele funciona muito bem sem nenhum erro.

Aki esta o relatório funcionando no iReport:

Já no java segue abaixo o meu codigo para chamar o .jasper

import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
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 RelVenda {

public static Conexao conecta = new Conexao();

 public RelVenda() {
        
        
        HashMap parametros = new HashMap();
        String par = JOptionPane.showInputDialog(null, "Favor inserir pedido: ");
        conecta.conecta();
        conecta.executeSQL("select * from saidaProduto where pedidoS = " + par);
        JRResultSetDataSource jrRS = new JRResultSetDataSource(conecta.resultSet);
        JasperPrint jasperPrint;

        try {
            
            jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros, jrRS);
            JasperViewer.viewReport(jasperPrint, false);
        } catch (JRException ex) {
            JOptionPane.showMessageDialog(null, ex);
        }
    }

  public  static void main (String args[]){
      new RelVenda();
  }
}

e da o seguinte erro:

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: 53 segundos)

Só que ele funciona mas o subrelatorio não sai nenhum dados.

resultado abaixo:

e quando eu deleto o log4j da ext da jre ele me da o seguinte erro:

WARNING: The supplied java.sql.Connection object is null.

Entao peço a ajuda de vocês o mais rapido possivel por que tenho que entregar proxima semana, eu ja rodei essa web todinha atras de resposta mas nenhum sucesso.

Eu agradeço desde já atenção de vocês

Sir.Rommer…

Visite o meu blog: www.romulobrasil.com

30 Respostas

F

Olá sir.rommer,
Não consegui perceber nenhum erro no código postado. Seria interessante se você anexasse os arquivos do relatório e subreport para uma análise mais detalhada. Talvez a localização do arquivo do subreport não esteja no classpath da aplicação.

J

Acredito que esse é o caminho pra solução do seu problema!

[list]Talvez a localização do arquivo do subreport não esteja no classpath da aplicação.[/list]

S

Bom Pessoal,

É o seguinte a primeira imagem que postei ele está do jeito como eu queira mas ela so roda assim direto no iReport ja na aplicação so aplicação aparece o subrelatorio mas nao os dados, como mostra a ulitma imagem, dão uma analisada nas duas imagens…

estou postando tbm os dois arquivos dos meu relatorio e subrelatorio para v6 analisarem, certo?

qualquer coisa se ainda não ficou claro o meu problema eu explicarei novamente.

Poh galera muito obrigado é bom ver que tem gente querendo ajudar…
um grande abraço…

S

fbcarvalho:
Olá sir.rommer,
Não consegui perceber nenhum erro no código postado. Seria interessante se você anexasse os arquivos do relatório e subreport para uma análise mais detalhada. Talvez a localização do arquivo do subreport não esteja no classpath da aplicação.

postei o relatorio e o subrelatorio, espero que isso me ajude.

Só uma pergunta como eu faço para colocar na classpath os meu relatorios é só colocar a pasta onde ele se encotra se for isso eu já fiz e ainda ta com o mesmo problema, certo?

Um abraço…

M

Boa tarde!

Tava analisando seu relatório e notei que na “Expression class” do seu subreport vc deixou como java.lang.String, quando nesse caso deve ser java.io.File, pode ser esse o problema ou talvez o caminho do subreport, mas faça essa mudança e me diga qual foi o resultado.

Att.

S

ManoJava:
Boa tarde!

Tava analisando seu relatório e notei que na “Expression class” do seu subreport vc deixou como java.lang.String, quando nesse caso deve ser java.io.File, pode ser esse o problema ou talvez o caminho do subreport, mas faça essa mudança e me diga qual foi o resultado.

Att.

Oi ManoJava,

Mudei mas ele não compila agora diz que:
“cannot cast from String to File”.

OBS: já tinha feito isso que vi aki mesmo no forum algem falando para fazerem isso mas eu voltei para configuração anterio pq tinha dado esse erro ai, E agora?

No Aguardo.

M

Tem essa sintaxe também para buscar o subrelatório, o seu relatório deve conter o seguinte parametro:

Nome: SUBREPORT_DIR
Parameter class: java.lang.String
Default value expression: System.getenv(“JASPER_SUBREPORT_DIR”)

Desde que seu classpath ja esteja configurado, através desse parametro ele acha seu subrelatório.

Sintaxe de caminho:

JasperUtil.getSubReport($P{SUBREPORT_DIR}, “Controlest/Relatório/relProdutos”)

Att.

S

ManoJava:
Tem essa sintaxe também para buscar o subrelatório, o seu relatório deve conter o seguinte parametro:

Nome: SUBREPORT_DIR
Parameter class: java.lang.String
Default value expression: System.getenv(“JASPER_SUBREPORT_DIR”)

Desde que seu classpath ja esteja configurado, através desse parametro ele acha seu subrelatório.

Sintaxe de caminho:

JasperUtil.getSubReport($P{SUBREPORT_DIR}, “Controlest/Relatório/relProdutos”)

Att.

ManoJava, putz kara, mas não sei se é minha iguinorancia mas não deu certo não,

agora está dizendo que paramentro não foi encotrado sendo que criei e tudo fiz do jeito que vc me disse mas nada ainda.

desculpa por ter que ficar pertubando mas sou iniciante saca neh?

Um Abraço e no aguardo.

M

Tranquilo, to no ireport agora mesmo e se pudermos resolver, não vai dar trabalho nenhum!

M

manda de novo ai o relatório com essa nova configuração que te passei!

S

Pronto segue abaixo.

Muito Obrigado pela ajuda.

F

Verifiquei os teus arquivos e vi que você faz uma nova pesquisa no subreport. Sendo assim no iReport vai funcionar porque você tem uma conexcão estabelecida com o BD, mas na aplicação você está passando um resultset com as informações somente do relatório principal. Quando o subreport é executado não existe conexão com o BD e os dados não são exibidos (O problema da conexão que você reportou: The supplied java.sql.Connection object is null. ). Sendo assim, passe a conexão do BD para o report e não o resultset:
JasperFillManager.fillReport(“Relatório/relVenda.jasper”, parametros, JDBCConnection);

Obs: não esqueça de parametrizar a query do relatório principal assim como fez com o subreport

M

Vc ainda não criou o parametro que te falei, da uma olhada na imagem abaixo e repare no lado esquerdo nas propriedades.

Att


S

ManoJava:
Vc ainda não criou o parametro que te falei, da uma olhada na imagem abaixo e repare no lado esquerdo nas propriedades.

Att

Criei sim olhai ai vê se ta certo?


M

Vc setou as propriedades corretamente ? e tambem da uma analisada na sintaxe do caminho, pois do modo como coloquei foi supondo que seu classpath ja esta configurado.

S

fbcarvalho:
Verifiquei os teus arquivos e vi que você faz uma nova pesquisa no subreport. Sendo assim no iReport vai funcionar porque você tem uma conexcão estabelecida com o BD, mas na aplicação você está passando um resultset com as informações somente do relatório principal. Quando o subreport é executado não existe conexão com o BD e os dados não são exibidos (O problema da conexão que você reportou: The supplied java.sql.Connection object is null. ). Sendo assim, passe a conexão do BD para o report e não o resultset:
JasperFillManager.fillReport(“Relatório/relVenda.jasper”, parametros, JDBCConnection);

Obs: não esqueça de parametrizar a query do relatório principal assim como fez com o subreport

Não endendi poderia colocar no meu codigo com os parametros pq quando passei JDBCConnection ele da cannot find symbol.
Podeira me ajudar nesse quesito em codigos se não for pedir muito,

Muito obrigado pela seu ajuda,
Um abraço e no aguardo.

S

Isso, fiz como mandou e como mostra na minha imagem que lhe envie, esta do jeito que me falou e deu uma olhada no caminha e esta certo.

O negocio ta Russo, rsrs.

Por favor só peço pra não se esquecer desse problema.
rrsrs

M

Tira o c:/ do caminho ai e passa só o nome da pasta e do relatório.

F

JDBCConnection foi um exemplo de variável do tipo Connection.

No código atual você tem um objeto do tipo Conexao e cria um JRResultSetDataSource passando o resultset produzido por esse objeto:

conecta.conecta();  
         conecta.executeSQL("select * from saidaProduto where pedidoS = " + par);  
         JRResultSetDataSource jrRS = new JRResultSetDataSource(conecta.resultSet);
Ao invés de criar um JRResultSetDataSource e passá-lo para o preenchimento do report :
jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros,jrRS);
Passe a conexão com o DB que deve estar no seu objeto conecta assim como você tem o resultSet. Acho que no seu cóodigo ficaria :
HashMap parametros = new HashMap();  
         String par = JOptionPane.showInputDialog(null, "Favor inserir pedido: ");  
         conecta.conecta();
         JasperPrint jasperPrint;  
   
         try {  
               
             jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros, conecta.connection);  
             JasperViewer.viewReport(jasperPrint, false);  
         } catch (JRException ex) {  
             JOptionPane.showMessageDialog(null, ex);  
         }
S
fbcarvalho:
JDBCConnection foi um exemplo de variável do tipo Connection.

No código atual você tem um objeto do tipo Conexao e cria um JRResultSetDataSource passando o resultset produzido por esse objeto:

conecta.conecta();  
         conecta.executeSQL("select * from saidaProduto where pedidoS = " + par);  
         JRResultSetDataSource jrRS = new JRResultSetDataSource(conecta.resultSet);
Ao invés de criar um JRResultSetDataSource e passá-lo para o preenchimento do report :
jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros,jrRS);
Passe a conexão com o DB que deve estar no seu objeto conecta assim como você tem o resultSet. Acho que no seu cóodigo ficaria :
HashMap parametros = new HashMap();  
         String par = JOptionPane.showInputDialog(null, "Favor inserir pedido: ");  
         conecta.conecta();
         JasperPrint jasperPrint;  
   
         try {  
               
             jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros, conecta.connection);  
             JasperViewer.viewReport(jasperPrint, false);  
         } catch (JRException ex) {  
             JOptionPane.showMessageDialog(null, ex);  
         }

Deu erro na parte quando foi setar o fillReport pq ele recebe uma string, HashMap e uma boolean e conecta.connection nao fucionou,
mas eu acho que esse é o raciocinio do meu problema.

no meu caso conecta ele tem que pegar o metodo de conexao ao BD não eh?

no aguardo...

S

ManoJava,

Tirei mas nada aconteceu fica ainda dizendo que parametro não encontrado.

OBS.: ManoJava, vc não acha que o meu subrelatorio nao ta é encontrando a conexao de meu banco não? Tipo como o nosso colega, “fbcarvalho”, que está tbm me ajudando falou no post anterior, pq na foto que fiz no primeiro post os detalhes do subrelatorio ele aparece mas nao aparece eh o dados, mas todos os label aparece que pertencem ao subrelatorio entao nesse caso ele esta encontrando o subrelatorio, concorda? Deve ser que a conexao do subrelatorio nao encontre a base de dados mas so que venho quebrando a cabeça desde de segunda por isso que resolvi buscar ajuda aki.

No aguardo de sua replica.

ManoJava Brigadão mesmo pela atenção.

F

O método fillReport possui várias assinaturas dentre elas uma uma que recebe String, Map, Connection e é a esta assinatura que me referi no código.

Quando coloquei no código a expressão conecta.connection, estava supondo que no seu objeto conecta existia uma propriedade publica com o nome connection do tipo java.sql.Connection (a sua conexão com o banco de dados). Na verdade você não precisa necessariamente da expressão conecta.connection, mas sim de uma conexão JDBC com o banco de dados e passá-la para o método fillReport. Verifique a sua class Conexao e veja qual propriedade ou método pode lhe fornecer a conexão estabelecida com o BD. Talvez o método conecta.conecta() devolva a conexão. Se não conseguir, poste o código da classe Conexao para que eu possa te ajudar sem suposições

S
fbcarvalho:
Deu erro na parte quando foi setar o fillReport pq ele recebe uma string, HashMap e uma boolean e conecta.connection nao fucionou

O método fillReport possui várias assinaturas dentre elas uma uma que recebe String, Map, Connection e é a esta assinatura que me referi no código.

Quando coloquei no código a expressão conecta.connection, estava supondo que no seu objeto conecta existia uma propriedade publica com o nome connection do tipo java.sql.Connection (a sua conexão com o banco de dados). Na verdade você não precisa necessariamente da expressão conecta.connection, mas sim de uma conexão JDBC com o banco de dados e passá-la para o método fillReport. Verifique a sua class Conexao e veja qual propriedade ou método pode lhe fornecer a conexão estabelecida com o BD. Talvez o método conecta.conecta() devolva a conexão. Se não conseguir, poste o código da classe Conexao para que eu possa te ajudar sem suposições

Bom dia fbcarvalho,

fiz aqui mas deu o mesmo erro segue abaixo o meu codigo de conexão ao BD:

import java.sql.Statement;
import java.sql.ResultSetMetaData;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class Conexao {

    final private String driver = "com.mysql.jdbc.Driver";
    private boolean result = true;
    public Connection conexao;
    public Statement stmt;
    public ResultSet resultSet;
    Propertie props = new Propertie();

    public boolean conecta() {

        try {
            props.chamaProps();
            String server = props.getServer();
            String usuario = props.getUsuario();
            String senha = props.getSenha();
            String url = "jdbc:mysql://" + server + "/almoxarifado";
            Class.forName(driver);
            conexao = DriverManager.getConnection(url, usuario, senha);

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Impossível conectar ao banco \n" + e);
            result = false;
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Impossível conectar ao banco \n" + e);
            result = false;
        }
        return result;
    }

    public void desconecta() {
        result = true;
        try {
            conexao.close();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel desconectar do BD \n" + e, "Erro", JOptionPane.ERROR_MESSAGE);
            result = false;
        }
    }

    public void executeSQL(String sql) {

        try {
            stmt = conexao.createStatement();
            //stmt = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultSet = stmt.executeQuery(sql);
            ResultSetMetaData metaData = resultSet.getMetaData();

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Não possivel executar o comando SQL \n" + e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }
}
F

Como podemos ver, na sua classe Conexao existe o atributo conexao do tipo Connection :

...
public  class Conexao {  
   
     final private String driver = "com.mysql.jdbc.Driver";  
     private boolean result = true;  
     public Connection conexao; 
...

Sendo assim, use o seguinte comando para a geração do relatório:

jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros, conecta.conexao)

S

fbcarvalho:
Como podemos ver, na sua classe Conexao existe o atributo conexao do tipo Connection :

...
public  class Conexao {  
   
     final private String driver = "com.mysql.jdbc.Driver";  
     private boolean result = true;  
     public Connection conexao; 
...

Sendo assim, use o seguinte comando para a geração do relatório:

jasperPrint = JasperFillManager.fillReport("Relatório/relVenda.jasper", parametros, conecta.conexao)

Meu amigo fbcarvalho,

Muito obrigado mesmo mas muito obrigado mesmo era só isso mesmo que tava faltando ta funcionando redodamento otimo.

kra valeu mesmo desde de segunda que to apanhado nisso.

e que Deus lhe dê uma boa esposa. rsrs

Um grade abraço!!!

Agora so me responde uma coisa ele ta pegando todos os dados do banco e fica muita pagina como faço para da um select que ele entre só com o numero do pedido como tava antes? tem como?

S

Venho aki pedi muito obrigado pelo todas as pessoas que me ajudaram nesse post principalmente ao fbcarvalho e o ManoJava valeu mesmo.

M

Bom dia

Quando precisar é só perguntar!

Att. 8)

F

Hoje eu te ajudo, amanhã você me ajuda… e assim a comunidade continua forte. Um abraço.

S

desculpas, rsrs

Agora so me responde uma coisa ele ta pegando todos os pedidos do banco e fica muita pagina como faço para da um select que ele entre só com o numero do pedido como tava antes? tem como?

No aguardo…

F

Acho que passou batido mas eu ja havia te alertado para isso anteriormente:

Criado 4 de fevereiro de 2010
Ultima resposta 5 de fev. de 2010
Respostas 30
Participantes 4