仮想プロパティ・パス
この章では、Ensemble で仮想ドキュメント内のデータにアクセスするために使用される仮想プロパティ・パスについて説明します。この章は以下の節で構成されています。
概要
仮想ドキュメントを使用するには、仮想ドキュメント内の特定のデータ項目を識別できる必要があります。このデータ項目を仮想プロパティといいます。仮想プロパティ・パスは Ensemble で仮想プロパティの場所を指定するために使用される構文です。
XML 仮想ドキュメントを除いて、仮想プロパティ・パスは、該当する EDI スキーマが Ensemble にロードされている場合にしか使用できません。スキーマが Ensemble にロードされたら、Ensemble で対応するドキュメントを EDI スキーマによって意図されたように解釈するために必要なすべての情報が揃うことになります。
EDI ドキュメントの解釈:セグメントとフィールド
ASTM、EDIFACT、HL7 バージョン 2、および X12 ドキュメントの場合は、未加工のデータ・ストリームがセグメントに分割され、さらにフィールドに分割されます(詳細は、XML ドキュメントの場合と異なります。"Ensemble XML 仮想ドキュメント開発ガイド" を参照してください。)
下の例は、部分的な HL7 メッセージの未加工の内容を示しています。スペースの都合上、テキストの右側の部分は省略されています。
MSH:;~\&:ST01C:A:HNS:A:20041209100007::ADT;A08:26070901:P:2.2:26070901::AL:::::: PID:1::000616898;;;A;MR~00531098;;;;PI::LaRocca;Yan::19980202:F::4:924 Maple Blv PD1::::36904;Malynko;Brendan;(SACKETT);;;PAC;DOC:Press;Chris::::::::: NK1:1:Taylor;Chelsea:M;MOTHER:7702 Oak Street;;Reston;NV;93076;USA:854-495-4757: PV1:1:O:"":3:::36904;Tsatsulin;Patrick;(SACKETT);;;PAC;DOC:36904;Zampitello;Emma PV2::::::::::::::::::::::N:::::::::::::::::::::::::::N AL1:"":"":"":"":"":"" DG1:1:FF:"":UIT::A:::::::::0: DG1:2:I9:599.0:URIN TRACT INFECTION NOS::AM:::::::::: DG1:3:I9:599.0:URIN TRACT INFECTION NOS::F:::::::::1: DG1:4:FF:"":UIT::W:::::::::1: DG1:5:FF::::F:""::::"";"";"";"";"";""::0.00:::
終端文字 (多くの場合はキャリッジ・リターン) は、セグメントの最後を示します。この場合は、各行が 1 つのセグメントです。
セグメント内では、セパレータ文字がフィールド間の境界を示します。この場合は、コロンがフィールド間のセパレータ文字で、セミコロンがサブフィールド間のセパレータ文字です。
フィールドには、サブフィールドとそのさらに下位区分を含めることができます。これらは他のセパレータ文字で区切られます。
ターミネータ文字とセパレータ文字の詳細は EDI 形式によって異なります。
-
HL7 バージョン 2 の詳細は、"区切り文字" を参照してください。HL7.2 のデフォルトのセパレータは以下のとおりです。
| ^ ~ \ &
4 番目の文字 (デフォルトでは \) は、フィールドを区切るのではなく文字をエスケープするために使用されます。
-
X12 の詳細は、"区切り文字" を参照してください。X12 のデフォルトのセパレータは以下のとおりです。
* : \a ~ \r \n
-
EDIFACT の詳細は、"区切り文字" を参照してください。EDIFACT のデフォルトのセパレータは以下のとおりです。
: + ? ' \r \n
-
ASTM の詳細は、"区切り文字" を参照してください。ASTM のデフォルトのセパレータは以下のとおりです。
| \ ^ &
4 番目の文字 (デフォルトでは &) は、フィールドを区切るのではなく文字をエスケープするために使用されます。
ASTM の例
下の図は、Ensemble で ASTM ドキュメントがどのように解釈されるかを示しています。後述する “ポータル・ツール” で説明されている [ドキュメントビューワ] ページと同じようにドキュメントが表示されています。
セグメント構造
一般に、EDI 標準は、構成要素として使用可能な多数のセグメントを定義します。ドキュメント構造ごとに特定のセグメントしか含まることができません。複数のドキュメント構造で別々の順番または数量のセグメントを組み合わせることもできます。例えば、HL7 バージョン 2.3 の場合は次のようになります。
-
ADT_A01 メッセージには、MSN、EVN、PID、PD1、NK1、PV1、PV2、DB1、OBX、AL1、DG1、DRG、PR1、ROL、GT1、IN1、IN2、IN3、ACC、UB1、UB2 のセグメントが含まれています。
-
対照的に、ADT_A02 メッセージには、MSN、EVN、PID、PD1、PV1、PV2、DB1、OBX のセグメントしか含まれていません。
(詳細は、XML ドキュメントの場合と異なります。"Ensemble XML 仮想ドキュメント開発ガイド" を参照してください。)
仮想プロパティ・パスの特定
概念上は、仮想プロパティ・パスに以下のすべての単位が含まれています。
-
category:structure — その DocType
-
segment:field — その DocType の仮想ドキュメント内のデータ値へのパス
以下の図は、この規則を示しています。
通常、パスの segment 部分で、セグメントのグループや繰り返しブロックを含む、階層的なドキュメント構造内にあるターゲット・セグメントを識別します。例えば、2.3:ORM_O01 メッセージの NTE セグメントは、以下のように識別されます。
ORCgrp(1).OBRuniongrp.OBXgrp(3).NTE(1)
同様に、パスの field 部分で、ターゲット・セグメント内のフィールド、サブフィールド、および繰り返しグループの階層的な構造内にある、ターゲット・フィールドを識別します。実際には、NTE 内の各 field は、以下のように、簡単です。
SourceofComment
したがって、segment:field の完全なパスは次のようになります。
ORCgrp(1).OBRuniongrp.OBXgrp(3).NTE(1):SourceofComment
複雑な階層構造を持つフィールドもあります。同じ 2.3:ORM_O01 メッセージ構造の PID セグメントを見てみます。segment では、以下のように識別されます。
PIDgrp.PID
以下のような field パスを使用できます。
PatientIDInternalID(1).identifiertypecode
segment パスと異なり、パスの field 部分では、通常、フィールドやサブフィールドの名前の代わりに数値を使用できます。例えば、上記の名前の代わりに以下の番号を使用できます。
3(1).5
管理ポータルには、正しい segment:field パスを特定するのに役立つページが用意されています(これらのページにアクセスするには、[Ensemble]、[相互運用] の順にクリックします)。DTL エディタにも、特定の変換に使用するドキュメント構造を表示する機能が用意されています。
(詳細は、XML ドキュメントの場合と異なります。"Ensemble XML 仮想ドキュメント開発ガイド" を参照してください。)
仮想ドキュメント・クラス
仮想ドキュメントを操作する場合は、メッセージ・クラスを作成する必要がありません。Ensemble にはメッセージ・クラスが用意されています。例えば、X12 ドキュメント、HL7 メッセージ、XML ドキュメントを転送するためのクラスがそれぞれ 1 つずつあります。ビジネス・ホスト・クラスでは、自動的に、適切なメッセージ・クラスが使用されます。
これらのメッセージは、総称して、仮想ドキュメントと呼ばれています。
仮想ドキュメント・クラスには、Ensemble でメッセージを処理するために必要な情報を転送するためのプロパティが用意されています。これらのプロパティには以下が含まれます。
未加工のメッセージの最初の 32 KB が含まれています。
このプロパティは、管理ポータルにも表示できます。形式が不正なメッセージの分析や報告に役立ちます。
このプロパティにはインデックスが付けられていないことに注意してください。このプロパティを SQL 検索クエリ内で使用した場合は、そのクエリがあまり有効に機能しない可能性があります。このプロパティにプログラム (DTL など) からアクセスすることはお勧めできません。代わりに、仮想プロパティ・パスを使用して必要なデータにアクセスしてください。
未加工のメッセージの内容を特定の DocType にマップする最近の試みが成功したか失敗したかを示す %StatusOpens in a new tab 値が含まれています。BuildMapStatus はコード内で以下のようにテストできます。
-
ObjectScript ではマクロ $$$ISOK(myHL7Message.BuildMapStatus)、Basic ではメソッド $SYSTEM.Status.IsOK(myHL7Message.BuildMapStatus) を使用します。このテストで真の値が返された場合、BuildMapStatus には成功値が格納されています。
-
ObjectScript ではマクロ $$$ISERR(myHL7Message.BuildMapStatus)、Basic ではメソッド $system.Status.IsError(myHL7Message.BuildMapStatus) を使用します。このテストで真の値が返された場合、BuildMapStatus にはエラー値が格納されています。
BuildMapStatus のエラー・コードの詳細を表示するには、“ポータル・ツール” の章で説明されている [スキーマ構造] ページを使用します。
仮想ドキュメント・クラスでは、Ensemble で特定の形式と DocType の仮想プロパティ・パスを解釈するために必要なロジックも提供されます。このクラスでは、仮想ドキュメント内で (状況に応じて) 値を取得または設定するために使用可能な以下のインスタンス・メソッドが提供されます。
仮想プロパティ・パスを所与として、メッセージ内の仮想プロパティの値を返します。
このメソッド (および次のメソッド) は、メッセージにアクセスしてカスタム・コードを実行可能なプロダクション内の任意の場所 (BPL <code> 要素内など) から呼び出すことができます。
仮想プロパティ・パスと値を所与として、メッセージ内に値を設定します。GetValueAt() に関するコメントを参照してください。
ターミナルでの仮想プロパティ・パスのテスト
特に、構文に精通している場合は、仮想ドキュメント・プロパティ・パスをビジネス・プロセスやデータ変換などで使用する前にターミナルでテストできると便利です。そのためには、以下のように操作します。
-
対応するスキーマを Ensemble にロードします (まだロードされていない場合)。これを実現するには、“ポータル・ツール” の章を参照してください。
-
ターミナルまたはテスト・コード内:
-
適切なドキュメントのテキストを含む文字列を作成します。
-
該当する仮想ドキュメント・クラスの ImportFromString() メソッドを使用して、この文字列から仮想ドキュメントのインスタンスを作成します。
このクラスの一覧表を以下に示します。
ドキュメント・タイプ 仮想ドキュメント・クラス ASTM EnsLib.EDI.ASTM.DocumentOpens in a new tab EDIFACT EnsLib.EDI.EDIFACT.DocumentOpens in a new tab HL7 バージョン 2 EnsLib.HL7.MessageOpens in a new tab XML EnsLib.EDI.XML.DocumentOpens in a new tab -
このインスタンスの DocType プロパティを設定します。
-
このインスタンスの GetValueAt() インスタンス・メソッドを使用します。
-
下のメソッドはステップ 2 を実行します。
ClassMethod TestHL72Path()
{
set string="MSH|^~\&|HIHLS6A-223103|AAH|Bayside Medical|AAH|20120421112842||ADT^A11|"
_"20801130301008819401|P|2.5|||NE|NE"_$C(13,10)
_"EVN|A11|20120118150140||VHF|ECM"_$C(13,10)
_"PID|0001|126510^^^^MR|||Watson^Darby||19820611|M||||||||||5347607018|"
_" |||||||||||||||AAH"_$C(13,10)
_"PV1|0001|CL|^^^VNIDT^^SNINFD||||130725LS^Smithers^Lucianne|||||||||||CL|4137784E|"
_"|||||||||||||||||||S||VA|||20120118100000|20120118101000||||||V"
set target=##class(EnsLib.HL7.Message).ImportFromString(string,.status)
if 'status {do $system.Status.DisplayError(status) quit}
set target.DocType="2.5:ADT_A09"
set pathvalue=target.GetValueAt("PID:PatientName.familyname",,.status)
if 'status {do $system.Status.DisplayError(status)}
write pathvalue
}
このメソッドの出力を以下に示します。
ENSDEMO>d ##class(EEDI.CheckPaths).TestHL72Path()
Watson