Simplificando tareas comunes en Navision: Herramientas prácticas para el día a día

En este post, presento una colección de funciones útiles que he desarrollado y utilizado repetidamente en Navision, simplificando tareas comunes y optimizando procesos.

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! 😊

Share your love

Leave a Reply

Your email address will not be published. Required fields are marked *