Relatório aparece em Branco

44 respostas
Lags

Olá a Todos,

Estou com um problema que não estou consigo resolver desde ontem, se alguém poder ajudar desde já agradeço muito.

O plugin do Ireport instalado no netbeans, clico preview ele chama o relatório com dados do select e tudo aparece ok.

Quando chamo pela classe java , o relatório vem com os campos estáticos + data + números de página,
porém sem os dados do select.

Me ajudem pessoal estou precisando disso urgente.

44 Respostas

Vinny

O relatório abre?
se sim provavelmente o erro ta no seu select que vc ta passando pelo o código
da uma verificada nisso, pq um espaço que esteja faltando no seu sql já vai da erro
mas da um verificada nisso
e qualquer coisa cola seu código aqui!

Lags
private void btnGerarActionPerformed(java.awt.event.ActionEvent evt) {                                         
    verificaBusca();
    parametrosSubRelatorio();
}                                        

private void formWindowActivated(java.awt.event.WindowEvent evt) {                                     
limparComboNomeProduto();
populaComboNomeProduto();

}                                    

public void populaComboNomeProduto()
{
    ctrProduto = new CTR_ManterProduto();
    produtos = ctrProduto.listarProdutos("codigoProduto");
    comboNomeProduto.addItem(" -- Selecione -- ");
    comboNomeProduto.addItem("Todos");
    for (Produto listaProdutos: produtos)
    {
       comboNomeProduto.addItem((Produto) listaProdutos); 
    }  
}

public void limparComboNomeProduto()
{
    comboNomeProduto.removeAllItems();
}


private void verificaBusca()
{
    if (comboNomeProduto.getSelectedItem().equals(" -- Selecione -- "))
    {
       JOptionPane.showMessageDialog(this,"Selecione o Produto para visualizar o relatório!","Informação..",JOptionPane.INFORMATION_MESSAGE);
       auxValor = 0;
    }
    if (comboNomeProduto.getSelectedItem().equals("Todos"))
     
    {
       auxValor = 1;
    }else
    {
        auxValor = 2;
    }    
}

private boolean casosErro()
{
    if (((auxValor == 1) || (auxValor == 2)) && vetorEstoque.size() == 0)
    {
       JOptionPane.showMessageDialog(this,"Este Produto não consta em Estoque!","Informação",JOptionPane.INFORMATION_MESSAGE);  
       return true;
    }  
    
//    if ((auxValor == 3) && (vetorEstoque.size() == 0))
//    {
//       JOptionPane.showMessageDialog(this,"Este Loja não tem Produtos em Estoque!","Informação",JOptionPane.INFORMATION_MESSAGE);
//       return true;
//    }
//    
    return false;
}        



private void  parametrosSubRelatorio()
{
   // busca um produto de cada vez 
   produtoAux = new Produto();  
   ctrProduto = new CTR_ManterProduto();
   vetorEstoque = new ArrayList<Produto>();
 

       if (auxValor == 2){


       Produto produtoAux1 = (Produto) comboNomeProduto.getSelectedItem();
       produtoaux2 = ctrProduto.carregarProdutoCodigoProduto(produtoAux1.getCodigoProduto());
       vetorEstoque.add(produtoaux2);

       if ((casosErro() == false) && (auxValor == 2))
       {
          diretorio = dir1;
          mapeiaParametros();
       try
          {
            auxRelatorio.geraRelatorio(nomeRelatorio, auxRelatorio.getReport(diretorio), parameters);
          }
          catch (Exception ex)
          {
            Logger logAux = Logger.getLogger(formRelatorioProduto.class);
            mensagemErro = "Erro gerado pelo sistema: "+ex;
            log.gerarLog(logAux, mensagemErro);
          }
       }
       }
}        
  
private void mapeiaParametros() 
{
  try
  {        
    parameters = new HashMap();
    parameters.put("codigoProduto",produtoaux2.getCodigoProduto());
    parameters.put("imagem", auxRelatorio.getImagem(imagemCaminho));
  }
  catch (Exception e)
  {
    Logger logAux = Logger.getLogger(formRelatorioProduto.class);
    mensagemErro = "Erro gerado pelo sistema: "+e;
    log.gerarLog(logAux, mensagemErro);  
  }        
}
Lags

Alguém pode me dar apoio aqui?

Lags

Fala ai Galera dêem uma ajuda ai, estou precisando muito resolver isso!

Agradeço pela atenção!

Vinny

Bom eu não encontrei no seu código em lugar algum onde
vc faz a chamada do relatório com o resultSet.
Eu queria ver essa parte!

Lags

Bom dia Vinny,

Eu estou usando Hibernate.
Este são as variaveis que eu declarei:

public class formRelatorioProduto extends javax.swing.JFrame { private String dir1 = "relatorioProduto"; private String dir2 = "relatorioProdutoTodos"; private String diretorio; private CTR_ManterProduto ctrProduto; private CTR_ManterItemPedido ctrItemPedido; private HashMap parameters; private Produto produtoAux ; private List<Produto> produtos; private ArrayList<Produto> vetorEstoque; private Produto produtoaux2; private PedidoVO pedidoAux; private int auxValorCombo = 0; private Loja lojaAux; private int auxValor = 0; private GeraIreport auxRelatorio = new GeraIreport(); private String nomeRelatorio = "Relatorio de Produtos"; private GeraLog log = new GeraLog(); private String mensagemErro; private String imagemCaminho = "toporelatorio";

TheKill

Sim… Mas onde você passa o código da consulta, ou alguma informação para a informação ser gerada no relatório???

Att. Jonas

TheKill

tem que existir algum tipo de filtro, para o SQL ser executado.

" Select * from table where X = ? "

onde esta esse " ? " no seu programa que vc envia para o relatório?

Lags
public class formRelatorioProduto extends javax.swing.JFrame  
{  
    private String                             dir1 = "relatorioProduto";  
    private String                            dir2 = "relatorioProdutoTodos";  
    private String                            diretorio;  
    private CTR_ManterProduto        ctrProduto;  
    private CTR_ManterItemPedido   ctrItemPedido;  
    private HashMap                        parameters;  
    private Produto                         produtoAux ;  
    private List<Produto>               produtos;  
    private ArrayList<Produto>       vetorEstoque;  
    private  Produto                       produtoaux2;  
    private PedidoVO                     pedidoAux;  
    private int                               auxValorCombo = 0;  
    private Loja                            lojaAux;  
    private int                              auxValor = 0;  
    private GeraIreport                 auxRelatorio = new GeraIreport();  
    private String                         nomeRelatorio = "Relatorio de Produtos";  
    private GeraLog                     log = new GeraLog();  
    private String                         mensagemErro;  
    private String                           imagemCaminho = "toporelatorio";  
      
private void btnGerarActionPerformed(java.awt.event.ActionEvent evt) {                                           
    verificaBusca();  
    parametrosSubRelatorio();  
}                                          
  
private void formWindowActivated(java.awt.event.WindowEvent evt) {                                       
limparComboNomeProduto();  
populaComboNomeProduto();  
  
}                                      
  
public void populaComboNomeProduto()  
{  
    ctrProduto = new CTR_ManterProduto();  
    produtos = ctrProduto.listarProdutos("codigoProduto");  
    comboNomeProduto.addItem(" -- Selecione -- ");  
    comboNomeProduto.addItem("Todos");  
    for (Produto listaProdutos: produtos)  
    {  
       comboNomeProduto.addItem((Produto) listaProdutos);   
    }    
}  
  
public void limparComboNomeProduto()  
{  
    comboNomeProduto.removeAllItems();  
}  
  
  
private void verificaBusca()  
{  
    if (comboNomeProduto.getSelectedItem().equals(" -- Selecione -- "))  
    {  
       JOptionPane.showMessageDialog(this,"Selecione o Produto para visualizar o relatório!","Informação..",JOptionPane.INFORMATION_MESSAGE);  
       auxValor = 0;  
    }  
    if (comboNomeProduto.getSelectedItem().equals("Todos"))  
       
    {  
       auxValor = 1;  
    }else  
    {  
        auxValor = 2;  
    }      
}  
  
private boolean casosErro()  
{  
    if (((auxValor == 1) || (auxValor == 2)) && vetorEstoque.size() == 0)  
    {  
       JOptionPane.showMessageDialog(this,"Este Produto não consta em Estoque!","Informação",JOptionPane.INFORMATION_MESSAGE);    
       return true;  
    }    
      
//    if ((auxValor == 3) && (vetorEstoque.size() == 0))  
//    {  
//       JOptionPane.showMessageDialog(this,"Este Loja não tem Produtos em Estoque!","Informação",JOptionPane.INFORMATION_MESSAGE);  
//       return true;  
//    }  
//      
    return false;  
}          
  
  
  
private void  parametrosSubRelatorio()  
{  
   // busca um produto de cada vez   
   produtoAux = new Produto();    
   ctrProduto = new CTR_ManterProduto();  
   vetorEstoque = new ArrayList<Produto>();  
  
  
       if (auxValor == 2){  
  
  
       Produto produtoAux1 = (Produto) comboNomeProduto.getSelectedItem();  
       produtoaux2 = ctrProduto.carregarProdutoCodigoProduto(produtoAux1.getCodigoProduto());  
       vetorEstoque.add(produtoaux2);  
  
       if ((casosErro() == false) && (auxValor == 2))  
       {  
          diretorio = dir1;  
          mapeiaParametros();  
       try  
          {  
            auxRelatorio.geraRelatorio(nomeRelatorio, auxRelatorio.getReport(diretorio), parameters);  
          }  
          catch (Exception ex)  
          {  
            Logger logAux = Logger.getLogger(formRelatorioProduto.class);  
            mensagemErro = "Erro gerado pelo sistema: "+ex;  
            log.gerarLog(logAux, mensagemErro);  
          }  
       }  
       }  
}          
    
private void mapeiaParametros()   
{  
  try  
  {          
    parameters = new HashMap();  
    parameters.put("codigoProduto",produtoaux2.getCodigoProduto());  
    parameters.put("imagem", auxRelatorio.getImagem(imagemCaminho));  
  }  
  catch (Exception e)  
  {  
    Logger logAux = Logger.getLogger(formRelatorioProduto.class);  
    mensagemErro = "Erro gerado pelo sistema: "+e;  
    log.gerarLog(logAux, mensagemErro);    
  }          
}

minha classe gerar relatório:

public class GeraIreport
{
    
    private Connection          conexao = null;
    private static String       driver = "com.mysql.jdbc.Driver";
    private static String       endereco = "jdbc:mysql://localhost/karinhaestoque";
    private static String       usuario = "root";
    private static String       senha = "";
    private static ImageIcon    iconePrincipal = new ImageIcon("Icons/logo.jpg");
  
    public GeraIreport()
    {
        super();
        conexaoBanco(); 
    }        
    
    
   /** 
    * Funcao que realiza conexao com o banco, senha 123 e usuario root
    */
   public void conexaoBanco()
   {
       try 
       {
         if (getConexao() == null) 
         {
           Class.forName(driver);
                setConexao(DriverManager.getConnection(endereco, usuario, senha));
         }
       }   
       catch (Exception e) 
       {
          System.err.println("Problemas apresentados na operação de conexão");
          e.printStackTrace();
       }
       
    } 
   
   /**  Esta funcao apenas reconhece relatorios
     *  que estiverem na pasta relatorios do sistema    *  
     */
    public InputStream getReport(String nomeRelatorio) throws Exception 
    {
        try{
       String reportPath = "/br/com/karinhaEstoque/relatorios/" + nomeRelatorio + ".jasper";  
       InputStream stream = ReportUtils.class.getResourceAsStream(reportPath);

       if (stream == null)
       {  
          throw new Exception("Relatório não encontrado: " + reportPath);  
       }  
       
       return stream;
       }catch(Exception ex){
            ex.printStackTrace();
       } 
        return null;

    }
    
    
   /**  Esta funcao apenas reconhece imagens do tipo .jpg 
     *  portanto só pode ser passado como parametro para o 
     *  relatorio imagens .jpg 
     */   
    public Image getImagem(String nomeImagem) throws Exception
    {
       String imagemPath = "/br/com/karinhaEstoque/imagens/" + nomeImagem + ".jpg";  
       ImageIcon imagem = new ImageIcon(getClass().getResource(imagemPath)); 
       
       if (imagem == null)
       {  
          throw new Exception("Imagem não encontrada: " + imagemPath);  
       }  
       
       return imagem.getImage();  
    }   
    
    
    
