A lo largo de mis desarrollos en Navision, me he encontrado con la necesidad de crear funciones que simplifiquen tareas rutinarias, como la limpieza de texto, la gestión de directorios o el cálculo de diferencias horarias. Esta colección de utilidades reúne esas herramientas que uso frecuentemente, y que me permiten optimizar y agilizar mi trabajo. Con estas funciones, puedes automatizar procesos y mejorar la eficiencia de tu sistema Navision, aplicando soluciones prácticas a problemas comunes.
A continuación, te muestro un conjunto de funciones en AL que abordan estas necesidades, proporcionándome herramientas que puedo aplicar directamente en mis proyectos de Navision.
¡Vamos manos a la obra! 😊
1. Un salto de línea personalizado: ¡Crea tu propio “Enter”!
PROCEDURE SaltoDeLinea@1000000011() ReturnValue : Text;
VAR
Char13@1000000000 : Char;
Char10@1000000001 : Char;
BEGIN
Char13 := 13;
Char10 := 10;
ReturnValue := FORMAT(Char13) + FORMAT(Char10);
END;
Esta función, SaltoDeLinea
, permite crear saltos de línea personalizados utilizando los caracteres ASCII 13 (retorno de carro) y 10 (salto de línea). Es útil cuando quiero controlar el formato del texto, especialmente en la generación de archivos o informes. En lugar de depender de los saltos de línea predeterminados, esta función me permite generar manualmente el salto que necesito.
2. Limpieza de texto: Eliminando letras no deseadas
PROCEDURE EliminarLetrasTexto@1000000001(txt@1000000000 : Text) : Text;
BEGIN
txt := DELCHR(txt,'=','A');
txt := DELCHR(txt,'=','B');
txt := DELCHR(txt,'=','C');
...
txt := DELCHR(txt,'=','�');
txt := DELCHR(txt,'=','�');
EXIT(txt);
END;
EliminarLetrasTexto
es una función poderosa que recorre una cadena de texto y elimina todas las letras, tanto mayúsculas como minúsculas, e incluso algunos caracteres especiales como la ‘ñ’. Esto resulta útil cuando trabajo con datos que deberían contener solo números o símbolos y necesito limpiar cualquier letra accidental que pueda haberse introducido.
3. Eliminando guiones innecesarios
PROCEDURE EliminarGuion@1000000007(txt@1000000000 : Text) : Text;
BEGIN
txt := DELCHR(txt,'=','-');
EXIT(txt);
END;
Si alguna vez he tenido que procesar textos que contienen guiones innecesarios, EliminarGuion
es la función adecuada. Al eliminar cualquier guion del texto, aseguro que el dato quede limpio y listo para su uso, por ejemplo, en códigos o identificadores que no deberían contener ese carácter.
4. Eliminar saltos de línea: Deja el texto limpio y continuo
PROCEDURE DeleteSaltoDeLinea@1000000015(Value@1000000000 : Text) : Text;
VAR
Char13@1000000003 : Char;
Char10@1000000002 : Char;
SaltoLinea@1000000001 : Text;
txt@1000000004 : Text;
BEGIN
Char13 := 13;
Char10 := 10;
SaltoLinea := FORMAT(Char13) + FORMAT(Char10);
txt := CONVERTSTR(Value, SaltoLinea, ' ');
EXIT(txt);
END;
En situaciones donde necesito eliminar los saltos de línea de un texto y dejarlo en una sola línea, la función DeleteSaltoDeLinea
hace justamente eso. Al detectar los caracteres de salto de línea (ASCII 13 y 10), los convierte en espacios dobles para que el texto permanezca limpio y continuo. Esta función es muy útil en informes o al procesar datos exportados donde los saltos de línea pueden interferir.
5. Creación de directorios: Automatizando la gestión de carpetas
PROCEDURE CreateDirectory@1000000012(Path@1000000000 : Text) : Boolean;
VAR
Directory@1000000001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.Directory";
BEGIN
CLEAR(Directory);
IF Directory.Exists(Path) THEN
EXIT(FALSE);
Directory.CreateDirectory(Path);
EXIT(TRUE);
END;
La función CreateDirectory
es especialmente útil cuando necesito crear directorios automáticamente en el sistema desde Navision. Verifica primero si el directorio ya existe y, si no, lo crea. Este tipo de automatización es ideal cuando trabajo con archivos y necesito asegurarme de que los directorios requeridos estén presentes sin intervención manual.
6. Cálculo de diferencias horarias: Midiendo tiempos entre eventos
PROCEDURE DiferenciaEntreTimes@1000000014(Time1@1000000000 : Time; Time2@1000000001 : Time) ReturnTime : Time;
VAR
Diferencia@1000000002 : Decimal;
BEGIN
Diferencia := Time2 - Time1;
ReturnTime := 000000T;
Diferencia := Diferencia / 1000; // lo convierto a segundos
ReturnTime := ReturnTime + (Diferencia MOD 60) * 1000; // obtengo los segundos
Diferencia := Diferencia DIV 60; // mantengo los minutos
ReturnTime := ReturnTime + (Diferencia MOD 60) * 1000 * 60; // obtengo los minutos
Diferencia := Diferencia DIV 60; // mantengo las horas
ReturnTime := ReturnTime + (Diferencia MOD 60) * 1000 * 60 * 60; // obtengo las horas
END;
La función DiferenciaEntreTimes
permite calcular la diferencia entre dos horas. Convierte la diferencia de tiempos en segundos, luego la traduce en minutos y horas, devolviendo un valor en formato Time
. Esta función es útil cuando necesito medir el tiempo transcurrido entre dos eventos, como procesos de negocio que requieren un seguimiento preciso de los tiempos de ejecución.
7. Eliminar barras y guiones: Deja el texto limpio y uniforme
PROCEDURE EliminarBarraYGuion@1000000017(txt@1000000000 : Text) : Text;
BEGIN
txt := DELCHR(txt,'=','-');
txt := DELCHR(txt,'=','/');
EXIT(txt);
END;
Esta función EliminarBarraYGuion
elimina tanto guiones como barras inclinadas de un texto. Es útil cuando necesito limpiar datos que podrían contener estos caracteres, como códigos o identificadores, asegurando que queden en un formato más homogéneo y fácil de manejar.
8. Verificando si estás en la base de datos correcta
PROCEDURE DeterminarSiEstasEnBBDDReal@1000000002(BBDDReal@1000000002 : Text) : Boolean;
VAR
Session@1000000000 : Record 2000000009;
BEGIN
// Busco la sesión del usuario actual
Session.RESET;
Session.SETRANGE("User ID", USERID);
Session.FINDFIRST;
// Valido la BBDD de la sesión actual.
IF Session."Database Name" = BBDDReal THEN
EXIT(TRUE);
EXIT(FALSE);
END;
En ambientes donde manejo múltiples bases de datos, es crucial asegurarse de que estoy trabajando en la correcta. DeterminarSiEstasEnBBDDReal
compara la base de datos en la que me encuentro con la que especifico como parámetro. Si coinciden, la función devuelve TRUE
, indicándome que estoy en la base de datos correcta. Esto es especialmente útil cuando trabajo con entornos de desarrollo, test y producción, evitando errores potenciales.
Beneficios y aplicaciones prácticas:
Este conjunto de funciones tiene múltiples aplicaciones en un entorno real de Navision. Ya sea para limpiar datos, gestionar directorios o realizar cálculos de tiempos, puedo implementar estas utilidades para optimizar procesos y evitar errores. Además, al crear funciones reutilizables, facilito el mantenimiento y la escalabilidad de los desarrollos.
Conclusión:
Las funciones en AL para Navision que te he mostrado son una excelente herramienta para optimizar tareas repetitivas en el sistema. Desde la limpieza de texto hasta la gestión automatizada de directorios y el cálculo de diferencias horarias, estas utilidades te permiten mejorar la eficiencia de tus desarrollos y trabajar de manera más precisa.
Si quieres ver el código completo, está en GitHub.
Espero que estas funciones te resulten útiles en tu día a día con Navision. ¡Hasta la próxima! 😊