⟵ сюдатуда ⟶
  • Общие положения
  • Места применения кода
  • Возврат результата работы кода
  • Обращения
  • Варианты обращения к значениям
  • Обращение к значениям строк внутри кода
  • Обращение к значениям полей
  • Сокращенное обращение
  • Обращение к элементу списка
  • Функции
  • Вызов функций
  • Переменные
  • Переменные внутри кода
  • Передача переменных в строку кода
  • Порядок вычисления
  • Порядок вычисления строк кода
  • Порядок математический операций в строке
  • MATH — выполнение математических операций в классическом порядке
  • Типы
  • Типы данных
  • Типы хранения данных
  • Операторы
  • Операторы сравнения
  • Математические операторы
  • Документация

    Синтаксис

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

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

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

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

    Написанный код при сохранении поля сжимается в исполняемый вид для ускорения его вызова в момент выполнения. При выполнении он разбирается интерпретатором. Если несколько полей исполняют один и тот же код, то его повторная интерпретация не требуется.

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

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

    Пример:

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

    Обращения

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

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

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

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

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

    • $$ — вызывает строку кода, которую определил другой код.

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

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

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

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

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

    Пример:

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

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

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

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

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

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

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

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

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

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

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

    Возможно обращение к полю, определенному строкой кода при помощи #$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.

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

    Обращение к секции:

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

    Пример:

    // Через функцию:
    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"
    

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

    Пример:

    example5: $listList[[1]]
        listList: json`[[1,2,3],[4,5,6]]`
    
    // Результат: [2,5]
    

    Функции

    Вызов функций

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

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

    Пример:

    tablename

    id fieldname1 fieldname2
    1 10 10

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

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

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

    При наборе кода функций работает автозаполнение:

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

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

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

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

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

    Набор функций

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

    • OPTION + 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 математические операции выполняются в последовательности записи слева направо. Скобки не учитываются тк являются принадлежностью функций.

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

    Если вам необходимо реализовать сложную формулу — используйте MATH.

    Пример:

    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

    Типы

    Типы данных

    • 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": "Расчетная в цикле"}]
        

    Операторы

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

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

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

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

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

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

    • / — деление.

    • ^ — степень. Сейчас работает в math`$x^$y` и не работает в основном коде.

    ⟵ сюда туда ⟶