В регламентном отчете существуют два типа области данных:
Область данных. Старый тип таблицы с данными, построенный на основе среза данных. Используется только в инструменте Prognoz Platform 8 «Отчёты» и рассчитывается только с помощью формул;
Аналитическая область данных. Новый тип таблицы с данными, построенной на основе среза. В отличие от области данных используется во всех инструментах и рассчитывается методами моделирования.
Рассмотрим пример добавления в регламентный отчет среза данных для ранее добавленного источника данных, на котором будет построена область данных.
Для выполнения примера предполагается наличие в репозитории регламентного отчета с идентификатором «REPORT_INTRO».
Для выполнения примера добавьте ссылки на системные сборки Metabase, Report, Tab.
Sub UserProc;
Var
MB: IMetabase;
MObj: IMetabaseObject;
Report: IPrxReport;
DtSources: IPrxDataSources;
DtSource: IPrxDataSource;
Slices: IPrxSlices;
Slice: IPrxSlice;
DataIsland: IPrxDataIslands;
DI: IPrxDataIsland;
Range: ITabRange;
Begin
MB := MetabaseClass.Active;
MObj := MB.ItemById("REPORT_INTRO").Edit;
Report := MObj As IPrxReport;
// Добавление среза:
DtSources := Report.DataSources;
DtSource := DtSources.Item(0);
Slices := DtSource.Slices;
Slice := Slices.Add;
Slice.Execute;
// Добавление области данных:
DataIsland := Report.DataIslands;
DI := DataIsland.Add;
// Выбор листа отчета:
DI.Sheet := Report.Sheets.Item(0);
// Определение среза, являющегося источником для области данных:
DI.Slice := DtSource.Slices.Item(0);
// Определение диапазона ячеек, в котором расположена область данных:
Range := Report.ParseCell(DI.Sheet.Name+"!A0").Range;
DI.Range := Range;
MObj.Save;
End Sub UserProc;
В результате выполнения примера для источника данных регламентного отчета будет добавлен срез, на основании добавленного среза будет построена область данных и размещена на указанном листе.
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Report;
Imports Prognoz.Platform.Interop.Tab;
…
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
MObj: IMetabaseObject;
Report: IPrxReport;
DtSources: IPrxDataSources;
DtSource: IPrxDataSource;
Slices: IPrxSlices;
Slice: IPrxSlice;
DataIsland: IPrxDataIslands;
DI: IPrxDataIsland;
Range: ITabRange;
Begin
MB := Params.Metabase;
MObj := MB.ItemById["REPORT_INTRO"].Edit();
Report := MObj As IPrxReport;
// Добавление среза:
DtSources := Report.DataSources;
DtSource := DtSources.Item[0];
Slices := DtSource.Slices;
Slice := Slices.Add();
Slice.Execute();
// Добавление области данных:
DataIsland := Report.DataIslands;
DI := DataIsland.Add();
// Выбор листа отчета:
DI.Sheet := Report.Sheets.Item[0];
// Определение среза, являющегося источником для области данных:
DI.Slice := DtSource.Slices.Item[0];
// Определение диапазона ячеек, в котором расположена область данных:
Range := Report.ParseCell(DI.Sheet.Name+"!A0").Range;
DI.Range := Range;
MObj.Save();
End Sub;
В результате выполнения примера для источника данных регламентного отчета будет добавлен срез, на основании добавленного среза будет построена область данных и размещена на указанном листе.
Рассмотрим пример добавления в регламентный отчет среза и аналитической области данных.
Для выполнения примера в репозитории необходимо наличие:
регламентного отчета с идентификатором «REPORT»;
куба с идентификатором «CUBE_SEP», содержащего пять измерений.
Добавьте ссылки на системные сборки: Cubes, Drawing, Express, Matrix, Metabase, Pivot, Report, Tab.
Sub UserProc;
Var
MB: IMetabase;
Report: IPrxReport;
DA: IEaxDataArea;
Slice: IEaxDataAreaSlice;
DtSource: IPrxDataSource;
Pivot: IPivot;
CubeInst: ICubeInstance;
View: IEaxObject;
Sheet: IPrxSheet;
Table: ITabSheet;
Rect: IGxRect;
ViewSets: IEaxGridViewSettings;
T_Header, L_Header: IDataAreaHeaderSettingsBase;
Begin
// Получим репозиторий
MB := MetabaseClass.Active;
// Получим регламентный отчет
Report := MB.ItemById("REPORT").Edit As IPrxReport;
// Получим область данных
DA := Report.DataArea;
// Добавим срез данных
Slice := DA.Slices.Add(EaxDataAreaSliceType.Pivot);
Slice.Execute;
Slice.CreateSource;
// Получаем источник
CubeInst := MetabaseClass.Active.ItemById("CUBE_SEP").Open(Null) As ICubeInstance;
// Получаем таблицу данных
Pivot := (Slice As IEaxDataAreaPivotSlice).Pivot;
// Размещаем источник в таблице
Pivot.DataSource := CubeInst.Destinations.DefaultDestination As IMatrixDataSource;
DtSource := Report.DataSources.Add(Pivot.DataSource);
// Установим в отметку измерений элементы
Pivot.Selection.Item(0).SelectElement(0, False);
Pivot.Selection.Item(1).SelectAll;
Pivot.Selection.Item(2).SelectElement(0, False);
Pivot.Selection.Item(3).SelectAll;
Pivot.Selection.Item(4).SelectElement(0, False);
// Установим измерения в заголовки таблицы
Pivot.TopHeader.AddDim(Pivot.DimItem(1)); // Календарь
Pivot.LeftHeader.AddDim(Pivot.DimItem(3)); // Территориальные образования
Pivot.FixedHeader.AddDim(Pivot.DimItem(2)); // СЭП
Pivot.FixedHeader.AddDim(Pivot.DimItem(0)); // Факты
Pivot.FixedHeader.AddDim(Pivot.DimItem(4)); // Типы данных
// Создадим табличное представление данных
Report.Sheets.Remove(1);
View := Slice.Views.AddByType(EaxObjectType.Grid);
(View As IEaxGrid).Pivot := Pivot;
// Представление будет находиться на втором листе
Sheet := Report.Sheets.Add("Лист2");
Table := (Sheet As IPrxTable).TabSheet;
(View As IEaxGrid).TabSheet := Table;
// Установим диапазон таблицы
Rect := New GxRect.Create(0, 3, 0, 3);
(View As IEaxGrid).OutputRect := Rect;
// Установим методы вставки
ViewSets := (View As IEaxGrid).ViewSettings;
T_Header := (View As IEaxGrid).Pivot.TopHeader As IDataAreaHeaderSettingsBase;
(ViewSets.GetViewSettings(T_Header) As IEaxGridHeaderSettings)
Behaviour := EaxGridHeaderBehaviour.Insert;
L_Header := (View As IEaxGrid).Pivot.LeftHeader As IDataAreaHeaderSettingsBase;
(ViewSets.GetViewSettings(L_Header) As IEaxGridHeaderSettings)
Behaviour := EaxGridHeaderBehaviour.Insert;
// Обновим отчет и сохраним изменения
Report.Recalc;
(Report As IMetabaseObject).Save;
End Sub UserProc;
После выполнения примера в регламентном отчете будет создан новый срез данных и по нему построена аналитическая область данных на втором листе отчета.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Drawing;
Imports Prognoz.Platform.Interop.Express;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Pivot;
Imports Prognoz.Platform.Interop.Report;
Imports Prognoz.Platform.Interop.Tab;
…
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
Report: IPrxReport;
DA: IEaxDataArea;
Slice: IEaxDataAreaSlice;
DtSource: IPrxDataSource;
Pivot: PivotFactory;
CubeInst: ICubeInstance;
View: IEaxObject;
Sheet: IPrxSheet;
Table: TabSheet;
Rect: GxRect = New GxRectClass();
ViewSets: IEaxGridViewSettings;
T_Header, L_Header: IDataAreaHeaderSettingsBase;
Begin
// Получим репозиторий
MB := Params.Metabase;
// Получим регламентный отчет
Report := MB.ItemById["REPORT"].Edit() As IPrxReport;
// Получим область данных
DA := Report.DataArea;
// Добавим срез данных
Slice := DA.Slices.Add(EaxDataAreaSliceType.edastPivot);
Slice.Execute();
Slice.CreateSource();
// Получаем источник
CubeInst := Params.Metabase.ItemById["CUBE_SEP"].Open(Null) As ICubeInstance;
// Получаем таблицу данных
Pivot := (Slice As IEaxDataAreaPivotSlice).Pivot;
// Размещаем источник в таблице
Pivot.DataSource := CubeInst.Destinations.DefaultDestination As IMatrixDataSource;
DtSource := Report.DataSources.Add(Pivot.DataSource);
// Установим в отметку измерений элементы
Pivot.Selection.Item[0].SelectElement(0, False);
Pivot.Selection.Item[1].SelectAll();
Pivot.Selection.Item[2].SelectElement(0, False);
Pivot.Selection.Item[3].SelectAll();
Pivot.Selection.Item[4].SelectElement(0, False);
// Установим измерения в заголовки таблицы
Pivot.TopHeader.AddDim(Pivot.DimItem[1]); // Календарь
Pivot.LeftHeader.AddDim(Pivot.DimItem[3]); // Территориальные образования
Pivot.FixedHeader.AddDim(Pivot.DimItem[2]); // СЭП
Pivot.FixedHeader.AddDim(Pivot.DimItem[0]); // Факты
Pivot.FixedHeader.AddDim(Pivot.DimItem[4]); // Типы данных
// Создадим табличное представление данных
View := Slice.Views.AddByType(EaxObjectType.eotGrid);
(View As IEaxGrid).Pivot := Pivot;
// Представление будет находиться на втором листе
Report.Sheets.Remove(1);
Sheet := Report.Sheets.Add("Лист2", PrxSheetType.pstTable);
Table := (Sheet As IPrxTable).TabSheet;
(View As IEaxGrid).TabSheet := Table;
// Установим диапазон таблицы
Rect.Create(0, 3, 0, 3);
(View As IEaxGrid).OutputRect := Rect;
// Установим методы вставки
ViewSets := (View As IEaxGrid).ViewSettings;
T_Header := (View As IEaxGrid).Pivot.TopHeader As IDataAreaHeaderSettingsBase;
(ViewSets.GetViewSettings[T_Header] As IEaxGridHeaderSettings).Behaviour := EaxGridHeaderBehaviour.eghbInsert;
L_Header := (View As IEaxGrid).Pivot.LeftHeader As IDataAreaHeaderSettingsBase;
(ViewSets.GetViewSettings[L_Header] As IEaxGridHeaderSettings).Behaviour := EaxGridHeaderBehaviour.eghbInsert;
// Обновим отчет и сохраним изменения
Report.Recalc();
(Report As IMetabaseObject).Save();
End Sub;
После выполнения примера в регламентном отчете будет создан новый срез данных и по нему построена аналитическая область данных на втором листе отчета.
См. также:
Общие принципы программирования с использованием сборки Report
Пример Fore