2008-09-16 2 views
2

У меня есть следующий код:Периодическая ошибка при попытке контролировать другую базу данных в VBA

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

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

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

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

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

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

Может быть, это из-за первой строки в коде 'ROUTINES': Если vbNo = MsgBox ("Вы хотите обновить?", VbYesNo, "Обновление") Затем Exit Function End If

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

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


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

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

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

Может быть, это из-за первой строки в коде 'ROUTINES': Если vbNo = MsgBox ("Вы хотите обновить?", VbYesNo, "Обновление") Затем Exit Function End If

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


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

+0

Я никогда не видел, чтобы Access дал это конкретное сообщение об ошибке. Я видел, что «у вас нет разрешения на открытие базы данных» и «Доступ не может сфокусироваться» на объекте, но не на сообщении об ошибке. Не могли бы вы разместить номер ошибки и точное сообщение об ошибке? Я подозреваю, что, как говорит Реми, ошибка в коде в вашей рутине в другом db, поэтому вам, вероятно, тоже придется опубликовать это сообщение. – 2008-09-16 12:23:24

ответ

1

Я смог воспроизвести ошибку в 'development'.

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

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

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

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

1

Я думаю, это сообщение об ошибке связано с состоянием одной из ваших баз данных. Вы используете здесь соединения 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), так что вы можете выбрать ваши любимые предметы.

1

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

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

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

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

Смежные вопросы