Introducción
En el anterior artículo estuvimos hablando del reto de crear consultas robustas que sean resistentes a los cambios en la estructura de los datos en el origen, y que no fallen en la actualización por culpa de estas modificaciones. Vimos cómo, probablemente, el catalizador más común de este tipo de errores corresponde al uso de la función Table.TransformColumnTypes
, y como se considera buena práctica el definir el tipo de solamente aquellas columnas que lo necesiten, con la finalidad de referenciar el menor número posible de ellas en nuestro código, y así evitar posibles fallos a la hora de actualizar nuestro modelo.
Cuando tratamos el tema de como eliminar de forma segura columnas en Power Query vimos el funcionamiento del argumento MissingField.Ignore
, un parámetro opcional en muchas de las funciones de registro y de tabla, que indica que los campos referenciados dentro de la función que no se detecten deben ser ignorados.
Desafortunadamente, al contrario de lo que ocurre con las funciones Table.RemoveColumns
o Table.RenameColumns
, este tercer parámetro opcional no puede ser usado dentro de la función Table.TransformColumnTypes
, lo que hace que cuando trabajamos con orígenes de datos dinámicos donde los campos pueden sufrir modificaciones, tengamos un poco más difícil el hecho de proteger nuestras consultas de este tipo de errores. Por ello, en este artículo vamos a ver cómo podemos imitar el comportamiento de MissingField.Ignore
dentro de la función Table.TransformColumnTypes
, con el objetivo de dotar de mayor robustez a nuestras consultas.
El uso de List.Accumulate
Para imitar el comportamiento de MissingField.Ignore
, podemos crear una función personalizada en Power Query y usar la función List.Accumulate
, que nos permite acumular los valores de una lista mediante la función especificada en el último parámetro. Vamos a partir de la siguiente tabla, donde las dos columnas son de tipo texto:
Vamos a utilizar Table.TransformColumnTypes
para cambiar el tipo de dato de ambas columnas a número entero y posteriormente, para simular la desaparición de la Columna2 en el origen de datos, insertaremos un paso entre Origen y Tipo cambiado para elimina dicha columna con Table.RemoveColumns
. Como era de esperar, obtenemos un error en el último paso:
Con el objetivo de solventar esta situación, vamos a crear una función personalizada, que llamaremos CambiarTipoIgnorarError
, con el siguiente código:
(tabla as table,
tiposCambiados as list) =>
List.Accumulate(
tiposCambiados,
{},
(x, y) => try Table.TransformColumnTypes(tabla, y)
otherwise x
)
Solo nos quedaría sustituir Table.TransformColumnTypes
por esta función personalizada en el código de nuestra consulta, y conseguiremos el resultado deseado, que Power Query ignore el error de no encontrar la Columna2 y nos devuelva únicamente la columna1 con la transformación del tipo a número entero. El código quedaría como sigue:
let
Origen = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTJSitUhmRULAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Columna1 = _t, Columna2 = _t]),
#"Columnas quitadas" = Table.RemoveColumns(Origen,{"Columna2"}),
#"Tipo cambiado1" = CambiarTipoIgnorarError(#"Columnas quitadas",{{"Columna1", Int64.Type}, {"Columna2", Int64.Type}})
in
#"Tipo cambiado1"
Y el resultado, con el paso donde utilizamos la función personalizada en la barra de fórmulas:
Deja un comentario