Un ejemplo del mundo real del uso de UDF en DAX

Introducción

La característica de funciones definidas por el usuario se introdujo como una primera versión preliminar con el lanzamiento de septiembre de 2025.

Esta característica nos permite encapsular la lógica empresarial en funciones, que se pueden llamar como cualquier otra función estándar.

En este artículo, demostraré cómo utilizar esta función con un ejemplo del mundo real: calcular un pronóstico basado en las tasas de inflación.

Verá cómo crear una función simple y manejar un escenario más complejo.

Guión

Imaginemos una empresa que quiere pronosticar sus ingresos con una simulación de inflación.

Quieren simular cómo las diferentes tasas de inflación afectan sus ingresos mensuales.

Para simplificar, ignoramos la estacionalidad y utilizamos el último monto de ventas mensual conocido para calcular los ingresos futuros para el resto del año.

El usuario debe poder establecer una tasa de inflación y ver cómo cambian las cifras.

Preparar el modelo de datos.

Ahora, depende de si comienzo con un nuevo archivo de Power BI y cargo los datos o agrego esta funcionalidad a uno existente.

Lo primero que debe hacer es activar la función Vista previa:

Figura 1: Habilite la función Vista previa para funciones definidas por el usuario (Figura del autor)

Es posible que se vea obligado a reiniciar Power BI Desktop después de habilitarlo.

Para un archivo Power BI existente, debemos establecer el nivel de compatibilidad correcto para crear funciones definidas por el usuario (UDF).

Puede crear una función ficticia, que actualizará automáticamente el nivel de compatibilidad, o usar el Editor tabular para configurarlo al menos en 1702:

Figura 2: utilice el Editor tabular para actualizar el nivel de compatibilidad de la base de datos (Figura del autor)

Puede ingresar 1702 en el campo marcado y guardarlo.

Demostraré cómo crear una UDF simple más adelante en este artículo.

Vaya a la documentación de Microsoft para obtener más información sobre cómo crear una nueva UDF en Power BI Desktop. Puede encontrar el enlace en la sección de referencias al final de este artículo.

Agregar la selección de tarifas

Como el usuario debe poder seleccionar la tasa de inflación, agrego un parámetro al modelo de datos:

Figura 3: Agregar un parámetro al modelo de datos para un rango numérico (Figura del autor)

Después de hacer clic en “Rango numérico” completo el formulario:

Figura 4: Configuración del parámetro para un rango de porcentaje (Figura del autor)

Como quiero controlar el porcentaje, establezco el rango entre -0,02 y 0,05, que corresponde a -2% y 5%.

Después de unos segundos, la nueva segmentación de datos se agregó automáticamente a la página del informe.

Pero solo muestra los números decimales.
Debo cambiar el formato del número para ver porcentajes:

Figura 5: formato de la columna del parámetro a porcentaje (Figura del autor)

Ahora la segmentación muestra el número según sea necesario:

Figura 6 – La segmentación de datos con los números como porcentaje (Figura del autor)

Ahora está listo para usar.

Escribe la primera función.

Primero, creemos una UDF para devolver la tarifa seleccionada.

Prefiero escribirlo en Tabular Editor, porque su editor DAX es mucho más rápido que Power BI Desktop.

Pero también puede crearlo en la vista Consulta DAX en Power BI Desktop.

En el Editor tabular, voy al nodo Funciones, hago clic derecho sobre él y selecciono “Nueva función definida por el usuario”:

Figura 7: Cree una nueva UDF en Tabular Editor (Figura del autor)

Ahora puedo poner un nombre.

Para este primero, configuré “ReturnRate”.

Este es el código de la función:

(Tasa: VAL DECIMAL) => Tasa

Entre paréntesis, defino el parámetro Entrada.

Después de => puedo ingresar el código DAX para la función.

En este caso, devuelvo el parámetro de entrada.

Ahora, creo una medida para usar esta función:

Obtener tasa de inflación = tasa de retorno ([Inflation rate Value])

la medida [Inflation rate Value] se creó cuando creé el parámetro para seleccionar la tasa de inflación.

Cuando agrego una tarjeta y le asigno la nueva medida, veré el valor seleccionado en la segmentación de datos:

Figura 8 – Dos ejemplos que muestran que la medida que llama a las funciones devuelve la tasa de inflación seleccionada (Figura del autor)

Bien, esta es una función elemental, pero es sólo para ilustrar cómo funciona.

Escribe la función real.

Es posible que hayas notado la palabra clave VAL en la definición del parámetro.

Como puede leer con más detalle en los dos artículos siguientes, tenemos dos modos para pasar parámetros:

VAL: pasa el contenido del parámetro tal cual. EXPR: pasa el parámetro como una expresión, que se puede usar dentro de la función como una medida habitual.

En la siguiente función, uso ambos.

Aquí está el código completo para la función MonthlyInflation:

