ResultsViewScenario: Integer;
ResultsViewScenario: integer;
Свойство ResultsViewScenario определяет ключ сценария, по которому рассчитывается модель.
Для расчёта по сценарию «Факт» установите в ResultsViewScenario значение «-1».
Для выполнения примера предполагается наличие формы, содержащей компонент UiModel с идентификатором «UiModel1» и компонент ModelBox с идентификатором «ModelBox1». «UiModel1» является источником данных для «ModelBox1». В репозитории предполагается наличие контейнера моделирования с идентификатором «MODEL_SPACE», содержащего задачу моделирования с идентификатором «PROBLEM». Задача моделирования должна содержать несколько сценариев и рассчитывать несколько моделей.
Добавьте ссылку на системную сборку «Metabase».
Sub UserProc;
Var
mb: IMetabase;
MsObj: IMetabaseObjectDescriptor;
ms: IMsModelSpace;
Problem: IMsProblem;
MetaModel: IMsMetaModel;
CalcChain: IMsCalculationChainEntries;
i: Integer;
CalcChainEntry: IMsCalculationChainEntry;
Scenarios: IMsProblemScenarios;
ScenKey: integer;
ScenTree: IMsScenarioTreeEntries;
ScenEntry: IMsScenarioTreeEntry;
Begin
UiModel1.Active := False;
mb := MetabaseClass.Active;
// Получаем контейнер моделирования
MsObj := mb.ItemById("MODEL_SPACE");
ms := MsObj.Bind As IMsModelSpace;
// Получаем задачу моделирования
Problem := mb.ItemByIdNamespace("PROBLEM", MsObj.Key).Bind As IMsProblem;
// Получаем метамодель, рассчитываемую задачей
MetaModel := Problem.MetaModel;
// Получаем цепочку расчёта метамодели
CalcChain := MetaModel.CalculationChain;
// Получаем первую модель в цепочке расчёта
For i := 0 To CalcChain.Count - 1 Do
CalcChainEntry := CalcChain.Item(i);
If CalcChainEntry.Type = MsCalculationChainEntryType.Model Then
// Используем модель в качестве источника данных для UiModel1
UiModel1.Model := (CalcChainEntry As IMsCalculationChainModel).Model;
UiModel1.Active := True;
Break;
End If;
End For;
// Получаем сценарии, по которым рассчитывается задача моделирования
Scenarios := Problem.Scenarios;
// Получаем 2-й сценарий задачи моделирования
ScenKey := Scenarios.Item(1).InternalKey;
// Получаем ключ 2-го сценария
ScenTree := ms.ScenarioTree;
ScenEntry := ScenTree.FindByInternalKey(ScenKey);
// Указываем, что модель рассчитывается по 2-му сценарию
ModelBox1.ResultsViewScenario := ScenEntry.Key;
// Рассчитываем модель
ModelBox1.Execute;
// Сохраняем изменения
ModelBox1.SaveObject;
End Sub UserProc;
Результат выполнения примера: в компоненте «ModelBox1» будет отображена первая модель, рассчитываемая задачей моделирования; для расчёта данной модели будет использоваться второй сценарий задачи моделирования.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore. Вместо компонентов Fore используйте их Fore.NET аналоги.
Imports Prognoz.Platform.Interop.Ms;
…
Public Sub UserProc();
Var
mb: IMetabase;
MsObj: IMetabaseObjectDescriptor;
ms: IMsModelSpace;
Problem: IMsProblem;
MetaModel: IMsMetaModel;
CalcChain: IMsCalculationChainEntries;
i: Integer;
CalcChainEntry: IMsCalculationChainEntry;
Scenarios: IMsProblemScenarios;
ScenKey: uinteger;
ScenTree: IMsScenarioTreeEntries;
ScenEntry: IMsScenarioTreeEntry;
Begin
// uiModelNet1.Active := False;
mb := Self.Metabase;
// Получаем контейнер моделирования
MsObj := mb.ItemById["MODEL_SPACE"];
ms := MsObj.Bind() As IMsModelSpace;
// Получаем задачу моделирования
Problem := mb.ItemByIdNamespace["PROBLEM", MsObj.Key].Bind() As IMsProblem;
// Получаем метамодель, рассчитываемую задачей
MetaModel := Problem.MetaModel;
// Получаем цепочку расчёта метамодели
CalcChain := MetaModel.CalculationChain;
// Получаем первую модель в цепочке расчёта
For i := 0 To CalcChain.Count - 1 Do
CalcChainEntry := CalcChain.Item[i];
If CalcChainEntry.Type = MsCalculationChainEntryType.mccetModel Then
// Используем модель в качестве источника данных для uiModelNet1
uiModelNet1.Model := (CalcChainEntry As IMsCalculationChainModel).Model;
uiModelNet1.Active := True;
Break;
End If;
End For;
// Получаем сценарии, по которым рассчитывается задача моделирования
Scenarios := Problem.Scenarios;
// Получаем 2-й сценарий задачи моделирования
ScenKey := Scenarios.Item[1].InternalKey;
// Получаем ключ 2-го сценария
ScenTree := ms.ScenarioTree;
ScenEntry := ScenTree.FindByInternalKey(ScenKey);
// Указываем, что модель рассчитывается по 2-му сценарию
modelBoxNet1.CtrlBox.ResultsViewScenario := ScenEntry.Key;
// Рассчитываем модель
modelBoxNet1.CtrlBox.Execute();
// Сохраняем изменения
modelBoxNet1.CtrlBox.SaveObject();
End Sub;
См. также: