Re:HELP IREPORT / NETBEANS

12 respostas
rockstorm

Verifique se esta sendo passado corretamente parametros para o subrelatorio e se o caminho do mesmo esta correto no relatorio principal

12 Respostas

RenataFA
erwin:
Pessoal fiz um relatorio com um sub relatorio no Ireport funcionou muito bem, porem quando vou para o netbeans para chamar o relatorio, ele chama so que os dados do sub relatorio nao aparecem.

Segue abaixo o codigo do netbeans.

public class veiculos_Rel {
    conexao con = new conexao();

    public void rel(String sql) {
        try {
            con.conecta();
            
            //con.executeSQL(sql);            
            con.executeSQL("SELECT * from veiculo");
            
            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
   
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    "relatorios/vei_Relatorio.jasper", new HashMap(), jrRS);
                          
            JasperViewer.viewReport(jasperPrint, false);
            

        } catch (Exception erro){
            JOptionPane.showMessageDialog(null,"deu erro ="+erro);
        }
    }
    public static void main(String args[]) {
        new veiculos_Rel();
    }
}

Olá amigo!

Respondi um tópico agora pouco em que vc mencionava seu problema.

Estou vendo que vc não passa nenhum parâmetro pro seu relatório principal, então o que eu respondi no outro tópico não se aplica.
Me diga, o seu subrelatorio não precisa de nenhum parâmetro pra funcionar?! Vc está lembrando de passar a conexão ativa pro seu subrelatório?! E os dados? Como vc fez para que seu subrelatório obtivesse os dados para serem impressos? Poderia postar como vc está fazendo a chamada pra esse subrelatório?

DICA: Sempre que for colocar trecho de código no forum, coloque da forma como fiz acima, fica mais legível para todos :wink:

marciofermino

O sub relatório não vem pq o nb nao consegue achar o sub-relatório, ou vc precisar passar o caminho por parametros.

RenataFA

Vamos lá erwin!!!

Olhei suas classes e fiz rodar aqui, como vc queria. Abaixo descrevo as modificações de cada uma. Estou reenviando o fonte pra vc ver, mas é que como precisei mexer neles pra funcionar de acordo com o que eu uso aqui, talvez vc não entenda tudo que mudei, por isso tô especificando as alterações em cada classe.

rela.java:

Mudei o método rela(), ele ficou assim:

public rela() {
    try {
        con.conecta(); // crio a conexão com o BD (creio que seja isso que esse seu método faça)
            
        // carrego os parâmetros que serão necessários pra rodar o relatorio (no seu caso, apenas o caminho do subrelatorio)
        HashMap<Object,Object> par = new HashMap<Object,Object>();
        par.put("caminhoSub","relatorio/clivei_Relatorios2.jasper");
   
        // crio o objeto jasperprint, estou passando apenas o caminho do jasper do rel principal, o hash com meus parametros e a conexão no tipo Connection (espero que sua classe conexao() retorne um Connection, senão terá que adaptar)
        JasperPrint jasperPrint = JasperFillManager.fillReport("relatorio/vei_Relatorio3.jasper",par,con);

        /* Perceba que eu não estou mais fazendo aquele lance seu de selecionar os dados e passar um resultset. Não tem pq vc fazer isso! lá dentro dos .jrxml vc está fazendo os sqls e retornando o que precisa, então não tem pq vc carregar esse resultset antes de chamar o rel. Apenas crie a conexao como fiz e passe essa conexao para seu jasper que ele fará o select. */
                          
        JasperViewer.viewReport(jasperPrint, false);
            
    } catch (Exception erro){
        JOptionPane.showMessageDialog(null,"deu erro ="+erro);
    }
}

vei_Relatorio3.jrxml:

Criei um parâmetro chamado caminhoSub, tipo String, valor default "clivei_Relatorios2.jasper"

Entrei nas propriedades do component de sub-relatório, na aba Subreport (Other), no campo subreport expression coloquei:
$P{caminhoSub}

clivei_Relatorios2.jrxml:

Creio que não mudei nada.

Qq coisa é só "gritar"!

Boa sorte! :wink:

Aqui estão os fontes funcionando pra download:

Marky.Vasconcelos

Só uma observação escreva o nome das classes com a primeira letra Maiuscula.

RenataFA

Olá erwin!

Olha, não vejo problemas na sua classe de conexão. A única coisa é que o parâmetro que vc deve passar qdo chama o relatório é na verdade o que no seu caso é um atributo da sua classe conexao. Seria esse atributo aqui:

private Connection conexao;

Faça um método “get” para ele dentro da sua classe conexao, algo assim:

public Connection getConexao(){ return conexao; }

Assim vc poderá, qdo for chamar o relatório passar naquele parâmetro: con.getConexao();

Olha, aqui precisamos pensar melhor… vc pode sim passar toda a instrução SQL por parâmetro para seu .jrxml. Mas a questão é: Será que vc precisa msm fazer isso?! Pq. vc disse que quer fazer a consulta por UM determinado veículo e não por todos, então não é mais fácil simplesmente passar o código do veículo desejado e fazer com que o .jrxml receba essa informação e substitua ela no SQL que já está dentro do seu .jrxml?

Bem, não sei se entendi direito o que vc quer… enfim, se ainda não der certo ou não tiver entendido, mande o erro que está acontecendo pra ficar mais fácil de entendermos.

Boa sorte! :wink:

RenataFA

Bom dia!

Poxa amigo, já fazem cerca de 3 meses que te respondi… eu nem lembrava mais do caso.

Enfim, dei uma olhada rápida aqui, veja só qdo vc chama o relatório principal vc passa pra ele a fonte de dados, ou seja, de onde ele tem que pegar os dados, o tal do jrRS.

No entanto, quando de dentro do relatório principal vc chama o sub-relatório vc não passa nenhum parâmetro pra ele! Como ele vai pegar os dados? De onde? Ele não sabe!

Tente dar uma olhada nisso, algum parâmetro vc deveria passar pro sub-relatório…

Boa sorte!

erwin

Pessoal fiz um relatorio com um sub relatorio no Ireport funcionou muito bem, porem quando vou para o netbeans para chamar o relatorio, ele chama so que os dados do sub relatorio nao aparecem.

Segue abaixo o codigo do netbeans.

public class veiculos_Rel {
    conexao con = new conexao();

    public void rel(String sql) {
        try {
            con.conecta();
            
            //con.executeSQL(sql);            
            con.executeSQL("SELECT * from veiculo");
            
            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
   
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    "relatorios/vei_Relatorio.jasper", new HashMap(), jrRS);
                          
            JasperViewer.viewReport(jasperPrint, false);
            

        } catch (Exception erro){
            JOptionPane.showMessageDialog(null,"deu erro ="+erro);
        }
    }
    public static void main(String args[]) {
        new veiculos_Rel();
    }
}
erwin

Prezada Renata, obrigado por responder,
No programa iReport gero o relatorio principal, depois faco o sub relatorio, quando coloco pra rodar no iReport o relatorio aparece perfeito, sem problemas, com todos os dados do principal e do subrelatorio, porem quando vou chamar o relatorio usando uma classe no netbeans ele so mostra os dados do relatorio principal e do subrelatorio nao aparece nada.

erwin

Segue em anexo os codigos

erwin

Renata muito obrigado pela sua ajuda entendi tudo q vc me explicou so nao consigo entender a parde da conexao estou te enviando minha classe conexao para vc dar uma olhada pois acho q nao funcionou aqui por conta dela.

Desculpa alguma coisa pois sou iniciante em programacao.

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

/**
 * @author Erwin
 * @version 1.0
 */

public class conexao {
    
    final private String driver = "com.mysql.jdbc.Driver";
    final private String url ="jdbc:mysql://localhost:3306/sidac?";
    final private String usuario = "erwinseguro";
    final private String senha = "erwinauto";
    
    private Connection conexao;
    public Statement statement;
    public ResultSet resultset;
    
    public boolean conecta(){
        boolean result = true;
        
        try{
            Class.forName(driver);
            conexao = DriverManager.getConnection(url, usuario, senha);
            //JOptionPane.showMessageDialog(null, "Conectou");
        } catch(ClassNotFoundException Driver){
            JOptionPane.showMessageDialog(null, "Driver não localizado" + Driver);
            result = false;
        } catch (SQLException Fonte){
            JOptionPane.showMessageDialog(null, "Deu erro na conexão " +
                    "com a fonte de dados:  " + Fonte);
            result = false;
        } // Fim do try catch
        
        return result;
    } // Fim do conecta
    
    public void desconecta(){
        boolean result = true;
        
        try{
            conexao.close();
            //JOptionPane.showMessageDialog(null, "Banco fechado");
        }catch(SQLException fecha){
            JOptionPane.showMessageDialog(null, "Não foi possível fechar " +
                    "o banco de dados: " + fecha);
            result = false;
        } // Fim do try catch
    } // Fim void desconecta
    
    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, "Não foi possível executar o " +
                    "comando sql, " + sqlex + ", o sql passado foi: " + sql);
        } // Fim d try catch
    } // Fim void executeSQL    
} // Fim da classe conexao.java
erwin

Sim Renata esqueci de falar tb que na minha classe veiculos_Rel eu recebo uma string sql de um form para poder fazer a consulta por um determinado veiculo e nao por todos.

Mark_Ameba obrigado pela dica…

erwin

Ola Renata, ainda estou com o mesmo problema nao sei o que fazer mais.

Tenho um botao que chama a classe que tem o relatorio.

String sql;
        try{
            sql = "SELECT * FROM veiculo WHERE idveiculo = " + jTF_Codigo.getText();
            relatorio.rel(sql);
        }catch(Exception erro){
            JOptionPane.showMessageDialog(null, "Nao localizou dados: " + erro);
        }

a classe que tem o relatorio esta assim:

package com.fariasdamata.relatorios;

import javax.swing.text.BadLocationException;
import javax.swing.text.rtf.RTFEditorKit;


import java.util.HashMap;
import javax.swing.JOptionPane;
import java.io.*;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

import com.fariasdamata.utilit.conexao;

/**
 *
 * @author Erwin
 */
public class cliente_Rel{
    conexao con = new conexao();
    
    //public cli_Relatorio() {
    public void cliRel(String sql) {
        try {
            con.conecta();
            con.executeSQL(sql);
            JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    "relatorios/cli_Individual2.jasper", new HashMap(), jrRS);
            JasperViewer.viewReport(jasperPrint, false);
        } catch (Exception erro){
            JOptionPane.showMessageDialog(null,"deu erro = "+erro);
        }
    }
     //jr = JasperCompileManager.compileReport("c:/projetos/com/provenda/relas/teste.jrxml");
    public static void main(String args[]) {
        new cliente_Rel();
    }
}

Agora vem o problema, no ireport funciona perfeito o relatorio com o sub relatorio quando vai para o netbeans nao funciona vou te mandar em anexo os arquivos jasper e os fontes do sistema do ireport e do bd.

Se voce puder dar uma olhada te agradeco bastante.

Tive que fazer no programa uma armacao para poder usar enquanto nao resolvo este problema na classe cad_Veiculos ele copia os dados de uma tabela para outra para poder usar no relatorio. Agora ta tudo doido aff…

Obrigado

Criado 18 de outubro de 2007
Ultima resposta 18 de jan. de 2008
Respostas 12
Participantes 5