Cómo apagar una aplicación de Access personalizada de forma remota

Avanzado: requiere conocimientos expertos de codificación, interoperabilidad y multiusuario.

Este artículo solo se refiere a una base de datos de Microsoft Access (.mdb o .accdb).

Resumen

A veces, es posible que tenga que realizar tareas de mantenimiento en una base de datos de Microsoft Access, como compactar o reparar, realizar copias de seguridad o realizar modificaciones de diseño. Muchas de estas operaciones requieren que todos los usuarios salgan de la base de datos. Sin embargo, no hay ninguna forma integrada de forzar a los usuarios a salir de Microsoft Access. Y no es una buena idea desconectar al usuario de las soluciones de red. Esto puede hacer que la base de datos se dañe.

En este artículo se muestra un enfoque que puede usar para apagar correctamente una aplicación de base de datos de Access de front-end. También puede usar muchos de estos conceptos para compactar o reparar la base de datos, realizar copias de seguridad, etc.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas.

Más información

Funcionamiento de la solución

La solución funciona de la siguiente manera. En un servidor, hay un archivo en una carpeta. Este archivo se puede denominar cualquier cosa. Para esta solución, se usa un archivo denominado chkfile.ozx. Cuando se cambia el nombre o se elimina este archivo, notifica a la aplicación front-end Access que tiene que cerrarse.

Se crea un formulario que se abre cuando los usuarios inician la aplicación de base de datos front-end. Este formulario comprueba la existencia del archivo en el servidor en un intervalo establecido. Para ello, usa la propiedad TimerInterval y el evento OnTimer.

Si se encuentra el archivo, no ocurre nada. Si no se encuentra el archivo, el formulario mostrará otro formulario para advertir al usuario de que la base de datos se cerrará automáticamente en un período de tiempo especificado.

Nota:

Esta solución no usa la función MsgBox para advertir al usuario. La función MsgBox esperará la entrada del usuario antes de ejecutar cualquier código. Esto anularía el propósito de la solución.

Para cerrar correctamente las sesiones de cliente, esta solución cambia el nombre del archivo que se está comprobando. Cuando todo lo que tiene que realizarse ha terminado, esta solución cambia el nombre del archivo al nombre original. Esto permite a los usuarios saber que pueden volver a iniciar la base de datos front-end.

Este proceso también se puede automatizar para proporcionar una operación desatendida mediante un servicio programado en el servidor que cambia el nombre de chkfile.ozx en momentos especificados.

Pasos para crear un escenario de ejemplo

Para demostrar cómo funciona esta solución, tendrá que tener lo siguiente:

  • Carpeta en el disco duro con una ruta de acceso de C:\MyData.
  • Un archivo vacío. Esta solución comprobará la presencia de este archivo.
  • Diseño de base de datos dividida con las tablas de un archivo de base de datos back-end y vínculos a esa tabla en la base de datos front-end. La base de datos front-end contendrá el código que comprueba la existencia del archivo en un intervalo establecido y, a continuación, advierte al usuario.

Creación de la carpeta para la aplicación de ejemplo

Cree una carpeta en el directorio raíz de la unidad C y asígnele el nombre MyData.

Creación del archivo de texto vacío

  1. Cree un nuevo archivo de texto en la carpeta MyData y asígnele el nombre chkfile.txt.
  2. Cambie el nombre del archivo de texto para que tenga una extensión de ozx (chkfile.ozx). Cuando se le pida, confirme que desea cambiar la extensión de archivo.

Creación de la base de datos back-end

  1. Cree una base de datos en la carpeta C:\MyData y asígnele el nombre Northwind_Be.mdb.
  2. Importe la tabla Customers de la base de datos de ejemplo Northwind a la base de datos Northwind_Be.mdb. (De forma predeterminada, Northwind se encuentra en C:\Archivos de programa\Microsoft Office\Office10\Samples).
  3. Cierre la base de datos.

