В запросе будут участвовать все три наши таблицы: “Гости”, “Этажи” и “Номера”, поэтому их нужно ввести в сетку запроса.
В первом и втором столбцах запроса задайте поля “Фамилия” и “Поселение” (таблица “Гости”). В третий столбец, который не будем выводить на экран, занесем поле “Выезд”. Это поле будем использовать для задания критерия отбора записей. Введя условие “<=Date()”, мы выберем записи, даты выезда которых либо истекли, либо заканчиваются сегодня. Перейдя в режим таблицы, мы можем просмотреть эти записи, а затем вернуться в режим конструктора.
Следующее поле запроса мы не перенесем из таблицы, а создадим сами. Назовем его “Число дней” – в нём будет выведено количество дней, прожитых гостем в гостинице. Такие создаваемые поля называются вычисляемыми. Для создания вычисляемого поля щелкните в строке имени поля (следующее за полем “Выезд”) и вместо выбора уже существующего поля введите с клавиатуры то, что нужно выполнить.
В нашем случае нужно из даты выезда вычесть дату поселения. Имя поля, участвующего в вычислении, заключают в квадратные скобки — []. Выражение имеет следующий вид: [Выезд] — [Поселение].
Перед тем, как выполнить запрос, еще раз отметим разницу его запуска. Если запрос закрыт, то войти в него можно либо в режиме конструктора, либо в режиме таблицы, выполнив команду “Открыть”. Находясь в режиме конструктора, мы можем либо перейти в режим таблицы, либо нажать на кнопку “Выполнить” (или выполнить команду “Запрос – Выполнить”). Действия, связанные с кнопками “Открыть” и “Выполнить” вызывают выполнение запроса, в результате чего и будет создана таблица “Расчетный лист”. При выполнении запроса будут задаваться различные вопросы, отвечая на которые можно отменить или продолжить выполнение запроса.
При переходе из режима конструктора в режим таблицы запрос не выполняется, т.е, таблица “Расчетный лист” не создается, но соответствующие данные выводятся на экран. Этот режим, называемый режимом предварительного просмотра, можно сравнить с этапом отладки при программировании. Вообще-то, погружаясь в Access, Вы в один прекрасный момент поймете, что стали программировать, хотя, возможно, и не собирались этого делать.
Выполните запрос, предварительно просмотрев его в режиме таблицы. Откройте таблицу “Расчетный лист”. Столбец, содержащий число прожитых дней, называется “Выражение1”. Вернемся в запрос и изменим имя этого поля на “Число дней”. Для присвоения полю другого имени выделите его и замените другим.
Кроме имени поля в запросе можно указать и имя таблицы, в которой есть это поле. Выражение при этом имеет вид: [Имя таблицы]![Имя поля].
Введем следующее поле “Категория номера” (таблица “Номера”) – теперь в расчетном листе будет и категория номера,
В следующее поле, которое назовём “Стоимость проживания”, мы занесем сумму, которую необходимо заплатить за время проживании в номере. Очевидно, что она равна произведению стоимости номера за сутки на число дней.
Вы можете присваивать имя вычисляемому полю непосредственно при вводе. В этом случае Вам нужно набрать с клавиатуры следующее выражение: Стоимость проживания:([Выезд]-[Поселение1)*[Стоимость]
Вы можете заменить ([Выезд]-[Поселение]) на [Число дней]. При этом Вы вводите в выражение вычисляемое поле (получается тавтология: вычисляемое поле в вычисляемом поле). Мы не рекомендуем этого делать без особой необходимости по двум причинам. Во-первых, это усложняет читаемость формулы и, во-вторых, Вы уже не сможете удалить лоле “Число дней”, оставив поле “Стоимость проживания”.
При создании вычисляемых полей можно воспользоваться построителем выражений, который запускается щелчком на кнопке “Построить” (на кнопке изображены три точки). Вы можете вызвать построитель с помощью контекстно-зависимого меню, выбрав в нем команду “Построить…”. Контекстно-зависимое меню вызывается щелчком правой кнопки на имени поля в режиме конструктора.
Мы не будем подробно останавливаться на работе с построителем, т.к. Вам не составит особого труда познакомиться с ним самостоятельно. Опишем только, как добавить поле в выражение. Для этого необходимо открыть папку “Tables”, а затем папку той таблицы, которую хотите использовать. Для добавления поля в выражение дважды щелкните на этом поле. Построитель включит и имя таблицы с восклицательным знаком перед именем поля.
Теперь приступим к конструированию полей оплаты за телефон и телевизор. Назовем их для краткости соответственно: “Опл тел” и “Опл ТВ”. Предположим, что стоимость пользования телефоном в сутки (без учета междугородных переговоров) равна 10 тысячам, а телевизором — 5 тысячам рублей.
После определения цены осталось умножить эти суммы на число дней в тех номерах, где есть телефон и (или) телевизор. Правда, при этом пока непонятно, где находятся назначенные суммы (10 и 5 тыс.), да и как определить, в каком номере нужно умножать? Мы предлагаем воспользоваться следующими выражениями:
Опл тел: ([Выезд]-[Поселение])*[Телефон]*(-10000)
Опл ТВ: ([Выезд]-[Поселение])*[Телевизор]*(-5000)
Очевидно, что в первой скобке этих выражений находится число дней. Последний множитель – это стоимость телефона или телевизора за сутки со знаком минус – тоже очевиден, если не обращать внимание на знак.
Единственный непонятный множитель этих выражений – это логическое поле, в котором определяется наличие или отсутствие телефона или телевизора. Действительно, заполняя таблицу “Этажи”, мы заносили в эти поля слова “Да” или “Нет”. Конечно же, умножение на слова – бессмыслица, если слово располагается в текстовом поле. Попробуйте умножить даже номер комнаты в таблице “Этажи”, выбрав соответствующее поле, хотя бы на 2. Вместо удвоенного номера Вам тут же будет выдано сообщение: “Неоднозначная ссылка на поле [Номер комнаты]”. И Access в этом случае абсолютно прав – нельзя умножать текст, пусть он даже выражает число. И слова “Да” и “Нет” умножать тоже нельзя.
Нельзя, если “Да” и “Нет” – текст. Но если это логические выражения, то можно. Потому что логическое поле – это нуль или единица. Поле это занимает не бит (как мы полагали раньше, создавая таблицу “Этажи”), а байт. Здесь “Нет” соответствует нулям, а “Да” единицам во всех разрядах байта. Соответствующие двоичные коды имеют вид: 00000000, и 11111111 (шестнадцатиричные 00 и FF).
Первый код – это чистый нуль, а второй – это минус единица в дополнительном коде (в этом коде кодируются все отрицательные числа, а не только единица). Мы подробнее остановимся на этом моменте во второй части учебного пособия. Теперь ясно, зачем потребовался минус в выражениях: минус на минус – дает плюс, а минус на нуль – нуль.
Для того, чтобы подтвердить сказанное, введите в запрос два поля “Телефон” и “Телевизор”. Потом Вы удалите эти поля. Выполнив запрос, Вы увидите, что “Да” соответствует число, равное сумме оплаты за соответствующую услугу, а «Нет» – нуль.
После того, как сумма за пользование телефоном и телевизором получена, ее можно представить в денежном выражении. Для этого в контексто-зависимом меню (щелчок правой кнопкой при выборе соответствующего столбца, когда маркер — “стрелка вниз”) выберите команду “Свойства…” и в окне “Свойства поля” задайте формат поля – денежный. Правда, этого достаточно для режима предварительного просмотра, а не для создаваемой таблицы (формат в ней можно изменить вручную — в режиме конструктора).
Остановимся здесь и чуть-чуть задумаемся. Неужели Вас нисколько не удивляет, что в одном запросе соединились данные из трех таблиц. Действительно, фамилия и даты берутся из таблицы “Гости”, категория номера из таблицы “Номера”, а признаки наличия телефона и телевизора – из таблицы “Этажи”. Удивительно здесь не то, что одновременно присутствуют данные из всех трех таблиц, а то, что они не перепутываются. Конечно же, мы в схеме данных задали связи таблиц, но, согласитесь, как красиво и незаметно отслеживает эти связи Access. Проследим за ним эту цепочку.
Итак, по дате выезда выбирается запись из таблицы “Гости” и переносятся соответствующая фамилия, инициалы, а также подсчитывается число дней проживания. Затем по номеру комнаты отслеживается связь с таблицей “Этажи”, где берутся сведения о телефоне и телевизоре, а заодно и код категории, по которому связываемся с таблицей “Номера”, где хранятся стоимость и категория типа комнаты (номера).
Признайтесь же, что, имея на столе три таблицы, Вы вряд ли быстрее (а главное — без ошибок) разобрались бы с этими связями. Представив, что таблиц не три, а данных в них гораздо больше, Вы по достоинству оцените скромную трудягу Access.
Расставаясь с запросом, изменим его первое поле. Построим в нем следуюшее выражение:
ФИО: [Фамилия] & “ ” & [Инициалы]
После этого фамилия и инициалы, разделенные пробелом (в выражении он окружен двойными кавычками), полностью определят нашего гостя.
На этом мы можем распрощаться с запросом “Расчет” (при этом мы полагаем, что стоимость кабельного телевидения можно включить в стоимость номера люкс). После того, как этот запрос готов, мы можем пользоваться и запросом, удаляющим записи с истекшими датами выезда – гости оплатили все услуги и мы прощаемся с ними.