2017-03-02 87 views
0

我有一個在Excel電子表格中有兩個規則的決定表。 (這個例子已經大大簡化了,我正在使用的那個有更多的規則。)更新決策表中的事實:Drools

enter image description here 第一條規則檢查金額是否大於或等於500.如果是,則它將狀態設置爲400 第二條規則檢查狀態是否爲400.如果是,則它設置消息變量。 問題是,即使設置了順序,我也無法獲得第二條規則。我也必須使用無循環和鎖定活動來防止無限循環。

我的目標是讓規則自頂而下,後面的規則可能取決於先前規則對事實/對象所做的更改。

有沒有解決這個問題的方法? 任何幫助,將不勝感激,謝謝!

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

謝謝,但是讓這個改變仍然沒有觸發第二條規則 –

+0

這只是更新事實的替代語法。 – laune