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