воскресенье, 29 августа 2010 г.

Разработка многопользовательской автоматизированной системы управления организацией. – Часть 2 (HLD)

1. Введение

1.1 Назначение

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

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

1.2 Реализация

Проект реализуется при помощи MS SQL Server 2000 & MS Visual Studio .NET 2003.

Клиентская часть пишется на C#.

Для доступа к данным будет использована технология ADO.NET.

1.3 Определения и принятые сокращения

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

Сокращение

Определение

БД

База Данных

ОС

Операционная Система


2. Описание структуры и взаимосвязей

2.1 Структура базы данных:

Структура связей:

clip_image002

Текст на SQL для создания базы данных:

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

CREATE TABLE Service(

ServiceID int NOT NULL IDENTITY(1,1),

AccessType int NOT NULL,

[Description] char(100) NOT NULL,

CONSTRAINT ServiceID_PK

PRIMARY KEY (ServiceID)

);

CREATE TABLE DiscontType(

DiscontTypeID int NOT NULL IDENTITY(1,1),

Rate int NOT NULL,

[Description] char(100) NOT NULL,

CONSTRAINT DiscontTypeID_PK

PRIMARY KEY (DiscontTypeID)

);

CREATE TABLE City(

CityID int NOT NULL IDENTITY(1,1),

City char(50) NOT NULL,

CityCode char(50) NOT NULL,

Cost money NOT NULL,

CONSTRAINT CityID_PK

PRIMARY KEY (CityID)

);

CREATE TABLE CrashType(

CrashTypeID int NOT NULL IDENTITY(1,1),

[Description] char(100) NOT NULL,

CONSTRAINT CrashTypeID_PK

PRIMARY KEY (CrashTypeID)

);

CREATE TABLE AbonentType(

AbonentTypeID int NOT NULL IDENTITY(1,1),

DiscontTypeID int NOT NULL,

Cost money NOT NULL,

CONSTRAINT AbonentTypeID_PK

PRIMARY KEY (AbonentTypeID),

CONSTRAINT DiscontType_FK

FOREIGN KEY (DiscontTypeID)

REFERENCES DiscontType(DiscontTypeID)

);

CREATE TABLE Abonent(

AbonentID int NOT NULL IDENTITY(1,1),

FName char(50) NOT NULL,

LName char(50) NOT NULL,

Company char(50) NULL,

AbonentTypeID int NOT NULL,

State bit NOT NULL,

CONSTRAINT AbonentID_PK

PRIMARY KEY (AbonentID),

CONSTRAINT AbonentType_FK

FOREIGN KEY (AbonentTypeID)

REFERENCES AbonentType(AbonentTypeID)

);

CREATE TABLE Receipt(

ReceiptID int NOT NULL IDENTITY(1,1),

AbonentID int NOT NULL,

LocalCost money NOT NULL,

TrunkCallCost money NOT NULL,

State bit NOT NULL,

[Date] smalldatetime NOT NULL,

PayDate smalldatetime NULL,

CONSTRAINT ReceiptID_PK

PRIMARY KEY (ReceiptID),

CONSTRAINT AbonentID_FK

FOREIGN KEY (AbonentID)

REFERENCES Abonent(AbonentID)

ON UPDATE CASCADE

ON DELETE CASCADE

);

CREATE TABLE [User](

UserID int NOT NULL IDENTITY(1,1),

FName char(50) NOT NULL,

LName char(50) NOT NULL,

ServiceID int NOT NULL,

UserName char(50) NOT NULL,

[Password] char(50) NULL,

CONSTRAINT UserID_PK

PRIMARY KEY (UserID),

CONSTRAINT UserName_AK

UNIQUE (UserName),

CONSTRAINT ServiceID_FK

FOREIGN KEY (ServiceID)

REFERENCES Service(ServiceID)

ON UPDATE CASCADE

ON DELETE CASCADE

);

CREATE TABLE Phone(

PhoneID int NOT NULL IDENTITY(1,1),

AbonentID int NOT NULL,

Number char(50) NOT NULL,

State bit NOT NULL,

CONSTRAINT PhoneID_PK

PRIMARY KEY (PhoneID),

CONSTRAINT Number_AK

UNIQUE (Number),

CONSTRAINT AbonentID2_FK

FOREIGN KEY (AbonentID)

REFERENCES Abonent(AbonentID)

ON UPDATE CASCADE

ON DELETE CASCADE

);

CREATE TABLE Crash(

CrashID int NOT NULL IDENTITY(1,1),

CrashTypeID int NOT NULL,

PhoneID int NOT NULL,

RegDate smalldatetime NOT NULL,

FixDate smalldatetime NOT NULL,

UserID int NOT NULL,

FixReal smalldatetime NULL,

CONSTRAINT CrashID_PK

PRIMARY KEY (CrashID),

CONSTRAINT UserID_FK

FOREIGN KEY (UserID)

REFERENCES [User](UserID)

ON UPDATE CASCADE

ON DELETE CASCADE,

CONSTRAINT CrashTypeID_FK

FOREIGN KEY (CrashTypeID)

REFERENCES CrashType(CrashTypeID)

ON UPDATE CASCADE

ON DELETE CASCADE,

CONSTRAINT PhoneID_FK

FOREIGN KEY (PhoneID)

REFERENCES Phone(PhoneID)

ON UPDATE CASCADE

ON DELETE CASCADE

);

CREATE TABLE CallLog(

CallLogID int NOT NULL IDENTITY(1,1),

PhoneID int NOT NULL,

CallDate smalldatetime NOT NULL,

LongTime int NOT NULL,

LocalCall bit NOT NULL,

CityID int NULL,

ReceiptState bit NULL,

CONSTRAINT CallLogID_PK

PRIMARY KEY (CallLogID),

CONSTRAINT CityID_FK

FOREIGN KEY (CityID)

REFERENCES City(CityID)

ON UPDATE CASCADE

ON DELETE CASCADE,

CONSTRAINT PhoneID2_FK

FOREIGN KEY (PhoneID)

REFERENCES Phone(PhoneID)

ON UPDATE CASCADE

ON DELETE CASCADE,

);

CREATE TABLE Archive(

AbonentID int NOT NULL,

FName char(50) NOT NULL,

LName char(50) NOT NULL,

Company char(50) NULL,

State bit NOT NULL,

Cost money NOT NULL,

Rate int NOT NULL,

CONSTRAINT Archive_PK

PRIMARY KEY (AbonentID),

);

/********************* Триггеры *********************/

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = N'Tri_Del_Abonent'

AND type = 'TR')

DROP TRIGGER Tri_Del_Abonent

GO

-- При удалении данных из таблицы Abonent переносит все дданные об абоненте в таблицу Archive

CREATE TRIGGER Tri_Del_Abonent

ON Abonent

FOR DELETE

AS

INSERT Archive (AbonentID, FName, LName, Company, State, Cost, Rate) SELECT AbonentID, FName, LName, Company, State, AbonentType.Cost, DiscontType.Rate

FROM (Deleted INNER JOIN AbonentType ON Deleted.AbonentTypeID=AbonentType.AbonentTypeID)

INNER JOIN DiscontType ON DiscontType.DiscontTypeID=AbonentType.DiscontTypeID

ORDER BY Deleted.LName

GO

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = N'Tri_Del_AbonentType'

AND type = 'TR')

DROP TRIGGER Tri_Del_AbonentType

GO

-- Перед удалением типа абонента вызывает Tri_Del_Abonent

CREATE TRIGGER Tri_Del_AbonentType

ON AbonentType

INSTEAD OF DELETE

AS

DELETE FROM Abonent WHERE AbonentTypeID IN (SELECT AbonentTypeID FROM Deleted)

GO

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = N'Tri_Ins_Abonent'

AND type = 'TR')

DROP TRIGGER Tri_Ins_Abonent

GO

-- Проверяет имя и фамилию абонента на наличие чисел

CREATE TRIGGER Tri_Ins_Abonent

ON Abonent

FOR INSERT, UPDATE

AS

DECLARE @nCount int

SELECT @nCount = COUNT(Inserted.AbonentID) FROM Abonent, Inserted

WHERE (Abonent.AbonentID = Inserted.AbonentID) AND

((Inserted.LName LIKE '%[0-9]%') OR (Inserted.FName LIKE '%[0-9]%'))

IF @nCount <> 0

BEGIN

ROLLBACK TRAN

RAISERROR('Имя и фамилия не должны содержать числа!', 16, 10)

END

GO

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = N'Tri_Ins_Abonent'

AND type = 'TR')

DROP TRIGGER Tri_Ins_Abonent

GO

-- Проверяет имя и фамилию пользователя БД на наличие чисел

