Calcular totales en un subformulario

Buenos días,

Quiero crear un formulario con subformulario para introducir las actividades diarias de unos trabajadores, en el formulario introduzco el código de trabajador y me llama a nombre, y resto de datos, me propone una fecha y una hora de inicio, además tengo un total para asegurarme de que el total de horas sumadas es igual a las horas de su jornada. La dificultad me llega a la hora de hacer el calculo de cada una de las actividades que meto en el subformulario, me gustaría informar solo de la actividad y de la hora de finalización de la misma y el resto de datos debería ser automático; hora de inicio, la primera línea que meta debe ser igual a la hora inicio jornada de la cabecera y el resto deberá ser igual a la hora de finalización de la línea superior, el tiempo de actividad es la diferencia de hora inicio y hora fin y el acumulado las sumas. Pero no se como hacerlo para el calculo del tiempo, ¿con un contador para saber el numero de línea?

Respuesta
1

Si adiciona una imagen de las tablas me daría mejor información ¿De qué tabla toma el origen de datos del subformulario?

                 Gracias Eduardo por tu rápida respuesta, no pensaba que esto funcionaba tan bien, adjunto la tabla, ten en cuenta que soy bastante novato en este tema, con mucha ilusión pero todavía no tengo ningún dominio, cualquier otra cuestión no dudes en preguntar y te responderé lo mas rápido que pueda.

Saludos

Le preparado este ejemplo con base en la imagen suministrada:

Consta de 2 tablas y 2 formularios

Si hago clic en grabar y no cuadra el total de horas del subformulario con el valor de formulario principal, informará con este mensaje:

No explico el código porque es un poco extenso. Si quiere el ejemplo puede solicitarlo a [email protected] favor anotar en el asunto el nombre de la consulta.

1 respuesta más de otro experto

Respuesta
2

Leo, por la hora de inicio en el subformulario no tienes problemas. En el evento, al activar el registro del subformulario(sin saber como está construido) puedes poner

If me.newrecord then

[hora inicio]=me.parent![hora inicio jornada]

end if

Es decir que si el registro del subformulario es nuevo, el valor del control Hora Inicio del subformulario es igual al que aparece en el control Hora Inicio Jornada del formulario "padre".

Para sumar las horas acumulada, tiene mala follá. Verás, aunque las horas las "veas" o escribas como 17:45, en realidad lo que de verdad existe es lo que ves a la derecha

¿Qué sucede con el formato hora?. Que al ser las horas, minutos y segundos decimales de 1 día, cuando la suma supera las 24 horas(1), el resultado que te muestra son las 04:08, pero del día siguiente.

Entonces, la única solución para que la suma te aparezca como, por ejemplo, 28:15 es coger el Resultado decimal, multiplicarlo por 24 para obtener las horas, extraer esa parte entera como Horas, y la parte decimal que te quedara multiplicarla por 60 para obtener los minutos.

La otra explicación, suponiendo que la jornada laboral no es continua y en el cuadro de texto rojo del formulario te deba aparecer la suma "de los diferentes tramos" trabajados en un día y que no superará las 24:00 ( eso creo, porque si no sería esclavitud), es que en el evento después de actualizar del cuadro de texto Hora Fin del subformulario pongas algo como

me.parent![total horas trabajadas]=nz(me.parent![total horas trabajadas])+horafin-horainicio

es decir, que cuando en el primer registro del subformulario(te recuerdo que no sé como están construidos) anotas una hora de fin, en el cuadro rojo, te haría la suma 0+10:15-09:22( el valor que sea). Vamos a poner, por ejemplo 4:25.

Cuando en el siguiente registro pusieras como hora salida, por ejemplo, 10:10, en el cuadro rojo te aparecería la suma 4:25+10:10-09:22, y así sucesivamente.

No sé si me he explicado, pero esa es la idea.

Hola Julian, como puedes ver todo lo que me has comentado funciona perfectamente, muchas gracias. Da gusto hablar con expertos! Pero aun me queda aclarar lo que mas dificultades me causa, por cierto, como no sé muy bien la mecánica de esta página si pregunto demasiado o hay un tope de mensajes avísame. Pero mientras pueda abuso de tu sabiduria... 

La cuestión es que el calculo de "tiempoactividades" lo hace siempre respecto a la hora de inicio de jornada, y necesito que, a partir del primer registro lo haga respecto a la finalización de la ultima actividad, es decir la hora final de una actividad es la hora de inicio de la siguiente. 

El cuadro rojo del formulario (que en el ejemplo que te adjunto indica 8) pretende verificar que la suma de todas las actividades parciales coincide con su total de Horas Jornada, las actividades son ininterrumpidas. En el ejemplo como ves entraría a trabajar a las 9:10 y a las 14:10 ya ha hecho 8 horas. ..

En fin muchas gracias de nuevo por tu ayuda.

Leo

Ya te dije que no sé como están construidos los formularios, pero no es difícil. Mira, si tengo un formulario, parecido al tuyo, con un subformulario Actividad

Anoto la hora Inicial y en el subformulario escribo o elijo la actividad(puedes ver que el cursor todavía está en el control Actividad). Cuando pulso Enter

En hora de inicio me "toma" el valor de la hora inicial. Anoto la Hora fin

Y cuando pulso Enter, me rellena Tiempo Activo y Total Horas

En el siguiente registro, anoto la actividad y cuando pulso Enter, en HoraInicio, me pone la hora fin del anterior registro y me suma las horas al control Total Horas del formulario

El código del evento Al recibir el enfoque del cuadro de texto Hora Inicio del subformulario es

Private Sub HoraInicio_GotFocus()
If Nz(DCount("*", "actividad", "idempleado=" & Me.IdEmpleado & "")) = 0 Then
HoraInicio = Me.Parent!HoraInicial
Else
HoraInicio = DLast("horafin", "actividad", "idempleado=" & Me.IdEmpleado & "")
End If
End Sub

El código del evento Después de actualizar del cuadro de texto HoraFin del subformulario es

Private Sub HoraFin_AfterUpdate()
TiempoActivo = HoraFin - HoraInicio
DoCmd.RunCommand acCmdSaveRecord
Me.Parent!TotalHoras = DSum("tiempoactivo", "actividad", "idempleado=" & Me.IdEmpleado & "")
End Sub

Pero, si fuera posible, sería conveniente saber como trabaja el formulario, si cada día es un registro nuevo por empleado.

Hola Julian, 

Gracias por la respuesta, en cuanto a saber como trabaja.

La fuente de origen es un parte de trabajo diario por cada trabajador, con ese parte se alimenta el formulario; uno al dia por trabajador y cada registro o linea es una actividad diferente con una duración determinada. Por lo que he visto en el ejemplo lo has entendido perfectamente.

Tengo una duda respecto a los campos del codigo que me has pasado 

If Nz(DCount("*", "actividad", "idempleado=" & Me.IdEmpleado & "")) = 0 Then
HoraInicio = Me.Parent!HoraInicial

Interpreto que es un condicional en el que cuentas los registros y si estan vacios o a cero pones la hora inicial como hora inicio. (si lo estoy entendiendo mal perdona) pero cuando quiero cambiar los nombres de tu ejemplo al mio no sé que interpretar como idempleado o IdEmpleado, es lo mismo? es el valor que esta en tu ejemplo contenido en el cuadro empleado de formulario?

Gracias por tu paciencia.

Leo

Las tablas Empleado y Actividad están relacionadas por Idempleado, (UN empleado VARIAS actividades). Por tanto el formulario y el subformulario también están están relacionados por el Idempleado. Pero en el caso del subformulario no es necesario que esté visible, es más, no es necesario que esté, ya que su valor se lo da el formulario. Y efectivamente, estás en lo cierto, lo que hace es contar si no hay ningún registro le pone el valor que figura en el control Hora Inicial del formulario y si ya hay al menos uno, que le ponga como hora Inicio la hora Fin del registro anterior.

Pero, ahora, por lo que comentas, parecer ser que puede haber mas de un registro con el mismo Idempleado pero con días distintos. Si es así, entonces convendría añadirle a la tabla Actividad un campo que permita diferenciar un registro de otro que tenga el mismo id, por ejemplo, fechaActividad. Y luego, en el subformulario, aunque el control Fechactividad esté oculto, poner en el evento Al activar el registro del subformulario

If me.newrecord then

fechaactividad=me.parent!fecha

con lo cual el código te quedaría

If nz(dcount("*","actividad","idempleado=" & me.idempleado & " and fechaactividad=#" & me.fechaactividad & "#"))=0 then

De todas formas, si quieres, repito, si quieres, mándame un mensaje, (sólo el mensaje) a [email protected] y te mando un ejemplo, de como lo haría.

Si lo haces, en el asunto del mensaje pon tu alias Leo Sánchez, ya que si no sé quien me escribe ni los abro.

¡Gracias! Por tu ayuda, de momento lo tengo todo claro.

Pero seguro que más adelante me surgen más dudas y tendré que volver a darte la brasa.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas