Mostrar el ultimo registro si cumple con el criterio (Baseara control de actividades, Inicio/Fin)

Soy Nuevo en esto de la programada en Access, espero me puedan ayudar porque no le encuentro por donde.

Estoy buscando mostrar en un formulario el ultimo registro que cumpla un criterio

Tengo la table [Registro] con los campos (Id, IdEmpleado, Inicio, Fin, Fecha)

Tengo el formulario POR en el que tengo un cuadro de texto (Me. IdEmp), lo que necesito es que al ingresar el id de empleado en el cuadro (Me.IdEmp), me busque el ultimo registro de ese id de empleado en la table [Registro] y me lo muestre en mi formulario.

Esto es algo de lo que he intentado, No se si estoy muy perdido y mucho les agradecería su ayuda.


    Dim rst As Recordset
    Set rst = Me.RecordsetClone
    rst.FindFirst "IdEmpleado = " & Me.IdEmp
        If rst.NoMatch Then
            MsgBox "Record not found"
        Else
            Me.Bookmark = rst.Bookmark
        End If
    rst.Close
    Set rst = Nothing


Este es el codigo complete de mi app

Private Sub IdEmp_AfterUpdate()
Dim valor As Variant
Dim s As Variant
Dim t As String
Dim ultimo As Variant
Dim rst As Object

Me.BtnInicio.Enabled = False
Me.BtnFin.Enabled = False
s = DLookup("[IdEmpelado]", "[Empleado]", "[IdEmpelado] = " & Me.IdEmp.Value)
If IsNull(s) = True Then
        MsgBox "Numero de empleado no registrado, Informar a supervisor"
        Me.Actividad.SetFocus
        Me.IdEmp.Value = ""
        Me.IdEmp.SetFocus
Else
        Set rst = Me.Recordset.Clone
        rst.FindLast "IdEmpleado = " & Me.IdEmp
        If Not rst.NoMatch = True Then
            Me.Bookmark = rst.Bookmark
        Else
            MsgBox "crear nuevo"
            DoCmd.GoToRecord , , acNewRec
            Me.IdEmpleado.Value = s
            Me.Fecha.Value = Date
            Me.Actividad.SetFocus
            ultimo = DLast("[IdEmpleado]", "[Registro]", "[IdEmpleado]=" & Me.IdEmp.Value)
            Me.BtnInicio.Enabled = True
            Me.Comando71.Enabled = True
            End
        End If
        rst.Close
        Set rst = Nothing
        If Not IsNull(Fin) Then
            DoCmd.GoToRecord , , acNewRec
            Me.IdEmpleado.Value = s
            Me.Fecha.Value = Date
            Me.Actividad.SetFocus
            ultimo = DLast("[IdEmpleado]", "[Registro]", "[IdEmpleado]=" & Me.IdEmp.Value)
            Me.BtnInicio.Enabled = True
            Me.Comando71.Enabled = True
        Else
            Me.Actividad.Enabled = False
            Me.Fecha.Enabled = False
            Me.Comando71.Enabled = False
            Fin.SetFocus
            Me.BtnFin.Enabled = True
        End If
End If
Set rst = Nothing

1 respuesta

Respuesta
2

Antes de nada, yo pondría la instrucción que comprueba si ese idempleado existe, en el evento Antes de actualizar. Es preferible comprobar, antes de salir de casa, si uno lleva dinero en el bolsillo. Además bastaría con poner, simplemente

If nz(dcount("*","registro","idempleado=" & me.idempleado & ""))=0 then

msgbox.....

Por otro lado, por lo que pones parece que el formulario POR es independiente. En ese caso, al no tener origen de registro tendrías que usar otra fórmula.

Por ejemplo, si tengo la tabla Clientes

Verás que el marcado por la flecha es el último idempleado(es sólo para el ejemplo)

Si tengo el formulario con los cuadros de texto NombreeClientre y País, y un cuadro de texto IdEmpleado, donde voy a escribir un número

Cuando pulso Enter

El código del evento Después de actualizar del cuadro de texto Idempleado es

Private Sub IdEmpleado_AfterUpdate()
NombreCliente = DLast("nombrecliente", "clientes", "Idempleado=" & Me.IdEmpleado & "")
Pais = DLast("pais", "clientes", "Idempleado=" & Me.IdEmpleado & "")
End Sub

En caso de que el formulario tuviera origen de registro en la tabla Registro podrías usar, en el mismo evento

Me.RecordsetClone.FindLast "[idempleado]=" & Me![IdEmpleado]
Me.Bookmark = Me.RecordsetClone.Bookmark

Que te "llevaría" el cursor a ese registro

O también

DoCmd.SearchForRecord , "", acLast, "[Idempleado] = " & Str(Nz(Screen.ActiveControl, 0))

Que te "aparecería" el formulario como si ese registro fuera el primero. Es decir, se desplaza a él.

La programación es muy sencilla, no es necesario complicarla tanto como has escrito.

Muchas gracias Icue,

Me has puesto a pensar, y de 58 líneas lo baje a 17, pero estoy atorado al momento de llegar a mi ultimo registro que coinicida con mi textbox independiente Me![IdEmp].

Ahora primero válido si existe Me![IdEmp] en mi tabla [Empleado] y en mi tabla [Registro] con If IsNull y Dlookup.

Cabe mencionar que el formulario si tiene su origen en la table Registro unicamente el Textbox Me![IdEmp] es independiente.

El problema que tengo es al momento de utilizar :

Me.RecordsetClone.FindLast "[idempleado]=" & Me![IdEmp]

Me.Bookmark = Me.RecordsetClone.Bookmark

No me manda al ultimo registro

No entiendo porque razón me manda al registro 202, cuando me tendría que mandar al 244 con el ejemplo del IdEmp "109952".

Este es mi codigo

Private Sub IdEmp_AfterUpdate()
Dim s As Variant
If IsNull(DLookup("[IdEmpleado]", "[Empleado]", "[IdEmpleado] = " & Me![IdEmp])) Then
    MsgBox "Numero de empleado no registrado, Informar a supervisor"
    Me.Actividad.SetFocus
    Me.IdEmp.Value = ""
    Me.IdEmp.SetFocus
Else
    If IsNull(DLookup("[IdEmpleado]", "[Registro]", "[IdEmpleado]=" & Me![IdEmp])) Then
        MsgBox "crear nuevo registro"
    Else
        MsgBox "ya existe registro"
        Me.RecordsetClone.FindLast "[idempleado]=" & Me![IdEmp]
        Me.Bookmark = Me.RecordsetClone.Bookmark
    End If
End If

Si tengo la tabla(igual a la tuya) donde te señalo con una flecha el último registro del valor 192952, y en observaciones te pongo Es el último.

Y tengo un formulario independiente(no tiene origen del registro) pero los controles se llaman igual que los campos de la tabla Registros

Escribo el valor y pulso Enter

En este caso, el código del evento Después de actualizar del cuadro de texto Idempleado

Private Sub IdEmpleado_AfterUpdate()
Id = DLast("id", "registro", "idempleado=" & Me.IdEmpleado & "")
Inicio = DLast("inicio", "registro", "idempleado=" & Me.IdEmpleado & "")
Fin = DLast("fin", "registro", "idempleado=" & Me.IdEmpleado & "")
Observaciones = DLast("observaciones", "registro", "idempleado=" & Me.IdEmpleado & "")
End Sub

En caso de que el formulario tuviera origen de registros, la tabla del mismo nombre

Verás, que al abrirlo, está en el primer registro. Escribo el valor en el cuadro de texto Idempleado y al pulsar Enter

Observa que se "ha ido" al registro 7( el último de 109952)

El código del evento Después de actualizar del cuadro de texto Idempleado es, en este caso

Private Sub IdEmpleado_AfterUpdate()
Me.RecordsetClone.FindLast "[idempleado]=" & Me![IdEmpleado]
Me.Bookmark = Me.RecordsetClone.Bookmark
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas