1 | DIKCR ;SFISC/MKO-API TO CREATE A NEW-STYLE XREF ;9:55 AM 1 Nov 2002
|
---|
2 | ;;22.0;VA FileMan;**95**;Mar 30, 1999
|
---|
3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | CREIXN(DIKCXREF,DIFLG,DIXR,DIKCOUT,DIKCMSG) ;Create a new-style index
|
---|
6 | ;DIFLG:
|
---|
7 | ; e : Throw away Dialog errors
|
---|
8 | ; r : Don't recompile templates, xrefs
|
---|
9 | ; W : Write messages to the current device
|
---|
10 | ; S : Execute set logic of new xref
|
---|
11 | ;
|
---|
12 | CREIXNX ;Entry point from DDMOD
|
---|
13 | N DIKCDEL,DIKCXR,DIKCDMSG,DIKCERR,X,Y
|
---|
14 | ;
|
---|
15 | ;Init
|
---|
16 | S DIFLG=$G(DIFLG)
|
---|
17 | I DIFLG["e" S DIKCMSG="DIKCDMSG" N DIERR
|
---|
18 | I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
|
---|
19 | S DIKCDEL=$G(DIKCXREF("NAME"))]""
|
---|
20 | M DIKCXR=DIKCXREF
|
---|
21 | ;
|
---|
22 | ;Check input, set defaults
|
---|
23 | D CHK(.DIKCXR,.DIKCERR) G:DIKCERR EXIT
|
---|
24 | D CHKVAL(.DIKCXR,.DIKCERR) G:DIKCERR EXIT
|
---|
25 | ;
|
---|
26 | ;Delete the old index of the same name
|
---|
27 | D:DIKCDEL
|
---|
28 | . N DIKCFLAG,DIERR,DIKCDMSG
|
---|
29 | . S DIKCFLAG="d"_$E("W",DIFLG["W")_$E("K",DIFLG'["k")
|
---|
30 | . D DELIXN^DDMOD(DIKCXR("FILE"),DIKCXR("NAME"),DIKCFLAG,"","DIKCDMSG")
|
---|
31 | ;
|
---|
32 | ;Create the index
|
---|
33 | D UPDATE(.DIKCXR,.DIXR,DIFLG) I DIXR="" S DIKCERR=1 G EXIT
|
---|
34 | ;
|
---|
35 | ;Execute set logic
|
---|
36 | D:DIFLG["S" SET(DIXR,DIFLG)
|
---|
37 | ;
|
---|
38 | ;Recompile templates and xrefs
|
---|
39 | D:DIFLG'["r" RECOMP(DIXR,DIFLG)
|
---|
40 | ;
|
---|
41 | EXIT ;Write and move error messages if necessary
|
---|
42 | I $G(DIERR) D
|
---|
43 | . D:DIFLG["W" MSG^DIALOG("WES")
|
---|
44 | . D:$G(DIKCMSG)]"" CALLOUT^DIEFU(DIKCMSG)
|
---|
45 | I $G(DIKCERR) S DIXR=""
|
---|
46 | E S DIXR=DIXR_U_DIKCXR("NAME")
|
---|
47 | Q
|
---|
48 | ;
|
---|
49 | UPDATE(DIKCXR,DIXR,DIFLG) ;Call Updater to create index, return DIXR=ien
|
---|
50 | N DIKCFDA,DIKCIEN,IENS,ORD,R,SEQ,X
|
---|
51 | W:$G(DIFLG)["W" !,"Creating index definition ..."
|
---|
52 | ;
|
---|
53 | ;Set FDA for top level Index file fields
|
---|
54 | S DIKCFDA(.11,"+1,",.01)=DIKCXR("FILE")
|
---|
55 | S DIKCFDA(.11,"+1,",.02)=DIKCXR("NAME")
|
---|
56 | S DIKCFDA(.11,"+1,",.11)=DIKCXR("SHORT DESCR")
|
---|
57 | S DIKCFDA(.11,"+1,",.2)=DIKCXR("TYPE")
|
---|
58 | S DIKCFDA(.11,"+1,",.4)=DIKCXR("EXECUTION")
|
---|
59 | S DIKCFDA(.11,"+1,",.41)=DIKCXR("ACTIVITY")
|
---|
60 | S DIKCFDA(.11,"+1,",.42)=DIKCXR("USE")
|
---|
61 | S DIKCFDA(.11,"+1,",.5)=DIKCXR("ROOT TYPE")
|
---|
62 | S DIKCFDA(.11,"+1,",.51)=DIKCXR("ROOT FILE")
|
---|
63 | S DIKCFDA(.11,"+1,",1.1)=$S($G(DIKCXR("SET"))]"":DIKCXR("SET"),1:"Q")
|
---|
64 | S DIKCFDA(.11,"+1,",2.1)=$S($G(DIKCXR("KILL"))]"":DIKCXR("KILL"),1:"Q")
|
---|
65 | S:$G(DIKCXR("SET CONDITION"))]"" DIKCFDA(.11,"+1,",1.4)=DIKCXR("SET CONDITION")
|
---|
66 | S:$G(DIKCXR("KILL CONDITION"))]"" DIKCFDA(.11,"+1,",2.4)=DIKCXR("KILL CONDITION")
|
---|
67 | S:$G(DIKCXR("WHOLE KILL"))]"" DIKCFDA(.11,"+1,",2.5)=DIKCXR("WHOLE KILL")
|
---|
68 | ;
|
---|
69 | ;Set FDA for Values multiple
|
---|
70 | S ORD=0 F SEQ=2:1 S ORD=$O(DIKCXR("VAL",ORD)) Q:'ORD D
|
---|
71 | . S IENS="+"_SEQ_",+1,"
|
---|
72 | . S R=$NA(DIKCXR("VAL",ORD))
|
---|
73 | . S DIKCFDA(.114,IENS,.01)=ORD
|
---|
74 | . S DIKCFDA(.114,IENS,1)=@R@("TYPE")
|
---|
75 | . ;
|
---|
76 | . I @R@("TYPE")="C" S DIKCFDA(.114,IENS,4.5)=@R
|
---|
77 | . E D
|
---|
78 | .. S DIKCFDA(.114,IENS,2)=DIKCXR("ROOT FILE")
|
---|
79 | .. S DIKCFDA(.114,IENS,3)=@R
|
---|
80 | .. S X=$G(@R@("XFORM FOR STORAGE")) S:X]"" DIKCFDA(.114,IENS,5)=X
|
---|
81 | .. S X=$G(@R@("XFORM FOR LOOKUP")) S:X]"" DIKCFDA(.114,IENS,5.3)=X
|
---|
82 | .. S X=$G(@R@("XFORM FOR DISPLAY")) S:X]"" DIKCFDA(.114,IENS,5.5)=X
|
---|
83 | . ;
|
---|
84 | . S X=$G(@R@("SUBSCRIPT")) S:X]"" DIKCFDA(.114,IENS,.5)=X
|
---|
85 | . S X=$G(@R@("LENGTH")) S:X]"" DIKCFDA(.114,IENS,6)=X
|
---|
86 | . S X=$G(@R@("COLLATION")) S:X]"" DIKCFDA(.114,IENS,7)=X
|
---|
87 | . S X=$G(@R@("LOOKUP PROMPT")) S:X]"" DIKCFDA(.114,IENS,8)=X
|
---|
88 | ;
|
---|
89 | ;Call Updater
|
---|
90 | D UPDATE^DIE("E","DIKCFDA","DIKCIEN")
|
---|
91 | K DIXR I $G(DIERR) S DIXR="" Q
|
---|
92 | S DIXR=DIKCIEN(1)
|
---|
93 | ;
|
---|
94 | ;Add Description
|
---|
95 | D:$O(DIKCXR("DESCR",0)) WP^DIE(.11,DIXR_",",.1,"",$NA(DIKCXR("DESCR")))
|
---|
96 | Q
|
---|
97 | ;
|
---|
98 | RECOMP(DIXR,DIFLG) ;Recompile templates and xrefs, update triggering fields
|
---|
99 | N DIKCFLIS,DIKCI,DIKCTLIS,DIKCTOP,DIKTEML
|
---|
100 | ;
|
---|
101 | ;Get top level file number
|
---|
102 | S DIKCTOP=$$FNO^DILIBF($P($G(^DD("IX",DIXR,0)),U)) Q:'DIKCTOP
|
---|
103 | ;
|
---|
104 | ;Get list of fields in xref
|
---|
105 | D GETFLIST^DIKCUTL(DIXR,.DIKCFLIS) Q:'$D(DIKCFLIS)
|
---|
106 | ;
|
---|
107 | ;Recompile input templates and xrefs
|
---|
108 | D DIEZ^DIKD2(.DIKCFLIS,DIFLG,$G(DIKCOUT))
|
---|
109 | D DIKZ^DIKD(DIKCTOP,DIFLG,$G(DIKCOUT)) S DIKCTOP(DIKCTOP)=""
|
---|
110 | ;
|
---|
111 | ;Also update triggering fields, and their compiled templates and xrefs
|
---|
112 | D TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
|
---|
113 | I $D(DIKCTLIS) D
|
---|
114 | . D DIEZ^DIKD2(.DIKCTLIS,DIFLG,$G(DIKCOUT))
|
---|
115 | . S DIKCI=0 F S DIKCI=$O(DIKCTLIS(DIKCI)) Q:'DIKCI D
|
---|
116 | .. S DIKCTOP=+$$FNO^DILIBF(DIKCI) Q:$D(DIKCTOP(DIKCTOP))#2!'DIKCTOP
|
---|
117 | .. S DIKCTOP(DIKCTOP)=""
|
---|
118 | .. D DIKZ^DIKD(DIKCTOP,DIFLG,$G(DIKCOUT))
|
---|
119 | Q
|
---|
120 | ;
|
---|
121 | CHK(DIKCXR,DIKCERR) ;Check/default input array
|
---|
122 | N FIL,NAM,RFIL,TYP,USE
|
---|
123 | S DIKCERR=0
|
---|
124 | ;
|
---|
125 | ;Check FILE
|
---|
126 | S FIL=$G(DIKCXR("FILE")) I 'FIL D ER202("FILE") Q
|
---|
127 | I '$$VFNUM^DIKCU1(FIL,"D") S DIKCERR=1 Q
|
---|
128 | ;
|
---|
129 | ;Check Type, get internal form
|
---|
130 | S TYP=$G(DIKCXR("TYPE")) I TYP="" D ER202("TYPE") Q
|
---|
131 | D CHK^DIE(.11,.2,"",TYP,.TYP) I TYP=U S DIKCERR=1 Q
|
---|
132 | S DIKCXR("TYPE")=TYP
|
---|
133 | ;
|
---|
134 | ;Check USE, get internal form.
|
---|
135 | S USE=$G(DIKCXR("USE"))
|
---|
136 | I USE]"" D CHK^DIE(.11,.42,"",USE,.USE) I USE=U S DIKCERR=1 Q
|
---|
137 | S DIKCXR("USE")=USE
|
---|
138 | ;
|
---|
139 | S NAM=$G(DIKCXR("NAME"))
|
---|
140 | S RFIL=$G(DIKCXR("ROOT FILE"))
|
---|
141 | ;
|
---|
142 | ;Check Root File, set Root Type
|
---|
143 | S:'RFIL (RFIL,DIKCXR("ROOT FILE"))=FIL
|
---|
144 | I FIL=RFIL S DIKCXR("ROOT TYPE")="I"
|
---|
145 | E D Q:DIKCERR
|
---|
146 | . I $$FLEVDIFF^DIKCU(FIL,RFIL)="" D ER202("ROOT FILE") Q
|
---|
147 | . I '$$VFNUM^DIKCU1(RFIL,"D") S DIKCERR=1 Q
|
---|
148 | . S DIKCXR("ROOT TYPE")="W"
|
---|
149 | ;
|
---|
150 | ;Check USE, NAME, TYPE
|
---|
151 | I NAM="",USE="" D ER202("NAME/USE") Q
|
---|
152 | I $E(NAM)="A",USE="LS" D ER202("NAME/USE") Q
|
---|
153 | I USE="A",TYP'="MU" D ER202("TYPE/USE") Q
|
---|
154 | ;
|
---|
155 | ;Default NAM based on USE and FILE
|
---|
156 | ; or USE based on NAME and TYPE
|
---|
157 | I NAM="" S DIKCXR("NAME")=$$GETNAM(FIL,USE)
|
---|
158 | E I USE="" S DIKCXR("USE")=$S($E(NAM)="A":$S(TYP="MU":"A",1:"S"),1:"LS")
|
---|
159 | ;
|
---|
160 | ;Check SHORT DESCRIPTION'=null', if null set default Activity
|
---|
161 | I $G(DIKCXR("SHORT DESCR"))="" D ER202("SHORT DESCR") Q
|
---|
162 | S:$D(DIKCXR("ACTIVITY"))[0 DIKCXR("ACTIVITY")="IR"
|
---|
163 | Q
|
---|
164 | ;
|
---|
165 | CHKVAL(DIKCXR,DIKCERR) ;Check values, build logic for regular indexes
|
---|
166 | N CNT,FCNT,FIL,KILL,L,LEV,LDIF,MAXL,NAM,ORD,RFIL,ROOT,SBSC,SEQ,SET,TYP,VAL,WKIL
|
---|
167 | ;
|
---|
168 | S FIL=DIKCXR("FILE")
|
---|
169 | S NAM=DIKCXR("NAME")
|
---|
170 | S RFIL=DIKCXR("ROOT FILE")
|
---|
171 | S TYP=DIKCXR("TYPE")
|
---|
172 | S DIKCERR=0
|
---|
173 | ;
|
---|
174 | ;Begin building logic for regular indexes
|
---|
175 | I TYP="R" D Q:DIKCERR
|
---|
176 | . I FIL'=RFIL S LDIF=$$FLEVDIFF^DIKCU(FIL,RFIL)
|
---|
177 | . E S LDIF=0
|
---|
178 | . S ROOT=$$FROOTDA^DIKCU(FIL,LDIF_"O",.LEV)_""""_NAM_""""
|
---|
179 | . I $D(DIERR) S DIKCERR=1 Q
|
---|
180 | . S WKIL="K "_ROOT_")"
|
---|
181 | ;
|
---|
182 | ;Build list of subscripts, count #values and #fields
|
---|
183 | S ORD=0 F S ORD=$O(DIKCXR("VAL",ORD)) Q:'ORD D Q:DIKCERR
|
---|
184 | . I $G(DIKCXR("VAL",ORD))="" K DIKCXR("VAL",ORD) Q
|
---|
185 | . S CNT=$G(CNT)+1
|
---|
186 | . ;
|
---|
187 | . ;Get type of value; if field, increment field count
|
---|
188 | . I DIKCXR("VAL",ORD) S DIKCXR("VAL",ORD,"TYPE")="F",FCNT=$G(FCNT)+1
|
---|
189 | . E S DIKCXR("VAL",ORD,"TYPE")="C"
|
---|
190 | . ;
|
---|
191 | . ;Set subscript array; error if duplicate subscript #
|
---|
192 | . S SBSC=$G(DIKCXR("VAL",ORD,"SUBSCRIPT")) Q:'SBSC
|
---|
193 | . I $D(SBSC(SBSC))#2 D ER202("SUBSCRIPT") Q
|
---|
194 | . S SBSC(SBSC)=ORD_U_$G(DIKCXR("VAL",ORD,"LENGTH"))
|
---|
195 | . ;
|
---|
196 | . ;Set default collation
|
---|
197 | . S:$G(DIKCXR("VAL",ORD,"COLLATION"))="" DIKCXR("VAL",ORD,"COLLATION")="F"
|
---|
198 | Q:DIKCERR
|
---|
199 | ;
|
---|
200 | S SBSC=0 F SEQ=1:1 S SBSC=$O(SBSC(SBSC)) Q:'SBSC D Q:DIKCERR
|
---|
201 | . ;Check that subscripts are consecutive from 1
|
---|
202 | . I SEQ'=SBSC D ER202("SUBSCRIPTS") Q
|
---|
203 | . Q:TYP="MU"
|
---|
204 | . ;
|
---|
205 | . ;Continue building logic for regular indexes
|
---|
206 | . S ORD=$P(SBSC(SBSC),U),MAXL=$P(SBSC(SBSC),U,2)
|
---|
207 | . I $G(CNT)=1 S VAL=$S(MAXL:"$E(X,1,"_MAXL_")",1:"X")
|
---|
208 | . E S VAL=$S(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
|
---|
209 | . S ROOT=ROOT_","_VAL
|
---|
210 | ;
|
---|
211 | ;If null, default Execution based on #fields
|
---|
212 | S:$G(DIKCXR("EXECUTION"))="" DIKCXR("EXECUTION")=$S($G(FCNT)>1:"R",1:"F")
|
---|
213 | ;
|
---|
214 | ;We're done for MUMPS xrefs
|
---|
215 | Q:TYP="MU"
|
---|
216 | ;
|
---|
217 | ;Continue building logic for regular indexes
|
---|
218 | F L=LDIF:-1:1 S ROOT=ROOT_",DA("_L_")"
|
---|
219 | S ROOT=ROOT_",DA)"
|
---|
220 | ;
|
---|
221 | I '$O(SBSC(0)) S (SET,KILL)="Q",WKIL=""
|
---|
222 | E S SET="S "_ROOT_"=""""",KILL="K "_ROOT
|
---|
223 | S DIKCXR("SET")=SET
|
---|
224 | S DIKCXR("KILL")=KILL
|
---|
225 | S DIKCXR("WHOLE KILL")=WKIL
|
---|
226 | Q
|
---|
227 | ;
|
---|
228 | GETNAM(F01,USE) ;Get next available index name
|
---|
229 | N ASC,STRT,NAME,I
|
---|
230 | S STRT=$S(USE="LS":"",1:"A")
|
---|
231 | F ASC=67:1:89 D Q:NAME]""
|
---|
232 | . S NAME=STRT_$C(ASC)
|
---|
233 | . I $D(^DD("IX","BB",F01,NAME)) S NAME="" Q
|
---|
234 | . I $D(^DD(F01,0,"IX",NAME)) S NAME="" Q
|
---|
235 | Q:NAME]"" NAME
|
---|
236 | ;
|
---|
237 | F I=1:1 D Q:NAME]""
|
---|
238 | . S NAME=STRT_"C"_I
|
---|
239 | . I $D(^DD("IX","BB",F01,NAME)) S NAME="" Q
|
---|
240 | . I $D(^DD(F01,0,"IX",NAME)) S NAME="" Q
|
---|
241 | Q NAME
|
---|
242 | ;
|
---|
243 | SET(DIXR,DIFLG) ;Execute set logic
|
---|
244 | N DIKCRFIL,DIKCTOP,DIKCTRL,DIKCTYP
|
---|
245 | ;
|
---|
246 | S DIKCTOP=$$FNO^DILIBF($P($G(^DD("IX",DIXR,0)),U)) Q:'DIKCTOP
|
---|
247 | S DIKCRFIL=$P($G(^DD("IX",DIXR,0)),U,9) Q:'DIKCRFIL
|
---|
248 | S DIKCTYP=$P($G(^DD("IX",DIXR,0)),U,4)
|
---|
249 | ;
|
---|
250 | I $G(DIFLG)["W" D
|
---|
251 | . I DIKCTYP="R" W !,"Building index ..."
|
---|
252 | . E W !,"Executing set logic ..."
|
---|
253 | ;
|
---|
254 | ;Call INDEX^DIKC to execute the set logic
|
---|
255 | S DIKCTRL="S"_$S(DIKCTOP'=DIKCRFIL:"W"_DIKCRFIL,1:"")
|
---|
256 | D INDEX^DIKC(DIKCTOP,"","",DIXR,.DIKCTRL)
|
---|
257 | Q
|
---|
258 | ;
|
---|
259 | ER202(DIKCP1) ;;The input variable or parameter that identifies the |1| is missing or invalid.
|
---|
260 | D ERR^DIKCU2(202,"","","",DIKCP1)
|
---|
261 | S DIKCERR=1
|
---|
262 | Q
|
---|