martes, 11 de octubre de 2011

Uso de parámetros en Jasper


Cuando hacemos un informe con Jasper Reports, es muy normal que utilicemos parámetros. De esta forma podemos enviar datos al informe que serán utilizados a la hora de generarlo. Los casos más habituales quizá sean el mostrar directamente el valor del parámetro, o el usarlo a su vez como parámetro para la consulta SQL que ejecutamos dentro de report. En este caso sólo tenemos que definir el parámetro en la sección correspondiente de iReport, y hacer referencia a él con el formato $P{nombre_parametro}, como se muestra en la imagen.



Pero podemos ir más allá. Por ejemplo podríamos recibir como parámetro la sentencia SQL a ejecutar, o alguna de sus cláusulas. En este caso buscaríamos hacer algo como esto.



Pero si tratamos de ejecutar un informe con este formato no funcionará, y nos mostrará una excepción:

net.sf.jasperreports.engine.JRException: Error executing SQL statement for : report1


Para entender por qué pasa esto, tenemos que entrar en detalle y ver qué hace Jasper cuando procesa los parámetros.

Cuando en la definición de la consulta de un Jasper utilizamos un parámetro con el formato $P{nombre_parametro}, lo que la herramienta genera es realmente una consulta SQL con parámetros. Es decir, tendríamos una consulta tal que select * from tabla where campo = ?.

Ahora bien, si lo que vamos a recibir como parámetro es una sentencia que queremos inyectar directamente en la consulta SQL, esta forma de trabajo no funcionaría. En este caso tenemos que cambiar el formato con el que hacemos referencia al parámetro por $P!{nombre_parametro}. De esta forma le indicamos a la herramienta que no queremos pasar un parámetro a la consulta SQL, sino que queremos directamente incluir el valor textual del parámetro como parte de la consulta.

2 comentarios:

Cualquier aportación será bienvenida