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.
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:
Nombre | Mesa |
Webcast | Mesa |
Enlace | Mesa |
La tabla de vínculos contiene lo siguiente:
Href | Rel |
https://api.myapiurl.com/v1/channel/1234/webcasts?cursor=6789 | pró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!
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
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!
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
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:
Expandir la columna Tabla me da esto:
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:
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):
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
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
Hola @ImkeF ,
No hay problema, utilicé la consulta y obtuve lo siguiente:
La perforación a través de la primera fila da lo siguiente:
La perforación en las filas de error da lo siguiente:
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
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:
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
Hola @ImkeF ,
Los datos de myList {0} tiene este aspecto:
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 :
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
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:
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
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):
Nombre | Valor |
Resultados | Lista |
Paginación | Registros |
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:
Nombre | Valor |
Después | 1677291168 |
Enlace | https://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!
Hola @ImkeF ,
¡Creo que ese día ha llegado! Tenemos éxito!!!
Ahora obtengo un conjunto de resultados de tablas como se esperaba:
¿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
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
1 | |
1 | |
1 | |
1 | |
1 |