IM-BIS for Accel Platform / OpenRules for IM-BIS 連携ガイド 第2版 2015-08-01

6.2. OpenRules で AND/ORを含む条件を定義したルールを作成する

OpenRules で複雑な条件の1つとして、AND(条件○○と条件△△の両方を満たす場合)やOR(条件○○、または条件△△のどちらかを満たす場合)は、セルの結合などを利用して表現します。
このハンズオンでは、出張旅費精算フローをサンプルに、ANDやORを組み合わせた条件の記述方法を確認することができます。
また、 OpenRules のルール定義のファイルでは、 項目を論理名で扱うことができますが、 IM-BIS のセレクトボックスなどの画面アイテムでは、 OpenRules に受け渡す値は半角英数字にする必要があるため、セレクトボックスなどの値を扱う場合には、ルール定義ファイルで表示値・送信値のマッピングを行わなければなりません。
このハンズオンでは、そのようなアイテムの一種として、ラジオボタンの値を扱う場合のマッピング方法も同時に確認していきます。

このシナリオで作成するルールの概要

  • 作成するルールの内容

    1. 画面(フォーム)から受け渡されたラジオボタンの送信値を表示値に変換した上で、条件を評価する
    2. 出張旅費精算申請の「場所区分」「出張区分」に応じて、日当金額を設定する
      • 入力値:場所区分、出張区分
      • 出力値:日当
    条件と返却する日当の金額の組み合わせは、以下の通りです。
    ../../_images/decisiontable.png
    • 場所区分が「国内」かつ出張区分が「日帰り」の場合、日当は1,000円

    • 場所区分が「国内」かつ出張区分が「宿泊」の場合、
      もしくは、場所区分が「国外」かつ出張区分が「日帰り」の場合、日当は2,000円
    • 場所区分が「国外」かつ出張区分が「宿泊」の場合、日当は3,000円

OpenRules で AND/OR条件を表現する方法

このハンズオンを開始する前に、 OpenRules で、AND/ORを利用した条件を表現する方法を確認しましょう。
AND/ORを伴う条件の記述方法には、以下の方法があります。

1つの項目に対してのOR条件(いずれかと一致する)

1つの項目のとりうる値を「OR条件」(いずれかと一致する)を表現するには、演算子の「Is One Of」を利用することができます。
以下は、都道府県から地方名を判断するために「Is One Of」を使った例です。
../../_images/ex_isoneof.png

2つ以上の項目に対してのAND/OR条件(両方の条件と一致する、いずれかの条件と一致する)

2つ以上の項目を組み合わせたAND/OR条件は、 DecisionTable での行やセルの結合によって表現することができます。
  • 「AND条件」は、 DecisionTable の同じ行に異なる項目に対する条件の基準値を記述することで表現することができます。
  • 「OR条件」は、 DecisionTable の対象の複数の条件の評価(結果)のセルを結合することで表現することができます。
以下は、「製品○○の売上額」と「製品△△の売上額」に基づいて営業成績を評価する例です。
../../_images/ex_andor.png

ルールのExcelファイルを作成する手順

今回は、 OpenRules のテンプレート の「汎用テンプレート」を変更しながらルール定義のExcelファイルを作成します。
このシナリオでは、以下の図の流れで作成していきます。
../../_images/procedure2.png

旅費精算の日当計算のハンズオンを開始するための準備

汎用テンプレートの編集を開始する

このハンズオンでは、ダウンロードの章で公開しているテンプレートを変更しながら、 OpenRules で動的処理者設定を定義していきます。
まずは、テンプレートファイルを入手しましょう。
  1. OpenRules のテンプレート から「汎用テンプレート」をダウンロードしてください。
  2. ファイルを別名で保存した後に、ファイルの編集を開始します。

日当を計算するための DecisionTable を作成する

最初に、申請書に入力された「出張区分」と「場所区分」に基づいて日当を計算する DecisionTable を作成しましょう。
おおまかには、以下の図のようにExcel上にまとめます。
../../_images/excel_dt1.png

DecisionTable の項目を設定する

