Posición en formulario continuo en ACCESS

Expert@s,

Una vez más recurro a ustedes en busca de ayuda. He buscado solución a este problema y, hasta ahora no he logrado solucionarlo. Resulta que tengo un formulario continuo en Access con bastantes registros (+/- 30.000). Dichos registros son susceptibles de ser modificados por un usuario. Tras modificarlo, el formulario ha de actualizarse para que los datos sean modificados sobre la marcha y el código pueda funcionar. El problema es que tras cada actualización el formulario vuelve al primer registro por lo que el usuario ya pierde la pista de por dónde iba. Lo máximo que he logrado para solucionar ésto es que a la hora de editar el registro se guarde el número de éste en una variable para después utilizarla con un GoToRecord tras refrescar el formulario pero lo que hace es que me pone el registro que acabo de modificar a la punta arriba del formulario y no deja la barra de scroll como si no se hubiese hecho nada. ¿Existe alguna posibilidad de que, tras modificar el registro y refrescar el formulario la barra vertical de scroll se quedara quieta para no "despistar" al usuario?

2 Respuestas

Respuesta
3

Sin saber a que te refieres con actualizar el formulario después de modificar es difícil decir algo. Pero si tengo el formulario Pedidos, al que he añadido un cuadro de texto Contador, que debería estar oculto, pero que dejo visible para que veas el funcionamiento

Le voy a cambiar el nombre por el tuyo

Ahora, por hacer algo, al pulsar el botón le digo que reconsulte el origen y se vuelva a ese registro

Puedes ver que en el cuadro de texto, aparece el "numero de registro" y el cursor se vuelve al primer control del registro. El código del botón es

Private Sub Comando11_Click()
Contador = Me.CurrentRecord
Me. Requery
DoCmd. GoToRecord,, acGoTo, Contador
End Sub

Es decir, primero le asigna a Contador el valor del registro activo, luego "reconsulta" su origen(ya que no sé que instrucción usas) y luego le digo que vaya al registro con el mismo valor que contador.

Muchas gracias por tu respuesta. El comando que yo utilizo es Me.Refresh en lugar de Me.Requery pero el comportamiento veo que es el mismo. La solución que tú me has puesto es la que yo he intentado comentar cuando formulé la pregunta. Lo que me ocurre con esta solución es que me va al registro pero lo posiciona en el primer lugar de la pantalla. Es decir, supongamos que de 30.000 registros yo estoy viendo en pantalla desde el 21.100 hasta el 21.180 y ahora yo estoy editando el registro 21.172 (estaría casi al final de mi pantalla). Cuando yo edito el registro, actualizo y ejecuto la solución que me has dado, el registro 21.172 se va al inicio de la pantalla de tal forma que lo que estoy viendo ahora es el registro desde el 21.172 hasta el 21.252 (el que acabo de editar +80). Igual es un poco lío explicarlo... espero haberlo hecho bien. Muchas Gracias.

Le he añadido a la tabla un campo nuevo Idpedido, que empieza por el 1. Hago el formulario. Si hago clic sobre el campo Idpedido del primer registro de la pantalla, al que en el evento Al hacer clic le he puesto

If isnull([pos]) then

pos=me.currentrecord

end if

Con lo cual en el cuadro de texto Pos me guarda la posición del primer registro que se ve en la pantalla y le voy a cambiar el valor al señalado por la flecha

Cuando hago clic en el primer Idpedido

Le cambio el nombre al 267 y pulso el botón

Y me queda exactamente igual

El código del botón ahora es

Private Sub Comando11_Click()
Me. Requery
DoCmd. GoToRecord,, acGoTo, Pos
End Sub

Es decir, me "vuelve a poner" el primer registro de la pantalla, que había marcado como primero.

Una vez más, gracias por tu aportación. Si lo he entendido bien, con tu última solución el usuario ha de clicar en el primer registro que aparece en pantalla para que se guarde en el txtbox y después actualizar el registro que desee, ¿es correcto?

Es una posibilidad. También podrías no pulsar en el primer Idpedido y dejar el código del botón como( por poner algo)

Private Sub Comando11_Click()
pos=me.currentrecord
Me. Requery
DoCmd. GoToRecord,, acGoTo, Pos-5
End Sub

así, siempre te pondrá el registro modificado el sexto de la pantalla.

El problema de los formularios continuos es que aunque veas muchos registros, sólo tiene existencia física el registro activo, los demás son imágenes virtuales, lo mismo que en un formulario único sólo ves el registro activo y para ver otros tienes que desplazarte.

Pues sí, tal y como comentas, me temo que estoy intentando darle prioridades a un formulario contínuo que no es posible. Otra opción que se me ocurre es dividir los registros por página; de esta forma podría limitar el número de registros mostrados en cada página haciendo desaparecer la barra vertical de scroll. Voy a informarme a ver si es posible.

Una vez más, muchísimas gracias.

Puedes hacer, por ejemplo que sólo muestre un determinado número de registros de cada vez. Por ejemplo, le digo que sólo me muestre 10

Cuando pulso el botón

En vista diseño del formulario le he añadido un cuadro de texto oculto al que he llamado Contador

El código es

Private Sub Comando11_Click()
Contador = Nz([Contador]) + 1
Form.RecordSource = "select * from clientes where idcliente between (" & Me.Contador & "*10)+1 and (" & Me.Contador & "+1)*10"
End Sub
Private Sub Form_Load()
Form.RecordSource = "select top 10 * from clientes"
End Sub

Así, cada vez que pulse el botón me muestra los siguientes 10 registros. Y quien dice 10, puedes poner el número que quieras.

Hola Icue, muchas gracias por la respuesta. Disculpa que no te haya respondido antes pero esta semana he estado algo liado con otros proyectos. En cuanto a la última solución propuesta (mostrar "X" registros de una sola vez y avanzar ó retroceder como si de páginas se tratase); ¿Habría alguna forma de hacerlo pero obviando el campo IDRegistro? Te comento: la tabla que tengo es de "un sólo uso", es decir, cada "X" tiempo, se van a borrar los registros y se ingresarán otros nuevos de forma masiva por lo que dicha tabla no tiene ningún contador ID (desde que borre la tabla ya el primer registro no será el IDRegistro=1). No sé si habrá alguna forma de hacerlo por número de registro...

Una vez más, muchísimas gracias y un saludo.

Lo puedes hacer sin problema ninguno, pero para no llenar esta página excesivamente, si quieres, repito, si quieres mándame un mensaje(sólo el mensaje) a [email protected] y te mando un ejemplo.

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

Respuesta
3

Algo simple que puedes hacer es:

Sub VuelveAregistroActual()
Dim RegActual As Variant
RegActual = Me.Bookmark
Me.Requery
Me.Bookmark = RegActual
End Sub

Y para llamar a ese Procedimiento, desde el Control que modificas, y en su Evento AfterUpdate pones>>

Private Sub NombreDeTuControl_AfterUpdate()

Call VuelveAregistroActual

End Sub

Esto te situará el Registro modificado como el "primero de los que se aparecen en ese momento", si es que el Recorset Clone tiene muchos Registros. No en el primer registro.

Si quieres "señalizar" el Registro, basta con que des formato condicional a los Controles con>>

Así verás lo que estás modificando y al Registro que vuelve. Un saludo >> Jacinto

Muchas Gracias Jacinto también por tu respuesta. He intentado aplicar tu solución para ver el resultado pero me da un error:

Se ha producido el error '3159' en tiempo de ejecución:

No es un marcador válido

¿Sabes a qué puede ser debido?

Una vez más, muchísimas gracias y un saludo.

Ignoro de dónde pueda venir, si exactamente lo aplicas tal como te comento y el origen de datos es la tabla donde estás grabando. He hecho la prueba y no he tenido problemas.

Si me comentas, la estructura de los objetos que envuelven a ese proceso, quizá pueda darme una pista.

Si quieres dale una ojeada a éste articulo:

http://www.accessrepairnrecovery.com/blog/fix-ms-access-not-a-valid-bookmark-error 

No obstante, he visto también la respuesta de ICUE (Un saludo), y es una alternativa muy buena, sin necesidad de usar el Bookmark. Ya me comentarás. Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas