Como restar horas en subformulario respecto del formulario principal

Lo que planteo es lo siguiente:

En el formulario principal tengo un cuadro de texto del tipo HORA y en el subformulario tengo otro igual,.

La idea es que el valor del cuadro texto del subformulario sea dos horas y media menos que el del formulario principal..

Supongo que esto será posible y no muy complicado, pero yo no se hacerlo.

2 respuestas

Respuesta
1

Depende como asigne el tiempo en el subformulario con respecto al formulario principal, es decir, si la hora del principal es la del sistema o es estática etc.

Le dejo este ejemplo:

Observe que al ingresar la hora como 09:30 en el subformulario el nuevo registro tiene por defecto 7:00.

Códdigo del formulario principal

Evento después de actualizar el campo "Hora"

Private Sub ctlHora_AfterUpdate()
  Me.Recalc
End Sub

CÓDIGO EVENTO AL ACTIVAR REGISTRO DEL SUBFORMULARIO

Private Sub Form_Current()
  Me.Recalc
End Sub

En el subformulario en en campo "HORA" propiedades "Datos" tengo :

=Diferencia([Formularios]![frmPrincipalHora]![ctlHora])

Llamo la función Diferencia que me hace la resta.

FUNCIÓN DIFERENCIA

Function Diferencia(mhoras As Date) As Date
    Dim horas As Integer
    Dim minutos As Integer
    ' Convertir la hora en horas y minutos
    horas = Hour(mhoras)
    minutos = Minute(mhoras)
    ' Convertir las horas a minutos, restar 150 minutos y convertir nuevamente a horas
    minutos = horas * 60 + minutos - 150
    horas = Int(minutos / 60)
    minutos = minutos Mod 60
    ' Crear la nueva hora y devolverla como resultado
    Diferencia = TimeSerial(horas, minutos, 0)
End Function

Le aclaro en el campo HORA del subformulario tiene como valor predeterminado

=Diferencia([Formularios]![frmPrincipalHora]![ctlHora])

Le adjunto la imagen

! Cuidado con la respuesta "sobra y basta" no es correcto la fórmula:

Hora -(2.5/24) cuando hora es por ejemplo, 1:05 retorna 1:25 ! Error...!

Reemplacé la función que le enseñé por esta, toda vez, que también calcular mal cuando al restar el tiempo corresponde a un día anterior.

Function Diferencia(mhoras As Date) As Date
    Dim horas As Integer
    Dim minutos As Integer
    ' Convertir la hora en horas y minutos
    horas = Hour(mhoras)
    minutos = Minute(mhoras)
    ' Restar 2 horas y 30 minutos
    minutos = minutos - 30
    horas = horas - 2
    If minutos < 0 Then
        minutos = minutos + 60
        horas = horas - 1
    End If
    If horas < 0 Then
        horas = horas + 24
    End If
    ' Crear la nueva hora y devolverla como resultado
    Diferencia = DateAdd("h", horas, DateAdd("n", minutos, 0))
End Function

Le dejo un ejemplo más completo pasando el tiempo a deducir como parámetro: Estos 2 controles tienen en el evento Después de Actualizar Me. Recalc

En el subformulario en el evento Al activar Registro

Private Sub Form_Current()
  Me.Recalc
End Sub

Llamar la función desde el Subformulario. Valor predeterminado para el campo Hora

FUNCIÓN DIFERENCIA_2

Function Diferencia_2(mhoras As Date, deducir As Date) As Date
 'Función para deducir un tiempo a partir de una hora.
 'Elaborado Por:
 '              Eduardo Pérez Fernández
 'Fecha:        15/04/2023
 'Pasando el tiempo ininicial y el tiempo a deducir como parámetros
  Dim horas As Integer
  Dim minutos As Integer
    ' Convertir la hora en horas y minutos
    horas = Hour(mhoras)
    minutos = Minute(mhoras)
    ' Restar 2 horas y 30 minutos
    minutos = minutos - Minute(deducir)
    horas = horas - Hour(deducir)
    If minutos < 0 Then
        minutos = minutos + 60
        horas = horas - 1
    End If
    If horas < 0 Then
        horas = horas + 24
    End If
    ' Crear la nueva hora y devolverla como resultado
    Diferencia_2 = DateAdd("h", horas, DateAdd("n", minutos, 0))
End Function

José María mientras el partido no inicie antes de las 2:30 a.m le sirve la función que ha tomado para su trabajo, aunque no es lo correcto. El código no se coloca por capricho sino por hacer las cosas al derecho. En fin, el usuario es libre de escoger.

Respuesta
1

José María, no dices cuando debe aparecer la hora del subformulario, si al "escribir" en un nuevo registro del subformulario, si cuando escribas una nueva hora en el formulario, ni sí sólo debe modificar los nuevos registros y no tocar nada de los anteriores, etc. Por eso, si tengo un formulario donde voy a escribir la hora en Triana y un subformulario donde debe aparecer la hora menos 2 horas y media

Cuando pongo el cursor en HoraSevilla( te recuerdo lo de que no sé cuando debe aparecer)

En el caso de que el partido se juegue a otra hora

Cuando pongo el cursor en HoraSevilla

Ten en cuenta que la hora no deja de ser un decimal de día. Por eso no hace falta escribir tanto

En el evento Al recibir el enfoque del cuadro de texto HoraSevilla, que tiene formato de hora corta y máscara de entrada 00:00; le tengo puesto

Private Sub HoraSevilla_GotFocus()
HoraSevilla = Me.Parent!HoraTriana - (2.5 / 24)
End Sub

Y con eso sobra y basta.

¡Gracias!  

Julián, lo has clavado. La hora del formulario principal es la hora de comienzo del partido. y la hora del subformulario es la hora de salida del autobús de la peña con destino al Villamartín. Ósea que es justo lo que necesito sin tener que escribir tantas líneas de código, GRACIAS AMIGO

Julián como puedo hacerlo para que me lo ponga de por defecto . Es decir, en el momento que se introduzca la hora del partido, de forma automática me ponga la hora de salida del Bus.

Joer, si casi vais a tener al Betis en la Champions.

Habría que saber, si quieres que esa hora de salida del autobús te aparezca en todos los registros del subformulario, sólo en un registro nuevo o...

Te lo digo, porque se podría poner como valor predeterminado del cuadro de texto HoraSalida la HoraPartido menos 2 horas y media, pero también se le podría decir, que al escribir algo en el cuadro de texto HoraPartido te actualizara la hora de salida del autobús en todos los registros del subformulario.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas