Как переиспользовать части кода в рамках одного кода?
В кодах возможно вызвать строку, передав в нее и всем строкам дальше переменные. Это же является еще одним методом создания переменных и указания им стартовых значений.
Например сравним 2 значения взятые одним селектом:
=: if(condition: $sum{var: "num" = 1} = $sum{var: "num" = 2}; then: true; else: false)
sum: listSum(list: $select)
select: selectList(table: 'table'; field: 'field'; where: 'num' = $#num)
Этот код в condition
два раза вызывает один и тот-же select
, но передает ему разные значения переменной и по результату это аналогично:
=: if(condition: $sum_1 = $sum_2; then: true; else: false)
sum_1: listSum(list: $select_1)
select_1: select(table: 'table'; field: 'field'; where: 'num' = 1)
sum_2: listSum(list: $select_2)
select_2: select(table: 'table'; field: 'field'; where: 'num' = 2)
В таком маленьком примере лучше не использовать {}
тк они труднее читаются, но если переиспользуемая часть большая — это существенно упрощает код.
Что такое exec?
Функция exec позволяет выполнить код, содержащийся в другом поле или переданный в параметр code
в виде текста.
В каких случаях эффективно использовать exec?
Если у вас несколько полей, выполняющих один и тот-же код с разными параметрами. Например у нас отчет за год, где каждое поле — это месяц.
В первом поле пишем:
=: listSum(list: $list)
list: selectList(table: 'table'; field: 'sum'; where: 'date' >= $datestart; where: 'date' <= $dateend)
datestart: var(name: "datestart"; default: "2021-01-01")
dateend: var(name: "dateend"; default: "2021-01-31")
Обратите внимание — мы здесь берем datestart
и dateend
через var
, тк в первом поле эти переменные не будут определены и нам нужны будут default
значения.
В феврале пишем:
=: exec(code: "name_first_field"; var: "datestart" = "2021-02-01"; var: "dateend" = "2021-02-28")
Можно ли var передать один, а не несколько? Да, можно:
=: exec(code: "name_first_field"; var: "dates" = $row)
row: rowCreate(field: "datestart" = "2021-02-01"; field: "dateend" = "2021-02-28")
Но тогда нам нужно модифицировать код в первой колонке:
=: listSum(list: $list)
list: selectList(table: 'table'; field: 'sum'; where: 'date' >= $dates[datestart]; where: 'date' <= $dates[dateend])
~datestart: var(name: "dates"; default: $row)
row: rowCreate(field: "datestart" = "2021-01-01"; field: "dateend" = "2021-01-31")
Если мы запускаем exec из секции форматирования то как он будет выполнен?
exec
выполняет код того типа, из которого вызывается.
Будет ли выполнен exec, если какой-то из параметров не будет передан?
Нет, не будет. Для этого мы делали default
.
Еще вариант, если в каких-то случаях параметр нужен, а в каких-то нет, то передавать его пустым ""
, там где оне не нужен.
Как можно хранить выполняемые по exec коды?
Хорошей практикой является иметь скрытое поле в таблице, где в соответсвующей секции будет лежать исполняемый по exec
код.
Но вы можете создать специальную таблицу для хранения таких вынесенных кодов — однако лучше этого избегать.