ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Business Rulesユーザーズ・ガイド
11gリリース1 (11.1.1.7)
B55917-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

10 Oracle Business RulesとADFビジネス・コンポーネントの使用

この章では、Oracle Business Rulesにより、ADFビジネス・コンポーネントのビュー・オブジェクトをファクトとして使用可能にして、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフのツリーをアサートし、Oracle Business Rulesにメイン・ビュー・オブジェクトのツリー内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させる方法について説明します。

この章の項目は、次のとおりです。

10.1 Business RulesとADFビジネス・コンポーネントの使用の概要

ADFビジネス・コンポーネント・ルール開発プロセスは、次のようにまとめることができます。

  1. ビュー・オブジェクト定義を作成します。

  2. アクション・タイプを作成します。

  3. ルール・ディクショナリを作成します。

  4. ビュー・オブジェクトのファクト・タイプを登録します。

  5. アクションのJavaファクト・タイプを登録します。

  6. Javaから起動する場合は、次のいずれかを実行します。

    • ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されている場合は、ビュー・オブジェクト・インスタンスを渡してデシジョン・ポイントの起動をコーディングします。

    • ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されていない場合は、ビュー・オブジェクトのキー値を渡してデシジョン・ポイントの起動をコーディングします。

10.1.1 Oracle Business RulesのADFビジネス・コンポーネント・ファクト・タイプ

ADFビジネス・コンポーネント・ビュー・オブジェクトがOracle Business Rulesデータ・モデルにインポートされるとき、図10-1に示すように、ビュー・オブジェクトの各属性に対応するプロパティを持ったADFビジネス・コンポーネント・ファクト・タイプが作成されます。

また、ADFビジネス・コンポーネント・ファクト・タイプには、次のプロパティが含まれています。

  • プロパティViewRowImpl。各ファクト・インスタンスが表すoracle.jbo.Rowインスタンスを直接指します。

  • プロパティkey_valuesoracle.rules.sdk2.decisionpoint.KeyChainオブジェクトを指します。このプロパティは、この行と親行のキー値セットの取得に使用できます。

図10-1 ADFビジネス・コンポーネントのサンプル・ファクト・タイプ

図10-1の説明が続きます
「図10-1 ADFビジネス・コンポーネントのサンプル・ファクト・タイプ」の説明

次のことに注意してください。

  • ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。

    ADFビジネス・コンポーネント・ファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。1対多関係の場合、生成されるプロパティのタイプはListであり、実行時に示されたタイプのファクトが含まれています。

  • ADFビジネス・コンポーネント・ファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。

    この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADFビジネス・コンポーネント・ファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。

  • ADFビジネス・コンポーネント・ファクト・タイプを使用すると、Oracle Business Rules内部では、RLファクト・タイプのインスタンスとしてADFビジネス・コンポーネント・ファクト・タイプが作成されます。つまり、このことは、ADFビジネス・コンポーネント・ビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりにMetadataHelperおよびADFBCFactTypeHelperクラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

10.1.2 Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ

Rules SDKでは、デシジョン・ポイント内のビュー・オブジェクトを更新する主な方法は、アクション・タイプを使用することです。アクション・タイプは、ルール・パターン・ファクト・タイプのJavaクラスをインポートするのと同じ方法でルール・ディクショナリのデータ・モデルにインポートするJavaクラスです。このアクション・タイプの新規インスタンスは、ルールのアクション内でアサートされてから、DecisionPointDictionary内の後処理ルールセットにより処理されます。

アクション・タイプとして使用するJavaクラスは、次の要件に従う必要があります。

  • Javaファクト・タイプのクラスは、oracle.rules.sdk2.decisionpoint.ActionTypeまたはoracle.rules.sdk2.decisionpoint.KeyedActionTypeをサブクラス化する必要があります。

    KeyedActionTypeをサブクラス化することで、Javaクラスは標準のoracle.rules.sdk2.decisionpoint.KeyChain属性を継承します。これは、ルール・ファクトの主キーおよび親キーをActionTypeインスタンスに伝えるのに使用できます。

  • クラスにはデフォルト・コンストラクタが必要です。

  • クラスは、ActionTypeのabstractのexecメソッドを実装します。execメソッドに、実行するメイン・アクションを含める必要があります。

  • Javaクラスには、JavaBeanインタフェースに準拠するプロパティが必要です(つまり、各プロパティにはgetterメソッドおよびsetterメソッドが必要です)。

例10-1に、ActionTypeサンプル実装を示します。

例10-1 ActionTypeの実装

package com.example;
 
import oracle.jbo.domain.Number;
 
import oracle.rules.sdk2.decisionpoint.ActionType;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
 
public class RaiseAction extends ActionType {
    private double raisePercent;
 
    public void exec(DecisionPointInstance dpi) {
        Number salary = (Number)getViewRowImpl().getAttribute("Salary");
        salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false});
        dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"),
                      getRaisePercent() + "=>" + salary );
        getViewRowImpl().setAttribute("Salary", salary);
    }
 
    public void setRaisePercent(double raisePercent) {
        this.raisePercent = raisePercent;
    }
 
    public double getRaisePercent() {
        return raisePercent;
    }
}

例10-1では、execメソッドのパラメータとしてoracle.rules.sdk2.decisionpoint.DecisionPointInstanceが存在します。表10-1に、ActionType execを実装するアプリケーション開発者に必要と思われるDecisionPointInstanceのメソッドを示します。

表10-1 DecisionPointInstanceのメソッド

メソッド 説明

getProperties

アクション・タイプに必要な可能性がある実行時指定パラメータを含むHashMap<String,Object>オブジェクトを提供します。

デシジョン・サービスのデシジョン関数を使用する場合は、文字列値のみを使用します。

getRuleSession

ルール・ディクショナリ内の静的構成変数へのアクセス元として使用できる、Oracle Business Rules RuleSessionオブジェクトへのアクセスを提供します。

getActivationID

コール元により移入される場合、Set Controlのインダイレクトに使用する文字列値を提供します。

getTransaction

アクション・タイプがバックエンドで永続的に変更できるように、トランザクション・オブジェクトを提供します。

addResult

指定の結果を文字列キーおよびオブジェクト値の形式で出力値のリストに追加します。

出力は、純粋なマップ実装の場合と同様に、oracle.rules.sdk2.decisionpoint.DecisionPointInstance.NamedValueオブジェクトのListとしてアセンブルされます。NamedValueオブジェクトは、名前および値ごとにgetterを持つ単純なデータ伝達クラスです。あるアクション・タイプ・インスタンスの出力値が相互に上書きすることは許可されず、この点ではアクション・タイプの実装が互いに完全に独立しているものとみなす必要があります。


ルール・デザイナを使用すると、構成中のActionTypeに適切なパラメータを選択できます。

10.2 ADFビジネス・コンポーネント・ファクトを使用する場合のデシジョン・ポイントの使用

デシジョン・ポイントを使用すると、デシジョン関数を実行できます。ADFビジネス・コンポーネント・ファクト・タイプを使用している場合にのみ適用される特定のデシジョン・ポイント・メソッドがあります。デシジョン関数の詳細は、第6章「デシジョン関数の使用」を参照してください。

