АВТОМАТИЗАЦИЯ УЧЕТА РАБОТЫ АВТОТРАНСПОРТНОГО ПРЕДПРИЯТИЯ

Автотранспортное предприятие МП ОПАТП осуществляет пассажирские перевозки, сопровождая плановые рейсы формированием определенной документации: формирование маршрутного журнала, листа-дохода кондукторов, учёт рабочего времени водителей.

2014-06-18

1.08 MB

103 чел.


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

Если эта работа Вам не подошла внизу страницы есть список похожих работ. Так же Вы можете воспользоваться кнопкой поиск


ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

ДИПЛОМНЫЙ ПРОЕКТ НА ТЕМУ:

АВТОМАТИЗАЦИЯ УЧЕТА РАБОТЫ АВТОТРАНСПОРТНОГО ПРЕДПРИЯТИЯ


Содержание

Введение…………………………………………………………………………..3

I. Специальная часть         

1. Постановка задачи…………………………………………………………….4

2. Формализация …………………………………………………………………5

3. Описание среды программирования…………………………………………7

3.1. Требования к техническому обеспечению………………………….11

3.2. Требования к программному обеспечению……………………...…12

4. Методика разработки проекта……………………………………………….13

4.1. Алгоритмизация задачи……………………………...….…………...13

4.1.1. Описание алгоритма………………………………………………..14

4.1.2 Структурная схема………………………………………………….19

4.2. Программирование………………………………………..………….20

4.3. Аномалии и защитное программирование………………………….21

4.4. Тестирование и отладка…………………………………………....22

5. Анализ результатов решения……………………………………………....23

6. Инструкция пользователю……………………………………………….…..24

II. Экономическая часть…………………………………………………………36

III. Заключение………………………………………………………………….43

IV.Литература……………………………………………………………………44

V. Приложение…...…………………………………………………………….45


Введение

Автотранспортное предприятие МП ОПАТП осуществляет пассажирские перевозки, сопровождая плановые рейсы формированием определенной документации: формирование маршрутного журнала, листа-дохода кондукторов, учёт рабочего времени водителей.

На каждый рейс выдаётся «Путевой лист», который после окончания рабочего дня сдаётся диспетчеру.

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

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

I.Специальная часть

1.Постановка задачи

Задачей дипломного проекта является разработка программного приложения «Автоматизация учёта работы автотранспортного предприятия», которое  позволит:

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

