Файл: Технология клиент-сервер (Описание клиент-серверной технологии).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.06.2023

Просмотров: 135

Скачиваний: 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 года, то он аннулируется.

Заключение

Цель работы изучить и применить на практике технологию клиент-сервер. В первой главе был проведён анализ теории клиент-серверной технологии.

Во второй главе была произведена постановка задачи, описаны функции системы учёта штрафов ГИБДД:


  • учёт автотранспорта;
  • учёт владельцев;
  • ведение ПТС;
  • учёт полицейских;
  • ведение штрафов.

Разработана концептуальная модель работы в ИС учёта штрафов ГИБДД. Рассмотрены входные, выходные, управляющие потоки. Построена модель декомпозиции. Более подробно рассмотрен процесс учёта владельцев и автотранспорта.

Была спроектирована база данных, которая состоит из следующих таблиц:

  • владелец;
  • автомобиль;
  • ПТС;
  • полицейский;
  • штраф;
  • марка;
  • модель;
  • категорияТС;
  • кузов;
  • цвет;
  • звание;
  • должность;
  • подразделение;
  • нарушение;
  • пользователь.

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

Была рассмотрена модульная структура ИС учёта штрафов ГИБДД. Описан каждый программный модуль.

В конце, приведён пример работы в ИС учёта штрафов ГИБДД.

Список литературы

  1. Бритов Г., Осипова Т. Моделирование бизнес-процессов. /Бритов Г., Осипова Т. - М.: LAP, 2014. – 124 с.
  2. Грекул В.И., Денищенко Г.Н., Коровкина Н.Л. Проектирование информационных систем. - М.: Интуит, 2014. 240с.
  3. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. - СПб.: Питер, 2015. – 368 с.
  4. Грофф Д., Вайнберг П., Оппель Э. SQL. Полное руководство. - СПб.: Вильямс, 214. - 960с.
  5. Илюшечкин В. Основы использования и проектирования баз данных. Учебник. - М.:Юрайт, 2014. - 214с.
  6. Коваленко В. Проектирование информационных систем. / Коваленко В. - М.: Форум, 2012. - 320с.
  7. Кузнецов С. Базы данных. - М.: Academia, 2012. - 496с.
  8. Основы использования и проектирования баз данных. Учебник / Илюшечкин В. - М.: Юрайт, 2014. - 214с.
  9. Осипов Д. 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;