Vba access sql запросы: Как послать запрос к базе на VBA Access | Info-Comp.ru
Содержание
Как послать запрос к базе на VBA Access | Info-Comp.ru
Данный урок посвящен SQL запросам к базе данных на VBA Access. Мы рассмотрим, как на VBA осуществляется запросы INSERT, UPDATE, DELETE к базе данных, а также научимся получать конкретное значение из запроса SELECT.
Те, кто программируют на VBA Access и работая при этом с базой данных SQL сервера, очень часто сталкиваются с такой простой и нужной задачей как посыл SQL запроса к базе данных, будь то INSERT, UPDATE или простой SQL запрос SELECT. А так как мы начинающие программисты мы тоже должны уметь это делать, поэтому сегодня займемся именно этим.
Мы уже затрагивали тему получения данных с SQL сервера, где как раз на VBA писали код для получения этих данных, например в статье про Выгрузку данных в текстовый файл из MSSql 2008 или также немного затрагивали в материале Выгрузка данных из Access в шаблон Word и Excel, но так или иначе там мы рассматривали это поверхностно, а сегодня предлагаю поговорить об этом чуть более подробней.
Примечание! Все примеры ниже рассмотрены с использованием ADP проекта Access 2003 и базы данных MSSql 2008. Если Вы не знаете что вообще такое ADP проект то это мы рассматривали в материале Как создать и настроить ADP проект Access
Содержание
- Исходные данные для примеров
- Запросы к базе INSERT, UPDATE, DELETE на VBA
- Запрос SELECT к базе на VBA
Исходные данные для примеров
Допустим, у нас есть таблица test_table, которая будет содержать номера и названия месяцев в году (запросы выполнены с использованием Management Studio)
CREATE TABLE [dbo].[test_table]( [id] [int] NOT NULL, [name_mon] [varchar](50) NULL ) ON [PRIMARY] GO
Как я уже сказал, мы будем использовать ADP проект, настроенный на работу с MS SQL 2008, в котором я создал тестовую форму и добавил кнопку start с подписью «Выполнить», которая нам понадобится для тестирования нашего кода, т. е. весь код мы будем писать в обработчике события «Нажатие кнопки».
Запросы к базе INSERT, UPDATE, DELETE на VBA
Чтобы долго не тянуть сразу приступим, допустим, нам нужно добавить строку в нашу тестовую таблицу (код прокомментирован)/
Private Sub start_Click() 'Объявляем переменную для хранения строки запроса Dim sql_query As String 'Записываем в нее нужный нам запрос sql_query = "INSERT INTO test_table (id, name_mon) VALUES ('6', 'Июнь')" 'Выполняем его DoCmd.RunSQL sql_query End Sub
В данном случае запрос выполняется с использованием текущих параметров подключения к базе данных. Можем проверить, данные добавились или нет.
Как видим, данные вставились.
Для того чтобы удалить одну строку пишем вот такой код.
Private Sub start_Click() 'Объявляем переменную для хранения строки запроса Dim sql_query As String 'Записываем в нее запрос на удаление sql_query = "DELETE test_table WHERE id = 6" 'Выполняем его DoCmd. RunSQL sql_query End Sub
Если мы проверим, то увидим, что нужная строка удалилась.
Для обновления данных записываем в переменную sql_query запрос update, надеюсь, смысл понятен.
Запрос SELECT к базе на VBA
Здесь дела обстоят чуть интересней, чем с остальными конструкциями SQL.
Первое, допустим, нам нужно получить все данные из таблицы, и, к примеру, мы их обработаем и выведем в сообщении, а Вы, конечно же, можете использовать их для других целей, для этого мы пишем вот такой код
Private Sub start_Click() 'Объявляем переменные 'Для набора записей из базы Dim RS As ADODB.Recordset 'Строка запроса Dim sql_query As String 'Строка для вывода итоговых данных в сообщении Dim str As String 'Создаем новый объект для записей set RS = New ADODB.Recordset 'Строка запроса sql_query = "SELECT id, name_mon FROM test_table" 'Выполняем запрос с использованием текущих настроек подключения проекта RS. open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic 'Циклом перебираем записи While Not (RS.EOF) 'Заполняем переменную для вывода сообщения str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline 'переход к следующей записи RS.MoveNext Wend 'Вывод сообщения msgbox str End Sub
Здесь мы уже используем циклы VBA Access для того чтобы перебрать все значения в нашем наборе записей.
Но, достаточно часто бывает необходимо получить не все значения из набора записей, а всего лишь одно, например, название месяца по его коду. И для этого использовать цикл как-то накладно, поэтому мы можем просто написать запрос, который вернет всего одно значение и обращаться именно к нему, например, получим название месяца по коду 5
Private Sub start_Click() 'Объявляем переменные 'Для набора записей из базы Dim RS As ADODB. Recordset 'Строка запроса Dim sql_query As String 'Строка для вывода итогового значения Dim str As String 'Создаем новый объект для записей set RS = New ADODB.Recordset 'Строка запроса sql_query = "SELECT name_mon FROM test_table WHERE id = 5" 'Выполняем запрос с использованием текущих настроек подключения проекта RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic 'Получаем наше значение str = RS.Fields(0) msgbox str End Sub
Для универсальности здесь мы уже обратились не по имени ячейки, а по ее индексу, т.е. 0, а это самое первое значение в Recordset, в итоге мы получили значение «Май».
Как видите, все достаточно просто. Если Вам достаточно часто требуется получать конкретное значение из базы (как в последнем примере), то рекомендую вывести весь код в отдельную функцию (Как написать функцию на VBA Access 2003) с одним входящим параметром, например, код месяца (если рассматривать наш пример) и просто, где необходимо вывести это значение, вызывать нужную нам функцию с нужным параметром и все, этим мы значительно уменьшим код VBA и улучшим восприятие нашей программы.
Заметка! Если Вас интересует SQL и T-SQL, рекомендую посмотреть мои видеокурсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.
На сегодня это все. Удачи!
Резюме Специалист по SQL-запросам, VBA (MS Access, MS Excel), Москва, 85 000 руб. в месяц
Резюме № 3223672
Обновлено 1 июня 2022
Специалист по SQL-запросам, VBA (MS Access, MS Excel)Был больше месяца назад
85 000 ₽
45 лет (родился 12 июня 1977), cостоит в браке, детей нет
Москва, не готов к командировкам
Занятость
полная занятость
Гражданство
не указано
Добавить в избранное
Поделиться
Фото, имя и контакты доступны только авторизованным пользователям
Образование
- Высшее образование
- Вечерняя
- 2006
Московский авиационный институт (Национальный исследовательский университет)
Факультет: Экономики и менеджмента
Специальность: Инженер-экономист
- Неполное высшее образование
- Дневная/Очная
- 1997
Московский авиационный институт (Национальный исследовательский университет)
Факультет: Прикладная математика и физика
Специальность: Программист
Обо мне
Профессиональные навыки:
Компьютерные навыки:
MS Access, MS office язык VBA,
SQL-запросы
Дополнительные сведения:
Запросы SQL, MS Office (VBA)
Иностранные языки
- Английский язык — технический
Добавить в избранное
Поделиться
Фото, имя и контакты доступны только авторизованным пользователям
Похожие резюмеВсе 57 похожих резюме
Обновлено 19 января
Программист-разработчик T-SQL / Специалист по настройке и администрированию WMSз/п не указана
Последнее место
работы
(
3 мес.
)Ведущий разработчикНоябрь 2021 – февраль 2022
Показать контакты
Добавить в избранное
Обновлено вчера
Программист-разработчик / web-разработчик / JavaScript / PHPз/п не указана
Последнее место
работы
(
4 года и 7 мес.
)Web-разработчикСентябрь 2018 – работает сейчас
Показать контакты
Добавить в избранное
Обновлено в 16:51
Java разработчик / Java Developerз/п не указана
Последнее место
работы
(
11 мес.
)Java-разработчикМай 2022 – работает сейчас
Показать контакты
Добавить в избранное
Обновлено в 10:01
Java-разработчикз/п не указана
Последнее место
работы
(
5 мес.
)Разработчик JavaНоябрь 2022 – работает сейчас
Показать контакты
Добавить в избранное
Обновлено в 15:32
Программист PHP, Web-разработчик, поддержка сайтов80 000 ₽
Последнее место
работы
(
3 мес.
)Web-разработчик PHPЯнварь 2023 – работает сейчас
Показать контакты
Добавить в избранное
Обновлено в 14:00
Junior разработчик (Python)з/п не указана
Последнее место
работы
(
1 год и 6 мес.
)Администратор проектовОктябрь 2021 – работает сейчас
Показать контакты
Добавить в избранное
Обновлено вчера
Разработчик, программист, инженерз/п не указана
Последнее место
работы
(
5 лет
)Инженер-программистАпрель 2018 – работает сейчас
Показать контакты
Добавить в избранное
Обновлено вчера
Frontend разработчикз/п не указана
Последнее место
работы
(
7 мес.
)Frontend-разработчикАвгуст 2022 – март 2023
Показать контакты
Добавить в избранное
Обновлено вчера
Junior Java-разработчик, программистз/п не указана
Последнее место
работы
(
9 лет и 2 мес.
)Инженер-конструкторОктябрь 2013 – декабрь 2022
Показать контакты
Добавить в избранное
Обновлено вчера
Разработчик C++з/п не указана
Последнее место
работы
(
3 года и 9 мес.
)Руководитель проекта по наружным и внутренним инженерным системамИюль 2019 – работает сейчас
Показать контакты
Добавить в избранное
Работа в Москве / Резюме / IT, Интернет, связь, телеком / Администрирование баз данных / Специалист
Смотрите также резюме
Администрирование баз данных
Разработка, программирование
Мы используем cookies, чтобы улучшить сайт для вас. Подробнее
SQL-запрос MS Access в коде VBA
Мне нужен второй набор глаз для этого SQL-запроса, встроенного в код VBA. Я делаю приложение MS Access, которое возвращает набор данных на основе критериев даты и даты, установленных пользователем в определенных полях выбора даты. SQL-запрос, который вы видите, на самом деле был протестирован статически в представлении дизайна запроса MS Access. Я протестировал его с реальными датами, где вы видите Me.from_filter и Me.to_filter. Это сработало отлично! Если вы выбрали что-то вроде с 01.01.2015 по 01.05.2015, он вернет столбцы всех месяцев, которые вам нужны. Идеальный. Теперь, когда я вставляю его в код VBA и назначаю управляющей переменной, я получаю «Ошибка времени выполнения« 2342 »: действие RunSQL требует аргумента, состоящего из оператора SQL». Может кто-нибудь посмотреть на это и сказать мне, что может быть не так?
База данных сравнения параметров Опция явная Dim strSQL как строка Частная подкоманда Command0_Click() Если IsNull(Me. from_filter) или IsNull(Me.to_filter), то MsgBox "Вы не ввели дату начала или дату окончания" Еще strSQL = "ПРЕОБРАЗОВАТЬ СУММУ (dbo_ASSET_HISTORY.MARKET_VALUE) AS SumOfMARKET_VALUE" _ & "ВЫБЕРИТЕ [dbo_FIRM]![ИМЯ] КАК [ИМЯ ФИРМЫ], dbo_FUND.CUSIP, dbo_FUND.FUND_NAME, dbo_FUND.PRODUCT_NAME" _ & "FROM (dbo_ASSET_HISTORY INNER JOIN dbo_FIRM ON dbo_ASSET_HISTORY.FIRM_ID = dbo_FIRM.FIRM_ID) INNER JOIN dbo_FUND ON dbo_ASSET_HISTORY.FUND = dbo_FUND.FUND " _ & "ГДЕ (((dbo_FIRM.Name) Like 'Voya F*') And ((dbo_ASSET_HISTORY.PROCESS_DATE) >= #" & Me.from_filter & "# And (dbo_ASSET_HISTORY.PROCESS_DATE) <= #" & Me.to_filter & "#))" _ & "ГРУППИРОВАТЬ ПО [dbo_FIRM]![ИМЯ], dbo_FUND.CUSIP, dbo_FUND.FUND_NAME, dbo_FUND.PRODUCT_NAME" _ & "PIVOT [dbo_ASSET_HISTORY]![ASSET_YEAR] & '-' & [dbo_ASSET_HISTORY]![ASSET_MONTH];" DoCmd.RunSQL (strSQL) Конец, если Конец сабвуфера
- vba
- мс-доступ
0
RunSQL предназначен для выполнения запросов действий, таких как обновление, вставка, выбор, удаление и т. д., в соответствии с определением Microsoft https://msdn.microsoft.com/en-us/library/office/ff194626.aspx, вам, вероятно, следует использовать OpenQuery или аналогичный для запуска вашего запроса.
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Использование Access VBA для запроса к базе данных SQL Server
Автор mandy. doward
Теги:
SQL Server, Access, VBA, Function База данных сервера бывают случаи, когда вы хотите проверить значение или найти значение в базовой базе данных SQL Server непосредственно из запроса доступа.
С помощью VBA мы можем сделать это!
Мы рассмотрим пример, который позволяет нам искать общее значение дохода клиента из запроса доступа.
VBA для запроса базы данных SQL Server
Следующая функция VBA может использоваться из проекта Access VBA. Однако сначала вам потребуется добавить в проект библиотеку ADODB.
Открытая функция LookupAWCustomerRevenue(intID As Long) как валюта Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim strConnString как строка Если intID = 0 Тогда LookupAWCustomerRevenue = 0 Еще strConnString = "Поставщик = SQLOLEDB; Источник данных = W10NBMJD\SQL2014;" _ & "Исходный каталог=AdventureWorks2014;Интегрированная безопасность=SSPI;" Установить conn = новый ADODB. Connection conn.Open strConnString Установите rs = conn.Execute («ВЫБЕРИТЕ СУММУ (TotalDue) AS CustRev FROM Sales.SalesOrderHeader WHERE CustomerID = « & intID) Если Не ЯвляетсяЧисловым(rs.Fields("CustRev").Value) Then LookupAWCustomerRevenue = 0 Еще LookupAWCustomerRevenue = rs.Fields("CustRev").Value rs.Закрыть Конец, если Конец, если Завершить функцию
В этом примере мы используем соединение ADO для подключения к экземпляру SQL Server (DBSRV\SQL2014):
strConnString = "Provider=SQLOLEDB;Источник данных=DBSRV\SQL2014;" _ & "Исходный каталог=AdventureWorks2014;Интегрированная безопасность=SSPI;"
- Параметр "Поставщик" указывает, что будет установлено соединение OLDEB, а параметр "Источник данных" указывает на экземпляр SQL Server.
- Параметр Initial Catalog идентифицирует запрашиваемую базу данных (AdventureWorks2014)
- Параметр встроенной безопасности указывает, что для проверки подлинности с помощью SQL Server будет использоваться проверка подлинности Windows.
Объект RecordSet (rs) используется для создания набора записей из оператора SELECT:
Set rs = conn.Execute("SELECT SUM(TotalDue) AS CustRev FROM Sales.SalesOrderHeader WHERE CustomerID = " & intID)
Оператор SELECT состоит из буквальной строки и значения переменной intID, которое передается в функцию при ее вызове.
Оператор If в начале проверяет значение intID, равное 0. Целочисленные переменные по умолчанию имеют нулевое значение, если они не инициализированы (другими словами, если при вызове функции не указано значение). Если в функцию не передается значение, в качестве значения дохода возвращается значение 0 .
Если intID = 0 Тогда LookupAWCustomerRevenue = 0
Второй оператор If проверяет нечисловое значение, возвращаемое оператором SELECT. Если идентификатор клиента, переданный в функцию, действителен, но они не разместили ни одного заказа, выражение SUM(TotalDue) вернет значение 9.0087 Значение NULL . Если это произойдет, функция вместо этого вернет значение 0.
Если не числовой(rs.Fields("CustRev").Value) Then LookupAWCustomerRevenue = 0
Сценарий со значением NULL показан на следующем снимке экрана.
Я поставил точку останова на строку кода VBA, содержащую оператор If, и открыл окно Locals , чтобы увидеть все значения переменных в этот момент выполнения.
Я проверил функцию, выполнив ее из окна Immediate в редакторе VBA:
?LookupAWCustomerRevenue(1)
С установленной точкой останова выполнение кода автоматически останавливается на отмеченной строке и позволяет нам просматривать среду в этой точке. исполнения.
Окно Locals на приведенном выше снимке экрана показывает объектную переменную Recordset rs и, в частности, значение первого поля из rs, «CustRev». Мы видим, что он установлен на Нуль . Это связано с тем, что клиент со значением CustomerID, равным 1, не разместил ни одного заказа и, следовательно, не имеет результирующего значения дохода.
На следующем снимке экрана показано, что запрос возвращает NULL при выполнении непосредственно на экземпляре SQL Server:
Если предположить, что в функцию передан допустимый идентификатор клиента, а оператор SELECT возвращает значение, отличное от NULL, функция будет вернуть общий доход от продаж для этого клиента в виде валюты.
LookupAWCustomerRevenue = rs.Fields("CustRev").Value
Вызов функции VBA из запроса доступа
Вызов функции VBA из запроса доступа прост. При создании запроса доступа вы можете создавать выражения из встроенной библиотеки функций доступа. Любые функции VBA, которые вы создали в проекте Access, также доступны для этих выражений. На следующем снимке экрана это показано:
В четвертом столбце показано выражение для получения общего показателя дохода клиента — оно вызывает функцию VBA с именем LookupAWCustomerRevenue .
В следующем примере показаны результаты этого запроса:
Сводка
функции из запроса Access.