Получение ключей атрибутов временных рядов, входящих в иерархию

Для выполнения примера в репозитории предполагается наличие базы данных временных рядов с идентификатором «TSDB».

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

Пример Fore

Добавьте ссылки на системные сборки: Cubes, Metabase, Orm, Rds.

Sub MetaMembersKey;
Var
    mb: IMetabase;
    Rubricator: IRubricator;
    Facts: IMetaDictionary;
    pHierarchy: IMetaHierarchy;
    pHierarchyAttributes: IMetaHierarchyAttributes;
    pLevel: IMetaHierarchyLevel;
    Members: IMetaMembers;
    FactsInst: IMetaDictionaryInstance;
    i, ind: Integer;
    AtrSet: IMetaAttributesSet;
    Attr: IMetaAttribute;
    cur: IMetaMember;
    id, name: String;
    Tuple: IOrmRecord;
Begin
    // Получаем репозиторий
    mb := MetabaseClass.Active;
    // Получаем базу данных временных рядов
    Rubricator := mb.ItemById("TSDB").Bind As IRubricator;
    // Получаем справочник временных рядов
    Facts := Rubricator.Facts;
    // Получаем иерархию временных рядов
    pHierarchy := Facts.DefaultHierarchy;
    // Получаем атрибуты, входящие в иерархию
    pHierarchyAttributes := pHierarchy.Attributes;
    // Получаем листьевой уровень иерархии
    pLevel := pHierarchy.Levels.Leaf;
    // Указываем, что уровень не включает все элементы
    pLevel.IncludeAll := False;
    // Перемещаем все атрибуты иерархии на листьевой уровень
    pHierarchyAttributes.MoveAllTo(pHierarchyAttributes, pLevel);
    // Получаем экземпляр справочника временных рядов
    FactsInst := (Facts As IMetabaseObject).Open(NullAs IMetaDictionaryInstance;
    // Получаем корневые элементы иерархии временных рядов
    Members := FactsInst.OpenHierarchy(pHierarchy).GetRootMembers;
    If Members <> Null Then
        // Сбрасываем текущее положение курсора в иерархии
        Members.Reset;
        // Получаем текущий элемент иерархии
        Cur := Members.Current;
        Debug.WriteLine("Значения атрибутов временных рядов:");
        // Перебираем все элементы иерархии
        While Not Members.Eof Do
            Debug.WriteLine("");
            // Получаем атрибуты элемента иерархии
            AtrSet := Cur.Attributes;
            // Перебираем атрибуты элемента иерархии
            For i := 0 To AtrSet.Count - 1 Do
                // Получаем текущий атрибут
                Attr := AtrSet.Item(i);
                // Получаем идентификатор и наименование атрибута
                id := Attr.Id;
                name := Attr.Name;
                // Получаем системную запись, соответствующую текущему элементу иерархии
                Tuple := cur.Tuple;
                // Получаем индекс атрибута
                ind := Tuple.FindAttribute(id);
                // Получаем значение атрибута и выводим его в окно консоли
                Debug.WriteLine(name + " = " + Tuple.AttributeValue(ind));
            End For;
            // Переходим к следующему элементу иерархии
            Members.Next;
        End While;
    End If;
End Sub MetaMembersKey;

Пример Fore.NET

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Orm;
Imports Prognoz.Platform.Interop.Rds;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    Rubricator: IRubricator;
    Facts: IMetaDictionary;
    pHierarchy: IMetaHierarchy;
    pHierarchyAttributes: IMetaHierarchyAttributes;
    pLevel: IMetaHierarchyLevel;
    Members: IMetaMembers;
    FactsInst: IMetaDictionaryInstance;
    i, ind: Integer;
    AtrSet: IMetaAttributesSet;
    Attr: IMetaAttribute;
    cur: IMetaMember;
    id, name: String;
    Tuple: IOrmRecord;
Begin
    // Получаем репозиторий
    mb := Params.Metabase;
    // Получаем базу данных временных рядов
    Rubricator := mb.ItemById["TSDB"].Bind() As IRubricator;
    // Получаем справочник временных рядов
    Facts := Rubricator.Facts;
    // Получаем иерархию временных рядов
    pHierarchy := Facts.DefaultHierarchy;
    // Получаем атрибуты, входящие в иерархию
    pHierarchyAttributes := pHierarchy.Attributes;
    // Получаем листьевой уровень иерархии
    pLevel := pHierarchy.Levels.Leaf;
    // Указываем, что уровень не включает все элементы
    pLevel.IncludeAll := False;
    // Перемещаем все атрибуты иерархии на листьевой уровень
    pHierarchyAttributes.MoveAllTo(pHierarchyAttributes, pLevel, -1False);
    // Получаем экземпляр справочника временных рядов
    FactsInst := (Facts As IMetabaseObject).Open(NullAs IMetaDictionaryInstance;
    // Получаем корневые элементы иерархии временных рядов
    Members := FactsInst.OpenHierarchy(pHierarchy).GetRootMembers();
    If Members <> Null Then
        // Сбрасываем текущее положение курсора в иерархии
        Members.Reset();
        // Получаем текущий элемент иерархии
        Cur := Members.Current();
        System.Diagnostics.Debug.WriteLine("Значения атрибутов временных рядов:");
        // Перебираем все элементы иерархии
        While Not Members.Eof() Do
            System.Diagnostics.Debug.WriteLine("");
            // Получаем атрибуты элемента иерархии
            AtrSet := Cur.Attributes;
            // Перебираем атрибуты элемента иерархии
            For i := 0 To AtrSet.Count - 1 Do
                // Получаем текущий атрибут
                Attr := AtrSet.Item[i];
                // Получаем идентификатор и наименование атрибута
                id := Attr.Id;
                name := Attr.Name;
                // Получаем системную запись, соответствующую текущему элементу иерархии
                Tuple := cur.Tuple;
                // Получаем индекс атрибута
                ind := Tuple.FindAttribute(id);
                // Получаем значение атрибута и выводим его в окно консоли
                System.Diagnostics.Debug.WriteLine(name + " = " + Tuple.AttributeValue[ind]);
            End For;
            // Переходим к следующему элементу иерархии
            Members.Next();
        End While;
    End If;
End Sub;

См. также:

Примеры