Consulta para control horario en ACCESS 2010

Estoy desarrollando una pequeña aplicación de gestión para mi negocio en la que uno de los apartados es un control de asistencia. Y antes de nada decir que, por un lado, lo que he hecho hasta ahora ha sido en gran parte gracias a los expertos y consejos de esta página, y por otro lado, mis conocimientos de access son muy escuetos.
La base de datos contiene ya otras tablas, formularios e informes acerca de otros apartados como gestión de empleados, facturación, etc., pero del control de asistencia aún no he hecho nada.
Como tengo lector de códigos de barras he generado, desde la sección de empleados, una serie de tarjetas (informes) con el código asignado a cada empleado para leerlo a la hora de los marcajes de entradas o salidas.
Mi idea, en principio, era hacer una tabla, y un formulario para ella, con los campos "id", "código" y "hora". "id" sería el número para control interno del marcaje hecho, "código" sería el identificador vinculado al empleado y "hora" sería el campo que contendría la hora de marcaje, ya sea entrada o salida.
Todo esto es fácil pero para llevarlo a cabo necesitaré generar, después de los marcajes, una serie de operaciones. Se me ocurrió que tenía dos opciones: o bien calcular las horas en una consulta que después podría ver en un informe o bien calcularlo directamente en un informe (no sé si esto último es viable). Pero lo que no sé como resolver es:
- No distingo entre entradas y salidas a la hora de los marcajes, así que necesito, en la consulta que haga, que cada 2 registros de un mismo empleado estén relacionados para que pueda calcularse esa diferencia de tiempo. (El hacerlo así pensé que sería mejor por dejar una tabla muy simple, no sé si estoy equivocándome).
No sé si he expresado del todo bien mi idea y lo que necesito...

1 respuesta

Respuesta
2
No se como lo tienes montado pero se me ocurre lo siguiente:
Poner en el mismo "id", en vez de un campo "hora", dos campos: "hora entrada" "hora salida".
Si esto no fuera posible porque para cada fichaje es un "id" y esto no se pudiera cambiar, habría que reflejar un campo "fecha" en cada "id", de esa manera no tendrías problemas.
Un saludo
Si, si, si esas son las dos opciones que barajo, o bien poner 2 campos para horas (entrada y salida vinculadas a 1 ID) o bien, que es mi idea principal, poner 1 solo campo hora (tanto para entrada como para salida).
Me gusta más la segunda, porque el proceso de entrada de datos tan solo sería tener abierto el formulario correspondiente y pasar la tarjeta del empleado con su código de barras por el lector, y automáticamente me genera ID, HORA y ID_EMPLEADO, además de permitirme trabajar con una tabla tremendamente sencilla.
PERO, y aquí está lo que no sè hacer o no se me ocurre cómo hacerlo, como necesito generar un informe mensual de asistencia tendré que crear una consulta que me agrupe los registros de 2 en 2 (cada 2 registros de marcaje se supone que corresponden a una entrada y a una salida).
Para lo que comentas te repito ¿Es posible que se "registre" la fecha", con ello sería mucho más sencillo.
No sé si te entiendo bien lo que me quieres preguntar, pero creo que si, de hecho lo que quiero es que al pasar la tarjeta del empleado por el lector de códigos de barras automáticamente capture el código (que será el que me identifique luego al empleado) y, también automáticamente, se rellene el campo HORA (calculándolo en el propio formulario).
Ahora bien, ese campo HORA, como no lo rellena nadie, sino que es automático, me da igual que sea un campo que se separe en hora y fecha o que sean dos campos en vez de uno, al final sigo trabajando con un solo registro por entrada o salida.
Y ya, completando un poco más la respuesta mía, indicarte que, por si te sirve de ayuda, el cálculo de la hora de entrada o salida lo pensaba realizar mediante la función más simple, "Ahora()", sin dejar que se modifique obviamente, y si no me equivoco esa función devuelve FECHA y HORA. Me da igual que se registren ambas, juntas, por separado o "modificadas" según convenga, es incluso mejor.
Es que esa es la pregunta: ¿Qué datos, tipo hora y fecha, se van a guardar en cada registro?
Porqué, si no se guarda la fecha, como vas a hacer que access diferencie los registros de un mismo empleado. Para access, ese empleado tendrá en el campo Hora, infinidad de registros, pero no puede trabajar con ellos con coherencia dado que si no se registra la fecha, las 12:00 horas de hoy, son las mismas que las 12:00 de mañana, de pasado mañana, del año que viene.
Si en cada registro se guarda: "id" "codigo" "fecha" "hora", luego con una simple consulta, te daría los datos que quieres.
Un cordial saludo

Inmenso tu interés, de verdad, muchísimas gracias por el coñazo que te estoy dando.
A ver, te explico como voy a hacerlo y te voy consultando linealmente el reto de dudas.
Creo una tabla, por ejemplo llamada MARCAJES, con 4 campos: ID, IDEMPLEADO, FECHA y HORA.
El campo IDEMPLEADO lo vinculo al campo ID de la otra tabla que ya tengo, EMPLEADOS.
Hago el formulario con los 4 campos, y hago que los campos FECHA y HORA se rellenen automáticamente (mediante código) en el evento DESPUÉS DE ACTUALIZAR del campo IDEMPLEADO, que se rellena mediante la lectura del código de barras de la tarjeta del empleado. ¿Hasta aquí voy bien?
Un detalle, ¿cómo hago para que se me "calcule" la fecha en un lado y la hora en otro? Lo pregunto porque la función que conozco es Now(), que devuelve ambas, juntas.
Bien, ahora, teniendo en cuenta que puede haber empleados que entren y salgan varias veces al día o una única vez o ninguna, en la tabla MARCAJES aparecerán, por días, pares de movimientos de un mismo IDEMPLEADO, ¿sigo bien?
Y finalmente viene lo que no se hacer: tengo que generar un informe mensual de horas por empleado. Para ello supongo que debo que crear antes una consulta (tal vez 2...¿?) Que primero calcule el tiempo por empleado y día y que después haga la suma de horas de todos los días.
Lo que no se hacer es esa (esas) consulta.
No se "realmente" como se registra el paso de la ficha del empleado, pero bueno.
PRIMERO. Después de releer el mensaje varias veces creo que lo mejor es que lo dejes en ese formato (fecha y hora juntos) porque cabe la posibilidad de que un empleado entre a las 23:00 horas y salga a las 06:00 horas. Si en el "fichaje<span style="white-space: pre;"> </span>" no es posible que se marque si es entrada o salida, lo tendrás que hacer a mano. Por ejemplo, con el siguiente planteamiento:
En el registro un campo hora entrada y hora salida.
Al coger la hora del empleado hacer las siguientes comprobaciones:
Si hora entrada = "" y hora salida = "" se anotara en hora entrada
Si hora entrada > 0 y hora salida = "" se anotara en hora salida
Si hora entrada > 0 y hora salida >0 se creara un nuevo registro y se anotara en hora entrada.
Luego deberías tener en cada registro un campo que te calcule las horas (hora salida-hora entrada).
Una vez que consigas esto, o algo parecido, crear las consultas a las que te refieres no es complicado
Vale, ya te voy entendiendo...
Pero de esa forma, ¿digamos qué el formulario o el proceso de marcaje que realizaría el formulario como funcionaría?
Es que para comprobar lo que dices, si hago por ejemplo 10 marcajes de entradas por la mañana, esos registros deberían quedar... ¿sin guardar?
Yo, lo que hoy he barajado sería agregar un nuevo campo a la tabla, llamado TIPO, en el que se metiese la información de si el marcaje es ENTRADA o SALIDA.
Ese campo, TIPO, se autocompletaría en el formulario de marcajes evaluando lo siguiente:
- Si el campo TIPO del último registro del empleado cuya ID tengo recién marcada en el formulario abierto es "ENTRADA", entonces que el control TIPO del formulario se autocomplete con "SALIDA", y viceversa.
Me imagino que con la función DLast() o alguna similar se podría hacer algo así, pero no tengo ni idea de como usarla, y menos, si la uso con condicionantes IF... Then...
Bueno, finalmente lo resolví. Usé DLast() y ya me funciona.
Sigo liado con lo de la consulta para la diferencia de horas... pero será otro hilo.
Gracias, y saludos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas