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