Calcular llegada temprana o tardía

Tengo un problema en calculo con fechas y espero me ayude.

Resulta que tengo una BD con una tabla que tiene un campo cuyo valor esta en formato hora hh:nn:ss y corresponde al tiempo de llegada tempano o tardío de un personal (sean hora, minuto o segundo). Bien el valor de este campo se calcula con la diferencia de dos campos mas que son HoraFijada y hora_ingreso. HoraFijada por ejemplo es la hora en la que tiene que entrar o salir un personal, y la hora_ingreso es la hora en la que marcó su ingreso o salida dicho personal. El problema surge cuando quiero calcular la diferencia de horas ya que el valor de hora_ingreso me trae el día y la hora. Por ejemplo así debería ser:

TipoMovim HoraFijada hora_ingreso llegada_tardia

Entrada 07:00:00 06:45:20 00:00:00 (si entro a tiempo)

Salida 18:00:00 18:01:00 00:00:00 (si salio en tiempo)

Entrada 07:00:00 07:08:00 00:08:00 (si entro tarde)

Salida 18:00:00 17:55:00 00:05:00 (si salio antes de tiempo)

Pero me trae así:

Entrada 07:00:00 06:45:20 23:45:20 (si entro a tiempo)
Salida 18:00:00 18:01:00 00:01:00 (si salio en tiempo)
Entrada 07:00:00 07:08:00 00:08:00 (si entro tarde)

Salida 18:00:00 17:55:00 23:55:00 (si salio antes de tiempo)

¿Cómo puedo hacer para conseguir tener estos datos?

1 respuesta

Respuesta
2

Te subo un archivo con dos formas de hacerlo, a ver si te sirven:

http://www.filebig.net/files/kTd7kre3Zf

La primera es a través de una consulta (tabla T-anguyapy(1) y consulta C-anguyapy), donde la tabla tiene los campos TipoMovim, HoraFijada y hora_ingreso, y la consulta esos mismos, más el campo calculado llegada_tardia, a través de esta fórmula:

CFecha(SiInm([TipoMov]="Entrada";SiInm([HoraFijada]<[hora_ingreso];Format([hora_ingreso]-[HoraFijada];"hh:nn:ss");"00:00:00");SiInm([HoraFijada]>[hora_ingreso];Format([HoraFijada]-[hora_ingreso];"hh:nn:ss");"00:00:00")))

Es decir, que si :

El tipo de movimiento es Entrada y la HoraFijada es menor que hora_ingreso, pone la diferencia (el trabajador entró con retraso)

El tipo de movimiento es Entrada y la HoraFijada es mayor que hora_ingreso, pone 00:00:00 (entró bien)

El tipo de movimiento es Salida y la HoraFijada es mayor que hora_ingreso, pone la diferencia (el trabajador salió antes de tiempo)

El tipo de movimiento es Saliday la HoraFijada es menor que hora_ingreso, pone 00:00:00 (salió bien)

La segunda forma (tabla T-anguyapy(2) y formulario F-anguyapy(2)) es a través de código vba en el formulario. La tabla tiene los 4 campos, lo mismo que el formulario. Lo destacable del formulario, es que el campo llegada_tardía está bloqueado (propiedades-> pestaña Datos-> Bloqueado: Sí). Además en el evento después de actualizar del campo hora_ingreso, le generé este código (la fórmula es la misma, pero en lenguaje vba):

Private Sub hora_ingreso_AfterUpdate()
Dim miHoraIng As Variant
miHoraIng = Me.hora_ingreso
If IsNull(miHoraIng) Then Exit Sub
Me.llegada_tardia = CDate(IIf(Me.TipoMov = "Entrada", _
IIf(Me.HoraFijada < Me.hora_ingreso, _
Format(Me.hora_ingreso - Me.HoraFijada, "hh:nn:ss"), _
"00:00:00"), _
IIf(Me.HoraFijada > Me.hora_ingreso, _
Format(Me.HoraFijada - Me.hora_ingreso, "hh:nn:ss"), _
"00:00:00")))
End Sub

Para poner el código, abre en vista diseño el formulario, saca sus propiedades, vete a la pestaña eventos, y el Después de actualizar, le das al botón con los 3 puntos que aparece a la derecha, y generar código en el cuadro que te sale. Se te abre el editor de vba y ahí lo pones.

Muchísimas gracias Sveinbjorn, me ha servido bastante tu ayuda, he aplicado el primer método que es a través de la consulta y resultó fantástica. Una vez más Muchas Gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas