- •Задание 1. Создание структуры таблиц бд заказ в режиме Конструктора
- •Структура таблиц базы данных заказ
- •Задание 2 Создание схемы данных
- •Задание 3. Простые формы
- •Элементы управления
- •Создание простых форм Клиенты, Товары, Менеджеры
- •Разработка формы Заказы. Создание поля со списком
- •Задание 4. Запросы
- •Статистические расчеты в запросах
- •Запросы с параметрами
- •Рассчитываемые поля
- •Задание 5. Подчиненные формы. Доработка формы Заказы
- •Доработка формы Заказы
- •Автоматическое заполнение даты
- •Отбор товаров в подформе с помощью поля со списком
- •Задание 6. Подключение макросов. Рассчитываемые поля
- •Макросы
- •Автоматический расчет поля ОбщаяСумма: суммирование полей
- •Задание 7. Усовершенствование формы Заказы
- •Автоматическое открытие форм на новой записи
- •Задание 8. Фильтрация данных
- •Фильтрация данных с помощью макрокоманд
- •Задание 9. Разработка отчетов
- •Создание отчета Заказы
- •Создание итогового отчета Продажи
- •Создание отчета Продажи: группировка
Автоматический расчет поля ОбщаяСумма: суммирование полей
Нам осталось составить макрос, расчитывающий поле ОбщаяСумма при изменении состава заказа, т.е. при наступлении в подформе ЗаказаноТовараПодформа следующих событий:
-
обновления (изменения) суммы в одной из строк или добавления новой строки – событие После обновления подформы;
-
удаления строки – событие После подтверждения Del подформы.
Сформируем макрос ОбщаяСумма, а затем поясним его (рис.17).

Рис.17. Сложный макрос ОбщаяСумма
Макрос ОбщаяСумма состоит из двух макрокоманд ЗадатьЗначение. Первая макрокоманда непосредственно рассчитывает общую сумму с помощью функции DSum:
DSum("[Сумма]";"[ЗаказаноТовара]";"[КодЗаказа] = [Forms]![Заказы]![КодЗаказа]")
Как видно из рис.17, вычисленное функцией значение присваивается полю ОбщаяСумма в форме Заказы. При этом используется полное имя поля — [Forms]![Заказы]![ОбщаяСумма], поскольку обращение к нему производится из подформы.
Самую большую вычислительную работу в этом макросе выполняет функция DSum. Она суммирует поля Сумма из таблицы ЗаказаноТовара, отбирая записи по условию [КодЗаказа]=[Forms]![Заказы]![КодЗаказа], т.е. отбирает только те записи, которые относятся к текущему заказу.
Приведем синтаксис (правило записи) функции DSum:
DSum("Что суммировать" – это название нужного поля; "Где суммировать" – это источник полей для суммирования (название таблицы); "Условие отбора суммируемых записей")
Если условие отбора отсутствует, тогда суммируются все записи из указанной таблицы запроса.
Ввести выражение для данного макроса с помощью описанной функции можно либо в ручную (но важно не ошибиться в названиях полей и таблиц) или воспользоваться Построителем выражений, описанным ранее.
ВАЖНО! Обязательным условием работы данной функции является запись всех аргументов в кавычках!
Функция DSum работает так, что если отсутствуют записи, удовлетворяющие условию в функции DSum, то она получает значение Null. Поэтому вторая макрокоманда задает значение [ОбщаяСумма]=0 при условии, что в предыдущей макрокоманде был рассчитан Null (рис.18).

Рис.18. Аргументы второй макрокоманды макроса ОбщаяСумма.
Теперь обеспечим вызов построенного макроса, т.е. припишем его событиям подформы ЗаказаноТовараПодформа.
-
Откройте форму ЗаказаноТовараПодформа в режиме Конструктора, и выделите её кнопкой
,
расположенной на пересечении вертикальной
и горизонтальной линеек в конструкторе
формы, затем
откройте
ее свойства. -
В закладке События найдите свойства После обновления и После подтверждения Del и присвойте им имя созданного макроса Заказы.ОбщаяСумма, закройте форму.
-
Проверьте работу формы Заказы – при изменении строки заказа, добавлении или удалении строки общая сумма будет пересчитываться.
Таким образом, мы ввели самые необходимые усовершенствования для удобной работы с формой Заказы.
Задание 7. Усовершенствование формы Заказы
Для быстрого ввода новых клиентов и товаров, которых еще нет в базе данных, удобно иметь на форме кнопки Новый клиент и Новый товар, которые позволят вызывать соответствующие формы и вводить данные о новых клиентах или товарах, не выходя из формы Заказы (рис. 19).

Рис. 19. Частично усовершенствованный вид формы Заказы
Для создания кнопки на форме необходимо выбрать соответствующий объект на Панели элементов и выделить мышью на форме место под эту кнопку. Чтобы происходило какое-то действие по нажатию на кнопку, нужно описать это действие, что можно сделать двумя способами:
-
С помощью Мастера, который включится автоматически при размещении кнопки на форме. В этом случае, необходимо пройти следующие шаги Мастера:
-
в окне Категории: выбрать Работа с формой, в окне Действие: Открыть форму;
-
выбрать название нужной формы (в нашем случае это форма Клиенты);
-
указать, какие записи должны быть отображены в открывшейся форме: отобранные записи или все записи. Выберите второй переключатель – Открыть форму и показать все записи;
-
задайте внешний вид кнопки, на ней можно разместить рисунок, выбрав его из списка стандартных, представленных в нижнем окне, или текст, введенный вручную. Введите название формы, которая будет открываться по нажатию на кнопку – Новый клиент;
-
это последний шаг, который позволяет определить внутреннее (программное) имя созданной кнопки. Его можно оставить заданным по умолчанию.
-
Готово. Проверьте работу созданной кнопки в режиме формы. Щелчок на ней должен открыть форму Клиенты.
-
Если Мастер не доступен, можно воспользоваться настройкой свойств уже размещенной на форме кнопки вручную. Для этого необходимо создать макрос на открытие нужной формы (рис.20).
-
Откройте существующий макрос Заказы и введите имя нового макроса, например, Товары. В качестве макрокоманды выберите значение ОткрытьФорму. В нижнем окне появятся соответствующие параметры, где в строке Имя формы выберите Товары, а в строке Режим – Форма. Сохраните созданный макрос.
-
Откройте форму Заказы в режиме Конструктора, выделите созданную новую кнопку и откройте окно ее Свойств.
-
В закладке Макет введите надпись, которая будет отображаться на кнопке, в строке Подпись, в данном случае это надпись Новый товар.
-
Далее в закладке События окна Свойств в строке Нажатие кнопки выберите созданный макрос Заказы.Товары. Таким образом, вы припишите кнопке команду открытия формы товары при щелчке на ней.
-
Перейдите в режим формы и проверьте работу обеих кнопок: Новый Клиент и Новый Товар.

-
Рис. 20. Макрос вызова для кнопки
Введите нового клиента в форме Клиенты и новый товар в форме Товары. Закройте формы для ввода и проверьте поля со списками ФИО клиента и Название товара в форме Заказы. Обратите внимание на то, что, при закрытии формы Клиенты и Товары, списки клиентов (и, соответственно, товаров) в форме Заказы обновляться не будут, т.е. в уже существующем списке новая фамилия клиента не появится (тоже касается и нового товара). Это происходит потому, что в момент работы с формами Клиенты и Товары основная форма Заказы была открыта. Можно, конечно, каждый раз при добавлении нового клиента или товара закрывать форму Заказы и открывать ее вновь для того, чтобы внесенные изменения отобразились в полях со списком, но это сложно и не удобно.
Для упрощения работы с этими формами при каждом включении формы Заказы следует делать ее обновление. Включение означает любое действие с этой формой, щелчок мышью на ней, выбор любых ее объектов и т.д. Свойству Включение формы Заказы надо присвоить макрос ее обновления. Одновременно этот же макрос должен закрывать форму Клиенты, если пользователь забыл ее закрыть и перешел сразу в форму Заказы. Для устранения этих недостатков необходимо провести следующие действия:
-
На форме Заказы в режиме конструктора откройте окно Свойств поля со списком ФИО клиента.
-
На вкладке Другие изменить свойство Имя на КодКлиентаПС.
-
Откройте макрос Заказы в режиме конструктора и создайте в нем дополнительный макрос с именем ОбновитьЗаказы для автоматического обновления поля со списком ФИО клиента, как показано на рис.21. Он состоит из макрокоманды Обновление. Параметром этой макрокоманды является имя поля со списком, которое можно вписать вручную, но лучше скопировать из строки Имя окна Свойств.

Рис.21. Макрос для события Включение формы Заказы
-
Второй командой в этом макросе будет Закрытие формы Заказы, которая создается аналогично макрокоманде открытия формы.
-
Откройте окно Свойства формы Заказы, выберите вкладку События и в строке Включение выберите созданную макрокоманду Заказы.ОбновитьЗаказы.
-
Проверьте совместную работу формы Заказы с формой Клиенты.
-
Доработайте макрос ОбновитьЗаказы, добавив в него еще две строки для обновления поля со списком Название товара, и закрытия формы Товары. Учтите, что поле со списком Название товара является составной частью подчиненной формы для формы Заказы, которая рассматривается основной формой как единое целое с именем СоставЗаказа.
