Оператор NESTEDSESSION
Оператор NESTEDSESSION - создание действия, которое выполняет другое действие во вложенной сессии.
Синтаксис
NESTEDSESSION [SINGLE] action
Описание
Оператор NESTEDSESSION создает действие, которое выполняет другое действие во вложенной сессии. При этом все изменения, уже произошедшие в текущей сессии, попадают в создаваемую вложенную сессию. Также все изменения, которые будут произведены во вложенной сессии, попадут в текущую сессию при применении изменений во вложенной сессии.
Параметры
-
SINGLEОпциональное ключевое слово. Если
NESTEDSESSIONсам вызывается внутри транзакции применения, этот флаг распространяется на внутреннее действие: изменения хранимых свойств, используемых им, записываются в базу инкрементально по ходу транзакции, а не одним пакетом в конце применения. -
actionКонтекстно-зависимый оператор-действие, описывающий действие, которое должно быть выполнено во вложенной сессии.
Примеры
testNestedSession () {
NESTEDSESSION {
name(Sku s) <- 'aaa';
APPLY; // на самом деле изменения применятся не в базу данных, а в "верхнюю" сессию
}
MESSAGE (GROUP SUM 1 IF name(Sku s) == 'aaa'); // возвращает все строки
CANCEL;
// возвращает NULL, если в базе не было раньше Sku с именем aaa
MESSAGE (GROUP SUM 1 IF name(Sku s) == 'aaa');
}
FORM sku
OBJECTS s = Sku PANEL
PROPERTIES(s) id, name
;
newNestedSession() {
NESTEDSESSION {
NEW s = Sku {
// показывает форму, но любые изменения в ней не будут применены в базу данных,
// а будут сохранены в "верхней сессии"
SHOW sku OBJECTS s = s;
}
}
}
// SINGLE имеет смысл только когда NESTEDSESSION сам вызывается внутри транзакции применения
recalcNested () {
APPLY {
NESTEDSESSION SINGLE {
// изменения здесь записываются в базу инкрементально по ходу внешнего apply
name(Sku s) <- 'recalculated';
}
}
}