|
Compactando banco de dados com VBScript |
O Problema da Compactação
|
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.
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 *****************
|