GetFormulaInfo(StubKey: Integer; SelSet: IDimSelectionSet): IMsFormulaInfoList;
GetFormulaInfo(StubKey: UInteger; SelSet: IPrognoz.Platform.Interop.Dimensions.IDimSelectionSet): Prognoz.Platform.Interop.Ms.IMsFormulaInfoList;
StubKey. Ключ источника данных, для которого производился расчёт.
SelSet. Отметка, формирующая точку, в которой необходимо получить информацию о формулах.
Метод GetFormulaInfo возвращает информацию о формулах, которые применялись для расчёта в заданной точке.
Получение информации о формулах доступно при выполнении следующих требований:
При расчётах используются модель детерминированного уравнения или модель матричной агрегации;
Для задачи должен быть установлен тип - Задача многопоточной трансформации.
В параметре SelSet должна передаваться единичная отметка, сформированная по измерениям источника, ключ которого передаётся в StubKey.
Для выполнения примера предполагается наличие контейнера моделирования с идентификатором «MODEL_SPACE», в котором создана задача моделирования «PROBLEM». Задача настроена на расчёт модели детерминированного уравнения.
Добавьте ссылки на системные сборки: Cubes, Dimensions, Matrix, Metabase, Ms.
Sub UserProc;
Var
Mb: IMetabase;
Problem: IMsProblem;
CalcSet: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
Variable: IVariableStub;
SelFactory: DimSelectionSetFactory;
SelSet: IDimSelectionSet;
Sel: IDimSelection;
Res: IMsFormulaInfoList;
ResI: IMsFormulaInfo;
InstIterator: IMsFormulaGenInstanceIterator;
OperandsIterator: IMsFormulaGenTermIterator;
Point: IMsFormulaGenTermPoint;
DimInst: IDimInstance;
k, i, l: Integer;
s: String;
Begin
// Получение задачи
Mb := MetabaseClass.Active;
Problem := Mb.ItemByIdNamespace("PROBLEM", Mb.GetObjectKeyById("MODEL_SPACE")).Bind As IMsProblem;
// Расчёт задачи
CalcSet := Problem.CreateCalculationSettings;
CalcSet.SupportPartialCalculation := True;
Calc := Problem.Calculate(CalcSet);
Calc.Run;
// Получение источника данных, для которого производился расчёт
Variable := Calc.VariableStubs.Item(0);
// Создание отметки. Отмечаются первые элементы измерений
SelFactory := New DimSelectionSetFactory.Create;
SelSet := SelFactory.CreateDimSelectionSet;
Sel := SelSet.Add((Variable.Calendar As IMetabaseObject).Open(Null) As IDimInstance);
Sel.SelectElement(0, False);
k := Variable.DimensionCount;
For i := 0 To k - 1 Do
Sel := SelSet.Add((Variable.Dimension(i) As IMetabaseObject).Open(Null) As IDimInstance);
Sel.SelectElement(0, False);
End For;
// Получение информации о формулах в точке расчёта
Res := Calc.GetFormulaInfo(Variable.Key, SelSet);
If (Res.Count = 0) Then
Debug.WriteLine("Точка не считалась");
Else
Debug.WriteLine("Всего моделей, которыми считалась точка: " + Res.Count.ToString);
For i := 0 To Res.Count - 1 Do
ResI := Res.Item(i);
Debug.WriteLine("=========== " + (i + 1).ToString + " ===========");
Debug.WriteLine("Модель: " + ResI.Model.Name);
Debug.WriteLine("Метамодель: " + ResI.MetaModel.Name);
Debug.WriteLine("Задача: " + ResI.Problem.Name);
Debug.WriteLine("Выражение формулы: " + ResI.Expression);
// Информация о точке расчёта
InstIterator := ResI.InstancesIterator;
Point := InstIterator.LeftPart.Point;
SelSet := (Point.Coord(0).MatrixModel As IMatrix).Dimensions;
For k := 0 To SelSet.Count - 1 Do
DimInst := SelSet.Item(k).Dimension;
s := s + DimInst.Name + " = " + DimInst.Elements.Name(Point.Coord(0).Item(k)) + "; ";
End For;
Debug.WriteLine("Точка расчёта: " + s);
// Информация об операндах, использованных в точке расчёта
s := "";
OperandsIterator := InstIterator.Operands;
While Not OperandsIterator.Eof Do
Point := OperandsIterator.Term.Point;
SelSet := (Point.Coord(0).MatrixModel As IMatrix).Dimensions;
For k := 0 To SelSet.Count - 1 Do
DimInst := SelSet.Item(k).Dimension;
s := s + DimInst.Name + " = " + DimInst.Elements.Name(Point.Coord(0).Item(k)) + "; ";
End For;
Debug.WriteLine("Операнд: " + s);
Debug.WriteLine("--- Количество значений операнда: " + Point.ValuesCount.ToString);
For l := 0 To Point.ValuesCount - 1 Do
Debug.WriteLine("--- Значение № " + l.ToString + " = " + Point.Value(l));
End For;
s := "";
OperandsIterator.Next;
End While;
End For;
End If;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Ms;
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
Problem: IMsProblem;
CalcSet: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
Variable: IVariableStub;
SelFactory: DimSelectionSetFactory = New DimSelectionSetFactoryClass();
SelSet: IDimSelectionSet;
Sel: IDimSelection;
Res: IMsFormulaInfoList;
ResI: IMsFormulaInfo;
InstIterator: IMsFormulaGenInstanceIterator;
OperandsIterator: IMsFormulaGenTermIterator;
Point: IMsFormulaGenTermPoint;
DimInst: IDimInstance;
k, i, l: Integer;
s: String;
Begin
// Получение задачи
Mb := Params.Metabase;
Problem := Mb.ItemByIdNamespace["PROBLEM", Mb.GetObjectKeyById("MODEL_SPACE")].Bind() As IMsProblem;
// Расчёт задачи
CalcSet := Problem.CreateCalculationSettings();
CalcSet.SupportPartialCalculation := True;
Calc := Problem.Calculate(CalcSet);
Calc.Run();
// Получение источника данных, для которого производился расчёт
Variable := Calc.VariableStubs.Item[0];
// Создание отметки. Отмечаются первые элементы измерений
SelSet := SelFactory.CreateDimSelectionSet();
Sel := SelSet.Add((Variable.Calendar As IMetabaseObject).Open(Null) As IDimInstance);
Sel.SelectElement(0, False);
k := Variable.DimensionCount;
For i := 0 To k - 1 Do
Sel := SelSet.Add((Variable.Dimension[i] As IMetabaseObject).Open(Null) As IDimInstance);
Sel.SelectElement(0, False);
End For;
// Получение информации о формулах в точке расчёта
Res := Calc.GetFormulaInfo(Variable.Key, SelSet);
If (Res.Count = 0) Then
System.Diagnostics.Debug.WriteLine("Точка не считалась");
Else
System.Diagnostics.Debug.WriteLine("Всего моделей, которыми считалась точка: " + Res.Count.ToString());
For i := 0 To Res.Count - 1 Do
ResI := Res.Item[i];
System.Diagnostics.Debug.WriteLine("=========== " + (i + 1).ToString() + " ===========");
System.Diagnostics.Debug.WriteLine("Модель: " + ResI.Model.Name);
System.Diagnostics.Debug.WriteLine("Метамодель: " + ResI.MetaModel.Name);
System.Diagnostics.Debug.WriteLine("Задача: " + ResI.Problem.Name);
System.Diagnostics.Debug.WriteLine("Выражение формулы: " + ResI.Expression);
// Информация о точке расчёта
InstIterator := ResI.InstancesIterator;
Point := InstIterator.LeftPart.Point;
SelSet := (Point.Coord[0].MatrixModel As IMatrix).Dimensions;
For k := 0 To SelSet.Count - 1 Do
DimInst := SelSet.Item[k].Dimension;
s := s + DimInst.Name + " = " + DimInst.Elements.Name[(Point.Coord[0].Item[k] As uinteger)] + "; ";
End For;
System.Diagnostics.Debug.WriteLine("Точка расчёта: " + s);
// Информация об операндах, использованных в точке расчёта
s := "";
OperandsIterator := InstIterator.Operands;
While Not OperandsIterator.Eof() Do
Point := OperandsIterator.Term.Point;
SelSet := (Point.Coord[0].MatrixModel As IMatrix).Dimensions;
For k := 0 To SelSet.Count - 1 Do
DimInst := SelSet.Item[k].Dimension;
s := s + DimInst.Name + " = " + DimInst.Elements.Name[(Point.Coord[0].Item[k]) As uinteger] + "; ";
End For;
System.Diagnostics.Debug.WriteLine("Операнд: " + s);
System.Diagnostics.Debug.WriteLine("--- Количество значений операнда: " + Point.ValuesCount.ToString());
For l := 0 To Point.ValuesCount - 1 Do
System.Diagnostics.Debug.WriteLine("--- Значение № " + l.ToString() + " = " + Point.Value[l]);
End For;
s := "";
OperandsIterator.Next();
End While;
End For;
End If;
End Sub;
При выполнении примера будет осуществлён расчёт задачи моделирования. В консоль среды разработки будет выведена информация о формулах, которые использовались при расчёте в самой первой точке расчёта модели.
См. также: