Программирование в MS ACCESS, страница 5

Такой запрос вернет все записи, содержащие все поля указанной таблицы (запроса). Для отбора записей по какому-либо критерию используется предложение Where, за которым следуют название поля, по которому производится отбор, операция сравнения и образец для сравнения, например:

Select * from Table1 Where фио=’иванов’

Если необходимо произвести отбор сразу по нескольким полям, то условия отбора объединяются логическими операторами AND или OR, например:

Select * from Table1 Where фио=’иванов’ OR март > 2000

Кроме известных из VBA операторов сравнения в предложении Where можно использовать операторы BETWEEN - внутри диапазона значений включительно, LIKE - соответствует образцу (% - частично, _ - занимает место одного символа), IN - входит в список значений, перечисленных в скобках.

Полученные записи будут неупорядочены. Для их сортировки используется предложение Order by с указанием поля, по которому производится сортировка, и направления сортировки (по умолчанию или ASC - по возрастанию, DESC - по убыванию), например:

Select * from Table1 Where фио=’ива%’ Order by фио

Если в запросе необходимо произвести вычисления, то используются группирующие функции AVG, COUNT, MAX, MIN, SUM и другие, с помощью предложения AS создается поле, в которое заносится результат и задается поле, по которому производится группировка:

Select * SUM(январь) AS СУММА from Table1 Group by фио

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

Если при группировании необходимо ввести критерий отбора, то вместо предложения Where используют предложение Having, например:

Select * SUM(январь) AS СУММА from Table1 Group by фио Having фио=’ива%’

Если в запросе необходимо использовать в запросе записи из нескольких связанных таблиц, то можно задать их объединение через выражение эквивалентности между двумя полями:

Select * from Table1, Table2 Where Table1.Код = Table2.фио

Можно также задать объединение двух таблиц, используя предложение Inner Join:

Select * from Table1 Inner Join Table2 On Table1.Код = Table2.фио

Кроме запросов на извлечение данных в SQL существуют также запросы действия - на обновление (UPDATE), удаление (DELETE), добавление (INSERT INTO), объединение (UNION). В рамках данного курса эти запросы подробно рассматриваться не будут.

Заметим, что для проверки правильности составления SQL-запроса можно создать обычный (табличный) запрос, а затем представить его в виде SQL с помощью команды меню «Вид» - «В виде SQL». Текст SQL-запроса может быть скопирован в буфер обмена, а затем вставлен в соответствующем месте модуля формы.

Recordset и его свойства. Результатом выполнения запроса является набор записей - recordset. Используя свойства объекта recordset, можно узнать количество и наименование полей данных, количество записей и получить значения конкретного поля конкретной записи. При этом, как и в таблице базы данных, всегда имеется (при непустом наборе записей) текущая запись, внутри которой можно перемещаться по полям.

К основным свойствам набора записей (назовем его rs) относятся Fields - коллекция полей записи и Fields.Count - количество полей в записи, располагая которыми модно организовать цикл по извлечению названий полей:

For i=0 to rs.Fields.Count-1

MsgBox CStr(i)&’ ‘&rs.Fields(i).Name

Next i

Для текущей записи можно извлечь значение конкретного поля:

MsgBox rs.Fields(1).Value

Для перемещения по записям служат методы MoveNext - перейти к следующей, MovePrevious - перейти к предыдущей, MoveFirst - перейти к первой, MoveLast - перейти к последней. Для того, чтобы избежать ошибки при попытке перехода за начало или после конца записей используют проверку значения свойств набора записей .BOF и .EOF. Для определения общего количества записей используется свойство .RecordCount.

Теперь мы можем, описав объект типа Recordset, обратиться с SQL-запросом, включающем выбранное значение поля фио, к текущей базе данных, выяснить, нет ли у нас записей с одинаковым значением этого поля, вычислить сумму значений полей «январь», «февраль», «март» и вывести ее в текстовое поле.

Вначале настроим внешний вид формы: