解决 Groovy 业务规则验证问题

当您迁移到 Groovy 的升级版本时,您可能会遇到需要解决的某些问题。一个名为 Groovy 脚本验证器的程序可帮助查找需要调整的规则并提供报表,以便您修复任何问题。

Note:

仅当应用程序包含用户创建的 Groovy 业务规则时,Groovy 脚本验证器才可用。有关如何运行 Groovy 脚本验证器的信息,请参阅“验证 Groovy 脚本”。

从应用程序运行 Groovy 脚本验证器后,使用此主题中的信息解决验证问题。

常规准则

  • 使用显式数据类型,而不是使用 def。例如,为变量指定显式数据类型,例如 StringintList<String>Map<String,Integer>

    注意:如果您要使用 def 并且它未被验证工具标记,则可以将其保留原样。

  • 如果您在使用浮点数时遇到错误,请使用 "d" 后缀来确保浮点数被视为 "double" 而不是 "BigDecimal"。例如 it.data = 1212121212.111d

  • 如果遇到您无法理解的错误,请验证脚本的第一行是否如下所示:/*RTPS: */

    即使您没有 RTP,也请确保这是第一行。

    如果您有 RTP,请将其添加到第一行,如下所示:/*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

不适用

这可能是未使用 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() 返回了 List<String>,而它无法直接分配给 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[] 数组。

例如:

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)