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

Brief: события

События данных (WHEN)

Событие выполняет заданное действие — свою обработку — при изменении данных. Блок описания события задает, глобальное событие или локальное — для всей базы или в пределах сессии изменений — ключевыми словами GLOBAL и LOCAL, ограничивает событие заданными формами через FORMS и упорядочивает его обработку относительно других через AFTER.

Событие на изменение данных создают три инструкции:

  • WHENпростое событие: обработка выполняется на каждый набор объектов, на котором условие не NULL;
  • <- WHENвычисляемое событие: вместо обработки задается изменение первичного свойства;
  • ON — событие общего вида: обработка выполняется один раз на все изменения.
WHEN eventClause eventExpr [ORDER [DESC] orderExpr1, ..., orderExprN] DO eventAction;
propertyId(param1, ..., paramN) <- valueExpr WHEN eventExpr;
ON eventClause eventAction;

Аналогия: триггер базы данных, но условием служит произвольное свойство над всей базой.

sum(OrderDetail d) <- quantity(d) * price(d) WHEN CHANGED(quantity(d)) OR CHANGED(price(d));

События формы (ON)

События формы возникают на открытой форме: в точке её жизни (INIT, APPLY, CANCEL, CLOSE, DROP), на действие пользователя либо по таймеру через SCHEDULE. Обработка подключается опцией ON — в блоках событий, свойств и действий и объектов инструкции FORM либо в опциях свойства.

Что событие обслуживаетСобытия
форму целикомINIT, QUERYCLOSE, QUERYOK, OK, APPLY, CANCEL, CLOSE, DROP, SCHEDULE
объект формыCHANGE
группу объектовFILTER, ORDER, SELECT, FILTERS, ORDERS
группу фильтровFILTERGROUPS
свойство или действиеCHANGE, CHANGEWYS, GROUPCHANGE, EDIT, CONTEXTMENU, KEYPRESS, FILTERS PROPERTY, SELECT PROPERTY
контейнерEXPAND, COLLAPSE, TAB

Постфиксы BEFORE и AFTER дают моменты до и после операции. Для событий изменения свойства есть стандартные обработки READONLY, READONLYIF и SELECTOR.

FORM sku 'Товар'
OBJECTS s = Sku
PROPERTIES(s) price ON CHANGE changePrice(s)
EVENTS ON INIT initSku()
;

Порядок выполнения

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

Порядок между обработками, реагирующими на одно и то же изменение, определяют зависимости по данным; явно он задается ключевым словом AFTER (синоним GOAFTER) в блоке описания события.