条件による値の割当てによる検証しきい値エラーの回避
現在のオブジェクトのフィールドの値を変更する検証ルールのスクリプトを記述する場合は、これをオブジェクトのいわゆる「検証サイクル」に与える影響に注意する必要があります。
オブジェクトをデータベースに保存する前に、アプリケーション開発フレームワークは、そのデータがすべての検証ルールに合格することを確認します。 すべての定義済検証ルールを正常に実行すると、オブジェクトは有効としてマークされ、現在のトランザクションで変更された他のすべての有効なオブジェクトとともにオブジェクトを保存できます。 検証ルールの実行の一環として、スクリプトによってフィールドの値が変更された場合、オブジェクトは再度「ダーティ」とマークされます。 これにより、ADFは、定義されたすべての検証ルールにオブジェクトを再度適用し、新しい変更によって無効なオブジェクトが生成されないようにします。 オブジェクトを再検証する処理によってスクリプトが実行され、フィールド値が再度変更される場合、この処理によって無限ループとして表示されるサイクルが発生する可能性があります。 ADFは、特定のオブジェクトに対して10個の検証サイクルを制限することで、この可能性を回避します。 すべてのルールの実行を10回試行した後、オブジェクトが検証ロジックによって継続的に変更されているためにオブジェクトを正常に検証できなかった場合は、ADFは検証しきい値を超えたことを示す例外をスローします:
Validationしきい値制限に達しました。 無効なエンティティがまだcacheにあります
これが起こらない簡単な方法は、スクリプトで割り当てようとしているフィールドの値をテストし、割り当てようとしている値が現在の値から「異なる」である場合にのみ、フィールド割当て(または値を変更するためのsetAttribute()
コール)を実行するようにすることです。 このアプローチを使用するスクリプトの例は次のようになります:
// Object-level validation rule on a PurchaseOrder object
// to derive the default purchasing rep based on a custom
// algorithm defined in an object function named
// determinePurchasingRep() if both the Discount and NetDaysToPay
// fields have changed in the current transaction.
if (isAttributeChanged('Discount') &&
isAttributeChanged('NetDaysToPay')) {
def defaultRep = determinePurchasingRep()
// If new defaultRep is not the current rep, assign it
if (PurchasingRep != defaultRep) {
PurchasingRep = defaultRep
}
}
return true
次の例では、検証ルールを使用してフィールド導出を実行するときに発生する可能性のある一般的な問題を回避する方法を説明します。 このような目的で使用する推奨トリガーは、フィールド・レベルの「値変更後」トリガー、または「挿入前」トリガーまたは「更新前」トリガー(あるいはその両方)です。 このような場合でも、条件付きフィールド割当を実行することをお薦めします。 フィールド値の導出の詳細は、「その他のフィールドの値が変更された場合のフィールド値の導出」を参照してください。