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
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
- Compartir respuesta
¿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.
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
- Compartir respuesta