Система Ultima Businessware® предоставляет прикладному разработчику механизмы создания и редактирования справочников, описывающих бизнес-объекты предметной области.

Описание справочников хранится в схеме ядра базы данных в следующих таблицах:

DICTIONARIES – атрибуты справочников;

DICT_PROPERTIES – свойства справочников;

PROP_TRANSLATIONS – локализованные значения полей справочника, переводимых на язык отличный от языка по умолчанию;

DICT_TOONEREFS – взаимосвязи свойств справочников с другими справочниками;

LINK_TABLES – атрибуты развязочных таблиц;

LINK_PROPERTIES – свойства развязочных таблиц;

LINK_TOONEREFS – взаимосвязи свойств развязочных таблиц со справочниками;

DICT_LINKTABLES – взаимосвязи справочников с другими через развязочные таблицы.

Поля этих таблиц будут подробно описаны ниже при описании механизма создания новых объектов типа справочник.

С помощью таблиц OBJECTS и VERSIONS реализуется механизм версионирования конфигурации.

Каждая из таблиц, описывающих справочники, имеет по два ключевых поля, связанных с соответствующими таблицами:

OBJECT_ID – идентификатор объекта;

VERSION_ID – идентификатор версии конфигурации.

Физическая (ER) модель данных выглядит следующим образом:

Dict_Dict_Tables_ER

Прикладной разработчик может осуществлять запросы к метаданным и через представления (view) – виртуальные таблицы, полученные выборкой из базы данных всех объектов относящихся к одной версии конфигурации, идентификатор которой получен из текущей сессии. Таким образом, обращаясь к таблицам базы данных и внося в них изменения, разработчик получает доступ только к выбранной при входе в систему версии конфигурации. Для всех таблиц представлений к имени таблицы добавляется префикс "V".

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

Dict_Dict_Tables

Таблица PROP_TRANSLATIONS модели данных не имеет префикса "V", так как не является представлениям по причине того, что не версионируется.

table В таблице DICTIONARIES хранятся атрибуты, которые описывают справочник и его таблицу в прикладной схеме базы данных:

NAME – название справочника, определяет название генерируемого класса;

CAPTION – отображаемое в экранных формах название справочника, например, для справочника контрагентов Agents это может быть название "Контрагенты" или "Справочник контрагентов";

TABLE_NAME – название таблицы в прикладной схеме базы данных (вследствие ограничений, накладываемых СУБД Oracle, название может содержать только буквы латинского алфавита в верхнем регистре, цифры и знак "_", при этом название должно начинаться с буквы и быть не больше 30 символов);

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

35_important

Для кэшируемого справочника всегда рассылаются уведомления об изменении, поэтому не следует делать кэшируемыми часто изменяющиеся справочники.

NOTIFICATION_ENABLED – флаг уведомления, используется для оповещения о внесенных в данные справочника изменениях. Для кэшируемого справочника уведомления рассылаются всегда независимо от состояния флага;

PARENT_REF_OBJ_ID (FK) – атрибут используется для создания справочника древовидного типа. В качестве его значения указывается ссылка на запись таблицы DICT_TOONEREFS, которая указывает, какое из свойств выбранного справочника (полей его таблицы) будет родительским (PARENT_ID в примере):

Dict_Tree

DISPLAY_FORMAT – формат строки, в котором отображаются элементы справочника в экранных формах, когда они выводятся не в табличном, а строковом виде;

SCRIPT_OBJ_ID (FK) – обработчик событий справочника (перед созданием, перед сохранением, после сохранения, перед удалением, после удаления), создается при необходимости;

IS_SMALL – флаг размера справочника, устанавливается в true для справочников с небольшим количеством строк. Флаг влияет на работу некоторых элементов управления (controls), ориентированных на работу со справочниками. Так, например, содержимое маленьких справочников выводится в элементах управления DictionaryLookupEdit и DictionaryMultiSelectEdit целиком, содержимое прочих фильтруется;

TRANSP_LOCALIZATION – флаг прозрачности локализации (true – справочник локализуется прозрачно, false – непрозрачно).

Локализация справочников подробно описана в следующем разделе.

table В таблице DICT_PROPERTIES описываются свойства справочника – по сути, поля его таблицы:

NAME – название свойства, определяет название свойства генерируемого класса;

CAPTION – отображаемое в экранных формах название свойства справочника, например, для свойства Name справочника контрагентов это может быть "Имя контрагента" или "Название контрагента";

