Глава 6. Макросы
Как известно, форма и каждый элемент формы имеют набор свойств. Свойства отображаются и настраиваются в режиме Конструктора в окне Свойства. Часть свойств сгруппирована в закладку События, где перечислены все события, на которые реагирует элемент. Если некоторому событию присвоить имя функции, макроса или процедуру обработки событий, то в ответ на возникновение этого события будет автоматически выполняться указанная для него функция, макрос или процедура обработки событий.
Макрос – это объект Access, используемый для автоматизации действий пользователя. Макровызовы выполняются в ответ на события в форме. Например, событию Нажатие клавиши кнопки можно 'приписать' макрокоманду ОткрытьФорму, событию После обновления некоторого поля 'приписать' макрокоманду ЗадатьЗначение другому полю и т.д.
Access содержит более 50 макрокоманд. Перечень имен макрокоманд доступен в окне конструктора макроса – запоминать названия не надо. Подробное описание макрокоманд можно получить из справочной системы Access, нажав клавишу F1. Вот названия некоторых из них: ВыводНаЭкран, Выход, ЗадатьЗначение, Закрыть, НаЗапись, ОбновитьОбъект, Обновление, ОтменитьСобытие, печать, Сообщение, Сохранить и пр.
Создание простого макроса предполагает выполнение нескольких действий:
1. Выберите закладку Макросы в главном окне базы данных Access и нажмите кнопку Создать.
2. После
открытия окна Конструктора макросов нажмите кнопку Имена макросов и кнопку Условия
на Панели
инструментов, для того чтобы появились соответствующие колонки окна. В этом
окне и строятся макросы – рис. 6.1:
Здесь каждая строка с именем представляет собой отдельный макрос. В первой колонке записывают имя макроса, во второй – условие его выполнения (если необходимо), в третьей – макрокоманду, которую выбирают из списка, в последней - если требуется, примечание. В нижней части окна задают значения аргументов макрокоманды; каждая макрокоманда имеет свой перечень аргументов.
Рис. 6.1. Окно Конструктора макросов
На рис. 6.1 показан макрос с именем Ввод, который выполняет макрокоманду ЗадатьЗначение. Аргументы указывают, что полю [Сумма] присваивается значение [Цена]*[Количество]. Отметим, что имена полей заключаются в квадратные скобки.
Отметим также, что в одном окне Конструктора макросов можно записать несколько макросов (с разными именами), а затем сохранить их в закладке Макросы под общим именем, например МоиМакросы. В этом случае обращение к макросу Ввод записывается так: МоиМакросы.Ввод.
Автоматическое заполнение полей ЦенаПродажи и Сумма
Продолжим разработку нашей системы "Заказы". Нам придется обратиться к таблице ЗаказаноТовара, где наряду с количеством и суммой следует хранить цену на момент продажи (см. раздел "Доработка формы Заказы: устранение недостатков"). В итоге, состав заказа должен принять вид, как на рис. 6.8. Кроме того, поля ЦенаПродажи и Сумма должны заполняться автоматически – тут без макроса не обойтись.
Поле ЦенаПродажи необходимо добавить в таблицу ЗаказаноТовара, а не в таблицу Товары, так как оно характеризует конкретную строку заказа наряду с полями Количество и Сумма. В режиме Конструктора добавьте в таблицу ЗаказаноТовара поле ЦенаПродажи – рис. 6.2.
Рис. 6.2. Добавление поля ЦенаПродажи в таблицу ЗаказаноТовара
Следует добавить поле ЦенаПродажи и в соответствующий запрос: в запрос для подчиненной формы ЗаказаноТовараПодформа введите поле ЦенаПродажи, как на рис. 6.3.
Рис.
6.3. Добавление поля ЦенаПродажи в запрос
Нам осталось создать два макроса и 'приписать' их нужным полям - для автоматического заполнения полей ЦенаПродажи и Сумма. Первый макрос должен выполнять присваивание значения полей [ЦенаПродажи]=[Цена] при вводе товара, второй – выполнять присваивание [Сумма]=[ЦенаПродажи]*[Количество] при любом обновлении полей ЦенаПродажи и Количество.
Сформируйте макросы, присвоив им для ясности имена ЦенаПродажи и Сумма – рис. 6.4.
Закройте и сохраните макросы с общим именем Заказы. Таким образом, макросы созданы, но они ниоткуда не вызываются – макросы без событий вещь бесполезная.
Поэтому теперь необходимо обеспечить вызов созданных макросов в подчиненной форме ЗаказаноТовараПодформа с помощью событий: 1ый макрос должен быть 'приписан' событию После обновления поля КодТовара; 2ой – событию После обновления полей Количество и ЦенаПродажи. Проделайте следующие действия:
Рис. 6.4. Создание макросов ЦенаПродажи и Сумма
1. Откройте форму ЗаказаноТовараПодформа в режиме Конструктора, выберите поле со списком КодТовара и откройте для него закладку События окна Свойства.
2. В свойство После обновления поля введите имя макроса Заказы.ЦенаПродажи (выберите из списка макросов) – рис. 6.4.
Рис. 6.4. Установка события для поля КодТовара
3. Аналогично для полей Количество и Цена Продажи установите событие После обновления, но уже на макрос Заказа.Сумма.
4. Закройте форму ЗаказаноТовараПодформа и проверьте как все это работает. Откройте форму Заказы: при отборе новых товаров или замене товара цена продажи заполняется автоматически, а при вводе/изменении количества и цены продажи – сумма в строке пересчитывается.
Автоматический расчет поля ОбщаяСумма: суммирование полей
Нам осталось составить макрос, пересчитывающий поле ОбщаяСумма при изменении состава заказа, т.е. при наступлении в подформе ЗаказаноТовараПодформа следующих событий:
ü обновления (изменения) суммы в одной из строк или добавления строки – событие После обновления подформы:
ü удаления строки – событие После подтверждения Del подформы.
Сформируем макрос ОбщаяСумма, а затем поясним его – рис. 6.5:
Рис. 6.5. Сложный макрос ОбщаяСумма
Макрос ОбщаяСумма состоит из двух макрокоманд ЗадатьЗначение. Первая макрокоманда непосредственно рассчитывает общую сумму с помощью функции Dsum:
DSum("[Сумма]";"[ЗаказаноТовара]";"[КодЗаказа]=[Forms]![Заказы]![КодЗаказа]")
Как видно, вычисленное функцией значение присваивается полю ОбщаяСумма в форме Заказы. При этом используется полное имя поля - [Forms]![Заказы]![ОбщаяСумма], поскольку обращение к нему производится из подформы.
Функция DSum работает так, что если отсутствуют записи, удовлетворяющие условию в функции DSum, то она получает значение Null. Поэтому вторая макрокоманда задает значение [ОбщаяСумма]=0 при условии, что в предыдущей макрокоманде был рассчитан Null – рис. 6.6:
Рис. 6.6. Аргументы 2ой макрокоманды макроса ОбщаяСумма
Самую большую вычислительную работу в этом макросе выполняет функция DSum. Более конкретно - она суммирует поля Сумма в таблице ЗаказаноТовара, отбирая записи по условию [КодЗаказа]=[Forms]![Заказы]![КодЗаказа], т.е. отбирает только те записи, которые относятся к текущему заказу.
Приведем синтаксис (правило записи) функции DSum:
DSum("Что суммировать"; "Где суммировать"; "Условие отбора суммируемых записей")
Условие отбора может отсутствовать; тогда суммируются все записи из указанной таблицы, запроса.
Примечание: более подробную информацию по любым функциям и другим возможностям Access можно получить в справочной системе Access. Вызов справки - клавиша F1: далее выберите закладку Разделы, в первое поле введите интересующее слово, выберите его в списке и нажмите кнопку Показать. В справочной информации даются примеры, которые можно переносить и использовать в своей работе.
Теперь обеспечим вызов построенного макроса, т.е. припишем его событиям подформы ЗаказаноТовараПодформа:
1. Откройте
форму ЗаказаноТовараПодформа в режиме Конструктора, выделите ее кнопкой и
затем откройте ее свойства.
2. В закладке События найдите свойства После обновления и После подтверждения Del и присвойте им имя созданного макроса Заказы.ОбщаяСумма (рис. 6.7) и закройте форму:
Рис. 6.7. Установка реакции формы для расчета поля ОбщаяСумма
Проверьте работу формы Заказы: при изменении строки заказа, добавлении или удалении строки общая сумма будет пересчитываться.
Таким образом, мы ввели самые необходимые усовершенствования для удобной работы с формой Заказы. Ее доработка еще предстоит впереди.
Усовершенствование формы Заказы
В первую очередь в форму Заказы следует ввести кнопку Печать заказа, по которой будет выводиться на бумагу копия текущего заказа. Кроме того, для быстрого ввода новых клиентов и товаров, которых еще нет в базе данных, удобно иметь на форме кнопки Новый клиент и Новый товар. Это даст возможность вызывать соответствующие формы и вводить данные о новых клиентах и товарах, не выходя из формы Заказы – рис. 6.8.
Рис. 6.8. Усовершенствованный вид формы Заказы
Важно отметить, что при закрытии форм Клиенты и Товары списки клиентов (товаров) в форме Заказы не будут обновляться, если она в этот момент открыта. Поэтому при каждом включении формы Заказы следует делать её обновление: свойству Включение формы Заказы надо присвоить макрос ее обновления. Одновременно этот же макрос должен закрывать формы Клиенты и Товары на случай, если пользователь забыл их закрыть и перешел в форму Заказы.
Выполните эти усовершенствования в следующей последовательности:
1. Вначале создайте макросы для этих трех кнопок – рис. 6.9.
Первые два макроса используют макрокоманду ОткрытьФорму. Как видно, первый макрос открывает форму Клиенты, второй – Товары.
Третий макрос использует макрокоманду ОткрытьОтчет с соответствующими аргументами: открывается отчет Заказы (который еще предстоит создать) в режиме предварительного просмотра на экране, условие отбора
[КодЗаказа]=[Forms]![Заказы]![КодЗаказа]
предписывает распечатать конкретно текущий заказ. Здесь сравниваются коды заказов: код заказа [КодЗаказа] в отчете и код заказа [Forms]![Заказы]![КодЗаказа] в форме Заказы, из которой печатается отчет Заказы.
Рис. 6.9. Макросы вызова для кнопок
2. Вставьте три кнопки в раздел Примечания формы Заказы, введите названия кнопок (закладка Макет окна Свойства, свойство Подпись). Далее припишите кнопкам (закладка События окна Свойства, свойство Нажатие кнопки) созданные макросы - Заказы.Клиенты, Заказы.Товары, Заказы.ПечатьЗаказа. На рис. 6.10 показано назначение макроса кнопке Печать заказа.
Рис. 6.10. Назначение макроса кнопке Печать заказа
3. Закройте форму и проверьте работу кнопок. Кнопки Новый Клиент и Новый Товар должны вызывать соответствующие формы. Нажатие кнопки Печать заказа будет вызывать ошибку, поскольку отчет Заказы нами еще не создан.
Смысл задуманного при вводе нового клиента (товара) пока не достигнут: новый клиент (товар) после закрытия формы Клиенты (Товары) сразу не попадает в список клиентов (товаров) формы Заказы. Убедитесь в этом, проделав следующую последовательность действий: в форме Заказы нажмите кнопку НовыйКлиент, в открывшейся форме Клиенты введите новую фамилию и закройте форму, в форме Заказы откройте список Клиенты, чтоб найти эту фамилию – ее нет в списке.
Этот недостаток устраните присвоением свойству Включение формы Заказы макроса ее обновления. На рис. 6.11 показано создание соответствующего макроса ОбновитьЗаказы. Он состоит из трёх макрокоманд: первые две (аргументы макрокоманд даны на рис. 6.12) закрывают формы Клиенты и Товары на случай, если пользователь забыл их закрыть и перешёл в форму Заказы, а третья – непосредственно обновляет форму Заказы.
Из рис. 6.11 видно, что условие выполнения макрокоманд Закрыть задано функцией IsLoaded(). Она не входит в состав стандартных функций Access и будет определена ниже. Она проверяет – загружена ли форма Клиенты (Товары), если нет, то макрокоманда Закрыть не выполняется (во избежание ошибки закрытия закрытой формы).
Рис. 6.11. Макрос для события Включение формы Заказы
Рис. 6.12. Аргументы макрокоманд Закрыть макроса ОбновитьЗаказы
Проверьте совместную работу формы Заказы с формами Клиенты и Товары.
Доработка форм Клиенты и Товары
Доработка этих форм будет состоять в том, чтобы сделать их ленточными для одновременного просмотра нескольких записей.
Откройте форму Клиенты в
режиме Конструктора и сделайте ее ленточной (закладка Макет, свойство Режим
по умолчанию). На забудьте предварительно выделить форму кнопкой .
Далее расположите поля в строку, как показано на рис. 6.13. Закройте и сохраните
форму Клиенты. Проделайте аналогичные действия с формой Товары.
Проверьте совместную работу формы Заказы с форм Клиенты и Товары. Добавляемые новые клиенты и товары в формах Клиенты и Товары будут присутствовать в списках формы Заказы. Формы Клиенты и Товары будут закрываться автоматически при переключении на форму Заказы.
Рис. 6.13. Расположение полей и свойства ленточной формы
Функция IsLoaded – форма загружена?
Это единственная часть нашей ИС, требующая программирования на языке Visual Basic - VBA. Задача функции IsLoaded состоит в том, чтобы проверить – загружена ли указанная форма или нет. Если форма загружена, то функция получает значение True, иначе – False. Приведенный ниже текст функции следует создать и ввести в закладке Модули главного окна базы данных:
Function IsLoaded(MyFormName)
Dim i
IsLoaded = False
For i = 0 to Forms.Count-1
If Forms(i).FormName=MyFormName Then
IsLoaded = True
Exit Function
End if
Next
End Function
В приложении А дан ещё один полезный модуль, позволяющий печатать числа прописью.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.