Access

GOTO Un nuevo disco que se muestra en la parte inferior de una forma continua

Tratando de ayudar en una pregunta de foro

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.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba