Перейти к основному содержимому
Версия: 5.x

Простые события

Простое событие - событие, которое происходит при изменении значения заданного свойства (будем называть его условием события) на не NULL. Это событие является своего рода расширением обычного события (добавляя дополнительное условие), а значит для него необходимо задать все те же параметры что и для обычного события, в частности:

  • тип события, которое определяет момент времени, когда это простое событие будет возникать (в том числе проверяться условие).
  • обработку события - действие, которое необходимо выполнять при наступлении этого простого события

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

  • Если условие не содержит внутри оператор предыдущего значения (PREV), то платформа сама оборачивает указанное условие в оператор изменений (SET). Тем самым значительно снижается вероятность создать некорректную обработку (которая будет иметь последействие при пустой сессии изменений)
  • Такие события понятнее и читабельнее, так как отражают классическую причинно-следственную связь (когда случилось что-то, сделать то-то)
  • Для таких событий существует возможность "перерасчета" - то есть запуска обработки в режиме, когда все предыдущие значения равны NULL (как если база данных пустая). Это полезно когда событие создается для уже существующей базы данных, и старые данные также должны соответствовать логике этого события.
  • Если действием в простом событии является одиночное изменение некоторого свойства, то такое событие легко преобразуется в вычисляемое и наоборот.

Язык

Для создания простых событий используется инструкция WHEN.

Примеры

CLASS Stock;
name = DATA STRING[50] (Stock);

balance = DATA INTEGER (Sku, Stock);

// отправить email, когда остаток в результате применения изменений сессии стал меньше 0
WHEN balance(Sku s, Stock st) < 0 DO
EMAIL SUBJECT 'Остаток стал отрицательным по товару ' + name(s) + ' на складе ' + name(st);

CLASS OrderDetail;
order = DATA Order (OrderDetail) NONULL DELETE;
discount = DATA NUMERIC[6,2] (OrderDetail);

WHEN LOCAL CHANGED(customer(Order o)) AND name(customer(o)) == 'Best customer' DO
discount(OrderDetail d) <- 50 WHERE order(d) == o;