Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Access_2007.doc
Скачиваний:
257
Добавлен:
17.03.2015
Размер:
20.6 Mб
Скачать

Малоизвестная или недооцененная возможность. Скрытие запроса

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

Для того чтобы скрыть запрос, щелкните его в области переходов правой кнопкой мыши и выберите команду Скрыть в данной группе (Hide in this Group). Запрос незаметно ис­чезнет из поля зрения.

Единственный способ вернуть в область переходов скрытый объект БД — щелкнуть правой кнопкой мыши заголовок области переходов (что-нибудь похожее на Все табли­цы) и выбрать команду Параметры переходов (Navigation Options). Затем можно уста­новить флажок Показывать скрытые объекты (Show Hidden Objects). Когда этот фла­жок установлен, скрытые объекты видны в области переходов, но они отображаются светло-серым цветом. Для возврата объекту нормального состояния видимости, щелк­ните его правой кнопкой мыши и выберите команду Показать в этой группе (Unhide in this Group).

Убедитесь в том, что вы не злоупотребили скрытием. Если это так, вы вынудите других включить режим Показывать скрытые объекты, который сделает видимыми и пригод­ными к использованию все запросы.

Если вас все еще беспокоит присутствие опасного запроса в вашей БД, рассмотрите возможность переноса запроса на изменение в совершенно отдельный файл БД и не разрешайте другим пользователям открывать этот файл. В разд. "Подготовка вашей ба­зы данных" главы 18 приведена дополнительная информация о разделении БД на не­сколько файлов.

Учебный пример: маркировка заказов на товары, которых нет в наличии

У компании Boutique Fudge есть проблема. Компания производит свои товары небольшими партиями, и они быстро распродаются. Например, если их источник импортного дуриана иссякает, то же происходит и со всемирно известным продуктом Mocha Malaysian Espresso Milk (малазийский кофе Мокко эспрессо с молоком).

Однако активные покупатели продолжают заказывать товары, которых нет на складе. В конечном счете они получают их, но заказ продукта, которого нет на складе, может быть более долгим, одиноким и забытым в БД на недели. Компания Boutique Fudge могла бы уберечь клиента от неразберихи (не говоря уже о жажде), если бы смогла учесть клиентов, заказавших товары, которых нет в наличии, и предупредила их о необходимости ожидания.

Разработчики БД в компании Boutique Fudge подумали над этой проблемой и решили, что им нужно поле в таблице Orders, позволяющее пометить заказы, находящиеся в состоя­нии ожидания из-за отсутствия на складе ингредиентов. Решено было использовать поле с Логическим типом данных, названное OnHold (в ожидании). В этом случае, когда рабочие склада подготавливают заказ, они могут сэкономить время, игнорируя заказы, находящиеся в состоянии ожидания. А отдел обслуживания клиентов может отследить клиентов, помес­тивших эти заказы, и объяснить им причину задержки.

Пока в этом примере нет ничего нового. Но в нем есть одна хитрость: компания Boutique Fudge хочет автоматизировать процесс задания значений в поле OnHold. Она рассчитывает выполнить запрос, который проверит поле UnitsInStock (единиц на складе) в таблице Products и затем установит значение Да в поле OnHold для всех находящихся в работе за­казов, включающих товары, которых "нет в наличии" (out-of-stock). Теперь, когда вы научи­лись создавать запросы на изменение, вы можете рассмотреть эту хитроумную головоломку.

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

  • запроса на выборку, отбирающего заказы, содержащие продукты, которых нет в наличии;

  • запроса на изменение, обновляющего поле OnHold для продуктов, которых нет в наличии.

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

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

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

  • 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) с низкоуровневыми параметрами запроса.

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

  2. В области Окно свойств измените значение параметра Уникальные значения (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. Теперь вам достаточно убедиться в том, что представители отдела обслуживания клиентов вежливы

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]