Периодическая ошибка при попытке управления другой базой данных в VBA - PullRequest
2 голосов
/ 16 сентября 2008

У меня есть следующий код:

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

Проблема, над которой я экспериментирую, - это всплывающее окно, которое говорит мне, что Access не может установить фокус на другую базу данных. Как вы можете видеть из кода, я хочу запустить подпрограмму в другом mdb. Любой другой способ достижения этого будет оценен.

Я работаю с MS Access 2003.

Это временная ошибка. Поскольку это производственный код, который будет запускаться только один раз в месяц, его очень сложно воспроизвести, и я не могу дать вам точный текст и номер на данный момент. Это второй месяц, когда это произошло.

Я подозреваю, что это может произойти, когда кто-то работает с этой или другой базой данных.

Поток данных должен обновлять все «проекты» один раз в месяц в одной базе данных, а затем предоставлять эту информацию в другой базе данных.

Возможно, это из-за первой строки в коде 'Routines': Если vbNo = MsgBox («Хотите обновить?», VbYesNo, «Обновить»), то Функция выхода Конец, если

Я сделаю еще одну подпрограмму без MsgBox.

Мне удалось воспроизвести это поведение. Это происходит, когда фокус должен сместиться на вызываемую базу данных, но пользователь устанавливает фокус ([ALT] + [TAB]) на первую базу данных. «Решением» было обучение пользователя.


Это временная ошибка. Поскольку это производственный код, который будет запускаться только один раз в месяц, его очень сложно воспроизвести, и я не могу дать вам точный текст и номер на данный момент. Это второй месяц, когда это произошло.

Я подозреваю, что это может произойти, когда кто-то работает с этой или другой базой данных.

Поток данных должен обновлять все «проекты» один раз в месяц в одной базе данных, а затем предоставлять эту информацию в другой базе данных.

Возможно, это из-за первой строки в коде 'Routines': Если vbNo = MsgBox («Хотите обновить?», VbYesNo, «Обновить»), то Функция выхода Конец, если

Я сделаю еще одну подпрограмму без MsgBox.


Я пробовал это в нашей базе данных разработки, и она работает. Это ничего не значит, так как другой код также отлично работает в разработке.

Ответы [ 3 ]

1 голос
/ 17 сентября 2008

Если вам нужен другой способ запуска функции, попробуйте следующее:

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

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

Где ' MyMacro ' имеет действие ' RunCode ' с именем функции, которое вы бы предпочли выполнить в Working.mdb

1 голос
/ 17 сентября 2008

Мне удалось воспроизвести ошибку в «разработке».

"Это действие невозможно выполнить, так как другое приложение занято. Выберите« Переключить на », чтобы активировать ....»

Я действительно не вижу остальной части сообщения, так как оно очень быстро мигает. Я предполагаю, что эта ошибка связана с «переключением» между двумя базами данных. Я надеюсь, что, обучая пользователя, это остановится.

Филипп, ваш ответ, конечно, правильный. Я бы выбрал этот путь, если бы не разработал «рутину» заранее.

«Мне удалось воспроизвести это поведение. Это происходит, когда фокус должен сместиться на вызываемую базу данных, но пользователь устанавливает фокус ([ALT] + [TAB]) на первую базу данных. было обучить пользователя. " Поскольку невозможно запретить пользователю переключать приложения в Windows, я хотел бы закрыть тему.

1 голос
/ 16 сентября 2008

Полагаю, это сообщение об ошибке связано с состоянием одной из ваших баз данных. Здесь вы используете соединения Jet и объекты Access, и по ряду причин (многопользовательская среда, невозможность удалить файл блокировки LDB и т. Д.) Вы не сможете правильно закрыть активную базу данных и открыть другую. Поэтому, по моему мнению, решение состоит в том, чтобы забыть о двигателе Jet и использовать другое соединение для обновления данных в «другой» базе данных.

Когда вы говорите «Поток данных состоит в том, чтобы обновлять все« проекты »один раз в месяц в одной базе данных, а затем делать эту информацию доступной в другой базе данных», я предполагаю, что роль вашей «подпрограммы» заключается в обновлении некоторых данных, либо с помощью инструкций SQL или эквивалентных обновлений набора записей.

Почему бы вам не попробовать сделать соответствующие обновления, открыв соединение с другой базой данных и (1) отправив соответствующие инструкции SQL или (2) открыв набор записей и выполнив запрошенные обновления?

Например, одна идея:

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

Это также можно сделать через соединение ODBC (и DAO.recordsets), так что вы можете выбрать ваши любимые объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...