C.3. Recomendaciones y generalidades sobre integración gvHidra y Jasper

Los parámetros en Jasper Reports se pueden dar de alta desde:

Los parámetros de Jasper, pueden ser de 2 tipos, siendo referenciados dentro del informe Jasper con un formato distinto para cada tipo.

A los parámetros les podemos especificar un nombre, tipo y un valor por defecto. Si marcamos el check "use as prompt", cuando ejecutemos el informe desde dentro del entorno iReports, nos pedirá que le demos un valor cada vez que lo ejecutemos, dándonos también la opción de asignarle al parámetro el valor por defecto que hayamos especificado.

Se pueden crear tantos parámetros de tipo $P{Nombre_Parámetro} como se necesiten en el informe.

En muchas ocasiones la aplicación PHP presentará una pantalla de selección de datos en la que NO será obligatorio especificar todos los campos (que se pasan al informe Jasper como parámetros ).

Cuando en esta pantalla de selección de datos se deja en blanco un campo, se entiende que se solicitan todos los registros, contengan lo que contengan.

Para estos parámetros opcionales existe la posibilidad de escribir el WHERE de la select de la forma siguiente, suponiendo que "titulo" es un parametro opcional y su valor por defecto se ha fijado a "null": tddm_expediente.codtit = COALESCE($P{titulo},tddm_expediente.codtit)

Este "truco" NO funcionará bien cuando la columna en cuestión (tddm_expediente.codtit) admita el valor NULL, en cuyo caso NO se debe utilizar este sistema.

El método anterior se basa en que el parámetro $P{titulo} tiene valor por defecto "null", por lo que cuando no se pasa $P{titulo} se queda a null y como la función SQL COALESCE devuelve el primer valor no nulo, devolverá el segundo parámetro reduciéndose la condición a tddm_expediente.codtit = tddm_expediente.codtit, que es una operación trivial que devuelve TRUE... excepto cuando el valor de tddm_expediente.codtit sea NULL, por que sql considera que ( NULL = NULL ) NO devuelve Verdadero ( sino que devuelve NULL ), el resultado es que aquellas filas que contengan NULL se pierden porque no pueden satisfacer la condición.

La solución en este caso pasa por utilizar la otra forma alternativa de parámetros que tiene JasperReports, el formato B.

Los parámetros $P!{Nombre_Parámetro} se interpretan antes que los parámetros $P{Nombre_Parámetro}, por tanto, en teoría, es posible que la cadena que pasemos como valor de $P!{Nombre_Parámetro} contenga a su vez expresiones que deban ser posteriormente calculadas o pasadas desde otra fuente. Se supone que podríamos llegar a incluir un parámetro de formato A $P{Nombre_Parámetro} dentro del valor que pasemos a una cadena de formato B $P!{Nombre_Parámetro}, si bien, esto no es útil en gvHidra ya que toda la información de selección de datos se introduce en una misma pantalla previa al lanzamiento del informe, aunque puede serlo en otros contextos.

Los parámetros $P!{Nombre_Parámetro} permiten modificar la cadena SQL que sirve de base para el informe. En concreto pueden contener:

  1. La totalidad de la sentencia SQL en la que se basa el informe: en ese caso el informe solo contiene en su clausula base: $P!{CadSQL}

  2. Una clausula completa de las que componene una sentencia SQL, como por ejemplo "ORDER BY 1,2" o "WHERE tddm_expediente.codtit='PAYA"

  3. Una parte de alguna clausula de las que componene una sentencia SQL, por ejemplo (dentro de la clausula WHERE ) " AND tddm_expediente.codtit='PAYA' ". Para utilizar esta última solución, en la sentencia SQL debemos añadir un parámetro $P!{CadenaWhereOpcional} al final de la claúsula WHERE:

    • cuando el usuario no especifique un valor para el campo opcional "codigo titulo", el parámetro $P!{CadenaWhereOpcional} se pasará como cadena vacía

    • cuando el usuario rellene por ejemplo el parámetro opcional "codigo titulo" con el valor "PAYA" el parámetro $P!{CadenaWhereOpcional} tomará el valor "AND tddm_expediente.codtit='PAYA' "

La solución 1, ofrece la ventaja de que toda la sentencia sql puede venir de nuestra aplicación PHP, esto es útil cuando el programa también deba utilizar la sentencia SQL para por ejemplo, comprobar que existe algún registro con las condiciones introducidas. Basta con que la versión de la sentencia SQL que se utiliza en la aplicación PHP añada un "LIMIT 1" para que sólo se intente recuperar 1 registro como máximo, y en caso de que aparezca 1 registro, se pasa la cadena sin el LIMIT 1 al informe.

Esta técnica ESTÁ RECOMENDADA para los casos en los que la aplicación compruebe que hay registros que cumplen las condiciones porque facilita el mantenimiento de las consultas, ya que si hay algún cambio o corrección posterior de algún error, la consulta se modificará sólo en un sitio, y no habrá inconsistencias entre la consulta de la aplicación PHP y la de JasperReports.

Cuando no se especifica la consulta del informe, JasperReports sólo comprobará la cadena SQL en tiempo de ejecución cuando la reciba y además iReports no puede recuperar automáticamente los campos disponibles para diseñar el informe. Pero esto se puede conseguir de dos formas:

En el caso de que el mantenimiento sea de tipo Maestro/Detalle, si el listado se lanza desde una ventana que tiene parámetros opcionales, se puede aplicar al informe Maestro todas las soluciones anteriores para pasarle los parámetros opcionales, en concreto para los casos en los que se compruebe que existen registros que cumplan las condiciones introducidas en la pantalla de selección, se recomienda utilizar un parámetro con el FORMATO B: $P!{Nombre_Parámetro} y con la solución A, mientras que el Detalle puede llevar la SQL en el propio informe, ya que es la consulta Maestra la que decide qué registros se van a mostrar.