6.2. OpenRules で AND/ORを含む条件を定義したルールを作成する¶
OpenRules で複雑な条件の1つとして、AND(条件○○と条件△△の両方を満たす場合)やOR(条件○○、または条件△△のどちらかを満たす場合)は、セルの結合などを利用して表現します。このハンズオンでは、出張旅費精算フローをサンプルに、ANDやORを組み合わせた条件の記述方法を確認することができます。また、 OpenRules のルール定義のファイルでは、 項目を論理名で扱うことができますが、 IM-BIS のセレクトボックスなどの画面アイテムでは、 OpenRules に受け渡す値は半角英数字にする必要があるため、セレクトボックスなどの値を扱う場合には、ルール定義ファイルで表示値・送信値のマッピングを行わなければなりません。このハンズオンでは、そのようなアイテムの一種として、ラジオボタンの値を扱う場合のマッピング方法も同時に確認していきます。
ルールを定義するExcelファイルを作成する手順
このシナリオで作成するルールの概要¶
作成するルールの内容
OpenRules で AND/OR条件を表現する方法¶
このハンズオンを開始する前に、 OpenRules で、AND/ORを利用した条件を表現する方法を確認しましょう。AND/ORを伴う条件の記述方法には、以下の方法があります。
1つの項目に対してのOR条件(いずれかと一致する)¶
2つ以上の項目に対してのAND/OR条件(両方の条件と一致する、いずれかの条件と一致する)¶
2つ以上の項目を組み合わせたAND/OR条件は、 DecisionTable での行やセルの結合によって表現することができます。
- 「AND条件」は、 DecisionTable の同じ行に異なる項目に対する条件の基準値を記述することで表現することができます。
- 「OR条件」は、 DecisionTable の対象の複数の条件の評価(結果)のセルを結合することで表現することができます。
以下は、「製品○○の売上額」と「製品△△の売上額」に基づいて営業成績を評価する例です。
ルールのExcelファイルを作成する手順¶
今回は、 OpenRules のテンプレート の「汎用テンプレート」を変更しながらルール定義のExcelファイルを作成します。このシナリオでは、以下の図の流れで作成していきます。
旅費精算の日当計算のハンズオンを開始するための準備¶
汎用テンプレートの編集を開始する¶
このハンズオンでは、ダウンロードの章で公開しているテンプレートを変更しながら、 OpenRules で動的処理者設定を定義していきます。まずは、テンプレートファイルを入手しましょう。
OpenRules のテンプレート から「汎用テンプレート」をダウンロードしてください。 ファイルを別名で保存した後に、ファイルの編集を開始します。
日当を計算するための DecisionTable を作成する¶
DecisionTable の項目を設定する¶
最初に場所(国内・国外)と出張区分(日帰り・宿泊)から日当を計算する DecisionTable を作成しましょう。
編集中のExcelファイルの「DecisionTable」シートを表示します。 テンプレートには、説明が添付されていますので、削除します。 DecisionTable のテーブル名を「setDailyAllowance」に変更し、サブヘッダの項目の論理名をそれぞれ「場所」「出張区分」「日当」に変更します。 これで、 DecisionTable の項目が設定できましたので、各行に条件と評価を入力していきましょう。
DecisionTable の条件・評価を設定する¶
先の手順で設定した DecisionTable に条件と評価(結果)を設定していきましょう。
まずは、場所が「国内」、出張区分が「日帰り」の条件と日当「1,000円」を設定します。以下のように、1行目の条件・評価を入力します。 続いて、場所区分が「国内」、出張区分が「宿泊」の条件と日当「2,000円」を設定します。以下のように、2行目の条件・評価を入力します。 場所区分が「国外」、出張区分が「日帰り」の条件と日当「2,000円」を設定します。以下のように、3行目の条件・評価を入力します。 場所区分が「国外」、出張区分が「宿泊」の条件と日当「3,000円」を設定します。以下のように、4行目の条件・評価を入力します。 5行目については、不要な行となりますので、右クリックで削除します。 作成した DecisionTable を確認すると、結果に「日当」の「2,000円」が2回登場しており、対応する条件2つのどちらかを満たす、つまりOR条件になっています。OpenRules では、OR条件を表すためには、セルを結合して表現しますので、この日当の演算子・値のセルを結合します。 これで、日当を計算する DecisionTable が完成しましたので、一度ファイルを保存しましょう。
OpenRules でアイテムの送信値・表示値のマッピングを設定する¶
先の手順で DecisionTable では、申請画面で入力された「場所」や「出張区分」の値に基づいて、日当を計算するように作成しました。後の手順で IM-BIS と連携する場合の画面(フォーム)では、これらの項目は「ラジオボタン」となっており、 OpenRules に受け渡す値(送信値)は半角英数字のコードで設定されています。このまま OpenRules と IM-BIS を連携すると、コードと名前をそれぞれ異なる文字列の値と判断され、 OpenRules で正しく評価することができません。そのため、 OpenRules の定義内で表示値・送信値のマッピングを行う DecisionTable を設定し、事前に送信値を表示値に変換する処理を行ってから評価を行うようにし、正しく評価を行うための DecisionTable を作成します。おおまかには、以下の図のように項目単位で表示値・送信値をマッピングする DecisionTable をまとめていきます。
場所のマッピング DecisionTable を作成する¶
マッピングが必要な項目「場所」に対応するマッピングの DecisionTable を作成しましょう。
編集したExcelファイルを開きます。 「DecisionTable」シートを表示します。 先に作成した DecisionTable をコピーして、貼り付けます。 マッピングの DecisionTable には、条件にする送信値と評価(結果)の表示値で構成すればよいため、中央の2列分(1項目分)を削除します。 コピーした DecisionTable は、ラジオボタンの値の個数にあわせて、明細を2行にします。 DecisionTable の名前に「convertArea」と入力します。 DecisionTable のサブヘッダの項目名には、「場所コード」「場所」と入力します。 DecisionTable の明細には、場所のラジオボタンの表示値・送信値を入力しましょう。 これで場所のマッピング DecisionTable が作成できましたので、引き続き出張区分を作成していきましょう。
出張区分のマッピング DecisionTable を作成する¶
同じようにしてマッピングが必要な項目「出張区分」に対応するマッピングの DecisionTable を作成しましょう。
新しい DecisionTable を作成するために先の手順で作成した場所の DecisionTable をコピーし、数行空けて貼り付けます。 貼り付けて新たに作成した DecisionTable の名前に「convertTripClass」と入力します。 DecisionTable のサブヘッダの項目名には、「出張区分コード」「出張区分」と入力します。 DecisionTable の明細には、出張区分のラジオボタンの表示値・送信値を入力しましょう。 これで、表示値と送信値を OpenRules でマッピングする表ができました。
OpenRules で実行する DecisionTable の順序をコントロールする¶
Decision を作成する¶
ルールのコントロールを行う Decision を作成しましょう。
編集したExcelファイルを開きます。 「Main」シートを表示します。 Decision を表示します。( DecisionTable を作成した時と同様に、シート上のコメントは不要であれば削除します。) Decision の名前に「sampleDailyAllowance」と入力します。 テンプレートの設定は、1つの DecisionTable を実行するための設定になっているため、3つの DecisionTable を実行できるように間に2行追加します。 最初に場所の DecisionTable を実行するための設定を行います。「評価の実行」と設定されている行の内容を削除し、以下のように入力します。 次に出張区分の DecisionTable を実行するための設定を行います。次の行に、以下のように入力します。 最後に日当計算の DecisionTable を実行するための設定を行います。残っている行に、以下のように入力します。 ここまでで、 DecisionTable の実行順を Decision で設定することができました。Excelファイルを保存し、次の手順に進みましょう。
実行に必要な定義を設定する¶
ルールの中心となる Decision 、 DecisionTable が完成しましたので、実行に必要なその他の定義を設定していきましょう。
Glossary に利用する項目を定義する¶
DecisionTable で使っている項目を確認しながら、 Glossary を定義していきましょう。
編集中のExcelファイルの「Definition」シートを表示しましょう。 このシートの Glossary を表示します。( DecisionTable を作成した時と同様に、シート上のコメントは不要であれば削除します。) 今回のハンズオンの DecisionTable で扱っている項目を確認すると、以下の5つがあります。
- 場所コード
- 出張区分コード
- 場所
- 出張区分
- 日当
このうち、画面(フォーム)から受け渡される項目を「RequestObject」の項目として定義します。 続いて、画面(フォーム)に返却する項目を「ResponseObject」として定義します。この時、 OpenRules のルールでは、Stringやユーザ定義の型を最初の項目とする必要があるため、ダミーのString型の項目も定義します。Glossary には、以下のように定義します。
Variable
BusinessConcept
Attribute
ダミー
ResponseObject
dummy
日当
dailyAllowance
コラム
OpenRules では、定義するオブジェクトの最初の項目に対するデータ型に制約があるため、ダミー項目を設定しています。ここでダミーとして定義した項目は、Excelのルール定義ファイルとして必要となるのみであり、 IM-BIS のデータソース定義への設定は不要です。詳細は、 Datatype を参照してください。 ここまでで入力項目・出力項目のオブジェクトを定義しましたが、 DecisionTable で扱っている項目のうち、どちらにも属さない項目は内部項目のオブジェクト(Internal)として定義します。この時点で定義していない「場所区分」「出張区分」について、以下のように定義します。
Glossary に基づいて Datatype と Data/Variable を定義する¶
同じ「Definition」シートのRequestObjectの Datatype と Data/Variable を以下のように定義します。
Datatype RequestObject
String
areaClassCode
String
tripClassCode
Data RequestObject requestObj
areaClassCode
tripClassCode
場所コード
出張区分コード
テスト場所
テスト出張区分
ResponseObjectの Datatype と Data/Variable を以下のように定義します。
Datatype ResponseObject
String
dummy
int
dailyAllowance
Data ResponseObject responseObj
dummy
dailyAllowance
ダミー
日当
ダミー内容
0
同様にInternalの Datatype と Data/Variable を定義するために、先に作成したRequestObjectの定義をコピーします。 コピーした定義を以下のように変更します。
Datatype Internal
String
area
String
tripClass
Data Internal internal
area
tripClass
場所
出張区分
テスト場所
テスト出張区分
これで Datatype と Data/Variable が定義できましたので、一度保存します。
DecisionObject を定義してルールを完成させる¶
最後に DecisionObject を定義して、Excelのルール定義ファイルを完成させましょう。
「Main」シートを表示しましょう。 「Main」シートで DecisionObject を設定していきます。入力項目、出力項目のオブジェクトについては、テンプレートと同じ設定となっているため、その下に内部項目のオブジェクト用に1行追加します。 追加した行には、以下のように設定しましょう。
DecisionObject decisionObjects
Business Concept
Business Object
Internal
:= internal[0]
コラム
このハンズオンのように、処理用のオブジェクト等を定義した場合には、 DecisionObject でインスタンス化の処理を設定します。
これで、 OpenRules で日当を計算するExcelのルール定義ファイルの設定が完了しましたので、ファイルを保存します。IM-BIS の画面(フォーム)と連携するための設定を行っていきましょう。