¡Volvemos con los jueves de post! Después de un pequeño “descanso” (y lo he puesto entre comillas ya que en casa tenemos al pequeño Martin que nos alegra los días) volvemos con fuerza y energía renovada. ¿Y de qué va el post de hoy? Sobre algo que nos aporta mejora en el rendimiento y en la lectura del código, que son las variables. Las variables, lo primero de debemos tener en cuenta, es que no son variables globales, sino que son locales, es decir, yo si defino la variable A en la medida “Ventas” no puedo llamar a la variable A en la medida “Compras”. Si la quisiera usar, tendría que volver a crearla en la medida “Compras”. Por otro lado, si vienes del mundo de la programación, las variables en DAX son constantes y no se puede modificar el valor de la misma como en otros lenguajes de programación (acaba de llegar el cortocircuito mental J ). ¿Qué significa esto? Qué una vez evaluada la expresión, esta no varía su valor.

Bien, una vez aclarado estos puntos, vamos a meternos a fondo con las variables. Lo tercero que debemos saber al respecto es su nomenclatura se escriben con v la primera y con b la segunda J. Bromas aparte, una variable se define de la siguiente manera:

 

 
 
Lo primero que vemos, es que definimos la variable mediante el acrónimo VAR (no, no es el mismo VAR que en el fútbol). A continuación, definimos la expresión que engloba esa variable y por último la sentencia RETURN para devolvernos en caso de necesitar el resultado de la variable. Y como sois muy curiosos, os estaréis preguntando porque he escrito “en caso de necesitar el resultado” y no “para devolvernos el resultado”. ¿Alguien se imagina el por qué? Porque las variables se evalúan en lo que se conoce como la evaluación perezosa, si les haces madrugar no se levantan J. Significa que, si en el cálculo de la medida no se requiere el valor de la variable, esta NO se calcula. Añadir también, que podemos incluir tantas variables como nos sean necesarias para ejecutar nuestra medida de una manera óptima, pero sólo debemos de introducir un RETURN. Veámoslo con un ejemplo, que como siempre digo, se entienden mejor las cosas. Imaginemos que tenemos que calcular el % de ventas de los productos seleccionados en el informe y escribimos la siguiente medida:

 
 
 

La arrastramos al lienzo de nuestro modelo de Contoso, nos devuelve el siguiente resultado:

 
 

Si observamos la métrica detenidamente, vemos que tenemos 4 variables definidas, que son:

VentasProductos, CostesTotales, VentasTotales y Porcentaje.

Y un sólo RETURN, que nos devuelve la división de las ventas de cada producto entre las ventas totales de los productos. Es decir, para el cálculo de la métrica VentasTotales usamos las variables VentasProductos, VentasTotales y Porcentaje. Por otro lado, la métrica CostesTotales no la usamos para ningún calculo por lo que esta variable NO se nos va a calcular. Y diréis, ¿entonces por qué la has escrito? Pues a modo ilustrativo J. ¿Se entiende? Bien, ahora seleccionamos las categorías de Audio, Equipos y TV y vídeo:

 
 

Vemos que los valores siguen siendo los mismos que sin la selección de las categorías… algo nos está fallando en la métrica, ¿cómo lo podemos analizar? Bien, una de las ventajas del uso de variables es que nos permite evaluar paso a paso cada variable de la siguiente manera:

 

En vez de que nos devuelva el valor de la variable “Porcentaje”, modificamos la métrica para que nos devuelva el valor de la variable VentasProductos:

 

Vemos que nos devuelve un valor correspondiente a cada venta de cada uno de los productos. Si añadimos alguna otra categoría de productos, vemos que el valor se actualiza correctamente:

 

Ahora modificamos el código de nuevo y colocamos el valor de la variable VentasTotales:

 

 

Y vemos que nos devuelve la métrica:

 
 
 
Nos está devolviendo el Total en todas las filas de la matriz. Si añadimos de nuevo otra categoría, vemos que el valor de las VentasTotales sigue siendo el mismo que en el caso anterior, es decir, no varía en función de la selección: 
 
 
 

Por lo tanto, aquí en esta variable, es dónde tenemos el problema, ya que no hace el requerimiento inicial, que era el cálculo del porcentaje de ventas sobre los productos seleccionados. ¿Cómo lo solucionamos? Venga, pregunta de lectura de post…

 

Esta es la métrica… ¿Por qué no nos devuelve el total de la selección? Porque tenemos un ALL (te dejo aquí el enlace al post en el que hablo de esta función. Para solventarlo, cambiamos el ALL por ALLSELECTED en la variable y ahora nos devuelve:

 
 
Vemos que el valor ahora ya no es el mismo que antes y si añadimos una nueva categoría, el valor se modifica en función de la selección:

 

 
 

Ahora devolvemos la métrica a su forma inicial con esta modificación:

 
 

Y obtenemos como resultado:

 
 
 

Si añadimos otra categoría: 

 

 
 

 Vemos que ahora sí nos está calculando según las especificaciones. Por lo tanto, empezamos a obtener conclusiones del uso de las variables que son:

  • Nos permiten “trocear” el código de manera que sea más legible.
  • Nos permiten una “depuración” del código (no es una depuración al uso de ahí las “”)

Por otro lado, como he dicho al comienzo del post, que las variables nos mejoran el rendimiento. ¿Y cómo puede ser que el uso de las variables nos mejore el rendimiento de nuestro modelo? Pues muy sencillo, imaginemos que tenemos la siguiente medida:

 

 

Que no es más que la suma de la cantidad de los productos vendidos, y queremos hacer un análisis de la demanda de los mismos. Por ejemplo, si la cantidad vendida es menor a 2.000.000 millones, es baja demanda, si es superior a 2.000.000 e inferior a 7.000.000 millones, es media demanda y si es superior a 7.000.000 millones es alta demanda. Para ello, definimos la siguiente medida:

 

 

Como podemos ver, para el cálculo de la categorización de los productos, vemos que, si la demanda es alta, le medida “Cantidad Productos” la calcula 4 veces, sí, habéis leído bien, 4 veces hace el mismo cálculo.

 

 

En cambio, si usamos variables, la métrica resultante sería la siguiente:

 

 
 

Y para el cálculo de productos de Alta Demanda, sólo calcula una única vez me medida y no 4 como en el ejemplo anterior:

 

 
 

Y como sois muy curiosos, os estáis preguntando: ¿Y por qué tenemos que creerte que está última medida tiene mejor rendimiento? Pues aquí os adelanto un pequeño flash del próximo post:

Medida sin variables: 

 
 

Medidas con variables:

 

 
 
 

Y con estas dos imágenes, hasta el siguiente post :) 

 

¡Nos vemos en los datos!