DICT_OBJ_ID (FK) – ссылка на справочник, которому принадлежит свойство, заполняется автоматически при добавлении его в справочник;

COLUMN_NAME – название поля таблицы в прикладной схеме базы данных (на название поля СУБД Oracle накладывает те же ограничения, что и на таблицу);

TYPE_ID (FK) – тип свойства (подробнее см. раздел Типы данных);

CONTROL_ID (FK) – элемент управления, который будет использоваться по умолчанию в экранных формах для ввода значений этого свойства, выбирается из предлагаемых системой. Например, для строкового свойства это может быть строка, поле или строка для ввода пароля, скрывающая введенные символы;

STRING_SIZE – ограничивает длину строки, если в качестве типа свойства TYPE_ID выбран string или text;

IS_MULTILANGUAGE – флаг, указывающий требуется ли перевод для этого свойства;

IS_REQUIRED – флаг, указывающий обязательно ли свойство для заполнения;

DEFAULT_VALUE – значение свойства по умолчанию, которое подставляется автоматически при создании нового элемента справочника.

table В таблице PROP_TRANSLATIONS хранятся локализованные значения полей справочника:

OBJECT_ID (FK) – ссылка на локализуемое свойство справочника;

VALUE_ID – запись справочника в прикладной схеме базе данных, свойство которой локализуется;

LANG_ID (FK) – язык локализации;

STRING_VALUE – поле, предназначенное для хранения локализованного значения длинной не больше 4'000 символов;

CLOB_VALUE – поле, предназначенное для хранения локализованного значения длинной свыше 4'000 символов.

table Свойство справочника может быть ссылкой на другой справочник, взаимосвязи такого рода хранятся в таблице DICT_TOONEREFS:

NAME – название взаимосвязи, определяет название свойства генерируемого класса типа класса, на который оно ссылается;

CAPTION – отображаемое в экранных формах название взаимосвязи;

DICT_OBJ_ID (FK) справочник, свойство которого является ссылкой на другой справочник;

PROP_OBJ_ID (FK) – свойство, которое является ссылкой на другой справочник. В качестве значения типа этого свойства (TYPE_ID) должен быть выбран long;

REF_DICT_OBJ_ID (FK) – справочник, на который ссылается указанное свойство.

Кроме того, через таблицу DICT_TOONEREFS задается свойство-родитель для справочников древовидного типа. В этом случае значения DICT_OBJ_ID (FK) и REF_DICT_OBJ_ID (FK) совпадают.

output В результате заполнения всех обязательных атрибутов и свойств в прикладной схеме базы данных будет создана новая таблица TABLE_NAME с первичным ключом ID и полями COLUMN_NAME, которая будет использоваться для хранения данных нового справочника.

Кроме того, для каждой таблицы справочника создается представление, через которое производятся все операции чтения/записи. Представление необходимо для:

версионирования схемы СУБД;

поддержки часовых поясов;

прозрачной локализации мультиязычных свойств справочников.

35_example

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

Описываем атрибуты и свойства нового справочника "Товары". В результате в схеме ядра сохраняются следующие метаданные:

Dict_Example1

На их основании в прикладной схеме базы данных ядром создается таблица GOODS.

Dict_Example2

table В таблице LINK_TABLES хранятся атрибуты, которые описывают развязочную таблицу в прикладной схеме базы данных:

NAME – название развязочной таблицы, определяет название генерируемого класса;

CAPTION – отображаемое в экранных формах название развязочной таблицы, значение этого атрибута подставляется по умолчанию в соответствующее поле при заполнении связи с ней справочника;

TABLE_NAME – название таблицы в прикладной схеме базы данных.

table В таблице LINK_PROPERTIES описываются свойства развязочной таблицы – по сути, поля ее таблицы в прикладной схеме базы данных.

NAME – название свойства, определяет название свойства генерируемого класса;

CAPTION – отображаемое в экранных формах название свойства развязочной таблицы;

LINK_OBJ_ID (FK) – ссылка на развязочную таблицу, которой принадлежит свойство, заполняется автоматически при добавлении его в развязочную таблицу;

COLUMN_NAME – название поля таблицы в прикладной схеме базы данных;

TYPE_ID (FK) – тип свойства (подробнее см. раздел Типы данных);

CONTROL_ID (FK) – элемент управления, который будет использоваться по умолчанию в экранных формах для ввода значений этого свойства, выбирается из предлагаемых системой. Например, для строкового свойства это может быть строка, поле или строка для ввода пароля, скрывающая введенные символы;