CREATE TRIGGER Tri_Ins_User

ON [User]

FOR INSERT, UPDATE

AS

DECLARE @nCount int

SELECT @nCount = COUNT(Inserted.UserID) FROM [User], Inserted

WHERE ([User].UserID = Inserted.UserID) AND

((Inserted.LName LIKE '%[0-9]%') OR (Inserted.FName LIKE '%[0-9]%'))

IF @nCount <> 0

BEGIN

ROLLBACK TRAN

RAISERROR('Имя и фамилия не должны содержать числа!', 16, 10)

END

GO

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = N'Tri_Del_DiscontType'

AND type = 'TR')

DROP TRIGGER Tri_Del_DiscontType

GO

-- Не позволяет удалять данные из таблицы DiscontType если существуют типы абоненты, имеющие данный тип скидки

CREATE TRIGGER Tri_Del_DiscontType

ON DiscontType

INSTEAD OF DELETE

AS

IF @@ROWCOUNT > 1

BEGIN

ROLLBACK TRAN

RAISERROR('Из этой таблицы можно удалять данные только по одной записи!', 16, 10)

END

DECLARE @iDiscontType int

SELECT @iDiscontType = Deleted.DiscontTypeID FROM DiscontType, Deleted

WHERE Deleted.DiscontTypeID = DiscontType.DiscontTypeID

IF EXISTS (SELECT * FROM AbonentType WHERE DiscontTypeID = @iDiscontType)

BEGIN

ROLLBACK TRAN

RAISERROR('Невозможно удалить запись т.к. существуют типы абоненты, имеющие данный тип скидки', 16, 10)

END

GO

/********************* Хранимые процедуры *********************/

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = 'MDFOM'

AND type = 'P')

DROP PROCEDURE MDFOM

GO

-- Возвращает кол-во дней по номеру месяца

CREATE PROC MDFOM

@month int,

@maxday int OUTPUT

AS

IF((@month = 4) OR (@month = 6) OR (@month = 9) OR (@month = 11)) SET @maxday = 30

ELSE IF (@month = 2) SET @maxday = 28

ELSE SET @maxday = 31

GO

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = 'DateTimeRandGenerator'

AND type = 'P')

DROP PROCEDURE DateTimeRandGenerator

GO

-- Генерирует случайную дату в заданном диапазоне

CREATE PROC DateTimeRandGenerator

@DTStart smalldatetime,

@DTStop smalldatetime,

@NewDate smalldatetime OUTPUT

AS

SET @NewDate = '01/01/1900 00:00:00'

DECLARE @dy int

DECLARE @dm int

DECLARE @dd int

DECLARE @dh int

DECLARE @dmin int

DECLARE @ds int

DECLARE @ny int

DECLARE @nm int

DECLARE @nd int

DECLARE @nh int

DECLARE @nmin int

DECLARE @ns int

DECLARE @maxday int

SET @dy = DATEPART(year, @DTStop) - DATEPART(year, @DTStart)

IF(@dy = 0)

BEGIN

SET @ny = DATEPART(year, @DTStop)

SET @dm = DATEPART(month, @DTStop) - DATEPART(month, @DTStart)

IF(@dm = 0)

BEGIN

SET @nm = DATEPART(month, @DTStop)

SET @dd = DATEPART(day, @DTStop) - DATEPART(day, @DTStart)

IF(@dd = 0) SET @nd = DATEPART(day, @DTStop)

ELSE SET @nd = DATEPART(day, @DTStart) + ROUND((RAND() * @dd),0)

END

ELSE

BEGIN

SET @nm = DATEPART(month, @DTStart) + ROUND(RAND() * @dm,0)

EXEC MDFOM @nm, @maxday OUTPUT

IF(@nm = DATEPART(month, @DTStart))

SET @nd = DATEPART(day, @DTStart) + ROUND(RAND() * (@maxday - DATEPART(day, @DTStart)),0)

ELSE IF(@nm = DATEPART(day, @DTStop))

SET @nd = 1 + ROUND(RAND() * (DATEPART(day, @DTStop) - 1),0)

ELSE

SET @nd = 1 + ROUND(RAND() * (@maxday - 1), 0)

END

END

ELSE

BEGIN

SET @ny = DATEPART(year, @DTStart) + ROUND(RAND() * @dy,0)

IF(@ny = DATEPART(year, @DTStart))

BEGIN

SET @nm = DATEPART(month, @DTStart) + ROUND(RAND() * (12 - DATEPART(month, @DTStart)),0)

EXEC MDFOM @nm, @maxday OUTPUT

IF(@nm = DATEPART(month, @DTStart))

SET @nd = DATEPART(day, @DTStart) + ROUND(RAND() * (@maxday - DATEPART(day, @DTStart)),0)

ELSE

SET @nd = 1 + ROUND(RAND() * (@maxday - 1), 0)

END

ELSE IF(@ny = DATEPART(year, @DTStop))

BEGIN

SET @nm = 1 + ROUND(RAND() * (DATEPART(month, @DTStop) - 1),0)

EXEC MDFOM @nm, @maxday OUTPUT

IF(@nm = DATEPART(day, @DTStop))

SET @nd = 1 + ROUND(RAND() * (DATEPART(day, @DTStop) - 1),0)

ELSE

SET @nd = 1 + ROUND(RAND() * (@maxday - 1), 0)

END

ELSE

BEGIN

SET @nm = 1 + ROUND(RAND() * 11, 0)

EXEC MDFOM @nm, @maxday OUTPUT

SET @nd = 1 + ROUND(RAND() * (@maxday - 1), 0)

END

END

SET @nh = ROUND(RAND() * 23, 0)

SET @nmin = ROUND(RAND() * 59, 0)

SET @ns = ROUND(RAND() * 59, 0)

SET @NewDate = DATEADD(year, @ny - 1900, @NewDate)

SET @NewDate = DATEADD(month, @nm - 1, @NewDate)

SET @NewDate = DATEADD(day, @nd - 1, @NewDate)

SET @NewDate = DATEADD(hour, @nh, @NewDate)

SET @NewDate = DATEADD(minute, @nmin, @NewDate)

SET @NewDate = DATEADD(second, @ns, @NewDate)

GO

IF EXISTS (SELECT name

FROM sysobjects

WHERE name = 'CallGenerator'

AND type = 'P')

DROP PROCEDURE CallGenerator

GO

-- Генератор звонков - заполняет таблицу CallLog

CREATE PROC CallGenerator

@DTStart smalldatetime, -- Дата начала звонков

@DTStop smalldatetime, -- Дата окончания звонков

@LStart int, -- Минимальное время разговора

@LStop int, -- Максимальное время разговора

@LocalStopCycle int, -- Количество локальных звонков

@CityStopCycle int -- Количество междугородних звонков

AS

DECLARE @StopCycle int

DECLARE @PhoneID int

DECLARE @CallDate smalldatetime

DECLARE @LongTime int

DECLARE @LocalCall bit

DECLARE @CityID int

DECLARE @CountPhoneID int

DECLARE @CountCityID int

DECLARE @CountCycle int

DECLARE @MaxCycle int

SET @CountCycle = 0

SET @StopCycle = 0

DECLARE curPhone CURSOR LOCAL SCROLL KEYSET READ_ONLY

FOR SELECT PhoneID FROM Phone

DECLARE curCity CURSOR LOCAL SCROLL KEYSET READ_ONLY

FOR SELECT CityID FROM City

SET @StopCycle = @LocalStopCycle

SET @LocalCall = 1

SET @MaxCycle = 0

SET @CityID = NULL

CREATE TABLE #TempCallLog(

PhoneID int NOT NULL,

CallDate smalldatetime NOT NULL,

LongTime int NOT NULL,

LocalCall bit NOT NULL,

CityID int NULL,

ReceiptState bit NULL,

);

BEGIN TRAN

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

WHILE (@MaxCycle < 2)

BEGIN

SET @CountCycle = 0

WHILE (@CountCycle < @StopCycle)

BEGIN

-- Открываем курсор

OPEN curPhone

-- Инкрементируем счётчик цикла

SET @CountCycle = @CountCycle + 1

IF(@@CURSOR_ROWS = 0)

BEGIN

RAISERROR('Невозможно чтение из таблицы Phone', 16, 10)

ROLLBACK TRAN

END

-- Случайиым образом выбираем телефон

SET @CountPhoneID = 1 + ROUND(RAND() * (@@CURSOR_ROWS - 1), 0)

FETCH ABSOLUTE @CountPhoneID FROM curPhone INTO @PhoneID

-- Генерируем случайную дату в заданном диапазоне

EXECUTE DateTimeRandGenerator @DTStart, @DTStop, @CallDate OUTPUT

-- Генерируем случайное значение времени разговора в заданном диапазоне

SET @LongTime = @LStart + ROUND(RAND() * (@LStop - @LStart), 0)

-- Если межгород

IF(@LocalCall = 0)

BEGIN

OPEN curCity

IF(@@CURSOR_ROWS = 0)

BEGIN

RAISERROR('Невозможно чтение из таблицы City', 16, 11)

ROLLBACK TRAN

END

-- Случайно выбираем город

SET @CountCityID = 1 + ROUND(RAND() * (@@CURSOR_ROWS - 1), 0)

FETCH ABSOLUTE @CountCityID FROM curCity INTO @CityID

CLOSE curCity

END

INSERT INTO #TempCallLog (PhoneID, CallDate, LongTime, LocalCall, CityID)

VALUES (@PhoneID, @CallDate, @LongTime, @LocalCall, @CityID)

CLOSE curPhone

END

SET @LocalCall = 0

SET @MaxCycle = @MaxCycle + 1

SET @StopCycle = @CityStopCycle

END

COMMIT TRAN

BEGIN TRAN

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

INSERT INTO CallLog (PhoneID, CallDate, LongTime, LocalCall, CityID)

SELECT PhoneID, CallDate, LongTime, LocalCall, CityID FROM #TempCallLog ORDER BY CallDate

COMMIT TRAN

DEALLOCATE curCity

DEALLOCATE curPhone

GO

IF EXISTS (SELECT TABLE_NAME

FROM INFORMATION_SCHEMA.VIEWS

WHERE TABLE_NAME = N'AbonentInfo')

DROP VIEW AbonentInfo

GO

CREATE VIEW AbonentInfo

AS

SELECT AbonentID, FName, LName, Company, State, AbonentType.Cost, DiscontType.Rate

FROM (Abonent INNER JOIN AbonentType ON Abonent.AbonentTypeID=AbonentType.AbonentTypeID)

INNER JOIN DiscontType ON DiscontType.DiscontTypeID=AbonentType.DiscontTypeID

GO

IF EXISTS (SELECT TABLE_NAME

FROM INFORMATION_SCHEMA.VIEWS

WHERE TABLE_NAME = N'PhoneInfo')

DROP VIEW PhoneInfo

GO

CREATE VIEW PhoneInfo

AS

SELECT Phone.PhoneID, Phone.Number, Phone.State, AbonentInfo.FName, AbonentInfo.LName, AbonentInfo.Company, AbonentInfo.Cost, AbonentInfo.Rate

FROM (Phone INNER JOIN AbonentInfo ON AbonentInfo.AbonentID=Phone.AbonentID)

GO


2.2 Структура клиентского приложения:

Назначение классов:

Имя класса

Назначение

AbonentManagement

Добавление, удаление, подключение и отключение абонентов.

Изменение данных абонента.

Admin

Используется для выполнения запросов на SQL

BookKeeping

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

CallGenerator

Эмулятор телефонной сети.

Connect

Класс отвечает за подключение к базе и определение прав доступа.

Crash

Регистрация поломок

CrashFix

Отображает список неустранённых поломок сети и позволяет их устранять

FillComponent

Содержит статические методы для работы с базой.

MainForm

Основная форма, содержит меню, изменяющееся в зависимости от прав доступа.

Pay

Позволяет отметить квитанцию как оплаченную.

PhoneManagement

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

Переназначение номеров.

StatForm

Универсальная форма для отображения статистики с выборкой по одному параметру.

TableForm

Универсальная форма для работы с таблицами.

Рассмотрим подробнее некоторые классы:

Главное окно приложения представляет собой MDI-форму, содержащую меню, которое изменяется в зависимости от прав доступа (типа пользователя).

Подключение к серверу и авторизацию пользователя обеспечивает класс Connect, экземпляр которого создаётся сразу после запуска приложения. Формат конструктора: Connect(MainForm _main) – в объект передаётся ссылка на основную форму приложения, что сделано для предоставления возможности конфигурирования меню основного окна в соответствии с правами пользователя.

Тип пользователя определяется по таблице Service.

Работу с таблицами обеспечивает класс TableForm.

При создании экземпляра TableForm ему необходимо передать название таблицы, подключение к БД типа SqlConnection и элемент меню, при помощи которого было инициировано создание этого экземпляра. Формат конструктора:

TableForm(SqlConnection _sqlConn, string _tableName, MenuItem menuItem). Указанная строка меню отключается, чтобы избежать повторного открытия формы. Сразу после инициализации будет отображена форма с элементом типа DataGrid, содержащим полную выборку из таблицы. Шаблоны для команд INSERT, UPDATE & DELETE формируются на основе метаданных полученной таблицы при помощи метода CreateCommand(). Сохранение данных происходит при помощи метода Save(), вызов которого происходит по нажатию кнопки «Save» или при закрытии окна (т.е. при вызове Dispose()).

Классы AbonentManagement, BookKeeping, CallGenerator, Crash, CrashFix, Pay, PhoneManagement предназначены для ввода и модификации информации в БД про помощи различных форм. Все они имеют одинаковый набор параметров конструктора, в который передаются SqlConnection _sqlConnection и MenuItem menuItem.

Классы AbonentManagement и PhoneManagement обеспечивают работу с абонентами и телефонными номерами соответственно. Их структура очень похожа:

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

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

Класс Crash отображает форму для регистрации поломки в сети, подобен классам AbonentManagement и PhoneManagement.

Класс BookKeeping формирует квитанции (записи в Receipt) на основе истории звонков (записи в CallLog) для указанного месяца.

CallGenerator эмулирует работу сети (пишет звонки в CallLog). Входные параметры для генератора:

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

Генерация происходит в обработчике нажатия кнопки «Генерировать».

Класс ComboItem предназначен для заполнения экземпляров ComboBox.

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

StatForm представляет собой универсальную форму для отображения статистики с выборкой по одному параметру. Основной запрос и запрос на параметр передаются в конструкторе: StatForm(SqlConnection _sqlConnection, string _tableName, MenuItem menuItem, string _strSelect, string _strCombo, int _param1Combo, int _param2Combo). _param1Combo и _param2Combo – индексы выборки в поля str и str2 экземпляров класса ComboItem, которыми заполняется экземпляр ComboBox, предназначенный для выбора конкретного значения параметра.

FillComponent – предоставляет статические простые методы для доступа к данным:

· static void FillList(ListView list, string strSelect, SqlConnection sqlConnection, int index ) – заполняет list данными, полученными при помощи запроса strSelect, index – количество не заполняемых столбцов;

· static void FillCombo(ComboBox combo, string strSelect, SqlConnection sqlConnection, int Index, int Index2) – заполняет combo данными, полученными при помощи запроса strSelect. Index – номер поля, значение которого записывается в str экземпляра ComboItem. Index2 – номер поля, значение которого записывается в str2 экземпляра ComboItem.;

· static void FillCombo(ComboBox combo, string strSelect, SqlConnection sqlConnection, int Index) – в str2 пишется пустая строка;

· static int Add(string strIns, SqlConnection sqlConnection) – запись в БД по запросу strIns;

· static int Update(string strUpd, SqlConnection sqlConnection) – обновление записей в БД по запросу strUpd;

· static void Scalar(ref string strResult, string strSelect, SqlConnection sqlConnection) – возвращает в strResult последнюю строку результата запроса strSelect.

clip_image003


3. Описание интерфейсного взаимодействия

3.1 Интерфейс «БД – Клиентское ПО»

  • Для доступа к данным используется технология ADO.NET
  • Все запросы к базе пишутся на языке Transact-SQL

3.2 Интерфейс «Клиентское ПО - Пользователь»

· Вход в систему: обеспечивает подключение к серверу и вход в базу с правами доступа, зависящими от типа пользователя
· Главное окно: содержит меню, которое изменяется в зависимости от прав доступа (типа пользователя)
· Работа с таблицами: таблицы доступны для прямого редактирования из меню «Таблицы».
· Работа с абонентами: форма позволяет производить добавление, удаление, подключение и отключение абонентов, а также изменение данных абонента.
· Работа с телефонными номерами: форма позволяет производить добавление, удаление, подключение, отключение и переназначение телефонных номеров.
· Регистрация и устранение неисправностей: регистрация производится при помощи формы «Регистрация поломки». Для устранения поломки используется форма «Отметка о ремонте».
· Работа с квитанциями: формирование квитанций производится при помощи формы «Обработка квитанций», а их оплата – через форму «Оплата квитанций»
· Запросы различного типа можно выполнить из меню «Запросы». Администратор может сом формировать запросы на языке SQL.

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

· Внешний вид приложения:

clip_image005

Комментариев нет:

Отправить комментарий