Приведение типов
int(val) — приводит val к типу Integer
str(val) — приводит val к типу String
n(val) — возвращает 0, если val == null, иначе возвращает val (эквивалентно int(val))
Работа с коллекциями
Коллекцией является:
1) результат запроса данных класса через @ALL.[CLASSNAME]
2) данные связанного грида при обращении по коду набора данных (например, если в @this находится объект класса M$OBR, то результат запроса @this.DS или @this.KS_STAC будет являться коллекцией)
3) результат ручной инициализации коллекции
@Code == null является булевым выражением (так как @Code конкретное значение) и будет вычислено до выполнения запроса, а выражение code == null имеет тип sql запрос и будет преобразовано в code == 0
Функции для работы с коллекциями:
Ссылки: filter, in, all, size, init, map, find, findMax, findMin, sum, mkString, head, last, tail, distinct, trunc, ~|, split, ~~~, at, sortBy, (), seq, ++, intersect, diff
Функция и описание |
Примеры |
.filter([expr]) — выражение фильтрации коллекции, где [expr] — выражение для фильтрации. Для сравнения используется двойное равенство (одинарное означает присваивание) |
@this.DOGOVOR.filter(END_DATE > today())
@ALL.PACIENT.filter(gender == @this.gender)
|
[val] in [collection] — выражение проверки наличия val в коллекции collection. Работает только для Integer. Также может использоваться в .filter(). Для not in использовать конструкцию вида !([val] in [collection]) |
3 in (1, 2, 3, 4) => true
5 in (1, 2, 3, 4) => false
@this.PACIENTS.filter(ID in @this.dogovor.PRIKREPL_PACIENTS)
@this.PACIENTS.filter(!(ID in @ALL.M$PACIENT.filter(AGE > 35)))
|
@ALL.[classcode] — выражение для получения всех объектов класса classcode. |
@ALL.M$PACIENT
@ALL.M$POLIS_OMS
|
.size() — возвращает количество элементов в коллекции. |
@this.ADRES.filter(A$STATUSID==25215465427).size()
|
.init() — заставляет явно инициализировать коллекцию. По умолчанию она инициализируется только по явному требованию доступа к элементам коллекции. Это дает возможность фильтровать объекты через точку (join). Если массив инициализирован, выражение будет вычисляться на сервере приложений и последовательно пройдется по всем объектам, предоставляя дополнительный доступ к полям и ссылкам объектов, хотя это и будет медленно. Когда же массив не инициализирован, выражение не вычисляется на сервере приложений а конвертируется в sql, но join в данный момент не поддерживается. |
@ALL.m$pacient.init().filter(statusId.code == 123)
|
.map([expr]) — делает новую коллекцию на основе вычисленного выражения expr. |
@this.uslugi.map(price * number)
@ALL.M$POLIS_STATUS.map(ID -> NAME)
|
.find([expr]) — возвращает первый найденный объект из коллекции согласно выражению expr. Если такого объекта не существует — возвращает null. |
@this.DOGOVOR.find(A$STATUSID==2941524)
@ALL.M$PACIENT.find(LAST_NAME == "Иванов" &&
FIRST_NAME == "Иван")
|
.findMax([columnName]) — возвращает объект с максимальным значением в колонке columnName. ColumnName вводится без кавычек. |
@this.RESULTS.findMax(EFF)
@ALL.STUDENTS.findMax(AVERAGE_MARK)
|
.findMin([columnName]) — аналогично findMax, но с минимальным значением в колонке. |
|
.sum( | [expr]) — сумма коллекции. Если на входе подается Vector (коллекция с одной колонкой), то expr можно не указывать. Если подается коллекция объектов, то считается выражение expr, затем сумма вычисленных значений. |
@this.Uslugi.map(price * number).sum()
@this.Uslugi.sum(price * number)
|
.mkString([separator]) — объединяет объекты в строку, используя разделитель separator. На вход подается Vector(String). |
@this.USLUGI.a$name.mkString("; ")
@ALL.M$SRC_STAC.map(CODE + ": " + NAME).mkString(", ")
|
.head([separator]) — возвращает первый элемент из коллекции. Если коллекция пуста — возвращает null. |
@this.PACIENTS.head()
|
.last() — то же, что и .head(), но последний элемент. |
|
.tail()— возвращает массив без первого элемента. На пустом массиве возвращает ошибку. |
@ALL.M$PACIENT.tail()
|
.distinct() — отбирает уникальные значения в коллекции. |
@ALL.USLUGI.ISTOCHNIK_FINID.distinct()
|
.trunc(val) — укорачивает коллекцию до количества элементов val. |
@ALL.M$PACIENT.trunc(1000)
|
[regexp] ~| [str] — разбиение строки str на коллекцию по разделителю regexp, которое является регулярным выражением и записывается в одиночных кавычках. Регулярное выражение может быть как справа так и слева. Возвращается коллекция. |
', *' ~| "ааа,бб, ссс"
|
[regexp] split [str] — то же, что и ~|. |
|
[regexp] ~~~ [str] — получает из строки str вхождения удовлетворяющие regexp. Возвращает коллекцию. regexp и str можно менять местами. |
'(\d+)' ~~~ "12j123k12"
|
.at([val]) — возвращает элемент массива по индексу val. Если val больше, чем n-1, где n — количество элементов, то возвращается null. |
@this.RESULTS.at(0)
|
.sortBy([columnName]) — сортировка коллекции по указанной колонке. |
@this.SHABLON_STR_SDELKA_ID.USLUGI
.filter(a$statusid == 1876900708430).sortBy(SORT_ORDER)
|
() — инициализация массива. |
() - Пустой массив
(123,123) - массив из двух элементов
|
seq([exp]) — cоздает массив если значением выражения является не массив, иначе же просто возвращает значение выражения. Используется при париснге xml где узел может быть как элемент так и коллекция для приведения к одному виду. |
seq(@xml.adresses.adres)
|
++ — добавляет к массиву один или несколько элементов. Может использоваться для упрощения синтаксиса и проверки что взять первое значение из массива а если он не пустой взять какое-то другое значение. |
@this.uslugi.CENA ++ @this.BAZ_CENA.head()
|
intersect — формирует массив, в который входят элементы, присутствующие в обоих исходных массивах. При работе с массивом объектов сверяет их id. |
(1,2,3) intersect (2,4,5,6,7,8)
splitPeriod(@this.DATA_OTKR, today(), "day", 1)
intersect @this.KS_STAC
.filter(A$CLASSID == 1382979469314).DATA
|
diff — формирует массив, в который входят элементы, отсутствующие в массиве №2, но присутствующие в массиве №1. При работе с массивом объектов сверяет их id. |
splitPeriod(@this.DATA_OTKR, today(), "day", 1) diff
@this.KS_STAC.filter(A$CLASSID == 1382979469314).DATA
|
Работа со строками
[regexp] ~~ [str] — проверка что строка соответствует регулярному выражению. Результат Bool. Пример:
'[a-zA-Z]+' ~~ "ashgdfkj"
searchEleks(str) — поиск объектов в Элекс. Возвращает список ID найденных объектов. Разбивает входящую строкуна слова, выкидввает строки длинной меньше трех, ищет слова по фильтру like ‘text%’ По найденным словам ищет объекты. Кол-во слов обрезается до 1000. Кол-во обьектов итоговое тоже до 1000.