DIKCR ;SFISC/MKO-API TO CREATE A NEW-STYLE XREF ;9:55 AM 1 Nov 2002 [ 12/09/2003 4:44 PM ]
;;22.0;VA FileMan;**95,1002**;Mar 30, 1999
;Per VHA Directive 10-93-142, this routine should not be modified.
;
CREIXN(DIKCXREF,DIFLG,DIXR,DIKCOUT,DIKCMSG) ;Create a new-style index
;DIFLG:
; e : Throw away Dialog errors
; r : Don't recompile templates, xrefs
; W : Write messages to the current device
; S : Execute set logic of new xref
;
CREIXNX ;Entry point from DDMOD
N DIKCDEL,DIKCXR,DIKCDMSG,DIKCERR,X,Y
;
;Init
S DIFLG=$G(DIFLG)
I DIFLG["e" S DIKCMSG="DIKCDMSG" N DIERR
I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
S DIKCDEL=$G(DIKCXREF("NAME"))]""
M DIKCXR=DIKCXREF
;
;Check input, set defaults
D CHK(.DIKCXR,.DIKCERR) G:DIKCERR EXIT
D CHKVAL(.DIKCXR,.DIKCERR) G:DIKCERR EXIT
;
;Delete the old index of the same name
D:DIKCDEL
. N DIKCFLAG,DIERR,DIKCDMSG
. S DIKCFLAG="d"_$E("W",DIFLG["W")_$E("K",DIFLG'["k")
. D DELIXN^DDMOD(DIKCXR("FILE"),DIKCXR("NAME"),DIKCFLAG,"","DIKCDMSG")
;
;Create the index
D UPDATE(.DIKCXR,.DIXR,DIFLG) I DIXR="" S DIKCERR=1 G EXIT
;
;Execute set logic
D:DIFLG["S" SET(DIXR,DIFLG)
;
;Recompile templates and xrefs
D:DIFLG'["r" RECOMP(DIXR,DIFLG)
;
EXIT ;Write and move error messages if necessary
I $G(DIERR) D
. D:DIFLG["W" MSG^DIALOG("WES")
. D:$G(DIKCMSG)]"" CALLOUT^DIEFU(DIKCMSG)
I $G(DIKCERR) S DIXR=""
E S DIXR=DIXR_U_DIKCXR("NAME")
Q
;
UPDATE(DIKCXR,DIXR,DIFLG) ;Call Updater to create index, return DIXR=ien
N DIKCFDA,DIKCIEN,IENS,ORD,R,SEQ,X
W:$G(DIFLG)["W" !,"Creating index definition ..."
;
;Set FDA for top level Index file fields
S DIKCFDA(.11,"+1,",.01)=DIKCXR("FILE")
S DIKCFDA(.11,"+1,",.02)=DIKCXR("NAME")
S DIKCFDA(.11,"+1,",.11)=DIKCXR("SHORT DESCR")
S DIKCFDA(.11,"+1,",.2)=DIKCXR("TYPE")
S DIKCFDA(.11,"+1,",.4)=DIKCXR("EXECUTION")
S DIKCFDA(.11,"+1,",.41)=DIKCXR("ACTIVITY")
S DIKCFDA(.11,"+1,",.42)=DIKCXR("USE")
S DIKCFDA(.11,"+1,",.5)=DIKCXR("ROOT TYPE")
S DIKCFDA(.11,"+1,",.51)=DIKCXR("ROOT FILE")
S DIKCFDA(.11,"+1,",1.1)=$S($G(DIKCXR("SET"))]"":DIKCXR("SET"),1:"Q")
S DIKCFDA(.11,"+1,",2.1)=$S($G(DIKCXR("KILL"))]"":DIKCXR("KILL"),1:"Q")
S:$G(DIKCXR("SET CONDITION"))]"" DIKCFDA(.11,"+1,",1.4)=DIKCXR("SET CONDITION")
S:$G(DIKCXR("KILL CONDITION"))]"" DIKCFDA(.11,"+1,",2.4)=DIKCXR("KILL CONDITION")
S:$G(DIKCXR("WHOLE KILL"))]"" DIKCFDA(.11,"+1,",2.5)=DIKCXR("WHOLE KILL")
;
;Set FDA for Values multiple
S ORD=0 F SEQ=2:1 S ORD=$O(DIKCXR("VAL",ORD)) Q:'ORD D
. S IENS="+"_SEQ_",+1,"
. S R=$NA(DIKCXR("VAL",ORD))
. S DIKCFDA(.114,IENS,.01)=ORD
. S DIKCFDA(.114,IENS,1)=@R@("TYPE")
. ;
. I @R@("TYPE")="C" S DIKCFDA(.114,IENS,4.5)=@R
. E D
.. S DIKCFDA(.114,IENS,2)=DIKCXR("ROOT FILE")
.. S DIKCFDA(.114,IENS,3)=@R
.. S X=$G(@R@("XFORM FOR STORAGE")) S:X]"" DIKCFDA(.114,IENS,5)=X
.. S X=$G(@R@("XFORM FOR LOOKUP")) S:X]"" DIKCFDA(.114,IENS,5.3)=X
.. S X=$G(@R@("XFORM FOR DISPLAY")) S:X]"" DIKCFDA(.114,IENS,5.5)=X
. ;
. S X=$G(@R@("SUBSCRIPT")) S:X]"" DIKCFDA(.114,IENS,.5)=X
. S X=$G(@R@("LENGTH")) S:X]"" DIKCFDA(.114,IENS,6)=X
. S X=$G(@R@("COLLATION")) S:X]"" DIKCFDA(.114,IENS,7)=X
. S X=$G(@R@("LOOKUP PROMPT")) S:X]"" DIKCFDA(.114,IENS,8)=X
;
;Call Updater
D UPDATE^DIE("E","DIKCFDA","DIKCIEN")
K DIXR I $G(DIERR) S DIXR="" Q
S DIXR=DIKCIEN(1)
;
;Add Description
D:$O(DIKCXR("DESCR",0)) WP^DIE(.11,DIXR_",",.1,"",$NA(DIKCXR("DESCR")))
Q
;
RECOMP(DIXR,DIFLG) ;Recompile templates and xrefs, update triggering fields
N DIKCFLIS,DIKCI,DIKCTLIS,DIKCTOP,DIKTEML
;
;Get top level file number
S DIKCTOP=$$FNO^DILIBF($P($G(^DD("IX",DIXR,0)),U)) Q:'DIKCTOP
;
;Get list of fields in xref
D GETFLIST^DIKCUTL(DIXR,.DIKCFLIS) Q:'$D(DIKCFLIS)
;
;Recompile input templates and xrefs
D DIEZ^DIKD2(.DIKCFLIS,DIFLG,$G(DIKCOUT))
D DIKZ^DIKD(DIKCTOP,DIFLG,$G(DIKCOUT)) S DIKCTOP(DIKCTOP)=""
;
;Also update triggering fields, and their compiled templates and xrefs
D TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
I $D(DIKCTLIS) D
. D DIEZ^DIKD2(.DIKCTLIS,DIFLG,$G(DIKCOUT))
. S DIKCI=0 F S DIKCI=$O(DIKCTLIS(DIKCI)) Q:'DIKCI D
.. S DIKCTOP=+$$FNO^DILIBF(DIKCI) Q:$D(DIKCTOP(DIKCTOP))#2!'DIKCTOP
.. S DIKCTOP(DIKCTOP)=""
.. D DIKZ^DIKD(DIKCTOP,DIFLG,$G(DIKCOUT))
Q
;
CHK(DIKCXR,DIKCERR) ;Check/default input array
N FIL,NAM,RFIL,TYP,USE
S DIKCERR=0
;
;Check FILE
S FIL=$G(DIKCXR("FILE")) I 'FIL D ER202("FILE") Q
I '$$VFNUM^DIKCU1(FIL,"D") S DIKCERR=1 Q
;
;Check Type, get internal form
S TYP=$G(DIKCXR("TYPE")) I TYP="" D ER202("TYPE") Q
D CHK^DIE(.11,.2,"",TYP,.TYP) I TYP=U S DIKCERR=1 Q
S DIKCXR("TYPE")=TYP
;
;Check USE, get internal form.
S USE=$G(DIKCXR("USE"))
I USE]"" D CHK^DIE(.11,.42,"",USE,.USE) I USE=U S DIKCERR=1 Q
S DIKCXR("USE")=USE
;
S NAM=$G(DIKCXR("NAME"))
S RFIL=$G(DIKCXR("ROOT FILE"))
;
;Check Root File, set Root Type
S:'RFIL (RFIL,DIKCXR("ROOT FILE"))=FIL
I FIL=RFIL S DIKCXR("ROOT TYPE")="I"
E D Q:DIKCERR
. I $$FLEVDIFF^DIKCU(FIL,RFIL)="" D ER202("ROOT FILE") Q
. I '$$VFNUM^DIKCU1(RFIL,"D") S DIKCERR=1 Q
. S DIKCXR("ROOT TYPE")="W"
;
;Check USE, NAME, TYPE
I NAM="",USE="" D ER202("NAME/USE") Q
I $E(NAM)="A",USE="LS" D ER202("NAME/USE") Q
I USE="A",TYP'="MU" D ER202("TYPE/USE") Q
;
;Default NAM based on USE and FILE
; or USE based on NAME and TYPE
I NAM="" S DIKCXR("NAME")=$$GETNAM(FIL,USE)
E I USE="" S DIKCXR("USE")=$S($E(NAM)="A":$S(TYP="MU":"A",1:"S"),1:"LS")
;
;Check SHORT DESCRIPTION'=null', if null set default Activity
I $G(DIKCXR("SHORT DESCR"))="" D ER202("SHORT DESCR") Q
S:$D(DIKCXR("ACTIVITY"))[0 DIKCXR("ACTIVITY")="IR"
Q
;
CHKVAL(DIKCXR,DIKCERR) ;Check values, build logic for regular indexes
N CNT,FCNT,FIL,KILL,L,LEV,LDIF,MAXL,NAM,ORD,RFIL,ROOT,SBSC,SEQ,SET,TYP,VAL,WKIL
;
S FIL=DIKCXR("FILE")
S NAM=DIKCXR("NAME")
S RFIL=DIKCXR("ROOT FILE")
S TYP=DIKCXR("TYPE")
S DIKCERR=0
;
;Begin building logic for regular indexes
I TYP="R" D Q:DIKCERR
. I FIL'=RFIL S LDIF=$$FLEVDIFF^DIKCU(FIL,RFIL)
. E S LDIF=0
. S ROOT=$$FROOTDA^DIKCU(FIL,LDIF_"O",.LEV)_""""_NAM_""""
. I $D(DIERR) S DIKCERR=1 Q
. S WKIL="K "_ROOT_")"
;
;Build list of subscripts, count #values and #fields
S ORD=0 F S ORD=$O(DIKCXR("VAL",ORD)) Q:'ORD D Q:DIKCERR
. I $G(DIKCXR("VAL",ORD))="" K DIKCXR("VAL",ORD) Q
. S CNT=$G(CNT)+1
. ;
. ;Get type of value; if field, increment field count
. I DIKCXR("VAL",ORD) S DIKCXR("VAL",ORD,"TYPE")="F",FCNT=$G(FCNT)+1
. E S DIKCXR("VAL",ORD,"TYPE")="C"
. ;
. ;Set subscript array; error if duplicate subscript #
. S SBSC=$G(DIKCXR("VAL",ORD,"SUBSCRIPT")) Q:'SBSC
. I $D(SBSC(SBSC))#2 D ER202("SUBSCRIPT") Q
. S SBSC(SBSC)=ORD_U_$G(DIKCXR("VAL",ORD,"LENGTH"))
. ;
. ;Set default collation
. S:$G(DIKCXR("VAL",ORD,"COLLATION"))="" DIKCXR("VAL",ORD,"COLLATION")="F"
Q:DIKCERR
;
S SBSC=0 F SEQ=1:1 S SBSC=$O(SBSC(SBSC)) Q:'SBSC D Q:DIKCERR
. ;Check that subscripts are consecutive from 1
. I SEQ'=SBSC D ER202("SUBSCRIPTS") Q
. Q:TYP="MU"
. ;
. ;Continue building logic for regular indexes
. S ORD=$P(SBSC(SBSC),U),MAXL=$P(SBSC(SBSC),U,2)
. I $G(CNT)=1 S VAL=$S(MAXL:"$E(X,1,"_MAXL_")",1:"X")
. E S VAL=$S(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
. S ROOT=ROOT_","_VAL
;
;If null, default Execution based on #fields
S:$G(DIKCXR("EXECUTION"))="" DIKCXR("EXECUTION")=$S($G(FCNT)>1:"R",1:"F")
;
;We're done for MUMPS xrefs
Q:TYP="MU"
;
;Continue building logic for regular indexes
F L=LDIF:-1:1 S ROOT=ROOT_",DA("_L_")"
S ROOT=ROOT_",DA)"
;
I '$O(SBSC(0)) S (SET,KILL)="Q",WKIL=""
E S SET="S "_ROOT_"=""""",KILL="K "_ROOT
S DIKCXR("SET")=SET
S DIKCXR("KILL")=KILL
S DIKCXR("WHOLE KILL")=WKIL
Q
;
GETNAM(F01,USE) ;Get next available index name
N ASC,STRT,NAME,I
S STRT=$S(USE="LS":"",1:"A")
F ASC=67:1:89 D Q:NAME]""
. S NAME=STRT_$C(ASC)
. I $D(^DD("IX","BB",F01,NAME)) S NAME="" Q
. I $D(^DD(F01,0,"IX",NAME)) S NAME="" Q
Q:NAME]"" NAME
;
F I=1:1 D Q:NAME]""
. S NAME=STRT_"C"_I
. I $D(^DD("IX","BB",F01,NAME)) S NAME="" Q
. I $D(^DD(F01,0,"IX",NAME)) S NAME="" Q
Q NAME
;
SET(DIXR,DIFLG) ;Execute set logic
N DIKCRFIL,DIKCTOP,DIKCTRL,DIKCTYP
;
S DIKCTOP=$$FNO^DILIBF($P($G(^DD("IX",DIXR,0)),U)) Q:'DIKCTOP
S DIKCRFIL=$P($G(^DD("IX",DIXR,0)),U,9) Q:'DIKCRFIL
S DIKCTYP=$P($G(^DD("IX",DIXR,0)),U,4)
;
I $G(DIFLG)["W" D
. I DIKCTYP="R" W !,"Building index ..."
. E W !,"Executing set logic ..."
;
;Call INDEX^DIKC to execute the set logic
S DIKCTRL="S"_$S(DIKCTOP'=DIKCRFIL:"W"_DIKCRFIL,1:"")
D INDEX^DIKC(DIKCTOP,"","",DIXR,.DIKCTRL)
Q
;
ER202(DIKCP1) ;;The input variable or parameter that identifies the |1| is missing or invalid.
D ERR^DIKCU2(202,"","","",DIKCP1)
S DIKCERR=1
Q
DIKCR ;SFISC/MKO-API TO CREATE A NEW-STYLE XREF ;9:55 AM 1 Nov 2002 [ 12/09/2003 4:44 PM ]
+1 ;;22.0;VA FileMan;**95,1002**;Mar 30, 1999
+2 ;Per VHA Directive 10-93-142, this routine should not be modified.
+3 ;
CREIXN(DIKCXREF,DIFLG,DIXR,DIKCOUT,DIKCMSG) ;Create a new-style index
+1 ;DIFLG:
+2 ; e : Throw away Dialog errors
+3 ; r : Don't recompile templates, xrefs
+4 ; W : Write messages to the current device
+5 ; S : Execute set logic of new xref
+6 ;
CREIXNX ;Entry point from DDMOD
+1 NEW DIKCDEL,DIKCXR,DIKCDMSG,DIKCERR,X,Y
+2 ;
+3 ;Init
+4 SET DIFLG=$GET(DIFLG)
+5 IF DIFLG["e"
SET DIKCMSG="DIKCDMSG"
NEW DIERR
+6 IF '$DATA(DIFM)
NEW DIFM
SET DIFM=1
DO INIZE^DIEFU
+7 SET DIKCDEL=$GET(DIKCXREF("NAME"))]""
+8 MERGE DIKCXR=DIKCXREF
+9 ;
+10 ;Check input, set defaults
+11 DO CHK(.DIKCXR,.DIKCERR)
IF DIKCERR
GOTO EXIT
+12 DO CHKVAL(.DIKCXR,.DIKCERR)
IF DIKCERR
GOTO EXIT
+13 ;
+14 ;Delete the old index of the same name
+15 IF DIKCDEL
Begin DoDot:1
+16 NEW DIKCFLAG,DIERR,DIKCDMSG
+17 SET DIKCFLAG="d"_$EXTRACT("W",DIFLG["W")_$EXTRACT("K",DIFLG'["k")
+18 DO DELIXN^DDMOD(DIKCXR("FILE"),DIKCXR("NAME"),DIKCFLAG,"","DIKCDMSG")
End DoDot:1
+19 ;
+20 ;Create the index
+21 DO UPDATE(.DIKCXR,.DIXR,DIFLG)
IF DIXR=""
SET DIKCERR=1
GOTO EXIT
+22 ;
+23 ;Execute set logic
+24 IF DIFLG["S"
DO SET(DIXR,DIFLG)
+25 ;
+26 ;Recompile templates and xrefs
+27 IF DIFLG'["r"
DO RECOMP(DIXR,DIFLG)
+28 ;
EXIT ;Write and move error messages if necessary
+1 IF $GET(DIERR)
Begin DoDot:1
+2 IF DIFLG["W"
DO MSG^DIALOG("WES")
+3 IF $GET(DIKCMSG)]""
DO CALLOUT^DIEFU(DIKCMSG)
End DoDot:1
+4 IF $GET(DIKCERR)
SET DIXR=""
+5 IF '$TEST
SET DIXR=DIXR_U_DIKCXR("NAME")
+6 QUIT
+7 ;
UPDATE(DIKCXR,DIXR,DIFLG) ;Call Updater to create index, return DIXR=ien
+1 NEW DIKCFDA,DIKCIEN,IENS,ORD,R,SEQ,X
+2 IF $GET(DIFLG)["W"
WRITE !,"Creating index definition ..."
+3 ;
+4 ;Set FDA for top level Index file fields
+5 SET DIKCFDA(.11,"+1,",.01)=DIKCXR("FILE")
+6 SET DIKCFDA(.11,"+1,",.02)=DIKCXR("NAME")
+7 SET DIKCFDA(.11,"+1,",.11)=DIKCXR("SHORT DESCR")
+8 SET DIKCFDA(.11,"+1,",.2)=DIKCXR("TYPE")
+9 SET DIKCFDA(.11,"+1,",.4)=DIKCXR("EXECUTION")
+10 SET DIKCFDA(.11,"+1,",.41)=DIKCXR("ACTIVITY")
+11 SET DIKCFDA(.11,"+1,",.42)=DIKCXR("USE")
+12 SET DIKCFDA(.11,"+1,",.5)=DIKCXR("ROOT TYPE")
+13 SET DIKCFDA(.11,"+1,",.51)=DIKCXR("ROOT FILE")
+14 SET DIKCFDA(.11,"+1,",1.1)=$SELECT($GET(DIKCXR("SET"))]"":DIKCXR("SET"),1:"Q")
+15 SET DIKCFDA(.11,"+1,",2.1)=$SELECT($GET(DIKCXR("KILL"))]"":DIKCXR("KILL"),1:"Q")
+16 IF $GET(DIKCXR("SET CONDITION"))]""
SET DIKCFDA(.11,"+1,",1.4)=DIKCXR("SET CONDITION")
+17 IF $GET(DIKCXR("KILL CONDITION"))]""
SET DIKCFDA(.11,"+1,",2.4)=DIKCXR("KILL CONDITION")
+18 IF $GET(DIKCXR("WHOLE KILL"))]""
SET DIKCFDA(.11,"+1,",2.5)=DIKCXR("WHOLE KILL")
+19 ;
+20 ;Set FDA for Values multiple
+21 SET ORD=0
FOR SEQ=2:1
SET ORD=$ORDER(DIKCXR("VAL",ORD))
IF 'ORD
QUIT
Begin DoDot:1
+22 SET IENS="+"_SEQ_",+1,"
+23 SET R=$NAME(DIKCXR("VAL",ORD))
+24 SET DIKCFDA(.114,IENS,.01)=ORD
+25 SET DIKCFDA(.114,IENS,1)=@R@("TYPE")
+26 ;
+27 IF @R@("TYPE")="C"
SET DIKCFDA(.114,IENS,4.5)=@R
+28 IF '$TEST
Begin DoDot:2
+29 SET DIKCFDA(.114,IENS,2)=DIKCXR("ROOT FILE")
+30 SET DIKCFDA(.114,IENS,3)=@R
+31 SET X=$GET(@R@("XFORM FOR STORAGE"))
IF X]""
SET DIKCFDA(.114,IENS,5)=X
+32 SET X=$GET(@R@("XFORM FOR LOOKUP"))
IF X]""
SET DIKCFDA(.114,IENS,5.3)=X
+33 SET X=$GET(@R@("XFORM FOR DISPLAY"))
IF X]""
SET DIKCFDA(.114,IENS,5.5)=X
End DoDot:2
+34 ;
+35 SET X=$GET(@R@("SUBSCRIPT"))
IF X]""
SET DIKCFDA(.114,IENS,.5)=X
+36 SET X=$GET(@R@("LENGTH"))
IF X]""
SET DIKCFDA(.114,IENS,6)=X
+37 SET X=$GET(@R@("COLLATION"))
IF X]""
SET DIKCFDA(.114,IENS,7)=X
+38 SET X=$GET(@R@("LOOKUP PROMPT"))
IF X]""
SET DIKCFDA(.114,IENS,8)=X
End DoDot:1
+39 ;
+40 ;Call Updater
+41 DO UPDATE^DIE("E","DIKCFDA","DIKCIEN")
+42 KILL DIXR
IF $GET(DIERR)
SET DIXR=""
QUIT
+43 SET DIXR=DIKCIEN(1)
+44 ;
+45 ;Add Description
+46 IF $ORDER(DIKCXR("DESCR",0))
DO WP^DIE(.11,DIXR_",",.1,"",$NAME(DIKCXR("DESCR")))
+47 QUIT
+48 ;
RECOMP(DIXR,DIFLG) ;Recompile templates and xrefs, update triggering fields
+1 NEW DIKCFLIS,DIKCI,DIKCTLIS,DIKCTOP,DIKTEML
+2 ;
+3 ;Get top level file number
+4 SET DIKCTOP=$$FNO^DILIBF($PIECE($GET(^DD("IX",DIXR,0)),U))
IF 'DIKCTOP
QUIT
+5 ;
+6 ;Get list of fields in xref
+7 DO GETFLIST^DIKCUTL(DIXR,.DIKCFLIS)
IF '$DATA(DIKCFLIS)
QUIT
+8 ;
+9 ;Recompile input templates and xrefs
+10 DO DIEZ^DIKD2(.DIKCFLIS,DIFLG,$GET(DIKCOUT))
+11 DO DIKZ^DIKD(DIKCTOP,DIFLG,$GET(DIKCOUT))
SET DIKCTOP(DIKCTOP)=""
+12 ;
+13 ;Also update triggering fields, and their compiled templates and xrefs
+14 DO TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
+15 IF $DATA(DIKCTLIS)
Begin DoDot:1
+16 DO DIEZ^DIKD2(.DIKCTLIS,DIFLG,$GET(DIKCOUT))
+17 SET DIKCI=0
FOR
SET DIKCI=$ORDER(DIKCTLIS(DIKCI))
IF 'DIKCI
QUIT
Begin DoDot:2
+18 SET DIKCTOP=+$$FNO^DILIBF(DIKCI)
IF $DATA(DIKCTOP(DIKCTOP))#2!'DIKCTOP
QUIT
+19 SET DIKCTOP(DIKCTOP)=""
+20 DO DIKZ^DIKD(DIKCTOP,DIFLG,$GET(DIKCOUT))
End DoDot:2
End DoDot:1
+21 QUIT
+22 ;
CHK(DIKCXR,DIKCERR) ;Check/default input array
+1 NEW FIL,NAM,RFIL,TYP,USE
+2 SET DIKCERR=0
+3 ;
+4 ;Check FILE
+5 SET FIL=$GET(DIKCXR("FILE"))
IF 'FIL
DO ER202("FILE")
QUIT
+6 IF '$$VFNUM^DIKCU1(FIL,"D")
SET DIKCERR=1
QUIT
+7 ;
+8 ;Check Type, get internal form
+9 SET TYP=$GET(DIKCXR("TYPE"))
IF TYP=""
DO ER202("TYPE")
QUIT
+10 DO CHK^DIE(.11,.2,"",TYP,.TYP)
IF TYP=U
SET DIKCERR=1
QUIT
+11 SET DIKCXR("TYPE")=TYP
+12 ;
+13 ;Check USE, get internal form.
+14 SET USE=$GET(DIKCXR("USE"))
+15 IF USE]""
DO CHK^DIE(.11,.42,"",USE,.USE)
IF USE=U
SET DIKCERR=1
QUIT
+16 SET DIKCXR("USE")=USE
+17 ;
+18 SET NAM=$GET(DIKCXR("NAME"))
+19 SET RFIL=$GET(DIKCXR("ROOT FILE"))
+20 ;
+21 ;Check Root File, set Root Type
+22 IF 'RFIL
SET (RFIL,DIKCXR("ROOT FILE"))=FIL
+23 IF FIL=RFIL
SET DIKCXR("ROOT TYPE")="I"
+24 IF '$TEST
Begin DoDot:1
+25 IF $$FLEVDIFF^DIKCU(FIL,RFIL)=""
DO ER202("ROOT FILE")
QUIT
+26 IF '$$VFNUM^DIKCU1(RFIL,"D")
SET DIKCERR=1
QUIT
+27 SET DIKCXR("ROOT TYPE")="W"
End DoDot:1
IF DIKCERR
QUIT
+28 ;
+29 ;Check USE, NAME, TYPE
+30 IF NAM=""
IF USE=""
DO ER202("NAME/USE")
QUIT
+31 IF $EXTRACT(NAM)="A"
IF USE="LS"
DO ER202("NAME/USE")
QUIT
+32 IF USE="A"
IF TYP'="MU"
DO ER202("TYPE/USE")
QUIT
+33 ;
+34 ;Default NAM based on USE and FILE
+35 ; or USE based on NAME and TYPE
+36 IF NAM=""
SET DIKCXR("NAME")=$$GETNAM(FIL,USE)
+37 IF '$TEST
IF USE=""
SET DIKCXR("USE")=$SELECT($EXTRACT(NAM)="A":$SELECT(TYP="MU":"A",1:"S"),1:"LS")
+38 ;
+39 ;Check SHORT DESCRIPTION'=null', if null set default Activity
+40 IF $GET(DIKCXR("SHORT DESCR"))=""
DO ER202("SHORT DESCR")
QUIT
+41 IF $DATA(DIKCXR("ACTIVITY"))[0
SET DIKCXR("ACTIVITY")="IR"
+42 QUIT
+43 ;
CHKVAL(DIKCXR,DIKCERR) ;Check values, build logic for regular indexes
+1 NEW CNT,FCNT,FIL,KILL,L,LEV,LDIF,MAXL,NAM,ORD,RFIL,ROOT,SBSC,SEQ,SET,TYP,VAL,WKIL
+2 ;
+3 SET FIL=DIKCXR("FILE")
+4 SET NAM=DIKCXR("NAME")
+5 SET RFIL=DIKCXR("ROOT FILE")
+6 SET TYP=DIKCXR("TYPE")
+7 SET DIKCERR=0
+8 ;
+9 ;Begin building logic for regular indexes
+10 IF TYP="R"
Begin DoDot:1
+11 IF FIL'=RFIL
SET LDIF=$$FLEVDIFF^DIKCU(FIL,RFIL)
+12 IF '$TEST
SET LDIF=0
+13 SET ROOT=$$FROOTDA^DIKCU(FIL,LDIF_"O",.LEV)_""""_NAM_""""
+14 IF $DATA(DIERR)
SET DIKCERR=1
QUIT
+15 SET WKIL="K "_ROOT_")"
End DoDot:1
IF DIKCERR
QUIT
+16 ;
+17 ;Build list of subscripts, count #values and #fields
+18 SET ORD=0
FOR
SET ORD=$ORDER(DIKCXR("VAL",ORD))
IF 'ORD
QUIT
Begin DoDot:1
+19 IF $GET(DIKCXR("VAL",ORD))=""
KILL DIKCXR("VAL",ORD)
QUIT
+20 SET CNT=$GET(CNT)+1
+21 ;
+22 ;Get type of value; if field, increment field count
+23 IF DIKCXR("VAL",ORD)
SET DIKCXR("VAL",ORD,"TYPE")="F"
SET FCNT=$GET(FCNT)+1
+24 IF '$TEST
SET DIKCXR("VAL",ORD,"TYPE")="C"
+25 ;
+26 ;Set subscript array; error if duplicate subscript #
+27 SET SBSC=$GET(DIKCXR("VAL",ORD,"SUBSCRIPT"))
IF 'SBSC
QUIT
+28 IF $DATA(SBSC(SBSC))#2
DO ER202("SUBSCRIPT")
QUIT
+29 SET SBSC(SBSC)=ORD_U_$GET(DIKCXR("VAL",ORD,"LENGTH"))
+30 ;
+31 ;Set default collation
+32 IF $GET(DIKCXR("VAL",ORD,"COLLATION"))=""
SET DIKCXR("VAL",ORD,"COLLATION")="F"
End DoDot:1
IF DIKCERR
QUIT
+33 IF DIKCERR
QUIT
+34 ;
+35 SET SBSC=0
FOR SEQ=1:1
SET SBSC=$ORDER(SBSC(SBSC))
IF 'SBSC
QUIT
Begin DoDot:1
+36 ;Check that subscripts are consecutive from 1
+37 IF SEQ'=SBSC
DO ER202("SUBSCRIPTS")
QUIT
+38 IF TYP="MU"
QUIT
+39 ;
+40 ;Continue building logic for regular indexes
+41 SET ORD=$PIECE(SBSC(SBSC),U)
SET MAXL=$PIECE(SBSC(SBSC),U,2)
+42 IF $GET(CNT)=1
SET VAL=$SELECT(MAXL:"$E(X,1,"_MAXL_")",1:"X")
+43 IF '$TEST
SET VAL=$SELECT(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
+44 SET ROOT=ROOT_","_VAL
End DoDot:1
IF DIKCERR
QUIT
+45 ;
+46 ;If null, default Execution based on #fields
+47 IF $GET(DIKCXR("EXECUTION"))=""
SET DIKCXR("EXECUTION")=$SELECT($GET(FCNT)>1:"R",1:"F")
+48 ;
+49 ;We're done for MUMPS xrefs
+50 IF TYP="MU"
QUIT
+51 ;
+52 ;Continue building logic for regular indexes
+53 FOR L=LDIF:-1:1
SET ROOT=ROOT_",DA("_L_")"
+54 SET ROOT=ROOT_",DA)"
+55 ;
+56 IF '$ORDER(SBSC(0))
SET (SET,KILL)="Q"
SET WKIL=""
+57 IF '$TEST
SET SET="S "_ROOT_"="""""
SET KILL="K "_ROOT
+58 SET DIKCXR("SET")=SET
+59 SET DIKCXR("KILL")=KILL
+60 SET DIKCXR("WHOLE KILL")=WKIL
+61 QUIT
+62 ;
GETNAM(F01,USE) ;Get next available index name
+1 NEW ASC,STRT,NAME,I
+2 SET STRT=$SELECT(USE="LS":"",1:"A")
+3 FOR ASC=67:1:89
Begin DoDot:1
+4 SET NAME=STRT_$CHAR(ASC)
+5 IF $DATA(^DD("IX","BB",F01,NAME))
SET NAME=""
QUIT
+6 IF $DATA(^DD(F01,0,"IX",NAME))
SET NAME=""
QUIT
End DoDot:1
IF NAME]""
QUIT
+7 IF NAME]""
QUIT NAME
+8 ;
+9 FOR I=1:1
Begin DoDot:1
+10 SET NAME=STRT_"C"_I
+11 IF $DATA(^DD("IX","BB",F01,NAME))
SET NAME=""
QUIT
+12 IF $DATA(^DD(F01,0,"IX",NAME))
SET NAME=""
QUIT
End DoDot:1
IF NAME]""
QUIT
+13 QUIT NAME
+14 ;
SET(DIXR,DIFLG) ;Execute set logic
+1 NEW DIKCRFIL,DIKCTOP,DIKCTRL,DIKCTYP
+2 ;
+3 SET DIKCTOP=$$FNO^DILIBF($PIECE($GET(^DD("IX",DIXR,0)),U))
IF 'DIKCTOP
QUIT
+4 SET DIKCRFIL=$PIECE($GET(^DD("IX",DIXR,0)),U,9)
IF 'DIKCRFIL
QUIT
+5 SET DIKCTYP=$PIECE($GET(^DD("IX",DIXR,0)),U,4)
+6 ;
+7 IF $GET(DIFLG)["W"
Begin DoDot:1
+8 IF DIKCTYP="R"
WRITE !,"Building index ..."
+9 IF '$TEST
WRITE !,"Executing set logic ..."
End DoDot:1
+10 ;
+11 ;Call INDEX^DIKC to execute the set logic
+12 SET DIKCTRL="S"_$SELECT(DIKCTOP'=DIKCRFIL:"W"_DIKCRFIL,1:"")
+13 DO INDEX^DIKC(DIKCTOP,"","",DIXR,.DIKCTRL)
+14 QUIT
+15 ;
ER202(DIKCP1) ;;The input variable or parameter that identifies the |1| is missing or invalid.
+1 DO ERR^DIKCU2(202,"","","",DIKCP1)
+2 SET DIKCERR=1
+3 QUIT