Skip to end of metadata
Go to start of metadata

Инструкция CONSTRAINT - создание ограничения.

Синтаксис

CONSTRAINT eventClause constraintExpr [CHECKED [BY propertyId1, ..., propertyIdN]] MESSAGE messageExpr;

Описание

Инструкция CONSTRAINT создает ограничение. При нарушении ограничения пользователю будет выдано указанное в инструкции сообщение.

Также с помощью опции CHECKED можно использовать созданное ограничение при вызове диалогов изменения свойств, изменение значений которых может нарушить ограничение. В этом случае в диалоге будет устанавливаться дополнительный фильтр, таким образом, чтобы при изменении значения свойства не нарушить созданное ограничение. Если необходимо ограничить набор свойств, для которых будет выполняться указанная выше фильтрация, то список свойств может быть указан после ключевого слова BY.

Создание ограничения во многом аналогично следующей инструкции:

constraintProperty = constraintExpr;
WHEN eventClause [=GROUP MAX constraintProperty()]() DO {
	PRINT outConstraintPropertyForm MESSAGE NOWAIT;
	CANCEL;
}

но при этом имеет ряд преимуществ.

Параметры

eventClause

Блок описания события. Описывает событие, при наступлении которого будет проверяться создаваемое ограничение.

constraintExpr

Выражение, значение которого является условием создаваемого ограничения. Если полученное свойство не содержит внутри оператора PREV, то платформа автоматически оборачивает его в оператор SET.

propertyId1, ..., propertyIdN

Список идентификаторов свойств. Для каждого перечисленного свойства в диалоге изменения свойства будет выполняться фильтрация вариантов, которые нарушают создаваемое ограничение.

messageExpr

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

Примеры

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 // остаток не меньше 0
CONSTRAINT balance(Sku s, Stock st) < 0 
    MESSAGE 'Остаток не может быть отрицательным для ' + (GROUP CONCAT 'Товар : ' + name(Sku ss) + ' Склад : ' + name(Stock sst), '\n' IF SET(balance(ss, sst) < 0));

barcode = DATA STRING[15] (Sku);
// "эмуляция" политики безопасности
CONSTRAINT DROPCHANGED(barcode(Sku s)) AND name(currentUser()) != 'admin' MESSAGE 'Изменять штрих-код для уже созданного товара разрешено только администратору';

sku = DATA Sku (OrderDetail);
in = DATA BOOLEAN (Sku, Customer);

CONSTRAINT sku(OrderDetail d) AND NOT in(sku(d), customer(order(d)))
    CHECKED BY sku[OrderDetail] // будет применяться фильтр по доступным sku при выборе товара для строки заказа
    MESSAGE 'В заказе выбран недоступный пользователю товар для выбранного покупателя';

  • No labels