Базы данных. Практикум
.pdf
тельно выводить на печать, а можно просматривать на экране. Но если все же хочется воспользоваться запросом, то, наверное, самый простой способ – это создать два отдельных итоговых запроса: пер- вый – содержащий стоимость товаров по каждому запросу, а вто- рой – сумму проплат по каждому запросу, сохранить их, а затем из них создать запрос-выборку, связав эти запросы по полю кода заказа.
Ниже без комментариев приводится образец такого подхода
(рис. 16).
51
Рис. 16. Запрос-выборка на базе двух итоговых запросов
Кстати, заметьте, что система сама присвоила просуммированно- му в итоговом запросе полю «Сумма» новый заголовок «Sum- Сумма». Если вам хочется, чтобы заголовки таких полей имели более осмысленное значение, задавайте их в свойстве поля.
4.4. Перекрестные запросы
Перекрестный запрос можно рассматривать как еще один шаг в обобщении данных. В принципе, это тоже итоговый запрос, однако он отличается организацией информации по строкам и столбцам. Проще всего пояснить смысл перекрестного запроса на примере.
Предположим, вам требуется выяснить, сколько и каких товаров заказано каждым покупателем за определенный период времени. По- сле всего, что мы уже знаем, достаточно легко построить итоговый запрос, дающий результирующую табл. 7.
Таблица 7
Таблица запроса-выборки распределения товаров по покупателям
Наименование покупателя |
Наименование товара |
Объем продаж (руб.) |
Покупатель 1 |
Товар 1 |
ХХХ |
|
· · · |
|
Покупатель 1 |
Товар N |
ХХХ |
Покупатель 2 |
Товар 1 |
ХХХ |
|
· · · |
|
Покупатель M |
Товар N |
ХХХ |
52 |
|
|
С помощью перекрестного запроса эту таблицу можно преобразо- вать (табл. 8).
Таблица 8
Таблица перекрестного запроса распределение товаров по покупателям
Товар |
Итого продано |
Покупатель 1 |
Покупатель 2 |
· · · |
Покупатель M |
|
товара |
|
|
|
|
Товар 1 |
YYY |
ХХХ |
ХХХ |
|
ХХХ |
Товар 2 |
YYY |
ХХХ |
ХХХ |
|
ХХХ |
|
|
· · · |
|
|
|
Товар 3 |
YYY |
ХХХ |
ХХХ |
|
ХХХ |
Очевидно, последняя таблица более наглядна.
Посмотрим на полученный результат повнимательнее. Из нашего примера видно, что значения первого столбца («Наименование поку- пателя») стали в результирующей таблице заголовками столбцов (кроме последнего), значения столбца «Наименование товара» стали заголовками строк, а значения остальных полей превратились в ячейки таблицы по следующему правилу: на пересечении строки с заголовком «Товар N» и столбца с заголовком «Покупатель M» стоит значение из строки исходной таблицы, в которой первые два поля имеют значения соответственно «Товар N» и «Покупатель M».
Вторым слева в результирующей таблице стоит (необязательный) столбец, содержащий сумму по каждой строке.
Как же строится перекрестный запрос?
Вообще говоря, именно его имело бы смысл строить с помощью Мастера, однако здесь есть одно «но». Мастер может строить пере- крестный запрос только на одной таблице или сохраненном в базе запросе. При правильном проектировании таблиц почти всегда для получения хотя бы «читабельных» данных необходимо объединять несколько таблиц или добавлять вычисляемые поля. Поэтому для построения перекрестного запроса с помощью мастера приходится сначала создавать запрос-выборку или даже итоговый, сохранять его, а затем использовать Мастер для построения перекрестного запроса. Вначале вы, скорее всего, так и сделаете. Однако в процессе эксплуа- тации системы такой подход приведет к тому, что список сохранен- ных в базе запросов станет необозримым.
Поэтому есть смысл освоить процесс построения перекрестного запроса в конструкторе, без применения Мастера.
Примерный порядок построения перекрестного запроса покажем на тех таблицах, которые приводились в начале раздела.
53
1. Построим исходный запрос-выборку, содержащий сведения об отпуске товара по клиентам.
Это достаточно просто. Похожая выборка строилась в качестве при- мера при обсуждении запросов-выборок. Результат показан на рис. 17.
Рис. 17. Запрос-выборка об отпуске товаров по клиентам
Поле «Товар» взято из таблицы «Номенклатура товаров». Затем вставлено вычисляемое поле «Итого», которое содержит точно то же, что и поле «Сумма» (поясним это ниже).
2. Преобразуем наш запрос-выборку в итоговый запрос, задав групповые операции и заменив группировку по полям «Сумма» и «Итого» на групповую операцию суммирования.
Получим следующую выборку (рис. 18).
Рис. 18. Запрос с групповыми операциями
Далее в меню Запрос выбираем «Перекрестный».
Единственное изменение бланка запроса будет состоять в том, что под строкой «Групповая операция» появится строка «Перекрестная
54
таблица». В этой строке задаются основные элементы перекрестного запроса. Их всего 3: заголовки строк, заголовки столбцов и значения
(внутренних ячеек таблицы). Четвертый элемент из списка (не выво- дить) служит, как и в итоговом запросе, для задания условий на ста- дии построения запроса-выборки.
Поле «Товар», очевидно, содержит заголовки столбцов, поле «Сумма» значения ячеек.
С заголовками строк дело обстоит следующим образом: поле «Наименование» содержит основные заголовки в качестве заголов- ков строк.
Начнем задавать элементы перекрестного запроса. В каждом столбце должны содержаться все продажи данного товара, поэтому заголовками столбцов будут значения поля «Товар». В строках будут содержаться все продажи по фирмам, поэтому заголовками строк будут значения поля «Наименование». В качестве значений ячеек, очевидно, надо брать значения поля «Сумма».
По очевидным причинам поле в бланке запроса, которое описыва- ет внутреннюю ячейку, должно быть ровно одно. Менее очевидно, хотя и тоже понятно, что заголовки столбца должны также описы- ваться ровно одним полем. Заголовков же строк может быть не- сколько, но не менее одного.
Вчем смысл использования нескольких заголовков строк?
Втом, что если в полях, которые используются в качестве заго- ловков строк, задавать групповые операции, то в качестве группы, над которой проводится операция, берутся все элементы строки. По- этому поле «Итого», которое в итоговом запросе повторяло значение поля «Сумма», в перекрестном запросе будет содержать сумму по всем ячейкам каждой строки.
Конечный результат этих рассуждений представлен на (рис. 19).
Рис.19. Перекрестный запрос
55
Пример исполнения этого запроса представлен на рис. 20. Из него видно, что клиенты с кодами 120 и 130 приобрели товары двух видов.
Рис. 20. Результат исполнения перекрестного запроса
Что еще можно сказать о перекрестном запросе?
Во-первых, полученную таблицу легко транспонировать, то есть поменять местами строки и столбцы. Для этого достаточно изменить соответствующие ячейки в строке «Перекрестная таблица». При этом надо не забывать о «физическом» смысле поля суммы по строкам, если оно есть. В нашем случае, когда значения в ячейках выходной таблицы однородны и представляют собой денежные суммы, после транспонирования сумма по строкам будет представлять объем про- даж (в денежном выражении) каждого товара. Если же строить пере- крестный запрос по продажам товара в натуральном выражении, то поле суммы по строкам имело бы смысл, если бы заголовками строк были товарные позиции – в этом случае оно представляло бы собой объем продаж каждого товара в натуральном выражении. Если же в качестве строк использовать клиентов, очевидно, сумма по строкам будет бессмысленна.
Во-вторых, заголовки столбцов в выходной таблице можно изме- нить, примерно так же, как можно изменить названия полей в запро- сах, то есть содержимое столбцов при этом не изменится.
56
5.РАЗРАБОТКА ФОРМ
5.1.Доступ к бланкам свойств
Из теории баз данных известно, что форма является объектом. Кроме того, разделы формы сами являются объектами, имеющими свои свойства.
Надо заметить, что у формы свойства на стадии проектирования играют куда более существенную роль, чем у таблиц, а тем более у запросов.
Сейчас будем говорить только о тех свойствах формы, которые доступны на стадии проектирования в окне конструктора форм.
Эту операцию придется осуществлять часто, поэтому обсудить некоторые моменты не помешает.
Доступ к бланку свойств формы проще всего осуществлять, пере- местив мышь на заголовок окна формы и щелкнув по нему правой кнопкой. В открывшемся контекстном меню нужно выбрать «Свой- ства» и щелкнуть левой кнопкой мыши.
Надо заметить, что, поскольку меню контекстное, то, проделав подобную операцию не на заголовке окна, а на любом другом объек- те на форме (например, элементе управления на форме), вы получите доступ к бланку свойств раздела или элемента управления соответст- венно.
Бланки свойств можно открывать также, выбрав соответствую- щий объект, используя режим меню Вид / Свойства. Здесь, правда, есть одна маленькая хитрость. Любой объект выделяется щелчком правой кнопки мыши. Выделить же форму можно только проделав эту операцию на белом квадратике слева от горизонтальной линейки
(или используя меню Правка / Выделить форму).
Вверху открытого бланка свойств, находится комбинированный список выбора. Он определяет, что в данный момент выводится в бланке свойств – либо все доступные свойства подряд, либо темати- ческая группа свойств.
Таких тематических групп 4: Свойства данных, Свойства маке-
та, Свойства событий и Другие свойства.
Группу Свойства событий можно временно игнорировать, ибо они определяют автоматизацию управления формой, и в качестве их значений задаются либо макросы, либо процедуры AccessBasic.
57
Группа Свойства макета определяет внешний вид и поведение формы (или другого объекта, для которого выведен бланк свойств) на экране. Группа Свойства данных определяет источник данных и поря- док работы с данными. В группу Другие свойства разработчики Access «задвинули» все, для чего не смогли придумать лучшего названия.
Не будем подробно обсуждать все свойства формы, а остановимся только на наиболее интересных. Попутно будем то же самое проде- лывать и со свойствами разделов.
5.2. Свойства данных
Для формы в режиме конструктора свойств данных доступно все- го 4 свойства данных. Из них Блокировка записей требуется только при работе, когда с одними и теми же записями будет работать не- сколько пользователей сети.
Самым интересным является свойство Источник записей. Если щелкнуть мышью по строке с этим свойством, на ней сразу появят- ся кнопки – одна для комбинированного списка выбора, а вторая, с тремя точками на ней, – для запуска конструктора запросов. С по- мощью списка выбора можно задать в качестве источника любую из существующих (или присоединенных) таблиц и сохраненных запросов из той базы данных, в которой находится форма. Надо по-
нимать, что источником может быть не более чем одна таблица или запрос.
Как мы уже говорили ранее и настойчиво повторяем вновь, ис- пользование в качестве источника данных сохраненного запроса не рекомендуется. Это существенно снижает гибкость проектирования и возможности доработки приложений. Кроме того, по ошибке уда- лить сохраненный запрос из базы данных тоже достаточно легко (правда, форму не труднее).
Именно поэтому, если в форме необходимо использовать данные из нескольких таблиц, причем все эти таблицы должны быть объеди- нены в один запрос, задавайте источник данных непосредственно в соответствующей строке бланка свойств. Чтобы это проделать, за- пустите Конструктор запросов, щелкнув по кнопке с тремя точка- ми. Это тот самый конструктор, с которым вы работали при проекти- ровании запросов.
Построенный вами запрос будет записан в бланке свойств как SQL-строка, хотя проектировать и модифицировать его можно в окне
QBE.
58
Приведем несколько замечаний.
1.Контекстное меню лучше отключить исходя из общего прави- ла – убирать от пользователя лишние кнопки и рукоятки.
2.Исходя из того же правила имеет смысл в разработанном при- ложении убирать встроенное меню режима формы или заменять его своим. К сожалению, единственный способ удаления встроенного меню состоит именно в замене его своим (свойство Меню). Если же вы не хотите иметь никакого меню при работе в данной форме, соз- дайте пустое меню. О разработке своих меню мы еще будем гово- рить, там же расскажем и как создать пустое меню.
3.Очень осторожно пользуйтесь свойствами Всплывающее окно и особенно Монопольное окно. Если в режиме монопольного окна на самом этом окне не предусмотрен какой-то инструмент для его безус- ловного закрытия, то выйти из приложения можно будет только после нажатия клавиш [Ctrl] + [Alt] + [Del], со всеми вытекающими отсюда последствиями в виде потери данных, внесенных изменений и т.п. Ес- ли вы все же хотите использовать Монопольное окно, не задавайте это свойство, пока полностью не завершите разработку и отладку.
5.3. Списки и поля со списками
Список представляет собой таблицу, состоящую как минимум из одного столбца, которая выводится на экран либо постоянно, в слу- чае простого списка, либо при нажатии кнопки выбора, для поля со списком.
Отметим две характерные особенности списков и полей со спи- сками.
Во-первых, список всегда присутствует на экране в открытом ви- де, в то время как поле со списком выглядит как обычное поле и от- личается от него только наличием кнопки развертывания списка.
Во-вторых, в поле со списком можно добавлять новые значения непосредственно в процессе работы, никуда не переключаясь.
Очень привлекательной особенностью списков является то, что они могут содержать данные из таблиц, не входящих в источник за- писей формы. Это позволяет не перегружать источник записей лиш- ними полями, да и вообще придает большую гибкость формам.
Для примера рассмотрим использование поля со списком для поля «Код вида доставки» в таблице «Заказы». Это поле содержит число- вой код. А в таблице «Виды доставки» имеется аналогичное поле с таким же именем и его расшифровка в текстовом поле «Виды дос- тавки». Попросту говоря, эта таблица является справочником. Жела-
59
тельно, чтобы пользователь при работе с формой имел возможность читать и вводить в поле «Код вида доставки» таблицы «Заказы» не числовые коды, а их текстовые расшифровки, взятые из справочника. Построение такого поля со списком в конструкторе достаточно сложно, лучше это выполнять с помощью Мастера. Не вдаваясь во все детали построения, рассмотрим его основные этапы с помощью следующих иллюстраций.
После вызова Мастера, в его первом окне отмечается, что объект «поле со списком» будет использовать значения из таблицы или за- проса (рис. 21).
Рис. 21. Задание объекта «поле со списком»
Далее надо указать таблицу со значениями, которые будет содер- жать поле со списком. Как уже отмечено выше, в качестве такой таб- лицы удобно использовать таблицу-справочник «Виды доставки»
(рис. 22)
В следующем окне отмечаются поля, значения которых будут вы- водиться непосредственно на форме. Очевидно, что таким полем должно быть текстовое поле «Вид доставки» с названиями видов доставок (рис. 23).
60
