martes, 12 de enero de 2021

Power Query: Trabajar con Records

Deberíamos empezar por definir, lo mejor posible este concepto tan amplio y vago, un Record es un conjunto de valores... pero es mucho más.
Incluso podríamos categorizarlos en dos grandes conjuntos:
- originales: esto es, sin ningún tratamiento, datos puros (aaa, 123, 12/1/21, FALSE, etc)
- elaborados: construidos a partir de estos originales, o incluso otros previamente elaborados
Lo más importante es que cualquier Record se debe escribir entre corchetes [ ... ] (si revisas la entrada donde explcamos cómo crear tablas verás varios ejemplos de Records).
Por ejemplo: [País="ES", Importe=400]

¿Por qué es importante aprender algo más de un Record?.. bueno, básicamente por dos motivos:
1- acceder o trabajar con filas de nuestras tablas
2- para pasarlo como parámetro a una función M
y muchos más, claro :-)

Yendo al 'meollo' del asunto.. ¿cómo podemos crear Records?
Como mencioné antes, siempre detallando las partes del registro entre corchetes [...].
Un ejemplo más elaborado que el previo sería el siguiente, donde podemos ver que un registro/Record admite diferentes formatos de dato. Escribimos en nuestro editor avanzado dentro de Power Query:
[Nombre= "Ismael",
Ciudad_País="Madrid - España",
Antigüedad=10,
Activo= true,
Ranking dos años={2,5},
Ventas=[a20=1200,a19=1100,a18=900],
Comerciales=#table({"Región", "Comercial"},{{"ES","Juan"},{"PT","Ana"}}),
Cálculo= (IPC)=>1+IPC]

Power Query: Trabajar con Records

Vemos el aspecto de nuestro registro/Record
Power Query: Trabajar con Records

Comprobamos como cada parte de nuestro registro contiene un tipo de dato distinto: Table, Function, List, texto, número, fecha...

Otra forma de crear registros/Records es empleando funciones M. Dos de las más relevantes:
- Record.FromList(list as list, fields as any) as record
que crea un record a partir de una lista de valores y una lista de nombres. Incluso podemos definir el tipo de dato asociado a cada campo:
Record.FromList({1, "ES", 123}, type [ID = number, País = text, Ventas = number])
- Record.FromTable(table as table) as record
de forma similar, a partir de una tabla, construimos un registro.

Existe un mundo de funciones M nativas vinculadas con el uso de los registros; de hecho tienen su propia categoría.

Finalmente, un uso interesante de los registros es obtener un Record de la fila de una tabla
, sencillamente refiriéndonos a una de las filas de nuestra tabla (recuerda que empleamos las llaves {} para esto - y que la numeración tiene base cero).
Table{número fila en base 0}
Por ejemplo
let
    Origen = Table.FromRecords({[País="ES",Importe=1],
        [País="ES",Importe=20],
        [País="PT",Importe=300],
        [País="PT",Importe=4],
        [País="FR",Importe=50]},
        type table[País = Text.Type, Importe = Currency.Type]){1} //obtenemos la segunda fila de la Tabla!
in
    Origen

Dato interesante!!. Para referirnos a la fila corriente, al crear una columna personalizada, empleamos el guión bajo '_', que equivale de alguna manera al registro correspondiente.
Por ejemplo, para sumar datos de dos columnas empleando este truco, podríamos hacer:
let
    Origen = #table({"Año 2020","Año 2019"},{{100,200},{110,190},{150,150}}),
    Add_Suma = Table.AddColumn(Origen, "Total Ventas", each List.Sum(Record.ToList(_)))
in
    Add_Suma

Power Query: Trabajar con Records

En este caso nos hemos referido a todos los elementos de la fila corriente, esto es, del registro... el cual, con Record.ToList convertimos en una 'lista' para luego poder operar sobre todos sus elementos con List.Sum.

Un último apunte que nos servirá para recuperar un elemento de nuestro registro.
Para obtener un dato concreto bastará referirnos a la columna deseada, indicándola entre corchetes []. Por ejemplo, del registro:
[País="ES", UDS=100, Ventas=2568]
Power Query: Trabajar con Records
para recuperar las Unidades, nos referiremos a ese campo, como:
[País="ES", UDS=100, Ventas=2568][UDS]
Power Query: Trabajar con Records

Alternativamente podríamos hacer uso de la función M:
Record.SelectFields(record as record, fields as any, optional missingField as nullable number) as record
que nos devuelve un registro solo con el/los campos indicados!.
Por ejemplo
let
    MiRegistro=[País="ES", UDS=100, Ventas=2568],
    Calc=Record.SelectFields(MiRegistro,{"UDS","Ventas"})
in
    Calc

Power Query: Trabajar con Records
O también para recuperar el registro completo...
let
    MiRegistro=[País="ES", UDS=100, Ventas=2568],
    // o haciendo uso de Record.FieldNames para todos los campos
    Calc=Record.SelectFields(MiRegistro,Record.FieldNames(MiRegistro))
in
    Calc

Y esta podría ser una introducción al fascinante mundo de los registros en Power Query ;-)

No hay comentarios:

Publicar un comentario

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