julian7438
Hola,
Mi nombre es Julien, Business Analyst, hace unos días que intento obtener datos de una API REST – método POST con una consulta usando M.
Aquí la consulta:
(StartDate as text)=> let Url = "https://public-api.ringover.com/v2/calls", Token = "here is my key", EntitiesPerPage = 100, StartDate = Date.ToText(Date.FromText(StartDate), "yyyy-MM-ddT00:00:00Z"), GetJson = (Url, LastIdReturned) => let Body = "{""intra"":false, ""limit_count"":" & Text.From(EntitiesPerPage) & ", ""start_date"":""" & StartDate & """, ""last_id_returned"":" & Text.From(LastIdReturned) & "}", Options = [Headers=[ #"Authorization" = Token ], Content=Text.ToBinary(Body)], RawData = Web.Contents(Url, Options), Json = Json.Document(RawData) in Json, GetEntityCount = () => let Json = GetJson(Url, 0), Count = Json[#"total_call_count"] in Count, GetPage = (LastIdReturned) => let Json = GetJson(Url,LastIdReturned), LastIdReturned = try List.Last(Json[#"call_list"])[cdr_id] otherwise 0, data = try Json[#"call_list"] otherwise null, res = [Data=data, Next=LastIdReturned] in res, NbRecords = GetEntityCount(), EntityCount = List.Max({ EntitiesPerPage, NbRecords }), PageCount = Number.RoundUp(EntityCount / EntitiesPerPage), GeneratedList = List.Generate( ()=>[i=0, res = GetPage(0)], each [i]<PageCount and [res][Data]<>null, each [i=[i]+1, res = GetPage([res][Next])], each [res][Data]), Table = Table.FromList(GeneratedList, Splitter.SplitByNothing(), null, null, ExtraValues.Error) in Table
Es un poco complicado debido a la paginación, y esta consulta no funciona y no encuentro por qué, en realidad devuelve todas las listas pero los duplicados de la primera.
Aquí está el siguiente enlace de Ringover para usar allí API, pero tampoco me ayuda: https://developer.ringover.com/
Le he pedido ayuda a Ringover o a mis colegas, pero sigo atascado.
Si alguien me puede ayudar, será maravilloso…
Muchas gracias
julián
julian7438
En respuesta a julian7438
Hola @PhilipTreacy
Finalmente, mi colega Data Architect encontró la solución.
El LasIdReturned en GetPage fila 24 «LastIdReturned = try List.Last(Json[#»call_list»])[cdr_id] de lo contrario, 0″, estaba en conflicto con todos los «LastIdReturned» anteriores.
Así que cambió el nombre de todos los «LastIdReturned before» por «LastId» y ahora funciona muy bien.
Gracias a ti de nuevo por tu tiempo.
BR
julián
felipetreacy
Hola @Julien7438
Estoy un poco confundido. ¿Esto funciona o no? ¿El problema es solo que está obteniendo la primera lista duplicada?
Si ese es el caso, entonces sus condiciones iniciales para resolución en List.Generate puede necesitar ser cambiado.
()=>[i=0, res = GetPage(0)],
phil
Si respondí tu pregunta, marca mi publicación como la solución.
Si mi respuesta ayudó a resolver su problema, felicítelo haciendo clic en Me gusta.
julian7438
En respuesta a felipetreacy
Hola @PhilipTreacy,
Gracias por tu respuesta, el código no funciona y hace exactamente lo que dices.
Intenté usar este tema de otra manera, pero no puedo entender eso.
https://community.powerbi.com/t5/Desktop/Rest-API-Json-several-pages-automatically-call-the-next-pag…
Tienes razón, la parte de la iteración tiene un problema.
Muchas gracias, voy a investigar de esta manera, si tienes alguna sugerencia, házmelo saber.
BR,
julián
felipetreacy
En respuesta a julian7438
Hola @Julien7438
¿Puede ser específico acerca de cómo no está funcionando? ¿Está generando un error? ¿Te está dando resultados inesperados? ¿Puede compartir qué salida genera la consulta?
Saludos
phil
Si respondí tu pregunta, marca mi publicación como la solución.
Si mi respuesta ayudó a resolver su problema, felicítelo haciendo clic en Me gusta.
julian7438
En respuesta a felipetreacy
Hola @PhilipTreacy
Por ejemplo, si configuro el parámetro StartDate en «2020-10-27», la consulta generará una cantidad de listas, precisamente 42, lo cual es normal porque cada lista contiene 100 registros (filas) y conozco la base de datos. ha generado 4200 filas desde esa fecha (42 * 100).
Pero en realidad tengo la misma lista única 42 veces, así que cuando elimino el duplicado solo tengo 100 filas (mi primera lista).
No encontré cómo compartir una foto o captura de pantalla, así que espero haber sido claro.
Gracias de nuevo por tu tiempo.
julian7438
En respuesta a julian7438
Hola @PhilipTreacy
Finalmente, mi colega Data Architect encontró la solución.
El LasIdReturned en GetPage fila 24 «LastIdReturned = try List.Last(Json[#»call_list»])[cdr_id] de lo contrario, 0″, estaba en conflicto con todos los «LastIdReturned» anteriores.
Así que cambió el nombre de todos los «LastIdReturned before» por «LastId» y ahora funciona muy bien.
Gracias a ti de nuevo por tu tiempo.
BR
julián
Arturo MP
En respuesta a julian7438
Hola Julien,
He estado tratando de hacer lo mismo que tú. No soy realmente un profesional con PowerQuery.
Intenté su solución, pero todo lo que recibo son entidades duplicadas. Si elijo 100 entidades por página, obtiene 100 entidades y luego las duplica.
Probé la solución que publicaste después pero no cambia nada, tal vez no te entendí. ¿Puedes copiar y pegar el nuevo código o algo así?
Mi objetivo es recopilar todas las llamadas de Ringover desde una fecha de inicio seleccionada y luego actualizar los nuevos datos todos los días de forma acumulativa.
¡Espero que todavía pueda alcanzarte!
¡atentamente!
Arturo