ルールセットは、1つ以上のルールおよびデシジョン表をグループ化するために使用するOracle Business Rulesオブジェクトです。
この章の内容は次のとおりです。
詳細は、第1.1.5項「ルールセットとは」を参照してください。
ビジネス・ルールを使用すると、次のようにビジネスに関する重要なデシジョンおよびポリシーを定義できます。
ビジネス・ポリシー: 消費ポリシーおよび承認マトリックスなど
制約: 有効な構成や規制上の要件など
計算: 割引、割増またはスコアなど
判断機能: 顧客の額に基づくオファーなど
Oracle Business Rulesでは、次の2つの方法でルールを使用できます。
IF/THENルールの使用
デシジョン表でのルールの使用
この章では、IF/THENルールの使用について説明します。デシジョン表の詳細は、第5章「デシジョン表の使用」を参照してください。
ルールセットは、ルールおよびデシジョン表の実行単位となります。また、ルールの共有単位でもあり、ルールはルールセットに属します。 複数のルールセットを順番に実行できます。 この処理は、ルール・フローと呼ばれます。 順序はルールセット・スタックによって決まります。 この順序は、スタック上でルールセットをプッシュおよびポップするルール・アクションによって操作できます。ルールセットでは、そこに含まれるルールの起動順序を指定するために、ルールの優先度が適用されます。また、ルールセットは、ルールセットが常にアクティブであること、またはルールセットが日時の範囲や開始日時または終了日時に基づいて制限されることを識別する、有効日指定も提供します。
ルールおよびデシジョン表はすべて、ルールセット内に作成されます。ルールセットにより、ルールとデシジョン表が1つの実行単位として編成されます。
ルールセットを作成する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブにナビゲートします。
「ルールセットの作成」アイコンをクリックします。「ルールセットの作成」ダイアログが表示されます。
「名前」フィールドに名前を入力します。
図4-1に示すように、「説明」フィールドに説明を入力します。
「OK」をクリックします。
有効日のサポートにより、ルールセット、ルールまたはデシジョン表の開始日と終了日を指定できます。 ルールセットの場合、有効日では、ルールセット内のルールおよびデシジョン表が有効な日付の範囲を定義します。 有効日の詳細は、第4.9項「日付ファクトの使用、日付関数および有効日の指定」を参照してください。
ルールセットの有効日を設定する手順は、次のとおりです。
ルールセット内のルール数が増加するにつれて、ルール・リストのナビゲートが困難になる可能性があります。Rules Designerに対して、ルール・リストをフィルタして必要なルールのみを表示するように指示できます。 たとえば、アクティブなルールのみ、または検証警告のあるルールのみを表示できます。
ルール作成の詳細は、第4.3項「ルールの使用」を参照してください。
フィルタを使用してルールセット内で一致するルールを表示する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
ルールのフィルタ設定を表示するには、図4-4に示すように、ルールセット名の横にある「フィルタ問合せの表示」をクリックします。
図4-5に示すように、「フィルタ問合せ」フィールドで「<テストの挿入>」をクリックしてデフォルトのテストを挿入します。
デフォルトのテストを構成します。
この場合、図4-6に示すように、「<オペランド>」をクリックすると、表4-1に示すルール固有のオプションから選択できます。
表4-1 ルールのフィルタ問合せのオペランド
オペランド | 説明 |
---|---|
|
ルール名と照合します。 |
|
ルールの説明と照合します。 |
|
ルールの優先度と照合します。詳細は、第4.5.5項「ルールの優先度の設定方法」を参照してください。 |
|
ルール開始日と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール終了日と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール開始日までの指定の時間(分)と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール終了日までの指定の時間(分)と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール開始日までの指定の日数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール終了日までの指定の日数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール開始日までの指定の年数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルール終了日までの指定の年数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。 |
|
ルールがアクティブかどうかと照合します。詳細は、第4.5.3項「アクティブ・オプションの選択方法」を参照してください。 |
|
ルールに検証警告があるかどうかと照合します。詳細は、第4.4.2項「ルール検証」を参照してください。 |
|
1つ以上のファクト・タイプと照合します。 |
詳細は、第4.3.2項「ルールでのテストの定義方法」を参照してください。
演算子を選択し、比較演算子を選択します。 たとえば、「name」の場合は、オペランド・リストから「startsWith」を選択できます。
フィルタ・テストの右の比較オペランドを入力します。 たとえば、文字列Customer
を入力します。
フィルタ問合せが完成した後、フィルタをルールセット内のルールに適用できます。
フィルタを適用するには、「フィルタ・オン」チェック・ボックスを選択します。
Rules Designerでは、図4-7に示すように、フィルタ問合せに一致するルールのみが表示されます。
フィルタ問合せを無効化するには、「フィルタ・オン」チェック・ボックスの選択を解除します。
ルールセット内のすべてのルールが表示されます。
フィルタ問合せを削除するには、対象のフィルタ問合せを選択し、[Del]を押すか「フィルタのクリア」アイコンをクリックします。
ファクトを処理し、Oracle Business Rulesで処理できる暫定的な結論を取得するためのビジネス・ルールを作成します。 ルールセット内にルールを作成するため、ルールを使用する前にルールセットを作成する必要があります(または、デフォルトのルールセットを使用します)。ルールセット作成の詳細は、第4.2項「ルールセットの使用」を参照してください。
デザイン中のルールは容易にテストでき、アプリケーションにデプロイする必要がありません。詳細は、第8.1.1項「Rules Designerでテスト関数を使用してルールをテストする方法」を参照してください。
ルールの使用時には、Rules Designerによるルール検証が役立ちます。検証ログ・ウィンドウを表示するには、「検証」アイコンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。これにより、不正または不完全なルールに関する警告が表示されます。ルールをテストまたはデプロイする前に、すべての警告を修正する必要があります。ルール検証の詳細は、第4.4.2項「ルール検証」を参照してください。
ルールセット内のルール数が増加するにつれて、ルール・リストをフィルタして必要なルールのみを表示するようにRules Designerを構成できます。詳細は、第4.2.3項「フィルタを使用してルールセット内で一致するルールを表示する方法」を参照してください。
ルールを作成するには、まずルールをルールセットに追加してから、テストとアクションを挿入します。アクションはパターン一致と関連しています。 実行時に、ルールの「IF」領域にあるテストが一致すると、Rules Engineにより「THEN」のアクションがアクティブ化され、ルールに関連付けられているアクションの実行が準備されます。
Rules Designerでは、デフォルトで一致したファクトごとにルールが起動するルールを作成できます。 同じファクト・タイプが2回以上一致するか、まったく一致しないという他のオプションを有効化するには、「拡張モード」を選択します。 拡張モードおよび詳細設定の表示の詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。
ルールセットにルールを追加する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
「表示」フィールドで「IF/THENルール」を選択します。
「追加」をクリックしてルールを追加します。たとえば、図4-8に示すように、「追加」をクリックしてRule_1
というルールを追加します。
ルール内でテストを作成するには、ファクトに対する条件を追加します。たとえば、年間消費額プロパティを持つCustomerOrder
サンプル・ファクトを使用し、顧客に関連付けられている年間消費額に基づいて、顧客の注文が高額消費に関連付けられているかどうかを判別するテストを追加できます。 バケット・セットを使用して、ルール内のテストおよびアクションの値を制限できます。 詳細は、第4.11項「ルールにおけるオプション値の制約としてのバケット・セットの使用」を参照してください。
図4-9に、このサンプル・ルールを示します。
実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。 このサンプル・ルールRule_1
の場合、ファクトが一致すると、Rules Engineによりファクトが変更されて、値プロパティが「High」に変更されます。
ルール内でテストを定義する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
「表示」フィールドで「IF/THENルール」(Rules Designerのデフォルト)を選択します。
使用するルールを追加または選択します。たとえば、Rule_1を選択します。
「Rule_1」の「IF」領域で、「<テストの挿入>」を選択します。
テストの場合、図4-10に示すように、ルールの「IF」領域には左<オペランド>
と右<オペランド>
が含まれています。
テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。 図4-11に示すように、テキスト入力領域とドロップダウン・リストが表示されます。
値を入力するには、ドロップダウン・リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。
リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。
対応するオペランドのタイプと一致する値を入力する必要があります。 たとえば、テストIF CustomerOrder.annualSpending
> <operand>の場合、<operand>に有効な値は、CustomerOrder
フィールドのannualSpending
のタイプと一致する必要があります。
テストでは、表示される演算子を必要な論理演算子で置き換えるか、またはデフォルト(==
)を受け入れます。そのためには、デフォルトの==演算子を選択します。 図4-12に示すように、テキスト入力領域とドロップダウン・リストが表示されます。
左オペランドと右オペランドの間の論理条件をテストするには、図4-12に示すように、論理演算子==
(等号)、!=
(等しくない)、>
(より大きい)、>=
(以上)、<
(より小さい)、<=
(以下)から1つ選択します。
テストでは、右オペランドを値で置き換えます。
<オペランド>プレースホルダを、オペランドに使用できるように構成します。
たとえば、図4-13に示すように、テキスト入力領域に2000
と入力し、[Enter]を押します。
ルール内で範囲テストを作成するには、ファクトに対する条件を追加します。たとえば、年間消費額プロパティを持つCustomerOrder
サンプル・ファクトを使用し、顧客の注文額が上位の範囲と下位の範囲のどちらに該当するかを判別するテストを追加できます。
次にこのサンプル・ルールの概要を示します。
IF CustomerOrder.annualSpending between 100 and 2000 THEN Modify CustomerOrder.value = "Normal"
実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。
ルール内で範囲テストを定義する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
「表示」フィールドで「IF/THENルール」(Rules Designerのデフォルト)を選択します。
使用するルールを追加または選択します。たとえば、Rule_1を選択します。
「Rule_1」の「IF」領域で、「<テストの挿入>」を選択します。
図4-14に示すように、ルールの「IF」領域のテストには左<オペランド>と右<オペランド>が含まれています。
範囲テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。 図4-15に示すように、テキスト入力領域とドロップダウン・リストが表示されます。
値を入力するには、ドロップダウン・リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。
リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。対応するオペランドのタイプと一致する値を入力する必要があります。
たとえば、テストIF CustomerOrder.annualSpending >
<operand>の場合、<operand>に有効な値は、CustomerOrder
フィールドのannualSpending
のタイプと一致する必要があります。
範囲テストでは、between
演算子を選択します。そのためには、デフォルトの==演算子を選択します。テキスト入力領域とドロップダウン・リストが表示されます。 図4-16に示すように、「between」を選択します。
これにより、図4-17に示すように、さらに2つの<オペランド>プレースホルダが追加されます。
図4-18に示すように、<オペランド>プレースホルダをオペランドに使用できるように構成します。
このテストがtrueになるのは、左端のオペランド(CustomerOrder.annualSpending
)が値100
および2000
の間にある場合です。
ルール内でセット・テストを作成するには、ファクトに対する条件を追加します。 たとえば、ライン品目プロパティを持つCustomerOrder
サンプル・ファクトを使用し、ライン品目が任意の製品セットに属しているかどうかを判別するテストを追加できます。
次にこのサンプル・ルールの概要を示します。
IF CustomerOrder.lineItem.sku in 12345, 43255, 76348 THEN Modify CustomerOrder.value = "High"
実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。
ルール内でセット・テストを定義する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
「表示」フィールドで「IF/THENルール」(Rules Designerのデフォルト)を選択します。
使用するルールを追加または選択します。たとえば、Rule_1を選択します。
「Rule_1」の「IF」領域で、「<テストの挿入>」を選択します。
図4-10に示すように、ルールの「IF」領域のテストには左<オペランド>と右<オペランド>が含まれています。
セット・テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。 図4-20に示すように、テキスト入力領域とドロップダウン・リストが表示されます。
値を入力するには、ドロップダウン・リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。
リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。
セット・テストでは、in
演算子を使用します。そのためには、デフォルトの==演算子を選択します。テキスト入力領域とドロップダウン・リストが表示されます。 図4-21に示すように、「in」を選択します。
これにより、図4-22に示すように、さらに2つの<オペランド>
プレースホルダがカンマ区切りリスト形式で追加され、<挿入>
プレースホルダも追加されます。
リストに別のオペランドを追加するには、「<挿入>」をクリックします。
リストからオペランドを削除するには、オペランドを右クリックして「テスト式の削除」を選択します。
図4-23に示すように、<オペランド>
プレースホルダをオペランドに使用できるように構成します。
このテストがtrueになるのは、左端のオペランド(CustomerOrder.lineItem.sku
)の値が12345、43255または76348の場合です。
ルールを作成するには、テストおよびアクションを挿入します。アクションはパターン一致と関連しています。ルールの「IF」領域にあるテストが一致すると、Rules Engineにより「THEN」のアクションがアクティブ化され、ルールに関連付けられているアクションの実行が準備されます。
アクションを追加する際には、表4-2に示すアクション・フォームのいずれかを使用します。 表4-2に示す各フォームについてRules Designerで表示されるオプションは状況依存のため、リストおよび使用する項目の数は、どのアクションを追加するかと、アクションの入力中の選択内容に応じて異なります。表4-2に、基本的なアクションを示します。拡張モードでは、その他のアクションも使用できます。 拡張モードの詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。
表4-2 ルール・アクションのオプション
アクション・フォーム | 説明 |
---|---|
|
新規ファクトのアサート |
|
一致したファクトに関連付けられているデータ値の変更 |
|
ファクトの取消し |
|
関数のコール |
ルール内でアクションを定義する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
ルールの「THEN」領域で、「<アクションの挿入>」を選択します。 図4-24に示すように、「アクションの追加」リストが表示されます。
「アクションの追加」リストで、追加するアクションのタイプを選択します。たとえば、「modify」を選択します。
「THEN」領域で、「<ターゲット>」を選択してオプション・リストを表示します。 図4-25に示すように、「customerOrder
」を選択します。
「<プロパティの追加>」を選択します。「プロパティ」ダイアログが表示されます。
図4-26に示すように、「プロパティ」ダイアログで、「値」列に"High"
と(二重引用符を含めて)入力し、[Enter]を押します。
「プロパティ」ダイアログで、「閉じる」をクリックします。 図4-27に示すように、ルールが表示されます。
条件の値がアクションによって変更された場合に、ルールのループが発生することがあります。 ループは、単一ルール内のルール間、複数のデシジョン表全体、または同一ルールセット内のルールおよびデシジョン表全体で発生する場合があります。 ルール条件内で使用されるファクト・プロパティを変更するルール・アクションは作成しないようにする必要があります。 このようなルールによって、実行時に無限ループが発生する場合があります。
ディクショナリを変更すると、Rules Designerではディクショナリ検証が実行されます。 ルールまたはデシジョン表の使用時には、Rules Designerによる検証が役立ちます。 検証ログ・ウィンドウを表示するには、「検証」アイコンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。これにより、不正または不完全なルールに関する警告が表示されます。ルールをテストまたはデプロイする前に、すべての警告を修正する必要があります。
ディクショナリが無効な場合、Rules Designerでは警告メッセージのリストが生成されて関連ディクショナリ・オブジェクトがリスト表示されます。 検証メッセージ情報は、ディクショナリ・オブジェクトの検索と問題の解決に使用できます。 また、検証警告のあるオブジェクトには、図4-28に示すように検証インディケータ(赤い波線による下線)のフラグが付きます。
ディクショナリが無効な場合は、そのディクショナリを保存できます。 ただし、RL Languageを生成できるのは、有効でRules Designerの検証ログに警告が表示されないディクショナリの場合のみです。
検証ログでは、各検証メッセージに次の情報が含まれています。
メッセージ: メッセージは、Oracle Business Rules例外に関する問題の詳細説明を提供します。
ディクショナリ・オブジェクト: このフィールドには、ディクショナリのコンポーネントの識別に必要な詳細を示すパスが表示されます。
プロパティ: 警告メッセージに関連するオブジェクトの、プロパティに関する情報を提供します。
検証ログの表示中に、項目を選択し、右クリックしてドロップダウン・リストから「エディタでオブジェクトを選択して強調表示」を選択すると、カーソルが移動し、ディクショナリ・オブジェクトが選択されます。一部の検証警告の場合、この機能を使用できないことに注意してください。
ディクショナリを変更すると、Rules Designerではディクショナリ検証が実行されます。 Rules Designerにより警告メッセージが表示された場合、検証ログには、検証警告の原因となったディクショナリ・オブジェクトの検索に役立つメッセージが含まれています。 たとえば、次の文字列は、警告がRLFact_1
というデータ・モデル・オブジェクトから発生していることを示しています。また、問題はtest_int
というプロパティにあります。
CarRental/Data Model/RLFact_1/test_int/Expression
表4-3に、検証メッセージで指定されたディクショナリ・オブジェクト名の各部を示します。
表4-3 検証ログ内のデータ・モデルのディクショナリ・プロパティ
名前 | 説明 |
---|---|
|
ディクショナリ名 |
|
ディクショナリ内のデータ・モデル・コンポーネント |
|
データ・モデル内の要素名 |
|
指定された要素内のプロパティ名 |
|
プロパティの式部分 |
詳細は、次を参照してください。
「検証」アイコンをクリックすると、Rules Designerにより検証ログが表示されます。 ルールを初めて追加すると、図4-29のような検証警告が表示されます。
ルールに関する検証メッセージのディクショナリ・オブジェクト名部分には、検証警告に関連するルールセット、ルールおよびルール内の領域を識別できるように詳細が含まれています。たとえば、次のディクショナリ・オブジェクト指定は問題を示しています。
OracleRules1/Ruleset_2/Rules_1/Pattern[1]
検証メッセージでは、ルールのディクショナリ・オブジェクト名に1から始まる索引が使用されます。したがって、最初のパターンはPattern[1]
です。
ルールを検証するのみでなく、デザイン時にRules Designerでテストすることもできます。詳細は、第8.1.1項「Rules Designerでテスト関数を使用してルールをテストする方法」を参照してください。
「検証」アイコンをクリックすると、Rules Designerにより検証ログが表示されます。 デシジョン表を初めて追加すると、図4-30のような検証警告が表示されます。
デシジョン表に関する検証メッセージのディクショナリ・オブジェクト名部分には、デシジョン表のうち検証警告に関連する領域を識別できるように詳細が含まれています。たとえば、次のディクショナリ・オブジェクト指定は、デシジョン表の最初のアクション行と最初のアクション・セルに問題があることを示します。
OR1/Ruleset_1/DecisionTable_1/Action[1]/Action Cell[1]
検証メッセージでは、デシジョン表オブジェクトのディクショナリ・オブジェクト名に1から始まる索引が使用されます。たとえば、「条件」領域の第1行の第1条件セルを示すメッセージは次のようになります。
OracleRules1/Ruleset_1/DecisionTable_2/Condition[1]/Condition Cell[1]
この指定は、図4-31に示すように、デシジョン表の「条件」領域のうち、第1行にあるラベルR1が付いたルールの条件セルを示しています。
ルールおよびデシジョン表の詳細設定を使用すると、詳細オプションを提供する機能を使用できます。ただし、この機能はすべてのOracle Business Rulesユーザーに必要というわけではありません。次のような機能があります。
「拡張モード」: ルール内でその他のパターン一致オプションおよびネスト・テストを使用できます。
詳細は、次を参照してください。
「ツリー・モード」: マスター・ディテール階層(親子関係にマップされるネストされた要素)を容易に使用できるようにします。 このようなファクト間の親子関係は、XMLおよびADF Business Componentsファクト・タイプにおいて一般的です。このオプションは、「拡張モード」オプションと併用できます。
詳細は、第4.8.2項「単純ツリー・モードのルールの作成方法」を参照してください。
「自動競合解決」: (デシジョン表の詳細設定でのみ使用可能)。自動競合解決ポリシーを使用して可能な場合に、オーバーライド競合解決を使用してデシジョン表の競合を自動的に解決するように指定します。
詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。
「アクティブなルール」: ルールまたはデシジョン表がアクティブであるか非アクティブであるかを指定します。 「アクティブなルール」が選択されていない場合、指定したルールまたはデシジョン表はRules Designerによって検証されません。
詳細は、第4.5.3項「アクティブ・オプションの選択方法」を参照してください。
「論理」: ルールを起動するファクトとルールによりアサートされるファクト間の論理的な依存関係を有効化または無効化できます。
詳細は、第4.5.4項「論理オプションの選択方法」を参照してください。
「優先度」: ルールまたはデシジョン表の優先度を指定します。ルールセット内では、優先度の高いルールが実行されてから、優先度の低いルールが実行されます。
詳細は、第4.5.5項「ルールの優先度の設定方法」を参照してください。
「有効日」: ルールまたはデシジョン表の有効日を指定します。
詳細は、第4.5.6項「有効日の指定方法」を参照してください。
「ギャップの許可」: (デシジョン表の詳細設定でのみ使用可能)。このチェック・ボックスでは、デシジョン表でギャップが検出された場合に検証メッセージをレポートするかどうかを指定します。その場合の検証メッセージを次に示します。
RUL-05852: Decision Table has gaps
詳細は、第5.3.1.3項「デシジョン表のギャップ分析」および第5.3.5項「デシジョン表のギャップ分析の実行方法」を参照してください。
Rules Designerでは、各ルール名およびデシジョン表名の横に「詳細設定の表示」または「詳細設定の非表示」アイコンがあり、詳細設定の表示と非表示を切り替えることができます。
ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える手順は、次のとおりです。
その他のパターン一致オプションおよびその他のアクションを提供するルールまたはデシジョン表機能を使用するには、「拡張モード」を選択します。 詳細は、第4.7項「拡張モードのルールの使用」を参照してください。
拡張モード・オプションを選択する手順は、次のとおりです。
拡張モードを設定するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
図4-34に示すように、「拡張モード」を選択します。
Oracle Business Rulesには、ルールまたはデシジョン表がアクティブであるか非アクティブであるかを指定する機能が組み込まれています。 アクティブ・オプションは有効日に関係なく設定され、前に指定した有効日を変更または削除せずに設定できます。 「アクティブなルール」が選択されていない場合、ルールはRules Designerによって検証されません。
アクティブ・オプションを選択する手順は、次のとおりです。
「アクティブなルール」オプションを設定するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「アクティブなルール」を選択します。
「論理」オプションが選択されているルールセットまたはデシジョン表では、生成されるRL Language内のルールで論理プロパティを使用するように指定されています。 論理プロパティを使用すると、ルールを起動するファクトとルールによりアサートされるファクト間の論理的な依存関係を有効化または無効化できます。
論理プロパティが有効化されているルールでは、ルール内のアクション・ブロックによってアサートされた全ファクトが、ルール条件内で一致したファクトに依存します。 ルールの条件が適用されなくなるなど、ルール条件で参照されていたファクトに変更があると、ルール条件によってアサートされたファクトは自動的に取り消されます。 論理プロパティの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。
ルールセットとデシジョン表の「論理」オプションを使用すると、ルールセットまたはデシジョン表内のルールに関連して生成されたRL Languageに対する論理プロパティを有効化または無効化できます。デフォルトでは、「論理」オプションは選択されません。
論理オプションを選択する手順は、次のとおりです。
「論理」オプションを設定するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「論理」を選択します。
ルールまたはデシジョン表の優先度を設定できます。 表4-4に示すように事前定義済の名前が付いた優先度のリストから選択する方法と、正または負の整数を入力して独自の優先度レベルを指定する方法があります。ルールセット内では、優先度の高いルールが実行されてから、優先度の低いルールが実行されます。デフォルトの優先度はmedium
(整数値0)です。
ルールの優先度を設定する手順は、次のとおりです。
優先度を設定するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「優先度」フィールドで、優先度値を指定します。
ルールセット、ルールまたはデシジョン表の有効日を指定できます。
有効日を指定する手順は、次のとおりです。
有効日を設定するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「有効日」フィールドを選択します。 「有効日の設定」ダイアログが表示されます。
「有効日の設定」ダイアログを使用して有効日を設定します。
有効日の使用の詳細は、第4.9項「日付ファクトの使用、日付関数および有効日の指定」および第4.2.2項「ルールセットの有効日の設定方法」を参照してください。
ルールまたはデシジョン表では、ネスト・テスト機能を使用して、さらに複雑なテストを作成できます。
Oracle Business Rulesでは、次のOracle Business Rules機能のサポートを追加する詳細なルールを作成できる機能が提供されます。
その他のパターン一致オプション(第4.7.1項「拡張モードのパターン一致オプションの使用方法」を参照)
その他の一致したファクト名オプション(第4.7.2項「拡張モードの一致したファクト名の使用方法」を参照)
その他のサポートされるアクション・フォーム(第4.7.3項「拡張モードのアクション・フォームの使用方法」を参照)
パターン一致の集計関数オプション(第4.7.4項「拡張モードの集計条件の使用方法」を参照)
詳細は、第4.7.5項「拡張モードのルールに関する必須情報」を参照してください。
拡張モードのパターン一致オプションでは、ルールの起動時期を指定します。表4-5に、使用可能なオプションを示します。
表4-5 拡張モードのパターン一致オプション
オプション | 説明 |
---|---|
これは、デフォルトのパターン一致オプションです。一致が存在するたびに(一致するすべてのケースで)ルールを起動する必要があります。 |
|
このオプションでは、一致が1つ以上存在する場合にルールの起動が1つ選択されます。 |
|
この値では、一致がない場合にルールを1回起動するように指定します。 |
|
このオプションでは、すべての一致に集計関数を適用するように指定します。 詳細は、第4.7.4項「拡張モードの集計条件の使用方法」を参照してください。 |
拡張モードのパターン一致オプションを使用する手順は、次のとおりです。
パターン一致オプションを使用するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「拡張モード」を選択します。
図4-39に示すように、テスト・パターンを右クリックして「囲む」を選択します。
図4-40に示すように、「囲む」ダイアログが表示されます。
「囲む」ダイアログからパターン・ブロック・オプションを選択し、「OK」をクリックします。
図4-41に示すように、パターンはデフォルトの「(次の各ケース)」を使用してネスト・パターンで囲まれます。
図4-42に示すように、デフォルトの「(次の各ケース)」オプションを選択し、リストから必要なパターン一致オプションを選択します。
ルールまたはデシジョン表内で一致したファクト名のフィールド(パターンのバインド変数)を使用すると、1つのルールで同じタイプの複数インスタンスをテストできます。 一致したファクト名を使用すると、一致したファクトについて一時的な名前を入力してテストで使用できます。 たとえば、図4-43に示すルールでは、一致する帽子品目が注文に1つ以上含まれている場合に靴品目に割引が適用されるルールでの、パターンのバインド変数の使用を示しています。
たとえば、図4-44に示すように、顧客の注文で重複している品目を検索するためのルールを作成できます。 この例は、ルールでの一致の使用を示しています。
拡張モードの一致したファクト名を使用する手順は、次のとおりです。
一致したファクト名を追加するルールまたはデシジョン表を選択します。
ルール名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「拡張モード」を選択します。
「<ファクト・タイプ>」を選択し、ドロップダウン・リストからファクト・タイプを入力します。
図4-45に示すように、表示される一致したファクト名を選択し、必要に応じて変更します。 たとえば、一致したファクト名Order$LineItem1
を入力して[Enter]を押します。
図4-46に示すように、ルールを作成します。一致したファクト名をオペランドとして選択できることに注意してください。 オペランド「LineItem1」および「LineItem2」を必要に応じて選択し、ルールを作成します。
図4-46では、テストによって次の行がチェックされます。
RL.get fact ID(Order$LineItem1)
> RL.get fact ID(Order$LineItem2)
これは、Order$LineItem
の単一インスタンスがOrder$LineItem
ファクト・タイプと一致する両方のパターンと一致することを防止します。 異なるインスタンスの異なる順列に対してルールが起動することを防ぐために、>
が必要となります。 詳細は、付録C「自己結合を正しく表現するにはどうすればよいですか。」を参照してください。
拡張モードでルールを作成する場合、Rules Designerでは表4-6に示す使用可能なアクションのリストが表示されます。 表4-6に示す各フォームについて、Rules Designerで表示されるオプションは状況依存です。 このため、アクション・タイプを使用するときに表示されるリストおよび項目の数は状況依存であり、追加するアクション、およびアクションの入力中の選択内容に応じて異なります。
表4-6 拡張モードのアクション・オプション
アクション・フォーム | 説明 |
---|---|
|
ファクトのアサート |
|
ルートが指定されたファクトのツリーをアサートします。 |
|
新規ファクトをアサートします。 |
|
変数に値を割り当てます。 |
|
新規の変数に値を割り当てます。 |
|
式を実行します。 |
|
関数をコールします。 |
|
Javaに類似したOracle RLにはforループがあります。forループには、変数とコレクションを持つ型が含まれています。 型と変数により、ループ内で使用されるコレクション値を保持するループ変数が定義されます。 コレクションは、ループ変数に適切な型のコレクションとして評価される式です。forループを使用すると、任意のコレクションを繰り返すことができます。 return、throwまたはhaltによってアクション・ブロックを終了できます。 |
|
if elseアクションを使用すると、テストがtrueの場合は最初のアクション・ブロックが実行され、テストがfalseの場合はオプションのelse部が実行されます。このelse部は、別のifアクションまたはアクション・ブロックでもかまいません。 Javaとは異なり、Oracle RLにはアクション・ブロックが必須で、セミコロンで終了する単一のアクションは許可されていません。 |
|
一致したファクトに関連付けられているデータ値を変更します。 |
|
ファクトを取り消します。 |
|
returnアクションは、関数またはルールのアクション・ブロックから戻ります。ルール内のreturnアクションはルールセット・スタックをポップするため、実行は現在ルールセット・スタックの最上部にあるルールセットからのアジェンダに対するアクティブ化に進みます。 |
|
入力したOracle RL式を使用します。 |
|
Javaと同様に、synchronizedアクションは複数のスレッドのアクションを同期化する際に役立ちます。synchronizedアクション・ブロックを使用すると、指定したオブジェクトのロックを取得してからアクション・ブロックを実行し、次にロックを解放できます。 |
|
例外をスローします。これはjava.lang.Throwableを実装するJavaオブジェクトである必要があります。スローされた例外は、tryアクション・ブロック内のcatchで取得できます。 |
|
Oracle RLのtry、catchおよびfinallyは、構文もセマンティクスもJavaに類似しています。catch句またはfinally句が1つ以上必要です。 |
|
テストがtrueの間にアクション・ブロックを実行します。return、throwまたはhaltによってアクション・ブロックを終了できます。 |
拡張モードのアクション・フォームを使用する手順は、次のとおりです。
Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。
ルールまたはデシジョン表を選択または追加します。
ルールまたはデシジョン表で、ルールまたはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「拡張モード」を選択します。
挿入領域が表示された状態で、ルールの「THEN」領域で、「<アクションの挿入>」を選択します。 図4-47に示すように、アクション・リストが表示されます。
ドロップダウン・リストで、追加するアクションを選択します。
たとえば、「assign new」を選択します。
「THEN」領域で、アクションの状況依存パラメータを選択し、適切な値を入力します。
拡張モードでルールを作成する際に、Rules Designerではパターン一致集計オプションがサポートされます。 1つのみのファクトではなく複数のファクトに基づくルール条件を記述する場合に、集計を使用できます。 複数のファクトにわたるビューが条件に含まれている場合は、集計関数を使用します。
表4-7に、使用可能な集計関数を示します。
表4-7 拡張モードのルール用の集計関数
関数 | 説明 |
---|---|
|
一致するファクトのカウント。 |
|
一致するファクトの平均。 |
|
一致するファクトの最大値。 |
|
一致するファクトの最小値。 |
|
一致するファクトの合計。 |
|
一致するファクトのリストを作成します。 |
たとえば、次のような特別な注文を指定するルールを記述します。
IF an order has more than 5 line items whose price is above a certain value THEN the order requires manual approval
5つの明細品目は複数のファクトにわたる場合があります。 そのため、count
集計関数を使用して、このサンプルの特別な注文規則を記述できます。
集計関数を使用する場合、次の手順を実行します。
パターンにaggregate
を選択します。
表4-7に示すリストから関数を入力します。
値を入力するか、または状況依存メニューから選択します。
<variable>
: 集計値の名前。
<expression>
: 集計する値。driver.age
などです。 選択した集計関数がcount
関数の場合、<expression>
は使用されません。
たとえば、図4-48に示すように、赤色のすべての明細品目のコストの合計を計算できます。
拡張モードの集計を使用する手順は、次のとおりです。
集計関数を使用するルールまたはデシジョン表を選択または作成します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
「拡張モード」を選択します。
使用するファクト・タイプを入力します。
「<パターンの挿入>」を選択してパターンを追加します。
新規のパターンを選択します。
パターンを右クリックして「囲む」を選択します。 「囲む」ダイアログが表示されます。
「囲む」ダイアログで、パターン・ブロックを選択します。詳細は、第4.7.1項「拡張モードのパターン一致オプションの使用方法」を参照してください。
「OK」をクリックします。
パターンで、最初のフィールドを選択します。 デフォルトでは、このフィールドには図4-49に示すように「(次の各ケース)」が含まれています。
aggregateオプションを選択します。 図4-50に示すように、集計用の状況依存フィールドが追加されます。
「<関数>」をクリックし、ドロップダウン・リストから関数を選択します。
条件で、「<ファクト・タイプ>」をクリックし、ドロップダウン・リストからファクト・タイプを選択します。
「<式>」をクリックし、ドロップダウン・リストから式を選択します。
Rules Designerでは、デフォルトで集計パターンの作成時に変数名が作成されます。 作成中のルールに必要な場合は、デフォルトの変数名を置き換える変数名を入力します。 図4-51に、集計を使用して完成したルールを示します。 この例では、わかりやすくするためにルールには変数名total_cost
およびitem_x
が表示されています。
必要に応じてその他のテストを入力します。 この例では、図4-52に示すように、赤色の品目のテストを入力します。
「拡張モード」のルールを使用する際には、次のような特殊ケースに注意する必要があります。
集計を使用する場合、アクションにはパターン変数が表示されません。パターン変数は、「(次の各ケース...)」パターンを使用する場合のアクション・リストにのみ表示されます。したがって、「集計」、「次のケースがある」パターンまたは「次のケースがない」パターンには、パターン変数を表示できません。
「拡張モード」を選択すると、詳細パターン一致などの詳細オプションをルールで使用しているかぎり、「拡張モード」は選択状態のままで非アクティブ(グレー表示)になっています。 「拡張モード」の選択を解除するには、拡張モード機能を削除するか、または元に戻す必要があります(拡張モードではないルールを作成することからやり直し、その後で拡張モードのルールを削除するほうが容易な場合があります)。
拡張モード・オプションの選択を解除する手順は、次のとおりです。
「拡張モード」の選択を解除するルールまたはデシジョン表を選択します。
ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。
ルールの状態を考慮します。
(「拡張モード」アイコンがグレー表示からアクティブに変わるように)「拡張モード」オプションを有効化するルールを簡素化できる場合は、 ルールを簡素化し、「拡張モード」が有効化されている場合は「拡張モード」の選択を解除します。
「元に戻す」を使用して「拡張モード」ルールを作成するために使用した手順を元に戻し、ルールを「拡張モード」ではない状態にできる場合は、この方法を使用してルールを簡素化します。
ルールを簡素化できない場合は、ルールを削除して再作成します。
ツリー・モードのルールを使用すると、親子関係にマップされるネストされた要素が存在するマスター・ディテール階層を容易に使用できます。
ツリー・モードのルールを説明するには、例を使用すると有用です。 ビジネス・プロセスおよびルールを使用して小売発注書(PO)を処理するアプリケーション部分のライフサイクルについて考えます。 発注書には、PO全体に適用される取引条件を含むヘッダーがあります。 POには、出荷先のリストも含まれています。 各宛先には、住所、宛先の住所に出荷される品目のリストおよび出荷のリストが含まれています。
すべての品目のステータスが出荷済または取消し済である場合に、POが完全に出荷済であるとする、というビジネス・ルールについて考えます。
図4-53に、POの例のサンプルXMLスキーマ表現を示します。 POのXML文書はツリー構造になっています。 これにより、POの自然な表現が可能になります。 たとえば、PO自体は最上位レベルの文書要素であり、宛先は品目要素および出荷要素を含むネストされた要素です。 出荷要素にも、注文された品目を参照する品目要素が含まれています。 ステータスには、有効な値のリストがあります。
例4-1に、図4-53で示したサンプルの発注書のXMLスキーマを示します。
例4-1 サンプルの発注書(PO)のスキーマ
<?xml version= '1.0' encoding= 'UTF-8' ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.org" targetNamespace="http://www.example.org" elementFormDefault="qualified"> <xsd:element name="PO"> <xsd:annotation> <xsd:documentation>A sample element</xsd:documentation> </xsd:annotation> <xsd:complexType> <xsd:sequence> <xsd:element name="header"> <xsd:complexType> <xsd:attribute name="status" type="Status"/> <xsd:attribute name="order-date" type="xsd:date"/> <xsd:attribute name="customer-value"/> </xsd:complexType> </xsd:element> <xsd:element name="billing"> <xsd:complexType> <xsd:sequence> <xsd:element name="address"/> <xsd:element name="payment"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="destination" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="address"/> <xsd:element name="item" maxOccurs="unbounded"> <xsd:complexType> <xsd:attribute name="ID"/> <xsd:attribute name="status"/> <xsd:attribute name="quantity" type="xsd:int"/> <xsd:attribute name="availability-date" type="xsd:date"/> <xsd:attribute name="qoh" type="xsd:int"/> <xsd:attribute name="price" type="xsd:decimal"/> </xsd:complexType> </xsd:element> <xsd:element name="shipment" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="item" maxOccurs="unbounded"> <xsd:complexType> <xsd:attribute name="ID"/> <xsd:attribute name="quantity"/> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="ship-date"/> <xsd:attribute name="method"/> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="status" type="xsd:string"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:simpleType name="Status"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="open"/> <xsd:enumeration value="partially shipped"/> <xsd:enumeration value="fully shipped"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
例4-2に、POスキーマのインスタンスのXMLの一部を示します。 ツリー・モードのルールを使用するために、1つ以上の取引条件をテストするルールを作成でき、テストにパスした場合は1つ以上の取引条件が追加または変更されます。 Oracle Business Rulesには、サンプルのPOインスタンスのようなファクト・ツリーでのエラーのないルール作成を有効化する特別なサポートがあります。
たとえば、次のように指定するPOスキーマのインスタンスのルール作成について考えます。
IF the time between the order date and the date for availability of an item is more than 30 days THEN cancel the item
例4-2 サンプルのPOのXMLインスタンス(要約)
<PO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org ../../../../Temp/PO.xsd" xmlns="http://www.example.org"> <header/> <billing> <address/> <payment/> </billing> <destination> <address/> <item ID="a01"/> <item ID="a02"/> <item ID="a03"/> <shipment> <item ID="a01"/> <item ID="a02"/> </shipment> </destination> </PO>
「拡張モード」オプションが選択されておらず、「ツリー・モード」が選択されている場合は、非拡張ツリー・モード、つまり単純ツリー・モードを使用します。 このモードでは、Rules Designerにより、図4-54に示すように、ルート・ファクト・タイプを入力するROOT: 「<ファクト・タイプ>」が表示されます。
「ツリー・モード」を選択し、「拡張モード」の選択を解除してルールを作成すると、修飾名を使用してツリー内のプロパティを参照できます。次に例を示します。
PO/destination/item.quantity
はitem.quantity
に似ていますが、POのdestination
である品目のみが一致します。
PO$Destination$item.quantity
はList<item>
を参照します。 この参照は、非ツリー・モードから変更されていません。
単純ツリー・モードでは、選択できるのは多対多結合や集計を必要としない条件のみです。
詳細は、第4.8.2項「単純ツリー・モードのルールの作成方法」を参照してください。
「拡張モード」オプションが選択されており、「ツリー・モード」オプションが選択されている場合は、拡張ツリー・モードを使用します。 このモードでは、Rules Designerにより、図4-55に示すように、ルート・ファクト・タイプを入力するROOT: 「<ファクト・タイプ>」が表示されます。 Rules Designerでは、ツリー構造のファクトのパターンが表示されますが、親ファクトと子ファクトを結合する単純テストは非表示です。
拡張ツリー・モードでは、ツリー・モードのパターン(ルート以外)は次のように表示されます。
<演算子> <変数> is a <ファクト・パス>
<ファクト・パス>
は、ルートから始まる1対1および1対多関係をたどるXPathに類似したパスです。 たとえば、各ファクト・パスにはPO/destination
などの名前が付いており、PO
はルート・ファクト・タイプで、destinationはタイプList
のプロパティです。 ファクト・パス内の1対多関係は、PO/destination
のように/
で示されます。
ファクト・パス内の1対1関係は、.
で示されます。これは、非ツリー・モードから変更されていません。 たとえば、item.availabilityDate
のようになります。
拡張モードはパターンの概念を公開しており、その最も単純な形式はis aです。 たとえば、p is a PO
ではp
はすべてのPO
ファクトと繰り返し一致し、d is a p/destination
ではd
はp
のすべてのdestinationと一致します。 is aの左側は変数であり、右側はファクト・タイプまたはファクト・パスです。 デフォルトでは、Oracle Business Rulesによってファクト・タイプまたはファクト・パスと等しい変数名が設定されます。 たとえば、PO is a POです。 パターンにはパターン・ブロックを使用することもできます。 パターン・ブロックには、ブロック内でネストされたパターンおよびテストに適用される論理数量子、否定または集計があります。
詳細は、第4.8.3項「拡張ツリー・モードのルールの作成方法」を参照してください。
拡張ツリー・モードのルールを使用する場合、Rules Designerでは、直積を回避しながら、様々な子フォレストからの条件を同じルールに結合するために、集計パターン(有無など)を使用する必要があります。
次の手順では、例4-1で示したXMLスキーマと例4-2で示したスキーマ・インスタンスを使用して、30日間使用可能ではない品目を取り消すPOルールを作成します。
IF the time between the order date and the date for availability of an item is more than 30 days THEN cancel the item
単純ツリー・モードのルールを作成する手順は、次のとおりです。
ルールセット内にIF/THENルールを作成します。
詳細は、第4.3.1項「ルールの追加方法」を参照してください。
詳細設定を表示します。
詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
図4-56に示すように、「ツリー・モード」を選択します。
ROOT:の横で、「<ファクト・タイプ>」プレースホルダをクリックし、図4-57に示すようにドロップダウン・リストから「PO」を選択します。
「<テストの挿入>」を選択します。
IF文がIF <オペランド> == <オペランド>
となります。
左の「<オペランド>」を選択します。
ドロップダウン・リストで、PO/destination/item.availabilityDate
を選択します。
図4-58に示すように、「式ビルダー」アイコンを選択します。
「式ビルダー」ダイアログで、「式」領域に表示されている品目をコピーして削除します。
式ビルダーで、「関数」タブを選択します。
ナビゲータで、「Duration」を開き、「daysbetween」関数をダブルクリックします。
図4-59に示すように、「daysbetween」の引数テンプレートを削除します。
「daysbetween」関数の2番目の引数として前に切り取った値を貼り付けます。
「式ビルダー」ダイアログで、「変数」タブを選択します。
「daysbetween」関数の最初の引数について、ナビゲータを使用して「PO」を開き、「header」を開いて「orderDate」をダブルクリックします。
「式ビルダー」ダイアログで「OK」をクリックします。
ドロップダウン・リストで、「式」領域で[Enter]を押します。
「operator」を選択して>を入力します。
図4-60に示すように、右の「<オペランド>」を選択し、値30を入力して[Enter]を押します。
「<アクションの挿入>」をクリックし、ドロップダウン・リストから「modify」を選択します。
THEN文がTHEN modify <ターゲット>
となります。
「<ターゲット>」をクリックし、ドロップダウン・リストから「PO/destination/item」を選択します。 THEN文は次のようになります。
THEN modify PO/destination/item ( <add property> )
「<プロパティの追加>」をクリックします。 「プロパティ」ダイアログが表示されます。
「プロパティ」ダイアログで、図4-61に示すように、status名に値"canceled"を入力します。
「プロパティ」ダイアログで、「閉じる」をクリックします。
図4-62に示すように、完成したルールが表示されます。
modify
文では、PO/destination/item
は特定のitem
インスタンス・メンバーを参照することに注意してください。
次の手順では、例4-1に示したXMLスキーマと例4-2に示した各ファクトのインスタンスを使用して、次のような無料出荷ルールを作成します。
IF the total cost of "free shipping eligible" items to a given destination is greater than $40 THEN shipping of those items is free
拡張ツリー・モードのルールを作成する手順は、次のとおりです。
ルールセット内にIF/THENルールを作成します。
詳細は、第4.3.1項「ルールの追加方法」を参照してください。
詳細設定を表示します。
詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
図4-63に示すように、「拡張モード」を選択し、「ツリー・モード」を選択します。
「<ファクト・タイプ>」プレースホルダを選択し、ドロップダウン・リストから「PO」を選択します。
図4-64に示すように、無料出荷ルールを完成します。
Oracle Business Rulesでは、時刻と日付の操作を容易にする機能が提供され、時刻と日付に基づいてルールがいつ有効かを決定できる有効日機能が提供されます。
CurrentDateファクトを使用すると、現在の日付を表すファクトに基づいて判断できます。
「有効日」を使用すると、ルールセット内のすべてのルールとデシジョン表、個々のルールまたは個々のデシジョン表が有効な日付または日時の範囲を定義する開始日と終了日を指定できます。
表4-8に、使用可能な「有効日」のオプションを示します。
表4-8 有効日に可能な値
有効日 | 説明 |
---|---|
常に有効 |
「開始」も「終了」も設定しないことを指定します。 |
開始(「終了」日付設定なし) |
特定の日付から不特定の将来にかけて有効です。 |
終了(「開始」日付設定なし) |
現在から特定の日付まで有効です。 |
「開始」設定と「終了」設定 |
2つの日付の間のみ有効です。 |
「常に」以外の有効日指定には、次のいずれかを使用できます。
日付のみ指定、時間指定なし: この場合、有効日は各タイムゾーンの指定日の午前0時とみなされます。
日付、タイムゾーンを指定、時間指定なし: この場合、有効日は指定のタイムゾーンの指定日の午前0時とみなされます。
日付、タイムゾーン、時間を指定: この場合、日付と時間を完全に指定します。
時間指定のみで、日付およびタイムゾーン指定なし: すべての日の指定の時間に適用されます。
時間とタイムゾーンを指定、日付指定なし: すべての日の指定の時間に適用されます。
ルールまたはデシジョン表で現在の日付ファクトを使用できます。
CurrentDateファクトを使用する手順は、次のとおりです。
「ルールセット」ナビゲーション・タブで、ルールセットを選択します。
ルールセット内のルールを選択します。
図4-65に示すように、「IF」領域で、CurrentDateファクトおよびCalendar
タイプの日付メソッドを使用する条件を追加します。
ルールセット、ルールまたはデシジョン表の有効開始日または有効終了日、あるいはその両方を指定できます。 ルールセットの有効日を指定する方法は、第4.2.2項「ルールセットの有効日の設定方法」を参照してください。
ルールの有効日を設定する手順は、次のとおりです。
デフォルトでは、Oracle Business Rules Engineにより、CurrentDateファクトおよび有効日に関連付けられるクロックは暗黙的に管理され、それぞれシステム日付の値に設定されます。 RL Language関数setCurrentDate()
およびsetEffectiveDate()
を使用すると、現在の日付および有効日を明示的に設定できます。詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。
有効開始日とは、その日からルール、デシジョン表またはルールセットがルール評価と起動に関連させることができる日のことです。 したがって、ルールが有効であれば条件が満たされた場合に起動でき、ルールが有効でなければ条件が満たされるかどうかに関係なく起動しません。
有効終了日とは、その日からルール、デシジョン表またはルールセットがルール評価に関連しなくなる日のことです(有効ではないということは、ルールが起動しないということを意味します)。
有効開始日と有効終了日はデシジョン表に設定できますが、デシジョン表内のルールに対して個別に設定することはできません。
ルールとデシジョン表には、「アクティブなルール」オプションも組み込まれています。 このオプションは有効日に関係なく設定され、指定の有効日を変更または削除することなく日付を有効にします。 「アクティブなルール」オプションの使用の詳細は、第4.5.3項「アクティブ・オプションの選択方法」を参照してください。
ルールセットとルールセット内のルールまたはデシジョン表の両方に対して有効日が定義されている場合、その優先度は次のようになります(最上位の優先度は1です)。
ルールセットの「アクティブなルール」オプションが選択されていない場合、そのエンティティのRL Languageは生成されません。
ルールセットの有効日プロパティの一方または両方が選択されている場合、有効開始日と有効終了日では、ルールセット内に定義されているルールまたはデシジョン表について許可された有効日の範囲が定義されます(つまり、「有効日の設定」ダイアログでルールセットの「開始」チェック・ボックスおよび「終了」チェック・ボックスの一方または両方が選択されている場合)。
したがって、ルールセット内のルールまたはデシジョン表について指定された有効日は、それを含んでいるルールセットによって設定された境界に違反できません。たとえば、ルールには、ルールセットについて指定された有効終了日よりも後の有効終了日を指定できません。
個別のルールまたはデシジョン表の「アクティブなルール」が選択されていない場合、そのルールまたはデシジョン表のRL Languageは生成されません。
ルールセットの「有効日の設定」ダイアログの「時間」が選択されている場合、またはルールセット内のルールまたはデシジョン表についてこのオプションが選択されている場合、有効日を指定する際にはルールセット内のルールまたはデシジョン表の全インスタンスの「時間」を選択する必要があります。 この場合、「両方」または「日付」が選択されている場合は、Rules Designerでは次の検証警告が表示されます。
RUL-05742: Calendar form incompatibility detected with forms Time and DateTime. If the calendar form is set to Time on a rule set or any of the rules or decision tables within that ruleset then the calendar form for that entire rule set is restricted to Time.
Duration、JavaDateおよびXMLDate、OracleDateおよびOracleDuration拡張メソッドをルールまたはデシジョン表で使用できます。 詳細は、付録B「Rulesの拡張メソッド」を参照してください。
Durationメソッドを使用する手順は、次のとおりです。
「ルールセット」ナビゲーション・タブで、ルールセットを選択します。
ルールセット内のルールを選択します(Durationメソッドはデシジョン表で使用することもできます)。
「IF」領域で条件を追加します。
ルール条件のオペランドを選択します。
ドロップダウン・リストから「式ビルダー」を選択します。 詳細は、第4.10項「式ビルダーの使用」を参照してください。
式ビルダーで、「関数」タブを選択します。
「式ビルダー」のナビゲータで、「Duration」フォルダを開きます。
間隔テストの必要に応じて、適切なメソッドをダブルクリックして選択および挿入します。
適切な引数をメソッドに指定します。 図4-68に示す例を参照してください。
図4-69に示すように、ルールを作成できます。
式ビルダーを使用して、Oracle Business Rules用の式を作成したり編集できます。
Rules Designerの様々な部分から式ビルダーにアクセスできます。たとえば、「グローバルの編集 -」ダイアログや、デシジョン表内で条件を操作するときの「条件」領域、および自由形式の式を選択して拡張モードでルールとデシジョン表を入力するときなどです。
図4-70に、Rules Designerの式ビルダーを示します。
式ビルダーでは、「変数」または「関数」ナビゲーション・ツリー、または「演算子」タブ、または「定数」タブで項目をダブルクリックすると、項目は「式」領域の式に挿入されます。 また、「式」領域でテキストを入力して、式を直接作成または編集することもできます。
式を入力するときは、「変数」は有効な割当ターゲットであり、「定数」は有効な割当ターゲットではないことに注意してください。 そのため、作成する式に追加する項目のタイプが明確ではない場合は、両方のタブを使用する必要があります。
「式」フィールド内の関数にカーソルを置き、挿入する式または関数をダブルクリックして、選択した関数の引数を指定します。たとえば、関数のカッコ内にカーソルを置いて変数を選択します。これにより、カーソル位置にある式に変数が挿入されます。
値リスト・バケット・セットと範囲リスト・バケット・セットを使用して、ルール内のファクト・プロパティに対する制約を指定できます。これにより、Rules Designerを使用して、指定値が範囲外の場合や、バケット・セットで指定された候補値セットの範囲内にない場合に、可能性のあるエラーに関する検証警告を生成できます。 Oracle Business Rulesでは、バケット・セットを使用して、グローバル初期値、関数の戻り値または関数の引数値の制約を指定することもできます。 詳細は、第2.3項「Oracle Business Rulesグローバルの使用」および第3.7項「バケット・セットのファクトおよび関数との関連付け」を参照してください。
範囲リスト・バケット・セットをファクト・プロパティの制約として使用できます。
値リスト・バケット・セットを制約として使用する方法の詳細は、第4.11.2項「値リスト・バケット・セットをファクト・プロパティの制約として使用する方法」を参照してください。
範囲リスト・バケット・セットをファクト・プロパティの制約として使用する手順は、次のとおりです。
対象となる範囲を含んだバケット・セットを指定し、有効なすべての範囲について「アクションで許可済」を選択します。 範囲を含めるには、最上部と最下部のエンドポイントについて「アクションで許可済」の選択を解除します。
アプリケーションに必要な場合は「含まれるエンドポイント」を選択します。
「許可されないバケットをテストに含める」の選択を解除します。 たとえば、有効な等級を定義し、100より大きい値または0より小さい値を許可しないバケット・セットの場合、バケット・セットのエンドポイントを図4-71のように定義します。
このバケット・セットをファクト・プロパティに関連付けます。 たとえば、図4-72に示すように、このバケット・セットをtest_math1に関連付けます。
これで、このファクト・プロパティを使用するテストでルールを定義すると、値が範囲外の場合に検証警告が表示されます。 たとえば、図4-73に示すように、値-10の式でルールを定義すると、Rules Designerに検証警告が表示されます。
値リスト・バケット・セットをファクト・プロパティの制約として使用できます。
範囲リスト・バケット・セットを制約として使用する方法の詳細は、第4.11.1項「範囲リスト・バケット・セットをファクト・プロパティの制約として使用する方法」を参照してください。
値リスト・バケット・セットをファクト・プロパティの制約として使用する手順は、次のとおりです。
対象となる値を含んだLOVバケット・セットを指定し、有効なすべての値について「アクションで許可済」を選択します。詳細は、第3.6.1項「値リストのグローバル・バケット・セットの定義方法」を参照してください。
otherwiseバケットについて「アクションで許可済」の選択を解除します。
「許可されないバケットをテストに含める」の選択を解除します。
このバケット・セットをファクト・プロパティに関連付けます。
LOVバケット・セットを使用して、式およびアクションのオプションを指定できます。
バケット・セットを使用してルール式およびアクションのオプションを指定する方法は、次のとおりです。
Rules Designerで、ファクト・プロパティに対応するタイプのLOVバケット・セットを定義します。詳細は、第3.6.1項「値リストのグローバル・バケット・セットの定義方法」を参照してください。
バケット・セットをファクト・プロパティに関連付けます。 詳細は、第3.7.1項「バケット・セットをファクト・プロパティに関連付ける方法」を参照してください。
式を入力すると、Rules Designerにより「values options」にバケット値が表示されます。 たとえば、ファクト・プロパティDriver.
eye_test
をeyes
というLOVバケット・セットに値pass
、fail
およびglasses_required
で関連付け、テスト式でDriver.eye_test
を使用した場合、バケット値は図4-74に示すように制限されます。