How-to: Ограничения
Пример 1
Условие
Есть книга, для которой задана цена.
CLASS Book 'Книга';
name 'Наименование' = DATA ISTRING[50] (Book) IN id;
price 'Цена' = DATA NUMERIC[14,2] (Book);
Нужно сделать, чтобы было запрещено вводить цены больше 100.
Решение
// Вариант 1
CONSTRAINT price(Book b) > 100
MESSAGE 'Цена книги не может быть больше 100 рублей';
// Вариант 2
CONSTRAINT SET(price(Book b) > 100)
MESSAGE 'Цена книги не может быть больше 100 рублей';
При попытке сохранения некоторой книги с ценой больше 100 в любой форме пользователю будет выдано сообщение с соответствующим текстом. Также в этом сообщении будут показаны все объекты класса Book
, для которых нарушено ограничение. Для каждого объекта будут выведены значения свойств, которые находятся в группе id
.
Оба варианты идентичны с точки зрения выполнения. Если платформа не находит в ограничении никакого оператора изменений, то все выражение автоматически "оборачивается" в оператор SET
.
Пример 2
Условие
Задан заказ, для которог о заданы дата, номер и признак того, является ли он проведенным.
CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order) IN id;
number 'Номер' = DATA INTEGER (Order) IN id;
posted 'Проведен' = DATA BOOLEAN (Order) IN id;
Нужно запретить изменение даты заказа.
Решение
CONSTRAINT CHANGED(date(Order o)) AND posted(o)
MESSAGE 'Запрещено менять дату у проведенного заказа';
Пример 3
Условие
Аналогично Примеру 2.
Нужно запретить удаление проведенного заказа
Решение
CONSTRAINT DROPPED(Order o IS Order) AND PREV(date(o)) < currentDate()
MESSAGE 'Запрещено удалять старые заказы';
При удалении заказа все его свойства будут иметь значение NULL
. Поэтому для обращения к значениям его свойств нужно использовать оператор PREV
.