[613] | 1 | DG53618 ;ALB/GN/PHH,EG - DG*5.3*618 CLEANUP DANGLING RECS; 04/27/2005
|
---|
| 2 | ;;5.3;Registration;**618**;Aug 13, 1993
|
---|
| 3 | ;
|
---|
| 4 | ; Cleans up dangling file Income Relation file #408.12 records where
|
---|
| 5 | ; it points to bad or non-existent Income Person file #408.13 and
|
---|
| 6 | ; Patient file #2 records.
|
---|
| 7 | ;
|
---|
| 8 | ; 1. If it points to file 2, that doesn't exist or has a bad 0 node,
|
---|
| 9 | ; delete the 408.12 rec that points to the bad 2 rec, then
|
---|
| 10 | ; delete the 408.21 that points to 408.12 rec, then
|
---|
| 11 | ; delete the 408.22 rec that points to the 408.21.
|
---|
| 12 | ; 2. Same logic will be used if points to bad 408.13 recs
|
---|
| 13 | ;
|
---|
| 14 | Q
|
---|
| 15 | ;
|
---|
| 16 | POST ;post install entry tag call. processes entire file in live mode
|
---|
| 17 | N ZTDTH,ZTDESC,ZTIO,ZTRTN,ZTSK,ZTQUEUED,ZTSAVE,CHKPNT
|
---|
| 18 | D MES^XPDUTL("")
|
---|
| 19 | D MES^XPDUTL("=====================================================")
|
---|
| 20 | D MES^XPDUTL("Queuing Bad Patient Relation Pointers cleanup process.....")
|
---|
| 21 | I $$CHKSTAT(1) D Q
|
---|
| 22 | . D BMES^XPDUTL("ABORTING Post Install Cleanup Queuing")
|
---|
| 23 | . D MES^XPDUTL("=====================================================")
|
---|
| 24 | . Q
|
---|
| 25 | S ZTRTN="QUE^DG53618"
|
---|
| 26 | S ZTDESC="Cleanup Bad Pointers In Patient Relation File"
|
---|
| 27 | S ZTIO="",ZTDTH=$H
|
---|
| 28 | S CHKPNT=0,ZTSAVE("CHKPNT")=""
|
---|
| 29 | D ^%ZTLOAD
|
---|
| 30 | D MES^XPDUTL("This request queued as Task # "_ZTSK)
|
---|
| 31 | D MES^XPDUTL("=====================================================")
|
---|
| 32 | D MES^XPDUTL("")
|
---|
| 33 | Q
|
---|
| 34 | ;
|
---|
| 35 | TEST ; Entry point for taskman (testing mode)
|
---|
| 36 | N TESTING,ZTQUEUED
|
---|
| 37 | S TESTING=1,ZTQUEUED=0
|
---|
| 38 | ;if running again, check to see if complete
|
---|
| 39 | ;if so, ask user to rerun
|
---|
| 40 | I $$CHKSTAT(0) D Q
|
---|
| 41 | . U 0 W !,"Task is already running or user opted to not restart"
|
---|
| 42 | . Q
|
---|
| 43 | D QUE
|
---|
| 44 | Q
|
---|
| 45 | QUE ; Entry point for taskman (live mode)
|
---|
| 46 | N NAMSPC S NAMSPC=$$NAMSPC^DG53618
|
---|
| 47 | N QQ,ZTSTOP,XREC,MTIEN,DIK,DA,DGTOT,DGDEL12,BEGTIME,PURGDT,DGDEL21
|
---|
| 48 | N TMP,ICDT,COUNT,TYPE,TYPNAM,DGDEL22,REC12,REC21,REC22
|
---|
| 49 | N DGBAD03,DGBADPAT,DGBADPER
|
---|
| 50 | N R12,PT,DFN,X,U
|
---|
| 51 | S U="^"
|
---|
| 52 | I '$D(TESTING) N TESTING S TESTING=0
|
---|
| 53 | I '$D(ZTQUEUED) N ZTQUEUED S ZTQUEUED=1
|
---|
| 54 | ;
|
---|
| 55 | ;get last run info if exists
|
---|
| 56 | S XREC=$G(^XTMP(NAMSPC,0,0))
|
---|
| 57 | S R12=+$P(XREC,U,1) ;last REC processed
|
---|
| 58 | S DGTOT=+$P(XREC,U,2) ;total records processed
|
---|
| 59 | S DGDEL12=+$P(XREC,U,3) ;total bad 408.12 records purged
|
---|
| 60 | S DGDEL21=+$P(XREC,U,7) ;total bad 408.21 records found
|
---|
| 61 | S DGDEL22=+$P(XREC,U,8) ;total bad 408.22 records found
|
---|
| 62 | S DGBADPAT=+$P(XREC,U,9) ;total bad pointer to file #2
|
---|
| 63 | S DGBADPER=+$P(XREC,U,10) ;total bad pointer to file #408.13
|
---|
| 64 | S DGBAD03=+$P(XREC,U,11) ;null or bad field # 03
|
---|
| 65 | ;
|
---|
| 66 | ;setup XTMP according to stds.
|
---|
| 67 | D SETUPX(90)
|
---|
| 68 | ;
|
---|
| 69 | ;init status field and start date & time if null
|
---|
| 70 | S $P(^XTMP(NAMSPC,0,0),U,5,6)="RUNNING^"
|
---|
| 71 | S:$P(^XTMP(NAMSPC,0,0),U,4)="" $P(^XTMP(NAMSPC,0,0),U,4)=$$NOW^XLFDT
|
---|
| 72 | ;
|
---|
| 73 | ;drive through 408.12 looking for bad variable pointers
|
---|
| 74 | S ZTSTOP=0
|
---|
| 75 | F QQ=1:1 S R12=$O(^DGPR(408.12,R12)) Q:(R12'>0)!ZTSTOP D
|
---|
| 76 | . ;check for stop request after every 20 processed DFN recs
|
---|
| 77 | . I QQ#20=0 D
|
---|
| 78 | . . S:$$S^%ZTLOAD ZTSTOP=1
|
---|
| 79 | . . I $D(^XTMP(NAMSPC,0,"STOP")) S ZTSTOP=1 K ^XTMP(NAMSPC,0,"STOP")
|
---|
| 80 | . . Q
|
---|
| 81 | . I ZTSTOP Q
|
---|
| 82 | . S DGTOT=DGTOT+1
|
---|
| 83 | . S $P(^XTMP(NAMSPC,0,0),U,1,2)=R12_U_DGTOT
|
---|
| 84 | . ;
|
---|
| 85 | . S DFN=$$GET1^DIQ(408.12,R12_",",.01,"I")
|
---|
| 86 | . S PT=$$GET1^DIQ(408.12,R12_",",.03,"I")
|
---|
| 87 | . ;
|
---|
| 88 | . ;good patient (#.01),good variable pointer (#.03)...quit
|
---|
| 89 | . I $$GOODPAT(DFN)="Y",$$GOODPTR(PT)="Y" Q
|
---|
| 90 | . ;
|
---|
| 91 | . ; cleanup Income Relation file #408.12 & the bad pointed to file
|
---|
| 92 | . ; either Patient file #2 or Income Person file #408.13
|
---|
| 93 | . I 'ZTQUEUED W !!,"File #408.12, ien ",R12," has a bad pointer to "
|
---|
| 94 | . ;if patient (#.01) is null
|
---|
| 95 | . I DFN="" D
|
---|
| 96 | . . S X="null patient (field #.01)"
|
---|
| 97 | . . I 'ZTQUEUED W X
|
---|
| 98 | . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
|
---|
| 99 | . . S DGBADPAT=DGBADPAT+1
|
---|
| 100 | . . D ACHK03(R12,PT,ZTQUEUED,TESTING,.DGBADPAT,.DGBADPER,.DGBAD03)
|
---|
| 101 | . . Q
|
---|
| 102 | . ;patient #.01 not found
|
---|
| 103 | . I DFN'="",$$GOODPAT(DFN)="N" D
|
---|
| 104 | . . S X="patient "_DFN_" (field #.01)"
|
---|
| 105 | . . I 'ZTQUEUED W X
|
---|
| 106 | . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
|
---|
| 107 | . . S DGBADPAT=DGBADPAT+1
|
---|
| 108 | . . ;I 'TESTING S DA=DFN,DIK="^DPT(" D ^DIK
|
---|
| 109 | . . D ACHK03(R12,PT,ZTQUEUED,TESTING,.DGBADPAT,.DGBADPER,.DGBAD03)
|
---|
| 110 | . . Q
|
---|
| 111 | . ;patient (#.03) is also a patient, is bad, but patient (# .01) is ok
|
---|
| 112 | . I $$GOODPAT(DFN)="Y",PT["DPT",$$GOODPTR(PT)="N" D
|
---|
| 113 | . . S X="patient "_$P(PT,";",1)_" (field #.03)"
|
---|
| 114 | . . I 'ZTQUEUED W X
|
---|
| 115 | . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
|
---|
| 116 | . . S DGBADPAT=DGBADPAT+1
|
---|
| 117 | . . ;I 'TESTING S DA=$P(PT,";",1),DIK="^DPT(" D ^DIK
|
---|
| 118 | . . Q
|
---|
| 119 | . ;patient (#.01) is good, but income person is bad
|
---|
| 120 | . I $$GOODPAT(DFN)="Y",PT["DGPR",$$GOODPTR(PT)="N" D
|
---|
| 121 | . . S X="income person "_$P(PT,";",1)_" (field #.03)"
|
---|
| 122 | . . I 'ZTQUEUED W X
|
---|
| 123 | . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
|
---|
| 124 | . . S DGBADPER=DGBADPER+1
|
---|
| 125 | . . I 'TESTING S DA=$P(PT,";",1),DIK="^DGPR(408.13," D ^DIK
|
---|
| 126 | . . Q
|
---|
| 127 | . ;patient #.01 is good, but #.03 is null
|
---|
| 128 | . I $$GOODPAT(DFN)="Y",PT="" D
|
---|
| 129 | . . S X="null field #.03"
|
---|
| 130 | . . I 'ZTQUEUED W X
|
---|
| 131 | . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
|
---|
| 132 | . . S DGBAD03=DGBAD03+1
|
---|
| 133 | . . Q
|
---|
| 134 | . ;patient #.01 is good, but #.03 is not null
|
---|
| 135 | . ;and is bad
|
---|
| 136 | . I $$GOODPAT(DFN)="Y",PT'["DGPR",PT'["DPT",PT'="",$$GOODPTR(PT)="N" D
|
---|
| 137 | . . S X="variable pointer "_$P(PT,";",1)_" (field #.03)"
|
---|
| 138 | . . I 'ZTQUEUED W X
|
---|
| 139 | . . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",1)=X
|
---|
| 140 | . . S DGBAD03=DGBAD03+1
|
---|
| 141 | . . Q
|
---|
| 142 | . D DEL40812(R12,.DGDEL12,.DGDEL21,.DGDEL22,ZTQUEUED,TESTING,NAMSPC)
|
---|
| 143 | . Q
|
---|
| 144 | ;
|
---|
| 145 | ;update last processed info
|
---|
| 146 | S X=$G(^XTMP(NAMSPC,0,0))
|
---|
| 147 | S $P(X,U,3)=DGDEL12,$P(X,U,7)=DGDEL21
|
---|
| 148 | S $P(X,U,8)=DGDEL22,$P(X,U,9)=DGBADPAT
|
---|
| 149 | S $P(X,U,10)=DGBADPER,$P(X,U,11)=DGBAD03
|
---|
| 150 | S ^XTMP(NAMSPC,0,0)=X
|
---|
| 151 | ;set status and mail stats
|
---|
| 152 | I ZTSTOP S $P(^XTMP(NAMSPC,0,0),U,5,6)="STOPPED"_U_$$NOW^XLFDT
|
---|
| 153 | E S $P(^XTMP(NAMSPC,0,0),U,5,6)="COMPLETED"_U_$$NOW^XLFDT
|
---|
| 154 | S X=$$MAIL^DG53618M(TESTING)
|
---|
| 155 | K TESTING
|
---|
| 156 | L -^XTMP($$NAMSPC)
|
---|
| 157 | Q
|
---|
| 158 | ;
|
---|
| 159 | GOODPAT(DFN) ;determine if patient is there
|
---|
| 160 | N X,U
|
---|
| 161 | S U="^"
|
---|
| 162 | I DFN="" Q "N"
|
---|
| 163 | I '$D(^DPT(DFN,0)) Q "N"
|
---|
| 164 | S X=$G(^DPT(DFN,0)) I X="" Q "N"
|
---|
| 165 | I X?13"^".E Q "N"
|
---|
| 166 | Q "Y"
|
---|
| 167 | ;
|
---|
| 168 | GOODPTR(PT) ;determine if reference is there
|
---|
| 169 | N X,U,SUB,GL,REF
|
---|
| 170 | S U="^"
|
---|
| 171 | I PT'["DPT",PT'["DGPR" Q "N"
|
---|
| 172 | S SUB=$P(PT,";",1),GL=$P(PT,";",2)
|
---|
| 173 | I SUB="" Q "N"
|
---|
| 174 | I SUB'=+SUB S SUB=$C(34)_SUB_$C(34)
|
---|
| 175 | I GL'="DPT(",GL'="DGPR(408.13," Q "N"
|
---|
| 176 | S REF="^"_GL_SUB_",0)"
|
---|
| 177 | S X=$G(@REF)
|
---|
| 178 | I '$D(@REF) Q "N"
|
---|
| 179 | I $G(GL)["DPT",X?13"^".E Q "N"
|
---|
| 180 | I $G(GL)["DGPR",$P(X,U,1)="" Q "N"
|
---|
| 181 | Q "Y"
|
---|
| 182 | ;
|
---|
| 183 | ;at this point, you have a bad .01 field, but want
|
---|
| 184 | ;to check .03 also
|
---|
| 185 | ACHK03(R12,PT,ZTQUEUED,TESTING,DGBADPAT,DGBADPER,DGBAD03) ;
|
---|
| 186 | ;update counters to include bad variable pointers
|
---|
| 187 | ;bad pointer to patient
|
---|
| 188 | I PT["DPT",$$GOODPTR(PT)="N" D Q
|
---|
| 189 | . S DGBADPAT=DGBADPAT+1
|
---|
| 190 | . S X="and bad patient pointer "_$P(PT,";",1)_" (field #.03)"
|
---|
| 191 | . I 'ZTQUEUED W !," ",X
|
---|
| 192 | . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
|
---|
| 193 | . ;I 'TESTING S DA=$P(PT,";",1),DIK="^DPT(" D ^DIK
|
---|
| 194 | . Q
|
---|
| 195 | ;bad pointer to income person
|
---|
| 196 | I PT["DGPR",$$GOODPTR(PT)="N" D Q
|
---|
| 197 | . S DGBADPER=DGBADPER+1
|
---|
| 198 | . S X="and bad income person pointer "_$P(PT,";",1)_" (field #.03)"
|
---|
| 199 | . I 'ZTQUEUED W !," ",X
|
---|
| 200 | . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
|
---|
| 201 | . I 'TESTING S DA=$P(PT,";",1),DIK="^DGPR(408.13," D ^DIK
|
---|
| 202 | . Q
|
---|
| 203 | ;null variable pointer
|
---|
| 204 | I PT="" D Q
|
---|
| 205 | . S X="and null pointer (field #.03)"
|
---|
| 206 | . I 'ZTQUEUED W !," ",X
|
---|
| 207 | . S DGBAD03=DGBAD03+1
|
---|
| 208 | . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
|
---|
| 209 | . Q
|
---|
| 210 | ;bad variable pointer
|
---|
| 211 | I $$GOODPTR(PT)="N" D
|
---|
| 212 | . S X="and bad variable pointer "_$P(PT,";",1)_" (field #.03)"
|
---|
| 213 | . I 'ZTQUEUED W !," ",X
|
---|
| 214 | . S DGBAD03=DGBAD03+1
|
---|
| 215 | . S ^XTMP(NAMSPC,"BADPR",R12,"ERR",2)=X
|
---|
| 216 | . Q
|
---|
| 217 | Q
|
---|
| 218 | ;
|
---|
| 219 | DEL40812(R12,DGDEL12,DGDEL21,DGDEL22,ZTQUEUED,TESTING,NAMSPC) ;
|
---|
| 220 | ; Kill bad #408.12 file rec and files that point to it
|
---|
| 221 | N DA,DIK,R21,R22,X
|
---|
| 222 | S DA=R12,DIK="^DGPR(408.12," D ^DIK:'TESTING
|
---|
| 223 | S DGDEL12=DGDEL12+1
|
---|
| 224 | I 'ZTQUEUED W !,?2,"Deleting 408.12 ien > ",R12
|
---|
| 225 | ;
|
---|
| 226 | ;kill all 408.21's that point to the bad 408.12
|
---|
| 227 | S R21=0
|
---|
| 228 | F S R21=$O(^DGMT(408.21,"C",R12,R21)) Q:'R21 D
|
---|
| 229 | . I 'TESTING S DA=R21,DIK="^DGMT(408.21," D ^DIK
|
---|
| 230 | . S DGDEL21=DGDEL21+1
|
---|
| 231 | . S X="Deleting related ien "_R21_" in file #408.21"
|
---|
| 232 | . I 'ZTQUEUED W !,?4,X
|
---|
| 233 | . S ^XTMP(NAMSPC,"BADPR",R12,"REL",R21)=X
|
---|
| 234 | . ;
|
---|
| 235 | . ;kill all 408.22's that point to the bad 408.21
|
---|
| 236 | . S R22=0
|
---|
| 237 | . F S R22=$O(^DGMT(408.22,"AIND",R21,R22)) Q:'R22 D
|
---|
| 238 | . . I 'TESTING S DA=R22,DIK="^DGMT(408.22," D ^DIK
|
---|
| 239 | . . S DGDEL22=DGDEL22+1
|
---|
| 240 | . . S X="Deleting related ien "_R22_" in file # 408.22"
|
---|
| 241 | . . I 'ZTQUEUED W !,?6,X
|
---|
| 242 | . . S ^XTMP(NAMSPC,"BADPR",R12,"REL",R21,R22)=X
|
---|
| 243 | . . Q
|
---|
| 244 | . Q
|
---|
| 245 | Q
|
---|
| 246 | ;
|
---|
| 247 | CHKSTAT(POST) ;
|
---|
| 248 | N Y,DUOUT,DTOUT,QUIT,STAT,STIME,NAMSPC
|
---|
| 249 | S QUIT=0
|
---|
| 250 | S NAMSPC=$$NAMSPC
|
---|
| 251 | L +^XTMP(NAMSPC):1
|
---|
| 252 | I '$T D BMES^XPDUTL("*** ALREADY RUNNING ***") Q 1
|
---|
| 253 | ;
|
---|
| 254 | ; get job status
|
---|
| 255 | S STAT=$P($G(^XTMP(NAMSPC,0,0)),U,5)
|
---|
| 256 | S STIME=$P($G(^XTMP(NAMSPC,0,0)),U,6)
|
---|
| 257 | ;
|
---|
| 258 | I POST D KILIT Q 0
|
---|
| 259 | ;
|
---|
| 260 | ;if job Completed and run from menu opt, ask to Re-Run
|
---|
| 261 | I STAT="COMPLETED" D
|
---|
| 262 | . W " was Completed on "_$$FMTE^XLFDT(STIME)
|
---|
| 263 | . W !," Do you want to Re-Run again?"
|
---|
| 264 | . K DIR
|
---|
| 265 | . S DIR("?",1)=" Entering Y, will delete the XTMP global where theprevious cleanup"
|
---|
| 266 | . S DIR("?")=" information was stored and begin a new job, or N to cancel request"
|
---|
| 267 | . S DIR(0)="Y" D ^DIR
|
---|
| 268 | . I 'Y S QUIT=1 Q
|
---|
| 269 | . W !," ARE YOU SURE?"
|
---|
| 270 | . K DIR
|
---|
| 271 | . S DIR("?")="Enter Y to begin a new Job or N to cancel request"
|
---|
| 272 | . S DIR(0)="Y" D ^DIR
|
---|
| 273 | . I 'Y S QUIT=1 Q
|
---|
| 274 | . ;fall thru to re-run mode, kill ^XTMPs
|
---|
| 275 | . D KILIT
|
---|
| 276 | . Q
|
---|
| 277 | Q QUIT
|
---|
| 278 | ;
|
---|
| 279 | KILIT ; kill Xtmp work file for a re-run
|
---|
| 280 | S:'$D(NAMSPC) NAMSPC=$$NAMSPC^DG53618
|
---|
| 281 | K ^XTMP(NAMSPC)
|
---|
| 282 | Q
|
---|
| 283 | ;
|
---|
| 284 | STOP ; alternate stop method
|
---|
| 285 | S ^XTMP($$NAMSPC,0,"STOP")=""
|
---|
| 286 | Q
|
---|
| 287 | ;
|
---|
| 288 | SETUPX(EXPDAY) ;Setup XTMP
|
---|
| 289 | N BEGTIME,PURGDT,NAMSPC,U
|
---|
| 290 | S U="^"
|
---|
| 291 | S NAMSPC=$$NAMSPC^DG53618
|
---|
| 292 | S BEGTIME=$$NOW^XLFDT()
|
---|
| 293 | S PURGDT=$$FMADD^XLFDT(BEGTIME,EXPDAY)
|
---|
| 294 | S ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME
|
---|
| 295 | S $P(^XTMP(NAMSPC,0),U,3)="Cleanup Bad Pointers In PATIENT RELATION File"
|
---|
| 296 | Q
|
---|
| 297 | ;
|
---|
| 298 | NAMSPC() ; Return a consistent name space variable
|
---|
| 299 | Q $T(+0)
|
---|