jueves, 13 de noviembre de 2025

Calendario Maestro para Qlik Sense

En QlikView el calendario maestro debíamos fabricarlo nosotros mismo desde cero (ver post anterior). Con la llegada de Qlik Sense descubrimos que automáticamente se generaba un calendario maestro en el propio script. Este calendario traía algunas novedades, como poder etiquetar los nombres de los campos. Según esa etiqueta funcionarán de una forma u otra. Además podíamos asociar varias variables de fecha al calendario y él solo hacía la magia.

Pero no es oro todo lo que reluce. Los campos se crean 'calificados', o sea, con el nombre del calendario + nombre del campo de fecha usado para crearlo + nombre del campo propiamente dicho.

Por ejemplo:
Si tenemso un calendario llamado autoCalendar y una variable de fecha asociada a él llamada FECHA_INTERVENCION y de esa fecha obtenemos el campo Año, ese campo se llamará:
FECHA_INTERVENCION.autoCalendar.Año

Esto ocurre porque al mismo calendario se le puede asociar muchos campos de fechas diferentes y para cada uno de ellos hará el calendario completo. Si no estuvieran calificadas, tendríamos tablas de síntesis gigantescas.

Esto puede llegar a ser un poco engorroso cuando tenemos que usarlo en gráficos porque si los nombres son muy largos, muchas veces no caben en el menú desplegable que aparece para seleccionar el campo correcto. Además obliga constantemente en etiquetar el campo cada vez que se usa en un objeto.

A continuación dejo un calendario con los mismos nombres de campos del post antiguo para QlikView pero adaptado a Sense.

[autoCalendar]:
DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS
Year($1) AS [Año] Tagged ('$axis', '$year'),
Dual('Q'&Num(Ceil(Num(Month($1))/3)),Num(Ceil(NUM(Month($1))/3),00)) AS [Trimestre] Tagged ('$quarter', '$cyclic'),
Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [Año_Trimestre] Tagged ('$yearquarter', '$qualified'),
Dual('Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [_YearQuarter] Tagged ('$yearquarter', '$hidden', '$simplified'),
Month($1) AS [Mes] Tagged ('$month', '$cyclic'),
Dual(Year($1)&'-'&Month($1), Year($1)*100+Month($1)) AS [Año_Mes] Tagged ('$axis', '$yearmonth', '$qualified'), //Texto para visualizar, num para ordenar
Dual(Month($1), monthstart($1)) AS [_YearMonth] Tagged ('$axis', '$yearmonth', '$simplified', '$hidden'),
Num(Week($1)) AS [Semana] Tagged ('$weeknumber', '$cyclic'),
Dual(Year($1) & '-' & Num(Week($1),00),WeekStart($1)) AS [Año_Semana] Tagged ('$axis', '$week'),
Date(Floor($1)) AS [Date] Tagged ('$axis', '$date', '$qualified'),
Date(Floor($1), 'D') AS [_Date] Tagged ('$axis', '$date', '$hidden', '$simplified'),
monthname($1) as [MesAño],
Day($1)   as [Día],  
date($1-2,'DD/MM/YYYY') as "Ayer",

Year($1)*100+Month($1) AS AñoMes, //Sirve parz ahaccer comparaciones de fechas
Year($1)*10000+Month($1)*100+Day($1) AS  AñoMesDia,

WeekDay($1) as "Día Sem.",
Text(date($1,'WWWW')) as "Día Semana",
DUAL(month($1)&'-'&Day($1),
    month($1)*100+Day($1)) As Mes_Dia,
TEXT(Date($1,'MMMM')) AS Meslargo,
  If( date($1,'DD/MM/YYYY') >= YearStart(Today())  AND date($1,'DD/MM/YYYY') <= today(),  1,0) as IsInYTD, //ejemplo de uso: Sum( {$<IsInYTD={1}>} Amount )
  If( date($1,'DD/MM/YYYY') >= YearStart(addyears(Today(),-1)) AND date($1,'DD/MM/YYYY') <= addyears(Today(),-1), 1,0) as IsInPrevYTD,//ejemplo de uso: Sum( {$<IsInPrevYTD={1}>} Amount )
  If( (date($1,'DD/MM/YYYY') >= YearStart(Today())  AND date($1,'DD/MM/YYYY') <= today())
      OR(date($1,'DD/MM/YYYY') >= YearStart(addyears(Today(),-1)) AND date($1,'DD/MM/YYYY') <= addyears(Today(),-1)), 1,0) as IsInPrev2YTD,

Year(Today())-Year($1) AS [Hace_Años] ,
4*Year(Today())+Ceil(Month(Today())/3)-4*Year($1)-Ceil(Month($1)/3) AS [Hace_Trimestres] ,
12*Year(Today())+Month(Today())-12*Year($1)-Month($1) AS [Hace_Meses],
(WeekStart(Today())-WeekStart($1))/7 AS [Hace Semanas]
;
DERIVE FIELDS FROM FIELDS [<Aquí tu campo de fecha1>], [<Aquí tu campo de fecha2>], [<Aquí tu campo de fecha3>], [<Aquí tu campo de fecha N>] USING [autoCalendar] ;