
Inform2005
.pdf
161
Указания
Создаваемая форма не предназначена для заполнения таблицы «Товары» (для этого имеется специальная форма «Товары» — см. упражнение A5–4). Тем не менее, в целях повышения наглядности, желательно, чтобы вместе с номером купленного товара в подчиненной форме отображались и его характеристики, взятые из таблицы «Товары» («Наименование», «Фирма», «Цена»), без возможности их корректировки. Для этого подчиненную форму необходимо создать не на основе обычной таблицы «Продажи», а на основе вспомогательного запроса, объединяющего данные из связанных таблиц «Продажи» и «Товары».
5.8. ФОРМИРОВАНИЕ ЗАПРОСА НА ОСНОВЕ ДВУХ ТАБЛИЦ: создайте новый за-
прос, включив в него таблицы «Продажи» и «Товары» (см. 3.1); при этом в окне конструктора запросов будут отображены не только окна таблиц, но и связи между ними. Поместите на бланк запроса все поля таблицы «Продажи» и следующие поля таблицы «Товары»: «Наим», «Фирма», «Цена» (см. 3.2). Установите сортировку поля «Ном» из таблицы «Продажи» по возрастанию (см. 3.3) и сохраните запрос под именем Продажи и товары (см. 1.5).
X Выполните созданный запрос и измените значение поля «НомТов» в первой строке результирующей таблицы на «4». Убедитесь, что это изменение автоматически приводит к изменению полей, связанных с описанием проданного товара.
Создайте на основе запроса «Продажи и товары» ленточную автоформу (см. 2.2); эта форма будет играть роль подчиненной формы. Откорректируйте форму следующим образом:
•удалите поле «НомКли» (отображать это поле нет необходимости, поскольку данные о клиенте будут выводиться в основной форме, по отношению к которой создаваемая форма будет подчиненной);
•не меняя внешнего вида, отключите возможность редактирования полей «Наим», «Фирма» и «Цена» (см. прием 2.10 и примечание к нему), так как эти поля будут использоваться только как информационные.
Созданную форму сохраните под именем Продажи (см. 1.5).
Для того чтобы сделать ввод данных в поле «НомТов» формы «Продажи» более удобным, выполните следующие действия.
5.9. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ, СВЯЗАННЫЕ С ВЫПАДАЮЩИМИ
СПИСКАМИ: преобразуйте поле «НомТов» в выпадающий список (см. 2.7) и определите его следующие свойства (ср. с 2.9):
Вкладка |
Свойство |
Значение |
Данные |
Тип источника строк |
Таблица/запрос |
Данные |
Источник строк |
Товары |
Данные |
Ограничиться списком |
Да |
Макет |
Число столбцов |
4 |
Макет |
Заглавия столбцов |
Да |
Макет |
Ширина столбцов |
0,5;2;2;1 |

162 |
Часть III. Работа с базами данных: Microsoft Access |
Благодаря сделанным настройкам, в поле «НомТов» можно вводить только номера, имеющиеся в таблице «Товары» (так как свойство «Ограничиться списком» имеет значение «Да»). При разворачивании списка в нем отображаются не только номера товаров, но и их характеристики, взятые из таблицы «Товары» (выпадающий список состоит из 4 столбцов, причем столбцы списка снабжаются названиями полей: «Ном», «Наим», «Фирма» и «Цена»). Ширина каждого столбца в выпадающем списке определяется в свойстве «Ширина столбцов» (соответственно 0,5 см, 2 см, 2 см, 1 см). Для отображения последнего столбца в выпадающем списке используйте полосу прокрутки в нижней части списка.
В качестве заготовки для основной формы можно использовать ранее созданную форму «Клиенты (комбинированная форма)» (см. упражнение A2–3). Создайте ее копию под именем Клиенты и продажи (копии форм создаются так же, как и копии отчетов — см. 5.3), измените ее режим отображения на «Простая форма» (см. 2.21) и включите в нее подчиненную форму «Продажи» (либо перетаскиванием — см. 5.2, либо с использованием панели элементов — см. 5.6).
l Форму «Клиенты и продажи» можно сделать еще более наглядной, если внести следующие изменения в подчиненную форму «Продажи»: удалите из нее столбец «Наименование», замените заголовок «Номер товара» на «Наименование» и в свойстве «Ширина столбцов» выпадающего списка «НомТов» замените первое число на 0: 0;2;2;1 (теперь первый столбец выпадающего списка имеет нулевую ширину, и, поскольку он не отображается, в поле выпадающего списка выводится значение из второго столбца, то есть наименование товара).
Подчеркнем, что это исправление никак не скажется на результирующих таблицах базы данных: в поле «НомТов» таблицы «Продажи» по-прежнему будет заноситься значение из (невидимого) первого столбца выпадающего списка.
A5–6. В существующей базе данных «Магазин» разработать на основе связанных таблиц «Клиенты», «Товары» и «Продажи» (см. упражнение A5–4) составной отчет «Клиенты и продажи» по образцу.

163
. . . . . . . . . . . . .
Указания
В качестве источника данных для подчиненного отчета используйте запрос «Продажи и товары» (см. 5.8).
Для того чтобы в основном отчете данные из подчиненного отчета обрамлялись рамкой, вызовите окно свойств элемента «Подчиненный отчет» (см. 2.8) и на вкладке «Макет» в свойстве «Тип границы» выберите вариант «Сплошная».
6.Запросы на основе связанных таблиц. Группировка и перекрестные запросы. Запросы с параметрами
Если в упражнении имя запроса не указано, то следует использовать составное имя, включающее название упражнения и порядковый номер запроса, например: A6-1-2 — запрос номер 2 из упражнения A6–1.
A6–1. В существующей базе данных «Видео» (см. упражнения A1–1, A5–1) с помощью соответствующих запросов вывести следующие данные:
1)список всех жанров (с указанием количества фильмов каждого жанра и суммарной длительности этих фильмов), отсортированный в порядке убывания суммарной длительности фильмов;

164 |
Часть III. Работа с базами данных: Microsoft Access |
2)список всех стран-производителей (с указанием количества фильмов, произведенных в каждой стране), отсортированный по убыванию количества фильмов;
3)общее число имеющихся кассет и их суммарную длительность;
4)список всех фильмов, отсортированный по дате записи, с указанием данных о кассетах, содержащих эти фильмы. Запрос должен содержать поля «Назв», «ДатаЗап» таблицы «Фильмы» и «Фирма», «Длит» таблицы «Кассеты»;
5)список всех кассет, содержащий поля «Фирма» и «Длит» таблицы «Кассеты», отсортированный по номерам кассет, с указанием количества фильмов, записанных на каждой кассете, и суммарной длительности этих фильмов;
6)таблицу, столбцы которой соответствуют различным странам (поле «Страна» таблицы «Фильмы»), строки — различным кассетам (поля «Ном», «Фирма» и «Длит» таблицы «Кассеты»), а на пересечении строк и столбцов указывается количество фильмов данной страны, записанных на данную кассету;
7)таблицу, столбцы которой соответствуют различным жанрам, строки
— различным кассетам (как в запросе 6), а на пересечении строк и столбцов указывается количество фильмов данного жанра, записанных на данную кассету.
Решение
Откройте базу данных «Видео» (см. 2.1).
Запрос A6-1-1
Создайте новый запрос, включив в него таблицу «Фильмы» (см. 3.1); поместите на бланк запроса поля «Жанр», «Ном» и «Длит» (см. 3.2), установите сортировку поля «Длит» по убыванию (см. 3.3).
6.1. ГРУППИРОВКА ЗАПИСЕЙ В ЗАПРОСЕ: «Вид | Групповые операции» или
; в результате в бланке запроса появится новая строка «Групповая операция» и для всех полей в данной строке будет установлен вариант Группировка. Используя выпадающий список в строке «Групповая операция», замените в поле «Ном» вариант Группировка на Count, а в поле «Длит» — на Sum.
lСмысл данных настроек следующий: так как для поля «Жанр» установлена группировка, то при выполнении запроса все записи с одинаковым полем «Жанр» будут «сгруппированы» в результирующей таблице в одну строку. Значение Count, указанное в поле «Ном», означает, что в данном поле будет подсчитываться количество записей каждого жанра; значение Sum, указанное в поле «Длит», означает, что в данном поле будет вычисляться суммарная длительность всех записей для каждого жанра.
lЕсли в создаваемом запросе группировка не требуется, то необходимо скрыть строку «Группировка», повторно выполнив команду «Вид | Групповые операции»

165
или отжав кнопку .
При выполнении созданного запроса (см. 3.4) заголовки второго и третьего столбца примут вид «Count_Ном» и «Sum_Длит» (они получаются путем присоединения к имени поля названия групповой операции). Для того чтобы заголовки полей запроса имели более привычный вид, надо настроить свойства этих полей.
6.2. НАСТРОЙКА СВОЙСТВ ПОЛЕЙ С РЕЗУЛЬТАТАМИ ГРУППИРОВКИ:
•вернитесь в режим конструктора и перейдите на поле «Ном» в бланке запроса;
•«Вид | Свойства» или ;
•в появившемся окне «Свойства поля» на вкладке «Общие» определите свойство «Подпись» следующим образом: Кол-во фильмов;
•не закрывая окна свойств, щелкните мышью на поле «Длит» в бланке запроса; в результате в окне свойств отобразятся свойства данного поля. Введите в свойство «Подпись» текст Сумм. длит.;
•закройте окно свойств, нажав кнопку .
Выполните запрос и сохраните его под именем A6-1-1 (см. 1.5).
Запрос A6-1-2
Очистите бланк запроса (см. 3.13), поместите на него поля «Страна» и «Ном», установите сортировку поля «Ном» по убыванию.
Измените значение строки Группировка в поле «Ном» на Count. С помощью окна свойств определите значение свойства «Подпись» для поля «Ном»:
Кол-во фильмов (см. 6.2).
Выполните запрос и сохраните его под новым именем A6-1-2 (см. 3.5).
Запрос A6-1-3
Очистите бланк запроса.
6.3. УДАЛЕНИЕ ТАБЛИЦЫ ИЗ ЗАПРОСА: щелкните мышью на окне таблицы «Фильмы» в верхней части окна конструктора; «Запрос | Удалить таблицу».
Добавьте в запрос новую таблицу «Кассеты» (см. второе примечание к 3.1), поместите на бланк запроса ее поля «Ном» и «Длит».
Установите в строке «Групповая операция» для поля «Ном» вариант Count, а для поля «Длит» — вариант Sum. С помощью окна свойств определите свойство «Подпись» для полей запроса: «Ном» — Кол-во кассет, «Длит» — Сумм. длит.
(см. 6.2).
Выполните созданный запрос и сохраните его под новым именем A6-1-3.
l Поскольку в данном запросе ни по одному полю не проводится группировка, в результате будет получена таблица, состоящая из одной строки.
Запрос A6-1-4
Очистите бланк запроса.

166 |
Часть III. Работа с базами данных: Microsoft Access |
В дополнение к имеющейся таблице «Кассеты» включите в запрос таблицу «Фильмы» (см. второе примечание к 3.1); при этом в окне конструктора запроса будут показаны не только окна таблиц, но и связи между ними.
Скройте строку «Групповая операция» на бланке запроса (см. второе примечание к 6.1).
Последовательно поместите на бланк запроса поля «Назв» и «ДатаЗап» из таблицы «Фильмы» и поля «Фирма» и «Длит» из таблицы «Кассеты»; установите сортировку поля «ДатаЗап» по возрастанию.
Выполните созданный запрос и сохраните его под новым именем A6-1-4.
l Благодаря имеющейся связи между таблицами «Фильмы» и «Кассеты», рядом с данными о каждом фильме будут указаны данные о той кассете, номер которой содержится в поле «НомКас» для этого фильма.
Запрос A6-1-5
Очистите бланк запроса.
Отобразите строку «Групповая операция» на бланке запроса (см. 6.1). Последовательно поместите на бланк запроса поля «Ном», «Фирма» и «Длит»
из таблицы «Кассеты» и поля «Ном» и «Длит» из таблицы «Фильмы»; установите сортировку поля «Ном» из таблицы «Кассеты» по возрастанию.
Установите следующие значения в строке «Групповая операция»:
•поля «Ном», «Фирма», «Длит» из таблицы «Кассеты»: Группировка;
•поле «Ном» из таблицы «Фильмы»: Count;
•поле «Длит» из таблицы «Фильмы»: Sum.
С помощью окна свойств определите свойство «Подпись» для полей из таб-
лицы «Фильмы»: «Ном» — Кол-во фильмов, «Длит» — Сумм. длит. (см. 6.2).
Снимите флажок видимости с поля «Ном» (см. 3.11).
l Поле «Ном» таблицы «Кассеты» должно присутствовать в запросе по двум причинам: во-первых, по нему проводится сортировка, во-вторых, по нему проводится группировка. Если удалить из запроса это поле, то при выполнении запроса будут
объединены данные по однотипным кассетам (например, кассете типа «Sony–180»
будет соответствовать единственная строка в таблице, и в этой строке будет указано суммарное число фильмов, записанных на всех кассетах этого типа).
Выполните созданный запрос и сохраните его под новым именем A6-1-5.
Запрос A6-1-6
Очистите бланк запроса.
6.4. ИЗМЕНЕНИЕ ТИПА ЗАПРОСА НА «ПЕРЕКРЕСТНЫЙ ЗАПРОС»: «Запрос | Пере-
крестный» или разверните выпадающий список кнопок и выберите вариант
(«Перекрестный»). В результате в бланке запроса появится новая строка «Перекрестная таблица»; кроме того, будет заблокирована возможность отключения строки «Групповая операция».

167
l Для возврата к стандартному типу запроса «Выборка» следует выполнить коман-
ду «Запрос | Выборка» или выбрать вариант («Выборка») в списке кнопок.
Поместите на бланк запроса поля «Ном», «Фирма» и «Длит» из таблицы «Кассеты» и поля «Ном» и «Страна» из таблицы «Фильмы».
6.5. НАСТРОЙКА ЭЛЕМЕНТОВ ПЕРЕКРЕСТНОГО ЗАПРОСА: установите следующие
значения в строке «Перекрестная таблица»:
•поля «Ном», «Фирма», «Длит» из таблицы «Кассеты»: Заголовки строк;
•поле «Страна» из таблицы «Фильмы»: Заголовки столбцов;
•поле «Ном» из таблицы «Фильмы»: Значение.
l При создании перекрестного (табличного) запроса требуется указать одно или несколько полей для строк результирующей таблицы, одно поле для ее столбцов и одно поле для ее значений (находящихся на пересечении строк и столбцов результирующей таблицы).
В поле «Ном» таблицы «Фильмы» установите в строке «Групповая операция» вариант Count, для остальных полей оставьте прежнее значение: Группировка.
Выполните созданный запрос и сохраните его под новым именем A6-1-6.
l В Access 2000/XP возможна ситуация, когда при выполнении запроса вместо названий стран в заголовках столбцов будет указан одинаковый текст «Кол-во фильмов». В этом случае вернитесь в режим конструктора, вызовите окно свойств поля «Ном», удалите текст «Кол-во фильмов» из свойства «Подпись», после чего сохраните запрос и закройте его. После повторного открытия запроса в заголовках столбцов появятся названия стран.
Запрос A6-1-7
Разработайте самостоятельно по аналогии с запросом A6-1-6.
A6–2. В существующей базе данных «Спорт» (см. упражнение A1–2) с помощью соответствующих запросов вывести следующие данные:
1)список всех стран с указанием среднего количества баллов, набранных спортсменами каждой страны на каждом снаряде. Список отсортировать в порядке убывания среднего количества баллов за упражнение на перекладине;
2)список всех стран с указанием количества спортсменов для каждой страны, отсортированный в порядке убывания количества спортсменов.
Указания к запросу A6-2-1
После включения режима группировки (см. 6.1) в поле «Страна» оставьте значение строки «Групповая операция» прежним (то есть равным Группировка), а в остальных полях («Перекл», «Кольца» и «Конь») измените значение строки «Групповая операция» на Avg (так обозначается вычисление среднего значения).

168 |
Часть III. Работа с базами данных: Microsoft Access |
При выполнении |
запроса некоторые средние значения будут выводиться |
с большим числом знаков после запятой. Для того чтобы ограничиться выводом трех знаков после запятой, установите для полей «Перекл», «Кольца» и «Конь» свойство «Формат» равным 0,000 (см. 3.15 и 6.2).
A6–3. В существующей базе данных «Магазин» (см. упражнения A1–3, A5–4) с помощью соответствующих запросов вывести следующие данные:
1)количество клиентов, имеющих и не имеющих скидку;
2)таблицу со столбцами «АТС» и «Кол-во клиентов», содержащую список АТС и количество клиентов, имеющих телефонные номера от этих ATC (номер АТС определяется по первым двум цифрам телефонного номера);
3)таблицу со столбцами «Месяц» и «Кол-во клиентов», позволяющую определить количество клиентов, родившихся в каждом месяце;
4)список проданных товаров с указанием их наименования, фирмы, цены, фамилии покупателя, информации о наличии у него скидки и размера его оплаты за покупку (клиент без скидки оплачивает всю стоимость, клиент со скидкой оплачивает 90% стоимости). Отсортировать список по наименованиям товаров, а для одинаковых наименований — по названиям фирм;
5)список всех клиентов с указанием их фамилии, информации о наличии скидки, количества купленных товаров, суммарной стоимости покупок и суммарного размера оплаты (клиент без скидки оплачивает всю стоимость, клиент со скидкой оплачивает 90% стоимости). Отсортировать список по фамилиям клиентов;
6)список всех фирм-производителей с указанием количества проданных изделий каждой фирмы и их суммарной стоимости. Отсортировать список по названиям фирм;
7)таблицу, столбцы которой соответствуют различным видам товаров (поле «Наим» таблицы «Товары»), строки — различным клиентам (поле «ФИО» таблицы «Клиенты»), а на пересечении строк и столбцов указывается количество товаров данного вида, приобретенных данным клиентом;
8)таблицу, столбцы которой соответствуют различным фирмампроизводителям (поле «Фирма»), строки — различным видам товаров (поле «Наим»), а на пересечении строк и столбцов указывается цена товара данного вида, произведенного данной фирмой.
Указания
Запрос A6-3-1
Разработайте данный запрос на основе таблицы «Клиенты», выполнив группировку по полю «Скидка» и применив к полю «Ном» группирующую операцию

169
Count (см. 6.1). Заголовок поля «Ном» измените на следующий: Кол-во клиентов
(см. 6.2).
Запрос A6-3-2
Данный запрос создайте на основе таблицы «Клиенты».
6.6. ИЗВЛЕЧЕНИЕ ПОДСТРОК ИЗ ТЕКСТОВЫХ ПОЛЕЙ: в первый столбец бланка
запроса поместите вычисляемое поле (см. 3.14), определив его в строке «Поле» следующим образом: АТС: Left([Тел];2). Данное выражение означает, что вычисляемое поле имеет имя «АТС» и содержит два первых символа поля «Тел» (эти символы определяют номер АТС).
l Функция Left(S;N) возвращает N первых (то есть левых) символов строки S. Имеется также функция Right(S;N), возвращающая N последних (то есть правых) символов строки S, и функция Mid(S;K;N), возвращающая N символов строки S, начиная с символа номер K.
6.7. ОТБОР НЕПУСТЫХ ДАННЫХ: в строку «Условие отбора» поля «АТС» введите условие is Not Null (благодаря этому условию, в итоговой таблице не будут учитываться клиенты, не имеющие телефона, — ср. с реализацией запроса A3-7-3).
Используйте режим группировки (см. 6.1), установив для поля «Ном» группирующую операцию Count.
Запрос A6-3-3
Разработайте данный запрос на основе таблицы «Клиенты», используя группировку по вычисляемому полю «Месяц» (см. 3.14), содержащему номер месяца из даты рождения клиента. Поле «Месяц» можно определить следующим образом:
Месяц: Month([ДатаР]).
Запросы A6-3-4 – A6-3-5
Запросы создайте на основе связанных таблиц «Клиенты», «Товары» и «Продажи».
6.8. ИСПОЛЬЗОВАНИЕ УСЛОВНОЙ ФУНКЦИИ IIF: последнее поле этих запросов,
связанное с оплатой покупок (со скидкой или без скидки), является вычисляемым (см. 3.14); оно должно быть определено в строке «Поле» следующим образом:
Оплата: iif([Скидка];[Цена]*0,9;[Цена]).
lПри определении поля «Оплата» была использована функция iif с тремя аргументами: первый аргумент представляет собой логическое выражение (принимающее значение «Да» или «Нет»); если это выражение имеет значение «Да» (в нашем случае
— если клиент имеет скидку), то функция возвращает значение своего второго аргумента (в нашем случае — цену товара, умноженную на 0,9); если же логическое выражение имеет значение «Нет», то функция возвращает значение своего третьего аргумента (в нашем случае — полную цену товара).
lОбъединение данных о товарах и купивших их клиентах обеспечивается, благодаря имеющейся связи между таблицами «Клиенты» и «Товары» (посредством вспомогательной таблицы «Продажи»).

170 |
Часть III. Работа с базами данных: Microsoft Access |
Запросы A6-3-7 – A6-3-8
Используйте режим перекрестного запроса (см. 6.4–6.5).
A6–4. В существующей базе данных «Видео» (см. упражнения A1–1, A5–1) разработать запрос «Отбор по жанрам», в котором запрашивается жанр фильма, после чего выводится список названий фильмов этого жанра (поле «Назв» таблицы «Фильмы») с указанием кассет, на которых эти фильмы записаны (поля «Фирма» и «Длит» таблицы «Кассеты»). Список сортируется по названиям фильмов.
Решение
Откройте базу данных «Видео» (см. 2.1).
Создайте новый запрос, включив в него связанные таблицы «Фильмы» и «Кассеты» (см. 3.1); поместите на бланк запроса поле «Назв» из таблицы «Фильмы» и поля «Фирма» и «Длит» из таблицы «Кассеты» (см. 3.2). Установите сортировку поля «Назв» по возрастанию (см. 3.3).
6.9. ОПРЕДЕЛЕНИЕ ПАРАМЕТРА ЗАПРОСА: поместите на бланк запроса поле «Жанр» из таблицы «Фильмы», снимите в этом поле флажок видимости (см. 3.11) и введите следующий текст в строку «Условие отбора»: =[Жанр фильма:].
Теперь при выполнении запроса вначале возникает диалоговое окно «Введите значение параметра», в котором запрашивается жанр фильма (название жанра требуется набрать в поле ввода, после чего нажать [OK]). После указания жанра формируется таблица, содержащая все фильмы этого жанра.
Сохраните запрос под именем Отбор по жанрам (см. 1.5).
l Обратите внимание на то, что параметр указывается в условии отбора в квадратных скобках (как и поля таблицы). Если текст в квадратных скобках совпадает с именем некоторого поля, то на его место подставляется значение этого поля; в противном случае (когда полей с таким именем нет) текст считается параметром запроса, и для определения его значения используется диалоговое окно, появляющееся в начале выполнения запроса.
A6–5. В существующей базе данных «Спорт» (см. упражнение A1–2) разработать запрос «Отбор по баллам», в котором запрашивается количество баллов, после чего выводится список спортсменов, имеющих в упражнении на перекладине указанное или большее количество баллов (выводятся поля «Фам», «Страна», «Перекл»). Список сортируется по полю «Фам».
Указание
Используйте параметр [Количество баллов:] (см. 6.9) в условии отбора для поля «Перекл».