Es difícil tratar datos tipo hora en access

Quiero llevar la participación del tiempo de los voluntarios en las actividad para saber el tiempo cuando sea necesario para un certificado de horas y me gustaría saber si es más conveniente apuntarlo en minutos o es fácil tratar con horas.

Voy a poner un ejemplo:

Pepe realiza una actividad de animación hospitalaria de 10 de la mañana a 14, por lo que acumula 4 horas de voluntariado.

Esas 4 se le asignan en el formulario de actividad y la idea es que a través de los mismos se le vayan acumulando mediante una sql en su ficha personal el total de horas.

Para saber por ejemplo que hoy necesita un certificado de horas y pueda decir que ha día de hoy tiene realizadas 120 horas o sacar estadísticas de participación etc..

Este tipo de campo es fácil de programar o es más sencillo ponerlo todo en min (en este caso 240) y acumularlo todo como numérico, ¿y si es así se puede dividir en horas y minutos?

1 Respuesta

Respuesta
1

Kike, los cmapos de fecha y de hora, se tratan como números (la fecha la parte entera, y las horas la parte decimal), por tanto puedes hacer las operaciones matemáticas con ellos que necesites y/o convertirlos de fecha/hora a número y viceversa.

Para eso tienes las distintas funciones que trae incorporadas access.

Lo que sí te aconsejaría, es que si vas a hacer restas entre horas (hora de salida - hora de entrada, por ejemplo), tengas también en cuenta la fecha para evitar resultados "extraños"

Correcto, ya me di de bruces cuando estoy diseñando el tema, je je es muy raro porque las actividades suelen ser en el día pero también puede haber guardias con la ambulancia tipo de comenzar a las 22 y terminar a las 8 de la mañana del día siguiente.

He puesto en la tabla Fecha y Fecha_fin (Fecha corta) y hora y Hora_fin (Hora corta)

Y un campo donde calculo el resultado:

=([Hora_fin]-[Hora]) y funciona siempre salvo en casos como el anterior que me da 14 y no en negativo.

Y digo yo... ¿con esta fórmula "=([Hora_fin]-[Hora])" cómo estás teniendo en cuenta las fechas? XD

He hay el problema no la tengo en cuenta y eso me produce el error que me comentabas y luego te confirme, no había pensado en ello hasta que me puse a probar y estoy en este lío a ver si salgo pero estoy muy perdido contentas de fechas y horas

Los ejemplos que puso Neckkito en su web últimamente (suyos, de A. Salva y míos). Todos tratan sobre campos de fecha y hora

Con ellos estoy pegándome para entenderlo y adaptarlo a mi bd je je. No se si lo conseguiré pero no me rindo a la primera lo juro.

Tienes una opción más fácil, que seguro no pensaste en ella: en vez de poner la fecha y la hora en dos campos, ponla sólo en uno, así al hacer la resta no tendrás problemas

Aunque parezca mentira si que lo pensé y funciona pero es un reto sino recurriré a ello, es por ir un poco más allá cada día.

Un saludo

Pues en mis ejemplos de "horas nocturnas" y "horas por turnos" tienes como hacerlo, aunque yo a mayores hago la diferencia en minutos y luego la paso a horas:

Public Function fncHorasTrabajadas(laFechaIni As Date, laHoraIni As Date, _
                                laFechaFin As Date, laHoraFin As Date) As Double
    fncHorasTrabajadas = DateDiff("n", CDate(laFechaIni & " " & laHoraIni), CDate(laFechaFin & " " & laHoraFin)) / 60
End Function

He estado mirando el ejemplo que me dices y ya vi que la solución para realizarlo pero lo hice con todos los campos de mi tabla en una consulta añadiendo el campo 

HorasTrabajadas: fncHorasTrabajadas([FechaEntrada];[HoraEntrada];[FechaSAlida];[HoraSalida])

Mi pregunta ahora es seria posible realizar esto mismo en el formulario basado en la tabla directamente sin tener que basarlo en la consulta.

Es curiosidad ya.

Un saludo

Sí, puedes hacerlo en el formulario directamente, ya sea en el origen del control o por VBA (cuidado con la sintaxis!)

Buenos días he estado probando ha realizarlo en el formulario de prueba con los campos de tu ejemplo y he hecho los siguiente he creado un txt independiente y en el origen puse:

=fncHorasTrabajadas([Fecha];[Hora];[Fecha_fin];[Hora_fin])

y luego para pasar ese valor a un campo de esas horas que esta en la tabla llamado resultado en el evento desdpues de actualizar de los campos HoraEntrada y HoraSalida lo siguiente pero no me lo pasa:

Private Sub HoraEntrada_AfterUpdate()
    Dim vHoras As Variant
    vHoras = Nz(Me.HorasTrabajadas.Value, 0)
    Me.resultado.Value = vHoras
End Sub
Private Sub HoraSalida_AfterUpdate()
Call HoraEntrada_AfterUpdate
End Sub

He de decir que el campo resultado lo he puesto hora corta.

También consultarte que si en mi bd el nombre de los campos es Fecha, hora,Fecha_fin y Hora_fin.

la función a poner en el texbox seria:

=fncHorasTrabajadas([Fecha];[Hora];[Fecha_fin];[Hora_fin])

y me funciona pero mientras voy me tiendo datos en el texbox pone:

 #¡Tipo! 

Un saludo

Kike, como de costumbre, a mi modo de ver, te complicas sin necesidad:

1º/ si tienes un campo en la tabla para almacenar el resultado, asígnaselo directamente por VBA y no primero realiza el calculo en un textbox independiente y luego pasalo al dependiente.

2º/ Si la función te devuelve un valor de tipo double, y tu cmapo es de fecha/hora, tendrás que convertirlo al tipo de datos adecuado.

3º/ El problema de #tipo" es lógico que te salga, porque mientras no tengas rellenos los 4 campos, es imposible que la función realice la operación.

Tenéis razón pero me planteo las cosas como más o menos creo que pueden ser más fáciles y al final es lo más difícil.

Me estas acojonando de que me complico demasiado, no quiero que me corrijas ni hagas nada simplemente le eches un ojo cuando puedas y me digas si me estoy complicando mucho la vida para buscar otra vía más simple, ya que estoy comenzando el diseño de la bd.

Lo que tengo que recoger son los datos que están en TServicios y las demás tablas son auxiliares para recoger la información adicional TTraslados (porque esos datos los solicita el 112 o los hospitales, centros salud etc), TVoluntarios (saber quien fue y atendió las incidencias, horas voluntariado, etc).

La idea de las horas viene a parte de saber lo que dura un servicio que es necesario, (ese dato me sirve para asignarle las horas al voluntario en el formulario FServVoluntarios mediante una consulta de actualización y sumando las horas a las que haya anteriormente), como no supe asignarlo mediante vba por eso use tu ejemplo de horas que me diste lo lleve a un txt y de este al campo Total_horas de TServicios, lo cual también me dio problemas ya que no se convertirlo a hora así que lo puse en la tabla como numero doble y funciona lo que pasa que las horas las pone con decimales.

La idea es luego imprimir un resumen de cada servicio añadiendo los campos al informe y añadiéndole subinformes con los traslados, voluntarios, etc,,

Y sacar estadísticas también de los datos recogidos, como traslados realizados, asistencias, porcentaje participación voluntarios, etc,, pero esto de las estadísticas no es lo importante lo primordial es poder meter la información y realizar el informe de cada servicio.

Por eso te pido que cuando tengas un rato le eches un vistazo a si el planteamiento a lo que te comento es el idóneo o no, ya que si de esta forma me voy a complicar demasiado para lo que quiero hacer prefiero saberlo ahora je je, que ya llevo unas horas pero estoy a tiempo antes de tener que suicidarme luego.

Ha formularios que están de hacer pruebas que no

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

Un saludo

Kike, no tengo tiempo para analizar tu BD, por lo que me limito a ponerte la forma fácil para hacer el cálculo de las horas directamente en la tabla: http://www.filebig.net/files/3xEFuPqujt

Además, te diré que en los ejemplos colgados, tienes la función para pasar las horas a formato "hh:mm", y la explicación de cómo usarla (función que también está en el ejemplo de A. Salva)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas