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

3. В диалоговом окне Файл новой базы данных
New Database) в раскрывающемся
списке Тип файла (Save As Type) выберите элемент Все файлы
Если оставить
тип Базы данных Microsoft Access (Microsoft Access Database) (*.mdb), при сохране-
нии файла
данных с расширением
Access автоматически добавит еще и
Таким образом,
получите
4. В поле Имя файла (File Name) введите строку
и щелкните на кнопке
Создать (Create).
Воспринимайте созданную базу
как обычную базу данных
Access.
Из материала предыдущих глав вы уже знаете, что объект класса Err содержит пе-
ременные для хранения номера ошибки, названия источника ее происхождения, опи-
сания, имени соответствующего файла оперативной справки и идентификатора темы
в файле справки. Вся эта информация должна найти отражение в таблице, которую
нам предстоит построить. Помимо указанных данных, таблица будет содержать сведе-
ния о пользователе приложения и дате/времени возникновения ошибки. Обладая та-
ким набором сведений, вы сможете без особого труда восстановить ход всех событий,
которые привели к ошибке, даже в том случае, если программа потерпела полный
крах. Предвидя дальнейший ход событий, отметим необходимость в SQL-процедуре
динамического создания журнальной таблицы — в этом случае вам будет легко по-
строить ее в любой базе данных, приложения которой нуждаются в отладке с под-
держкой протокола ошибок. Текст процедуры создания журнальной таблицы приве-
ден в листинге
Листинг
Процедура создания журнальной таблицы
1: CREATE TABLE LOG
2: (ID
PRIMARY KEY,
3: ERROR_ID NUMBER,
SOURCE
5: DESCRIPTION TEXT
6: HELPFILE TEXT(255),
7 : HELPCONTEXT NUMBER,
WHEN DATETIME,
USER TEXT (25)
10:
Листинг
содержит текст команды CREATE TABLE на языке SQL, ко-
1 торая позволяет создать таблицу с именем LOG в произвольной базе дан-
ных. Сохраните
в виде запроса под именем
Те-
перь вы всегда сможете, обратившись к запросу, быстро создать в теку-
щей базе таблицу LOG, исключив необходимость выполнения "ручных"
операций. -
Динамическое создание журнальной таблицы
В каждой базе данных, которая будет взаимодействовать с создаваемой надстрой-
кой, должна содержаться копия таблицы LOG. Чтобы избежать возникновения ошибки
при попытке повторного создания таблицы, следует написать код, проверяющий факт
наличия таблицы в базе данных. Если таблицы нет, ее необходимо построить. Лис-
тинг 23.2 демонстрирует текст
динамического создания таблицы LOG.
23-й час. Надстройки Access
415

Листинг 23.2. Процедура динамического создания таблицы LOG
1:
2 :
3:
4:
5:
б :
7 :
8:
9 :
10
11
12
13
14
Option Compare Database
Option Explicit
Private Function
() As String
=
"CREATE TABLE LOG
&
PRIMARY KEY, ERROR_ID
&
SOURCE
DESCRIPTION
&
HELPCONTEXT NUMBER,
&
"WHEN DATETIME, USER
Function
Sub
QueryText As String)
: Call
Sub
I Листинг 23.2 содержит только часть будущего решения, поэтому мы соз-
I дадим в базе данных
новый модуль и сохраним
под именем
LogUtilities. Код SQL, представленный ранее в листинге 23.1, теперь
перенесен в строки
листинга 23.2. Процедура CreateTable, текст
которой размещен в строках
предназначена для создания таблицы
LOG в текущей базе данных и использует с этой целью метод RunSQL
класса DoCmd из состава библиотеки
При реализации общего решения (в этом вы убедитесь позднее) мы исходим из
того, что таблица LOG в базе данных существует. Если ее нет, генерируется исключи-
тельная ситуация. Процедура обработки
создает таблицу и возвращает управ-
ление
вызвавшей исключение, для повторного выполнения. В
раз-
деле приведен фрагмент кода, в котором обеспечивается вызов процедуры Cre-
ateTable и реализуется механизм добавления в таблицу LOG записи, содержащей ин-
формацию об ошибке.
Ведение протокола ошибок
Мы будем полагать, что таблица LOG в базе данных уже создана. Код, приведен-
ный ниже, выполняет операцию добавления в журнальную таблицу записи с данными
об ошибке (листинг 23.3). Мы определили три процедуры: две из них снабжены
лификаторами Public
и
а третья -• Private
Листинг 23.3. Процедуры добавления записей в таблицу LOG
Public Sub
ByVal Error As ErrObject,
Optional
As String = "Admin" )
With Err
Call
.HelpFile,
UserName)
End With
End Sub
Function
As
String) As Boolean
416
Часть VIII.
программирование в Access

11:
Dim Table As Variant
14: For Each Table In CurrentData.AllTables
TableExists =
= TableName
16: If (TableExists) Then Exit For
Next Table
18:
Function
20:
Sub
Number As Long,
As String,
22: ByVal Description As String,
HelpFile As
ByVal HelpContext As Long, Optional
As String )
24:
25: On Error GoTo EXCEPT
26: Call
Source, Description,
27: HelpFile, HelpContext, UserName)
28:
29: Exit Sub
31: If
Then
Call
Resume
34: Else
35: Call
36:
37: End If
Sub
39:
40
Sub DoWriteEntry (ByVal Number As Long,
41: ByVal Source As String, ByVal Description As String,
ByVal HelpFile As String, ByVal HelpContext As Long,
Optional UserName As String)
44:
45: Dim SQL As String
46: SQL = "SELECT * FROM LOG"
Dim Recordset As New
48:Call
adOpenDynamic,
50:
) = Number
51:
"SOURCE" ) = Source
52 : Recordset ( "DESCRIPTION". ) = Description
"HELPFILE" ) = HelpFile
54:
"HELPCONTEXT" ) = HelpContext
55:
"WHEN" ) = Now
56:
"USER" ) = UserName
58:
59: Set Recordset = Nothing
60:
End Sub
I Код листинга 23.3, рассматриваемый совместно с текстом листинга 23.2,
I составляет содержимое модуля LogUtilities. Процедуре WriteError-
Entry, расположенной в строках
в качестве параметра передается
23-й час. Надстройки Access 417

объект Err, а она, в свою очередь, обращается к процедуре
Операция добавления записи выполняется приватной процедурой DoW-
riteEntry, вызываемой в строке 14. Оставшаяся часть кода процедуры
WriteEntry связана с обработкой возможных ошибок. Если ошибка
произошла по причине отсутствия в базе данных таблицы LOG, вызывает-
ся процедура CreateTable, рассмотренная в листинге 23.2, и управление
вновь передается строке, породившей ошибку (строки 32-33). Если при-
чина ошибки заключается в другом, вызывается стандартный метод
объекта Err. В строках
выполняется поиск таблицы LOG в
коллекции AllTables.
Самая важная часть работы возложена на процедуру
— об этом го-
ворит префикс Do ее названия. Строки обработки ошибок отделены от кода, выпол-
няющего собственно операцию пополнения таблицы, с целью упростить обе процеду-
ры. Код подпрограммы DoWriteEntry достаточно прозрачен и не нуждается в под-
робных
создается объект класса
с его помощью в
таблицу добавляется новая запись, ее полям присваиваются значения, переданные
процедуре в виде аргументов, а затем внесенные изменения сохраняются в базе дан-
ных командой Update.
Чтобы протестировать рассмотренный выше код, создайте новый модуль и помес-
тите в него процедуру, приведенную в листинге 23.4, или ей подобную. (Я обычно
стараюсь сохранять тестовый код в отдельных модулях, не смешивая его с кодом, не-
посредственно решающим задачу, — то же рекомендую делать и вам.)
Листинг 23.4. Тестовая процедура для проверки кода модуля LogUtilities
Sub Test ( )
On Error GoTo Except
3: Call
"LogUtilities", "Test", "No Help", 0)
Exit Sub
Call
7 : End Sub
I Тестовый код действует следующим образом: в строке 3 с помощью при-
I нудительного вызова
имитируется возникновение ошибки и
провоцируется выполнение кода обработчика исключений, который, об-
ращаясь к процедуре WriteErrorEntry, сохраняет информацию об
ошибке в таблице LOG базы данных. Теперь, снабдив любую из реальных
программ конструкциями обработки ошибок, содержащими обращения к
процедурам WriteErrorEntry или WriteEntry, вы получите надежный
код и удобное средство анализа ошибок. В случае возникновения любого
сбоя вы без труда восстановите картину происшедшего, просмотрев со-
держимое соответствующей записи таблицы LOG. В следующем разделе
мы обсудим способы оперативного включения/отключения функций ве-
дения протокола ошибок и просмотра содержимого журнальной таблицы.
Интерфейс просмотра ошибок
Диспетчер настроек, вызываемый из меню
ис-
пользуют для добавления внешних ссылок на базы данных, которые необходимо инкор-
порировать в текущий проект. Добавив с помощью диспетчера надстроек (вы ознакоми-
418
Часть VIII. Объектно-ориентированное программирование в Access

тесь с ним чуть позже) код
в базу данных, вы получите доступ к средствам, ко-
торые предлагает эта надстройка. Включение механизма ведения протокола обеспечива-
ется вызовом любой из процедур,
либо
Ниже приведен
код, дающий возможность просмотра содержимого журнала ошибок.
После установки надстройки в среде Access в меню
Надстройки добавляет-
ся новый элемент. Щелчок на нем приводит к срабатыванию определенной процеду-
ры или функции в модуле надстройки — в данном случае в этой роли выступает
функция, открывающая таблицу LOG для просмотра. (Вы можете развить мою мысль и
придумать что-то еще.) Код функции просмотра содержимого журнальной таблицы
приведен в листинге
Листинг 23.5. Функция просмотра содержимого таблицы LOG, выполняемая при выборе
соответствующего элемента меню
1: Function EntryPoint ( )
Call
3 : End Function
acReadOnly)
Как видите, код листинга 23.5 нельзя назвать особенно сложным. В
строке 2 используется обращение к методу
для откры-
тия указанной таблицы в режиме просмотра. Если ошибок в тестируемой
программе не было, значит, таблица LOG в базе данных еще не создана и
при выполнении строки 2 откроется окно с сообщением об
ошибке — это вполне нормально. Функцию Entry-
Point также следует включить в состав модуля
Тестирование кода надстройки
Подобно любому программному коду, процедуры и функции из состава надстрой-
ки должны быть подвергнуты всестороннему тестированию. Поскольку мы имеем в
виду надстройку в виде базы данных Access, никаких принципиальных инноваций вы
не встретите. Как и ранее, откройте модуль в окне редактора VBA, поместите тексто-
вый курсор в пределах процедуры, которую хотите выполнить, и нажмите клавишу
<F5> или <F8>. Гораздо легче протестировать процедуры надстройки заблаговремен-
но, перед инсталляцией ее в среде Access.
Еще один способ тестирования внешнего кода связан с построением ссылки из
одной, рабочей, базы данных на другую. Чтобы добавить ссылку на базу данных
(или произвольную базу), выполните следующие действия.
1. Откройте новую или существующую базу данных, в которой необходимо создать
ссылку.
2. Выберите в строке меню окна Access команду
Visual
Basic
Editor).
3. В строке меню окна редактора Microsoft Visual Basic выберите команду
4. В диалоговом окне References щелкните на кнопке Browse.
5. Откроется диалоговое окно Add Reference. В раскрывающемся списке Тип файлов
(Files of Туре) выберите опцию Надстройки
6. С помощью средств навигации окна отыщите файл
и щелкните на кнопке
Открыть (Open), а затем на кнопке
в диалоговом окне References.
час. Надстройки Access
419