Esta es la décima entrega de la serie sobre utilidades para Business Central. En esta ocasión, comparto dos funciones que permiten manipular variables de tipo Time
: una para redondear a intervalos definidos y otra para calcular diferencias entre dos momentos. Ambas resultan muy útiles en tareas de control horario, registros de actividad o planificación de recursos.
¡Vamos manos a la obra! 😱
⏱ Redondeo personalizado con RoundTimeToNearestMinutes
procedure RoundTimeToNearestMinutes(InputTime: Time; MinutesRound: Integer) ReturnValue: Time
var
TotalMinutes: Integer;
Remainder: Integer;
RoundedMinutes: Integer;
Time0: Time;
begin
Time0 := 000000T;
ReturnValue := InputTime;
if InputTime = Time0 then
exit;
// Convertir de Time a minutos desde la medianoche usando Duration
TotalMinutes := (InputTime - Time0) div (60 * 1000);
// Calcular el residuo al dividir por MinutosRound
Remainder := TotalMinutes mod MinutesRound;
// Redondear al múltiplo más cercano de MinutosRound
if Remainder < (MinutesRound / 2) then
RoundedMinutes := TotalMinutes - Remainder
else
RoundedMinutes := TotalMinutes + (MinutesRound - Remainder);
// Convertir minutos de vuelta a Time sumando desde 00:00:00 (0T)
ReturnValue := Time0 + (RoundedMinutes * 60 * 1000);
end;
¿Qué hace esta función?
RoundTimeToNearestMinutes
redondea una hora (Time
) al múltiplo de minutos más cercano que se le indique. Es especialmente útil cuando se trabaja con franjas horarias fijas, como turnos de trabajo, reservas o citas.
Paso a paso:
- Inicio y validación: Si el tiempo es 00:00:00, sale directamente.
- Conversión a minutos: Se calcula cuántos minutos han pasado desde la medianoche.
- Cálculo del redondeo: Se obtiene el resto de dividir esos minutos entre el valor de redondeo.
- Ajuste hacia arriba o abajo: Según si el resto es menor o mayor a la mitad del intervalo.
- Reconversión a
Time
: Finalmente, se convierte el valor redondeado de vuelta a un tipoTime
.
Ejemplo práctico:
Supongamos que tienes la hora 10:07
y quieres redondear a bloques de 15 minutos:
10:07
→ 607 minutos desde las 00:00.- 607 mod 15 = 7 → como 7 < 7.5, redondea a 600.
- Resultado:
10:00
.
🔄 Diferencia entre horas con SubtractTwoTimes
procedure SubtractTwoTimes(Time1: Time; Time2: Time) ReturnValue: Time
var
ValueTime: Time;
ValueDecimal: Decimal;
begin
ValueTime := 000000T;
ValueDecimal := Time2 - Time1;
// lo convierto a segundos
ValueDecimal := ValueDecimal / 1000;
ValueTime := ValueTime + (ValueDecimal mod 60) * 1000;
// lo convierto a minutos
ValueDecimal := ValueDecimal div 60;
ValueTime := ValueTime + (ValueDecimal mod 60) * 1000 * 60;
// lo convierto a horas
ValueDecimal := ValueDecimal div 60;
ReturnValue := ValueTime + (ValueDecimal mod 60) * 1000 * 60 * 60;
end;
¿Y esta otra?
SubtractTwoTimes
calcula la diferencia entre dos tiempos (Time1
y Time2
) y devuelve otro valor Time
que representa esa duración.
¿Cómo lo hace?
- Resta inicial: Se obtiene la diferencia directa entre los dos tiempos en milisegundos.
- Conversión en cadena: Se transforma ese valor decimal en:
- Segundos
- Minutos
- Horas
- Reconstrucción del resultado: Se crea un nuevo valor
Time
con esas tres partes.
Este tipo de función es perfecta para mostrar de forma visual cuánto tiempo ha transcurrido entre dos eventos. No usa el tipo Duration
, por lo que el formato es fácilmente interpretable como una hora del día.
Ten en cuenta:
- No se gestiona si
Time2
es menor queTime1
; en ese caso, podría haber un resultado no deseado. - Para lógica más flexible, podrías combinar esto con
Duration
.
💡 Beneficios y aplicaciones prácticas
Estas dos funciones te serán especialmente útiles en:
- Sistemas de control de fichajes.
- Redondeo automático de entradas o salidas en bloques definidos.
- Cálculo de duraciones entre tareas, procesos o eventos.
- Informes de planificación o productividad horaria.
Ambas funciones están escritas en AL puro, sin dependencias externas, lo que las hace ideales para copiar y pegar directamente en cualquier proyecto.
Conclusión
En esta décima entrega de la serie Utils, explico cómo manejar variables de tipo Time
en AL con dos funciones prácticas: una para redondear horarios y otra para calcular diferencias. Ambas mejoran el control del tiempo en Business Central y facilitan el trabajo con datos horarios en escenarios reales.
Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.
Si quieres ver el código completo, está en GitHub.
¡Nos vemos en la próxima!