jueves, 19 de agosto de 2021

Power Query: Tabla Histórica de Registros

Hace unas semanas me plantearon si era posible, con Power Query, tener un histórico de los registros/filas que existieran o hubieran existido alguna vez en nuestra tabla fuente, e igualmente que quedara constancia de las modificaciones ocurridas.

Aunque inicialmente pensé en VBA para Excel, después de pensar algún tiempo, di con una posible solución...
Creo que no es compleja, pero hay que ser meticuloso con los pasos...

Vamos allá!.
Empezaremos con una tabla origen con nombre 'TblORIGEN' (en mi ejemplo dentro del libro de trabajo, en una hoja de cálculo).
Es una tabla muy simple con tres campos: Fecha, País y Unidades
Power Query: Tabla Histórica de Registros

Es imprescindible disponer de un id único para cada registro de nuestra tabla, así que o bien lo añadimos en la TblORIGEN con algún campo calculado o bien manualmente, o, alternativamente, lo incorporamos en nuestra futura consulta de power Query (esta es la opción por la que me he decantado).

Primer paso.
Cargamos normalmente la TblORIGEN, y ya en el Editor de Power Query, agregaremos una nueva columna componiendo un Id o Índice único y constante para cada registro.
En mi ejemplo me he basado en una concatenación de los tres campos de la tabla (valdría cualquier idea siempre que asegure la unicidad!!!)...
En ocasiones añadir terminos horarios (horas, minutos y segundos) ayuda.
El código M de nuestra primera consulta sería entonces:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblORIGEN"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fecha", type date}, {"País", type text}, {"Unidades", Int64.Type}}),

    //Agregamos una nueva columna como Id único concatenando las tres columnas de la tabla
    ÍndiceAgregado = Table.AddColumn(TipoCambiado, "Índice", each Date.ToText([Fecha]) & [País] & Number.ToText([Unidades]))

in
    ÍndiceAgregado

Cerramos y cargamos el resultado en la hoja de cálculo.
Segundo paso.
La tabla resultante de nuestra consulta (se llamará probablemente 'TblORIGEN_2'), ya en la hoja de cálculo, la copiaremos y pegaremos en otro lugar del libro.
Nos aseguraremos de los dos pasos siguiente:
1- Eliminar la consulta generada al realizar la copia!!
2- Renombrar la tabla por 'TblTemporal'
Power Query: Tabla Histórica de Registros

Tercer paso.
Cargaremos al Editor de Power Query esta tabla 'TblTemporal', a la cual aplicaremos un anexado de la consulta TblORIGEN:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblTemporal"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fecha", type date}, {"País", type text}, {"Unidades", Int64.Type}, {"Índice", type text}}),

    //Anexamos al resultado de la carga de la TblTemporal, la consulta TblORIGEN (que incluye nuestro Id)
    Anexado=Table.Combine({TipoCambiado, TblORIGEN})

    //veremos que tenemos una duplicidad de registros...
    //que corregiremos a continuación
in
    Anexado

Cerramos y cargamos en una nueva hoja...
Esta tabla se ha llamado 'TblTemporal_2', la cual renombraremos como 'TblFINAL'
Es fácil ver que tenemos duplicados todos los registros.. era de esperar al anexar los mismos registros dos veces...

Esta será nuestra Tabla Histórica final, así que vamos a hacer algún cambio más...

Cuarto paso.
Editamos esta consulta y cambiaremos el Origen actual, de la 'TblTemporal' (existente en la hoja de cálculo) a la 'TblFINAL' (la tabla recién descargada en la hoja de cálculo).
Además, de paso, corregiremos el tema de registros duplicados.
Desde el editor avanzado de Power Query tendremos:
let
    //OJO! cambiamos el origen de 'TblTemporal' por 'TblFINAL' !!
    Origen = Excel.CurrentWorkbook(){[Name="TblFINAL"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fecha", type date}, {"País", type text}, {"Unidades", Int64.Type}, {"Índice", type text}}),

    //Anexamos al resultado de la carga de la TblTemporal, la consulta TblORIGEN (que incluye nuestro Id)
    Anexado=Table.Combine({TipoCambiado, TblORIGEN}),

    //veremos que tenemos una duplicidad de registros...
    //que corregiremos a continuación
    QuitaDuplicados=Table.Distinct(Anexado)
in
    QuitaDuplicados

Cargamos y cerramos...

Quinto paso.
Eliminamos la tablas intermedias con las que hemos trabajado, dejando exclusivamente:
- la tabla de partida con los datos originales (TblORIGEN)
- la última tabla, que renombramos como 'TblFINAL'

Quedando además solo dos queries de Power Query: TblORIGEN (solo como conexión) y TblTemporal
Power Query: Tabla Histórica de Registros

Sexto paso: Verificación y prueba...
De momento ambas tablas (origen y final) son iguales...veamos que pasa al modificar un dato cualquiera, por ejemplo, cambiar las unidades del segundo registro (14 por 141414):
Power Query: Tabla Histórica de Registros
Perfecto!!, comprobamos como la TblFINAL (nuestra tabla histórica) mantiene el registro original, pero ha incorporado el nuevo!!

Veamos otro caso, eliminaremos de nuestra tabla fuente un registro, el primero que aparece de ES en la fila 9 (Fecha 21/02/2021 País: ES Unidades: 12
Power Query: Tabla Histórica de Registros

Fantástico!, vemos como mantiene el registro eliminado a nuestra disposición.

Una última prueba... añadimos nuevos registros.
Power Query: Tabla Histórica de Registros

Nada mal!!, vemos como a pesar de haber 'forzado' la inserción entre las filas de la tabla fuente, los nuevos registros aparecen anexados al final...

Un trabajo algo laborioso, sobre todo meticuloso, pero que solo hay que hacerlo una única vez. ;-)

No hay comentarios:

Publicar un comentario

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