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
- Anonymous6 years agoNot 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 myTestCualquier 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?