| 1 | DIKKUTL1 ;SFISC/MKO-KEY CREATION ;10:08 AM  12 Jan 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 | CREATE(DIKKTOP,DIKKFILE) ;Create a new key
 | 
|---|
| 6 |  N DIKKEY,DIKKFDA,DIKKNAME,DIKKIEN
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ;Prompt for name
 | 
|---|
| 9 |  S DIKKNAME=$$NAME(DIKKFILE) Q:DIKKNAME=-1
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ;Add new entry to Key file
 | 
|---|
| 12 |  W !,"  Creating new Key '"_DIKKNAME_"' ..."
 | 
|---|
| 13 |  S DIKKFDA(.31,"+1,",.01)=DIKKFILE
 | 
|---|
| 14 |  S DIKKFDA(.31,"+1,",.02)=DIKKNAME
 | 
|---|
| 15 |  S DIKKFDA(.31,"+1,",1)=$S($D(^DD("KEY","AP",DIKKFILE,"P")):"S",1:"P")
 | 
|---|
| 16 |  D UPDATE^DIE("","DIKKFDA","DIKKIEN") I $D(DIERR) D MSG^DIALOG() Q
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  S DIKKEY=DIKKIEN(1) K DIKKIEN
 | 
|---|
| 19 |  D EDIT^DIKKUTL(DIKKEY,DIKKTOP,DIKKFILE)
 | 
|---|
| 20 |  Q
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 | UIMOD(DIXR,DIKKEY,DIKKTOP,DIKKFILE) ;Modify the UI to match the Key
 | 
|---|
| 23 |  N DIKKERR,DIKKFLD,DIKKFLIS,DIKKID,DIKKMSG,DIKKNEW,DIKKOLD
 | 
|---|
| 24 |  S DIKKID=$$KEYID(DIKKEY,DIKKTOP,DIKKFILE)
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 |  ;Write message
 | 
|---|
| 27 |  W !!,"  Modifying Uniqueness Index ..."
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  ;Get list of fields and original kill logic
 | 
|---|
| 30 |  D GETFLIST^DIKCUTL(DIXR,.DIKKFLIS)
 | 
|---|
| 31 |  D LOADXREF^DIKC1(DIKKFILE,"","K",DIXR,"","DIKKOLD")
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ;Get list of fields in key
 | 
|---|
| 34 |  D GETFLD(DIKKEY,.DIKKFLD)
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  ;Stuff values into Uniqueness Index and fields into CRV multiple
 | 
|---|
| 37 |  D STUFF(DIXR,$P(^DD("IX",DIXR,0),U),DIKKFILE,$P(^(0),U,2),.DIKKFLD,DIKKID)
 | 
|---|
| 38 |  D DELCRV(DIXR)
 | 
|---|
| 39 |  D ADDCRV(DIXR,.DIKKFLD)
 | 
|---|
| 40 |  W "  DONE!"
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  ;Get list of fields and new set logic.
 | 
|---|
| 43 |  ;Kill old and set new index, and recompile input templates and xrefs.
 | 
|---|
| 44 |  D GETFLIST^DIKCUTL(DIXR,.DIKKFLIS)
 | 
|---|
| 45 |  D LOADXREF^DIKC1(DIKKFILE,"","S",DIXR,"","DIKKNEW")
 | 
|---|
| 46 |  D KSC^DIKCUTL3(DIKKTOP,.DIKKOLD,.DIKKNEW,.DIKKFLIS)
 | 
|---|
| 47 |  Q
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 | UICREATE(DIKKEY,DIKKTOP,DIKKFILE,DIKKNO) ;Create a new UI for key
 | 
|---|
| 50 |  ;Returns DIKKNO=1 if the Index could not be created.
 | 
|---|
| 51 |  N DIERR,DIKKERR,DIKKFDA,DIKKFLIS,DIKKID,DIKKMSG,DIKKNAM,DIKKNEW,DIXR,I
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  K DIKKNO
 | 
|---|
| 54 |  S DIKKID=$$KEYID(DIKKEY,DIKKTOP,DIKKFILE)
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  ;Write message
 | 
|---|
| 57 |  K DIKKMSG
 | 
|---|
| 58 |  S DIKKMSG(0)="I'm going to create a new Uniqueness Index to support "_DIKKID_"."
 | 
|---|
| 59 |  D WRAP^DIKCU2(.DIKKMSG)
 | 
|---|
| 60 |  W ! F I=0:1 Q:'$D(DIKKMSG(I))  W !,DIKKMSG(I)
 | 
|---|
| 61 |  K I,DIKKMSG
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ;Get Index Name and list of fields
 | 
|---|
| 64 |  S DIKKNAM=$$NAME^DIKCUTL1(DIKKFILE,"LS") I DIKKNAM=-1 S DIKKNO=1 Q
 | 
|---|
| 65 |  D GETFLD(DIKKEY,.DIKKFLD)
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ;Add uniqueness index to Index file, and fields into CRV multiple
 | 
|---|
| 68 |  D ADDUI(DIKKFILE,DIKKNAM,.DIXR) I DIXR=-1 S DIKKNO=1 Q
 | 
|---|
| 69 |  D STUFF(DIXR,DIKKFILE,DIKKFILE,DIKKNAM,.DIKKFLD,DIKKID)
 | 
|---|
| 70 |  D ADDCRV(DIXR,.DIKKFLD,.DIKKERR) I $G(DIKKERR) S DIKKNO=1 Q
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ;Set Uniqueness Index pointer in Key file
 | 
|---|
| 73 |  S DIKKFDA(.31,DIKKEY_",",3)=DIXR
 | 
|---|
| 74 |  D FILE^DIE("","DIKKFDA") I $D(DIERR) D MSG^DIALOG() S DIKKNO=1 Q
 | 
|---|
| 75 |  K DIKKFDA
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  ;Get new field list and set logic.
 | 
|---|
| 78 |  ;Set new index and recompile input templates and xrefs.
 | 
|---|
| 79 |  D GETFLIST^DIKCUTL(DIXR,.DIKKFLIS)
 | 
|---|
| 80 |  D LOADXREF^DIKC1(DIKKFILE,"","S",DIXR,"","DIKKNEW")
 | 
|---|
| 81 |  D KSC^DIKCUTL3(DIKKTOP,"",.DIKKNEW,.DIKKFLIS)
 | 
|---|
| 82 |  Q
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 | ADDUI(DIKKFILE,DIKKNAM,DIXR) ;Add new entry to Index file
 | 
|---|
| 85 |  N DIKKFDA,DIKKIEN
 | 
|---|
| 86 |  W !!,"  One moment please ..."
 | 
|---|
| 87 |  S DIKKFDA(.11,"+1,",.01)=DIKKFILE
 | 
|---|
| 88 |  S DIKKFDA(.11,"+1,",.02)=DIKKNAM
 | 
|---|
| 89 |  D UPDATE^DIE("","DIKKFDA","DIKKIEN") I $D(DIERR) D MSG^DIALOG() Q
 | 
|---|
| 90 |  S DIXR=DIKKIEN(1)
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 | STUFF(DIXR,DIKKF01,DIKKFILE,DIKKNAM,DIKKFLD,DIKKID) ;Stuff other values into
 | 
|---|
| 94 |  ;index
 | 
|---|
| 95 |  N DIERR,DIKKFDA,DIKKILL,DIKKSET,DIKKWKIL
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  ;Build logic
 | 
|---|
| 98 |  D BLDLOG(DIKKF01,DIKKFILE,DIKKNAM,.DIKKFLD,.DIKKSET,.DIKKILL,.DIKKWKIL)
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ;Stuff values into other fields in Index file entry
 | 
|---|
| 101 |  S DIKKFDA(.11,DIXR_",",.11)="Uniqueness Index for "_DIKKID
 | 
|---|
| 102 |  S DIKKFDA(.11,DIXR_",",.2)="R"
 | 
|---|
| 103 |  S DIKKFDA(.11,DIXR_",",.4)=$S(DIKKFLD>1:"R",1:"F")
 | 
|---|
| 104 |  S DIKKFDA(.11,DIXR_",",.41)="IR"
 | 
|---|
| 105 |  S DIKKFDA(.11,DIXR_",",.42)="LS"
 | 
|---|
| 106 |  S DIKKFDA(.11,DIXR_",",.5)=$S(DIKKF01=DIKKFILE:"I",1:"W")
 | 
|---|
| 107 |  S DIKKFDA(.11,DIXR_",",.51)=DIKKFILE
 | 
|---|
| 108 |  S DIKKFDA(.11,DIXR_",",1.1)=DIKKSET
 | 
|---|
| 109 |  S DIKKFDA(.11,DIXR_",",2.1)=DIKKILL
 | 
|---|
| 110 |  S DIKKFDA(.11,DIXR_",",2.5)=DIKKWKIL
 | 
|---|
| 111 |  D FILE^DIE("","DIKKFDA")
 | 
|---|
| 112 |  I $D(DIERR) D MSG^DIALOG()
 | 
|---|
| 113 |  Q
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 | ADDCRV(DIXR,DIKKFLD,DIKKERR) ;Add fields to Cross-Reference Values multiple
 | 
|---|
| 116 |  N DA,DD,DIC,DIERR,DIKKFDA,DIKKSS,DINUM,DO,X,Y
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  S DIC("P")=$P(^DD(.11,11.1,0),U,2)
 | 
|---|
| 119 |  F DIKKSS=1:1 Q:$D(DIKKFLD(DIKKSS))[0  D  Q:$G(DIKKERR)
 | 
|---|
| 120 |  . ;Add subentry
 | 
|---|
| 121 |  . S DIC="^DD(""IX"","_DIXR_",11.1,",DIC(0)="QL",DA(1)=DIXR
 | 
|---|
| 122 |  . S (X,DINUM)=DIKKSS
 | 
|---|
| 123 |  . K DD,DO D FILE^DICN K DA,DIC,DINUM
 | 
|---|
| 124 |  . I Y=-1 S DIKKERR=1 Q
 | 
|---|
| 125 |  . ;
 | 
|---|
| 126 |  . ;Stuff other values
 | 
|---|
| 127 |  . S DIKKFDA(.114,DIKKSS_","_DIXR_",",.5)=DIKKSS
 | 
|---|
| 128 |  . S DIKKFDA(.114,DIKKSS_","_DIXR_",",1)="F"
 | 
|---|
| 129 |  . S DIKKFDA(.114,DIKKSS_","_DIXR_",",2)=$P(DIKKFLD(DIKKSS),U,2)
 | 
|---|
| 130 |  . S DIKKFDA(.114,DIKKSS_","_DIXR_",",3)=$P(DIKKFLD(DIKKSS),U)
 | 
|---|
| 131 |  . D FILE^DIE("","DIKKFDA")
 | 
|---|
| 132 |  . I $D(DIERR) D MSG^DIALOG() S DIKKERR=1
 | 
|---|
| 133 |  Q
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 | DELCRV(DIXR) ;Delete all entries in CRV multiple
 | 
|---|
| 136 |  N DA,DIK
 | 
|---|
| 137 |  S DIK="^DD(""IX"","_DIXR_",11.1,",DA(1)=DIXR
 | 
|---|
| 138 |  S DA=0 F  S DA=$O(^DD("IX",DIXR,11.1,DA)) Q:'DA  D ^DIK
 | 
|---|
| 139 |  Q
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 | GETFLD(KEY,FLD) ;Get list fields in key
 | 
|---|
| 142 |  ;In:
 | 
|---|
| 143 |  ; KEY = key #
 | 
|---|
| 144 |  ;Out:
 | 
|---|
| 145 |  ; FLD = # subscripts
 | 
|---|
| 146 |  ; FLD(subscript#) = field^file
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  N DA,FD,FI,SQ
 | 
|---|
| 149 |  K FLD S (FLD,SQ)=0
 | 
|---|
| 150 |  F  S SQ=$O(^DD("KEY",KEY,2,"S",SQ)) Q:'SQ  D
 | 
|---|
| 151 |  . S FD=$O(^DD("KEY",KEY,2,"S",SQ,0)) Q:'FD
 | 
|---|
| 152 |  . S FI=$O(^DD("KEY",KEY,2,"S",SQ,FD,0)) Q:'FI
 | 
|---|
| 153 |  . S DA=$O(^DD("KEY",KEY,2,"S",SQ,FD,FI,0)) Q:'DA
 | 
|---|
| 154 |  . Q:$D(^DD("KEY",KEY,2,DA,0))[0
 | 
|---|
| 155 |  . S FLD=FLD+1,FLD(FLD)=FD_U_FI
 | 
|---|
| 156 |  Q
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 | BLDLOG(DIKKF01,DIKKFILE,DIKKNAM,DIKKFLD,DIKKSET,DIKKILL,DIKKWKIL) ;
 | 
|---|
| 159 |  ;Build the logic of the xref
 | 
|---|
| 160 |  N DIKKLDIF,DIKKROOT,DIKKSS,L
 | 
|---|
| 161 |  I 'DIKKFLD S (DIKKSET,DIKKILL)="Q",DIKKWKIL="" Q
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  ;Build index root and entire kill logic
 | 
|---|
| 164 |  I DIKKF01'=DIKKFILE S DIKKLDIF=$$FLEVDIFF^DIKCU(DIKKF01,DIKKFILE)
 | 
|---|
| 165 |  E  S DIKKLDIF=0
 | 
|---|
| 166 |  S DIKKROOT=$$FROOTDA^DIKCU(DIKKF01,DIKKLDIF_"O")_""""_DIKKNAM_""""
 | 
|---|
| 167 |  S DIKKWKIL="K "_DIKKROOT_")"
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 |  ;Build root for set/kill logic
 | 
|---|
| 170 |  F DIKKSS=1:1 Q:$D(DIKKFLD(DIKKSS))[0  D
 | 
|---|
| 171 |  . S DIKKROOT=DIKKROOT_","_$S($G(DIKKFLD)=1:"X",1:"X("_DIKKSS_")")
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  ;Append DA(n) to root
 | 
|---|
| 174 |  F L=DIKKLDIF:-1:1 S DIKKROOT=DIKKROOT_",DA("_L_")"
 | 
|---|
| 175 |  S DIKKROOT=DIKKROOT_",DA)"
 | 
|---|
| 176 |  ;
 | 
|---|
| 177 |  ;Build set/kill logic
 | 
|---|
| 178 |  S DIKKSET="S "_DIKKROOT_"=""""",DIKKILL="K "_DIKKROOT
 | 
|---|
| 179 |  Q
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 | NAME(DIKKFILE) ;Get next available Key name
 | 
|---|
| 182 |  N DIKKNAME
 | 
|---|
| 183 |  N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 | 
|---|
| 184 |  ;
 | 
|---|
| 185 |  S DIKKNAME=$O(^DD("KEY","BB",DIKKFILE,""),-1)
 | 
|---|
| 186 |  S DIKKNAME=$S(DIKKNAME="":"A",1:$C($A(DIKKNAME)+1))
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  S DIR(0)=".31,.02"
 | 
|---|
| 189 |  S DIR("A")="Enter a Name for the new Key"
 | 
|---|
| 190 |  S DIR("B")=DIKKNAME
 | 
|---|
| 191 |  W ! F  D  Q:$D(X)!$D(DIRUT)
 | 
|---|
| 192 |  . D ^DIR Q:$D(DIRUT)
 | 
|---|
| 193 |  . Q:'$D(^DD("KEY","BB",DIKKFILE,X))
 | 
|---|
| 194 |  . D NAMERR("A key already exists with this name.")
 | 
|---|
| 195 |  Q $S($D(DIRUT):-1,1:X)
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 | NAMERR(MSG) ;Invalid Index Name error
 | 
|---|
| 198 |  W !!,$C(7)_$G(MSG),!
 | 
|---|
| 199 |  K X
 | 
|---|
| 200 |  Q
 | 
|---|
| 201 |  ;
 | 
|---|
| 202 | KEYID(KEY,TOP,FILE) ;Return string of text that identifies the key
 | 
|---|
| 203 |  Q "Key '"_$P(^DD("KEY",KEY,0),U,2)_"' of "_$S(TOP'=FILE:"Subf",1:"F")_"ile #"_$P(^(0),U)
 | 
|---|
| 204 |  ;
 | 
|---|