(Tasa: VAL DECIMAL, ValorEntrada: EXPR) => VAR MesActual = MAX( ‘Fecha'[MonthKey] ) VAR ÚltimoMesConDatos = CALCULAR( ÚLTIMONONBLANK( ‘Fecha'[MonthKey]
ValorEntrada), ALLEXCEPT( ‘Fecha’, ‘Fecha'[Year] ) ) VAR LastValueWithData = CALCULATE(InputVal, ALLEXCEPT(‘Fecha’, ‘Fecha'[Year]) ,’Fecha'[MonthKey] = LastMonthWithData ) VAR MonthDiff = CurrentMonth – LastMonthWithData VAR Resultado = IF(MonthDiff<=0,InputVal,(1 + ( Tasa * MonthDiff ) ) * LastValueWithData ) RETURN Resultado

El primer parámetro de la función es como antes.

El segundo parámetro será la expresión de la medida de entrada.

Dentro de la función, puedo usar el nombre del parámetro para cambiar el contexto del filtro y otras cosas. Debo configurar el parámetro como EXPR cuando necesito trabajar de esta manera dentro de la función.

La función realiza los siguientes pasos:

Obtengo la MonthKey más alta y la almaceno en la variable CurrentMonth
El contenido es el mes del contexto de filtro actual en formato numérico AAAAMM. Obtengo el último mes del año actual con un valor del parámetro de entrada (medida) y lo almaceno en la variable LastMonthWithData. Resto el mes actual del último mes con datos para obtener la diferencia. Este será el factor para calcular la tasa de inflación. El resultado se almacena en la variable MonthDiff. Si MonthDiff es menor o igual a 0, entonces el contexto de filtro (Mes) contiene un valor de la variable de entrada. Si no, el contexto de filtro (Mes) está en el futuro y podemos calcular el resultado.

Lo que estoy haciendo aquí es multiplicar la tasa de inflación seleccionada por la cantidad de meses desde el último mes con datos (LastMonthWithData).

Ahora puedo crear una medida para calcular dinámicamente el pronóstico mes a mes en función de la tasa de inflación seleccionada:

Ventas en línea con inflación = inflación mensual ([Inflation rate Value], [Sum Online Sales])

Este es el resultado para una tasa de inflación del 3%:

Figura 9 – Resultado del uso de la nueva UDF para calcular los ingresos mensuales en función de la tasa de inflación seleccionada (Figura del autor)

Los meses marcados en azul contienen datos reales y los meses marcados en rojo se calculan en función de la tasa de inflación seleccionada.

Lo bonito es que puedo pasar cualquier expresión DAX en la medida que quiera.

Por ejemplo, puedo agregar Ventas Online con Ventas Minoristas:

Figura 10 – Resultado con las Ventas Totales al sumar las Ventas Online y Minoristas al llamar a la función.

La medida para ello es la siguiente:

Ventas totales con inflación = inflación mensual ([Inflation rate Value], [Sum Online Sales] + [Sum Retail Sales])

Bueno, eso es muy fácil.

Sé que el cálculo es muy simplista, pero utilicé este ejemplo para mostrar lo que se puede hacer con las UDF.

¿Cuál es el punto?

Entonces, ¿ese es el punto con las UDF?

La mayoría de las cosas que se muestran aquí también se pueden hacer con grupos de Cálculo.

Bueno, eso es verdad.

Pero usar una UDF es mucho más fácil que usar un elemento de cálculo.

Además, podemos escribir UDF independientes del modelo y reutilizarlas en varios modelos.

Eche un vistazo a Ampliar Power BI con DAX Lib.

Se trata de una colección cada vez mayor de UDF independientes del modelo que contienen lógica que se puede utilizar en cualquier modelo de datos.

Otros puntos diferenciadores entre las UDF y los elementos de cálculo son:

Las UDF no se pueden agrupar, pero los elementos de cálculo se pueden agrupar en grupos de cálculo. Los elementos de cálculo no tienen parámetros. UDF se puede llamar directamente como cualquier otra función DAX.

Pruébelo para obtener más información sobre las posibilidades de las UDF.

Conclusión

son una gran adición al conjunto de herramientas de Power BI y Fabric.

Estoy seguro de que será cada vez más importante saber cómo trabajar con las UDF, ya que su potencial se hará más evidente con el tiempo.

Como estamos en las primeras etapas de la introducción de esta característica, debemos estar atentos para ver qué hará Microsoft a continuación para mejorarla.

Existen algunas restricciones en esta función. Los encontrará aquí: Consideraciones y limitaciones de las funciones definidas por el usuario de DAX.

Hay suficiente margen de mejora.

Veamos qué viene después.

Referencias

Aquí, la documentación de Microsoft para funciones definidas por el usuario: Uso de funciones definidas por el usuario de DAX (vista previa) – Power BI | Microsoft aprende.

Este es el artículo de SQL BI que explica la característica con gran detalle: Introducción de funciones definidas por el usuario en DAX – SQLBI.

Una colección de UDF independientes del modelo de uso gratuito: amplíe Power BI con DAX Lib.

Como en mis artículos anteriores, utilizo el conjunto de datos de muestra de Contoso. Puede descargar el conjunto de datos ContosoRetailDW de forma gratuita desde Microsoft aquí.

Los datos de Contoso se pueden utilizar libremente bajo la licencia MIT, como se describe en este documento. Cambié el conjunto de datos para cambiar los datos a fechas contemporáneas.