LABORATORIO DE SOLUCIONES ACCESS

Cómo Crear un Visor de Sesiones en Access con VBA (Paso a Paso)

Visor de Sesiones en Access

Cómo Desarrollar un Visor de Sesiones en Access: Un Sistema de Auditoría Esencial para Su Base de Datos


Monitorear las sesiones activas y prevenir cierres forzados del sistema son cruciales al trabajar con archivos Access (ACCDB), ya sea localmente o en una red. Este documento presenta un Visor de Sesiones de Usuario, un componente clave de nuestro laboratorio, para abordar estas problemáticas.

🛠️ Funcionalidades Principales del Visor de Sesiones

Un sistema de auditoría eficaz debe ser automatizado. Nuestro visor integra tres funciones automáticas con código VBA y formularios ocultos:

📝
Registro de Entrada y Salida:
Al cargar el formulario principal, se registra el nombre de usuario y la hora de acceso. Al cerrar el sistema, el evento Al descargar (On Unload) registra la hora de salida, finalizando el registro de la sesión.
🔍
Consulta del Último Acceso:
Esta función muestra la última fecha y hora en que un usuario específico interactuó con el sistema.
⏱️
Cálculo del Tiempo Conectado:
Calcula la duración de la sesión restando la hora de salida de la hora de entrada, mostrando el total de horas, minutos y segundos.

💡 Ventajas Clave de la Implementación de Este Sistema


Tres razones definitivas para implementar esta funcionalidad en sus proyectos:

Detección de Cierres Abruptos

Identifica cierres forzosos del sistema, evitando datos inconsistentes. Calcula la duración real de sesiones sin hora de salida registrada.

Información en Tiempo Real

Muestra usuarios activos, lo cual es crucial para procesos de mantenimiento, compactación de base de datos o actualizaciones.

Compatibilidad Total

Funciona nativamente con archivos ACCDB locales o divididos en red, sin la necesidad de migrar a infraestructuras como SQL Server.

🔬 En el Laboratorio de Access

Trabajaremos con una Plantilla de Access, elaborada especialmente para aprender y aplicar conocimientos. Durante el desarrollo práctico aprenderá:

  • Diseño avanzado de la tabla de logs (tbl_Sesiones).
  • Técnicas de VBA para capturar el nombre de usuario de Windows de forma automática.
  • Como integrar esta solucion en nuestros desarrollos personales.

Participa en este laboratorio y se de los primeros en implementar esta solucion!!

"FUNCIONES VBA YA DISPONIBLES!!"




Sección de Códigos VBA:

Funciones, métodos y módulos aplicables a este ejemplo.



'=======================================================================
' MODULO OPTIMIZADO - CONTROL DE ACCESO PROFESIONAL
' AUTOR: ARTURO CHAPA
' FECHA: JUNIO-2026
' Mas ejemplos y Codigos en:
' URL: https://www.aulaclickaccess.com/
'=======================================================================
Option Compare Database
Option Explicit

' VARIABLE GLOBAL: Almacena el ID de la sesión actual en la memoria del Frontend.
' Evita búsquedas lentas en red al momento de registrar la salida.
Public CurrentSessionID As Long

'-----------------------------------------------------------------------
' 1. DETECTAR CIERRES ABRUPTOS (Validación Preventiva)
'-----------------------------------------------------------------------
Public Sub ValidarSesionesAnteriores()
    Dim rs As DAO.Recordset
    Dim sUsuario As String
    Dim sSQL As String
    
    sUsuario = Environ("Username")
    
    ' Busca registros que se quedaron abiertos ("Activo") de este usuario
    sSQL = "SELECT * FROM tbl_LogAcceso " & _
           "WHERE Usuario='" & sUsuario & "' " & _
           "AND EstadoSesion='Activo'"
           
    Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset)
    
    Do While Not rs.EOF
        rs.Edit
        rs!FechaSalida = rs!FechaEntrada ' Forzamos salida idéntica a la entrada
        rs!TiempoConectado = "00:00:00"  ' <-- ? Formato corregido a HH:MM:SS
        rs!EstadoSesion = "Cierre Abrupto" ' <-- ? DETECTA CIERRES ABRUPTOS
        rs.Update
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
End Sub

'-----------------------------------------------------------------------
' 2. REGISTRAR ENTRADA (se llama desde Autoexec)
'-----------------------------------------------------------------------
Public Function RegistrarEntrada()
    Dim rs As DAO.Recordset
    
    ' Primero limpia cualquier sesión colgada del pasado
    Call ValidarSesionesAnteriores
    
    Set rs = CurrentDb.OpenRecordset("tbl_LogAcceso", dbOpenDynaset)
    
    rs.AddNew
    rs!Usuario = Environ("Username")
    rs!Equipo = Environ("ComputerName") ' <-- ? PERMITE AUDITORÍA BÁSICA (Rastrea PC)
    rs!FechaEntrada = Now()
    rs!EstadoSesion = "Activo"          ' <-- ? IDENTIFICA USUARIOS ACTIVOS
    rs.Update
    
    ' Obtener el ID autonumérico recién creado de forma segura y veloz
    rs.Bookmark = rs.LastModified
    CurrentSessionID = rs!ID
    
    rs.Close
    Set rs = Nothing
End Function

'-----------------------------------------------------------------------
' 3. REGISTRAR SALIDA (Cálculo exacto en HH:MM:SS) (Al cerrar Form)
'-----------------------------------------------------------------------
Public Function RegistrarSalida()
    Dim rs As DAO.Recordset
    Dim dSalida As Date
    Dim lSegundosTotales As Long
    Dim lHoras As Long
    Dim lMinutos As Long
    Dim lSegundos As Long
    
    ' Si la variable se perdió (ej. se editó código en caliente), busca el último activo
    If CurrentSessionID = 0 Then
        Set rs = CurrentDb.OpenRecordset( _
            "SELECT TOP 1 * FROM tbl_LogAcceso WHERE Usuario='" & Environ("Username") & "' AND EstadoSesion='Activo' ORDER BY ID DESC", dbOpenDynaset)
    Else
        ' ? COMPATIBLE CON RED: Busca directamente por ID único (Sin colisiones ni lentitud)
        Set rs = CurrentDb.OpenRecordset( _
            "SELECT * FROM tbl_LogAcceso WHERE ID = " & CurrentSessionID, dbOpenDynaset)
    End If
    
    If Not rs.EOF Then
        dSalida = Now()
        lSegundosTotales = DateDiff("s", rs!FechaEntrada, dSalida) ' <-- ? Cálculo por segundo
        
        ' Aritmética entera para separar las unidades de tiempo
        lHoras = Int(lSegundosTotales / 3600)
        lMinutos = Int((lSegundosTotales Mod 3600) / 60)
        lSegundos = lSegundosTotales Mod 60
        
        rs.Edit
        rs!FechaSalida = dSalida
        ' ? GUARDA DURACIÓN DE SESIÓN (Formato limpio de tiempo siempre HH:MM:SS)
        rs!TiempoConectado = Format(lHoras, "00") & ":" & _
                             Format(lMinutos, "00") & ":" & _
                             Format(lSegundos, "00")
        rs!EstadoSesion = "Finalizado"
        rs.Update
    End If
    
    rs.Close
    Set rs = Nothing
    CurrentSessionID = 0 ' Resetear variable global
End Function

'-----------------------------------------------------------------------
' 4. CONSULTA RÁPIDA: OBTENER TOTAL DE USUARIOS ACTIVOS
'-----------------------------------------------------------------------
Public Function TotalUsuariosActivos() As Long
    Dim rs As DAO.Recordset
    ' Devuelve instantáneamente cuántas personas están usando el sistema en la red
    Set rs = CurrentDb.OpenRecordset( _
        "SELECT COUNT(*) FROM tbl_LogAcceso WHERE EstadoSesion='Activo'", dbOpenSnapshot)
    
    TotalUsuariosActivos = rs(0)
    rs.Close
    Set rs = Nothing
End Function

No hay comentarios.:

Publicar un comentario

Entradas populares