Переменная моделирования

При создании и работе с переменной следует учитывать следующие особенности:

Для работы с созданной переменной через язык Fore предназначен интерфейс IMsVariable. Используя его свойства и методы можно осуществить загрузку данных в переменную, добавить в нее дополнительные измерения, изменить календарную динамику и настроить прочие параметры.

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

При использовании переменной в расчетах она должна быть представлена как абстрактный источник данных или как терм.

Для использования переменной как абстрактного источника данных, ее нужно привести к интерфейсу IVariableStub:

Sub Main;

Var

VarStub: IVariableStub;

MsVar: IMsVariable;

Begin

VarStub := MsVar As IVariableStub;

End Sub Main;

После данного действия переменную можно добавлять в коллекцию входных или выходных переменных модели, реализуемую интерфейсом IMsFormulaTransformVariables:

Sub Main;

Var

Model: IMsModel;

ModelTransform: IMsFormulaTransform;

OutputsVar: IMsFormulaTransformVariables;

VarStub: IVariableStub;

TransformVariable: IMsFormulaTransformVariable;

Begin

ModelTransform := Model.Transform;

OutputsVar := ModelTransform.Outputs;

TransformVariable := InputsVar.Add(VarStub);

End Sub Main;

Если переменная добавлена в коллекцию входных/выходных переменных, то ее можно представить как терм, реализуемый интерфейсом IMsFormulaTermInfo:

Sub Main;

Var

Model: IMsModel;

ModelTransform: IMsFormulaTransform;

VarStub: IVariableStub;

TransformVariable: IMsFormulaTransformVariable;

Slice: IMsFormulaTransformSlice;

TermInfo: IMsFormulaTermInfo;

Begin

ModelTransform := Model.Transform;

TransformVariable := ModelTransform.Outputs.Add(VarStub);

Slice := TransformVariable.Slices.Add(Null);

TermInfo := ModelTransform.CreateTermInfo;

TermInfo.Slice := Slice;

End Sub Main;

Используя свойства и методы интерфейса IMsFormulaTermInfo можно определить тип передачи терма в расчет, задать начальное преобразование терма и настроить прочие параметры.

Создание переменных

Для создания модели сальдо торгового баланса необходимы:

Для выполнения модуля по созданию переменной «Экспорт - всего, млрд.долл.США» необходимо добавить ссылки на сборки «Ms» и «Metabase».

Sub Main;

Var

MB: IMetabase;

CrInfo: IMetabaseObjectCreateInfo;

MObj: IMetabaseObject;

Begin

MB := MetabaseClass.Active;

// Задаем параметры создания переменной

CrInfo := MB.CreateCreateInfo;

CrInfo.ClassID := MetabaseObjectClass.KE_CLASS_MSVARIABLE;

// Задаем идентификатор переменной

CrInfo.Id := "EXPORT";

// Задаем наименование переменной

CrInfo.Name := "Экспорт - всего, млрд.долл.США";

// Задаем контейнер моделирования для переменной

CrInfo.Parent := MB.ItemById("MODEL_SPACE");

// Создаем и сохраняем переменную

MObj := MB.CreateObject(CrInfo).Edit;

MObj.Save;

// Вывод информации о переменной в окно консоли

Debug.WriteLine("Создана переменная '" + MObj.Name + "' с идентификатором '" + MObj.Id + "'");

End Sub Main;

После выполнения модуля будет создана переменная «Экспорт - всего, млрд.долл.США» с идентификатором «EXPORT», информация об этом будет выведена в окно консоли.

Далее аналогичным образом создайте переменную «Импорт - всего, млрд.долл.США» с идентификатором «IMPORT» и переменную «Сальдо торгового баланса, млрд.долл.США» с идентификатором «BALANCE».

Следующим шагом является наполнение начальными данными переменных «Экспорт - всего, млрд.долл.США» и «Импорт - всего, млрд.долл.США». По умолчанию все созданные переменные имеют годовую динамику. Именно для нее и будут вводиться данные.

Для выполнения модуля по наполнению начальными данными переменной «Экспорт - всего, млрд.долл.США» необходимо добавить ссылки на сборки «Ms», «Metabase», «Cubes», «Dimensions», «Matrix», «MathFin».

Sub Main;

Var

MB: IMetabase;

ModelSp: IMetabaseObjectDescriptor;

MObj: IMetabaseObject;

MsVar: IMsVariable;

Cube: IAutoCube;

CubeInst: ICubeInstance;

Des: ICubeInstanceDestination;

DimSS: IDimSelectionSet;

DimS: IDimSelection;

Elem: IDimElementArray;

Mat: IMatrix;

Coord: IMatrixCoord;

Sto: ICubeInstanceStorage;

i: Integer;

Begin

// Задаем переменную моделирования, которая должна быть наполнена данными

MB := MetabaseClass.Active;

ModelSp := MB.ItemById("MODEL_SPACE");

MObj := MB.ItemByIdNamespace("EXPORT", ModelSp.Key).Edit;

MsVar := MObj As IMsVariable;

// Устанавливаем способ наполнения данными - вручную

MsVar.DataFillType := MsVariableDataFillType.Manual;

// Получаем представление переменной в экспресс-анализе

Cube := MsVar.Cube;

CubeInst := (Cube As IMetabaseObject).Open(Null) As ICubeInstance;

Des := CubeInst.Destinations.DefaultDestination;

DimSS := Des.CreateDimSelectionSet;

// Отмечаем динамику, для которой будут указываться данные: Годы

DimS := DimSS.Item(0);

Elem := DimS.Dimension.Levels.Item(0).Elements;

For Each i In Elem Do

DimS.SelectElement(i, False);

End For;

// Отмечаем сценарный справочник «Факт»

DimSS.Item(1).SelectAll;

// Получаем пустую матрицу данных переменной

Mat := Des.Execute(DimSS);

Mat.ValueFlag := Mat.ValueFlag + 1;

Coord := Mat.CreateCoord;

Coord.Item(1) := 0;

// Заполняем матрицу случайными числами из диапазона [50; 100]

Debug.WriteLine("Данные переменной '" + MObj.Name + "':");

For Each i In Elem Do

Coord.Item(0) := i;

Mat.Item(Coord) := Math.RandBetween(50, 100);

Debug.WriteLine(Mat.Item(Coord));

End For;

// Сохраняем данные переменной

Sto := Des.CreateStorage;

Sto.SaveMatrix(Mat, Mat.ValueFlag);

MObj.Save;

End Sub Main;

После выполнения модуля переменная «Экспорт - всего, млрд.долл.США» будет наполнена данными: случайные числа из диапазона [50; 100]. Эти данные будут выведены в окно консоли.

Аналогичным образом наполните данными переменную «Импорт - всего, млрд.долл.США». Переменная «Сальдо торгового баланса, млрд.долл.США» будет содержать результаты расчета, поэтому данные в нее загружать не требуется.

Следующим шагом будет создание модели.

См. также:

Общие принципы программирования с использованием сборки Ms