как и «приход Запрос», содержит цены всех товаров, правда, средние. Этот запрос может являться источником данных для множества расчетов по расходу товаров, аналогичных составленным ранее отчетам о приходе товаров.
Рис. 106. Запрос «цена»
Рис. 107. Форма для вызова отчета о наличии товаров
81
Рис. 108. Запрос «приход_наличие»
Теперь для расчета наличия на основании таблиц «приход» и «расход» составим два простых итоговых запроса, выдающих соответственно для каждого товара сумму всего прихода и сумму всего расхода. Оба запроса содержат поля «товар» и «количество». Присвоим запросам соответственно имена «приход_наличие» и «расход_наличие». Вместо присвоенных системой имен «Sum_количество» дадим в запросах суммарным количествам имена «приход» и «расход» соответственно (рис. 109). Тогда разность значений этих полей для соответствующего товара даст наличие товара на данный момент. Построим запрос для определения наличия товаров. Для этого создадим простой запрос, источником данных для которого будет «приход_наличие», и сохраним его под именем «наличие».
Рис. 109. Запросы «приход_наличие» и «расход_наличие»
82
Рис. 110. Запрос «приход» в режиме конструктора
Фактически этот запрос будет просто копией своего источника и его можно было бы создать из запроса «приход_наличие», используя команды меню «Правка Копировать» и «Правка Вставить». Теперь откроем новый запрос в режиме конструктора, нажмем правую клавишу мышки в области таблиц запроса и выберем пункт меню «Добавить таблицу». В диалоговом окне перейдем на заставку «Запросы», добавим «расход_наличие» и закроем окно. Установим связь между запросами по полю «товар» (рис. 110). Мы уже знаем, что параметры объединения можно получить, щелкнув дважды левой клавишей по линии, связывающей таблицы или запросы. По умолчанию будут объединены только те записи, в которых связанные поля обеих таблиц совпадают. Это значит, что если некоторый товар имеется в таблице «приход», но не фигурирует нигде в таблице «расход», то в запросе «наличие» он не будет отражен. Это нас совершенно не устраивает. Ведь товар в наличии имеется! Поэтому мы должны изменить параметры объединения, установив переключатель в положение «Объединение всех записей из «приход_наличие» и только тех записей из «расход_наличие», в которых связанные поля совпадают» (рис. 111). Теперь можете убедиться, что любой товар, фигурирующий в приходе, но отсутствующий в расходе, будет отражен в запросе «наличие». В соответствующей ячейке Вы увидите «пробел». Однако фактически поле получит значение «Null», которое иначе называют «пустым значением». Это значение нельзя путать с нулем или с пустой строкой. Значение «Null» не равно никакому другому значению и поэтому не может участвовать в арифметических выражениях. Добавим в запрос «наличие» вычисляемое поле «наличие»:
83
наличие: [приход]-[расход].
Рис. 111. Выбор параметров объединения
В нашем случае это значит, что мы, вместо имеющегося в наличии количества товаров, получим опять поле со значением Null. Чтобы избежать подобных затруднений, воспользуемся функцией Nz(). Строка «Поле» в запросе примет вид:
наличие: [приход]-Nz([расход]).
Функция Nz() возвратит значение 0, если значение поля «расход» будет Null (рис. 112). Если мы хотим вместо нуля получать какое-либо другое значение, мы введем это значение в качестве второго параметра функции.
Рис. 112. Запрос «наличие»
Теперь осталось только создать отчет по наличию товаров. Вывод и печать отчетов по наличию товаров и средним ценам будет происходить из формы «Отчет о наличии товаров» (рис. 113).
84
Рис. 113. Форма «Отчет о наличии товаров»
9.4. Задание для самостоятельной работы. Теперь, когда создан за-
прос по расходу, содержащий среднее взвешенное значение цены каждого товара, Вам предлагается создать все отчеты по расходу, аналогичные соответствующим отчетам по приходу. Это большая, но крайне полезная работа.
10. Шаг десятый. Диспетчер кнопочных форм
Мы разработали набор отдельных объектов Microsoft Access. Но, пока, эти объекты существуют как бы сами по себе. Чтобы создать удобный для пользователя интерфейс с приложением, воспользуемся «Диспетчером кнопочных форм».
10.1. Создание кнопочной формы. В Access-97 диспетчер кнопочных форм вызывается командой меню «Сервис Надстройки Диспетчер кнопочных форм». В версиях, начиная с 2000-й, – командой «Сервис Служебные программы Диспетчер кнопочных форм». При первом вызове «Диспетчера» на экране появится окно с сообщением: «Не удается найти кнопочную форму в этой базе данных. Создать кнопочную форму?» Подтвердим желание создать форму. На экране появится окно диспетчера кнопочных форм с одной страницей. Нажмем кнопку «Из-
85