| 1 | DIEVK ;SFISC/DPC-KEY VALIDATION ;11:50 AM  5 May 1998
 | 
|---|
| 2 |  ;;22.0;VA FileMan;;Mar 30, 1999
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 | KEYVAL(DIVKFLAG,DIVKFDA,DIVKOUT,DIVKFIEN) ;
 | 
|---|
| 5 | KEYVALX ;
 | 
|---|
| 6 |  ;Init
 | 
|---|
| 7 |  N DIVKEYOK
 | 
|---|
| 8 |  I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 | 
|---|
| 9 |  I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 | 
|---|
| 10 |  S DIVKEYOK=1
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ;Check input variables
 | 
|---|
| 13 |  S DIVKFLAG=$G(DIVKFLAG) I '$$VERFLG^DIEFU(DIVKFLAG,"KQ") S DIVKEYOK=0 G OUT
 | 
|---|
| 14 |  S DIVKFDA=$G(DIVKFDA) I '$$VROOT^DIEFU(DIVKFDA) S DIVKEYOK=0 G OUT
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;Load key info, and list of records to check
 | 
|---|
| 17 |  K ^TMP("DIKK",$J)
 | 
|---|
| 18 |  I '$$BUILD^DIEVK1(DIVKFDA,DIVKFLAG) S DIVKEYOK=0 G:DIVKFLAG["Q" OUT
 | 
|---|
| 19 |  I $D(^TMP("DIKK",$J,"L")),'$$CHECK(DIVKFDA,DIVKFLAG,$G(DIVKFIEN)) D
 | 
|---|
| 20 |  . S DIVKEYOK=0
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 | OUT ;Move error messages if necessary and quit
 | 
|---|
| 23 |  I $G(DIERR),$G(DIVKOUT)]"" D CALLOUT^DIEFU(DIVKOUT)
 | 
|---|
| 24 |  K ^TMP("DIKK",$J)
 | 
|---|
| 25 |  Q DIVKEYOK
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 | CHECK(DIVKFDA,DIVKFLAG,DIVKFIEN) ;Loop thru ^TMP and check key integrity
 | 
|---|
| 28 |  N DIVKCIEN,DIVKFIL,DIVKIENS,DIVKEY,DIVKEYOK,DIVKQUIT
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ;If DIVKFIEN passed in, build list of resolved ?n ien's
 | 
|---|
| 31 |  I $G(DIVKFIEN)]"",$D(@DIVKFIEN) D
 | 
|---|
| 32 |  . S DIVKEY=0
 | 
|---|
| 33 |  . F  S DIVKEY=$O(^TMP("DIKK",$J,"L",DIVKEY)) Q:'DIVKEY  D
 | 
|---|
| 34 |  .. S DIVKFIL=$P(^TMP("DIKK",$J,"L",DIVKEY),U)
 | 
|---|
| 35 |  .. S DIVKIENS=""
 | 
|---|
| 36 |  .. F  S DIVKIENS=$O(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,DIVKIENS)) Q:DIVKIENS=""  D
 | 
|---|
| 37 |  ... Q:DIVKIENS'["?"
 | 
|---|
| 38 |  ... I $E(DIVKIENS)="?",$G(DIVKFLAG)["K",$P($G(^TMP("DIKK",$J,"L",DIVKEY)),U,3)="P" Q
 | 
|---|
| 39 |  ... S DIVKCIEN=$$FINDCONV^DIEVK1(DIVKIENS,DIVKFIEN)
 | 
|---|
| 40 |  ... Q:DIVKCIEN?.E1(1"+",1"?").E
 | 
|---|
| 41 |  ... S ^TMP("DIKK",$J,"F",DIVKEY,DIVKFIL,DIVKCIEN)=""
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  ;Check integrity
 | 
|---|
| 44 |  S DIVKEYOK=1,DIVKEY=0
 | 
|---|
| 45 |  F  S DIVKEY=$O(^TMP("DIKK",$J,"L",DIVKEY)) Q:'DIVKEY  D  Q:$G(DIVKQUIT)
 | 
|---|
| 46 |  . S DIVKFIL=$P(^TMP("DIKK",$J,"L",DIVKEY),U)
 | 
|---|
| 47 |  . S DIVKIENS=""
 | 
|---|
| 48 |  . F  S DIVKIENS=$O(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,DIVKIENS)) Q:DIVKIENS=""  D  Q:$G(DIVKQUIT)
 | 
