第4章 ガイド付きルールテンプレートの作成
ガイド付きルールテンプレートを使用して、データテーブルに定義した値に対応するプレースホルダー値 (テンプレートキー) を持つルール構造を定義できます。ガイド付きルールテンプレートは、構造が同じ多数のガイド付きルールセットを個別に定義するのに利用できる効率的な方法です。
手順
- Business Central で、Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Add Asset → Guided Rule Template をクリックします。
- 参考となる ガイド付きルールテンプレート 名を入力し、適切な パッケージ を選択します。指定するパッケージは、必要なデータオブジェクトが割り当てられている、またはこれから割り当てるパッケージにする必要があります。
OK をクリックして、ルールテンプレートを作成します。
新しいガイド付きルールテンプレートが、Project Explorer の Guided Rule Templates パネルに追加されます。
- Data Objects タブをクリックして、ルールに必要なデータオブジェクトがすべてリストされていることを確認します。リストされていない場合は、New item をクリックして、他のパッケージからデータオブジェクトをインポートするか、パッケージに データオブジェクトを作成 します。
データオブジェクトをすべて配置したら、Model タブに戻り、ウィンドウの右側のボタンから、利用可能なデータオブジェクトに、ルールテンプレートの WHEN (条件) セクションおよび THEN (アクション) セクションを追加して定義します。ルールごとに変更するフィールド値については、ルールデザイナーで
$key形式、または (DRL を使用している場合は) free form DRL の@{key}形式のテンプレートキーを使用します。図4.1 ガイド付きルールテンプレートの例
テンプレートキーに関する注記テンプレートキーは、ガイド付きルールテンプレートの基本となるものです。テンプレートキーは、同じテンプレートから異なるルールを生成するために、対応するデータテーブルで定義する実際の値と入れ替えるテンプレートのフィールド値を有効にするものです。リテラル や 式 などの値を使用することもできますが、その値は、そのテンプレートに基づいたすべてのルールのルール構造の一部となります。ただし、ルール間で異なる値については、特定のキーを使用した テンプレートキー フィールドタイプを使用します。ガイド付きルールテンプレートでテンプレートキーを使用しない場合、対応するデータテーブルはテンプレートデザイナーに生成されず、テンプレートは、個々のガイド付きルールとして機能します。
ルールテンプレートの WHEN 部分は、アクションを実行するのに必要な条件が含まれます。たとえば、電話会社が、顧客が契約したサービス内容 (インターネット、電話、およびテレビ番組) に基づいて利用代金を請求する場合、WHEN 条件の 1 つは
internetService | equal to | $hasInternetServiceとなります。テンプレートキー$hasInternetServiceは、そのテンプレートのデータテーブルに定義した実際のブール値 (trueまたはfalse) に置き換えられます。ルールテンプレートの THEN 部分には、ルールの条件部分に一致したときに実行するアクションが含まれます。たとえば、顧客がインターネットサービスだけを契約した場合、
RecurringPaymentの$amountテンプレートキーを使用した THEN アクションには、データテーブルのインターネットサービス料金に定義した整数値が実際の月額に設定されます。- ルールのコンポーネントをすべて定義したら、ガイド付きルールテンプレートデザイナーで Save をクリックして、設定した内容を保存します。
4.1. ガイド付きルールテンプレートへの WHEN 条件の追加
ルールの WHEN 部分は、アクションを実行するのに必要な条件が含まれます。たとえば、電話会社が、顧客が契約したサービス内容 (インターネット、電話、およびテレビ番組) に基づいて利用料金を請求する場合、WHEN 条件の 1 つは internetService | equal to | $hasInternetService になります。テンプレートキー $hasInternetService は、そのテンプレートのデータテーブルに定義した実際のブール値 (true または false) に置き換えられます。
前提条件
- ルールに必要なデータオブジェクトがすべて作成、またはインポートされていて、ガイド付きルールテンプレートデザイナーの Data Objects タブにリストされている。
手順
ガイド付きルールテンプレートデザイナーで、
WHENセクションの右側のプラスアイコン (
) をクリックします。
利用可能な条件要素が追加された Add a condition to the rule ウィンドウが開きます。
図4.2 ルールへの条件の追加

このリストには、ガイド付きルールテンプレートデザイナーの Data Objects タブのデータオブジェクトと、パッケージに定義した DSL オブジェクトと、以下の標準オプションが含まれます。
- The following does not exist: 存在すべきでないファクトと制約を指定します。
- The following exists: 存在すべきファクトと制約を指定します。このオプションは、最初に一致したものだけが適用され、その後一致するものは無視されます。
- Any of the following are true: true であるファクトと制約をリストします。
-
From: ルールに
From条件要素を定義します。 -
From Accumulate: ルールの
Accumulate条件要素を定義します。 -
From Collect: ルールの
Collect条件要素を定義します。 -
From Entry Point: パターンの
Entry Pointを定義します。 -
Free form DRL: free form DRL フィールドを挿入します。このフィールドには、ガイド付きルールデザイナーを使用せずに、自由に条件要素を定義できます。free form DRL のテンプレートキーには、
@{key}形式を使用します。
- 条件要素 (Customer など) を選択し、OK をクリックします。
ガイド付きルールテンプレートデザイナーで条件要素をクリックし、Modify constraints for Customer ウィンドウで、フィールドへの制限の追加、複数のフィールド制約の適用、新しい数式表現の追加、式エディターの適用、または変数名の設定を行います。
図4.3 条件の変更
注記変数名を使用すると、ガイド付きルールの別の構成でファクトまたはフィールドを指定できます。たとえば、
Customerの変数をcにし、CustomerがApplicantであることを指定する別のApplicant制約で、cを参照します。c : Customer() Applicant( this == c )
制約を選択したら、ウィンドウが自動的に閉じます。
-
追加した制約の隣にあるドロップダウンメニューから、制限の演算子 (
greater thanなど) を選択します。 -
編集アイコン (
) をクリックして、フィールド値を定義します。
-
このテンプレートに基づいたルール間で値が異なる場合は、テンプレートキー を選択し、
$key形式でテンプレートキーを追加します。これにより、フィールド値を、対応するデータテーブルに定義する実際の値と入れ替えて、同じテンプレートから異なるルールを生成します。ルールテンプレートの中で、ルール間で変更しないフィールド値については、別の型の値を使用できます。 フィールド制約を複数適用するには、条件をクリックし、Modify constraints for Customer ウィンドウで、Multiple field constraint ドロップダウンメニューから All of(And) または Any of(Or) を選択します。
図4.4 複数のフィールド制約の追加

- ガイド付きルールテンプレートデザイナーで制約をクリックして、フィールド値をさらに定義します。
- 条件要素をすべて定義したら、ガイド付きルールテンプレートデザイナーで Save をクリックして、設定した内容を保存します。
4.2. ガイド付きルールテンプレートへの THEN アクションの追加
ルールテンプレートの THEN 部分には、ルールの条件部分に一致したときに実行するアクションが含まれます。たとえば、顧客がインターネットサービスだけを契約した場合、RecurringPayment の $amount テンプレートキーを使用した THEN アクションには、データテーブルのインターネットサービス料金に定義した整数値が実際の月額に設定されます。
前提条件
- ルールに必要なデータオブジェクトがすべて作成、またはインポートされていて、ガイド付きルールテンプレートデザイナーの Data Objects タブにリストされている。
手順
ガイド付きルールテンプレートデザイナーで、
THENセクションの右側のプラスアイコン (
) をクリックします。
利用可能なアクション要素が追加された Add a new action ウィンドウが開きます。
図4.5 ルールへのアクションの追加

このリストには、ガイド付きルールテンプレートデザイナーの Data Objects タブのデータオブジェクトと、パッケージに定義した DSL オブジェクトに基づいた、挿入および修正のオプションが含まれます。
- Insert fact (ファクトの挿入): ファクトを挿入し、ファクトの結果フィールドと値を定義します。
- Logically Insert fact (ファクトの論理的な挿入): ファクトをデシジョンエンジンに論理的に挿入し、ファクトに対してフィールドと値を定義します。デシジョンエンジンは、ファクトの挿入および取り消しに対して論理的な決断を行います。定期的な挿入、または指定した挿入の後に、ファクトを明示的に取り消す必要があります。論理挿入の後に、ファクトをアサートした条件が TRUE ではなくなると、ファクトは自動的に取り消されます。
-
Add free form DRL: free form DRL フィールドを挿入します。このフィールドには、ガイド付きルールデザイナーを使用せずに、自由に条件要素を定義できます。free form DRL のテンプレートキーには、
@{key}形式を使用します。
- アクション要素 (Logically Insert fact RecurringPayment など) を選択し、OK をクリックします。
ガイド付きルールテンプレートデザイナーでアクション要素をクリックし、Add a field ウィンドウを使用してフィールドを選択します。
図4.6 フィールドの追加

フィールドを選択したら、ウィンドウが自動的に閉じます。
-
編集アイコン (
) をクリックして、フィールド値を定義します。
-
このテンプレートに基づいたルール間で値が異なる場合は、テンプレートキー を選択し、
$key形式でテンプレートキーを追加します。これにより、フィールド値を、対応するデータテーブルに定義する実際の値と入れ替えて、同じテンプレートから異なるルールを生成します。ルールテンプレートの中で、ルール間で変更しないフィールド値については、別の型の値を使用できます。 - アクション要素をすべて定義したら、ガイド付きルールテンプレートで Save をクリックして、設定した内容を保存します。
4.3. その他のルールオプションの追加
ルールデザイナーを使用してルールにメタデータを追加し、追加のルール属性 (salience、no-loop など) を定義し、条件またはアクションの変更を制限するために、ルールの領域を凍結します。
手順
- ルールデザイナーの THEN セクションの下にある (show options…) をクリックします。
-
ウィンドウの右側にあるプラスアイコン (
) をクリックして、オプションを追加します。
ルールに追加するオプションを選択します。
-
Metadata: メタデータのラベルを入力し、プラスアイコン (
) をクリックします。次に、ルールデザイナーに提供されるフィールドに必要なデータを入力します。
- Attribute: ルール属性のリストから選択します。次に、ルールデザイナーに表示されるフィールドまたはオプションに値を定義します。
Freeze areas for editing (編集する領域を制限): ルールデザイナーで修正する領域を制限する 条件 または アクション を選択します。
図4.7 ルールオプション

-
Metadata: メタデータのラベルを入力し、プラスアイコン (
- ルールデザイナーで Save をクリックして、設定した内容を保存します。
4.3.1. ルールの属性
ルール属性は、ルールの動作を修正するビジネスルールを指定する追加設定です。次の表では、ルールに割り当て可能な属性の名前と、対応する値を紹介します。
表4.1 ルールの属性
| 属性 | 値 |
|---|---|
|
|
ルールの優先順位を定義する整数。ルールの salience 値を高くすると、アクティベーションキューに追加したときの優先順位が高くなります。
例: |
|
|
ブール値。このオプションを選択すると、ルールが有効になります。このオプションを選択しないと、ルールは無効になります。
例: |
|
|
日付定義および時間定義を含む文字列。現在の日時が
例: |
|
|
日時定義を含む文字列。現在日時が
例: |
|
|
ブール値。このオプションを設定すると、以前一致した条件がこのルールにより再トリガーとなる場合に、このルールを再度アクティブにする (ループする) ことができません。条件を選択しないと、この状況でルールがループされます。
例: |
|
|
ルールを割り当てるアジェンダグループを指定する文字列。アジェンダグループを使用すると、アジェンダをパーティションで区切り、ルールのグループに対する実行をさらに制御できます。フォーカスを取得したアジェンダグループのルールだけがアクティブになります。
例: |
|
|
ルールを割り当てるアクティベーション (または XOR) グループを指定する文字列。アクティベーショングループでアクティブにできるルールは 1 つだけです。最初のルールが実行されると、アクティベーショングループの中で、アクティベーションが保留中のルールはすべてキャンセルされます。
例: |
|
|
ルールの条件が一致している場合に、ルールがアクティブになってからの時間をミリ秒で定義する長整数値。
例: |
|
|
ルールのスケジュールに対する
例: |
|
|
ルールのスケジュールを指定する Quartz カレンダーの定義。
例: |
|
|
アジェンダグループ内のルールにのみ適用可能なブール値。このオプションが選択されている場合は、次にルールがアクティブになると、そのルールが割り当てられたアジェンダグループに自動的にフォーカスが移ります。
例: |
|
|
ルールフローグループまたはアジェンダグループ内のルールにのみ適用可能なブール値。このオプションを選択すると、次回、ルールのルールフローグループがアクティブになるか、ルールのアジェンダグループがフォーカスを受け取ると、(ルールフローグループがアクティブでなくなるか、アジェンダグループがフォーカスを失うまで) ルールをアクティブにすることができません。これは、
例: |
|
|
ルールフローグループを指定する文字列。ルールフローグループで、関連するルールフローによってそのグループがアクティブになった場合に限りルールを発行できます。
例: |
|
|
ルールのコード表記に使用される言語を指定する文字列 (
例: |