Настольная СУБД Access 2002


         

Объектная модель ADOX



Рис. 13.6. Объектная модель ADOX



Объектная модель Microsoft Office 2002



Рис. 13.7. Объектная модель Microsoft Office 2002



Объекты Microsoft Office используются в иерархической структуре других объектных моделей. В объектной модели Microsoft Office 2002 появилось много новых объектов. Описание основных объектов, определенных в библиотеке Office, приведено в табл. 13.10.


Функция IsLoaded



Рис. 13.8.

Функция IsLoaded

Список стандартных модулей приложения всегда можно увидеть, нажав кнопку Модули (Modules) в окне База данных (Database). В этом окне обычно и выполняется работа с модулями. Выделите в окне базы данных (Northwind) модуль "Служебные функции" (Utility Functions) и нажмите кнопку Конструктор (Design). Откроется окно редактора кода VBA, в котором можно увидеть содержание модуля. Модуль состоит из двух строк описания и одной процедуры — функции isLoaded, с которой мы уже встречались (рис. 13.8) (см. гл. 11).

Это пример универсальной функции, которая проверяет, загружена ли форма, имя которой передается ей в качестве аргумента. Она никак не связана не только с объектом, но и с данным приложением и может использоваться как в нем самом, так и в любом другом приложении Access.



Диалоговое окно свойств формы



Рис. 13.9. Диалоговое окно свойств формы

В окне редактора VBA отображается объект Форма (Form), а справа — поле со списком событий, которые могут обрабатываться процедурами VBA (рис. 13.10).



Окно редактора кода VBA



Рис. 13.10. Окно редактора кода VBA

Если в модуле для некоторого события существует процедура, то это событие выделяется в списке жирным шрифтом. В данном случае таких событий нет, т. к. обработка событий в форме "Клиенты" (Customers), которую мы открыли, выполняется с помощью макросов. При попытке открытия редактора VBA автоматически создается модуль формы, который будет иметь название Fогm_Клиенты (Form_Customers).

Если теперь закрыть окно редактора кода, а затем форму, то, хотя мы не вносили никаких изменений в форму, на экране появится вопрос: Сохранить изменения макета или структуры формы Клиенты? (Do you want to save changes to the design of form 'Customers'?). Вопрос связан с появлением модуля формы. Если вы ответите Нет (No), модуль не будет сохранен.

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

Макрокоманду OpenForm, как метод объекта DoCmd, например:

DoCmd.OpenForm "Товары"

Forms!Товары.RecordSource = "Товары клиента"

Ссылку на соответствующий модуль класса, например:

Form_ToBapbi. Visible = True

Рогт_Товары.RecordSource = "Товары клиента" ,|

В том и в другом случае при выполнении открывается стандартный экземпляр формы "Товары" (Products) и подменяется источник записей для этой формы.

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

Класс формы может иметь только один стандартный экземпляр, поэтому в данном случае придется создать нестандартный экземпляр формы. Для этого в программе нужно описать переменную, типом которой является имя модуля класса формы, при этом в описание переменной включить ключевое слово New. Например, следующая команда создает новый экземпляр формы " Клиенты" (Customers) и связывает его с переменной типа Form:

Dim frm As New Fоrm_Клиенты

Теперь изменим источник данных для этой формы, расположение на экране (иначе формы просто перекроются) и присвоим свойству Вывод на экран (Visible) значение Да (Yes):

frm.RecordSource = "Наша организация" DoCmd.MoveSize 1440, 2400 frm.Visible = True

Для изменения положения на экране используется макрокоманда СдвигРазмер (MoveSize), в которой в данном случае задаются координаты верхнего левого угла окна формы относительно главного окна Access.

Замечание

Для того чтобы второй экземпляр формы не исчез с экрана сразу после появления, переменная frm должна быть описана на уровне модуля, т. е. объявлена в разделе (Declarations ) модуля с помощью ключевого слова Private.

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

Формы и отчеты являются стандартными классами объектов в Access, однако можно использовать модули класса для создания пользовательских объектов. Имя, под которым сохраняется модуль класса, становится именем специального объекта. Процедуры типа Sub и Function, определенные в модуле класса, при этом станут методами объекта, а процедуры типа Property Let, Property Get и Property Set-свойствами объекта. Для описания метода, не возвращающего никакого значения, используется процедура Sub, а для метода, возвращающего значение, — процедура Function. Процедура Property Get возвращает значение свойства объекта. Процедура Property Set присваивает значение свойству объекта. Процедура Property Let устанавливает значение свойства, не принадлежащего объекту. Более детальные сведения об этих процедурах можно получить из справки Access, набрав в качестве критерия поиска имя процедуры: Property Let, Property Get и Property Set соответственно.

Точно так же, как и в модуле формы, новый экземпляр объекта создается путем объявления переменной, например:

Dim els As New MyClass

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

cls.MyProcedure



Создание нового модуля



Рис. 13.11. Создание нового модуля

Создать необходимые процедуры и описания.
Сохранить модуль, нажав кнопку Сохранить (Save) на панели инструментов. При этом выдается диалоговое окно Сохранение (Save), в котором необходимо ввести имя нового модуля и нажать кнопку ОК.

После этого новый модуль появляется в списке модулей окна базы данных. Чтобы его открыть, можно нажать кнопку Конструктор (Design) окна базы данных. Если у вас открыты форма или отчет в режиме Конструктора, то для того, чтобы открыть модуль формы (отчета), следует нажать кнопку Программа (Code) на панели инструментов.



Окно редактора кода VBA



Рис. 13.12. Окно редактора кода VBA

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

Project (Панель проекта), располагается в верхнем левом углу редактора. В ней отображается иерархическое дерево модулей приложения. Если это окно неактивно, выполните команду View, Project Explorer либо нажмите комбинацию клавиш <Ctrl>+<R>.
Properties (Панель свойств), находится под панелью проекта. Она позволяет просматривать и изменять свойства различных входящих в проект объектов, отображаемых на панели проекта. Список свойств может отображаться как в алфавитном порядке, так и по категориям.
Code (Панель редактора кода). Это окно занимает большую часть экрана и является "многодокументным", т. е. можно открыть одновременно несколько окон данного типа для разных модулей. Оно представляет собой высокоинтеллектуальный текстовый процессор, существенно облегчающий написание кода VBA.

Проект приложения состоит из модулей, которые делятся на три категории:

Microsoft Access Class Objects (Модули классов Access) — включает все модули форм и отчетов;
Modules (Модули) — стандартные модули;
Class Modules (Модули классов) — модули пользовательских классов, если они присутствуют в приложении.

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

В верхней части панели проекта расположены три кнопки:

View Code (Просмотр кода). При нажатии этой кнопки указатель мыши перемещается в окно кода, в котором отображается код выделенного в иерархии проекта объекта.
View Object (Просмотр объекта). Эта кнопка доступна только когда в дереве проекта выделен модуль формы или отчета. Тогда она позволяет быстро переключиться на соответствующий модулю объект, т. е. в окно Конструктора формы или отчета.
Toogle Folders (Переключение видов представления дерева). При нажатой кнопке все элементы в дереве проекта группируются в папках по категориям, при отжатой — они отображаются в алфавитном порядке..

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

Чтобы изменить значение свойства объекта, необходимо:

Выделить имя свойства в левой колонке.
Изменить значение в правой колонке, либо введя его вручную, либо путем выбора из списка.

Для каждого модуля, выбранного на панели проекта, открывается свое окно редактора кода. В данном случае в окне редактора мы видим модуль "Заставка" (Startup) приложения "Борей" (рис. 13.13).

Код в каждом модуле состоит из разделов, переключение между которыми выполняется путем выбора значения из списка Object (Объект), который размещается в левом верхнем углу окна. Список разделов различается для разных типов модулей.

Для модуля формы этот список включает раздел General (Общая область), который содержит объявления переменных, констант, специальных типов, внешних процедур. Данный раздел открывается по умолчанию при открытии окна кода. Для стандартного модуля этот раздел единственный — он содержит описание всех процедур. Модуль класса имеет разделы General и Class. Модуль формы, кроме раздела General, содержит раздел самой формы и разделы для каждого элемента управления. Модуль отчета включает в себя раздел для объекта Report (Отчет) и разделы для каждой области отчета. Для полей отчета не определены события, поэтому отсутствуют и соответствующие разделы в модуле кода.



Стандартный модуль в окне редактора



Рис. 13.13. Стандартный модуль в окне редактора

Каждый раздел может содержать несколько процедур, выбираемых из списка Procedure в правом верхнем углу окна на рис. 13.13. Список процедур в стандартном модуле содержит Declarations (Описания) и имена всех процедур модуля в алфавитном порядке. Список процедур для модуля формы включает в себя перечень всех событий формы и ее элементов. Для модуля класса список процедур содержит только две процедуры для событий класса: Initialize и Terminate.

С помощью кнопок в левом нижнем углу окна можно выбрать один из видов представления кода в окне.

Procedure View (Представление процедуры), когда в окне отображается только одна выбранная процедура.
Full Module View (Представление полного модуля), когда в окне отображается сразу несколько процедур, отделенных друг от друга тонкой линией.

Для настройки параметров редактора используется также диалоговое окно Options (Параметры), которое можно открыть, выбрав команду Options в меню Tools (Сервис) (рис. 13.14). Это окно описывает только параметры редактора кода и вызывается из среды редактора кода.



Диалоговое окно параметров редактора кода



Рис. 13.14. Диалоговое окно параметров редактора кода

Оно содержит четыре вкладки.

Первая вкладка Editor (Редактор) состоит из двух групп параметров: Code Settings и Window Settings.

Группа Code Settings (Программирование) содержит шесть флажков, которые позволяют включать и отключать интеллектуальные функции редактора, такие как автоотступ, автоматическая проверка синтаксиса, подсказки при написании пользователем программ.
Группа Window Settings (Параметры окна) включает в себя три флажка, влияющих на представление кода в окне редактора. Эти флажки позволяют переключаться между представлениями полного модуля и процедуры, выводить или не выводить на экран тонкие линии, разделяющие процедуры, включать или отключать функцию перетаскивания текста, т. е. перемещения выделенного фрагмента кода с помощью мыши.

Вторая вкладка Editor Format (Формат редактора) позволяет определить шрифт, его размер и цвет для разных областей текста. Открыв любой модуль, вы можете убедиться, что текст программ представлен несколькими цветами: по умолчанию комментарии выделяются зеленым цветом, ключевые слова — синим. При отладке программ используются и другие цветовые выделения фрагментов текста: точек останова, текущей команды и т. д. Все эти способы выделения могут быть настроены в соответствии с вашим вкусом в данном окне.

Третья вкладка General (Общая) содержит несколько групп переключателей и флажков.

Группа Form Grid Setting относится к созданию форм в Microsoft Visual Basic 6.0 и в других компонентах Office и не используется в Access.
Флажок Show ToolTips позволяет включить или отключить вывод всплывающих подсказок для кнопок на панели инструментов.
Флажок Collapse Proj. Hides Windows определяет, будет ли скрываться окно редактора при закрытии проекта на панели проекта.
Флажок Notify Before State Loss определяет, получит ли пользователь сообщение о том, что предпринимаемое действие вызовет потерю состояния текущего проекта.
Переключатели Error Trapping определяют установки по умолчанию, используемые при обработке ошибок в программах:
Break on All Errors — любая ошибка, независимо от того, обрабатывается ли она программой, приведет к прерыванию выполнения программы;
Break in Class Module — любая необработанная ошибка в модулях класса приведет к прерыванию выполнения программы;
Break on Unhandled Errors — прерывание программы вызывают все необработанные ошибки.

Последняя группа флажков определяет, когда компилируются модули проекта:

Compile On Demand — определяет, будут ли все модули проекта компилироваться перед началом работы или только по требованию, в первом случае запуск приложения будет более длительным;
Background Compile — определяет, будет ли компиляция модулей выполняться в фоновом режиме.

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

Для того чтобы убедиться, что наши утверждения об интеллектуальности редактора не являются голословными, достаточно попробовать написать даже самую простую программу. Давайте заменим в форме "Клиенты" (Customers) макрос, который открывает форму "Заказы" (Orders) при нажатии кнопки Заказы клиента, процедурой VBA, которая выполняет те же действия. Мы создавали такой макрос в разд. "Назначение макроса событию" гл. 11. Если вы этого не делали, тогда создайте сейчас командную кнопку в области заголовка окна и назовите ее "Заказы клиента" (кнопка Мастера на панели элементов при этом должна быть отжата).

После этого нажмите кнопку Программа (Code) на панели инструментов. Откроется редактор кода VBA, который по умолчанию попытается создать процедуру обработки события Load формы. Выберите из списка слева объект Заказы клиента. Редактор автоматически вставит заголовок и концовку процедуры обработки события Click (рис. 13.15). Открыв список справа, вы можете увидеть, как много различных событий связано с командной кнопкой, однако наиболее часто используется именно событие Click. Так как с этим событием сейчас не связано никакой процедуры, редактор сразу пытается ее создать.

Начнем писать текст процедуры. Процедура будет состоять из нескольких команд. Нам необходимо открыть форму "Заказы" (Orders) и показать в этой форме только те заказы, которые относятся к определенному клиенту, поэтому придется задать условие для отбора записей в форме "Заказы" (Orders). Обычно для этого используют переменную типа string, которой сначала присваивают нужное значение, а потом подставляют в качестве параметра в макрокоманду Открытьформу (OpenForm). Чтобы использовать такую переменную, ее сначала нужно описать, поэтому первое предложение в процедуре должно быть следующим:

Dim stLinkCriteria As String



Создание процедуры обработки события



Рис. 13.15. Создание процедуры обработки события

Как только вы напишете первые три слова Dim stLinkCriteria As, на экране появится список слов (рис. 13.16), которые могут быть использованы в данном предложении.



Автоматический вывод списка компонентов



Рис. 13.16. Автоматический вывод списка компонентов

Вы набираете следующие буквы — str, после чего курсор в списке устанавливается на слове string. Дальше можно не продолжать, а просто нажать клавишу <Таb> — конец слова допишется автоматически. Нажмите клавишу <Enter>, курсор перейдет на новую строку, а текст во введенной строке изменится: все ключевые слова — Dim, As, string — будут выделены синим цветом. При вводе ключевых слов можно не беспокоиться о том, чтобы слово начиналось с заглавной буквы. Вы можете набирать весь текст строчными буквами — необходимое преобразование будет выполняться автоматически. Но, конечно, названия переменных, элементов управления и других объектов, на которые имеются ссылки в тексте, вы должны вводить сами с использованием нужного регистра, т. к. в них преобразования выполняться не будут.

Следующая строка будет присваивать переменной strLinkCriteria значение: stLinkCriteria = "[КодКлиента]=" & "'" & Me![КодКлиента] & "'"

Две формы будут связаны по значению поля CustomerID. Первое выражение [КодКлиента] относится к форме "Заказы" (Orders), а второе значение Me! [КодКлиента] — к текущей форме "Клиенты" (Customers), о чем говорит слово Me. Теперь используем макрокоманду Открыть форму (OpenForm) для того, чтобы открыть форму "Заказы" (Orders). Как только набирается docmd, появляется новая подсказка — список макрокоманд (рис. 13.17).



Автоматический вывод методов объекта



Рис. 13.17. Автоматический вывод методов объекта

Уже известным способом выбираем нужную макрокоманду, нажимаем пробел и опять подсказка — синтаксис макрокоманды Открыть форму (OpenForm) (рис. 13.18).



Автоматический вывод кратких сведений



Рис. 13.18. Автоматический вывод кратких сведений

И это очень кстати, т. к. позволяет не запоминать все аргументы макрокоманды и порядок их следования. Введите имя формы: Заказы (Orders), запятую, и опять появится подсказка с именами возможных констант, которые могут быть указаны в следующем параметре. Выберите константу acNormal и продолжайте ввод. Должна получиться строка:

DoCmd.OpenForm "Заказы", acNormal, , stLinkCriteria

Две следующие подряд запятые говорят о пропущенном параметре — имя фильтра.

Теперь добавим еще одну команду — изменим заголовок формы:

Forms!Заказы.Caption = "Заказ" & Название

И наконец, напишем комментарий, который объясняет, что делает данная программа. Для этого поместите курсор в начало второй строки программы и нажмите клавишу <Enter>. Появится пустая строка. Введите символ (') в начало новой строки и пишите дальше текст комментария. Закончите ввод нажатием клавиши <Enter>, и вы увидите, что комментарий оказался выделен зеленым цветом. В целом текст программы должен выглядеть как на рис. 13.19.



Программа открытия формы "Заказы"



Рис. 13.19. Программа открытия формы "Заказы"

На примере этой простой программы мы продемонстрировали три очень полезных свойства редактора.

Автоматическая проверка синтаксиса — ввод команды успешен и все слова выделяются нужным цветом, только когда синтаксис предложения правилен, в противном случае вы услышите звуковой сигнал, текст будет выделен красным цветом и появится сообщение об ошибке.
Автоматический вывод списка компонентов Auto List Members позволяет избежать ошибок при вводе наименований свойств объектов, встроенных констант, типов переменных. Особенно эта функция полезна при установке свойств, т. к. позволяет не только вспомнить правильное имя свойства, но и увидеть, какие свойства объекта доступны в данный момент.
Автоматический вывод кратких сведении Auto Quick Info показывает в виде всплывающей подсказки синтаксис встроенных функций и макрокоманд. По мере ввода параметров очередной параметр выделяется в подсказке жирным шрифтом.

Когда вы уже усвоите язык VBA, такие подсказки могут показаться вам навязчивыми. Тогда вы можете отключить их, сбросив соответствующие флажки в диалоговом окне Options (Параметры) редактора кода (вкладка Editor).

Однако при необходимости вы легко получите требуемую помощь, если воспользуетесь контекстным меню редактора кода (рис. 13.20).



Контекстное меню редактора кода



Рис. 13.20. Контекстное меню редактора кода

Кроме описанных выше функций, в контекстном меню присутствуют и другие очень полезные функции, способствующие быстрому написанию кода, — List Constants, Parameter Info, Complete Word, а также две команды, очень упрощающие навигацию среди программных модулей:

Definition. Если в процедуре выполняется вызов другой процедуры, то, установив курсор на имя вызываемой процедуры и выбрав из контекстного меню команду Definition (а еще быстрее, нажав комбинацию клавиш <Shift>+<F2>), вы сразу попадете в тело вызываемой процедуры;
Last Position — позволяет после такого перехода вернуться обратно.

Команда Definition позволяет также быстро открыть окно Object Browser и посмотреть описание нужного свойства, метода или объекта приложения. Для этого нужно установить курсор на интересующий объект, свойство, метод и нажать комбинацию клавиш <Shift>+<F2>.



Окно просмотра объектов



Рис. 13.21. Окно просмотра объектов

При этом в нижней части окна, которая называется область описания, отображается описание выбранного элемента.

Если выбрать в поле Project/Library (Проект/Библиотека) текущее приложение "Борей" (Northwind), то в поле Classes (Классы) отобразятся все модули форм, отчетов и стандартные модули приложения (рис. 13.22).

Если вы написали много процедур, то это удобный способ найти нужную процедуру. Кроме того, если вы, выбрав в списке компонентов модуля интересующую вас процедуру, нажмете кнопку View Definition (Посмотреть описание) (на панели инструментов в верхней части окна вторая справа), то откроется окно данного модуля, и вы увидите в нем именно эту процедуру.



Объекты приложения "db1"



Рис. 13.22. Объекты приложения "db1"

Для поиска необходимого объекта, метода или свойства существует поле Search Text (Образец поиска). Это второе поле со списком в верхней части окна. В него можно ввести фрагмент текста для поиска и нажать кнопку с биноклем, которая находится рядом. Тогда открывается дополнительная область Search Results (Результаты поиска), в которой отображается список компонентов, удовлетворяющих условию поиска (рис. 13.23).



Отображение результатов поиска



Рис. 13.23. Отображение результатов поиска

Выделив в списке нужную строку, можно снова воспользоваться кнопкой View Definition, чтобы открыть нужную процедуру.

Еще одна очень полезная кнопка в этом окне Copy to Clipboard (Копировать в буфер обмена). Она позволяет копировать выбранный объект в буфер, после чего объект можно будет вставить прямо в текст программы.



Диалоговое окно References



Рис. 13.24. Диалоговое окно References

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



Меню и панель инструментов Debug



Рис. 13.25. Меню и панель инструментов Debug



Добавление контрольного значения



Рис. 13.27. Добавление контрольного значения

Замечание

Группа Context (Контекст) в окне Add Watch позволяет определить область контроля заданного значения или выражения: конкретная процедура текущего модуля, все процедуры текущего модуля или все модули текущей базы данных.



Окно Watches редактора кода



Рис. 13.28. Окно Watches редактора кода

Теперь нужно снять точку останова, которую мы установили. Для этого щелкните правой кнопкой мыши в строке останова и выберите команду Toggle, Breakpoint из контекстного меню (или нажмите клавишу <F9>). Строка примет обычный вид.

Закройте окно редактора кода и снова нажмите кнопку Заказы клиента в форме 'Клиенты" (Customers). Выполнение программы остановится на той же команде. Нажмите кнопку Watch Window на панели инструментов или выберите соответствующую команду в меню View. В нижней части редактора появляется новое окно Watches (рис. 13.28), в котором будет выведена одна строка, содержащая контрольное выражение, его значение, тип и контекст, т. е. процедура, в которой вычисляется контрольное значение. Выражение истинно, и программа остановлена.

Существует очень простой способ добавления контрольных значений в окно Watches. Можно просто выделить в тексте процедуры выражение и перетащить его в это окно мышью. Попробуйте проделать эту операцию с выражением Forms! Заказы. Caption и выполните несколько шагов процедуры, наблюдая, как изменяется выражение в окне Watches.



Диалоговое окно Quick Watch



Рис. 13.29. Диалоговое окно Quick Watch

Если вы решите добавить выбранное выражение к контрольным значениям, просто нажмите кнопку Add (Добавить).



Окно Immediate



Рис. 13.30. Окно Immediate

Окно Immediate открывается при нажатии кнопки Immediate Window на панели инструментов, или при выполнении соответствующей команды в меню View, или при нажатии комбинации клавиш <Ctrl>+<G>. Это окно отображается на экране, даже если окно редактора закрыто и выполняется приложение. При этом в нем можно наблюдать значения указанных данных. Выводить в это окно можно любые допустимые выражения, включая свойства объектов.

Для того чтобы вывести значение переменной, нужно ввести знак "?" и имя переменной и нажать клавишу <Enter>. Значение переменной отобразится на следующей строке.

Метод Print объекта Debug направляет вывод в это окно в процессе выполнения программы. Например, команда

Debug.Print "Цена.Enabled = "; Цена.Enabled

печатает значение свойства Доступ (Enabled) поля "Цена" (UnitPrice) в окне Immediate.

В окне Immediate можно не только выводить значения переменных и свойств, но и задавать их, например можно в режиме останова ввести команду

Цена.Enabled = True

При этом на экране должна быть открыта форма, в которой присутствует данное поле. Аналогично присваиваются значения переменным, вызываются процедуры и выполняется большинство других команд. Ограничение на вводимые команды существует одно — они должны полностью помещаться на одной строке кода. После ввода команды и нажатия клавиши <Enter> Access выполняет введенную команду и снова переходит в режим останова. Таким образом, можно тестировать фрагменты программ, процедуры и функции.



Диалоговое окно Call Stack



Рис. 13.31. Диалоговое окно Call Stack

Выбрав в стеке нужную процедуру, можно нажать кнопку Show (Показать), тогда окно Call Stack закроется и в окне кода модуля появится выбранная процедура. При этом курсор устанавливается на строку кода, вызывающую следующую процедуру из стека. Если выбирается текущая процедура, то курсор устанавливается на текущую команду.

Окно Call Stack вызывается несколькими способами:

нажать кнопку Call Stack на панели инструментов;
выбрать команду View, Call Stack;
нажать комбинацию клавиш <Ctrl>+<L>;
нажать кнопку с многоточием в верхнем правом углу окна Locals.

Данное окно может быть открыто только в режиме останова.



Диалоговое окно событий формы



Рис. 13.32. Диалоговое окно событий формы

Если процедура обработки выбранного события имеет аргументы, они будут также присутствовать в заголовке процедуры (рис. 13.34).

Теперь нужно ввести код процедуры между этими двумя строками. Ниже приведены некоторые примеры процедур обработки событий.



Заготовка процедуры обработки события



Рис. 13.33. Заготовка процедуры обработки события

Рис. 13.34. Процедура обработки событий с аргументом Cancel



Перекрестный запрос...



Рис. 13.35. Перекрестный запрос "Выработка сотрудников"

Поле "Отпускная цена" является вычисляемым, и для его вычисления используется формула

CCur(CLng([Заказано].[Цена]*

[Количество]*(1-[Скидка])*100)/100)

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

В запросе в качестве критерия выборки заказов указан год — 1998. Нужно вывести приглашение пользователю, чтобы он, в свою очередь, мог ввести желаемый год. Это можно сделать при открытии отчета. Сначала нужно создать базовый набор записей для отчета и посчитать, сколько получилось столбцов в этом наборе. Следующая процедура обрабатывает событие Открытие (On Open) отчета:

Private Sub Report_0pen(Cancel As Integer)

On Error Resume Next

' Создает базовый набор записей для отчета.

Dim intX As Integer

Dim qdf As QueryDef

Dim frm As Form

Dim StrSql As String

' Связывает переменную с текущей базой данных.

Set dbsReport = CurrentDb

' Открывает запрос (объект QueryDef).

Set qdf = dbsReport.QueryDefs("Выработка сотрудников")

' Запрашивает год.

Год = InputBox("Отчет за год:", "Год", 1998)

StrSql =Left(qdf.SQL, InStr(qdf.SQL, "where") - 1) & " WHERE_ (((Year([ДатаИсполнения]))= " & Год & "))" & Right(qdf.SQL, Len(qdf.SQL) - InStr(qdf.SQL, "GROUP BY") + 1)

qdf.SQL = StrSql

' Открывает набор записей

Set rstReport = qdf.OpenRecordset()

' Определяет количество столбцов в перекрестном запросе.

intColumnCount = rstReport.Fields.Count

End Sub

Здесь переменная intColumnCount должна быть определена на уровне модуля формы, т. к. она используется и другими процедурами данной формы.

Для событий Форматирование (On Format) верхнего колонтитула (листинг 13.1) и области данных отчета (листинг 13.2) необходимо определить процедуры, которые бы заполняли поля заголовков и значений и скрывали неиспользуемые поля.



Использование функции...



Рис. 13.36. Использование функции при обработке событий в форме

Еще один пример применения функции для обработки событий в форме вы может увидеть в базе данных "Контакты" (Contacts) (см. пример к гл. 18 на компакт-диске) В этом приложении с помощью Мастера кнопочных форм создана главная кнопоч ная форма, которая открывается при открытии приложения. На форме имеются не сколько кнопок, каждая из которых выполняет определенную функцию, но обрабаты ваются они все одинаково. Для этого мастер создает функцию =HandleButtonClick которая имеет один аргумент — идентификатор нажатой кнопки. Вызов функци! выполняется, как показано на рис. 13.37. Аргумент определяет нажатую клавишу. Oi обрабатывается программой в блоке Select Case, после чего выполняется соот ветствующее действие.

Рис. 13.37. Вызов функции для обработки события Нажатие кнопки



Синхронизация данных в связанных формах



Синхронизация данных в связанных формах

Пример синхронизации данных в двух связанных формах с помощью процедуры обработки события Текущая запись (Current) можно увидеть в модуле формы "Поставщики" (Supplier). В форме есть кнопка Просмотр товаров (Review Products), при нажатии на которую выводится форма "Список товаров" (Product List), показывающая товары данного поставщика. Естественно, что при переходе к новой записи в форме "Поставщики" (Supplier), записи в форме "Список товаров" (Product List) тоже должны быть сменены. Процедура выглядит следующим образом:

Private Sub Form_Current()

On Error GoTo Err_Form_Current

' Отображение товаров текущего поставщика при открытии формы "Список ' товаров".

Dim strDocName As String

Dim strLinkCriteria As String

strDocName = "Список товаров"

strLinkCriteria = "[КодПоставщика] = Forms![Поставщики]![КодПоставщика] "

If IsNull(Me![Название]) Then

Exit Sub

Elself IsLoaded("Список товаров") Then

DoCmd.OpenForm strDocName, , , strLinkCriteria

End if

Exit_Form_Current:

Exit Sub

Err_Form_Current:

MsgBox Err.Description

Resume

Exit_Form_Current

End Sub

Если текущая запись в форме "Поставщики" (Supplier) пустая, т. е. добавляется новая запись, то сразу выполняется выход из процедуры. Если текущая запись отображает конкретного поставщика, то проверяется, загружена ли форма "Список товаров" (Product List). Если форма загружена, то меняется набор записей в ней. Делается это с помощью макрокоманды ОткрытьФорму(OpenForm) с соответствующим условием отбора записей. При этом на самом деле форма не открывается, просто повторно запрашивается источник данных.



Событие ошибок



Событие ошибок

Событие Ошибка (Error) возникает, когда в процессе обработки формы или отчета ядром Access возникает ошибка. В процедуре обработки этого события можно перехватить стандартное сообщение об ошибке, которое выдает Access, и выдать собственное сообщение. Процедура имеет два параметра — DataErr и Response. Параметр DataErr содержит код ошибки, а параметр Response может принимать два значения — 0 и 1. Значение 0 отменяет выдачу стандартного сообщения об ошибке, а 1 — позволяет его отобразить.

Замечание

Это событие не возникает, когда ошибка встречается в коде VBA.



Событие таймера



Событие таймера

Событие Таймер (Timer) возникает регулярно через интервал времени, который задается свойством Интервал таймера (Timerlnterval) формы. Оно позволяет определять действия, которые должны выполняться периодически по сигналу таймера. Обычно используется для регулярных обновлений экрана в многопользовательском приложении, тогда в процедуре обработки события Таймер (Timer) нужно использовать метод Requery, который будет выполнять повторный запрос источника данных формы.



События Access



События Access

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

В Microsoft Access 2002 появилось несколько новых событий для формы, связанных с выполнением транзакций. Эти события возникают только в формах проекта Access и в данном разделе рассматриваться не будут (о проектах Microsoft Access см. гл. 17). Кроме того, в связи с появлением двух новых режимов формы: Сводной таблицы и Сводной диаграммы, появились события, позволяющие программно управлять отображением данных в этих режимах: После конечного отображения (AfterFinalRender), До разметки (AfterLayout), После отображения (AfterRender), До отображения (BeforeRende), До экранной подсказки (BeforeScreenTip), Изменение представления (ViewChange), До запроса (BeforeQuery), Запрос (Query), До выполнения команды (CommandBeforeExecute), Включение команды (CommandEnabled), Выполнение команды (CommandExecute), Проверка команды (CommandChecked), Изменение набора данных (DataSetChange), Изменение сводной таблицы (PivotTableChange), Изменение выбора фрагмента (SelectionChange), Соединение (OnConnect), Отсоединение (OnDisconnect). Эти события также не будут здесь рассматриваться. При необходимости обработки этих событий вы можете найти информацию о них в справке Access в разделе Программирование в Visual Basic, Microsoft Access Visual Basic Reference, Events.



События данных



События данных

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



События фильтра



События фильтра

События фильтра происходят при применении или удалении фильтра в форме.



События фокуса



События фокуса

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



События клавиатуры



События клавиатуры

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

Все события клавиатуры связываются с тем объектом в форме, который имеет в данный момент фокус. Обычно это один из элементов управления. Форма может получить фокус (а значит, и события клавиатуры могут относиться к форме), только если все ее элементы управления заблокированы или невидимы. Если нужно привязать эти события именно к форме, а не к элементу формы, то можно присвоить свойству Перехват нажатия клавиш (KeyPreview) для формы значение Да (Yes). Тогда все события клавиатуры возникают сначала для формы, а потом уже для элемента управления, имеющего фокус. Это дает возможность запрограммировать реакцию формы на нажатие определенных клавиш вне зависимости от того, в каком элементе управления формы находится фокус.

Замечание

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



События мыши



События мыши

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



События окна



События окна

События окна запускаются при открытии и закрытии форм и отчетов, а также при изменении размеров формы.



События печати



События печати

События печати вызываются отчетом и любой из его областей при печати или предварительном просмотре.



Создание модулей



Создание модулей

Для того чтобы создать стандартный модуль или модуль класса, нужно:

Выбрать команду Модуль (Module) или Модуль класса (Class Module) в меню Вставка (Insert) или в списке кнопки Новый объект (New Object) выбрать соответствующий объект (рис. 13.11). При этом откроется редактор кода VBA с пустым окном модуля.



Создание перекрестного отчета с изменяющимся числом столбцов



Создание перекрестного отчета с изменяющимся числом столбцов

Рассмотрим возможности обработки событий в отчете на примере отчета "Выработка сотрудников". Этот отчет строится на базе перекрестного запроса и показывает выработку сотрудников отдела продаж за год по месяцам. Максимальное число столбцов в отчете — 14. Первый столбец содержит фамилии сотрудников, следующие двенадцать столбцов — выработку для каждого месяца и последний столбец — итоговый. (Как выглядит этот отчет, мы показывали в разд. "Перекрестные отчеты" гл. 10.)

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



Создание процедур обработки событий



Создание процедур обработки событий

Теперь рассмотрим, как создавать процедуры обработки событий. Для большинства элементов управления формы, а также самой формы и отчета, стандартный набор действий следующий:

Откройте форму в режиме Конструктора. Если при этом окно свойств отсутствует на экране, щелкните на кнопке Свойства (Properties) на панели инструментов.
Выберите нужный элемент управления (или щелкните мышью на маленьком черном квадрате в верхнем левом углу формы, тогда выберется вся форма). В окне свойств отобразятся свойства выбранного элемента.
Откройте вкладку События (Events).
Выберите событие, для которого будет создаваться процедура обработки, и щелкните по нему правой кнопкой мыши.
Выберите из контекстного меню (рис. 13.32) пункт Построить (Build). В открывшемся диалоговом окне Построитель (Choose Builder) выберите из списка элемент Программы (Code Builder) и нажмите кнопку ОК. Откроется окно редактора VBA, в котором появятся первая и последняя строки процедуры (рис. 13.33).



в Access 2002 включает все



Среда программирования в Access 2002 включает все средства, необходимые для написания программ отладки процедур VBA. Самым главным компонентом этой среды является редактор кода Visual Basic Editor (VBE), обладающий богатыми возможностями для облегчения процесса ввода программного кода. Кроме того, среда программирования содержит еще массу диалоговых окон, в которых отображается дополнительная информация, требующаяся как в процессе создания, так и в процессе отладки кода.



Ссылки на объект Module



Ссылки на объект Module

Для обращения к модулям в программах VBA используется семейство Modules, которое содержит все открытые объекты типа Модуль (Module). Для того чтобы открыть объект Module, можно использовать макрокоманду ОткрытьМодуль (OpenModule). Ссылка на модуль может быть создана тремя способами:

имяСемейства!имяОбъекта,например Modules!Startup;
имяСемейства ("имяОбъекта"), например Modules ("Startup");
имяСемейства (индекс), где индекс— индекс объекта в семействе.

Для ссылки на модуль формы или отчета можно использовать или имя модуля, например Modules ! Fоrm_Клиенты, или " . свойство формы, например

Forms!Клиенты.Module.

Объект Module имеет свойство туре. Значение этого свойства определяет тип модуля: для стандартного модуля используется значение 0, для модуля класса — 1.



Ссылки на объекты



Ссылки на объекты

Кроме обычных переменных, в Visual Basic часто встречаются неременные, представляющие собой ссылку на объект. Оказывается, зачастую использование переменных для ссылок на объекты позволяет не только сократить и упростить текст программы, но и существенно ускорить ее работу.

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

Dim <имяПеременкой> As Object

Set <имяПеременной> = <ссылкаНаОбъект>

Иногда при объявлении такой переменной удобно заранее указать конкретный тип объекта — можно использовать любой конкретный объект из объектной модели Office. Приведем пример упомянутого объявления и назначения:

Dim MyBase As Database

Set MyBase = CurrentDb( )

После такого объявления и назначения вы можете применять переменную MyBase для обращения к текущей открытой базе данных. Мало того, что такая ссылка короче: она еще и быстрее обрабатывается, и программа, использующая переменные для прямых ссылок на объекты вместо сложных иерархических ссылок, включающих в себя большое количество операторов уточнения (точек), работает быстрее. Время, которое уходит у программы на разрешение ссылок, пропорционально количеству операторов уточнения, которые приходится обрабатывать программе.

Совет

Еще одно замечание о быстродействии. Если вы всерьез озабочены быстродействием вашей программы, то рекомендуется при описании переменных типа "объект" использовать конкретные объекты модели Office, а не универсальное описание Object. В оправдание можно привести примерно те же соображения, что и по поводу применения универсального типа Variant при описании обычных переменных: обработка такого типа переменных требует дополнительного времени и места в памяти.

Объектная переменная будет указывать на объект до тех пор, пока мы другим оператором Set не присвоим ей ссылку на другой объект этого же типа или не присвоим ей значение Nothing, что означает, что переменная не содержит никакой ссылки. Например:

Set txt = Nothing

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

Замечание

Обратите внимание, что объектные переменные, в отличие от обычных переменных, содержащих значения, включают в себя только ссылки на объекты, а не сами объекты или их копии.



Ссылки на объекты



Ссылки на объекты

Первый вопрос, который следует обсудить, — как обратиться к объекту. Для обращения к объекту существует одно общее правило: нужно проследить путь в иерархии объектов, начиная от объекта самого верхнего уровня, до целевого объекта и записать последовательность имен встреченных на пути объектов или семейств, отделяя их друг от друга точкой. Если на пути встречается семейство, то, кроме имени семейства, необходимо в скобках указать индекс или имя его элемента, т. е. задать конкретный объект в семействе. Например, чтобы обратиться к форме, входящей в состав семейства AllForms, необходимо написать следующее выражение:

Application. CurrentProject .AllForms ("Заказы клиента")

Таким образом, чтобы правильно создавать ссылки на объекты, нужно достаточно хорошо представлять себе место каждого объекта в иерархии объектов модели. Такие длинные ссылки особенно характерны для моделей, которые имеют многоуровневую, иерархическую структуру, например DАО. На самом деле, на практике чаще применяют не полные, а сокращенные ссылки. Дело в том, что наиболее часто используемые семейства, объекты, свойства и методы считаются глобальными. Ссылки на них хранятся в специальном объекте с именем Global. Для обращения к глобальному объекту можно пропустить объекты более высокого уровня.

Например, семейство Forms является глобальным. Для доступа к объекту этого семейства можно использовать сокращенную ссылку вида:

Forms ( "Заказы") вместо полной ссылки:

Application. Forms ( "Заказы")

Замечание

Узнать, какие объекты, свойства и методы являются глобальными, позволяет окно просмотра объектов. Чтобы отобразить список глобальных компонентов объектной модели, выберите элемент <globals> в списке Classes в окне просмотра объектов (см. разд. "Использование обозревателя объектов в редакторе VBA " данной главы).

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

Обычно имя семейства и имя объекта разделяются оператором "!" (восклицательный знак), например:

Forms ! Товары

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

Forms![Заказы клиента]

Третий способ ссылки состоит в том, что на объект в семействе ссылаются не по названию, а по индексу, например:

Properties(0)

Такой способ применяется обычно тогда, когда имя объекта неизвестно. В то же время каждый объект в семействе имеет индекс (порядковый номер), который обычно начинается с нуля. Есть, правда, исключения из этого правила, например в семействе CommandBars модели Microsoft Office нумерация объектов начинается с, единицы. Поэтому перед использованием индексов лучше узнать о способе нумерации в справочной системе Access.

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

Reports (strИмяОтчета)

Если какой-то объект содержит несколько семейств объектов более низкого уровня, то одно из этих семейств, обычно наиболее часто используемое, считается стандартным или семейством по умолчанию. Можно обращаться к объекту, входящему в это семейство, не указывая имени семейства. Например, для объекта TableDef модели DАО стандартным семейством считается Fields. Поэтому для обращения к столбцу таблицы можно использовать сокращенную ссылку

TableDefs!Должности!Код Должности вместо полной ссылки

TableDefs!Должности.Fields!КодЦолжности

Совет

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

Еще одним способом сокращения ссылки на объект является использование объектной переменной. Особенно полезно использовать объектную переменную, если к объекту нужно обратиться несколько раз. (О том, как объявить объектную переменную и установить ссылку на объект см. разд. "Язык Visual Basic для приложений" выше в данной главе.)



Стандартные модули



Стандартные модули

Стандартные модули содержат общие процедуры, которые не связаны с конкретным объектом: формой или отчетом. Эти процедуры могут вызываться из других модулей и использоваться при обработке событий в разных объектах, для вычисления значений в разных запросах или формах и т. д. Если в процедурах модуля нет ссылок на конкретные объекты данного приложения (формы, отчеты, элементы управления), то такой модуль может быть с успехом использован другими приложениями Access. Стандартные модули применяются также для объявления глобальных (то есть доступных из всех модулей приложения) переменных, констант, типов.



Страница



Страница

Событие Страница (Page) возникает после форматирования страницы отчета, но до вывода ее на печать, и позволяет с помощью процедуры обработки этого события добавить на страницу некоторые элементы оформления, например рамку.



Свойства и методы объектов



Свойства и методы объектов

Как уже говорилось выше, каждый объект имеет свойства, которые являются его характеристиками, и методы, которые позволяют управлять поведением этого объекта. То же справедливо и для семейств. Работа с объектами и семействами заключается в установке или получении значений конкретных свойств объекта или семейства и вызове их методов. Поэтому для управления объектами приложения необходимо хорошо знать свойства и методы каждого объекта.

Замечание

Если вы хотите иметь подробную информацию обо всех свойствах и методах объекта, следует обратиться к соответствующему разделу справки. Например, чтобы получить сведения о любом объекте модели Access, нужно раскрыть раздел Объекты Microsoft Access в папке Программирование, Справочник по языку Visual Basic Microsoft Access и затем щелкнуть на нужном объекте или семействе. Однако делать это вам придется, скорее всего, не очень часто, т. к. краткую информацию обо всех свойствах и методах объекта при написании программы в среде редактора VBA можно получить очень быстро, подключив оперативную подсказку или пользуясь Окном просмотра объектов.

Установка свойства объекта — это присвоение значения данному свойству. Поэтому для установки свойства используется оператор присваивания, например, чтобы установить свойство Visible (Вывод на экран) элемента управления формы, можно использовать инструкцию VBA:

Forms! Товары ! КодТовара . Visible = False

или

frm! КодТовара. Visible = False

Таким образом, ссылка на свойство объекта состоит из двух частей, разделенных точкой: ссылки на объект (любого вида) и имени свойства.

Получить свойство означает прочитать текущее значение этого свойства. Например, инструкция VBA

intCount = Forms . Count

присваивает переменной значение свойства Count семейства Forms.

Метод объекта в инструкциях VBA обозначается так же, как и свойство. Это видно и из приведенных в предыдущем разделе примеров, где мы использовали методы Append, Delete и Refresh семейства TableDefs. Однако, в отличие от свойств, методы могут иметь аргументы. Например, в следующей инструкции VBA применяется метод OpenReport объекта DoCmd.

DoCmd.OpenReport "Вакинсии", acPreview

Объект DoCmd — это специальный объект, который позволяет в программах VBA выполнять макрокоманды. Имя каждой макрокоманды является методом этого объекта. В приведенном примере создается отчет "Вакансии" в режиме Предварительного просмотра. При этом метод OpenReport не возвращает никакого значения, и аргументы в данном случае не требуется заключать в скобки.

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

Dim db As Database, rs As Recordset

Set db = CurrentDB

Set rs = db.OpenRecordset ("Сотрудники")

.............................

rs.Close

db.Close

Метод OpenRecordset объекта Database возвращает ссылку на объект Recordset (Набор записей), присваиваемую объектной переменной rs. Метод close, который имеют оба объекта — Recordset и Database, — не использует аргументов.



Типы данных VBA



Таблица 13.1. Типы данных VBA

Тип данных

Описание

Array

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

Boolean Требуемая память: зависит от размеров массива Принимает одно из двух логических значений: True или False. Требуемая память: 2 байта
Byte Число без знака от 0 до 255 Требуемая память: как нетрудно догадаться, 1 байт
Currency

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

Диапазон возможных значений: от -922 337 203 685 477,5808 до 922 337 203 685 477,5807.

Требуемая память: 8 байтов. Символ определения типа по умолчанию: @

Date Используется для хранения дат. Диапазон возможных значений: от 1 января 0100 г. до 31 декабря 9999 г. Требуемая память: 8 байтов
Double

Числовые значения с плавающей точкой двойной точности.

Диапазон возможных значений для отрицательных чисел: от -1 ,797693 13486232Е308 до -4,94065645841 247Е-324.

Диапазон возможных значений для положительных чисел: от 4,94065645841 247Е-324 до 1, 7976931 3486232Е308.

Требуемая память: 8 байтов. Символ определения типа по умолчанию: #

Integer Короткие целые числовые значения. Диапазон возможных значений: от -32 768 до 32 767. Требуемая память: 2 байта. Символ определения типа по умолчанию: %
Long

Длинные целые числовые значения.

Диапазон возможных значений: от -2 147 483 648 до 2 147 483 647.

Требуемая память: 4 байта. Символ определения типа по умолчанию: &

Object Используется только для хранения ссылок на объекты. Требуемая память: 4 байта

Тип данных

Описание

Single

Числовые значения с плавающей точкой обычной точности.

Диапазон возможных значений для отрицательных чисел: от -3.402823Е38 до -1 ,401 298Е-45.

Диапазон возможных значений для положительных чисел: от 1 ,401 298Е-45 до 3.402823Е38.

Требуемая память: 4 байта. Символ определения типа по умолчанию: !

String

Используется для хранения строковых значений. Длина строки: от 0 до 64 Кбайтов. Требуемая память: 1 байт на символ. Символ определения типа по умолчанию: $

Variant

Может использоваться для хранения различных типов данных: даты/времени, чисел с плавающей точкой, целых чисел, строк, объектов.

Требуемая память: 16 байтов, плюс 1 байт на каждый символ строковых значений.

Символ определения типа по умолчанию: отсутствует

Определяемый пользователем тип

Определяемые пользователем типы данных, назначение и размер выделяемой памяти зависят от определения. Используется для описания структур данных. Позволяет хранить в переменной такого типа множество различных значений разного типа

При описании переменной указание типа данных может быть опущено. Тип переменной в таком случае определяется последним символом имени переменной: @, #, %, &, ! или $ (Currency, Double, Integer, Long, Single или String соответственно). Например, поскольку символ "$" является символом определения типа для строковых данных, то переменная под именем text$ автоматически становится переменной типа "строка символов". В дальнейшем этот специальный символ указания типа данных может быть опущен, однако постоянное присутствие в имени переменной символа определения типа будет напоминать о том, к какому типу данных относится эта переменная, что поможет избежать ошибок использования несовместных типов данных.

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

Учтите также, что нельзя использовать в одной и той же процедуре имена переменных, отличающиеся друг от друга только специальным символом определения типа в конце переменной. Например, не допускается одновременное использование переменных var$ и var%. He допускается и явное объявление переменной, уже содержащей символ определения типа в конце имени, с помощью описателя As <типПеременной> (даже если такое определение не противоречит обычному применению символа определения типа). Так, например, вы получите сообщение об ошибке, попытавшись ввести любое из следующих определений:

Dim var1% As String

Dim var2% As Integer

Для определения типа данных аргументов процедуры или функции используется описание типа данных непосредственно в заглавной строке процедуры или функции. Например, следующая заглавная строка процедуры описывает ее параметры как переменные строкового типа:

Sub SplitStr(str1 As String,

str2 As String, str3 As String)

Определение типа данных возвращаемого функцией значения завершает заглавную строку функции, например:

Function FindSplitSpace

(strl As String) As Integer

описывает возвращаемое функцией значение как переменную короткого целого типа.

Чтобы программа работала быстрее и занимала меньше памяти, рекомендуется использовать, когда это возможно, конкретные типы переменных, а не универсальный тип Variant. На обработку переменных типа Variant требуется не только дополнительная память (сравните размеры, приведенные в табл. 13.1), но и дополнительное время: требуется выяснить, к какому конкретному типу данных принадлежит такая переменная в момент обработки, а также при необходимости выполнить преобразование данных к нужному типу. Может показаться, что в таком случае лучше вообще не использовать подобные переменные. Это не так. Часто подобные переменные просто необходимы: например, в том случае, когда вы точно не уверены, какие именно данные будут присвоены переменной.

Приведем здесь лишь один пример. Если вы хотите, чтобы пользователь программы ввел некоторое целое значение, необходимое для дальнейшей работы программы, и описали для этого переменную целого типа, то рекомендуется использовать для ввода данных промежуточную переменную, описанную как Variant, а затем выполнить присваивание введенного значения нужной переменной (или же описать переменную, в которую вы хотите поместить это значение как Variant, несмотря на то, что ввести предполагается именно целое число). Дело в том, что пользователь может ошибиться и ввести, например, вещественное число или вообще нечаянно нажать не на ту клавишу и ввести строковое значение. В таком случае при присваивании введенного значения переменной целого типа произойдет ошибка во время выполнения программы. Если же переменная для ввода будет объявлена как Variant, ничего страшного не случится: введенное значение будет благополучно присвоено этой переменной, а вы получите возможность проанализировать введенное значение и попросить пользователя повторить ввод, если введенное им значение не отвечает нужным условиям.

И в завершение этого раздела обсудим использование именованных констант. Для их описания применяется оператор Const, схожий с оператором описания переменных Dim. Вот синтаксис этого оператора:

Const <имяКонстанты>

[As <типДанных>] = <выражение>

где <выражение> — эго любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы. Например, следующий оператор определяет целую константу maxLen:

Const maxLen% = 30

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

Совет

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

Кроме описываемых пользователем констант, существуют еще предопределенные встроенные константы, которые включаются в тексты программ без предварительного описания. Сведения о предопределенных встроенных константах, используемых для различных объектов приложений Microsoft Office и Visual Basic, можно найти в справке—в разделах описания свойств объектов (реже — в разделах описания методов). При именовании встроенных констант используется стандартное соглашение, позволяющее определить, к объектам какого приложения относится эта константа. Например, встроенные константы, относящиеся к объектам Access, начинаются с префикса ас, относящиеся к объектам Excel — с префикса xl, относящиеся к объектам Word — с префикса wd, а относящиеся к объектам VBA — с префикса vb.

Например, в команде

DoCmd.OpenForm "Orders",

acNormal, , stLinkCriteria

используется встроенная константа Access acNormal.



Синтаксис операторов цикла Do



Таблица 13.2. Синтаксис операторов цикла Do

Конструкция

Описание

Do While <условие> <блокОператоров> Loop


Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, пока это условие выполняется (то есть имеет значение True), иными словами, в этой конструкции указывается условие продолжения работы цикла


Do Until <условие> <блокОператоров> Loop Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным, иными словами, в этой конструкции указывается условие прекращения работы цикла
Do <блокОператоров> Loop Until <условие> Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, если это условие еще не выполнено, а когда оно станет истинным, цикл прекращает работу, иными словами, в этой конструкции указывается условие прекращения работы цикла

Do

<блокОператоров> Loop While <условие>

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

Имеется также две разновидности оператора цикла с перечислением For. . .Next. Очень часто при обработке массивов, а также в тех случаях, когда требуется повторить выполнение некоторой группы операторов заданное число раз, используется цикл For. . .Next со счетчиком. В отличие от циклов Do. . .Loop, данный тип цикла использует специальную переменную, называемую счетчиком, значение которой увеличивается или уменьшается при каждом выполнении тела цикла на определенную величину. Когда значение этой переменной достигает заданного значения, выполнение цикла заканчивается.

Синтаксис этого вида цикла выглядит, следующим образом (в квадратные скобки заключены необязательные элементы синтаксической конструкции):

For <счетчик> = <начальноеЗначение>

То <конечноеЗначение>

[Step <приращение>]

<блокОператоров> Next [<счетчик>]

Несколько пояснений к приведенному описанию:

<приращение> — может быть как положительным, так и отрицательным числом. Если использовать отрицательное приращение, то конечное значение должно быть меньше либо равно начальному значению для того, чтобы тело цикла выполнилось хотя бы один раз;
после завершения работы цикла For. . .Next переменная, которая использовалась в качестве счетчика, получает значение, обязательно превосходящее конечное значение в том случае, если приращение положительно, и строго меньшее конечного значения, если приращение отрицательно;
если начальное и конечное значения совпадают, тело цикла выполняется лишь один раз.

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

For Each <элемент> In <совокупность>

<блокОператоров>

Next [<элемент>]

где:

<элемент> — это переменная, используемая для ссылки на элементы семейства объектов;

<совокупность> — это имя массива или семейства.

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

Public Sub EnumerateAllFields()

Dim MyBase As Database

Dim tdf As TableDef, fid As Field

Set MyBase = CurrentDb()

For Each tdf In MyBase.TableDefs

Debug.Print "Таблица: " & tdf.Name

For Each fid In tdf.Fields

Debug.Print " Поле: " & fid.Name Next fid

Next tdf

Set MyBase = Nothing

End Sub

Итак, в операторах Dim мы объявили переменную MyBase как объект "база данных DАО", переменные tdf и fid — как определение таблицы и поле таблицы, соответственно. Оператор Set назначает переменной MyBase текущую открытую базу данных. Далее для каждого определения таблицы выполняется вывод на печать названия таблицы, а затем вложенный цикл такого же типа печатает названия всех ее полей.

Приведем еще один пример использования подобного оператора цикла For Each. . .Next для обработки всех элементов многомерного массива. Пусть у нас имеется трехмерный числовой массив из 1000 элементов (размерами 10x10x10), который мы хотим заполнить случайными вещественными числами в диапазоне от 0 до 1. Если бы мы применяли обычные циклы For. . .Next со счетчиками, используя счетчики в качестве индексов элементов массива, то для решения этой задачи потребовалось бы написать три вложенных цикла For. . . Next:

Dim tArray{9, 9, 9) As Single

Dim i%, j%, k%

Randomize

For i=0 To 9

For j=0 To 9

For k=0 To 9

tArray(i, j, k) = Rnd()

Next k

Next j

Next i

На самом же деле достаточно всего одного цикла, если вместо циклов со счетчиками воспользоваться циклом For Each . . . Next:

Dim tArray(9, 9, 9) As Single

Dim elem As Variant

Randomize

For Each elem In tArray

elem = Rnd()

Next

Еще раз порекомендуем использовать отступы при записи циклов, так же, как и при записи операторов ветвления.



Описание основных...



Таблица 13.3. Описание основных элементов объектной модели Microsoft Access 2002

Объект

Тип

Описание

Application
Объект Ссылается на активное приложение Microsoft Access. Используется для управления приложением. Этот объект является" СОМ-компонентом и может быть использован другим приложением, которое поддерживает Automation

Forms

Семейство

Содержит объекты Form, соответствующие


 

всем открытым в данный момент формам в


 

базе данных Access

Form

Объект

Ссылается на конкретную форму Access,


 

описывает свойства формы, элементы


 

управления и модуль, содержащий процедуры формы. Каждый объект Form содержит в


 

качестве свойства по умолчанию семейство


 

Controls, представляющее элементы


 

управления данной формы. Поэтому доступ


 

к элементам управления формы может осу-


 

ществляться двумя способами: явно (как к


 

элементу семейства Controls) и неявно


 

(как к элементу объекта Form):


 

Forms ! Заказы. Controls ШомерЗаказа,


 

Forms ! Заказы ! НомерЗаказа.


 

Последний способ доступа обрабатывается


 

быстрее

Reports

Семейство

Содержит объекты Report, соответствую щие всем открытым в данный момент отчещие всем открытым в данный момент отчетам в базе данных Access




 


 

Report

Объект

Ссылается на конкретный отчет Access, опи-


 

сывает свойства отчета, элементы управле-


 

ния и модуль, содержащий процедуры отче-


 

та. Доступ к элементам управления отчета


 

осуществляется с помощью семейства


 

Controls (свойства по умолчанию) двумя


 

способами — явно или неявно

Modules

Семейство

Содержит объекты Module, соответствую-


 

щие всем открытым в данный момент стан-


 

дартным модулям и модулям объектов в


 

базе данных Access

Module

Объект

Ссылается на конкретный стандартный мо-


 

дуль или модуль класса Access, описывает


 

содержимое модуля в строках кода.


 

Приложение Microsoft Access, кроме стан-


 

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


 

там, модулей форм и отчетов, привязанных,


 

соответственно, к форме или отчету, может


 

иметь модули классов, не зависящие от


 

других объектов приложения и определяю-


 

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


 

с помощью свойства Туре

Объект

Тип

Описание

References

Семейство

Содержит объекты Reference, представ-



ляющие собой установленные ссылки в при-



ложении Access, С помощью данного семей-



ства в приложении можно динамически



устанавливать или удалять ссылки на внеш-



ние библиотеки

Reference

Объект

Соответствует ссылке, установленной на



библиотеку объектов или типов, содержит



информацию о ссылке, включая имя биб-



лиотеки и путь к соответствующему файлу

Printers

Новое семей-

Содержит объекты Printer, представляю-


ство

щие собой установленные ссылки на все



печатающие устройства, доступные в при-



ложении

Printer

Новый объект

Ссылается на конкретное печатающее уст-



ройство

Da taAccess Pages

Семейство

Содержит объекты DataAccessPages, со-



ответствующие открытым в данный момент



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



или проекте Access

DataAccessPage

Объект

Ссылается на конкретную страницу доступа



к данным Access. Описывает свойства стра-



ницы

Screen

Объект

Ссылается на конкретную форму, отчет или



элемент управления, который в данный мо-



мент имеет фокус

DoCmd

Объект

Позволяет выполнить макрос или встроен-



ную инструкцию Access с помощью проце-



дуры на Visual Basic

VBE

Объект из

Предоставляет доступ к функциональным


библиотеки

средствам редактора Visual Basic для Micro-

VBIDE

soft Access

DefaultWebOptions

Объект

Предоставляет доступ к атрибутам приложе-



ния, используемым в Access по умолчанию



при открытии и сохранении Web-страниц

WebOptions

Новый объект

Предоставляет доступ к атрибутам конкрет-



ной страницы доступа к данным, используе-



мым в Access при открытии и сохранении



Web-страниц. Эти атрибуты имеют более



высокий приоритет, чем соответствующие



атрибуты приложения. Если установлены



атрибуты страницы доступа к данным, то


соответствующие атрибуты приложения для



работы с Web-страницами игнорируются.

Объект

Тип

Описание

References

Семейство

Содержит объекты Reference, представляющие собой установленные ссылки в приложении Access. С помощью данного семейства в приложении можно динамически устанавливать или удалять ссылки на внешние библиотеки

Reference

Объект

Соответствует ссылке, установленной на библиотеку объектов или типов, содержит информацию о ссылке, включая имя библиотеки и путь к соответствующему файлу

Printers

Новое семейство

Содержит объекты Printer, представляющие собой установленные ссылки на все печатающие устройства, доступные в приложении

Printer

Новый объект

Ссылается на конкретное печатающее устройство

DataAccessPages

Семейство

Содержит объекты DataAccessPages, соответствующие открытым в данный момент страницам доступа к данным в базе данных или проекте Access

DataAccessPage


Объект

Ссылается на конкретную страницу доступа к данным Access. Описывает свойства страницы

Screen

Объект

Ссылается на конкретную форму, отчет или элемент управления, который в данный момент имеет фокус

DoCmd

Объект

Позволяет выполнить макрос или встроенную инструкцию Access с помощью процедуры на Visual Basic

VBE

Объект из библиотеки VBIDE

Предоставляет доступ к функциональным средствам редактора Visual Basic для Microsoft Access

DefaultWebOptions

Объект

Предоставляет доступ к атрибутам приложения, используемым в Access по умолчанию при открытии и сохранении Web-страниц

WebOptions

Новый объект

Предоставляет доступ к атрибутам конкретной страницы доступа к данным, используемым в Access при открытии и сохранении Web-страниц. Эти атрибуты имеют более высокий приоритет, чем соответствующие атрибуты приложения. Если установлены атрибуты страницы доступа к данным, то соответствующие атрибуты приложения для работы с Web-страницами игнорируются.

Объект

Тип

Описание


 

Если изменяются атрибуты страницы досту-


 

па к данным, автоматически такие же значе-


 

ния получают атрибуты приложения. Поэто-


 

му полезно сохранять текущие атрибуты


 

приложения, чтобы восстанавливать их по-


 

сле изменения атрибутов страницы доступа


 

к данным

DBEngine

Объект из библиотеки DAO

Является объектом самого верхнего уровня в


 

объектной модели DАО. Позволяет использовать объекты доступа к данным в приложении Access

Current Project

Объект

Ссылается на программный проект


 

(представляющий совокупность всех про-


 

граммных модулей, включая стандартные


 

модули и модули классов) текущей базы


 

данных или проекта Microsoft Access. Этот


 

объект содержит семейства объектов


 

AccessObjects, соответствующих реаль-


 

ным объектам базы данных или проекта:


 

AllForms, AllReports, AllMacros,


 

AllModules, AllDataAccessPages.


 

Перечисленные семейства включают в себя


 

все реальные объекты базы данных, незави-


 

симо от того, открыты они или закрыты в


 

данный момент

CurrentData

Объект

Ссылается на объекты, сохраненные прило-


 

жением — источником данных (ядром Jet или


 

SQL-сервером) в текущей базе данных. Со-


 

держит семейства объектов AccessObject:


 

AllTables, AllQueries, AllViews,


 

AllStoredProcedures, All Functions,


 

AllDatabaseDiagrams.


 

Перечисленные семейства включают в себя


 

все реальные объекты базы данных, незави-


 

симо от того, открыты они или закрыты в


 

данный момент

CodeProject

Объект

Ссылается на программный проект кода той


 

базы данных (или проекта Microsoft Access),


 

в которой выполняется (и содержится) код


 

VBA, включающий данную ссылку.


 

Этот объект содержит семейства объектов


 

AccessObjects, соответствующих реаль-


 

ным объектам базы данных или проекта:


 

AllForms, AllReports, AllMacros,


 

AllModules, AllDataAccessPages.

Объект

Тип

Описание


 

Перечисленные семейства включают в себя


 

все реальные объекты базы данных, незави-


 

симо от того, открыты они или закрыты в


 

данный момент

CodeData

Объект

Ссылается на объекты, сохраненные прило-


 

жением — источником данных (ядром Jet или


 

SQL-сервером) в той базе данных, в которой


 

выполняется (и содержится) код VBA, вклю-


 

чающий данную ссылку. Содержит семейст-


 

ва объектов AccessObj ect:


 

AllTables, AllQueries, AllViews,


 

AllStoredProcedures, All Functions,


 

AllDatabaseDiagrams.


 

Перечисленные семейства включают в себя


 

все реальные объекты базы данных, незави-


 

симо от того, открыты они или закрыты в


 

данный момент

Controls

Семейство

Содержит объекты Control, представляю-


 

щие все элементы управления в конкретной


 

форме, отчете или секции, вложенные или


 

присоединенные элементы управления. Это


 

семейство является свойством объектов


 

Form, Report, Section и Control

Control

Объект

Представляет собой любой конкретный эле-


 

мент управления в форме, отчете или сек-


 

ции, вложенный или присоединенный эле-


 

мент управления. Объект Control может


 

ссылаться на один из объектов, характери-


 

зующих элемент управления определенного


 

типа, такой как:


 

CheckBox, TextBox, ComboBox,


 

CommandButton, CustomControl,


 

BoundObjectFrame, Image, ListBox,


 

ObjectFrame, OptionButton,


 

OptionGroup, Page, Section, SubForm,


 

TogleButton

FormatConditions

Семейство

Содержит объекты FormatCondition и


 

представляет набор форматов по условию


 

для объекта TextBox или ComboBox

Forma tCondit ion

Объект

Представляет форматирование по условию,


 

определенное для элемента управления


 

типа поле ввода (объект TextBox) или спи-


 

сок с полем ввода (объект ComboBox)

Объект

Тип

Описание

AccessObjectProperties Семейство

Содержит настраиваемые объекты

AccessObj ectProperty, описывающие свойства и однозначно характеризующие конкретный объект AccessObject, CodeData, CodeProject, CurrentData или CurrentProject

AccessObject

Объект

Ссылается на реальный объект Microsoft Access в любом из семейств:

AllForms, AllReports, AllMacros, AllModules, AllDataAccessPages, AllTables, AllQueries, AllViews, AllStoredProcedures, All Functions, AllDatabaseDiagrams.

В зависимости от того, к какому семейству он принадлежит, этот объект представляет собой любой из объектов Access: таблицу (Table), запрос (Query), отчет (Report), форму (From), модуль (Module), макрос (Macro), страницу доступа к данным (Data access page), представление (view), хранимую процедуру (stored procedure) или схему базы данных (Database diagram). Объект AccessObject ссылается на существующий объект базы данных, нельзя создать новый или удалить существующий объект AccessObject

AccessObjectProperty

Объект

Представляет встроенные или определенные пользователем характеристики (свойства) любого объекта AccessObject, CodeData, CodeProject, CurrentData или CurrentProject

В Microsoft Access 2002 появились два новых семейства, содержащих новые объекты:

Printers — обеспечивает программное управление параметрами печати. Теперь есть возможность вывести документ на печать на любой из доступных принтеров, указать количество копий документа, который нужно напечатать, определить размер страницы и поля и т. д.
AllFunctions — используется для программного доступа к пользовательским функциям, определенным в базе данных Microsoft SQL Server (объект, аналогичный запросу, который существует в проекте Microsoft Access). Этот объект может быть открыт в режиме Конструктора, режиме Таблицы, режиме Предварительного просмотра и в режиме Сводной таблицы или Сводной диаграммы как обычный запрос.



Описание объектов доступа к данным



Таблица 13.4. Описание объектов доступа к данным

Семейство

Объект

Описание

Connections

Connection

Предоставляет информацию о соединении с источником данных ODBC (используется только в рабочей области ODBCDirect)

Containers

Container

Хранилище информации об объекте предопределенного типа (используется только в рабочей области Microsoft Jet)

Databases

Database DBEngine

Открытая база данных Главный объект ядра баз данных Microsoft Jet

Documents

Document

Информация о сохраненном объекте предопределенного типа (используется только в рабочей области Microsoft Jet)

Errors

Error

Информация об ошибках, ассоциированных с данным объектом

Fields

Field

Представляет поле (столбец) таблицы, запроса, индекса, поле связи между таблицами или запросами или поле набора записей

Groups

Group

Группа пользователей, определяющая права доступа к данным (используется только в рабочей области Microsoft Jet)

Indexes

Index

Определяет порядок и уникальность значений в таблице (используется только в рабочей области Microsoft Jet)

Parameters

Parameter

Параметр для параметризованного запроса

Семейство

Объект

Описание

Properties

Property

Встроенная или определенная пользователем характеристика (свойство)

QueryDef s

QueryDef

Описание хранимого в базе данных запроса

Recordsets

Recordset

Набор записей в базовой таблице или запросе

Relations

Relation

Связь между полями таблиц или запросов (используется только в рабочей области Microsoft Jet)

TableDefs

TableDef

Описание хранимой в базе данных таблицы (используется только в рабочей области Microsoft Jet)

Users

User

Бюджет пользователя, определяющий права доступа к данным (используется только в рабочей области Microsoft Jet)

Workspases

Workspace

Сеанс работы с источником данных с помощью ядра баз данных Microsoft Jet



Объектная модель ADODB



Таблица 13.5. Объектная модель ADODB

Объект

Тип

Описание

Connection

Объект

Открывает сеанс обмена данными

Command

Объект

Представляет собой инструкцию SQL

Parameter

Объект

Представляет собой параметр инструкции SQL

Recordset

Объект

Представляет собой набор записей и позволяет осуществлять навигацию по записям и манипулировать с данными в нем

Field

Объект

Представляет собой поле (столбец) в наборе записей

Recordset

Error

Объект

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

Property

Объект

Представляет характеристику (свойство) любого объекта ADO

Errors

Семейство

Все объекты Error в этом семействе создаются в ответ на одну ошибку, произошедшую во время сеанса связи

Parameters

Семейство

Содержит все объекты Parameter, ассоциированные с объектом Command

Fields

Семейство

Содержит все объекты Field, ассоциированные с набором записей Recordset

Properties

Семейство

Содержит все объекты Property, ассоциированные с объектом Connection, Command, Recordset или Field

Record

Объект

Представляет собой каталог или файл

Stream

Объект

Представляет собой содержимое файла



Объектная модель ADOX



Таблица 13.6. Объектная модель ADOX

Объект

Тип

Описание

Catalog Объект Главный объект этой модели. Ссылается на источник данных и обеспечивает доступ ко всем объектам источника — таблицам, представлениям, процедурам, группам, пользователям

Tables

Семейство

Семейство таблиц, содержащихся в источнике данных. Каждый объект Table этого семейства ссылается на одну таблицу

Indexes

Семейство

Содержит все индексы таблицы. Каждый объект Index семейства ссылается на один из индексов

Keys

Семейство

Содержит все ключи таблицы. Каждый объект Key семейства ссылается на один из ключей

Columns

Семейство

Содержит объекты Column, которые ссылаются на столбцы в одном из объектов Table, Index, Key

Groups

Семейство

Содержит все объекты Group каталога или пользователя. Каждый из объектов Group ссылается на бюджет группы в каталоге или пользователе

Users

Семейство

Содержит объекты User, которые представляют собой бюджеты пользователей, имеющих права доступа к защищенной базе данных

Procedures

Семейство

Содержит все хранимые процедуры в базе данных. Каждый объект Procedure семейства ссылается на одну из хранимых процедур

Views

Семейство

Содержит все представления (view) в базе данных

Иерархическая структура модели объектов ADOX представлена на рис. 13.6.



Описание объектов JRO



Таблица 13.7. Описание объектов JRO

Объект

Тип

Описание

JetEngine

Объект

Обеспечивает доступ к двум сервисам ядра базы данных Jet: сжатие базы данных и выгрузка данных из кэша в файл базы данных MDB

Replica Объект Представляет собой копию реплицированной базы данных
Filters Семейство Содержит набор объектов Filter, каждый из которых представляет собой набор записей, которые должны реплицироваться

Более подробное описание объектов JRO и их использования приведено в гл. 18.

В случае разработки многоуровневого клиент-серверного приложения для доступа к данным используется еще одна объектная модель — RDS (служба удаленного доступа к данным). Она включает три объекта, краткое описание которых приведено в табл. 13.8.



Объектная модель RDS



Таблица 13.8. Объектная модель RDS

Объект

Тип

Описание

RDS .DataSpace

Объект

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

RDSServer. DataFactory Объект Представляет собой встроенную программу — сервер данных, которая выполняет обработку данных и возвращает результат обработки
RDS.DataControl Объект Этот объект может использоваться для следующих целей: автоматическое выполнение функций объектов RDS. DataSpace и RDSServer .DataFactory, выполнение обработки данных или возвращение результата с помощью встроенных служб RDS, представление результата обработки данных в виде совокупности значений для визуальных элементов управления (в форме)



Описание объектов Microsoft Office 2002



Таблица 13.10. Описание объектов Microsoft Office 2002

Объект

Тип

Описание

AnswerWizard

Объект

Соответствует Мастеру ответов приложе-





ния Microsoft Office. Все приложения се-



мейства Microsoft Office имеют только



один Мастер ответов, поэтому все изме-





нения над этим объектом немедленно





отразятся на активном приложении

Assistant

Обьект и

Ссылается на объект, представляющий



семейство

активного в данный момент помощника





Microsoft Office

COMAddlns

Семейство

Содержит объекты COMAddln, соответст-





вующие надстройкам СОМ, зарегистри-





рованным в реестре Windows

CoiranandBars

Семейство

Содержит объекты CommandBar, соот-





ветствующие панелям команд приложе-





ния-контейнера (это могут быть строки





меню, панели инструментов, меню и кон-





текстные меню)

DocumentProperties

Семейство

Содержит объекты DocumentProperty,





каждый из которых представляет собой





набор встроенных или определенных





пользователем характеристик (свойств)





документа-контейнера

FileDialog

Новый

Реализует диалоговое окно, аналогичное



объект

окнам Открыть (Open) и Сохранить





(Save) Microsoft Office

FileDialogFilters

Новое се-

Содержит объекты FileDialogFilter,



мейство

которые представляют собой фильтры, оп-





ределяющие, какие файлы будут отобра-





жаться в диалоговом окне FileDialog

FileDialogSelectedl terns

Новое се-

Семейство строковых значений, пред-



мейство

ставляющих собой пути к файлам или



папкам, выбранным в диалоговом окне



FileDialog

FileSearch

Объект

Реализует функциональность стандарт-





ного диалогового окна открытия файла

FileTypes

Новое се-

Семейство значений типов файлов, кото-



мейство

рые возвращаются методом Execute





диалогового окна FileDialog

HTMLProject

Объект

Представляет собой корень дерева проек-





та Web-страницы, отображаемого в окне





просмотра проекта Project Explorer ре-





дактора сценариев Microsoft Script Editor.

Объект

Тип

Описание





Этот объект содержит семейство





HTMLProjectltems объектов





HTMLProjectltem, ссылающихся на эле-





менты иерархической структуры проекта.





С помощью этого объекта можно управлять





проектом Web-страницы, например открыть





его в редакторе сценариев

LanguageSet tings

Объект

Предоставляет информацию о языковых





настройках приложения семейства Micro-





soft Office

MsoEnvelope

Новый

Обеспечивает возможность отправки до-



объект

кументов по электронной почте

NewFile

Новый

Содержит список строковых значений,



объект

которые отображаются в группе Создание





(New) на панели задач

ODSOColumns

Новое се-

Объекты этого семейства представляют



мейство

собой поля в файле для слияния с доку-





ментом Word

ODSOFilters

Новое се-

Объекты этого семейства представляют



мейство

собой фильтры, которые применяются к





файлу — источнику данных для документа





слияния

Off iceDataSourceObject

Новый

Представляет собой источник данных для



объект

операции слияния

SearchFolders

Новое се-

Содержит набор объектов, представляю-



мейство

щих собой папки, в которых ведется поиск





при использовании объекта FileSearch

SignatureSet

Новое се-

Содержит набор объектов Signature, каж-



мейство

дый из которых представляет собой цифро-





вую подпись, связанную с документом

WebPageFonts

Семейство

Содержит набор объектов WebPageFont,





каждый из которых соответствует одному из





поддерживаемых национальных стандартов.





Каждый объект определяет шрифты и их





размеры, которые используются по умолча-





нию при сохранении документа в формате





Web-страницы

Scripts

Семейство

Содержит объекты Script, соответствую-





щие сценариям, определенным в документе





Word, электронной таблице Excel или слай-





де PowerPoint. С помощью этого объекта





можно управлять сценариями документа,





например создавать новые сценарии




Команды меню Debug



Таблица 13.11. Команды меню Debug

Команда

Назначение

Compile

(Компиляция)

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

Step Into (Шаг с за ХОДОМ)

Исполняет очередную строку кода с заходом в процедуры

Step Over (Шаг с обходом)

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

Step Out (Шаг с выходом)

Выполняет остаток текущей процедуры и останавливается в вызывающей программе на следующей строке после вызова этой процедуры

Run to Cursor

(Запуск до курсора)

Выполняются все строки кода от текущей строки до строки, в которой установлен курсор. Останавливается перед этой строкой

Add Watch

(Добавление контрольного значения)

Открывает окно Добавление контрольного значения

Edit Watch

(Изменение контрольного значения)

Открывает окно Изменение контрольного значения

Quick Watch

(Быстрый просмотр)

Выводит в специальном окне текущее значение выражения в точке останова

Toggle Breakpoint

(Установка/сброс точек останова)

Устанавливает/снимает точку останова на строку, в которой находится курсор

Clear All Breakpoints

(Сброс всех точек останова)

Снимает все точки останова, установленные в данном модуле

Set Next Statement

(Установка следующего предложения)

Устанавливает очередную выполняемую команду на строку, в которой находится курсор

Show Next Statement

(Показ следующего предложения)

Отображает в окне редактора очередную команду для выполнения

Кнопки на инструментальной панели в основном повторяют описанные команды. Это видно из значков, находящихся рядом с командой и на кнопках. Кроме того, здесь существуют кнопки, соответствующие меню Run:

Run Sub/UserForm — продолжает выполнение процедуры после точки останова, снимая при этом пошаговый режим, если он был установлен;
Break — прекращает выполнение процедуры;
Reset (Сброс) — прекращает выполнение процедуры и присваивает переменным начальные значения по умолчанию.

Еще несколько кнопок инструментальной панели позволяют открыть специальные окна отладки.



Комбинации клавиш...



Таблица 13.12. Комбинации клавиш быстрого вызова редактирования и отладки кода VBA

Комбинация клавиш

Назначение

<F7>

Открыть окно редактора кода

<Ctrl>+<F>

Найти

<Ctrl>+<F>

Заменить

<F3>

Найти далее

<Shift>+<F3>

Найти ранее

<Ctrl>+<t>

К следующей процедуре

<Ctrl>+<n>

К предыдущей процедуре

<Ctrl>+<J>

List Properties/Members

<Ctrl>+<Shift>+<J>

List Constant

Комбинация клавиш

Назначение

<Ctrl>+<|>

Quick Info

<Ctrl>+<Shift>+<|>

Parameter Info

<СМ>+<Пробел>

Закончить слово

<F5>

Продолжить

<Shift>+<F5>

Сброс

<F8>

Шаг с заходом

<Shift>+<F8>

Шаг с обходом

<Ctrl>+<Shift>+<F8>

Шаг с выходом

<F9>

Установка/сброс точки останова

<Shift>+<F9>

Вызов окна Quick Watch

<Ctrl>+<Shift>+<F9>

Сброс всех точек останова

<F2>

Вызов окна просмотра объектов Object Browser

<Shift>+<F2>

Definition

<Ctrl>+<Shift>+<F2>

Last Position

<Ctrl>+<G>

Вызов окна Immediate

<Ctrl>+<L>

Вызов окна Call Stack



Текущая запись



Текущая запись

Событие Текущая запись (Current) происходит, когда очередная запись получает фокус или выполняется повторное обращение к источнику данных формы — таблице или запросу. Таким образом, оно возникает как при открытии формы, так и при переходе от одной записи к другой. Чаще всего это событие используется для синхронизации записей в связанных формах.



Удаление



Удаление

Событие Удаление (Delete) происходит, когда пользователь пытается удалить запись из формы. Оно происходит до того, как запись реально удаляется из базы данных. Процедура обработки этого события имеет параметр Cancel. Установка значения этого параметра в процедуре равным True позволит предотвратить удаление записи.



Уход с записи



Уход с записи

Событие Уход с записи (RecordExit) происходит всякий раз, когда пользователь пытается выйти (переместить фокус) с текущей записи: перейти к другой записи, закрыть форму, обновить данные в форме и т. д. Процедура обработки этого события может использоваться для проверки корректности данных в текущей записи. Процедура имеет один параметр: cancel. Если установить его значение равным True, то можно запретить пользователю покидать текущую запись.



Управляющие конструкции



Управляющие конструкции

Как и во всех других языках программирования, в VBA имеются различные управляющие конструкции, позволяющие изменять порядок выполнения программы. Если управляющие конструкции не используются, происходит последовательное выполнение операторов языка программирования, начиная с самого первого и кончая последним. Хотя в некоторых самых простых случаях этого и бывает достаточно, обычно все-таки требуется изменять порядок исполнения операторов при выполнении определенных условий, либо пропуская выполнение некоторых операторов, либо, наоборот, многократно повторяя их. Оказывается, для реализации любых алгоритмов достаточно иметь только два вида конструкций управления: ветвления и циклы.



Установка ссылок на объектные библиотеки



Установка ссылок на объектные библиотеки

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

Visual Basic for Application;
Microsoft Access 10.0 Object Library;
Microsoft DAO 3.6 Object Library.

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

Откройте редактор VBA и выполните команду Tools, References (Сервис, Ссылки). В открывшемся диалоговом окне References (Ссылки) (рис. 13.24) найдите требуемую библиотеку и установите необходимый флажок.



Ветвления



Ветвления

Управляющие конструкции ветвления позволяют проверить некоторое условие и, в зависимости от результатов этой проверки, выполнить ту или иную группу операторов. Для организации ветвлений в VBA используются различные формы оператора ветвления If и-оператор выбора Select Case.

Простейшая, краткая форма оператора if используется для проверки одного условия, а затем либо выполнения, либо пропуска одного оператора или блока из не скольких операторов. Краткая форма оператора ветвления if может иметь как однострочную, так и блочную форму. В одну строку краткая форма If может быть записана так:

If <условие> Then <оператор>

В блочной форме краткое ветвление выглядит следующим образом:

If <условие> Then

<оператор1>

<оператор2>

End If

В качестве условия можно использовать логическое выражение, возвращающее значение True или False, или любое арифметическое выражение. Если применяется арифметическое выражение, то нулевое значение этого выражения эквивалентно логическому значению False, а любое ненулевое выражение эквивалентно True. В том случае, когда условие возвращает значение False, оператор или блок операторов, заключенных между ключевыми словами Then и End if и составляющих тело краткого оператора ветвления, не будет выполняться.

Замечание

Обратите внимание, что при записи краткого оператора ветвления в одну строку ключевые слова End I f не используются.

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

If <условие> Then

<блокОператоров1> Else

<блокОператоров2>

End If

Если условие истинно, выполняется первый блок операторов, заключенный между ключевыми словами Then и Else, а в противном случае — второй блок, заключенный между ключевыми словами Else и End If.

Совет

Для того чтобы текст вашей процедуры был понятным и удобным для восприятия, рекомендуется делать отступы для групп операторов так, как это указано при описании их синтаксиса. В VBA предусмотрено удобное средство изменения отступов — нажатие на клавишу <Таb> увеличивает отступ вправо, нажатие комбинации клавиш <Shift>+<Tab> уменьшает этот отступ.

Иногда приходится делать выбор одного действия из целой группы действий на основе проверки нескольких различных условий. Для этого можно использовать цепочку операторов ветвления If. . .Then. . . Elseif:

If <условие1> Then

<блокОператоров!>

Elseif <условие2> Then

<блокОператоров2>

Elseif <условие3> Then

<блокОператоровЗ>

Elseif <условиеN> Then

<блокОператоровN> Else

<блокОператоров_Еlsе>

End If

Такие цепочки операторов If.. .Then. . .Elseif обладают большой гибкостью и позволяют решить все проблемы, однако если выбор одной из нескольких возможностей все время основан на различных значениях одного и того же выражения, гораздо удобнее использовать специально предназначенный для этого оператор выбора Select Case, имеющий следующий синтаксис:

Select Case <проверяемоеВыражение>

Case <списокЗначений1>

<блокОператоров1>

Case <списокЗначений2>

<блокОператоров2>

Case <списокЗначенийЗ>

<блокОператоровЗ>

Case Else

<блокОператоровЕlsе>

End Select

Проверяемое выражение вычисляется в начале работы оператора Select Case. Это выражение может возвращать значение любого типа, например логическое, числовое или строковое.

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

Эти элементы списка выражений могут иметь одну из следующих форм:

<выражение> в данном случае проверяется, совпадает ли значение проверяемого выражения с этим выражением;
<выражение1> То <выражение2>в этом случае проверяется, находится ли значение проверяемого выражения в указанном диапазоне значений;
Is <логическийОператор> <выражение> в третьем случае проверяемое выражение сравнивается с указанным значением с помощью заданного логического оператора; например, условие is >= 10 считается выполненным, если проверяемое значение не меньше 10.

Если хотя бы один из элементов списка соответствует проверяемому выражению, то выполняется соответствующая группа операторов и на этом выполнение оператора Select Case заканчивается, а остальные списки выражений не проверяются, т. е. отыскивается только первый подходящий элемент списков выражений. Если же ни один из элементов всех этих списков не соответствует значению проверяемого выражения, выполняются операторы группы Else, если таковая присутствует.



Вход



Вход

Событие Вход (Enter) происходит перед тем, как элемент управления в форме получает фокус от другого элемента управления в той же форме или когда при открытии формы получает фокус первый элемент управления. Его удобно использовать для вывода на экран каких-либо сведений об этом элементе. Оно происходит до события Получение фокуса (GetFocus), но после события Текущая запись (Current).



Включение



Включение

Событие Включение (Activate) возникает, когда форма или отчет получают фокус, становясь активной формой или отчетом. Это происходит, когда форма или отчет открываются, когда пользователь щелкает мышью на одном из элементов управления, перенося, таким образом, фокус, и когда в программе VBA выполняется метод SetFocus объекта. Форма при этом обязательно должна быть видима. Событие Включение (Activate) возникает до события Получение фокуса (GetFocus). Это событие удобно использовать для того, чтобы вывести на экран панель инструментов, связанную с формой.



Внесены изменения



Внесены изменения

Событие Внесены изменения (Dirty), так же как и Изменение (Change), возникает в следующих ситуациях:

при изменении содержимого текстового поля или поля со списком, при этом изменением может быть любой непосредственно введенный или удаляемый символ;
при изменении значения свойства Текст (Text) элемента управления с помощью макроса или процедуры VBA;
в элементе управления Набор вкладок (Tab Control) при переходе с одной вкладки на другую.

Но в отличие от события Изменение (Change) оно относится к форме. Процедура имеет один параметр: Cancel. Если установить его значение равным True, то событие будет отменено. Отмена события будет вызывать откат всех изменений в записи, что эквивалентно нажатию клавиши <Esc>. Это событие удобно использовать для проверки, были ли изменения в записи.



Возврат



Возврат

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

Замечание

Событие Возврат (Retreat) не определено для верхних и нижних колонтитулов отчета.



Выгрузка



Выгрузка

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

Замечание

Если вы используете процедуру обработки события Выгрузка (Unload), в которой параметру Cancel присваивается значение True, не забудьте явно присвоить ему значение False в случае выполнения всех условий для закрытия формы. Иначе после того как этот параметр будет установлен в True, форму нельзя будет закрыть никогда.



Выход



Выход

Событие Выход (Exit) происходит перед тем, как данный элемент управления передаст фокус другому элементу управления той же формы, но до события Потеря фокуса (LostFocus).

Замечание

События Вход (Enter) и Выход (Exit) не определены для флажков и переключателей в группах, они определены только для группы как целого. События Вход (Enter) и Выход (Exit) не происходят, если фокус переходит к элементу другой формы или отчета. Это отличает их от событий Получение фокуса (GetFocus) и Потеря фокуса (LostFocus).



Выход из циклов и процедур



Выход из циклов и процедур

Обычно выполнение процедуры заканчивается после выполнения ее последнего оператора, а выполнение цикла — после нескольких выполнений тела цикла, когда достигнуто условие завершения его работы. Однако в некоторых случаях бывает нужно прекратить выполнение процедуры или цикла досрочно, избежав выполнения лишних операторов процедуры или лишних повторений цикла. Например, если при выполнении процедуры произошла ошибка, которая делает продолжение ее работы бессмысленным, можно выполнить команду немедленного выхода из процедуры. Другой пример: если цикл For. . .Next используется для поиска нужного значения в массиве, то после того, как нужный элемент массива найден, нет смысла продолжать дальнейший перебор элементов массива. Досрочный выход из управляющей конструкции можно осуществить с помощью одного из операторов Exit. Для досрочного выхода из циклов Do. . .Loop используется оператор Exit Do, a для выхода из циклов For — оператор Exit For. Для досрочного выхода из процедур и функций применяются операторы Exit Sub и Exit Function соответственно. Следует, однако, отметить, что хотя использование оператора Exit может быть вполне оправданным, необходимо избегать излишнего употребления этого оператора, прибегая к нему только в крайних случаях. Излишне частое употребление данного оператора затрудняет понимание написанного текста программы и его отладку.

Например, в следующем цикле поиска For. . .Next используется оператор Exit For:

ub = Ubound(dArray)

fFound = False

For i=LBound(dArray) To ub

If dArray(i) = searchValue Then

fFound = True

Exit For

End If Next

Однако такого применения оператора Exit вполне можно избежать. Вот пример подобного же цикла поиска, но без использования Exit:

i = Lbound(dArray)

ub = Ubound(dArray)

fFound = False Do

If dArray(i) = searchValue

Then fFound = True

i = i + 1

Loop Until (i > ub) Or fFound

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



В данной главе были приведены



Выводы

В данной главе были приведены основные сведения, необходимые для программирования приложений в Access 2002, и мы рассмотрели несколько примеров использования процедур обработки событий в формах. Овладев основным инструментарием и получив необходимые навыки, вы сможете сами создавать процедуры обработки событий в приложениях Access. Дальнейшие главы расширят ваше представление о возможностях языка VBA при интеграции приложений Access с другими компонентами семейства Microsoft Office, а также при создании сложных многопользовательских и клиент-серверных приложений.

Язык Visual Basic для приложений (VBA)


Следующие ниже подразделы данного раздела описывают синтаксис языка программирования VBA.



Загрузка



Загрузка

Событие Загрузка (Load) происходит сразу после события Открытие (Open), но в отличие от него не может быть отменено. Обычно его используют для динамического изменения свойств формы или элементов управления перед тем, как форма будет выведена на экран.



Закрытие



Закрытие

Событие Закрытие (Close) является последним перед тем, как форма будет удалена с экрана. Обычно его используют для открытия другой формы. Для отчета событие происходит, когда закрывается режим Предварительного просмотра или заканчивается печать отчета. Как и в случае с формой, его можно использовать для определения дальнейших действий пользователя.