2017-03-02 10 views
0

私は2つのルールを持つスプレッドシートでドループ決定表を持っています。 (この例は非常に単純化された、私が働いている一つはたくさん複数のルールを有する。)デシジョンテーブルの事実を更新してください:Drools

enter image description here 最初のルールチェックは、量がより多いまたは500に等しい場合そうである場合、それは400にステータスを設定します。 第2のルールは、ステータスが400であるかどうかをチェックします。存在する場合は、メッセージ変数を設定します。 問題は、シーケンシャルが設定されていても、2番目のルールを起動できないということです。無限ループを防ぐためにno-loopとlock-on-activeを使用する必要もあります。

私の目標は、ルールをトップダウンにすることです。ルールは、以前のルールでファクト/オブジェクトに加えられた変更に依存する可能性があります。

この問題を解決する方法はありますか? ご協力いただきありがとうございます。

package com.example; 

import org.kie.api.KieServices; 
import org.kie.api.runtime.KieContainer; 
import org.kie.api.runtime.KieSession; 

public class SalaryTest { 

    public static final void main(String[] args) { 
     try { 
      // load up the knowledge base 
      KieServices ks = KieServices.Factory.get(); 
      KieContainer kContainer = ks.getKieClasspathContainer(); 
      KieSession kSession = kContainer.newKieSession("ksession-dtables"); 

      Salary a = new Salary(); 
      a.setAmount(600); 

      kSession.insert(a); 
      kSession.fireAllRules(); 


     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 

    public static class Salary{ 
     private String message; 
     private int amount; 
     private int status; 

     public String getMessage() { 
      return message; 
     } 
     public void setMessage(String message) { 
      this.message = message; 
     } 
     public int getAmount() { 
      return amount; 
     } 
     public void setAmount(int amount) { 
      this.amount = amount; 
     } 
     public int getStatus() { 
      return status; 
     } 
     public void setStatus(int status) { 
      this.status = status; 
     } 

    } 
} 

答えて

1

属性ロック・オン同じアジェンダグループのルールのグループから、最初のもの以降のファイアリングをすべて無効にします。この列を削除します。

ルールを特定の順序で実行する予定はありません。ファクトの状態を正確に記述し、ルールをトリガするロジックを記述します。場合によっては、複数のステータス設定が行われるのを避けるため、または適切な設定が行われないように、

rule "set status" 
when 
    $s: Salary(amount >= 500.0 && < 600.0, status == 0) 
then 
    modify($s){ setStatus(400) } 
end 

と書く必要があります。しかし、あなたのルールはもっと説得力があり読みやすくなります。

ルールの属性は最後の手段であると考えてください。

-1

次のように列Hでアクションを交換してください:

現在のソリューション:

a.setStatus($param);update(a); 

新ソリューション:

modify(a) { 
    setStatus($param) 
} 
+0

ありがとうございましたが、その変更を行ってもまだ第2のルールが発生しません –

+0

これは、事実を更新するための代替構文です。 – laune

関連する問題