iReport - sub relatórios aninhados

8 respostas
T

Pessoal, eu tenho as seguintes classes:

public class Cidade {
	
	private String cidade;

	// get e set
	
}
public class Estado {

	private String estado;
	private Collection<Cidade> cidades;
	
	public Estado (String estado, Collection<Cidade> cidades) {
		this.estado = estado;
		this.cidades = cidades;
	}

	// get e set
	
}
public class Pais {

	private String pais;
	private Collection<Estado> estados;
	
	public Pais(String pais, Collection<Estado> estados) {
		tthis.pais = pais;
		this.estados = estados;
	}

	// get e set
}

Estou tentando gerar um relatório de países que tem um sub-relatório de estados e este por sua vez possui um sub-relatório de cidades. Para popular os dados no relatório estou usando JRBeanCollectionDataSource. O problema é que não estou conseguindo passar as listas como parâmetro para os sub-relatórios. Quando crio um field para o atributo estados da classe Pais dá uma ClassCastException, mesmo eu mapeando esse field como java.lang.Object. Alguém poderia me dar uma dica de como passar as listas para o sub-relatório de estados e depois de como recuperar a lista de cidade e passar para o outro sub-relatório?

O meu código para criar e exibir o relatório é o seguinte:

package paises;

import java.util.ArrayList;
import java.util.HashMap;

import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

public class Run {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ArrayList<Pais> paises = new ArrayList<Pais>();
		
		
		ArrayList<Estado> estados = new ArrayList<Estado>();
		
		ArrayList<Cidade> cidades = new ArrayList<Cidade>();
		cidades.add(new Cidade("Florianópolis"));
		cidades.add(new Cidade("São José"));
		estados.add(new Estado("Santa Catarina", cidades));
		
		cidades = new ArrayList<Cidade>();
		cidades.add(new Cidade("Curitiba"));
		cidades.add(new Cidade("Londrina"));
		estados.add(new Estado("Paraná", cidades));
		
		cidades = new ArrayList<Cidade>();
		cidades.add(new Cidade("São Paulo"));
		cidades.add(new Cidade("Campinas"));
		estados.add(new Estado("São Paulo", cidades));
		
		paises.add(new Pais("Brasil", estados));
		
		
		estados = new ArrayList<Estado>();
		
		cidades = new ArrayList<Cidade>();
		cidades.add(new Cidade("New York"));
		estados.add(new Estado("N. Y.", cidades));
		
		cidades = new ArrayList<Cidade>();
		cidades.add(new Cidade("San Diego"));
		estados.add(new Estado("California", cidades));
		
		paises.add(new Pais("Estados Unidos", estados));
		
		String arquivoRelatorio = "/home/thiago/testeireport/TesteSub_Principal";
		
		JasperPrint relatorio = JasperFillManager.fillReport(arquivoRelatorio + ".jasper", new HashMap(), new JRBeanCollectionDataSource(paises));
		JasperViewer.viewReport(relatorio, false);

	}

}

Muito obrigado pela atenção

8 Respostas

R

Na configuração do datasource do sue subrelatorio:

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource((java.util.Collection) $F{estados})

[]´s

T

Rafaelprp:
Na configuração do datasource do sue subrelatorio:

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource((java.util.Collection) $F{estados})

[]´s

Ok Rafael, mas na criação do field $F{estados} no relatório principal eu defino como java.lang.Object? Mesmo fazendo isso acontece esse erro:

Exception in thread "main" java.lang.ClassCastException: java.lang.String
	at TesteSub_Principal_1203530983840_351471.evaluate(TesteSub_Principal_1203530983840_351471:172)
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:186)
	at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:537)
	at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:505)
	at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:806)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:335)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:260)
	at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:274)
	at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:403)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1346)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:662)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:232)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:113)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:763)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:688)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)
	at masterdetail.Principal.main(Principal.java:76)

NESTED BY :
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
	Source text : new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource((java.util.Collection) $F{estados})
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:197)
	at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:537)
	at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:505)
	at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:806)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:335)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:260)
	at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:274)
	at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:403)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1346)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:662)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:232)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:113)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:763)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:688)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)
	at masterdetail.Principal.main(Principal.java:76)
Caused by: java.lang.ClassCastException: java.lang.String
	at TesteSub_Principal_1203530983840_351471.evaluate(TesteSub_Principal_1203530983840_351471:172)
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:186)
	... 17 more
R

isso tá com cara que é em outro campo, um campo String que tá indo como outro tipo.

T

Rafael, anexei os relatórios. Você poderia dar uma olhada no que eu estou fazendo de derrado? Ou eu sou muito burro ou vou ter que me enfocar… Estou há 6 dias tentando fazer isso funcionar…

R

vc passou o mesmo relatório 2x :smiley:
manda o de cidades aí

T

Rafaelprp:
vc passou o mesmo relatório 2x :smiley:
manda o de cidades aí

ops… to mandando, mas o erro acontece é já no primeiro!

Valeu pela ajuda.

T

Cara… funcionou. Valeu a ajuda

R

boa :slight_smile:

Criado 20 de fevereiro de 2008
Ultima resposta 20 de fev. de 2008
Respostas 8
Participantes 2