Руки и только руки...

Знаменитейший советский иллюзионист-манипулятор Амаяк Акопян, буквально перед самым носом авторитетнейших международных комиссий вытворяя абсолютно необъяснимые фокусы, любил невозмутимо приговаривать: можете сами убедиться, все дело в руках, руки и только руки... Разработка хорошего запроса также сродни изящному фокусу. Если сделать его мастерски, то из вороха самой разнообразной информации программа самостоятельно извлечет все нужное, обработает и представит на экране в удобном и понятном виде. Если сделать его коряво, то ничего, кроме дополнительной головной боли, из этого не получится.

Как известно, любая практика всегда опирается на какую-нибудь теорию. Следовательно, перед тем как начать набивать руку в разработке запросов на какой-нибудь СУБД, весьма и весьма полезно ознакомиться с теоретическими азами этого процесса. Их всего два: во-первых, практически все выражения (логические, математические, вспомогательные, любые) в Microsoft Access создаются при помощи специального построителя выражений; во-вторых, все запросы бывают обычные и итоговые.

В прошлый раз речь уже заходила о том, что в бланке запроса разработчик имеет возможность в довольно широких пределах манипулировать в том числе и содержимым конкретных полей. Их, например, можно сцеплять в одно целое (как вариант: слияние нескольких подстрок в одну) или можно преобразовывать из одного типа в другой (как вариант: число превратить в текст, дату - в номер дня в году, и так далее). Теоретически, обработчику бланков запросов совершенно безразлично, каким образом было получено то или иное выражение - набрано с клавиатуры или сгенерировано каким-то иным способом. Главное - конечный результата. А вот для пользователя некоторая разница присутствует, так как построитель выражений требует значительно меньшего количества операций, следовательно - меньше времени на достижение цели. Да и в плане возможных опечаток работа с построителем удобнее, ибо он оперирует готовыми именами полей, обозначениями операторов и правилами транскрипции, принятыми в конкретной версии СУБД.

Построитель выражений вызывается чрезвычайно просто. Для этого достаточно перевести любой запрос в режим конструктора, попасть маркером мыши в любое поле в нижней части бланка и нажатием правой кнопки мыши вызвать контекстно-зависимое меню (см. рис. 1). Среди всего прочего в нем есть пиктограмма волшебной палочки и режим ПОСТРОИТЬ. Это именно то, что нужно. Активизация этого режима приводит к появлению на экране рабочего окна построителя выражений, в котором и предстоит работать до получения необходимого результата. Только не следует забывать, что сгенерированное выражение программа поместит в ту ячейку, в которой находился маркер мыши на момент активизации окна мастера.

Построитель выражений (см. рис. 2) состоит из четырех рабочих областей. Верхняя, самая большая, является как бы листом для записи результата по мере его формирования. В любой момент разработчик может кликнуть по ней мышью и в ручном режиме произвести любые коррективы, какие только посчитает нужным. Три нижних области выполняют функции меню, в которых из предлагаемых вариантов пользователю предстоит выбирать то или иное значение. Нижняя левая область "отвечает" за общие разделы. Работая на манер Проводника, она позволяет "сказать", что конкретно вас в данный момент интересует: таблицы, запросы, формы, определенная группа функций или метод обмена данными с внешними приложениями. Нижняя средняя область показывает, какие подразделы существуют в рамках выделенного раздела. Если разработчик поместил выделение в левой области на пиктограмму папки Таблицы и "раскрыл" ее (делается точно так же, как и в Проводнике), то программа в качестве содержимого папки тут же показывает наименования всех таблиц, какие только существуют в данной СУБД. Выбор конкретной таблицы, в свою очередь, приводит к появлению в центральной области перечня полей, которые заданы в данной таблице. Соответственно, выбрав мышью конкретное поле в средней области, вы, тем самым, даете построителю выражений понять, что желаете поместить в формулу или выражение ссылку на содержание конкретного поля конкретной таблицы. Когда описанные манипуляции выполнены, самое время "сказать" программе, что данную величину требуется поместить в запись выражения в верхней области. Делается это либо нажатием клавиши ВВОД на клавиатуре, либо двойным кликом мыши, либо нажатием маркером мыши экранной кнопки "ВСТАВИТЬ", расположенной на окне построителя выражений. В случае ошибки всегда можно отменить последнюю операцию (кнопка " НАЗАД") или даже отменить генерацию всего выражения в целом (кнопка " ОТМЕНИТЬ"). Только не перепутайте, " НАЗАД" означает назад на один шаг, а " ОМЕНИТЬ" означает отменить сам построитель выражений.

Для удобства работы наиболее часто используемые элементы выражений вынесены авторами Microsoft Access в виде отдельных кнопок непосредственно на само окно построителя. Это такие элементы, как скобки, обозначения операций сложения, умножения и тому подобные. Остальное расположено в соответствующих папках. Всего построитель выражений "имеет" восемь базовых папок: таблицы, запросы, формы, отчеты, функции, константы, операторы и общие выражения. Назначение первых четырех категорий совершенно очевидно, а вот по-следующие имеет смысл рассмотреть поподробнее. Папка Функции содержит в себе два раздела: встроенные функции и функции определенные в текущей базе данных. Встроенные функции открывают доступ ко всему богатству стандартных функций Microsoft Access данной версии. По умолчанию программа показывает их все сразу (в средней и правой областях), но при желании разработчик может выделить лишь конкретные темы (например, только функции для операции над множествами). В этом случае в правой области Microsoft Access показывает только те конкретные функции, которые относятся к выбранной области. Если выделить какую-либо из этих функций, то в самой нижней части окна построителя выражений появляется подсказка, показывающая транскрипцию написания данной функции и перечень информации, необходимой для ее работы. Аналогичным образом СУБД позволяет пользоваться и локальными функциями собственной разработки, заданными в рамках текущей базы данных. Константы, соответственно, охватывают величины, неизменные в рамках СУБД. Это "истина", "ложь", "пустая строка" и "пустое значение". Операторы же описывают все операции, какие только в Microsoft Access разрешены над данными (арифметические, логические, сравнения). Раздел Общие выражения необходим, как правило, для украшательских целей, так как он содержит конструкции стандартные, применяющиеся в основном для стилистического оформления результата работы, например такие, как ["Страница "&Page], что приводит к появлению на листе бумаги при печати конструкции "Страница "номер", где, вместо слова "номер", стоит текущий номер страницы.

Особенностью работы построителя выражений является то, что сам построитель совершенно не следит за корректностью составленного выражения. Это значит, что даже при помощи построителя можно соорудить нечто не работоспособное, так что "дружба дружбой, а табачок врозь". Правда, построитель, в меру своих сил, пытается намекать, что в тех или иных местах нужно самостоятельно вставить какое-нибудь определенное содержимое. Например, между двумя функциями программа вставляет надпись "Выражение", показывая, что в этом месте нужно вставить какое-либо конкретное выражение. Вставляя запись о функции, например Shell ("commandstring"; "windowstyle"), построитель, вместо нужных переменных, вставляет в кавычках их обозначение, подразумевая, что конкретное содержание командной строки разработчик задаст самостоятельно. Таким образом, использование построителя выражений значительно облегчает создание приложений, но не снимает с человека ответственности за конечный результат. Поэтому настоятельно рекомендую сначала в мельчайших деталях представить себе, что конкретно и как именно вы намерены построить, а лишь потом запускать построитель и заниматься генерацией исходного кода.

При работе с построителем существует еще одна важная тонкость. По умолчанию, генерируя конкретное выражение, программа присваивает ему стандартное имя - "Выражение N№". Как правило, это довольно неудобно для пользователя, хотя и разумно с точки зрения разработчиков СУДБ. Так что сразу, после того как построитель сгенерирует готовое выражение, нелишне пробежаться маркером мыши по полученному результату в конкретной ячейке бланка запроса и в ручном режиме изменить его имя на что-нибудь более благозвучное и более информативное.

Запрос, по сути, есть обычный вопрос, а значит, кроме формы "кто конкретно", он должен иметь еще и форму "сколько всего". До этого момента я рассказывал о запросах (запросах-выборках), которые отбирали из общего массива только ту информацию, которая соответствовала некоторому критерию, например, все книги жанра " научная фантастика". Однако предположим, что нас заинтересовала не конкретная информация, а общая, например, сколько вообще в нашем магазине предлагается книг жанра " научная фантастика". Вот для такой ситуации и были предусмотрены в конструкторе запросов так называемые "групповые операции". По умолчанию, поле задания параметра группировки является скрытым, но если, имея какой-нибудь запрос в режиме конструктора, обратиться в системное меню ВИД и кликнуть там мышью по режиму ГРУППОВЫЕ ОПЕРАЦИИ, то в бланке запроса появится дополнительная строка с аналогичным наименованием.

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

Кроме стандартных, в Microsoft Access допустимы и два дополнительных варианта: "Выражение" и "Условие". Выбрав вариант "Выражение" в строке "Поле", можно задать конкретное выражение, например Max[(наименование поля)] - Min[(наименование поля)], на соответствие с которым программа должна проводить проверку. В данном случае она покажет максимальную величину разброса некоторого параметра, хранимого в данном поле. Выбор "Условия" активизирует ссылку на строку " Условие отбора", что позволяет в значительной мере расширить число возможных комбинаций вариантов выполнения групповых операций. Так, например, применение режима "Условие" в графе " Рубрика" позволяет сначала отсортировать из общего массива только конкретную рубрику, а уже к ней применить всю мощь аппарата запросов Microsoft Access, причем сделать все это в одном запросе, а не в несколько приемов.

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

Наименование Назначение
SUM Вычисляет сумму всех значений заданного поля в каждой группе. Применяется только для числовых и денежных полей.
AVG Вычисляет среднее арифметическое всех значений данного поля в каждой группе. Применяется только для числовых и денежных полей.
MIN Возвращает наименьшее значение в рамках каждой группы. Применяется для любых полей, кроме логических и "мемо". В случае текстового содержания, возвращается наименьшее символьное значение независимо от регистра.
MAX Возвращает наибольшее значение в рамках каждой группы. Применяется для любых полей, кроме логических и "мемо". В случае текстового содержания, возвращается наибольшее символьное значение независимо от регистра.
COUNT Возвращает число записей, в которых значение данного поля отличается от Null. Хотя при использовании конструкции Count (*) можно подсчитать число всех записей, включая "нулевые".
STDEV Подсчитывает статистическое стандартное отклонение для всех значений данного поля в каждой группе. Функция применяется только для числовых и денежных полей. Если в группе менее двух записей, возвращается значение Null.
VAR Подсчитывает статистическую дисперсию для всех значений данного поля в каждой группе. Применяется только к числовым и денежным полям. Если в группе менее двух записей, возвращается значение Null.
FIRST Возвращает первое значение этого поля в группе.
LAST Возвращает последнее значение этого поля в группе.

Александр Запольскис


Компьютерная газета. Статья была опубликована в номере 14 за 1999 год в рубрике soft :: субд

©1997-2024 Компьютерная газета