- DIC0 ;SFISC/TKW-Lookup routine utilities called by DIC ;12/10/99 12:10 [ 04/02/2003 8:25 AM ]
- ;;22.0;VA FileMan;**1001**;APR 1, 2003
- ;;22.0;VA FileMan;**4,20**;Mar 30, 1999
- ;Per VHA Directive 10-93-142, this routine should not be modified.
- ;
- D ; Reset back to starting index for lookup.
- S D=DINDEX("START") K DINDEX S (DINDEX,DINDEX("START"))=D,DINDEX("WAY")=1
- S:$D(DID(1)) DID(1)=2
- N DIFLAGS S DIFLAGS="4l"_$P("M^",U,DIC(0)["M")
- D INDEX^DICUIX(.DIFILEI,DIFLAGS,.DINDEX,"",.DIVAL)
- Q
- ;
- SETVAL ; If custom lookup routine (like MTLU) comes in to entry point after ASK, we need to set up the lookup values.
- K DIVAL,DIALLVAL D CHKVAL
- I DIVAL(0) D CHKVAL1(DINDEX("#"),.DIVAL,DIC(0),DIC(0),.DIALLVAL)
- Q
- ;
- INIT ; Initialize variables at all entry points in ^DIC.
- I '$D(DIFILEI)#2 D GETFILE(.DIC,.DIFILEI,.DIENS) Q:DIFILEI=""
- I '$D(@(DIC_"0)")),'$D(DIC("P")),$E(DIC,1,6)'="^DOPT(" S DIC("P")=$$GETP^DIC0(DIFILEI) I DIC("P")="" S Y=-1 D Q^DIC2 Q
- I $G(DO)="" K DO D GETFA^DIC1(.DIC,.DO)
- S (DINDEX,DINDEX("START"))=D,DINDEX("WAY")=1
- D INDEX^DICUIX(.DIFILEI,"4l",.DINDEX,"",.DIVAL)
- I DIC(0)["V" S DIASKOK=1
- S Y=-1 I DIC(0)["Z" K Y(0)
- Q
- ;
- CHKVAL ; Check lookup values input by user.
- N I I $G(X)="" S X=$G(X(1))
- S DIVAL(0)=0,DIVAL(1)=X F I=2:1:DINDEX("#") S DIVAL(I)=$G(X(I))
- N J,DIOUT S DIOUT=0
- F I=1:1:DINDEX("#") S J=$G(DIVAL(I)) I J]"" D Q:DIOUT
- . I DINDEX("#")>1 S X(I)=J
- . I J["^" S (DUOUT,DIOUT)=1,DIVAL(0)=0 Q
- . I J?1."?" K DIVAL S DIVAL(0)=0,X=$E(J,1,2),DIOUT=1 Q
- . S DIVAL(0)=DIVAL(0)+1 Q
- Q
- ;
- CHKVAL1(DIXNO,DIVAL,DIFLAGS,DIC0,DIALLVAL) ; Check for errors with values, flags,index.
- N DIERROR,I S DIALLVAL=1 D
- . I '$D(DIC0),DIFLAGS'["l" D Q:$G(DIERROR)
- . . S I=$O(DIVAL(99999),-1) I I>DIXNO S DIERROR=8093 Q
- . . S:DIXNO>1&(DIFLAGS["M") DIERROR=8095 Q
- . F I=1:1:DIXNO S DIVAL(I)=$G(DIVAL(I)) D:DIVAL(I)=""
- . . I DIFLAGS["X",DIFLAGS'["l" S DIERROR=8094 Q
- . . S DIALLVAL=0 Q
- . Q
- I $D(DIERROR) D
- . I '$D(DIC0) D ERR^DICF4(DIERROR) Q
- . K DIVAL S DIVAL(0)=0 Q:DIC0'["E" W $C(7),!,$$EZBLD^DIALOG(DIERROR) Q
- Q
- ;
- CHKVAL2(DIXNO,DIVAL,DIC0,DDS) ; Check lookup values for control characters or too long.
- N I,J,DIER S DIER=""
- F I=1:1:DIXNO S J=$G(DIVAL(I)) D:J]"" Q:DIER
- . I J'?.ANP S DIER=204 Q
- . I J?1.N.1".".N,($L($P(J,"."))>25!($L($P(J,".",2))>25)) S DIER=208 Q
- . I ($L(J)-255)>0 S DIER=209
- . Q
- Q:'DIER
- D:DIC0["Q"
- . W $C(7) Q:DIC(0)'["E"
- . I '$D(DDS) W !,$$EZBLD^DIALOG(DIER) Q
- . N DDH S DDH=1,DDH(1,"T")=" ** "_$$EZBLD^DIALOG(DIER)
- . S DDC=7,DDD=1 D LIST^DDSU
- . Q
- K DIVAL S DIVAL(0)=0
- Q
- ;
- KILL2 K DIVAL,DIALLVAL
- KILL1 K DIFILEI,DINDEX,DIMAXLEN,DIENS Q
- ;
- GETFILE(DIC,DIFILE,DIENS) ; Return file number, global references, IEN string and KEY fields data.
- S DIFILE="" I $G(DIC)="" Q
- I +$P(DIC,"E")'=DIC N DIDIC M DIDIC=DIC N DIC S DIDIC=$$CREF^DILF(DIDIC),DIDIC=$NA(@DIDIC),DIDIC=$$OREF^DILF(DIDIC) M DIC=DIDIC K DIDIC
- N DA
- I +$P(DIC,"E")=DIC D
- . S DIFILE=DIC,DIC=$G(^DIC(DIC,0,"GL")) Q:DIC]""
- . S DIC=DIFILE,DIFILE="" Q
- E D
- . S DIFILE=$G(@(DIC_"0)")) I DIFILE]"" S DIFILE=+$P(DIFILE,U,2) Q
- . S DIFILE=+$G(DIC("P")) Q:DIFILE
- . S DIFILE=$$FILENUM^DILIBF(DIC) Q
- Q:DIFILE=""
- S DIENS=","
- I DIC(0)'["p" D SETIEN(DIC,DIFILE,.DIENS) Q:DIFILE=""
- S DIFILE(DIFILE,"O")=DIC
- S DIFILE(DIFILE)=$$CREF^DILF(DIC)
- N I S I=$O(^DD("KEY","AP",DIFILE,"P",0)) Q:'I
- S DIFILE(DIFILE,"KEY","IEN")=DIENS
- N F,X F F=0:0 S F=$O(^DD("KEY",I,2,F)) Q:'F S X=$G(^(F,0)) D
- . S DIFILE(DIFILE,"KEY",+$P(X,U,2),+$P(X,U,3),+X)="" Q
- Q
- ;
- SETIEN(DIC,DIFILE,DIENS) ; Set DIENS from global root
- N F,G,I,J,K,DIDA
- S F=$$FNO^DILIBF(DIFILE) I F="" S DIFILE="" Q
- S G=$G(^DIC(F,0,"GL")) I G="" S DIFILE="" Q
- S F=$P(DIC,G,2)
- S K=0 F I=1:2 S J=$P(F,",",I) Q:J="" S K=K+1,J(K)=J
- S DIDA="" F J=1:1:K S DIDA(K+1-J)=J(J)
- S DIENS=$$IENS^DILF(.DIDA) Q
- ;
- GETP(DISUB) ; Return DIC("P") for a subfile DIFILE.
- N DIFILE S DIFILE=$G(^DD(DISUB,0,"UP")) Q:'DIFILE ""
- N DIFIELD S DIFIELD=$O(^DD(DIFILE,"SB",DISUB,0)) Q:'DIFIELD ""
- Q $P($G(^DD(DIFILE,DIFIELD,0)),U,2)
- ;
- DSPH ; Display name of indexed fields when DIC(0)["T" (called from DICF2)
- Q:$G(DS(0,"HDRDSP",DIFILEI)) S DS(0,"HDRDSP",DIFILEI)=1
- W ! N I S I=($G(DICR))*2 W:I ?I
- W " Lookup: "
- I $G(DICR) S I=$G(@(DIC_"0)")) I I]"" W $P(I,U)_" "
- F I=1:1:DINDEX("#") W DINDEX(I,"PROMPT")_$P(", ^",U,I<DINDEX("#"))
- Q
- ;
- ; Error messages:
- ; 204 The input value contains control character
- ; 349 String too long by |1| character(s)!
- ; 8093 Too many lookup values for this index.
- ; 8094 Not enough lookup values provided for an e
- ; 8095 Only one compound index allowed on a looku
- ;
- DIC0 ;SFISC/TKW-Lookup routine utilities called by DIC ;12/10/99 12:10 [ 04/02/2003 8:25 AM ]
- +1 ;;22.0;VA FileMan;**1001**;APR 1, 2003
- +2 ;;22.0;VA FileMan;**4,20**;Mar 30, 1999
- +3 ;Per VHA Directive 10-93-142, this routine should not be modified.
- +4 ;
- D ; Reset back to starting index for lookup.
- +1 SET D=DINDEX("START")
- KILL DINDEX
- SET (DINDEX,DINDEX("START"))=D
- SET DINDEX("WAY")=1
- +2 IF $DATA(DID(1))
- SET DID(1)=2
- +3 NEW DIFLAGS
- SET DIFLAGS="4l"_$PIECE("M^",U,DIC(0)["M")
- +4 DO INDEX^DICUIX(.DIFILEI,DIFLAGS,.DINDEX,"",.DIVAL)
- +5 QUIT
- +6 ;
- SETVAL ; If custom lookup routine (like MTLU) comes in to entry point after ASK, we need to set up the lookup values.
- +1 KILL DIVAL,DIALLVAL
- DO CHKVAL
- +2 IF DIVAL(0)
- DO CHKVAL1(DINDEX("#"),.DIVAL,DIC(0),DIC(0),.DIALLVAL)
- +3 QUIT
- +4 ;
- INIT ; Initialize variables at all entry points in ^DIC.
- +1 IF '$DATA(DIFILEI)#2
- DO GETFILE(.DIC,.DIFILEI,.DIENS)
- IF DIFILEI=""
- QUIT
- +2 IF '$DATA(@(DIC_"0)"))
- IF '$DATA(DIC("P"))
- IF $EXTRACT(DIC,1,6)'="^DOPT("
- SET DIC("P")=$$GETP^DIC0(DIFILEI)
- IF DIC("P")=""
- SET Y=-1
- DO Q^DIC2
- QUIT
- +3 IF $GET(DO)=""
- KILL DO
- DO GETFA^DIC1(.DIC,.DO)
- +4 SET (DINDEX,DINDEX("START"))=D
- SET DINDEX("WAY")=1
- +5 DO INDEX^DICUIX(.DIFILEI,"4l",.DINDEX,"",.DIVAL)
- +6 IF DIC(0)["V"
- SET DIASKOK=1
- +7 SET Y=-1
- IF DIC(0)["Z"
- KILL Y(0)
- +8 QUIT
- +9 ;
- CHKVAL ; Check lookup values input by user.
- +1 NEW I
- IF $GET(X)=""
- SET X=$GET(X(1))
- +2 SET DIVAL(0)=0
- SET DIVAL(1)=X
- FOR I=2:1:DINDEX("#")
- SET DIVAL(I)=$GET(X(I))
- +3 NEW J,DIOUT
- SET DIOUT=0
- +4 FOR I=1:1:DINDEX("#")
- SET J=$GET(DIVAL(I))
- IF J]""
- Begin DoDot:1
- +5 IF DINDEX("#")>1
- SET X(I)=J
- +6 IF J["^"
- SET (DUOUT,DIOUT)=1
- SET DIVAL(0)=0
- QUIT
- +7 IF J?1."?"
- KILL DIVAL
- SET DIVAL(0)=0
- SET X=$EXTRACT(J,1,2)
- SET DIOUT=1
- QUIT
- +8 SET DIVAL(0)=DIVAL(0)+1
- QUIT
- End DoDot:1
- IF DIOUT
- QUIT
- +9 QUIT
- +10 ;
- CHKVAL1(DIXNO,DIVAL,DIFLAGS,DIC0,DIALLVAL) ; Check for errors with values, flags,index.
- +1 NEW DIERROR,I
- SET DIALLVAL=1
- Begin DoDot:1
- +2 IF '$DATA(DIC0)
- IF DIFLAGS'["l"
- Begin DoDot:2
- +3 SET I=$ORDER(DIVAL(99999),-1)
- IF I>DIXNO
- SET DIERROR=8093
- QUIT
- +4 IF DIXNO>1&(DIFLAGS["M")
- SET DIERROR=8095
- QUIT
- End DoDot:2
- IF $GET(DIERROR)
- QUIT
- +5 FOR I=1:1:DIXNO
- SET DIVAL(I)=$GET(DIVAL(I))
- IF DIVAL(I)=""
- Begin DoDot:2
- +6 IF DIFLAGS["X"
- IF DIFLAGS'["l"
- SET DIERROR=8094
- QUIT
- +7 SET DIALLVAL=0
- QUIT
- End DoDot:2
- +8 QUIT
- End DoDot:1
- +9 IF $DATA(DIERROR)
- Begin DoDot:1
- +10 IF '$DATA(DIC0)
- DO ERR^DICF4(DIERROR)
- QUIT
- +11 KILL DIVAL
- SET DIVAL(0)=0
- IF DIC0'["E"
- QUIT
- WRITE $CHAR(7),!,$$EZBLD^DIALOG(DIERROR)
- QUIT
- End DoDot:1
- +12 QUIT
- +13 ;
- CHKVAL2(DIXNO,DIVAL,DIC0,DDS) ; Check lookup values for control characters or too long.
- +1 NEW I,J,DIER
- SET DIER=""
- +2 FOR I=1:1:DIXNO
- SET J=$GET(DIVAL(I))
- IF J]""
- Begin DoDot:1
- +3 IF J'?.ANP
- SET DIER=204
- QUIT
- +4 IF J?1.N.1".".N
- IF ($LENGTH($PIECE(J,"."))>25!($LENGTH($PIECE(J,".",2))>25))
- SET DIER=208
- QUIT
- +5 IF ($LENGTH(J)-255)>0
- SET DIER=209
- +6 QUIT
- End DoDot:1
- IF DIER
- QUIT
- +7 IF 'DIER
- QUIT
- +8 IF DIC0["Q"
- Begin DoDot:1
- +9 WRITE $CHAR(7)
- IF DIC(0)'["E"
- QUIT
- +10 IF '$DATA(DDS)
- WRITE !,$$EZBLD^DIALOG(DIER)
- QUIT
- +11 NEW DDH
- SET DDH=1
- SET DDH(1,"T")=" ** "_$$EZBLD^DIALOG(DIER)
- +12 SET DDC=7
- SET DDD=1
- DO LIST^DDSU
- +13 QUIT
- End DoDot:1
- +14 KILL DIVAL
- SET DIVAL(0)=0
- +15 QUIT
- +16 ;
- KILL2 KILL DIVAL,DIALLVAL
- KILL1 KILL DIFILEI,DINDEX,DIMAXLEN,DIENS
- QUIT
- +1 ;
- GETFILE(DIC,DIFILE,DIENS) ; Return file number, global references, IEN string and KEY fields data.
- +1 SET DIFILE=""
- IF $GET(DIC)=""
- QUIT
- +2 IF +$PIECE(DIC,"E")'=DIC
- NEW DIDIC
- MERGE DIDIC=DIC
- NEW DIC
- SET DIDIC=$$CREF^DILF(DIDIC)
- SET DIDIC=$NAME(@DIDIC)
- SET DIDIC=$$OREF^DILF(DIDIC)
- MERGE DIC=DIDIC
- KILL DIDIC
- +3 NEW DA
- +4 IF +$PIECE(DIC,"E")=DIC
- Begin DoDot:1
- +5 SET DIFILE=DIC
- SET DIC=$GET(^DIC(DIC,0,"GL"))
- IF DIC]""
- QUIT
- +6 SET DIC=DIFILE
- SET DIFILE=""
- QUIT
- End DoDot:1
- +7 IF '$TEST
- Begin DoDot:1
- +8 SET DIFILE=$GET(@(DIC_"0)"))
- IF DIFILE]""
- SET DIFILE=+$PIECE(DIFILE,U,2)
- QUIT
- +9 SET DIFILE=+$GET(DIC("P"))
- IF DIFILE
- QUIT
- +10 SET DIFILE=$$FILENUM^DILIBF(DIC)
- QUIT
- End DoDot:1
- +11 IF DIFILE=""
- QUIT
- +12 SET DIENS=","
- +13 IF DIC(0)'["p"
- DO SETIEN(DIC,DIFILE,.DIENS)
- IF DIFILE=""
- QUIT
- +14 SET DIFILE(DIFILE,"O")=DIC
- +15 SET DIFILE(DIFILE)=$$CREF^DILF(DIC)
- +16 NEW I
- SET I=$ORDER(^DD("KEY","AP",DIFILE,"P",0))
- IF 'I
- QUIT
- +17 SET DIFILE(DIFILE,"KEY","IEN")=DIENS
- +18 NEW F,X
- FOR F=0:0
- SET F=$ORDER(^DD("KEY",I,2,F))
- IF 'F
- QUIT
- SET X=$GET(^(F,0))
- Begin DoDot:1
- +19 SET DIFILE(DIFILE,"KEY",+$PIECE(X,U,2),+$PIECE(X,U,3),+X)=""
- QUIT
- End DoDot:1
- +20 QUIT
- +21 ;
- SETIEN(DIC,DIFILE,DIENS) ; Set DIENS from global root
- +1 NEW F,G,I,J,K,DIDA
- +2 SET F=$$FNO^DILIBF(DIFILE)
- IF F=""
- SET DIFILE=""
- QUIT
- +3 SET G=$GET(^DIC(F,0,"GL"))
- IF G=""
- SET DIFILE=""
- QUIT
- +4 SET F=$PIECE(DIC,G,2)
- +5 SET K=0
- FOR I=1:2
- SET J=$PIECE(F,",",I)
- IF J=""
- QUIT
- SET K=K+1
- SET J(K)=J
- +6 SET DIDA=""
- FOR J=1:1:K
- SET DIDA(K+1-J)=J(J)
- +7 SET DIENS=$$IENS^DILF(.DIDA)
- QUIT
- +8 ;
- GETP(DISUB) ; Return DIC("P") for a subfile DIFILE.
- +1 NEW DIFILE
- SET DIFILE=$GET(^DD(DISUB,0,"UP"))
- IF 'DIFILE
- QUIT ""
- +2 NEW DIFIELD
- SET DIFIELD=$ORDER(^DD(DIFILE,"SB",DISUB,0))
- IF 'DIFIELD
- QUIT ""
- +3 QUIT $PIECE($GET(^DD(DIFILE,DIFIELD,0)),U,2)
- +4 ;
- DSPH ; Display name of indexed fields when DIC(0)["T" (called from DICF2)
- +1 IF $GET(DS(0,"HDRDSP",DIFILEI))
- QUIT
- SET DS(0,"HDRDSP",DIFILEI)=1
- +2 WRITE !
- NEW I
- SET I=($GET(DICR))*2
- IF I
- WRITE ?I
- +3 WRITE " Lookup: "
- +4 IF $GET(DICR)
- SET I=$GET(@(DIC_"0)"))
- IF I]""
- WRITE $PIECE(I,U)_" "
- +5 FOR I=1:1:DINDEX("#")
- WRITE DINDEX(I,"PROMPT")_$PIECE(", ^",U,I<DINDEX("#"))
- +6 QUIT
- +7 ;
- +8 ; Error messages:
- +9 ; 204 The input value contains control character
- +10 ; 349 String too long by |1| character(s)!
- +11 ; 8093 Too many lookup values for this index.
- +12 ; 8094 Not enough lookup values provided for an e
- +13 ; 8095 Only one compound index allowed on a looku
- +14 ;