Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

その他のアクションの追加

この章では、DTL 変換にその他の種類のアクションを追加する方法について詳しく説明します。

アクションのグループを操作する方法の詳細は、"アクションのグループの操作" を参照してください。

assign アクションの追加方法は、前の章を参照してください。

If アクションの追加

if アクションは、指定された式の値に応じて、その他のアクションを条件付きで実行します。InterSystems IRIS® では、それぞれの if アクションが DTL ダイアグラム内のコネクタ線で表現されます。

if アクションを追加するには:

  1. 条件がソース・プロパティの値に依存する場合は、そのプロパティをクリックします。

  2. [アクション追加] ドロップダウン・リストから [if] を選択します。

    [アクション] タブでは、[条件] フィールドに、選択されたソース・プロパティの名前が自動的に入力されます。

    ダイアグラムの下の領域に 3 つの新しい行が表示されます。次のように、これらの行のラベルが [アクション] 列に表示されます。

    • if — この行は、条件が真の場合に実行するアクションの始まりを表します。

    • else — この行は、条件が偽の場合に実行するアクションの始まりを表します。

    • endf — この行は、if アクションの終わりを表します。

  3. 真または偽に評価される式を含めるように [条件] フィールドを編集します。

    以下に例を示します。

    source.ABC = "XYZ"
    

    注 :

    • 関数を使用した式を作成する場合は、[値] フィールドの横にある検索ボタン をクリックします。これにより、前述したデータ変換関数ウィザードが呼び出されます。

    • より複雑な式を作成する場合は、[値] フィールドに式を入力します。前述した “有効な式” を参照してください。データ変換用に選択されたスクリプティング言語で書かれた式が有効なことを確認します。前述した “変換詳細の指定” を参照してください。

  4. 条件が真の場合に実行するアクションを追加するには:

    1. if 行をクリックします。

    2. [アクション追加] ドロップダウン・リストから項目を選択します。

    3. 必要に応じて、[アクション] タブで値を編集します。

    4. 必要に応じて繰り返します。

    assign アクション、if アクション、および for each アクションを含めることができます。

  5. 条件が偽の場合に実行するアクションを追加するには:

    1. else 行をクリックします。

    2. 前の項目で説明したように先に進みます。

これで、DTL ダイアグラムの下のブロック内に詳細が表示されます。以下に例を示します。

DTL logic that includes an else statement.

Note:

if 分岐または else 分岐用のアクションを指定する必要はありません。どの分岐にもアクションが含まれていない場合は、if アクションが無視されます。

For Each アクションの追加

for each アクションでは、繰り返し実行される一連のアクションを、以下のいずれかの各メンバに対して 1 回定義できます。

  • コレクション・プロパティ (標準メッセージ)

  • 繰り返しプロパティ (仮想ドキュメント)

  • ドキュメント内の一連のサブドキュメント (仮想ドキュメント)

InterSystems IRIS では、それぞれの for each アクションが DTL ダイアグラム内のコネクタ線で表現されます。

for each ループ内に break アクションを追加することにより、いつでもループを終了することができます。

for each アクションを追加するには:

  1. ソース・メッセージ内のコレクション・プロパティまたは繰り返しプロパティを選択します。

  2. [アクション追加] ドロップダウン・リストから [for each] を選択します。

    以下に示すように、[アクション] タブの [プロパティ] フィールドには自動的に選択されたソース・プロパティの名前が含まれ、[キー] フィールドには自動的に k1 が含まれます。

    The foreach logic without the iterator key in the parentheses and with the key field completed

    for each アクションの場合は、[キー] フィールドでカウンタ変数の名前を指定します。

    [プロパティ] フィールドでは、反復子キーを括弧内に含めることはできません。例として、以下は正しい指定です。

    source.{PID:PatientIdentifierList( )}
    

    for eachPatientIdentifierList 繰り返しフィールド (最初のフィールド (1 番) から始まって最後のフィールドで終わる) を通して繰り返します。

  3. [アクション] タブの [Unload] チェック・ボックスは、オープン・オブジェクトまたはセグメントのアンロードのためのコードを生成するかどうかを制御します。

    for each アクションに対して [Unload] にチェックが付いている場合、Transform メソッドで各ループの最後のプロパティ・コレクションに対してオープン・オブジェクトまたはセグメントのアンロード/アンスウィズルを試みるコードが生成されます。保存されていない仮想ドキュメント・セグメントが保存され、完成されます。プロパティがソース・オブジェクトの場合、ソース・オブジェクトは通常既に保存されています。

    それでもなお、ターゲットのコレクションのオブジェクトまたはセグメントをアンロードするため、手動でアクションを追加する必要がある場合があります。方針の詳細は、"ターゲット・コレクションのアンロード" を参照してください。

    for each プロパティ・コレクションのアンロードは不要の可能性があります。例えば、HL7 の場合、CopyValues を使用して生成されたコードはソース・セグメントをインスタンス化しません。

  4. for each ブロックにアクションを追加するには、for each アクションをクリックしてから、該当するアクションを追加します。

これで、DTL ダイアグラムの下のブロック内に詳細が表示されます。以下に例 (一部) を示します。

DTL logic without the iterator key in the Property field and with a value in the key field.

<foreach> がメッセージ内のコレクション・プロパティに適用される場合、一連のアクティビティは繰り返し実行されますが、コレクション・プロパティ内に存在するすべての要素に対して 1 回実行されます。要素が NULL の場合、このシーケンスは実行されません。このシーケンスは、要素に空の値がある場合に (つまり、セパレータはあるがその間に値がない場合に) 実行されます。しかし、NULL 値に対しては実行されません。つまり、フィールドが指定される前にメッセージが終了します。

For Each アクションのショートカット

仮想ドキュメントを操作している場合は、ドキュメント構造内の繰り返しフィールドのすべてのインスタンスを通して繰り返すショートカット表記が提供されます。これは、実際には、繰り返しフィールドを処理するためのネストされた複数の for each ループをセットアップする必要がないことを意味します。代わりに、中かっこ { } 構文内の空の丸かっこを含む仮想プロパティ・パスを使用して単一の assign アクションを作成します。詳細は、"プロダクション内での仮想ドキュメントの使用法" の “中かっこ {} の構文” を参照してください。

Note:

ソースとターゲットのタイプが異なる場合は、このショートカットを for each アクションに対して使用することはできません。このような場合は、明示的な for each アクションを使用してください。

ターゲット・コレクションのアンロード

[Unload] オプションを使用するとソース・コレクションからオブジェクトが自動的に削除されますが、ターゲット・コレクションからオブジェクトを削除するには、for each アクションの末尾にカスタム・コードを追加する必要があります。ターゲットが複雑なレコードである場合の簡単な例では、以下のコードを使用して現在のターゲット・レコードを保存してから、レコードをアンロードできます。

Do target.Record16.GetAt(k1).%Save(0)
Do target.Record16.%UnSwizzleAt(k1)

他のシナリオでは、ターゲットがアンロードされない問題を回避するために、ターゲットをまったくロードしないことをお勧めします。例えば、あるオブジェクトに、多数の子を持つ親子プロパティが指定されているとします。for each アクション内で、サブ変換を propSetObjectId(parentId)) と組み合わせています。prop は、プロパティの名前です。

この例では、ターゲットはバッチ・オブジェクト、ターゲット・クラスは Demo.RecordMapBatch.Map.TrainDataOut.BatchOut、レコード・クラスは Demo.RecordMapBatch.Transform.Optimized.Record です。

for each ループの前に、空のターゲットを作成してその ID をプロパティ BatchOutID に割り当てる必要があります。

<assign value='target.%Save()' property='tSC' action='set' />
<assign value='target.%Id()' property='BatchOutID' action='set' />
<assign value='target' property='' action='set' />

その後、for each ループ内で、ターゲットをインスタンス化することなくターゲットに直接作用するコードを使用できます。以下に例を示します。

<assign value='""' property='record' action='set' />
<subtransform class='Demo.RecordMapBatch.Transform.Optimized.Record' targetObj='record' sourceObj='source.Records.(k1)' />

<comment>
<annotation>Assign record to target directly. </annotation>
</comment>
<assign value='record.%ParentBatchSetObjectId(BatchOutID)' property='tSC' action='set' />
<assign value='record.%Save()' property='tSC' action='set' />

続いて、DTL が終了する前に、変数 target の設定を、予期される DTL の結果に戻します。以下に例を示します。

<assign value='##class(Demo.RecordMapBatch.Map.TrainDataOut.BatchOut).%OpenId(BatchOutID)' property='target' action='set' />

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

メッセージまたはオブジェクト・コレクションでセグメントのループ処理を行う際には、セグメントがメモリに書き込まれます。これらのオブジェクトによって現在のプロセスに割り当てられているすべてのメモリが消費されると、予期しないエラーが発生することがあります。このようなエラーを回避するには、管理ポータルで [Unload] オプションを使用します。ターゲット・コレクションのオブジェクトを削除する場合の方針については、"ターゲット・コレクションのアンロード" を参照してください。

別の方針として、for each ループで多数のセグメントを処理する場合は、ループの最後のステップとしてソースとターゲットの両方に対して commitSegmentByPath() メソッドを呼び出すことができます。同様に、オブジェクト・コレクションの場合は、%UnSwizzleAt() メソッドを使用します。

メソッド commitCollectionOpenSegments() は、runtimePath をループして指定されたコレクション・パス内のオープン・セグメントを検索し、各オープン・セグメントの commitSegmentByPath() を呼び出します。このメソッドは、クラス EnsLib.EDI.X12.DocumentOpens in a new tabEnsLib.EDI.ASTM.DocumentEnsLib.EDI.EDIFACT.DocumentOpens in a new tab、および EnsLib.HL7.Message から利用できます。

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

Subtransform アクションの追加

subtransform は通常、for each ループ内で別の変換 (一般変換) を呼び出します。EDI 形式は複数のメッセージ・タイプで使用されるセグメント・セットに基づいていることが多いため、サブ変換は、特に、仮想ドキュメントに有効です。別の変換内で変換を再利用できるということは、コード変換を複製しなくても必要に応じて呼び出すことが可能なセグメント変換の再利用可能ライブラリを作成できることを意味します。

DTL ダイアグラムには subtransform アクションが表示されません。

subtransform アクションを追加するには:

  1. [アクション追加] ドロップダウン・リストから [subtransform] を選択します。

  2. [アクション] タブで、以下の情報を指定します。

    • [変換クラス] — 使用するデータ変換クラスを指定します。これは、DTL 変換にすることも、カスタム変換にすることもできます。カスタム変換の詳細は、"プロダクションの開発" の “カスタム変換の定義” を参照してください。該当するクラスを入力する必要があります。

    • [ソースプロパティ] — 変換するプロパティを指定します。これは、オブジェクト・プロパティにすることも、仮想ドキュメント・プロパティ・パスにすることもできます。通常は、変換に使用されるソース・メッセージのプロパティです。該当するソース・プロパティを入力する必要があります。

    • [ターゲットプロパティ] — 変換された値が書き込まれるプロパティを指定します。 これは、オブジェクト・プロパティにすることも、仮想ドキュメント・プロパティ・パスにすることもできます。通常は、変換に使用されるターゲット・メッセージのプロパティです。該当するターゲット・プロパティを入力する必要があります。

    • [予備のプロパティ] — 必要に応じて、サブ変換に渡される値を指定します。サブ変換は、この値に aux 変数としてアクセスします。

    • [無効] — 必要に応じて、サブ変換を無効にするように指定します。

    • [説明] — 必要に応じて、サブ変換の説明文を入力します。

    Note:

    [作成]new または copy に設定されている subtransform の場合は、既存のターゲット・オブジェクトが含まれている必要がありません。

Trace アクションの追加

trace アクションは、診断に役立つトレース・メッセージを生成します。[トレース・イベントを記録] 設定が親ビジネス・ホストに対して有効になっている場合は、このメッセージがイベント・ログに書き込まれます。[フォアグラウンド] 設定が親ビジネス・ホストに対して有効になっている場合は、トレース・メッセージがターミナル・ウィンドウに出力されます。

DTL ダイアグラムには trace アクションが表示されません。

trace アクションを追加するには:

  1. [アクション追加] ドロップダウン・リストから [trace] を選択します。

  2. [アクション] タブで、以下を指定します。

    • [値] — リテラル値またはその他の有効な式を指定します。

      前述した “有効な式” を参照してください。データ変換用に選択されたスクリプティング言語で書かれた式が有効なことを確認します。前述した “変換詳細の指定” を参照してください。

    • [説明] — 任意で説明を指定します。

trace アクションは、ユーザ優先度を持つトレース・メッセージを生成します。結果は、ObjectScript 内の $$$TRACE マクロを使用した場合と同じです。

Code アクションの追加

code アクションを使用すれば、DTL データ変換内で 1 行または複数行のユーザ作成コードを実行できます。 このオプションを使用すれば、DTL 要素では表現しづらい特殊なタスクを実行できます。DTL ダイアグラムには code アクションが表示されません。

code アクションを追加するには:

  1. [アクション追加] ドロップダウン・リストから [code] を選択します。

  2. [アクション] タブで、以下を指定します。

    • [コード] — 変換用に指定されたスクリプティング言語で 1 行または複数行のコードを指定します。このコード内の式に関するルールは、“構文ルール” を参照してください。

      InterSystems IRIS は、自動的に、コードを CDATA ブロックで囲みます。これは、アポストロフィ (') やアンパサンド (&) などの特殊な XML 文字でエスケープする必要がないことを意味します。

      後述する注意も参照してください。

    • [説明] — 任意で説明を指定します。

Tip:

デバッグを容易にするためのカスタム・コードを作成するには、ターミナルで実行できるようにクラス・メソッドまたはルーチン内にコードを含めます。ターミナルでコードをデバッグします。その後で、DTL の code アクション内部からそのメソッドまたはルーチンを呼び出します。

DTL 内でカスタム・コードを使用する場合のガイドライン

データ変換の実行を中断して再開できるようにするには、code アクションを使用するときに以下のガイドラインに従う必要があります。

  • 実行時間は短くします。カスタム・コードがデータ変換の一般処理を妨げないようにしてください。

  • システム・リソースを割り当てる (ロックの取得やデバイスのオープンなど) 場合は、必ず同じ code アクション内でそのリソースを解放してください。

  • code アクションでトランザクションを開始する場合は、考えられるすべてのシナリオにおいて同じアクションでトランザクションが終了することを確認します。そうしなければ、トランザクションを閉じることができなくなる可能性があります。これにより他の処理が阻止されたり、重大なダウンタイムを発生することがあります。

SQL アクションの追加

SQL アクションを使用すれば、DTL 変換内部から SQL SELECT 文を実行できます。DTL ダイアグラムには sql アクションが表示されません。

sql アクションを追加するには:

  1. [アクション追加] ドロップダウン・リストから [sql] を選択します。

  2. [アクション] タブで、以下を指定します。

    • SQL — 有効な SQL SELECT 文を指定します。

      InterSystems IRIS は、自動的に、SQL を CDATA ブロックで囲みます。これは、アポストロフィ (') やアンパサンド (&) などの特殊な XML 文字でエスケープする必要がないことを意味します。

      後述する注意も参照してください。

    • [説明] — 任意で説明を指定します。

DTL 内で SQL を使用する場合のガイドライン

必ず、以下のガイドラインを使用してください。

  • 次のように、必ず、SQL スキーマ名とテーブル名の両方を含むテーブルの完全修飾名を使用します。

    MyApp.PatientTable

    上記の例の MyApp は SQL スキーマ名、PatientTable はテーブル名です。

  • FROM 節内に列挙するテーブルは、ローカルの InterSystems IRIS データベース内に保存されているか、SQL ゲートウェイを通して外部リレーショナル・データベースにリンクされている必要があります。

  • SQL クエリの INTO 節と WHERE 節から、ソースまたはターゲット・オブジェクトのプロパティを参照できます。これを実現するには、プロパティ名の前にコロン (:) を付けます。以下に例を示します。

      SELECT Name INTO :target.Name FROM MainFrame.EmployeeRecord WHERE SSN = :source.SSN AND City = :source.Home.City 
    
  • 使用されるのは、クエリで返された最初の行のみです。WHERE 節では、必要な行を正確に指定してください。

Switch アクションの追加

switch アクションには、1 つまたは複数の一連の case アクションと 1 つの default アクションが含まれています。switch アクションが実行されると、各 case 条件の評価が開始されます。式が true として評価されると、対応する case ブロックの内容が実行されます。それ以外の場合は、次の case アクションの式が評価されます。いずれかの case アクションが実行されるとすぐに、変換の実行パスは、他の条件を評価することなく、switch ブロックから離れます。いずれの case 条件も true でない場合は、default アクションの内容が実行された後、switch ブロックから制御が離れます。

Case アクションの追加

条件が一致した場合にアクションのブロックを実行するには、switch ブロック内で case アクションを使用します。case 条件が満たされ、アクションのブロックが実行されると、変換の実行パスは、他の条件を評価することなく、switch ブロックから離れます。

case アクションを追加するには:

  1. ダイアグラムの下のリストで switch アクションを選択します。

  2. [アクション追加] ドロップダウン・リストから [case] を選択します。

  3. [アクション] タブで、条件を追加します。虫めがねアイコンをクリックして、関数を条件の一部として追加することができます。

  4. ダイアグラムの下のリストで case アクションを選択した状態で、[アクション追加] ドロップダウンを使用して、条件が true として評価された場合に実行するアクションを追加します。

Default アクションの追加

[アクション追加] ドロップダウン・リストを使用して、default ブロックを追加することはできません。switch アクションを追加すると、default アクションが switch ブロックに自動的に追加されます。switch ブロック内のいずれの case 条件も満たされない場合、default ブロックに含まれているアクションが実行されます。いずれの case 条件も満たされない場合に何も実行されないようにするには、単に default ブロックを空のままにします。

Break アクションの追加

break アクションが実行されるとすぐに for each ループを終了するには、break アクションをループに追加します。break アクションが実行された後、データ変換は引き続き、for each ループのすぐ後のアクションを処理します。

break アクションを for each ループの外に追加した場合、データ変換は、break アクションが実行されるとすぐに終了します。

Comment アクションの追加

データ変換のアクションにアノテーションを付けるために、アクションのリストに表示されるコメントを追加できます。[アクション追加]→[コメント] を選択した後、[アクション] タブの [説明] テキスト・ボックスにコメントを入力します。

FeedbackOpens in a new tab