iReport : Solución al problema de los parámetros dinámicos.

11
92934

iReport : Solución al problema de los parámetros dinámicos.

0. Índice de contenidos.

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 :

  1. Introducción a iReport
  2. Subinformes con iReport
  3. Gráficos con iReport
  4. 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 :

  1. Clientes : Tabla que almacenará la información de los usuarios del sistema creado
  2. Cuentas : Tabla que almacenará la información asociada a la cuenta de los usuarios
  3. 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

Cargar Aplicación

Paso 2 : Crear un nuevo informe (Fichero -> Nuevo Documento)

Darle un nombre al informe, en este caso "InformeEjemplo".

Crear un nuevo informe

Se generará el informe con las bandas activas.

Visualiza las bandas

Si guardamos el fichero y lo visualizamos con un editor de texto podremos ver el código del fichero jrxml generado :




	
	
	
	
	


		
			
			
		
		
			<band height="50"  isSplitAllowed="true" >
			</band>
		
		
			
			
		
		
			
			
		
		
			
			
		
		
			
			
		
		
			
			
		
		
			
			
		
		
			
			
		

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.

Texto en título

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».

Incorporar Parámetro

En el fichero jrxml se incorporará :

.
.
.

	

.
.
.

Visualizar que se ha incorporado un campo de texto con la referencia al parámetro $P{NOMBRE_PARAMETRO}.

Visualizar Parámetro

En el código fuente se incorporará la siguiente entrada a continuación de la anterior:

.
.
.

	
	
	
		
	

.
.
.

Ejecutar el informe.

– Introducir el parámetro.

Visualizar Parámetro

– Visualización de la ejecución.

Visualización informe

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 conexión

Crear una nueva conexión con las referencias al esquema donde se haya cargado el modelo.

Configurar conexión

Introducir los parámetros asociados al esquema en el que se ha creado el modelo de datos.

Configurar conexión 2

Verificar que se ha creado la conexión.

Verificar 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.

Definir consulta

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).

Visualizar campos

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.

Establecer campos

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.

Resultado informe 1

Anexo 1 : Definir un estilo con iReport.

Accederemos a los estilos desde Fomato -> Estilos.

Definir estilo

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.

Definir estilo 2

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.

Seleccion de cabeceras Seleccion de cabeceras 2

Una vez seleccionadas las cabeceras pulsaremos sobre el botón derecho y modificaremos el estilo para asociarlo a las cabeceras.

Seleccion de cabeceras 3

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.

Consulta

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.

Consulta

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.

Ejecucion informe 1

Una vez introducido se generará el siguiente informe:

Ejecucion informe 2

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).

Insertar perfil

Para ello editaremos la consulta anterior de la siguiente forma y la copiaremos como valor por defecto del parámetro :

Insertar perfil 2

Por lo que se generará en el jrxml el parámetro :

.
.
.

		

.
.
.

Eliminaremos la consulta.

Insertar perfil 3

E introduciremos la llamada al parámetro SQL.

Insertar perfil 4

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.

Insertar perfil 5

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.

Consulta

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.

Insertar perfil 6

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

Informe final 1

Tras ejecutarlo desde la conexión a la base de datos veremos que muestra la información correctamente

Informe final 2

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

mailto:vjmadrid@autentia.com

11 COMENTARIOS

  1. 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

  2. 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í

  3. 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.

  4. 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

  5. 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..

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad