En base a mi experiencia he visto que uno de los tipos de parámetro más utilizado en la mayoría de los informes realizados con Reporting Services es el calendario. Es raro encontrar un informe que no tenga un o varios parámetros para identificar un rango o un momento en el tiempo que identifique los datos a mostrar por los informes.
Cuando el informe está atacando al motor relacional, utilizar el valor devuelto por el parámetro calendario es automático, podemos utilizarlo directamente contra las columnas datetime que se utilizan en nuestra consulta relacional, sin embargo, cuando el informe está utilizando una consulta MDX su uso se complica algo más.
En el siguiente ejemplo, vemos como se ha definido a través del asistente un filtro basado en la dimensión tiempo y que se modificará a través de parámetros en el informe.
Al marcar los check-boxes que identifican el filtro como parámetro veremos que por cada uno de los parámetros que se definen, se crea automáticamente:
- Un dataset oculto en el informe que devuelve el conjunto de miembros de la dimensión utilizada para filtrar por cada uno de los parámetros.
- Un parámetro en el informe que utiliza el dataset para mostrar la jerarquía de tiempo al usuario.
Cuando la dimensión es el tiempo dicho dataset devuelve el rango de fechas que tengamos cargados en nuestra dimensión visualizado en el árbol jerárquico que se haya definido. Esta solución, aunque válida desde el punto de vista técnico, presenta varios problemas; Por un lado no suele agradar al usuario final y por otro puede provocar problemas de rendimiento si tenemos un rango de fechas muy grande cargado en la dimensión tiempo. Estos dos problemas se pueden resolver fácilmente si la clave de la dimensión tiempo está basada en una clave inteligente, es decir, la clave de cada registro en la dimensión tiempo identifica de forma visual la fecha del registro y no es un mero índice incremental (la clave del registro es un entero que representa la concatenación del año, el mes y el dia con el formato yyyymmdd).
Si nuestra dimensión sigue esta regla ya estamos preparados para utilizar parámetros datetime en el informe y podremos seguir los siguientes pasos para su correcta implementación:
- Eliminar el dataset que ha creado SSRS para evitar que se ejecute y se produzca una demora en la presentación del informe al usuario. (datasets FromDateCalendar y ToDateCalendar que aparecen en la Ilustración 2)
- Editar el parámetro (elemento perteneciente a la colección parameters) para indicar que no utilice ningún dataset como fuente de origen a la vez que indicamos que el parámetro es de tipo datetime.
- Editar los parámetros del dataset principal (AsistenciasSanitarias en nuestro ejemplo) para que utilicen una expresión que identifique el miembro de la dimensión tiempo asociado a la fecha seleccionado por el usuario. En nuestro ejemplo las expresión quedan como sigue:
Parameter Value para el Parámetro FromDateCalendar: =“[Date].[Calendar].[Date].&[“ + year(Parameters!FromDateCalendar.Value).ToString + month(Parameters!FromDateCalendar.Value).ToString(“00”) + day(Parameters!FromDateCalendar.Value).ToString(“00”) + “]”
Parameter Value para el Parámetro ToDateCalendar: =“[Date].[Calendar].[Date].&[“ + year(Parameters!ToDateCalendar.Value).ToString + month(Parameters!ToDateCalendar.Value).ToString(“00”) + day(Parameters!ToDateCalendar.Value).ToString(“00”) + “]” |
Una vez seguidos estos pasos, la experiencia del usuario se habrá incrementado drásticamente al poder utilizar el control calendario (Ilustración 4) para poder filtrar los datos que desea visualizar en lugar de tener que navegar por una lista de fechas (Ilustración 3).