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

Enhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.

Reply
bwhdegroot
Frequent Visitor

Paginate Rest API a través del método Offset and Limit

Hola a todos,

Sé que esto ha sido cubierto una cantidad bastante frecuente de veces, pero parece que no puedo conseguir que funcione con mi api.

Actualmente estoy intentando conectarme a la siguiente API: https://api.searchsoftware.nl/v2/jobs?include=categories|contacts&access_token=XXX

Este es nuestro sistema CRM. Como hay un límite de 500, quiero paginar usando el método offset/limit. Intenté varios ejemplos, pero todos se costura para fallar conmigo.

= List.Skip(List.Generate( () => [Last_Key = "", Counter=0], // Start Value
     each  [Last_Key] <> null, // Condition under which the next execution will happen
     each [ Last_Key = try if [Counter]<1 then "" else [WebCall][Value][offset] otherwise null,// determine the LastKey for the next execution
                       WebCall = try if [Counter]<1 then Json.Document(Web.Contents("https://api.searchsoftware.nl/v2/jobs?include=categories|contacts&access_token=MYKEY")) else Json.Document(Web.Contents("https://api.searchsoftware.nl/v2/jobs?include=categories|contacts&access_token=MYKEY&offset="&Last_Key)), // retrieve results per call
             Counter = [Counter]+1// internal counter
                      ],
     each [WebCall]
    ),1)

¿Alguien puede decirme qué estoy haciendo mal aquí? Obtengo una lista de 50 registros según el límite estándar en la API. El segundo registro muestra un error que indica que el operador no se puede aplicar al texto y al número.

¡Muchas gracias!

7 REPLIES 7
Syndicate_Admin
Administrator
Administrator

¡Señores, buenas noches!

Me gustaría que me ayudaran a que esto no consiguiera que el power bi funcionara...

Este es el retorno de la paginación API.

--Total es la cantidad total de registros.

--Offset es el comienzo de mi búsqueda

--limit es el máximo que devuelve la API a la vez,...

He intentado de muchas maneras, pero todavía no puedo pensar en una solución,...

Lmoning que mi API usa un encabezado Headers.

rafaellopesro_1-1645326398913.png

dejar
linhasPorPaginas = 250,
ValorOffset= 0,

Token = [Encabezados = [#"access-token"="xxx", #"secret-access-token"="yyyyyy", #"content-type"="application/json", #"cache-control"="no-cache"]],

Limit = "&limit=" & Text.From(linhasPorPaginas),
Offset = "&offset=" & Text.From(ValorOffset),

Url = "¿https://api.vhsys.com/v2/categorias?" y Límite,
GetJson = (Url) = >
dejar
RawData = Web.Contents(Url, Token),
Json = Json.Document(RawData)
en Json,

Url2 = Url & "&offset=0,",

GetEntityCount = () = >
let url = (url2 & token),
Json = GetJson(Url),
Count = Json[#"total_count"]
en
Contar

GetPage = (Índice) = >
dejar
(opción A)desplazamiento igual al recuento de filas anterior
offset = "&offset=" & Text.From(Index * linhasPorPaginas)&",",
(opción B)desplazamiento igual al número de página
offset = "&offset=" & Text.From(Índice),
Url = Url & offset & Token,
Json = GetJson(Url),
Valor = Json[#"jobs"]
en
Valor

EntityCount = GetEntityCount(),
PageCount = Number.RoundUp(EntityCount / linhasPorPaginas),
PageIndices = { 0 .. PageCount - 1 },
Pages = List.Transform(PageIndices, cada GetPage(_)),
Entidades = List.Union(Páginas),
Tabla = Table.FromList(Entities, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
en
Mesa

amitchandak
Super User
Super User

Desafortunadamente he estado pasando por todos estos enlaces ya, pero no hay éxito hasta lejos, pero gracias!

Anonymous
Not applicable

HOLA @bwhdegroot,

Parece que está copiando la fórmula de consulta de ejemplo y trata de usarla con su escenario, ¿verdad?
Creo que debe realizar alguna modificación en las funciones internas con su cadena de consulta de dirección URL y propiedades devueltas. (su API no contiene parámetros 'top, skip, count')

Por favor, eche un vistazo a la siguiente fórmula si cumple con su requisito:

let 
 MYKEY="xxxxxx",//token string
    EntitiesPerPage = 500,
 Token= "&access_token=" & MYKEY,
 Limit="&limit=" & Text.From(EntitiesPerPage),
    Url = "https://api.searchsoftware.nl/v2/jobs?include=categories|contacts" & Limit,
    GetJson = (Url) =>
        let    
            RawData = Web.Contents(Url & Token),
            Json    = Json.Document(RawData)
        in  Json,
 
    GetEntityCount = () =>
        let Url   = Url & "&offset=0" & Token,
            Json  = GetJson(Url),
   Count = Json[#"total_count"]
        in  
   Count,
 
    GetPage = (Index) =>
        let 
   //(option A)offset equal to previous row count 
   offset  = "$offset=" & Text.From(Index * EntitiesPerPage), 
   //(option B)offset equal to page numer 
            //offset  = "$offset=" & Text.From(Index),            
   Url   = Url & offset & Token,
            Json  = GetJson(Url),
            Value = Json[#"jobs"]
        in  
   Value,
 
    EntityCount =  GetEntityCount(),
    PageCount   = Number.RoundUp(EntityCount / EntitiesPerPage),
    PageIndices = { 0 .. PageCount - 1 },
    Pages       = List.Transform(PageIndices, each GetPage(_)),
    Entities    = List.Union(Pages),
    Table       = Table.FromList(Entities, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    Table

Aviso: No estoy tan seguro de qué tipo de parámetro de desplazamiento usó la API, elija uno de los dos pasos de desplazamiento opcionales en función de su escenario.

saludos

Xiaoxin Sheng

Hola @v-shex-msft

¡Gracias! Esto es casi lo que necesito y lo veo recuperar datos. La única observación es que basado en mis 836 registros y límite por página de 50, veo 17 páginas. Sin embargo, estas 17 páginas tienen todos los mismos datos. ¿Cómo se puede adaptar el código de código para que se recorra el desplazamiento para mostrar diferentes páginas?

¡Muchas gracias!

Anonymous
Not applicable

HOLA @bwhdegroot,

Después de comprobar mi código, creo que puede ser causado por el error tipográfico. La API usa el carácter '&' para vincular parámetros de cadena de consulta, pero tengo que escribir '$' carácter (en la función GetPage) que puede no funcionar.
Por favor, intente utilizar los siguientes códigos para confirmar que han solucionado el problema de los datos de página duplicados:

let 
 MYKEY="xxxxxx",//token string
    EntitiesPerPage = 500,
 Token= "&access_token=" & MYKEY,
 Limit="&limit=" & Text.From(EntitiesPerPage),
    Url = "https://api.searchsoftware.nl/v2/jobs?include=categories|contacts" & Limit,
    GetJson = (Url) =>
        let    
            RawData = Web.Contents(Url & Token),
            Json    = Json.Document(RawData)
        in  Json,
 
    GetEntityCount = () =>
        let Url   = Url & "&offset=0" & Token,
            Json  = GetJson(Url),
   Count = Json[#"total_count"]
        in  
   Count,
 
    GetPage = (Index) =>
        let 
   //(option A)offset equal to previous row count 
   offset  = "&offset=" & Text.From(Index * EntitiesPerPage), 
   //(option B)offset equal to page numer 
            //offset  = "&offset=" & Text.From(Index),            
   Url   = Url & offset & Token,
            Json  = GetJson(Url),
            Value = Json[#"jobs"]
        in  
   Value,
 
    EntityCount =  GetEntityCount(),
    PageCount   = Number.RoundUp(EntityCount / EntitiesPerPage),
    PageIndices = { 0 .. PageCount - 1 },
    Pages       = List.Transform(PageIndices, each GetPage(_)),
    Entities    = List.Union(Pages),
    Table       = Table.FromList(Entities, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    Table

saludos

Xiaoxin Sheng

¡Señores, buenas noches!

Me gustaría que me ayudaran a que esto no consiguiera que el power bi funcionara... A continuación se muestra el retorno de la paginación API.

Me gustaría traer todos los datos de esta tabla de API...

--Total es la cantidad total de registros.

--Offset es el comienzo de mi búsqueda

--limit es el máximo que devuelve la API a la vez,...

He intentado de muchas maneras, pero todavía no puedo pensar en una solución,...

Lmoning que mi API usa un encabezado Headers.

rafaellopesro_2-1645326652871.png

let 
    linhasPorPaginas = 250,
    Token = [Headers = [#"access-token"="xxxxxxx", #"secret-access-token"="yyyyyyy", #"content-type"="application/json", #"cache-control"="no-cache"]],
    Limit  = "&limit="   & Text.From(linhasPorPaginas),

    Url = "https://api.vhsys.com/v2/produtos?" & Limit,
    GetJson = (Url) =>
        let 	
           RawData = Web.Contents(Url,   Token),		
            Json    = Json.Document(RawData)
        in  Json,

        Url2 = Url & "&offset=0,",
 
    GetEntityCount = () =>
        let Url   = (Url2  &  Token),
            Json  = GetJson(Url),
			Count = Json[#"total_count"]
        in  
			Count,
 
    GetPage = (Index) =>
        let 
			//(option A)offset equal to previous row count 
			offset  = "&offset=" & Text.From(Index * linhasPorPaginas)&",", 
			//(option B)offset equal to page numer 
            //offset  = "&offset=" & Text.From(Index),            
			Url   = Url & offset & Token,
            Json  = GetJson(Url),
            Value = Json[#"jobs"]
        in  
			Value,
 
    EntityCount =  GetEntityCount(),
    PageCount   = Number.RoundUp(EntityCount / linhasPorPaginas),
    PageIndices = { 0 .. PageCount - 1 },
    Pages       = List.Transform(PageIndices, each GetPage(_)),
    Entities    = List.Union(Pages),
    Table       = Table.FromList(Entities, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    Table

Helpful resources

Announcements
July 2025 community update carousel

Fabric Community Update - July 2025

Find out what's new and trending in the Fabric community.

July PBI25 Carousel

Power BI Monthly Update - July 2025

Check out the July 2025 Power BI update to learn about new features.

Top Solution Authors
Top Kudoed Authors