TroubleTicketのような親オブジェクトに子オブジェクトActivityがある場合、親オブジェクトには、子オブジェクトの作成時に決定した名前を持つ関連コレクション・アクセサ・フィールドが含まれます。
たとえば、TroubleTicket親の子Activityオブジェクトを作成するときに、関連するコレクション・アクセサ・フィールドActivityCollectionに名前を付けることにした場合、1つ以上のActivity子行で動作する親TroubleTicketオブジェクトのコンテキストでビジネス・ロジックを記述できます。 これを行うには、次のような名前で関連するコレクション・アクセサ・フィールドにアクセスします:
// Assume code in context of TroubleTicket
// define a variable to hold activities collection
def activities = ActivityCollection_c
// work with activities here...
ヒント: 常に、使用する子コレクションをローカル変数に格納してください。 これを行わないと、予期したとおりに動作しないコードになります。
関連するコレクション・アクセサ・フィールドは行イテレータ・オブジェクトを返すため、次の表に示すようなメソッドを使用して行を操作できます。 行イテレータは、コードが操作しているコレクションの現在の行を追跡します。
最も一般的に使用されるRowIteratorメソッド
|
メソッド名
|
説明
|
|
hasNext()
|
戻り値: - 行イテレータに反復処理する行が追加されている場合はtrue、イテレータの行セットに行がない場合、またはイテレータがすでに最後の行以上である場合はfalse。
|
|
next()
|
戻り値: - 行イテレータの次の行
|
|
reset()
|
戻り値: - void. 行イテレータを最初の行の前のスロットにリセットします。
|
|
first()
|
戻り値: - 行イテレータの最初の行、またはイテレータの行セットが空の場合はnull
|
この表の一般的に使用される行イテレータ・メソッドを実際に使用する方法の例を次に示します。次の例は、子行イテレータの操作に使用する一般的なコードを示しています。 この例では、関連する収集フィールドのAPI名を使用して子行イテレータにアクセスし、ローカル変数に保存します。 次に、イテレータは、行イテレータの最初の行の前に「スロット」に配置されるようにリセットされます。 次に、whileループをhasNext()メソッドと組み合せて使用して、行イテレータの各行を反復します。
// store the child row iterator in a local variable
def activities = ActivityCollection_c
// ensure iterator is on slot before first row
activities.reset()
// loop while there are more rows to process
while (activities.hasNext()) {
// access the next row in the row iterator
def curActivity = activities.next()
// reference fields or object functions from the current row
if (curActivity.Status_c == 'Open') {
// do something here to the current child activity
}
}
// to process the same row iterator again in this block of code,
// call activities.reset() method again to reset the
// iterator to the slot before the first row
子行のイテレータが空かどうかを検出するには、first()メソッドを使用できます。 nullが返された場合、行イテレータの行セットは空です。 次の例に示すように、first()メソッドをコールし、行イテレータの行セットに行がある場合、このメソッドは最初の行を指すようにイテレータを設定します。 そのため、スクリプトでfirst()メソッドを使用し、通常のwhile( rowiterator .hasNext()) idiomを使用して、イテレータ内のすべての行を反復処理するように計画している場合は、行イテレータでreset()メソッドをコールして、現在の行ポインタを最初の行の前のスロットに戻す必要があります。 このようにしないと、行セットの最初の行が誤って処理されない可能性があります。
def activities = ActivityCollection_c
// If there are no child activities...
if (activities.first() == null) {
// Do something here because there are no child activities
}
else {
// There are some child activities, call reset() to set
// iterator back to slot before first row
activities.reset()
while (activities.hasNext()) {
def curActivity = activities.next();
// Do something here with the current activity
}
}