Transform: IMsFormulaTransform;
Transform: Prognoz.Platform.Interop.Ms.IMsFormulaTransform;
Свойство Transform возвращает параметры настройки сложного условия расчёта.
По умолчанию параметры содержат одну формулу с годовой динамикой. Для её получения используйте свойство IMsFormulaTransform.FormulaItem. После формирования формулы она будет автоматически разобрана и установлена в свойство IMsBranchConditionExpression.Expression.
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MODEL_SPACE», в котором содержатся модели с идентификаторами «USER_MODEL», «DEFAULT_MODEL» и метамодель с идентификатором «USER_META_MODEL». Метамодель должна содержать целочисленный параметр с наименованием «indicator_param».
Добавьте ссылки на системные сборки «Dimensions», «Metabase», «Ms».
Sub UserTransformation;
Var
pMetabase: IMetabase;
pMSKey: Integer;
pMeta: IMsMetaModel;
pBranch: IMsCalculationChainBranch;
pModel_a, pModel_b: IMsModel;
pCase: IMsBranchCase;
pCond: IMsBranchConditionExpression;
pTransf: IMsFormulaTransform;
pMethod: IMsDeterministicTransform;
Begin
pMetabase := MetabaseClass.Active;
//Получаем ключ контейнера моделирования
pMSKey := pMetabase.GetObjectKeyById("MODEL_SPACE");
// Получаем метамодель
pMeta := pMetabase.ItemByIdNamespace("USER_META_MODEL", pMSKey).Edit As IMsMetaModel;
// Очищаем цепочку расчёта метамодели
pMeta.CalculationChain.Clear;
// Создаем условие расчёта метамодели
pBranch := pMeta.CalculationChain.AddBranch("Условие расчёта");
// Задаем календарную динамику условия
pBranch.Level := DimCalendarLevel.Year;
// Получаем модель «DEFAULT_MODEL»
pModel_a := pMetabase.ItemByIdNamespace("DEFAULT_MODEL", pMSKey).Bind As IMsModel;
// Добавляем модель в условие
pBranch.DefaultContents.AddModel(pModel_a);
// Получаем модель «USER_MODEL»
pModel_b := pMetabase.ItemByIdNamespace("USER_MODEL", pMSKey).Bind As IMsModel;
// Создаем новую ветку условия
pCase := pBranch.CaseList.Add;
// Добавляем модель «USER_MODEL» в новую ветку
pCase.Contents.AddModel(pModel_b);
// Создаем условие расчёта ветки
pCond := pCase.Conditions.Add(MsBranchConditionType.Expression) As IMsBranchConditionExpression;
pTransf := pCond.Transform;
pMethod := pTransf.FormulaItem(0).Method As IMsDeterministicTransform;
pMethod.Expression.AsString := "{indicator_param[t]} = 3";
// Сохраняем метамодель
(pMeta As IMetabaseObject).Save;
End Sub UserTransformation;
После выполнения примера в метамодель будет добавлено условие расчета: значение параметра метамодели должно быть равно трем. При расчете задачи трансформации будет проверяться условие: если оно выполняется, то рассчитывается модель «USER_MODEL», если не выполняется - модель «DEFAULT_MODEL».
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Ms;
…
Public Shared Sub Main(Params: StartParams);
Var
pMetabase: IMetabase;
pMSKey: uinteger;
pMeta: IMsMetaModel;
pBranch: IMsCalculationChainBranch;
pModel_a, pModel_b: IMsModel;
pCase: IMsBranchCase;
pCond: IMsBranchConditionExpression;
pTransf: IMsFormulaTransform;
pMethod: IMsDeterministicTransform;
Begin
pMetabase := Params.Metabase;
//Получаем ключ контейнера моделирования
pMSKey := pMetabase.GetObjectKeyById("MODEL_SPACE");
// Получаем метамодель
pMeta := pMetabase.ItemByIdNamespace["USER_META_MODEL", pMSKey].Edit() As IMsMetaModel;
// Очищаем цепочку расчёта метамодели
pMeta.CalculationChain.Clear();
// Создаем условие расчёта метамодели
pBranch := pMeta.CalculationChain.AddBranch("Условие расчёта");
// Задаем календарную динамику условия
pBranch.Level := DimCalendarLevel.dclYear;
// Получаем модель «DEFAULT_MODEL»
pModel_a := pMetabase.ItemByIdNamespace["DEFAULT_MODEL", pMSKey].Bind() As IMsModel;
// Добавляем модель в условие
pBranch.DefaultContents.AddModel(pModel_a);
// Получаем модель «USER_MODEL»
pModel_b := pMetabase.ItemByIdNamespace["USER_MODEL", pMSKey].Bind() As IMsModel;
// Создаем новую ветку условия
pCase := pBranch.CaseList.Add();
// Добавляем модель «USER_MODEL» в новую ветку
pCase.Contents.AddModel(pModel_b);
// Создаем условие расчёта ветки
pCond := pCase.Conditions.Add(MsBranchConditionType.mbctExpression) As IMsBranchConditionExpression;
pTransf := pCond.Transform;
pMethod := pTransf.FormulaItem[0].Method As IMsDeterministicTransform;
pMethod.Expression.AsString := "{indicator_param[t]} = 3";
// Сохраняем метамодель
(pMeta As IMetabaseObject).Save();
End Sub;
См. также: