Porcentajes en iReport

   Hace algún tiempo publique como hacer gráficos en iReport, pero hubo algo que nunca explique y es como mostrar porcentajes en los gráficos (chart) de iReport, entonces vamos a ello. Bien, asumiendo que saben utilizar iReport y montar un gráfico de torta, barra o cualquier otro, seguiré con la explicación avanzada de todo esto, entonces vamos a ello.

   Lo primero de todo esto es definir el dataset, o sino utilizar el mismo del reporte principal como lo explica "esta entrada". Para nuestro ejemplos he creado 2 tablas, una con alumnos y otra con contenedores, aquí su código:
CREATE TABLE `alumnos` (
   `nombre` varchar(45) NOT NULL,
   `edad` int(10) unsigned NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 INSERT INTO `alumnos` (`nombre`,`edad`) VALUES 
  ('William',22),
  ('Vanessa',22),
  ('Karolina',25),
  ('Carlos',22),
  ('Alejandro',23),
  ('Miguel',23),
  ('Wilmer',25),
  ('Rafael',25),
  ('Manuel',25),
  ('Julian',24),
  ('Mayra',24);
 
 CREATE TABLE `contenedores` (
   `nombre` varchar(45) NOT NULL,
   `peso` int(10) unsigned NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 INSERT INTO `contenedores` (`nombre`,`peso`) VALUES 
  ('Contenedor A',20),
  ('Contenedor B',19),
  ('Contenedor C',17),
  ('Contenedor D',18),
  ('Contenedor E',16);


   Luego de esto agregamos la conexión (o si ya esta creada la seleccionamos), tal como lo explica "esta entrada", ahora solo nos queda editar la consulta del "dataset" o del reporte en sí, para ello nos vamos a "edit query". Si se quiere facilidad, podemos utilizar una variable que sumara el total y así hacer una simple regla de 3 para obtener el porcentaje por grupo. Así que para ello hacemos click derecho en "Variables" y creamos una con las siguientes características:






   Yo la he llamado "total", pero puedes usar el nombre que gustes, pero como aquí se trata de aprender, no utilizaré esas variables, sino que sacaré el total desde MySQL con la función SUM... Y ahora si, vamos con el ejemplo primer ejemplo.


   En este ejemplo tomaremos las edades de varios alumnos y las agruparemos por las mismas, saber cuantos hay de cada edad y cual es su porcentaje grupal, para ello utilizamos la siguiente consulta (query):
SELECT
      alumnos.`edad`,
      COUNT(nombre) AS nombre,
      (
        SELECT SUM(nombre) FROM
        (
         SELECT edad,COUNT(nombre) AS nombre,COUNT(edad) AS ce FROM alumnos
         GROUP BY edad
        ) AS S
      ) AS total
 FROM
      alumnos
 GROUP BY
      edad

   Luego editamos la data del gráfico, hacemos click en "char data" y se nos expandira un cuadro mas o menos como el siguiente:




   Justo allí deberemos tener definido lo siguiente:

  • Key exp: $F{edad}+" años de edad"
  • Value exp: $F{nombre}
  • Label exp: new java.text.DecimalFormat("0.00").format(($F{nombre}.doubleValue()*100)/$F{total})+"%"

   Ahora explico lo que significa todo eso que vemos en el label, y es para que se vea en forma de porcentaje delimitandolo a 2 decimales:

- new java.text.DecimalFormat("0.00"): es la clase para formatear el decimal, para mas decimales podemos colocar mas 'ceros' luego del delimitador.

- format(): le da el formato que definimos arriba al número definido.

- $F{nombre}.doubleValue() * 100) / $F{total}: esta es la simple regla de 3 para obtener el dato numérico.

- +"%": agrega el símbolo de porcentaje al gráfico

   Y con esto ya hemos terminado nuestro gráfico, al final debemos ver algo como esto...