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