Function_: String;
@Function: String;
Свойство Function_ определяет функцию, осуществляющую фильтрацию путем отбора наибольших/наименьших значений.
Допустимые значения:
TOPCOUNT;
TOPPERCENT;
BOTTOMPERCENT;
TOPSUM;
BOTTOMSUM.
Описание указанных функций доступно в документации по языку многомерных запросов MDX.
Для выполнения примера предполагается наличие в репозитории каталога ADOMD с идентификатором «ADOMDTest», в этом каталоге имеется куб ADOMD - «SALES». В структуре куба должны присутствовать измерения на базе справочников ADOMD с идентификаторами «DATE» и «COUNTRY», в измерении фактов имеется показатель «[Measures].[Reseller Order Count]».
Sub UserProc;
Var
Mb: IMetabase;
CubeInst: ICubeInstance;
DestInst: ICubeInstanceDestination;
Sels: IDimSelectionSet;
CubeExecSet: ICubeExecuteSetup;
FilterSetup: ICubeExecuteFilterSetup;
DimSetup: ICubeExecuteDimSetup;
FilterItem: ICubeExecuteFilterItem;
TopFunction: ICubeExecuteFilterFunctionTop;
Exec: ICubeInstanceDestinationExecutor;
Matr: IMatrix;
Begin
Mb := MetabaseClass.Active;
CubeInst := MB.ItemByIdNamespace("SALES", MB.GetObjectKeyById("ADOMDTest")).Open(Null) As ICubeInstance;
DestInst := CubeInst.Destinations.DefaultDestination;
Sels := DestInst.CreateDimSelectionSet;
CubeExecSet := Sels As ICubeExecuteSetup;
//Получение объекта для настройки фильтрации по измерениям
FilterSetup := CubeExecSet.Filter;
//Распределение измерений по группам, задание отметки и установка фильтра измерения
For Each DimSetup In CubeExecSet Do
If DimSetup.Id = "DATE" Then
DimSetup.Selection.SelectAll;
DimSetup.GroupIndex := 2; //По строкам
TopFunction := (FilterSetup As ICubeExecuteFilterFunctionFactory).CreatePredefined(CubeExecuteFilterFunctionPredefined.Top) As ICubeExecuteFilterFunctionTop;
TopFunction.Function_ := "TOPSUM";
TopFunction.Argument := "10000";
TopFunction.Value := "[Measures].[Reseller Order Count]";
FilterItem := FilterSetup.Add;
FilterItem.Function_ := TopFunction As ICubeExecuteFilterFunction;
FilterItem.Dimension := DimSetup;
Elseif DimSetup.Id = "COUNTRY" Then
DimSetup.Selection.SelectElement(1, False);
DimSetup.GroupIndex := 1; //По столбцам
Else
DimSetup.Selection.SelectElement(0, False);
DimSetup.GroupIndex := 0; //Остальные измерения в фиксированные
End If;
End For;
//Подготовка к расчету
Exec := DestInst.CreateExecutor;
Exec.PrepareExecute(Sels);
//Расчет
Exec.PerformExecute;
//Получение матрицы с результатами расчета
Matr := Exec.Matrix;
End Sub UserProc;
При выполнении примера будет осуществлена подготовка и расчет указанного куба ADOMD. При расчете результирующий набор данных будет отфильтрован: в набор попадут только максимальные значения, сумма которых составляет не менее 10000.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
CubeInst: ICubeInstance;
DestInst: ICubeInstanceDestination;
Sels: IDimSelectionSet;
CubeExecSet: ICubeExecuteSetup;
FilterSetup: ICubeExecuteFilterSetup;
DimSetup: ICubeExecuteDimSetup;
FilterItem: ICubeExecuteFilterItem;
TopFunction: ICubeExecuteFilterFunctionTop;
Exec: ICubeInstanceDestinationExecutor;
Matr: IMatrix;
Begin
Mb := Params.Metabase;
CubeInst := MB.ItemByIdNamespace["SALES", MB.GetObjectKeyById("ADOMDTest")].Open(Null) As ICubeInstance;
DestInst := CubeInst.Destinations.DefaultDestination;
Sels := DestInst.CreateDimSelectionSet();
CubeExecSet := Sels As ICubeExecuteSetup;
//Получение объекта для настройки фильтрации по измерениям
FilterSetup := CubeExecSet.Filter;
//Распределение измерений по группам, задание отметки и установка фильтра измерения
For Each DimSetup In CubeExecSet Do
If DimSetup.Id = "DATE" Then
DimSetup.Selection.SelectAll();
DimSetup.GroupIndex := 2; //По строкам
TopFunction := (FilterSetup As ICubeExecuteFilterFunctionFactory).CreatePredefined(CubeExecuteFilterFunctionPredefined.cuexfifuprTop) As ICubeExecuteFilterFunctionTop;
TopFunction.@Function := "TOPSUM";
TopFunction.Argument := "10000";
TopFunction.Value := "[Measures].[Reseller Order Count]";
FilterItem := FilterSetup.Add();
FilterItem.@Function := TopFunction As ICubeExecuteFilterFunction;
FilterItem.Dimension := DimSetup;
Elseif DimSetup.Id = "COUNTRY" Then
DimSetup.Selection.SelectElement(1, False);
DimSetup.GroupIndex := 1; //По столбцам
Else
DimSetup.Selection.SelectElement(0, False);
DimSetup.GroupIndex := 0; //Остальные измерения в фиксированные
End If;
End For;
//Подготовка к расчету
Exec := DestInst.CreateExecutor();
Exec.PrepareExecute(Sels);
//Расчет
Exec.PerformExecute(False);
//Получение матрицы с результатами расчета
Matr := Exec.Matrix;
End Sub;
См. также: