En proyectos de desarrollo y mantenimiento de soluciones en Business Central, es común trabajar en múltiples entornos como desarrollo(SandBox). Para facilitar la identificación rápida del entorno en el que estoy trabajando, es esencial personalizar el indicador de sistema. En este artículo, voy a mostrar cómo implementar una funcionalidad que ajusta automáticamente este indicador en función del entorno sandbox en el que se encuentre la compañía. Esto no solo mejora la claridad visual, sino que también reduce el riesgo de cometer errores al trabajar en diferentes entornos.
¡Vamos manos a la obra! 😮
Configurando el Suscriptor de Eventos
En este caso, he creado una codeunit que actúa como suscriptor de eventos para responder a la limpieza de configuraciones de la compañía. Este es un punto crítico donde puedo inyectar la lógica necesaria para ajustar el indicador de sistema.
codeunit 78000 "Standard Subscriber"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Environment Cleanup", 'OnClearCompanyConfig', '', false, false)]
local procedure OnClearConfiguration(CompanyName: Text; SourceEnv: Enum "Environment Type"; DestinationEnv: Enum "Environment Type")
var
CompanyInformation: Record "Company Information";
EnvironmentInformation: Codeunit "Environment Information";
IsHandled: Boolean;
url: Text;
QALbl: Label 'QA';
UATLbl: Label 'UAT';
DEVLbl: Label 'DEV';
begin
if DestinationEnv = DestinationEnv::Sandbox then begin
url := EnvironmentInformation.GetEnvironmentName();
CompanyInformation.ChangeCompany(CompanyName);
CompanyInformation.get();
OnBeforeCompareNameEnvironmentInformation(url, CompanyInformation, IsHandled);
if IsHandled then
exit;
CompanyInformation."System Indicator" := CompanyInformation."System Indicator"::Custom;
IF STRPOS(url, QALbl) > 0 THEN BEGIN
CompanyInformation."Custom System Indicator Text" := QALbl;
CompanyInformation."System Indicator Style" := CompanyInformation."System Indicator Style"::Accent4;
END else
IF STRPOS(url, DEVLbl) > 0 THEN BEGIN
CompanyInformation."Custom System Indicator Text" := DEVLbl;
CompanyInformation."System Indicator Style" := CompanyInformation."System Indicator Style"::Accent2;
END ELSE begin
CompanyInformation."Custom System Indicator Text" := UATLbl;
CompanyInformation."System Indicator Style" := CompanyInformation."System Indicator Style"::Accent6;
end;
OnBeforeModifyCompanyInformation(CompanyInformation);
CompanyInformation.Modify(TRUE);
end;
end;
Aquí se define una codeunit llamada Standard Subscriber
con el ID 78000
, que contiene el procedimiento OnClearConfiguration
. Este procedimiento se suscribe al evento OnClearCompanyConfig
del codeunit Environment Cleanup
. Cada vez que se ejecuta este evento, el procedimiento revisa si la compañía actual está en un entorno de tipo Sandbox
. Si es así, se realiza una serie de operaciones para ajustar el indicador de sistema.
Descripción Detallada del Código
Variables Definidas
El procedimiento OnClearConfiguration
utiliza varias variables, cada una con un propósito específico:
- CompanyInformation: Es un registro que contiene la información de la compañía, y se usa para acceder y modificar detalles como el indicador de sistema.
- EnvironmentInformation: Es una codeunit que proporciona información sobre el entorno actual, como el nombre del entorno.
- IsHandled: Es un booleano utilizado para controlar si la ejecución del código debe continuar o no, permitiendo la interrupción del flujo si otro evento ha manejado la lógica necesaria.
- url: Almacena el nombre del entorno actual, obtenido a través de
EnvironmentInformation
. - QALbl, UATLbl, DEVLbl: Son etiquetas (
Label
) que almacenan los textos ‘QA’, ‘UAT’, y ‘DEV’ respectivamente, utilizados para comparar y establecer el texto del indicador de sistema.
Verificación del Entorno
El primer paso dentro del procedimiento es verificar si el entorno de destino (DestinationEnv
) es un sandbox:
if DestinationEnv = DestinationEnv::Sandbox then begin
Si la condición se cumple, el procedimiento continúa; de lo contrario, finaliza sin hacer cambios. Esto asegura que la personalización del indicador solo se aplique en entornos de prueba.
Cambio de Compañía y Obtención de Datos
El siguiente paso es obtener el nombre del entorno actual y cambiar el contexto de la compañía:
url := EnvironmentInformation.GetEnvironmentName();
CompanyInformation.ChangeCompany(CompanyName);
CompanyInformation.get();
- GetEnvironmentName(): Este método obtiene el nombre del entorno actual (por ejemplo, ‘QA’, ‘DEV’, ‘UAT’), lo que permite identificar en qué entorno se está operando.
- ChangeCompany(CompanyName): Cambia el contexto para trabajar con la compañía especificada.
- CompanyInformation.get(): Obtiene los datos actuales de la compañía para que puedan ser modificados.
Eventos de Extensibilidad
Antes de continuar con la modificación de los datos de la compañía, se invocan dos eventos de integración:
OnBeforeCompareNameEnvironmentInformation(url, CompanyInformation, IsHandled);
if IsHandled then
exit;
- OnBeforeCompareNameEnvironmentInformation: Permite intervenir antes de comparar el nombre del entorno. Si el evento maneja la operación (
IsHandled
= true), se abandona el procedimiento, evitando modificaciones posteriores.
Personalización del Indicador de Sistema
Si ningún otro evento ha manejado el proceso, se procede a personalizar el indicador de sistema:
CompanyInformation."System Indicator" := CompanyInformation."System Indicator"::Custom;
Esto establece el indicador de sistema en modo Custom
, lo que permite asignar texto y estilos específicos.
Dependiendo del entorno detectado en la URL, se ajustan el texto y el estilo del indicador:
IF STRPOS(url, QALbl) > 0 THEN BEGIN
CompanyInformation."Custom System Indicator Text" := QALbl;
CompanyInformation."System Indicator Style" := CompanyInformation."System Indicator Style"::Accent4;
END else
IF STRPOS(url, DEVLbl) > 0 THEN BEGIN
CompanyInformation."Custom System Indicator Text" := DEVLbl;
CompanyInformation."System Indicator Style" := CompanyInformation."System Indicator Style"::Accent2;
END ELSE begin
CompanyInformation."Custom System Indicator Text" := UATLbl;
CompanyInformation."System Indicator Style" := CompanyInformation."System Indicator Style"::Accent6;
end;
- STRPOS(url, QALbl): Busca en la URL la presencia del texto
QA
,DEV
, oUAT
. Según el entorno encontrado: - Se asigna el texto
QA
,DEV
, oUAT
al indicador de sistema. - Se selecciona un estilo de indicador (
Accent4
,Accent2
,Accent6
).
Modificación y Guardado de Datos
Finalmente, después de ajustar el texto y el estilo, se invoca otro evento de integración para permitir más modificaciones si es necesario:
OnBeforeModifyCompanyInformation(CompanyInformation);
Después de cualquier posible modificación adicional, se guarda la información de la compañía:
CompanyInformation.Modify(TRUE);
Esto asegura que todos los cambios se registren en la base de datos.
Eventos de Integración
El código también incluye dos eventos de integración adicionales, que permiten una mayor personalización y extensibilidad:
[IntegrationEvent(false, false)]
local procedure OnBeforeCompareNameEnvironmentInformation(var url: text; CompanyInformation: Record "Company Information"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeModifyCompanyInformation(CompanyInformation: Record "Company Information")
begin
end;
Estos eventos ofrecen puntos de inserción donde puedo agregar o modificar la lógica, sin alterar el flujo principal del código.
Beneficios y Aplicaciones Prácticas
Este código es especialmente útil en escenarios donde hay múltiples entornos de prueba y desarrollo. Automatizar la personalización del indicador de sistema no solo mejora la experiencia del usuario, sino que también ayuda a evitar confusiones y posibles errores, como aplicar cambios en un entorno equivocado. Implementar esta solución en un entorno de Business Central asegura una mayor seguridad y claridad operativa.
Conclusión
Personalizar el indicador de sistema en función del entorno es una práctica recomendada para cualquier desarrollador de Business Central que maneje múltiples entornos. No solo facilita la identificación rápida del entorno, sino que también reduce el riesgo de errores. Implementar esta funcionalidad es sencillo y ofrece un gran valor en la gestión diaria de proyectos.
Si quieres ver el código completo, está en GitHub.
¡Hasta la próxima! 😊