Рис. 92. Событию «Нажатие кнопки» приписано действие
Рис. 93. Для получения выбранного отчета достаточно нажать кнопку слева
Точно так же, создав соответствующую группу переключателей и макрос, можно организовать вывод любого количества отчетов.
Теперь настало время приступить к усовершенствованию созданных отчетов.
7.4. Условия отбора данных. При создании отчета «приход_итоговый» в качестве источника данных взят запрос «итоги приход по поставщикам», для которого источником данных является в свою очередь запрос «приход по стоимости». Запрос «приход по стоимости» построен на основе запроса «приход_Запрос», а запрос «приход Запрос» фактически содержит все поля и записи таблицы «приход», упорядоченные по возрастанию даты. Источником данных отчета «приход_подробный» является непосредственно таблица «приход». Поскольку наборы полей в таблице «приход» и в запросе «приход Запрос» совпадают один к одному, мы можем в отчете «приход_подробный» заменить источник данных. Откроем указанный отчет в режиме конструктора, а затем окно
71
свойств отчета. Окно свойств отчета открывается точно так же, как и окно свойств формы. Выберем заставку «Данные» и щелкнем клавишей в строке «Источник записей». Развернем меню и выберем в качестве источника «приход Запрос» (рис. 94).
Рис. 94. Смена источника данных в отчете «приход_подробный»
Закроем окно свойств и конструктор. Теперь, открыв отчет для просмотра, Вы можете убедиться, что ровным счетом ничего не изменилось. Зато теперь оба отчета основаны на данных запроса «приход Запрос»! Перейдем в раздел «Запросы» и откроем «приход Запрос» в режиме конструктора.
Рис. 95. Условие отбора записей по дате
В строке «Сортировка» поля «дата» зададим условие отбора записей:
Between [Forms]![отчет_приход]![дата1] And [Forms]![отчет_приход]![дата2].
Оператор «Between» задает диапазон значений поля. Запрос производит отбор записей, которые в соответствующем поле имеют значение, попадающее в заданный диапазон. Например, мы можем отобрать записи о поставках в течение отчетного периода: с 1.01.05 по 31.01.05. Вместо «Between» мы могли бы использовать два неравенства, объединенных оператором «And»:
>=[Forms]![отчет_приход]![дата1] And <=[Forms]![ отчет_приход]![дата2].
Открыв форму «отчет_приход», задайте интересующий Вас диапазон дат и убедитесь, что оба отчета отражают данные о поставках за заданный диапазон дат.
72
Рис. 96. Дополнительная информация в отчете
7.5. Дополнительная информация в отчете. Осталось внести в отчет две небольших корректировки: поместить в заголовок отчета название фирмы, а в примечание отчета – поле для подписи. В форме «отчет_приход» установим переключатель в положение «подробный отчет о приходе», откроем соответствующий отчет и переведем его в режим конструктора. С панели элементов возьмем элемент управления «поле» и поместим его в заголовок отчета. Надпись, соответствующую полю, удалим. В случае необходимости расширим заголовок и сдвинем вниз название отчета. Поместим в поле выражение =[Forms]![отчет_приход]![фирма], то есть название фирмы. Теперь становится ясно, зачем мы назначили в качестве источника данных для формы «отчет_приход» таблицу «фирма»! Аналогично в примечание отчета поместим надпись «Заведующий складом», содержащую выражение =[Forms]![отчет_приход]![заведующий], то есть Ф. И. О. заведующего складом, а также текущую дату, определяемую функцией
73
Now() (рис. 96). Аналогичным образом отредактируем и отчет по объемам поставок.
Замечание! Мы создали форму «приход», используя соответствующие запросы. Теперь, когда мы изменили запросы, нам придется заменить в этой форме источник данных. Для этого откроем форму «приход» в режиме конструктора, откроем окно свойств формы и в разделе «Данные» заменим источник данных на таблицу «приход».
8. Шаг восьмой. Несколько итоговых запросов
8.1. Создание итогового запроса в режиме конструктора. При разра-
ботке соответствующих отчетов по расходу товаров возникает проблема определения цен. Поскольку мы договорились, что товары распределяются по торговым точкам, принадлежащим нашей фирме, цены, по которым товары отпускаются, должны соответствовать ценам, по которым мы эти товары закупили. Но имеющиеся в наличии партии одного и того же товара могут быть приобретены по разным ценам. Значит, речь должна идти о средних ценах. Среднюю цену будем считать за заданное количество дней до последней поставки. Прежде всего, для каждого товара найдем дату последней поставки. Для этого в разделе «Запросы» нажмем кнопку «Создать». На этот раз создадим запрос в режиме конструктора. В меню диалогового окна выберем строку «Конструктор», а затем в окне «Добавление таблицы» выберем таблицу «приход». Нажмем «Добавить», а потом «Закрыть». В таблице «приход» в верхней части окна запроса два раза щелкнем по названиям полей «товар» и «дата». Выберем пункт меню «Вид Групповые операции». В наборе свойств полей появится новая строка – «Групповая операция». В этой строке для поля «товар» выберем в меню значение «Группировка», а для поля «Дата» – значение Max (рис. 97). Это значит, что в запросе, как в логической таблице, каждый товар будет представлен один раз, а в поле, соответствующем полю «дата», будет стоять наибольшее значение даты поставки этого товара. Созданный запрос представлен на рис. 98. Теперь откроем в режиме конструктора таблицу «фирма» и добавим еще одно поле – «период», которое будет содержать количество дней до последней поставки, то есть период, за который считается средняя цена. Очевидно, это поле должно быть числовым.
74
Рис. 97. Групповые операции в запросе
Рис. 98. Запрос «последняя_поставка»
После того, как Вы создадите форму «отчет_расход», аналогичную форме «отчет_приход», в этой форме надо поместить новое поле «период» (рис. 99). Чтобы обеспечить удобную Вам последовательность переходов, воспользуйтесь пунктом меню «Вид Последовательность переходов». В дальнейшем из этой формы могут вызываться отчеты, использующие среднее значение цены.
75