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 Клиентская часть