lunes, 2 de marzo de 2009

Creación de Reportes con JasperRepots y iReports - Parte 2: Uso de DataSources Personalizados

En el primer post de la serie de JasperReports hablé de cómo crear una biblioteca para trabajar con JasperReports y cómo crear un reporte en múltiples formatos. Además hicimos un ejemplo de creación de reportes usando una conexión JDBC directa a nuestra base de datos.

Ahora veremos cómo generar nuestros reportes sin hacer uso de una conexión. Esto puede ser muy útil en los casos en los que ya tengamos los datos en memoria y no necesitemos realizar una conexión a la base de datos; o en el caso en que, por alguna razón ajena a nosotros, no podamos obtener la conexión.

Para poder hacer esto se nos proporciona una interface: "net.sf.jasperreports.engine.JRDataSource". Esta interface tiene solo dos métodos:

  • getFieldValue(JRField jrField)
  • next()

Explicaré estos métodos un poco más adelante, por ahora comencemos a generar todo lo necesario para tener nuestro reporte.

Creamos un nuevo proyecto en NetBeans (menú "File -> New Project..."). En la ventana de nuevos proyectos seleccionamos la categoría "Java" y como tipo de proyecto seleccionamos "Java Application" y hacemos clic en el botón "Next". En la siguiente ventana introducimos el nombre de nuestro proyecto y dejamos seleccionada las opciones "Create Main Class" y "Set as Main Project".

Para que podamos pasar datos a nuestro reporte es necesario que utilicemos un datasource. En el ejemplo anterior veíamos que el datasource que usábamos era la base de datos y la conexión a la misma. En esta ocasión el datasource será una de nuestras clases. Esta clase deberá implementar la interface "JRDataSource" y contendrá la lógica para pasar los datos correspondientes a nuestro reporte.

Creamos una nueva clase haciendo clic derecho sobre el nodo "Source Packages" de la ventana "Projects", o sobre el paquete que ya tenemos creado, y en el menú contextual que se abre seleccionamos la opción "New -> Java Class...".



En la ventana que se abre escribimos como en nombre de la nueva clase "Participante" y presionamos el botón "Finish". Con esto veremos en la ventana de nuestro editor la nueva clase "Participante".

Esta clase "Partcipante" representará los datos que se mostrarán en el reporte, tal como en el ejemplo anterior cada uno de los registros de la tabla "participantes" representaba una fila en el reporte final, cada objeto participante que creemos representará una fila en el nuevo reporte.

Agreguemos los siguientes atributos a nuestra clase:


private int id;
private String nombre;
private String username;
private String password;
private String comentarios;


Además agregamos sus getters y sus setters y dos constructores, uno sin argumentos y uno que reciba como argumentos todas las propiedades declaradas anteriormente.

Si están utilizando el NetBeans para seguir este tutorial pueden generar tanto los setters y los getters de forma automática presionando las teclas "Alt + Insert", con lo cual se abrirá un menú contextual con las opciones necesarias para hacer esto:



Al terminar, su clase debe verse más o menos así:


public class Participante
{
    private int id;
    private String nombre;
    private String username;
    private String password;
    private String comentarios;

    public Participante()
    {
    }
    
    public Participante(int id, String nombre, String username, String password, String comentarios)
    {
        this.id = id;
        this.nombre = nombre;
        this.username = username;
        this.password = password;
        this.comentarios = comentarios;
    }

    public String getComentarios()
    {
        return comentarios;
    }

    public void setComentarios(String comentarios)
    {
        this.comentarios = comentarios;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getNombre()
    {
        return nombre;
    }

    public void setNombre(String nombre)
    {
        this.nombre = nombre;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }
}


Ahora, antes de seguir con nuestro código Java, pasaremos a crear la plantilla de nuestro reporte con iReport, por lo que abrimos esta herramienta.

En esta ocasión no haremos uso de un wizard para crear el reporte, sino que lo haremos desde cero, y aprovecharé para explicar algunos conceptos básicos sobre los reportes conforme los vayamos necesitando.

Para crear el nuevo reporte vamos el menú "File -> New...". En la ventana que se abre seleccionamos uno de los formatos "Blank" y presionamos el botón "Open this Template":



Después introducimos el nombre del reporte, yo lo llamaré "reporte2.jrxml", y la ubicación en la que se guardará. Les recomiendo que en esta ocasión guarden el reporte en el directorio raíz del proyecto de NetBeans que acabamos de crear. Hacemos clic en el botón "Next" y se nos mostrará un mensaje de felicitación por haber creado un nuevo reporte (^_^!). Cuando presionen el botón "Finish" verán una hoja dividida en 7 u 8 diferentes porciones horizontales llamadas bandas.



Cuando generamos nuestro reporte final con datos, cada una de estas bandas se comporta de una forma distinta. Algunas aparecen solo al principio o al final del reporte, otras aparecen con cada nueva fila que se le agrega, otras solo al final de los datos, etc.

La plantilla de reportes está dividida en 10 bandas predefinidas. Una banda siempre tiene el mismo ancho que la página. Sin embargo el alto de algunas de las bandas puede variar durante la fase de llenado de datos, aún si establecimos un alto en el momento del diseño.

Las bandas existentes son:

  • Background
  • Title
  • Page Header
  • Column Header
  • Detail 1
  • Column Footer
  • Page Footer
  • Last Page Footer
  • Summary
  • No Data

Explicaré algunas de estas bandas conforme las vayamos usando en los tutoriales correspondientes.

Lo primero que haremos es agregar texto a nuestro reporte. En iReport existen dos tipos de texto: texto estático y texto dinámico (también llamado expresiones). El texto estático es aquel que no cambia, mientras que las expresiones son como etiquetas que le indican a JasperReports que debe reemplazarlas por algún valor al momento de generar el reporte final.

Existen 3 tipos de expresiones:

  • Campos (fields) representados con "$F{nombre_campo}".
  • Variables representadas por "$V{nombre_variable}".
  • Parámetros representados por "$P{nombre_parámetro}".

Cada uno de estos tipos de expresiones tiene un uso particular:

Los campos ("$F{}") le dicen al reporte dónde colocará los valores obtenidos a través del datasource. Por ejemplo, nuestro objeto "Partcipante" tiene un atributo llamado "username". Usando una expresión de campo indicamos en cuál parte o sección del reporte debe aparecer el valor de ese atributo usando "$F{username}". Esto quedará más claro un poco más adelante.

Los parámetros ("$P{}") son valores que usualmente se pasan al reporte directamente desde el programa que crea el JasperPrint del reporte (en nuestra aplicación Java). Aunque también existen algunos parámetros internos que podemos leer pero no modificar. Para hacer uso de estos parámetros simplemente indicamos el nombre del parámetro en el lugar que queremos colocarlo. Pueden encontrar los nombres y significados de los parámetros internos en la documentación de JasperReports.

Las variables ("$V{}") son objetos usados para almacenar valores como los resultados de cálculos. Al igual que con los parámetros, JasperReports tiene algunas variables internas que podemos leer. Pueden encontrar los nombres y significados de las variables la documentación de JasperReports.

Cada uno de estos elementos tiene un nombre, un tipo (que debe corresponder con un tipo de objeto Java como String o Integer), y una descripción opcional. Además deben ser registrados para poder ser usados en tiempo de diseño y que puedan ser entendidos al momento de compilar el reporte, y por lo tanto para que nuestro reporte funcione correctamente en tiempo de ejecución. Esto lo veremos un poco más adelante.

Regresemos a donde nos quedamos. Queremos agregar un texto estático a nuestro reporte a modo de título. Para esto debemos agregar un elemento llamado "Static Text". Los elementos que podemos agregar a nuestros reportes están en una ventana llamada "Palette", que se encuentra en la parte derecha de iReport, bajo la categoría "Report Elements". Si no pueden ver la ventana "Palette" presionen las teclas "Ctrl + Shift + 8":



De esta ventana arrastramos el elemento "Static Text" a la banda "Title". "Title" es una banda que solo aparece en la parte superior de la primer página. Por lo que nos sirve para colocar el título del reporte y/o el nombre y logo de nuestra empresa.

Una vez que hayamos colocado el texto estático en la banda correspondiente y mientras aún esté seleccionado, modificamos sus propiedades usando la ventana de propiedades del elemento y la barra de formato de texto. También podemos abrir otra ventana que nos ayude a alinear y controlar el alto y el ancho de los elementos yendo al menú "Window -> Formatting Tools".



Ahora agregamos los encabezados de las columnas en las que se mostrarán los datos que pasaremos al reporte. Agregamos estos nombres en la banda "Column Header", la cual se repetirá en cada página antes de mostrar los datos de las columnas.

Agregaremos las columnas "Nombre", "Usuario", "Contraseña", y "Comentarios". Por lo que nuevamente arrastramos un elemento "Static Text" para cada una de las columnas. También podemos ajustar el alto de esta banda para que se ajuste al de nuestro texto, ya sea moviéndola directamente en el diseñador, o desde la ventana de propiedades:



Nuestro reporte ya casi está terminado, ahora solo nos queda agregar los campos en los que se mostrarán los datos que pasaremos al reporte en un momento. Para que estos campos puedan ser reemplazados por el valor real es necesario que usemos las expresiones (texto dinámico) de las que hablé anteriormente. Para esto definiremos un "field" para cada uno de los campos que queramos mostrar (en este caso serán los mismos campos para los que definimos las cabeceras de las columnas).

Los fields deben definirse antes de poder ser usados. Esta definición incluye el nombre del field y su tipo. Los fields (así como el resto de las expresiones) se definen en la ventana "Report Inspector" a la izquierda del diseñador del reporte. Ahí existe un nodo llamado "Fields" que es donde se encuentran los fields que hemos definido y que por lo tanto podemos usar ^-^.

Hacemos clic derecho en el nodo "Fields" de la ventana "Report Inspector". Con esto se abre un menú contextual. Seleccionamos la opción "Add Field" (la única habilitada).



Con esto se agregará un field llamado "field1" que por default es de tipo "java.lang.String". Cambiamos el nombre de este campo por "nombre" usando la ventana de propiedades. Esto es importante porque donde pongamos este campo será en donde se muestre el valor del campo nombre de nuestros objetos Participantes.



Hacemos lo mismo para el resto de los campos ("username", "password", "comentarios", "id"). Hay que tener cuidado cuando agreguemos el field "id". Si recuerdan, en la definición de la clase "Participante" la propiedad "id" está definida como "int". Sin embargo, a JasperReports solo podemos pasarle objetos para ser usados como valores, por lo que será necesario cambiar el tipo de la clase ("Field Class en la ventana de propiedades) a "java.lang.Integer" (aunque en realidad no mostraremos el "id" en este ejemplo).



Ahora debemos indicar en qué parte de nuestro reporte queremos que se muestren los valores correspondientes a los atributos de los objetos "Participante" que le pasemos. Para eso simplemente arrastramos los fields correspondientes al lugar en el que queremos que se muestren (arrastramos el field "nombre" a donde queremos que se muestre el atributo "nombre", el campo "username" en donde queremos que se muestre el atributo "username", etc.) desde el "Report Inspector". Al arrastrar los fields, iReport agregará automáticamente un encabezado para este field, solo borren el encabezado agregado =).

Estos fields los colocaremos en la banda "Detail 1" la cual se repite cada vez que recibe un nuevo objeto y coloca sus valores en la misma fila (quedará más claro cuando ejecutemos el ejemplo). Al final, el reporte debe quedar de la siguiente forma:



Por el momento esto es todo lo que necesitamos hacer en iReport para mostrar este reporte básico. Hacemos clic en el botón "Compile Report" para compilar el reporte y generar su archivo ".jasper" respectivo.

Podemos ver una vista previa del reporte haciendo clic en la pestaña "Preview". Asegúrense de seleccionar el "Empty datasource" antes de ver el preview, de lo contrario les aparecerá un error indicado que el documento no tiene páginas. Al final deben ver algo como esto:



Los "nulls" aparecen porque no se recuperó ningún valor que coincidiera con el nombre de ese field usando nuestro datasource (que en este caso está vacío, lo cual solucionaremos a continuación).

Regresamos al NetBeans y ahora crearemos una clase que implemente la interface "JRDataSource" de la que hablé antes. Esta clase será la que usaremos como datasource para nuestro reporte, y la que regresará los valores correspondientes a cada uno de los fields que creamos antes.

Primero agregamos a nuestro proyecto la libreria "JasperReports" que creamos en el primer tutorial de la serie de JasperReports. En esta ocasión no necesitaremos agregar el jar con el Driver de la base de datos, ya que no usaremos ninguna ^_^.

Creamos una nueva clase llamada "ParticipantesDatasource" y hacemos que esta nueva clase implemente la interface "JRDataSource". Podemos hacer que NetBeans implemente de forma automática los métodos de esta interface (proporcionando una implementación vacía) presionando las teclas "Alt + Insert" y seleccionando la opción "Implement Method" en el menú contextual que se abre.



Con esto se abrirá una ventana llamada "Generate Implement Methods" en la cual seleccionamos la interface "JRDataSource" para que se seleccionen de forma automática todos sus métodos y hacemos clic en el botón "Generate".



Con esto tendremos los dos métodos implementados y en cuyos cuerpos solo habrá:


throw new UnsupportedOperationException("Not supported yet.");


Ahora agregaremos a nuestra clase un atributo de tipo "java.util.List" llamado "listaParticipantes" que mantendrá justamente eso: la lista de los participantes de los cuales mostraremos los datos en el reporte. Inicializamos esta lista a un objeto de tipo "java.util.ArrayList", de esta forma:


private List<Participante> listaParticipantes = new ArrayList<Participante>();


También agregamos un contador llamado "indiceParticipanteActual" de tipo "int", que usaremos enseguida, y lo inicializamos a "-1"; un poco más adelante explicaré por qué este valor:


private int indiceParticipanteActual = -1;


Hasta ahora nuestra clase debe verse así:


public class ParticipantesDatasource implements JRDataSource
{
    private List<Participante> listaParticipantes = new ArrayList<Participante>();
    private int indiceParticipanteActual = -1;
    
    public Object getFieldValue(JRField jrf) throws JRException
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public boolean next() throws JRException
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}


Ahora implementaremos el método getFieldValue. Este método recibe un argumento de tipo JRField. Este parámetro nos indicará por cuál de los "fields" nos está preguntando el reporte.

En la implementación de este método regresaremos los valores correspondientes a cada uno de los atributos de nuestros objetos "Participante" conforme se vayan pidiendo. Por lo que el método queda así:


public Object getFieldValue(JRField jrField) throws JRException
{ 
    Object valor = null;  

    if("nombre".equals(jrField.getName())) 
    { 
        valor = listaParticipantes.get(indiceParticipanteActual).getNombre(); 
    } 
    else if("username".equals(jrField.getName())) 
    { 
        valor = listaParticipantes.get(indiceParticipanteActual).getUsername(); 
    } 
    else if("password".equals(jrField.getName())) 
    { 
        valor = listaParticipantes.get(indiceParticipanteActual).getPassword(); 
    } 
    else if("comentarios".equals(jrField.getName())) 
    { 
        valor = listaParticipantes.get(indiceParticipanteActual).getComentarios(); 
    }
 
    return valor; 
}


Donde básicamente ocurre lo que dije anteriormente: cada vez que el reporte pregunta por el valor de un atributo del objeto "Participante" actual (al que hace referencia el contador "indiceParticipanteActual") se regresa el valor correspondiente. Esta petición se hace en base al nombre del field que creamos desde iReport.

Ahora tal vez se estén preguntando ¿en qué momento se incrementa el contador?, o ¿cómo sabe JasperReport cuántos participantes existen? Pues bien, ambas cosas ocurren gracias a la implementación del método "next()".


public boolean next() throws JRException
{
    return ++indiceParticipanteActual < listaParticipantes.size();
}


JasperReport pregunta a este método para saber si existe otro "Participante" en la lista. Este método es el primero que se llama al generar el reporte. Por lo que el contador debe comenzar en "-1", así cuando este método se llama la primera vez el contador queda en "0", y cuando se invoca al método "getFieldValue" se regresa el objeto Participante del índice adecuado.

Esto es todo lo que necesitamos para que nuestro datasource funcione para generar reportes. Agregaré un método de utilidad a esta clase, llamado "addParticipante", que me permita agregar un nuevo participante a la lista (aunque si lo prefieren pueden agregar el setter de "listaParticipantes"):


public void addParticipante(Participante participante)
{
    this.listaParticipantes.add(participante);
}


La clase "ParticipantesDatasource" queda de esta forma (omitiendo los imports):


public class ParticipantesDatasource implements JRDataSource
{
    private List<Participante> listaParticipantes = new ArrayList<Participante>();
    private int indiceParticipanteActual = -1;

    public Object getFieldValue(JRField jrf) throws JRException
    {
        Object valor = null;

        if ("nombre".equals(jrf.getName()))
        {
            valor = listaParticipantes.get(indiceParticipanteActual).getNombre();
        }
        else if ("username".equals(jrf.getName()))
        {
            valor = listaParticipantes.get(indiceParticipanteActual).getUsername();
        }
        else if ("password".equals(jrf.getName()))
        {
            valor = listaParticipantes.get(indiceParticipanteActual).getPassword();
        }
        else if ("comentarios".equals(jrf.getName()))
        {
            valor = listaParticipantes.get(indiceParticipanteActual).getComentarios();
        }

        return valor;
    }

    public boolean next() throws JRException
    {
        return ++indiceParticipanteActual < listaParticipantes.size();
    }

    public void addParticipante(Participante participante)
    {
        this.listaParticipantes.add(participante);
    }
}


Para finalizar agregaremos en nuestra clase "Main" un ciclo dentro del cual crearemos 10 objetos "Participante", los cuales iremos agregando uno a uno a un objeto de tipo "ParticipantesDatasource":


ParticipantesDatasource datasource = new ParticipantesDatasource();

for (int i = 1; i <= 10; i++) 
{ 
    Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i);     
    datasource.addParticipante(p);  
} 


El resto del código para generar el reporte es similar al del primer tutorial de JasperReports, solo que en esta ocasión en lugar de pasar un objeto de tipo "Connection" al método "fillReport" del "JasperFillManager" pasamos nuestro objeto "ParticipantesDatasource" de esta forma:


JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);


Al final el código de nuestra clase "Main" queda así:


public class Main 
{ 
    public static void main(String[] args) throws Exception 
    { 
        ParticipantesDatasource datasource = new ParticipantesDatasource();  

        for (int i = 1; i <= 10; i++) 
        { 
            Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); 
            datasource.addParticipante(p); 
        }  

        JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte2.jasper");  
        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);  

        JRExporter exporter = new JRPdfExporter();  
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF.pdf")); 
        exporter.exportReport(); 
    }
}


Al ejecutar este código debemos terminar con un archivo llamado "reporte2PDF.pdf" en el directorio raíz de nuestro proyecto y que tiene el siguiente contenido:



Podrá no ser el reporte más bello o más útil del mundo, pero es nuestro =D.

Podemos ver que los datos importantes (los datos de los "Participantes") aparecen en la banda "Details 1" (donde colocamos los fields) y que esta banda se repite por cada uno de los participantes de la lista.

Bien, con esto vemos que podemos crear nuestros propios datasources y pasar datos para generar reportes sin la necesidad de una conexión a base de datos. Es bastante sencillo, solamente debemos proporcionar una clase que implemente la interface "JRDataSource" y que regrese los valores correspondientes a los fields del reporte.

Aunque esto ya es bastante fácil y útil, existe una forma aún más simple para crear un datasource, sin la necesitad de implementar la interface "JRDataSource". Esto es gracias a un conjunto de clases que JasperReports ya nos proporciona y realizan básicamente la misma función que la clase "ParticipantesDatasource" que acabamos de crear. Estas clases son:

  • JRBeanCollectionDataSource
  • JRJpaDataSource
  • JRBeanArrayDataSource

Las cuales ya implementan la interface "JRDataSource". Cada una funciona con distintos tipos de datos, pero en que nos interesa en este momento es "JRBeanCollectionDataSource" que puede convertir una "java.util.Collection" en un DataSource de forma automática. Modificaremos nuestro método "main" para hacer uso de esta clase.

Ahora, en vez de llenar nuestro "ParticipantesDatasource" en el ciclo simplemente llenaremos un "java.util.List":


List listaPariticipantes = new ArrayList();

for (int i = 1; i <= 10; i++) 
{ 
    Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); 
    listaPariticipantes.add(p);
}


Y en lugar de pasar un objeto de tipo "Connection" al método "fillReport" del "JasperFillManager" pasamos un nuevo objeto "JRBeanCollectionDataSource" construido con la lista "listaPariticipantes":


JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));


Al final nuestra clase "Main" queda así:


public class Main
{
    public static void main(String[] args) throws Exception
    {
        List listaPariticipantes = new ArrayList();

        for (int i = 1; i <= 10; i++) 
        {
            Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); 
            listaPariticipantes.add(p);
        } 

        JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte2.jasper");

        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

        JRExporter exporter = new JRPdfExporter(); 
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF_2.pdf")); 
        exporter.exportReport();
    }
}


Al ejecutar este código se genera el archivo "reporte2PDF_2.pdf" en el directorio raíz de nuestro proyecto, con el siguiente contenido:



El cual es idéntico al reporte generado con la clase "ParticipantesDatasource".

Y con esto vemos que gracias a la clase "JRBeanCollectionDataSource" no es necesario que proporcionemos nuestra propia clase que implemente la interface "JRDataSource", por lo que la generación de reportes es aún más simple ^-^.

Bien, esto es todo por ahora. Espero que este post les sea de utilidad.

En el siguiente tutorial hablaré de cómo funcionan los parámetros y las variables en JasperReport, para lo cual haremos uso del reporte que acabamos de crear.

