ЗАПРОС – УДАЛЕНИЕ, ИЛИ ПРОВОДЫ ГОСТЕЙ

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

Критерием отбора для удаления записей в нашем запросе будет дата выезда. Если дата нашего компьютера больше или равна заданной дате в поле “Выезд”, то такую запись нужно удалить. Слова “дата нашего компьютера” означают, конечно, системную дату. Эту дату мы устанавливали и в MS-DOS (команда date) и в WINDOWS (панель управления в основной группе). Системную дату в Access можно узнать с помощью оператора “Date()”.

Приведём некоторые условия проверки даты:

>=Date() Не ранее сегодняшней даты
>=Date() Or Is Null Не ранее сегодняшней даты или дата не определена
<Date() Ранее сегодняшней даты
>#1.1.90# And <=Date() После 1 января 1990 г. и не позднее сегодняшней даты

В этих выражениях всё ясно, кроме, пожалуй двух слов: “Is” и “Null”. Слово Is (Есть) означает ещё один оператор сравнения (в дополнение к операторам <, >…). Слово Null (пустое множество, несуществующий, нулевой) не нужно путать с нулём (zero).

Выражение “Is Null” близко по смыслу выражению “=0”. Но выражение “=0” применимо либо к числовому, либо к текстовому полям (очевидно, что нули в этих выражениях разные, хотя и пишутся одинаково). Выражение “Is Null” применимо ко всем полям – оно означает, что это поле пусто, неопределённо, т.е. данные в нём отсутствуют.

Здесь не нужно путать отсутствие данных в поле с отсутствием самого поля. Возвращаясь к запросу “Люкс”, мы могли бы попытаться увидеть в нём 101-ю комнату, не поселяя туда друга (теперь Вы согласны, что только настоящий друг способен вынести всё это) и оставив первую опцию в параметрах объединения связи между таблицами (при которой объединяются те записи, в которых связанные поля совпадают). Опираясь на знание о пустом множестве Null, мы могли бы рассуждать так.

В таблице “Этажи” есть все три комнаты, удовлетворяющие условию отбора нашего запроса в поле “Номер комнаты” – т.е. это поле истинно для трёх записей. Теперь нужно сделать истинными три поля “Фамилия” в таблице “Гости”. У нас есть в этой таблице два заполненных (т.е. истинных поля). Поэтому, вводя в поле “Фамилия” условие отбора: “Is Not Null”, мы увидим две записи – фамилии гостей, живущих в 201-й и 301-й комнатах.

Поясним, почему так произошло. В нашем условии “Not” – это ещё один логический оператор, оператор отрицания. С его помощью мы истину превращаем в ложь, а ложь в истину (на языке кодов 1 в 0 и 0 в 1). Если в жизни такие превращения, мягко говоря, не поощряются, то в логике они просто необходимы.

Условие “Is Not Null” означает непустое поле, т.е. поле, в которое введены данные. Вводя это условие, мы увидели те же записи, т.к. в поля введены фамилии. Теперь сконструируем следующее логическое условие:

(Is Not Null) OR (Is Null)

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

Занося в условие отбора это выражение, мы вправе ожидать появления третьей записи, поле “Фамилия” кото­рой вроде бы должно соответствовать выражению “Is Null”, т.е. в 101-й комнате никто не живет. Но, увы, за­пустив запрос, мы видим, что записей по-прежнему две. Думая, что-то неверно в логическом механизме, мы можем оставить в условии отбора только Is Null — и не увидим ни одной записи, т.е. исчезают и те две комнаты, в которых живут наши гости. И это понятно, поля эти не пусты, т.е. не “Is Null”. Значит, логический механизм исправен.

Наша ошибка заключается в том, что мы формиру­ем условия для поля, которого в связи, устанавливаемой первой опцией, нет. Так как комнаты 101 в таблице “Гости” нет, то никакими ухищрениями мы не увидим эту комнату в запросе, не изменив параметры объединения связи.

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

А мы возвращаемся к новому запросу. Итак, мы должны удалить все записи таблицы “Гости”, в которых поле “Выезд” содержит дату не позднее сегодняшней. Соз­дадим запрос-удаление и назовем его “Выезд гостей”.

В отличие от запроса-выборки в запросе-удалении строка “Сортировка” заменяется строкой “Удаление”. За­несем в запрос одно поле “Выезд” и введем условие отбора “<=Date()”. Вначале просмотрим, а затем выполним за­прос. При просмотре мы увидим записи, подлежащие уда­лению, но само удаление записей не произойдет. Для удаления записей из таблицы (в нашем случае из таблицы “Гости”) запрос необходимо выполнить.

При выполнении запроса в открывшемся окне мы увидим сообщение “Запрос на удаление приведет к изме­нению данных. Продолжить?”. У нас есть возможность отменить запрос (нажав соответствующую кнопку), но если мы уверены, то “ОК”. И вновь предостерегающее сообще­ние “Будет удалено записей: (столько-то)”. И вновь выбор между кнопками “ОК” и “Отмена”. Нажмем “ОК” и посмотрим таблицу “Гости” – в ней остались записи только с датой выезда после сегодняшней.

Вот таблица-ответ, о которой шла речь в предыдущей главе.

Номер комнаты Код категории
101 Л
102 П
201 Л
301 Л
Ссылка на основную публикацию
Adblock
detector