Sql запросы в microsoft excel

SQL средствами VBA в СУБД Access 2003 и 2007

SQL запросы средствами VBA в СУБД Access 2003 и 2007

В данной статье рассмотрим формирования запросов с использованием SQL в VBA для базы данных Microsoft Access 2003, 2007.

Известно, что SQL запросы в VBA могут быть сформированы с применением следующих технологий доступа к данным: DAO, RDO, ODBC, ADO.NET, ADO, OLE DB и др.
Технологии ADO (ActiveX Data Objects) и OLE DB (Object Linking and Embedding, Database) пришли на смену DAO/RDO и ODBC (Open Database Connectivity)
соответственно.

Так как мы рассматриваем локальную Microsoft Access 2003, 2007, то применим технологию DAO для реализации SQL запросов в VBA. Следует отметить, что
DAO (Data Access Objects) – это объектно-ориентированный интерфейс (API) доступа к данным локальных БД типа Access.

В качестве объектных переменных используем конкретный тип объекта из объектной модели «Database» и новый создаваемый объект «QueryDef».
Поскольку используются объектные переменные, то их надо не только объявить в программе VBA, но и присвоить (установить) им определенные значения.

Назначим им соответствующий объект с помощью специального оператора Set. Так как мы будем работать с объектами открытой БД Access, то объектной
переменной Database присваиваем ссылку на текущую базу данных CurrentDb. Для создания объекта «QueryDef» (создания нового запроса) используем метод
CreateQueryDef.

Для формирования запроса «Запр_гр» с использованием SQL в VBA запустим БД «sql_training_st1_cross-tab.mdb» и создадим новый объект: модуль.

В окне Code введем следующую процедуру:Private Sub Запр_Гр ()Dim oMyDb As DatabaseDim oMyQuery As QueryDefSet oMyDb = CurrentDbSet oMyQuery = oMyDb.CreateQueryDef(«Запр_гр», «SELECT * FROM Группы;»)End Sub

Скриншот кода программы модуля Module_Request представлен на рис. 1.

Для запуска программы надо щелкнуть на пиктограмме «Run Sub», затем на команде «Сохранить». После этого в окне БД в «Области переходов» в категории
«Запросы» появится новый объект — запрос «Запр_гр», а в категории «Модули» — объект: «Module_Request». После создания запроса на выборку необходимо выполнить
этот запрос, дважды щелкнув на объекте «Запр_гр» в «Области переходов». Результаты выполнения команды представлены на рис. 2.

Таким образом, созданный запрос «Запр_гр» на выборку с использованием SQL в VBA для базы данных Microsoft Access 2003, 2007 будет постоянно отображаться
в «Области переходов».

Запрос SELECT к базе на VBA

Здесь дела обстоят чуть интересней, чем с остальными конструкциями SQL.

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

Здесь мы уже используем циклы VBA Access для того чтобы перебрать все значения в нашем наборе записей.

Но, достаточно часто бывает необходимо получить не все значения из набора записей, а всего лишь одно, например, название месяца по его коду. И для этого использовать цикл как-то накладно, поэтому мы можем просто написать запрос, который вернет всего одно значение и обращаться именно к нему, например, получим название месяца по коду 5

Для универсальности здесь мы уже обратились не по имени ячейки, а по ее индексу, т.е. 0, а это самое первое значение в Recordset, в итоге мы получили значение «Май».

Как видите, все достаточно просто. Если Вам достаточно часто требуется получать конкретное значение из базы (как в последнем примере), то рекомендую вывести весь код в отдельную функцию (Как написать функцию на VBA Access 2003) с одним входящим параметром, например, код месяца (если рассматривать наш пример) и просто, где необходимо вывести это значение, вызывать нужную нам функцию с нужным параметром и все, этим мы значительно уменьшим код VBA и улучшим восприятие нашей программы.

Заметка! Если Вас интересует SQL и T-SQL, рекомендую пройти наши курсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.

Выполнение SQL запросов к текущей базе данных в среде VBA (Access)

В Microsoft Office Access поддерживается выполнение SQL запросов к текущей базе данных из программного кода на VBA. Рассмотрим, как это можно использовать при разработке приложений баз данных.

Так как запрос выполняется к той же самой базе данный в которой выполняется модуль VBA, для выполнения SQL запроса нет необходимости работать со стандартными в подобных случаях интерфейсами ADO, ODBC и т.д. Всё можно сделать при помощи объектной модели Access.

Как известно SQL запросы можно условно разделить на две большие группы:

  • Запросы, не возвращающие данных (INSERT, UPDATE, DELETE и т.д.);
  • Запросы возвращающие данные (запросы на выборку (SELECT)).
Запросы, не возвращающие данных

Для выполнения запросов к текущей базе данных служит метод Execute объекта CurrentDb. Этот метод принимает в качестве параметра строку с SQL запросом, который необходимо выполнить.

Это простейший запрос. Но, как быть с запросами, которые манипулируют теми или иными данными?

Такие запросы тоже можно выполнить. Для этого нужно просто сформировать соответствующую строку.

Так, например, может быть реализовано добавление записей в таблицу:

А, так их обновление:

Выполнение другие типов запросов не возвращающих данных осуществляется по аналогичным принципам.

Запросы на выборку

Метод Execute объекта CurrentDb не поддерживает выполнение запросов на выборку. Поэтому для них нужен другой подход.

Чтобы работать с выборкой данных необходимо воспользоваться объектом RecordSet, который можно создать при помощи метода OpenRecordSet объекта CurrentDb. Этот метод также принимает в качестве параметра строку с SQL запросом.

После создания RecordSet мы можем перебрать все записи, как это показано ниже.

Помимо простого перебора доступны несколько видов поиска. Но в основном используются два.

Первый вид поиска реализован в виде методов FindFirst, FindLast, FindNext и FindPrevious объекта RecordSet.

Первые два устанавливают курсор на соответственно первую и последнюю записи, соответствующие условию поиска. Условие поиска передаётся в качестве параметра в виде строки. Само условие задаётся по аналогии с предложением WHERE в обычном SQL запросе.

Методы FindNext и FindPrevious устанавливают курсор на следующую и предыдущую записи в соответствии с условием поиска, если такие записи существуют. Условие поиска для этих методов задаётся также, как и для FindFirst и FindLast.

Обратите внимание, что эти четыре метода именно устанавливают указатель на нужную запись, а не производят фильтрацию выборки. Таким образом количество записей выбранных SQL запросом остаётся неизменным

В следующем примере перебор записей начнётся с записи, у которой id равен 234, так как курсор был перемещён к ней до начала обхода набора записей в цикле.

Настройка среды VBA перед подключением к MySQL

Служба MySQL должна быть сначала установлена ​​в системе, поэтому я не буду много говорить об этом. Вы можете использовать официальный установочный пакет или использовать базу данных в интегрированной среде PHP.

1.1 Включить поддержку сценариев

Перед использованием необходимо запустить поддержку подключения к базе данных в VBE. Нажмите Alt + F11, чтобы открыть VBE, выберите «Инструменты» — «Справочник» в строке меню, во всплывающем справочном окне найдите «Библиотека объектов данных Microsoft ActiveX 6.1» и «Библиотека записей объектов данных Microsoft ActiveX 6.0», поместите предыдущий Установите флажок и нажмите ОК.

1.2 Установите службу подключения MySQL ODBC

Адрес для скачивания:Download Connector/ODBC

Выберите операционную систему и версию системы, загрузите соответствующий файл MSI и установите. Здесь следует отметить, что при загрузке и установке разъема ODBC выберите свойОдинаковое количество версий базы данных, Вместо системных битов, в противном случае будет отображаться запрос о том, что драйвер базы данных не найден после установки (я попытался установить 64-битный соединитель в 64-битной системе, после установки соединение запрашивает, что драйвер не найден, и затем 32-битный соединитель успешно установлен)

1.3 Добавить источник данных ODBC

Откройте «Панель управления» — «Администрирование» — «Источник данных ODBC», во всплывающем окне справа от вкладки «Пользовательский DSN» выберите «Добавить», в новом источнике базы данных появятся два драйвера MySQL. Для «MySQL ODBC 5.3 ANSI Driver» и «MySQL ODBC 5.3 Unicode Driver» ясно, что разница между ними заключается в стандарте кодирования. Я выбрал версию Unicode. Выберите один из них и нажмите Готово

Порядок конфигурации 1.1 и 1.2 может быть произвольным, но 1.3 должен быть после 1.2, в противном случае параметр MySQL не может быть найден при добавлении нового источника данных в источник данных ODBC.

INSERT QUERY

The INSERT query allows us to add new records to the database. It is analogous to the Create function in our CRUD acronym, however, in the QBE window the INSERT query is accessed via the Append button.

Figure 12

We are going to add a new record to the tblEmployees table using an INSERT action query.

  • Open the QBE window and click on the Append button in the ribbon.
  • In the append dialog box select tblEmployees:

Figure 13

  • In the query Grid type FName:”Tom” in the first row of the first column.
  • Select FirstName from the drop down list in the Append To: row.
  • In the query Grid type SName:”Cruise” in the first row of the second column.
  • Select LastName from the drop down list in the Append To: row.
  • In the query Grid type Job:”Drama Teacher” in the first row of the third column.
  • Select Job Title from the drop down list in the Append To: row.

Figure 14

  • Click the Run button to execute the query.
  • You will get a warning that tells you that you are going to add rows to the table Click OK.
  • Open the tblEmployees table and you should see that a new record has been inserted with the data we provided.
  • Now switch to SQL view to see the SQL code for this query:

Figure 15

To summarise the query:

  • The INSERT keyword is followed by the word INTO, this is followed by the name of the table and the fields that we are inserting.
  • The second part of the query uses the SELECT keyword and then combines the literal data (“Tom” for example) with as “alias” (AS FName).

Another quirk of MS Access is the way it converts INSERT statements. Another (more succinct) way of writing the above would be:

The above statement is a more “standard” way of writing an INSERT statement.

What is Structured Query Language?

The fundamental job of an MS Access database (or indeed any database) is to provide a home (base) for data (data). Hence database. Data is stored in entities which are referred to in MS Access as tables and this ability to store data provides us with an opportunity to read, update, insert and delete said data at a later date. In order to work with the data we have stored, we need to be able to communicate with the database. And in order to communicate with the database, we need to use Structured Query Language (SQL).

SQL provides us with the opportunity to read data from single or even multiple tables. We can use SQL to sum, count or average values stored in the database. SQL can also be used to insert new records, update existing ones and delete unwanted ones. Let’s examine what an SQL statement might look like.

The most basic statement you can write with SQL is called a SELECT statement.

In the above SQL statement we are retrieving the fields ID, InvoiceNo, Date and OrganisationID from an Invoices table.

Where will I find SQL?

In MS Access, SQL can be found in queries (view a query in SQL View). It can also be used in VBA to construct custom queries to manipulate data (this will be covered later in the post).

Using TransferDatabase

This is the easiest method: it works fine as long as the SQL version of the
table or view has a primary key setup.

‘ Some variable to make the code more generic

Dim strConnectionString As String

Dim strNameInAccess As String

Dim strNameInSQLServer As String

‘ set the connection string

strConnectionString = «ODBC;DRIVER=SQL Server; » & _

«SERVER=.\SQLExpress;DATABASE=MyDatabase;Trusted_Connection=Yes»

‘ specify the tables you want to link. The table can be

‘ known by a different name in Access than the name in SQL server

strNameInAccess = «tblYacht»

strNameInSQLServer = «tblSailingBoat»

‘ delete the table from the local database if it exists

On Error Resume Next

DoCmd.RunSQL «drop table » & strNameInAccess

On Error GoTo 0

DoCmd.TransferDatabase acLink, «ODBC Database», _

strConnectionString, acTable, strNameInSQLServer, strNameInAccess

If you are linking to an SQL table/view without a primary key you will see this
dialog box pop up:

From this window you can select the field or combination of fields that uniquely identify a record.

The problem
is how to write VBA to select the fields you want and dispense with this window.
Quite simply it cannot be done using TransferDatabase.

Экспорт данных из Access в шаблон Word

Вся разработка делится на две части, это:

  • Настройка шаблона Word;
  • Настройка выгрузки данных в шаблон.

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

Примечание! Я использую Microsoft Word 2003.

Открываем шаблон Word, для начала добавим необходимую панель инструментов, для этого нажимаем «Вид -> Панель инструментов» и ставим галочку «Формы». Теперь у Вас отобразилась панель инструментом «Формы». Все, что осталось сделать — это вставить в местах, в которых необходимо выводить данные, элементы «Текстовое поле», которые доступны на только что добавленной панели инструментов.

После добавления поля, у Вас появится серая область, которая свидетельствует о том, что поле добавлено. Теперь необходимо задать имя этого поля, для того чтобы потом из access вставлять в него значения (стандартное названия не очень удобное). Для этого щелкните правой кнопкой мыши по полю и нажмите «Свойства». В поле закладка напишите желаемое имя этого поля, я в примере назвал его MyTestPole.

Создайте столько полей, сколько Вам нужно.

На этом настройка шаблона закончена, рекомендую сделать этот шаблон только для чтения, а то пользователь возьмет, сформирует документ и сохранит его, и шаблон тем самым потеряется, а если сделать его только для чтения, то у него такой возможности не будет, только сохранять через «Сохранить как».

Переходим к более интересной задачи, это к реализации самой выгрузки из Access в этот шаблон на VBA.

Примечание! Я использую Access в связке с MS SQL 2008, поэтому и данные буду брать от туда.

Код VBA для выгрузки данных в шаблон Word

Допустим, у Вас есть форма, сделайте на ней кнопку (я назвал ее testbutton) и в событие нажатие кнопки вставьте следующий код VBA:

Private Sub testbutton_Click() ‘Объявляем переменные Dim FileDialog As FileDialog Dim rsd As ADODB.Recordset Dim strSQL As String Dim WordApOb As Object Dim WordOb As Object Dim path As String Set rsd = New ADODB.Recordset ‘запрос к базе данных для получения необходимых данных strSQL = “select * from dbo.table where KOD = ” & Me.kod & “” rsd.open strSQL, CurrentProject.Connection ‘Выбираем шаблон Set FileDialog = Application.FileDialog(msoFileDialogOpen) ‘убираем множественный выбор, он нам не нужен FileDialog.AllowMultiSelect = False ‘очистим и установим фильтры FileDialog.Filters.Clear FileDialog.Filters.add “Word”, “*.doc” ‘установим фильтр по умолчанию FileDialog.FilterIndex = 1 ‘проверяем, что сделал user, если выбрал шаблон, то начинаем работу If FileDialog.Show = False Then ‘Если нет, то выходим Set dlgFile = Nothing Exit Sub End If ‘получаем путь к файлу path = Trim(FileDialog.SelectedItems(1)) ‘Очистим переменную Set FileDialog = Nothing If path <> “” Then ‘Будем отслеживать ошибки On Error GoTo Err_testbutton_Click ‘Создаем объект Word Set WordOb = CreateObject(“Word.document”) ‘Задаем нашему документу значение из шаблона Set WordOb = GetObject(path) ‘Задаем значение объекту word.Application Set WordApOb = WordOb.Parent ‘делаем приложение word видимым WordApOb.Visible = True ‘ищем наше поле в шаблоне WordOb.Bookmarks(“mytestpole”).Select ‘задаем ему новое значение из нашего Recordset WordApOb.Selection.TypeText Text:=Nz(rsd.Fields(“field”).Value, ” “) ‘и так далее по всем полям ‘в конце перейдем на начало нашего документа WordApOb.Selection.Goto wdGoToFirst ‘и активируем его WordApOb.Activate ‘Очистим переменные Set WordOb = Nothing Set WordApOb = Nothing Exit_testbutton_Click: Exit Sub Err_testbutton_Click: MsgBox Err.Description ‘в случае ошибки будем делать следующие ‘закроем word без сохранения WordOb.Close (wddonotsavechanges) WordApOb.Quit ‘и также очистим переменные Set WordOb = Nothing Set WordApOb = Nothing Resume Exit_testbutton_Click End If End Sub

Код прокомментирован, поэтому сложностей возникнуть не должно. Здесь весь смысл сводится к созданию объекта word.document и word.application. А после мы уже работаем с нашими объектами, т.е. заполняем их.

Настройка

Макрокоманда ОткрытьЗапрос
имеет следующие аргументы:

Аргумент макрокоманды

Описание

Имя запроса

Имя открываемого запроса. Выберите имя в раскрывающемся списке. Это обязательный аргумент.

При выполнении в базе данных библиотеки макроса, содержащего макрокоманду ОткрытьЗапрос
, Access сначала ищет запрос с этим именем в базе данных библиотеки, а затем в текущей базе данных.

Представление, в котором будет открываться запрос. Выберите в поле Вид
значение Таблица
, Конструктор
, Предварительный просмотр
, Сводная таблица
или Сводная диаграмма
. По умолчанию используется Таблица
.

Примечание:
Представления «Сводная таблица» и «Сводная диаграмма» недоступны в версиях Access, начиная с Access 2013.

Режим данных

Режим ввода данных для запроса. Этот параметр относится только к запросам, открытым в режиме таблицы. Выберите Добавить
(пользователи смогут добавлять новые записи, но не изменять существующие), Изменить
(пользователи смогут изменять существующие записи, а также добавлять новые) или Только для чтения
(пользователи смогут только просматривать записи). По умолчанию используется значение Изменить
.

SELECT DISTINCT

Select distinct is used to return only unique rows of data. Let’s take a look at an example.

  • Open the QBE editor.
  • Select SQL View.
  • Delete SELECT; and type: SELECT tblEmployees.JobTitle FROM tblEmployees;
  • Run the query. You will have a list of JobTitles. The JobTitle “Secretary” will be repeated 5 times.
  • Select SQL View.
  • Add DISTINCT into your query like this: SELECT DISTINCT tblEmployees.JobTitle FROM tblEmployees;
  • Run the query. You will now only have unique rows of data (every value will only appear once).

Figure 21

SELECT DISTINCT is a very useful keyword but can only be added to an SQL statement through SQL View. You cannot do it through the QBE editor.

Проект Microsoft Access (ADP);

Проект Microsoft Access (*.adp) является файлом данных Microsoft Access, обеспечивающим эффективную работу с базами данных Microsoft SQL Server. Используя проект Microsoft Access, можно создавать приложения в архитектуре «клиент/сервер» так же легко, как приложения файлового сервера.

Приложение в архитектуре «клиент/сервер» может быть традиционным решением, основанным на формах и отчетах, или решением на базе Интернета, использующим страницы доступа к данным.

Проект Microsoft Access можно подключить к удаленной базе данных Microsoft SQL Server, локальной базе данных Microsoft SQL Server или к локальной установке Microsoft SQL Server 2000 Desktop Engine (MSDE).

Файл проекта не содержит данные или объекты определения данных, такие как таблицы и представления.

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

ЗАКЛЮЧЕНИЕ

В общем смысле термин «база данных» (БД) можно применить к любой совокупности связанной информации, объединенной вместе по определенному признаку, т.е. к набору данных, организованных определенным образом. При этом большинство БД использует табличный способ преставления, где данные располагаются по строкам (которые называются записями) и столбцам (которые называются полями), причем все записи должны состоять из одинаковых полей и все данные одного поля должны иметь один тип. Например, расписание движения поездов, полетов самолетов, книга заказов или учет товаров и т.п. легко могут быть представлены в такой форме. Базы данных должны содержать только независимую (первичную) информацию, поэтому не любая таблица представляет собой базу данных.

В последнее время наибольшее распространение получили реляционные базы данных (слово «реляционная» происходит от английского relation– отношение). Концепции реляционной модели данных связаны с именем известного специалиста в области систем 6aз данных Е. Кодда. Именно поэтому реляционную модель данных в литературе часто называют моделью Кодда.

В компьютерном варианте в реляционной БД информация хранится, как правило, в нескольких таблицах-файлах, связанных между собой посредством одного или нескольких совпадающих в этих таблицах полей (в некоторых компьютерных системах все таблицы одной базы помещаются в один файл). Каждая строка в таблице реляционной БД должна быть уникальна (т.е. не должно быть одинаковых строк-записей). Такие уникальные столбцы (или уникальные группы столбцов), используемые, чтобы идентифицировать каждую строку и хранить все строки отдельно, называются первичными ключами таблицы.

Первичные ключи таблицы важный элемент в структуре базы данных. Они — основа системы записи в файл и, когда необходимо найти определенную строку в таблице, то ссылаются к этому первичному ключу. Кроме того, первичные ключи гарантируют, что данные имеют определенную целостность. Если первичный ключ правильно используется и поддерживается, то можно быть уверенным, что нет пустых строк таблицы и, что каждая строка отличается от любой другой строки.

Основным назначением БД является быстрый поиск содержащейся в ней информации. При этом БД могут содержать значительный объем информации, например, список домашних телефонов г.Астрахани (с его недостаточной степенью телефонизации) составляет десятки тысяч абонентов. В телефонной книге абоненты упорядочены (отсортированы) в алфавитном порядке и поиск по фамилии займет не очень много времени, однако, поиск по адресу или неточному номеру телефона и т.п. вручную – не решаемая практически задача.

Мир баз данных становится все более и более единым, с развитием Internet- и Intranet- технологий появилась возможность доступа к удаленным БД, что привело к необходимости создания стандартного языка, который мог бы использоваться так, чтобы функционировать в большом количестве различных видов компьютерных сред. Стандартный язык позволил бы пользователям, знающим один набор команд, использовать их, чтобы создавать, отыскивать, изменять и передавать информацию независимо от того, работают ли они на персональном компьютере, сетевой рабочей станции или на универсальном компьютере.

Пример — использование условия BETWEEN с числовыми значениями

Давайте рассмотрим пример использования условия BETWEEN для получения значений в числовом диапазоне.

В этом примере у нас есть таблица suppliers со следующими данными:

supplier_id supplier_name city state
100 Yandex Moscow Moscow
200 Lansing Michigan
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania
700 Qwant Paris Ile de France
800 Menlo Park California
900 Electronic Arts San Francisco California

Выполните следующий оператор SELECT:

Будет выбрано 4 записи. Вот результаты, которые вы должны получить:

supplier_id supplier_name city state
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania

В этом примере возвращаются все строки из таблицы suppliers , где supplier_id находится в диапазоне от 300 до 600 (включительно). Это эквивалентно следующему запросу SELECT:

Запросы к базе 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, надеюсь, смысл понятен.

Настройка

Макрокоманда ОткрытьЗапрос
имеет следующие аргументы:

Аргумент макрокоманды

Описание

Имя запроса

Имя открываемого запроса. Выберите имя в раскрывающемся списке. Это обязательный аргумент.

При выполнении в базе данных библиотеки макроса, содержащего макрокоманду ОткрытьЗапрос
, Access сначала ищет запрос с этим именем в базе данных библиотеки, а затем в текущей базе данных.

Представление, в котором будет открываться запрос. Выберите в поле Вид
значение Таблица
, Конструктор
, Предварительный просмотр
, Сводная таблица
или Сводная диаграмма
. По умолчанию используется Таблица
.

Примечание:
Представления «Сводная таблица» и «Сводная диаграмма» недоступны в версиях Access, начиная с Access 2013.

Режим данных

Режим ввода данных для запроса. Этот параметр относится только к запросам, открытым в режиме таблицы. Выберите Добавить
(пользователи смогут добавлять новые записи, но не изменять существующие), Изменить
(пользователи смогут изменять существующие записи, а также добавлять новые) или Только для чтения
(пользователи смогут только просматривать записи). По умолчанию используется значение Изменить
.

Синтаксис

SELECT [предикат
] { * | таблица
.* | [таблица
.]поле1
[, [таблица
.]поле2
]}FROM табличное_выражение

Инструкция SELECT включает приведенные ниже элементы.

Элемент

Описание

предикат

Один из следующих предикатов: ALL, DISTINCT, DISTINCTROW или TOP. Предикаты используются для ограничения числа возвращаемых записей. Если предикат не задан, по умолчанию используется ALL.

Указывает на то, что из заданной таблицы или таблиц выбираются все поля.

таблица

Имя таблицы, содержащей поля с выбранными записями.

поле1
, поле2

Имена полей, содержащих извлекаемые данные. Если задано несколько полей, данные будут извлекаться в порядке перечисления их имен.

псевдоним1
, псевдоним2

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

табличное_выражение

Одно или несколько имен таблиц, содержащих извлекаемые данные.

внешняя_база_данных

Имя базы данных, содержащей таблицы, указанные в компоненте табличное_выражение
, если их нет в текущей базе данных.

Запрос 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 и улучшим восприятие нашей программы.

На сегодня это все. Удачи!

С помощью макрокоманды ОткрытьЗапрос
в базах данных Access можно открывать запросы на выборку и перекрестные запросы в режиме таблицы, в Конструкторе или в режиме предварительного просмотра. Это действие запускает запрос на изменение. Вы также можете выбрать режим ввода данных для запроса.

Примечание:
Данная макрокоманда доступна только в среде базы данных Access (MDB или ACCDB). Если вы используете среду проекта Access (ADP), см. макрокоманды ОткрытьПредставление
, ОткрытьСохраненнуюПроцедуру
и ОткрытьФункцию
. Макрокоманда ОткрытьЗапрос
недоступна в веб-приложениях Access.

Выполнение Запроса SQL В Access VBA

Im пытается запустить запрос SQL в Access VBA, но мой запрос слишком длинный, чтобы поместиться в одну строку

так что он не будет запускать полный запрос сразу, есть ли обходной путь для этого?

4 Ответов

Вы просто говорите о форматировании wraparound, где вы используете «& _», чтобы продолжить строку?

SQL не учитывает пробел, это должно выполнить весь запрос сразу.

Я думаю, что ваша проблема заключается в том, что вы хотите использовать SELECT INTO с TSQL

Смотрите здесь для получения дополнительной информации:

У вас есть несколько вопросов.

Один из них заключается в том, что SQL server и Access SQL-это не одно и то же. Доступ к SQL намного более ограничен, поэтому только потому, что запрос SQL выполняется на сервере SQL, не означает, что он будет выполняться в Access. Для выполнения запросов сервера SQL, которые не совместимы с доступом SQL, необходимо использовать сквозной запрос.

Другая проблема заключается в том, что имена таблиц Access и SQL server не обязательно совпадают.

Теперь, предполагая, что вы приняли все это во внимание, и ваш запрос на самом деле совместим с Access SQL, вы можете запустить его следующим образом:

Похожие вопросы:

Я новичок в доступе, и я иду от C#, SQL сервера &. Net. есть проект, который пришел ко мне, и я должен завершить некоторые части. Этот сценарий можно описать следующим образом: Форма доступа с.

У меня есть база данных Access с одним запросом в ней. В настоящее время я могу скопировать запрос через VBA, используя DoCmd.CopyObject . Однако мне нужно иметь возможность редактировать SQL в.

Приведенный ниже код возвращает синтаксическую ошибку в Access VBA, и я использовал этот же код в дизайне запроса, который работал нормально. Я понимаю, что код SQL может отличаться в режиме.

Я хочу выполнить предопределенный запрос из access via VBA и распечатать его на выходе отладки. Имя конструкции запроса находится в переменной с именем report. Я ожидал, что он будет работать с.

У меня есть проект базы данных Access, связанный с сервером Ms SQL. Данные (таблицы) хранятся на сервере Ms SQL, а формы и отчеты-в файле Access .ADP. Невозможно создать запросы, таблицы.

Контекст-я создаю базу данных access, которая отслеживает гонки на парусных лодках и вычисляет общие оценки сезона, а также меньшие series баллов. Однако в a series учитывается не каждая раса.

Я использую два запроса SQL в VBA, которые, по моему мнению, можно было бы сделать в одном, но я не могу заставить его работать. Я хочу превратить часть VBA в запрос за пределами VBA, VBA продолжает.

У меня есть следующий запрос SQL, который я выполняю, и я пытаюсь найти, почему он возвращает ошибку ‘overflow’ при запуске запроса. Теперь я хочу распечатать последнюю запись, которую он вычисляет.

Глядя, чтобы сделать это без использования VBA и с помощью MS Access SQL. Вы знаете, что нужно перейти к дизайну запросов, а затем нажать кнопку SQL в правом нижнем углу. У меня есть некоторые.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Вадлейд
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: