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

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

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

1. Вопросы.

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

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

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

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

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

2.2 Устранение ошибок в CurrentDb.Execute.
Ошибка, как правило, возникает со следуещим текстом "Too few parameters. Expected Число" ("Слишком мало парметров. Ожидалось Число").
Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные парметры, - все эти обращения будут восприняты как параметры, которым не передано значение.
Почему так происходит? - Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ):
MSDN писал: NOTE : В DAO Вы должны явно начить параметр; При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую гибкость в использовании параметров (т.е. Вы можете сами назначить пременную в параметр, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает негласно с действиями DoCmd. С другой стороны, DoCmd работает на более высоком уровне чем DAO . Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, что сделать с параметрами - Вы не имеете никакой гибкости по использованию различных значений параметра.
Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim q As QueryDef, p As Parameter 
  Set q = CurrentDb.QueryDefs( "ИмяЗапрса" )  'как обычного запроса Select так и INSERT/DELETE/UPDATE'
  For Each p In q.Parameters 
    p.Value = Eval(p.Name) 
  Next 
  q.Execute 
  q.close: Set q=Nothing

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

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

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

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

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

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

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

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

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

3.1. Возможность отката.
CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции.
Пример отката внешней транзакции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function Test()
On Error Goto Rollback_Label
  DBEngine( 0 ).BeginTrans
    CurrentDb.Execute  "Запрос1" , dbFailOnError
    CurrentDb.Execute  "Запрос2" , dbFailOnError
    CurrentDb.Execute  "Запрос3" , dbFailOnError
  DBEngine( 0 ).CommitTrans
  Exit Function
Rollback_Label:
  DBEngine( 0 ).Rollback
End Function
Т.е. В данном случае если не выполниться хотя бы один запрос, то все запросы 'откатятся'. Если вместо
CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками. В DoCmd.RunSQL есть опция Use Transaction - она относиться только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос выполнен или откачен целиком, или же возможно частичное выполнение запроса.
Опция dbFailOnError аналогична опции Use Transaction .

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307519
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>2. Ответы.
>Прежде чем перейти к ответам, хочу отметить, что запрос будет выполнять непосредственно Jet, и что DoCmd.RunSQL(Access), CurrentDb.Execute(DAO), Connection.Execute(ADO) являются не более чем интерфейсами к Jet.

в adp Jet'om не пахнет. Убери эту вводную

>Application.SetOption "Confirm Document Deletions", False
- нужно убрать ибо лишнее.


конструкцию Dim q As QueryDef, p As Parameter
заменить на Dim q As DAO.QueryDef, p As DAO.Parameter
Во-первых хороший тон, во-вторых, в случае подключени ADO (с более высоким приорететом, чем DAO) p As Parameter фактически станет ADODB.Parameter
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307538
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отчёт по данному запросу \r
\r
1 - есть!\r
2 - не ну мы с тобой можем до ... мммм... обсуждать данный вопрос давай лучше спросим совета у обитателей родины великого и могучего.(извените если кого обидел). Только пожалуста никакаих нах Управляющих запросов Action Queres они и в Африке Action Queres. \r
3.1 - молния принята\r
3.2 - есть!\r
4 - есть!\r
5 - пропустил... вай-вай-вай\r
вместо\r
CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции. \r
читать\r
CurrentDb.Execute в отличии от DoCmd.RunSQL - учавствует во внешней транзакции. \r
в сурсах :) поменял...\r
6 - есть!\r
7 - есть!\r
8 - есть!\r
\r
ВНИМАНИЕ!!! РОЗЫСК!!! \r
\r
Ищут пожарные\r
Ищет милиция \r
Кто про ADO проговориться.\r
\r
По ADO нужна следущая инфа:\r
есть ли там подобные проблемы\r

если есть способы решения \r

про внешнюю транзакцию\r

просто про транзакцию\r
\r
И ещё две просьбы \r
1. Сказать по-русски название п.2.1. не искажая смысл\r
2. В п.2.2. есть выражение: один из нижележащих запросов тоже бы по-русски сказать...\r
\r
Ну и как обычно увидели что где не точно - не правильно - You are wellcome...\r
\r
Сделать можно всё!!!\r
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307557
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CВ & SV \r
прям метеоры...\r
\r
2 SV\r
1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило...\r
2. Не совсем понял почему лишнее, мои аргуменгты читай здесь\r
3. согласен\r
\r
Сделать можно всё!!!\r
Только бы знать как...
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307626
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>1. Ну хоть разорвись млин... подкоректируй шоб и под adp подходило...

ОК

>Не совсем понял почему лишнее, мои аргуменгты читай здесь

Аргумент свелся к "А если человек хочет избавиться от подтверждения на удаление таблицы/запроса Оставляю... "
Дык речь идет yне идет об удалении объектов бд - а об "что лучше DoCmd.Run"
Если хочешь - оставь - только надо (наверное) дать перевод на русский

Application.SetOption "Confirm Record Changes", False - отмена подтверждения запросов на изменений записей во всей БД
Application.SetOption "Confirm Document Deletions", False - отмена подтверждения удаления объектов БД (таблиц/запросов/форм/отчетов/макросов/страниц данных).!ОПАСНО!.
Application.SetOption "Confirm Action Queries", False - подтверждение выполнения запросов на изменение структуры таблиц и бд (Data Definition Language (DDL)-запросы). В adp - отсуствует.
...
Рейтинг: 0 / 0
FAQ: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run
    #32307645
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SV
1. Спасибо
2.
во-первых: это не прынцыпиально

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

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

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

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

Если все параметры являються сслыками на контролы форм (Forms![ИмяФормы]![ИмяКонтрола]), тогда самое простое (и красивое) решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    Dim cmd As ADODB.Command
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim p As ADODB.Parameter

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

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

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

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


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

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

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

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


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


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


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

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

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

Sfagnum писал:NB! Функция должна возвращать значение в любом случае.
Функция и так возвращает значение в любом случае. Даже если ее тело не содержит ни одной строки, она вернет 0, "" и т.д. в зависимости от своего типа.

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

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

Sfagnum писал:CurrentDb.Execute в отличии от DoCmd.RunSQL - не учавствует во внешней транзакции.
Вроде по приведенному примеру получается, что как раз участвует...

Sfagnum писал:Если вместо CurrentDb.Execute использовать DoCmd.RunSQL то не выполнятся только запросы с ошибками.
По-моему, надо еще раз проверить это все в зависимости от 4 параметров:
CurrentDb.Execute или DoCmd.RunSQL;

наличие или отсутствие параметра dbFailOnError или соответственно Use Transaction;

Commit или Rollback;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


вопросы:
1. фраза 'или если не используете текущее соединение Set cnn = New adodb.Connection cnn.Open "Cтрока подключения по аналогии с CurrentProject.BaseConnectionString " ' отношение к делу не имеет ИМХО.
2.в строке Forms("ИмяФормы")( Replace(p.Name, "@", "", 1, 1, vbTextCompare)) разве не должно быть какого то знака между скобочками?
3. Во 2-ом блоке кода добавил закрытие всякой хадости по аналогии, надеюсь я прав
4. По-поводу работы над ошибками - код сыроват, где Exit Sub, объявление и т.д., и т.п.
5. Насчёт транзакции пойдёт в п.3.
6. Надо шапку аналогичную как для CurrentDb.Execute.

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

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

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

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


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