Dúvida iReport

21 respostas
R

Olá pessoal!

É o seguinte… tenho um subrelatório onde passo como parâmetro uma lista, e para cada registro da lista é gerada uma página com os dados! O que está acontecendo é que quando esta lista está vazia ou nula é exibida uma página em branco!

Como resolvo isso?

Já tentei colocar no campo “Print When Expression” a seguinte expressão: new Boolean($F{produtores} != null), mais não funcionou!

Como verifico o tamanho da lista neste campo?

Obrigado.

21 Respostas

R

up

R

Qual o tipo de dados do seu field $F{produtores} ?

R

Oi Renata…

O campo $F{produtores} é do tipo java.lang.Object.

R

Certo, e vc passa que conteúdo pra ele? Que tipo de dados vc joga dentro desse Object ?

R

Dentro desse Object eu jogo beans do tipo Produtor, que têm como atributos: nome, idade, endereço, escolaridade… coisas do tipo!

R

Na primeira mensagem, deu a enteder que $F{produtores} se tratava de uma lista, não sei ao certo como é seu beans, mas verifique se quando a sua lista de produtores está vazia ela está realmente como null. Pq eu acho que a condição que vc colocou no “Print when expression” não está funcionando pq sua lista nunca está null, acho que ela está vazia (sem itens) mas não null. Então veja como vc pode verificar que a lista não tem nenhum item, e faça a verificação considerando isso.

R

Então Renata… essa é minha grande intriga!!! Porque a lista “está” nula quando o relatório busca o campo! Não consigo entender o porque não funciona.

R

Será que está msm?

Cola aqui o trecho do código onde vc passa ela como parâmetro pro relatório.

R

RenataFA:
Será que está msm?

Cola aqui o trecho do código onde vc passa ela como parâmetro pro relatório.

Abaixo o método getProdutores:

public List<Produtor> getProdutores() {
        if (participantes != null && !participantes.isEmpty()) {
            Projeto projeto = new Projeto();
            projeto.setId(this.id);
            projeto.setNumeroDoProjeto(this.numeroDoProjeto);
            projeto.setAcaoAtividadeDaRelacaoDeIntencao(this.acaoAtividadeDaRelacaoDeIntencao);
            projeto.setPeriodosDeRealizacao(this.periodosDeRealizacao);
            projeto.setDataPrevistaTemp(this.getDataPrevistaTemp());
            projeto.setDataPrevistaFinalTemp(this.getDataPrevistaFinalTemp());

            produtores = new ArrayList<Produtor>();
            
            for (Participante participante : participantes) {
                if (participante instanceof Produtor) {
                    participante.setProjeto(projeto);
                    produtores.add((Produtor) participante);
                }
            }
            
            if(produtores.isEmpty())
                produtores = null;
        }
        return produtores;
    }

é método que o relatório chama para buscar a lista de produtores!

R

Muda seu método só um pouquinho e testa pra gente ver. Faz assim:

public List<Produtor> getProdutores() {
        produtores = null; // ESSA É A LINHA QUE EU ADICIONEI
        if (participantes != null && !participantes.isEmpty()) {
            Projeto projeto = new Projeto();
            projeto.setId(this.id);
            projeto.setNumeroDoProjeto(this.numeroDoProjeto);
            projeto.setAcaoAtividadeDaRelacaoDeIntencao(this.acaoAtividadeDaRelacaoDeIntencao);
            projeto.setPeriodosDeRealizacao(this.periodosDeRealizacao);
            projeto.setDataPrevistaTemp(this.getDataPrevistaTemp());
            projeto.setDataPrevistaFinalTemp(this.getDataPrevistaFinalTemp());

            produtores = new ArrayList<Produtor>();
            
            for (Participante participante : participantes) {
                if (participante instanceof Produtor) {
                    participante.setProjeto(projeto);
                    produtores.add((Produtor) participante);
                }
            }
            
            if(produtores.isEmpty())
                produtores = null;
        }
        // coloca aqui um "sysout" pra gente ver oque tá retornando, assim:
        System.out.println(produtores); // é pra imprimir "null" no seu console
        return produtores;
    }
R
RenataFA:
Muda seu método só um pouquinho e testa pra gente ver. Faz assim:
public List<Produtor> getProdutores() {
        produtores = null; // ESSA É A LINHA QUE EU ADICIONEI
        if (participantes != null && !participantes.isEmpty()) {
            Projeto projeto = new Projeto();
            projeto.setId(this.id);
            projeto.setNumeroDoProjeto(this.numeroDoProjeto);
            projeto.setAcaoAtividadeDaRelacaoDeIntencao(this.acaoAtividadeDaRelacaoDeIntencao);
            projeto.setPeriodosDeRealizacao(this.periodosDeRealizacao);
            projeto.setDataPrevistaTemp(this.getDataPrevistaTemp());
            projeto.setDataPrevistaFinalTemp(this.getDataPrevistaFinalTemp());

            produtores = new ArrayList<Produtor>();
            
            for (Participante participante : participantes) {
                if (participante instanceof Produtor) {
                    participante.setProjeto(projeto);
                    produtores.add((Produtor) participante);
                }
            }
            
            if(produtores.isEmpty())
                produtores = null;
        }
        // coloca aqui um "sysout" pra gente ver oque tá retornando, assim:
        System.out.println(produtores); // é pra imprimir "null" no seu console
        return produtores;
    }

Ok! Mais já vou te adiantar que não vai fazer diferença... o atributo produtores ja está declarado com o valor inicial null!

R
RenataFA:
Muda seu método só um pouquinho e testa pra gente ver. Faz assim:
public List<Produtor> getProdutores() {
        produtores = null; // ESSA É A LINHA QUE EU ADICIONEI
        if (participantes != null && !participantes.isEmpty()) {
            Projeto projeto = new Projeto();
            projeto.setId(this.id);
            projeto.setNumeroDoProjeto(this.numeroDoProjeto);
            projeto.setAcaoAtividadeDaRelacaoDeIntencao(this.acaoAtividadeDaRelacaoDeIntencao);
            projeto.setPeriodosDeRealizacao(this.periodosDeRealizacao);
            projeto.setDataPrevistaTemp(this.getDataPrevistaTemp());
            projeto.setDataPrevistaFinalTemp(this.getDataPrevistaFinalTemp());

            produtores = new ArrayList<Produtor>();
            
            for (Participante participante : participantes) {
                if (participante instanceof Produtor) {
                    participante.setProjeto(projeto);
                    produtores.add((Produtor) participante);
                }
            }
            
            if(produtores.isEmpty())
                produtores = null;
        }
        // coloca aqui um "sysout" pra gente ver oque tá retornando, assim:
        System.out.println(produtores); // é pra imprimir "null" no seu console
        return produtores;
    }

Não creio que o erro esteja no código java, mais sim no relatório. A lista está como null e ainda exibe uma página em branco...

R

Entendi.
Poderia colar o jrxml então?

R

RenataFA:
Entendi.
Poderia colar o jrxml então?

Ta na mão… o relatório e o sub relatório!

R

up

R

Cara,

experimenta colocar uma expressão no print when expression do teu sub-relatório.

Aí quando teu campo for nulo, ele não chegará nem a carregar o teu sub-relatório…

Abraço…

R

rafadeaguiar:
Cara,

experimenta colocar uma expressão no print when expression do teu sub-relatório.

Aí quando teu campo for nulo, ele não chegará nem a carregar o teu sub-relatório…

Abraço…

foi oq eu fiz e não deu certo!!!

coloquei a expressão: new Boolean($F{produtores} != null)

seria isso neh?

F

Eu penso em duas opções:
1 - Dentre as propriedades de um relatório, há uma que diz para não exibir páginas quando não contiver dados. Marque essa propriedade no subrelatório;

2 - Caso a opção 1 não funcione, tente colocar seu subrelatório com uma largura mínima, colocando a propriedade “Position type” como “float” e marcando a propriedade “stretch with overflow”. Visualmente falando, o subrelatório vai ficar como se fosse uma reta na horizontal.

R

Olá amigo!

Desculpe pela demora pra responder, eu peguei seus JRXMLs aqui e dei uma olhada.
Tentei criar o msm ambiente aqui, fiz uma classe pra testar, etc...

Cheguei a conclusão de que não tem como vc estar passando a lista de produtores como null, simplesmente pq a chamada do relatório não permite isso!

Posta pra gente como vc faz na hora de chamar o relatório, por ex, eu tentei fazer assim pra testar oque vc disse, dá uma olhada:

try {
			JasperReport jasperReport = (JasperReport)JRLoader.loadObject("D:\\Eclipse\\Renata\\guj\\FichaDeInscricao.jasper");
			JasperPrint  jasperPrint  = JasperFillManager.fillReport(jasperReport, new HashMap<Object, Object>(), null);
			
			JasperViewer jasperViewer = new JasperViewer(jasperPrint,false);
			jasperViewer.setVisible(true);
			
		} catch (JRException e) {
			e.printStackTrace();
		}

Mas desta forma, o Java não aceita, o que indica que não é possível que sua lista esteja indo como null. Ela deve estar indo como vazia, mas não null.
Posta pra gente como vc fez esse trecho que eu coloquei acima, a parte que vc chama o Jasper.

Grata,
Renata

R

fabiocsilva:
Eu penso em duas opções:
1 - Dentre as propriedades de um relatório, há uma que diz para não exibir páginas quando não contiver dados. Marque essa propriedade no subrelatório;

2 - Caso a opção 1 não funcione, tente colocar seu subrelatório com uma largura mínima, colocando a propriedade “Position type” como “float” e marcando a propriedade “stretch with overflow”. Visualmente falando, o subrelatório vai ficar como se fosse uma reta na horizontal.

Ok, mais não encontrei a propriedade “stretch with overflow”, encontrei somente as propriedades: “stretch type: no stretch, relative to band heigth, relative to tallest object”. Estou usando a versão do iReport 3.7.3.

Obs.: a primeira opção não funcionou!

R

rodrigo.fai:
fabiocsilva:
Eu penso em duas opções:
1 - Dentre as propriedades de um relatório, há uma que diz para não exibir páginas quando não contiver dados. Marque essa propriedade no subrelatório;

2 - Caso a opção 1 não funcione, tente colocar seu subrelatório com uma largura mínima, colocando a propriedade “Position type” como “float” e marcando a propriedade “stretch with overflow”. Visualmente falando, o subrelatório vai ficar como se fosse uma reta na horizontal.

Ok, mais não encontrei a propriedade “stretch with overflow”, encontrei somente as propriedades: “stretch type: no stretch, relative to band heigth, relative to tallest object”.

Obs.: a primeira opção não funcionou!

Não encontrou a propriedade pq no jasper mais recente ela não exite, mudou pra isso ai que vc falou msm. Tente então “relative to tallest object”.

Criado 24 de junho de 2010
Ultima resposta 21 de jul. de 2010
Respostas 21
Participantes 4