Uno de sus aspectos más útiles de Navision es la capacidad de personalizar la funcionalidad para ajustarse a necesidades específicas. En esta ocasión, voy a explorar una unidad de código que permite calcular días laborables, considerando diferentes fuentes como la empresa, clientes, proveedores, agentes de envío, ubicaciones y servicios. Esta personalización es crucial para asegurar que las operaciones diarias se ajusten a los horarios y días laborales específicos de cada entidad, evitando posibles inconvenientes y optimizando la planificación de tareas.
Calcular los días laborables de manera precisa es fundamental en el entorno empresarial. Permite organizar entregas, recepciones de mercancías y servicios, asegurando que todas las actividades se realicen en días hábiles, evitando así demoras y mejorando la eficiencia operativa. Esta unidad de código es especialmente útil en empresas con operaciones complejas, donde diferentes departamentos y socios comerciales pueden tener distintos días no laborables.
¡Vamos manos a la obra! 🎉
Definiendo Variables y Procedimientos
El código comienza definiendo una serie de variables y procedimientos que serán utilizados para calcular los días laborables. Las variables incluyen la unidad de gestión del calendario (CalendarManagement
), que maneja las operaciones relacionadas con los calendarios, y un registro para los cambios personalizados del calendario (CustomizedCalendarChange
). Además, se definen caracteres para el retorno de carro (CR
) y el salto de línea (LF
), así como una variable de texto (SaltoLinea
) para formatear mensajes con saltos de línea.
Procedimiento SiguienteDiaCompany
Este procedimiento calcula el siguiente día laborable para la empresa. Utiliza la función CalcDateBOC
de la unidad de gestión del calendario. Los parámetros incluyen la fecha inicial, el número de días a sumar y el tipo de fuente, que en este caso es “Company”. Si no se encuentra un calendario específico, se utiliza el calendario de la empresa por defecto. Este procedimiento es útil para obtener fechas laborales que consideren los días no laborables configurados a nivel de empresa, evitando así operaciones en días festivos o fines de semana.
PROCEDURE SiguienteDiaCompany@1000000001(FechaInicial@1000000000 : Date;NumeroDias@1000000001 : Integer) ReturnDate : Date;
BEGIN
ReturnDate := CalendarManagement.CalcDateBOC( FORMAT(NumeroDias)+'D',
FechaInicial,
CustomizedCalendarChange."Source Type"::Company,
'',
'',
CustomizedCalendarChange."Source Type"::Company,
'',
'',
TRUE);
END;
Procedimiento SiguienteDiaCustomer
Este procedimiento es similar al anterior, pero calcula el siguiente día laborable para un cliente específico. Además de la fecha inicial y el número de días, se pasa el código del cliente (NumCliente
). Esto permite ajustar las fechas de entrega o servicio a los días laborables específicos del cliente, mejorando la planificación y evitando inconvenientes relacionados con entregas en días no laborables para el cliente.
PROCEDURE SiguienteDiaCustomer@1000000008(FechaInicial@1000000000 : Date;NumeroDias@1000000001 : Integer;NumCliente@1000000002 : Code[20]) ReturnDate : Date;
BEGIN
ReturnDate := CalendarManagement.CalcDateBOC( FORMAT(NumeroDias)+'D',
FechaInicial,
CustomizedCalendarChange."Source Type"::Customer,
NumCliente,
'',
CustomizedCalendarChange."Source Type"::Customer,
NumCliente,
'',
TRUE);
END;
Procedimiento SiguienteDiaVendor
De igual manera, este procedimiento calcula el siguiente día laborable para un proveedor específico. Incluye el código del proveedor (NumProveedor
). Es útil para coordinar recepciones de mercancía, asegurando que los pedidos se programen en días laborables para el proveedor y evitando así posibles problemas logísticos.
PROCEDURE SiguienteDiaVendor@1000000009(FechaInicial@1000000000 : Date;NumeroDias@1000000001 : Integer;NumProveedor@1000000002 : Code[20]) ReturnDate : Date;
BEGIN
ReturnDate := CalendarManagement.CalcDateBOC( FORMAT(NumeroDias)+'D',
FechaInicial,
CustomizedCalendarChange."Source Type"::Vendor,
NumProveedor,
'',
CustomizedCalendarChange."Source Type"::Vendor,
NumProveedor,
'',
TRUE);
END;
Procedimiento SiguienteDiaShippingAgent
Este procedimiento se utiliza para calcular el siguiente día laborable para un agente de envío específico, incluyendo el código de servicio del agente de envío. Además de la fecha inicial y el número de días, se pasan el código del agente de envío (ShippingAgentCode
) y el código del servicio (ShippingAgentServiceCode
). Este cálculo es esencial para programar envíos considerando los días laborables del agente de envío, optimizando las rutas y los tiempos de entrega.
PROCEDURE SiguienteDiaShippingAgent@1000000010(FechaInicial@1000000000 : Date;NumeroDias@1000000001 : Integer;ShippingAgentCode@1000000002 : Code[20];ShippingAgentServiceCode@1000000003 : Code[20]) ReturnDate : Date;
BEGIN
ReturnDate := CalendarManagement.CalcDateBOC( FORMAT(NumeroDias)+'D',
FechaInicial,
CustomizedCalendarChange."Source Type"::"Shipping Agent",
ShippingAgentCode,
ShippingAgentServiceCode,
CustomizedCalendarChange."Source Type"::"Shipping Agent",
ShippingAgentCode,
ShippingAgentServiceCode,
TRUE);
END;
Procedimiento SiguienteDiaLocation
Calcula el siguiente día laborable para una ubicación específica, utilizando el código de almacén (CodAlmacen
). Este procedimiento es crucial para la gestión de inventarios y operaciones logísticas internas, asegurando que las actividades se realicen en días hábiles para la ubicación en cuestión.
PROCEDURE SiguienteDiaLocation@1000000011(FechaInicial@1000000000 : Date;NumeroDias@1000000001 : Integer;CodAlmacen@1000000002 : Code[20]) ReturnDate : Date;
BEGIN
ReturnDate := CalendarManagement.CalcDateBOC( FORMAT(NumeroDias)+'D',
FechaInicial,
CustomizedCalendarChange."Source Type"::Location,
CodAlmacen,
'',
CustomizedCalendarChange."Source Type"::Location,
CodAlmacen,
'',
TRUE);
END;
Procedimiento SiguienteDiaService
Por último, este procedimiento calcula el siguiente día laborable para un servicio específico, sin necesidad de un código adicional. Este procedimiento es útil para programar servicios y tareas internas, asegurando que se lleven a cabo en días laborables, evitando así interrupciones o conflictos con días no laborables.
PROCEDURE SiguienteDiaService@1000000012(FechaInicial@1000000000 : Date;NumeroDias@1000000001 : Integer) ReturnDate : Date;
BEGIN
ReturnDate := CalendarManagement.CalcDateBOC( FORMAT(NumeroDias)+'D',
FechaInicial,
CustomizedCalendarChange."Source Type"::Service,
'',
'',
CustomizedCalendarChange."Source Type"::Service,
'',
'',
TRUE);
END;
Beneficios y Aplicaciones Prácticas
Este código es especialmente útil para empresas que necesitan calcular fechas considerando días no laborables específicos para diferentes entidades. Por ejemplo, al planificar entregas a clientes o proveedores, es fundamental tener en cuenta sus días laborables para evitar errores y retrasos. La capacidad de ajustar las fechas automáticamente según el calendario de la entidad correspondiente mejora la eficiencia y precisión en la gestión de operaciones diarias. Además, al integrar esta funcionalidad en Navision, se puede asegurar que todas las áreas de la empresa, desde la logística hasta el servicio al cliente, operen de manera sincronizada y eficiente.
Conclusión
El código presentado es una herramienta valiosa para cualquier empresa que utilice Navision y necesite gestionar calendarios específicos para distintas entidades. Al personalizar la funcionalidad de días laborables, se mejora la precisión y eficiencia de las operaciones diarias.
Si quieres ver el código completo, está en GitHub.
Espero que este post te haya sido útil y te animes a implementar esta funcionalidad en tus proyectos de Navision. ¡Hasta la próxima!