3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Business Automation Manager Open Edition メモ - (3) Business Central によるルール作成

Last updated at Posted at 2022-10-09

はじめに

先に作成した環境を使って、Business Centralでルール開発をする流れを試してみます。

ODMで比較的シンプルなルールを作る手順を示してくれている以下の記事があります。
ODM for Developerをさわってみた②ルール開発
これは、会員のランクを元に割引率を判断するルールを作成しているものですが、これにならって同じようなルールをBAM OEで作成する場合どのような流れになるか見ていきたいと思います。

※実際のケースでは、VS Codeを使ってDRLでルールを記述する、Excelを使って表形式でルールを記述する、というルール開発方法が主流のようですが、残念ながらその方法でルール作成、デプロイ、実行までの一連の手順を示したちょうどよい感じのチュートリアルが見あたりませんでした。初心者にとってはマニュアルからその辺りの手順を読み解くのが大変なので、ここでは手っ取り早く動かせそうなBusiness Centralを使って流れを確認してしてみます。

関連記事

Business Automation Manager Open Edition メモ - (1) 概要
Business Automation Manager Open Edition メモ - (2) KIE Server, Business Central 構成
Business Automation Manager Open Edition メモ - (3) Business Centralを使用したルール開発
Business Automation Manager Open Edition メモ - (4) KIEサーバー上のルール呼び出し
Business Automation Manager Open Edition メモ - (5) Embedded形態でのルール開発(DRL編)
Business Automation Manager Open Edition メモ - (6) Embedded形態でのルール開発(DMN編)
Business Automation Manager Open Edition メモ - (7) kogitoでのルール開発(スタンドアローン)
Business Automation Manager Open Edition メモ - (8) kogitoでのルール開発(OpenShiftへのデプロイ)

前提知識

ルールを定義していくにあたり、事前におさえておく必要がある用語について整理します。
BRMSは"ビジネス・ルール"を外だしにして効率よくルールを管理する仕組みを提供してくれるものです。つまり条件設定を行ってそれを元にして何らかの判断結果を受け取るということになります。
具体的には、ローン審査を行う業務において申請者の様々な条件(年齢、職業、現時点での借入金額、etc...)を元にローン可否を判断する、とか、保険料算定業務において申込内容(保険商品、付帯特約、保険対象の各種条件、etc...)を元に保険料を算出するといったことが挙げられます。
これらの条件、結果を表すオブジェクト(ルールのサービスを呼び出す際の入出力データ)はBAM OEではファクトと呼ばれ、"データオブジェクト"として定義することになります(実体はgetter/setterを保持するJavaのクラス)。
このファクトを元にしてルール定義を作成していきます。基本的には DRL(Drools Rule Language) という専用のルール記述言語でルール記述していくことになります。このDRLではWHEN-THENという構文で条件とアクションを指定していくことになりますが、一からDRLでルールを記述するとこの構文を知らないといけないので、これを補足するためにいくつかGUIベースの補助ツールが提供されています。Business Centralでは、例えばGUIベースでWHEN-THENのルール定義の入力をガイドしてくれる ガイド付きルール、表形式でルールの記述を行うためのガイド付きディシジョンテーブル などが提供されています。

BAM OE - Business Centralによるルール作成の流れ

スペースの作成

一連のルールは"プロジェクト"という単位で作成していきます。プロジェクトは"スペース"と呼ばれる単位で管理されます。
作業スペースをいくつか分けて、各作業スペースごとにプロジェクトを管理する、というイメージです。

Business Centralの初期画面から「設計」を選択します。
image.png

最初はMySpaceというスペースが用意されています。必要に応じてスペースを作成します。
image.png

名前を指定して追加
image.png

スペースが追加されます。
image.png

プロジェクト作成

スペースに入ってプロジェクトの追加を選択
image.png

名前を指定して追加 (他のパラメーターはデフォルトのまま)
image.png

プロジェクトが作成されました。
image.png

以降、このプロジェクトにルールを追加していきます。

データオブジェクトの作成

