Como comparar el campo hora almacenada en una Tabla con la fecha del sistema y si esta ultima > restar 24 horas, < sumar 24 hrs.

tengo una consulta para los expertos. Tengo una Tabla Ingresos la cual registra la información de un cliente cuando ingresa a un hotel, su respectivo  Formulario solicita el nombre, dirección,  Fecha de Ingreso la cual toma del sistema, Hora de Ingreso la cual también toma del sistema, y un campo Horas Estancia que calcula el tiempo que el huésped ha estado en el hotel(se calcula Horas de Estancia= time() - horas de Ingreso. Hasta aquí todo marcha bien, Se Actualizo la información del formulario en el evento Al cargar el mismo con la instrucción DoCmd.RunSQL "update [INGRESOS] set [HORAS DE ESTANCIA] = time()-[HORA DE INGRESO]"  y se actualiza bien  pero cuando la Hora de Ingreso es mayor > a la del sistema no arroja la información correcta supongo es por el formato de 24 hrs. P/E  un Cliente Ingreso 18:20mins las horas de estancia reales son 23:26mins pero con el update arroja el valor 00:37 mins. La solución que encontré es aplicar en el formulario un comparativo

If [HORA DE INGRESO] >= Time() Then     (hace referencia al campo del formulario Hora de Ingreso.)
   HORAS DE ESTANCIA= 24 - ([HORA DE INGRESO] - Time())
End If
If [HORA DE INGRESO] <= Time() Then
    HORAS DE ESTANCIA= Time() - [HORA DE INGRESO] + 24

Y con esto corregido. Mi consulta es la siguiente: ¿Cómo puedo hacer para actualizar el valor de HORA DE INGRESO de la tabla INGRESOS desde otro formulario? Es decir que no sea necesario el evento al cargar el formulario para que se actualice el valor del campo , en otras palabras quiero saber como hacer un if [hora de ingreso] >= time() then   Pero que esta Hora de Ingreso no sea del campo formulario al cargar Sino el Campo directamente de  la tabla. No se si me di a entender hacer comparaciones directamente con los campos de las tablas y actualizar valores. De todo lo que encuentre.

2 respuestas

Respuesta
2

Una alternativa a la propuesta de Icue, ya que también tienes un campo Fecha Ingreso, es usar las fechas completas (fecha y hora), con lo que te evitas tener que hacer un condicional.

Es decir, en vez de la hora (usando Time()), usas la fecha completa (con Now()) y se la restas a la fecha ingreso + hora ingreso:

En código, en el evento "al recibir el enfoque" de tu campo horas (o en el que consideres más conveniente:

Me.[HORAS DE ESTANCIA] = Now() - CDate(Me.[FECHA DE INGRESO] & " " & Me.[HORA DE INGRESO])

o en la SQL:

CurrentDb.Execute "update [INGRESOS] set [HORAS DE ESTANCIA] = Now() - Cdate([FECHA DE INGRESO] & ' ' & [HORA DE INGRESO]"

De cualquiera de las dos formas que uses yo le veo un posible problema (que no sé si has contemplado o se puede dar), y es ¿qué pasa si un cliente está más de un día de estancia? Con cualquiera de los dos métodos no te va a mostrar más de 24 horas (23:59:59 concretamente)

Si se te pudiera dar este problema que comento, te dejo un par de enlaces del foro "Dudad Access" en el que tratamos el tema:

http://nksvaccessolutions.com/Foro/viewtopic.php?f=7&t=191

http://nksvaccessolutions.com/Foro/viewtopic.php?f=7&t=79&p=355

http://nksvaccessolutions.com/Foro/viewtopic.php?f=8&t=513&p=3500

En el este último, se hace referencia a un ejemplo de Horus, que puedes encontrar aquí: http://neckkito.xyz/nck/index.php/miscelanea/aportaciones

Un saludo.


Respuesta
1

Rosario, perdóname pero estás cometiendo un error. Verás, ningún ordenador del mundo trabaja con fechas ni con horas. Trabaja con números. Al día 01/01/1900 se le asignó el 1, al día 02/01/1900 se le asignó el 2 y así hasta hoy. Las horas son decimales de día, por tanto no tienes que sumarle 24 sino 1.

Mira, si tengo los cuadros de texto

Si la hora de salida es mayor que la de entrada ese sería el resultado

Pero si fuera al revés

En este caso, el código del evento Al recibir el enfoque del cuadro de texto Dif es

Private Sub DIF_GotFocus()
If HoraSalida > HoraEntrada Then
DIF = HoraSalida - HoraEntrada
Else
DIF = 1 + HoraSalida - HoraEntrada
End If
End Sub

Lo que estás haciendo es decirle que la hora de salida es del día siguiente, lo que se corresponde con la realidad.

Gracias Icue ya me lo habías explicado me quedo claro pero una ves guardado el dato en tabla como puedo actualizarlo con la información que me diste sin depender del gotfocus de ese formulario, es decir desde otro formulario con la sentencia update.?

Honestamente, no me acuerdo, pero siempre puedes decir desde otro formulario, suponiendo que tengas algún control que identifique a un registro en particular de la tabla Clientes. Por ejemplo, vamos a suponer, que tienes un control IdCliente, NombreCliente, etc.

If dlookup("horasalida","Ingresos","idcliente=" & me.idcliente & "")>dlookup("horaentrada","ingresos","idcliente=" & me.idcliente & "") then

docmd.runsql"update ingresos set [horas estancia]=[horasalida]-[horaentrada] where idcliente=" & me.idcliente & ""

else

docmd.runsql"update ingresos set [horas estancia]=1+[horasalida]-[horaentrada] where idcliente=" & me.idcliente & ""

Si, digamos, la "factura" se la vas a hacer en el mismo momento que abandona la habitación puedes sustituir Horasalida por Time()

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas