Skip to main content

その他のアクション

ここでは、相互運用プロダクションの DTL データ変換で値を変更しないアクションについて詳しく説明します。

従来の UI でこれらのタスクを実行する方法の詳細は、"その他のアクション (従来の UI)" を参照してください。

IF アクションの追加

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

IF アクションを追加するには以下の手順を実行します。

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

    [アクション] 領域に、以下のラベルで示された 2 つの行が表示されています。

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

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

  2. IF 行では、真または偽に評価される式になるように [条件] フィールドを編集します。

    以下に例を示します。

    source.ABC = "XYZ"
    

    注 :

    • 関数を使用した式を作成するには [関数の検索] ボタン をクリックし、関数を選択して [保存] をクリックします。

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

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

    1. [IF] 行をクリックします。

    2. [新規作成] ドロップダウン・リストから項目を選択します。

    3. その新しいアクションを必要に応じて編集します。

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

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

    1. [ELSE] 行をクリックします。

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

Note:

IF 分岐でも ELSE 分岐でも、アクションの指定は必須ではありません。どちらかの分岐でアクションを指定していない場合、IF アクションは無視されます。

FOR EACH アクションの追加

FOR EACH アクションでは、繰り返し実行する一連のアクションを、以下のいずれかのメンバごとに 1 回定義できます。

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

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

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

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

FOR EACH ループの中に BREAK アクションを追加することにより、そのループをいつでも終了できます。

FOR EACH アクションを追加するには以下の手順を実行します。

  1. [新規作成] ドロップダウン・リストから [FOR EACH] を選択し、アクションを追加します。

  2. [ターゲット] フィールドには、ソース・メッセージにあるコレクションまたは繰り返しプロパティを指定します。

    FOR EACH アクションの場合は、[キー] フィールドに反復子変数の名前を指定します。

    [ターゲット] フィールドでは、反復子キーを括弧の中に記述できません。例として、以下は正しい指定です。

    source.{PID:PatientIdentifierList( )}
    

    FOR EACH は、最初のフィールド (番号が 1) で始まって最後のフィールドで終わる複数の PatientIdentifierList 繰り返しフィールドに対して処理を繰り返します。

  3. [アンロード] チェック・ボックスでは、開いているオブジェクトまたはセグメントをアンロードするコードを生成するかどうかを制御します。

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

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

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

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

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

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

FOR EACH アクションのショートカット

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

Note:

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

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

[アンロード] オプションを使用するとソース・コレクションからオブジェクトが自動的に削除されますが、ターゲット・コレクションからオブジェクトを削除するには、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 tab、EnsLib.EDI.ASTM.Document、EnsLib.EDI.EDIFACT.DocumentOpens in a new tab、および EnsLib.HL7.Message から利用できます。

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

SUBTRANSFORM アクションの追加

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

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

SUBTRANSFORM アクションを追加するには以下の手順を実行します。

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

  2. 新しいアクションで以下の詳細を指定します。

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

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

    • [補助プロパティ] — 必要に応じて、サブ変換に渡す値を指定します。サブ変換は、この値に aux 変数としてアクセスします。複数の値を渡すには、以下の手順を実行します。

      1. 以下の例のように、添え字を持つ配列変数を作成します。

         set MyVar(1)="first value"
         set MyVar(2)="second value"
        
      2. [補助プロパティ] フィールドでは、この変数名の直前にピリオドを記述します。(ピリオドは、この変数が参照渡しされることを示します。これは、添え字のある変数を渡すために必要な方法です。)

        サブ変換内では、これらの値に aux(1) および aux(2) としてアクセスできます。つまり、aux 変数は、入力した配列変数で指定したものと同じ添え字を持ちます。

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

    • [コメント] — 必要に応じてコメントを指定します。

    Note:

    [モード] に Create 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 行または複数行のコードを指定します。このコード内の式に関するルールは、"構文ルール" を参照してください。

      ObjectScript を使用する場合は、各行の先頭に必ずスペースを入れてください。

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

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

    • [コメント] — 必要に応じて説明を指定します。

    • [言語] — 指定する式の言語を選択します。

Tip:

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

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

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

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

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

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

ObjectScript を使用する場合は、各行の先頭に必ずスペースを入れてください。

SQL アクションの追加

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

SQL アクションを追加するには以下の手順を実行します。

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

  2. 新しいアクションで以下を指定します。

    • [コード] — 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 条件の評価が開始されます。その式が真と評価されると、その CASE ブロックの内容が実行され、真ではないと評価されると次の CASE アクションの式が評価されます。いずれかの CASE アクションが実行されると、他の条件を評価することなく、変換の実行パスは直ちに SWITCH ブロックから離れます。どの CASE 条件も真ではない場合は、DEFAULT アクションの内容が実行された後、制御は SWITCH ブロックから離れます。

SWITCH アクションを追加するには以下の手順を実行します。

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

    これにより、SWITCH、CASE、DEFAULT のラベルが付いた 3 行が [アクション] 領域に追加されます。

  2. SWITCH 行で以下を指定します。

    • [コメント] — 必要に応じて説明を指定します。

    • [言語] — このアクションで使用する式の言語を指定します。

  3. 必要に応じて別の CASE アクションを追加します。

  4. これらの CASE 行を以下のように変更します。

    • [条件] で、条件を指定します。虫めがねアイコンをクリックして、関数を条件の一部として追加することができます。

    • [コメント] — 必要に応じて説明を指定します。

  5. 必要に応じて DEFAULT 行を変更します。DEFAULT アクションに何らかの手順を記述する必要は必ずしもありません。

  6. これらの分岐ごとに、目的のシナリオで実行するアクションを追加します。例えば、条件が真の場合にターゲット・プロパティを固有の方法で設定します。

CASE アクションの追加

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

CASE アクションを追加するには以下の手順を実行します。

  1. [アクション] 領域で SWITCH アクションを選択します。

  2. [新規作成] ドロップダウン・リストから [CASE] を選択します。

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

  4. [アクション] 領域で [CASE] を選択し、[新規作成] ドロップダウンを使用して、条件が真と評価された場合に実行するアクションを追加します。

Default アクションの追加

[新規作成] ドロップダウン・リストを使用して DEFAULT ブロックを追加することはできません。SWITCH アクションを追加すると、その SWITCH ブロックに DEFAULT アクションが自動的に追加されます。SWITCH ブロックにあるどの CASE 条件も満たされない場合は、DEFAULT ブロックにあるアクションが実行されます。どの CASE 条件も満たされない場合に何も実行されないようにするには、DEFAULT ブロックを空のままにします。

Break アクションの追加

BREAK アクションが実行されると直ちに実行が FOR EACH ループを離れるようにするには、そのループに BREAK アクションを追加します。BREAK アクションが実行された後、データ変換では FOR EACH ループ直後のアクションから実行が継続されます。

FOR EACH ループの外に BREAK アクションを追加した場合は、その BREAK アクションが実行されるとデータ変換が直ちに終了します。

COMMENT アクションの追加

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

関連項目

FeedbackOpens in a new tab