DG488 ;ALB/GN - CLEANUP PATIENT RELATION & INCOME FILES;12/11/02 ; 2/4/03 1:25pm
;;5.3;REGISTRATION;**488,1015**;5-1-2001;Build 21
;
Q
;
TEST ; Entry point for testing this routine, then fall thru.
S TESTING=1
EN ; Entry point to start job
;
N QUIT,ZTDESC,ZTIO,ZTRTN,ZTSK,ZTQUEUED,ZTSAVE
;
S TESTING=+$G(TESTING)
; setup TM variables and Load
S ZTSAVE("TESTING")=""
S ZTRTN=("TASK^DG488")
S ZTDESC="Cleanup Patient Relation & Income Files"
S ZTIO=""
W !!,ZTDESC,!
;
;check if already running or completed.
S QUIT=$$CHKSTAT
I QUIT L -^XTMP($$NAMSPC) K TESTING Q
D ^%ZTLOAD
L -^XTMP($$NAMSPC)
K TESTING
I $D(ZTSK) D
. W !,"This request queued as Task # ",ZTSK,!
Q
;
TASK ; Entry point for taskman
L +^XTMP($$NAMSPC):10 I '$T D Q ;quit if can't get a lock
. S $P(^XTMP($$NAMSPC,0,0),U,12)="NO LOCK GAINED"
N ZTSTOP,LSTREC,DIK,DA,NAMSPC,DGT12,DG12,DG12X,DGT22,DG22,DG22X
N BEGTIME,PURGDT,DGFIL,IEN,DGIEN,BTIME,STAT,STIME,DGT21,DG21,DG21X
S NAMSPC=$$NAMSPC
S ZTDESC=$G(ZTDESC,"Cleanup of Patient Related Income files")
;
S TESTING=$G(TESTING,1) ;assume testing if not defined
;setup XTMP according to stds.
S BEGTIME=$$NOW^XLFDT()
S PURGDT=$$FMADD^XLFDT(BEGTIME,30)
S ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME_U_ZTDESC
S ^XTMP(NAMSPC,0,"TASKID")=$G(ZTSK,"DIRECT")
S ^XTMP(NAMSPC,0,"TESTING")=TESTING
;get last run data
D GETLAST
;init begin time, if not there, and status & stop time fields
S $P(^XTMP(NAMSPC,0,0),U,12,13)="RUNNING^"
S:$P(^XTMP(NAMSPC,0,0),U,11)="" $P(^XTMP(NAMSPC,0,0),U,11)=$$NOW^XLFDT
;start/restart cleanups
S:DGFIL="" DGFIL=408.12
I DGFIL=408.12 D
. S IEN=DGIEN,DGIEN=0
. D DG40812(IEN)
. S:'ZTSTOP DGFIL=408.21 ;continue if stop not requested
I DGFIL=408.21 D
. S IEN=DGIEN,DGIEN=0
. D DG40821(IEN)
. S:'ZTSTOP DGFIL=408.22 ;continue if stop not requested
I DGFIL=408.22 D
. S IEN=DGIEN
. D DG40822(IEN)
;
;set status and mail stats
I ZTSTOP S $P(^XTMP(NAMSPC,0,0),U,12,13)="STOPPED"_U_$$NOW^XLFDT
E S $P(^XTMP(NAMSPC,0,0),U,12,13)="COMPLETED"_U_$$NOW^XLFDT
D MAIL^DG488M
L -^XTMP(NAMSPC)
K TESTING
Q
;
DG40812(IEN) ; Main Cleanup driver for file 408.12
N REC12 S ZTSTOP=0
F S IEN=$O(^DGPR(408.12,"B",IEN)) Q:('IEN)!(ZTSTOP) D
. S REC12=0
. F S REC12=$O(^DGPR(408.12,"B",IEN,REC12)) Q:('REC12)!(ZTSTOP) D
. . S DGT12=DGT12+1
. . ;
. . ;if bad xref then kill the xref, else check for damaged 0 node
. . I '$D(^DGPR(408.12,REC12)) D
. . . S ^XTMP(NAMSPC,408.12,"B",IEN,REC12)=""
. . . I 'TESTING K ^DGPR(408.12,"B",IEN,REC12)
. . . S DG12X=DG12X+1
. . E D
. . . Q:+$P(^DGPR(408.12,REC12,0),U,3) ;quit if piece 3 is there
. . . M ^XTMP(NAMSPC,"408.12",REC12)=^DGPR(408.12,REC12)
. . . D DEL40821(REC12,.DG21,.DG21X)
. . . ;
. . . ;delete bad 408.12
. . . S DIK="^DGPR(408.12,",DA=REC12
. . . I 'TESTING D ^DIK
. . . K DIK,DA
. . . S DG12=DG12+1
. . ;
. . ;check for stop request after every 100 processed recs
. . I DGT12#100=0 D
. . . S:$$S^%ZTLOAD ZTSTOP=1
. . . I $D(^XTMP(NAMSPC,0,"STOP")) S ZTSTOP=1 K ^XTMP(NAMSPC,0,"STOP")
. . S LSTREC=DGFIL_"/"_IEN
. . S $P(^XTMP(NAMSPC,0,0),U,1)=LSTREC
. . S $P(^XTMP(NAMSPC,0,0),U,2,6)=DGT12_U_DG12_U_DG12X_U_DGT22_U_DG22
. . S $P(^XTMP(NAMSPC,0,0),U,9,10)=DG21_U_DG21X
Q
;
DEL40821(R12,DG21,DG21X) ; Delete any entries in 408.21 that point to the bad
; 408.12 record.
N REC21 S REC21=0
F S REC21=$O(^DGMT(408.21,"C",R12,REC21)) Q:'REC21 D
. ;if bad xref then kill the xref, else kill the real record
. I '$D(^DGMT(408.21,REC21)) D
. . S ^XTMP(NAMSPC,408.21,"C",R12,REC21)=""
. . I 'TESTING K ^DGMT(408.21,"C",R12,REC21)
. . S DG21X=DG21X+1
. E D
. . M ^XTMP(NAMSPC,"408.21",REC21)=^DGMT(408.21,REC21)
. . D DG22AIND(REC21)
. . S DIK="^DGMT(408.21,",DA=REC21
. . I 'TESTING D ^DIK
. . K DIK,DA
. . S DG21=DG21+1
Q
;
DG22AIND(R21) ;Delete any entries in 408.22 that is pointing to the bad 408.21
N REC22 S REC22=0
F S REC22=$O(^DGMT(408.22,"AIND",R21,REC22)) Q:'REC22 D
. S DGT22=DGT22+1
. ;if bad xref then kill the xref, else kill the real record
. I '$D(^DGMT(408.22,REC22)) D
. . I 'TESTING K ^DGMT(408.22,"AIND",R21,REC22)
. . S DG22=DG22+1
. E D
. . M ^XTMP(NAMSPC,"408.22",REC22)=^DGMT(408.22,REC22)
. . S DIK="^DGMT(408.22,",DA=REC22
. . I 'TESTING D ^DIK
. . K DIK,DA
. . S DG22=DG22+1
Q
;
DG40821(IEN) ; Main Cleanup driver for file 408.21, If 408.21 not pointed to
; by any 408.22 record, then delete it and check 408.12 for possible
; deletion as well.
N REC21 S ZTSTOP=0
F S IEN=$O(^DGMT(408.21,"B",IEN)) Q:('IEN)!(ZTSTOP) D
. S REC21=0
. F S REC21=$O(^DGMT(408.21,"B",IEN,REC21)) Q:('REC21)!(ZTSTOP) D
. . S DGT21=DGT21+1
. . ;if bad xref then kill the xref, else check for damaged 0 node
. . I '$D(^DGMT(408.21,REC21)) D
. . . S ^XTMP(NAMSPC,408.21,"B",IEN,REC21)=""
. . . I 'TESTING K ^DGMT(408.21,"B",IEN,REC21)
. . . S DG21X=DG21X+1
. . E D
. . . Q:$D(^DGMT(408.22,"AIND",REC21)) ;quit if 408.21 pointed to
. . . M ^XTMP(NAMSPC,"408.21",REC21)=^DGMT(408.21,REC21)
. . . S REC12=0
. . . D DEL21(REC21,.REC12,.DG21)
. . . D:REC12 CHK40812(REC12,REC21,.DG12)
. . ;
. . ;check for stop request after every 100 processed recs
. . I DGT21#100=0 D
. . . S:$$S^%ZTLOAD ZTSTOP=1
. . . I $D(^XTMP(NAMSPC,0,"STOP")) S ZTSTOP=1 K ^XTMP(NAMSPC,0,"STOP")
. . S LSTREC=DGFIL_"/"_IEN
. . S $P(^XTMP(NAMSPC,0,0),U,1)=LSTREC
. . S $P(^XTMP(NAMSPC,0,0),U,3)=DG12
. . S $P(^XTMP(NAMSPC,0,0),U,8,10)=DGT21_U_DG21_U_DG21X
Q
;
DEL21(R21,R12,DG21) ; save to Xtmp & associated REC12, then delete the 408.21
Q:'$D(^DGMT(408.21,R21))
M ^XTMP(NAMSPC,"408.21",R21)=^DGMT(408.21,R21)
S R12=+$P($G(^DGMT(408.21,R21,0)),U,2)
S DIK="^DGMT(408.21,",DA=R21
I 'TESTING D ^DIK
K DIK,DA
S DG21=DG21+1
Q
;
CHK40812(R12,R21,DG12) ; delete 408.12's if no other 408.21's pointing to it
N XX,OK,REC21 S (REC21,OK)=0
F XX=0:1 S REC21=$O(^DGMT(408.21,"C",R12,REC21)) Q:'REC21 D
. S:REC21=R21 OK=1
Q:XX>1 ;quit if other 408.21's are pointing to 408.12
Q:(XX=1)&('OK) ;quit if only one rec and not the correct one
;
M ^XTMP(NAMSPC,"408.12",R12)=^DGPR(408.12,R12)
S DIK="^DGPR(408.12,",DA=R12
I 'TESTING D ^DIK
K DIK,DA
S DG12=DG12+1
Q
;
DG40822(IEN) ; Main Cleanup driver for file 408.22
N REC22 S ZTSTOP=0
F S IEN=$O(^DGMT(408.22,"B",IEN)) Q:('IEN)!(ZTSTOP) D
. S REC22=0
. F S REC22=$O(^DGMT(408.22,"B",IEN,REC22)) Q:('REC22)!(ZTSTOP) D
. . S DGT22=DGT22+1
. . ;
. . ;if bad xref then kill the xref, else check for damaged 0 node
. . I '$D(^DGMT(408.22,REC22)) D
. . . S ^XTMP(NAMSPC,"408.22","B",IEN,REC22)=""
. . . I 'TESTING K ^DGMT(408.22,"B",IEN,REC22)
. . . S DG22X=DG22X+1
. . E D
. . . Q:+$P(^DGMT(408.22,REC22,0),U,2) ;quit if piece 2 is there
. . . ;save & delete bad 408.22 rec
. . . M ^XTMP(NAMSPC,"408.22",REC22)=^DGMT(408.22,REC22)
. . . S DIK="^DGMT(408.22,",DA=REC22
. . . I 'TESTING D ^DIK
. . . K DIK,DA
. . . S DG22=DG22+1
. . ;
. . ;check for stop request after every 100 processed recs
. . I DGT22#100=0 D
. . . S:$$S^%ZTLOAD ZTSTOP=1
. . . I $D(^XTMP(NAMSPC,0,"STOP")) S ZTSTOP=1 K ^XTMP(NAMSPC,0,"STOP")
. . S LSTREC=DGFIL_"/"_IEN
. . S $P(^XTMP(NAMSPC,0,0),U,1)=LSTREC
. . S $P(^XTMP(NAMSPC,0,0),U,5,7)=DGT22_U_DG22_U_DG22X
Q
;
CHKSTAT() ;check if job is running, stopped, or completed
N Y,DUOUT,DTOUT,QUIT,NAMSPC
S QUIT=0
S NAMSPC=$$NAMSPC
L +^XTMP(NAMSPC):1
I '$T W !!,*7,"*** ALREADY RUNNING ***" H 4 Q 1
;
; get current mode
N TESTMODE S TESTMODE=$G(^XTMP(NAMSPC,0,"TESTING"))
; get job status
S STAT=$P($G(^XTMP(NAMSPC,0,0)),U,12)
S STIME=$P($G(^XTMP(NAMSPC,0,0)),U,13)
Q:STAT="" QUIT
;
;if job Completed or trying to resume in Live mode when previously
;incompleted in Test mode, ask to Re-Run
I STAT="COMPLETED" D
. D MSG(.QUIT)
E D
. I ('TESTING&TESTMODE)!(TESTING&'TESTMODE) D MSG(.QUIT)
Q QUIT
;
GETLAST ;get last run info
S DGFIL=$P($G(^XTMP(NAMSPC,0,0)),"/") ;file
S DGIEN=+$P($G(^XTMP(NAMSPC,0,0)),"/",2) ;ien
S DGT12=+$P($G(^XTMP(NAMSPC,0,0)),U,2) ;tot 408.12 recs processed
S DG12=+$P($G(^XTMP(NAMSPC,0,0)),U,3) ;tot 408.12 recs purged
S DG12X=+$P($G(^XTMP(NAMSPC,0,0)),U,4) ;tot bad 408.12 "B" purged
S DGT22=+$P($G(^XTMP(NAMSPC,0,0)),U,5) ;tot 408.22 recs processed
S DG22=+$P($G(^XTMP(NAMSPC,0,0)),U,6) ;tot 408.22 recs purged
S DG22X=+$P($G(^XTMP(NAMSPC,0,0)),U,7) ;tot bad 408.22 "B" purged
S DGT21=+$P($G(^XTMP(NAMSPC,0,0)),U,8) ;tot 408.21 recs processed
S DG21=+$P($G(^XTMP(NAMSPC,0,0)),U,9) ;tot 408.21 recs purged
S DG21X=+$P($G(^XTMP(NAMSPC,0,0)),U,10) ;tot bad 408.21 "C" purged
S BTIME=$P($G(^XTMP(NAMSPC,0,0)),U,11) ;begin time
S STAT=$P($G(^XTMP(NAMSPC,0,0)),U,12) ;status
S STIME=$P($G(^XTMP(NAMSPC,0,0)),U,13) ;stop time
Q
;
MSG(QUIT) ;print message to user
W " was "_STAT_" on "_$$FMTE^XLFDT(STIME)
W " in "_$S(TESTMODE:"TEST",1:"LIVE")_" mode "
W !," Do you want to Re-Run in "_$S(TESTING:"TEST",1:"LIVE")
W " mode?"
K DIR
S DIR("?",1)=" Entering Y, will delete the XTMP global where the previous cleanup"
S DIR("?")=" information was stored and begin a new job, or N to cancel request"
S DIR(0)="Y" D ^DIR
I 'Y S QUIT=1 Q
W !," ARE YOU SURE?"
K DIR
S DIR("?")="Enter Y to begin a new Job or N to cancel request"
S DIR(0)="Y" D ^DIR
I 'Y S QUIT=1 Q
;fall thru to re-run mode, kill ^XTMP
K ^XTMP(NAMSPC)
Q
;
STOP ; alternate stop method
S ^XTMP($$NAMSPC,0,"STOP")=""
Q
NAMSPC() ;
Q "DG*5.3*488"
DG488 ;ALB/GN - CLEANUP PATIENT RELATION & INCOME FILES;12/11/02 ; 2/4/03 1:25pm
+1 ;;5.3;REGISTRATION;**488,1015**;5-1-2001;Build 21
+2 ;
+3 QUIT
+4 ;
TEST ; Entry point for testing this routine, then fall thru.
+1 SET TESTING=1
EN ; Entry point to start job
+1 ;
+2 NEW QUIT,ZTDESC,ZTIO,ZTRTN,ZTSK,ZTQUEUED,ZTSAVE
+3 ;
+4 SET TESTING=+$GET(TESTING)
+5 ; setup TM variables and Load
+6 SET ZTSAVE("TESTING")=""
+7 SET ZTRTN=("TASK^DG488")
+8 SET ZTDESC="Cleanup Patient Relation & Income Files"
+9 SET ZTIO=""
+10 WRITE !!,ZTDESC,!
+11 ;
+12 ;check if already running or completed.
+13 SET QUIT=$$CHKSTAT
+14 IF QUIT
LOCK -^XTMP($$NAMSPC)
KILL TESTING
QUIT
+15 DO ^%ZTLOAD
+16 LOCK -^XTMP($$NAMSPC)
+17 KILL TESTING
+18 IF $DATA(ZTSK)
Begin DoDot:1
+19 WRITE !,"This request queued as Task # ",ZTSK,!
End DoDot:1
+20 QUIT
+21 ;
TASK ; Entry point for taskman
+1 ;quit if can't get a lock
LOCK +^XTMP($$NAMSPC):10
IF '$TEST
Begin DoDot:1
+2 SET $PIECE(^XTMP($$NAMSPC,0,0),U,12)="NO LOCK GAINED"
End DoDot:1
QUIT
+3 NEW ZTSTOP,LSTREC,DIK,DA,NAMSPC,DGT12,DG12,DG12X,DGT22,DG22,DG22X
+4 NEW BEGTIME,PURGDT,DGFIL,IEN,DGIEN,BTIME,STAT,STIME,DGT21,DG21,DG21X
+5 SET NAMSPC=$$NAMSPC
+6 SET ZTDESC=$GET(ZTDESC,"Cleanup of Patient Related Income files")
+7 ;
+8 ;assume testing if not defined
SET TESTING=$GET(TESTING,1)
+9 ;setup XTMP according to stds.
+10 SET BEGTIME=$$NOW^XLFDT()
+11 SET PURGDT=$$FMADD^XLFDT(BEGTIME,30)
+12 SET ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME_U_ZTDESC
+13 SET ^XTMP(NAMSPC,0,"TASKID")=$GET(ZTSK,"DIRECT")
+14 SET ^XTMP(NAMSPC,0,"TESTING")=TESTING
+15 ;get last run data
+16 DO GETLAST
+17 ;init begin time, if not there, and status & stop time fields
+18 SET $PIECE(^XTMP(NAMSPC,0,0),U,12,13)="RUNNING^"
+19 IF $PIECE(^XTMP(NAMSPC,0,0),U,11)=""
SET $PIECE(^XTMP(NAMSPC,0,0),U,11)=$$NOW^XLFDT
+20 ;start/restart cleanups
+21 IF DGFIL=""
SET DGFIL=408.12
+22 IF DGFIL=408.12
Begin DoDot:1
+23 SET IEN=DGIEN
SET DGIEN=0
+24 DO DG40812(IEN)
+25 ;continue if stop not requested
IF 'ZTSTOP
SET DGFIL=408.21
End DoDot:1
+26 IF DGFIL=408.21
Begin DoDot:1
+27 SET IEN=DGIEN
SET DGIEN=0
+28 DO DG40821(IEN)
+29 ;continue if stop not requested
IF 'ZTSTOP
SET DGFIL=408.22
End DoDot:1
+30 IF DGFIL=408.22
Begin DoDot:1
+31 SET IEN=DGIEN
+32 DO DG40822(IEN)
End DoDot:1
+33 ;
+34 ;set status and mail stats
+35 IF ZTSTOP
SET $PIECE(^XTMP(NAMSPC,0,0),U,12,13)="STOPPED"_U_$$NOW^XLFDT
+36 IF '$TEST
SET $PIECE(^XTMP(NAMSPC,0,0),U,12,13)="COMPLETED"_U_$$NOW^XLFDT
+37 DO MAIL^DG488M
+38 LOCK -^XTMP(NAMSPC)
+39 KILL TESTING
+40 QUIT
+41 ;
DG40812(IEN) ; Main Cleanup driver for file 408.12
+1 NEW REC12
SET ZTSTOP=0
+2 FOR
SET IEN=$ORDER(^DGPR(408.12,"B",IEN))
IF ('IEN)!(ZTSTOP)
QUIT
Begin DoDot:1
+3 SET REC12=0
+4 FOR
SET REC12=$ORDER(^DGPR(408.12,"B",IEN,REC12))
IF ('REC12)!(ZTSTOP)
QUIT
Begin DoDot:2
+5 SET DGT12=DGT12+1
+6 ;
+7 ;if bad xref then kill the xref, else check for damaged 0 node
+8 IF '$DATA(^DGPR(408.12,REC12))
Begin DoDot:3
+9 SET ^XTMP(NAMSPC,408.12,"B",IEN,REC12)=""
+10 IF 'TESTING
KILL ^DGPR(408.12,"B",IEN,REC12)
+11 SET DG12X=DG12X+1
End DoDot:3
+12 IF '$TEST
Begin DoDot:3
+13 ;quit if piece 3 is there
IF +$PIECE(^DGPR(408.12,REC12,0),U,3)
QUIT
+14 MERGE ^XTMP(NAMSPC,"408.12",REC12)=^DGPR(408.12,REC12)
+15 DO DEL40821(REC12,.DG21,.DG21X)
+16 ;
+17 ;delete bad 408.12
+18 SET DIK="^DGPR(408.12,"
SET DA=REC12
+19 IF 'TESTING
DO ^DIK
+20 KILL DIK,DA
+21 SET DG12=DG12+1
End DoDot:3
+22 ;
+23 ;check for stop request after every 100 processed recs
+24 IF DGT12#100=0
Begin DoDot:3
+25 IF $$S^%ZTLOAD
SET ZTSTOP=1
+26 IF $DATA(^XTMP(NAMSPC,0,"STOP"))
SET ZTSTOP=1
KILL ^XTMP(NAMSPC,0,"STOP")
End DoDot:3
+27 SET LSTREC=DGFIL_"/"_IEN
+28 SET $PIECE(^XTMP(NAMSPC,0,0),U,1)=LSTREC
+29 SET $PIECE(^XTMP(NAMSPC,0,0),U,2,6)=DGT12_U_DG12_U_DG12X_U_DGT22_U_DG22
+30 SET $PIECE(^XTMP(NAMSPC,0,0),U,9,10)=DG21_U_DG21X
End DoDot:2
End DoDot:1
+31 QUIT
+32 ;
DEL40821(R12,DG21,DG21X) ; Delete any entries in 408.21 that point to the bad
+1 ; 408.12 record.
+2 NEW REC21
SET REC21=0
+3 FOR
SET REC21=$ORDER(^DGMT(408.21,"C",R12,REC21))
IF 'REC21
QUIT
Begin DoDot:1
+4 ;if bad xref then kill the xref, else kill the real record
+5 IF '$DATA(^DGMT(408.21,REC21))
Begin DoDot:2
+6 SET ^XTMP(NAMSPC,408.21,"C",R12,REC21)=""
+7 IF 'TESTING
KILL ^DGMT(408.21,"C",R12,REC21)
+8 SET DG21X=DG21X+1
End DoDot:2
+9 IF '$TEST
Begin DoDot:2
+10 MERGE ^XTMP(NAMSPC,"408.21",REC21)=^DGMT(408.21,REC21)
+11 DO DG22AIND(REC21)
+12 SET DIK="^DGMT(408.21,"
SET DA=REC21
+13 IF 'TESTING
DO ^DIK
+14 KILL DIK,DA
+15 SET DG21=DG21+1
End DoDot:2
End DoDot:1
+16 QUIT
+17 ;
DG22AIND(R21) ;Delete any entries in 408.22 that is pointing to the bad 408.21
+1 NEW REC22
SET REC22=0
+2 FOR
SET REC22=$ORDER(^DGMT(408.22,"AIND",R21,REC22))
IF 'REC22
QUIT
Begin DoDot:1
+3 SET DGT22=DGT22+1
+4 ;if bad xref then kill the xref, else kill the real record
+5 IF '$DATA(^DGMT(408.22,REC22))
Begin DoDot:2
+6 IF 'TESTING
KILL ^DGMT(408.22,"AIND",R21,REC22)
+7 SET DG22=DG22+1
End DoDot:2
+8 IF '$TEST
Begin DoDot:2
+9 MERGE ^XTMP(NAMSPC,"408.22",REC22)=^DGMT(408.22,REC22)
+10 SET DIK="^DGMT(408.22,"
SET DA=REC22
+11 IF 'TESTING
DO ^DIK
+12 KILL DIK,DA
+13 SET DG22=DG22+1
End DoDot:2
End DoDot:1
+14 QUIT
+15 ;
DG40821(IEN) ; Main Cleanup driver for file 408.21, If 408.21 not pointed to
+1 ; by any 408.22 record, then delete it and check 408.12 for possible
+2 ; deletion as well.
+3 NEW REC21
SET ZTSTOP=0
+4 FOR
SET IEN=$ORDER(^DGMT(408.21,"B",IEN))
IF ('IEN)!(ZTSTOP)
QUIT
Begin DoDot:1
+5 SET REC21=0
+6 FOR
SET REC21=$ORDER(^DGMT(408.21,"B",IEN,REC21))
IF ('REC21)!(ZTSTOP)
QUIT
Begin DoDot:2
+7 SET DGT21=DGT21+1
+8 ;if bad xref then kill the xref, else check for damaged 0 node
+9 IF '$DATA(^DGMT(408.21,REC21))
Begin DoDot:3
+10 SET ^XTMP(NAMSPC,408.21,"B",IEN,REC21)=""
+11 IF 'TESTING
KILL ^DGMT(408.21,"B",IEN,REC21)
+12 SET DG21X=DG21X+1
End DoDot:3
+13 IF '$TEST
Begin DoDot:3
+14 ;quit if 408.21 pointed to
IF $DATA(^DGMT(408.22,"AIND",REC21))
QUIT
+15 MERGE ^XTMP(NAMSPC,"408.21",REC21)=^DGMT(408.21,REC21)
+16 SET REC12=0
+17 DO DEL21(REC21,.REC12,.DG21)
+18 IF REC12
DO CHK40812(REC12,REC21,.DG12)
End DoDot:3
+19 ;
+20 ;check for stop request after every 100 processed recs
+21 IF DGT21#100=0
Begin DoDot:3
+22 IF $$S^%ZTLOAD
SET ZTSTOP=1
+23 IF $DATA(^XTMP(NAMSPC,0,"STOP"))
SET ZTSTOP=1
KILL ^XTMP(NAMSPC,0,"STOP")
End DoDot:3
+24 SET LSTREC=DGFIL_"/"_IEN
+25 SET $PIECE(^XTMP(NAMSPC,0,0),U,1)=LSTREC
+26 SET $PIECE(^XTMP(NAMSPC,0,0),U,3)=DG12
+27 SET $PIECE(^XTMP(NAMSPC,0,0),U,8,10)=DGT21_U_DG21_U_DG21X
End DoDot:2
End DoDot:1
+28 QUIT
+29 ;
DEL21(R21,R12,DG21) ; save to Xtmp & associated REC12, then delete the 408.21
+1 IF '$DATA(^DGMT(408.21,R21))
QUIT
+2 MERGE ^XTMP(NAMSPC,"408.21",R21)=^DGMT(408.21,R21)
+3 SET R12=+$PIECE($GET(^DGMT(408.21,R21,0)),U,2)
+4 SET DIK="^DGMT(408.21,"
SET DA=R21
+5 IF 'TESTING
DO ^DIK
+6 KILL DIK,DA
+7 SET DG21=DG21+1
+8 QUIT
+9 ;
CHK40812(R12,R21,DG12) ; delete 408.12's if no other 408.21's pointing to it
+1 NEW XX,OK,REC21
SET (REC21,OK)=0
+2 FOR XX=0:1
SET REC21=$ORDER(^DGMT(408.21,"C",R12,REC21))
IF 'REC21
QUIT
Begin DoDot:1
+3 IF REC21=R21
SET OK=1
End DoDot:1
+4 ;quit if other 408.21's are pointing to 408.12
IF XX>1
QUIT
+5 ;quit if only one rec and not the correct one
IF (XX=1)&('OK)
QUIT
+6 ;
+7 MERGE ^XTMP(NAMSPC,"408.12",R12)=^DGPR(408.12,R12)
+8 SET DIK="^DGPR(408.12,"
SET DA=R12
+9 IF 'TESTING
DO ^DIK
+10 KILL DIK,DA
+11 SET DG12=DG12+1
+12 QUIT
+13 ;
DG40822(IEN) ; Main Cleanup driver for file 408.22
+1 NEW REC22
SET ZTSTOP=0
+2 FOR
SET IEN=$ORDER(^DGMT(408.22,"B",IEN))
IF ('IEN)!(ZTSTOP)
QUIT
Begin DoDot:1
+3 SET REC22=0
+4 FOR
SET REC22=$ORDER(^DGMT(408.22,"B",IEN,REC22))
IF ('REC22)!(ZTSTOP)
QUIT
Begin DoDot:2
+5 SET DGT22=DGT22+1
+6 ;
+7 ;if bad xref then kill the xref, else check for damaged 0 node
+8 IF '$DATA(^DGMT(408.22,REC22))
Begin DoDot:3
+9 SET ^XTMP(NAMSPC,"408.22","B",IEN,REC22)=""
+10 IF 'TESTING
KILL ^DGMT(408.22,"B",IEN,REC22)
+11 SET DG22X=DG22X+1
End DoDot:3
+12 IF '$TEST
Begin DoDot:3
+13 ;quit if piece 2 is there
IF +$PIECE(^DGMT(408.22,REC22,0),U,2)
QUIT
+14 ;save & delete bad 408.22 rec
+15 MERGE ^XTMP(NAMSPC,"408.22",REC22)=^DGMT(408.22,REC22)
+16 SET DIK="^DGMT(408.22,"
SET DA=REC22
+17 IF 'TESTING
DO ^DIK
+18 KILL DIK,DA
+19 SET DG22=DG22+1
End DoDot:3
+20 ;
+21 ;check for stop request after every 100 processed recs
+22 IF DGT22#100=0
Begin DoDot:3
+23 IF $$S^%ZTLOAD
SET ZTSTOP=1
+24 IF $DATA(^XTMP(NAMSPC,0,"STOP"))
SET ZTSTOP=1
KILL ^XTMP(NAMSPC,0,"STOP")
End DoDot:3
+25 SET LSTREC=DGFIL_"/"_IEN
+26 SET $PIECE(^XTMP(NAMSPC,0,0),U,1)=LSTREC
+27 SET $PIECE(^XTMP(NAMSPC,0,0),U,5,7)=DGT22_U_DG22_U_DG22X
End DoDot:2
End DoDot:1
+28 QUIT
+29 ;
CHKSTAT() ;check if job is running, stopped, or completed
+1 NEW Y,DUOUT,DTOUT,QUIT,NAMSPC
+2 SET QUIT=0
+3 SET NAMSPC=$$NAMSPC
+4 LOCK +^XTMP(NAMSPC):1
+5 IF '$TEST
WRITE !!,*7,"*** ALREADY RUNNING ***"
HANG 4
QUIT 1
+6 ;
+7 ; get current mode
+8 NEW TESTMODE
SET TESTMODE=$GET(^XTMP(NAMSPC,0,"TESTING"))
+9 ; get job status
+10 SET STAT=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,12)
+11 SET STIME=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,13)
+12 IF STAT=""
QUIT QUIT
+13 ;
+14 ;if job Completed or trying to resume in Live mode when previously
+15 ;incompleted in Test mode, ask to Re-Run
+16 IF STAT="COMPLETED"
Begin DoDot:1
+17 DO MSG(.QUIT)
End DoDot:1
+18 IF '$TEST
Begin DoDot:1
+19 IF ('TESTING&TESTMODE)!(TESTING&'TESTMODE)
DO MSG(.QUIT)
End DoDot:1
+20 QUIT QUIT
+21 ;
GETLAST ;get last run info
+1 ;file
SET DGFIL=$PIECE($GET(^XTMP(NAMSPC,0,0)),"/")
+2 ;ien
SET DGIEN=+$PIECE($GET(^XTMP(NAMSPC,0,0)),"/",2)
+3 ;tot 408.12 recs processed
SET DGT12=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,2)
+4 ;tot 408.12 recs purged
SET DG12=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,3)
+5 ;tot bad 408.12 "B" purged
SET DG12X=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,4)
+6 ;tot 408.22 recs processed
SET DGT22=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,5)
+7 ;tot 408.22 recs purged
SET DG22=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,6)
+8 ;tot bad 408.22 "B" purged
SET DG22X=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,7)
+9 ;tot 408.21 recs processed
SET DGT21=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,8)
+10 ;tot 408.21 recs purged
SET DG21=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,9)
+11 ;tot bad 408.21 "C" purged
SET DG21X=+$PIECE($GET(^XTMP(NAMSPC,0,0)),U,10)
+12 ;begin time
SET BTIME=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,11)
+13 ;status
SET STAT=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,12)
+14 ;stop time
SET STIME=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,13)
+15 QUIT
+16 ;
MSG(QUIT) ;print message to user
+1 WRITE " was "_STAT_" on "_$$FMTE^XLFDT(STIME)
+2 WRITE " in "_$SELECT(TESTMODE:"TEST",1:"LIVE")_" mode "
+3 WRITE !," Do you want to Re-Run in "_$SELECT(TESTING:"TEST",1:"LIVE")
+4 WRITE " mode?"
+5 KILL DIR
+6 SET DIR("?",1)=" Entering Y, will delete the XTMP global where the previous cleanup"
+7 SET DIR("?")=" information was stored and begin a new job, or N to cancel request"
+8 SET DIR(0)="Y"
DO ^DIR
+9 IF 'Y
SET QUIT=1
QUIT
+10 WRITE !," ARE YOU SURE?"
+11 KILL DIR
+12 SET DIR("?")="Enter Y to begin a new Job or N to cancel request"
+13 SET DIR(0)="Y"
DO ^DIR
+14 IF 'Y
SET QUIT=1
QUIT
+15 ;fall thru to re-run mode, kill ^XTMP
+16 KILL ^XTMP(NAMSPC)
+17 QUIT
+18 ;
STOP ; alternate stop method
+1 SET ^XTMP($$NAMSPC,0,"STOP")=""
+2 QUIT
NAMSPC() ;
+1 QUIT "DG*5.3*488"