Calendario maestro para QlikView - Master Calendar


Al momento de realizar el modelo de datos para una aplicación normalmente siempre se va a trabajar con datos de fecha y hora, por lo que tener un correcto manejo del tiempo va a ser muy importante para la aplicación y sobre todo para obtener datos válidos.

Los usuarios muchas veces no están interesados tanto en las transacciones y eventos individuales sino en ver la información a nivel global, por ejemplo los totales por mes, trimestre, algún periodo personalizado o ver tendencias a lo largo de varios periodos.

Los sistemas transaccionales normalmente guardan la fecha en que ocurrió una transacción o evento, pero no proporcionan información adicional para agrupaciones de tiempo. Esto tiene sentido porque los sistemas transaccionales buscan no guardar información redundante.

Ahora bien, en nuestras aplicaciones QlikView buscamos poder hacer selecciones y agregaciones tan fácil como sea posible para los usuarios. Es por eso que, además de tener un campo con la fecha original, incluimos en nuestro modelo de datos los componentes de Mes, Trimestre y Año.

El siguiente es un ejemplo de un calendario donde se maneja a nivel de día, día de semana, semana del año, cuatrimestre y año.

Quarter_Map:
Mapping
LOAD * INLINE [
    Month, Quarter
    Jan, Q4
    Feb, Q4
    Mar, Q4
    Apr, Q1
    May, Q1
    Jun, Q1
    Jul, Q2
    Aug, Q2
    Sep, Q2
    Oct, Q3
    Nov, Q3
    Dec, Q3
];

SET vDateMin = Num(date('01/01/1950','DD/MM/YYYY'));
SET vDateMax = Num(date('31/12/2050','DD/MM/YYYY'));
LET vDateToday = Num(Today());

//LET vDateMin = Num(Peek('Open_DateTime', 0, 'Interval_Table'));
//LET vDateMax = Num(Peek('Close_DateTime', -1, 'Interval_Table'));
//LET vDateToday = Num(Today());

TempCalendar1:  LOAD $(vDateMin) + RowNo() - 1 AS Date_Key,  Date($(vDateMin) + RowNo() - 1) AS Date  AUTOGENERATE 1  WHILE $(vDateMin)+IterNo()-1<= $(vDateMax);

Master_Calendar:
Load Date_Key,
        Date,
        Date as CalendarDate,
        Day(Date) as CalendarDay,
        Week(Date) as CalendarWeek,
        WeekName(Date) as CalendarWeekName,
        month(Date) as CalendarMonth,
        MonthName(Date) as CalendarMonthName,
        MonthName(Date) as CalendarPeriod,
        Quartername(Date) as CalendarQuarterName,
        ApplyMap('Quarter_Map',num#(month(Date)))as CalendarQuarter,
        Year(Date) as CalendarYear,
        WeekDay(Date) as CalendarWeekDay,
        Text(weekday(Date)) as Week_Day1,
        WeekDay(Date) as CalWeekDay,
        Week(Date) as CalWeek,
        Week(Date+3) as CalRWeek,
        WeekName(Date) as CalWeekName,
        WeekName(Date,1,4) as CalWeekRName,    //4=Fri     // Friday - Thursday Business Week
        MakeWeekDate(Year(Date),Week(Date)) as CalWkSD,
        num(MakeWeekDate(Year(Date),Week(Date))) as CalWkSDNum,
        MakeWeekDate(Year(Date+3),Week(Date+3),-3) as CalWkRSD,
        Num(MakeWeekDate(Year(Date+3),Week(Date+3),-3)) as CalWkRSDNum  
Resident TempCalendar1;
Drop Table TempCalendar1;

Este es otro ejemplo de calendario maestro, el cual es el que uso más seguido, en el se tiene información a nivel de día, día de semana, semana del año, mes, trismestre, semestre y año. El código es el siguiente:

//[Calendario]:
LET vDateMin = Num(MakeDate(2010,1,1));
//LET vDateMax = Floor(YearEnd(Today()));
LET vDateMax = Floor(Today());

TempCalendar:  
LOAD $(vDateMin) + RowNo() - 1 as DateNumber,
  Date($(vDateMin) + RowNo() - 1) as TempDate
AUTOGENERATE 1  
WHILE $(vDateMin) + IterNo() - 1<= $(vDateMax);  

MasterCalendar:  
LOAD TempDate as Fecha,
  // TempDate as Periodo, 
  Year(TempDate) as Año,
  Right('0' & Month(TempDate) * 1,2) as Mes,
  // Year(TempDate)*100 + Month(TempDate) as AñoMes,
  Week(TempDate) as Semana,
   Month(TempDate) as Mes_textocorto,
   if(Month(TempDate) = 'ene','Enero',
    if(Month(TempDate) = 'feb','Febrero',
     if(Month(TempDate) = 'mar','Marzo',
      if(Month(TempDate) = 'abr','Abril',
       if(Month(TempDate) = 'may','Mayo',
        if(Month(TempDate) = 'jun','Junio',
         if(Month(TempDate) = 'jul','Julio',
          if(Month(TempDate) = 'ago','Agosto',
           if(Month(TempDate) = 'sep','Septiembre',
            if(Month(TempDate) = 'oct','Octubre',
             if(Month(TempDate) = 'nov','Noviembre',
              if(Month(TempDate) = 'dic','Diciembre')))))))))))) as Mes_textolargo,
   // MonthName(TempDate) as AñoMes_texto,
   // 'T' & Ceil(Month(TempDate)/3) as Trimestre, 
   if(Ceil(Month(TempDate)/3)=1,'Ene-Mar',if(Ceil(Month(TempDate)/3)=2,'Abr-Jun',if(Ceil(Month(TempDate)/3)=3,'Jul-Sep','Oct-Dic'))) as Trimestre, 
   'S' & Ceil(Month(TempDate)/6) as Semestre,  
   Day(TempDate) as Dia/*,
   WeekDay(TempDate)+1 as DiaSemana,
   if(WeekDay(TempDate) = '0','Lunes',
    if(WeekDay(TempDate) = '1','Martes',
     if(WeekDay(TempDate) = '2','Miercoles',
      if(WeekDay(TempDate) = '3','Jueves',
       if(WeekDay(TempDate) = '4','Viernes',
        if(WeekDay(TempDate) = '5','Sabado',
         if(WeekDay(TempDate) = '6','Domingo'))))))) as DiaSemana_textolargo,
   WeekDay(TempDate) as DiaSemana_textocorto, 
   if(WeekDay(TempDate) = '0','LMMJ',
    if(WeekDay(TempDate) = '1','LMMJ',
     if(WeekDay(TempDate) = '2','LMMJ',
      if(WeekDay(TempDate) = '3','LMMJ',
       if(WeekDay(TempDate) = '4','VSD',
        if(WeekDay(TempDate) = '5','VSD',
         if(WeekDay(TempDate) = '6','VSD'))))))) as [Flag LMMJ_VSD],
   if(WeekDay(TempDate) = '0','LMMJV',
    if(WeekDay(TempDate) = '1','LMMJV',
     if(WeekDay(TempDate) = '2','LMMJV',
      if(WeekDay(TempDate) = '3','LMMJV',
       if(WeekDay(TempDate) = '4','LMMJV',
        if(WeekDay(TempDate) = '5','SD',
         if(WeekDay(TempDate) = '6','SD'))))))) as [Flag LMMJV_SD]*/
Resident TempCalendar 
Order By TempDate Asc;

Drop Table TempCalendar;

Let vDateMin = Null();
Let vDateMax = Null();

Comentarios