Содержание
Продукт «Форсайт. Аналитическая платформа» с помощью языка программирования Fore позволяет выводить вычисляемые значения в заголовках таблицы в виде:
отдельных столбцов в боковике таблицы;
отдельных строк в шапке таблицы.
Значения в ячейках вычисляемых столбцов и строк рассчитываются по формуле, состоящей из атрибутов измерения таблицы.
Примечание. Большое количество вычисляемых строк и столбцов может привести к снижению производительности таблицы из-за расчета формул вычисляемых строк и столбцов.
В данном примере рассмотрено создание вычисляемого столбца в боковике таблицы.
Для выполнения примера в репозитории предполагается наличие экспресс-отчета с идентификатором «EXPRESS_SLOTS». Данный отчет должен содержать таблицу данных.
Добавьте ссылки на системные сборки: Dimensions, Express, Metabase, Pivot, Ui. Для примера Fore.NET дополнительно добавьте ссылку на системную сборку ForeSystem.
Sub UserProc;
Var
mb: IMetabase;
Report: IEaxAnalyzer;
Pivot: IPivot;
pHeader: IPivotHeader;
HeaderSlots: IPivotHeaderEvaluatedSlots;
Slot: IPivotHeaderEvaluatedSlot;
Getter: IDataAreaTransformationsGetter;
DataArea: IEaxDataArea;
Slice: IEaxDataAreaSlice;
SelSet: IDimSelectionSet;
Trans: IEaxDataAreaTransformations;
Tran: IEaxDataAreaTransformation;
Data: Array;
Target: IUiCommandTarget;
Context: IUiCommandExecutionContext;
Result: Variant;
Begin
// Получаем текущий репозиторий
mb := MetabaseClass.Active;
// Получаем экспресс-отчет
Report := mb.ItemById("EXPRESS_SLOTS").Edit As IEaxAnalyzer;
// Получаем объект, на основе которого строится таблица данных
Pivot := Report.Pivot;
// Получаем параметры измерений, расположенных в боковике
pHeader := Pivot.LeftHeader;
// Получаем коллекцию вычисляемых столбцов, расположенных в боковике
HeaderSlots := pHeader.EvaluatedSlots;
// Удаляем все существующие вычисляемые столбцы
HeaderSlots.Clear;
// Добавляем новый вычисляемый столбец
Slot := HeaderSlots.Add;
// Получаем объект для работы с формулой столбца
Getter := Slot As IDataAreaTransformationsGetter;
// Добавляем формулу расчета
DataArea := Report.DataArea;
Slice := DataArea.Slices.Item(0);
Trans := Slice.GetTransformations(Getter);
SelSet := Pivot.Selection.CreateCopy;
Tran := Trans.Add(SelSet, Null, -1);
Tran.Enabled := True;
// Формируем параметры для вызова редактора выражения
Data := New Variant[4];
Data[0] := Report;
Data[1] := Tran;
Data[2] := Null;
Data[3] := SelSet;
// Вызываем редактор выражения, в котором пользователь самостоятельно
// задаст выражение для расчета формулы вычисляемого столбца
Target := WinApplication.Instance.GetPluginTarget("Express");
Context := Target.CreateExecutionContext;
Context.Data := data;
Result := Target.Execute("ShowFormulaEditor", context);
// Сохраняем изменения в отчете
(Report As IMetabaseObject).Save;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Express;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Pivot;
Imports Prognoz.Platform.Interop.Ui;
…
Public Shared Sub Main(Params: StartParams);
Var
mb: IMetabase;
Report: IEaxAnalyzer;
Pivot: IPivot;
pHeader: IPivotHeader;
HeaderSlots: IPivotHeaderEvaluatedSlots;
Slot: IPivotHeaderEvaluatedSlot;
Getter: IDataAreaTransformationsGetter;
DataArea: IEaxDataArea;
Slice: IEaxDataAreaSlice;
SelSet: IDimSelectionSet;
Trans: IEaxDataAreaTransformations;
Tran: IEaxDataAreaTransformation;
Data: Array;
Wa: IWinApplicationClass;
Target: IUiCommandTarget;
Context: IUiCommandExecutionContext;
Result: object;
Begin
// Получаем текущий репозиторий
mb := Params.Metabase;
// Получаем экспресс-отчет
Report := mb.ItemById["EXPRESS_SLOTS"].Edit() As IEaxAnalyzer;
// Получаем объект, на основе которого строится таблица данных
Pivot := Report.Pivot;
// Получаем параметры измерений, расположенных в боковике
pHeader := Pivot.LeftHeader;
// Получаем коллекцию вычисляемых столбцов, расположенных в боковике
HeaderSlots := pHeader.EvaluatedSlots;
// Удаляем все существующие вычисляемые столбцы
HeaderSlots.Clear();
// Добавляем новый вычисляемый столбец
Slot := HeaderSlots.Add();
// Получаем объект для работы с формулой столбца
Getter := Slot As IDataAreaTransformationsGetter;
// Добавляем формулу расчета
DataArea := Report.DataArea;
Slice := DataArea.Slices.Item[0];
Trans := Slice.GetTransformations(Getter);
SelSet := Pivot.Selection.CreateCopy();
Tran := Trans.Add(SelSet, Null, uinteger.maxValue);
Tran.Enabled := True;
// Формируем параметры для вызова редактора выражения
Data := New object[4];
Data[0] := Report;
Data[1] := Tran;
Data[2] := Null;
Data[3] := SelSet;
// Вызываем редактор выражения, в котором пользователь самостоятельно
// задаст выражение для расчета формулы вычисляемого столбца
Wa := New WinApplicationClassClass();
Target := Wa.Instance[Null].GetPluginTarget("Express");
Context := Target.CreateExecutionContext();
Context.Data := data;
Result := Target.Execute("ShowFormulaEditor", context, Null);
// Сохраняем изменения в отчете
(Report As IMetabaseObject).Save();
End Sub;
В результате выполнения примера в боковик таблицы экспресс-отчета будет добавлен вычисляемый столбец. Формулу для расчета значений столбца задаст пользователь в открывшемся редакторе выражения.
Например, есть отчет содержащий следующую таблицу данных:
В данной таблице измерение городов расположено по строкам, календарное измерение - по столбцам, а измерение показателей зафиксировано.
В результате выполнения примера будет открыт редактор выражения. В нём будет сформирована следующая формула:
Таким образом, в боковик таблицы будет добавлен вычисляемый столбец, отображающий наименование показателя:
См. также: