Como obtener el nivel de inventario desde SAP S/4HANA Cloud usando APIs

Lucas Lopez
6 min readMay 9, 2018

--

Este artículo es parte de una serie que tiene como idea el mostrar cómo se puede actualizar la información de un Ecommerce Marketplace desde un sistema de inventarios. En este caso vamos a ver cómo podemos acceder a la información de inventario desde SAP S/4HANA Cloud.

La colección de Postman con todos los ejemplos y el programa de prueba están disponible en GitHub.

SAP S/4 HANA Cloud & SAP API Business Hub

Pero empecemos por lo básico, que es SAP S/4HANA Cloud y SAP API Business Hub?

SAP S/4HANA Cloud es, en las palabras de SAP, “la suite de negocios de ERP en la nube de próxima generación. Integra cada proceso de negocio, convierte datos en tiempo real en acciones y aumenta la productividad de los empleados, con la seguridad que usted espera de SAP”.

SAP API Business Hub

SAP API Business Hub es el portal de documentación sobre integraciones, servicios de negocio y APIs de SAP Cloud Platform. Para acceder simplemente tenemos que acceder a la siguiente URL: api.sap.com. En la opción APIs vamos a tener acceso a toda la documentación no solo de SAP S/4HANA Cloud sino también a otros productos de SAP como ser SAP Leonardo o Concur Expense.

SAP S/4HANA Cloud on SAP API Business Hub

Pero es algo más que solo documentación. Como parte de la plataforma, podemos obtener la información de cómo invocar a las APIs disponibles así como probarlas directamente desde este portal. Para tener acceso a esto, necesitamos estar registrados.

Actualmente hay disponibles más de 130 artifacts, como los llama SAP, que podemos utilizar para acceder a la información del sistema.

Basic Product Availability Information API — Parte II

Empecemos con lo que estamos buscando en este caso — poder acceder a la información de inventario. La candidata es Basic Product Availability Information API. Esta API expone tres operaciones — acciones más que métodos de entidades siguiendo el modelo REST — que son: DetermineAvailabilityAt, DetermineAvailabilityOf y CalculateAvailabilityTimeseries. Para entender más de estas operaciones podemos acceder a la documentación de SAP.

En nuestro caso, la operación que vamos a utilizar es CalculateAvailabilityTimeseries y la misma espera 3 parámetros de entrada: ATPCheckingRule, Material y SupplyingPlant.

Ahora el desafío es encontrar los valores correctos para realizar la invocación. El primero es el fácil, ATPCheckingRule. Según la documentación, si queremos usar esta API para un Web Shop, entonces el valor recomendado es A, qué significa que se va a aplicar la misma lógica de determinación de inventario que se aplica al momento de crear una orden.

Ahora nos falta los otros dos, que están relacionados con el producto y la planta. Estos valores depende de los datos maestros de nuestro sistema.

OData Service for Product Master

Para poder acceder a la información de los productos vamos a usar otra API, en este caso OData Service for Product Master. La misma nos va a permitir acceder a distintos datos de los productos, desde las descripciones en distintos lenguajes a la información de ventas o unidades de medida.

Primero vamos a llamar al método A_Product. Este no tiene ningún parámetro requerido pero tenemos que tener cuidado con el tamaño de la respuesta.

En este momento, la respuesta de este método sin filtros, en el sandbox de SAP, es de 2,25Mb aproximadamente.

Con la lista de productos, tenemos que elegir uno que creamos el correcto para nuestro escenario. Para este ejemplo vamos a utilizar el código de producto TG11. La llamada al método A_Product(‘{Product}’) usando este código devuelve la misma información pero para este producto solamente. Un tamaño mucho más manejable, 4,78Kb.

Por la estructura de los datos de producto en SAP, ya tenemos uno de los valor que vamos a utilizar en la API de inventario, el Material. Pero ninguna de estas respuestas tiene la información que necesitamos con respecto a la planta.

La API tiene otro método, A_ProductPlant. Pero como el método A_Product, este método no tiene filtros por defecto y devuelve la información para TODAS las platas para TODOS los productos. En este caso la respuesta es de 4,67Mb. Existe otro método que podría ser un buen candidato, A_ProductPlant(Product=’{Product}’, Plant=’{Plant}’), pero requiere que sepamos el código de la planta, justamente el valor que estamos buscando.

Pero gracias a la estructura de ODATA, la respuesta la tenemos en la respuesta del método A_Product(‘{Product}’). Además de incluir los datos generales del producto, la respuesta de este ODATA incluye un serie de URLs para poder obtener más información sobre el producto relacionada con distintos grupos de datos. El que nos interesa es el URL asociado a to_Plant.

Invocando esta URL vamos a obtener la información de las plantas pero únicamente para el producto seleccionado. La respuesta incluye los datos de las nueve plantas en la que el producto está asociado. Como podemos ver en cada uno de los grupos de información por planta, en __metadata están las URLs para llamar al método para obtener solamente la información de un producto para una planta. Ahora podemos elegir una de las plantas. En nuestro caso 1710.

Basic Product Availability Information API — Parte II

Como ya tenemos los tres valores que necesita el método CalculateAvailabilityTimeseries y podemos probarlo tanto desde el portal como desde Postman. Con la combinación de valores que elegimos, el campo AvailableQuantityInBaseUnit nos dice que el inventario es de 177189 PC.

Comentario final sobre ODATA en XML y JSON
Como pudimos ver, la respuesta de varias API es considerable, pero esto es en JSON. Si no incluimos en HTTP Header Accept , la API va a devolver la respuesta en XML, incrementando el tamaño significativamente.

En este momento, la respuesta XML del método A_Product sin filtros, en el sandbox de SAP, es de 3,52Mb aproximadamente. Más del 50% de incremento que la respuesta JSON

Links

Otros Artículos

Todas las opiniones expresadas son mías y no representan opiniones de ninguna entidad con la que he estado, estoy o estaré afiliado.

All views expressed are my own and do not represent opinions of any entity whatsoever with which I have been, am now, or will be affiliated

--

--

Lucas Lopez

Avid Technologist at heart, a lifetime of projects, experience in software development and project management areas.