1. Введение
1.1 Назначение
Цель данного проекта – разработать автоматизированную систему управления организацией. Область применения – Телефонная станция. Система должна упростить работу сотрудников по управлению организацией, тем самым позволяя сосредоточить свое внимание на основной работе.
Пользователями данного продукта являются сотрудники телефонной станции, службы трех типов: ремонтная, планово-статистическая и управляющая и бухгалтерия.
1.2 Реализация
Проект реализуется при помощи MS SQL Server 2000 & MS Visual Studio .NET 2003.
Клиентская часть пишется на C#.
Для доступа к данным будет использована технология ADO.NET.
1.3 Определения и принятые сокращения
В настоящем документе приняты следующие определения и сокращения:
Сокращение | Определение |
БД | База Данных |
ОС | Операционная Система |
2. Описание структуры и взаимосвязей
2.1 Структура базы данных:
Структура связей:
Текст на 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 Структура клиентского приложения:
Назначение классов:
Имя класса | Назначение |
Добавление, удаление, подключение и отключение абонентов. Изменение данных абонента. | |
Используется для выполнения запросов на SQL | |
Генерирует квитанции на заданный месяц. Заполняет таблицу Receipt. | |
Эмулятор телефонной сети. | |
Класс отвечает за подключение к базе и определение прав доступа. | |
Регистрация поломок | |
CrashFix | Отображает список неустранённых поломок сети и позволяет их устранять |
Содержит статические методы для работы с базой. | |
Основная форма, содержит меню, изменяющееся в зависимости от прав доступа. | |
Позволяет отметить квитанцию как оплаченную. | |
Добавление, удаление, подключение и отключение телефонных номеров. Переназначение номеров. | |
Универсальная форма для отображения статистики с выборкой по одному параметру. | |
Универсальная форма для работы с таблицами. |
Рассмотрим подробнее некоторые классы:
Главное окно приложения представляет собой 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.
3. Описание интерфейсного взаимодействия
3.1 Интерфейс «БД – Клиентское ПО»
- Для доступа к данным используется технология ADO.NET
- Все запросы к базе пишутся на языке Transact-SQL
3.2 Интерфейс «Клиентское ПО - Пользователь»
· Вход в систему: обеспечивает подключение к серверу и вход в базу с правами доступа, зависящими от типа пользователя
· Главное окно: содержит меню, которое изменяется в зависимости от прав доступа (типа пользователя)
· Работа с таблицами: таблицы доступны для прямого редактирования из меню «Таблицы».
· Работа с абонентами: форма позволяет производить добавление, удаление, подключение и отключение абонентов, а также изменение данных абонента.
· Работа с телефонными номерами: форма позволяет производить добавление, удаление, подключение, отключение и переназначение телефонных номеров.
· Регистрация и устранение неисправностей: регистрация производится при помощи формы «Регистрация поломки». Для устранения поломки используется форма «Отметка о ремонте».
· Работа с квитанциями: формирование квитанций производится при помощи формы «Обработка квитанций», а их оплата – через форму «Оплата квитанций»
· Запросы различного типа можно выполнить из меню «Запросы». Администратор может сом формировать запросы на языке SQL.
· Эмуляция работы сети и регистрация звонков производится эмулятором сети.
· Внешний вид приложения:
Комментариев нет:
Отправить комментарий