Dicas do OsmarJr

Compactando banco de dados com VBScript


O Problema da Compactação
Se você trabalha com bancos de dados Microsoft Access com certeza já notou que o arquivo .mdb tende a “inchar” com o uso. Cada vez que você abra um formulário ou relatório em modo design, o arquivo .mdb cresce. Cada vez que você adiciona registros a uma tabela ou cria uma tabela temporária, o banco de dados cresce. E, contrariamente ao que se esperaria, deletar objetos, fechar o banco de dados ou excluir registros não reduz seu tamanho. Estas ações apenas fazem com que a diminuição de tamanho seja possível. A diminuição verdadeira é obtida executando-se um método DAO (Data Access Objects) chamado CompactDatabase.

By Danny Lesandrini

O método CompactDatabase pode ser executado de dentro do ambiente MS Access selecionando Compactar banco de dados (97) ou Compactar e reparar banco de dados (2k e superiores) no menu Ferramentas => Utilitários de bancos de dados. Este comando faz a compactação do banco de dados aberto no momento. Se você deseja compactar um banco de dados externo, como um back-end contendo as tabelas, pode executar uma linha de código semelhante a esta:

CODE
   Application.DBEngine.CompactDatabase "C:\Dados.mdb", "C:\DadosComp.mdb"

Esta linha de código funciona e faz o seu serviço... com uma condição: o Access deve estar sendo executado para funcionar.

Isto nem sempre é possível ou conveniente. E se você quiser compactar o .mdb à noite, quando nenhum usuário está acessando o banco de dados? Você poderia deixar um aplicativo Access executando, com um formulário aberto e colocar código meio complicado no evento No cronômetro do Formulário para que a linha de código seja executada. Isto parece excessivo e com grandes possibilidades de erro.
  • O aplicativo Access deve estar ativo a noite toda!... todas as noites!
  • E se um usuário bem intencionado fechar o aplicativo?
  • E se o computador for desativado?
  • É um bom uso dos seus recursos?

Já foi sugerido, alternativamente, que poderia ser usado o Scheduler do Windows (ou ferramenta similar) e colocar o código de CompactDatabase na macro AutoExec. Funciona e é uma melhoria à solução anteriormente apresentada, mas, se você vai agendar isto como um serviço, por que não transferir de um aplicativo Access, consumidor de recursos, para um Host Windows Scripting, o VBS script?

VBS ... uma solução melhor
A partir do VBS podemos usar a Automação COM para explorar o MS Access Object Model e chamar o método CompactDatabase. Isto é feito usando o método CreateObject para ativar uma variável de objeto no aplicativo MS Access. O código de exemplo inclui a sintaxe para instanciar objetos de aplicativo para o Access 97, 2000, XP e 2003.

Para usar o exemplo é necessário mudar apenas o nome do banco de dados, armazenado na variável strPathToMDB, para o caminho e nome do banco de dados que você deseja compactar. Cole o script abaixo no Notepad e salve-o como CompactaMDB.vbs (ou outro nome significativo). Execute o script clicando duas vezes no arquivo .vbs. verifique se o arquivo recém compactado existe, junto com uma cópia do .mdb original, com nome alterado para NomeArquivo.mdbX para sua segurança.

Agora que seu script foi criado e testado, pode ser adicionado ao Agendador de tarefas do Windows como um serviço a ser executado todas as noites, ou quando necessário e/ou prático. Os arquivos de dados podem ser compactados e backupeados automaticamente com um script de fácil manutenção.

CODE
' *****************  INÍCIO DO CÓDIGO  ' *****************
   '
   Dim objScript
   Dim objAccess
   Dim strPathToMDB
   Dim strMsg

   ' ///////////// NOTA:  Edite a variável nesta seção           /////
   '
   '  A linha de código a seguir é a única variável que deve ser editada.
   '  Forneça o caminho e o nome do banco de dados a ser compactado
   '
           strPathToMDB = "C:\EMSEnt.mdb"

   '
   ' ////////////////////////////////////////////////////////////////

   ' Crie um nome e caminho para o arquivo .mdb temporário

    strTempDB = "C:\Comp0001.mdb"

   ' Cria um Objeto de Aplicativo Access 97
   Set objAccess = CreateObject("Access.Application.8")

   ' Para o 2000, use Application.9
   'Set objAccess = CreateObject("Access.Application.9")

   ' Para o XP, use Application.10
   'Set objAccess = CreateObject("Access.Application.10")

   ' Para o 2003, use Application.11
   'Set objAccess = CreateObject("Access.Application.11")


   ' Executa a compactação do arquivo .mdb bo arquivo temporário
   ' (Se ocorrer um problema, o arquivo .mdb original será preservado)

   objAccess.DbEngine.CompactDatabase strPathToMDB ,strTempDB

   If Err.Number > 0 Then
       ' Ocorreu um erro. Informa ao usuário e para a execução
       strMsg = "Foi encontrado um erro ao compactar o banco de dados:"
       strMsg = strMsg & vbCrLf & vbCrLf & Err.Description
   Else
       ' Cria o File System Object para tratar a manipulação do arquivo
       Set objScript= CreateObject("Scripting.FileSystemObject")
   
       ' Copia o arquivo original como NomeArquivo.mdbX. No caso de erro indeterminado
       ' o arquivo pode ser recuperado simplesmente removendo o “X” final.

       objScript.CopyFile strPathToMDB , strPathToMDB & "X", True

       ' Copia o arquivo compactado para o nome do arquivo original
       objScript.CopyFile strTempDB, strPathToMDB, True

       ' Terminamos com o TempDB. Removemos.
       objScript.DeleteFile strTempDB
   End If

   ' Não esqueça de fazer a limpeza
   Set objAccess = Nothing
   Set objScript = Nothing
   '    
   ' ******************  FINAL DO CÓDIGO  *****************

 

 

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23