Desarrollo de Business Central: Codeunits de Instalación, actualización y Upgrade Tags - Business Central

Breaking

domingo, 20 de julio de 2025

Desarrollo de Business Central: Codeunits de Instalación, actualización y Upgrade Tags

Developer

Las codeunits en Business Central, serían lo que otros lenguajes serían clases, es decir, objetos en los que agrupamos procedimientos o funciones que están relacionados.  Dentro de las codeunits más populares serían la 80 Sales-Post o la 90 Purch. -Post.  Son las que gestionan todas los procedimientos del registro de ventas (80) o compras (90), pero tenemos muchas más.  Obviamente, nosotros como desarrolladores, también podemos crearnos nuestras propias codeunits, para agrupar los procedimientos que gestionen nuestras extensiones.


Esas son codeunits "Normales".  Es decir, su uso es agrupar funciones o procedimientos para luego usarlas.  Hoy nos vamos a centrar en otro tipo de codeunits: de Instalación y Actualización.

Propiedad Subtype


Como hemos dicho, las codeunits "normales" son como están marcadas por defecto.  Pero existen otras como las de Test y TestRunner, que son las utilizadas para hacer juegos de test, así como las que vamos a ver hoy las Upgrade o Install.

Esto se define en una propiedad de la Codeunit llamada Subtype



Codeunit de subtype Install

Las codeunit de instalación, se ejecutan cuando una extensión se instala en Business Central.  Habitualmente se utilizan para comprobar la versión, rellenar valores o activar webservices.

Dispones de dos triggers:

OnInstallAppPerCompany(), que se ejecuta para operaciones relativas a las empresas.  Se ejecuta para cada empresa.

OnInstallAppPerDatabase(), que se ejecuta para operaciones relativas a la base de datos.  Solamente se ejecuta una vez.

¿Como controlamos la versión?

Para controlar la versión de una extensión y saber si ya existe o no, utilizamos un tipo de datos que se llama ModuleInfo.  Cada extensión dispone de cierta información que le habitualmente rellenamos en el fichero app.json y que podemos obtener desde AL mediante el comando:

NavApp.GetCurrentModuleInfo(moduleInfo)

 


Un DataVersion 0.0.0.0 significa que es una instalación nueva.  Por tanto, lo que pongamos en ese procedimiento "HandleFreshInstall", será lo que se ejecute cuando no tengamos instalada la extension.

Actualización

Ya tenemos instalada la extensión en Business Central.  Ahora, la actualizamos.  Puede ocurrir que en la nueva versión, tengamos algún dato que debamos cambiar:  Tablas que cambian, datos que se modifican,...

Para ello usamos la codeunit de subtipo: Upgrade 



En este tipo de codeunits, disponemos de más triggers:

OnCheckPreconditionsPerCompany() y OnCheckPreconditionsPerDatabase()

Se utilizan para comprobar requisitos que se deben de cumplir antes de actualizar la versión.

OnUpgradePerCompany() y OnUpgradePerDatabase() 

Se utilizan para realizar la actualización

OnValidateUpgradePerCompany() y OnValidateUpgradePerDatabase()

Desde aquí podemos comprobar si la actualización ha sido ejecutada correctamente.

Upgrade Tags

Además de controlar las versiones mediante ModuleInfo, podemos usar las Upgrade Tags.  En ocasiones, solamente con la versión puede ser un poco complicado.  Por tanto, podemos usar un módulo disponible en System Application para gestionarlas.  Se llama Upgrade Tags que gestiona, entre otros objetos una codeunit 9999 "Upgrade Tag" y una tabla 9999 "Upgrade Tags".

En la codeunit, podemos encontrar unos métodos como:

HasUpgradeTag(Tag;TagCompanyName), que nos permite verificar si un Tag existe en la empresa indicada en TagCompanyName.

SetUpgradeTag(NewTag)  que nos permite guardar un tag.

Como sintaxis para los tags, se recomienda Prefijo de empresa - ID - Descripción - YYYYMMDD.


Como ejemplo de desarrollo podemos usarlas así:


En definitiva, tenemos unas codeunits que vamos a poder usar cuando instalamos nuestras extensiones o bien, cuando las queremos actualizar, que nos van a permitir realizar procesos.

Si quieres verlo en acción, puedes verlo en el siguiente video.

No hay comentarios: