
GOTO Un nuevo disco que se muestra en la parte inferior de una forma continua
Tratando de ayudar en una pregunta de foro

Cuando se abre, quiero que el nuevo disco esté en la parte inferior de la pantalla.
en el que James tuvo un problema interesante que quería abordar.
Tenía una forma continua y quería ir a un nuevo disco, pero quería mostrar registros en el formulario en lugar del valor predeterminado donde la nueva entrada está en la parte superior del formulario y no puede ver ninguno de los registros anteriores.
Ahora sé que esto es un nicho, una necesidad poco común, pero todavía pensé que valía la pena tomarse un momento para explorar juntos y ver cómo se puede resolver.
El problema
Digamos, en forma continua, lo haces
DoCmd.GoToRecord , , acNewRec
Obtendrás un resultado como
Sin embargo, James quería ver tantas entradas existentes como sea posible y tener la nueva fila de registro en la parte inferior del formulario, como
La solución
No mentiré, inicialmente no pensé que se pudiera hacer mucho para resolver este.
Luego contemplé la API avanzada para mover la barra de desplazamiento …
Después de dejar que el problema se filtre un poco en mi mente, finalmente me di cuenta de lo realmente simple que era lograr después de todo.
Solución 1
Podríamos usar el enfoque estándar y luego simplemente avanzar hacia atrás algunos registros y, por lo tanto, nació mi código inicial.
Dim lCounter As Long Const lNoRecOnForm = 7 DoCmd.GoToRecord , , acNewRec 'Scroll back up to show records For lCounter = 1 To lNoRecOnForm - 1 DoCmd.GoToRecord , , acPrevious Next lCounter 'Move the cursor back in the New Record row For lCounter = 1 To lNoRecOnForm - 1 DoCmd.GoToRecord , , acNext Next lCounter
El problema era que tuvo que codificar la cantidad de registros que se podían mostrar en el formulario que era menos que ideal. Luego me di cuenta de que podríamos determinar esto a través del código en tiempo real y modifiqué lo anterior para convertirse en
Dim lCounter As Long Dim lNoRecOnForm As Long lNoRecOnForm = Me.InsideHeight \ Me.Section(acDetail).Height ' \ NOT / !!!! Debug.Print lNoRecOnForm DoCmd.GoToRecord , , acNewRec 'Scroll back up to show records For lCounter = 1 To lNoRecOnForm - 1 DoCmd.GoToRecord , , acPrevious Next lCounter 'Move the cursor back in the New Record row For lCounter = 1 To lNoRecOnForm - 1 DoCmd.GoToRecord , , acNext Next lCounter
Solución 2
Una vez que tuve 1 solución, me di cuenta de que podía hacer lo mismo usando un enfoque ligeramente diferente y el siguiente nació
Dim lCounter As Long Dim lNoRecOnForm As Long Dim rs As DAO.Recordset Dim lNumRec As Long lNoRecOnForm = Int(Me.InsideHeight / Me.Section(acDetail).Height) Set rs = Me.RecordsetClone rs.MoveLast lNumRec = Me.Recordset.RecordCount rs.MoveFirst rs.Move (lNumRec - lNoRecOnForm + 1) Me.Bookmark = rs.Bookmark For lCounter = 1 To lNoRecOnForm - 1 DoCmd.GoToRecord , , acNext Next lCounter Set rs = Nothing
¿Cómo funciona?
Ambas soluciones funcionan de manera similar:
- Vaya a un nuevo disco (que se mostrará en la parte superior)
- Moverse hacia arriba para que se muestren los registros visuales máximos
- Volver al nuevo disco
Siempre es sorprendente cómo siempre parece haber una solución para la mayoría de los problemas en el acceso.