解決 Groovy 商業規則驗證問題

當您移轉至已升級版本的 Groovy 時,可能會遇到某些需要解決的問題。稱為 Groovy 指令碼驗證程式的程式會協助尋找需要調整的規則並提供報表,以便修正任何問題。

Note:

只有當應用程式包含使用者建立的 Groovy 商業規則時,才可使用 Groovy 指令碼驗證程式。如需如何執行 Groovy 指令碼驗證程式的相關資訊,請參閱驗證 Groovy 指令碼

您從應用程式執行 Groovy 指令碼驗證程式後,請使用此主題中的資訊來解決驗證問題。

一般指導方針

  • 請使用「明確」資料類型,而非使用 def。例如,為變數指定明確資料類型,例如StringintList<String>,或 Map<String,Integer>

    備註: 如果您正在使用 def,而其未經驗證工具進行標示,則可以保留原樣。

  • 如果您在使用浮點數時發生錯誤,請使用 "d" 後綴來確保浮點數被視為 "double",而不是 "BigDecimal"。例如,it.data = 1212121212.111d

  • 如果您遇到無法理解的錯誤,請確認指令碼第一行顯示如下:/*RTPS: */

    即使您沒有 RTPS,請確定這是第一行。

    如果您有 RTPS,請將它們新增至第一行如下:/*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */

Note:

從 10 月更新 (25.10) 開始,您在驗證程序中,將不再需要以對應的「工作曆」函式取代已棄用的「日期」函式。此問題將被解決,且不再發生。將會使用 Date.format()、Date.getAt()、Date.parse() 等方法,且不再顯示驗證錯誤。

錯誤與建議的修正

Table 3-2 錯誤與建議的修正

錯誤 範例代碼 可能原因 可能的解決方案

沒有此類特性:<groovy variable name> for class: groovy.lang.Binding

N/A

這可能是因為未使用 RTPS 模型,且參考變數時是使用方括號或大括號。這會導致 Groovy 引擎嘗試將它們評估為 Groovy 表示式。

請使用 rtps.<variable name>,或重新檢查大括號或括號內的表示式。

無法將 type java.lang.Object 類型的值指派給 double 類型的變數

def data = []

double valFor = data[0]

發生此錯誤的原因是未明確輸入「清單」資料,所以 Groovy 會將它視為 List<Object>。當您使用 data[0] 從「清單」存取元素時,它會傳回無法直接指派給 double 變數的物件。

若要解決此問題,請執行下列其中一個動作:

  • 明確輸入清單。

    以正確的類型定義清單,例如 List<Double>

    例如:

    List<Double> data = []

    double valFor010 = data[0]

  • 將值轉換成 double

    請使用 as double 語法,將物件明確轉換成 double 值。

    例如:

    def data = []

    double valFor010 = data[0] as double

無法將 java.lang.Object 類型的值指派給 int 類型的變數

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

發生此錯誤的原因是未明確輸入指派的物件,或該物件轉換成 int。在此情況下,finalList.get(3) 會傳回無法直接指派給 int 變數的物件。

若要解決此問題,請將值轉換成 int

使用 as int 語法,將物件明確轉換成 int 值或使用 as int 標記。

例如:

def finalList = mergeList.get(i)

int pmntfrequency = (int) finalList.get(3)

int pmntfrequency = finalList.get(3) as int

無法將 java.util.List <java.lang.String> 類型的值指派給 java.lang.String[] 類型的變數

String[] arrGridMbrs = it.getMemberNames()

發生錯誤,因為 it.getMemberNames() 傳回無法直接指派給 String[] 陣列的 List<String>

若要解決此問題,請新增 as String[] 轉換以明確地將 List<String> 轉換成 String[] 陣列。

例如:

String[] arrGridMbrs = it.getMemberNames() as String[]

無法呼叫下列項目:

oracle.epm.api.grid.DataGridDefinitionBuilder#addPov(java.util.List <java.lang.String>, java.util.List <java.util.List>)

包含引數

[java.util.List <java.lang.Object>, java.util.List <java.lang.Object>]

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

發生錯誤的原因是 List<String>List<List<String>> 引數是以 List<Object>List<Object> 的形式傳入。

若要解決此問題,請指定變數的資料類型。

例如:

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

無法呼叫下列項目:

oracle.epm.api.grid.DataGridDefinitionBuilder#addRow(java.util.List <java.lang.String>, java.util.List <java.util.List>)

包含引數

[java.util.List <java.lang.Object>, java.util.List <java.lang.Object>]

dataGridDefinitionBuilder.addRow(['Account', 'Period'], [['Account1'],['P1']])

發生錯誤的原因是 List<String>List<List<String>> 引數是以 List<Object>List<Object> 的形式傳入。

若要解決此問題,請新增 as String[] 轉換以明確地將 List<String> 轉換成 String[] array

例如:

dataGridDefinitionBuilder.addRow(['Account', 'Period'] as List<String>, [['Account1'],['P1']] as List<List<String>>)

無法呼叫下列項目:

oracle.epm.api.grid.DataGridDefinitionBuilder#addColumn(java.util.List <java.lang.String>, java.util.List <java.util.List>)

包含引數

[java.util.List <java.lang.Object>, java.util.List <java.lang.Object>]

dataGridDefinitionBuilder.addColumn(['Account', 'Period'], [['OCX_Payment Frequency'],['Begbalance']])

發生錯誤的原因是 List<String>List<List<String>> 引數是以 List<Object>List<Object> 的形式傳入。

若要解決此問題,請新增 as String[] 轉換以明確地將 List<String> 轉換成 String[] 陣列

例如:

dataGridDefinitionBuilder.addRow(['Account', 'Period'] as List<String>, [['Account1'],['P1']] as List<List<String>>)

找不到相符的方法 java.util.Date#getAt(int)

rtps.endDate.getDataAsDate().getAt(Calendar.YEAR)

發生此錯誤的原因是先前舊版 Groovy 中提供的 getAt(int) 方法已無法使用。

若要解決此問題,請輸入下列項目:

Calendar calendar = Calendar.getInstance()

calendar.setTime(rtps.endDate.getDataAsDate())

int year = calendar.get(Calendar.YEAR)

找不到相符的方法 java.util.Date#format(java.lang.String)

rtps.endDate.getDataAsDate().format("yyyy-MM-dd")

發生此錯誤的原因是因為先前舊版 Groovy 中提供的格式方法已無法使用。

若要解決此問題,請輸入下列項目:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd")

String formattedDate = sdf.format(rtps.endDate.getDataAsDate())

找不到相符的方法 oracle.epm.api.model.Application#getDimension(java.lang.String, java.util.List)

List <Cube> cube = operation.application.getCubes() Dimension dimScenario = operation.application.getDimension("Scenario", cube.toArray(new Cube[cube.size()]))

List<Cube> 正傳送至預期的第二個引數,以及 0 或多個立方體。

若要解決此問題,請執行下列其中一項作業:

  • 請確定宣告的類型正確,而且方法存在。

  • 輸入下列資訊:

    List <Cube> cubes = operation.application.getCubes()

    Dimension dimScenario = operation.application.getDimension("Scenario", cubes.toArray(new Cube[cube.size()]))

  • 如果只需要適用特定立方體的維度,請輸入下列項目:

    Cube cube = application.getCube("Plan1")

    Dimension dimScenario = operation.application.getDimension("Scenario", cube)