|
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 |
|
|
start [/forum/topic.php?fid=45&msg=32264163&tid=1668945]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 245ms |
total: | 386ms |
0 / 0 |