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