第4章 Business Central における DRL ルールの作成
Business Central で、プロジェクトに対して DRL ルールを作成して管理できます。パッケージに作成またはインポートするデータオブジェクトに基づいて、各 DRL ファイルで、ルールの条件、アクション、そしてルールに関連するその他のコンポーネントを定義します。
手順
-
Business Central で、Menu
Design Projects に移動して、プロジェクト名をクリックします。 -
Add Asset
DRL ファイル をクリックします。 参考となる DRL ファイル 名を入力し、適切な パッケージ を選択します。指定するパッケージは、必要なデータオブジェクトが割り当てられている、またはこれから割り当てるパッケージにする必要があります。
ドメイン固有言語 (DSL) アセットがプロジェクトに定義されている場合は、Show declared DSL sentences を選択することもできます。この DSL アセットは、DRL デザイナーで定義する条件およびアクションに使用できるオブジェクトです。
OK をクリックして、ルールアセットを作成します。
新しい DRL ファイルが、Project Explorer の DRL パネルに追加されます。Show declared DSL sentences オプションを選択した場合は、DSLR パネルに追加されます。この DRL ファイルを割り当てたパッケージは、ファイルの上位にリストされます。
-
DRL デザイナーの左パネルの Fact types リストで、ルールに必要なすべてのデータオブジェクトとデータオブジェクトフィールドがリストされていることを確認します (それぞれを展開します)。リストされていない場合は、DRL ファイルの
import
命令文を使用して、その他のパッケージから関連するデータオブジェクトをインポートするか、パッケージにデータオブジェクトを作成します。 データオブジェクトをすべて配置したら、DRL デザイナーの Model タブに戻り、以下のいずれかのコンポーネントで DRL ファイルを定義します。
DRL ファイルのコンポーネント
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
package
: (自動) これは、DRL ファイルを作成し、パッケージを選択すると定義されます。 import
: このパッケージ、または DRL ファイルで使用するその他のパッケージのデータオブジェクトを指定します。パッケージとデータオブジェクトをpackage.name.object.name
形式で指定し、1 行につき 1 つインポートします。データオブジェクトのインポート
import mortgages.mortgages.LoanApplication;
import mortgages.mortgages.LoanApplication;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow function
: (任意) DRL ファイルのルールが使用する関数を指定します。関数は、ルールのソースファイルにセマンティックコードを追加します。関数は、特に、ルールのアクション (then
) 部分が繰り返し使用され、パラメーターだけがルールごとに異なる場合に便利です。DRL ファイルのルールで、関数を宣言したり、静的メソッドを関数としてインポートしたりして、ルールの アクション (then
) 部分に、名前を指定して関数を使用します。ルールに関数を宣言して使用 (オプション 1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルールに関数をインポートして使用 (オプション 2)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow query
: (任意) DRL ファイルのルールに関連するファクトに対してデシジョンエンジンを検索するのに使用します。クエリーは、定義した条件セットを検索するため、when
またはthen
を指定する必要はありません。クエリー名は KIE ベースでグローバルとなるため、プロジェクトにあるその他のすべてのルールクエリーと重複しないようにする必要があります。クエリーの結果に戻るには、ksession.getQueryResults("name")
を使用して、従来のQueryResults
定義を構成します ("name"
はクエリー名)。これにより、クエリーの結果が返り、クエリーに一致したオブジェクトを取得できるようになります。DRL ファイルのルールに、クエリーと、クエリー結果パラメーターを定義します。ルールで、年齢が 21 歳未満の場合のクエリーと、その結果
Copy to Clipboard Copied! Toggle word wrap Toggle overflow declare
: (任意) DRL ファイルのルールが使用する新しいファクトタイプを宣言します。Red Hat Process Automation Manager のjava.lang
パッケージのデフォルトはObject
ですが、必要に応じて DRL ファイルに別のタイプを宣言することもできます。DRL ファイルにファクトタイプを宣言すると、Java などの低級言語でモデルを作成せず、デシジョンエンジンに直接新しいファクトモデルを定義するようになります。新しいファクトタイプの宣言および使用
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rule
: DRL ファイルで各ルールを定義します。ルールは、rule "name"
形式のルール名、ルールの動作 (salience
、no-loop
など) を定義する任意の属性、when
およびthen
定義が続きます。同じパッケージにルール名を重複させることはできません。ルールのwhen
部分には、アクションを実行する条件が含まれます。たとえば、銀行が、ローンの申し込みを 21 歳以上に限定した場合、Underage
ルールのwhen
条件はApplicant( age < 21 )
になります。ルールのthen
部分には、ルールの条件が一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合、then
アクションはsetApproved( false )
になり、申込者の年齢条件を満たしていないためにローンの申し込みは承認されません。条件 (when
) およびアクション (then
) は、パッケージで利用可能なデータオブジェクトに基づいて、任意の制約、バインディングなどのサポートされる DRL 要素を持つ、定められている一連のファクトパターンで構成されます。このパターンは、定義したオブジェクトにルールがどのように影響するかを指定します。申込者の年齢制限に関するルール
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 少なくても、各 DRL ファイルに
package
コンポーネント、import
コンポーネント、rule
コンポーネントを指定する必要があります。他のすべてのコンポーネントは任意です。図4.1 必要なコンポーネントおよび任意のルール属性を持つ DRL ファイルのサンプル
-
- ルールのコンポーネントをすべて定義したら、DRL デザイナーの右上ツールバーで Validate をクリックし、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
4.1. DRL ルールへの WHEN 条件の追加 リンクのコピーリンクがクリップボードにコピーされました!
ルールの when
部分には、アクションを実行するのに必要な条件が含まれます。たとえば、銀行のローン申し込みに年齢制限 (21 歳以上) が必要な場合、Underage
ルールの when
条件は Applicant( age < 21 )
となります。パッケージで利用可能なデータオブジェクトに基づいて、指定した一連のパターンおよび制約と、任意のバインディング、その他のサポートされる DRL 要素で構成されます。
前提条件
-
package
は DRL ファイルに定義されます。これは、ファイルの作成時に行われます。 -
ルールで使用したデータオブジェクトの
import
リストが、DRL ファイルのpackage
行の下に定義されます。データオブジェクトは、このパッケージ、または別の Business Central パッケージから使用できます。 -
rule
名は、package
、import
、または DRL ファイル全体に適用されるその他の行の下に、rule "name"
という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salience
、no-loop
など) を定義する任意のルール属性は、ルール名の下、when
セクションの前に定義します。
手順
DRL デザイナーで、ルールに
when
を入力して、条件命令文を追加します。when
セクションは、ルールの条件を定義するファクトパターンで構成されますが、ファクトパターンが 1 つも追加されない場合もあります。when
セクションを空にすると、デシジョンエンジンでfireAllRules()
を呼び出すたびに、then
セクションのアクションが実行します。これは、デシジョンエンジンのステートを設定するルールを使用する場合に便利です。条件のないルール
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 一致させる最初の条件のパターンを入力し、任意で制約、バインディング、およびサポートされる DRL 要素を入力します。基本的なパターンフォーマットは
patternBinding : patternType ( constraints )
です。パターンは、パッケージで利用可能なデータオブジェクトに基づいており、then
セクションのアクションを発生させるのに必要な条件を定義します。単純なパターン: 制約のない単純なパターンは、指定したタイプのファクトに一致します。たとえば、次は、申込者が存在することだけが条件になります。
when Applicant( )
when Applicant( )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 制約のあるパターン: 制約を持つパターンは、指定したタイプのファクトと、追加制限を括弧で指定したパターン (true または false) に一致します。たとえば、次は、申込者が 21 歳に満たないことを条件としています。
when Applicant( age < 21 )
when Applicant( age < 21 )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow バインディングのあるパターン: パターンのバインディングは簡単な参照となり、ルールのその他のコンポーネントが、定義したバターンに戻って参照します。たとえば、次の例では、
LoanApplication
のバインディングa
が、underage の申込者に関連するアクションとして使用されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
引き続き、このルールに適用する条件パターンをすべて定義します。以下は、DRL 条件を定義するいくつかのキーワードオプションです。
and
: 条件コンポーネントを論理積に分類します。接中辞および接頭辞のand
がサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべてand
と結合します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow or
: 条件コンポーネントを論理和に分類します。接中辞および接頭辞のor
がサポートされます。Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )
Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow exists
: 存在すべきファクトおよび制約を指定します。これは、ファクトが存在していることを示しているのではなく、ファクトが存在すべきであることを示しています。このオプションは、最初に一致したものだけが適用され、その後一致するものは無視されます。exists ( Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ) )
exists ( Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ) )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow not
: 存在するべきでないファクトおよび制約を指定します。not ( Applicant( age < 21 ) )
not ( Applicant( age < 21 ) )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow forall
: 最初のパターンに一致したすべてのファクトが残りのパターンに一致する制約を作成します。forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )
forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow from
: 条件パターンによりデータが一致するソースを指定します。Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddress
Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow entry-point
: パターンのデータソースに対応するエントリーポイントを定義します。通常はfrom
とともに使用します。Applicant( ) from entry-point "LoanApplication"
Applicant( ) from entry-point "LoanApplication"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow collect
: 構成を条件の一部として使用できる、オブジェクトのコレクションを定義します。この例では、指定した各担保に対して、デシジョンエンジンで保留されているすべての申し込みがArrayLists
に分類されます。申し込みが 3 つ以上ある場合は、このルールが実行します。m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )
m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow accumulate
: オブジェクトのコレクションを処理し、各要素のカスタムアクションを実行し、(制約がtrue
と評価されると) 結果オブジェクトを 1 つ以上返します。このオプションは、collect
よりも強力で、柔軟性が高いオプションです。accumulate( <source pattern>; <functions> [;<constraints>] )
形式を使用します。この例では、min
、max
、およびaverage
は累積関数で、各センサーのすべての測定値から、最低気温、最高気温、そして平均気温の値を計算します。その他のサポートされる関数には、count
、sum
、variance
、standardDeviation
、collectList
、およびcollectSet
があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 高度な DRL オプションこれは、条件を定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインの『Drools ドキュメンテーション』を参照してください。
- ルールの条件コンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
4.2. DRL ルールへの THEN アクションの追加 リンクのコピーリンクがクリップボードにコピーされました!
ルールの then
部分には、ルールの条件部分に一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合は、Underage
ルールの then
アクションが setApproved( false )
となり、年齢が基準に達していないためローンの申し込みが承認されません。アクションは、ルールの条件と、パッケージで利用可能オブジェクトに基づいて結果を実行します。
前提条件
-
package
は DRL ファイルに定義されます。これは、ファイルの作成時に行われます。 -
ルールで使用したデータオブジェクトの
import
リストが、DRL ファイルのpackage
行の下に定義されます。データオブジェクトは、このパッケージ、または別の Business Central パッケージから使用できます。 -
rule
名は、package
、import
、または DRL ファイル全体に適用されるその他の行の下に、rule "name"
という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salience
、no-loop
など) を定義する任意のルール属性は、ルール名の下、when
セクションの前に定義します。
手順
-
DRL デザイナーで、ルールの
when
セクションの後にthen
を入力して、アクション命令文を追加します。 ルールの条件に基づいて、ファクトパターンに対して実行するアクションを 1 つ以上入力します。
次は、DRL アクションを定義するキーワードオプションの例です。
and
: アクションコンポーネントを論理積に分類します。接中辞および接頭辞のand
がサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべてand
と結合します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow set
: フィールドの値を設定します。application.setApproved ( false ); application.setExplanation( "has been bankrupt" );
application.setApproved ( false ); application.setExplanation( "has been bankrupt" );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow modify
: ファクトに対して修正するフィールドを指定し、変更をデシジョンエンジンに通知します。modify( LoanApplication ) { setAmount( 100 ) }
modify( LoanApplication ) { setAmount( 100 ) }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow update
: フィールドと、修正される関連ファクト全体を指定して、その変更をデシジョンエンジンに通知します。ファクトが変更したら、アップデートした値の影響を受ける可能性がある別のファクトを変更する前に、update
を呼び出す必要があります。modify
キーワードには、この追加手順がありません。update( LoanApplication ) { setAmount( 100 ) }
update( LoanApplication ) { setAmount( 100 ) }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow delete
: デシジョンエンジンからオブジェクトを削除します。キーワードretract
も DRL デザイナーでサポートされ、同じアクションを実行しますが、キーワードinsert
との一貫性を保つためにdelete
が推奨されます。delete( LoanApplication );
delete( LoanApplication );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow insert
:新しい
ファクトを挿入し、ファクトに必要な結果フィールドと値を定義します。insert( new Applicant() );
insert( new Applicant() );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow insertLogical
:新しい
ファクトをデシジョンエンジンに論理的に挿入し、ファクトに必要な結果フィールドと値を追加します。デシジョンエンジンは、ファクトの挿入および取り消しに対して論理的な決断を行います。定期的な挿入、または指定した挿入の後に、ファクトを明示的に取り消す必要があります。論理挿入の後に、ファクトをアサートした条件が TRUE ではなくなると、ファクトは自動的に取り消されます。insertLogical( new Applicant() );
insertLogical( new Applicant() );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 高度な DRL オプションこれは、アクションを定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインの『Drools ドキュメンテーション』を参照してください。
- ルールのアクションコンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
4.2.1. ルールの属性 リンクのコピーリンクがクリップボードにコピーされました!
ルール属性は、ルールの動作を修正するビジネスルールを指定する追加設定です。次の表では、ルールに割り当て可能な属性の名前と、対応する値を紹介します。
属性 | 値 |
---|---|
|
ルールの優先順位を定義する整数。ルールの salience 値を高くすると、アクティベーションキューに追加したときの優先順位が高くなります。
例: |
|
ブール値。このオプションを選択すると、ルールが有効になります。このオプションを選択しないと、ルールは無効になります。
例: |
|
日付定義および時間定義を含む文字列。現在の日時が
例: |
|
日時定義を含む文字列。現在日時が
例: |
|
ブール値。このオプションを設定すると、以前一致した条件がこのルールにより再トリガーとなる場合に、このルールを再度アクティブにする (ループする) ことができません。条件を選択しないと、この状況でルールがループされます。
例: |
|
ルールを割り当てるアジェンダグループを指定する文字列。アジェンダグループを使用すると、アジェンダをパーティションで区切り、ルールのグループに対する実行をさらに制御できます。フォーカスを取得したアジェンダグループのルールだけがアクティブになります。
例: |
|
ルールを割り当てるアクティベーション (または XOR) グループを指定する文字列。アクティベーショングループでアクティブにできるルールは 1 つだけです。最初のルールが実行されると、アクティベーショングループの中で、アクティベーションが保留中のルールはすべてキャンセルされます。
例: |
|
ルールの条件が一致している場合に、ルールがアクティブになってからの時間をミリ秒で定義する長整数値。
例: |
|
ルールのスケジュールに対する
例: |
|
ルールのスケジュールを指定する Quartz カレンダーの定義。
例: |
|
アジェンダグループ内のルールにのみ適用可能なブール値。このオプションが選択されている場合は、次にルールがアクティブになると、そのルールが割り当てられたアジェンダグループに自動的にフォーカスが移ります。
例: |
|
ルールフローグループまたはアジェンダグループ内のルールにのみ適用可能なブール値。このオプションを選択すると、次回、ルールのルールフローグループがアクティブになるか、ルールのアジェンダグループがフォーカスを受け取ると、(ルールフローグループがアクティブでなくなるか、アジェンダグループがフォーカスを失うまで) ルールをアクティブにすることができません。これは、
例: |
|
ルールフローグループを指定する文字列。ルールフローグループで、関連するルールフローによってそのグループがアクティブになった場合に限りルールを発行できます。
例: |
|
ルールのコード表記に使用される言語を指定する文字列 (
例: |