Hace poco tiempo estabamos trabajando en un proyecto y tuvimos la oportunidad de trabajar con las instrucciones Scope, Freeze y This de MDX. Estas tres funciones nos permiten jugar con el resultado devuelto por el cubo de una forma muy potente. Veamos un primer ejemplo sobre nuestro cubo de AdventureWorks 2012:

  • Imaginemos la siguiente consulta:

Jugando con los contextos de mi cubo

  • Imaginemos que nos llaman del departamento de ventas para advertirnos de que las ventas de Bicicletas de 2007 están incorrectas y deben ser ocultadas cuanto antes para evitar errores en el análisis de la información. Aunque esto lo podemos hacer de diversas maneras, una de las formas más ágiles es utilizar funciones de contexto de MDX. Con estas funciones haremos que se muestre un null en lugar del valor de las ventas de bicicletas para el 2007. Esto se haría añadiendo el siguiente código al final del Script MDX del cubo:
  1. scope([Measures].[Internet Sales Amount],[Product].[Category].&[1],[Date].[Calendar].[Calendar Year].&[2007]);
    this=null;
    end scope;

Y aquí podemos ver el resultado:

Jugando con los contextos de mi cubo

Como apreciamoes en la imagen, hemos ocultado las ventas de una manera muy rápida. Al ser un cambio en el script MDX no es necesario reprocesar nada y la única desventaja es que el cálculo de la celda se hace al vuelo cuando estamos obteniendo la información.

Analicemos la instrucción que acabamos de utilizar. Para empezar utilizamos scope para delimitar el espacio sobre el que queremos aplicar una modificación, en este caso sobre el conjunto formado por el año 2007, la categoría bicicletas y la medida Ventas por Internet. En segundo lugar utilizamos this= para asignar el valor que debe sobreescribir al valor que había hasta el momento, en este caso un null para ocultar la información. Por último cerramos la instrucción utilizando “end scope;” para indicar a SSAS que hemos terminado la instrucción.

Cuando trabajamos con estos scopes hay que tener en cuenta que el script MDX se ejecuta de forma secuencial, de manera que si tenemos varias instrucciones scope que afectan a una porción del espacio tenemos que tener en cuenta que se ejecutaran en orden y ese espacio se reasignara varias veces. Además, todas estas asignaciones se van a realizar en tiempo de consulta por lo que debemos cuidar mucho estas reasignaciones ya que podríamos provocar problemas de rendimiento.

Siguiendo con nuestro ejemplo, una vez corregida la información del DW podríamos volver a mostrar la información eliminando el scope que habíamos añadido.

Otra cosa que se podría haber hecho para este ejemplo es colorear la celda en lugar de ocultar el valor. Hay que tener en cuenta que las medidas calculadas que utilicen esta medida seguirán calculandose correctamente.

scope([Measures].[Internet Sales Amount],[Product].[Category].&[1],[Date].[Calendar].[Calendar Year].&[2007]);
Back_Color(this)=255 /*Red*/;
end scope;

Este formato tiene que ser disponible desde la herramienta cliente, por ejemplo Excel lo soporta:

Jugando con los contextos de mi cubo

Esta implementación que estamos haciendo afecta a las celdas a nivel de año pero si analizaramos a nivel de mes, la información la seguiríamos viendo sin problemas:

Jugando con los contextos de mi cubo

Podríamos afectar a todos los niveles de 2007 de distintas maneras, por ejemplo, si ponemos a null el nivel de mes del año 2007 obtendremos que todos los niveles por encima a null, ya que al agregar los niveles de trimestre, semestre y año el valor que se suma ya está anulado. Sin embargo, a nivel de día seguimos obteniendo datos que podríamos modificar siguiendo la misma técnica. Este sería el resultado:

Jugando con los contextos de mi cubo

Y así es como quedaría el scope que nos proporciona este comportamiento:

  1. scope([Measures].[Internet Sales Amount],[Product].[Category].&[1],descendants([Date].[Calendar].[Calendar Year].&[2007],[Date].[Calendar].[Month]));
    this=null;
    //Back_Color(this)=255 /*Red*/;
    end scope;

En la línea del scope hay que hacer notar el uso de la función descendants que selecciona los meses de 2007 para filtrar el conjunto de celdas sobre el que queremos aplicar el cálculo.

Esto es un ejemplo muy sencillo de las cosas que podemos hacer mediante estas funciones, en próximos posts hablaremos de la función freeze y mostaremos algún ejemplo adicional. Espero que os sea útil.

Un saludo

Ilde

0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada.

You May Also Like