第44章 スプレッドシートのデシジョンテーブルの定義
スプレッドシート形式のデシジョンテーブル (XLS または XLSX) には、ルールデータを定義する 2 つの重要な領域、RuleSet
領域と RuleTable
領域が必要です。RuleSet
領域では、ルールセット名、ユニバーサルルール属性など、(このスプレッドシートだけでなく) すべてのルールをパッケージ全体に、グローバルに適用する要素を定義します。RuleTable
領域では、実際のルール (行) と、指定したルールセットのルールテーブルを構成する条件、アクション、その他のルール属性 (列) を定義します。スプレッドシート形式のデシジョンテーブルには RuleTable
領域を複数追加できますが、RuleSet
領域は 1 つだけとなります。
通常は、デシジョンテーブルのスプレッドシートを 1 つだけアップロードする必要があります。これには、Business Central の 1 つのルールパッケージに必要なすべての RuleTable
定義が含まれます。異なるパッケージに複数のデシジョンテーブルのスプレッドシートをアップロードすることはできますが、同じパッケージに複数のスプレッドシートをアップロードすると、RuleSet
属性または RuleTable
属性が競合するコンパイルエラーが発生する可能性があるため、これは推奨されません。
デシジョンテーブルを定義する際は、以下のサンプルスプレッドシートを参照してください。
図44.1 配送料金のスプレッドシートデシジョンテーブル例
手順
-
新しいスプレッドシート (XLS または XLSX) の 2 列目または 3 列目 (サンプルの行 1) のセルに、
RuleSet
とラベルを付けます。左の列は、(任意で) 記述的メタデータに使用します。 -
右隣のセルに、
RuleSet
の名前を入力します。このルールセットには、ルールパッケージに定義するRuleTable
ルールがすべて含まれます。 -
RuleSet
セルの下に、そのパッケージ内のすべてのルールテーブルにグローバルに適用するルール属性 (セルごとに 1 つ) を定義します。右のセルに属性値を指定します。たとえば、ラベルをImport
にして、その右隣のセルに、その他のパッケージからデシジョンテーブルのパッケージにインポートするデータオブジェクトを指定します (形式はpackage.name.object.name
)。サポートされるセルのラベルと値については、「RuleSet の定義」 を参照してください。 -
RuleSet
セルと同じ列で、RuleSet
領域の何行か下の新しいセルに、ラベルRuleTable
を入力し (サンプルの行 7)、テーブル名も同じセルに入力します。この名前は、区別のために追加したルールの番号とともに、このルールテーブルに指定した全ルールの名前の最初の部分として使用されます。この自動命名ルールは、NAME
属性列を追加すると上書きできます。 その下の 4 行には、必要に応じて以下の要素を定義します (サンプルの行 8-11)。
- ルール属性: 条件、アクション、またはその他の属性。サポートされるセルのラベルと値については 「RuleTable の定義」 を参照してください。
- オブジェクトタイプ: ルール属性が適用されるデータオブジェクト。同じオブジェクトタイプを複数の列に適用する場合は、複数のセルでオブジェクトタイプを繰り返すのではなく、(サンプルのデシジョンテーブルに示されるように) 複数のオブジェクトセルを 1 つのセルに結合します。オブジェクトタイプを結合すると、結合範囲の下にあるすべての列が、1 つのパターンに指定する一連の制約になり、1 度に 1 つのファクトに一致するようになります。オブジェクトを別の列で繰り返し使用すると、列ごとに別のパターンを作成でき、異なるファクトや同じファクトを一致させることができます。
- 制約: オブジェクトタイプの制約。
列ラベル: (任意) 見やすくするために説明を入力する列のラベル。使用しない場合は空白にします。
注記オブジェクトタイプと制約セルの両方を追加する代わりに、オブジェクトタイプのセルを空のままにし、対応する制約セルに完全式を追加します。たとえば、オブジェクトタイプに
Order
、制約にitemsCount > $1
を (別々に) 追加する代わりに、オブジェクトタイプセルを空にして、制約セルにOrder( itemsCount > $1)
と入力できます。その他の制約セルでも同じです。
必要なルール属性 (列) をすべて定義したら、必要に応じて各列の各行に値を入力してルールを生成します (サンプルの行 12-17)。データのないセルは無視されます (条件やアクションなどが適用されません)。
デシジョンテーブルのスプレッドシートにさらにルールテーブルを追加する場合は、前のテーブルの最後の行の後に 1 行空け、前のテーブルの
RuleTable
セルとRuleSet
セルと同じ列のセルに、別のRuleTable
のラベルを付け、このセクションの手順を繰り返して新しいテーブルを作成します (サンプルの行 19-29)。- XLS または XLSX のスプレッドシートを保存して終了します。
デフォルトでは、Business Central にスプレッドシートをアップロードすると、スプレッドシートワークブックの最初のワークシートだけがデシジョンテーブルとして処理されます。RuleTable
名とともに使用する各 RuleSet
の名前は、同じパッケージの全デシジョンテーブルファイルで一意にする必要があります。
複数のワークシートを含むデシジョンテーブルを処理する場合には、スプレッドシートワークブックと同じ名前の .properties
ファイルを作成します。.properties
ファイルには、ワークシート名を CSV (コンマ区切りの値) 形式で指定したプロパティーシートを含める必要があります。以下の例を示します。
sheets=Sheet1,Sheet2
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
44.1. RuleSet の定義
デシジョンテーブルの RuleSet
領域のエントリーは、(そのスプレッドシートだけでなく) パッケージのすべてのルールに適用される DRL 制約およびルール属性を定義します。エントリーは、セルのペア (最初のセルにラベル、その右隣のセルに値) が縦方向に積み上げられます。デシジョンテーブルのスプレッドシートには、RuleSet
領域が 1 つだけあります。
以下の表は、RuleSet
定義でサポートされるラベルと値を示しています。
ラベル | 値 | 使用法 |
---|---|---|
|
生成した DRL ファイルのパッケージ名。任意。デフォルトは | 最初のエントリーになります。 |
|
| 任意。1 つまで指定可能。1 つまで指定可能。省略すると、適用順は指定されません。 |
| 整数値 | 任意。1 つまで指定可能。1 つまで指定可能。順次モードでこのオプションを使用して、優先順位の開始値を設定します。省略した場合のデフォルト値は 65535 です。 |
| 整数値 | 任意。1 つまで指定可能。順次モードでこのオプションを使用して、優先順位の最低値に違反していないかどうかを確認します。省略した場合のデフォルト値は 0 です。 |
|
| 任意。1 つまで指定可能。1 回まで指定可能。省略すると、引用符がエスケープされます。 |
|
| 任意。1 つまで指定可能。省略した場合、DRL はフォーマットされた値を取ります。 |
| 別のパッケージからインポートする、コンマ区切りの Java クラスのリスト。 | 任意。繰り返して使用可能。 |
| DRL グローバルの宣言 (型に変数名が続く)。グローバル定義が複数になる場合は、コンマで区切る必要があります。 | 任意。繰り返して使用可能。 |
| DRL 構文に準拠している 1 つまたは複数の関数定義。 | 任意。繰り返して使用可能。 |
| DRL 構文に準拠している 1 つまたは複数のクエリー定義。 | 任意。繰り返して使用可能。 |
| DRL 構文に準拠している 1 つまたは複数の宣言型。 | 任意。繰り返して使用可能。 |
| このデシジョンテーブルから生成されたルールが属するルールユニットです。 | 任意。1 つまで指定可能。省略すると、ルールはユニットに属しません。 |
|
|
任意。1 つまで指定可能。省略した場合には、 |
Microsoft Office、LibreOffice、および OpenOffice で二重引用符のエンコード方法が異なり、コンパイルエラーが発生する場合があります。たとえば、“A"
は失敗しますが、"A"
は成功します。