Copia de un registro de un campo a otro campo

Tengo dos campos de una tabla que son tiempohora y otro tiempohorasal que significan la hora a la que se ha entrado en un formulario y la hora a la que se ha salido, respectivamente. Quiero que en el formulario escriban la hora de entrada y de salida del formulario pero a la que le den al botón de nuevo registro, la hora de entrada (tiempohora) sea la de salida del anterior (tiempohorasal) ya que las horas tienen que ser consecutivas.

tiempohora           tiempohorasal

    8:00                              09:30

    9:30                              13:55

    13:55                            20:00

    20:00                            03:25

1 Respuesta

Respuesta
2

Si te tuviera que aconsejar te diría que no dejes que nadie ponga las horas, ya que puedo entrar a las 08:00 y te pongo que he entrado a las 11:30, pero si es eso lo que quieres, en el evento Al recibir el enfoque, o en el evento Al activar el registro, del cuadro de texto TiempoHora puedes poner

If isnull([tiempohora]) then

tiempohora=dlast("tiempohorasal","nombredelatabla","tiempohorasal is not null")

end if

El programa es para el control de la producción, los operarios tendrán que poner cuando hay cambio de producción o cuando hay averías y el momento que empieza y termina cada operación. Cada formulario representa una operación. Tienes toda la razón y no se me ocurre otra forma que no sean los operarios los que introduzcan las horas ya que sino iríamos a campos más difíciles como por ejemplo que cuando la maquina se encendiera se guardara la hora.. No se si se te ocurre una forma no tan compleja y que solucione el problema. Muchísimas gracias por la respuesta!

Pienso, quizá este equivocado, que hay que dejar que la persona que "entra" en un formulario "trastee" lo menos posible, y así no le damos pié a que cometa un error. En la Organización Racional del Trabajo de Henri Fayol, venía a decir al operario de las cadenas de montaje, más o menos"Usted no piense, ya habrá alguien que piense por usted". Partamos de la premisa de que no sé como tienes las tablas. Pero si tengo una tabla Operaciones

Y con ella construyo un formulario, donde te dejo a la vista los controles HoraEnt y HoraSal, pero podrían perfectamente estar ocultos( lo he puesto como bloqueados, para que no puedan cambiar a su antojo los valores).

Cuando lo abro, en horaent le pone la hora del sistema. Por otro lado, en el formulario le quito los botones de navegación para que si quiere ir al registro siguiente tenga que pulsar el botón.

Le pongo la fecha, el operario y la operacion y cuando pulsa el botón, rellena la hora sal y se va al siguiente registro( te muestro lo de la hora)

El código del formulario es

Te he puesto lo de if isnull por si quisieras "navegar" por los registros que no te modifique los valores ya guardados.

La idea es muy buena, el problema con eso es que tendrán que estar pendientes al entrar y salir de cada formulario que la hora sea exacta la misma a la que han acabado la operación. Si ellos tienen la opción de modificarlo al acabar la faena podrán estar por el ordenador y podrán ser más precisos con la hora.. aunque da más margen a errores de escritura.

Muchas gracias por la aportación.

Entonces rectifica el código que he puesto y déjalo como

Private Sub Comando11_Click()
DoCmd.GoToRecord , , acNext
End Sub

Private Sub Form_Current()
If IsNull([HoraEnt]) Then
HoraEnt = DLast("horasal", "operaciones", " horasal is not null")
End If
End Sub

Muchisimas gracias.

A raíz de ésta pregunta me ha surgido otra.

Actualmente los datos de los formularios son los siguientes:

Día                               Hora entrada                      Hora salida               Diferencia entre horas

12/08/2018                    10:50                                     12:50                                2

12/08/2018                    12:50                                     13:25                               0,6

12/08/2018                    13:25                                     16:55                               3,5

15/08/2018                    16:55                                     17:25                               0,5

En éste caso el 0,5 sería incorrecto porque las 16:55 pertenecen al día 12/08 pero las 17:25 al día 15, así que hay tres días de diferencia que no se como tener en cuenta para hacer la diferencia. 

Gracias de nuevo!

Los ordenadores no trabajan con fechas tal como las ves, por ejemplo, 12/09/2018, ni con horas y minutos como 17:50. Trabajan con números. Al día 01/01/1900 se le asignó el 1 y así sucesivamente. Las horas son decimales de día. Por ejemplo, ahora mismo 12/09/2018 a las 11:19, realmente para el ordenador es 43355,471991. Mira la imagen de las diferencias en un mismo día

Es decir, la diferencia "real" entre las horas de entrada y salida es, en decimal, de 9,95, o sea 9 horas y 0,95 de hora. Si este 0,95 lo multiplicas por los 60 minutos que tiene una hora te da 57, que es lo que se pone con formato 00:00 y te queda 09:57 que es lo que ves a la izquierda.

En el caso de que sea en días distintos

El ordenador, lo que hace realmente es la diferencia entre los valores reales de cada momento, es decir, la diferencia en días y te la multiplica por 24 horas que tiene un día.

En tu caso, permíteme que te lo diga, el planteamiento no es correcto, porque tal como lo tienes lo está haciendo bien, ya que te resta la hora de salida menos la hora de entrada del mismo registro. Para que te pudiera hacer la resta como la quieres tendrías que añadir el campo FechaSalida, para que el sistema sepa que debe restar entre dos días distintos. En ese campo podrías poner como valor predeterminado Date(). Por ejemplo

El código es simplemente

¡Muchísimas gracias!

Hola,

He tenido un problema con la función DLast y es que al darle al cuadro de texto de la Hora de entrada, no mes sale la hora de salida del último registro sino de uno hecho anteriormente y siempre el mismo, es decir, funciona bien hasta un momento en el que a partir de entonces siempre que le das a Hora entrada sale automáticamente la hora de salida guardada en un punto y no la última que se ha registrado.

Private Sub Form_Current()
If IsNull([HoraEnt]) Then
HoraEnt = DLast("horasal", "operaciones", " horasal is not null")
End If
End Sub

Perdona ha sido fallo mio ya que en dos ordenadores de la empresa estaba abierto el mismo Access y modificando datos. 

De todas formas, cualquier pega me lo dices.

Vale el mensaje que te envié ayer es cierto, lo he probado sin que estuvieran dos ordenadores conectados y hay un momento (no se cuando) que la hora de entrada es siempre la misma, se queda congelada en un registro como si el ultimo registro fuera aquel y realmente hay más que son posteriores. Así que creo que es el DLast el que no trabaja bien. Sabes a qué se debe?

Me he dado cuenta que al hacer guardar como del proyecto, en el nuevo proyecto se soluciona el problema.. igualmente me gustaría saber a que se debe éste error.

Siento no poder decirte nada, sólo tengo un ordenador, por lo que no puedo hacer pruebas con dos, ni en red.

No no, precisamente en este ultimo mensaje te comento que no tiene nada que ver ni con los ordenadores ni con la red. Simplemente cuando abres Access y creas el formulario funciona, vas guardando los registros desde el formulario y todo correcto, pero si empiezo a borrar los registros de la tabla (a la que van los registros del formulario), copiar nuevos y sobrescribir en la tabla hay un momento que en el formulario la función que pone la última hora en HoraEntrada se queda congelada siempre en un registro concreto.

¿Puedes mandarme una copia, en el momento que empieza a repetir la hora de entrada? Si algunos datos son confidenciales, cámbialos por aaaaa, por ejemplo. Mi correo es [email protected]

Si lo haces, en el asunto del mensaje pon tu alias Albert, ya que si no sé quien me escribe ni los abro, directamente a

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas