MCDBELM ;WISC/DCB-save and load util. ;8/15/96 09:52
;;2.3;Medicine;;09/13/1996
Q
RTNELM(FILE,REC,FIELDS,EXC,DATA,TYPE,USER,TEMP,ERROR) ;RTN the elements in an array
N Y,X,BACK,FILES,FLDS,RECS,XFILE,XREC,XFLD,HOLD,FLD,TOTAL
N COUNT,COUNT2,XTEMP,XTFILE,TMP,TMP1,TMP2 S ERROR=""
S FILE=$$RTNFILE(FILE,FIELDS) Q:$E(FILE,1)=" " FILE
F TOTAL=1:1:255 S XFILE=$P(FILE,U,TOTAL),XREC=$P(REC,U,TOTAL),XFLD=$P(FIELDS,U,TOTAL) Q:(XREC_XFLD)="" S TEMP(TOTAL)=XFILE_U_XREC_U_XFLD
S TOTAL=TOTAL-1
F COUNT=1:1:TOTAL Q:ERROR'="" D
.S XTEMP=TEMP(COUNT) S:COUNT>1 BACK=TEMP(COUNT-1)
.S XFILE=+$P(XTEMP,U),XREC=+$P(XTEMP,U,2),XFLD=$P(XTEMP,U,3)
.I XFILE<1 S ERROR=" 2.1 - (Sub)File is less than 1 or null" Q
.I XREC<1 S ERROR=" 2.2 - (Sub)Record is less than 1 or null" Q
.I '$D(^DD(XFILE)) S ERROR=" 2.3 - (Sub)File is not define" Q
.I COUNT>1 S HOLD=+$P($G(^DD(+$P(BACK,U,1),+$P(BACK,U,3),0)),U,2) I XFILE'=HOLD S ERROR=" 2.4 - Subfile missing in Data Dictionary" Q
.F COUNT2=1:1:255 S FLD=$P(XFLD,";",COUNT2) Q:FLD=""!(ERROR'="") D
..I +FLD=0 S ERROR=" 2.5 - (Sub)Field is zero or null"
..S:'$D(^DD(XFILE,FLD)) ERROR=" 2.6 - (Sub)Field is not defined in DD"
..I COUNT=TOTAL S TEMP("FLD",FLD)=$P(DATA,"|",COUNT2),TEMP("TYP",FLD)=$P(TYPE,U,COUNT2),TEMP("FLDNAME",FLD)=$P(^DD(XFILE,FLD,0),U,1)
..S (TEMP("EXC",FLD),X)=$G(EXC(FLD))
..D:X ^DIM S:'$D(X) ERROR=" 2.7 Syntax error in the Execption Code"
S TEMP("X")=$P(TEMP(TOTAL),U,3)
S TEMP("XF")=$P(TEMP(TOTAL),U,1)
S TEMP("USER")=+$G(USER)
S TEMP("DIC")=$$RTNDIE(.TEMP)
S BACK=$L(TEMP("DIC"))
S HOLD=$E(TEMP("DIC"),1,BACK-1)
S TEMP("GLO")=HOLD_$S($E(TEMP("DIC"),BACK)=",":")",1:"")
S:$E(TEMP("DIC"),1)=" " ERROR=TEMP("DIC")
Q
RTNFILE(FILE,FIELDS) ;Get the Subfile -This is used og RTELM-
N XCOUNT,XFILE,ERROR,XTMP,XFLD,XSFILE,XFLDN,XTFILE,XTMP2
S (XSFILE,XTFILE)=+FILE,ERROR=""
F XCOUNT=1:1:255 S XFLD=$P(FIELDS,U,XCOUNT),XTMP2=$P(FIELDS,U,XCOUNT+1) Q:XTMP2=""!(ERROR'="") D
.S XTMP=$G(^DD(XTFILE,+XFLD,0)) I XTMP="" S ERORR=" Field not in DD" Q
.S XTFILE=+$P(XTMP,U,2) I '$D(^DD(XTFILE)) S ERROR=" Undefine (Sub)file"
.S XSFILE=XSFILE_U_XTFILE
Q $S(ERROR="":XSFILE,1:ERROR)
RTNDIE(TEMP) ;Return the DIE value
N XFILE,XLOOP,XNODE,XBACK,ERROR S ERROR=""
I '$D(TEMP) Q " 0.0 - Require array not define"
S XFILE=$G(^DIC($P(+$G(TEMP(1)),U,1),0,"GL")),XLOOP=1
Q:XFILE="" " 3.1 - Global location is not defined"
F S XLOOP=+$O(TEMP(XLOOP)) Q:XLOOP=0!(ERROR'="") D
.S XBACK=TEMP(XLOOP-1),XFILE=XFILE_$P(XBACK,U,2)_","
.S XNODE=$G(^DD(+$P(XBACK,U,1),+$P(XBACK,U,3),0))
.S XNODE=$P($P(XNODE,U,4),";",1)
.I XNODE="" S ERROR=" 3.2 - The zero node of the DD is undefined" Q
.I XNODE'=+XNODE S XNODE=""""_XNODE_"""" ; DAD 8-5-96
.S XFILE=XFILE_XNODE_","
S:ERROR="" ERROR=$$CHKFILE(XFILE)
Q $S(ERROR="":XFILE,1:ERROR)
RTNDR(TEMP,TYPE) ;Return The DR value
N XTYPE,XERROR,XFLD,XDR,XHLD,XDAT
S TYPE=+$G(TYPE)
I '$D(TEMP) Q " 0.0 - Require array not define"
S XTYPE="///",(XERROR,XFLD,XDR)=""
F S XFLD=+$O(TEMP("FLD",XFLD)) Q:XFLD=0 D
.I (TYPE=1),($G(TEMP("EXC",XHOLD))'=""),(ERROR'="") D
..S X=TEMP("FLD",FLD) X:X'="" TEMP("EXC",XHOLD)
..S:X'="" TEMP("FLD",FLD)=X
.S XHLD=$G(TEMP("TYP",XFLD)),XHLD=$S(XHLD="":XTYPE,1:XHLD)
.S XDAT=$G(TEMP("FLD",XFLD)),XDR=XDR_$S(XDR="":"",1:";")
.S:TYPE=1 XDR=XDR_XFLD_$S(XDAT="":XTYPE,1:XHLD)_XDAT
.S:TYPE=0 XDR=XDR_XFLD
Q XDR
RTNDA(TEMP,ARRAY,ERROR) ;Return The DA value
N HOLD,TOTAL,COUNT S ERROR="",TOTAL=$$TOTAL(.TEMP)
I '$D(TEMP) Q " 0.0 - Require array not define"
F COUNT=TOTAL:-1:1 Q:ERROR'="" D
.S ARRAY(TOTAL-COUNT)=+$P($G(TEMP(COUNT)),U,2)
.S:ARRAY(TOTAL-COUNT)<1 ERROR=" 5.1 - Record is less than 1 or null"
S ARRAY=ARRAY(0) K ARRAY(0)
Q
STR(XTEMP) ;GET THE DATA VALUE (used by RTNELM)
N TEMP,LOOP,HOLD
S TEMP=$P(XTEMP,"/",2,255) F LOOP=1:1:4 Q:$E(TEMP,LOOP)'="/"
S HOLD=$E(TEMP,LOOP,$L(TEMP))
Q $S(HOLD="@":"",1:HOLD)
TOTAL(ARRAY) ;Find the total count in an array used by calls)
N COUNT,TOTAL S (COUNT,TOTAL)=0
F S COUNT=+$O(TEMP(COUNT)) S:COUNT'=0 TOTAL=COUNT Q:COUNT=0
Q TOTAL
CHKFILE(FILE) ;This validates if global reference is a fileMan file & exists
N X S ERROR=""
S X="S:'$D("_FILE_"0)) ERROR="" 6.1 (sub)file does not exist"""
D ^DIM
I '$D(X)!($E(FILE,1)'["^")!(($E(FILE,$L(FILE))'[",")&($E(FILE,$L(FILE))'["(")) S ERROR=" 7.1 Bad Global name for FileMan"
Q ERROR
MCDBELM ;WISC/DCB-save and load util. ;8/15/96 09:52
+1 ;;2.3;Medicine;;09/13/1996
+2 QUIT
RTNELM(FILE,REC,FIELDS,EXC,DATA,TYPE,USER,TEMP,ERROR) ;RTN the elements in an array
+1 NEW Y,X,BACK,FILES,FLDS,RECS,XFILE,XREC,XFLD,HOLD,FLD,TOTAL
+2 NEW COUNT,COUNT2,XTEMP,XTFILE,TMP,TMP1,TMP2
SET ERROR=""
+3 SET FILE=$$RTNFILE(FILE,FIELDS)
IF $EXTRACT(FILE,1)=" "
QUIT FILE
+4 FOR TOTAL=1:1:255
SET XFILE=$PIECE(FILE,U,TOTAL)
SET XREC=$PIECE(REC,U,TOTAL)
SET XFLD=$PIECE(FIELDS,U,TOTAL)
IF (XREC_XFLD)=""
QUIT
SET TEMP(TOTAL)=XFILE_U_XREC_U_XFLD
+5 SET TOTAL=TOTAL-1
+6 FOR COUNT=1:1:TOTAL
IF ERROR'=""
QUIT
Begin DoDot:1
+7 SET XTEMP=TEMP(COUNT)
IF COUNT>1
SET BACK=TEMP(COUNT-1)
+8 SET XFILE=+$PIECE(XTEMP,U)
SET XREC=+$PIECE(XTEMP,U,2)
SET XFLD=$PIECE(XTEMP,U,3)
+9 IF XFILE<1
SET ERROR=" 2.1 - (Sub)File is less than 1 or null"
QUIT
+10 IF XREC<1
SET ERROR=" 2.2 - (Sub)Record is less than 1 or null"
QUIT
+11 IF '$DATA(^DD(XFILE))
SET ERROR=" 2.3 - (Sub)File is not define"
QUIT
+12 IF COUNT>1
SET HOLD=+$PIECE($GET(^DD(+$PIECE(BACK,U,1),+$PIECE(BACK,U,3),0)),U,2)
IF XFILE'=HOLD
SET ERROR=" 2.4 - Subfile missing in Data Dictionary"
QUIT
+13 FOR COUNT2=1:1:255
SET FLD=$PIECE(XFLD,";",COUNT2)
IF FLD=""!(ERROR'="")
QUIT
Begin DoDot:2
+14 IF +FLD=0
SET ERROR=" 2.5 - (Sub)Field is zero or null"
+15 IF '$DATA(^DD(XFILE,FLD))
SET ERROR=" 2.6 - (Sub)Field is not defined in DD"
+16 IF COUNT=TOTAL
SET TEMP("FLD",FLD)=$PIECE(DATA,"|",COUNT2)
SET TEMP("TYP",FLD)=$PIECE(TYPE,U,COUNT2)
SET TEMP("FLDNAME",FLD)=$PIECE(^DD(XFILE,FLD,0),U,1)
+17 SET (TEMP("EXC",FLD),X)=$GET(EXC(FLD))
+18 IF X
DO ^DIM
IF '$DATA(X)
SET ERROR=" 2.7 Syntax error in the Execption Code"
End DoDot:2
End DoDot:1
+19 SET TEMP("X")=$PIECE(TEMP(TOTAL),U,3)
+20 SET TEMP("XF")=$PIECE(TEMP(TOTAL),U,1)
+21 SET TEMP("USER")=+$GET(USER)
+22 SET TEMP("DIC")=$$RTNDIE(.TEMP)
+23 SET BACK=$LENGTH(TEMP("DIC"))
+24 SET HOLD=$EXTRACT(TEMP("DIC"),1,BACK-1)
+25 SET TEMP("GLO")=HOLD_$SELECT($EXTRACT(TEMP("DIC"),BACK)=",":")",1:"")
+26 IF $EXTRACT(TEMP("DIC"),1)=" "
SET ERROR=TEMP("DIC")
+27 QUIT
RTNFILE(FILE,FIELDS) ;Get the Subfile -This is used og RTELM-
+1 NEW XCOUNT,XFILE,ERROR,XTMP,XFLD,XSFILE,XFLDN,XTFILE,XTMP2
+2 SET (XSFILE,XTFILE)=+FILE
SET ERROR=""
+3 FOR XCOUNT=1:1:255
SET XFLD=$PIECE(FIELDS,U,XCOUNT)
SET XTMP2=$PIECE(FIELDS,U,XCOUNT+1)
IF XTMP2=""!(ERROR'="")
QUIT
Begin DoDot:1
+4 SET XTMP=$GET(^DD(XTFILE,+XFLD,0))
IF XTMP=""
SET ERORR=" Field not in DD"
QUIT
+5 SET XTFILE=+$PIECE(XTMP,U,2)
IF '$DATA(^DD(XTFILE))
SET ERROR=" Undefine (Sub)file"
+6 SET XSFILE=XSFILE_U_XTFILE
End DoDot:1
+7 QUIT $SELECT(ERROR="":XSFILE,1:ERROR)
RTNDIE(TEMP) ;Return the DIE value
+1 NEW XFILE,XLOOP,XNODE,XBACK,ERROR
SET ERROR=""
+2 IF '$DATA(TEMP)
QUIT " 0.0 - Require array not define"
+3 SET XFILE=$GET(^DIC($PIECE(+$GET(TEMP(1)),U,1),0,"GL"))
SET XLOOP=1
+4 IF XFILE=""
QUIT " 3.1 - Global location is not defined"
+5 FOR
SET XLOOP=+$ORDER(TEMP(XLOOP))
IF XLOOP=0!(ERROR'="")
QUIT
Begin DoDot:1
+6 SET XBACK=TEMP(XLOOP-1)
SET XFILE=XFILE_$PIECE(XBACK,U,2)_","
+7 SET XNODE=$GET(^DD(+$PIECE(XBACK,U,1),+$PIECE(XBACK,U,3),0))
+8 SET XNODE=$PIECE($PIECE(XNODE,U,4),";",1)
+9 IF XNODE=""
SET ERROR=" 3.2 - The zero node of the DD is undefined"
QUIT
+10 ; DAD 8-5-96
IF XNODE'=+XNODE
SET XNODE=""""_XNODE_""""
+11 SET XFILE=XFILE_XNODE_","
End DoDot:1
+12 IF ERROR=""
SET ERROR=$$CHKFILE(XFILE)
+13 QUIT $SELECT(ERROR="":XFILE,1:ERROR)
RTNDR(TEMP,TYPE) ;Return The DR value
+1 NEW XTYPE,XERROR,XFLD,XDR,XHLD,XDAT
+2 SET TYPE=+$GET(TYPE)
+3 IF '$DATA(TEMP)
QUIT " 0.0 - Require array not define"
+4 SET XTYPE="///"
SET (XERROR,XFLD,XDR)=""
+5 FOR
SET XFLD=+$ORDER(TEMP("FLD",XFLD))
IF XFLD=0
QUIT
Begin DoDot:1
+6 IF (TYPE=1)
IF ($GET(TEMP("EXC",XHOLD))'="")
IF (ERROR'="")
Begin DoDot:2
+7 SET X=TEMP("FLD",FLD)
IF X'=""
XECUTE TEMP("EXC",XHOLD)
+8 IF X'=""
SET TEMP("FLD",FLD)=X
End DoDot:2
+9 SET XHLD=$GET(TEMP("TYP",XFLD))
SET XHLD=$SELECT(XHLD="":XTYPE,1:XHLD)
+10 SET XDAT=$GET(TEMP("FLD",XFLD))
SET XDR=XDR_$SELECT(XDR="":"",1:";")
+11 IF TYPE=1
SET XDR=XDR_XFLD_$SELECT(XDAT="":XTYPE,1:XHLD)_XDAT
+12 IF TYPE=0
SET XDR=XDR_XFLD
End DoDot:1
+13 QUIT XDR
RTNDA(TEMP,ARRAY,ERROR) ;Return The DA value
+1 NEW HOLD,TOTAL,COUNT
SET ERROR=""
SET TOTAL=$$TOTAL(.TEMP)
+2 IF '$DATA(TEMP)
QUIT " 0.0 - Require array not define"
+3 FOR COUNT=TOTAL:-1:1
IF ERROR'=""
QUIT
Begin DoDot:1
+4 SET ARRAY(TOTAL-COUNT)=+$PIECE($GET(TEMP(COUNT)),U,2)
+5 IF ARRAY(TOTAL-COUNT)<1
SET ERROR=" 5.1 - Record is less than 1 or null"
End DoDot:1
+6 SET ARRAY=ARRAY(0)
KILL ARRAY(0)
+7 QUIT
STR(XTEMP) ;GET THE DATA VALUE (used by RTNELM)
+1 NEW TEMP,LOOP,HOLD
+2 SET TEMP=$PIECE(XTEMP,"/",2,255)
FOR LOOP=1:1:4
IF $EXTRACT(TEMP,LOOP)'="/"
QUIT
+3 SET HOLD=$EXTRACT(TEMP,LOOP,$LENGTH(TEMP))
+4 QUIT $SELECT(HOLD="@":"",1:HOLD)
TOTAL(ARRAY) ;Find the total count in an array used by calls)
+1 NEW COUNT,TOTAL
SET (COUNT,TOTAL)=0
+2 FOR
SET COUNT=+$ORDER(TEMP(COUNT))
IF COUNT'=0
SET TOTAL=COUNT
IF COUNT=0
QUIT
+3 QUIT TOTAL
CHKFILE(FILE) ;This validates if global reference is a fileMan file & exists
+1 NEW X
SET ERROR=""
+2 SET X="S:'$D("_FILE_"0)) ERROR="" 6.1 (sub)file does not exist"""
+3 DO ^DIM
+4 IF '$DATA(X)!($EXTRACT(FILE,1)'["^")!(($EXTRACT(FILE,$LENGTH(FILE))'[",")&($EXTRACT(FILE,$LENGTH(FILE))'["("))
SET ERROR=" 7.1 Bad Global name for FileMan"
+5 QUIT ERROR