|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
А теперь как и тогда жду ADO'шников, все вопросы по этой теме пропали в туне. Я считаю что надо осветить и данную часть и указать какими способами можно запускать код емть ли там проблемы и если емсть то как они решаються... Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 14:13 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вот очередное творение... FAQ. Как избавиться от подтверждений на удаление и т.п. и как вообще запускать запросы из VBA. 1. Вопросы. 1.1. Как отключить подтверждения? 1.2. CurrentDb.Execute выдаёт ошибку, что делать? 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. Ошибка, как правило, возникает со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало парметров. Ожидалось Число"). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные парметры, - все эти обращения будут восприняты как параметры, которым не передано значение. Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ): MSDN писал: NOTE : В DAO Вы должны явно начить параметр; При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами назначить пременную в параметр, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает негласно с действиями DoCmd. С другой стороны, DoCmd работает на более высоком уровне чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, что сделать с параметрами - Вы не имеете никакой гибкости по использованию различных значений параметра. Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6.
Если вместо обращений к формам Вы используете собственные парметры (например [Введите начальную дату:], тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5.
NB! При открытии Crosstab Query с сылками на поля форм в качестве параметров надо действовать следующим образом: Код: plaintext 1. 2. 3.
Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной. Использования данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично. NB! Функция должна возвращать значение в любом случае. 2.3. Использование DoCmd.RunSQL. Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п.(в том числе и предупреждения об ошибках), до конца работы программы. Также есть возможность, что в отладочный период Вы можете остановить выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2.4. Противопоказания использования конструкции Application.SetOption. Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. Подтверждения не отключаются, если в приложении работает сам разработчик. 3. Дополнительная информация. 3.1. Возможность отката. CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. Пример отката внешней транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. В DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса. Опция dbFailOnError аналогична опции Use Transaction . Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:16 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>2. Ответы. >Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet, и что DoCmd.RunSQL(Access), CurrentDb.Execute(DAO), Connection.Execute(ADO) являются не более чем интерфейсами к Jet. в adp Jet'om не пахнет. Убери эту вводную >Application.SetOption "Confirm Document Deletions", False - нужно убрать ибо лишнее. конструкцию Dim q As QueryDef, p As Parameter заменить на Dim q As DAO.QueryDef, p As DAO.Parameter Во-первых хороший тон, во-вторых, в случае подключени ADO (с более высоким приорететом, чем DAO) p As Parameter фактически станет ADODB.Parameter ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:32 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
отчёт по данному запросу \r \r 1 - есть!\r 2 - не ну мы с тобой можем до ... мммм... обсуждать данный вопрос давай лучше спросим совета у обитателей родины великого и могучего.(извените если кого обидел). Только пожалуста никакаих нах Управляющих запросов Action Queres они и в Африке Action Queres. \r 3.1 - молния принята\r 3.2 - есть!\r 4 - есть!\r 5 - пропустил... вай-вай-вай\r вместо\r CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. \r читать\r CurrentDb.Execute в отличии от DoCmd.RunSQL - учавствует во внешней транзакции. \r в сурсах :) поменял...\r 6 - есть!\r 7 - есть!\r 8 - есть!\r \r ВНИМАНИЕ!!! РОЗЫСК!!! \r \r Ищут пожарные\r Ищет милиция \r Кто про ADO проговориться.\r \r По ADO нужна следущая инфа:\r есть ли там подобные проблемы\r если есть способы решения \r про внешнюю транзакцию\r просто про транзакцию\r \r И ещё две просьбы \r 1. Сказать по-русски название п.2.1. не искажая смысл\r 2. В п.2.2. есть выражение: один из нижележащих запросов тоже бы по-русски сказать...\r \r Ну и как обычно увидели что где не точно - не правильно - You are wellcome...\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:40 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 CВ & SV \r прям метеоры...\r \r 2 SV\r 1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило...\r 2. Не совсем понял почему лишнее, мои аргуменгты читай здесь\r 3. согласен\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:46 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило... ОК >Не совсем понял почему лишнее, мои аргуменгты читай здесь Аргумент свелся к "А если человек хочет избавиться от подтверждения на удаление таблицы/запроса Оставляю... " Дык речь идет yне идет об удалении объектов бд - а об "что лучше DoCmd.Run" Если хочешь - оставь - только надо (наверное) дать перевод на русский Application.SetOption "Confirm Record Changes", False - отмена подтверждения запросов на изменений записей во всей БД Application.SetOption "Confirm Document Deletions", False - отмена подтверждения удаления объектов БД (таблиц/запросов/форм/отчетов/макросов/страниц данных).!ОПАСНО!. Application.SetOption "Confirm Action Queries", False - подтверждение выполнения запросов на изменение структуры таблиц и бд (Data Definition Language (DDL)-запросы). В adp - отсуствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 15:18 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 SV 1. Спасибо 2. во-первых: это не прынцыпиально во-вторых: DROP TABLE тож можно запустить...и это будет DoCmd.RunSQL насчёт перевода: ну вообще большенство согласились что это не стоит юзать, так что пускай камикадзе сами трахаються... (после коньячка несколько рековат) Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 15:28 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
1. Начало - критика принимается. Не отлаживал - но вроде все правильно Если все параметры являються сслыками на контролы форм (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. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Если вместо обращений к формам Вы используете собственные парметры тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Все произошедшие ошибки заполняют коллекцию cnn.Errors. Объект Err - содержит только последнюю ошибку (хрен знает какую). Что бы получить всю информацию об ошибках при сmd.Execute/cnn.connectin.execute надо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Execute всегда выполняется в транзакции. Можно обернуть вызов нескольких Execute в одну транзакцию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
2.>во-вторых: DROP TABLE тож можно запустить...и это будет DoCmd.RunSQL Это будет "Confirm Action Queries" DDL-запрос. Или акес все равно спросит? 3. Согласен ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 15:59 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
1. буду посмотреть 2. спросит Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 16:07 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Итак, замечаю. Sfagnum писал:NB! Функция должна возвращать значение в любом случае. Функция и так возвращает значение в любом случае. Даже если ее тело не содержит ни одной строки, она вернет 0, "" и т.д. в зависимости от своего типа. Sfagnum писал:Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. Хотя эта формулировка вроде бы была предложена мной, я бы ее поправил: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие запросов на подтверждение при удалении/редактировании данных через экран. Кроме того, есть возможность по-разному комбинировать значения разных опций (т.е. написать не все три названных строки, а только некоторые из них). Sfagnum писал:CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. Вроде по приведенному примеру получается, что как раз участвует... Sfagnum писал:Если вместо CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. По-моему, надо еще раз проверить это все в зависимости от 4 параметров: CurrentDb.Execute или DoCmd.RunSQL; наличие или отсутствие параметра dbFailOnError или соответственно Use Transaction; Commit или Rollback; наличие или отсутствие ошибок в запросе - итого 16 случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2003, 18:53 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
1. Мдааа.... не точно написал, хотел просто написать, что-то типа значение должно присваиваться в ф-ии, в любом случае, чтоб не получить удивление от неожиданных результатов. Подумаю, перефразирую...\r \r 2. Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие сообщений на подтверждение при удалении/редактировании данных через экран. \r Это не запросы...\r \r 3. Я уже заметил здесь п.5. и поправился...\r \r 4. Внешняя транзакция работает только в представленном виде... и усё... проверено...\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 09:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
> Внешняя транзакция работает только в представленном виде Ррррбум. В таком представленном виде вообще ничего не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 11:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
т.е. п.3. тебе вообще на хрен не понятен? - обоснуй Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 13:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Кажется, я просто запутался. Вот проделаю сам все 16 случаев, тогда дойдет. :^) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 14:10 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Сделай как в примере... А остальные не будут позвалять полный откат Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 14:33 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Тут ввспомнили про этот FAQ и предложили его дописать...\r напоминаю проблемы:\r У SV тут были претензии по вводной к ответам, обещаного тут исправления нет...\r Перечитал перевод из MSDN - покоробило может кто \'причешет\'. \'Оригинал\' есть тута\r Какая ошипка вылетает при не правильном юзанье Connection.Execute(ADO).\r Ну и вообще замечания..\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:03 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вариант правки перевода: NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery этого делать не нужно, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, - Вы не имеете никакой гибкости по использованию различных значений параметра. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:10 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 ВС меня сколбасила фраза: авторВы не имеете никакой гибкости по использованию различных значений параметра. Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:14 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery этого делать не нужно, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой гибкости в этом отношении. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:33 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
теплее... но выражение давать гибкость.... это... :) ща ADO пытать буду... Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:39 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Тогда: никакой свободы. :^) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:40 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
вот для начала: Если все параметры являються сслыками на контролы форм (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. 31. 32. 33. 34. 35. 36.
Если вместо обращений к формам Вы используете собственные парметры тогда вам нужно задать параметры вручную: Код: 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.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
вопросы: 1. фраза 'или если не используете текущее соединение Set cnn = New adodb.Connection cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString " ' отношение к делу не имеет ИМХО. 2.в строке Forms("ИмяФормы")( Replace(p.Name, "@", "", 1, 1, vbTextCompare)) разве не должно быть какого то знака между скобочками? 3. Во 2-ом блоке кода добавил закрытие всякой хадости по аналогии, надеюсь я прав 4. По-поводу работы над ошибками - код сыроват, где Exit Sub, объявление и т.д., и т.п. 5. Насчёт транзакции пойдёт в п.3. 6. Надо шапку аналогичную как для CurrentDb.Execute. Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:52 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не надо никакого знака между скобками. Это как dbengine(0)(0). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:56 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
спасибо, буду знать... перевод предлагаю такой: авторNOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), то Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении. Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:58 |
|
|
start [/forum/topic.php?fid=45&msg=32307719&tid=1668945]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 245ms |
total: | 386ms |
0 / 0 |