CreateItem(Kind: MDCalculationFormulaOperandKind): IMDCalculationFormulaOperand;
Kind. Operand type that should be created.
The CreateItem property creates a new formula operand.
Executing the example requires that the repository contains multidimensional calculation on database 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;
DestCoord, SourceCoord: 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;
// Set the coordinate in the source as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.Element);
SourceCoord := Source.NewCoord;
For i := 0 To Slices.Count - 1 Do
SourceCoord.Item(i) := 0;
End For;
SourceElKey := Source.CoordToKey(SourceCoord);
SourceElKey.FactIndex := 0;
CoordOperand := Operand As IMDCalculationFormulaElement;
CoordOperand.Key := SourceElKey;
FormulaExpression.InsertItem(Operand);
// Set the "*" symbol as an operand
Operand := FormulaExpression.CreateItem(MDCalculationFormulaOperandKind.BinaryOperation);
BinaryOperand := Operand As IMDCalculationFormulaBinaryOperation;
BinaryOperand.BinaryOperation := MDCalculationFormulaBinaryOperation.Mul;
FormulaExpression.InsertItem(Operand);
// Set 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 written to data consumer
Dest := MDInst.Destination;
DestCoord := Dest.NewCoord;
Slices := Dest.Slices;
For i := 0 To Slices.Count - 1 Do
DestCoord.Item(i) := 0;
End For;
ElementKey := Dest.CoordToKey(DestCoord);
ElementKey.FactIndex := 0;
// Write formula by the first coordinate
MDInst.WriteFormulas(ElementKey, Formulas);
// Then add the Shift function to the formula and write 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;
DestCoord := Dest.NewCoord;
Slices := Dest.Slices;
For i := 0 To Slices.Count - 1 Do
DestCoord.Item(i) := 1;
End For;
ElementKey := Dest.CoordToKey(DestCoord);
ElementKey.FactIndex := 0;
// Write 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. The value by the second coordinate in the data consumer is calculated by the same formula, but coordinate value in the data source is taken by one day shift according to calendar dimension.
See also: