Blog

CREAR UNA TABLA DE PERIODOS TEMPORALES PARA USAR COMO SLICER

Publicado por:

En muchas ocasiones en nuestros informes, seria muy útil, disponer de un segmentador (slicer), por periodos temporales que nos permitan visualizar determinados valores como puedan ser los importes o unidades vendidas, en un periodo temporal concreto, el día, la semana, el mes o año actual. Existe un blog muy creativo en este sentido de Chris Webben que nos aporta una metodología basada en lenguaje M para conseguir esto. Sobre este articulo Francisco Mullor Cabrera, nos escribe otro blog donde realiza el mismo segmentador utilizando DAX, lógicamente queda a criterio del usuario la utilización de uno u otro método.

Supongamos que tenemos un visual en nuestro Cuadro de mandos, en el que deseamos visualizar las ventas por importe y cantidad de unidades, a partir de nuestra taba de hechos, Ventas. Pero deseamos que esta visualización sea dinámica, es decir poder seleccionar los datos que veremos en el visual, por ejemplo, las ventas del día anterior (no hemos incluido un periodo con las ventas del día, dado que solo seria efectivo visualizarlo al finalizar el día)

En ambos casos requiere incluir una tabla añadida a nuestro modelo que estará directamente relacionada con nuestra tabla de fechas, una tabla dimensional, que incluirá, esos periodos temporales por los que segmentar nuestra visualización. La tabla dispondrá de tres campos, “denominacion del periodo”, “fecha” y un campo “sort”, que nos ayudará a ordenar temporalmente de manera adecuada, para la visualización del Slicer. La ventaja de la metodología utilizada en su blog por Chris Webben, es la utilización para los periodos de ser un valor dinámico partiendo de la definición del día de hoy con la función de M, Date.From(DateTimeZone.FixedUtcNow(), haciendo referencia a la norma UTC para establecer la fecha actual. De esta manera con las distintas funciones de tiempo que M nos proporciona y apoyándonos de la función duration (días, horas, minutos, segundos), podremos crear los periodos que nos interesan.

El primer paso es crear la función que nos permitirá crear parametrizar los periodos, y a la que llamaremos después cuando deseemos crear la tabla de periodos.

En este primer paso, crearemos una consulta en blanco, y tras llamar al Editor avanzado, pegaremos el siguiente código, tras comprobar que no existe ningún error de sintaxis clicaremos en “Listo” en la parte inferior derecha del editor. Daremos un nombre a la consulta que sea sencillo de identificar para después llamar a esta función cuando creemos la tabla.

(
NombrePeriodo as text,
FechaInicial as date,
FechaFinal as date,
Clasificacion as number
) as table =>
let
   ContarDias = Duration.Days(FechaFinal-FechaInicial)+1,
   ListaFechas = List.Dates(FechaInicial,ContarDias,#duration(1,0,0,0)),
   AñadirPeriodo = List.Transform(ListaFechas,
       each {NombrePeriodo,_,Clasificacion}),
   CrearTabla = #table(
       type table[Periodo=text, Fecha=date, Orden=number],
       AñadirPeriodo)
in
   CrearTabla

Una vez creada la tabla de parametrización, volveremos a crear una consulta en blanco, y tras invocar de nuevo al Editor avanzado. Copiaremos el siguiente código

let
   FechaActual =
       if Date.DayOfWeek(Date.From(DateTimeZone.FixedUtcNow())) = 0
       then Date.From(DateTimeZone.FixedUtcNow())+ #duration(-3,0,0,0)
       else
           if Date.DayOfWeek(Date.From(DateTimeZone.FixedUtcNow()))=7
           then Date.From(DateTimeZone.FixedUtcNow())+ #duration(-2,0,0,0)
           else Date.From(DateTimeZone.FixedUtcNow())+ #duration(-1,0,0,0),
//La declaración de esta variable, solo pretende seleccionar el ultimo día laborable hasta hoy, considerando
//la semana laborable de lunes a viernes, y declarando el ultimo día laborable sin contar el actual
   Ranges = {
               {«Hoy»,
               FechaActual,
               FechaActual,
               1},
                {«Semana Actual hasta la Fecha»,
               Date.From(Date.StartOfWeek(FechaActual)),
               FechaActual,
               2},
               {«Mes Actual hasta la Fecha»,
               Date.From(Date.StartOfMonth(FechaActual)),
               FechaActual,
               3},
               {«Año Actual hasta la fecha»,
               Date.From(Date.StartOfYear(FechaActual)),
               FechaActual,
               4},
               {«Ultima Semana»,
               Date.AddWeeks(FechaActual,-1) + #duration(1,0,0,0),
               FechaActual,
               5},
               {«Ultimo Mes»,
               Date.AddMonths(FechaActual,-1) + #duration(1,0,0,0),
               FechaActual,
               6},
               {«Ultimo Año»,
               Date.AddYears(FechaActual,-1) + #duration(1,0,0,0),
               FechaActual,
               7}
             },
   GetTables = List.Transform(Ranges,
           each #»Parametrizacion _Periodos»(_{0}, _{1}, _{2}, _{3})),
   Output = Table.Combine(GetTables)
in
   Output

 

En cada uno de los Ranges, creamos la lista con los valores que la función creada anteriormente, nos va a requerir (Nombre del Periodo, FechaInicial, FechaFinal y numero de orden)

Con estos sencillos pasos crearemos una tabla de Periodos que utilizaremos después en nuestra visualización.

Así supongamos en nuestro ejemplo, que deseamos visualizar las ventas por el periodo seleccionado, y como las unidades vendidas.

Pudiendo seleccionar en el Slicer cual Periodo queremos visualizar.

El ejemplo que hemos tomado es muy sencillo, con una única tabla de hechos “Ventas”, y dos tablas auxiliares la tabla calendario que crearemos en DAX para nuestro informe con la función CALENDAR()

   Calendario =
       CALENDAR ( MIN ( Ventas[Date] ) ; MAX ( Ventas[Date] ) )

Y la tabla auxiliar “Periodos” que habremos creado en Editar consultas con las expresiones y como hemos indicado al principio de nuestro articulo

Tan solo tenemos que hacer una salvedad, y es que la relación entre Periodos y Calendario ha de ser Bidireccional, dado que el flujo de la relación tan solo fluye del lado uno al lado muchos y para llegar desde Periodos hasta Ventas no podría puesto que sería una transición de muchos a muchos, salvedad que reducimos con la bidireccionalidad de la relación. A pesar de que en otros blogs, no hemos recomendado el uso de las relaciones bidireccionales, por los posibles problemas de ambigüedad que pudieran surgir y afectar a nuestro modelo, en este caso podemos obviarlo, dado que la tabla periodo tiene una única relación con Calendario, no produciendo ambigüedad con la relación con otras tablas, ya que todas las relaciones serán de manera unidireccional con la tabla Calendario.

En próximos blogs, realizaremos variaciones de esta tabla creada, tanto desde DAX como con un poco de imaginación obtener tablas que nos puedan servir de segmentadores para nuestras visualizaciones, creando periodos desde, hasta, por ejemplo

 

Un saludo

0

Sobre el Autor:

  Posts Relacionados
  • No related posts found.

Escribe un Comentario