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

Зачастую автор и пользователь программы — одно и то же лицо.
Программист выступает в одной из ролей, и чтобы диалог персонажей
оказался продуктивным, сценарий пьесы (код программы) должен быть
безупречным.
Листинг 8.4 содержит пример кода, предполагающего выполнение определенного
требования. Автор программы специально отметил его строкой комментария, а поль-
зователь должен ему подчиниться.
Листинг 8.4. Пример кода с дополнительным условием
1: Function
FileName As String ) As Double
' Условие: файл FileName должен существовать
3:
D i r ( FileName ) ) > 0
4: Open FileName for Input As #OpenFile
5: End Function
Как мы говорили, условие должно снабжаться комментарием, и в приме-
ре таков имеется (см. строку 2). Впрочем, одной констатации мало -
программа должна позаботиться о проверке выполнения требования (в
нашем примере данная роль возложена на команду
Len(
FileName ) ) > 0 в строке 3). Если функция Dir определит, что
файла не существует, т.е. возвратит строку нулевой длины, выполнение
программы завершится в строке 3.
Подобный стиль работы поможет упростить код и разумно распределить ответст-
венность между автором и пользователем программы.
Заповедь 6: „Не ленись комментировать
код твой"
Написаны миллионы строк кода, начисто лишенного комментариев. Часто можно
слышать отговорки, наподобие такой: "Это трудно описать, и поэтому будет трудно
читать". Конечно, такой тезис просто несерьезен. Да, лучшие образцы программного
текста не нуждаются в дополнительных комментариях — настолько умело они напи-
саны. Это идеальный вариант, к которому следует стремиться. Но в большинстве слу-
чаев несколько дополнительных предложений, рассказывающих на нормальном чело-
веческом языке о том, для чего предназначена функция, как достигается результат,
какие условия должны быть выдержаны и т.п., сослужат хорошую службу. Позже вам
или вашим преемникам уже не придется ломать голову, распутывая хитросплетения
строк кода и вникая в суть вашего смелого творческого замысла.
А теперь все хором!
Если группа строк кода повторяется несколько раз или в тексте программы легко
выделить завершенные блоки — уместно обратиться к процедурам или функциям.
Чтобы научиться писать хорошие функции, надежные и допускающие возможность
повторного использования, вам понадобится определенная (надо сказать, немалая)
практика. Вначале решите задачу, а затем уделите некоторое время "шлифовке" про-
граммы, если вы в состоянии это сделать. В настоящем разделе приводится несколько
примеров, иллюстрирующих способы создания функций для решения ряда часто
встречающихся задач.
150
Часть III.
ресурсов Access

Конкретные задачи были выбраны, можно сказать, почти случайно, они носят дос-
таточно общий характер и удобны с методической точки зрения. Предлагаем вам
примеры удачных решений, которые допускают повторное применение в ваших бу-
дущих реальных проектах.
Создание таблицы
Первый уровень абстракции в общей модели управления информацией — база
данных, а второй, весьма важный, — таблица. База данных состоит из одной или бо-
лее таблиц. В некоторых ситуациях возникает задача динамического создания и уда-
ления таблицы средствами прикладной программы в течение одного сеанса ее работы.
В Access 2002, наряду с
поддерживается и язык структурированных запросов
к базе данных (Structured Query Language —
SQL)
(подробнее см. главу "16-й час.
Применение языка SQL"). На данном этапе вам достаточно знать, что для создания
таблицы он вполне пригоден. (Конечно, при необходимости построения таблицы во-
все не обязательно обращаться именно к средствам языка SQL.) Подобный код удоб-
но оформить в виде процедуры и передавать ей в качестве аргумента наименование
таблицы, которую требуется создать. Просмотрите текст листинга 8.5.
Листинг 8.5. Пример процедуры построения таблицы в базе данных
1:
2 :
3:
4 :
5:
6 :
Sub
As String)
Dim SQL As String
Используется команда
SQL
SQL = "CREATE TABLE & TableName &
Call
SQL )
End Sub
Ну как — неплохо, не правда ли? Хотя до универсальности здесь далеко-
вато (любая создаваемая таблица будет содержать одно и то же единст-
венное поле, TotalSales типа Double), некоторая гибкость все-таки
обеспечивается: динамически строится таблица с именем, которое зада-
ется в качестве аргумента процедуры. Если вы будете придерживаться
подобного подхода, то сократите объем кода программы, самое меньшее,
на треть. Пример дает пищу для размышлений и простор для дальней-
шего творчества.
Впрочем, простота простоте рознь. Решения должны быть конструк-
тивными и целесообразными. Листинг 8.5 демонстрирует пример того
уровня сложности, который допустим в функциях и процедурах.
Воспринимайте отдельные выражения кода как атомы, а функции -
как молекулы. Все мыслимые сущности физического мира состоят из
иерархии атомов и молекул. Ваша программа сможет достичь степени
сложности физического мира, если вы, ее создатель, будете после-
довательно и продуманно строить ее из маленьких "кирпичиков" •
отдельных выражений, процедур и функций.
Импорт текста из файла
В составе класса Application имеется вложенный класс
Объект типа Ap-
plication позволяет ссылаться на приложение Access как таковое. Он содержит ин-
струменты управления Access. DoCmd (его следует воспринимать как интерфейс
час. Декомпозиция задач
151

к средствам Access) — весьма серьезный объект, насчитывающий множество свойств и
методов, среди которых имеются функции импорта содержимого текстовых файлов.
Новый термин
Свойство —
это переменная или объект определенного класса, находя-
щийся в составе класса более высокого уровня иерархии.
Процедура импорта содержимого текстовых файлов носит название
ferText. Ниже приведен синтаксис ее вызова.
Call
[,
,
[,
[,
[, КодоваяСтраница] )
Поскольку метод TransferText принадлежит классу
этот факт необходимо
явно оговаривать, используя при вызове процедуры префикс DoCmd с последующим
символом точки. В качестве необязательного аргумента ТипПреобразования допус-
тимо указывать одно из предопределенных значений (по умолчанию система устанав-
ливает признак
—
импорт текста с разделителями).
Аргумент
также необязателен. Параметры ТипПреобразования и
ции находят применение в случае импорта текста более сложной структуры. Аргумен-
ты ИмяТаблицы (наименование
информации) и ИмяФайла
(название файла-источника) обязательны. Остальные параметры — ФлагЗаголовков,
и КодоваяСтраница — разрешается не задавать. (Исчерпывающие
сведения о назначении, способах и примерах использования всех аргументов проце-
дуры DoCmd.TransferText вы найдете в файлах оперативной справочной системы
Visual Basic.)
Поведение многих процедур и функций стандартных классов Access
VBA существенно зависит от значений передаваемых им параметров и
их количества. Зачастую имеет смысл заключать вызов стандартного
метода VBA в тело пользовательской функции, чтобы упростить и про-
яснить интерфейс.
Рассматривая частную задачу импорта текста с разделителями, удобно определить
новую функцию с меньшим числом аргументов и дополнительными средствами кон-
троля. Рассмотрим пример простого текстового файла, содержащего разделенные за-
пятыми имена, фамилии и почтовые адреса группы людей (листинг 8.6).
Листинг 8.6. Пример текстового файла с разделителями
Имя, Фамилия, Адрес Email
Paul,
Robert,
Robert, Golieb,
Анализ
Набор строк, приведенный в листинге 8.6, — это, по существу, уже гото-
вая таблица. Если ее содержимое необходимо импортировать в таблицу
базы данных, процедура
придется весьма кстати.
Листинг 8.7 отображает код пользовательской процедуры, упрощающей
задачу импорта простого текста с разделителями.
152
Часть III. Использование ресурсов Access

Листинг 8.7. Пример процедуры импорта текста с разделителями
1: Sub
FileName As
TableName As String )
Const
= True
If (FileExists( FileName
Then
Call
, TableName,
FileName, HASFIELDNAMES)
5: Else
"Файл
& FileName &
не
7: End If
End Sub
9:
FileExists (ByVal FileName As String) As Boolean
11: FileExists =
> 0
Function
Анализ
Определение дополнительной процедуры,
вызов
позволяет расширить возможности кода (скажем,
в нашем примере добавлены строки, анализирующие наличие файла с
заданным именем) и скрыть те аспекты интерфейса TransferText, ко-
торые в данном случае просто не нужны.
Поиск записи
В своей личной профессиональной практике я часто сталкивался с
ко-
да, буквально перенасыщенного предложениями на языке SQL. Подобные програм-
мы, к сожалению, очень трудно воспринимать и тем более исправлять. Как и в пре-
дыдущем примере, мы постараемся скрыть особенности интерфейса SQL внутри тела
разработанной нами функции.
Листинг 8.8 содержит код функции, в которой предложение на языке SQL исполь-
зуется для поиска записи в таблице CONTACTS (считайте, что с помощью процедуры
листинга 8.7 мы уже ее заполнили) по заданному значению фамилии корреспондента.
Листинг 8.8. Пример функции поиска записи в таблице
1: Function
ByVal
As String
Dim RecordSet As New
3: Dim SQL As String
4: SQL = "SELECT
+ ' '
As" &
5:
From CONTACTS WHERE [LastName] = '
LastName &
7: Call
(SQL,
8: If
And
= False) Then
9: FindContact =
"Contact Name" )
10 Else
11 FindContact = "Запись не
12 End If
13
14 Set RecordSet = Nothing
15 End Function
As String
8-й час. Декомпозиция задач
153

Одно из важнейших свойств процедур и функций состоит в том, что
они представляют собой фрагменты кода, которые можно отлаживать и
исправлять независимо от других частей программы. Функция, пред-
ставленная в листинге 8.8, основана на использовании средств класса
Если вам необходимо перейти к ADO, оптимизировать встроен-
ные предложения SQL или отказаться от них вовсе, достаточно отредак-
тировать только код тела функции — все остальные части программы
остаются нетронутыми.
I Чтобы воспользоваться кодом листинга
понадобится единственная
| строка программы, содержащая вызов функции
с указани-
ем фамилии корреспондента, сведения о котором необходимо найти.
Использование реестра Windows
Реестр Windows содержит иерархию ключей и значений, которые хранятся в от-
дельном файле. Реестр, в определенном смысле, — это база данных для хранения ин-
формации между выполнением приложений. С помощью инструментов баз данных
можно размещать информацию в любом его месте.
Чтобы просмотреть реестр своего компьютера, щелкните на кнопке
Пуск (Start), выберите команду Выполнить (Run), наберите
и
нажмите <Enter>.
Непосредственное изменение реестра — далеко не самый мудрый
поступок. Если вы случайно ошибетесь, система станет работать
некорректно даже после перезагрузки. В любом случае перед внесением
изменений в реестр сначала создайте его копию, выбрав в окне
Редактор Реестра (Registry Editor) команду
Export).
Вероятно, для приложений баз данных наиболее важна хранящаяся в реестре ин-
формация, которая помогает соединиться с базой данных. Вместо того, чтобы хранить
информацию о соединении, как это было сделано в листингах предыдущих глав, в на-
стоящих приложениях мы будем хранить информацию в реестре. Таким образом, при
перемещении базы данных не придется изменять код — достаточно будет лишь изме-
нить настройки реестра.
Хранение информации в реестре (в особенности информации о
соединении) для Access более допустимо, чем для других приложений. В
Access при работе с данными активной базы данных, чтобы получить
доступ к объекту Connection, можно использовать объект Current-
Project, который является подключенным по умолчанию.
Для сохранения и изменения информации в реестре используют SaveSetting и
GetSetting, которые позволяют непосредственно считывать и записывать информа-
цию. Вообще, обращаться к этой информации можно независимо от инициализации
приложения и того, открыто ли соединение. В листинге 8.9 приведен пример динами-
ческого чтения информации о соединении из реестра. На рис. 8.1 представлена копия
экрана редактора реестра, в который добавлен ключ Connectionstring. Если из ре-
гистра получена пустая строка, происходит инициализация со значением, заданным
по умолчанию.
154
Часть III. Использование ресурсов Access