Power Query Dataflow - Funciones Personalizadas
Power Query Dataflow - Funciones Personalizadas
Power Query Dataflow - Funciones Personalizadas
Power Query trabaja fundamentalmente con fórmulas o funciones. Cada vez que
nosotros utilizamos un botón de la interfaz de Power Query, crea una línea de código M
que es un lenguaje basado principalmente en funciones. Cada paso utiliza una o varias
funciones nativas y el usuario final está programando código sin necesidad de conocerlo.
Table es el primer parámetro, que en nuestro caso es “Origen”. Por lo general, cada
vez que utilizamos una función de tabla, va a estar referenciada al nombre del paso anterior
ya que el paso anterior en sí, es habitualmente una tabla
Como curiosidad, al igual que Power Query en el Desktop, los flujos de datos
contienen la información de todas y cada una de las funciones nativas existentes. Hay dos
vías para acceder a la documentación de esas funciones a través de los flujos de datos. En
la imagen que he puesto anteriormente, en una Consulta en blanco en puesto la función
sin más, Table.AddIndexColumn y me devuelve la información que el sistema tiene
documentada de la propia función. (Ver imagen anterior)
let
Origen = Table.AddIndexColumn
in
Origen
Esta instrucción, por tanto, va a devolver la función y desde esa interfaz de la función
podríamos invocarla y ver los datos que genera, aunque carece de sentido dado que
tenemos el botón de la interfaz. Si nos sirve para ver su funcionamiento y los parámetros
que necesita y que escribe la interfaz por nosotros al darle al botón.
La segunda opción, que también funciona en los flujos de datos al igual que en el
desktop es usar la instrucción #shared.
Eso nos va a devolver un listado con todas las funciones disponibles en los flujos de
datos.
EXTRACTO DEL LIBRO “POWER QUERY DATAFLOW” de
Francisco Mullor Cabrera
Fecha prevista publicación: 15/12/2021
Por otra parte, los usuarios avanzados de power query son capaces de generar sus
propias funciones personalizadas. Crear una función no es nada complicado, aprenderemos
en la parte del libro dedicada a Power Query. En resumen, es generar un código que realice
una serie de acciones más o menos complejas que se puedan parametrizar y reutilizar. La
red está llena de ejemplos de funciones de M personalizadas y tenemos un magnífico
repositorio explicado en español en la web https://powerquery.zone/ de los colombianos
Miguel Caballero y Fabián Torres. La forma habitual de utilizar las funciones es crearlas en
el editor e invocarlas generando el resultado deseado, y cuando se quiere utilizar en otro
conjunto de datos, se copia y se pega el código que genera la función y se vuelve a invocar,
pero Power BI Desktop nos permite de una forma particular que vamos a ver en este
capítulo, generar una librería de funciones personalizadas que se quedan registradas en la
aplicación para poder llamarlas directamente en nuestro editor de consultas como si de
una función nativa se tratase.
section MyLibrary;
shared Nombre.Funcion=
shared Nombre.Funcion2=
shared Nombre.Funcion3=
let
// Listamos los números comprendidos entre la Fecha de Inicio y la Fecha de Fin
Origen = {Number.From(FechaInicio)..Number.From(FechaFin)},
// Convertimos nuestra lista en Tabla
#"Convertido en tabla" = Table.FromList(Origen, Splitter.SplitByNothing(), {"Fecha"
}, null, ExtraValues.Error),
// Cambiamos el tipo de número a Fecha
#"Tipo de columna cambiado" = Table.TransformColumnTypes(#"Convertido en tabla", {{
"Fecha", type date}}),
// Creamos la columna Año
#"Año insertado" = Table.AddColumn(#"Tipo de columna cambiado", "Ejercicio", each D
ate.Year([Fecha]), Int64.Type),
// Creamos las columna MesNro
#"Mes insertado" = Table.AddColumn(#"Año insertado", "MesNro", each Date.Month([Fec
ha]), Int64.Type),
// Creamos la Columna NombreMes
EXTRACTO DEL LIBRO “POWER QUERY DATAFLOW” de
Francisco Mullor Cabrera
Fecha prevista publicación: 15/12/2021
let
//Y se enumeran los parámetros entre paréntesis indicando su tipo de dato y separados
por coma para finalizar con => que es el símbolo que crea la función
let
// Listamos los números comprendidos entre la Fecha de Inicio y la Fecha de Fin
Origen = {Number.From(FechaInicio)..Number.From(FechaFin)},
………
in
#"Personalizado agregado 22"
in
let
Funcion=
(FechaInicio as date, FechaFin as date, MesFiscal optional as number) =>
EXTRACTO DEL LIBRO “POWER QUERY DATAFLOW” de
Francisco Mullor Cabrera
Fecha prevista publicación: 15/12/2021
let
PrimerMesFiscal=
if MesFiscal=null
then 1
else MesFiscal
Origen = {Number.From(FechaInicio)..Number.From(FechaFin)},
………
in
#"Personalizado agregado 22", //Justo tras el código completo que vamos a invocar
con los parámetros de la función y tras una coma comenzaremos a crear los metadatos
de la documentación:
documentation =
[
Documentation.Name = //Nombre que vamos a dar a nuestra función
" Crear.Calendario ",
Documentation.Description = //Descripción
Documentation.Author = //Autor/-a
" Francisco Mullor: www.powerbisp.com ",
}
]
in
Value.ReplaceType(
Funcion,
Value.ReplaceMetadata(
Value.Type( Funcion ),
documentation)
) ; // Lo que hacemos en este paso es introducir los metadatos para que se vean
al nombrar la función como documentación
section MyLibrary;
shared Crear.Calendario=
let
Funcion=
(FechaInicio as date, FechaFin as date, optional MesFiscal as number) =>
let
PrimerMesFiscal=
if MesFiscal=null
then 1
else MesFiscal,
Documentation.Description = //Descripción
Documentation.Author = //Autor/-a
" Francisco Mullor: www.powerbisp.com ",
Con esto tan simple, se consigue que los conectores personalizados que
integremos en ese fichero puedan utilizarse como si fueran funciones nativas desde los
flujos de datos de Power BI de manera que seleccionando la puerta de enlace en nuestro
proyecto:
EXTRACTO DEL LIBRO “POWER QUERY DATAFLOW” de
Francisco Mullor Cabrera
Fecha prevista publicación: 15/12/2021
Se podrá sin ningún problema utilizar la función que hemos creado e integrado en
la librería: