Читайте также:
|
|
Второй шаг к усовершенствованию формы Заказы: замена поля Название в подформе ЗаказаноТовараПодформа списком. Проделайте следующие действия.
Откройте форму ЗаказаноТовараПодформа в режиме Конструктора и удалите поле Название. Затем создайте поле со списком на основе поля КодТовара таблицы Товары. Используйте Мастер, аналогично проделанному ранее с полем КодКлиента или полем КодМенеджера.
Напомним, что следует щелкнуть по элементу Поле со списком на Панели элементов, установить указатель мыши в нужное место и, удерживая левую кнопку, растянуть элемент до требуемых размеров. Обратим внимание, что, отвечая на вопросы Мастера, в качестве источника данных для списка надо выбрать таблицу Товары, отобрать в список поля КодТовара и Название, выбрать сохранение выбранного значения в поле КодТовара.
Если требуется выводить товары в списке в алфавитном порядке, то для поля Название укажите сортировку по возрастанию. Форма Заказы теперь полностью доработана до вида, представленного на рис.12.
Проверьте работу формы Заказы: откройте форму, попытайтесь добавить новый заказ, т.е. введите фамилию менеджера, клиента, а затем отберите товары для заказа.
Задание 6. Подключение макросов. Рассчитываемые поля
Если попытаться заполнить новый заказ, то эта процедура окажется достаточно трудоемкой: поля Сумма, ОбщаяСумма, ДатаЗаказа придется рассчитывать и вводить вручную, некоторые поля, такие как КодТовара, Название, Цена, вообще невозможно заполнить, не имея под рукой таблицу Товары.
И еще один недостаток – изменение цены товара в таблице Товары влечет за собой изменение цены товара во всех заказах, хотя для ранее проданных товаров должна сохраняться прежняя (продажная, до изменения) цена. Этого можно избежать, если добавить в подчиненную форму ЗаказаноТовараПодформа дополнительное поле ЦенаПродажи, которое будет хранить цену на момент выписки заказа. Т.о. необходимы следующие доработки:
· дополнительное поле ЦенаПродажи должно заполняться при вводе наименования товара автоматически (с возможностью изменения вручную при необходимости),
· поля Сумма и ОбщаяСумма должны рассчитываться автоматически.
Реализация этих возможностей требует применения макросов.
Макросы
Макрос – это объект Access, используемый для автоматизации действий пользователя. Макровызовы выполняются в ответ на события в форме. Например, событию Нажатие кнопки или клавиши можно «приписать» макрокоманду ОткрытьФорму, событию После обновления некоторого поля «приписать» макрокоманду ЗадатьЗначение другому полю и т.д.
Access содержит более 50 макрокоманд. Перечень имен макрокоманд доступен в окне конструктора макроса.
Прежде, чем начать создание макроса, проведем изменения в таблице ЗаказаноТовара, где наряду с количеством и суммой следует хранить цену на момент продажи.
Поле ЦенаПродажи необходимо добавить в таблицу ЗаказаноТовара, а не в таблицу Товары, так как оно характеризует конкретную строку заказа наряду с полями Количество и Сумма. Следует добавить поле ЦенаПродажи и в соответствующий запрос, т.е. в запрос для подчиненной формы ЗаказаноТовараПодформа. При этом в форме ЗаказаноТовараПодформа необходимо удалить поле Цена, а вместо него поставьте поле ЦенаПродажи.
Теперь перейдем к макросам. Создание простого макроса предполагает выполнение нескольких действий:
1. Выберите закладку Макросы в главном окне базы данных Access и нажмите кнопку Создать.
2. После открытия окна Конструктора макросов нажмите кнопку Имена макросов и кнопку Условия на Панели инструментов, для того чтобы появились соответствующие колонки окна создания макросов. В этом окне и строятся макросы (рис.15).
Здесь каждая строка с именем представляет собой отдельный макрос. В первой колонке записывают имя макроса, во второй – условие его выполнения (если необходимо), в третьей – макрокоманду, которую выбирают из списка, в последней, если требуется, – примечание. В нижней части окна задают значения аргументов макрокоманды, каждая макрокоманда имеет свой перечень аргументов.
Рис.15. Создание макроса ЦенаПродажи
На рис. 15 показан макрос с именем ЦенаПродажи, который выполняет макрокоманду ЗадатьЗначение. Аргументы указывают, что полю [ ЦенаПродажи ] (строка Элемент) присваивается значение поля [ Цена ] (строка Выражение) при вводе товара. Отметим, что имена полей заключаются в квадратные скобки. Ввод нужных полей можно осуществить вручную или выбрать нужное поле в нужной таблице, заказе или форме в окне Построителя выражений, который вызывается щелчком по кнопке с тремя точками в конце нужной для ввода строки.
Отметим также, что в одном окне Конструктора можно записать несколько макросов (с разными именами), а затем сохранить их в закладке Макросы под общим именем, например, Заказы.
Откройте макрос Заказы и впишите второй макрос Сумма, который выполняет присваивание [ Сумма ]=[ ЦенаПродажи ]*[ Количество ] при любом обновлении полей ЦенаПродажи и Количество (рис 16).
Рис.16. Создание макроса Сумма
Таким образом, макросы созданы, но они не будут работать, т.к. ниоткуда не вызываются, макросы без событий – вещь бесполезная.
Поэтому теперь необходимо обеспечить вызов созданных макросов в подчиненной форме ЗаказаноТовараПодформа с помощью следующих событий:
· первый макрос должен быть «приписан» событию После обновления поля КодТовара;
· второй – событию После обновления полей Количество и ЦенаПродажи. Для этого проделайте следующие действия:
1. Откройте форму ЗаказаноТовараПодформа в режиме Конструктора, выберите поле со списком КодТовара и откройте для него закладку События окна Свойства.
2. В свойство После обновления поля введите имя макроса Заказы.ЦенаПродажи (выберите из списка макросов).
3. Аналогично для полей Количество и ЦенаПродажи установите событие После обновления, но уже на макрос Заказы.Сумма.
Закройте форму ЗаказаноТовараПодформа и проверьте, как все это работает. В форме Заказы при отборе новых товаров или замене товара цена продажи заполняется автоматически, а при вводе или изменении количества и цены продажи автоматически пересчитывается сумма в текущей строке.
Автоматический расчет поля ОбщаяСумма: суммирование полей
Нам осталось составить макрос, расчитывающий поле ОбщаяСумма при изменении состава заказа, т.е. при наступлении в подформе ЗаказаноТовараПодформа следующих событий:
· обновления (изменения) суммы в одной из строк или добавления новой строки – событие После обновления подформы;
· удаления строки – событие После подтверждения Del подформы.
Сформируем макрос ОбщаяСумма, а затем поясним его (рис.17).
Рис.17. Сложный макрос ОбщаяСумма
Макрос ОбщаяСумма состоит из двух макрокоманд ЗадатьЗначение. Первая макрокоманда непосредственно рассчитывает общую сумму с помощью функции DSum:
DSum("[ Сумма ]";"[ ЗаказаноТовара ]";"[ КодЗаказа ] = [Forms]![ Заказы ]![ КодЗаказа ]")
Как видно из рис.17, вычисленное функцией значение присваивается полю ОбщаяСумма в форме Заказы. При этом используется полное имя поля — [Forms]![ Заказы ]![ ОбщаяСумма ], поскольку обращение к нему производится из подформы.
Самую большую вычислительную работу в этом макросе выполняет функция DSum. Она суммирует поля Сумма из таблицы ЗаказаноТовара, отбирая записи по условию [КодЗаказа]=[Forms]![Заказы]![КодЗаказа], т.е. отбирает только те записи, которые относятся к текущему заказу.
Приведем синтаксис (правило записи) функции DSum:
DSum ("Что суммировать" – это название нужного поля; "Где суммировать" – это источник полей для суммирования (название таблицы); "Условие отбора суммируемых записей")
Если условие отбора отсутствует, тогда суммируются все записи из указанной таблицы запроса.
Ввести выражение для данного макроса с помощью описанной функции можно либо в ручную (но важно не ошибиться в названиях полей и таблиц) или воспользоваться Построителем выражений, описанным ранее.
ВАЖНО! Обязательным условием работы данной функции является запись всех аргументов в кавычках!
Функция DSum работает так, что если отсутствуют записи, удовлетворяющие условию в функции DSum, то она получает значение Null. Поэтому вторая макрокоманда задает значение [ ОбщаяСумма ]=0 при условии, что в предыдущей макрокоманде был рассчитан Null (рис.18).
Рис.18. Аргументы второй макрокоманды макроса ОбщаяСумма.
Теперь обеспечим вызов построенного макроса, т.е. припишем его событиям подформы ЗаказаноТовараПодформа.
1. Откройте форму ЗаказаноТовараПодформа в режиме Конструктора, и выделите её кнопкой , расположенной на пересечении вертикальной и горизонтальной линеек в конструкторе формы, затем откройте ее свойства.
2. В закладке События найдите свойства После обновления и После подтверждения Del и присвойте им имя созданного макроса Заказы.ОбщаяСумма, закройте форму.
3. Проверьте работу формы Заказы –при изменении строки заказа, добавлении или удалении строки общая сумма будет пересчитываться.
Таким образом, мы ввели самые необходимые усовершенствования для удобной работы с формой Заказы.
Задание 7. Усовершенствование формы Заказы
Для быстрого ввода новых клиентов и товаров, которых еще нет в базе данных, удобно иметь на форме кнопки Новый клиент и Новый товар, которые позволят вызывать соответствующие формы и вводить данные о новых клиентах или товарах, не выходя из формы Заказы (рис. 19).
Рис. 19. Частично усовершенствованный вид формы Заказы
Для создания кнопки на форме необходимо выбрать соответствующий объект на Панели элементов и выделить мышью на форме место под эту кнопку. Чтобы происходило какое-то действие по нажатию на кнопку, нужно описать это действие, что можно сделать двумя способами:
1. С помощью Мастера, который включится автоматически при размещении кнопки на форме. В этом случае, необходимо пройти следующие шаги Мастера:
Шаг 1. в окне Категории: выбрать Работа с формой, в окне Действие: Открыть форму;
Шаг 2. выбрать название нужной формы (в нашем случае это форма Клиенты);
Шаг 3. указать, какие записи должны быть отображены в открывшейся форме: отобранные записи или все записи. Выберите второй переключатель – Открыть форму и показать все записи;
Шаг 4. задайте внешний вид кнопки, на ней можно разместить рисунок, выбрав его из списка стандартных, представленных в нижнем окне, или текст, введенный вручную. Введите название формы, которая будет открываться по нажатию на кнопку – Новый клиент;
Шаг 5. это последний шаг, который позволяет определить внутреннее (программное) имя созданной кнопки. Его можно оставить заданным по умолчанию.
Готово. Проверьте работу созданной кнопки в режиме формы. Щелчок на ней должен открыть форму Клиенты.
2. Если Мастер не доступен, можно воспользоваться настройкой свойств уже размещенной на форме кнопки вручную. Для этого необходимо создать макрос на открытие нужной формы (рис.20).
Шаг 1. Откройте существующий макрос Заказы и введите имя нового макроса, например, Товары. В качестве макрокоманды выберите значение ОткрытьФорму. В нижнем окне появятся соответствующие параметры, где в строке Имя формы выберите Товары, а в строке Режим – Форма. Сохраните созданный макрос.
Шаг 2. Откройте форму Заказы в режиме Конструктора, выделите созданную новую кнопку и откройте окно ее Свойств.
Шаг 3. В закладке Макет введите надпись, которая будет отображаться на кнопке, в строке Подпись, в данном случае это надпись Новый товар.
Шаг 4. Далее в закладке События окна Свойств в строке Нажатие кнопки выберите созданный макрос Заказы.Товары. Таким образом, вы припишите кнопке команду открытия формы товары при щелчке на ней.
Перейдите в режим формы и проверьте работу обеих кнопок: Новый Клиент и Новый Товар.
Рис. 20. Макрос вызова для кнопки
Введите нового клиента в форме Клиенты и новый товар в форме Товары. Закройте формы для ввода и проверьте поля со списками ФИО клиента и Название товара в форме Заказы. Обратите внимание на то, что, при закрытии формы Клиенты и Товары, списки клиентов (и, соответственно, товаров) в форме Заказы обновляться не будут, т.е. в уже существующем списке новая фамилия клиента не появится (тоже касается и нового товара). Это происходит потому, что в момент работы с формами Клиенты и Товары основная форма Заказы была открыта. Можно, конечно, каждый раз при добавлении нового клиента или товара закрывать форму Заказы и открывать ее вновь для того, чтобы внесенные изменения отобразились в полях со списком, но это сложно и не удобно.
Для упрощения работы с этими формами при каждом включении формы Заказы следует делать ее обновление. Включение означает любое действие с этой формой, щелчок мышью на ней, выбор любых ее объектов и т.д. Свойству Включение формы Заказы надо присвоить макрос ее обновления. Одновременно этот же макрос должен закрывать форму Клиенты, если пользователь забыл ее закрыть и перешел сразу в форму Заказы. Для устранения этих недостатков необходимо провести следующие действия:
1. На форме Заказы в режиме конструктора откройте окно Свойств поля со списком ФИО клиента.
2. На вкладке Другие изменить свойство Имя на КодКлиентаПС.
3. Откройте макрос Заказы в режиме конструктора и создайте в нем дополнительный макрос с именем ОбновитьЗаказы для автоматического обновления поля со списком ФИО клиента, как показано на рис.21. Он состоит из макрокоманды Обновление. Параметром этой макрокоманды является имя поля со списком, которое можно вписать вручную, но лучше скопировать из строки Имя окна Свойств.
Рис.21. Макрос для события Включение формы Заказы
4. Второй командой в этом макросе будет Закрытие формы Заказы, которая создается аналогично макрокоманде открытия формы.
5. Откройте окно Свойства формы Заказы, выберите вкладку События и в строке Включение выберите созданную макрокоманду Заказы.ОбновитьЗаказы.
6. Проверьте совместную работу формы Заказы с формой Клиенты.
7. Доработайте макрос ОбновитьЗаказы, добавив в него еще две строки для обновления поля со списком Название товара, и закрытия формы Товары. Учтите, что поле со списком Название товара является составной частью подчиненной формы для формы Заказы, которая рассматривается основной формой как единое целое с именем СоставЗаказа.
Дата добавления: 2015-10-28; просмотров: 123 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Запросы с параметрами | | | Задание 8. Фильтрация данных |