Поиск продуктов, которых нет в наличии

 

Первый шаг — поиск всех заказов, включающих продукты, которых в данный момент нет на складе.

 

Для этого нужен запрос, содержащий две таблицы:

¦  Products, т. к. в ней есть поля с уровнями запасов;

¦  OrderDetails, потому что она сообщает, в какие заказы входят конкретные продукты.

В данном случае таблица OrderDetails — дочерняя таблица, a Products — родительская. В результате, когда вы выполните этот запрос, то действительно получите список записей таблицы OrderDetails, снабженных информацией о продукте.

После того как создан запрос с нужными таблицами, необходимо добавить в него подходящие поля.

¦  UnitsInStock (поле из таблицы Products). Это поле сообщает о наличии продукта на складе. Для поиска отсутствующих компонентов заказа задайте свойство поля Условие отбора равным 0;

¦  OrderID (поле из таблицы OrderDetails). Это поле идентифицирует заказы с отсутствующими ингредиентами.

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

 

Одна проблема все еще остается. Когда этот запрос выполняется, один и тот же ID может выводиться много раз, поскольку извлекается список отсутствующих на складе продуктов, а в одном заказе их может быть несколько. (Вы, конечно же, не хотите, чтобы сотрудники отдела по обслуживанию клиентов звонили клиенту несколько раз, не так ли?) Самый легкий способ решения этой проблемы — сообщить программе Access о необходимости игнорировать дубликаты в вашем запросе, выполнив следующие действия.

1.  Выберите на ленте Работа с запросами | Конструктор > Показать или скрыть > Страница свойств (Query Tools | Design > Show/Hide > Property Sheet).

В правой части окна программы Access появится область Окно свойств (Property Sheet) с низкоуровневыми параметрами запроса.

2.    Щелкните кнопкой мыши на пустом месте в зоне Конструктора запросов (например, рядом с одним из прямоугольников таблиц). В верхней части области Окно свойств появится строка: Возможен выбор: Свойства запроса (Selection Type: Query Properties).

3.    В области Окно свойств измените значение параметра Уникальные значения (Unique Values) с Нет на Да.

Теперь в результатах запроса каждый заказ будет появляться только один раз. На рис. 8.9 показан законченный запрос.

 

Перевод заказов в режим ожидания

Далее нужно выполнить запрос, который изменяет все вызывающие проблемы заказы. Этот запрос должен отыскать все записи заказов, найденные запросом OrdersWithOutOfStockltems, и изменить их.

Какое решение? Конечно же запрос на обновление, подобный описанному ранее в этой главе. В нем следует использовать таблицу Orders и два поля:

¦  поле ID применяется для поиска записей заказов, которые вы хотите откорректировать;

¦  поле OnHoId меняется на Да для перевода заказа в режим ожидания.

Вы уже знаете достаточно для того, чтобы добавить оба поля в запрос и заполнить свойство Обновление поля OnHold (значением Да). Труднее всего найти нужные записи. Ясно, что необходимо найти заказы, содержащие одно из значений ID, которые вы отыскали в запросе OrdersWithOutOfStockltems. Но как использовать этот запрос в запросе на обновление?

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

In   (14,15,16)

Это условие фильтрации отбирает любые записи с кодами 14,15 или 16-

Ясно, что вводить вручную все значения ID очень трудоемко. Гораздо разумнее еще раз выполнить работу, проделанную во время создания запроса OrdersWithOutOfStockltems.

Для воплощения этой идеи вам придется воспользоваться еще одним необычным средством: подзапросом.

Подзапрос — это запрос, встроенный внутрь другого запроса. При написании подзапроса вам придется использовать язык SQL, с которым вы познакомились в главе 6. Начать следует со слова SELECT, затем перечислить поля, которые вы хотите получить, за ними вставить слово FROM и завершить все именем таблицы или запроса, которые используются. Далее приведена команда на SQL для запроса на выборку, извлекающего все ID (коды) заказов из запроса OrdersWithOutOfStockltems:

SELECT OrderID  FROM OrdersWithOutOfStockltems

Теперь, когда у вас есть оба нужных вам компонента, следует соединить их вместе в одном суперэлегантном условии отбора. Далее приведено окончательное выражение:

In   (SELECT OrderID FROM OrdersWithOutOfStockltems)

Поместите это условие отбора в поле ID. Оно получит все коды (ID) проблемных заказов с помощью запроса OrdersWithOutOfStockltems и затем сравнит их с полным набором записей в таблице Orders. Окончательный запрос на изменение показан на рис. 8.10.

Рис. 8.10. Этот запрос на обновление (PutOutOfStockOrdersOnHold (перевод заказов отсутствующими продуктами а режим ожидания)) гарантирует, что клиенты компании Boutique Fudge будут довольны в будущем. Он выбирает заказы с отсутствующими на складе продуктами и изменяет поле OnHold. Теперь вам достаточно убедиться в том, что представители отдела обслуживания клиентов вежливы

 

 

Если вы создали похожий запрос, возможно, вам захочется включить в БД и запрос, выполняющий обратное действие и возвращающий заказы из режима ожидания в действующие при пополнении запаса нужных продуктов. Применяя знания, полученные в данном разделе, вы без проблем разработаете необходимый запрос.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100