Главная страница

Краткое содержание 29 Об этих стрелках 30 о сочетаниях клавиш 32 о щелчках кнопкой мыши 33 Примеры 33


Скачать 19.64 Mb.
НазваниеКраткое содержание 29 Об этих стрелках 30 о сочетаниях клавиш 32 о щелчках кнопкой мыши 33 Примеры 33
АнкорAccess_2007.doc
Дата16.03.2017
Размер19.64 Mb.
Формат файлаdoc
Имя файлаAccess_2007.doc
ТипКраткое содержание
#3862
страница25 из 65
1   ...   21   22   23   24   25   26   27   28   ...   65
Глава 8
Запросы, обновляющие записи
Запросы больше всего известны своей способностью отображать небольшие подмножества больших объемов информации. Этот тип запроса известен как запрос на выборку, и именно его вы изучали в предыдущих двух главах.

Многие приверженцы Access не знают, что у запросов есть другое назначение. Их можно использовать не только для поиска информации, но и для изменения данных. Запросы, ока­зывающие более сильное действие, будь то удаление, обновление или добавление записей, называют запросами на изменение (action query).

О запросах на изменение
Запросы на изменение не так полезны как запросы на выборку, поскольку в них гораздо меньше гибкости. Идеальный запрос создается единожды и повторно используется снова и снова. Запросы на выборку соответствуют этому определению, поскольку часто требуется обзор данных одного и того же сорта (заказы прошлой недели, самые ходовые товары, раз­меры классов и т. д.). Запросы на изменение коварней, поскольку они вносят необратимые изменения.

В большинстве случаев, изменение — одноразовое действие, поэтому нет оснований свя­зываться с запросом, который повторно вносит одно и то же изменение повсеместно. И даже если какие-то данные нужно изменять регулярно (например, цены товаров или уровни складских запасов), задаваемые каждый раз реальные значения не одни и те же. В результа­те невозможно создать запрос на изменение, который бы вносил это изменение в автомати­ческом режиме.

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

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

  • Сложные или трудоемкие задачи, влияющие на большое количество записей. Любая таблица время от времени нуждается в незначительной реорганизации. Вы можете решить, что пора поднимать цены на 15% или вы установили, что все записи, связанные с клиентом 403, на самом деле должны указывать на клиента 404. Это одноразовые задачи, но

они воздействуют на большое количество записей. Для того чтобы расправиться с ними, вам придется потратить много времени на исправление листа данных — или же можно создать новый запрос на изменение, который внесет исправление гораздо эффективнее. Когда запрос сделан, решите, удалять его или сохранить на случай, если вы захотите от­корректировать его и повторно применить позже.

  • Задачи, зависящие от единственной порции информации, которую вы предоставляете при каждом выполнении запроса. Можно создать запрос на изменение, также содержащий параметры и позволяющий задавать важные значения каждый раз, когда выполняется запрос. (О параметрах запроса см. разд. "Параметры запроса " главы 7,) Используя пара­метры запроса, можно превратить относительно жесткий запрос (который удаляет кон­кретную запись) вболее гибкий (удаляющий любую выбранную запись).



Тестирование запросов на изменение (с осторожностью)
В плохих руках запросы на изменение — не что иное, как высокотехнологичный способ на­вредить себе. Они фиксируют изменения (обычно во множестве записей), и после примене­ния изменений вы не можете их отменить. Некоторые поклонники БД вообще избегают за­просов на изменение.

Если вы все же решили применять запросы на изменение (и есть множество полезных трюков, которые молено в них использовать), следует принять должные меры предосторож­ности. Важнее всего перед применением запроса на изменение сделать резервное копирова­ние БД! Этот шаг особенно важен при создании нового запроса на изменение, потому что он не всегда формирует результат, который вы ждете. Для создания резервной копии можно скопировать ваш файл с расширением accdb (как любой другой файл; один из способов— щелчок по нему правой кнопкой мыши и выбор команды Копировать). Если же вы не хоти­те связываться с Проводником Windows, можно создать резервную копию, не покидая про­граммы Access, с помощью последовательности Office → Управление → Резервная копия базы данных (Office Manage Back Up Database) (см. разд. "Создание резервных копий" главы 1).

Подсказка

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

Резервные копии незаменимы при устранении неисправностей, но неплохо не допускать ошибок с самого начала. Один из безопасных способов — начать с запроса на выборку. В этом случае вы можете убедиться в том, что запрос отбирает нужные записи, прежде чем сделать следующий шаг и преобразовать его в запрос на изменение (выбрав один из типов запросов на изменение в группе на ленте Работа с запросами │ Конструктор Тип запроса (Query Tools │ Design Query Type)).

Семейство запросов на изменение
В программе Access есть четыре типа запросов на изменение:

  • запрос на обновление изменяет значения в одной или нескольких записях;

  • запрос на добавление выбирает одну или несколько записей и вставляет их в существующую таблицу;

  • запрос на создание таблицы выбирает одну или несколько записей и создаст для них новую таблицу;

  • запрос на удаление удаляет одну или несколько записей.

В следующих разделах мы попробуем создать запросы всех этих типов.

Запросы на обновление
Запрос на обновление находит некоторые записи и затем изменяет их. Обычно изменения ограничиваются одним полем, но программа Access разрешает корректировать столько по­лей, сколько нужно. У вас также есть некоторая свобода в способе реализации обновления. Простейший вариант — ввести совершенно новое значение в поле. Можно создать запрос, который перемещает все товары из одной категории в другую с помощью ввода нового зна­чения в поле CategoryID. Другой вариант — изменение текущих значений в поле с помощью выражения (специальная формула БД, способная выполнять разнообразные вычисления). Можно повысить цены на 10% или добавить неделю к сроку завершения для всех невыпол­ненных проектов.

Подсказка

Если вам нужно выполнить очевидное одноразовое обновление, может быть, предпочтитель­ней воспользоваться поиском и заменой на листе данных (см. разд. "Поиск" главы 2). Этот подход предоставляет возможность просмотреть найденные совпадения и решить, заменять каждое из них или нет.

В приведенном далее примере используются таблицы Products и Products Categories из БД Boutique Fudge (которая описана в разд. "Магазин шоколадных изделий" главы 5). Запрос обновляет все товары в категории Beverages (напитки), повышая цены товаров на 10%. Вы можете самостоятельно выполнить этот пример, загрузив примеры к этой главе со страницы "Missing CD" на Web-сайте www.missingmanuals.com.

Для создания запроса на обновление выполните следующие действия.

1. Создайте новый запрос, выбрав Создание Другие Конструктор запросов (Create Other Query Design).

На экране появится диалоговое окно Добавление таблицы (Show Table).

2. Добавьте все таблицы, которые вы хотите включить в ваш запрос, выбрав каждую и щелкнув мышью кнопку Добавить (Add) (точно так же, как вы делали, создавая запрос на выборку). По завершении щелкните мышью кнопку Закрыть (Close).

Обычно в запросе на обновление используется одна таблица, но если нужна информация из нескольких связанных таблиц, добавьте их все. Включение в запрос нескольких таб­лиц создает объединение (см, разд. "Запросы и связанные таблицы" главы 6). Операция объединения в запросе на изменение действует так же, как в запросе на выборку — она извлекает информацию из таблицы-родителя и отображает ее рядом с записями из до­черней таблицы.

В данном примере вам потребуются таблицы Products и ProductCategories.

3. Измените тип запроса на запрос на обновление, выбрав Работа с запросами | Конструктор Тип запроса Тип запроса: обновление (Query Tools | Design Query Type Update).

Столбец со списком свойств полей в нижней части окна изменится, отражая новый тип запроса. Строки Сортировка (Sort) и Вывод на экран (Show) исчезнут (поскольку они не имеют смысла в запросах на обновление) и для каждого поля, включенного в запрос, появится строка Обновление (Update To).

4. Добавьте поле (или поля), которое вы хотите использовать для отбора и задайте для каждого свойство Условие отбора (Criteria).

Условия отбора определяют, какие записи отберет программа Access. Поскольку данный запрос — это запрос на обновление, отобранные записи — это записи, в которые будут вноситься изменения.

В данном примере следует использовать поле CategoryID или поле CategoryName. Если используется поле CategoryID, нужно задать значение кода (ID) для вашей категории. Если применяется поле CategoryName, можно искать соответствия с помощью названия категории.

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





Рис. 8.1. Этот запрос ищет продукты в категории Beverages
5. Добавьте поле (или поля), которое хотите изменить.

В данном примере следует добавить поле Price, таким образом, вы сможете изменить це­ны продуктов.

6. В строке Обновление задайте новое значение, которое ваш запрос поместит в каждое поле.

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

Можно также применить выражение, которое берет одно или несколько значений из су­ществующих полей и использует их для вычисления нового значения. Вы можете при­менять все операции и функции, описанные в главе 7 и предназначенные для обработки текста, чисел и дат. Например, можно использовать следующее выражение в поле Price для повышения цен товаров на 10%:
[Price]*1.10

Подсказка

В выражении обновления может использоваться один или несколько параметров (см. разд. "Параметры запроса" главы 7). В этом случае Access запрашивает у пользователя, выполняю­щего запрос, важную информацию (например, каково процентное изменение цены).

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

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

Для того чтобы заставить работать этот предварительный просмотр, нужно применить один формальный прием. Программа Access игнорирует поля, которые вы не собираетесь обновлять. Поэтому если вы хотите добиться вывода на листе данных поля ProductName, следует задать что-то в строке Обновление. В данном случае используйте значение [ ProductName ]. Этот шаг заставит программу Access заменить значение в поле ProductName текущим значением поля ProductName. Другими словами, Access на са­мом деле ничего менять не будет, но отобразит поле ProductName па листе данных в ок­не предварительного просмотра.

На рис. 8.2 показан законченный запрос на обновление.

8. Щелкните правой кнопкой мыши заголовок вкладки и выберите команду Режим таблицы (Datasheet View) для просмотра записей, на которые повлияет ваш запрос (рис. 8.3).

Этот шаг позволит просмотреть строки, которые вы собираетесь изменить, прежде чем запустите выполнение запроса. На листе данных вы увидите все записи, удовлетворяю­щие вашим условиям отбора, — иначе говоря, все записи, которые вы измените при вы­полнении запроса, но вы не увидите изменений, которые хотите внести.

Примечание

В обычном запросе на выборку просмотр листа данных и выполнение запроса — равнознач­ные действия. В запросе на изменение отображение листа данных показывает строки, которые будут изменены, но на самом деле не изменяет их. Выполнение запроса изменяет данные, но не показывает измененные записи.

9. Теперь вернитесь в Конструктор (щелкните правой кнопкой мыши заголовок вкладки и выберите Конструктор (Design View)). Если вы уверены в том, что запрос действует

п
равильно, выберите Работа с запросами | Конструктор Результаты Выполнить (Query Tools | Design Results Run) для запуска запроса на обновление и внесения заданных изменений.
Р
ис. 8.2
. Этот запрос отбирает все товары в заданной категории и повышает их цену на 10%
Рис. 8.3. Здесь показан предварительный просмотр. В нем отображаются все товары в категории Beverages с текущими ценами. Когда вы выполните запрос, именно эти записи изменятся

Помните: перед выполнением этого шага рекомендуется сделать резервное копирование вашей БД.

Когда вы выполняете запрос на изменение, программа Access предупреждает о том, что собирается выполнить изменение БД (рис. 8.4). Щелкните мышью кнопку Да (Yes) для внесения изменений.
Р
ис.
8.4. Вверху: при каждом выполнении запроса на изменение Access предупреждает о том, что запрос изменит БД. Если вам не нужно это напоминание, выполните действия, перечисленные в этом окне для открытия диалогового окна Параметры Access и отключения вывода на экран этого предупреждения. (Сначала нужно щелкнуть мышью кнопку Нет для закрытия диалогового окна). Внизу: далее Access сообщает о количестве изменяемых записей и дает вам последний шанс отказаться от изменений. Программа всегда предоставляет эту информацию, даже если отключен вывод стандартных предупреждений. Если сейчас щелкнуть мышью кнопку Да, Access обновит таблицу
К сожалению, программа Access не показывает измененные записи — она вообще ничего не показывает. Если вас интересует, что же произошло, и вы хотите просмотреть только что измененные записи, у вас один вариант — снова вывести на экран окно предвари­тельного просмотра записей, которые вы только что изменили (щелкнув правой кнопкой мыши заголовок вкладки и выбрав Режим таблицы). Этот способ действует до тех пор, пока вы не изменили записи таким образом, что они больше не соответствуют условиям отбора. (Если это произошло, следует создать новый запрос или просмотреть таблицу для двойной проверки ваших данных.)

10. Для сохранения запроса нажмите комбинацию клавиш + (или закроите вкладку запроса). При этом придется задать имя запроса.

И
спользуйте имя запроса, четко указывающее на то, что это запрос на изменение. Мож­но, например, задать имя UpdateProductPrices (изменение цен товаров). Запросы на изменение отображаются в области переходов с пиктограммой восклицательного знака. У каждого типа запроса на изменение слегка отличающаяся пиктограмма — для запро­сов на обновление применяется пиктограмма с карандашом и восклицательным знаком за ним (рис. 8.5).

Если вы не собираетесь повторно использовать свой запрос, может быть, стоит его уда­лить. Удаление запроса защитит от случайного выполнения вами (или кем-то еще) за­проса и внесения нежелательных изменений.
Рис. 8.5. Помните о том, что двойной щелчок по запросу в области переходов запускает его на выполнение. Если вы щелкнули мышью запрос на изменение, например, такой, как выделенный на этом рисунке, то можете изменить или удалить важные данные. (Для открытия запроса на изменение без его запуска щелкните по его имени правой кнопкой мыши и выберите команду Конструктор)


Аварийная ситуация.

Когда Access блокирует ваше обновление
Рассмотрим рабочий аспект стратегии программы Access: что происходит, когда вы на­жимаете мышью кнопку Выполнить (как описано в пункте 9 предыдущего алгоритма), и пет никакой реакции? Не появляются ни предупреждение, ни окно сообщения или ошибки, объясняющие причину сбоя. Лишь в строке состояния, в нижней части окна Access выводится таинственное сообщение, которое любезно информирует о том, что "действие или событие заблокировано режимом отключения" ("The action or event has been blocked by Disabled Mode"). Что все это значит?

Access — по-настоящему параноидальная программа. Она не разрешает вам выполнять некоторые действия до тех пор, пока вы явно не подтвердите, что все в порядке.

Как вы узнали из разд. "Открытие БД" главы 1, каждый раз, когда вы открываете вашу БД, Access отображает панель сообщений с сообщением системы безопасности. Вам ре­шать, что делать с этим сообщением. Можно щелкнуть мышью кнопку ? в правом верх­нем углу, чтобы полностью скрыть эту панель. В этом случае ваша БД остается в отчасти заблокированном состоянии. Вы можете создавать, изменять и удалять объекты БД, принадлежащие вам, но не можете запускать никакой код или запросы на изменение. (Для повторного вывода на экран панели сообщений и просмотра сообщения системы безопасности выберите на ленте Работа с таблицами → Показать или скрыть → Панель сообщений (Database Tools Show/Hide Message Bar).)

Другой способ — щелкнуть мышью кнопку Параметры (Options) на панели сообщений для отображения диалогового окна Параметры безопасности Microsoft Office

(Microsoft Office Security Options). Дальше следует выбрать переключатель Включить это содержимое (Enable this content) и щелкнуть мышью кнопку ОК. Этот шаг предос­тавляет программе Access непоколебимую гарантию безопасности вашей БД — другими словами, БД разработана не жующим чипсы хакером в подвале родительского дома. По­сле того как вы предприняли этот шаг, Access разрешает выполнять запросы на измене­ние (по крайней мере, до тех пор, пока вы не закрыли БД, не открыли ее снова и не уви­дели на экране повторно отображенное сообщение центра безопасности).

Если вы устали от многоразового включения БД при каждом ее использовании, есть другое решение. Можно заставить программу Access доверять всем БД в конкретной папке на вашем жестком диске. Этот метод описан в разд. "Задание надежного располо­жения " главы 15.

Запросы на добавление
Запрос на добавление выбирает записи из таблицы и вставляет их в другую таблицу. (С тех­нической точки зрения, добавление — это процесс вставки записей в конец таблицы.)

Создать запрос на добавление можно по ряду причин, но обычно это делается для переноса записей из одной таблицы в другую. Этот метод удобен, если у вас есть повторяющиеся таблицы в разных БД (возможно, разным людям приходится использовать БД на разных компьютерах).

Примечание

После завершения копирования записей в новую таблицу можно продолжить работу с по­мощью запроса на удаление (см. разд. "Запросы на удаление" далее в этой главе) и удалить старые версии.

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

Запросы на добавление жестче других типов запросов на изменение. При переносе запи­сей нужно быть уверенным в полной согласованности таблиц.

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

поля FirstName помещаются в поле F_Name при условии, что у обоих полей текстовый тип данных.

  • Некоторые поля можно пропускать. Если в исходной таблице есть поля, которых нет в конечной таблице, не включайте их в свой запрос. Если в конечной таблице есть поля, которых нет в исходной таблице, программа Access оставит их незаполненными или использует значения по умолчанию (см. разд. "Задание значений по умолчанию" главы 4). Но если вы пропустите обязательное поле (поле, у которого свойство Обязательное поле (Required) имеет значение Да, как объясняется в разд. "Пропущенные значения и пустые строки "главы 4), вы получите сообщение об ошибке.

  • Программа Access применяет все обычные правила при добавлении записи. Вы не можете вставить данные, нарушающие условие на значение (см. разд. "Целостность на уровне ссылок" главы 5) и добавить дублирующиеся значения в поле с первичным ключом или уникальным индексом (см. разд. "Предотвращение дублирования значений с помощью индексов " главы 4 ).

  • Если в конечной таблице есть поле с типом данных Счетчик, не задавайте значение для этого поля. Access автоматически сгенерирует значение для каждой добавляемой записи.



Примечание

Вы не можете копировать значения типа Счетчик в запросе на добавление. Если для иденти­фикационных полей (кодов) применяется тип данных Счетчик, у вновь скопированных записей будут значения кодов (ID), отличающиеся от оригиналов.

Программа Access предоставляет и другую возможность, аналогичную запросу на добав­ление; запрос па создание таблицы, который ничем не отличается от запроса на добавление за исключением одного: запрос на создание таблицы создает конечную таблицу и затем ко­пирует в нее записи.

Создание запроса на добавление (или на создание таблицы)
Приведенные далее действия описывают процесс создания запроса на добавление или на создание таблицы. Вы переносите записи из таблицы Contacts (контакты) БД Marketing.accdb в таблицу PotentialClients (потенциальные клиенты) БД Sales.accdb. (Вы можете найти обе БД на странице "Missing CD" на Web-сайте www.missingmanuals.com.)

1. Откройте БД-источник.

В данном примере это БД Marketing.accdb, содержащая контактную информацию.

2. Создайте новый запрос, выбрав на ленте Создание Другие Конструктор запросов

(Create Other Query Design).

На экране появится диалоговое окно Добавление таблицы (Show Table).

3. С помощью этого окна добавьте таблицу-источник, содержащую записи, которые вы хотите скопировать. Затем для закрытия окна щелкните мышью кнопку Закрыть (Close).

В данном примере используется таблица Contacts.

4. Измените тип запроса на запрос на добавление, выбрав на ленте Работа с запросами | Конструктор Тип запроса Тип запроса: добавление (Query Tools | Design Query Type Append) (или выберите Работа с запросами | Конструктор Тип запроса

Тип запроса: создание таблицы (Query Tools │ Design Query Type Make Table) для превращения его в запрос на создание таблицы).

К
онечная таблица (таблица PotentialClients в БД Sales.accdb) уже существует. По этой причине применяется запрос на добавление вместо запроса на создание таблицы.

Когда вы измените тип запроса на запрос на добавление или на создание таблицы, про­грамма Access попросит указать конечную таблицу (место, куда вы будете копировать записи), как показано на рис. 8.6.
Рис. 8.6. Программа Access хочет знать, куда вы собираетесь перенести копируемые записи. Таблицу можно выбрать из удобного раскрывающегося списка. Если вы копируете данные из одной БД в другую, выберите переключатель в другой базе данных, щелкните мышью кнопку Обзор... для выбора файла БД и затем кнопку ОК

5. Если вы хотите переместить записи в другую БД, выберите переключатель в другой базе данных, затем нажмите кнопку Обзор... Укажите файл вашей БД и нажмите кнопку ОК, чтобы подтвердить ваш выбор.

Вы перемещаете записи в БД Sales.accdb.

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

6. В поле имя таблицы (Table Name) укажите имя таблицы, в которую вы хотите перенести записи.

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

Если вы формируете запрос на создание таблицы, нужно ввести имя таблицы для новой таблицы, и программа Access создаст ее во время выполнения запроса. В данном примере вы переносите записи в таблицу PotentialCIients.

  1. Щелкните мышью кнопку ОК для того, чтобы закрыть диалоговое окно Добавление или Создание таблицы.

  1. Теперь добавьте поле (или поля), которое вы хотите скопировать из таблицы-источника.

Напоминаю о том, что вы не должны копировать все поля. В данном примере нужно до­бавить только поля FirstName и LastName.

9. Если создается запрос на добавление, вставьте имена полей конечной таблицы в строку Добавление (Append To).

В
этом примере задайте в поле Добавление для FirstName имя F_Name. В этом случае программа Access скопирует информацию из поля FirstName втаблице-источнике в поле F_Name конечной таблицы (рис. 8.7). Аналогично задайте в поле LastName для добавления поле L_Name.
Рис. 8.7. Данный запрос на добавление переносит информацию из таблицы Contacts в БД Marketing в таблицу PotentialClients БД Sales. Поскольку в обеих таблицах используются поля ID с типом данных Счетчик, номера ID в скопированных записях будут отличаться от номеров ID в исходных записях. (Если вас это не устраивает, нужно скопировать номера ID типа Счетчик таблицы Contacts в обычный числовой столбец таблицы PotentialClients — такой, в котором не используется тип данных Счетчик.)

10. Если вы хотите скопировать только некоторые записи из таблицы-источника, задайте необходимые условия отбора.

Как и в любых других секциях программы Access, эти условия отбора определяют, ка­кие записи копируются из таблицы-источника. Для задания условия заполните строку Условие отбора соответствующего поля таблицы.

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

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

11. Щелкните правой кнопкой мыши заголовок вкладки и затем выберите команду Режим таблицы для просмотра строк, на которые воздействует ваш запрос.

Этот шаг позволяет просмотреть строки, которые вы собираетесь копировать.

12. Если вы убедились в том, что все верно, вернитесь в Конструктор и выберите на ленте Работа с запросами j Конструктор Результаты Выполнить для переноса ваших записей (Query Tools │ Design Results Run).

Программа Access предупредит вас об изменении, которое собирается сделать. Щелкни­те мышью кнопку Да для копирования записей. Access не выведет на экран скопирован­ные записи — для того, чтобы проверить их, нужно просмотреть лист данных с конечной таблицей.

В настоящий момент у вас одни и те же записи в двух местах — в таблице-источнике и в конечной таблице. Мы сможете продолжить работу и с помощью запроса на удаление очи­стить таблицу-источник, как описано в разд. "Запросы на удаление" далее в этой главе,

13. Для сохранения запроса нажмите комбинацию клавиш + (или закройте вкладку запроса). Вам нужно задать имя запроса.

Если вы не собираетесь повторно использовать запрос, подумайте о его удалении.

Получение начальных значений типа Счетчик, отличных от 1

Ведущие специалисты Access применяют запросы в одном из самых изощренных искусст­венных приемов: замене в поле таблицы с типом Счетчик начального значения числом, от­личающимся от 1.

Как вы узнали в главе 2, программа Access всегда генерирует значения типа Счетчик, на­чиная с 1. (Единственное исключение — применение случайных чисел или кодов реплика­ций, два редких варианта, описанных в разд. "Применение поля типа Счетчик без раскрытия реального размера вашей таблицы" главы 2.) Но существует множество причин, вызываю­щих желание изменить такое поведение программы. Например, компании Boutique Fudge хочется начать нумерацию своих клиентов с 1000, а номеров товаров — с 5000, или начать нумеровать свои заказы с 10 000. Эти схемы нумерации часто облегчают бухгалтерский учет. Они позволяют сохранять постоянным количество цифр в значениях типа Счетчик, помогают разделить коды вдвух разных таблицах и не смущаться, сообщая клиенту о том, что он сделал заказ номер 1.

К счастью, существует (немного неуклюжий) способ обмануть систему и заставить Access начать отсчет с любого нужного вам числа. Для того чтобы сделать то, что вы не можете сделать сами, применяется запрос на добавление. Просто вставляется запись с заданным значением типа Счетчик. После того как запись создана, программа Access наращивает зна­чения, начиная со вставленного вами значения. Таким образом, если вы добавили запись типа Счетчик со значением 999, Access присвоит следующей записи значение 1000 и т. д.

Вот как это делается.

1. Создайте новую таблицу (Создание Таблицы Конструктор (Create Tables Table Design)).

Эта таблица будет храниться всего несколько минут.

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

Обычно у него имя Код (ID).

3. Измените тип данных поля на Числовой (вместо Счетчик) и убедитесь в том, что размер поля — Длинное целое (Long Integer) (стандартный выбор).

4. Щелкните правой кнопкой мыши заголовок таблицы и выберите Режим таблицы.

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

5. В Режиме таблицы введите в поле с типом данных Числовой временной таблицы значение, на 1 меньшее того, которое вы хотите использовать в качестве начального в поле с типом данных Счетчик.

Если вы хотите начать со значения 100 в поле с типом Счетчик, введите в поле с типом Числовой значение 99. Закройте таблицу.

6. Создайте новый запрос (Создание Другие Конструктор запросов (Create Other Query Design)).

В появившемся диалоговом окне Добавление таблицы (Show Table) выберите создан­ную вами временную таблицу (Таблица!.) и щелкните мышью кнопку Закрыть (Close).

7. Выберите на ленте Работа с запросами J Конструктор Тип запроса Тип запроса:

добавление (Query Tools | Design Query Type Append) для изменения типа запроса на запрос на добавление.

Когда программа Access запрашивает, в какую таблицу вы хотите добавить запись, выбе­рите таблицу с полем типа Счетчик, значения которого вы хотите попробовать изменить.

8. Дважды щелкните кнопкой мыши поле, которое вы добавили в вашу таблицу (например Код (ID)).

Программа Access задаст в строке Добавление то же имя, это как раз то, что надо.

9. Выберите на ленте Работа с запросами | Конструктор Результаты Выполнить

(Query Tools | Design Results Run).

Щелкните мышью кнопку Да, когда Access предупредит вас о том, что собирается доба­вить запись.

10. Откройте таблицу, которую вы только что обновили, и удалите только что вставленную запись.

Начиная с этого момента и далее, значения типа Счетчик будут увеличиваться, начиная с добавленного значения.

11. Удалите временную таблицу, созданную в пункте 1, поскольку она вам больше не нужна.

У этого метода есть несколько ограничений. А именно, если у вашей таблицы строгие правила верификации — например, у одного или нескольких полей в свойстве Обязательное поле задано значение Да — Access не разрешит вам вставить новую запись с помощью запроса на добавление. В этой ситуации нужно либо отключить правила верификации (временно установив для всех полей в свойстве Обязательное поле значение Нет), либо добавить обязательные поля с корректными значениями в вашу временную таблицу.

Запросы на удаление
Запросы на удаление — самые простые и самые опасные из всех типов запросов на измене­ние. Запрос на удаление действует во многом так же, как запрос на выборку: вы задаете ряд условий отбора, и затем программа Access находит соответствующие записи в таблице. Но запросы на удаление не просто отображают записи, а удаляют их из вашей БД.

Примечание

Дважды подумайте, прежде чем удалять что бы то ни было. Старая информация вам может понадобиться для отчетов или анализа. В разд. "Редактирование таблицы" главы 1 объясняет­ся, почему.

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

Для создания запроса на удаление выполните следующие действия.

1. Создайте новый запрос (Создание Другие Конструктор запросов (Create Other Query Design)).

2. В появившемся диалоговом окне Добавление таблицы выберите таблицу, содержащую записи, которые вы хотите удалить. Затем щелкните мышью кнопку Закрыть для закры­тия окна.

3. Измените тип вашего запроса на запрос на удаление, выбрав Работа с запросами | Конструктор Тип запроса Тип запроса: удаление (Query Tools | Design Query Type Delete).

В списке свойств полей исчезнут строки Сортировка и Вывод на экран и появится поле Удаление (Delete).

4. Добавьте поля, которые вы хотите использовать для отбора, и задайте условия отбора.

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

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

Очень важно убедиться в том, что вы удаляете только те записи, которые хотели удалить, У запросов на удаление есть чудесное свойство, которое поможет вам идентифицировать каждую запись, прежде чем вы выполните реальную операцию удаления. Для его приме­нения щелкните дважды кнопкой мыши звездочку (*) в списке полей таблицы. Значение в строке Удаление автоматически изменится на Из (From), означающее, что данная ин­формация не используется как часть условия отбора — напротив, она применяется для отображения списка предназначенных для удаления записей в ваших окнах предвари­тельного просмотра.

На рис. 8.8 показан окончательный вариант запроса на удаление.

6. Щелкните правой кнопкой мыши заголовок вкладки и затем выберите Режим таблицы для того, чтобы увидеть строки, на которые повлияет ваш запрос.

Этот шаг позволит предварительно просмотреть строки, которые вы собираетесь уда­лить. Когда применяется звездочка (*), на экран выводится вся информация, относящаяся к каждой записи.

7. Если вы уверены, что получена корректная информация, вернитесь в Конструктор и затем выберите на ленте Работа с запросами | Конструктор Результаты Выполнить (Query Tools | Design Results Run) для удаления записей.





Рис. 8.8. Этот запрос удаляет записи со старыми заказами, первое поле в запросе определяет условие отбора (заказы с датами в поле DatePlaced (дата размещения) наступившими до 1900 г.). Второе поле (*) — сокращенная ссылка, позволяющая увидеть в окне предварительного просмотра все поля для того, чтобы можно было внимательно изучить данные, которые вы собираетесь удалять

Программа Access предупредит вас об изменении, которое собирается сделать. Щелкните мышью кнопку ОК, если хотите навсегда удалить записи.

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

Если вы не собираетесь использовать запрос на удаление повторно, не сохраняйте его. Это опасное средство, которое не стоит оставлять под рукой.

Малоизвестная или недооцененная возможность.

Скрытие запроса
Если вы хотите сохранить запрос под рукой для последующего использования, по счи­таете это слишком опасным, программа 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. Теперь вам достаточно убедиться в том, что представители отдела обслуживания клиентов вежливы

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

1   ...   21   22   23   24   25   26   27   28   ...   65


написать администратору сайта