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

Изменение свойства (CHANGE)

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

Источник и условие используют те же аргументы, что и записываемое свойство. Если источник возвращает NULL для набора аргументов, удовлетворяющего условию, в свойство записывается NULL, что стирает ранее сохранённое значение.

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

Изменяемые свойства​

Записываемое свойство должно быть изменяемым. Изменяемыми являются:

  • первичные свойства, в том числе локальные первичные свойства;
  • свойства, созданные оператором выбора, — запись распределяется по условиям в порядке их перечисления: каждому свойству-результату достается та часть записи, для которой выполняется его условие, а невзятый остаток передается следующим условиям. Для полиморфной формы, в которой условием является сам результат, условием при записи служит способность результата принять запись как изменяемое свойство, а не его текущее значение: неизменяемый результат (например, константа) не принимает ничего. Поэтому у свойства выбора с изменяемым результатом и константой в качестве значения по умолчанию запись попадает в изменяемый результат, даже когда текущее значение дает константа;
  • композиция изменяемого свойства, аргументами которой служат только его же параметры — переименование или перестановка параметров (h(a, b) = f(b, a)): запись попадает в главное свойство с переставленными аргументами. Композиция через другое свойство (nameCustomer(o) = name(customer(o))) для этого оператора не изменяема: запись в неё молча не выполняется — ничего не меняется, и ошибка не сообщается (плагин IDE помечает такое присваивание ошибкой). На форме такое свойство тем не менее редактируется — запись уходит в связь: см. интерактивное представление.
к сведению

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

Язык​

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

Примеры​

// установить всем клиентам у кого сумма заказа больше 100 скидку в размере 15 процентов
CLASS Customer;
discount = DATA NUMERIC[5,2] (Customer);
totalOrders = DATA NUMERIC[14,2] (Customer);
setDiscount {
discount(Customer c) <- 15 WHERE totalOrders(c) > 100;
}

discount = DATA NUMERIC[5,2] (Customer, Item);
in = DATA BOOLEAN (Item);
// изменить скидку для выбранных товаров для клиента
setDiscount (Customer c) {
discount(c, Item i) <- 15 WHERE in(i);
}

// скопировать свойство g в свойство f
f = DATA INTEGER (INTEGER);
g = DATA INTEGER (INTEGER);
copyFG {
f(a) <- g(a);
}