Forum Discussion
Bucle de Power BI REST de API
Hola a todos
En Power query utilizo la función GET de una API REST. Funciona bien, pero la API restringe la respuesta a 1 000 entradas. Entonces, para obtener cada entrada, duplicé mi consulta y usé los parámetros de desplazamiento y límite y luego agregué toda mi consulta.
Como no soy un profesional de Query / BI (Work In Progress), estoy bastante seguro de que hay una mejor manera de hacerlo más rápido y más ligero.
Aquí está la parte fea:
let
// URL de la requête avec la clé API
url = "https://sxXXXXXXX/timesheet-lines?sort=id-&offset=0&limit=1000&api_key=XXXXXXX",
// En-têtes de la requête
headers = [
#"Content-Type" = "application/json",
#"Cookie" = "JSESSIONID=4745XXXXXXXXXD7.jvm1"
],
// Exécution de la requête GET
response = Web.Contents(url, [
Headers = headers
]),
// Conversion de la réponse en JSON
jsonResponse = Json.Document(response),
// Conversion de la réponse en JSON
#"project-activity" = jsonResponse[#"timesheetlines"],
Luego está el uso
let
// URL de la requête avec la clé API
url = "https://sxXXXX/timesheet-lines?sort=id-&offset=1000&limit=1000&api_key=8e529cc63e220c2c7a02eb706986bbbd",
Y tal y tal...
¿Alguien puede ayudarme? He visto muchas solicitudes al respecto, pero no pude hacer que funcionaran en mi caso.
Gracias.
9 Replies
- Syndicate_AdminAdministrator
Hola hombre, @Pitou ,
Tienes que crear un mecanismo de paginación para esto.
Las páginas se calculan en función del resultado máximo, es decir, 4500 resultados totales divididos por el resultado máximo de la página (1000), por lo que tiene 4 o 5 páginas (según el índice inicial) y, a continuación, para cada página que cree, utilice el valor de la página como desplazamiento.
Tengo un artículo que te ayudará a configurarlo correctamente:
https://www.vojtechsima.com/post/pagination-in-power-query
buscar la sección "Compensación y límite en PQ" - Syndicate_AdminAdministrator
Se ve muy bien, ¿cómo lo gestiono con el encabezado, la cookie y el web.contents?
¿Cuál será el código para la paginación de las "líneas de la hoja de horas"?
- Syndicate_AdminAdministrator
@Pitou
Bueno, en base a la información que nos proporcionó:let // Define API request as a reusable function request = (offset as number, limit as number) => Json.Document( Web.Contents( "https://sxXXXX/", [ RelativePath = "timesheet-lines", Query = [ sort = "id-", offset = Text.From(offset), limit = Text.From(limit), api_key = "8e529cc63e220c2c7a02eb706986bbbd" ] ] ) ), // Get total number of records getTotal = request(0, 1)[total], // Assumes the API returns a `total` field in the response // Set page size and calculate total pages pageSize = 1000, totalPages = Number.RoundDown(getTotal / pageSize), // Generate list of pages pages = {0..totalPages}, // Fetch data for each page populatePages = List.Transform( pages, each request(_ * pageSize, pageSize)[data] // Assumes `data` contains the records ), // Combine all pages into a single list expandPages = List.Combine(populatePages) in expandPages- Syndicate_AdminAdministrator
Tengo un error, la entrada "total" no está presente en el registro.
Supongo que es de la línea 20