Solución de incidencias de validación de reglas de negocio de Groovy

Al migrar a una versión actualizada de Groovy, es posible que se produzcan determinadas incidencias que se deben solucionar. Un programa denominado Validador de script de Groovy permite encontrar las reglas que se deben ajustar y proporciona un informe para que pueda solucionar cualquier problema.

Note:

El Validador de script de Groovy solo está disponible cuando la aplicación contiene reglas de negocio de Groovy creadas por el usuario. Consulte Validación de scripts de Groovy para obtener información sobre cómo ejecutar el Validador de script de Groovy.

Después de ejecutar el Validador de script de Groovy desde la aplicación, utilice la información de este tema para resolver incidencias de validación.

Directrices generales

  • Utilice tipos de dato explícitos en lugar de def. Por ejemplo, especifique el tipo de dato explícito para las variables, como String, int, List<String> o Map<String,Integer>.

    Nota: Si utiliza def y la herramienta de validación no lo marca, puede dejarlo como está.

  • Si aparece un error al trabajar con números flotantes, utilice el sufijo "d" para asegurarse de que los números flotantes se tratan como "double" en lugar de como "BigDecimal". Por ejemplo, it.data = 1212121212.111d.

  • Si obtiene un error que no entiende, verifique que la primera línea del script tiene el siguiente aspecto: /*RTPS: */

    Incluso si no tiene ninguna petición de datos en tiempo de ejecución (RTP), asegúrese de que esta sea la primera línea.

    Si tiene RTP, agréguelos a la primera línea de la siguiente manera: /*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */.

Note:

A partir de la actualización de octubre (25.10), ya no tendrá que reemplazar las funciones de fecha en desuso por las funciones de calendario correspondientes como parte del proceso de validación. Esto se resolverá y dejará de ser una incidencia. Los métodos Date.format(), Date.getAt(), Date.parse() etc. funcionarán y ya no mostrarán errores de validación.

Errores y correcciones sugeridas

Table 3-2 Errores y correcciones sugeridas

Error Código de ejemplo Causa posible Posible solución

No existe esa propiedad: <groovy variable name> para la clase: groovy.lang.Binding

N/A

Esto puede ser el resultado de no utilizar el modelo RTPS, y se hace referencia a las variables mediante corchetes o llaves. Esto provoca que el motor de Groovy intente evaluarlas como expresiones de Groovy.

Utilice rtps.<variable name> o vuelva a comprobar las expresiones entre llaves o corchetes.

No se puede asignar el valor de tipo type java.lang.Object a la variable de tipo double

def data = []

double valFor = data[0]

El error se produce porque los datos de la lista no se escriben explícitamente, por lo que Groovy los trata como List<Object>. Al acceder a un elemento de la lista mediante data[0], devuelve un objeto, el cual no se puede asignar directamente a una variable double.

Para resolver esta incidencia, realice una de las siguientes acciones:

  • Escriba la lista de forma explícita.

    Defina la lista con el tipo correcto, como List<Double>.

    Por ejemplo:

    List<Double> data = []

    double valFor010 = data[0]

  • Convierta el valor en double.

    Utilice la sintaxis as double para convertir explícitamente el objeto en un valor doble.

    Por ejemplo:

    def data = []

    double valFor010 = data[0] as double

No se puede asignar el valor de tipo java.lang.Object a la variable de tipo int

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

El error se produce porque el objeto que se asigna no se escribe ni se convierte explícitamente en int. En este caso, finalList.get(3) devuelve un objeto, el cual no se puede asignar directamente a una variable int.

Para resolver esta incidencia, convierta el valor en int.

Utilice la sintaxis as int para convertir explícitamente el objeto en un valor int o utilice la etiqueta as int.

Por ejemplo:

def finalList = mergeList.get(i)

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

int pmntfrequency = finalList.get(3) as int

No se puede asignar el valor de tipo java.util.List <java.lang.String> a la variable de tipo java.lang.String[]

String[] arrGridMbrs = it.getMemberNames()

El error se produce porque it.getMemberNames() devuelve una cadena List<String>, la cual no se puede asignar directamente a una matriz String[].

Para resolver esta incidencia, agregue la conversión as String[] para convertir explícitamente List<String> en una matriz String[].

Por ejemplo:

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

No se puede llamar a lo siguiente:

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

con los argumentos

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

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

El error se produce porque los argumentos List<String> y List<List<String>> se transfieren como List<Object> y List<Object>.

Para resolver esta incidencia, especifique el tipo de dato de la variable.

Por ejemplo:

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

No se puede llamar a lo siguiente:

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

con los argumentos

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

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

El error se produce porque los argumentos List<String> y List<List<String>> se transfieren como List<Object> y List<Object>.

Para resolver esta incidencia, agregue la conversión as String[] para convertir explícitamente List<String> en String[] array.

Por ejemplo:

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

No se puede llamar a lo siguiente:

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

con los argumentos

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

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

El error se produce porque los argumentos List<String> y List<List<String>> se transfieren como List<Object> y List<Object>.

Para resolver esta incidencia, agregue la conversión as String[] para convertir explícitamente List<String> en una matriz String[]

Por ejemplo:

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

No se ha encontrado el método de confrontación java.util.Date#getAt(int)

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

El error se produce porque el método getAt(int), que estaba disponible previamente en versiones anteriores de Groovy, ya no está disponible.

Para resolver esta incidencia, introduzca lo siguiente:

Calendar calendar = Calendar.getInstance()

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

int year = calendar.get(Calendar.YEAR)

No se ha encontrado el método de confrontación java.util.Date#format(java.lang.String)

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

El error se produce porque el método de formato, que estaba disponible previamente en versiones anteriores de Groovy, ya no está disponible.

Para resolver esta incidencia, introduzca lo siguiente:

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

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

No se ha encontrado el método de confrontación 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()]))

Se está transfiriendo List<Cube> al segundo argumento, que espera un 0 o más cubos.

Para resolver esta incidencia, realice una de las siguientes acciones:

  • Asegúrese de que el tipo declarado es correcto y de que el método existe.

  • Introduzca lo siguiente:

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

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

  • Si solo se necesita una dimensión válida para un cubo concreto, introduzca lo siguiente:

    Cube cube = application.getCube("Plan1")

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