このセクションでは、 ^CIF(
ACN,1)
のSETまたはKILL操作に応答してGT.Mトリガーが相互参照を自動的に維持する方法を示す簡単な例を示します。また、上で説明した基本的なトリガの概念を強化します。^CIF(
ACN,1)
のグローバルノードは、構造体 ^CIF(
ACN,1)=
NAM|
XNAME|
を持ちます。これは縦棒("|")は区切り文字であり、XNAMEは顧客の正式名称(例えば、 "Doe, Johnny"
)です。アプリケーションスキーマは、1つの相互参照インデックス ^XALPHA("A",
XNAME,
ACN)=""
があります。^CIF(:,1)
ノードに指定されたGT.Mトリガーは、相互参照を自動的に維持することができます。
エディタを使用して、次のエントリを使用して triggers.trg
というトリガ定義ファイルを作成します。
+^CIF(acn=:,1) -delim="|" -pieces=2 -commands=SET,KILL -xecute="Do ^XNAMEinCIF"
この定義では:
^CIF
- トリガーが適用されるグローバル変数を指定します。
acn=:
- ZWRITEシンタックスでは、 " : " は最初の添字の値を指定します。
acn= prefix
は、トリガロジックを呼び出す前に、GT.Mが最初のサブスクリプト(ACN)の値をローカル変数 acn
に割り当てることを要求します。
1
- 2番目の添字が 1 の場合にのみ、トリガが一致することを指定します。
-delim="|
" - GT.Mが、 "|" を使用することを指定します。 ノードの値をチェックしてトリガを呼び出すかどうかを確認する際にpiece(部分文字)セパレータとして使用します。 キーワード delim を使用すると、GT.Mはノードの値に$PIECE() セマンティクスを使用します; 代わりに、zdelim は $ZPIECE() セマンティクスを使用するようGT.Mに指示します。
-pieces=2
- 更新によって2番目のピース(XNAME)が最初のピース(NAM)に変更されない場合、またはXNAMEに変更されていないピースが変更された場合にのみGT.Mがトリガーを起動するように指定します。
-commands=
SET,KILL - GT.MがSETおよびKILL更新(ただしZKILL / ZWITHDRAWコマンドではない)のトリガを呼び出すように指定します。
-xecute="Do ^XNAMEinCIF"
- GT.Mがトリガロジックを実行するためのコードを提供します。
次のようなコマンドを実行します:
$ mupip trigger -triggerfile=triggers.trg
このコマンドは、 ^CIF(:,1)にトリガを追加します。トリガが正常にロードされると、このコマンドは次のような出力を表示します:
File triggers.trg, Line 1: ^CIF trigger added with index 1 ========================================= 1 triggers added 0 triggers deleted 0 trigger file entries not changed 0 triggers modified =========================================
現在、グローバル・ノード ^CIF(:,1) 上のすべてのSETおよびKILL操作は、ルーチン XNAMEinCIF
を実行します。
エディタを使用して、次のコードを使用して XNAMEinCIF.m というMルーチンを作成します:
XNAMEinCIF ; Triggered Update for XNAME change in ^CIF(:,1) Set oldxname=$Piece($ZTOLDval,"|",2) Set:'$Length(oldxname) oldxname=$zchar(254); old XNAME Kill ^XALPHA("A",oldxname,acn); remove any old xref ; Create a new cross reference if the command is a Set Do:$ZTRIggerop="S" . Set xname=$Piece($ZTVALue,"|",2) Set:'$Length(xname) xname=$zchar(254) ; new XNAME . Set^XALPHA("A",xname,acn)="" ; create new xref ;
^CIF(:,1) ノードのXNAMEピースが新しい値に設定されるか、KILLされると、値を取得した後、無条件のKILLコマンドが存在する場合、以前の相互参照インデックスを削除します。ノードが以前に存在しなかった場合、KILLはノーオペレーション(no-op)であるため、削除は無条件である可能性があります。次に、SETが(ISV $ZTRIGGEROPから決定された)トリガを起動した場合にのみ、トリガ起動ルーチンは新しい相互参照インデックス・ノードを作成します。GT.Mは暗黙的にトリガ・ロジックの新しいコンテキストを作成するので、名前の選択や明示的なNEWの変数について心配する必要はありません。.
値を取得した後、無条件 KILLコマンドは、存在する場合は、以前の相互参照インデックスを削除します。次に、SETが(ISV $ZTRIGGEROPから決定された)トリガを起動した場合にのみ、トリガ起動ルーチンは新しい相互参照インデックス・ノードを作成します。GT.Mは暗黙的にトリガ・ロジックの新しいコンテキストを作成するので、名前の選択や明示的なNEWの変数について心配する必要はありません。.
次の図は、Set ^CIN(ACN,1)="Paul|John, Doe, Johnny|"
に対してトリガーが実行されたときの制御の流れを示しています。^CIN(ACN,1)
の初期値は "Paul|Doe, John|"
です。 ACNは "NY
" に設定されています。.
重要 | |
---|---|
トリガ・コンテキスト(ステップ1〜4)内で、$ZTVALUEの値を変更すると、GT.Mはステップ5でデータベースにコミットします。GT.Mはすべてのステップ(0〜5)をAtomic(すべてまたは何もない)トランザクション単位として実行します。 |
次の図は、Kill ^CIN(
ACN,1)
に対してトリガを実行したときの制御の流れを示しています。