- DDFIX ;SFCIOFO/S0/MKO VARIOUS DD AND DIC FIXES ;9:17 AM 15 Mar 1999
- ;;22.0;VA FileMan;;Mar 30, 1999
- ;Per VHA Directive 10-93-142, this routine should not be modified.
- ;
- FIXPT ; ==> Fix Bad "PT" Nodes <==
- ;
- N EP,ESC
- I '$D(XPDNM) S EP="PT" D DEVICE
- I $D(ESC) G EXIT
- DEQPT N DICFILE,DDFILE,DDFIELD,PGLEN,PG,RPTDT,X
- U IO
- D RPTDT
- S PGLEN=IOSL-5,PG=0
- I '$D(XPDNM) D PTHDR
- ; Loop thru DIC(<file #>,
- S DICFILE=1.99999
- F S DICFILE=$O(^DIC(DICFILE)) Q:DICFILE'>1.99999!$D(ESC) D
- . ; Loop thru DD(DICFILE,0,"PT",<file #>
- . S DDFILE=1.99999
- . F S DDFILE=$O(^DD(DICFILE,0,"PT",DDFILE)) Q:DDFILE'>1.99999!$D(ESC) D
- .. I $D(^DD(DDFILE,0))#2 D Q ; File Exists
- ... ; Check Fields Exists
- ... S DDFIELD=0
- ... F S DDFIELD=$O(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) Q:'DDFIELD!$D(ESC) D
- .... I $D(^DD(DDFILE,DDFIELD,0))#2 D Q ; Field is still in DD
- ..... I ($P(^(0),U,2)'["P")&($P(^(0),U,2)'["V") D Q ; Field Still A Pointer?
- ...... S X="*File: "_DDFILE_" Field: "_DDFIELD_" is Not a Pointer Type." D RPTOUT
- ...... S X=" Deleting ""PT"" node: "_$NA(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) D RPTOUT,K1 Q
- ..... I $P(^(0),U,2)["P",+$P($P(^(0),U,2),"P",2)'=DICFILE D Q ; Field Still Point To Same File?
- ...... S X="*File: "_DDFILE_" Field: "_DDFIELD_" Does Not Point To File: "_DICFILE_"." D RPTOUT
- ...... S X=" Deleting ""PT"" Node: "_$NA(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) D RPTOUT,K1 Q
- .... ; **Field No Longer Exists
- .... S X="*Field: "_DDFIELD_" in File: "_DDFILE_" does Not Exist." D RPTOUT
- .... S X=" Deleting ""PT"" node: "_$NA(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) D RPTOUT,K1 Q
- .. ; **File No Longer Exists
- .. S X="*File: "_DDFILE_" Does Not Exist." D RPTOUT
- .. S X=" Deleting ""PT"" node: "_$NA(^DD(DICFILE,0,"PT",DDFILE)) D RPTOUT
- .. K ^DD(DICFILE,0,"PT",DDFILE)
- G EXIT ; GoTo Common Exit
- K1 ; Kill at Field Level
- K ^DD(DICFILE,0,"PT",DDFILE,DDFIELD)
- Q
- PTHDR ; Fix "PT" nodes Report Header
- I $E(IOST,1,2)="C-" D Q:$D(ESC)
- . I PG D PAUSE Q:$D(ESC)
- . W @IOF
- I PG W @IOF
- S PG=PG+1
- W "Fix ""PT"" Nodes Report "_RPTDT,?(IOM-10),"Page: "_PG,!
- N X
- S X="",$P(X,"-",(IOM-1))="" W X,!
- Q
- ;
- FIXNM ; ==> Fix Duplicate 'NM' Nodes <==
- ; From patch DI*21*50, routine DIPR50
- ;
- N EP,ESC
- I '$D(XPDNM) S EP="NM" D DEVICE
- I $D(ESC) G EXIT
- DEQNM N DDFILE,DDNAME,DDNEW,PGLEN,PG,RPTDT,X
- U IO
- D RPTDT
- S PGLEN=IOSL-5,PG=0
- I '$D(XPDNM) D NMHDR
- S DDFILE=1.99999
- F S DDFILE=$O(^DD(DDFILE)) Q:'DDFILE!$D(ESC) D
- . ; Check and repair duplicate "NM" nodes
- . S DDNAME=$O(^DD(DDFILE,0,"NM","")) Q:DDNAME=""
- . I $O(^DD(DDFILE,0,"NM",DDNAME))="" Q
- . S X="*File/Subfile: "_DDFILE_" has duplicate 'NM' nodes."
- . D RPTOUT
- . S DDNEW=$S($D(^DIC(DDFILE,0))#2:$P(^(0),U),1:$P(^DD(DDFILE,0)," SUB-FIELD"))
- . Q:DDNEW=""
- . K ^DD(DDFILE,0,"NM")
- . S ^DD(DDFILE,0,"NM",DDNEW)=""
- . S X=" ""NM"" node will be set to: "_DDNEW
- . D RPTOUT
- G EXIT ; GoTo Common Exit Point
- NMHDR ; Fix "NM" nodes Report Header
- I $E(IOST,1,2)="C-" D Q:$D(ESC)
- . I PG D PAUSE Q:$D(ESC)
- . W @IOF
- I PG W @IOF
- S PG=PG+1
- W "Fix Duplicate ""NM"" Nodes Report "_RPTDT,?(IOM-10),"Page: "_PG,!
- N X
- S X="",$P(X,"-",(IOM-1))="" W X,!
- Q
- ;
- FIXAG ; ==> Application Group Multiple Bad Xrefs <==
- ; From patch DI*21*58, routine DIPR58
- ;
- N EP,ESC
- I '$D(XPDNM) S EP="AG" D DEVICE
- I $D(ESC) G EXIT
- DEQAG N DDAGPKG,DDFILE,IEN,PGLEN,PG,RPTDT,X
- U IO
- D RPTDT
- S PGLEN=IOSL-5,PG=0
- I '$D(XPDNM) D AGHDR
- S DDFILE=1.99999
- F S DDFILE=$O(^DIC(DDFILE)) Q:DDFILE<1.99999 D
- . I '$D(^DIC(DDFILE,"%")) Q ; No App. Group Multiple
- . S DDAGPKG=""
- . F S DDAGPKG=$O(^DIC(DDFILE,"%","B",DDAGPKG)) Q:DDAGPKG="" D
- .. S IEN=0
- .. F S IEN=$O(^DIC(DDFILE,"%","B",DDAGPKG,IEN)) Q:'IEN D
- ... I $P($G(^DIC(DDFILE,"%",IEN,0)),U)=DDAGPKG Q
- ... S X="Deleting App. Group "_DDAGPKG_" ""B"" xref: "_$NA(^DIC(DDFILE,"%","B",DDAGPKG,IEN))
- ... D RPTOUT
- ... K ^DIC(DDFILE,"%","B",DDAGPKG,IEN)
- AC ; Loop Thru "AC" xref and Remove Any Entries That Point to
- ; Files That Do Not Exist
- S DDAGPKG=""
- F S DDAGPKG=$O(^DIC("AC",DDAGPKG)) Q:DDAGPKG="" D
- . S DDFILE=1.99999
- . F S DDFILE=$O(^DIC("AC",DDAGPKG,DDFILE)) Q:DDFILE<1.99999 D
- .. I $D(^DIC(DDFILE,0))[0 D Q
- ... S X="Deleting ""AC"" xref: "_$NA(^DIC("AC",DDAGPKG,DDFILE))
- ... D RPTOUT
- ... K ^DIC("AC",DDAGPKG,DDFILE)
- .. S IEN=0
- .. F S IEN=$O(^DIC("AC",DDAGPKG,DDFILE,IEN)) Q:'IEN D
- ... I $P($G(^DIC(DDFILE,"%",IEN,0)),U)'=DDAGPKG D
- .... S X="Deleting ""AC"" xref: "_$NA(^DIC("AC",DDAGPKG,DDFILE,IEN))
- .... D RPTOUT
- .... K ^DIC("AC",DDAGPKG,DDFILE,IEN)
- G EXIT ; GoTo Common Exit Point
- AGHDR ; Fix Application Group Xrefs Report Header
- I $E(IOST,1,2)="C-" D Q:$D(ESC)
- . I PG D PAUSE Q:$D(ESC)
- . W @IOF
- I PG W @IOF
- S PG=PG+1
- W "Fix Application Group Xrefs Report "_RPTDT,?(IOM-10),"Page: "_PG,!
- N X
- S X="",$P(X,"-",(IOM-1))="" W X,!
- Q
- ;
- ; Common For All Entry Points
- ;
- DEVICE ; Output Device Selection
- S %ZIS="MQ"
- D ^%ZIS
- I POP S ESC=1 Q ;User Escaped Device Selection
- I $D(IO("Q")) D
- . S ZTDESC=$S(EP="PT":"FIX PT NODES",EP="NM":"FIX DUPLICATE 'NM' NODES",EP="AG":"FIX APPLICATION GROUP XREFS",1:"")
- . S ZTRTN=$S(EP="PT":"DEQPT",EP="NM":"DEQNM",EP="AG":"DEQAG",1:"")_"^DDFIX"
- . S ZTSAVE("EP")=""
- . D ^%ZTLOAD
- . I $D(ZTSK)#2 W !,"Report queued!",!,"Task number: "_$G(ZTSK),!
- . S ESC=1
- . K ZTSK,ZTDESC,ZTRTN,ZTSAVE
- . D HOME^%ZIS
- Q
- RPTDT ; Get Report Date/Time
- N %,%H,X,Y
- S %H=$H
- D YX^%DTC
- S RPTDT=$P(Y,"@")_"@"_$E($P(Y,"@",2),1,5)
- Q
- RPTOUT ; Print Messages
- I $D(XPDNM) D MES^XPDUTL(X) Q ; KIDS install being used
- W X,! ; KIDS install not being used
- I $Y'>PGLEN Q
- I EP="PT" D PTHDR Q
- I EP="NM" D NMHDR Q
- I EP="AG" D AGHDR Q
- Q
- PAUSE ; End of Page Pause
- N DIR,Y
- S DIR(0)="E"
- D ^DIR
- I $D(DTOUT)!$D(DUOUT)!$D(DIRUT)!$D(DIROUT) K DTOUT,DUOUT,DIRUT,DIROUT S ESC=1 Q
- Q
- EXIT ; Common Exit Point
- I $E(IOST,1,2)="P-" D ^%ZISC
- I $D(ZTQUEUED) S ZTREQ="@"
- K EP
- Q
- DDFIX ;SFCIOFO/S0/MKO VARIOUS DD AND DIC FIXES ;9:17 AM 15 Mar 1999
- +1 ;;22.0;VA FileMan;;Mar 30, 1999
- +2 ;Per VHA Directive 10-93-142, this routine should not be modified.
- +3 ;
- FIXPT ; ==> Fix Bad "PT" Nodes <==
- +1 ;
- +2 NEW EP,ESC
- +3 IF '$DATA(XPDNM)
- SET EP="PT"
- DO DEVICE
- +4 IF $DATA(ESC)
- GOTO EXIT
- DEQPT NEW DICFILE,DDFILE,DDFIELD,PGLEN,PG,RPTDT,X
- +1 USE IO
- +2 DO RPTDT
- +3 SET PGLEN=IOSL-5
- SET PG=0
- +4 IF '$DATA(XPDNM)
- DO PTHDR
- +5 ; Loop thru DIC(<file #>,
- +6 SET DICFILE=1.99999
- +7 FOR
- SET DICFILE=$ORDER(^DIC(DICFILE))
- IF DICFILE'>1.99999!$DATA(ESC)
- QUIT
- Begin DoDot:1
- +8 ; Loop thru DD(DICFILE,0,"PT",<file #>
- +9 SET DDFILE=1.99999
- +10 FOR
- SET DDFILE=$ORDER(^DD(DICFILE,0,"PT",DDFILE))
- IF DDFILE'>1.99999!$DATA(ESC)
- QUIT
- Begin DoDot:2
- +11 ; File Exists
- IF $DATA(^DD(DDFILE,0))#2
- Begin DoDot:3
- +12 ; Check Fields Exists
- +13 SET DDFIELD=0
- +14 FOR
- SET DDFIELD=$ORDER(^DD(DICFILE,0,"PT",DDFILE,DDFIELD))
- IF 'DDFIELD!$DATA(ESC)
- QUIT
- Begin DoDot:4
- +15 ; Field is still in DD
- IF $DATA(^DD(DDFILE,DDFIELD,0))#2
- Begin DoDot:5
- +16 ; Field Still A Pointer?
- IF ($PIECE(^(0),U,2)'["P")&($PIECE(^(0),U,2)'["V")
- Begin DoDot:6
- +17 SET X="*File: "_DDFILE_" Field: "_DDFIELD_" is Not a Pointer Type."
- DO RPTOUT
- +18 SET X=" Deleting ""PT"" node: "_$NAME(^DD(DICFILE,0,"PT",DDFILE,DDFIELD))
- DO RPTOUT
- DO K1
- QUIT
- End DoDot:6
- QUIT
- +19 ; Field Still Point To Same File?
- IF $PIECE(^(0),U,2)["P"
- IF +$PIECE($PIECE(^(0),U,2),"P",2)'=DICFILE
- Begin DoDot:6
- +20 SET X="*File: "_DDFILE_" Field: "_DDFIELD_" Does Not Point To File: "_DICFILE_"."
- DO RPTOUT
- +21 SET X=" Deleting ""PT"" Node: "_$NAME(^DD(DICFILE,0,"PT",DDFILE,DDFIELD))
- DO RPTOUT
- DO K1
- QUIT
- End DoDot:6
- QUIT
- End DoDot:5
- QUIT
- +22 ; **Field No Longer Exists
- +23 SET X="*Field: "_DDFIELD_" in File: "_DDFILE_" does Not Exist."
- DO RPTOUT
- +24 SET X=" Deleting ""PT"" node: "_$NAME(^DD(DICFILE,0,"PT",DDFILE,DDFIELD))
- DO RPTOUT
- DO K1
- QUIT
- End DoDot:4
- End DoDot:3
- QUIT
- +25 ; **File No Longer Exists
- +26 SET X="*File: "_DDFILE_" Does Not Exist."
- DO RPTOUT
- +27 SET X=" Deleting ""PT"" node: "_$NAME(^DD(DICFILE,0,"PT",DDFILE))
- DO RPTOUT
- +28 KILL ^DD(DICFILE,0,"PT",DDFILE)
- End DoDot:2
- End DoDot:1
- +29 ; GoTo Common Exit
- GOTO EXIT
- K1 ; Kill at Field Level
- +1 KILL ^DD(DICFILE,0,"PT",DDFILE,DDFIELD)
- +2 QUIT
- PTHDR ; Fix "PT" nodes Report Header
- +1 IF $EXTRACT(IOST,1,2)="C-"
- Begin DoDot:1
- +2 IF PG
- DO PAUSE
- IF $DATA(ESC)
- QUIT
- +3 WRITE @IOF
- End DoDot:1
- IF $DATA(ESC)
- QUIT
- +4 IF PG
- WRITE @IOF
- +5 SET PG=PG+1
- +6 WRITE "Fix ""PT"" Nodes Report "_RPTDT,?(IOM-10),"Page: "_PG,!
- +7 NEW X
- +8 SET X=""
- SET $PIECE(X,"-",(IOM-1))=""
- WRITE X,!
- +9 QUIT
- +10 ;
- FIXNM ; ==> Fix Duplicate 'NM' Nodes <==
- +1 ; From patch DI*21*50, routine DIPR50
- +2 ;
- +3 NEW EP,ESC
- +4 IF '$DATA(XPDNM)
- SET EP="NM"
- DO DEVICE
- +5 IF $DATA(ESC)
- GOTO EXIT
- DEQNM NEW DDFILE,DDNAME,DDNEW,PGLEN,PG,RPTDT,X
- +1 USE IO
- +2 DO RPTDT
- +3 SET PGLEN=IOSL-5
- SET PG=0
- +4 IF '$DATA(XPDNM)
- DO NMHDR
- +5 SET DDFILE=1.99999
- +6 FOR
- SET DDFILE=$ORDER(^DD(DDFILE))
- IF 'DDFILE!$DATA(ESC)
- QUIT
- Begin DoDot:1
- +7 ; Check and repair duplicate "NM" nodes
- +8 SET DDNAME=$ORDER(^DD(DDFILE,0,"NM",""))
- IF DDNAME=""
- QUIT
- +9 IF $ORDER(^DD(DDFILE,0,"NM",DDNAME))=""
- QUIT
- +10 SET X="*File/Subfile: "_DDFILE_" has duplicate 'NM' nodes."
- +11 DO RPTOUT
- +12 SET DDNEW=$SELECT($DATA(^DIC(DDFILE,0))#2:$PIECE(^(0),U),1:$PIECE(^DD(DDFILE,0)," SUB-FIELD"))
- +13 IF DDNEW=""
- QUIT
- +14 KILL ^DD(DDFILE,0,"NM")
- +15 SET ^DD(DDFILE,0,"NM",DDNEW)=""
- +16 SET X=" ""NM"" node will be set to: "_DDNEW
- +17 DO RPTOUT
- End DoDot:1
- +18 ; GoTo Common Exit Point
- GOTO EXIT
- NMHDR ; Fix "NM" nodes Report Header
- +1 IF $EXTRACT(IOST,1,2)="C-"
- Begin DoDot:1
- +2 IF PG
- DO PAUSE
- IF $DATA(ESC)
- QUIT
- +3 WRITE @IOF
- End DoDot:1
- IF $DATA(ESC)
- QUIT
- +4 IF PG
- WRITE @IOF
- +5 SET PG=PG+1
- +6 WRITE "Fix Duplicate ""NM"" Nodes Report "_RPTDT,?(IOM-10),"Page: "_PG,!
- +7 NEW X
- +8 SET X=""
- SET $PIECE(X,"-",(IOM-1))=""
- WRITE X,!
- +9 QUIT
- +10 ;
- FIXAG ; ==> Application Group Multiple Bad Xrefs <==
- +1 ; From patch DI*21*58, routine DIPR58
- +2 ;
- +3 NEW EP,ESC
- +4 IF '$DATA(XPDNM)
- SET EP="AG"
- DO DEVICE
- +5 IF $DATA(ESC)
- GOTO EXIT
- DEQAG NEW DDAGPKG,DDFILE,IEN,PGLEN,PG,RPTDT,X
- +1 USE IO
- +2 DO RPTDT
- +3 SET PGLEN=IOSL-5
- SET PG=0
- +4 IF '$DATA(XPDNM)
- DO AGHDR
- +5 SET DDFILE=1.99999
- +6 FOR
- SET DDFILE=$ORDER(^DIC(DDFILE))
- IF DDFILE<1.99999
- QUIT
- Begin DoDot:1
- +7 ; No App. Group Multiple
- IF '$DATA(^DIC(DDFILE,"%"))
- QUIT
- +8 SET DDAGPKG=""
- +9 FOR
- SET DDAGPKG=$ORDER(^DIC(DDFILE,"%","B",DDAGPKG))
- IF DDAGPKG=""
- QUIT
- Begin DoDot:2
- +10 SET IEN=0
- +11 FOR
- SET IEN=$ORDER(^DIC(DDFILE,"%","B",DDAGPKG,IEN))
- IF 'IEN
- QUIT
- Begin DoDot:3
- +12 IF $PIECE($GET(^DIC(DDFILE,"%",IEN,0)),U)=DDAGPKG
- QUIT
- +13 SET X="Deleting App. Group "_DDAGPKG_" ""B"" xref: "_$NAME(^DIC(DDFILE,"%","B",DDAGPKG,IEN))
- +14 DO RPTOUT
- +15 KILL ^DIC(DDFILE,"%","B",DDAGPKG,IEN)
- End DoDot:3
- End DoDot:2
- End DoDot:1
- AC ; Loop Thru "AC" xref and Remove Any Entries That Point to
- +1 ; Files That Do Not Exist
- +2 SET DDAGPKG=""
- +3 FOR
- SET DDAGPKG=$ORDER(^DIC("AC",DDAGPKG))
- IF DDAGPKG=""
- QUIT
- Begin DoDot:1
- +4 SET DDFILE=1.99999
- +5 FOR
- SET DDFILE=$ORDER(^DIC("AC",DDAGPKG,DDFILE))
- IF DDFILE<1.99999
- QUIT
- Begin DoDot:2
- +6 IF $DATA(^DIC(DDFILE,0))[0
- Begin DoDot:3
- +7 SET X="Deleting ""AC"" xref: "_$NAME(^DIC("AC",DDAGPKG,DDFILE))
- +8 DO RPTOUT
- +9 KILL ^DIC("AC",DDAGPKG,DDFILE)
- End DoDot:3
- QUIT
- +10 SET IEN=0
- +11 FOR
- SET IEN=$ORDER(^DIC("AC",DDAGPKG,DDFILE,IEN))
- IF 'IEN
- QUIT
- Begin DoDot:3
- +12 IF $PIECE($GET(^DIC(DDFILE,"%",IEN,0)),U)'=DDAGPKG
- Begin DoDot:4
- +13 SET X="Deleting ""AC"" xref: "_$NAME(^DIC("AC",DDAGPKG,DDFILE,IEN))
- +14 DO RPTOUT
- +15 KILL ^DIC("AC",DDAGPKG,DDFILE,IEN)
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +16 ; GoTo Common Exit Point
- GOTO EXIT
- AGHDR ; Fix Application Group Xrefs Report Header
- +1 IF $EXTRACT(IOST,1,2)="C-"
- Begin DoDot:1
- +2 IF PG
- DO PAUSE
- IF $DATA(ESC)
- QUIT
- +3 WRITE @IOF
- End DoDot:1
- IF $DATA(ESC)
- QUIT
- +4 IF PG
- WRITE @IOF
- +5 SET PG=PG+1
- +6 WRITE "Fix Application Group Xrefs Report "_RPTDT,?(IOM-10),"Page: "_PG,!
- +7 NEW X
- +8 SET X=""
- SET $PIECE(X,"-",(IOM-1))=""
- WRITE X,!
- +9 QUIT
- +10 ;
- +11 ; Common For All Entry Points
- +12 ;
- DEVICE ; Output Device Selection
- +1 SET %ZIS="MQ"
- +2 DO ^%ZIS
- +3 ;User Escaped Device Selection
- IF POP
- SET ESC=1
- QUIT
- +4 IF $DATA(IO("Q"))
- Begin DoDot:1
- +5 SET ZTDESC=$SELECT(EP="PT":"FIX PT NODES",EP="NM":"FIX DUPLICATE 'NM' NODES",EP="AG":"FIX APPLICATION GROUP XREFS",1:"")
- +6 SET ZTRTN=$SELECT(EP="PT":"DEQPT",EP="NM":"DEQNM",EP="AG":"DEQAG",1:"")_"^DDFIX"
- +7 SET ZTSAVE("EP")=""
- +8 DO ^%ZTLOAD
- +9 IF $DATA(ZTSK)#2
- WRITE !,"Report queued!",!,"Task number: "_$GET(ZTSK),!
- +10 SET ESC=1
- +11 KILL ZTSK,ZTDESC,ZTRTN,ZTSAVE
- +12 DO HOME^%ZIS
- End DoDot:1
- +13 QUIT
- RPTDT ; Get Report Date/Time
- +1 NEW %,%H,X,Y
- +2 SET %H=$HOROLOG
- +3 DO YX^%DTC
- +4 SET RPTDT=$PIECE(Y,"@")_"@"_$EXTRACT($PIECE(Y,"@",2),1,5)
- +5 QUIT
- RPTOUT ; Print Messages
- +1 ; KIDS install being used
- IF $DATA(XPDNM)
- DO MES^XPDUTL(X)
- QUIT
- +2 ; KIDS install not being used
- WRITE X,!
- +3 IF $Y'>PGLEN
- QUIT
- +4 IF EP="PT"
- DO PTHDR
- QUIT
- +5 IF EP="NM"
- DO NMHDR
- QUIT
- +6 IF EP="AG"
- DO AGHDR
- QUIT
- +7 QUIT
- PAUSE ; End of Page Pause
- +1 NEW DIR,Y
- +2 SET DIR(0)="E"
- +3 DO ^DIR
- +4 IF $DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIRUT)!$DATA(DIROUT)
- KILL DTOUT,DUOUT,DIRUT,DIROUT
- SET ESC=1
- QUIT
- +5 QUIT
- EXIT ; Common Exit Point
- +1 IF $EXTRACT(IOST,1,2)="P-"
- DO ^%ZISC
- +2 IF $DATA(ZTQUEUED)
- SET ZTREQ="@"
- +3 KILL EP
- +4 QUIT