Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
1 year ago

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

  • 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"

  • 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_Admin's avatar
      Syndicate_Admin
      Administrator

      @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_Admin's avatar
        Syndicate_Admin
        Administrator

        Tengo un error, la entrada "total" no está presente en el registro.

        Supongo que es de la línea 20