| 1 | DIKCUTL2 ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;12:15 PM 1 Nov 2001
|
---|
| 2 | ;;22.0;VA FileMan;**68**;Mar 30, 1999
|
---|
| 3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ;========
|
---|
| 6 | ; $$TYPE
|
---|
| 7 | ;========
|
---|
| 8 | ;Prompt for type xref (to reindex or modify)
|
---|
| 9 | ;Returns:
|
---|
| 10 | ; '1' for Traditional; or
|
---|
| 11 | ; '2' for New
|
---|
| 12 | ;
|
---|
| 13 | TYPE() ;
|
---|
| 14 | N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
|
---|
| 15 | S DIR(0)="SAM^1:TRADITIONAL;2:NEW"
|
---|
| 16 | S DIR("A")="What type of cross-reference (Traditional or New)? "
|
---|
| 17 | S DIR("B")="Traditional"
|
---|
| 18 | S DIR("?",1)="Enter 'T' to select a Traditional cross-reference."
|
---|
| 19 | S DIR("?",2)=" Traditional cross references are stored in the data"
|
---|
| 20 | S DIR("?",3)=" dictionary under ^DD(file#,field#,1)."
|
---|
| 21 | S DIR("?",4)=" "
|
---|
| 22 | S DIR("?",5)="Enter 'N' to select a New-Style cross-reference."
|
---|
| 23 | S DIR("?",6)=" New-Style cross references are stored in the Index file."
|
---|
| 24 | S DIR("?",7)=" Compound indexes (indexes based on more than one field)"
|
---|
| 25 | S DIR("?")=" are examples of New-Style cross-references."
|
---|
| 26 | D ^DIR
|
---|
| 27 | Q $S($D(DIRUT):"",1:Y)
|
---|
| 28 | ;
|
---|
| 29 | ;==========================
|
---|
| 30 | ; GETXR(file#,.count,flag)
|
---|
| 31 | ;==========================
|
---|
| 32 | ;Loop through the "AC" index to get the list of Index file
|
---|
| 33 | ;xrefs with root file FIL.
|
---|
| 34 | ;In:
|
---|
| 35 | ; FIL = Root file #
|
---|
| 36 | ; FLG [ "M" : also get xrefs on subfiles of FIL
|
---|
| 37 | ;Out:
|
---|
| 38 | ; CNT = # xrefs^rootFile# (or null if FLG [ "M")
|
---|
| 39 | ; CNT(xref#) = rootFile#^File#^xrefName^rootType^UI[if uniq index]
|
---|
| 40 | ;
|
---|
| 41 | GETXR(FIL,CNT,FLG) ;
|
---|
| 42 | N F,SB,XR
|
---|
| 43 | K CNT
|
---|
| 44 | D:$G(FLG)["M" SUBFILES^DIKCU(FIL,.SB)
|
---|
| 45 | S SB(FIL)=""
|
---|
| 46 | ;
|
---|
| 47 | S (CNT,F)=0 F S F=$O(SB(F)) Q:'F D
|
---|
| 48 | . S XR=0 F S XR=$O(^DD("IX","AC",F,XR)) Q:'XR D
|
---|
| 49 | .. I $G(^DD("IX",XR,0))?."^" K ^DD("IX","AC",F,XR) Q
|
---|
| 50 | .. S CNT=CNT+1
|
---|
| 51 | .. S CNT(XR)=F_U_$P($G(^DD("IX",XR,0)),U,1,2)_U_$P(^(0),U,8)
|
---|
| 52 | .. S:$D(^DD("KEY","AU",XR)) $P(CNT(XR),U,5)="UI"
|
---|
| 53 | ;
|
---|
| 54 | S:$G(FLG)'["M" $P(CNT,U,2)=FIL
|
---|
| 55 | Q
|
---|
| 56 | ;
|
---|
| 57 | ;============================
|
---|
| 58 | ; LIST(.count,header,screen)
|
---|
| 59 | ;============================
|
---|
| 60 | ;List the xrefs in the CNT array
|
---|
| 61 | ;In:
|
---|
| 62 | ; CNT = Array of xrefs to print (obtained by GETXR call above)
|
---|
| 63 | ; HDR = Text to print before listing
|
---|
| 64 | ; (default is 'Current Indexes[ on [sub]file #xxx]:')
|
---|
| 65 | ; SCR = Sets $T to screen out indexes (Y = index#)
|
---|
| 66 | ;
|
---|
| 67 | LIST(CNT,HDR,SCR) ;
|
---|
| 68 | I '$G(CNT) W:$P(CNT,U,2) !,"There are no INDEX file cross-references defined on "_$$FSTR($P(CNT,U,2))_"." Q
|
---|
| 69 | N FIL,I,ONEFIL,RFIL,TYP,TXT,UI,XR,Y
|
---|
| 70 | ;
|
---|
| 71 | S ONEFIL=$P(CNT,U,2)
|
---|
| 72 | S:$G(HDR)="" HDR="Current Indexes"_$S(ONEFIL:" on "_$$FSTR(ONEFIL),1:"")_":"
|
---|
| 73 | W !,HDR
|
---|
| 74 | ;
|
---|
| 75 | S XR=0 F S XR=$O(CNT(XR)) Q:'XR D
|
---|
| 76 | . I $G(SCR)]"" K Y S Y=XR,Y(0)=CNT(XR) X SCR K Y E Q
|
---|
| 77 | . S FIL=$P(CNT(XR),U,2),RFIL=$P(CNT(XR),U),TYP=$P(CNT(XR),U,4)
|
---|
| 78 | . S UI=$S($P(CNT(XR),U,5)="UI":"uniqueness ",1:"")
|
---|
| 79 | . S RFIL=$S('ONEFIL:" on "_$$FSTR(RFIL),1:"")
|
---|
| 80 | . ;
|
---|
| 81 | . S TXT=XR_" "_$J("",5-$L(XR))_"'"_$P(CNT(XR),U,3)_"' "_UI
|
---|
| 82 | . I TYP'="W" S TXT=TXT_"index"_RFIL
|
---|
| 83 | . E S TXT=TXT_"whole file index"_RFIL_" (resides on "_$$FSTR(FIL)_")"
|
---|
| 84 | . ;
|
---|
| 85 | . D WRAP^DIKCU2(.TXT,-11,-2)
|
---|
| 86 | . W !," "_TXT F I=1:1 Q:$D(TXT(I))[0 W !?10,TXT(I)
|
---|
| 87 | . K TXT
|
---|
| 88 | Q
|
---|
| 89 | ;
|
---|
| 90 | ;================================
|
---|
| 91 | ; $$CHOOSE(.count,prompt,screen)
|
---|
| 92 | ;================================
|
---|
| 93 | ;Prompt for a xref from the DIKCCNT array
|
---|
| 94 | ;In:
|
---|
| 95 | ; DIKCCNT = Array contain xref data (obtained by GETXR call above)
|
---|
| 96 | ; DIKCPR = Action to include with the prompt
|
---|
| 97 | ; DIKCSCR = Sets $T to screen out entries (Y=index#)
|
---|
| 98 | ;Returns:
|
---|
| 99 | ; Index ien (or 0, if none selected)
|
---|
| 100 | ;
|
---|
| 101 | CHOOSE(DIKCCNT,DIKCPR,DIKCSCR) ;
|
---|
| 102 | Q:'$G(DIKCCNT) 0
|
---|
| 103 | N I,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
|
---|
| 104 | ;
|
---|
| 105 | S DIR(0)="SAO^"
|
---|
| 106 | S I=0 F S I=$O(DIKCCNT(I)) Q:'I S DIR("C",I)=I_":"_$P(DIKCCNT(I),U,3)
|
---|
| 107 | S DIR("A")="Which Index do you wish to "_DIKCPR_"? "
|
---|
| 108 | S:+DIKCCNT=1 DIR("B")=$O(DIKCCNT(0))
|
---|
| 109 | S DIR("?")="",DIR("??")="^D LIST^DIKCUTL2(.DIKCCNT)"
|
---|
| 110 | W ! D ^DIR I 'Y!$D(DIRUT) Q 0
|
---|
| 111 | Q Y
|
---|
| 112 | ;
|
---|
| 113 | ;====================
|
---|
| 114 | ; $$FSTR(file#,flag)
|
---|
| 115 | ;====================
|
---|
| 116 | ;Return string 'file #xxx' or 'subfile #xxx'
|
---|
| 117 | ;In:
|
---|
| 118 | ; FIL = File #
|
---|
| 119 | ; FLG [ U : Capitalize 'File' or 'Subfile'
|
---|
| 120 | ;
|
---|
| 121 | FSTR(FIL,FLG) ;
|
---|
| 122 | ;Q $P($P("f;F^subf;Subf",U,$G(^DD(FIL,0,"UP"))>0+1),";",$G(FLG)["U"+1)_"ile #"_FIL
|
---|
| 123 | Q $P($$EZBLD^DIALOG(8098),U,$G(^DD(FIL,0,"UP"))>0*2+1+($G(FLG)["U"))_" #"_FIL
|
---|
| 124 | ;
|
---|
| 125 | ;================
|
---|
| 126 | ; PRTMSG(index#)
|
---|
| 127 | ;================
|
---|
| 128 | ;Print message that DIXR can't be deleted because it's the
|
---|
| 129 | ;Uniqueness Index for a key.
|
---|
| 130 | ;In:
|
---|
| 131 | ; DIXR = index #
|
---|
| 132 | ;
|
---|
| 133 | PRTMSG(DIXR) ;
|
---|
| 134 | N KEYID,I,INDID,MSG
|
---|
| 135 | ;
|
---|
| 136 | S KEYID=$O(^DD("KEY","AU",DIXR,0)) Q:'KEYID
|
---|
| 137 | S KEYID=$G(^DD("KEY",KEYID,0)) Q:KEYID?."^"
|
---|
| 138 | S KEYID="Key '"_$P(KEYID,U,2)_"' on File #"_$P(KEYID,U)
|
---|
| 139 | ;
|
---|
| 140 | S INDID="Index '"_$P($G(^DD("IX",DIXR,0)),U,2)_"'"
|
---|
| 141 | S MSG(0)=INDID_" cannot be deleted. It is the uniqueness index for "_KEYID_"."
|
---|
| 142 | D WRAP^DIKCU2(.MSG)
|
---|
| 143 | ;
|
---|
| 144 | W $C(7) F I=0:1 Q:'$D(MSG(I)) W !,MSG(I)
|
---|
| 145 | Q
|
---|
| 146 | ;
|
---|
| 147 | ;================
|
---|
| 148 | ; BLDLOG(index#)
|
---|
| 149 | ;================
|
---|
| 150 | ;Build and file the logic of the cross reference.
|
---|
| 151 | ;In:
|
---|
| 152 | ; DIXR = index #
|
---|
| 153 | ;
|
---|
| 154 | ;Called from EDIT^DIKCUTL after an Index is edited.
|
---|
| 155 | ;The reason for this call is if the user deletes some Cross-Reference
|
---|
| 156 | ;Values, and then Quits the form, the Set/Kill logic may not reflect
|
---|
| 157 | ;the deleted Values.
|
---|
| 158 | ;
|
---|
| 159 | BLDLOG(DIXR) ;
|
---|
| 160 | N CNT,CRV,CRV0,DIERR,FCNT,FDA,FILE,IX0,KILL,L,LDIF,MAXL,MSG
|
---|
| 161 | N NAME,ORD,ROOT,RTYPE,RFILE,SBSC,SET,VAL,WKILL
|
---|
| 162 | ;
|
---|
| 163 | ;Get index data
|
---|
| 164 | S IX0=$G(^DD("IX",DIXR,0)) Q:IX0?."^"
|
---|
| 165 | I $P(IX0,U,4)="MU" D UPDEXEC(DIXR) Q
|
---|
| 166 | S FILE=$P(IX0,U),NAME=$P(IX0,U,2),RTYPE=$P(IX0,U,8),RFILE=$P(IX0,U,9)
|
---|
| 167 | ;
|
---|
| 168 | ;Build root of index and the 'Kill Entire Index Code'
|
---|
| 169 | I FILE'=RFILE Q:RTYPE'="W" S LDIF=$$FLEVDIFF^DIKCU(FILE,RFILE)
|
---|
| 170 | E S LDIF=0
|
---|
| 171 | S ROOT=$$FROOTDA^DIKCU(FILE,LDIF_"O")_""""_NAME_""""
|
---|
| 172 | S WKILL="K "_ROOT_")"
|
---|
| 173 | ;
|
---|
| 174 | ;Loop through Cross-Reference Values multiple
|
---|
| 175 | ;Build SBSC(subscript#)=order#^maxLength array
|
---|
| 176 | S CRV=0 F S CRV=$O(^DD("IX",DIXR,11.1,CRV)) Q:'CRV D
|
---|
| 177 | . S CRV0=$G(^DD("IX",DIXR,11.1,CRV,0)) Q:CRV0?."^"
|
---|
| 178 | . S ORD=$P(CRV0,U) Q:'ORD
|
---|
| 179 | . S:$P(CRV0,U,2)="F" FCNT=$G(FCNT)+1
|
---|
| 180 | . S CNT=$G(CNT)+1
|
---|
| 181 | . S SBSC=$P(CRV0,U,6) Q:'SBSC
|
---|
| 182 | . S MAXL=$P(CRV0,U,5)
|
---|
| 183 | . S SBSC(SBSC)=ORD_U_MAXL
|
---|
| 184 | ;
|
---|
| 185 | ;Loop through SBSC array and build the root w/ X(n) array
|
---|
| 186 | S SBSC=0 F S SBSC=$O(SBSC(SBSC)) Q:'SBSC D
|
---|
| 187 | . S ORD=$P(SBSC(SBSC),U),MAXL=$P(SBSC(SBSC),U,2)
|
---|
| 188 | . I $G(CNT)=1 S VAL=$S(MAXL:"$E(X,1,"_MAXL_")",1:"X")
|
---|
| 189 | . E S VAL=$S(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
|
---|
| 190 | . S ROOT=ROOT_","_VAL
|
---|
| 191 | ;
|
---|
| 192 | ;Append DA(n) to root
|
---|
| 193 | F L=LDIF:-1:1 S ROOT=ROOT_",DA("_L_")"
|
---|
| 194 | S ROOT=ROOT_",DA)"
|
---|
| 195 | ;
|
---|
| 196 | ;Build and file the Set and Kill Logic and the Execution
|
---|
| 197 | I '$O(SBSC(0)) S (SET,KILL)="Q",WKILL=""
|
---|
| 198 | E S SET="S "_ROOT_"=""""",KILL="K "_ROOT
|
---|
| 199 | K FDA
|
---|
| 200 | S FDA(.11,DIXR_",",1.1)=SET
|
---|
| 201 | S FDA(.11,DIXR_",",2.1)=KILL
|
---|
| 202 | S FDA(.11,DIXR_",",2.5)=WKILL
|
---|
| 203 | S FDA(.11,DIXR_",",.4)=$S($G(FCNT)>1:"R",1:"F")
|
---|
| 204 | D FILE^DIE("","FDA","MSG")
|
---|
| 205 | Q
|
---|
| 206 | ;
|
---|
| 207 | UPDEXEC(DIXR) ;Update Execution based on number of field-type xref values
|
---|
| 208 | N CRV,CRV0,DIERR,FCNT,FDA,MSG
|
---|
| 209 | S CRV(1)=DIXR,CRV=0
|
---|
| 210 | F S CRV=$O(^DD("IX",DIXR,11.1,CRV)) Q:'CRV D
|
---|
| 211 | . S CRV0=$G(^DD("IX",DIXR,11.1,CRV,0)) Q:'CRV0
|
---|
| 212 | . S:$P(CRV0,U,2)="F" FCNT=$G(FCNT)+1
|
---|
| 213 | S FDA(.11,DIXR_",",.4)=$S($G(FCNT)>1:"R",1:"F")
|
---|
| 214 | D FILE^DIE("","FDA","MSG")
|
---|
| 215 | Q
|
---|