|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Ах да за основу взято вот это сообщение Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2004, 09:55 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Мможет ФАК по DAO выложим отдельно... раз ADO никому не гужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2004, 11:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не добить ли нам этот фак... С учетом последних новостей: http://sql.ru/forum/actualthread.aspx?tid=127906 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2004, 22:08 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Господа, я взялся за добивание этого фака. Уже есть несколько распечатанных страниц, измалеванных непонятным почерком красной ручкой. Но прежде, чем я это дело опубликую здесь, у меня вопрос. Я попробовал запустить то, что в этом факе предлагается. Оказалось, что CurrentDb.Execute "a1", dbFailOnError, когда он натыкается на ошибку, выдает НА ЭКРАН сообщение об этом, причем у сообщения кнопка Continue законспирирована, при первой же ошибке юзер вынужден закрывать Аксесс. Фотка сообщения прилагается. Это то, что мы всем рекомендуем??? Как это отменить??? Фак-то посвящен отмене всяких сообщений на экране, между прочим... DoCmd.RunSQL, хоть с параметром, хоть нет, ведет себя аналогично, хотя и более цензурно. Он при ошибках спрашивает, хотим ли мы несмотря ни на что исполнить запрос. Отменить это удалось только через DoCmd.SetWarnings, т.е. через Application.SetOption не удалось. === (Вопрос был глупый, ответы на него удалены автором вопроса.) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 00:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
У меня очередной вопрос. SfagnumВ DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса. Ставил эту опцию и в True, и в False, но результат всегда одинаковый: запрос делает все по максимуму, целиком не откатывается. Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:14 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Use Transaction Select Yes to include this query in a transaction. Select No if you don't want to use a transaction. The default is Yes. Prior to Access 97, Access always included the query in a transaction when you ran this action by starting with a BeginTrans method, executing the SQL statement, and then concluding with a CommitTrans method. If you select No for this argument, the query may run faster. Так что не совсем ясно, откуда взялось утверждение: sfagnumбудет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
От моих транзакций он тоже не зависит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:23 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, а каким образом ты его пытаешься откатить? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:25 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вот мой тест: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
Запрос a0 добавляет в таблицу t1 числа 0, 10, 20; запрос a1 числа 1, 11, 21 (и он должен упасть, потому что число 1 там уже есть); запрос a2 числа 2, 12, 22. И я смотрю на количество записей после исполнения трех запросов. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
4 первых выполнения из 8 (где bDoCmd=-1) дают 9 записей независимо от значения параметра и от Rollback'а. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:32 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, ну не влияет твоё DBEngine.BeginTrans/Commit/Rollback на DoCmd.RunSQL И не может влиять никогда. Чтобы убедиться можешь сделать Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:36 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох ПозорныйСаныч, ну не влияет твоё DBEngine.BeginTrans/Commit/Rollback на DoCmd.RunSQL И не может влиять никогда. Чтобы убедиться можешь сделать Код: plaintext 1. 2.
А на что тогда влияет этот параметр??? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычА на что тогда влияет этот параметр??? Какой параметр? У меня нет никакой параметр! У меня есть только констатация факта, что в случае DoCmd - у тебя транзакция лишняя и никому не нужная. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:45 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох ПозорныйКакой параметр? У меня нет никакой параметр! Моя вопрос была про параметр. См. сегодня, 01:14 и далее. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:48 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Неужели никто не знает, для чего нужен параметр Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 14:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычНеужели никто не знает, для чего нужен параметр Код: plaintext
1) DoCmd.RunSQL работает "в отдельном сеансе соединения с базой данных", поэтому транзакции на текущем для mdb-проекта WorkSpace его не касаются. Выполнение такого запроса, как я понимаю, VBA-кодом не контроллируется. 2) [Use Transaction] используется, чтобы заключить в этом "внешнем" сеансе запрос в транзакционные скобки. Появление ошибки типа ошибки вставки НЕ является основанием для отката транзакции. 3) Поведение mdb по умолчанию заключается в том, что частичное выполнение запроса разрешено. Появляющиеся ошибки вставки транслируются в err для варианта исполнения Execute. Для DoCmd.RunSQL они транслируются в предупреждения о количестве обновляемых записей и (отключаемые через DOCMD.SetWarnings) В варианте Execute результат (без учета транзактных скобок) предопределен наличием или отсутствием битового флага dbFailOnError - если присутствует, - действие запроса отменяется при наличии ошибок , иначе изменения производятся. Это НЕ связано с последующим подтверждением или откатом транзакции, а является - не знаю как сказать - скорее вариантом поведения при исполнении массовой операции. Транзакционный Commit и "поведение по dbFailOnError" - непосредственно не связано друг с другом. Точнее их связь такая же как связь между транзакционными скобками и циклом изменений на рекордсете В варианте DoCmd.RunSQL - результат определяется реакцией пользователя на системное предупреждение. В случае DOCMD.SetWarnings False я не знаю, как его "установить по умолчанию", и склонен думать, что прямого аналога dbFailOnError (с учетом нижеследующих замечаний) нет. 4) Возможно, поведение по умолчанию для DoCmd.RunSQL может быть изменено. Намеком на это является наличие параметра соединения Jet OLEDB:Global Bulk Transactions Однако, как им воспользоваться непосредственно при открытии mdb проекта - я не знаю ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 15:39 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Да, и еще, всякое "масовое поведение", как помню, документируется для апдейтов и дилитов, про инсерты вообще никто никому ничего... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 15:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Цветику, конечно, спасибо. Но вопрос остался в полном объеме... Зачем нужен параметр Use Transaction? На что он влияет? Когда им пользоваться? Какой тест можно провести, чтобы увидеть разницу в работе DoCmd.RunSQL с параметром и без? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 15:43 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычЦветику, конечно, спасибо. Но вопрос остался в полном объеме... Зачем нужен параметр Use Transaction? На что он влияет? Когда им пользоваться? Какой тест можно провести, чтобы увидеть разницу в работе DoCmd.RunSQL с параметром и без? Польза - не будет (не должно быть) частичного изменения базы в случае, когда, например, потеряна связь с базой в процессе выполнения запроса (до его завершения). подтверждается весь пакет буферизованных изменений. Вред - дополнительная буферизация + блокировки - расход ресурсов+ время исполнения. Я не знаю, когда им НУЖНО пользоваться. Потому как процесс слабоконтроллируем. Хоть оно и похоже на sp_executesql, но польза вилится меньшая. Я не использую DoCmd.RunSQL - не возникало даже движения мысли в этом направлении. Можно воспользоваться, например, при выполнении запроса на вставку в таблицу (добавление записей), когда ограничения на первичный ключ достаточно, чтобы отфильтровать "лишние" записи - они не будут вставлены по нарушению уникальности первичного ключа, но, в то же время, желательно гарантировать "обработку пакета в транзакции". Вариант теста - длинный запрос на линкованной с сеиевого ресурса таблице с к-вом записей >>10000 - то есть чтобы много секунд выполнялся. а) наблюдение за к-вом отъеденной в системе памяти и локальной файловой активностью. б) выдергивание сетевого шнура посреди выполнения запроса без транзакции и внутри нее. ЗЫ Санычу, конечно, всегда пожалуйста... :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:04 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Ишо раз спасибо. И за выражение лица в том числе. :^))) Короче, я понял, что про этот параметр можно в этом факе ничего не говорить. Этот параметр к теме этого фака не имеет отношения. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:12 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычИшо раз спасибо. И за выражение лица в том числе. :^))) Короче, я понял, что про этот параметр можно в этом факе ничего не говорить. Этот параметр к теме этого фака не имеет отношения. в том смысле, чтобы от него избавиться - точно не имеет... Как и в том смысле, что избавившись от подтверждений - (кажется) невозможно отменить результат выполнения DOCMD.RunSQL, если он вообще хоть как-то завершается... :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ЦветикКак и в том смысле, что избавившись от подтверждений - (кажется) невозможно отменить результат выполнения DOCMD.RunSQL, если он вообще хоть как-то завершается... Ну, если человек хочет избавиться от подтверждений, то он, наверно, заранее подразумевает Yes to all. Так что возможность отменять результат ему не очень-то и нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:26 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
как бы да. Это разница между execute и runsql. раз уж они тут сопоставились... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:44 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Итак. Вот версия, в которой я попытался учесть все, что до сих пор было сказано. Теперь можно ее править. FAQ. Как избавиться от подтверждений на удаление и т.п. и как вообще запускать запросы из VBA 1. Вопросы. 1.1. Как отключить подтверждения? 1.2. Execute либо OpenRecordset выдаёт ошибку, что делать? 1.3. Как правильно использовать DoCmd.RunSQL? 1.4. Почему нельзя использовать конструкцию Application.SetOption? 2. Ответы. Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet и что DoCmd.RunSQL ( Access ), CurrentDb.Execute ( DAO ), Connection.Execute ( ADO ) являются не более чем интерфейсами к Jet . 2.1. Методы отключения сообщений на подтверждение при запуске Action Queres . Подтверждения отключаются следующими способами (ответы перечислены в порядке применимости): Перейти на использование конструкции CurrentDb.Execute Использовать вместе с DoCmd.RunSQL, DoCmd.SetWarnings False Изменить глобальные настройки с помощью конструкции Код: plaintext 1. 2. 3.
2.2 Устранение ошибок в CurrentDb.Execute и в CurrentDb.OpenRecordset Ошибка, как правило, возникает со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало параметров. Ожидалось Число"). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные параметры, - все эти обращения будут восприняты как параметры, которым не передано значение. Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ): MSDN NOTE : В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Аксесс делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении. Если все параметры являются ссылками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Если вместо обращений к формам Вы используете собственные параметры (например, [Введите начальную дату:]), тогда Вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5.
Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5.
Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной. Использование данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично. Если аналогичное явление происходит не при CurrentDb.Execute, а при CurrentDb.OpenRecordset, то годятся все те же решения. При этом если параметры задаются вручную, то открывать рекордсет надо так: Код: plaintext 1.
В перекрестных запросах возникает то же явление. Правда, оно возникает не при попытке запуска (ибо перекрестный запрос не является Action Query), а при любом использовании, например при открывании формы, основанной на таком запросе. В этом случае надо действовать следующим образом: Код: plaintext 1. 2. 3.
2.3 Устранение ошибок в Command.Execute Если все параметры являються ссылками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Если вместо обращений к формам Вы используете собственные параметры, тогда Вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
2.4. Использование DoCmd.RunSQL. Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п. (в том числе и предупреждения об ошибках) до конца работы программы. Также есть возможность, что в отладочный период Вы остановите выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2.5. Противопоказания к использованию конструкции Application.SetOption Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие подтверждений при удалении/редактировании данных через экран. Подтверждения не отключаются, если в приложении работает сам разработчик. 2.6. Возможность отката CurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции. Пример отката внешней транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 21:47 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
авторCurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции. Саныч, - как бы просто не вполне корректное некорректное высказывание. Дешевле удалить... дальше, про пример отката автор Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками Саныч, они "не выполнятся" если Предупреждения НЕ отключены, И пользователь отказался от завершения выполнения запроса (при этом не важно - произошли ошибки ли нет). Во всех остальных случаях, в частности при возникновении ошибок, если DoCmd.RunSQL выполняет action query, он выполнится, если там окажется хоть что-то пригодное для выполнения (найдутся строки для делета, апдейта или инсерта, на которых лшибок не произойдет ) - частичное выполнение я не знаю как отключить в Акцессе. Если ты знаешь как - то прилично об этом сказать явно :) ЗЫ вот окультурился севодни, впервые за два последних года. теперь жму клаву окультуренный... (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:26 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Опечатки: 1. сслыками -2 раза 2.Если вместо обращений к формам Вы используете собственные парметры , тогда Вам нужно задать параметры вручную: Пункт 2.5 - использованы оба термина - аппликация и приложение, стилистически лучше бы один. Мелочь, конечно, прошу извинить за занудность :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:35 |
|
|
start [/forum/topic.php?fid=45&msg=32868234&tid=1668945]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 238ms |
total: | 378ms |
0 / 0 |