powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
156 сообщений из 156, показаны все 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
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32263004
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жертвую не написанную (до сего момента) главу из не написанной (никогда) моей книги "Акс: как это работает"

В большинстве случаев выполнение запросов из кода программы происходит в "синхронном" режиме – исполняемый код сразу после запуска запроса останавливается и не выполняется до тех пор, пока запрос "не отработает". В отличии от Синхронного режима, Асинхронный режим выполнения запросов позволяет продолжить выполнение кода не дожидаясь окончания выполнения запущенного запроса.

Зачастую асинхронному режиму приписывают магические свойства ускорять работу приложения, за счет параллельного (одновременного) выполнения как программного кода, так и запущенного запроса. Чтобы понять всю глубину данного заблуждения необходимо иметь хотя бы минимум знаний об организации многопоточности в Windows и о реализации механизма асинхронного выполнения запросов в Access.

Концепция многопоточности заключена в самом названии – "много потоков", где под "потоками" подразумеваются потоки исполняемого кода. ОС Windows последовательно подключает каждый из потоков к процессору на определенный квант времени, в результате чего создается впечатление, что несколько Приложений выполняются одновременно. На самом деле в однопроцессорной системе (наиболее распространенной) в каждый момент времени выполняется только один поток (задача). Один поток!!! Вооружившись данными знаниями, вернемся к "параллельному" выполнению программного кода и запроса. В простейшем случае выполнение программного кода и запроса будет происходить в двух различных потоках, которые будут по очереди (!!!) подключаться к процессу. Получим ли мы выигрыш в эдаком параллельном выполнении? Нет!
Проведем гипотетический тест:
Есть некая задача, решение которой выполняется программным кодом (пусть время выполнения которого равно 5 секундам) и выполнением запроса (время выполнения запроса тоже примем за 5 секунд). Запустим выполнение запроса в синхронном режиме. Время решения нашей задачи будет равно 10 секундам (5 секунд выполняется код и еще 5 секунд выполняется запрос). Теперь запустим запрос в асинхронном режиме, при этом время выполнения задачи (выполнения кода и запроса) составит… 10 секунд! "Почему? Ведь мы выполняем запрос в асинхронном режиме, а значит код и запрос должны выполняться параллельно!" – так спросили бы мы, если бы не знали, что ОС Windows просто-напросто будет выполнять наш код и наш запрос "параллельно" за счет поочередного предоставления процессорного времени этим двум задачам. Более того, это самое переключение между задачами (потоками) тоже занимает определенное время и в случае "параллельного" выполнения двух задач по 5 секунд каждая может набежать еще одна секунда на переключения между потоками! Итого, вариант решения нашей задачи с использованием режима асинхронного выполнения запроса занял по времени 11 секунд!

Мы рассмотрели простейший случай. На самом деле все намного сложнее – потоки могут иметь разные приоритеты, которые напрямую влияют на распределение процессорного времени между задачами. Так, процессорное время распределяется по возможности равномерно только между потоками с одинаковым приоритетом – все другие потоки с более низким приоритетом не получат процессорного времени до тех пор, пока более приоритетные задачи не перестанут требовать своего выполнения. Как только это произойдет, Windows начнет выделять процессорное время для потоков с меньшим приоритетом, выполнение которого может быть прервано в любой момент другой, более приоритетной задачей.

Задача асинхронного выполнения запросов в Access реализована именно на создании нескольких потоков с разными приоритетами – поток, выполняющий программный (VBA) код вашего проекта имеет больший приоритет, чем поток, выполняющий запрос в асинхронном режиме. Таким образом, Асинхронное выполнение запроса будет производиться только в те моменты, когда не выполняется наш программный код. Т.е. запрос будет выполнен только по окончании выполнения нашего кода! Зачастую мне доводилось видеть код, который выполнял примерно следующее:
…код, который мне доводилось выдеть

…почему это неправильно…
…а как же правильно?…
…асинхронные запросы вы пользуете давно! (описание механизма загрузки данных при открытии формы - что, как, и что еще можно сделать)
…часть асинхронного запроса может быть выполнена СИНХРОННО, а все остальное в асинхронном режиме…
…когда нельзя (бессмысленно) применять асинхронные запросы…
…когда применение асинхронных запросов оправданно…
…может что еще на ум взбредет…

З.Ы. Сфагнум, ну всё! Акушерка (на сегодня) с криками "Затрахали-и-и-и-и!!!!" убёгла Продолжение будет (может быть), но уже на следующей неделе ;) …если интересны вкратце обозначенные темы. Хотя, знаешь, согласись, что ну никак это всё в фак не лезет – слишком много текста, а повыкидывать не могу, ибо непонятно будет… ФАК, всетаки, не для профи писан должен быть… //пошел в своё "Социологическое исследование" - через пару часиков дойду и туда :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32263304
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч писал:Вижу-вижу упоминание меня. :^)

Я совсем зашитый на работе. Может, в выходные что-нибудь смогу...не проблема, работа прежде всего, сам так же :)

2 Лох Позорный
Молодца!!! спасибо огромное.... проверю положу...

2 Нуф-нуф
Выводы (Выжимка)....
При синхронном режиме выполнении запроса из VBA кода программы происходит следущее: VBA код сразу после запуска запроса останавливается и не выполняется до тех пор, пока запрос не "отработает". Асинхронный же режим выполнения запросов позволяет продолжить выполнение VBA кода не дожидаясь окончания выполнения запущенного запроса.
Присутствует миф, что асинхронное выполнение запроса ускоряет работу приложение за счёт параллельного (одновременного) выполнения как VBA кода, так и запущенного запроса, это не так исходя из реализации многопоточности в Windows.
Многопоточность в Windows реализована следующим образом (упрощённо): последовательно подключается каждый из потоков к процессору на определенный квант времени, в результате чего создается илюзия одновременного выполнения несколько приложений(потоков). При этом ещё учитывается приоритет задачи(потока), т.е. сперва выполняеться задача с более высоким приоритетом(даже если она поступила пойзже), а потом с более низким.
Из этого получаем, что на самом деле асинхронный режим выполнения запросов не быстрее, а иногда даже медленнее(надо преключать потоки на выполнение VBA кода и обратно) синхронного. Учитывая то, что приоритет выполнения VBA кода выше, чем потока, выполняющего запрос в асинхронном режиме, то применять асинхронный режим иногда просто не допустимо.

мда... вот так вот получилось.... если что исказил поправьте....
да, ты о самом главном не сказал, как запускать запросы в ассинхронном режиме, в каком режиме по умолчанию выполняються DoCmd.RunSQL & CurrentDb.Execute...

>…асинхронные запросы вы пользуете давно! (описание механизма загрузки
>данных при открытии формы - что, как, и что еще можно сделать)
>…часть асинхронного запроса может быть выполнена СИНХРОННО, а все
>остальное в асинхронном режиме…
>…когда нельзя (бессмысленно) применять асинхронные запросы…
>…когда применение асинхронных запросов оправданно…

это очень интересно

>…код, который мне доводилось выдеть
>
>…почему это неправильно…
>…а как же правильно?…
по этому поводу ничего сказать не могу не достаточно данных...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264120
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сфагнум! Я плякаль... (С) не помню кто
Ты опять заставляешь меня комплексовать Как заправский редактор поначеркал-поначеркал :) Но в итоге получилось, конечно, более концентрированно и лаконично...
На счет продолжения... Будет... Надеюсь, что на следущей неделе, во всяком случае от меня продолжение последует.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264140
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процессы, многозадачность...
Вот вам:
Руководство по архитектуре IBM PC XT/AT. 1993
Для эффективной работы по защите многозадачности в МП 80386/80268 применяются специальные структуры данных. Для этого не требуется использование новых команд управляющих многозадачностью. Используются обычные команды передачи управления, которые обращаются к специальным структурам данных. <...> С помощью этих структур МП может быстро переключиться с одной задачи на другую, сохраняя контекст исходной задачи так, что задача может быть в дальнейшем продолжена...

Т.е. все именно так, как сказал Нуф-Нуф (не упоминается лишь Виндовс и "потоки")

Шагаем дальше:
роцессор Pentium по сравнению со своими предшественниками обладает целым рядом улучшенных характеристик. Главными его особенностями являются:
- двухпотоковая суперскалярная организация, допускающая параллельное выполнение пары простых команд;
- наличие двух независимых двухканальных множественно-ассоциативных кэшей для команд и для данных, обеспечивающих выборку данных для двух операций в каждом такте;
- динамическое прогнозирование переходов;
- конвейерная организация устройства плавающей точки с 8 ступенями;
- двоичная совместимость с существующими процессорами семейства 80x86.

Т.е. этот процессор уже можно заставить гоняться за двумя зайцами одновременно.

По П4 у меня ничего нет, но, кажецца, там с "многозадачностью" шагнули дальше. Кроме того, имхо, поаккуратней надо с с терминологией: потоки, процессы и пр. Как бы не засмеяли потом.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264159
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo, защищайтесь! :)
>имхо, поаккуратней надо с с терминологией: потоки, процессы и пр. Как бы не засмеяли потом.
С терминологией не всё в порядке вообще, т.е. в принципе! С Процессом все ясно. Процесс – это… это… это вообще виртуальное понятие по большому счету связанное с выделением виртуальной памяти. Т.е., запуская некое приложение вы тем самым создаете процесс, который выполняется в своем собственном виртуальном адресном пространстве. Данный процесс может содержать ПОТОКИ или НИТИ. Вот здесь с терминологией полный писец, который вообщем-то не мешает жить, если привыкнуть что "поток=нить".
Далее… Процесс не имеет никакого отношения к многозадачности вообще! Т.е. ядро Windows, которое непосредственно реализует многозадачность, вообще не в курсе (упрощенно) о существовании Процессов. Для этого самого ядра существуют только Потоки (нити), которые она, грубо говоря, по очереди подсовывает на выполнение процессору (аппаратное устройство такое:). Потоки имеют приоритеты, в соответствии с которыми и получают машинное время. Приоритеты могут меняться самой ОС динамически – получил ПРОЦЕСС фокус (т.е. пользователь стал с ним работать) – все входящие в данный Процесс ПОТОКИ (Нити) автоматом "повышаются в приоритетах" и машинного времени им выделяется поболее.
Это о терминологии и о "не запутаться" :)


>Шагаем дальше:
роцессор Pentium по сравнению со своими предшественниками обладает целым рядом улучшенных характеристик. Главными его особенностями являются:
- двухпотоковая суперскалярная организация, допускающая параллельное выполнение пары простых команд;
- наличие двух независимых двухканальных множественно-ассоциативных кэшей для команд и для данных, обеспечивающих выборку данных для двух операций в каждом такте;
- динамическое прогнозирование переходов;
- конвейерная организация устройства плавающей точки с 8 ступенями;
- двоичная совместимость с существующими процессорами семейства 80x86.
Т.е. этот процессор уже можно заставить гоняться за двумя зайцами одновременно.
По П4 у меня ничего нет, но, кажецца, там с "многозадачностью" шагнули дальше.


ГЕО! Млин… Это ж речь о так называемом "конвейере" – процессор выполняет параллельно ОДИН (!!!) ПОТОК (НИТЬ). Т.е. процессор выполняет последовательно следующие друг-за-другом команды параллельно в надежде на то, что не произойдет "ветвления" – не будет перехода на другой адрес в памяти, который еще даже не загружен во внутренний кэш процессора. В современных процессорах параллельно выполняется ряд ветвлений – т.е. процессор заранее анализирует встречающиеся ветвления в коде, загружает их в себя и всячески готовится к их выполнению. Какое из ветвлений сработает – то и будет выполняться дальше, а все остальные побоку…
Чуешь, чем пахнет? :) Процессор не в состоянии выполнять никак не связанные между собой задачи – активные регистры процессора одни и те же, поэтому параллельное выполнение в твоих доках употребляется совсем в другом контексте.

Но, всё же, что бы как-то всех (и себя тоже) утешить, скажу, что уже (давно) существуют МНОГОПРОЦЕССОРНЫЕ системы, в которых многозадачность действительно становится многозадачностью – несколько разных ПОТОКОВ (НИТЕЙ) могут выполняться параллельно. Увы, это тока для наикрутейших серверов, графических и прочих "станций".

Кстати, Сфагнум, вот последний абзац надо как-то осветить. В моем первоначальном варианте было " На самом деле в однопроцессорной системе (наиболее распространенной) в каждый момент времени выполняется только один поток (задача)." Надо оставить…
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264163
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Нуф-Нуф
Туше.
:)
Я это и имел в виду, тока забыл, кто кого содержит, процесс потоки или же наоборот. А дальше, чем x386, я с процессором/регистрами и пр. дрянью не работал :)
Но мораль моего поста - прежде, чем что-то писать, надо про это вниматильно почитать. А не то беда может случиться. :)
...А-а-пчхи!! (точно)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264169
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Нуф-Нуф
Вот:
Согласно Intel, гиперпоточный режим - это дизайн одновременного выполнения нескольких процессов, при котором операционная система видит один процессор как два логических, способных обрабатывать параллельные потоки инструкций переключаясь с одного процесса на другой каждые несколько наносекунд. Хотя уловка не может реально удвоить производительность процессора (например, при операциях с плавающей точкой), представители Intel утверждают, что гиперпоточная технология способна увеличить число пользователей или веб-транзакций, которые одновременно может обслуживать сервер.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264178
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Туше.
Гео, а я чего? Я ничего :)

>прежде, чем что-то писать, надо про это вниматильно почитать.
Дык… Ежлиб не читал, то и не писал бы :) Про Винду в целом много чего писано (а значит и читано), а вот про Аксес в Винде (как работает, как и что делает) – практически ничего :( Т.е. знания о Винде имеют практически нулевую ценность при работе в Аксе. Правда, ковыряюсь потихоньку, но на КНИЖКУ (:)) сё равно не хватает :) Да и Сфагнум, злодей, задушил в зачатии одну из Глав

>Согласно Intel, гиперпоточный режим
Гео, щаз в глаз дам

>Хотя уловка не может реально удвоить производительность процессора (например, при операциях с плавающей точкой)
Всё может быть, но пойми ты, что... блин... как бы это объяснить та... Если процессор так крут, что может выполнять аж два-три-десять потоков одновременно, то только за счет того, что он это всё будет выполнять в два-три-десять раз медленней! Кстати, Если он так крут, что выполняет сразу два независимых потока, то это уже не один процессор, а два в одном корпусе - уже многопроцессорная система, а я говорю (внимание!) в ОДНОПРОЦЕССОРНЫХ системах!
Процессор (аппаратное устройство) не может выполнять быстрее то, что он уже делает! Два процессора - да, будут выполнять работу примерно в 1,7 раз быстрее, а один - он и в африке один!
Может быть я что-нибудь упустил в современных технологиях, но уж больно это заявление Интел на маркетинговый ход смахивает. Кстати, а хочешь, я тебе в противовес приведу описалово Винды из двух хороших книжек и пары инет-ресурсов, в которых существует ПРОЦЕССОР или МНОГОПРОЦЕССОРНАЯ система?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264182
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не... Не приведу... Слишком много выберать и ручками набирать надо будет...
А все то, что я написал и собирался написать про асинхронное выполнение запросов в Аксесе - протестировано. Правда, система ОДНОПРОЦЕССОРНАЯ в основе всех выводов лежала :)

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

--------------------------------------------------------------------------
Проводили тестирование "4-х процессорная система vs. 1-процессорная"
Конфигурация двух компов была одинаковой, только в одном из них в большой мамке торчало 4 камня, а в другом в точно такой же мамке - 1 камень. Все остальное - адын к аднаму.

Загрузили компы одновременным выполнением каких-то грузящих процы задач. Что-то типа какого-то шифрования, обработка изображений, закрытие банковского опердня, и еще что-то. За давность лет уже не помню.
Как вы думаете, кто выполнил эту работу быстрее и насколько?
Все мои знакомые программеры обычно отвечают "Ну наверное 4-хпроцессорная система быстрее, но уж никак не в 4 раза, а гораздо меньше". Некоторые даже утверждали, что однопроцессорная может и побыстрее будет. Это все неправильные ответы.

Быстрее действительно 4-хпроцессорная. Примерно в 100 раз. Этому даже нашли объяснение, похожее на правду. Во-первых на однопроцессорной машине переключение контекстов задач сжирало слишком много ресурсов. Во-вторых - на одном проце разные задачи тупо вытирали друг другу процессорный кеш.

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

Нуф>Более того, это самое переключение между задачами (потоками) тоже занимает определенное время и в случае "параллельного" выполнения двух задач по 5 секунд каждая может набежать еще одна секунда на переключения между потоками! Итого, вариант решения нашей задачи с использованием режима асинхронного выполнения запроса занял по времени 11 секунд! //см пост от 11 сентября 2003 23:27 :)

ЛП тока я не понял - ты в лагере Красных или Синих?
Гео, выбирай цвет! :)

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

Если предположить, что Красные - это противники асинхронного выполнения, то я буду фосфорецирующим.
Бездумное "распараллеливание" не то что бы не приведет к ускорению, но может привести и к значительному (в разы) замедлению общей скорости.

Сфагнум, слушай, здесь (в данном ФАКе) всё это действительно лишнее!
Угу. Можно упомянуть про то, что при выполнении запроса через CurrentDb.Execute (QueryDef.Execute, Command.Execute и т.п.) можно указывать дополнительные параметры (как то асинхронное выполнение и куча всякой другой срани). И этого хватит.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264726
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo писал:Кроме того, имхо, поаккуратней надо с с терминологией: потоки, процессы и пр. Как бы не засмеяли потом.> Многопоточность в Windows реализована следующим образом (упрощённо):
упрощённо - ключевое слово

Нуф-Нуф писал:> Сфагнум, слушай, здесь (в данном ФАКе) всё это действительно лишнее! ЛП писал: Угу. Можно упомянуть про то, что при выполнении запроса через CurrentDb.Execute (QueryDef.Execute, Command.Execute и т.п.) можно указывать дополнительные параметры (как то асинхронное выполнение и куча всякой другой срани). И этого хватит.
Не я это начал, но в прынцыпе согласен, у нас не фак по форточкам... кому интересно пускай копает...

но вот это думаю нада всё ровно осветить

>да, ты о самом главном не сказал, как запускать запросы в ассинхронном
>режиме, в каком режиме по умолчанию выполняються DoCmd.RunSQL &
>CurrentDb.Execute...
>
>>…асинхронные запросы вы пользуете давно! (описание механизма загрузки
>>данных при открытии формы - что, как, и что еще можно сделать)
>>…часть асинхронного запроса может быть выполнена СИНХРОННО, а все
>>остальное в асинхронном режиме…
>>…когда нельзя (бессмысленно) применять асинхронные запросы…
>>…когда применение асинхронных запросов оправданно…
>
>это очень интересно
>
>>…код, который мне доводилось выдеть
>>
>>…почему это неправильно…
>>…а как же правильно?…
>по этому поводу ничего сказать не могу не достаточно данных...


в некоторых пунктах можно сослаться при необходимости на реализацию многопоточность в Windows... если кому надо подробнее пускай копает...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32264777
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выдернул отсюда (Нуф-нуф Дата: 13 сен 03, 20:11)\r
\r
1) Асинхронное выполнение селектов есть хорошо. \r
2) Асинхронное выполнение исполняемых запросов оправданно в случаях, когда коду, который его запускает, не нужны результаты выполнения данного запроса. \r
3) В многоПРОЦЕССОРНЫХ системах. \r
Решение может быть обжаловано :)
\r
\r
так и запишем... для приложений не использующие сервер. (MDB на сервере насколько я понимаю не в счёт, использующие сервер - тока с SQL Server и иже с ним) извените, но по-русски сказать не смог...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32266383
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.RunSQL или CurrentDb.Execute?

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. Методы отключения ошибок.
Подтверждения отключаються следующими способами:
Перейти на использование конструкции CurrentDb.Execute.

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

Изменить глобальные настройки с помощью кострукции
Код: plaintext
1.
2.
3.
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 = Eval(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=Cdate(Ваше_значение_парметра)
'и т.д. пока не переберете все парметры'
  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

2.4. Противопоказания использования конструкции Application.SetOption.
Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия:

Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран.

Подтверждения не отключаются, если в приложении работает сам разработчик.

3. Дополнительная информация.

3.1. Возможность отката.
CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции.
Пример отката внешней транзакции:
Код: 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
Т.е. В данном случае если не выполниться хотя бы один запрос, то все запросы 'откатятся'. Если вместо
CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. В DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса.

3.2. Асинхронное выполнение запроса.

CurrentDb.Execute - позволяет выполнять запросы асинхронно используя опцию dbRunAsync .

DoCmd.RunSQL - выполняется на усмотрение Access (???)

3.2. Применимость асинхронных запросов.
Не смотря на расхожее мнение, что асинхронные запросы выполняются быстрее - это не так, в связи с реализацией многопоточности в Windows.
Рекомендуется использовать асинхронные запросы при выполнении:

запросов на выборку( SELECT ).

исполняемых запросов( INSERT , UPDATE и т.п.)в случаях, когда коду, который его запускает, не нужны результаты выполнения данного запроса немедленно.

В многоПРОЦЕССОРНЫХ системах.
В остальных случаях надо учесть, что Вы можете оказаться в ситуации, когда не все данные выбрались, добавились и т.п.
NB!!! Выше сказанное относиться к приложениям НЕ использующими серверные технологии (данные в mdb на сервере не есть серверная технология).
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32266404
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мои очередные потуги...
Ну исправить неточности/разночтения/ошибки эт постоянная просьба...

Потом Нуф упоминал о таком звере как Connection.Execute(ADO), ВС согласился с включением его в список, остальные не против были.

К сожалению я не юзаю ADO, и поэтому не в курсе что это за зверь...
Пожалуста осветите этот вопрос всесторне (грабли, параметры, асинхронность, транзакцию).

Ожидаю асинхронность в применении к клиент серверной технологии...

ну и конешно ваших предложений
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32266405
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Похоже, что в эту пятницу я наконец смогу в этом факе поучаствовать.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32266412
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствуеться, если захочешь править могу скинуть "исходники" или по окончанию?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32266422
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Орфографических ошибок я вижу какое-то количество, но их надо будет править после того, как устаканится сам текст. Тогда я попрошу исходники. А пока я хочу внимательно прочитать весь топик и проверить, как все согласуется друг с другом.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32266428
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду ожидать рекомендаций...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32270942
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Итак, я прошелся по всему топику и попытался собрать вместе все замечания, которые пока не вошли в полный текст фака.

1. Заголовок фака: Как избавиться от подтверждений на удаление и т.п. и как вообще запускать запросы из VBA.

2. Заголовок п.2.1: Методы отключения сообщений Аксесса, требующих подтверждения желания исполнить Action Query.

(У меня что-то с русским языком. Пытался сказать что-то типа "запросов на подтверждение", но - во-первых, не звучит; во-вторых, само слово запрос обозначает нечто иное и даже использовано в той же фразе в своем более привычном значении; в-третьих, нет ли в русском языке аналога для термина Action Query? В общем, мой вариант надо бы как-то укоротить. Но в любом случае "отключение ошибок" - это неверно, и даже "отключение сообщений об ошибках" тоже не о том.)

3. В п.2.2 после первого из примеров с For Each p In q.Parameters предлагаю добавить два примечания:

Примечание 1. В запросах на удаление это не помогает.

Примечание 2. В перекрестных запросах возникает то же явление. Правда, оно возникает не при попытке запуска (ибо перекрестный запрос не является Action Query), а при любом использовании, например при открывании формы, основанной на таком запросе. В этом случае помогает описать в перекрестном запросе явным образом как параметры всё то, что Аксесс воспринимает как параметры. Это можно сделать либо через меню Query -> Parameters, либо добавив в начале текста запроса строку PARAMETERS.

4. Альтернативный способ передачи в запрос значений контролов: перед запуском запроса занести значения контролов в переменные, а в запросе пользоваться функциями, которые возвращают значения этих переменных.

5. В п.3.1 первая строка - Execute как раз участвует во внешней транзакции (и поддается откатыванию при помощи RollBack), а RunSQL как раз нет.

6. В том же пункте предлагаю добавить фразу после фразы про UseTransaction: В Execute за это же отвечает опция dbFailOnError.

7. Все про многопоточность и асинхронность - переносится в другой фак.

8. Где-то можно вставить слова Нуфа про интерфейсы к Jet'у (22 авг 03, 20:51, п.2).
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32270962
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч,в русской технической литературе Action Query обычно переводится как "Запросы действия"
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271311
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВС
1 - принимаю
2 - по моему аккуратнее будет так:
2.1. Методы отключения сообщений на подтверждение при запуске Action Queres.
3.1. - да ты что?!?!?! - убедюсь добавлю
3.2. - добавлю.
4. - ок... - я так понимаю енто тоже в п.2.2.
5. - я это имел ввиду, но сейчас внимательно прочитал - действительно х..ня получилась... исправлю
6. - ок.
7. - тоже не против...
8. - в пукт 3.2. пойдут...

Саныч а чо про Connection.Execute - та ничего и не скажем???
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271323
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ах да исправленый вариент положу по пойзже...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271366
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>4. Альтернативный способ передачи в запрос значений контролов: перед запуском запроса занести значения контролов в переменные, а в запросе пользоваться функциями, которые возвращают значения этих переменных

Саныч! Можешь еще замолвить словечко за
НЕ_Хранение_в_переменной_с _чтением_из_нее_функцией, а
за _чтение_функцией_напрямую _из_контрола_формы?
ЗАЧЭМ еще промежуточная переменная при открытой форме?..

>Саныч,в русской технической литературе Action Query обычно переводится как "Запросы действия"

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

> Методы отключения сообщений на подтверждение

Это по-русски называется сообщение??? Когда задается вопрос, это называется сообщение???

> 3.1. - да ты что?!?!?!

В изначальном топике я этот вопрос задавал Лоху красным цветом, и он отвечал.

> а чо про Connection.Execute - та ничего и не скажем???

:^) А я с ADO на Аксессе не работал.

2 Alexus12:

> _чтение_функцией_напрямую _из_контрола_формы

А мне это не нравится. У моего варианта еще то достоинство (которое тоже надо упомянуть), что форму не обязательно держать открытой. Хотя, конечно, и этот способ можно назвать.

> Из справки: "Управляющий запрос.

А этот термин все понимают?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271499
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите коллеги, но я такого не говорил (хотя... кто ж его знает ). Или меня неправильно поняли, или у меня pronounce страдает.
В запросах на удаление и перекрестных запросах ссылки на конролы форм типа Forms![блаблабла]![блаблабла] не подцепляются автоматом (как это просходит в запросах на выборку, добавление и обновление). Как раз "For Each p In q.Parameters и т.д." и должно помочь (не проверял, ибо вообще не люблю такие вещи).
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271504
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
МОЛНИЯ

ПОНЯЛ ПРОШУ ПРОЩЕНИЯ ДЕЗИНФОРМАЦИЮ ЦЕЛУЮ САНЫЧ
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271577
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А мне это не нравится. У моего варианта еще то достоинство (которое тоже надо упомянуть), что форму не обязательно держать открытой. Хотя, конечно, и этот способ можно назвать.

Согласен - достоинство, если форму нужно закрытой
и если юзверь настолько продвинут, что
сам помнит, что у него хранится в глобальных переменных
(хоошие у вас юзеры... нам бы таких...).

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

