Execute(Selection: IDimSelectionSet): IMatrix;
Selection - отметка измерений, по которой будет произведен расчет.
Метод Execute осуществляет расчет агрегации и возвращает матрицу с рассчитанными данными. В данной матрице присутствует дополнительное измерение, содержащее итоги агрегации. Координата в дополнительном измерении соответствует индексу агрегации.
Примечание. В матрице расчета агрегации для измерений, по которым рассчитан агрегат Other (IStandardCubeServerAggregationDimension.Others), координата будет «-1».
Для выполнения примера предполагается наличие в репозитории стандартного куба с идентификатором «OBJ_CUBE». В данном кубе должно присутствовать два измерения.
Sub Main;
Var
MB: IMetabase;
MObj: IMetabaseObject;
StandCub: IStandardCube;
CubeInst: ICubeInstance;
CubeStandInst: IStandardCubeInstance;
Aggregator: IStandardCubeServerAggregator;
StdDim: IStandardCubeDimension;
StdDims: IStandardCubeDimensions;
Aggregation: IStandardCubeServerAggregation;
FactDimension: IDimInstance;
Iter: IDimIterator;
DimsEx: IStandardCubeServerAggregationDimensionsEx;
AggDim: IStandardCubeServerAggregationDimension;
MatrDS: IMatrixDataSource;
DimSS: IDimSelectionSet;
Matr: IMatrix;
Coord: IMatrixCoord;
i: Integer;
MatrIter: IMatrixIterator;
s: String;
Begin
MB := MetabaseClass.Active;
MObj := MB.ItemById("OBJ_CUBE").Bind;
StandCub := MObj As IStandardCube;
CubeInst := MObj.Open(Null) As ICubeInstance;
CubeStandInst := CubeInst As IStandardCubeInstance;
StdDims := StandCub.Dimensions;
// Настройка метода агрегации
Aggregator := CubeStandInst.CreateAggregator;
FactDimension := StandCub.FactDimension.OpenDimension;
Iter := FactDimension.Elements.Elements.Iterator;
Iter.First;
While Iter.Next Do
Aggregation := Aggregator.Aggregations.Add;
Aggregation.AggregationType := CubeFactBindingAggregationType.Sum;
Aggregation.FactKey := FactDimension.Indexes.PrimaryIndex.IndexAttributesValues(Iter.Element);
End While;
// Определение измерений для агрегации
DimsEx := Aggregator.Dimensions;
AggDim := DimsEx.Item(0);
AggDim.GroupIndex := 0;
AggDim.Position := 0;
AggDim.Others := True;
AggDim := DimsEx.Item(1);
AggDim.GroupIndex := 1;
AggDim.Position := 0;
AggDim.Totals := True;
// Отметка для расчета агрегации
MatrDS := CubeInst.Destinations.DefaultDestination As IMatrixDataSource;
DimSS := MatrDS.CreateDimSelectionSet;
For i := 0 To DimSS.Count - 1 Do
DimSS.Item(i).SelectAll;
End For;
// Расчет агрегации
Matr := Aggregator.Execute(DimSS);
// Вывод результатов агрегации
MatrIter := Matr.CreateIterator;
MatrIter.Move(IteratorDirection.First);
If MatrIter.Valid Then
For i := 0 To StdDims.Count - 1 Do
StdDim := StdDims.Item(i);
If StdDim.FactDimension Then
Debug.Write("Факт ");
Else
Debug.Write(StdDim.OpenDimension.Name + " ");
End If;
End For;
Debug.Write("Агрегация ");
Debug.WriteLine("Значение");
Coord := Matr.CreateCoord;
While MatrIter.Valid Do
MatrIter.PutCurrentPos(Coord);
s := "";
For i := 0 To Coord.Count - 1 Do
s := s + Coord.Item(i).ToString + " ";
End For;
s := s + "= " + MatrIter.Value;
Debug.WriteLine(s);
MatrIter.Move(IteratorDirection.Next);
End While;
Else
Debug.WriteLine("Данные отсутствуют");
End If;
End Sub Main;
После выполнения примера для фактов куба будет рассчитана сумма по измерениям. Матрица расчета будет выведена в окно консоли.
См. также: