第4章 Business Central における DRL ルールの作成


Business Central で、プロジェクトに対して DRL ルールを作成して管理できます。パッケージに作成またはインポートするデータオブジェクトに基づいて、各 DRL ファイルで、ルールの条件、アクション、そしてルールに関連するその他のコンポーネントを定義します。

手順

  1. Business Central で、Menu Design Projects に移動して、プロジェクト名をクリックします。
  2. Add Asset DRL ファイル をクリックします。
  3. 参考となる DRL ファイル 名を入力し、適切な パッケージ を選択します。指定するパッケージは、必要なデータオブジェクトが割り当てられている、またはこれから割り当てるパッケージにする必要があります。

    ドメイン固有言語 (DSL) アセットがプロジェクトに定義されている場合は、Show declared DSL sentences を選択することもできます。この DSL アセットは、DRL デザイナーで定義する条件およびアクションに使用できるオブジェクトです。

  4. OK をクリックして、ルールアセットを作成します。

    新しい DRL ファイルが、Project ExplorerDRL パネルに追加されます。Show declared DSL sentences オプションを選択した場合は、DSLR パネルに追加されます。この DRL ファイルを割り当てたパッケージは、ファイルの上位にリストされます。

  5. DRL デザイナーの左パネルの Fact types リストで、ルールに必要なすべてのデータオブジェクトとデータオブジェクトフィールドがリストされていることを確認します (それぞれを展開します)。リストされていない場合は、DRL ファイルの import 命令文を使用して、その他のパッケージから関連するデータオブジェクトをインポートするか、パッケージにデータオブジェクトを作成します。
  6. データオブジェクトをすべて配置したら、DRL デザイナーの Model タブに戻り、以下のいずれかのコンポーネントで DRL ファイルを定義します。

    DRL ファイルのコンポーネント

    package  //automatic
    
    import
    
    function  //optional
    
    query  //optional
    
    declare   //optional
    
    rule
    
    rule
    
    ...
    Copy to Clipboard Toggle word wrap

    • package: (自動) これは、DRL ファイルを作成し、パッケージを選択すると定義されます。
    • import: このパッケージ、または DRL ファイルで使用するその他のパッケージのデータオブジェクトを指定します。パッケージとデータオブジェクトを package.name.object.name 形式で指定し、1 行につき 1 つインポートします。

      データオブジェクトのインポート

      import mortgages.mortgages.LoanApplication;
      Copy to Clipboard Toggle word wrap

    • function: (任意) DRL ファイルのルールが使用する関数を指定します。関数は、ルールのソースファイルにセマンティックコードを追加します。関数は、特に、ルールのアクション (then) 部分が繰り返し使用され、パラメーターだけがルールごとに異なる場合に便利です。DRL ファイルのルールで、関数を宣言したり、静的メソッドを関数としてインポートしたりして、ルールの アクション (then) 部分に、名前を指定して関数を使用します。

      ルールに関数を宣言して使用 (オプション 1)

      function String hello(String applicantName) {
          return "Hello " + applicantName + "!";
      }
      
      rule "Using a function"
        when
          eval( true )
        then
          System.out.println( hello( "James" ) );
      end
      Copy to Clipboard Toggle word wrap

      ルールに関数をインポートして使用 (オプション 2)

      import function my.package.applicant.hello;
      
      rule "Using a function"
        when
          eval( true )
        then
          System.out.println( hello( "James" ) );
      end
      Copy to Clipboard Toggle word wrap

    • query: (任意) DRL ファイルのルールに関連するファクトに対してデシジョンエンジンを検索するのに使用します。クエリーは、定義した条件セットを検索するため、when または then を指定する必要はありません。クエリー名は KIE ベースでグローバルとなるため、プロジェクトにあるその他のすべてのルールクエリーと重複しないようにする必要があります。クエリーの結果に戻るには、ksession.getQueryResults("name") を使用して、従来の QueryResults 定義を構成します ("name" はクエリー名)。これにより、クエリーの結果が返り、クエリーに一致したオブジェクトを取得できるようになります。DRL ファイルのルールに、クエリーと、クエリー結果パラメーターを定義します。

      ルールで、年齢が 21 歳未満の場合のクエリーと、その結果

      query "people under the age of 21"
          person : Person( age < 21 )
      end
      
      QueryResults results = ksession.getQueryResults( "people under the age of 21" );
      System.out.println( "we have " + results.size() + " people under the age  of 21" );
      
      rule "Underage"
        when
          application : LoanApplication( )
          Applicant( age < 21 )
        then
          application.setApproved( false );
          application.setExplanation( "Underage" );
      end
      Copy to Clipboard Toggle word wrap

    • declare: (任意) DRL ファイルのルールが使用する新しいファクトタイプを宣言します。Red Hat Process Automation Manager の java.lang パッケージのデフォルトは Object ですが、必要に応じて DRL ファイルに別のタイプを宣言することもできます。DRL ファイルにファクトタイプを宣言すると、Java などの低級言語でモデルを作成せず、デシジョンエンジンに直接新しいファクトモデルを定義するようになります。

      新しいファクトタイプの宣言および使用

      declare Person
        name : String
        dateOfBirth : java.util.Date
        address : Address
      end
      
      rule "Using a declared type"
        when
          $p : Person( name == "James" )
        then   // Insert Mark, who is a customer of James.
          Person mark = new Person();
          mark.setName( "Mark" );
          insert( mark );
      end
      Copy to Clipboard Toggle word wrap

    • rule: DRL ファイルで各ルールを定義します。ルールは、rule "name" 形式のルール名、ルールの動作 (salienceno-loop など) を定義する任意の属性、when および then 定義が続きます。同じパッケージにルール名を重複させることはできません。ルールの when 部分には、アクションを実行する条件が含まれます。たとえば、銀行が、ローンの申し込みを 21 歳以上に限定した場合、Underage ルールの when 条件は Applicant( age < 21 ) になります。ルールの then 部分には、ルールの条件が一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合、then アクションは setApproved( false ) になり、申込者の年齢条件を満たしていないためにローンの申し込みは承認されません。条件 (when) およびアクション (then) は、パッケージで利用可能なデータオブジェクトに基づいて、任意の制約、バインディングなどのサポートされる DRL 要素を持つ、定められている一連のファクトパターンで構成されます。このパターンは、定義したオブジェクトにルールがどのように影響するかを指定します。

      申込者の年齢制限に関するルール

      rule "Underage"
        salience 15
        dialect "mvel"
        when
          application : LoanApplication( )
          Applicant( age < 21 )
        then
          application.setApproved( false );
          application.setExplanation( "Underage" );
      end
      Copy to Clipboard Toggle word wrap

      少なくても、各 DRL ファイルに package コンポーネント、import コンポーネント、rule コンポーネントを指定する必要があります。他のすべてのコンポーネントは任意です。

      図4.1 必要なコンポーネントおよび任意のルール属性を持つ DRL ファイルのサンプル

  7. ルールのコンポーネントをすべて定義したら、DRL デザイナーの右上ツールバーで Validate をクリックし、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
  8. DRL デザイナーで Save をクリックして、設定した内容を保存します。

4.1. DRL ルールへの WHEN 条件の追加

ルールの when 部分には、アクションを実行するのに必要な条件が含まれます。たとえば、銀行のローン申し込みに年齢制限 (21 歳以上) が必要な場合、Underage ルールの when 条件は Applicant( age < 21 ) となります。パッケージで利用可能なデータオブジェクトに基づいて、指定した一連のパターンおよび制約と、任意のバインディング、その他のサポートされる DRL 要素で構成されます。

前提条件

  • package は DRL ファイルに定義されます。これは、ファイルの作成時に行われます。
  • ルールで使用したデータオブジェクトの import リストが、DRL ファイルの package 行の下に定義されます。データオブジェクトは、このパッケージ、または別の Business Central パッケージから使用できます。
  • rule 名は、packageimport、または DRL ファイル全体に適用されるその他の行の下に、rule "name" という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salienceno-loop など) を定義する任意のルール属性は、ルール名の下、when セクションの前に定義します。

手順

  1. DRL デザイナーで、ルールに when を入力して、条件命令文を追加します。when セクションは、ルールの条件を定義するファクトパターンで構成されますが、ファクトパターンが 1 つも追加されない場合もあります。

    when セクションを空にすると、デシジョンエンジンで fireAllRules() を呼び出すたびに、then セクションのアクションが実行します。これは、デシジョンエンジンのステートを設定するルールを使用する場合に便利です。

    条件のないルール

    rule "bootstrap"
      when   // empty
    
      then   // actions to be executed once
        insert( new Applicant() );
    end
    
    // The above rule is internally rewritten as:
    
    rule "bootstrap"
      when
        eval( true )
      then
        insert( new Applicant() );
    end
    Copy to Clipboard Toggle word wrap

  2. 一致させる最初の条件のパターンを入力し、任意で制約、バインディング、およびサポートされる DRL 要素を入力します。基本的なパターンフォーマットは patternBinding : patternType ( constraints ) です。パターンは、パッケージで利用可能なデータオブジェクトに基づいており、then セクションのアクションを発生させるのに必要な条件を定義します。

    • 単純なパターン: 制約のない単純なパターンは、指定したタイプのファクトに一致します。たとえば、次は、申込者が存在することだけが条件になります。

      when
        Applicant( )
      Copy to Clipboard Toggle word wrap
    • 制約のあるパターン: 制約を持つパターンは、指定したタイプのファクトと、追加制限を括弧で指定したパターン (true または false) に一致します。たとえば、次は、申込者が 21 歳に満たないことを条件としています。

      when
        Applicant( age < 21 )
      Copy to Clipboard Toggle word wrap
    • バインディングのあるパターン: パターンのバインディングは簡単な参照となり、ルールのその他のコンポーネントが、定義したバターンに戻って参照します。たとえば、次の例では、LoanApplication のバインディング a が、underage の申込者に関連するアクションとして使用されます。

      when
        a : LoanApplication( )
        Applicant( age < 21 )
      then
        a.setApproved( false );
        a.setExplanation( "Underage" )
      Copy to Clipboard Toggle word wrap
  3. 引き続き、このルールに適用する条件パターンをすべて定義します。以下は、DRL 条件を定義するいくつかのキーワードオプションです。

    • and: 条件コンポーネントを論理積に分類します。接中辞および接頭辞の and がサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべて and と結合します。

      a : LoanApplication( ) and Applicant( age < 21 )
      
      a : LoanApplication( )
      and Applicant( age < 21 )
      
      a : LoanApplication( )
      Applicant( age < 21 )
      
      // All of the above are the same.
      Copy to Clipboard Toggle word wrap
    • or: 条件コンポーネントを論理和に分類します。接中辞および接頭辞の or がサポートされます。

      Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )
      
      Bankruptcy( amountOwed == 100000 )
      or IncomeSource( amount == 20000 )
      Copy to Clipboard Toggle word wrap
    • exists: 存在すべきファクトおよび制約を指定します。これは、ファクトが存在していることを示しているのではなく、ファクトが存在すべきであることを示しています。このオプションは、最初に一致したものだけが適用され、その後一致するものは無視されます。

      exists ( Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ) )
      Copy to Clipboard Toggle word wrap
    • not: 存在するべきでないファクトおよび制約を指定します。

      not ( Applicant( age < 21 ) )
      Copy to Clipboard Toggle word wrap
    • forall: 最初のパターンに一致したすべてのファクトが残りのパターンに一致する制約を作成します。

      forall( app : Applicant( age < 21 )
                    Applicant( this == app, status = 'underage' ) )
      Copy to Clipboard Toggle word wrap
    • from: 条件パターンによりデータが一致するソースを指定します。

      Applicant( ApplicantAddress : address )
      Address( zipcode == "23920W" ) from ApplicantAddress
      Copy to Clipboard Toggle word wrap
    • entry-point: パターンのデータソースに対応するエントリーポイントを定義します。通常は from とともに使用します。

      Applicant( ) from entry-point "LoanApplication"
      Copy to Clipboard Toggle word wrap
    • collect: 構成を条件の一部として使用できる、オブジェクトのコレクションを定義します。この例では、指定した各担保に対して、デシジョンエンジンで保留されているすべての申し込みが ArrayLists に分類されます。申し込みが 3 つ以上ある場合は、このルールが実行します。

      m : Mortgage()
      a : ArrayList( size >= 3 )
          from collect( LoanApplication( Mortgage == m, status == 'pending' ) )
      Copy to Clipboard Toggle word wrap
    • accumulate: オブジェクトのコレクションを処理し、各要素のカスタムアクションを実行し、(制約が true と評価されると) 結果オブジェクトを 1 つ以上返します。このオプションは、collect よりも強力で、柔軟性が高いオプションです。accumulate( <source pattern>; <functions> [;<constraints>] ) 形式を使用します。この例では、minmax、および average は累積関数で、各センサーのすべての測定値から、最低気温、最高気温、そして平均気温の値を計算します。その他のサポートされる関数には、countsumvariancestandardDeviationcollectList、および collectSet があります。

      s : Sensor()
      accumulate( Reading( sensor == s, temp : temperature );
                  min : min( temp ),
                  max : max( temp ),
                  avg : average( temp );
                  min < 20, avg > 70 )
      Copy to Clipboard Toggle word wrap
      高度な DRL オプション

      これは、条件を定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインの『Drools ドキュメンテーション』を参照してください。

  4. ルールの条件コンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
  5. DRL デザイナーで Save をクリックして、設定した内容を保存します。

