Validierungsprobleme für Groovy-Geschäftsregeln beheben

Bei der Migration zu einer aktualisierten Version von Groovy können bestimmte Probleme auftreten, die behoben werden müssen. Ein Programm namens Groovy Script Validator hilft bei der Suche nach den Regeln, die angepasst werden müssen, und stellt einen Bericht zu Problemen bereit, die behoben werden müssen.

Note:

Groovy Script Validator ist nur verfügbar, wenn Ihre Anwendung von Benutzern erstellte Groovy-Geschäftsregeln enthält. Informationen zum Ausführen von Groovy Script Validator finden Sie unter Groovy-Skripte validieren.

Nachdem Sie Groovy Script Validator über Ihre Anwendung ausgeführt haben, können Sie Validierungsprobleme anhand der Informationen in diesem Thema beheben.

Allgemeine Richtlinien

  • Verwenden Sie explizite Datentypen anstelle von def. Beispiel: Geben Sie den expliziten Datentyp für Variablen an, wie z.B. String, int, List<String> oder Map<String,Integer>.

    Hinweis: Wenn Sie das Schlüsselwort def verwenden und es vom Validierungstool nicht gekennzeichnet wird, können Sie es unverändert lassen.

  • Wenn beim Arbeiten mit Gleitkommazahlen ein Fehler auftritt, verwenden Sie das Suffix "d", um sicherzustellen, dass die Gleitkommazahlen als "Double" anstatt "BigDecimal" behandelt werden. Beispiel: it.data = 1212121212.111d.

  • Wenn Sie eine Fehlermeldung erhalten, die Sie nicht verstehen, stellen Sie sicher, dass die erste Zeile des Skripts wie folgt aussieht: /*RTPS: */

    Auch wenn Sie keine RTPs verwenden, muss die erste Zeile diesen Text enthalten.

    Wenn Sie RTPs verwenden, fügen Sie diese der ersten Zeile wie folgt hinzu: /*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */.

Note:

Ab dem Oktober-Update (25.10) müssen Sie im Rahmen des Validierungsprozesses veraltete Datumsfunktionen nicht mehr durch entsprechende Kalenderfunktionen ersetzen. Dieses Problem wird behoben und tritt künftig nicht mehr auf. Die Methoden "Date.format()", "Date.getAt()", "Date.parse()" usw. funktionieren künftig, und es werden keine Validierungsfehler mehr angezeigt.

Fehler und empfohlene Korrekturen

Table 3-2 Fehler und empfohlene Korrekturen

Fehler Beispielcode Mögliche Ursache Mögliche Lösung

Folgende Eigenschaft nicht vorhanden: <groovy variable name> for class: groovy.lang.Binding

N/V

Das kann darauf zurückzuführen sein, dass das RTPS-Modell nicht verwendet wird und dass die Variablen über eckige Klammern oder geschweifte Klammern referenziert werden. Das führt dazu, dass die Groovy-Engine versucht, die Variablen als Groovy-Ausdrücke auszuwerten.

Verwenden Sie rtps.<variable name>, oder prüfen Sie die Ausdrücke in den eckigen oder geschweiften Klammern erneut.

Wert vom Typ type java.lang.Object kann der Variablen vom Typ double nicht zugewiesen werden

def data = []

double valFor = data[0]

Der Fehler tritt auf, da die Listendaten nicht explizit eingegeben werden. Groovy behandelt sie daher als List<Object>. Wenn Sie über data[0] auf ein Element aus der Liste zugreifen, wird ein Objekt zurückgegeben, das einer Variablen vom Typ double nicht direkt zugewiesen werden kann.

Führen Sie einen der folgenden Schritte aus, um dieses Problem zu beheben:

  • Geben Sie die Liste explizit ein.

    Definieren Sie die Liste mit dem richtigen Typ, wie z.B. List<Double>.

    Beispiel:

    List<Double> data = []

    double valFor010 = data[0]

  • Konvertieren Sie den Wert in double.

    Verwenden Sie die Syntax as double, um das Objekt explizit in einen Double-Wert zu konvertieren.

    Beispiel:

    def data = []

    double valFor010 = data[0] as double

