HLEVX000 ;O-OIFO/LJA - VistA HL7 Event Monitor Code ;02/04/2004 15:25 ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 ; ; Event Types - 870-DINUM, 870-SKIP, 870-STUB ; CHK870 ; Search for various file 870 problems... ; ; {01/16/04 - See call to REPDINUM below.} ; N CT870,CTERR,CTNO,CTSTUB,DATA,DATABEF,IEN870,LINKNM,MIEN870 N NOW,STATUS,TXT,VAR,WAY,XTMPBEF,XTMPNOW ; ; Call event monitor... KILL VAR ; Variables can be defined prior to passing into START by reference... F VAR="CT870","CTDINUM","CTERR" S VAR(VAR)="" ; #1-Indiv array elements S VAR="CTNO^CTSKIP^CTSTUB" ; #2-Parsed from string D START^HLEVAPI(.VAR) ; Even D START^HLEVAPI(VAR) would work... ; KILL ^TMP($J,"HLREP"),^TMP($J,"HLEV REP"),^TMP($J,"HLMAIL") ; ; Set current XTMP subscript and create zero node... S NOW=$$NOW^XLFDT,XTMPNOW="HLEV STUB "_NOW S ^XTMP(XTMPNOW,0)=$$FMADD^XLFDT(NOW,2)_U_NOW_U_"HLEV Stub Record Search" ; ; Has there been a prior run? If so, set XTMPBEF. If not, set to null S XTMPBEF=$O(^XTMP(XTMPNOW),-1),XTMPBEF=$S(XTMPBEF["HLEV STUB ":XTMPBEF,1:"") ; ; Find current stub entries... S (CT870,CTDINUM,CTERR,CTNO,CTSKIP,CTSTUB)=0,IEN870=0,CTNO=0 F S IEN870=$O(^HLCS(870,IEN870)) Q:IEN870'>0 D . D CHECKIN^HLEVAPI . S CT870=CT870+1 . S LINKNM=$P($G(^HLCS(870,+IEN870,0)),U) . S LINKNM=$S(LINKNM]"":LINKNM_"["_IEN870_"]",1:"IEN ["_IEN870_"]") . ; 1=IN QUEUE 2=OUT QUEUE . F WAY=1,2 D . . S WAY(1)=$S(WAY=1:"I",1:"O") . . D CHECKIN^HLEVAPI . . S MIEN870=$O(^HLCS(870,+IEN870,WAY,0)) ; First entry... . . S MIEN870(1)=$O(^HLCS(870,+IEN870,WAY,":"),-1) ; Last entry... . . Q:MIEN870'>0!(MIEN870(1)'>0) ;-> . . F MIEN870=MIEN870:1:MIEN870(1) D . . . S CTNO=CTNO+1 . . . I '(CTNO#500) D CHECKIN^HLEVAPI . . . D CHECKS(IEN870,WAY,MIEN870) ; D CHECKIN^HLEVAPI ; To store final values of variables D CHECKOUT^HLEVAPI ; To finalize fields... ; S ^XTMP(XTMPNOW,0,0)=CT870_U_CTNO_"~"_CTERR_"~"_CTDINUM_U_CTSKIP_U_CTSTUB ; ; Create report and put in text... QUIT:'$D(^TMP($J,"HLEV REP")) ;-> ; ; Create report text... D GENREP^HLEVUTI0($NA(^TMP($J,"HLEV REP")),$NA(^TMP($J,"HLEVREP")),4,1) ; ; Load report text in 776 message text... D MSGTEXT^HLEVAPI1($NA(^TMP($J,"HLEVREP"))) ; ; Mail report... S HLEVTXT(1)="MESSAGETEXT" D MAILIT^HLEVAPI ; ; Report DINUM problems, using report text... D REPDINUM^HLEVX003 ; {01/16/04} ; ; Clean out ^TMP data... KILL ^TMP($J,"HLREP"),^TMP($J,"HLEV REP"),^TMP($J,"HLMAIL") ; Q ; SITE S SITE=$$SITE^VASITE,SITE=$P(SITE,U,2)_" ["_$P(SITE,U,3)_"]" D ADD("Run site: "_SITE) D ADD("") ; EXPL D ADD("Some stub entries exist in the HL Logical Link file (#870) that") D ADD("appear to be ""stuck"". Someone at the site needs to check out") D ADD("and possibly change their status to DONE.") ; HDR D ADD("") D ADD("Link In/Out IENs") D ADD($$REPEAT^XLFSTR("-",74)) ; ; Send report... REP S LINKNM="" F S LINKNM=$O(^TMP($J,"HLEV REP",LINKNM)) Q:LINKNM']"" D . S TXT=$E(LINKNM_" ",1,15) . S WAY="",CTNO=0 . F S WAY=$O(^TMP($J,"HLEV REP",LINKNM,WAY)) Q:WAY']"" D . . S TXT=$E(TXT_" "_$S(WAY="I":"IN",1:"OUT")_$$REPEAT^XLFSTR(" ",80),1,25) . . S MIEN870=0 . . F S MIEN870=$O(^TMP($J,"HLEV REP",LINKNM,WAY,MIEN870)) Q:MIEN870'>0 D . . . S CTNO=CTNO+1 . . . I ($L(TXT)+$L(MIEN870)+2)>74 D QUIT ;-> . . . . D ADD(TXT) . . . . S TXT=$$REPEAT^XLFSTR(" ",25) . . . S TXT=TXT_$S($L(TXT)>25:",",1:"")_MIEN870 . . I $TR(TXT," ","")]"" D ADD(TXT) . . S TXT=$$REPEAT^XLFSTR(" ",15) . I TXT]"" D ADD(TXT) S TXT="" I TXT]"" D ADD(TXT) S TXT="" ; D MSGTEXT^HLEVAPI1($NA(^TMP($J,"HLMAIL"))) ; KILL ^TMP($J,"HLEV REP"),^TMP($J,"HLMAIL") ; S HLEVTXT(1)="MESSAGE TEXT" D MAILIT^HLEVAPI ; Q ; ADD(TXT) ; Add to global for moving into report N NO S NO=$O(^TMP($J,"HLMAIL",":"),-1)+1 S ^TMP($J,"HLMAIL",+NO)=TXT Q ; MSG(TXT) ; Generic text displayer... W !!,TXT W ! ; Always put at least one blank row in place F Q:($Y+3)>IOSL W ! S X=$$BTE^HLCSMON("Press RETURN to exit... ") Q ; CHECKS(IEN870,WAY,MIEN870) ; Perform various checks on queue entry... ; CTDINUM,CTSKIP,CTSTUB -- req QUIT:'$$DATA870(IEN870,WAY,MIEN870) ;-> D CHKSTUB(IEN870,WAY,MIEN870) D CHKDINUM(IEN870,WAY,MIEN870) Q ; DATA870(IEN870,WAY,MIEN870) ; Does record exist? ; CTSKIP,LINKNM -- req ; ; Check for existence of data here... QUIT:$G(^HLCS(870,+IEN870,WAY,+MIEN870,0))]"" 1 ;-> ; S WAY(1)=$S(WAY=1:"INCOMING",1:"OUTGOING") ; ; Has this problem already been logged? QUIT:'$$LOG^HLEVAPI2("870-SKIP","IEN870^WAY^MIEN870") "" ;-> ; D RECORD("SKIP",LINKNM,WAY(1),MIEN870) S CTSKIP=CTSKIP+1,CTERR=CTERR+1 ; Q "" ; CHKSTUB(IEN870,WAY,MIEN870) ; Check if a stub record that "hangs around" ; CTSTUB,LINKNM -- req N DATABEF,STATUS S STATUS=$P($G(^HLCS(870,+IEN870,+WAY,+MIEN870,0)),U,2) QUIT:STATUS'="S" ;-> Stub record S WAY(1)=$S(WAY=1:"INCOMING",1:"OUTGOING") S DATABEF=$S(XTMPBEF']"":"",1:$S($D(^XTMP(XTMPBEF,+IEN870,WAY(1),+MIEN870)):1,1:"")) S ^XTMP(XTMPNOW,+IEN870,WAY(1),+MIEN870)=DATABEF QUIT:'DATABEF ;-> Stub entry didn't exist before... ; ; Has this problem already been logged? QUIT:'$$LOG^HLEVAPI2("870-STUB","IEN870^WAY^MIEN870") ;-> ; D RECORD("STUB",LINKNM,WAY(1),MIEN870) S CTSTUB=CTSTUB+1,CTERR=CTERR+1 ; Q ; CHKDINUM(IEN870,WAY,MIEN870) ; Check for records not DINUMd for log link ; CTDINUM,LINKNM -- req ; ; {01/16/04 - Call to $$LOG^HLEVAPI2 removed. See REPDINUM call.} ; N IEN ; ; DINUM check here... S IEN=+$G(^HLCS(870,+IEN870,WAY,+MIEN870,0)) QUIT:IEN=MIEN870 ;-> ; S WAY(1)=$S(WAY=1:"INCOMING",1:"OUTGOING") ; ; New occurence, so record error... D RECORD("DINUM",LINKNM,WAY(1),MIEN870) S CTDINUM=CTDINUM+1,CTERR=CTERR+1 ; Q ; RECORD(PROBL,LINKNM,WAY,MIEN870) ; Record for later inclusion in report ; ; Required: At least two levels passed... S PROBL=$G(PROBL) QUIT:PROBL']"" ;-> S LINKNM=$G(LINKNM) QUIT:LINKNM']"" ;-> S LEVEL=2 S WAY=$G(WAY) I WAY]"" S LEVEL=3 S MIEN870=$G(MIEN870) I MIEN870]"" S LEVEL=4 ; ; Data level set... I LEVEL=4 S ^TMP($J,"HLEV REP",PROBL,LINKNM,WAY,MIEN870)="" I LEVEL=3 S ^TMP($J,"HLEV REP",PROBL,LINKNM,WAY)="" I LEVEL=2 S ^TMP($J,"HLEV REP",PROBL,LINKNM)="" ; ; Total level sets... I LEVEL=4 S ^TMP($J,"HLEV REP",PROBL,LINKNM,WAY)=$G(^TMP($J,"HLEV REP",PROBL,LINKNM,WAY))+1 I LEVEL=3 S ^TMP($J,"HLEV REP",PROBL,LINKNM)=$G(^TMP($J,"HLEV REP",PROBL,LINKNM))+1 S ^TMP($J,"HLEV REP",PROBL)=$G(^TMP($J,"HLEV REP",PROBL))+1 S ^TMP($J,"HLEV REP")=$G(^TMP($J,"HLEV REP"))+1 ; Q ; ; ==================================================================== ; CORRECT ; Correct a stub entry in HLCS(870)... N IEN870,MIEN870,WAY D HD,EX S WAY=$$WAY I WAY']"" D QUIT ;-> . D MSG("Exiting... ") W ! S IEN870=$$LINK I IEN870']"" D QUIT ;-> . D MSG("No link selected. Start again... ") CONT W ! S MIEN870=$$MIEN870(IEN870,WAY) I MIEN870'>0 D QUIT ;-> . D MSG("No stub entry exists for link.") W !!,"Stub record# ",MIEN870," found. It's status is about to be changed to DONE..." W ! QUIT:'$$YN^HLCSRPT4("OK to correct","Yes") ;-> D FIX(IEN870,WAY,MIEN870,"D") W " fixed... " W ! QUIT:$$BTE^HLCSMON("Press RETURN to continue searching... ") ;-> G CONT ;-> ; FIX(IEN870,WAY,MIEN870,STAT) ; Fix stub record... N DA,DIE,DR,SUBDD S DIE="^HLCS(870,"_IEN870_","_WAY_"," S DA(1)=IEN870,DA=+MIEN870 S DR=$S($G(STAT)]"":"1///"_STAT,1:1) D ^DIE Q ; WAY() ; In or Out? N DIR,DIRUT,DTOUT,DUOUT,X,Y S DIR(0)="SO^1:Search the IN QUEUE;2:Search the OUT QUEUE" S DIR("A")="Select the QUEUE to search" D ^DIR QUIT:$D(DIRUT)!($D(DTOUT))!($D(DUOUT)) "" ;-> Q $S(+Y:+Y,1:"") ; LINK() ; Which 870 entry? N DIC,X,Y S DIC=870,DIC(0)="AEMQ",DIC("A")="Select LOGICAL LINK: " D ^DIC Q $S(+Y:+Y,1:"") ; MIEN870(IEN870,WAY) ; Search for stub record... N CT,IEN,IOINHI,IOINORM,MIEN870,STATUS,X ; S X="IOINHI;IOINORM" D ENDR^%ZISS ; W !,IOINHI,"Searching for stub records...",IOINORM S CT=0,IEN=0,MIEN870=0 F S IEN=$O(^HLCS(870,+IEN870,WAY,IEN)) Q:IEN'>0!(MIEN870) D . S CT=CT+1 W:'(CT#500) "." . S DATA=$G(^HLCS(870,+IEN870,WAY,IEN,0)) QUIT:$P(DATA,U,2)'="S" ;-> . H 15 ; If not hung, and is a proper stub entry, it will disappear . S DATA=$G(^HLCS(870,+IEN870,WAY,IEN,0)) QUIT:$P(DATA,U,2)'="S" ;-> . S MIEN870=IEN ; Q MIEN870 ; HD W @IOF,$$CJ^XLFSTR("Stub Record Correction",IOM) W !,$$REPEAT^XLFSTR("=",IOM) QUIT ; EX N I,T F I=1:1 S T=$T(EX+I) QUIT:T'[";;" W !,$P(T,";;",2,99) ;;Occasionally, entry's in the IN QUEUE and the OUT QUEUE of the HL Logical ;;Link file (#870) get stuck in the STUB status. (Stub records have the STATUS ;;field set to STUB.) When this occurs, no further processing of the queue ;;occurs. ;; ;;This utility loops through the IN QUEUE or the OUT QUEUE of a logical link ;;looking for stub records. (Stub records have the STATUS field set to STUB.) ;;When it finds a stub record it requests permission to set the STATUS field to ;;DONE. QUIT ; EOR ;HLEVX000 - VistA HL7 Event Monitor Code ;5/30/03 15:25