Запрос "расчет" (обработка имеющейся информации и формирование новых данных на ее основе), страница 3

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

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

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

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

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

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

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

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

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

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

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

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