[RESOLVIDO] Sub Sub Relatório não aparece os dados usando JasperDesign

1 resposta
R

Olá,

Estou fazendo um relatório bastante dinâmico, por essa razão abri mão de usar o iReport e estou montando-o a partir do JasperDesign, só que chegou em uma parte que tenho que rodar um subReport dentro de outro subReport e não está funcionando. No relatório principal eu consigo fazer rodar o sub-relatório, ele mostra todos os textField belezinha, só que na hora de rodar o subReport dentro desse subReport, o sub-sub-relatório vem em branco.

Já tentei de várias maneiras, todas sem sucesso. Alguém tem ideia de como resolver isso?!?

Desde já, muito obrigado!

Ps.: Estou usando o jasperreports-4.1.1

A classe principal é essa:

public class Classe {

	public Classe() {
        try {
        	List<Dad> dads = new ArrayList<Dad>();
        	
            for (int i = 0; i < 5; i++) {
                Dad dad = new Dad("Dad's name " + i);
                
                List<Son> listSon = new ArrayList<Son>();
                for (int y = 0; y < 2; y++) {
                	Son son = new Son("Son's name: " + y);
                	listSon.add(son);
                	dad.setListSon(listSon);
                }
                dads.add(dad);
            }
            

            /**
             * Sub Son Report
             * */
            JasperDesign jasperSubSonReportDesign = getSubSonReport();
            
            JasperReport jasperSubSonReport = JasperCompileManager.compileReport(jasperSubSonReportDesign);
            
            
            /**
             * Sub Report
             * */
        	JasperDesign jasperSubReportDesign = getSubReport();
        	
        	JRDesignParameter parametroSubSonReport = new JRDesignParameter();
        	parametroSubSonReport.setName("subSonReport");
        	parametroSubSonReport.setValueClass(java.lang.Object.class);
        	jasperSubReportDesign.addParameter(parametroSubSonReport);
        	
        	JRDesignParameter parametroSonLista = new JRDesignParameter();
        	parametroSonLista.setName("listSon");
        	parametroSonLista.setValueClass(List.class);
        	jasperSubReportDesign.addParameter(parametroSonLista);

        	JasperReport jasperSubReport = JasperCompileManager.compileReport(jasperSubReportDesign);
        	
        	/**
        	 * Main Report
        	 * */
        	JasperDesign jasperMainReportDesign = getReport();

        	JRDesignParameter parametroSubReport = new JRDesignParameter();
            parametroSubReport.setName("subReport");
            parametroSubReport.setValueClass(java.lang.Object.class);
            jasperMainReportDesign.addParameter(parametroSubReport);

            JRDesignParameter parametroLista = new JRDesignParameter();
            parametroLista.setName("lista");
            parametroLista.setValueClass(net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.class);
            jasperMainReportDesign.addParameter(parametroLista);

            HashMap<String, Object> parametros = new HashMap<String, Object>();
            parametros.put(parametroSubReport.getName(), jasperSubReport);
            parametros.put(parametroLista.getName(), new JRBeanCollectionDataSource(dads));
            
        	jasperMainReportDesign.addParameter(parametroSubSonReport);
        	jasperMainReportDesign.addParameter(parametroSonLista);
            
            parametros.put(parametroSubSonReport.getName(), jasperSubSonReport);

            JasperReport jasperReport = JasperCompileManager.compileReport(jasperMainReportDesign);
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, new JREmptyDataSource());
            JasperViewer.viewReport(jasperPrint);

        } catch (JRException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
	
	private JasperDesign getReport() throws JRException {
		JasperDesign jasperDesign = new JasperDesign();
        jasperDesign.setName("report");

        JRDesignBand titleRel = new JRDesignBand();
        titleRel.setHeight(25);
        titleRel.addElement(addJRDesignStaticText("Title - Report", 0, 0, 150, 20));

        JRDesignBand pageHeaderRel = new JRDesignBand();
        pageHeaderRel.setHeight(25);
        pageHeaderRel.addElement(addJRDesignStaticText("Repor with SubReport", 0, 0, 150, 20));

        /**
         * Sub Report
         * */
        JRDesignSubreport subReport = new JRDesignSubreport(jasperDesign);
        subReport.setX(0);
        subReport.setY(0);
        subReport.setWidth(555);
        subReport.setHeight(30);

        JRDesignExpression expression2 = new JRDesignExpression();
        expression2.setText("$P{subReport}");
        subReport.setExpression(expression2);

        JRDesignExpression expression3 = new JRDesignExpression();
        expression3.setText("$P{lista}");
        subReport.setDataSourceExpression(expression3);

        JRDesignBand detailRel = new JRDesignBand();
        detailRel.setHeight(30);
        detailRel.addElement(subReport);

        jasperDesign.setTitle(titleRel);
        jasperDesign.setPageHeader(pageHeaderRel);
        ((JRDesignSection) jasperDesign.getDetailSection()).getBandsList().add(0, detailRel);
        
        return jasperDesign;
	}
	
	private JasperDesign getSubReport() throws JRException, ClassNotFoundException {
		JasperDesign jasperSubDesign = new JasperDesign();
        jasperSubDesign.setName("subReport");

        JRDesignBand title = new JRDesignBand();
        title.setHeight(25);
        title.addElement(addJRDesignStaticText("Title - SubReport", 0, 0, 150, 20));

        JRDesignBand columnHeader = new JRDesignBand();
        columnHeader.setHeight(25);
        columnHeader.addElement(addJRDesignStaticText("NAMES", 0, 0, 100, 20));

        JRDesignField field = new JRDesignField();
        field.setName("dadName");
        field.setValueClass(String.class);
        jasperSubDesign.addField(field);

        JRDesignField fieldList = new JRDesignField();
        fieldList.setName("listSon");
        fieldList.setValueClass(List.class);
        jasperSubDesign.addField(fieldList);
        
        JRDesignBand detail = new JRDesignBand();
        detail.setHeight(60);
        detail.addElement(addTextField("dadName", 0, 0, 100, 20));
        detail.addElement(addTextField("listSon", 0, 20, 550, 40));

        jasperSubDesign.setTitle(title);
        jasperSubDesign.setColumnHeader(columnHeader);
        ((JRDesignSection) jasperSubDesign.getDetailSection()).getBandsList().add(0, detail);

        /**
         * Sub Son Report
         * */
        JRDesignSubreport sonSubReport = new JRDesignSubreport(jasperSubDesign);
        sonSubReport.setX(0);
        sonSubReport.setY(0);
        sonSubReport.setWidth(555);
        sonSubReport.setHeight(15);

        JRDesignExpression expression2 = new JRDesignExpression();
        expression2.setText("$P{subSonReport}");
        sonSubReport.setExpression(expression2);

        JRDesignExpression expression3 = new JRDesignExpression();
        expression3.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listSon})");
        sonSubReport.setDataSourceExpression(expression3);
        
        
        JRDesignBand detailRel = new JRDesignBand();
        detailRel.setHeight(50);
        detailRel.addElement(sonSubReport);
        
        
        ((JRDesignSection) jasperSubDesign.getDetailSection()).getBandsList().add(1, detailRel);

