XUVSM ;BAY/JML - TaskMan Read-Only Calls for the VistA System Monitor;7/1/2025
;;8.0;KERNEL;**818**;7/10/1995;Build 5
;
; This routine provides read-only callables to populate the VSM Operational Dashboard
;
RUNSTATUS() ; returns the Run Status of TaskMan - Adapted from RUN^ZTMON
N ZTH,ZTR,ZTD,ZTD,ZTY,ZTRUNSTAT
S ZTH=$H,ZTR=$G(^%ZTSCH("RUN"))
I ZTR]"" S ZTD=$$DIFF^%ZTM(ZTH,ZTR,0)
S ZTY=$S(ZTR="":0,ZTD>20:0,1:1)
S ZTRUNSTAT=$S(ZTY=1:"Current",ZTY=0:"Late",ZTY=""&$D(^%ZTSCH("STOP")):"Shutting Down",ZTY=""&'$D(^%ZTSCH("STATUS")):"Not Running",1:"Unknown")
Q ZTRUNSTAT_"^"_ZTD_"^"_ZTH_"^"_ZTR
;
STATLIST(KMPARR) ; TaskMan status list - Adapted from STATUS^ZTMON
N ZT,ZTH,ZT2,ZTC,ZTI,ZTX,ZT1,%
S ZT="",ZTH=$$H3^%ZTM($H),ZT2=""
M ZTC("S")=^%ZTSCH("STATUS"),ZTC("L")=^%ZTSCH("LOADA")
F S ZT=$O(ZTC("S",ZT)) Q:ZT="" S ZTX=ZTC("S",ZT) I $L($P(ZTX,"^",3)) S ZTC("D",$P(ZTX,"^",3),ZT)=ZT
S ZT="",ZTI=1
F S ZT=$O(ZTC("D",ZT)),ZT1="" Q:ZT="" F S ZT1=$O(ZTC("D",ZT,ZT1)) Q:ZT1="" D
.S %=ZTC("S",ZT1),ZT2=1
.S KMPARR("LIST",ZTI,"NODE")=ZT
.S KMPARR("LIST",ZTI,"WEIGHT")=$S($D(ZTC("L",ZT)):$J($P(ZTC("L",ZT),"^",2),3),1:"")
.S KMPARR("LIST",ZTI,"STATUS")=$P(%,"^",2)
.S KMPARR("LIST",ZTI,"TIME")=$$STIME^ZTMON($P(%,"^"))
.S KMPARR("LIST",ZTI,"JOBNUM")=ZT1
.S KMPARR("LIST",ZTI,"EXECUTE")=$P(%,"^",4)
.S ZTI=ZTI+1
S KMPARR("STATMESS")=$S('ZT2:"The Status List is "_$S(ZTY:"temporarily ",1:"")_"empty.",1:"")
S KMPARR=ZTI
Q
;
SCHLIST() ;Evaluate Schedule List - Adapted from SCHQ^ZTMON
N ZT1,ZTCO,ZTC,ZTH,X,ZTL,ZT2
S ZT1=0,ZTCO=0,ZTC=0,ZTH=$$H3^%ZTM($H)
S X=$O(^%ZTSCH(0)),ZTL=$$DIFF^ZTMON(ZTH,X,1)
F S ZT1=$O(^%ZTSCH(ZT1)) Q:'ZT1 D
. F ZT2=0:0 S ZT2=$O(^%ZTSCH(ZT1,ZT2)) Q:ZT2="" S ZTC=ZTC+1 I $$DIFF^ZTMON(ZTH,ZT1,1)>0 S ZTCO=ZTCO+1
Q ZTC_"^"_ZTCO_"^"_$S((ZTC>0)&(ZTL>0):ZTL,1:"")
;
IOLIST(KMPARR) ;Evaluate Waiting Lists - Adapted from IO^ZTMON
N X,X1,Y,ZT1,ZT2,ZT3,ZT,ZTCT,ZTTAT,ZTC,ZTI
S ZT1=$$H3^ZTMON1($H),ZT2=$G(^%ZTSCH("IO")),ZT=$$DIFF^%ZTMS1(ZT1,+ZT2,1)
S KMPARR("LASTSCAN")=$S(($D(^%ZTSCH("IO"))>2)&(+ZT2):ZT,1:"")
S KMPARR("LASTDEV")=$S(($D(^%ZTSCH("IO"))>2)&($P(ZT2,"^",2)]""):$P(ZT2,"^",2),1:"")
S ZT1="",ZTCT=0,ZTI=1
F S ZT1=$O(^%ZTSCH("IO",ZT1)) Q:ZT1="" D
.I $D(^%ZTSCH("IO",ZT1))<9 Q
.S Y=1 I ZT1'=$I S X=ZT1,X1=$G(^%ZTSCH("IO",ZT1)) D DEVOK^%ZOSV
.S ZTSTAT=$S(Y:" is not available,",$D(^%ZTSCH("DEV",ZT1)):" is allocated,",1:" is AVAILABLE,")
.S ZTC=0,ZT2="" F ZT=0:0 S ZT2=$O(^%ZTSCH("IO",ZT1,ZT2)),ZT3="" Q:'ZT2 F ZT=0:0 S ZT3=$O(^%ZTSCH("IO",ZT1,ZT2,ZT3)) Q:ZT3="" S ZTC=ZTC+1,ZTCT=ZTCT+1
.S KMPARR("LIST",ZTI,"ONE")=ZT1
.S KMPARR("LIST",ZTI,"TWO")=ZTSTAT
.S KMPARR("LIST",ZTI,"THREE")=ZTC
.S ZTI=ZTI+1
S KMPARR("TTSKWAIT")=ZTCT
Q
;
JOBSWAIT() ; returns # of jobs waiting - Adapted from ^ZTMON1
N ZTC,ZT,ZT1,ZT2
S ZTC=0,ZT1="" F ZT=0:0 S ZT1=$O(^%ZTSCH("JOB",ZT1)),ZT2=0 Q:ZT1="" F ZT=0:0 S ZT2=$O(^%ZTSCH("JOB",ZT1,ZT2)) Q:'ZT2 S ZTC=ZTC+1
Q ZTC
;
TASKSRUN() ; returns the # of tasks running - Adapted from ^ZTMON1
N ZTC,ZT1
S ZTC=0 F ZT1=0:0 S ZT1=$O(^%ZTSCH("TASK",ZT1)) Q:'ZT1 S ZTC=ZTC+1
Q ZTC
;
SMLIST(KMPARR) ; returns Sub-Manager data - Adapted from ^ZTMON1
N ZTNODE,ZTCNT,ZT4,ZTSTAT,ZTNOSTRT
S KMPARR("SUBWAIT")=$S($D(^%ZTSCH("WAIT","SUB")):1,1:0)
S ZTNODE="",ZTI=1
F S ZTNODE=$O(^%ZTSCH("SUB",ZTNODE)) Q:ZTNODE="" D
.S ZTCNT=$G(^%ZTSCH("SUB",ZTNODE)),ZT4=+$G(^%ZTSCH("LOADA",ZTNODE))
.S ZTSTAT=$S($D(^%ZTSCH("STOP","SUB",ZTNODE)):"Stop",ZT4:"BWait",1:"Run")
.S ZTNOSTRT=$S($G(^%ZTSCH("SUB",ZTNODE,0))>5:1,1:0)
.S KMPARR("LIST",ZTI,"NODE")=ZTNODE
.S KMPARR("LIST",ZTI,"COUNT")=ZTCNT
.S KMPARR("LIST",ZTI,"STATUS")=ZTSTAT
.S KMPARR("LIST",ZTI,"NOSTART")=ZTNOSTRT
Q
;
INSTALL(XTARRAY,XTSDAT,XTEDAT) ;
; returns list of patch installs and install dates
; inputs: an array by reference to return results and start/end dates in fileman format
; Defaults for dates are today-14 through today
N XTIEN,XTCHK,XTPAT,%,%H,X
S XTSDAT=$G(XTSDAT),XTEDAT=$G(XTEDAT)
I XTSDAT="" D
.S XTSDAT=$H-14
.S %H=XTSDAT D YMD^%DTC S XTSDAT=X
I XTEDAT="" D
.S XTEDAT=+$H+1
.S %H=XTEDAT D YMD^%DTC S XTEDAT=X
S XTIEN=0
F S XTIEN=$O(^XPD(9.7,XTIEN)) Q:+XTIEN=0 D
.S XTCHK=$P(^XPD(9.7,XTIEN,0),"^",3)
.I XTCHK>XTSDAT,XTCHK<XTEDAT D
..S XTPAT=$P(^XPD(9.7,XTIEN,0),"^")
..S XTARRAY(XTCHK,XTPAT)=""
Q
;
;
FUT(ZTCHECK) ;Future tasks.
N ZT1,ZT2,ZTS,XU0,XU1,XU2,XUOPT,XUDAY,XURT,XUTIME
; FROM XUTMQ2
K ^TMP($J)
S ZT1="" F S ZT1=$O(^%ZTSCH("JOB",ZT1)) Q:ZT1="" D
.S ZT2="" F S ZT2=$O(^%ZTSCH("JOB",ZT1,ZT2)) Q:'ZT2 D
.. D SORT(ZT1,ZT2) ;S ^TMP($J,99999-ZT1,99999-$P(ZT1,",",2),ZT2)=""
S ZT1=$$H3^%ZTM($H) F S ZT1=$O(^%ZTSCH(ZT1)) Q:'ZT1 D
.S ZTS=0 F S ZTS=$O(^%ZTSCH(ZT1,ZTS)) Q:'ZTS D
.. D SORT(ZT1,ZTS) ;S ^TMP($J,99999-ZT1,99999-$P(ZT1,",",2),ZTS)=""
S ZT1="" F S ZT1=$O(^%ZTSCH("IO",ZT1)) Q:ZT1="" D
.S ZT2="" F S ZT2=$O(^%ZTSCH("IO",ZT1,ZT2)) Q:'ZT2 D
..S ZT3=0 F S ZT3=$O(^%ZTSCH("IO",ZT1,ZT2,ZT3)) Q:ZT3="" D
... D SORT(ZT2,ZT3) ;S ^TMP($J,99999-ZT2,99999-$P(ZT2,",",2),ZT3)=""
S ZT1="" F S ZT1=$O(^%ZTSCH("LINK",ZT1)) Q:'ZT1 D
.S ZT2="" F S ZT2=$O(^%ZTSCH("LINK",ZT1,ZT2)) Q:'ZT2 D
..S ZTS=0 F S ZTS=$O(^%ZTSCH("LINK",ZT1,ZT2,ZTS)) Q:'ZTS D
... D SORT(ZT2,ZTS) ;S ^TMP($J,99999-ZT2,99999-$P(ZT2,",",2),ZTS)=""
; BASED ON XUTMQ
S XU1=""
F S XU1=$O(^TMP($J,XU1)) Q:XU1'>0 D
.S XU2=0
.F S XU2=$O(^TMP($J,XU1,XU2)) Q:XU2'>0 D
..S XU0=$G(^%ZTSK(XU2,0))
..Q:XU0=""
..S XUOPT=$P(XU0,"^",9) Q:XUOPT=""
..I $D(ZTCHECK(XUOPT)) D
...S XURT=$P(XU0,"^",6)
...S XUDAY=$ZD($P(XURT,","),3),XUTIME=$ZT($P(XURT,",",2))
...S ZTCHECK(XUOPT)=XUDAY_" "_XUTIME
K ^TMP($J)
Q
;
SORT(ZTDTH,ZTSK) ;
I ZTDTH["," S ZTDTH=$$H3^%ZTM(ZTDTH)
S ^TMP($J,ZTDTH,ZTSK)=""
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUVSM 5843 printed Apr 22, 2026@14:11:28 Page 2
XUVSM ;BAY/JML - TaskMan Read-Only Calls for the VistA System Monitor;7/1/2025
+1 ;;8.0;KERNEL;**818**;7/10/1995;Build 5
+2 ;
+3 ; This routine provides read-only callables to populate the VSM Operational Dashboard
+4 ;
RUNSTATUS() ; returns the Run Status of TaskMan - Adapted from RUN^ZTMON
+1 NEW ZTH,ZTR,ZTD,ZTD,ZTY,ZTRUNSTAT
+2 SET ZTH=$HOROLOG
SET ZTR=$GET(^%ZTSCH("RUN"))
+3 IF ZTR]""
SET ZTD=$$DIFF^%ZTM(ZTH,ZTR,0)
+4 SET ZTY=$SELECT(ZTR="":0,ZTD>20:0,1:1)
+5 SET ZTRUNSTAT=$SELECT(ZTY=1:"Current",ZTY=0:"Late",ZTY=""&$DATA(^%ZTSCH("STOP")):"Shutting Down",ZTY=""&'$DATA(^%ZTSCH("STATUS")):"Not Running",1:"Unknown")
+6 QUIT ZTRUNSTAT_"^"_ZTD_"^"_ZTH_"^"_ZTR
+7 ;
STATLIST(KMPARR) ; TaskMan status list - Adapted from STATUS^ZTMON
+1 NEW ZT,ZTH,ZT2,ZTC,ZTI,ZTX,ZT1,%
+2 SET ZT=""
SET ZTH=$$H3^%ZTM($HOROLOG)
SET ZT2=""
+3 MERGE ZTC("S")=^%ZTSCH("STATUS"),ZTC("L")=^%ZTSCH("LOADA")
+4 FOR
SET ZT=$ORDER(ZTC("S",ZT))
if ZT=""
QUIT
SET ZTX=ZTC("S",ZT)
IF $LENGTH($PIECE(ZTX,"^",3))
SET ZTC("D",$PIECE(ZTX,"^",3),ZT)=ZT
+5 SET ZT=""
SET ZTI=1
+6 FOR
SET ZT=$ORDER(ZTC("D",ZT))
SET ZT1=""
if ZT=""
QUIT
FOR
SET ZT1=$ORDER(ZTC("D",ZT,ZT1))
if ZT1=""
QUIT
Begin DoDot:1
+7 SET %=ZTC("S",ZT1)
SET ZT2=1
+8 SET KMPARR("LIST",ZTI,"NODE")=ZT
+9 SET KMPARR("LIST",ZTI,"WEIGHT")=$SELECT($DATA(ZTC("L",ZT)):$JUSTIFY($PIECE(ZTC("L",ZT),"^",2),3),1:"")
+10 SET KMPARR("LIST",ZTI,"STATUS")=$PIECE(%,"^",2)
+11 SET KMPARR("LIST",ZTI,"TIME")=$$STIME^ZTMON($PIECE(%,"^"))
+12 SET KMPARR("LIST",ZTI,"JOBNUM")=ZT1
+13 SET KMPARR("LIST",ZTI,"EXECUTE")=$PIECE(%,"^",4)
+14 SET ZTI=ZTI+1
End DoDot:1
+15 SET KMPARR("STATMESS")=$SELECT('ZT2:"The Status List is "_$SELECT(ZTY:"temporarily ",1:"")_"empty.",1:"")
+16 SET KMPARR=ZTI
+17 QUIT
+18 ;
SCHLIST() ;Evaluate Schedule List - Adapted from SCHQ^ZTMON
+1 NEW ZT1,ZTCO,ZTC,ZTH,X,ZTL,ZT2
+2 SET ZT1=0
SET ZTCO=0
SET ZTC=0
SET ZTH=$$H3^%ZTM($HOROLOG)
+3 SET X=$ORDER(^%ZTSCH(0))
SET ZTL=$$DIFF^ZTMON(ZTH,X,1)
+4 FOR
SET ZT1=$ORDER(^%ZTSCH(ZT1))
if 'ZT1
QUIT
Begin DoDot:1
+5 FOR ZT2=0:0
SET ZT2=$ORDER(^%ZTSCH(ZT1,ZT2))
if ZT2=""
QUIT
SET ZTC=ZTC+1
IF $$DIFF^ZTMON(ZTH,ZT1,1)>0
SET ZTCO=ZTCO+1
End DoDot:1
+6 QUIT ZTC_"^"_ZTCO_"^"_$SELECT((ZTC>0)&(ZTL>0):ZTL,1:"")
+7 ;
IOLIST(KMPARR) ;Evaluate Waiting Lists - Adapted from IO^ZTMON
+1 NEW X,X1,Y,ZT1,ZT2,ZT3,ZT,ZTCT,ZTTAT,ZTC,ZTI
+2 SET ZT1=$$H3^ZTMON1($HOROLOG)
SET ZT2=$GET(^%ZTSCH("IO"))
SET ZT=$$DIFF^%ZTMS1(ZT1,+ZT2,1)
+3 SET KMPARR("LASTSCAN")=$SELECT(($DATA(^%ZTSCH("IO"))>2)&(+ZT2):ZT,1:"")
+4 SET KMPARR("LASTDEV")=$SELECT(($DATA(^%ZTSCH("IO"))>2)&($PIECE(ZT2,"^",2)]""):$PIECE(ZT2,"^",2),1:"")
+5 SET ZT1=""
SET ZTCT=0
SET ZTI=1
+6 FOR
SET ZT1=$ORDER(^%ZTSCH("IO",ZT1))
if ZT1=""
QUIT
Begin DoDot:1
+7 IF $DATA(^%ZTSCH("IO",ZT1))<9
QUIT
+8 SET Y=1
IF ZT1'=$IO
SET X=ZT1
SET X1=$GET(^%ZTSCH("IO",ZT1))
DO DEVOK^%ZOSV
+9 SET ZTSTAT=$SELECT(Y:" is not available,",$DATA(^%ZTSCH("DEV",ZT1)):" is allocated,",1:" is AVAILABLE,")
+10 SET ZTC=0
SET ZT2=""
FOR ZT=0:0
SET ZT2=$ORDER(^%ZTSCH("IO",ZT1,ZT2))
SET ZT3=""
if 'ZT2
QUIT
FOR ZT=0:0
SET ZT3=$ORDER(^%ZTSCH("IO",ZT1,ZT2,ZT3))
if ZT3=""
QUIT
SET ZTC=ZTC+1
SET ZTCT=ZTCT+1
+11 SET KMPARR("LIST",ZTI,"ONE")=ZT1
+12 SET KMPARR("LIST",ZTI,"TWO")=ZTSTAT
+13 SET KMPARR("LIST",ZTI,"THREE")=ZTC
+14 SET ZTI=ZTI+1
End DoDot:1
+15 SET KMPARR("TTSKWAIT")=ZTCT
+16 QUIT
+17 ;
JOBSWAIT() ; returns # of jobs waiting - Adapted from ^ZTMON1
+1 NEW ZTC,ZT,ZT1,ZT2
+2 SET ZTC=0
SET ZT1=""
FOR ZT=0:0
SET ZT1=$ORDER(^%ZTSCH("JOB",ZT1))
SET ZT2=0
if ZT1=""
QUIT
FOR ZT=0:0
SET ZT2=$ORDER(^%ZTSCH("JOB",ZT1,ZT2))
if 'ZT2
QUIT
SET ZTC=ZTC+1
+3 QUIT ZTC
+4 ;
TASKSRUN() ; returns the # of tasks running - Adapted from ^ZTMON1
+1 NEW ZTC,ZT1
+2 SET ZTC=0
FOR ZT1=0:0
SET ZT1=$ORDER(^%ZTSCH("TASK",ZT1))
if 'ZT1
QUIT
SET ZTC=ZTC+1
+3 QUIT ZTC
+4 ;
SMLIST(KMPARR) ; returns Sub-Manager data - Adapted from ^ZTMON1
+1 NEW ZTNODE,ZTCNT,ZT4,ZTSTAT,ZTNOSTRT
+2 SET KMPARR("SUBWAIT")=$SELECT($DATA(^%ZTSCH("WAIT","SUB")):1,1:0)
+3 SET ZTNODE=""
SET ZTI=1
+4 FOR
SET ZTNODE=$ORDER(^%ZTSCH("SUB",ZTNODE))
if ZTNODE=""
QUIT
Begin DoDot:1
+5 SET ZTCNT=$GET(^%ZTSCH("SUB",ZTNODE))
SET ZT4=+$GET(^%ZTSCH("LOADA",ZTNODE))
+6 SET ZTSTAT=$SELECT($DATA(^%ZTSCH("STOP","SUB",ZTNODE)):"Stop",ZT4:"BWait",1:"Run")
+7 SET ZTNOSTRT=$SELECT($GET(^%ZTSCH("SUB",ZTNODE,0))>5:1,1:0)
+8 SET KMPARR("LIST",ZTI,"NODE")=ZTNODE
+9 SET KMPARR("LIST",ZTI,"COUNT")=ZTCNT
+10 SET KMPARR("LIST",ZTI,"STATUS")=ZTSTAT
+11 SET KMPARR("LIST",ZTI,"NOSTART")=ZTNOSTRT
End DoDot:1
+12 QUIT
+13 ;
INSTALL(XTARRAY,XTSDAT,XTEDAT) ;
+1 ; returns list of patch installs and install dates
+2 ; inputs: an array by reference to return results and start/end dates in fileman format
+3 ; Defaults for dates are today-14 through today
+4 NEW XTIEN,XTCHK,XTPAT,%,%H,X
+5 SET XTSDAT=$GET(XTSDAT)
SET XTEDAT=$GET(XTEDAT)
+6 IF XTSDAT=""
Begin DoDot:1
+7 SET XTSDAT=$HOROLOG-14
+8 SET %H=XTSDAT
DO YMD^%DTC
SET XTSDAT=X
End DoDot:1
+9 IF XTEDAT=""
Begin DoDot:1
+10 SET XTEDAT=+$HOROLOG+1
+11 SET %H=XTEDAT
DO YMD^%DTC
SET XTEDAT=X
End DoDot:1
+12 SET XTIEN=0
+13 FOR
SET XTIEN=$ORDER(^XPD(9.7,XTIEN))
if +XTIEN=0
QUIT
Begin DoDot:1
+14 SET XTCHK=$PIECE(^XPD(9.7,XTIEN,0),"^",3)
+15 IF XTCHK>XTSDAT
IF XTCHK<XTEDAT
Begin DoDot:2
+16 SET XTPAT=$PIECE(^XPD(9.7,XTIEN,0),"^")
+17 SET XTARRAY(XTCHK,XTPAT)=""
End DoDot:2
End DoDot:1
+18 QUIT
+19 ;
+20 ;
FUT(ZTCHECK) ;Future tasks.
+1 NEW ZT1,ZT2,ZTS,XU0,XU1,XU2,XUOPT,XUDAY,XURT,XUTIME
+2 ; FROM XUTMQ2
+3 KILL ^TMP($JOB)
+4 SET ZT1=""
FOR
SET ZT1=$ORDER(^%ZTSCH("JOB",ZT1))
if ZT1=""
QUIT
Begin DoDot:1
+5 SET ZT2=""
FOR
SET ZT2=$ORDER(^%ZTSCH("JOB",ZT1,ZT2))
if 'ZT2
QUIT
Begin DoDot:2
+6 ;S ^TMP($J,99999-ZT1,99999-$P(ZT1,",",2),ZT2)=""
DO SORT(ZT1,ZT2)
End DoDot:2
End DoDot:1
+7 SET ZT1=$$H3^%ZTM($HOROLOG)
FOR
SET ZT1=$ORDER(^%ZTSCH(ZT1))
if 'ZT1
QUIT
Begin DoDot:1
+8 SET ZTS=0
FOR
SET ZTS=$ORDER(^%ZTSCH(ZT1,ZTS))
if 'ZTS
QUIT
Begin DoDot:2
+9 ;S ^TMP($J,99999-ZT1,99999-$P(ZT1,",",2),ZTS)=""
DO SORT(ZT1,ZTS)
End DoDot:2
End DoDot:1
+10 SET ZT1=""
FOR
SET ZT1=$ORDER(^%ZTSCH("IO",ZT1))
if ZT1=""
QUIT
Begin DoDot:1
+11 SET ZT2=""
FOR
SET ZT2=$ORDER(^%ZTSCH("IO",ZT1,ZT2))
if 'ZT2
QUIT
Begin DoDot:2
+12 SET ZT3=0
FOR
SET ZT3=$ORDER(^%ZTSCH("IO",ZT1,ZT2,ZT3))
if ZT3=""
QUIT
Begin DoDot:3
+13 ;S ^TMP($J,99999-ZT2,99999-$P(ZT2,",",2),ZT3)=""
DO SORT(ZT2,ZT3)
End DoDot:3
End DoDot:2
End DoDot:1
+14 SET ZT1=""
FOR
SET ZT1=$ORDER(^%ZTSCH("LINK",ZT1))
if 'ZT1
QUIT
Begin DoDot:1
+15 SET ZT2=""
FOR
SET ZT2=$ORDER(^%ZTSCH("LINK",ZT1,ZT2))
if 'ZT2
QUIT
Begin DoDot:2
+16 SET ZTS=0
FOR
SET ZTS=$ORDER(^%ZTSCH("LINK",ZT1,ZT2,ZTS))
if 'ZTS
QUIT
Begin DoDot:3
+17 ;S ^TMP($J,99999-ZT2,99999-$P(ZT2,",",2),ZTS)=""
DO SORT(ZT2,ZTS)
End DoDot:3
End DoDot:2
End DoDot:1
+18 ; BASED ON XUTMQ
+19 SET XU1=""
+20 FOR
SET XU1=$ORDER(^TMP($JOB,XU1))
if XU1'>0
QUIT
Begin DoDot:1
+21 SET XU2=0
+22 FOR
SET XU2=$ORDER(^TMP($JOB,XU1,XU2))
if XU2'>0
QUIT
Begin DoDot:2
+23 SET XU0=$GET(^%ZTSK(XU2,0))
+24 if XU0=""
QUIT
+25 SET XUOPT=$PIECE(XU0,"^",9)
if XUOPT=""
QUIT
+26 IF $DATA(ZTCHECK(XUOPT))
Begin DoDot:3
+27 SET XURT=$PIECE(XU0,"^",6)
+28 SET XUDAY=$ZD($PIECE(XURT,","),3)
SET XUTIME=$ZT($PIECE(XURT,",",2))
+29 SET ZTCHECK(XUOPT)=XUDAY_" "_XUTIME
End DoDot:3
End DoDot:2
End DoDot:1
+30 KILL ^TMP($JOB)
+31 QUIT
+32 ;
SORT(ZTDTH,ZTSK) ;
+1 IF ZTDTH[","
SET ZTDTH=$$H3^%ZTM(ZTDTH)
+2 SET ^TMP($JOB,ZTDTH,ZTSK)=""
+3 QUIT