Difference between revisions of "PATIENT File HL7 Triggers"

From VistApedia
Jump to: navigation, search
(Created page with "<pre> Re: [Hardhats] Re: How to trigger an ADT message upon "Admit a patient" in VistA? Jason, One component to recognize is that 1) VistA is capable of Object-Oriented "messa...")
 
m (More segmenting with <pre>)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
<pre>
+
 
 
Re: [Hardhats] Re: How to trigger an ADT message upon "Admit a patient" in VistA?
 
Re: [Hardhats] Re: How to trigger an ADT message upon "Admit a patient" in VistA?
 
Jason,
 
Jason,
 
One component to recognize is that
 
One component to recognize is that
1) VistA is capable of Object-Oriented "messaging" and "events" through the protocol unwinder.
+
#VistA is capable of Object-Oriented "messaging" and "events" through the protocol unwinder.
2) a Protocol provides a "hook" similar to a call-back in other object oriented systems to allow your
+
#a Protocol provides a "hook" similar to a call-back in other object oriented systems to allow your own code to be run if you properly subscribe to the event.
own code to be run if you properly subscribe to the event.
+
#a Trigger is a data dictionary hook that allows your code to be run when a change occurs to a data value for an entry in the file.  This is a standard FileMan process.
3) a Trigger is a data dictionary hook that allows your code to be run when a change occurs to a data value for an entry in the file.  This is a standard FileMan process.
+
#There are certain fields, especially in the PATIENT File #2 that have trigger code which call the protocol unwinder to "fire" an event.
4) There are certain fields, especially in the PATIENT File #2 that have trigger code which call the protocol unwinder to "fire" an event.
 
  
 
There are many examples of this in the PATIENT File #2, Here is the DATE OF BIRTH Field #.03
 
There are many examples of this in the PATIENT File #2, Here is the DATE OF BIRTH Field #.03
 
+
<pre>
 
Select OPTION:    DATA DICTIONARY UTILITIES
 
Select OPTION:    DATA DICTIONARY UTILITIES
 
Select DATA DICTIONARY UTILITY OPTION:    LIST FILE ATTRIBUTES
 
Select DATA DICTIONARY UTILITY OPTION:    LIST FILE ATTRIBUTES
Line 162: Line 161:
 
                                 1,.X2,$G(XQY0)) Q
 
                                 1,.X2,$G(XQY0)) Q
 
                         X(1):  DATE OF BIRTH  (2,.03)  (forwards)
 
                         X(1):  DATE OF BIRTH  (2,.03)  (forwards)
 +
</pre>
  
  
Line 167: Line 167:
  
 
A part of the DGFCPROT routine has:
 
A part of the DGFCPROT routine has:
 
+
<pre>
 
+39        ;Task off (Taskman) driver routine.
 
+39        ;Task off (Taskman) driver routine.
 
+40        N ZTRTN,ZTDESC,ZTIO,ZTDTH,ZTSAVE,ZTSK,DGVAR,BXREF,SUBSCR,ZTREQ
 
+40        N ZTRTN,ZTDESC,ZTIO,ZTDTH,ZTSAVE,ZTSK,DGVAR,BXREF,SUBSCR,ZTREQ
Line 184: Line 184:
 
+4        Q
 
+4        Q
  
 +
</pre>
  
 
As you can see, there is the setup for calling TaskMan to invoke the DG FIELD MONITOR
 
As you can see, there is the setup for calling TaskMan to invoke the DG FIELD MONITOR
Line 189: Line 190:
  
 
I.E. this entry:
 
I.E. this entry:
+
 
 +
<pre>
 +
 
 
Select OPTION: INQUIRE TO FILE ENTRIES
 
Select OPTION: INQUIRE TO FILE ENTRIES
 
OUTPUT FROM WHAT FILE:  PROTOCOL//    (3925 entries)
 
OUTPUT FROM WHAT FILE:  PROTOCOL//    (3925 entries)
Line 218: Line 221:
 
         DGX2            X2 array as documented for Fileman new style x-refs
 
         DGX2            X2 array as documented for Fileman new style x-refs
  
This protocol is triggered by "listener" cross references on selected fields.
+
</pre>
By employing logic such as "If DGFILE=2, DGFIELD=.361, DGTYPE="ADD", then...",
+
 
subscribers to this protocol may take action based on edit activity which
+
This protocol is triggered by "listener" cross references on selected fields.
involves those fields.
+
By employing logic such as "If DGFILE=2, DGFIELD=.361, DGTYPE="ADD", then...",
 +
subscribers to this protocol may take action based on edit activity which
 +
involves those fields.
 +
 
 +
<pre>
  
 
  This event point is designed to occur only once per field editing activity.
 
  This event point is designed to occur only once per field editing activity.
Line 268: Line 275:
 
   TIMESTAMP: 60365,47585
 
   TIMESTAMP: 60365,47585
  
 +
</pre>
  
 
On Thu, Nov 15, 2012 at 10:20 AM, Jason <jason.huang@icare.com> wrote:
 
On Thu, Nov 15, 2012 at 10:20 AM, Jason <jason.huang@icare.com> wrote:
  
 +
Would you mind explain in a bit detail how these HL7 events are triggered through the data dictionary? I am not getting the idea of trigger events through data dictionary.
  
    Would you mind explain in a bit detail how these HL7 events are triggered through the data dictionary? I am not getting the idea of trigger events through data dictionary.
+
thanks,
 
 
    thanks,
 
 
 
    Jason
 
  
 +
Jason
  
    On Wednesday, November 14, 2012 2:23:42 PM UTC-5, Chris Edkins wrote:
 
  
        I think you will find that these HL7 events are triggered through the data dictionary, which would be why you can't find the calls within the routines.  Triggers in the data dictionary are safer than putting it in option code, since any way you use Fileman to do the update, the trigger will still be fired.
+
On Wednesday, November 14, 2012 2:23:42 PM UTC-5, Chris Edkins wrote:
  
</pre>
+
I think you will find that these HL7 events are triggered through the data dictionary, which would be why you can't find the calls within the routines. 
 +
Triggers in the data dictionary are safer than putting them in option code, since any way you use Fileman to do the update, the trigger will still be fired.

Latest revision as of 01:12, 26 January 2015

Re: [Hardhats] Re: How to trigger an ADT message upon "Admit a patient" in VistA? Jason, One component to recognize is that

  1. VistA is capable of Object-Oriented "messaging" and "events" through the protocol unwinder.
  2. a Protocol provides a "hook" similar to a call-back in other object oriented systems to allow your own code to be run if you properly subscribe to the event.
  3. a Trigger is a data dictionary hook that allows your code to be run when a change occurs to a data value for an entry in the file. This is a standard FileMan process.
  4. There are certain fields, especially in the PATIENT File #2 that have trigger code which call the protocol unwinder to "fire" an event.

There are many examples of this in the PATIENT File #2, Here is the DATE OF BIRTH Field #.03

Select OPTION:    DATA DICTIONARY UTILITIES
Select DATA DICTIONARY UTILITY OPTION:    LIST FILE ATTRIBUTES
 START WITH WHAT FILE: PATIENT//
      GO TO WHAT FILE: PATIENT//
      Select SUB-FILE:
Select LISTING FORMAT: STANDARD//
Start with field: FIRST// .03  DATE OF BIRTH
Go to field:
DEVICE:   TELNET
STANDARD DATA DICTIONARY #2 -- PATIENT FILE        NOV 15,2012@10:43:05  PAGE 1
STORED IN ^DPT(  (1220 ENTRIES)   SITE: Central Regional Hospital   UCI: EHR,EHR
 (VERSION 5.3)

DATA          NAME                  GLOBAL        DATA
ELEMENT       TITLE                 LOCATION      TYPE
-------------------------------------------------------------------------------

2,.03         DATE OF BIRTH          0;3 DATE (Required) (audited)

              DOB
              INPUT TRANSFORM:  S %DT="EP" D ^%DT S X=Y K:1701231>X!(DT<X) X I
                                $D(X) D BIRTH^DGLOCK
              OUTPUT TRANSFORM: NUMDATE4(DOB)
              LAST EDITED:      SEP 04, 2009
              HELP-PROMPT:      Enter the patient's DATE OF BIRTH which must be
                                later than 12/31/1870.  DATE OF BIRTH cannot be
                                a date after the beneficiary 'Ineligible Date'
                                or a date after the 'Enrollment Application
                                Date'.
              DESCRIPTION:      Enter the patient's DATE OF BIRTH which must be
                                later than 12/31/1870.  DATE OF BIRTH cannot be
                                a date after the beneficiary 'Ineligible Date'
                                or a date after the 'Enrollment Application
                                Date'.

              AUDIT:            YES, ALWAYS
              GROUP:            DEMOG
              NOTES:            XXXX--CAN'T BE ALTERED EXCEPT BY PROGRAMMER

              CROSS-REFERENCE:  2^ADOB
                                1)= S ^DPT("ADOB",$E(X,1,30),DA)=""

                                2)= K ^DPT("ADOB",$E(X,1,30),DA)

              CROSS-REFERENCE:  ^^TRIGGER^2^.083
                                1)= K DIV S DIV=X,D0=DA,DIV(0)=D0 S Y(1)=$S($D(
                                ^DPT(D0,0)):^(0),1:"") S X=$P(Y(1),U,20),X=X S
                                DIU=X K Y S X=DIV S X="1" S DIH=$G(^DPT(DIV(0),
                                0)),DIV=X S $P(^(0),U,20)=DIV,DIH=2,DIG=.083 D
                                ^DICR

                                2)= Q

                                CREATE VALUE)= "1"

                                DELETE VALUE)= NO EFFECT
                                FIELD)= #.083

              CROSS-REFERENCE:  2^AODS3^MUMPS
                                1)= S A1B2TAG="PAT" D ^A1B2XFR
                                2)= S A1B2TAG="PAT" D ^A1B2XFR

              CROSS-REFERENCE:  2^IVM03^MUMPS
                                1)= S IVMX=X,X="IVMPXFR" X ^%ZOSF("TEST") D:$T
                                DPT^IVMPXFR S X=IVMX K IVMX

                                2)= S IVMX=X,IVMKILL=3,X="IVMPXFR" X ^%ZOSF("TE
                                ST") D:$T DPT^IVMPXFR S X=IVMX K IVMX,IVMKILL

                                This cross-reference will check the IVM PATIENT
                                file to see if a change to this field will
                                require transmission to the IVM Center.  If it
                                does, the IVM PATIENT file entry's TRANSMISSION
                                STATUS will be set to 0 and the nightly
                                background job will transmit the updated
                                information.

                                Also, if this field is edited, this
                                cross-reference will check to see if the
                                patient requires a financial query to be sent
                                to the IVM Center (Data Collection Division
                                (DCD).


              CROSS-REFERENCE:  2^AVAFC03^MUMPS
                                1)= I ($T(AVAFC^VAFCDD01)'="") S VAFCF=".03;" D
                                 AVAFC^VAFCDD01(DA)


                                2)= I ($T(AVAFC^VAFCDD01)'="") S VAFCF=".03;" D
                                 AVAFC^VAFCDD01(DA)
                                This cross reference is used to remember that
                                changes were made to the PATIENT file (#2)
                                outside of the Registration process.  Execution
                                of this cross reference will create an entry in
                                the ADT/HL7 PIVOT file (#391.71) and mark it as
                                requiring transmission of an HL7 ADT-A08
                                message.

                                The local variable VAFCFLG will be set to 1 if
                                the cross reference is not executed because the
                                change is being made from within the
                                Registration process.

                                Execution of this cross reference can be
                                prevented by setting the local variable VAFCA08
                                equal to 1.

                                The local variable VAFCF is used to identify
                                the field edited.  This data is stored in the
                                FIELD(S) EDITED (#2.1) field in the ADT/HL7
                                PIVOT file (#391.71).


              CROSS-REFERENCE:  2^ADGRU03^MUMPS
                                1)= D:($T(ADGRU^DGRUDD01)'="") ADGRU^DGRUDD01(D
                                A)

                                2)= D:($T(ADGRU^DGRUDD01)'="") ADGRU^DGRUDD01(D
                                A)
                                This cross reference is used to remember that
                                changes were made to a monitored data field in
                                the PATIENT File (#2) required for a vendor
                                RAI/MDS COTS system.  Execution of this cross
                                reference will create an entry in the ADT/HL7
                                PIVOT file (#391.71) and mark it as requiring
                                transmission of an HL7 demographic A08 update
                                message to the COTS interface.

                                The local variable DGRUGA08 will be set to 1 if
                                the cross reference is not to be executed as
                                part of a re-indexing.


              FIELD INDEX:      ADGFMD03 (#847)    MUMPS    I    ACTION
                  Short Descr:  This x-ref calls the DG FIELD MONITOR event
                                point.
                  Description:  This cross reference activates the DG FIELD
                                MONITOR event point.  Applications that wish to
                                monitor edit activity related to this field may
                                subscribe to that event point and take action
                                as indicated by the changes that occur.  Refer
                                to the DG FIELD MONITOR protocol for a
                                description of the information available at the
                                time of the event.
                    Set Logic:  D FC^DGFCPROT(.DA,2,.03,"SET",$H,$G(DUZ),.X,.X1
                                ,.X2,$G(XQY0)) Q

                   Kill Logic:  D FC^DGFCPROT(.DA,2,.03,"KILL",$H,$G(DUZ),.X,.X
                                1,.X2,$G(XQY0)) Q
                         X(1):  DATE OF BIRTH  (2,.03)  (forwards)


The last trigger, which calls DGFCPROT is one example of this.

A part of the DGFCPROT routine has:

+39        ;Task off (Taskman) driver routine.
+40        N ZTRTN,ZTDESC,ZTIO,ZTDTH,ZTSAVE,ZTSK,DGVAR,BXREF,SUBSCR,ZTREQ
+41        S ZTRTN="INIT^DGFCPROT",ZTDESC="DG Field monitor task"
+42        S ZTIO="DG FIELD MONITOR",ZTDTH=$$NOW^XLFDT
+43        F DGVAR="DGDA","DGDA(","DGFILE","DGFIELD","DGTYPE","DGDTH","DGUSER"
            ,"DGX","DGX(","DGX1","DGX1(","DGX2","DGX2(","DGOPT" S ZTSAVE(DGVAR
            )=""
...
+50        D ^%ZTLOAD
+51        Q
    INIT   N X
+1         S X=$O(^ORD(101,"B","DG FIELD MONITOR",0))_";ORD(101," D EN1^XQOR
+2         I $D(ZTQUEUED) S ZTREQ="@"
+3         K DGDA,DGFILE,DGFIELD,DGTYPE,DGDTH,DGUSER,DGX,DGX1,DGX2,DGOPT
+4         Q

As you can see, there is the setup for calling TaskMan to invoke the DG FIELD MONITOR entry in the PROTOCOL file #101 by calling EN1^XQOR.

I.E. this entry:

 

Select OPTION: INQUIRE TO FILE ENTRIES
OUTPUT FROM WHAT FILE:  PROTOCOL//    (3925 entries)
Select PROTOCOL NAME: DG FIELD MONITOR       DG Field Monitor
ANOTHER ONE:
STANDARD CAPTIONED OUTPUT? Yes//   (Yes)
Include COMPUTED fields:  (N/Y/R/B): NO//  - No record number (IEN), no Computed
 Fields

NAME: DG FIELD MONITOR                  ITEM TEXT: DG Field Monitor
  TYPE: extended action                 CREATOR: MARSHALL,RICK
  PACKAGE: REGISTRATION
 DESCRIPTION:   This protocol is an event point which monitors the editing of
 fields in DG* application files.  At the time of this event point, the
 following variables will be present in the environment:

         Variable        Description
         --------        -----------------------------------------------
         DGDA            DA array as exists during Fileman editing
         DGFILE          File or subfile number where changed field resides
         DGFIELD         Number of changed field
         DGTYPE          Type of cross reference action (ADD, DELETE or UPDATE)
         DGDTH           Date/time of change in $Horolog format
         DGUSER          DUZ of user that made the change
         DGOPT           Current menu option in "option_name^menu_text" format
         DGX             X array as documented for Fileman new style x-refs
         DGX1            X1 array as documented for Fileman new style x-refs
         DGX2            X2 array as documented for Fileman new style x-refs

This protocol is triggered by "listener" cross references on selected fields. By employing logic such as "If DGFILE=2, DGFIELD=.361, DGTYPE="ADD", then...", subscribers to this protocol may take action based on edit activity which involves those fields.


 This event point is designed to occur only once per field editing activity.
 The DGTYPE variable can be interpreted as follows:

        o  ADD transactions indicate that data has been added to a field
           that was previously null.  The DGX, DGX1 and DGX2 arrays will
           contain the Fileman X, X1 and X2 arrays (respectively) as
           documented for the execution of 'SET' logic.

        o  DELETE transactions indicate that previously existing data has
           been deleted without being replaced.  The DGX, DGX1 and DGX2
           arrays will contain the Fileman X, X1 and X2 arrays
           (respectively) as documented for the execution of 'KILL' logic.

        o  UPDATE transactions indicate that existing data has been deleted
           and new data has been filed.  The DGX, DGX1 and DGX2 arrays will
           contain the Fileman X, X1 and X2 arrays (respectively) as
           documented for the execution of 'SET' logic.

 The naming convention used for these 'new style' cross-references for this
 Patch are as follows:

   1. All names will begin with the letter "A" to denote a non-lookup MUMPS
      cross-reference.

   2. The next characters identify the name space (i.e. Registration ="DG").

   3. The next two characters identify the field monitor utility ("FM").

   4. The next character will be "D" if the field contains a decimal. If
      there is no decimal, there will not be a "D" character.

   5. The next characters identify the field number.

 The establishment of this naming convention is intended to assist with the
 easy identification of the field monitoring utility as implemented across
 multiple field definitions.  It should be followed as additional instances of
 this utility are distributed.
ITEM: SCMC PCMM INACTIVATE ON DATE OF DEATH
ITEM: SPN REG STATUS UPDATE
ITEM: SPN REG STATUS DELETE
ITEM: FB PATIENT DATA CHANGE
ITEM: VAFC MPIPD FIELD TRIGGER
ITEM: PSU PATIENT DEMOGRAPHIC CHANGE
  TIMESTAMP: 60365,47585

On Thu, Nov 15, 2012 at 10:20 AM, Jason <jason.huang@icare.com> wrote:

Would you mind explain in a bit detail how these HL7 events are triggered through the data dictionary? I am not getting the idea of trigger events through data dictionary.

thanks,

Jason


On Wednesday, November 14, 2012 2:23:42 PM UTC-5, Chris Edkins wrote:

I think you will find that these HL7 events are triggered through the data dictionary, which would be why you can't find the calls within the routines. Triggers in the data dictionary are safer than putting them in option code, since any way you use Fileman to do the update, the trigger will still be fired.