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í:
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:
Private Sub Form_Timer()
Static blnFormOpen As Boolean
If Not blnFormOpen Then
blnFormOpen = True
Me.TimerInterval = 0
GoToLastSavedPosition
End If
End Sub