lunes, 13 de abril de 2009

Creación de Reportes con JasperRepots y iReports - Parte 5: Gráficas en Reportes

Visita la parte 1 de este tutorial: Reportes con Conexión a Bases de Datos
Visita la parte 2 de este tutorial: Usando DataSources Personalizados
Visita la parte 3 de este tutorial: Parámetros y Variables
Visita la parte 4 de este tutorial: Reportes en aplicaciones web
Visita la parte 6 de este tutorial: Grupos
Visita la parte 7 de este tutorial: Subreportes

Algunas veces es más fácil entender la información cuando se nos presenta en una imagen. En el caso de los datos, cuando estamos haciendo comparaciones, lo más fácil es visualizarlos en una gráfica de barras o en una gráfica de pie o pastel. En este tutorial mostraré cómo podemos colocar gráficas en nuestros reportes para hacer comparaciones de un conjunto de datos.


Para este ejemplo los datos que graficaremos son las ventas de consolas de última generación (Wii, XBox360, y PS3). Tomaremos estos datos de VG Chartz que, aunque no son cifras oficiales, mantiene sus datos actualizados. En el momento de escribir este tutorial las ventas van:
  • Wii: 48.79% para nosotros será 49%
  • XBox 360: 29.63% para nosotros será 30%
  • PS3: 21.57% para nosotros será 21%
Nota: Recientemente han aparecido las versiones 3.5 de JasperReports y iReports, por lo que comenzaré a usarlos a partir de este tutorial. La configuración de la biblioteca JasperReports que creamos en este tutorial y el uso de iReport para lo que hemos hecho hasta ahora es igual, por lo que todo lo que hemos hecho servirá.

Bien, para comenzar crearemos un nuevo proyecto Java standalone en NetBeans (File -> New Project... -> Java -> Java Application), le asignamos un nombre (que en mi caso será ReporteGrafica) y presionamos el botón "Finish" para que el nuevo proyecto se genere y veamos en el editor nuestra clase Main.

Agregamos al nodo "Libraries" de nuestro proyecto la biblioteca "JasperReports" que creamos en la primer parte del tutorial y el jar "commons-logging-1.1.1.jar",como lo hemos venido haciendo hasta ahora.

Adicionalmente debemos agregar dos jars más que nos permitirán generar las gráficas. Puesto que JasperReports hace uso de JFreeChart para generar las gráficas debemos agregar dos de sus jars: jfreechart.jar y jcommon.jar. Si bajaron JasperReports en el archivo .zip que contiene las bibliotecas de soporte entonces ya tienen estos jars (que se encuentran en el directorio lib del .zip anterior), solo deben agregarlos al nodo "Libraries" del proyecto.

Ahora necesitamos, como en los casos anteriores, una clase cuyas instancias mantendrán los datos que mostraremos en el reporte. En este caso, como estamos hablando de consolas, creo que lo más adecuado es que esta sea una clase "Jugador". Así que agreguemos esta clase a nuestro proyecto.

Esta clase tendrá tan solo tres atributos: un id (que en este caso podría no ser necesario, pero es para no perder la costumbre, cuando veamos algo de Hibernate veremos que es mejor acostumbrarnos desde el prinicpio a poner este id), un nombre para distinguir al usuario, y el nombre de la consola que tiene (que es el dato que nos interesa para crear la gráfica).

El código de la clase Jugador queda de la siguiente forma:
public class Jugador
{ 
    private int id; 
    private String nombre; 
    private String consola;  

    public Jugador(int id, String nombre, String consola) 
    { 
        this.id = id; 
        this.nombre = nombre; 
        this.consola = consola; 
    }  

    public String getConsola() 
    { 
        return consola; 
    }  

    public void setConsola(String consola) 
    { 
        this.consola = consola; 
    }  

    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; 
    } 
}
El código de la clase Main es el código estandar que hemos estado usando en esta serie de tutoriales de JasperReports, con excepción de la parte en la que se crean los Jugadores. En este caso usaremos tres ciclos, uno para cada consola. Por lo que esta parte del código queda más o menos así (listaJugadores es una lista de objetos Jugador):
for (int i = 1; i <= 49; i++)   
{       
    listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii"));   
}    

for(int i = 50; i <= 79; i++)   
{       
    listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox"));   
}    

for(int i = 80; i <= 100; i++)   
{       
    listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3"));   
}
Ahora abriremos el iReport y comenzaremos con el diseño de nuestro reporte. El nuevo iReport (3.5.0) muestra los menús en el mismo idioma que nuestro sistema operativo, que en mi caso es español, por lo que apartir de ahora colocaré los nombres de las opciones y los menús en español (en el caso en el que los muestre así, si alguno se muestra en inglés colocaré el nombre en inglés).

Creamos un nuevo reporte vacio llendo al menú Archivo -> New... -> Empty Report. En la ventana que se abre colocamos el nombre de nuestro reporte (reporteGrafica.jrxml) y lo guardamos en el directorio raíz de nuestro proyecto de NetBeans:


Comencemos colocando un título y los encabezados de nuestras columnas de datos usando textos estáticos, así como los fields para los datos que obtendremos de cada uno de los objetos Jugador (id, nombre, y consola) de la misma forma que lo hicimos en este tutorial (no olviden guardar de forma constante sus avances para no perder su trabajo):


Ahora vienen los pasos interesantes. Primero debemos crear un grupo. Un grupo nos permite tratar de forma especial un conjunto de datos que se encuentran asociados (es como un group by en SQL). Además, al crear un grupo se genera también una variable que mantiene el conteo de los elementos de cada grupo (como si hicieramos un count sobre los elementos de los grupos en SQL).

En este caso el grupo que nos interesa es el de las consolas.

Si estuvieramos usando consultas SQL obtener estos datos sería sencillo. Es más, si hubieramos creado nuestro reporte usando el "Report Wizard" podríamos haber creado el grupo que nos interesa desde ahi. Pero como estamos usando un DataSource propio, tenemos que agregar el grupo a mano. Afortunadamente es muy sencillo agregar grupos desde iReport. Lo único que debemos hacer es click derecho sobre el nodo "report name" (la raíz de los elementos del proyecto) en el panel "Report Inspector". Con esto se abrirá un menú contextual. De este seleccionamos el elemento "Add Report Group":



Al hacer esto se abrirá la ventana del "Group Wizard". En esta colocamos el nombre del grupo, en este caso será CONSOLAS, y en el campo "Group by the following report object:" seleccionamos el field "consola" que creamos anteriormente. Con esto conseguiremos que el nuevo grupo que se creará se haga con respecto al valor del atributo "cosola" de nuestros objeto "Jugador".


Presionamos el botón "Siguiente >" y se nos mostrarán dos radio buttons preguntando si quieremos agregar la cabecera (header) y el pie de pagina (footer) del grupo. Nosotros deseleccionamos estas opciones (se encuentran seleccionadas por default) ya que no nos interesa agregar ninguno de estos elementos. Para terminar presionamos el botón "Finalizar" y ya tendremos agregado nuestro grupo ^-^.

No es muy obvio el que este grupo existe, de hecho los unicos indicadores que tenemos son que se han agregado en la zona de las bandas del "Report Inspector" dos nuevas bandas: "CONSOLAS Group Header" y "CONSOLAS Group Footer", además se ha agregado una variable llamada "CONSOLAS_COUNT", que es la variable que nos interesa y por la que hemos creado el grupo, que mantendrá el número de jugadores que tienen cada una de las consolas:


Ahora agregaremos nuestra gráfica. Para eso arrastraremos desde la Paleta de elementos del reporte un "Chart" y lo colocamos en la banda "Summary" (ajusten el tamaño de la banda para que la gráfica se vea bien).


Al arrastrar la gráfica se abrirá una nueva ventana preguntándonos qué tipo de gráfico queremos mostrar. En este caso seleccionaremos el gráfico de pie o de pastel (la primer o segunda opción):


Presionamos el botón "OK" y la gráfica se agregará a nuestro reporte, ajustenla para que abarque toda el área de la banda.


Lo último que haremos es configurar la gráfica para que obtenga los datos de los campos y variables que nos interesa mostrar. Para esto, hacemos click derecho sobre la gráfica, con lo que se abrirá un menú contextual. En este menú seleccionamos la opción "Chart Data".


Con lo que se abrirá una nueva ventana, y en esta ventana seleccionamos la pestaña "Details". En esta pestaña configuraremos tres valores:
  • Key expression
  • Value expression
  • Label expression
Nota: Dependiendo del tipo de gráfica que estemos haciendo puede que debamos agregar más valores, pero para los gráficos de pie solo son necesarios estos.

La "Key expression" dice cuál será la base que se usará para cada uno de las piezas de la gráfica. En nuestro caso queremos que cada trozo muestre las consolas. Por lo que colocamos como valor $F{consola}.

La "Value expression" dice cuál será el tamaño de cada una de las piezas de la gráfica. Nosotros queremos que cada pieza sea equivalente al número de consolas que se han comprado. Por lo que colocamos como valor $V{CONSOLAS_COUNT}.

Label expression es la etiqueta que se mostrará para cada valor. Nosotros queremos mostrar el nombre de la consola junto con el número de unidades que se han vendido de cada una. Por lo que colocamos como valor $F{consola} + " - " + $V{CONSOLAS_COUNT}. Lo cual colocará como valor el nombre de la consola, concatenándole el signo " - " y concatenándole el número de consolas vendidas (el número de jugadores que han comprado cada una de las consolas).

Esta ventana queda de la siguiente forma:


Presionamos el botón "Close" y hemos terminado con nuestro reporte. Cambiamos a la vista "Preview" para compilar el reporte. No se nos mostrará nada del reporte final. De hecho los regresará a la vista del "Designer" y mostrará una excepción en la ventana de salida indicando algo así: "Key is null in pie dataset". Esto es normal ya que la gráfica no puede generarse ya que no existen datos. Lo importante es que se haya generado el archivo "reporteGrafica.jasper".

Ahora ejecutamos nuestra aplicación, con lo que debe generarse nuestro reporte en PDF y debemos ver, al final del reporte, la siguiente gráfica:

Con lo que comprobamos la gráfica se ha creado correctamente ^-^.

Finalmente este es el codigo de la clase Main (omitiendo los imports):
public class Main 
{ 
    public static void main(String[] args) throws Exception 
    {    
        List listaJugadores = new ArrayList();     

        for (int i = 1; i <= 49; i++)    
        {        
            listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii"));    
        }     

        for(int i = 50; i <= 79; i++)    
        {        
            listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox"));    
        }     

        for(int i = 80; i <= 100; i++)    
        {        
            listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3"));    
        }     

        JasperReport reporte = (JasperReport)JRLoader.loadObject("reporteGrafica.jasper");    
        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaJugadores));     

        JRExporter exporter = new JRPdfExporter();    
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);    
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("reporte grafica.pdf"));     

        exporter.exportReport(); 
    } 
}



Bueno, espero que les sea de utilidad. No olviden dejar sus comentarios, dudas y sugerencias.

Saludos y gracias.

Visita la parte 1 de este tutorial: Reportes con Conexión a Bases de Datos
Visita la parte 2 de este tutorial: Usando DataSources Personalizados
Visita la parte 3 de este tutorial: Parámetros y Variables
Visita la parte 4 de este tutorial: Reportes en aplicaciones web
Visita la parte 6 de este tutorial: Grupos
Visita la parte 7 de este tutorial: Subreportes

