Cómo pasar datos entre entornos de Business Central - Business Central

Breaking

sábado, 12 de diciembre de 2020

Cómo pasar datos entre entornos de Business Central

Level: Developer

En ocasiones, las empresas pueden disponer de dos entornos de producción, incluso en el mismo tenant, puesto que tienen sedes en diferentes países y necesitan diferentes localizaciones.  Mientrás están en el mismo entorno, podemos usar la función ChangeCompany para leer o escribir datos de una empresa a otra.  Pero, ¿que ocurre cuando están en el mismo tenant y diferente entorno?  En el pasado foro "BC Tech Talk" trasladé esta pregunta a Jens Møller-Pedersen, Engineering Manager en Microsoft y la respuesta de momento es que no tenemos un "ChangeEnvironment". 😈


Escenario

El escenario es que la filial de una empresa en Mexico, con su propia entidad jurídica y por tanto localización mexicana, necesita conocer el stock de producto de la matriz en España para saber si puede solicitarle material.  

Las API, nuestra salvación

Mientras no tengamos algún tipo de instrucción para cambiar de entorno, la solución que nos queda son las API.  Hay muchos foros donde podemos ver como publicar API para consumirlas desde fuera de Business Central.   En este otro post, te mostraba como hacerlo facilmente.

Hoy voy a mostrar como consumir una API de BC desde otro BC por programación mediante código AL.

Preparando nuestra API 

Lo primero que debemos hacer es publicar la API que queramos consumir en Servicios Web de Business Central.  Puede ser incluso una página de producto, de cliente o cualquier otra que tengamos personalizada.  En mi caso, he utilizado una propia que se llamará DisponibilidadSpain, que lo único que hace es mostrar productos con su disponiblidad por diferentes almacenes y las ventas pendientes.


Una vez seleccionada la Page, procedemos a publicarla en Servicios web añadiéndola como una línea nueva:

De esta forma y mediante un usuario y contraseña web (autenticación basic) ya podemos acceder a nuestra página desde el exterior, incluyendo como no, desde otro Business Central.

Consumiendo la API desde AL

Para el ejemplo, he creado una función en una codeunit que me permitirá llamarla desde donde sea necesario, en mi caso desde la página de producto.


Como parámetros recibiremos el código de producto a consultar, las variables Stock, Ventas y Disponibilidad en las que devolveremos los resultados.

Dentro de la función tendremos las siguientes variables:

varHttpClient de tipo HttpClient:  se trata del cliente http que hará la consulta a Business Central.

Response de tipo HttpResponseMessage: aquí se almacena la respuesta de la consulta.

base64 de tipo codeunit y subtipo "Base64 Convert": una fantastica aportación de la nueva versión para no tener que buscarte la vida para convertir datos de/a base64.

Autorización: aquí guardaremos nuestra autorización (usuario y contraseña) en formato base64.

txtMessage: donde guardaremos la respuesta de la consulta http, pero ya en formato texto.

Por otro lado, ya que la respuesta la recibimos en formato JSON usaremos dos variables más para obtener nuestra información relevante:

jsonItem de tipo JsonObject: donde guardaremos el json recibido.
jsonKey de tipo JsonToken: donde leeremos cada uno de los parámetros recibidos.

Una vez tenemos todas las variables, vamos al lío de juntar todo esto para que nos muestre el resultado.


La línea 24, corresponde a la url de la consulta.  ¿De donde sacamos esa información? de la página de Business Central de "Servicios web" donde hemos publicado la página.  En nuestro caso usaremos la de OData v4

La he metido dentro de un StrSubstNo para poder añadir la consulta de sólo un producto y no de todos los productos de la base de datos.  Recuerda que tiene que ir entre comillas simples:


Línea 27.  Creamos la autenticación, llamando a la codeunit base64 e introduciendo el usuario y la password que habremos obtenido de los usuarios de Business Central:


En la línea 28, incorporamos en la cabecera de la llamada http la autorización.  Recuerda que es autorización Basic aunque  Business Central te recomienda ya que vayas usando la autenticación OAuth para servicios web.


Línea 31.  Aquí realmente el cliente http hace la llamada GET a nuestra página publicada, guardando la respuesta en la variable response.  Esta función devuelve TRUE si ha sido correcta la llamada y falso, si falla por algún motivo.

Línea 32.  Guardo la respuesta en una variable de texto.

Línea 33.  Almaceno la respuesta de texto, que llegará en JSON en una variable JsonObject.
Líneas 36 a 41: Leo los parámetros que me llegan, buscando por su identificador, en mi caso corresponderán a los nombres de los campos de mi página Disponibilidad.  Llegarán más campos en el JSON, uno por cada columna de mi página, pero realmente a mí los que me interesan son esos.  Una vez leido cada uno de ellos, lo almaceno en las variables correspondientes stock, ventas y disponibilidad.

Probando la API.

Para probar la API, haremos una extensión de la ficha de producto, añadiendo una acción, que será la que llame a codeunit:






En el trigger OnAction de la acción, creamos las variables correspondientes y hacemos la llamada a la codeunit, pasándole como parámetro el número de producto que está mostrando la página (rec."No."), así como las variables de stock, ventas y disponibilidad.

Después simplemente muestro un mensaje con los datos.  



Podríamos guardar los datos en nuestra tabla de productos y que se actualizase la información en el trigger OnOpenPage, pero cuidado, ten en cuenta que eso ralentiza la página, por tanto deberías hacer la llamada en una Background Task (hablaremos de ellas en próximos post).  Seguramente no siempre que vayas a la ficha de producto será para ver el stock de la central, por tanto asegurate al cargar datos que tarden en calcularse o recogerse.

Conclusión

Hemos visto como consumir una API desde una extensión en AL.  Realmente Microsoft ha dotado a Business Central de una extraordinaria funcionalidad para el manejo de http y de JSON, cuando no hace tanto tiempo teníamos que usar dll's y .Net para manejarlos.  Esto hace de Business Central un software muy integrable
 
Cualquier duda, podéis consultarme.




No hay comentarios: