Entre más vamos utilizando DAX en Power BI, una de las peticiones más repetidas por la comunidad ha sido la posibilidad de definir funciones reutilizables, como en otros lenguajes de programación, para evitar repetir lógica, facilitar el mantenimiento del modelo y mejorar la calidad del código. 

Pues bien: con la actualización de Power BI en septiembre de 2025, Microsoft ha introducido la capacidad de crear User-Defined Functions (UDF) en DAX, una funcionalidad que marca un nuevo paradigma de cómo crear y gestionar tus medidas y modelos de datos. 

En este blog veremos qué son las UDFs en DAX, por qué son importantes, cómo activarlas y definirlas, casos de uso y buenas prácticas.

🔹 ¿Qué son las User Defined Functions (UDFs) en DAX?

Las User Defined Functions (UDFs) son funciones creadas por el propio usuario dentro del modelo semántico de Power BI.
Permiten encapsular lógica DAX reutilizable dentro de una definición con nombre, parámetros y un cuerpo de expresión.

En otras palabras: en lugar de repetir la misma fórmula en múltiples medidas, ahora puedes definir la lógica una vez y reutilizarla en cualquier parte del modelo.

Esto trae beneficios muy importantes:

  • Reutilización de lógica y menor duplicación de código.
  • Modelos más limpios y fáciles de mantener.
  • Mayor consistencia en los cálculos.
  • Potencial mejora de rendimiento al evitar fórmulas redundantes.
 

Ejemplo sencillo

A modo ilustrativo, puedes definir algo así:
Imagen1.png 13.2 KB

En este ejemplo, se define la función AgregarIVA que recibe un parámetro y devuelve el parámetro multiplicado por 1.16.

Una vez que la función está en el modelo, puedes llamarla desde una medida, columna calculada o cálculo visual:

 

Cómo habilitar las UDFs en Power BI

Por ahora, las UDFs están disponibles en vista previa (Preview), por lo que debes activarlas manualmente:

  1. Ve a Archivo → Opciones y configuración → Opciones.
  2. En Características en versión preliminar activa “DAX User-Defined Functions”.
  3. Reinicia Power BI Desktop.
Después de esto, podrás crear y administrar tus funciones en la Vista de consultas DAX o mediante la vista TMDL (Tabular Model Definition Language).

Sintaxis general de una UDF

La estructura de una UDF en DAX es muy similar a la de una función en cualquier lenguaje de programación:

FUNCTION = ( : , ... ) =>

Ejemplo:

Puedes utilizar las UDF en:

-        Medidas DAX

-        Columnas calculadas

-        Tablas calculadas (Físicas o virtuales)

-        Calendarios

-        Cálculos visuales

-        En elementos de grupos de cálculo

-        En roles de seguridad en expresiones de filtro

-        En expresiones de cadena de formato

Tipos de parámetros en UDFs

Los parámetros son los argumentos que recibe una función y se definen entre paréntesis.
Cada parámetro puede tener un tipo y un subtipo, lo que ayuda a DAX a entender qué tipo de valor o referencia esperará durante la ejecución.

Tipos de parámetros:

 
 

Nota: No es obligatorio definir el tipo de parámetro, es solamente una ayuda semántica.

Incluso agregando un tipo de parámetro, la función puede aceptar otros tipos de datos. Por ejemplo, si se agrega un tipo de parámetro como decimal, DAX podría aceptar un int64.

 

Modos de paso de parámetros (Parameter-Passing Modes)

Uno de los conceptos más importantes al crear UDFs es entender los modos de paso de parámetros.
Estos definen cuándo y cómo se evalúan los parámetros dentro de la función, y pueden cambiar completamente el resultado de tus cálculos.

En DAX existen dos modos principales:

VAL (Value)

El parámetro se evalúa antes de ejecutar la función, en el contexto de la medida o cálculo que la invoca.
Esto significa que dentro del cuerpo de la función ya recibes un valor fijo, no una expresión.

Si el parámetro se usa varias veces, siempre devolverá el mismo resultado durante la ejecución, porque su valor no depende del contexto interno de la función.

Ejemplo con VAL:

Supongamos que llamas a la función en una medida:

Imagen5.png 8.22 KB

Aquí, [Total Sales] se evalúa antes de entrar a la función.
Por lo tanto, dentro del CALCULATE, la función ya no puede volver a evaluar [Total Sales] en el contexto modificado por ALL('Date').
El resultado será incorrecto: no obtendrás un acumulado real, sino un único valor repetido.

Imagen6.png 68.51 KB

👉 Por eso, VAL no es adecuado para medidas que dependen del contexto, como las de tipo acumulado o con filtros dinámicos.

EXPR (Expression)

El parámetro se interpreta como una expresión DAX, que se evaluará dentro del cuerpo de la función cada vez que se necesite, usando el contexto de evaluación actual.

Esto permite que la medida cambie según el contexto de filtro y fila, lo que es esencial para cálculos como acumulados, totales dinámicos o cálculos con CALCULATE.

Ejemplo correcto con EXPR:

Y luego la llamas igual en la misma medida:

En este caso, Medida no se evalúa antes, sino dentro del CALCULATE,
lo que permite que [Total Sales] se recalculen en el contexto de cada fecha.

El resultado será el acumulado correcto de ventas a lo largo del tiempo.

Imagen9.png 71.43 KB

Comparación resumida

En resumen

  • Usa VAL cuando el parámetro es un valor escalar simple (como una cantidad fija o resultado independiente del contexto).
  • Usa EXPR cuando el parámetro sea una medida o expresión DAX que deba evaluarse según el contexto del filtro actual.
El ejemplo Acumulado es uno de los mejores casos para entender esto:
 si usas VAL, obtendrás el mismo número en todas las filas;
 si usas EXPR, obtendrás el comportamiento esperado de un cálculo acumulado.

🔹 Cuándo usar UDFs en tus modelos DAX


Usa UDFs cuando quieras:

Reutilizar lógica compleja entre múltiples medidas o columnas.
Centralizar cálculos estándar, como márgenes, tasas o conversiones.
Facilitar mantenimiento y actualización: cambia la función y todas las medidas se actualizan.
Mejorar la legibilidad del código DAX, evitando fórmulas largas o repetidas.
Crear librerías internas de funciones que puedes reutilizar entre proyectos o equipos.


🔹 Buenas prácticas al definir UDFs

  • Usa nombres descriptivos: sigue una convención clara
  • Documenta tus funciones: puedes incluir comentarios arriba con /// para describir qué hace la función.
  • Valida con EVALUATE { } antes de incorporarla a medidas reales.
  • Evita funciones excesivamente genéricas: un poco de especificidad ayuda a mantener claridad.
  • Revisa dependencias: si una función usa otra, asegúrate de que el orden y el contexto estén bien definidos.
  • Cuida el rendimiento: aunque las UDFs ayudan a organizar, no eliminan las reglas de eficiencia de DAX (contextos, iteradores, relaciones, etc.).
Las User Defined Functions en DAX son uno de los avances más importantes en la evolución del lenguaje dentro de Power BI.
Por primera vez, los desarrolladores y analistas pueden escribir código DAX más limpio, modular y reutilizable, acercándose a las mejores prácticas de ingeniería de software.

Si trabajas con DAX y modelado de datos profesional, las UDFs se convertirán en una herramienta indispensable que debes conocer.

Domina las UDFs en: