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 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.
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"?
@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
Tengo un error, la entrada "total" no está presente en el registro.
Supongo que es de la línea 20
Bueno, sí, no conozco tu API, necesitas saber si tienes registro [total] o no, eso es parte de la respuesta inicial. Si no tienes eso y tienes un campo diferente que te dice cuánto en el registro total tienes, tienes que usar ese.
Alternativamente, haga muchas páginas por adelantado para asegurarse de que no se perderá nada y luego elimine las vacías (esta solución evita la necesidad del campo [total], por lo que puede omitir ese paso)
Esto es lo que obtengo sin [total]
Lo siento, pero realmente no entiendo lo que hago.
Hola @Pitou
¿Te ha ayudado la respuesta de vojtechsima? Si es así, ¿podría aceptarlo como una solución? Si resolviste el problema con tu método, ¿podrías compartir tu método? Esto ayudará a más usuarios que se enfrentan a dificultades iguales o similares. ¡Gracias!
Si el problema persiste, no dude en hacérnoslo saber.
Saludos
Yulia Xu
primero obtenga algunos datos de muestra de la solicitud, supongo que las "líneas de hojas de tiempo".
luego cree una lista de 0..100, luego para cada página usando List.Transform(list, each ...) llame a la API usando un desplazamiento diferente y luego verá cuántos registros tendrá.
Lo siento, no conozco su API, por lo que tiene que hacer un trabajo pesado modificando mi enfoque general.
Hola @vojtechsima ,
De hecho, obtengo datos de las "hojas de tiempo".
¿Dónde debo agregar el List.transform?
El número de registros cambiará todos los días. Mi empresa vende servicios y cada empleado (200) tiene que llenar una hoja de tiempo para cada actividad que hizo cada semana. Por lo tanto, la base de datos crece cada día.
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"
The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now!