        return jasperSubDesign;
	}
	
	private JasperDesign getSubSonReport() throws JRException, ClassNotFoundException {
		JasperDesign jasperSubSonDesign = new JasperDesign();
        jasperSubSonDesign.setName("subSonReport");

        JRDesignBand title = new JRDesignBand();
        title.setHeight(25);
        title.addElement(addJRDesignStaticText("Title - SubSonReport", 0, 0, 150, 20));

        JRDesignBand columnHeader = new JRDesignBand();
        columnHeader.setHeight(25);
        columnHeader.addElement(addJRDesignStaticText("Son's Names", 50, 0, 100, 20));

        JRDesignField field = new JRDesignField();
        field.setName("sonName");
        field.setValueClass(String.class);
        jasperSubSonDesign.addField(field);

        JRDesignBand detail = new JRDesignBand();
        detail.setHeight(25);
        detail.addElement(addTextField("sonName", 50, 0, 100, 20));

        jasperSubSonDesign.setTitle(title);
        jasperSubSonDesign.setColumnHeader(columnHeader);
        ((JRDesignSection) jasperSubSonDesign.getDetailSection()).getBandsList().add(0, detail);

        return jasperSubSonDesign;
	}

	private JRDesignTextField addTextField(String fieldName, int x, int y, int width, int height) {
		JRDesignExpression expression = new JRDesignExpression();
        expression = new JRDesignExpression();
        expression.setText("$F{" + fieldName + "}");

        JRDesignTextField textField = new JRDesignTextField();
        textField.setExpression(expression);
        textField.setX(x);
        textField.setY(y);
        textField.setWidth(width);
        textField.setHeight(height);
        
        return textField;
	}
	
	private JRDesignStaticText addJRDesignStaticText(String text, int x, int y, int width, int height) {
		JRDesignStaticText staticText = new JRDesignStaticText();
        staticText.setText(text);
        staticText.setX(x);
        staticText.setY(y);
        staticText.setWidth(width);
        staticText.setHeight(height);
        
		return staticText;
	}
	
    public static void main(String args[]) {
        new Classe();
    }
}

1 Resposta

R

Resolução encontrada pelo meu amigo Rafael Broz, meus sinceros agradecimentos:

import java.awt.TextField;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRSubreportParameter;
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.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignParameter;
import net.sf.jasperreports.engine.design.JRDesignSection;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignSubreport;
import net.sf.jasperreports.engine.design.JRDesignSubreportParameter;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.view.JasperViewer;
import teste.beans.Cidade;
import teste.beans.Estado;
import teste.beans.Pais;

/**
 * @author furstmartins
 * */

public class Classe {

	public Classe() {
        try {
        	//compila final relatorio
        	JasperReport jasperSubReportFinal = JasperCompileManager.compileReport(getSubSonReport());
        	//compila sub relatorio
    		JasperReport jasperSubReport = JasperCompileManager.compileReport(getSubReport());
    		
    		//relatorio principal
        	JasperDesign jasperMainReportDesign = getReport();
            //Parametros para o relatorio
            HashMap<String, Object> parametros = new HashMap<String, Object>();
            parametros.put("subRelatorio", jasperSubReport);
            parametros.put("subRelatorioFinal", jasperSubReportFinal);
            
            //compila relatorio principal
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperMainReportDesign);
            //datasource
            JRBeanCollectionDataSource jbds = new JRBeanCollectionDataSource(haveList());
            //resultado
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, jbds);
            
            //ver
            JasperViewer.viewReport(jasperPrint);

        } catch (Exception ex) {
            ex.printStackTrace();
        } 
    }
	
	private Collection<Pais> haveList(){
		Collection<Pais> cp = new ArrayList<Pais>();
		
		Pais p1 = new Pais();
		p1.setNomePais("Brasil");
		
		Estado e1 = new Estado();
		e1.setNomeEstado("Rio de Janeiro");

		Cidade c1 = new Cidade();
		c1.setCidadeNome("Niteroi");
		Cidade c2 = new Cidade();
		c2.setCidadeNome("São Gonçalo");
		Collection<Cidade> cidadesRj = new ArrayList<Cidade>();
		cidadesRj.add(c1);
		cidadesRj.add(c2);
		e1.setCidadesList(cidadesRj);
		
		
		Estado e2 = new Estado();
		e2.setNomeEstado("São Paulo");
		
		Cidade c3 = new Cidade();
		c3.setCidadeNome("Santos");
		Collection<Cidade> cidadesSp = new ArrayList<Cidade>();
		cidadesSp.add(c3);
		e2.setCidadesList(cidadesSp);
		
		Collection<Estado> estadosBr = new ArrayList<Estado>();
		estadosBr.add(e1);
		estadosBr.add(e2);
		
		p1.setEstadosList(estadosBr);
		
		
		Pais p2 = new Pais();
		p2.setNomePais("Chile");
		p2.setEstadosList(new ArrayList<Estado>());
		
		cp.add(p1);
		cp.add(p2);
		
		return cp;
	}
	
	
	private JasperDesign getReport() throws JRException, ClassNotFoundException {
		
		JasperDesign jasperDesign = new JasperDesign();
        jasperDesign.setName("report");

        JRDesignBand titleRel = new JRDesignBand();
        titleRel.setHeight(25);
        titleRel.addElement(addJRDesignStaticText("Title - Report", 0, 0, 150, 20));
        jasperDesign.setTitle(titleRel);

        
        JRDesignBand sumaryRel = new JRDesignBand();
        sumaryRel.setHeight(25);
        sumaryRel.addElement(addJRDesignStaticText("Title FIM", 0, 0, 150, 20));
        jasperDesign.setSummary(sumaryRel);
        
        //PARAMETERS
        JRDesignField fieldNome = new JRDesignField();
        fieldNome.setName("nomePais");
        fieldNome.setValueClass(String.class);
        jasperDesign.addField(fieldNome);
        
        JRDesignField fieldEstadosList = new JRDesignField();
        fieldEstadosList.setName("estadosList");
        fieldEstadosList.setValueClass(Collection.class);
        jasperDesign.addField(fieldEstadosList);
        
        JRDesignParameter parametroSubReport = new JRDesignParameter();
        parametroSubReport.setName("subRelatorio");
        parametroSubReport.setValueClass(java.lang.Object.class);
        jasperDesign.addParameter(parametroSubReport);
        
        JRDesignParameter parametroSubReportFinal = new JRDesignParameter();
        parametroSubReportFinal.setName("subRelatorioFinal");
        parametroSubReportFinal.setValueClass(java.lang.Object.class);
        jasperDesign.addParameter(parametroSubReportFinal);
        //FIM PARAMETERS
        
        
        
        //DETAIL
        JRDesignBand detailRel = new JRDesignBand();
        detailRel.setHeight(500);
        detailRel.addElement(addTextField(" \"Pais: \" +$F{nomePais}+ \" tem \" + $F{estadosList}.size() + \" estados\"", 0, 0, 300, 20));

        //componente do subrelatorio
        JRDesignSubreport subReport = new JRDesignSubreport(jasperDesign);
        subReport.setUsingCache(false);
        subReport.setX(0);
        subReport.setY(0);
        subReport.setWidth(555);
        subReport.setHeight(400);
        //pega field subrelatorio compilado que foi passado por parametro
        JRDesignExpression expression2 = new JRDesignExpression();
        expression2.setText("$P{subRelatorio}");
        subReport.setExpression(expression2);
        
        //passa DS para sub report
        JRDesignExpression expression3 = new JRDesignExpression();
        expression3.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{estadosList})");
        subReport.setDataSourceExpression(expression3);
        
 
        //passa relatorio compilado       
        JRDesignExpression jrParam = new JRDesignExpression();
        jrParam.setText("$P{subRelatorioFinal}");

        JRDesignSubreportParameter par = new JRDesignSubreportParameter();
        par.setExpression(jrParam);
        par.setName("subRelatorioFinal");
        subReport.addParameter( par );
       

        //add elemnto subrelatorio
        detailRel.addElement(subReport);

        ((JRDesignSection) jasperDesign.getDetailSection()).getBandsList().add(0, detailRel);
    
        return jasperDesign;
	}
	
	private JasperDesign getSubReport() throws JRException, ClassNotFoundException {
		JasperDesign jasperSubDesign = new JasperDesign();
        jasperSubDesign.setName("subReport");

        JRDesignBand title = new JRDesignBand();
        title.setHeight(25);
        title.addElement(addJRDesignStaticText("ESTADOS", 0, 0, 150, 20));
        jasperSubDesign.setTitle(title);

        JRDesignBand sumary = new JRDesignBand();
        sumary.setHeight(25);
        sumary.addElement(addJRDesignStaticText("FIM ESTADOS", 0, 0, 150, 20));
        jasperSubDesign.setSummary(sumary);
        
        //DECLARA
        JRDesignField field = new JRDesignField();
        field.setName("nomeEstado");
        field.setValueClass(String.class);
        jasperSubDesign.addField(field);

        JRDesignField fieldList = new JRDesignField();
        fieldList.setName("cidadesList");
        fieldList.setValueClass(Collection.class);
        jasperSubDesign.addField(fieldList);
        
        JRDesignParameter parametroSubReportFinal = new JRDesignParameter();
        parametroSubReportFinal.setName("subRelatorioFinal");
        parametroSubReportFinal.setValueClass(java.lang.Object.class);
        jasperSubDesign.addParameter(parametroSubReportFinal);
        //FIM DECLARA
        
        JRDesignBand detail = new JRDesignBand();
        detail.setHeight(300);
        detail.addElement(addTextField("$F{nomeEstado}", 0, 0, 100, 20));
        detail.addElement(addTextField("$F{cidadesList}.size()  ", 100, 0, 100, 20));

        
        //DETAIL
        //Cria componente sub
        JRDesignSubreport subReport = new JRDesignSubreport(jasperSubDesign);
        subReport.setUsingCache(false);
        subReport.setX(0);
        subReport.setY(0);
        subReport.setWidth(555);
        subReport.setHeight(200);
        
        JRDesignExpression expression2 = new JRDesignExpression();
        expression2.setText("$P{subRelatorioFinal}");
        subReport.setExpression(expression2);
        
        //passa DS para sub report
        JRDesignExpression expression3 = new JRDesignExpression();
        expression3.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cidadesList})");
        subReport.setDataSourceExpression(expression3);
         :cry:         
        detail.addElement(subReport);
        
        ((JRDesignSection) jasperSubDesign.getDetailSection()).getBandsList().add(0, detail);

        return jasperSubDesign;
	}
	
	private JasperDesign getSubSonReport() throws JRException, ClassNotFoundException {
		JasperDesign jasperSubSonDesign = new JasperDesign();
        jasperSubSonDesign.setName("subSonReport");

        JRDesignBand title = new JRDesignBand();
        title.setHeight(25);
        title.addElement(addJRDesignStaticText("CIDADES", 0, 0, 150, 20));
        jasperSubSonDesign.setTitle(title);

        JRDesignBand sumary = new JRDesignBand();
        sumary.setHeight(25);
        sumary.addElement(addJRDesignStaticText("FIM CIDADES", 0, 0, 150, 20));
        jasperSubSonDesign.setSummary(sumary);


        //DECLARA
        JRDesignField fieldParam = new JRDesignField();
        fieldParam.setName("cidadeNome");
        fieldParam.setValueClass(String.class);
        jasperSubSonDesign.addField(fieldParam);
        //FIM DECLARA
  
        JRDesignBand detail = new JRDesignBand();
        detail.setHeight(25);
        detail.addElement(addTextField("$F{cidadeNome}", 50, 0, 100, 20));
 
        ((JRDesignSection) jasperSubSonDesign.getDetailSection()).getBandsList().add(0, detail);

        return jasperSubSonDesign;
	}

	
//#######################################################################################################3	
	
	private JRDesignTextField addTextField(String fieldName, int x, int y, int width, int height) {
		JRDesignExpression expression = new JRDesignExpression();
        expression = new JRDesignExpression();
        expression.setText(fieldName);

        JRDesignTextField textField = new JRDesignTextField();
        textField.setExpression(expression);
        textField.setX(x);
        textField.setY(y);
        textField.setWidth(width);
        textField.setHeight(height);
        
        return textField;
	}
	
	private JRDesignStaticText addJRDesignStaticText(String text, int x, int y, int width, int height) {
		JRDesignStaticText staticText = new JRDesignStaticText();
        staticText.setText(text);
        staticText.setX(x);
        staticText.setY(y);
        staticText.setWidth(width);
        staticText.setHeight(height);
        
		return staticText;
	}
	
    public static void main(String args[]) {
        new Classe();
    }
}
Criado 17 de fevereiro de 2012
Ultima resposta 15 de mar. de 2012
Respostas 1
Participantes 1