Groovyビジネス・ルールの検証の問題の解決

アップグレードされたバージョンのGroovyに移行する際に、対処する必要がある特定の問題が発生する可能性があります。Groovyスクリプト検証というプログラムは、調整が必要なルールの検出を支援し、問題を修正できるようにレポートを提供します。

Note:

Groovyスクリプト検証は、ユーザーが作成したGroovyビジネス・ルールがアプリケーションに含まれている場合にのみ使用できます。Groovyスクリプト検証の実行方法の詳細は、Groovyスクリプトの検証を参照してください。

アプリケーションからGroovyスクリプト検証を実行した後、このトピックの情報を使用して検証の問題を解決します。

一般的なガイドライン

  • defを使用するかわりに、明示的なデータ型を使用します。たとえば、変数の明示的なデータ型として、StringintList<String>またはMap<String,Integer>などを指定します。

    ノート: defを使用していて、検証ツールによってフラグが設定されていない場合は、そのままにしておくことができます。

  • 浮動小数点数の処理時にエラーが発生した場合は、「d」接尾辞を使用して、浮動小数点数が「BigDecimal」ではなく「double」として扱われるようにします。たとえば、it.data = 1212121212.111dとします。

  • 理解できないエラーが発生した場合は、スクリプトの最初の行が次のようになっていることを確認します: /*RTPS: */

    RTPがない場合でも、これが最初の行であることを確認してください。

    RTPがある場合は、最初の行に次のように追加します: /*RTPS: {selectedDepartment} {hireDate} {newEmployeeName} */

Note:

10月の更新(25.10)以降、検証プロセスの一環として、非推奨のDate関数を、対応するCalendar関数に置き換える必要がなくなりました。これは解決され、問題ではなくなります。Date.format()、Date.getAt()、Date.parse()などのメソッドは機能し、検証エラーは表示されなくなります。

エラーおよび推奨される修正

Table 3-2 エラーおよび推奨される修正

エラー サンプル・コード 考えられる原因 考えられる解決策

次のようなプロパティはありません: <groovy variable name> for class: groovy.lang.Binding

N/A

これは、RTPSモデルを使用せず、変数が大カッコまたは中カッコで参照されることに起因する可能性があります。これにより、GroovyエンジンはそれらをGroovy式として評価しようとします。

rtps.<variable name>を使用するか、中カッコまたはカッコ内の式を再確認します。

type java.lang.Object型の値をdouble型の変数に割り当てることはできません

def data = []

double valFor = data[0]

このエラーは、リスト・データの型が明示的に指定されていないため、GroovyがList<Object>として処理することで発生します。data[0]を使用してリストの要素にアクセスすると、double 変数に直接割り当てられないオブジェクトが返されます。

この問題を解決するには、次のいずれかを実行してください:

  • リストの型を明示的に指定します。

    List<Double>など、正しい型でリストを定義します。

    例:

    List<Double> data = []

    double valFor010 = data[0]

  • 値をdoubleにキャストします。

    as double構文を使用して、オブジェクトをdouble値に明示的にキャストします。

    例:

    def data = []

    double valFor010 = data[0] as double

java.lang.Object型の値をint型の変数に割り当てることはできません

def finalList = mergeList.get(i)

int pmntfrequency = finalList.get(3)

このエラーは、割り当てるオブジェクトの型が明示的に指定されていないか、intにキャストされていないために発生します。この場合、finalList.get(3)は、int変数に直接割り当てられないオブジェクトを返します。

この問題を解決するには、値をintにキャストします。

int構文を使用して、オブジェクトを明示的にint値にキャストするか、as intタグを使用します。

例:

def finalList = mergeList.get(i)

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

int pmntfrequency = finalList.get(3) as int

java.util.List <java.lang.String>型の値をjava.lang.String[]型の変数に割り当てることはできません

String[] arrGridMbrs = it.getMemberNames()

このエラーは、 it.getMemberNames()String[]配列に直接割り当てられないList<String>を返すために発生します。

この問題を解決するには、as String[]キャストを追加して、List<String>String[]配列に明示的に変換します。

例:

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

次を呼び出せません:

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

引数:

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

def columnDims = []

def columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

このエラーは、List<String>およびList<List<String>>引数がList<Object>およびList<Object>として渡されるために発生します。

この問題を解決するには、変数のデータ型を指定します。

例:

List<String> columnDims = []

List<List<String>> columnMbrs = []

builder.addColumn(columnDims, columnMbrs)

次を呼び出せません:

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

引数:

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

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

このエラーは、List<String>およびList<List<String>> 引数がList<Object>およびList<Object>として渡されるために発生します。

この問題を解決するには、as String[]キャストを追加して、List<String>String[] arrayに明示的に変換します。

例:

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

次を呼び出せません:

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

引数:

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

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

このエラーは、List<String> およびList<List<String>>引数がList<Object>およびList<Object>として渡されるために発生します。

この問題を解決するには、as String[]キャストを追加して、 List<String>String[]配列に明示的に変換します。

例:

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

一致するメソッドjava.util.Date#getAt(int)が見つかりません

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

このエラーは、以前のバージョンのGroovyで使用可能だったgetAt(int)メソッドが使用できなくなったために発生します。

この問題を解決するには、次のように入力します:

Calendar calendar = Calendar.getInstance()

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

int year = calendar.get(Calendar.YEAR)

一致するメソッドjava.util.Date#format(java.lang.String)が見つかりません

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

このエラーは、以前のバージョンのGroovyで使用可能だったformatメソッドが使用できなくなったために発生します。

この問題を解決するには、次のように入力します:

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

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

一致するメソッド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()]))

List<Cube>が2番目の引数に渡されます。この引数には0個以上のキューブが必要です。

この問題を解決するには、次のいずれかを実行します:

  • 宣言された型が正しいこと、およびメソッドが存在することを確認します。

  • 次を入力します:

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

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

  • 特定のキューブに対して有効なディメンションのみが必要な場合は、次のように入力します。

    Cube cube = application.getCube("Plan1")

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