Résolution des problèmes de validation de règle métier Groovy

Lors de la migration vers une version mise à niveau de Groovy, vous risquez de rencontrer certains problèmes qui devront être résolus. Un programme appelé Valideur de script Groovy vous aide à rechercher les règles à ajuster et fournit un rapport afin que vous puissiez résoudre les éventuels problèmes.

Note:

Le valideur de script Groovy n'est disponible que lorsque votre application contient des règles métier Groovy créées par l'utilisateur. Reportez-vous à la section Vérification des scripts Groovy pour plus d'informations sur l'exécution du valideur de script Groovy.

Après avoir exécuté le valideur de script Groovy à partir de votre application, utilisez les informations de cette rubrique pour résoudre les problèmes de validation.

Instructions générales

  • Utilisez des types de données explicites au lieu de def. Par exemple, indiquez le type de données explicite pour les variables, comme String, int, List<String> ou Map<String,Integer>.

    Remarque : si vous utilisez def et qu'il n'est pas identifié par l'outil de validation, vous pouvez le laisser tel quel.

  • Si vous obtenez une erreur lors de l'utilisation de nombres flottants, utilisez le suffixe "d" pour vous assurer qu'ils sont traités comme des valeurs "double" au lieu de "BigDecimal". Par exemple, it.data = 1212121212.111d.

  • Si vous obtenez une erreur que vous ne comprenez pas, vérifiez que la première ligne du script se présente comme suit : /*RTPS: */

    Même si vous ne disposez pas d'invites d'exécution, assurez-vous qu'il s'agit de la première ligne.

    Si vous disposez d'invites d'exécution, ajoutez-les à la première ligne comme suit : /*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */.

Note:

A partir de la mise à jour d'octobre (25.10), vous n'aurez plus besoin de remplacer les fonctions de date obsolètes par les fonctions de calendrier correspondantes dans le cadre du processus de validation. Cette situation sera résolue et ne sera plus un problème. Les méthodes Date.format(), Date.getAt(), Date.parse(), etc., fonctionneront et n'afficheront plus d'erreurs de validation.

Erreurs et corrections suggérées

Table 3-2 Erreurs et corrections suggérées

Erreur Exemple de code Cause possible Solution possible

Propriété inexistante : <nom de variable Groovy> pour la classe : groovy.lang.Binding

S/O

Cette erreur peut être due au fait que le modèle RTPS n'est pas utilisé, et que les variables sont référencées avec des crochets ou des accolades. Ainsi, le moteur Groovy essaie d'évaluer ces dernières en tant qu'expressions Groovy.

Utilisez rtps.<nom de variable>, ou vérifiez à nouveau les expressions entre accolades ou crochets.

Impossible d'affecter une valeur de type type java.lang.Object à une variable de type double

def data = []

double valFor = data[0]

L'erreur survient car les données de liste n'ont pas de type explicite. Groovy les traite donc en tant que type List<Object>. Lorsque vous accédez à un élément de la liste à l'aide du code data[0], celui-ci renvoie un objet, qui ne peut pas être directement affecté à une variable double.

Pour résoudre ce problème, effectuez l'une des opérations suivantes :

  • Indiquez explicitement le type de la liste.

    Définissez la liste avec le type correct, tel que List<Double>.

    Par exemple :

    List<Double> data = []

    double valFor010 = data[0]

  • Convertissez la valeur en valeur double.

    Utilisez la syntaxe as double pour convertir explicitement l'objet en valeur double.

    Par exemple :

    def data = []

    double valFor010 = data[0] as double

Impossible d'affecter une valeur de type java.lang.Object à une variable de type int

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

L'erreur survient car l'objet qui est affecté n'a pas de type explicite ou n'est pas converti en valeur int. Dans ce cas, finalList.get(3) renvoie un objet, qui ne peut pas être affecté directement à une variable int.

Pour résoudre ce problème, convertissez la valeur en valeur int.

Utilisez la syntaxe as int pour convertir explicitement l'objet en valeur int ou utilisez la balise as int.

Par exemple :

def finalList = mergeList.get(i)

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

int pmntfrequency = finalList.get(3) as int

Impossible d'affecter une valeur de type java.util.List <java.lang.String> à une variable de type java.lang.String[]

String[] arrGridMbrs = it.getMemberNames()

L'erreur survient car it.getMemberNames() renvoie une valeur List<String>, qui ne peut pas être affectée directement à un tableau String[].

Pour résoudre ce problème, ajoutez la conversion as String[] afin de convertir explicitement List<String> en tableau String[].

Par exemple :

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

Impossible d'appeler :

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

avec les arguments

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

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

L'erreur survient car les arguments List<String> et List<List<String>> sont transmis en tant que List<Object> et List<Object>.

Pour résoudre ce problème, indiquez le type de données de la variable.

Par exemple :

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

Impossible d'appeler :

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

avec les arguments

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

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

L'erreur survient car les arguments List<String> et List<List<String>> sont transmis en tant que List<Object> et List<Object>.

Pour résoudre ce problème, ajoutez la conversion as String[] afin de convertir explicitement List<String> en tableau String[].

Par exemple :

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

Impossible d'appeler :

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

avec les arguments

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

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

L'erreur survient car les arguments List<String> et List<List<String>> sont transmis en tant que List<Object> et List<Object>.

Pour résoudre ce problème, ajoutez la conversion as String[] afin de convertir explicitement List<String> en tableau String[].

Par exemple :

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

Méthode de mise en correspondance java.util.Date#getAt(int) introuvable

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

L'erreur survient car la méthode getAt(int), qui était auparavant disponible dans les versions antérieures de Groovy, ne l'est plus.

Pour résoudre ce problème, saisissez ce qui suit :

Calendar calendar = Calendar.getInstance()

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

int year = calendar.get(Calendar.YEAR)

Méthode de mise en correspondance java.util.Date#format(java.lang.String) introuvable

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

L'erreur survient car la méthode de format, qui était auparavant disponible dans les versions antérieures de Groovy, ne l'est plus.

Pour résoudre ce problème, saisissez ce qui suit :

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

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

Méthode de mise en correspondance oracle.epm.api.model.Application#getDimension(java.lang.String, java.util.List) introuvable

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

Un élément List<Cube> est transmis au deuxième argument qui attend 0 ou plusieurs cubes.

Pour résoudre ce problème, effectuez l'une des opérations suivantes :

  • Assurez-vous que le type déclaré est correct et que la méthode existe.

  • Saisissez ce qui suit :

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

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

  • Si seule une dimension valide pour un cube particulier est nécessaire, saisissez ce qui suit :

    Cube cube = application.getCube("Plan1")

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