JasperReport imprimindo Coleção

17 respostas
N

Pessoal alguém poderia me ajudar com o seguinte cenario…

Estou passando um JavaBean ao jasperReport… mas dentro desse JavaBean eu tenho um atributo que é uma coleção…

Com isso ele gera a exceção dizendo que não achou aquele java.lang.NoSuchMethodException: Unknown property ‘MyCollection’

Tipo minha intenção era mostrar os valores dessa coleção em uma unica coluna.

Alguém já enfrentou esse problema…

Desde já agradeço a ajuda…

17 Respostas

N

Estou pesquisando na Web e não achei nada do assunto… alguém poderia me dizer se isso é possivel

F

vc cria um sub-relatório com um parâmetro java.lang.Object…

ai vc adiciona esse sub-relatório no seu relatório principal…

obs.: o nome da sua coleção desse ser com o mesmo nome da propriedade java onde contém suas informações.

N

Não entendi direito… vc quer dizer que para cada coleção que eu tenho como atributo no meu JavaBean… eu devo criar um subRelatorio???

Valeu pela ajuda…

F

nunca precisei trabalhar com várias coleções no mesmo relatório…

mas acho q sim.

N

Então fica ruim…

Tem como eu passar um ArrayList como parametro pro meu relatório??

Se tem como eu faço isso… pq estou tentando assim:

ArrayList list = new ArrayList();

list.add(bla bla bla);

.

.

.

depois passar no atributo param do relatorio

param.put(“myCollection”,list);

Mas ele da erro de incompatibilidade

F

tem sim…

JRBeanCollectionDataSource BCD = new JRBeanCollectionDataSource(minhaColecao);		

Hashtable ht = new Hashtable();

ht.put(“colecaoDeclaradaComoParametroNoRelatorio”, BCD);

obs.: essa “colecaoDeclaradaComoParametroNoRelatorio” de ser do tipo java.lang.Object

F

observe que se sua coleção for de Pessoa por exemplo:::

Pessoa p = new Pessoa();

p.setNome(“nome”);

p.setIdade(13);

p.setEndereco(“rua”);

.

.

.

LinkedList lista = new LinkedList();

lista.add§;

No seu sub-relatório vc tem q ter parametro com o mesmo nome/tipo dos atributos de Pessoa.
por exemplo:
lá no ireport vc tem q ter parâmetro nome do tipo String, idade do tipo Integer, endereco do tipo String…

aí no seu relatório vc chama o sub-relatório…

E

Acho q vc vai ter q fazer algo do tipo assim:

  1. criar um arrayList do tipo da classe.
    List listRelatorio = new ArrayList();

  2. depois vc vai add o seu objeto do qual vc usou para setar os beans
    listRelatorio.add(rel);

  3. Caso seja util use essa coleção para que vc possa fazer uma especie de ORDER BY(NO SQL). Caso Apenas vc esteja utilizando group.
    
    class RelatorioComparator implements Comparator{
    
    /* (non-Javadoc)
    
    * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
    
    */
    
    public int compare(Relatorio arg0, Relatorio arg1) {
    
    if(arg0.getSeuBean().equals(arg1.getSeuBean()))
    
    return arg0.getSeuOutroBeanEliminarRepetir().compareTo(arg1.SeuOutroBeanEliminarRepetir());
    
    return arg0.getSeuBean().compareTo(arg1.getSeuBean());		
    
    }
    
    }
    
  4. Passa os parametros q vc tem q passar, ou seja, uma data ou imagem, sei lah.
    
    Collections.sort(listRelatorio, new RelatorioComparator());
    
    Map<String, Object> parametros = new HashMap<String, Object>();		
    
    parametros.put(“dataInicio”,dataInicio);
    
    parametros.put(“dataFim”,dataFim);
    
  5. Ai vc cria seu objeto do tipo JRBeanCollectionDataSource e passa como parametro seu arrayList.
    JRDataSource jrds = new JRBeanCollectionDataSource(listRelatorio);

6.Impressao
JasperPrint print = JasperFillManager.fillReport(pathRel, parametros, jrds);

Espero ter ajudado At+!

N

Ok… entendi… mas meu problema é maior… pq eu já uso um dataSource… é nele que tenho minha coleção dentro… e não consigo acessar tipo objetoJavaBean.myCollection.name no relatorio…

Isso é que é pior…

E

mas na onde vc criou o datasource no iReport ou vc ta usando classe java para tal funçao?

N

Classe Java…

Tipo nessa coleção que eu passo para o JRBeanCollectionDataSource, dentro dela eu tenho uma Collection… e não sei como pegar as informações dessa coleção…

Muito Obrigado pelo ajuda…

E

Vc estah usando mapeamento de classes, se estiver, faça uma classe setar os beans, qdo vc setar todos os benas possiveis num laço, vc adiciona o seu arraylist no seu datasource assim vc ira conseguir acessar os beans setados no jasper.

Qualquer duvida eu posto um exemplo de como fazer.

At!

N

Vc poderia passar esse exemplo?

E

Cara foi mal pela demora. Segue abaixo um exemplo de relatorios jasper usando coleção espero q ajude dessa vez..

package relatorios;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;

//use os imports necessarios do jasper

import pmcg.imti.webtribus.view.Parcela;


@SuppressWarnings("unchecked")
public class relTesteReport extends HttpServlet {	
	private String parcela;
	private String lanc;
	
	private List<Parcela> listaParcela;
	
	public relTesteReport(){
		super();
	}
	@SuppressWarnings("unused")
	public void imprimir(ActionEvent event){
		/*nesse caso estou usando framework jsf para interfaces*/
		FacesContext facesContext = javax.faces.context.FacesContext.getCurrentInstance();
		ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
		String pathRel = servletContext.getRealPath("webservice\birt\relParc.jasper");		
		HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
		
		Map map = null;

		List<relTesteReport> listBirt = new ArrayList<relTesteReport>();		
		try {
			//outra observacao eh q para eu acessar minha interface eu uso um determinado metodo 
			//instanciado, nesse caso vc usa o seu metodo que faz conexao com a inteface e passa 
			// os parametros necessarios			
			listaParcela  = ServiceFactory.getParcelaService().buscaPorDataUsrFormaRec(dataInicio, dataFim, parcelas);
			for(int i = 0; i < listaParcela.size();i++){
				relTesteReport relTeste = new relTesteReport();
				relTeste.setParcela(listaParcela.get(i).getParcela());
				relTeste.setLanc(listaParcela.get(i).getIdlanc());
				listBirt.add(relTeste);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	Map<String, Object> parametros = new HashMap<String, Object>();		
	parametros.put("dataInicio",dataInicio);
	parametros.put("dataFim",dataFim);
	parametros.put("parcelas",parcelas);
	
	JRDataSource jrds = new JRBeanCollectionDataSource(listFechamentoCaixa);
		
		try
		{
			if(listaParcela  !=null && listaParcela.size()>0){			
				
				JasperPrint print = JasperFillManager.fillReport(pathRel, parametros, jrds);
				byte[] bytes = JasperExportManager.exportReportToPdf(print);
				//writeBytesAsAttachedTextFile eh uma classe q eu desenvolvi para imprimir os bytes no momento
				//download junto a nome do arquivo com extensao PDF
				writeBytesAsAttachedTextFile(bytes, "RelatorioFechamentoCaixa.pdf");				
			}else{
				Format f = new SimpleDateFormat("dd/MM/yyyy");
				
				throw new Exception("Não existe parcelas no intervalo de "  + f.format(dataInicio) + " a " + f.format(dataFim));
			}
		}
		catch (Exception e)
		{		
			e.printStackTrace();
		}
	
	public void limpaCampos(ActionEvent event) {
		try 
		{
			dataInicio = null;
			dataFim = null;
			filtroUsuario="";
			filtroFormaRecebimento="";
		}
				
		catch (Exception e)
		{				
			e.printStackTrace();
		}	
	
	}
	
	public String getParcela() {
		return parcela;
	}
	public void setParcela(String parcela) {
		this.parcela = parcela;
	}
	public String getLanc() {
		return lanc;
	}
	public void setLanc(String lanc) {
		this.lanc = lanc;
	}
	public List<Parcela> getListaParcela() {
		return listaParcela;
	}
	public void setListaParcela(List<Parcela> listaParcela) {
		this.listaParcela = listaParcela;
	}
	
}
feltraco

Cara esse artigo tem exatamente o que vc precisa…

http://blog.apollo-ti.com/?p=8

espero ter ajudado… qq coisa to no blog e aki tb…

FLwS

jomello_br

Parabens Barros, pela sua resposta/ajuda.

Pela primeira vez vi alguem mandar “HIPER BEM” na ajuda ao um colega e de tabela ajudou muita gente com certezaaaa :slight_smile:

Inclusive eu :smiley:

Nem na Documentação oficial do JasperReport tem um grau de detalhe como a sua respota

Abraços e Parabens novamente

Jomello

T

feltraco:
Cara esse artigo tem exatamente o que vc precisa…

http://blog.apollo-ti.com/?p=8

espero ter ajudado… qq coisa to no blog e aki tb…

FLwS

Este documento parece que tem o que eu preciso, mas está em baixo. Seria possivel coloca-lo aqui no forum?

Obrigado, Tiago

Criado 16 de janeiro de 2008
Ultima resposta 15 de set. de 2011
Respostas 17
Participantes 6