Ограничение зависимых значений
Другой распространенный вид проверки правильности (верификации) заключается в сравнении значений двух атрибутов одной и той же строки. В следующем примере вводится принудительное исполнение правила, в котором говорится, что комиссионное вознаграждение служащего должно быть меньше, чем его зарплата.
Это правило применимо только в том случае, когда и комиссионное вознаграждение, и зарплата имеют непустое (non-null) значение, и оно должно заново вычисляться после каждого изменения комиссионного вознаграждения или зарплаты. Усовершенствованное правило верификации Compare в Oracle JDeveloper 11g делает реализацию этой проверки очень простой.На странице General редактора Entity Object Editor для Emp перейдите в раздел Validation Rules и снова щелкните кнопкой Add Validation Rule. В диалоговом окне Add Validation Rule выберите Compare Validator из списка Rule Types. В закладке Rule Definition выберите Comm из списка At- tribute и Less Than из списка Operator. Из списка Compare With выберите Entity Attribute и выберите атрибут Sal в размещенном ниже поле Select Entity Attribute. Эти шаги настраивают основное сравнение в правиле верификации. Затем в закладке Validation Execution введите формулу Sal! =null && Comm! =null в поле Conditional Execution Expression. Это поле становится причиной того, что правило применяется только в том случае, если истинно указанное в этом поле условие. Обратите внимание, что при вычислении истинности выражения учитывается регистр, так что убедитесь, что напечатано Comm, а не comm. Затем перейдите в раздел Triggering Attributes, выберите Sal из списка Available Attributes и кликните по кнопке Add (стрелка вправо), чтобы переместить Sal в список <,/span>Selected Attribute, а затем проделайте то же самое для атрибута Comm. Если во время выполнения значение любого из этих атрибутов изменится, значение правила будет вычислено заново.
Наконец, перейдите в закладку Failure Handling и введите в поле Message Text следующее сообщение об ошибке проверки достоверности:
The {attr1} of {val} must be less than the {attr2}.
Убедитесь, что три выражения с сообщениями заключены в фигурные скобки. В находящейся ниже таблице Error Message Expressions кликните по строке для лексемы attr1 и дважды кликните по ячейке Expression в этой строке. Введите выражение source.hints.Comm.label, чтобы сослаться на значение удобной для пользователя метки показа для атрибута Comm исходного объекта-сущности. Точно так же введите выражение source.hints.Sal.label для лексемы сообщения attr2 и введите выражение Comm для лексемы val, чтобы сослаться на значение атрибута Comm. Эти выражения c сообщениями, так же, как и те, которые использовались в приводившемся выше примере с вычисляемыми атрибутами, используют синтаксис языка Groovy. Хотя это очень простые выражения, важно понять, что в случае необходимости разработчики могут использовать всю мощь Groovy. Для завершения кликните по OK, чтобы определить новое правило.
Снова выполните HRModule, чтобы протестировать правило. Попробуйте ввести для комиссионного вознаграждения существующего служащего значение 13000. Когда вы зафиксируете транзакцию, должно появиться параметризованное сообщение об ошибке “Комиссионное вознаграждение 13 000 должно быть меньше зарплаты”. Если вы измените только значение зарплаты служащего (не изменяя комиссионного вознаграждения), можно проверить, что не будет никакого исключительного состояния, потому что значение Comm – пустое. Наконец, изменяя зарплату служащего до меньшего значения, чем имеющееся комиссионное вознаграждение этого человека, можно проверить, что инициирование атрибутов срабатывает должным образом.