powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
25 сообщений из 156, страница 1 из 7
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245079
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.RunSQL или CurrentDb.Execute?

1. Вопросы.

1.1. Как отключить подтверждения?
1.2. CurrentDb.Execute выдаёт ошибку, что делать?
1.3. Как правильно использовать DoCmd.RunSQL?
1.4. Почему нельзя использовать конструкцию Application.SetOption?

2. Ответы.
Ответы перечислены в порядке применимости.

2.1. Подтверждения отключаються следующими способами:
Перейти на использование конструкции CurrentDb.Execute.

Использовать вместе с DoCmd.RunSQL, DoCmd.SetWarnings False

Изменить глобальные настройки с помощью кострукций
Код: plaintext
1.
2.
Application.SetOption  "Confirm Record Changes" , False
Application.SetOption  "Confirm Document Deletions" , False
Application.SetOption  "Confirm Action Queries" , False
NB!!! (Категорически НЕ рекомендуется).

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.
Dim q As QueryDef, p As Parameter 
Set q = CurrentDb.QueryDefs( "ИмяЗапрса" )  'как обычного запроса Select так и INSERT/DELETE/UPDATE'
For Each p In q.Parameters 
p.Value = p.Name 
Next 
q.Execute 
q.close: set q=Nothing

Если вместо обращений к формам Вы используете собственные парметры (например [Введите первый параметр:]), тогда вам нужно задать параметры вручную:
Код: plaintext
1.
2.
3.
4.
5.
Dim q As QueryDef, p As Parameter 
Set q = CurrentDb.QueryDefs( "ИмяЗапрса" )  'как обычного запроса Select так и INSERT/DELETE/UPDATE'
q.Parameters( "[Введите первый параметр:]" ).Value = Ваше_значение_парметра
'и т.д. пока не переберете все парметры'
q.Execute 
q.close: set q = Nothing

Узнать какие параметры от вас хочет Access можно с помощью следующего кода:
Код: plaintext
1.
2.
3.
4.
5.
Dim q As QueryDef, p As Parameter 
Set q = CurrentDb.QueryDefs( "ИмяЗапрса" )  'как обычного запроса Select так и INSERT/DELETE/UPDATE'
For Each p In q.Parameters 
debug.print p.Name 
Next 
q.close: set q=Nothing

2.3. Использование DoCmd.RunSQL.
Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать сообщения об ошибках до конца работы программы.
Также есть возможность, что в отладочный период Вы можете остановить выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат.
Но если Вы решили использовать данную конструкцию, то используйте её следующим образом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
On Error Goto mis
...
DoCmd.SetWarnings False
DoCmd.RunSQL ...
DoCmd.SetWarnings True
…
Exit Sub
mis:
DoCmd.SetWarnings True
NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не производиться.

2.4. Противопоказания использования конструкции Application.SetOption
Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия:
Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран.
Подтверждения не отключаются, если в аппликации работает сам разработчик.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245083
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вытерпела душа поэта, кинул раньше

Как говориться - пожалуйте, терзайте...

да ещё меня смущает название FAQ'a
и строчка в п.2.2. (первый блок кода)
Код: plaintext
p.Value = p.Name 
у меня так не работает..., а в таком виде
Код: plaintext
p.Value = Eval(p.Name)
беспроблем
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245087
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ещё очень хотелось бы услышать мнение, и несколько строчек в ФАК от ЛП и SV
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245126
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Насчет Eval была моя реплика в том топике, откуда ты копировал.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245141
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Маленькая просьба - я бы хотел, чтобы этот фак не публиковался до моего возвращения из армии 3 числа. (На правах просьбы, исполнять не обязательно.)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245181
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маленькая ремарка на
>NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не
>производиться.
читаем хелп и видим
DoCmd.RunSQL инструкцияSQL[, использоватьТранзакцию]
причем по умолчанию второй параметр True.
так что мелочь, но приятно.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245273
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Драсте...

1) Сдается мне, что на вопрос надо смотреть несколько шире, например так: "FAQ: Запуск SQL-запросов из VBA-кода";

2) Возможно стоит упомянуть, что выполнять запрос будет непосредственно Jet, и что DoCmd.RunSQL (Access), DB.Execute (DAO), Connection.Execute (ADO) являются не более чем интерфейсами к Jet. Это, конечно, элементарно, но где-то натыкался на мнение, что запросы запущенные из ADO выполняются быстрее чем запросы, запущенные из DAO, что полная ерунда! Время, занимаемое в библиотеках при предварительной обработке команды, конечно, разное, но запрос в итоге будет передан ядру Jet, которое и его выполнит;

3) Ну и коль скоро я коснулся скорости выполнения, то думаю, что стоит упомянуть и об асинхронном выполнении запроса. Что это такое, в чем плюсы и минусы, какие проблемы могут возникнуть и как их избежать...

Но все это, конечно, ИМХО... //в смысле, сорри, если чё не так...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245275
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Нуф, рад тебя видеть. Согласен со всем сказанным на все сто. А про п.3 - может, ты сам и расскажешь? :^)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245286
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, тоже рад! :) Правда, получается вас (всех) только "читать", да и то с перерывами :(

На счет третьего пункта я могу попробовать что-нить родить, но тока в течении следующей недельки... Не быстро, тобишь...

Удачи! //уехал к лубимой дэвушке, которая, зараза :), жмет ее рабочий ноутбук - толи из-за того, что я за ним перестаю замечать, собстна, дэвушку, толи из-за "топ сикрет информэйшен" на нем Не... Попробую, сётаки, выкляньчить доступ к "железу" на выходные :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245290
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Нуф, не торопись. Во-первых, девушка важнее. И во-вторых тоже. А в-третьих, я все равно только 3 числа из армии вернусь.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245305
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тож просьба - не публиковать до моего окончательного выхода из отпуска (ближайший понедельник)

По поводу первого замечания Нуф-Нуфа (привет кстати!)
"Как избавиться от подтверждений..." все-таки более фрикуентли аскед, чем "Как запускать запросы...". Так что в названии оставить надо. Можно совместить - "Как избавиться от подтверждений ... трататушки-тратату... (как запускать запросы из VBA)"

2 Мох (который Sfagnum)

QueryDef.Execute dbFailOnError

Прочитай в хелпе в расскажи другим
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245310
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не производиться.
Не есть правильно
Используется ли транзакция - устанавливается в св-вах запроса. И даже если используется - она своя собственная, никак не зависящая от внешней (сделанной через BeginTrans/Commit).
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245311
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрать
Код: plaintext
Application.SetOption  "Confirm Document Deletions" , False

тогда не нужно будет
Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245312
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать сообщения об ошибках до конца работы программы
Не сообщения об ошибках, а перестанет выдавать подтверждения на удаление и т.п.

Все
Ушел пить вотку
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245314
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох, с приехалом.

"Данных через экран" - все равно придется оставить.

...А теперь я сочувствую тому человеку, который будет все эти комментарии собирать по крохам и вносить все эти заплатки. Видимо, этим человеком буду я (как бывший корректор).
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245315
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Нет, именно сообщения об ошибках. Это же речь об SetWarnings.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245319
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне что ли попросить не публиковать данный фак пока из отпуска не вернусь
Правда я там еще не был, но скоро Скоро СКоро СКОро СКОРо СКОРО
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245742
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернулся с выходных...\r
\r
Народ никто и не собирался публиковать FAQ без вашего одобрения, я же в выступаю в качества канала доводящего ИСТИНУ до простых смертных :)\r
\r
Насчёт транзакции, наверное не правильно понял фразу ЛП эдесь Дата: 18 июн 03, 15:24\r
\r
Всё остальное посмотрю откоментирую-оформлю пойзже
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32245821
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч писал:Насчет Eval была моя реплика в том топике, откуда ты копировал.
Нашёл буду исправить...

Лох Позорный писал:2 Мох (который Sfagnum)

QueryDef.Execute dbFailOnError

Прочитай в хелпе в расскажи другим
Прочитал, но пока ещё не придумал куда впихнуть и к чему сделать смысловую привязку...

Лох Позорный писал:Убрать
Код: plaintext
Application.SetOption  "Confirm Document Deletions" , False
тогда не нужно будет
Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран.
А если человек хочет избавиться от подтверждения на удаление таблицы/запроса
Оставляю...

Лох Позорный писал:В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать сообщения об ошибках до конца работы программы
Не сообщения об ошибках, а перестанет выдавать подтверждения на удаление и т.п.
Согласен - SetWarnings - это всё таки, что то типа "установить предупреждения"
Поменяю...

То All
Я прочёл всё очень внимательно... но ещё не сформировал своё видиние проблемы...

Предлагаю добавить п.3. Дополнительная информация
и туда всё, что вы хотите добавить...

Одна просьба выкладывать более оформленные мысли и не много о том в каком разделе вы хотели бы их видеть..

ЗЫ Строку:
NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не производиться.
Уберу ввиду её не корректности.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32262701
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чо то все забыли про эту тему...

Нуф-Нуф обещал что то родить в течении недели, видно всё акушерку ищет...
"Хорошо переносящего обрезку" прсил высказаться насчёт почему лучше юзать CurrentDb.Execute, а не DoCmd.RunSQL более подробно... и SV тоже не откликнулся...
Саныч обещался посодействовать...

Моя в печали... иех...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32262770
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прсил высказаться насчёт почему лучше юзать CurrentDb.Execute
Вай мая твая не панимай
Как почему лучше? Патамушта!
Хотя бы патамушта от подтверждений не надо избавляться. А потом их обратно включать.
И хотя бы патамушта можно заключить во внешнюю транзакцию.
И хотя бы патамушта ну не люблю я объект DoCmd
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32262782
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про внешнию транзакцию по подробнее
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32262788
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вижу-вижу упоминание меня. :^)

Я совсем зашитый на работе. Может, в выходные что-нибудь смогу...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32262821
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про внешнию транзакцию по подробнее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 Function
Rollback_Label:
    DBEngine( 0 ).Rollback
End Function 

Если при выполнении любого запроса (1, 2 или 3) возникнет ошибка (нарушение уникальности, ссылочной целостности, да вообще любая ошибка) - откатятся все запросы.

Если же исполняем запросы через DoCmd.RunSQL - нсмотря на вызов метода Rollback результаты выполнения запросов не откатываются. Т.е. возможно, что будет исполнен Запрос1, Запрос2, а Запрос3 не будет исполнен.
Кстати, это надо бы проверить на всякий случай.
У запроса есть св-во "Использовать транзакцию", но оно отвечает только за то, будет ли запрос выполнен целиком (или целиком откачен), или же возможно частичное выполнение запроса. К внешней транзакции транзакция запроса не имеет никакого отношения, они принимаются или откатываются независимо друг от друга.

Тьфу, как то оно все сложно получилось. Косноязычием начинаю страдать.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32262874
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нда... Как-то некрасиво с моей стороны получилось... Сфагнум, вот сёни акушерка ей богу не отвертится!
...
Рейтинг: 0 / 0
25 сообщений из 156, страница 1 из 7
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]