Добавление объектов (NEW)
Оператор добавления объектов создает действие, которое добавляет объекты заданного пользовательского класса и при необходимости записывает каждый созданный объект в первичное свойство. Этот класс должен быть конкретным пользовательским классом — объект нельзя добавить в систему без известного конкретного класса.
У оператора две формы.
- В множественной форме объект создается для каждого набора аргументов, для которого некоторое выражение (условие) не равно
NULL. Созданный объект можно записать в указанное первичное свойство на каждой строке; если оно не указано, созданный объект никуда не записывается. - В блочной форме создается ровно один объект, а следующий за действием блок тела имеет доступ к новому объекту по локальному имени. Эта форма — естественный способ создать один объект и инициализировать его свойства в том же действии.
Создавать объекты можно также внутри действия цикла: тогда на каждой итерации создается один объект, видимый в теле цикла, — см. соответствующую опцию в статье про цикл.
Язык
Для объявления действия, создающего объекты, используется оператор NEW. Для создания, привязанного к циклу, используется опция NEW оператора FOR.
Примеры
// множественная форма: создать три объекта Sku и записать каждый в addedSkus(i)
newSku () {
LOCAL addedSkus = Sku (INTEGER);
NEW Sku WHERE iterate(i, 1, 3) TO addedSkus(i);
FOR Sku s = addedSkus(i) DO {
id(s) <- 425;
name(s) <- 'New Sku';
}
}
// блочная форма: создать один Sku и инициализировать его свойства
newSku () {
NEW s = Sku {
id(s) <- 425;
name(s) <- 'New Sku';
}
}
// блочная форма: создать копию Sku с теми же id и name
copy (Sku old) {
NEW new = Sku {
id(new) <- id(old);
name(new) <- name(old);
}
}
// создание в цикле: один OrderDetail на каждый Sku, для которого in(s) истинно
createDetails (Order o) {
FOR in(Sku s) NEW d = OrderDetail DO {
order(d) <- o;
sku(d) <- s;
}
}