| [613] | 1 | RORUPR1 ;HCIOFO/SG - SELECTION RULES PREPARATION  ; 11/20/05 4:56pm | 
|---|
|  | 2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006 | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | Q | 
|---|
|  | 5 | ; | 
|---|
|  | 6 | ;***** MARKS PARENT FILES TO PROCESS | 
|---|
|  | 7 | ; | 
|---|
|  | 8 | ; This function analyzes file dependencies defined by the 'ROR | 
|---|
|  | 9 | ; METADATA' file and guaranties that all necessary files will be | 
|---|
|  | 10 | ; processed during the registry update. | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | FILETREE() ; | 
|---|
|  | 13 | N FILE,PF,RC | 
|---|
|  | 14 | S FILE="",RC=0 | 
|---|
|  | 15 | F  S FILE=$O(RORUPD("SR",FILE))  Q:FILE=""  D  Q:RC<0 | 
|---|
|  | 16 | . S PF=+FILE,RC=0 | 
|---|
|  | 17 | . ;--- Follow a path that leads from this file to | 
|---|
|  | 18 | . ;    the root of the "file-processing tree". | 
|---|
|  | 19 | . F  D  Q:RC | 
|---|
|  | 20 | . . ;--- Check if metadata for the file is defined | 
|---|
|  | 21 | . . I '$D(^ROR(799.2,PF))  D  Q | 
|---|
|  | 22 | . . . S RC=$$ERROR^RORERR(-63,,,,PF) | 
|---|
|  | 23 | . . ;--- Get the number of the parent file | 
|---|
|  | 24 | . . S PF=+$$GET1^DIQ(799.2,PF_",",1,"I",,"RORMSG") | 
|---|
|  | 25 | . . I $G(DIERR)  D  Q | 
|---|
|  | 26 | . . . S RC=$$DBS^RORERR("RORMSG",-9) | 
|---|
|  | 27 | . . ;--- Stop if the root of the "file-processing tree" has been | 
|---|
|  | 28 | . . ;    reached or the file is already marked for processing. | 
|---|
|  | 29 | . . ;    Otherwise, mark the file and continue moving up. | 
|---|
|  | 30 | . . I 'PF!$D(RORUPD("SR",PF))  S RC=1  Q | 
|---|
|  | 31 | . . S RORUPD("SR",PF)="" | 
|---|
|  | 32 | Q $S(RC<0:RC,1:0) | 
|---|
|  | 33 | ; | 
|---|
|  | 34 | ;***** RETURNS LEVEL OF THE FILE IN 'THE FILE PROCESSING' TREE | 
|---|
|  | 35 | ; | 
|---|
|  | 36 | ; FILE          File number | 
|---|
|  | 37 | ; | 
|---|
|  | 38 | FLEVEL(FILE) ; | 
|---|
|  | 39 | N LEVEL | 
|---|
|  | 40 | S LEVEL=1 | 
|---|
|  | 41 | F  S FILE=+$P($G(^ROR(799.2,FILE,0)),U,2)  Q:'FILE  S LEVEL=LEVEL+1 | 
|---|
|  | 42 | Q LEVEL | 
|---|
|  | 43 | ; | 
|---|
|  | 44 | ;***** LOADS AND PREPARES LAB SEARCH INDICATORS | 
|---|
|  | 45 | ; | 
|---|
|  | 46 | ; Return Values: | 
|---|
|  | 47 | ;        0  Ok | 
|---|
|  | 48 | ;       <0  Error code | 
|---|
|  | 49 | ; | 
|---|
|  | 50 | LABSRCH() ; | 
|---|
|  | 51 | N I,IND,IR,LRCODE,LSICNT,LSIEN,RC,RORBUF,RORMSG,TMP,VAL | 
|---|
|  | 52 | K RORLRC | 
|---|
|  | 53 | ;--- Browse through the list of Lab searches | 
|---|
|  | 54 | S LSIEN="",RC=0 | 
|---|
|  | 55 | F  S LSIEN=$O(@RORUPDPI@(4,LSIEN))  Q:LSIEN=""  D  Q:RC<0 | 
|---|
|  | 56 | . K RORBUF  S TMP=","_LSIEN_"," | 
|---|
|  | 57 | . D LIST^DIC(798.92,TMP,"@;.01;.02;1I;2",,,,,"B",,,"RORBUF","RORMSG") | 
|---|
|  | 58 | . S RC=$$DBS^RORERR("RORMSG",-9)  Q:RC<0 | 
|---|
|  | 59 | . ;--- Browse through the list of search indicators | 
|---|
|  | 60 | . S IR="",LSICNT=0 | 
|---|
|  | 61 | . F  S IR=$O(RORBUF("DILIST","ID",IR))  Q:IR=""  D  Q:RC<0 | 
|---|
|  | 62 | . . K LRCODE | 
|---|
|  | 63 | . . ;--- Check if the indicator should be ignored | 
|---|
|  | 64 | . . S IND=$G(RORBUF("DILIST","ID",IR,1))  Q:IND'>0 | 
|---|
|  | 65 | . . ;--- Get the result code (LOINC and/or NLT) | 
|---|
|  | 66 | . . S LRCODE=$G(RORBUF("DILIST","ID",IR,.01)) | 
|---|
|  | 67 | . . I LRCODE>0  D  Q:LRCODE<0  S LRCODE(LRCODE_"^LN")="" | 
|---|
|  | 68 | . . . S LRCODE=$$LNCODE^RORUTL02(LRCODE) | 
|---|
|  | 69 | . . S LRCODE=$G(RORBUF("DILIST","ID",IR,.02)) | 
|---|
|  | 70 | . . S:LRCODE>0 LRCODE(LRCODE_"^NLT")="" | 
|---|
|  | 71 | . . ;--- Either LOINC or NLT must be defined | 
|---|
|  | 72 | . . Q:$D(LRCODE)<10 | 
|---|
|  | 73 | . . M RORLRC("B")=LRCODE | 
|---|
|  | 74 | . . ;--- Prepare and store the search indicator | 
|---|
|  | 75 | . . S VAL=$G(RORBUF("DILIST","ID",IR,2)) | 
|---|
|  | 76 | . . I VAL="",IND'=1,IND'=6  Q | 
|---|
|  | 77 | . . S LSICNT=LSICNT+1 | 
|---|
|  | 78 | . . S LRCODE="" | 
|---|
|  | 79 | . . F  S LRCODE=$O(LRCODE(LRCODE))  Q:LRCODE=""  D | 
|---|
|  | 80 | . . . S I=$O(@RORUPDPI@("LS",LRCODE,LSIEN,""),-1)+1 | 
|---|
|  | 81 | . . . S @RORUPDPI@("LS",LRCODE,LSIEN,I)=IND_U_VAL | 
|---|
|  | 82 | . Q:(RC<0)!(LSICNT>0) | 
|---|
|  | 83 | . ;--- Record a warning if no indicators are defined | 
|---|
|  | 84 | . S TMP=$$GET1^DIQ(798.9,LSIEN_",",.01,,,"RORMSG") | 
|---|
|  | 85 | . S TMP=$$ERROR^RORERR(-55,,,,TMP) | 
|---|
|  | 86 | Q:RC<0 RC | 
|---|
|  | 87 | ;--- Prepare a list of Lab result codes for GCPR^LA7QRY | 
|---|
|  | 88 | S LRCODE="" | 
|---|
|  | 89 | F IR=1:1  S LRCODE=$O(RORLRC("B",LRCODE))  Q:LRCODE=""  D | 
|---|
|  | 90 | . S RORLRC(IR)=LRCODE | 
|---|
|  | 91 | K RORLRC("B") | 
|---|
|  | 92 | Q 0 | 
|---|
|  | 93 | ; | 
|---|
|  | 94 | ;***** LOADS SELECTION RULES DATA | 
|---|
|  | 95 | ; | 
|---|
|  | 96 | ; .REGLST       Reference to a local array containing registry names | 
|---|
|  | 97 | ;               as subscripts and optional registry IENs as values | 
|---|
|  | 98 | ; | 
|---|
|  | 99 | ; Return Values: | 
|---|
|  | 100 | ;        0  Ok | 
|---|
|  | 101 | ;       <0  Error code | 
|---|
|  | 102 | ; | 
|---|
|  | 103 | LOAD(REGLST) ; | 
|---|
|  | 104 | N I,IENS,RC,REGIEN,REGNAME,RORBUF,RORMSG,RULENAME | 
|---|
|  | 105 | K RORUPD("LM1") | 
|---|
|  | 106 | S REGNAME="",RC=0 | 
|---|
|  | 107 | F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D  Q:RC<0 | 
|---|
|  | 108 | . S REGIEN=+$G(REGLST(REGNAME)) | 
|---|
|  | 109 | . I REGIEN'>0  D  I REGIEN'>0  S RC=REGIEN  Q | 
|---|
|  | 110 | . . S REGIEN=$$REGIEN^RORUTL02(REGNAME) | 
|---|
|  | 111 | . S @RORUPDPI@(2,REGIEN)=REGNAME | 
|---|
|  | 112 | . ;--- Load selection rules | 
|---|
|  | 113 | . K RORBUF  S IENS=","_REGIEN_"," | 
|---|
|  | 114 | . D LIST^DIC(798.13,IENS,"@;.01E","U",,,,"B",,,"RORBUF","RORMSG") | 
|---|
|  | 115 | . S RC=$$DBS^RORERR("RORMSG",-9)  Q:RC<0 | 
|---|
|  | 116 | . S I="" | 
|---|
|  | 117 | . F  S I=$O(RORBUF("DILIST","ID",I))  Q:I=""  D  Q:RC<0 | 
|---|
|  | 118 | . . S RULENAME=RORBUF("DILIST","ID",I,.01) | 
|---|
|  | 119 | . . S RC=$$LOADRULE(RULENAME,REGIEN) | 
|---|
|  | 120 | Q $S(RC<0:RC,1:0) | 
|---|
|  | 121 | ; | 
|---|
|  | 122 | ;***** LOADS THE SELECTION RULE | 
|---|
|  | 123 | ; | 
|---|
|  | 124 | ; RULENAME      Name of the rule | 
|---|
|  | 125 | ; REGIEN        Registry IEN | 
|---|
|  | 126 | ; [LEVEL]       Level of the rule (O for top level rules) | 
|---|
|  | 127 | ; | 
|---|
|  | 128 | ; Return Values: | 
|---|
|  | 129 | ;        0  Ok | 
|---|
|  | 130 | ;       <0  Error code | 
|---|
|  | 131 | ; | 
|---|
|  | 132 | LOADRULE(RULENAME,REGIEN,LEVEL) ; | 
|---|
|  | 133 | ;--- Quit if the rule has already been loaded | 
|---|
|  | 134 | I $D(@RORUPDPI@(3,RULENAME))  D  Q 0 | 
|---|
|  | 135 | . S @RORUPDPI@(3,RULENAME,2,REGIEN)="" | 
|---|
|  | 136 | ;--- | 
|---|
|  | 137 | N DATELMT,DEPRLC,EXPR,FILE,I,IENS,RORBUF,RORMSG,RULIEN,TMP | 
|---|
|  | 138 | ;--- Load the rule data | 
|---|
|  | 139 | D FIND^DIC(798.2,,"@;1;2I","X",RULENAME,2,"B",,,"RORBUF","RORMSG") | 
|---|
|  | 140 | S RC=$$DBS^RORERR("RORMSG",-9)  Q:RC<0 RC | 
|---|
|  | 141 | Q:$G(RORBUF("DILIST",0))<1 $$ERROR^RORERR(-3,,RULENAME) | 
|---|
|  | 142 | Q:$G(RORBUF("DILIST",0))>1 $$ERROR^RORERR(-4,,RULENAME) | 
|---|
|  | 143 | S RULIEN=+RORBUF("DILIST",2,1),IENS=","_RULIEN_"," | 
|---|
|  | 144 | S FILE=+RORBUF("DILIST","ID",1,2) | 
|---|
|  | 145 | ;--- Put the rule data into the temporary global | 
|---|
|  | 146 | S @RORUPDPI@(1,FILE,"S",RULENAME)="" | 
|---|
|  | 147 | S @RORUPDPI@(3,RULENAME)=RULIEN_U_FILE_"^^"_'$G(LEVEL) | 
|---|
|  | 148 | S RC=$$PARSER^RORUPEX(FILE,RORBUF("DILIST","ID",1,1),.EXPR) | 
|---|
|  | 149 | Q:RC<0 RC | 
|---|
|  | 150 | S @RORUPDPI@(3,RULENAME,1)=EXPR | 
|---|
|  | 151 | S @RORUPDPI@(3,RULENAME,2,REGIEN)="" | 
|---|
|  | 152 | M @RORUPDPI@(1,FILE,"F")=EXPR("F") | 
|---|
|  | 153 | S:'$G(LEVEL) RORUPD("LM1",RULENAME)="" | 
|---|
|  | 154 | M @RORUPDPI@(4)=EXPR("L") | 
|---|
|  | 155 | ;--- Load the rules that this rule depends on | 
|---|
|  | 156 | S DEPRLC="" | 
|---|
|  | 157 | F  S DEPRLC=$O(EXPR("R",DEPRLC))  Q:DEPRLC=""  D  Q:RC<0 | 
|---|
|  | 158 | . S RC=$$LOADRULE(DEPRLC,REGIEN,$G(LEVEL)+1) | 
|---|
|  | 159 | . S:RC'<0 @RORUPDPI@(3,RULENAME,3,DEPRLC)="" | 
|---|
|  | 160 | Q:RC<0 RC | 
|---|
|  | 161 | ;--- Load a list of additional data elements | 
|---|
|  | 162 | K EXPR,RORBUF,RORMSG | 
|---|
|  | 163 | D LIST^DIC(798.26,IENS,"@;.01I;1I",,,,,"B",,,"RORBUF","RORMSG") | 
|---|
|  | 164 | S RC=$$DBS^RORERR("RORMSG",-9)  Q:RC<0 RC | 
|---|
|  | 165 | S I="" | 
|---|
|  | 166 | F  S I=$O(RORBUF("DILIST","ID",I))  Q:I=""  D | 
|---|
|  | 167 | . S DATELMT=RORBUF("DILIST","ID",I,.01) | 
|---|
|  | 168 | . S TMP=$G(RORBUF("DILIST","ID",I,1))  S:TMP="" TMP="EI" | 
|---|
|  | 169 | . S:TMP["E" @RORUPDPI@(1,FILE,"F",DATELMT,"E")="" | 
|---|
|  | 170 | . S:TMP["I" @RORUPDPI@(1,FILE,"F",DATELMT,"I")="" | 
|---|
|  | 171 | Q 0 | 
|---|
|  | 172 | ; | 
|---|
|  | 173 | ;***** LOADS AND PREPARES THE METADATA | 
|---|
|  | 174 | METADATA() ; | 
|---|
|  | 175 | N API,DATELMT,DEFL,FILE,I,IENS,IS,PIF,RC,ROOT,RORBUF,RORMSG,TMP,VT | 
|---|
|  | 176 | S RC=$$FILETREE()  Q:RC<0 RC | 
|---|
|  | 177 | S DEFL="@;.02I;1I;4I;4.1;4.2;6I" | 
|---|
|  | 178 | ;--- Load and process the metadata | 
|---|
|  | 179 | S FILE="",RC=0 | 
|---|
|  | 180 | F  S FILE=$O(RORUPD("SR",FILE))  Q:FILE=""  D  Q:RC<0 | 
|---|
|  | 181 | . S IENS=","_FILE_",",PIF=$NA(@RORUPDPI@(1,FILE)) | 
|---|
|  | 182 | . ;--- Global root of the file | 
|---|
|  | 183 | . S RORUPD("ROOT",FILE)=$$ROOT^DILFD(FILE,,1) | 
|---|
|  | 184 | . ;--- Associate data elements with APIs | 
|---|
|  | 185 | . S DATELMT="" | 
|---|
|  | 186 | . F  S DATELMT=$O(@PIF@("F",DATELMT))  Q:DATELMT=""  D  Q:RC<0 | 
|---|
|  | 187 | . . ;--- Find and load defintion of the data element | 
|---|
|  | 188 | . . K RORBUF,RORMSG | 
|---|
|  | 189 | . . D FIND^DIC(799.22,IENS,DEFL,"X",DATELMT,,"C",,,"RORBUF","RORMSG") | 
|---|
|  | 190 | . . I $G(DIERR)  D  Q | 
|---|
|  | 191 | . . . S RC=$$DBS^RORERR("RORMSG",-9,,,799.22,IENS) | 
|---|
|  | 192 | . . ;--- Check if search on this element is supported | 
|---|
|  | 193 | . . S API=+$G(RORBUF("DILIST","ID",1,1)) | 
|---|
|  | 194 | . . I 'API  D  Q | 
|---|
|  | 195 | . . . S RC=$$ERROR^RORERR(-64,,,,FILE,DATELMT) | 
|---|
|  | 196 | . . ;--- Store the field number (if necessary) | 
|---|
|  | 197 | . . I API=1  D  S RORUPD("SR",FILE,"F",API,DATELMT)=TMP | 
|---|
|  | 198 | . . . S TMP=$G(RORBUF("DILIST","ID",1,6)) | 
|---|
|  | 199 | . . ;--- Associate the data element with the API | 
|---|
|  | 200 | . . S VT=$G(RORBUF("DILIST","ID",1,4)),RC=0 | 
|---|
|  | 201 | . . F I="E","I"  I $D(@PIF@("F",DATELMT,I))  D  Q:RC<0 | 
|---|
|  | 202 | . . . ;--- Check if type of the requested value is supported | 
|---|
|  | 203 | . . . I VT'[I  D  Q | 
|---|
|  | 204 | . . . . S TMP=$$EXTERNAL^DILFD(799.22,4,,I,"RORMSG") | 
|---|
|  | 205 | . . . . S RC=$$ERROR^RORERR(-65,,,,FILE,DATELMT,TMP) | 
|---|
|  | 206 | . . . ;--- Add the API-Element pair to the list | 
|---|
|  | 207 | . . . S TMP=$G(RORBUF("DILIST","ID",1,$$VTFN(I))) | 
|---|
|  | 208 | . . . S RORUPD("SR",FILE,"F",API,DATELMT,I)=TMP | 
|---|
|  | 209 | . Q:RC<0 | 
|---|
|  | 210 | . ;--- Add required elements (if any) to the list | 
|---|
|  | 211 | . K RORBUF,RORMSG | 
|---|
|  | 212 | . D FIND^DIC(799.22,IENS,DEFL,"X",1,,"AR",,,"RORBUF","RORMSG") | 
|---|
|  | 213 | . I $G(DIERR)  D  Q | 
|---|
|  | 214 | . . S RC=$$DBS^RORERR("RORMSG",-9,,,799.22,IENS) | 
|---|
|  | 215 | . S IS="" | 
|---|
|  | 216 | . F  S IS=$O(RORBUF("DILIST","ID",IS))  Q:IS=""  D | 
|---|
|  | 217 | . . S DATELMT=+$G(RORBUF("DILIST","ID",IS,.02))  Q:'DATELMT | 
|---|
|  | 218 | . . S API=+$G(RORBUF("DILIST","ID",IS,1))        Q:'API | 
|---|
|  | 219 | . . S VT=$G(RORBUF("DILIST","ID",IS,4)) | 
|---|
|  | 220 | . . F I="E","I"  D:VT[I | 
|---|
|  | 221 | . . . S TMP=$G(RORBUF("DILIST","ID",IS,$$VTFN(I))) | 
|---|
|  | 222 | . . . S RORUPD("SR",FILE,"F",API,DATELMT,I)=TMP | 
|---|
|  | 223 | . . ;--- Store the field number (if necessary) | 
|---|
|  | 224 | . . I API=1  D  S RORUPD("SR",FILE,"F",API,DATELMT)=TMP | 
|---|
|  | 225 | . . . S TMP=$G(RORBUF("DILIST","ID",IS,6)) | 
|---|
|  | 226 | . ;--- Compile a list of fields (separated by ';') for the GETS^DIQ | 
|---|
|  | 227 | . Q:$D(RORUPD("SR",FILE,"F",1))<10 | 
|---|
|  | 228 | . S (DATELMT,RORBUF)="" | 
|---|
|  | 229 | . F  S DATELMT=$O(RORUPD("SR",FILE,"F",1,DATELMT))  Q:DATELMT=""  D | 
|---|
|  | 230 | . . S TMP=+$G(RORUPD("SR",FILE,"F",1,DATELMT)) | 
|---|
|  | 231 | . . S:TMP>0 RORBUF=RORBUF_";"_TMP | 
|---|
|  | 232 | . S RORUPD("SR",FILE,"F",1)=$S(RORBUF'="":$P(RORBUF,";",2,999),1:"") | 
|---|
|  | 233 | Q $S(RC<0:RC,1:0) | 
|---|
|  | 234 | ; | 
|---|
|  | 235 | ;***** RETURNS FIELD NUMBER OF ADDITIONAL DATA | 
|---|
|  | 236 | VTFN(VT) ; | 
|---|
|  | 237 | Q $S(VT="E":4.1,1:4.2) | 
|---|