|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
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.
2.2 Устранение ошибок в CurrentDb.Execute. Ошибка как правило со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало парметров. Ожидалось Число"). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные парметры, - все эти обращения будут восприняты как параметры, которым не передано значение. Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ): MSDN писал: NOTE : В DAO Вы должны явно начить параметр; При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами назначить пременную в параметр, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает негласно с действиями DoCmd. С другой стороны, DoCmd работает на более высоком уровне чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, что сделать с параметрами - Вы не имеете никакой гибкости по использованию различных значений параметра. Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6.
Если вместо обращений к формам Вы используете собственные парметры (например [Введите первый параметр:]), тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5.
2.3. Использование DoCmd.RunSQL. Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать сообщения об ошибках до конца работы программы. Также есть возможность, что в отладочный период Вы можете остановить выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2.4. Противопоказания использования конструкции Application.SetOption Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. Подтверждения не отключаются, если в аппликации работает сам разработчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 17:08 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не вытерпела душа поэта, кинул раньше Как говориться - пожалуйте, терзайте... да ещё меня смущает название FAQ'a и строчка в п.2.2. (первый блок кода) Код: plaintext
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 17:12 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Да ещё очень хотелось бы услышать мнение, и несколько строчек в ФАК от ЛП и SV ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 17:15 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Насчет Eval была моя реплика в том топике, откуда ты копировал. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 17:49 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Маленькая просьба - я бы хотел, чтобы этот фак не публиковался до моего возвращения из армии 3 числа. (На правах просьбы, исполнять не обязательно.) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 18:02 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
маленькая ремарка на >NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не >производиться. читаем хелп и видим DoCmd.RunSQL инструкцияSQL[, использоватьТранзакцию] причем по умолчанию второй параметр True. так что мелочь, но приятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 18:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Драсте... 1) Сдается мне, что на вопрос надо смотреть несколько шире, например так: "FAQ: Запуск SQL-запросов из VBA-кода"; 2) Возможно стоит упомянуть, что выполнять запрос будет непосредственно Jet, и что DoCmd.RunSQL (Access), DB.Execute (DAO), Connection.Execute (ADO) являются не более чем интерфейсами к Jet. Это, конечно, элементарно, но где-то натыкался на мнение, что запросы запущенные из ADO выполняются быстрее чем запросы, запущенные из DAO, что полная ерунда! Время, занимаемое в библиотеках при предварительной обработке команды, конечно, разное, но запрос в итоге будет передан ядру Jet, которое и его выполнит; 3) Ну и коль скоро я коснулся скорости выполнения, то думаю, что стоит упомянуть и об асинхронном выполнении запроса. Что это такое, в чем плюсы и минусы, какие проблемы могут возникнуть и как их избежать... Но все это, конечно, ИМХО... //в смысле, сорри, если чё не так... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 20:51 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Нуф, рад тебя видеть. Согласен со всем сказанным на все сто. А про п.3 - может, ты сам и расскажешь? :^) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 21:02 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, тоже рад! :) Правда, получается вас (всех) только "читать", да и то с перерывами :( На счет третьего пункта я могу попробовать что-нить родить, но тока в течении следующей недельки... Не быстро, тобишь... Удачи! //уехал к лубимой дэвушке, которая, зараза :), жмет ее рабочий ноутбук - толи из-за того, что я за ним перестаю замечать, собстна, дэвушку, толи из-за "топ сикрет информэйшен" на нем Не... Попробую, сётаки, выкляньчить доступ к "железу" на выходные :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 21:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Нуф, не торопись. Во-первых, девушка важнее. И во-вторых тоже. А в-третьих, я все равно только 3 числа из армии вернусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 21:59 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
У меня тож просьба - не публиковать до моего окончательного выхода из отпуска (ближайший понедельник) По поводу первого замечания Нуф-Нуфа (привет кстати!) "Как избавиться от подтверждений..." все-таки более фрикуентли аскед, чем "Как запускать запросы...". Так что в названии оставить надо. Можно совместить - "Как избавиться от подтверждений ... трататушки-тратату... (как запускать запросы из VBA)" 2 Мох (который Sfagnum) QueryDef.Execute dbFailOnError Прочитай в хелпе в расскажи другим ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:03 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не производиться. Не есть правильно Используется ли транзакция - устанавливается в св-вах запроса. И даже если используется - она своя собственная, никак не зависящая от внешней (сделанной через BeginTrans/Commit). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:12 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Убрать Код: plaintext
тогда не нужно будет Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:14 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать сообщения об ошибках до конца работы программы Не сообщения об ошибках, а перестанет выдавать подтверждения на удаление и т.п. Все Ушел пить вотку ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:16 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох, с приехалом. "Данных через экран" - все равно придется оставить. ...А теперь я сочувствую тому человеку, который будет все эти комментарии собирать по крохам и вносить все эти заплатки. Видимо, этим человеком буду я (как бывший корректор). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Нет, именно сообщения об ошибках. Это же речь об SetWarnings. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:21 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Мне что ли попросить не публиковать данный фак пока из отпуска не вернусь Правда я там еще не был, но скоро Скоро СКоро СКОро СКОРо СКОРО ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2003, 23:44 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вернулся с выходных...\r \r Народ никто и не собирался публиковать FAQ без вашего одобрения, я же в выступаю в качества канала доводящего ИСТИНУ до простых смертных :)\r \r Насчёт транзакции, наверное не правильно понял фразу ЛП эдесь Дата: 18 июн 03, 15:24\r \r Всё остальное посмотрю откоментирую-оформлю пойзже ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2003, 09:16 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир Саныч писал:Насчет Eval была моя реплика в том топике, откуда ты копировал. Нашёл буду исправить... Лох Позорный писал:2 Мох (который Sfagnum) QueryDef.Execute dbFailOnError Прочитай в хелпе в расскажи другим Прочитал, но пока ещё не придумал куда впихнуть и к чему сделать смысловую привязку... Лох Позорный писал:Убрать Код: plaintext
Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. А если человек хочет избавиться от подтверждения на удаление таблицы/запроса Оставляю... Лох Позорный писал:В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать сообщения об ошибках до конца работы программы Не сообщения об ошибках, а перестанет выдавать подтверждения на удаление и т.п. Согласен - SetWarnings - это всё таки, что то типа "установить предупреждения" Поменяю... То All Я прочёл всё очень внимательно... но ещё не сформировал своё видиние проблемы... Предлагаю добавить п.3. Дополнительная информация и туда всё, что вы хотите добавить... Одна просьба выкладывать более оформленные мысли и не много о том в каком разделе вы хотели бы их видеть.. ЗЫ Строку: NB! При использовании DoCmd.RunSQL следует учесть, что транзакция не производиться. Уберу ввиду её не корректности. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2003, 10:24 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Чо то все забыли про эту тему... Нуф-Нуф обещал что то родить в течении недели, видно всё акушерку ищет... "Хорошо переносящего обрезку" прсил высказаться насчёт почему лучше юзать CurrentDb.Execute, а не DoCmd.RunSQL более подробно... и SV тоже не откликнулся... Саныч обещался посодействовать... Моя в печали... иех... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 16:21 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
прсил высказаться насчёт почему лучше юзать CurrentDb.Execute Вай мая твая не панимай Как почему лучше? Патамушта! Хотя бы патамушта от подтверждений не надо избавляться. А потом их обратно включать. И хотя бы патамушта можно заключить во внешнюю транзакцию. И хотя бы патамушта ну не люблю я объект DoCmd ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 17:11 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
про внешнию транзакцию по подробнее ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 17:23 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вижу-вижу упоминание меня. :^) Я совсем зашитый на работе. Может, в выходные что-нибудь смогу... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 17:30 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
про внешнию транзакцию по подробнее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Если при выполнении любого запроса (1, 2 или 3) возникнет ошибка (нарушение уникальности, ссылочной целостности, да вообще любая ошибка) - откатятся все запросы. Если же исполняем запросы через DoCmd.RunSQL - нсмотря на вызов метода Rollback результаты выполнения запросов не откатываются. Т.е. возможно, что будет исполнен Запрос1, Запрос2, а Запрос3 не будет исполнен. Кстати, это надо бы проверить на всякий случай. У запроса есть св-во "Использовать транзакцию", но оно отвечает только за то, будет ли запрос выполнен целиком (или целиком откачен), или же возможно частичное выполнение запроса. К внешней транзакции транзакция запроса не имеет никакого отношения, они принимаются или откатываются независимо друг от друга. Тьфу, как то оно все сложно получилось. Косноязычием начинаю страдать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 17:55 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Нда... Как-то некрасиво с моей стороны получилось... Сфагнум, вот сёни акушерка ей богу не отвертится! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 18:46 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Жертвую не написанную (до сего момента) главу из не написанной (никогда) моей книги "Акс: как это работает" В большинстве случаев выполнение запросов из кода программы происходит в "синхронном" режиме – исполняемый код сразу после запуска запроса останавливается и не выполняется до тех пор, пока запрос "не отработает". В отличии от Синхронного режима, Асинхронный режим выполнения запросов позволяет продолжить выполнение кода не дожидаясь окончания выполнения запущенного запроса. Зачастую асинхронному режиму приписывают магические свойства ускорять работу приложения, за счет параллельного (одновременного) выполнения как программного кода, так и запущенного запроса. Чтобы понять всю глубину данного заблуждения необходимо иметь хотя бы минимум знаний об организации многопоточности в Windows и о реализации механизма асинхронного выполнения запросов в Access. Концепция многопоточности заключена в самом названии – "много потоков", где под "потоками" подразумеваются потоки исполняемого кода. ОС Windows последовательно подключает каждый из потоков к процессору на определенный квант времени, в результате чего создается впечатление, что несколько Приложений выполняются одновременно. На самом деле в однопроцессорной системе (наиболее распространенной) в каждый момент времени выполняется только один поток (задача). Один поток!!! Вооружившись данными знаниями, вернемся к "параллельному" выполнению программного кода и запроса. В простейшем случае выполнение программного кода и запроса будет происходить в двух различных потоках, которые будут по очереди (!!!) подключаться к процессу. Получим ли мы выигрыш в эдаком параллельном выполнении? Нет! Проведем гипотетический тест: Есть некая задача, решение которой выполняется программным кодом (пусть время выполнения которого равно 5 секундам) и выполнением запроса (время выполнения запроса тоже примем за 5 секунд). Запустим выполнение запроса в синхронном режиме. Время решения нашей задачи будет равно 10 секундам (5 секунд выполняется код и еще 5 секунд выполняется запрос). Теперь запустим запрос в асинхронном режиме, при этом время выполнения задачи (выполнения кода и запроса) составит… 10 секунд! "Почему? Ведь мы выполняем запрос в асинхронном режиме, а значит код и запрос должны выполняться параллельно!" – так спросили бы мы, если бы не знали, что ОС Windows просто-напросто будет выполнять наш код и наш запрос "параллельно" за счет поочередного предоставления процессорного времени этим двум задачам. Более того, это самое переключение между задачами (потоками) тоже занимает определенное время и в случае "параллельного" выполнения двух задач по 5 секунд каждая может набежать еще одна секунда на переключения между потоками! Итого, вариант решения нашей задачи с использованием режима асинхронного выполнения запроса занял по времени 11 секунд! Мы рассмотрели простейший случай. На самом деле все намного сложнее – потоки могут иметь разные приоритеты, которые напрямую влияют на распределение процессорного времени между задачами. Так, процессорное время распределяется по возможности равномерно только между потоками с одинаковым приоритетом – все другие потоки с более низким приоритетом не получат процессорного времени до тех пор, пока более приоритетные задачи не перестанут требовать своего выполнения. Как только это произойдет, Windows начнет выделять процессорное время для потоков с меньшим приоритетом, выполнение которого может быть прервано в любой момент другой, более приоритетной задачей. Задача асинхронного выполнения запросов в Access реализована именно на создании нескольких потоков с разными приоритетами – поток, выполняющий программный (VBA) код вашего проекта имеет больший приоритет, чем поток, выполняющий запрос в асинхронном режиме. Таким образом, Асинхронное выполнение запроса будет производиться только в те моменты, когда не выполняется наш программный код. Т.е. запрос будет выполнен только по окончании выполнения нашего кода! Зачастую мне доводилось видеть код, который выполнял примерно следующее: …код, который мне доводилось выдеть …почему это неправильно… …а как же правильно?… …асинхронные запросы вы пользуете давно! (описание механизма загрузки данных при открытии формы - что, как, и что еще можно сделать) …часть асинхронного запроса может быть выполнена СИНХРОННО, а все остальное в асинхронном режиме… …когда нельзя (бессмысленно) применять асинхронные запросы… …когда применение асинхронных запросов оправданно… …может что еще на ум взбредет… З.Ы. Сфагнум, ну всё! Акушерка (на сегодня) с криками "Затрахали-и-и-и-и!!!!" убёгла Продолжение будет (может быть), но уже на следующей неделе ;) …если интересны вкратце обозначенные темы. Хотя, знаешь, согласись, что ну никак это всё в фак не лезет – слишком много текста, а повыкидывать не могу, ибо непонятно будет… ФАК, всетаки, не для профи писан должен быть… //пошел в своё "Социологическое исследование" - через пару часиков дойду и туда :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2003, 23:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир Саныч писал:Вижу-вижу упоминание меня. :^) Я совсем зашитый на работе. Может, в выходные что-нибудь смогу...не проблема, работа прежде всего, сам так же :) 2 Лох Позорный Молодца!!! спасибо огромное.... проверю положу... 2 Нуф-нуф Выводы (Выжимка).... При синхронном режиме выполнении запроса из VBA кода программы происходит следущее: VBA код сразу после запуска запроса останавливается и не выполняется до тех пор, пока запрос не "отработает". Асинхронный же режим выполнения запросов позволяет продолжить выполнение VBA кода не дожидаясь окончания выполнения запущенного запроса. Присутствует миф, что асинхронное выполнение запроса ускоряет работу приложение за счёт параллельного (одновременного) выполнения как VBA кода, так и запущенного запроса, это не так исходя из реализации многопоточности в Windows. Многопоточность в Windows реализована следующим образом (упрощённо): последовательно подключается каждый из потоков к процессору на определенный квант времени, в результате чего создается илюзия одновременного выполнения несколько приложений(потоков). При этом ещё учитывается приоритет задачи(потока), т.е. сперва выполняеться задача с более высоким приоритетом(даже если она поступила пойзже), а потом с более низким. Из этого получаем, что на самом деле асинхронный режим выполнения запросов не быстрее, а иногда даже медленнее(надо преключать потоки на выполнение VBA кода и обратно) синхронного. Учитывая то, что приоритет выполнения VBA кода выше, чем потока, выполняющего запрос в асинхронном режиме, то применять асинхронный режим иногда просто не допустимо. мда... вот так вот получилось.... если что исказил поправьте.... да, ты о самом главном не сказал, как запускать запросы в ассинхронном режиме, в каком режиме по умолчанию выполняються DoCmd.RunSQL & CurrentDb.Execute... >…асинхронные запросы вы пользуете давно! (описание механизма загрузки >данных при открытии формы - что, как, и что еще можно сделать) >…часть асинхронного запроса может быть выполнена СИНХРОННО, а все >остальное в асинхронном режиме… >…когда нельзя (бессмысленно) применять асинхронные запросы… >…когда применение асинхронных запросов оправданно… это очень интересно >…код, который мне доводилось выдеть > >…почему это неправильно… >…а как же правильно?… по этому поводу ничего сказать не могу не достаточно данных... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 10:48 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Сфагнум! Я плякаль... (С) не помню кто Ты опять заставляешь меня комплексовать Как заправский редактор поначеркал-поначеркал :) Но в итоге получилось, конечно, более концентрированно и лаконично... На счет продолжения... Будет... Надеюсь, что на следущей неделе, во всяком случае от меня продолжение последует. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 19:28 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Процессы, многозадачность... Вот вам: Руководство по архитектуре IBM PC XT/AT. 1993 Для эффективной работы по защите многозадачности в МП 80386/80268 применяются специальные структуры данных. Для этого не требуется использование новых команд управляющих многозадачностью. Используются обычные команды передачи управления, которые обращаются к специальным структурам данных. <...> С помощью этих структур МП может быстро переключиться с одной задачи на другую, сохраняя контекст исходной задачи так, что задача может быть в дальнейшем продолжена... Т.е. все именно так, как сказал Нуф-Нуф (не упоминается лишь Виндовс и "потоки") Шагаем дальше: роцессор Pentium по сравнению со своими предшественниками обладает целым рядом улучшенных характеристик. Главными его особенностями являются: - двухпотоковая суперскалярная организация, допускающая параллельное выполнение пары простых команд; - наличие двух независимых двухканальных множественно-ассоциативных кэшей для команд и для данных, обеспечивающих выборку данных для двух операций в каждом такте; - динамическое прогнозирование переходов; - конвейерная организация устройства плавающей точки с 8 ступенями; - двоичная совместимость с существующими процессорами семейства 80x86. Т.е. этот процессор уже можно заставить гоняться за двумя зайцами одновременно. По П4 у меня ничего нет, но, кажецца, там с "многозадачностью" шагнули дальше. Кроме того, имхо, поаккуратней надо с с терминологией: потоки, процессы и пр. Как бы не засмеяли потом. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 19:52 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Geo, защищайтесь! :) >имхо, поаккуратней надо с с терминологией: потоки, процессы и пр. Как бы не засмеяли потом. С терминологией не всё в порядке вообще, т.е. в принципе! С Процессом все ясно. Процесс – это… это… это вообще виртуальное понятие по большому счету связанное с выделением виртуальной памяти. Т.е., запуская некое приложение вы тем самым создаете процесс, который выполняется в своем собственном виртуальном адресном пространстве. Данный процесс может содержать ПОТОКИ или НИТИ. Вот здесь с терминологией полный писец, который вообщем-то не мешает жить, если привыкнуть что "поток=нить". Далее… Процесс не имеет никакого отношения к многозадачности вообще! Т.е. ядро Windows, которое непосредственно реализует многозадачность, вообще не в курсе (упрощенно) о существовании Процессов. Для этого самого ядра существуют только Потоки (нити), которые она, грубо говоря, по очереди подсовывает на выполнение процессору (аппаратное устройство такое:). Потоки имеют приоритеты, в соответствии с которыми и получают машинное время. Приоритеты могут меняться самой ОС динамически – получил ПРОЦЕСС фокус (т.е. пользователь стал с ним работать) – все входящие в данный Процесс ПОТОКИ (Нити) автоматом "повышаются в приоритетах" и машинного времени им выделяется поболее. Это о терминологии и о "не запутаться" :) >Шагаем дальше: роцессор Pentium по сравнению со своими предшественниками обладает целым рядом улучшенных характеристик. Главными его особенностями являются: - двухпотоковая суперскалярная организация, допускающая параллельное выполнение пары простых команд; - наличие двух независимых двухканальных множественно-ассоциативных кэшей для команд и для данных, обеспечивающих выборку данных для двух операций в каждом такте; - динамическое прогнозирование переходов; - конвейерная организация устройства плавающей точки с 8 ступенями; - двоичная совместимость с существующими процессорами семейства 80x86. Т.е. этот процессор уже можно заставить гоняться за двумя зайцами одновременно. По П4 у меня ничего нет, но, кажецца, там с "многозадачностью" шагнули дальше. ГЕО! Млин… Это ж речь о так называемом "конвейере" – процессор выполняет параллельно ОДИН (!!!) ПОТОК (НИТЬ). Т.е. процессор выполняет последовательно следующие друг-за-другом команды параллельно в надежде на то, что не произойдет "ветвления" – не будет перехода на другой адрес в памяти, который еще даже не загружен во внутренний кэш процессора. В современных процессорах параллельно выполняется ряд ветвлений – т.е. процессор заранее анализирует встречающиеся ветвления в коде, загружает их в себя и всячески готовится к их выполнению. Какое из ветвлений сработает – то и будет выполняться дальше, а все остальные побоку… Чуешь, чем пахнет? :) Процессор не в состоянии выполнять никак не связанные между собой задачи – активные регистры процессора одни и те же, поэтому параллельное выполнение в твоих доках употребляется совсем в другом контексте. Но, всё же, что бы как-то всех (и себя тоже) утешить, скажу, что уже (давно) существуют МНОГОПРОЦЕССОРНЫЕ системы, в которых многозадачность действительно становится многозадачностью – несколько разных ПОТОКОВ (НИТЕЙ) могут выполняться параллельно. Увы, это тока для наикрутейших серверов, графических и прочих "станций". Кстати, Сфагнум, вот последний абзац надо как-то осветить. В моем первоначальном варианте было " На самом деле в однопроцессорной системе (наиболее распространенной) в каждый момент времени выполняется только один поток (задача)." Надо оставить… ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 20:31 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2Нуф-Нуф Туше. :) Я это и имел в виду, тока забыл, кто кого содержит, процесс потоки или же наоборот. А дальше, чем x386, я с процессором/регистрами и пр. дрянью не работал :) Но мораль моего поста - прежде, чем что-то писать, надо про это вниматильно почитать. А не то беда может случиться. :) ...А-а-пчхи!! (точно) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 20:38 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2Нуф-Нуф Вот: Согласно Intel, гиперпоточный режим - это дизайн одновременного выполнения нескольких процессов, при котором операционная система видит один процессор как два логических, способных обрабатывать параллельные потоки инструкций переключаясь с одного процесса на другой каждые несколько наносекунд. Хотя уловка не может реально удвоить производительность процессора (например, при операциях с плавающей точкой), представители Intel утверждают, что гиперпоточная технология способна увеличить число пользователей или веб-транзакций, которые одновременно может обслуживать сервер. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 20:45 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>Туше. Гео, а я чего? Я ничего :) >прежде, чем что-то писать, надо про это вниматильно почитать. Дык… Ежлиб не читал, то и не писал бы :) Про Винду в целом много чего писано (а значит и читано), а вот про Аксес в Винде (как работает, как и что делает) – практически ничего :( Т.е. знания о Винде имеют практически нулевую ценность при работе в Аксе. Правда, ковыряюсь потихоньку, но на КНИЖКУ (:)) сё равно не хватает :) Да и Сфагнум, злодей, задушил в зачатии одну из Глав >Согласно Intel, гиперпоточный режим Гео, щаз в глаз дам >Хотя уловка не может реально удвоить производительность процессора (например, при операциях с плавающей точкой) Всё может быть, но пойми ты, что... блин... как бы это объяснить та... Если процессор так крут, что может выполнять аж два-три-десять потоков одновременно, то только за счет того, что он это всё будет выполнять в два-три-десять раз медленней! Кстати, Если он так крут, что выполняет сразу два независимых потока, то это уже не один процессор, а два в одном корпусе - уже многопроцессорная система, а я говорю (внимание!) в ОДНОПРОЦЕССОРНЫХ системах! Процессор (аппаратное устройство) не может выполнять быстрее то, что он уже делает! Два процессора - да, будут выполнять работу примерно в 1,7 раз быстрее, а один - он и в африке один! Может быть я что-нибудь упустил в современных технологиях, но уж больно это заявление Интел на маркетинговый ход смахивает. Кстати, а хочешь, я тебе в противовес приведу описалово Винды из двух хороших книжек и пары инет-ресурсов, в которых существует ПРОЦЕССОР или МНОГОПРОЦЕССОРНАЯ система? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 21:02 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не... Не приведу... Слишком много выберать и ручками набирать надо будет... А все то, что я написал и собирался написать про асинхронное выполнение запросов в Аксесе - протестировано. Правда, система ОДНОПРОЦЕССОРНАЯ в основе всех выводов лежала :) //чуть не подрались ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2003, 21:11 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Уклоняясь от основной темы (фак) про многопоточность замолвлю слово. Или, скорее, против нее Кажеться я это уже рассказывал, но такое не грех и повторить. Итак. -------------------------------------------------------------------------- Проводили тестирование "4-х процессорная система vs. 1-процессорная" Конфигурация двух компов была одинаковой, только в одном из них в большой мамке торчало 4 камня, а в другом в точно такой же мамке - 1 камень. Все остальное - адын к аднаму. Загрузили компы одновременным выполнением каких-то грузящих процы задач. Что-то типа какого-то шифрования, обработка изображений, закрытие банковского опердня, и еще что-то. За давность лет уже не помню. Как вы думаете, кто выполнил эту работу быстрее и насколько? Все мои знакомые программеры обычно отвечают "Ну наверное 4-хпроцессорная система быстрее, но уж никак не в 4 раза, а гораздо меньше". Некоторые даже утверждали, что однопроцессорная может и побыстрее будет. Это все неправильные ответы. Быстрее действительно 4-хпроцессорная. Примерно в 100 раз. Этому даже нашли объяснение, похожее на правду. Во-первых на однопроцессорной машине переключение контекстов задач сжирало слишком много ресурсов. Во-вторых - на одном проце разные задачи тупо вытирали друг другу процессорный кеш. -------------------------------------------------------------------------- Так вот. Мораль сей басни такова. Можно было получить 100 -кратный выигрыш в производительности увеличив количество процессоров. А можно было получить 25 -кратный выигрыш в производительности, просто напросто исполняя задачи последовательно, а не паралелльно ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2003, 12:25 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ЛП>А можно было получить 25-кратный выигрыш в производительности, просто напросто исполняя задачи последовательно, а не паралелльно Нуф>Более того, это самое переключение между задачами (потоками) тоже занимает определенное время и в случае "параллельного" выполнения двух задач по 5 секунд каждая может набежать еще одна секунда на переключения между потоками! Итого, вариант решения нашей задачи с использованием режима асинхронного выполнения запроса занял по времени 11 секунд! //см пост от 11 сентября 2003 23:27 :) ЛП тока я не понял - ты в лагере Красных или Синих? Гео, выбирай цвет! :) Сфагнум, слушай, здесь (в данном ФАКе) всё это действительно лишнее! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2003, 15:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ЛП тока я не понял - ты в лагере Красных или Синих? Я в лагере пьяных. В данный момент еще нет, но уже туда ползу Если предположить, что Красные - это противники асинхронного выполнения, то я буду фосфорецирующим. Бездумное "распараллеливание" не то что бы не приведет к ускорению, но может привести и к значительному (в разы) замедлению общей скорости. Сфагнум, слушай, здесь (в данном ФАКе) всё это действительно лишнее! Угу. Можно упомянуть про то, что при выполнении запроса через CurrentDb.Execute (QueryDef.Execute, Command.Execute и т.п.) можно указывать дополнительные параметры (как то асинхронное выполнение и куча всякой другой срани). И этого хватит. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2003, 15:56 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Geo писал:Кроме того, имхо, поаккуратней надо с с терминологией: потоки, процессы и пр. Как бы не засмеяли потом.> Многопоточность в Windows реализована следующим образом (упрощённо): упрощённо - ключевое слово Нуф-Нуф писал:> Сфагнум, слушай, здесь (в данном ФАКе) всё это действительно лишнее! ЛП писал: Угу. Можно упомянуть про то, что при выполнении запроса через CurrentDb.Execute (QueryDef.Execute, Command.Execute и т.п.) можно указывать дополнительные параметры (как то асинхронное выполнение и куча всякой другой срани). И этого хватит. Не я это начал, но в прынцыпе согласен, у нас не фак по форточкам... кому интересно пускай копает... но вот это думаю нада всё ровно осветить >да, ты о самом главном не сказал, как запускать запросы в ассинхронном >режиме, в каком режиме по умолчанию выполняються DoCmd.RunSQL & >CurrentDb.Execute... > >>…асинхронные запросы вы пользуете давно! (описание механизма загрузки >>данных при открытии формы - что, как, и что еще можно сделать) >>…часть асинхронного запроса может быть выполнена СИНХРОННО, а все >>остальное в асинхронном режиме… >>…когда нельзя (бессмысленно) применять асинхронные запросы… >>…когда применение асинхронных запросов оправданно… > >это очень интересно > >>…код, который мне доводилось выдеть >> >>…почему это неправильно… >>…а как же правильно?… >по этому поводу ничего сказать не могу не достаточно данных... в некоторых пунктах можно сослаться при необходимости на реализацию многопоточность в Windows... если кому надо подробнее пускай копает... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2003, 09:44 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
выдернул отсюда (Нуф-нуф Дата: 13 сен 03, 20:11)\r \r 1) Асинхронное выполнение селектов есть хорошо. \r 2) Асинхронное выполнение исполняемых запросов оправданно в случаях, когда коду, который его запускает, не нужны результаты выполнения данного запроса. \r 3) В многоПРОЦЕССОРНЫХ системах. \r Решение может быть обжаловано :) \r \r так и запишем... для приложений не использующие сервер. (MDB на сервере насколько я понимаю не в счёт, использующие сервер - тока с SQL Server и иже с ним) извените, но по-русски сказать не смог... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2003, 10:22 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Как избавиться от подтверждений на удаление и т.п., или что лучше 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.
2.2 Устранение ошибок в CurrentDb.Execute. Ошибка как правило со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало парметров. Ожидалось Число"). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные парметры, - все эти обращения будут восприняты как параметры, которым не передано значение. Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ): MSDN писал: NOTE : В DAO Вы должны явно начить параметр; При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами назначить пременную в параметр, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает негласно с действиями DoCmd. С другой стороны, DoCmd работает на более высоком уровне чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, что сделать с параметрами - Вы не имеете никакой гибкости по использованию различных значений параметра. Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6.
Если вместо обращений к формам Вы используете собственные парметры (например [Введите начальную дату:], тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5.
2.3. Использование DoCmd.RunSQL. Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п.(в том числе и предупреждения об ошибках), до конца работы программы. Также есть возможность, что в отладочный период Вы можете остановить выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2.4. Противопоказания использования конструкции Application.SetOption. Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. Подтверждения не отключаются, если в приложении работает сам разработчик. 3. Дополнительная информация. 3.1. Возможность отката. CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. Пример отката внешней транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. В DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса. 3.2. Асинхронное выполнение запроса. CurrentDb.Execute - позволяет выполнять запросы асинхронно используя опцию dbRunAsync . DoCmd.RunSQL - выполняется на усмотрение Access (???) 3.2. Применимость асинхронных запросов. Не смотря на расхожее мнение, что асинхронные запросы выполняются быстрее - это не так, в связи с реализацией многопоточности в Windows. Рекомендуется использовать асинхронные запросы при выполнении: запросов на выборку( SELECT ). исполняемых запросов( INSERT , UPDATE и т.п.)в случаях, когда коду, который его запускает, не нужны результаты выполнения данного запроса немедленно. В многоПРОЦЕССОРНЫХ системах. В остальных случаях надо учесть, что Вы можете оказаться в ситуации, когда не все данные выбрались, добавились и т.п. NB!!! Выше сказанное относиться к приложениям НЕ использующими серверные технологии (данные в mdb на сервере не есть серверная технология). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2003, 13:38 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вот мои очередные потуги... Ну исправить неточности/разночтения/ошибки эт постоянная просьба... Потом Нуф упоминал о таком звере как Connection.Execute(ADO), ВС согласился с включением его в список, остальные не против были. К сожалению я не юзаю ADO, и поэтому не в курсе что это за зверь... Пожалуста осветите этот вопрос всесторне (грабли, параметры, асинхронность, транзакцию). Ожидаю асинхронность в применении к клиент серверной технологии... ну и конешно ваших предложений ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2003, 13:45 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Похоже, что в эту пятницу я наконец смогу в этом факе поучаствовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2003, 13:46 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Приветствуеться, если захочешь править могу скинуть "исходники" или по окончанию? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2003, 13:47 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Орфографических ошибок я вижу какое-то количество, но их надо будет править после того, как устаканится сам текст. Тогда я попрошу исходники. А пока я хочу внимательно прочитать весь топик и проверить, как все согласуется друг с другом. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2003, 13:50 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Буду ожидать рекомендаций... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2003, 13:51 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Итак, я прошелся по всему топику и попытался собрать вместе все замечания, которые пока не вошли в полный текст фака. 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). ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2003, 15:39 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч,в русской технической литературе Action Query обычно переводится как "Запросы действия" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2003, 17:12 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 ВС 1 - принимаю 2 - по моему аккуратнее будет так: 2.1. Методы отключения сообщений на подтверждение при запуске Action Queres. 3.1. - да ты что?!?!?! - убедюсь добавлю 3.2. - добавлю. 4. - ок... - я так понимаю енто тоже в п.2.2. 5. - я это имел ввиду, но сейчас внимательно прочитал - действительно х..ня получилась... исправлю 6. - ок. 7. - тоже не против... 8. - в пукт 3.2. пойдут... Саныч а чо про Connection.Execute - та ничего и не скажем??? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 09:24 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Ах да исправленый вариент положу по пойзже... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 09:37 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>4. Альтернативный способ передачи в запрос значений контролов: перед запуском запроса занести значения контролов в переменные, а в запросе пользоваться функциями, которые возвращают значения этих переменных Саныч! Можешь еще замолвить словечко за НЕ_Хранение_в_переменной_с _чтением_из_нее_функцией, а за _чтение_функцией_напрямую _из_контрола_формы? ЗАЧЭМ еще промежуточная переменная при открытой форме?.. >Саныч,в русской технической литературе Action Query обычно переводится как "Запросы действия" Из справки: "Управляющий запрос. Запросы данного типа создают, удаляют и изменяют таблицы или создают индексы в базах данных..." ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 10:37 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 Sfagnum: > Методы отключения сообщений на подтверждение Это по-русски называется сообщение??? Когда задается вопрос, это называется сообщение??? > 3.1. - да ты что?!?!?! В изначальном топике я этот вопрос задавал Лоху красным цветом, и он отвечал. > а чо про Connection.Execute - та ничего и не скажем??? :^) А я с ADO на Аксессе не работал. 2 Alexus12: > _чтение_функцией_напрямую _из_контрола_формы А мне это не нравится. У моего варианта еще то достоинство (которое тоже надо упомянуть), что форму не обязательно держать открытой. Хотя, конечно, и этот способ можно назвать. > Из справки: "Управляющий запрос. А этот термин все понимают? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 11:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Простите коллеги, но я такого не говорил (хотя... кто ж его знает ). Или меня неправильно поняли, или у меня pronounce страдает. В запросах на удаление и перекрестных запросах ссылки на конролы форм типа Forms![блаблабла]![блаблабла] не подцепляются автоматом (как это просходит в запросах на выборку, добавление и обновление). Как раз "For Each p In q.Parameters и т.д." и должно помочь (не проверял, ибо вообще не люблю такие вещи). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 12:00 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
МОЛНИЯ ПОНЯЛ ПРОШУ ПРОЩЕНИЯ ДЕЗИНФОРМАЦИЮ ЦЕЛУЮ САНЫЧ ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 12:02 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>А мне это не нравится. У моего варианта еще то достоинство (которое тоже надо упомянуть), что форму не обязательно держать открытой. Хотя, конечно, и этот способ можно назвать. Согласен - достоинство, если форму нужно закрытой и если юзверь настолько продвинут, что сам помнит, что у него хранится в глобальных переменных (хоошие у вас юзеры... нам бы таких...). Прошу воздуха глоток и для моего вар-та в простом случае - когда по данным из контролов жмакнув кнопку "открыть очет/показать данные" получаем отчет / запрос БЕЗ закрытия формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 12:43 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
> и если юзверь настолько продвинут, что сам помнит, что у него хранится в глобальных переменных У меня что-то с головой. Зачем юзверю помнить, что хранится в переменных программы???!!! > Прошу воздуха глоток и для моего вар-та Я же ответил: Хотя, конечно, и этот способ можно назвать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 12:46 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>У меня что-то с головой. Зачем юзверю помнить, что хранится в переменных программы???!!! Не, ВС, у меня - туманю. Открыл юзер форму - заполнил фильтры = жмакнул открыть отчет = получил а если не на этой \ предыдущей форме фильтры - юзер не видит поля с условиями - ЗАБЫЛ про свои фильтры = получил хз что = пошел капать на програмера. вот и вопрос: часты ли ситуации, когда нужно иметь в загашнике данные(глобпеременная, и из нее читающая функ-я), и чаще ли встречается мой вар-т (считать из все еще открытой формы)? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 12:59 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
> ЗАБЫЛ про свои фильтры Какая разница, что помнит или забыл юзер???!!! Программа должна быть правильно написана, вот и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 13:06 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
К концу п.2.2 - альтернативный способ by Лох: создать запрос, перевести его в режим SQL, скопировать туда селект и попытаться выполнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 13:57 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Это скорее к обсуждению "Как хранить запросы" Типа с сохраненным запросом не надо таких плясок производить - "вывестивдебуг-создатьзапрос-скопироватьвставить-попытатьсявыполнитьиафигеть". С сохраненным достаточно один раз на этапе написания "попытатьсявыполнитьиафигеть" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 14:14 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Может я не понял, чего тут обсуждают, но если по теме,то избавиться от подтверждений можно записав глобальные настройки в переменные, установить их в False сделать свое черное дело а потом вернуть все как было. Почему это категорически(!?!?!) не рекомендуется, я не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 14:25 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Да патамушта!!! У тебя что, к аксесу никогда доктор ватсон не приходил? И свет не отключали? До того как ты успеешь глобальные настройки восстановить "как было"? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 14:30 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не-а. Десять лет все пашет без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 14:34 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Потеря глобальных настроек- не самая тяжелая потеря, которая произойдет при выключении света на середине транзакции Access :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2003, 14:36 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Поступило предложение: рассказать более четко про транзакции. ИМХО, достаточно одного абзаца: Транзакция - это... BeginTrans - это... Commit - это... RollBack - это... И плюс про местную транзакцию на уровне запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 15:23 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Таблицы - это ... Запросы - это ... Аксесы - это ... Саныч, не перегибай. Ты хочешь написать очередной "Аксес для чайников"? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 15:28 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох, с тобой невозможно спорить, потому что ты действительно прав. :^) С другой стороны, ну пришел уже чайник, так и что с ним делать - щелк по носику и пшел вон? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 15:38 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Я тут в обзоре возможных вариантов формирования запросов не нашел упоминания о такой вот, очень близкой мне, ситуации: В запросе не известно имя таблицы (один запрос для обработки таблиц под разными именами), т.е. имя таблицы надо как-то передавать в запрос. Причем этот запрос участвует в другом запросе, т.е. надо иметь такую возможность. Как тогда быть?: 1. Set q = CurrentDb.QueryDefs("ИмяЗапрса") q.Parameters("[Введите первый параметр:]").Value = Ваше значение - как я понимаю, не подходит, во инструкии FROM он не понимает же параметр, он таблицу хочет 2. strSQL="SELECT/DELETE Поле1 FROM " & NameTable & " и т.д." CurrentDb.Execute srtSQL - работать будет, но сам запрос как имя нигде больше не используешь, только если результаты запроса кидать во временную таблицу и ее уже пихать в во все другие запросы. Кроме варианта 2 больше ничего не вижу... может еще какое решение по красивее есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 15:57 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 Саныч Как пришелец - так и ушелец На самом деле если чайник пришел и спросил "Как избавится от подтверждений..." - носиком его в этот фак. Если будут толпами приходить чайники и задавать вопрос "Что такое транзакция?" - или в книжку их, или, если кому не лениво, может другой фак написать - "Что такое транзакция" . Только я что-то не помню чтоб стада чайников вопрошали "Что такое транзакция" 2 SergeySV И это тоже немного из другой оперы :)). Кто как хранит запросы - это как раз туда. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 16:00 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Да у меня тут общий, глубокозадумчивый, трабл - и как хранить и как использовать этот запрос/ы. Тут как-то Саныч помойму все сокрушался почему большинство такие упертые и хотят все обязательно засунуть в один запрос, а не разделить его спокойно на составляющие........... так вот у меня уже выходит 4 отдельных запроса с тремя времн. таблицами, кошмар вообщем :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 16:08 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Между прочим. Вместо CurrentDb.Execute srtSQL можно сделать CurrentDb.QueryDefs("...").SQL = srtSQL CurrentDb.Execute "..." ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 16:18 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
> а не разделить его спокойно на составляющие Я предлагал другое: не несколько запросов создавать, а поместить селект в программе и разбить его на строчки с комментариями. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 16:19 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 SergeySV Это Сенин Виктор спрашивал - зачем все в один запрос. Я тоже думаю, что не за чем. Только вот вчера у меня аксес решил, что ему похуй что я там думаю, и в запрос с 16 уровнями вложенности не сумел добавить еще 3 . Пришлось прогнуться. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 16:26 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2Владимир Саныч: спасибо за идею, знал что на вас можно расчитывать, идейка очень симпатишная... 2Лох Позорный: постараюсь до такого не дойти, теперь у меня ограничитель :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2003, 16:50 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Я пока запустил дельфинов стаю, так что пока не могу заняться, но как только так сразу :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2003, 17:30 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
А теперь? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2003, 18:02 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
А теперь как и тогда жду ADO'шников, все вопросы по этой теме пропали в туне. Я считаю что надо осветить и данную часть и указать какими способами можно запускать код емть ли там проблемы и если емсть то как они решаються... Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 14:13 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вот очередное творение... FAQ. Как избавиться от подтверждений на удаление и т.п. и как вообще запускать запросы из VBA. 1. Вопросы. 1.1. Как отключить подтверждения? 1.2. CurrentDb.Execute выдаёт ошибку, что делать? 1.3. Как правильно использовать DoCmd.RunSQL? 1.4. Почему нельзя использовать конструкцию Application.SetOption? 2. Ответы. Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet , и что DoCmd.RunSQL( Access ), CurrentDb.Execute( DAO ), Connection.Execute( ADO ) являются не более чем интерфейсами к Jet . Ответы перечислены в порядке применимости. 2.1. Методы отключения сообщений на подтверждение при запуске Action Queres . Подтверждения отключаються следующими способами: Перейти на использование конструкции CurrentDb.Execute. Использовать вместе с DoCmd.RunSQL, DoCmd.SetWarnings False Изменить глобальные настройки с помощью кострукции Код: plaintext 1. 2. 3.
2.2 Устранение ошибок в CurrentDb.Execute. Ошибка, как правило, возникает со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало парметров. Ожидалось Число"). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные парметры, - все эти обращения будут восприняты как параметры, которым не передано значение. Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ): MSDN писал: NOTE : В DAO Вы должны явно начить параметр; При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами назначить пременную в параметр, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает негласно с действиями DoCmd. С другой стороны, DoCmd работает на более высоком уровне чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, что сделать с параметрами - Вы не имеете никакой гибкости по использованию различных значений параметра. Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6.
Если вместо обращений к формам Вы используете собственные парметры (например [Введите начальную дату:], тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5.
NB! При открытии Crosstab Query с сылками на поля форм в качестве параметров надо действовать следующим образом: Код: plaintext 1. 2. 3.
Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной. Использования данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично. NB! Функция должна возвращать значение в любом случае. 2.3. Использование DoCmd.RunSQL. Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п.(в том числе и предупреждения об ошибках), до конца работы программы. Также есть возможность, что в отладочный период Вы можете остановить выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2.4. Противопоказания использования конструкции Application.SetOption. Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. Подтверждения не отключаются, если в приложении работает сам разработчик. 3. Дополнительная информация. 3.1. Возможность отката. CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. Пример отката внешней транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. В DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса. Опция dbFailOnError аналогична опции Use Transaction . Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:16 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>2. Ответы. >Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet, и что DoCmd.RunSQL(Access), CurrentDb.Execute(DAO), Connection.Execute(ADO) являются не более чем интерфейсами к Jet. в adp Jet'om не пахнет. Убери эту вводную >Application.SetOption "Confirm Document Deletions", False - нужно убрать ибо лишнее. конструкцию Dim q As QueryDef, p As Parameter заменить на Dim q As DAO.QueryDef, p As DAO.Parameter Во-первых хороший тон, во-вторых, в случае подключени ADO (с более высоким приорететом, чем DAO) p As Parameter фактически станет ADODB.Parameter ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:32 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
отчёт по данному запросу \r \r 1 - есть!\r 2 - не ну мы с тобой можем до ... мммм... обсуждать данный вопрос давай лучше спросим совета у обитателей родины великого и могучего.(извените если кого обидел). Только пожалуста никакаих нах Управляющих запросов Action Queres они и в Африке Action Queres. \r 3.1 - молния принята\r 3.2 - есть!\r 4 - есть!\r 5 - пропустил... вай-вай-вай\r вместо\r CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. \r читать\r CurrentDb.Execute в отличии от DoCmd.RunSQL - учавствует во внешней транзакции. \r в сурсах :) поменял...\r 6 - есть!\r 7 - есть!\r 8 - есть!\r \r ВНИМАНИЕ!!! РОЗЫСК!!! \r \r Ищут пожарные\r Ищет милиция \r Кто про ADO проговориться.\r \r По ADO нужна следущая инфа:\r есть ли там подобные проблемы\r если есть способы решения \r про внешнюю транзакцию\r просто про транзакцию\r \r И ещё две просьбы \r 1. Сказать по-русски название п.2.1. не искажая смысл\r 2. В п.2.2. есть выражение: один из нижележащих запросов тоже бы по-русски сказать...\r \r Ну и как обычно увидели что где не точно - не правильно - You are wellcome...\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:40 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 CВ & SV \r прям метеоры...\r \r 2 SV\r 1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило...\r 2. Не совсем понял почему лишнее, мои аргуменгты читай здесь\r 3. согласен\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 14:46 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
>1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило... ОК >Не совсем понял почему лишнее, мои аргуменгты читай здесь Аргумент свелся к "А если человек хочет избавиться от подтверждения на удаление таблицы/запроса Оставляю... " Дык речь идет yне идет об удалении объектов бд - а об "что лучше DoCmd.Run" Если хочешь - оставь - только надо (наверное) дать перевод на русский Application.SetOption "Confirm Record Changes", False - отмена подтверждения запросов на изменений записей во всей БД Application.SetOption "Confirm Document Deletions", False - отмена подтверждения удаления объектов БД (таблиц/запросов/форм/отчетов/макросов/страниц данных).!ОПАСНО!. Application.SetOption "Confirm Action Queries", False - подтверждение выполнения запросов на изменение структуры таблиц и бд (Data Definition Language (DDL)-запросы). В adp - отсуствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 15:18 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 SV 1. Спасибо 2. во-первых: это не прынцыпиально во-вторых: DROP TABLE тож можно запустить...и это будет DoCmd.RunSQL насчёт перевода: ну вообще большенство согласились что это не стоит юзать, так что пускай камикадзе сами трахаються... (после коньячка несколько рековат) Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 15:28 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
1. Начало - критика принимается. Не отлаживал - но вроде все правильно Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Если вместо обращений к формам Вы используете собственные парметры тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Все произошедшие ошибки заполняют коллекцию cnn.Errors. Объект Err - содержит только последнюю ошибку (хрен знает какую). Что бы получить всю информацию об ошибках при сmd.Execute/cnn.connectin.execute надо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Execute всегда выполняется в транзакции. Можно обернуть вызов нескольких Execute в одну транзакцию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
2.>во-вторых: DROP TABLE тож можно запустить...и это будет DoCmd.RunSQL Это будет "Confirm Action Queries" DDL-запрос. Или акес все равно спросит? 3. Согласен ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 15:59 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
1. буду посмотреть 2. спросит Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2003, 16:07 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Итак, замечаю. Sfagnum писал:NB! Функция должна возвращать значение в любом случае. Функция и так возвращает значение в любом случае. Даже если ее тело не содержит ни одной строки, она вернет 0, "" и т.д. в зависимости от своего типа. Sfagnum писал:Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и данных через экран. Хотя эта формулировка вроде бы была предложена мной, я бы ее поправил: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие запросов на подтверждение при удалении/редактировании данных через экран. Кроме того, есть возможность по-разному комбинировать значения разных опций (т.е. написать не все три названных строки, а только некоторые из них). Sfagnum писал:CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. Вроде по приведенному примеру получается, что как раз участвует... Sfagnum писал:Если вместо CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. По-моему, надо еще раз проверить это все в зависимости от 4 параметров: CurrentDb.Execute или DoCmd.RunSQL; наличие или отсутствие параметра dbFailOnError или соответственно Use Transaction; Commit или Rollback; наличие или отсутствие ошибок в запросе - итого 16 случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2003, 18:53 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
1. Мдааа.... не точно написал, хотел просто написать, что-то типа значение должно присваиваться в ф-ии, в любом случае, чтоб не получить удивление от неожиданных результатов. Подумаю, перефразирую...\r \r 2. Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие сообщений на подтверждение при удалении/редактировании данных через экран. \r Это не запросы...\r \r 3. Я уже заметил здесь п.5. и поправился...\r \r 4. Внешняя транзакция работает только в представленном виде... и усё... проверено...\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 09:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
> Внешняя транзакция работает только в представленном виде Ррррбум. В таком представленном виде вообще ничего не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 11:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
т.е. п.3. тебе вообще на хрен не понятен? - обоснуй Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 13:27 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Кажется, я просто запутался. Вот проделаю сам все 16 случаев, тогда дойдет. :^) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 14:10 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Сделай как в примере... А остальные не будут позвалять полный откат Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2003, 14:33 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Тут ввспомнили про этот FAQ и предложили его дописать...\r напоминаю проблемы:\r У SV тут были претензии по вводной к ответам, обещаного тут исправления нет...\r Перечитал перевод из MSDN - покоробило может кто \'причешет\'. \'Оригинал\' есть тута\r Какая ошипка вылетает при не правильном юзанье Connection.Execute(ADO).\r Ну и вообще замечания..\r \r Сделать можно всё!!!\r Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:03 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вариант правки перевода: NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery этого делать не нужно, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, - Вы не имеете никакой гибкости по использованию различных значений параметра. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:10 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 ВС меня сколбасила фраза: авторВы не имеете никакой гибкости по использованию различных значений параметра. Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:14 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery этого делать не нужно, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой гибкости в этом отношении. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:33 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
теплее... но выражение давать гибкость.... это... :) ща ADO пытать буду... Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:39 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Тогда: никакой свободы. :^) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:40 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
вот для начала: Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Если вместо обращений к формам Вы используете собственные парметры тогда вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Узнать какие параметры от вас хочет Access можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
вопросы: 1. фраза 'или если не используете текущее соединение Set cnn = New adodb.Connection cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString " ' отношение к делу не имеет ИМХО. 2.в строке Forms("ИмяФормы")( Replace(p.Name, "@", "", 1, 1, vbTextCompare)) разве не должно быть какого то знака между скобочками? 3. Во 2-ом блоке кода добавил закрытие всякой хадости по аналогии, надеюсь я прав 4. По-поводу работы над ошибками - код сыроват, где Exit Sub, объявление и т.д., и т.п. 5. Насчёт транзакции пойдёт в п.3. 6. Надо шапку аналогичную как для CurrentDb.Execute. Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:52 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не надо никакого знака между скобками. Это как dbengine(0)(0). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:56 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
спасибо, буду знать... перевод предлагаю такой: авторNOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), то Вы должны выполнить служебные действия, которые Access делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении. Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2004, 16:58 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Все вернулись? нет??? ну да ладно всё народу побольше... вопросы тут Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2004, 09:53 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Ах да за основу взято вот это сообщение Сделать можно всё!!! Только бы знать как... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2004, 09:55 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Мможет ФАК по DAO выложим отдельно... раз ADO никому не гужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2004, 11:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не добить ли нам этот фак... С учетом последних новостей: http://sql.ru/forum/actualthread.aspx?tid=127906 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2004, 22:08 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Господа, я взялся за добивание этого фака. Уже есть несколько распечатанных страниц, измалеванных непонятным почерком красной ручкой. Но прежде, чем я это дело опубликую здесь, у меня вопрос. Я попробовал запустить то, что в этом факе предлагается. Оказалось, что CurrentDb.Execute "a1", dbFailOnError, когда он натыкается на ошибку, выдает НА ЭКРАН сообщение об этом, причем у сообщения кнопка Continue законспирирована, при первой же ошибке юзер вынужден закрывать Аксесс. Фотка сообщения прилагается. Это то, что мы всем рекомендуем??? Как это отменить??? Фак-то посвящен отмене всяких сообщений на экране, между прочим... DoCmd.RunSQL, хоть с параметром, хоть нет, ведет себя аналогично, хотя и более цензурно. Он при ошибках спрашивает, хотим ли мы несмотря ни на что исполнить запрос. Отменить это удалось только через DoCmd.SetWarnings, т.е. через Application.SetOption не удалось. === (Вопрос был глупый, ответы на него удалены автором вопроса.) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 00:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
У меня очередной вопрос. SfagnumВ DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса. Ставил эту опцию и в True, и в False, но результат всегда одинаковый: запрос делает все по максимуму, целиком не откатывается. Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:14 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Use Transaction Select Yes to include this query in a transaction. Select No if you don't want to use a transaction. The default is Yes. Prior to Access 97, Access always included the query in a transaction when you ran this action by starting with a BeginTrans method, executing the SQL statement, and then concluding with a CommitTrans method. If you select No for this argument, the query may run faster. Так что не совсем ясно, откуда взялось утверждение: sfagnumбудет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
От моих транзакций он тоже не зависит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:23 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, а каким образом ты его пытаешься откатить? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:25 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Вот мой тест: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
Запрос a0 добавляет в таблицу t1 числа 0, 10, 20; запрос a1 числа 1, 11, 21 (и он должен упасть, потому что число 1 там уже есть); запрос a2 числа 2, 12, 22. И я смотрю на количество записей после исполнения трех запросов. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
4 первых выполнения из 8 (где bDoCmd=-1) дают 9 записей независимо от значения параметра и от Rollback'а. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:32 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, ну не влияет твоё DBEngine.BeginTrans/Commit/Rollback на DoCmd.RunSQL И не может влиять никогда. Чтобы убедиться можешь сделать Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:36 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох ПозорныйСаныч, ну не влияет твоё DBEngine.BeginTrans/Commit/Rollback на DoCmd.RunSQL И не может влиять никогда. Чтобы убедиться можешь сделать Код: plaintext 1. 2.
А на что тогда влияет этот параметр??? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычА на что тогда влияет этот параметр??? Какой параметр? У меня нет никакой параметр! У меня есть только констатация факта, что в случае DoCmd - у тебя транзакция лишняя и никому не нужная. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:45 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох ПозорныйКакой параметр? У меня нет никакой параметр! Моя вопрос была про параметр. См. сегодня, 01:14 и далее. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 01:48 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Неужели никто не знает, для чего нужен параметр Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 14:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычНеужели никто не знает, для чего нужен параметр Код: plaintext
1) DoCmd.RunSQL работает "в отдельном сеансе соединения с базой данных", поэтому транзакции на текущем для mdb-проекта WorkSpace его не касаются. Выполнение такого запроса, как я понимаю, VBA-кодом не контроллируется. 2) [Use Transaction] используется, чтобы заключить в этом "внешнем" сеансе запрос в транзакционные скобки. Появление ошибки типа ошибки вставки НЕ является основанием для отката транзакции. 3) Поведение mdb по умолчанию заключается в том, что частичное выполнение запроса разрешено. Появляющиеся ошибки вставки транслируются в err для варианта исполнения Execute. Для DoCmd.RunSQL они транслируются в предупреждения о количестве обновляемых записей и (отключаемые через DOCMD.SetWarnings) В варианте Execute результат (без учета транзактных скобок) предопределен наличием или отсутствием битового флага dbFailOnError - если присутствует, - действие запроса отменяется при наличии ошибок , иначе изменения производятся. Это НЕ связано с последующим подтверждением или откатом транзакции, а является - не знаю как сказать - скорее вариантом поведения при исполнении массовой операции. Транзакционный Commit и "поведение по dbFailOnError" - непосредственно не связано друг с другом. Точнее их связь такая же как связь между транзакционными скобками и циклом изменений на рекордсете В варианте DoCmd.RunSQL - результат определяется реакцией пользователя на системное предупреждение. В случае DOCMD.SetWarnings False я не знаю, как его "установить по умолчанию", и склонен думать, что прямого аналога dbFailOnError (с учетом нижеследующих замечаний) нет. 4) Возможно, поведение по умолчанию для DoCmd.RunSQL может быть изменено. Намеком на это является наличие параметра соединения Jet OLEDB:Global Bulk Transactions Однако, как им воспользоваться непосредственно при открытии mdb проекта - я не знаю ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 15:39 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Да, и еще, всякое "масовое поведение", как помню, документируется для апдейтов и дилитов, про инсерты вообще никто никому ничего... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 15:41 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Цветику, конечно, спасибо. Но вопрос остался в полном объеме... Зачем нужен параметр Use Transaction? На что он влияет? Когда им пользоваться? Какой тест можно провести, чтобы увидеть разницу в работе DoCmd.RunSQL с параметром и без? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 15:43 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычЦветику, конечно, спасибо. Но вопрос остался в полном объеме... Зачем нужен параметр Use Transaction? На что он влияет? Когда им пользоваться? Какой тест можно провести, чтобы увидеть разницу в работе DoCmd.RunSQL с параметром и без? Польза - не будет (не должно быть) частичного изменения базы в случае, когда, например, потеряна связь с базой в процессе выполнения запроса (до его завершения). подтверждается весь пакет буферизованных изменений. Вред - дополнительная буферизация + блокировки - расход ресурсов+ время исполнения. Я не знаю, когда им НУЖНО пользоваться. Потому как процесс слабоконтроллируем. Хоть оно и похоже на sp_executesql, но польза вилится меньшая. Я не использую DoCmd.RunSQL - не возникало даже движения мысли в этом направлении. Можно воспользоваться, например, при выполнении запроса на вставку в таблицу (добавление записей), когда ограничения на первичный ключ достаточно, чтобы отфильтровать "лишние" записи - они не будут вставлены по нарушению уникальности первичного ключа, но, в то же время, желательно гарантировать "обработку пакета в транзакции". Вариант теста - длинный запрос на линкованной с сеиевого ресурса таблице с к-вом записей >>10000 - то есть чтобы много секунд выполнялся. а) наблюдение за к-вом отъеденной в системе памяти и локальной файловой активностью. б) выдергивание сетевого шнура посреди выполнения запроса без транзакции и внутри нее. ЗЫ Санычу, конечно, всегда пожалуйста... :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:04 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Ишо раз спасибо. И за выражение лица в том числе. :^))) Короче, я понял, что про этот параметр можно в этом факе ничего не говорить. Этот параметр к теме этого фака не имеет отношения. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:12 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычИшо раз спасибо. И за выражение лица в том числе. :^))) Короче, я понял, что про этот параметр можно в этом факе ничего не говорить. Этот параметр к теме этого фака не имеет отношения. в том смысле, чтобы от него избавиться - точно не имеет... Как и в том смысле, что избавившись от подтверждений - (кажется) невозможно отменить результат выполнения DOCMD.RunSQL, если он вообще хоть как-то завершается... :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ЦветикКак и в том смысле, что избавившись от подтверждений - (кажется) невозможно отменить результат выполнения DOCMD.RunSQL, если он вообще хоть как-то завершается... Ну, если человек хочет избавиться от подтверждений, то он, наверно, заранее подразумевает Yes to all. Так что возможность отменять результат ему не очень-то и нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:26 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
как бы да. Это разница между execute и runsql. раз уж они тут сопоставились... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 16:44 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Итак. Вот версия, в которой я попытался учесть все, что до сих пор было сказано. Теперь можно ее править. FAQ. Как избавиться от подтверждений на удаление и т.п. и как вообще запускать запросы из VBA 1. Вопросы. 1.1. Как отключить подтверждения? 1.2. Execute либо OpenRecordset выдаёт ошибку, что делать? 1.3. Как правильно использовать DoCmd.RunSQL? 1.4. Почему нельзя использовать конструкцию Application.SetOption? 2. Ответы. Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet и что DoCmd.RunSQL ( Access ), CurrentDb.Execute ( DAO ), Connection.Execute ( ADO ) являются не более чем интерфейсами к Jet . 2.1. Методы отключения сообщений на подтверждение при запуске Action Queres . Подтверждения отключаются следующими способами (ответы перечислены в порядке применимости): Перейти на использование конструкции CurrentDb.Execute Использовать вместе с DoCmd.RunSQL, DoCmd.SetWarnings False Изменить глобальные настройки с помощью конструкции Код: plaintext 1. 2. 3.
2.2 Устранение ошибок в CurrentDb.Execute и в CurrentDb.OpenRecordset Ошибка, как правило, возникает со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало параметров. Ожидалось Число"). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные параметры, - все эти обращения будут восприняты как параметры, которым не передано значение. Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ): MSDN NOTE : В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Аксесс делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении. Если все параметры являются ссылками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Если вместо обращений к формам Вы используете собственные параметры (например, [Введите начальную дату:]), тогда Вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5.
Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5.
Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной. Использование данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично. Если аналогичное явление происходит не при CurrentDb.Execute, а при CurrentDb.OpenRecordset, то годятся все те же решения. При этом если параметры задаются вручную, то открывать рекордсет надо так: Код: plaintext 1.
В перекрестных запросах возникает то же явление. Правда, оно возникает не при попытке запуска (ибо перекрестный запрос не является Action Query), а при любом использовании, например при открывании формы, основанной на таком запросе. В этом случае надо действовать следующим образом: Код: plaintext 1. 2. 3.
2.3 Устранение ошибок в Command.Execute Если все параметры являються ссылками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Если вместо обращений к формам Вы используете собственные параметры, тогда Вам нужно задать параметры вручную: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
2.4. Использование DoCmd.RunSQL. Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL, но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п. (в том числе и предупреждения об ошибках) до конца работы программы. Также есть возможность, что в отладочный период Вы остановите выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2.5. Противопоказания к использованию конструкции Application.SetOption Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия: Пользователь лишен права на удаление тех объектов, которые нужны для нормальной работы программы, и его устраивает отсутствие подтверждений при удалении/редактировании данных через экран. Подтверждения не отключаются, если в приложении работает сам разработчик. 2.6. Возможность отката CurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции. Пример отката внешней транзакции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2005, 21:47 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
авторCurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции. Саныч, - как бы просто не вполне корректное некорректное высказывание. Дешевле удалить... дальше, про пример отката автор Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками Саныч, они "не выполнятся" если Предупреждения НЕ отключены, И пользователь отказался от завершения выполнения запроса (при этом не важно - произошли ошибки ли нет). Во всех остальных случаях, в частности при возникновении ошибок, если DoCmd.RunSQL выполняет action query, он выполнится, если там окажется хоть что-то пригодное для выполнения (найдутся строки для делета, апдейта или инсерта, на которых лшибок не произойдет ) - частичное выполнение я не знаю как отключить в Акцессе. Если ты знаешь как - то прилично об этом сказать явно :) ЗЫ вот окультурился севодни, впервые за два последних года. теперь жму клаву окультуренный... (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:26 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Опечатки: 1. сслыками -2 раза 2.Если вместо обращений к формам Вы используете собственные парметры , тогда Вам нужно задать параметры вручную: Пункт 2.5 - использованы оба термина - аппликация и приложение, стилистически лучше бы один. Мелочь, конечно, прошу извинить за занудность :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:35 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Victosha авторCurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции. Саныч, - как бы просто не вполне корректное некорректное высказывание. Дешевле удалить... Зачем удалить? Вот новая версия: CurrentDb.Execute в отличие от DoCmd.RunSQL может быть включен во внешнюю транзакцию. Victosha авторЕсли вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками Саныч, они "не выполнятся" если Предупреждения НЕ отключены, И пользователь отказался от завершения выполнения запроса (при этом не важно - произошли ошибки ли нет). Новая версия: Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то при возникновении ошибок удастся откатить только запросы с ошибками, тогда как CurrentDb.Execute в таких случаях позволяет откатить всю транзакцию, в которую включено то, что посчитает нужным программист. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:42 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Alexander GОпечатки: 1. сслыками -2 раза 2.Если вместо обращений к формам Вы используете собственные парметры , тогда Вам нужно задать параметры вручную: Пункт 2.5 - использованы оба термина - аппликация и приложение, стилистически лучше бы один. Мелочь, конечно, прошу извинить за занудность :) ОК, исправляю сразу в тексте. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:42 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Аппликацию и приложение решил не править. Меня учили, что повторения одинаковых слов можно избегать путем замены на синонимы. А "парметров" оказалось аж 5 штук. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 01:45 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
авторНовая версия: Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то при возникновении ошибок удастся откатить только запросы с ошибками... ну, это просто обман. Либо удастся откатить, вне зависимости от возникновения ошибок. Либо не удастся откатить, даже если ошибки произошли. А так как написано - это не оно... ЗЫ авторАппликацию и приложение решил не править. умеешь же ты сказать двумя словами то, на что другому два тома не хватит. Нет вижу границ собственному восхищению. Пошел захлебываться в дыму и пиве... (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 02:50 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир СанычАппликацию и приложение решил не править. Меня учили, что повторения одинаковых слов можно избегать путем замены на синонимы. Честно говоря, мне резанул глаз термин аппликация, но подумал о себе - значит, аппликация тебе не нравится, а контрол устраивает? - тогда помалкивай :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 03:13 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2 Саныч По поводу DoCmd.RunSql SqlStatement, [UseTransaction] Сей параметр не определяет атомарность выполнения запроса (т.е. или изменить/добавить/удалить все нужные записи, или не изменить ничего). Как уже было сказано, аксес при ручном* запуске запроса изменит все что можно, а что нельзя - на то отругается. И способ отключить сиё паскудное поведение не известен науке. -------- * ручной запус - запуск запроса непостредственно из окна базы данных либо программно с использованием DoCmd.RunSql Однако этот параметр влияет на изолированность результатов выполнения запроса (до его полного завершения) от других сессий. Если запрос изменяет большое количество данных, то в случае DoCmd.RunSql "трампампамп", False из другой сессии мы будем наблюдать "постепенное" изменение данных, а в случае DoCmd.RunSql "трампампамп", True - все изменения "появятся" сразу. Для простоты можно считать, что использование UseTransaction := True работает эквивалентно следующему куску кода: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 12:12 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
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'ов ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 12:28 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ЛП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 (Тёмный выше), но ее надо добавлять к свойствам. и неясно - будет ли работать с несохраненными запросами... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 13:09 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Цветикнеясно - будет ли работать с несохраненными запросами... Наверное будет (DoCmd ведь работает) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 13:21 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Victosha авторЕсли вместо CurrentDb.Execute использовать DoCmd.RunSQL, то при возникновении ошибок удастся откатить только запросы с ошибками... ну, это просто обман. Либо удастся откатить, вне зависимости от возникновения ошибок. Либо не удастся откатить, даже если ошибки произошли. А так как написано - это не оно... Понял. Тогда так: Нередко возникает необходимость при возникновении ошибок отменить результат исполнения целого ряда запросов. DoCmd.RunSQL такой возможности не дает. CurrentDb.Execute, в отличие от него, позволяет откатить транзакцию, в которую включено то, что посчитает нужным программист. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 20:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ЛПОднако этот параметр влияет на изолированность результатов выполнения запроса (до его полного завершения) от других сессий. Если запрос изменяет большое количество данных, то в случае DoCmd.RunSql "трампампамп", False из другой сессии мы будем наблюдать "постепенное" изменение данных, а в случае DoCmd.RunSql "трампампамп", True - все изменения "появятся" сразу. Понял, спасибо. Я все равно сомневаюсь, имеет ли отношение этот параметр к теме этого фака. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 20:21 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, оставляй в этом факе. С подрробным жевом ЛП идр. з.ы. Блин, без инета на работе все самое интересное пропустил з.з.ы. Саныч - спамер. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 22:07 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ТемныйСаныч, оставляй в этом факе. С подрробным жевом ЛП идр. OK. Темныйз.з.ы. Саныч - спамер. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2005, 22:20 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ТемныйСаныч, оставляй в этом факе. С подрробным жевом ЛП идр. Не, Баба Яга против. Не место всяким там транзакциям и прочим глобал бульк инсёртам - в факе "как избавиться от подтверждений на удаление". Это разве что на отдельный фак тянет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2005, 00:57 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Не... Тады это перекрестные факи. Поскольку именно в этом зтрагиается и RunSQL и Execute c их опциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2005, 00:59 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ТемныйНе... Тады это перекрестные факи. Поскольку именно в этом зтрагиается и RunSQL и Execute c их опциями. мэй би. никто не запрещает факам быть перекрестными. тема с транзакциями, воркспейсами, коннекшенами и т.п. - достаточно большая тут и скрытый аксесовский воркспейс, и отличия DAO-шных и ADO-шных Execute'ов, и отличия аксесовских транзакций от общепринятых, и т.д., и т.п. тока (имхо) не настолько это часто задаваемые вопросы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2005, 01:05 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох Позорныйтока (имхо) не настолько это часто задаваемые вопросы :) О! Я долго искал, за что ухватиться. Вот за это и ухвачусь. Не буду в этом факе про Use Transaction. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2005, 01:18 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Хорошо, давайте новый долгострой. AdvancedFAQ :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2005, 01:37 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Саныч, может я его выложу? А ты потом подправишь, как время появится? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2005, 12:23 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Лох ПозорныйСаныч, может я его выложу? А ты потом подправишь, как время появится? Я очень надеюсь, что смогу все сделать в ближайшие выходные. "Вы ждали 3000 лет, подождите еще полчаса". (Надпись в аэропорту им.Д.Бен-Гуриона в зале для прибывших репатриантов.) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2005, 14:24 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 14:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
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 ... первоначальный вариант полагается на встроенный рефреш, возникающий после задания имени процедуры на уже сформированном соединении. второй вариант вызывает рефреш явно, поскольку встроенного не происходит - соединение задается после формирования текста и типа команды ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 14:40 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
да, и каких нибудь слов про .ActiveConnection = cnn и Set .ActiveConnection = cnn (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 14:42 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 14:51 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
2ы спасибо. а мораль-то какова? работает в 2000аксе код авторWith cmd .ActiveConnection = cnn .CommandText = "ИмяПроцедуры" .CommandType = adCmdStoredProc For Each p In .Parameters Debug.Print p.Name Next ? (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 15:01 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Сейчас не скажу - 2000-го под рукой нету. Дома посмотрю, если трезвый буду. Но про .Refresh Гетц говорит, что в этом случае в 2000-м он работать не будет. Да и в 2002 не всегда работает, даже с установленным MDAC 2.8 и сервиспаками. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 15:11 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
ыСейчас не скажу - 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 15:33 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
я вот еще о чем подумал А2000 писался в расчете на MDAC2.5 + SQL7 в такой паре рефрешу жить тяжело, если вообще возможно - имена параметров все равно деть некуда - ели и "освежит", имена придется переприсвоить... очень может быть, что указанная особенность собственно к акцессу отношение имеет как луна к яичнице. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2005, 15:49 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
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.
результаты наблюдений 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 тоже все в порядке, то как будто нет причин не работать рефрешу. (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2005, 03:36 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Victosha2 Саныч - как всегда, ОЧ.КАРАШО!! Я не автор. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2005, 17:52 |
|
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
|
|||
---|---|---|---|
#18+
Владимир Саныч Victosha2 Саныч - как всегда, ОЧ.КАРАШО!! Я не автор. скажем так - это общая оценка результата вообще, и того, что получилось из последних обсуждений в частности. В этой последней части от авторства формулировок, по крайней мере, не отнекаешся. то есть - Ы (типа большой палец) :)) про замечания автор Set rs = .Execute(, , adExecuteNoRecords) 'adExecuteNoRecords - можно и не указывать, если в процедуре стоит Set NoCount ON "по книжкам" - adExecuteNoRecords для того, чтобы Command возвращал Nothing вместо Recordset - при этом это указание именно клиентской части (АДО) а Set NoCount ON - указание SQL Server-у не гонять по сети print-сообщений о количестве обработанных записей. как указание/неуказание одного может влиять на другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2005, 01:13 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1668945]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
135ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 504ms |
0 / 0 |