martes, 15 de marzo de 2022

Power Query: Evitar el error Formula.Firewall

De todos es conocido el problema que se crea cuando parametrizamos nuestras rutas de enlace a las fuentes de datos... Salvo que tuvieramos 'cancelados' los niveles de privacidad (puedes leer el artículo a tal efecto) nos saltaría a nosotros mismos y al resto de compañeros/usuarios la advertencia:
Formula.Firewall: Consulta 'XXXX' (paso 'OOOOOO') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.
Power Query: Evitar el error Formula.Firewall

Hoy veremos una alternativa a modificar las Opciones de la consulta.

Montemos nuestro modelo.
En una celda de nuestro libro de trabajo añadimos la ruta completa al fichero fuente, por comodidad, esta ruta será parte de una tabla:
Power Query: Evitar el error Formula.Firewall

Cargaremos y desagruparemos hasta conseguir que el valor de la ruta quede comoo un texto... El código M de la consulta quedará:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblRUTA"]}[Content]{0}[Ruta_Carpeta]
in
    Origen

La renombraremos como pRUTACompleta

En el siguiente paso procedemos a enlazar con el fichero fuente indicado en esa celda... con una mínima transformación.
Desde el libro de trabajo, en la ficha Datos > grupo Obtener y transformar > Obtener datos > De un archivo > De un libro empleando el explorador existente localizamos el fichero fuente y aceptamos.
Indicamos qué tabla, de entre las existentes en el libro fuente, queremos transformar
Power Query: Evitar el error Formula.Firewall


Ya en el editor, si queremos, podemos aplicar algún filtro u otra acción...
En mi ejemplo el código M resultante de aplicar acciones 'normales' es:
let
    Origen = Excel.Workbook(File.Contents("F:\excelforo\PQ_Plegado_FormulaFireWall.xlsx"), null, true),
    compras4_Table = Origen{[Item="compras4",Kind="Table"]}[Data],
    TipoCambiado = Table.TransformColumnTypes(compras4_Table,{{"art", type text}, {"pais", type text}, {"uds", Int64.Type}}),
    FilasFiltradas = Table.SelectRows(TipoCambiado, each ([art] = "a") and ([pais] = "ES"))
in
    FilasFiltradas

Y lo más importante, de momento, no hay fallo... 👏👏

Sobre la consulta anterior, procedemos a reemplazar la ruta completa 'fija' que aparece como texto por nuestro parámetro 'pRUTAcompleta', el código quedará entonces:
let
    Origen = Excel.Workbook(File.Contents(pRUTAcompleta), null, true),
    compras4_Table = Origen{[Item="compras4",Kind="Table"]}[Data],
    TipoCambiado = Table.TransformColumnTypes(compras4_Table,{{"art", type text}, {"pais", type text}, {"uds", Int64.Type}}),
    FilasFiltradas = Table.SelectRows(TipoCambiado, each ([art] = "a") and ([pais] = "ES"))
in
    FilasFiltradas

Y aquí al Aceptar nos encontraremos con una pequeña sorpresa!!!.
El error Formula.Firewall aparece :O

No queremos o no podemos cambiar las Opciones de privacidad de las consultas... asi pues, ¿cuál es la solución??

Lo primero es que vamos a generar una Consulta en blanco (que llamaré 'EvitoFirewall') donde incluiré las siguientes líneas:
let
    //incluyo en esta consulta el parámetro para obtener el texto de la ruta completa
    RutaCarpeta=Excel.CurrentWorkbook(){[Name="TblRUTA"]}[Content]{0}[Ruta_Carpeta],
    //y hago uso de esta variable para incorporarla y recuperar su contenido
    Origen = Excel.Workbook(File.Contents(RutaCarpeta ), null, true)
in 
    Origen


Curiosamente al incluir el 'parámetro' de la ruta dentro de la consulta, no salta el Firewall.... muy bien!

Último paso, incluiremos y reemplazaremos esta consulta recién creada 'EvitoFirewall' en la consulta inicial que nos generaba el error... Y quedaría:
let
    //anulamos el viejo movimiento...
    //Origen = Excel.Workbook(File.Contents(pRUTACompleta ), null, true),

    //y lo sustituimos por
    Origen = EvitoFirewall,

    compras4_Table = Origen{[Item="compras4",Kind="Table"]}[Data],
    TipoCambiado = Table.TransformColumnTypes(compras4_Table,{{"art", type text}, {"pais", type text}, {"uds", Int64.Type}}),
    FilasFiltradas = Table.SelectRows(TipoCambiado, each ([art] = "a") and ([pais] = "ES"))
in
    FilasFiltradas

Te sorprenderás con el resultado!!. Presiona Listo y booom!.
Adios error Formula.Firewall

Resumen. Debemos crear una consulta intermedia que evite el firewall, e incluirla posteriormente como primer paso de nuestra consulta definitiva...
Y olvidate de cambiar tus niveles de privacidad ;-)

No hay comentarios:

Publicar un comentario

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