Sub-relatório Ireport Urgente

14 respostas
A

Gente, estou a quase uma semana tentando resolver isso e não estou conseguindo.

Tenho um relatório de Clientes e como sub-relatório os serviços feitos por ele.
Quando eu rodo pelo ireport, funciona perfeitamente, mas quando rodo pelo programa que criei os sub-relatórios não aparecem.

Meu código pra preencher o relatório é:
try
  {
      conexao.conectarBD();
      conexao.executarSQL("SELECT * from cliente");

      JRResultSetDataSource jrRS = new JRResultSetDataSource(conexao.resultset);
      String relatorio ="./src/relatorio/Clientes.jasper";

      Map<String, Object> params = new     HashMap<String, Object>();
                params.put("Cliente_subRel.jasper","C:/Usuários/Ana/Documentos/ProjetoAline/rosalierSystem/src/relatorio");

      JasperPrint jp = JasperFillManager.fillReport(relatorio, params, jrRS);

      JasperViewer.viewReport(jp, false);

  } catch (JRException e) {
            e.printStackTrace();
   }

Já revisei o código várias vezes mas não faço idéia de onde está meu erro.

Grata desde já!

14 Respostas

A

Olá acbucard,

Já tive alguns problemas com sub-relatórios.

Verifica essas duas propriedades:

Subreport Expression: $P{SUBREPORT_DIR} + “ResumoCooperado_Pendencias.jasper”

Connection Type: Ai vai depender se você irá usar a mesma conexão do relatório PAI ou não.

Qualquer coisa tu cria um relatório simples com apenas texto e adiciona o sub-relatório também com somente texto.

Att. Agostinho Neto

F

Estou com o mesmo problema.

agostinhooliv,

O meu relatório pai está passando a conexão para os filhos, com o REPORT_CONNECTION, conexão JDBC.
E minha expressão de SUBREPORT_DIR é:

getClass().getResource( $P{SUBREPORT_DIR} + "SubRelatório.jasper" )

Pode nos ajudar?

Obg! ^^

A

franzzita, estou no mesmo ponto que você.

Já pesquisei em vários lugares e não encontro a solução! :cry:

F

Já tento isso?

http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/

To acompanhando aqui… mas ta disparando Exception, dizendo que não acha o relatório.

¬¬

A

Tentei sim franzzita, na verdade eu criei meu relatório e sub-relatório me baseando nesse site, nas partes 2 e 3 de relatórios.
O meu nem rola exception, mas também não aparece nada do sub, só o principal mesmo.

F

acbucard:
Tentei sim franzzita, na verdade eu criei meu relatório e sub-relatório me baseando nesse site, nas partes 2 e 3 de relatórios.
O meu nem rola exception, mas também não aparece nada do sub, só o principal mesmo.

Agora o meu ta igual o seu. Só o principal… minha classe não retorna nem a Band No Data com a mensagem de erro.

Ta fodá.

A

No ireport o sub-relatório aparece? Se sim pode ser algum pro no teu código java, posta ai teu relatório e teu código java.

Vocês tentaram fazer um relatório com um sub-relatório sem acesso ao banco(somente com um label)?

Vou fazer um como exemplo e posto amanhã pra vocês.

Att. Agostinho Neto

F
agostinhooliv:
No ireport o sub-relatório aparece? Se sim pode ser algum pro no teu código java, posta ai teu relatório e teu código java.

Vocês tentaram fazer um relatório com um sub-relatório sem acesso ao banco(somente com um label)?

Vou fazer um como exemplo e posto amanhã pra vocês.

Att. Agostinho Neto

Muito obrigado pela disposição Agostinho...

O que rola comigo eu acho que é erro de código.
Fiz o que você falou, no iReports aparece, e quando minha classe chamou o relatório não retornou nenhum textfield do subrelatório, somente o relatório mestre com seus dados.

Seguinte, eu to usando query, não sei se as sub-querys estão realmente sendo alimentadas pela minha conexão, creio eu que era para serem pois escolhi na montagem do subrelatório a opção de usar a mesma conexão.

Minha classe Java é essa:

package Relatórios;

import Conexao.ConexaoServicos;
import java.util.HashMap;
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.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

public class relResultados{
    
    public relResultados(Integer contrato)
    {
        ConexaoServicos con = new ConexaoServicos();
        JRResultSetDataSource jrRS;

        try
        {             
                con.conecta();
                con.executeSQL("minha query WHERE id_Contrato = '"+contrato+"' "); //aqui eu estou passando a query para o relatório mestre
                jrRS = new JRResultSetDataSource(con.resultset);

                HashMap<String, Object> parametros = new HashMap<String, Object>();  
                
                parametros.put("SUBREPORT_DIR", "C:/Meu_Projeto/relatorio/");
                parametros.put("Contrato", contrato);

                JasperReport jasperReport = JasperCompileManager.compileReport("C:/Meu_Projeto/relatorio/relResultados_Mestre.jrxml");
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, jrRS); 

                JasperViewer.viewReport(jasperPrint, false);  
         }  
        catch (JRException ex)  
        {  
                ex.printStackTrace();
        }  
    }
}

Obrigada.
Fico aguardando...
^^

A

Olá franzzita,

Segue em anexo um projeto(NetBeans) com um relatório com sub-relatório.

Vi que você usa sua consulta no seu código java, eu utilizo as consultas no próprio relatório, só passo os parâmetros para o relatório.

Modifica para tua realidade a classe Conexao e a classe que contém o caminho para o arquivo .jasper.

Vê se você consegue rodar esse projeto.

Qualquer coisa…

Att. Agostinho Neto

F

Agostinho!

Muito obrigada pelo exemplo, adaptei ele as minhas necessidades, porém ainda está aparecendo uma exception…

Exception in thread main java.lang.NullPointerException

at java.lang.Class.isAssignableFrom(Native Method)

at net.sf.jasperreports.engine.fill.JRFillTextField.getFormat(JRFillTextField.java:706)

at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:394)

at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java:368)

at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:258)

at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:499)

at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillBandNoOverflow(JRVerticalFiller.java:439)

at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillPageHeader(JRVerticalFiller.java:403)

at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:264)

at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)

at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)

at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845)

at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)

at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)

at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)

at RelatorioExemplo2.Ireport.main(Ireport.java:37)

Java Result: 1

=/
Sabe o que pode ser??

A

Acredito que pode ser falta das bibliotecas ou então bibliotecas com versões diferentes das que eu compilei aqui na minha máquina.

  • Verifica se os todas bibliotecas abaixo estão no classpath.
    • commons-beanutils-1.8.2.jar
    • commons-collections-3.2.1.jar
    • commons-digester-1.8.jar
    • commons-javaflow-20060411.jar
    • commons-lang-2.4.jar
    • commons-logging-1.1.1.jar
    • iText-2.1.7.jar
    • jasperreports-3.7.5.jar
    • poi-3.6-20091214.jar
    • jtds-1.2.5.jar

No meu caso estou acessando o banco de dados de exemplo do SQL Server (Northwind).

Acho que você já sabe, mas você poderia testar primeiro a classe Conexao para ver se ela está ok.

Tu usa qual IDE? Se for netbeans me manda esse projeto que você adptou a sua realidade que eu vejo o que pode estar errado.

Qualquer coisa…

Att. Agostinho Neto

F

URULLL depois de 4 dias consegui!! \o/

Te agradeço muito, modifiquei algumas coisas na classe que você me passou e funcionou redondo…

Meu relatório mestre chamando 2 sub-relatórios, perfeito!

Muitoooooooooo obrigado mesmo!

Depois me passa seu E-mail ou Skype pra contato!!

Agora só to com um probleminha, preciso pegar os totais que esses dois sub-relatórios retornam e fazer uma subtração para exibir no relatório mestre.
Mas os campos me retornam NULL.

Sabe porque isso acontece?

To fazendo assim a conta: new Double($V{TotalSub1}.subtract($V{TotalSub2}))

TotalSub1 e TotalSub2 são do tipo Double.

A

Tu ta rodando direto no ireport?

Já tentou colocar essas variáveis separadas para ver se os valores não estão nulos?

Quando tu roda o sub-relatório separado ele traz esse total?

Segue em anexo uma imagem que mostra como configurar uma variável, vê se você está fazendo parecido, mas no seu caso acho seria sum na propriedade Calculation.
Qualquer coisa…

Att. Agostinho Neto


F

Bom dia Agostinho,

Então, dentro dos subrelatórios as contas estão acontecendo perfeitamente e os valores retornam para o relatório mestre perfeitamente também!
Mas eu não consigo fazer a conta com os totais, em uma terceira variavel, quando eles retornam, o valor é é null para o resultado da conta final.

Estou usando Double para todas as variáveis, pois os valores normalmente são grandes, será que é o tipo que está errado?

Abaixo o print das minhas variaveis, acompanhe a sequência de configuração.

Regards;





Criado 6 de fevereiro de 2012
Ultima resposta 10 de fev. de 2012
Respostas 14
Participantes 3