Curso como crear archivos JSON
En este curso vamos a hacer un desarrollo paso a paso para Dynamics 365 Business Central con JSON.
Se trata de un requisito real que tuvimos que desarrollar para un cliente: una integración con otro software.
En esta integración teníamos que enviar (entre otros), todas las facturas de venta registradas en el sistema.
El envío se hacía a través de WebServices, en formato Json.
En este curso nos vamos a centrar en la creación de los ficheros Json. Veremos cómo se construye un fichero Json y qué utilidades trae Business Central para ayudarnos en esta tarea.
Partimos de un documento de requisitos y hacemos todos los pasos: un análisis, el desarrollo y los tests para dejar el desarrollo listo para implementar.
Este curso también es muy interesante, por todos estos motivos:
- Se trata de un requisito real.
- La implementación fue para un Dynamics 365 Business Central, por lo que se trata de una solución 100% extensiones.
- Usamos vscode con la extensión AL Languange, y también usamos otras extensiones para vscode que nos dan más herramientas para un desarrollo más eficiente. Son las extensiones que nosotras usamos y en este curso explicamos cómo las usamos y qué ventajas nos aportan.
- Usamos snippets de usuario, y explicamos cómo se crean y cómo los puedes usar.
- Usamos Source Control Management con Git. En este desarrollo vamos a ir haciendo commits a medida que avanzamos con el desarrollo y vamos a ir explicando cómo usamos Git en casos reales.
- Usamos metodología TDD – Test Driven Development. Hay otros cursos en los que explicamos qué es TDD y cómo hacer Testing Automatizado, y en éste curso lo vas a poder ver implementado en un caso real para Business Central.
- Tenemos activado el Code Analyzer.
Lección 1. Repaso del Requisito
Empezamos la primera lección haciendo un repaso al Requisito que nos pidió el cliente.
El objetivo es crear un fichero de tipo Json, viendo también que podemos hacer con él una vez creado.
Del requisito real de nuestro cliente era mucho más largo y lo hemos ajustado para adaptarlo a un curso online.
Ir al vídeo de la lección 1. Repaso del Requisito
Lección 2. Inicializar el Entorno Git y AL
En esta lección vamos a inicializar el entorno tanto en Git como el proyecto AL y vamos a enlazar uno con el otro.
El proyecto Git ya lo tenemos creado en DevOps y ya contiene ficheros. DevOps va actuar como repositorio remoto, mientras que en nuestra máquina vamos a tener una copia local, que vamos a ir sincronizando con el remoto.
Ir al vídeo de la lección 2. Inicializar el Entorno Git y AL
Lección 3. Estructura de un fichero Json
En esta lección vamos a repasar los elementos básicos que conforman un fichero con formato Json.
Todas las estructuras Json se especifican y vienen delimitados por corchetes { }.
Dentro de cada una de las estructuras Json encontraremos siempre un par atributo <-> valor.
El valor asociado a un atributo puede ser de tipo simple (como un string, o un número), o puede ser una sub-estructura json con sus pares de atributos y valores.
El valor asociado a un atributo puede ser único, o puede ser un array de valores: ya sea un array de valores simples, o un array de sub-estructuras json.
Ir al vídeo de la lección 3. Estructura de un fichero Json
Lección 4. Creación de Codeunits y Procedimientos
En esta lección vamos a crear las codeunits y los procedimientos que nos van a servir de base para implementar el desarrollo.
Es muy habitual usar ficheros Json para integraciones a través de WebService, por lo que vamos a empezar creando una codeunit que se llame WebService Methods. En esta codeunit crearemos tantos procedimientos como métodos tengamos que implementar.
Ir al vídeo de la lección 4. Creación de Codeuunits y Procedimientos
Lección 5. Creación de un test Manual
Siempre que hacemos un desarrollo, tenemos que tener una forma de testearlo.
En muchas ocasiones se trata de simplemente realizar las mismas acciones que haría un usuario.
En otras ocasiones, los programadores nos tenemos que crear un entorno de test.
Ir al vídeo de la lección 5. Creación de un test Manual
Lección 6. Ejecutar test manual con PowerShell
En la lección anterior vimos cómo ejecutar el test manual desde el cliente web. Esto nos va muy bien cuando no hay otras personas usando la Base de Datos.
Sin embargo, si hay otros consultores, programadores o usuarios que entran a la Base de Datos, les va a molestar que cada vez que se abre la Lista de Clientes salte nuestro TEST.
Ir al vídeo de la lección 6. Ejecutar test manual con PowerShell
Lección 7. Creación de test automatizado
En esta lección vamos a ir un paso más allá en la ejecución de nuestros test.
No solo queremos que el sistema nos muestre el Json por pantalla, sino que queremos que también nos diga si el Json que se muestra es correcto o no.
Para ello vamos a hacer uso de la funcionalidad de testing que ofrece Business Central, creando una codeunit de test.
Ir al vídeo de la lección 7. Creación de Test Automatizado
Lección 8. Ejecutar el test automatizado
En la lección anterior vimos que podemos usar el Test Tool que encontramos en el cliente web para ejecutar nuestras codeunits de test.
En esta lección vamos a ver cómo podemos ejecutar los test desde Visual Studio Code, a través de PoWerShell, con el cmdlet Invoke-NAVCodeunit.
Para hacer tests, es muy habitual que necesitemos insertar datos. Necesitamos una codeunit de tipo TestRunner para poder indicar qué nivel de aislamiento de datos queremos.
Ir al vídeo de la lección 8. Ejecutar el test automatizado
Lección 9. Crear tabla Sales Invoice Buffer
En este punto ya estamos en disposición de empezar a escribir código para generar nuestra estructura código.
Repasando la definición del Json que tenemos que generar, vemos que hay tres secciones muy diferenciadas, que contienen los siguientes datos:
- Sección Invoices
- Contiene Datos de cabecera.
- En Business Central, los datos los obtendremos de la tabla Sales Invoice Header
- Sección Tax.
- Contiene el desglose de IVA
- En Business Central, los datos los obtendremos o bien de la tabla VAT Entry, o bien de VAT Amount Line.
- Sección Invoice_lines.
- Contiene las líneas de la factura.
- En Business Central los datos los obtendremos de la tabla Sales Invoice Line
Ir al vídeo de la lección 9. Crear tabla Sales Invoice Buffer
Lección 10. Captions en Sales Invoice Buffer
En la lección anterior hemos creado la tabla Sales Invoice Buffer y hemos creado los campos usando la nomenclatura de Business Central.
Por ejemplo, en la definición del Json vemos que al número de la factura le llama serial_number, mientras que en Business Central el dato se guarda en un campo llamado Document No..
Ahora tenemos que vincular cada uno de los campos, con el tag que tendrá que escribir en el fichero Json. Esto lo vamos a hacer mediante la propiedad Caption de los campos.
Ir al vídeo de la lección 10. Captions en Sales Invoice Buffer
Lección 11. Devolver Json vacío si no hay facturas
En esta lección vamos a programar el sistema para que lea los registros almacenados en la tabla Sales Invoice Buffer y escriba los valores en formato Json.
En función de los filtros establecidos, en nuestro caso filtros de fechas, nos podemos encontrar el caso en el que no haya ninguna factura que se deba incluir en el fichero. En esta caso el sistema debe devolver un Json vacío.
Dentro de la tabla Sales Invoice Buffer vamos a crear un procedimiento al que vamos a llamar WriteAllRecToJson.
Ir al vídeo de la lección 11. Devolver Json vacío si no hay fracturas
Lección 12. Devolver JSON con la etiqueta Invoices
En esta lección vamos a insertar un primer registro en la tabla Buffer, y vamos a ampliar el código del procedimiento WriteAllRecToJson.
Lo primero que tenemos que hacer en WriteAllRecToJson es insertar la etiqueta Invoices. Esto lo vamos a hacer con la ayuda del método WriteProperty que encontramos en la codeunit «Json Text Reader/Writer».
Usaremos los métodos WriteStartArray y WriteEndArray para indicar que lo que contiene la etiqueta es una lista de valores.
Ir al vídeo de la lección 12. Devolver Json con la etiqueta Invoices
Lección 13. Quitar carácteres no visibles y espacios
En la lección anterior acabamos ejecutando un test que nos daba error, aunque la estructura Json que devolvía el proceso era equivalente a la estructura Json que estábamos esperando.
El problema es que la Codeunit Assert tiene procedimientos que son capaces de comparar tipos de datos simples (como un texto, un entero, un boolean, etc.), pero no tiene procedimientos que comparen tipos de datos complejos, como sería una estructura Json.
Ir al vídeo de la lección 13. Quitar caracteres no visibles y espacios
Lección 14. Devolver Json con el número de factura
En este punto ya tenemos el número de la factura guardado en la tabla Buffer y ya tenemos la estructura Json preparada para poder introducir este dato.
Para escribir el par tag-valor correspondiente al número de la factura, usaremos el método WriteStringProperty que encontramos en la codeunit «Json Text Reader/Writer».
Ir al vídeo de la lección 14. Devolver JSon con el número de factura
Lección 15. Devolver Json con la fecha de registro
Una de las ventajas de usar testing automatizado es que resulta muy fácil refactorizar el código. A menudo, cuando programamos, empezamos con unos bloques de código relativamente sencillos. Sin embargo a medida que el desarrollo avanza, los bloques de código crecen y siempre llega un punto en el que nos damos cuenta que lo tendríamos que haber diseñado de forma distinta.
Sin tests automatizados, refactorizar es una tarea tediosa, ya que nos obliga a volver a probarlo todo de forma manual. Lamentablemente en muchas ocasiones tomamos la decisión de no refactorizar y seguir adelante con un diseño menos óptimo.
Ir al vídeo de la lección 15. Devolver Json con la fecha de registro