Не забыть описать в документации вход через окно как особенность дизайна.
Хроники лаборатории. На стройке.
Для этого открываем вкладку «Запросы» и выбираем пункт «Создание запроса в режиме конструктора».

Щелкаем два раза и наблюдаем такую картину:

Выбираем таблицу (таблицы) для построения запроса и нажимаем на кнопку «Добавить», после чего жмем кнопку «Закрыть». Как результат – вот такая заготовка под запрос:

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


После отбора нужных для запроса полей задаем условия отбора в соответствующих строках и сортировку, допустим, по полю «NAIM» по возрастанию.

Что я запросил? Найти все записи, где в поле «Business» есть подстрока «химич» на любом месте И в поле «Region» присутствует подстрока «алтай» на любом месте. Сортировка идет по полю «Naim» по возрастанию.
Переделаем его так:

В данном случае - отберутся все записи, где в поле «Business» есть подстрока «химич» на любом месте ИЛИ в поле «Region» присутствует подстрока «алтай» на любом месте. Сортировка идет по полю «Naim» по возрастанию.
Теперь поподробнее рассмотрим панель инструментов для формирования запросов.

Из наиболее интересных моментов:
Существует три вида отображения запроса:
- Табличный – результат выполнения запроса отображается в виде таблицы – пиктограмма на кнопке - таблица.
- SQL – запрос отображается в виде конструкции на языке SQL. Пиктограмма на кнопке - SQL.
- Конструктор – отображение в виде конструктора. Пиктограмма на кнопке – угольник и линейка.
Соответственно, нажав на стрелку справа от кнопки, можно выбрать вид отображения, нажатие на саму кнопку приводит к изменению представления.
Что касается типов запроса, то они соответствуют основным операторам SQL:
- Запрос на выборку
- Запрос на обновление
- Запрос на удаление
- Запрос на создание таблицы
- Запрос на добавление.
- Перекрестный запрос
Разберем каждый из них.
Запрос на выборку
Петрович говорит, что пора начинать работать. Сговорились они, что ли?
Обнесли площадку забором и повесили красивые плакаты
"Строительство ведет компания "Аllstroу" (www.аllstгоу.ru)".
С чувством выполненного долга играем в Quake.
Собственно, простейший запрос на выборку был обсужден достаточно подробно выше. Здесь мы поговорим о некоторых «архитектурных излишествах», но прежде – предупреждение.
Запросы на выборку, построенные на одной или нескольких таблиц без группировки – живые. То есть, если вы изменяете что-то в результате запроса или удаляете строку, то изменяется или удаляется все в исходной таблице!Причем удаление происходит не только выведенных полей, но и всей записи целиком.
Итак, сначала о запросах с количеством таблиц более двух. Допустим, поставлена задача: отобрать данные о производителях какой-либо продукции за 2003 и 2004. Данные о производителях – в одной таблице – listcomp, данные о производстве – в таблице products. Соответственно, добавляем их в конструктор запросов. После этого, для того, чтобы Access понял, какие записи в первой таблицы соответствуют записям во второй выполняем связывание этих таблиц так, как это объяснялось выше – протаскиванием и бросанием. А затем, отбираются нужные поля.
Связываемые поля должны иметь один и тот же тип!
Результат первой части работ – на рисунке. Жмем на кнопку с изображением восклицательного знака - «Выполнить запрос» и релаксируем (можно идти играть в Quake)

Результат его выполнения

заставляет задуматься о том, что что-то тут не так. Компании встречаются не по одному разу. А произошло это по вполне понятным причинам – года – два, кодов – много. То есть, компания могла производить несколько видов продукции, да и отчетность-то за два года. Что делать?
Ответ зависит от того, какая информация нужна. Допустим, нужны только данные регистрационного плана – название, ОКПО, адрес, вид деятельности. Переводим запрос в режим конструктора, нажатием на соответствующую кнопку.

Используем групповые операции, для чего нажимаем на кнопку с изображением буквы Σ.

Появилась новая строка, в которой во всех полях проставлено слово «Группировка». Отредактируем значения этой строки, с учетом того, что ОКПО однозначно идентифицирует запись о компании.

Итак, записи с одинаковым ОКПО будут сгруппированы в одну. Из поля «naim» и «region» будут отобраны первые в данной группе значения, все остальные поля отмечены как условия. Условия на экран не выводятся! То есть, если хочется вывести на экран что-то из того, что ушло в условие - поле добавляется второй раз. Допустим, так:

То есть, ко всему прочему, будет отображаться суммарный объем производства по всем отбираемым кодам.
Найдется, конечно, продвинутый товарищ, который сделает этот запрос так:

Вроде бы, все нормально, и тот запрос и этот дадут один и тот же результат – запросы, по большому, эквивалентны, но, как показала практика, предугадать результат в случае такого смешения условия и групповой операции затруднительно. Результат может быть правильным, а может быть и нет. Отсюда правило:
Разделяйте мух и котлеты! Условия отдельно, групповые операции отдельно. Группировка по полям должна вестись там, где она нужна. Так в примере не случилось бы ничего страшного, если бы группировка проводилась и по полю «naim». Однако, в более изощренных случаях это может приводить к некорректному выполнению запроса!
И, как результат, получаем:

Далее, с запросом можно производить все действия, как и с таблицей – фильтровать, сортировать. Нельзя будет редактировать значения. Не стоит забывать и о сохранении запроса.
Если нужно учитывать и те записи, в которых в интересующих полях нет значений, или как раз отобрать записи с пустыми значениями в каком-то из полей, то для отбора таковых в строке «Условие отбора» пишется Is Null. В противном случае Is Not Null.
Ранее говорилось, что есть вещи, которые конструктор делать неспособен. Допустим, необходимо выполнить следующий запрос:

но с условием – вывести только десять крупнейших по объемам производства. Сразу обратим внимание на то, что поставлена сортировка по убыванию. Когда отбираются энное количество крупнейших, маленьких предварительно необходимо поставить сортировку по этому полю.
Для выполнения условия перейдем в режим SQL:

И после слова «Select» вставим «Top 10». Если просмотреть запрос в режиме конструктора, то можно заметить, что ничего не изменилось (нет, есть конечно пункт контекстного меню «Свойства», но вот туда мало кто ходит). Выполнение же запроса приведет к тому, что и требовалось – будет выведено 10 крупнейших по сортируемому полю записей.
Если хочется, чтобы в названии поля было все написано по человечески, то есть, например, не «okpo_txt» а «ОКПО», то перед названием поля пишется «ОКПО: ». Выглядит это так:

А если понадобилось вывести и данные о производстве по кодам – тут поможет перекрестный запрос.
Перекрестный запрос
Вспоминаем лекцию про OLAP. Имеем четыре измерения - «Данные о компании», «Год», «Регион», «Код». Хотим получить таблицу вида:
|
ОКПО |
Название компании |
Регион |
Код 1 |
Код 2 |
... |
Код N |
|
00000000 |
«Рога и копыта» |
Черноморск |
5522 |
8856 |
.... |
5674 |
|
............... |
.................................. |
...................... |
........... |
.......... |
...... |
........ |
Измерение «Год» остается свернутым, то есть, на выходе будем иметь суммарные данные по объемам производства за два года.

Для этого меняем тип запроса на «Перекрестный».После чего в конструкторе появится новая строка - «Перекрестная таблица»

В этой строке необходимо определить три обязательных элемента (просто поставьте курсор в нужное поле в этой строке и выберите из списка):
- Заголовки строк
- Заголовки столбцов
- Значения

Хочется еще раз обратить внимание – отображаемые поля и условия отдельно. Условия не отображаются! Кроме того, не может быть двух заголовков столбцов! Как результат конструирования:

Как результат выполнения:

Если нужно развернуть и годовую составляющую, то сделать это можно только по строкам, добавив соответствующее поле как заголовок по строкам:

В принципе, никто не запрещает выводить в заголовки строк достаточно большое количество информации с групповой операцией «Группировка». Однако, при таком подходе, рискуете нарваться на проблемы. Группировка должна быть только по существенным для группировки полям. Во всех остальных – First, Max, Last – то, что посчитаете нужным.
А теперь представим ситуацию следующего плана: в таблице Listcomp есть информация о предприятиях, которые не предоставили данных об объемах производства. Задача же поставлена так: выбрать информацию о предприятиях, соответствующих некоторому критерию по таблице listcomp – допустим, находящаяся в Краснодарском крае, и предоставить данные о производстве 2004 года, если таковые имеются.
В чем проблема? Все просто – по умолчанию ставится такой вид связи между таблицами, при котором отбираются данные,которые имеют в связанных полях общие значения и, естественно, удовлетворяющие условию отбора. Для того, чтобы изменить вид связи, щелкнем по ней правой кнопкой мышки. Как результат – меню:

Выбираем первый пункт и получаем следующее окно:

Поставленной задаче удовлетворяет второй пункт, соответственно выбираем его и жмем на кнопку «ОК».

Далее – осталось проставить условие на регион и выполнить запрос.
Запрос на обновление
Запрос на обновление применяется в том случае, когда нужно массово изменить значения поля в таблице. Допустим, ситуация следующая: необходимо по описанию товара в некотором поле поставить некоторый маркер. Как пример – есть таблица Juice, в которой в поле «Описание сока» находится описание соков, а в поле «Марка» необходимо проставить некоторые идентификаторы, в зависимости от значений поля «Описание сока».
Решение задачи сводится к выбору соответствующего типа запроса и конструированию следующей формы запроса:

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

Из списка в графе «Макрокоманда» выбрана команда «ОткрытьЗапрос». Далее, в выпадающем списке в поле «Имя запроса» выбран тот запрос, который должен быть выполнен. Собственно, в этом и состоит суть создания макроса – выбираем команды, добавляем параметры и радуемся жизни. Из наиболее часто используемых выделим:
-
ОткрытьЗапрос. Параметр – имя открываемого запроса
-
УстановитьСообщения. Параметр - «Установить сообщения». Если его значение - «Нет», то сообщения о добавлении, удалении записей и все прочие подавляются.
-
ЗапускМакроса. Запускает макрос, имя которого указано в поле «Имя макроса»
-
Сообщение. Выводит на экран сообщение, заданное в строке «Сообщение»
В остальном – смотрим справку.
Отчеты.
Здесь я не решусь описывать конструирование отчета так, как его надо было бы описать. Максимум, на что я способен – указать на мастер создания отчетов. Он ваяет отчеты на базе одной таблицы или запроса – это несложно и доступно начинающему.
Итак, переходим на вкладку «Отчеты» и запускаем мастер отчетов.

В качестве источника данных здесь выбран запрос qryFinal. Обратите внимание, что названия полей приведены в человеческом виде! Это следствие применения методики, описанной выше. Далее выбираем поля, нажимая на кнопку «>», либо посредством двойного щелчка на нужном поле. Удаление поля из списка выбранных – то же самое, только кнопка «<».

Жмем на кнопку «Далее».

Группировка нам в данном случае не нужна - идем дальше.

На этом этапе я задал сортировку выводимых данных по названию компании

Здесь выбираем макет

и стиль отчета.

Задаем имя отчета и жмем на кнопку «Готово».

Теперь этот отчет можно распечатать, преобразовать в формат Word (преобразование происходит ОЧЕНЬ криво, поэтому лучше использовать старые добрые мастера слияния).
Естественно, что расположение элементов отчета можно менять через все тот же конструктор. Но вот этот вопрос мы также оставим на факультативное изучение... Туда же пошлем и формы...
