DIVC ;SFISC/MKO-VERIFY INDEXES/KEYS ;2:47 PM 23 Jan 1998
;;22.0;VA FileMan;;Mar 30, 1999
;Per VHA Directive 10-93-142, this routine should not be modified.
;============================================
; VINDEX(file,record,field,flag,.index,.key)
;============================================
;Programmer entry point to check the existence of indexes and
;key integrity for a single file/field/record. (Currently not used)
;In:
; DIFILE = file or subfile # (required)
; DIREC = DA array or IENS (required)
; DIFLD = field # (required)
; DIFLAG [ D : generate dialog errors
;Out:
; For invalid indexes/keys:
; .DIINDEX(indexName,index#) = "" : if an index is not set
; .DIKEY(file#,keyName,uiNumber) = null : if a key field is null
; uniq : if a key not unique
;
VINDEX(DIFILE,DIREC,DIFLD,DIFLAG,DIINDEX,DIKEY) ;
N DA,DIROOT,DIVCTMP,DIVERR
;
;Initialization
S DIFLAG=$G(DIFLAG),DIVERR=0
I DIFLAG["D",'$D(DIQUIET) N DIQUIET S DIQUIET=1
I DIFLAG["D",'$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
;
;Check and convert input paramaters
D CHK Q:DIVERR
;
;Load xref info
S DIVCTMP=$$GETTMP^DIKC1("DIVC")
D LOADVER(DIFILE,DIFLD,DIVCTMP)
;
D VER(DIFILE,DIROOT,.DA,DIVCTMP,.DIINDEX,.DIKEY)
K @DIVCTMP
Q
;
;=========================================
; VER(file#,fileRoot,.DA,tmp,.index,.key)
;=========================================
;Check that index is set. If index is a uniqueness index also
;check that key is unique, and that key fields are non-null.
;Called from INDEX^DIVR.
;In:
; DIFILE = [sub]file #
; DIROOT = closed [sub]file root
; .DA = DA array
; DIVCTMP = root where xref info and verification logic is stored
;Out:
; .DIINDEX = see VINDEX above
; .DIKEY = see VINDEX above
;
VER(DIFILE,DIROOT,DA,DIVCTMP,DIINDEX,DIKEY) ;
N DICHECK,DINULL,DIXR,DIXRNAM,X,X1,X2
N KEY,KFIL,KNAM,UNIQ
;
;Loop through the xrefs loaded in @DIVCTMP
S DIXR=0 F S DIXR=$O(@DIVCTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR D
. S DIXRNAM=$P(@DIVCTMP@(DIFILE,DIXR),U)
. D SETXARR^DIKC(DIFILE,DIXR,DIVCTMP,.DINULL) M X1=X,X2=X
. ;
. ;If no X values are null, but no index, set DIINDEX(name,xref#)
. I 'DINULL D
.. S DICHECK=$G(@DIVCTMP@(DIFILE,DIXR,"V"))
.. I DICHECK]"" X DICHECK E S DIINDEX(DIXRNAM,DIXR)=""
. ;
. ;If the xref is a uniqueness index for a key, set DIKEY() if
. ;key is not unique, or a key field is null.
. I $D(^DD("KEY","AU",DIXR)) D
.. S UNIQ=$S(DINULL:0,1:$$UNIQUE^DIKK2(DIFILE,DIXR,.X,.DA,DIVCTMP))
.. I 'UNIQ S KEY=0 F S KEY=$O(^DD("KEY","AU",DIXR,KEY)) Q:'KEY D
... Q:$D(^DD("KEY",KEY,0))[0 S KFIL=$P(^(0),U),KNAM=$P(^(0),U,2)
... S DIKEY(KFIL,KNAM,DIXRNAM)=$S(DINULL:"null",1:"uniq")
Q
;
;=============================
; CHK: Check input parameters
;=============================
;Out:
; DA = DA array
; DIFILE = File #
; DIROOT = Closed file root
; DIVERR = 1 : if there's a problem
;
CHK ;File is a required input parameter
I $G(DIFILE)="" D:DIFLAG["D" ERR^DIKCU2(202,"","","","FILE") D ERR Q
I $G(DIFLD)="" D:DIFLAG["D" ERR^DIKCU2(202,"","","","FIELD") D ERR Q
;
;Check DIREC and set DA array
N DIIENS
I $G(DIREC)'["," M DA=DIREC S DIIENS=$$IENS^DILF(.DA)
E S:DIREC'?.E1"," DIREC=DIREC_"," D DA^DILF(DIREC,.DA) S DIIENS=DIREC
I '$$VDA^DIKCU1(.DA,DIFLAG_"R") D ERR Q
;
;Check DIFLD
I '$$VFLD^DIKCU1(DIFILE,DIFLD,DIFLAG) D ERR Q
;
;Set DIFILE and DIROOT
N DILEV
I DIFILE=+$P(DIFILE,"E") D
. S DIROOT=$$FROOTDA^DIKCU(DIFILE,DIFLAG,.DILEV) I DIROOT="" D ERR Q
. I DILEV,$D(DA(DILEV))[0 D Q
.. D:DIFLAG["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR
. S:DILEV DIROOT=$NA(@DIROOT)
. S DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG) I DIFILE="" D ERR
E D
. S DIROOT=DIFILE
. S:"(,"[$E(DIROOT,$L(DIROOT)) DIROOT=$$CREF^DILF(DIFILE)
. S DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG) I DIFILE="" D ERR Q
. S DILEV=$$FLEV^DIKCU(DIFILE,DIFLAG) I DILEV="" D ERR Q
. I DILEV,$D(DA(DILEV))[0 D Q
.. D:DIFLAG["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR
Q
;
ERR ;Set error flag
S DIVERR=1
Q
;
;============================
; LOADVER(file#,field#,tmp)
;============================
;Load xref info and verification logic for file/field into @TMP.
;Also, for each regular xref with no set condition, set
; @TMP@(rootFile#,xref#,"V")=I $D(^index),^index=indexVal
; where,
; index = something like DIZ(9999,"BB",X(1),X(2),DA)
; indexVal = value of index, usually ""
;
;In:
; FILE = File #
; FIELD = Field #
; TMP = Root to store logic
;
LOADVER(FILE,FIELD,TMP) ;Load indexes into TMP array
N FIL,KL,SL,XR
;
;Load xref info for file/field into @TMP
D LOADFLD^DIKC1(FILE,FIELD,"KS","","",TMP,TMP)
;
;Set the "V" nodes, kill the "S" and "K" nodes
S FIL=0 F S FIL=$O(@TMP@(FIL)) Q:'FIL D
. S XR=0 F S XR=$O(@TMP@(FIL,XR)) Q:'XR D
.. I $P(@TMP@(FIL,XR),U,4)'="R"!$D(@TMP@(FIL,XR,"SC")) K @TMP@(FIL,XR) Q
.. S SL=$G(@TMP@(FIL,XR,"S")),KL=$G(@TMP@(FIL,XR,"K"))
.. I SL?1"S ^"1.E,KL?1"K ^"1.E D
... S @TMP@(FIL,XR,"V")="I $D("_$E(KL,3,999)_")#2,"_$E(SL,3,999)
.. K @TMP@(FIL,XR,"S"),@TMP@(FIL,XR,"K")
Q
;
;#202 The input parameter that identifies the |1| is missing or invalid.
;#601 The entry does not exist.
DIVC ;SFISC/MKO-VERIFY INDEXES/KEYS ;2:47 PM 23 Jan 1998
+1 ;;22.0;VA FileMan;;Mar 30, 1999
+2 ;Per VHA Directive 10-93-142, this routine should not be modified.
+3 ;============================================
+4 ; VINDEX(file,record,field,flag,.index,.key)
+5 ;============================================
+6 ;Programmer entry point to check the existence of indexes and
+7 ;key integrity for a single file/field/record. (Currently not used)
+8 ;In:
+9 ; DIFILE = file or subfile # (required)
+10 ; DIREC = DA array or IENS (required)
+11 ; DIFLD = field # (required)
+12 ; DIFLAG [ D : generate dialog errors
+13 ;Out:
+14 ; For invalid indexes/keys:
+15 ; .DIINDEX(indexName,index#) = "" : if an index is not set
+16 ; .DIKEY(file#,keyName,uiNumber) = null : if a key field is null
+17 ; uniq : if a key not unique
+18 ;
VINDEX(DIFILE,DIREC,DIFLD,DIFLAG,DIINDEX,DIKEY) ;
+1 NEW DA,DIROOT,DIVCTMP,DIVERR
+2 ;
+3 ;Initialization
+4 SET DIFLAG=$GET(DIFLAG)
SET DIVERR=0
+5 IF DIFLAG["D"
IF '$DATA(DIQUIET)
NEW DIQUIET
SET DIQUIET=1
+6 IF DIFLAG["D"
IF '$DATA(DIFM)
NEW DIFM
SET DIFM=1
DO INIZE^DIEFU
+7 ;
+8 ;Check and convert input paramaters
+9 DO CHK
IF DIVERR
QUIT
+10 ;
+11 ;Load xref info
+12 SET DIVCTMP=$$GETTMP^DIKC1("DIVC")
+13 DO LOADVER(DIFILE,DIFLD,DIVCTMP)
+14 ;
+15 DO VER(DIFILE,DIROOT,.DA,DIVCTMP,.DIINDEX,.DIKEY)
+16 KILL @DIVCTMP
+17 QUIT
+18 ;
+19 ;=========================================
+20 ; VER(file#,fileRoot,.DA,tmp,.index,.key)
+21 ;=========================================
+22 ;Check that index is set. If index is a uniqueness index also
+23 ;check that key is unique, and that key fields are non-null.
+24 ;Called from INDEX^DIVR.
+25 ;In:
+26 ; DIFILE = [sub]file #
+27 ; DIROOT = closed [sub]file root
+28 ; .DA = DA array
+29 ; DIVCTMP = root where xref info and verification logic is stored
+30 ;Out:
+31 ; .DIINDEX = see VINDEX above
+32 ; .DIKEY = see VINDEX above
+33 ;
VER(DIFILE,DIROOT,DA,DIVCTMP,DIINDEX,DIKEY) ;
+1 NEW DICHECK,DINULL,DIXR,DIXRNAM,X,X1,X2
+2 NEW KEY,KFIL,KNAM,UNIQ
+3 ;
+4 ;Loop through the xrefs loaded in @DIVCTMP
+5 SET DIXR=0
FOR
SET DIXR=$ORDER(@DIVCTMP@(DIFILE,DIXR))
IF DIXR'=+DIXR
QUIT
Begin DoDot:1
+6 SET DIXRNAM=$PIECE(@DIVCTMP@(DIFILE,DIXR),U)
+7 DO SETXARR^DIKC(DIFILE,DIXR,DIVCTMP,.DINULL)
MERGE X1=X,X2=X
+8 ;
+9 ;If no X values are null, but no index, set DIINDEX(name,xref#)
+10 IF 'DINULL
Begin DoDot:2
+11 SET DICHECK=$GET(@DIVCTMP@(DIFILE,DIXR,"V"))
+12 IF DICHECK]""
XECUTE DICHECK
IF '$TEST
SET DIINDEX(DIXRNAM,DIXR)=""
End DoDot:2
+13 ;
+14 ;If the xref is a uniqueness index for a key, set DIKEY() if
+15 ;key is not unique, or a key field is null.
+16 IF $DATA(^DD("KEY","AU",DIXR))
Begin DoDot:2
+17 SET UNIQ=$SELECT(DINULL:0,1:$$UNIQUE^DIKK2(DIFILE,DIXR,.X,.DA,DIVCTMP))
+18 IF 'UNIQ
SET KEY=0
FOR
SET KEY=$ORDER(^DD("KEY","AU",DIXR,KEY))
IF 'KEY
QUIT
Begin DoDot:3
+19 IF $DATA(^DD("KEY",KEY,0))[0
QUIT
SET KFIL=$PIECE(^(0),U)
SET KNAM=$PIECE(^(0),U,2)
+20 SET DIKEY(KFIL,KNAM,DIXRNAM)=$SELECT(DINULL:"null",1:"uniq")
End DoDot:3
End DoDot:2
End DoDot:1
+21 QUIT
+22 ;
+23 ;=============================
+24 ; CHK: Check input parameters
+25 ;=============================
+26 ;Out:
+27 ; DA = DA array
+28 ; DIFILE = File #
+29 ; DIROOT = Closed file root
+30 ; DIVERR = 1 : if there's a problem
+31 ;
CHK ;File is a required input parameter
+1 IF $GET(DIFILE)=""
IF DIFLAG["D"
DO ERR^DIKCU2(202,"","","","FILE")
DO ERR
QUIT
+2 IF $GET(DIFLD)=""
IF DIFLAG["D"
DO ERR^DIKCU2(202,"","","","FIELD")
DO ERR
QUIT
+3 ;
+4 ;Check DIREC and set DA array
+5 NEW DIIENS
+6 IF $GET(DIREC)'[","
MERGE DA=DIREC
SET DIIENS=$$IENS^DILF(.DA)
+7 IF '$TEST
IF DIREC'?.E1","
SET DIREC=DIREC_","
DO DA^DILF(DIREC,.DA)
SET DIIENS=DIREC
+8 IF '$$VDA^DIKCU1(.DA,DIFLAG_"R")
DO ERR
QUIT
+9 ;
+10 ;Check DIFLD
+11 IF '$$VFLD^DIKCU1(DIFILE,DIFLD,DIFLAG)
DO ERR
QUIT
+12 ;
+13 ;Set DIFILE and DIROOT
+14 NEW DILEV
+15 IF DIFILE=+$PIECE(DIFILE,"E")
Begin DoDot:1
+16 SET DIROOT=$$FROOTDA^DIKCU(DIFILE,DIFLAG,.DILEV)
IF DIROOT=""
DO ERR
QUIT
+17 IF DILEV
IF $DATA(DA(DILEV))[0
Begin DoDot:2
+18 IF DIFLAG["D"
DO ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE)
DO ERR
End DoDot:2
QUIT
+19 IF DILEV
SET DIROOT=$NAME(@DIROOT)
+20 SET DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG)
IF DIFILE=""
DO ERR
End DoDot:1
+21 IF '$TEST
Begin DoDot:1
+22 SET DIROOT=DIFILE
+23 IF "(,"[$EXTRACT(DIROOT,$LENGTH(DIROOT))
SET DIROOT=$$CREF^DILF(DIFILE)
+24 SET DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG)
IF DIFILE=""
DO ERR
QUIT
+25 SET DILEV=$$FLEV^DIKCU(DIFILE,DIFLAG)
IF DILEV=""
DO ERR
QUIT
+26 IF DILEV
IF $DATA(DA(DILEV))[0
Begin DoDot:2
+27 IF DIFLAG["D"
DO ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE)
DO ERR
End DoDot:2
QUIT
End DoDot:1
+28 QUIT
+29 ;
ERR ;Set error flag
+1 SET DIVERR=1
+2 QUIT
+3 ;
+4 ;============================
+5 ; LOADVER(file#,field#,tmp)
+6 ;============================
+7 ;Load xref info and verification logic for file/field into @TMP.
+8 ;Also, for each regular xref with no set condition, set
+9 ; @TMP@(rootFile#,xref#,"V")=I $D(^index),^index=indexVal
+10 ; where,
+11 ; index = something like DIZ(9999,"BB",X(1),X(2),DA)
+12 ; indexVal = value of index, usually ""
+13 ;
+14 ;In:
+15 ; FILE = File #
+16 ; FIELD = Field #
+17 ; TMP = Root to store logic
+18 ;
LOADVER(FILE,FIELD,TMP) ;Load indexes into TMP array
+1 NEW FIL,KL,SL,XR
+2 ;
+3 ;Load xref info for file/field into @TMP
+4 DO LOADFLD^DIKC1(FILE,FIELD,"KS","","",TMP,TMP)
+5 ;
+6 ;Set the "V" nodes, kill the "S" and "K" nodes
+7 SET FIL=0
FOR
SET FIL=$ORDER(@TMP@(FIL))
IF 'FIL
QUIT
Begin DoDot:1
+8 SET XR=0
FOR
SET XR=$ORDER(@TMP@(FIL,XR))
IF 'XR
QUIT
Begin DoDot:2
+9 IF $PIECE(@TMP@(FIL,XR),U,4)'="R"!$DATA(@TMP@(FIL,XR,"SC"))
KILL @TMP@(FIL,XR)
QUIT
+10 SET SL=$GET(@TMP@(FIL,XR,"S"))
SET KL=$GET(@TMP@(FIL,XR,"K"))
+11 IF SL?1"S ^"1.E
IF KL?1"K ^"1.E
Begin DoDot:3
+12 SET @TMP@(FIL,XR,"V")="I $D("_$EXTRACT(KL,3,999)_")#2,"_$EXTRACT(SL,3,999)
End DoDot:3
+13 KILL @TMP@(FIL,XR,"S"),@TMP@(FIL,XR,"K")
End DoDot:2
End DoDot:1
+14 QUIT
+15 ;
+16 ;#202 The input parameter that identifies the |1| is missing or invalid.
+17 ;#601 The entry does not exist.