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();
}
}