%ZTLOAD1 ;SEA/RDS-TaskMan: P I: Queue ;09/23/08  10:06
 ;;8.0;KERNEL;**112,118,127,162,275,363,409,415,425,446**;Jul 10, 1995;Build 35
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
GET ;get task data
 N %X,%Y,X,Y,X1,ZT,ZTC1,ZTC2,ZTA1,ZTA4,ZTA5,ZTINC,ZTGOT,ZTC34P
 K %ZTLOAD
 I ("^"[$G(ZTRTN))!($L($G(ZTRTN),"^")>2) D REJECT^%ZTLOAD2("Bad Routine") G EXIT
 S U="^" I ZTRTN'[U S ZTRTN=U_ZTRTN
 S ZTC1=+$G(DUZ),ZTC2=""
 I ZTC1>0 S ZTC2=$P($G(^VA(200,ZTC1,0)),U)
 ;Check Date/Time
1 I $D(ZTDTH)[0 S ZTDTH=""
 I ZTDTH?7N.".".N S ZTDTH=$$FMTH^%ZTLOAD7(ZTDTH)
 I $P($G(XQY0),U,18) D RESTRCT^%ZTLOAD2
 I ZTDTH'="@",ZTDTH'?1.5N1","1.5N D ASK^%ZTLOAD2 I ZTDTH'>0 D REJECT^%ZTLOAD2("Bad Date/Time") G EXIT
 ;
 S ZTA1="R",ZTA4="",ZTA5=""
 I ZTRTN="ZTSK^XQ1" D OPTION^%ZTLOAD2 I ZTA1="" D REJECT^%ZTLOAD2("Bad Option") G EXIT
 I ZTA1="R" D
 . S ZTSAVE("XQY")="",ZTSAVE("XQY0")="",ZTA4=$G(XQY),ZTA5=$P($G(XQY0),U)
 ;
 D GETENV^%ZOSV S ZTC34P=Y
 ;Description
2 I $D(ZTDESC)[0 S ZTDESC="No Description (%ZTLOAD)"
 ;
 I $G(ZTKIL)]"" D ZTKIL^%ZTLOAD2
 S:$G(ZTUCI)["," ZTUCI=$P(ZTUCI,",") S:$G(ZTCPU)["," ZTCPU=$P(ZTCPU,",",2)
DEVICE ;get device data
 I $D(ZTIO)#2,$G(ION)=$P(ZTIO,";"),$G(IOT)="SPL" D SPOOL^%ZTLOAD2
 ;If no ZTIO, build from symbol table
 I $D(ZTIO)[0 S ZTIO=$G(ION) I $L(ZTIO) D
 . S:$G(IOST)]"" $P(ZTIO,";",2)=IOST
 . I $G(IO("DOC"))]"" S ZTIO=ZTIO_";"_IO("DOC")
 . E  I $G(IOM)]"" S ZTIO=ZTIO_";"_IOM I $G(IOSL)]"" S ZTIO=ZTIO_";"_IOSL
 . Q
 ;
 I $E(ZTIO,1)="`" S $P(ZTIO,";")=$P(^%ZIS(1,+$E(ZTIO,2,99),0),"^") ;Convert `IEN format
 S ZTIO(1)=$S($G(ZTIO(1))'="D":"Q",1:"DIRECT")
 I $L(ZTIO) D  ;Skip if no device
 . ;IO("HFSIO") and IOPAR are how %ZIS reports the user selected file name and parameters
 . S:'$D(ZTIO("H")) ZTIO("H")=$G(IO("HFSIO"))
 . S:'$D(ZTIO("P")) ZTIO("P")=$G(IOPAR)
 . I $G(IO("P"))]"",ZTIO'[";/" S ZTIO=ZTIO_";/"_IO("P")
 . I $$NOQ^%ZISUTL($P(ZTIO,";")) D BADDEV^%ZTLOAD2("Restricted Device")
 . I $E(ZTIO,1,9)="P-MESSAGE" S ZTSAVE("^TMP(""XM-MESS"",$J,")=""
 . Q
 ;
 I $D(%ZTLOAD("ERROR")) G EXIT
 ;
 ;See that ^%ZTSK(-1) is set
 I $D(^%ZTSK(-1))[0 S ^%ZTSK(-1)=$S($P($G(^%ZTSK(0)),U,3):$P(^(0),U,3),1:1000)
RECORD ;build record
 S ZTINC=$G(^%ZOSF("$INC"),1) ;Set to 1 if this system has $INCREMENT, otherwise 0.
 S ZTGOT=0
 I 'ZTINC D  ;For System that don't have $INC (GT.M, DTM, MSM)
 . ;Find a free entry, Claim it and Lock it.
 . L +^%ZTSK(-1):0 S ZTSK=^%ZTSK(-1) ;This is just a starting point
 . F  S ZTSK=ZTSK+1 I '$D(^%ZTSK(ZTSK)) D  Q:ZTGOT
 . . L +^%ZTSK(ZTSK):$G(DILOCKTM,3) Q:'$T  ;Can we lock it
 . . I $D(^%ZTSK(ZTSK)) L -^%ZTSK(ZTSK) ;Already claimed
 . . S ^%ZTSK(ZTSK,.1)=0,^%ZTSK(-1)=ZTSK,ZTGOT=1 ;Claim it
 . . Q
 . L -^%ZTSK(-1) ;
 . Q
 I ZTINC D  ;For DSM and OpenM. Faster over network(DDP)
 . S ZTSK=$INCREMENT(^%ZTSK(-1))
 . L +^%ZTSK(ZTSK):$G(DILOCKTM,3) S ZTGOT=$T ;p446
 I 'ZTGOT!($D(^%ZTSK(ZTSK,0))) L -^%ZTSK(ZTSK) G RECORD
 TSTART  ;
 S ^%ZTSK(ZTSK,0)=ZTRTN_U_ZTC1_U_$G(ZTUCI)_U_$H_U_ZTDTH_U_ZTA1_U_ZTA4_U_ZTA5_U_ZTC2_U_$P(ZTC34P,U,1,2)_U_"ZTDESC"_U_$G(ZTCPU)_U_$G(ZTPRI)
 S ^%ZTSK(ZTSK,.1)=0,^%ZTSK(ZTSK,.03)=ZTDESC
 S ^%ZTSK(ZTSK,.2)=ZTIO_"^^^^"_ZTIO(1)_U_$G(ZTIO("H")) S:$D(ZTSYNC) $P(^%ZTSK(ZTSK,.2),U,7)=ZTSYNC
 I $G(ZTIO("P"))]"" S ^%ZTSK(ZTSK,.25)=ZTIO("P")
 ;
 D ZTSAVE
 ;
SCHED ;schedule task and quit
 S ZTSTAT=$S(ZTDTH'="@":1,1:"K")_"^"_$H,$P(ZTSTAT,U,8)=$G(ZTKIL)
 S ^%ZTSK(ZTSK,.1)=ZTSTAT
 I ZTDTH'="@" L +^%ZTSCH("SCHQ"):$G(DILOCKTM,3) S ZT=$$H3(ZTDTH),^%ZTSK(ZTSK,.04)=ZT,^%ZTSCH(ZT,ZTSK)="" L -^%ZTSCH("SCHQ")
 L -^%ZTSK(ZTSK) S ZTSK("D")=ZTDTH
 TCOMMIT  ;
EXIT ;Clean up
 I $E($G(ZTIO),1,9)="P-MESSAGE" K ^TMP("XM-MESS",$J) ;Clean up the Global
 K X1,ZT,ZT1,ZTDTH,ZTKIL,ZTSAVE,ZTSTAT,ZTIO
 Q
 ;
ZTSAVE ;save variables
 N ZTIO
 K %H,%T,ZTA1,ZTA4,ZTA5,ZTC1,ZTC2,ZTC34P,ZTCPU,ZTDESC,ZTIO,ZTNOGO,ZTPRI,ZTRTN,ZTUCI,ZTSYNC
 S ZTSAVE("DUZ(")=""
 S ZT1="" F  S ZT1=$O(ZTSAVE(ZT1)) Q:ZT1=""  D EVAL
 K ^%ZTSK(ZTSK,.3,"DUZ(","NEWCODE")
 K ^%ZTSK(ZTSK,.3,"ZTSK"),^("ZTSAVE"),^("ZTDTH")
 K ^%ZTSK(ZTSK,.3,"XQNOGO")
 Q
 ;
EVAL ;ZTSAVE--evaluate expression
 I ZT1="*" S X="^%ZTSK(ZTSK,.3," D DOLRO^%ZOSV Q
 I ZT1["*",$P(ZT1,"*")'["(" S X="^%ZTSK(ZTSK,.3,",Y=ZT1 D ORDER^%ZOSV Q
 I $S($E(ZT1)="""":1,+ZT1'=ZT1:0,1:ZT1]0),$D(ZTSAVE(ZT1))#2 S @("^%ZTSK(ZTSK,"_ZT1_")=ZTSAVE(ZT1)") Q
 I $S(ZT1'["(":1,1:$E(ZT1,$L(ZT1))=")"),$S($D(@ZT1)#2:1,1:ZTSAVE(ZT1)]"") S ^%ZTSK(ZTSK,.3,ZT1)=$S(ZTSAVE(ZT1)]"":ZTSAVE(ZT1),1:@ZT1) Q
 I $E(ZT1)="^",ZT1["(" S %X=ZT1,%Y="^%ZTSK(ZTSK,.3,ZT1," D %XY^%RCR Q
 I ZT1["(" S %X=ZT1,%Y="^%ZTSK(ZTSK,.3,ZT1," D %XY^%RCR
 ;I ZT1["(" M ^%ZTSK(ZTSK,.3,ZT1)=@$P(ZT1,"(")
 Q
 ;
H3(%) ;Convert $H to seconds.
 Q 86400*%+$P(%,",",2)
H0(%) ;Covert from seconds to $H
 Q (%\86400)_","_(%#86400)
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HZTLOAD1   4804     printed  Sep 23, 2025@19:52:22                                                                                                                                                                                                     Page 2
%ZTLOAD1  ;SEA/RDS-TaskMan: P I: Queue ;09/23/08  10:06
 +1       ;;8.0;KERNEL;**112,118,127,162,275,363,409,415,425,446**;Jul 10, 1995;Build 35
 +2       ;Per VHA Directive 2004-038, this routine should not be modified.
 +3       ;
GET       ;get task data
 +1        NEW %X,%Y,X,Y,X1,ZT,ZTC1,ZTC2,ZTA1,ZTA4,ZTA5,ZTINC,ZTGOT,ZTC34P
 +2        KILL %ZTLOAD
 +3        IF ("^"[$GET(ZTRTN))!($LENGTH($GET(ZTRTN),"^")>2)
               DO REJECT^%ZTLOAD2("Bad Routine")
               GOTO EXIT
 +4        SET U="^"
           IF ZTRTN'[U
               SET ZTRTN=U_ZTRTN
 +5        SET ZTC1=+$GET(DUZ)
           SET ZTC2=""
 +6        IF ZTC1>0
               SET ZTC2=$PIECE($GET(^VA(200,ZTC1,0)),U)
 +7       ;Check Date/Time
1          IF $DATA(ZTDTH)[0
               SET ZTDTH=""
 +1        IF ZTDTH?7N.".".N
               SET ZTDTH=$$FMTH^%ZTLOAD7(ZTDTH)
 +2        IF $PIECE($GET(XQY0),U,18)
               DO RESTRCT^%ZTLOAD2
 +3        IF ZTDTH'="@"
               IF ZTDTH'?1.5N1","1.5N
                   DO ASK^%ZTLOAD2
                   IF ZTDTH'>0
                       DO REJECT^%ZTLOAD2("Bad Date/Time")
                       GOTO EXIT
 +4       ;
 +5        SET ZTA1="R"
           SET ZTA4=""
           SET ZTA5=""
 +6        IF ZTRTN="ZTSK^XQ1"
               DO OPTION^%ZTLOAD2
               IF ZTA1=""
                   DO REJECT^%ZTLOAD2("Bad Option")
                   GOTO EXIT
 +7        IF ZTA1="R"
               Begin DoDot:1
 +8                SET ZTSAVE("XQY")=""
                   SET ZTSAVE("XQY0")=""
                   SET ZTA4=$GET(XQY)
                   SET ZTA5=$PIECE($GET(XQY0),U)
               End DoDot:1
 +9       ;
 +10       DO GETENV^%ZOSV
           SET ZTC34P=Y
 +11      ;Description
2          IF $DATA(ZTDESC)[0
               SET ZTDESC="No Description (%ZTLOAD)"
 +1       ;
 +2        IF $GET(ZTKIL)]""
               DO ZTKIL^%ZTLOAD2
 +3        if $GET(ZTUCI)[","
               SET ZTUCI=$PIECE(ZTUCI,",")
           if $GET(ZTCPU)[","
               SET ZTCPU=$PIECE(ZTCPU,",",2)
DEVICE    ;get device data
 +1        IF $DATA(ZTIO)#2
               IF $GET(ION)=$PIECE(ZTIO,";")
                   IF $GET(IOT)="SPL"
                       DO SPOOL^%ZTLOAD2
 +2       ;If no ZTIO, build from symbol table
 +3        IF $DATA(ZTIO)[0
               SET ZTIO=$GET(ION)
               IF $LENGTH(ZTIO)
                   Begin DoDot:1
 +4                    if $GET(IOST)]""
                           SET $PIECE(ZTIO,";",2)=IOST
 +5                    IF $GET(IO("DOC"))]""
                           SET ZTIO=ZTIO_";"_IO("DOC")
 +6                   IF '$TEST
                           IF $GET(IOM)]""
                               SET ZTIO=ZTIO_";"_IOM
                               IF $GET(IOSL)]""
                                   SET ZTIO=ZTIO_";"_IOSL
 +7                    QUIT 
                   End DoDot:1
 +8       ;
 +9       ;Convert `IEN format
           IF $EXTRACT(ZTIO,1)="`"
               SET $PIECE(ZTIO,";")=$PIECE(^%ZIS(1,+$EXTRACT(ZTIO,2,99),0),"^")
 +10       SET ZTIO(1)=$SELECT($GET(ZTIO(1))'="D":"Q",1:"DIRECT")
 +11      ;Skip if no device
           IF $LENGTH(ZTIO)
               Begin DoDot:1
 +12      ;IO("HFSIO") and IOPAR are how %ZIS reports the user selected file name and parameters
 +13               if '$DATA(ZTIO("H"))
                       SET ZTIO("H")=$GET(IO("HFSIO"))
 +14               if '$DATA(ZTIO("P"))
                       SET ZTIO("P")=$GET(IOPAR)
 +15               IF $GET(IO("P"))]""
                       IF ZTIO'[";/"
                           SET ZTIO=ZTIO_";/"_IO("P")
 +16               IF $$NOQ^%ZISUTL($PIECE(ZTIO,";"))
                       DO BADDEV^%ZTLOAD2("Restricted Device")
 +17               IF $EXTRACT(ZTIO,1,9)="P-MESSAGE"
                       SET ZTSAVE("^TMP(""XM-MESS"",$J,")=""
 +18               QUIT 
               End DoDot:1
 +19      ;
 +20       IF $DATA(%ZTLOAD("ERROR"))
               GOTO EXIT
 +21      ;
 +22      ;See that ^%ZTSK(-1) is set
 +23       IF $DATA(^%ZTSK(-1))[0
               SET ^%ZTSK(-1)=$SELECT($PIECE($GET(^%ZTSK(0)),U,3):$PIECE(^(0),U,3),1:1000)
RECORD    ;build record
 +1       ;Set to 1 if this system has $INCREMENT, otherwise 0.
           SET ZTINC=$GET(^%ZOSF("$INC"),1)
 +2        SET ZTGOT=0
 +3       ;For System that don't have $INC (GT.M, DTM, MSM)
           IF 'ZTINC
               Begin DoDot:1
 +4       ;Find a free entry, Claim it and Lock it.
 +5       ;This is just a starting point
                   LOCK +^%ZTSK(-1):0
                   SET ZTSK=^%ZTSK(-1)
 +6                FOR 
                       SET ZTSK=ZTSK+1
                       IF '$DATA(^%ZTSK(ZTSK))
                           Begin DoDot:2
 +7       ;Can we lock it
                               LOCK +^%ZTSK(ZTSK):$GET(DILOCKTM,3)
                               if '$TEST
                                   QUIT 
 +8       ;Already claimed
                               IF $DATA(^%ZTSK(ZTSK))
                                   LOCK -^%ZTSK(ZTSK)
 +9       ;Claim it
                               SET ^%ZTSK(ZTSK,.1)=0
                               SET ^%ZTSK(-1)=ZTSK
                               SET ZTGOT=1
 +10                           QUIT 
                           End DoDot:2
                           if ZTGOT
                               QUIT 
 +11      ;
                   LOCK -^%ZTSK(-1)
 +12               QUIT 
               End DoDot:1
 +13      ;For DSM and OpenM. Faster over network(DDP)
           IF ZTINC
               Begin DoDot:1
 +14 
*** ERROR ***
                   SET ZTSK=$INCREMENT(^%ZTSK(-1))
 +15      ;p446
                   LOCK +^%ZTSK(ZTSK):$GET(DILOCKTM,3)
                   SET ZTGOT=$TEST
               End DoDot:1
 +16       IF 'ZTGOT!($DATA(^%ZTSK(ZTSK,0)))
               LOCK -^%ZTSK(ZTSK)
               GOTO RECORD
 +17      ;
           TSTART 
 +18       SET ^%ZTSK(ZTSK,0)=ZTRTN_U_ZTC1_U_$GET(ZTUCI)_U_$HOROLOG_U_ZTDTH_U_ZTA1_U_ZTA4_U_ZTA5_U_ZTC2_U_$PIECE(ZTC34P,U,1,2)_U_"ZTDESC"_U_$GET(ZTCPU)_U_$GET(ZTPRI)
 +19       SET ^%ZTSK(ZTSK,.1)=0
           SET ^%ZTSK(ZTSK,.03)=ZTDESC
 +20       SET ^%ZTSK(ZTSK,.2)=ZTIO_"^^^^"_ZTIO(1)_U_$GET(ZTIO("H"))
           if $DATA(ZTSYNC)
               SET $PIECE(^%ZTSK(ZTSK,.2),U,7)=ZTSYNC
 +21       IF $GET(ZTIO("P"))]""
               SET ^%ZTSK(ZTSK,.25)=ZTIO("P")
 +22      ;
 +23       DO ZTSAVE
 +24      ;
SCHED     ;schedule task and quit
 +1        SET ZTSTAT=$SELECT(ZTDTH'="@":1,1:"K")_"^"_$HOROLOG
           SET $PIECE(ZTSTAT,U,8)=$GET(ZTKIL)
 +2        SET ^%ZTSK(ZTSK,.1)=ZTSTAT
 +3        IF ZTDTH'="@"
               LOCK +^%ZTSCH("SCHQ"):$GET(DILOCKTM,3)
               SET ZT=$$H3(ZTDTH)
               SET ^%ZTSK(ZTSK,.04)=ZT
               SET ^%ZTSCH(ZT,ZTSK)=""
               LOCK -^%ZTSCH("SCHQ")
 +4        LOCK -^%ZTSK(ZTSK)
           SET ZTSK("D")=ZTDTH
 +5       ;
           TCOMMIT 
EXIT      ;Clean up
 +1       ;Clean up the Global
           IF $EXTRACT($GET(ZTIO),1,9)="P-MESSAGE"
               KILL ^TMP("XM-MESS",$JOB)
 +2        KILL X1,ZT,ZT1,ZTDTH,ZTKIL,ZTSAVE,ZTSTAT,ZTIO
 +3        QUIT 
 +4       ;
ZTSAVE    ;save variables
 +1        NEW ZTIO
 +2        KILL %H,%T,ZTA1,ZTA4,ZTA5,ZTC1,ZTC2,ZTC34P,ZTCPU,ZTDESC,ZTIO,ZTNOGO,ZTPRI,ZTRTN,ZTUCI,ZTSYNC
 +3        SET ZTSAVE("DUZ(")=""
 +4        SET ZT1=""
           FOR 
               SET ZT1=$ORDER(ZTSAVE(ZT1))
               if ZT1=""
                   QUIT 
               DO EVAL
 +5        KILL ^%ZTSK(ZTSK,.3,"DUZ(","NEWCODE")
 +6        KILL ^%ZTSK(ZTSK,.3,"ZTSK"),^("ZTSAVE"),^("ZTDTH")
 +7        KILL ^%ZTSK(ZTSK,.3,"XQNOGO")
 +8        QUIT 
 +9       ;
EVAL      ;ZTSAVE--evaluate expression
 +1        IF ZT1="*"
               SET X="^%ZTSK(ZTSK,.3,"
               DO DOLRO^%ZOSV
               QUIT 
 +2        IF ZT1["*"
               IF $PIECE(ZT1,"*")'["("
                   SET X="^%ZTSK(ZTSK,.3,"
                   SET Y=ZT1
                   DO ORDER^%ZOSV
                   QUIT 
 +3        IF $SELECT($EXTRACT(ZT1)="""":1,+ZT1'=ZT1:0,1:ZT1]0)
               IF $DATA(ZTSAVE(ZT1))#2
                   SET @("^%ZTSK(ZTSK,"_ZT1_")=ZTSAVE(ZT1)")
                   QUIT 
 +4        IF $SELECT(ZT1'["(":1,1:$EXTRACT(ZT1,$LENGTH(ZT1))=")")
               IF $SELECT($DATA(@ZT1)#2:1,1:ZTSAVE(ZT1)]"")
                   SET ^%ZTSK(ZTSK,.3,ZT1)=$SELECT(ZTSAVE(ZT1)]"":ZTSAVE(ZT1),1:@ZT1)
                   QUIT 
 +5        IF $EXTRACT(ZT1)="^"
               IF ZT1["("
                   SET %X=ZT1
                   SET %Y="^%ZTSK(ZTSK,.3,ZT1,"
                   DO %XY^%RCR
                   QUIT 
 +6        IF ZT1["("
               SET %X=ZT1
               SET %Y="^%ZTSK(ZTSK,.3,ZT1,"
               DO %XY^%RCR
 +7       ;I ZT1["(" M ^%ZTSK(ZTSK,.3,ZT1)=@$P(ZT1,"(")
 +8        QUIT 
 +9       ;
H3(%)     ;Convert $H to seconds.
 +1        QUIT 86400*%+$PIECE(%,",",2)
H0(%)     ;Covert from seconds to $H
 +1        QUIT (%\86400)_","_(%#86400)