domingo, 30 de octubre de 2011

Error de Jasper Server

Este error me lo encontré hace unos días ejecutando informes en Jasper Server.


 ERROR JSErrorPage_jsp,http-8080-Processor24:329 - 
java.lang.NullPointerException
at com.jaspersoft.jasperserver.war.action.ViewReportAction.checkForParams(ViewReportAction.java:143)
at sun.reflect.GeneratedMethodAccessor337.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
...

Un puntero nulo en un método que, si nos fiamos de su nombre, comprueba los parámetros del informe.

Aunque en principio supuse que el problema debería ser que el valor de alguno de los parámetros fuese nulo, lo que realmente ocurre cuando nos encontramos este error es que hemos definido un Input Control asociado al reporte en el servidor, y éste no encuentra correspondencia en el jrxml. Hay que tener en cuenta que la relación se establece entre el id del Input Control y el nombre del parámetro.

lunes, 24 de octubre de 2011

¡¡Adobe Reader no imprime!!

Me he tirado varias semanas sin poder imprimir documentos pdf desde mi portátil. Cada vez que lo intentaba me aparecía un misterioso mensaje: "Antes de realizar tareas relacionadas con la impresión, como la configuración de página o la impresión de un documento, debe instalar una impresora".


¿Que debo instalar una impresora? ¿Estamos locos? Tengo nada menos que nueve impresoras instaladas, ¿no le parece suficiente? Es más, si accedo a la opción Archivo - Configuración de impresión del Reader, se abre sin ningún problema el diálogo para definir las preferencias de impresión para cada una de ellas...

Rebuscando por Internet, sobre todo en páginas en inglés, se pueden encontrar muchas recomendaciones para solucionar este problema. Especialmente insistente es la idea de actualizar nuestra versión de Adobe Reader. Pero ni por esas...

Hasta que hace unos días, curiosamente, el mensaje desapareció y pude imprimir de nuevo. Pero, ¿por qué?, que diría Mou. Pues finalmente lo descubrí. Resulta que la impresora que tenía como predeterminada del sistema era una impresora de la red de mi oficina, a la que no tengo acceso más que cuando estoy allí trabajando. Y parece que el Reader se ofusca cuando le dices que quieres imprimir, y no es capaz de conectar a la impresora predeterminada. Bastó con marcar como predeterminada de Windows XP una impresora accesible para que todo volviese a funcionar.

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.

miércoles, 5 de octubre de 2011

Sin sonido en Youtube con Chrome

Hacía varios días que venía notando un problema muy molesto en mi HTPC. Cuando intentaba reproducir un vídeo de Youtube en Google Chrome la imagen se mostraba perfectamente, pero del sonido no había noticias. Parecía que mi ordenador se había quedado mudo.

Sin embargo, tras hacer las típicas comprobaciones, me encontraba que el sonido iba perfectamente al reproducir vídeos o música con VLC o Windows Media Player. ¿Qué pasaba entonces?

Pues hoy por fin he tenido un rato para dedicarle a este problema. Lo primero que descubrí es que en el mezclador del control de sonido Windows 7 existe un apartado específico para el volumen de Google Chrome; de modo que lo primero que hay que comprobar si el navegador enmudece es que no lo tengamos silenciado.

Si no es tu caso, tranquilo, puede que el problema sea la versión del plugin de Flash que tengas instalado, así que comprueba si puedes actualizarlo. Nunca está de más ponerse al día.

Por último, si todo parece correctamente configurado y sigues sin poder escuchar nada, estás como estaba yo. Accede al administrador de tareas de Chrome (dentro del menú herramientas, o utilizando el atajo shift + esc), localiza el proceso Shockwave Flash, y cárgatelo sin compasión. En las páginas de youtube que tengas abiertas verás el clásico dibujito indicando que ha habido un problema con el reproductor de flash. Refresca la página, y si todo va bien podrás volver a escuchar tus vídeos con normalidad.