Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.10.2020
Просмотров: 7886
Скачиваний: 25

другими пользователями, будут динамически отслеживаться. Четвертый аргумент,
определяет тип блокировки записей таблицы. "Оптимистический" уровень
блокировки означает, что запись блокируется вами (другим
будет отказано в
доступе, предполагающем возможность внесения изменений), причем только в тот мо-
мент, когда вызывается метод Update. Иными словами, гарантируется, что в промежутке
между началом внесения изменений и их сохранением содержимое записи не может быть
изменено другими пользователями базы данных.
Разновидности наборов данных
Первый аргумент, Источник, передаваемый процедуре Open, определяет вид набо-
ра данных. В качестве источника могут использоваться объект класса Command, лите-
рал, представляющий строку выражения на языке SQL, таблица, запрос, хранимая
процедура или наименование сохраненного набора данных.
Объекты Command
Command — это объект в составе класса ADO, способный содержать код, возвра-
щающий набор строк данных или выполняющий их модификацию. Объект класса
Command — один из возможных источников данных, указываемых на месте первого
параметра метода Open объекта Recordset.
Хранимые процедуры
В качестве первого аргумента метода Open может задаваться имя такого объекта
хранимой процедуры, который содержит код на языке SQL. Подробнее об использо-
вании хранимых процедур Access и соответствующих им объектов VBA см. главу
час. Применение языка SQL".
Литеральные выражения SQL
Методу Open может передаваться также символьная строка, в которой находится
выражение, написанное на языке SQL. В этом случае вы, автор, получаете самые ши-
рокие и гибкие возможности в определении конкретных задач, которые должна вы-
полнить процедура Open. О конструкциях языка SQL и способах их практического
использования речь пойдет в главе 16.
Наиболее полная информация о программировании на SQL изложена в таких
книгах, как, например,
Sams Teach Yourself Microsoft Access in 21 Days
и
Sams Teach
Microsoft Access 2002 in 24 Hours.
Рекомендуем также посетить виртуальный
книжный магазин издательства
Sams,
который находится по адресу
com — вам наверняка удастся найти книги, более подробно освещающие вопросы
программирования на языке SQL.
Строки
листинга 15.3 можно переписать с использованием литерального вы-
ражения SQL в качестве источника данных следующим образом:
Call
"SELECT * FROM MUSIC", Connection,
AdLockOptimistic )
Обратите внимание, что теперь таблица MUSIC представлена запросом на языке
SQL. Более предпочтительным будет выглядеть вариант предварительного объявления
именованной константы, содержащей строку выражения SQL; тогда в качестве аргу-
мента процедуре Open достаточно передать название этой константы.
Таблицы и запросы
Наиболее употребительная разновидность источников данных, указываемых при
вызове метода Open, — это таблицы и запросы. Запрос, написанный на языке SQL,
может ссылаться на данные, физически разнесенные по нескольким таблицам.
260 Часть V. Программирование и базы данных Access

В двух рассмотренных выше листингах (15.2 и 15.3), а также в коротком примере с ли-
теральным выражением SQL речь шла об открытии одного и того же набора данных
(таблицы MUSIC) несколькими способами. Существует еще один — создать и использовать
обычный именованный запрос Access. Чтобы воспользоваться запросом Access в качестве
источника данных при обращении к процедуре Open, выполните следующие действия.
1. Создайте базу данных и постройте в ней таблицу
MUSIC,
приняв во внимание сле-
дующий перечень полей:
ID
ARTIST Text
TITLE Text
FORMAT
PUBLISHER
2. В окне базы данных Access выберите элемент Запросы (Queries) списка Объекты
(Objects).
3. Щелкните на кнопке Создать (New).
4. В диалоговом окне Создание запроса (New
выберите Конструктор (Design
View) и щелкните на кнопке ОК.
5. На вкладке Таблицы (Tables) диалогового окна Добавление таблицы (Show Table)
дважды щелкните на MUSIC (рис. 15.4), а затем на кнопке Закрыть (Close).
л
Т*
. '
Рис.
Дважды щелкните на имени нужной таб-
лицы, чтобы добавить ее в окно определения запроса
6.
В окне Запрос на выборку (Select Query) перейдите к списку полей таблицы MUSIC
и дважды щелкните на элементе с символом звездочки (*) (рис. 15.5).
• •
—
.
- :' . . .
•
. ;'.
!
•
"• ." "-
"
.
." .
или;
С D
D
•
Рис.
Выбор элемента, отмеченного звездочкой, означает,
что в набор данных будут включены все столбцы таблицы
15-й час. ADODB - ваш верный помощник
261

Запустите процедуру
на выполнение. Вы увидите, что она работает
точно так же, как и прежде. Поведение системы не зависит от сложности передавае-
мого выражения SQL. Иногда имеет смысл создать именованный SQL-запрос в среде
Access, как мы сделали только что, чтобы получить возможность его редактирования,
при этом не изменяя код VBA. В других ситуациях максимальная гибкость достигает-
ся при объявлении именованной символьной константы, содержащей выражение на
языке SQL, непосредственно в теле процедуры или функции. Все способы приведут
вас к цели — выбирайте самый удобный и эффективный.
Добавление и изменение данных
Наиболее популярные операции обработки наборов данных связаны с добавлением
новых строк и редактированием существующих. С технической точки зрения они
схожи. Прежде всего, необходимо открыть объект Connection. Затем следует создать
объект Recordset и открыть его в режиме записи, т.е. передать процедуре
Recordset
в качестве аргумента ТипКурсора одно из предопределенных значе-
ний — adOpenKeySet либо adOpenDynamic.
Чтобы добавить запись в открытый набор данных, достаточно обратиться к методу
где ИмяОбъекта — название корректно созданного и открытого
объекта класса
Далее следует присвоить полям новой записи соот-
ветствующие значения и вызвать метод
позволяющий сохранить
запись в базе данных.
Задача редактирования существующих данных так же проста. Вместо вызова мето-
да AddNew напишите код, отыскивающий запись, которую необходимо изменить. По-
иск записи может быть выполнен посредством циклической конструкции формата Do
. . . Loop, в условии которой проверяется признак достижения конца набора данных
(с помощью метода EOF). Можно также привлечь выражение SQL, возвращающее не-
обходимую запись. Любой способ приемлем — правда, второй, с применением SQL,
вероятно, более эффективен.
Листинг 15.4 демонстрирует пример добавления новой записи в таблицу MUSIC.
(Если таблица вами еще не создана, выполните
инструкции, приведенной в пре-
дыдущем разделе, "Таблицы и
Листинг 15.4. Пример добавления новой записи в набор данных
1:
2 :
3:
4 :
5:
6:
8:
9 :
10
11
14:
15:
16:
17:
18:
Sub
)
Const Provider =
. 0;
Const DataSource = "Data
Const ConnectString = Provider & DataSource
Dim RecordSet As New
Dim Connection As New
On Error GoTo Finally
: Call
: Call
"MUSIC", Connection, adOpenKeyset,
AdLockOptimistic )
= "Natalie
RecordSet(
= "Merchant"
"TITLE"
=
262
Часть V. Программирование и базы данных Access

19:
"FORMAT"
= "CD"
20: RecordSet( "PUBLISHER"
=
21:
23:
24:
25:
27: If
<>
0) Then
28: MsgBox
29:
30: End If
31: Set RecordSet = Nothing
Set Connection = Nothing
End Sub
Принципиальные различия листингов 15.3 и 15.4 состоят в том, что
I следний содержит строки
В строке 14 выполняется инструкция
добавления в таблицу новой записи. В строках
изменяются значе-
ния полей новой записи — с этой целью мы используем формат обраще-
ния к свойству Fields объекта RecordSet, допускаемый по умолчанию.
Метод Update, который вызывается в строке 22, сохраняет внесенные
изменения в базе данных.
Если вы не указываете свойство, но ваш код неявно предполагает
обращение к нему, компилятор трактует это как ссылку на свойство,
предлагаемое по умолчанию. Строки
листинга 15.4 демонстрируют
именно этот прием: выражения
и Re-
Fields
равноценны.
Чтобы отредактировать текст существующей записи таблицы, достаточно заменить
строку 14, содержащую обращение к методу AddNew, конструкцией поиска требуемой
записи. Весь оставшийся код (строки
в изменениях не нуждается.
Наименования полей строки и присваиваемые им значения могут быть переданы
методу AddNew в качестве параметров. Аргументом может быть как имя одного поля,
так и массив полей (первый аргумент), и массив значений, как в следующем фраг-
менте кода.
Dim Fields As Variant
Dim Values As Variant
Fields =
"TITLE",
"FORMAT", "PUBLISHER")
Values =
"Hill", "Breathe", "CD", "Warner
Call
Values)
В этом фрагменте кода объявлены и инициализированы два массива, которые пе-
редаются в метод AddNew. Однако при тестировании легче найти ошибку, если значе-
ния полей присваиваются в коде по очереди.
полей
Объект класса Recordset содержит свойство-коллекцию Fields. В одной из пре-
дыдущих глав отмечалось, что
свойство —
это элемент
принадлежащий клас-
су. Свойством может быть и порция данных простого типа, и объект какого-либо
класса. Свойство Fields представляет собой объект класса Collection.
15-й час. ADODB - ваш верный помощник 263

Коллекция Fields — это свойство объекта Recordset, предлагаемое по умолчанию.
Вот почему выражения
и
равноправны. Кроме того, вам следует знать о существовании класса Field, объекты
которого входят в состав коллекции Fields.
Основными тремя свойствами объекта Field являются OriginalValue, Value и
Name. Свойство Value — это переменная типа Variant; ее используют для доступа к
значению, хранящемуся в поле. Свойство OriginalValue (типа Variant) позволяет
получить или восстановить исходное значение поля. Переменная Name дает возмож-
ность сослаться на поле по имени столбца таблицы.
Фрагмент кода, подобный приведенному в строке 17 листинга 15.4 -
RecordSet
— означает ссылку на объект типа Field. Далее, разумеется,
вы можете воспользоваться всеми атрибутами этого объекта. Так, например, часть 17-й
строки —
— представляет собой обращение к свойству Value указанного объ-
екта Field. Строки
могут быть переписаны в более строгой форме:
16:
= "Natalie
17:
(
= "Merchant"
18:
( "TITLE"
=
19:
( "FORMAT"
= "CD"
20:
( "PUBLISHER"
=
Это наглядный пример обращения к вложенным объектам через интерфейс объек-
тов более высокого уровня. Согласитесь, код достаточно прост и нагляден.
строк из набора
Существует два способа удаления строк из набора данных. Один из них
основан на использовании команды DELETE языка SQL. Другой, более
прямолинейный и грубый, предполагает написание VBA-кода, который
обеспечивает переход к каждой удаляемой строке набора данных, а также
вызывает метод Delete объекта класса Recordset.
Синтаксис обращения к методу Delete объекта
таков:
Call
(
)
При отсутствии необязательного параметра ГруппаЗаписей будет удалена только
текущая запись набора данных. Самые распространенные допустимые значения пара-
метра ГруппаЗаписей перечислены в табл. 15.2.
Таблица 15.2. Допустимые значения аргумента метода
о
О
Значение перечислимого типа
Описание
adAf
Действие по умолчанию — удаляется текущая запись
Удаляется группа записей, определенная свойством Filter
Удаляются все записи (операция равносильна команде
DELETE FROM
языка SQL)
Удаляются все записи раздела
Метод Delete объекта Recordset почти настолько же дееспособен, как и команда
DELETE языка SQL. Варианту вызова Call ИмяОбъекта. Delete ( adAffectAll ) со-
ответствует команда DELETE FROM ИмяТаблицы. Конечно, конструкция DELETE языка
SQL более гибкая — она позволяет, например, использовать условное предложение
WHERE для выполнения фильтрации записей по любым критериям либо вложенную
команду SELECT. Подробнее о применении SQL см. главу 16.
264
Часть V. Программирование и базы данных Access