lunes, 1 de julio de 2013

SQL Server Reporting Services 2008. Ventanas emergentes o pop-ups


Continuando con el ejemplo de una entrada anterior sobre Reporting Services. Voy a mostrar ahora como solventar una problemática particular que me surgió con un cliente.

Como sabéis reporting Services nos permite filtrar el contenido que vamos a visualizar en un informe a través de parámetros en la entrada de datos, como podemos ver en este ejemplo:


Además, un parámetro puede condicionar los valores que nos mostrará el otro.

La problemática que surgió fue que un cliente quería seleccionar los parámetros de entrada una sola vez y poder visualizar todos los informes con esos parámetros ya seleccionados. Es decir, no entrando informe a informe y seleccionando los parámetros cada vez.


Imaginemos que tenemos nuestra pantalla inicial de introducción de parámetros:



Fijémonos que ambos parámetros son visibles por eso nos aparecen al cargar el informe, permiten múltiples valores simultáneamente y que el de la fecha está condicionado por el del banco:







Bien, una vez que se han seleccionado los valores, el informe debe cargar un listado de informes que deben actuar como hipervínculos para enlazar a sus respectivos reportes, arrastrando los mismos parámetros que nos traíamos desde la selección inicial.


Como podemos ver, una vez introducimos nuestros parámetros de entrada múltiples, el informe nos los recoge:


A continuación tenemos que abrir cada uno de los informes ya enlazados en nuestro informe y pasarle esos mismos parámetros. ¿Cómo hacemos eso?

En el siguiente pantallazo recojo todo el proceso:





Desde las propiedades del campos de texto. Nos vamos a “Action” y a “Go to report”, especificamos el informe que queremos abrir al hacer clic y, como es un informe parametrizado, le añadimos los parámetros, en este caso 2, que le pasaremos al invocarle.

Observen que el value de los parámetros es la conocida función Join – que ya veíamos en una entrada anterior- y que permite pasar valores de parámetros múltiples.

En principio con esto estaría solventada la petición del cliente, ¿verdad? Pues en este caso no.

Además, los usuarios desean poder abrir varios informes simultáneamente para comparar y puntear cifras entre unos y otros.

El problema que tenemos con la acción “Go to report” es que NO permite abrir un pop-up o nueva ventana emergente.

Tenemos pues que buscar otra solución.  La explico a continuación en el siguiente esquema:


En lugar de seleccionar la acción “Go to report”, seleccionamos “Go to URL”. En la URL tenemos que introducir una expresión que nos abra un pop-up y que apunte a un informe de nuestro servidor de reporting services.

Es fácil decirlo, pero más difícil hacerlo. Con “Go to report”, dejamos al asistente que se encargue de todo el proceso de apuntar al informe especificado y que además le pase los parámetros. Pero con la especificación de la URL tenemos que hacerlo todo nosotros:
Vayamos por partes:
Ponemos un símbolo = y añadimos "javascript:void(window.open(
Window.open nos abrirá una ventana nueva, al especificar como segundo parámetro de esta función: _blank
Después debéis especificar la ruta de vuestro servidor Report Server, la carpeta donde se ubica el informe y después el informe: http://myserver/ReportServer?/myfolder/myreport
Veamos con más detalle:
Para obtener el nombre de vuestro report server y el directorio virtual donde se ubican los informes.
Haced clic en programas:




Como podéis ver, en la sección Report Manager URL nos muestra la URL a la que tenemos que apuntar:


 


De modo que ya tenemos la ruta hasta que nos encontramos el símbolo de interrogación:

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/

Después añadimos el nombre de la carpeta de nuestros informes y el informe al que apuntamos (ojo, sin la extensión .rdl)

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02

Y a continuación especificamos los parámetros:

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02&rs:Command=render&rc:Parameters=true&BANCO_MAEB=" & Join(Parameters!Banco_Maeb.Value,",") & "&Fecha_Datos=" & Join(Parameters!Fecha.Value)


De nuevo, debemos observar que los parámetros deben llevar el Join porque son multiple valued.

Por último añadimos el cierre de la cadena de este primer parámetro de la función window.open:


="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02&rs:Command=render&rc:Parameters=true&BANCO_MAEB=" & Join(Parameters!Banco_Maeb.Value,",") & "&Fecha_Datos=" & Join(Parameters!Fecha.Value) & "'

Y añadimos el segundo parámetro:

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02&rs:Command=render&rc:Parameters=true&BANCO_MAEB=" & Join(Parameters!Banco_Maeb.Value,",") & "&Fecha_Datos=" & Join(Parameters!Fecha.Value) & "','_blank'))"


Ya lo tendríamos. Por último señalar que lo ideal es parametrizar también el nombre del servidor, la ruta del informe y el propio informe, con valores de un dataset que nos permitan configurarlo de forma totalmente flexible:


=”javascript:void(window.open(‘” & Parameters!ServerAddress.Value & “?” & Parameters!ReportPath.Value & “myreport&rs:Command=render&rc:Parameters=true&Period=” & Parameters!Period.Value & “&Business_Unit=” & Parameters!Business_Unit.Value & “‘,’_blank’))”


Es cierto que es un poco engorroso trabajar en la ventana de expression de reporting, pero yo he tenido que hacer cosas similares en la versión 3 XI de Business Object y “madrecita, madrecita, que me quede como estoy…” 


Saludos a todos.