Monthly Archives: March 2009

Como usar el JRXmlDataSource de JasperReports 3.1.2 (Hola Mundo JRXmlDataSource)

Introducción

Este articulo muestra como usar utilizar el JRXmlDataSource de jasperReports.
Como fuente de datos usaremos un archivo XML y la salida sera un archivo PDF.
Para los que quieren una introducción acerca del archivo de definición de reporte, pueden ver: Comenzando con JasperReports (de David R. Heffelfinger) – Traducción

Definiendo el archivo de datos.

Lo nombraremos data.xml y tendrá el siguiente contendido.

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <firstName>Carlos</firstName>
        <lastName>Rodrigues</lastName>
        <age>34</age>
        <id>12345678</id>
    </user>
    <user>
        <firstName>Esteban</firstName>
        <lastName>Arce</lastName>
        <age>21</age>
        <id>00000001</id>
    </user>
    <user>
        <firstName>Milton</firstName>
        <lastName>Laura</lastName>
        <age>50</age>
        <id>12003001</id>
    </user>
    <user>
        <firstName>Luis</firstName>
        <lastName>Pimentel</lastName>
        <age>45</age>
        <id>11004011</id>
    </user>
</users>

Creamos el archivo de definición del reporte.(helloJasperReportXML.jrxml)

Este archivo lo genere con la herramienta iReport. le quite la mayoría de los tags y lo deje con lo mas esencial para explicarlo.

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport
        name="helloHasperXML"
        xmlns="http://jasperreports.sourceforge.net/jasperreports"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd">
    <field name="FIRST_NAME" class="java.lang.String">
        <fieldDescription><![CDATA[firstName]]></fieldDescription>
    </field>
    <field name="LAST_NAME" class="java.lang.String">
        <fieldDescription><![CDATA[lastName]]></fieldDescription>
    </field>
    <field name="AGE" class="java.lang.String">
        <fieldDescription><![CDATA[age]]></fieldDescription>
    </field>
    <field name="ID" class="java.lang.String">
        <fieldDescription><![CDATA[id]]></fieldDescription>
    </field>
    <detail>
        <band height="18">
            <textField isBlankWhenNull="false">
                <reportElement key="textField-1" x="10" y="2" width="50" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{FIRST_NAME}]]></textFieldExpression>
            </textField>
            <textField isBlankWhenNull="false">
                <reportElement key="textField-2" x="70" y="2" width="50" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{LAST_NAME}]]></textFieldExpression>
            </textField>
            <textField isBlankWhenNull="false">
                <reportElement key="textField-3" x="130" y="2" width="50" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{AGE}]]></textFieldExpression>
            </textField>
            <textField isBlankWhenNull="false">
                <reportElement key="textField-4" x="190" y="2" width="50" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{ID}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

<field>, Define un campo que sera usado en el reporte. En este caso estamos definiendo 4 fields: FIRST_NAME, LAST_NAME, AGE y ID. Como verán, dentro de cada <field> hay un elemento <fieldDescription> este es como un mapa entre el field que sera usado en el reporte y el origen de datos. En Esta caso el origen de datos esta dado por el nombre del tag que corresponde en el archivo data.xml.
Importante: Para obtener los datos estamos usando en este caso XPATH, si quisieremos sacar una propiedad tendriamos que usar algo como @firstName

<textField>, este elemento se usa para, definir en que posición del reporte se desplegara un campo. Como verán tiene tres sub elementos: <reportelement>, que define la posición, <textElement>, que indica es es un campo texto y <textFieldExpression>, que indica de que field viene la informacion.

Creamos la clase HelloXMLJasperReport.

package bo.sumasoftware.hellojasper;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRXmlDataSource;
import java.util.HashMap;
 
/**
 * @author renan
 * @since Mar 11, 2009 4:39:00 PM
 */
public class HelloXMLJasperReport {
    public static void main(String args[]) throws Exception {
        JasperReport jasperReport = JasperCompileManager.compileReport("src/main/resources/helloHasperXML.jrxml");
        JRXmlDataSource xmlDataSource = new JRXmlDataSource("src/main/resources/data.xml","users//user");
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), xmlDataSource);
        JasperExportManager.exportReportToPdfFile(jasperPrint, "report_from_xml.pdf");
    }
}

JasperCompileManager, nos permite crear una instancia de JasperReport que viene de compila nuestro archivo de definición de reporte, como verán se le pasa la ruta del mencionado archivo. Generalmente si no definiste bien los fields, te dará un error acá.

JRXmlDataSource, al crear la instancia le estamos pasando dos parámetros: path, que es el camino de nuestro archivo de datos y una expresión xpath, que indica de que parte del archivo xml se extraerá la información. En este caso con “users//user”, estamos indicando que recogeremos todos los elementos user que estan dentro del elemento users.

JRXmlDataSource, nos permite pasar pasar el DataSource y algunos parámetros antes de imprimirlo.

JasperExportManager, finalmente nos ayuda a imprimir el reporte en un archivo pdf…. :) fuiiiu fue largo el caminio.

Nota para los usuarios de iReport, si quieres usar esta herramienta para visualizar el reporte, tendrás que adicionar:

<queryString language="xPath">
	<![CDATA[users//user]]>
</queryString>

como primer elemento hijo del tag <jasperReport≶ y una conexión XML referenciando al archivo data.xml. Con querySring, indicamos de donde se obtendrá la información.

También comparto el código fuente :) , que también tiene aparte un ejemplo con base de datos.

Hasta la próxima :) , si tienes comentarios no duden en hacerlos.

Comenzando con JasperReports (de David R. Heffelfinger) – Traducción

Nota preliminar: Este articulo es la traducción de un buen articulo que encontré para comenzar con JasperReports.

El articulo original se encuentra en Getting Started With JasperReports

Comenzando con JasperReport (de: David R. Heffelfinger)

Recientemente estuve buscando herramientas de reporting para un proyecto en la que pronto trabajare. Una de las herramientas que estaba viendo fue JasperReports. JasperReports es librería open source (LGPL) muy popular para realizar reportes escrito en java. Infortunadamente no esta muy bien documentado y yo tuve un tiempo muy difícil en hacer un simple reporte. Después de alguna investigación, finalmente fui capaz de generar un simple reporte, este articulo resume que se necesita hacer para comenzar con JasperReports. Vean Recursos para mas información en como encontrar información adicional y documentación acerca de JasperReports.

Comenzando

Los reportes de JasperReports son definidos en archivos xml, los cuales por convención tienen la extensión jrxml. Un típico archivo jrxml contiene los siguientes elementos:

<jasperReport>- El elemento raíz.

<title>- Su contenido se imprime una sola vez al comienzo del reporte.

<pageHeader>- Su contenido se imprime al comienzo de cada pagina en el reporte.

<detail>- contiene el cuerpo del reporte.

<pageFooter>- su contenido se imprime al pie de cada pagina en el reporte.

<band>- define una sección de reporte, todos los elementos de arriba contienen un elemento band como su único elemento hijo.

Todos los elementos son opcionales, excepto por el elemento raiz jasperReport, Aqui esta un ejemplo de un archivo jrxml.

<?xml version="1.0"?>
<!DOCTYPE jasperReport
  PUBLIC "-//JasperReports//DTD Report Design//EN"
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
 
<jasperReport name="Simple_Report">
 <detail>
    <band height="20">
      <staticText>
        <reportElement x="180" y="0" width="200" height="20"/>
        <text><![CDATA[Hello World!]]></text>
      </staticText>
    </band>
  </detail>
</jasperReport>

Para este ejemplo simple, yo omití los elementos opcionales <title>, <pageHeader> y <pageFooter>. El elemento <staticText>, no sorprendentemente, muestra texto estático en el reporte, como se puede ver, este contiene un simple elemento <text> definiendo el texto que sera desplegado.

El archivo jrxml necesita ser “compilado” a un formato binario especifico de JasperReports, esto puede ser conseguido llamando al método compileReport() de la clase net.sf.jasperreports.engine.JasperCompileManager. Hay muchas versiones sobrecargadas de este método, en nuestro ejemplo, nosotros usaremos el que toma un simple parámetro String, consulte la documentacion para mas detalles de otras versiones del metodo.

public class JasperReportsIntro
{
  public static void main(String[] args)
  {
    JasperReport jasperReport;
    JasperPrint jasperPrint;
    try
    {
      jasperReport = JasperCompileManager.compileReport(
          "reports/jasperreports_demo.jrxml");
      jasperPrint = JasperFillManager.fillReport(
          jasperReport, new HashMap(), new JREmptyDataSource());
      JasperExportManager.exportReportToPdfFile(
          jasperPrint, "reports/simple_report.pdf");
    }
    catch (JRException e)
    {
      e.printStackTrace();
    }
  }
}

Un archivo jrxml necesita ser compilado solo una vez, pero para este ejemplo este es compilado cada vez que la aplicación es ejecutada. Antes de que un reporte sea generado, este necesita ser “llenado” con información, esto es conseguido callando al método fillReport() de la clase net.sf.jasperreports.engine.JasperFillManager, aquí vamos a usar uno que recibe tres parámetros, una instancia de net.sf.jasperreports.engine.JasperReport, una java.util.HashMap conteniendo cualquier parámetro pasado al reporte, y una instancia de una clase que implementa la interface net.sf.jasperreports.engine.JRDataSource. La linea que consigue nuestro ejemplo de arriba es

jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), new JREmptyDataSource());

Ya que nuestro simple reporte no toma parametros, le pasamos un HashMap vacio como segundo parametro, y una instancia de net.sf.jasperreports.engine.JREmptyDataSource como tercer parametro.

JREmptyDataSource es una clase muy conveniente incluida en JasperReports, este es básicamente un DataSource sin información.

Finalmente, en nuestro ejemplo, nosotros exportamos el reporte a un archivo PDF, de esta manera este puede ser leido por Adobe Acrobat, XPF, Evince, o cualquier otro lector de PDF, la linea que realiza este ejemplo es

JasperExportManager.exportReportToPdfFile(jasperPrint, “reports/simple_report.pdf”);

Los parámetros se explican por si mismos.

Conclusión

JasperReports una maquina de reportes open source muy popular, esta guía provee suficiente información para comenzar con JasperReports. Para información adicional por favor vean mi libro JasperReports For Java Developers.

Recursos

Displaying JasperReports PDF Reports on the Browser
Creating Database Reports With JasperReports
JasperReports’ Web Site
JasperReports For Java Developers – un Libro de JasperReports escrito por el autor de este articulo – David R. Heffelfinger

Como activar el wireless (wifi) en una laptop Lenovo T61p y CentOS 5.1

Hola amigos,

Este fin de semana me estoy dedicando a reinstalar mi laptop Lenovo T61p con CentOS 5.1

Aca les comparto los pasos que realize para activar mi wireless

1. Verifique que mi targeta wireless es del tipo intel-wireless-4965-(ag/agn), eso lo hice de la forma mas inocente :) Me fui al menu system > administration > network y adicione de forma manual mi tarjeta wireless, claro no funciono, pero por lo menos averigue el modelo de mi tarjeta wireless

2. Bueno buscando y rebuscando en internet entonces encontre el siguinete link :)

Intel Pro Wireless 4965 (iwl4965 and iwlagn

Hasta la proxima :)