| [613] | 1 | LRPXCHK ;SLC/STAFF - Lab PXRMINDX Index Validation ;3/30/04  12:01
 | 
|---|
 | 2 |  ;;5.2;LAB SERVICE;**295**;Sep 27, 1994
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 | PATS ; select patients for index check
 | 
|---|
 | 5 |  N DFN,ERR,REPAIR
 | 
|---|
 | 6 |  D CLEAN
 | 
|---|
 | 7 |  F  D GETPT^LRPXAPPU(.DFN,.ERR) Q:ERR  D
 | 
|---|
 | 8 |  . S ^TMP("LRLOG PATS",$J,DFN)=""
 | 
|---|
 | 9 |  D
 | 
|---|
 | 10 |  . I '$O(^TMP("LRLOG PATS",$J,0)) Q
 | 
|---|
 | 11 |  . D GETREP(.REPAIR,.ERR) I ERR Q
 | 
|---|
 | 12 |  . D CHECK(REPAIR)
 | 
|---|
 | 13 |  D CLEAN
 | 
|---|
 | 14 |  Q
 | 
|---|
 | 15 |  ;
 | 
|---|
 | 16 | DATES ; check indexes for a date range of patient collections
 | 
|---|
 | 17 |  N CNT,DATE1,DATE2,DFN,LRDFN,LRIDT,OK,REPAIR,START,STOP,SUB
 | 
|---|
 | 18 |  D CLEAN
 | 
|---|
 | 19 |  D GETDATE^LRPXAPPU(.DATE1,.DATE2,.ERR) I ERR Q
 | 
|---|
 | 20 |  D GETREP(.REPAIR,.ERR) I ERR Q
 | 
|---|
 | 21 |  S STOP=$$LRIDT^LRPXAPIU(DATE1)
 | 
|---|
 | 22 |  S START=$$LRIDT^LRPXAPIU(DATE2)
 | 
|---|
 | 23 |  S CNT=0
 | 
|---|
 | 24 |  S LRDFN=0
 | 
|---|
 | 25 |  F  S LRDFN=$O(^LR(LRDFN)) Q:LRDFN<1  D
 | 
|---|
 | 26 |  . S OK=0
 | 
|---|
 | 27 |  . F SUB="CH","MI","CY","SP","EM" D  Q:OK
 | 
|---|
 | 28 |  .. S LRIDT=START
 | 
|---|
 | 29 |  .. F  S LRIDT=$O(^LR(LRDFN,SUB,LRIDT)) Q:LRIDT<1  Q:LRIDT>STOP  D  Q:OK
 | 
|---|
 | 30 |  ... S DFN=$$DFN^LRPXAPIU(LRDFN)
 | 
|---|
 | 31 |  ... I 'DFN Q
 | 
|---|
 | 32 |  ... S ^TMP("LRLOG PATS",$J,DFN)=""
 | 
|---|
 | 33 |  ... S OK=1,CNT=CNT+1
 | 
|---|
 | 34 |  W !,CNT," Patients to check"
 | 
|---|
 | 35 |  D CHECK(REPAIR)
 | 
|---|
 | 36 |  D CLEAN
 | 
|---|
 | 37 |  Q
 | 
|---|
 | 38 |  ;
 | 
|---|
 | 39 | CHECK(REPAIR) ;
 | 
|---|
 | 40 |  N CNT,DFN
 | 
|---|
 | 41 |  S REPAIR=$G(REPAIR)
 | 
|---|
 | 42 |  S DFN=0
 | 
|---|
 | 43 |  F  S DFN=$O(^TMP("LRLOG PATS",$J,DFN)) Q:DFN<1  D
 | 
|---|
 | 44 |  . W !,"DFN: ",DFN," LRDFN: ",$$LRDFN^LRPXAPIU(DFN)
 | 
|---|
 | 45 |  . D CHKPAT(DFN)
 | 
|---|
 | 46 |  S CNT=0
 | 
|---|
 | 47 |  S DFN=0
 | 
|---|
 | 48 |  F  S DFN=$O(^TMP("LRLOG",$J,DFN)) Q:DFN<1  D
 | 
|---|
 | 49 |  . S CNT=CNT+1
 | 
|---|
 | 50 |  I 'CNT W !,"Indexes were valid" Q
 | 
|---|
 | 51 |  W !,CNT," Patients with invalid indexes"
 | 
|---|
 | 52 |  I REPAIR D REPAIR
 | 
|---|
 | 53 |  Q
 | 
|---|
 | 54 |  ;
 | 
|---|
 | 55 | ALL ; check all patient indexes
 | 
|---|
 | 56 |  ; this takes a very long time
 | 
|---|
 | 57 |  ; to be used in small test accounts
 | 
|---|
 | 58 |  ; START and STOP determine range of DFNs to check
 | 
|---|
 | 59 |  Q  ; for testing
 | 
|---|
 | 60 |  N DFN,ERR,REPAIR,START,STOP
 | 
|---|
 | 61 |  D CLEAN
 | 
|---|
 | 62 |  W !,"WARNING - checking ALL patients",!
 | 
|---|
 | 63 |  D GETREP(.REPAIR,.ERR) I ERR Q
 | 
|---|
 | 64 |  S START=1
 | 
|---|
 | 65 |  S STOP=10000000000000
 | 
|---|
 | 66 |  S DFN=START-.1
 | 
|---|
 | 67 |  F  S DFN=$O(^DPT(DFN)) Q:DFN<1  Q:DFN>STOP  D
 | 
|---|
 | 68 |  . W !,"DFN: ",DFN," LRDFN: ",$$LRDFN^LRPXAPIU(DFN)
 | 
|---|
 | 69 |  . D CHKPAT(DFN)
 | 
|---|
 | 70 |  I REPAIR D REPAIR
 | 
|---|
 | 71 |  D CLEAN
 | 
|---|
 | 72 |  Q
 | 
|---|
 | 73 |  ;
 | 
|---|
 | 74 | CHKPAT(DFN) ; from LRLOG
 | 
|---|
 | 75 |  ; find bad nodes, 
 | 
|---|
 | 76 |  ; store as ^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)=NODE
 | 
|---|
 | 77 |  ; only when ^TMP("LRLOG PATS",$J) is present
 | 
|---|
 | 78 |  ; if ^TMP("LRLOG PATS",$J) is not present, write to screen
 | 
|---|
 | 79 |  N ITEM,LRDFN
 | 
|---|
 | 80 |  K ^TMP("LRPXCHK",$J)
 | 
|---|
 | 81 |  S LRDFN=$$LRDFN^LRPXAPIU(DFN)
 | 
|---|
 | 82 |  I 'LRDFN Q
 | 
|---|
 | 83 |  M ^TMP("LRPXCHK",$J,"LR",LRDFN)=^LR(LRDFN)
 | 
|---|
 | 84 |  M ^TMP("LRPXCHK",$J,"PI",DFN)=^PXRMINDX(63,"PI",DFN)
 | 
|---|
 | 85 |  M ^TMP("LRPXCHK",$J,"PDI",DFN)=^PXRMINDX(63,"PDI",DFN)
 | 
|---|
 | 86 |  S ITEM=""
 | 
|---|
 | 87 |  F  S ITEM=$O(^PXRMINDX(63,"IP",ITEM)) Q:ITEM=""  D
 | 
|---|
 | 88 |  . I $D(^PXRMINDX(63,"IP",ITEM,DFN)) D
 | 
|---|
 | 89 |  . M ^TMP("LRPXCHK",$J,"IP",ITEM,DFN)=^PXRMINDX(63,"IP",ITEM,DFN)
 | 
|---|
 | 90 |  D INTEG(DFN)
 | 
|---|
 | 91 |  D CHKLR(DFN)
 | 
|---|
 | 92 |  D CHKPI(DFN,LRDFN)
 | 
|---|
 | 93 |  K ^TMP("LRPXCHK",$J)
 | 
|---|
 | 94 |  Q
 | 
|---|
 | 95 |  ;
 | 
|---|
 | 96 | INTEG(DFN) ; make sure "PI", "IP", and "PDI" are consistent
 | 
|---|
 | 97 |  N DATE,ITEM,NODE
 | 
|---|
 | 98 |  S DATE=0
 | 
|---|
 | 99 |  F  S DATE=$O(^TMP("LRPXCHK",$J,"PDI",DFN,DATE)) Q:DATE<1  D
 | 
|---|
 | 100 |  . S ITEM="A"
 | 
|---|
 | 101 |  . F  S ITEM=$O(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM)) Q:ITEM=""  D
 | 
|---|
 | 102 |  .. S NODE=""
 | 
|---|
 | 103 |  .. F  S NODE=$O(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM,NODE)) Q:NODE=""  D
 | 
|---|
 | 104 |  ... I '$D(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) D
 | 
|---|
 | 105 |  .... D BAD("PDI-PI",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 106 |  ... I '$D(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE,NODE)) D
 | 
|---|
 | 107 |  .... D BAD("PDI-IP",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 108 |  S ITEM=""
 | 
|---|
 | 109 |  F  S ITEM=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM)) Q:ITEM=""  D
 | 
|---|
 | 110 |  . S DATE=0
 | 
|---|
 | 111 |  . F  S DATE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE)) Q:DATE<1  D
 | 
|---|
 | 112 |  .. S NODE=""
 | 
|---|
 | 113 |  .. F  S NODE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) Q:NODE=""  D
 | 
|---|
 | 114 |  ... I '$D(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE,NODE)) D
 | 
|---|
 | 115 |  .... D BAD("PI-IP",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 116 |  ... I 'ITEM,'$D(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM,NODE)) D
 | 
|---|
 | 117 |  .... D BAD("PI-PDI",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 118 |  S ITEM=""
 | 
|---|
 | 119 |  F  S ITEM=$O(^TMP("LRPXCHK",$J,"IP",ITEM)) Q:ITEM=""  D
 | 
|---|
 | 120 |  . S DATE=0
 | 
|---|
 | 121 |  . F  S DATE=$O(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE)) Q:DATE<1  D
 | 
|---|
 | 122 |  .. S NODE=""
 | 
|---|
 | 123 |  .. F  S NODE=$O(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE,NODE)) Q:NODE=""  D
 | 
|---|
 | 124 |  ... I '$D(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) D
 | 
|---|
 | 125 |  .... D BAD("IP-PI",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 126 |  ... I 'ITEM,'$D(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM,NODE)) D
 | 
|---|
 | 127 |  .... D BAD("IP-PDI",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 128 |  Q
 | 
|---|
 | 129 |  ;
 | 
|---|
 | 130 | CHKLR(DFN) ; go thru "PI" to make sure ^LR is consistent
 | 
|---|
 | 131 |  N DATE,ITEM,NODE
 | 
|---|
 | 132 |  S ITEM=""
 | 
|---|
 | 133 |  F  S ITEM=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM)) Q:ITEM=""  D
 | 
|---|
 | 134 |  . S DATE=0
 | 
|---|
 | 135 |  . F  S DATE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE)) Q:DATE<1  D
 | 
|---|
 | 136 |  .. S NODE=""
 | 
|---|
 | 137 |  .. F  S NODE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) Q:NODE=""  D
 | 
|---|
 | 138 |  ... I '$$REFVAL(NODE) D BAD("LR",DFN,ITEM,DATE,NODE) Q
 | 
|---|
 | 139 |  Q
 | 
|---|
 | 140 |  ;
 | 
|---|
 | 141 | CHKPI(DFN,LRDFN) ; go thru ^LR to make sure "PI" is consistent
 | 
|---|
 | 142 |  N DATE,ITEM,LRIDT,LRDN,NODE,ZERO
 | 
|---|
 | 143 |  S LRIDT=0
 | 
|---|
 | 144 |  F  S LRIDT=$O(^TMP("LRPXCHK",$J,"LR",LRDFN,"CH",LRIDT)) Q:LRIDT<1  D
 | 
|---|
 | 145 |  . S ZERO=$G(^TMP("LRPXCHK",$J,"LR",LRDFN,"CH",LRIDT,0))
 | 
|---|
 | 146 |  . S DATE=+ZERO I 'DATE Q
 | 
|---|
 | 147 |  . I '$P(ZERO,U,3) Q
 | 
|---|
 | 148 |  . S LRDN=1
 | 
|---|
 | 149 |  . F  S LRDN=$O(^TMP("LRPXCHK",$J,"LR",LRDFN,"CH",LRIDT,LRDN)) Q:LRDN<1  D
 | 
|---|
 | 150 |  .. S ITEM=$$TEST^LRPXAPIU(LRDN)
 | 
|---|
 | 151 |  .. I 'ITEM Q
 | 
|---|
 | 152 |  .. S NODE=LRDFN_";CH;"_LRIDT_";"_LRDN
 | 
|---|
 | 153 |  .. I '$D(^PXRMINDX(63,"PI",DFN,ITEM,DATE,NODE)) D BAD("CH",DFN,ITEM,DATE,NODE)
 | 
|---|
 | 154 |  D MI^LRPXCHKM(DFN,LRDFN)
 | 
|---|
 | 155 |  D AP^LRPXCHKA(DFN,LRDFN)
 | 
|---|
 | 156 |  Q
 | 
|---|
 | 157 |  ;
 | 
|---|
 | 158 | TMPCHK(DFN,DATE,ITEM,NODE) ;
 | 
|---|
 | 159 |  I '$D(^PXRMINDX(63,"PI",DFN,ITEM,DATE,NODE)) D BAD(NODE,DFN,ITEM,DATE,NODE)
 | 
|---|
 | 160 |  Q
 | 
|---|
 | 161 |  ;
 | 
|---|
 | 162 | BAD(INDEX,DFN,ITEM,DATE,NODE) ; write error to screen, collect in global
 | 
|---|
 | 163 |  W !,?5,INDEX," ",DFN," ",ITEM," ",DATE," ",NODE
 | 
|---|
 | 164 |  S ^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)=NODE
 | 
|---|
 | 165 |  Q
 | 
|---|
 | 166 |  ;
 | 
|---|
 | 167 | CLEAN ; clear tmp globals
 | 
|---|
 | 168 |  ; "LRLOG" collects invalid nodes, "LRLOG PATS" are patients checked
 | 
|---|
 | 169 |  K ^TMP("LRLOG",$J)
 | 
|---|
 | 170 |  K ^TMP("LRLOG PATS",$J)
 | 
|---|
 | 171 |  Q
 | 
|---|
 | 172 |  ;
 | 
|---|
 | 173 | REFVAL(REF) ; $$(reference location in ^LR) -> if ref exists 1, else 0
 | 
|---|
 | 174 |  N SUB
 | 
|---|
 | 175 |  I REF'[";" Q ""
 | 
|---|
 | 176 |  S SUB=$P(REF,";",2)
 | 
|---|
 | 177 |  S SUB=""""_SUB_""""
 | 
|---|
 | 178 |  S $P(REF,";",2)=SUB
 | 
|---|
 | 179 |  S REF=$TR(REF,";",",")
 | 
|---|
 | 180 |  S REF="^LR("_REF_")"
 | 
|---|
 | 181 |  I $D(@REF) Q 1
 | 
|---|
 | 182 |  Q 0
 | 
|---|
 | 183 |  ;
 | 
|---|
 | 184 | REPAIR ; correct invalid indexes
 | 
|---|
 | 185 |  ; kill off bad indexes
 | 
|---|
 | 186 |  ; reset all indexes at date of bad index
 | 
|---|
 | 187 |  N DATE,DFN,DOD,INDEX,ITEM,NODE,REPAIR K REPAIR
 | 
|---|
 | 188 |  S DFN=0
 | 
|---|
 | 189 |  F  S DFN=$O(^TMP("LRLOG",$J,DFN)) Q:DFN<1  D
 | 
|---|
 | 190 |  . S LRDFN=$$LRDFN^LRPXAPIU(DFN)
 | 
|---|
 | 191 |  . S DOD=$$DOD^LRPXAPIU(DFN)
 | 
|---|
 | 192 |  . S DATE=0
 | 
|---|
 | 193 |  . F  S DATE=$O(^TMP("LRLOG",$J,DFN,DATE)) Q:DATE<1  D
 | 
|---|
 | 194 |  .. S LRIDT=$$LRIDT^LRPXAPIU(DATE)
 | 
|---|
 | 195 |  .. K REPAIR
 | 
|---|
 | 196 |  .. S ITEM=""
 | 
|---|
 | 197 |  .. F  S ITEM=$O(^TMP("LRLOG",$J,DFN,DATE,ITEM)) Q:ITEM=""  D
 | 
|---|
 | 198 |  ... S INDEX=""
 | 
|---|
 | 199 |  ... F  S INDEX=$O(^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)) Q:INDEX=""  D
 | 
|---|
 | 200 |  .... S NODE=^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)
 | 
|---|
 | 201 |  .... I '$L(NODE) Q
 | 
|---|
 | 202 |  .... S REPAIR($P(NODE,";",2))=""
 | 
|---|
 | 203 |  .... D KLAB^LRPX(DFN,DATE,ITEM,NODE)
 | 
|---|
 | 204 |  .. S SUB=""
 | 
|---|
 | 205 |  .. F  S SUB=$O(REPAIR(SUB)) Q:SUB=""  D
 | 
|---|
 | 206 |  ... I SUB="CH" D CH(DFN,LRDFN,DATE,LRIDT) Q
 | 
|---|
 | 207 |  ... I SUB="MI" D MICRO(DFN,LRDFN,DATE,LRIDT) Q
 | 
|---|
 | 208 |  ... D AP(DFN,LRDFN,DATE,LRIDT,SUB)
 | 
|---|
 | 209 |  .. I DATE=DOD D AU(DFN,LRDFN,DATE) Q
 | 
|---|
 | 210 |  Q
 | 
|---|
 | 211 |  ;
 | 
|---|
 | 212 | CH(DFN,LRDFN,DATE,LRIDT) ;
 | 
|---|
 | 213 |  N DAT,LRDN,NODE,TEMP,TEST
 | 
|---|
 | 214 |  I '$$VERIFIED^LRPXAPI(LRDFN,LRIDT) Q
 | 
|---|
 | 215 |  S DAT=LRDFN_";CH;"_LRIDT
 | 
|---|
 | 216 |  S LRDN=1
 | 
|---|
 | 217 |  F  S LRDN=$O(^LR(LRDFN,"CH",LRIDT,LRDN)) Q:LRDN<1  D
 | 
|---|
 | 218 |  . S NODE=DAT_";"_LRDN
 | 
|---|
 | 219 |  . S TEMP=^LR(LRDFN,"CH",LRIDT,LRDN)
 | 
|---|
 | 220 |  . S TEST=+$P($P(TEMP,U,3),"!",6)
 | 
|---|
 | 221 |  . I 'TEST S TEST=$$TEST^LRPXAPIU(LRDN)
 | 
|---|
 | 222 |  . I 'TEST Q
 | 
|---|
 | 223 |  . D SLAB^LRPX(DFN,DATE,TEST,NODE)
 | 
|---|
 | 224 |  Q
 | 
|---|
 | 225 |  ;
 | 
|---|
 | 226 | MICRO(DFN,LRDFN,DATE,LRIDT) ;
 | 
|---|
 | 227 |  K ^TMP("LRPX",$J)
 | 
|---|
 | 228 |  M ^TMP("LRPX",$J,"AR")=^LR(LRDFN,"MI",LRIDT)
 | 
|---|
 | 229 |  M ^TMP("LRPX",$J,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
 | 
|---|
 | 230 |  D MICRO^LRPXRM(DFN,LRDFN,DATE,LRIDT)
 | 
|---|
 | 231 |  K ^TMP("LRPX",$J)
 | 
|---|
 | 232 |  Q
 | 
|---|
 | 233 |  ;
 | 
|---|
 | 234 | AP(DFN,LRDFN,DATE,LRIDT,SUB) ;
 | 
|---|
 | 235 |  K ^TMP("LRPX",$J)
 | 
|---|
 | 236 |  M ^TMP("LRPX",$J,"AR")=^LR(LRDFN,SUB,LRIDT)
 | 
|---|
 | 237 |  M ^TMP("LRPX",$J,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
 | 
|---|
 | 238 |  D AP^LRPXRM(DFN,LRDFN,DATE,LRIDT,SUB)
 | 
|---|
 | 239 |  K ^TMP("LRPX",$J)
 | 
|---|
 | 240 |  Q
 | 
|---|
 | 241 |  ;
 | 
|---|
 | 242 | AU(DFN,LRDFN,DATE) ;
 | 
|---|
 | 243 |  I '+$G(^LR(LRDFN,"AU")) Q
 | 
|---|
 | 244 |  I '($P(^LR(LRDFN,"AU"),U,3)&($P(^("AU"),U,15))) Q
 | 
|---|
 | 245 |  K ^TMP("LRPX",$J)
 | 
|---|
 | 246 |  M ^TMP("LRPX",$J,"AR","AY")=^LR(LRDFN,"AY")
 | 
|---|
 | 247 |  M ^TMP("LRPX",$J,"AR",80)=^LR(LRDFN,80)
 | 
|---|
 | 248 |  M ^TMP("LRPX",$J,"AR",33)=^LR(LRDFN,33)
 | 
|---|
 | 249 |  M ^TMP("LRPX",$J,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
 | 
|---|
 | 250 |  D AUTOPSY^LRPXRM(LRDFN)
 | 
|---|
 | 251 |  K ^TMP("LRPX",$J)
 | 
|---|
 | 252 |  Q
 | 
|---|
 | 253 |  ;
 | 
|---|
 | 254 | GETREP(REPAIR,ERR) ;
 | 
|---|
 | 255 |  ; asks to repair indexes
 | 
|---|
 | 256 |  N DIR,DIRUT,DTOUT,X,Y K DIR
 | 
|---|
 | 257 |  S ERR=0,REPAIR=""
 | 
|---|
 | 258 |  S DIR(0)="YAO"
 | 
|---|
 | 259 |  S DIR("A")="Repair invalid indexes? "
 | 
|---|
 | 260 |  S DIR("B")="YES"
 | 
|---|
 | 261 |  D ^DIR K DIR
 | 
|---|
 | 262 |  I Y[U!$D(DTOUT) S ERR=1 Q
 | 
|---|
 | 263 |  S REPAIR=Y
 | 
|---|
 | 264 |  W !
 | 
|---|
 | 265 |  Q
 | 
|---|
 | 266 |  ;
 | 
|---|