CustomLinker: IMsDimCustomLinker;
CustomLinker: Prognoz.Platform.Interop.Ms.IMsDimCustomLinker;
Свойство CustomLinker определяет пользовательский механизм связывания измерений.
Пользовательский механизм должен быть реализован в виде класса, наследующего все методы от IMsDimCustomLinker.
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «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(0) As 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(Null) As 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.
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[0] As 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(Null) As 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;
См. также: