第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 度に 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 Decision Manager のディストリビューションで drools.trimCellsInDTable システムプロパティーを false に設定します。

たとえば、Red Hat Decision 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 つまで指定可能。1 つまで指定可能。省略すると、適用順は指定されません。

SequentialMaxPriority

整数値

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

SequentialMinPriority

整数値

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

EscapeQuotes

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

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

Import

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

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

Variables

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

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

関数

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

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

Queries

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

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

Declare

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

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

警告

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