| 1 | HLEVX000 ;O-OIFO/LJA - VistA HL7 Event Monitor Code ;02/04/2004 15:25 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Event Types - 870-DINUM, 870-SKIP, 870-STUB | 
|---|
| 5 | ; | 
|---|
| 6 | CHK870 ; Search for various file 870 problems... | 
|---|
| 7 | ; | 
|---|
| 8 | ; {01/16/04 - See call to REPDINUM below.} | 
|---|
| 9 | ; | 
|---|
| 10 | N CT870,CTERR,CTNO,CTSTUB,DATA,DATABEF,IEN870,LINKNM,MIEN870 | 
|---|
| 11 | N NOW,STATUS,TXT,VAR,WAY,XTMPBEF,XTMPNOW | 
|---|
| 12 | ; | 
|---|
| 13 | ; Call event monitor... | 
|---|
| 14 | KILL VAR | 
|---|
| 15 | ; Variables can be defined prior to passing into START by reference... | 
|---|
| 16 | F VAR="CT870","CTDINUM","CTERR" S VAR(VAR)="" ; #1-Indiv array elements | 
|---|
| 17 | S VAR="CTNO^CTSKIP^CTSTUB" ;                    #2-Parsed from string | 
|---|
| 18 | D START^HLEVAPI(.VAR) | 
|---|
| 19 | ; Even D START^HLEVAPI(VAR) would work... | 
|---|
| 20 | ; | 
|---|
| 21 | KILL ^TMP($J,"HLREP"),^TMP($J,"HLEV REP"),^TMP($J,"HLMAIL") | 
|---|
| 22 | ; | 
|---|
| 23 | ; Set current XTMP subscript and create zero node... | 
|---|
| 24 | S NOW=$$NOW^XLFDT,XTMPNOW="HLEV STUB "_NOW | 
|---|
| 25 | S ^XTMP(XTMPNOW,0)=$$FMADD^XLFDT(NOW,2)_U_NOW_U_"HLEV Stub Record Search" | 
|---|
| 26 | ; | 
|---|
| 27 | ; Has there been a prior run?  If so, set XTMPBEF.  If not, set to null | 
|---|
| 28 | S XTMPBEF=$O(^XTMP(XTMPNOW),-1),XTMPBEF=$S(XTMPBEF["HLEV STUB ":XTMPBEF,1:"") | 
|---|
| 29 | ; | 
|---|
| 30 | ; Find current stub entries... | 
|---|
| 31 | S (CT870,CTDINUM,CTERR,CTNO,CTSKIP,CTSTUB)=0,IEN870=0,CTNO=0 | 
|---|
| 32 | F  S IEN870=$O(^HLCS(870,IEN870)) Q:IEN870'>0  D | 
|---|
| 33 | .  D CHECKIN^HLEVAPI | 
|---|
| 34 | .  S CT870=CT870+1 | 
|---|
| 35 | .  S LINKNM=$P($G(^HLCS(870,+IEN870,0)),U) | 
|---|
| 36 | .  S LINKNM=$S(LINKNM]"":LINKNM_"["_IEN870_"]",1:"IEN ["_IEN870_"]") | 
|---|
| 37 | .  ; 1=IN QUEUE     2=OUT QUEUE | 
|---|
| 38 | .  F WAY=1,2 D | 
|---|
| 39 | .  .  S WAY(1)=$S(WAY=1:"I",1:"O") | 
|---|
| 40 | .  .  D CHECKIN^HLEVAPI | 
|---|
| 41 | .  .  S MIEN870=$O(^HLCS(870,+IEN870,WAY,0)) ; First entry... | 
|---|
| 42 | .  .  S MIEN870(1)=$O(^HLCS(870,+IEN870,WAY,":"),-1) ; Last entry... | 
|---|
| 43 | .  .  Q:MIEN870'>0!(MIEN870(1)'>0)  ;-> | 
|---|
| 44 | .  .  F MIEN870=MIEN870:1:MIEN870(1) D | 
|---|
| 45 | .  .  .  S CTNO=CTNO+1 | 
|---|
| 46 | .  .  .  I '(CTNO#500) D CHECKIN^HLEVAPI | 
|---|
| 47 | .  .  .  D CHECKS(IEN870,WAY,MIEN870) | 
|---|
| 48 | ; | 
|---|
| 49 | D CHECKIN^HLEVAPI ; To store final values of variables | 
|---|
| 50 | D CHECKOUT^HLEVAPI ; To finalize fields... | 
|---|
| 51 | ; | 
|---|
| 52 | S ^XTMP(XTMPNOW,0,0)=CT870_U_CTNO_"~"_CTERR_"~"_CTDINUM_U_CTSKIP_U_CTSTUB | 
|---|
| 53 | ; | 
|---|
| 54 | ; Create report and put in text... | 
|---|
| 55 | QUIT:'$D(^TMP($J,"HLEV REP"))  ;-> | 
|---|
| 56 | ; | 
|---|
| 57 | ; Create report text... | 
|---|
| 58 | D GENREP^HLEVUTI0($NA(^TMP($J,"HLEV REP")),$NA(^TMP($J,"HLEVREP")),4,1) | 
|---|
| 59 | ; | 
|---|
| 60 | ; Load report text in 776 message text... | 
|---|
| 61 | D MSGTEXT^HLEVAPI1($NA(^TMP($J,"HLEVREP"))) | 
|---|
| 62 | ; | 
|---|
| 63 | ; Mail report... | 
|---|
| 64 | S HLEVTXT(1)="MESSAGETEXT" | 
|---|
| 65 | D MAILIT^HLEVAPI | 
|---|
| 66 | ; | 
|---|
| 67 | ; Report DINUM problems, using report text... | 
|---|
| 68 | D REPDINUM^HLEVX003 ; {01/16/04} | 
|---|
| 69 | ; | 
|---|
| 70 | ; Clean out ^TMP data... | 
|---|
| 71 | KILL ^TMP($J,"HLREP"),^TMP($J,"HLEV REP"),^TMP($J,"HLMAIL") | 
|---|
| 72 | ; | 
|---|
| 73 | Q | 
|---|
| 74 | ; | 
|---|
| 75 | SITE S SITE=$$SITE^VASITE,SITE=$P(SITE,U,2)_" ["_$P(SITE,U,3)_"]" | 
|---|
| 76 | D ADD("Run site:  "_SITE) | 
|---|
| 77 | D ADD("") | 
|---|
| 78 | ; | 
|---|
| 79 | EXPL D ADD("Some stub entries exist in the HL Logical Link file (#870) that") | 
|---|
| 80 | D ADD("appear to be ""stuck"".  Someone at the site needs to check out") | 
|---|
| 81 | D ADD("and possibly change their status to DONE.") | 
|---|
| 82 | ; | 
|---|
| 83 | HDR D ADD("") | 
|---|
| 84 | D ADD("Link          In/Out     IENs") | 
|---|
| 85 | D ADD($$REPEAT^XLFSTR("-",74)) | 
|---|
| 86 | ; | 
|---|
| 87 | ; Send report... | 
|---|
| 88 | REP S LINKNM="" | 
|---|
| 89 | F  S LINKNM=$O(^TMP($J,"HLEV REP",LINKNM)) Q:LINKNM']""  D | 
|---|
| 90 | .  S TXT=$E(LINKNM_"               ",1,15) | 
|---|
| 91 | .  S WAY="",CTNO=0 | 
|---|
| 92 | .  F  S WAY=$O(^TMP($J,"HLEV REP",LINKNM,WAY)) Q:WAY']""  D | 
|---|
| 93 | .  .  S TXT=$E(TXT_" "_$S(WAY="I":"IN",1:"OUT")_$$REPEAT^XLFSTR(" ",80),1,25) | 
|---|
| 94 | .  .  S MIEN870=0 | 
|---|
| 95 | .  .  F  S MIEN870=$O(^TMP($J,"HLEV REP",LINKNM,WAY,MIEN870)) Q:MIEN870'>0  D | 
|---|
| 96 | .  .  .  S CTNO=CTNO+1 | 
|---|
| 97 | .  .  .  I ($L(TXT)+$L(MIEN870)+2)>74 D  QUIT  ;-> | 
|---|
| 98 | .  .  .  .  D ADD(TXT) | 
|---|
| 99 | .  .  .  .  S TXT=$$REPEAT^XLFSTR(" ",25) | 
|---|
| 100 | .  .  .  S TXT=TXT_$S($L(TXT)>25:",",1:"")_MIEN870 | 
|---|
| 101 | .  .  I $TR(TXT," ","")]"" D ADD(TXT) | 
|---|
| 102 | .  .  S TXT=$$REPEAT^XLFSTR(" ",15) | 
|---|
| 103 | .  I TXT]"" D ADD(TXT) S TXT="" | 
|---|
| 104 | I TXT]"" D ADD(TXT) S TXT="" | 
|---|
| 105 | ; | 
|---|
| 106 | D MSGTEXT^HLEVAPI1($NA(^TMP($J,"HLMAIL"))) | 
|---|
| 107 | ; | 
|---|
| 108 | KILL ^TMP($J,"HLEV REP"),^TMP($J,"HLMAIL") | 
|---|
| 109 | ; | 
|---|
| 110 | S HLEVTXT(1)="MESSAGE TEXT" | 
|---|
| 111 | D MAILIT^HLEVAPI | 
|---|
| 112 | ; | 
|---|
| 113 | Q | 
|---|
| 114 | ; | 
|---|
| 115 | ADD(TXT) ; Add to global for moving into report | 
|---|
| 116 | N NO | 
|---|
| 117 | S NO=$O(^TMP($J,"HLMAIL",":"),-1)+1 | 
|---|
| 118 | S ^TMP($J,"HLMAIL",+NO)=TXT | 
|---|
| 119 | Q | 
|---|
| 120 | ; | 
|---|
| 121 | MSG(TXT) ; Generic text displayer... | 
|---|
| 122 | W !!,TXT | 
|---|
| 123 | W ! ; Always put at least one blank row in place | 
|---|
| 124 | F  Q:($Y+3)>IOSL  W ! | 
|---|
| 125 | S X=$$BTE^HLCSMON("Press RETURN to exit... ") | 
|---|
| 126 | Q | 
|---|
| 127 | ; | 
|---|
| 128 | CHECKS(IEN870,WAY,MIEN870) ; Perform various checks on queue entry... | 
|---|
| 129 | ; CTDINUM,CTSKIP,CTSTUB -- req | 
|---|
| 130 | QUIT:'$$DATA870(IEN870,WAY,MIEN870)  ;-> | 
|---|
| 131 | D CHKSTUB(IEN870,WAY,MIEN870) | 
|---|
| 132 | D CHKDINUM(IEN870,WAY,MIEN870) | 
|---|
| 133 | Q | 
|---|
| 134 | ; | 
|---|
| 135 | DATA870(IEN870,WAY,MIEN870) ; Does record exist? | 
|---|
| 136 | ; CTSKIP,LINKNM -- req | 
|---|
| 137 | ; | 
|---|
| 138 | ; Check for existence of data here... | 
|---|
| 139 | QUIT:$G(^HLCS(870,+IEN870,WAY,+MIEN870,0))]"" 1 ;-> | 
|---|
| 140 | ; | 
|---|
| 141 | S WAY(1)=$S(WAY=1:"INCOMING",1:"OUTGOING") | 
|---|
| 142 | ; | 
|---|
| 143 | ; Has this problem already been logged? | 
|---|
| 144 | QUIT:'$$LOG^HLEVAPI2("870-SKIP","IEN870^WAY^MIEN870") "" ;-> | 
|---|
| 145 | ; | 
|---|
| 146 | D RECORD("SKIP",LINKNM,WAY(1),MIEN870) | 
|---|
| 147 | S CTSKIP=CTSKIP+1,CTERR=CTERR+1 | 
|---|
| 148 | ; | 
|---|
| 149 | Q "" | 
|---|
| 150 | ; | 
|---|
| 151 | CHKSTUB(IEN870,WAY,MIEN870) ; Check if a stub record that "hangs around" | 
|---|
| 152 | ; CTSTUB,LINKNM -- req | 
|---|
| 153 | N DATABEF,STATUS | 
|---|
| 154 | S STATUS=$P($G(^HLCS(870,+IEN870,+WAY,+MIEN870,0)),U,2) | 
|---|
| 155 | QUIT:STATUS'="S"  ;-> Stub record | 
|---|
| 156 | S WAY(1)=$S(WAY=1:"INCOMING",1:"OUTGOING") | 
|---|
| 157 | S DATABEF=$S(XTMPBEF']"":"",1:$S($D(^XTMP(XTMPBEF,+IEN870,WAY(1),+MIEN870)):1,1:"")) | 
|---|
| 158 | S ^XTMP(XTMPNOW,+IEN870,WAY(1),+MIEN870)=DATABEF | 
|---|
| 159 | QUIT:'DATABEF  ;-> Stub entry didn't exist before... | 
|---|
| 160 | ; | 
|---|
| 161 | ; Has this problem already been logged? | 
|---|
| 162 | QUIT:'$$LOG^HLEVAPI2("870-STUB","IEN870^WAY^MIEN870")  ;-> | 
|---|
| 163 | ; | 
|---|
| 164 | D RECORD("STUB",LINKNM,WAY(1),MIEN870) | 
|---|
| 165 | S CTSTUB=CTSTUB+1,CTERR=CTERR+1 | 
|---|
| 166 | ; | 
|---|
| 167 | Q | 
|---|
| 168 | ; | 
|---|
| 169 | CHKDINUM(IEN870,WAY,MIEN870) ; Check for records not DINUMd for log link | 
|---|
| 170 | ; CTDINUM,LINKNM -- req | 
|---|
| 171 | ; | 
|---|
| 172 | ; {01/16/04 - Call to $$LOG^HLEVAPI2 removed.  See REPDINUM call.} | 
|---|
| 173 | ; | 
|---|
| 174 | N IEN | 
|---|
| 175 | ; | 
|---|
| 176 | ; DINUM check here... | 
|---|
| 177 | S IEN=+$G(^HLCS(870,+IEN870,WAY,+MIEN870,0)) QUIT:IEN=MIEN870  ;-> | 
|---|
| 178 | ; | 
|---|
| 179 | S WAY(1)=$S(WAY=1:"INCOMING",1:"OUTGOING") | 
|---|
| 180 | ; | 
|---|
| 181 | ; New occurence, so record error... | 
|---|
| 182 | D RECORD("DINUM",LINKNM,WAY(1),MIEN870) | 
|---|
| 183 | S CTDINUM=CTDINUM+1,CTERR=CTERR+1 | 
|---|
| 184 | ; | 
|---|
| 185 | Q | 
|---|
| 186 | ; | 
|---|
| 187 | RECORD(PROBL,LINKNM,WAY,MIEN870) ; Record for later inclusion in report | 
|---|
| 188 | ; | 
|---|
| 189 | ; Required:  At least two levels passed... | 
|---|
| 190 | S PROBL=$G(PROBL) QUIT:PROBL']""  ;-> | 
|---|
| 191 | S LINKNM=$G(LINKNM) QUIT:LINKNM']""  ;-> | 
|---|
| 192 | S LEVEL=2 | 
|---|
| 193 | S WAY=$G(WAY) I WAY]"" S LEVEL=3 | 
|---|
| 194 | S MIEN870=$G(MIEN870) I MIEN870]"" S LEVEL=4 | 
|---|
| 195 | ; | 
|---|
| 196 | ; Data level set... | 
|---|
| 197 | I LEVEL=4 S ^TMP($J,"HLEV REP",PROBL,LINKNM,WAY,MIEN870)="" | 
|---|
| 198 | I LEVEL=3 S ^TMP($J,"HLEV REP",PROBL,LINKNM,WAY)="" | 
|---|
| 199 | I LEVEL=2 S ^TMP($J,"HLEV REP",PROBL,LINKNM)="" | 
|---|
| 200 | ; | 
|---|
| 201 | ; Total level sets... | 
|---|
| 202 | I LEVEL=4 S ^TMP($J,"HLEV REP",PROBL,LINKNM,WAY)=$G(^TMP($J,"HLEV REP",PROBL,LINKNM,WAY))+1 | 
|---|
| 203 | I LEVEL=3 S ^TMP($J,"HLEV REP",PROBL,LINKNM)=$G(^TMP($J,"HLEV REP",PROBL,LINKNM))+1 | 
|---|
| 204 | S ^TMP($J,"HLEV REP",PROBL)=$G(^TMP($J,"HLEV REP",PROBL))+1 | 
|---|
| 205 | S ^TMP($J,"HLEV REP")=$G(^TMP($J,"HLEV REP"))+1 | 
|---|
| 206 | ; | 
|---|
| 207 | Q | 
|---|
| 208 | ; | 
|---|
| 209 | ; ==================================================================== | 
|---|
| 210 | ; | 
|---|
| 211 | CORRECT ; Correct a stub entry in HLCS(870)... | 
|---|
| 212 | N IEN870,MIEN870,WAY | 
|---|
| 213 | D HD,EX | 
|---|
| 214 | S WAY=$$WAY I WAY']"" D  QUIT  ;-> | 
|---|
| 215 | .  D MSG("Exiting... ") | 
|---|
| 216 | W ! | 
|---|
| 217 | S IEN870=$$LINK I IEN870']"" D  QUIT  ;-> | 
|---|
| 218 | .  D MSG("No link selected.  Start again... ") | 
|---|
| 219 | CONT W ! | 
|---|
| 220 | S MIEN870=$$MIEN870(IEN870,WAY) I MIEN870'>0 D  QUIT  ;-> | 
|---|
| 221 | .  D MSG("No stub entry exists for link.") | 
|---|
| 222 | W !!,"Stub record# ",MIEN870," found.  It's status is about to be changed to DONE..." | 
|---|
| 223 | W ! | 
|---|
| 224 | QUIT:'$$YN^HLCSRPT4("OK to correct","Yes")  ;-> | 
|---|
| 225 | D FIX(IEN870,WAY,MIEN870,"D") | 
|---|
| 226 | W "  fixed... " | 
|---|
| 227 | W ! | 
|---|
| 228 | QUIT:$$BTE^HLCSMON("Press RETURN to continue searching... ")  ;-> | 
|---|
| 229 | G CONT ;-> | 
|---|
| 230 | ; | 
|---|
| 231 | FIX(IEN870,WAY,MIEN870,STAT) ; Fix stub record... | 
|---|
| 232 | N DA,DIE,DR,SUBDD | 
|---|
| 233 | S DIE="^HLCS(870,"_IEN870_","_WAY_"," | 
|---|
| 234 | S DA(1)=IEN870,DA=+MIEN870 | 
|---|
| 235 | S DR=$S($G(STAT)]"":"1///"_STAT,1:1) | 
|---|
| 236 | D ^DIE | 
|---|
| 237 | Q | 
|---|
| 238 | ; | 
|---|
| 239 | WAY() ; In or Out? | 
|---|
| 240 | N DIR,DIRUT,DTOUT,DUOUT,X,Y | 
|---|
| 241 | S DIR(0)="SO^1:Search the IN QUEUE;2:Search the OUT QUEUE" | 
|---|
| 242 | S DIR("A")="Select the QUEUE to search" | 
|---|
| 243 | D ^DIR | 
|---|
| 244 | QUIT:$D(DIRUT)!($D(DTOUT))!($D(DUOUT)) "" ;-> | 
|---|
| 245 | Q $S(+Y:+Y,1:"") | 
|---|
| 246 | ; | 
|---|
| 247 | LINK() ; Which 870 entry? | 
|---|
| 248 | N DIC,X,Y | 
|---|
| 249 | S DIC=870,DIC(0)="AEMQ",DIC("A")="Select LOGICAL LINK: " | 
|---|
| 250 | D ^DIC | 
|---|
| 251 | Q $S(+Y:+Y,1:"") | 
|---|
| 252 | ; | 
|---|
| 253 | MIEN870(IEN870,WAY) ; Search for stub record... | 
|---|
| 254 | N CT,IEN,IOINHI,IOINORM,MIEN870,STATUS,X | 
|---|
| 255 | ; | 
|---|
| 256 | S X="IOINHI;IOINORM" D ENDR^%ZISS | 
|---|
| 257 | ; | 
|---|
| 258 | W !,IOINHI,"Searching for stub records...",IOINORM | 
|---|
| 259 | S CT=0,IEN=0,MIEN870=0 | 
|---|
| 260 | F  S IEN=$O(^HLCS(870,+IEN870,WAY,IEN)) Q:IEN'>0!(MIEN870)  D | 
|---|
| 261 | .  S CT=CT+1 W:'(CT#500) "." | 
|---|
| 262 | .  S DATA=$G(^HLCS(870,+IEN870,WAY,IEN,0)) QUIT:$P(DATA,U,2)'="S"  ;-> | 
|---|
| 263 | .  H 15 ; If not hung, and is a proper stub entry, it will disappear | 
|---|
| 264 | .  S DATA=$G(^HLCS(870,+IEN870,WAY,IEN,0)) QUIT:$P(DATA,U,2)'="S"  ;-> | 
|---|
| 265 | .  S MIEN870=IEN | 
|---|
| 266 | ; | 
|---|
| 267 | Q MIEN870 | 
|---|
| 268 | ; | 
|---|
| 269 | HD W @IOF,$$CJ^XLFSTR("Stub Record Correction",IOM) | 
|---|
| 270 | W !,$$REPEAT^XLFSTR("=",IOM) | 
|---|
| 271 | QUIT | 
|---|
| 272 | ; | 
|---|
| 273 | EX N I,T F I=1:1 S T=$T(EX+I) QUIT:T'[";;"  W !,$P(T,";;",2,99) | 
|---|
| 274 | ;;Occasionally, entry's in the IN QUEUE and the OUT QUEUE of the HL Logical | 
|---|
| 275 | ;;Link file (#870) get stuck in the STUB status.  (Stub records have the STATUS | 
|---|
| 276 | ;;field set to STUB.)  When this occurs, no further processing of the queue | 
|---|
| 277 | ;;occurs. | 
|---|
| 278 | ;; | 
|---|
| 279 | ;;This utility loops through the IN QUEUE or the OUT QUEUE of a logical link | 
|---|
| 280 | ;;looking for stub records.  (Stub records have the STATUS field set to STUB.) | 
|---|
| 281 | ;;When it finds a stub record it requests permission to set the STATUS field to | 
|---|
| 282 | ;;DONE. | 
|---|
| 283 | QUIT | 
|---|
| 284 | ; | 
|---|
| 285 | EOR ;HLEVX000 - VistA HL7 Event Monitor Code ;5/30/03 15:25 | 
|---|