Microsoft Access. Что делать когда запросы не выполняются подряд
Начну с примечания, считаю, что Access - это наиболее удобное средство для разработки небольших и средних баз данных. Однако, и тут бывают свои подводные камни.
Представьте себе, что у вас есть задача, в ходе которой вам нужно создавать временные таблицы и тут же обновлять в них данные. Для этого вы можете создать ряд запросов
- SELECT ... INTO tabletmp1
- UPDATE tabletmp1 SET ...
WHERE ... IN (SELECT ... FROM tabletmp1)
Запросы могут запускаться стандартными средствами VBA например после события нажатия кнопки на форме. В обработчике пишем следующее:
DoCmd.OpenQuery "Zapros2", acViewNormal, acEdit
Пусть у вас таких запросов с-десяток, и они выполняются в цикле (этого может требовать исходная задача, когда вам нужно каким-то определенным образом обновить пакет данных, а потом сохранить изменения).
Что при этом может произойти. Запрос2 начнет выполняться, не дожидаясь полного завершения запроса1. А данные естественно, которые должен обновлять запрос2, еще не внесены (временная таблица может уже существовать в базе данных). Понять такую заморочку мне удалось не сразу. Было странно, что часть данных в результате выполнения макроса куда-то исчезала. Запустив отладчик, я был удивлен еще больше, когда все, что мне было нужно, выполнилось правильно в пошаговом режиме. Продолжая экспериментировать, мне в голову пришла та мысль, которую я озвучил выше, и я попытался ее проверить. Поставив временные задержки между выполнениями запросов, мне удалось избежать потери данных, однако суммарное время таких задержек превышало 15 минут.
Тогда я попытался обратиться к MSDN. Мне удалось найти команду более низкого уровня для выполнения запросов
Однако эта команда не поддерживает запросы на DELETE и SELECT ... INTO table, если такая таблица уже существует. Тогда я попытался написать так
CurrentDb.Execute "Zapros1
Как вы думаете помогло? Правильно, нет. На этот раз у меня просто выскочила ошибка во время выполнения команды CurrentDB.Execute, что таблица в которую я хочу поместить данные этим запросом, существует. Но как, если я ее удаляю? Запустив отладчик, я был снова, но уже не так удивлен. На этот раз проблема выполнения одной команды, когда еще не завершилась другая, возникла между DoCmd.DeleteObject и CurrentDb.Execute.
Понять, как именно происходит распараллеливание задач Access'ом, мне так и не удалось. А вопрос, как его отключить, по-прежнему остается открытым.