FunctionCall: MDCalculationFormulaFunctionCall;
The FunctionCall property determines a form of special function used in a formula.
The type of the function in use determines the following list of operands. Syntax of functions is given in the Special Functions section.
Executing the example requires that the repository contains multidimensional calculation on DB server with the MDCalc_1 identifier.
Sub UserProc;
Var
MB: IMetabase;
MDInst: IMDCalculationInstance;
Formulas: IMDCalculationFormulas;
Formula: IMDCalculationFormula;
FormulaExpression: IMDCalculationFormulaExpression;
Source: IMDCalculationSourceInstance;
Dest: IMDCalculationDestinationInstance;
Slices: IMDCalculationSlicesInstance;
Operand: IMDCalculationFormulaOperand;
DestCoo, SourceCoo: IMatrixCoord;
ElementKey, SourceElKey: IMDCalculationFormulaElementKey;
CoordOperand: IMDCalculationFormulaElement;
ConstOperand: IMDCalculationFormulaConstantValue;
BinaryOperand: IMDCalculationFormulaBinaryOperation;
FuncCallOperand: IMDCalculationFormulaFunctionCall;
DelimiterOperand: IMDCalculationFormulaDelimiter;
DatePeriodOperand: IMDCalculationFormulaDatePeriod;
i: Integer;
Begin
MB := MetabaseClass.Active;
MDInst := MB.ItemById("MDCalc_1").Open(Null) As IMDCalculationInstance;
Formulas := MDInst.CreateFormulas;
Formula := Formulas.Add;
FormulaExpression := Formula.Expression;
Source := MDInst.Sources.Item(0);
Slices := Source.Slices;
//Specify the coordinate in the source as the operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.Element);
SourceCoo := Source.NewCoord;
For i := 0 To Slices.Count - 1 Do
SourceCoo.Item(i) := 0;
End For;
SourceElKey := Source.CoordToKey(SourceCoo);
SourceElKey.FactIndex := 0;
CoordOperand := Operand As IMDCalculationFormulaElement;
CoordOperand.Key := SourceElKey;
FormulaExpression.InsertItem(Operand);
//Specify the "*" symbol as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.BinaryOperation);
BinaryOperand := Operand As IMDCalculationFormulaBinaryOperation;
BinaryOperand.BinaryOperation := MDCalculationFormulaBinaryOperation.Mul;
FormulaExpression.InsertItem(Operand);
//Specify the "3.14" constant as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.ConstantValue);
ConstOperand := Operand As IMDCalculationFormulaConstantValue;
ConstOperand.ConstantValue := 3.14;
FormulaExpression.InsertItem(Operand);
//Coordinate, by which formula is recorded to data consumer
Dest := MDInst.Destination;
DestCoo := Dest.NewCoord;
Slices := Dest.Slices;
For i := 0 To Slices.Count - 1 Do
DestCoo.Item(i) := 0;
End For;
ElementKey := Dest.CoordToKey(DestCoo);
ElementKey.FactIndex := 0;
//Record formula by the first coordinate
MDInst.WriteFormulas(ElementKey, Formulas);
//Then add Shift function to the formula and record by the second coordinate
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.FunctionCall);
FuncCallOperand := Operand As IMDCalculationFormulaFunctionCall;
FuncCallOperand.FunctionCall := MDCalculationFormulaFunctionCall.Shift;
//Insert the Shift function in the first position
FormulaExpression.InsertItem(Operand, 0);
//Specify the "," delimiter as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.Delimiter);
DelimiterOperand := Operand As IMDCalculationFormulaDelimiter;
DelimiterOperand.Delimiter := MDCalculationFormulaDelimiter.Comma;
//Insert "," to the third position
FormulaExpression.InsertItem(Operand, 2);
//Insert "Day"
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.DatePeriod);
DatePeriodOperand := Operand As IMDCalculationFormulaDatePeriod;
DatePeriodOperand.DatePeriod := MDCalculationFormulaDatePeriod.Day;
FormulaExpression.InsertItem(Operand, 3);
//Insert ","
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.Delimiter);
DelimiterOperand := Operand As IMDCalculationFormulaDelimiter;
DelimiterOperand.Delimiter := MDCalculationFormulaDelimiter.Comma;
FormulaExpression.InsertItem(Operand, 4);
//Insert "1" to the last position
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.ConstantValue);
ConstOperand := Operand As IMDCalculationFormulaConstantValue;
ConstOperand.ConstantValue := 1;
FormulaExpression.InsertItem(Operand, 5);
//Insert ")" to the last position
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.Delimiter);
DelimiterOperand := Operand As IMDCalculationFormulaDelimiter;
DelimiterOperand.Delimiter := MDCalculationFormulaDelimiter.RightPar;
FormulaExpression.InsertItem(Operand, 6);
Dest := MDInst.Destination;
DestCoo := Dest.NewCoord;
Slices := Dest.Slices;
For i := 0 To Slices.Count - 1 Do
DestCoo.Item(i) := 1;
End For;
ElementKey := Dest.CoordToKey(DestCoo);
ElementKey.FactIndex := 0;
//Record formula by the second coordinate
MDInst.WriteFormulas(ElementKey, Formulas);
End Sub UserProc;
After executing the example the formula is set for the specified data consumer element. The value by coordinate in the data consumer is calculated by the formula: value by coordinate in the data source is multiplied by 3.14. Value by the second coordinate in the data consumer is calculated by the same formula, but value of coordinate in the data source is taken with one day shift according to the calendar dimension (The Shift function is used to get value).
Executing the example requires that the repository contains multidimensional calculation on DB server with the MDCalc_1 identifier. The specified procedure is an entry point of the .NET assembly.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
MDInst: IMDCalculationInstance;
Formulas: IMDCalculationFormulas;
Formula: IMDCalculationFormula;
FormulaExpression: IMDCalculationFormulaExpression;
Source: IMDCalculationSourceInstance;
Dest: IMDCalculationDestinationInstance;
Slices: IMDCalculationSlicesInstance;
Operand: IMDCalculationFormulaOperand;
DestCoo, SourceCoo: IMatrixCoord;
ElementKey, SourceElKey: IMDCalculationFormulaElementKey;
CoordOperand: IMDCalculationFormulaElement;
ConstOperand: IMDCalculationFormulaConstantValue;
BinaryOperand: IMDCalculationFormulaBinaryOperation;
FuncCallOperand: IMDCalculationFormulaFunctionCall;
DelimiterOperand: IMDCalculationFormulaDelimiter;
DatePeriodOperand: IMDCalculationFormulaDatePeriod;
i: Integer;
Begin
MB := Params.Metabase;
MDInst := MB.ItemById["MDCalc_1"].Open(Null) As IMDCalculationInstance;
Formulas := MDInst.CreateFormulas();
Formula := Formulas.Add();
FormulaExpression := Formula.Expression;
Source := MDInst.Sources.Item[0];
Slices := Source.Slices;
//Specify the coordinate in the source as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokElement);
SourceCoo := Source.NewCoord();
For i := 0 To Slices.Count - 1 Do
SourceCoo.Item[i] := 0;
End For;
SourceElKey := Source.CoordToKey(SourceCoo, Null);
SourceElKey.FactIndex := 0;
CoordOperand := Operand As IMDCalculationFormulaElement;
CoordOperand.Key := SourceElKey;
FormulaExpression.InsertItem(Operand, -1);
//Specify the "*" symbol as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokBinaryOperation);
BinaryOperand := Operand As IMDCalculationFormulaBinaryOperation;
BinaryOperand.BinaryOperation := MDCalculationFormulaBinaryOperation.cfboMul;
FormulaExpression.InsertItem(Operand, -1);
//Specify the "3.14" constant as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokConstantValue);
ConstOperand := Operand As IMDCalculationFormulaConstantValue;
ConstOperand.ConstantValue := 3.14;
FormulaExpression.InsertItem(Operand, -1);
//Coordinate, by which formula is recorded to data consumer
Dest := MDInst.Destination;
DestCoo := Dest.NewCoord();
Slices := Dest.Slices;
For i := 0 To Slices.Count - 1 Do
DestCoo.Item[i] := 0;
End For;
ElementKey := Dest.CoordToKey(DestCoo, Null);
ElementKey.FactIndex := 0;
//Record formula by the first coordinate
MDInst.WriteFormulas(ElementKey, Formulas, 0);
//Then add the Shift function to the formula and record by the second coordinate
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokFunctionCall);
FuncCallOperand := Operand As IMDCalculationFormulaFunctionCall;
FuncCallOperand.FunctionCall := MDCalculationFormulaFunctionCall.cffcShift;
//Insert the Shift function to the first position
FormulaExpression.InsertItem(Operand, 0);
//Specify the "," delimiter as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokDelimiter);
DelimiterOperand := Operand As IMDCalculationFormulaDelimiter;
DelimiterOperand.Delimiter := MDCalculationFormulaDelimiter.cfdComma;
//Insert "," to the third position
FormulaExpression.InsertItem(Operand, 2);
//Insert "Day"
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokDatePeriod);
DatePeriodOperand := Operand As IMDCalculationFormulaDatePeriod;
DatePeriodOperand.DatePeriod := MDCalculationFormulaDatePeriod.cfdpDay;
FormulaExpression.InsertItem(Operand, 3);
//Insert ","
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokDelimiter);
DelimiterOperand := Operand As IMDCalculationFormulaDelimiter;
DelimiterOperand.Delimiter := MDCalculationFormulaDelimiter.cfdComma;
FormulaExpression.InsertItem(Operand, 4);
//Insert "1" to the last position
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokConstantValue);
ConstOperand := Operand As IMDCalculationFormulaConstantValue;
ConstOperand.ConstantValue := 1;
FormulaExpression.InsertItem(Operand, 5);
//Insert ")" to the last position
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.cfokDelimiter);
DelimiterOperand := Operand As IMDCalculationFormulaDelimiter;
DelimiterOperand.Delimiter := MDCalculationFormulaDelimiter.cfdRightPar;
FormulaExpression.InsertItem(Operand, 6);
Dest := MDInst.Destination;
DestCoo := Dest.NewCoord();
Slices := Dest.Slices;
For i := 0 To Slices.Count - 1 Do
DestCoo.Item[i] := 1;
End For;
ElementKey := Dest.CoordToKey(DestCoo, Null);
ElementKey.FactIndex := 0;
//Record formula by the second coordinate
MDInst.WriteFormulas(ElementKey, Formulas, 0);
End Sub;
After executing the example the formula is set for the specified data consumer element. The value by coordinate in the data consumer is calculated by the formula: value by coordinate in the data source is multiplied by 3.14. Value by the second coordinate in the data consumer is calculated by the same formula, but value of coordinate in the data source is taken with one day shift according to calendar dimension (The Shift function is used to get value).
See also: