¡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!