| 1 | HLCSHDR4 ;SFIRMFO/LJA - Reset MSH Segment Fields ;3/24/2004 14:27 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**93,108**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | DEBUG(STORE) ; If HLP set up for debugging, capture VIEW... | 
|---|
| 5 | ; HLMSH773 -- req | 
|---|
| 6 | ; | 
|---|
| 7 | N NOW,NUM,VAR,VARS,X,XTMP | 
|---|
| 8 | ; | 
|---|
| 9 | ; 1=some, 2=all | 
|---|
| 10 | S STORE=$S(STORE=1:1,STORE=2:2,1:0) QUIT:'STORE  ;-> | 
|---|
| 11 | ; | 
|---|
| 12 | S NOW=$$NOW^XLFDT | 
|---|
| 13 | ; | 
|---|
| 14 | S XTMP="HLCSHDR3 "_HLMSH773 | 
|---|
| 15 | S:'$D(^XTMP(XTMP,0)) ^XTMP(XTMP,0)=$$FMADD^XLFDT(NOW,0,4)_U_NOW_U_"Debug data created by DEBUG~HLCSHDR4" | 
|---|
| 16 | ; | 
|---|
| 17 | S NUM=$O(^XTMP(XTMP,":"),-1)+1 | 
|---|
| 18 | ; | 
|---|
| 19 | ; Grab only critical (some) variables? | 
|---|
| 20 | I STORE=1 D | 
|---|
| 21 | . | 
|---|
| 22 | .  ; Sending information... | 
|---|
| 23 | .  S ^XTMP(XTMP,NUM,"SA")=HLMSHSAO_U_HLSAN_U_HLMSHSAN | 
|---|
| 24 | .  S ^XTMP(XTMP,NUM,"SF")=HLMSHSFO_U_HLSFN_U_HLMSHSFN | 
|---|
| 25 | . | 
|---|
| 26 | .  ; Receiving information... | 
|---|
| 27 | .  S ^XTMP(XTMP,NUM,"RA")=HLMSHRAO_U_HLRAN_U_HLMSHRAN | 
|---|
| 28 | .  S ^XTMP(XTMP,NUM,"RF")=HLMSHRFO_U_HLRFN_U_HLMSHRFN | 
|---|
| 29 | . | 
|---|
| 30 | .  ; Other information...    (HLMSHPRE and HLMSHPRS hold 2 pieces!) | 
|---|
| 31 | .  S ^XTMP(XTMP,NUM,0)=NOW_U_HLMSH772_U_HLMSHPRE_U_HLMSHPRS | 
|---|
| 32 | .  S ^XTMP(XTMP,NUM,1)=HLMSHPRO | 
|---|
| 33 | ; | 
|---|
| 34 | ; Grab all variables? | 
|---|
| 35 | I STORE=2 D | 
|---|
| 36 | .  S X="^XTMP("""_XTMP_""","_NUM_"," | 
|---|
| 37 | .  D DOLRO^%ZOSV | 
|---|
| 38 | ; | 
|---|
| 39 | QUIT | 
|---|
| 40 | ; | 
|---|
| 41 | SHOW N I773 | 
|---|
| 42 | F  R !!,"Enter 773 IEN: ",I773:60 Q:I773'>0  D | 
|---|
| 43 | .  D SHOW773(I773) | 
|---|
| 44 | QUIT | 
|---|
| 45 | ; | 
|---|
| 46 | SHOW773(I773) ; Show Dynamic Routing MSH Field Reset Details | 
|---|
| 47 | N DIV,MSH,N90,N91 | 
|---|
| 48 | ; | 
|---|
| 49 | S N90=$G(^HLMA(+I773,90)),N91=$G(^HLMA(+I773,91)) | 
|---|
| 50 | I (N90_N91)']"" D  QUIT  ;-> | 
|---|
| 51 | .  W "  no debug data found..." | 
|---|
| 52 | ; | 
|---|
| 53 | S MSH=$G(^HLMA(+I773,"MSH",1,0)) QUIT:MSH']""  ;-> | 
|---|
| 54 | S DIV=$E(MSH,4) | 
|---|
| 55 | ; | 
|---|
| 56 | W !!,$$CJ^XLFSTR(" 773 # "_I773_" ",IOM,"=") | 
|---|
| 57 | ; | 
|---|
| 58 | D HDR(90,N90) | 
|---|
| 59 | ; | 
|---|
| 60 | W ! | 
|---|
| 61 | D HDR(91,N91) | 
|---|
| 62 | ; | 
|---|
| 63 | W !!,$E(MSH,1,IOM) | 
|---|
| 64 | ; | 
|---|
| 65 | S C1=10,C2=30,C3=50 | 
|---|
| 66 | W !!,?C1,"Original (91)",?2,"Array (90)",?3,"MSH-Segment" | 
|---|
| 67 | W !,$$REPEAT^XLFSTR("-",IOM) | 
|---|
| 68 | D LINE("snd app",1,2,3) | 
|---|
| 69 | D LINE("snd fac",3,3,4) | 
|---|
| 70 | D LINE("rec app",5,4,5) | 
|---|
| 71 | D LINE("rec fac",7,5,6) | 
|---|
| 72 | ; | 
|---|
| 73 | QUIT | 
|---|
| 74 | ; | 
|---|
| 75 | LINE(HDR,PCE1,PCE2,PCE3) ; Print one comparison line... | 
|---|
| 76 | N P1,P2,P3,P4 | 
|---|
| 77 | S P1=$P(N91,U,PCE1),P2=$P(N90,U,PCE2),P3=$P(MSH,DIV,PCE3),P4=$P(N91,U,PCE1+1) | 
|---|
| 78 | W !,HDR,":",?C1,P1,?2,P2,?3,P3,$S(P4]"":" ["_P4_"]",1:"") | 
|---|
| 79 | QUIT | 
|---|
| 80 | ; | 
|---|
| 81 | HDR(NUM,DATA) N TXT | 
|---|
| 82 | S TXT=$S(NUM=90:"Array (90)",NUM=91:"Original (91)",1:"") | 
|---|
| 83 | W !,$$CJ^XLFSTR("---------- "_TXT_" ----------",IOM) | 
|---|
| 84 | W $$CJ^XLFSTR(DATA,IOM) | 
|---|
| 85 | QUIT | 
|---|
| 86 | ; | 
|---|
| 87 | SET(NEW,VAR,PCE) ; This subroutine performs these actions: | 
|---|
| 88 | ; (1) Resets variables used in MSH segment | 
|---|
| 89 | ; (2) Resets SERAPP and CLNTAPP in ^HLMA(#,0) | 
|---|
| 90 | ; (3) Sets HLMSH91 nodes if overwrite occurs by ARRAY value. | 
|---|
| 91 | ;     If overwrite occurs by M code, the overwrite has already | 
|---|
| 92 | ;     been recorded in HLMSH91.  (An overwrite produced by M code | 
|---|
| 93 | ;     is never overwritten by ARRAY data.) | 
|---|
| 94 | ; | 
|---|
| 95 | N IEN771N,IEN771O,HLTCP | 
|---|
| 96 | ; | 
|---|
| 97 | ; VAR is the name of the variable, and not it's value... | 
|---|
| 98 | S PRE=@VAR ; PRE is now the value of the VAR (pre-overwrite) variable... | 
|---|
| 99 | ; | 
|---|
| 100 | ; Tests whether anything was changed... | 
|---|
| 101 | QUIT:NEW']""  ;-> No new value exists to change to... | 
|---|
| 102 | QUIT:NEW=PRE  ;-> New value = Original value.  Nothing changed... | 
|---|
| 103 | ; | 
|---|
| 104 | ; THIS IS THE EPICENTER!!  This is where the variables used in | 
|---|
| 105 | ; the MSH segment is overwritten. | 
|---|
| 106 | S @VAR=NEW | 
|---|
| 107 | ; | 
|---|
| 108 | ; If PRE exists at this point, it was done by M code... | 
|---|
| 109 | QUIT:$P(HLMSH91,U,PCE)]""  ;-> | 
|---|
| 110 | ; | 
|---|
| 111 | ; Change was made, but not by M code.  Must be by array... | 
|---|
| 112 | S $P(HLMSH91,U,PCE)=PRE,$P(HLMSH91,U,PCE+1)="A" | 
|---|
| 113 | ; | 
|---|
| 114 | ; Upgrade ^HLMA(#,0)... | 
|---|
| 115 | QUIT:PCE'=1&(PCE'=5)  ;-> | 
|---|
| 116 | ; | 
|---|
| 117 | ; patch HL*1.6*108 start | 
|---|
| 118 | ;S IEN771O=$O(^HL(771,"B",PRE,0)) QUIT:IEN771O'>0  ;-> Orig IEN | 
|---|
| 119 | ;S IEN771N=$O(^HL(771,"B",NEW,0)) QUIT:IEN771N'>0  ;-> New IEN | 
|---|
| 120 | S IEN771O=$O(^HL(771,"B",$E(PRE,1,30),0)) QUIT:IEN771O'>0  ;-> Orig IEN | 
|---|
| 121 | S IEN771N=$O(^HL(771,"B",$E(NEW,1,30),0)) QUIT:IEN771N'>0  ;-> New IEN | 
|---|
| 122 | ; patch HL*1.6*108 end | 
|---|
| 123 | ; | 
|---|
| 124 | QUIT:'IEN771O!('IEN771N)!(IEN771O=IEN771N)  ;-> | 
|---|
| 125 | S HLTCP=1 ; So 773 is updated... | 
|---|
| 126 | I PCE=1 D UPDATE^HLTF0(MTIENS,"","O","","",IEN771N) | 
|---|
| 127 | I PCE=5 D UPDATE^HLTF0(MTIENS,"","O","",IEN771N) | 
|---|
| 128 | ; | 
|---|
| 129 | QUIT | 
|---|
| 130 | ; | 
|---|
| 131 | FIELDS ; Display the Protocol file fields used by the VistA HL7 package, | 
|---|
| 132 | ; when messages are received, to find the event and subscriber | 
|---|
| 133 | ; protocols. | 
|---|
| 134 | N BY,DIC,DIOEND,L | 
|---|
| 135 | ; | 
|---|
| 136 | D HD | 
|---|
| 137 | ; | 
|---|
| 138 | W ! | 
|---|
| 139 | ; | 
|---|
| 140 | S L="",DIC="^ORD(101,",BY="[HL PROTOCOL MESSAGING FIELDS]" | 
|---|
| 141 | S DIOEND="D EXPL^HLCSHDR4" | 
|---|
| 142 | D EN1^DIP | 
|---|
| 143 | ; | 
|---|
| 144 | Q | 
|---|
| 145 | ; | 
|---|
| 146 | HD W @IOF,$$CJ^XLFSTR("HL7 Protocol Messaging Fields",IOM) | 
|---|
| 147 | W !,$$REPEAT^XLFSTR("=",IOM) | 
|---|
| 148 | W !,"This 'HL7 Protocol Messaging Fields' report holds information that will help" | 
|---|
| 149 | W !,"you determine the effects from changes to routing-related fields in the MSH" | 
|---|
| 150 | W !,"segment when messages are sent between or within VistA HL7 systems." | 
|---|
| 151 | W !,"Additional explanation is included at the bottom of the report." | 
|---|
| 152 | Q | 
|---|
| 153 | ; | 
|---|
| 154 | EXPL N I,T QUIT:'$$EXPL1("Press RETURN for 'printout help', or '^' to exit... ")  X "F I=1:1 S T=$T(EXPL+I) QUIT:T'["";;""  W !,$P(T,"";;"",2,99)" S I=$$EXPL1("Press RETURN to exit... ",1) | 
|---|
| 155 | ;; | 
|---|
| 156 | ;;When messages are received, their SENDING APPLICATION (MSH-3), MESSAGE | 
|---|
| 157 | ;;TYPE (MSH-9), EVENT TYPE (MSH-9), and HL7 VERSION (MSH-12) fields are used to | 
|---|
| 158 | ;;find the event driver protocol to be used in processing the just-received | 
|---|
| 159 | ;;message. After the event protocol is found, that protocol's subscriber | 
|---|
| 160 | ;;protocols are evaluated.  The subscriber protocol with a RECEIVING | 
|---|
| 161 | ;;APPLICATION value that matches the RECEIVING APPLICATION field in the MSH | 
|---|
| 162 | ;;segment (MSH-5) is used. | 
|---|
| 163 | ;; | 
|---|
| 164 | ;;The first line for every "section" in the printout is the event driver | 
|---|
| 165 | ;;protocol. Lines preceded by dashes, are related subscriber protocols.  An | 
|---|
| 166 | ;;example is shown below. | 
|---|
| 167 | ;; | 
|---|
| 168 | ;;Snd/Rec App's    mTYP   eTYP   Ver        Protocol                     Link | 
|---|
| 169 | ;;------------------------------------------------------------------------------ | 
|---|
| 170 | ;;AC-VOICERAD      ORU    R01    2.3    |   AC ORU SERVER | 
|---|
| 171 | ;;-AC-RADIOLOGY    ORU    R01    2.3    |   AC ORU CLIENT                NC  TCP | 
|---|
| 172 | ;; | 
|---|
| 173 | ;;In this example, the 'AC-VOICERAD' line holds information for the 'AC ORU | 
|---|
| 174 | ;;SERVER' event protocol.  And, the '-AC-RADIOLOGY' line holds information for | 
|---|
| 175 | ;;the 'AC ORU CLIENT' subscriber protocol. | 
|---|
| 176 | Q | 
|---|
| 177 | ; | 
|---|
| 178 | EXPL1(PMT,FF) ; | 
|---|
| 179 | N DIR,DIRUT,DTOUT,DUOUT,X,Y | 
|---|
| 180 | QUIT:$E($G(IOST),1,2)'="C-" 1 ;-> | 
|---|
| 181 | F X=1:1:$G(FF) W ! | 
|---|
| 182 | S DIR(0)="EA",DIR("A")=PMT | 
|---|
| 183 | D ^DIR | 
|---|
| 184 | QUIT $S(Y=1:1,1:"") | 
|---|
| 185 | ; | 
|---|
| 186 | M ; Covered by Integration Agreement #3988 | 
|---|
| 187 | ; Application developers may call here when creating new messages, | 
|---|
| 188 | ; when experimenting with M code to evaluate and conditionally change | 
|---|
| 189 | ; routing-related fields. | 
|---|
| 190 | ; | 
|---|
| 191 | ; This API is called immediately before the MSH segment is created. | 
|---|
| 192 | N IOINHI,IOINORM,MSHOLD,MSHNEW,MSHPRE,X | 
|---|
| 193 | ; | 
|---|
| 194 | S X="IOINHI;IOINORM" D ENDR^%ZISS | 
|---|
| 195 | ; | 
|---|
| 196 | S MSHOLD=$$MSHBUILD(0),MSHPRE=$$MSHBUILD(1) | 
|---|
| 197 | W !!,"The original MSH segment is...",!!,IOINHI,MSHOLD,IOINORM | 
|---|
| 198 | I MSHPRE'=MSHOLD D | 
|---|
| 199 | .  W !!,"The MSH segment, after modification by passed-in data, is..." | 
|---|
| 200 | .  W !!,IOINHI,MSHPRE,IOINORM | 
|---|
| 201 | ; | 
|---|
| 202 | D MVAR("SENDING APPLICATION","HLMSHSAN","SERAPP") | 
|---|
| 203 | D MVAR("SENDING FACILITY","HLMSHSFN","SERFAC") | 
|---|
| 204 | D MVAR("RECEIVING APPLICATION","HLMSHRAN","CLNTAPP") | 
|---|
| 205 | D MVAR("RECEIVING FACILITY","HLMSHRFN","CLNTFAC") | 
|---|
| 206 | ; | 
|---|
| 207 | S MSHNEW=$$MSHBUILD | 
|---|
| 208 | I MSHNEW'=MSHPRE D | 
|---|
| 209 | .  W !!,"Before your changes above, the modified MSH segment was..." | 
|---|
| 210 | .  W !!,IOINHI,MSHPRE,IOINORM | 
|---|
| 211 | .  W !!,"After your changes, the MSH segment is..." | 
|---|
| 212 | .  W !!,IOINHI,MSHNEW,IOINORM | 
|---|
| 213 | W !!,$$REPEAT^XLFSTR("-",IOM) | 
|---|
| 214 | W !!,"Message being sent..." | 
|---|
| 215 | W ! | 
|---|
| 216 | ; | 
|---|
| 217 | Q | 
|---|
| 218 | ; | 
|---|
| 219 | MVAR(FLD,VAR,VARO) ; Generic resetting of variable... | 
|---|
| 220 | ;IOINHI,IOINORM -- req | 
|---|
| 221 | N ANS | 
|---|
| 222 | W !!,?4,"Protocol-derived value of ",FLD,": " | 
|---|
| 223 | W IOINHI,@VARO,IOINORM | 
|---|
| 224 | W !,"Passed-in value of ",FLD," (",VAR,"): " | 
|---|
| 225 | W IOINHI,@VAR,IOINORM | 
|---|
| 226 | W !,?10,"Enter new value for ",FLD,": " | 
|---|
| 227 | R ANS:60 Q:'$T  ;-> | 
|---|
| 228 | I ANS[U!(ANS']"") D | 
|---|
| 229 | .  W !!,?10,"No changes will be made..." | 
|---|
| 230 | I ANS'[U&(ANS]"") D | 
|---|
| 231 | .  S @VAR=ANS | 
|---|
| 232 | .  W !!,?10,"The variable ",IOINHI,VAR,IOINORM | 
|---|
| 233 | .  W " will be changed to '",IOINHI,ANS,IOINORM,"'." | 
|---|
| 234 | .  W !,?10,"This value will be stored in the ",FLD | 
|---|
| 235 | .  W !,?10,"field in the MSH segment..." | 
|---|
| 236 | .  W !!,$$REPEAT^XLFSTR("-",IOM) | 
|---|
| 237 | Q | 
|---|
| 238 | ; | 
|---|
| 239 | MSHBUILD(TYPE) ; Build MSH using current variables... | 
|---|
| 240 | N MSH,PCE,RAN,RFN,SAN,SFN | 
|---|
| 241 | S MSH="MSH"_FS_EC | 
|---|
| 242 | I $G(TYPE)=0 F PCE=SERAPP,SERFAC,CLNTAPP,CLNTFAC,HLDATE,SECURITY,MSGTYPE,HLID,HLPID,$P(PROT,U,9),"",$G(^HL(772,TXTP,1)),ACCACK,APPACK,CNTRY D | 
|---|
| 243 | .  S MSH=MSH_FS_PCE | 
|---|
| 244 | I $G(TYPE)'=0 D | 
|---|
| 245 | .  S SAN=HLMSHSAN,SAN=$S(SAN]"":SAN,1:SERAPP) | 
|---|
| 246 | .  S SFN=HLMSHSFN,SFN=$S(SFN]"":SFN,1:SERFAC) | 
|---|
| 247 | .  S RAN=HLMSHRAN,RAN=$S(RAN]"":RAN,1:CLNTAPP) | 
|---|
| 248 | .  S RFN=HLMSHRFN,RFN=$S(RFN]"":RFN,1:CLNTFAC) | 
|---|
| 249 | .  F PCE=SAN,SFN,RAN,RFN,HLDATE,SECURITY,MSGTYPE,HLID,HLPID,$P(PROT,U,9),"",$G(^HL(772,TXTP,1)),ACCACK,APPACK,CNTRY D | 
|---|
| 250 | .  .  S MSH=MSH_FS_PCE | 
|---|
| 251 | QUIT MSH | 
|---|
| 252 | ; | 
|---|
| 253 | EOR ;HLCSHDR4 - Reset MSH Segment Fields ;9/12/02 11:50 | 
|---|