最初に場所(国内・国外)と出張区分(日帰り・宿泊)から日当を計算する DecisionTable を作成しましょう。
  1. 編集中のExcelファイルの「DecisionTable」シートを表示します。
    ../../_images/excel_dt_1_1.png
  2. テンプレートには、説明が添付されていますので、削除します。
    ../../_images/excel_dt_1_2.png
  3. 今回作成する DecisionTable は、Condition が2項目、 Conclusion が1項目となるため、テンプレートの「料金」の列を右クリックして削除します。
    ../../_images/excel_dt_1_3.png
  4. DecisionTable のテーブル名を「setDailyAllowance」に変更し、サブヘッダの項目の論理名をそれぞれ「場所」「出張区分」「日当」に変更します。
    ../../_images/excel_dt_1_4.png
  5. これで、 DecisionTable の項目が設定できましたので、各行に条件と評価を入力していきましょう。

DecisionTable の条件・評価を設定する

先の手順で設定した DecisionTable に条件と評価(結果)を設定していきましょう。
  1. まずは、場所が「国内」、出張区分が「日帰り」の条件と日当「1,000円」を設定します。
    以下のように、1行目の条件・評価を入力します。
    ../../_images/excel_dt_1_5.png
  2. 続いて、場所区分が「国内」、出張区分が「宿泊」の条件と日当「2,000円」を設定します。
    以下のように、2行目の条件・評価を入力します。
    ../../_images/excel_dt_1_6.png
  3. 場所区分が「国外」、出張区分が「日帰り」の条件と日当「2,000円」を設定します。
    以下のように、3行目の条件・評価を入力します。
    ../../_images/excel_dt_1_7.png
  4. 場所区分が「国外」、出張区分が「宿泊」の条件と日当「3,000円」を設定します。
    以下のように、4行目の条件・評価を入力します。
    ../../_images/excel_dt_1_8.png
  5. 5行目については、不要な行となりますので、右クリックで削除します。
    ../../_images/excel_dt_1_9.png
  6. 作成した DecisionTable を確認すると、結果に「日当」の「2,000円」が2回登場しており、対応する条件2つのどちらかを満たす、つまりOR条件になっています。
    OpenRules では、OR条件を表すためには、セルを結合して表現しますので、この日当の演算子・値のセルを結合します。
    ../../_images/excel_dt_1_10.png
  7. これで、日当を計算する DecisionTable が完成しましたので、一度ファイルを保存しましょう。

OpenRules でアイテムの送信値・表示値のマッピングを設定する

先の手順で DecisionTable では、申請画面で入力された「場所」や「出張区分」の値に基づいて、日当を計算するように作成しました。
後の手順で IM-BIS と連携する場合の画面(フォーム)では、これらの項目は「ラジオボタン」となっており、 OpenRules に受け渡す値(送信値)は半角英数字のコードで設定されています。
../../_images/app_form.png
このまま OpenRules と IM-BIS を連携すると、コードと名前をそれぞれ異なる文字列の値と判断され、 OpenRules で正しく評価することができません。
そのため、 OpenRules の定義内で表示値・送信値のマッピングを行う DecisionTable を設定し、事前に送信値を表示値に変換する処理を行ってから評価を行うようにし、正しく評価を行うための DecisionTable を作成します。
おおまかには、以下の図のように項目単位で表示値・送信値をマッピングする DecisionTable をまとめていきます。
../../_images/excel_dt_mapping.png

場所のマッピング DecisionTable を作成する

マッピングが必要な項目「場所」に対応するマッピングの DecisionTable を作成しましょう。
  1. 編集したExcelファイルを開きます。
  2. 「DecisionTable」シートを表示します。
  3. 先に作成した DecisionTable をコピーして、貼り付けます。
    ../../_images/excel_dt_2_1.png
  4. マッピングの DecisionTable には、条件にする送信値と評価(結果)の表示値で構成すればよいため、中央の2列分(1項目分)を削除します。
    ../../_images/excel_dt_2_2.png
  5. コピーした DecisionTable は、ラジオボタンの値の個数にあわせて、明細を2行にします。
    ../../_images/excel_dt_2_3.png
  6. DecisionTable の名前に「convertArea」と入力します。
    ../../_images/excel_dt_2_4.png
  7. DecisionTable のサブヘッダの項目名には、「場所コード」「場所」と入力します。
    ../../_images/excel_dt_2_5.png
  8. DecisionTable の明細には、場所のラジオボタンの表示値・送信値を入力しましょう。
    ../../_images/excel_dt_2_6.png

    場所コード

    場所

    domestic

    国内

    overseas

    国外

  9. これで場所のマッピング DecisionTable が作成できましたので、引き続き出張区分を作成していきましょう。

出張区分のマッピング DecisionTable を作成する

同じようにしてマッピングが必要な項目「出張区分」に対応するマッピングの DecisionTable を作成しましょう。
  1. 新しい DecisionTable を作成するために先の手順で作成した場所の DecisionTable をコピーし、数行空けて貼り付けます。
    ../../_images/excel_dt_2_7.png
  2. 貼り付けて新たに作成した DecisionTable の名前に「convertTripClass」と入力します。
    ../../_images/excel_dt_2_8.png
  3. DecisionTable のサブヘッダの項目名には、「出張区分コード」「出張区分」と入力します。
    ../../_images/excel_dt_2_9.png
  4. DecisionTable の明細には、出張区分のラジオボタンの表示値・送信値を入力しましょう。
    ../../_images/excel_dt_2_10.png

    出張区分コード

    出張区分

    lodgment

    宿泊

    single-day

    日帰り

  5. これで、表示値と送信値を OpenRules でマッピングする表ができました。

OpenRules で実行する DecisionTable の順序をコントロールする

ここまでの手順で、場所区分・出張区分のマッピング、日当の計算で3つの DecisionTable を作成しました。
次の手順では、マッピングの DecisionTable 、日当の計算の DecisionTable の順に実行されるようにコントロールするための Decision を設定します。
おおまかには、以下の図のように Decision をまとめていきます。
../../_images/decision.png

Decision を作成する

ルールのコントロールを行う Decision を作成しましょう。
  1. 編集したExcelファイルを開きます。
  2. 「Main」シートを表示します。
    ../../_images/excel_decision_13.png
  3. Decision を表示します。
    DecisionTable を作成した時と同様に、シート上のコメントは不要であれば削除します。)
    ../../_images/excel_decision_21.png
  4. Decision の名前に「sampleDailyAllowance」と入力します。
    ../../_images/excel_decision_31.png
  5. テンプレートの設定は、1つの DecisionTable を実行するための設定になっているため、3つの DecisionTable を実行できるように間に2行追加します。
    ../../_images/excel_decision_41.png
  6. 最初に場所の DecisionTable を実行するための設定を行います。
    「評価の実行」と設定されている行の内容を削除し、以下のように入力します。

    ActionPrint

    ActionExecute

    場所の変換

    convertArea

    ../../_images/excel_decision_51.png
  7. 次に出張区分の DecisionTable を実行するための設定を行います。
    次の行に、以下のように入力します。

    ActionPrint

    ActionExecute

    出張区分の変換

    convertTripClass

    ../../_images/excel_decision_61.png
  8. 最後に日当計算の DecisionTable を実行するための設定を行います。
    残っている行に、以下のように入力します。

    ActionPrint

    ActionExecute

    日当の計算

    setDailyAllowance

    ../../_images/excel_decision_71.png
  9. ここまでで、 DecisionTable の実行順を Decision で設定することができました。
    Excelファイルを保存し、次の手順に進みましょう。

実行に必要な定義を設定する

ルールの中心となる DecisionDecisionTable が完成しましたので、実行に必要なその他の定義を設定していきましょう。

Glossary に利用する項目を定義する

