Forum Discussion

YCastano's avatar
YCastano
Frequent Visitor
1 year ago
Solved

Consuming XML web service

Hello everyone!   I need to consume data from a XML web service that generates what I show in the first image. The data is in the second table, but it only shows me 100 records, when there are alm...
  • YCastano's avatar
    1 year ago

    Finally, I solved it by generating a Power Query loop to fetch all pages automatically, and later adding a counter for consulting only the last page and finally combining them. Here is the complete code:

     

     

    let
        BaseUrl = "https://xxxxxxxxxxxxxxxxxx",
       
        // Función para obtener la página de datos
        GetPage = (pageNumber) =>
            let
                // Realiza la solicitud con los parámetros adecuados
                Response = Web.Contents(BaseUrl, [Query=[page=Number.ToText(pageNumber)]]),
                // Convierte la respuesta XML en una tabla
                Data = Xml.Tables(Response),
                // La primera tabla contiene los parámetros de la consulta (paginación y demás)
                RequestInfo = Data{0}[Table],
                ExpandedFilter = Table.ExpandTableColumn(RequestInfo, "filter", {"effective_date", "changed_on_or_after", "changed_before", "change_type", "deleted", "only_deleted", "page", "max_page_size", "actual_page_size", "more_pages"}, {"effective_date", "changed_on_or_after", "changed_before", "change_type", "deleted", "only_deleted", "page", "max_page_size", "actual_page_size", "more_pages"}),
                // La segunda tabla contiene los datos
                DataTable = Data{1}[Table],
                Table1 = DataTable[Table],
                // Expande la tabla de datos
                ExpandedDataTable = Table.SelectColumns(ExpandedFilter, {"page", "more_pages"}),
                // Devuelve los datos junto con la información de la paginación
                PageData = [Data = DataTable, Pagination = ExpandedDataTable]
            in
                PageData,
    
        // Generar la lista de todas las páginas de datos
        AllData = List.Generate(// Estado inicial con la primera página
        () => [Page = Number.FromText(GetPage(1)[Pagination][page]{0}), Data = GetPage(1)[Data], MorePages = GetPage(1)[Pagination][more_pages]{0}],
        
        // Condición de continuidad: continuar mientras MorePages sea 1 (hay más páginas) 
        each Number.FromText([MorePages]) = 1, 
        
        each   // Actualización del estado: aumentar la página y obtener los datos correspondientes
            let
               NextPage = [Page] + 1, 
               PageData = GetPage(NextPage),
               NewMorePages = PageData[Pagination][more_pages]{0}
            in 
                [Page = NextPage, Data = PageData[Data], MorePages = NewMorePages],  
                
            // Extraer los datos de cada página
            each [Data]
        ),
    
        // Para capturar el núnmero de páginas, execptuando la última 
        Contador = List.Count(AllData),
    
        // Combinar las tablas de datos de cada página en una tabla
        ExpandedData = Table.Combine(AllData),
    
        // Combinar y Expandir todas las tablas de registros
        Table1 = Table.Combine(ExpandedData[Table]),
    
        //Utilizo el contador para acceder a la última página
        LastPage = [Data = GetPage(Contador + 1)[Data], MorePages = GetPage(Contador + 1)[Pagination][more_pages]{0}],
        AllData2 = LastPage[Data],
        Table2 = AllData2{0}[Table],
    
        // Combinar las tablas de la primera parte con la tabla de la ultima página
        CombinedData = Table.Combine({Table1, Table2}),
        
    in
        CombinedData