HL7 用の DTL データ変換の定義
各インタフェースでは、いくつかのデータ変換が必要になることがあります。変換を作成する場合は、予約パッケージ名を使用しないでください。"プロダクションの開発" の “予約パッケージ名” を参照してください。
データ変換内の HL7 エスケープ・シーケンスを手動で変更しないでください。これらは自動的に処理されます。
データ変換を作成するには、[データ変換ビルダ] ページを使用します (ホーム・ページから [Interoperability]→[ビルド]→[データ変換] を選択します)。このページの使用に関する一般情報は、"DTL 変換の開発" を参照してください。
以下の図は、[データ変換ビルダ] ページを示しています。
次のヒントに留意してください。
-
"DTL 変換の開発" を手元に置いてください。このドキュメントでは、各種の DTL アクションを追加する方法を説明しています。
-
データ変換クラスの create オプションに指定する値を明確に理解してください。create には、次のいずれかの値を指定できます。
-
new — データ変換内の要素を実行する前に、ターゲット・タイプの新しいオブジェクトを作成します。ターゲット・オブジェクトに明示的に割り当てていないソース・セグメントは無視されます。これがデフォルトです。
-
copy — 変換内の要素を実行する前に、ターゲット・オブジェクトとして使用するソース・オブジェクトのコピーを作成します。
-
existing — データ変換の呼び出し側から指定された既存のオブジェクトをターゲット・オブジェクトとして使用します。
ソースの完全コピーであるターゲット・オブジェクトを作成する場合、次のようなアクションを使用しないでください。
<assign property='target' value='source' />
代わりに、データ変換クラスで create='copy' 属性を使用します。
-
-
データ変換クラスによって、次の属性の正しいスキーマ・カテゴリが特定されることを確認します。
-
sourceDocType 属性
-
targetDocType 属性
スキーマ・カテゴリは、ソース・オブジェクトとターゲット・オブジェクトで同じ場合もあれば、異なる場合もあります。
-
-
そのデータ変換内のすべての式および code アクションに使用するスクリプト language を [変換] タブで指定していることを確認します。ObjectScript がデフォルトの言語です。
-
assign アクションを使用して、ドラッグ・アンド・ドロップ操作によってソース・メッセージからターゲット・メッセージに HL7 セグメントを割り当てます。
場合によっては、複数の手法を組み合わせて使用します。まず、ドラッグしてコード行を生成した後、テキストを編集してコードを微調整することができます。
-
データ変換では、次のような HL7 メッセージ・オブジェクトのプロパティを参照できます。
-
クラス・プロパティ DocType、TypeCategory、BuildMapStatus、および Name。
-
“プロダクション内での仮想ドキュメントの使用法” で構文ガイドの節の “中かっこ {} の構文” に記載されている仮想ドキュメント・プロパティ。
データ変換クラスのコード内では、次の例のように、特殊変数 source と target はそれぞれの HL7 メッセージ・オブジェクトを表します。
source.Name
target.DocType
source.{PIDgrp.PV1grp.PV1:18}
target.{PIDgrp.PID:PatientName.familylastname}
source.{ORCgrp(1).OBRuniongrp.OBRunion.OBR:4.3}
-
-
任意のリテラル文字列値を割り当てるか、条件付きの割り当てを行います。"DTL 変換の開発" の “構文ルール” の章を参照してください。
Note:文字列リテラルに XML 予約文字を含めることはできません。HL7 で使用される区切り文字を含めることもできません。
また、HL7 の NULL マッピング・コード "" は特殊な処理を必要とします。次の例は、ソース・メッセージで NULL マッピング・コードを確認し、それをターゲット・メッセージで空白の文字列に置き換えます。
<if condition='source.{PV1:7().4}=""""""'> <true> <assign property='target.{PV1:7().4}' value='""' /> </true> </if>
詳細は、“追加の手順” の章の “NULL マッピング・コード” を参照してください。
-
単純な計算については、DTL データ変換で次のことが可能です。
より複雑な計算については、独自のクラス・メソッドを記述し、code アクションから、または別の DTL 要素内の値文字列からそれらのメソッドを呼び出すことができます。
-
変換と各アクションの説明を追加します。
-
データ変換をコンパイルすると、同時に保存も行われます。
-
DTL データ変換をプロダクションで使用するには、ルーティング・ルール・セットの [変換] フィールドにそのパッケージとクラスの完全名を入力するだけです。
長いセグメント・フィールドの変換
DTL 変換で使用される ObjectScript メソッド GetValueAt は、3.6 MB で HL7 セグメント・フィールドを切り捨てます。したがって、3.6 MB よりも長いフィールドを変換する場合、DTL エディタでは左から右へのドラッグ操作は使用できません。例えば、OBX:5 フィールドが 3.6 MB を超える場合、切り捨てられることになるため、DTL エディタを使用してこのソース・フィールドをターゲットにドラッグすることはできません。同様に、3.6 MB より長いフィールドを変換する場合、カスタム・コードで GetValueAt を呼び出すことはできません。
3.6 MB よりも長いフィールドを変換するには、Code アクションを使用して、カスタム・コードを変換に追加する必要があります。このカスタム・コードは、EnsLib.HL7.SegmentOpens in a new tab クラスの GetFieldStreamRaw()、GetFieldStreamUnescaped()、または GetFieldStreamBase64() のいずれかのメソッドを含み、ソースのフィールド値をストリームに読み込む必要があります。
これらの Get メソッドは、ストリーム出力引数、フィールドの VDoc パス、および pRemainder 出力引数の 3 つの引数を取ります。 pRemainder 引数には、抽出されたフィールドの後に続くすべてのフィールドの値が入ります。例を以下に示します。
/// Segment: OBX|1|2|3|4|5|6|7
do GetFieldStreamRaw(.stream, "OBX:5", .rem)
/// rem contains: |6|7
ストリームにフィールド値が入ると、カスタム・コードは EnsLib.HL7.SegmentOpens in a new tab のメソッド StoreFieldStreamRaw()、StoreFieldStreamUnescaped()、または StoreFieldStreamBase64() のいずれか 1 つを使用して、ターゲットに値を格納する必要があります。
これらの Store メソッドは、フィールドに格納するストリーム、ストリームを格納するフィールドの VDoc パス、および pRemainder の 3 つの引数を受け入れます。pRemainder 引数が指定されていない場合は、格納されるフィールドの後に続くターゲット・フィールドはすべて削除されます。 例を以下に示します。
/// Before: OBX|1|2|3|4|5|6|7
do StoreFieldStreamRaw(stream, "OBX:5")
/// After: OBX|1|2|3|4|<stream>
/// |6|7 are gone because a remainder was not specified.
pRemainder を指定すると、格納されるフィールドに続くすべてのフィールドが pRemainder の指定内容に置き換えられます。
/// Before: OBX|1|2|3|4|5|6|7
do StoreFieldStreamRaw(stream, "OBX:5", "|six|seven")
/// After: OBX|1|2|3|4|<stream>|six|seven
Store メソッドが呼び出されると、ターゲット・セグメントは変更できなくなるため、これがセグメントに対する最後の変更になります。
以下の例は、ソースからフィールドを抽出し、ターゲットに格納する方法を示しています。この例では Store メソッドを呼び出す前に、3.6 MB を超えるフィールドに続くターゲット・フィールドに対してカスタム・コードが編集を加えたことを前提としています。Store メソッドの呼び出し後には、このセグメントは変更できなくなるため、この手法が必要です。サンプル・コードはソースから残りの部分を取得せず、これをターゲットに格納します。これは、ターゲットの長いフィールドの後のフィールドに対して既に行われた編集を元に戻すためです。したがって、ストリーム・フィールドはソースから取得しますが、残りの部分はターゲットから取得し、その両方をターゲットに格納します。
/// previous code makes edits to fields that come after OBX:5 in the target
do source.GetFieldStreamRaw(.stream, "OBX:5")
do target.GetFieldStreamRaw(.dummy, "OBX:5", .rem)
do target.StoreFieldStreamRaw(stream, "OBX:5", rem)
///Segment is now immutable
このようにして、OBX:5 の後続のターゲット・フィールドに対して行われた編集が元に戻されたり、削除されるのを防ぎます。
NULL マッピング・コード
NULL マッピング規則を使用する HL7 アプリケーションがあります。この規則に従って、このフィールドにデータがある場合、2 つの連続する二重引用符 ("") で構成されるフィールドをソース・アプリケーションが送信して、アプリケーションから削除することを示すことができます。
多くのターゲット・アプリケーションはこのような指示を想定しておらず、これに対応するように設計されていません。このような場合、二重引用符がターゲット・アプリケーションで実際の患者データとして保存されると、アプリケーション・ユーザの画面に二重引用符が表示されます。これは厄介で誤解を招く可能性があります。
ソース・アプリケーションが NULL マッピング規則を使用している場合、HL7 データ変換によって HL7 フィールドの NULL マッピング・エントリをチェックし、それらを空の文字列に置き換えるか、ターゲット・アプリケーションに適したデータを入力することができます。
次の <if> 文は、最も単純な例を表しています。この例は、ソースで NULL マッピングをチェックし、それをターゲットで空の文字列に置き換えます。<if> condition は、引用符で囲まれた 2 つの引用符で構成される文字列を使用して、NULL マッピング・コード "" をテストします。この結果、二重引用符が合計 6 つになります。condition 値全体を囲む一重引用符は含みません (慎重に数えてください)。
<if condition='source.{PV1:7().4}=""""""'>
<true>
<assign property='target.{PV1:7().4}' value='""' />
</true>
</if>
上の例では、<assign> value は、2 つの連続する二重引用符を使用し、value 全体を一重引用符で囲んで空の文字列を示しています。
次の構文も同様に有効です。
<if condition='source.{PV1:7().4}=""""""'>
<true>
<assign property='target.{PV1:7().4}' value='""' />
</true>
</if>
NULL マッピングの処理について、より高度な目標を達成することもできます。次の例は、{PV1:3} に実際に値があるかどうかに基づいて、別のアクションを実行します。フィールドに NULL マッピング・コードが含まれている場合、<true> 要素が実行されます。それ以外の場合は、<false> 要素が実行されます。
<if condition='source.{PV1:3}=""""""'>
<true>
<assign property='target.{PV1:3.1}' value='source.{PV1:PatientType}' />
<assign property='target.{PV1:3.2}' value='source.{PV1:PatientType}' />
</true>
<false>
<code>
// Dr Chart pulls subfields as follows:
// 1 location, 2 desc, 3 room, 4 bed, 5 wing, 6 floor
</code>
<assign property='target.{PV1:3.1}' value='source.{PV1:3.1}' />
<assign property='target.{PV1:3.2}' value='source.{PV1:3.1}' />
<assign property='target.{PV1:3.3}' value='source.{PV1:3.2}' />
<assign property='target.{PV1:3.4.1}' value='source.{PV1:3.3}' />
<assign property='target.{PV1:3.5}' value='source.{PV1:3.1}' />
</false>
</if>