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
|
---|