Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run / 25 сообщений из 156, страница 1 из 7
22.08.2003, 17:08
    #32245079
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
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
22.08.2003, 17:12
    #32245083
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
Не вытерпела душа поэта, кинул раньше

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

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

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

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

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

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

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

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

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

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

QueryDef.Execute dbFailOnError

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

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

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

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

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

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

QueryDef.Execute dbFailOnError

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

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

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

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

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

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

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

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

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

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

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


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