| 1 | LRPXAPI4 ;SLC/STAFF Lab Extract API code - Exact Match ;9/29/03  21:17 | 
|---|
| 2 | ;;5.2;LAB SERVICE;**295**;Sep 27, 1994 | 
|---|
| 3 | ; | 
|---|
| 4 | EXACT(DFN,DATE,CONDS) ; from LRPXAPI5 | 
|---|
| 5 | ; check if conditions are met for date/time | 
|---|
| 6 | N FETCH,ITEM,NODE,OK,RESULTS,SEPARATE,XDATE K FETCH,RESULTS,SEPARATE | 
|---|
| 7 | S OK=1 | 
|---|
| 8 | I '$L($O(CONDS(""))) Q 1 | 
|---|
| 9 | M FETCH=^PXRMINDX(63,"PDI",DFN,DATE) | 
|---|
| 10 | S ITEM="" | 
|---|
| 11 | F  S ITEM=$O(FETCH(ITEM)) Q:ITEM=""  D | 
|---|
| 12 | . S NODE="" | 
|---|
| 13 | . F  S NODE=$O(FETCH(ITEM,NODE)) Q:NODE=""  D | 
|---|
| 14 | .. S SEPARATE($P(NODE,";",1,3),ITEM,NODE)="" | 
|---|
| 15 | S XDATE="" | 
|---|
| 16 | F  S XDATE=$O(SEPARATE(XDATE)) Q:XDATE=""  D  Q:OK | 
|---|
| 17 | . K RESULTS | 
|---|
| 18 | . M RESULTS=SEPARATE(XDATE) | 
|---|
| 19 | . I '$L($O(RESULTS(""))) S OK=0 Q | 
|---|
| 20 | . I $D(CONDS("MIR")) D MIR(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 21 | . I $D(CONDS("AS")) D AS(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 22 | . I $D(CONDS("MC")) D MC(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 23 | . I $D(CONDS("AC")) D AC(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 24 | . I $D(CONDS(1)) D EQUAL(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 25 | . I $D(CONDS(0)) D NOTEQUAL(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 26 | . I '$L($O(RESULTS(""))) S OK=0 Q 0 | 
|---|
| 27 | . D SCRAPS(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 28 | . D THREAD(.CONDS,.RESULTS,.OK) I 'OK Q | 
|---|
| 29 | Q OK | 
|---|
| 30 | ; | 
|---|
| 31 | THREAD(CONDS,RESULTS,OK) ; | 
|---|
| 32 | ; uses TCHK within this scope | 
|---|
| 33 | N CHK,FILE,IEN,ITEM,ITEMC,NEXT,NODE,NODEC,NUM,PAR,PARSTOP,START,STOP | 
|---|
| 34 | S OK=1 | 
|---|
| 35 | ; check Micro - only O <-> A match | 
|---|
| 36 | I $D(CONDS("X","M;O")),($D(CONDS("X","M;A"))!$D(CONDS("X","M;M"))) D  Q:'OK | 
|---|
| 37 | . I '($D(CONDS("X","M;A"))!$D(CONDS("X","M;M"))!$D(CONDS("X","M;MIR"))) Q | 
|---|
| 38 | . S ITEM="M;O;" | 
|---|
| 39 | . F  S ITEM=$O(RESULTS(ITEM)) Q:ITEM=""  Q:ITEM]"M;O;Z"  D  Q:'OK | 
|---|
| 40 | .. S NODE="" | 
|---|
| 41 | .. F  S NODE=$O(RESULTS(ITEM,NODE)) Q:NODE=""  D  Q:'OK | 
|---|
| 42 | ... S IEN=$P(NODE,";",5) | 
|---|
| 43 | ... S OK=0 | 
|---|
| 44 | ... S ITEMC="M;A;" | 
|---|
| 45 | ... F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]"M;A;Z"  D  Q:OK | 
|---|
| 46 | .... S NODEC="" | 
|---|
| 47 | .... F  S NODEC=$O(RESULTS(ITEMC,NODEC)) Q:NODEC=""  D  Q:OK | 
|---|
| 48 | ..... I IEN=$P(NODEC,";",5) S OK=1 Q | 
|---|
| 49 | ... S ITEMC="M;M;" | 
|---|
| 50 | ... F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]"M;M;Z"  D  Q:OK | 
|---|
| 51 | .... S NODEC="" | 
|---|
| 52 | .... F  S NODEC=$O(RESULTS(ITEMC,NODEC)) Q:NODEC=""  D  Q:OK | 
|---|
| 53 | ..... I IEN=$P(NODEC,";",5) S OK=1 Q | 
|---|
| 54 | I $D(CONDS("X","M")) Q | 
|---|
| 55 | ; check AP - M <-> E , S <-> T and O <-> [D M F P] match | 
|---|
| 56 | S PAR="A;M",START="A;E" | 
|---|
| 57 | I $D(CONDS("X",PAR)),$D(CONDS("X",START)) D TCHK(PAR,7,START) Q:'OK | 
|---|
| 58 | S PAR="A;S",START="A;T" | 
|---|
| 59 | I $D(CONDS("X",PAR)),$D(CONDS("X",START)) D TCHK(PAR,5,START) Q:'OK | 
|---|
| 60 | S PAR="A;O" | 
|---|
| 61 | I $D(CONDS("X",PAR)) D  Q:'OK | 
|---|
| 62 | . F FILE="D","M","F","P" D  Q:'OK | 
|---|
| 63 | .. S START="A;"_FILE | 
|---|
| 64 | .. I $D(CONDS("X",START)) D TCHK(PAR,5,START) | 
|---|
| 65 | Q | 
|---|
| 66 | TCHK(PAR,NUM,START) ; within scope of THREAD | 
|---|
| 67 | S ITEM=PAR,PARSTOP=PAR_";Z",STOP=START_";Z" | 
|---|
| 68 | F  S ITEM=$O(RESULTS(ITEM)) Q:ITEM=""  Q:ITEM]PARSTOP  D  Q:'OK | 
|---|
| 69 | . S NODE="" | 
|---|
| 70 | . F  S NODE=$O(RESULTS(ITEM,NODE)) Q:NODE=""  D  Q:'OK | 
|---|
| 71 | .. S IEN=$P(NODE,";",1,NUM) | 
|---|
| 72 | .. S CHK=0 | 
|---|
| 73 | .. S ITEMC=START | 
|---|
| 74 | .. F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]STOP  D  Q:CHK | 
|---|
| 75 | ... S NODEC="" | 
|---|
| 76 | ... F  S NODEC=$O(RESULTS(ITEMC,NODEC)) Q:NODEC=""  D  Q:CHK | 
|---|
| 77 | .... I IEN=$P(NODEC,";",1,NUM) S CHK=1 Q | 
|---|
| 78 | .... I $L(NODEC,";")=4 S CHK=1 Q  ; at collection date | 
|---|
| 79 | .. I 'CHK K RESULTS(ITEM) | 
|---|
| 80 | S NEXT=$O(RESULTS(PAR)) | 
|---|
| 81 | I NEXT="" S OK=0 Q | 
|---|
| 82 | I NEXT]PARSTOP S OK=0 Q | 
|---|
| 83 | Q | 
|---|
| 84 | ; | 
|---|
| 85 | SCRAPS(CONDS,RESULTS,OK) ; | 
|---|
| 86 | N ITEM,ITEMC | 
|---|
| 87 | S OK=1 | 
|---|
| 88 | S ITEM="" | 
|---|
| 89 | F  S ITEM=$O(RESULTS(ITEM)) Q:ITEM=""  D | 
|---|
| 90 | . S ITEMC=$P(ITEM,";",1,2) | 
|---|
| 91 | . I ITEMC="M;A",$D(CONDS("MIR")) Q | 
|---|
| 92 | . I ITEMC="M;M",$D(CONDS("MIR")) Q | 
|---|
| 93 | . I '$D(CONDS("X",ITEMC)) K RESULTS(ITEM) | 
|---|
| 94 | I '$L($O(RESULTS(""))) S OK=0 Q | 
|---|
| 95 | Q | 
|---|
| 96 | ; | 
|---|
| 97 | NOTEQUAL(CONDS,RESULTS,OK) ; | 
|---|
| 98 | ; check not equal condition for pointer values | 
|---|
| 99 | N FILE,ITEM,START,STOP,TYPE | 
|---|
| 100 | S OK=1 | 
|---|
| 101 | S ITEM="" | 
|---|
| 102 | F  S ITEM=$O(CONDS(0,ITEM)) Q:ITEM=""  D  Q:'OK | 
|---|
| 103 | . S TYPE=$E(ITEM),FILE=$E(ITEM,3),START=TYPE_";"_FILE,STOP=TYPE_";"_FILE_";Z" | 
|---|
| 104 | . K RESULTS(ITEM) | 
|---|
| 105 | . S NEXT=$O(RESULTS(START)) | 
|---|
| 106 | . I NEXT="" S OK=0 Q | 
|---|
| 107 | . I NEXT]STOP S OK=0 Q | 
|---|
| 108 | Q | 
|---|
| 109 | ; | 
|---|
| 110 | EQUAL(CONDS,RESULTS,OK) ; | 
|---|
| 111 | ; check equal condition for pointer values | 
|---|
| 112 | N FILE,ITEM,ITEMC,NEXT,START,STOP,TYPE | 
|---|
| 113 | S OK=1 | 
|---|
| 114 | S ITEM="" | 
|---|
| 115 | F  S ITEM=$O(CONDS(1,ITEM)) Q:ITEM=""  D | 
|---|
| 116 | . S TYPE=$E(ITEM),FILE=$E(ITEM,3),START=TYPE_";"_FILE,STOP=TYPE_";"_FILE_";Z" | 
|---|
| 117 | . S ITEMC=START | 
|---|
| 118 | . F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]STOP  D | 
|---|
| 119 | .. I ITEMC=ITEM Q | 
|---|
| 120 | .. K RESULTS(ITEMC) | 
|---|
| 121 | S NEXT=$O(RESULTS(START)) | 
|---|
| 122 | I NEXT="" S OK=0 Q | 
|---|
| 123 | I NEXT]STOP S OK=0 Q | 
|---|
| 124 | Q | 
|---|
| 125 | ; | 
|---|
| 126 | AC(CONDS,RESULTS,OK) ; | 
|---|
| 127 | ; check conditions for AP categories | 
|---|
| 128 | N CAT,CATEGORY,ITEM,ITEMC,NODE,NOTEQUAL,SUB | 
|---|
| 129 | S OK=1 | 
|---|
| 130 | S ITEM="" | 
|---|
| 131 | F  S ITEM=$O(CONDS("AC",ITEM)) Q:ITEM=""  D | 
|---|
| 132 | . S CATEGORY=$P(ITEM,"=",2) | 
|---|
| 133 | . I '$L(CATEGORY) Q | 
|---|
| 134 | . S CATEGORY=$E(CATEGORY,2) | 
|---|
| 135 | . S NOTEQUAL=0 | 
|---|
| 136 | . I $L($P(ITEM,"'=",2)) S NOTEQUAL=1 | 
|---|
| 137 | . S ITEMC="A" | 
|---|
| 138 | . F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]"A;Z"  D | 
|---|
| 139 | .. I ITEMC["A;T;" Q | 
|---|
| 140 | .. S NODE="" | 
|---|
| 141 | .. F  S NODE=$O(RESULTS(ITEMC,NODE)) Q:NODE=""  D | 
|---|
| 142 | ... S SUB=$P(NODE,";",2) | 
|---|
| 143 | ... I SUB=33!(SUB=80) S CAT="A" | 
|---|
| 144 | ... E  S CAT=$E(SUB) | 
|---|
| 145 | ... I NOTEQUAL,CAT=CATEGORY K RESULTS(ITEMC,NODE) Q | 
|---|
| 146 | ... I 'NOTEQUAL,CAT'=CATEGORY K RESULTS(ITEMC,NODE) Q | 
|---|
| 147 | I '$L($O(RESULTS(""))) S OK=0 Q | 
|---|
| 148 | Q | 
|---|
| 149 | ; | 
|---|
| 150 | MC(CONDS,RESULTS,OK) ; | 
|---|
| 151 | ; check conditions for Micro categories | 
|---|
| 152 | N CATEGORY,CATSUB,ITEM,ITEMC,NEXT,NODE,NOTEQUAL,SUB | 
|---|
| 153 | S OK=1 | 
|---|
| 154 | S ITEM="" | 
|---|
| 155 | F  S ITEM=$O(CONDS("MC",ITEM)) Q:ITEM=""  D | 
|---|
| 156 | . S CATEGORY=$P(ITEM,"=",2) | 
|---|
| 157 | . I '$L(CATEGORY) Q | 
|---|
| 158 | . S CATEGORY=$E(CATEGORY,2) | 
|---|
| 159 | . S CATSUB=$$CATSUB^LRPXAPIU(CATEGORY,"M") | 
|---|
| 160 | . S NOTEQUAL=0 | 
|---|
| 161 | . I $L($P(ITEM,"'=",2)) S NOTEQUAL=1 | 
|---|
| 162 | . S ITEMC="M" | 
|---|
| 163 | . F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]"M;Z"  D | 
|---|
| 164 | .. I ITEMC["M;T;" Q | 
|---|
| 165 | .. I ITEMC["M;S;" Q | 
|---|
| 166 | .. S NODE="" | 
|---|
| 167 | .. F  S NODE=$O(RESULTS(ITEMC,NODE)) Q:NODE=""  D | 
|---|
| 168 | ... S SUB=$P(NODE,";",4) | 
|---|
| 169 | ... I NOTEQUAL,SUB=CATSUB K RESULTS(ITEMC,NODE) Q | 
|---|
| 170 | ... I 'NOTEQUAL,SUB'=CATSUB K RESULTS(ITEMC,NODE) Q | 
|---|
| 171 | S NEXT=$O(RESULTS("M")) | 
|---|
| 172 | I NEXT="" S OK=0 Q | 
|---|
| 173 | I NEXT]"M;S" S OK=0 Q | 
|---|
| 174 | Q | 
|---|
| 175 | ; | 
|---|
| 176 | AS(CONDS,RESULTS,OK) ; | 
|---|
| 177 | ; check conditions for AP specimen | 
|---|
| 178 | N CHECK,ITEM,ITEMC,NEXT,S | 
|---|
| 179 | S OK=1 | 
|---|
| 180 | S ITEM="" | 
|---|
| 181 | F  S ITEM=$O(CONDS("AS",ITEM)) Q:ITEM=""  D | 
|---|
| 182 | . I $E(ITEM,2)="'" D  Q | 
|---|
| 183 | .. ; good if the specimen text is not present for this collection | 
|---|
| 184 | .. S ITEMC="A;S;1" | 
|---|
| 185 | .. F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]"A;S;Z"  D | 
|---|
| 186 | ... S S=$P(ITEMC,"1.",2) | 
|---|
| 187 | ... S CHECK="I "_ITEM | 
|---|
| 188 | ... X CHECK I '$T K RESULTS(ITEMC) | 
|---|
| 189 | . ; good if any of the specimen text for this collection have a matching text | 
|---|
| 190 | . I $O(RESULTS("A;S;1"))="" Q | 
|---|
| 191 | . I $O(RESULTS("A;S;1"))]"A;S;Z" Q | 
|---|
| 192 | . S OK=0 | 
|---|
| 193 | . S ITEMC="A;S;1" | 
|---|
| 194 | . F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]"A;S;Z"  D | 
|---|
| 195 | .. S S=$P(ITEMC,"1.",2) | 
|---|
| 196 | .. S CHECK="I "_ITEM | 
|---|
| 197 | .. X CHECK I '$T K RESULTS(ITEMC) | 
|---|
| 198 | S NEXT=$O(RESULTS("A;S;")) | 
|---|
| 199 | I NEXT="" S OK=0 Q | 
|---|
| 200 | I NEXT]"A;S;Z" S OK=0 Q | 
|---|
| 201 | S OK=1 | 
|---|
| 202 | Q | 
|---|
| 203 | ; | 
|---|
| 204 | MIR(CONDS,RESULTS,OK) ; | 
|---|
| 205 | ; check conditions for antimicrobial results and interpretations | 
|---|
| 206 | ; uses MCHK within this scope | 
|---|
| 207 | N ABNODE,ABTYPE,CHECK,I,ITEM,ITEMC,NEXTA,NEXTM,NODE,R,START,STOP | 
|---|
| 208 | S OK=0 | 
|---|
| 209 | F ABTYPE="A","M" D MCHK(ABTYPE) | 
|---|
| 210 | S NEXTA=$O(RESULTS("M;A")) | 
|---|
| 211 | S NEXTM=$O(RESULTS("M;M")) | 
|---|
| 212 | I NEXTA="",NEXTM="" Q | 
|---|
| 213 | I NEXTA="",NEXTM]"M;M;Z" Q | 
|---|
| 214 | I NEXTA]"M;A;Z",NEXTM="" Q | 
|---|
| 215 | I NEXTA]"M;A;Z",NEXTM]"M;M;Z" Q | 
|---|
| 216 | S OK=1 | 
|---|
| 217 | Q | 
|---|
| 218 | MCHK(ABTYPE) ; within scope of MIR | 
|---|
| 219 | S START="M;"_ABTYPE | 
|---|
| 220 | S STOP=START_";Z" | 
|---|
| 221 | S ITEM="" | 
|---|
| 222 | F  S ITEM=$O(CONDS("MIR",ITEM)) Q:ITEM=""  D | 
|---|
| 223 | . I $E(ITEM,2)="'" D  Q | 
|---|
| 224 | .. ; good if the interpretation/result is not present for this collection | 
|---|
| 225 | .. S ITEMC=START | 
|---|
| 226 | .. F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]STOP  D | 
|---|
| 227 | ... S NODE="" | 
|---|
| 228 | ... F  S NODE=$O(RESULTS(ITEMC,NODE)) Q:NODE=""  D | 
|---|
| 229 | .... S ABNODE=$$REFVAL^LRPXAPI(NODE) | 
|---|
| 230 | .... I ABTYPE="A" D | 
|---|
| 231 | ..... S I=$P(ABNODE,U,2) | 
|---|
| 232 | ..... S R=$P(ABNODE,U) | 
|---|
| 233 | .... E  D | 
|---|
| 234 | ..... S R=$P(ABNODE,U) | 
|---|
| 235 | ..... S I=R | 
|---|
| 236 | .... S CHECK="I "_ITEM | 
|---|
| 237 | .... X CHECK I $T Q | 
|---|
| 238 | .... K RESULTS(ITEMC,NODE) | 
|---|
| 239 | . ; good if any of the interpretations/results have matching conditions | 
|---|
| 240 | . I $O(RESULTS(START))="" Q | 
|---|
| 241 | . I $O(RESULTS(START))]STOP Q | 
|---|
| 242 | . S ITEMC=START | 
|---|
| 243 | . F  S ITEMC=$O(RESULTS(ITEMC)) Q:ITEMC=""  Q:ITEMC]STOP  D | 
|---|
| 244 | .. S NODE="" | 
|---|
| 245 | .. F  S NODE=$O(RESULTS(ITEMC,NODE)) Q:NODE=""  D | 
|---|
| 246 | ... S ABNODE=$$REFVAL^LRPXAPI(NODE) | 
|---|
| 247 | ... S I=$P(ABNODE,U,2) | 
|---|
| 248 | ... S R=$P(ABNODE,U) | 
|---|
| 249 | ... S CHECK="I "_ITEM | 
|---|
| 250 | ... X CHECK I '$T K RESULTS(ITEMC,NODE) | 
|---|
| 251 | Q | 
|---|
| 252 | ; | 
|---|