Pergunta

Eu tenho o seguinte código:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")
obj.Run "Routine"
obj.CloseCurrentDatabase
Set obj = Nothing

O problema que estou experimentando é um pop-up que informa que o Access não pode definir o foco no outro banco de dados.Como você pode ver no código, quero executar uma sub-rotina em outro mdb.Qualquer outra maneira de conseguir isso será apreciada.

Estou trabalhando com MS Access 2003.

Este é um erro intermitente.Como este é um código de produção que será executado apenas uma vez por mês, é extremamente difícil de reproduzir e não posso fornecer o texto e o número exatos neste momento.É o segundo mês que isso acontece.

Suspeito que isso possa ocorrer quando alguém estiver trabalhando com este ou outro banco de dados.

O fluxo de dados consiste em atualizar todos os 'projetos' uma vez por mês em um banco de dados e depois disponibilizar essas informações no outro banco de dados.

Talvez seja por causa da primeira linha do código 'Rotinas':Se vbno = msgBox ("Você deseja atualizar?", Vbyesno, "atualização") e depois saia da função final se

Vou fazer outra sub-rotina sem a MsgBox.

Consegui reproduzir esse comportamento.Acontece quando o foco tem que mudar para o banco de dados chamado, mas o usuário coloca o foco ([ALT]+[TAB]) no primeiro banco de dados.A 'solução' foi educar o usuário.


Este é um erro intermitente.Como este é um código de produção que será executado apenas uma vez por mês, é extremamente difícil de reproduzir e não posso fornecer o texto e o número exatos neste momento.É o segundo mês que isso acontece.

Suspeito que isso possa ocorrer quando alguém estiver trabalhando com este ou outro banco de dados.

O fluxo de dados consiste em atualizar todos os 'projetos' uma vez por mês em um banco de dados e depois disponibilizar essas informações no outro banco de dados.

Talvez seja por causa da primeira linha do código 'Rotinas':Se vbno = msgBox ("Você deseja atualizar?", Vbyesno, "atualização") e depois saia da função final se

Vou fazer outra sub-rotina sem a MsgBox.


Eu tentei isso em nosso banco de dados de desenvolvimento e funciona.Isso não significa nada, pois o outro código também funciona bem no desenvolvimento.

Foi útil?

Solução 3

Consegui reproduzir o erro no 'desenvolvimento'.

"Esta ação não pode ser concluída porque o outro aplicativo está ocupado.Escolha 'Mudar para' para ativar ...."

Eu realmente não consigo ver o resto da mensagem, pois ela está piscando muito rápido.Acho que esse erro se deve à 'alternância' entre os dois bancos de dados.Espero que, educando o usuário, isso pare.

Philippe, sua resposta está, obviamente, correta.Eu teria escolhido esse caminho se não tivesse desenvolvido a 'rotina' de antemão.

"Consegui reproduzir esse comportamento.Acontece quando o foco tem que mudar para o banco de dados chamado, mas o usuário coloca o foco ([ALT]+[TAB]) no primeiro banco de dados.A 'solução' foi educar o usuário." Como é impossível impedir que o usuário troque de aplicativo no Windows, gostaria de encerrar o assunto.

Outras dicas

Acho que esta mensagem de erro está ligada ao estado de um dos seus bancos de dados.Você está usando aqui conexões Jet e objetos Access e pode não conseguir, por vários motivos (ambiente multiusuário, incapacidade de excluir o arquivo LDB Lock, etc.), fechar corretamente seu banco de dados ativo e abrir outro.Então, na minha opinião, a solução é esquecer o motor Jet e usar outra conexão para atualizar os dados no "outro" banco de dados.

Quando você diz "O fluxo de dados é atualizar todos os 'projetos' uma vez por mês em um banco de dados e depois disponibilizar essas informações no outro banco de dados", presumo que o papel da sua "Rotina" seja atualizar alguns dados, seja via SQL instruções ou atualizações de conjuntos de registros equivalentes.

Por que você não tenta fazer as atualizações correspondentes abrindo uma conexão com seu outro banco de dados e (1) enviando as instruções SQL correspondentes ou (2) abrindo o conjunto de registros e fazendo as atualizações solicitadas?

Uma ideia seria por exemplo:

Dim cn as ADODB.connexion, 
    qr as string, 
    rs as ADODB.recordset

'qr can be "Update Table_Blablabla Set ... Where ...
'rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo  

set cn = New ADODB.connexion
cn.open

You can here send any SQL instruction (with command object and execute method) 
or open and update any recordset linked to your other database, then

cn.close

Isso também pode ser feito através de uma conexão ODBC (e DAO.recordsets), para que você possa escolher seus objetos favoritos.

Se desejar outro meio de executar a função, tente o seguinte:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")

obj.DoCmd.RunMacro "MyMacro"
obj.CloseCurrentDatabase
Set obj = Nothing

Onde 'Minha Macro'tem uma ação de'Executar código'com o nome da função que você prefere executar em Working.mdb

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top