STRING_SIZE – ограничивает длину строки, если в качестве типа свойства TYPE_ID выбран string или text;

IS_MULTILANGUAGE – флаг, указывающий требуется ли перевод для этого свойства;

IS_REQUIRED – флаг, указывающий обязательно ли свойство для заполнения;

DEFAULT_VALUE – значение свойства по умолчанию, которое подставляется автоматически при создании нового элемента развязочной таблицы;

IS_KEY – флаг, указывающий, что данное свойство является ключевым. Каждому набору ключевых свойств развязочной таблицы (помеченных флагом IS_KEY) соответствует только один набор значений остальных ее свойств. У каждой развязочной таблицы должно быть как минимум два ключевых свойства.

table Свойство развязочной таблицы может быть ссылкой на справочник, взаимосвязи такого рода хранятся в таблице LINK_TOONEREFS:

NAME – название взаимосвязи, определяет название свойства генерируемого класса типа класса, на который оно ссылается;

CAPTION – отображаемое в экранных формах название взаимосвязи;

LINK_OBJ_ID (FK) – развязочная таблица, свойство которой является ссылкой на справочник;

PROP_OBJ_ID (FK) – свойство развязочной таблицы, которое является ссылкой на справочник. В качестве значения типа этого свойства (TYPE_ID) должен быть выбран long;

REF_DICT_OBJ_ID (FK) – справочник, на который ссылается указанное свойство.

output В результате заполнения всех обязательных атрибутов и свойств в прикладной схеме базы данных будет создана новая таблица TABLE_NAME с полями COLUMN_NAME, которая будет использоваться для хранения данных развязочной таблицы.

table В таблице DICT_LINKTABLES хранятся взаимосвязи справочника с другими посредством развязочных таблиц:

NAME – название развязочной таблицы, определяет название свойства-коллекции генерируемого класса;

CAPTION – отображаемое в экранных формах название развязочной таблицы, подставляется по умолчанию из соответствующего атрибута LINK_TABLES, может быть изменено;

DICT_OBJ_ID (FK) – ссылка на редактируемый справочник, заполняется автоматически;

LINK_OBJ_ID (FK) – развязочная таблица, с которой будет связан редактируемый справочник;

PROP_OBJ_ID (FK) – поле развязочной таблицы, которому будет соответствовать идентификатор (ID) свойств редактируемого справочника.

output Развязочные таблицы не имеют собственного интерфейса редактирования данных, как, например, элементы справочников. В экранной форме редактирования элементов справочника, который мы связываем с помощью развязочных таблиц с другим, автоматически создастся закладка с названием, заданным в атрибуте CAPTION, на которой будет возможно задавать отношения элементов текущего справочника с элементами, заданными в развязочной таблице LINK_OBJ_ID (FK), и редактировать связанные с ними переменные.

table В таблице DICT_TOMANYREFS описываются взаимосвязи справочника с другими через отношения многие ко многим и соответствующая им таблица в прикладной схеме базы данных:

NAME – название ссылки ко многим, определяет название свойства коллекции генерируемого класса;

CAPTION – отображаемое в экранных формах название ссылки ко многим;

DICT_OBJ_ID (FK) – ссылка на создаваемый (редактируемый) справочник, заполняется автоматически;

TABLE_NAME – название таблицы ссылок ко многим в прикладной схеме базы данных;

COLUMN_NAME – свойство (поле) таблицы ссылок ко многим, по которому создаваемый (редактируемый) справочник будет связан с другим;

REF_DICT_OBJ_ID (FK) – ссылка на другой справочник, с которым будет связан создаваемый (редактируемый);

REF_COLUMN_NAME – свойство (поле) таблицы ссылок ко многим, с которым будет связан другой справочник.

output В результате заполнения всех свойств в прикладной схеме базе данных будет создана новая таблица (ссылок ко многим) с именем TABLE_NAME и двумя полями COLUMN_NAME и REF_COLUMN_NAME, ссылающимися на ключевые поля двух справочников DICT_OBJ_ID (FK) и REF_DICT_OBJ_ID (FK).

Таблицы отношений многие ко многим так же, как и развязочные таблицы, не имеют собственного интерфейса редактирования данных. Связывая текущий справочник ссылками ко многим с другим, мы тем самым автоматически создаем в его экранной форме закладку с названием, заданным в атрибуте CAPTION, на которой будет возможно задавать отношения элементов текущего справочника с элементами справочника REF_DICT_OBJ_ID (FK).