Cómo cerrar remotamente una aplicación de Access

Avanzado: requiere conocimientos avanzados de código, interoperabilidad y multiusuario.

Este artículo se aplica únicamente a las bases de datos de Microsoft Access (.accdb o .mdb).

Resumen

A veces, quizás 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 en el diseño. Muchas de estas operaciones requieren que todos los usuarios salgan de la base de datos. Sin embargo, no hay ninguna manera integrada de obligar a los usuarios a salir de Microsoft Access. Y no es una idea buena simplemente desconectar al usuario de las soluciones de red. Eso puede hacer que la base de datos resulte dañada.

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

Microsoft proporciona ejemplos de programación solamente como ilustración, 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. En este artículo se da por supuesto que ya conoce el lenguaje de programación que se muestra, así como las herramientas empleadas 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

Cómo funciona la solución

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

Se genera un formulario que se abre cuando los usuarios inician la aplicación front-end de base de datos. Este formulario comprueba la existencia del archivo en el servidor a un intervalo fijo. Utiliza la propiedad TimerInterval y el evento OnTimer para ello.

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

NOTA: esta solución no utiliza la función MsgBox para advertir al usuario. La función MsgBox esperará que el usuario indique algo antes de ejecutar ningún código. Esto anularía el propósito de la solución.

Para cerrar ordenadamente las sesiones cliente, esta solución cambia el nombre del archivo que se comprueba. Cuando finaliza todo lo que hay que hacer, esta solución vuelve a cambiar el nombre del archivo al nombre original. Esto permite a los usuarios saber que pueden iniciar de nuevo la base de datos front-end.


Este proceso también se puede automatizar para proporcionar un funcionamiento desatendida utilizando un servicio programado en el servidor que cambie el nombre de chkfile.ozx a las horas especificadas.

Pasos para crear una situación de ejemplo

Para mostrar cómo funciona esta solución, tendrá que tener lo siguiente:
  • Una 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.
  • Un diseño de base de datos dividido con las tablas en 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 a un intervalo fijo y, a continuación, advertirá al usuario.
  • Crear 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.

    Crear el 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 ozx (chkfile.ozx). Cuando se le pregunte si desea cambiar la extensión del archivo, confirme la acción.

    Crear la base de datos back-end

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

    Crear la base de datos front-end

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

    Crear el formulario con código que comprueba la existencia del archivo

    1. Cree un formulario independiente y guárdelo con el nombre frmAppShutDown. En una base de datos de producción, este formulario siempre estaría abierto normalmente pero no visible. Para este ejemplo, se puede dejar abierto de la forma habitual.
    2. Establezca la propiedad TimerInterval del formulario en 60000 milisegundos. Esto equivale a un minuto. (Para su propia solución, puede aumentar o reducir 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 ficha 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
    4. Guarde el formulario y ciérrelo.

    Crear el formulario que servirá para advertir al usuario

    NOTA: no utilice la función MsgBox para advertir al usuario. La función MsgBox esperará que el usuario indique algo antes de ejecutar ningún código. Esto anularía el propósito de la solución.

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

      Nombre: txtWarning
      Tipo: Textbox
    2. Guarde el formulario y ciérrelo.
    3. Cree una macro que abrirá los formularios frmCustomer y frmAppShutDown en el inicio. Asigne a la macro el nombre
      autoexec.
    4. Cierre la base de datos y vuelva a abrirla.
    5. Cambie el nombre chkfile.ozx a chkfile.old.

Sincronizar los eventos de la 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 el archivo que se está comprobando no está presente.
  • Dos minutos: Se abrirá un formulario en Northwind_FE.mdb, que le notificará que la base de datos se cerrará dentro de un minuto.
  • Tres minutos: Northwind_FE.mdb se cerrará automáticamente y guardará todo el trabajo.

Referencias

Para obtener información relacionada, consulte los siguientes artículos de Microsoft Knowledge Base:
287655 ACC2002: Cómo utilizar el control de conexión para impedir que los usuarios inicien sesión en tiempo de ejecución
230575 ACC2000: Cómo iniciar Access utilizando el servicio de programación de Windows NT
303528 Como mantener una base de datos Jet 4.0 en buenas condiciones
Propiedades

Id. de artículo: 304408 - Última revisión: 31 oct. 2008 - Revisión: 1

Comentarios