Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Проектирование реализации операций бизнес-процесса

Содержание:

ВВЕДЕНИЕ

Для эффективного управления персоналом организация нуждается в целостной системе, позволяющей управлять работниками от момента приема на работу до завершения карьеры. Цели и задачи управления персоналом осуществляются через кадровую политику, включающую систему правил, в соответствии с которыми ведет себя система в целом и по которым действуют люди, входящие в эту систему.

Управление персоналом состоит в целенаправленном воздействии на работников для рациональной организации их труда и знаний.

Развитие способностей человека связано с наличием определённых задатков, из которых при благоприятных общественных условиях могут развиться способности, проявляющиеся в умениях и навыках. Благодаря приобретению опыта, развитию способностей, повышению квалификации происходит карьерное развитие работника, увеличивается вознаграждение, происходит самовыражение, повышается удовлетворённость трудом, что обеспечивает эффективность результатов работы организации.

Современные информационные технологии позволяют использования автоматические средства, позволяющие эффективно хранить, обрабатывать и распределять накопленные данные.

Широкое внедрение автоматизированных систем обработки информации и управления в организациях позволяет повысить эффективность и качество.

Цель работы – спроектировать автоматизированную систему для управления персоналом.

Для достижения поставленной цели необходимо выполнить следующие задачи:

  • дать характеристику предметной области;
  • выбрать задачи для автоматизации;
  • описать бизнес-процессы;
  • выбрать информационное и программное обеспечение;
  • построить информационную модель;
  • описать входную, справочную и результатную информацию;
  • построить дерево функций;
  • разработать базу данных;
  • описать программные модули;
  • привести контрольный пример реализации проекта.

1. АНАЛИТИЧЕСКАЯ ЧАСТЬ

1.1. Выбор комплекса задач автоматизации

Компания «Энергострой» разрабатывает качественные проекты энергоснабжения, которые учитывают все государственные нормы и стандарты. Также выполняются электротехнические работы на основании готового проекта.

За короткий период в компании разрабатывают такие части проекта, как наружные сети, внутреннее электроснабжение, электроосвещение.

На этапе непосредственной реализации проекта (этап проведения электромонтажных работ) специалисты выполняют все необходимые демонтажные, пусконаладочные и сопроводительные работы.

ООО «Энергострой» имеет следующую организационную структуру (рисунок 1.1):

Рис.1.1. Организационная структура ООО «Энергострой»

Представим систему управления персоналом в виде функциональной модели, построенной с помощью BPWin (рис.1.2). Данная модель, описывающая процесс деятельности предприятия, состоит из нескольких диаграмм, позволяющих понять, на основании каких функций работают отделы, кто их формирует, а также под чьим руководством, ясно увидеть результат работы. Методология IDEF0 позволяет выявить формальные недостатки бизнес-процессов, что существенно облегчает анализ деятельности рассматриваемой компании.

Рис.1.2. Контекстная диаграмма

Декомпозиция контекстной диаграммы представлена на рисунке 1.3.

Рис.1.3. IDEF0 Управление персоналом

Рис.1.4. Организация работы сотрудников

В данном пункте нами были выделены задачи для автоматизации:

прием на работу и уволнение;

повышение квалификации;

оформление отпусков, командировочных и т.д.

1.2. Характеристика существующих бизнес-процессов

Процесс оценки потенциала работника на входе получает упражнения, моделирующие ключевые моменты деятельности оцениваемого. В зависимости от результатов оценки сотрудник может быть перемещен в другое структурное подразделение, отправлен на повышение квалификации. Данная оценка также помогает менеджеру составить план обучения и развития, а также методические пособия и инструкции.

Процесс квалификационных испытаний на входе имеет оценку независимого эксперта, а на выходе тоже, что и у предыдущего процесса, единственное отличие – результаты данного процесса влияют на оклад/премию сотрудника, при отрицательных результатах сотрудник может быть уволен.

Процесс аттестации на предприятии осуществляется на основании таких документов, как:

  • приказ о проведении аттестации
  • бланк самооценки
  • бланк предварительной оценки
  • аттестационный лист
  • лист оценки стажера (для стажеров).

На выходе имеем все те же документы. Но в виду того, что предыдущие процессы не относятся к стажерам (в отличии от аттестации), на выходе появляется еще один документ – направление для прохождения стажировки.

При подборе кадров данные о сотрудниках и кандидатах поступают из справочников, когда процесс подбора завершен стартует процесс отбора персонала, где на входе поступают результаты анализа, полученные на предыдущем этапе, а также рекомендации на кандидатов на вакантную должность. Далее идет процесс найма, на выходе которого, получаем приказ о приеме на работу, либо приказ о кадровом перемещении (в зависимости от того, какой вид найма использовался: внешний или внутренний). Эти данные фиксируются в соответствующих справочниках. Процесс адаптации следует после найма сотрудника. Если на входе список нарушений, то происходит высвобождение сотрудника с соответствующим оформлением – приказ об увольнении, данный факт также фиксируется в справочнике.

На рисунках 1.5 и 1.6 детально приведены модели существующих бизнес-процессов приема на работу и увольнения.

Рис.1.5. Модель бизнес-процесса «Прием на работу»

Рис.1.6. Модель бизнес-процесса «Увольнение»

Процесс определения неудовлетворенных потребностей в кадрах осуществляется путем анализа штатного расписания, если таковая потребность имеет место, то происходит процесс разработки требований к идеальному для данного места работнику. Результатом данного процесса является должностная инструкция. После разработки требований необходимо определить источник найма: внешний либо внутренний.

На рисунке 1.7 показан процесс отбора кандидатов по двум направлениям, в зависимости от выбранного вида найма.

Рис.1.7. IDEF3 Отбор персонала

Непосредственно сам процесс найма представляет собой документально оформление отношений работодателя и работника, опираясь на ТЗ РФ. После того, как все документы оформлены, происходит адаптация сотрудника, когда осуществлялся внешний наем и вторичная – если имело место кадровое перемещение.

Как видно из представленных диаграмм, в существующей системе управления персоналом множество входных и выходных документов, которые в настоящее время заполняются вручную. Поэтому для совершенствования процессов управления персоналом было решено разработать автоматизированную систему.

1.3. Характеристика документооборота, возникающего при решении задачи

Автоматизированная система управления персоналом необходима менеджеру по персоналу для оперативной обработки информации о вакантных местах, кандидатах и сотрудниках компании.

Внедрение АС не потребует дополнительных технических ресурсов, так как все рабочие места оснащены компьютерной техникой.

Цели, критерии и ограничения создаваемой АС:

  • обеспечение полной и достоверной информацией, необходимой для кадрового учета;
  • обеспечение данными по обучению персонала и сдаче экзаменов;
  • своевременное оформление всей первичной документации;
  • повышение надежности и безопасности обработки информации.

Функции и задачи создаваемой АС:

Ожидаемые технико-экономические результаты создания АС:

  • снижение затрат времени на поиск резюме;
  • снижение затрат времени на подведение итогов сдачи экзаменов и последующее повышение оклада сотрудника;
  • повышение точности данных.

Затраты на создание и эксплуатацию АС будут невелики, так как все рабочие места отдела персонала оснащены необходимой техникой.

1.4. Обоснование проектных решений по информационному обеспечению

Информационное обеспечение (ИО) системы управления персоналом представляет собой информационную модель работы сотрудников предприятия. Различают внемашинное и внутримашинное обеспечение.

Информационное обеспечение включает в себя: систему классификации и кодирования; систему унифицированной документации, используемой в ИО, информационную базу, т.е. информацию из всех информационных массивов.

Входными документами в системе являются:

личные дела сотрудников;

трудовые книжки.

К внутримашинному информационному обеспечению относится описание экранных форм.

При разработке системы использовалась реляционная модель базы данных. Реляционная модель данных некоторой предметной области представляет собой набор отношений изменяющихся во времени. При создании информационной системы совокупность отношений позволяет хранить данные об объектах предметной области, моделировать связи между ними. При этом сами данные хранятся в таблицах [6]. Для удобства идентификации каждая таблица созданной базы данных обладает уникальным кодом.

К информационному обеспечению в рамках данного проекта относятся:

  • база данных;
  • экранные формы для ввода первичных данных в ЭВМ;
  • экранные формы для вывода результирующей информации.

Выходная информация – трудовой договор, приказы о приеме на работу, об увольнении и т.д.

Все указанные элементы совокупно составляют информационное обеспечение проекта. Данные, внесенные в форму ввода первичных данных, попадают в базу данных, а затем данная информация может быть выведена (по запросу) в форму для вывода результирующей информации.

1.5. Обоснование проектных решений по программному обеспечению

В ООО «Энергострой» на рабочих станциях пользователей системы установлена ОС линейки Microsoft Windows, это является оптимальным выбором, т.к. ОС семейства Windows наиболее распространённые на сегодняшний день, поэтому с приходом нового сотрудника не придётся его переобучать. На приобретаемый сервер с целью совместимости всех компонентов системы рекомендуется установить последнюю версию серверной операционной системы Microsoft Windows 2008 Server.

Реализация приложения проводится в среде программирования Borland Delphi 7.0, располагающей широкими возможностями по созданию приложений баз данных. Delphi 7.0 является средой быстрой разработки приложений (RAD), полностью поддерживающей все ведущие индустриальные стандарты: XML, SOAP, WSDL и XSL, а также появляющиеся платформы – Microsoft .NET и BizTalk, Sun Microsystems ONE, обеспечивая необходимую гибкость, надежность и масштабируемость.

Среди большого разнообразия продуктов для разработки приложений Delphi занимает одно из ведущих мест. С помощью Delphi написано колоссальное количество приложений, десятки фирм и тысячи программистов-одиночек разрабатывают для Delphi дополнительные компоненты.

В основе такой общепризнанной популярности лежит тот факт, что Delphi, как никакая другая система программирования, удовлетворяет изложенным выше требованиям. Действительно, приложения с помощью Delphi разрабатываются быстро, причем взаимодействие разработчика с интерактивной средой Delphi не вызывает внутреннего отторжения, а наоборот, оставляет ощущение комфорта. Delphi-приложения эффективны, если разработчик соблюдает определенные правила (и часто - если не соблюдает). Эти приложения надежны и при эксплуатации обладают предсказуемым поведением.

Delphi служит средством для быстрого создания широкого класса Windows - приложений. Она учитывает многие новейшие достижения в программировании и практике создания приложений и предназначена для визуального программирования, когда разработчик видит большую часть результатов непосредственно на экране монитора уже в процессе своей работы по созданию программы. Визуальное программирование позволяет быстрее создать интерфейс программы, сделать его более качественным за счет наилучшего расположения информации окна экране монитора, избежать многих ошибок уже на экране проектирования.

В качестве создания базы данных была выбрана СУБД Microsoft Access.

На сегодняшний день MS Access является наиболее популярной СУБД, используемой для разработки настольных баз данных (БД). Богатый набор мастеров и построителей позволяет полностью автоматизировать создание пользовательского интерфейса, а множество удобных средств разработки помогает сократить время создания законченного приложения. Полная интеграция с другими приложениями MS Office (Word, Excel, Outlook) — также большой плюс Access. Встроенный язык Visual Basic for Application (VBA) позволяет выполнять нестандартные задачи.

Популярность СУБД Microsoft Access обусловлена следующими причинами:

  • Access является одной из самых легкодоступных и понятных систем как для профессионалов, так и для начинающих пользователей, позволяющая быстро освоить основные принципы работы с базами данных;
  • система имеет полностью русифицированную версию;
  • полнаяинтегрированностьспакетами Microsoft Office: Word, Excel, Power Point, Mail;
  • идеология Windows позволяет представлять информацию красочно и наглядно;
  • возможность использования OLE технологии, что позволяет установить связь с объектами другого приложения или внедрить какие-либо объекты в базу данных Access;
  • технология WYSIWIG позволяет пользователю постоянно видеть все результаты своих действий;
  • широко и наглядно представлена справочная система;
  • существует набор “мастеров” по разработке объектов, облегчающий создание таблиц, форм и отчетов.

Access специально спроектирован для создания многопользовательских приложений, где файлы базы данных являются разделяемыми ресурсами в сети. В Microsoft Access реализована надёжная система защиты от несанкционированного доступа к файлам.

Все эти преимущества обусловили выбор именно этой СУБД.

2. ПРОЕКТНАЯ ЧАСТЬ

2.1. Информационная модель и её описание

Информационная модель представляет собой схему движения входных, промежуточных и результативных потоков и функций предметной области. Кроме того, она объясняет, на основе каких входных документов и какой нормативно-справочной информации происходит выполнение функций по обработке данных и формирование конкретных выходных документов. Информационная модель представлена на рис. 2.1.

Информационная система работает со справочниками Отделы, Сотрудники, Контрагенты, Типы и Категории документов, Клиенты, экранными формами ввода документов. Информационная система формирует выборки по типам и категориям документов.

В соответствии с приведенной информационной моделью, работа системы осуществляется следующим образом.

Администратор системы регистрирует сотрудников, изменяя содержимое таблицы «Сотрудники». Также он изменяет содержимое данной таблицы, редактируя данные для доступа к системе каждого сотрудника.

Сотрудник регистрирует документы, используя документ и справочники Типы документов, Категории документов, Контрагенты и Клиенты и изменяя содержимое таблицы Документы.

Рис.2.1. Информационная модель

2.2. Характеристика нормативно-справочной, входной и оперативной информации

В качестве входной информации используются следующие документы:

  • трудовая книжка;
  • штатное расписание;
  • документ.

Трудовая книжка сотрудника используется при регистрации его в системе. Источником получения данного документа является отдел кадров. При этом из нее используются следующие реквизиты:

  • фамилия, имя, отчество;
  • дата рождения;
  • наименование должности;
  • наименование отдела.

Частота возникновения данного документа – по мере регистрации новых сотрудников, объем – около 10 строк.

Штатное расписание используется при формировании справочника Отделы, при этом используется только такой реквизит, как наименование отдела. Источником получения данного документа также является отдел кадров, объем – 15 строк.

Документ является основным входным документом. При регистрации документа в системе задействуются следующие реквизиты:

  • наименование;
  • тип документа;
  • дата подготовки или поступления;
  • количество страниц;
  • описание документа;
  • электронная копия документа.

Источниками получения документов являются как другие организации, так и отделы самого общества. Объем документов колеблется в очень широком диапазоне.

В системе используются справочники, приведенные в таблице 2.1.

Таблица 2.1

Перечень используемых справочников

№ пп

Название справочника

Ответственный за ведение

Средний объём справочника в записях

Средняя частота актуализации

Средний объем актуализации, %

1

Отделы

Администратор

45

1 раз в месяц

10

2

Документы

Администратор

10

1 раз в год

10

3

Клиенты

Администратор

2000

1 раз в год

10

4

Типы документов

Администратор

50

1 раз в месяц

25

5

Категории документов

Администратор

20

1 раз в месяц

25

6

Сотрудники

Администратор

20

1 раз в месяц

25

Справочник Отделы имеет следующие реквизиты:

- код отдела;

- полное наименование отдела;

- сокращенное наименование отдела.

Справочник Сотрудники имеет следующие реквизиты:

  • фамилия;
  • имя;
  • отчество;
  • дата рождения
  • пароль
  • логин
  • дата регистрации

Справочник Типы документов включает в себя наименование типа документа и код категории.

Справочник Категории содержит наименования категорий документов.

Указанные справочники содержат входную и справочную информацию, необходимую для разрабатываемой системы.

2.3. Характеристика результатной информации

Результатной информацией для задачи автоматизации управления персоналом являются следующие документы:

  • список сотрудников;
  • список документов по категориям и типам;
  • список контрагентов;
  • список клиентов.

В списке сотрудников имеются следующие реквизиты:

  • фамилия, имя, отчество сотрудников;
  • дата регистрации;
  • должность;
  • отдел;
  • дата рождения;
  • логин и пароль для доступа в систему.

Данный документ формируется на основе справочников Отделы и Сотрудники.

Списки документов имеют следующие реквизиты:

  • наименование документа;
  • дата регистрации;
  • краткое описание;
  • количество страниц;
  • адресат;
  • ссылка на электронную версию документа;
  • тип документа;
  • категория документа.

2.4. Общие положения (дерево функций и сценарий диалога)

Состав и классификация функций разрабатываемого программного продукта представлены в виде дерева функций (рис. 2.2).

Рис. 2.2. Дерево функций ИС

В связи с тем, что при решении задачи используется технология обработки информации в режиме диалога, взаимодействие пользователя с программой можно представить в виде схемы диалога (рис.2.3).

Диалог, реализованный в программе относится к типу менюориентированных диалогов. Схема диалога представляет собой общую конструкцию диалога, т.е. требуемую последовательность обмена данными между пользователем и системой. В верхнем уровне схемы располагается главное меню, инициирующее задачу, затем происходит разветвление различной степени в зависимости от числа вариантов ответа пользователя на запрос ЭВМ или возможных реакций ЭВМ на конкретные сообщения.

При запуске системы открывается окно ввода логина и пароля. После успешной авторизации система автоматически определяет права пользователя и направляет его в то меню, которое ему доступно.

Рис. 2.3. Дерево сценариев диалога

Разработанный сценарий диалога будет реализован в информационной ситеме, более подробно описанной в контрольном примере.

2.5. Характеристика базы данных

Перечень сущностей и их соответствие информационной модели приведено в таблице 2.2.

Таблица 2.2

Перечень сущностей и их соответствие информационной модели

Название сущности в информационной модели

Идентификатор таблицы

Справочник «Отделы»

Otdel

Справочник «Сотрудники»

Sotr

Справочник «Типы документов»

Tipi

Справочник «Категории документов»

Kategorii

Таблица «Документы»

Dok

Характеристика каждой таблицы базы данных приведена ниже, в таблицах 2.3-2.9.

Таблица 2.3

Таблица Документы

Идентификатор

Тип данных

Примечание

 idd 

int(11)

Код документа

 ids 

int(5)

Код сотрудника

 named 

varchar(45)

Наименование

 idkd 

int(5)

Код типа

 datepod 

varchar(45)

Дата подготовки

 datez 

timestamp

Дата и время регистрации

 kolvostr 

varchar(45)

Количество страниц

 prim 

varchar(45)

Примечание

 otkuda 

varchar(45)

Адресат

 link 

text

Ссылка на документ

 status 

int(1)

Статус

 archiv 

int(1)

Флаг помещения в архив

 rnp 

int(1)

Флаг резолюции начальника отдела

Таблица 2.4

Таблица Отделы

Идентификатор

Тип данных

Примечание

 idOtd 

int(11)

Код отдела

 nameOtd 

varchar(100)

Наименование отдела

 KrNameOtd 

varchar(10)

Краткое наименование отдела

Таблица 2.5

Таблица Сотрудники

Идентификатор

Тип данных

Примечание

 idsotr 

int(11)

Код сотрудника

 name 

varchar(45)

Фамилия

 dolg 

int(2)

Код должности

 login 

varchar(10)

Логин

 parol 

varchar(10)

Пароль

 dates 

timestamp

Дата регистрации

 surname 

varchar(45)

Имя и отчество

 datebor 

varchar(14)

Дата рождения

 udal 

int(1)

Отметка об удалении

Таблица 2.6

Таблица Типы документов

Идентификатор

Тип данных

Примечание

idtip 

int(11)

Код типа документа

 namet 

varchar(10)

Наименование типа документа

idkat_tip

int(11)

Код категории документов

Таблица 2.71

Таблица Категории документов

Идентификатор

Тип данных

Примечание

idkat

int(11)

Код категории документа

namekat

text

Наименование категории документа

Приведенные таблицы являются основой реляционной базы данных.

2.6. Структурная схема пакета (дерево вызова программных модулей)

Структурная схема пакета представлена на рисунке 2.4.

Рис.2.4. Структурная схема пакета

2.7. Описание программных модулей

Описание программных модулей приведено в таблице 2.8.

Таблица 2.8

Описание функций модулей

Наименование модуля

Функции модуля

Модуль безопасности

Содержит процедуры и функции, обеспечивающие ввод и проверку пароля, вход пользователей в систему, автоматический выход из системы через определенный промежуток времени

Модуль инициализации программы

После успешного входа в систему, запускает программу, используя настройки прав доступа для учетной записи пользователя

Модуль взаимодействия с базой данных

Содержит процедуры и функции, используемые для установления соединения с базой данных ИС, а также управляющие операциями чтения, записи и редактирования данных

Модуль справочной системы

Содержит процедуры и функции, необходимые для отображения справочной информации

Модуль главного меню

Содержит главное меню, из которого осуществляется вызов остальных экранных форм

Модуль «Отчеты»

Содержит процедуры и функции для ввода параметров запроса, просмотра и печати отчетов

Модуль «Справочники»

Содержит процедуры функции, позволяющие просматривать содержимое справочников системы, и редактировать их (если позволяют права доступа)

Модуль «Пользователи»

Содержит процедуры функции, позволяющие управлять списками пользователей (если позволяют права доступа)

Модуль «Регистрация»

Содержит процедуры и функции, позволяющие регистрировать документы

2.8. Контрольный пример реализации проекта и его описание

При открытии программы появляется окно вида (рис.2.5).

Рис.2.5. Главное окно программы

Рассмотрим справочники, представленные в системе (рис.2.6-2.9).

Рис.2.6. Справочник «Отделы»

Рис.2.7. Справочник «Должности»

Рис.2.8. Справочник «Виды отпуска»

Рис.2.9. Реквизиты

Во всех приведенных формах справочников есть кнопки для добавления, удаления, перемещения записи, а также кнопки «Печать» и «Выход».

Рассмотрим штатное расписание (рис.2.10 -2.13).

Рис.2.10. Штатное расписание

Рис.2.11. Штатное расписание

Рис.2.12. Штатное расписание

Рис.2.13. Штатное расписание

Как видно из рисунков 2.10-2.13, в штатном расписании представлены сотрудники по каждому отделу, их количество, ставка, оклад, а также количество вакансий.

При добавлении нового сотрудника в тот или иной отдел, нужно заполнить карточку сотрудника (рис.2.14).

Рис.2.14. Карточка сотрудника

Рассмотрим, например, как формируется приказ о направлении на командировку.

Для этого нужно выбрать сотрудника, выбрать Командировки работника (рис.2.15).

Рис.2.15. Карточка сотрудника

В появившемся окне нажать «+». Откроется форма для добавления командировки (рис.2.16).

Рис.2.16. Добавление командировки

После заполнения все полей нужно выбрать «Приказ», далее откроется заполненный бланк Приказа в формате Excel (рис.2.17).

Рис.2.17. Приказ о направлении на командировку

На основе данных скриншотов можно увидеть, что программа работоспособна и выполняются все необходимые функции по управлению персоналом.

ЗАКЛЮЧЕНИЕ

В данном проекте рассмотрены проблемы автоматизации управления персоналом.

В работе разработано информационное обеспечение системы: информационная модель, система классификации и кодирования, состав справочников, исходных и результатных документов. Приведены экраны ввода первичной и условно-постоянной информации, формы результатных документов.

Разработано программное обеспечение: описана его архитектура, структура меню, структура базы данных.

Разработанная система полностью удовлетворяет потребностям ООО «Энергострой».

СПИСОК ЛИТЕРАТУРЫ

  1. ГОСТ 34.602-89 «Техническое задание на создание автоматизированной системы»
  2. Белов Е.Б, Лось В.П. и др. Основы информационной безопасности. - М.: Горячая линя - Телеком, 2010. – 544 с.
  3. Вигерс К. Разработка требований к программному обеспечению, пер, с англ. - Москва.: «Русская Редакция», 2010. – 576 с.
  4. Гвоздева Т.В. Проектирование информационных систем. – Ростов-на-Дону: Феникс, 2009. – 512 с.
  5. Грекул В.И. Проектирование информационных систем. – Москва.: Интуит, 2008. – 304 с.
  6. Диго С.М. Базы данных: проектирование и использование: Учебник. – Москва.: Финансы и статистика, 2007. – 592 с.
  7. Додонова И.В., Кабанова О.В. Автоматизированная обработка банковской информации. – Москва.: КноРус, 2008. – 176 с.
  8. Елиферов В.Г., Репин В.В. Бизнес-процессы. Регламентация и управление. – Москва.: Инфра-М, 2009. – 320 с.
  9. Емельянова Н.З. Проектирование информационных систем. – Москва.: Форум, 2009. – 432 с.
  10. Керри Н., Майкл Р. Access 2003 - Библия пользователя, Москва.:Диалектика, 2009 - 391 с.
  11. Козлов А.С. Проектирование и исследование бизнес-процессов. – Москва.: Флинта, 2007. – 272 с.
  12. Меняев М.Ф, Информационные технологии управления: Книга 3: Системы управления организацией, Москва.: Омега-Л, 2008. - 464 с.
  13. Мещеряков С.В., Иванов В.М. Эффективные технологии создания информационных систем. – Москва.: Политехника, 2009. – 309 с.
  14. Мишенин А.И. Теория экономических информационных систем. – Москва.: Финансы и статистика, 2010. – 240 с.
  15. Овчинников, В.Г. Методология проектирования автоматизированных информационных систем. Основы системного подхода. – Москва.: Компания Спутник+, 2009. – 286 с.
  16. Орлик С., Булуй Ю, Введение в программную инженерию и управление жизненным циклом ПО Программная инженерия. Программные требования
  17. Пестриков, В. М. Delphi на примерах / В. М. Пестриков, А. Н. Маслобоев. — СПб. : БХВ-Петербург, 2008. — 496 с.
  18. Петров В. Н. Информационные системы, СПб.: Питер, 2002. - 688 стр;
  19. Реляционные базы данных: практические приемы оптимальных решений. – СПб.: БХВ-Петербург, 2010. – 400стр.
  20. Репин В.В. Бизнес-процессы компании. Построение, анализ, регламентация. – Москва.: Стандарты и качество, 2009. – 240 с.
  21. Рудаков А.В. Технология разработки программных продуктов. - Москва.: Академия, 2008. – 208 с.
  22. Титоренко Г.А. Автоматизированные информационные технологии в экономике: Учебник. – Москва.: ЮНИТИ, 2009. – 399с.
  23. Шандров Б.В., Чудаков А.Д. Технические средства автоматизации. – Москва.: Академия, 2007. – 368 с.

Приложение

Листинг программы

programPersonnel;

uses

Forms,

uMain in 'uMain.pas' {fmMain},

uDM in 'uDM.pas' {DM: TDataModule},

uDepartments in 'uDepartments.pas' {fmDepartments},

uRep in 'uRep.pas',

uPosts in 'uPosts.pas' {fmPosts},

uVacationTypes in 'uVacationTypes.pas' {fmVacationTypes},

uRequisite in 'uRequisite.pas' {fmRequisite},

uStaff in 'uStaff.pas' {fmStaff},

uEmpCard in 'uEmpCard.pas' {fmEmpCard},

uMission in 'uMission.pas' {fmMission},

uVacation in 'uVacation.pas' {fmVacation},

uVacancyList in 'uVacancyList.pas' {fmVacancyList};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TfmMain, fmMain);

Application.CreateForm(TDM, DM);

Application.CreateForm(TfmDepartments, fmDepartments);

Application.CreateForm(TfmPosts, fmPosts);

Application.CreateForm(TfmVacationTypes, fmVacationTypes);

Application.CreateForm(TfmRequisite, fmRequisite);

Application.CreateForm(TfmStaff, fmStaff);

Application.CreateForm(TfmEmpCard, fmEmpCard);

Application.CreateForm(TfmMission, fmMission);

Application.CreateForm(TfmVacation, fmVacation);

Application.CreateForm(TfmVacancyList, fmVacancyList);

Application.Run;

end.

unit uMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ActnList, StdActns, ActnMan, StdCtrls, Buttons, ActnCtrls,

Grids, DBGrids, DBCtrls, ExtCtrls, ComCtrls, ToolWin, ActnMenus, ImgList;

type

TfmMain = class(TForm)

ActionManager1: TActionManager;

acSpravDep: TAction;

acSpravPosts: TAction;

acSpravVacationTypes: TAction;

acSpravRequisite: TAction;

Splitter1: TSplitter;

TreeView1: TTreeView;

Panel1: TPanel;

bbtExit: TBitBtn;

DBNavigator1: TDBNavigator;

DBGrid1: TDBGrid;

ActionToolBar1: TActionToolBar;

ImageList1: TImageList;

acEmpStuff: TAction;

acEmpAdd: TAction;

acEmpEdit: TAction;

acDocReceive: TAction;

acDocRelease: TAction;

acDocEmpCard: TAction;

acEmpVacation: TAction;

acDocContract: TAction;

acEmpMissions: TAction;

acDocInsurance: TAction;

acDocPFR: TAction;

chbDismiss: TCheckBox;

acDocEmpList: TAction;

acEmpVacancyList: TAction;

ActionMainMenuBar1: TActionMainMenuBar;

acFileExit: TFileExit;

procedure acSpravDepExecute(Sender: TObject);

procedure acSpravPostsExecute(Sender: TObject);

procedure acSpravVacationTypesExecute(Sender: TObject);

procedure acSpravRequisiteExecute(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure acEmpStuffExecute(Sender: TObject);

procedure TreeView1Change(Sender: TObject; Node: TTreeNode);

procedure acEmpAddExecute(Sender: TObject);

procedure acEmpEditExecute(Sender: TObject);

procedure DBGrid1DblClick(Sender: TObject);

procedure acDocReceiveExecute(Sender: TObject);

procedure acDocReleaseExecute(Sender: TObject);

procedure acDocEmpCardExecute(Sender: TObject);

procedure acEmpVacationExecute(Sender: TObject);

procedure acDocContractExecute(Sender: TObject);

procedure acEmpMissionsExecute(Sender: TObject);

procedure acDocInsuranceExecute(Sender: TObject);

procedure acDocPFRExecute(Sender: TObject);

procedure chbDismissClick(Sender: TObject);

procedure acDocEmpListExecute(Sender: TObject);

procedure acEmpVacancyListExecute(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmMain: TfmMain;

implementation

uses uRep, uDepartments, uPosts, uVacationTypes, uRequisite, uDM, DB,

uStaff, uEmpCard, uVacation, uMission, uVacancyList;

{$R *.dfm}

procedure TfmMain.acSpravDepExecute(Sender: TObject);

begin

fmDepartments.ShowModal;

FormShow(Self);

end;

procedure TfmMain.acSpravPostsExecute(Sender: TObject);

begin

fmPosts.Show;

end;

procedure TfmMain.acSpravVacationTypesExecute(Sender: TObject);

begin

fmVacationTypes.Show;

end;

procedure TfmMain.acSpravRequisiteExecute(Sender: TObject);

begin

fmRequisite.Show;

end;

procedure TfmMain.FormShow(Sender: TObject);

var

CategTreeNode: TTreeNode;

begin

TreeView1.Items.Clear;

DM.dstDepartments.Open;

DM.dstDepartments.Sort := 'Отдел';

DM.dstDepartments.First;

while not DM.dstDepartments.Eof do

begin

//Добавлениевершины - подразделения:

CategTreeNode := TreeView1.Items.Add(nil, DM.dstDepartments.FieldByName('Отдел').AsString);

//Data указывает на ID подразделения:

CategTreeNode.Data := Pointer(DM.dstDepartments.FieldByName('ID').AsInteger);

CategTreeNode.ImageIndex := 1;

DM.dstDepartments.Next;

end;

DM.dstDepartments.Close;

DM.dstEmployee.Open;

end;

procedure TfmMain.acEmpStuffExecute(Sender: TObject);

begin

fmStaff.ShowModal;

end;

//Отображение списка сотрудников в выбранном отделе:

procedure TfmMain.TreeView1Change(Sender: TObject; Node: TTreeNode);

begin

DM.dstEmployeeByDep.Close;

DM.dstEmployeeByDep.Parameters.ParamByName('pDismiss').DataType := ftInteger;

DM.dstEmployeeByDep.Parameters.ParamByName('pDepID').Value := Integer(Node.Data);

DM.dstEmployeeByDep.Parameters.ParamByName('pDismiss').DataType := ftBoolean;

DM.dstEmployeeByDep.Parameters.ParamByName('pDismiss').Value := chbDismiss.Checked;

DM.dstEmployeeByDep.Open;

//Часть функций меню доступны только если выбран работник:

acEmpEdit.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acEmpVacation.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acEmpMissions.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acDocEmpCard.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acDocRelease.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acDocReceive.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acDocContract.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

acDocInsurance.Enabled := DM.dstEmployeeByDep.RecordCount > 0;

end;

procedure TfmMain.acEmpAddExecute(Sender: TObject);

begin

DM.dstEmployee.Insert;

fmEmpCard.ShowModal;

TreeView1Change(Self, TreeView1.Selected);

end;

procedure TfmMain.acEmpEditExecute(Sender: TObject);

begin

fmEmpCard.ShowModal;

TreeView1Change(Self, TreeView1.Selected);

end;

procedure TfmMain.DBGrid1DblClick(Sender: TObject);

begin

acEmpEditExecute(Self);

end;

procedure TfmMain.acDocReceiveExecute(Sender: TObject);

begin

Rep_Receive;

end;

procedure TfmMain.acDocReleaseExecute(Sender: TObject);

begin

Rep_Release;

end;

procedure TfmMain.acDocEmpCardExecute(Sender: TObject);

begin

Rep_Card;

end;

//Список отпусков работника:

procedure TfmMain.acEmpVacationExecute(Sender: TObject);

begin

fmVacation.Caption := 'Отпуска ' + DM.dstEmployee.FieldByName('Фамилия').AsString + ' ' +

DM.dstEmployee.FieldByName('Имя').AsString + ' ' + DM.dstEmployee.FieldByName('Отчество').AsString;

fmVacation.Show;

end;

procedure TfmMain.acDocContractExecute(Sender: TObject);

begin

Rep_Contract;

end;

//Список командировок работника:

procedure TfmMain.acEmpMissionsExecute(Sender: TObject);

begin

fmMission.Caption := 'Командировки ' + DM.dstEmployee.FieldByName('Фамилия').AsString + ' ' +

DM.dstEmployee.FieldByName('Имя').AsString + ' ' + DM.dstEmployee.FieldByName('Отчество').AsString;

fmMission.Show;

end;

procedure TfmMain.acDocInsuranceExecute(Sender: TObject);

begin

Rep_Insurance;

end;

procedure TfmMain.acDocPFRExecute(Sender: TObject);

begin

Rep_DocumentsPFR;

end;

procedure TfmMain.chbDismissClick(Sender: TObject);

begin

TreeView1Change(Self, TreeView1.Selected);

end;

procedure TfmMain.acDocEmpListExecute(Sender: TObject);

begin

Rep_EmpList;

TreeView1Change(Self, TreeView1.Selected);

end;

procedure TfmMain.acEmpVacancyListExecute(Sender: TObject);

begin

fmVacancyList.Show;

end;

end.

unit uDepartments;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmDepartments = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

bbtPrint: TBitBtn;

BitBtn1: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmDepartments: TfmDepartments;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmDepartments.FormShow(Sender: TObject);

begin

DM.dstDepartments.Open;

DM.dstDepartments.Sort := 'Отдел';

end;

procedure TfmDepartments.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstDepartments.Close;

end;

procedure TfmDepartments.bbtPrintClick(Sender: TObject);

begin

Rep_Universal(DBGrid1, 1, 'Отделы');

end;

end.

unit uDM;

interface

uses

SysUtils, Classes, DB, ADODB;

type

TDM = class(TDataModule)

ADOConnection1: TADOConnection;

dstDepartments: TADODataSet;

dsDepartments: TDataSource;

dstPosts: TADODataSet;

dsPosts: TDataSource;

dstVacationTypes: TADODataSet;

dsVacationTypes: TDataSource;

dstFamilyStatus: TADODataSet;

dsFamilyStatus: TDataSource;

dstEducation: TADODataSet;

dsEducation: TDataSource;

dstDocTypes: TADODataSet;

dsDocTypes: TDataSource;

dstJobTypes: TADODataSet;

dsJobTypes: TDataSource;

dstRequisite: TADODataSet;

dsRequisite: TDataSource;

dstRequisiteDSDesigner: TWideStringField;

dstRequisiteDSDesigner2: TWideStringField;

dstRequisiteDSDesigner3: TWideStringField;

dstRequisiteDSDesigner4: TWideStringField;

dstRequisiteDSDesigner5: TWideStringField;

dstRequisiteDSDesigner6: TWideStringField;

dstRequisiteDSDesigner7: TWideStringField;

dstRequisiteDSDesigner8: TWideStringField;

dstRequisiteDSDesigner9: TWideStringField;

dstRequisiteDSDesigner10: TWideStringField;

dstStaff: TADODataSet;

dsStaff: TDataSource;

dstStaffID: TAutoIncField;

dstStaffID2: TIntegerField;

dstStaffID3: TIntegerField;

dstStaffDSDesigner: TWordField;

dstStaffDSDesigner2: TFloatField;

dstStaffDSDesigner3: TBCDField;

dstStaffDSDesigner4: TBCDField;

dstStaffField: TStringField;

dstStaffField2: TStringField;

dstEmployee: TADODataSet;

dsEmployee: TDataSource;

dstEmployeeN: TAutoIncField;

dstEmployeeDSDesigner: TWideStringField;

dstEmployeeDSDesigner2: TWideStringField;

dstEmployeeDSDesigner3: TWideStringField;

dstEmployeeDSDesigner4: TBooleanField;

dstEmployeeDSDesigner5: TDateTimeField;

dstEmployeeDSDesigner6: TWideStringField;

dstEmployeeDSDesigner7: TWideStringField;

dstEmployeeDSDesigner8: TWideStringField;

dstEmployeeDSDesigner9: TWideStringField;

dstEmployeeID: TIntegerField;

dstEmployeeID2: TIntegerField;

dstEmployeeDSDesigner1ID: TIntegerField;

dstEmployeeDSDesigner2ID: TIntegerField;

dstEmployeeID3: TIntegerField;

dstEmployeeDSDesigner10: TWideStringField;

dstEmployeeDSDesigner11: TWideStringField;

dstEmployeeDSDesigner12: TDateTimeField;

dstEmployeeDSDesigner13: TWideStringField;

dstEmployeeDSDesigner14: TWideStringField;

dstEmployeeDSDesigner15: TWideStringField;

dstEmployeeDSDesigner16: TWideStringField;

dstEmployeeDSDesigner17: TWideStringField;

dstEmployeeDSDesigner18: TWideStringField;

dstEmployeeDSDesigner19: TWideStringField;

dstEmployeeDSDesigner20: TWideStringField;

dstEmployeeDSDesigner21: TWideStringField;

dstEmployeeDSDesigner22: TBlobField;

dstEmployeeIntegerField: TStringField;

dstEmployeeIntegerField2: TStringField;

dstEmployeeIntegerField1: TStringField;

dstEmployeeIntegerField22: TStringField;

dstEmployeeIntegerField3: TStringField;

dstFamily: TADODataSet;

dsFamily: TDataSource;

dstFamilyID: TIntegerField;

dstFamilyDSDesigner: TWideStringField;

dstFamilyDSDesigner2: TWideStringField;

dstFamilyDSDesigner3: TDateTimeField;

dstFamilyDSDesigner4: TWideStringField;

dstFamilyDSDesigner5: TWideStringField;

dstEmpPosts: TADODataSet;

dsEmpPosts: TDataSource;

dstEmpPostsID2: TIntegerField;

dstEmpPostsID3: TIntegerField;

dstEmpPostsDSDesigner: TFloatField;

dstEmpPostsDSDesigner2: TBCDField;

dstEmpPostsDSDesigner3: TBCDField;

dstEmpPostsDSDesigner4: TDateTimeField;

dstEmpPostsDSDesigner5: TDateTimeField;

dstEmpPostsID4: TIntegerField;

dstEmpPostsN: TWideStringField;

dstEmpPostsDSDesigner6: TDateTimeField;

dstEmpPostsDSDesigner7: TWideStringField;

dstEmpPostsDSDesigner8: TBooleanField;

dstEmpPostsID5: TIntegerField;

dstEmpPostsID6: TIntegerField;

dstEmpPostsStringField: TStringField;

dstEmpPostsField: TStringField;

dstEmpPostsIntegerField: TStringField;

dstEmployeeByDep: TADODataSet;

AutoIncField1: TAutoIncField;

IntegerField1: TIntegerField;

IntegerField2: TIntegerField;

WideStringField18: TWideStringField;

StringField1: TStringField;

StringField2: TStringField;

dsEmployeeByDep: TDataSource;

dstVacancy: TADODataSet;

dstStaffField3: TIntegerField;

dstVacation: TADODataSet;

dsVacation: TDataSource;

dstVacationID: TIntegerField;

dstVacationDSDesigner: TDateTimeField;

dstVacationDSDesigner2: TDateTimeField;

dstVacationDSDesigner3: TWordField;

dstVacationDSDesigner4: TDateTimeField;

dstVacationDSDesigner5: TDateTimeField;

dstVacationID2: TIntegerField;

dstVacationDSDesigner6: TWideStringField;

dstVacationStringField: TStringField;

dstMission: TADODataSet;

dsMission: TDataSource;

dstMissionID: TIntegerField;

dstMissionDSDesigner: TDateTimeField;

dstMissionDSDesigner2: TWideStringField;

dstMissionDSDesigner3: TDateTimeField;

dstMissionDSDesigner4: TWideStringField;

dstMissionDSDesigner5: TWideStringField;

dstEmpPostsField2: TCurrencyField;

dstEmployeeByDepDSDesigner: TWideStringField;

dstEmployeeByDepDSDesigner2: TWideStringField;

dstVacancyList: TADODataSet;

dsVacancyList: TDataSource;

dstVacancyListDSDesigner: TWideStringField;

dstVacancyListDSDesigner2: TWideStringField;

dstVacancyListDSDesigner3: TWordField;

dstVacancyListDSDesigner4: TFloatField;

dstVacancyListDSDesigner5: TBCDField;

dstVacancyListDSDesigner6: TBCDField;

dstVacancyListDSDesigner7: TIntegerField;

dstVacancyListDSDesigner8: TIntegerField;

procedure DataModuleDestroy(Sender: TObject);

procedure dstEmployeeByDepAfterScroll(DataSet: TDataSet);

procedure dstStaffCalcFields(DataSet: TDataSet);

procedure dstEmpPostsCalcFields(DataSet: TDataSet);

private

{ Private declarations }

public

{ Public declarations }

end;

var

DM: TDM;

implementation

{$R *.dfm}

procedure TDM.DataModuleDestroy(Sender: TObject);

begin

ADOConnection1.Close;

end;

//Синхронизация наборов данных для выбранного на главной форме работника:

procedure TDM.dstEmployeeByDepAfterScroll(DataSet: TDataSet);

begin

dstEmployee.Locate('ТабN', dstEmployeeByDep.FieldByName('ТабN').AsInteger, []);

end;

//Расчет кол-ва вакансий для текущей позиции в штатном расписании:

procedure TDM.dstStaffCalcFields(DataSet: TDataSet);

var

Num: Integer;

begin

dstVacancy.Parameters.ParamByName('pStaffID').Value := DataSet.FieldByName('ID').Value;

dstVacancy.Open;

if dstVacancy.FieldByName('Колво').IsNull then

Num := 0

else

Num := dstVacancy.FieldByName('Колво').Value;

DataSet.FieldByName('Вакансий').Value := DataSet.FieldByName('ШтатныхЕд').Value - Num;

dstVacancy.Close;

end;

//Расчет зарплаты работника:

procedure TDM.dstEmpPostsCalcFields(DataSet: TDataSet);

begin

DataSet.FieldByName('Зарплата').AsCurrency := DataSet.FieldByName('Оклад').AsCurrency *

DataSet.FieldByName('Ставка').AsFloat + DataSet.FieldByName('Надбавка').AsCurrency;

end;

end.

unit uEmpCard;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ComCtrls, ExtDlgs, StdCtrls, DBCtrls, Mask, ExtCtrls, Grids,

DBGrids, Buttons;

type

TfmEmpCard = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

DBImage1: TDBImage;

btFoto: TButton;

OpenPictureDialog1: TOpenPictureDialog;

Label1: TLabel;

DBEdit1: TDBEdit;

Label2: TLabel;

DBEdit2: TDBEdit;

Label3: TLabel;

DBEdit3: TDBEdit;

Label4: TLabel;

DBEdit4: TDBEdit;

Label5: TLabel;

DBEdit5: TDBEdit;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Label14: TLabel;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

GroupBox1: TGroupBox;

DBEdit9: TDBEdit;

Label9: TLabel;

DBEdit8: TDBEdit;

Label8: TLabel;

DBEdit7: TDBEdit;

Label7: TLabel;

DBEdit6: TDBEdit;

Label6: TLabel;

DBLookupComboBox1: TDBLookupComboBox;

DBLookupComboBox2: TDBLookupComboBox;

DBLookupComboBox3: TDBLookupComboBox;

DBLookupComboBox4: TDBLookupComboBox;

Label15: TLabel;

Label16: TLabel;

DBEdit11: TDBEdit;

Label17: TLabel;

DBEdit12: TDBEdit;

Label18: TLabel;

DBEdit13: TDBEdit;

Label19: TLabel;

DBEdit14: TDBEdit;

Label20: TLabel;

DBEdit15: TDBEdit;

Label21: TLabel;

DBEdit16: TDBEdit;

Label22: TLabel;

DBEdit17: TDBEdit;

DBLookupComboBox5: TDBLookupComboBox;

GroupBox2: TGroupBox;

Label23: TLabel;

DBEdit18: TDBEdit;

Label24: TLabel;

DBEdit19: TDBEdit;

GroupBox3: TGroupBox;

Label28: TLabel;

Label29: TLabel;

DBEdit10: TDBEdit;

DBEdit23: TDBEdit;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

TabSheet4: TTabSheet;

Label25: TLabel;

Label26: TLabel;

DBEdit21: TDBEdit;

Label30: TLabel;

DBEdit24: TDBEdit;

Label31: TLabel;

DBEdit25: TDBEdit;

Label32: TLabel;

DBEdit26: TDBEdit;

Label33: TLabel;

DBEdit27: TDBEdit;

Label34: TLabel;

Label35: TLabel;

DBEdit29: TDBEdit;

Label36: TLabel;

DBEdit30: TDBEdit;

Label37: TLabel;

DBEdit31: TDBEdit;

DBCheckBox1: TDBCheckBox;

DBLookupComboBox6: TDBLookupComboBox;

DBLookupComboBox7: TDBLookupComboBox;

Label27: TLabel;

DBEdit22: TDBEdit;

DBNavigator2: TDBNavigator;

bbtOK: TBitBtn;

bbtCancel: TBitBtn;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

BitBtn4: TBitBtn;

Label38: TLabel;

Label39: TLabel;

Label40: TLabel;

DBEdit20: TDBEdit;

Label41: TLabel;

BitBtn5: TBitBtn;

procedure btFotoClick(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure DBLookupComboBox6Click(Sender: TObject);

procedure bbtCancelClick(Sender: TObject);

procedure bbtOKClick(Sender: TObject);

procedure PageControl1Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmEmpCard: TfmEmpCard;

implementation

uses uDM, DB, uMain;

{$R *.dfm}

procedure TfmEmpCard.btFotoClick(Sender: TObject);

begin

if OpenPictureDialog1.Execute then

DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

procedure TfmEmpCard.RadioButton1Click(Sender: TObject);

begin

if not (DM.dstEmployee.State in [dsEdit, dsInsert]) then

DM.dstEmployee.Edit;

DM.dstEmployee.FieldByName('Пол').Value := RadioButton1.Checked

end;

procedure TfmEmpCard.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if DM.dstEmployee.State = dsInsert then

DM.dstEmployee.Cancel;

if DM.dstEmpPosts.RecordCount = 0 then

begin

Application.MessageBox('Не указана должность работника!',

'Ошибка сохранения', MB_OK + MB_ICONERROR);

Abort;

end

else

begin

DM.dstFamily.Close;

DM.dstEmpPosts.Close;

DM.dstStaff.Close;

DM.dstJobTypes.Close;

end;

end;

procedure TfmEmpCard.FormShow(Sender: TObject);

begin

DM.dstFamily.Open;

DM.dstEmpPosts.Open;

DM.dstStaff.Open;

DM.dstJobTypes.Open;

//Определениеполаработника:

if DM.dstEmployee.FieldByName('Пол').Value <> Null then

begin

RadioButton1.Checked := DM.dstEmployee.FieldByName('Пол').Value;

RadioButton2.Checked := not DM.dstEmployee.FieldByName('Пол').Value;

end

else

RadioButton1.Checked := False;

end;

//При выборе штатной должности автоматически подставляются данные по зарплате:

procedure TfmEmpCard.DBLookupComboBox6Click(Sender: TObject);

begin

DM.dstEmpPosts.FieldByName('Ставка').Value := DM.dstStaff.FieldByName('Ставка').Value;

DM.dstEmpPosts.FieldByName('Оклад').Value := DM.dstStaff.FieldByName('Оклад').Value;

DM.dstEmpPosts.FieldByName('Надбавка').Value := DM.dstStaff.FieldByName('Надбавка').Value;

end;

procedure TfmEmpCard.bbtCancelClick(Sender: TObject);

begin

if DM.dstEmployee.State = dsInsert then

DM.dstEmployee.Cancel

else

Application.MessageBox('Отменаневозможна! Данные были сохранены ранее.',

'Информация', MB_OK + MB_ICONINFORMATION);

Close;

end;

//Сохранениезаписи:

procedure TfmEmpCard.bbtOKClick(Sender: TObject);

begin

if DM.dstEmpPosts.RecordCount = 0 then

Application.MessageBox('Не указана должность работника!',

'Ошибка сохранения', MB_OK + MB_ICONERROR)

else

begin

try

if DM.dstEmployee.State in [dsEdit, dsInsert] then

DM.dstEmployee.Post;

except

Application.MessageBox('Незаданывсенеобходимыеданные!',

'Ошибкасохранения', MB_OK + MB_ICONERROR);

end;

Close;

end;

end;

//Перед вводом данных о семье и должности, запись о работнике сохраняется:

procedure TfmEmpCard.PageControl1Change(Sender: TObject);

begin

if PageControl1.ActivePageIndex in [2,3] then

try

if DM.dstEmployee.State in [dsEdit, dsInsert] then

DM.dstEmployee.Post;

except

Application.MessageBox('Незаданывсенеобходимыеданные!',

'Ошибкасохранения', MB_OK + MB_ICONERROR);

end;

end;

end.

unit uFamily;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmFamily = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

BitBtn1: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmFamily: TfmFamily;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmFamily.FormShow(Sender: TObject);

begin

DM.dstDepartments.Open;

end;

procedure TfmFamily.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstDepartments.Close;

end;

end.

unit uMission;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmMission = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

bbtPrint: TBitBtn;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmMission: TfmMission;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmMission.FormShow(Sender: TObject);

begin

DM.dstMission.Open;

end;

procedure TfmMission.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstMission.Close;

end;

procedure TfmMission.bbtPrintClick(Sender: TObject);

begin

Rep_Universal(DBGrid1, 5, fmMission.Caption);

end;

procedure TfmMission.BitBtn2Click(Sender: TObject);

begin

Rep_Mission;

end;

end.

unit uPosts;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmPosts = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

bbtPrint: TBitBtn;

BitBtn1: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmPosts: TfmPosts;

implementation

uses uDM, uRep, uEmpCard, uStaff;

{$R *.dfm}

procedure TfmPosts.FormShow(Sender: TObject);

begin

DM.dstPosts.Open;

DM.dstPosts.Sort := 'Должность';

end;

procedure TfmPosts.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if not (fmStaff.Showing or fmEmpCard.Showing) then

DM.dstPosts.Close;

end;

procedure TfmPosts.bbtPrintClick(Sender: TObject);

begin

Rep_Universal(DBGrid1, 1, 'Справочникпрофессий');

end;

end.

unituRep;

//Модуль для формирования отчетов и документов

interface

uses

Windows, SysUtils, Classes, ComObj, DB, Controls, Forms, ADODB, Math, DBGrids;

procedure Rep_Universal(ADBGrid: TDBGrid; NumCol: Integer; ACaption: string);

procedure Rep_Receive;

procedure Rep_Release;

procedure Rep_Staff;

procedure Rep_Card;

procedure Rep_Vacation;

procedure Rep_Contract;

procedure Rep_Mission;

procedure Rep_Insurance;

procedure Rep_DocumentsPFR;

procedure Rep_EmpList;

function GetRightDate(ADate: TDateTime): string;

implementation

uses

uDM, DateUtils, Dialogs, uEmpCard;

//Функция возвращает дату формата "xx месяца xxxx г."

function GetRightDate(ADate: TDateTime): string;

var

Month: string;

begin

case MonthOf(ADate) of

1: Month := 'января';

2: Month := 'февраля';

3: Month := 'марта';

4: Month := 'апреля';

5: Month := 'мая';

6: Month := 'июня';

7: Month := 'июля';

8: Month := 'августа';

9: Month := 'сентября';

10: Month := 'октября';

11: Month := 'ноября';

12: Month := 'декабря';

end;

Result := FormatDateTime('dd ' + Month + ' yyyy г.', ADate);

end;

//Формирование отчета по выбранному набору данных (вывод заголовков видимых

//полейиихзначений):

procedure Rep_Universal(ADBGrid: TDBGrid; NumCol: Integer; ACaption: string);

var

Excel: Variant;

i, j, Width: Integer;

begin

Excel := CreateOleObject('Excel.Application');

Screen.Cursor := crHourGlass;

try

try

Excel.Application.EnableEvents := False;

Excel.Workbooks.Add;

for i:=0 to NumCol-1 do

begin

//Вывод в шапку таблицы названий полей из DBGrid'а:

Excel.Cells[5,i+1] := ADBGrid.Columns[i].Title.Caption;

//Форматированиезаголовка:

Width := Min(30, Trunc(ADBGrid.Columns[i].Width * 0.2));

Excel.Cells[5,i+1].ColumnWidth := Width;

Excel.Cells[5,i+1].Font.Bold := True;

end;

Excel.Cells[1,1] := Date;

Excel.Cells[3,1] := ACaption;

Excel.Cells[3,1].Font.Bold := True;

Excel.Cells[3,1].Font.Size := 12;

i := 5;

//Экспорт данных из таблиц БД:

with ADBGrid.DataSource.DataSet do

begin

DisableControls; //Отключаем сетку на время формирования отчета

First;

while not Eof do

begin

Inc(i);

//Выводятся NumCol первых полей таблицы, отображенных в DBGrid'е:

for j:=0 to NumCol-1 do

Excel.Cells[i,j+1] := FieldByName(ADBGrid.Columns[j].FieldName).AsString;

Next;

end;

end; //with

Excel.Application.EnableEvents := True;

Excel.Visible := True;

except

Excel.Quit;

end;

finally

ADBGrid.DataSource.DataSet.EnableControls;

Screen.Cursor := crDefault;

ADBGrid.Enabled := True;

end;

end;

//Формирование приказа о приеме на работу для текущей выбранной должности

//работника (если у него несколько должностей):

procedure Rep_Receive;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Приказоприеме.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблицы БД:

with DM do

begin

dstRequisite.Open;

dstEmpPosts.Open;

dstDepartments.Open;

//Выводреквизитов:

Excel.Cells[9,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[41,5] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[41,10] := dstRequisite.FieldByName('РукФИО').AsString;

Excel.Cells[13,10] := Date;

Excel.Cells[44,10] := GetRightDate(Date);

Excel.Cells[13,8] := dstEmployee.FieldByName('ТабN').AsString + '1';

Excel.Cells[17,9] := dstEmpPosts.FieldByName('ПринятС').AsString;

Excel.Cells[21,2] := dstEmployee.FieldByName('Фамилия').AsString + ' ' +

dstEmployee.FieldByName('Имя').AsString + ' ' +

dstEmployee.FieldByName('Отчество').AsString;

Excel.Cells[21,10] := FormatFloat('0000', dstEmployee.FieldByName('ТабN').AsInteger);

if dstDepartments.Locate('ID', dstEmpPosts.FieldByName('ОтделID').AsInteger, []) then

Excel.Cells[23,3] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[25,2] := dstEmpPosts.FieldByName('Должность').AsString;

Excel.Cells[28,2] := dstEmpPosts.FieldByName('ХарактерРаботы').AsString;

Excel.Cells[31,5] := dstStaff.FieldByName('Ставка').AsFloat * dstStaff.FieldByName('Оклад').AsFloat;

Excel.Cells[32,5] := dstEmpPosts.FieldByName('Надбавка').AsString;

Excel.Cells[36,5] := dstEmpPosts.FieldByName('Основание').AsString;

Excel.Cells[37,5] := dstEmpPosts.FieldByName('ДоговорДата').AsString;

Excel.Cells[37,8] := dstEmpPosts.FieldByName('ДоговорN').AsString;

dstRequisite.Close;

dstDepartments.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование приказа об увольнении:

procedureRep_Release;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Приказобувольнении.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблиц БД:

with DM do

begin

dstRequisite.Open;

dstEmpPosts.Open;

dstDepartments.Open;

//Выводреквизитов:

Excel.Cells[9,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[40,5] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[40,11] := dstRequisite.FieldByName('РукФИО').AsString;

Excel.Cells[15,10] := Date;

Excel.Cells[42,11] := GetRightDate(Date);

Excel.Cells[15,9] := dstEmployee.FieldByName('ТабN').AsString + '2';

Excel.Cells[18,6] := dstEmpPosts.FieldByName('ДоговорДата').AsString;

Excel.Cells[18,8] := dstEmpPosts.FieldByName('ДоговорN').AsString;

Excel.Cells[10,12] := dstEmpPosts.FieldByName('ДоговорN').AsString;

Excel.Cells[11,12] := dstEmpPosts.FieldByName('ДоговорДата').AsString;

Excel.Cells[19,6] := dstEmpPosts.FieldByName('ПринятПо').AsString;

Excel.Cells[21,2] := dstEmployee.FieldByName('Фамилия').AsString + ' ' +

dstEmployee.FieldByName('Имя').AsString + ' ' +

dstEmployee.FieldByName('Отчество').AsString;

Excel.Cells[21,12] := FormatFloat('0000', dstEmployee.FieldByName('ТабN').AsInteger);

if dstDepartments.Locate('ID', dstEmpPosts.FieldByName('ОтделID').AsInteger, []) then

Excel.Cells[23,2] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[25,2] := dstEmpPosts.FieldByName('Должность').AsString;

dstRequisite.Close;

dstDepartments.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование штатного расписания:

procedureRep_Staff;

var

Excel: Variant;

WorkbookName: string;

i, PosInc, Count: Integer;

Pay1, Pay2: Currency;

begin

//Шаблон хранится в папке Шаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\Штатное расписание.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

Excel.Cells[12,12] := 1;

Excel.Cells[12,13] := Date;

Excel.Cells[12,4] := Date;

Excel.Cells[12,7] := IncYear(Date);

//Экспорт данных из таблицы БД:

with DM do

begin

dstDepartments.Open;

//Формирование таблицы:

i := 0;

PosInc := 20;

Count := 0;

Pay1 := 0;

Pay2 := 0;

dstDepartments.First;

//Циклпоотделам:

while not dstDepartments.Eof do

begin

DM.dstStaff.Filter := 'ОтделID = ' + dstDepartments.FieldByName('ID').AsString;

//Цикл по должностям в отделе:

dstStaff.First;

while not dstStaff.Eof do

begin

//Добавление новой строки:

ifi<> 0 then

begin

Excel.Rows.Item[PosInc+i].Select;

Excel.Selection.Insert;

Excel.Rows.Item[PosInc].Select;

Excel.Selection.Copy;

Excel.Rows.Item[PosInc+i].Select;

Excel.ActiveSheet.Paste;

Excel.Application.CutCopyMode := False;

end;

Excel.Cells[i+PosInc,2] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[i+PosInc,5] := dstStaff.FieldByName('Должность').AsString;

Excel.Cells[i+PosInc,8] := dstStaff.FieldByName('ШтатныхЕд').AsInteger;

Excel.Cells[i+PosInc,9] :=

dstStaff.FieldByName('Ставка').AsFloat * dstStaff.FieldByName('Оклад').AsFloat;

Excel.Cells[i+PosInc,12] := dstStaff.FieldByName('Надбавка').AsFloat;

Excel.Cells[i+PosInc,16] := dstStaff.FieldByName('Надбавка').AsFloat +

dstStaff.FieldByName('Ставка').AsFloat * dstStaff.FieldByName('Оклад').AsFloat;

Inc(Count, dstStaff.FieldByName('ШтатныхЕд').AsInteger);

Pay1 := Pay1 + dstStaff.FieldByName('Ставка').AsFloat * dstStaff.FieldByName('Оклад').AsCurrency;

Pay2 := Pay2 + dstStaff.FieldByName('Надбавка').AsInteger;

dstStaff.Next;

Inc(i);

end;

dstDepartments.Next;

end;

//Выводреквизитов:

dstRequisite.Open;

Excel.Cells[9,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[i+27,15] := dstRequisite.FieldByName('ГлБухФИО').AsString;

dstRequisite.Close;

dstDepartments.Close;

end; //with

Excel.Cells[i+20,8] := Count; //Кол-вочеловеквштате

Excel.Cells[i+20,9] := Pay1;

Excel.Cells[i+20,12] := Pay2;

Excel.Cells[i+20,16] := Pay1 + Pay2;

Excel.Cells[13,16] := Count; //Кол-во человек в штате

Excel.Visible := True;

except

Excel.Quit;

end;

end;

procedure Rep_Card;

var

Excel: Variant;

WorkbookName: string;

i: Integer;

PlaceOfBirth: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Личнаякарточка.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблиц БД:

with DM do

begin

dstRequisite.Open;

dstEmpPosts.Open;

dstDepartments.Open;

//Лист 1------------------------------------------------------------------

Excel.Worksheets[1].Activate;

//Выводреквизитов:

Excel.Cells[9,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[13,2] := Date;

Excel.Cells[13,3] := FormatFloat('0000', dstEmployee.FieldByName('ТабN').AsInteger);

Excel.Cells[13,4] := dstEmployee.FieldByName('ИНН').AsString;

Excel.Cells[13,5] := dstEmployee.FieldByName('ПенсСвид').AsString;

Excel.Cells[13,7] := dstEmpPosts.FieldByName('ХарактерРаботы').AsString;

Excel.Cells[13,9] := dstEmployee.FieldByName('Пол').AsString;

Excel.Cells[18,8] := dstEmpPosts.FieldByName('ДоговорN').AsString;

Excel.Cells[19,8] := dstEmpPosts.FieldByName('ДоговорДата').AsString;

Excel.Cells[20,3] := dstEmployee.FieldByName('Фамилия').AsString;

Excel.Cells[20,6] := dstEmployee.FieldByName('Имя').AsString;

Excel.Cells[20,9] := dstEmployee.FieldByName('Отчество').AsString;

Excel.Cells[21,4] := dstEmployee.FieldByName('ДатаРождения').AsString;

//Формирование строки места рождения:

PlaceOfBirth := '';

if (not dstEmployee.FieldByName('РождСтрана').IsNull) and

(dstEmployee.FieldByName('РождСтрана').AsString <> 'Россия') then

PlaceOfBirth := dstEmployee.FieldByName('РождСтрана').AsString;

if (not dstEmployee.FieldByName('РождОбласть').IsNull) and

(dstEmployee.FieldByName('РождОбласть').AsString <> '') then

begin

if PlaceOfBirth <> '' then

PlaceOfBirth := PlaceOfBirth + ', ';

PlaceOfBirth := PlaceOfBirth + dstEmployee.FieldByName('РождОбласть').AsString;

end;

if (not dstEmployee.FieldByName('РождРайон').IsNull) and

(dstEmployee.FieldByName('РождРайон').AsString <> '') then

begin

if PlaceOfBirth <> '' then

PlaceOfBirth := PlaceOfBirth + ', ';

PlaceOfBirth := PlaceOfBirth + dstEmployee.FieldByName('РождРайон').AsString;

end;

if (not dstEmployee.FieldByName('РождГород').IsNull) and

(dstEmployee.FieldByName('РождГород').AsString <> '') then

begin

if PlaceOfBirth <> '' then

PlaceOfBirth := PlaceOfBirth + ', ';

PlaceOfBirth := PlaceOfBirth + dstEmployee.FieldByName('РождГород').AsString;

end;

Excel.Cells[23,4] := PlaceOfBirth;

Excel.Cells[29,4] := dstEmployee.FieldByName('Образование').AsString;

//Лист 2------------------------------------------------------------------

Excel.Worksheets[2].Activate;

Excel.Cells[4,5] := Date;

Excel.Cells[10,5] := dstEmployee.FieldByName('СемПоложение').AsString;

//Списокродственников:

dstFamily.Open;

dstFamily.First;

i := 15;

while not dstFamily.Eof do

begin

Excel.Cells[i,2] := dstFamily.FieldByName('Родство').AsString;

Excel.Cells[i,5] := dstFamily.FieldByName('ФИО').AsString;

Excel.Cells[i,9] := YearOf(dstFamily.FieldByName('ДатаРождения').AsDateTime);

Inc(i);

dstFamily.Next;

end;

dstFamily.Close;

Excel.Cells[20,4] := dstEmployee.FieldByName('ДокументСерия').AsString

+ ' ' + dstEmployee.FieldByName('ДокументНомер').AsString;

Excel.Cells[20,9] := dstEmployee.FieldByName('ДокументДата').AsString;

Excel.Cells[21,3] := dstEmployee.FieldByName('ДокументВыдан').AsString;

Excel.Cells[33,4] := dstEmployee.FieldByName('Телефон').AsString;

//Лист 3------------------------------------------------------------------

Excel.Worksheets[3].Activate;

//Список занимаемых должностей:

dstEmpPosts.First;

i := 9;

while not dstEmpPosts.Eof do

begin

Excel.Cells[i,2] := dstEmpPosts.FieldByName('ПринятС').AsString;

Excel.Cells[i,3] := dstEmpPosts.FieldByName('Отдел').AsString;

Excel.Cells[i,5] := dstEmpPosts.FieldByName('Должность').AsString;

Excel.Cells[i,7] := dstEmpPosts.FieldByName('Надбавка').AsFloat +

dstEmpPosts.FieldByName('Ставка').AsFloat * dstEmpPosts.FieldByName('Оклад').AsFloat;

Excel.Cells[i,9] := dstEmpPosts.FieldByName('Основание').AsString;

Inc(i);

dstEmpPosts.Next;

end;

//Лист 4------------------------------------------------------------------

Excel.Worksheets[4].Activate;

//Списокотпусков:

dstVacation.Open;

dstVacation.First;

i := 21;

while not dstVacation.Eof do

begin

Excel.Cells[i,2] := dstVacation.FieldByName('ВидОтпуска').AsString;

Excel.Cells[i,4] := dstVacation.FieldByName('ПериодС').AsString;

Excel.Cells[i,6] := dstVacation.FieldByName('ПериодПо').AsString;

Excel.Cells[i,7] := dstVacation.FieldByName('Дней').AsString;

Excel.Cells[i,8] := dstVacation.FieldByName('ДатаС').AsString;

Excel.Cells[i,9] := dstVacation.FieldByName('ДатаПо').AsString;

Excel.Cells[i,10] := dstVacation.FieldByName('Основание').AsString;

Inc(i);

dstVacation.Next;

end;

dstVacation.Close;

dstRequisite.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование приказа о предоставлении отпуска:

procedure Rep_Vacation;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Приказоботпуске.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблицы БД:

with DM do

begin

dstRequisite.Open;

dstEmpPosts.Open;

dstDepartments.Open;

//Выводреквизитов:

Excel.Cells[10,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[46,11] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[46,25] := dstRequisite.FieldByName('РукФИО').AsString;

Excel.Cells[16,25] := Date;

Excel.Cells[50,22] := GetRightDate(Date);

Excel.Cells[16,21] := dstEmployee.FieldByName('ТабN').AsString + '3';

Excel.Cells[21,2] := dstEmployee.FieldByName('Фамилия').AsString + ' ' +

dstEmployee.FieldByName('Имя').AsString + ' ' +

dstEmployee.FieldByName('Отчество').AsString;

Excel.Cells[21,28] := FormatFloat('0000', dstEmployee.FieldByName('ТабN').AsInteger);

if dstDepartments.Locate('ID', dstEmpPosts.FieldByName('ОтделID').AsInteger, []) then

Excel.Cells[23,2] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[25,2] := dstEmpPosts.FieldByName('Должность').AsString;

Excel.Cells[29,8] := GetRightDate(dstVacation.FieldByName('ПериодС').AsDateTime) +

' по ' + GetRightDate(dstVacation.FieldByName('ПериодПо').AsDateTime);

if dstVacation.FieldByName('ВидОтпуска').AsString = 'Ежегодныйотпуск' then

begin

Excel.Cells[31,18] := dstVacation.FieldByName('Дней').AsString;

Excel.Cells[32,3] := GetRightDate(dstVacation.FieldByName('ДатаС').AsDateTime) +

' по ' + GetRightDate(dstVacation.FieldByName('ДатаПо').AsDateTime);

end

else

begin

Excel.Cells[35,2] := dstVacation.FieldByName('ВидОтпуска').AsString;

Excel.Cells[37,3] := dstVacation.FieldByName('Дней').AsString;

Excel.Cells[38,3] := GetRightDate(dstVacation.FieldByName('ДатаС').AsDateTime) +

' по ' + GetRightDate(dstVacation.FieldByName('ДатаПо').AsDateTime);

end;

Excel.Cells[40,9] := dstVacation.FieldByName('Дней').AsString;

Excel.Cells[41,3] := GetRightDate(dstVacation.FieldByName('ДатаС').AsDateTime) +

' по ' + GetRightDate(dstVacation.FieldByName('ДатаПо').AsDateTime);

dstRequisite.Close;

dstDepartments.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование трудового договора:

procedureRep_Contract;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Трудовойдоговор.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблицы БД:

with DM do

begin

dstRequisite.Open;

dstEmpPosts.Open;

dstDepartments.Open;

//Лист 1------------------------------------------------------------------

Excel.Worksheets[1].Activate;

//Выводреквизитов:

Excel.Cells[9,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[15,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[17,3] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[17,8] := dstRequisite.FieldByName('РукФИО').AsString;

Excel.Cells[13,8] := dstEmployee.FieldByName('ТабN').AsString + '4';

Excel.Cells[13,9] := Date;

Excel.Cells[20,2] := dstEmployee.FieldByName('Фамилия').AsString + ' ' +

dstEmployee.FieldByName('Имя').AsString + ' ' +

dstEmployee.FieldByName('Отчество').AsString;

if dstDepartments.Locate('ID', dstEmpPosts.FieldByName('ОтделID').AsInteger, []) then

Excel.Cells[31,3] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[26,5] := dstEmpPosts.FieldByName('Должность').AsString;

Excel.Cells[46,7] := dstEmpPosts.FieldByName('ПринятС').AsString;

Excel.Cells[47,7] := dstEmpPosts.FieldByName('ПринятПо').AsString;

//Лист 3------------------------------------------------------------------

Excel.Worksheets[3].Activate;

Excel.Cells[46,2] := 'Оклад';

Excel.Cells[46,9] := dstStaff.FieldByName('Ставка').AsFloat * dstStaff.FieldByName('Оклад').AsCurrency;

Excel.Cells[47,2] := 'Надбавка';

Excel.Cells[47,9] := dstEmpPosts.FieldByName('Надбавка').AsString;

Excel.Cells[54,9] := dstEmpPosts.FieldByName('Надбавка').AsCurrency +

dstStaff.FieldByName('Ставка').AsFloat * dstStaff.FieldByName('Оклад').AsCurrency;

//Лист 4------------------------------------------------------------------

Excel.Worksheets[4].Activate;

//Выводреквизитов:

Excel.Cells[37,2] := dstRequisite.FieldByName('ЮрАдрес').AsString;

Excel.Cells[48,2] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[51,2] := dstRequisite.FieldByName('РукФИО').AsString;

//Выводреквизитов:

Excel.Cells[37,7] := dstEmployee.FieldByName('АдресРегистр').AsString;

Excel.Cells[41,7] := dstEmployee.FieldByName('Телефон').AsString;

Excel.Cells[43,8] := dstEmployee.FieldByName('ИНН').AsString;

Excel.Cells[44,8] := dstEmployee.FieldByName('ПенсСвид').AsString;

Excel.Cells[46,8] := dstEmployee.FieldByName('ДокументСерия').AsString +

' ' + dstEmployee.FieldByName('ДокументНомер').AsString;

Excel.Cells[48,9] := dstEmployee.FieldByName('ДокументДата').AsString;

Excel.Cells[51,7] := dstEmployee.FieldByName('Фамилия').AsString + ' ' +

dstEmployee.FieldByName('Имя').AsString[1] + '. ' +

dstEmployee.FieldByName('Отчество').AsString[1] + '. ';

dstRequisite.Close;

dstDepartments.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование приказа о командировке:

procedureRep_Mission;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Приказокомандировке.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблицы БД:

with DM do

begin

dstRequisite.Open;

dstEmpPosts.Open;

dstDepartments.Open;

//Выводреквизитов:

Excel.Cells[9,2] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[38,5] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[38,12] := dstRequisite.FieldByName('РукФИО').AsString;

Excel.Cells[12,13] := Date;

Excel.Cells[41,12] := GetRightDate(Date);

Excel.Cells[12,12] := dstEmployee.FieldByName('ТабN').AsString + '5';

Excel.Cells[17,2] := dstEmployee.FieldByName('Фамилия').AsString + ' ' +

dstEmployee.FieldByName('Имя').AsString + ' ' +

dstEmployee.FieldByName('Отчество').AsString;

Excel.Cells[17,14] := FormatFloat('0000', dstEmployee.FieldByName('ТабN').AsInteger);

if dstDepartments.Locate('ID', dstEmpPosts.FieldByName('ОтделID').AsInteger, []) then

Excel.Cells[19,2] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[21,2] := dstEmpPosts.FieldByName('Должность').AsString;

Excel.Cells[23,2] := dstMission.FieldByName('МестоНазначения').AsString;

Excel.Cells[28,3] := DaysBetween(dstMission.FieldByName('ДатаС').AsDateTime,

dstMission.FieldByName('ДатаПо').AsDateTime);

Excel.Cells[29,3] := GetRightDate(dstMission.FieldByName('ДатаС').AsDateTime) +

' по ' + GetRightDate(dstMission.FieldByName('ДатаПо').AsDateTime);

Excel.Cells[30,3] := dstMission.FieldByName('Цель').AsString;

dstRequisite.Close;

dstDepartments.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование анкеты застрахованного лица:

procedureRep_Insurance;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'Анкетазастрахованноголица.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблицы БД:

with DM do

begin

dstEmpPosts.Open;

dstDepartments.Open;

Excel.Cells[9,7] := dstEmployee.FieldByName('Фамилия').AsString;

Excel.Cells[10,7] := dstEmployee.FieldByName('Имя').AsString;

Excel.Cells[11,7] := dstEmployee.FieldByName('Отчество').AsString;

Excel.Cells[12,7] := dstEmployee.FieldByName('Пол').AsString[1];

Excel.Cells[13,9] := GetRightDate(dstEmployee.FieldByName('ДатаРождения').AsDateTime);

Excel.Cells[15,12] := dstEmployee.FieldByName('РождГород').AsString;

Excel.Cells[16,12] := dstEmployee.FieldByName('РождРайон').AsString;

Excel.Cells[17,12] := dstEmployee.FieldByName('РождОбласть').AsString;

Excel.Cells[18,12] := dstEmployee.FieldByName('РождСтрана').AsString;

Excel.Cells[21,15] := dstEmployee.FieldByName('АдресРегистрИндекс').AsString;

Excel.Cells[21,21] := dstEmployee.FieldByName('АдресРегистр').AsString;

if dstEmployee.FieldByName('АдресРегистр').AsString <>

dstEmployee.FieldByName('АдресФакт').AsString then

begin

Excel.Cells[24,15] := dstEmployee.FieldByName('АдресФактИндекс').AsString;

Excel.Cells[24,21] := dstEmployee.FieldByName('АдресФакт').AsString;

end;

Excel.Cells[33,12] := dstEmployee.FieldByName('ВидДокумента').AsString;

Excel.Cells[35,12] := dstEmployee.FieldByName('ДокументСерия').AsString +

' ' + dstEmployee.FieldByName('ДокументНомер').AsString;

Excel.Cells[36,12] := dstEmployee.FieldByName('ДокументДата').AsString;

Excel.Cells[37,12] := dstEmployee.FieldByName('ДокументВыдан').AsString;

dstDepartments.Close;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

dstEmpPosts.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Формирование описи документов в ПФР:

procedure Rep_DocumentsPFR;

var

Excel: Variant;

WorkbookName: string;

begin

//ШаблонхранитсявпапкеШаблоны:

WorkbookName := GetCurrentDir + '\Шаблоны\' + 'ОписьдокументоввПФР.xlt';

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Open(WorkbookName);

//Экспорт данных из таблицы БД:

with DM do

begin

dstRequisite.Open;

//Выводреквизитов:

Excel.Cells[5,10] := dstRequisite.FieldByName('РегНомерПФР').AsString;

Excel.Cells[6,3] := dstRequisite.FieldByName('ИНН').AsString;

Excel.Cells[6,14] := dstRequisite.FieldByName('КПП').AsString;

Excel.Cells[7,12] := dstRequisite.FieldByName('НаименованиеОрг').AsString;

Excel.Cells[47,2] := dstRequisite.FieldByName('РукДолжн').AsString;

Excel.Cells[47,23] := dstRequisite.FieldByName('РукФИО').AsString;

Excel.Cells[49,2] := Date;

dstRequisite.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

//Список сотрудников по отделам:

procedureRep_EmpList;

var

Excel: Variant;

i: Integer;

begin

//Шаблон хранится в папке Шаблоны:

Excel := CreateOleObject('Excel.Application');

try

Excel.Workbooks.Add;

Excel.Cells[1,1] := Date;

Excel.Cells[3,1] := 'Список сотрудников по отделам';

Excel.Cells[3,1].Font.Bold := True;

Excel.Cells[3,1].Font.Size := 12;

//Экспорт данных из таблицы БД:

with DM do

begin

dstEmployeeByDep.DisableControls;

dstDepartments.Open;

//Формирование таблицы:

i := 6;

dstEmployeeByDep.Close;

dstEmployeeByDep.Parameters.ParamByName('pDismiss').DataType := ftBoolean;

dstEmployeeByDep.Parameters.ParamByName('pDismiss').Value := False;

dstDepartments.First;

//Циклпоотделам:

while not dstDepartments.Eof do

begin

dstEmployeeByDep.Close;

dstEmployeeByDep.Parameters.ParamByName('pDismiss').DataType := ftInteger;

dstEmployeeByDep.Parameters.ParamByName('pDepID').Value := dstDepartments.FieldByName('ID').AsInteger;

dstEmployeeByDep.Open;

Excel.Cells[i,1] := dstDepartments.FieldByName('Отдел').AsString;

Excel.Cells[i,1].Font.Bold := True;

Excel.Cells[i,1].Font.Size := 11;

Inc(i);

if dstEmployeeByDep.RecordCount > 0 then

begin

//Заголовкистолбцов:

Excel.Cells[i,1] := 'ФИО';

Excel.Cells[i,1].ColumnWidth := 40;

Excel.Cells[i,1].Font.Bold := True;

Excel.Cells[i,2] := 'Должность';

Excel.Cells[i,2].ColumnWidth := 40;

Excel.Cells[i,2].Font.Bold := True;

Inc(i);

end;

//Цикл по работникам в отделе:

dstEmployeeByDep.First;

while not dstEmployeeByDep.Eof do

begin

Excel.Cells[i,1] := dstEmployeeByDep.FieldByName('ФИО').AsString;

Excel.Cells[i,2] := dstEmployeeByDep.FieldByName('Должность').AsString;

dstEmployeeByDep.Next;

Inc(i);

end;

Inc(i);

dstDepartments.Next;

end;

dstDepartments.Close;

end; //with

Excel.Visible := True;

except

Excel.Quit;

end;

end;

end.

unit uRequisite;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, DBCtrls, Buttons;

type

TfmRequisite = class(TForm)

Label1: TLabel;

Label2: TLabel;

DBEdit2: TDBEdit;

Label3: TLabel;

DBEdit3: TDBEdit;

Label4: TLabel;

DBEdit4: TDBEdit;

Label5: TLabel;

DBEdit5: TDBEdit;

Label6: TLabel;

DBEdit6: TDBEdit;

Label7: TLabel;

DBEdit7: TDBEdit;

Label8: TLabel;

DBEdit8: TDBEdit;

Label9: TLabel;

DBEdit9: TDBEdit;

Label10: TLabel;

DBEdit10: TDBEdit;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

DBMemo1: TDBMemo;

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmRequisite: TfmRequisite;

implementation

uses uDM, DB;

{$R *.dfm}

procedure TfmRequisite.FormShow(Sender: TObject);

begin

DM.dstRequisite.Open;

end;

procedure TfmRequisite.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

DM.dstRequisite.Close;

end;

procedure TfmRequisite.BitBtn1Click(Sender: TObject);

begin

if DM.dstRequisite.State = dsEdit then

DM.dstRequisite.Post;

Close;

end;

procedure TfmRequisite.BitBtn2Click(Sender: TObject);

begin

DM.dstRequisite.Cancel;

Close;

end;

end.

unit uStaff;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons, ComCtrls;

type

TfmStaff = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

bbtPrint: TBitBtn;

BitBtn1: TBitBtn;

TreeView1: TTreeView;

Splitter1: TSplitter;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

procedure TreeView1Change(Sender: TObject; Node: TTreeNode);

procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;

DataCol: Integer; Column: TColumn; State: TGridDrawState);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmStaff: TfmStaff;

implementation

uses uDM, uRep, uMain, uEmpCard;

{$R *.dfm}

procedure TfmStaff.FormShow(Sender: TObject);

var

CategTreeNode: TTreeNode;

begin

TreeView1.Items.Clear;

DM.dstStaff.Open;

DM.dstStaff.Filtered := True;

DM.dstDepartments.Open;

DM.dstDepartments.Sort := 'Отдел';

DM.dstDepartments.First;

while not DM.dstDepartments.Eof do

begin

//Добавлениевершины - подразделения:

CategTreeNode := TreeView1.Items.Add(nil, DM.dstDepartments.FieldByName('Отдел').AsString);

//Data указывает на ID подразделения:

CategTreeNode.Data := Pointer(DM.dstDepartments.FieldByName('ID').AsInteger);

CategTreeNode.ImageIndex := 1;

DM.dstDepartments.Next;

end;

TreeView1.Items[0].Selected := True;

DM.dstPosts.Sort := 'Должность';

end;

procedure TfmStaff.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstStaff.Filtered := False;

//Набор данных закрываем только если нет других открытых форм, связанных с данным набором:

if not fmEmpCard.Showing then

DM.dstStaff.Close;

end;

procedure TfmStaff.bbtPrintClick(Sender: TObject);

begin

Rep_Staff;

end;

//Отображение списка штатных единиц в выбранном отделе:

procedure TfmStaff.TreeView1Change(Sender: TObject; Node: TTreeNode);

begin

DM.dstStaff.Filter := 'ОтделID = ' + IntToStr(Integer(Node.Data));

end;

//Колонка "Вакансий" выделяется цветом, если вакансии есть:

procedure TfmStaff.DBGrid1DrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn;

State: TGridDrawState);

begin

if Column.FieldName = 'Вакансий' then

if DM.dstStaff.FieldByName(Column.FieldName).AsInteger > 0 then

begin

DBGrid1.Canvas.Brush.Color := clMoneyGreen;

DBGrid1.Canvas.Font.Color := clRed;

end;

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

end.

unit uVacancyList;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmVacancyList = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

bbtPrint: TBitBtn;

BitBtn1: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmVacancyList: TfmVacancyList;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmVacancyList.FormShow(Sender: TObject);

begin

DM.dstVacancyList.Open;

DM.dstVacancyList.Filter := 'Вакансий> 0';

DM.dstVacancyList.Filtered := True;

end;

procedure TfmVacancyList.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstVacancyList.Close;

end;

procedure TfmVacancyList.bbtPrintClick(Sender: TObject);

begin

Rep_Universal(DBGrid1, 7, fmVacancyList.Caption);

end;

end.

unit uVacation;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmVacation = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

bbtPrint: TBitBtn;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmVacation: TfmVacation;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmVacation.FormShow(Sender: TObject);

begin

DM.dstVacation.Open;

end;

procedure TfmVacation.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstVacation.Close;

end;

procedure TfmVacation.bbtPrintClick(Sender: TObject);

begin

Rep_Universal(DBGrid1, 6, fmVacation.Caption);

end;

procedure TfmVacation.BitBtn2Click(Sender: TObject);

begin

Rep_Vacation;

end;

end.

unit uVacationTypes;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, Grids, DBGrids, ExtCtrls, StdCtrls, Buttons;

type

TfmVacationTypes = class(TForm)

Panel1: TPanel;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

BitBtn1: TBitBtn;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormShow(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmVacationTypes: TfmVacationTypes;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmVacationTypes.FormShow(Sender: TObject);

begin

DM.dstVacationTypes.Open;

end;

procedure TfmVacationTypes.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstVacationTypes.Close;

end;

end.