2.4. Использование DoCmd.RunSQL.
Иногда советуют поставить DoCmd.SetWarnings False передDoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п. (в том числе и предупреждения об ошибках) до конца работы программы. Также есть возможность, что в отладочный период Вы остановите выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом.
On Error Goto mis ...
DoCmd.SetWarnings False
DoCmd.RunSQL ...
DoCmd.SetWarnings True ...
Exit Sub mis:
DoCmd.SetWarnings True
2.5. Противопоказания к использованию конструкции Application.SetOption
Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия:
Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие подтверждений при удалении/редактировании данных через экран.
Подтверждения не отключаются, если в приложении работает сам разработчик.
2.6. Возможность отката
Нередко возникает необходимость при возникновении ошибок отменить результат исполнения целого ряда запросов. DoCmd.RunSQL такой возможности не дает. CurrentDb.Execute, в отличие от него, позволяет откатить транзакцию, в которую включено то, что посчитает нужным программист. В CurrentDb.Execute есть опция dbFailOnError - она относится только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос при ошибке откачен целиком и будет возвращена ошибка, или же возможно частичное выполнение запроса.
Пример отката внешней транзакции:
Public Function Test() On Error Goto Rollback_Label DBEngine(0).BeginTrans CurrentDb.Execute "Запрос1", dbFailOnError CurrentDb.Execute "Запрос2", dbFailOnError CurrentDb.Execute "Запрос3", dbFailOnError DBEngine(0).CommitTrans Exit_Label: Exit Function Rollback_Label: DBEngine(0).Rollback Resume Exit_Label End Function
В данном случае если не выполнится хотя бы один запрос, то все запросы "откатятся".
Комментариев нет:
Отправить комментарий