Простые события
Простое событие - событие, которое происходит при изменении значения заданного свойства (будем называть его условием события) на не 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;