10.2.1 ADFビジネス・コンポーネント・ファクトによるデシジョン・ポイントのコール方法

ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数を起動します。

Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする手順は、次のとおりです。

  1. DecisionPointBuilderを使用して、テンプレートDecisionPointインスタンスを作成し、構成します。

    詳細は、第7.3.1項「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」を参照してください。

  2. DecisionPointのメソッドgetInstanceを使用して、DecisionPointInstanceを作成します。

  3. DecisionPointInstanceのメソッドaddInputsetInputsまたはsetViewObjectを使用して、使用するファクト・オブジェクトをDecisionPointInstanceに追加します。これらは、ViewObjectまたはViewObjectReferenceインスタンスです。これらは、デシジョン関数の入力で宣言されるのと同じ順序で追加する必要があります。詳細は、第10.2.1.3項「ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール」を参照してください。

  4. DecisionPointInstanceで使用されるトランザクションを設定します。

    詳細は、第10.2.1.1項「デシジョン・ポイント・トランザクションの設定」を参照してください。

  5. 以降のアプリケーション・アクションに必要なランタイム・プロパティを設定します。

    詳細は、第10.2.1.2項「ランタイム・プロパティの設定」を参照してください。

  6. DecisionPointInstanceのメソッドinvokeをコールします。

    詳細な情報は、次を参照してください:

10.2.1.1 デシジョン・ポイント・トランザクションの設定

Oracle Business Rules SDKフレームワークでは、ViewObjectをロードし、トランザクション・コンテキスト内でActionTypeインスタンスを提供するには、oracle.jbo.server.DBTransactionImpl2インスタンスが必要です。oracle.jbo.server.DBTransactionImpl2クラスは、ApplicationModuleのメソッドgetTransactionをコールすることで戻される、デフォルトのJBOトランザクション・オブジェクトです。トランザクションを設定するには、パラメータにTransactionオブジェクトを指定し、DecisionPointInstanceのメソッドsetTransactionをコールする必要があります。

なんらかの理由でDBTransactionインスタンスを使用できない場合、Oracle Business Rules SDKフレームワークでは、setTransactionメソッドに用意されている3つのオーバーライドのいずれかを使用してインスタンスをブートストラップできます。

次のいずれかが必要です。

  • JDBC URL、ユーザー名およびパスワード。

  • JDBC接続オブジェクト。

  • javax.sql.DataSourceオブジェクト、およびDataSourceがJTAトランザクションおよびローカル・トランザクションのどちらを表すかを指定するフラグ。

10.2.1.2 ランタイム・プロパティの設定

setPropertyメソッドを使用してランタイム・プロパティを提供できます。これらのプロパティは、実行中にActionTypeインスタンスにより取得できます。ランタイム・プロパティが不要な場合は、これらのコールを安全に省略できます。

10.2.1.3 ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール

デシジョン・ポイントの起動で使用されるViewObjectは、表10-2に示すように、2つの方法のいずれかを使用して指定できます。

表10-2 デシジョン・ポイントの起動用のビュー・オブジェクトの設定

ViewObject設定メソッド 説明

setViewObject

このデシジョン関数は、ViewObject行ごとに1回ずつ起動されます。ビュー・オブジェクトを使用する場合は、この方法をお薦めします。ルール・セッションはデシジョン関数の起動と起動の間にリセットされないため、デシジョン関数が以前に起動されたときにアサートされたファクトは、作業メモリーに残ります。通常、デシジョン関数のコールが完了する前に、アサートされたファクトを取り消すルールを記述する必要があります。たとえば、後処理デシジョン関数がコールされる前に実行されたViewObject行を取り消すクリーンアップ・ルールセットを使用できます。

この使用について詳しくは、第10.3.9.3項「従業員取消しルールセットの追加方法」を参照してください。setViewObjectを使用するには、ViewObjectが、デシジョン関数InputTableの最初のエントリである必要があります。

addInput

setInputs

このデシジョン関数は、同時にロードされたすべてのViewObject行に対して1回起動されます。数多くの行が同時にロードされる場合があるため、通常、この操作はスケーラブルではありません。ViewObjectの行数が少ないことがわかっている場合は、このメソッドによるViewObjectのコールが役立つことがあります。


例10-2に、setInputsメソッドを使用するViewObjectインスタンスを使用してデシジョン・ポイントを起動する方法を示します。完全な例については、例10-5を参照してください。

例10-2 setInputsメソッドを使用したデシジョン・ポイントの起動

public class OutsideManagerFinder {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
 
    private static final DictionaryFQN DICT_FQN = 
                  new DictionaryFQN("com.example", "Chapter10Rules");
 
    private static final String DF_NAME = "FindOutsideManagers";
 
    private DecisionPoint dp = null;
 
