⟵ сюдатуда ⟶
  • Установка
  • Ubuntu 18
  • Обновления
  • Бэкапы
  • Multi/no-multi
  • Консольная утилита bin/totum
  • Основы для пользователей
  • Интерфейс и компоновка
  • Таблицы и их параметры
  • Префильтр
  • Поля и их параметры
  • Синтаксис
  • Общие положения
  • Места применения кода
  • Возврат результата работы кода
  • Обращения
  • Варианты обращения к значениям
  • Обращение к значениям строк внутри кода
  • Обращение к значениям полей
  • Обращение к предыдущему значению
  • Обращение к отображению для Селектов
  • Получение значений зафиксированных полей
  • Определить кодом name поля
  • Сокращенное обращение
  • Обращение к элементу списка
  • Обращение к секции (колонке) списка
  • Функции
  • Вызов функции в коде
  • Автозаполнение функций
  • Хоткеи
  • Переменные
  • Переменные внутри кода
  • Передача переменных в строку кода
  • Порядок вычисления
  • Порядок вычисления строк кода
  • Порядок математический операций в строке
  • MATH — математический порядок
  • Типы
  • Типы данных
  • Типы хранения данных
  • Операторы
  • Операторы сравнения
  • Логическая конструкция cond
  • Математические операторы
  • Конкатенация строк
  • Код, действия, форматирование
  • Реляционные взаимосвязи
  • Порядок расчета и единицы пересчета
  • Сравнения
  • Функции
  • Отладка
  • Автозаполнение расчетных и временных
  • Дублирование строк и циклов
  • Деревья
  • Печать и CSV
  • API
  • Роли и пользователи
  • Нотификации
  • Действия по расписанию
  • Анонимные таблицы
  • Внешние формы
  • Экспорт и импорт таблиц
  • Системные таблицы
  • Подключение функций
  • Дополнительные интерфейсы
  • Структура файлов
  • Структура базы
  • Синтаксис

    Общие положения

    Места применения кода

    Код применяется для вычисления значений полей, для выполнения действий и для определения форматирования полей, строк и таблицы.

    Также коды используются при дублировании строк и вызове панелей в селектах.

    Код может храниться как текст в поле и быть вызван при исполнении другого кода с передачей ему необходимых параметров функцией exec.

    Возврат результата работы кода

    Код обрабатывается построчно, значение возвращается из строки начинающейся с = : независимо от ее расположения.

    = : 10 + 10
    
    // Результат: 20
    

    Обращения

    Варианты обращения к значениям

    • $ — строка кода.

    • # — значение ячейки.

    • $# — переменная внутри кода.

    • #$ — значение ячейки, определенной кодом.

    • $$ — вызывает строку кода, которую определил другой код. Изящный способ ветвления!

    • @ — обращение к нестрочным полям в других таблицах.

    Обращение к значениям строк внутри кода

    Обращение к значению строки кода осуществляется через $codename.

    Именование строки осуществляется как codename:. Имена строк регистрозависимы и могут состоять из латинских букв, цифр и нижнего подчеркивания.

    Для визуального обозначения порядка вызова строк кода или иерархичности можно использовать табуляции. Так же поддерживаются однострочные комментарии начинающиеся с //.

    = : $code1 + $code2
        // Комментарий
        code1: 10
        code2: 10
    
    // Результат: 20
    

    Обращение к значениям полей

    Обращение к значению поля текущей таблицы осуществляется через #fieldname. Значение полей берется в момент начала выполнения кода.

    Обращение к полям в другой таблице осуществляется через функции вида select.

    Если выполнение кода идет в поле строчной части таблицы, и значение берется из поля строчной части, то значение берется из текущей строки.

    Обращение к предыдущему значению

    При выполнении изменений в поле возможно обращение к предыдущему значению через #old.fieldname. Это работает в кодах и кодах действия.

    • В момент создания строки или таблицы #old.fieldname равен пустоте.

    Предыдущее значение — это то значение, с которым поле вошло в текущий цикл пересчета в соответствии с единицей пересчета.

    Обращение к отображению для Селектов

    Обращение к отображаемому значению, а не к основанию поля для селекта и селект-дерева осуществляется через #s.fieldname.

    Получение значений зафиксированных полей

    Возможно получить признак фиксирования значения для полей с кодамиtrue или false используя #h.fieldname.

    Для зафиксированных полей можно получить расчетное значение через #c.fieldname.

    Определить кодом name поля

    Возможно обращение к полю, определенному строкой кода при помощи #$whatfield. Таким образом значение в строке whatfield: будет определять name поля из которого брать данные.

    id fieldname1 fieldname2
    1 10 (C=5) [HAND] 15
    example1: #fieldname1 + #fieldname2
    
    // Результат: 25
    
    example2: #h.fieldname1
    
    // Результат: true
    
    example3: #c.fieldname1
    
    // Результат: 5
    
    example4: #$whatfield
    
        whatfield: "fieldname2"
    
    // Результат: 10
    

    Сокращенное обращение

    Для обращения к нестрочным полям в другой таблице используется сокращенное обращение @tablename.header_or_footer_fieldname.

    @ — это короткое написание селекта. @ не будет взята при начале выполнения кода как #field_name, а будет взята в порядке своей очереди.

    Обращение к элементу списка

    Обращение $list[1], #listfieldname[1], $list[$#iterator] или $list[$codename] вернет значение элемента списка аналогично функции listitem.

    Номер или ключ элемента списка внутри квадратных скобок могут быть обозначены всеми возможными способами.

    Если элемента с запрошенным ключом не окажется - выражение вернет null.

    Если структура к которой вы обращаетесь содержит технические символы или символы вне латинского алфавита, то путь внутри скобок должен быть заключен в кавычки!

    $list["Представление"], #listfieldname["Ссылка"], $list["date.settings"] или $list["so$iska"]

    // Через функцию:
    example1: listitem(list: $list1; item: 1)
    
    list1: listcreate(item: "A"; item: "B"; item: "C") 
    
    // Результат: "B"
    
    // Через быстрый вызов:
    example2: $list2[1]
    
    list2: listcreate(item: "A"; item: "B"; item: "C") 
    
    //Результат: "B"
    

    Подобным образом можно обратиться к вложенным элементам на произвольной глубине:

    id fieldname3
    1 ["b", "c"]
    example3: strAdd(str: $code3_1[0]; str: #fieldname3[1]; str: $code3_2[test])
    
     code3_1: listCreate(item: "a"; item: "b")
     code3_2: rowCreate(field: "test" = "z")
    
    // Результат: "acz"
    
    example4: $code4[0][test]
    
     code4: listCreate(item: $row4)
        row4: rowCreate(field: "test" = "abc")
    
    //Результат: "abc"
    

    Обращение к секции (колонке) списка

    Похожим образом работает обращение к секции. Если вам необходимо получить список по ключу из списка ассоциированных массивов, то помимо функции listSection можно использовать синтаксическую запись $row[[key]], #rowfieldname[[key]], $row[[$#key]] или $row[[$key]].

    example5: $listList[[1]]
        listList: listCreate(item: $l1; item: $l2)
            l1: listCreate(item: 1; item: 2; item: 3)
            l2: listCreate(item: 4; item: 5; item: 6)
    
    // Результат: [2,5]
    

    Функции

    Вызов функции в коде

    Скобки являются признаком функции.

    Параметры функций могут определяться в любом порядке. В ряде случаев порядок параметров внутри функции определяет возвращаемый ей результат.

    Хорошей практикой является размещение параметров функции в том порядке, в котором они указаны в автозаполнении функции, а также соблюдение пробельных интервалов.

    ВСЕ ПАРАМЕТРЫ ФУНКЦИИ ДОЛЖНЫ БЫТЬ ЗАПОЛНЕНЫ. ЕСЛИ ПАРАМЕТР НЕ ИСПОЛЬЗОВАН — ОН ДОЛЖЕН БЫТЬ УДАЛЕН!

    tablename

    id fieldname1 fieldname2
    1 10 10

    example1: select(table: 'tablename'; field: 'fieldname1'; where: 'id' = 1)
    
    // Результат: 10
    
    • Желтым — обозначены name-параметры в которые передаются name полей или таблиц (в зависимости от параметра). Name может быть передан любым способом. Если он указывается вручную, то при наборе в одинарных кавычках '' будет срабатывать механизм поиска name в текущей схеме базы данных.

    • Жирным — обозначены обязательные параметры функции.

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

    ФУНКЦИЯ НЕ МОЖЕТ БЫТЬ ВЫЗВАНА ВНУТРИ ДРУГОЙ ФУНКЦИИ — ЭТО ДЕЛАЕТСЯ ЧЕРЕЗ ОТДЕЛЬНУЮ СТРОКУ!

    example2: select(table: 'tablename'; field: 'fieldname1'; where: 'price' = $what_id)
    
        what_id: round(num: #price; type: "up"; step: 1; dectimal: 0)
    
    // Результат: 10
    

    Автозаполнение функций

    • При наборе функции осуществляется ее поиск в базе функций.

    • При постановке скобки ( или ) после названия функции она автоматически заполняется.

    • При постановке ; и начале ввода следующего параметра осуществляется поиск доступных параметров.

    • При наборе названий в одинарных кавычках '' осуществляется поиск поля в таблице источнике.

    • При постановке вместо открывающей скобки / или ; осуществляется поиск параметра. Последующий параметр также ищется через / или ;. В конце набора при постановке скобки ( или ) синтаксис автоматически заменяется на валидный.

    Хоткеи

    • TAB — переводит на следующий парамет функции.

    • SHIFT + TAB — если курсор стоит перед закрывающей ; то будет выделен следующий параметр до закрывающей ;.

    • SHIFT + TAB — если курсор стоит в любом другом месте параметра, то будет выделен текущий параметр включая ;.

    • Для mac аналогичным хоткеем является OPT+TAB.

    Переменные

    Переменные внутри кода

    Такие переменные существуют только при выполнении конкретного кода внутри одной итерации вычисления.

    Эти переменные могут определятся некоторыми функциями, например var или while.

    Для обращения к ним используется $#paramname.

    Существует список зарезервированных переменных, возвращающих определенные значения:

    • $#ntn — возвращает name текущей таблицы.

    • $#nci — возвращает номер текущего цикла.

    • $#nth — возвращает hash текущей таблицы. (только для временных таблиц).

    • $#lc — возвращает пустой список.

    • $#nd — возвращает текущую дату в Y-m-d.

    • $#ndt — возвращает текущую дату в Y-m-d H:i.

    • $#ndts — возвращает текущее время с секундами Y-m-d H:i:s.

    • $#nu - возвращает id текущего пользователя.

    • $#nr — возвращает список id ролей текущего пользователя.

    • $#nfv — возвращает значение текущего поля (неприменимо в секции код).

    • $#onfv — возвращает предыдущее значение текущего поля.

    • $#ids — возвращает id строк, выбранных галочками.

    • $#nh — возвращает текущий хост.

    • $#nf — возвращает name текущего поля.

    • $#nti — возвращает id текущей таблицы.

    • $#nl — возвращает специальный символ переноса строки.

    • $#duplicatedId — возвращает id строки, с которой было осуществлено дублирование (только для секции КОД при добавлении во вставляемой строке при дублировании). В противном случае возвращает 0.

    example1: while(action: $set; limit: 10)
        set: var(name: "count"; value: $plus; default: 0)
            plus: $#count + 1
    
    // Результат: 10
    
    example2: dateAdd(date: $#nd; days: 10; format: "Y-m-d")
    
    // Результат: "2019-08-10"
    

    Передача переменных в строку кода

    Используя конструкцию $codename{var: "varname" = value} можно передать значение value переменной varname в строку codename и дальше.

    varname тоже может быть задан кодом.

    example1: strAdd(str: $code1{var: "fruit" = "apple"}; str: " and "; str: $code1{var: "fruit" = "banana"})
        code1: strAdd(str: "green "; str: $#fruit)
    
    // Результат: "green apple and green banana"
    

    Таким образом можно обрабатывать элементы массива:

    example2: $split{var: "fruits" = $code2}
    
     split: if(condition: $#fruits != $#lc; then: $str1; else: "")
        str1: strAdd(str: $#fruits[0]; str: ", "; str: $split{var: "fruits" = $fruitsCut})
            fruitsCut: listCut(list: $#fruits; cut: "first"; num: 1)
    
    code2: listCreate(item: "apple"; item: "banana"; item: "lemon")
    
    // Результат: "apple, banana, lemon, "
    // Данный пример приведен здесь как пример, эта конкретная операция выполняется функцией listJoin().
    

    Порядок вычисления

    Порядок вычисления строк кода

    Вычисление осуществляется от секции = : в порядке каскадного обращения к значениям других строк слева направо.

    Если к одной строке идет несколько обращений она будет рассчитана столько раз, сколько к ней обратились.

    1.| = : $code1 + $code2 + $code2
    
    2.| code1: 10 / 2
    3.| code2: 10 * 2
    
    // Результат: 45
    // Количество раз вычислений:
    // Строка 1 — 1 раз
    // Строка 2 — 1 раз
    // Строка 3 — 2 раза
    

    При стандартном обращении с значению строки кода codename: оно рассчитывается при каждом обращении.

    Для того, что бы рассчитать значение один раз и сократить требуемые на расчет ресурсы процессора необходимо использовать ~codename:.

    tablename h_fieldname = 1

    example2: while(action: $set2; limit: 10)
    set2: var(name: "count"; value: $plus2; default: 0)
    plus2: $#count + $step2
    ~step2: select(table: 'tablename'; field: 'h_fieldname')
    
    // Результат 10
    // Строка step2: будет вычислена только один раз при первом обращении.
    // При отсутствии ~ перед step2: select() будет выполнен 10 раз.
    

    На обращениях к значениям полей #fieldname можно не экономить, они самые быстрые.

    Будте внимательны при использовании ~ в циклических вычислениях так-как можно по ошибке зафиксировать результат вычисления первого цикла.

    Порядок математический операций в строке

    В Totum математические операции выполняются в последовательности записи слева направо. Скобки не учитываются тк являются принадлежностью функций.

    ВНИМАНИЕ: по умолчанию порядок выполнения отличается от принятой математической записи! Скобки для математических операций не используются так-как являются признаком функций.

    example1: 10 + 10 / 2
    
    // Результат: 10
    
    // Код для реализации математической записи (32 + 10) / 2 = 21 будет выглядеть так:
    
    example2: $sum / 2
        sum: 32 + 10
    
    // Результат: 21
    

    MATH — математический порядок

    Для того, что бы произвести вычисление так, как это принято в математике используется следующая запись:


    example3:
    math`$A3 + $B3 / 2` A3: 10 B3: 10 // Результат: 15

    math можно использовать и внутри функций:


    example4:
    if(condition: math`$A4 + $B4 / 2` = 15; then: true; else: false) A4: 10 B4: 10 // Результат: true

    MATH обрабатывает скобки как часть математической формулы:

    example5: math`2 / ($A5 + $B5)`
    
    A5: 10
    B5: 10
    
    // Результат: 0.1
    

    Типы

    Типы данных

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

    • "str" — utf-8 строковое значение, желательно не рассчитывать на большие значения, так-как полностью передается в веб-интерфейс. При заполнении через интерфейс не содержит переводов строки.

    • true, false — булевы значения.

    • 'name' — name-параметр. Аналогичен строке, используется в коде с одинарными кавычками, на которые срабатывают подсказки автоматического заполнения.

    • "" — пустая строка или пустота.

    • null — пустое значение. Не может быть введено вручную, но может быть результатом работы некоторых функций и полей.

    • [] — пустой список. Является результатом работы функций, некоторых полей и быстрой переменной $#lc.

    Типы хранения данных

    • Одно значение — самый простой тип хранения.

      • Например:

        "mouse" или 5 или true или false
        
    • Список значений — упорядоченный список значений с числовыми ключами.

      • Таблица в одну колонку и несколько строк, у каждой строки номер.
      • Ключи идут от 0 с шагом в 1.
      • Например

        [1,2,3,4,5]
        
    • Ассоциированный массив — объект вида ключи-значения.

      • Одна строка из таблицы с несколькими колонками.
      • Например:

        {"data":"Строковые интервалы","type":"Тип","version":"Версия 1"}
        
    • Список ассоциированных списков — список объектов вида ключ-значение.

      • Таблица с несколькими строками и несколькими колонками.
      • Строки нумеруются от 0 с шагом в 1.
      • Колонки обозначаются буквенно-числовыми ключами.
      • Например:

        [{"data":null,"type":"Расчетная в дереве"},{"data": null,"type": "Расчетная в цикле"}]
        

    Операторы

    Операторы сравнения

    По результатам сравнений есть отдельный раздел документации!

    Логическая конструкция cond

    cond: cond`($A=1 && $B=1) || ($A=2 && $B=2)`
    A: "..."
    B: "..."
    

    Возвращает true или false.

    • && — и.

    • || — или.

    Скобки — группировка. Пример выше читается как: «Если A=1 и B=1 или A=2 и B=2 тогда true».

    Может быть использована внутри функций:

    cond_2: if(condition: cond`$line_1 != 0 || $line_2 != 0` = true; then: 100; else: 0)
    
    line_1: 10
    line_2: 0
    
    // Результат = 100.
    

    Математические операторы

    • + — сложение.

    • - — вычитание.

    • * — умножение.

    • / — деление.

    • ^ — степень.

    Конкатенация строк

    Конкатенация выполняется функцией strAdd или сахаром str:

    str: str`"#" + $#nfv ++ "—" ++ #field`
    
    // Результат: #34 — закрыт
    
    
    • + — склеивает без пробела.
    • ++ — склеивает добавляя пробел.