Измерение фактов является неотъемлемой частью различных видов кубов. При настройке привязки элементов измерения фактов в кубах определяется место фактического хранения значений по различным показателям. В разных видах кубов используются разные виды измерения фактов. В данном разделе мы рассмотрим работу с локальным измерением фактов куба.
Локальное измерение фактов доступно для использования в стандартных и вычисляемых кубах. В основе локального измерения фактов лежит конструируемый справочник, который создается как скрытый дочерний объект куба. Интерфейс IDimensionModel можно использовать для просмотра информации о структуре измерения фактов. Для редактирования структуры и настройки дерева элементов предназначен интерфейс ICustomDimension.
Пример доступа к структуре локального измерения фактов в стандартном кубе:
Var
//...
MB: IMetabase;
StdCube: IStandardCube;
CalcCube: ICalculatedCube;
FactDim: ICustomDimension;
//...
Begin
//...
MB := MetabaseClass.Active;
StdCube := MB.ItemById("StdCube_1").Edit As IStandardCube;
//Установка признака использования локального измерения фактов в кубе
StdCube.ExternalFactDimension := False;
//Получение структуры локального измерения фактов
FactDim := StdCube.FactDimension.Dimension As ICustomDimension;
//...
Пример доступа к структуре локального измерения фактов в вычисляемом кубе:
Var
//...
MB: IMetabase;
CalcCube: ICalculatedCube;
FactDim: ICustomDimension;
//...
Begin
//...
MB := MetabaseClass.Active;
CalcCube := MB.ItemById("CalcCube_1").Edit As ICalculatedCube;
//Установка признака использования локального измерения фактов в кубе
CalcCube.ExternalFactDimension := False;
//Получение структуры локального измерения фактов
FactDim := CalcCube.InternalFactDimension;
//...
В измерении фактов автоматически создаются три базовых атрибута:
Индекс атрибута | Идентификатор атрибута | Наименование атрибута | Назначение атрибута |
0 | KEY | Ключ | Идентификатор, Первичный ключ |
1 | NAME | Наименование | Наименование |
2 | ORDER | Порядок | Порядок |
При необходимости список атрибутов можно изменить. Для работы с коллекций атрибутов измерения фактов предназначен интерфейс ICustomDimAttributes.
Var
//...
FactDim: ICustomDimension;
CAttrs: ICustomDimAttributes;
CAttr: ICustomDimAttribute;
//...
Begin
//...
CAttrs := FactDim.Attributes;
CAttr := CAttrs.Add;
CAttr.Id := "IMAGEATTR";
CAttr.Name := "Пиктограмма элемента";
CAttr.DataType := DbDataType.Integer;
CAttrs.ImageIndex := CAttr;
//...
Примечание. Если в измерении фактов изменяется набор базовых атрибутов, то для дальнейшей корректной работы измерения фактов обязательно должны быть созданы и назначены атрибуты: Идентификатор, Первичный ключ, Наименование, Порядок. После пересоздания какого-либо базового атрибута для всех элементов должны быть выставлены новые значения по этому атрибуту.
Пример пересоздания базового атрибута:
Var
//...
FactDim: ICustomDimension;
Attrs: ICustomDimAttributes;
Attr: ICustomDimAttribute;
Elements: ICustomDimElements;
Element: Integer;
//...
Begin
//...
//Получение списка атрибутов
Attrs := FactDim.Attributes;
//Создание нового атрибута
Attr := Attrs.Add;
Attr.DataType := DbDataType.Integer;
Attr.Id := "UserKey";
Attr.Name := "Пользовательский первичный ключ";
//Использовать новый атрибут в качестве первичного ключа
Attrs.Primary := Attr;
//Получение списка существующих элементов
Elements := FactDim.Elements;
For Element := 0 To Elements.RowCount - 1 Do
//По новому первичному ключу необходимо задать новые уникальные значения
//Так как атрибуты добавляются в конец списка, то значение будет задаваться
//по последнему атрибуту
Elements.AttributeValue(Element, Elements.AttributeCount - 1) := 1000 + Element;
End For;
//...
Для работы с коллекцией уровней измерения фактов предназначен интерфейс ICustomDimLevels.
Var
//...
CustDim: ICustomDimension;
CustLevels: ICustomDimLevels;
CustLevel: ICustomDimLevel;
//...
Begin
//...
//Список уровней
CustLevels := CustDim.Levels;
CustLevels.Clear;
CustLevel := CustLevels.Add;
CustLevel.Id := "LVL1";
CustLevel.Name := "Первый уровень";
CustLevel := CustLevels.Add;
CustLevel.Id := "LVL2";
CustLevel.Name := "Второй уровень";
//...
Также для автоматической организации списка уровней в соответствии с существующей иерархией элементов можно использовать метод OrganizeLevels.
Работа с элементами измерения фактов заключается в организации иерархии элементов и установке значений атрибутов. Список элементов доступен в виде коллекции, либо в виде дерева.
Для получения списка элементов измерения фактов в виде коллекции предназначено свойство Elements. Каждый элемент располагается в отдельной строке. Новые элементы создаются на самом верхнем уровне иерархии. Для создания новых элементов предназначен метод Add. После создания элемента необходимо с помощью свойства AttributeValue определить значения всех атрибутов. Для настройки иерархии элементов в коллекции используется свойство Owner.
Var
//...
CustDim: ICustomDimension;
Elements: ICustomDimElements;
Row: Integer;
//...
Begin
//...
//Коллекция элементов
Elements := CustDim.Elements;
//Создание нового элемента
Row := Elements.Add;
//Установка значений атрибутов. Предполагается, что список атрибутов не изменялся
Elements.AttributeValue(Row, 0) := Row;
Elements.AttributeValue(Row, 1) := "Новые значения";
Elements.AttributeValue(Row, 2) := Row;
//...
Для получения списка элементов измерения фактов в виде дерева предназначено свойство Tree. Список корневых элементов доступен в свойстве RootChildren. Для настройки иерархии существующих элементов используется свойство Owner. При создании новых элементов в методе Add также указывается первичный ключ родительского элемента. После создания элемента необходимо с помощью свойства AttributeValue определить значения всех атрибутов.
Var
//...
CustDim: ICustomDimension;
Tree: ICustomDimTree;
Root, Child: Integer;
//...
Begin
//...
//Дерево элементов
Tree := CustDim.Tree;
//Создание корневого элемента
Root := Tree.Add(Null);
//Установка значений атрибутов. Предполагается, что список атрибутов не изменялся
Tree.AttributeValue(Root, 0) := Root;
Tree.AttributeValue(Root, 1) := "Корневой элемент";
Tree.AttributeValue(Root, 2) := Root;
//Создание дочернего элемента
Child := Tree.Add(Root);
//Установка значений атрибутов. Предполагается, что список атрибутов не изменялся
Tree.AttributeValue(Child, 0) := Child;
Tree.AttributeValue(Child, 1) := "Дочерний элемент";
Tree.AttributeValue(Child, 2) := Child;
//...
См. также: