- DG53618 ;ALB/GN/PHH,EG - DG*5.3*618 CLEANUP DANGLING RECS; 04/27/2005
- ;;5.3;Registration;**618,1015**;Aug 13, 1993;Build 21
- ;
- ; Cleans up dangling file Income Relation file #408.12 records where
- ; it points to bad or non-existent Income Person file #408.13 and
- ; Patient file #2 records.
- ;
- ; 1. If it points to file 2, that doesn't exist or has a bad 0 node,
- ; delete the 408.12 rec that points to the bad 2 rec, then
- ; delete the 408.21 that points to 408.12 rec, then
- ; delete the 408.22 rec that points to the 408.21.
- ; 2. Same logic will be used if points to bad 408.13 recs
- ;
- Q
- ;
- POST ;post install entry tag call. processes entire file in live mode
- N ZTDTH,ZTDESC,ZTIO,ZTRTN,ZTSK,ZTQUEUED,ZTSAVE,CHKPNT
- D MES^XPDUTL("")
- D MES^XPDUTL("=====================================================")
- D MES^XPDUTL("Queuing Bad Patient Relation Pointers cleanup process.....")
- I $$CHKSTAT(1) D Q
- . D BMES^XPDUTL("ABORTING Post Install Cleanup Queuing")
- . D MES^XPDUTL("=====================================================")
- . Q
- S ZTRTN="QUE^DG53618"
- S ZTDESC="Cleanup Bad Pointers In Patient Relation File"
- S ZTIO="",ZTDTH=$H
- S CHKPNT=0,ZTSAVE("CHKPNT")=""
- D ^%ZTLOAD
- D MES^XPDUTL("This request queued as Task # "_ZTSK)
- D MES^XPDUTL("=====================================================")
- D MES^XPDUTL("")
- Q
- ;
- TEST ; Entry point for taskman (testing mode)
- N TESTING,ZTQUEUED
- S TESTING=1,ZTQUEUED=0
- ;if running again, check to see if complete
- ;if so, ask user to rerun
- I $$CHKSTAT(0) D Q
- . U 0 W !,"Task is already running or user opted to not restart"
- . Q
- D QUE
- Q
- QUE ; Entry point for taskman (live mode)
- N NAMSPC S NAMSPC=$$NAMSPC^DG53618
- N QQ,ZTSTOP,XREC,MTIEN,DIK,DA,DGTOT,DGDEL12,BEGTIME,PURGDT,DGDEL21
- N TMP,ICDT,COUNT,TYPE,TYPNAM,DGDEL22,REC12,REC21,REC22
- N DGBAD03,DGBADPAT,DGBADPER
- N R12,PT,DFN,X,U
- S U="^"
- I '$D(TESTING) N TESTING S TESTING=0
- I '$D(ZTQUEUED) N ZTQUEUED S ZTQUEUED=1
- ;
- ;get last run info if exists
- S XREC=$G(^XTMP(NAMSPC,0,0))
- S R12=+$P(XREC,U,1) ;last REC processed
- S DGTOT=+$P(XREC,U,2) ;total records processed
- S DGDEL12=+$P(XREC,U,3) ;total bad 408.12 records purged
- S DGDEL21=+$P(XREC,U,7) ;total bad 408.21 records found
- S DGDEL22=+$P(XREC,U,8) ;total bad 408.22 records found
- S DGBADPAT=+$P(XREC,U,9) ;total bad pointer to file #2
- S DGBADPER=+$P(XREC,U,10) ;total bad pointer to file #408.13
- S DGBAD03=+$P(XREC,U,11) ;null or bad field # 03
- ;
- ;setup XTMP according to stds.
- D SETUPX(90)
- ;
- ;init status field and start date & time if null
- S $P(^XTMP(NAMSPC,0,0),U,5,6)="RUNNING^"
- S:$P(^XTMP(NAMSPC,0,0),U,4)="" $P(^XTMP(NAMSPC,0,0),U,4)=$$NOW^XLFDT
- ;
- ;drive through 408.12 looking for bad variable pointers
- S ZTSTOP=0
- F QQ=1:1 S R12=$O(^DGPR(408.12,R12)) Q:(R12'>0)!ZTSTOP D
- . ;check for stop request after every 20 processed DFN recs
- . I QQ#20=0 D
- . . S:$$S^%ZTLOAD ZTSTOP=1
- . . I $D(^XTMP(NAMSPC,0,"STOP")) S ZTSTOP=1 K ^XTMP(NAMSPC,0,"STOP")
- . . Q
- . I ZTSTOP Q
- . S DGTOT=DGTOT+1
- . S $P(^XTMP(NAMSPC,0,0),U,1,2)=R12_U_DGTOT
- . ;
- . S DFN=$$GET1^DIQ(408.12,R12_",",.01,"I")
- . S PT=$$GET1^DIQ(408.12,R12_",",.03,"I")
- . ;
- . ;good patient (#.01),good variable pointer (#.03)...quit
- . I $$GOODPAT(DFN)="Y",$$GOODPTR(PT)="Y" Q
- . ;
- . ; cleanup Income Relation file #408.12 & the bad pointed to file
- . ; either Patient file #2 or Income Person file #408.13
- . I 'ZTQUEUED W !!,"File #408.12, ien ",R12," has a bad pointer to "
- . ;if patient (#.01) is null
- . I DFN="" D
- . . S X="null patient (field #.01)"
- . . I 'ZTQUEUED W X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- . . S DGBADPAT=DGBADPAT+1
- . . D ACHK03(R12,PT,ZTQUEUED,TESTING,.DGBADPAT,.DGBADPER,.DGBAD03)
- . . Q
- . ;patient #.01 not found
- . I DFN'="",$$GOODPAT(DFN)="N" D
- . . S X="patient "_DFN_" (field #.01)"
- . . I 'ZTQUEUED W X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- . . S DGBADPAT=DGBADPAT+1
- . . ;I 'TESTING S DA=DFN,DIK="^DPT(" D ^DIK
- . . D ACHK03(R12,PT,ZTQUEUED,TESTING,.DGBADPAT,.DGBADPER,.DGBAD03)
- . . Q
- . ;patient (#.03) is also a patient, is bad, but patient (# .01) is ok
- . I $$GOODPAT(DFN)="Y",PT["DPT",$$GOODPTR(PT)="N" D
- . . S X="patient "_$P(PT,";",1)_" (field #.03)"
- . . I 'ZTQUEUED W X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- . . S DGBADPAT=DGBADPAT+1
- . . ;I 'TESTING S DA=$P(PT,";",1),DIK="^DPT(" D ^DIK
- . . Q
- . ;patient (#.01) is good, but income person is bad
- . I $$GOODPAT(DFN)="Y",PT["DGPR",$$GOODPTR(PT)="N" D
- . . S X="income person "_$P(PT,";",1)_" (field #.03)"
- . . I 'ZTQUEUED W X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- . . S DGBADPER=DGBADPER+1
- . . I 'TESTING S DA=$P(PT,";",1),DIK="^DGPR(408.13," D ^DIK
- . . Q
- . ;patient #.01 is good, but #.03 is null
- . I $$GOODPAT(DFN)="Y",PT="" D
- . . S X="null field #.03"
- . . I 'ZTQUEUED W X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- . . S DGBAD03=DGBAD03+1
- . . Q
- . ;patient #.01 is good, but #.03 is not null
- . ;and is bad
- . I $$GOODPAT(DFN)="Y",PT'["DGPR",PT'["DPT",PT'="",$$GOODPTR(PT)="N" D
- . . S X="variable pointer "_$P(PT,";",1)_" (field #.03)"
- . . I 'ZTQUEUED W X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- . . S DGBAD03=DGBAD03+1
- . . Q
- . D DEL40812(R12,.DGDEL12,.DGDEL21,.DGDEL22,ZTQUEUED,TESTING,NAMSPC)
- . Q
- ;
- ;update last processed info
- S X=$G(^XTMP(NAMSPC,0,0))
- S $P(X,U,3)=DGDEL12,$P(X,U,7)=DGDEL21
- S $P(X,U,8)=DGDEL22,$P(X,U,9)=DGBADPAT
- S $P(X,U,10)=DGBADPER,$P(X,U,11)=DGBAD03
- S ^XTMP(NAMSPC,0,0)=X
- ;set status and mail stats
- I ZTSTOP S $P(^XTMP(NAMSPC,0,0),U,5,6)="STOPPED"_U_$$NOW^XLFDT
- E S $P(^XTMP(NAMSPC,0,0),U,5,6)="COMPLETED"_U_$$NOW^XLFDT
- S X=$$MAIL^DG53618M(TESTING)
- K TESTING
- L -^XTMP($$NAMSPC)
- Q
- ;
- GOODPAT(DFN) ;determine if patient is there
- N X,U
- S U="^"
- I DFN="" Q "N"
- I '$D(^DPT(DFN,0)) Q "N"
- S X=$G(^DPT(DFN,0)) I X="" Q "N"
- I X?13"^".E Q "N"
- Q "Y"
- ;
- GOODPTR(PT) ;determine if reference is there
- N X,U,SUB,GL,REF
- S U="^"
- I PT'["DPT",PT'["DGPR" Q "N"
- S SUB=$P(PT,";",1),GL=$P(PT,";",2)
- I SUB="" Q "N"
- I SUB'=+SUB S SUB=$C(34)_SUB_$C(34)
- I GL'="DPT(",GL'="DGPR(408.13," Q "N"
- S REF="^"_GL_SUB_",0)"
- S X=$G(@REF)
- I '$D(@REF) Q "N"
- I $G(GL)["DPT",X?13"^".E Q "N"
- I $G(GL)["DGPR",$P(X,U,1)="" Q "N"
- Q "Y"
- ;
- ;at this point, you have a bad .01 field, but want
- ;to check .03 also
- ACHK03(R12,PT,ZTQUEUED,TESTING,DGBADPAT,DGBADPER,DGBAD03) ;
- ;update counters to include bad variable pointers
- ;bad pointer to patient
- I PT["DPT",$$GOODPTR(PT)="N" D Q
- . S DGBADPAT=DGBADPAT+1
- . S X="and bad patient pointer "_$P(PT,";",1)_" (field #.03)"
- . I 'ZTQUEUED W !," ",X
- . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- . ;I 'TESTING S DA=$P(PT,";",1),DIK="^DPT(" D ^DIK
- . Q
- ;bad pointer to income person
- I PT["DGPR",$$GOODPTR(PT)="N" D Q
- . S DGBADPER=DGBADPER+1
- . S X="and bad income person pointer "_$P(PT,";",1)_" (field #.03)"
- . I 'ZTQUEUED W !," ",X
- . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- . I 'TESTING S DA=$P(PT,";",1),DIK="^DGPR(408.13," D ^DIK
- . Q
- ;null variable pointer
- I PT="" D Q
- . S X="and null pointer (field #.03)"
- . I 'ZTQUEUED W !," ",X
- . S DGBAD03=DGBAD03+1
- . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- . Q
- ;bad variable pointer
- I $$GOODPTR(PT)="N" D
- . S X="and bad variable pointer "_$P(PT,";",1)_" (field #.03)"
- . I 'ZTQUEUED W !," ",X
- . S DGBAD03=DGBAD03+1
- . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- . Q
- Q
- ;
- DEL40812(R12,DGDEL12,DGDEL21,DGDEL22,ZTQUEUED,TESTING,NAMSPC) ;
- ; Kill bad #408.12 file rec and files that point to it
- N DA,DIK,R21,R22,X
- S DA=R12,DIK="^DGPR(408.12," D ^DIK:'TESTING
- S DGDEL12=DGDEL12+1
- I 'ZTQUEUED W !,?2,"Deleting 408.12 ien > ",R12
- ;
- ;kill all 408.21's that point to the bad 408.12
- S R21=0
- F S R21=$O(^DGMT(408.21,"C",R12,R21)) Q:'R21 D
- . I 'TESTING S DA=R21,DIK="^DGMT(408.21," D ^DIK
- . S DGDEL21=DGDEL21+1
- . S X="Deleting related ien "_R21_" in file #408.21"
- . I 'ZTQUEUED W !,?4,X
- . S ^XTMP(NAMSPC,"BADPR",R12,"REL",R21)=X
- . ;
- . ;kill all 408.22's that point to the bad 408.21
- . S R22=0
- . F S R22=$O(^DGMT(408.22,"AIND",R21,R22)) Q:'R22 D
- . . I 'TESTING S DA=R22,DIK="^DGMT(408.22," D ^DIK
- . . S DGDEL22=DGDEL22+1
- . . S X="Deleting related ien "_R22_" in file # 408.22"
- . . I 'ZTQUEUED W !,?6,X
- . . S ^XTMP(NAMSPC,"BADPR",R12,"REL",R21,R22)=X
- . . Q
- . Q
- Q
- ;
- CHKSTAT(POST) ;
- N Y,DUOUT,DTOUT,QUIT,STAT,STIME,NAMSPC
- S QUIT=0
- S NAMSPC=$$NAMSPC
- L +^XTMP(NAMSPC):1
- I '$T D BMES^XPDUTL("*** ALREADY RUNNING ***") Q 1
- ;
- ; get job status
- S STAT=$P($G(^XTMP(NAMSPC,0,0)),U,5)
- S STIME=$P($G(^XTMP(NAMSPC,0,0)),U,6)
- ;
- I POST D KILIT Q 0
- ;
- ;if job Completed and run from menu opt, ask to Re-Run
- I STAT="COMPLETED" D
- . W " was Completed on "_$$FMTE^XLFDT(STIME)
- . W !," Do you want to Re-Run again?"
- . K DIR
- . S DIR("?",1)=" Entering Y, will delete the XTMP global where theprevious 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 ^XTMPs
- . D KILIT
- . Q
- Q QUIT
- ;
- KILIT ; kill Xtmp work file for a re-run
- S:'$D(NAMSPC) NAMSPC=$$NAMSPC^DG53618
- K ^XTMP(NAMSPC)
- Q
- ;
- STOP ; alternate stop method
- S ^XTMP($$NAMSPC,0,"STOP")=""
- Q
- ;
- SETUPX(EXPDAY) ;Setup XTMP
- N BEGTIME,PURGDT,NAMSPC,U
- S U="^"
- S NAMSPC=$$NAMSPC^DG53618
- S BEGTIME=$$NOW^XLFDT()
- S PURGDT=$$FMADD^XLFDT(BEGTIME,EXPDAY)
- S ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME
- S $P(^XTMP(NAMSPC,0),U,3)="Cleanup Bad Pointers In PATIENT RELATION File"
- Q
- ;
- NAMSPC() ; Return a consistent name space variable
- Q $T(+0)
- DG53618 ;ALB/GN/PHH,EG - DG*5.3*618 CLEANUP DANGLING RECS; 04/27/2005
- +1 ;;5.3;Registration;**618,1015**;Aug 13, 1993;Build 21
- +2 ;
- +3 ; Cleans up dangling file Income Relation file #408.12 records where
- +4 ; it points to bad or non-existent Income Person file #408.13 and
- +5 ; Patient file #2 records.
- +6 ;
- +7 ; 1. If it points to file 2, that doesn't exist or has a bad 0 node,
- +8 ; delete the 408.12 rec that points to the bad 2 rec, then
- +9 ; delete the 408.21 that points to 408.12 rec, then
- +10 ; delete the 408.22 rec that points to the 408.21.
- +11 ; 2. Same logic will be used if points to bad 408.13 recs
- +12 ;
- +13 QUIT
- +14 ;
- POST ;post install entry tag call. processes entire file in live mode
- +1 NEW ZTDTH,ZTDESC,ZTIO,ZTRTN,ZTSK,ZTQUEUED,ZTSAVE,CHKPNT
- +2 DO MES^XPDUTL("")
- +3 DO MES^XPDUTL("=====================================================")
- +4 DO MES^XPDUTL("Queuing Bad Patient Relation Pointers cleanup process.....")
- +5 IF $$CHKSTAT(1)
- Begin DoDot:1
- +6 DO BMES^XPDUTL("ABORTING Post Install Cleanup Queuing")
- +7 DO MES^XPDUTL("=====================================================")
- +8 QUIT
- End DoDot:1
- QUIT
- +9 SET ZTRTN="QUE^DG53618"
- +10 SET ZTDESC="Cleanup Bad Pointers In Patient Relation File"
- +11 SET ZTIO=""
- SET ZTDTH=$HOROLOG
- +12 SET CHKPNT=0
- SET ZTSAVE("CHKPNT")=""
- +13 DO ^%ZTLOAD
- +14 DO MES^XPDUTL("This request queued as Task # "_ZTSK)
- +15 DO MES^XPDUTL("=====================================================")
- +16 DO MES^XPDUTL("")
- +17 QUIT
- +18 ;
- TEST ; Entry point for taskman (testing mode)
- +1 NEW TESTING,ZTQUEUED
- +2 SET TESTING=1
- SET ZTQUEUED=0
- +3 ;if running again, check to see if complete
- +4 ;if so, ask user to rerun
- +5 IF $$CHKSTAT(0)
- Begin DoDot:1
- +6 USE 0
- WRITE !,"Task is already running or user opted to not restart"
- +7 QUIT
- End DoDot:1
- QUIT
- +8 DO QUE
- +9 QUIT
- QUE ; Entry point for taskman (live mode)
- +1 NEW NAMSPC
- SET NAMSPC=$$NAMSPC^DG53618
- +2 NEW QQ,ZTSTOP,XREC,MTIEN,DIK,DA,DGTOT,DGDEL12,BEGTIME,PURGDT,DGDEL21
- +3 NEW TMP,ICDT,COUNT,TYPE,TYPNAM,DGDEL22,REC12,REC21,REC22
- +4 NEW DGBAD03,DGBADPAT,DGBADPER
- +5 NEW R12,PT,DFN,X,U
- +6 SET U="^"
- +7 IF '$DATA(TESTING)
- NEW TESTING
- SET TESTING=0
- +8 IF '$DATA(ZTQUEUED)
- NEW ZTQUEUED
- SET ZTQUEUED=1
- +9 ;
- +10 ;get last run info if exists
- +11 SET XREC=$GET(^XTMP(NAMSPC,0,0))
- +12 ;last REC processed
- SET R12=+$PIECE(XREC,U,1)
- +13 ;total records processed
- SET DGTOT=+$PIECE(XREC,U,2)
- +14 ;total bad 408.12 records purged
- SET DGDEL12=+$PIECE(XREC,U,3)
- +15 ;total bad 408.21 records found
- SET DGDEL21=+$PIECE(XREC,U,7)
- +16 ;total bad 408.22 records found
- SET DGDEL22=+$PIECE(XREC,U,8)
- +17 ;total bad pointer to file #2
- SET DGBADPAT=+$PIECE(XREC,U,9)
- +18 ;total bad pointer to file #408.13
- SET DGBADPER=+$PIECE(XREC,U,10)
- +19 ;null or bad field # 03
- SET DGBAD03=+$PIECE(XREC,U,11)
- +20 ;
- +21 ;setup XTMP according to stds.
- +22 DO SETUPX(90)
- +23 ;
- +24 ;init status field and start date & time if null
- +25 SET $PIECE(^XTMP(NAMSPC,0,0),U,5,6)="RUNNING^"
- +26 IF $PIECE(^XTMP(NAMSPC,0,0),U,4)=""
- SET $PIECE(^XTMP(NAMSPC,0,0),U,4)=$$NOW^XLFDT
- +27 ;
- +28 ;drive through 408.12 looking for bad variable pointers
- +29 SET ZTSTOP=0
- +30 FOR QQ=1:1
- SET R12=$ORDER(^DGPR(408.12,R12))
- IF (R12'>0)!ZTSTOP
- QUIT
- Begin DoDot:1
- +31 ;check for stop request after every 20 processed DFN recs
- +32 IF QQ#20=0
- Begin DoDot:2
- +33 IF $$S^%ZTLOAD
- SET ZTSTOP=1
- +34 IF $DATA(^XTMP(NAMSPC,0,"STOP"))
- SET ZTSTOP=1
- KILL ^XTMP(NAMSPC,0,"STOP")
- +35 QUIT
- End DoDot:2
- +36 IF ZTSTOP
- QUIT
- +37 SET DGTOT=DGTOT+1
- +38 SET $PIECE(^XTMP(NAMSPC,0,0),U,1,2)=R12_U_DGTOT
- +39 ;
- +40 SET DFN=$$GET1^DIQ(408.12,R12_",",.01,"I")
- +41 SET PT=$$GET1^DIQ(408.12,R12_",",.03,"I")
- +42 ;
- +43 ;good patient (#.01),good variable pointer (#.03)...quit
- +44 IF $$GOODPAT(DFN)="Y"
- IF $$GOODPTR(PT)="Y"
- QUIT
- +45 ;
- +46 ; cleanup Income Relation file #408.12 & the bad pointed to file
- +47 ; either Patient file #2 or Income Person file #408.13
- +48 IF 'ZTQUEUED
- WRITE !!,"File #408.12, ien ",R12," has a bad pointer to "
- +49 ;if patient (#.01) is null
- +50 IF DFN=""
- Begin DoDot:2
- +51 SET X="null patient (field #.01)"
- +52 IF 'ZTQUEUED
- WRITE X
- +53 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- +54 SET DGBADPAT=DGBADPAT+1
- +55 DO ACHK03(R12,PT,ZTQUEUED,TESTING,.DGBADPAT,.DGBADPER,.DGBAD03)
- +56 QUIT
- End DoDot:2
- +57 ;patient #.01 not found
- +58 IF DFN'=""
- IF $$GOODPAT(DFN)="N"
- Begin DoDot:2
- +59 SET X="patient "_DFN_" (field #.01)"
- +60 IF 'ZTQUEUED
- WRITE X
- +61 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- +62 SET DGBADPAT=DGBADPAT+1
- +63 ;I 'TESTING S DA=DFN,DIK="^DPT(" D ^DIK
- +64 DO ACHK03(R12,PT,ZTQUEUED,TESTING,.DGBADPAT,.DGBADPER,.DGBAD03)
- +65 QUIT
- End DoDot:2
- +66 ;patient (#.03) is also a patient, is bad, but patient (# .01) is ok
- +67 IF $$GOODPAT(DFN)="Y"
- IF PT["DPT"
- IF $$GOODPTR(PT)="N"
- Begin DoDot:2
- +68 SET X="patient "_$PIECE(PT,";",1)_" (field #.03)"
- +69 IF 'ZTQUEUED
- WRITE X
- +70 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- +71 SET DGBADPAT=DGBADPAT+1
- +72 ;I 'TESTING S DA=$P(PT,";",1),DIK="^DPT(" D ^DIK
- +73 QUIT
- End DoDot:2
- +74 ;patient (#.01) is good, but income person is bad
- +75 IF $$GOODPAT(DFN)="Y"
- IF PT["DGPR"
- IF $$GOODPTR(PT)="N"
- Begin DoDot:2
- +76 SET X="income person "_$PIECE(PT,";",1)_" (field #.03)"
- +77 IF 'ZTQUEUED
- WRITE X
- +78 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- +79 SET DGBADPER=DGBADPER+1
- +80 IF 'TESTING
- SET DA=$PIECE(PT,";",1)
- SET DIK="^DGPR(408.13,"
- DO ^DIK
- +81 QUIT
- End DoDot:2
- +82 ;patient #.01 is good, but #.03 is null
- +83 IF $$GOODPAT(DFN)="Y"
- IF PT=""
- Begin DoDot:2
- +84 SET X="null field #.03"
- +85 IF 'ZTQUEUED
- WRITE X
- +86 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- +87 SET DGBAD03=DGBAD03+1
- +88 QUIT
- End DoDot:2
- +89 ;patient #.01 is good, but #.03 is not null
- +90 ;and is bad
- +91 IF $$GOODPAT(DFN)="Y"
- IF PT'["DGPR"
- IF PT'["DPT"
- IF PT'=""
- IF $$GOODPTR(PT)="N"
- Begin DoDot:2
- +92 SET X="variable pointer "_$PIECE(PT,";",1)_" (field #.03)"
- +93 IF 'ZTQUEUED
- WRITE X
- +94 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
- +95 SET DGBAD03=DGBAD03+1
- +96 QUIT
- End DoDot:2
- +97 DO DEL40812(R12,.DGDEL12,.DGDEL21,.DGDEL22,ZTQUEUED,TESTING,NAMSPC)
- +98 QUIT
- End DoDot:1
- +99 ;
- +100 ;update last processed info
- +101 SET X=$GET(^XTMP(NAMSPC,0,0))
- +102 SET $PIECE(X,U,3)=DGDEL12
- SET $PIECE(X,U,7)=DGDEL21
- +103 SET $PIECE(X,U,8)=DGDEL22
- SET $PIECE(X,U,9)=DGBADPAT
- +104 SET $PIECE(X,U,10)=DGBADPER
- SET $PIECE(X,U,11)=DGBAD03
- +105 SET ^XTMP(NAMSPC,0,0)=X
- +106 ;set status and mail stats
- +107 IF ZTSTOP
- SET $PIECE(^XTMP(NAMSPC,0,0),U,5,6)="STOPPED"_U_$$NOW^XLFDT
- +108 IF '$TEST
- SET $PIECE(^XTMP(NAMSPC,0,0),U,5,6)="COMPLETED"_U_$$NOW^XLFDT
- +109 SET X=$$MAIL^DG53618M(TESTING)
- +110 KILL TESTING
- +111 LOCK -^XTMP($$NAMSPC)
- +112 QUIT
- +113 ;
- GOODPAT(DFN) ;determine if patient is there
- +1 NEW X,U
- +2 SET U="^"
- +3 IF DFN=""
- QUIT "N"
- +4 IF '$DATA(^DPT(DFN,0))
- QUIT "N"
- +5 SET X=$GET(^DPT(DFN,0))
- IF X=""
- QUIT "N"
- +6 IF X?13"^".E
- QUIT "N"
- +7 QUIT "Y"
- +8 ;
- GOODPTR(PT) ;determine if reference is there
- +1 NEW X,U,SUB,GL,REF
- +2 SET U="^"
- +3 IF PT'["DPT"
- IF PT'["DGPR"
- QUIT "N"
- +4 SET SUB=$PIECE(PT,";",1)
- SET GL=$PIECE(PT,";",2)
- +5 IF SUB=""
- QUIT "N"
- +6 IF SUB'=+SUB
- SET SUB=$CHAR(34)_SUB_$CHAR(34)
- +7 IF GL'="DPT("
- IF GL'="DGPR(408.13,"
- QUIT "N"
- +8 SET REF="^"_GL_SUB_",0)"
- +9 SET X=$GET(@REF)
- +10 IF '$DATA(@REF)
- QUIT "N"
- +11 IF $GET(GL)["DPT"
- IF X?13"^".E
- QUIT "N"
- +12 IF $GET(GL)["DGPR"
- IF $PIECE(X,U,1)=""
- QUIT "N"
- +13 QUIT "Y"
- +14 ;
- +15 ;at this point, you have a bad .01 field, but want
- +16 ;to check .03 also
- ACHK03(R12,PT,ZTQUEUED,TESTING,DGBADPAT,DGBADPER,DGBAD03) ;
- +1 ;update counters to include bad variable pointers
- +2 ;bad pointer to patient
- +3 IF PT["DPT"
- IF $$GOODPTR(PT)="N"
- Begin DoDot:1
- +4 SET DGBADPAT=DGBADPAT+1
- +5 SET X="and bad patient pointer "_$PIECE(PT,";",1)_" (field #.03)"
- +6 IF 'ZTQUEUED
- WRITE !," ",X
- +7 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- +8 ;I 'TESTING S DA=$P(PT,";",1),DIK="^DPT(" D ^DIK
- +9 QUIT
- End DoDot:1
- QUIT
- +10 ;bad pointer to income person
- +11 IF PT["DGPR"
- IF $$GOODPTR(PT)="N"
- Begin DoDot:1
- +12 SET DGBADPER=DGBADPER+1
- +13 SET X="and bad income person pointer "_$PIECE(PT,";",1)_" (field #.03)"
- +14 IF 'ZTQUEUED
- WRITE !," ",X
- +15 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- +16 IF 'TESTING
- SET DA=$PIECE(PT,";",1)
- SET DIK="^DGPR(408.13,"
- DO ^DIK
- +17 QUIT
- End DoDot:1
- QUIT
- +18 ;null variable pointer
- +19 IF PT=""
- Begin DoDot:1
- +20 SET X="and null pointer (field #.03)"
- +21 IF 'ZTQUEUED
- WRITE !," ",X
- +22 SET DGBAD03=DGBAD03+1
- +23 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- +24 QUIT
- End DoDot:1
- QUIT
- +25 ;bad variable pointer
- +26 IF $$GOODPTR(PT)="N"
- Begin DoDot:1
- +27 SET X="and bad variable pointer "_$PIECE(PT,";",1)_" (field #.03)"
- +28 IF 'ZTQUEUED
- WRITE !," ",X
- +29 SET DGBAD03=DGBAD03+1
- +30 SET ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
- +31 QUIT
- End DoDot:1
- +32 QUIT
- +33 ;
- DEL40812(R12,DGDEL12,DGDEL21,DGDEL22,ZTQUEUED,TESTING,NAMSPC) ;
- +1 ; Kill bad #408.12 file rec and files that point to it
- +2 NEW DA,DIK,R21,R22,X
- +3 SET DA=R12
- SET DIK="^DGPR(408.12,"
- IF 'TESTING
- DO ^DIK
- +4 SET DGDEL12=DGDEL12+1
- +5 IF 'ZTQUEUED
- WRITE !,?2,"Deleting 408.12 ien > ",R12
- +6 ;
- +7 ;kill all 408.21's that point to the bad 408.12
- +8 SET R21=0
- +9 FOR
- SET R21=$ORDER(^DGMT(408.21,"C",R12,R21))
- IF 'R21
- QUIT
- Begin DoDot:1
- +10 IF 'TESTING
- SET DA=R21
- SET DIK="^DGMT(408.21,"
- DO ^DIK
- +11 SET DGDEL21=DGDEL21+1
- +12 SET X="Deleting related ien "_R21_" in file #408.21"
- +13 IF 'ZTQUEUED
- WRITE !,?4,X
- +14 SET ^XTMP(NAMSPC,"BADPR",R12,"REL",R21)=X
- +15 ;
- +16 ;kill all 408.22's that point to the bad 408.21
- +17 SET R22=0
- +18 FOR
- SET R22=$ORDER(^DGMT(408.22,"AIND",R21,R22))
- IF 'R22
- QUIT
- Begin DoDot:2
- +19 IF 'TESTING
- SET DA=R22
- SET DIK="^DGMT(408.22,"
- DO ^DIK
- +20 SET DGDEL22=DGDEL22+1
- +21 SET X="Deleting related ien "_R22_" in file # 408.22"
- +22 IF 'ZTQUEUED
- WRITE !,?6,X
- +23 SET ^XTMP(NAMSPC,"BADPR",R12,"REL",R21,R22)=X
- +24 QUIT
- End DoDot:2
- +25 QUIT
- End DoDot:1
- +26 QUIT
- +27 ;
- CHKSTAT(POST) ;
- +1 NEW Y,DUOUT,DTOUT,QUIT,STAT,STIME,NAMSPC
- +2 SET QUIT=0
- +3 SET NAMSPC=$$NAMSPC
- +4 LOCK +^XTMP(NAMSPC):1
- +5 IF '$TEST
- DO BMES^XPDUTL("*** ALREADY RUNNING ***")
- QUIT 1
- +6 ;
- +7 ; get job status
- +8 SET STAT=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,5)
- +9 SET STIME=$PIECE($GET(^XTMP(NAMSPC,0,0)),U,6)
- +10 ;
- +11 IF POST
- DO KILIT
- QUIT 0
- +12 ;
- +13 ;if job Completed and run from menu opt, ask to Re-Run
- +14 IF STAT="COMPLETED"
- Begin DoDot:1
- +15 WRITE " was Completed on "_$$FMTE^XLFDT(STIME)
- +16 WRITE !," Do you want to Re-Run again?"
- +17 KILL DIR
- +18 SET DIR("?",1)=" Entering Y, will delete the XTMP global where theprevious cleanup"
- +19 SET DIR("?")=" information was stored and begin a new job, or N to cancel request"
- +20 SET DIR(0)="Y"
- DO ^DIR
- +21 IF 'Y
- SET QUIT=1
- QUIT
- +22 WRITE !," ARE YOU SURE?"
- +23 KILL DIR
- +24 SET DIR("?")="Enter Y to begin a new Job or N to cancel request"
- +25 SET DIR(0)="Y"
- DO ^DIR
- +26 IF 'Y
- SET QUIT=1
- QUIT
- +27 ;fall thru to re-run mode, kill ^XTMPs
- +28 DO KILIT
- +29 QUIT
- End DoDot:1
- +30 QUIT QUIT
- +31 ;
- KILIT ; kill Xtmp work file for a re-run
- +1 IF '$DATA(NAMSPC)
- SET NAMSPC=$$NAMSPC^DG53618
- +2 KILL ^XTMP(NAMSPC)
- +3 QUIT
- +4 ;
- STOP ; alternate stop method
- +1 SET ^XTMP($$NAMSPC,0,"STOP")=""
- +2 QUIT
- +3 ;
- SETUPX(EXPDAY) ;Setup XTMP
- +1 NEW BEGTIME,PURGDT,NAMSPC,U
- +2 SET U="^"
- +3 SET NAMSPC=$$NAMSPC^DG53618
- +4 SET BEGTIME=$$NOW^XLFDT()
- +5 SET PURGDT=$$FMADD^XLFDT(BEGTIME,EXPDAY)
- +6 SET ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME
- +7 SET $PIECE(^XTMP(NAMSPC,0),U,3)="Cleanup Bad Pointers In PATIENT RELATION File"
- +8 QUIT
- +9 ;
- NAMSPC() ; Return a consistent name space variable
- +1 QUIT $TEXT(+0)