jueves, 15 de julio de 2021

Power Query: Anexar tablas a partir de una lista

Hoy veremos una forma sencilla de anexar tablas, a nuestra elección, desde una lista dada:
Power Query: Anexar tablas a partir de una lista


Optaremos por dos métodos:
List.Transform o List.Generate
pero en ambos casos necesitaremos emplear las funciones descritas en esto otro post del blog:
Expression.Evaluate y Expression.Identifier

Comenzaremos nuestro ejercicio cargando todas las tablas fuente: 'ene', 'feb', 'mar', 'abr', 'may' y 'jun'
y de igual forma la Tabla 'Meses_Anexar' que contendrá, ad hoc, el listado de meses que nos interesa recuperar...

Cargaremos todas ellas en modo solo conexión.
Ya desde el editor de Power Query crearemos una consulta en blanco donde insertaremos el siguiente código:
let 
// Table.ToList(table as table, optional combiner as nullable function) as list
//convertimos en lista nuestra tabla, ya que lo necesitamos en ese tipo de datos para la siguiente transformación
Meses=Table.ToList(Meses_Anexar),

// List.Transform(list as list, transform as function) as list
//evaluamos y transformamos cada elemento de la lista (cada tabla)
// Expression.Evaluate se encarga de entender los textos de la lista como lo que son: Tablas
Lista_Tablas=List.Transform(Meses, each Expression.Evaluate( Expression.Identifier(_),#shared)),

// Table.Combine(tables as list, optional columns as any) as table
// Combinamos las ya transformadas Tablas
resultado=Table.Combine(Lista_Tablas)

in 
    resultado


Como vemos un método muy simple y efectivo...

Una alternativa (de entre muchas) sería emplear List.Generate (ver aquí).
De igual forma que antes, con todas las tablas ya cargadas, crearemos una nueva consulta en blanco donde escribiremos:
let 
// Table.ToList(table as table, optional combiner as nullable function) as list
// pasamos a tipo Lista nuestra tabla de meses a anexar
Meses=Table.ToList(Meses_Anexar),

// List.Generate(initial as function, condition as function, next as function, optional selector as nullable function) as list
// generamos una Lista de Tablas...
Lista_Tablas = List.Generate(
    () => [i=-1, tabla=#table({"Mes","Importe"},{})],      // punto de partida: Dos variables definidas en un Registro
    each [i] < List.Count(Meses),           // condición - control de salida!!!
    each [i=[i]+1, 
          tabla=Expression.Evaluate( Expression.Identifier(Meses{i}),#shared)],     // siguiente valor. Nuevo Registro
    each [tabla]                            // el Selector determina que valor a devolver
                    ),
                    
// Table.Combine(tables as list, optional columns as any) as table
//componemos una Tabla a partir de los Registros generados con List.Generate
resultado=Table.Combine(Lista_Tablas)

in 
    resultado

Un buen ejercicio de repaso de esta interesante función...

Con cualquiera de los dos métodos expuestos conseguimos nuestro objetivo: dinamizar el anexado de diferentes tablas a partir de un lista personalizable.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.