Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Access 2007

.pdf
Скачиваний:
115
Добавлен:
11.05.2015
Размер:
23.5 Mб
Скачать

4.Выберите имя и тип данных для вашего параметра (рис. 7.11).

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

Текстовый, Целый, Денежный и Дата/время.

5.Щелкните мышью кнопку ОК для закрытия окна Параметры запроса.

Теперь можно ссылаться на параметр по имени так же, как вы ссылаетесь на поле в своем запросе. Например, можно добавить следующее условие отбора для поля State: [CustomerState]

Убедитесь, что вы не забыли вставить квадратные скобки, чтобы программа Access знала, что вы не пытаетесь ввести фрагмент текста.

Во время выполнения запроса Access откроет диалоговое окно Введите значение параметра (Enter Parameter Value) для ввода конкретного значения (рис. 7.12). Введите интересующий вас штат и щелкните мышью кнопку ОК. Программа использует ваше значение для отбора в поле State.

Рис. 7.12. При каждом выполнении запроса можно ввести другой штат. В данном случае будут отобраны клиенты из штата Нью-Йорк

Подсказка

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

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

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

271

Глава 8

Запросы, обновляющие записи

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

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

О запросах на изменение

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

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

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

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

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

272

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

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

Тестирование запросов на изменение (с осторожностью)

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

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

Подсказка

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

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

(Query Tools │ Design Query Type)).

Семейство запросов на изменение

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

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

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

273

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

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

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

Запросы на обновление

Запрос на обновление находит некоторые записи и затем изменяет их. Обычно изменения ограничиваются одним полем, но программа 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).

274

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

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

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

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

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

Рис. 8.1. Этот запрос ищет продукты в категории Beverages

5.Добавьте поле (или поля), которое хотите изменить.

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

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

275

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

276

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

(Query Tools | Design Results Run) для запуска запроса на обновление и внесения заданных изменений.

Рис. 8.2. Этот запрос отбирает все товары в заданной категории и повышает их цену на 10%

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

277

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

Когда вы выполняете запрос на изменение, программа Access предупреждает о том, что собирается выполнить изменение БД (рис. 8.4). Щелкните мышью кнопку Да (Yes) для внесения изменений.

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

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

278

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

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

Если вы не собираетесь повторно использовать свой запрос, может быть, стоит его удалить. Удаление запроса защитит от случайного выполнения вами (или кем-то еще) запроса и внесения нежелательных изменений.

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

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

Когда Access блокирует ваше обновление

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

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

279

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

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

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

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

Запросы на добавление

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

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

Примечание

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

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

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

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

280

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