¿Como copiar un dato anterior al actual?
Nuevamente recurre a ustedes:
Estoy haciendo una pequeña aplicación en donde tengo un campo que se llama texto114 el cual quiero que el registro que tiene siempre este presente en mi nuevo registro. He intentado muchas cosas pero no logro hacerlo.
2 Respuestas
- Compartir respuesta
Para poder ayudarte necesitaría que detallases algo más tu pregunta. ¿Estás usando un formulario de tipo continuo? En caso de ser así, ¿con algún filtro o criterio de ordenación aplicado?
Piensa que para tomar el dato del registro anterior puedes usar los recordsets y sus propiedades, y definirlo usando la propiedad recordsetclone en caso de que sea continuo, o debes de acceder al origen de datos en otros casos. Dependiendo del entorno también tendrás que considerar si hay filtros aplicados o algún tipo de ordenación en los registros.
Si estás en tabla (altamente desaconsejable) basta con presionar Control y la tecla del apóstrofe a la vez para copiar en el campo activo el valor del registro previo.
Cordiales saludos.
Hola nuevamente, agradezco su pronta respuesta, le explico, tengo un formulario en el cual tengo varias cajas de texto y tengo un textbox en el que va un dato que siempre debe estar por defecto (texto114), lo que quiero es evitar escribirlo a cada momento.
he visto lo de la propiedad recordsetclone pero no se como utilizarla. espero que me haya explicado mejor.
nuevamente gracias por su tiempo y ayuda.
Me vas a perdonar pero ya no estoy seguro de si tienes un campo llamado texto114 en el que quieres que en un nuevo registro aparezca sin teclear el valor del mismo campo del registro anterior, o si lo que quieres es que en un campo de texto te aparezca en los nuevos registros sin teclear el valor texto114. En la pregunta inicial creía entender que estábamos en la primera situación, y por ello te pedía más datos para poder usar la propiedad recordsetclone...
Ahora me parece que estamos en la segunda. Si es así, basta con que establezcas el valor por defecto deseado (texto114 o lo que quieras) como valor predeterminado directamente en la tabla en el campo que sea (abres la tabla en vista de diseño y al colocar el cursor en el campo verás entre sus propiedades la de Valor predeterminado). También puedes hacerlo en el control del formulario que depende de ese campo haciendo lo mismo (vista diseño, seleccionar control y ver sus propiedades...) Estás propiedades puedes cambiarlas siempre que desees, ya que no afectan a los registros existentes en la tabla.
Cordiales saludos.
Hola nuevamente :)
Creo que no me explique bien, lo que necesito es que el dato que escribí un registro anterior en el texto 114 se vuelva a colocar en el dato que estoy actualmente en la misma casilla texto114.
investigando un poco encontré este código que lo adapte a mi sistema pero no me funciona:
Private Sub Texto114_GotFocus()
On Error GoTo texto114_Err
With CodeContextObject
If (IsNull(.texto114)) Then
SendKeys "^{'}", True
End If
End With
texto114_Exit:
Exit Sub
texto114_Err:
MsgBox "Consulte al proveedor del programa"
Resume texto114_Exit
End Sub
Una disculpa por no explicarme bien, espero que esta vez haya quedado un poco mas claro.
Saludos!!
también como referencia, he usado este otro código y tampoco me funciona :(
Me.texto114 = DLast("texto114", "Memorandum")
*Memorándum es el nombre de la tabla en donde se almacenan todos los datos del formulario.
Ahora si lo pillo. Lo que quieres es que el campo "texto114" en los nuevos registros te ponga por defecto el valor que tenga ese mismo campo en el último registro (espero no estar equivocado esta vez).
Tienes que añadir código al evento antes de actualizar del formulario en donde está ese campo (en vista de diseño sobre esa propiedad del formulario presionas el generador de código...).
Te generará algo así como
Private Sub Form_BeforeUpdate(Cancel As Integer)
End sub.
A esto le añades lo siguiente de modo que al final te queda el código como te muestro:
Private Sub Form_BeforeUpdate(Cancel As Integer) On Error GoTo Err_Form_BeforeUpdate Me.texto114.DefaultValue = Me.texto114 Exit_Form_BeforeUpdate: Exit Sub Err_Form_BeforeUpdate: MsgBox Err.Description Resume Exit_Form_BeforeUpdate End Sub
Esto le indica al formulario que el valor por defecto de ese campo es el valor que actualmente tiene ese mismo campo justo antes de guardar el registro.
Es sencillo de implementar. A cambio de ello tiene el único inconveniente que el primer registro que des de alta al abrir el formulario no tiene valor predeterminado ya que no hay un registro previo que hallas guardado y haya establecido la propiedad de valor predeterminado. Este primer registro puede usar el valor predeterminado que le hayas puesto en la tabla o en el control del formulario. Esto también se podría hacer usando los recordsets que te comentaba o lanzando consultas sobre la tabla (usando Dbusq en el evento cargar...) pero no creo que merezca la pena complicarse más.
Bueno ya me dirás que tal.
Cordiales saludos.
hola nuevamente, le comento que el código que me dio si funciona, pero el problema que se me presento es que algunas ocasiones funciona y otras veces no hace nada. Ya verifique todo lo que podía e incluso lo cambie de modulo, pero sigue igual.
No se cual sea el problema, gracias por su tiempo y disculpe por tantas molestias.
EL código no puede funcionar a veces si y a veces no de una forma aleatoria. Tienes que mirar en que circunstancias funciona y en cuales no. Ya te comentaba que hay varias maneras de hacerlo. Por ejemplo el código que te comentaba funciona en el caso de ir introduciendo registros sin salir del formulario. El primero debes de introducir tu el valor deseado (que puede ser el valor predeterminado en el campo de la tabla o en el control del formulario).
Lo mismo sucede si usas en el valor predeterminado:
=DÚltimo("[texto114]";"Memorandum")
Aparte de que hay que escribirlo correctamente y de que se llamen así realmente el campo y la tabla, solo funciona con los registros sucesivos
Yo probaría también otra forma, que a mi modo de ver es más sencillo que funcione en todas las circunstancias. Te copio código sin probarlo y luego lo comento.
Private Sub Form_Current() On Error GoTo Err_Form_Current If Me.NewRecord = True Then Dim miBD As Database, misRegistros As Recordset, miSQL As String, miValor As Integer Set miBD = CurrentDb miSQL = "SELECT Last(Memorandum.texto114) AS UltimoDe114 FROM Memorandum;" Set misRegistros = miBD.OpenRecordset(miSQL, dbOpenSnapshot) miValor = misRegistros!UltimoDe114 misRegistros.Close Set miBD = Nothing Me.texto114= miValor Else End If Exit_Form_Current: Exit Sub Err_Form_Current: MsgBox Err.Description Resume Exit_Form_Current End Sub
Asociado al evento current del formulario (al activar un registro) se comprueba si estamos en uno nuevo. Si es ese el caso se crea un recorset para obtener el último valor del campo texto114 de la tabla Memorándum. La variable que recoge ese valor se usa como valor para el control texto114 del formulario. SI no es un registro nuevo no hace nada, dejando el valor que ya exista en el campo texto114 del registro. Para que funcione solo se requiere que exista el campo texto114 en la tabla Memorándum, y que el formulario en donde se ejecuta este código esta basado en esa tabla (o en una consulta en la que esté la tabla) y que tenga un control llamado como el campo texto114.
- Compartir respuesta