Equivalente en access a la función Tiempo

Tengo una planilla en Excel, y en ella tengo esta ecuación:

TIEMPO(HORA(H10); SI(MINUTO(H10)>15; 60; 0); 0)

Y quisiera encontrar su equivalente en Access.

2 Respuestas

Respuesta
2

Hugo: En Access lo puedes hacer con un DateDiff, pero el problema te va a surgir cuando cambie la hora de medianoche si es que existe esa posibilidad.

Otro tema es lo que citas de que si la diferencia de Salida - Entrada es <= 15 Minutos, la Tarifa es 60 Minutos y si es mayor 120 minutos. ¿Y qué pasa si la diferencia son 12 Horas o 24 o 5 días?

Para no complicarte te voy a citar el caso más simple, en el que la hora no cambia de día.

En el Evento Después de Actualizar de la Hora de Salida, pones éste código.

Private Sub HoraSalida_AfterUpdate()
Me.DifMinutos = DateDiff("n", Me.HoraEntrada, Me.HoraSalida)
If Me.DifMinutos <= 15 Then
        Me.MinAPagar = 60
Else
        Me.MinAPagar = 120
End If
End Sub

Del código anterior se desprende que en un Formulario has de tener los siguientes "Controles"

1 Cuadro de Texto >> HoraEntrada, 1 de HoraSalida, 1 de DifMinutos y 1 de MinAPagar.

Un saludo >> Jacinto

Fantástico Jacinto. El problema ocurriría cuando la cantidad de horas supere las 4 horas y el tiempo de tolerancia mencionado, es que ahí en ese punto no debería seguir contabilizando más horas.

GRacias por tu valioso tiempo y saludos >> Hugo

Respuesta
2

¿Podrías explicar que hace esa función?

Buenas noches,

Paso a explicar lo que la función realiza:

La función lo que haces es ver en una celda con formato hora corta que en su sección minutos, partiendo de una hora exacta es decir por ejemplo 13:00, verificar que si se paso 15 minutos, es decir dice 13:15, redondee al valor en 2 horas, en otras palabras, si dice 13:00 y 13:15 cobrara una hora si dice 13:16, cobrara dos horas, espero haber sido claro y no haberlo complicado aun mas.

Gracias

Prefiero ponerte unos cuadros de texto para que veas el problema de las horas y minutos. Sé que lo sabes, pero me permito repetirlo. Ningún ordenador trabaja con fecha, ni con horas. Las fechas son enteros de día. Al día 01/01/1900 se le asignó el 1, al día 02/'1/1900 el 2 y así hasta hoy. Las horas, minutos, etc son decimales de día.

Si en el cuadro de texto de arriba escribo una hora, realmente estoy escribiendo lo del cuadro de la derecha

En el cuadro de abajo escribo otra hora y pulso Enter

Lo que no entiendo es que si la diferencia entre dos horas es mayor de 16 minutos le pagues dos horas, eres demasiado bueno, ¡Que las trabaje!, no es un modelo de negocio sostenible.

Si ahora abajo pongo otra hora

Para cubrir lo que te indican de que la hora de abajo sea menor que la de arriba, lo que hago es decirle que la hora de abajo es del día siguiente

El código es 

Private Sub Texto0_AfterUpdate()
Texto2 = Texto0
End Sub
Private Sub Texto4_AfterUpdate()
Texto6 = Texto4
If Texto4 > Texto0 Then
If DateDiff("n", Texto0, Texto4) >= 16 Then
Resultado = 2
ElseIf DateDiff("n", Texto0, Texto4) < 16 Then
Resultado = 1
End If
End If
If Texto4 < Texto0 Then
Texto4 = Texto4 + 1
If DateDiff("n", Texto0, Texto4) >= 16 Then
Resultado = 2
ElseIf DateDiff("n", Texto0, Texto4) < 16 Then
Resultado = 1
End If
End If
End Sub

Icue muchas gracias, lo que estoy buscando es con la fórmula de ejemplo hacer eso mismo pero en Access, la planilla controla el tiempo de permanencia de autos en un estacionamiento y lo que quiero es que más allá de si es 15, 16 0 10 minutos que cuando pasada la hora y pasado ese tiempo de tolerancia comience a contabilizar una nueva hora, sin tener que decirle nada más que la hora de finalización de estadía ya que la de ingreso la tengo desde el momento mismo que ingresa el vehículo

Ayer 18 fue puente, por eso me he retrasado un poco.

Ya he comprendido lo que quieres(al menos eso creo). Supongamos que te llega un vehículo y anotas la matrícula y la hora de entrada(aunque yo le pondría automáticamente la hora del sistema, de hecho, en el código lo tienes puesto).

No puedes trabajar con Datediff("n"... porque te da el total de minutos entre dos horas. Si tuvieras como horas 09:00 y 11:23, te da un total de 143, con lo que no podrías ponerle la condición de >=16.

Entonces tienes que trabajar con Datepart("n"... o Datepart("h"

Si tengo el formulario

Anoto la matrícula, automáticamente en HoraEntrada me pone la del sistema. Cuando el cliente va a retira su vehículo, sea la hora que sea, haces clic en HoraSalida y también te pone la del sistema y en TiempoCobrar te pone las horas que debes facturarle.

El código es(parece un poco largo, pero cubre todas las posibilidades, eso creo)

Private Sub HoraSalida_AfterUpdate()
Select Case DatePart("h", HoraSalida)
Case Is >= DatePart("h", HoraEntrada)
    Select Case DatePart("n", HoraSalida)
    Case Is >= DatePart("n", HoraEntrada)
        If DatePart("n", HoraSalida) >= DatePart("n", HoraEntrada) + 16 Then
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida) + 1
        End If
   Case Else
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida)
    End Select
Case Is < DatePart("h", HoraEntrada)
     Select Case DatePart("n", HoraSalida)
    Case Is >= DatePart("n", HoraEntrada)
        If DatePart("n", HoraSalida) >= DatePart("n", HoraSalida) + 16 Then
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida + 1) + 1
        End If
   Case Else
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida + 1)
    End Select
End Select
End Sub
Private Sub HoraSalida_GotFocus()
HoraSalida = Time()
End Sub
Private Sub Matricula_AfterUpdate()
HoraEntrada = Time()
End Sub

Icue buenos días realmente has captado lo que intente exponer, es realmente así lo que buscaba, muchísimas gracias por tu incondicional aporte y por tu valioso tiempo, una cosa más y es algo que no lo he logrado en Excel y es que cuando ese tiempo entre hora_llegada y hora_salida supere las 4 horas + el tiempo de tolerancia, que ya no cuente más, como sería esto en Access.

Nuevamente muy agradecido por tan valioso aporte.

Saludos>>Hugo

Muy sencillo. Basta con ponerle al principio una condición IF. Antes de nada mira la imagen, la diferencia igual o superior a 4 horas y 16 minutos, realmente es lo que ves a la derecha

Entonces si dejo el código como

Private Sub HoraSalida_AfterUpdate()
If HoraSalida - HoraEntrada >= 0.177777778 Then
TiempoCobrar = 5
Else
Select Case DatePart("h", HoraSalida)
Case Is >= DatePart("h", HoraEntrada)
    Select Case DatePart("n", HoraSalida)
    Case Is >= DatePart("n", HoraEntrada)
        If DatePart("n", HoraSalida) >= DatePart("n", HoraEntrada) + 16 Then
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida) + 1
        End If
   Case Else
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida)
    End Select
Case Is < DatePart("h", HoraEntrada)
     Select Case DatePart("n", HoraSalida)
    Case Is >= DatePart("n", HoraEntrada)
        If DatePart("n", HoraSalida) >= DatePart("n", HoraSalida) + 16 Then
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida + 1) + 1
        End If
   Case Else
        TiempoCobrar = DateDiff("h", HoraEntrada, HoraSalida + 1)
    End Select
End Select
End If
End Sub

Le he puesto que le cobre al menos 5 horas, ( no le regales más, que entonces te lo deja 4 días)

Sin palabras Icue, gracias por el tiempo y dedicación a cada consulta, y si es verdad no pienso regalarles nada solo es que quiero llegar a un valor monetaria X de estadía por 24 horas y que luego cumplido ese primer punto mantenga ese valor hasta cumplida las 24 horas para que luego comience a cobrar por hora hasta llegar nuevamente al valor de estadía y así sucesivamente, ya aquí en este punto es donde no se como seguir.

Lo siento, me pierdo. A partir de " valor monetaria X... ya no he entendido nada.

Perdón por la falta de claridad en el ejemplo, lo que quería expresar es que al llegar al valor de una estadía en horas de estacionado por ejemplo $ 350, este no continué incrementando su valor hasta tanto no complete las 24:00Hs, es decir ingresa 15:30Hs al llegar al valor de estadía mantenga ese valor hasta las 15:30 del próximo día.

Saludos y gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas