1 | PXRMFFDB ;SLC/PKR - Function finding data structure builder. ;10/31/2007
|
---|
2 | ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123
|
---|
3 | ;
|
---|
4 | ;===========================================
|
---|
5 | BASE2(NUM) ;Convert a base 10 integer to base 2.
|
---|
6 | N BD,BIN
|
---|
7 | S BIN=""
|
---|
8 | F Q:NUM=0 D
|
---|
9 | . S BD=$S((NUM\2)=(NUM/2):0,1:1)
|
---|
10 | . S BIN=BD_BIN,NUM=NUM\2
|
---|
11 | Q BIN
|
---|
12 | ;
|
---|
13 | ;===========================================
|
---|
14 | CRESLOG(NUM,FLIST,RESLOG) ;Check the resolution logic to see if
|
---|
15 | ;it can be made true solely by function findings. If that is the case
|
---|
16 | ;warn the user. Called by BLDRESLS^PXRMLOGX
|
---|
17 | N AGEFI,BP,FI,FF,FFL,IND,JND,KND,LE,LEN,LND,NFF,NTC,SEXFI,TEMP,VALUE
|
---|
18 | S (AGEFI,SEXFI)=0
|
---|
19 | S NFF=0
|
---|
20 | F IND=1:1:NUM D
|
---|
21 | . S JND=$P(FLIST,";",IND)
|
---|
22 | . I +JND=JND S FI(JND)=0 Q
|
---|
23 | . I JND["FF" S NFF=NFF+1,FF=$P(JND,"FF",2),FFL(NFF)=FF
|
---|
24 | I NFF=0 Q
|
---|
25 | ;Generate and test all combinations of true and false FFs.
|
---|
26 | S VALUE=0
|
---|
27 | S NTC=$$PWR^XLFMTH(2,NFF)-1
|
---|
28 | F IND=1:1:NTC Q:VALUE D
|
---|
29 | . S BIN=$$BASE2(IND)
|
---|
30 | . S LEN=$L(BIN)
|
---|
31 | . S LE=NFF-LEN
|
---|
32 | .;Fill in the values for the implied preceeding 0s.
|
---|
33 | . F JND=1:1:LE S KND=FFL(JND),FF(KND)=0
|
---|
34 | . S LND=0
|
---|
35 | . F JND=LE+1:1:NFF D
|
---|
36 | .. S KND=FFL(JND),LND=LND+1
|
---|
37 | .. S FF(KND)=$E(BIN,LND)
|
---|
38 | . I @RESLOG
|
---|
39 | . S VALUE=$T
|
---|
40 | I VALUE D
|
---|
41 | . N RESLSTR
|
---|
42 | . S RESLSTR=RESLOG
|
---|
43 | . F IND=1:1:NUM D
|
---|
44 | .. S JND=$P(FLIST,";",IND)
|
---|
45 | .. S TEMP=$S(JND["FF":"FF("_$P(JND,"FF",2)_")",1:"FI("_JND_")")
|
---|
46 | .. S RESLOG=$$STRREP^PXRMUTIL(RESLOG,TEMP,@TEMP)
|
---|
47 | . S RESLOG=$$STRREP^PXRMUTIL(RESLOG,"AGE",AGEFI)
|
---|
48 | . S RESLOG=$$STRREP^PXRMUTIL(RESLOG,"SEX",SEXFI)
|
---|
49 | . W !!,"Warning - your resolution logic can be satisfied by function findings only."
|
---|
50 | . W !,"If this happens it will not be possible to calculate a resolution date and"
|
---|
51 | . W !,"the reminder will not be resolved. Here is a case where the logic evaluates"
|
---|
52 | . W !,"to true:"
|
---|
53 | . W !,RESLSTR
|
---|
54 | . W !,RESLOG
|
---|
55 | . W !
|
---|
56 | Q
|
---|
57 | ;
|
---|
58 | ;=============================================================
|
---|
59 | FFBUILD(X,DA) ;Given a function finding logical string build the data
|
---|
60 | ;structure. This is called by a new-style cross-reference after
|
---|
61 | ;the function string has passed the input transform so we don't need
|
---|
62 | ;to validate the elements.
|
---|
63 | ;Do not execute as part of a verify fields.
|
---|
64 | I $G(DIUTIL)="VERIFY FIELDS" Q
|
---|
65 | ;Do not execute as part of exchange.
|
---|
66 | I $G(PXRMEXCH) Q
|
---|
67 | N FDA,FUNNUM,FUNP,IENB,IENS,IND,JND,L2,L3,LEN,LIST,LOGIC,OPER,MSG
|
---|
68 | N PFSTACK,REPL,RS,TEMP,TS,XS
|
---|
69 | S IENB=DA_","_DA(1)_","
|
---|
70 | S OPER="!&-+<>='"
|
---|
71 | S XS=$$PSPACE(X)
|
---|
72 | D POSTFIX^PXRMSTAC(XS,OPER,.PFSTACK)
|
---|
73 | S (FUNNUM,L2)=0
|
---|
74 | F IND=1:1:PFSTACK(0) D
|
---|
75 | . S TEMP=PFSTACK(IND)
|
---|
76 | . I $D(^PXRMD(802.4,"B",TEMP)) D
|
---|
77 | .. S FUNP=$O(^PXRMD(802.4,"B",TEMP,""))
|
---|
78 | .. S FUNNUM=FUNNUM+1,L2=L2+1
|
---|
79 | .. S IENS="+"_L2_","_IENB
|
---|
80 | .. S FDA(811.9255,IENS,.01)=FUNNUM
|
---|
81 | .. S FDA(811.9255,IENS,.02)=FUNP
|
---|
82 | .. S IND=IND+1
|
---|
83 | .. S LIST=$TR(PFSTACK(IND),"~"," ")
|
---|
84 | .. S REPL(FUNNUM)=TEMP_"("_LIST_")"_U_"FN("_FUNNUM_")"
|
---|
85 | .. S L3=L2
|
---|
86 | .. S LEN=$L(LIST,",")
|
---|
87 | .. F JND=1:1:LEN D
|
---|
88 | ... S L3=L3+1
|
---|
89 | ... S IENS="+"_L3_",+"_L2_","_IENB
|
---|
90 | ... S TS=$P(LIST,",",JND)
|
---|
91 | ... S TS=$TR(TS,"""","")
|
---|
92 | ... S FDA(811.9256,IENS,.01)=TS
|
---|
93 | .. S L2=L3
|
---|
94 | ;Build the logic string
|
---|
95 | S LOGIC=X
|
---|
96 | F IND=1:1:FUNNUM D
|
---|
97 | . S TS=$P(REPL(IND),U,1)
|
---|
98 | . S RS=$P(REPL(IND),U,2)
|
---|
99 | . S LOGIC=$$STRREP^PXRMUTIL(LOGIC,TS,RS)
|
---|
100 | S FDA(811.925,IENB,10)=LOGIC
|
---|
101 | D UPDATE^DIE("","FDA","IENB","MSG")
|
---|
102 | I $D(MSG) D
|
---|
103 | . W !,"The update failed, UPDATE^DIE returned the following error message:"
|
---|
104 | . D AWRITE^PXRMUTIL("MSG")
|
---|
105 | Q
|
---|
106 | ;
|
---|
107 | ;=============================================================
|
---|
108 | FFKILL(X,DA) ;This is the kill logic for the function string.
|
---|
109 | ;Do not execute as part of a verify fields.
|
---|
110 | I $G(DIUTIL)="VERIFY FIELDS" Q
|
---|
111 | ;Do not execute as part of exchange.
|
---|
112 | I $G(PXRMEXCH) Q
|
---|
113 | K ^PXD(811.9,DA(1),25,DA,5),^PXD(811.9,DA(1),25,DA,10)
|
---|
114 | Q
|
---|
115 | ;
|
---|
116 | ;=============================================================
|
---|
117 | ISGRV(VAR) ;Return true if VAR is a global reminder variable.
|
---|
118 | I VAR="PXRMAGE" Q 1
|
---|
119 | I VAR="PXRMDOB" Q 1
|
---|
120 | I VAR="PXRMLAD" Q 1
|
---|
121 | I VAR="PXRMSEX" Q 1
|
---|
122 | Q 0
|
---|
123 | ;
|
---|
124 | ;=============================================================
|
---|
125 | ISSTR(STRING) ;Return true if STRING really is a string and it is not
|
---|
126 | ;executable Mumps code.
|
---|
127 | N VALID,X
|
---|
128 | S VALID=0
|
---|
129 | ;Valid strings are "text" or because of $P ,"text" or ",U".
|
---|
130 | I $E(STRING,1)="""",$E(STRING,$L(STRING))="""" S VALID=1
|
---|
131 | I 'VALID,$E(STRING,1)=",",$E(STRING,2)="""",$E(STRING,$L(STRING))="""" S VALID=1
|
---|
132 | I 'VALID,STRING=",U" S VALID=1
|
---|
133 | I 'VALID Q VALID
|
---|
134 | S X=STRING
|
---|
135 | D ^DIM
|
---|
136 | S VALID=$S($D(X)=0:1,1:0)
|
---|
137 | Q VALID
|
---|
138 | ;
|
---|
139 | ;=============================================================
|
---|
140 | PSPACE(OPR) ;OPR is an operand in a function finding, if some portion
|
---|
141 | ;of OPR is a string translate a space into "~" so it is preserved.
|
---|
142 | ;Note this will work for the entire function string.
|
---|
143 | N DONE,END,START,TNS,TS
|
---|
144 | S DONE=0,END=1
|
---|
145 | F Q:DONE D
|
---|
146 | . S START=$F(OPR,"""",END)
|
---|
147 | . I START=0 S DONE=1 Q
|
---|
148 | . S END=$F(OPR,"""",START)
|
---|
149 | . S TS=$E(OPR,START,END-2)
|
---|
150 | . S TNS=$TR(TS," ","~")
|
---|
151 | . S OPR=$$STRREP^PXRMUTIL(OPR,TS,TNS)
|
---|
152 | Q OPR
|
---|
153 | ;
|
---|
154 | ;=============================================================
|
---|
155 | VFFORM(TEMP,X) ;Make sure the function has a valid form, i.e., function
|
---|
156 | ;followed by an argument list.
|
---|
157 | N DONE,LP,RP,START,VALID
|
---|
158 | S DONE=0,VALID=1,START=0
|
---|
159 | F Q:DONE D
|
---|
160 | . S START=$F(X,TEMP,START)
|
---|
161 | . I START=0 S DONE=1 Q
|
---|
162 | . S LP=$E(X,START)
|
---|
163 | . I LP'="(" S VALID=0,DONE=1 Q
|
---|
164 | . S START=$F(X,")",START)
|
---|
165 | . S RP=$E(X,START-1)
|
---|
166 | . I RP'=")" S VALID=0
|
---|
167 | I 'VALID D
|
---|
168 | . N TEXT
|
---|
169 | . S TEXT="Function "_TEMP_" must be followed by an argument list!"
|
---|
170 | . D EN^DDIOL(.TEXT)
|
---|
171 | Q VALID
|
---|
172 | ;
|
---|
173 | ;=============================================================
|
---|
174 | VFINDING(X,DAI) ;Make sure a finding number is a valid member of the
|
---|
175 | ;definition finding multiple. Input transform for function
|
---|
176 | ;finding finding number.
|
---|
177 | ;Do not execute as part of a verify fields.
|
---|
178 | I $G(DIUTIL)="VERIFY FIELDS" Q 1
|
---|
179 | ;Do not execute as part of exchange.
|
---|
180 | I $G(PXRMEXCH) Q 1
|
---|
181 | I '$D(DAI) Q 1
|
---|
182 | ;If X is not numeric it is not a finding number.
|
---|
183 | I +X'=X Q 1
|
---|
184 | I $D(^PXD(811.9,DAI,20,X,0)) Q 1
|
---|
185 | E D Q 0
|
---|
186 | . N TEXT
|
---|
187 | . S TEXT="Finding number "_X_" does not exist!"
|
---|
188 | . D EN^DDIOL(TEXT)
|
---|
189 | ;
|
---|
190 | ;=============================================================
|
---|
191 | VFSTRING(FFSTRING,DA) ;Make sure a function finding string is valid.
|
---|
192 | ;The elements can be functions, operators, and numbers.
|
---|
193 | ;Do not execute as part of a verify fields.
|
---|
194 | I $G(DIUTIL)="VERIFY FIELDS" Q 1
|
---|
195 | ;Do not execute as part of exchange.
|
---|
196 | I $G(PXRMEXCH) Q 1
|
---|
197 | I '$D(DA) Q 1
|
---|
198 | N DAI,DATE,FUNIEN,IND,LIST,MFUN,OPER,PFSTACK,TEMP,TEXT,VALID
|
---|
199 | S DAI=DA(1)
|
---|
200 | S OPER="!&-+<>='"
|
---|
201 | ;Define the allowed M functions.
|
---|
202 | S MFUN("$P")=""
|
---|
203 | D POSTFIX^PXRMSTAC(FFSTRING,OPER,.PFSTACK)
|
---|
204 | S VALID=1
|
---|
205 | F IND=1:1:PFSTACK(0) Q:'VALID D
|
---|
206 | . S TEMP=PFSTACK(IND)
|
---|
207 | . I $D(^PXRMD(802.4,"B",TEMP)) D Q
|
---|
208 | .. S VALID=$$VFFORM(TEMP,X)
|
---|
209 | .. I 'VALID Q
|
---|
210 | .. S FUNIEN=$O(^PXRMD(802.4,"B",TEMP,""))
|
---|
211 | .. S IND=IND+1
|
---|
212 | .. S LIST=$G(PFSTACK(IND))
|
---|
213 | .. S VALID=$$VLIST(LIST,DAI,TEMP,FUNIEN)
|
---|
214 | .;Check for operator
|
---|
215 | . I OPER[TEMP Q
|
---|
216 | .;Check for number
|
---|
217 | . I TEMP=+TEMP Q
|
---|
218 | .;Check for allowed M function.
|
---|
219 | . I $D(MFUN(TEMP)) Q
|
---|
220 | .;Check for a global reminder variable
|
---|
221 | . I $$ISGRV(TEMP) Q
|
---|
222 | .;Check for a non-executable string.
|
---|
223 | . I $$ISSTR(TEMP) Q
|
---|
224 | . S VALID=0
|
---|
225 | . S TEXT=TEMP_" is not a valid Function Finding element!"
|
---|
226 | . D EN^DDIOL(TEXT)
|
---|
227 | I VALID D
|
---|
228 | . N X
|
---|
229 | . S X="I "_FFSTRING
|
---|
230 | . D ^DIM
|
---|
231 | . I $D(X)=0 S VALID=0
|
---|
232 | I 'VALID D
|
---|
233 | . S TEMP=FFSTRING_" is not a valid function string"
|
---|
234 | . D EN^DDIOL(TEMP)
|
---|
235 | Q VALID
|
---|
236 | ;
|
---|
237 | ;=============================================================
|
---|
238 | VLIST(LIST,DAI,FUNCTION,FUNIEN) ;Make sure the function argument list
|
---|
239 | ;is valid.
|
---|
240 | N AT,IND,LEN,PATTERN,VALID,X
|
---|
241 | S LEN=$L(LIST,",")
|
---|
242 | I LEN=0 D Q 0
|
---|
243 | . N TEXT
|
---|
244 | . S TEXT="The argument list is not defined!"
|
---|
245 | . D EN^DDIOL(TEXT)
|
---|
246 | S PATTERN=$P(^PXRMD(802.4,FUNIEN,0),U,5)
|
---|
247 | S VALID=$S(LIST?@PATTERN:1,1:0)
|
---|
248 | I 'VALID D Q 0
|
---|
249 | . N TEXT
|
---|
250 | . S TEXT="Argument list "_LIST_" is not correct for function "_$P(^PXRMD(802.4,FUNIEN,0),U,1)
|
---|
251 | . D EN^DDIOL(TEXT)
|
---|
252 | F IND=1:1:LEN D
|
---|
253 | . S X=$P(LIST,",",IND)
|
---|
254 | . S AT=$$ARGTYPE^PXRMFFAT(FUNCTION,IND)
|
---|
255 | . I AT="U" S VALID=0 Q
|
---|
256 | . I AT="F",'$$VFINDING(X,DAI) S VALID=0
|
---|
257 | Q VALID
|
---|
258 | ;
|
---|