Формулы отчета

Материал из 3v-wiki
Перейти к навигации Перейти к поиску

В отчете можно задавать формулы для показателей: реальных и виртуальных, но нельзя размещать в атрибутах. Описание формул содержится внутри описания показателя. Однако, за счет того, что в формуле указывается идентификатор показателя, и этот идентификатор можно указать любым показателем отчета, то и формулы появятся у указанного показателя, а не у того, внутри которого описаны формулы.

Формулы рассчитываются в момент построения отчета после загрузки данных и ПОСЛЕ агрегации данных в хранимых показателях, но для виртуальных показателей агрегация выполняется после расчета формул в них.

Особенности размещения в хранимых показателях

Формулы рассчитываются после загрузки и агрегации данных. При этом, если формулы размещаются в хранимых показателях, они могут перетереть значение, которое было в ячейке (в т. ч. null). Но такие ячейки не будут помечены как измененные, и при сохранении отчета сразу после открытия эти изменения не сохранятся в показателе. Это сделано из соображений очевидности для пользователя: было бы странным при открытии отчета показывать пользователю, что в нем уже есть измененные данные. Поэтому отчет нужно вводить в эксплуатацию либо с пустыми данными, либо чтобы эти данные соответствовали настроенному расчету.

Формула пересчитываются автоматически при изменении ячеек, от которых она зависит. В этом случае, если значение ячеек формулы изменилось, они помечаются, как измененные.

Основные свойства формулы

Все свойства формулы можно посмотреть в документации.

  • Id - идентификатор формулы;
  • Name - описание формулы, в дальнейшем будет отображаться в интерфейсе при просмотре описания формулы ячейки;
  • IndicatorId - идентификатор показателя, в котором размещать формулу;
  • LeftHeaderPlacementKind - на каких типах элементов размещать формулу: на любых / только на виртуальных (в т. ч. группировочных) / только на настоящих;
  • Dictionaries - описание фильтров на справочники строк и столбцов, в которых необходимо размещать формулу. Фильтры на справочники столбцов должны быть обязательно определены. Если же не указан фильтр на справочник строк, формула будет размещаться для каждого элемента этого справочника;
  • Expression - текстовое выражение формулы, операнды размещаются в квадратных скобках в виде [<идентификатор операнда>];
  • Operands - коллекция операндов;

Операнды формулы

  • AttributeFormulaOperandDto - операнд, значение которого берется из атрибута;
  • IndicatorFormulaOperandDto - операнд, значение которого берется из показателя;
  • ParameterFormulaOperandDto - операнд, значение которого берется из параметра отчета;
  • TokenAttributeFormulaOperandDto - операнд, значение которого берется из токена;
  • PredefinedPivotOperandDto - операнд, значение которого предопределено в момент открытия отчета;

AttributeFormulaOperandDto

 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

 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         ]