Join us at FabCon Atlanta from March 16 - 20, 2026, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.
Register now!The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now! Learn more
¡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:
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)
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:
(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é.
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)
Por favor, revise el siguiente blog, espero que pueda ayudarle.
Funciones recursivas en Power BI / Power Query
Saludos
The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now!