PXRMENOD ;SLC/PKR - Clinical Reminders "E" node routines. ;06/26/2013
;;2.0;CLINICAL REMINDERS;**4,6,18,26**;Feb 04, 2005;Build 404
;
;========================================================
DEPLIST(IEN,DEP) ;Build the evaluation dependency list.
N BDT,EDT,FI1,FI2,TEMP
S FI1=0
F S FI1=+$O(^PXD(811.9,IEN,20,FI1)) Q:FI1=0 D
. S TEMP=^PXD(811.9,IEN,20,FI1,0)
. S BDT=$P(TEMP,U,8)
. S EDT=$P(TEMP,U,11)
. S DEP(FI1)=""
. I BDT["FIEVAL" S FI2=$E(BDT,8,$F(BDT,",")-2),DEP(FI1,FI2)="BDT"
. I EDT["FIEVAL" S FI2=$E(EDT,8,$F(EDT,",")-2),DEP(FI1,FI2)="EDT"
Q
;
;========================================================
EVORDER(IEN,DEP,EORDER,NODEP,ERROR) ;Determine the evaluation order for findings
;that depend of the date of other findings. The structure of EORDER
;is EORDER(N)=finding number, where N is the evaluation order.
N CLIST,DONE,IND,JND,KND,ONLIST,NUM,TEXT
S IND="",ERROR=0
F S IND=$O(DEP(IND)) Q:IND="" D
.;If finding IND has no dependencies, i.e., $D=1 quit. If there are
.;dependencies $D=10.
. I $D(DEP(IND))=1 Q
. S JND=IND-1
. F S JND=$O(DEP(IND,JND)) Q:JND="" D
..;Make sure dependent finding exists.
.. I '$D(^PXD(811.9,IEN,20,JND,0)) D
... K TEXT
... S TEXT(1)="Error: date of finding "_IND_" depends of date of finding "_JND_" and finding "_JND_" does"
... S TEXT(2)=" not exist."
... D EN^DDIOL(.TEXT)
... S ERROR=1
..;Check for reflective dependencies.
.. I $D(DEP(JND,IND)) D
... K TEXT
... S TEXT(1)="Error: date of finding "_IND_" depends of date of finding "_JND_" and"
... S TEXT(2)=" date of finding "_JND_" depends on date of finding "_IND
... D EN^DDIOL(.TEXT)
... S ERROR=1
I ERROR Q
;No errors found, build evaluation order lists.
;First check for findings with no dependencies.
S IND=""
F S IND=$O(DEP(IND)) Q:IND="" I $D(DEP(IND))=1 S NODEP(IND)=""
;Build the dependency list.
S IND="",NUM=0
F S IND=$O(DEP(IND)) Q:IND="" D
. I $D(NODEP(IND)) Q
. S JND=""
. F S JND=$O(DEP(IND,JND)) Q:JND="" D
.. I $D(NODEP(JND)) Q
.. S KND="",ONLIST=0
.. F S KND=$O(EORDER(KND)) Q:KND="" I EORDER(KND)=JND S ONLIST=1
.. I 'ONLIST S NUM=NUM+1,EORDER(NUM)=JND
. S KND="",ONLIST=0
. F S KND=$O(EORDER(KND)) Q:KND="" I EORDER(KND)=IND S ONLIST=1
. I 'ONLIST S NUM=NUM+1,EORDER(NUM)=IND
I '$D(EORDER) Q
;Check for circular dependencies.
S DONE=0
S IND=EORDER(1),CLIST(IND)=""
F Q:DONE D
. S JND=$O(DEP(IND,""))
. I JND="" S DONE=1 Q
. I $D(CLIST(JND)) S (DONE,ERROR)=1 Q
. S CLIST(JND)=""
. S IND=JND
I ERROR D
. S TEXT="Error: found circular redundancy."
. D EN^DDIOL(TEXT)
. S IND=""
. F S IND=$O(CLIST(IND)) Q:IND="" D
.. S JND=$O(DEP(IND,""))
.. S TEXT=" Finding "_IND_" depends on finding "_JND
.. D EN^DDIOL(TEXT)
Q
;
;========================================================
KENODE(X,DA) ;Kill the "E" node in the finding multiple for terms.
;Do not execute as part of a verify fields.
I $G(DIUTIL)="VERIFY FIELDS" Q
N DAS,GLOBAL,IEN
S IEN=$P(X,";",1)
S GLOBAL=$P(X,";",2)
I GLOBAL="LAB(60," S IEN=$$LABDAS(IEN)
S DAS=IEN
I DAS="" Q
K ^PXRMD(811.5,DA(1),20,"E",GLOBAL,DAS,DA)
Q
;
;========================================================
KENODES(XX,DA) ;Kill the "E" and "EDEP" nodes in the finding multiple for
;definitions
;Do not execute as part of a verify fields.
I $G(DIUTIL)="VERIFY FIELDS" Q
N DAS,GLOBAL,IEN,IND
S IEN=$P(XX,";",1)
S GLOBAL=$P(XX,";",2)
I GLOBAL="LAB(60," S IEN=$$LABDAS(IEN)
S DAS=IEN
I DAS="" Q
K ^PXD(811.9,DA(1),20,"E",GLOBAL,DAS,DA)
S IND=0
F S IND=$O(^PXD(811.9,DA(1),20,"EDEP",IND)) Q:IND="" D
. I '$D(^PXD(811.9,DA(1),20,"EDEP",IND,GLOBAL)) Q
. K ^PXD(811.9,DA(1),20,"EDEP",IND,GLOBAL,DAS,DA)
Q
;
;========================================================
LABDAS(IEN) ;Determine the DAS for lab findings.
N SUB
;DBIA #91-A
S SUB=$P(^LAB(60,IEN,0),U,4)
I SUB="CH" Q IEN
I (SUB="BB")!(SUB="WK") Q ""
I SUB="MI" Q "M;T;"_IEN
;All other SUB values: AU, CY, EM, SP
Q "A;T;"_IEN
;
;========================================================
SENODE(X,DA) ;Set the "E" node in the finding multiple for terms.
;Do not execute as part of a verify fields.
I $G(DIUTIL)="VERIFY FIELDS" Q
N DAS,GLOBAL,IEN
S IEN=$P(X,";",1)
S GLOBAL=$P(X,";",2)
I GLOBAL="LAB(60," S IEN=$$LABDAS(IEN)
S DAS=IEN
I DAS="" Q
S ^PXRMD(811.5,DA(1),20,"E",GLOBAL,DAS,DA)=""
Q
;
;========================================================
SENODES(X,DA) ;Set the "E" and "EDEP" node in the finding multiple for
;definitions. X(1)=.01, X(2)=BEGINNING DATE/TIME, X(3)=ENDING DATE/TIME
;Do not execute as part of a verify fields.
I $G(DIUTIL)="VERIFY FIELDS" Q
N DAS,DEP,EORDER,ERROR,FBDT,FEDT,FI,GLOBAL,IEN,IND,JND,NODEP,PT01
;Build dependency list.
D DEPLIST(DA(1),.DEP)
D EVORDER(DA(1),.DEP,.EORDER,.NODEP,.ERROR)
;If EVORDER returns an error quit.
I ERROR Q
K ^PXD(811.9,DA(1),20,"E"),^PXD(811.9,DA(1),20,"EDEP")
;Build the "E" index.
S IND=""
F S IND=$O(NODEP(IND)) Q:IND="" D
. S PT01=$P(^PXD(811.9,DA(1),20,IND,0),U,1)
. S IEN=$P(PT01,";",1)
. S GLOBAL=$P(PT01,";",2)
. I GLOBAL="LAB(60," S IEN=$$LABDAS(IEN)
. S DAS=IEN
. I DAS="" Q
. S ^PXD(811.9,DA(1),20,"E",GLOBAL,DAS,IND)=""
;Build the "EDEP" index.
S IND=0
F S IND=$O(EORDER(IND)) Q:IND="" D
. S FI=EORDER(IND)
. S JND=0,(FBDT,FEDT)=""
. F S JND=$O(DEP(FI,JND)) Q:JND="" D
.. I DEP(FI,JND)="BDT" S FBDT=JND
.. I DEP(FI,JND)="EDT" S FEDT=JND
. S PT01=$P(^PXD(811.9,DA(1),20,FI,0),U,1)
. S IEN=$P(PT01,";",1)
. S GLOBAL=$P(PT01,";",2)
. I GLOBAL="LAB(60," S IEN=$$LABDAS(IEN)
. S DAS=IEN
. I DAS="" Q
. S ^PXD(811.9,DA(1),20,"EDEP",IND,GLOBAL,DAS,FI)=FBDT_U_FEDT
Q
;
PXRMENOD ;SLC/PKR - Clinical Reminders "E" node routines. ;06/26/2013
+1 ;;2.0;CLINICAL REMINDERS;**4,6,18,26**;Feb 04, 2005;Build 404
+2 ;
+3 ;========================================================
DEPLIST(IEN,DEP) ;Build the evaluation dependency list.
+1 NEW BDT,EDT,FI1,FI2,TEMP
+2 SET FI1=0
+3 FOR
SET FI1=+$ORDER(^PXD(811.9,IEN,20,FI1))
IF FI1=0
QUIT
Begin DoDot:1
+4 SET TEMP=^PXD(811.9,IEN,20,FI1,0)
+5 SET BDT=$PIECE(TEMP,U,8)
+6 SET EDT=$PIECE(TEMP,U,11)
+7 SET DEP(FI1)=""
+8 IF BDT["FIEVAL"
SET FI2=$EXTRACT(BDT,8,$FIND(BDT,",")-2)
SET DEP(FI1,FI2)="BDT"
+9 IF EDT["FIEVAL"
SET FI2=$EXTRACT(EDT,8,$FIND(EDT,",")-2)
SET DEP(FI1,FI2)="EDT"
End DoDot:1
+10 QUIT
+11 ;
+12 ;========================================================
EVORDER(IEN,DEP,EORDER,NODEP,ERROR) ;Determine the evaluation order for findings
+1 ;that depend of the date of other findings. The structure of EORDER
+2 ;is EORDER(N)=finding number, where N is the evaluation order.
+3 NEW CLIST,DONE,IND,JND,KND,ONLIST,NUM,TEXT
+4 SET IND=""
SET ERROR=0
+5 FOR
SET IND=$ORDER(DEP(IND))
IF IND=""
QUIT
Begin DoDot:1
+6 ;If finding IND has no dependencies, i.e., $D=1 quit. If there are
+7 ;dependencies $D=10.
+8 IF $DATA(DEP(IND))=1
QUIT
+9 SET JND=IND-1
+10 FOR
SET JND=$ORDER(DEP(IND,JND))
IF JND=""
QUIT
Begin DoDot:2
+11 ;Make sure dependent finding exists.
+12 IF '$DATA(^PXD(811.9,IEN,20,JND,0))
Begin DoDot:3
+13 KILL TEXT
+14 SET TEXT(1)="Error: date of finding "_IND_" depends of date of finding "_JND_" and finding "_JND_" does"
+15 SET TEXT(2)=" not exist."
+16 DO EN^DDIOL(.TEXT)
+17 SET ERROR=1
End DoDot:3
+18 ;Check for reflective dependencies.
+19 IF $DATA(DEP(JND,IND))
Begin DoDot:3
+20 KILL TEXT
+21 SET TEXT(1)="Error: date of finding "_IND_" depends of date of finding "_JND_" and"
+22 SET TEXT(2)=" date of finding "_JND_" depends on date of finding "_IND
+23 DO EN^DDIOL(.TEXT)
+24 SET ERROR=1
End DoDot:3
End DoDot:2
End DoDot:1
+25 IF ERROR
QUIT
+26 ;No errors found, build evaluation order lists.
+27 ;First check for findings with no dependencies.
+28 SET IND=""
+29 FOR
SET IND=$ORDER(DEP(IND))
IF IND=""
QUIT
IF $DATA(DEP(IND))=1
SET NODEP(IND)=""
+30 ;Build the dependency list.
+31 SET IND=""
SET NUM=0
+32 FOR
SET IND=$ORDER(DEP(IND))
IF IND=""
QUIT
Begin DoDot:1
+33 IF $DATA(NODEP(IND))
QUIT
+34 SET JND=""
+35 FOR
SET JND=$ORDER(DEP(IND,JND))
IF JND=""
QUIT
Begin DoDot:2
+36 IF $DATA(NODEP(JND))
QUIT
+37 SET KND=""
SET ONLIST=0
+38 FOR
SET KND=$ORDER(EORDER(KND))
IF KND=""
QUIT
IF EORDER(KND)=JND
SET ONLIST=1
+39 IF 'ONLIST
SET NUM=NUM+1
SET EORDER(NUM)=JND
End DoDot:2
+40 SET KND=""
SET ONLIST=0
+41 FOR
SET KND=$ORDER(EORDER(KND))
IF KND=""
QUIT
IF EORDER(KND)=IND
SET ONLIST=1
+42 IF 'ONLIST
SET NUM=NUM+1
SET EORDER(NUM)=IND
End DoDot:1
+43 IF '$DATA(EORDER)
QUIT
+44 ;Check for circular dependencies.
+45 SET DONE=0
+46 SET IND=EORDER(1)
SET CLIST(IND)=""
+47 FOR
IF DONE
QUIT
Begin DoDot:1
+48 SET JND=$ORDER(DEP(IND,""))
+49 IF JND=""
SET DONE=1
QUIT
+50 IF $DATA(CLIST(JND))
SET (DONE,ERROR)=1
QUIT
+51 SET CLIST(JND)=""
+52 SET IND=JND
End DoDot:1
+53 IF ERROR
Begin DoDot:1
+54 SET TEXT="Error: found circular redundancy."
+55 DO EN^DDIOL(TEXT)
+56 SET IND=""
+57 FOR
SET IND=$ORDER(CLIST(IND))
IF IND=""
QUIT
Begin DoDot:2
+58 SET JND=$ORDER(DEP(IND,""))
+59 SET TEXT=" Finding "_IND_" depends on finding "_JND
+60 DO EN^DDIOL(TEXT)
End DoDot:2
End DoDot:1
+61 QUIT
+62 ;
+63 ;========================================================
KENODE(X,DA) ;Kill the "E" node in the finding multiple for terms.
+1 ;Do not execute as part of a verify fields.
+2 IF $GET(DIUTIL)="VERIFY FIELDS"
QUIT
+3 NEW DAS,GLOBAL,IEN
+4 SET IEN=$PIECE(X,";",1)
+5 SET GLOBAL=$PIECE(X,";",2)
+6 IF GLOBAL="LAB(60,"
SET IEN=$$LABDAS(IEN)
+7 SET DAS=IEN
+8 IF DAS=""
QUIT
+9 KILL ^PXRMD(811.5,DA(1),20,"E",GLOBAL,DAS,DA)
+10 QUIT
+11 ;
+12 ;========================================================
KENODES(XX,DA) ;Kill the "E" and "EDEP" nodes in the finding multiple for
+1 ;definitions
+2 ;Do not execute as part of a verify fields.
+3 IF $GET(DIUTIL)="VERIFY FIELDS"
QUIT
+4 NEW DAS,GLOBAL,IEN,IND
+5 SET IEN=$PIECE(XX,";",1)
+6 SET GLOBAL=$PIECE(XX,";",2)
+7 IF GLOBAL="LAB(60,"
SET IEN=$$LABDAS(IEN)
+8 SET DAS=IEN
+9 IF DAS=""
QUIT
+10 KILL ^PXD(811.9,DA(1),20,"E",GLOBAL,DAS,DA)
+11 SET IND=0
+12 FOR
SET IND=$ORDER(^PXD(811.9,DA(1),20,"EDEP",IND))
IF IND=""
QUIT
Begin DoDot:1
+13 IF '$DATA(^PXD(811.9,DA(1),20,"EDEP",IND,GLOBAL))
QUIT
+14 KILL ^PXD(811.9,DA(1),20,"EDEP",IND,GLOBAL,DAS,DA)
End DoDot:1
+15 QUIT
+16 ;
+17 ;========================================================
LABDAS(IEN) ;Determine the DAS for lab findings.
+1 NEW SUB
+2 ;DBIA #91-A
+3 SET SUB=$PIECE(^LAB(60,IEN,0),U,4)
+4 IF SUB="CH"
QUIT IEN
+5 IF (SUB="BB")!(SUB="WK")
QUIT ""
+6 IF SUB="MI"
QUIT "M;T;"_IEN
+7 ;All other SUB values: AU, CY, EM, SP
+8 QUIT "A;T;"_IEN
+9 ;
+10 ;========================================================
SENODE(X,DA) ;Set the "E" node in the finding multiple for terms.
+1 ;Do not execute as part of a verify fields.
+2 IF $GET(DIUTIL)="VERIFY FIELDS"
QUIT
+3 NEW DAS,GLOBAL,IEN
+4 SET IEN=$PIECE(X,";",1)
+5 SET GLOBAL=$PIECE(X,";",2)
+6 IF GLOBAL="LAB(60,"
SET IEN=$$LABDAS(IEN)
+7 SET DAS=IEN
+8 IF DAS=""
QUIT
+9 SET ^PXRMD(811.5,DA(1),20,"E",GLOBAL,DAS,DA)=""
+10 QUIT
+11 ;
+12 ;========================================================
SENODES(X,DA) ;Set the "E" and "EDEP" node in the finding multiple for
+1 ;definitions. X(1)=.01, X(2)=BEGINNING DATE/TIME, X(3)=ENDING DATE/TIME
+2 ;Do not execute as part of a verify fields.
+3 IF $GET(DIUTIL)="VERIFY FIELDS"
QUIT
+4 NEW DAS,DEP,EORDER,ERROR,FBDT,FEDT,FI,GLOBAL,IEN,IND,JND,NODEP,PT01
+5 ;Build dependency list.
+6 DO DEPLIST(DA(1),.DEP)
+7 DO EVORDER(DA(1),.DEP,.EORDER,.NODEP,.ERROR)
+8 ;If EVORDER returns an error quit.
+9 IF ERROR
QUIT
+10 KILL ^PXD(811.9,DA(1),20,"E"),^PXD(811.9,DA(1),20,"EDEP")
+11 ;Build the "E" index.
+12 SET IND=""
+13 FOR
SET IND=$ORDER(NODEP(IND))
IF IND=""
QUIT
Begin DoDot:1
+14 SET PT01=$PIECE(^PXD(811.9,DA(1),20,IND,0),U,1)
+15 SET IEN=$PIECE(PT01,";",1)
+16 SET GLOBAL=$PIECE(PT01,";",2)
+17 IF GLOBAL="LAB(60,"
SET IEN=$$LABDAS(IEN)
+18 SET DAS=IEN
+19 IF DAS=""
QUIT
+20 SET ^PXD(811.9,DA(1),20,"E",GLOBAL,DAS,IND)=""
End DoDot:1
+21 ;Build the "EDEP" index.
+22 SET IND=0
+23 FOR
SET IND=$ORDER(EORDER(IND))
IF IND=""
QUIT
Begin DoDot:1
+24 SET FI=EORDER(IND)
+25 SET JND=0
SET (FBDT,FEDT)=""
+26 FOR
SET JND=$ORDER(DEP(FI,JND))
IF JND=""
QUIT
Begin DoDot:2
+27 IF DEP(FI,JND)="BDT"
SET FBDT=JND
+28 IF DEP(FI,JND)="EDT"
SET FEDT=JND
End DoDot:2
+29 SET PT01=$PIECE(^PXD(811.9,DA(1),20,FI,0),U,1)
+30 SET IEN=$PIECE(PT01,";",1)
+31 SET GLOBAL=$PIECE(PT01,";",2)
+32 IF GLOBAL="LAB(60,"
SET IEN=$$LABDAS(IEN)
+33 SET DAS=IEN
+34 IF DAS=""
QUIT
+35 SET ^PXD(811.9,DA(1),20,"EDEP",IND,GLOBAL,DAS,FI)=FBDT_U_FEDT
End DoDot:1
+36 QUIT
+37 ;