Страницы

понедельник, 14 октября 2013 г.

Простая бд Access - Автопарк

Задание База данных «Автопарк» MS Access (16 вариант).
База данных должна содержать следующие элементы:
  • Таблица «Типы автобусов»: код автобуса; марка автобуса; количество мест.
  • Таблица «Парк»: код автобуса; гаражный номер; государственный номер; год выпуска.
  • Таблица «Водители»: табельный номер водителя; Ф.И.О.; дата рождения; оклад; номер маршрута.
  • Таблица «Перевозки»: дата; код автобуса; номер маршрута; табельный номер водителя; время выхода автобуса на маршрут; время прибытия автобуса с маршрута; причина схода автобуса с маршрута; количество проданных билетов
Поле со списком – таблица «Типы автобусов», поле «Марка автобуса».
Поле подстановки – «Код автобуса» в таблице «Парк», источник таблица «Типы автобусов».

Запросы на выборку:
  1. Водители, имеющие оклад от 15000  до 17000 р.
  2. Автобусы, работавшие на маршруте № 79 в сентябре 2009 г.
  3. Водители, работающие на автобусах марки «Икарус» на маршрутах № 90 и 104.
Запрос с вычисляемым полем
Длительность маршрута (таблица «Парк»).

Групповой запрос:
Количество автобусов по каждому маршруту (таблица «Парк»).

Запрос с параметром:
Водители, работающие на автобусах по маршруту N

Отчет по перевозкам, сгруппированный по марке автобуса, сортировка по ФИО водителя.

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


Справочник –классификатор – «Типы автобусов», справочники – «Парк» и «Водители», таблица «Перевозки» является основной и содержит всю информацию о перевозках за каждый день. Все связи между таблицами показаны на рисунке, тип связей – «один-ко-многим».
Сейчас о запросах.
Первый запрос на выборку:


Как видим, простейший однотабличный запрос.
Второй запрос на выборку


Запрос тоже несложный. У меня выбраны для него все четыре таблицы, хотя достаточно было бы двух («Перевозки» и «Водители») и трех полей (номер маршрута, ФИО и дата выезда). Просто так понятнее. Но необязательно.

Третий запрос на выборку


Запрос с вычисляемым полем


Здесь нам нужно посчитать длительность маршрута, то есть разницу во времени между выходом на маршрут и прибытием с маршрута. Чтобы вычислить разницу, вычтем из времени прибытия время выхода. Это делается без всяких дополнительных функций, простым вычитанием. Но затем нужно перевести полученное значение в формат времени, для этого используется функция CDate(). Если кликнуть правой кнопкой мыши на построенное поле в запросе и выбрать пункт «Свойства», то можно установить нужный формат поля (например, краткий формат времени). Полученный результат на рисунке:


Групповой запрос


Вот тут тоже такой мутный запрос, на мой взгляд. Нужно сгруппировать автобусы по номеру маршрута. По заданию автобусы никак к номеру маршрута не привязаны. Привязаны водители, и то не сильно, потому что в таблице «Перевозки» тоже есть номер маршрута. То есть, если водитель работает по умолчанию на первом маршруте, то он может выйти в рейс на сто первом, и на справочнике водителей это не отразится. Да и на одном автобусе может работать несколько водителей, как напарники. То есть группировать по водителям нельзя. Если же мы группируем по номеру маршрута из таблицы «Перевозки», то у нас, естественно, получается количество автобусов по каждому маршруту, которые когда-либо выходили в рейс на этом маршруте. Цифра гораздо больше, чем общее количество автобусов.
Логично было бы считать количество автобусов на маршруте за какую-либо дату. То есть добавить в запрос поле «Дата» как условие.
Но делаем по заданию.

Запрос с параметром


Делаем отчет. Многотабличный запрос


Отчет в режиме конструктора:


Итоги считаем по проданным билетам.