Conexión con Informes desde Java: Parámetros
En el post anterior se
conectó una aplicación Java con un informe realizado con iReport. La aplicación
contaba con un botón que al ser pulsado mostraba el informe.
Hay que tener en cuenta que
los datos que se muestran en el informe dependen del contenido de la base de
datos. Es decir, si se añaden nuevos registros a las tablas, estos registros
aparecerán en el informe (no será necesario modificarlo de alguna forma).
Sin embargo, esta forma de
trabajar puede ser poco interesante, ya que el usuario no tiene ningún control
sobre el informe que se muestra. En el post anterior el informe mostraba todos
los servicios agrupados por tipo, pero, y si el usuario quisiera en un
determinado momento que solo se mostraran los servicios anteriores a una fecha,
o que se mostraran los servicios que costaran más de una cantidad, etc.
El problema está en que la
consulta SQL del informe es una consulta fija, y siempre sacará los mismos
datos. El usuario de nuestro programa no tiene forma de modificar esa consulta
para cambiar los datos que deben aparecer en el informe.
Para poder hacer esto, es
necesario usar parámetros en
la consulta SQL del informe. Un parámetro se podría definir como
dato de la consulta que no está definido aún. Es necesario definir ese dato
antes de ejecutar la consulta y extraer los datos que se mostrarán.
Puede ser el usuario de
nuestro programa el que aporte ese dato que le falta a la consulta, de manera
que así tenga cierto control sobre la información que aparece en el listado.
En este post se verá un
ejercicio paso a paso de uso de parámetros en la consulta de informe, y de esta
manera entender la utilidad de esta característica.
EJERCICIO GUIADO Nº 1. CREACIÓN DE UN INFORME CON PARÁMETROS:
- Entra en NetBeans y
abre el informe llamado serviciosJuanPerez, realizado en el post
057 de este blog. Este informe, concretamente, fue construido desde cero y
mostraba los servicios del trabajador JUAN PEREZ:
- Visualízalo para recordar
su aspecto:
- Este informe tiene un
gran diseño pero está muy limitado, ya que sólo es capaz de mostrar el
listado de servicios realizados por el trabajador JUAN PEREZ (DNI 22222222).
Si quisiéramos sacar el listado de servicios de otro trabajador, este
informe no nos serviría.
Es necesario hacer que este
informe sea más versátil, que sea capaz de mostrar el listado de servicios de
cualquier trabajador. Para ello, será necesario crear un parámetro en la consulta
SQL.
- Acceda a la consulta
del informe a través del Report Inspector dando clic
derecho en report name y escogiendo la opción Edit Query:
La consulta SQL extrae información de aquellos
servicios que hayan sido realizados por el trabajador con DNI 22222222.
- Cambie la consulta
para que quede así:
Lo que acaba de añadir es un parámetro llamado dniTrab. Observe su estructura:
$P{nombreDelParámetro}
En nuestro caso el nombre que le hemos dado al
parámetro es “dniTrab”, por lo tanto el parámetro es:
$P{dniTrab}
Este parámetro indica que
el dni
no está definido aún. Será el usuario el que introduzca el dni según el cual habrá
que consultar en la base de datos.
- Pulse OK.
Cada vez que use un parámetro
hay que definirlo en el programa iReport. Esto se hace en el Report
Inspector junto a la zona de Campos, observa que tenemos
también una zona de Parámetros:
- En la zona de parámetros
haz clic derecho y elige la opción Agregar
– Parameter para añadir un nuevo parámetro:
- Se añadirá al final de
la lista un nuevo parámetro,
tendremos que cambiar su nombre dando clic derecho sobre su nombre actual
y elegir la opción Cambiar Nombre…:
- En la ventana que
aparece debes indicar el nombre que le has dado al parámetro en la consulta. En nuestro caso, el nombre asignado
es “dniTrab”:
- Ahora ya tiene
definido un parámetro que se
corresponde con el DNI del trabajador. El usuario introducirá ese DNI y
será sustituido en la consulta SQL. Si intenta visualizar el informe, no
podrá ver nada, ya que el parámetro no tiene ahora ningún valor. Al
visualizar el informe aparecerá los siguientes mensajes:
- En cualquier caso, se
tiene que haber generado el fichero .jasper correspondiente. Si el
iReport sigue configurado tal como se hizo en la hoja guiada anterior,
dicho fichero se tiene que haber guardado en el directorio que le indicó
con el nombre serviciosJuanPerez.jasper.
Este fichero lo usará en el siguiente ejercicio.
- Guarde los cambios y
pase al siguiente ejercicio.
EJERCICIO GUIADO Nº 2. USO DE PARÁMETROS DE UN INFORME DESDE JAVA:
- Abra la aplicación
Java que realizó en el post anterior. Añada en su ventana un nuevo botón y
un cuadro de texto.
El botón se llamará btnServiciosTrabajador y el
cuadro de texto se llamará txtDniTrab.
- El objetivo es hacer
que el usuario introduzca un DNI en el cuadro de texto DNI y que al pulsar
el botón Servicios Trabajador
aparezca un informe con el listado de servicios del trabajador con el DNI
introducido.
Para hacer esto es
necesario que el DNI introducido en el cuadro de texto txtDniTrab se traslade directamente al informe creado
anteriormente y se coloque en la posición del parámetro. Entonces la
consulta SQL del informe se completará y se podrá rellenar el informe con los
datos correctos.
- De momento copie el
fichero serviciosJuanPerez.jasper
dentro de la carpeta informes
de su carpeta de proyecto.
- Nota Importante:
Recuerde que el informe contiene una imagen proporcionada por el fichero logo.jpg. Para que el
informe funcione correctamente es necesario que copie este fichero
directamente en la carpeta informes
de su proyecto.
- Ahora programe el
siguiente código en el evento actionPerformed
del botón Servicios Trabajador:
Estudiemos con detenimiento
este código.
En él verá dos líneas
nuevas en las que se definen los valores de los parámetros:
Map parametros = new HashMap();
parametros.put("dniTrab",
txtDniTrab.getText());
En la primera de estas dos
líneas se define un objeto de tipo Map.
Este objeto contendrá el nombre de cada parámetro que usará y el valor de dicho
parámetro.
Observe la segunda línea,
en ella se define el parámetro llamado “dniTrab” y se le asigna a él el
valor del cuadro de texto del DNI, es decir, el DNI que haya escrito el
usuario.
Si existieran más
parámetros habría que definirlos de la misma forma, por ejemplo:
parametros.put(“numeroBoleta”, txtNumeroBoleta.getText());
parametros.put(“planilla”, ”P00006”);
parametros.put(“mes”, cboMes.getSelectedItem().toString());
En estas líneas de código de
ejemplo se crea un parámetro numeroBoleta
al que se le asigna el valor de un cuadro de texto txtNumeroBoleta, se crea también un parámetro planilla al que se le asigna el
valor ”P00006” y por último se crea un parámetro mes al que se le asigna
el valor de un cuadro combinado cboMes.
En nuestro caso solo necesitamos
usar un parámetro llamado dniTrab. Hay que tener en cuenta
que el nombre del parámetro debe ser el mismo que el nombre usado en la consulta del iReport.
La siguiente línea es la
que crea el objeto informe (JasperPrint) Esta línea crea el informe
a partir del fichero de informe compilado serviciosJuanPerez.jasper,
a partir de la base de datos (representada por el objeto conexion) y lo más interesante ahora es que se indica el
conjunto de parámetros a través del objeto parametros
creado antes.
JasperPrint informe =
JasperFillManager.fillReport(rutaInforme, parametros, conexion);
Cuando el informe que se va
a mostrar no tiene parámetros, entonces se usa el valor null, en caso
contrario, se usa el objeto parametros
(Map).
El resto del código es
igual que los anteriores, se crea el visor de informe conteniendo el informe y
se muestra en pantalla.
- Ejecute el programa y
pruebe a introducir un DNI existente en el cuadro de texto del DNI. Si
escribió correctamente el DNI, podrá ver el listado de servicios
realizados por el trabajador con dicho DNI.
Como puede notar, ahora ya
puede visualizar los datos de los servicios de cualquier trabajador y no solo
del trabajador JUAN PEREZ.
El uso de parámetros en los
informes da potencia y versatilidad a las aplicaciones, y es algo muy usado.
Trabajos realizados por JUAN CURO.
NOTA: En los ejemplos que se
acaban de realizar, se usa una consulta SQL de informe que contiene un
parámetro equivalente a un dato. Concretamente, a un DNI. Este dato forma parte
de una condición. Observa la consulta SELECT del informe que hemos usado:
En este caso, el DNI será
proporcionado por la aplicación java y la condición se completará.
Sin embargo, hay que
indicar que también se pueden crear parámetros que sustituyan a una condición
completa, en vez de a un solo dato. Observa el siguiente ejemplo:
SELECT * FROM trabajadores, servicios
WHERE trabajadores.dni=servicios.dni and $P!{COND}
ORDER BY servicios.fecha
En este caso, el parámetro
se llama COND y no
sustituye a un simple dato, sino que sustituye a toda la condición. En este
caso, la aplicación java mandará una cadena que tenga forma de condición SQL,
como por ejemplo: “trabajadores.sueldo >= 600”, que será reemplazada en el lugar del parámetro.
Para que lo vea claro, el
código a usar en la aplicación java para dar valor al parámetro podría ser como
sigue:
Map parametros = new HashMap();
parametros.put(“COND”, “trabajadores.sueldo >= 600”);
Observa que el valor del
parámetro es una condición entera.
Cuando se quiera usar un
parámetro que represente a un dato, se usará la siguiente sintaxis:
$P{nombreParámetro}
Cuando se quiera usar un
parámetro que represente a una condición, se usará la siguiente sintaxis:
$P!{nombreParámetro}
(Observa el uso de la
admiración !).
CONCLUSIONES:
Cuando un informe tiene una instrucción SQL invariable, siempre mostrará
los mismos datos.
Puede resultar interesante que parte de la instrucción SQL del informe
pueda variar, de forma que se pueda extraer distinta información según el dato
que varía. Estos datos variantes se denominan parámetros.
Un parámetro puede referirse a un dato concreto, o a una condición.
Si el parámetro se refiere a un dato concreto, entonces tiene la
siguiente forma:
$P{nombreParámetro}
Si el parámetro se refiere a una condición, entonces tiene la siguiente
forma:
$P!{nombreParámetro}
El parámetro debe ser sustituido por un valor que es proporcionado desde
la aplicación java, y es entonces cuando la instrucción SQL se completa y se
ejecuta.
En la aplicación java es necesario crear un objeto de tipo Map que
contenga los distintos parámetros con los valores de cada uno para luego enviar
este objeto al informe que se quiere mostrar.
El uso de parámetros en informes hace que estos sean mucho más
versátiles y que el programa tenga más posibilidades.
Hola, si lo sin parametros me funciona pero cuando lo agrego no lo hace y eso que lo hago igual al tuyo
ResponderBorrar