Оригинал на GitHub
Вопрос
Есть простая таблица.
В одном из столбцов в коде рассчитываю значение поля. И в результат беру listCount
.
В условном форматировании у меня работает тот же код, который выдает в comment, listJoin
того же списка, что используется в listCount в Коде.
Проблема в том, что сам расчет тяжелый и рассчитывается получается два раза. Как мне промежуточный результат расчета (сам список получается) в поле Код, передать в "форматирование поля" в этом-же поле. Что бы не считать два раза.
Есть решение, чтобы сам список отдельно считать в отдельном поле и в нужном коде брать уже результат. Но задался вопросом: можно ли сделать без доп столбца?
Ответ
В totum порядок рассчета кодов в поле следующий — Код, Код действия, Код селекта, Код форматирования. Поэтому в более ранних кодах можно записать данные в процессную переменную и использовать ее в последующем коде.
В этом случае мы создадим процессную переменную в Код и будем использовать ее в Код форматирования.
Что бы процессные переменные работали индивидуально для каждой строки, необходимо, что бы в названии процессной переменной использовался id строки. Сколько строк пересчитывается, столько и переменных создается.
Код в секции Код:
=: listCount(list: $procvar)
procvar: procVar(name: str`"list" + #id`; value: $some_code)
some_code: "some code here"
В коде форматирования этого-же поля:
f1=: setFormat(comment: $join)
join: listJoin(list: $procvar; str: ", ")
procvar: procVar(name: str`"list" + #id`; default: $some_code)
some_code: "some code here"
Когда мы в коде форматирования вызываем функцию procVar без указания параметра value, totum проверит ее наличие и если переменная есть, он вернет ее значение, если нет, то будет использован параметр default, который вычислит нужный список аналогично Коду.
Таким образом получается, что если был выполнен Код, то в коде форматирования не будет выполнятся повторный расчет. Но если выполнения кода небыло, тогда будет необходимо вычислить этот список непосредственно в коде форматирования.