Вопросы типа calculate в XLSForm и rtSurvey используются для выполнения вычислений на основе других полей или значений формы. Такие вопросы не отображаются пользователю, а выполняются в фоновом режиме, сохраняя результаты для дальнейшего использования или отправки.

Синтаксис

В XLSForm вопрос типа calculate определяется следующим образом:

typenamelabelcalculation
calculatecalc_q1${q1} + ${q2}
  • type: всегда “calculate” для данного типа вопроса.
  • name: уникальное имя для поля calculate.
  • label: обычно оставляется пустым, так как поля calculate не отображаются пользователям.
  • calculation: формула для вычисления.

Применение

Вопросы типа calculate обычно используются для:

  1. Выполнения арифметических операций
  2. Конкатенации строк
  3. Применения сложной логики или функций
  4. Хранения промежуточных результатов для дальнейшего использования

Примеры

Базовая арифметика

  | type      | name     | calculation |
|-----------|----------|-------------|
| calculate | total    | ${price} * ${quantity} |
  

Конкатенация строк

  | type      | name     | calculation |
|-----------|----------|-------------|
| calculate | full_name| concat(${first_name}, ' ', ${last_name}) |
  

Использование функций

  | type      | name     | calculation |
|-----------|----------|-------------|
| calculate | age      | int((today() - ${date_of_birth}) / 365.25) |
  

Расширенное использование в rtSurvey

Функция pulldata()

rtSurvey поддерживает функцию pulldata() в полях calculate, позволяя получать данные из внешних CSV-файлов:

  | type      | name     | calculation |
|-----------|----------|-------------|
| calculate | city     | pulldata('cities', 'city_name', 'zip_code', ${zip_input}) |
  

Синтаксис

Базовый синтаксис pulldata():

  pulldata('csv_filename', 'column_to_return', 'key_column', ${matching_value})
  
  • ‘csv_filename’: имя CSV-файла (без расширения .csv)
  • ‘column_to_return’: имя столбца, содержащего нужные данные
  • ‘key_column’: имя столбца для сопоставления
  • ${matching_value}: значение для поиска в ключевом столбце (часто переменная из формы)

Важные замечания

  1. CSV-файл должен быть загружен вместе с XLSForm при развёртывании опроса.
  2. Используйте запятые в качестве разделителей в CSV-файле, а не точки с запятой.
  3. Избегайте запятых внутри полей данных CSV, так как они могут вызвать проблемы с разбором.
  4. pulldata() поддерживает только отношения 1-к-1. При нескольких совпадениях возвращается только первое.
  5. Может существовать ограничение на длину извлекаемого текста (около 76 символов).
  6. Можно использовать pulldata() в ограничениях для проверки записей по данным CSV.

Условные вычисления

Для условных вычислений можно использовать операторы if():

  | type      | name     | calculation |
|-----------|----------|-------------|
| calculate | discount | if(${total} > 1000, ${total} * 0.1, 0) |
  

Лучшие практики

  1. Используйте содержательные имена для полей calculate для улучшения читаемости формы.
  2. Избегайте слишком сложных вычислений в одном поле; при необходимости разбивайте их на части.
  3. Тщательно тестируйте вычисления, особенно при использовании сложных формул или внешних данных.
  4. Помните, что поля calculate выполняются каждый раз при обновлении формы, что может влиять на производительность при большом количестве сложных вычислений.
  5. При использовании pulldata() убедитесь, что CSV-файлы правильно отформатированы, и тщательно тестируйте с вашими конкретными данными и структурой формы.

Ограничения

  • Поля calculate недоступны для прямого редактирования пользователями.
  • Результат поля calculate не виден немедленно, если не используется в отображаемом поле или в логике формы.
Была ли эта страница полезной?