Формулы отчета
В отчете можно задавать формулы для показателей: реальных и виртуальных, но нельзя размещать в атрибутах. Описание формул содержится внутри описания показателя. Однако, за счет того, что в формуле указывается идентификатор показателя, и этот идентификатор можно указать любым показателем отчета, то и формулы появятся у указанного показателя, а не у того, внутри которого описаны формулы.
Формулы рассчитываются в момент построения отчета после загрузки данных и ПОСЛЕ агрегации данных в хранимых показателях, но для виртуальных показателей агрегация выполняется после расчета формул в них.
Содержание
Особенности размещения в хранимых показателях
Формулы рассчитываются после загрузки и агрегации данных. При этом, если формулы размещаются в хранимых показателях, они могут перетереть значение, которое было в ячейке (в т. ч. null). Но такие ячейки не будут помечены как измененные, и при сохранении отчета сразу после открытия эти изменения не сохранятся в показателе. Это сделано из соображений очевидности для пользователя: было бы странным при открытии отчета показывать пользователю, что в нем уже есть измененные данные. Поэтому отчет нужно вводить в эксплуатацию либо с пустыми данными, либо чтобы эти данные соответствовали настроенному расчету.
Формула пересчитываются автоматически при изменении ячеек, от которых она зависит. В этом случае, если значение ячеек формулы изменилось, они помечаются, как измененные.
Основные свойства формулы
Все свойства формулы можно посмотреть в документации.
- Id - идентификатор формулы;
- Name - описание формулы, в дальнейшем будет отображаться в интерфейсе при просмотре описания формулы ячейки;
- IndicatorId - идентификатор показателя, в котором размещать формулу;
- LeftHeaderPlacementKind - на каких типах элементов размещать формулу: на любых / только на виртуальных (в т. ч. группировочных) / только на настоящих;
- Dictionaries - описание фильтров на справочники строк и столбцов, в которых необходимо размещать формулу. Если не указан фильтр на справочник, формула будет размещаться для каждого элемента этого справочника;
- Expression - текстовое выражение формулы, операнды размещаются в квадратных скобках в виде [<идентификатор операнда>];
- Operands - коллекция операндов;
Операнды формулы
- AttributeFormulaOperandDto - операнд, значение которого берется из атрибута;
- IndicatorFormulaOperandDto - операнд, значение которого берется из показателя;
- ParameterFormulaOperandDto - операнд, значение которого берется из параметра отчета;
- TokenAttributeFormulaOperandDto - операнд, значение которого берется из токена;
- PredefinedPivotOperandDto - операнд, значение которого предопределено в момент открытия отчета;
AttributeFormulaOperandDto
Формула: если длина значения атрибута-строки больше 10, то выведем длину, иначе - null.
1 "formulas": [
2 {
3 "indicatorId": -10,
4 "dictionaries": [],
5 "calculateByDiffs": false,
6 "leftHeaderPlacementKind": "AnyElement",
7 "expression": "if(Length(Coalesce([0], '')) > 10, Length([0]), null())",
8 "operands": [
9 {
10 "dictionaryId": 39323,
11 "attribute": {
12 "id": 22,
13 "discriminator": "OwnAttributeDefinitionDto"
14 },
15 "id": 0,
16 "name": "Атрибут-строка",
17 "discriminator": "AttributeFormulaOperandDto"
18 }
19 ],
20 "id": 1,
21 "name": "Формула 01: если длина значения атрибута-строки больше 10, то выведем длину, иначе - null",
22 "discriminator": "IndicatorFormulaDto"
23 }
24 ]
IndicatorFormulaOperandDto
Формула: склеим константную строку с датой показателя элемента шапки A с указанием дня недели.
1 "formulas": [
2 {
3 "indicatorId": -20,
4 "dictionaries": [],
5 "calculateByDiffs": false,
6 "leftHeaderPlacementKind": "AnyElement",
7 "expression": "Concatenate('', 'A: ', if(isNull([1]), 'не задано', DateToString([1], 'dd.MM.yyyy (ddd)')))",
8 "operands": [
9 {
10 "indicatorId": 39344,
11 "dictionaries": [
12 {
13 "dictionaryId": 39326,
14 "filter": {
15 "value": [1],
16 "skipIfValueNull": false,
17 "attribute": {
18 "id": 1,
19 "discriminator": "OwnAttributeDefinitionDto"
20 },
21 "conditionType": "AttributeInCollection",
22 "inversion": false,
23 "discriminator": "ValueConditionalDictionaryFilterDto"
24 }
25 },
26 {
27 "dictionaryId": 39327,
28 "filter": {
29 "value": [2],
30 "skipIfValueNull": false,
31 "attribute": {
32 "id": 1,
33 "discriminator": "OwnAttributeDefinitionDto"
34 },
35 "conditionType": "AttributeInCollection",
36 "inversion": false,
37 "discriminator": "ValueConditionalDictionaryFilterDto"
38 }
39 }
40 ],
41 "aggregationType": "None",
42 "asArray": false,
43 "id": 1,
44 "name": "Дата показателя элемента шапки A",
45 "discriminator": "IndicatorFormulaOperandDto"
46 }
47 ],
48 "id": 2,
49 "name": "Формула 02: склеим константную строку с датой показателя элемента шапки A с указанием дня недели",
50 "discriminator": "IndicatorFormulaDto"
51 }
52 ]