Код — это формула, по которой вычисляется значение поля. При каждом расчете единицы пересчета он выполняется заново для каждого поля.
Коды в таблице выполняются в определенном порядке:
Если
Поле 2
обращается кПолю 3
из кода через#name_field_3
, то ответом будет пустота, тк в указанном примереПоле 3
рассчитывается послеПоля 2
.
Вы можете перенести отображение поля в другой плейсмент или другой sort.
Для Рассчетных таблиц внутри цикла и Временных это неактуально так-как они рассчитываются всегда при открытии и при любом изменении.
Простые таблицы и таблицы Циклов в свою очередь имеют строчную единицу пересчета, те Коды в полях выполняются когда происходит изменение в одном из полей строки.
Чтобы пересчитать строки из интерфейса можно использовать Пересчитать:
Если у Кода включен дополнительный параметр Выполнять только при добавлении, то простое Пересчитать не приведет к обновлению данных в этом поле. Это можно сделать написав код-действия с выполнением функции recalculate с указанными параметрами field
.
Чтобы это упростить в PRO версии вы можете использовать Пересчитать +
.
Выполнение функций действий из кодов недоступно за исключением:
reCalculate — будьте внимательны, очень легко зациклить таблицу.
Как чинить смертельный зацикл ⟶
Применяется для того, чтобы обновить данные в таблице источнике и гарантировано брать свежие данные:
example1: while(preaction: $rec; action: $select)
rec: reCalculate(table: 'table_name')
select: select(table: 'table_name'; field: 'field_name'; where: 'id' = #item)
getFromScript — использовать с осторожностью. Если удаленный сервер не ответит, то вычисление свалится с ошибкой времени исполнения.
linkToDataTable — для расчета через скрытую временную таблицу. Смотрите следующий заголовок ...
Для этого при вызове должен быть передан параметр hide: true
.
В этом случае будет возвращен хэш временной таблицы и из нее можно будет взять итоговые данные через select
.
sel: selectRowList(table: 'tmp_table'; hash: $hash; field: 'data'; field: 'summ'; order: 'id' asc)
~hash: linkToDataTable(table: 'tmp_table'; params: $row; hide: true)
row: "здесь параметры передаваемые в tmp_table"
Такой способ генерирует нагрузку на базу данных, так как временные таблицы записываются и удаляются через час.
Не рекомендуется использовать этот подход в строчных частях!
В кодах таже возможно использовать old.
значения. Например:
example2: if(condition: #param = true; then: #old.number; else: #number)
// Пример кода для чекбокса, переключающий его в новое значение при каждом пересчете.
example3: if(condition: $#onfv = false; then: true; else: false)
Коды действий выполняются после окончания расчета кодов.
Код действия поля запускается если срабатывает один из триггеров.
CodeActionOnAdd — запускать выполнение кода действия при добавлении строки/создании цикла.
CodeActionOnChange — запускать выполнение кода действия при изменении значения поля.
CodeActionOnDelete — запускать выполнение кода действия при удалении строки.
CodeActionOnClick — запускать выполнение кода при двойном клике на заблокированном поле.
Порядок выполнения кодов-действий полей в таблице аналогичен порядку выполнения кодов.
Код действия может быть выполнен из секции =:
— это простой вариант, если необходимо выполнить одно действие.
Стартовая секция обязательно должна инициировать функцию действия! Это функции разделов пересчет, вставка и изменение, вызов окон и скриптов или логика.
=: reCalculate(table: 'table_name')
Может быть выполнено несколько последовательных действий:
a1=: set(table: 'table_name'; field: 'field_name' = #field)
a2=: reCalculate(table: 'table_name')
a — относится к любому триггеру.
ch — только изменение.
ad — только добавление.
dl — только при удалении.
cl — при двойном клике на заблокированное поле.
Обязательно должен быть активен соответствующий триггер.
//выполнить при добавлении
ch1=: set(table: 'table_name'; field: 'field_name' = #field)
//первое действие при удалении
dl1=: reCalculate(table: 'table_name')
//второе действие при удалении
dl2=: reCalculateCycle(table: 'cycles_table'; cycle: #old.cycle)
Порядок исполнения по строчной сортировке цифры 12
<
2
.
a
исполняются при любом триггере первыми.
Также несколько действий можно выполнить функцией while:
dl3=: while(action: $recalc; action: $cycle)
recalc: reCalculate(table: 'table_name')
cycle: reCalculateCycle(table: 'cycles_table'; cycle: #old.cycle)
listReplace позволяет последовательно выполнять действия перебирая список.
replace_act: listReplace(list: $list_date_act; action: $recalc_repl; value: "val_act")
list_date_act: listCreate(item: "2020-09-10"; item: "2020-09-11"; item: "2020-09-12")
recalc_repl: recalculate(table: $#ntn; where: 'date' = $#val_act)
// Выполняемый в коде действия последовательно пересчитает строки текущей таблицы в которой date равно датам из list_date_act.
При добавлении old
значение равно пустоте.
При удалении текущее значение равно пустоте, если вам нужно удаляемое значение, то обратитесь к нему через #old.fieldname
.
Сохранение данных в таблицу происходит по окончанию всех действий, поэтому функции селект из текущей строки могут брать устаревшие данные — используйте #
.
Если в результате действия вы меняете значение, к которому обращается последующее действие, берите его через селект. Так как #
берутся в момент выполнения первого действия.
Функции вызывающие окна выделены в отдельную группу начинающуюся на linkTo...
:
linkToTable — открывает таблицу в blank
, self
окне или iframe
с показом или отключенными нестрочными плейсментами и с передачей параметров в префильтр:
linkToScript — вызов стороннего скрипта или web-страницы с показом ее на новой странице или в окне.
linkToDataTable — вызов временной таблицы с передачей в нее параметров. Может использоваться для сложных модальных окон:
linkToDataText — открывает окно с простым текстом.
linkToDataHtml — открывает окно с html. Если вы хотите показать html-форму — используйте linkToInput
.
linkToPanel — открывает строку таблицы как панель:
linkToPrint — вызывает окно печати:
linkToButtons — вызывает панель с кнопками.
linkToInput — вызывает окно ввода:
linkToAnonymTable — специальная функция, шифрующая параметры для анономных таблиц.
Если в результате работы кода-действия вам нужно отправить email — emailSend или notificationSend.
Если вызвать сторонний скрипт с передачей ему параметров — getFromScript.
Если вы хотите вызвать внутренний скрипт на сервере — execSSH.
Секции кода условного форматирования:
Поля — наивысший приоритет. Ожидает возврат результата работы функции setFormat.
Строки — средний приоритет. Ожидает возврат результата работы функции setRowFormat.
Таблицы — низжий приоритет. Ожидает возврат результата работы функции setTableFormat.
Возврат результата должен происходить из нумерованной секции f1=:
, f2=:
, ...
Порядок исполнения по строчной сортировке цифры 12
<
2
.
f1=: setFormat(condition: #type != 1; block: true; text: "—")
f2=: setFormat(condition: #type = 1; condition: $calc > $#nfv; background: "orange"; color: "white")
calc: #price * 0.1 + #price
f3=: setFormat(condition: #type = 1; condition: #price > $#nfv; background: "tomato"; color: "white")
// При выполнении условий f3 перепишет f2
Строка с большим приоритетом переписываеет указанные в ней параметры!
Возврат к значению по умолчанию осуществляется указанием пустого значения —>
color: "";
.
Если вы хотите скомбинировать несколько действий, например вывести значение поля без пробелов и заглавными буквами, то:
f4=: setFormat(text: $upper)
upper: strTransform(str: $repl; to: "upper")
repl: strReplace(str: $#nfv; from: " "; to: "")
Помимо f
может быть использован префикс p
, который будет выполнен в момент открытия панели по клику правой кнопки мыши на поле. Нумеруется аналогично f
.
p0=: panelHtml(html: $strpanel)
strpanel: strAdd(str: "Физически на Складе <b>"; str: $flat; str: "</b> из которых "; str: $block; str: " в резерве.")
flat: select(table: 'goods'; field: 'count'; where: 'id' = #name)
block: select(table: 'goods'; field: 'block'; where: 'id' = #name)
p1=: panelButtons(condition: $block != 0; button: $b1; refresh: true)
b1: rowCreate(field: "text" = "ПОСМОТРЕТЬ РЕЗЕРВЫ"; field: "code" = "show_block")
p2=: panelButtons(button: $b2; refresh: true)
b2: rowCreate(field: "text" = "ПОСМОТРЕТЬ ДВИЖЕНИЕ"; field: "code" = "show_move")
Обязательно должен возвращать результат работы функции с префиксом panel...
:
panelButtons — размещает на панели дополнительные кнопки (одну или несколько).
panelButton — размещает на панели дополнительную кнопку (одну).
panelImg — размещает на панели изображение.
panelHtml — отображает на панели html.
Panel-функции получают окружение той таблицы и строки, из которой были вызваны —
#id
,$#nci
,$#ntn
,$#nti
. Дополнительные переменные можно передать через параметрvar:
.Panel-элементы будут доступны, даже если у роли доступ
только на чтение
— устанавливайте видимость черезcondition
и переменные$#nr
и$#nu
.
Строки форматируются функцией setRowFormat, которая может блокировать удаление строки, ее дублирование или перемещение.
Таблицы форматируются функцией setTableFormat.
Параметр buttons:
позволяет перенести указанные кнопки в строчную часть.
В слое Создателя кнопки указанные в
buttons:
будут отображаться по своему стандартному плейсменту.
Любые блокировки
block
,blockdelete
,blockadd
, ... установленные в Форматировании являются слабыми, так как осуществляются на стороне браузера!
Сильными блокировками на стороне сервера являются:
Коды действий в связке с функцией errorExeption.
Код действия таблицы в связке с функцией errorExeption. Например:
ch5=: if(condition: #status != json`[1,2]`; then: $err)
err: errorExeption(text: "Нельзя изменить поле, если заказ в статусе Оплачен")