Algo de JasperReports, SWT y Eclipse RCP

por | julio 19, 2013

JasperReports, el «reporteador» de facto más usado en el mundo Java(mi apreciación, favor decirme si estoy equivocado),  y donde necesitas por cualquier razón incluirlo en algún desarrollo SWT(si, todavía existen desarrollos en SWT :D) o mejor dicho en mi caso usando Eclipse RCP versión 3(efectivamente tiene que ser esta versión y no la 4), lograr que todo «fluya» correctamente y en todos los sistemas operativos es una verdadera «Odisea».

La versión 3.3 exactamente de Eclipse RCP contiene un sin número de issues en Unix/Linux y en Mac, entonces tener una aplicación que no falle en estas tres plataformas(incluyendo Windows) se convierte en un trabajo laborioso. Lo mejor es saltar a la versión 4, pero cuando estás atado a la versión en cuestión lo mejor es llenarte de abundante café porque las horas de trabajo van a ser interminables.

SWTJasperViewer

Un excelente proyecto que nace de la necesidad de poder desplegar nuestros reportes dentro de un ambiente Eclipse RCP, un editor al cual le agregas el reporte y listo. Simple a primera vista, lamentablemente el proyecto recibió la última actualización por el 2008 y mucha agua a corrido debajo del puente. Las librerías de JasperReports usadas en los ejemplos de este desarrollo son extremadamente antiguas, incluso muchos de sus métodos obsoletos al día de hoy. Tendrás que crear, compilar tu reporte con una versión de JasperReports mucho menor para poder integrarlo correctamente.

Aqui tienes un excelente artículo sobre su uso y puesta en marcha. Integrating SWT/RCP and Jasper Reports

Para mi uso personal, rescato un parde líneas del código de ejemplo que me pueden servir a futuro.

  • Generando un objeto JasperPrint

[java]
//public static JasperPrint generateReport
//Loading my jasper file
JasperReport jasperReport = null;
jasperReport = (JasperReport) net.sf.jasperreports.engine
.util.JRLoader.loadObject(ReportGen.class.getClassLoader()
.getResourceAsStream("CustomerReport.jasper"));

//Passing parameters to the report
Map parameters = new HashMap();
parameters.put("p_CustomerId", custInfo);

//Filling the report with data from
//the database based on the parameters passed.
myJPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);

[/java]

  • Objeto SWT ViewerComposite que es el editor, el cual se agrega al shell de la aplicación.

[java]
//Using the SWTJasperViewer
private ViewerComposite viewerComposite;

public void createPartControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
container.setLayout(layout);

viewerComposite = new ViewerComposite(container,SWT.BORDER);
viewerComposite.setLayoutData(new GridData(
GridData.FILL,GridData.FILL,true,true));
}
[/java]

  • El método getReportViewer().setDocument agrega el objeto JasperPrint al visor.

[java]

//Calling the generate report and
//passing the customer id as parameter.
JasperPrint jprint = ReportGen.generateReport(cusInfo.getCustomerInfo());

//Loading the JasperPrint object in the viewer. ReportView
rv.getReportViewer().setDocument(jprint);

[/java]

JasperReports

Finalmente algo de código necesario y que muchas veces no recuerdas y no quieres perder tiempo googleando(espiando :D) .

  • Compilar un archivo jrxml

[java]
//private JasperDesign
jasperDesign = JRXmlLoader.load(reportTemplateUrl);
//compilar el jasperDesign
//private JasperReport jasperReport
jasperReport = JasperCompileManager.compileReport(jasperDesign);
[/java]

  • Cargar un archivo jasper

[java]
//private JasperReport jasperReport;
//usar un archivo .jasper ya compilado
jasperReport = (JasperReport)JRLoader.loadObject(
MiCalse.class.getResourceAsStream(jasperUrl));
[/java]

  • Llenar el reporte y mostrar/imprimir

[java]
//private JasperPrint jasperPrint;
//llenar el reporte con una lista bean
jasperPrint = JasperFillManager.fillReport(
jasperReport, null, new JRBeanCollectionDataSource(miListaColeccion));

//usar el visor de Jasper
JasperViewer.viewReport(jasperPrint, false);

//mandar a imprimir directamente sin abrir el visor
JasperPrintManager.printReport(jasperPrint, true);
[/java]

También al usar iReport como plugin de Netbeans o desde el IDE iReport, suele dar un error al probar el reporte, este suele fallar al localizar el .class de la clase que tiene la data(bean). Su solución es agregar el path del proyecto que se está probando en las configuraciones de iReport.

En Nebeans esta configuración se encuentra en:

  • Tools->Options->iReport -> Pestaña CLASSPATH.

Fuente: http://community.jaspersoft.com/questions/542136/how-access-javabeans-datasource-ireports

Eclipse RCP

Como es mejor aprender lo nuevo aquí les dejo un excelente tutorial muy completo de Eclipse RCP 4: Eclipse 4 RCP – Tutorial

Ha seguir padeciendo con este enfermo 🙂 Saludos.

.