Como encerrar remotamente uma aplicação personalizada do Access

Avançado: requer codificação especializada, interoperabilidade e competências multiutilizadas.

Este artigo aplica-se apenas a uma base de dados do Microsoft Access (.mdb ou .accdb).

Resumo

Por vezes, poderá ter de realizar tarefas de manutenção numa base de dados do Microsoft Access, como compactar ou reparar, fazer cópias de segurança ou efetuar modificações de estrutura. Muitas destas operações exigem que todos os utilizadores saiam da base de dados. No entanto, não existe uma forma incorporada de forçar os utilizadores a abandonarem o Microsoft Access. E não é boa ideia desligar apenas o utilizador das Soluções de rede. Isto pode fazer com que a base de dados fique danificada.

Este artigo mostra-lhe uma abordagem que pode utilizar para encerrar corretamente uma aplicação de base de dados do Access de front-end. Também pode utilizar muitos destes conceitos para compactar ou reparar a base de dados, fazer cópias de segurança, etc.

A Microsoft fornece exemplos de programação apenas a título informativo, sem qualquer garantia expressa ou implícita, incluindo, sem limitações, as garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que o utilizador está familiarizado com a linguagem de programação demonstrada e as ferramentas utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às suas necessidades específicas.

Mais informações

Como Funciona a Solução

A solução funciona da seguinte forma. Num servidor, existe um ficheiro numa pasta. Este ficheiro pode ter o nome de qualquer coisa. Para esta solução, é utilizado um ficheiro com o nome chkfile.ozx. Quando este ficheiro é renomeado ou eliminado, notifica a aplicação do Access de front-end que tem de fechar.

É criado um formulário que é aberto quando os utilizadores iniciam a aplicação de base de dados de front-end. Este formulário verifica a existência do ficheiro no servidor num intervalo definido. Utiliza a propriedade TimerInterval e o evento OnTimer para o fazer.

Se o ficheiro for encontrado, nada acontece. Se o ficheiro não for encontrado, o formulário apresentará outro formulário para avisar o utilizador de que a base de dados será fechada automaticamente num determinado período de tempo.

Nota

Esta solução não utiliza a função MsgBox para avisar o utilizador. A função MsgBox aguardará pela entrada do utilizador antes de executar qualquer código. Isto iria derrotar o propósito da solução.

Para fechar corretamente as sessões de cliente, esta solução muda o nome do ficheiro que está a ser verificado. Quando tudo o que tem de ser realizado estiver concluído, esta solução muda o nome do ficheiro novamente para o nome original. Isto permite que os utilizadores saibam que podem iniciar novamente a base de dados de front-end.

Este processo também pode ser automatizado para fornecer uma operação autónoma através de um serviço agendado no servidor que muda o nome de chkfile.ozx em alturas especificadas.

Passos para Criar um Cenário de Exemplo

Para demonstrar como funciona esta solução, terá de ter o seguinte:

  • Uma pasta no disco rígido com um caminho de C:\MyData.
  • Um ficheiro vazio. Esta solução irá verificar a presença deste ficheiro.
  • Uma estrutura de base de dados dividida com as tabelas num ficheiro de base de dados de back-end e ligações para essa tabela na base de dados de front-end. A base de dados de front-end irá conter o código que verifica a existência do ficheiro num intervalo definido e, em seguida, avisa o utilizador.

Criar a pasta para a aplicação de exemplo

Crie uma pasta no diretório de raiz da unidade C e dê-lhe o nome MyData.

Criar o ficheiro de texto vazio

  1. Crie um novo ficheiro de texto na pasta MyData e dê-lhe o nome chkfile.txt.
  2. Mude o nome do ficheiro de texto para que tenha uma extensão de ozx (chkfile.ozx). Quando lhe for pedido, confirme que pretende alterar a extensão do ficheiro.

Criar a base de dados de back-end

  1. Crie uma nova base de dados na pasta C:\MyData e dê-lhe o nome Northwind_Be.mdb.
  2. Importe a tabela Clientes da base de dados de exemplo northwind para a base de dados Northwind_Be.mdb. (Por predefinição, a Northwind está localizada em C:\Programas\Microsoft Office\Office10\Samples.)
  3. Feche a base de dados.

Criar a base de dados de front-end

  1. Crie outra nova base de dados e dê-lhe o nome Northwind_Fe.mdb.
  2. Ligar a tabela Clientes da base de dados Northwind_Be.mdb ao novo Northwind_Fe.mdb
  3. Crie um Formulário Automático com base na tabela Clientes ligada e guarde-o como frmCustomers. Feche este formulário.

Criar o formulário com código que verifica a existência do ficheiro

  1. Crie um formulário não vinculado e guarde-o com o nome frmAppShutDown. Numa base de dados de produção, este formulário normalmente estaria sempre aberto, mas não visível. Para este exemplo, pode ser deixado aberto como habitualmente.
  2. Defina a propriedade TimerInterval do formulário como 60 0000 milissegundos. Isto é igual a um minuto. (Para a sua própria solução, pode aumentar ou diminuir este intervalo de tempo.)
  3. No Microsoft Office Access 2003 ou em versões anteriores do Access, na vista Estrutura do formulário frmAppShutDown, clique em Código no menu Ver . No Microsoft Office Access 2007, na vista Estrutura do formulário frmAppShutDown, clique no separador Estrutura e, em seguida, clique em Ver Código no grupo Ferramentas . Escreva ou cole o seguinte código:
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 e, em seguida, feche o formulário.

Criar o formulário que servirá para avisar o utilizador

Nota

Não utilize a função MsgBox para avisar o utilizador. A função MsgBox aguardará pela entrada do utilizador antes de executar qualquer código. Isto iria derrotar o propósito da solução.

  1. Crie um formulário não vinculado e dê-lhe o nome frmAppShutDownWarn. Adicione o seguinte controlo de caixa de texto:

    Name: txtWarning
    Type: Textbox
    
  2. Guarde e feche o formulário.

  3. Crie uma macro que abra o formulário frmCustomer e o formulário frmAppShutDown no arranque. Dê o nome autoexec à macro.

  4. Feche e reabra a base de dados.

  5. Mude o nome chkfile.ozx para chkfile.old.

Temporização dos Eventos de Solução

Nota

Todas as horas seguintes são aproximadas e começam após o nome de chkfile.ozx.

  • Um minuto ou menos: Northwind_FE.mdb irá reparar que o ficheiro que está a ser verificado está em falta.
  • Dois minutos: será aberto um formulário no Northwind_FE.mdb, notificando-o de que a base de dados será fechada dentro de um minuto.
  • Três minutos: Northwind_FE.mdb fechará automaticamente e guardará todo o trabalho.