Este artículo se basa en el articulo de iQlik – Everything QlikView, The magic of set Analysis – point in time reporting.
Hemos decidido traducirlo y trabajar a partir de él, ya que es artículo con varios pequeños trucos que hacen un poco más fácil la tarea de reportes comparados con tiempos pasados o futuros.
Paso a Paso
Supongamos que un usuario tiene la siguiente selección
Año = 2012, Q = Q4, Mes = Nov
Nuestro usuario necesita comparar las ventas del mes de noviembre con las ventas del mes anterior (Octubre, en este caso), podemos hacer algo como esto
Sum( {$<Mes = {$(=Month(MakeDate(1, Max(Mes) -1)))}>} Ventas)
Pero lo anterior es algo brusco.
Podemos afrontar la situación de diferentes formas.
La primera, al final de nuestro script, podemos crear una variable que siempre tenga el valor del mes anterior:
LET vPriorMonth = ‘Month(AddMonths(Max(fulldate), -1))’; // Mes anterior en letras
LET vPriorMonthYear = ‘Year(AddMonths(Max(fulldate), -1))’; // Año correspondiente al mes anterior
La primera variable nos devolverá siempre el mes anterior al mes en el cual se encuentre el máximo del rango de fechas que tenemos seleccionadas, mientras que la segunda variable, nos devolverá el año correspondiente a ‘el primer día del mes anterior’. Esto lo hacemos ya que si simplemente utilizamos el Max(Month) – 1, obtendremos un valor de 10 (que corresponde a Octubre) que no nos sirve para compararlo directamente con nuestro campo Month (que tiene representación string).
Otra forma puede ser creando un campo adicional en nuestro calendario, llamémoslo Mes#, donde almacenaremos el número correspondiente al mes así:
Num(Month(Fecha))
Lo que nos permite este campo, es manejar el número del mes directamente en las expresiones donde necesitemos hacer el set analysis Mes# = {$(= Max(Mes#) – 1)} para referirnos al mes anterior.
Nuestra expresion preliminar se vería así
Sum({$<Mes# = {$(= Max(Mes#) – 1)} >} Ventas)
Llegados a este punto, nos damos cuenta de que en realidad esta expresión está devolviendo cero, ya que los datos que estamos intentando recuperar, se encuentran de hecho, excluidos de la selección del usuario. Recuerdas, el usuario había seleccionado Noviembre, y no hay ningún dato que cruce Mes = ‘Nov’ con Mes# = 10, ya que el valor de Mes# para Noviembre es 11.
Para solucionar el problema anterior necesitaremos “cancelar manualmente” la selección que ha hecho el usuario sobre el campo Mes.
Sum( {$< Mes# = {$(= Max(Mes#) – 1)}, Mes = >} Ventas)
El usuario sigue explorando su información mediante sus selecciones y…
Año = 2012, Mes = Oct, Q = Q4
La expresión anterior no funcionará, porque el dato de Septiembre no cruza con el Q4, lo que nos lleva a modificar nuevamente la expresión
Sum( {$< Mes# = {$(= Max(Mes#) – 1)}, Mes =, Q = >} Ventas)
Supongamos ahora que el cliente selecciona algo como Año = 2012, Mes = ‘Ene’ (nada seleccionado en el campo de Q, pero sabemos que debería ser solo Q1). Como Enero es el primer mes del año, nuestra expresion nos devolvería un cero (que por supuesto no encontrará en el set de datos)
Lo prupuesto entonces es crear un consecutivo para TODOS los meses, es decir, el ultimo mes de un año va a tener un valor menor al primer mes del siguiente año. Esto lo podemos lograr así:
(Year(fulldate) – 1) * 12 + Num(Month(fulldate))
Esto nos dará, por ejemplo, el valor de 24120 para Diciembre de 2009, y 24121 para Enero de 2010. Podemos entonces utilizar este nuevo campo para agilizar nuestras comparaciones con periodos anteriores asi
Sum({$<MonthID = {$(=Max(MonthID) – 1)}, Year = , Quarter = , Month = >} Sales)
Esto nos brindaría el análisis que necesitamos con el mes anterior más fácilmente que utilizando las variables de vPriorMonth y vPriorYear. Acá adicionalmente hemos eliminado manualmente las selecciones de año, Cuarto, y Mes, para que no se desbarate el análisis cuando el usuario empiece a jugar con las selecciones.