DecisionTable で使っている項目を確認しながら、 Glossary を定義していきましょう。
  1. 編集中のExcelファイルの「Definition」シートを表示しましょう。
    ../../_images/excel_glossary_1.png
  2. このシートの Glossary を表示します。
    DecisionTable を作成した時と同様に、シート上のコメントは不要であれば削除します。)
    ../../_images/excel_glossary_2.png
  3. 今回のハンズオンの DecisionTable で扱っている項目を確認すると、以下の5つがあります。
    • 場所コード
    • 出張区分コード
    • 場所
    • 出張区分
    • 日当
    このうち、画面(フォーム)から受け渡される項目を「RequestObject」の項目として定義します。

    Variable

    BusinessConcept

    Attribute

    場所コード

    RequestObject

    areaClassCode

    出張区分コード

    tripClassCode

    ../../_images/excel_glossary_3.png
  4. 続いて、画面(フォーム)に返却する項目を「ResponseObject」として定義します。
    この時、 OpenRules のルールでは、Stringやユーザ定義の型を最初の項目とする必要があるため、ダミーのString型の項目も定義します。
    Glossary には、以下のように定義します。

    Variable

    BusinessConcept

    Attribute

    ダミー

    ResponseObject

    dummy

    日当

    dailyAllowance

    ../../_images/excel_glossary_4.png

    コラム

    OpenRules では、定義するオブジェクトの最初の項目に対するデータ型に制約があるため、ダミー項目を設定しています。
    ここでダミーとして定義した項目は、Excelのルール定義ファイルとして必要となるのみであり、 IM-BIS のデータソース定義への設定は不要です。
    詳細は、 Datatype を参照してください。
  5. ここまでで入力項目・出力項目のオブジェクトを定義しましたが、 DecisionTable で扱っている項目のうち、どちらにも属さない項目は内部項目のオブジェクト(Internal)として定義します。
    この時点で定義していない「場所区分」「出張区分」について、以下のように定義します。

    Variable

    BusinessConcept

    Attribute

    場所区分

    Internal

    area

    出張区分

    tripClass

    ../../_images/excel_glossary_5.png

Glossary に基づいて DatatypeData/Variable を定義する

Glossary を利用して DatatypeData/Variable を定義していきましょう。
  1. Glossary が定義できましたので、これに基づいて DatatypeData/Variable を定義していきます。
    同じ「Definition」シートのRequestObjectの DatatypeData/Variable を以下のように定義します。
    • Datatype

      Datatype RequestObject

       

      String

      areaClassCode

      String

      tripClassCode

    • Data/Variable

      Data RequestObject requestObj

       

      areaClassCode

      tripClassCode

      場所コード

      出張区分コード

      テスト場所

      テスト出張区分

    ../../_images/excel_data_15.png
  2. ResponseObjectの DatatypeData/Variable を以下のように定義します。
    • Datatype

      Datatype ResponseObject

       

      String

      dummy

      int

      dailyAllowance

    • Data/Variable

      Data ResponseObject responseObj

       

      dummy

      dailyAllowance

      ダミー

      日当

      ダミー内容

      0

    ../../_images/excel_data_21.png
  3. 同様にInternalの DatatypeData/Variable を定義するために、先に作成したRequestObjectの定義をコピーします。
    ../../_images/excel_data_31.png
  4. コピーした定義を以下のように変更します。
    • Datatype

      Datatype Internal

       

      String

      area

      String

      tripClass

    • Data/Variable

      Data Internal internal

       

      area

      tripClass

      場所

      出張区分

      テスト場所

      テスト出張区分

    ../../_images/excel_data_41.png
  5. これで DatatypeData/Variable が定義できましたので、一度保存します。

DecisionObject を定義してルールを完成させる

最後に DecisionObject を定義して、Excelのルール定義ファイルを完成させましょう。
  1. 「Main」シートを表示しましょう。
    ../../_images/excel_do_11.png
  2. 「Main」シートで DecisionObject を設定していきます。
    入力項目、出力項目のオブジェクトについては、テンプレートと同じ設定となっているため、その下に内部項目のオブジェクト用に1行追加します。
    ../../_images/excel_do_21.png
  3. 追加した行には、以下のように設定しましょう。

    DecisionObject decisionObjects

     

    Business Concept

    Business Object

    Internal

    := internal[0]

    ../../_images/excel_do_31.png

    コラム

    このハンズオンのように、処理用のオブジェクト等を定義した場合には、 DecisionObject でインスタンス化の処理を設定します。

  4. これで、 OpenRules で日当を計算するExcelのルール定義ファイルの設定が完了しましたので、ファイルを保存します。
    IM-BIS の画面(フォーム)と連携するための設定を行っていきましょう。