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

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

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

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

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

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

SfagnumВ DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса.
Ставил эту опцию и в True, и в False, но результат всегда одинаковый: запрос делает все по максимуму, целиком не откатывается. Что я делаю не так?
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32866873
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Use Transaction
Select Yes to include this query in a transaction. Select No if you don't want to use a transaction. The default is Yes. Prior to Access 97, Access always included the query in a transaction when you ran this action by starting with a BeginTrans method, executing the SQL statement, and then concluding with a CommitTrans method. If you select No for this argument, the query may run faster.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Sub test()

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

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

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

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

Exit Sub
e:
Resume Next

End Sub

Запрос a0 добавляет в таблицу t1 числа 0, 10, 20; запрос a1 числа 1, 11, 21 (и он должен упасть, потому что число 1 там уже есть); запрос a2 числа 2, 12, 22. И я смотрю на количество записей после исполнения трех запросов. Результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
test
- 1             - 1             - 1  
  9  
  0             - 1             - 1  
  9  
- 1               0             - 1  
  9  
  0               0             - 1  
  9  
- 1             - 1               0  
  7  
  0             - 1               0  
  1  
- 1               0               0  
  9  
  0               0               0  
  1  

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

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

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

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

1) DoCmd.RunSQL работает "в отдельном сеансе соединения с базой данных",
поэтому транзакции на текущем для mdb-проекта WorkSpace его не касаются.
Выполнение такого запроса, как я понимаю, VBA-кодом не контроллируется.

2) [Use Transaction] используется, чтобы заключить в этом "внешнем"
сеансе запрос в транзакционные скобки.
Появление ошибки типа ошибки вставки НЕ является основанием для отката
транзакции.

3) Поведение mdb по умолчанию заключается в том, что частичное выполнение запроса разрешено. Появляющиеся ошибки вставки
транслируются в err для варианта исполнения Execute.
Для DoCmd.RunSQL они транслируются в предупреждения о количестве
обновляемых записей и (отключаемые через DOCMD.SetWarnings)

В варианте Execute результат (без учета транзактных скобок) предопределен
наличием или отсутствием битового флага dbFailOnError - если присутствует, -
действие запроса отменяется при наличии ошибок , иначе изменения производятся. Это НЕ связано с последующим подтверждением или откатом транзакции, а является - не знаю как сказать - скорее вариантом поведения при исполнении массовой операции.
Транзакционный Commit и "поведение по dbFailOnError" -
непосредственно не связано друг с другом. Точнее их связь такая же как связь между транзакционными скобками и циклом изменений на рекордсете

В варианте DoCmd.RunSQL - результат определяется реакцией пользователя на системное предупреждение.
В случае DOCMD.SetWarnings False я не знаю, как его "установить по
умолчанию", и склонен думать, что прямого аналога dbFailOnError (с учетом нижеследующих замечаний) нет.

4) Возможно, поведение по умолчанию для DoCmd.RunSQL может быть изменено. Намеком на это является наличие параметра соединения
Jet OLEDB:Global Bulk Transactions
Однако, как им воспользоваться непосредственно при открытии mdb проекта -
я не знаю
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868176
Цветик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и еще, всякое "масовое поведение", как помню, документируется
для апдейтов и дилитов, про инсерты вообще никто никому ничего...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868182
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Цветику, конечно, спасибо. Но вопрос остался в полном объеме...

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

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

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

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

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

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

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

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

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

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

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

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



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

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

1. Вопросы.

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

2. Ответы.
Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet и что DoCmd.RunSQL ( Access ), CurrentDb.Execute ( DAO ), Connection.Execute ( ADO ) являются не более чем интерфейсами к Jet .

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

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

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

2.2 Устранение ошибок в CurrentDb.Execute и в CurrentDb.OpenRecordset
Ошибка, как правило, возникает со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало параметров. Ожидалось Число").
Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные параметры, - все эти обращения будут восприняты как параметры, которым не передано значение.
Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ):
MSDN NOTE : В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Аксесс делает "за кулисами" при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении.

Если все параметры являются ссылками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim q As DAO.QueryDef, p As DAO.Parameter 
  Set q = CurrentDb.QueryDefs("ИмяЗапроса") 'как обычного запроса Select,
  'так и INSERT/UPDATE; в запросах на удаление это не помогает
  For Each p In q.Parameters 
    p.Value = Eval(p.Name) 
  Next 
  q.Execute 
  q.close: Set q=Nothing

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

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

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

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

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

2.3 Устранение ошибок в Command.Execute

Если все параметры являються ссылками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim p As ADODB.Parameter
  Set cnn = CurrentProject.Connection
    'или если не используете текущее соединение:
    'Set cnn = New adodb.Connection
    'cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString"
  Set cmd = New ADODB.Command
  With cmd
    .ActiveConnection = cnn
    .CommandText = "ИмяПроцедуры"
    .CommandType = adCmdStoredProc
    .NamedParameters = True
      'начиная с ADO версии 2.6 (???) без этого свойства работать не будет -
      'ADO будет заполнять коллекцию параметров не по имени, а по порядку
    For Each p In .Parameters
      'имена параметров равны именам контролов формы, только без @
      'Имя контрола NameFIO, тогда в процедуре @NameFIO. @- убираем с помощью Replace
      p.Value = Eval(Forms("ИмяФормы")(Replace(p.Name, "@", "",  1 ,  1 , vbTextCompare)))
    Next
    Set rs = .Execute(, , adExecuteNoRecords)
      'adExecuteNoRecords - можно и не указывать, если в процедуре стоит Set NoCount ON
      'или чтобы иметь возможность задать свойства rs (обновляемость, например):
      'Set rs = New ADODB.Recordset
      'rs.CursorType = adOpenDynamic
      'rs.Open cmd
  End With
  Set cmd = Nothing
  rs.Close: Set rs = Nothing
  cnn.Close: Set cnn = Nothing

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

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

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

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

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

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

2.6. Возможность отката
CurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции.
Пример отката внешней транзакции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function Test()
On Error Goto Rollback_Label
  DBEngine( 0 ).BeginTrans
    CurrentDb.Execute "Запрос1", dbFailOnError
    CurrentDb.Execute "Запрос2", dbFailOnError
    CurrentDb.Execute "Запрос3", dbFailOnError
  DBEngine( 0 ).CommitTrans
  Exit Function
Rollback_Label:
  DBEngine( 0 ).Rollback
End Function
Т.е. В данном случае если не выполнится хотя бы один запрос, то все запросы "откатятся". Если вместо CurrentDb.Execute использовать DoCmd.RunSQL, то не выполнятся только запросы с ошибками. В CurrentDb.Execute есть опция dbFailOnError - она относится только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос при ошибке откачен целиком и будет возвращена ошибка, или же возможно частичное выполнение запроса.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32868988
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCurrentDb.Execute в отличие от DoCmd.RunSQL - участвует во внешней транзакции.

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



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

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

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

:)


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


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

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

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


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