1 | PXRMCOND ; SLC/PKR - Routines for evaluating conditions. ;06/01/2007
|
---|
2 | ;;2.0;CLINICAL REMINDERS;**6**;Feb 04, 2005;Build 123
|
---|
3 | ;
|
---|
4 | ;============================================================
|
---|
5 | CASESEN(X,DA,FILENUM) ;
|
---|
6 | ;Called by xref on condition case sensitive field in 811.5 and 811.9.
|
---|
7 | N COND,GBL
|
---|
8 | S GBL=$$GET1^DID(FILENUM,"","","GLOBAL NAME")
|
---|
9 | S GBL=GBL_DA(1)_",20,"_DA_",3)"
|
---|
10 | S COND=$P(@GBL,U,1)
|
---|
11 | D SICOND(COND,.DA,FILENUM)
|
---|
12 | Q
|
---|
13 | ;
|
---|
14 | ;============================================================
|
---|
15 | COND(CASESEN,ICOND,VSLIST,VA) ;Evaluate the condition.
|
---|
16 | N CONVAL,IND,JND,NSTAR,SUB,TEMP,V,VSTAR
|
---|
17 | S CONVAL=""
|
---|
18 | ;If there is no condition return true.
|
---|
19 | I $L($G(ICOND))=0 Q 1
|
---|
20 | S NSTAR=0
|
---|
21 | F IND=1:1 S SUB=$P(VSLIST,";",IND) Q:SUB="" D
|
---|
22 | . I SUB["*" S NSTAR=NSTAR+1,VSTAR(NSTAR)=$L(SUB,",")_U_SUB
|
---|
23 | S V=$G(VA("VALUE"))
|
---|
24 | I 'CASESEN S V=$$UP^XLFSTR(V)
|
---|
25 | ;Move all non "*" elements of VA into V.
|
---|
26 | I VSLIST'="" D MV(VSLIST,CASESEN,.V,.VA)
|
---|
27 | I NSTAR=0 X ICOND S CONVAL=$T
|
---|
28 | I NSTAR>0 S CONVAL=$$STARCOND(CASESEN,ICOND,.V,.VA,NSTAR,.VSTAR)
|
---|
29 | Q CONVAL
|
---|
30 | ;
|
---|
31 | ;============================================================
|
---|
32 | KICOND(X,DA,FILENUM) ;
|
---|
33 | ;Do not execute as part of a verify fields.
|
---|
34 | I $G(DIUTIL)="VERIFY FIELDS" Q
|
---|
35 | ;Do not execute as part of exchange.
|
---|
36 | I $G(PXRMEXCH) Q
|
---|
37 | S FILENUM=$G(FILENUM)
|
---|
38 | I FILENUM=811.5 K ^PXRMD(811.5,DA(1),20,DA,10),^PXRMD(811.5,DA(1),20,DA,11)
|
---|
39 | I FILENUM=811.9 K ^PXD(811.9,DA(1),20,DA,10),^PXD(811.9,DA(1),20,DA,11)
|
---|
40 | Q
|
---|
41 | ;
|
---|
42 | ;============================================================
|
---|
43 | MV(VSLIST,CASESEN,V,VA) ;Move the elements of VA included in VSLIST
|
---|
44 | ;into V and uppercase if necessary.
|
---|
45 | N IND,NE,RV,RVA,SUB
|
---|
46 | S NE=$L(VSLIST,";")-1
|
---|
47 | F IND=1:1:NE D
|
---|
48 | . S SUB=$P(VSLIST,";",IND)
|
---|
49 | . I SUB["*" Q
|
---|
50 | . S RV="V("_SUB_")",RVA="VA("_SUB_")"
|
---|
51 | .;If VA(SUB) does not exist skip it.
|
---|
52 | . I '$D(@RVA) Q
|
---|
53 | . S @RV=$S('CASESEN:$$UP^XLFSTR(@RVA),1:@RVA)
|
---|
54 | Q
|
---|
55 | ;
|
---|
56 | ;============================================================
|
---|
57 | RECSUB(IND,V,VA,NSTAR,VSTAR,NM,VM,CASESEN,ICOND,CONVAL) ;Called recursively,
|
---|
58 | ;first substitutes V array elements with "*" in subscript with a
|
---|
59 | ;replacement value. Once all have been replaced test condition and
|
---|
60 | ;quit if true. If not true continue until all combinations have been
|
---|
61 | ;tested.
|
---|
62 | N JND,RV,RVA,VSUB,VASUB
|
---|
63 | F JND=1:1:NM(IND) Q:CONVAL D
|
---|
64 | . S VASUB=VM(IND,JND)
|
---|
65 | . S RVA="VA("_VASUB_")"
|
---|
66 | . S SUB=$P(VSTAR(IND),U,2)
|
---|
67 | . S RV="V("_SUB_")"
|
---|
68 | . S @RV=$S('CASESEN:$$UP^XLFSTR(@RVA),1:@RVA)
|
---|
69 | . I IND<NSTAR D RECSUB(IND+1,.V,.VA,NSTAR,.VSTAR,.NM,.VM,CASESEN,ICOND,.CONVAL)
|
---|
70 | . I IND=NSTAR X ICOND S CONVAL=$T
|
---|
71 | ;If there were no substitutions to make, make sure the condition is
|
---|
72 | ;evaluated.
|
---|
73 | I 'CONVAL,IND=NSTAR,NM(IND)=0 X ICOND S CONVAL=$T
|
---|
74 | Q
|
---|
75 | ;
|
---|
76 | ;============================================================
|
---|
77 | SCPAR(FINDPA,CASESEN,COND,UCIFS,ICOND,VSLIST) ;Set the Condition parameters.
|
---|
78 | N CONDS
|
---|
79 | S CONDS=$G(FINDPA(3))
|
---|
80 | S COND=$P(CONDS,U,1)
|
---|
81 | ;Even if there is no condition UCIFS could be used for status search.
|
---|
82 | S UCIFS=$P(CONDS,U,3)
|
---|
83 | I COND="" Q
|
---|
84 | S CASESEN=$P(CONDS,U,2)
|
---|
85 | I CASESEN="" S CASESEN=1
|
---|
86 | S ICOND=FINDPA(10),VSLIST=FINDPA(11)
|
---|
87 | Q
|
---|
88 | ;
|
---|
89 | ;============================================================
|
---|
90 | SICOND(X,DA,FILENUM) ;Set the internal condition field. Wrap all V() in $G.
|
---|
91 | ;Called by xref on condition field in 811.5 and 811.9.
|
---|
92 | I X="" Q
|
---|
93 | ;Do not execute as part of a verify fields.
|
---|
94 | I $G(DIUTIL)="VERIFY FIELDS" Q
|
---|
95 | ;Do not execute as part of exchange.
|
---|
96 | I $G(PXRMEXCH) Q
|
---|
97 | N CASESEN,GBL,ICOND,IND,SE,SS,SUB,SUBLIST,TEMP,VSLIST,VWSUB,XUP
|
---|
98 | S GBL=$$GET1^DID(FILENUM,"","","GLOBAL NAME")
|
---|
99 | S GBL=GBL_DA(1)_",20,"_DA_",3)"
|
---|
100 | S CASESEN=$P(@GBL,U,2)
|
---|
101 | I CASESEN="" S CASESEN=1
|
---|
102 | ;Find each V("sub") entry.
|
---|
103 | S XUP=$$UP^XLFSTR(X)
|
---|
104 | I 'CASESEN S (ICOND,X)=XUP
|
---|
105 | I CASESEN S ICOND=$$STRREP^PXRMUTIL(X,"v(","V(")
|
---|
106 | S SS=1,VSLIST=""
|
---|
107 | F S SS=$F(XUP,"V(",SS) Q:SS=0 D
|
---|
108 | . S SE=$F(X,")",SS)
|
---|
109 | . S SUB=$E(X,SS,SE-2)
|
---|
110 | . I $D(SUBLIST(SUB)) Q
|
---|
111 | . S SUBLIST(SUB)=""
|
---|
112 | . S VSLIST=VSLIST_SUB_";"
|
---|
113 | . S VWSUB="V("_SUB_")"
|
---|
114 | . S TEMP="$G("_VWSUB_")"
|
---|
115 | . S ICOND=$$STRREP^PXRMUTIL(ICOND,VWSUB,TEMP)
|
---|
116 | I FILENUM=811.5 S ^PXRMD(811.5,DA(1),20,DA,10)=ICOND,^PXRMD(811.5,DA(1),20,DA,11)=VSLIST
|
---|
117 | I FILENUM=811.9 S ^PXD(811.9,DA(1),20,DA,10)=ICOND,^PXD(811.9,DA(1),20,DA,11)=VSLIST
|
---|
118 | Q
|
---|
119 | ;
|
---|
120 | ;============================================================
|
---|
121 | STARCOND(CASESEN,ICOND,V,VA,NSTAR,VSTAR) ;Execute a star condition,
|
---|
122 | ;look for any replacements for the * subscripts that will make the
|
---|
123 | ;Condition true.
|
---|
124 | N CONVAL,IND,JND,KND,MATCH,NEWV,NM,NVA,ORV,REF,SUB,SUBL,TCOND,TEMP
|
---|
125 | N VASUB,VSSUB,VM
|
---|
126 | ;Build a list of the subscripts in VA.
|
---|
127 | S NVA=0,REF="VA"
|
---|
128 | F S REF=$Q(@REF) Q:REF="" D
|
---|
129 | . S SUB=$P(REF,"(",2)
|
---|
130 | . S SUB=$P(SUB,")",1)
|
---|
131 | . S SUBL=$L(SUB,",")
|
---|
132 | . S NVA=NVA+1,VASUB(NVA)=SUBL_U_SUB
|
---|
133 | ;Build a list of replacements for the * subscripts.
|
---|
134 | F IND=1:1:NSTAR D
|
---|
135 | . S NM=0
|
---|
136 | . S VSSUB=$P(VSTAR(IND),U,2)
|
---|
137 | . S SUBL=+VSTAR(IND)
|
---|
138 | . F JND=1:1:NVA D
|
---|
139 | .. I +VASUB(JND)'=SUBL Q
|
---|
140 | .. S SUB=$P(VASUB(JND),U,2)
|
---|
141 | .. S MATCH=1
|
---|
142 | .. F KND=1:1:SUBL D
|
---|
143 | ... S TEMP=$P(VSSUB,",",KND)
|
---|
144 | ... I TEMP["*" Q
|
---|
145 | ... I $P(SUB,",",KND)'=TEMP S MATCH=0,KND=SUBL
|
---|
146 | .. I MATCH S NM=NM+1,VM(IND,NM)=SUB
|
---|
147 | . S NM(IND)=NM
|
---|
148 | S CONVAL=0
|
---|
149 | F IND=1:1:NSTAR Q:CONVAL D RECSUB(IND,.V,.VA,NSTAR,.VSTAR,.NM,.VM,CASESEN,ICOND,.CONVAL)
|
---|
150 | Q CONVAL
|
---|
151 | ;
|
---|
152 | ;============================================================
|
---|
153 | VCOND(X) ;
|
---|
154 | ;Input transform on Condition field.
|
---|
155 | ;Do not execute as part of exchange.
|
---|
156 | I $G(PXRMEXCH) Q 1
|
---|
157 | ;The CONDITION must start with "I ".
|
---|
158 | S X=$$UP^XLFSTR(X)
|
---|
159 | I $E(X,1,2)'="I " D Q 0
|
---|
160 | . S X=""
|
---|
161 | . D EN^DDIOL("CONDITION must start with ""I"" followed by a single space")
|
---|
162 | ;The CONDITION cannot contain "^".
|
---|
163 | I X["^" D Q 0
|
---|
164 | . S X=""
|
---|
165 | . D EN^DDIOL("CONDITION cannot contain ""^""")
|
---|
166 | ;The CONDITION cannot contain "@".
|
---|
167 | I X["@" D Q 0
|
---|
168 | . S X=""
|
---|
169 | . D EN^DDIOL("CONDITION cannot contain ""@""")
|
---|
170 | ;The rest of the condition can only contain spaces if they are in
|
---|
171 | ;a string.
|
---|
172 | N COND,TEMP,VALID
|
---|
173 | S COND=$E(X,3,$L(X))
|
---|
174 | S VALID=$S(COND[" ":$$VSPACE(COND),1:1)
|
---|
175 | I VALID S VALID=$S(COND["V(":$$VSUB(COND),1:1)
|
---|
176 | I VALID D
|
---|
177 | . D ^DIM
|
---|
178 | . I '$D(X) D
|
---|
179 | .. D EN^DDIOL("Not a valid MUMPS string")
|
---|
180 | .. S VALID=0
|
---|
181 | Q VALID
|
---|
182 | ;
|
---|
183 | ;============================================================
|
---|
184 | VSPACE(COND) ;Make sure all spaces in the condition that come after
|
---|
185 | ;the beginning I are inside a quoted string.
|
---|
186 | N CHAR,IND,IQ,JND,LQ,NIQ,NQP,NSP,QP,SP,SPACE,VALID
|
---|
187 | S VALID=1
|
---|
188 | S (LQ,NQP,NSP)=0
|
---|
189 | F IND=1:1:$L(COND) D
|
---|
190 | . S CHAR=$E(COND,IND)
|
---|
191 | . I CHAR="""" D
|
---|
192 | .. I LQ S NQP=NQP+1,QP(NQP)=LQ_U_IND,LQ=0
|
---|
193 | .. E S LQ=IND
|
---|
194 | . I CHAR=" " S NSP=NSP+1,SP(NSP)=IND
|
---|
195 | S NIQ=0
|
---|
196 | F IND=1:1:NSP D
|
---|
197 | . S SPACE=SP(NSP)
|
---|
198 | . S IQ=0
|
---|
199 | . F JND=1:1:NQP D
|
---|
200 | .. I SPACE>$P(QP(JND),U,1),SPACE<$P(QP(JND),U,2) S IQ=1,JND=NQP Q
|
---|
201 | . S NIQ=$S(IQ:0,1:1)
|
---|
202 | . I NIQ S IND=NSP Q
|
---|
203 | I NIQ D
|
---|
204 | . D EN^DDIOL("No spaces are allowed except in quoted strings!")
|
---|
205 | . S VALID=0
|
---|
206 | Q VALID
|
---|
207 | ;
|
---|
208 | ;============================================================
|
---|
209 | VSUB(COND) ;Make sure all V subscripts are quoted strings, numbers
|
---|
210 | ;or quoted * strings.
|
---|
211 | N IND,RP,SS,SUB,SUBL,VALID
|
---|
212 | S (SS,VALID)=1
|
---|
213 | F S SS=$F(COND,"V(",SS) Q:('VALID)!(SS=0) D
|
---|
214 | . S RP=$F(COND,")",SS)-2
|
---|
215 | . I RP=-2 D Q
|
---|
216 | .. N TEXT
|
---|
217 | .. S TEXT=$E(COND,SS-2,$L(COND))_" is missing a "")"""
|
---|
218 | .. D EN^DDIOL(TEXT)
|
---|
219 | .. S VALID=0
|
---|
220 | . S SUBL=$E(COND,SS,RP)
|
---|
221 | . F IND=1:1:$L(SUBL,",") D
|
---|
222 | .. S SUB=$P(SUBL,",",IND)
|
---|
223 | ..;Check for a number.
|
---|
224 | .. I SUB=+SUB Q
|
---|
225 | ..;Check for a wildcard, must be in quotes any number of * allowed.
|
---|
226 | .. I SUB?1"""1"*"."*"""" Q
|
---|
227 | .. ;Check for first and last character = to a ".
|
---|
228 | .. I ($E(SUB,1)'="""")!($E(SUB,$L(SUB))'="""") S VALID=0
|
---|
229 | I 'VALID D EN^DDIOL("All V subscripts must be quoted strings, numbers or *!")
|
---|
230 | Q VALID
|
---|
231 | ;
|
---|