powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вопрос по запросам
16 сообщений из 16, страница 1 из 1
Вопрос по запросам
    #39513125
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

В Access есть запросы-объекты. В одном запросе-объекте есть параметр. Значение параметра вставляется программно. Есть код, который запускает эти запросы, в том числе запрос с параметрами.

Не получается запустить программно запрос с параметрами. Подскажите, что не так и как надо написать в коде правильно?
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513133
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Код: sql
1.
2.
3.
DELETE *
FROM таблица1
WHERE Событие=[@Событие];



Код: vbnet
1.
2.
3.
4.
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("Удаление строк Выбор")
qdf.Parameters("@Событие") = "Поставка"
qdf.Execute dbFailOnError
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513175
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

Ок, спасибо! А если через ADO? Через ADO вроде быстрее работает
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513186
ferzmikkА если через ADO?
Изучайте объект Command.
ferzmikkЧерез ADO вроде быстрее работает
Спорное утверждение. ИМХО, по скорости одинаково, но возни больше.
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513227
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассматриваю вариант с Command

Есть код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub Вариант()
Dim ccmd As Object
Set ccmd = CreateObject("ADODB.Command")
With ccmd
    .Activeconnection = CurrentProject.Connection
    .CommandText = "DELETE * FROM таблица1 WHERE [@Событие]"
    .commandType = 4
    .Parameters.Item("[@Событие]").Value = "Поставка"
    .Execute
    .Close
End With
Set ccmd = Nothing
End Sub


Когда запускаю первый раз, то на этом шаге как в скриншоте (или выделено в коде) появляется ошибка ("После Execute ожидается имя запроса"). В Parameters есть один элемент.
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513228
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему так происходит с параметрами?

И по поводу ошибки "После Execute ожидается имя запроса", то зачем ожидает имя запроса, если в ccmd прописан запрос?
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513229
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда запускаю этот же код второй раз, то на предыдущем шаге как в скриншоте (или выделено в коде) появляется такая же ошибка. Но в Parameters нет ни одного элемента.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub Вариант()
Dim ccmd As Object
Set ccmd = CreateObject("ADODB.Command")
With ccmd
    .Activeconnection = CurrentProject.Connection
    .CommandText = "DELETE * FROM таблица1 WHERE [@Событие]"
    .commandType = 4
    .Parameters.Item("[@Событие]").Value = "Поставка"
    .Execute
    .Close
End With
Set ccmd = Nothing
End Sub
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513321
Код: plaintext
1.
adCmdStoredProc	 4 	Evaluates CommandText as a  stored procedure name .
adCmdText	 1 	Evaluates CommandText as a  textual definition  of a command or stored procedure call.
У вас .commandType = 4, т.е. должно быть имя запроса. Нужно =1.
Хотя в вашем примере весь этот огород не нужен, достаточно:
Код: vbnet
1.
2.
3.
CurrentProject.Connection.Execute "DELETE * FROM таблица1 WHERE """ & "Поставка" & """
или даже
CurrentProject.Connection.Execute "DELETE * FROM таблица1 WHERE ""Поставка"""
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513333
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ),

Спасибо!
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513369
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рабочем файле есть несколько длинных запросов, которые содержат еще вложенные запросы, Join. Есть запросы, которые берутся из других запросов. Есть запросы без параметров и есть с параметрами. Результат запроса с параметрами записываются сразу в таблицу. Все запускается программно, поэтапно. Промежуточные таблицы в конце будут удаляться.

Если учесть данные особенности, то запускать запрос как access-ий объект-запрос (как было в примере в начале) или все таки лучше так CurrentProject.Connection.Execute ТекстЗапроса?
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513410
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обычно запросы с коротким текстом запускаю напрямую, а сложные сохраняю как объект, ибо в тексте их сложно поддерживать и тестировать.
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513421
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все тексты запросов сохраняю в отдельной таблице access. Перед запуском запроса текст запроса выгружается из этой таблицы. Если с параметром, то вставляет значение.

Тут важно учесть чтобы было удобно тестировать и дорабатывать запрос.
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513454
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Access база данных как файл лежит на сервере и там есть макросы в модуле, которые поочередно запускают запросы, сначала из внешних данных, потом запросы к access-им таблицам, то как можно сделать так, чтобы запускались макросы каждый день в определенное время?
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513487
Понятное дело, что "громоздкие" запросы лучше хранить как объекты, хотя бы потому, что сохраненный запрос скомпилирован и выполняется быстрее, а также то, что в режиме конструктора его удобно просматривать и редактировать. Использование многострочных SQL выражений в процедуре делает "громоздкой" саму процедуру и затруднительным редактирование текста запроса. Возможно гибридное решение - сохраненный запрос на множестве таблиц без параметров, а в процедуре выполнение SELECT Запрос WHERE...

ferzmikkРезультат запроса с параметрами записываются сразу в таблицу. Промежуточные таблицы в конце будут удаляться. Это не лучшее решение. Конечно бывают случаи, когда это единственное решение, но многое можно решить иначе.

И еще о DAO vs ADO. Имейте ввиду, что в DAO все запросы входят в QueryDefs, а в ADO запросы на выборку без параметров, это Views, а остальные - Commands. А также сравните, сколько строк кода требует одна и та же задача в разных вариантах.
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513511
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев )Понятное дело, что "громоздкие" запросы лучше хранить как объекты, хотя бы потому, что сохраненный запрос скомпилирован и выполняется быстрее, A MDX-запросы для OLAP как обращение к внешним данным куда толкать? а также то, что в режиме конструктора его удобно просматривать и редактировать. Длинные запросы написаны, они работают как надо, но если из режима SQL перейти в режим Конструктор, то пишет, что не удается представить выражение объединения в режиме конструктора, а для других запросов зависает и перезагружается Access. Почему так?
...
Рейтинг: 0 / 0
Вопрос по запросам
    #39513513
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев )ferzmikkРезультат запроса с параметрами записываются сразу в таблицу. Промежуточные таблицы в конце будут удаляться. Это не лучшее решение. Конечно бывают случаи, когда это единственное решение, но многое можно решить иначе.А как это иначе?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вопрос по запросам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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