[613] | 1 | DICA ;SEA/TOAD-VA FileMan, Updater, Engine ;1:33 PM 18 Nov 1999
|
---|
| 2 | ;;22.0;VA FileMan;**1,4,17**;Mar 30, 1999
|
---|
| 3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ADD(DIFLAGS,DIFDA,DIEN,DIMSGA) ;
|
---|
| 6 | ;
|
---|
| 7 | ADDX ; Branch in from UPDATE^DIE
|
---|
| 8 | ; ENTRY POINT--add a new entry to a file
|
---|
| 9 | ; subroutine, DIEN passed by reference
|
---|
| 10 | I '$D(DIQUIET) N DIQUIET S DIQUIET=1
|
---|
| 11 | I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
|
---|
| 12 | N DICLERR S DICLERR=$G(DIERR) K DIERR
|
---|
| 13 | INPUT ;
|
---|
| 14 | ; initialize input parameters & check
|
---|
| 15 | N DIRULE S DIRULE=$$GETTMP^DIKC1("DICA")
|
---|
| 16 | N DIFDAO
|
---|
| 17 | S DIFLAGS=$G(DIFLAGS)
|
---|
| 18 | I $TR(DIFLAGS,"EKSUY")'="" D Q
|
---|
| 19 | . D ERR^DICA3(301,"","","",DIFLAGS),CLOSE
|
---|
| 20 | S DIFDA=$G(DIFDA) I $D(@DIFDA)<10 D Q
|
---|
| 21 | . D ERR^DICA3(202,"","","","FDA"),CLOSE
|
---|
| 22 | S DIFDAO=DIFDA
|
---|
| 23 | S DIEN=$G(DIEN) I DIEN="" S DIEN="DIDUMMY" N DIDUMMY
|
---|
| 24 | PRE ;
|
---|
| 25 | N DIOK S DIOK=1 D CHECK^DICA1(DIFLAGS,.DIFDA,DIEN,DIRULE,.DIOK)
|
---|
| 26 | I $G(DIERR) D CLOSE Q
|
---|
| 27 | I 'DIOK D ERR^DICA3(202,"","","","FDA"),CLOSE Q
|
---|
| 28 | SEQ ;
|
---|
| 29 | N DICHECK,DIENTRY,DIFILE,DIOUT1,DINEXT
|
---|
| 30 | S (DIOUT1,DINEXT)="" F D Q:DIOUT1
|
---|
| 31 | . S DINEXT=$O(@DIRULE@("NEXT",DINEXT)) I DINEXT="" S DIOUT1=1 Q
|
---|
| 32 | . X @DIRULE@("NEXT",DINEXT)
|
---|
| 33 | FILES . ;
|
---|
| 34 | . I $P($G(^DD($$FNO^DILIBF(DIFILE),0,"DI")),U,2)["Y" D Q:DIOUT1
|
---|
| 35 | . . S DIOUT1=DIFLAGS'["Y"&'$D(DIOVRD)
|
---|
| 36 | . . I DIOUT1 D ERR^DICA3(405,DIFILE,"","",DIFILE)
|
---|
| 37 | ENTRIES . ;
|
---|
| 38 | . N DIDA,DIENP,DIOP,DIROOT,DISEQ
|
---|
| 39 | . S DIDA=$P(DIENTRY,",") I +DIDA=DIDA Q
|
---|
| 40 | . S DIENP=$$IEN(DIENTRY,"",DIRULE)
|
---|
| 41 | . S DIOP=$E(DIDA,1,2) I DIOP'="?+" S DIOP=$E(DIOP)
|
---|
| 42 | . S DISEQ=$P(DIDA,DIOP,2)
|
---|
| 43 | FINDING . ;
|
---|
| 44 | . ; Finding (?) or LAYGO/FInding (?+) nodes
|
---|
| 45 | . I DIOP["?" D Q
|
---|
| 46 | . . I DIOP="?+",DIENP[",," S @DIRULE@("NEXTADD",DINEXT)=@DIRULE@("NEXT",DINEXT) Q
|
---|
| 47 | . . N DIFIND,DIFORMAT,DIGET,DIINDEX,DIVALUE
|
---|
| 48 | . . S DIFORMAT="B"_$S(DIFLAGS["E":"",1:"Q")_$S(DIOP="?+":"X",1:"")
|
---|
| 49 | . . S DIGET=DIFDA
|
---|
| 50 | . . I DIFLAGS["E",DIOP["?" S DIGET=DIFDAO
|
---|
| 51 | . . I DIFLAGS["K",$D(^TMP("DIKK",$J,"P",DIFILE))#2 D
|
---|
| 52 | . . . D GETKVALS(.DIVALUE,.DIINDEX)
|
---|
| 53 | . . E S DIVALUE=$G(@DIGET@(DIFILE,DIENTRY,.01))
|
---|
| 54 | . . S DIFIND=$$FIND1^DIC(DIFILE,DIENP,DIFORMAT,.DIVALUE,$G(DIINDEX))
|
---|
| 55 | . . I $G(DIERR) S DIOUT1=1 Q
|
---|
| 56 | . . I DIOP="?+",'DIFIND S @DIRULE@("NEXTADD",DINEXT)=@DIRULE@("NEXT",DINEXT) Q
|
---|
| 57 | . . I 'DIFIND S DIOUT1=1 D Q
|
---|
| 58 | . . . I $D(DIVALUE)=10 N I,Q S DIVALUE="",(I,Q)=0 F S I=$O(DIVALUE(I)) Q:'I D Q:Q
|
---|
| 59 | . . . . Q:DIVALUE(I)=""
|
---|
| 60 | . . . . S:DIVALUE]"" DIVALUE=DIVALUE_";"
|
---|
| 61 | . . . . I $L(DIVALUE)+$L(DIVALUE(I))>252 D
|
---|
| 62 | . . . . . S DIVALUE=$E(DIVALUE,1,252)_$E(DIVALUE(I),1,252-$L(DIVALUE))_"..."
|
---|
| 63 | . . . . . S Q=1
|
---|
| 64 | . . . . E S DIVALUE=$G(DIVALUE)_$E(DIVALUE(I),1,251)
|
---|
| 65 | . . . D ERR^DICA3(703,DIFILE,DIENTRY,"",DIVALUE)
|
---|
| 66 | . . S @DIEN@(DISEQ)=DIFIND
|
---|
| 67 | . . I DIOP="?+" S @DIEN@(DISEQ,0)="?"
|
---|
| 68 | . . S @DIRULE@("IEN",DISEQ)=DIFIND
|
---|
| 69 | . . I DIFLAGS["K",$D(^TMP("DIKK",$J,"P",DIFILE)) D SAVEK Q
|
---|
| 70 | . . D SAVE
|
---|
| 71 | . ; Adding (+) nodes
|
---|
| 72 | . I '$G(DICHECK) S DICHECK=1 D ADDLF S:DIENP[",," DIENP=$$IEN(DIENTRY,"",DIRULE) I $G(DIERR) S DIOUT1=1 Q
|
---|
| 73 | . D ADDING
|
---|
| 74 | ;
|
---|
| 75 | FILER ; file the data for the new records
|
---|
| 76 | I '$G(DIERR),$D(@DIFDA) D
|
---|
| 77 | . I '$G(DICHECK) D ADDLF Q:$G(DIERR)!'$D(@DIFDA)
|
---|
| 78 | . D FILE^DIEF($E("S",DIFLAGS["S")_"U",DIFDA,"",DIEN)
|
---|
| 79 | I '$G(DIERR),DIFLAGS'["S" K @DIFDAO
|
---|
| 80 | I $G(DIERR)!(DIFLAGS["S"),DIFLAGS'["E" D
|
---|
| 81 | . M @DIFDA=@DIRULE@("SAVE")
|
---|
| 82 | D CLOSE
|
---|
| 83 | Q
|
---|
| 84 | ;
|
---|
| 85 | ADDING ;
|
---|
| 86 | N DIENEW,DIKEY
|
---|
| 87 | I $L(DIENP,",")>2 S DIOK=$$VMINUS9^DIEFU(DIFILE,DIENP) I 'DIOK D Q
|
---|
| 88 | . S DIOUT1=1
|
---|
| 89 | . D ERR^DICA3(602,DIFILE,$P(DIENP,",",$L(DIENP,",")-1))
|
---|
| 90 | S DIROOT=$$ROOT^DIQGU(DIFILE,DIENP)
|
---|
| 91 | D DA^DILF(DIENTRY,.DIENEW)
|
---|
| 92 | A1 S DIENEW=$$IEN(DIENTRY,$G(@DIEN@(DISEQ)),DIRULE)
|
---|
| 93 | S DIKEY=$G(@DIFDA@(DIFILE,DIENTRY,.01)) I DIKEY="" D Q
|
---|
| 94 | . S DIOUT1=1 D ERR^DICA3(202,"","","","FDA")
|
---|
| 95 | S DIOK=$$LAYGO(DIFILE,.DIENEW,DIKEY)
|
---|
| 96 | I 'DIOK S DIOUT1=1 D Q
|
---|
| 97 | . I '$G(DIERR) D ERR^DICA3(405,DIFILE,"","",DIFILE) Q
|
---|
| 98 | . N DIENS S DIENS="New entry"
|
---|
| 99 | . I $L(DIENEW,",")>2 S DIENS=DIENS_" under record: "_DIENEW
|
---|
| 100 | . N DI1 S DI1="LAYGO Node on the new value '"_DIKEY_"'"
|
---|
| 101 | . D ERR^DICA3(120,DIFILE,DIENS,.01,DI1)
|
---|
| 102 | D CREATE^DICA3(DIFILE,.DIENEW,DIROOT,DIKEY)
|
---|
| 103 | S DIENEW=+DIENEW
|
---|
| 104 | I 'DIENEW S DIOUT1=1 Q
|
---|
| 105 | L -@(DIROOT_"DIENEW)")
|
---|
| 106 | S @DIEN@(DISEQ)=DIENEW
|
---|
| 107 | I DIOP="?+" S @DIEN@(DISEQ,0)="+"
|
---|
| 108 | S @DIRULE@("IEN",DISEQ)=DIENEW
|
---|
| 109 | D SAVE
|
---|
| 110 | Q
|
---|
| 111 | ;
|
---|
| 112 | LAYGO(DIFILE,DIEN,DIKEY) ;
|
---|
| 113 | ; ADDING--return if LAYGO permitted
|
---|
| 114 | ; function, all by value
|
---|
| 115 | N DA,DIOK,DINODE,DIOUTS,X,Y,Y1
|
---|
| 116 | S DIOK=1,DINODE="",DIOUTS=0 F D I DIOUTS!'DIOK Q
|
---|
| 117 | . S DINODE=$O(^DD(DIFILE,.01,"LAYGO",DINODE))
|
---|
| 118 | . I DINODE'>0 S DIOUTS=1 Q
|
---|
| 119 | . I $D(^DD(DIFILE,.01,"LAYGO",DINODE,0))[0 Q
|
---|
| 120 | . S X=DIKEY M DA=DIEN S Y=$P(DA,","),Y1=DA,DA=$P(DA,",")
|
---|
| 121 | . I 1 X ^DD(DIFILE,.01,"LAYGO",DINODE,0) S DIOK=$T&'$G(DIERR)
|
---|
| 122 | Q DIOK
|
---|
| 123 | ;
|
---|
| 124 | SAVE I DIFLAGS'["E" D
|
---|
| 125 | . S @DIRULE@("SAVE",DIFILE,DIENTRY,.01)=@DIFDA@(DIFILE,DIENTRY,.01)
|
---|
| 126 | K @DIFDA@(DIFILE,DIENTRY,.01)
|
---|
| 127 | Q
|
---|
| 128 | ;
|
---|
| 129 | SAVEK ; Remove primary key field from FDA; save in ^TMP first if necessary
|
---|
| 130 | N DIFLD
|
---|
| 131 | S DIFLD=0
|
---|
| 132 | F S DIFLD=$O(^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD)) Q:'DIFLD D
|
---|
| 133 | . Q:'^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD)
|
---|
| 134 | . Q:$D(@DIGET@(DIFILE,DIENTRY,DIFLD))[0
|
---|
| 135 | . S:DIFLAGS'["E" @DIRULE@("SAVE",DIFILE,DIENTRY,DIFLD)=@DIFDA@(DIFILE,DIENTRY,DIFLD)
|
---|
| 136 | . K @DIFDA@(DIFILE,DIENTRY,DIFLD)
|
---|
| 137 | Q
|
---|
| 138 | ;
|
---|
| 139 | IEN(DIENTRY,DIENF,DIRULE) ;
|
---|
| 140 | ; ADDING/FINDING--return translated IEN String
|
---|
| 141 | ; function, DIENTRY passed by value
|
---|
| 142 | N DIC,DIENEW,DIOP,DIP,DIPNEW,DISEQ
|
---|
| 143 | S DIENEW=""
|
---|
| 144 | S DIENF=$G(DIENF)
|
---|
| 145 | S DIP="" F DIC=1:1 D I DIP="" Q
|
---|
| 146 | . S DIP=$P(DIENTRY,",",DIC) I DIP="" Q
|
---|
| 147 | . D
|
---|
| 148 | . . I +DIP=DIP S DIPNEW=DIP Q
|
---|
| 149 | IEN1 . . I DIC=1 S DIPNEW=DIENF Q
|
---|
| 150 | . . S DIOP=$E(DIP,1,2) I DIOP'="?+" S DIOP=$E(DIOP)
|
---|
| 151 | . . S DISEQ=$P(DIP,DIOP,2,9999)
|
---|
| 152 | . . S DIPNEW=$G(@DIRULE@("IEN",DISEQ))
|
---|
| 153 | . S $P(DIENEW,",",DIC)=DIPNEW
|
---|
| 154 | I DIENEW'="" S DIENEW=DIENEW_","
|
---|
| 155 | Q DIENEW
|
---|
| 156 | ;
|
---|
| 157 | CLOSE I DICLERR'=""!$G(DIERR) D
|
---|
| 158 | . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
|
---|
| 159 | I $G(DIMSGA)'="" D CALLOUT^DIEFU(DIMSGA)
|
---|
| 160 | K @DIRULE,^TMP("DIKK",$J)
|
---|
| 161 | Q
|
---|
| 162 | ;
|
---|
| 163 | GETKVALS(DIVALUE,DIINDEX) ; Get primary key values and uniq index
|
---|
| 164 | N DIFLD,DIKEY,DISQ
|
---|
| 165 | K DIVALUE
|
---|
| 166 | S DIKEY=$P(^TMP("DIKK",$J,"P",DIFILE),U),DIINDEX=$P(^(DIFILE),U,4)
|
---|
| 167 | Q:DIINDEX=""!'DIKEY
|
---|
| 168 | ;
|
---|
| 169 | S DIFLD=0
|
---|
| 170 | F S DIFLD=$O(^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD)) Q:'DIFLD D
|
---|
| 171 | . S DISQ=^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD) Q:'DISQ
|
---|
| 172 | . Q:$D(@DIGET@(DIFILE,DIENTRY,DIFLD))[0
|
---|
| 173 | . S DIVALUE(DISQ)=@DIGET@(DIFILE,DIENTRY,DIFLD)
|
---|
| 174 | Q
|
---|
| 175 | ;
|
---|
| 176 | ADDLF ; Check key integrity
|
---|
| 177 | I $D(^TMP("DIKK",$J,"L")),'$$CHECK^DIEVK(DIFDA,DIFLAGS,DIEN) Q
|
---|
| 178 | ;
|
---|
| 179 | ; Add records for LAYGO/Finding nodes which were not found
|
---|
| 180 | N DINEXT
|
---|
| 181 | S (DINEXT,DIOUT1)=""
|
---|
| 182 | F S DINEXT=$O(@DIRULE@("NEXTADD",DINEXT)) Q:DINEXT="" D Q:DIOUT1
|
---|
| 183 | . N DIENP,DIFILE,DIENTRY,DIOP,DIROOT,DISEQ
|
---|
| 184 | . X @DIRULE@("NEXTADD",DINEXT)
|
---|
| 185 | . S DIENP=$$IEN(DIENTRY,"",DIRULE)
|
---|
| 186 | . S DIOP="?+"
|
---|
| 187 | . S DISEQ=$P($P(DIENTRY,","),DIOP,2)
|
---|
| 188 | . D ADDING
|
---|
| 189 | Q
|
---|