Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

DTL <foreach>

繰り返し実行される一連のアクティビティを定義します。

Synopsis

<foreach property="P1" key="K1">   ...</foreach> 

属性

属性 説明
property 必須項目。繰り返しが行われるコレクション・プロパティ (リストまたは配列)。これは、実行コンテキスト内の有効なオブジェクト名およびプロパティ名である必要があります。 1 文字以上の文字列。
key 必須項目。コレクション内で繰り返しを実行するために使用するインデックス。これは、実行コンテキスト内の有効なオブジェクト名およびプロパティ名である必要があります。コレクション内の要素ごとに値が割り当てられます。 1 文字以上の文字列。

要素

要素 目的
<annotation> オプション。<foreach> 要素について記述するテキスト文字列。
ほとんどのアクティビティ オプション。<foreach> には、<assign>、<code>、<foreach>、<if>、<sql>、<subtransform>、および <trace> をゼロ個以上、自由に組み合わせて使用できます。

説明

<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> 要素をネスト構造にすることができます。

<transform targetClass='EnsLib.HL7.Message'
           targetDocType='2.3.1:BAR_P01'
           sourceClass='EnsLib.HL7.Message'
           sourceDocType='2.3.1:BAR_P01'
           create='new'
           language='objectscript'>
  <assign property='target.{MSH}' value='source.{MSH}' action='set'/>
  <assign property='target.{MSH:4}' value='"A"' action='set'/>
  <assign property='target.{MSH:6}' value='"A"' action='set'/>
  <assign property='target.{MSH:13}' value='source.{MSH:10}' action='set'/>
  <assign property='target.{MSH:10}' value='source.{MSH:13}' action='set'/>
  <assign property='target.{EVN}' value='source.{EVN}' action='set'/>
  <assign property='target.{PID}' value='source.{PID}' action='set'/>
  <assign property='target.{PID:2.4}' value='"A"' action='set'/>
  <foreach key='i' property='source.{PID:3()}'>
    <assign property='target.{PID:3(i).4}'
            value='"A"'
            action='set'/>
  </foreach>
  <assign property='target.{PID:18.4}' value='"A"' action='set'/>
  <foreach key='i' property='source.{PV1grp()}'>
    <assign property='target.{PV1grp(i).PV1}'
            value='source.{PV1grp(i).PV1}'
            action='set'/>
    <foreach key='j' property='source.{PV1grp(i).DG1()}'>
      <assign property='target.{PV1grp(i).DG1(j)}'
              value='source.{PV1grp(i).DG1(j)}'
              action='set'/>
    </foreach>
    <foreach key='k' property='source.{PV1grp(i).PR1grp()}'>
      <assign property='target.{PV1grp(i).PR1grp(k).PR1}'
              value='source.{PV1grp(i).PR1grp(k).PR1}'
              action='set'/>
    </foreach>
  </foreach>
</transform>

この <foreach> 構文は有効な例ですが、次のトピックで説明するように簡素化できます。

<foreach> のショートカット

HL7 メッセージなどのドキュメントベースのメッセージまたは “仮想ドキュメント” タイプを扱っている場合は、<assign> 文によって、ドキュメント構造内の反復フィールドのすべてのインスタンスを通して繰り返されるショートカット表記が提供されます。したがって、繰り返しフィールドを処理するためだけに、'i' 'j' および 'k' を使用した <foreach> ループを実際に設定する必要はありません。代わりに、以下のように、空のかっこを使用したより簡単な表記を使用できます。

<assign property='target.{PID:3().4}' value='"001"' action='set'/>

この 1 行の DTL 構文は、以下の 3 行と同じ意味を持っています。

<foreach key='i' property='target.{PID:3()}'>
   <assign property='target.{PID:3(i).4}' value='"001"' action='set'/>
 </foreach>

このかっこを使用するショートカットは、ネスト構造の <foreach> にも使用できます。以下の <transform> の例は、前のページで示したネスト構造の <foreach> を含む <transform> と同じ動作をします。このバージョンでは繰り返しフィールドにかっこによるショートカットを使用し、<assign> のデフォルト・アクションは 'set' なのでアクション値を省略しています。

<transform targetClass='EnsLib.HL7.Message'
           targetDocType='2.3.1:BAR_P01'
           sourceClass='EnsLib.HL7.Message'
           sourceDocType='2.3.1:BAR_P01'
           create='new'
           language='objectscript'>
<assign property='target.{MSH}' value='source.{MSH}'/>
<assign property='target.{MSH:4}' value='"A"'/>
<assign property='target.{MSH:6}' value='"A"'/>
<assign property='target.{MSH:13}' value='source.{MSH:10}'/>
<assign property='target.{MSH:10}' value='source.{MSH:13}'/>
<assign property='target.{EVN}' value='source.{EVN}'/>
<assign property='target.{PID}' value='source.{PID}'/>
<assign property='target.{PID:2.4}' value='"A"'/>
<assign property='target.{PID:3().4}' value='"A"'/>
<assign property='target.{PID:18.4}' value='"A"'/>
<assign property='target.{PV1grp().PV1}' value='source.{PV1grp().PV1}'/>
<assign property='target.{PV1grp().DG1()}' value='source.{PV1grp().DG1()}'/>
<assign property='target.{PV1grp().PR1grp().PR1}'
        value='source.{PV1grp().PR1grp().PR1}'/>
</transform>

ラージ・メッセージでの <STORE> エラーの回避

HL7 メッセージまたはオブジェクト・コレクションでセグメントのループ処理を行う際には、セグメントがメモリに書き込まれます。これらのオブジェクトによって現在のプロセスに割り当てられているすべてのメモリが消費されると、予期しないエラーが発生することがあります。

これを避けるために、不要になったオブジェクトはメモリから削除します。例えば、<foreach> ループで多数の HL7 セグメントを処理する場合、ループの最終ステップでソースとターゲットの両方に対して commitSegmentByPath メソッドを呼び出します。同様に、オブジェクト・コレクションの場合は %UnSwizzleAt メソッドを使用します。

以下に例を示します。

<foreach property='source.{ORCgrp()}' key='tORCkey'>
<foreach property='source.{ORCgrp(tORCkey).OBRgrp()}' key='tOBRkey'>
<foreach property='source.{ORCgrp(tORCkey).OBRgrp(tOBRkey).OBXgrp()}' key='tOBXkey'>

<assign property='target.{ORCgrp(tORCkey).OBRgrp(tOBRkey).OBR:4.1}' value='"XYZ"' action='set'/>

<code>

 Do source.commitSegmentByPath
("ORCgrp("_tORCkey_").OBRgrp("_tOBRkey_").OBXgrp("_tOBXkey_").OBX")
 Do target.commitSegmentByPath("ORCgrp("_tORCkey_").OBRgrp("_tOBRkey_").OBXgrp("_tOBXkey_").OBX")
  

</code>

</foreach>
</foreach>
</foreach>

コードを変更できない場合の一時的な回避策としては、各プロセスに割り当てられているメモリの量を増やします。この変更を行うには、管理ポータルの [メモリ詳細設定] ページで bbsiz パラメータを設定します。この場合、システムを再起動する必要がある点に注意してください。また、この変更を行う前に、必ずシステム管理者に相談してください。

FeedbackOpens in a new tab