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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Anonymous
Not applicable

Cursor Datos paginados de Web API

Hola

Estoy llamando a una api web para tomar algunos datos que se paginan y estoy luchando con cómo obtener la siguiente página de datos, ya que se basa en cursores.

Cuando llamo a la api en PowerQuery (me estoy conectando a través de un origen de datos Web) el Navigator devuelve una tabla con dos filas, la primera fila que contiene una tabla de datos que estoy solicitando y una segunda fila que contiene una tabla que contiene la url original pero con un parámetro de cursor anexado a ella.

por lo que la estructura se ve así:

Original api call (Llamada api original) https://api.myapiurl.com/v1/channel/1234/webcasts

que produce:

NombreMesa
WebcastMesa
EnlaceMesa

La tabla de vínculos contiene lo siguiente:

HrefRel
https://api.myapiurl.com/v1/channel/1234/webcasts?cursor=6789próximo

Puedo expandir la fila de webcast que contiene los datos sin ningún problema, pero ¿cómo llamo a la siguiente página de datos y la almaceno con la primera llamada y luego continuar hasta que tenga todos los datos disponibles?

¡Muchas gracias!

22 REPLIES 22
Greg_Deckler
Super User
Super User

Sé que @ImkeF ha hecho cosas así.

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

Sí, hay muchos métodos en este subproceso: https://community.powerbi.com/t5/Desktop/how-to-create-a-query-that-paginates/td-p/20047

Recomiendo encarecidamente este vídeo también: https://www.youtube.com/watch?v=vhr4w5G8bRA

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF

Muchas gracias por la ayuda y los recursos. Lo he leído y siento que casi estoy allí, pero no puedo unirme a los puntos. Soy muy nuevo en PowerQuery, así que parte de la sintaxis sigue siendo un misterio para mí, ¡pero estoy llegando allí!

Mis datos se devuelven como xml (no creo que marcan mucha diferencia) y la última fila de la página tiene dos campos, Attribute:href y Attribute:rel. El campo rel contiene la palabra siguiente y el campo rel una URL completa con el cursor para la página siguiente. La documentación de la API indica que cuando se alcanza la última página no habrá ningún valor en el campo rel.

Según entiendo, puedo usar la función List.Generate y efectivamente 'bucle' a través de los datos y pasar la siguiente url y tomar la siguiente página de datos. Parece que no puedo averiguar cómo hacer referencia a los campos de mi origen y usarlo para obtener el siguiente conjunto de datos. Esto es lo que tengo hasta ahora (que no funciona!)

let
    Source = Xml.Tables(Web.Contents("https://api.myWebService.com/v1/channel/1234/webcasts")),
    #"Expanded Table" = Table.ExpandTableColumn(Source, "Table", {"title", "description", "presenter", "duration", "start", "keywords", "published", "visibility", "url", "status", "active", "created", "lastUpdated", "link", "Attribute:id", "syndicationType", "Attribute:href", "Attribute:rel"}, {"Table.title", "Table.description", "Table.presenter", "Table.duration", "Table.start", "Table.keywords", "Table.published", "Table.visibility", "Table.url", "Table.status", "Table.active", "Table.created", "Table.lastUpdated", "Table.link", "Table.Attribute:id", "Table.syndicationType", "Table.Attribute:href", "Table.Attribute:rel"}),
    myTest = List.Generate( ()=>
        [Result = Source, Counter = 0],
        each [Result][[Attribute:href] <> null and [Counter]< 20,
        each [Result = Xml.Tables(Web.Contents([Attribute:href])),
        Counter = [Counter] + 1]

    )
in
    myTest

Cualquier puntero que podría proporcionar en conseguir este derecho sería muy apreciado!

Anonymous
Not applicable

Hola @ImkeF ,

Espero que estés a salvo y bien.

Si utilizo el enfoque de pasar una dirección URL a una función y la función que devuelve el conjunto de datos, ¿puedo hacer referencia a campos dentro de ese conjunto de datos sin expandir la tabla? Parece que no puedo conseguir el código para reconocer el nombre del campo. Por ejemplo, si utilizo la referencia de nombre de campo [Attribute:href] la sección Atributo se subraya como un error de identificador no válido.

Muchas gracias por su ayuda!

Hola @eyeballkid ,

Lo siento, pero no puedo seguir sin ver nada que ha vuelto.

¿Podría pegar algunas capturas de pantalla o crear algunos datos de maquetas que ilusoriquen el problema?

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF ,

Sí, no hay problema. Voy a tratar de establecer donde estoy con esto en este momento con algunas imágenes, datos y código. Disculpasitos si esto pasa por algunas cosas de las que ya hemos hablado.

Hasta ahora he creado una función simple para aceptar una dirección URL que llama a un servicio web y devuelve un conjunto de datos XML:

(url as text) as table =>
let
    Source = Xml.Tables(Web.Contents(url))
in
    Source

Si paso la siguiente url:

https://api.myWebService.com/v1/channel/12345/webcasts

Recibo lo siguiente:

Image1.jpg

Expandir la columna Tabla me da esto:

Image2.jpg

Como puede ver, la última fila del conjunto de datos contiene valores en las columnas Table.Attribute:href y Table.Attribute:rel que indican que hay otra página de datos y la dirección URL con un parámetro de cursor anexado a ella.

He intentado escribir una consulta que invoca la función y usa la función List.Generate para paginar los datos, pasando el valor de Table.Attribute:href a la función, creando una lista de tablas hasta que no haya más páginas que procesar.

Usando la ayuda que has dado en otros subprocesos y en este también, he escrito esta consulta pero como puedes ver, por alguna razón no parece gustarle la referencia de campo:

Image3.jpg

Si elimino el [Attribute:href] el código no muestra errores y devuelve el conjunto de datos inicial, pero no va más allá (como puede ver el bucle está configurado para devolver 5 páginas con fines de prueba):

Image4.jpg

Espero que esto ayude, pero si necesita más información por favor hágamelo saber!

Muchas gracias

Hola @eyeballkid ,

intentar eliminar el XML. Tables(Web.Contents( -part de la consulta.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF,

No tengo suerte. Este es el código ahora, pero todavía obtengo un error de identificador no válido para el atributo parte.

let
myList = List.Generate( ()=>
    [Result = try Query4("https://api.brighttalk.com/v1/channel/10737/webcasts") otherwise null, Counter = 0],
    each [Result] <> null and [Counter] < 5,
    each [Result = try Query4(Table.LastN([Result], 1)[Attribute:href]) otherwise null, Counter = [Counter]+1],
    each [Result])
in
    myList

Hola @eyeballkid ,

para fines de depuración, utilice esta consulta:

let
myList = List.Generate( ()=>
    [Result = Query4("https://api.brighttalk.com/v1/channel/10737/webcasts"), Counter = 0],
    each  [Counter] < 5,
    each [Result =  Query4(Table.LastN([Result], 1)[#"Attribute:href"]), Counter = [Counter]+1],
    each [Result])
in
    myList

Debe crear una lista y allí tienes que navegar a los errores y pegar capturas de pantalla de ellos por favor.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF ,

No hay problema, utilicé la consulta y obtuve lo siguiente:

Image5.jpg

La perforación a través de la primera fila da lo siguiente:

Image6.jpg

La perforación en las filas de error da lo siguiente:

Image7.jpg

El error es el mismo para todas las filas subsiguientes...

Hola @eyeballkid ,

por lo que tiene que navegar a la tabla de enlaces primero.

Por favor, intente esto:

let
myList = List.Generate( ()=>
    [Result = Query4("https://api.brighttalk.com/v1/channel/10737/webcasts"), Counter = 0],
    each  [Counter] < 5,
    each [Result =  Query4(Table.LastN([Result]{[Name = "link"]}, 1)[#"Attribute:href"]), Counter = [Counter]+1],
    each [Result])
in
    myList

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF ,

He probado el código que sugeriste y aunque ha lanzado un error creo que estamos progresando!

La primera fila devuelve datos según lo esperado, pero las filas subsiguientes muestran este error:

Image8.jpg

Hola @eyeballkid ,

Sí, definitivamente haciendo progresos aquí.

Compruebe el formato de pegar imagen de myList{0}.

Si se trata de un registro, el código siguiente podría funcionar:

let
myList = List.Generate( ()=>
    [Result = Query4("https://api.brighttalk.com/v1/channel/10737/webcasts"), Counter = 0],
    each  [Counter] < 5,
    each [Result =  Query4(Table.LastN([Result][link], 1)[#"Attribute:href"]), Counter = [Counter]+1],
    each [Result])
in
    myList

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF ,

Los datos de myList {0} tiene este aspecto:

Image1.jpg

Perdona mi ignorancia, ya que soy un poco nuevo en las estructuras de datos de Power Query. ¿La estructura es esencialmente una tabla con dos filas (registros) en ella y la columna Tabla y, a continuación, contiene una estructura de datos Table dentro de ella?

He intentado el código de enmienda que todavía error, pero dio este mensaje :

Image9.jpg

Sí, debo haber estado durmiendo un poco aquí.

let
myList = List.Generate( ()=>
    [Result = Query4("https://api.brighttalk.com/v1/channel/10737/webcasts"), Counter = 0],
    each  [Counter] < 5,
    each [Result =  Query4(Table.LastN([Result]{[Name = "link"]}[Table], 1)[#"Attribute:href"]), Counter = [Counter]+1],
    each [Result])
in
    myList

[Resultado] devuelve una tabla

[Nombre " "enlace"] toma la fila de esa tabla en la que Nombre á "enlace" : Se trata de un registro.

[Tabla] toma el valor del campo Tabla del registro. Allí se encuentra la mesa que nos interesa.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF ,

¡Ah, ya veo! ¡No me di cuenta de que podías anidar referencias de esa manera!

Por lo tanto, un poco más de progreso creo, todavía error, pero con este mensaje de la fila 2 en adelante:

Image10.jpg

Hola @eyeballkid ,

un día, llegaremos 😉

let
myList = List.Generate( ()=>
    [Result = Query4("https://api.brighttalk.com/v1/channel/10737/webcasts"), Counter = 0],
    each  [Counter] < 5,
    each [Result =  Query4(Table.LastN([Result]{[Name = "link"]}[Table], 1){0}[#"Attribute:href"]), Counter = [Counter]+1],
    each [Result])
in
    myList

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Anonymous
Not applicable

Hola @ImkeF,

Cualquier oportunidad que también pueda ayudarme, problema muy similar a este hilo, pero tengo que profundizar unos pasos para obtener mi 'siguiente' url

Función GetURL:

(url as text) as table =>
let
    Source = Json.Document(Web.Contents(url)),
    results = Source[results],
    #"Converted to Table" = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "properties", "createdAt", "updatedAt", "archived"}, {"id", "properties", "createdAt", "updatedAt", "archived"}),
    #"Expanded properties" = Table.ExpandRecordColumn(#"Expanded Column1", "properties", {"amount", "createdate", "dealstage", "hs_lastmodifieddate", "hs_object_id", "printing_kpi_by"}, {"amount", "createdate", "dealstage", "hs_lastmodifieddate", "hs_object_id", "printing_kpi_by"})//& Number.ToText(after))),
in
   #"Expanded properties"



el resultado si solo solicito la primera URL y no se está profundizando (disculpas por usar una tabla pero tener errores cada vez que intento cargar capturas de pantalla):

NombreValor
ResultadosLista
PaginaciónRegistros

La siguiente dirección URL se encuentra dentro de los registros de "paginación", se requieren los siguientes pasos para llegar a ella:

let
source = Json.Document(Web.Contents("https://api.hubapi.com/crm/v3/objects/deals?limit=100&paginateAssociations=false&archived=false&hapikey=APIKEY&properties=dealstage&after=0")),
    #"Converted to Table" = Record.ToTable(source),
    Value = #"Converted to Table"{1}[Value],
    next = Value[next],
    #"Converted to Table1" = Record.ToTable(next)

in
#"Converted to Table1"


Que devuelve la tabla siguiente:

NombreValor
Después1677291168
Enlacehttps://api.hubapi.com/crm/v3/objects/deals?archived=false&paginateAssociations=false&limit=100&afte...


Este es el código que estoy tratando de ajustar basado en este hilo, sólo estoy inseguro cómo hacer referencia al siguiente enlace correctamente

let
myList = List.Generate( ()=>
    [Result = GetURL("https://api.hubapi.com/crm/v3/objects/deals?limit=100&paginateAssociations=false&archived=false&hapikey=APIKEY&properties=dealstage&after=0"), Counter = 0],
    each  [Counter] < 5,
    each [Result =  GetURL(Table.LastN([Result]{[Name = "link"]}[next], 1){0}[#"Attribute:value"]), Counter = [Counter] +1],
    each [Result])
in
    myList

Devuelve una lista de 5, la tabla de la fila 1 se extrae correctamente como 'Tabla' el siguiente 4 se muestran como errores.

"Expression.Error: la clave no coincide con ninguna fila de la tabla

Detalles:

Llave de la tecla ?
Nombre-enlace

Tabla[Tabla]



Cualquier ayuda sería muy apreciada,

¡Gracias!

@ImkeF

Anonymous
Not applicable

Hola @ImkeF ,

¡Creo que ese día ha llegado! Tenemos éxito!!!

Ahora obtengo un conjunto de resultados de tablas como se esperaba:

Image11.jpg

¿Puedo hacer una pregunta más, por favor? Ultimatley necesito reemplazar la variable Counter con una prueba de si se devuelve una fila de vínculo (el último conjunto de datos paginado no tendrá una fila de vínculo). ¿Cómo sería mejor hacer eso?

Muchas gracias por toda su ayuda con este 😁

Hola @eyeballkid ,

puede utilizar el método de "fuerza bruta" que utilizó antes (intente ... de lo contrario). De lo contrario, tendrías que dividir tus declaraciones: https://www.thebiccountant.com/2020/05/15/miss-last-page-paging-power-bi-power-query/

Simplemente elimine la instrucción counter, que era solo para fines de depuración.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

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

Top Kudoed Authors