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.
Hola, que buen post.
ResponderEliminarUna pregunta, es que debo mostrar en una celda de la tablix del reporte, un archivo adjunto, independientemente que el formato adjuntado guardado en la base de datos sea una imagen, un .txt, etc (el dato que retorna en la base de datos es un tipo de dato binario)
Gracias..
una consulta algo similar para una lista desplegable de seleccionar valores multiples he creado un dataset con un select distinct ... where in @país ejemplo y sobre este parámetro le di un join no me responde cuando hago la selección x ke tengo otro procedimiento almacenado que me trae 2 parámetros de entrada.
ResponderEliminar