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:
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.
Esta función muestra la última fecha y hora en que un usuario específico interactuó con el sistema.
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!!
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