Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.10.2020

Просмотров: 7947

Скачиваний: 25

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Поиск записей

Обычно операции над данными подразумевают задание группы или подмножества

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

Существует два основных способа поиска записей, к которым впоследствии будет

применена конкретная команда: вы можете создать и применить запрос Access, по-
строить символьную строку, содержащую выражение на языке SQL, открыть объект
набора данных (скажем, таблицу) и использовать циклическую VBA-процедуру, по-
зволяющую отобрать нужные записи.

Команда SQL выполняется сервером базы данных (т.е. чаще всего другим — мощ-

ным — компьютером), поэтому производительность прикладной программы в этом
случае окажется, вероятно, более высокой. Впрочем, код на языке VBA нередко де-

монстрирует завидную гибкость. Поэтому наилучший выбор — разумное сочетание
обоих подходов.

Предварительное создание запроса значительно упрощает код. Если же вся работа

по поиску записей возлагается на

 код существенно вырастает в раз-

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

' труднее и

Ниже мы рассмотрим оба способа поиска строк данных. Главное — определить

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

Поиск в таблице

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

Решение, целиком реализованное средствами VBA, является более гибким. В листин-

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

Листинг

 Пример поиска записей в наборе данных средствами процедуры

на языке VBA

1:

2:
3:
4:

5:
6:
7:
8:
9:
10

13
14
15
16
17
18
19
20

Sub Test ()

Call

 "Merchant")

End Sub

Function

 ) As

Const Provider =
Const DataSource =

"Data

Set OpenConnection = New
Call

 Provider & DataSource,

End Function

Sub

 As String,

 FindValue As String )

Dim Connection As
On Error GoTo Finally
Set Connection = OpenConnection

15-й час. ADODB — ваш верный помощник

265


background image

21:

22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

38:
39:
40:
41:

45:

Dim

 As New

Call

 "MUSIC", Connection,

 adLockOptimistic )

Do While Not

If

 )

 FindValue) Then

 "TITLE" )

End If

Loop

Finally:

If

 <>

 0) Then

Call

End If

Set RecordSet = Nothing

Set Connection = Nothing

End Sub

В строке 41 листинга 15.5 вызывается метод Clear объекта Err.

Используется этот метод не всегда. Объект Err очищается при дости-

жении конца процедуры обработки ошибки, выполнении команд Exit

Function, Exit Sub, Exit Property, одной из команд Resume или

следующего оператора On Error.

Можно использовать команду

 чтобы не держать в памяти

информацию о том, когда очищается данный объект.

I Строки

 содержат тестовую процедуру, единственное назначение ко-

I торой состоит в вызове функции FindRecord,

 основной

алгоритм поиска. Подобные простые процедуры весьма удобны при по-
следовательной отладке программы. Когда процесс тестирования завер-

шен, такие процедуры можно просто удалить. Существуют специальные

директивы компилятора, предназначенные для удаления вспомогатель-

ного кода (см. главу

 час. Отладка кода"). В строках

 представ-

лена отдельная функция, выполняющая задачу создания объекта соеди-

нения и его открытия. Обратите внимание, что функция возвращает зна-

чение типа ADODB. Connection.

Строки

 демонстрируют текст процедуры поиска. В строке 18 объявляется пе-

ременная типа Connection — обратите внимание, что в данном случае служебное слово
New не задается, поскольку задача непосредственного создания объекта соединения с
выделением ему необходимого фрагмента памяти возложена на функцию OpenConnec-

tion. В строке 19 устанавливается обработчик, в случае возникновения ошибки пере-

дающий управление на метку FINALLY. Впрочем, код, следующий за меткой, выполня-

ется всегда — не только в случае ошибки. Строка 20 устанавливает объект соединения -

напомним, в операциях присваивания объектов используется служебное слово Set.

266

Часть V. Программирование и базы данных Access


background image

Строка 24 выполняет открытие набора данных, задаваемого таблицей MUSIC. Коман-

да строки 26 перемещает указатель к первой записи набора. Строки 27-33 содержат

конструкцию цикла, позволяющего итеративно просмотреть все записи таблицы. Суть
алгоритма поиска заключена в условном выражении строки 28. Если искомая запись
найдена, часть ее содержимого отображается в окне Immediate. Обратим особое внима-
ние на использование методов

 (строка 26) и

 (строка 32). Без этих

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

В строках

 находятся команды закрытия объектов, очистки памяти и отобра-

жения информации об ошибке, если таковая произошла.

Поиск с использованием запроса

Преимущество использования запроса состоит в том, что он способен возвращать

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

Листинг 15.6 содержит только ту часть текста листинга 15.5, которая подверглась

изменениям.

Листинг 15.6. Фрагмент листинга 15.5, измененный в связи с использованием запроса

22: Dim SQL As String

23: SQL = "SELECT * FROM MUSIC WHERE

 &

 &

24:

 &

 &

25: Dim RecordSet As New

 Call

 SQL, Connection,

27: adLockOptimistic )

28:

 Do While Not

30:

 SearchFieldName )

31:

32: Loop

Обратите внимание на появление новой символьной переменной SQL. За-
прос, представленный в строке 23, "собран" из

 литеральных кон-

стант, соединенных с содержимым аргументов SearchFieldName (наиме-
нование поля таблицы MUSIC, по которому осуществляется поиск) и Find-
Value (искомое значение, хранящееся в этом поле). В строке 26 процедуры
Open в качестве параметра источника данных передается уже не имя табли-
цы, а название переменной, содержащей текст запроса на языке SQL.

Поскольку запрос сам по себе предусматривает фильтрацию записей посред-
ством предложения WHERE, необходимость использования условного выраже-
ния в теле цикла отпадает. Предложение WHERE команды SELECT языка
SQL способно содержать любое число аргументов в формате

 Опе-

ратор Значение, где в качестве оператора используются операторы сравне-
ния (скажем, =), а тип значения должен совпадать с типом поля (символьные
значения заключаются в одинарные кавычки). Аргументы-предикаты
"склеиваются" посредством логических операторов AND, OR и других, при не-
обходимости их заключают в круглые скобки. Синтаксис предложения WHERE
в упрощенной форме описывается следующим образом.

 WHERE ИмяПоля Оператор Значение [AND | OR ИмяПоля Опера-

тор Значение

 час. ADODB - ваш верный помощник

267


background image

Предложение WHERE может включать в себя также вложенные

 Более под-

робно вопросы программирования на языке SQL приведены в главе "16-й час. При-
менение языка SQL".

Свойство Filter

Объект класса Recordset содержит полезное свойство — Filter. Переменная

Filter принадлежит типу variant и выполняет роль, несколько схожую с назначе-

нием предложения WHERE конструкции SQL. Общий способ использования свойства

Filter заключается в присваивании ему символьной строки, которая содержит одну

или несколько записей-предикатов, оформленных в виде

 Оператор Значе-

ние. Предикаты соединяются логическими операторами и при необходимости заклю-
чаются в

 скобки. Если после строки 20 листинга 15.5 включить строку

 = SearchFieldName &

 & FindValue &

то в дальнейшем условное выражение

 больше не понадобится.

Итак, вы ознакомились с несколькими вариантами организации поиска записей в

наборе данных. Какой из них выбрать в том или ином случае — решать вам. Все они
помогут вам достичь цели; весь вопрос в том — насколько эффективно.

Сохранение данных в коллекциях

Коллекции применяются во многих ситуациях. Класс Recordset, например, со-

держит коллекцию Fields, а многие визуальные компоненты (например списки)

пользуются коллекциями для отображения данных на экране. Часто возникает необ-

ходимость в извлечении элемента коллекции, представляющей информацию в базе

данных, и копировании его в коллекцию визуального компонента.

Единого способа взаимного копирования элементов коллекций не существует;

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

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

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

В листинге 15.7 представлен текст примера.

Листинг 15.7. Пример копирования элементов одной коллекции в другую

24: Dim Target As New Collection
25:
26: Do While Not
27:

 &

28:

 &

 Loop

31:
32: Dim Artist As Variant
33: For Each Artist In Target
34:

 Artist

35: Next Artist
36: Set Target = Nothing
37:

268

Часть V. Программирование и базы данных Access


background image

Анализ

Приведенный код необходимо рассматривать в контексте примера лис-

1 тинга 15.5 (достаточно вставить его в листинг 15.5 после строки 24, в ко-

торой выполняется открытие набора записей RecordSet. Target

(см. строку

 Это произвольная коллекция. После ее определения вы-

полняется цикл, на каждом шаге которого считывается очередная запись
набора данных RecordSet и значение объекта Field, связанного с полем
ARTIST, заносится в новый элемент коллекции Target. Для определения
факта достижения последней записи RecordSet используется метод EOF.
В строке 28 в коллекции сохраняется поле, а не его значение.

Строки 33-35 содержат цикл, позволяющий отобразить в окне Immediate содержи-

мое каждого элемента

 Target. Далее выполняется оставшаяся часть кода

листинга

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

изменить рассмотренный код. Самое существенное отличие примера от реальной
программы состоит в нецелесообразности открывать/создавать обе коллекции в пре-

делах одной и той же процедуры (функции) — коллекция Target, например, может

принадлежать визуальному компоненту, размещенному на одной из экранных форм
приложения.

Использование Addltem и

В Microsoft Access 2002 в элементы управления список и поле со списком было до-

бавлено два метода — Addltem и

V

 Метод Addltem получает два аргумента и добавляет элемент в коллек-

 цию, представляющую собой список или поле со списком. Метод Re-

moveltem получает в качестве аргумента индекс и удаляет из коллекции

элемент с этим индексом. Синтаксис вызова методов следующий:

 Индекс)

При работе с именем ComboNamesList в поле со списком необходимо сначала

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

вом кода, аналогичного приведенному в листинге 15.8. Если вы намерены добавлять
элементы в список вручную, а не из источника данных, в диалоговом окне Properties
установите свойство Row Source Type на Value List. Свойство RowSourceType можно
изменить также в коде программы (см. приведенный ниже листинг).

Листинг 15.8. Использование метода Addltem для добавления элементов списка

1: Private Sub
2: Dim Data As Variant

 Data =

 Иванов", "Федор Федоров",

4: "Наталья Петрова", "Сидор Ильин")
5:

 = "Value List"

6: Dim I As Integer
7: For I -

 To

8: Call

 , I)

9: Next I

 Sub

15-й час. ADODB - ваш верный помощник

269