4.2. DRL ルールへの THEN アクションの追加

ルールの then 部分には、ルールの条件部分に一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合は、Underage ルールの then アクションが setApproved( false ) となり、年齢が基準に達していないためローンの申し込みが承認されません。アクションは、ルールの条件と、パッケージで利用可能オブジェクトに基づいて結果を実行します。

前提条件

  • package は DRL ファイルに定義されます。これは、ファイルの作成時に行われます。
  • ルールで使用したデータオブジェクトの import リストが、DRL ファイルの package 行の下に定義されます。データオブジェクトは、このパッケージ、または別の Business Central パッケージから使用できます。
  • rule 名は、packageimport、または DRL ファイル全体に適用されるその他の行の下に、rule "name" という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salienceno-loop など) を定義する任意のルール属性は、ルール名の下、when セクションの前に定義します。

手順

  1. DRL デザイナーで、ルールの when セクションの後に then を入力して、アクション命令文を追加します。
  2. ルールの条件に基づいて、ファクトパターンに対して実行するアクションを 1 つ以上入力します。

    次は、DRL アクションを定義するキーワードオプションの例です。

    • and: アクションコンポーネントを論理積に分類します。接中辞および接頭辞の and がサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべて and と結合します。

      application.setApproved ( false ) and application.setExplanation( "has been bankrupt" );
      
      application.setApproved ( false );
      and application.setExplanation( "has been bankrupt" );
      
      application.setApproved ( false );
      application.setExplanation( "has been bankrupt" );
      
      // All of the above are the same.
      Copy to Clipboard Toggle word wrap
    • set: フィールドの値を設定します。

      application.setApproved ( false );
      application.setExplanation( "has been bankrupt" );
      Copy to Clipboard Toggle word wrap
    • modify: ファクトに対して修正するフィールドを指定し、変更をデシジョンエンジンに通知します。

      modify( LoanApplication ) {
              setAmount( 100 )
      }
      Copy to Clipboard Toggle word wrap
    • update: フィールドと、修正される関連ファクト全体を指定して、その変更をデシジョンエンジンに通知します。ファクトが変更したら、アップデートした値の影響を受ける可能性がある別のファクトを変更する前に、update を呼び出す必要があります。modify キーワードには、この追加手順がありません。

      update( LoanApplication ) {
              setAmount( 100 )
      }
      Copy to Clipboard Toggle word wrap
    • delete: デシジョンエンジンからオブジェクトを削除します。キーワード retract も DRL デザイナーでサポートされ、同じアクションを実行しますが、キーワード insert との一貫性を保つために delete が推奨されます。

      delete( LoanApplication );
      Copy to Clipboard Toggle word wrap
    • insert: 新しい ファクトを挿入し、ファクトに必要な結果フィールドと値を定義します。

      insert( new Applicant() );
      Copy to Clipboard Toggle word wrap
    • insertLogical: 新しい ファクトをデシジョンエンジンに論理的に挿入し、ファクトに必要な結果フィールドと値を追加します。デシジョンエンジンは、ファクトの挿入および取り消しに対して論理的な決断を行います。定期的な挿入、または指定した挿入の後に、ファクトを明示的に取り消す必要があります。論理挿入の後に、ファクトをアサートした条件が TRUE ではなくなると、ファクトは自動的に取り消されます。

      insertLogical( new Applicant() );
      Copy to Clipboard Toggle word wrap
      高度な DRL オプション

      これは、アクションを定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインの『Drools ドキュメンテーション』を参照してください。

  3. ルールのアクションコンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントをすべて見直し、エラーが表示されなくなるまで再度、ファイルを検証します。
  4. DRL デザイナーで Save をクリックして、設定した内容を保存します。

4.2.1. ルールの属性

ルール属性は、ルールの動作を修正するビジネスルールを指定する追加設定です。次の表では、ルールに割り当て可能な属性の名前と、対応する値を紹介します。

Expand
表4.1 ルールの属性
属性

salience

ルールの優先順位を定義する整数。ルールの salience 値を高くすると、アクティベーションキューに追加したときの優先順位が高くなります。

例: salience 10

enabled

ブール値。このオプションを選択すると、ルールが有効になります。このオプションを選択しないと、ルールは無効になります。

例: enabled true

date-effective

日付定義および時間定義を含む文字列。現在の日時が date-effective 属性よりも後の場合は、このルールがアクティブになります。

例: date-effective "4-Sep-2018"

date-expires

日時定義を含む文字列。現在日時が date-expires 属性よりも後になると、このルールをアクティブにすることはできません。

例: date-expires "4-Oct-2018"

no-loop

ブール値。このオプションを設定すると、以前一致した条件がこのルールにより再トリガーとなる場合に、このルールを再度アクティブにする (ループする) ことができません。条件を選択しないと、この状況でルールがループされます。

例: no-loop true

agenda-group

ルールを割り当てるアジェンダグループを指定する文字列。アジェンダグループを使用すると、アジェンダをパーティションで区切り、ルールのグループに対する実行をさらに制御できます。フォーカスを取得したアジェンダグループのルールだけがアクティブになります。

例: agenda-group "GroupName"

activation-group

ルールを割り当てるアクティベーション (または XOR) グループを指定する文字列。アクティベーショングループでアクティブにできるルールは 1 つだけです。最初のルールが実行されると、アクティベーショングループの中で、アクティベーションが保留中のルールはすべてキャンセルされます。

例: activation-group "GroupName"

duration

ルールの条件が一致している場合に、ルールがアクティブになってからの時間をミリ秒で定義する長整数値。

例: duration 10000

timer

ルールのスケジュールに対する int (間隔) または cron タイマー定義を指定する文字列。

例: timer "*/5 * * * *" (5 分ごと)

calendar

ルールのスケジュールを指定する Quartz カレンダーの定義。

例: calendars "* * 0-7,18-23 ? * *" (営業時間外を除く)

auto-focus

アジェンダグループ内のルールにのみ適用可能なブール値。このオプションが選択されている場合は、次にルールがアクティブになると、そのルールが割り当てられたアジェンダグループに自動的にフォーカスが移ります。

例: auto-focus true

lock-on-active

ルールフローグループまたはアジェンダグループ内のルールにのみ適用可能なブール値。このオプションを選択すると、次回、ルールのルールフローグループがアクティブになるか、ルールのアジェンダグループがフォーカスを受け取ると、(ルールフローグループがアクティブでなくなるか、アジェンダグループがフォーカスを失うまで) ルールをアクティブにすることができません。これは、no-loop 属性を強力にしたものです。なぜなら、一致するルールのアクティベーションが、(ルールそのものによるものだけでなく) アップデート元にかかわらず破棄されるためです。この属性は、ファクトを修正するルールが多数あり、ルールの再一致と再発行を希望しない計算ルールに適しています。

例: lock-on-active true

ruleflow-group

ルールフローグループを指定する文字列。ルールフローグループで、関連するルールフローによってそのグループがアクティブになった場合に限りルールを発行できます。

例: ruleflow-group "GroupName"

dialect

ルールのコード表記に使用される言語を指定する文字列 (JAVA または MVEL)。デフォルトでは、ルールは、パッケージレベルに指定されている方言を使用します。ここで指定した方言は、ルールのパッケージ方言設定を上書きします。

例: dialect "JAVA"

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat