Операторы изменений
Операторы изменений - набор операторов реализующих определение различных типов изменений значений свойств.
Синтаксис
typeChange(propExpr)
Описание
Операторы изменений создают свойства, которые определяют, произошли ли для некоторого свойства в текущей сессии те или иные виды изменений. Это контекстно-зависимые операторы-свойства, которые могут использоваться внутри выражений. Внутри обработчика события они переключаются в событийный режим и сообщают об изменениях с момента предыдущего срабатывания этого события.
Параметры
-
typeChangeТип оператора изменений. Задается одним из ключевых слов:
SET— значение стало неNULL(раньше былоNULL)DROPPED— значение сталоNULL(раньше было неNULL)CHANGED— значение изменилось в любую сторонуSETCHANGED— значение изменилось и сейчас неNULLDROPCHANGED— значение или сброшено, или изменилось между двумя значениями неNULLSETDROPPED— значение или установлено, или сброшено (пересечена границаNULL/ неNULL)
-
propExprВыражение, для которого проверяется наличие изменения.
Примеры
CLASS Order;
CLASS Item;
quantity = DATA NUMERIC[14,2] (Item);
price = DATA NUMERIC[14,2] (Item);
sum = DATA NUMERIC[14,2] (Item);
posted = DATA BOOLEAN (Order);
status = DATA STRING[20] (Order);
// CHANGED — производное свойство пересчитывается при изменении любого из операндов
sum(Item i) <- quantity(i) * price(i) WHEN CHANGED(quantity(i)) OR CHANGED(price(i));
// SET — срабатывает только на NULL → значение (первичное присвоение)
WHEN SET(posted(Order o)) DO
MESSAGE 'Заказ проведён';
// SETCHANGED — значение изменилось и сейчас не NULL
WHEN SETCHANGED(status(Order o)) DO
MESSAGE 'Статус теперь: ' + status(o);
// DROPPED — срабатывает только на значение → NULL; PREV читает значение до сброса
WHEN DROPPED(status(Order o)) DO
MESSAGE 'Статус был: ' + PREV(status(o));
// DROPCHANGED — значение либо сброшено, либо заменено на другое не `NULL`
CONSTRAINT DROPCHANGED(status(Order o))
MESSAGE 'Статус нельзя сбросить или изменить после присвоения';
// SETDROPPED — значение пересекло границу `NULL` / не `NULL` в любую сторону
WHEN SETDROPPED(status(Order o)) DO
MESSAGE 'Статус назначен или сброшен';