Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AccessVBA

.pdf
Скачиваний:
18
Добавлен:
13.04.2015
Размер:
391.32 Кб
Скачать

В. М. Водовозов

Управление базами данных

Access на VBA

Санкт-Петербург

2003

УДК 681.3.016

В.М.Водовозов. Управление базами данных Access на VBA. 32 с.

Даны основные сведения об использовании Visual Basic for Applications для создания модулей Access. Для всех, кто владеет основами

Microsoft Access.

© В.М.Водовозов, 2003.

Оглавление

 

Модели объектов Access.................................................................................

3

Процедурное и структурное программирование в DAO .............................

5

Процедурное и структурное программирование в ADO ...........................

13

Визуальное программирование в Access.....................................................

21

Меню...............................................................................................................

31

Панели инструментов....................................................................................

32

Начальная установка интерфейса ................................................................

34

Модели объектов Access

Access представлен двумя уровнями компонентов: ядром базы данных Jet и системой управления базой данных Access. На уровне ядра находятся данные, то есть таблицы и запросы, а также файлы, хранящие компоненты системы управления. Для организации данных используется индекснопоследовательный метод (ISAM), в соответствии с которым каждая запись имеет переменную длину и хранится на странице объемом до двух килобайт. Выборка данных поддерживается механизмом запросов SQL и программным доступом на VBA. Система управления Access обслуживает интерфейс пользователя (формы, отчеты, макросы, меню, панели, окна диалога) и процедуры VBA.

Первый уровень поддерживаются двумя моделями объектов. Первая из них базируется на библиотеках классов DAO (Data Access Objects), вторая — на библиотеках ADO (ActiveX Data Objects — ADODB, ActiveX Data Objects Extensions for DDL and Sequrity — ADOX, Microsoft Jet and Replication Objects — JRQ). ADODB обеспечивает приложению доступ к источнику данных с возможностью отбора и изменения данных. ADOX позволяет программно изменять структуру объектов источника данных и систему защиты баз данных. JRQ служит для создания, модификации и синхронизации реплик баз данных Access.

Второй уровень строится на библиотеке Access.

Библиотека классов DAO ориентирована на работу с данными. Базовым классом DAO является DBEngine, описывающий семейства Errors (Ошибки) и Workspaces (Рабочие области). Каждая рабочая область Workspace

характеризуется классами Databases (Базы данных), Groups (Группы), Users (Пользователи). Наиболее часто используется семейство Recordset (Результирующие наборы записей) класса Database. Каждое множество

Recordset основывается на записях таблицы или на описании запроса и позволяет находить, добавлять, изменять или удалять записи. Структуры таблиц базы данных хранятся в семействе класса TableDefs, в частности, в объектах его классов Fields (Поля), Indexes (Индексы). В семействе класса

4

Relations (Связи) размещаются схемы данных таблиц. Структура запросов базы данных описывается семейством класса QueryDefs (Запросы) с

объектами классов Fields (Поля), Parameters (Параметры).

На работу с данными рассчитана и модель ADO. Во главе этой модели стоит объект Connection (Соединение). Он описывает среду, в которой выполняется обмен данными. Источник данных управляется производным от Connection объектом Command (Команда), который командами SQL добавляет, удаляет, обновляет и считывает данные. Его семейство Parameters (Параметры) представляет переменные компоненты объекта Command. Другой производный от Connection объект — Recordset — накапливает считанные из источника данные. Его семейство Fields представляет поля таблиц Recordset. Поля характеризуются семействами свойств Properties. Встроенные свойства являются частью объекта ADO и всегда доступны, а динамические свойства существуют только в момент работы источника данных.

Библиотеку классов Access возглавляет класс Application (Приложение), описывающий семейства Forms, Reports, Modules, References, DataAccessPages, Controls и такие объекты как Screen, DoCmd, Module, Assistant, CommandBar…

В литературе часто используются сокращения:

Признак

Тип

Объект

Признак

Тип

Объект

db

Database

База данных

rpt

Report

Отчет

tdf

TableDef

Таблица

ctl

Control

Элемент

qdf

QueryDef

Запрос

txt

TextBox

Поле формы

rst

Recordset

Набор записей

cbo

ComboBox

Поле со списком

fld

Field

Поле

cmd

Command

Кнопка

 

 

 

 

Button

 

idx

Index

Индекс

con

Connection

Связь

frm

Form

Форма

cmd

Command

Команда меню

Обращение к членам библиотек классов DAO и ADO и все обращения в запросах SQL выполняется по схеме:

имяКласса.имяОбъекта.Член

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

5

Процедурное и структурное программирование в DAO

В общем случае доступ к данным библиотек DAO организуется в три этапа. Сначала создается объект методом Create… его родителя. Затем устанавливаются его свойства, которые после сохранения объекта в базе данных останутся доступными только для чтения. В ряде случаев, кроме свойств, сразу же задаются и объекты-потомки, например, поля таблиц. В заключение объект добавляется в состав семейства методом Append этого семейства и сохраняется в памяти. Отдельные классы объектов создаются по упрощенной схеме.

Сеанс доступа к данным модели DAO описывает класс Workspace. Все действия в рамках сеанса определены правилами доступа пользователя, а их последовательность — транзакция — рассматривается как одно целое. В незащищенных базах данных открывается сеанс по умолчанию под именем Default Workspace для пользователя admin без пароля. При создании нового сеанса Workspace

DBEngine!CreateWorkspace _

(имяРабочейОбласти, Пользователь, Пароль [, Тип])

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

Метод CreateDatabase используют для создания новых баз данных:

[рабочаяОбласть].CreateDatabase (имяБазыДанных, _ Язык, [Параметры] )

Здесь ранее созданная рабочаяОбласть служит ссылкой на объект Workspace, имяБазыДанных длиной до 255 символов представляет короткий или полный путь к файлу .MDB, Язык задается значением констант dbLangGeneral, dbLangCirillic, определяя порядок сортировки данных, а необязательные Параметры задают формат ядра Jet и необходимость шифрования. Базы данных автоматически добавляются в соответствующие семейства и сохраняются.

Для открытия базы данных используется метод OpenDatabase:

[базаДанных.] [рабочаяОбласть.]OpenDatabase (имяБазыДанных _ [, Монопольность [, толькоЧтение[, Источник]]] )

Если база данных уже открыта, к ней удобно обращаться через функцию

CurrentDb:

CurrentDB!имяТаблицы!имяПоля.имяСвойства

6

CurrentDB!QueryDefs!имяЗапроса

CurrentDB!QueryDefs («имяЗапроса»)

CurrentDB!QueryDefs (индекс)

CurrentDB!QueryDefs (ссылка)

Результирующие множества записей — объекты классов TableDef и QueryDef — создаются методами CreateTableDef, CreateQueryDef:

[рабочаяОбласть.]базаДанных.CreateTableDef («имяТаблицы»)

[рабочаяОбласть.]базаДанных.CreateQueryDef ([запрос, SQL])

Если при вызове метода CreateQueryDef аргументы не заданы, можно присвоить новому объекту значения свойств Name и SQLtext позднее, посредством оператора присваивания.

Объекты классов TableDef и QueryDef открываются методом OpenRecordset и закрываются с удалением из семейства Databases методом

Close объекта Database:

базаДанных.OpenRecordset (Источник [,Тип, Параметры] )

объект.OpenRecordset (Источник [,Тип, Параметры] )

базаДанных.Close

объект.Close

Вотличие от режима работы через интерфейс пользователя, процедуры VBA дают возможность одновременно открывать несколько баз данных, хотя на экране отображается только одна из них. Свойство Name позволяет проверить, открылась ли база данных: полный путь к открытой базе возвращает выражение объект.Name.

Поля таблиц вначале создаются, затем добавляются в семейства, после

чего обновляется окно базы данных:

Set объектПоле = объектТаблица.CreateField (имяПоля, Тип, [Размер]) объектТаблица.Fields.Append объектПоле базаДанных.TableDefs.Append объектТаблица

RefreshDatabaseWindow

Доступ к полям реализуется через объекты класса Fields:

имяТаблицыИлиЗапроса.Fields!имяПоля

имяТаблицыИлиЗапроса. имяПоля

имяТаблицыИлиЗапроса!Fields!имяПоля

имяТаблицыИлиЗапроса! имяПоля

7

Parent!имяПоляГлавнойФормы

Ни TableDef, ни QueryDef не содержат данных. Для доступа к данным нужны наборы записей — объекты RecordSet. В модели DAO присутствуют четыре типа таких объектов. Тип Table представляет набор записей одной таблицы открытого файла базы данных. Он не обрабатывает связанные таблицы и таблицы ODBC и обслуживает только рабочие области Jet. Тип Dynaset представляет динамический набор записей таблицы открытой базы данных, связанной таблицы, результата выполнения запроса или оператора SQL SELECT. Он состоит из ссылок, поэтому обрабатывается медленнее, чем Table и иногда не обновляется, но охватывает более широкую область данных. Тип Snapshot представляет статическую копию таблицы, запроса или оператора SQL SELECT, удобную для выборки данных и создания отчетов. Forward-Only представляет аналогичную копию, предназначенную для единовременного просмотра данных. Синтаксис:

базаДанных.OpenRecordSet (Источник [,Тип, Параметры, Блокировка])

Здесь Источник — это строка с именем таблицы, запроса или текстом SQL, далее следует тип объекта RecordSet, по умолчанию Table для таблиц и Dynaset для запросов и связанных таблиц. Любой объект RecordSet существует только в рамках своей процедуры, а затем уничтожается. Его можно закрыть раньше методом Close.

Примеры

Sub РабочаяОбласть ()

Set область = DBEngine.Workspaces (0) Set новаяБазаДанных = _

область.CreateDatabase ("Школьники.mdb", dbLangGeneral) Set другаяБазаДанных = _

область.OpenDatabase ("Транспорт") MsgBox другаяБазаДанных.Name & Chr (13) & _

новаяБазаДанных.Name & Chr (13) & CurrentDb.Name

End Sub

Sub БазыДанных ()

Set текущаяБазаДанных = CurrentDb

Set новаяБазаДанных = CreateDatabase ("Студенты.mdb", dbLangCyrillic)

Set другаяБазаДанных = OpenDatabase ("Пользователи.mdb") MsgBox другаяБазаДанных.Name & Chr (13) & _

новаяБазаДанных.Name & Chr (13) & текущаяБазаДанных.Name

End Sub

Sub НаборыЗаписейDAO ()

Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники", dbOpenDynaset) Set tdf2 = CurrentDb.OpenRecordset ("Категории")

8

Set tdf3 = CurrentDb.OpenRecordset ("SELECT * FROM Поставщики") Set tdf4 = CurrentDb!Поставщики.OpenRecordset

Set tdf5 = CurrentDb.QueryDefs (“Продажи”).OpenRecordset tdf1.Close

End Sub

Sub УправлениеТаблицей ()

Set tdf = CurrentDb.OpenRecordset ("Отделы")

MsgBox "Таблица открыта" tdf.Close

MsgBox "Таблица закрыта"

End Sub

Sub СозданиеТаблицы ()

Set область = DBEngine.Workspaces (0)

Set база = область.OpenDatabase (“C:\Учащиеся.mdb”) Set таблица = база.CreateTableDef ("НоваяТаблица")

таблица.Fields.Append таблица.CreateField (“Кто”, dbText) таблица.Fields.Append таблица.CreateField (“Когда”, dbDate) база.TableDefs.Append таблица

база.TableDefs.Refresh Set таблица = Nothing

Set база = Nothing End Sub

Sub УдалениеТаблицы ()

CurrentDb.TableDefs.Delete “НоваяТаблица”

CurrentDb.TableDefs.Refresh

RefreshDatabaseWindow

End Sub

Sub ДоступКПолям ()

MsgBox CurrentDb!Таблица1.Fields (1).Name & Space (2) _ & CurrentDb!Таблица1.Fields (2).Name & Chr (13) & _ "Всего полей: " & CurrentDb!Сотрудники.Fields.Count

End Sub

Sub Запрос ()

переменная = CurrentDB.CreateQueryDef _

(“зСотр”, “SELECT * FROM Сотрудники ORDER BY Сотрудники.ФИО”)

RefreshDatabaseWindow End Sub

При создании объекта RecordSet строки данных помещаются в буфер и не выводятся на экран, а указатель позиционирует на текущей записи. При открытии набора записей активной становится первая запись. Для перемещения к другим записям используются методы MoveFirst, MoveNext, MovePrevious, MoveLast. Методом BookMark можно определять закладки и возвращаться впоследствии к запомненным в них записям:

объектЗакладка = объектНабор.BookMark

9

объектНабор.BookMark = объектЗакладка

Метод

Move числоСтрок [,Закладка]

смещает указатель на требуемое число записей вперед или назад. Свойства BOF и EOF объекта Recordset фиксируют выход за пределы набора записей.

Для поиска определенной записи в наборах типа Table используется метод Seek, а в наборах других типов — методы FindFirst, FindNext, FindPrevious, FindLast. Найденная запись становится текущей, а свойство NoMatch устанавливается в False. При отсутствии искомой записи NoMatch = True:

объект.Seek «оператор», списокКлючей

объект.Find… «критерий»

Здесь используются операторы >, <, >=, <=, =, а список ключей описывает поля текущего индекса. Критерий же предствляет логичекое выражение вида «Поле оператор Значение».

В модели DAO изменения в таблицы вносятся последовательно. Предварительно запись копируется в специальную область памяти — буфер копирования методом Edit, а затем методом Update возвращается в объект Recordset. При необходимости буфер копирования очищается методом

CancelUpdate:

объект.Move… или Find… или Seek

объект.Edit объект.имяПоля = Значение объект.Update объект.CancelUpdate

При необходимости Execute выполняет запрос на изменение и Update сохраняет изменения.

Новые записи тоже не добавляются прямо, а сначала помещаются в буфер копирования, а затем обновляют набор методом AddNew. В наборах типа Dynaset и Table без индекса новая запись добавляется в конец, а там, где определен индекс, она вставляется в соответствии с индексом. Для добавленной записи автоматически создается закладка в свойстве LastModified. Указатель текущей записи при этом автоматически не перемещается.

10

Удаляемая запись помещается в буфер удаления и остается текущей. Удаление выполняется без предупреждения и отмены.

Уникальный объект DoCmd реализует связь между макропрограммированием и программированием на VBA, дублируя операции интерфейса пользователя Access. Методы DoCmd не возвращают значений. В их аргументах активно используются константы Access, такие как acTable, acQuery, acForm, acReport, True, False. Имена объектов здесь не заключаются в прямоугольные скобки, а при необходимости помещаются в двойные кавычки. В частности, для выполнения запросов SQL вызывается метод RunSQL объекта DoCmd. В программах VBA допускается использование выражений SQL длиной до 32768 символов.

Другой метод — Clone — создает копии наборов записей. При копировании организуется независимый указатель текущей записи, а закладки копии совпадают с закладками оригинала. Но копия не наследует свойств Index, Filter, Sort.

Связь полей таблиц и запросов описывается методом Relation. Он используется для создания новых связей (CreateRelation), для их изменения и просмотра. При создании связи указываются соответствующие поля в первичной и внешней таблицах (запросах). В первой таблице эти поля образуют первичный ключ, однозначно определяющий запись, а во второй таблице — внешний ключ. Каждое поле первичного ключа следует добавить в семейство Fields связи с указанием внешнего ключа в свойстве

ForeignName:

Set объектСвязи = базаДанных.CreateRelation ([«Имя», Таблица, внешняяТаблица, Атрибуты])

объектСвязи.Table = «Таблица» объектСвязи.ForeignTable = «внешняяТаблица» Set объектПоле = объектСвязи.CreateField(«Поле»)

объектПоле.ForeignName = «Поле» объектСвязи.Fields Append объектПоле базаДанных.Relations Append объектСвязи

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

Примеры

Sub ПоискDAO ()

Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники") tdf .Index = "PrimaryKey"

tdf .Seek "=", "Иванов"

Set tdf2 = CurrentDb.OpenRecordset ("Командировки", dbOpenSnapshot)