💡 Introducción
La interfaz gráfica de Power Query en Power BI Desktop es indudablemente intuitiva y potente. Permite a miles de usuarios limpiar, dar formato e integrar datos diariamente con solo un par de clics. Sin embargo, depender exclusivamente de las opciones visuales de la cinta de herramientas limita severamente nuestro potencial técnico. Detrás de cada paso registrado en el editor se compila un código en un lenguaje funcional, robusto y altamente especializado: el M Language (formalmente conocido como Power Query Formula Language).
⚙️ ¿Qué es M Language y por qué es fundamental dominarlo?
A diferencia de los lenguajes de programación estructurados o procedimentales, M es un lenguaje de programación funcional orientado al análisis de datos. Su diseño se rige bajo el principio de evaluación perezosa (lazy evaluation). Esto significa que Power Query no procesará un paso de transformación a menos que el resultado final del reporte lo requiera explícitamente, ahorrando valiosos recursos de memoria RAM y tiempo de procesamiento en grandes volúmenes de datos.
La estructura básica de una consulta M
Para escribir código M con fluidez, primero debemos entender su estructura básica, fundamentada en el bloque de código let ... in:
let Origen = Sql.Database("servidor-sql", "BaseDatosVentas"), TablaVentas = Origen{[Schema="dbo", Item="FactVentas"]}[Data], FilasFiltradas = Table.SelectRows(TablaVentas, each [Anio] == 2025)in FilasFiltradas
- let: Es la sección donde se definen las variables, expresiones o «pasos» secuenciales de la transformación de datos.
- in: Es la expresión que define el resultado final que retornará la consulta. En la gran mayoría de casos, corresponde al último paso definido en el bloque
let.
📊 Comparativa: Interfaz Estándar vs. Escritura Directa en M
Para dimensionar el valor agregado de escribir nuestras propias expresiones en M, observemos la siguiente tabla comparativa:
| Escenario de Desarrollo | Solución mediante Interfaz de Power Query | Solución Avanzada mediante Código M |
|---|---|---|
| Manejo de Errores | Reemplazo de valores de error simples o eliminación de filas erróneas. | Control dinámico y personalizado con bloques try … otherwise. |
| Plegado de Consultas (Query Folding) | La adición aleatoria de pasos puede romper la delegación de consultas sin aviso. | Escritura optimizada que fuerza el plegado en el motor de base de datos de origen. |
| Modularidad y Reuso | Duplicación de tablas u operaciones idénticas en múltiples consultas. | Creación de funciones personalizadas (shared) aplicables a cualquier tabla. |
| Dinamicidad de Parámetros | Limitado a filtros estáticos basados en parámetros predefinidos del sistema. | Carga dinámica de metadatos basándose en consultas web o llamadas de APIs en tiempo de ejecución. |
✍️ Mini Ejercicio Práctico: Creación de una Función de Limpieza de Texto en M
Para aplicar estos conceptos teóricos, construiremos una función personalizada en M que limpie de forma simultánea los caracteres especiales de una columna de texto, eliminando espacios duplicados e iniciales. Esta lógica, realizada mediante la interfaz visual, requeriría por lo menos cinco pasos independientes por cada columna de datos.
Paso 1: Crear una Consulta en Blanco
En el Editor de Power Query, dirígete a la pestaña Inicio, haz clic en Nuevo origen y selecciona Consulta en blanco.

Paso 2: Escribir la Función en el Editor Avanzado
Abre el Editor avanzado y reemplaza todo el contenido con el siguiente bloque de código M:
(TextoEntrada as any) =>let // Convertimos cualquier entrada a texto seguro TextoConvertido = Text.From(TextoEntrada), // Eliminamos espacios sobrantes en extremos e intermedios TextoLimpio = Text.Trim(Text.Clean(TextoConvertido)), // Normalizamos reemplazos complejos mediante una lista anidada Reemplazos = List.Accumulate( { {"á", "a"}, {"é", "e"}, {"í", "i"}, {"ó", "o"}, {"ú", "u"}, {"Á", "A"}, {"É", "E"}, {"Í", "I"}, {"Ó", "O"}, {"Ú", "U"}, {"ñ", "n"}, {"Ñ", "N"} }, TextoLimpio, (estado, actual) => Text.Replace(estado, actual{0}, actual{1}) )in Reemplazos

Una vez hayas dado en «Aceptar» la ventana se cerrará y aparecerás en el «Editor de Power Query», sabrás que la función se creó de forma correcta por que deberás verlo de la siguiente manera:

Paso 3: Renombrar e Invocar
Nombra a esta consulta como fnLimpiarTextoAvanzado, cierra y aplica.

Ahora, en cualquier tabla que contenga campos de texto con impurezas ortográficas o caracteres especiales, ve a la pestaña Agregar columna, selecciona Invocar función personalizada, selecciona tu nueva función y aplícala sobre la columna deseada.
📚 Fuentes Consultadas
- Documentación oficial de Microsoft: Referencia del Lenguaje de Fórmulas Power Query M
- Comunidad técnica de análisis: Comprensión del Plegado de Consultas (Query Folding)


Deja un comentario