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