Autor Tema: Recuperar última posición en formulario  (Leído 431 veces)

Desconectado xavi

  • Administrador
  • Habitual
  • *****
  • Mensajes: 184
Recuperar última posición en formulario
« en: Mayo 02, 2020, 04:43:32 pm »
Palabras clave: guardar, almacenar, recordar, última, posición, registro
Autor: ¿?
Extraído de: Utter Access (allá por 2007)

Objetivo:
La idea es almacenar la última posición del usuario al entrar en un formulario. Sirve para tipo Lista o tipo Ficha. Requiere de varias acciones.

1. Tener una tabla de posiciones (puede ser local ya que es del propio usuario)
2. Las tablas deben tener un campo ID único.
3. En el formulario, asignar una función a todos los controles del registro para el evento "Al recibir enfoque". Esa función almacena en memoria el registro y el campo enfocado.
4. En el evento Close, se almacena:
  - Formulario
  - Id del registro
  - Último campo enfocado
  - Usuario (redundante si es local)
  - Momento
  El almacenado de los datos puede ser acumulativo (nuevo registro por lo que Momento es relevante) o sustitutivo (editar el registro para combinación de formulario-usuario por lo que Momento es irrelevante)

En el momento de abrir el formulario, abrir un recordset o utilizar un Dlookup para recuperar el ID de la combinación formulario-usuario (si es acumulativo, incluir Momento en la "ecuación")
Mediante Bookmarks, posicionar el registro. Algo así:


Código: [Seleccionar]
Private Sub GoToLastSavedPosition()
    Dim strSQL           As String
    Dim rstFormPositions As DAO.Recordset
   
    strSQL = " SELECT Last(tblFormPositions.LastRecordID) AS LastOfLastRecordID," & _
                    " Last(tblFormPositions.LastActiveControl) AS LastOfLastActiveControl," & _
                    " Max(tblFormPositions.LastTimeSaved) AS MaxOfLastTimeSaved" & _
             " FROM tblFormPositions" & _
             " GROUP BY tblFormPositions.FormName," & _
                      " tblFormPositions.LastUser" & _
             " HAVING tblFormPositions.FormName = " & Chr$(34) & Me.Name & Chr$(34) & _
             " AND tblFormPositions.LastUser = " & Chr$(34) & CurrentUser() & Chr$(34)

    Set rstFormPositions = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
   
    With rstFormPositions
        If .RecordCount <> 0 Then
            If !LastOfLastRecordID <> 0 And Not IsNull(!LastOfLastActiveControl) Then
                Me.RecordsetClone.FindFirst "[ID] = " & !LastOfLastRecordID
                Me.Bookmark = Me.RecordsetClone.Bookmark
                Me(!LastOfLastActiveControl).SetFocus
            End If
        End If
        .Close
    End With
   
    Set rstFormPositions = Nothing
   
End Sub
El ejemplo original lanza ese código en el Form_Timer del formulario (Intervalo = 1) con este códig:

Código: [Seleccionar]
Private Sub Form_Timer()
    Static blnFormOpen As Boolean
   
    If Not blnFormOpen Then
        blnFormOpen = True
        Me.TimerInterval = 0
       
        GoToLastSavedPosition
    End If
   
End Sub