RoadType
BalPrin
BTI_11 – таблица параметров БТИ для воздушных ЛЭП:
ID_ObjIm (FK)
InvNum
InvDate
SetDate
WrkVolt
LineType
ProvType
MainSec
OpType
OpTotal
LineLen
BalPrin
BTI_12 – таблица параметров БТИ для кабельных ЛЭП 6-10 кВ:
ID_ObjIm(FK)
InvNum
InvDate
SetDAte
WrkVolt
CabVolt
CabType
MainSec
TotKolod
LineLen
BalPrin
BTI_13 – таблица параметров БТИ для кабельных ЛЭП 0,4 кВ:
ID_ObjIm (FK)
InvNum
InvDate
NumTP
ObjAdress
ObjName
SetDate
ProvType
MainSec
OpType
OpTotal
PrislsolProv
LineLen
BalPrin
BTI_14 – таблица параметров БТИ для воздушных ЛЭП 0,4 кВ:
ID_ObjIm (FK).
InvNum
InvDate
NumTP
ObjAdress
ObjName
SetDate
CabVolt
CabType
MainSec
TotKolod
LineLen
BalPrin
2.3 Хранение документов произвольной структуры
Документ – слабо структурированный объект, но тем не менее для формализованного поиска необходимо выделять в нем некоторые структуры, общие для всех документов с тем, чтобы по этим структурам осуществлять поиск документов. Эти структуры принято называть атрибутами документов. Документы бывают разные и невозможно заранее предусмотреть для всех их состав. Все виды атрибутов, используемых в документе, заранее указать нельзя. Пойдем на компромисс между полнотой описания документа и простотой описания состава документа в терминах реляционных отношений. Попытаемся выделить и использовать основные виды атрибутов. Таковыми представляются атрибуты вида «поле документа» - содержат одно единственное значение из некоторого множества значений, которое называется доменом значения атрибутов. Такие атрибуты назовем простыми атрибутами. Можно выделить еще атрибуты вида «таблица значений». Наиболее употребительными являются таблицы, у которых столбцы имеют заголовки, а строки пронумерованы, может быть и неявно. Назовем такие атрибуты сильно множественными.
Все документы одинакового состава назовем относящимися к одному виду документов. Кроме того, с течением времени структура используемых документов будет менятся, и, хотя формально документы одного вида, структура у них будет разного. Поэтому реализуем в рамках типа документа подтипы (версии типов) документа. Состав документа необходимо описывать. Естественным кажется завести таблицы для описания атрибутов, в которых указывается, какие атрибуты принадлежат виду документов, кроме того для описания множественных атрибутов требуется таблица с описанием заголовков столбцов.
Мы пришли к тому, что состав документа у нас теперь описан, но где хранить значения атрибутов документов. Документы разных видов нельзя хранить в одной таблице, так как количество полей и домены значений атрибутов различных видов документов разнятся. Поэтому для каждого атрибута каждого вида документа необходимо создавать отдельную таблицу.
Итак, у нас имеется таблица описания типов документов DocTypes, таблица описания подтипов документов DocSubTypes. Таблица Attributes описывает все атрибуты указанного подтипа документа, если атрибут множественный, то определение его полей находится в таблице VMAttributes. Все атрибуты относятся к какому – то домену значений, домены описаны в таблице Domains.
Для хранения значений атрибутов для каждого подтипа создается таблица, имя которой формируется по правилу “ATS”+SubTypeID, где “ATS” – префикс, а SubTypeID – ID подтипа документа. Для хранения значений множественных атрибутов для каждого множественного атрибута создается таблица ATM “ATM”+AttribID, где “ATM” – префикс, а AttribID – ID множественного атрибута. Такая схема формирования имен обеспечивает уникальность.
Для лучшего понимания приведем пример.
2.3.1 Пример структуры документа
DomainID | Description | Realization |
1 | Дата | Datetime |
2 | Название документа | Varchar(100) |
3 | Номер документа | Varchar(30) |
4 | Организация | Varchar(100) |
5 | Денежная сумма | Money |
6 | Инвентарный номер | Varchar(20) |
7 | Наименование объекта | Varchar(30) |
8 | Адрес | Varchar(20) |
Типы документов
TypeID | Name |
1 | Приложение к плану приватизации "Акт оценки №1 стоимости зданий, сооружений, передаточных устройств" |
Организации
OrgID | Name | Address | Telephone | INN |
1 | АО «Свердловэнерго» | NULL | NULL | NULL |
Документы
DocID | OrgID | TypeID | DocDate | DocNumber |
1 | 1 | 12.11.2000 |
Определение атрибутов
AttribID | TypeID | DomainID | TabOrder | Name | Plurality |
1 | 1 | 2 | 1 | Название | 0 |
2 | 1 | 3 | 2 | Номер | 0 |
3 | 1 | 1 | 3 | Дата | 0 |
4 | 1 | 7 | 4 | Зарегистрировано | 0 |
5 | 1 | Null | 5 | СписокОбъектов | 2 |
ATS1
DocID | FieldData |
1 | Приложение №1 к плану приватизации "Акт оценки №1 стоимости зданий, сооружений, передаточных устройств" |
1 | 1 |
1 | 12.11.2000 |
1 | Министерством по управлению госимуществом |
1 | NULL |
ОпредПолейСильноМнож
AttribID | ColumnID | DomainID | Name |
5 | 1 | 6 | Инвентарный номер |
5 | 2 | 7 | Название |
5 | 3 | 8 | Адрес |
5 | 4 | 5 | Стоимость первоначальня |
5 | 5 | 5 | Стоимость остаточная |
5 | 6 | 5 | Износ |
Номер таблицы с данными сильно множественных атрибутов формируется из префикса AVM и номера атрибута. Все атрибуты(AttribID) уникальны в пределах БД. Связь таблиц с данными атрибутов с таблицей определения атрибутов происходит через номер таблицы, который формируется как префикс ATM + AttribID. Номер поля формируется из префикса FieldDate и номера столбца.
ATM5
DocID | RowID | FieldData1 | FieldData2 | FieldData3 | FieldData4 | FieldData5 | FieldData6 |
1 | 1 | 1233 | ТП 1021 | Ул.Свердлова,7 | 111,11 | 333,33 | 222,22 |
1 | 2 | 1344 | ТП 7563 | Ул.Фурманова,45 | 222,22 | 555,55 | 333,33 |
3. Программная реализация комплекса
3.1 Серверная часть
В состав серверной части комплекса ходит:
таблиц, в которых хранятся собственно данные;
хранимых процедур, реализующих доступ к этим таблицам;
сообщениях об ошибочных ситуациях;
список пользователей и ролей.
3.1.1 Руководство программиста
При создании серверной части использовалось следующее соглашения о наименовании объектов:
Имя объекта формируется из 3 составных частей:
1 - префикс типа объекта (sp,vw,df, tr);
2 - аббревиатура модуля;
3 – действие;
3 - объект;
Например, spONIAddDomain.
Все хранимые процедуры возвращают целое число – код завершения. Если оно равно нулю, то процедура выполнилась успешно, иначе возникли ошибки. При возникновении ошибочной ситуации генерируется код ошибки и клиенту возвращается код ошибки, а также системное сообщение с данным кодом. В большинстве случаев достаточно отобразить системное сообщение.
Применение хранимых процедур также позволяет всегда поддерживать данные в согласованном состоянии, так как хранимые процедуры составлены так, что в случае возникновения ошибки отменяются все внесенные изменения.
Список хранимых процедур, их параметров и описание приведены в табл 3.1.
Таблица 3.1.
Список хранимых процедур серверной части
Хранимая процедура | Описание |
CREATE PROC spONIAddAttribute@Name varchar(100), @SubTypeID int, @TabOrder int, @DomainID int, @Plurality int, @ID int OUTPUT | Создание атрибута докуммента |
CREATE PROC spONIAddCategory@level int, @NameValue varchar(128), @FKValue int, @ID int OUTPUT | Создание новой категории при использовании универсального иерархического компонента |
CREATE PROC spONIAddDoc@SubTypeID int,@ID int OUTPUT | Создание нового документа |
CREATE PROC spONIAddDocSubType@NameValue varchar(128),@TypeID int, @ID int OUTPUT | Создание нового подтипа документа. Одновременно создаются таблицы для хранения значений атрибутов документа данного подтипа. |
CREATE PROC spONIAddDomain@Name varchar(20), @Realization varchar(20), @ID int OUTPUT | Создание нового домена значений атрибутов документа |
CREATE PROC spONIDeleteAttribute@ID int | Удаление атрибута документа |
CREATE PROC spONIDeleteCategory@level int, @ID int | Удаление категории при использовании универсального иерархического компонента |
CREATE PROC spONIDeleteDoc@ID int | Удаление документа |
CREATE PROC spONIDeleteDocSubType@ID int | Удаление подтипа документа |
CREATE PROC spONIDeleteDomain@ID int | Удаление домена значений атрибутов документа |
CREATE PROC spONIGetAttributes@ID int | Получение списка атрибутов указанного подтипа документов |
CREATE PROC spONIGetCategories@level int, @ID int | Получение значений категории указанного уровня |
CREATE PROC spONIGetDocs | Получение списка документов |
ё | Получение списка доменов значений атрибутов |
CREATE PROC spONIGetSingleAttributeValue@DocID int,@SubTypeID int, @AttribID int,@Value nvarchar(4000) output | Получение значения простого атрибута документа |
CREATE PROC spONIRenameAttribute@ID int, @TabOrder int, @DomainID int, @Name varchar(100), @Plurality int | Изменение атрибута документа |
CREATE PROC spONIRenameCategory@level int, @NameValue varchar(128), @ID int | Изменении категории при использовании универсального иерархического компонента |
CREATE PROC spONIRenameDomain@ID int,@Name varchar(20),@DomainType int, @Realization varchar(20) | Изменение домена значений атрибутов докуменат |
CREATE PROC spONIUpdateSingleAttributeValue@DocID int, @SubTypeID int, @AttribID int,@Value varchar(4000) | Изменение значения атрибута |
3.2 Клиентская часть