Automatice la omisión y recepción de llamadas a la API a través de Power query

Un usuario Pregunto ✅

BobKoenen

Hola,

He creado una consulta en blanco, ver a continuación, para obtener datos de una API de software directamente en power bi. Recientemente, la compañía de software impuso una restricción a la cantidad de datos que se pueden solicitar en una llamada. Tengo 3 tablas que tienen más de 250.000 registros y no puedo recurrir a ellas ahora porque recibo un error de servicio. La compañía de software me dice que tendré que trabajar con su funcionalidad «saltar y tomar» que le permite obtener los datos en lotes. Puedo copiar manualmente la consulta a continuación 20 veces y cambiar la toma de omisión en cada consulta y agregarlas en power bi. Ver ejemplo.

consulta 1. omita 0 tome 10000

Consulta 2. Omitir 10000 tomar 10000

Consulta 3 Salta 20000 toma 10000

Pero esto es mucho trabajo y me preguntaba si hay una mejor manera de hacerlo en la que pueda elegir la cantidad de captura y la cantidad de omisión de forma dinámica sin copiar la consulta 20x.

esta es la consulta en blanco para la solicitud:

dejar
Fuente = Xml.Tables (Web.Contents («» & URL & «»
,[Content=Text.ToBinary(«<soapenv:Envelope xmlns:soapenv=»&Character.FromNumber(34)&»http://schemas.xmlsoap.org/soap/envelope/»&Character.FromNumber(34)&» xmlns:urn=»&Character.FromNumber(34)&»urn:Afas.Profit.Services»&Character.FromNumber(34)&»>
<soapenv:Header/>
<soapenv:Body>
<urn:GetData>
<urn:token>
<![CDATA[
«& Token &»
]]>

«& Conector &»
0
999999999


«), Encabezados =[#»Content-Type»=»text/xml;charset=UTF-8»]]))
en
Fuente

Espero que puedas ayudarme

mahoneypat

Puede comenzar su consulta con = List.Numbers (0, 25, 10000), convertir eso en una Tabla y luego concatenarlo en su llamada web como el valor de Omitir. Luego tendrá una tabla de 25 tablas y podrá expandirla para combinar todos los datos.

Si esto le funciona, márquelo como la solución. Las felicitaciones también son apreciadas. Por favor avíseme si no es así.

Saludos,

Palmadita

En respuesta a mahoneypat

No utilice List.Numbers para esto, ya que llamará a la API más de lo necesario. Desea detenerse una vez que llegue al final de la lista de elementos.

En su lugar, use List.Generate o una función recursiva real. Tal como:

let 
   nextPage = (start) => 
      let 
          values = Xml.Tables(Web.Contents("https://example.com/?start=" * Text.From(start) & "&end=" & Text.From(start + 25)),

       in
           if Table.RowCount(values) < 25 then
              values
            else
               values & @nextPage(start + 25)

mahoneypat

En respuesta a artemus

List.Numbers es un buen enfoque para esto. Por lo general, primero hago una llamada para obtener el recuento total, lo divido por las filas por llamada y uso ese número como el número de elementos en List.Numbers. De esa manera, realiza el número correcto de llamadas.

Saludos,

Palmadita

lbendlin

Puede escribir una función recursiva que incremente el recuento de saltos después de cada iteración. Solo asegúrese de saber cuándo detenerse (probablemente cuando el número de filas devueltas sea menor que el número de filas solicitadas («tomar»).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *