Check your eligibility for this 50% exam voucher offer and join us for free live learning sessions to get prepared for Exam DP-700.
Get StartedDon'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.
¡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
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.
Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.