Hola a todos:
Algunas veces necesitamos obtener la diferencia exacta entre horas, minutos y segundos. Y en Power Apps también.
No es algo sencillo obtener esta información, ni tampoco algo que se pueda hacer únicamente con Power Fx ya que lo podemos lograr también con Power Automate. Pero en este caso se trata de obtener la información exclusivamente con Apps.
¡Cómo hecho de menos las funciones SiFecha() de Excel en otro tipo de lenguajes!. pero a grandes males, grandes remedios. Voy a crear un ejemplo:
En el primer botón, hora de inicio colocaremos este código:
Set(FechaInicio; Text(Now(); "[$-es-ES]dd/mm/yyyy"));;
Set(HoraInicio; Text(Now(); "HH:mm:ss"));;
En el segundo botón, colocaremos este código:
Set(FechaFin; Text(Now(); "[$-es-ES]dd/mm/yyyy"));;
Set(HoraFin; Text(Now(); "HH:mm:ss"));;
Una vez que tenemos los datos de hora de inicio y fin, ya podemos trabajar en nuestro código. Y para ello vamos a colocar esto:
// Verificar si alguno de los campos está vacío o en blanco
If(
IsBlank(HoraInicio) || IsBlank(HoraFin) || IsBlank(FechaInicio) || IsBlank(FechaFin);
Notify("Todos los campos (hora de inicio, hora final, fecha de inicio y fecha de fin) deben tener datos."; NotificationType.Error);;
Blank();;
;
// Si todos los campos están llenos, continuar con los cálculos
// Convertimos HoraInicio y HoraFin a segundos
Set(InicioSegundos;
Value(Left(HoraInicio; 2)) * 3600 +
Value(Mid(HoraInicio; 4; 2)) * 60 +
Value(Right(HoraInicio; 2))
);;
Set(FinalSegundos;
Value(Left(HoraFin; 2)) * 3600 +
Value(Mid(HoraFin; 4; 2)) * 60 +
Value(Right(HoraFin; 2))
);;
// Convertimos las fechas a formato fecha para comparar
Set(FechaInicioDate; DateValue(FechaInicio));;
Set(FechaFinDate; DateValue(FechaFin));;
// Calculamos el número de días de diferencia
Set(DiasDiferencia; DateDiff(FechaInicioDate; FechaFinDate));;
// Verificamos si la fecha y hora de inicio es superior a la de fin
If(
FechaInicioDate > FechaFinDate || (FechaInicioDate = FechaFinDate && InicioSegundos > FinalSegundos);
Notify("La fecha y hora de inicio no puede ser superior a la fecha y hora de fin."; NotificationType.Error);;
Blank();; // No hacer nada si la condición es falsa
;
// Si es correcto, calculamos la diferencia en segundos
If(
DiasDiferencia = 0;
Set(DiferenciaSegundos; FinalSegundos - InicioSegundos);; // Mismo día
;
// Controlamos cálculo entre días
Set(DiferenciaSegundos; (86400 - InicioSegundos) + FinalSegundos + (DiasDiferencia - 1) * 86400);;
);;
// Convertimos a horas, minutos y segundos
Set(DiferenciaHoras; Int(DiferenciaSegundos / 3600));;
Set(DiferenciaMinutos; Int(Mod(DiferenciaSegundos; 3600) / 60));;
Set(DiferenciaSegundosRestantes; Mod(DiferenciaSegundos; 60));;
);;
);;
En cada línea de código podéis ver qué es lo que se hace en cada momento. Y solo tenemos que colocar en cada label la variable que queremos mostrar:
HoraInicio, HoraFin para mostrar las horas y las fechas, que son únicamente orientativas y para crear una condición que nos permita comprobar que la fecha de inicio no es superior a la de fin.
Para mostrar la diferencia de horas utilizaremos esto:
// Diferencia en horas minutos y segundos
Text(DiferenciaHoras; "[$-es-ES]00") & ":" &
Text(DiferenciaMinutos; "[$-es-ES]00") & ":" &
Text(DiferenciaSegundosRestantes; "[$-es-ES]00")
Con el resto de botones vamos a resetear y borrar los datos:
Set(HoraInicio;Blank());;
Set(FechaInicio;Blank());;
Set(HoraFin;Blank());;
Set(FechaFin;Blank());;
Set(DiferenciaHoras;Blank());;
Set(DiferenciaMinutos;Blank());;
Set(DiferenciaSegundosRestantes;Blank());;
Creo que esto puede ser muy útil para vuestros proyectos, espero que sea de interés.