Перейти к содержимому

Решение проблем с формулами

Если формула возвращает не то, что вы ожидали, — посмотрите ниже. Случаи отсортированы по частоте.

Формула показывает «—» (пусто)

Самая частая причина — null в выражении.

  • Любое поле, которое не заполнено в строке → null.
  • Любая арифметика с nullnull.
  • Деление на 0null.

Что делать. Защититесь через coalesce и if:

coalesce(amount, 0) * 12 // null → 0
if(price > 0, profit / price, 0) // защита от деления на 0

«Unknown function foo()»

Имя функции написано неправильно или такой функции нет.

  • Проверьте, что функция есть в списке.
  • Регистр имени неважен, но опечатки — да.
  • Своих функций добавить нельзя.

«Aggregate sum() can’t be used in a per-row formula»

Использовали sum / avg / count в формуле-поле там, где система не подаёт контекст датасета.

  • Не работает в режиме «считать построчно» (например, в drill-down preview).
  • Решение. Перенесите вычисление в виджет на дашборде. KPI с sum(amount) всегда работает.

«Unexpected character “X”»

Парсер споткнулся на символе. Чаще всего:

  • Использовали кириллицу в имени поля. Ключ должен быть на латинице.
  • Поставили точку в имени связи: object.price. Точечной нотации нет, см. «Связи в формулах».
  • Использовали ? для тернарного оператора. Замените на if(cond, then, else).

«Unterminated string»

Забыли закрывающую кавычку:

if(category == "Зарплата, amount, 0) // ← нет закрывающей "

Исправление:

if(category == "Зарплата", amount, 0)

Циклическая зависимость

Формула A ссылается на формулу B, которая ссылается на A (прямо или через цепочку). Обе ячейки будут пустыми.

  • Найдите цикл вручную: посмотрите, какие поля используются в каждой формуле.
  • Разорвите цикл: одну из формул переведите в обычное вычисляемое поле виджета (не датасета).

Странные результаты у lag / running_sum / rank

Кросс-строчные функции зависят от порядка строк в таблице. Если строки не отсортированы:

  • lag(price) возьмёт «предыдущую по id», а не «предыдущую по дате».
  • running_sum(amount) будет накапливать в случайном порядке.

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

roi(x, 0)null

Деление на нулевую стоимость не имеет смысла. Защитите формулу:

if(purchase_price > 0, roi(profit, purchase_price), null)

cagr(0, ..., ...)null

cagr требует start > 0. Если стартовая стоимость 0 — доходность не определена. Защитите аналогично.

irr вернул null

Возможные причины:

  1. Меньше двух cashflows. Дайте минимум cf0 и cf1.
  2. Нет смены знака. irr(100, 200, 300) — нет действительного решения. Хотя бы один отрицательный поток должен быть.
  3. Не сошлось за 100 итераций. Экзотика — возникает, если поток сильно асимметричный.

Чего пока нет в Invest

Несколько частых запросов, которые не получится реализовать на текущем парсере без обходных путей:

  • Точечная нотация для связей (relation.field).
  • Тернарный оператор ? :.
  • Регулярные выражения (есть только contains).
  • Своих функций — расширить набор нельзя.
  • Чтение строк из другого датасета внутри формулы — только через дашборд-агрегацию.
  • Циклы / накопление переменной во времени — частично решается running_sum, но не любой кейс.

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

Что дальше