[613] | 1 | OCXOCMP9 ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Build List of Active Rules, Elements and Data Fields) ;3/27/01 07:29
|
---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32,105**;Dec 17,1997
|
---|
| 3 | ;; ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
|
---|
| 4 | ;
|
---|
| 5 | Q
|
---|
| 6 | EN() ;
|
---|
| 7 | Q:$G(OCXWARN) 1
|
---|
| 8 | ;
|
---|
| 9 | S OCXDLK=$O(^OCXS(860.6,"B","DATABASE LOOKUP",0))
|
---|
| 10 | ;
|
---|
| 11 | N RESCAN
|
---|
| 12 | ;
|
---|
| 13 | S OCXD0=0 F S OCXD0=$O(^OCXS(860.2,OCXD0)) Q:'OCXD0 D
|
---|
| 14 | .Q:$G(^OCXS(860.2,OCXD0,"INACT"))
|
---|
| 15 | .I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 16 | .S ^TMP("OCXCMP",$J,"RULE",OCXD0)=""
|
---|
| 17 | .S OCXD1=0 F S OCXD1=$O(^OCXS(860.2,OCXD0,"C",OCXD1)) Q:'OCXD1 D Q:OCXWARN
|
---|
| 18 | ..N OCXEL,OCXEXP
|
---|
| 19 | ..S OCXEL=+$P($G(^OCXS(860.2,OCXD0,"C",OCXD1,0)),U,2) I OCXEL,$D(^OCXS(860.3,OCXEL,0)) D
|
---|
| 20 | ...I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 21 | ...S ^TMP("OCXCMP",$J,"ELEMENT",OCXEL)=$G(^TMP("OCXCMP",$J,"ELEMENT",OCXEL))+1
|
---|
| 22 | ...S ^TMP("OCXCMP",$J,"ELEMENT",OCXEL,"CON")=+$P($G(^OCXS(860.3,OCXEL,0)),U,2)
|
---|
| 23 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"C",OCXD1,"EXP")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,OCXEL,0,"EXP") Q:OCXWARN
|
---|
| 24 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"C",OCXD1,"SEL")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,OCXEL,1,"SEL") Q:OCXWARN
|
---|
| 25 | .Q:OCXWARN
|
---|
| 26 | .S OCXD1=0 F S OCXD1=$O(^OCXS(860.2,OCXD0,"R",OCXD1)) Q:'OCXD1 D Q:OCXWARN
|
---|
| 27 | ..N OCXEXP
|
---|
| 28 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"R",OCXD1,"E")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,0,0,"REL") Q:OCXWARN
|
---|
| 29 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"R",OCXD1,"MSG")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,0,0,"MSG") Q:OCXWARN
|
---|
| 30 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"R",OCXD1,"OCMSG")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,0,0,"MSG") Q:OCXWARN
|
---|
| 31 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"R",OCXD1,"RULE")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,0,0,"MSG") Q:OCXWARN
|
---|
| 32 | ..S OCXEXP=$G(^OCXS(860.2,OCXD0,"R",OCXD1,"MCODE")) I $L(OCXEXP) D GETDF(OCXD0,OCXEXP,0,0,"MCODE") Q:OCXWARN
|
---|
| 33 | ;
|
---|
| 34 | S OCXD1=0 F S OCXD1=$O(^TMP("OCXCMP",$J,"ELEMENT",OCXD1)) Q:'OCXD1 D Q:OCXWARN
|
---|
| 35 | .S OCXD2=0 F S OCXD2=$O(^OCXS(860.3,OCXD1,"COND",OCXD2)) Q:'OCXD2 D Q:OCXWARN
|
---|
| 36 | ..F OCXSUB=1,2,3 S OCXDF=+$G(^OCXS(860.3,OCXD1,"COND",OCXD2,"DFLD"_OCXSUB)) I OCXDF,$D(^OCXS(860.4,OCXDF,0)) D Q:OCXWARN
|
---|
| 37 | ...I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 38 | ...S ^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)=$G(^TMP("OCXCMP",$J,"DATA FIELD",OCXDF))+1
|
---|
| 39 | ;
|
---|
| 40 | I $O(^TMP("OCXCMP",$J,"RULE",0)) D
|
---|
| 41 | .N OCXDFN,OCXDF
|
---|
| 42 | .F OCXDFN="PATIENT IEN" S OCXDF=$O(^OCXS(860.4,"B",OCXDFN,0)) D
|
---|
| 43 | ..S ^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)=$G(^TMP("OCXCMP",$J,"DATA FIELD",OCXDF))+1
|
---|
| 44 | ;
|
---|
| 45 | F D Q:'RESCAN
|
---|
| 46 | .S (RESCAN,OCXD1)=0 F S OCXD1=$O(^TMP("OCXCMP",$J,"DATA FIELD",OCXD1)) Q:'OCXD1 D
|
---|
| 47 | ..N OCXPATH,OCXLINK,OCXPAR,OCXVAL,OCXCON
|
---|
| 48 | ..S OCXCON=0 F S OCXCON=$O(^OCXS(860.4,OCXD1,"LINK",OCXCON)) Q:'OCXCON D
|
---|
| 49 | ...S OCXPATH=$G(^OCXS(860.4,OCXD1,"LINK",OCXCON,"DATAPATH")) Q:'$L(OCXPATH)
|
---|
| 50 | ...S OCXLINK=$O(^OCXS(863.3,"B",OCXPATH,0)) Q:'OCXLINK
|
---|
| 51 | ...S OCXPAR=0 F S OCXPAR=$O(^OCXS(863.3,OCXLINK,"PAR",OCXPAR)) Q:'OCXPAR S OCXVAL=$G(^(OCXPAR,"VAL")) D
|
---|
| 52 | ....Q:'(OCXVAL["|")
|
---|
| 53 | ....N OCXPIEC
|
---|
| 54 | ....F OCXPIEC=2:2:$L(OCXVAL,"|") D
|
---|
| 55 | .....N OCXDF,OCXDFN
|
---|
| 56 | .....S OCXDF=$P(OCXVAL,"|",OCXPIEC) Q:'$L(OCXDF)
|
---|
| 57 | .....S OCXDFN=0 F S OCXDFN=$O(^OCXS(860.4,"B",$E(OCXDF,1,30),OCXDFN)) Q:'OCXDFN I ($P($G(^OCXS(860.4,OCXDFN,0)),U,1)=OCXDF) D
|
---|
| 58 | ......I '$D(^TMP("OCXCMP",$J,"DATA FIELD",OCXDFN)) S RESCAN=1,^TMP("OCXCMP",$J,"DATA FIELD",OCXDFN)=0
|
---|
| 59 | .....S OCXDFN=0 F S OCXDFN=$O(^OCXS(860.4,"C",OCXDF,OCXDFN)) Q:'OCXDFN D
|
---|
| 60 | ......I '$D(^TMP("OCXCMP",$J,"DATA FIELD",OCXDFN)) S RESCAN=1,^TMP("OCXCMP",$J,"DATA FIELD",OCXDFN)=0
|
---|
| 61 | ;
|
---|
| 62 | Q:$G(OCXWARN) 1 Q '$O(^TMP("OCXCMP",$J,"RULE",0))
|
---|
| 63 | ;
|
---|
| 64 | GETDF(OCXD0,OCXSTR,OCXELM,OCXREF,OCXSRC) ;
|
---|
| 65 | ;
|
---|
| 66 | N OCXPC,OCXFLD,OCXCON,OCXLABL,OCXDF,OCXFSPEC,OCXD1
|
---|
| 67 | Q:'(OCXSTR["|")
|
---|
| 68 | F OCXPC=2:2:$L(OCXSTR,"|") D Q:OCXWARN
|
---|
| 69 | .S OCXFSPEC=$P($P(OCXSTR,"|",OCXPC),"|",1),(OCXFLD,OCXLABL)=""
|
---|
| 70 | .I (OCXFSPEC[".") D Q
|
---|
| 71 | ..I OCXELM,(OCXSRC="SEL") D WARN^OCXOCMPV(" '"_OCXFSPEC_"' cannot specify Label in selector.",2,OCXD0) Q
|
---|
| 72 | ..S OCXLABL=$P(OCXFSPEC,".",1),OCXFLD=$P(OCXFSPEC,".",2)
|
---|
| 73 | ..I '$L(OCXLABL)!'$L(OCXFLD)!($L(OCXFSPEC,".")>2) D Q
|
---|
| 74 | ...D WARN^OCXOCMPV(" Illegal use of period '.' in Field Specifier '"_OCXFSPEC_"'",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 75 | ..S OCXELE=+$P($$LABEL(OCXD0,OCXLABL),U,2) I 'OCXELE D WARN^OCXOCMPV(" Label '"_OCXLABL_"' not defined in this rule.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 76 | ..S OCXCON=$$DATACON(+OCXELE)
|
---|
| 77 | ..I '$L(OCXCON) D WARN^OCXOCMPV(" Data context not defined for element '"_$P(^OCXS(860.3,+OCXELE,0),U,1)_"'.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 78 | ..S OCXDF=$$DATAFLD(OCXFLD,OCXCON)
|
---|
| 79 | ..I (OCXDF=-1) D WARN^OCXOCMPV(" "_OCXFLD_" data field name not unique.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 80 | ..I (OCXDF=-2) D WARN^OCXOCMPV(" "_OCXFLD_" data field not in Data Field file.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 81 | ..I 'OCXDF S OCXDF=$$DATAFLD(OCXFLD,OCXDLK)
|
---|
| 82 | ..I 'OCXDF D WARN^OCXOCMPV(" "_OCXFLD_" data field not defined for "_OCXCON_" data context.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 83 | ..I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 84 | ..S ^TMP("OCXCMP",$J,"ELEMENT",OCXELE,"DATA",OCXDF)=OCXREF
|
---|
| 85 | ..I '$D(^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)) D
|
---|
| 86 | ...I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 87 | ...S ^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)=1
|
---|
| 88 | .;
|
---|
| 89 | .I OCXELM D Q
|
---|
| 90 | ..S OCXFLD=OCXFSPEC,OCXDF=0
|
---|
| 91 | ..S OCXCON=$$DATACON(+OCXELM) Q:'$L(OCXCON)
|
---|
| 92 | ..S OCXDF=$$DATAFLD(OCXFLD,OCXCON)
|
---|
| 93 | ..I (OCXDF=-1) D WARN^OCXOCMPV(" "_OCXFLD_" data field name not unique.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 94 | ..I (OCXDF=-2) D WARN^OCXOCMPV(" "_OCXFLD_" data field not in Data Field file.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 95 | ..I 'OCXDF S OCXDF=$$DATAFLD(OCXFLD,OCXDLK)
|
---|
| 96 | ..I 'OCXDF D WARN^OCXOCMPV(" "_OCXFLD_" data field not defined for "_OCXCON_" data context.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 97 | ..I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 98 | ..S ^TMP("OCXCMP",$J,"ELEMENT",OCXELM,"DATA",OCXDF)=OCXREF
|
---|
| 99 | ..I '$D(^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)) D
|
---|
| 100 | ...I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 101 | ...S ^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)=1
|
---|
| 102 | .;
|
---|
| 103 | .S OCXFLD=OCXFSPEC,OCXDF=0
|
---|
| 104 | .S OCXD1=0 F S OCXD1=$O(^OCXS(860.2,OCXD0,"C",OCXD1)) Q:'OCXD1 D
|
---|
| 105 | ..S OCXELE=+$P($G(^OCXS(860.2,OCXD0,"C",OCXD1,0)),U,2) Q:'OCXELE
|
---|
| 106 | ..S OCXCON=$$DATACON(+OCXELE) Q:'$L(OCXCON)
|
---|
| 107 | ..S OCXDF=$$DATAFLD(OCXFLD,OCXCON)
|
---|
| 108 | ..I (OCXDF=-1) D WARN^OCXOCMPV(" "_OCXFLD_" data field name not unique.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 109 | ..I (OCXDF=-2) D WARN^OCXOCMPV(" "_OCXFLD_" data field not in Data Field file.",2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
| 110 | ..S:'OCXDF OCXDF=$$DATAFLD(OCXFLD,OCXDLK)
|
---|
| 111 | ..Q:'OCXDF
|
---|
| 112 | ..;
|
---|
| 113 | ..I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 114 | ..S ^TMP("OCXCMP",$J,"ELEMENT",OCXELE,"DATA",OCXDF)=OCXREF
|
---|
| 115 | ..I '$D(^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)) D
|
---|
| 116 | ...I '$G(OCXAUTO) W:($X>60) ! W "."
|
---|
| 117 | ...S ^TMP("OCXCMP",$J,"DATA FIELD",OCXDF)=1
|
---|
| 118 | Q
|
---|
| 119 | ;
|
---|
| 120 | DATACON(OCXEL) ;
|
---|
| 121 | ;
|
---|
| 122 | Q +$P($G(^OCXS(860.3,OCXEL,0)),U,2)
|
---|
| 123 | ;
|
---|
| 124 | LABEL(OCXD0,OCXLABL) ;
|
---|
| 125 | ;
|
---|
| 126 | N OCXEL
|
---|
| 127 | Q:'$L(OCXLABL) 0 S OCXEL=+$O(^OCXS(860.2,OCXD0,"C","B",OCXLABL,0)) Q:'OCXEL 0
|
---|
| 128 | Q (+OCXEL)_U_+$P($G(^OCXS(860.2,OCXD0,"C",OCXEL,0)),U,2)
|
---|
| 129 | ;
|
---|
| 130 | DATAFLD(FNAM,CONTXT) ;
|
---|
| 131 | ;
|
---|
| 132 | N FNUM,D0
|
---|
| 133 | Q:'$G(CONTXT) 0
|
---|
| 134 | S FNUM=$O(^OCXS(860.4,"C",FNAM,0))
|
---|
| 135 | I 'FNUM S FNUM=0 F S FNUM=$O(^OCXS(860.4,"B",$E(FNAM,1,30),FNUM)) Q:'FNUM Q:($P($G(^OCXS(860.4,FNUM,0)),U,1)=FNAM)
|
---|
| 136 | I 'FNUM Q -2
|
---|
| 137 | ;
|
---|
| 138 | Q:$O(^OCXS(860.4,"B",FNAM,FNUM)) -1
|
---|
| 139 | Q:$L($G(^OCXS(860.4,FNUM,"LINK",CONTXT,"DATAPATH"))) FNUM
|
---|
| 140 | Q 0
|
---|
| 141 | ;
|
---|