Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетБДПос(Лобова)!!.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
3.51 Mб
Скачать

Формирование записей результата при выполнении запроса

Сначала рассмотрим, как формируются записи результата запроса, если не заданы условия отбора. В примере для каждой пары таблиц указан способ объединения только тех записей, в которых связанные поля обеих таблиц совпадают (в соответствии с заданным по умолчанию первым способом объединения). При этом, поскольку рассматриваемые пары таблиц находятся в отношении один-ко-многим и в схеме данных для их связи определены - параметры обеспечения целостности, в результате сформируется столько записей, сколько их имеется в подчиненной таблице низшего уровня поставка_план. Обеспечение целостности не позволяет включить в таблицу поставка_план записи, для которых не существует записей в главных таблицах. По сути, записи таблицы поставка_план дополняются данными из таблиц товар и покупатель. Вместо ключевого поля код__тов в запись о плане поставок будет включено наименование товара, а вместо ном_дог – наименование покупателя.

При задании условий отбора основные принципы формирования записей результата остаются прежними. Выполняется только одна дополнительная функция: отбор записей, соответствующих сформулированным условиям. Таблица с результатом запроса будет содержать все записи о поставках товара, наименования которых указаны в условии отбора.

Сохраните запрос под именем "План поставок".

Параметрические запросы

В предыдущем примере для задания наименования товара необходимо было в режиме конструктора корректировать бланк запроса. Чтобы избежать этого, используйте в запросе параметры. Перед выполнением запроса Access выдаст окно ввода и введет их в условия отбора значение указанного параметра.

В условие отбора поля наим_тов вместо конкретных значений введем название параметра (Рисунок 8.4). Название параметра вводится как текст, заключенный в квадратные скобки: [Наименование товара]

Рисунок 8.4. Бланк запроса с параметрами для поля НАИМ_ТОВ

Ссылки на имена полей различных таблиц в условии отбора

В условии отбора в качестве операндов могут использоваться значения из разных полей. Выбрать записи из таблицы отгрузка, в которых стоимость товара не соответствует стоимости, указанной для этого товара в таблице товар, вычислить отклонения. Запрос представленный на рисунке 8.5.

Рисунок 8 5. Бланк запроса с параметрами для поля НАИМ_ТОВ

Вычисляемое поле заполняется через кнопку Построить (Рисунок 8.6.)

Рисунок 8 6. Окно построителя для расчета отклонения

Результат представлен на Рисунок 8.7.

Рисунок 7.7. Записи об отгрузки товаров с неверно указанной суммой

    1. Решение задач на основе нескольких запросов

Реализовать алгоритм и сформировать результат на основе входных данных из таблиц базы и параметров задачи одним запросом при решении сложной задачи невозможно. Для решения сложных задач они должны быть разбиты на несколько более простых подзадач выполняемых отдельными запросами. Подзапросы выполняются последовательно. Для представления алгоритмов решения сложных задач целесообразно использовать функционально-технологическую схему, на которой указываются входные и выходные данные каждого из запросов. В простейшем случае выходные данные предшествующего запроса являются входными для следующего построенного на нем запроса и, при выполнении только последнего запроса в цепочке построенных друг на друге запросов вы инициируете последовательное выполнение всех запросов цепочки и полное решение задачи.

Задача: Необходимо произвести анализ выполнения договоров поставки товаров на конец заданного месяца. При решении этой задачи должно быть подсчитано количество товара, запланированного к поставке, отгруженного покупателям в соответствии с договорами, и получена разность поставок.

Данные о плановых поставках хранятся в таблице поставка_план. На ее основе создадим запрос для подсчета суммарного количества товаров, запланированных к поставке на конец заданного месяца (Рисунок 8.8).

Рисунок 7.8. Подсчет плановой поставки товаров

В запросе План производится группировка записей таблицы по полю код_тов. Для операции используются только записи, в которых срок поставки (месяц) имеет значение, меньшее или равное заданному параметром запроса с именем номер месяца. В каждой, группе записей об одном товаре суммируется количество, запланированное к поставке.

Данные о фактически, отгруженных покупателям товаров хранятся в таблице отгрузка. На ее основе может быть выполнен подсчет суммарного количества фактически поставленных товаров. Для отбора поставок выполненных до конца заданного месяца, добавим в запрос таблицу накладная, в которой хранится дата отгрузки товаров (Рисунок 8.9). Таблицы, на которых построен запрос Факт, находятся в отношении один-ко-многим, для их связи по составному ключу установлены параметры обеспечения целостности. В результате объединения этих таблиц формируется таблица запроса с числом записей, равным числу записей в подчиненной таблице отгрузка.

Для отбора только тех накладных, по которым отгружался товар до конца заданного месяца, из даты отгрузки с помощью функции Month выделяется номер месяца, и для этого вычисляемого поля в условие отбора вводится параметр запроса с именем, совпадающим с именем параметра в. предыдущем запросе Номер месяца.

Рисунок 8.9. Подсчет суммарного количества отгруженных товаров

Сравнение количества запланированных к поставке и отгруженных товаров логично произвести в запросе, основанном на двух предыдущих. Однако необходимость учесть, что по некоторым договорам товар мог не отгружаться и в то же время отгружаться покупателям, которые не заключали договоров, требует добавления в запрос таблицы товар, в которой представлена вся номенклатура товаров фирмы. Последнее обстоятельство позволит установить в запросе такие параметры объединения таблиц, которые приведут к формированию в таблице запроса записей не только о товарах, по которым был определен план и факт поставки, но и о запланированных к поставке, но не отгружаемых; отгружаемых, но не планируемых, вообще не планируемых и не отгружаемых товарах (Рисунок 8.10).

В запросе для связей установлен второй способ объединения записей, поэтому в таблицу запроса будут включены и те записи из таблицы товар, для которых нет связанных записей в таблицах план и Факт.

Учитывая, что во всех пустых полях таблицы запроса определено значение Null, для получения разности между запланированным и фактически поставленным количеством товара создадим вычисляемое поле с выражением Nz( [Sum-КОЛ_ПОСТ] )-Nz ( [Sum-КОЛ_ОТГР] ). Присвоим вычисляемому полю имя "Отклонение".

Функция nz (выражение; [значение__если__Null]) возвращает значение, указанное первым аргументом, или для поля со значением Null новое значение, указанное вторым аргументом. Если второй аргумент не указан, по умолчанию для числового поля со значением Null возвращается значение 0, для символьного — пустая строка

Рисунок 8.10. Вычисление разности плановых и фактических поставок

В таблице запроса Анализ выполнения плана (Рисунок 8.11) представлен весь список товаров фирмы. Показано, что не все товары были заказаны в договорах, только по ряду из них выполнялась отгрузка товаров, а некоторые товары отгружались без предварительного оформления договоров. Выполнение запроса Анализ выполнения плана инициирует выполнение запросов План и Факт, поэтому нет необходимости в их предварительном выполнении.

Записав в условие отбора поля кол_пост значение Not Null, можно отобрать только строки, относящиеся к товарам, на которые были заключены договоры. Для того чтобы явно увидеть, в какой последовательности производится объединение таблиц запроса, просмотрите запрос в режиме SQL.

В предложении from указано, что сначала будет производиться левое внешнее объединение таблиц товар и план по полю связи код_тов (товар left join План on товар . код_тов = план. код_тов). Затем будет выполнено левое внешнее объединение таблицы, полученной в результате первого объединения, и таблицы Факт по тому же полю связи.

Объединение таблиц в рассматриваемом запросе дает правильный результат только потому, что в каждой из объединяемых таблиц код_тов является ключом. В таблице товар ключ определен изначально. В таблицах запросов План и Факт поле код_тов также имеет уникальные значения, т. к. они получены в результате группировки по этому полю.