Операторы изменений (SET, CHANGED, ...)
Операторы изменений позволяют определить произошли ли для заданного выражения в текущей сессии те или иные виды изменений. Все эти операторы являются производными от оператора предыдущего значения (PREV), однако для улучшения читабельности и производительности рекомендуется использовать именно их.
В таблице ниже f обозначает проверяемое выражение (параметры опущены), а PREV(f) — его значение на начало сессии.
| Оператор | Значение | Описание |
|---|---|---|
SET | f AND NOT PREV(f) | Установлено значение |
DROPPED | NOT f AND PREV(f) | Сброшено значение |
CHANGED | (f OR PREV(f)) AND NOT f==PREV(f) | Изменено значение |
SETCHANGED | f AND NOT f==PREV(f)или CHANGED(f) AND NOT DROPPED(f) | Значение изменено на не NULL |
DROPCHANGED | CHANGED(f) AND NOT SET(f) | Значение или сброшено, или изменено с одного не NULL на другое не NULL |
SETDROPPED | SET(f) OR DROPPED(f) | Значение или сброшено или установлено с NULL на не NULL |
Первые три оператора (SET, DROPPED, CHANGED) задают базовые предикаты изменения; оставшиеся три — удобные комбинации этих трёх для случаев, не укладывающихся в базовые предикаты.
В событийном режиме эти операторы возвращают изменения с момента предыдущего возникновения события (а точнее, окончания выполнения всех его обработок) вместо изменений с начала сессии.
Язык
Для объявления свойства при помощи операторов изменений, используются следующие синтаксические конструкции.
Примеры
CLASS Order;
status = DATA STRING (Order);
// Самый частый случай — реакция на изменение внутри обработчика события.
// Выбранный оператор изменений определяет, на какие переходы среагирует обработчик:
// SET — только NULL → значение, DROPPED — только значение → NULL,
// CHANGED — на оба этих перехода плюс значение → другое значение.
// Внутри обработчика PREV(f) возвращает значение f до изменения.
WHEN CHANGED(status(Order o)) DO
MESSAGE 'Статус изменён: ' + PREV(status(o)) + ' → ' + status(o);