- DICA1 ;SEA/TOAD-VA FileMan: Updater, Pre-Processor ;11:46 AM 11 May 1999 [ 04/02/2003 8:25 AM ]
- ;;22.0;VA FileMan;**1001**;APR 1, 2003
- ;;22.0;VA FileMan;**1**;Mar 30, 1999
- ;Per VHA Directive 10-93-142, this routine should not be modified.
- ;
- CHECK(DIFLAGS,DIFDA,DINUMS,DIRULE,DIOK) ;
- ; ENTRY POINT--check out the FDA
- ; subroutine, DIFLAGS passed by value
- N DIC,DIEN,DIFILE,DIFLD,DIN,DINODE,DINT,DINUM,DIOP
- N DIOUT1,DIOUT2,DIOUT3,DIRID,DIRIGHT,DISEQ,DITYPE,DIVAL
- N DIKEYEX
- FILES ;
- S DIFILE=0,DIOUT1=0 F D Q:DIOUT1!$G(DIERR)
- . S DIFILE=$O(@DIFDA@(DIFILE))
- . I 'DIFILE S DIOUT1=1 Q
- . S DINODE=$G(^DD(DIFILE,.01,0))
- . I DINODE="" D Q
- . . D ERR^DICA3($S('$D(^DD(DIFILE)):401,1:406),DIFILE)
- . I $P(DINODE,U,2)["W" D Q
- . . D ERR^DICA3(407,DIFILE)
- . S DIRID=$$RID^DICU(DIFILE)
- . ;
- . ;If we're using primary keys for lookup, get key info
- . S DIKEYEX=$D(^DD("KEY","F",DIFILE))
- . I $G(DIFLAGS)["K",DIKEYEX D GETPKEY^DIEVK1(DIFILE)
- . ;
- IENS . ;
- . S DIEN="",DIOUT2=0 F D Q:DIOUT2!$G(DIERR)
- . . S DIEN=$O(@DIFDA@(DIFILE,DIEN))
- . . I DIEN="" S DIOUT2=1 Q
- . . N DIDA D IEN^DICA2(.DIFILE,DIEN,.DIDA,DIRULE,.DIOK) Q:$G(DIERR)
- . . I 'DIOK S DIOUT1=1,DIOUT2=1 D Q
- . . . I $E(DIEN,$L(DIEN))'="," D ERR^DICA3(304,"",DIEN) Q
- . . . D ERR^DICA3(202,"","","","IENS")
- . . Q:'$$RID(DIFILE,DIEN,DIFDA,DIRID,DIFLAGS,DIKEYEX)
- . . I $D(@DIFDA@(DIFILE,DIEN,.001))#2 D
- . . . N DIENS S DIENS=@DIFDA@(DIFILE,DIEN,.001)
- . . . I $D(@DINUMS@(@DIRULE@("NUM")))[0 D
- . . . . S @DINUMS@(@DIRULE@("NUM"))=DIENS
- . . . S @DIRULE@("SAVE",$J,DIFILE,DIEN,.001)=DIENS
- . . . K @DIFDA@(DIFILE,DIEN,.001)
- VALUES . . ;
- . . I DIFLAGS'["E",$G(DIFLAGS)["U"!'DIKEYEX Q
- . . S DIFLD="",DIOUT3=0 F D Q:DIOUT3!$G(DIERR)
- . . . S DIFLD=$O(@DIFDA@(DIFILE,DIEN,DIFLD))
- . . . I DIFLD="" S DIOUT3=1 Q
- . . . I $G(DIFLAGS)'["U",DIKEYEX D BLDFLD^DIEVK1(DIFILE,DIEN,DIFLD) Q:DIFLAGS'["E"
- . . . I $E(DIEN)="?",$E(DIEN,2)'="+" Q:DIFLD=.01&(DIFLAGS'["K") I DIFLAGS["K",$D(^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD))#2 Q
- . . . S DIVAL=$G(@DIFDA@(DIFILE,DIEN,DIFLD))
- . . . D DTYP^DIOU(DIFILE,DIFLD,.DITYPE)
- . . . I DITYPE=5 S DINT=DIVAL
- CONVERT . . . ;
- . . . I DITYPE'=5 D Q:$G(DIERR)
- . . . . I DIEN["?"!(DIEN["+") D Q:$G(DIERR)
- . . . . . I "@"[DIVAL D Q
- . . . . . . I DIEN["?",$P($G(^DD(DIFILE,DIFLD,0)),U,2)["R" D Q
- . . . . . . . D ERR712(DIFILE,DIFLD)
- . . . . . . S DINT=DIVAL
- . . . . . I DIFLAGS["K",$E(DIEN)'="+",$P($G(^DD(DIFILE,DIFLD,0)),U,5,999)["DINUM",$D(^TMP("DIKK",$J,"P",DIFILE)),$D(^(DIFILE,DIFLD))[0 D Q
- . . . . . . D ERR^DICA3(520,DIFILE,"",DIFLD,"DINUMed")
- . . . . . N DA M DA=DIDA
- . . . . . N DIARG S DIARG="D0"
- . . . . . N DIMAX S DIMAX=$O(DA(""),-1)
- . . . . . N DIVAR F DIVAR=1:1:DIMAX S DIARG=DIARG_",D"_DIVAR
- . . . . . N @DIARG F DIVAR=0:1:DIMAX-1 S @("D"_DIVAR)=DA(DIMAX-DIVAR)
- . . . . . S:DIMAX @("D"_DIMAX)=DA
- . . . . . N DIDA D CHK^DIE(DIFILE,DIFLD,"N",DIVAL,.DINT)
- . . . . E D Q:$G(DIERR)
- . . . . . N DIVALFLG S DIVALFLG="RU"_$E("Y",DIFLAGS["Y")
- . . . . . D VAL^DIE(DIFILE,DIEN,DIFLD,DIVALFLG,DIVAL,.DINT)
- . . . . Q:$D(DINUM)[0
- . . . . S @DINUMS@(@DIRULE@("NUM"))=DINUM K DINUM
- . . . S @DIRULE@("FDA",DIFILE,DIEN,DIFLD)=DINT
- CLEANUP ;
- I $G(DIERR)!'DIOK K @DIRULE Q
- K @DIRULE@("L"),@DIRULE@("NUM"),@DIRULE@("OP"),@DIRULE@("ROOT")
- K @DIRULE@("SEQ"),@DIRULE@("TEMP"),@DIRULE@("UP")
- S DIN=$NA(@DIRULE@("ORDER")),DIC=0,@DIRULE@("THE END")=""
- F S DIN=$Q(@DIN) Q:DIN=""!($P(DIN,",",3)'="""ORDER""") D
- . S DIC=DIC+1,@DIRULE@("NEXT",DIC)=@DIN
- K @DIRULE@("ORDER"),@DIRULE@("THE END")
- I DIFLAGS["E" S DIFDA=$NA(@DIRULE@("FDA"))
- Q
- ;
- RID(DIFILE,DIEN,DIFDA,DIRID,DIFLAGS,DIKEYEX) ;
- N DIC,DIK,DIOK,DIP,DIR
- ;
- ;Check required ids
- S DIP=$P(DIEN,","),DIOK=1
- F DIC=1:1 S DIR=$P(DIRID,U,DIC) Q:DIR="" D
- . I DIR=.01 D
- . . I DIP'?1P.E
- . . E I DIP["+" D:"@"[$G(@DIFDA@(DIFILE,DIEN,.01))
- . . . S DIOK=0 D ERR^DICA3(352,DIFILE,DIEN)
- . . E I DIFLAGS'["K" D:"@"[$G(@DIFDA@(DIFILE,DIEN,.01))
- . . . S DIOK=0 D ERR^DICA3(351,DIFILE,DIEN)
- . E I DIP["+" D:"@"[$G(@DIFDA@(DIFILE,DIEN,DIR))
- . . S DIOK=0 D ERR^DICA3(311,DIFILE,DIEN,DIR)
- . E D:"@"[$G(@DIFDA@(DIFILE,DIEN,DIR),0)
- . . S DIOK=0 D ERR712(DIFILE,DIR)
- ;
- ;Check that the FDA contains the appropriate key fields
- Q:'$G(DIKEYEX,1) DIOK
- ;
- ;If appropriate, ensure all primary and secondary keys are provided
- I DIFLAGS'["U",DIP["+" D
- . S DIR=0 F S DIR=$O(^DD("KEY","F",DIFILE,DIR)) Q:'DIR D
- . . D:"@"[$G(@DIFDA@(DIFILE,DIEN,DIR))
- . . . S DIK=0 F S DIK=$O(^DD("KEY","F",DIFILE,DIR,DIK)) Q:'DIK D
- . . . . S DIOK=0 D ERR744^DIEVK1(DIFILE,DIR,DIK,DIEN)
- ;
- ;If appropriate, ensure at least one key field is provided
- E I $G(DIFLAGS)["K",$E(DIEN)="?",$E(DIEN,2)'="+"!($G(DIFLAGS)["U") D
- . S:'$$KFLD^DIEVK1(DIFILE,DIEN,DIFDA) DIOK=0
- Q DIOK
- ;
- ERR712(DIFILE,DIFIELD) ;
- N DIFILNAM S DIFILNAM=$O(^DD(DIFILE,0,"NM","")) S:DIFILNAM?." " DIFILNAM="#"_DIFILE
- N DIFLDNAM S DIFLDNAM=$$FLDNM^DIEFU(DIFILE,DIFIELD)
- D ERR^DICA3(712,DIFILE,"",DIFIELD,DIFLDNAM,DIFILNAM)
- Q
- DICA1 ;SEA/TOAD-VA FileMan: Updater, Pre-Processor ;11:46 AM 11 May 1999 [ 04/02/2003 8:25 AM ]
- +1 ;;22.0;VA FileMan;**1001**;APR 1, 2003
- +2 ;;22.0;VA FileMan;**1**;Mar 30, 1999
- +3 ;Per VHA Directive 10-93-142, this routine should not be modified.
- +4 ;
- CHECK(DIFLAGS,DIFDA,DINUMS,DIRULE,DIOK) ;
- +1 ; ENTRY POINT--check out the FDA
- +2 ; subroutine, DIFLAGS passed by value
- +3 NEW DIC,DIEN,DIFILE,DIFLD,DIN,DINODE,DINT,DINUM,DIOP
- +4 NEW DIOUT1,DIOUT2,DIOUT3,DIRID,DIRIGHT,DISEQ,DITYPE,DIVAL
- +5 NEW DIKEYEX
- FILES ;
- +1 SET DIFILE=0
- SET DIOUT1=0
- FOR
- Begin DoDot:1
- +2 SET DIFILE=$ORDER(@DIFDA@(DIFILE))
- +3 IF 'DIFILE
- SET DIOUT1=1
- QUIT
- +4 SET DINODE=$GET(^DD(DIFILE,.01,0))
- +5 IF DINODE=""
- Begin DoDot:2
- +6 DO ERR^DICA3($SELECT('$DATA(^DD(DIFILE)):401,1:406),DIFILE)
- End DoDot:2
- QUIT
- +7 IF $PIECE(DINODE,U,2)["W"
- Begin DoDot:2
- +8 DO ERR^DICA3(407,DIFILE)
- End DoDot:2
- QUIT
- +9 SET DIRID=$$RID^DICU(DIFILE)
- +10 ;
- +11 ;If we're using primary keys for lookup, get key info
- +12 SET DIKEYEX=$DATA(^DD("KEY","F",DIFILE))
- +13 IF $GET(DIFLAGS)["K"
- IF DIKEYEX
- DO GETPKEY^DIEVK1(DIFILE)
- +14 ;
- IENS ;
- +1 SET DIEN=""
- SET DIOUT2=0
- FOR
- Begin DoDot:2
- +2 SET DIEN=$ORDER(@DIFDA@(DIFILE,DIEN))
- +3 IF DIEN=""
- SET DIOUT2=1
- QUIT
- +4 NEW DIDA
- DO IEN^DICA2(.DIFILE,DIEN,.DIDA,DIRULE,.DIOK)
- IF $GET(DIERR)
- QUIT
- +5 IF 'DIOK
- SET DIOUT1=1
- SET DIOUT2=1
- Begin DoDot:3
- +6 IF $EXTRACT(DIEN,$LENGTH(DIEN))'=","
- DO ERR^DICA3(304,"",DIEN)
- QUIT
- +7 DO ERR^DICA3(202,"","","","IENS")
- End DoDot:3
- QUIT
- +8 IF '$$RID(DIFILE,DIEN,DIFDA,DIRID,DIFLAGS,DIKEYEX)
- QUIT
- +9 IF $DATA(@DIFDA@(DIFILE,DIEN,.001))#2
- Begin DoDot:3
- +10 NEW DIENS
- SET DIENS=@DIFDA@(DIFILE,DIEN,.001)
- +11 IF $DATA(@DINUMS@(@DIRULE@("NUM")))[0
- Begin DoDot:4
- +12 SET @DINUMS@(@DIRULE@("NUM"))=DIENS
- End DoDot:4
- +13 SET @DIRULE@("SAVE",$JOB,DIFILE,DIEN,.001)=DIENS
- +14 KILL @DIFDA@(DIFILE,DIEN,.001)
- End DoDot:3
- VALUES ;
- +1 IF DIFLAGS'["E"
- IF $GET(DIFLAGS)["U"!'DIKEYEX
- QUIT
- +2 SET DIFLD=""
- SET DIOUT3=0
- FOR
- Begin DoDot:3
- +3 SET DIFLD=$ORDER(@DIFDA@(DIFILE,DIEN,DIFLD))
- +4 IF DIFLD=""
- SET DIOUT3=1
- QUIT
- +5 IF $GET(DIFLAGS)'["U"
- IF DIKEYEX
- DO BLDFLD^DIEVK1(DIFILE,DIEN,DIFLD)
- IF DIFLAGS'["E"
- QUIT
- +6 IF $EXTRACT(DIEN)="?"
- IF $EXTRACT(DIEN,2)'="+"
- IF DIFLD=.01&(DIFLAGS'["K")
- QUIT
- IF DIFLAGS["K"
- IF $DATA(^TMP("DIKK",$JOB,"P",DIFILE,DIFILE,DIFLD))#2
- QUIT
- +7 SET DIVAL=$GET(@DIFDA@(DIFILE,DIEN,DIFLD))
- +8 DO DTYP^DIOU(DIFILE,DIFLD,.DITYPE)
- +9 IF DITYPE=5
- SET DINT=DIVAL
- CONVERT ;
- +1 IF DITYPE'=5
- Begin DoDot:4
- +2 IF DIEN["?"!(DIEN["+")
- Begin DoDot:5
- +3 IF "@"[DIVAL
- Begin DoDot:6
- +4 IF DIEN["?"
- IF $PIECE($GET(^DD(DIFILE,DIFLD,0)),U,2)["R"
- Begin DoDot:7
- +5 DO ERR712(DIFILE,DIFLD)
- End DoDot:7
- QUIT
- +6 SET DINT=DIVAL
- End DoDot:6
- QUIT
- +7 IF DIFLAGS["K"
- IF $EXTRACT(DIEN)'="+"
- IF $PIECE($GET(^DD(DIFILE,DIFLD,0)),U,5,999)["DINUM"
- IF $DATA(^TMP("DIKK",$JOB,"P",DIFILE))
- IF $DATA(^(DIFILE,DIFLD))[0
- Begin DoDot:6
- +8 DO ERR^DICA3(520,DIFILE,"",DIFLD,"DINUMed")
- End DoDot:6
- QUIT
- +9 NEW DA
- MERGE DA=DIDA
- +10 NEW DIARG
- SET DIARG="D0"
- +11 NEW DIMAX
- SET DIMAX=$ORDER(DA(""),-1)
- +12 NEW DIVAR
- FOR DIVAR=1:1:DIMAX
- SET DIARG=DIARG_",D"_DIVAR
- +13 NEW @DIARG
- FOR DIVAR=0:1:DIMAX-1
- SET @("D"_DIVAR)=DA(DIMAX-DIVAR)
- +14 IF DIMAX
- SET @("D"_DIMAX)=DA
- +15 NEW DIDA
- DO CHK^DIE(DIFILE,DIFLD,"N",DIVAL,.DINT)
- End DoDot:5
- IF $GET(DIERR)
- QUIT
- +16 IF '$TEST
- Begin DoDot:5
- +17 NEW DIVALFLG
- SET DIVALFLG="RU"_$EXTRACT("Y",DIFLAGS["Y")
- +18 DO VAL^DIE(DIFILE,DIEN,DIFLD,DIVALFLG,DIVAL,.DINT)
- End DoDot:5
- IF $GET(DIERR)
- QUIT
- +19 IF $DATA(DINUM)[0
- QUIT
- +20 SET @DINUMS@(@DIRULE@("NUM"))=DINUM
- KILL DINUM
- End DoDot:4
- IF $GET(DIERR)
- QUIT
- +21 SET @DIRULE@("FDA",DIFILE,DIEN,DIFLD)=DINT
- End DoDot:3
- IF DIOUT3!$GET(DIERR)
- QUIT
- End DoDot:2
- IF DIOUT2!$GET(DIERR)
- QUIT
- End DoDot:1
- IF DIOUT1!$GET(DIERR)
- QUIT
- CLEANUP ;
- +1 IF $GET(DIERR)!'DIOK
- KILL @DIRULE
- QUIT
- +2 KILL @DIRULE@("L"),@DIRULE@("NUM"),@DIRULE@("OP"),@DIRULE@("ROOT")
- +3 KILL @DIRULE@("SEQ"),@DIRULE@("TEMP"),@DIRULE@("UP")
- +4 SET DIN=$NAME(@DIRULE@("ORDER"))
- SET DIC=0
- SET @DIRULE@("THE END")=""
- +5 FOR
- SET DIN=$QUERY(@DIN)
- IF DIN=""!($PIECE(DIN,",",3)'="""ORDER""")
- QUIT
- Begin DoDot:1
- +6 SET DIC=DIC+1
- SET @DIRULE@("NEXT",DIC)=@DIN
- End DoDot:1
- +7 KILL @DIRULE@("ORDER"),@DIRULE@("THE END")
- +8 IF DIFLAGS["E"
- SET DIFDA=$NAME(@DIRULE@("FDA"))
- +9 QUIT
- +10 ;
- RID(DIFILE,DIEN,DIFDA,DIRID,DIFLAGS,DIKEYEX) ;
- +1 NEW DIC,DIK,DIOK,DIP,DIR
- +2 ;
- +3 ;Check required ids
- +4 SET DIP=$PIECE(DIEN,",")
- SET DIOK=1
- +5 FOR DIC=1:1
- SET DIR=$PIECE(DIRID,U,DIC)
- IF DIR=""
- QUIT
- Begin DoDot:1
- +6 IF DIR=.01
- Begin DoDot:2
- +7 IF DIP'?1P.E
- +8 IF '$TEST
- IF DIP["+"
- IF "@"[$GET(@DIFDA@(DIFILE,DIEN,.01))
- Begin DoDot:3
- +9 SET DIOK=0
- DO ERR^DICA3(352,DIFILE,DIEN)
- End DoDot:3
- +10 IF '$TEST
- IF DIFLAGS'["K"
- IF "@"[$GET(@DIFDA@(DIFILE,DIEN,.01))
- Begin DoDot:3
- +11 SET DIOK=0
- DO ERR^DICA3(351,DIFILE,DIEN)
- End DoDot:3
- End DoDot:2
- +12 IF '$TEST
- IF DIP["+"
- IF "@"[$GET(@DIFDA@(DIFILE,DIEN,DIR))
- Begin DoDot:2
- +13 SET DIOK=0
- DO ERR^DICA3(311,DIFILE,DIEN,DIR)
- End DoDot:2
- +14 IF '$TEST
- IF "@"[$GET(@DIFDA@(DIFILE,DIEN,DIR),0)
- Begin DoDot:2
- +15 SET DIOK=0
- DO ERR712(DIFILE,DIR)
- End DoDot:2
- End DoDot:1
- +16 ;
- +17 ;Check that the FDA contains the appropriate key fields
- +18 IF '$GET(DIKEYEX,1)
- QUIT DIOK
- +19 ;
- +20 ;If appropriate, ensure all primary and secondary keys are provided
- +21 IF DIFLAGS'["U"
- IF DIP["+"
- Begin DoDot:1
- +22 SET DIR=0
- FOR
- SET DIR=$ORDER(^DD("KEY","F",DIFILE,DIR))
- IF 'DIR
- QUIT
- Begin DoDot:2
- +23 IF "@"[$GET(@DIFDA@(DIFILE,DIEN,DIR))
- Begin DoDot:3
- +24 SET DIK=0
- FOR
- SET DIK=$ORDER(^DD("KEY","F",DIFILE,DIR,DIK))
- IF 'DIK
- QUIT
- Begin DoDot:4
- +25 SET DIOK=0
- DO ERR744^DIEVK1(DIFILE,DIR,DIK,DIEN)
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +26 ;
- +27 ;If appropriate, ensure at least one key field is provided
- +28 IF '$TEST
- IF $GET(DIFLAGS)["K"
- IF $EXTRACT(DIEN)="?"
- IF $EXTRACT(DIEN,2)'="+"!($GET(DIFLAGS)["U")
- Begin DoDot:1
- +29 IF '$$KFLD^DIEVK1(DIFILE,DIEN,DIFDA)
- SET DIOK=0
- End DoDot:1
- +30 QUIT DIOK
- +31 ;
- ERR712(DIFILE,DIFIELD) ;
- +1 NEW DIFILNAM
- SET DIFILNAM=$ORDER(^DD(DIFILE,0,"NM",""))
- IF DIFILNAM?." "
- SET DIFILNAM="#"_DIFILE
- +2 NEW DIFLDNAM
- SET DIFLDNAM=$$FLDNM^DIEFU(DIFILE,DIFIELD)
- +3 DO ERR^DICA3(712,DIFILE,"",DIFIELD,DIFLDNAM,DIFILNAM)
- +4 QUIT