    /**  Esta funcao foi criada com o intuito de gerar relatorios em pdf
     *   passando como parametros o titulo do relatorio, o diretorio do relatorio
     *   e os parametros desejados.
     */   
    public String geraRelatorio(String tituloRelatorio, InputStream diretorioRelatorio, 
                                Map parametros)
    {
        /* Inicio do bloco que ira gerar os relatorios */
        try 
        {
           // criando o relatorio    
           JasperReport jrpt = (JasperReport) JRLoader.loadObject(diretorioRelatorio);
           JasperPrint print;
           print = JasperFillManager.fillReport(jrpt, parametros ,getConexao());
           // mostrando o relatorio
           JasperViewer jrviewer = new JasperViewer(print,false);
           jrviewer.setIconImage(iconePrincipal.getImage());
           jrviewer.setTitle(tituloRelatorio);
           jrviewer.setVisible(true);
           return "sucesso";
        }    
        catch (Exception e) 
        {
          e.printStackTrace();
        }
        return "falhou";
     }

     
    
    public Connection getConexao() {
        return conexao;
    }

    public void setConexao(Connection conexao) {
        this.conexao = conexao;
    }
   
    
}

Eu fiz todo sql no ireport para pegar dados do banco e exibir no relatório.
Se eu não fui claro, pode-me dizer , estou aguardando só isso.

TheKill

print = JasperFillManager.fillReport(jrpt, parametros ,getConexao());

nao entendi, pelo que eu me lembro, esse 3 parametro é o SQL

TheKill

só tente entender este trecho de código:

...
...
rs = stmt.executeQuery();
			try {
				JRResultSetDataSource ds = new JRResultSetDataSource(rs);
				JasperPrint jp = JasperFillManager.fillReport(caminhoJasper, hm, ds);
				JasperViewer.viewReport(jp, false);
			} catch (JRException e) {
				e.printStackTrace();
			}

Att. Jonas

Lags

Thekill,

Esse trecho do código rs = stmt.executeQuery(); ele não é só para o slq? Se eu estiver errado pode-me corrigir, pois estou usando hibernate para listar código do produto num combo, depois passo para o parâmetro o código selecionado no combo.

TheKill

esse relatório é apenas para 1 codigo? tipo relatório de 1 folha?

Lags

Sim! Ele gera um produto específico que é selecionado no combo.

TheKill

Entendi,

Sim, o SQL seria os resultados da consulta SQL…
no seu caso muda um pouco porque nao ta fazendo consulta SQL…

De uma pesquisada no forum, estou meio ocupado, mas tem alguns tópicos sobre isso…
Boa sorte…

Att. Jonas

Lags

Vlw Thekill

Lags

E ai galera,

Alguém tem alguma opinião para este meu problema?

Att,
Lags

TheKill

no seu método geraRelatorio, de um system.out.println no objeto do parametro

e verifique se o resultado esta correto, volte ao relatório e verifique a forma com que faz a consulta no relatório.
verifique se colocou o $P{NOME-PARAMETRO} no lugar certo, PS.: nao sei como hibernate funciona.

em sql seria o exemplo: where nome = $P{NOME-PARAMETRO}

Att. Jonas

Lags

Usei sql no ireport para pegar dados, em java só passei parâmetro.

Este é meu sql:

select p.nome,p.cor,p.sexo,p.tamanho,l.nome as nomeLoja,
p.codigoProduto as codigo, f.nome as Fornecedor, p.valorCusto,
p.quantidade As QtdProduto
from produto p, fornecedor f,loja l
where p.codigo_for = f.codigo and p.codigoloja = l.codigo and
p.codigoProduto =$P{codigoProduto}
order by p.codigoProduto

TheKill

certo, e cade o resultado dos parametros??

Lags

Eu fiz System.out.Println gerou essas informações:

1dadogerado:

2gerado:

net.sf.jasperreports.view.JasperViewer [frame0,12,4,1000x733,layout=java.awt.BorderLayout,title=Relatorio de Produtos,resizable,normal, defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,4,30,992x699,layout=javax.swing.JRootPane$RootLayout, alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=], rootPaneCheckingEnabled=true]

3grado:

Lags

Código do parâmetro:

private void mapeiaParametros() 
{
  try
  {        
    parameters = new HashMap();
    parameters.put("codigoProduto",produtoaux2.getCodigoProduto());
    parameters.put("imagem", auxRelatorio.getImagem(imagemCaminho));
  }
  catch (Exception e)
  {
    Logger logAux = Logger.getLogger(formRelatorioProduto.class);
    mensagemErro = "Erro gerado pelo sistema: "+e;
    log.gerarLog(logAux, mensagemErro);  
  }        
}
Este é método que pega o código selecionado no combo e passa para o parâmetro:
private void  parametrosSubRelatorio()
{
   // busca um produto de cada vez 
   produtoAux = new Produto();  
   ctrProduto = new CTR_ManterProduto();
   vetorEstoque = new ArrayList<Produto>();
   // 1 opcao busca por todos os nomes
   if (auxValor == 1)
   {
//       List<Produto> produtos = ctrProduto.listarProdutos("codigoPorduto");
//       for (Produto listaprodutos : produtos)
//       {
//         vetorEstoque.add(listaprodutos);
//       }

      if(auxValor == 1)
      {
         diretorio = dir2;
         //mapeiaParametros();
         try
         {
            auxRelatorio.geraRelatorio(nomeRelatorio, auxRelatorio.getReport(diretorio), parameters);
         }
         catch (Exception ex)
         {
            Logger logAux = Logger.getLogger(formRelatorioProduto.class);
            mensagemErro = "Erro gerado pelo sistema: "+ex;
            log.gerarLog(logAux, mensagemErro);
         }
      }
   }
       if (auxValor == 2){


       Produto produtoAux1 = (Produto) comboNomeProduto.getSelectedItem();
       produtoaux2 = ctrProduto.carregarProdutoCodigoProduto(produtoAux1.getCodigoProduto());
       vetorEstoque.add(produtoaux2);

       if ((casosErro() == false) && (auxValor == 2))
       {
          diretorio = dir1;
          mapeiaParametros();
       try
          {
            auxRelatorio.geraRelatorio(nomeRelatorio, auxRelatorio.getReport(diretorio), parameters);
          }
          catch (Exception ex)
          {
            Logger logAux = Logger.getLogger(formRelatorioProduto.class);
            mensagemErro = "Erro gerado pelo sistema: "+ex;
            log.gerarLog(logAux, mensagemErro);
          }
       }
       }
}
TheKill

certo… me enganei no pedido de sysout…

faça o system.out.print do seu ( produtoaux2.getCodigoProduto() )

Beleza? Quero ver se esta vindo codigo certo

Lags

Eu fiz System de novo como pediu no produtoaux2.getCodigoProduto() apareceu isso:

codigoProduto selecionado no combo é:3

TheKill

Beleza, correto…

o codigo do produto é 3 ?

Se for 3 o codigo esta correto… Deve fazer o seguinte.
No iReport tem um botão chamado Preview, … coloque o codigo 3 e verifique se obtem retorno do relatório.

Se POSITIVO é problema no envio do codigo para o relatório
Se NEGATIVO é problema no relatório :wink:

Att. Jonas

Lags

Passei esse código 3 no Ireport ele gerou relatório perfeito.
Ele consegui exibir a imagem que eu passei no parâmetro quando chamo ele na classe java, porque não o código do parâmetro para retornar o Sql?

TheKill

Certo, vejamos.

O seu parametro no relatório é de qual tipo? Integer, BigDecimal, Long??

E o seu Objeto que está passando na aplicação é oque? Long, Int, BigDecimal ???

Devem ser iguais :wink:

Att. Jonas

Lags

Tire uma dúvida para mim, no parâmetro do ireport eu selecionei o prompting e no valor da expressão deixo vazio?

TheKill

Parameter Class: O Tipo do seu objeto no Java ; ( o mesmo tipo da sua aplicação )

Use as prompt : True

o resto pode ficar vazio

Lags

Vlw Jonas, mas não resolveu.

TheKill

posta seu relatório, deixe me ver

Lags

Fala Thekill,

Tive problema em enviar arquivo na comunidade, por isso enviei para o seu email.

TheKill

Sem problema, mas nao recebi nada aqui.

Meu email é [email removido]

Lags

Enviei para o hotmail.com

TheKill

certo, mas vc ta fazendo a consulta dentro do relatorio?

ou na aplicação?

Lags

Dentro do relatório.

TheKill

Entendi, bom… eu já li em alguns lugares, que não da certo
colocar $P (parameter) dentro do relatorio para consultas SQL sacou??

Eu achei que vc estava fazendo a consulta na aplicação … e enviando para o relatorio o Rs (result set) com as informações
para popular o relatório…

Acho que dessa forma que está querendo fazer nao seja possível… Ou pelo menos eu não sei como fazer…
Na minha opinião eu nunca deixo para o relatorio fazer a consulta SQL, sempre deixo na aplicação, até por questao de segurança ^^

Att. Jonas

Lags

Eu fiz nos outros relatório funcionou, só não se porque não está funcionando com este, verifiquei tudo não achei solução ainda.

TheKill

Certo, eu sei oque é.

No JAVA voce esta passando parameter Int, e no relatorio esta esperando Integer.
nao sao a mesma coisa. então no relatório mude para String, e no Java ao invés de mandar Int, faça um Convert para String.

String.valueOf( … )
Ps.: Ja testei aqui e funcionou

Att. Jonas

Lags

Mudei no relatório o parâmetro codigoProduto para String.
O parâmetro que eu estou passando em java ficou assim:parameters.put("codigoProduto",(String.valueOf(valorSelecionadoCombo)));
só que continuo com a mesma coisa, traz relatório estático. Se eu tiver errado pode-me dizer.

TheKill

Certo, retire aquela opcao do relatorio… deixe me lembrar o nome…

Use as prompt…
Olha eu executei aqui e funcionou… tipo eu usei como int lah no relatório tratando a informação
da seguinte forma. lah eu dava um New Integer ( do valor que receber ) sacou??

Talvez ele de problema no seu SQL enviando String… por isso nao veio resultado…
Tente fazer uma conversão dentro do relatório através desta dica que te forneci…

New Integer ( $P{codigoProduto} ) acredito que deva funcionar.

Att. Jonas

Lags

TheKill:
Certo, retire aquela opcao do relatorio… deixe me lembrar o nome…

Use as prompt…
Olha eu executei aqui e funcionou… tipo eu usei como int lah no relatório tratando a informação
da seguinte forma. lah eu dava um New Integer ( do valor que receber ) sacou??

Talvez ele de problema no seu SQL enviando String… por isso nao veio resultado…
Tente fazer uma conversão dentro do relatório através desta dica que te forneci…

New Integer ( $P{codigoProduto} ) acredito que deva funcionar.

Att. Jonas


Boa dia Thekill,

Esse New Integer( $P{codigoProduto} ) é para colocar na valor de expressão do parâmetro?
No relatório posso continuar com int, estou certo?

TheKill

Isso mesmo… mantenha Integer no relatório…

é faça uns testes… eu nao tenho certeza onde exatamente deve ser colocado…
mas tenho certeza de que você precisa tratar esta conversão Int/Integer… sacou??

o relatório ta esperando algo Integer ele recebe Int e continua Null para ele… :wink:
tente no value expression, faça alguns testes e poste os resultados…

Att. Jonas

Lags

Deu erro no ireport usando no valor da expressão new Integer($p{codigoProduto})

Segue o erro:net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. The constructor Integer(Integer) is undefined value = (java.lang.Integer)(new Integer(((java.lang.Integer)parameter_codigoProduto.getValue()))); <--------------------------------------------------------------------> 2. The constructor Integer(Integer) is undefined value = (java.lang.Integer)(new Integer(((java.lang.Integer)parameter_codigoProduto.getValue()))); <--------------------------------------------------------------------> 3. The constructor Integer(Integer) is undefined value = (java.lang.Integer)(new Integer(((java.lang.Integer)parameter_codigoProduto.getValue()))); <--------------------------------------------------------------------> 3 errors

Criado 10 de março de 2010
Ultima resposta 16 de mar. de 2010
Respostas 44
Participantes 3