Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационные технологии.pdf
Скачиваний:
71
Добавлен:
08.04.2015
Размер:
3.39 Mб
Скачать

УПР 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