iReport : Solución al problema de los parámetros dinámicos.
0. Índice de contenidos.
- 1. Introducción.
- 2. Entorno.
- 3. Requerimientos.
- 4. Funcionamiento.
- 5. Caso 1 : Ejecución de consulta de base de datos.
- 6. Caso 2 : Ejecución de consulta de base de datos.
- 7. Ejemplo.
- 8. Conclusiones.
1. Introducción
Con este tutorial no se pretende enseñar a utilizar la herramienta de iReport Para
ello ya existen varios tutoriales muy buenos en www.adictosaltrabajo.com , donde se explican detenidamente
como generar diferentes tipos de informes mediante el uso de esta herramienta, asi como el uso de muchas de sus funcionalidades.Algunos de los tutoriales
son los siguientes :
- Introducción a iReport
- Subinformes con iReport
- Gráficos con iReport
- Existen más tutoriales…
El objetivo principal de este tutorial es enseñar la forma de solucionar el problema que se produce
a la hora de generar un informe cuando se incorpora un parámetro y posteriormente se incorpora
otro que es usado por el primero (un poco liosos pero ya lo veréis más claro en el ejemplo).El problema
reside en que iReport es incapaz de darse cuenta de esta situación (problema en el orden de declaración de los parámetros)
y no dejará generar un informe (ni incluso mostrará mensaje de error alguno ..cosa que no es muy lógica 😉 )
Por otro lado y como objetivo secundario de este tutorial se va a explicar como se construye internamente un informe con iRepor, para ello se analizará
el código fuente generado en el fichero jrxml para cada uno de los pasos realizados durante este tutorial.Con esta parte, se pretende perder el miedo a
este tipo de ficheros y que se sepa modificar directamente sobre el código.
Consejo : Es conveniente tener una idea del código generado en cada informe.
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM, 320 GB HD).
- Sistema operativo: Windows Vista Ultimate.
- iReport 3.0.0
- MySQL 5.1.32
- MySQL Workbench OSS for Windows versión 5.1.18 (Para el diseño del modelo de datos)
3. Requerimientos.
Para la realización de este tutorial se ha utilizado la herramienta de generación de diagramas
de entidad-relación MySQL Workbench.Con ella se ha generado un modelo de datos formado por 3 tablas :
- Clientes : Tabla que almacenará la información de los usuarios del sistema creado
- Cuentas : Tabla que almacenará la información asociada a la cuenta de los usuarios
- Perfiles : Tabla que almacenará los perfiles de las cuentas
Requisito 1 : Un cliente puede tener más de una cuenta.
Requisito 2 : Un perfil puede estar asociado a más de una cuenta.
Diagrama de Entidad Relación
Representa las tablas anteriores y la información a almacenar.
Script de creación del modelo de datos
Nota: Es necesario tener creado el esquema en el que se guardaran.
-- ----------------------------------------------------- -- Table `Clientes` -- ----------------------------------------------------- DROP TABLE IF EXISTS `Clientes` ; CREATE TABLE IF NOT EXISTS `Clientes` ( `idClientes` INT NOT NULL , `nombre` VARCHAR(45) NULL , `apellidos` VARCHAR(45) NULL , `direccion` VARCHAR(45) NULL , PRIMARY KEY (`idClientes`) ) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `Perfiles` -- ----------------------------------------------------- DROP TABLE IF EXISTS `Perfiles` ; CREATE TABLE IF NOT EXISTS `Perfiles` ( `idPerfiles` INT NOT NULL , `descripcion` VARCHAR(45) NULL , PRIMARY KEY (`idPerfiles`) ) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `Cuentas` -- ----------------------------------------------------- DROP TABLE IF EXISTS `Cuentas` ; CREATE TABLE IF NOT EXISTS `Cuentas` ( `idCuentas` INT NOT NULL , `usuario` VARCHAR(45) NULL , `contraseña` VARCHAR(45) NULL , `fecha_alta` DATETIME NOT NULL , `fecha_baja` DATETIME NULL , `baja_logica` INT DEFAULT 0 , `Clientes_idClientes` INT NOT NULL , `Perfiles_idPerfiles` INT NOT NULL , PRIMARY KEY (`idCuentas`) ) ENGINE = InnoDB; CREATE INDEX `fk_Cuentas_Clientes` ON `Cuentas` (`Clientes_idClientes` ASC) ; CREATE INDEX `fk_Cuentas_Perfiles1` ON `Cuentas` (`Perfiles_idPerfiles` ASC) ;
Script para la carga de datos
Script de carga de datos de la tabla Clientes :
insert into `clientes`(`idClientes`,`nombre`,`apellidos`,`direccion`) values (1,'Víctor','Apellidos 1','Dirección 1'); insert into `clientes`(`idClientes`,`nombre`,`apellidos`,`direccion`) values (2,'Juan Pablo','Apellidos 2','Dirección 2'); insert into `clientes`(`idClientes`,`nombre`,`apellidos`,`direccion`) values (3,'Fernando','Apellidos 3','Dirección 3'); insert into `clientes`(`idClientes`,`nombre`,`apellidos`,`direccion`) values (4,'Fran','Apellidos 4','Dirección 4'); insert into `clientes`(`idClientes`,`nombre`,`apellidos`,`direccion`) values (5,'Tamara','Apellidos 5','Dirección 5'); insert into `clientes`(`idClientes`,`nombre`,`apellidos`,`direccion`) values (6,'Marta','Apellidos 6','Dirección 6');
Script de carga de datos de la tabla Perfiles :
insert into `perfiles`(`idPerfiles`,`descripcion`) values (1,'Administrador'); insert into `perfiles`(`idPerfiles`,`descripcion`) values (2,'Gerente'); insert into `perfiles`(`idPerfiles`,`descripcion`) values (3,'Comercial'); insert into `perfiles`(`idPerfiles`,`descripcion`) values (4,'Administrativo'); insert into `perfiles`(`idPerfiles`,`descripcion`) values (5,'Usuario');
Script de carga de datos de la tabla Cuentas :
insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (1,'VíctorAdministrador','contraseña1','2009-07-01 00:00:00',null,'0',1,1); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (2,'VíctorUsuario','contraseña2','2009-07-18 00:00:00',null,'0',1,5); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (3,'JuanPabloComercial','contraseña3','2009-07-18 00:00:00',null,'0',2,3); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (4,'JuanPabloUsuario','contraseña4','2009-07-18 00:00:00',null,'0',2,5); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (5,'FernandoAdministrativo','contraseña5','2009-07-18 00:00:00',null,'0',3,4); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (6,'FranAdministrativo','contraseña7','2009-07-18 00:00:00',null,'0',4,4); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (7,'FranUsuario','contraseña7','2009-07-18 00:00:00',null,'0',4,5); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (8,'TamaraGerente','contraseña8','2009-07-18 00:00:00',null,'0',5,2); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (9,'TamaraUsuario','contraseña9','2009-07-18 00:00:00',null,'0',5,5); insert into `cuentas`(`idCuentas`,`usuario`,`contraseña`,`fecha_alta`,`fecha_baja`,`baja_logica`,`Clientes_idClientes`,`Perfiles_idPerfiles`) values (10,'MartaComercial','contraseña10','2009-07-18 00:00:00',null,'0',5,3);
4. Funcionamiento.
En este punto se va a enseñar a utilizar de forma básica la herramienta iReport,con ello se va a generar el informe con el que después se enseñará el ejemplo. Pasos a seguir:
Paso 1 : Cargar la aplicación iReport
Paso 2 : Crear un nuevo informe (Fichero -> Nuevo Documento)
Darle un nombre al informe, en este caso "InformeEjemplo".
Se generará el informe con las bandas activas.
Si guardamos el fichero y lo visualizamos con un editor de texto podremos ver el código del fichero jrxml generado :
Como se puede observar en el código fuente del informe, se trata de un fichero XML en el cual se establecen las características del informe como son : nombre,orientación, codificación, etc. ,así como detalles de la maquetación del informe : márgenes, si se mostrará el sumario,etc..
Nota : Observar las etiquetas correspondientes a las bandas del informe.
Las características o las propiedades pueden ser modificadas directamente desde el código fuente y refrescando el informe desde la aplicación se pueden hacer efectivos los cambios.
Por otro lado se definen todas y cada una de las bandas que formarán en informe donde aparece reflejado su tamaño por defecto y si esta activo el reparto permitido.
Paso 3 : Introducir un texto estático en el título
Se insertará el texto estático «Título informe» en el título desde el icono que tiene una T.
Por lo tanto, en el código fuente se incorporará el siguiente código en la banda de título:
. . .. . .
En el código se muestra la posición del texto,altura/anchura del campo y las características de la fuente utilizada para mostrar la información.
Paso 4 : Introducir un parámetro
Insertar un parámetro en el informe del tipo String,con identificador «Mensaje» y valor por defecto «Adictos al trabajo».
En el fichero jrxml se incorporará :
. . .. . .
Visualizar que se ha incorporado un campo de texto con la referencia al parámetro $P{NOMBRE_PARAMETRO}.
En el código fuente se incorporará la siguiente entrada a continuación de la anterior:
. . .. . .
Ejecutar el informe.
– Introducir el parámetro.
– Visualización de la ejecución.
Entonces se mostrará el informe con los elementos que se han incorporado en la banda de título.
Paso 5 : Establecer conexión con la base de datos
Seleccionar Datos -> Conexiones / Fuentes de datos
Crear una nueva conexión con las referencias al esquema donde se haya cargado el modelo.
Introducir los parámetros asociados al esquema en el que se ha creado el modelo de datos.
Verificar que se ha creado la conexión.
Con esto se tendrá todo preparado para ejecutar los siguientes casos.
5. Caso 1 : Ejecución de consulta de base de datos.
En este caso se ejecutará la consulta desde la opción de Datos -> Consulta de informe. Por lo que habrá que definir la consulta a realizar, en esta consulta se mostrará la información considerada de la tabla clientes en relación a las otras dos.
Consulta SQL que mostrará la información :
SELECT cli.nombre, cli.apellidos, cli.direccion, cue.usuario, cue.contraseña, per.descripcion FROM clientes cli , cuentas cue , perfiles per WHERE cli.idClientes = cue.idCuentas AND per.idPerfiles = cue.Perfiles_idPerfiles ORDER BY cli.nombre ASC
Una vez introducida la consulta y como se puede observar en la imagen inferior los campos devueltos son reconocidos. Para ello se activará la opción de que recuperar los campos de forma automática si la consulta es identificada.
La tipología de los campos se puede cambiar desde la tabla de los campos recuperados.
Con este cambio modificará el fichero jrxml para incorporar la consulta (entre los parámetros y las bandas) :
. . .. . .
Se podrá visualizar los campos anteriores de la consulta en la ventana de la estructura del documento (Abajo a la izquierda).
Además se modificará el fichero jrxml para incorporar los campos y sus tipos :
. . .. . .
Incorporamos los datos a mostrar en el informe. Para ello utilizaremos 2 bandas : cabecera y detalle.
En la banda de cabecera se introducirán los textos estáticos que darán nombre a las columnas. Por lo que se generará el siguiente código dentro del fichero jrxml.
. . .. . .
En la banda de detalle se introducirán los textos dinámicos asociados a los campos de la consulta. Formato : $F{NOMBRE_DEL_CAMPO}.
Se generará el siguiente código en el fichero jrxml.
. . .. . .
Tras ejecutar el informe haciendo uso de la conexión a la base de datos anterior se mostrarán todos los clientes.
Anexo 1 : Definir un estilo con iReport.
Accederemos a los estilos desde Fomato -> Estilos.
Generaremos un estilo sencillo para las cabeceras donde únicamente cambiaremos el color de la letra.Por lo que sólo introduciremos el nombre y el color elegido.
En el fichero jrxml se añadirá la siguiente línea (entre los import y los parámtros) :
. . . . . .
Una vez creado el estilo seleccionaremos todas las cabeceras, aunque también se puede ir haciendo una a una.
Una vez seleccionadas las cabeceras pulsaremos sobre el botón derecho y modificaremos el estilo para asociarlo a las cabeceras.
Por lo que se modificará el jrxml para los datos estáticos incorporando el estilo :
. . .. . .
Tras ejecutar el informe haciendo uso de la conexión a la base de datos anterior se mostrarán todos los clientes.Pero con el estilo de las cabeceras.
Anexo 2 : Indroducir un parámetro que filtrará la consulta.
Añadiremos un nuevo parámetro que se utilizará para filtrar la consulta.Utilizaremos de indentificador ID_PERFIL y será del tipo Integer.
Se incluirá la siguiente línea en el fichero jrxml (tras los import y el área de los estilos):
. . .. . .
Cambiamos la consulta anterior para que incluya el nuevo filtro : AND per.idPerfiles = $P{ID_PERFIL}
SELECT cli.nombre, cli.apellidos, cli.direccion, cue.usuario, cue.contraseña, per.descripcion FROM clientes cli , cuentas cue , perfiles per WHERE cli.idClientes = cue.idCuentas AND per.idPerfiles = cue.Perfiles_idPerfiles AND per.idPerfiles = $P{ID_PERFIL} ORDER BY cli.nombre ASC
Se modificará el fichero jrxml :
. . .. . .
Tras ejecutar el informe haciendo uso de la conexión a la base de datos anterior se solicitará obtener el nuevo parámetro.
Una vez introducido se generará el siguiente informe:
5. Caso 2 : Ejecución de consulta dinámica de base de datos.
Nota : Para crear este ejemplo se aconseja haber realizado el caso 1 (ya que nos basaremos en muchos de sus elementos definidos).
Eliminar el parámetro ID_PERFIL.
En este caso se ejecutará la consulta desde la opción de Datos -> Consulta de informe pero de una forma un poco especial.Para ello se generará un nuevo parámetro que contendrá la consulta, lo que nos permitirá ganar en cierta forma dinamismo sobre nuestras consultas.
Generaremos un nuevo parámetro al que denominaremos SQL. Este parámetro tendrá la peculiaridad que será del tipo String y que tendrá como valor por defecto la consulta a ejecutar.(OJO : la consulta que mostraba todos los clientes).
Para ello editaremos la consulta anterior de la siguiente forma y la copiaremos como valor por defecto del parámetro :
Por lo que se generará en el jrxml el parámetro :
. . .. . .
Eliminaremos la consulta.
E introduciremos la llamada al parámetro SQL.
Por lo que se modificará en el jrxml el elemento querystring.
. . .. . .
Tras ejecutar el informe haciendo uso de la conexión a la base de datos anterior se mostrarán todos los clientes, como en el caso 1.
Anexo 1 : Indroducir un parámetro que filtrará la consulta.
El problema que trata de solucionar este tutorial viene en esta parte.
Si volvemos a crear el parámetro para filtrar la consulta como en el caso 1 y modificamos la consulta para que acepte el parámetro.
Se producirá la siguiente modificación en el jrxml.
. . .. . .
El problema radica en que se ha definido un parámetro depués de uno que hace uso del que que acaba de incoporar por lo que al ejecutarlo se mostrará el siguiente informe.
No se produce ningún mensaje de error y simplemente muestra el informe en blanco.
Esto se puede solucionar borrando los parámetros y declarándolos con el orden adecuado o bien acceder al jrxml y modificar su orden
. . .. . .
Una vez modificado el informe desde el jrxml, el iReport nos pedirá actualizarlo y ya podremos ejecutarlo correctamente
Tras ejecutarlo desde la conexión a la base de datos veremos que muestra la información correctamente
6. Conclusiones.
Espero haberos ayudado a resolver este error y demostrar que NO ES MÁGICO como podría parecer de primeras, sino que se debe a un problema en el orden de declaración de parámetros dinámicos. Por otro lado, espero haberos introducido en el maravilloso mundo de «modificar» los ficheros de informe a mano (esta parte sólo se la aconsejo a los más puristas 😉 ), ya que no es algo que se suela hacer a diario o que la gente trabaje con ellos directamente.
Un saludo.
Víctor
Hola me parecio muy bueno este tutorial rapido…hago una pregunta creo que tal vez simple.Como deberia hacer para que un textField creciera dinamicamente.Por ejemplo en un reporte de factura el cual tiene una campo detalle. El problema que tengo es que cuando ese detalle excede el tamaño del textField no me muestra todo sino lo que entra digamos en el textField
muy buen tu trabajo te hago una pregunta cuando ingreso algún parámetro de entrada que se clave para q me lo valide con una consulta en mi date base como puedo ocultar ese parámetro o ponerle asterisco algo así
En la parte de propiedades del parametro tiene una opcion que se llama «use as a prompt», ademas en «default value expression»
Me sirvió de mucho, muchísimas gracias en verdad! 😀
Hola tu manual es de lo más completo y me gustaría comentar un atasco que tengo. Dada la consulta a MySQL que hago obtengo un parametro llamado TipoColisión de la tabla coche, en jasperReport la introduzco como:
$F{TIPOCOLISION}.equals(‘6’) ? «C:RUTAIMAGEN_TRUE.JPG» : «C:RUTAIMAGEN_FALS.JPG»
Pero siempre obtengo como resultado la imagen 2 (FALS).
Lo que deseo es que si el valor es igual a 6 mostrar la imagen TRUE y en caso contrario, la imagen FALS.
Que puedo estar haciendo mal ?
Gracias.
en internet busca print when expression or and, a mi se sirvio, no recuerdo la pagina pero te dice como hacerle
Lo mejor que pude haber visto en esta noche, excelente! gracias 😀 ☺
Hola tengo un problema tengo una consulta que la paso como parametro, pero quiero concatenarle un AND campo = $P{pGrupo}, este grupo viene de un reporte Master y paso el parametro a un subreporte, pero me manda una excepcion en el Query, no se como concatenarle a una consulta dinámica otro fragmento de la consulta
yo hago muchos pasos de parametro a subreportes y hasta el momento no eh tenido problemas, si gustas mandarme fotos de como lo estas haciendo te pudiera ayudar, five_5_five_5_five_5@hotmail.com
Muy buen aporte, muchas gracias.
hola …tengo problemas con la aplicacion ireport
Diseño la plantilla, hago mi query,designer las tablas hago todo el proceso tal y como lo indican los pasos en esta pagina. Pero la hora de generar el reporte para darme vista previa(preview) me dice que el mensaj es null y se cuelga la aplicacion dejandome asi sin poder seguir usandola…estoy utilizando ireport 5.5.0 jaspersoft en ubuntu.
ALGUIEN ME PUEDE AYUDAR POR FAVOR..