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 | ;
|
---|