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

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

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

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

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

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

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

Способы добавления формулы

1. Простые формулы можно настроить через строку формул. Для этого необходимо кликнуть на столбец (в ячейку с нумерацией столбца), в котором необходимо произвести расчет формулы, затем в строке формул нажать кнопку "Редактировать" и кликами по столбцам определить необходимые операнды (выбрать столбцы, которые будут являться операндами) при этом ввести необходимые функции и/или арифметические действия, затем нажать на кнопку "Применить".

Примеры настройки формулы для виртуального показателя через строку формул

2. Более сложные формулы необходимо настраивать вручную через json. Формулы прописываются в коллекции "formulas": [] реального или виртуального показателя. Идентификаторы формул должны идти по порядку и не повторяться. Основные свойства и примеры формул описаны ниже.

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

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

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

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

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

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   ]

Параметр отчета ParameterFormulaOperandDto

Формула: значение из параметра.

 1   "formulas": [
 2     {
 3       "indicatorId": -30,
 4       "dictionaries": [],
 5       "calculateByDiffs": false,
 6       "leftHeaderPlacementKind": "AnyElement",
 7       "expression": "[0]",
 8       "operands": [
 9         {
10           "parameterId": 1,
11           "id": 0,
12           "name": "Значение параметра-1",
13           "discriminator": "ParameterFormulaOperandDto"
14         }
15       ],
16       "code": null,
17       "id": 4,
18       "name": "Формула 04: значение параметра-1",
19       "discriminator": "IndicatorFormulaDto"
20     }
21   ]


Атрибут параметра ParameterAttributeFormulaOperandDto

Формула: значение из атрибута параметра.

 1   "formulas": [
 2     {
 3       "indicatorId": -30,
 4       "dictionaries": [],
 5       "calculateByDiffs": false,
 6       "leftHeaderPlacementKind": "AnyElement",
 7       "expression": "[0]",
 8       "operands": [
 9          {
10             "attribute": {
11               "discriminator": "OwnAttributeDefinitionDto",
12               "id": 25
13             },
14             "parameterId": 1,
15             "discriminator": "ParameterAttributeFormulaOperandDto",
16             "code": null,
17             "id": 0,
18             "name": null
19           }
20       ],
21       "code": null,
22       "id": 4,
23       "name": "Формула 05: значение атрибута 25 параметра-1",
24       "discriminator": "IndicatorFormulaDto"
25     }
26   ]


Атрибут текущего пользователя TokenAttributeFormulaOperandDto

Возможные поля из токена (атрибут attributeId) Значение
name Полное имя пользователя
preferred_username Основное имя пользователя (логин)
given_name Личное имя пользователя
family_name Фамилия пользователя
email Почта пользователя

Формула: значение из атрибута токена.

 1    "formulas": [
 2     {
 3       "indicatorId": -1,
 4       "dictionaries": [],
 5       "calculateByDiffs": false,
 6       "leftHeaderPlacementKind": "AnyElement",
 7       "expression": "[0]",
 8       "operands": [
 9               {
10                 "attributeId": "preferred_username",
11                 "discriminator": "TokenAttributeFormulaOperandDto",
12                 "code": null,
13                 "id": 0,
14                 "name": null
15               }
16       ],
17       "code": null,
18       "id": 4,
19       "name": "Формула: вычисление логина пользователя",
20       "discriminator": "IndicatorFormulaDto"
21     }
22   ]