説明
<foreach> 要素では、繰り返し実行される一連のアクティビティを定義します。これらのアクティビティは、指定したコレクション・プロパティ内にある各要素について 1 回ずつ実行されます。要素が NULL の場合、このシーケンスは実行されません。このシーケンスは、要素に空の値がある場合に (つまり、セパレータはあるがその間に値がない場合に) 実行されます。しかし、NULL 値に対しては実行されません。つまり、フィールドが指定される前にメッセージが終了します。
以下に例を示します。
<foreach key='i' property='target.{PID:3()}'>
<assign property='target.{PID:3(i).4}' value='"001"' action='set'/>
</foreach>
または
<foreach key='key' property='source.{PID:PatientIDInternalID()}'>
<if condition='source.{PID:PatientIDInternalID(key).identifiertypecode}="PAS"'>
<true>
<assign property='target.{PID:PatientIdentifierList(key).identifiertypecode}'
value='"MR"'
action='set'/>
</true>
</if>
<if condition='source.{PID:PatientIDInternalID(key).identifiertypecode}="GMS"'>
<true>
<assign property='target.{PID:PatientIdentifierList(key).identifiertypecode}'
value='"MC"'
action='set'/>
<assign property='target.{PID:PatientIdentifierList(key).assigningfacility}'
value='"AUSHIC"'
action='set'/>
</true>
</if>
</foreach>
<foreach> 要素で参照するプロパティは、データ変換のソースまたはターゲット・オブジェクト内のプロパティである必要があります。
ネストされた <foreach>
<foreach> 要素をネスト構造にすることができます。
次のトピックでは、この <foreach> 構文をどのように簡素化できるかを説明します。
<foreach> のショートカット
ドキュメントベースのメッセージまたは “仮想ドキュメント” タイプを扱っている場合は、<assign> 文によって、ドキュメント構造内の反復フィールドのすべてのインスタンスを通して繰り返されるショートカット表記が提供されます。したがって、繰り返しフィールドを処理するためだけに、'i' 'j' および 'k' を使用した <foreach> ループを実際に設定する必要はありません。代わりに、空のかっこを使用したより簡単な表記を使用できます。
このかっこを使用するショートカットは、ネスト構造の <foreach> にも使用できます。
ラージ・メッセージでの <STORE> エラーの回避
メッセージまたはオブジェクト・コレクションでセグメントのループ処理を行う際には、セグメントがメモリに書き込まれます。これらのオブジェクトによって現在のプロセスに割り当てられているすべてのメモリが消費されると、予期しないエラーが発生することがあります。
これを避けるために、不要になったオブジェクトはメモリから削除します。例えば、<foreach> ループで多数のセグメントを処理する場合、ループの最終ステップでソースとターゲットの両方に対して commitSegmentByPath メソッドを呼び出します。同様に、オブジェクト・コレクションの場合は %UnSwizzleAt メソッドを使用します。
コードを変更できない場合の一時的な回避策としては、各プロセスに割り当てられているメモリの量を増やします。この変更を行うには、管理ポータルの [メモリ詳細設定] ページで bbsiz パラメータを設定します。この場合、システムを再起動する必要がある点に注意してください。また、この変更を行う前に、必ずシステム管理者に相談してください。