Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Don't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.

Reply
Syndicate_Admin
Administrator
Administrator

Función recursiva de Power Query que devuelve la API de error

¡Hola!

Estoy tratando de recuperar datos de una API, y estoy teniendo dificultades con lo que parece ser una tarea simple:

La API devuelve la información en el siguiente formato:

ErisedAlurem_1-1661783997843.png

Un registro con dos informaciones: hasMore, que define si aún quedan elementos por recuperar y items, una lista con lo que quería recuperar. Como necesito todos los datos (hasta hasMore = FALSE), mi objetivo es obtener una lista con todos los elementos (no la lista limitada al máximo definido por la API).

(La lista me da 100 registros)

ErisedAlurem_4-1661784867404.png

Con este objetivo en mente, he intentado lo siguiente:

Ticket_Query = (optional _after)=> 
let
  //definir quantos tickets pular
    _skip = ",startingAfter=" & _after,

  //obter fonte de dados
   Source = Json.Document(Web.Contents(urlgerada & _skip,
    [Headers=[token="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"]])),
    StepInter = Text.From(Record.Field(Source,"hasMore")),
    teste2 = Record.Field(Source,"items"),
    teste3 = Record.Field(Source,"items"){99}[id],
    Nextstep = 
      if Text.From(Record.Field(Source,"hasMore")) = "true" and List.Count(teste2)<=198 then 
      teste2 & Record.Field(@Ticket_Query(Record.Field(Source,"items"){99}[id]),"items")
     else teste2
in
    Nextstep
    in  
   Ticket_Query("")

Creé una función (Ticket_query) con un parámetro opcional, que recupera el id del último registro en el consoult anterior y lo usa como el parámetro de la API "startingAfter".

Recupero esta información con la siguiente consulta:

teste3 = Record.Field(Source,"items"){99}[id], que parece funcionar correctamente:

ErisedAlurem_5-1661785377617.png

(lo cual es correcto)

Luego creo la consulta, con la URL base y el _parameter de salto.

Luego creé la variable teste2, que recupera solo la lista de elementos (ignorando "hasMore").

Finalmente utilizo la siguiente lógica: si la API devuelve "hasMore" = TRUE, la consulta debería devolverme teste2 anexada a una lista similar a teste2, pero ahora usando Ticket_query con el parámetro recibido del primer consoult (la recursividad está usando el id del último elemento - equivalente a teste3, como se mostró anteriormente.

Record.Field(Source,"items"){99}[id]

).

Cuando intento obtener solo la primera página ( List.Count(teste2)<=99 ) la consulta funciona, pero cuando intento recuperar más datos ( List.Count(teste2)<=198 o superior) la consulta se bloquea. Imagino que estoy haciendo algo mal en la recursión, pero no puedo encontrar qué.

ErisedAlurem_3-1661784827889.png

Cualquier entrada sería apreciada.

Desafortunadamente, la API es privada, por lo que no puedo mostrar todo el código (ni dar acceso al token)

1 REPLY 1
Syndicate_Admin
Administrator
Administrator

@ErisedAlurem ,

Por favor, revise el siguiente blog, espero que pueda ayudarle.

Funciones recursivas en Power BI / Power Query

Saludos

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.

Jan25PBI_Carousel

Power BI Monthly Update - January 2025

Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.

Jan NL Carousel

Fabric Community Update - January 2025

Find out what's new and trending in the Fabric community.

Top Solution Authors