Formulario dependiente que habrá en el último registro donde cerró

Espero me puedan ayudar quisiera saber si saben como abrir un formulario en el último registro donde quedó osea no en el ultimo registro sino en el registro que yo estaba modificando

Por ejemplo son 100 registros y estaba en el numero 50 modificandolo es posible que al abrirlo quede en el mismo en el que lo cerré espero me hayan entendido

Respuesta
1

Crea una tabla para esos datos temporales (que no solo pueden ser el registro, puede ser el color, tamaño, fecha

Suponiendo que la tabla exista (se la puede llamar 'Auxiliar' y a este campo 'RegActual'

Se utiliza el evento Current del formulario para guardar el registro actual y el evento Open para ir al registro guardado.

Private Sub Form_Current()
CurrentDb.Execute "Update extras set regactual= " & Me.CurrentRecord
End Sub
Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, DLookup("RegActual", "Extras")
End Sub

Crear una propiedad en el formulario EXIGE guardar el diseño del formulario.
Crear una variable publica es tiempo perdido si se cierra la aplicación para continuar otro día
Una tabla es elemento natural para guardar datos (aunque su ubicación sea externa) y así funciona incluso en muchas aplicaciones comerciales.

(Gracias Eduardo por el comentario, una vez mas demuestras tu verdadera personalidad)

1 respuesta más de otro experto

Respuesta
2

Vaya respuesta NO necesita crear tablas extras y tampoco hace falta el evento Al activar registro, en su defecto es el evento Al descargar. Hay 2 formas:

1. Utilizando las propiedades del formulario

2. Utilizando una variable pública

FORMA 1

Tiene la ventaja que sirve para TODOS los formularios, pero necesita más código.

CÓDIGO DEL FORMULARIO

Evento Al cargar

Private Sub Form_Load()
    Dim rst As DAO.Recordset
    Dim lngIDarticulo As Long
    lngIDarticulo = ObtenerPropiedadFormulario(Me.Name, "LastRecord")
    Set rst = Me.RecordsetClone
    With rst
        .FindFirst "idarticulo = " & lngIDarticulo
        If Not .NoMatch Then
            Me.Bookmark = .Bookmark
        Else
            DoCmd.GoToRecord acForm, Me.Name, acNewRec
        End If
    End With
End Sub

Evento Al descargar

Private Sub Form_Unload(Cancel As Integer)
     EstablePropiedadFormulario Me.Name, "LastRecord", Nz(Me.idarticulo, 0)
End Sub

FUNCIONES REQUERIDAS

Copie este código en un módulo

Sub EstablePropiedadFormulario(strForm As String, strPropName As String, _
   strPropValue As String)
   Dim dbs As DAO.Database
   Dim ctr As DAO.Container
   Dim doc As DAO.Document
   Dim prp As DAO.Property
   Set dbs = CurrentDb
   Set ctr = dbs.Containers("Forms")
   Set doc = ctr.Documents(strForm)
   ' Intento de establecer la propiedad especificada.
   On Error GoTo hay_error
   doc.Properties(strPropName) = strPropValue
Salir:
   Exit Sub
hay_error:
' si no se encuentra la propiedad.
  If Err.Number = 3270 Then
       'Crear propiedad
       Set prp = doc.CreateProperty(strPropName, _
           dbText, strPropValue)
       doc.Properties.Append prp
   Else
       MsgBox Err.Description, vbExclamation, "Error"
   End If
   Resume Salir
End Sub
Function ObtenerPropiedadFormulario(strForm As String, strPropName As String)
   Dim dbs As DAO.Database
   Dim ctr As DAO.Container
   Dim doc As DAO.Document
   Dim prp As DAO.Property
   On Error GoTo hay_error
   Set dbs = CurrentDb
   Set ctr = dbs.Containers("Forms")
   Set doc = ctr.Documents(strForm)
   Set prp = doc.Properties(strPropName)
   ObtenerPropiedadFormulario = prp.Value
Salir:
   Exit Function
hay_error:
   Select Case Err.Number
       Case 3265
       MsgBox "Formulario no encontrado", vbExclamation, "Error"
       Case 3270
       MsgBox "Propiedad no encontrada", vbExclamation, "Error"
       Case Else
       MsgBox Err.Description, vbExclamation, "Error"
   End Select
   Resume Salir
End Function

Lo anterior le permite utilizarlo para todos los formularios 

FORMA 2

Para esta se debe crear una variable pública por el ID de cada formulario y se debe tener cuidado en cambiar la variable en los respectivos eventos.

(La imagen es similar)

Evento Al Cargar

Private Sub Form_Load()
    Dim rst As Object
    Set rst = Me.RecordsetClone
    With rst
        .FindFirst "idarticulo = " & lngID
        If Not .NoMatch Then
            Me.Bookmark = .Bookmark
        Else
            DoCmd.GoToRecord acForm, Me.Name, acNewRec
        End If
    End With
End Sub

Observe que en este caso utilizo como variable pública lngID. Esta varía para cada formulario y se definir a nivel de módulo.

Evento Al Descargar

Private Sub Form_Unload(Cancel As Integer)
  lngID = Nz(Me.idarticulo)
End Sub

Definición de la variable a nivel de formulario.

Option Compare Database
Option Explicit
Public lngID As Long

En este caso como solo tengo un formulario no hay problema, pero ya para varios se debe adicionar una variable con el respectivo ID.

Estos ejemplos sirven solo para un entorno monousuario, para entorno multiusuario se debe adicionar el id del usuario. Etc. En conclusión es más profesional la forma 1.

Que pena Enrique, pero desconoce totalmente las propiedades de los objetos, para su conocimiento estas se guardan con el formulario y nada más. Al abrir nuevamente la base de datos se mantiene la propiedad, por esto recomiendo la forma 1 que expuse. Tiene razón en la variable pública faltaría guardarla al salir de la aplicación, pero no le veo sentido puesto que se debe crear para cada formulario.

Ahora, si vamos a su respuesta solo aplica a 1 formulario, claro que con algunos cambios puede servir para todos. No se disguste, tome lo mejor y así aprendemos todos.

Esperemos la decisión del usuario que hizo la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas