Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now! Learn more

Reply
Syndicate_Admin
Administrator
Administrator

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 9
Syndicate_Admin
Administrator
Administrator

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]

Pitou_0-1733386259298.png


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

@Pitou

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.

Syndicate_Admin
Administrator
Administrator

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"

Helpful resources

Announcements
Power BI DataViz World Championships

Power BI Dataviz World Championships

The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now!

December 2025 Power BI Update Carousel

Power BI Monthly Update - December 2025

Check out the December 2025 Power BI Holiday Recap!

FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.

Users online (4,368)