Диго С.М. Базы данных проектирование и использование (1084447), страница 43
Текст из файла (страница 43)
На рис. 6.36 представлен параметрический запрос для получения списка сотрудников заданной кафедры. При запуске этого запроса на исполнение будет появляться окно с подсказкой (рис. 6.37), в которое нужно ввести требуемое значение параметра.
Для каждого поля можно задать не только одно конкретное значение, но и диапазон значений. Так, например, для поля, в котором отображаются даты, можно вывести приглашения «Введите начальную дату:» и «Введите конечную дату:» для определения диапазона отбираемых значений. Для этого в соответствующую ячейку строки «Условие отбора» необходимо ввести выражение Between [Введите начальную дату:] And [Введите конечную дату:].
В качестве параметров может быть использовано не одно, а несколько полей. В этом случае для каждого поля, которое предполагается использовать как параметр, в ячейку строки «Условие отбора» вводится текст приглашения, заключенный в квадратные скобки. Эти приглашения будут последовательно выводиться при запуске запроса.
6.2.16. Корректирующие запросы
Общая характеристика. К корректирующим запросам относятся запросы на обновление (Update) и на удаление (Delete) записей, а также добавление (Append, Insert)2 записей из одной таблицы или нескольких связанных таблиц в конец другой таблицы. В документации по Access к типу «запросов на изменение» отнесены не только перечисленные выше запросы, но еще и «запрос на создание таблицы». Последний запрос все-таки отличается от названных ранее: первый круг запросов меняет содержание существующих таблиц, а последний - создает новую таблицу, т.е. фактически меняет имеющуюся структуру базы данных. Поэтому «запрос на создание таблицы» выделен в отдельную группу.
Корректирующие запросы на обновление и удаление могут изменять как все записи таблицы, так и определенное их подмножество -это будет зависеть от условия отбора. Так, например, запрос, приведенный на рис. 6.38, увеличит зарплату всех сотрудников на 30% (так как условие отбора не задано). Запрос, изображенный на рис. 6.39, изменит зарплату одного конкретного сотрудника (см. условие отбора данного запроса) и установит для нее значение, указанное в запросе.
При выполнении корректирующих запросов система осуществляет контроль ограничений целостности. Так, например, если при описании таблицы было задано ограничение на максимально допустимое значение поля «Оклад», то при выполнении запроса (см. рис. 6.38) в случае нарушения ограничения может быть выдано сообщение, подобное приведенному на рис. 6.40. Если выбрать вариант «Да», то для записей, нарушающих ограничение на значение, корректировка вообще выполнена не будет. В нашем примере такой выбор будет неправильным, поскольку в этом случае у одних сотрудников зарплата будет повышена, а у других - нет. Причем потом разобраться, у кого она была повышена, а у кого - нет, будет практически невозможно. В рассматриваемой ситуации следует отказаться от выполнения запроса, скорректировать при необходимости ограничение на значение и только после этого выполнить запрос.
Для создания корректирующего запроса надо в режиме Конструктор запроса выбрать соответствующую позицию в меню Запрос (либо нажать стрелку рядом с кнопкой Тип запроса на панели инструментов). В приведенных выше примерах выбиралась позиция меню Обновление.
Чтобы просмотреть обновляемые записи перед выполнением запроса, можно щелкнуть по кнопке Вид на панели инструментов. Выводимый список будет содержать старые значения полей отобранных в запросе записей.
Внимание! Следует быть очень внимательным перед выполнением корректирующих запросов (недаром в списке запросов перед их именем стоит восклицательный знак), так как каждый их запуск на выполнение изменяет содержимое таблиц и отменить результат выполнения нельзя. В связи с этим рекомендуется сохранять резервные копии изменяемых таблиц. Это позволит восстановить ошибочно скорректированные записи.
Запрос на обновление. Для создания запроса на обновление необходимо сначала в режиме Конструктор выбрать таблицу(ы), поля которой будут корректироваться, а затем изменить тип запроса, выбрав позицию Обновление в меню Запрос (либо нажать стрелку рядом с кнопкой Тип запроса на панели инструментов и выбрать соответствующий тип). При этом вид бланка запроса изменится по сравнению с запросом на выборку: в бланке отсутствуют строки «Сортировка» и «Вывод на экран», но зато появилась строка «Обновление». В бланк запроса включаются те поля, значения которых будут изменяться. В строке «Обновление» соответствующего поля записывается его новое значение или выражение для его вычисления. При создании выражения можно воспользоваться построителем. Если обновление касается не всех записей таблицы, а только некоторых из них, то нужно обычным образом задать условия отбора. С целью убедиться, что условия отбора заданы верно, рекомендуется сначала посмотреть результаты отбора. Это можно сделать двумя способами:
-
просмотреть запрос в режиме таблицы;
-
выполнить запрос как запрос на выборку.
«Открытие» запроса на обновление означает изменение значений в базе данных. Каждое «Открытие» запроса на обновление будет означать обновление уже обновленных данных.
Запрос на удаление. Его используют для удаления группы записей, отбираемых с помощью указанных пользователем условий отбора. Сначала необходимо задать условие отбора. Перед выполнением запроса на удаление рекомендуется предварительно просмотреть результаты отбора.
Для создания запроса на удаление следует в режиме Конструктор запроса выбрать соответствующую позицию «Удаление» в меню Запрос (либо нажать стрелку рядом с кнопкой Тип запроса на панели инструментов).
На рис. 6.41 изображен запрос, приводящий к удалению из таблицы «Сотрудник» записей, соответствующих стажерам.
Внимание! Если в запросе на удаление не указать условие отбора, то будут удалены все записи. В некоторых случаях запрос-удаление приводит к удалению записей в таблицах, не включенных в запрос. Это случается, если в запрос включена таблица, находящаяся на стороне «один» отношения «один ко многим», а целостность данных обеспечивается параметром «Каскадное удаление». При удалении записей из этой таблицы будут также удалены связанные записи из таблицы, находящейся на стороне «многие».
В многотабличном запросе в бланк запроса QBE необходимо переместить символ звездочки (*) для каждой таблицы, из которой будут удаляться записи, и поля, используемые для задания условий отбора.
Запрос на добавление. Он добавляет группу записей из одной или нескольких таблиц (таблиц-источников) в конец другой таблицы (результатной таблицы). Для задания запроса такого типа следует сначала создать запрос, содержащий таблицу (таблицы), записи из которой необходимо добавить в другую таблицу. Затем в режиме Конструктор запроса нужно нажать стрелку рядом с кнопкой Тип запроса на панели инструментов и выбрать команду Добавление (либо выбрать соответствующую позицию в меню Запросы). На экране появится диалоговое окно Добавление (рис. 6.42). В поле «Имя таблицы» следует ввести имя таблицы, в которую необходимо добавить записи.
Таблица, в которую осуществляется добавление, может быть как в той же базе данных, так и в другой, причем это не обязательно должна быть база данных Access (это может быть Microsoft FoxPro, Paradox или dBASE, а также база данных SQL).
Из списка полей таблиц-источников в бланк запроса необходимо переместить поля, которые должны входить в состав добавляемых записей, а также те, которые будут использованы при определении условия отбора.
Если все поля таблицы-источника должны быть перенесены в целевую таблицу и поля в таблице-источнике и целевой таблице имеют одинаковые имена, то можно просто переместить с помощью мыши символ «звездочка» (*) в бланк запроса. Однако при работе с репликой базы данных добавлять придется все поля. Кроме того, при использовании символа «звездочка» (*), даже если структуры обеих таблиц полностью совпадают, могут возникнуть проблемы с ключами (если ключевое поле имеет тип «Счетчик», то для автоматического добавления значений счетчика не следует при создании запроса перемещать поле счетчика в бланк запроса).
Если в обеих таблицах выделенные поля имеют одинаковые имена, соответствующие имена автоматически вводятся в строку «Добавление». Если имена полей двух таблиц отличаются друг от друга, в строку «Добавление» необходимо ввести имя поля целевой таблицы, которое соответствует полю таблицы-источника.
Следует быть внимательным при создании запроса на добавление записей в таблицу. Все поля целевой таблицы, которые имеют либо свойство «Обязательное поле», либо заданные «условия на значение», должны быть включены в состав добавляемых полей, иначе ни одна запись добавлена не будет по причине нарушения ограничений целостности.
6.2.17. Запрос на создание таблицы
Запрос на создание таблицы фактически означает запоминание результата запроса в таблице. Чтобы использовать такую возможность, необходимо создать запрос, результат которого следует поместить в новую таблицу. Затем в режиме конструктора запроса нужно выбрать Тип запроса/Создание таблицы (рис. 6.43).
На экране появится диалоговое окно Создание таблицы (рис. 6.44). В поле «Имя таблицы» необходимо ввести имя таблицы, в которую будут переноситься данные.
6.2.18. Специальные запросы
В Access есть возможность с помощью Мастеров формировать специфические запросы: записи без подчиненных, дублирование значений полей, а также рассмотренные выше перекрестные запросы. Использование этих Мастеров позволяет достаточно просто формулировать сложные запросы.
Поиск записей, не имеющих подчиненных. Необходимость поиска записей, не имеющих подчиненных, возникает довольно часто, и не только для проверки целостности базы данных. В нашем примере воспользуемся такой возможностью для определения списка сотрудников, не имеющих детей.
Для того чтобы воспользоваться возможностью поиска записей, не имеющих подчиненных, можно выбрать Мастер «Записи без подчиненных» в окне Новый запрос (см. рис. 6.5).
Затем следует выбрать основную таблицу (рис. 6.45) в паре «основная - подчиненная». В нашем случае это таблица «Сотрудник». Основная и подчиненная таблицы должны быть предварительно связаны в схеме данных.
Далее выбирается подчиненная таблица. В нашем случае это таблица «Дети» (рис. 6.46).
На следующем шаге определяются поля, по которым связаны выбранные таблицы (рис. 6.47).
Затем выбираются поля, которые должны войти в ответ (рис. 6.48). Поскольку необходим просто список сотрудников, в ответ выводится только поле «ФИО».
В завершение следует задать имя созданного запроса (рис. 6.49).