Creación de la base de datos front-end

  1. Cree otra base de datos y asígnele el nombre Northwind_Fe.mdb.
  2. Vincule la tabla Customers de la base de datos Northwind_Be.mdb a la nueva Northwind_Fe.mdb
  3. Cree un AutoForm basado en la tabla Customers vinculada y guárdelo como frmCustomers. Cierre este formulario.

Creación del formulario con código que comprueba la existencia del archivo

  1. Cree un formulario sin enlazar y guárdelo con el nombre frmAppShutDown. En una base de datos de producción, este formulario normalmente siempre estaría abierto pero no visible. Para este ejemplo, se puede dejar abierto como de costumbre.
  2. Establezca la propiedad TimerInterval del formulario en 60000 milisegundos. Esto es igual a un minuto. (Para su propia solución, puede aumentar o retrasar este intervalo de tiempo).
  3. En Microsoft Office Access 2003 o en versiones anteriores de Access, en la vista Diseño del formulario frmAppShutDown, haga clic en Código en el menú Ver . En Microsoft Office Access 2007, en la vista Diseño del formulario frmAppShutDown, haga clic en la pestaña Diseño y, a continuación, haga clic en Ver código en el grupo Herramientas . Escriba o pegue el código siguiente:
Option Explicit
Dim boolCountDown As Boolean
Dim intCountDownMinutes As Integer

Private Sub Form_Open(Cancel As Integer)
    ' Set Count Down variable to false
    ' on the initial opening of the form.
    boolCountDown = False
End Sub

Private Sub Form_Timer()
On Error GoTo Err_Form_Timer
    Dim strFileName As String
    strFileName = Dir("c:\MyData\chkfile.ozx")
    If boolCountDown = False Then
        ' Do nothing unless the check file is missing.
        If strFileName <> "chkfile.ozx" Then
            ' The check file is not found so 
            ' set the count down variable to true and
            ' number of minutes until this session
            ' of Access will be shut down.
            boolCountDown = True
            intCountDownMinutes = 2
        End If
    Else
        ' Count down variable is true so warn
        ' the user that the application will be shut down
        ' in X number of minutes.  The number of minutes
        ' will be 1 less than the initial value of the
        ' intCountDownMinutes variable because the form timer
        ' event is set to fire every 60 seconds
        intCountDownMinutes = intCountDownMinutes - 1
        DoCmd.OpenForm "frmAppShutDownWarn"
        Forms!frmAppShutDownWarn!txtWarning = "This application will be shut down in approximately " & intCountDownMinutes & " minute(s).  Please save all work."
        If intCountDownMinutes < 1 Then
            ' Shut down Access if the countdown is zero,
            ' saving all work by default.
            Application.Quit acQuitSaveAll
        End If
    End If

Exit_Form_Timer:
    Exit Sub

Err_Form_Timer:
    Resume Next
End Sub

  1. Guarde y cierre el formulario.

Creación del formulario que servirá para advertir al usuario

Nota:

No use la función MsgBox para advertir al usuario. La función MsgBox esperará la entrada del usuario antes de ejecutar cualquier código. Esto anularía el propósito de la solución.

  1. Cree un formulario sin enlazar y asígnele el nombre frmAppShutDownWarn. Agregue el siguiente control de cuadro de texto:

    Name: txtWarning
    Type: Textbox
    
  2. Guarde y cierre el formulario.

  3. Cree una macro que abra el formulario frmCustomer y el formulario frmAppShutDown al inicio. Asigne a la macro el nombre autoexec.

  4. Cierre y vuelva a abrir la base de datos.

  5. Cambie el nombre de chkfile.ozx a chkfile.old.

Temporización de eventos de solución

Nota:

Todas las horas siguientes son aproximadas y comienzan después del cambio de nombre de chkfile.ozx.

  • Un minuto o menos: Northwind_FE.mdb observará que falta el archivo que se está comprobando.
  • Dos minutos: se abrirá un formulario en Northwind_FE.mdb, que le notificará que la base de datos se cerrará en un minuto.
  • Tres minutos: Northwind_FE.mdb se cerrará automáticamente y guardará todo el trabajo.