DIKCU1 ;SFISC/MKO-FILE/RECORD INFO ;11:21 AM 20 Aug 1999 [ 04/02/2003 8:25 AM ]
;;22.0;VA FileMan;**1001**;APR 1, 2003
;;22.0;VA FileMan;**12**;Mar 30, 1999
;Per VHA Directive 10-93-142, this routine should not be modified.
;===================
; $$VDA([.]DA,Flag)
;===================
;Make sure elements DA array are positive canonic numbers.
;In:
; [.]DA = DA array
; F [ R : DA can't be 0 or null
; [ D : generate Dialog
;Returns: 1 if valid; 0 if invalid
;
VDA(DA,F) ;
N I,ERR
Q:$D(DA)[0 0
I $G(F)["R" D:0[DA
. S ERR=1 D:$G(F)["D" ERR^DIKCU2(202,"","","","RECORD")
I DA]"",DA<0!(DA'=+$P(DA,"E")) D
. S ERR=1 D:$G(F)["D" ERR^DIKCU2(202,"","","","RECORD")
E F I=1:1 Q:'$D(DA(I)) I DA(I)'>0!(DA(I)'=+$P(DA(I),"E")) D Q
. S ERR=1 D:$G(F)["D" ERR^DIKCU2(202,"","","","RECORD")
Q '$G(ERR)
;
;====================================
; $$VFLAG(InputFlags,GoodFlags,Flag)
;====================================
;Makes sure Flags contain only Good Flags.
;In:
; FLAG = flags
; GDFLAG = good flags
; F [ D : generate Dialog
;Returns: 1 if valid; 0 if invalid
;
VFLAG(FLAG,GDFLAG,F) ;
S FLAG=$G(FLAG)
I $TR($G(FLAG),$G(GDFLAG),"")'?.NP D Q 0
. D:$G(F)["D" ERR^DIKCU2(301,"","","",FLAG)
Q 1
;
;=====================
; $$VFNUM(File#,Flag)
;=====================
;Check that File# exists and has a non-wp .01 field
;In:
; FIL = File or subfile #
; F [ D : generate Dialog
;Returns: 1 if valid; 0 if invalid
;
VFNUM(FIL,F) ;
Q:$G(FIL)="" 0
I '$D(^DD(FIL)) D:$G(F)["D" ERR^DIKCU2(401,FIL) Q 0
I $P($G(^DD(FIL,.01,0)),U,2)="" D:$G(F)["D" ERR^DIKCU2(406,FIL) Q 0
I $P(^DD(FIL,.01,0),U,2)["W" D:$G(F)["D" ERR^DIKCU2(407,FIL) Q 0
Q 1
;
;===========================
; $$VFLD(File#,Field#,Flag)
;===========================
;Check that the Fil/Fld exists in the ^DD
;In:
; FIL = File or subfile #
; FLD = Field #
; F [ D : generate Dialog
;Returns: 1 if valid; 0 if invalid
;
VFLD(FIL,FLD,F) ;
Q:$G(FIL)="" 0 Q:$G(FLD)="" 0
I '$D(^DD(FIL,FLD)) D:$G(F)["D" ERR^DIKCU2(501,FIL,"",FLD,FLD) Q 0
Q 1
;
;================================================
; FRNAME(File#,[.]Rec,FileText,RecordTxt,.Level)
;================================================
;Return string that identifies (sub)file and (sub)record.
;In:
; FIL = File or subfile #
; .REC = DA array
;Out:
; .FTXT = Text that identifies file
; .RTXT = Text that identifies record
; .LEV = Level
;
FRNAME(FIL,REC,FTXT,RTXT,LEV) ;
K FTXT,RTXT,LEV
Q:'$G(FIL) Q:'$D(REC)
N FINFO
D FINFO(FIL,.FINFO) Q:'$D(FINFO)
D FILENAME("",.FTXT,.FINFO)
D RECNAME("",REC,.RTXT,.FINFO)
S LEV=FINFO
Q
;
;=================================
; FILENAME(File#,.NameArr,.FINFO)
;=================================
;Get text that identifies the (sub)file
;In:
; FIL = File or subfile #
;In/Out:
; .FINFO = File info array (optional) (see FINFO below)
;Out:
; N = Text (undefined if error)
; N(n) = Overflow text
;
FILENAME(FIL,N,FINFO) ;
K N
I '$D(FINFO) Q:'$G(FIL) D FINFO(FIL,.FINFO) Q:'$D(FINFO)
N I,L,T
;
S L=FINFO,N=0,N(0)=""
F I=L:-1:0 D
. I I S T=$P(FINFO(I),U,3)_" (#"_$P(FINFO(I),U)_"), subfield #"_$P(FINFO(I),U,2)_" of "
. E S T=$S(L:"the ",1:"")_$P(FINFO(I),U,3)_" File (#"_$P(FINFO(I),U)_")"
. I $L(N(N))+$L(T)>240 S N=N+1,N(N)=""
. S N(N)=N(N)_T
S N=N(0) K N(0)
Q
;
;========================================
; RECNAME(File#,.Record,.NameArr,.FINFO)
;========================================
;Get text that identifies the (sub)recird
;In:
; FIL = File or subfile #
; [.]REC = DA array or IENS
;In/Out:
; .FINFO = File info array (optional) (see FINFO below)
;Out:
; NA = Text (undefined if error)
; NA(n) = Overflow text
;
RECNAME(FIL,REC,NA,FINFO) ;Return string that identifies the (sub)record
K NA
Q:'$G(REC)
I '$D(FINFO) Q:'$G(FIL) D FINFO(FIL,.FINFO) Q:'$D(FINFO)
;
N DA,DIERR,ERR,J,LV,LVI,MSG,NDA,ROOT,TX,V01
;
;Set DA array
I REC'["," M DA=REC
E D DA^DILF(REC,.DA)
;
S LV=FINFO,NA=0,NA(0)=""
F LVI=LV:-1:0 D Q:$G(ERR)
. I LVI,$G(DA(LVI))'>0 S ERR=1 Q
. I 'LVI,$G(DA)'>0 S ERR=1 Q
. ;
. I '$D(DDS) D Q:$G(ERR)
.. S ROOT=$P(FINFO(LVI),U,4,999)
.. S V01=$P($G(@ROOT@(0)),U) I V01="" S ERR=1 Q
.. S TX=$$EXTERNAL^DILFD($P(FINFO(LVI),U),.01,"",V01,"MSG")
.. I $G(DIERR) S TX=V01 K MSG,DIERR
. ;
. E D
.. F J=LVI:-1:1 S NDA(J)=DA(J+LV-LVI)
.. S NDA=$S(LVI=LV:DA,1:DA(LV-LVI))
.. S TX=$$GET^DDSVAL($P(FINFO(LVI),U),.NDA,.01,"","E") K NDA
. ;
. I LV-LVI S TX="'"_TX_"' (#"_DA(LV-LVI)_")"
. E S TX="'"_TX_"' (#"_DA_")"
. I LVI S TX=TX_" of "
. I $L(NA(NA))+$L(TX)>240 S NA=NA+1,NA(NA)=""
. S NA(NA)=NA(NA)_TX
;
I $G(ERR) K NA Q
S NA=NA(0) K NA(0)
Q
;
;========================
; FINFO(File#,.FileInfo)
;========================
;Get (sub)file info
;In:
; FIL = File or subfile #
;Out:
; FINFO = n (level)
; FINFO(0) = file#^^fileName^fileRootw/DA
; FINFO(n) = subfile#^mfield#^mfieldName^^subfileRootw/DA
;Example:
; FINFO = 3
; FINFO(0) = 1000^^My File^^DIZ(1000,DA(3))
; FINFO(1) = 1000.01^100^Mult1^^DIZ(1000,DA(3),10,DA(2))
; FINFO(2) = 1000.02^200^Mult2^^DIZ(1000,DA(3),10,DA(2),20,DA(1))
; FINFO(3) = 1000.03^300^Mult3^^DIZ(1000,DA(3),10,DA(2),20,DA(1),30,DA)
;
FINFO(FIL,FINFO) ;
Q:'$G(FIL)
K FINFO
;
;If top level, set FINFO and quit
I $D(^DIC(FIL,0,"GL"))#2 D Q
. S FINFO=0,FINFO(0)=FIL_U_U_$P(^DIC(FIL,0),U)_U_^DIC(FIL,0,"GL")_"DA)"
;
;Must be a subfile level, get mult nodes, and level
N A,ERR,I,L,MFLD,ND,PAR,ROOT,SUB
S SUB=FIL
F L=0:1 S PAR=$G(^DD(SUB,0,"UP")) Q:'PAR D Q:$G(ERR)
. S MFLD=$O(^DD(PAR,"SB",SUB,"")) I 'MFLD S ERR=1 Q
. I $D(^DD(PAR,MFLD,0))[0 S ERR=1 Q
. S FINFO(L)=SUB_U_MFLD_U_$P(^DD(PAR,MFLD,0),U)
. ;
. S ND=$P($P(^DD(PAR,MFLD,0),U,4),";")
. S:ND'=+$P(ND,"E") ND=""""_ND_""""
. S ND(L+1)=ND
. S SUB=PAR
I $G(ERR) K FINFO,L Q
S FIL=SUB
I $D(^DIC(FIL,0))[0 K FINFO,L Q
S FINFO(L)=FIL_U_U_$P(^DIC(FIL,0),U)
;
;Build global roots
S ROOT=$G(^DIC(FIL,0,"GL")) I ROOT="" K FINFO,L Q
F I=L:-1:1 D
. S ROOT=ROOT_"DA("_I_")"
. S FINFO(I)=FINFO(I)_U_ROOT_")"
. S ROOT=ROOT_","_ND(I)_","
S FINFO(0)=FINFO(0)_U_ROOT_"DA)"
S FINFO=L
;
;Invert the FINFO array
K A M A=FINFO K FINFO S FINFO=A F A=0:1:FINFO S FINFO(A)=A(FINFO-A)
Q
;
;#202 The input parameter that identifies the |1| is missing or invalid.
;#301 The passed flag(s) '|1|' are unknown or inconsistent.
;#401 File #|FILE| does not exist.
;#406 File #|FILE| has no .01 field definition.
;#407 A word-processing field is not a file.
;#501 File #|FILE| does not contain a field |1|.
DIKCU1 ;SFISC/MKO-FILE/RECORD INFO ;11:21 AM 20 Aug 1999 [ 04/02/2003 8:25 AM ]
+1 ;;22.0;VA FileMan;**1001**;APR 1, 2003
+2 ;;22.0;VA FileMan;**12**;Mar 30, 1999
+3 ;Per VHA Directive 10-93-142, this routine should not be modified.
+4 ;===================
+5 ; $$VDA([.]DA,Flag)
+6 ;===================
+7 ;Make sure elements DA array are positive canonic numbers.
+8 ;In:
+9 ; [.]DA = DA array
+10 ; F [ R : DA can't be 0 or null
+11 ; [ D : generate Dialog
+12 ;Returns: 1 if valid; 0 if invalid
+13 ;
VDA(DA,F) ;
+1 NEW I,ERR
+2 IF $DATA(DA)[0
QUIT 0
+3 IF $GET(F)["R"
IF 0[DA
Begin DoDot:1
+4 SET ERR=1
IF $GET(F)["D"
DO ERR^DIKCU2(202,"","","","RECORD")
End DoDot:1
+5 IF DA]""
IF DA<0!(DA'=+$PIECE(DA,"E"))
Begin DoDot:1
+6 SET ERR=1
IF $GET(F)["D"
DO ERR^DIKCU2(202,"","","","RECORD")
End DoDot:1
+7 IF '$TEST
FOR I=1:1
IF '$DATA(DA(I))
QUIT
IF DA(I)'>0!(DA(I)'=+$PIECE(DA(I),"E"))
Begin DoDot:1
+8 SET ERR=1
IF $GET(F)["D"
DO ERR^DIKCU2(202,"","","","RECORD")
End DoDot:1
QUIT
+9 QUIT '$GET(ERR)
+10 ;
+11 ;====================================
+12 ; $$VFLAG(InputFlags,GoodFlags,Flag)
+13 ;====================================
+14 ;Makes sure Flags contain only Good Flags.
+15 ;In:
+16 ; FLAG = flags
+17 ; GDFLAG = good flags
+18 ; F [ D : generate Dialog
+19 ;Returns: 1 if valid; 0 if invalid
+20 ;
VFLAG(FLAG,GDFLAG,F) ;
+1 SET FLAG=$GET(FLAG)
+2 IF $TRANSLATE($GET(FLAG),$GET(GDFLAG),"")'?.NP
Begin DoDot:1
+3 IF $GET(F)["D"
DO ERR^DIKCU2(301,"","","",FLAG)
End DoDot:1
QUIT 0
+4 QUIT 1
+5 ;
+6 ;=====================
+7 ; $$VFNUM(File#,Flag)
+8 ;=====================
+9 ;Check that File# exists and has a non-wp .01 field
+10 ;In:
+11 ; FIL = File or subfile #
+12 ; F [ D : generate Dialog
+13 ;Returns: 1 if valid; 0 if invalid
+14 ;
VFNUM(FIL,F) ;
+1 IF $GET(FIL)=""
QUIT 0
+2 IF '$DATA(^DD(FIL))
IF $GET(F)["D"
DO ERR^DIKCU2(401,FIL)
QUIT 0
+3 IF $PIECE($GET(^DD(FIL,.01,0)),U,2)=""
IF $GET(F)["D"
DO ERR^DIKCU2(406,FIL)
QUIT 0
+4 IF $PIECE(^DD(FIL,.01,0),U,2)["W"
IF $GET(F)["D"
DO ERR^DIKCU2(407,FIL)
QUIT 0
+5 QUIT 1
+6 ;
+7 ;===========================
+8 ; $$VFLD(File#,Field#,Flag)
+9 ;===========================
+10 ;Check that the Fil/Fld exists in the ^DD
+11 ;In:
+12 ; FIL = File or subfile #
+13 ; FLD = Field #
+14 ; F [ D : generate Dialog
+15 ;Returns: 1 if valid; 0 if invalid
+16 ;
VFLD(FIL,FLD,F) ;
+1 IF $GET(FIL)=""
QUIT 0
IF $GET(FLD)=""
QUIT 0
+2 IF '$DATA(^DD(FIL,FLD))
IF $GET(F)["D"
DO ERR^DIKCU2(501,FIL,"",FLD,FLD)
QUIT 0
+3 QUIT 1
+4 ;
+5 ;================================================
+6 ; FRNAME(File#,[.]Rec,FileText,RecordTxt,.Level)
+7 ;================================================
+8 ;Return string that identifies (sub)file and (sub)record.
+9 ;In:
+10 ; FIL = File or subfile #
+11 ; .REC = DA array
+12 ;Out:
+13 ; .FTXT = Text that identifies file
+14 ; .RTXT = Text that identifies record
+15 ; .LEV = Level
+16 ;
FRNAME(FIL,REC,FTXT,RTXT,LEV) ;
+1 KILL FTXT,RTXT,LEV
+2 IF '$GET(FIL)
QUIT
IF '$DATA(REC)
QUIT
+3 NEW FINFO
+4 DO FINFO(FIL,.FINFO)
IF '$DATA(FINFO)
QUIT
+5 DO FILENAME("",.FTXT,.FINFO)
+6 DO RECNAME("",REC,.RTXT,.FINFO)
+7 SET LEV=FINFO
+8 QUIT
+9 ;
+10 ;=================================
+11 ; FILENAME(File#,.NameArr,.FINFO)
+12 ;=================================
+13 ;Get text that identifies the (sub)file
+14 ;In:
+15 ; FIL = File or subfile #
+16 ;In/Out:
+17 ; .FINFO = File info array (optional) (see FINFO below)
+18 ;Out:
+19 ; N = Text (undefined if error)
+20 ; N(n) = Overflow text
+21 ;
FILENAME(FIL,N,FINFO) ;
+1 KILL N
+2 IF '$DATA(FINFO)
IF '$GET(FIL)
QUIT
DO FINFO(FIL,.FINFO)
IF '$DATA(FINFO)
QUIT
+3 NEW I,L,T
+4 ;
+5 SET L=FINFO
SET N=0
SET N(0)=""
+6 FOR I=L:-1:0
Begin DoDot:1
+7 IF I
SET T=$PIECE(FINFO(I),U,3)_" (#"_$PIECE(FINFO(I),U)_"), subfield #"_$PIECE(FINFO(I),U,2)_" of "
+8 IF '$TEST
SET T=$SELECT(L:"the ",1:"")_$PIECE(FINFO(I),U,3)_" File (#"_$PIECE(FINFO(I),U)_")"
+9 IF $LENGTH(N(N))+$LENGTH(T)>240
SET N=N+1
SET N(N)=""
+10 SET N(N)=N(N)_T
End DoDot:1
+11 SET N=N(0)
KILL N(0)
+12 QUIT
+13 ;
+14 ;========================================
+15 ; RECNAME(File#,.Record,.NameArr,.FINFO)
+16 ;========================================
+17 ;Get text that identifies the (sub)recird
+18 ;In:
+19 ; FIL = File or subfile #
+20 ; [.]REC = DA array or IENS
+21 ;In/Out:
+22 ; .FINFO = File info array (optional) (see FINFO below)
+23 ;Out:
+24 ; NA = Text (undefined if error)
+25 ; NA(n) = Overflow text
+26 ;
RECNAME(FIL,REC,NA,FINFO) ;Return string that identifies the (sub)record
+1 KILL NA
+2 IF '$GET(REC)
QUIT
+3 IF '$DATA(FINFO)
IF '$GET(FIL)
QUIT
DO FINFO(FIL,.FINFO)
IF '$DATA(FINFO)
QUIT
+4 ;
+5 NEW DA,DIERR,ERR,J,LV,LVI,MSG,NDA,ROOT,TX,V01
+6 ;
+7 ;Set DA array
+8 IF REC'[","
MERGE DA=REC
+9 IF '$TEST
DO DA^DILF(REC,.DA)
+10 ;
+11 SET LV=FINFO
SET NA=0
SET NA(0)=""
+12 FOR LVI=LV:-1:0
Begin DoDot:1
+13 IF LVI
IF $GET(DA(LVI))'>0
SET ERR=1
QUIT
+14 IF 'LVI
IF $GET(DA)'>0
SET ERR=1
QUIT
+15 ;
+16 IF '$DATA(DDS)
Begin DoDot:2
+17 SET ROOT=$PIECE(FINFO(LVI),U,4,999)
+18 SET V01=$PIECE($GET(@ROOT@(0)),U)
IF V01=""
SET ERR=1
QUIT
+19 SET TX=$$EXTERNAL^DILFD($PIECE(FINFO(LVI),U),.01,"",V01,"MSG")
+20 IF $GET(DIERR)
SET TX=V01
KILL MSG,DIERR
End DoDot:2
IF $GET(ERR)
QUIT
+21 ;
+22 IF '$TEST
Begin DoDot:2
+23 FOR J=LVI:-1:1
SET NDA(J)=DA(J+LV-LVI)
+24 SET NDA=$SELECT(LVI=LV:DA,1:DA(LV-LVI))
+25 SET TX=$$GET^DDSVAL($PIECE(FINFO(LVI),U),.NDA,.01,"","E")
KILL NDA
End DoDot:2
+26 ;
+27 IF LV-LVI
SET TX="'"_TX_"' (#"_DA(LV-LVI)_")"
+28 IF '$TEST
SET TX="'"_TX_"' (#"_DA_")"
+29 IF LVI
SET TX=TX_" of "
+30 IF $LENGTH(NA(NA))+$LENGTH(TX)>240
SET NA=NA+1
SET NA(NA)=""
+31 SET NA(NA)=NA(NA)_TX
End DoDot:1
IF $GET(ERR)
QUIT
+32 ;
+33 IF $GET(ERR)
KILL NA
QUIT
+34 SET NA=NA(0)
KILL NA(0)
+35 QUIT
+36 ;
+37 ;========================
+38 ; FINFO(File#,.FileInfo)
+39 ;========================
+40 ;Get (sub)file info
+41 ;In:
+42 ; FIL = File or subfile #
+43 ;Out:
+44 ; FINFO = n (level)
+45 ; FINFO(0) = file#^^fileName^fileRootw/DA
+46 ; FINFO(n) = subfile#^mfield#^mfieldName^^subfileRootw/DA
+47 ;Example:
+48 ; FINFO = 3
+49 ; FINFO(0) = 1000^^My File^^DIZ(1000,DA(3))
+50 ; FINFO(1) = 1000.01^100^Mult1^^DIZ(1000,DA(3),10,DA(2))
+51 ; FINFO(2) = 1000.02^200^Mult2^^DIZ(1000,DA(3),10,DA(2),20,DA(1))
+52 ; FINFO(3) = 1000.03^300^Mult3^^DIZ(1000,DA(3),10,DA(2),20,DA(1),30,DA)
+53 ;
FINFO(FIL,FINFO) ;
+1 IF '$GET(FIL)
QUIT
+2 KILL FINFO
+3 ;
+4 ;If top level, set FINFO and quit
+5 IF $DATA(^DIC(FIL,0,"GL"))#2
Begin DoDot:1
+6 SET FINFO=0
SET FINFO(0)=FIL_U_U_$PIECE(^DIC(FIL,0),U)_U_^DIC(FIL,0,"GL")_"DA)"
End DoDot:1
QUIT
+7 ;
+8 ;Must be a subfile level, get mult nodes, and level
+9 NEW A,ERR,I,L,MFLD,ND,PAR,ROOT,SUB
+10 SET SUB=FIL
+11 FOR L=0:1
SET PAR=$GET(^DD(SUB,0,"UP"))
IF 'PAR
QUIT
Begin DoDot:1
+12 SET MFLD=$ORDER(^DD(PAR,"SB",SUB,""))
IF 'MFLD
SET ERR=1
QUIT
+13 IF $DATA(^DD(PAR,MFLD,0))[0
SET ERR=1
QUIT
+14 SET FINFO(L)=SUB_U_MFLD_U_$PIECE(^DD(PAR,MFLD,0),U)
+15 ;
+16 SET ND=$PIECE($PIECE(^DD(PAR,MFLD,0),U,4),";")
+17 IF ND'=+$PIECE(ND,"E")
SET ND=""""_ND_""""
+18 SET ND(L+1)=ND
+19 SET SUB=PAR
End DoDot:1
IF $GET(ERR)
QUIT
+20 IF $GET(ERR)
KILL FINFO,L
QUIT
+21 SET FIL=SUB
+22 IF $DATA(^DIC(FIL,0))[0
KILL FINFO,L
QUIT
+23 SET FINFO(L)=FIL_U_U_$PIECE(^DIC(FIL,0),U)
+24 ;
+25 ;Build global roots
+26 SET ROOT=$GET(^DIC(FIL,0,"GL"))
IF ROOT=""
KILL FINFO,L
QUIT
+27 FOR I=L:-1:1
Begin DoDot:1
+28 SET ROOT=ROOT_"DA("_I_")"
+29 SET FINFO(I)=FINFO(I)_U_ROOT_")"
+30 SET ROOT=ROOT_","_ND(I)_","
End DoDot:1
+31 SET FINFO(0)=FINFO(0)_U_ROOT_"DA)"
+32 SET FINFO=L
+33 ;
+34 ;Invert the FINFO array
+35 KILL A
MERGE A=FINFO
KILL FINFO
SET FINFO=A
FOR A=0:1:FINFO
SET FINFO(A)=A(FINFO-A)
+36 QUIT
+37 ;
+38 ;#202 The input parameter that identifies the |1| is missing or invalid.
+39 ;#301 The passed flag(s) '|1|' are unknown or inconsistent.
+40 ;#401 File #|FILE| does not exist.
+41 ;#406 File #|FILE| has no .01 field definition.
+42 ;#407 A word-processing field is not a file.
+43 ;#501 File #|FILE| does not contain a field |1|.