Рис. 99. Вид формы «отчет_расход» в режиме конструктора
8.2. Расчет диапазонов дат. Создадим простой запрос, источником данных для которого будет запрос «последняя_поставка». Дадим запросу имя «диапазон_дат», откроем его в режиме конструктора и добавим вычисляемое поле (рис. 100):
Min_дата: DateAdd("y";-[Forms]![отчет_расход]![период];[Max_дата]).
Рис. 100. Запрос «диапазон_дат» в режиме конструктора
Здесь «Min_дата» – имя вычисляемого поля, содержащего дату, предшествующую Max_дата. Функция DateAdd вычисляет дату, отличающуюся от исходной на заданное количество единиц времени. Первый аргумент «y» задает единицу времени – день. Кроме того, время может измеряться в неделях, месяцах, годах и даже в минутах, секундах и часах. Второй аргумент: -[Forms]![отчет_расход]![период]. Этот аргумент указывает, сколько единиц времени надо отступить от заданной в третьем аргументе даты. В качестве его значения берется значение поля «период» формы «отчет_расход» со знаком «минус», указывающим, что отсчет идет в обратном направлении. Тот факт, что запрос использует
76
значение поля из формы «отчет_расход», не означает, что мы не можем открыть этот запрос автономно. Просто при попытке открыть запрос появится диалоговое окно, в котором Вы введете это значение (рис. 101). Того же результата можно достичь, если сначала открыть форму «отчет_расход», а потом запрос. Созданный запрос представлен на рис. 102. Теперь каждому товару поставлен в соответствие интервал времени поставок, по которому следует вычислять среднюю цену (в нашем примере – 10 дней).
Рис. 101. Ввод количества дней
Рис. 102. Запрос «диапазон_дат»
77
9. Шаг девятый. Установка связей между таблицами
Теперь мы умеем формировать практически любые отчеты по приходу и расходу товаров. Но для принятия решений ничуть не меньший интерес представляет информация о наличии товаров на данный момент. Для этого мы должны научиться устанавливать связи между таблицами. Связь – способ объединения информации, хранящейся в разных таблицах.
9.1. Отбор данных по диапазону. Создадим простой запрос, в качестве источника данных для которого назначим таблицу «приход». Выберем поля «дата», «товар», «цена» и «количество». Сохраним запрос под именем «диапазон_стоимость». В этом запросе будут отражены поставки товаров за заданный период времени до последней поставки. Диапазон дат для каждого товара будет свой и в общем случае различный. Откроем запрос в режиме конструктора, щелкнем правой клавишей в его верхней части (в области таблиц) и выберем строку «Добавить таблицу». В открывшемся окне перейдем на заставку «Запросы», выберем запрос «диапазон_дат» и нажмем «Добавить», после чего окно «Добавление таблицы» закроем. Установим связь между таблицей «приход» и запросом «диапазон_дат» по полю «товар». Для этого нажмем левую клавишу мыши на поле «товар» в окне таблицы «приход», не отпуская клавиши, перетащим указатель на поле «товар» в окне «диапазон_дат». Теперь два одноименных поля соединены линией, что означает установление связи (рис. 103)! Если по линии связи дважды щелкнуть левой клавишей, появится окно «Параметры объединения». По умолчанию мы получили объединение только тех записей, в которых связанные поля обеих таблиц совпадают. Это нас вполне устраивает. Осталось только добавить в запрос поля «Min_дата» и «Max_дата». Для этого надо в окне «диапазон_дат» дважды щелкнуть левой клавишей по соответствующим полям. В строке «Условие отбора» для поля «дата» зададим условие: Between [Min_дата] And [Max_дата]. В строке «Вывод на экран» погасим галочку у полей «дата», «Min_дата» и «Max_дата», так как вывод на экран этих полей в дальнейшем не нужен. И, наконец, создадим в запросе вычисляемое поле «стоимость: [количество]*[цена]». В рабочем режиме построенный запрос будет иметь вид, представленный на рис. 104.
78
Рис. 103. Связь таблиц
Рис. 104. Запрос «диапазон_стоимость»
9.2. Расчет цен. Создадим простой запрос, в качестве источника данных для которого назначим последний созданный запрос «диапазон_ стоимость». Выберем поля «товар», «количество» и «стоимость».
79
Сделаем запрос итоговым. Поэтому поле «товар», по которому будет производиться группировка, должно стоять в списке первым. По полям «количество» и «стоимость» будем производить суммирование (рис.
105).
Рис. 105. Суммирование по полям «количество» и «товар»
Сохраним запрос под именем «цена» и откроем его в режиме конструктора. Система присвоила двум вычисляемым полям имена «Sum _ количество» и «Sum _ стоимость». Исправим эти названия на «сум_количество» и «сум_стоимость». Теперь добавим в запрос вычисляемое поле
цена: IIf([сум_количество]>0;[сум_стоимость]/[сум_количество];0).
Логическая функция IIf имеет три аргумента. Первый аргумент – логическое выражение. Если логическое выражение истинно, возвращается значение первого аргумента, иначе – второго. Мы использовали функцию «IIf» для того, чтобы заданное по ошибке нулевое значение поля «количество» не приводило к сбою в работе приложения.
На вычисляемом поле «цена» щелкнем правой клавишей мыши и откроем свойства поля. В разделе свойств «Общие» установим фиксированный формат поля. Этот формат отражает два знака после точки. В строке «Групповая операция» поля «цена» должно быть установлено значение «Выражение». Итак, мы построили запрос, который выдает средние взвешенные цены каждого товара, рассчитанные по соответствующему диапазону дат (рис. 106).
9.3. Расчет наличия товаров. Откроем запрос «расход Запрос» и добавим запрос «цена». Объединим таблицы по полю «товар» и добавим в запрос поле «цена» из запроса «цена». Теперь «расход Запрос» так же,
80