avisando
Si … Entonces … Else en una columna personalizada
Todos hemos usado una declaración «si … entonces … si no» al agregar una columna personalizada en una consulta de Power BI (usando Excel Power Query o Power BI> Obtener datos). Aquí hay un ejemplo rápido de nuestro libro, Capítulo 20 «Power Query to the Rescue», Escenario n. ° 3: Adición de columnas personalizadas a sus tablas de búsqueda.
Agregar una columna personalizada usando if … then … else
Si … Entonces … Else para la ramificación de código condicional
Sin embargo, en mi vida anterior, estaba acostumbrado a usar if … then … else para la ramificación de código condicional al usar lenguajes de programación (VBA cuenta, ¿verdad?). Según la condición if, la ejecución del código sigue dos caminos completamente separados.
La ramificación de código condicional le permite seguir rutas de ejecución independientes según la condición
Esto se hace fácilmente en la mayoría de los lenguajes de programación, pero inicialmente no pude resolver esto para una consulta de Power BI. Una cosa que me seguía haciendo tropezar era pensar en M como un lenguaje funcional.
M es un lenguaje funcional
Como Matt describió en una publicación anterior, M es un lenguaje funcional, con cada línea de código en este formato:
myResult = myFunction (algunos parámetros),
Puede ver esto claramente en el código M de muestra a continuación.
Ejemplo de código M, cada línea es como una llamada de función
Ahora, por lo general, cuando crea una consulta, utilizando los botones disponibles en la cinta, cada paso se vincularía con el siguiente. Esto es evidente si nos enfocamos solo en los nombres de los pasos en el código que se muestra arriba.
Normalmente, cada paso de M se vincula con el siguiente paso.
¡Sin embargo, esto no es un requisito! De hecho, tiene total flexibilidad: un paso determinado puede hacer referencia a cualquier otro paso. Se necesita un poco de cambio para obtener esto por primera vez. Pero una vez que lo hace, puede ver que se abre un enfoque fácil para lograr la ramificación de código condicional.
Entonces … De lo contrario … Si …
Así es como lo hice: en lugar de pensar en ello como si … entonces … si no, simplemente cambié el orden a entonces … si no … si.
Bifurcación de código condicional: en lugar de pensar en ello como si … entonces … más, simplemente cambié el orden a entonces … más … si
Repensar si … entonces … si no como entonces … si no … si en M
Así es como se ve en algún código M real (descargue el archivo PBIX😞
Bifurcación de código en M (consulta de Power BI)
Tengo entendido que un paso determinado solo se ejecuta si es necesario para devolver el resultado final. Entonces, en teoría, en base a la condición, solo se ejecutaría el bloque «ENTONCES» o el bloque «ELSE». Además, puede colocar el bloque «ENTONCES» y el bloque «ELSE» después de la declaración «Si», eso es una cuestión de preferencia.
Escenario de la vida real para la ramificación de código
El escenario en el que terminé usando este patrón fue el siguiente:
- Un modelo de Power BI que había creado terminó siendo utilizado no por uno sino por dos equipos diferentes
- Esto era factible, ya que estaban ejecutando copias del mismo modelo, solo que con un conjunto diferente de archivos de entrada.
- Los archivos de entrada para ambos equipos eran idénticos (datos de ventas / finanzas provenientes de su sistema empresarial)
El único inconveniente fue …
- Cada equipo tenía un conjunto personalizado de ajustes, un conjunto muy personalizado de pasos (transformaciones M) que debían ejecutarse. Para esto terminé usando los bloques «entonces … si no … si» como describí anteriormente
Me doy cuenta de que habría muchas formas de resolver este problema. Pero este enfoque funcionó para mí y también me ayudó a sentirme un poco más cómodo con la naturaleza del lenguaje funcional de M.
Descargue el archivo PBIX con el código que se muestra en esta publicación, adjunto a la publicación.
¡Encendido!
-Avi Singh
Autor, formador y consultor de Power BI con sede cerca de Seattle, WA
Sígueme en LinkedIn Gorjeo
Power_BI_Query_If_then_else.pbix
18