Фильтрация записей в формах, отчетах, таблицах



Фильтрация записей в формах, отчетах, таблицах

Перейдем к примерам применения макрокоманд Access. Для отбора записей в формах, отчетах, таблицах используется макрокоманда Приме нить Фильтр (ApplyFilter). Задать фильтр можно двумя способами: либо указав имя заранее созданного фильтра в аргументе Имя фильтра (Filter Name), либо непосредственно задав условие выборки в аргументе Условие отбора (Where Condition). Если фильтр нужно применить сразу при открытии формы, тогда с событием Открытие (On Open) формы необходимо связать макрос, содержащий макрокоманду ПрименитьФильтр (ApplyFilter). Если нужно менять набор отображаемых записей в открытой форме динамически, поступают следующим образом:

создают в этой форме набор полей, в которых можно задать условия отбора;
создают кнопку Применить фильтр, с которой связывают макрос, содержащий макрокоманду ПрименитьФильтр (ApplyFilter). В качестве значения аргумента Условие отбора (Where Condition) для этой макрокоманды указывают выражение, содержащее ссылки на эти поля.


Пример такого решения приведен на рис. 11.15. На этом рисунке представлена форма "Товары" (Products), позволяющая просматривать товары с выборкой по различным критериям.

Эта форма построена на основе таблицы "Товары" (Products) с помощью Мастера автоматической генерации ленточных форм. Затем в режиме Конструктора форм к ней добавлены поля для определения критериев выбора и кнопки для применения и отмены фильтра. Соответствующие макросы, связанные с событием Нажатие, кнопки (On Click), приведены на рис. 11.16. Для отмены фильтра используется макрокоманда ПоказатьВсеЗаписи(ShowAllRecords).



Конструктор макросов и панель аргументов



Иллюстрация 11.1. Конструктор макросов и панель аргументов

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

Замечание

Для быстрого переключения между панелями описаний и аргументов, так же как при работе с таблицами и запросами в режиме Конструктора, можно использовать клавишу <F6>.

Существует еще один очень простой способ ввода макрокоманды. Допустим, нужно создать макрос, который должен открывать форму "Клиенты" (Customers) в приложении "Борей" (Northwind). Для этого в окне База данных (Database) необходимо щелкнуть по ярлыку Формы (Forms), затем, используя панель инструментов (способ 2), открыть окно Конструктор макросов (Macro Design) и перетащить с помощью мыши форму "Клиенты" (Customers) в поле "Макрокоманда" (Action) окна Конструктора макросов.

Совет

Для удобства перетаскивания объектов из окна База данных (Database) в форму выберите команду Окно, Слева направо (Window, Tile Vertically), чтобы расположить окна на экране рядом.

Тогда в поле "Макрокоманда" (Action) автоматически появится макрокоманда ОткрытьФорму (OpenForm) (рис. 11.2), а на панели аргументов автоматически заполнятся поля: в поле "Имя формы" (Form Name) появится имя формы "Клиенты" (Customers), в поле "Режим" (View) — значение по умолчанию Форма (Form), в поле "Режим окна" (Window Mode) — значение Обычное (Normal). Остальные поля останутся пустыми. Мы можем в этой же макрокоманде задать фильтр для отбора записей. Для этого введем в поле "Имя фильтра" (Filter Name) имя какого-нибудь фильтра, например "Менеджеры по продажам", который мы строили при изучении запросов (см. разд. "Создание запроса из фильтра" гл. 4).

Кроме того, можно сделать записи в этой форме недоступными для изменений, для чего в поле Режим данных (Data Mode) необходимо ввести значение Только чтение (Read Only).



Автоматическое создание макрокоманд путем перетаскивания объектов



Иллюстрация 11.2. Автоматическое создание макрокоманд путем перетаскивания объектов

Аналогично можно создавать макрокоманды, перетаскивая из окна База данных (Database) таблицы, запросы, отчеты и другие макросы. При этом в окне Конструктора макросов будут появляться соответствующие макрокоманды: ОткрытьТаблицу (ОрепТаblе), ОткрытьЗапрос (OpenQuery) , ОткрытьОтчет (OpenReport), ЗапускМакроса(RunMacro).

Для ввода аргументов макрокоманды чаще всего требуется выбирать значения из списков или вводить выражения. Для ввода выражений можно воспользоваться Построителем выражений, кнопка которого находится справа от поля аргумента. Еще одна кнопка Построителя выражений находится на панели инструментов. Как и в других случаях, перед выражением нужно ставить знак равенства (=). Исключения составляют аргумент Выражение (Expression) макрокоманды ЗадатьЗначение (Setvalue) и аргумент Число повторений (Repeat Count) макрокоманды-ЗапускМакроса (RunMacro). Если ввести знак равенства перед выражением, задающим значение этих аргументов, то оно будет вычисляться дважды, что может привести к нежелательным результатам.

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

Итак, созданная нами макрокоманда будет открывать форму "Клиенты" (Customers) в режиме Только чтение (Read Only) и показывать в ней только менеджеров по продажам. Как уже было сказано ранее, макрос может содержать последовательность из нескольких макрокоманд. Поэтому в этом же макросе в следующей строке мы выберем макрокоманду Сообщение (MsgBox), которая после открытия формы будет отображать диалоговое окно с сообщением о том, какие клиенты представлены в форме. Для этого введем в поле Сообщение (Message) на панели аргументов текст сообщения, например Установлен фильтр Менеджеры по продажам, остальные поля можем оставить без изменения. Аргумент Сигнал (Веер) определяет, будет ли вывод сообщения сопровождаться звуковым сигналом. Аргумент Тип (Туре) определяет вид диалогового окна сообщения. Аргумент Заголовок (Title) позволяет задать текст, который будет выведен в заголовке окна сообщения.

Если база данных большая, отбор записей в форме может занять некоторое время, поэтому рекомендуется вывести на экран курсор в форме песочных часов, который будет показывать, что идет обработка данных. Для того чтобы сделать это, воспользуемся макрокомандой ПесочныеЧасы (Hourglass). Макрокоманды в макросе выполняются в той последовательности, в которой они записаны в столбце "Макрокоманда" (Action), т. е. сверху вниз. Макрокоманду ПесочныеЧасы (Hourglass) следует поставить первой, т. к. курсор должен измениться перед выводом формы. Таким образом, нам нужно вставить новую строку на панели описаний. Для этого установим курсор в первую строку панели и нажмем кнопку Добавить строки (Insert Rows) на панели инструментов или просто клавишу <Insert>. Появится пустая строка. В этой строке в поле "Макрокоманда" (Action) выберем макрокоманду ПесочныеЧасы (Hourglass). В поле "Включить" (Hourglass On) панели аргументов появится значение Да (Yes), установленное по умолчанию, что нам и нужно. Чтобы вернуть первоначальный вид указателю мыши, в конце созданного макроса нужно ввести такую же макрокоманду ПесочныеЧасы (Hourglass), но со значением Нет (No) аргумента Включить (Hourglass On).

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

Теперь остается только сохранить созданный макрос. Для этого можно выбрать в меню Файл (File) команду Сохранить как (Save As) или нажать клавишу <F12>. Появится окно сохранения макроса. Введите в поле ввода имя макроса, соблюдая правила именования объектов Access, например Менеджеры по продажам.

Замечание

В Microsoft Word и Excel имеются средства автоматической записи макросов. Эти средства очень удобны для изучения VBA, поскольку позволяют автоматически создать процедуру, включив запись макроса, выполнив необходимые действия и остановив запись. Тогда все действия пользователя, выполняемые после включения записи и до ее остановки, преобразуются в текст процедуры VBA. Затем этот текст можно просмотреть и отредактировать с помощью редактора VBA. В Microsoft Access средств автоматической записи макросов нет так же, как нет и средств автоматической генерации кода VBA (за исключением того, что создают мастера).



Создание группы макросов



Иллюстрация 11.3. Создание группы макросов

На рис. 11.З в окне Конструктора представлен макрос "Сотрудники" (Employees) базы данных (Northwind). Для указания конца макроса не требуется отдельной макрокоманды. Access продолжает выполнение макроса, входящего в группу, пока не обнаружит строку, содержащую имя в столбце "Имя макроса" (Macro Name), либо пока не дойдет до последней строки окна макросов.

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

Для запуска одного из макросов группы используется полное имя для ссылки на макрос. Полное имя макроса формируется таким образом: имяГруппы.имяМакроса.

Замечание

Можно настроить систему так, чтобы столбец Имя макроса (Macro Name) выводился всегда в Конструкторе макросов. Для этого необходимо установить соответствующие параметры на вкладке Вид (View) в диалоговом окне Параметры (Options) (см. разд. "Настройка параметров приложения Access" гл. 14).



Применение условий в макросах



Иллюстрация 11.4. Применение условий в макросах

На рис. 11.4 приведено окно Конструктора для группы макросов "Наклейки для клиентов" (Customer Label Dialog), используемой для печати отчета в виде наклеек на конверты. Причем можно напечатать наклейки сразу для всех клиентов или для клиентов одной страны, выбранной из списка. В окне виден столбец "Условие" (Condition). Если условие, заданное в этом столбце, истинно, выполняется макрокоманда, находящаяся в этой строке. Если условие ложно, соответствующая макрокоманда пропускается и выполняется следующая.

Если требуется при истинности условия выполнить сразу несколько макрокоманд, то для всех макрокоманд, кроме первой, в столбце "Условие" (Condition) ставится многоточие (...). Условие, которое должно проверяться, пишется в строке первой макрокоманды. Тогда, если оно истинно, выполняется весь набор макрокоманд от этого условия и до следующей макрокоманды с заданным условием, до следующего макроса или до конца макроса. Если условие ложно, пропускаются все команды, помеченные многоточием, включая макрокоманду с заданным условием. Далее выполняется макрокоманда, следующая за пропущенными, в которой содержится новое условие или поле "Условие" (Condition) не заполнено. Таким образом, в отличие от "большинства языков программирования, в макросах нет альтернативного ветвления. Для того чтобы создать макрос с двумя альтернативными ветвями, нужно сначала ввести условие и определить макрокоманды, исполняемые при выполнении этого условия. Сразу после них необходимо указать обратное условие и определить макрокоманды, исполняемые в альтернативной ветви. Затем можно ввести макрокоманды, которые исполняются безусловно. Такой способ ветвления используется, например, в макросе "Просмотр" (Preview), который связан с кнопкой Просмотр (Preview) в данной форме. Если пользователь выбрал вариант для всех стран (АН Countries), что определяется значением 1 элемента управления ПечатьНаклеек (PrintLabelFor), то отчет открывается в режиме Предварительного просмотра и форма закрывается. Если выбран переключатель для конкретной страны (Specific Country)", а страна не выбрана (значение поля со списком "ВыборСтраны" (SelectCountry) не задано), то выдается сообщение, фокус устанавливается в поле со списком для выбора страны и выполнение макроса прекращается. Если страна задана, то отображается отчет для выбранной страны и форма закрывается.

В этом макросе используется макрокоманда ОстановитьМакрос (StopMacro). Она позволяет прекратить выполнение макроса, при этом все макрокоманды, следующие по порядку за макрокомандой ОстановитьМакрос (StopMacro), не будут выполняться.

Замечание

Макрокоманду ОстановитьМакрос (StopMacro) имеет смысл использовать, только если за ней идут другие макрокоманды, которые не следует выполнять при некотором условии. Как уже было сказано выше, для указания конца макроса специальной макрокоманды не требуется.



Запуск макроса с помощью команды меню



Иллюстрация 11.5. Запуск макроса с помощью команды меню



Диалоговое окно Запуск макроса



Иллюстрация 11.6. Диалоговое окно Запуск макроса



Создание кнопки на панели инструментов для запуска макроса



Иллюстрация 11.7. Создание кнопки на панели инструментов для запуска макроса

Замечание

Если основной режим работы в вашем приложении — работа с формами, кнопки выполнения макросов можно поместить на панель инструментов Режим формы (Form View).

Чтобы удалить с экрана панель инструментов, на которую вы только что добавили кнопку, щелкните правой кнопкой мыши в области панелей инструментов и в списке стандартных панелей команд снимите флажок слева от названия панели (рис. 11. 8).



Контекстное меню со списком панелей команд



Иллюстрация 11.8. Контекстное меню со списком панелей команд

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

Щелкните по ярлыку Макросы (Macros) на панели объектов в окне База данных (Database) и выделите нужный макрос.
Выберите команду Сервис, Макрос, Создать панель инструментов из макроса (Tools, Macro, Create Toolbar from Macro). На экране появляется пустая панель инструментов.
Перетащите с помощью мыши нужный макрос на эту панель.
На панели появляется кнопка с уже знакомым значком макроса. Кнопка получает такое же название, как имя макроса, для которого она создана.

Если нужно создать панель инструментов для вызова нескольких макросов, мы рекомендуем объединить эти макросы в одну группу (создание группы макросов было описано в предыдущем разделе). Тогда при выполнении команды меню Сервис, Макрос, Создать панель инструментов из макроса (Tools, Macro, Create Toolbar from Macro) будет создана панель инструментов, на которой каждому макросу группы будет соответствовать своя кнопка. При этом на кнопках отображаются имена соответствующих макросов. Новая панель инструментов получает такое же имя, как имя группы макросов. Попробуйте выполнить эту команду для одной из групп макросов в базе данных "Борей" (Northwind), например "Клиенты" (Customers). При желании можно заменить текст на кнопках значками. Дополнительная информация о настройке панелей инструментов приложения, и, в частности, об удалении кнопок с панелей и удалении самих панелей, изменении вида этих кнопок, представлена в разд. "Создание и изменение панелей команд" гл. 14.



Пример макроса "AutoKeys"



Иллюстрация 11.9. Пример макроса "AutoKeys"

Этот способ запуска макроса, безусловно, является самым быстрым, однако он имеет существенный недостаток: свободных комбинаций клавиш очень немного. И хотя комбинации, определенные в "AutoKeys", имеют более высокий приоритет, чем стандартные (например, <Ctrl>+<C> — копировать), заменять стандартное назначение комбинаций клавиш не рекомендуется. Разрешенные комбинации клавиш приведены в табл. 11.2. Комбинации с клавишей <Alt> в данном случае не применяются, т. к. используются для запуска команд меню и нажатия кнопок.



Диалоговое окно свойств кнопки



Иллюстрация 11.10. Диалоговое окно свойств кнопки



Диалоговое окно Последовательность перехода



Иллюстрация 11.11. Диалоговое окно Последовательность перехода

В макрос нужно добавить единственную макрокоманду ОткрытьФорму (OpenForm). Значения аргументов этой макрокоманды приведены в табл. 11.З.


Форма "Заказы"



Иллюстрация 11.12. Форма "Заказы"

Однако мы выполнили еще не все необходимые действия. Если перейти к следующей записи в форме "Клиенты" (Customers), данные в форме "Заказы" (Orders) уже не будут правильно отражать ситуацию — они не меняются. Нужно сделать так, чтобы эти данные изменялись синхронно с переходом к другим записям в форме "Клиенты" (Customers) либо чтобы это окно просто закрывалось. Рассмотрим реализацию второго варианта. Форма "Заказы" (Orders) открывается, когда мы нажимаем кнопку Заказы клиента, и становится активной. Требуется сделать так, чтобы она закрывалась, когда активной становится форма "Клиенты" (Customers). Для этого нужно выбрать соответствующее событие и задать процедуру или макрос его обработки. Если вы откроете окно Свойства (Properties) формы "Клиенты" (Customers) и раскроете вкладку События (Event), то среди множества событий увидите событие Включение (On Activate). Это как раз то событие, которое нам нужно. Выберем это событие, но теперь мы не будем создавать новую группу макросов, а добавим новый макрос в группу макросов "Клиенты" (Customers), которая уже содержит макросы для формы "Клиенты" (Customers). Выберите эту группу макросов в раскрывающемся списке и нажмите кнопку Построителя. Откроется окно, в котором отобразятся два макроса. Добавим к ним еще один макрос. Назовем его "Закрытие" и введем макрокоманду Закрыть (Close) с соответствующими параметрами (табл. 11.4). Но перед закрытием формы необходимо проверить, открыта ли она. Для этого воспользуемся функцией isLoaded, которая возвращает значение Истина, если форма открыта, и Ложь — в противном случае. В качестве аргумента в функцию isLoaded нужно передать имя формы. Итак, в столбец Условие (Condition), напротив макрокоманды Закрыть (Close), введите IsLoaded("Заказы") (или IsLoaded ("Orders")).



Диалоговое окно Пошаговое исполнение макроса



Иллюстрация 11.14. Диалоговое окно Пошаговое исполнение макроса

Если в процессе выполнения макроса возникла ошибка, появляется диалоговое окно Ошибка выполнения макроса (Action Failed), аналогичное окну Пошаговое исполнение макроса (Macro Single Step), но без возможности продолжить процесс (кнопки Шаг (Step) и Продолжить (Continue) недоступны). Можно только прервать выполнение макроса, нажав кнопку Прервать (Halt). В окне отображается макрокоманда, содержащая ошибку.

Поиск ошибок в макросах, как правило, не вызывает больших затруднений. Это связано с тем, что:

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

Совет

Прежде чем использовать ссылки на форму или элемент управления, рекомендуется выполнять проверку, открыта ли форма, с помощью функции isLoaded(). К сожалению, эта функция не является стандартной функцией Access, а обычно включается в модуль "Служебные функции" (Utility Function) базы данных "Борей". Вы можете скопировать ее оттуда в свою базу данных.

Стандартным приемом отладки как процедур, так и макросов, является вывод на экран специальных сообщений, говорящих о прохождении определенных этапов процесса. В макросах это осуществляется путем вставки дополнительных макрокоманд ВыводСообщения (MsgBox) для отображения таких сообщений. Причем в сообщении можно вывести значения свойств элементов управления, например: "Цена товара = " & Forms!Товары!Цена

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

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



Форма для отбора записей по заданным критериям



Иллюстрация 11.15. Форма для отбора записей по заданным критериям



Макросы для установки и отмены фильтра в форме "Товары"



Иллюстрация 11.16. Макросы для установки и отмены фильтра в форме "Товары"

На рис. 11.16 представлено два макроса: УстановитьФильтр и Отменить Фильтр. В диалоговом окне Область ввода (Zoom) отображено значение аргумента Условие отбора (Where Condition) макрокоманды ПрименитьФильтр (ApplyFilter). Обратите внимание, условие получилось довольно сложным, а длина поля Условие отбора (Where Condition) ограничена 255 символами. Поэтому, если бы мы включили в условия отбора еще одно поле, например "Поставки прекращены", нам пришлось бы отдельно создать специальный фильтр и задать его имя в аргументе Имя фильтра (Filter Name).

В макросе "ОтменитьФильтр", кроме макрокоманды ПоказатьВсеЗаписи(ShowAllRecords), нужны еще две макрокоманды, чтобы очистить поля " ВыборПоставщика" и "ВыборТипа", т. е. присвоить им значение Пусто (Null). Это делается с помощью макрокоманды ЗадатьЗначение(SetValue).



Назначение макроса событию формы После обновления



Иллюстрация 11.18. Назначение макроса событию формы После обновления

Замечание

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

С помощью макрокоманды Обновление (Requery) можно обновлять данные и в неактивной форме, точнее, не в той форме, которой назначен макрос. Однако в этом случае сначала необходимо выполнить макрокоманду ВыделитьОбъект(SelectObject), которая перенесет фокус на нужную форму, чтобы ее активизировать (потом фокус можно вернуть обратно).

Макрокоманда ПоказатьВсеЗаписи (ShowAllRecords), как уже отмечалось, отменяет действие фильтра и повторно просматривает источник записей. Ее часто используют для обновления данных в подчиненной форме.

Макрокоманда ОбновитьОбъект (RepaintObject) применяется только к объекту базы данных (к таблице, запросу, форме, отчету, странице, макросу и модулю) и не применяется к элементу управления. Она выполняет немедленное обновление указанного открытого объекта (если имя объекта не задано, обновляется активный объект), хотя при этом не производится повторное выполнение запроса к источнику данных. Обновление объекта не влияет на. отображение новых и удаленных записей, как это происходит при выполнении макрокоманды Обновление (Requery). Обычно макрокоманду ОбновитьОбъект (RepaintObject) применяют для отображения результатов изменения данных с помощью макрокоманд ЗадатьЗначение (SetValue), а также для повторного вычисления значений выражений в вычисляемых элементах управления.



Преобразование макроса в процедуру VBA



Иллюстрация 11.19. Преобразование макроса в процедуру VBA

Когда преобразование закончится, в форме "Наклейки для клиентов" (Customers Labels Dialog) щелкните правой кнопкой мыши, например по кнопке Отменить, и выберите команду Свойства (Properties).
В диалоговом окне Свойства (Properties) раскройте вкладку События (Events).
В поле для события Нажатие кнопки (On Click) оказалось установленным значение [Процедура обработки событий] ([Event Procedure]). Щелкните по кнопке Построителя, находящейся справа от поля, — откроется окно редактора VBA с текстом процедуры (рис. 11.20).


Процедура, полученная из макроса



Иллюстрация 11.20. Процедура, полученная из макроса

В этой процедуре, полученной из макроса, используются объект DoCmd для выполнения макрокоманды закрытия формы. В соответствии с флажками, установленными в окне Преобразование макроса (Convert Macro), комментарии в макросе были преобразованы в комментарии в процедуре и был добавлен код обработки ошибки, который выдает на экран сообщение об ошибке в случае ее возникновения (см. гл. 13).

Аналогично выполняется преобразование макросов, назначенных событиям отчета.

Теперь рассмотрим преобразование в процедуру VBA макроса, не связанного с событием формы или отчета, например созданного ранее макроса "Менеджеры по продажам".

Щелкните по ярлыку Макросы (Macros) в окне базы данных "Борей". Появится список макросов. Выделите макрос "Менеджеры по продажам".
Выберите команду Сервис, Макрос, Преобразовать макросы (Tools, Macro, Convert Macros to Visual Basic).
Откроется такое же диалоговое окно, как в предыдущем примере (см. рис. 11.19), в котором необходимо нажать кнопку Преобразовать (Convert). После окончания процесса преобразования появится сообщение об успешном завершении процесса преобразования и откроется окно редактора VBA, в котором можно посмотреть полученный код на VBA (рис. 11.21).
Макрос преобразуется в функцию с аналогичным именем Менеджеры_по_продажам (пробелы заменились символами подчеркивания).


Результат преобразования макроса "Менеджеры по продажам"



Иллюстрация 11.21. Результат преобразования макроса "Менеджеры по продажам"

После преобразования исходный макрос "Менеджеры по продажам" не был удален, а в списке модулей в окне базы данных "Борей" появился новый модуль с именем "Преобразованный макрос — Менеджеры по продажам" (Converted Macro — Менеджеры по продажам).

Существует еще один способ преобразования макросов в модуль VBA:

Выделите макрос "Менеджеры по продажам" в окне базы данных "Борей".
Выберите команду Файл, Сохранить как (File, Save As).
В появившемся диалоговом окне Сохранение (Save As), в раскрывающемся списке Как (As) выберите элемент Модуль (Module) (рис. 11.22) и нажмите кнопку ОК.

Иллюстрация 11.22. Сохранение макроса в виде модуля



Использование макросов





Использование макросов в базе данных Microsoft Access


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

Макрос в Access представляет собой структуру, состоящую из одной или нескольких макрокоманд, которые выполняются либо последовательно, либо в порядке, заданном определенными условиями. Набор макрокоманд в Access очень широк, с помощью макросов можно реализовать многое из того, что позволяют сделать процедуры на VBA. Каждая макрокоманда имеет определенное имя и, возможно, один или несколько аргументов, которые задаются пользователем. Например, при использовании макрокоманды ОткрытьФорму (OpenForm) в качестве аргументов необходимо задать, по крайней мере, имя открываемой формы и режим вывода ее на экран.

В табл. 11.1 содержится список макрокоманд Microsoft Access 2002, сгруппированных по категориям: работа с данными в формах и отчетах; выполнение команд, макросов, процедур и запросов; работа с объектами; импорт/экспорт данных и объектов и прочие. В категорию "Прочие" собраны все макрокоманды, которые позволяют влиять на интерфейс приложения.



Конструктор макросов



Конструктор макросов

Открыть окно Конструктор макросов (Macro Design) для создания нового макроса можно двумя способами:

Раскройте список макросов в окне База данных (Database), щелкнув левой кнопкой мыши по ярлыку Макросы (Macros), и нажмите кнопку Создать (New) в верхней части окна (рис. 11.1).
Щёлкните по стрелке вниз на кнопке Новый объект (New Object) на панели инструментов База данных (Database) и выберите элемент Макрос (Macro).
Окно Конструктора макросов построено аналогично окну Конструктора таблиц, т. е. разделено по горизонтали на две части: панель описаний и панель аргументов.

Верхняя часть окна Конструктора — панель описаний — состоит из нескольких столбцов. По умолчанию на этой панели выводится два столбца: "Макрокоманда" (Action) и "Примечание" (Comments). Панель описаний позволяет определить последовательность макрокоманд, из которых состоит макрос.

Строка в столбце "Макрокоманда" (Action) представляет собой поле со списком, в котором можно выбрать нужную макрокоманду.

Строка в столбце "Примечание" (Comments) — это обычное текстовое поле, в которое можно ввести комментарий, описывающий выполняемое действие.

Когда поле "Макрокоманда" (Action) заполнено, в нижней части окна Конструктора макросов появляется панель аргументов, предназначенная для ввода значений аргументов соответствующей макрокоманды. Список полей на этой панели зависит от выбранной макрокоманды и может отсутствовать, если макрокоманда не имеет аргументов. Таким образом, при создании макросов не нужно запоминать список аргументов для каждой макрокоманды.

На рис. 11.1 проиллюстрирован выбор макрокоманды Применить Фильтр (ApplyFilter). На панели аргументов имеются два поля, которые позволяют задать имя фильтра и условие отбора записей. Для того чтобы задать условие отбора записей, можно воспользоваться Построителем выражений (см. разд. "Создание выражений с помощью Построителя выражений" гл. 4).



Назначение макроса событию



Назначение макроса событию

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

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

Чтобы создать макрос, определяющий описанную реакцию приложения на событие Нажатие кнопки (OnClick):

Откройте форму "Клиенты" (Customers) в режиме Конструктора.
Создайте кнопку в области заголовка формы. При этом кнопка мастера на панели элементов должна быть отжата, т. к. в противном случае вам будет предложено создать процедуру обработки событий, а не макрос.
Откройте окно свойств только что созданной кнопки, если оно еще не открыто, и раскройте вкладку События (Event).
Обратите внимание, сколько разных событий связано только с командной кнопкой. Помимо обычного нажатия, которое мы сейчас и будем использовать, в набор событий кнопки входят получение и потеря фокуса, двойной щелчок кнопкой мыши, простое перемещение указателя мыши над кнопкой и пр. Такое многообразие событий дает разработчику большие возможности по созданию удобного интерфейса пользователя. Теперь найдите в списке событие Нажатие кнопки (On Click) и установите курсор в соответствующую ячейку. Это поле со списком, и в данный момент оно пустое. Если открыть этот список, то первым его элементом будет [Процедура обработки событий] ([Event procedure]), а далее идет перечень всех макросов, существующих в приложении (рис. 11.10).
Поскольку нужного нам макроса в списке нет, давайте его создадим. Для этого нажмите кнопку Построителя, находящуюся справа от поля. Появится окно Построитель (Choose Builder), в котором предлагается выбрать один из трех Построителей: Выражения (Expression Builder), Макросы (Macro Builder) и Программы (Code Builder) (рис. 11.11).
Выберите Макросы (Macro Builder) и нажмите кнопку ОК. Откроется"окно макросов и диалоговое окно, в которое нужно ввести имя создаваемого макроса. Введите имя Заказы клиента.


Обновление данных в формах и элементах управления



Обновление данных в формах и элементах управления

Последняя группа макрокоманд в рассматриваемой категории связана с обновлением данных в активных формах, таблицах и запросах. Если несколько человек в сети одновременно изменяют данные, то формы и таблицы у конкретного пользователя могут не отражать актуальных данных. Для того чтобы отображаемые данные соответствовали текущему состоянию базы данных, их необходимо обновить с помощью команды Записи, Обновить (Record, Refresh) (см. разд. "Работа с записями"гл. 2).

Похожая ситуация возникает даже в однопользовательском режиме, если в форме используется поле со списком, источником данных для которого является таблица или запрос. Если в исходную таблицу были добавлены записи, то в поле со списком они автоматически не появятся — нужно повторно выполнить запрос. Кроме полей со списком, к элементам управления, требующим обновления отображаемых данных, относятся также списки и элементы управления подчиненной формы, объекты OLE и вычисляемые элементы управления, содержащие статистические функции по подмножеству записей, такие как DLookUp () или DSum ().

Для того чтобы выполнить обновление записей в формах, таблицах или элементах управления, используются макрокоманды Обновление(Requery), ПоказатьВсеЗаписи(ShowAllRecords) И ОбновитьОбъект(RepaintObject).

Макрокоманда Обновление (Requery) обновляет данные в объекте базы данных путем повторного просмотра источника данных. Макрокоманда имеет один аргумент, содержащий имя объекта, который следует обновить. Если обновляется активный объект, например форма, то поле аргумента следует оставить пустым. При этом макрокоманда будет повторно выполнять запрос, указанный в свойстве Источник данных (RecordSource) этой формы.

Рассмотрим пример использования макроса для обновления данных. В форме "Клиенты" (Customers) есть поле со списком "Страна" (Country). Источником данных для этого поля является запрос, который выбирает значения из поля "Страна" (Country) таблицы "Клиенты" (Customers):

SELECT DISTINCT Клиенты.Страна FROM Клиенты;

Если при вводе клиента в таблицу добавляется новое название страны, то в списке эта страна не появится, поскольку запрос будет выполнен повторно только при следующем открытии формы. Чтобы провести обновление списка стран раньше, следует назначить событию После обновления (After Update) формы макрос Клиенты.Обновление списка стран, который состоит из одной макрокоманды Обновление (Requery) со значением аргумента "Страна" (Country) (рис. 11.18).



Отладка макросов и поиск ошибок



Отладка макросов и поиск ошибок

Обычно для отладки макроса его выполняют в пошаговом режиме. Для включения этого режима необходимо нажать кнопку По шагам (Single Step) на панели инструментов в окне Конструктора макросов или выбрать команду меню Запуск, По шагам (Run, Single Step). Тогда перед выполнением каждой макрокоманды будет появляться диалоговое окно Пошаговое исполнение макроса (Macro Single Step) (рис. 11.14).

В этом окне отображаются имя макроса, имя исполняемой макрокоманды, условие ее исполнения и аргументы. При этом в полях Условие (Condition) и Аргументы (Arguments) видны значения условного выражения и аргументов макрокоманды. Если в строке макрокоманды условие не указано, в поле Условие (Condition) всегда будет показываться значение Истина (True). Кнопки справа от полей в этом окне позволяют выполнить очередную макрокоманду, прервать выполнение макроса (например, если видно, что аргументы вычислены неправильно) и продолжить выполнение в обычном режиме, т. е. не по шагам.



Перемещение по данным



Перемещение по данным

Эта группа макрокоманд связана с перемещением по записям и элементам управления. В качестве примера применения макрокоманд этой группы рассмотрим ситуацию, когда пользователь работает с формой "Клиенты" и хочет найти заказ текущего клиента, номер которого ему известен. Давайте вернемся к примеру, приведенному в разд. "Назначение макроса событию". Тогда мы создали.в форме "Клиенты" кнопку Заказы клиента для отображения заказов выбранного клиента. Попробуем усовершенствовать эти формы. Если номер заказа известен пользователю, он может ввести его в текстовое поле Поиск заказа, которое можно добавить в форму "Клиенты" (Customers). Тогда в открываемой форме "Заказы" (Orders) следует сразу показать запись, содержащую соответствующий счет. Добавим поле "Поиск заказа" в заголовок формы и сделаем так, чтобы при открытии формы "Заказы" (Orders) проверялось значение этого поля и, если оно не пустое, производился бы поиск счета с указанным номером и выполнялся переход на соответствующую запись. В противном случае текущей становилась бы первая запись из отфильтрованного набора записей. На рис. 11.17 показана форма "Клиенты" (Customers) с новым полем и макрос "Поиск заказа", который связан с событием Загрузка (On Load) формы "Заказы" (Orders).

Поскольку добавленный макрос обработки события ссылается на элемент управления в форме "Клиенты" (Customers), он должен выполняться только в том случае, если эта форма открыта, и, кроме того, поиск должен производиться только тогда, когда поле "Поиск заказа" не пусто. Исходя из этого формируются условия макроса. Прежде чем производить поиск записи по образцу в одном из полей, необходимо активизировать это поле, для чего используется макрокоманда КЭлементуУправления(GoToControl) . С ее помощью устанавливается фокус на поле "КодЗаказа" (Orderld). Но это поле в форме "Заказы" (Orders) недоступно, поэтому сначала нужно изменить значение свойства Доступ (Enabled) этого поля. В противном случае выполнение макрокоманды КЭлементуУправления (GoToControl) приведет к возникновению ошибки.

Макрокоманда КЭлементуУправления (GoToControl) используется, как правило", если требуется изменить стандартный порядок перехода между полями в форме. Обычно переход между полями выполняется с помощью клавиши <Таb>, однако иногда требуется пропустить ряд полей и переместить фокус к определенному элементу управления. Это может зависеть от каких-либо условий, например от значения поля. В этом случае на событие После обновления (After Update) для данного прля назначается макрос, который перемещает фокус на нужный элемент управления в форме. В качестве аргумента для макрокоманды необходимо указать короткое имя элемента управления. В случае излишне длинного имени переход к элементу управления не произойдет и отобразится сообщение об ошибке.

Иллюстрация 11.17. Пример макроса для перемещения по данным



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


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

Давайте попробуем преобразовать в процедуры обработки событий макросы, назначенные событиям формы "Наклейки для клиентов" (Customers Labels Dialog):

Откройте форму "Наклейки для клиентов" (Customers Labels Dialog) в режиме Конструктора.
Выберите команду Сервис, Макрос, Преобразовать макросы формы (Tools, Macro, Convert form's Macros to Visual Basic).
В диалоговом окне Преобразование макроса формы (Convert form macros) (рис. 11.19) нажмите кнопку Преобразовать (Convert), оставив флажки установленными по умолчанию.


Применение макросов


Макросы могут применяться для решения самых разнообразных задач. В первом разделе данной главы мы привели таблицу макрокоманд, сгруппированных по категориям. Теперь рассмотрим применение макрокоманд некоторых категорий.



Применение условий в макросах



Применение условий в макросах

В примерах макросов, которые мы приводили раньше, использовался последовательный порядок выполнения макрокоманд. Однако, как и в любой программе, порядок выполнения макрокоманд в макросе может быть изменен. Для этого вводятся условия выполнения или пропуска макрокоманд. Эти условия задаются в виде выражений в специальном столбце, который появляется в окне Конструктора макросов, если нажата кнопка Условия (Conditions) на панели инструментов (рис. 11.4).

Замечание

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



Работа с данными в формах и отчетах



Работа с данными в формах и отчетах

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



Работа с макросами


Основной набор средств Microsoft Access, который мы рассматривали в предыдущих главах книги, ориентирован на пользователей, не владеющих языками программирования. Для программистов же к этим средствам добавлены макросы (небольшие программы на языке макрокоманд системы Access) и модули (процедуры на языке Visual Basic for Application, VBA). С их помощью можно существенно расширить функциональные возможности создаваемого вами приложения и настроить его на нужды конкретных пользователей. В этой главе мы познакомимся с одним из этих средств — макросами и одним из языков программирования Access — языком макрокоманд. С модулями и языком VBA мы вас познакомим в гл. 13,

Итак, мы будем обсуждать следующие вопросы:

Понятие макроса
Использование макросов в приложениях-
Создание макросов и групп макросов
Задание условий для управления процессом выполнения макроса
Различные способы запуска макросов
Советы по отладке макросов
Обработка событий в формах и отчетах с помощью макросов
Преобразование макросов в процедуры VBA

Работа с объектами



Работа с объектами

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

Рассмотрим сначала, как используется макрокоманда ЗадатьЗначение (SetValue), которая позволяет устанавливать значения свойств элементов управления в формах и отчетах. Мы уже использовали эту макрокоманду в предыдущих примерах.

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

Можно создать одну форму, в которой в зависимости от определенных условий, видимыми будут разные поля. Это позволяет использовать одну форму в нескольких случаях и не создавать для каждой ситуации дополнительную форму. Когда форм в приложении очень много, такая возможность становится очень полезной. Чтобы сделать элемент управления невидимым, следует задать значение Ложь (False) для свойства Вывод на экран (Visible) этого элемента. Чтобы показать элемент управления на экране, задайте для этого свойства значение Истина (True).
В зависимости от текущего состояния работы с данными можно изменять доступность кнопок, предназначенных для выполнения определенных действий, или других элементов управления в форме. Чтобы сделать элемент управления недоступным, задайте значение Ложь (False) его свойству Доступ (Enabled). Чтобы элемент управления стал доступным, задайте значение Истина (True) для этого свойства.
Можно запретить пользователю изменять данные в форме. Для этого свойству Доступ (Enabled) соответствующих полей следует присвоить значение Ложь (False), а свойству Блокировка записей (Locked) — значение Истина (True). Если необходимо запретить изменение во всех полях, установите значение Ложь (False) для следующих свойств формы: Разрешить изменения (Allow Edits), Разрешить добавление (Allow Additions), Разрешить удаление (Allow Delitions). Эти свойства можно изменять динамически, т. е. в процессе работы пользователя с формой. Например, можно разрешить или запретить редактирование данных после проверки прав пользователя.
С помощью макрокоманды ЗадатьЗначение (SetValue) можно динамически изменять значение свойства Источник записей (RecordSource) для формы, что позволяет управлять содержанием отображаемых данных.
Существуют макрокоманды для открытия "и закрытия объектов Access:

ОткрытьФорму(OpenForm), ОткрытьЗапрос(OpenQuery), ОткрытьОтчет(OpenReport) и т. д. Для открытия объекта каждого типа применяется отдельная макрокоманда, а для закрытия объекта используется общая для объектов всех типов макрокоманда Закрыть (Close). Тип объекта, к которому следует применить эту макрокоманду, указывается в качестве одного из ее аргументов. В предыдущих примерах уже использовались макрокоманды ОткрытьФорму(OpenForm) и Закрыть(Close) для активного объекта.

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

При выполнении запроса, изменяющего данные, на экране будут отображаться предупреждающие сообщения. Чтобы отключить вывод этих сообщений, используйте макрокоманду УстановитьСообщения (SetWarnings) со значением аргумента Нет (No). Только не забудьте после выполнения запроса снова включить вывод системных сообщений, применив ту же макрокоманду, но с аргументом Да (Yes). Иначе в Access не будут отображаться никакие системные сообщения, что может привести к выполнению нежелательных действий в приложении.

Макрокоманда ОткрытьПредставление (OpenView) аналогична макрокоманде ОткрытьЗапрос (OpenQuery), только применяется она в проектах Access 2000 и предназначена для работы с данными, хранящимися на сервере.

Макрокоманда ОткрытьСохраненнуюПроцедуру (OpenStoreProcedure) позволяет выполнить или открыть в режиме редактирования хранимую процедуру сервера (см. разд. "Особенности разработки клиент-серверных приложений"гл. 17).

В данном разделе описаны далеко не все макрокоманды. Для получения полной информации используйте справочную систему Access. Чтобы быстро получить справку:

Выберите команду Справка, Справка по Micrisift Access (Help, Microsoft Access Help).
Раскройте вкладку Мастер ответов (Answer Wizard) и введите в поле Выберите действие (What would you like to do?) имя макрокоманды. Нажмите кнопку Найти (Search).

Создание групп макросов



Создание групп макросов

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

Чтобы создать группу макросов:

Откройте Конструктор макросов одним из тех способов, которые были описаны в предыдущем разделе.
Нажмите кнопку Имена макросов (Macro Name) на панели инструментов. На панели описаний в окне Конструктора появится еще один столбец — "Имя макроса" (Macro Name) (рис. 11.3).
В этот столбец введите имя первого макроса. Остальные поля данной строки лучше оставить пустыми — это облегчит перемещение и копирование макрокоманд.
Начиная со следующей строки, введите все макрокоманды макроса и соответствующие аргументы для каждой макрокоманды.
Пропустите одну строку.
Повторите шаги 3—5 для каждого макроса.


Создание макросов


В Microsoft Access существует специальное средство для создания макросов — Конструктор макросов (Macro Design). Рассмотрим процесс создания макроса с помощью Конструктора.



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



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

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

имяСемейства!имяОбъекта!имяЭлемента

Например, ссылка на элемент управления Номер заказа в форме "Заказы клиента" выглядит так:

Forms![Заказы клиента]![Номер заказа]

Ссылка на элемент управления Сумма в отчете "Продажи за период" выглядит так:

Reports![Продажи за период]![Сумма]

Ссылка на свойство элемента управления состоит из четырех частей:

имяСемейства!имяОбъекта!имяЭлемента.имяСвойства

Например:

Forms![Заказы клиента]![Номер заказа].Enabled

Свойство Доступ (Enabled) позволяет запретить или разрешить доступ к элементу управления.

Объект может иметь свойство, используемое по умолчанию. Это свойство применяется в том случае, когда имя свойства в ссылке явно не указано. Например, у элементов управления по умолчанию используется свойство Значение (Value), поэтому ссылка Forms! Товары! Цена позволяет получить доступ к значению, отображенному в текстовом поле "Цена".



Ссылки на формы, отчеты и их свойства



Ссылки на формы, отчеты и их свойства

Чтобы задать ссылку на форму или отчет, нужно сначала определить, в какое семейство (collection) входит объект, на который создается ссылка. (Подробнее о семействах и составляющих их объектах см. гл. 13.) Все открытые формы входят в семейство Формы (Forms), а открытые отчеты — в семейство Отчеты (Reports). Полная ссылка на форму или отчет должна состоять из двух частей: имяСемейства!имяОбъекта. Причем если имя объекта содержит пробелы или специальные символы, то его нужно заключить в квадратные скобки. Если пробелы в имени не используются, скобки можно не ставить. Таким образом, ссылка на форму будет выглядеть так: Forms![Заказы клиента] ИЛИ Forms!Клиенты Для отчета ссылки выглядят аналогично:

Reports! [Отчет о продажах] ИЛИ Reports!Прайс-лист Ссылка на свойство формы или отчета состоит из трех частей: имяСемейства!имяОбъекта.имяСвойства Например:

Forms!Клиенты.Visible или Reports![Продажи за период].MenuBar Свойство Вывод на экран (Visible) определяет, будет ли форма видна на экрану или спрятана, а свойство Меню (MenuBar) позволяет связать с отчетом или формой специальное меню.



Ссылки на подчиненные формы и отчеты



Ссылки на подчиненные формы и отчеты

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

Forms!Заказы!ПодформаТовары

Здесь ПодформаТовары — это имя элемента управления в форме "Заказы", который представляет собой подчиненную форму.

А вот ссылка на элемент управления в подчиненной форме или отчете имеет особую структуру: после имени элемента управления, который является подчиненной формой, нужно сначала указать специальное свойство: Form — для форм или Report — для отчетов, а затем имя элемента управления, на который выполняется ссылка:

Forms!Заказы!ТоварыПодформа.Form![Код Товара]



Выполнение макроса, процедуры или запроса



Таблица 11.1. Макрокоманды Microsoft Access 2002

Категория

Назначение

Макрокоманда

Работа с данными в формах и отчетах

Отбор данных

Применить Фильтр (ApplyFilter)



Перемещение по данным

СледующаяЗапись (FindNext) НайтиЗапись (FindRecord) КЭлементуУправления (GoToControl) НаСтраницу (GoToPage) НаЗапись (GoToRecord)



Обновление данных или экрана

Обновление (Requery) ПоказатьВсеЗаписи ( ShowAllRecords )

Выполнение

Выполнение команды

Выполнить Команду (RunComraand)



Выполнение макроса, процедуры или запроса

ЗапускМакроса (RunMacro) Залуск Программы (RunCode) ОткрытьЗапрос (OpenQuery) 3anycк 3anpoca SQL (RunSQL)



Выполнение другого приложения

Запуск Приложения (RunApp)



Прерывание выполнения

Отменить Событие (CancelEvent) Остановить ВсеМакросы (StopAllMacros) ОстановитьМакрос (StopMacro)



Выход из Microsoft Access

Выход (Quit)

Импорт/экспорт

Передача объектов Microsoft Access в другие приложения

Вывести В Формате (OutputTo) ОтправитьОбъект (SendObject)



Преобразование формата данных

Преобразовать БазуДанных (Transfer Database) ПереносБазыДанныхSQL (TransferSQLDat abase) Преобразовать ЭлектроннуюТаблицу (Transfer Spreadsheet) ПреобразоватьТекст (TransferText )

Работа с объектами

Копирование, переименование и сохранение объекта

КопироватьОбъект (CopyObject) Копировать Файл БазыДанных (CopyDatabase File) Переименовать (Rename) Сохранить (Save)

Прочие Вывод на экран или скрытие встроенной или специальной панели инструментов

Подача звукового сигнала

ПанельИнструментов (ShowToolbar) Сигнал (Веер)

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

По сравнению с предыдущей версией Access, в Microsoft Access 2002 появились три новые макрокоманды:

ПереносБазыДанныхSQL (TransferSQLDatabase) — переносит базу данных Microsoft SQL Server 7.0 и выше на другой сервер;

КопироватьФайлБазыДанных(CopyDatabaseFile) — выполняет копирование текущей базы данных Microsoft SQL Server 7.0 и выше, присоединенной к проекту Access;

ОткрытьФункцию (OpenFunction) — выполняет функцию, определенную пользователем, в проекте Access. Эта функция- представляет собой запрос, который, используя входные параметры, возвращает результаты так же, как и хранимая процедура.

Использование макросов оправдано тем, что их легко создавать, и для этого не нужно изучать синтаксис языка программирования. Как будет показано в следующем разделе, для создания макроса требуется знать лишь основные приемы работы в Microsoft Access и Windows, такие как перетаскивание объектов из окна База данных (Database) в специальное окно — Конструктор макросов (Macro Design), выбор действия из списка и ввод выражений в качестве аргументов макрокоманды. Поэтому, если очень не хочется изучать синтаксис языка VBA или это представляется слишком трудным, смело применяйте макросы, и вы получите достаточно функциональное приложение.

Как уже говорилось выше, основное назначение макросов — это создание удобного интерфейса приложения: чтобы формы и отчеты открывались при нажатии кнопок в форме или на панели инструментов или же привычным выбором команды меню; чтобы при открытии приложения пользователь видел на экране не окно База данных (Database), наполненное множеством таблиц, запросов, форм и отчетов, а некую понятную форму, с помощью которой можно было бы сразу производить желаемые действия и т. д.

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

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

Возможности макрокоманд ограничены по сравнению с возможностями языка VBA, поэтому в ряде случаев без программирования на VBA не обойтись, хотя сначала нужно быть уверенным, что эти дополнительные возможности действительно нужны. Язык VBA предоставляет более широкие возможности для работы с данными, позволяет использовать механизм программирования объектов для связи с другими приложениями, вызывать функции из библиотек динамической загрузки (DLL) Windows и создавать собственные специализированные функции.
Макросы можно использовать практически везде, где применяются процедуры VBA, однако процедуры VBA, как правило, выполняются быстрее.
Макросы являются объектами, существующими отдельно от форм и отчетов, в которых они используются, поэтому, когда этих объектов становится очень много, их поддержка достаточно трудоемка. Процедуры обработки событий VBA являются неотъемлемой частью форм и отчетов, и в этом есть свои преимущества. Например, при переносе форм и отчетов из одной базы данных в другую с ними автоматически переносятся связанные процедуры.
Тем не менее, как уже отмечалось, во многих случаях использование макросов вполне оправдано, т. к. это существенно упрощает и ускоряет разработку приложения. С помощью макросов можно создавать небольшие однопользовательские приложения, хотя при создании многопользовательских или клиент-серверных приложений, где скорость работы приложения критична, лучше применять VBA.



Разрешенные комбинации клавиш



Таблица 11.2. Разрешенные комбинации клавиш

Обозначение

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

^А или ^4

<Ctrl> + буква или <Ctrl> + цифра

{F1}

Любая функциональная клавиша

^{F1}

<Ctrl> + любая функциональная клавиша

+ {F1}

<Shift> + любая функциональная клавиша

{Insert}

<Ins>

A {Insert}

<Ctrl> + <Ins>

+{Insert}

<Shift> + <Ins>

{Delete} или {Del}

<Del>

^{ Delete} или ^{Dе1}

<Ctrl> + <Del>

+{ Delete} или +{Del}

<Shift> + <Del>



Значения аргументов макрокоманды ОткрытьФорму (OpenForm)



Таблица 11.3. Значения аргументов макрокоманды ОткрытьФорму (OpenForm)

Аргумент

Значение

Имя формы (Form Name)

Заказы (Orders)

Режим (View) Форма (Form)
Условие отбора (Condition) [КодКлиента] = [Forms] ! [Клиенты] ! [КодКлиента]
Режим данных (Data Mode) Только чтение (Read Only)
Режим окна (Window Mode)
Обычное (Normal)
Аргумент Режим (View) определяет режим, в котором форма должна быть открыта. Он может принимать значения: Форма (Form), Конструктор (Design), Просмотр (Print Preview), Таблица (Datasheet), Сводная таблица (PivotTable) и Сводная диаграмма (Pivot Chart). Аргумент Условие отбора (Condition) определяет условие для отбора записей, отображаемых в форме. Условие представляет собой выражение. В данном случае это выражение содержит ссылку на элемент управления КодКлиента (CustomerlD) в форме "Клиенты" (Customers), что позволяет выбрать все записи из таблицы "Заказы" (Orders), в которых код клиента равняется значению, заданному в поле "КодКлиента" (CustomerID) формы "Клиенты" (Customers). (Подробнее об использовании ссылок в макросах и выражениях будет рассказано в разд. "Применение макросов" данной главы.) Аргумент Режим данных (Data Mode) определяет способ работы с данными и может принимать одно из значений: Добавление (Add), Изменение (Edit) или Только чтение (Read Only). И наконец, аргумент Режим окна (Window Mode) определяет тип окна: Обычное (Normal), Невидимое (Hidden), Значок (Icon) и Окно диалога (Dialog).

Закройте окно макроса, сохранив изменения. В окне свойств кнопки в поле Нажатие кнопки (On Click) появится имя макроса "Заказы клиента".
Раскройте вкладку Макет (Format) и введите в поле Подпись (Caption) название кнопки: Заказы клиента. То же самое имя рекомендуется ввести в поле Имя (Name) на вкладке Другие (Other).
Теперь остается перейти в режим Формы и проверить, как макрос отрабатывает событие Нажатие кнопки (On Click). Если вы нигде не ошиблись, то должны увидеть на экране картинку, похожую на ту, что изображена на рис. 11.12.



Значения аргументов макрокоманды Закрыть (Close)



Таблица 11.4. Значения аргументов макрокоманды Закрыть (Close)

Аргумент

Значение

Тип объекта (Object Type)

Форма (Forms)

Имя объекта (Object Name) Заказы (Orders)
Сохранение (Save)
Нет (No)
Аргумент Сохранение (Save) позволяет определить, будет ли Access при закрытии формы отображать диалоговое окно для подтверждения сохранения измененных данных. Поскольку мы открывали форму "Заказы" (Orders) в режиме только для чтения, изменение данных запрещено, поэтому данному аргументу необходимо присвоить значение Нет (No). Готовый макрос показан на рис. 11.13.

Закройте окно макроса, сохранив изменения. Измените имя макроса, назначенного событию Включение (On Activate). Для этого выберите в списке или введите имя Клиенты.Закрыть (Customers.Close) и нажмите клавишу <Enter>. Теперь сохраните форму, перейдите в режим Формы и проверьте, как работают созданные вами макросы.

Иллюстрация 11.13. Макрос для закрытия формы



Выполнение и отладка макросов





Выполнение и отладка макросов


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

Универсальным способом запуска макроса является использование команды меню Сервис, Макрос, Выполнить макрос (Tools, Macro, Run Macro) (рис. 11.5).

В появившемся при выборе этой команды диалоговом окне нужно указать (ввести или выбрать из списка) полное имя макроса, т. е. имяГруппы.имяМакроса (рис. 11.6). Этот способ позволяет выполнить макрос из любого активного окна, будь то окно макросов, окно базы данных или, например, Конструктор форм.



В этой главе мы познакомили



Выводы

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


Вызов макроса из процедуры VBA



Вызов макроса из процедуры VBA

Как мы уже говорили, процедуры VBA и макросы в Access являются объектами близкими и часто взаимозаменяемыми, т. е. вместо макроса можно использовать процедуру VBA и наоборот. Существуют способы запуска макроса из процедуры VBA, запуска процедуры VBA из макроса, кроме того, Access позволяет преобразовать макрос в процедуру VBA. Такое преобразование описано в разд. "Преобразование макросов в процедуры VBA" данной главы.

Для запуска процедуры VBA из макроса существует специальная макрокоманда ЗапускПрограммы(КипСоdе). Эта макрокоманда имеет один аргумент — имя вызываемой процедуры, хотя вызываться может только функция, а не подпрограмма.

Для запуска макроса из процедуры VBA применяется специальный метод ЗапускМакроса (RunMacro) объекта DoCmd, например:

DoCmd.RunMacro "Макрос!".

Объект DoCmd используется в процедуре VBA для выполнения макрокоманд Access. При этом английское имя нужной макрокоманды должно быть указано в качестве Метода объекта DoCmd, например строка процедуры

DoCmd.OpenForm "Клиенты"

позволяет открыть форму "Клиенты". Здесь "Клиенты"— аргумент макрокоманды. Аргументы перечисляются в предложении DoCmd через запятую. Таким способом может быть выполнено большинство макрокоманд.

Создание процедур VBA мы рассмотрим ниже, в гл. 13.



Запуск макроса из другого макроса



Запуск макроса из другого макроса

Иногда требуется вызвать макрос из другого макроса. Это можно сделать с помощью макрокоманды ЗапускМакроса (RunMacro). Мы уже встречались с этой макрокомандой при описании макроса "AutoKeys". Здесь нужно отметить, что эта макрокоманда имеет три аргумента: кроме имени макроса, задается число повторов выполнения макрокоманды и условие повтора. Таким образом, эта макрокоманда позволяет организовывать циклы. Аргумент Число повторов (Repeat Count) задает количество вызовов макроса. Аргумент Условие повтора (Repeat Expression) является выражением, которое может принимать значение Истина или Ложь. Перед выполнением макрокоманды ЗапускМакроса (RunMacro) проверяется значение этого выражения. Если оно Истина, то макрос выполняется, если Ложь, то макрос не выполняется и управление передается следующей макрокоманде. Если эти два аргумента не заданы, макрос выполняется только один раз. Если заданы оба эти аргумента, цикл вызова прекращается, когда макрос выполнился заданное число раз либо когда заданное условие окажется невыполненным и получит значение Ложь.

Замечание

Имя макроса в аргументе макрокоманды ЗапускМакроса (RunMacro) должно быть полным, т. е. должно иметь вид имяГруппы. имяМакроса, даже если вызываемый макрос находится в той же группе, что и вызывающий. Если условие повтора задано таким образом, что оно всегда истинно, то цикл окажется бесконечным. Можно прервать его с помощью комбинации клавиш <Ctrl>+<Break>. Если это не поможет, придется прервать работу Access, нажав комбинацию клавиш <Ctrl>+<Alt>+<Del>.



Запуск макроса из окна базы данных



Запуск макроса из окна базы данных

Чтобы запустить макрос из окна База данных (Database), щелкните по ярлыку Макросы (Macros) на панели объектов, найдите в списке нужный макрос и дважды щелкните по нему кнопкой мыши или нажмите кнопку Запуск (Run) на панели инструментов окна База данных. Последний способ подходит, только если в выбранном объекте содержится один макрос. В противном случае нужно воспользоваться универсальным способом выполнения макроса, описанным выше.

Замечание

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



Запуск макроса из окна Конструктора макросов



Запуск макроса из окна Конструктора макросов

Этот способ применяется для тестирования только что созданного или исправленного макроса. Если макрос в окне Конструктора макросов один, то для его запуска нужно просто нажать кнопку Запуск (Run) на панели инструментов или выбрать команду Запуск, По шагам (Run, Single Step) (последний способ позволяет отладить макрос). Однако, если макросов несколько, то с помощью этой кнопки или команды можно запустить только первый макрос в группе. Чтобы запустить любой другой макрос из группы, нужно воспользоваться командой меню Сервис, Макрос, Выполнить макрос (Tools, Macro, Run Macro).

Если вы часто используете этот способ запуска макроса, имеет смысл настроить панель инструментов, добавив на нее стандартную кнопку Запуск (Run Macro). Она эквивалентна выполнению команды меню Сервис, Макрос, Выполнить макрос (Tools, Macro, Run Macro). (0 настройке панелей инструментов см. разд. "Создание и изменение панелей инструментов" гл. 14.)



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



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

При открытии базы данных Microsoft Access могут выполняться некоторые действия. Чаще всего это открытие специальной формы, так называемой Главной кнопочной формы, вывод специальных меню или панелей инструментов, скрытие стандартных меню и т. д. Для определения этих действий используется диалоговое окно Параметры запуска (Startup). Однако иногда требуется при запуске приложения выполнить более сложный набор действий, чем тот, что позволяет задать это диалоговое окно. Например, может потребоваться заранее открыть несколько форм (не показывая их на экране), чтобы потом их отображение не занимало много времени, проверить некоторые условия или запросить ввод некоторых данных. Все это можно сделать с помощью специального макроса, который называется "AutoExec". При открытии базы данных Access проверяет наличие этого макроса и, если он существует, выполняет его. При создании макроса "AutoExec" следует помнить, что Access сначала выполнит действия, определенные в окне Параметры запуска (Startup), а затем — макрос "AutoExec", поэтому в них не должно быть противоречивых действий.



Запуск макроса с помощью кнопки на панели инструментов



Запуск макроса с помощью кнопки на панели инструментов

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

Чтобы добавить кнопку на стандартную панель инструментов Access:

Щелкните правой кнопкой мыши по панели инструментов и выберите в контекстном меню команду Настройка (Customize).
В появившемся диалоговом окне Настройка (Customize) раскройте вкладку Панели инструментов (Toolbars).
Установите флажок для одной из стандартных панелей инструментов, например Запрос в режиме таблицы (Query Datasheet), чтобы она отобразилась на экране.
Закройте диалоговое окно Настройка (Customize), нажав кнопку Закрыть (Close).
Щелкните по ярлыку Макросы (Macros) на панели объектов в окне База данных (Database) и найдите нужный макрос.
Перетащите макрос с помощью мыши на панель инструментов Запрос в режиме таблицы (Query Datasheet).


Запуск макроса с помощью команды меню



Запуск макроса с помощью команды меню

Еще одним распространенным способом запуска макроса является запуск с помощью специально созданной для этого команды меню. Способы создания команд меню для запуска макросов очень похожи на те, что применяются для создания кнопок на панели инструментов. Например, можно воспользоваться для этого командой меню Сервис, Макрос, Создать меню из макроса (Tools, Macro, Create Menu from Macro).

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



Запуск макроса с помощью комбинации клавиш



Запуск макроса с помощью комбинации клавиш

Для запуска макроса можно назначить комбинацию клавиш. Для этого необходимо создать специальную группу макросов — "AutoKeys". Эта группа макросов должна для каждой назначенной вами комбинации клавиш содержать макрокоманду запуска соответствующего макроса. Пример группы макросов "AutoK"eys приведен в базе данных "Борей". Откройте эту группу макросов в режиме Конструктора. Она содержит один макрос (рис. 11.9). Имя макроса— это запись комбинации клавиш <Ctrl>+<P>. Сам макрос состоит из одной макрокоманды ЗапускМакроса (RunMacro), которая запускает макрос "Телефоны клиентов. Печать" (Customer Phone List.Print). Макрос "AutoKeys" просматривается каждый раз, когда пользователь вводит специальные комбинации клавиш, например <Ctrl>+<P>. Если введенная комбинация клавиш найдена в "AutoKeys", то запускается соответствующий макрос.