第5章 スプレッドシートのデシジョンテーブルの定義

スプレッドシート形式のデシジョンテーブル (XLS または XLSX) には、ルールデータを定義する 2 つの重要な領域、RuleSet 領域と RuleTable 領域が必要です。スプレッドシートの RuleSet 領域には、ルールセット名、ユニバーサルルール属性など、(このスプレッドシートだけでなく) すべてのルールをパッケージ全体に、グローバルに適用する要素を定義します。RuleTable 領域には、実際のルール (行) と、指定したルールセットのルールテーブルを構成する条件、アクション、その他のルール属性 (列) を定義します。スプレッドシート形式のデシジョンテーブルには RuleTable 領域を複数追加できますが、RuleSet 領域は 1 つだけとなります。

重要

通常は、デシジョンテーブルのスプレッドシートを 1 つだけアップロードする必要があります。これには、Business Central の 1 つのルールパッケージに必要なすべての RuleTable 定義が含まれます。異なるパッケージに複数のデシジョンテーブルのスプレッドシートをアップロードすることはできますが、同じパッケージに複数のスプレッドシートをアップロードすると、RuleSet 属性または RuleTable 属性が競合するコンパイルエラーが発生する可能性があるため、これは推奨されません。

デシジョンテーブルを定義する際は、以下のサンプルスプレッドシートを参照してください。

図5.1 配送料金のスプレッドシートデシジョンテーブル例

Decision table example

手順

  1. 新しいスプレッドシート (XLS または XLSX) の 2 列目または 3 列目 (サンプルの行 1) のセルに、RuleSet とラベルを付けます。左の列は、(任意で) 記述的メタデータに使用します。
  2. 右隣のセルに、RuleSet の名前を入力します。このルールセットには、ルールパッケージに定義する RuleTable ルールがすべて含まれます。
  3. RuleSet セルの下に、そのパッケージ内のすべてのルールテーブルにグローバルに適用するルール属性 (セルごとに 1 つ) を定義します。右のセルに属性値を指定します。たとえば、ラベルを Import にして、その右隣のセルに、その他のパッケージからデシジョンテーブルのパッケージにインポートするデータオブジェクトを指定します (形式は package.name.object.name)。サポートされるセルのラベルと値については、「RuleSet の定義」 を参照してください。
  4. RuleSet セルと同じ列で、RuleSet 領域の何行か下の新しいセルに、ラベル RuleTable を入力し (サンプルの行 7 )、テーブル名も同じセルに入力します。この名前は、区別のために追加したルールの番号とともに、このルールテーブルに指定した全ルールの名前の最初の部分として使用されます。この自動命名ルールは、NAME 属性列を追加すると上書きできます。
  5. その下の 4 行には、必要に応じて以下の要素を定義します (サンプルの行 8-11)。

    • ルール属性: 条件、アクション、またはその他の属性。サポートされるセルのラベルと値については 「RuleTable の定義」 を参照してください。
    • オブジェクトタイプ: ルール属性が適用されるデータオブジェクト。同じオブジェクトタイプを複数の列に適用したい場合は、(サンプルのデシジョンテーブルに示されるように) 複数のオブジェクトセルを 1 つのセルに結合します。オブジェクトタイプを結合すると、結合範囲の下にあるすべての列が、1 つのパターンに指定する一連の制約になり、一度に 1 つのファクトに一致するようになります。同じオブジェクトを別の列で繰り返し使用すると、列ごとに別のパターンを作成できます。一致させるファクトは、同一にすることも別にすることもできます。
    • 制約: オブジェクトタイプの制約。
    • 列ラベル: (任意) 見やすくするために説明を入力する列のラベル。使用しない場合は空白にします。

      注記

      オブジェクトタイプと制約セルの両方を追加する代わりに、オブジェクトタイプのセルを空にし、対応する制約セルに完全式を追加します。たとえば、オブジェクトタイプに Order、制約に itemsCount > $1 を (別々に) 追加する代わりに、オブジェクトタイプセルを空にして、制約セルに Order( itemsCount > $1) と入力できます。その他の制約セルでも同じです。

  6. 必要なルール属性 (列) をすべて定義したら、必要に応じて各列の各行に値を入力してルールを生成します (サンプルの行 12-17)。データのないセルは無視されます (条件やアクションが適用されない場合など)。

    デシジョンテーブルのスプレッドシートにさらにルールテーブルを追加する場合がある場合は、前のテーブルの最後の行の後に 1 行空け、前のテーブルの RuleTable セルと RuleSet セルと同じ列のセルに、別の RuleTable のラベルを付け、このセクションの手順を繰り返して新しいテーブルを作成します (サンプルの行 19-29)。

  7. XLS または XLSX のスプレッドシートを保存して終了します。
注記

Business Central にスプレッドシートをアップロードすると、スプレッドシートワークブックの最初のワークシートだけがデシジョンテーブルとして処理されます。RuleTable とともに使用する各 RuleSet の名前は、同じパッケージの全デシジョンテーブルファイルで一意にする必要があります。

Business Central でデシジョンテーブルをアップロードすると、以下の例のように、サンプルスプレッドシートのルールが DRL ルールとして表示されます。

//row 12
rule "Basic_12"
salience 10
  when
    $order : Order( itemsCount > 0, itemsCount <= 3, deliverInDays == 1 )
  then
    insert( new Charge( 35 ) );
end
セルの値に使用するホワイトスペースの有効化

デフォルトでは、デシジョンテーブルのセルの値の前後にあるホワイトスペースのは、デシジョンエンジンがデシジョンテーブルを処理する前に削除されます。セルの値の前後に意図的にホワイトスペースのを保持するには、Red Hat Process Automation Manager のディストリビューションで drools.trimCellsInDTable システムプロパティーを false に設定します。

たとえば、Red Hat Process Automation Manager と Red Hat JBoss EAP を併用するには、以下のシステムプロパティーを $EAP_HOME/standalone/configuration/standalone-full.xml ファイルに追加してください。

<property name="drools.trimCellsInDTable" value="false"/>

Java アプリケーションに埋め込まれたデシジョンエンジンを使用する場合は、以下のコマンドでシステムプロパティーを追加してください。

java -jar yourApplication.jar -Ddrools.trimCellsInDTable=false

5.1. RuleSet の定義

デシジョンテーブルの RuleSet 領域のエントリーは、(そのスプレッドシートだけでなく) パッケージのすべてのルールに適用される DRL 制約およびルール属性を定義します。 エントリーは、セルのペア (最初のセルにラベル、その右隣のセルに値) が縦方向に積み上げられます。デシジョンテーブルのスプレッドシートには、RuleSet 領域が 1 つだけあります。

以下の表は、RuleSet 定義でサポートされるラベルと値を示しています。

表5.1 サポートされる RuleSet の定義

ラベル使用方法

RuleSet

生成した DRL ファイルのパッケージ名。任意。デフォルトは rule_tableです。

最初のエントリーになります。

Sequential

true または falsetrue の場合は、ルールを上から適用する優先順位を使用します。

任意。1 つまで指定可能。省略すると、適用順は指定されません。

SequentialMaxPriority

整数値

任意。1 つまで指定可能。順次モードでこのオプションを使用して、優先順位の開始値を設定します。省略した場合のデフォルト値は 65535 です。

SequentialMinPriority

整数値

任意。1 つまで指定可能。順次モードでこのオプションを使用して、優先順位の最低値に違反していないかどうかを確認します。省略した場合のデフォルト値は 0 です。

EscapeQuotes

true または falsetrue の場合は、引用符がエスケープされ、DRL にそのまま表示されます。

任意。1 回まで指定可能。省略すると、引用符がエスケープされます。

Import

別のパッケージからインポートする、コンマ区切りの Java クラスのリスト。

任意。繰り返して使用可能。

Variables

DRL グローバルの宣言 (型に変数名が続く)。グローバル定義が複数になる場合は、コンマで区切る必要があります。

任意。繰り返して使用可能。

Functions

DRL 構文に準拠している 1 つまたは複数の関数定義。

任意。繰り返して使用可能。

Queries

DRL 構文に準拠している 1 つまたは複数のクエリー定義。

任意。繰り返して使用可能。

Declare

DRL 構文に準拠している 1 つまたは複数の宣言型。

任意。繰り返して使用可能。

警告

Microsoft Office、LibreOffice、および OpenOffice で二重引用符のエンコード方法が異なり、コンパイルエラーが発生する場合があります。たとえば、“A” は失敗しますが、"A" は成功します。

5.2. RuleTable の定義

デシジョンテーブルの RuleTable 領域のエントリーは、そのルールテーブルのルールに対する条件、アクション、その他のルール属性を定義します。デシジョンテーブルのスプレッドシートには、RuleTable 領域を複数追加できます。

以下の表は、RuleTable 定義でサポートされるラベル (列ヘッダー) および値を示しています。列ヘッダーには、指定のラベル、またはこの表に記載されている文字で始まるカスタムラベルのいずれかを使用できます。

表5.2 サポートされる RuleTable の定義

ラベルカスタムラベルの頭文字使用方法

NAME

N

その行で生成したルールの名前を提供します。デフォルトは、RuleTable タグと行番号に続くテキストから作成されます。

最大 1 列。

DESCRIPTION

I

生成したルールのコメントになります。

最大 1 列。

CONDITION

C

条件内のパターンに制約を構築するコードスニペットおよび補間値。

ルールテーブルごとに最低 1 つ。

ACTION

A

ルールの結果に対するアクションを構築するコードスニペットおよび補間値。

ルールテーブルごとに最低 1 つ。

METADATA

@

ルールに対するメタデータエントリーを構築するコードスニペットおよび補間値。

任意。列の数。

以下のセクションでは、条件、アクション、メタデータのセルデータがどのように使用されるかについて説明します。

条件

CONDITION ヘッダーの列では、連続した行のセルが、条件要素になります。

  • 1 つ下のセル: CONDITION のすぐ下のセルのテキストは、ルール条件のパターンを進化させ、次の行のスニペットを制約として使用します。そのセルを、隣接した 1 つ以上のセルと結合した場合は、複数の制約を持った 1 つのパターンが作成されます。すべての制約が結合して括弧で囲まれ、このセルのテキストに追加されます。

    このセルを空にすると、以下のセルのコードスニペットが自動的に有効な条件要素となります。たとえば、オブジェクトタイプに Order、制約に itemsCount > $1 を (別々に) 追加する代わりに、オブジェクトタイプセルを空にして、制約セルに Order( itemsCount > $1) と入力できます。その他の制約セルでも同じです。

    パターンのテキストの前に別のパターンを記述すれば、制約を使用しないパターンを追加できます。中が空の括弧は追加することも省くこともできます。パターンに from 句を追加することもできます。

    パターンを eval で終了すると、コードスニペットが、eval の後の括弧の中にブール表現を生成します。

  • 2 つ下のセル: CONDITION の 2 つ下のセルのテキストは、1 つ下のセルのオブジェクト参照の制約として処理されます。このセルのコードスニペットは、その列のさらに下にあるセルから値が補間されます。下のセルからの値と == を使用した比較で構成される制約を作成する場合は、フィールドセレクターだけで十分です。その他の比較演算子は、スニペットの最後に指定する必要があり、値は下のセルから追加されます。その他のすべての制約形式については、$param シンボルを使用して、セルの内容を追加する場所を指定する必要があります。$1$2 などのシンボルを使用し、下のセルにコンマで区切った値を指定すれば、複数の値を挿入することもできます。ただし、$1$2 などをコンマで区切らないでください。テーブルの処理に失敗します。

    パターン forall($delimiter){$snippet} に従ってテキストを展開する場合は、その下の各セルで、コンマ区切りの値に対して $snippet がそれぞれ 1 回ずつ使用されます。$ シンボルの場所に値が挿入され、指定した $delimiter で結合します。forall 構文は、他のテキストで囲むことができることに注意してください。

    1 つ下のセルにオブジェクトが含まれている場合は、そのセルから条件要素に完全なコードスニペットが追加されます。括弧のペアと、(結合したセルのパターンに複数の制約が追加されている場合は) 区切り文字のコンマが自動的に提供されます。1 つ下のセルが空の場合は、このセルのコードスニペットが自動的に有効な条件要素となります。たとえば、オブジェクトタイプに Order、制約に itemsCount > $1 を (別々に) 追加する代わりに、オブジェクトタイプのセルを空にして、制約セルに Order( itemsCount > $1) と入力できます。その他の制約セルでも同じです。

  • 3 つ下のセル: CONDITION の 3 つ下のセルのテキストは、見やすくするためにその列の説明を入力するラベルです。
  • 4 つ下のセル: 4 行目以降の、空セル以外のエントリーは補間データとして提供されます。セルが空の場合は、このルールで制約や条件が省略されます。
アクション

ACTION ヘッダーの列では、連続した行のセルが、アクション命令文になります。

  • 1 つ下のセル: ACTION ヘッダーの 1 つ下のセルのテキストは任意です。テキストがある場合は、オブジェクト参照として解釈されます。
  • 2 つ下のセル: ACTION の 2 つ下のセルのテキストは、その列のさらに下にあるセルの値が補完されるコードスニペットです。挿入が 1 つの場合は、$param シンボルを使用して、セルの内容を追加する場所を指定します。$1$2 などのシンボルを使用し、下のセルにコンマで区切った値を指定すれば、複数の値を挿入することもできます。$1$2 などをコンマで区切らないでください。テーブルの処理に失敗します。

    テキストにマーカーシンボルがない場合は、補完なしでメソッドが呼び出されます。このとき、下の行で空セル以外のエントリーを使用して、命令文を追加します。forall 構文がサポートされます。

    1 つ下のセルにオブジェクトが含まれている場合は、そのセルのテキスト、ピリオド、2 つ下のセルのテキスト、終わりを示すセミコロンが 1 列に並べられ、アクション命令文として追加されるメソッドコールとなります。1 つ下のセルが空の場合は、このセルのコードスニペットが自動的に有効なアクション要素となります。

  • 3 つ下のセル: ACTION の 3 つ下のセルのテキストは、見やすくするためにその列の説明を入力するラベルです。
  • 4 つ下のセル: 4 行目以降の、空セル以外のエントリーは補間データとして提供されます。セルが空の場合は、このルールで制約や条件が省略されます。
メタデータ

ヘッダーが METADATA の列では、連続した行のセルが、生成されるルールのメタデータアノテーションになります。

  • 1 つ下のセル: METADATA の 1 つ下のセルのテキストは無視されます。
  • 2 つ下のセル: METADATA の 2 つ下のセルのテキストは、ルール行のセルの値を使用して補完されます。メタデータのマーカー文字 @ が接頭辞として自動的に追加されるため、このセルのテキストに追加する必要はありません。
  • 3 つ下のセル: METADATA の 3 つ下のセルのテキストは、見やすくするためにその列の説明を入力するラベルです。
  • 4 つ下のセル: 4 行目以降の、空セル以外のエントリーは補完データとして提供されます。セルが空の場合は、このルールでメタデータアノテーションが省略されます。

5.3. RuleSet 定義または RuleTable 定義におけるその他のルール属性

RuleSet 領域および RuleTable 領域は、PRIORITYNO-LOOP などのラベルおよび値もサポートします。RuleSet 領域に指定したルール属性は、(そのスプレッドシートだけでなく) 同じパッケージにあるすべてのルールアセットに影響します。RuleTable 領域に指定したルール属性は、そのルールテーブル内のルールにのみ影響します。各ルール属性は、RuleSet 領域で一度、RuleTable 領域で一度使用できます。同じ属性を、スプレッドシートの RuleSet 領域および RuleTable 領域の両方で使用した場合は、RuleTable が優先され、RuleSet 領域の属性が上書きされます。

以下の表は、その他の RuleSet 定義または RuleTable 定義でサポートされるラベル (列ヘッダー) および値を示します。列ヘッダーには、指定のラベル、またはこの表に記載されている文字で始まるカスタムラベルのいずれかを使用できます。

表5.3 RuleSet 定義または RuleTable 定義におけるその他のルール属性

ラベルカスタムラベルの頭文字

PRIORITY

P

ルールの優先順位 (salience) の値を定義する整数。優先順位の値が高くなると、アクティベーションキューに追加された時の優先順位が高くなります。これは、Sequential フラグで上書きされます。

例: PRIORITY 10

DATE-EFFECTIVE

V

日付定義および時間定義を含む文字列。現在の日時が DATE-EFFECTIVE 属性よりも後の場合は、このルールがアクティブになります。

例: DATE-EFFECTIVE "4-Sep-2018"

DATE-EXPIRES

Z

日時定義を含む文字列。現在日時が DATE-EXPIRES 属性よりも後になると、このルールをアクティブにすることはできません。

例: DATE-EXPIRES "4-Oct-2018"

NO-LOOP

U

ブール値。このオプションを true に設定すると、以前一致した条件がこのルールにより再トリガーとなる場合に、このルールを再度アクティブにする (ループする) ことができません 。

例: NO-LOOP true

AGENDA-GROUP

G

ルールを割り当てるアジェンダグループを指定する文字列。アジェンダグループを使用すると、アジェンダをパーティションで区切り、ルールのグループに対する実行をさらに制御できます。フォーカスを取得したアジェンダグループのルールだけがアクティブになります。

例: AGENDA-GROUP "GroupName"

ACTIVATION-GROUP

ルールを割り当てるアクティベーション (または XOR) グループを指定する文字列。アクティベーショングループでアクティブにできるルールは 1 つだけです。最初のルールが実行されると、アクティベーショングループの中で、アクティベーションが保留中のルールはすべてキャンセルされます。

例: ACTIVATION-GROUP "GroupName"

DURATION

D

ルールの条件が一致している場合に、ルールがアクティブになってからの時間をミリ秒で定義する長整数値。

例: DURATION 10000

TIMER

T

ルールのスケジュールに対する int (間隔) または cron タイマー定義を指定する文字列。

例: TIMER "*/5 * * * *" (5 分ごと)

CALENDAR

E

ルールのスケジュールを指定する Quartz カレンダーの定義。

例: CALENDAR "* * 0-7,18-23 ? * *" (営業時間外を除く)

AUTO-FOCUS

F

アジェンダグループ内のルールにのみ適用可能なブール値。このオプションが true に設定されている場合は、次にルールがアクティブになったときに、そのルールが割り当てられたアジェンダグループにフォーカスが自動的に指定されます。

例: AUTO-FOCUS true

LOCK-ON-ACTIVE

L

ルールフローグループまたはアジェンダグループ内のルールにのみ適用可能なブール値。このオプションを true に設定すると、次回、ルールのルールフローグループがアクティブになるか、ルールのアジェンダグループがフォーカスを受けると、(ルールフローグループがアクティブでなくなるか、アジェンダグループがフォーカスを失うまで) ルールをアクティブにすることができません。これは、no-loop 属性を強力にしたものです。なぜなら、一致するルールのアクティベーションが、(ルールそのものによるものだけでなく) アップデート元にかかわらず破棄されるためです。この属性は、ファクトを修正するルールが多数あり、ルールの再一致と再発行を希望しない計算ルールに適しています。

例: LOCK-ON-ACTIVE true

RULEFLOW-GROUP

R

ルールフローグループを指定する文字列。ルールフローグループで、関連するルールフローによってそのグループがアクティブになった場合に限りルールを発行できます。

例: RULEFLOW-GROUP "GroupName"

図5.2 属性列が含まれるデシジョンテーブルのサンプルスプレッドシート

Example decision table with definitions used