Entradas populares

*Publicidad

9/3/11

Abrir el formulario que se cerro la ultima vez


Los pasos a seguir son:

Crear una tabla auxiliar (que aqui vamos a llamar Acceso) para almacenar el ultimo registro visualizado en el formulario. Contendra dos campos, uno (que llamaremos CampoClave para guardar el nombre del campo clave principal de la tabla asociada al formulario y otro para guardar el valor de dicha clave:

Campos Tipo


CampoClave Texto (Clave principal)

Usuario Texto (Clave principal)

Ordenador Texto (Clave principal)

Valor Texto

El campo CampoClave se ha descrito como de tipo texto pero puede ser tambien de tipo numerico o autonumerico. Ello dependera del tipo de campo que sea el campo clave principal de la tabla asociada al formulario. En este ejemplo suponemos que ese campo es de tipo texto y que su nombre es ClaveFormul. En cada formulario deberemos tomar nota del nombre de ese campo y de su tipo.

Añadir el siguiente codigo al evento Al descargar del formulario deseado:

Private Sub Form_Unload(Cancel As Integer)

Dim Valor As String

If IsNull(Me![ClaveFormul]) Then

' Cambiar [ClaveFormul] por el nombre del campo clave principal

Valor = "acNewRec"

Else

Valor = Me![ClaveFormul]

' Cambiar [ClaveFormul] por el nombre del campo clave principal

End If

Set rst = db.OpenRecordset(Sql, dbOpenDynaset)

If rst.RecordCount = 0 Then

rst.AddNew

rst![Usuario] = Application.CurrentUser

rst![Ordenador] = NombrePC

rst![CampoClave] = Me.Name

rst![Valor] = Valor

rst.Update

Else

rst.Edit

rst![Valor] = Valor

rst.Update

End If

rst.Close

End Sub

Añadir el siguiente codigo al evento Al cargar del formulario, el cual efectua una busqueda en la tabla Acceso del campo clave del registro abierto, toma el valor de la clave y se coloca en el:

Private Sub Form_Load()

Set db = CurrentDb

Sql = "SELECT * FROM Acceso WHERE "

Sql = Sql & "Usuario = '" & Application.CurrentUser

Sql = Sql & "' AND Ordenador = '" & NombrePC

Sql = Sql & "' AND CampoClave = '" & Me.Name & "'"

Set rst = db.OpenRecordset(Sql, dbOpenSnapshot)

If rst.RecordCount > 0 Then

If Not IsNull(rst![Valor]) Then

If rst!Valor <> "acNewRec" Then

Set rstFrm = Me.RecordsetClone

' Si el campo clave principal ("ClaveFormul" en este ejemplo) es de tipo texto,

' la instruccion a incluir seria esta:

rstFrm.FindFirst "[ClaveFormul] = '" & rst![Valor] & "'"

' Cambiar [ClaveFormul] por el nombre del campo clave principal

' Si el campo clave principal ("ClaveFormul" en este ejemplo) es de tipo

' numerico, la instruccion seria:

' rstFrm.FindFirst "[ClaveFormul] = " & rst![Valor]

' Cambiar [ClaveFormul] por el nombre del campo clave principal

If Not rstFrm.NoMatch Then

Me.Bookmark = rstFrm.Bookmark

End If

rstFrm.Close

Else

DoCmd.GoToRecord , , acNewRec

End If

End If

End If

rst.Close

End Sub

No hay que olvidar que no solo hay que incluir el codigo, sino asegurarnos que en la hoja de propiedades del formulario quedan marcados ambos eventos: Al cargar y Al descargar con [Procedimiento de evento].

Estando abierto el formulario en modo de diseño, pulsar el boton Codigo y añadir en la seccion Declaraciones el siguiente codigo:

Option Compare Database

Option Explicit

Dim db As Database

Dim rst As Recordset

Dim rstFrm As Recordset

Dim Sql As String


Crear un modulo con un nombre cualquiera, que llevara este codigo:

Option Compare Database

Option Explicit

Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function NombrePC() As String

Dim Buffer As String

Dim Size As Long

Dim X As Long

Buffer = Space(255)

Size = 255

'Asigna Nombre Maquina

X = GetComputerName(Buffer, Size)

NombrePC = Left$(Buffer, Size)

End Function

No hay comentarios:

Publicar un comentario

Entrar