У меня что-то с головой. Зачем юзверю помнить, что хранится в переменных программы???!!!

> Прошу воздуха глоток и для моего вар-та

Я же ответил: Хотя, конечно, и этот способ можно назвать.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271600
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>У меня что-то с головой. Зачем юзверю помнить, что хранится в переменных программы???!!!

Не, ВС, у меня - туманю.
Открыл юзер форму - заполнил фильтры = жмакнул открыть отчет = получил

а если не на этой \ предыдущей форме фильтры - юзер не видит поля с условиями - ЗАБЫЛ про свои фильтры = получил хз что = пошел капать на програмера.

вот и вопрос: часты ли ситуации, когда нужно иметь в загашнике данные(глобпеременная, и из нее читающая функ-я),
и чаще ли встречается мой вар-т (считать из все еще открытой формы)?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271616
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> ЗАБЫЛ про свои фильтры

Какая разница, что помнит или забыл юзер???!!! Программа должна быть правильно написана, вот и все.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271715
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
К концу п.2.2 - альтернативный способ by Лох: создать запрос, перевести его в режим SQL, скопировать туда селект и попытаться выполнить.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271733
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это скорее к обсуждению "Как хранить запросы"
Типа с сохраненным запросом не надо таких плясок производить - "вывестивдебуг-создатьзапрос-скопироватьвставить-попытатьсявыполнитьиафигеть". С сохраненным достаточно один раз на этапе написания "попытатьсявыполнитьиафигеть"
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271749
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не понял, чего тут обсуждают, но если по теме,то избавиться от подтверждений можно записав глобальные настройки в переменные, установить их в False сделать свое черное дело а потом вернуть все как было. Почему это категорически(!?!?!) не рекомендуется, я не понял.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271758
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да патамушта!!!
У тебя что, к аксесу никогда доктор ватсон не приходил? И свет не отключали? До того как ты успеешь глобальные настройки восстановить "как было"?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271770
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не-а.
Десять лет все пашет без проблем.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32271772
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потеря глобальных настроек- не самая тяжелая потеря, которая произойдет при выключении света на середине транзакции Access :-)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32274317
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Поступило предложение: рассказать более четко про транзакции. ИМХО, достаточно одного абзаца:

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

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

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

В запросе не известно имя таблицы (один запрос для обработки таблиц под разными именами), т.е. имя таблицы надо как-то передавать в запрос. Причем этот запрос участвует в другом запросе, т.е. надо иметь такую возможность. Как тогда быть?:

1.
Set q = CurrentDb.QueryDefs("ИмяЗапрса")
q.Parameters("[Введите первый параметр:]").Value = Ваше значение
- как я понимаю, не подходит, во инструкии FROM он не понимает же параметр, он таблицу хочет

2.
strSQL="SELECT/DELETE Поле1 FROM " & NameTable & " и т.д."
CurrentDb.Execute srtSQL
- работать будет, но сам запрос как имя нигде больше не используешь, только если результаты запроса кидать во временную таблицу и ее уже пихать в во все другие запросы.


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

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

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

CurrentDb.Execute srtSQL

можно сделать

CurrentDb.QueryDefs("...").SQL = srtSQL
CurrentDb.Execute "..."
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32274427
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> а не разделить его спокойно на составляющие

Я предлагал другое: не несколько запросов создавать, а поместить селект в программе и разбить его на строчки с комментариями.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32274440
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergeySV
Это Сенин Виктор спрашивал - зачем все в один запрос.
Я тоже думаю, что не за чем. Только вот вчера у меня аксес решил, что ему похуй что я там думаю, и в запрос с 16 уровнями вложенности не сумел добавить еще 3 . Пришлось прогнуться.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32274477
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир Саныч: спасибо за идею, знал что на вас можно расчитывать, идейка очень симпатишная...

2Лох Позорный: постараюсь до такого не дойти, теперь у меня ограничитель :-)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32285468
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пока запустил дельфинов стаю, так что пока не могу заняться, но как только так сразу :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32305440
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А теперь?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32306130
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь как и тогда жду ADO'шников, все вопросы по этой теме пропали в туне. Я считаю что надо осветить и данную часть и указать какими способами можно запускать код емть ли там проблемы и если емсть то как они решаються...

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

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.
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 = Eval(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=Cdate(Ваше_значение_парметра)
'и т.д. пока не переберете все парметры'
  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

NB! При открытии Crosstab Query с сылками на поля форм в качестве параметров надо действовать следующим образом:
Код: plaintext
1.
2.
3.
PARAMETERS [Forms]![ИмяФормы]![ИмяКонтрола] Text, ... ;
...
WHERE ИмяТаблицы.ИмяПоля=[Forms]![ИмяФормы]![ИмяКонтрола] ... 
...

Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной.
Использования данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично.
NB! Функция должна возвращать значение в любом случае.

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

2.4. Противопоказания использования конструкции Application.SetOption.
Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия:

Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран.

Подтверждения не отключаются, если в приложении работает сам разработчик.

3. Дополнительная информация.

3.1. Возможность отката.
CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции.
Пример отката внешней транзакции:
Код: 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
Т.е. В данном случае если не выполниться хотя бы один запрос, то все запросы 'откатятся'. Если вместо
CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. В DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса.
Опция dbFailOnError аналогична опции Use Transaction .

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307519
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307538
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отчёт по данному запросу \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
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307557
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CВ & SV \r
прям метеоры...\r
\r
2 SV\r
1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило...\r
2. Не совсем понял почему лишнее, мои аргуменгты читай здесь\r
3. согласен\r
\r
Сделать можно всё!!!\r
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307626
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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 - отсуствует.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307645
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SV
1. Спасибо
2.
во-первых: это не прынцыпиально

во-вторых: DROP TABLE тож можно запустить...и это будет DoCmd.RunSQL

насчёт перевода: ну вообще большенство согласились что это не стоит юзать, так что пускай камикадзе сами трахаються...

(после коньячка несколько рековат)

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307719
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
    Dim cmd As ADODB.Command
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim p As ADODB.Parameter

    Set cnn = CurrentProject.Connection
    'или если не использую текущее соединение'
    'Set cnn = New adodb.Connection'
    'cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString " '

    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = cnn
        .CommandText =  "ИмяПроцедуры" 
        .CommandType = adCmdStoredProc
        .NamedParameters = True    'начиная с ADO версии 2.6 (не точно, возможно в 2.5 тоже есть)'
        'без этого свойтсва все будет работаь как хер занет что- ADO будет заполнят коллекцию парметров не по имени, а по очереди'
        For Each p In .Parameters
            'при первом обращении к коллекеции парметров произойдет неявный вызов cmd.Parametrs.Refresh'
            'Ничего в этом страшного нет -  просто по сети будут передаваться лишнии данные'
            'имена параметров равны именам контролов формы, только без @'
            'Имя контрола NameFIO, тогда в процедуре @NameFIO. @- убираем с помощью Replace'
            p.Value = Eval(Forms( "ИмяФормы" )(Replace(p.name,  "@" , "",  1 ,  1 , vbTextCompare)))
        Next
        Set rs = .Execute(, , adExecuteNoRecords)    ' adExecuteNoRecords - можно и не указываь если в процедуре стоит Set NoCount ON'
        'или'
        'Что бы иметь возможность задать свойства rs (обновляемость например)'
        'Set rs = New ADODB.Recordset'
        'rs.CursorType = adOpenDynamic'
        'rs.Open cmd'
    End With
'    Debug.Print rs.GetString'

    'подчищаем за собой, соблюдая последовательность'
    Set cmd = Nothing
    rs.Close: Set rs = Nothing
    cnn.Close: Set cnn = Nothing

    'самый оптимальный способ - указывать параметры вручную'


Если вместо обращений к формам Вы используете собственные парметры тогда вам нужно задать параметры вручную:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        Dim cmd As ADODB.Command
        Dim cnn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim p As ADODB.Parameter

        Set cnn = CurrentProject.Connection
        Set cmd = New ADODB.Command
        With cmd
            .ActiveConnection = cnn
            .CommandText =  "ИмяПроцедуры" 
            .CommandType = adCmdStoredProc
            .NamedParameters = True    'начиная с ADO версии 2.6 (не точно, возможно в 2.5 тоже есть)'
            'без этого свойтсва все будет работаь как хер занет что- ADO будет заполнят коллекцию парметров не по имени, а по очереди'
            'самый оптимальный способ - указывать параметры в ручную'
             'Cоздадим парметр nVarChar (500)'
            .Parameters.Append .CreateParameter( "@имяПарматра1" , adVarWChar, adParamInput,  500 ,  "Некая строка" )
            'создадим параметр типа int (SQL) - Long (VBA)'
            .Parameters.Append .CreateParameter( "@имяПараметра2" , adInteger, adParamInput, , CLng( 111 ))
            'и т.д.'
            Set rs = .Execute(, , adExecuteNoRecords)    ' adExecuteNoRecords - можно и не указываь если в процедуре стоит Set NoCount ON'
        End With

Узнать какие параметры от вас хочет Access можно с помощью следующего кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    Dim cmd As ADODB.Command
    Dim cnn As ADODB.Connection
    Dim p As ADODB.Parameter

    Set cnn = CurrentProject.Connection
    'или если не использую текущее соединение'
    'Set cnn = New adodb.Connection'
    'cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString "'
    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = cnn
        .CommandText =  "ИмяПроцедуры" 
        .CommandType = adCmdStoredProc
        For Each p In .Parameters
            'при первом обращении к коллекеции парметров произойдет неявный вызов cmd.Parametrs.Refresh'
            'Ничего в этом страшного нет -  просто по сети будут передаваться лишнии данные'
            Debug.Print p.name
        Next
    'подчищаем за собой, соблюдая последовательность'
    Set cmd = Nothing
    cnn.Close: Set cnn = Nothing


Все произошедшие ошибки заполняют коллекцию cnn.Errors. Объект Err - содержит только последнюю ошибку (хрен знает какую).
Что бы получить всю информацию об ошибках при
сmd.Execute/cnn.connectin.execute надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        Dim errADO As ADODB.Error
        Dim strErr As String
        '...'
        On Error Resume Next
        cmd.Execute
        On erroro GoTo  0     'или на конкретную метку'
        If cnn.Errors.Count >  0  Then
        For Each errADO In cnn.Errors
            strErr = strErr & vbNewLine & errADO.Number &  " - "  & errADO.Description
        Next errADO
        MsgBox  "Ошибка"  & strErr
        End If


Execute всегда выполняется в транзакции. Можно обернуть вызов нескольких Execute в одну транзакцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        cnn.BeginTrans
        With cmd
            .Execute  "UPADTE....1 "
            .Execute  "INSERT....2 "
            .Execute  "UPDATE....3 "
        End With
        If cnn.Errors.Count =  0  Then
            cnn.CommitTrans
        Else
            cnn.RollbackTrans
            'здесь можно проверить все наши ошибки'
        End If
'                         !НО ТАКИЕ ВЕЩИ ЛУЧШЕ ДЕЛАТЬ НА СЕРВЕРЕ!'


2.>во-вторых: DROP TABLE тож можно запустить...и это будет DoCmd.RunSQL
Это будет "Confirm Action Queries" DDL-запрос. Или акес все равно спросит?

3. Согласен
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307736
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. буду посмотреть
2. спросит

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

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 случаев.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32313062
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Мдааа.... не точно написал, хотел просто написать, что-то типа значение должно присваиваться в ф-ии, в любом случае, чтоб не получить удивление от неожиданных результатов. Подумаю, перефразирую...\r
\r
2. Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие сообщений на подтверждение при удалении/редактировании данных через экран. \r
Это не запросы...\r
\r
3. Я уже заметил здесь п.5. и поправился...\r
\r
4. Внешняя транзакция работает только в представленном виде... и усё... проверено...\r
\r
Сделать можно всё!!!\r
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32313218
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Внешняя транзакция работает только в представленном виде

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

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32313510
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кажется, я просто запутался. Вот проделаю сам все 16 случаев, тогда дойдет. :^)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32313557
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай как в примере...
А остальные не будут позвалять полный откат

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32506006
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут ввспомнили про этот FAQ и предложили его дописать...\r
напоминаю проблемы:\r
У SV тут были претензии по вводной к ответам, обещаного тут исправления нет...\r

Перечитал перевод из MSDN - покоробило может кто \'причешет\'. \'Оригинал\' есть тута\r

Какая ошипка вылетает при не правильном юзанье Connection.Execute(ADO).\r

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

NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery этого делать не нужно, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, - Вы не имеете никакой гибкости по использованию различных значений параметра.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32506014
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВС меня сколбасила фраза: авторВы не имеете никакой гибкости по использованию различных значений параметра.

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32506025
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery этого делать не нужно, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой гибкости в этом отношении.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32506029
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теплее... но выражение давать гибкость.... это... :)

ща ADO пытать буду...

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

Если все параметры являються сслыками на контролы форм (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.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
    'или если не используете текущее соединение'
    'Set cnn = New adodb.Connection'
    'cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString " '
  Set cmd = New ADODB.Command
  With cmd
    .ActiveConnection = cnn
    .CommandText = "ИмяПроцедуры"
    .CommandType = adCmdStoredProc
    .NamedParameters = True
      'начиная с ADO версии 2.6 (не точно, возможно в 2.5 тоже есть)'
      'без этого свойтсва все будет работать как хер знает что '
      'ADO будет заполнят коллекцию параметров не по имени, а по очереди'
    For Each p In .Parameters
      'при первом обращении к коллекеции параметров произойдет неявный вызов cmd.Parametrs.Refresh'
      'Ничего в этом страшного нет - просто по сети будут передаваться лишнии данные'
      'имена параметров равны именам контролов формы, только без @'
      'Имя контрола NameFIO, тогда в процедуре @NameFIO. @- убираем с помощью Replace'
      p.Value = Eval(Forms("ИмяФормы")(Replace(p.Name, "@", "",  1 ,  1 , vbTextCompare)))
    Next
    Set rs = .Execute(, , adExecuteNoRecords)
      'adExecuteNoRecords - можно и не указываь если в процедуре стоит Set NoCount ON'
      'или чтобы иметь возможность задать свойства rs (обновляемость например)'
      'Set rs = New ADODB.Recordset'
      'rs.CursorType = adOpenDynamic'
      'rs.Open cmd'
  End With
  'подчищаем за собой, соблюдая последовательность'
  Set cmd = Nothing
  rs.Close: Set rs = Nothing
  cnn.Close: Set cnn = Nothing
  'самый оптимальный способ - указывать параметры вручную'

Если вместо обращений к формам Вы используете собственные парметры тогда вам нужно задать параметры вручную:
Код: 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.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
  Set cmd = New ADODB.Command
  With cmd
    .ActiveConnection = cnn
    .CommandText = "ИмяПроцедуры"
    .CommandType = adCmdStoredProc
    .NamedParameters = True
      'аналогично см. выше'
      'Cоздадим парметр nVarChar (500)'
    .Parameters.Append .CreateParameter("@имяПарматра1", adVarWChar, adParamInput,  500 , "Некая строка")
      'создадим параметр типа int (SQL) - Long (VBA)'
    .Parameters.Append .CreateParameter("@имяПараметра2", adInteger, adParamInput, , CLng( 111 ))
      'и т.д.'
    Set rs = .Execute(, , adExecuteNoRecords)
      'аналогично см. выше'
  End With
    'подчищаем за собой, соблюдая последовательность'
  Set cmd = Nothing
  rs.Close: Set rs = Nothing
  cnn.Close: Set cnn = Nothing

Узнать какие параметры от вас хочет Access можно с помощью следующего кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
    'аналогично см. выше'
  Set cmd = New ADODB.Command
  With cmd
  .ActiveConnection = cnn
  .CommandText = "ИмяПроцедуры"
  .CommandType = adCmdStoredProc
  For Each p In .Parameters
      'при первом обращении к коллекеции парметров произойдет неявный вызов cmd.Parametrs.Refresh'
      'Ничего в этом страшного нет -  просто по сети будут передаваться лишнии данные'
    Debug.Print p.Name
  Next
    'подчищаем за собой, соблюдая последовательность'
  Set cmd = Nothing
  cnn.Close: Set cnn = Nothing


вопросы:
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.

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32506042
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Не надо никакого знака между скобками. Это как dbengine(0)(0).
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32506044
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, буду знать...

перевод предлагаю такой:
авторNOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), то Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении.

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32508491
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все вернулись? нет??? ну да ладно всё народу побольше...
вопросы тут

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

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32571063
Sphagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мможет ФАК по DAO выложим отдельно... раз ADO никому не гужно?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32804853
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Не добить ли нам этот фак...

С учетом последних новостей:
http://sql.ru/forum/actualthread.aspx?tid=127906
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866853
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Господа, я взялся за добивание этого фака. Уже есть несколько распечатанных страниц, измалеванных непонятным почерком красной ручкой. Но прежде, чем я это дело опубликую здесь, у меня вопрос.

Я попробовал запустить то, что в этом факе предлагается. Оказалось, что CurrentDb.Execute "a1", dbFailOnError, когда он натыкается на ошибку, выдает НА ЭКРАН сообщение об этом, причем у сообщения кнопка Continue законспирирована, при первой же ошибке юзер вынужден закрывать Аксесс. Фотка сообщения прилагается. Это то, что мы всем рекомендуем??? Как это отменить??? Фак-то посвящен отмене всяких сообщений на экране, между прочим...

DoCmd.RunSQL, хоть с параметром, хоть нет, ведет себя аналогично, хотя и более цензурно. Он при ошибках спрашивает, хотим ли мы несмотря ни на что исполнить запрос. Отменить это удалось только через DoCmd.SetWarnings, т.е. через Application.SetOption не удалось.

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

SfagnumВ DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса.
Ставил эту опцию и в True, и в False, но результат всегда одинаковый: запрос делает все по максимуму, целиком не откатывается. Что я делаю не так?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866873
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866874
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
От моих транзакций он тоже не зависит.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866876
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, а каким образом ты его пытаешься откатить?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866878
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вот мой тест:

Код: 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.
Sub test()

Dim bCommit As Integer, bParam As Integer, bDoCmd As Integer
On Error GoTo e

For bDoCmd = True To False
    For bParam = True To False
        For bCommit = True To False
            Debug.Print bCommit, bParam, bDoCmd
            CurrentDb.Execute "delete * from t0"
            CurrentDb.Execute "INSERT INTO t0 ( f ) SELECT 1 AS Expr1"

            DBEngine( 0 ).BeginTrans
            If bDoCmd Then
                DoCmd.SetWarnings False
                If bParam Then
                    DoCmd.RunSQL CurrentDb.QueryDefs!a0.SQL, True
                    DoCmd.RunSQL CurrentDb.QueryDefs!a1.SQL, True
                    DoCmd.RunSQL CurrentDb.QueryDefs!a2.SQL, True
                Else
                    DoCmd.RunSQL CurrentDb.QueryDefs!a0.SQL, False
                    DoCmd.RunSQL CurrentDb.QueryDefs!a1.SQL, False
                    DoCmd.RunSQL CurrentDb.QueryDefs!a2.SQL, False
                End If
                DoCmd.SetWarnings True
            Else
                If bParam Then
                    CurrentDb.Execute "a0", dbFailOnError
                    CurrentDb.Execute "a1", dbFailOnError
                    CurrentDb.Execute "a2", dbFailOnError
                Else
                    CurrentDb.Execute "a0"
                    CurrentDb.Execute "a1"
                    CurrentDb.Execute "a2"
                End If
            End If
            If bCommit Then
                DBEngine( 0 ).CommitTrans
            Else
                DBEngine( 0 ).Rollback
            End If

            Debug.Print DCount("*", "t0")
        Next
    Next
Next

Exit Sub
e:
Resume Next

End Sub

Запрос 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.
test
- 1             - 1             - 1  
  9  
  0             - 1             - 1  
  9  
- 1               0             - 1  
  9  
  0               0             - 1  
  9  
- 1             - 1               0  
  7  
  0             - 1               0  
  1  
- 1               0               0  
  9  
  0               0               0  
  1  

4 первых выполнения из 8 (где bDoCmd=-1) дают 9 записей независимо от значения параметра и от Rollback'а.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866879
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, ну не влияет твоё DBEngine.BeginTrans/Commit/Rollback на DoCmd.RunSQL
И не может влиять никогда.

Чтобы убедиться можешь сделать
Код: plaintext
1.
2.
DBEngine( 0 ).BegineTrans
    DoCmd.RunSQL "все что угодно"
DBEngine( 0 ).Rollback
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866881
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох ПозорныйСаныч, ну не влияет твоё DBEngine.BeginTrans/Commit/Rollback на DoCmd.RunSQL
И не может влиять никогда.

Чтобы убедиться можешь сделать
Код: plaintext
1.
2.
DBEngine( 0 ).BegineTrans
    DoCmd.RunSQL "все что угодно"
DBEngine( 0 ).Rollback

А на что тогда влияет этот параметр???
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866884
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычА на что тогда влияет этот параметр???
Какой параметр? У меня нет никакой параметр!
У меня есть только констатация факта, что в случае DoCmd - у тебя транзакция лишняя и никому не нужная.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866886
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох ПозорныйКакой параметр? У меня нет никакой параметр!
Моя вопрос была про параметр. См. сегодня, 01:14 и далее.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32867801
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неужели никто не знает, для чего нужен параметр
Код: plaintext
DoCmd.RunSQL [Use Transaction]
?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868166
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир СанычНеужели никто не знает, для чего нужен параметр
Код: plaintext
DoCmd.RunSQL [Use Transaction]
?

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 проекта -
я не знаю
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868176
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и еще, всякое "масовое поведение", как помню, документируется
для апдейтов и дилитов, про инсерты вообще никто никому ничего...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868182
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Цветику, конечно, спасибо. Но вопрос остался в полном объеме...

Зачем нужен параметр Use Transaction? На что он влияет? Когда им пользоваться? Какой тест можно провести, чтобы увидеть разницу в работе DoCmd.RunSQL с параметром и без?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868234
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир СанычЦветику, конечно, спасибо. Но вопрос остался в полном объеме...

Зачем нужен параметр Use Transaction? На что он влияет? Когда им пользоваться? Какой тест можно провести, чтобы увидеть разницу в работе DoCmd.RunSQL с параметром и без?

Польза - не будет (не должно быть) частичного изменения базы в случае, когда, например, потеряна связь с базой в процессе выполнения запроса (до его завершения).
подтверждается весь пакет буферизованных изменений.

Вред - дополнительная буферизация + блокировки - расход ресурсов+ время исполнения.

Я не знаю, когда им НУЖНО пользоваться. Потому как процесс слабоконтроллируем. Хоть оно и похоже на sp_executesql, но польза вилится меньшая. Я не использую DoCmd.RunSQL - не возникало даже движения
мысли в этом направлении.

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

Вариант теста - длинный запрос на линкованной с сеиевого ресурса таблице с к-вом записей
>>10000 - то есть чтобы много секунд выполнялся.
а) наблюдение за к-вом отъеденной в системе памяти и локальной файловой активностью.
б) выдергивание сетевого шнура посреди выполнения запроса без транзакции и внутри нее.

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

Короче, я понял, что про этот параметр можно в этом факе ничего не говорить. Этот параметр к теме этого фака не имеет отношения.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868287
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир СанычИшо раз спасибо. И за выражение лица в том числе. :^)))

Короче, я понял, что про этот параметр можно в этом факе ничего не говорить. Этот параметр к теме этого фака не имеет отношения.

в том смысле, чтобы от него избавиться - точно не имеет...

Как и в том смысле, что избавившись от подтверждений - (кажется)
невозможно отменить результат выполнения DOCMD.RunSQL, если он вообще хоть как-то завершается...



:))
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868319
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ЦветикКак и в том смысле, что избавившись от подтверждений - (кажется)
невозможно отменить результат выполнения DOCMD.RunSQL, если он вообще хоть как-то завершается...
Ну, если человек хочет избавиться от подтверждений, то он, наверно, заранее подразумевает Yes to all. Так что возможность отменять результат ему не очень-то и нужна.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868398
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как бы да.
Это разница между execute и runsql.
раз уж они тут сопоставились...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868918
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Итак. Вот версия, в которой я попытался учесть все, что до сих пор было сказано. Теперь можно ее править.

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.
Application.SetOption "Confirm Record Changes", False
Application.SetOption "Confirm Document Deletions", False
Application.SetOption "Confirm Action Queries", False
и т.п.
NB!!! (Категорически НЕ рекомендуется).

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

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

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

Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной. Использование данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично.

Если аналогичное явление происходит не при CurrentDb.Execute, а при CurrentDb.OpenRecordset, то годятся все те же решения. При этом если параметры задаются вручную, то открывать рекордсет надо так:
Код: plaintext
1.
  Set rs = q.OpenRecordset(...)
  'а не Set rs = CurrentDb.OpenRecordset("ИмяЗапроса"), ...)

В перекрестных запросах возникает то же явление. Правда, оно возникает не при попытке запуска (ибо перекрестный запрос не является Action Query), а при любом использовании, например при открывании формы, основанной на таком запросе. В этом случае надо действовать следующим образом:
Код: plaintext
1.
2.
3.
PARAMETERS [Forms]![ИмяФормы]![ИмяКонтрола] Text, ... ;
...
WHERE ИмяТаблицы.ИмяПоля=[Forms]![ИмяФормы]![ИмяКонтрола] ... 
...

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.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
    'или если не используете текущее соединение:
    'Set cnn = New adodb.Connection
    'cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString"
  Set cmd = New ADODB.Command
  With cmd
    .ActiveConnection = cnn
    .CommandText = "ИмяПроцедуры"
    .CommandType = adCmdStoredProc
    .NamedParameters = True
      'начиная с ADO версии 2.6 (???) без этого свойства работать не будет -
      'ADO будет заполнять коллекцию параметров не по имени, а по порядку
    For Each p In .Parameters
      'имена параметров равны именам контролов формы, только без @
      'Имя контрола NameFIO, тогда в процедуре @NameFIO. @- убираем с помощью Replace
      p.Value = Eval(Forms("ИмяФормы")(Replace(p.Name, "@", "",  1 ,  1 , vbTextCompare)))
    Next
    Set rs = .Execute(, , adExecuteNoRecords)
      'adExecuteNoRecords - можно и не указывать, если в процедуре стоит Set NoCount ON
      'или чтобы иметь возможность задать свойства rs (обновляемость, например):
      'Set rs = New ADODB.Recordset
      'rs.CursorType = adOpenDynamic
      'rs.Open cmd
  End With
  Set cmd = Nothing
  rs.Close: Set rs = Nothing
  cnn.Close: Set cnn = Nothing

Если вместо обращений к формам Вы используете собственные параметры, тогда Вам нужно задать параметры вручную:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
  Set cmd = New ADODB.Command
  With cmd
    .ActiveConnection = cnn
    .CommandText = "ИмяПроцедуры"
    .CommandType = adCmdStoredProc
    .NamedParameters = True
      'Cоздадим параметр nVarChar (500)
    .Parameters.Append .CreateParameter("@имяПарматра1", adVarWChar, adParamInput,  500 , "Некая строка")
      'создадим параметр типа int (SQL) - Long (VBA)
    .Parameters.Append .CreateParameter("@имяПараметра2", adInteger, adParamInput, , CLng( 111 ))
      'и т.д.
    Set rs = .Execute(, , adExecuteNoRecords)
  End With
  Set cmd = Nothing
  rs.Close: Set rs = Nothing
  cnn.Close: Set cnn = Nothing

Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
  Set cmd = New ADODB.Command
  With cmd
  .ActiveConnection = cnn
  .CommandText = "ИмяПроцедуры"
  .CommandType = adCmdStoredProc
  For Each p In .Parameters
    Debug.Print p.Name
  Next
  Set cmd = Nothing
  cnn.Close: Set cnn = Nothing

2.4. Использование 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

2.5. Противопоказания к использованию конструкции Application.SetOption
Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия:

Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие подтверждений при удалении/редактировании данных через экран.

Подтверждения не отключаются, если в приложении работает сам разработчик.

2.6. Возможность отката
CurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции.
Пример отката внешней транзакции:
Код: 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
Т.е. В данном случае если не выполнится хотя бы один запрос, то все запросы "откатятся". Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками. В CurrentDb.Execute есть опция dbFailOnError - она относится только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос при ошибке откачен целиком и будет возвращена ошибка, или же возможно частичное выполнение запроса.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868988
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции.

Саныч, - как бы просто не вполне корректное некорректное высказывание.
Дешевле удалить...



дальше, про пример отката

автор Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками

Саныч, они "не выполнятся" если Предупреждения НЕ отключены, И пользователь отказался от завершения выполнения запроса (при этом не важно - произошли ошибки ли нет).
Во всех остальных случаях, в частности при возникновении ошибок, если
DoCmd.RunSQL выполняет action query, он выполнится, если там окажется хоть
что-то пригодное для выполнения (найдутся строки для делета, апдейта или
инсерта, на которых лшибок не произойдет )
- частичное выполнение я не знаю как отключить в Акцессе. Если ты знаешь
как - то прилично об этом сказать явно

:)


ЗЫ
вот окультурился севодни, впервые за два последних года. теперь жму клаву
окультуренный...


(с выражением лица)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868992
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатки:
1. сслыками -2 раза
2.Если вместо обращений к формам Вы используете собственные парметры , тогда Вам нужно задать параметры вручную:

Пункт 2.5 - использованы оба термина - аппликация и приложение, стилистически лучше бы один.

Мелочь, конечно, прошу извинить за занудность :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868996
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victosha авторCurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции.
Саныч, - как бы просто не вполне корректное некорректное высказывание.
Дешевле удалить...
Зачем удалить? Вот новая версия:

CurrentDb.Execute в отличие от DoCmd.RunSQL может быть включен во внешнюю транзакцию.

Victosha авторЕсли вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками
Саныч, они "не выполнятся" если Предупреждения НЕ отключены, И пользователь отказался от завершения выполнения запроса (при этом не важно - произошли ошибки ли нет).
Новая версия:

Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то при возникновении ошибок удастся откатить только запросы с ошибками, тогда как CurrentDb.Execute в таких случаях позволяет откатить всю транзакцию, в которую включено то, что посчитает нужным программист.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868997
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alexander GОпечатки:
1. сслыками -2 раза
2.Если вместо обращений к формам Вы используете собственные парметры , тогда Вам нужно задать параметры вручную:

Пункт 2.5 - использованы оба термина - аппликация и приложение, стилистически лучше бы один.

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

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

Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то при возникновении ошибок удастся откатить только запросы с ошибками...

ну, это просто обман.
Либо удастся откатить, вне зависимости от возникновения ошибок.
Либо не удастся откатить, даже если ошибки произошли. А так как написано -
это не оно...



ЗЫ

авторАппликацию и приложение решил не править.

умеешь же ты сказать двумя словами то, на что другому два тома не хватит.

Нет вижу границ собственному восхищению.

Пошел захлебываться в дыму и пиве...



(с выражением лица)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32869007
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычАппликацию и приложение решил не править. Меня учили, что повторения одинаковых слов можно избегать путем замены на синонимы.
Честно говоря, мне резанул глаз термин аппликация, но подумал о себе - значит, аппликация тебе не нравится, а контрол устраивает? - тогда помалкивай :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32869735
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч
По поводу DoCmd.RunSql SqlStatement, [UseTransaction]

Сей параметр не определяет атомарность выполнения запроса (т.е. или изменить/добавить/удалить все нужные записи, или не изменить ничего). Как уже было сказано, аксес при ручном* запуске запроса изменит все что можно, а что нельзя - на то отругается. И способ отключить сиё паскудное поведение не известен науке.
--------
* ручной запус - запуск запроса непостредственно из окна базы данных либо программно с использованием DoCmd.RunSql

Однако этот параметр влияет на изолированность результатов выполнения запроса (до его полного завершения) от других сессий. Если запрос изменяет большое количество данных, то в случае DoCmd.RunSql "трампампамп", False из другой сессии мы будем наблюдать "постепенное" изменение данных, а в случае DoCmd.RunSql "трампампамп", True - все изменения "появятся" сразу.

Для простоты можно считать, что использование UseTransaction := True работает эквивалентно следующему куску кода:
Код: plaintext
1.
2.
3.
4.
DBEngine( 0 ).BeginTrans
    CurrentDB.Execute "Update t Set f = value1 Where ID=id1" ' без dbFailOnError
    CurrentDB.Execute "Update t Set f = value2 Where ID=id2" ' без dbFailOnError
    CurrentDB.Execute "Update t Set f = value3 Where ID=id3" ' без dbFailOnError
DBEngine( 0 ).CommitTrans
а UseTransaction := False - работает эквивалентно этому же куску, но без BeginTrans/CommitTrans
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32869794
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Цветик
4) Возможно, поведение по умолчанию для DoCmd.RunSQL может быть изменено. Намеком на это является наличие параметра соединения
Jet OLEDB:Global Bulk Transactions
Однако, как им воспользоваться непосредственно при открытии mdb проекта -
я не знаю
Global Bulk Transaction - это немного не то.
Если мы хотим выпонять запрос через DAO.QueryDef или ADODB.Command, и при этом желаем иметь такую же "неизолированность", как в случае DoCmd.RunSql [UseTransaction] := False, то надо установить какие-то проперти для QueryDef или Command (какие точно проперти - не помню)
Для ADODB можно также установить пропертю "Jet OLEDB:Global Bulk Transaction" для конекшена - тогда оно будет автоматом использоваться для всех Command'ов
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32869921
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛП2 Цветик
4) Возможно, поведение по умолчанию для DoCmd.RunSQL может быть изменено. Намеком на это является наличие параметра соединения
Jet OLEDB:Global Bulk Transactions
Однако, как им воспользоваться непосредственно при открытии mdb проекта -
я не знаю
Global Bulk Transaction - это немного не то.



про не то - согласен. тем должно бы быть
Jet OLEDB:Partial Bulk Ops

несмотря на вот это описание
автор
Jet OLEDB:Partial Bulk Ops
A Long value (read/write) that determines the behavior of the Jet database engine when SQL DML bulk operations fail. When set to allow partial completion of bulk operations, inconsistent changes can occur, because operations on some records could succeed and others could fail. When set to allow no partial completion of bulk operations, all changes are rolled back if a single error occurs. The Jet OLEDB:Global Partial Bulk Ops property setting can be overridden for the current Recordset object by setting the Jet OLEDB:Partial Bulk Ops property.
The Jet OLEDB:Global Partial Bulk Ops and Jet OLEDB:Partial Bulk Ops properties can be set to any of the following values:

Default 0

Partial 1

No Partial 2

я не увидел, что no partial работает. хотя, наверно, плохо смотрел.
поэтому подумал, а может оно в паре с Global Bulk Transaction
должно работать?
Хотя, скорее всего, слепенький - вот и не увидел...

ЛП
Если мы хотим выпонять запрос через DAO.QueryDef или ADODB.Command, и при этом желаем иметь такую же "неизолированность", как в случае DoCmd.RunSql [UseTransaction] := False, то надо установить какие-то проперти для QueryDef или Command (какие точно проперти - не помню)
Для ADODB можно также установить пропертю "Jet OLEDB:Global Bulk Transaction" для конекшена - тогда оно будет автоматом использоваться для всех Command'ов

для комманда это должно быть Jet OLEDB:Bulk Transactions
для кверидефа UseTransaction (Тёмный выше), но ее надо добавлять к свойствам. и неясно - будет ли работать с несохраненными запросами...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32869979
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цветикнеясно - будет ли работать с несохраненными запросами...
Наверное будет (DoCmd ведь работает)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871087
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victosha авторЕсли вместо CurrentDb.Execute использовать DoCmd.RunSQL, то при возникновении ошибок удастся откатить только запросы с ошибками...
ну, это просто обман.
Либо удастся откатить, вне зависимости от возникновения ошибок.
Либо не удастся откатить, даже если ошибки произошли. А так как написано -
это не оно...
Понял. Тогда так:

Нередко возникает необходимость при возникновении ошибок отменить результат исполнения целого ряда запросов. DoCmd.RunSQL такой возможности не дает. CurrentDb.Execute, в отличие от него, позволяет откатить транзакцию, в которую включено то, что посчитает нужным программист.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871090
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ЛПОднако этот параметр влияет на изолированность результатов выполнения запроса (до его полного завершения) от других сессий. Если запрос изменяет большое количество данных, то в случае DoCmd.RunSql "трампампамп", False из другой сессии мы будем наблюдать "постепенное" изменение данных, а в случае DoCmd.RunSql "трампампамп", True - все изменения "появятся" сразу.
Понял, спасибо. Я все равно сомневаюсь, имеет ли отношение этот параметр к теме этого фака.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871160
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, оставляй в этом факе. С подрробным жевом ЛП идр.
з.ы. Блин, без инета на работе все самое интересное пропустил
з.з.ы. Саныч - спамер.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871166
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ТемныйСаныч, оставляй в этом факе. С подрробным жевом ЛП идр.
OK.

Темныйз.з.ы. Саныч - спамер.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871234
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТемныйСаныч, оставляй в этом факе. С подрробным жевом ЛП идр.
Не, Баба Яга против. Не место всяким там транзакциям и прочим глобал бульк инсёртам - в факе "как избавиться от подтверждений на удаление". Это разве что на отдельный фак тянет.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871236
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не... Тады это перекрестные факи. Поскольку именно в этом зтрагиается и RunSQL и Execute c их опциями.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871239
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТемныйНе... Тады это перекрестные факи. Поскольку именно в этом зтрагиается и RunSQL и Execute c их опциями.
мэй би. никто не запрещает факам быть перекрестными.

тема с транзакциями, воркспейсами, коннекшенами и т.п. - достаточно большая
тут и скрытый аксесовский воркспейс, и отличия DAO-шных и ADO-шных Execute'ов, и отличия аксесовских транзакций от общепринятых, и т.д., и т.п.

тока (имхо) не настолько это часто задаваемые вопросы :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871246
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох Позорныйтока (имхо) не настолько это часто задаваемые вопросы :)
О! Я долго искал, за что ухватиться. Вот за это и ухвачусь. Не буду в этом факе про Use Transaction.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32871255
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, давайте новый долгострой. AdvancedFAQ :)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32886698
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, может я его выложу?
А ты потом подправишь, как время появится?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32887128
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох ПозорныйСаныч, может я его выложу?
А ты потом подправишь, как время появится?
Я очень надеюсь, что смогу все сделать в ближайшие выходные.

"Вы ждали 3000 лет, подождите еще полчаса". (Надпись в аэропорту им.Д.Бен-Гуриона в зале для прибывших репатриантов.)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889285
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Опубликакано!
http://www.sql.ru/faq/faq_topic.aspx?fid=410
Замечания продолжают приниматься.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889430
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч - как всегда, ОЧ.КАРАШО!!

одно замечание только сходу -

1) приведенный код - рабочий,

автор Узнать, какие параметры от Вас хочет Аксесс,
можно с помощью следующего кода:
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim p As ADODB.Parameter
Set cnn = CurrentProject.Connection
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = cnn
.CommandText = "ИмяПроцедуры"
.CommandType = adCmdStoredProc

For Each p In .Parameters
Debug.Print p.Name
Next
Set cmd = Nothing
cnn.Close: Set cnn = Nothing

но "лучше" бы его переписать
так

With cmd
.CommandText = "ИмяПроцедуры"
.CommandType = adCmdStoredProc
.ActiveConnection = cnn
.Parameters.Refresh
For Each p In .Parameters
...

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

(с выражением лица)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889473
ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ы
Гость
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889513
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

спасибо.
а мораль-то какова?
работает в 2000аксе
код
авторWith cmd
.ActiveConnection = cnn
.CommandText = "ИмяПроцедуры"
.CommandType = adCmdStoredProc

For Each p In .Parameters
Debug.Print p.Name
Next

?

(с выражением лица)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889545
ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ы
Гость
Сейчас не скажу - 2000-го под рукой нету. Дома посмотрю, если трезвый буду. Но про .Refresh Гетц говорит, что в этом случае в 2000-м он работать не будет. Да и в 2002 не всегда работает, даже с установленным MDAC 2.8 и сервиспаками.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889637
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ыСейчас не скажу - 2000-го под рукой нету. Дома посмотрю, если трезвый буду. Но про .Refresh Гетц говорит, что в этом случае в 2000-м он работать не будет. Да и в 2002 не всегда работает, даже с установленным MDAC 2.8 и сервиспаками.

ладно, если смогу и не забуду - тоже посмотрю дома...

до опыта - думаю, что у обоих фрагментов одинаковые шансы на успех.
(в первом то рефрешь скрытый есть - и он либо работает либо нет...)

<...тут что-то было размазано...>

надо бы сравнить поведение на соединениях, образованных не через Set
присвоение, а на новых:

Set cnn= New ADODB.Connection
'cnn.CursorLocation=adUseClient
cnn.ConnectionString=CurrentProject.Connection.ConnectionString
cnn.Open

With cmd
.CommandText = "ИмяПроцедуры"
.CommandType = adCmdStoredProc
Set .ActiveConnection = cnn
.Parameters.Refresh
For Each p In .Parameters
Debug.Print p.Name
Next
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32889719
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот еще о чем подумал
А2000 писался в расчете на MDAC2.5 + SQL7
в такой паре рефрешу жить тяжело, если вообще возможно -
имена параметров все равно деть некуда - ели и "освежит", имена придется переприсвоить...

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

----------------------------------------------

посмотрел на refresh
смотрел через
A2000 9.0.4402 SR1
VBA 6.3.8863 version 9108
MDAC 2.8
ADP
SQL2K SP3
стандартная ссылка на ADO 2.1

скелет кода

Код: 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.
Sub testCommand()
  Dim cNN As ADODB.Connection
  Dim tCommand As ADODB.Command
  Dim tRec As ADODB.Recordset
  
  Set cNN = CurrentProject.Connection
  
  Set tCommand = CreateObject("ADODB.Command") '
  With tCommand
    
    '.NamedParameters = True ' недоступно при установленных по умолчанию ссылках
   
    Debug.Print cNN.Version
    
    If StrComp(cNN.Version, "2.5") =  1  Then
      Debug.Print CallByName(tCommand, "NamedParameters", VbGet)
      Debug.Print CallByName(tCommand, "Dialect", VbGet) ' это должно откликаться начиная с 2.7
      'устанавливаем значение
      CallByName tCommand, "NamedParameters", VbLet, True '  должно работать с 2.6
     
    End If
    
    .CommandType = adCmdStoredProc
    .CommandText = "findPathForTLX"
    .ActiveConnection = cNN
    .Parameters.Refresh
    .Parameters("@dogID").Value =  102 
    
    Set tRec = .Execute()
  End With
  
  Debug.Print tRec.Fields( 1 ).Name, tRec.Collect("lastmessagenumber")
  tRec.Close
  Set tCommand.ActiveConnection = Nothing
  
  '{C8B521FB-5CF3-11CE-ADE5-00AA0044773D} DBGUID_DEFAULT  Provider-specific default behavior
  '{C8B522D7-5CF3-11CE-ADE5-00AA0044773D} DBGUID_SQL  Transact-SQL query
  '{5D531CB2-E6Ed-11D2-B252-00C04F681B71} DBGUID_MSSQLXML  XML template query
  '{EC2A4293-E898-11D2-B1B7-00C04F680C56} DBGUID_XPATH  XPath query

End Sub

результаты наблюдений
1) именованный параметр извлекается независимо от того, открыта
или закрыта строка кода
CallByName tCommand, "NamedParameters", VbLet, True
(документация по адо по существу требует установки этого параметра
для установки обращений по именам, - наверно лучше его установить - у меня
результат не зависел него )

2) не получилось увидеть зависимость от
.ActiveConnection = cNN
.ActiveConnection = CurrentProject.Connection
Set .ActiveConnection = что-нибудь. (тут ничего не утверждаю)

3) Если явный рефреш не заказан, то восстановление параметров происходит при первом обращении к параметру по имени или по номеру - это не важно.

4) на моей проце рефреш оказался практически вдвое дороже, чем ее исполнение
(1,1955 и 0,6201 по QueryPerformanceCounter ), а на первом исполнении - много дороже.

так что явное формирование параметров - хороший совет
(там была выборка единственной строки из джойна 5000х100 по индексированным полям, так что нагрузки нет)


5) рефреш исполняет sp_procedure_params_rowset


Пока склонен думать, что если с версией MDAC все в порядке И
в системных таблицах базы нет мусора И с master database тоже все в порядке, то как будто нет причин не работать рефрешу.






(с выражением лица)
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32890852
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victosha2 Саныч - как всегда, ОЧ.КАРАШО!!
Я не автор.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32890978
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч Victosha2 Саныч - как всегда, ОЧ.КАРАШО!!
Я не автор.

скажем так - это общая оценка результата вообще, и того, что получилось из последних обсуждений в частности. В этой последней части от авторства формулировок, по крайней мере, не отнекаешся.
то есть - Ы (типа большой палец)
:))

про замечания

автор Set rs = .Execute(, , adExecuteNoRecords)
'adExecuteNoRecords - можно и не указывать, если в процедуре стоит Set NoCount ON

"по книжкам" - adExecuteNoRecords для того, чтобы Command возвращал
Nothing вместо Recordset - при этом это указание именно клиентской части
(АДО)
а
Set NoCount ON - указание SQL Server-у не гонять по сети
print-сообщений о количестве обработанных записей.
как указание/неуказание одного может влиять на другое?
...
Рейтинг: 0 / 0
156 сообщений из 156, показаны все 7 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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