    public OutsideManagerFinder() {
        try {
            dp = new DecisionPointBuilder()
                              .with(DICT_FQN)
                              .with(DF_NAME)
                              .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }


    public void run() {
        final ApplicationModule am = 
                  Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);        
        final DecisionPointInstance point = dp.getInstance();
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setInputs(new ArrayList<Object>(){{ add(vo); }});
        try {
            List<Object> invokeList = point.invoke();

List<DecisionPoint.NamedValue> results = point.getResults();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }

例10-3に、setViewObjectメソッドを使用してDecisionPointを起動し、ViewObjectを設定する方法を示します。

例10-3 setViewObjectメソッドを使用したデシジョン・ポイントの起動

    public void run() {
        final ApplicationModule am = 
                Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);
        final DecisionPointInstance point = dp.getInstance();
        
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setViewObject(vo);
        try {
            List<Object> invokeList = point.invoke();
List<DecisionPoint.NamedValue> results = point.getResults();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }

10.2.1.4 デシジョン・ポイントの起動に関する必知事項

JBOクラスのデフォルト動作はすべてのデータを単にロードすることであるため、大量のデータをロードするビュー・オブジェクトを使用してデシジョン・ポイントを起動する際には注意が必要です。多数の行を持ち、多数の子行も持つ可能性のあるビュー・オブジェクトがメモリーにロードされると、メモリー不足になる危険性があるのみでなく、この種の大型データに基づいて実行されるDMLアクションによってロールバック・セグメントがすべて使用されてしまう危険性があります。

10.2.2 Javaデシジョン・ポイント・インタフェースによるデシジョン関数のコール方法

Oracle Business Rules SDKデシジョン・ポイント・インタフェースを持つADFビジネス・コンポーネント・ファクト・タイプを使用して、ルールセットを持つデシジョン関数をコールするには、特定のオプションを使用してデシジョン関数を構成する必要があります。デシジョン関数の使用の詳細は、第6章「デシジョン関数の使用」を参照してください。

Javaデシジョン・ポイント・インタフェースを使用してデシジョン関数を定義する手順は、次のとおりです。

  1. 「デシジョン関数」項目の左にある「デシジョン関数」アイコンをダブルクリックするか、この項目を選択して「編集」アイコンをクリックします。「デシジョン関数の編集」ダイアログが表示されます。

  2. 「デシジョン関数の編集」ダイアログで、デシジョン関数を構成します。

    • 入力のファクト・タイプ: 構成済のビジネス・ルールに使用するファクト・タイプの名前を指定します。

      ADFビジネス・コンポーネント・ファクト・タイプを使用するアプリケーションを使用している場合、入力はルールで使用されるADFビジネス・コンポーネント・ビュー・オブジェクトとなります。

      デシジョン・ポイントでsetViewObjectを使用する場合は、「リスト」属性の選択を解除する必要があります。デシジョン・ポイントでaddInputメソッドまたはsetInputsメソッドを使用しているときに、入力のファクト・タイプごとに「リスト」属性を選択する必要があります。ビュー・オブジェクトの使用に応じて「ツリー」属性を選択することもできます。

      • 「リスト」: ADFビジネス・コンポーネント・ファクト・タイプのリストがデシジョン関数に渡されるように定義します。

      • 「ツリー」: マスター/ディテール階層内の最上位レベル・オブジェクトのみでなく、すべてのオブジェクトをアサートするように定義します。

      詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

    • 出力のファクト・タイプ: コール元が戻すファクト・タイプを定義します。

      ADFビジネス・コンポーネント・ファクト・タイプを使用するデシジョン関数のJavaデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする場合、出力のファクト・タイプは空のままにする必要があります。ビュー・オブジェクトは、ActionTypeを使用して更新されます。詳細は、第10.1.2項「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

    • 「ルールセットおよびデシジョン関数」: このデシジョン関数で実行するルールセットおよび他のデシジョン関数の順序付きリストです。DecisionPointディクショナリからのルールセットDecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは、それぞれアプリケーション固有のルールセットおよびデシジョン関数の前と後に実行するように追加する必要があります。

10.2.3 ADFビジネス・コンポーネントによるデシジョン関数の構成に関する必知事項

デシジョン関数の定義には、ルールセットとデシジョン関数の両方を含めることができます。アプリケーションでは、通常、配管コードとして機能するなんらかのルールまたはデシジョン関数が必要です。このようなアプリケーションには、入力データのトランスフォーメーション、補助ファクトのアサートまたは出力ファクトの処理を実行するコンポーネントが含まれます。配管コードは、アプリケーションのコア・ビジネス・ルールを含むルールの前または後に実行することが必要となる場合があります。こうしたアプリケーションの問題とそれに関連するルールをネストしたデシジョン関数を使用して、アプリケーションの機能の問題と切り離すことができます。ネストしたデシジョン関数を使用すると、内側のデシジョン関数に管理上の配管指向の問題が含まれなくなるため、内側のデシジョン関数ではアプリケーションのコア・ロジックを定義するルールのみが示されるようになります。この設計によって、ユーザーが管理上のルールを理解する必要がなくなり、ユーザーがルールに不適切な変更を加えること(および、このことにより、システムが操作不能になる事態)を防止できます。

複数のルールセットおよびネストしたデシジョン関数を使用して構成を作成するには、2つのデシジョン関数を作成し、一方を他方に追加します。適切なネーミング方法は、ネストした内側のデシジョン関数に接尾辞Coreを付けることです。これにより、ユーザー指定のルールセットをこの内側のCoreデシジョン関数に追加できます。たとえば、DecisionPointDictionary.Preprocessingデシジョン関数、DecisionFunction_1Coreデシジョン関数およびDecisionPointDictionary.Postprocessingデシジョン関数を実行するようにDecisionFunction_1を定義できます。この例では、DecisionFunction_1Coreにコア・ビジネス・ロジック・ルールセットが含まれています。

デシジョン・ポイントの入力を、ADFビジネス・コンポーネント・オブジェクトのツリーのルートである、ADFビジネス・コンポーネントのファクト・タイプにすることも一般的です。ただし、ユーザーはツリーに存在するタイプのサブセットに一致する、ビジネス・ルールのみを記述できます。この場合、ネストしたデシジョン関数の入力を、格納されたルールセットに実際に一致するタイプのみになるよう定義することを習慣にするとよいでしょう。たとえば、ツリー・オプションが選択されたEmployeeファクト・タイプが入力である、デシジョン関数をコールするデシジョン・ポイントを考えてみます。このデシジョン関数は、Departmentファクト・タイプに一致するルールセットのみが存在する、ネストしたデシジョン関数を含むとします。この場合、ネストしたデシジョン関数には、入力としてツリー・オプションが選択されたEmployeeファクト・タイプまたはリスト・オプションが選択されたDepartmentファクト・タイプのいずれかを指定できます。この例では、ツリー・オプションにより、Employeeインスタンスの子が発生します。これにはDepartmentインスタンスのアサートも含まれます(これらのタイプ間の1対多関連のため)。Employeeが外側のデシジョン関数の入力で、ツリー・オプションが選択されている場合、Departmentファクト・タイプのインスタンスがアサートされ、内側のデシジョン関数のシグネチャをDepartmentのインスタンス(このデシジョン関数に適合された正確なタイプ)のリストとして識別できます。

10.3 ADFビジネス・コンポーネント・ファクトを使用したBusiness Rulesアプリケーションの作成

ADFビジネス・コンポーネント・サンプル・アプリケーションでは、ADFビジネス・コンポーネント・ファクト・タイプの使用を示します。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

10.3.1 ADFビジネス・コンポーネント・ファクトを使用するアプリケーションの作成方法

Oracle Business RulesでADFビジネス・コンポーネント・ファクトを使用するには、まずOracle JDeveloperでアプリケーションおよびプロジェクトを作成する必要があります。

ADFビジネス・コンポーネント・ファクトを使用するアプリケーションを作成する手順は、次のとおりです。

  1. Oracle JDeveloperを起動します。Oracle JDeveloperの開始ページが表示されます。

  2. 「アプリケーション・ナビゲータ」でアプリケーション・メニューの「新規アプリケーション」をクリックします。

  3. 「アプリケーションの名前付け」ページで、新規アプリケーションの名前および場所を入力します。

    1. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、Chapter10と入力します。

    2. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、com.exampleと入力します。

      この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

      このサンプルでは、接頭辞com.exampleを使用します。

    4. 「アプリケーション・テンプレート」フィールドで「Fusion Webアプリケーション(ADF)」を選択します。

  4. 「終了」をクリックします。

10.3.2 Chapter10汎用プロジェクトの追加方法

Chapter10という新規プロジェクトを追加する必要があります。

新規プロジェクトを追加します。

  1. Chapter10アプリケーションで、「アプリケーション・メニュー」を選択します。

  2. 「アプリケーション・メニュー」リストから「新規プロジェクト」を選択します。

  3. 「新規ギャラリ」の「項目」領域で、「汎用プロジェクト」を選択します。

  4. 「OK」をクリックします。

  5. 「プロジェクトの名前付け」ページで、「プロジェクト名」フィールドにChapter10と入力します。

  6. 「終了」をクリックします。

10.3.3 Business RulesのADFビジネス・コンポーネント・アプリケーションの作成方法

データベース表からADFビジネス・コンポーネントを追加する必要があります。この例では、標準のHRデータベース表を使用します。

ADFビジネス・コンポーネントを追加する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

  2. 右クリックしてメニューから「新規」を選択します。

  3. 「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ADFビジネス・コンポーネント」を選択します。

  4. 「項目」領域で、「表からのビジネス・コンポーネント」を選択します。

  5. 「OK」をクリックします。

  6. 「ビジネス・コンポーネント・プロジェクトの初期化」ダイアログで、必要な接続情報を入力して、接続を追加します。

  7. 「OK」をクリックします。表からのビジネス・コンポーネントの作成ウィザードが表示されます。

  8. 「エンティティ・オブジェクト」ページで、「使用可能」ボックスのオブジェクトを「選択済」ボックスに移動して、必要なオブジェクトを選択します。完成したリストを表示するために、「問合せ」をクリックすることが必要となる場合があります。たとえば、図10-2に示すように、「DEPARTMENTS」および「EMPLOYEES」を選択します。

    図10-2 サンプル・アプリケーション用のエンティティ・オブジェクトの選択

    図10-2の説明が続きます
    「図10-2 サンプル・アプリケーション用のエンティティ・オブジェクトの選択」の説明

  9. 「次へ」をクリックします。「更新可能なビュー・オブジェクト」ページが表示されます。

  10. 図10-3に示すように、「更新可能なビュー・オブジェクト」ページで「Departments」および「Employees」を選択します。

    図10-3 サンプル・アプリケーション用の更新可能なビュー・オブジェクトの追加

    図10-3の説明が続きます
    「図10-3 サンプル・アプリケーション用の更新可能なビュー・オブジェクトの追加」の説明

  11. 「次へ」をクリックします。「読取り専用ビュー・オブジェクト」ページが表示されます。

  12. 「次へ」をクリックします。「アプリケーション・モジュール」ページが表示されます。

  13. 「終了」をクリックします。

10.3.4 Business Rulesサンプル・アプリケーションのビュー・オブジェクト・チューニングの更新方法

アプリケーションのパフォーマンス要件に合わせて、ViewObjectをチューニングする必要があります。

EmployeesViewのチューニング・オプションを設定する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で「EmployeesView」をダブルクリックします。

  2. 「一般」ナビゲーション・タブで、「チューニング」を開きます。

  3. 「チューニング」領域で「すべての行」を選択します。

  4. 「チューニング」領域で、Batches of:フィールドに128と入力します。

  5. 「チューニング」領域で「一度にすべて」を選択します。

DepartmentsViewのチューニング・オプションを設定する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で「DepartmentsView」をダブルクリックします。

  2. 「一般」ナビゲーション・タブで、「チューニング」を開きます。

  3. 「チューニング」領域で「すべての行」を選択します。

  4. 「チューニング」領域で、Batches of:フィールドに128と入力します。

  5. 「チューニング」領域で「一度にすべて」を選択します。

10.3.5 Oracle Business Rulesのディクショナリの作成方法

Oracle JDeveloperを使用して、Oracle Business Rulesディクショナリを作成します。

ディクショナリを作成する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

  2. 右クリックして、リストから「新規」を選択します。

  3. 「新規ギャラリ」ウィンドウで、「すべてのテクノロジ」タブを選択して「カテゴリ」領域で「ビジネス層」を開き、「ビジネス・ルール」を選択します。

  4. 「新規ギャラリ」の「項目」領域で「ビジネス・ルール」を選択します。

  5. 「OK」をクリックします。

  6. 図10-4に示すように、「ビジネス・ルールの作成」ダイアログで、ディクショナリ名とパッケージを入力します。

    • たとえば、「名前」フィールドにChapter10Rulesと入力します。

    • たとえば、「パッケージ」フィールドにcom.exampleと入力します。

    図10-4 Chapter10Rulesディクショナリのビジネス・ルールの作成

    図10-4の説明が続きます
    「図10-4 Chapter10Rulesディクショナリのビジネス・ルールの作成」の説明

  7. 「OK」をクリックします。

    図10-5に示すように、JDeveloperによりルール・デザイナにディクショナリが作成され、Chapter10Rules.rulesファイルが開きます。

    図10-5 ルール・ディクショナリの追加

    図10-5の説明が続きます
    「図10-5 ルール・ディクショナリの追加」の説明

10.3.6 デシジョン・ポイント・ディクショナリ・リンクの追加方法

Oracle Business Rulesによって提供されているデシジョン・ポイント・ディクショナリへのディクショナリ・リンクを追加する必要があります。このディクショナリでは、ADFビジネス・コンポーネント・オブジェクトを持つデシジョン・ポイント・インタフェースで使用する機能がサポートされています。

デシジョン・ポイント・ディクショナリ・リンクを追加します。

  1. Rules Designerで、「リンク」ナビゲーション・タブをクリックします。

  2. 「作成」アイコンの横にあるメニューから、「デシジョン・ポイント・ディクショナリ」を選択します。この操作は、完了に時間がかかる場合があります。操作が完了した後、ルール・デザイナは、図10-6に示すように、デシジョン・ポイント・ディクショナリへのリンクを追加します。

    図10-6 デシジョン・ポイント・ディクショナリのディクショナリ・リンクの追加

    図10-6の説明が続きます
    「図10-6 デシジョン・ポイント・ディクショナリのディクショナリ・リンクの追加」の説明

10.3.7 ADFビジネス・コンポーネント・ファクトをインポートする方法

ルール・デザイナでADFビジネス・コンポーネント・ファクトをインポートして、ルールの作成時にこれらのオブジェクトを使用できるようにします。

ADFビジネス・コンポーネント・ファクトをインポートします。

  1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

  2. 「ADF-BCファクト」タブを選択します。

  3. 「作成」アイコンをクリックします。「ADFビジネス・コンポーネント・ファクト」ページが表示されます。

  4. 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトが使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。

  5. 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。たとえば、「com.example.EmployeesView」を選択します。

  6. 「OK」をクリックします。図10-7に示すように、「ファクト」ナビゲーション・タブが表示されます。

    図10-7 ルール・デザイナのADFビジネス・コンポーネント・ファクト

    図10-7の説明が続きます
    「図10-7 ルール・デザイナのADFビジネス・コンポーネント・ファクト」の説明

ADFビジネス・コンポーネント・ファクトには循環参照が含まれていることがあります。この場合は、次のような検証警告が示されます。

RUL-05037: A circular definition exists in the data model

「ビジネス・ルール」検証ログにこの警告が表示されている場合は、循環参照を手動で解決する必要があります。このためには、循環参照に含まれているいずれか1つのプロパティの「参照可能」チェック・ボックスの選択を解除します。

プロパティを表示不可能としてマーク付けする手順は、次のとおりです。

  1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。­

  2. 「DepartmentsView」行のアイコンをダブルクリックします。

  3. 「プロパティ」表の「EmployeesView」行で、「参照可能」チェック・ボックスの選択を解除します。

  4. 「OK」をクリックします。

DepartmentsViewおよびEmployeesViewの別名を設定する手順は、次のとおりです。

  1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。

  2. 「エイリアス」列で、EmployeesViewEmployeeで置き換えます。

  3. 「エイリアス」列で、DepartmentsViewDepartmentで置き換えます。

10.3.8 外部マネージャ・ルールセットの追加および実行方法

外部マネージャ・ルールセットを実行するサンプル・コードは、setInputsメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数が1回起動し、すべてのビュー・オブジェクト行がListにロードされます。この方法を使用してデシジョン・ポイントを起動する場合、すべてのビュー・オブジェクト行が同時にメモリーにロードされる必要があり、OutOfMemory例外が発生する可能性があるため、スケーラブルではありません。この起動スタイルは、既知のビュー・オブジェクト行が少数ある場合にのみ使用します。setViewObjectでデシジョン・ポイントを使用することもできます。詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

10.3.8.1 外部マネージャ・ルールセットおよびデシジョン関数の追加方法

ビュー・オブジェクトがファクトとしてインポートされた後、ルールセットの名前を変更して、アプリケーションのデシジョン関数を作成できます。

ルールセットの名前を変更する手順は、次のとおりです。

  1. ルール・デザイナで、「Ruleset_1」ナビゲーション・タブを選択します。

  2. ルールセット名を選択し、Outside Manager Rulesetと入力して、ルールセットの名前を変更します。

デシジョン関数を追加する手順は、次のとおりです。

  1. 「デシジョン関数」ナビゲーション・タブをクリックします。

  2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

  3. 図10-8に示すように、デシジョン関数のフィールドを編集します。

    • 「名前」に値FindOutsideManagersを入力します。

    • 「入力」領域で、「入力の追加」アイコンをクリックして入力情報を次のように編集します。

      • 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

      • 「リスト」チェック・ボックスを選択します。

      このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。詳細は、第10.1.2項「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

    • 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

      • DecisionPointDictionary.Preprocessing

      • Outside Manager Ruleset

      • DecisionPointDictionary.Postprocessing

    図10-8 外部マネージャ検索デシジョン関数の追加

    図10-8の説明が続きます
    「図10-8 外部マネージャ検索デシジョン関数の追加」の説明

  4. 「選択済」領域で、項目が図10-8に示す順序で表示されていることを確認します。

    順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

  5. 「OK」をクリックします。

複数の警告が表示されます。これらの警告は、後のステップでルールセットにルールを追加すると、削除されます。

10.3.8.2 ActionTypeのJava実装クラスの作成方法

サンプル・アプリケーションを作成し、ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionTypeのJava実装クラスを作成する必要があります。ActionTypeのすべてのサブクラスは、abstractのexecメソッドを実装する必要があります。

ActionTypeのJava実装クラスを作成する手順は、次のとおりです。

  1. Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。

  2. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。

  3. 右クリックして、リストから「新規」を選択します。

  4. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

  5. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

  6. 「OK」をクリックします。

  7. 図10-9に示すように、「Javaクラスの作成」ダイアログで次のプロパティを構成します。

  8. 「OK」をクリックします。

    Oracle JDeveloperによってJavaクラスが表示されます。

  9. このコードを、例10-4に示すコードで置き換えます。

    例10-4 ActionType Java実装

    package com.example;
     
    import oracle.rules.sdk2.decisionpoint.ActionType;
    import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
     
    public class MessageAction extends ActionType {
        public MessageAction() {
            super();
        }
     
        public void exec(DecisionPointInstance decisionPointInstance) {
            System.out.println(message);
        }
        
        private String message = null;
     
        public void setMessage(String message) {
            this.message = message;
        }
     
        public String getMessage() {
            return message;
        }
    }
    
  10. アプリケーション・ナビゲータで、「MessageAction.java」を右クリックし、リストから「メイク」を選択します。

10.3.8.3 メッセージ・アクションのJavaファクトをインポートする方法

新しいJavaクラスを作成したため、後でルールを作成するときに使用できるように、このクラスをルール・デザイナのJavaファクト・タイプとして追加する必要があります。

Javaファクト・タイプを作成する手順は、次のとおりです。

  1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

  2. 「Javaファクト」タブを選択します。

  3. 「作成」をクリックします。

  4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「MessageAction」チェック・ボックスを表示します。

  5. 図10-10に示すように、「MessageAction」チェック・ボックスを選択します。

    図10-10 メッセージ・アクション・タイプによるJavaファクトの作成

    図10-10の説明が続きます
    「図10-10 メッセージ・アクション・タイプによるJavaファクトの作成」の説明

  6. 「OK」をクリックします。

    図10-11に示すように、ファクトが表に追加されます。

    図10-11 メッセージ・アクション・タイプのJavaファクトの追加

    図10-11の説明が続きます
    「図10-11 メッセージ・アクション・タイプのJavaファクトの追加」の説明

10.3.8.4 マネージャ検索ルールの追加方法

従業員とは別の部門にいるマネージャを検索するルールを追加します。

別部門のマネージャ検索ルールを追加する手順は、次のとおりです。

  1. ルール・デザイナで、「Outside Manager Ruleset」タブを選択します。

  2. 「追加」をクリックし、リストから「ルールの作成」を選択します。

  3. デフォルトのルール名「Rule_1」を選択して、ルールの名前を変更します。これによりテキスト入力領域が表示されます。名前を入力します。たとえば、Find managers in different departmentと入力します。[Enter]を押して名前を適用します。

  4. 「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

  5. 図10-12に示すように、ルールの「拡張モード」を選択します。

    図10-12 別部門のマネージャ検索ルールの追加

    図10-12の説明が続きます
    「図10-12 別部門のマネージャ検索ルールの追加」の説明

  6. 図10-13に示すように、ルールを入力します。「THEN」領域に表示されているルールのアクションは、長すぎて図内に表示しきれません。作成する完全なアクションには、次の項目を含めます。

    "Employee " +  Employee.FirstName + " " + Employee.LastName + "(" +
     Employee.EmployeeId + ")"+ " in dept " + Employee.DepartmentId  + " has
     manager outside of department, " +  Manager.FirstName + " " + Manager.LastName
     + "(" + Manager.EmployeeId + ")" + " in dept " + Manager.DepartmentId
    

    図10-13 別部門のマネージャ検索ルール

    図10-13の説明が続きます
    「図10-13 別部門のマネージャ検索ルール」の説明

10.3.8.5 外部マネージャ・ファインダ・クラスの追加方法

外部マネージャ・ファインダ・クラスを追加します。このクラスはデシジョン・ポイントを使用して、デシジョン関数を実行します。

外部マネージャ・ファインダ・クラスを追加する手順は、次のとおりです。

  1. Chapter10プロジェクトを選択します。

  2. 右クリックして「新規」を選択します。

  3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

  4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

  5. 「OK」をクリックします。

  6. 「名前」フィールドにOutsideManagerFinderと入力します。

  7. 「OK」をクリックします。

  8. このクラスのコンテンツを、例10-5に示すコードで置き換えます。

例10-5 デシジョン・ポイントを使用する外部マネージャ・ファインダJavaクラス

package com.example;
 
import java.util.ArrayList;
 
import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
 
import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;
 
public class OutsideManagerFinder {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
 
    private static final DictionaryFQN DICT_FQN = 
                  new DictionaryFQN("com.example", "Chapter10Rules");
 
    private static final String DF_NAME = "FindOutsideManagers";
 
    private DecisionPoint dp = null;
 
    public OutsideManagerFinder() {
        try {
            dp = new DecisionPointBuilder()
                              .with(DICT_FQN)
                              .with(DF_NAME)
                              .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
    
    public void run() {
        final ApplicationModule am = 
                  Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);        
        final DecisionPointInstance point = dp.getInstance();
        point.setInputs(new ArrayList<Object>(){{ add(vo); }});
        try {
            point.invoke();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
 
    public static void main(String[] args) {
        OutsideManagerFinder omf = new OutsideManagerFinder();
        omf.run();
    }
 
}

10.3.8.6 ローカル・ディクショナリ・アクセスのADF META INFの更新方法

ADF-META-INFファイルの、ディクショナリにアクセスするためのMDS情報を更新する必要があります。MDSを持つローカル・ファイルを使用して、Oracle Business Rulesディクショナリにアクセスできます。ただし、一般的に、本番環境のOracle Business Rulesでは、ディクショナリ・アクセスにこの手順を使用しません。本番環境でのデシジョン・ポイントを使用したMDSによるディクショナリへのアクセスの詳細は第7.5項「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

ADF-META-INFを更新します。

  1. 「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。

  2. 「ディスクリプタ」フォルダおよび「ADF META-INF」フォルダを開きます。

  3. adf-config.xmlをダブルクリックして、このファイルを開きます。

  4. 「ソース」タブをクリックして、adf-config.xmlのソースを表示します。

  5. </adf-config>タグを閉じる前に、例10-6に示すようにadf-config.xmlにMDS情報を追加します。

    例10-6 ローカル・ディクショナリ・アクセス用のadf-config.xmlへのMDS要素の追加

       <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
        <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config">
          <persistence-config>
            <metadata-namespaces>
              <namespace metadata-store-usage="mstore-usage_1" path="/"/>
            </metadata-namespaces>
            <metadata-store-usages>
              <metadata-store-usage id="mstore-usage_1">
                <metadata-store class-name="oracle.mds.persistence.stores.file.FileMetadataStore">
                  <property name="metadata-path"
                            value="C:\jdevinstance\mywork\Chapter10\.adf\"/>
                </metadata-store>
              </metadata-store-usage>
            </metadata-store-usages>
          </persistence-config>
        </mds-config>
      </adf-mds-config>
    
  6. 属性metadata-pathを持つ<property>要素で、使用しているシステムのアプリケーションの.adfディレクトリに一致するようにパスを変更します。

MDSでアクセス可能な場所に定義をコピーします。

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーション、Chapter10プロジェクトおよびsrcフォルダにナビゲートし、comフォルダを選択およびコピーします。

  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

  3. comフォルダをこのディレクトリにコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびChapter10プロジェクトにナビゲートし、Oracle Business Rulesディクショナリを含むoracleディレクトリをコピーします。

  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

  3. oracleフォルダをこのディレクトリにコピーします。

10.3.8.7 外部マネージャ・ファインダをチェックするプロジェクトの作成および実行方法

従業員が別の部門にいるマネージャの検索ルールを実行して、プロジェクトを作成しおよびテストできます。

OutsideManagerFinder構成を作成します。

  1. 「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

  2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

  3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、OutsideManagerFinderと入力します。

  4. 「OK」をクリックします。

  5. 「OutsideManagerFinder」を選択した状態で、「編集」をクリックします。

  6. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

  7. src\com\exampleフォルダから「OutsideManagerFinder.java」を選択します。

  8. 「開く」をクリックします。

  9. 「実行構成の編集」ダイアログで「OK」をクリックします。

  10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行します。

  1. 「プロジェクトの実行」アイコンの横にあるドロップダウン・メニューから、「OutsideManagerFinder」を選択します。

  2. 例10-7に示すように、この構成を実行すると、出力が生成されます。

    例10-7 OutsideManagerFinderルールセットの実行

    Emp Shelley Higgins(205) in dept 110 manager outside of department, Neena Kochhar(101) in dept 90
    Emp Hermann Baer(204) in dept 70 manager outside of department, Neena Kochhar(101) in dept 90
    Emp Susan Mavris(203) in dept 40 manager outside of department, Neena Kochhar(101) in dept 90
    Emp Michael Hartstein(201) in dept 20 manager outside of department, Steven King(100) in dept 90
    Emp Jennifer Whalen(200) in dept 10 manager outside of department, Neena Kochhar(101) in dept 90
    Emp Kimberely Grant(178) in dept null manager outside of department, Eleni Zlotkey(149) in dept 80
    Emp Eleni Zlotkey(149) in dept 80 manager outside of department, Steven King(100) in dept 90
    Emp Gerald Cambrault(148) in dept 80 manager outside of department, Steven King(100) in dept 90
    Emp Alberto Errazuriz(147) in dept 80 manager outside of department, Steven King(100) in dept 90
    Emp Karen Partners(146) in dept 80 manager outside of department, Steven King(100) in dept 90
    Emp John Russell(145) in dept 80 manager outside of department, Steven King(100) in dept 90
    Emp Kevin Mourgos(124) in dept 50 manager outside of department, Steven King(100) in dept 90
    Emp Shanta Vollman(123) in dept 50 manager outside of department, Steven King(100) in dept 90
    Emp Payam Kaufling(122) in dept 50 manager outside of department, Steven King(100) in dept 90
    Emp Adam Fripp(121) in dept 50 manager outside of department, Steven King(100) in dept 90
    Emp Matthew Weiss(120) in dept 50 manager outside of department, Steven King(100) in dept 90
    Emp Den Raphaely(114) in dept 30 manager outside of department, Steven King(100) in dept 90
    Emp Nancy Greenberg(108) in dept 100 manager outside of department, Neena Kochhar(101) in dept 90
    Emp Alexander Hunold(103) in dept 60 manager outside of department, Lex De Haan(102) in dept 90
    

10.3.9 部門マネージャ・ルールセットの追加および実行方法

部門マネージャ・ルールセットを実行するサンプル・コードは、setViewObjectメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。すべてのデシジョン関数コールは、同じRuleSession内で発生します。デシジョン関数のコールとコールの間に、RuleSessionによって、以前のデシジョン関数コールのすべての状態が保存されます。このため、以前のコール時にアサートされたオブジェクトは、指定するルールセットによって明示的に取り消されない場合、次のコールの作業メモリーに残ります。状態が保持されている場合は、取消しアクションを使用するルールを持つルールセットを実行して、コールとコールの間にすべてのファクトまたは選択したファクトを取り消すことができます。このルールセットは、デシジョン・ポイントで使用する同じデシジョン関数の一部として実行されます。図10-15では、Retract all employeesルールセットによるこれらのファクトの取消しの例を示しています。詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

10.3.9.1 部門マネージャ・ファインダ・ルールセットの追加方法

部門マネージャ・ファインダ・ルールセットを追加します。

部門マネージャ・ファインダ・ルールセットを追加する手順は、次のとおりです。

  1. Rules Designerで、「ルールセットの作成」をクリックします。

  2. 「ルールセットの作成」ダイアログで、「名前」フィールドにDepartment Manager Finder Rulesetと入力します。

  3. 「OK」をクリックします。

10.3.9.2 部門マネージャ・ファインダ・ルールセットの検索ルールの追加方法

次に、部門マネージャを検索する検索ルールを追加します。このルールは、Oracle ADFビジネス・コンポーネント・ファクト・タイプでのツリー・モードルールの使用を示します。

部門マネージャ・ファインダ・ルールを追加します。

  1. ルール・デザイナで、「Department Manager Finder Ruleset」を選択します。

  2. 「追加」アイコンの横にあるドロップダウン・メニューで、「ルールの作成」をクリックします。

  3. 名前「Rule_1」を選択し、Findを入力して、ルールの名前を変更します。

  4. 「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

  5. ルールで、「ツリー・モード」を選択します。

  6. 図10-14に示すように、Findルールのテストおよびアクションを入力します。「THEN」領域のアサートは長すぎて図に表示しきれません。図10-14に表示されていない、このルールの完全なテキストを次に示します。

    Employee.FirstName + " " + Employee.LastName + " is the manager of dept " + Employee/DepartmentsView.DepartmentName
    

    図10-14 部門マネージャ・ファインダ・ルールセットへの検索ルールの追加

    図10-14の説明が続きます
    「図10-14 部門マネージャ・ファインダ・ルールセットへの検索ルールの追加」の説明

10.3.9.3 従業員取消しルールセットの追加方法

従業員ファクト・タイプ・インスタンスを取り消すルールセットを追加します。これにより、従業員ファクト・タイプが、デシジョン関数の起動と起動の間に削除されます。

従業員取消しルールセットを追加する手順は、次のとおりです。

  1. Retract Employees Rulesetを追加します。

  2. 図10-15に示すように、「Retract Employees Ruleset」でルールを追加し、このルールにRetract all employeesという名前を付けます。

    図10-15 すべての従業員の取消しルールの追加

    図10-15の説明が続きます
    「図10-15 すべての従業員の取消しルールの追加」の説明

10.3.9.4 部門マネージャ検索デシジョン関数の追加方法

部門マネージャ・ファインダ・ルールセット用のデシジョン関数を作成します。このデシジョン関数を使用して、デシジョン・ポイントからルールセットを実行します。

部門マネージャ・ファインダ・ルールセットのデシジョン関数を追加する手順は、次のとおりです。

  1. 「デシジョン関数」ナビゲーション・タブをクリックします。

  2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

  3. 図10-16に示すように、デシジョン関数のフィールドを更新します。

    • 「名前」に値FindDepartmentManagersを入力します。

    • 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

      • 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

      • 「ツリー」チェック・ボックスを選択します。

      このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

    • 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

      • DecisionPointDictionary.Preprocessing

      • Department Manager Finder Ruleset

      • Retract Employees

      • DecisionPointDictionary.Postprocessing

    図10-16 部門マネージャ検索デシジョン関数の追加

    図10-16の説明が続きます
    「図10-16 部門マネージャ検索デシジョン関数の追加」の説明

  4. 「選択済」領域で、項目が図10-16に示す順序で表示されていることを確認します。

    順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

  5. 「OK」をクリックします。

10.3.9.5 部門マネージャ・ファインダJavaクラスの追加方法

部門マネージャ・ファインダ・クラスを追加します。このクラスには、デシジョン関数を実行するデシジョン・ポイントが指定されたコードが含まれます。

部門マネージャ・ファインダ・クラスを追加します。

  1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

  2. 右クリックして「新規」を選択します。

  3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

  4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

  5. 「OK」をクリックします。

  6. 「名前」フィールドにDeptManagerFinderと入力します。

  7. 「OK」をクリックします。

  8. このクラスのコンテンツを、例10-8に示すコードで置き換えます。

例10-8 部門マネージャ・ファインダ・クラス

package com.example;
 
import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.server.DBTransactionImpl2;
 
import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;
 
public class DeptManagerFinder {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
 
    private static final String DF_NAME = "FindDepartmentManagers";
 
    private static final DictionaryFQN DICT_FQN = 
                    new DictionaryFQN("com.example", "Chapter10Rules");
 
    private DecisionPoint dp = null;
 
    public DeptManagerFinder() {
    
        try {
            dp = new DecisionPointBuilder()
                              .with(DICT_FQN)
                              .with(DF_NAME)
                              .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
 
    public void run() {
        final ApplicationModule am = 
                Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);
        final DecisionPointInstance point = dp.getInstance();
        
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setViewObject(vo);
        try {
            point.invoke();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
    
    public static void main(String[] args) {
        new DeptManagerFinder().run();
    }
}

10.3.9.6 MDSでアクセス可能な場所にディクショナリをコピーする方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびプロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。

  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

  3. oracleフォルダをこのディレクトリにコピーします。

10.3.9.7 マネージャ検索ルールをチェックするプロジェクトの作成および実行方法

部門マネージャ・ファインダ・ルールセットを実行するプロジェクトを作成およびテストできます。

プロジェクトを作成します。

  1. 「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

  2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

  3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、DeptManagerFinderと入力します。

  4. 「設定のコピー元」フィールドにDefaultと入力します。

  5. 「OK」をクリックします。

  6. 「DeptManagerFinder」を選択した状態で、「編集」をクリックします。

  7. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

  8. src\com\exampleディレクトリから「DeptManagerFinder.java」を選択します。

  9. 「開く」をクリックします。

  10. 「実行構成の編集」ダイアログで「OK」をクリックします。

  11. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行します。

  1. 「プロジェクトの実行」アイコンの横にあるメニューから、「DeptManager Finder」を選択します。

  2. 例10-9に示すように、デシジョン・ポイントを実行すると、出力が生成されます。

    例10-9 Department Manager Finder Rulesetの出力

    Michael Hartstein is the manager of dept Marketing
    John Russell is the manager of dept Sales
    Adam Fripp is the manager of dept Shipping
    Den Raphaely is the manager of dept Purchasing
    Alexander Hunold is the manager of dept IT
    Shelley Higgins is the manager of dept Accounting
    Hermann Baer is the manager of dept Public Relations
    Susan Mavris is the manager of dept Human Resources
    Jennifer Whalen is the manager of dept Administration
    Nancy Greenberg is the manager of dept Finance
    Steven King is the manager of dept Executive
    Shelley Higgins is the manager of dept Accounting
    Hermann Baer is the manager of dept Public Relations
    Susan Mavris is the manager of dept Human Resources
    Jennifer Whalen is the manager of dept Administration
    Nancy Greenberg is the manager of dept Finance
    Alexander Hunold is the manager of dept IT
    Alexander Hunold is the manager of dept IT
    Nancy Greenberg is the manager of dept Finance
    Den Raphaely is the manager of dept Purchasing
    Adam Fripp is the manager of dept Shipping
    John Russell is the manager of dept Sales
    Jennifer Whalen is the manager of dept Administration
    Michael Hartstein is the manager of dept Marketing
    Susan Mavris is the manager of dept Human Resources
    Hermann Baer is the manager of dept Public Relations
    Shelley Higgins is the manager of dept Accounting
    

この例のツリー・モード・ルールで作業しているとき、出力に重複エントリがある場合、この重複エントリは、ビュー・オブジェクトのグラフの異なる部分にある同じデータで複数のルールを起動したことによって発生したものです。

10.3.10 従業員昇給ルールセットと従業員取消しルールセットの追加および実行方法

昇給ルールセットを実行するサンプル・コードでは、setViewObjectメソッドを使用するビュー・オブジェクトを指定して、デシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。デシジョン関数のコールとコールの間にこれらのインスタンスが作業メモリーに残らないよう、従業員取消しルールセットによって、各コールでアサートされたEmployeeのインスタンスがすべて取り消されます。例10-10のアクション・タイプは、ActionTypeを使用してViewRowImpl属性の値を変更する方法を示しています。詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

10.3.10.1 昇給ルールセットの追加方法

昇給ルールセットを追加します。

昇給ルールセットを追加する手順は、次のとおりです。

  1. Rules Designerで、「ルールセットの作成」をクリックします。

  2. 「ルールセットの作成」ダイアログで、「名前」フィールドにRaises Rulesetと入力します。

  3. 「OK」をクリックします。

10.3.10.2 昇給ActionTypeのJava実装クラスの作成方法

サンプル・アプリケーションのこの部分を作成し、昇給ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionTypeのJava実装クラスを作成する必要があります。ActionTypeのすべてのサブクラスは、abstractのexecメソッドを実装する必要があります。

昇給ActionTypeのJava実装クラスを作成する手順は、次のとおりです。

  1. Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。

  2. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。

  3. 右クリックして、リストから「新規」を選択します。

  4. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

  5. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

  6. 「OK」をクリックします。

  7. 図10-17に示すように、「Javaクラスの作成」ダイアログで次のプロパティを構成します。

  8. 「OK」をクリックします。

    Oracle JDeveloperによってJavaクラスが表示されます。

  9. このコードを、例10-10に示すコードで置き換えます。

    例10-10 ActionType Java実装

    package com.example;
     
    import oracle.jbo.domain.Number;
     
    import oracle.rules.sdk2.decisionpoint.ActionType;
    import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
     
    public class RaiseAction extends ActionType {
        private double raisePercent;
     
        public void exec(DecisionPointInstance dpi) {
            Number salary = (Number)getViewRowImpl().getAttribute("Salary");
            salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false});
            dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"),
                          getRaisePercent() + "=>" + salary );
            getViewRowImpl().setAttribute("Salary", salary);
        }
     
        public void setRaisePercent(double raisePercent) {
            this.raisePercent = raisePercent;
        }
     
        public double getRaisePercent() {
            return raisePercent;
        }
    }
    
  10. アプリケーション・ナビゲータで、「RaiseAction.java」を右クリックし、リストから「メイク」を選択します。

10.3.10.3 昇給アクションのJavaファクトをインポートする方法

新しいJavaクラスが作成されました。このクラスをルール・デザイナのJavaファクト・タイプとしてインポートし、後でルールを作成するときに使用できるようにします。

Javaファクト・タイプを作成する手順は、次のとおりです。

  1. ルール・デザイナで、「ManagerRules.rules」ディクショナリを選択します。

  2. 「ファクト」ナビゲーション・タブをクリックし、「Javaファクト」タブを選択します。

  3. 「作成」をクリックします。

  4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「RaiseAction」チェック・ボックスを表示します。

  5. 図10-18に示すように、「RaiseAction」チェック・ボックスを選択します。

    図10-18 昇給アクション・クラスからのJavaファクトの作成

    図10-18の説明が続きます
    「図10-18 昇給アクション・クラスからのJavaファクトの作成」の説明

  6. 「OK」をクリックします。

    「Javaファクト」表に昇給アクション・ファクト・タイプが追加されます。

10.3.10.4 12年昇給ルールの追加方法

このルールは、アクション・タイプを使用して、データベース・エントリを更新する方法を示します。

12年昇給ルールを追加する手順は、次のとおりです。

  1. Rules Designerの「Raises Ruleset」で、「ルールの作成」をクリックします。

  2. 名前「Rule_1」を選択し、値Longer than 12 yearsを入力して、ルールの名前を変更します。

  3. 「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

  4. 「拡張モード」を選択します。

  5. 図10-19に示すように、12年昇給しルールを入力します。

    図10-19 昇給ルールセットへの12年より長いルールの追加

    図10-19の説明が続きます
    「図10-19 昇給ルールセットへの12年より長いルールの追加」の説明

10.3.10.5 従業員昇給デシジョン関数の追加方法

従業員昇給ルールセットおよびすべての従業員の取消しルールセット用のデシジョン関数を作成します。

デシジョン関数を追加する手順は、次のとおりです。

  1. 「デシジョン関数」ナビゲーション・タブをクリックします。

  2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

  3. 図10-20に示すように、デシジョン関数のフィールドを更新します。

    • 「名前」に値EmployeeRaisesを入力します。

    • 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

      • 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

      このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

    • 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

      • DecisionPointDictionary.Preprocessing

      • Raises Ruleset

      • Retract Employees Ruleset

      • DecisionPointDictionary.Postprocessing

    図10-20 従業員昇給デシジョン関数の追加

    図10-20の説明が続きます
    「図10-20 従業員昇給デシジョン関数の追加」の説明

  4. 「選択済」領域で、項目が図10-20に示す順序で表示されていることを確認します。

    順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

  5. 「OK」をクリックします。

10.3.10.6 従業員昇給Javaクラスの追加方法

従業員昇給クラスを追加します。これにより、デシジョン関数が実行されます。

従業員昇給クラスを追加する手順は、次のとおりです。

  1. Chapter10プロジェクトを選択します。

  2. 右クリックして「新規」を選択します。

  3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

  4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

  5. 「OK」をクリックします。

  6. 「名前」フィールドにEmployeeRaisesと入力します。

  7. 「OK」をクリックします。

  8. このクラスのコンテンツを、例10-11に示すコードで置き換えます。

例10-11 DeptManagerFinderクラス

package com.example;
 
import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.server.DBTransactionImpl2;
 
import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;
 
 
public class EmployeeRaises {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
    private static final String DF_NAME = "EmployeeRaises";
 
    private static final DictionaryFQN DICT_FQN =
        new DictionaryFQN("com.example", "Chapter10Rules");
 
    private DecisionPoint dp = null;
 
    public EmployeeRaises() {
 
        try {
            dp = new DecisionPointBuilder()
                    .with(DICT_FQN)
                    .with(DF_NAME)
                    .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
 
    public void run() {
        final ApplicationModule am =
            Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);
        final DecisionPointInstance point = dp.getInstance();
 
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setViewObject(vo);
        try {
            point.invoke();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
        
        for (DecisionPoint.NamedValue result : point.getResults()){
            System.out.println(result.getName() +  " " + result.getValue());
        }
        
    }
 
    public static void main(String[] args) {
        new EmployeeRaises().run();
    }
}

10.3.10.7 ディクショナリのコピー方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10フォルダおよびChapter10プロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。

  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

  3. oracleフォルダをこのディレクトリにコピーします。

10.3.10.8 昇給ルールをチェックするプロジェクトの作成および実行方法

従業員昇給ルールセットを実行して、プロジェクトを作成およびテストできます。

プロジェクトを作成します。

  1. 「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

  2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

  3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、EmployeeRaisesと入力します。

  4. 「設定のコピー元」フィールドにDefaultと入力します。

  5. 「OK」をクリックします。

  6. 「EmployeeRaises」を選択した状態で、「編集」をクリックします。

  7. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

  8. src\com\exampleフォルダから「EmployeeRaises.java」を選択します。

  9. 「開く」をクリックします。

  10. 「実行構成の編集」ダイアログで「OK」をクリックします。

  11. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行します。

  1. 「プロジェクトの実行」アイコンの横にあるメニューから、「EmployeeRaises」を選択します。

  2. 例10-12に示すように、Oracle JDeveloperに出力が表示されます。

    例10-12 Raises Rulesetの出力

    raise for 100 0.03=>81.7
    raise for 101 0.03=>1872.46
    raise for 102 0.03=>60596.78
    raise for 103 0.03=>31146.26
    raise for 104 0.03=>20159.43
    raise for 108 0.03=>35822.68
    raise for 109 0.03=>26084.5
    raise for 114 0.03=>27500.92
    raise for 115 0.03=>7524.5
    raise for 120 0.03=>16262.34
    raise for 121 0.03=>16183.41
    raise for 122 0.03=>15591.35
    raise for 131 0.03=>3671.33
    raise for 133 0.03=>4567.98
    raise for 137 0.03=>4838.1
    raise for 141 0.03=>4703.71
    raise for 142 0.03=>4044.79
    raise for 145 0.03=>17734.79
    raise for 146 0.03=>17101.39
    raise for 147 0.03=>15201.23
    raise for 150 0.03=>12667.7
    raise for 151 0.03=>12034.32
    raise for 156 0.03=>13047.73
    raise for 157 0.03=>12395.35
    raise for 158 0.03=>11400.93
    raise for 159 0.03=>10134.16
    raise for 168 0.03=>14567.86
    raise for 174 0.03=>13934.48
    raise for 175 0.03=>11147.58
    raise for 184 0.03=>5480.03
    raise for 185 0.03=>5193.76
    raise for 192 0.03=>5219.1
    raise for 193 0.03=>4940.41
    raise for 200 0.03=>5740.99
    raise for 201 0.03=>16962.05
    raise for 203 0.03=>8481.03
    raise for 204 0.03=>13047.73
    raise for 205 0.03=>15657.27
    raise for 206 0.03=>10829.62