実際のルールを作成していく前に、ルールの記述で使うデータの定義をしていきます。
ODMでいうところのXOMに相当するものをここで作成していきます。

※BAM OEでは、ODMのBOMに相当するオブジェクトは存在しないようです。

ここでは以下のような変数/型を持つオブジェクトを作成していきます。

  • rank/String : 会員のランクを示す変数(プラチナ|ゴールド|など...)
  • discount_rate/Double: 割引率を示す変数
  • message/String: ルール判定に関連するメッセージを保持する変数

アセットの追加をクリック
image.png

データオブジェクトを選択
image.png

名前を指定してOKをクリック
image.png

※デフォルトで、com.<スペース名>.<プロジェクト名>というパッケージ下にオブジェクトが作成されることになります。BAM OEの実装は基本的にJavaなので、最終的にはこのパッケージ下にデータ定義用のJavaのクラスが作成されることになります(変数定義と各変数に対するgetter/setterメソッドを持つクラス)。

データオブジェクト編集画面が開くので、「フィールドを追加」ボタンをクリックします。
image.png

IDとタイプを指定していきます。
image.png
image.png
image.png

3つの変数が定義されました。
image.png

「ソース」タブを見ると、実体としては以下のようなJavaのクラスが生成されていることが分かります。
image.png

ルール記述

ここから実際のルールを記述していきます。BAM OEではDRL(Drools Rule Language)と呼ばれる言語でルールを記述していくのがメジャーなようですが、初心者が一からゴリゴリとDRLでルールを記述していくのはハードルが高いので、GUIベースでルールを記述する仕組みが提供されています。
ここでは、「ガイド付きルール」(Guided Rule)、および、「ガイド付きディシジョンテーブル」(Guided Decision Table)の2つの方法でルールを作成してみます。
いずれも、GUIのインターフェースでルールを記述していくと最終的にDRLが生成されます。

ガイド付きルールの作成

プロジェクトの画面からアセットの追加ボタンをクリックし、「ガイド付きルール」を選択します。
image.png

名前を指定し、当オブジェクトを作成するパッケージを選択します。ここではデータ・オブジェクトと同パッケージにします。
image.png

ガイド付きルールの編集画面が開きます。
image.png

データオブジェクトのタブを開きます。当ガイド付きルールと同じパッケージのデータオブジェクトはデフォルトで使用可能になっています。
image.png
※異なるパッケージのデータオブジェクトを使用したい場合はここで明示的に使用するデータオブジェクトを追加する必要があります。

元のモデルタブに戻ってルールを編集していきます。
image.png
WHEN-THENで"条件"とその条件に合致したときに"アクション"を指定していきます。

このガイド付きルールでは、rank指定がnullだった場合にdiscount_rateを0にしてrank必須である旨のメッセージをセットする、ということを定義します。

WHEN句の指定

WHENの右端にある「+」ボタンをクリック
image.png

先に作成したデータオブジェクト"Loyalty"を指定します。
image.png

WHEN句に「Loyaltyがあります」という表記が追加されますのでそれをクリックします。
image.png

変数名として「loyalty」を指定します。
image.png
※インスタンス変数を指定するイメージ

WHEN句の表記が「Loyalty[loyalty]があります」に変わりますので、再度そこをクリックします。
image.png

「フィールドに制限を追加」のプルダウンからrankを選択
image.png

WHEN句にrankが表示されるので、その右側のプルダウンから「はnull」を選択
image.png

これでWHEN句が設定できました。
「rankがnullだった場合...」という指定をしたことになります。

THEN句の指定

次に「rankがnullだった場合」のアクションをTHENの所に指定していきます。
THENの右端の「+」ボタンをクリックします。
image.png

「loyaltyのフィールド値を変更」を選択します。
image.png
※ここでは、loyaltyオブジェクトにdiscount_rateの指定、および、messageに値を設定する操作を行うことを想定しています。すなわち、先にインスタンス化したオブジェクトのフィールド値を変更する操作を行いたいので上のメニューを選択しています。

discount_rate指定

THEN句に「Loyalty[loyalty]の値設定」と表示されるので、その横の編集ボタン(鉛筆マーク)をクリックします。
image.png

フィールドを追加のプルダウンからdiscount_rateを選択
image.png

discount_rateが追加されるのでその横の編集ボタン(鉛筆マーク)をクリックします。
image.png

固定値をクリック
image.png

discount_rateの右側の入力欄に固定値として「0.0」を指定します。(デフォルトで0.0になっているので変更不要)
image.png

message指定

「Loyalty[loyalty]の値設定」をクリックします。
image.png

フィールドを追加のプルダウンからmessageを選択
image.png

messageが追加されるのでその横の編集ボタン(鉛筆マーク)をクリックします。
image.png

固定値をクリック
image.png

messageの右側の入力欄に固定値として「ランクが入力されていません」を指定します。(入力欄の幅が短くて表示上後ろが見えていませんが...)
image.png

これで、THEN句の指定が完了です。
「rankがnullだった場合」のアクションとして「discount_rateに"0.0"を指定」、「messageに"ランクが入力されていません"を指定」というルールを定義したことになります。

ソース(DRL)確認

ここで定義したルールはDRLとして生成されます。「ソース」タブでDRLのソースが確認できます。確認後、「保存」をクリックして作成したルールを保存します。
image.png
※ここでソースレベルでの編集は行えません。

ガイド付きディシジョンテーブルの作成

プロジェクトの画面からアセットの追加ボタンをクリックし、「ガイド付きデシジョンテーブル」を選択します。
image.png

名前を指定し、当オブジェクトを作成するパッケージを選択します。ここではデータ・オブジェクトと同パッケージにします。また、「ウィザードを使用」にチェックします。
image.png

先の画面で「ウィザードを使用」にチェックを入れていると、ディシジョンテーブル作成用のウィザードが表示されますのでこれに従って作成していきます。
image.png

インポート

そのまま「次へ」
image.png
※使用するデータオブジェクトと同じパッケージにしているのでここでインポートは不要

ファクトパターンを追加

Loyaltyを選択
image.png

次へ
image.png

制約を追加

ここでは条件の判断の元になるフィールド(WEHN句で使用するフィールド)を選択します。
「利用可能なパターン」からLoyalty、「利用可能なフィールド」からrankを選択
image.png

「条件」からRankを選択し、下段のカラムヘッダー、オペレータ、計算タイプを設定して次へ。
image.png
※ここでは、「Rankが"ゴールド"だったら...」というルールを作っていく想定です。

アクションを追加してファクトを更新

「利用可能なパターン」からLoyalty、「利用可能なフィールド」からdiscount_rateを選択
image.png

「選択済みのフィールド」からdiscount_rateを選択し、下段のカラムヘッダーを設定して次へ。
image.png

アクションを追加してファクトを挿入

そのまま次へ
image.png

展開するカラム

そのまま完了
image.png

これでテーブルのガラができあがりました。
image.png

行の追加

作成された表に行を追加して具体的な値を設定していきます。

「モデル」タブにて、メニューから「挿入」-「行の追加」を選択
image.png

以下のように表に行が追加されるので、Rankとそれに応じたDiscount Rateを入力していきます。
image.png

最終的には以下のように設定します。
image.png

ソース(DRL)確認

ここで定義したルールはDRLとして生成されます。「ソース」タブでDRLのソースが確認できます。確認後、「保存」をクリックして作成したルールを保存します。
image.png
※表の各行がそれぞれ独立したルールとして定義されている様子が確認できます
※ここでソースレベルでの編集は行えません。

テストシナリオ作成

プロジェクトの画面からアセットの追加ボタンをクリックし、「テストシナリオ」を選択します。
image.png

名前とパッケージを指定し、ソースタイプにRULEを指定してOKをクリック
image.png

表形式でテストシナリオを設定するための編集画面が開きます。
image.png

表の"GIVEN"の列には入力として与える条件を指定するオブジェクト、"EXPECT"の列にはルール適用結果が返されるオブジェクトを指定します。ここでは、GIVEN列にLoyaltyのrank、EXPECT列にLoyaltyのdiscount_rate、messageを指定します。
image.png

次に、テストシナリオとして列を追加していきます。GIVENにはテストケースとして与える条件の具体的な値を、EXPECTにはその時返される値の期待値を指定していきます。

例えばここでは以下のような5つのテストケースを指定してみます。
image.png
(2行目と5行目はあえてエラーになるケースを設定しています)

テスト実行ボタンをクリックすると、設定したテストケースが検査されてテストレポートが表示されます。
image.png
右側にはテストレポートとして5件中3件成功、2件が失敗したという結果が表示されます。グラフ上では期待値と実際のルール適用結果が異なる箇所が赤いセルでハイライトされます。

カーソルを赤くハイライトされたセルに合わせると、期待値と実際のルール適用後の値の違いが表示されます。
image.png

また、どのルールが実行されたかのカバレッジもレポートして表示してくれます。
image.png

テストシナリオのエクスポート/インポート

上で作成したテストシナリオを"エクスポート"すると以下のようなCSV形式のファイルが生成されます。

CustomerLoyaltyTest01.scesim.csv
"#",Scenario description,GIVEN,EXPECT,EXPECT
"#",Scenario description,Loyalty,Loyalty,Loyalty
"#",Scenario description,rank,discount_rate,message
1,,プラチナ,0.3,
2,Error scenario for Gold,ゴールド,0.3,
3,,ゴールド,0.2,
4,,null,0.0,ランクが入力されていません
5,Error scenario for null,null,0.05,Rank is Null

BusinessCentral上でヘッダーだけ作ってそれをCSVファイルとしてエクスポートし、テストデータはExcelなどで整備してからインポートし直す、といったことができるので、大量のテストデータを準備してテストする必要がある場合はそのような方法を取ると便利そうです。

カバレッジ・レポートのエクスポート

カバレッジ・レポートをエクスポートすると、以下のようなCSV形式のファイルが生成されます。

CustomerLoyaltyTest01_CoverageReport.scesim.csv
AVAILABLE RULES,RULES FIRED,PERCENTAGE OF RULES FIRED
9,5,55.55555555555556

RULE,NUMBER OF TIMES
CalculateDiscountRate_10 (com.testspace01.customerloyalty01),1
Row 1 CalculateDiscountRate (com.testspace01.customerloyalty01),1
CalculateDiscountRate_11 (com.testspace01.customerloyalty01),2
Row 2 CalculateDiscountRate (com.testspace01.customerloyalty01),2
CheckNull (com.testspace01.customerloyalty01),2

TEST SCENARIO INDEX,TEST SCENARIO NAME,RULE INDEX,FIRED RULE,RULE STATUS,MESSAGE
1,,1,CalculateDiscountRate_10 (com.testspace01.customerloyalty01),EXECUTED,
1,,2,Row 1 CalculateDiscountRate (com.testspace01.customerloyalty01),EXECUTED,
2,Error scenario for Gold,1,CalculateDiscountRate_11 (com.testspace01.customerloyalty01),EXECUTED,
2,Error scenario for Gold,2,Row 2 CalculateDiscountRate (com.testspace01.customerloyalty01),EXECUTED,
3,,1,CalculateDiscountRate_11 (com.testspace01.customerloyalty01),EXECUTED,
3,,2,Row 2 CalculateDiscountRate (com.testspace01.customerloyalty01),EXECUTED,
4,,1,CheckNull (com.testspace01.customerloyalty01),EXECUTED,
5,Error scenario for null,1,CheckNull (com.testspace01.customerloyalty01),EXECUTED,

Excelで開くとこんな感じ
image.png

デプロイ

最後に作成したプロジェクトをKIE Serverにデプロイします。

プロジェクトの右上のデプロイをクリック
image.png

ポップアップが出るのでデプロイメントの詳細表示をクリック
image.png

image.png

これでサーバーへのデプロイまで完了しました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?