44 comentarios:

  1. Hola, tengo un problema al intentar mostrar un ganttChart en la web. Te cuento, he realizado muchos reportes, todo bien, con tomcat 6.0, ireport 3.1 y jasperreport 3.1.3... Pero, el gantt lo pinta bien en ireport, pero al cargar la aplicacion web entonces me da el siguiente error
    Element ganttChart no defined.

    Q puedo hacer??

    ResponderEliminar
  2. Hola;

    Segun los foros de JasperReports parece que hay problemas con la ganttChar en algunos sistemas operativos y con algunas versiones anteriores de JasperReports (por alguna razón que desconozco). ¿Por qué no pruebas actualizar a la última versión tanto de iRepor como de JasperReport?

    Saludos.

    ResponderEliminar
  3. Hola, estoy intentando insertar un gráfico y no puedo, me sale un error de compilación; lo que pretendo es mostrar en un gráfico, la cantidad de personas que son estudiantes, profesores, prospectos e interesados de determinada institución educativa.
    Espero ke me puedan ayudar
    muchas gracias de antemano

    ResponderEliminar
  4. Hola, ¿podrías decirme que error es el que te sale y tal vez poner parte del código que estas usando y platicar un poco de lo que estas haciendo en el iReport?

    Saludos

    ResponderEliminar
  5. Hola, por favor me puedes ayudar con una duda de los reportes.

    Yo tengo un código de java que llama a un reporte, pero al cerrar el reporte(una vez que ya se abrió), me cierra toda la aplicación, mi pregunta es como puedo evitar esto,la aplicación es stand alone

    ResponderEliminar
  6. Hola Vero;

    ¿Qué componente estas usando para mostrar tu reporte (un JasperViewer, un JRViewer), y estas creando tu misma el método para cerrarlo, o en su defecto, estas usando el metodo setDefaultCloseOperation (en caso de que aplique)?

    Saludos

    ResponderEliminar
  7. Hola, estoy usando el JasperViewer para mostrar el reporte para cerrarlo se utiliza el método que ya tiene implementada la clase JasperViewer, no utilzo el setDefaultCloseOperation

    ResponderEliminar
  8. Hola Vero;

    Me imagino que para crear el JasperViewer estas usando este constructor:

    JasperViewer(JasperPrint jasperPrint)

    Podrías probar usando este otro:

    JasperViewer(JasperPrint jasperPrint, boolean isExitOnClose)

    En el segundo parámetro le pasas un false indicando que quieres que no cierre la aplicación al salir. Con eso debería funcionar.

    Si estas usando otro constructor puedes ver en esta página:

    http://jasperreports.sourceforge.net/api/net/sf/jasperreports/view/JasperViewer.html#JasperViewer(net.sf.jasperreports.engine.JasperPrint)

    Para ver si el que usas está sobrecargado para recibir el isExitOnClose.

    Saludos

    ResponderEliminar
  9. Mil gracias por la ayuda Alex la solución a mi problema era
    JasperViewer jviewer = new JasperViewer(jasperPrint,false);
    jviewer = new JasperViewer(jasperPrint,false);
    jviewer.setTitle("Reporte de la Orden De Trabajo");
    jviewer.setVisible(true);


    Las 2 últimas lineas eran necesarias porque sin ellas simplemente el boolean en el constructor no funciona, raro no?

    ResponderEliminar
  10. Hola capo muy bueno tu blog. Supongamos que tenés un reporte que tiene la consulta en el xml. Suponete que esta consulta tiene multiples joins digamos una tabla persona y una tabla domicilio. Una persona tiene dos domicilios entonces quiero mostrar la persona una vez y sus dos domicilios meterlos en una única celda contigua:
    | NOMBRE | DOMICILIO | TELEFONO | ...

    ¿Sabés si jasper te lo permite hacer o debo pasarle un data source donde yo ya agrupe las filas previamente?
    Gracias!

    ResponderEliminar
  11. Hola polo;

    Pues podrías crear un grupo en el que coloques a las personas y de ahi obtenfas información sobre sus domicilios, o también podrías hacerlo con un subreporte que tal vez sea más fácil.

    Saludos.

    ResponderEliminar
  12. Hola todos, tengo un problema que no se como solucionar. Hice una aplicacion que al presionar un boton muestra un reporte. la aplicacion esta hecha en eclipse y utilizo como gestor de reportes el IReport cuando corro la aplicacion desde el IDE anda 10 puntos. El problema es cuando genero el .JAR que contiene la aplicacion. Me da error "Could not find main-class". he revisado el mainfest y contiene el nombre de la clase que tiene el main. Revise el .JAR y tiene todos los archivos .JAR necesarios para utilizar el reportel. Intente Rastrear el error y encontre que si comento las lineas que realizan la exportacion a PDF del reporte,el error no sucede. Alguna idea de que puede ser?

    ResponderEliminar
  13. Hola Matias;

    Puedes probar ejecutando la aplicación desde la línea de comandos o consola con el comando

    java -jar TuArchivo.jar

    y con eso ver si te arroja alguna excepción.

    Lo que se me ocurre que puede estar sucediendo es que no encuentre tu archivo .jasper y por eso haya algún error.

    Saludos

    ResponderEliminar
  14. Alex, hice lo que me pediste y medio una excepcion, en la exportacion. dice que no encuentra la clase: net.sf.jasperreports.engine.JRExporter. Lo raro es que esta clase aparentemente esta dentro del jasperReport.jar

    ResponderEliminar
  15. Hola... yo de nuevo. Alex sigo lidiando con el bendito reporte de jasper. Te cuento que fui esquivando los problemas pero llegue a uno que no se como solucionar. Te repito las condiciones en las que estoy desarrollando.

    IDE: Eclipse
    JasperReport: 3.6.2 (es el ultimo que hay en la web de jasper)

    Resulta que corro el aplicativo desde el IDE y anda bien. Luego cuando exporto todo a un jar no me anda me da erro java.lang.NoclassDefError net/sf/jasperreport/engine/JasperFillManager.

    Lo obvio seria pensar que no esta la libria incluida en el .JAR pero descomprimo el archivo generado y contiene el jasperReport-3.6.2 que es el jar que contiene la clase del error. Alguna idea de que puede llegar a ser?

    ResponderEliminar
  16. Hola Matias;

    Si te entiendo bien, lo que tienes son los jar de jasperReports dentro de tu jar principal, ¿no es así?.

    En realidad esto no lo debes manejar así, no es posible que la maquina virtual encuentre clases que se encuentran en jars dentro de jars, es decir, no puede buscarlos de forma recursiva.

    Para esto tienes dos opciones:

    1 - Sacar los jars y ejecutar tu aplicación con el comando java -cp "TotosTusJarsSeparadosPor;.jar" -jar TuJar.jar

    2 - Extraer todas los paquetes de tus jars y colocarlos en el código fuente de tu aplicación, de esta forma cuando se genere tu jar principal estos estarán "descomprimidos" dentro de tu aplicación, y de esta forma ya podrán ser encontrados por la máquina virtual.

    Espero que esto te ayude a resolver tu problema, si no no te preocupes, seguimos buscando hasta que funcione.

    Saludos

    ResponderEliminar
  17. Hay Alex, espero funcione!!!! hace una semana que estoy dando vueltas con esto. voy a probar con el segundo metodo que me planteasa ver que sucede.

    Por casualidad hay alguna sentencia que me permita incluir todos los .JARs en una carpeta, asi no tengo que incluirlos uno x uno ?

    ResponderEliminar
  18. Hola Matias;

    Pues depende del sistema operativo en el que estes, pero un jar es basicamente un zip con una extensión diferente. Si estas en algún Unix, puedes usar el comando unzip, si estas en Windows no estoy muy seguro si se pueda por linea de comandos, supongo que debe poderse, pero si no tendrás que hacerlo con el winzip o algún otro que tengas.

    Saludos

    ResponderEliminar
  19. Alex te cuento lo que hice...

    primero que nada te comento que la aplicacion de prueba la pruebo en un windows XP. Cree una carpeta que se llama sisteam. Dentro de esta puse el prueba.jar(que es el archivo generado por mi) y puse dentro de la misma el archivo jasperreport-3.6.2.jar.
    Abri la consola, me pare dentro de la carpeta sistema y puse asi:

    java -cp "jasperreport-3.6.2;" -jar prueba.jar

    tambien probe sin las comillas, pero el resultado es el mismo :_(

    ResponderEliminar
  20. Hola Matias;

    Creo que tal vez no se entendió bien como lo puse. Todo esta correcto con excepción de los argumentos en la linea de comandos para la opción -cp. Debe ser así:

    java -cp "jasperreport-3.6.2.jar" -jar prueba.jar

    Si necesitaras agregar más de un jar, separas cada elemento en la lista de jars por un ; de esta forma:

    java -cp "jasperreport-3.6.2.jar;otroJar.jar;otroJar.jar" -jar prueba.jar

    Saludos

    ResponderEliminar
  21. Alex: Intente volver a escribir el comando. Me quedo de la siguiente forma:

    java -cp "jasperreports-3.6.2.jar;asm-all-2.2.jar;commons-beanutils-1.8.0.jar;commons-collections-3.2.1.jar;commons-digester-1.7.jar;commons-javaflow-20060411.jar;commons-logging-1.1.1.jar;groovy-1.0.jar;iText-2.1.0.jar;png-encoder-1.5.jar;poi-3.2-FINAL-20081019.jar" -jar prueba.jar

    aun asi el error persiste :_( snif snif

    ResponderEliminar
  22. Hola Matias;

    Puedes enviarme tu jar a:

    programadorjavablog@gmail.com

    para que haga la prueba?.

    Saludos.

    ResponderEliminar
  23. Acabo de enviarte el mail. Te mande 2 .jar uno esta como lo pediste vos y el otro tiene todos los otros.jar incluidos. Tambien te mande una copia del codigo que uso. No se si necesitas el reporte, cualquier cosa comentame.

    Confirmame si te llego plz!!!

    ResponderEliminar
  24. Bueno Gente, despues de una larga lucha he solucionado mi problema, asique les dejo la solución.

    Problema: Tenia un proyecto (Stand Alone) en el cual utilizaba reportes del IReport, mientras corria el proyecto desde el eclipse el mismo andaba 10 puntos, pero cuando generaba el .JAR el ejecutable no funcionaba. Con ayuda de Alex logre descubrir que aunque los .JAR necesarios para el funcionamiento del IReport estaban incluidos dentro de mi .JAR y en el classpath, a la hora de ejecutarse el proyecto no se encontraban las clases... siempre daba error: "java.lang.NoClassDefFound: xxxxx" donde xxxx es el nombre de alguna clase usada por el IReport.

    Luego de varios experimentos Alex descubrio que si descomprima los .JARS del IReport y generaba el .JAR del proyecto nuevamente incluyendo estos nuevos archivos descomprimidos, el mismo funcionaba.

    Solución: Como no soy tan bueno con los comandos JAVA desde la consola y tampoco encontre las funciones para hacer esto ultimo desde eclipse, comence a buscar en internet. Encontre un plugin que pesa 250kb aproximadamente que se llama: "FatJar". Este plugin se anexa al eclipse y nos permite generar un .JAR que incluye todas las dependecias necesarias para que el proyecto funciones y ademas se encarga de configurar el classpath para que en la ejecucion del mismo no haya problemas de clases desencontradas...

    PD1: Quiero destacar la ayuda que recibi de parte de Alex via mail. Si bien no se postearon mas mensajes en el Blog. Seguimos trabajando en conjunto via mail, desde ya muchas gracias Alex!!!

    PD2: Les comento que una de las pruebas que hice, fue importar el proyecto desde netbeans y tratar de generarlo. Pero obtuve el mismo resultado que con ecplise sin usar el FatJar. Asumo que alguna forma de configurar el classpath debe haber, pero con mi inexperiencia no logre econtrarla.

    Espero esto les sea de utilidad a alguien!!!!

    ResponderEliminar
  25. Excelente tutorial, lo he seguido muy de cerca, soy de Ecuador y tengo un problema.
    Estoy generando un grafico en mi reporte, en el Preview del JasperReport el grafico se ve perfecto, pero cuando lo guardo como PDF se ve una mancha roja en el centro del grafico, que podria ser?

    ResponderEliminar
  26. Ya lo solucione!!! Estaba usando Evince para ver el archivo, pero con Adobe Acrobat se ven bien :D

    ResponderEliminar
  27. Saludos, gracias por la explicación...
    Tengo una duda a la hora de hacer el group para contar registros de cada valor de un field...
    El problema es que si los registros no están ordenados por ese field no te hace la cuenta total...Te va contando los registros que están agrupados, y al final me da 1, 1,1,2...y cosas así..
    El problema es que necesito que los datos se muestren ordenados por otra columna..., hay manera de contar los registros para cada valor de un field no ordenados..??? Gracias...

    ResponderEliminar
  28. Hola Tonet;

    Pues en realidad, el agrupamiento y el ordenamiento no deberían, en este caso, ocasionar ningún problema. ¿Estas inscrustando el SQL directo en el reporte o estas pasando un JRDataSource desde tu aplicación?

    En cualquiera de los casos ¿podrías detallar un poco más lo que estas haciendo?

    Saludos

    ResponderEliminar
  29. La intención es hacer una agrupación por una determinada columna para sacar una grafica, igual que teneis en el ejemplo...
    Estoy trabajando directamente desde una consulta SQL incrustada pero con varias columnas..
    (Provincia, Ventas, VentasReales, RatioVentas)

    Esto lo muestro como una lista ordenado por columnas y todo perfecto...

    Al final quiero agruparlas por RatioVentas...y ver el numero de provincias para cada tipo de 'RatioVenta'...

    El problema es que si tengo esto...

    Alicante 2223 123 Alta
    Albacete x x Baja
    Almeria x x Muy Alta
    Asturias x x Muy alta
    Badajoz x x Muy Baja
    Catellon x x Alta
    Córdoba x x Baja
    Granada x x Muy Alta

    El resultado que deberia obtener en el gráfico es.. Muy Alta = 3, Alta = 2, Baja = 2, Muy Baja = 1
    Pero esto no es lo que obtengo....
    Obetengo solo valores de las últimas ocurrencias...o sea todo igual a 1...porque cada vez que encuentra una ocurrencia empieza el contador..(si hubiera otra fila mas con "Málaga x x Muy Alta", depues de las anteriores, el resultado de Muy alta sería = 2

    No se si me he explicado...es decir que si estuviera ordenado por 'Ratio Ventas' obtendría el resultado deseado...

    ResponderEliminar
  30. Hola Tonet;

    El problema parece un poco más complicado de lo que pensaba. ¿Podrías mandarme un correo a:

    programadorjavablog@gmail.com

    para que lo revisemos con más detalle?

    Saludos

    ResponderEliminar
  31. hola!!
    me gustaria saber como tengo que poner la ruta de una imagen para poder verla desde cualquier ordenador...ya que si pongo por ejemplo /imagenes/logo.gif...cuando creo el jar y lo meto en otro proyecto no lo puedo ver...no me lo encuentra.Gracias

    ResponderEliminar
  32. @Alex

    Gracias por los aportes de este blog, este consejo solucionó mi problema.

    ResponderEliminar
  33. hola!!

    Alguien sabe por que al generar el reporte el pdf y con una grafica no muestra los labels de la grafica??? en otros formatos lo genera sin problemas. Gracias

    ResponderEliminar
  34. podeis subir los archivos adjuntos de esta parte del tutorial por favo..soy nueva y me pierdo muxo... graxias... este es mi correo si pudieses enviarmelo te lo agradeceria mill.....
    angelus_moon911@hotmail.com

    ResponderEliminar
  35. Hola buenas tardes, bien explicado y muy bueno. Ahora mi duda es si tengo más de una consulta cómo puedo realizarlo, he estado buscando sobre ello y he visto que agregan un datasource y ahí editan el query pero al momento de compilar no reconoce los fields. ¿Me podrías asesorar respecto a ese problema?

    ResponderEliminar
    Respuestas
    1. Hola Jesús,

      Lamentablemente como consulta no se puede. Si escribes la consulta cuando creas el reporte esta es fija y no puede ser modificada, lo que puedas hacer es crear un DataSource propio (como se explica en el tutorial 2) y ahí pasar los datos que necesites, pero recuerda que la estructura del reporte es fija.

      Saludos

      Eliminar
  36. Hola Alex

    Si, efectivamente lo que he hecho es editar la consulta en el reporte y de ahí realizar esto:

    select * from tabla where campo1='condicion' and campo2 = $P!{valor};

    Lo cual $P!{valor} es un parametro que lo envió desde el servlet en java a iReport. En el preview no marca ningún error al compilar y lo realiza. Pero ya en la aplicación web me marca el siguiente error: ireport key is null in pie dataset

    He visto en foros y al parecer así es para realizar la consulta dinámica.

    ResponderEliminar
    Respuestas
    1. Hola Jesús,

      Ok, ya entendí mejor lo que estás tratando de hacer. Por el error lo único que se me ocurre es que se está encontrando un valor en una columna que se usa para generar un ¿pie?, (imagino que estás usando una gráfica aquí) y que esa columna está vacía o nula o el nombre está mal escrito en algún lado. ¿Si realizas la consulta directo en SQL desde alguna herramienta estás obteniendo los datos esperados?

      Eliminar
  37. Hola Alex,

    Efectivamente es una gráfica de pastel, Y desde una clase en java envió la conexión y en el iReport tengo la consulta, lo cuál envió cómo parámetro un valor y ese valor es él que utilizo para que el query sea dinámico. Y si estoy realizando la consulta y me muestra los valores entonces revisaré nuevamente todo para ver que es lo que se me está pasando.

    Muchas gracias por la atención.
    Veré cuál es el problema.

    ResponderEliminar
  38. Hola Alex:
    El problema que te comentó Tonet como lo solucionaste.
    Yo tambien tengo ese problema.
    Saludos

    ResponderEliminar
  39. Como hago para agregar dos graficos en (IREPORT 5.1.0) si cuando hago un grafico sale bien y cuando voy a poner el 2 grafico el codigo que pongo me cambia el 1 grafico quien me ayuda

    ResponderEliminar
  40. Puedo cambiar de color a una cantidad de la grafica

    ResponderEliminar