Wert vom Typ java.lang.Object kann der Variablen vom Typ int nicht zugewiesen werden

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

Der Fehler tritt auf, da das zuzuweisende Objekt nicht explizit eingegeben oder nicht explizit in int konvertiert wurde. In diesem Fall gibt finalList.get(3) ein Objekt zurück, das einer Variablen vom Typ int nicht explizit zugewiesen werden kann.

Um dieses Problem zu beheben, müssen Sie den Wert in int konvertieren.

Verwenden Sie die Syntax as int, um das Objekt explizit in einen int-Wert zu konvertieren, oder verwenden Sie das as int-Tag.

Beispiel:

def finalList = mergeList.get(i)

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

int pmntfrequency = finalList.get(3) as int

Wert vom Typ java.util.List <java.lang.String> kann der Variablen vom Typ java.lang.String[] nicht zugewiesen werden

String[] arrGridMbrs = it.getMemberNames()

Der Fehler tritt auf, da it.getMemberNames() das Argument List<String> zurückgibt, das einem String[]-Array nicht direkt zugewiesen werden kann.

Um dieses Problem zu beheben, fügen Sie die Cast-Funktion as String[] hinzu, um das Argument List<String> explizit in ein String[]-Array zu konvertieren.

Beispiel:

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

Folgendes kann nicht aufgerufen werden:

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

mit Argumenten

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

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

Der Fehler tritt auf, da die Argumente List<String> und List<List<String>> als List<Object> und List<Object> übergeben werden.

Um dieses Problem zu beheben, geben Sie den Datentyp der Variablen an.

Beispiel:

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

Folgendes kann nicht aufgerufen werden:

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

mit Argumenten

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

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

Der Fehler tritt auf, da die Argumente List<String> und List<List<String>> als List<Object> und List<Object> übergeben werden.

Um dieses Problem zu beheben, fügen Sie die Cast-Funktion as String[] hinzu, um das Argument List<String> explizit in ein String[]-Array zu konvertieren.

Beispiel:

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

Folgendes kann nicht aufgerufen werden:

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

mit Argumenten

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

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

Der Fehler tritt auf, da die Argumente List<String> und List<List<String>> als List<Object> und List<Object> übergeben werden.

Um dieses Problem zu beheben, fügen Sie die Cast-Funktion as String[] hinzu, um das Argument List<String> explizit in ein String[]-Array zu konvertieren.

Beispiel:

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

Keine übereinstimmende Methode java.util.Date#getAt(int) gefunden

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

Der Fehler tritt auf, da die Methode getAt(int), die in früheren Groovy-Versionen verfügbar war, jetzt nicht mehr verfügbar ist.

Geben Sie Folgendes ein, um dieses Problem zu beheben:

Calendar calendar = Calendar.getInstance()

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

int year = calendar.get(Calendar.YEAR)

Keine übereinstimmende Methode java.util.Date#format(java.lang.String) gefunden

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

Der Fehler tritt auf, da die Formatierungsmethode, die in früheren Groovy-Versionen verfügbar war, jetzt nicht mehr verfügbar ist.

Geben Sie Folgendes ein, um dieses Problem zu beheben:

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

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

Keine übereinstimmende Methode oracle.epm.api.model.Application#getDimension(java.lang.String, java.util.List) gefunden

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

List<Cube> wird an das zweite Argument übergeben, das 0 oder mehr Cubes erwartet.

Führen Sie einen der folgenden Schritte aus, um dieses Problem zu beheben:

  • Stellen Sie sicher, dass der deklarierte Typ korrekt ist und die entsprechende Methode vorhanden ist.

  • Geben Sie Folgendes ein:

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

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

  • Wenn nur eine Dimension erforderlich ist, die für einen bestimmten Cube gültig ist, geben Sie Folgendes ein:

    Cube cube = application.getCube("Plan1")

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