- DIKCUTL1 ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;9:10 AM 7 Aug 2001 [ 04/02/2003 8:25 AM ]
- ;;22.0;VA FileMan;**1001**;APR 1, 2003
- ;;22.0;VA FileMan;**11,68**;Mar 30, 1999
- ;Per VHA Directive 10-93-142, this routine should not be modified.
- ;
- CREATE(DIKCTOP,DIKCFILE) ;Create a new index
- N DIKCF01,DIKCFLIS,DIKCNAME,DIKCNEW,DIKCTLIS,DIKCTYPE,DIKCUSE,DIXR
- N DA,DDSFILE,DR
- ;
- ;Get Type, File, Use, and Name
- S DIKCTYPE=$$TYPE Q:DIKCTYPE=-1
- S DIKCF01=$$FILE01(DIKCTOP,DIKCFILE) Q:DIKCF01=-1
- S DIKCUSE=$$USE(DIKCTYPE) Q:DIKCUSE=-1
- S DIKCNAME=$$NAME(DIKCF01,DIKCUSE) Q:DIKCNAME=-1
- ;
- ;Create the new index in the Index file
- D ADD(DIKCF01,DIKCFILE,DIKCNAME,DIKCTYPE,DIKCUSE,.DIXR) Q:DIXR=-1
- ;
- ;Invoke form to edit index, quit if deleted,
- ;delete if no short description
- S DDSFILE=.11,DA=DIXR,DR="[DIKC EDIT]" D ^DDS K DDSFILE,DA,DR
- Q:$D(^DD("IX",DIXR,0))[0
- I $P($G(^DD("IX",DIXR,0)),U,3)="" D Q
- . N DIK,DA
- . S DIK="^DD(""IX"",",DA=DIXR D ^DIK
- . W !!," Index definition deleted."
- ;
- ;Get new fields list and set logic.
- ;Modify the trigger logic of fields that trigger fields in the index
- ;Set new index, recompile input templates and xrefs.
- D GETFLIST^DIKCUTL(DIXR,.DIKCFLIS)
- K DIKCTLIS D TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
- D:$D(DIKCTLIS) DIEZ^DIKCUTL3(" ",.DIKCTLIS)
- D LOADXREF^DIKC1(DIKCFILE,"","S",DIXR,"","DIKCNEW")
- D KSC^DIKCUTL3(DIKCTOP,"",.DIKCNEW,.DIKCFLIS)
- Q
- ;
- TYPE() ;Prompt for index type (regular or MUMPS)
- N DIKCTYPE,DIR,DIROUT,DIRUT,DTOUT,X,Y
- ;
- S DIR(0)=".11,.2",DIR("A")="Type of index",DIR("B")="REGULAR"
- F D Q:$D(DIRUT)!$D(DIKCTYPE)
- . W ! D ^DIR Q:$D(DIRUT)
- . I Y="MU",$G(DUZ(0))'="@" D
- .. W !,$C(7)_"Only programmers can create MUMPS cross references."
- . E I Y="MU",$P($G(^DD(DIKCTOP,0,"DI")),U)="Y" D
- .. W !,$C(7)_"Cannot create MUMPS cross references on archived files."
- . E S DIKCTYPE=Y
- ;
- Q $S($D(DIRUT):-1,1:DIKCTYPE)
- ;
- FILE01(DIKCTOP,DIKCFILE) ;Return file on which to store xref
- ;If DIKCFILE is not a subfile, return that file #
- I DIKCTOP=DIKCFILE Q DIKCFILE
- ;
- ;Otherwise, prompt for file on which to store xref
- N FILE01,FINFO,LEV
- N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- ;
- ;Get info on subfile DICKFILE
- D FINFO^DIKCU1(DIKCFILE,.FINFO)
- ;
- ;Prompt for whether whole file indexes should be created
- W !
- S DIR(0)="Y",DIR("B")="Yes"
- S DIR("?")=" Enter 'Yes' if you want the index to reside at this level."
- F LEV=0:1:$O(FINFO(""),-1)-1 D Q:$D(DIRUT)!$D(FILE01)
- . S DIR("A")="Want to index whole "_$S(LEV:"sub",1:"")_"file "_$P(FINFO(LEV),U,3)_" (#"_$P(FINFO(LEV),U)_")"
- . D ^DIR Q:$D(DIRUT)!'Y
- . S FILE01=$P(FINFO(LEV),U)
- ;
- Q $S($D(DIRUT):-1,'$D(FILE01):DIKCFILE,1:FILE01)
- ;
- USE(DIKCTYPE) ;Prompt for Use (Lookup or Lookup & Sorting)
- ;DIKCTYPE = type of index
- ;
- N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- S DIR(0)=".11,.42"
- I $G(DIKCTYPE)="MU" D
- . S DIR("A")="How is this MUMPS cross reference to be used"
- . S DIR("B")="ACTION"
- E D
- . S DIR("A",1)="Want index to be used for Lookup & Sorting"
- . S DIR("A")=" or Sorting Only"
- . S DIR("B")="LOOKUP & SORTING"
- . S DIR(0)=DIR(0)_"^^I X=""A"" W !!,$C(7)_""** Only MUMPS cross references can be ACTION-type cross references. **"" K X"
- W ! D ^DIR K DIR
- Q $S($D(DTOUT)!$D(DUOUT):-1,1:Y)
- ;
- NAME(DIKCF01,DIKCUSE) ;Get next available index name
- N DIKCASC,DIKCNAME,DIKCSTRT
- N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- ;
- ;Get next available index name
- S DIKCSTRT=$S(DIKCUSE="LS":"",1:"A")
- F DIKCASC=67:1 D Q:DIKCNAME]""
- . S DIKCNAME=DIKCSTRT_$C(DIKCASC)
- . I $D(^DD("IX","BB",DIKCF01,DIKCNAME)) S DIKCNAME="" Q
- . I $D(^DD(DIKCF01,0,"IX",DIKCNAME)) S DIKCNAME="" Q
- ;
- ;If not a programmer, return next available index name
- Q:DUZ(0)'="@" DIKCNAME
- ;
- ;Otherwise, prompt for index name
- W !
- S DIR(0)=".11,.02"
- S DIR("A")="Index Name",DIR("B")=DIKCNAME
- F D Q:$D(X)!$D(DIRUT)
- . D ^DIR Q:$D(DIRUT)
- . ;
- . ;Check response; print message and kill X if invalid
- . I DIKCUSE="LS",$E(X)="A" D Q
- .. D NAMERR("Indexes used for Lookup & Sorting cannot start with 'A'")
- . I DIKCUSE="S",$E(X)'="A" D Q
- .. D NAMERR("Indexes used for Sorting Only must start with 'A'")
- . I DIKCUSE="A",$E(X)'="A" D Q
- .. D NAMERR("Action-type indexes must start with 'A'")
- . I $D(^DD("IX","BB",DIKCF01,X)) D Q
- .. D NAMERR("There is already an index defined with this name.")
- . I $D(^DD(DIKCF01,0,"IX",X)) D Q
- .. D NAMERR("There is already a cross-reference defined with this name.") Q
- ;
- Q $S($D(DIRUT):-1,1:X)
- ;
- NAMERR(MSG) ;Invalid index name error
- W !!,$C(7)_$G(MSG),!
- K X
- Q
- ;
- ADD(DIKCF01,DIKCFILE,DIKCNAME,DIKCTYPE,DIKCUSE,DIXR) ;
- ;Add new entry to Index file
- ;Returns DIXR=-1 if error
- N DIKCFDA,DIKCIEN
- S DIKCFDA(.11,"+1,",.01)=DIKCF01
- S DIKCFDA(.11,"+1,",.02)=DIKCNAME
- S DIKCFDA(.11,"+1,",.2)=DIKCTYPE
- S DIKCFDA(.11,"+1,",.4)="F"
- S DIKCFDA(.11,"+1,",.41)="IR"
- S:$G(DIKCUSE)]"" DIKCFDA(.11,"+1,",.42)=DIKCUSE
- S DIKCFDA(.11,"+1,",.5)=$S(DIKCF01=DIKCFILE:"I",1:"W")
- S DIKCFDA(.11,"+1,",.51)=DIKCFILE
- S DIKCFDA(.11,"+1,",1.1)="Q"
- S DIKCFDA(.11,"+1,",2.1)="Q"
- D UPDATE^DIE("","DIKCFDA","DIKCIEN")
- I '$D(DIERR) S DIXR=DIKCIEN(1)
- E D MSG^DIALOG() S DIXR=-1
- Q
- DIKCUTL1 ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;9:10 AM 7 Aug 2001 [ 04/02/2003 8:25 AM ]
- +1 ;;22.0;VA FileMan;**1001**;APR 1, 2003
- +2 ;;22.0;VA FileMan;**11,68**;Mar 30, 1999
- +3 ;Per VHA Directive 10-93-142, this routine should not be modified.
- +4 ;
- CREATE(DIKCTOP,DIKCFILE) ;Create a new index
- +1 NEW DIKCF01,DIKCFLIS,DIKCNAME,DIKCNEW,DIKCTLIS,DIKCTYPE,DIKCUSE,DIXR
- +2 NEW DA,DDSFILE,DR
- +3 ;
- +4 ;Get Type, File, Use, and Name
- +5 SET DIKCTYPE=$$TYPE
- IF DIKCTYPE=-1
- QUIT
- +6 SET DIKCF01=$$FILE01(DIKCTOP,DIKCFILE)
- IF DIKCF01=-1
- QUIT
- +7 SET DIKCUSE=$$USE(DIKCTYPE)
- IF DIKCUSE=-1
- QUIT
- +8 SET DIKCNAME=$$NAME(DIKCF01,DIKCUSE)
- IF DIKCNAME=-1
- QUIT
- +9 ;
- +10 ;Create the new index in the Index file
- +11 DO ADD(DIKCF01,DIKCFILE,DIKCNAME,DIKCTYPE,DIKCUSE,.DIXR)
- IF DIXR=-1
- QUIT
- +12 ;
- +13 ;Invoke form to edit index, quit if deleted,
- +14 ;delete if no short description
- +15 SET DDSFILE=.11
- SET DA=DIXR
- SET DR="[DIKC EDIT]"
- DO ^DDS
- KILL DDSFILE,DA,DR
- +16 IF $DATA(^DD("IX",DIXR,0))[0
- QUIT
- +17 IF $PIECE($GET(^DD("IX",DIXR,0)),U,3)=""
- Begin DoDot:1
- +18 NEW DIK,DA
- +19 SET DIK="^DD(""IX"","
- SET DA=DIXR
- DO ^DIK
- +20 WRITE !!," Index definition deleted."
- End DoDot:1
- QUIT
- +21 ;
- +22 ;Get new fields list and set logic.
- +23 ;Modify the trigger logic of fields that trigger fields in the index
- +24 ;Set new index, recompile input templates and xrefs.
- +25 DO GETFLIST^DIKCUTL(DIXR,.DIKCFLIS)
- +26 KILL DIKCTLIS
- DO TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
- +27 IF $DATA(DIKCTLIS)
- DO DIEZ^DIKCUTL3(" ",.DIKCTLIS)
- +28 DO LOADXREF^DIKC1(DIKCFILE,"","S",DIXR,"","DIKCNEW")
- +29 DO KSC^DIKCUTL3(DIKCTOP,"",.DIKCNEW,.DIKCFLIS)
- +30 QUIT
- +31 ;
- TYPE() ;Prompt for index type (regular or MUMPS)
- +1 NEW DIKCTYPE,DIR,DIROUT,DIRUT,DTOUT,X,Y
- +2 ;
- +3 SET DIR(0)=".11,.2"
- SET DIR("A")="Type of index"
- SET DIR("B")="REGULAR"
- +4 FOR
- Begin DoDot:1
- +5 WRITE !
- DO ^DIR
- IF $DATA(DIRUT)
- QUIT
- +6 IF Y="MU"
- IF $GET(DUZ(0))'="@"
- Begin DoDot:2
- +7 WRITE !,$CHAR(7)_"Only programmers can create MUMPS cross references."
- End DoDot:2
- +8 IF '$TEST
- IF Y="MU"
- IF $PIECE($GET(^DD(DIKCTOP,0,"DI")),U)="Y"
- Begin DoDot:2
- +9 WRITE !,$CHAR(7)_"Cannot create MUMPS cross references on archived files."
- End DoDot:2
- +10 IF '$TEST
- SET DIKCTYPE=Y
- End DoDot:1
- IF $DATA(DIRUT)!$DATA(DIKCTYPE)
- QUIT
- +11 ;
- +12 QUIT $SELECT($DATA(DIRUT):-1,1:DIKCTYPE)
- +13 ;
- FILE01(DIKCTOP,DIKCFILE) ;Return file on which to store xref
- +1 ;If DIKCFILE is not a subfile, return that file #
- +2 IF DIKCTOP=DIKCFILE
- QUIT DIKCFILE
- +3 ;
- +4 ;Otherwise, prompt for file on which to store xref
- +5 NEW FILE01,FINFO,LEV
- +6 NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- +7 ;
- +8 ;Get info on subfile DICKFILE
- +9 DO FINFO^DIKCU1(DIKCFILE,.FINFO)
- +10 ;
- +11 ;Prompt for whether whole file indexes should be created
- +12 WRITE !
- +13 SET DIR(0)="Y"
- SET DIR("B")="Yes"
- +14 SET DIR("?")=" Enter 'Yes' if you want the index to reside at this level."
- +15 FOR LEV=0:1:$ORDER(FINFO(""),-1)-1
- Begin DoDot:1
- +16 SET DIR("A")="Want to index whole "_$SELECT(LEV:"sub",1:"")_"file "_$PIECE(FINFO(LEV),U,3)_" (#"_$PIECE(FINFO(LEV),U)_")"
- +17 DO ^DIR
- IF $DATA(DIRUT)!'Y
- QUIT
- +18 SET FILE01=$PIECE(FINFO(LEV),U)
- End DoDot:1
- IF $DATA(DIRUT)!$DATA(FILE01)
- QUIT
- +19 ;
- +20 QUIT $SELECT($DATA(DIRUT):-1,'$DATA(FILE01):DIKCFILE,1:FILE01)
- +21 ;
- USE(DIKCTYPE) ;Prompt for Use (Lookup or Lookup & Sorting)
- +1 ;DIKCTYPE = type of index
- +2 ;
- +3 NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- +4 SET DIR(0)=".11,.42"
- +5 IF $GET(DIKCTYPE)="MU"
- Begin DoDot:1
- +6 SET DIR("A")="How is this MUMPS cross reference to be used"
- +7 SET DIR("B")="ACTION"
- End DoDot:1
- +8 IF '$TEST
- Begin DoDot:1
- +9 SET DIR("A",1)="Want index to be used for Lookup & Sorting"
- +10 SET DIR("A")=" or Sorting Only"
- +11 SET DIR("B")="LOOKUP & SORTING"
- +12 SET DIR(0)=DIR(0)_"^^I X=""A"" W !!,$C(7)_""** Only MUMPS cross references can be ACTION-type cross references. **"" K X"
- End DoDot:1
- +13 WRITE !
- DO ^DIR
- KILL DIR
- +14 QUIT $SELECT($DATA(DTOUT)!$DATA(DUOUT):-1,1:Y)
- +15 ;
- NAME(DIKCF01,DIKCUSE) ;Get next available index name
- +1 NEW DIKCASC,DIKCNAME,DIKCSTRT
- +2 NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- +3 ;
- +4 ;Get next available index name
- +5 SET DIKCSTRT=$SELECT(DIKCUSE="LS":"",1:"A")
- +6 FOR DIKCASC=67:1
- Begin DoDot:1
- +7 SET DIKCNAME=DIKCSTRT_$CHAR(DIKCASC)
- +8 IF $DATA(^DD("IX","BB",DIKCF01,DIKCNAME))
- SET DIKCNAME=""
- QUIT
- +9 IF $DATA(^DD(DIKCF01,0,"IX",DIKCNAME))
- SET DIKCNAME=""
- QUIT
- End DoDot:1
- IF DIKCNAME]""
- QUIT
- +10 ;
- +11 ;If not a programmer, return next available index name
- +12 IF DUZ(0)'="@"
- QUIT DIKCNAME
- +13 ;
- +14 ;Otherwise, prompt for index name
- +15 WRITE !
- +16 SET DIR(0)=".11,.02"
- +17 SET DIR("A")="Index Name"
- SET DIR("B")=DIKCNAME
- +18 FOR
- Begin DoDot:1
- +19 DO ^DIR
- IF $DATA(DIRUT)
- QUIT
- +20 ;
- +21 ;Check response; print message and kill X if invalid
- +22 IF DIKCUSE="LS"
- IF $EXTRACT(X)="A"
- Begin DoDot:2
- +23 DO NAMERR("Indexes used for Lookup & Sorting cannot start with 'A'")
- End DoDot:2
- QUIT
- +24 IF DIKCUSE="S"
- IF $EXTRACT(X)'="A"
- Begin DoDot:2
- +25 DO NAMERR("Indexes used for Sorting Only must start with 'A'")
- End DoDot:2
- QUIT
- +26 IF DIKCUSE="A"
- IF $EXTRACT(X)'="A"
- Begin DoDot:2
- +27 DO NAMERR("Action-type indexes must start with 'A'")
- End DoDot:2
- QUIT
- +28 IF $DATA(^DD("IX","BB",DIKCF01,X))
- Begin DoDot:2
- +29 DO NAMERR("There is already an index defined with this name.")
- End DoDot:2
- QUIT
- +30 IF $DATA(^DD(DIKCF01,0,"IX",X))
- Begin DoDot:2
- +31 DO NAMERR("There is already a cross-reference defined with this name.")
- QUIT
- End DoDot:2
- QUIT
- End DoDot:1
- IF $DATA(X)!$DATA(DIRUT)
- QUIT
- +32 ;
- +33 QUIT $SELECT($DATA(DIRUT):-1,1:X)
- +34 ;
- NAMERR(MSG) ;Invalid index name error
- +1 WRITE !!,$CHAR(7)_$GET(MSG),!
- +2 KILL X
- +3 QUIT
- +4 ;
- ADD(DIKCF01,DIKCFILE,DIKCNAME,DIKCTYPE,DIKCUSE,DIXR) ;
- +1 ;Add new entry to Index file
- +2 ;Returns DIXR=-1 if error
- +3 NEW DIKCFDA,DIKCIEN
- +4 SET DIKCFDA(.11,"+1,",.01)=DIKCF01
- +5 SET DIKCFDA(.11,"+1,",.02)=DIKCNAME
- +6 SET DIKCFDA(.11,"+1,",.2)=DIKCTYPE
- +7 SET DIKCFDA(.11,"+1,",.4)="F"
- +8 SET DIKCFDA(.11,"+1,",.41)="IR"
- +9 IF $GET(DIKCUSE)]""
- SET DIKCFDA(.11,"+1,",.42)=DIKCUSE
- +10 SET DIKCFDA(.11,"+1,",.5)=$SELECT(DIKCF01=DIKCFILE:"I",1:"W")
- +11 SET DIKCFDA(.11,"+1,",.51)=DIKCFILE
- +12 SET DIKCFDA(.11,"+1,",1.1)="Q"
- +13 SET DIKCFDA(.11,"+1,",2.1)="Q"
- +14 DO UPDATE^DIE("","DIKCFDA","DIKCIEN")
- +15 IF '$DATA(DIERR)
- SET DIXR=DIKCIEN(1)
- +16 IF '$TEST
- DO MSG^DIALOG()
- SET DIXR=-1
- +17 QUIT