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

Операторы изменений (SET, CHANGED, ...)

Операторы изменений позволяют определить произошли ли для заданного выражения в текущей сессии те или иные виды изменений. Все эти операторы являются производными от оператора предыдущего значения (PREV), однако для улучшения читабельности и производительности рекомендуется использовать именно их.

В таблице ниже f обозначает проверяемое выражение (параметры опущены), а PREV(f) — его значение на начало сессии.

ОператорЗначениеОписание
SETf AND NOT PREV(f)Установлено значение
DROPPEDNOT f AND PREV(f)Сброшено значение
CHANGED(f OR PREV(f)) AND NOT f==PREV(f)Изменено значение
SETCHANGEDf AND NOT f==PREV(f)
или
CHANGED(f) AND NOT DROPPED(f)
Значение изменено на не NULL
DROPCHANGEDCHANGED(f) AND NOT SET(f)Значение или сброшено, или изменено с одного не NULL на другое не NULL
SETDROPPEDSET(f) OR DROPPED(f)Значение или сброшено или установлено с NULL на не NULL

Первые три оператора (SET, DROPPED, CHANGED) задают базовые предикаты изменения; оставшиеся три — удобные комбинации этих трёх для случаев, не укладывающихся в базовые предикаты.

warning

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

Язык

Для объявления свойства при помощи операторов изменений, используются следующие синтаксические конструкции.

Примеры

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);