Forum Discussion
Cursor Datos paginados de Web API
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
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!
- ImkeF6 years agoCommunity Champion
Hola @eyeballkid
lo que List.Generates le permite hacer referencia a un elemento de la fila/elemento/instancia anterior (de su iteración).
Pero como has mencionado, aún no has utilizado esto.
En la 3a enrugmenta está definiendo un registro que estará disponible de forma predeterminada para futuras referencias. Cada campo puede simplemente ser referenciado por su nombre de campo. Por lo tanto, para hacer referencia al campo "Result", escribiría [Result], ya que este es el operador de búsqueda de registros.
Prueba algo como esto:
cada [Resultado : Xml.Tables(Web.Contents( Table.LastN( [Result], 1)[Attribute:href]))
[Resultado] hace referencia al elemento anterior Resultado archivado. Parece ser una tabla de la que necesita la última fila.
Table.LastN(..., 1) devolverá esto.
[Attribute:href] como operador de búsqueda recuperará el valor de esta columna exacta.
- Anonymous6 years agoNot applicable
Hola @ImkeF ,
¡Muchas gracias por su ayuda con esto! He estado leyendo más de los recursos que sugeriste y he ajustado el código un poco para que sea un poco más eficiente.
En primer lugar, he creado una función que acepta una dirección URL como una cadena y devuelve el resultado:
(url as text) as table => let Source = Xml.Tables(Web.Contents(url)) in SourceA continuación, he escrito una consulta que invoca la función. Se ejecuta sin errores, pero solo devuelve una lista con una tabla en ella. Probé el código, pero creo que el web.Contents parte estaba causando un problema, así que lo he quitado, pero no estoy seguro de si la sintaxis va a funcionar. El código ahora tiene este aspecto:
let myList = List.Generate( ()=> [Result = try Query4("https://api.myWebService.com/v1/channel/1234/webcasts") otherwise null, Counter = 0], each [Result] <> null and [Counter] < 5, each [Result = try Query4(Xml.Tables(Table.LastN([Result],1)[Attribute.href])) otherwise null, Counter = [Counter]+1], each [Result]) in myListGracias una vez más por su ayuda y consejo!
- Anonymous6 years agoNot 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!
- ImkeF6 years agoCommunity Champion
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?
- Anonymous6 years agoNot 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 SourceSi paso la siguiente url:
https://api.myWebService.com/v1/channel/12345/webcastsRecibo 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