Файл: Технология клиент-сервер (Описание клиент-серверной технологии).pdf
Добавлен: 28.06.2023
Просмотров: 138
Скачиваний: 3
,Полицейский.ФИО AS [Выписал]
,Нарушение.Название AS [Нарушение]
,Штраф.Выписан AS [Дата выписки]
,Штраф.Сумма AS [Сумма]
FROM Штраф
INNER JOIN ПТС ON ПТС.Код=Штраф.ПТС
INNER JOIN Владелец ON Владелец.Код=ПТС.Владелец
INNER JOIN Автомобиль ON Автомобиль.Код=ПТС.Автомобиль
INNER JOIN Марка ON Марка.Код=Автомобиль.Марка
INNER JOIN Модель ON Модель.Код=Автомобиль.Модель
INNER JOIN Полицейский ON Полицейский.Код=Штраф.Полицейский
INNER JOIN Нарушение ON Нарушение.Код=Штраф.Нарушение
WHERE (ISNULL(Штраф.Аннулирован,0)=0) AND (ISNULL(Штраф.Оплачен,0)=0) AND (Автомобиль.Номер LIKE '')».
Для формирования списка всех неоплаченных штрафов разработан следующий запрос:
«Select
Штраф.Код
,Владелец.ФИО AS [Владелец]
,Автомобиль.Номер+' '+Марка.Название+' '+Модель.Название AS [Автомобиль]
,Полицейский.ФИО AS [Выписал]
,Нарушение.Название AS [Нарушение]
,Штраф.Выписан AS [Дата выписки]
,Штраф.Сумма AS [Сумма]
FROM Штраф
INNER JOIN ПТС ON ПТС.Код=Штраф.ПТС
INNER JOIN Владелец ON Владелец.Код=ПТС.Владелец
INNER JOIN Автомобиль ON Автомобиль.Код=ПТС.Автомобиль
INNER JOIN Марка ON Марка.Код=Автомобиль.Марка
INNER JOIN Модель ON Модель.Код=Автомобиль.Модель
INNER JOIN Полицейский ON Полицейский.Код=Штраф.Полицейский
INNER JOIN Нарушение ON Нарушение.Код=Штраф.Нарушение
WHERE (ISNULL(Штраф.Аннулирован,0)=0) AND (ISNULL(Штраф.Оплачен,0)=0)».
Была разработана хранимая процедура для проверки штрафов по следующему принципу: штраф не оплачен более 2 месяцев, владелец транспортного средства попадает в чёрный список; штрафу более 3 лет, он аннулируется. Код процедуры представлен ниже:
«CREATE PROCEDURE [dbo].[PR_CHECK_PAY]
AS
BEGIN
DECLARE @dt datetime
SET @dt = GETDATE()
UPDATE Штраф
SET Аннулирован = 1
WHERE DateDiff(YY,Выписан,@dt)>=3 AND (ISNULL(Оплачен,0)=0)
UPDATE Владелец
SET Владелец.ЧС = (CASE WHEN (isNULL(Штраф.Оплачен,0)=0) AND (isNULL(Штраф.Аннулирован,0)=0) AND (DateDiff(MM,Выписан,@dt)>=2) THEN 1 ELSE 0 END)
FROM Владелец
INNER JOIN ПТС ON ПТС.Владелец = Владелец.Код
INNER JOIN Штраф ON Штраф.ПТС = ПТС.Код
END».
Рассмотрим структуру ИС учёта штрафов ГИБДД. На рисунке 3.3 представлена схема взаимодействия программных модулей системы.
Рис. 3.3. Структура программных модулей
Система состоит из 10 программных модулей, описание которых представлено в таблице 3.1.
Таблица 3.1
Описание программных модулей
Модуль |
Описание |
uLogin |
Авторизация в системе |
uMain |
Главный модуль, для ведения списков штрафов, пример кода приведён в приложении |
uOwner |
Модуль обработки карт владельцев |
uPTS |
Модуль обработки ПТС |
uAuto |
Модуль обработки карт автотранспорта |
uPoliceman |
Модуль обработки карт полицейских |
uMarkModel |
Модуль обработки справочника марок и списка моделей |
uModel |
Модуль обработки справочника моделей |
uFine |
Модуль обработки штрафа |
uLibrary |
Модуль ведения справочной информации |
uDM |
Модуль доступа к данным |
Разработанная система позволяет работать в многопользовательском режиме с разными профилями пользователей.
Рассмотрим работу инспектора в ИС. Работа в ИС учёта штрафов ГИБДД начинается с главного окна, пример которого представлен на рисунке 3.4. При выборе типа поиска данных появляются поля для ввода данных поиска: ФИО владельца или номер автотранспорта (рис. 3.5).
Рис. 3.4. Главное окно
Рис. 3.5. Смена типа поиска
Для редактирования карт автотранспорта требуется в главном меню выбрать пункт «Основное» - «Автотранспорт». Откроется окно, изображённое на рисунке 3.6.
Рис. 3.6. Окно «Автотранспорт»
Для редактирования карт владельцев требуется в главном меню выбрать пункт «Основное» - «Владелец». Откроется окно, изображённое на рисунке 3.7.
Рис. 3.7. Окно «Владельцы»
Для редактирования ПТС нужно вызвать контекстное меню таблицы ПТС и выбрать соответствующий пункт – рисунок 3.8.
Рис. 3.8. Окно «ПТС»
Для редактирования карт полицейских требуется в главном меню выбрать пункт «Основное» - «Полицейские». Откроется окно, изображённое на рисунке 3.9.
Рис. 3.9. Окно «Полицейские»
Для редактирования справочников требуется выбрать пункт меню «Справочники» и выбрать требуемый тип справочника, пример редактирования справочника «Модели и марки» представлен на рисунке 3.10.
Рис. 3.10. Окно справочника «Марки и модели»
Для добавления штрафа требуется в главном окне вызвать контекстное меню таблицы и выбрать пункт «Добавить». Появится окно, представленное на рисунке 3.11.
Рис. 3.11. Окно «Штраф»
Пункт меню «Основное» - «Проверка штрафов» - проверяем штрафы по датам: если штраф не оплачен более 2 месяцев, то владелец попадает в чёрный список. Если штрафу уже 3 года, то он аннулируется.
Заключение
Цель работы изучить и применить на практике технологию клиент-сервер. В первой главе был проведён анализ теории клиент-серверной технологии.
Во второй главе была произведена постановка задачи, описаны функции системы учёта штрафов ГИБДД:
- учёт автотранспорта;
- учёт владельцев;
- ведение ПТС;
- учёт полицейских;
- ведение штрафов.
Разработана концептуальная модель работы в ИС учёта штрафов ГИБДД. Рассмотрены входные, выходные, управляющие потоки. Построена модель декомпозиции. Более подробно рассмотрен процесс учёта владельцев и автотранспорта.
Была спроектирована база данных, которая состоит из следующих таблиц:
- владелец;
- автомобиль;
- ПТС;
- полицейский;
- штраф;
- марка;
- модель;
- категорияТС;
- кузов;
- цвет;
- звание;
- должность;
- подразделение;
- нарушение;
- пользователь.
В третьей главе были построены сценарий диалога и дерево функций. Были разработаны запросы для формирования выходных списков штрафов.
Была рассмотрена модульная структура ИС учёта штрафов ГИБДД. Описан каждый программный модуль.
В конце, приведён пример работы в ИС учёта штрафов ГИБДД.
Список литературы
- Бритов Г., Осипова Т. Моделирование бизнес-процессов. /Бритов Г., Осипова Т. - М.: LAP, 2014. – 124 с.
- Грекул В.И., Денищенко Г.Н., Коровкина Н.Л. Проектирование информационных систем. - М.: Интуит, 2014. 240с.
- Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. - СПб.: Питер, 2015. – 368 с.
- Грофф Д., Вайнберг П., Оппель Э. SQL. Полное руководство. - СПб.: Вильямс, 214. - 960с.
- Илюшечкин В. Основы использования и проектирования баз данных. Учебник. - М.:Юрайт, 2014. - 214с.
- Коваленко В. Проектирование информационных систем. / Коваленко В. - М.: Форум, 2012. - 320с.
- Кузнецов С. Базы данных. - М.: Academia, 2012. - 496с.
- Основы использования и проектирования баз данных. Учебник / Илюшечкин В. - М.: Юрайт, 2014. - 214с.
- Осипов Д. Delphi. Программирование для Windows, OS X, iOS и Android. - СПб.: БХВ-Петербург, 2016. - 310с.
Исходный код модуля «uMain»
unit uMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
Vcl.Menus, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TfrmMain = class(TForm)
mm: TMainMenu;
imMain: TMenuItem;
imAuto: TMenuItem;
imOwner: TMenuItem;
imPoliceman: TMenuItem;
N1: TMenuItem;
imClose: TMenuItem;
imLibrary: TMenuItem;
imLibrary1: TMenuItem;
imLibrary2: TMenuItem;
imLibrary3: TMenuItem;
imSettings: TMenuItem;
imLinking: TMenuItem;
pnlSerach: TPanel;
pnlGrid: TPanel;
lblOwner: TLabel;
rgTypeSearch: TRadioGroup;
lblAuto: TLabel;
edtOwner: TEdit;
edtAuto: TEdit;
btnSearch: TButton;
pm: TPopupMenu;
grdMain: TDBGrid;
imAdd: TMenuItem;
imDelete: TMenuItem;
N4: TMenuItem;
imPay: TMenuItem;
imCancel: TMenuItem;
imLibrary4: TMenuItem;
imLibrary5: TMenuItem;
imLibrary6: TMenuItem;
imLibrary7: TMenuItem;
imLibrary8: TMenuItem;
N2: TMenuItem;
imCheckFine: TMenuItem;
procedure FormShow(Sender: TObject);
//Всплывающие меню
procedure pmMainPopup(Sender: TObject);
procedure btnSearchClick(Sender: TObject);
procedure rgTypeSearchClick(Sender: TObject);
procedure imLinkingClick(Sender: TObject);
procedure imAutoClick(Sender: TObject);
procedure imOwnerClick(Sender: TObject);
procedure imPolicemanClick(Sender: TObject);
procedure imLibrary1Click(Sender: TObject);
procedure imLibraryClick(Sender: TObject);
procedure imAddClick(Sender: TObject);
procedure imDeleteClick(Sender: TObject);
procedure imPayClick(Sender: TObject);
procedure imCancelClick(Sender: TObject);
procedure imCheckFineClick(Sender: TObject);
private
procedure ViewFilter(i: integer);
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
uses
uDM, uMarkModel, uOwner, uPoliceman, uAuto, uLibrary, uFine;
procedure TfrmMain.btnSearchClick(Sender: TObject);
begin
DM.qryFine.Close;
DM.qryFine.SQL.Clear;
case rgTypeSearch.ItemIndex of
0: begin
DM.qryFine.SQL.Add('Select Штраф.Код ,Владелец.ФИО AS [Владелец] ,Автомобиль.Номер+'' ''+Марка.Название+'' ''+Модель.Название AS [Автомобиль]');
DM.qryFine.SQL.Add(',Полицейский.ФИО AS [Выписал],Нарушение.Название AS [Нарушение],Штраф.Выписан AS [Дата выписки],Штраф.Сумма AS [Сумма]');
DM.qryFine.SQL.Add('FROM Штраф INNER JOIN ПТС ON ПТС.Код=Штраф.ПТС INNER JOIN Владелец ON Владелец.Код=ПТС.Владелец');
DM.qryFine.SQL.Add('INNER JOIN Автомобиль ON Автомобиль.Код=ПТС.Автомобиль INNER JOIN Марка ON Марка.Код=Автомобиль.Марка');
DM.qryFine.SQL.Add('INNER JOIN Модель ON Модель.Код=Автомобиль.Модель INNER JOIN Полицейский ON Полицейский.Код=Штраф.Полицейский');
DM.qryFine.SQL.Add('INNER JOIN Нарушение ON Нарушение.Код=Штраф.Нарушение');
DM.qryFine.SQL.Add('WHERE (ISNULL(Штраф.Аннулирован,0)=0) AND (ISNULL(Штраф.Оплачен,0)=0) AND (Владелец.ФИО LIKE '''+edtOwner.Text+''')');
end;
1: begin
DM.qryFine.SQL.Add('Select Штраф.Код ,Владелец.ФИО AS [Владелец] ,Автомобиль.Номер+'' ''+Марка.Название+'' ''+Модель.Название AS [Автомобиль]');
DM.qryFine.SQL.Add(',Полицейский.ФИО AS [Выписал],Нарушение.Название AS [Нарушение],Штраф.Выписан AS [Дата выписки],Штраф.Сумма AS [Сумма]');
DM.qryFine.SQL.Add('FROM Штраф INNER JOIN ПТС ON ПТС.Код=Штраф.ПТС INNER JOIN Владелец ON Владелец.Код=ПТС.Владелец');
DM.qryFine.SQL.Add('INNER JOIN Автомобиль ON Автомобиль.Код=ПТС.Автомобиль INNER JOIN Марка ON Марка.Код=Автомобиль.Марка');
DM.qryFine.SQL.Add('INNER JOIN Модель ON Модель.Код=Автомобиль.Модель INNER JOIN Полицейский ON Полицейский.Код=Штраф.Полицейский');
DM.qryFine.SQL.Add('INNER JOIN Нарушение ON Нарушение.Код=Штраф.Нарушение');
DM.qryFine.SQL.Add('WHERE (ISNULL(Штраф.Аннулирован,0)=0) AND (ISNULL(Штраф.Оплачен,0)=0) AND (Автомобиль.Номер LIKE '''+edtAuto.Text+''')');
end;
2: begin
DM.qryFine.SQL.Add('Select Штраф.Код ,Владелец.ФИО AS [Владелец] ,Автомобиль.Номер+'' ''+Марка.Название+'' ''+Модель.Название AS [Автомобиль]');
DM.qryFine.SQL.Add(',Полицейский.ФИО AS [Выписал],Нарушение.Название AS [Нарушение],Штраф.Выписан AS [Дата выписки],Штраф.Сумма AS [Сумма]');
DM.qryFine.SQL.Add('FROM Штраф INNER JOIN ПТС ON ПТС.Код=Штраф.ПТС INNER JOIN Владелец ON Владелец.Код=ПТС.Владелец');
DM.qryFine.SQL.Add('INNER JOIN Автомобиль ON Автомобиль.Код=ПТС.Автомобиль INNER JOIN Марка ON Марка.Код=Автомобиль.Марка');
DM.qryFine.SQL.Add('INNER JOIN Модель ON Модель.Код=Автомобиль.Модель INNER JOIN Полицейский ON Полицейский.Код=Штраф.Полицейский');
DM.qryFine.SQL.Add('INNER JOIN Нарушение ON Нарушение.Код=Штраф.Нарушение');
DM.qryFine.SQL.Add('WHERE (ISNULL(Штраф.Аннулирован,0)=0) AND (ISNULL(Штраф.Оплачен,0)=0)');
end;
end;
DM.qryFine.Open;
end;
//Всплывающие меню
procedure TfrmMain.pmMainPopup(Sender: TObject);
begin
imDelete.Visible:=grdMain.DataSource.DataSet.RecordCount>0;
imPay.Visible:=grdMain.DataSource.DataSet.RecordCount>0;
imCancel.Visible:=grdMain.DataSource.DataSet.RecordCount>0;
end;
procedure TfrmMain.rgTypeSearchClick(Sender: TObject);
begin
ViewFilter(rgTypeSearch.ItemIndex);
end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
rgTypeSearch.ItemIndex:=2;
ViewFilter(rgTypeSearch.ItemIndex);
btnSearch.Click;
end;
procedure TfrmMain.imAddClick(Sender: TObject);
var
frm: TfrmFine;
begin
Application.CreateForm(TfrmFine, frm);
DM.tblFine.Append;
frm.ShowModal;
if frm.ModalResult=mrOk then DM.qryFine.Requery;
end;
procedure TfrmMain.imAutoClick(Sender: TObject);
var
frm: TfrmAuto;
begin
Application.CreateForm(TfrmAuto, frm);
frm.ShowModal;
end;
procedure TfrmMain.imCancelClick(Sender: TObject);
begin
if MessageDlg('Вы действительно хотите аннулировать штраф?',mtWarning,mbOkCancel,0)=mrOk then begin
DM.tblFine.Filtered:=false;
DM.tblFine.Filter:='Код='+DM.qryFine.FieldByName('Код').AsString;
DM.tblFine.Filtered:=true;
DM.tblFine.Edit;
DM.tblFine.FieldByName('Аннулирован').AsInteger:=0;
DM.tblFine.Post;
DM.tblFine.Filtered:=false;
DM.tblFine.Filter:='';
DM.qryFine.Requery;
end;
end;
procedure TfrmMain.imCheckFineClick(Sender: TObject);
begin
DM.CheckFine;
end;
procedure TfrmMain.imDeleteClick(Sender: TObject);
begin
if MessageDlg('Вы действительно хотите удалить запись?',mtWarning,mbOkCancel,0)=mrOk then begin
DM.tblFine.Filtered:=false;
DM.tblFine.Filter:='Код='+DM.qryFine.FieldByName('Код').AsString;
DM.tblFine.Filtered:=true;
DM.tblFine.Delete;
DM.tblFine.Filtered:=false;
DM.tblFine.Filter:='';
DM.qryFine.Requery;
end;
end;
procedure TfrmMain.imLibrary1Click(Sender: TObject);
var
frm: TfrmMarkModel;
begin
Application.CreateForm(TfrmMarkModel, frm);
frm.ShowModal;
end;
procedure TfrmMain.imLibraryClick(Sender: TObject);
var
frm: TfrmLibrary;
begin
Application.CreateForm(TfrmLibrary, frm);
frm.LoadLibrary((Sender as TMenuItem).Tag);
frm.ShowModal;
frm.Free;
end;
procedure TfrmMain.imLinkingClick(Sender: TObject);
begin
DM.SettingLink;
end;
procedure TfrmMain.imOwnerClick(Sender: TObject);
var
frm: TfrmOwner;
begin
Application.CreateForm(TfrmOwner, frm);
frm.ShowModal;
end;
procedure TfrmMain.imPayClick(Sender: TObject);
begin
if MessageDlg('Вы действительно хотите поставить отметку об оплате?',mtWarning,mbOkCancel,0)=mrOk then begin
DM.tblFine.Filtered:=false;
DM.tblFine.Filter:='Код='+DM.qryFine.FieldByName('Код').AsString;