⟵ сюдатуда ⟶
  • Quick start
  • Установка MIT
  • Установка PRO
  • Обновления
  • Оптимизация
  • Обновление v4-v5
  • Бэкапы
  • Консольная утилита bin/totum
  • Основы для пользователей
  • Интерфейс и компоновка
  • Таблицы и их параметры
  • Префильтр
  • Поля и их параметры
  • Синтаксис
  • Код, действия, форматирование
  • Код
  • Последовательность расчета
  • Пересчет строк
  • Выполнение действия из Кода
  • linkToDataTable в кодах
  • Использование old-значений
  • Код действия
  • Триггеры
  • Последовательность исполнения
  • Специальный синтаксис
  • Несколько действий функцией while
  • Перебор списка функцией listReplace
  • Особенности
  • linkTo-функции вызова окон
  • Отправка почты и вызов сторонних скриптов из кода-действия
  • Форматирование
  • Специальный синтаксис
  • Panel-функции
  • Форматирование строк
  • Форматирование таблицы
  • Слабая и сильная блокировка
  • Реляционные взаимосвязи
  • Порядок расчета и единицы пересчета
  • Автозаполнение расчетных и временных
  • Дублирование строк и циклов
  • Сравнения
  • Функции
  • Отладка
  • Печать и CSV
  • API
  • Роли и пользователи
  • Нотификации
  • Действия по расписанию
  • Системные таблицы
  • [PRO] Деревья
  • [PRO] Анонимные таблицы
  • [PRO] Внешние формы
  • [PRO] Экспорт и импорт таблиц
  • [PRO] MeiliSearch
  • [PRO] Базы данных
  • [PRO] Настройка CSS
  • [PRO] Custom docs
  • [PRO] LDAP AD
  • [PRO] Версии файлов
  • [PRO] List-unsubscribe
  • [PRO] Динамические поля
  • [PRO] Only Office
  • [PRO] Auth Tokens
  • [PRO] 2FA
  • [PRO] Superlang
  • [PRO] Daemons
  • [PRO] Profiler
  • [PRO] Подключение функций
  • [SRV] Установка и подключение
  • [SRV] Экспорт, pdf, загрузка и предпросмотр
  • [SRV] XLSX/DOCX генераторы
  • Особенности кодов

    Код

    Последовательность расчета

    Код — это формула, по которой вычисляется значение поля. При каждом расчете единицы пересчета он выполняется заново для каждого поля.

    Подробнее про Синтаксис ⟶

    Коды в таблице выполняются в определенном порядке:

    Код

    Если Поле 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 — для расчета через скрытую временную таблицу. Смотрите следующий заголовок ...

    linkToDataTable в кодах

    • 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-значений

    В кодах таже возможно использовать 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

    Также несколько действий можно выполнить функцией while:


    dl3=:
    while(action: $recalc; action: $cycle) recalc: reCalculate(table: 'table_name') cycle: reCalculateCycle(table: 'cycles_table'; cycle: #old.cycle)

    Перебор списка функцией listReplace

    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-функции вызова окон

    Функции вызывающие окна выделены в отдельную группу начинающуюся на 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: "")
    

    Panel-функции

    Доппанель

    Помимо 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, ... установленные в Форматировании являются слабыми, так как осуществляются на стороне браузера!

    Сильными блокировками на стороне сервера являются:

    ch5=: if(condition: #status != json`[1,2]`; then: $err)
    
    err: errorExeption(text: "Нельзя изменить поле, если заказ в статусе Оплачен")