- •Основы реляционной модели данных
- •Цель автоматизации
- •Основные задачи
- •Список сотрудников АКБ Буревестник
- •ЗАДАНИЕ 1
- •ЗАДАНИЕ 2
- •УПР. 1. Нормализуйте исходную таблицу
- •Объекты ТАБЛИЦЫ – объекты хранения данных
- •УПР. 2. Создание таблиц.
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •CВЯЗИ между таблицами
- •Связь «Один-ко-многим»
- •Связи «Многие-ко-многим»
- •Связи «Один-к-Одному»
- •УПР. 3. Создание связей
- •УПР. 4-з. Создание запросов
- •УПР. 4-о. Создание отчетов
- •Задача «Недвижимость»
- •Контрольные вопросы
- •УПР 5. Дополнительные свойства полей
- •УПР 6. Подстановка значений
- •Задача «Ремонт»
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •УПР 7. Вычисляемые поля
- •УПР. 8. Сложные формы
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •УПР. 9. Сложные запросы
- •Условия отбора в запросе
- •Вычисления в запросе.
- •Запросы с параметром в условии
- •УПР 10. Назначение прав доступа в Формах
- •УПР 11. Запросы с итогами
- •Задача «Налог»
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •УПР 12. Отчеты с итогами
- •Задача «Монеты»
- •КОНТРОЛЬНЫЕ ВОПРОСЫ
- •УПР 13. Тип связи МНОГИЕ-КО-МНОГИМ
- •УПР 14. Самостоятельная работа
- •КОНТРОЛЬНАЯ РАБОТА
- •Приложение.
- •Пример исходной информации для разработки ИС АвтоСтрахование
- •Пример ИС Чек
- •Пример ИС «Сейфовые ячейки»
- •Пример ИС «АвтоБУ»
УПР 13. Тип связи МНОГИЕ-КО-МНОГИМ
Введение в проблему
Созданная нами ИС «Кадры» работает правильно, как мы убедились по предыдущим упражнениям, но не позволяет решать ряд управленческих задач. Например, она не может отслеживать документы о движении сотрудников по службе, т.е. приказы о переводе из отдела в отдел, повышении (или понижении) в должности, увольнении.
Поставим другую задачу в нашем проекте: Разработать ИС «Кадры с приказами», позволяющую сохранять историю рабочих перемещений сотрудников по службе от приема на работу до увольнения.
Если мы хотим решить эту задачу, то между таблицами Должности и Сотрудники обнаруживаются связи типа «Многие-ко-многим». Иными словами одну и ту же должность могут занимать многие сотрудники, и один сотрудник теперь может занимать последовательно разные должности. Между таблицами Отделы и Сотрудники также существует связь типа «Многие-ко-многим»: в отделе работает много сотрудников и сотрудник банка может поработать последовательно во многих отделах. Проблема состоит в том, что реляционная СУБД не поддерживает обеспечения целостности по связи типа «Многие-ко-многим». Действительно, попробуйте в рамках существующей схемы данных попытаться сохранить все должности, которые занимал сотрудник в течение его работы в АКБ «Буревестник»
93
Можно попытаться ввести в таблицу Сотрудники поля [Код_должности_1] [Код_должности_2] …[Код_должности_N]. Однако, что делать, если вдруг сотрудник перемещался по службе более N раз? Более того, чтобы эти коды были внешними ключами таблицы Сотрудники, нужно установить много связей между таблицами Сотрудники и Должности. Но этого не позволит сделать реляционная СУБД, так как она может следить за обеспечением целостности только одной связи между двумя таблицами. Поэтому для решения данной проблемы необходимо создать новую таблицу, в которой будет храниться информация о назначениях и перемещениях сотрудников. То есть нужно перестроить базу данных, из старой создать новую, внеся в нее необходимые изменения.
Для конкретизации задач, решаемых в новой БД, предположим, что нам нужно:
1.Сделать в Журнале кадровых приказов записи о приеме на работу всех имеющихся сотрудников с 01.01 текущего года.
2.Уволить Синичкину с 01.02 по собственному желанию в связи с выходом на пенсию.
3.Переместить на должность Главного управляющего Птичкину.
4.Переместить Сидорова с должности Помощника управляющего Валютным отделом на должность Управляющего того же отдела c 01.02.
5.Изменить структуру нашей организации и добавить отделы Бухгалтерия и Кадры.
6.Изменить штатное расписание и добавить должности Главного бухгалтера и Инспектора отдела кадров.
7.Принять на работу в эти отделы Зайцева и Волкова.
94
СОТРУДНИКИ |
|
|
|
|
ОТДЕЛЫ |
|
|
|
ДОЛЖНОСТИ |
|
|
|||
КодС |
Фамилия |
|
КодО |
Отдел |
|
КодД |
Должность |
|
||||||
1 |
Иванов |
|
1 |
Кредитный |
1 |
Управляющий |
||||||||
|
|
|
|
|
|
|
|
|
||||||
2 |
Петров |
|
2 |
Валютный |
|
2 |
Пом. управляющ |
|
||||||
3 |
Сидоров |
|
3 |
АХО |
|
3 |
Гл. упраляющ. |
|
||||||
4 |
Птичкина |
|
4 |
Бухгалтерия |
|
4 |
Гл. бухгалтер |
|
||||||
5 |
Синичкина |
|
|
5 |
Кадров |
|
5 |
Инспектор ОК |
||||||
6 |
Зайцев |
|
|
|
|
|
|
6 |
Практикант |
|||||
7 |
Волков |
|
|
|
|
|
|
7 |
Бухгалтер |
8.Принять с 01.03 двух Практикантов на работу в отделы Кредитный и Бухгалтерия и через месяц переместить их из отдела в отдел с целью более полного ознакомления со спецификой работы АКБ «Буревестник».
Задача: Создайте новую ИС Кадры с приказами для решения вышеперечисленных задач на основе предыдущего проекта ИС Кадры.
1.Откройте в проводнике папку, где хранится файл БД Кадры. Создайте копию БД Кадры, скопировав и переименовав файл «копия_Кадры.mdb» в файл «Кадры с приказами.mdb».
2.Откройте в новую БД Кадры с приказами. Она ни чем не отличается от предыдущей БД Кадры. Постройте в КОНСТРУКТОРЕ новую таблицу Журнал приказов на основе сле-
95
дующей структуры:
Ключ |
Имя поля |
Тип данных |
Размер/Примечание |
П.Кл |
КодПрик |
Счетчик |
|
|
|
|
|
Вн.Кл |
Код Сотрудника |
Числовой |
Длинное целое |
Вн.Кл |
Код Отдела |
Числовой |
Байт |
Вн.Кл |
Код Должности |
Числовой |
Целое |
|
Тип Приказа |
Числовой |
Байт |
|
Дата Приказа |
Дата/время |
|
|
Надбавка |
Денежный |
Надбавка в рублях |
3.Удалите все оставшиеся после копирования БД связи в старой схеме данных: между таб-
лицами Отделы, Сотрудники и Должности. Для этого откройте Схему данных, выде-
лите курсором каждую связь и в контекстном меню выберите команду Удалить.
4.Добавьте в Схему данных таблицу Журнал приказов.
5.Удалите ненужные, уже имеющиеся в Журнале приказов, поля из таблицы Сотрудники:
внешние ключи [Код Должности] и [Код Отдела], а также поле [Надбавка].
6.Создайте новые связи между таблицами Журнал приказов и Сотрудники, Журнал приказов и Отделы; Журнал приказов и Должности на основе первичных (П.Кл) и
внешних ключевых (Вн.Кл) полей. Установите свойство «Обеспечение целостности дан-
96
|
ных» для новых связей (см. пример Упр.3). |
|||
7. |
Определите подстановки в таблице Журнал приказов для всех внешних ключей. ВЫ |
|||
|
ЭТО УЖЕ УМЕЕТЕ. Посмотрите Упр. 6. |
|||
8. |
Задайте подстановку в поле [Тип Приказа] на основе фиксированного списка. ВЫ ЭТО |
|||
|
УЖЕ УМЕЕТЕ. Посмотрите Упр. 6 – аналогичную подстановку, например, в поле [Се- |
|||
|
мейное положение] таблицы Сотрудники БД Кадры. Таблица фиксированных значений |
|||
|
выглядит следующим образом: |
|
|
|
|
|
1 |
Принят |
|
|
|
2 |
Переведен |
|
9. |
Задайте для поля [Дата Приказа |
3 |
Уволен |
равное текущей дате. ВЫ ЭТО |
] значение |
по умолчанию |
|||
|
УЖЕ УМЕЕТЕ. Вспомните, какая функция возвращает текущую дату, мы ее использо- |
|||
|
вали в выражении для вычисления возраста. |
|||
10. |
Удалите все старые запросы и формы кроме форм Штатное расписание, Карточка сотруд- |
|||
|
ника, Структура организации. Отредактируйте форму Карточка сотрудника, удалив из нее |
|||
|
поля, более не принадлежащие таблице Сотрудники. |
|||
11. |
Создайте новую форму с именем «Журнал приказов» ленточного вида для заполнения |
|||
|
таблицы Журнал приказов. С ее помощью занесите информацию о перемещениях со- |
|||
|
трудников. Можно воспользоваться примером перемещений (смотри ниже). |
ВНИМАНИЕпризаполненииЖурналаприказовнеобходимоучитывать,чтодатыприказовсогласованыи идутповозрастанию. Подсогласованностьюподразумевается, чтоперваязаписьонекоторомсотруднике– это запись о его приеме на работу и последующие записи о перемещениях имеют даты позднее даты его
97
приема,адатаувольненияэтогосотрудникаявляетсясамойпоздней.
|
Заполнение Журнала приказов |
|
|
|
|
||
|
|
|
|
|
|||
Код |
Код Со- |
Код Отдела |
Код Должности |
Тип Прика- |
Дата При- |
Надбавка |
|
приказа |
трудника |
|
|
за |
|
каза |
|
1. |
Иванов |
Кредитный |
Управляющий |
Принят |
1 |
января |
1 тыс. руб |
|
|
|
|
|
|
||
2. |
Петров |
Кредитный |
Пом. управляющего |
Принят |
1 |
января |
1 тыс. руб |
3. |
Сидоров |
Валютный |
Пом. управляющего |
Принят |
1 |
января |
1 тыс. руб |
4. |
Птичкина |
Валютный |
Управляющий |
Принят |
1 |
января |
1 тыс. руб |
5. |
Синичкина |
Административный |
Главный управляющий |
Принят |
1 |
января |
0 тыс. руб |
6. |
Зайцев |
Кадров |
Инспектор отдела кадров |
Принят |
1 |
января |
1 тыс. руб |
7. |
Волков |
Бухгалтерия |
Главный бухгалтер |
Принят |
1 |
января |
1 тыс. руб |
8. |
Синичкина |
Административный |
Главный управляющий |
Уволен |
1 |
февраля |
0 тыс. руб |
9. |
Птичкина |
Административный |
Главный управляющий |
Переведен |
1 |
февраля |
2 тыс. руб |
10. |
Сидоров |
Валютный |
Управляющий |
Переведен |
1 |
февраля |
2 тыс. руб |
11. |
Студент1 |
Бухгалтерия |
Практикант |
Принят |
1 |
марта |
0 тыс. руб |
12. |
Студент2 |
Кредитный |
Практикант |
Принят |
1 |
марта |
0 тыс. руб |
13. |
Студент1 |
Кредитный |
Практикант |
Переведен |
1 |
апрель |
0 тыс. руб |
14. |
Студент2 |
Бухгалтерия |
Практикант |
Переведен |
1 |
апрель |
0 тыс. руб |
15. |
Студент1 |
Кредитный |
Практикант |
Уволен |
1 |
апрель |
1 тыс. руб |
16. |
Студент2 |
Бухгалтерия |
Бухгалтер |
Переведен |
1 |
апрель |
1 тыс. руб |
12. Создайте простой запрос «Движение сотрудников», в который соберите из всех таблиц
98
все поля, кроме полей внешних и первичных ключей. Проверьте, что данный запрос правильно выводит информацию, чтодатыприказовпокаждомусотрудникусогласованы.
13.Создайте новый запрос «Движение сотрудников с зарплатами» содержащий следующие поля:
[Код_сотрудника], [Фамилия], [Должность], [Отдел], [Тип Приказа], [Дата Приказа], [Надбавка] и [Оклад] Зарплата:=Вычисляемое поле (Постройте выражение)
14.Для определения количества принятых, переведенных и уволенных сотрудников создайте
взапросе «Движение сотрудников с зарплатами» три дополнительные колонки Приняты, Переведены, Уволены так, чтобы в каждой из них стояли 1, если [Тип Приказа] соответствует наименованию колонки, и 0, если тип приказа другой. Для данной задачи используйте в построителе условный оператор
->Встроенные функции/Управление/ IIf(«expr»;«truepart»;«falsepart»).
•Вычисляемое выражение Приняты: =IIF([Тип Приказа]=1;1;0)
•Вычисляемое выражение Переведены: =IIF([Тип Приказа]=2;1;0)
•Вычисляемое выражение Уволены: =IIF([Тип Приказа]=3;1;0)
15.Для определения сотрудников, работающих в АКБ «Буревестник» на текущую дату, создайте запрос «Список работающих», в котором отберите последние записи о каждом сотруднике ( группировка по [Код_Сотрудника], в остальных колонках функция Last) и исключите уволенных. Рассчитайте зарплату каждого работающего.
16.Создайте отчет с итогами «О текучести кадров отделах» на основе запроса «Движение
99
сотрудников с зарплатами» с группировкой по отделам и сортировкой по [Фамилии]. Итоги подведите суммированием значений в полях: Приняты, Переведены, Уволены.
17.Создайте отчет «Фонд оплаты труда» на текущую дату, используя в качестве источника запрос «Список работающих». Группировка по должностям, итоги по полю Зарплата. В заголовке отчета должна автоматически проставляться дата его составления
ДОПОЛНИТЕЛЬНО К УПР 13
Общее правило подготовки отчета – сначала сконструировать запрос, отбирающий нужную информацию, сортирующий ее по выбранному полю, производящий необходимые вычисления в дополнительных вычисляемых колонках запроса, и только затем строить на его основе отчет. Хотя MS Access позволяет строить отчет, оперируя полями, взятыми из таблиц, это все рано приводит к построению запроса, который, правда, скрыт от пользователя.
1.Постройте отчет о текучести кадров в определенном году. Он похож на запрос п.16 Упр. 13, однако, нужно обеспечить выборку записей Журнала приказов, относящихся только к определенному году, вводимому пользователем. Этот год должен отображаться в заголовке отчета.
2.Создайте новый запрос «Льготы по Зарплате сотрудников», скопировав запрос «Список сотрудников». В конструкторе добавьте в запрос следующие поля: [Дети] и [Пол]. Вычислите поле Льготы: IFF(AND([Дети]>0, [Пол]=женский); 13%[Дети]*[МРОТ];0). Это структура вычислений, а не готовая формула.
100
3.Создайте новый запрос «Адреса сотрудников» на основе запроса «Движение сотрудников» со следующими условиями для полей:
[Фамилия], [Имя]- не выводятся на экран, а используются для выражения Сотруд-
ник:=[Фамилия] +” ”+Left([Имя];1)+”.”
Возраст:=Вычисляемое поле (Вычисляет возраст), [Адрес], [Телефон домашний]. Откройте запрос для просмотра. Информация выводится
правильно, но записи о сотрудниках повторяются столько раз, сколько у него было переводов. Для устранения повторений введите группировку по полю [Фамилия], а для всех остальных полей определите в строке группировка функцию Last, которая выводит последнюю записью.
4.Постройте отчет на основании запроса «Адреса сотрудников». О сотрудниках должна выводиться только информация о Фамилии, инициалы, возраст и адрес. В итогах отчета должно указываться общее количество сотрудников в списке отчета.
101