Gracias a todos y no olviden dejar sus dudas, comentarios, y sugerencias. Todo es bienvenido.

Saludos.

Descarga los archivos de este tutorial desde aquí:

Entradas Relacionadas:

79 comentarios:

  1. Amigo me podrias ayudar, con el tema de realizar una coneccion con hibernate, la realizo y no consigo un buen resultado solo un "cannot open connection", agrege el conector el path donde esta el mapeo de la base pero parece que algo esta mal, soy neofita en el tema y no encuentro una solucion help!!

    ResponderEliminar
  2. Hola Anthe.

    Claro que si,puedo ayudarte con mucho gusto. Solo necesito un poco más de información sobre que estás haciendo. Supongo que estas haciendo uso de un DataSource propio (ya sea implementando la interface JRDataSource o a través de un JRBeanCollectionDataSource), y que obtienes los datos a través de Hibernate. ¿Estoy en lo correcto?, o ¿lo estas haciendo de otra forma?

    ¿Podrías decirme en qué línea te da el error?, o ¿hay forma de que subas tu código a algún sitio para poder revisarlo?.

    Saludos

    ResponderEliminar
  3. Hola;
    Disculpa para que son los "seters" y los "geters"??

    SAludos
    Miguel.

    ResponderEliminar
    Respuestas
    1. mmmmh se refiere a los métodos relacionados a las propiedades, como asignarles un valor "SET" o recuperar un valor "GET" de ellas.

      saludos!

      Eliminar
  4. Hola;

    Bien, los setters y los getters son una convención utilizada en algunos lenguajes de programación.

    Por seguridad, y buenas prácticas, se supone que no se deben dejar las variables o atributos de una clase como públicos. Por lo tanto no puede haber un acceso directo para leer o escribir los valores de estas variables, así que es necesario hacerlo a través de métodos. Estos métodos son conocidos como setters y getters. Estos dán la ventaja de ofrecer validaciones, transformaciones, etc., antes de establecer o regresar el valor de una variable.

    En realidad esta convención dice que para cada variable que tengamos en una clase, si queremos que esta variable pueda ser leida debemos proporcionar un getter para esta variable. Si queremos que su valor pueda ser escrito debemos proporcionar un setter. Entonces, si tenemos una variable nombre de la siguiente forma:

    private String nombre;

    su getter sería;

    public String getNombre(){...}

    y su setter sería:

    public void setNombre(String nombre){...}

    Espero que esta explicación se clara y te ayude. Puedes encontrar más información de setters y getters en las siguientes ligas:

    http://mindprod.com/jgloss/setter.html
    http://mindprod.com/jgloss/getter.html

    Saludos

    ResponderEliminar
  5. hola;
    si gracias de echo en los getters quiero establecer que llene el reporte atraves de resultados de sql, osea que busque por ejemplo seelct * from piezas where numerodeparte= 212121 y ya estos parametros los cargo al reporte en los setters y los obtengo de los getter, quero peirte una disculpa de tanta pregunta lo que pasa esque no lleve asi un curso en forma y yo lo que ago esque creo metodos donde coloco u obtengo informacion.

    Gracias.
    Miguel.

    ResponderEliminar
  6. hola;
    soy de nuevo con una pregunta o error mas bien, fijate que bueno en el main cuando entra al for va ala clase participante entra al constructor y colocar this.id=id; y asi con los demas las 10 veces del for, ahora una ves que hace eso seva a la clase particifantedatasource y bueno primero entra a next y despues seva al getFieldvalue y nunca entra al if y alos else ifs mi teorira esque nunca el string "nombre" pues nunca sera igual a "nombre 1" dado que cuando entra al contructor de la clase particifante le coloca nose ejemplo nombre 1 hasta nombre 10, por esto me genera en el reportePDF.pdf puros nulls, ese es mi posible razon, ahora segun yo ya vi el codigo vatias veces y no me sale :( no se site pueda enviar mi codigo o fotos.

    Gracias.
    Miguel.

    ResponderEliminar
  7. Hola Miguel;

    En relaidad lo que hace cuando entra a getFieldvalue es pasarle como parametro el jrField y de este se obtiene nombre del campo que quiere recuperar, por ejemplo "nombre", entonces en base a ese nombre de parametro, es como sabemos qué valor regresarle.

    Si, si puedes subir tu código a algun lugar como rapidsare o uploading.com subelo, lo reviso y te ayudo, o si quieres pegalo aqui para verlo.

    Saludos

    ResponderEliminar
  8. Hola;
    sip tienes razon le cambie de "nombre a "Nombre" y ya funciono (Y), muchas gracias de nuevo.

    Gracias
    Miguel.

    ResponderEliminar
  9. hola,
    Enves de usar un list usara un vector para almacenar informacion, podria funcionar ???

    Gracias
    Miguel.

    ResponderEliminar
  10. Claro que si, ya que Vector implementa la interface List

    http://java.sun.com/javase/6/docs/api/java/util/Vector.html

    Saludos.

    ResponderEliminar
  11. anthe dijo...

    Amigo me podrias ayudar, con el tema de realizar una coneccion con hibernate, la realizo y no consigo un buen resultado solo un "cannot open connection", agrege el conector el path donde esta el mapeo de la base pero parece que algo esta mal, soy neofita en el tema y no encuentro una solucion help!!
    12 de abril de 2009 17:03
    Programador Java dijo...

    Hola Anthe.

    Claro que si,puedo ayudarte con mucho gusto. Solo necesito un poco más de información sobre que estás haciendo. Supongo que estas haciendo uso de un DataSource propio (ya sea implementando la interface JRDataSource o a través de un JRBeanCollectionDataSource), y que obtienes los datos a través de Hibernate. ¿Estoy en lo correcto?, o ¿lo estas haciendo de otra forma?

    ¿Podrías decirme en qué línea te da el error?, o ¿hay forma de que subas tu código a algún sitio para poder revisarlo?.

    Saludos
    12 de abril de 2009 18:03

    -*********************************************
    Amigo mil gracias por tu guia, creo que en la pregunta anterior no detalle bien el problema.

    Mira tengo un proyecto con las siguientes caracteristicas: jboss, eclipse, jsf, hibernate, jasperreports(iniciando)

    Ahora como consigo desplegar un reporte en una pagina jsf utilizando jasperreports.

    En una parte del proyecto tengo un archivo orm, el cual lo ocupo en la logica del negocio pero tambien me servirian para desplegar los datos de los reportes, Estos queries utilizan hibernate.

    Para hacer las pruebas de un reporte estoy utilizando ireport pero al intentar conectarme a travez de hibernate no conseguimos resultado alguno al testiar la la coneccion lo unico que sale es "cannot open connection". Apenas estoy tratando conseguir la conexion, no estoy utilizando ninguna interfaz todavia.

    Espero que me puedas guiar con este tema gracias otra vez

    ResponderEliminar
  12. Ok, si, creo que puedo ayudarte pero necesitaría ver tu proyecto completo. Podrías enviarlo a la siguiente dirección?

    programadorjavablog@gmail.com

    incluyendo los scripts para la creación de la base de datos y si estas usando alguna consa extra también.

    Saludos

    ResponderEliminar
  13. necesitarias todo el workspace? zipeado pesa como 49MB

    ResponderEliminar
  14. Pues si pudes mandarlo todo mejor (para que sea facil reproducir tu ambiente de desarrollo), sino solo manda el código fuente, omite los jars externos que estes usando (los de hibernate).

    ResponderEliminar
  15. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  16. Hola a todos¡¡¡
    Soy nuevo en esto de iReport,,mi problema es el siguiente:

    Estoy cargando datos en mi informe de iReport desde un archivo CSV(datos numericos),los cargo en forma de tabla y quiero que si el numero es mayor que 5 el cuadrado de la tabla sea verde y sino que sea rojo.a ver si alguien me puede ayudar pq no doy con la expresion correcta para acerlo.......

    Muxas Gracias y saludos a todos

    ResponderEliminar
  17. Hola, antes que nada te agradezco por este gran tutorial, es muy dificil encontrar informacion bien detallada sobre iReports, pero tengo un problema, solo me muestra el primer dato, es decir, deberia mostrarme 10 filas, pero me muestra solo 1, cual podria ser el error? gracias!!

    ResponderEliminar
  18. Amigo me podrias ayudar, el problema es que
    segui todos tus pasos , tengo todas las librerias
    que digistes, pero cuando genero el pdf, me sale con su titulo
    pero los datos estan en blanco, no sale nada de lo que esta en la banda digest.

    saludos.

    ResponderEliminar
  19. yo hago el mismo ejemplo que usted con las librerias y todo y me sale en blenco a que de debe esto?

    ResponderEliminar
  20. Ayuda, porfavor. Tengo un reporte con jasper, spring, y jpa, le paso una lista al jasper por medio de JRBeanCollectionDataSource, el problema es que necesito que el reporte despliegue otra lista que esta relacionada con esta primera. Como le puedo pasar a jasper multiples objetos o multiples listas y como las puedo mostrar con ireports.

    Gracias espero me puedan ayudar

    ResponderEliminar
  21. Hola Armando;

    Pues si lo que queires es regresar una lista relacionada con la primera, puedes hacer que cada objeto de tu colección regrese a su vez una lista con JRBeanCollectionDataSource. Como se muestra en la clase Alumno, aqui:

    http://javatutoriales.blogspot.com/2009/04/creacion-de-reportes-con-jasperrepots-y_18.html


    Para mostrar a su vez los datos de esa lista, puedes usar un subreporte, como se muestra ahi mismo.

    Espero que eso sea lo que estas buscando.

    Saludos

    ResponderEliminar
  22. Muy buen Tutorial, muchas gracias, ya te sigo en twitter

    ResponderEliminar
  23. Hola Teyin;

    Muchas gracias por tus comentarios.

    Solo una pregunta ¿cuál twitter?, si yo no tengo twitter jejejeje

    ResponderEliminar
  24. excelente la informacion,
    necesito ayuda!
    como muestro el reporte que he creado en el browser??
    uso netbeans 6.5 con framework ICEfaces, iReports 3.7.2, bdd SQl Anywhere, necesito ayuda urgente...
    Salu2

    ResponderEliminar
  25. hola gracias por postear esto, a mi me aparece el reportePDF vacio, es decir, me aparecen las cabeceras pero no los datos (participante1, nombre1, etc) que estoy haciendo mal?

    ResponderEliminar
  26. buenisimo el tutorial ensima paso a paso para los que no tenemos idea

    ResponderEliminar
  27. Hola,
    Tengo un problema al realizar un report en PDF. Éste contiene una varibale CLOB con formato HTML y me encuentro que no todos los tags HTML son reconocidos, como por ejemplo el de formato de tablas. ¿Alguien puede ayudarme o darme alguna idea?
    Gracias!

    ResponderEliminar
  28. Muchisimas gracias por este tutorial, me ha sido muy útil, en un sólo día he conseguido hacer lo que quería, y además de forma que me ha quedado muy profesional.
    Gracias de nuevo, espoero que te vaya muy bien.

    ResponderEliminar
  29. capo capo... mortal mortal....
    sos un groso, no sabes hace cuanto que venia buscando un tutorial asi...
    muchas gracias...

    ResponderEliminar
  30. Muchas gracias por aporte y sigan así publicando más cosas útiles e interesantes para nosotros los Java Programmers :D

    les mando un cordial saludo... y mis congratulaciones...

    ResponderEliminar
  31. Exelentes Tutoriales, no sabes cuanto me van a servir, gracias infinitas...

    por fa necesito presentar mi reporte dentro de mi aplicacion java, he intentado hacer lo que dice el tutorial 1 de pasar como parametro el JasperPrint al JasperViewer y a este agregarlo a un JPanel pero no he posido, el error solo sale al momento de ejecutarlo, el error es mas o menos asi:
    xception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
    at java.awt.Container.checkNotAWindow(Container.java:431)
    at java.awt.Container.addImpl(Container.java:1039)
    at java.awt.Container.add(Container.java:365)
    at jugadores.frmCode.(frmCode.java:23)
    at jugadores.Main.main(Main.java:52)

    por favor ayudame con este problema, muchas gracias por tu tiempo

    ResponderEliminar
  32. Hola, al correr la aplicacion me genera la siguiente excepcion:

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at net.sf.jasperreports.engine.util.JRLoader.(JRLoader.java:60)
    at jasper.Principal.main(Principal.java:32)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 2 more

    ya agregue la librería a la que hace referencia la excepcion, pero despues me lanza otra, y así sucesivamente


    aqui el pedazo de codigo del main

    JasperTutoDataSource datasource = new JasperTutoDataSource();

    for (int i = 1; i <= 10; i++) {
    JasperTuto p = new JasperTuto(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i);
    datasource.addParticipante(p);
    }

    JasperReport reporte = (JasperReport)JRLoader.loadObject("C:\\Users\\lavega\\Documents\\NetBeansProjects\\JasperReports\\report2.jasper");
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);
    //JasperPrint jasperPrint = JasperFillManager.fillReport("C:\\Users\\lavega\\Documents\\NetBeansProjects\\JasperReports\\report2.jasper", null, datasource);
    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF.pdf"));
    exporter.exportReport();

    ResponderEliminar
  33. Hola que tal, para los que le sale una hoja en blanco es porque en el metodo next() debe retornar al menos una vez "true", lo que yo hice fue declarar una variable int "i" en la clase y la inice en 0. Mi metodo next() lo deje asi:

    public boolean next() throws JRException {
    return ++i < 2;
    }

    ResponderEliminar
  34. Como puedo hacer para que iReport un Field crezca cuando la información ya no cabe dentro de esta, si la dejo con un espacio grande, se ve feo el espacio que sobra, pero si la dejo chica la información no cabe, alguien sabe como solucionarlo? Gracias de antemano

    ResponderEliminar
  35. Genial! Estoy leyendo los post y están buenísimos! felicidades =D

    ResponderEliminar
  36. Excelente el post, me funcionó de maravilla.

    Como debería ser al main para exportar a un archivo xls?

    Saludos cordiales

    ResponderEliminar
  37. Hola.. Me podrias ayudar con el tema de poder repetir los encabezados de mi reporte.. y Que se vea en todas las hojas del reporte en excel..

    los encabezados estan hechos en Static Text

    ResponderEliminar
  38. Hola gente! segui tal cual el tutorial.. pero con eclipse..

    me arroja todos esos errores..

    alguien le sucedio algo similar? podria explicarme como solucionarlo..

    muachas gracias!!



    Exception in thread "main" java.lang.ExceptionInInitializerError
    at Main.main(Main.java:21)
    Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) (Caused by org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException))
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
    at net.sf.jasperreports.engine.util.JRLoader.(JRLoader.java:60)
    ... 1 more
    Caused by: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)
    at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
    ... 5 more
    Caused by: java.lang.NullPointerException
    at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)
    ... 6 more

    ResponderEliminar
  39. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  40. Hola Programador Java, en primer lugar gracias por los tutoriales, están muy bien explicados. No se si todavía estás respondiendo a las consultas, igual te la mandó:
    Mi consulta es la siguiente que pasaría si en mi clase Participantes() en vez de tener los siguientes 4 campos " String nombre, String username, String password, String comentarios " modificamos el campo nombre y en vez de ser de tipo string ahora es de tipo Persona persona, osea que tiene sus propios atributos por ejemplo (String nombre, String apellido1, String apellido2, etc.)... y claro yo en el reporte debo pintar los campos de los Participantes más algunos de los campos persona.
    Que debo hacer?, crear otra clase auxiliar para Participante en la que añada los campos que necesito de la clase Persona ya que no puedo enviarlo así directamente para generar el reporte, o cuando hago la plantilla en iReport existe alguna manera de coger el valor algo así "persona.nombre".

    ResponderEliminar
  41. Hola una consulta, que pasaria si fue un atributo de una clase el objecto de otra por ejemplo.

    Tenes dos clases pais y ciudad.
    Entonces si tenemos
    public class Ciudad
    {
    private int id;
    private String nombre;
    private Pais pais;
    private String code;
    .....

    como representariamos el object pais en el reporte??? de que tipo??? el campo en el reporte


    gracias

    ResponderEliminar
  42. Programador!!.. sos una luz!!.. me fun,lciono perfecto.. use el BeanCollection.. pero gracias a esta implementacion me surgieron unas dudas..

    como puedo hacer un System.out.println() del arraylist??..

    Habría una forma de llenar un Jtable con el arraylist?.. desde ya gracias fueron muy utiles tus indicaciones..

    ResponderEliminar
    Respuestas
    1. me refiero a los arraylist beanCollection

      Eliminar
  43. solo unas palabras EXCELENTE ARTICULO

    ResponderEliminar
  44. Hola quiero crear una tabla para que los datos salgan mas organizados... Pero cuando la creo no se muy bien que paremetros agregar a la tabla y he hecho varios y me sale error.

    ResponderEliminar
  45. Hola si alguien me puede ayudar les agradecería mucho tengo una aplicación en java en donde quiero enviar varios parámetros tipo String y Date ya tengo en mi reporte los parámetros creados me funciona enviadoles con un solo tipo de variables pero ahora noc como enviar dos ; les agradecería mucho su ayuda xfavor:
    Este es el codigo :

    Map parametro1=new HashMap();
    Map parametro2=new HashMap();
    parametro2.put("estado", estado); //Un estado que esta en String
    parametro1.put("fi", a); //estoy enviando la fecha inicial
    parametro1.put("ff", b); // estoy enviando fecha final
    //Aki esta el llamdo y la conexion en parametros noc q enviar :
    bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),parametro,con.getConexion());

    ResponderEliminar
    Respuestas
    1. solo necesitas un Map, en el le especificas la clave ,valor parametro1.("clave", "valor"), tantos como necesites.

      Eliminar
    2. me parece que necesitas un poco mas de ayuda. Te dejo una parte de codigo que tengo en mi programa para mostrar por pontalla, adaptalo para que se guarde como pdf por lo que veo que quieres hacer.
      JasperReport jasperReport = (JasperReport) JRLoader.loadObject("ReportPrueba.jasper");

      Map parametros = new HashMap();
      parametros.put("numero_contrato", "001-CM/2012");
      parametros.put("fecha_revision", "23/07/2012");
      parametros.put("cliente", "EMPRESA TAL");
      parametros.put("direccion", "AVDA LA MARINA, 8");
      parametros.put("poblacion", "ESPAÑA");
      parametros.put("administrador", "NICOLAS");
      parametros.put("telefono", "956 11 22 33");
      parametros.put("tecnico", "NOMBRE APELLIDO");
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, new JRBeanCollectionDataSource(datosreporte));

      JasperViewer jviewer = new JasperViewer(jasperPrint,false);

      jviewer.show();

      Eliminar
  46. Hola, a ver si me puedes ayudar por favor. Imaginemos que he creado un reporte parecido al tuyo, donde se va llenando con los datos de los alumnos. Pues bien una vez terminado de rellenar los datos de alumnos, en la misma hoja porque los datos de los alumnos no ocupa mucho, quiero poner los datos de..... digamos sucursales de bancos en la ciudad, como veras no estan relacionados para nada unos datos con los anteriores, pero no se como podria hacer para mostrarlos ya que no puedo agregar otra banda de header columns para poner la cabecera de los datos. Muchas gracias de antemano.

    ResponderEliminar
  47. hola yo manejo reportes para una factura y me gustaria saber si sabes como hacer que una banda tenga una altura estatica es decir q si el resultado de mi consulta da 1 resultado la banda se quede con la misma altura, ya que si el resultado son 30 parametros se hacen dos o tres hojas con los datos y yo solo los quiero en una me gustaria saber si me puedes ayudar te dejo mi correo yugiyugi21@live.com

    ResponderEliminar
  48. Hola excelente tutorial. Estoy probando la segunda opción que mencionas pero me funciona. este es el código:
    Esta creada la clase participante con lo indicas.
    Participante p = new Participante(fecha,hora ,ippublica , ipinterna , usuario);
    listaPariticipantes.add(p);
    agrega sin problemas. Pero al mostrar el report
    JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte.jasper");
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

    Este es el error:
    net.sf.jasperreports.engine.JRException: Error retrieving field value from bean :
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
    at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)
    at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:922)

    ResponderEliminar
  49. Hola he seguido su tutorial que me fue de mucha ayuda! pero tengo un inconveniente!

    En mi apliacion he creado el DataSource (q a diferencia del tutorial no es de varias lineas sino una sola, es decir que no tengo lista, no creo que tenga incombenientes mayores con eso: solo cambie como devuelve la informacion por ejemplo:
    "..}else if("constatacion_ObservChequeoElectrico".equals(jrf.getName())){
    valor = constatacion.getObsChequeoElectrico();
    }"
    Creo que he controlado todo..

    Pero tengo un problema cuando llamo al reporte..
    segun un parametro que paso creo instancio el DataSource y lo hace perfectamente con la info que deberia tener..

    Recupero la ruta donde se encuentra mi reporte en el proyecto:
    URL rutaRep = this.getClass().getResource("reporteConstataciones.jasper");
    JasperReport masterReport = null;
    try {
    JRLoader.loadObject("reporteConstataciones.jasper");
    masterReport = (JasperReport) JRLoader.loadObject(rutaRep);
    }
    catch (JRException e)
    {
    System.out.println("Error cargando el reporte maestro: " + e.getMessage());
    System.exit(3);
    }
    --> hasta ahi todo perfecto por qu eno me tira ninguna excepcion;

    pero cuando paso a la siguiente instruccion:
    JasperPrint jasperPrint = JasperFillManager.fillReport(masterReport,null,datasourceConst);

    me tira un mesaje que corta la ejecucion "Mensaje de Error: null" obviamente no me es nada representativo.

    si pudieran ayudarme para ver por donde buscar el error por lo menos.. gracias!

    ResponderEliminar
  50. He probado que poniendo en EmptyDaraSource me muestra el reporte vacio: JasperPrint jasperPrint = JasperFillManager.fillReport(masterReport,null,new JREmptyDataSource())
    Supongo que el problema esta en mi DataSource:
    public class ConstatacionDataSource implements JRDataSource{
    private ConstatacionReporte constatacion;
    private int indiceConstacionActual = -1;

    public boolean next() throws JRException {
    return ++indiceConstacionActual<1; }

    public Object getFieldValue(JRField jrf) throws JRException {
    Object valor = null;
    if("constataciones_NroConstatacion".equals(jrf.getName())){ valor=constatacion.getNroConstatacion();
    }else if ("constataciones_CantidadCombustible".equals(jrf.getName())){ valor=constatacion.getCantidadCombustible();
    }else if("constataciones_kmRegistrado".equals(jrf.getName())){ valor=constatacion.getKmRegistrado();
    }else if("turnos_NroTurno".equals(jrf.getName())){ valor=constatacion.getNroTurno();
    }else if("turnos_FechaTurno".equals(jrf.getName())){ valor=constatacion.getFechaTurno();
    }else if("turnos_FechaSalida".equals(jrf.getName())){ valor=constatacion.getFechaSalida();
    }else if("turnos_Observaciones".equals(jrf.getName())){ valor=constatacion.getOservacion();
    }else if("choferes_NroLegajo".equals(jrf.getName())){ valor=constatacion.getNroLegChofer();
    }else if ("choferes_Apellido".equals(jrf.getName())){ valor=constatacion.getApellidoChofer();
    }else if("choferes_Nombre".equals(jrf.getName())){ valor=constatacion.getNombreChofer();
    }else if("choferes_DNI".equals(jrf.getName())){ valor=constatacion.getDNIChofer();
    }else if("choferes_CUIT".equals(jrf.getName())){ valor=constatacion.getCUITChofer();
    }else if("equipos_Dominio".equals(jrf.getName())){valor= constatacion.getDominioEq();
    }else if("equipos_ModeloAnio".equals(jrf.getName())){ valor=constatacion.getAnioEq();
    }else if("equipo_Combustible".equals(jrf.getName())){ valor= constatacion.getCombustibleEq();
    }else if("equipos_NroMotor".equals(jrf.getName())){ valor = constatacion.getNroMotorEq();
    }else if("equipos_NroChasis".equals(jrf.getName())){ valor = constatacion.getNroChasisEq();
    }else if("equipos_TipoTraccion".equals(jrf.getName())){ valor= constatacion.getTipoTracEq();
    }else if("marcas_motor_NombreMarca".equals(jrf.getName())){ valor = constatacion.getMarcaMotorEq();
    }else if("tiposdeequipos_DescripcionTipoEquipo".equals(jrf.getName())){ valor = constatacion.getTipoEq();
    }else if("tiposdeequipos_CodigoTipoEquipo".equals(jrf.getName())){ valor = constatacion.getCodTipoEq();
    }else if("marcas_chasis_NombreMarca".equals(jrf.getName())){ valor = constatacion.getMarcaChasisEq();
    }else if("marcas_NombreMarca".equals(jrf.getName())){ valor= constatacion.getMarcaEq();
    }else if("dependencias_DescripcionDependencia".equals(jrf.getName())){ valor = constatacion.getOfiEq();
    }else if("jurisdicciones_descripcionJurisdiccion".equals(jrf.getName())){ valor = constatacion.getJurisEq();
    }else if("turnos_FechaEntrada".equals(jrf.getName())){ valor = constatacion.getFechaEntrada();
    }else if("delegacion".equals(jrf.getName())){ valor= constatacion.getDelegacion();
    }
    return valor;
    }
    public void setConstatacion (ConstatacionReporte consta){ this.constatacion = consta; }
    ----
    ese es el codigo es un poco distinto al ejemplo por que no son lineas presisamente lo que tendo que mostrar.. sino que son datos de una constatacion... para la que cree una clase especial con los setters y getters que utilizo en la clase del datasource

    ResponderEliminar
  51. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  52. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  53. Disculpen porque me sale una linea por pagina en el reporte??????????????????????, si alguien responde, saludos.

    ResponderEliminar
  54. hola! estoy trabajando con una base de datos mysql y netbeans y mi problema es que quiero hacer un reporte al cual quiero pasarle como parametros ciertos campos como por ejemplo el id_cliente ingresandolo desde un jtextfield en un jframe.. y que en el reporte me de todos los datos del cliente al cual le corresponda el id_cliente que se ingreso..

    ResponderEliminar
  55. Hola, estoy tratando de hacer un reporte web con eclipse helios y apache toncat 7.0
    segui los mismo pasos del netbeans, pero al moonto de correr la aplicacion web, se queda detenido la pagina, cargando el archivo pdf en la pagina index.jsp.
    No se que podria ser.
    Parece ser que no se puede hacer reportes en la web con ide Eclipse.
    Saludos cordiales.

    ResponderEliminar
  56. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  57. Una consulta, Como puedo hacer para que en un reporte de Excel no me muestre la paginación?

    ResponderEliminar
  58. en el directorio raiz no se genera el reporte,Sale el siguente error:
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
    at net.sf.jasperreports.web.util.WebResourceHandlersExtensionRegistryFactory.(WebResourceHandlersExtensionRegistryFactory.java:47)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForRealName(JRClassLoader.java:157)
    at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:115)
    at net.sf.jasperreports.engine.util.ClassUtils.instantiateClass(ClassUtils.java:53)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.instantiateRegistry(DefaultExtensionsRegistry.java:237)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:214)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:162)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getRegistries(DefaultExtensionsRegistry.java:133)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:105)
    at net.sf.jasperreports.engine.util.JRStyledTextParser.(JRStyledTextParser.java:83)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:123)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
    at ParticipantesDataSource.main(ParticipantesDataSource.java:63)
    Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletOutputStream
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 21 more
    Java Result: 1

    ResponderEliminar
  59. hola :3 , antes que nada ... FELICIDADES !!, tu forma de explicar , tu paciencia para crearlo , es de admirarse, MUCHAS FELICIDADES !! ... Me encantaron tus tutoriales amigo ;) .
    Quisiera saber su podrias ayudarme!! ; Mira ya hice el de conexion a BD y el de este igual !! , pero AMBOS me manda este msj:
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
    at net.sf.jasperreports.web.util.WebResourceHandlersExtensionRegistryFactory.(WebResourceHandlersExtensionRegistryFactory.java:47)
    at net.sf.jasperreports.web.util.WebResourceHandlersExtensionRegistryFactory.(WebResourceHandlersExtensionRegistryFactory.java:47)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForRealName(JRClassLoader.java:157)
    at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:115)
    at net.sf.jasperreports.engine.util.ClassUtils.instantiateClass(ClassUtils.java:53)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.instantiateRegistry(DefaultExtensionsRegistry.java:237)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:214)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:162)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getRegistries(DefaultExtensionsRegistry.java:133)
    at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:105)
    at net.sf.jasperreports.engine.util.JRStyledTextParser.(JRStyledTextParser.java:83)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:123)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
    at pruebas.reportes.jasperreports.datasource.Main.main(Main.java:64)
    Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletOutputStream
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 21 more

    YO CREO que el error esta en la linea :
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

    Al igual que en tu proyecro UNO !! (Conexion a BD) ... me marca en esat linea :(
    ...
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conexion);

    Podrias explicarme que hacer ? ... MUCHAS GRACIAS !! . Mi correo es : ariel_lldm@hotmail.com

    ResponderEliminar
  60. tengo este error:
    net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: C:\netBeansProyects\ProyectoEmpresaEelectrica\target\workflowElectrica-1.0-SNAPSHOT\reportes\null.jrxml (El sistema no puede encontrar la ruta especificada)
    java.io.FileNotFoundException: C:\netBeansProyects\ProyectoEmpresaEelectrica\target\workflowElectrica-1.0-SNAPSHOT\reportes\null.jrxml (El sistema no puede encontrar la ruta especificada)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:172)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:152)
    at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:150)
    at bpm.reportes.clases.servletReportPE.processRequest(servletReportPE.java:62)
    at bpm.reportes.clases.servletReportPE.doGet(servletReportPE.java:95)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
    Caused by: java.io.FileNotFoundException: C:\netBeansProyects\ProyectoEmpresaEelectrica\target\workflowElectrica-1.0-SNAPSHOT\reportes\null.jrxml (El sistema no puede encontrar la ruta especificada)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.(FileInputStream.java:146)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:167)
    ... 26 more

    ResponderEliminar
  61. Hola, soy nuevo utilizando jasper report.

    Me he detenido con el siguiente problema, tengo una base de datos en mysql con 5 tablas connectada a una aplicacion en java la cual ejecuto un query como datasource en el jasperreport para generar un reporte. Mi problema radica en que no he podido obtener todos los datos en una sola consulta para alimentar dicho reporte.

    Que me sugieres utilizar como datasource.

    ResponderEliminar
  62. Este es el codigo que tengo:

    package reporteconexion;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import net.sf.jasperreports.engine.JRExporter;
    import net.sf.jasperreports.engine.JRExporterParameter;
    import net.sf.jasperreports.engine.JasperFillManager;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.engine.JasperReport;
    import net.sf.jasperreports.engine.export.JRPdfExporter;
    import net.sf.jasperreports.engine.util.JRLoader;

    public class ReporteConexion {


    public static void main(String[] args) throws Exception
    {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebareportes", "root", "");

    // JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte1.jasper");
    JasperReport reporte = (JasperReport) JRLoader.loadObject("C:\\Documents and Settings\\EQUIPO 1\\Mis documentos\\NetBeansProjects\\ReporteConexion\\reporte1.jasper");
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conexion);
    JRExporter exporter = new JRPdfExporter();

    exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE,new java.io.File("reportePDF.pdf"));
    exporter.exportReport();
    }
    }

    Este es el error que me sale al compilarlo :

    Exception in thread "main" net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: C:\Documents and Settings\EQUIPO 1\Mis documentos\NetBeansProjects\ReporteConexion\reporte1.jasper
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:110)
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:99)
    at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromFile(JRLoader.java:90)
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:81)
    at reporteconexion.ReporteConexion.main(ReporteConexion.java:32)
    Caused by: java.io.FileNotFoundException: C:\Documents and Settings\EQUIPO 1\Mis documentos\NetBeansProjects\ReporteConexion\reporte1.jasper
    ... 5 more
    Java Result: 1

    No encuentro la solucion, por favor aclarame la duda

    ResponderEliminar
    Respuestas
    1. creo que ya lo debes haber resuelto, pero bueno, para mi la excepión la envía porque hay un error de sintaxis en la ruta en donde busca el archivo.
      Saludos.

      Eliminar
  63. Hola me podrias ayudar en como llenar tablas, realice tu mismo ejemplo en mi proyecto pero debo llenar tablas como una factura Gracias

    ResponderEliminar
  64. Gracias, muchas gracias, estoy incursionando en los informes con JasperReport (con Java en si) y este instructivo me sirvió muchísimo.

    ResponderEliminar
  65. Amigo me parece excelente tu tutorial solo que para estas fechas hay un problema y es que al parecer el JRloader está en desuso es decir deprecated y aparece tachado en netbeans y a mi al menos me da error y no me deja compilar, me gustaría seguir este excelente tutorial pero como soy novato no se qué hacer o cómo usar las librerías Jasper o cómo se hace ahora para llenar el reporte sin el JRloader.

    ResponderEliminar
  66. mira es aquí donde tengo el problema:

    JasperReport reporte= (JasperReport) JRLoader.loadObject("report2.jasper");
    JasperPrint jasperPrint= JasperFillManager.fillReport(reporte, null, datasource);

    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF.pdf"));

    ResponderEliminar
  67. Disculpa como podria adicionar los groups utilizando el data source, algunos templates del ireport tienen esa funcionalidad, gracias de antemano

    ResponderEliminar
  68. Hola gracias por tu ayuda. Desde el primer tutorial tengo este error
    java.lang.NullPointerException
    at org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord.loadDgmInfo(GeneratedMetaMethod.java:163)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:230)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.(MetaClassRegistryImpl.java:92)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.(MetaClassRegistryImpl.java:70)
    at groovy.lang.GroovySystem.(GroovySystem.java:33)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:162)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:192)
    at reporte2_1413247323537_639462.$getStaticMetaClass(calculator_reporte2_1413247323537_639462)
    at reporte2_1413247323537_639462.(calculator_reporte2_1413247323537_639462)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at java.lang.Class.newInstance(Class.java:433)
    at net.sf.jasperreports.engine.design.JRAbstractJavaCompiler.loadEvaluator(JRAbstractJavaCompiler.java:112)
    at net.sf.jasperreports.engine.design.JRAbstractCompiler.loadEvaluator(JRAbstractCompiler.java:340)
    at net.sf.jasperreports.engine.JasperCompileManager.getEvaluator(JasperCompileManager.java:378)
    at net.sf.jasperreports.engine.fill.JRFillDataset.createCalculator(JRFillDataset.java:462)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:405)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:89)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:104)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:62)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984)
    at Arranca.main(Arranca.java:25)

    Creo que es cuando lleno el reporte con datos, esta es mi clase main
    public static void main(String[] args) throws Exception
    {
    List listaPariticipantes = new ArrayList();

    for (int i = 1; i <= 10; i++)
    {
    Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i);
    listaPariticipantes.add(p);
    }
    JasperReport reporte = (JasperReport) JRLoader.loadObjectFromFile("reporte2.jasper");
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF.pdf"));
    exporter.exportReport();
    }
    ya me duele todo de intentar solucionarlo, me podrías ayudar porfavor

    ResponderEliminar
  69. Buenos Tutos, queria saber porque me sale este error

    Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError
    at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:121)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:849)
    agradesco tu repuesta, gracias

    ResponderEliminar
  70. Buenos Tutos, queria saber porque me sale este error

    Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError
    at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:121)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:849)
    agradesco tu repuesta, gracias

    ResponderEliminar
  71. Hola! Buenos días/tardes/noches

    Gracias de antemano por los tutoriales muy buenos.

    Quisiera saber como se hace conexiones a multiples datasources en iReport Gracias!
    Ya que quiero de un reporte sacar un subreporte, y ese subreporte este conectado a una DB diferente al reporte principal.

    Se debe bajar algún jar de conexión? que se debe hacer? :/

    GRACIAS!!!!

    ResponderEliminar
  72. Hola que tal, tengo un problema con la creación de mis reportes, si me pudieras ayudar.
    log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
    log4j:WARN Please initialize the log4j system properly.
    estos son los errores que me arroja.
    gracias!

    ResponderEliminar