Отправляет email-рассылки с помощью сервиса Sendsay

Создаем свой бизнес

  Все выпуски  

Создаем свою информационную систему #10


Информационный Канал Subscribe.Ru

Создаем свою информационную систему


Выпуск 10

Реализация справочников (часть 2)

Итак, мы готовы описать справочники. Сделаем это и посмотрим, что может сделать генератор кода из такого описания

 

Еще одно пояснения по поводу того, что справочник -это такой же документ, как все остальные. На самом деле мы ожжем положить все справочники в один документ. Надо это делать, или нет зависит исключительно от организационных проблем. Если кто-то категорически настаивает, что на определенных рабочих местах нужно видеть только справочник А, а на других, только справочник В, то есть смысл разнести их по разным документам. Хотя есть и другие способы управлять внешним видом документа, о котором мы поговорим несколько позже. В любом случае, каждый конкретный справочник - это раздел в документе, или несколько взаимосвязанных раздела, если справочник более сложный.

Приступаем к описанию. Для того, чтобы сформировать описание нам надо научиться работать с метамоделью. Это достаточно подробно в описании  программы Администратор. И в рассылке я не буду опускаться до окошек и кнопочек, а ограничусь именно последовательностью действий.

1. Самое первое действие  - создать новое название для приложения.

Все документы относятся к тому, или иному приложению. Например, "Ядро", или "КБ" - клиентская база. Назовем наше приложение - "Архив"

2. Нам надо описать тип документа, в котором и будут жить справочники.

Создаем новое описание типа  с такими параметрами:

Приложение: Архив
Название: Справочники архива
Код: ARD
Допускается только один объект: Да

Все остальные параметры нас сейчас не интересуют.

Тип документа определен.

Надо создавать разделы, которые и станут справочниками. Я все сделаю наоборот. Я уже ввел структуру справочников в метамодель и теперь воспользуюсь генератором  документации, чтобы показать какова эта структура.

Описание раздела: Тип хранимого документа(ARD_DOCTYPE)

Тип документов, которые хранятся в архиве

Коллекция строк

Структура раздела

Название

Псевдоним

Тип

Можно не задавать

кратко

 размер / ссылка на

Название

Name

Строка ограниченной длины (String)

Нет

Да

255

Процесс обработки

Process

Ссылка (Reference)

Да

Нет

ссылка на объект типа: Определение процесса

Свободная обработка

FreePorcess

Да / Нет(Boolean)

Нет

Нет

 

Уникальные сочетания полей в разделе

Ограничение №1 - глобальное

Уникальное сочетание полей: Название

Описание раздела: Тема документа(ARD_DOCTHEME)

Классификатор тем

Коллекция строк

Структура раздела

Название

Псевдоним

Тип

Можно не задавать

кратко

 размер / ссылка на

Название

Name

Строка ограниченной длины(String)

Нет

Да

255

Примечание

Comment

Мнегострочное поле для ввода информации(Memo)

Да

Нет

 

Описание раздела: Тип договора(ARD_DOGTYPE)

Тип договора.

Например, обслуживание, разработка и т.п.

Коллекция строк

Структура раздела

Название

Псевдоним

Тип

Можно не задавать

кратко

 размер / ссылка на

Название

Name

Строка ограниченной длины(String)

Нет

Да

255

Уникальные сочетания полей в разделе

Ограничение №1 - глобальное

Уникальное сочетание полей:Название

Описание раздела: Банк(ARD_BANK)

Описание банков

Структура (коллекция с одной строкой)

Структура раздела

Название

Псевдоним

Тип

Можно не задавать

кратко

 размер / ссылка на

БИК

BIC

Строка ограниченной длины(String)

Нет

Да

11

Название

Name

Строка ограниченной длины(String)

Нет

Да

255

Адрес

Address

Мнегострочное поле для ввода информации(Memo)

Да

Нет

 

Описание раздела: Структура организации(ARD_ORGSTRUCT)

Структура организации

Древовидная структура

Структура раздела

Название

Псевдоним

Тип

Можно не задавать

кратко

 размер / ссылка на

Название

Name

Строка ограниченной длины(String)

Нет

Да

255

Группа

GroupId

Ссылка(Reference)

Да

Нет

ссылка на строку раздела:  Группы  Группы пользователей для определения прав доступа(в документе: Данные о пользователях)

Телефон

Phone

Строка ограниченной длины(String)

Да

Нет

40

 

Пока ничего необычного не произошло. Мы просто внесли описание наших справочников в метамодель и теперь воспользуемся генераторами кода, чтобы получить первый полезный результат. Как запустить генератор, подробно описано в руководстве по модулю администратор.

 

Генератор способен сформировать три полезных сущности:

  1. База данных для хранения информации
  2. Метакод для объектной библиотеки нашего документа
  3. Метакод для приложения. Которое и является нашей целью

 

Основное время при работе генератора занимает создание базы данных. В этом нет ничего удивительного. Поскольку каждый раз создается полный код для формирования (обновления) всей базы данных информационной системы. В зависимости от характеристик компьютера генерация кода занимает от 5 до 15 минут. Но это не так и много по сравнению с тем, сколько затратите времени вы сами, на написание эквивалентного кода. А это примерно 100000 строк SQL скрипта. Разумеется, я говорю не про наши справочники, а про весть комплект документов, которые строятся за один раз.

 

Попробуем разобраться, что же делает генератор из нашего описания.

Таблицы для разделов.

Мы рассмотрим только два раздела, поскольку все они создаются примерно по одинаковым принципам.

 

Справочник банков

CREATE TABLE [ARD_BANK] (

            [InstanceID] [uniqueidentifier] NULL ,

            [ARD_BANKid]  uniqueidentifier ROWGUIDCOL  NOT NULL DEFAULT (newid()),

            [ChangeStamp] [datetime] NOT NULL DEFAULT (getdate()),

            [LockSessionID] [uniqueidentifier] NULL ,

            [LockUserID] [uniqueidentifier] NULL ,

            [SecurityStyleID] [uniqueidentifier] NULL ,

            [BIC] [varchar] (11) NULL ,

            [Name] [varchar] (255) NULL ,

            [Address] [text] NULL

)

 

Описание орг. структуры.

CREATE TABLE [ARD_ORGSTRUCT] (

            [InstanceID] [uniqueidentifier] NULL ,

            [ARD_ORGSTRUCTid]  uniqueidentifier ROWGUIDCOL  NOT NULL DEFAULT (newid()),

            [ChangeStamp] [datetime] NOT NULL DEFAULT (getdate()),

            [LockSessionID] [uniqueidentifier] NULL ,

            [LockUserID] [uniqueidentifier] NULL ,

            [SecurityStyleID] [uniqueidentifier] NULL ,

            [ParentRowid] [uniqueidentifier] NULL ,

            [Name] [varchar] (255)  NULL ,

            [GroupId] [uniqueidentifier] NULL ,

            [Phone] [varchar] (40)  NULL

)

 

 

В обоих случаях видно, что  генератор включает несколько стандартных полей,  затем те поля, которые мы определили в метамодели. Для чего нужны системные поля. Они решают ряд проблем, которые позволяют организовать стандартизированную работу с данными. Первая группа служебных полей - это поля для контроля блокировок, стиля прав, который может быть приписан каждой строке и поле для привязки ко времени последнего изменения данных (LockSessionID, LockUserID,ChangeStamp, SecurityStyleID).  Вторая группа - это поля, которые позволяют определить место данных в структуре документа, и принадлежность конкретному документу (InstanceID,ParentStructRowID - используется для разделов второго уровня, ParentRowID). Еще одно поле - это идентификатор строки, по которому и осуществляется доступ к данным, оно формируется как имя таблицы с добавленным ID.

 

 

Процедуры для работы с данными разделов

 

Сервисные процедуры для раздела

Для каждого раздела документа формируется 10 сервисных процедур.

Я приведу только их описание.

 

Получить краткое название документа. Формируется из полей, для которых  установлен признак "Краткое наименование"

create proc ARD_BANK_BRIEF  (

 @CURSESSION uniqueidentifier,

 @ARD_BANKid uniqueidentifier,

 @BRIEF varchar(4000) output

)

 

Создать, или изменить данные раздела.

create proc ARD_BANK_SAVE /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

@InstanceID uniqueidentifier ,

 @ARD_BANKid uniqueidentifier

,@BIC  VARCHAR (11)/* БИК */

,@Name  VARCHAR (255)/* Название */

,@Address  TEXT = null /* Адрес */

)

 

 

Удалить информацию из раздела

create proc ARD_BANK_DELETE /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @ARD_BANKid uniqueidentifier

)

 

Проверка наличия заблокированных строк в зависимых разделах

create proc ARD_BANK_HCL /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier ,

 @IsLocked integer out

)

 

Проверка наличия блокировки на строке и выше ее в структуре

create proc ARD_BANK_ISLOCKED /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier ,

 @IsLocked integer output

)

 

Блокировка строки раздела

create proc ARD_BANK_LOCK /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier ,

 @LockMode integer

)

 

Получить пару родительский раздел, строка в родительском разделе, относительно данной строки.

create proc ARD_BANK_PARENT /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier ,

 @ParentID uniqueidentifier output,

 @ParentTable varchar(255) output

)

 

Установит права на строку раздела

 create proc ARD_BANK_SINIT /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier ,

 @SecurityStyleID uniqueidentifier=null

)

Снять блокировку со строки раздела

create proc ARD_BANK_UNLOCK /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier

)

Распространить стиль защиты (права) на все дочерние для данной строки данные.

create proc ARD_BANK_propagate /*Описание банков*/ (

 @CURSESSION uniqueidentifier,

 @RowID uniqueidentifier

)

 

Для  каждого нового типа документов создаются еще пять процедур.

 

Удаление документа, со свеми подчиненными данными

create proc ARD_DELETE(@cursession uniqueidentifier, @InstanceID uniqueidentifier)

 

Проверка наличия блокировок внутри документа.

create proc ARD_HCL(@cursession uniqueidentifier, @ROWID uniqueidentifier, @IsLocked integer out)

 

Дополнительная инициализация при создании документа.

create proc ARD_REGISTER(@cursession uniqueidentifier, @InstanceID uniqueidentifier)

Полнотекстовый поиск по документу

create proc ARD_SEARCH(@cursession uniqueidentifier, @QueryResultID uniqueidentifier,@Filter nvarchar(2000))

 

Распространение прав на документ на все разделы документа.

create proc ARD_propagate(@cursession uniqueidentifier, @ROWID uniqueidentifier)

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

Что делают остальные два генератора, и как получить исходный код самого приложения, которое реализует наши справочник, я расскажу в следующем выпуске

Ведущий рассылки: Михаил М. Баранов
bami@murometz.spb.ru www.murometz.spb.ru Кубики для взрослых


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное