ЗАПРОС “РАСЧЕТ”

В запросе будут участвовать все три наши таблицы: “Гости”, “Этажи” и “Номера”, поэтому их нужно ввести в сетку запроса.

В первом и втором столбцах запроса задайте поля “Фамилия” и “Поселение” (таблица “Гости”). В третий столбец, который не будем выводить на экран, занесем поле “Выезд”. Это поле будем использовать для задания критерия отбора записей. Введя условие “<=Date()”, мы выберем записи, даты выезда которых либо истекли, либо заканчиваются сегодня. Перейдя в режим таблицы, мы можем просмотреть эти записи, а затем вернуться в режим конструктора.

Следующее поле запроса мы не перенесем из таб­лицы, а создадим сами. Назовем его “Число дней” – в нём будет выведено количество дней, прожитых гостем в го­стинице. Такие создаваемые поля называются вычисляемыми. Для создания вычисляемого поля щелкните в строке имени поля (следующее за полем “Выезд”) и вместо выбора уже существующего поля введите с клавиа­туры то, что нужно выполнить.

В нашем случае нужно из даты выезда вычесть дату поселения. Имя поля, участвующего в вычислении, заключают в квадратные скобки — []. Выражение имеет сле­дующий вид: [Выезд] — [Поселение].

Перед тем, как выполнить запрос, еще раз отметим разницу его запуска. Если запрос закрыт, то войти в него можно либо в режиме конструктора, либо в режиме табли­цы, выполнив команду “Открыть”. Находясь в режиме конструктора, мы можем либо перейти в режим таблицы, либо нажать на кнопку “Выполнить” (или выполнить ко­манду “Запрос – Выполнить”). Действия, связанные с кнопками “Открыть” и “Выполнить” вызывают выполнение запроса, в результате чего и будет создана таблица “Расчетный лист”. При выполнении запроса будут задаваться различные вопросы, отвечая на которые можно отменить или продолжить выполнение запроса.

При переходе из режима конструктора в режим таб­лицы запрос не выполняется, т.е, таблица “Расчетный лист” не создается, но соответствующие данные выводятся на экран. Этот режим, называемый режимом предвари­тельного просмотра, можно сравнить с этапом отладки при программировании. Вообще-то, погружаясь в Access, Вы в один прекрасный момент поймете, что стали программировать, хотя, возможно, и не собирались этого делать.

Выполните запрос, предварительно просмотрев его в режиме таблицы. Откройте таблицу “Расчетный лист”. Столбец, содержащий число прожитых дней, называется “Выражение1”. Вернемся в запрос и изменим имя этого поля на “Число дней”. Для присвоения полю другого име­ни выделите его и замените другим.

Кроме имени поля в запросе можно указать и имя таблицы, в которой есть это поле. Выражение при этом имеет вид: [Имя таблицы]![Имя поля].

Введем следующее поле “Категория номера” (таблица “Номера”) – теперь в расчетном листе будет и категория номера,

В следующее поле, которое назовём “Стоимость проживания”, мы занесем сумму, которую необходимо за­платить за время проживании в номере. Очевидно, что она равна произведению стоимости номера за сутки на число дней.

Вы можете  присваивать имя вычисляемому полю непосредственно при вводе. В этом случае Вам нужно на­брать с клавиатуры следующее выражение: Стоимость проживания:([Выезд]-[Поселение1)*[Стоимость]

Вы можете заменить ([Выезд]-[Поселение]) на [Число дней]. При этом Вы вводите в выражение вычисляемое поле (получается тавтология: вычисляемое поле в вычисляемом поле). Мы не рекомендуем этого де­лать без особой необходимости по двум причинам. Во-первых, это усложняет читаемость формулы и, во-вторых, Вы уже не сможете удалить лоле “Число дней”, оставив поле “Стоимость проживания”.

При создании вычисляемых полей можно восполь­зоваться построителем выражений, который запускается щелчком на кнопке “Построить” (на кнопке изображены три точки). Вы можете вызвать построитель с помощью контекстно-зависимого меню, выбрав в нем команду “Построить…”. Контекстно-зависимое меню вызывается щелчком правой кнопки на имени поля в режиме кон­структора.

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

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

После определения цены осталось умножить эти суммы на число дней в тех номерах, где есть телефон и (или) телевизор. Правда, при этом пока непонятно, где находятся назначенные суммы (10 и 5 тыс.), да и как опре­делить, в каком номере нужно умножать? Мы предлагаем воспользоваться следующими выражениями:

Опл тел: ([Выезд]-[Поселение])*[Телефон]*(-10000)

Опл ТВ: ([Выезд]-[Поселение])*[Телевизор]*(-5000)

Очевидно, что в первой скобке этих выражений на­ходится число дней. Последний множитель – это стоимость телефона или телевизора за сутки со знаком минус – тоже очевиден, если не обращать внимание на знак.

Единственный непонятный множитель этих выра­жений – это логическое поле, в котором определяется на­личие или отсутствие телефона или телевизора. Действи­тельно, заполняя таблицу “Этажи”, мы заносили в эти по­ля слова “Да” или “Нет”. Конечно же, умножение на слова – бессмыслица, если слово располагается в текстовом поле. Попробуйте умножить даже номер комнаты в таблице “Этажи”, выбрав соответствующее поле, хотя бы на 2. Вместо удвоенного номера Вам тут же будет выдано сооб­щение:  “Неоднозначная ссылка на поле [Номер комнаты]”. И Access в этом случае абсолютно прав – нельзя умножать текст, пусть он даже выражает число. И слова “Да” и “Нет” умножать тоже нельзя.

Нельзя, если “Да” и “Нет” – текст. Но если это логические выражения, то можно. Потому что логическое поле – это нуль или единица. Поле это занимает не бит (как мы полагали раньше, создавая таблицу “Этажи”), а байт. Здесь “Нет” соответствует нулям, а “Да” единицам во всех разрядах байта. Соответствующие двоичные коды имеют вид: 00000000, и 11111111 (шестнадцатиричные 00 и FF).

Первый код – это чистый нуль, а второй – это ми­нус единица в дополнительном коде (в этом коде кодиру­ются все отрицательные числа, а не только единица). Мы подробнее остановимся на этом моменте во второй части учебного пособия. Теперь ясно, зачем потребовался минус в выражениях: минус на минус – дает плюс, а минус на нуль – нуль.

Для того, чтобы подтвердить сказанное, введите в запрос два поля “Телефон” и “Телевизор”. Потом Вы уда­лите эти поля. Выполнив запрос, Вы увидите, что “Да” соответствует число, равное сумме оплаты за соответствующую услугу, а «Нет» – нуль.

После того, как сумма за пользование телефоном и телевизором получена, ее можно представить в денежном выражении. Для этого в контексто-зависимом меню (щелчок правой кнопкой при выборе соответствующего столбца, когда маркер — “стрелка вниз”) выберите команду “Свойства…” и в окне “Свойства поля” задайте формат поля – денежный. Правда, этого достаточно для режима предварительного просмотра, а не для создаваемой табли­цы (формат в ней можно изменить вручную — в режиме конструктора).

Остановимся здесь и чуть-чуть задумаемся. Неужели Вас нисколько не удивляет, что в одном запросе соедини­лись данные из трех таблиц. Действительно, фамилия и даты берутся из таблицы “Гости”, категория номера из таблицы “Номера”, а признаки наличия телефона и теле­визора – из таблицы “Этажи”. Удивительно здесь не то, что одновременно присутствуют данные из всех трех таблиц, а то, что они не перепутываются. Конечно же, мы в схеме данных задали связи таблиц, но, согласитесь, как красиво и незаметно отслеживает эти связи Access. Проследим за ним эту цепочку.

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

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

Расставаясь с запросом, изменим его первое поле. Построим в нем следуюшее выражение:

ФИО: [Фамилия] & “ ” & [Инициалы]

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

На этом мы можем распрощаться с запросом “Расчет” (при этом мы полагаем, что стоимость кабельного телевидения можно включить в стоимость номера люкс). После того, как этот запрос готов, мы можем пользоваться и запросом, удаляющим записи с истекшими датами выез­да – гости оплатили все услуги и мы прощаемся с ними.