|---|
| 49 |  .. I '$$CHKREC(DIVKEY,DIVKFIL,DIVKIENS,DIVKFDA,DIVKFLAG,$G(DIVKFIEN)) D
 | 
|---|
| 50 |  ... S DIVKEYOK=0 S:DIVKFLAG["Q" DIVKQUIT=1
 | 
|---|
| 51 |  Q DIVKEYOK
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 | CHKREC(DIVKEY,DIVKFIL,DIVKIENS,DIVKFDA,DIVKFLAG,DIVKFIEN) ;
 | 
|---|
| 54 |  ;Check integrity of 1 record
 | 
|---|
| 55 |  N ACTIENS,CONV,DA,DEC,DEL,FIL,FLD,ML,NULL,OIENS,S,SS,UIR,VAL,X
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  ;Don't need to check primary key for Finding and LAYGO/Finding nodes
 | 
|---|
| 58 |  ;used for lookup
 | 
|---|
| 59 |  I $E(DIVKIENS)="?",$G(DIVKFLAG)["K",$P($G(^TMP("DIKK",$J,"L",DIVKEY)),U,3)="P" Q 1
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 |  S UIR=$G(^TMP("DIKK",$J,"L",DIVKEY,"UIR")) M SS=^("SS") Q:UIR="" 1
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ;Set DA array
 | 
|---|
| 64 |  D ACTDA(DIVKIENS,$G(DIVKFIEN),.DA,.CONV)
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  ;Set X array and check for nulls
 | 
|---|
| 67 |  ;Set VAL array for values exceeding max length
 | 
|---|
| 68 |  ;Set DEC array to data extraction code
 | 
|---|
| 69 |  K NULL,VAL,X
 | 
|---|
| 70 |  S S=0 F  S S=$O(SS(S)) Q:'S  D  Q:$G(DIVKFLAG)["Q"&$G(NULL)!$G(DEL)
 | 
|---|
| 71 |  . S FIL=$P(SS(S),U),FLD=$P(SS(S),U,2),ML=$P(SS(S),U,3)
 | 
|---|
| 72 |  . S DEC(S)=^TMP("DIKK",$J,DIVKFIL,FIL,FLD)
 | 
|---|
| 73 |  . S X=$$VALUE(FIL,DIVKIENS,.DA,FLD,$G(DIVKFDA),DEC(S),$G(CONV))
 | 
|---|
| 74 |  . I X="@",FLD=.01 S DEL=1 Q
 | 
|---|
| 75 |  . S X(S)=X
 | 
|---|
| 76 |  . I ML,$L(X)'<ML S VAL(S)=X
 | 
|---|
| 77 |  . ;
 | 
|---|
| 78 |  . I X="@" D ERR742^DIEVK1(FIL,FLD,DIVKEY,DIVKIENS) S NULL=1 Q
 | 
|---|
| 79 |  . I X="" D ERR744^DIEVK1(FIL,FLD,DIVKEY,DIVKIENS) S NULL=1 Q
 | 
|---|
| 80 |  Q:$G(DEL) 1
 | 
|---|
| 81 |  Q:$G(NULL) 0
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  S ACTIENS=$S($G(CONV):$$IENS(.DA),1:DIVKIENS)
 | 
|---|
| 84 |  S UIR=$NA(@UIR)
 | 
|---|
| 85 |  I $D(@UIR),'$$UNIQIX^DIKK2(UIR,ACTIENS,.DA,.VAL,.DEC,DIVKEY_U_DIVKFIL) D ERR740^DIEVK1(DIVKFIL,DIVKEY,DIVKIENS) Q 0
 | 
|---|
| 86 |  I '$$COMP(DIVKEY,DIVKFIL,DIVKIENS,$G(DIVKFDA),.X,.SS,.DEC,$G(DIVKFLAG),$G(DIVKFIEN)) Q 0
 | 
|---|
| 87 |  Q 1
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 | COMP(DIVKEY,DIVKFIL,DIVKIENS,DIVKFDA,DIVKX,SS,DEC,DIVKFLAG,DIVKFIEN) ;
 | 
|---|
| 90 |  ;Check uniqueness with subsequent records
 | 
|---|
| 91 |  ;in ^TMP("DIKK",$J,"L",key,file)
 | 
|---|
| 92 |  N CONV,DA,DIVKQUIT,FIL,FLD,IENS,OK,S,UNIQ,X
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  S OK=1,IENS=DIVKIENS
 | 
|---|
| 95 |  F  S IENS=$O(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,IENS)) Q:IENS=""  D  Q:$G(DIVKQUIT)
 | 
|---|
| 96 |  . ;
 | 
|---|
| 97 |  . ;Set DA array
 | 
|---|
| 98 |  . D ACTDA(IENS,$G(DIVKFIEN),.DA,.CONV)
 | 
|---|
| 99 |  . ;
 | 
|---|
| 100 |  . S (UNIQ,S)=0 F  S S=$O(SS(S)) Q:'S  D  Q:UNIQ
 | 
|---|
| 101 |  .. S FIL=$P(SS(S),U),FLD=$P(SS(S),U,2)
 | 
|---|
| 102 |  .. S X=$$VALUE(FIL,IENS,.DA,FLD,$G(DIVKFDA),DEC(S),$G(CONV))
 | 
|---|
| 103 |  .. I "@"[X!(X'=DIVKX(S)) S UNIQ=1
 | 
|---|
| 104 |  . ;
 | 
|---|
| 105 |  . I 'UNIQ D
 | 
|---|
| 106 |  .. D:OK ERR740^DIEVK1(DIVKFIL,DIVKEY,DIVKIENS)
 | 
|---|
| 107 |  .. D ERR740^DIEVK1(DIVKFIL,DIVKEY,IENS)
 | 
|---|
| 108 |  .. S OK=0 S:$G(DIVKFLAG)["Q" DIVKQUIT=1
 | 
|---|
| 109 |  Q OK
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 | VALUE(DIVKEYFL,DIVKIENS,DA,DIVKEYFD,DIVKFDA,DIVKDEC,DIVKCONV) ;
 | 
|---|
| 112 |  N DIVKVALU,X
 | 
|---|
| 113 |  I $G(DIVKFDA)="" X DIVKDEC Q X
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  ;Get value from FDA
 | 
|---|
| 116 |  S DIVKVALU=$G(@DIVKFDA@(DIVKEYFL,DIVKIENS,DIVKEYFD),U)
 | 
|---|
| 117 |  Q:"@"[DIVKVALU "@"
 | 
|---|
| 118 |  Q:DIVKVALU'=U DIVKVALU
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ;Get value from file
 | 
|---|
| 121 |  I DIVKIENS?.E1(1"+",1"?").E,'$G(DIVKCONV) Q ""
 | 
|---|
| 122 |  X DIVKDEC
 | 
|---|
| 123 |  Q X
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 | IENS(DA) ;Return IENS from DA array
 | 
|---|
| 126 |  N I,IENS
 | 
|---|
| 127 |  S IENS=$G(DA)_"," F I=1:1:$O(DA(" "),-1) S IENS=IENS_DA(I)_","
 | 
|---|
| 128 |  Q IENS
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 | DA(IENS,DA) ;
 | 
|---|
| 131 |  N I
 | 
|---|
| 132 |  K DA S DA=$P(IENS,",") F I=2:1:$L(IENS,",")-1 S DA(I-1)=$P(IENS,",",I)
 | 
|---|
| 133 |  Q
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 | ACTDA(IENS,DIVKFIEN,DA,CONV) ;Set the DA array from the IENS
 | 
|---|
| 136 |  ;If ?'s replaced with actual IENs, return CONV=1
 | 
|---|
| 137 |  K CONV
 | 
|---|
| 138 |  I IENS["?",$G(DIVKFIEN)]"",$D(@DIVKFIEN) D
 | 
|---|
| 139 |  . N RIENS
 | 
|---|
| 140 |  . S RIENS=$$FINDCONV^DIEVK1(IENS,DIVKFIEN)
 | 
|---|
| 141 |  . D DA(RIENS,.DA)
 | 
|---|
| 142 |  . I RIENS'["?",RIENS'["+" S CONV=1
 | 
|---|
| 143 |  E  D DA(IENS,.DA)
 | 
|---|
| 144 |  Q
 | 
|---|