簡単な例

このセクションでは、 ^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トリガーは、相互参照を自動的に維持することができます。

  1. エディタを使用して、次のエントリを使用して 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がトリガロジックを実行するためのコードを提供します。

  2. 次のようなコマンドを実行します:

    $ 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
    =========================================
  3. 現在、グローバル・ノード ^CIF(:,1) 上のすべてのSETおよびKILL操作は、ルーチン XNAMEinCIF を実行します。

  4. エディタを使用して、次のコードを使用して 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) に対してトリガを実行したときの制御の流れを示しています。

inserted by FC2 system