В моей базе данных доступа у меня есть TABLE1, которая является связанной таблицей с таблицей сервера SQL 2005.У меня есть запрос QUERY1, который выбирает подмножество TABLE1, обрабатывает / форматирует некоторые из его данных и помещает эти данные во временную таблицу TMP_TABLE1 (т. Е. SELECT * INTO [TMPTABLE1] FROM [TABLE1]
).У меня также есть форма FORM1, которая имеет TMP_TABLE1 в качестве источника записей, где я могу просматривать и манипулировать данными.
Вот мой код, который выполняет эти задачи:
On Error Resume Next
DoCmd.DeleteObject acTable, "TMPTABLE1"
On Error GoTo 0
DoCmd.SetWarnings False
CurrentDb.Execute "QUERY1", dbSeeChanges
DoEvents
DoCmd.SetWarnings True
DoCmd.OpenForm "FORM1", acNormal, , , , acDialog
Проблема, с которой я сталкиваюсьявляется то, что моя FORM1 пытается открыть, прежде чем мой QUERY1 заканчивает обработку, и я получаю сообщение об ошибке, заявив, что моя таблица не существует.Я всегда воспринимал CurrentDb.Execute как синхронный запрос и только недавно столкнулся с таким поведением.Если я поставлю небольшую паузу или цикл, ожидающий создания таблицы перед открытием формы, моя процедура будет работать правильно.
К сожалению, это только один пример основной проблемы, которую я не могу исправить,Например, даже если я сохраняю временную таблицу и просто удаляю все записи и добавляю все новые записи, проблема остается.Это происходит в любых случаях, когда я манипулирую данными в коде перед их отображением на экране, такими как операторы INSERT, операторы UPDATE, объекты DAO.Recordset и ADODB.Recordset.
Я протестировал скомпилированный и не скомпилированный клиент в Windows 764-битная, Windows Vista 32-битная и Windows XP 32-битная и все они реагируют одинаково.Проблема носит прерывистый характер, и иногда запрос завершается быстро, и моя форма открывается правильно, но в 90% случаев она не открывается.
У кого-нибудь есть идеи относительно того, что я могу сделать?Может быть, настройки были изменены для запуска запросов по-другому?Может ли это быть параметр / параметр SQL Server 2005, который мне нужно изменить?
РЕДАКТИРОВАТЬ: Ниже приведен наиболее подробный код, который я мог бы попытаться подождать, пока таблица не будет готова, и она все еще не работает.Иногда моя процедура выполнения выдает ошибку, говорящую, что TMPTABLE1 уже существует, даже если я удаляю его в начале функции .:
On Error Resume Next
DoCmd.DeleteObject acTable, "TMPTABLE1"
On Error GoTo 0
Dim wrk As DAO.Workspace
Set wrk = DBEngine.Workspaces(0)
Dim dbs As DAO.Database
Set dbs = CurrentDb
wrk.BeginTrans
On Error GoTo TransErr
dbs.Execute "QUERY1", dbSeeChanges Or dbFailOnError
wrk.CommitTrans
TransResume:
Dim waitLoop As Long
Do While TableDefExists("_working_ReceivedMaterials") = False
waitLoop = GetTickCount
Do While GetTickCount < waitLoop + 100
DoEvents
Loop
Loop
DoCmd.OpenForm "ReceivedMaterials_Entry", acNormal, , , , acDialog
Exit Function
TransErr:
wrk.Rollback
GoTo TransResume