Приложение будет разработано в среде Microsoft Visual Studio 2005(C#.NET), с использованием Microsoft SQL Server 2005.

2.Формализация

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

Для создания базы данных, таблиц, представлений и хранимых процедур был написан SQL-сценарий, текст которого представлен в пункте V. «Приложение».  

Схема данных:

Рис. 1

Как правило, разработка проекта реализации задачи выполняется в несколько этапов и начинается с анализа той информации, которая является выходной (таблицы Microsoft SQL Server), итоговая (конечная) форма для Microsoft Visual Studio 2005(C#.NET). Только после выяснения структуры и состава этой информации, формулировки запросов для получения отчетов можно сделать вывод о структуре и составе таблиц данных. Необходимым этапом формализации задачи является нормализация базы данных, которая, по сути, представляет собой процесс оптимизации хранения и использования информации в таблицах.

3.Описание среды программирования

Программа была разработана в среде Microsoft Visual Studio 2005 (C#.NET), с использованием Microsoft SQL Server 2005.

Microsoft SQL Server 2005

Большинство приложений баз данных со временем разрастаются, становятся более сложными и число их пользователей также растет.  Microsoft SQL Server обеспечивает высокую производительность. SQL Server обеспечивает поддержку очень крупных баз данных, размером до одного терабайта.

SQL Server весьма эффективно работает в среде Microsoft Windows NT, обрабатывая запросы параллельно (с использованием естественных потоков команд в пределах одного процесса для обработки запросов пользователя) и снижая до минимума требования к памяти при добавлении пользователей.

Приложение Microsoft SQL Server с самого начала разрабатывалось как база данных в архитектуре клиент/сервер. Данные и индексы располагаются на одном сервере, доступ к которому часто осуществляется через сеть с нескольких клиентских компьютеров. SQL Server снижает загруженность сети, выполняя обработку запросов базы данных на сервере перед отправкой результатов на клиентский компьютер. Таким образом, создаваемые приложения в архитектуре клиент/сервер могут выполнять обработку там, где она выполняется лучше всего — на сервере.

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

Microsoft SQL Server поддерживает огромные транзакции с ведением журнала транзакций, что гарантирует передачу или откат всех изменений, выполняемых в рамках транзакции.

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

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

С помощью Microsoft SQL Server можно выполнять динамическое резервное копирование (добавочное или полное) базы данных во время ее использования. Таким образом, пользователи избавлены от необходимости выходить из базы данных для резервного копирования данных. Это позволяет использовать базу данных 24 часа в сутки, семь дней в неделю.

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

Microsoft Visual Studio 2005(C#.NET)

Специально для платформы .NET Microsoft был разработан новый язык программирования С#. С# — это язык программирования, синтаксис которого очень похож на синтаксис Java (но не идентичен ему). Например, в С# (как в Java) определение класса состоит из одного файла (*.cs), в отличие от C++, где определение класса разбито на заголовок (*.h) и реализацию (*.срр). Однако называть С# клоном Java было бы неверно. Как С#, так и Java основаны на синтаксических конструкциях C++. Если Java во многих отношениях можно назвать очищенной версией C++, то С# можно охарактеризовать как очищенную версию Java.

Синтаксические конструкции С# унаследованы не только от C++, но и от Visual Basic. Например, в С#, как и в Visual Basic, используются свойства классов как C++, С# позволяет производить перегрузку операторов для созданных вами типов (Java не поддерживает ни ту, ни другую возможность). С# — это фактически гибрид разных языков. При этом С# синтаксически не менее (если не более) чист, чем Java, так же прост, как Visual Basic, и обладает практически той же мощью и гибкостью, что и C++. Подводя итоги, еще раз выделим основные особенности С#.

  •  Указатели больше не нужны. В программах на С#, как правило, нет необходимости в работе с ними (однако если вам это потребуется, пожалуйста, — возможности для работы с указателями в вашем распоряжении).
  •  Управление памятью производится автоматически.
  •  В С# предусмотрены встроенные синтаксические конструкции для работы с перечислениями, структурами и свойствами классов.
  •  В С# осталась возможность перегружать операторы, унаследованные от C++. При этом значительная часть возникавших при этом сложностей ликвидирована.
  •  Предусмотрена полная поддержка использования программных интерфейсов. Однако в отличие от классического СОМ применение интерфейсов — это не единственный способ работы с типами, используя различные двоичные модули. .NET позволяет передавать объекты (как ссылки или как значения) через границы программных модулей.
  •  Также предусмотрена полная поддержка аспектно-ориентированных программных технологий (таких как атрибуты). Это позволяет присваивать типам характеристики (что во многом напоминает COM IDL) для описания в будущем поведения данной сущности. Возможно, самое важное, что необходимо сказать про язык С#, — это то, что он генерирует код, предназначенный для выполнения только в среде выполнения .NET. Например, вы не сможете использовать С# для создания классического СОМ-сервера. Согласно терминологии Microsoft код, предназначенный для работы в среде выполнения .NET, — это управляемый код (managed code). Двоичный файл, который содержит управляемый файл, называется сборкой (assembly).

3.1. Требования к техническому обеспечению

Для клиентского приложения:

процессор частотой 600 МГц

операционная система Windows XP или выше

ОЗУ 512 Мб

свободное место на жестком диске 100 Мб для приложения

Для сервера:

процессор частотой 1 ГГц или выше

операционная система Windows Server 2003

ОЗУ 1 Гб


3.2. Требования к программному обеспечению

Для работы программы необходимо, чтобы на компьютере были установлены:

  1.  Операционная система Windows XP, Windows 7, Server 2003
  2.  .NET Framework 2.0
  3.  Установленный и работающий Microsoft SQL Server 2005

4. Методика  разработки программы

Приложение разрабатывалось на основе схемы базы данных приведённой на Рисунке 1 в пункте 2. «Формализация».  

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

4.1.Алгоритмизация задачи

4.1.1 Описание алгоритма

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

  •  Определение входных и выходных данных;
  •  Выбор языка программирования;
  •  Поиск по различным критериям.

В ходе разработки программного продукта были созданы следующие таблицы:

Таблица №1  «Drivers»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDDriver

(ключевое поле)

int

Счетчик

Да

LastName

char(80)

Текст/80

Да

FirstName

char(80)

Текст/80

Да

Patronymic

char(80)

Текст/80

Да

Birthday

datetime

Дата

Да

PassportNumber

char(10)

Текст/10

Да

DrivingLicence

char(10)

Текст/10

Да

IDBus

int

Целое

Да

Таблица №2  «Conductors»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDConductor

(ключевое поле)

int

Счетчик

Да

LastName

char(80)

Текст/80

Да

FirstName

char(80)

Текст/80

Да

Patronymic

char(80)

Текст/80

Да

Birthday

datetime

Дата

Да

PassportNumber

char(10)

Текст/10

Да

Таблица №3  «Buses»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDBus

(ключевое поле)

int

Счетчик

Да

Breand

char(80)

Текст/80

Да

StateNumber

char(10)

Текст/10

Да

Speedometer

int

Целое

Да

Таблица №4  «Route

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDRoute

(ключевое поле)

int

Счетчик

Да

NameRoute

char(80)

Текст/80

Да

Direction

char(200)

Текст/200

Да

Length

int

Целое

Да

Trips

int

Целое

Да

Revenue

money

Целое

Да

Fuel

int

Целое

Да

ExitTime

datetime

Время

Да

ReturnTime

datetime

Время

Да

Таблица №5  «Distance»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDRecord

(ключевое поле)

int

Счетчик

Да

IDBus

int

Целое

Да

Date

datetime

Дата

Да

Distance

int

Целое

Да

Таблица №6  «Revenue»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDRecord

(ключевое поле)

int

Счетчик

Да

IDConductor

int

Целое

Да

Data

datetime

Дата

Да

PlannedRevenue

money

Целое

Да

ActualRevenue

money

Целое

Да

IDRoute

int

Целое

Да

IDDriver

int

Целое

Да

Change

int

Целое

Да

Таблица №7  «WaySheets»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDSheet

(ключевое поле)

int

Счетчик

Да

NumberSheet

char(10)

Текст/10

Да

IDDriver

int

Целое

Да

IDConductor

int

Целое

Да

IDBus

int

Целое

Да

Таблица №8  «WaySheet»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDSheet

(ключевое поле)

int

Счетчик

Да

NumberSheet

char(80)

Текст/80

Да

Date

datetime

Дата

Да

DateDay

char(20)

Текст/20

Да

BrendBus

char(20)

Текст/20

Да

StateNumberBus

char(10)

Текст/10

Да

Driver

char(80)

Текст/80

Да

IDDriver

int

Целое

Да

Conductor

char(80)

Текст/80

Нет

IDConductor

int

Целое

Нет

NameRoute

char(80)

Текст/80

Нет

Change

int

Целое

Нет

ExitInRoute

int

Целое

Нет

Distance

int

Целое

Нет

PlannedTrip

int

Целое

Нет

ActualTrip

int

Целое

Нет

PlannedExit

datetime

Время

Нет

ActualExit

datetime

Время

Нет

PlannedReturn

datetime

Время

Нет

ActualReturn

datetime

Время

Нет

PlannedSpendFuel

int

Целое

Нет

ActualSpendFuel

int

Целое

Нет

Repairs

datetime

Время

Нет

TO2

datetime

Время

Нет

Stopping

datetime

Время

Нет

Reserve

datetime

Время

Нет

SpeedometerExit

int

Целое

Нет

SpeedometerReturn

int

Целое

Нет

PlannedRevenue

money

Целое

Нет

ActualRevenue

money

Целое

Нет

Таблица №8  «WorkedTime»

Имя поля

Тип данных

Формат/размер поля

Обязательное поле

IDRecord

(ключевое поле)

int

Счетчик

Да

IDDriver

int

Целое

Да

WorkedTime

datetime

Время

Да

Date

datetime

Дата

Да

IDBus

int

Целое

Да

IDRoute

int

Целое

Да

PlannedTrip

int

Целое

Да

ActualTrip

int

Целое

Да

Distance

int

Целое

Да

SpendFuel

int

Целое

Да

Change

int

Целое

Да

ExitInRoute

int

Целое

Да

Reserve

datetime

Время

Нет

Stopping

datetime

Время

Нет

Repairs

datetime

Время

Нет

TO2

datetime

Время

Нет

4.1.2 Структурная схема

4.2. Программирование

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

Microsoft Visual Studio 2005(C#.NET).

Тексты программных модулей приведены в пункте V. «Приложение».

4.3. Аномалии и защитное программирование

Описание аномалии

Реакции на аномалию

Способ защиты

Попытка добавить значение NULL

Вывод текстового сообщения без изменения структуры

Защищено программно

Ввод в числовые поля текстовых значений

Запрет ввода текстовых значений в числовые поля

Защищено программно

Ввод в текстовые поля цифровых значений

Запрет ввода цифровых значений в текстовые поля

Защищено программно

Ввод неправильного значения времени (вроде 45:85)

Проверка введённого значения с диапазоном от 00:00 до 23:59. При несоответствии отображение значка ошибки возле текстового поля и передача ему фокуса ввода.

Защищено программно

Ввод несуществующей записи в базе о водителе, кондукторе, автобусе или маршруте

Выбор из списка

Защищено программно


4.4.Тестирование и отладка

Тестирование - процесс многократного выполнения программы с целью выявления ошибок. Отладка – исправление ошибок, найденных с помощью тестирования.

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

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

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

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

5. Анализ результатов решения

В соответствии с  пунктом 4.4 тестирование и отладка производились непосредственно во время разработки проекта. После завершения работы над программой было еще раз произведено полное тестирование.

Все найденные ошибки были успешно устранены.

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

6. Инструкция пользователю

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

Программа позволяет значительно экономить рабочее время сотрудника организации (диспетчера).

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


Запуск программы

Запуск программы осуществляется двойным нажатием левой клавиши мыши на ярлыке программы. После запуска программного продукта на экране появится «Главная форма», которая выглядит следующим образом:

Рис. 2


Описание главного меню программы.

Меню «Справочники»

Рис. 3

Меню «Справочники» существует для быстрого доступа к формам, на которых находится интересующая вас информация.


Справочник №1: Водители

Рис. 4

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

Рис. 5

На форме «Новый водитель» можно добавить данные о новом водителе.

Справочник №2: Автобусы

Рис. 6

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

Рис. 7

На форме «Новый автобус» можно добавить данные о новом автобусе.


Справочник №3: Кондуктора

Рисунок 8

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

Рис. 9

На форме «Новый кондуктор» можно добавить данные о новом кондукторе.

Справочник №4: Маршруты

Рис. 10

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

Рис. 1

На форме «Новый маршрут» можно добавить данные о новом маршруте.

Справочник №5: Отработанное время водителей

Рис. 12

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

Рис. 13

На форме «Поиск» можно выбрать один или несколько критериев для поиска.

Справочник №6: Пробег автобусов

Рис. 14

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

Рис. 15

На форме «Поиск» можно выбрать один или несколько критериев для поиска.

Справочник №7: Пробег автобусов

Рис. 16

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

Рис. 17

На форме «Поиск» можно выбрать один или несколько критериев для поиска.

Справочник №6: Пробег автобусов

Рис. 18

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

Рис. 19

На форме «Поиск» можно выбрать один или несколько критериев для поиска.

Меню «Документы»

Рис. 20

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

Рис. 1

Меню «Отчёты»

Рисунок 10

Отчеты в данном программном приложении созданы при помощи  Reporting Services.

 Reporting Services

Службы SQL Server 2005 Reporting Services (SSRS) представляют собой платформу отчетов на основе сервера, которая обеспечивает комплексное ведение отчетов для данных из реляционных и многомерных источников данных. Службы Reporting Services включают компоненты для разработки: полный набор инструментов, который можно использовать для создания отчетов и управления ими, и API-интерфейс, позволяющий разработчикам выполнять интеграцию и расширение данных, а также обработку отчетов в пользовательских приложениях. Создаваемые отчеты могут основываться на реляционных или многомерных данных SQL Server, служб Analysis Services, Oracle или любого другого поставщика данных Microsoft .NET Framework, такого как ODBC или OLE DB.

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

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

Реестр путёвок водителей

Рис. 0

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

Лист-дохода кондукторов

Рис. 31

В данном отчёте приводится информация о выручки всех кондукторов.

 

Сводный журнал по маркам

Рис. 32

В данном отчёте предоставляется информация об автобусах.

Меню «Помощь»

В этом меню можно посмотреть «Справку» и открыть окно «О программе»

Рис. 4

II. Экономическая часть.

Для того чтобы данный проект был реализован на МП ОПАТП необходимо подсчитать годовой экономический эффект от внедрения программного продукта “Автоматизация учёта работы автотранспортного предприятия”.

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

Распределение трудоемкости по стадиям разработки внедрению проекта приведено   в  таблице №1.

Этап разработки

Характеристика

Трудоёмкость         (час.)

Постановка  задачи

Предпроектное обследование. Разработка, утверждение, технико-экономическое обследование.

11

Составление технического проекта

Уточнение структуры и формы представления входных и выходных данных (алгоритм и структура), Разработка плана мероприятий по проекту. Согласование утверждение технического проекта.

42

Составление рабочего проекта

Написание программы на языке программирования. Первоначальная отладка, тестирование. Разработка согласование и утверждения порядка и методики испытания. Корректировка программы.

87

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

Разработка программной документации. Сдача программы и программной документации.

26

ИТОГО:

166 ч.


Расчет коэффициентов

Коэффициент сложности задачи C - характеризует сложность данной программы по отношению к типовой задаче, сложность которой принята за 1 (величина C лежит в пределах от 0,5 до 1). Так как в данной программе разработаны формы, имеющие в себе наиболее удобный поиск информации, всевозможные отчёты, для данной программы C = 0,8.

Коэффициент P увеличения объёма работ за счёт внесения изменений в алгоритм или программу по результатам уточнения установок. Коэффициент меняется от 0,1 до 0,5. Заказчик четко описал конечный результат, который должен выдаваться данным программным обеспечением, однако некоторые изменения и доработки все же придётся внести. Необходимо принять во внимание, что в данном случае заказчик не имел глубоких компьютерных знаний и не мог изначально объяснить задачу в целом. Это приводило к неоднократным доработкам, модернизациям и корректировке. Лучше всего взять среднее значение коэффициента равное 0,3.

Коэффициент В - коэффициент увеличения затрат труда вследствие недостаточного описания задач. Коэффициент меняется от 1 до 1,5. Так как задача имеет достаточное описание для работы с ней, возьмем коэффициент равный 1.

Коэффициент квалификации разработчика К определяется в зависимости от стажа работы и составляет: для работающих до двух лет – 0,8; от трех лет до пяти лет – 1,0; от пяти до восьми – 1,2; более восьми лет – 1,5. Поскольку стажа работы по специальности у меня нет, возьмем К = 0,8.

Расчет затрат предприятия.

В связи с коэффициентами заработной платы основная заработная плата разработчика программного продукта составит:

З/Посн = оклад * С * (Р+1) * В * К = (9000 руб.  * 0,8 * (0,3 + 1) * 1 *  0,8) = 7488 руб. - в месяц

Поскольку дополнительная заработная плата в виде премии работнику за это время не выплачивалась, то суммарная заработная плата (ЗПсум) будет равна основной заработной плате:

З/Псум = З/Посн = 7488 руб.

Страховые отчисления берутся в размере 34% от основной заработной платы:

Со =  З/Посн * 34%

Со = 7488 руб. * 34% = 2545,92 руб.

Суммарные затраты предприятия на заработную плату разработчика за время разработки программного продукта с учетом страховых отчислений: 

З/Побщ = (ЗПосн + страховые отчисления) * 166 / (8ч * 22дня)  = (7488 + 2545,92) * 166 /( 8 * 22) = 9463,8 руб.

Содержание и эксплуатация вычислительной техники

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

  1.  Стоимость потребляемой электроэнергии
  2.  Амортизационные отчисления
  3.  Техническое обслуживание, или затраты на ремонт

Стоимость 1 КВТ/час электроэнергии составляет 4 руб.

Один компьютер потребляет в среднем 300 Вт в час.

За год отчисления за электроэнергию, потребляемую одной ЭВМ, составляет:

8ч. * 22дня * 12мес. * 0,3КВт/ч. * 4 руб. = 2534,4 руб.

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

Затраты на амортизацию = стоимость ПК/срок полезного использования.

Стоимость компьютера равна 22000руб. Количество лет полезного использования 4 года.

Поскольку компьютер по-прежнему находится в эксплуатации, отчисления составят: 22000 руб. / 4 года = 5500 руб.

Затраты на ремонт ПЭВМ составляют 5% от его стоимости:

22000/100*5 = 1100 руб.

Фвт – действительный фонд времени работы вычислительного комплекса.

Фвт = Фном – Фпроф.

Фном – номинальный фонд работы ПК.

Фпроф – годовые затраты времени на профилактические работы. (5% от  Фном) 

Фном = 8 *22 *12 = 2112 часов в год.

Фпроф = 2112 /100*5 = 106 часов в год.

Фвт = 2112 – 106  = 2006 часов.

Стоимость 1 часа работы ПК = (стоимость электроэнергии в год + стоимость амортизации за год + затраты на ремонт за год) / Фвт.

Стоимость 1 часа работы ПК = (2534,4 + 5500 + 1100)/2006 = 4,6 руб.

Содержание и эксплуатация ПК = Стоимость 1 часа работы ПК * Число часов отладки = 4,6 * 155 = 713 руб.

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

Затраты на разработку и внедрение проекта приведены в таблице №2.

Наименование статьи расходов

Затраты (руб.)

1

Зарплата суммарная исполнителя

7488 руб.

2

Страховые отчисления

2545,92 руб. ≈ 2546 руб. 

3

Затраты на эксплуатацию ПК, используемого для написания программы

713 руб.

Итого:

10034 руб.

Расчет экономического эффекта от разработки и внедрения программного продукта

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

Для ведения расчетов введем следующие обозначения:

Т1- время, затрачиваемое на операции до внедрения программного продукта;

Т2- время, затрачиваемое на операции после внедрения программного продукта.

  1.  До внедрения программы большая часть документации заполнялась вручную. Сотрудник в среднем тратил на 1 операцию около 10 минут. Также на поиск данных вручную  уходило около 10 минут. Общее число операций равно 10.

Т1 = 20мин. или 0,33часа.

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

Т2 = 12мин. или 0,2ч.

t = 20 – 12 = 8мин. или 0,133 часа.

  1.  Рассчитаем стоимость выполняемых работ сотрудника притом, что в месяц он работает 8ч*22дня = 176 часов. Должностной оклад сотрудника автотранспортного предприятия 11000 рублей. Следовательно, стоимость 1 часа работы = 11000/176 = 62,5руб.

Страховые взносы, начисляемы на з/п = 11000*0,34/176 = 21,25 руб.

Определяем суммарные затраты работника с учетом страховых взносов = 62,5 + 21,25 = 83,75 руб. в час – Рсумм.

  1.  Расчет годовой экономии экономического эффекта и срока окупаемости.

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

Т = 0,2 * 10 * 22 * 12 = 528 часа.

Рассчитывается размер годовой экономии от внедрения программного продукта: Т * Рсумм = 528 * 83,75 = 44220 руб.

Экономический эффект составляет величину, равную годовой экономии средств за вычетом затрат на разработку и реализацию программного продукта = 44220 – 10034 = 34186руб.

Расчет срока окупаемости = 10034/44220 = 0,23 года.

Вывод: разработанное и реализованное программное приложение окупится менее, чем за 3 месяца, что является приемлемым в качестве срока окупаемости затрат по автоматизации рабочего процесса.

III. Заключение.

В данном дипломном проекте было разработано программное приложение в среде Microsoft Visual Studio 2005(C#.NET) с использованием базы данных Microsoft SQL Server 2005, которое автоматизирует учет работы автотранспортного предприятия и значительно экономит рабочее время сотрудника организации (диспетчера).

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

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

Срок окупаемости программы составляет 3 месяца.

IV. Литература

  1.  http://msdn.microsoft.com/ru-ru/library/cc879262.aspx - справочник по SQL Server
  2.  http://msdn.microsoft.com/ru-ru/library/dd642420.aspx - справочник по C#.NET
  3.  http://www.sql.ru/forum/actualtopics.aspx?bid=1 – форум по SQL Server
  4.  http://www.sql.ru/forum/actualtopics.aspx?bid=34 – форум по C#.NET
  5.  Бен Форта «Освой самостоятельно SQL. 10 минут на урок», “И.Д.Вильямс” 2010
  6.  Браст Эндрю Дж., Форте С Разработка приложений на основе Microsoft SQL Server 2005.,Microsoft Press, 2012

V. Приложение

SQL- сценарий

USE master

GO

  -----// Создание БД с параметрами по умолчанию //-----

CREATE DATABASE Autotransportation

GO  

USE Autotransportation

GO

  -----// Создание таблиц //-----

CREATE TABLE WaySheets

(

IDSheet int IDENTITY(1,1) PRIMARY KEY,

NumberSheet char(80) NOT NULL,

Date datetime NOT NULL,

IDDriver int NOT NULL,

IDBus int NOT NULL,

IDConductor int NULL

)

GO

CREATE TABLE WaySheet

(

IDSheet int IDENTITY(1,1) PRIMARY KEY,

NumberSheet char(80) NOT NULL,

Date datetime NOT NULL,

DateDay char(20) NOT NULL,

BrendBus char(20) NOT NULL,

StateNumberBus char (10) NOT NULL,

Driver char(80) NOT NULL,

IDDriver int NOT NULL,

Conductor char(80) NULL,

IDConductor int NULL,

NameRoute char(80) NULL,

Change int NULL, 

ExitInRoute int NULL,

Distance int NULL,

PlannedTrip int NULL,

ActualTrip int NULL,

PlannedExit char(5) NULL,

ActualExit char(5) NULL,

PlannedReturn char(5) NULL,

ActualReturn char(5) NULL,

PlannedSpendFuel int NULL,

ActualSpendFuel int NULL,

Repairs char(5) NULL,

TO2 char(5) NULL,

Stopping char(5) NULL,

Reserve char(5) NULL,

SpeedometerExit int NULL,

SpeedometerReturn int NULL,

PlannedRevenue money NULL,

ActualRevenue money NULL  

)

GO

CREATE TABLE Drivers

(

IDDriver int IDENTITY(300,1) PRIMARY KEY,

LastName char(80) NOT NULL,

FirstName char(80) NOT NULL,

Patronymic char(80) NOT NULL,

Birthday datetime NOT NULL,

PassportNumber char(10) NOT NULL,

DrivingLicence char(10) NOT NULL,

IDBus int NOT NULL

)

GO

CREATE TABLE WorkedTime

(

IDRecord int IDENTITY(1,1) PRIMARY KEY,

IDDriver int NOT NULL,

WorkedTime datetime NULL,

Date datetime NOT NULL,

IDConductor int NOT NULL,

IDBus int NOT NULL,

IDRoute int NULL,

PlannedTrip int NULL,

ActualTrip int NULL,

Distance int NULL,

SpendFuel int NULL,

Change int NULL,

ExitInRoute int NULL,

Reserve datetime NULL,

Stopping datetime NULL,

Repairs datetime NULL,

TO2 datetime NULL

)

GO

CREATE TABLE Conductors

(

IDConductor int IDENTITY(200,1) PRIMARY KEY,

LastName char(80) NOT NULL,

FirstName char(80) NOT NULL,

Patronymic char(80) NOT NULL,

Birthday datetime NOT NULL,

PassportNumber char(10) NOT NULL

)

GO

CREATE TABLE Revenue

(

IDRecord int IDENTITY(1,1) PRIMARY KEY,

IDConductor int NOT NULL,

Date datetime NOT NULL,

PlannedRevenue money NOT NULL,

ActualRevenue money NOT NULL,

IDRoute int NOT NULL,

IDDriver int NOT NULL,

IDBus int NOT NULL, 

Change int NOT NULL

)

GO

CREATE TABLE Buses

(

IDBus int IDENTITY(1,1) PRIMARY KEY,

Brend char(80) NOT NULL,

StateNumber char(6) NOT NULL,

Speedometer int NOT NULL

)

GO

CREATE TABLE Distance

(

IDRecord int IDENTITY(1,1) PRIMARY KEY,

IDBus int NOT NULL,

Date datetime NOT NULL,

Distance int NOT NUlL

)

GO

CREATE TABLE Routes

(

IDRoute int IDENTITY(1,1) PRIMARY KEY,

NameRoute char(80) NOT NULL,

Direction char(200) NULL,

Length int NOT NULL,

Trips int NOT NULL,

Revenue money NOT NULL,

Fuel int NOT NULL,

ExitTime datetime NOT NULL,

ReturnTime datetime NOT NULL

)

GO

  -----// Создание представлений //-----

CREATE VIEW SearchDriversView AS

 SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' AS Driver

FROM Drivers

GO

CREATE VIEW SearchConductorView AS

 SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' AS Conductor

FROM Conductors

GO

CREATE VIEW SearchBusView AS

 SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' AS Bus

FROM Buses

GO

CREATE VIEW WaySheetsView AS

 SELECT RTRIM(NumberSheet) AS NumberSheet, Date,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' FROM Drivers WHERE Drivers.IDDriver = WaySheets.IDDriver) AS Driver,

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Buses.IDBus = WaySheets.IDBus) AS Bus,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' FROM Conductors WHERE Conductors.IDConductor = WaySheets.IDConductor) AS Conductor

 FROM WaySheets

GO

CREATE VIEW WaySheets1View AS

 SELECT RTRIM(NumberSheet) AS NumberSheet, Date, IDDriver,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' FROM Drivers WHERE Drivers.IDDriver = WaySheets.IDDriver) AS Driver,

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Buses.IDBus = WaySheets.IDBus) AS Bus,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' FROM Conductors WHERE Conductors.IDConductor = WaySheets.IDConductor) AS Conductor

 FROM WaySheets

GO

CREATE VIEW WaySheetWiew AS

 SELECT RTRIM(NumberSheet) AS NumberSheet, Date, RTRIM(DateDay) AS DateDay, RTRIM(BrendBus) AS BrendBus, StateNumberBus, 

 RTRIM(Driver) AS Driver, IDDriver, RTRIM(Conductor) AS Conductor, IDConductor, RTRIM(NameRoute) AS NameRoute, Change,

 ExitInRoute, Distance, PlannedTrip, ActualTrip, PlannedExit, ActualExit, PlannedReturn, ActualReturn, PlannedSpendFuel,

 ActualSpendFuel, Repairs, TO2, Stopping, Reserve, SpeedometerExit, SpeedometerReturn, PlannedRevenue, ActualRevenue

 FROM WaySheet

GO

CREATE VIEW BusesView AS

 SELECT RTRIM(Brend) AS Brend, RTRIM(StateNumber) AS StateNumber, Speedometer

 FROM Buses

GO

CREATE VIEW ConductorsView AS

 SELECT IDConductor, RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' AS Conductor,

 RTRIM(LastName) AS LastName, RTRIM(FirstName) AS FirstName, RTRIM(Patronymic) AS Patronymic, Birthday,

 SUBSTRING(PassportNumber, 1, 4) + ' ' + SUBSTRING(PassportNumber, 5, 6) AS PassportNumber

 FROM Conductors

GO

CREATE VIEW Conductors1View AS

 SELECT IDConductor, RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' AS Conductor,

 RTRIM(LastName) AS LastName, RTRIM(FirstName) AS FirstName, RTRIM(Patronymic) AS Patronymic, Birthday,

 SUBSTRING(PassportNumber, 1, 4) + ' ' + SUBSTRING(PassportNumber, 5, 6) AS PassportNumber

 FROM Conductors

GO

CREATE VIEW DriversView AS

 SELECT IDDriver, RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' AS Driver,

  RTRIM(LastName) AS LastName, RTRIM(FirstName) AS FirstName, RTRIM(Patronymic) AS Patronymic, Birthday, 

  SUBSTRING(PassportNumber, 1, 4) + ' ' + SUBSTRING(PassportNumber, 5, 6) AS PassportNumber,

  SUBSTRING(DrivingLicence, 1, 4) + ' ' + SUBSTRING(DrivingLicence,5, 6) AS DrivingLicence,  

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Drivers.IDBus = Buses.IDBus) AS Bus

 FROM Drivers

GO

CREATE VIEW Drivers1View AS

 SELECT IDDriver, RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' AS Driver,

  RTRIM(LastName) AS LastName, RTRIM(FirstName) AS FirstName, RTRIM(Patronymic) AS Patronymic, Birthday, 

  SUBSTRING(PassportNumber, 1, 4) + ' ' + SUBSTRING(PassportNumber, 5, 6) AS PassportNumber,

  SUBSTRING(DrivingLicence, 1, 4) + ' ' + SUBSTRING(DrivingLicence,5, 6) AS DrivingLicence,  

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Drivers.IDBus = Buses.IDBus) AS Bus

 FROM Drivers

GO

CREATE VIEW DistanceView AS

 SELECT

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Distance.IDBus = Buses.IDBus) AS Bus, 

 Date, Distance

 FROM Distance

GO

CREATE VIEW RevenueView AS

 SELECT 

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' FROM Conductors WHERE Revenue.IDConductor = Conductors.IDConductor) AS Conductor,

 Date, PlannedRevenue, ActualRevenue,

 (SELECT RTRIM(NameRoute) FROM Routes WHERE Revenue.IDRoute = Routes.IDRoute) AS NameRoute,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' FROM Drivers WHERE Revenue.IDDriver = Drivers.IDDriver) AS Driver,  

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Buses.IDBus = Revenue.IDBus) AS Bus,

 Change

 FROM Revenue

GO

CREATE VIEW Revenue1View AS

 SELECT 

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' FROM Conductors WHERE Revenue.IDConductor = Conductors.IDConductor) AS Conductor,

 Date, PlannedRevenue, ActualRevenue, IDConductor,

 (SELECT RTRIM(NameRoute) FROM Routes WHERE Revenue.IDRoute = Routes.IDRoute) AS NameRoute,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' FROM Drivers WHERE Revenue.IDDriver = Drivers.IDDriver) AS Driver,  

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Buses.IDBus = Revenue.IDBus) AS Bus,

 Change

 FROM Revenue

GO

CREATE VIEW WorkedTimeView AS

 SELECT

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' FROM Drivers WHERE Drivers.IDDriver = WorkedTime.IDDriver) AS Driver,

 WorkedTime, Date,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' FROM Conductors WHERE Conductors.IDConductor = WorkedTime.IDConductor) AS Conductor,

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Buses.IDBus = WorkedTime.IDBus) AS Bus,

 (SELECT RTRIM(NameRoute) FROM Routes WHERE WorkedTime.IDRoute = Routes.IDRoute) AS NameRoute,

 PlannedTrip, ActualTrip, Distance, SpendFuel, Change, ExitInRoute, Reserve, Stopping, Repairs, TO2

 FROM WorkedTime

GO

CREATE VIEW WorkedTime1View AS

 SELECT

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName,1,1) + '.' + SUBSTRING(Patronymic,1,1) + '.' FROM Drivers WHERE Drivers.IDDriver = WorkedTime.IDDriver) AS Driver,

 WorkedTime, Date, IDDriver, IDConductor,

 (SELECT RTRIM(LastName) + ' ' + SUBSTRING(FirstName, 1, 1) + '.' + SUBSTRING(Patronymic, 1, 1) + '.' FROM Conductors WHERE Conductors.IDConductor = WorkedTime.IDConductor) AS Conductor,

 (SELECT RTRIM(Brend) + ' (' + RTRIM(StateNumber) + ')' FROM Buses WHERE Buses.IDBus = WorkedTime.IDBus) AS Bus,

 (SELECT RTRIM(NameRoute) FROM Routes WHERE WorkedTime.IDRoute = Routes.IDRoute) AS NameRoute,

 PlannedTrip, ActualTrip, Distance, SpendFuel, Change, ExitInRoute, Reserve, Stopping, Repairs, TO2

 FROM WorkedTime

GO

CREATE VIEW RoutesView AS

 SELECT RTRIM(NameRoute) AS NameRoute, RTRIM(Direction) AS Direction, Length, Trips, Revenue, Fuel, ExitTime, ReturnTime

 FROM Routes

GO

  -----// Создание хранимых процедур //-----

----- Процедура добавления нового автобуса -----

--Параметры передаваемые хранимой процедуре

CREATE PROCEDURE NewBus @brend char(80), @statenumber char(10), @spedometer int

AS

--Добавление нового товара

 INSERT INTO Buses(Brend, StateNumber, Speedometer)

 VALUES (@brend, @statenumber, @spedometer)

GO

----- Процедура добавления нового водителя -----

--Параметры хранимой процедуры

CREATE PROCEDURE NewDriver  @lastName char(80), @firstName char(80), @patronymic char(80), @birthday datetime, 

      @passportSerial char(4), @passportNumber char(6), @drivingLicenceSerial char(4), @drivingLicenceNumber char(6),

      @brendBus char(80), @stateNumberBus char(10)

AS

--Обьявляем переменую для хранения IDBus

 DECLARE @idBus int

--Получение кода автобуса и присваем IDBus переменой

 SELECT @idBus = (SELECT IDBus FROM Buses WHERE Brend = @brendBus AND StateNumber = @stateNumberBus)

--Обьявляем переменые для хранения PassportNumber и DrivingLicence

 DECLARE @passport char(10)

 DECLARE @drivingLicence char(10)

--Получаем PassportNumber и DrivingLicence и присваиваем переменым

 SELECT @passport = @passportSerial + @passportNumber

 SELECT @drivingLicence = @drivingLicenceSerial + @drivingLicenceNumber

--Теперь добавляем нового водителя

 INSERT INTO Drivers(LastName, FirstName, Patronymic, Birthday, PassportNumber, DrivingLicence, IDBus)

 VALUES (@lastName, @firstName, @patronymic, @birthday, @passport, @drivingLicence, @idBus)  

GO

----- Процедура добавления нового кондуктора -----

--Параметры хранимой процедуры

CREATE PROCEDURE NewConductor @lastName char(80), @firstName char(80), @patronymic char(80), @birthday datetime, 

      @passportSerial char(4), @passportNumber char(6)

AS

--Обьявляем переменую для хранения PassportNumber

 DECLARE @passport char(10)

--Получаем PassportNumber и присваиваем переменой

 SELECT @passport = @passportSerial + @passportNumber

--Добавляем нового кондуктора

 INSERT INTO Conductors (LastName, FirstName, Patronymic, Birthday, PassportNumber)

 VALUES (@lastName, @firstName, @patronymic, @birthday, @passport) 

GO

----- Процедура добавления нового маршрута -----

--Параметры хранимой процедуры

CREATE PROCEDURE NewRoute @nameRoute char(80), @direction char(200), @length int, @trips int

AS

--Добавляем нового маршрута

 INSERT INTO Routes (NameRoute, Direction, Length, Trips)

 VALUES (@nameRoute, @direction, @length, @trips)

GO

----- Процедура удаление водителя -----

--Параметры хранимой процедуры

CREATE PROCEDURE RemoveDriver @number int

AS

-- Удаляем водителя по табельному номеру

DELETE FROM Drivers

WHERE Drivers.IDDriver = @number

GO

----- Процедура удаление кондуктора -----

--Параметры хранимой процедуры

CREATE PROCEDURE RemoveConductor @lastName char(20), @firstName char(20), @patronymic char(30)

AS

-- Объявляем переменную для хранения IDConductor

DECLARE @number int

-- Получаем IDConductor и присваиваем переменой

SELECT @number = (SELECT IDConductor FROM Conductors WHERE Conductors.LastName = @lastName AND

    Conductors.FirstName = @firstName AND Conductors.Patronymic = @patronymic)

-- Удаляем кондуктора по IDConductor

DELETE FROM Conductors

WHERE Conductors.IDConductor = @number

GO

----- Процедура удаление автобуса -----

--Параметры хранимой процедуры

CREATE PROCEDURE RemoveBus @stateNumber char(10)

AS

-- Удаляем автобус по StateNumber(Гос. номеру)

DELETE FROM Buses

WHERE Buses.StateNumber = @stateNumber

GO

----- Процедура удаление маршрута -----

--Параметры хранимой процедуры

CREATE PROCEDURE RemoveRoute @nameRoute char(20)

AS

-- Удаляем маршрут по NameRout(Названию маршрута)

DELETE FROM Routes

WHERE Routes.NameRoute = @nameRoute

GO

---- Процедура добавления путевого листа, если нет простоя ----

--Параметры хранимой процедуры--

CREATE PROCEDURE AddWaySheet @number char(10), @date datetime, @dateDay char(20), @brendBus char(20), @stateNumberBus char(10), @driverName char(20), @driverNumber char(6), @conductorName char(20), @conductorNumber char(6), @nameRoute char(80), @change int, @exitInRoute int, @distance int, @plannedTrip int, @actualTrip int, @plannedExit char(5), @actualExit char(5), @plannedReturn char(5), @actualReturn char(5), @plannedSpendFuel int, @actualSpendFuel int, @reserve char(5), @speedometerExit int, @speedometerReturn int, @plannedRevenue money, @actualRevenue money

AS

-- Объявление переменых для хранения IDDriver, IDConductor, IDBus и IDRoute --

DECLARE @idDriver int

DECLARE @idConductor int

DECLARE @idBus int

DECLARE @idRoute int

-- Обьявление переменых для вычисления отработоного времени --

DECLARE @exit datetime

DECLARE @return datetime

-- Объявление переменой для хранения отработанного времени --

DECLARE @workedTime datetime

-- Присвоение значений переменым --

SELECT @idDriver = CONVERT(int, SUBSTRING(@driverNumber, 3, 3))

SELECT @idConductor = CONVERT(int, SUBSTRING(@conductorNumber, 3, 3))

SELECT @idBus = (SELECT IDBus FROM Buses WHERE Buses.StateNumber = @stateNumberBus)

SELECT @idRoute = (SELECT IDRoute FROM Routes WHERE Routes.NameRoute = @nameRoute)

SELECT @exit = CONVERT(datetime, @actualExit, 108)

SELECT @return = CONVERT(datetime, @actualReturn, 108)

SELECT @workedTime = @return - @exit

-- Добавление записей в таблицу WaySheets --

INSERT INTO WaySheets (NumberSheet, Date, IDDriver, IDBus, IDConductor)

 VALUES ('Путевой лист ' + @number, @date, @idDriver, @idBus, @idConductor)

-- Добавление записей в таблицу WaySheet --

INSERT INTO WaySheet (NumberSheet, Date, DateDay, BrendBus, StateNumberBus, Driver, IDDriver, Conductor, IDConductor, NameRoute, Change,ExitInRoute, Distance, PlannedTrip, ActualTrip, PlannedExit, ActualExit, PlannedReturn, ActualReturn, PlannedSpendFuel, ActualSpendFuel, Reserve, SpeedometerExit, SpeedometerReturn, PlannedRevenue, ActualRevenue)

 VALUES ('Путевой лист ' + @number, @date, @dateDay, @brendBus,@stateNumberBus, @driverName, @idDriver, @conductorName,@idConductor, @nameRoute, @change, @exitInRoute, @distance, @plannedTrip, @actualTrip, @plannedExit, @actualExit, @plannedReturn, @actualReturn, @plannedSpendFuel, @actualSpendFuel, @reserve,speedometerExit,@speedometerReturn,@plannedRevenue, @actualRevenue)

   

-- Добавление записей в таблицу Revenue --      

INSERT INTO Revenue (IDConductor, Date, PlannedRevenue, ActualRevenue, IDRoute, IDDriver, IDBus, Change)

 VALUES (@idConductor, @date, @plannedRevenue, @actualRevenue, @idRoute, @idDriver, @idBus, @change)

-- Добавление Записей в таблицу Distance --

INSERT INTO Distance (IDBus, Date, Distance)

 VALUES (@idBus, @date, @distance)

-- Обновление спидометра в таблийе Buses --

UPDATE Buses

SET Speedometer = @speedometerReturn

WHERE Buses.IDBus = @idBus

-- Проверяется есть ли Резерв --

IF (@reserve = '00:00')

 BEGIN

-- Добавление записей в таблицу WorkedTime --

 INSERT INTO WorkedTime (IDDriver, WorkedTime, Date, IDConductor, IDBus, IDRoute, PlannedTrip, ActualTrip, Distance, SpendFuel, Change,ExitInRoute, Reserve, Stopping, Repairs, TO2)

  VALUES (@idDriver, @workedTime, @date, @idConductor, @idBus, @idRoute, @plannedTrip, @actualTrip, @distance, @actualSpendFuel, @change, @exitInRoute, NULL, NULL, NULL, NULL)

 END

ELSE

 BEGIN

-- Добавление записей в таблицу WorkedTime --

 INSERT INTO WorkedTime (IDDriver, WorkedTime, Date, IDConductor, IDBus, IDRoute, PlannedTrip, ActualTrip, Distance, SpendFuel, Change, ExitInRoute, Reserve, Stopping, Repairs, TO2)

  VALUES (@idDriver, @workedTime, @date, @idConductor, @idBus, @idRoute, @plannedTrip, @actualTrip, @distance, @actualSpendFuel, @change, @exitInRoute, CONVERT(datetime, @reserve, 108), NULL, NULL, NULL)

 END

GO

---- Процедура добавления путевого листа, если есть простой ----

-- Параметры хранимой процедуры --

CREATE PROCEDURE AddWaySheetStopping @number char(10), @date datetime, @dateDay char(20), @brendBus char(20), @stateNumberBus char(10),

        @driverName char(20), @driverNumber char(6), @repairs char(5), @TO2 char(5), @stopping char(5)

AS

-- Обьявление переменх --

DECLARE @idDriver int

DECLARE @idBus int

-- Присвоение значений переменым --

SELECT @idDriver = CONVERT(int, SUBSTRING(@driverNumber, 3, 3))

SELECT @idBus = (SELECT IDBus FROM Buses WHERE Buses.StateNumber = @stateNumberBus)

-- Добавление записей в таблицу WaySheets --

INSERT INTO WaySheets (NumberSheet, Date, IDDriver, IDBus, IDConductor)

 VALUES ('Путевой лист ' + @number, @date, @idDriver, @idBus, NULL)

-- Проверяется был ли Ремонт --

IF (@repairs != '00:00')

 BEGIN

-- Добавление записей в таблицу WorkedTime --

 INSERT INTO WorkedTime (IDDriver, Date, IDBus, Repairs)

  VALUES (@idDriver, @date, @idBus, @repairs)

 END

-- Проверяется было ли ТО2 --

IF (@TO2 != '00:00')

 BEGIN

-- Добавление записей в таблицу WorkedTime --

 INSERT INTO WorkedTime (IDDriver,Date, IDBus, TO2)

  VALUES (@idDriver, @date, @idBus, @TO2)

 END

-- Проверяется был ли Простой --

IF (@stopping != '00:00')

 BEGIN

-- Добавление записей в таблицу WorkedTime --

 INSERT INTO WorkedTime (IDDriver, Date, IDBus, Stopping)

  VALUES (@idDriver, @date, @idBus, @stopping)

END

GO

  -----// Создание функций //-----

---- Функции для получения времени из типа данных datetime в виде 00:00

-- Функция получения часов из типа данных datetime --

CREATE FUNCTION dbo.get_hour (@startTime datetime)

RETURNS int

AS

BEGIN

   DECLARE @hour int

 

 SELECT @hour = DATEPART(hour, @startTime)

 

   RETURN(@hour)

END

GO

-- Функция получения минут из типа данных datetime --

CREATE FUNCTION dbo.get_minute (@startTime datetime)

RETURNS int

AS

BEGIN

   DECLARE @minute int

 

 SELECT @minute = DATEPART(minute, @startTime)

 

   RETURN(@minute)

END

GO

-- Функция возвращяющая время в виде 00:00 типа char(5) --

CREATE FUNCTION dbo.get_time (@hour int, @minute int)

RETURNS char(5)

AS

BEGIN

 DECLARE @computeHour int

 DECLARE @computeMinute int

   DECLARE @hourOFminute int

 DECLARE @time char(5)

 SELECT @hourOFminute = @minute/60

 SELECT @computeMinute = @minute%60

 SELECT @computeHour = @hour + @hourOFminute

 SELECT @time = RTRIM(CONVERT(char, @computeHour)) + ':' + RTRIM(CONVERT(char, @computeMinute))

   RETURN(@time)

END

-- Вызываются данные функции следующим образом:

-- Если не нужно суммировать время, то функцию SUM не следует писать

-- SELECT dbo.get_time(SUM(dbo.get_hour(<Имя_поля_таблицы>)), SUM(dbo.get_minute(<Имя_поля_таблицы>)))

Приложение

Главная форма

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace Autotransportation

{

   public partial class FormMain : Form

   {

       public FormMain()

       {

           InitializeComponent();

           this.IsMdiContainer = true;

       }

       private void driversToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormDrivers)

               {

                   OpenForm = true;

               }

           }  

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormDrivers")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormDrivers FormDrives = new FormDrivers();

               FormDrives.MdiParent = this;

               FormDrivers_AddToolStrip();

               FormDrives.Show();

           }

       }

       private void busesToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormBuses)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormBuses")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormBuses FormBuses = new FormBuses();

               FormBuses.MdiParent = this;

               FormBuses_AddToolStrip();

               FormBuses.Show();

           }

           

       }

       private void conductorsToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormConductors)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormConductors")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormConductors FormConductors = new FormConductors();

               FormConductors.MdiParent = this;

               FormConductors_AddToolStrip();

               FormConductors.Show();

           }

       }

       private void routesToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormRoutes)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormRoutes")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormRoutes FormRoutes = new FormRoutes();

               FormRoutes.MdiParent = this;

               FormRoutes_AddToolStrip();

               FormRoutes.Show();

           }

       }

       private void пробегАвтобусовToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormDistance)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormDistance")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormDistance FormDistance = new FormDistance();

               FormDistance.MdiParent = this;

               FormDistance_AddToolStrip();

               FormDistance.Show();

           }

       }

       private void выручкаКондукторовToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormRevenue)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormRevenue")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormRevenue FormRevenue = new FormRevenue();

               FormRevenue.MdiParent = this;

               FormRevenue_AddToolStrip();

               FormRevenue.Show();

           }

       }

       private void отработанноеВремяВодителейToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormWorkedTime)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormWorkedTime")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormWorkedTime FormWorkedTime = new FormWorkedTime();

               FormWorkedTime.MdiParent = this;

               FormWorkedTime_AddToolStrip();

               FormWorkedTime.Show();

           }

       }

       private void путивыеЛистыToolStripMenuItem_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormWaySheets)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormWaySheets")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormWaySheets FormWaySheets = new FormWaySheets();

               FormWaySheets.MdiParent = this;

               FormWaySheets_AddToolStrip();

               FormWaySheets.Show();

           }

       }

       private void путивойЛистToolStripMenuItem_Click(object sender, EventArgs e)

       {

            bool OpenForm = false;

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormDocument)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormDocument")

                   {

                       index = x;

                   }

               }

               if (MdiChildren[index].Visible == true)

               {

                   this.MdiChildren[index].Activate();

               }

               else

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Normal;

                   this.MdiChildren[index].Visible = true;

               }

           }

           else

           {

               FormDocument FormDocument = new FormDocument();

               FormDocument.MdiParent = this;

               FormDocument_AddToolStrip();

               FormDocument.Show();

           }

       }

       public void FormDrivers_AddToolStrip()

       {

           ToolStripButton item = new ToolStripButton();

           FormDrivers FormDrivers = new FormDrivers();

           if (toolStrip1.Items.Count != 0)

           {

               bool haveButton = true;

               foreach (ToolStripButton oldButton in this.toolStrip1.Items)

               {

                   if (oldButton.Name == "toolStrip" + FormDrivers.Name)

                   {

                       haveButton = false;

                       break;

                   }

               }

               if (haveButton)

               {

                   item.Name = "toolStrip" + FormDrivers.Name;

                   item.Text = FormDrivers.Text;

                   item.Image = FormDrivers.Icon.ToBitmap();

                   item.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;

                   item.CheckState = CheckState.Indeterminate;

                   item.Click += new EventHandler(toolStripFormDrives_Click);

                   toolStrip1.Items.Add(item);

               }

           }

           else

           {

               item.Name = "toolStrip" + FormDrivers.Name;

               item.Text = FormDrivers.Text;

               item.Image = FormDrivers.Icon.ToBitmap();

               item.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;

               item.CheckState = CheckState.Indeterminate;

               item.Click += new EventHandler(toolStripFormDrives_Click);

               toolStrip1.Items.Add(item);

           }

       }

       void toolStripFormDrives_Click(object sender, EventArgs e)

       {

           bool OpenForm = false;

           foreach (Form Child in this.MdiChildren)

           {

               if (Child is FormDrivers)

               {

                   OpenForm = true;

               }

           }

           if (OpenForm)

           {

               int index = 0;

               for (int x = 0; x < this.MdiChildren.Length; x++)

               {

                   if (MdiChildren[x].Name == "FormDrivers")

                   {

                       index = x;

                   }

               }

               if (this.ActiveMdiChild == this.MdiChildren[index])

               {

                   this.MdiChildren[index].WindowState = FormWindowState.Minimized;

               }

               else

               {

                   if (MdiChildren[index].Visible == true)

                   {

                       this.MdiChildren[index].Activate();

                   }

                   else

                   {

                       this.MdiChildren[index].WindowState = FormWindowState.Normal;

                       this.MdiChildren[index].Visible = true;

                   }

               }

           }       

       }

       public void FormDrivers_RemoveToolStrip()

       {

           FormDrivers FormDrives = new FormDrivers();

           for (int x = 0; x < toolStrip1.Items.Count; x++)

           {

               if (toolStrip1.Items[x].Name == "toolStrip" + FormDrives.Name)

               {

                   toolStrip1.Items.RemoveAt(x);

               }

           }

       }

       public void FormBuses_AddToolStrip()

       {

           ToolStripButton item = new ToolStripButton();

           FormBuses FormBuses = new FormBuses();

           if (toolStrip1.Items.Count != 0)

           {

               bool haveButton = true;

               foreach (ToolStripButton oldButton in this.toolStrip1.Items)

               {

                   if (oldButton.Name == "toolStrip" + FormBuses.Name)

                   {

                       haveButton = false;

                       break;

                   }

               }

               if (haveButton)

               {

                       item.Name = "toolStrip" + FormBuses.Name;

                       item.Text = FormBuses.Text;