Below is the example of using the GetMs operation for step-by-step model calculation. The request contains an instance of opened modeling container, pattern and parameters of model calculation. The response contains information about calculation.
{ "Envelope" : { "Body" : { "GetMs" : { "tMs" : {
"id" : "S30!M!S!C1" }, "tArg" : { "pattern" : { "obInst" : "true", "item" : { "key" : "2803",
"problem" : { "calculation" : { "calculationState" : { "model" : { "generatedName" : "true" }
} } } } }, "execParams" : { "level" : "Year", "problemCalculationKey" : "0", "slices" :
{ "its" : "" }, "execStepInto" : "false", "execStepOver" : "true" } } } } } }
{ "Envelope" : { "Body" : { "GetMsResult" : { "id" : {
"id" : "S30!M!S!C1" }, "meta" : { "obInst" : { "obDesc" : { "@isShortcut" : "0", "i" : "MODELSPACE",
"n" : "Modeling container", "k" : "1581", "c" : "5121", "p" : "1580", "h" : "0" } }, "dirty" : "0", "item" : {
"k" : "2803", "id" : "TEMP_MODEL", "n" : "TEMP_MODEL", "vis" : "1", "type" : "Problem", "problemMd" : { "calculation" : { "pointCount" : "0",
"pointPassed" : "0", "saveData" : "1", "copyFact" : "0", "treatNullsAsZeros" : "0", "isRunning" : "0", "calculationState" : { "model" : "", "scenarioKey" : "4294967295", "currentPoint" : "1899-12-30",
"message" : "Task calculation completed. Calculation time 00:00:01" }, "isSuspend" : "0" } } } } } } } }
The GetMsStepIntoCalc function executes step-by-step calculation of the specified model. Input parameters:
ms. Opened modeling container instance.
modelKey. Key of the calculated model.
prCalcKey. Key of the object that executes calculation.
outSlice. The data slice, for which calculation is executed.
After executing the function returns whether the calculation is still being executed. Information about the executed calculation step is displayed to the console window. The results are displayed using the PrintArray auxiliary procedure described in the Calculating Equation section.
public static bool GetMsStepIntoCalc(MsId ms, ulong modelKey, ulong? prCalcKey, MsFormulaTransformSlice outSlice) { var getMsOp = new GetMs(); //Set operation execution parameters getMsOp.tMs = ms; getMsOp.tArg = new GetMsArg() { //Set general data getting pattern pattern = new MsMdPattern() { item = new MsItemPattern() { //Set calculated model key
key = modelKey, //Set data calculation pattern problem = new MsProblemPattern() { calculation = new MsProblemCalculationPattern() { calculationState = new MsCalculationStatePattern() { model = new MsModelPattern() { generatedName = true } }
} } } },//Set calculation parameters execParams = new MsMdExecParams() { execStepInto = false, execStepOver = true, problemCalculationKey = prCalcKey, slices = new MsFormulaTransformSlices()
{ its = new MsFormulaTransformSlice[] { outSlice } }, level = DimCalendarLvl.Year } }; //Create proxy object for operation execution var somClient = new SomPortTypeClient(); //Execute calculation steps GetMsResult getMsResult = somClient.GetMs(getMsOp);
MsProblemCalculation calc = getMsResult.meta.item.problemMd.calculation; //Output calculation data into console window if ((calc.pointPassed == 0) && (calc.pointCount !=0)) { Console.WriteLine("Task calculation information:"); Console.WriteLine("".PadRight(3) + "- number of calculation steps: " + calc.pointCount); Console.WriteLine("".PadRight(3) + "- data is loaded into output variables after calculation end: " + calc.saveData); Console.WriteLine("".PadRight(3) + "- data for sample period is copied from the Fact scenario: " + calc.copyFact); Console.WriteLine("".PadRight(3) + "- empty values in data are filled with zeros: " + calc.treatNullsAsZeros); Console.WriteLine("".PadRight(3) + "- model in calculation process: " + calc.isRunning);
}; Console.WriteLine("Task calculation. Step '" + calc.pointPassed + "' from '" + calc.pointCount + "'"); MsCalculationState calcState = calc.calculationState; Console.WriteLine("".PadRight(3) + "- operation: " + calcState.message); Console.WriteLine("".PadRight(3) + "- equation: " + calcState.model.generatedName); Console.WriteLine("".PadRight(3) + "- calculation scenario key: "+calcState.scenarioKey); Console.WriteLine("".PadRight(3) + "- calculation point: " + calcState.currentPoint); Console.WriteLine("".PadRight(3) + "- values: " + printArray(calcState.values)); bool continueCalc = calc.isSuspend.Value; return continueCalc; }
See also: