Перейти к основному содержимому
Версия: 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);
}