martes, 17 de agosto de 2021

Power Query: Comentarios en resultado Consulta

Con frecuencia me comentan que lo que escribo no es para los usuarios 'estándar' de Excel... que escribo sobre aspectos demasiado raros o avanzados :'(
Creo que hoy es uno de esos días ;-)

En alguna ocasión he tenido que implantar un modelo de datos donde el flujo de información exigía que el usuario añadiera notas o comentarios asociados a los registros devueltos de una consulta, es decir, se recogían, cargaban y transformaban datos de las fuentes de datos, para finalmente devolver el resultado de la consulta a la hoja de cálculo...en la cual, el mismo u otro usuario, añadía una nueva columna de comentarios, asociado a registros concretos!!.

Si has usado alguna vez las consultas de Power Query sabrás que, por defecto, cada vez que la consulta se actualiza todo se reubica, pudiendo perder la integridad de los datos.. quedando, en definitiva, una 'base de dato' incongruente e inválida.

Entonces, ¿es posible tal cosa???.
Comprobémoslo!!.

En primer lugar verificaremos la inconsistencia al respecto de las consultas de Power Query.
Así pues cargaremos solo como conexión nuestras dos tablas en el editor de Power Query: 'TblDATOS' y 'TblPRECIOS'
Power Query: Comentarios en resultado Consulta

A continuación relacionaremos y combinaremos ambas tablas para crear una tercera resultante, que tendrá el siguiente código M:
let
    Origen = Table.NestedJoin(TblDATOS, {"País"}, TblPRECIOS, {"País"}, "TblPRECIOS", JoinKind.LeftOuter),
    Se_expandió_TblPRECIOS = Table.ExpandTableColumn(Origen, "TblPRECIOS", {"Precio"}, {"Precio"}),
    AddCol_Total = Table.AddColumn(Se_expandió_TblPRECIOS, "Total", each [Unidades]*[Precio])
in
    AddCol_Total

Es una sencilla consulta que combina ambas tablas por el campo 'País', con Table.NestedJoin, y termina agregando una columna calculada 'Total' como producto de Unidades x Precio.
Esta consulta la llamaré: 'ResultadoUNO' y la cargaré en la hoja de cálculo.
Power Query: Comentarios en resultado Consulta

Es sobre esta tabla 'ResultadoUNO' que tenemos en nuestra hoja de cálculo, donde queremos incorporar una nueva columna de comentarios...(OJO!!, lo añadimos EN LA HOJA DE CÁLCULO, NO EN LA CONSULTA!!)
Tras insertar el nuevo campo, añadimos algún comentario en las celdas...
Power Query: Comentarios en resultado Consulta
Mientras no haya cambios en las fuentes (en especial en la 'TblDATOS'), como que se reordenen las filas, insertemos filas nuevas o eliminemos alguna... los Comentarios respetarán sus ubicaciones, y quedarán asociados a los registros correctos... Podemos actualizar cuantas veces queramos sin problemas (pruébalo).

El problema viene cuando ocurre alguna de esas acciones indicadas:
- Añadimos nuevos registros en el origen (TblDATOS), sobre todo si lo hacemos 'en medio' de la tabla
- Eliminamos registros existentes
- O incluso si reordenamos el origen

En la imagen se puede comprobar que tras ordenar la TblDATOS y actualizar la consulta, los comentarios han permanecido en las celdas concretas donde las escribimos, mientras que las filas se han reubicado según la nueva distribución :OOO
Power Query: Comentarios en resultado Consulta


Obviamente esta situación no responde a nuestras necesidades...

Veamos los pasos a seguir para cumplir nuestra meta.
Partiremos de la situación correcta, i.e., con los comentarios ubicados correctamente y asociados a sus filas.
Primer paso. Verificaremos el nombre de la tabla devuelta por nuestra consulta...
Debería coincidir con el nombre dada a la query (ResultadoUNO en nuestro caso).

Segundo paso. Accederemos a nuestra consulta y la editaremos... Añadiendo la siguiente referencia y carga de esa tabla con comentarios!!.
Desde el editor de Power Query tendríamos:
let
    Origen = Table.NestedJoin(TblDATOS, {"País"}, TblPRECIOS, {"País"}, "TblPRECIOS", JoinKind.LeftOuter),
    Se_expandió_TblPRECIOS = Table.ExpandTableColumn(Origen, "TblPRECIOS", {"Precio"}, {"Precio"}),
    AddCol_Total = Table.AddColumn(Se_expandió_TblPRECIOS, "Total", each [Unidades]*[Precio]),

    //Cargamos la tabla resultado CON LOS COMENTARIOS, que se llama 'ResultadoUNO' (como esta query!)
    TablaConComentarios = Excel.CurrentWorkbook(){[Name="ResultadoUNO"]}[Content],
    //Relacionamos, con Table.NestedJoin, esta consulta (antes de la carga anterior)
    //con la TablaConComentarios... 
    CombinaComentarios=Table.NestedJoin(AddCol_Total, {"Id"}, TablaConComentarios, {"Id"}, "Nueva Columna",JoinKind.LeftOuter),

    //y acabamos expandiendo para recuperar SOLO la columna de comentarios!!
    ExpandeComentarios = Table.ExpandTableColumn(CombinaComentarios, "Nueva Columna", {"Comentarios"}, {"Comentarios"})
in
    ExpandeComentarios

Power Query: Comentarios en resultado Consulta

Tercer paso. Tras la generación del nuevo código incorporado en nuestra consulta, cargamos y cerramos, con lo que volvemos a la hoja de cálculo...
Comprobarás que la primera vez se da una 'extraña circunstancia' (no tanto), y es que se duplica el campo 'Comentario', aparace un Comentario que 'vuelve' desde la consulta además del Comentario original (renombrado como 'Comentario.2').
No te preocupes... elimina el Comentario original, es decir, el campo 'Comentario.2' (además mantiene el formato de color dado, por lo que es fácil de identificar).
Power Query: Comentarios en resultado Consulta


Estamos listos!!!...
Probamos a reordenar la tabla origina 'TblDATOS y actualizamos la consulta:
Power Query: Comentarios en resultado Consulta
:OOO Se mantiene la integridad de las filas!!

Añadamos filas nuevas en la TblDATOS, y de paso rellenaremos algún comentario más...
Power Query: Comentarios en resultado Consulta

OJO!!, al meter nuevas filas, debemos mantener 'integro e indexado' el campo 'Id' (vamos, que no se repitan valores de Id!).
Este campo 'Id' es el que compone y estabiliza nuestro trabajo...

Si tras los cambios previos actualizamos la consulta veremos:
Power Query: Comentarios en resultado Consulta

Fantástico!!... los viejos y nuevos comentarios se quedan donde deben estar!!...

Estupendo ejercicio.
Recalcar que la clave de este funcionamiento es tener una clave como nexo de unión... en mi ejemplo (me lo he puesto fácil) es el campo Id... si no existiera, tendríamos que componerlo (sobre 2,3,.. campos) o de cualquier otra forma.
Espero te resulte útil ;-)

No hay comentarios:

Publicar un comentario

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