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:
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:
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:
Después de hacer clic en “Rango numérico” completo el formulario:
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:
Ahora la segmentación muestra el número según sea necesario:
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”:
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:
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%:
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:
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.