Resolução de Problemas com a Validação da Regra de Negócios Groovy

À medida que migra para uma versão atualizada do Groovy, você pode encontrar alguns problemas que precisam ser resolvidos. Um programa chamado Validador de Scripts Groovy ajuda a encontrar as regras que precisam ser ajustadas e fornece um relatório para que você possa corrigir os problemas.

Note:

O Validador de Scripts Groovy fica disponível somente quando seu aplicativo contém regras de negócios Groovy criadas pelo usuário. Consulte Validação de Scripts Groovy para obter informações sobre como executar o Validador de Script Groovy.

Após executar o Validador de Script Groovy no seu aplicativo, use as informações deste tópico para resolver problemas de validação.

Diretrizes Gerais

  • Use Tipos de Dados Explícitos em vez de def. Por exemplo, especifique o tipo de dados explícito para variáveis, como String, int, List<String> ou Map<String,Integer>.

    Observação: Se você estiver usando a palavra-chave def e ela não for sinalizada pela ferramenta de validação, deixe-a como está.

  • Se receber um erro ao trabalhar com números flutuantes, use o sufixo "d" para garantir que os números flutuantes sejam tratados como "double", em vez de "BigDecimal". Por exemplo, it.data = 1212121212.111d.

  • Se receber um erro que não entende, verifique se a primeira linha do script se parece com: /*RTPS: */

    Mesmo que não tenha RTPs, verifique se esta é a primeira linha.

    Se tiver RTPs, adicione-os à primeira linha desta forma: /*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */.

Note:

A partir da atualização de outubro (25.10), você não precisará mais substituir as funções de Data obsoletas pelas funções de Calendário correspondentes como parte do processo de validação. Isso será resolvido e não será mais um problema. Os métodos Date.format(), Date.getAt(), Date.parse() etc. funcionarão e não mostrarão mais erros de validação.

Erros e Correções Sugeridas

Table 3-2 Erros e Correções Sugeridas

Erro Exemplo de Código Causa Possível Solução Possível

Esta propriedade não existe: <groovy variable name> for class: groovy.lang.Binding

N/A

Isso pode ser o resultado da não utilização do modelo RTPS e do fato de que as variáveis são referenciadas por meio de colchetes ou chaves. Como consequência, o mecanismo Groovy tenta avaliar as variáveis como expressões Groovy.

Utilize rtps.<variable name> ou verifique novamente as expressões entre chaves ou colchetes.

Não é possível atribuir um valor do tipo java.lang.Object a uma variável do tipo double

def data = []

double valFor = data[0]

O erro ocorre porque os dados da Lista não têm um tipo explícito. Portanto, o Groovy os trata como List<Object>. Quando você acessa um elemento da Lista usando data[0], ele retorna um objeto que não pode ser diretamente atribuído a uma variável double .

Para resolver esse problema, execute uma das seguintes ações:

  • Defina um tipo explícito para a lista.

    Defina a lista com o tipo correto, como List<Double>.

    Por exemplo:

    List<Double> data = []

    double valFor010 = data[0]

  • Converta o valor em double.

    Use a sintaxe as double para converter explicitamente o objeto em um valor duplo.

    Por exemplo:

    def data = []

    double valFor010 = data[0] as double

Não é possível atribuir um valor do tipo java.lang.Object a uma variável do tipo int

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

O erro ocorre porque o objeto que está sendo atribuído não tem um tipo explícito nem é convertido em int. Nesse caso, finalList.get(3) retorna um objeto que não pode ser diretamente atribuído a uma variável int.

Para resolver esse problema, converta o valor em int.

Use a sintaxe int para converter explicitamente o objeto em um valor int ou use a tag as int.

Por exemplo:

def finalList = mergeList.get(i)

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

int pmntfrequency = finalList.get(3) as int

Não é possível atribuir o valor do tipo java.util.List <java.lang.String> à variável do tipo java.lang.String[]

String[] arrGridMbrs = it.getMemberNames()

O erro ocorre porque it.getMemberNames() retorna List<String>, que não pode ser diretamente atribuído a um array String[].

Para resolver esse problema, adicione a conversão as String[] para converter explicitamente List<String> em um array String[].

Por exemplo:

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

Não é possível chamar:

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

com os argumentos

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

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

O erro ocorre porque os argumentos List<String> e List<List<String>> são especificados como List<Object> e List<Object>.

Para resolver esse problema, especifique o tipo de dados da variável.

Por exemplo:

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

Não é possível chamar:

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

com os argumentos

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

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

O erro ocorre porque os argumentos List<String> e List<List<String>> são especificados como List<Object> e List<Object>.

Para resolver esse problema, adicione a conversão as String[] para converter explicitamente List<String> em um array String[].

Por exemplo:

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

Não é possível chamar:

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

com os argumentos

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

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

O erro ocorre porque os argumentos List<String> e List<List<String>> são especificados como List<Object> e List<Object>.

Para resolver esse problema, adicione a conversão as String[] para converter explicitamente List<String> em um array String[]

Por exemplo:

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

Não é possível localizar o método correspondente java.util.Date#getAt(int)

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

O erro ocorre porque o método getAt(int), que estava disponível anteriormente em versões mais antigas do Groovy, não está mais disponível.

Para resolver esse problema, insira o seguinte:

Calendar calendar = Calendar.getInstance()

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

int year = calendar.get(Calendar.YEAR)

Não é possível localizar o método correspondente java.util.Date#format(java.lang.String)

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

O erro ocorre porque o método de formato, que estava anteriormente disponível em versões mais antigas do Groovy, não está mais disponível.

Para resolver esse problema, insira o seguinte:

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

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

Não é possível localizar o método correspondente 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()]))

O tipo List<Cube> está sendo especificado para o segundo argumento que espera 0 ou mais cubos.

Para resolver esse problema, execute uma das seguintes ações:

  • Certifique-se de que o tipo declarado esteja correto e que o método exista.

  • Insira o seguinte:

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

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

  • Se for necessária apenas uma dimensão válida para um cubo específico, insira o seguinte:

    Cube cube = application.getCube("Plan1")

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