⟵ сюдатуда ⟶
  • Общие положения
  • Места применения кода
  • Возврат результата работы кода
  • Обращения
  • Варианты обращения к значениям
  • Обращение к значениям строк внутри кода
  • Обращение к значениям полей
  • Сокращенное обращение
  • Обращение к элементу списка
  • Функции
  • Вызов функций
  • Переменные
  • Переменные внутри кода
  • Передача переменных в строку кода
  • Порядок вычисления
  • Порядок вычисления строк кода
  • Порядок математический операций в строке
  • 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.

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

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

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

    Пример:

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

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

    Похожим образом работает обращение к секции. Если вам необходимо получить список по ключу из списка массивов, то помимо функции listSection можно использовать синтаксическую запись:

    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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • $#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: будет вычислена только один раз при первом обращении. 
    

    На обращениях к значениям полей #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":"Версия"}
        
    • Список ассоциированных списков — список объектов вида ключ-значение.

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

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

    Операторы

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

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

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

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

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

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

    • / — деление.

    ⟵ сюда туда ⟶