| 1 | DIVC ;SFISC/MKO-VERIFY INDEXES/KEYS ;2:47 PM  23 Jan 1998 | 
|---|
| 2 | ;;22.0;VA FileMan;;Mar 30, 1999 | 
|---|
| 3 | ;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ;============================================ | 
|---|
| 5 | ; VINDEX(file,record,field,flag,.index,.key) | 
|---|
| 6 | ;============================================ | 
|---|
| 7 | ;Programmer entry point to check the existence of indexes and | 
|---|
| 8 | ;key integrity for a single file/field/record. (Currently not used) | 
|---|
| 9 | ;In: | 
|---|
| 10 | ; DIFILE = file or subfile # (required) | 
|---|
| 11 | ; DIREC  = DA array or IENS (required) | 
|---|
| 12 | ; DIFLD  = field # (required) | 
|---|
| 13 | ; DIFLAG [ D : generate dialog errors | 
|---|
| 14 | ;Out: | 
|---|
| 15 | ; For invalid indexes/keys: | 
|---|
| 16 | ; .DIINDEX(indexName,index#) = "" : if an index is not set | 
|---|
| 17 | ; .DIKEY(file#,keyName,uiNumber) = null : if a key field is null | 
|---|
| 18 | ;                                  uniq : if a key not unique | 
|---|
| 19 | ; | 
|---|
| 20 | VINDEX(DIFILE,DIREC,DIFLD,DIFLAG,DIINDEX,DIKEY) ; | 
|---|
| 21 | N DA,DIROOT,DIVCTMP,DIVERR | 
|---|
| 22 | ; | 
|---|
| 23 | ;Initialization | 
|---|
| 24 | S DIFLAG=$G(DIFLAG),DIVERR=0 | 
|---|
| 25 | I DIFLAG["D",'$D(DIQUIET) N DIQUIET S DIQUIET=1 | 
|---|
| 26 | I DIFLAG["D",'$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU | 
|---|
| 27 | ; | 
|---|
| 28 | ;Check and convert input paramaters | 
|---|
| 29 | D CHK Q:DIVERR | 
|---|
| 30 | ; | 
|---|
| 31 | ;Load xref info | 
|---|
| 32 | S DIVCTMP=$$GETTMP^DIKC1("DIVC") | 
|---|
| 33 | D LOADVER(DIFILE,DIFLD,DIVCTMP) | 
|---|
| 34 | ; | 
|---|
| 35 | D VER(DIFILE,DIROOT,.DA,DIVCTMP,.DIINDEX,.DIKEY) | 
|---|
| 36 | K @DIVCTMP | 
|---|
| 37 | Q | 
|---|
| 38 | ; | 
|---|
| 39 | ;========================================= | 
|---|
| 40 | ; VER(file#,fileRoot,.DA,tmp,.index,.key) | 
|---|
| 41 | ;========================================= | 
|---|
| 42 | ;Check that index is set. If index is a uniqueness index also | 
|---|
| 43 | ;check that key is unique, and that key fields are non-null. | 
|---|
| 44 | ;Called from INDEX^DIVR. | 
|---|
| 45 | ;In: | 
|---|
| 46 | ;  DIFILE  = [sub]file # | 
|---|
| 47 | ;  DIROOT  = closed [sub]file root | 
|---|
| 48 | ; .DA      = DA array | 
|---|
| 49 | ;  DIVCTMP = root where xref info and verification logic is stored | 
|---|
| 50 | ;Out: | 
|---|
| 51 | ; .DIINDEX = see VINDEX above | 
|---|
| 52 | ; .DIKEY   = see VINDEX above | 
|---|
| 53 | ; | 
|---|
| 54 | VER(DIFILE,DIROOT,DA,DIVCTMP,DIINDEX,DIKEY) ; | 
|---|
| 55 | N DICHECK,DINULL,DIXR,DIXRNAM,X,X1,X2 | 
|---|
| 56 | N KEY,KFIL,KNAM,UNIQ | 
|---|
| 57 | ; | 
|---|
| 58 | ;Loop through the xrefs loaded in @DIVCTMP | 
|---|
| 59 | S DIXR=0 F  S DIXR=$O(@DIVCTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR  D | 
|---|
| 60 | . S DIXRNAM=$P(@DIVCTMP@(DIFILE,DIXR),U) | 
|---|
| 61 | . D SETXARR^DIKC(DIFILE,DIXR,DIVCTMP,.DINULL) M X1=X,X2=X | 
|---|
| 62 | . ; | 
|---|
| 63 | . ;If no X values are null, but no index, set DIINDEX(name,xref#) | 
|---|
| 64 | . I 'DINULL D | 
|---|
| 65 | .. S DICHECK=$G(@DIVCTMP@(DIFILE,DIXR,"V")) | 
|---|
| 66 | .. I DICHECK]"" X DICHECK E  S DIINDEX(DIXRNAM,DIXR)="" | 
|---|
| 67 | . ; | 
|---|
| 68 | . ;If the xref is a uniqueness index for a key, set DIKEY() if | 
|---|
| 69 | . ;key is not unique, or a key field is null. | 
|---|
| 70 | . I $D(^DD("KEY","AU",DIXR)) D | 
|---|
| 71 | .. S UNIQ=$S(DINULL:0,1:$$UNIQUE^DIKK2(DIFILE,DIXR,.X,.DA,DIVCTMP)) | 
|---|
| 72 | .. I 'UNIQ S KEY=0 F  S KEY=$O(^DD("KEY","AU",DIXR,KEY)) Q:'KEY  D | 
|---|
| 73 | ... Q:$D(^DD("KEY",KEY,0))[0  S KFIL=$P(^(0),U),KNAM=$P(^(0),U,2) | 
|---|
| 74 | ... S DIKEY(KFIL,KNAM,DIXRNAM)=$S(DINULL:"null",1:"uniq") | 
|---|
| 75 | Q | 
|---|
| 76 | ; | 
|---|
| 77 | ;============================= | 
|---|
| 78 | ; CHK: Check input parameters | 
|---|
| 79 | ;============================= | 
|---|
| 80 | ;Out: | 
|---|
| 81 | ; DA     = DA array | 
|---|
| 82 | ; DIFILE = File # | 
|---|
| 83 | ; DIROOT = Closed file root | 
|---|
| 84 | ; DIVERR = 1 : if there's a problem | 
|---|
| 85 | ; | 
|---|
| 86 | CHK ;File is a required input parameter | 
|---|
| 87 | I $G(DIFILE)="" D:DIFLAG["D" ERR^DIKCU2(202,"","","","FILE") D ERR Q | 
|---|
| 88 | I $G(DIFLD)="" D:DIFLAG["D" ERR^DIKCU2(202,"","","","FIELD") D ERR Q | 
|---|
| 89 | ; | 
|---|
| 90 | ;Check DIREC and set DA array | 
|---|
| 91 | N DIIENS | 
|---|
| 92 | I $G(DIREC)'["," M DA=DIREC S DIIENS=$$IENS^DILF(.DA) | 
|---|
| 93 | E  S:DIREC'?.E1"," DIREC=DIREC_"," D DA^DILF(DIREC,.DA) S DIIENS=DIREC | 
|---|
| 94 | I '$$VDA^DIKCU1(.DA,DIFLAG_"R") D ERR Q | 
|---|
| 95 | ; | 
|---|
| 96 | ;Check DIFLD | 
|---|
| 97 | I '$$VFLD^DIKCU1(DIFILE,DIFLD,DIFLAG) D ERR Q | 
|---|
| 98 | ; | 
|---|
| 99 | ;Set DIFILE and DIROOT | 
|---|
| 100 | N DILEV | 
|---|
| 101 | I DIFILE=+$P(DIFILE,"E") D | 
|---|
| 102 | . S DIROOT=$$FROOTDA^DIKCU(DIFILE,DIFLAG,.DILEV) I DIROOT="" D ERR Q | 
|---|
| 103 | . I DILEV,$D(DA(DILEV))[0 D  Q | 
|---|
| 104 | .. D:DIFLAG["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR | 
|---|
| 105 | . S:DILEV DIROOT=$NA(@DIROOT) | 
|---|
| 106 | . S DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG) I DIFILE="" D ERR | 
|---|
| 107 | E  D | 
|---|
| 108 | . S DIROOT=DIFILE | 
|---|
| 109 | . S:"(,"[$E(DIROOT,$L(DIROOT)) DIROOT=$$CREF^DILF(DIFILE) | 
|---|
| 110 | . S DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG) I DIFILE="" D ERR Q | 
|---|
| 111 | . S DILEV=$$FLEV^DIKCU(DIFILE,DIFLAG) I DILEV="" D ERR Q | 
|---|
| 112 | . I DILEV,$D(DA(DILEV))[0 D  Q | 
|---|
| 113 | .. D:DIFLAG["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR | 
|---|
| 114 | Q | 
|---|
| 115 | ; | 
|---|
| 116 | ERR ;Set error flag | 
|---|
| 117 | S DIVERR=1 | 
|---|
| 118 | Q | 
|---|
| 119 | ; | 
|---|
| 120 | ;============================ | 
|---|
| 121 | ; LOADVER(file#,field#,tmp) | 
|---|
| 122 | ;============================ | 
|---|
| 123 | ;Load xref info and verification logic for file/field into @TMP. | 
|---|
| 124 | ;Also, for each regular xref with no set condition, set | 
|---|
| 125 | ;  @TMP@(rootFile#,xref#,"V")=I $D(^index),^index=indexVal | 
|---|
| 126 | ; where, | 
|---|
| 127 | ;  index    = something like DIZ(9999,"BB",X(1),X(2),DA) | 
|---|
| 128 | ;  indexVal = value of index, usually "" | 
|---|
| 129 | ; | 
|---|
| 130 | ;In: | 
|---|
| 131 | ; FILE  = File # | 
|---|
| 132 | ; FIELD = Field # | 
|---|
| 133 | ; TMP   = Root to store logic | 
|---|
| 134 | ; | 
|---|
| 135 | LOADVER(FILE,FIELD,TMP) ;Load indexes into TMP array | 
|---|
| 136 | N FIL,KL,SL,XR | 
|---|
| 137 | ; | 
|---|
| 138 | ;Load xref info for file/field into @TMP | 
|---|
| 139 | D LOADFLD^DIKC1(FILE,FIELD,"KS","","",TMP,TMP) | 
|---|
| 140 | ; | 
|---|
| 141 | ;Set the "V" nodes, kill the "S" and "K" nodes | 
|---|
| 142 | S FIL=0 F  S FIL=$O(@TMP@(FIL)) Q:'FIL  D | 
|---|
| 143 | . S XR=0 F  S XR=$O(@TMP@(FIL,XR)) Q:'XR  D | 
|---|
| 144 | .. I $P(@TMP@(FIL,XR),U,4)'="R"!$D(@TMP@(FIL,XR,"SC")) K @TMP@(FIL,XR) Q | 
|---|
| 145 | .. S SL=$G(@TMP@(FIL,XR,"S")),KL=$G(@TMP@(FIL,XR,"K")) | 
|---|
| 146 | .. I SL?1"S ^"1.E,KL?1"K ^"1.E D | 
|---|
| 147 | ... S @TMP@(FIL,XR,"V")="I $D("_$E(KL,3,999)_")#2,"_$E(SL,3,999) | 
|---|
| 148 | .. K @TMP@(FIL,XR,"S"),@TMP@(FIL,XR,"K") | 
|---|
| 149 | Q | 
|---|
| 150 | ; | 
|---|
| 151 | ;#202  The input parameter that identifies the |1| is missing or invalid. | 
|---|
| 152 | ;#601  The entry does not exist. | 
|---|