OCXOCMP ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Main Entry point - All Rules) ;3/21/01 08:50
;;3.0;ORDER ENTRY/RESULTS REPORTING;**32,105,243**;Dec 17,1997;Build 242
;; ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
;
EN ;
;
N OCXQ
;
S OCXQ=$$READ("Y","Do you want to queue the compiler to run ","NO") Q:(OCXQ[U) I OCXQ D Q
.D QUE^OCXOCMPV(10)
.W !!,"Expert system compiler queued to run in 10 seconds."
.W !,"You will be sent a Mailman bulletin when it has finished.",!!
.H 2
;
MAN K ZTSK D MAN^OCXOCMPV Q ; Run the compiler (interactive/manual mode)
; ; Ask for option settings.
;
AUTO D AUTO^OCXOCMPV Q ; Run the compiler (Automatic mode)
; ; Program Execution Trace Mode OFF
; ; Elapsed time logging OFF
; ; Raw Data Logging OFF
;
QUE D QUE^OCXOCMPV(10) Q ; Queue the compiler to run in the background
; ; Uses option setting from last compile.
; ; If no last compile then all options are
; ; turned OFF as in Automatic mode.
RUN ;
;
N OCX1,OCX2,OCX3,OCX4
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(1,20)
;
D MESG("Build list of Active Rules, Elements and Datafields...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP9 D ERMESG("Compiler Aborted while building list of Rules, Elements and Datafields...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(2,20)
;
S OCX1="" F S OCX1=$O(^TMP("OCXCMP",$J,OCX1)) Q:'$L(OCX1) D
.S OCX2=0 F OCX3=0:1 S OCX2=$O(^TMP("OCXCMP",$J,OCX1,OCX2)) Q:'OCX2
.D MESG(" "_$J(OCX3,5)_" "_OCX1_$S(OCX3=1:"",1:"S"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(3,20)
;
D MESG("Compile DataField Navigation code...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP1 D ERMESG("Compiler Aborted due to Datafield syntax errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(4,20)
;
S (OCX3,OCX1)=0 F S OCX1=$O(^TMP("OCXCMP",$J,"DATA FIELD",OCX1)) Q:'OCX1 D
.S OCX2=0 F S OCX2=$O(^TMP("OCXCMP",$J,"DATA FIELD",OCX1,OCX2)) Q:'OCX2 S OCX3=OCX3+1
D MESG(" "_$J(OCX3,5)_" DataField Navigation Code Array"_$S(OCX3=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(5,20)
;
D MESG("Compile Element Evaluation code...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP2 D ERMESG("Compiler Aborted due to Rule Element syntax errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(6,20)
;
S (OCX1,OCX2)=0 F S OCX1=$O(^TMP("OCXCMP",$J,"A CODE",OCX1)) Q:'OCX1 S OCX2=OCX2+1
D MESG(" "_$J(OCX2,5)_" Event Evaluation Code Array"_$S(OCX2=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(7,20)
;
D MESG("Compile Element MetaCode...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMPM D ERMESG("Compiler Aborted due to Element metacode errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(8,20)
;
S OCX1="",OCX2=0 F S OCX1=$O(^TMP("OCXCMP",$J,"INCLUDE",OCX1)) Q:'$L(OCX1) S:($E(OCX1,1,3)="MCE") OCX2=OCX2+1
D MESG(" "_$J(OCX2,5)_" Element Metacode Array"_$S(OCX2=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(9,20)
;
D MESG("Get Compiler Function Code...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMPO D ERMESG("Compiler Aborted due to Compiler Function code errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(10,20)
;
S OCX1="",OCX2=0 F S OCX1=$O(^TMP("OCXCMP",$J,"INCLUDE",OCX1)) Q:'$L(OCX1) S:'($E(OCX1,1,3)="MCE") OCX2=OCX2+1
D MESG(" "_$J(OCX2,5)_" Compiler Include Function"_$S(OCX2=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(12,20)
;
D MESG("Compile Rule Element Relation code...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP3 D ERMESG("Compiler Aborted due to Rule syntax errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(13,20)
;
S (OCX1,OCX2)=0 F S OCX1=$O(^TMP("OCXCMP",$J,"RULE",OCX1)) Q:'OCX1 D
.S OCX3=0 F S OCX3=$O(^TMP("OCXCMP",$J,"RULE",OCX1,OCX3)) Q:'OCX3 S:$O(^(OCX3,"CODE",0)) OCX2=OCX2+1
D MESG(" "_$J(OCX2,5)_" Rule Element Relation Code Array"_$S(OCX2=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(14,20)
;
D MESG("Construct Decision Tree...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP4 D ERMESG("Compiler Aborted due to Compiler errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(15,20)
;
S OCX1=0 F OCX2=0:1 S OCX1=$O(^TMP("OCXCMP",$J,"C CODE",OCX1)) Q:'OCX1
D MESG(" "_$J(OCX2,5)_" Sub-Routine"_$S(OCX2=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(16,20)
;
D MESG("Optimize Sub-Routines...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP5 D ERMESG("Compiler Aborted due to Compiler errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(17,20)
;
S OCX1=0 F OCX3=0:1 S OCX1=$O(^TMP("OCXCMP",$J,"C CODE",OCX1)) Q:'OCX1
D MESG(" "_$J(OCX3,5)_" Sub-Routine"_$S(OCX3=1:"",1:"s"))
D MESG(" "_(100-(((OCX3/OCX2)*1000)\1/10))_"% Optimization")
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(18,20)
;
D MESG("Assemble Routines...")
D SETFLAG^OCXOCMPV ; H 1
I $$EN^OCXOCMP6 D ERMESG("Compiler Aborted due to Compiler errors...") Q
Q:$G(OCXWARN)
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(19,20)
;
S OCX1=0 F OCX2=0:1 S OCX1=$O(^TMP("OCXCMP",$J,"D CODE",OCX1)) Q:'OCX1
D MESG(" "_$J(OCX2,5)_" OCXOZ* Routine"_$S(OCX2=1:"",1:"s"))
;
D:($G(OCXAUTO)<2) STATUS^OCXOPOST(20,20)
;
L -^OCXD(861,1)
;
Q
;
MESG(OCXX) ;
I '$G(OCXAUTO) W !!,OCXX
I ($G(OCXAUTO)=1) D BMES^XPDUTL(.OCXX)
Q
;
ERMESG(OCXX) ;
N OCXY S OCXY=OCXX
I '$G(OCXAUTO) W !!,OCXX
I ($G(OCXAUTO)=1) D BMES^XPDUTL(.OCXX)
S OCXERRM=OCXY
Q
;
READ(OCXZ0,OCXZA,OCXZB,OCXZL) ;
N OCXLINE,DIR,DTOUT,DUOUT,DIRUT,DIROUT
Q:'$L($G(OCXZ0)) U
S DIR(0)=OCXZ0
S:$L($G(OCXZA)) DIR("A")=OCXZA
S:$L($G(OCXZB)) DIR("B")=OCXZB
F OCXLINE=1:1:($G(OCXZL)-1) W !
D ^DIR
I $D(DTOUT)!$D(DUOUT)!$D(DIRUT)!$D(DIROUT) Q U
Q Y
;
Q
;
DT(X,D) N Y,%DT S %DT=D D ^%DT Q Y
Q
;
CNT(X) ;
;
N CNT,D0
S D0=0 F CNT=1:1 S D0=$O(@X@(D0)) Q:'D0
W !!,?10,X," ",CNT
Q CNT
;
DATE() N X,Y,%DT S X="N",%DT="T" D ^%DT X ^DD("DD") Q Y
;
CONV(Y) Q:'(Y["@") Y Q $P(Y,"@",1)_" at "_$P(Y,"@",2,99)
;
;
VERSION() Q $P($T(+3),";;",3)
;
OCXOCMP ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Main Entry point - All Rules) ;3/21/01 08:50
+1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32,105,243**;Dec 17,1997;Build 242
+2 ;; ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
+3 ;
EN ;
+1 ;
+2 NEW OCXQ
+3 ;
+4 SET OCXQ=$$READ("Y","Do you want to queue the compiler to run ","NO")
IF (OCXQ[U)
QUIT
IF OCXQ
Begin DoDot:1
+5 DO QUE^OCXOCMPV(10)
+6 WRITE !!,"Expert system compiler queued to run in 10 seconds."
+7 WRITE !,"You will be sent a Mailman bulletin when it has finished.",!!
+8 HANG 2
End DoDot:1
QUIT
+9 ;
MAN ; Run the compiler (interactive/manual mode)
KILL ZTSK
DO MAN^OCXOCMPV
QUIT
+1 ; ; Ask for option settings.
+2 ;
AUTO ; Run the compiler (Automatic mode)
DO AUTO^OCXOCMPV
QUIT
+1 ; ; Program Execution Trace Mode OFF
+2 ; ; Elapsed time logging OFF
+3 ; ; Raw Data Logging OFF
+4 ;
QUE ; Queue the compiler to run in the background
DO QUE^OCXOCMPV(10)
QUIT
+1 ; ; Uses option setting from last compile.
+2 ; ; If no last compile then all options are
+3 ; ; turned OFF as in Automatic mode.
RUN ;
+1 ;
+2 NEW OCX1,OCX2,OCX3,OCX4
+3 ;
+4 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(1,20)
+5 ;
+6 DO MESG("Build list of Active Rules, Elements and Datafields...")
+7 ; H 1
DO SETFLAG^OCXOCMPV
+8 IF $$EN^OCXOCMP9
DO ERMESG("Compiler Aborted while building list of Rules, Elements and Datafields...")
QUIT
+9 IF $GET(OCXWARN)
QUIT
+10 ;
+11 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(2,20)
+12 ;
+13 SET OCX1=""
FOR
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,OCX1))
IF '$LENGTH(OCX1)
QUIT
Begin DoDot:1
+14 SET OCX2=0
FOR OCX3=0:1
SET OCX2=$ORDER(^TMP("OCXCMP",$JOB,OCX1,OCX2))
IF 'OCX2
QUIT
+15 DO MESG(" "_$JUSTIFY(OCX3,5)_" "_OCX1_$SELECT(OCX3=1:"",1:"S"))
End DoDot:1
+16 ;
+17 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(3,20)
+18 ;
+19 DO MESG("Compile DataField Navigation code...")
+20 ; H 1
DO SETFLAG^OCXOCMPV
+21 IF $$EN^OCXOCMP1
DO ERMESG("Compiler Aborted due to Datafield syntax errors...")
QUIT
+22 IF $GET(OCXWARN)
QUIT
+23 ;
+24 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(4,20)
+25 ;
+26 SET (OCX3,OCX1)=0
FOR
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"DATA FIELD",OCX1))
IF 'OCX1
QUIT
Begin DoDot:1
+27 SET OCX2=0
FOR
SET OCX2=$ORDER(^TMP("OCXCMP",$JOB,"DATA FIELD",OCX1,OCX2))
IF 'OCX2
QUIT
SET OCX3=OCX3+1
End DoDot:1
+28 DO MESG(" "_$JUSTIFY(OCX3,5)_" DataField Navigation Code Array"_$SELECT(OCX3=1:"",1:"s"))
+29 ;
+30 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(5,20)
+31 ;
+32 DO MESG("Compile Element Evaluation code...")
+33 ; H 1
DO SETFLAG^OCXOCMPV
+34 IF $$EN^OCXOCMP2
DO ERMESG("Compiler Aborted due to Rule Element syntax errors...")
QUIT
+35 IF $GET(OCXWARN)
QUIT
+36 ;
+37 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(6,20)
+38 ;
+39 SET (OCX1,OCX2)=0
FOR
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"A CODE",OCX1))
IF 'OCX1
QUIT
SET OCX2=OCX2+1
+40 DO MESG(" "_$JUSTIFY(OCX2,5)_" Event Evaluation Code Array"_$SELECT(OCX2=1:"",1:"s"))
+41 ;
+42 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(7,20)
+43 ;
+44 DO MESG("Compile Element MetaCode...")
+45 ; H 1
DO SETFLAG^OCXOCMPV
+46 IF $$EN^OCXOCMPM
DO ERMESG("Compiler Aborted due to Element metacode errors...")
QUIT
+47 IF $GET(OCXWARN)
QUIT
+48 ;
+49 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(8,20)
+50 ;
+51 SET OCX1=""
SET OCX2=0
FOR
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"INCLUDE",OCX1))
IF '$LENGTH(OCX1)
QUIT
IF ($EXTRACT(OCX1,1,3)="MCE")
SET OCX2=OCX2+1
+52 DO MESG(" "_$JUSTIFY(OCX2,5)_" Element Metacode Array"_$SELECT(OCX2=1:"",1:"s"))
+53 ;
+54 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(9,20)
+55 ;
+56 DO MESG("Get Compiler Function Code...")
+57 ; H 1
DO SETFLAG^OCXOCMPV
+58 IF $$EN^OCXOCMPO
DO ERMESG("Compiler Aborted due to Compiler Function code errors...")
QUIT
+59 IF $GET(OCXWARN)
QUIT
+60 ;
+61 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(10,20)
+62 ;
+63 SET OCX1=""
SET OCX2=0
FOR
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"INCLUDE",OCX1))
IF '$LENGTH(OCX1)
QUIT
IF '($EXTRACT(OCX1,1,3)="MCE")
SET OCX2=OCX2+1
+64 DO MESG(" "_$JUSTIFY(OCX2,5)_" Compiler Include Function"_$SELECT(OCX2=1:"",1:"s"))
+65 ;
+66 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(12,20)
+67 ;
+68 DO MESG("Compile Rule Element Relation code...")
+69 ; H 1
DO SETFLAG^OCXOCMPV
+70 IF $$EN^OCXOCMP3
DO ERMESG("Compiler Aborted due to Rule syntax errors...")
QUIT
+71 IF $GET(OCXWARN)
QUIT
+72 ;
+73 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(13,20)
+74 ;
+75 SET (OCX1,OCX2)=0
FOR
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"RULE",OCX1))
IF 'OCX1
QUIT
Begin DoDot:1
+76 SET OCX3=0
FOR
SET OCX3=$ORDER(^TMP("OCXCMP",$JOB,"RULE",OCX1,OCX3))
IF 'OCX3
QUIT
IF $ORDER(^(OCX3,"CODE",0))
SET OCX2=OCX2+1
End DoDot:1
+77 DO MESG(" "_$JUSTIFY(OCX2,5)_" Rule Element Relation Code Array"_$SELECT(OCX2=1:"",1:"s"))
+78 ;
+79 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(14,20)
+80 ;
+81 DO MESG("Construct Decision Tree...")
+82 ; H 1
DO SETFLAG^OCXOCMPV
+83 IF $$EN^OCXOCMP4
DO ERMESG("Compiler Aborted due to Compiler errors...")
QUIT
+84 IF $GET(OCXWARN)
QUIT
+85 ;
+86 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(15,20)
+87 ;
+88 SET OCX1=0
FOR OCX2=0:1
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"C CODE",OCX1))
IF 'OCX1
QUIT
+89 DO MESG(" "_$JUSTIFY(OCX2,5)_" Sub-Routine"_$SELECT(OCX2=1:"",1:"s"))
+90 ;
+91 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(16,20)
+92 ;
+93 DO MESG("Optimize Sub-Routines...")
+94 ; H 1
DO SETFLAG^OCXOCMPV
+95 IF $$EN^OCXOCMP5
DO ERMESG("Compiler Aborted due to Compiler errors...")
QUIT
+96 IF $GET(OCXWARN)
QUIT
+97 ;
+98 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(17,20)
+99 ;
+100 SET OCX1=0
FOR OCX3=0:1
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"C CODE",OCX1))
IF 'OCX1
QUIT
+101 DO MESG(" "_$JUSTIFY(OCX3,5)_" Sub-Routine"_$SELECT(OCX3=1:"",1:"s"))
+102 DO MESG(" "_(100-(((OCX3/OCX2)*1000)\1/10))_"% Optimization")
+103 ;
+104 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(18,20)
+105 ;
+106 DO MESG("Assemble Routines...")
+107 ; H 1
DO SETFLAG^OCXOCMPV
+108 IF $$EN^OCXOCMP6
DO ERMESG("Compiler Aborted due to Compiler errors...")
QUIT
+109 IF $GET(OCXWARN)
QUIT
+110 ;
+111 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(19,20)
+112 ;
+113 SET OCX1=0
FOR OCX2=0:1
SET OCX1=$ORDER(^TMP("OCXCMP",$JOB,"D CODE",OCX1))
IF 'OCX1
QUIT
+114 DO MESG(" "_$JUSTIFY(OCX2,5)_" OCXOZ* Routine"_$SELECT(OCX2=1:"",1:"s"))
+115 ;
+116 IF ($GET(OCXAUTO)<2)
DO STATUS^OCXOPOST(20,20)
+117 ;
+118 LOCK -^OCXD(861,1)
+119 ;
+120 QUIT
+121 ;
MESG(OCXX) ;
+1 IF '$GET(OCXAUTO)
WRITE !!,OCXX
+2 IF ($GET(OCXAUTO)=1)
DO BMES^XPDUTL(.OCXX)
+3 QUIT
+4 ;
ERMESG(OCXX) ;
+1 NEW OCXY
SET OCXY=OCXX
+2 IF '$GET(OCXAUTO)
WRITE !!,OCXX
+3 IF ($GET(OCXAUTO)=1)
DO BMES^XPDUTL(.OCXX)
+4 SET OCXERRM=OCXY
+5 QUIT
+6 ;
READ(OCXZ0,OCXZA,OCXZB,OCXZL) ;
+1 NEW OCXLINE,DIR,DTOUT,DUOUT,DIRUT,DIROUT
+2 IF '$LENGTH($GET(OCXZ0))
QUIT U
+3 SET DIR(0)=OCXZ0
+4 IF $LENGTH($GET(OCXZA))
SET DIR("A")=OCXZA
+5 IF $LENGTH($GET(OCXZB))
SET DIR("B")=OCXZB
+6 FOR OCXLINE=1:1:($GET(OCXZL)-1)
WRITE !
+7 DO ^DIR
+8 IF $DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIRUT)!$DATA(DIROUT)
QUIT U
+9 QUIT Y
+10 ;
+11 QUIT
+12 ;
DT(X,D) NEW Y,%DT
SET %DT=D
DO ^%DT
QUIT Y
+1 QUIT
+2 ;
CNT(X) ;
+1 ;
+2 NEW CNT,D0
+3 SET D0=0
FOR CNT=1:1
SET D0=$ORDER(@X@(D0))
IF 'D0
QUIT
+4 WRITE !!,?10,X," ",CNT
+5 QUIT CNT
+6 ;
DATE() NEW X,Y,%DT
SET X="N"
SET %DT="T"
DO ^%DT
XECUTE ^DD("DD")
QUIT Y
+1 ;
CONV(Y) IF '(Y["@")
QUIT Y
QUIT $PIECE(Y,"@",1)_" at "_$PIECE(Y,"@",2,99)
+1 ;
+2 ;
VERSION() QUIT $PIECE($TEXT(+3),";;",3)
+1 ;