Форма MS Access открывается до завершения запроса на создание таблицы. - PullRequest
0 голосов
/ 30 ноября 2011

В моей базе данных доступа у меня есть 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

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Access может иногда показывать странное поведение при удалении таблиц и их повторном создании, поэтому я не думаю, что ваш код перегружен сам по себе, я думаю, что лучшее решение - это изменить форму и изменить набор записей на ноль.Затем в вашем событии "On_Load" формы установите там набор записей, например:

Private Sub Form_Load ()

Me.Recordset = "SELECT * FROM TMPTABLE1"

End Sub

В качестве альтернативы, не удаляйте таблицу, просто запустите «DELETE FROM TMPTABLE1», а затем вместо запроса make table используйте «INSERT INTO TMPTABLE1 SELECT * FROM TABLE1»

2 голосов
/ 30 ноября 2011

Вы пытались выполнить

CurrentDb.TableDefs.Refresh

Перед открытием формы?

Dim db As DAO.Database

Set db = CurrentDb

On Error Resume Next
db.TableDefs.Delete "TMPTABLE1"
On Error GoTo 0

DoCmd.SetWarnings False
db.Execute "QUERY1"
DoCmd.SetWarnings True

db.TableDefs.Refresh

DoCmd.OpenForm "FORM1", WindowMode:=acDialog
db.Close: Set db = Nothing
...