Таблица 11 - Дежурные
Номер
| Информация
| Тип данных
|
1
| Код дежурного
| Числовой
|
2
| Сектор
| Строковый
|
3
| Логин
| Строковый
|
4
| Пароль
| Строковый
|
Первые четыре таблицы и последняя «Дежурные» относительно небольшие, и информация в них меняется сравнительно редко. Такого рода таблицы, содержащие условно-постоянную информацию, обычно называются справочными.
Таблица «Парковочные места» небольшая, но информация в данной таблице меняется часто, поскольку отображает статус занятости парковочного места в соответствии с журналом регистрации.
Две других таблицы очень обширны и постоянно дополняются новыми записями, поскольку процессы постановки и оказания услуг идут постоянно. Данные в них основываются на справочных таблицах.
Все таблицы связаны между собой в следующую схему данных – рис. 8.
Рисунок 8 – Схема данных БД
3. 3. Описание проектных решенийДля того, чтобы обеспечить правильный расчет необходимо автоматизировать выбор тарифа, подсчет часов парковки и суммы к оплате самой информационной системой, а не дежурным. Поэтому в журнале регистрации от дежурного требуется ввести только дату въезда и выезда автомобилем, занятое парковочное место и код клиента. Дополнительно следует отразить наличие дополнительных услуг и указание о несвоевременном выезде для подсчета штрафа.
При вводе необходимых данных в журнал регистрации система берет из базы данных сведения о клиенте и его автомобиле, а также информацию о стоимости тарифов и штрафов.
Подсчет количества часов на парковке осуществляется с помощью функции в SQL «DATEDIFF», как часовая разница между датами выезда и въезда. Результат округляется для упрощения расчета по суточному тарифу (см. рис. 9).
Рисунок 9 – Подсчет количества часов для определения тарифа
Если значения для даты выезда нет, значит парковка на данный момент активна
, и количество часов будет определено, как клиент покинет автостоянку, это позволяет определить занятые на данный момент парковочные места.
Так как системой предусмотрены смешанные тарифы и тарифы, зависящие от времени суток парковки автомобиля, вычисляется время суток на момент въезда и выезда с помощью функции DATEPART и проверяется соответствие диапазону проверки: между 8-ю и 19-ю часами – для дневного времени парковки, между 20-ю часами и 7-ю часами утра – для ночного времени парковки.
Для определения тарифа в таблице базы данных используются 5 разных условий:
-
Если количество часов превышает, либо равно 24, следовательно в соответствии со справочником тарифов присваивается значение «1» - суточный тариф с ценой за сутки – 1 000 руб.
-
Если количество часов превышает 12, но менее суток, то предусмотрен тариф «5» - 65 рублей за час.
-
Если парковка занимает меньшее количество часов, а время суток в течение парковки остается неизменным (день-день/ночь-ночь), то выбирается тариф «2» с оплатой 80 в час и «3» с оплатой 60 в час для дневного и ночного тарифов соответственно.
-
В случае смены времени суток в течение парковки автомобиля выбирается смешанный тариф, который основан на оплате дневных часов как за дневной тариф, а ночных часов – как за ночной.
На листинге 9 представлена реализация определения тарифа в триггере для автоматического изменения таблицы после ввода или изменения данных в журнале регистрации.
Листинг 9 – Определение тарифа в журнале регистрации
Расчет оплаты меняется в зависимости от выбранного тарифа.
При суточном тарифе количество часов парковки делится на 24, и полученное значение умножается на сумму тарифа.
При тарифе свыше 12 часов сумма рассчитывается произведением стоимости тарифа на количество часов. Аналогично рассчитывается сумма к оплате для дневного и ночного тарифов.
Для смешанного тарифа расчет самый сложный. Для него проверяется значение не только тарифа, но также и времени суток на начало и на конец парковки. Если время суток на начало – день, а на конец парковки – ночь, то подсчет осуществляется следующим образом:
-
Для подсчета суммы для часов, проведенных в дневное время, из 20 вычитается час въезда, и полученное значение умножается на ставку тарифа ДЕНЬ.
-
Для подсчета суммы для часов, проведенных в ночное время, из 8 вычитается час выезда, полученное значение помещается в модуль, которое показывает, сколько времени до 8 часов остается после окончания парковки. Затем из 12 вычитаем полученное число, чтобы понять, сколько именно часов в ночное время заняла парковка, и умножаем на ставку тарифа НОЧЬ.
-
Результаты расчетов складываются, и формируется общая сумма к оплате.
Если время суток на начало – ночь, а на конец парковки – день, то подсчет осуществляется следующим образом:
-
Для подсчета суммы для часов, проведенных в ночное время, из 20 вычитается час выезда, полученное значение помещается в модуль, которое показывает, сколько времени прошло после 20 на момент парковки. Затем из 12 вычитаем полученное число, чтобы понять, сколько именно часов в ночное время заняла парковка, и умножаем на ставку тарифа НОЧЬ.
-
Для подсчета суммы для часов, проведенных в дневное время, из 8 вычитается час въезда, и полученное значение, помещенное в модуль, умножается на ставку тарифа ДЕНЬ.
-
Результаты расчетов складываются, и формируется общая сумма к оплате.
На листинге 10 приведена реализация расчета суммы к оплате в триггере для автоматического изменения таблицы после ввода или изменения данных в журнале регистрации.
Листинг 10 – Расчет суммы к оплате в журнале регистрации
Поскольку в представлении журнала необходимо получить наглядную информацию о клиенте и гос. номере его автомобиля в триггере также предусмотрен подхват необходимых данных из таблиц «Клиенты» и «Автомобили» и их помещение в журнал регистрации (см. рис. 11).
Листинг 11 – Получение информации о клиенте и его автомобиле с помещением их в журнал регистрации
В модуле учета оказанных услуг идентично журналу регистрации при вводе данных подхватываются данные из таблиц базы данных (см. листинг 12).
Интересным здесь является расчет для услуги «Тент-чехол», для которой предусмотрена почасовая оплата. Поэтому при расчете для данной услуги используется условие:
-
Если значение столбца «Код услуги» не равно 3, следовательно сумма к оплате ставится в соответствии со столбцом «Цена» без изменений, поскольку для всех услуг, кроме «Тент-чехла» оплата является единовременной.
-
Если значение столбца «Код услуги» равно 3, следовательно сумма к оплате рассчитывается с использованием вложенного запроса для вывода данных о часах при условии соответствия значений для столбцов «Автомобиль» и «Дата въезда», умноженных на значения в столбце «Цена».
Листинг 12 – Заполнение данных в журнале услуг
Результат подсчета для услуги «Тент-чехол» с подхватом количества часов из журнала регистрации представлен на листинге 13.
Листинг 13– Расчет вычисления суммы для услуги «Тент-чехол»
Учет состояния парковочного места зависит от сектора, в котором это место находится. В секторе A машиноместа предназначены для клиентов без абонемента, и их учет ведется по журналу регистрации. А в секторе B парковочные места предназначены для клиентов с купленными абонементами, и их учет ведется в соответствии с модулем учета оказанных услуг.
В случае с журналом регистрации, как упоминалось выше, учет занятых парковочных мест в секторе A не сложен, достаточно обратить внимание на значение в столбце «Дата выезда». Однако возникает проблема с подхватом даты въезда для соответствующего парковочного места, ведь группирование по парковочному месту с определением даты реализовать не получится. Для решения проблемы были созданы два представления, в первом отображается информация о занятых парковочных местах, а во втором – информация о последней дате въезда для каждого места с использованием агрегатной функции MAX. Созданные представления представлены на рисунке 10.
Рисунок 10 – Представления с информацией о дате въезда для учета занятости парковочных мест в секторе A
После этого в триггере с помощью объединения таблиц проверяется, занято ли место и в случае истинности статус парковочного места в таблице «Парковочные места» изменяется на «Занято», иначе – на «Свободно» (см. листинг 14).
Листинг 14 – Изменение статуса парковочного места в журнале регистрации
В случае с сектором B необходимо условие для проверки кода услуги «Абонемент», и в случае истинности – подсчет количества часов с момента покупки абонемента с использованием текущей даты для проверки действительности абонемента: для месячного количество дней с момента покупки не должно превышать 30, а для годового – 365. Для сокращения записей в теле триггера было создано представление к таблице «Оказанные услуги» с запросом, представляющим информацию о действующих абонементах (см. рис. 11).
Рисунок 11 – Представление с действующими абонементами для учета занятости парковочных мест в секторе B
Затем уже в триггере с помощью объединения таблиц проверяется, забронировано ли место и в случае истинности статус парковочного места в таблице «Парковочные места» изменяется на «Бронь», иначе – на «Свободно» (см. листинг 15).
Листинг 15 – Изменение статуса парковочного места в журнале услуг
3. 4. Описание интерфейсаРабота по созданию представления информационной системы начинается с создания проекта WindowsForms на языке C#. Каждый запланированный компонент ИС располагается на отдельной форме: "Авторизация", "Меню", "Тарифы и услуги", "Клиенты", "Автомобили", "Парковочные места", "Журнал регистрации", "Оказанные услуги".
Общий код программы и всех форм проекта приложен к курсовой работе.
Для авторизации и загрузки данных необходимо подключение к базе данных поэтому в качестве источника данных указывается база данных PP, работа с которой была описана в предыдущих подразделах (см. рис. 12). Для использования авторизации в созданном классе DB.cs прописывается строка подключения к ней и методы для учета состояния подключения. Класс для подключения к базе данных приведен в листинге 16.
Рисунок 12 – Подключение базы данных
Листинг 16 – Класс для работы с базой данных
За авторизацию отвечает форма «LoginForm». В конструкторе данной формы располагаются такие элементы управления, как TextBox - для ввода логина, TextBox - для ввода пароля, Label - для заголовка и для комментариев, Button – для входа, Button – для закрытия приложения.
В методе, присвоенном для кнопки входа в систему, прописывается условие соответствия введенного пользователем логина и пароля хранящимся данным в базе данных, и если условие истинное, то пользователю открывается доступ в систему, иначе система выдает уведомление о том, что логин или пароль были введены неверно (см. листинг 17).