Matrix: IMatrix;
Свойство Matrix возвращает результирующую матрицу, по которой будет проходить фильтрация.
Для выполнения примера в репозитории предполагается наличие экспресс-отчёта с идентификатором EXPRESS, построенного на кубе, и фильтра с идентификатором FILTER. Структура и отметка фильтра и куба идентичны.
Добавьте ссылки на системные сборки: Cubes, Dimensions, Express, ForeSystem (для примера на Fore.NET), Matrix, Metabase, Pivot.
Sub UserProc;
Var
Mb: IMetabase;
MbObj: IMetabaseObject;
ObjParams: IMetabaseObjectParamValues;
ObjParamsEx: IMetabaseObjectParamValuesEx;
Eax: IEaxAnalyzer;
Pvt: IPivot;
Filter: IPivotFilterSettings;
FltrSources: IPivotFilterSources;
FltrSource: IPivotFilterSource;
CubeSelSet: IDimSelectionSet;
Cube: ICubeInstance;
Dest: ICubeInstanceDestination;
Mat, Mat1: IMatrix;
MatIt: IMatrixIterator;
i: Integer;
Begin
// Получим репозиторий
Mb := MetabaseClass.Active;
// Получим куб, используемый в качестве фильтра
MbObj := MB.ItemById("FILTER") As IMetabaseObject;
ObjParams := MbObj.Params.CreateEmptyValues;
ObjParamsEx := ObjParams As IMetabaseObjectParamValuesEx;
ObjParamsEx.StateOptions := 2;
Cube := MbObj.Open(ObjParams) As ICubeInstance;
Dest := Cube.Destinations.Item(0);
// Получим отметку куба
CubeSelSet := Dest.CreateDimSelectionSet;
// Получим экспресс-отчёт
Eax := MB.ItemById("EXPRESS").Edit As IEaxAnalyzer;
// Получим настройки отображения таблицы данных отчёта
Pvt := Eax.Pivot;
// Определим параметры фильтрации
Filter := Pvt.Filter As IPivotFilterSettings;
// Зададим использование внешнего фильтра
FltrSources := Filter.FilterSources;
CubeSelSet := Pvt.Selection;
Pvt.BeginUpdate;
FltrSources.Clear;
// Включим использование фильтра
FltrSources.Enable := True;
// Добавим фильтр
FltrSource := FltrSources.Add;
// Добавим источник для фильтрации
FltrSource.DataSource := Dest As IMatrixDataSource;
// Получим отметку, по которой будет проходить фильтрация
FltrSource.Selection := CubeSelSet;
Pvt.EndUpdate;
// Выведем матрицу данных отчёта
Mat := Pvt.Matrix;
Debug.WriteLine("====== Matrix ======");
Debug.WriteLine("Количество значений: " + Mat.Count.ToString);
Debug.WriteLine("Количество измерений: " + Mat.DimensionCount.ToString);
For i := 0 To Mat.DimensionCount - 1 Do
Debug.WriteLine(i.ToString + ") '" + Mat.Dimensions.Item(i).Dimension.Name + "' отмечено элементов " + Mat.Dimensions.Item(i).SelectedCount.ToString);
End For;
MatIt := Mat.CreateIterator;
MatIt.Move(IteratorDirection.First);
While MatIt.Valid Do
Debug.WriteLine("(" + MatIt.CoordsAsString + ") " + MatIt.Value);
MatIt.Move(IteratorDirection.Next);
End While;
// Выведем матрицу данных фильтр
Mat1 := FltrSource.Matrix;
Debug.WriteLine("====== Matrix ======");
Debug.WriteLine("Количество значений: " + Mat1.Count.ToString);
Debug.WriteLine("Количество измерений: " + Mat1.DimensionCount.ToString);
For i := 0 To Mat1.Dimensions.Count - 1 Do
Debug.WriteLine(i.ToString + ") '" + Mat1.Dimensions.Item(i).Dimension.Name + "' отмечено элементов " + Mat1.Dimensions.Item(i).SelectedCount.ToString);
End For;
MatIt := Mat1.CreateIterator;
MatIt.Move(IteratorDirection.First);
While matit.Valid Do
Debug.WriteLine("(" + MatIt.CoordsAsString + ") " + MatIt.Value);
MatIt.Move(IteratorDirection.Next);
End While;
// Сохраним отчёт
(Eax As IMetabaseObject).Save;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Express;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Pivot;
…
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
MbObj: IMetabaseObject;
ObjParams: IMetabaseObjectParamValues;
ObjParamsEx: IMetabaseObjectParamValuesEx;
Eax: IEaxAnalyzer;
Pvt: IPivot;
Filter: IPivotFilterSettings;
FltrSources: IPivotFilterSources;
FltrSource: IPivotFilterSource;
CubeSelSet: IDimSelectionSet;
Cube: ICubeInstance;
Dest: ICubeInstanceDestination;
Mat, Mat1: IMatrix;
MatIt: IMatrixIterator;
i: Integer;
Begin
// Получим репозиторий
Mb := Params.Metabase;
// Получим куб, используемый в качестве фильтра
MbObj := MB.ItemById["FILTER"] As IMetabaseObject;
ObjParams := MbObj.Params.CreateEmptyValues();
ObjParamsEx := ObjParams As IMetabaseObjectParamValuesEx;
ObjParamsEx.StateOptions := 2;
Cube := MbObj.Open(ObjParams) As ICubeInstance;
Dest := Cube.Destinations.Item[0];
// Получим отметку куба
CubeSelSet := Dest.CreateDimSelectionSet();
// Получим экспресс-отчёт
Eax := MB.ItemById["EXPRESS"].Edit() As IEaxAnalyzer;
// Получим настройки отображения таблицы данных отчёта
Pvt := Eax.Pivot;
// Определим параметры фильтрации
Filter := Pvt.Filter As IPivotFilterSettings;
// Зададим использование внешнего фильтра
FltrSources := Filter.FilterSources;
CubeSelSet := Pvt.Selection;
Pvt.BeginUpdate();
FltrSources.Clear();
// Включим использование фильтра
FltrSources.Enable := True;
// Добавим фильтр
FltrSource := FltrSources.Add();
// Добавим источник для фильтрации
FltrSource.DataSource := Dest As IMatrixDataSource;
// Получим отметку, по которой будет проходить фильтрация
FltrSource.Selection := CubeSelSet;
Pvt.EndUpdate();
// Выведем матрицу данных отчёта
Mat := Pvt.Matrix;
System.Diagnostics.Debug.WriteLine("====== Matrix ======");
System.Diagnostics.Debug.WriteLine("Количество значений: " + Mat.Count.ToString());
System.Diagnostics.Debug.WriteLine("Количество измерений: " + Mat.DimensionCount.ToString());
For i := 0 To Mat.DimensionCount - 1 Do
System.Diagnostics.Debug.WriteLine(i.ToString() + ") '" + Mat.Dimensions.Item[i].Dimension.Name + "' отмечено элементов " + Mat.Dimensions.Item[i].SelectedCount.ToString());
End For;
MatIt := Mat.CreateIterator();
MatIt.Move(IteratorDirection.itdFirst);
While MatIt.Valid Do
System.Diagnostics.Debug.WriteLine("(" + MatIt.CoordsAsString + ") " + MatIt.Value);
MatIt.Move(IteratorDirection.itdNext);
End While;
// Выведем матрицу данных фильтр
Mat1 := FltrSource.Matrix;
System.Diagnostics.Debug.WriteLine("====== Matrix ======");
System.Diagnostics.Debug.WriteLine("Количество значений: " + Mat1.Count.ToString());
System.Diagnostics.Debug.WriteLine("Количество измерений: " + Mat1.DimensionCount.ToString());
For i := 0 To Mat1.Dimensions.Count - 1 Do
System.Diagnostics.Debug.WriteLine(i.ToString() + ") '" + Mat1.Dimensions.Item[i].Dimension.Name + "' отмечено элементов " + Mat1.Dimensions.Item[i].SelectedCount.ToString());
End For;
MatIt := Mat1.CreateIterator();
MatIt.Move(IteratorDirection.itdFirst);
While matit.Valid Do
System.Diagnostics.Debug.WriteLine("(" + MatIt.CoordsAsString + ") " + MatIt.Value);
MatIt.Move(IteratorDirection.itdNext);
End While;
// Сохраним отчёт
(Eax As IMetabaseObject).Save();
End Sub;
В результате выполнения примера в окно консоли будут выведены количества значений, количества измерений, наименования измерений, количество элементов в отметке, матрицы данных для экспресс-отчёта и фильтра. В самом отчёте останутся только те значения элементов, для которых есть значения в фильтре.
См. также: