- DIEVK1 ;SFISC/MKO-KEY VALIDATION ;10:42 AM 30 Sep 1998
- ;;22.0;VA FileMan;;Mar 30, 1999
- ;Per VHA Directive 10-93-142, this routine should not be modified.
- ;
- BUILD(DIVKFDA,DIVKFLAG) ;Loop thru FDA and load key info
- N DIVKEYOK,DIVKFIL,DIVKFLD,DIVKIENS,DIVKQUIT
- ;
- S DIVKEYOK=1,DIVKFIL=0
- F S DIVKFIL=$O(@DIVKFDA@(DIVKFIL)) Q:'DIVKFIL D Q:$G(DIVKQUIT)
- . Q:'$D(^DD("KEY","F",DIVKFIL))
- . D:$G(DIVKFLAG)["K" GETPKEY(DIVKFIL)
- . S DIVKIENS=""
- . F S DIVKIENS=$O(@DIVKFDA@(DIVKFIL,DIVKIENS)) Q:DIVKIENS="" D Q:$G(DIVKQUIT)
- .. I $G(DIVKFLAG)["K",$E(DIVKIENS)="?",$E(DIVKIENS,2)'="+",'$$KFLD(DIVKFIL,DIVKIENS,DIVKFDA) S DIVKEYOK=0 I $G(DIVKFLAG)["Q" S DIVKQUIT=1 Q
- .. S DIVKFLD=0
- .. F S DIVKFLD=$O(@DIVKFDA@(DIVKFIL,DIVKIENS,DIVKFLD)) Q:'DIVKFLD D BLDFLD(DIVKFIL,DIVKIENS,DIVKFLD)
- Q DIVKEYOK
- ;
- BLDFLD(DIVKFIL,DIVKIENS,DIVKFLD) ;Build key/index info on a given field
- ; ^TMP("DIKK",$J,"L",key) = rfile^ui^priority
- ; ... ,file,iens) = ""
- ; ... ,"UIR") = uir
- ; ... ,"SS",n) = file^field^maxlen
- N DIVKEY,DIVKPRI,DIVKRFIL,DIVKSS,DIVKUI,DIVKUIR
- ;
- S DIVKEY=0
- F S DIVKEY=$O(^DD("KEY","F",DIVKFIL,DIVKFLD,DIVKEY)) Q:'DIVKEY D
- . Q:$D(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,DIVKIENS))#2 S ^(DIVKIENS)=""
- . Q:$D(^TMP("DIKK",$J,"L",DIVKEY))#2
- . ;
- . D LOADKEY^DIKK1(DIVKEY)
- . S DIVKRFIL=$P($G(^DD("KEY",DIVKEY,0)),U),DIVKUI=$P($G(^(0)),U,4),DIVKPRI=$P($G(^(0)),U,3)
- . S ^TMP("DIKK",$J,"L",DIVKEY)=DIVKRFIL_U_DIVKUI_U_DIVKPRI
- . Q:'DIVKRFIL!'DIVKUI
- . D XRINFO^DIKCU2(DIVKUI,.DIVKUIR,"","","","",.DIVKSS)
- . S ^TMP("DIKK",$J,"L",DIVKEY,"UIR")=DIVKUIR
- . M ^TMP("DIKK",$J,"L",DIVKEY,"SS")=DIVKSS
- Q
- ;
- GETPKEY(KFIL) ;Get fields in primary key for file KFIL
- ; ^TMP("DIKK",$J,"P",kfile) = key^ui#^uifile^uiname
- ; ... ,file,field) = seq#
- ;
- N FIL,FLD,I,KEY,SEQ,UI
- S KEY=$O(^DD("KEY","AP",KFIL,"P",0)) Q:'KEY
- S I=0 F S I=$O(^DD("KEY",KEY,2,I)) Q:'I D
- . Q:$D(^DD("KEY",KEY,2,I,0))[0 S FLD=$P(^(0),U),FIL=$P(^(0),U,2),SEQ=$P(^(0),U,3)
- . Q:'FLD!'FIL!'SEQ
- . S ^TMP("DIKK",$J,"P",KFIL,FIL,FLD)=SEQ
- I $D(^TMP("DIKK",$J,"P",KFIL)) D
- . S UI=$P(^DD("KEY",KEY,0),U,4)
- . S ^TMP("DIKK",$J,"P",KFIL)=KEY_U_UI_U_$P($G(^DD("IX",+UI,0)),U,1,2)
- Q
- ;
- KFLD(KFIL,IENS,FDA) ;Check that at least one primary key field is in FDA
- N FIL,FLD,KEY,OK,SEQ
- S KEY=+$G(^TMP("DIKK",$J,"P",KFIL)) Q:'KEY 1
- S OK=0
- S FIL=0 F S FIL=$O(^TMP("DIKK",$J,"P",KFIL,FIL)) Q:'FIL D Q:OK
- . S FLD=0 F S FLD=$O(^TMP("DIKK",$J,"P",KFIL,FIL,FLD)) Q:'FLD D Q:OK
- .. S:"@"'[$G(@FDA@(FIL,IENS,FLD)) OK=1
- D:'OK ERR746(KFIL,KEY,IENS)
- Q OK
- ;
- FINDCONV(DIVKIENS,DIVKFIEN) ;Replace ?n in DIVKIENS with actual ien's
- N I,N,P
- F I=1:1:$L(DIVKIENS,",")-1 D
- . S P=$P(DIVKIENS,",",I) Q:P'["?"
- . S N=$G(@DIVKFIEN@($TR(P,"?+"))) Q:'N
- . S $P(DIVKIENS,",",I)=+$G(@DIVKFIEN@($TR(P,"?+")))
- Q DIVKIENS
- ;
- ERR740(FILE,KEY,IENS) ;New values are invalid because they create a duplicate
- ;Key '|1|' for the |2| file.
- N P,PEXT
- S P(1)=$P(^DD("KEY",KEY,0),U,2)
- S P(2)=$O(^DD(FILE,0,"NM","")) S:P(2)?." " P(2)="#"_FILE
- S PEXT("FILE")=FILE,PEXT("KEY")=KEY,PEXT("IENS")=IENS
- D BLD^DIALOG(740,.P,.PEXT)
- Q
- ;
- ERR742(FILE,FIELD,KEY,IENS) ; The value of field |1| in the |2| file
- ;cannot be deleted because that field is part of the '|3|' key.
- N P,PEXT
- S P(1)=$$FLDNM^DIEFU(FILE,FIELD)
- S P(2)=$O(^DD(FILE,0,"NM","")) S:P(2)?." " P(2)="#"_FILE
- S P(3)=$P(^DD("KEY",KEY,0),U,2)
- S PEXT("FILE")=FILE,PEXT("FIELD")=FIELD,PEXT("IENS")=IENS
- D BLD^DIALOG(742,.P,.PEXT)
- Q
- ;
- ERR744(FILE,FIELD,KEY,IENS) ;Field |1| is part of Key '|2|', but the
- ;field has not been assigned a value.
- N P,PEXT
- S P(1)=$$FLDNM^DIEFU(FILE,FIELD)
- S P(2)=$P(^DD("KEY",KEY,0),U,2)
- S PEXT("FILE")=FILE,PEXT("FIELD")=FIELD,PEXT("IENS")=IENS
- D BLD^DIALOG(744,.P,.PEXT)
- Q
- ;
- ERR746(FILE,KEY,IENS) ;At least one field in Primary Key '|1|' must be
- ;provided in the FDA to look up '|IENS|' in the |2| file.
- N P,PEXT
- S P(1)=$P(^DD("KEY",KEY,0),U,2)
- S P(2)=$O(^DD(FILE,0,"NM","")) S:P(2)?." " P(2)="#"_FILE
- S P("IENS")=IENS
- S PEXT("FILE")=FILE,PEXT("KEY")=KEY,PEXT("IENS")=IENS
- D BLD^DIALOG(746,.P,.PEXT)
- Q
- DIEVK1 ;SFISC/MKO-KEY VALIDATION ;10:42 AM 30 Sep 1998
- +1 ;;22.0;VA FileMan;;Mar 30, 1999
- +2 ;Per VHA Directive 10-93-142, this routine should not be modified.
- +3 ;
- BUILD(DIVKFDA,DIVKFLAG) ;Loop thru FDA and load key info
- +1 NEW DIVKEYOK,DIVKFIL,DIVKFLD,DIVKIENS,DIVKQUIT
- +2 ;
- +3 SET DIVKEYOK=1
- SET DIVKFIL=0
- +4 FOR
- SET DIVKFIL=$ORDER(@DIVKFDA@(DIVKFIL))
- IF 'DIVKFIL
- QUIT
- Begin DoDot:1
- +5 IF '$DATA(^DD("KEY","F",DIVKFIL))
- QUIT
- +6 IF $GET(DIVKFLAG)["K"
- DO GETPKEY(DIVKFIL)
- +7 SET DIVKIENS=""
- +8 FOR
- SET DIVKIENS=$ORDER(@DIVKFDA@(DIVKFIL,DIVKIENS))
- IF DIVKIENS=""
- QUIT
- Begin DoDot:2
- +9 IF $GET(DIVKFLAG)["K"
- IF $EXTRACT(DIVKIENS)="?"
- IF $EXTRACT(DIVKIENS,2)'="+"
- IF '$$KFLD(DIVKFIL,DIVKIENS,DIVKFDA)
- SET DIVKEYOK=0
- IF $GET(DIVKFLAG)["Q"
- SET DIVKQUIT=1
- QUIT
- +10 SET DIVKFLD=0
- +11 FOR
- SET DIVKFLD=$ORDER(@DIVKFDA@(DIVKFIL,DIVKIENS,DIVKFLD))
- IF 'DIVKFLD
- QUIT
- DO BLDFLD(DIVKFIL,DIVKIENS,DIVKFLD)
- End DoDot:2
- IF $GET(DIVKQUIT)
- QUIT
- End DoDot:1
- IF $GET(DIVKQUIT)
- QUIT
- +12 QUIT DIVKEYOK
- +13 ;
- BLDFLD(DIVKFIL,DIVKIENS,DIVKFLD) ;Build key/index info on a given field
- +1 ; ^TMP("DIKK",$J,"L",key) = rfile^ui^priority
- +2 ; ... ,file,iens) = ""
- +3 ; ... ,"UIR") = uir
- +4 ; ... ,"SS",n) = file^field^maxlen
- +5 NEW DIVKEY,DIVKPRI,DIVKRFIL,DIVKSS,DIVKUI,DIVKUIR
- +6 ;
- +7 SET DIVKEY=0
- +8 FOR
- SET DIVKEY=$ORDER(^DD("KEY","F",DIVKFIL,DIVKFLD,DIVKEY))
- IF 'DIVKEY
- QUIT
- Begin DoDot:1
- +9 IF $DATA(^TMP("DIKK",$JOB,"L",DIVKEY,DIVKFIL,DIVKIENS))#2
- QUIT
- SET ^(DIVKIENS)=""
- +10 IF $DATA(^TMP("DIKK",$JOB,"L",DIVKEY))#2
- QUIT
- +11 ;
- +12 DO LOADKEY^DIKK1(DIVKEY)
- +13 SET DIVKRFIL=$PIECE($GET(^DD("KEY",DIVKEY,0)),U)
- SET DIVKUI=$PIECE($GET(^(0)),U,4)
- SET DIVKPRI=$PIECE($GET(^(0)),U,3)
- +14 SET ^TMP("DIKK",$JOB,"L",DIVKEY)=DIVKRFIL_U_DIVKUI_U_DIVKPRI
- +15 IF 'DIVKRFIL!'DIVKUI
- QUIT
- +16 DO XRINFO^DIKCU2(DIVKUI,.DIVKUIR,"","","","",.DIVKSS)
- +17 SET ^TMP("DIKK",$JOB,"L",DIVKEY,"UIR")=DIVKUIR
- +18 MERGE ^TMP("DIKK",$JOB,"L",DIVKEY,"SS")=DIVKSS
- End DoDot:1
- +19 QUIT
- +20 ;
- GETPKEY(KFIL) ;Get fields in primary key for file KFIL
- +1 ; ^TMP("DIKK",$J,"P",kfile) = key^ui#^uifile^uiname
- +2 ; ... ,file,field) = seq#
- +3 ;
- +4 NEW FIL,FLD,I,KEY,SEQ,UI
- +5 SET KEY=$ORDER(^DD("KEY","AP",KFIL,"P",0))
- IF 'KEY
- QUIT
- +6 SET I=0
- FOR
- SET I=$ORDER(^DD("KEY",KEY,2,I))
- IF 'I
- QUIT
- Begin DoDot:1
- +7 IF $DATA(^DD("KEY",KEY,2,I,0))[0
- QUIT
- SET FLD=$PIECE(^(0),U)
- SET FIL=$PIECE(^(0),U,2)
- SET SEQ=$PIECE(^(0),U,3)
- +8 IF 'FLD!'FIL!'SEQ
- QUIT
- +9 SET ^TMP("DIKK",$JOB,"P",KFIL,FIL,FLD)=SEQ
- End DoDot:1
- +10 IF $DATA(^TMP("DIKK",$JOB,"P",KFIL))
- Begin DoDot:1
- +11 SET UI=$PIECE(^DD("KEY",KEY,0),U,4)
- +12 SET ^TMP("DIKK",$JOB,"P",KFIL)=KEY_U_UI_U_$PIECE($GET(^DD("IX",+UI,0)),U,1,2)
- End DoDot:1
- +13 QUIT
- +14 ;
- KFLD(KFIL,IENS,FDA) ;Check that at least one primary key field is in FDA
- +1 NEW FIL,FLD,KEY,OK,SEQ
- +2 SET KEY=+$GET(^TMP("DIKK",$JOB,"P",KFIL))
- IF 'KEY
- QUIT 1
- +3 SET OK=0
- +4 SET FIL=0
- FOR
- SET FIL=$ORDER(^TMP("DIKK",$JOB,"P",KFIL,FIL))
- IF 'FIL
- QUIT
- Begin DoDot:1
- +5 SET FLD=0
- FOR
- SET FLD=$ORDER(^TMP("DIKK",$JOB,"P",KFIL,FIL,FLD))
- IF 'FLD
- QUIT
- Begin DoDot:2
- +6 IF "@"'[$GET(@FDA@(FIL,IENS,FLD))
- SET OK=1
- End DoDot:2
- IF OK
- QUIT
- End DoDot:1
- IF OK
- QUIT
- +7 IF 'OK
- DO ERR746(KFIL,KEY,IENS)
- +8 QUIT OK
- +9 ;
- FINDCONV(DIVKIENS,DIVKFIEN) ;Replace ?n in DIVKIENS with actual ien's
- +1 NEW I,N,P
- +2 FOR I=1:1:$LENGTH(DIVKIENS,",")-1
- Begin DoDot:1
- +3 SET P=$PIECE(DIVKIENS,",",I)
- IF P'["?"
- QUIT
- +4 SET N=$GET(@DIVKFIEN@($TRANSLATE(P,"?+")))
- IF 'N
- QUIT
- +5 SET $PIECE(DIVKIENS,",",I)=+$GET(@DIVKFIEN@($TRANSLATE(P,"?+")))
- End DoDot:1
- +6 QUIT DIVKIENS
- +7 ;
- ERR740(FILE,KEY,IENS) ;New values are invalid because they create a duplicate
- +1 ;Key '|1|' for the |2| file.
- +2 NEW P,PEXT
- +3 SET P(1)=$PIECE(^DD("KEY",KEY,0),U,2)
- +4 SET P(2)=$ORDER(^DD(FILE,0,"NM",""))
- IF P(2)?." "
- SET P(2)="#"_FILE
- +5 SET PEXT("FILE")=FILE
- SET PEXT("KEY")=KEY
- SET PEXT("IENS")=IENS
- +6 DO BLD^DIALOG(740,.P,.PEXT)
- +7 QUIT
- +8 ;
- ERR742(FILE,FIELD,KEY,IENS) ; The value of field |1| in the |2| file
- +1 ;cannot be deleted because that field is part of the '|3|' key.
- +2 NEW P,PEXT
- +3 SET P(1)=$$FLDNM^DIEFU(FILE,FIELD)
- +4 SET P(2)=$ORDER(^DD(FILE,0,"NM",""))
- IF P(2)?." "
- SET P(2)="#"_FILE
- +5 SET P(3)=$PIECE(^DD("KEY",KEY,0),U,2)
- +6 SET PEXT("FILE")=FILE
- SET PEXT("FIELD")=FIELD
- SET PEXT("IENS")=IENS
- +7 DO BLD^DIALOG(742,.P,.PEXT)
- +8 QUIT
- +9 ;
- ERR744(FILE,FIELD,KEY,IENS) ;Field |1| is part of Key '|2|', but the
- +1 ;field has not been assigned a value.
- +2 NEW P,PEXT
- +3 SET P(1)=$$FLDNM^DIEFU(FILE,FIELD)
- +4 SET P(2)=$PIECE(^DD("KEY",KEY,0),U,2)
- +5 SET PEXT("FILE")=FILE
- SET PEXT("FIELD")=FIELD
- SET PEXT("IENS")=IENS
- +6 DO BLD^DIALOG(744,.P,.PEXT)
- +7 QUIT
- +8 ;
- ERR746(FILE,KEY,IENS) ;At least one field in Primary Key '|1|' must be
- +1 ;provided in the FDA to look up '|IENS|' in the |2| file.
- +2 NEW P,PEXT
- +3 SET P(1)=$PIECE(^DD("KEY",KEY,0),U,2)
- +4 SET P(2)=$ORDER(^DD(FILE,0,"NM",""))
- IF P(2)?." "
- SET P(2)="#"_FILE
- +5 SET P("IENS")=IENS
- +6 SET PEXT("FILE")=FILE
- SET PEXT("KEY")=KEY
- SET PEXT("IENS")=IENS
- +7 DO BLD^DIALOG(746,.P,.PEXT)
- +8 QUIT