Risoluzione dei problemi di convalida della regola business Groovy

Quando si esegue la migrazione a una versione aggiornata di Groovy, è possibile che si verifichino alcuni problemi che devono essere risolti. Un programma denominato Convalida script Groovy consente di trovare le regole da modificare e fornisce un report in modo da poter risolvere eventuali problemi.

Note:

Convalida script Groovy è disponibile solo quando l'applicazione contiene regole business Groovy create dall'utente. Per informazioni su come eseguire Convalida script Groovy, fare riferimento alla sezione Convalida di script Groovy.

Dopo aver eseguito Convalida script Groovy dall'applicazione, utilizzare le informazioni contenute in questo argomento per risolvere i problemi di convalida.

Linee guida generali

  • Utilizzare i tipi di dati espliciti anziché def. Ad esempio, specificare il tipo di dati esplicito per le variabili, ad esempio String, int, List<String> o Map<String,Integer>.

    Nota: se si utilizza def senza il flag dello strumento di convalida, è possibile lasciarlo invariato.

  • Se si verifica un errore durante l'utilizzo di numeri a virgola mobile, utilizzare il suffisso "d" per assicurarsi che i numeri a virgola mobile vengano trattati come "double" anziché come "BigDecimal". Ad esempio, it.data = 1212121212.111d.

  • Se si visualizza un errore incomprensibile, verificare che la prima riga dello script sia simile alla seguente: /*RTPS: */

    Anche in assenza di prompt runtime, assicurarsi che questa sia la prima riga.

    Se sono presenti prompt runtime, aggiungerli alla prima riga come indicato di seguito: /*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */.

Note:

A partire dall'aggiornamento di ottobre (25.10), non sarà più necessario sostituire le funzioni Date non più valide con le funzioni Calendar corrispondenti nell'ambito del processo di convalida. Questo sarà risolto e non sarà più un problema. I metodi Date.format(), Date.getAt(), Date.parse() e così via funzioneranno e non visualizzeranno più errori di convalida.

Errori e correzioni suggerite

Table 3-2 Errori e correzioni suggerite

Errore Codice di esempio Possibile causa Possibile soluzione

Nessuna proprietà di questo tipo: <groovy variable name> for class: groovy.lang.Binding

N/D

Questo può essere il risultato del mancato utilizzo del modello RTPS e dell'utilizzo di parentesi quadre o graffe per fare riferimento alle variabili. In questo modo il motore Groovy tenterà di valutare questi elementi come espressioni Groovy.

Utilizzare rtps.<variable name> o ricontrollare le espressioni tra parentesi graffe o quadre.

Impossibile assegnare un valore del tipo type java.lang.Object a una variabile del tipo double

def data = []

double valFor = data[0]

L'errore si verifica perché i dati elenco (List) non vengono digitati in modo esplicito, pertanto Groovy li considera come List<Object>. Quando si accede a un elemento dall'elenco utilizzando data[0], viene restituito un oggetto che non può essere assegnato direttamente a una variabile double .

Per risolvere il problema, eseguire una delle operazioni descritte di seguito.

  • Digitare l'elenco in modo esplicito.

    Definire l'elenco con il tipo corretto, ad esempio List<Double>.

    Ad esempio:

    List<Double> data = []

    double valFor010 = data[0]

  • Eseguire la conversione del valore tramite cast in double.

    Utilizzare la sintassi as double per eseguire esplicitamente la conversione dell'oggetto tramite cast in un valore double.

    Ad esempio:

    def data = []

    double valFor010 = data[0] as double

Impossibile assegnare un valore del tipo java.lang.Object a una variabile del tipo int

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

L'errore si verifica perché l'oggetto assegnato non viene digitato in modo esplicito o convertito tramite cast in int. In questo caso, finalList.get(3) restituisce un oggetto che non può essere assegnato direttamente a una variabile int.

Per risolvere il problema, eseguire la conversione del valore tramite cast in int.

Utilizzare la sintassi int per eseguire in modo esplicito la conversione dell'oggetto tramite cast in un valore int oppure utilizzare il tag as int.

Ad esempio:

def finalList = mergeList.get(i)

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

int pmntfrequency = finalList.get(3) as int

Impossibile assegnare un valore del tipo java.util.List <java.lang.String> a una variabile del tipo java.lang.String[]

String[] arrGridMbrs = it.getMemberNames()

L'errore si verifica perché it.getMemberNames() restituisce un elemento List<String>, che non può essere assegnato direttamente a un array String[].

Per risolvere il problema, aggiungere il cast as String[] per convertire in modo esplicito List<String> in un array String[].

Ad esempio:

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

Impossibile chiamare quanto segue:

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

con argomenti

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

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

L'errore si verifica perché gli argomenti List<String> e List<List<String>> vengono passati come List<Object> e List<Object>.

Per risolvere il problema, specificare il tipo di dati della variabile.

Ad esempio:

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

Impossibile chiamare quanto segue:

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

con argomenti

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

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

L'errore si verifica perché gli argomenti List<String> e List<List<String>> vengono passati come List<Object> e List<Object>.

Per risolvere il problema, aggiungere il cast as String[] per convertire in modo esplicito List<String> in String[] array.

Ad esempio:

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

Impossibile chiamare quanto segue:

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

con argomenti

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

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

L'errore si verifica perché gli argomenti List<String> e List<List<String>> vengono passati come List<Object> e List<Object>.

Per risolvere il problema, aggiungere il cast as String[] per convertire in modo esplicito List<String> in un array String[]

Ad esempio:

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

Impossibile trovare il metodo corrispondente java.util.Date#getAt(int)

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

L'errore si verifica perché il metodo getAt(int), precedentemente disponibile nelle versioni di Groovy meno recenti, non è più disponibile.

Per risolvere il problema, immettere quanto segue:

Calendar calendar = Calendar.getInstance()

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

int year = calendar.get(Calendar.YEAR)

Impossibile trovare il metodo corrispondente java.util.Date#format(java.lang.String)

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

L'errore si verifica perché il metodo format, precedentemente disponibile nelle versioni di Groovy meno recenti, non è più disponibile.

Per risolvere il problema, immettere quanto segue:

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

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

Impossibile trovare il metodo corrispondente 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()]))

Viene passato un elemento List<Cube> nel secondo argomento che prevede 0 o più cubi.

Per risolvere il problema, eseguire una delle operazioni descritte di seguito.

  • Assicurarsi che il tipo dichiarato sia corretto e che il metodo esista.

  • Immettere quanto segue:

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

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

  • Se è necessaria solo una dimensione valida per un cubo specifico, immettere quanto segue:

    Cube cube = application.getCube("Plan1")

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