martes, 12 de mayo de 2020

PowerPivot: uso de variables VAR con DAX

Hoy toca un post realmente interesante por el trabajo que nos puede ahorrar al trabajar en nuestros modelos de datos, además de la limpieza y claridad que aporta a nuestras medidas y cálculos.
Hablaremos del uso de las variables VAR en el lenguaje DAX para PowerPivot.

Algunos conceptos a considerar.
VAR almacena el resultado de una expresión como una variable con nombre que después se puede pasar como argumento a otras expresiones de medida. Una vez que se han calculado los valores resultantes de una expresión variable, esos valores no cambian, aunque se haga referencia a la variable en otra expresión.

Por tanto, el valor devuelto es una variable con nombre que contiene el resultado del argumento de expresión.

Una expresión pasada como argumento a VAR puede contener otra declaración VAR.
Al hacer referencia a una variable:
-Las medidas no pueden hacer referencia a variables definidas fuera de la expresión de medida, pero pueden hacer referencia a variables de ámbito funcional definidas dentro de la expresión.
-Las variables pueden hacer referencia a medidas.
-Las variables pueden hacer referencia a variables definidas previamente.
-No se puede hacer referencia a columnas de variables de tabla mediante la sintaxis TableName[ColumnName].


Continuando con las entradas del blog anteriores a esta y con el modelo de datos de la imagen:

PowerPivot: uso de variables VAR con DAX



Supongamos queremos calcular, sobre nuestro modelo, el Margen de Ventas por Año y Cliente.
Sabiendo que el margen corresponde con:
(Ventas-Costes) / Ventas

Lo más simple sería crear una única medida:
MVentas%:=
VAR PC= SUMX(TblVentas;TblVentas[Unidades]*[PCM_total])
VAR PV= SUMX(TblVentas;TblVentas[Unidades]*TblVentas[Precio Venta unitario])
RETURN
DIVIDE(PV-PC;PV)


PowerPivot: uso de variables VAR con DAX



Antes de comprobar el resultado en un informe de tabla dinámica en la hoja de cálculo veremos la alternativa 'desgranada' en varías medidas.

Una primera medida para el 'Precio de Venta':
Pz_Venta_:=SUMX(TblVentas;TblVentas[Unidades]*TblVentas[Precio Venta unitario])

Una segunda medida para el 'Precio de Coste':
Pz_Coste:=SUMX(TblVentas;TblVentas[Unidades]*[PCM_total])

(ver entrada anterior para ver el cálculo de la medida [PCM_total]!!)

Y una última medida para componer el cálculo del Margen:
MargenVentas:=([Pz_Venta_]-[Pz_Coste])/[Pz_Venta_]

PowerPivot: uso de variables VAR con DAX



Comprobamos como el resultado de ambos procesos es idéntico... como cabía esperar.


Otro ejemplo del uso de VAR sería el siguiente:
TV_VAR:=
CALCULATE(
VAR PV=SUMX(TblVentas;TblVentas[Unidades]*TblVentas[Precio Venta unitario])
RETURN
PV;
CROSSFILTER(TblDirector[Cod país];TblPais[Cod país];Both)
)


que sustituiría a estas dos medidas dependientes...
PV:=SUMX(TblVentas;TblVentas[Unidades]*TblVentas[Precio Venta unitario])
y
TV_VAR:=CALCULATE([PV];CROSSFILTER(TblDirector[Cod país];TblPais[Cod país];Both))

Es un ejemplo muy sencillo, donde seguramente las variables no parecen aportar gran cosa, pero da la idea de su potencial...


Resulta curioso comprobar lo poco extendido que está la instrucción VAR de DAX entre los usuarios habituales de las herramientas Power (yo mismo me incluyo), por preferirse crear diferentes medidas 'parceladas' para finalmente componer el cálculo final...

Mas aún teniendo presente su funcionamiento, según los conceptos indicados al inicio del post, donde básicamente se indica que hay un proceso donde según definimos variables se graban en memoria, por lo que variables definidas posteriormente no pueden procesar cálculos (con CALCULATE por ejemplo, pero también operaciones con filtros); y segundas, terceras,... variables podrían no operar sobre previas, dejando huérfanos nuestros cálculos :-(

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.