LABERR ; SLC/FHS - ERROR TRAP FOR LABORATORY AUTO INSTRUMENTS  ;11/20/90  09:45
 ;;5.2;AUTOMATED LAB INSTRUMENTS;**42**;Sep 27, 1994
EN ;
 ;^LA("ERR")=Last # used^Time last error^instrument/routine^Total errors todate
 ;^LA("ERR",#,0)=Time^IO^$J^DUZ^Tsk/instrument/routine^ZA^ZB^UCI^ZTSK
 ;^LA("ERR",#,"ER")=Error Description
 ;^LA("ERR",#,"ZR")=0
 ;^LA("ERR",#,"ZTSK")=ZTSK
 ;All local variables are stored in ^%ZTSK(ZTSK
 ; The data is cleared on the third day (midnight) This is the default setting
 ;Field 606 of ^LAB(69.9 allows this time to be site determined (3-30 days)
 ;The Y(x) variable are saved in LABZY(x) and X variable is saved in LABZX
 ;%ZTLOAD PROGRAM KILLS Y(x) VARIABLES.
EN1 ;
 S (LABZA,LABZB,LABZR)=0,LABZE=$$EC^%ZOSV
 S:$D(X)#2 LABZX=X S:$D(Y)#2 LABZY=Y S:$D(%DT)#2 LABZD=%DT S:$D(X1)#2 LABZX1=X1 S:$D(LABZX2)#2 LABZX2=X2 S:$D(X3)#2 LABZX3=X3 S:$D(DT)#2 LABZDT=DT
 S XS="" F Y=0:0 S XS=$O(Y(XS)) Q:XS=""  S LABZY(XS)=Y(XS)
 K XS N I,X,X1,Y,X2,DT,%DT,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE,ZTSK
 S DT=$$DT^XLFDT,SY=$$NOW^XLFDT
 L ^LA("ERR")
 S:'$D(^LA("ERR"))#2 ^LA("ERR")=0 S ERR=+^LA("ERR")
 S:'$D(^LA("ERR","DT",DT)) ^(DT)=0 G:^(DT)>100 FUL S $P(^LA("ERR"),"^",2)=SY
A S ERR=ERR+1 G:$D(^LA("ERR",ERR)) A S $P(^LA("ERR"),U)=ERR,$P(^("ERR"),U,4)=1+$P(^("ERR"),U,4),^LA("ERR","DT",DT)=1+^LA("ERR","DT",DT)
 X ^%ZOSF("UCI") S LABUCI=Y
 S ^LA("ERR",ERR,0)=SY_U_$S($D(IO)#2:IO,$D(ION):ION,$D(IO(0)):IO(0),1:"")_U_$J_U_$S($D(DUZ):DUZ,1:.5)_U_$S($D(LANM):LANM,$D(LRINST):LRINST,$D(TSK):TSK,$D(T):T,1:"???")_U_LABZA_U_LABZB_U_Y
 S ^("ZR")=LABZR,^("ZE")=LABZE
 S $P(^LA("ERR"),U,3)=$P(^LA("ERR",ERR,0),U,5)
 S ^LA("ERR","B",$P(^LA("ERR",ERR,0),U,5),ERR)=""
 L
 S X2=3 I $D(^LAB(69.9,1,"ER"))#2,+^("ER")>0 S X2=^("ER")
 S X1=DT D C^%DTC S ZTDTH=X_".2359",ZTSAVE("*")="",ZTRTN="DQ^LABERR",ZTDESC="CLEAN UP LAB ERROR TRAP",ZTIO=""
LOAD ;
 S:$D(LABZX)#2 X=LABZX S:$D(LABZY)#2 Y=LABZY S:$D(LABZD)#2 %DT=LABZD S:$D(LABZX1)#2 X1=LABZX1 S:$D(LABZX2)#2 X2=LABZX2 S:$D(LABZX3)#2 X3=LABZX3 S:$D(LABZDT)#2 DT=LABZDT
 K ZTSK D ^%ZTLOAD S ZTSK=$S($D(ZTSK):ZTSK,1:"???") S $P(^LA("ERR",ERR,0),U,9)=ZTSK
 S ^LA("ERR",ERR,"ZTSK")=ZTSK
 S ^LA("ERR","C",$P(^(0),U,5),ZTSK)=""
FUL ;
 L  K ERR,X1,X2,ZTSK,ZTDTH,ZTRTN,ZTDESC,ZTIO,%DT,LABZX,LABUCI,LABZY,LABZA,LABZD,LABZX1,LABZX2,LABZX3,LABZB,LABZDT,LABZE,LABZR,SY Q
 Q
 ;
DQ ;Dequeue errors
 S:$D(ZTQUEUED) ZTREQ="@"
 I $D(ERR),$D(^LA("ERR",ERR,0)) S TSK=$S($L($P(^(0),U,5)):$P(^(0),U,5),1:0),T=+$P(^(0),".") K ^LA("ERR",ERR),^LA("ERR","B",TSK,ERR) I $P(^LA("ERR"),U,4)>0 S $P(^("ERR"),U,4)=$P(^("ERR"),U,4)-1
 I $D(TSK),$D(ZTSK) K ^LA("ERR","C",TSK,ZTSK)
 I $D(T),$D(^LA("ERR","DT",T))#2 S:^(T)>0 ^(T)=^(T)-1 I ^(T)=0 K ^(T)
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLABERR   2711     printed  Sep 23, 2025@19:17:30                                                                                                                                                                                                      Page 2
LABERR    ; SLC/FHS - ERROR TRAP FOR LABORATORY AUTO INSTRUMENTS  ;11/20/90  09:45
 +1       ;;5.2;AUTOMATED LAB INSTRUMENTS;**42**;Sep 27, 1994
EN        ;
 +1       ;^LA("ERR")=Last # used^Time last error^instrument/routine^Total errors todate
 +2       ;^LA("ERR",#,0)=Time^IO^$J^DUZ^Tsk/instrument/routine^ZA^ZB^UCI^ZTSK
 +3       ;^LA("ERR",#,"ER")=Error Description
 +4       ;^LA("ERR",#,"ZR")=0
 +5       ;^LA("ERR",#,"ZTSK")=ZTSK
 +6       ;All local variables are stored in ^%ZTSK(ZTSK
 +7       ; The data is cleared on the third day (midnight) This is the default setting
 +8       ;Field 606 of ^LAB(69.9 allows this time to be site determined (3-30 days)
 +9       ;The Y(x) variable are saved in LABZY(x) and X variable is saved in LABZX
 +10      ;%ZTLOAD PROGRAM KILLS Y(x) VARIABLES.
EN1       ;
 +1        SET (LABZA,LABZB,LABZR)=0
           SET LABZE=$$EC^%ZOSV
 +2        if $DATA(X)#2
               SET LABZX=X
           if $DATA(Y)#2
               SET LABZY=Y
           if $DATA(%DT)#2
               SET LABZD=%DT
           if $DATA(X1)#2
               SET LABZX1=X1
           if $DATA(LABZX2)#2
               SET LABZX2=X2
           if $DATA(X3)#2
               SET LABZX3=X3
           if $DATA(DT)#2
               SET LABZDT=DT
 +3        SET XS=""
           FOR Y=0:0
               SET XS=$ORDER(Y(XS))
               if XS=""
                   QUIT 
               SET LABZY(XS)=Y(XS)
 +4        KILL XS
           NEW I,X,X1,Y,X2,DT,%DT,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE,ZTSK
 +5        SET DT=$$DT^XLFDT
           SET SY=$$NOW^XLFDT
 +6        LOCK ^LA("ERR")
 +7        if '$DATA(^LA("ERR"))#2
               SET ^LA("ERR")=0
           SET ERR=+^LA("ERR")
 +8        if '$DATA(^LA("ERR","DT",DT))
               SET ^(DT)=0
           if ^(DT)>100
               GOTO FUL
           SET $PIECE(^LA("ERR"),"^",2)=SY
A          SET ERR=ERR+1
           if $DATA(^LA("ERR",ERR))
               GOTO A
           SET $PIECE(^LA("ERR"),U)=ERR
           SET $PIECE(^("ERR"),U,4)=1+$PIECE(^("ERR"),U,4)
           SET ^LA("ERR","DT",DT)=1+^LA("ERR","DT",DT)
 +1        XECUTE ^%ZOSF("UCI")
           SET LABUCI=Y
 +2        SET ^LA("ERR",ERR,0)=SY_U_$SELECT($DATA(IO)#2:IO,$DATA(ION):ION,$DATA(IO(0)):IO(0),1:"")_U_$JOB_U_$SELECT($DATA(DUZ):DUZ,1:.5)_U_$SELECT($DATA(LANM):LANM,$DATA(LRINST):LRINST,$DATA(TSK):TSK,$DATA(T):T,1:"???")_U_LABZA_U_LABZB_U_Y
 +3        SET ^("ZR")=LABZR
           SET ^("ZE")=LABZE
 +4        SET $PIECE(^LA("ERR"),U,3)=$PIECE(^LA("ERR",ERR,0),U,5)
 +5        SET ^LA("ERR","B",$PIECE(^LA("ERR",ERR,0),U,5),ERR)=""
 +6        LOCK 
 +7        SET X2=3
           IF $DATA(^LAB(69.9,1,"ER"))#2
               IF +^("ER")>0
                   SET X2=^("ER")
 +8        SET X1=DT
           DO C^%DTC
           SET ZTDTH=X_".2359"
           SET ZTSAVE("*")=""
           SET ZTRTN="DQ^LABERR"
           SET ZTDESC="CLEAN UP LAB ERROR TRAP"
           SET ZTIO=""
LOAD      ;
 +1        if $DATA(LABZX)#2
               SET X=LABZX
           if $DATA(LABZY)#2
               SET Y=LABZY
           if $DATA(LABZD)#2
               SET %DT=LABZD
           if $DATA(LABZX1)#2
               SET X1=LABZX1
           if $DATA(LABZX2)#2
               SET X2=LABZX2
           if $DATA(LABZX3)#2
               SET X3=LABZX3
           if $DATA(LABZDT)#2
               SET DT=LABZDT
 +2        KILL ZTSK
           DO ^%ZTLOAD
           SET ZTSK=$SELECT($DATA(ZTSK):ZTSK,1:"???")
           SET $PIECE(^LA("ERR",ERR,0),U,9)=ZTSK
 +3        SET ^LA("ERR",ERR,"ZTSK")=ZTSK
 +4        SET ^LA("ERR","C",$PIECE(^(0),U,5),ZTSK)=""
FUL       ;
 +1        LOCK 
           KILL ERR,X1,X2,ZTSK,ZTDTH,ZTRTN,ZTDESC,ZTIO,%DT,LABZX,LABUCI,LABZY,LABZA,LABZD,LABZX1,LABZX2,LABZX3,LABZB,LABZDT,LABZE,LABZR,SY
           QUIT 
 +2        QUIT 
 +3       ;
DQ        ;Dequeue errors
 +1        if $DATA(ZTQUEUED)
               SET ZTREQ="@"
 +2        IF $DATA(ERR)
               IF $DATA(^LA("ERR",ERR,0))
                   SET TSK=$SELECT($LENGTH($PIECE(^(0),U,5)):$PIECE(^(0),U,5),1:0)
                   SET T=+$PIECE(^(0),".")
                   KILL ^LA("ERR",ERR),^LA("ERR","B",TSK,ERR)
                   IF $PIECE(^LA("ERR"),U,4)>0
                       SET $PIECE(^("ERR"),U,4)=$PIECE(^("ERR"),U,4)-1
 +3        IF $DATA(TSK)
               IF $DATA(ZTSK)
                   KILL ^LA("ERR","C",TSK,ZTSK)
 +4        IF $DATA(T)
               IF $DATA(^LA("ERR","DT",T))#2
                   if ^(T)>0
                       SET ^(T)=^(T)-1
                   IF ^(T)=0
                       KILL ^(T)
 +5        QUIT