Iteraciones en múltiples llamadas al API de ITM Platform con Excel Power Query

 
Nota: Esta guía sigue los pasos mostrados en este vídeo:

Cuando se utiliza el API, en ocasiones hay que hacer una llamada por cada registro de una consulta previa. Por ejemplo:

  • Una primera llamada a la lista de proyectos da como resultado una lista
  • Para conocer el presupuesto de cada registro, se obtiene una tabla agregada de presupuestos de proyecto a partir de la lista anterior

 

Este es el esquema conceptual de las llamadas:

Paso 1: Identificación de métodos y acceso básico al API

Para todo lo referente al acceso básico al API de ITM Platform, puede consultar la primera parte de esta guía, con su vídeo correspondiente: En el caso del ejemplo empleado en este artículo, es necesario emplear tres métodos. Los primeros dos ya habían sido utilizados para acceder a ITM Platform y generar la lista de proyectos.

  • Autenticación
  • Lista de proyectos
  • Presupuesto por cada proyecto

Partiendo de la consulta del artículo anterior, se seleccionan únicamente las columnas ProjectID y ProjectName. El resultado es una lista de proyectos debidamente identificada.

Para verificar que la consulta sea correcta, el editor avanzado debería mostrar un código con una estructura semejante a la del ejemplo:
let

    myToken = Json.Document(Web.Contents(«https://api.itmplatform.com/itmrozas/login/elon.musk@itmplatform.com/12345»)),

    Source = Json.Document(Web.Contents(«https://api.itmplatform.com/itmrozas/projects/?ProjectStartDate=lt:2017-05-08T00:00:00Z&ProjectEndDate=gt:2017-05-06T00:00:00Z», [Headers=[token=myToken[Token]]])),

    #»Converted to Table» = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

    #»Expanded Column1″ = Table.ExpandRecordColumn(#»Converted to Table», «Column1», {«ProjectID», «ProjectName»}, {«ProjectID», «ProjectName»}),

in

    #»Expanded Column1″

Paso 2 – Crear la segunda consulta y convertirla en función

La segunda consulta  del ejemplo recupera el presupuesto detallado por cada proyecto.

La consulta se realiza siguiendo el mismo procedimiento, con una diferencia muy importante: la URL varía por cada llamada:

https://api.itmplatform.com/itmrozas/projects/{ProjectID}/budget

Es decir, hay que reemplazar {ProjectID] por su valor: el ID de cada proyecto. Para hacerlo de forma automática hay que crear una nueva consulta y transformarla en una función.  La sintaxis es muy similar.

Nota: Antes de proseguir, es conveniente cambiar el nivel de privacidad del libro actual a “ninguno“ en las opciones de privacidad de las opciones de Power Query. De lo contrario podría haber errores a la hora de combinar consultas.

  1. Creación de una consulta en blanco 
  2. Creación de la función. Véase la sintaxis:

(p_id) =>

let

    myToken = Json.Document(Web.Contents(«https://api.itmplatform.com/itmrozas/login/elon.musk@itmplatform.com/12345»)),

    Source = Json.Document(Web.Contents(«https://api.itmplatform.com/itmrozas/projects/»& Number.ToText(p_id) & «/budget», [Headers=[token=myToken[Token]]]))

in

    Source

Diferencias con consultas genéricas:

  • al inicio se abre con:

 (p_id) =>

Esta fórmula indica que una función reemplazará a Number.ToText(p_id) en cada URL que genere por el ID de proyecto.

  •  Al grabar la query, el sistema indica que se trata de una función. En este caso, lleva el nombre “Budget”

Paso 3 – Unir los pasos anteriores

Una vez creada la función, hay que volver sobre la consulta inicial para:

 Añadir una columna a modo de función personalizada

 Elegir la función recién creada

 Escoger como parámetro la columna ProjectID

El resto de pasos es el habitual:

  • Expandir las columnas para seleccionar las que sean de interés
  • Añadr las columnas personalizadas convenientes
  • Grabar y utilizar cualquiera de los medios de explotación de datos de Excel, como por ejemplo PowerPivot.

En el ejemplo se han añadido dos campos personalizados:

  • Total Budget
  • Actual cost

Los dos campos se han comparado con un gráfico de barras.

Nota: Si el resultado de la primera tabla contiene muchos registros, las llamadas a la segunda consulta pueden demorarse, pues se harán tantas consultas como registros haya. Trate de limitar la búsqueda a lo que le interese.