Flow выражения

Flow - это выражение, с помощью которого можно подставить данные на основе ввода респондента (как есть или произведя какие-то операции) в определённые места опроса, для: валидации, вывода этих данных, расчета и т.п.

Выражение Flow может быть использовано везде, где есть знак 𝑓.

Например, в описании вопроса можно ввести Flow выражение:

round(${Q1[1]} / 12, 2)

что соответствует следующему:

  • взять ответ из вопроса Q1, варианта ответа с ID 1
  • разделить на 12
  • округлить до 2 знаков после запятой при помощи функции round

Или другой пример, в поле “Максимум” числового варианта ответа записать:

${Q1[1]} + ${Q2[3]}

что соответствует следующему:

  • взять значение из варианта ответа с ID 1, вопроса Q1
  • прибавить значение из варианта ответа с ID 3, вопроса Q2
  • результат выполнения будет использован в качестве проверки на максимальное значение в текущем варианте ответа

Выражение Flow может быть любой длины, использовать скобки для определения приоритетности выполнения.

(${Q1[1]} + ${Q2[3]}) * 2

Сначала значение из варианта ответа 1, вопроса Q1 сложится со значением варианта ответа 3, вопроса Q2. После, результат сложения, умножится на 2.


Типы данных

В Flow существует 5 типов данных:

  • число
  • строка
  • логический
  • дата
  • время

Числовой тип

1000 - целое число

1.00001 - число с плавающей точкой

Запятая не может использоваться для записи числа с плавающей точкой.

Строка

“строка” или ‘строка’

Строка записывается в одинарных или двойных кавычках. Любые символы, записанные в одинарных или двойных кавычках являются строкой, в том числе число. Пример: ‘1.001’ - является строкой.

Логический

true - истина

false - ложь

При этом регистр значения не имеет. Возможные записи:
true True TRUE false False FALSE

Дата

Не может быть записана прямым путем. Дата может быть использована только через подстановки.

Время

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


Подстановки

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

Конструкция подстановки выглядит таким образом:

${цель|метод}

Цель - это то, к чему идет обращение подстановки.
Метод - определяет, что именно требуется получить от цели.

Цель

Возможные записи цели:

Q7 - обращение к вопросу, с ID Q7

Q7[3] - обращение к варианту ответа с ID = 3, вопроса c ID = Q7

Q7[2, q] - обращение к вопросу матрицы. Q7 - ID вопроса; 2 - ID вопроса (строки) матрицы; q - указание, что мы обращаемся именно к вопросу матрицы.

Q7[2, a] - обращение к варианту ответа матрицы. Q7 - ID вопроса; 2 - ID варианта ответа (столбца) матрицы; a - указание, что мы обращаемся именно к варианту ответа матрицы.

Q7[1][2] - обращение к ячейке (пересечению вопроса и варианта ответа) матрицы. Q7 - ID вопроса; 1 - ID вопроса (строки) матрицы; 2 - ID варианта ответа (столбца) матрицы.

Метод

Список доступных методов:
fm_desc_Method fm_desc_Description fm_desc_ReturnType fm_desc_AppSupport
count fm_getQuestionCount FlowTypeNumber +
sum fm_getQuestionSum FlowTypeNumber +
answertext fm_getQuestionAnswertext FlowTypeString +
id fm_getQuestionId FlowTypeNumber +
answerimage fm_getQuestionAnswerimage FlowTypeString +
answers fm_getQuestionAnswers FlowTypeNumber
minanswers fm_getQuestionMinanswers FlowTypeNumber
minanswersq fm_getQuestionMinanswersq FlowTypeNumber
fm_desc_Method fm_desc_Description fm_desc_ReturnType fm_desc_AppSupport
value fm_getAnswerValue fm_rt_getAnswerValue +
listtext fm_getAnswerListtext FlowTypeString +
description fm_getAnswerDescription FlowTypeString +
image fm_getAnswerImage FlowTypeString +
selected fm_getAnswerSelected FlowTypeBool +
selectedn fm_getAnswerSelectedn FlowTypeNumber +
valuenull fm_getAnswerValuenull fm_rt_getAnswerValue +
answers fm_getAnswerAnswers FlowTypeNumber
fm_desc_Method fm_desc_Description fm_desc_ReturnType fm_desc_AppSupport
description fm_getMtxRowDescription FlowTypeString +
answertext fm_getMtxRowAnswertext FlowTypeString +
id fm_getMtxRowId FlowTypeNumber +
answerimage fm_getMtxRowAnswerimage FlowTypeString +
sum fm_getMtxRowSum FlowTypeNumber +
answers fm_getMtxRowAnswers FlowTypeNumber
fm_desc_Method fm_desc_Description fm_desc_ReturnType fm_desc_AppSupport
description fm_getMtxAnswerDescription FlowTypeString +
image fm_getMtxAnswerImage FlowTypeString +
answers fm_getMtxAnswerAnswers FlowTypeNumber
count fm_getMtxAnswerCount FlowTypeNumber +
fm_desc_Method fm_desc_Description fm_desc_ReturnType fm_desc_AppSupport
value fm_getMtxCellValue fm_rt_getMtxCellValue +
listtext fm_getMtxCellListtext FlowTypeString +
selected fm_getMtxCellSelected FlowTypeBool +
selectedn fm_getMtxCellSelectedn FlowTypeNumber +
valuenull fm_getMtxCellValuenull fm_rt_getMtxCellValue +
answers fm_getMtxCellAnswers FlowTypeNumber

Функции

Функции принимают данные, производят вычисления и возвращают результат.

Функция может принимать несколько параметров. Параметры функции разделяются запятыми.

Пример записи функции round, которая округляет числовое значение с плавающей точкой до заданного количества символов после запятой:

round(100.223113, 2)

round - название функции;
100.223113 и 2 - параметры, разделены запятой;
Результат выполнения функции будет: 100.22

Доступные функции:
f_desc_Name f_desc_Description f_desc_ReturnTypeAndDesc f_desc_AppSupport
date f_desc_date

f_desc_Params:
1 (FlowTypeString) - f_param_date_1
2 (FlowTypeString) - f_param_date_2
FlowTypeDate - f_return_date +
day f_desc_day

f_desc_Params:
1 (FlowTypeDate) - f_param_day_1
FlowTypeNumber - f_return_day +
dayw f_desc_dayw

f_desc_Params:
1 (FlowTypeDate) - f_param_dayw_1
FlowTypeNumber - f_return_dayw +
month f_desc_month

f_desc_Params:
1 (FlowTypeDate) - f_param_month_1
FlowTypeNumber - f_return_month +
year f_desc_year

f_desc_Params:
1 (FlowTypeDate) - f_param_year_1
FlowTypeNumber - f_return_year +
currdate f_desc_currdate

f_desc_Params:
FlowTypeDate - f_return_currdate +
subday f_desc_subday

f_desc_Params:
1 (FlowTypeDate) - f_param_subday_1
2 (FlowTypeNumber) - f_param_subday_2
FlowTypeDate - f_return_subday +
addday f_desc_addday

f_desc_Params:
1 (FlowTypeDate) - f_param_addday_1
2 (FlowTypeNumber) - f_param_addday_2
FlowTypeDate - f_return_addday +
dateformat f_desc_dateformat

f_desc_Params:
1 (FlowTypeDate) - f_param_dateformat_1
2 (FlowTypeString) - f_param_dateformat_2
FlowTypeDate - f_return_dateformat +
currtime f_desc_currtime

f_desc_Params:
FlowTypeTime - f_return_currtime +
concat f_desc_concat

f_desc_Params:
1 - f_param_concat_1
2 - f_param_concat_2
FlowTypeString - f_return_concat +
round f_desc_round

f_desc_Params:
1 (FlowTypeNumber) - f_param_round_1
2 (FlowTypeNumber) - f_param_round_2
FlowTypeNumber - f_return_round +
pow f_desc_pow

f_desc_Params:
1 (FlowTypeNumber) - f_param_pow_1
2 (FlowTypeNumber) - f_param_pow_2
FlowTypeNumber - f_return_pow +

Операторы

Операторы бывают следующие: !, *, /, %, +, -, <, <=, >, >=, ==, !=, &&, ||

Операторы могут быть применены к определенным типам. При этом типы, для которых применяется оператор должны быть идентичны. Т.е. сравнение числового значения и строки приведет к ошибке, например: “1” == 1 приведет к ошибке “Типы данных для оператора ‘==’ не идентичны”.

Список операторов:
Оператор Описание Применяется к типам Возвращаемый тип Примеры
! Логическая инверсия Логический Логический !(1==1)
Результат: false

!true
Результат: false
* Умножение Число Число 5*20 Результат: 100
/ Деление Число Число 100/5
Результат: 20
+ Сложение Число Число 100+20
Результат: 120
- Вычитание Число Число 100-20
Результат: 80
< Меньше Число
Дата
Время
Логический 1 < 100
Результат: true

25.01.2002 < 30.01.2002 *
Результат: true

13:30 < 16:00 *
Результат: true
<= Меньше или равно Число
Дата
Время
Логический
> Больше Число
Дата
Время
Логический
>= Больше или равно Число
Дата
Время
Логический
== Равно Число
Дата
Время
Строка
Логический
Логический 1 == 1
Результат: true

25.01.2002 == 25.01.2002 *
Результат: true

13:30 == 13:30 *
Результат: true

“а”==”а”
Результат: true

true==true
Результат: true
!= Не равно Число
Дата
Время
Строка
Логический
Логический
&& Логическое И Логический Логический true && true
Результат: true

1 < 10 && 5 > 3
Результат: true

1 > 0 && 13:30==13:30 *
Результат: true
|| Логическое ИЛИ Логический Логический 1 > 5 || 5 < 10
Результат: true

* запись 13:30 или 25.01.2002 в Flow недопустима. Время и дата не могут быть прямо записаны в Flow, для них необходимо использовать подстановки.


Проверка и ошибки

Выражение Flow проверяется на синтаксис на этапе сохранения. Также, в момент сохранения Flow, определяется возвращаемый тип и проверяется, подходит ли данный тип для конкретного поля.

Если Flow используется в полях, где требуется определенный тип, то выражение Flow должно вернуть требуемый тип. Например, для параметра “Минимум” в числовом варианте ответа возвращаемый тип Flow должен быть числовой. В случае, если выражение Flow во время сохранения вопроса вернет другой тип (например “строка”) будет выведена ошибка “Неверный тип вычисления”.

Не все ошибки могут быть проверены на этапе сохранения Flow. Например, логика опроса может быть построена таким образом, что будет пропущен вопрос, ответ на который необходим в выполнении Flow. В данном случае возникнет ошибка “Отсутствует значение”.

Ошибки Flow выводятся в качестве предупреждения во время тестового прохождения опроса. Рекомендуется проверять опрос по тестовой ссылке перед началом прохождения в рабочем режиме.

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

Например, если Flow выражение используется в поле “Максимум” варианта ответа типа “Дата” и во время прохождения опроса возникла ошибка, то проверка на максимально введенную дату будет проигнорирована.

Во время проверки или выполнения выражения Flow могу возникнуть следующие ошибки:

  • Элемент не может находиться вначале
  • Элемент не может следовать после
  • Не могу прочитать строку
  • Элемент не может находиться в этом месте
  • Синтаксическая ошибка в подстановке
  • Подстановка не найдена
  • Отсутствует значение
  • Значение не может быть приведено к ожидаемому типу
  • Для подстановки необходимо указать метод
  • Метод не существует для подстановки
  • Вопрос не может ссылаться на самого себя или на вопросы стоящие после него
  • Тип вопроса в подстановке не соответствует реальному типу вопроса
  • Для оператора отсутствует или неверный операнд
  • Недопустимый тип значения для оператора
  • Операторы не могут использоваться в таком виде
  • Типы данных не идентичны
  • Деление на ноль
  • Результат - бесконечность
  • Неверный тип вычисления
  • Ошибка в функции
  • Обязательный параметр для функции отсутствует
  • Неверный тип переменной для параметра
  • Функция не существует