IMsDimIteratorLinks.CustomLinker

Синтаксис Fore

CustomLinker: IMsDimCustomLinker;

Синтаксис Fore.NET

CustomLinker: Prognoz.Platform.Interop.Ms.IMsDimCustomLinker;

Описание

Свойство CustomLinker определяет пользовательский механизм связывания измерений.

Комментарии

Пользовательский механизм должен быть реализован в виде класса, наследующего все методы от IMsDimCustomLinker.

Пример Fore

Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS», содержащего задачу моделирования с идентификатором «PROBLEM_MULTIDIMITERATOR». Данная задача должна рассчитывать метамодель, содержащую только многомерный итератор. Также в репозитории предполагается наличие базы данных временных рядов с идентификатором «TSDB_STAT», содержащей атрибут «INDICATOR», являющийся ссылкой на справочник.

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

Sub UserProc;
Var
    mb: IMetabase;
    MsKey: Integer;
    Problem: IMsProblem;
    MM: IMsMetaModel;
    Iterator: IMsCalculationChainMultiDimIterator;
    IterDim: IMsDimIteratorDimension;
    Links: IMsDimIteratorLinks;
    DSLinked: IRubricator;
    Attributes: IMetaAttributes;
    dimLinked: IDimInstance;
    IDimLink: IMsDimIteratorLink;
    ml: MLinker;
    Calculation: IMsProblemCalculation;
    CalcSettings: IMsProblemCalculationSettings;
Begin
    // Получаем текущий репозиторий
    mb := MetabaseClass.Active;
    // Получаем ключ контейнера моделирования
    MsKey := mb.GetObjectKeyById("MS");
    // Получаем задачу моделирования
    Problem := mb.ItemByIdNamespace("PROBLEM_MULTIDIMITERATOR", MsKey).Bind As IMsProblem;
    // Получаем метамодель, рассчитываемую задачей
    MM := Problem.EditMetaModel;
    // Получаем многомерный итератор
    Iterator := MM.CalculationChain.Item(0As IMsCalculationChainMultiDimIterator;
    // Получаем связи первого измерения итератора
    IterDim := Iterator.Dimensions.Item(0);
    Links := IterDim.Links;
    // Удаляем существующие связи
    Links.Clear;
    // Получаем базу данных временных рядов TSDB_STAT
    DSLinked := mb.ItemById("TSDB_STAT").Bind As IRubricator;
    // Получаем справочник, на котором основан атрибут INDICATOR
    Attributes := DSLinked.Facts.Attributes;
    dimLinked := Attributes.FindById("INDICATOR").ValuesObject.Open(NullAs IDimInstance;
    // Добавляем справочник в качестве связанного измерения
    IDimLink := Links.Add(dimLinked);
    // Указываем источник данных связанного измерения
    IDimLink.Dimension.Stubs.Add(DSLinked As IVariableStub);
    // Указываем атрибут-приёмник
    IDimLink.DestinationAttribute := dimLinked.Attributes.FindById("NAME").Attribute;
    // Выводим наименование управляющего измерения в окно консоли
    Debug.WriteLine("Управляющее измерение: " + IDimLink.Owner.Name);
    // Создаем пользовательский механизм связывания измерений
    ml := New MLinker.Create;
    Links.CustomLinker := ml;
    // Создаем параметры расчёта задачи
    CalcSettings := Problem.CreateCalculationSettings;
    Calculation := Problem.Calculate(CalcSettings);
    // Выполняем расчёт
    Calculation.Run;
End Sub UserProc;

// Класс, реализующий пользовательский механизм связывания
Public Class MLinker: Object, IMsDimCustomLinker
    
    Public Function ResolveLink(Source: IMsDimIteratorDimension; Destination: IMsDimIteratorDimension;
        CurrentSelection: IDimSelectionSet; Var SkipCustomLink: boolean): integer;
    Var
        i: Integer;
    Begin
        SkipCustomLink := False;
        Debug.WriteLine("Источник: " + Source.Name);
        Debug.WriteLine("Приёмник: " + Destination.Name);
        Debug.WriteLine("Отметка:");
        Debug.Indent;
        For i := 0 To CurrentSelection.Count - 1 Do
            Debug.Write(CurrentSelection.Item(i).Dimension.Name + ": ");
            Debug.WriteLine(CurrentSelection.Item(i).ToString);
        End For;
        Debug.Unindent;
        Return 1;
    End Function ResolveLink;
    
End Class MLinker;

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

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.Rds;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    MsKey: uinteger;
    Problem: IMsProblem;
    MM: IMsMetaModel;
    Iterator: IMsCalculationChainMultiDimIterator;
    IterDim: IMsDimIteratorDimension;
    Links: IMsDimIteratorLinks;
    DSLinked: IRubricator;
    Attributes: IMetaAttributes;
    dimLinked: IDimInstance;
    IDimLink: IMsDimIteratorLink;
    ml: MLinker;
    Calculation: IMsProblemCalculation;
    CalcSettings: IMsProblemCalculationSettings;
Begin
    // Получаем текущий репозиторий
    mb := Params.Metabase;
    // Получаем ключ контейнера моделирования
    MsKey := mb.GetObjectKeyById("MS");
    // Получаем задачу моделирования
    Problem := mb.ItemByIdNamespace["PROBLEM_MULTIDIMITERATOR", MsKey].Bind() As IMsProblem;
    // Получаем метамодель, рассчитываемую задачей
    MM := Problem.EditMetaModel;
    // Получаем многомерный итератор
    Iterator := MM.CalculationChain.Item[0As IMsCalculationChainMultiDimIterator;
    // Получаем связи первого измерения итератора
    IterDim := Iterator.Dimensions.Item[0];
    Links := IterDim.Links;
    // Удаляем существующие связи
    Links.Clear();
    // Получаем базу данных временных рядов TSDB_STAT
    DSLinked := mb.ItemById["TSDB_STAT"].Bind() As IRubricator;
    // Получаем справочник, на котором основан атрибут INDICATOR
    Attributes := DSLinked.Facts.Attributes;
    dimLinked := Attributes.FindById("INDICATOR").ValuesObject.Open(NullAs IDimInstance;
    // Добавляем справочник в качестве связанного измерения
    IDimLink := Links.Add(dimLinked);
    // Указываем источник данных связанного измерения
    IDimLink.Dimension.Stubs.Add(DSLinked As IVariableStub);
    // Указываем атрибут-приёмник
    IDimLink.DestinationAttribute := dimLinked.Attributes.FindById("NAME").Attribute;
    // Выводим наименование управляющего измерения в окно консоли
    System.Diagnostics.Debug.WriteLine("Управляющее измерение: " + IDimLink.Owner.Name);
    // Создаем пользовательский механизм связывания измерений
    ml := New MLinker.Create();
    Links.CustomLinker := ml;
    // Создаем параметры расчёта задачи
    CalcSettings := Problem.CreateCalculationSettings();
    Calculation := Problem.Calculate(CalcSettings);
    // Выполняем расчёт
    Calculation.Run();
End Sub;

// Класс, реализующий пользовательский механизм связывания
Public Class MLinker: Object, IMsDimCustomLinker
    
    Public Function ResolveLink(Source: IMsDimIteratorDimension; Destination: IMsDimIteratorDimension;
        CurrentSelection: IDimSelectionSet; Var SkipCustomLink: boolean): System.UInt32;
    Var
        i: Integer;
    Begin
        SkipCustomLink := False;
        System.Diagnostics.Debug.WriteLine("Источник: " + Source.Name);
        System.Diagnostics.Debug.WriteLine("Приёмник: " + Destination.Name);
        System.Diagnostics.Debug.WriteLine("Отметка:");
        System.Diagnostics.Debug.Indent();
        For i := 0 To CurrentSelection.Count - 1 Do
            System.Diagnostics.Debug.Write(CurrentSelection.Item[i].Dimension.Name + ": ");
            System.Diagnostics.Debug.WriteLine(CurrentSelection.Item[i].ToString(""","False));
        End For;
        System.Diagnostics.Debug.Unindent();
        Return 1;
    End Function ResolveLink;
    
End Class MLinker;

См. также:

IMsDimIteratorLinks