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

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

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

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

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

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

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

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

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

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

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

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

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

Основные свойства операнда-показателя:

  • Id - идентификатор операнда;
  • Name - описание операнда;
  • IndicatorId - идентификатор показателя, из которого брать значение для операнда;
  • Dictionaries - описание фильтров на справочники показателя, по отметке которых необходимо брать значение операнда. Если не указан фильтр на справочник, то будет использоваться отметка самой формулы, если в приемнике (показателе, где размещается формула) есть такой справочник. Например, если нужно задать формулу, которая для некоторого столбца будет построчно брать значение из другого столбца, то не нужно задавать фильтры на справочники строк операнда. См. пример в разделе Агрегация операнда IndicatorFormulaOperandDto
  • AggregationType - тип агрегации: если для операнда выберется более одного значения, то применится указанный тип агрегации, либо упадет ошибка, если агрегация не задана;
  • AsArray - признак использования значений операнда, как массива: используется, если для операнда выберется более одного значения и эти значения нужно передать в функцию, указанную в Expression формулы;

Формула: склеим константную строку с датой показателя элемента шапки 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": [
16                   1
17                 ],
18                 "skipIfValueNull": false,
19                 "attribute": {
20                   "id": 1,
21                   "discriminator": "OwnAttributeDefinitionDto"
22                 },
23                 "conditionType": "AttributeInCollection",
24                 "inversion": false,
25                 "discriminator": "ValueConditionalDictionaryFilterDto"
26               }
27             },
28             {
29               "dictionaryId": 39327,
30               "filter": {
31                 "value": [
32                   2
33                 ],
34                 "skipIfValueNull": false,
35                 "attribute": {
36                   "id": 1,
37                   "discriminator": "OwnAttributeDefinitionDto"
38                 },
39                 "conditionType": "AttributeInCollection",
40                 "inversion": false,
41                 "discriminator": "ValueConditionalDictionaryFilterDto"
42               }
43             }
44           ],
45           "aggregationType": "None",
46           "asArray": false,
47           "id": 1,
48           "name": "Дата показателя элемента шапки A",
49           "discriminator": "IndicatorFormulaOperandDto"
50         }
51       ],
52       "id": 2,
53       "name": "Формула 02: склеим константную строку с датой показателя элемента шапки A с указанием дня недели",
54       "discriminator": "IndicatorFormulaDto"
55     }
56   ]

Агрегация операнда IndicatorFormulaOperandDto

Формула: агрегация операнда в строке Итого в целом столбце A.

 1   "formulas": [
 2     {
 3       "indicatorId": 39344,
 4       "dictionaries": [
 5         {
 6           "dictionaryId": 39323,
 7           "filter": {
 8             "value": [
 9               1
10             ],
11             "skipIfValueNull": false,
12             "attribute": {
13               "id": 1,
14               "discriminator": "OwnAttributeDefinitionDto"
15             },
16             "conditionType": "AttributeInCollection",
17             "inversion": false,
18             "discriminator": "ValueConditionalDictionaryFilterDto"
19           }
20         },
21         {
22           "dictionaryId": 39326,
23           "filter": {
24             "value": [
25               1
26             ],
27             "skipIfValueNull": false,
28             "attribute": {
29               "id": 1,
30               "discriminator": "OwnAttributeDefinitionDto"
31             },
32             "conditionType": "AttributeInCollection",
33             "inversion": false,
34             "discriminator": "ValueConditionalDictionaryFilterDto"
35           }
36         },
37         {
38           "dictionaryId": 39327,
39           "filter": {
40             "value": [
41               3
42             ],
43             "skipIfValueNull": false,
44             "attribute": {
45               "id": 1,
46               "discriminator": "OwnAttributeDefinitionDto"
47             },
48             "conditionType": "AttributeInCollection",
49             "inversion": false,
50             "discriminator": "ValueConditionalDictionaryFilterDto"
51           }
52         }
53       ],
54       "calculateByDiffs": false,
55       "leftHeaderPlacementKind": "AnyElement",
56       "expression": "[0]",
57       "operands": [
58         {
59           "indicatorId": 39344,
60           "dictionaries": [
61             {
62               "dictionaryId": 39323,
63               "filter": {
64                 "value": [
65                   2,
66                   3
67                 ],
68                 "skipIfValueNull": false,
69                 "attribute": {
70                   "id": 1,
71                   "discriminator": "OwnAttributeDefinitionDto"
72                 },
73                 "conditionType": "AttributeInCollection",
74                 "inversion": false,
75                 "discriminator": "ValueConditionalDictionaryFilterDto"
76               }
77             }
78           ],
79           "aggregationType": "Sum",
80           "asArray": false,
81           "code": null,
82           "id": 0,
83           "name": "Элементы 1 и 2 по строкам, и целый столбец A",
84           "discriminator": "IndicatorFormulaOperandDto"
85         }
86       ],
87       "code": null,
88       "id": 3,
89       "name": "Формула 03: агрегация операнда в строке Итого в целом столбце A",
90       "discriminator": "IndicatorFormulaDto"
91     }
92   ]