# CalcDim — функция диаграммы

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

Эта функция не может использоваться в Скрипте загрузки. Кроме того, для повышения производительности системы рекомендуется по возможности загружать поля, используемые в вычисляемом измерении, как логические поля с помощью Скрипта загрузки. CalcDim() предлагает способ управления поведением ядра в сценариях, когда загрузка вычисляемого поля из скрипта невозможна.

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

Выражение, заключенное в CalcDim() , будет вести себя так же, как все выражения вычисляемых измерений работают в QlikView, что представляет собой специальное сопоставление вычисленных значений с базовыми значениями исходного поля. Все вычисления «на лету» могут быть перенесены в вычисляемые измерения с помощью функции CalcDim(), поскольку вычисляемое измерение должно соответствовать меньшим требованиям на основе модели данных, чем соответствующее вычисление «на лету». Это преобразование может быть желательным для обеспечения аналогичного поведения для всех вычисляемых измерений, где модель данных может препятствовать использованию вычисления «на лету» в одних случаях, но не в других.

[Вычисляемые поля](https://community.qlik.com/t5/Design/Calculated-Fields/ba-p/1694383)

Синтаксис:

CalcDim(expr)

Возвращаемые типы данных: двойное значение

Аргументы

| Аргумент | Описание |
| --- | --- |
| expr | Выражение, используемое в качестве измерения или в качестве сегмента в выражении измерения. |

## Когда использовать CalcDim

CalcDim() полезно, когда вам нужен больший контроль над тем, как механизм Qlik обрабатывает поля, которые вы вызываете в выражении измерения.

По умолчанию Qlik Sense автоматически решает, создавать ли и ссылаться ли на внутренние поля в модели данных при использовании пользовательского выражения измерения. Qlik Sense создает и использует эти внутренние поля, когда это возможно. Когда это невозможно, выражение обрабатывается со ссылкой на существующие поля модели данных, на которые оно опирается.

В зависимости от вашего варианта использования, эта автоматическая обработка не всегда может быть желательной. Например, если вы используете переменную в выражении измерения, автоматическое создание новых полей может стать проблематичным. В этом случае используйте CalcDim(), чтобы принудительно обработать выражение без использования этого метода.

Ниже приведены некоторые распространенные варианты использования:

* Вы перенесли содержимое QlikView в Qlik Sense и хотите сохранить метод обработки QlikView для вычисляемых измерений.

* Вы хотите упростить поведение выбора в вашем приложении. Например, вы предпочитаете отображать выборки полей как выборки в полях из исходной модели данных, а не как выборки в новых полях.

* Ваш вариант использования требует специального выражения для согласованности и производительности. Например, если ваше выражение измерения содержит управляемые пользователем динамические параметры визуализации, такие как управляемое форматирование, пороговые значения или периоды.

Примеры функции

| Пример | Результат |
| --- | --- |
| `=CalcDim(if(Year < 2023, 'Older', Year))` | Выбор в визуализации, использующей это измерение, будет обработан и отображен как выбор в соответствующем значении поля Year из модели данных.<br><br>И наоборот, предположим, вы не заключаете выражение в CalcDim(). В этом случае это будет выглядеть так:<br><br>`=if(Year < 2023, 'Older', Year)`<br><br>Выбор в приведенном выше выражении будет обработан и отображен как выбор во внутреннем поле =if(Year &lt; 2023, 'Older', Year), которое отсутствует в модели данных. |

## Пример 1 – Простое сравнение

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/SystemFunctions/calcdim.htm)

#### Выражения диаграммы и результаты

Обзор

В этом примере вы:

* Добавьте встроенную таблицу и загрузите данные в приложение.

* Создайте таблицу для визуализации данных и выполнения расчетов.

* Выполните выборки в таблице, чтобы наблюдать разницу в поведении.

Откройте Редактор загрузки данных и добавьте следующий скрипт загрузки в новый раздел.

Скрипт загрузки загружает встроенную таблицу. Эта таблица включает два поля: поле для имени человека и поле для фамилии человека.

Скрипт загрузки

```
Names:

Load * inline [
FirstName,LastName
John,Doe
Amanda,Honda
Amalia,Craig
Cart,Lynch
];
```

Создание таблицы

Загрузите данные и откройте лист. Создайте новую таблицу и добавьте эти поля как измерения:

* FirstName

* LastName

Далее добавьте каждое из следующих выражений в качестве измерений в таблице:

* =FirstName & ' ' & LastName

* =CalcDim(FirstName & ' ' & LastName)

Таблица должна выглядеть как следующее.

Qlik SenseQlik Sense таблица с примерами результатов

| FirstName | LastName | =FirstName & ' ' & LastName | =CalcDim(FirstName & ' ' & LastName) |
| --- | --- | --- | --- |
| John | Doe | John Doe | John Doe |
| Amanda | Honda | Amanda Honda | Amanda Honda |
| Amalia | Craig | Amalia Craig | Amalia Craig |
| Cart | Lynch | Cart Lynch | Cart Lynch |

Сравнение: Выбор

В столбце =FirstName & ' ' & LastName таблицы выберите значение John Doe. Обратите внимание, что на полосе инструментов выбора значение выбрано как значение из поля с именем =FirstName&' '&LastName.

Очистить выбор.

В столбце =CalcDim(FirstName & ' ' & LastName) таблицы выберите значение John Doe. На панели инструментов выбора значение выбирается как значения из двух разных полей: FirstName и LastName.

Эти два выражения представляют одну и ту же информацию: конкатенацию полей FirstName и LastName. Разница в том, что без CalcDim() создается синтетическое поле для хранения расчета. С CalcDim() исходные поля из модели данных используются в качестве основы для вычисляемого измерения.

## Пример 2 – Практический вариант использования для изменения поведения по умолчанию

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/SystemFunctions/calcdim.htm)

#### Выражения диаграммы и результаты

Обзор

В этом примере мы создаем динамические выражения измерения, ссылающиеся на переменную, а не на статические значения.

В этом примере вы:

* Добавьте встроенную таблицу и загрузите данные в приложение.

* Создадите переменную для динамического хранения значения.

* Создайте таблицу для визуализации данных и выполнения расчетов.

* Выполните выборки в таблице, чтобы наблюдать разницу в поведении.

Откройте Редактор загрузки данных и добавьте следующий скрипт загрузки в новый раздел.

Скрипт загрузки загружает встроенную таблицу. Эта таблица включает поле даты и вычисляемое поле, Year, которое получено из исходных дат.

Скрипт загрузки

```
SET DateFormat='MM/DD/YYYY';
						
Transactions:

Load *,

RowNo() as ID,
Year(date) as Year
;

Load * Inline
[
date,amount
'1/19/2022',37.23
'2/28/2022',88.27
'3/16/2022',53.80
'4/1/2022',82.06
'5/16/2022',87.21
'6/26/2022',45.89
'7/9/2022',36.23
'8/2/2022',76.11
'9/26/2022',84.21
'10/29/2022',67.67
'1/1/2023',100.49
'2/24/2023',99.47
'3/6/2023',50.02
'4/10/2023',2.05
'5/20/2023',75.64
'6/25/2023',98.11
'7/19/2023',30.00
'9/27/2023',76.11
'10/26/2023',43.21
'11/12/2023',135.41
'1/15/2024',67.24
];
```

Создание переменной

Загрузите данные и откройте лист. Создайте переменную с именем vCutoffYear и задайте ей следующее Определение: 2023

Создание таблицы

Загрузите данные и откройте лист. Создайте новую таблицу и добавьте эти поля как измерения:

* date

* Year

* amount

Далее добавьте каждое из следующих выражений в качестве измерений в таблице:

* =if(Year &lt; $(vCutoffYear), 'Older', Year)

* =CalcDim(if(Year &lt; $(vCutoffYear), 'Older', Year))

Таблица должна выглядеть как следующее.

Qlik SenseQlik Sense таблица с примерами результатов

| date | Year | amount | if(Year &lt; $(vCutoffYear), 'Older', Year) | =CalcDim(if(Year &lt; $(vCutoffYear), 'Older', Year)) |
| --- | --- | --- | --- | --- |
| 1/19/2022 | 2022 | 37.23 | Older | Older |
| 2/28/2022 | 2022 | 88.27 | Older | Older |
| 3/16/2022 | 2022 | 53.80 | Older | Older |
| 4/1/2022 | 2022 | 82.06 | Older | Older |
| 5/16/2022 | 2022 | 87.21 | Older | Older |
| 6/26/2022 | 2022 | 45.89 | Older | Older |
| 7/9/2022 | 2022 | 36.23 | Older | Older |
| 8/2/2022 | 2022 | 76.11 | Older | Older |
| 9/26/2022 | 2022 | 84.21 | Older | Older |
| 10/29/2022 | 2022 | 67.67 | Older | Older |
| 1/1/2023 | 2023 | 100.49 | 2023 | 2023 |
| 2/24/2023 | 2023 | 99.47 | 2023 | 2023 |
| 3/6/2023 | 2023 | 50.02 | 2023 | 2023 |
| 4/10/2023 | 2023 | 2.05 | 2023 | 2023 |
| 5/20/2023 | 2023 | 75.64 | 2023 | 2023 |
| 6/25/2023 | 2023 | 98.11 | 2023 | 2023 |
| 7/19/2023 | 2023 | 30.00 | 2023 | 2023 |
| 9/27/2023 | 2023 | 76.11 | 2023 | 2023 |
| 10/26/2023 | 2023 | 43.21 | 2023 | 2023 |
| 11/12/2023 | 2023 | 135.41 | 2023 | 2023 |
| 1/15/2024 | 2024 | 67.24 | 2024 | 2024 |

Сравнения, часть 1: Поведение без CalcDim()

В приведенной выше таблице нет разницы между двумя столбцами вычисляемого измерения.

В столбце if(Year &lt; $(vCutoffYear), 'Older', Year) таблицы выберите значение 2023. Обратите внимание, что на панели выбора значение выбрано как значение из поля с именем =if(Year&lt;2023,'Older',Year).

Затем измените определение переменной vCutoffYear на 2024. Обратите внимание, что хотя поле выбора =if(Year&lt;2023,'Older',Year) осталось прежним и сохраняет выбранное значение 2023, данные в таблице изменились. Значение 2023 изменилось на значение Older. Если вы выберете Older в столбце if(Year &lt; $(vCutoffYear), 'Older', Year), выбор Older будет сделан в новом поле: =if(Year&lt;2024,'Older',Year).

По сути, внутренне создается новое поле для каждого значения vCutoffYear переменной. При работе с одновременными и изменяющимися выборками такое поведение может быть нежелательным и может усложнить интерпретацию данных.

Сравнения, часть 2: Поведение с CalcDim()

Теперь, когда вы увидели поведение выражения, когда оно не заключено в CalcDim(), очистите все выделения в приложении. Сбросить vCutoffYear переменную до значения 2023.

В столбце =CalcDim(if(Year &lt; $(vCutoffYear), 'Older', Year)) таблицы выберите значение 2023. Обратите внимание, что в полосе выбора значение выбрано как значение из базового поля, Year.

Затем измените определение переменной vCutoffYear на 2024. Поле выбора Year осталось прежним, оно сохраняет выбранное значение 2023, а данные в таблице изменились, как видно без CalcDim(). Однако, если теперь выбрать Older в столбце =CalcDim(if(Year &lt; $(vCutoffYear), 'Older', Year)), то значение 2024 будет выбрано в Year.

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

## Подробнее

* [Вычисляемые поля](https://community.qlik.com/t5/Design/Calculated-Fields/ba-p/1694383)

* [Вычисляемые измерения](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Sense_Hub/Dimensions/calculated-dimensions.htm)