FILEMAN V22.2 PRODUCTION GRADE VERSION
GT.M 28-MAR-2013 11:00:41
DDBR
DDBR ;SFISC/DCL-VA FILEMAN BROWSER ; 18NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EN N DDBC,DDBFLG,DDBL,DDBPMSG,DDBSA,DDBX,IOTM,IOBM
 ; I '$$TEST^DDBRT W $C(7),!!,$$EZBLD^DIALOG(830),!! Q  ;VEN/SMH - don't check for supportability
 D LIST^DDBR3(.DDBX)
 I DDBX'>0 W:DDBX=0 $C(7),!!,$$EZBLD^DIALOG(1404),!! Q  ;**
 S DDBSA=DDBX(6)
 S DDBFLG=DDBX(4)
 S DDBPMSG=DDBX(5)
 D CONTNU
 D KTMP^DDBRU
 Q
WP(DDBFN,DDBRN,DDBFLD,DDBFLG,DDBPMSG,DDBL,DDBC,IOTM,IOBM) N DDBSA
 S DDBSA=$$GET^DIQG($G(DDBFN),$G(DDBRN),$G(DDBFLD),"B")
 I $G(DIERR) D CLEAN Q
 S DDBSA=$P(DDBSA,"$CREF$",2)
 I DDBSA']"" D ERR("FILE, RECORD and/or FIELD") Q
 I '$D(@DDBSA) D ERR("SOURCE ARRAY") Q
 I $G(DDBFLG)["A" D
 .N DDBSAN
 .S DDBSAN=$$NROOT^DDBRAP($NA(@DDBSA))
 .I '$D(@DDBSAN) D WP^DDBRAP($NA(@DDBSA))
 .Q:$G(DDBPMSG)]""
 .I $D(@DDBSAN@("TITLE")) S DDBPMSG=@DDBSAN@("TITLE") Q
 .Q
 S DDBPMSG=$S($G(DDBPMSG)]"":DDBPMSG,1:"VA FileMan Browser (wp) DOCUMENT 1")
 D CONTNU
 D:$G(DDBFLG)'["P" KTMP^DDBRU
 Q
BROWSE(DDBSA,DDBFLG,DDBPMSG,DDBL,DDBC,IOTM,IOBM) N DDBRLIST
CONTNU I $G(U)'="^" N U S U="^"
 I $G(DDBFLG)["A" D
 .N DDBSAN
 .S DDBSAN=$$NROOT^DDBRAP($NA(@DDBSA))
 .I '$D(@DDBSAN) D WP^DDBRAP($NA(@DDBSA))
 .Q:$G(DDBPMSG)]""
 .I $D(@DDBSAN@("TITLE")) S DDBPMSG=@DDBSAN@("TITLE") Q
 .Q
 S DDBPMSG=$S($G(DDBPMSG)]"":DDBPMSG,1:"VA FileMan Browser DOCUMENT 1")
 N %,D,DX,IOP,XY,X,Y
 D:$G(DDBFLG)'["H" INIT I $G(DIERR) D CLEAN Q
 I $G(DDBSA)']"" D ERR("SOURCE ARRAY") Q
 I '$D(@DDBSA) D ERR("SOURCE ARRAY") Q
 I $G(DDBFLG)'["N",DDBSA'="^TMP(""DDB"",$J)" D
 .I $NA(@DDBSA)=$NA(^TMP("DDB",$J)) S DDBSA="^TMP(""DDB"",$J)" Q
 .K ^TMP("DDB",$J)
 .D XY^%RCR($$OREF(DDBSA),"^TMP(""DDB"",$J,")
 .;M ^TMP("DDB",$J)=@DDBSA
 .S DDBSA="^TMP(""DDB"",$J)"
 .Q
 N DDBRE,DDBRPE,DDBPSA,DDBTO,DDBDM,DDBFNO,I,DDBFLGS,DDBRHT,DDBRHTF
 N DDBHDR,DDBHDRC,DDBFTR,DDBSP,DDBSF,DDBST,DDBTL,DDBTPG,DDBZN
 I '$G(DDBRLIST) N DDBSRL,DDBSX,DDBSY,DDBRSA
 S DDBFTR=$E("Col>     |"_$$EZBLD^DIALOG(8074)_"| Line>                 Screen>"_$J("",IOM),1,IOM) ;**
 I '$G(DDBRLIST) S IOBM=$S($G(IOBM)>0:IOBM,1:$G(IOSL,24))-1,IOTM=$S($G(IOTM)>0:IOTM,1:1)+1
 S DDBRSA=0
 D TB^DDBRS(.IOTM,.IOBM,.DDBRSA)
 S DDBSX="0;4;40;65"
 S DDBSY=DDBRSA(0,"DDBSY")
 I IOBM>(IOSL-1) D ERR($$EZBLD^DIALOG(833)) Q  ;**
 I IOTM<2 D ERR($$EZBLD^DIALOG(832)) Q  ;**
 I IOBM'>IOTM D ERR($$EZBLD^DIALOG(831)) Q  ;**
 S DDBSRL=DDBRSA(0,"DDBSRL")
 I DDBSRL'>4,$G(DDBFLG)'["H" D ERR($$EZBLD^DIALOG(834)) Q  ;**
 I DDBRSA(1,"DDBSRL")'>4 K DDBRSA(1),DDBRSA(2)
 S DDBHDR=$$CTXT(DDBPMSG,$J("",IOM+1),IOM),DDBHDRC=0
 S DDBTL=$P($G(@DDBSA@(0)),"^",3) S:DDBTL'>0 DDBTL=$O(@DDBSA@(" "),-1)
 I DDBTL'>0 D  I DDBTL'>0 D BLD^DIALOG(1700,$$EZBLD^DIALOG(1404)_DDBSA) D CLEAN Q  ;**
 .N I S I=0 F  S I=$O(@DDBSA@(I)) Q:I'>0  S DDBTL=I
 .Q
 S DDBZN=$D(@DDBSA@(DDBTL,0))#2,DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1),DDBSF=1,DDBST=IOM
 S DDBDM=DDBSA="^TMP(""DDB"",$J)"
 I $G(DDBC)=+$G(DDBC) D ERR("TAB (Closed Array Root)") Q
 S:$G(DDBC)="" DDBC="^TMP(""DDBC"",$J)"
 I '$D(@DDBC) F I=1,22:22:176 S @DDBC@(I)=""
 I $D(@DDBC@(1))'>9 N DDBC0,DDBC1 S @DDBC@(1)="",DDBC1=1,DDBC0=DDBC
 S DDBPSA=0,DDBFLG=$G(DDBFLG)
 S DDBFLGS=DDBFLG["S",DDBRHTF=DDBFLG["A"
 I DDBRHTF S $E(DDBFTR,1,9)="HYPER-TXT"
 G EN^DDBRGE
DOCLIST(DDBDSA,DDBFLG,IOTM,IOBM) S IOP="HOME" D ^%ZIS
 N DDBPMSG,DDBL,DDBC,DDBSA,DDBSRL,DDBSX,DDBSY,DDBRSA,DDBRLIST
 S IOBM=$S($G(IOBM)>0:IOBM,1:$G(IOSL,24))-1,IOTM=$S($G(IOTM)>0:IOTM,1:1)+1
 S DDBSX="0;4;40;65"
 S DDBSY=(IOTM-2)_";"_(IOTM-1)_";"_(IOBM-1)_";"_(IOBM)  ;hdr,txttop,txtbot,ftr
 I IOBM>(IOSL-1) D ERR($$EZBLD^DIALOG(833)) Q  ;**
 I IOTM<2 D ERR($$EZBLD^DIALOG(832)) Q  ;**
 I IOBM'>IOTM D ERR($$EZBLD^DIALOG(831)) Q  ;**
 S DDBSRL=(IOBM-IOTM)+1  ;scroll region lines
 I '$D(@DDBDSA) D ERR("DOCUMENT ARRAY INVALID") Q
 S DDBFLG=$TR($G(DDBFLG),"P")_"N"
 S DDBPMSG=$O(@DDBDSA@("")) S:DDBPMSG]"" DDBSA=@DDBDSA@(DDBPMSG)
 I DDBPMSG']""!(DDBSA']"") D ERR("DOCUMENT ARRAY INVALID") Q
 D  I $G(DIERR) K ^TMP("DDBLST",$J) D CLEAN Q
 .N DOC,DOCSA
 .S DOC=""
 .K ^TMP("DDBLST",$J)
 .F  S DOC=$O(@DDBDSA@(DOC)) Q:DOC=""  D
 ..S DOCSA=@DDBDSA@(DOC)
 ..D LOADCL^DDBR4(DOCSA,"",DOC)
 ..Q
 .Q
 Q:$G(DDBENDR)
 S DDBRLIST=1
 G CONTNU
RTN G DR^DDBRU
ROOT G EN^DDBRU2
CTXT(X,T,W) Q:X="" $G(T)
 N HW
 S W=$G(W,79),HW=W\2
 S $E(T,HW-($L(X)\2),HW-($L(X)\2)+$L(X))=X Q $E(T,1,W)
OREF(X) N X1,X2 S X1=$P(X,"(")_"(",X2=$$OR2($P(X,"(",2)) Q:X2="" X1 Q X1_X2_","
OR2(%) Q:%=")"!(%=",") "" Q:$L(%)=1 %  S:"),"[$E(%,$L(%)) %=$E(%,1,$L(%)-1) Q %
INIT I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 D INIT^DDGLIB0()
 I $G(DIERR) Q
 I '$D(IOSTBM)!('$D(IORI)) S X="IOSTBM;IORI" D ENDR^%ZISS
 D:$G(IOSTBM)="" TRMERR^DDGLIB0($$EZBLD^DIALOG(831)) ;**
 D:$G(IORI)="" TRMERR^DDGLIB0($$EZBLD^DIALOG(835))
 W $P(DDGLCLR,DDGLDEL,2) ; VEN/SMH - Clear entire screen.
 ;TODO: Rollback IOSL to 24 if IOSL is >100; restore at exit (prob in CLEAN) - VEN/SMH
 Q
ERR(DDBERR) N P S P(1)=DDBERR
 I $G(U)="^" N U S U="^"
 D BLD^DIALOG(202,.P),OUT^DDBRU:$D(DDGLDEL)
CLEAN D:'$D(DDS) KILL^DDGLIB0($G(DDBFLG))
 Q

DDBR0
DDBR0 ;SFISC/DCL-VA FILEMAN BROWSER FUNCTIONS ;04:01 PM  26 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
PU N I,J,K S I=DDBL-DDBSRL,J=I-(DDBSRL-1),K=DDBL
 S DX=$P(DDBSX,";"),DY=$P(DDBSY,";",2)
 I DDBZN D  D:K'=DDBL RLPI Q
 .F I=I:-1:J Q:'$D(@DDBSA@(I,0))  D
 ..X IOXY
 ..W IORI,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(I,0),I)
 ..S DDBL=DDBL-1
 F I=I:-1:J Q:I'>0!('$D(@DDBSA@(I)))  D
 .X IOXY
 .W IORI,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(I),I)
 .S DDBL=DDBL-1
 D:K'=DDBL RLPI
 Q
PD N I,J,K S I=DDBL+1,J=DDBL+DDBSRL,K=DDBL
 S DX=0,DY=$P(DDBSY,";",3)
 X IOXY
 I DDBZN D  D:K'=DDBL RLPI Q
 .F I=I:1:J Q:'$D(@DDBSA@(I,0))  W !,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(I,0),I) S DDBL=DDBL+1
 .Q
 F I=I:1:J Q:'$D(@DDBSA@(I))  W !,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(I),I) S DDBL=DDBL+1
 D:K'=DDBL RLPI
 Q
LU N I S I=DDBL-DDBSRL
 S DX=0,DY=$P(DDBSY,";",2)
 X IOXY
 I DDBZN Q:'$D(@DDBSA@(I,0))  S DDBL=DDBL-1 W IORI,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(I,0),I) D RLPIR Q
 I I>0,$D(@DDBSA@(I)) S DDBL=DDBL-1 W IORI,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(I),I) D RLPIR Q
 Q
LD S DX=0,DY=$P(DDBSY,";",3)
 X IOXY
 I DDBZN,$D(@DDBSA@(DDBL+1,0)) D  Q
 .S DDBL=DDBL+1
 .W !,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(DDBL,0),DDBL)
 .D RLPIR
 .Q
 I 'DDBZN,$D(@DDBSA@(DDBL+1)) D  Q
 .S DDBL=DDBL+1
 .W !,$P(DDGLCLR,DDGLDEL),$$HTD(@DDBSA@(DDBL),DDBL)
 .D RLPIR
 .Q
 Q
COL(N) N X
 S X=$O(@DDBC@(DDBSF),N) Q:X'>0
 S DDBSF=X
COLENT S DDBST=DDBSF+(IOM-1),DDBL=$S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)
 D SDLR(DDBL+1),COLR
 I DDBHDRC D ENCHDR^DDBR4
 Q
COLJ N X
COLA S X(2)="Col> " W $$WS^DDBR1(.X) D  G:X=""!(X=U) OUT
 .D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,30,1,"",100,1,"","KPW",.X)
 .K DIR0
 .Q
 I $E(X)="?" G COLERR
 I X<1!(X>255) W $C(7) G COLERR
 S DDBSF=X G COLENT
 Q
COLERR S X(1)="    * [ "_$$EZBLD^DIALOG(836)_" ] *" ;**'Enter a number between 1 and 255'
 G COLA
OUT D PSR^DDBR0()
 Q
RLE Q:$G(DDBRHTF)  S DDBSF=1 G COLENT
RRE Q:$G(DDBRHTF)  S DDBSF=$O(@DDBC@(""),-1) G COLENT
 ;
ONLINE Q
RR I DDBRHTF D JUMP^DDBRAHTJ(1) Q
 D COL(1)
 Q
RL I DDBRHTF D JUMP^DDBRAHTJ(-1) Q
 D COL(-1)
 Q
TOP S DDBL=0 D SDLR(1),RLPIR
 Q
BOT I DDBTL>DDBSRL S DDBL=DDBTL-DDBSRL D SDLR(DDBL+1),RLPIR
 Q
EXIT S DDBRE="^"
 Q
TO S DDBTO=DDBTO+1,DDBE=-1 S:DDBTO'<($G(DTIME,300)\5) DDBE="^"
 Q
RCLSI D RLPIR,COLR
 Q
PSR(PSR) S DDBL=$S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)
 D:$G(PSR) HFR D SDLR(DDBL+1),RLPIR,COLR
 Q
SDL ;
SDLR(L) N I,J,SFR,STO
 S DX=0,SFR=$P(DDBSY,";",2),STO=$P(DDBSY,";",3),J=L
 S DY=SFR X IOXY
 I DDBZN F I=SFR:1:STO D
 .W:I'=SFR !
 .W $P(DDGLCLR,DDGLDEL)
 .I J=L,$D(@DDBSA@(L)) W $$HTD(@DDBSA@(L,0),L) S DDBL=DDBL+1,L=L+1
 .S J=J+1
 .Q
 I 'DDBZN F I=SFR:1:STO D
 .W:I'=SFR !
 .W $P(DDGLCLR,DDGLDEL)
 .I J=L,$D(@DDBSA@(L)) W $$HTD(@DDBSA@(L),L) S DDBL=DDBL+1,L=L+1
 .S J=J+1
 .Q
 Q
HFR N FTR S FTR=1
HDR S DX=0
 S DY=$P(DDBSY,";")
 X IOXY
 W $P(DDGLVID,DDGLDEL,6)
 W DDBHDR
 W $P(DDGLVID,DDGLDEL,10)
 G:$G(FTR) FTR
 Q
FTR I DDBFLGS Q
 W $P(DDGLVID,DDGLDEL,6)
 I DDBRSA=1 W $P(DDGLVID,DDGLDEL,4)
 S DY=$P(DDBSY,";",4)
 X IOXY
 W DDBFTR
 S DX=$P(DDBSX,";",3)
 X IOXY
 W $J($S(DDBL>DDBTL:" ",DDBL<1:" ",1:DDBL),6)," of ",DDBTL
 S DX=$P(DDBSX,";",4)
 X IOXY
 W $J($S(DDBL>DDBTL:" ",DDBL<1:" ",1:DDBL-1\DDBSRL+1),5)," of ",DDBTL\DDBSRL+(DDBTL#DDBSRL'<1)
 S DX=$P(DDBSX,";",2)
 X IOXY
 W:'DDBRHTF $J(DDBSF,4)
 I DDBRSA=1 W $P(DDGLVID,DDGLDEL,10)
 W $P(DDGLVID,DDGLDEL,10)
 Q
RLPI ;
RLPIR I DDBFLGS Q
 S DX=$P(DDBSX,";",3),DY=$P(DDBSY,";",4)
 I DDBRSA=1 W $P(DDGLVID,DDGLDEL,4)
 W $P(DDGLVID,DDGLDEL,6)
 X IOXY
 W $J($S(DDBL>DDBTL:" ",DDBL<1:" ",1:DDBL),6)
 S DX=$P(DDBSX,";",4)
 X IOXY
 W $J($S(DDBL>DDBTL:" ",DDBL<1:" ",1:DDBL-1\DDBSRL+1),5)
 I DDBRSA=1 W $P(DDGLVID,DDGLDEL,10)
 W $P(DDGLVID,DDGLDEL,10)
 Q
COLR I DDBFLGS!(DDBRHTF) Q
 S DX=$P(DDBSX,";",2),DY=$P(DDBSY,";",4)
 X IOXY
 I DDBRSA=1 W $P(DDGLVID,DDGLDEL,4)
 W $P(DDGLVID,DDGLDEL,6)
 W $J(DDBSF,4)
 I DDBRSA=1 W $P(DDGLVID,DDGLDEL,10)
 W $P(DDGLVID,DDGLDEL,10)
 Q
 ;
HTD(X,WPIEN) ;
 Q:'DDBRHTF $E(X,DDBSF,DDBST)
 Q:$L(X,"$.")'>2 X
 S:$L(X,"$.$")>2 X=$$HT(X,"$.$","","")
 S:$L(X,"$.%")>2 X=$$HT(X,"$.%",$P(DDGLVID,DDGLDEL),$P(DDGLVID,DDGLDEL,3))
 Q X
 ;
HT(Y,D,C1,C2) ;
 Q:$L(Y,D)'>2 Y
 N YL,I,Y1
 S YL=$L(Y,D),Y1=""
 F I=1:1:YL D
 .S:I#2 Y1=Y1_$P(Y,D,I)
 .I '(I#2),+$G(DDBRHT)=WPIEN,$P(DDBRHT,DDGLDEL,4)=DDBSA,$P(DDBRHT,DDGLDEL,2)=$P(Y,D,I) D  Q
 ..S Y1=Y1_C1_$P(DDGLVID,DDGLDEL,4)_$P($P(Y,D,I),"^",$S($P(Y,D,I)["$CREF$":$L($P(Y,D,I),"^"),1:2),255)_$P(DDGLVID,DDGLDEL,5)_C2
 ..Q
 .S:'(I#2) Y1=Y1_C1_$P($P(Y,D,I),"^",$S($P(Y,D,I)["$CREF$":$L($P(Y,D,I),"^"),1:2),255)_C2
 .Q
 Q Y1

DDBR1
DDBR1 ;SFISC/DCL-VA FILEMAN BROWSER PROTOCOLS ;06:01 PM  31 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
GOTO N X
GTR S X(1)=$G(X(1)),X(2)=$$EZBLD^DIALOG(1408)_" >" W $$WS(.X) D  G:X=""!(X=U) OUT ;**
 .D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,30,1,"",100,"","","KPW",.X)
 .K DIR0
 .Q
 I $E(X)="?" S X(1)="* "_$$EZBLD^DIALOG($S(DDBRHTF:1409,1:1409.1))_" *" G GTR ;**
 I X S X=X*DDBSRL G LINE
 S $E(X)=$TR($E(X),"bclst","BCLST")
 I X["S",$TR($P(X,"S",2)," ") S X=$TR($P(X,"S",2)," ")*DDBSRL G LINE
 I X["L",$TR($P(X,"L",2)," ") S X=$TR($P(X,"L",2)," ") G LINE
 I X["C",'DDBRHTF,$TR($P(X,"C",2)," ") S X=$TR($P(X,"C",2)," ") I X>0&(X<256) S DDBSF=X G COLENT^DDBR0
 I $E(X)="T" G TOP^DDBR0
 I $E(X)="B" G BOT^DDBR0
 G OUT
LINE S DDBL=$S(X'>DDBSRL:0,X>DDBTL:DDBTL,1:X) D PSR^DDBR0()
 Q
NOOF N N
 S N=1 I $D(DDBFNO) N D,X G FNO
 S X(1)="    * ["_$$EZBLD^DIALOG(1406)_"] *" ;**'NO PREVIOUS FIND STRING AVAILABLE'
 N Q S N=0 G BPR
FIND N D,Q,X
 N N
 S N=0
BPR S X(1)=$G(X(1)),X(2)=$$EZBLD^DIALOG(8126) W $$WS(.X) D  G:X="" OUT ;**
 .N Y
 .D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,30,1,$P($G(DDBFNO),U,3,255),100,"","","KPW",.X,.Y)
 .K DIR0
 .S:$P($G(Y),U)="U" X=X_"/U"
 .Q
 S Q=$TR($E(X,$L(X)-1,$L(X)),"u","U")
 S D=$S(Q="/U":-1,1:1)
 S:D=-1 X=$E(X,1,$L(X)-2)
 Q:X=""
 I $E(X)="?" S X(1)="    * [ "_$$EZBLD^DIALOG(1407)_" ] *" G BPR ;**
FNO N I,MATCHI,MATCHX
 I N S D=$P(DDBFNO,"^",2),X=$P(DDBFNO,"^",3,255)
 S X(1)="",X(2)="    * ["_$$EZBLD^DIALOG(1405,X)_"] *" W $$WS(.X) ;**'SEARCHING'
 D  S:I<0 I=0
 .I N&(D=1) S I=DDBL Q
 .I N S I=DDBL-(DDBSRL-1) Q
 .I D=1 S I=DDBL-DDBSRL Q
 .S I=DDBL+1
 .Q
 D
 .N XUC
 .S XUC=$$U(X)
 .I DDBDM D  Q
 ..I DDBZN D  Q
 ...F  S I=$O(^TMP("DDB",$J,I),D) Q:I'>0  I $$U($G(^(I,0)))[XUC S MATCHI=I,MATCHX=^(0) Q
 ...Q
 ..F  S I=$O(^TMP("DDB",$J,I),D) Q:I'>0  I $$U(^(I))[XUC S MATCHI=I,MATCHX=^(I) Q
 ..Q
 .I DDBZN D  Q
 ..F  S I=$O(@DDBSA@(I),D) Q:I'>0  I $$U($G(@DDBSA@(I,0)))[XUC S MATCHI=I,MATCHX=@DDBSA@(I,0) Q
 ..Q
 .F  S I=$O(@DDBSA@(I),D) Q:I'>0  I $$U(@DDBSA@(I))[XUC S MATCHI=I,MATCHX=@DDBSA@(I) Q
 .Q
 I $G(MATCHI) D  S DDBFNO=DDBL_"^"_D_"^"_X Q
 .S DDBSF=1,DDBST=IOM F  Q:$F(MATCHX,X)'>DDBST  D
 ..S DDBSF=$O(@DDBC@(DDBSF)) S:DDBSF="" DDBSF=$O(@DDBC@(""))
 ..S DDBST=DDBSF+(IOM-1)
 ..Q
 .I I+(DDBSRL)>DDBTL S I=DDBTL-(DDBSRL-1)
 .I DDBTL'>DDBSRL S I=1
 .S DDBL=I-1 D SDLRH(I,X),RCLSI^DDBR0
 .Q
NO S X(1)="",X(2)="    * ["_$$EZBLD^DIALOG($S(N:8006.11,1:8006.1))_" ] *" W $C(7),$$WS(.X) H 3  ;**'NO MATCH FOUND'
 D PSRH
 Q
OUT D PSR^DDBR0()
 Q
PSRH S DDBL=$S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)
 D SDLRH(DDBL+1,X)
 Q
SDL ;
SDLRH(L,HLS) N I,J,SFR,STO
 S DX=0,SFR=$P(DDBSY,";",2),STO=$P(DDBSY,";",3),J=L
 S DY=SFR X IOXY
 I DDBZN F I=SFR:1:STO D
 .W:I'=SFR !
 .W $P(DDGLCLR,DDGLDEL)
 .I J=L,$D(@DDBSA@(L)) W $$HL($$HTD^DDBR0(@DDBSA@(L,0),L),HLS,$P(DDGLVID,DDGLDEL,6),$P(DDGLVID,DDGLDEL,7)) S DDBL=DDBL+1,L=L+1
 .S J=J+1
 .Q
 I 'DDBZN F I=SFR:1:STO D
 .W:I'=SFR !
 .W $P(DDGLCLR,DDGLDEL)
 .I J=L,$D(@DDBSA@(L)) W $$HL($$HTD^DDBR0(@DDBSA@(L),L),HLS,$P(DDGLVID,DDGLDEL,6),$P(DDGLVID,DDGLDEL,7)) S DDBL=DDBL+1,L=L+1
 .S J=J+1
 .Q
 Q
HL(X,S,ON,RS,F) S X=$G(X),S=$G(S),F=$G(F)=1
 G:F CS
 N C,I,P,T,XU,SU,SL,TL,XL
 S XU=$$U(X),SU=$$U(S),SL=$L(S),C=$L(XU,SU)-1,T="",XL=0
 Q:'C X
 F I=1:1:C S P=$F(XU,SU,XL),T=T_$E(X,XL,P-SL-1)_ON_$E(X,P-SL,P-1)_RS,XL=P
 S T=T_$E(X,XL,255)
 Q T
U(X) Q $$UP^DILIBF(X)  ;**CCO/NI  UPPER-CASE
CS Q:$L(X,S)'>1 X
 N C,I,P,T
 S T="",C=$L(X,S)
 F I=1:1:C S P=$P(X,S,I),T=T_P_$S(I'=C:ON_S_RS,1:"")
 Q T
HELPS N DDBHELPS
 S DDBHELPS=$S(DDBFLG["A":83,1:71)+DDBSRL
HELP I $E(DDBSA,1,11)="^DI(.84,920" S DDBL=0 D SDLR^DDBR0(1),RLPIR^DDBR0 Q
 N DDBHA S DDBHA=$S(DDBFLG["A":9202,1:9201) Q:'$D(^DI(.84,DDBHA,2))  S DDBHA=$NA(^(2)) I $G(DUZ("LANG"))>1,$D(^(4,DUZ("LANG"),1)) S DDBHA=$NA(^(1)) ;**CCO/NI
 I $D(^TMP("DDBLST",$J,"J")) D
 .K ^TMP("DDBLST",$J,"JS")
 .M ^TMP("DDBLST",$J,"JS")=^TMP("DDBLST",$J,"J")
 .K ^TMP("DDBLST",$J,"J")
 .Q
 D BROWSE^DDBR(DDBHA,"PNH"_$S(DDBFLG["A":"A",1:""),"VA FileMan Help Document",$G(DDBHELPS),"",IOTM-1,IOBM+1)
 K ^TMP("DDBLST",$J,"J")
 I $D(^TMP("DDBLST",$J,"JS")) M ^TMP("DDBLST",$J,"J")=^TMP("DDBLST",$J,"JS") K ^TMP("DDBLST",$J,"JS")
 W @IOSTBM
 D PSR^DDBR0(1)
 Q
LC(L,C) Q:$G(L)'>0 ""
 S C=$G(C,"-")
 Q $TR($J("",L)," ",C)
WS(X) S DX=0,DY=$P(DDBSY,";",3)-3 X IOXY
 W $P(DDGLGRA,DDGLDEL)
 W $TR($J("",IOM)," ",$P(DDGLGRA,DDGLDEL,3))
 W $P(DDGLGRA,DDGLDEL,2)
 W !,$P(DDGLCLR,DDGLDEL),$G(X(1))
 W !,$P(DDGLCLR,DDGLDEL),$G(X(2))
 W !,$P(DDGLCLR,DDGLDEL),$G(X(3))
 S DY=$P(DDBSY,";",3),DX=$L($G(X(2)))+2 X IOXY
 Q ""

DDBR2
DDBR2 ;SFISC/DCL-VA FILEMAN BROWSER ;2JAN2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
SWITCH(DDBLST,DDBRET) ;Switch to another document in list or FileMan Database
 I $E(DDBSA,1,11)="^DI(.84,920" D EXIT^DDBR0 Q  ;!(DDBSA="^XTMP(""DDBDOC"")") Q
 I DDBSA=$NA(^TMP("DDWB",$J)) G EXIT^DDBR0:$G(DDBRET)["R",SWITCH^DDBRWB Q
 N DDBLN,DDBZ,DIC,DIR,X,Y,DIRUT,DIROUT,DUOUT,DILN
 S DILN=DDBRSA(DDBRSA,"DDBSRL")-2
 S:$G(DDBLST)="" DDBLST="^TMP(""DDBLST"",$J)" S DDBLN=$S($D(@DDBLST@("A",DDBSA)):^(DDBSA),1:$O(@DDBLST@(" "),-1)+1)
 I DDBFLG["R",'$D(@DDBLST) D SFR() G PS
 I DDBFLG["A" D SFR() G PS
 I $G(DDBRET)["R" D  G:$G(Y) PS Q
 .Q:DDBPSA'>0
 .Q:'$D(@DDBLST@("APSA",DDBPSA))  S X=^(DDBPSA) S:$D(@DDBLST@("A",X)) Y=^(X)
 .I $G(Y) S DDBPSA=DDBPSA-1 N DDBPSA D SAVEDDB(DDBLST,DDBLN),USAVEDDB(DDBLST,+Y)
 .Q
BRMC D BRM
 I $D(@DDBLST) D
 .I $O(@DDBLST@(" "),-1)=1,$G(@DDBLST@(1,"DDBSA"))=DDBSA Q
 .;W "Current list: ",!
 .S DDBZ=$G(@DDBLST@("A",DDBSA),0)
 .;S X=0 F  S X=$O(@DDBLST@(X)) Q:X'>0  W:X'=DDBZ !,$J(X,3),"  ",$E(@DDBLST@(X,0),1,75)
 .W !
 .K DIR0
CUR .I DDBFLG'["R" S DIR(0)="Y",DIR("A")=$$EZBLD^DIALOG(8142),DIR("B")="YES" D ^DIR Q:$D(DIRUT)!(Y'>0)  ;"Do you wish to select from current list"
 .S DIC=$$OREF^DIQGU(DDBLST),DIC(0)="EMQ",DIC("S")="I +Y'=DDBZ",DIC("W")="W:$E(^(0))=U ^(0)",X="??" D ^DIC  ;K DIC("S") Q:Y'>0
 .S DIC(0)="AEMQ"
 .D ^DIC K DIC("S") Q:Y'>0
 .D SAVEDDB(DDBLST,DDBLN),USAVEDDB(DDBLST,+Y)
 .S DIROUT=1
 N DDBLNA
 S:DDBFLG["R" DIROUT=1
 I '$D(DIROUT) D LIST^DDBR3(.DDBLNA)
 I $G(DDBLNA,-1)=-1 G PS
 I $G(DDBLNA(6))=DDBSA G PS  ;if current document selected again
 I $G(DDBLNA(6))]"",$D(@DDBLST@("APSA",DDBSA)) G PS  ;if already in list
NO I DDBLNA'>0 W $C(7),!!,$$EZBLD^DIALOG(1404),DDBLNA(5) H 3 ;**
 D:DDBLNA>0 SAVEDDB(DDBLST,DDBLN),WP(.DDBLNA)
PS D PSR^DDBR0(1)
 Q
 ;
WP(DDBX) ;
 S DDBSA=DDBX(6)
 S DDBPMSG=DDBX(5)
 S DDBHDR=$$CTXT^DDBR(DDBPMSG,$J("",IOM+1),IOM)
 S DDBTL=$P(@DDBSA@(0),"^",3)
 S DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1)
 S DDBZN=1
 S DDBDM=0
 S DDBSF=1
 S DDBST=IOM
 S DDBC="^TMP(""DDBC"",""DDBC"",$J)"
 I '$D(@DDBC) F I=1,22:22:176 S @DDBC@(I)=""
 S DDBL=0
 Q
 ;
SAVEDDB(DDBLIST,IEN,NSAPSA) ;Save local varialbes into ^TMP("DDBLIST",$J,IEN)
 ;DDBS  array to save list
 ;IEN   internal entry
 ;NSAPSA Not Set "APSA" x-ref if undefined, pass 1 to not set NSAPSA (optional - default is to set "APSA")
 S NSAPSA=+$G(NSAPSA)
 N I,X
 F I="HDR","HDRC","SA","ZN","DM","PMSG","L","C","TL","SF","ST","RE","RPE" S X="DDB"_I,@DDBLIST@(IEN,X)=@X
 ;I $D(DDBFNO) S @DDBLIST@(IEN,DDBFNO)=DDBFNO  ;decided to keep it the same throughout the browse session (Next Find String)
 S @DDBLIST@(IEN,0)=DDBPMSG
 S:'$D(@DDBLIST@(0)) ^(0)="CURRENT LIST^1"
 S:'$D(@DDBLIST@("A",DDBSA)) @DDBLIST@("A",DDBSA)=IEN
 S:'$D(@DDBLIST@("B",DDBPMSG,IEN)) @DDBLIST@("B",DDBPMSG,IEN)=""
 I $G(DDBRET)["R",DDBRPE=DDBRE Q
 Q:NSAPSA
 S X=$O(@DDBLST@("APSA"," "),-1)+1
 I $G(@DDBLIST@("APSA",X-1))=DDBSA S DDBPSA=X-1 Q
 S @DDBLIST@("APSA",X)=DDBSA,DDBPSA=X
 Q
 ;
USAVEDDB(DDBLIST,IEN) ;Unsave varialbes in ^TMP("DDBLIST",$J,IEN) to locals
 ;DDBS  array to save list
 ;IEN   internal entry
 N I,X
 F I="HDR","HDRC","SA","ZN","DM","PMSG","L","C","TL","SF","ST","RE","RPE" S X="DDB"_I,@X=@DDBLIST@(IEN,X)
 S DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1)
 ;I $D(@DDBLIST@(IEN,"DDBFNO")) S DDBFNO=@DDBLIST@(IEN,"DDBFNO")
 Q
 ;
 ;
CTXT(X,T,W) ;Center X in T which is W characters wide (usually spaces) and W for screen width
 Q:X="" $G(T)
 N HW
 S W=$G(W,79),HW=W\2
 S $E(T,HW-($L(X)\2),HW-($L(X)\2)+$L(X))=X Q T
OREF(X) N X1,X2 S X1=$P(X,"(")_"(",X2=$$OR2($P(X,"(",2)) Q:X2="" X1 Q X1_X2_","
OR2(%) Q:%=")"!(%=",") "" Q:$L(%)=1 %  S:"),"[$E(%,$L(%)) %=$E(%,1,$L(%)-1) Q %
 ;
BRM ;BROWSE MANAGER SCREEN
 N DX,DY,X
 S DX=0,DY=$P(DDBSY,";"),X=$$CTXT^DDBR("BROWSE SWITCH MANAGER",$J("",IOM+1),IOM)
 X IOXY
 W $P(DDGLVID,DDGLDEL,6)  ;rvon
 W $P(DDGLVID,DDGLDEL,4)  ;uon
 W X
 W $P(DDGLVID,DDGLDEL,10)  ;rvoff
 F DY=$P(DDBSY,";",2):1:$P(DDBSY,";",4) X IOXY W $P(DDGLCLR,DDGLDEL)
 W $P(DDGLVID,DDGLDEL,6)  ;rvon
 W $P(DDGLVID,DDGLDEL,4)  ;uon
 W X
 W $P(DDGLVID,DDGLDEL,10)  ;rvoff
 W @IOSTBM
 S DY=$P(DDBSY,";",2)
 X IOXY
 Q
 ;
SFR(Y) N X
 S X(1)="",X(2)=$$CTXT^DDBR("<< "_$$EZBLD^DIALOG($S($G(Y):7076.1,1:7076))_" >>","",IOM) ;** 'SWITCH FUNCTION RESTRICTED'
 W $$WS^DDBR1(.X),$C(7)
 R X:3
 Q

DDBR3
DDBR3 ;SFISC/DCL-SELECT FILE & WP FIELD TO BROWSE ;NOV 04, 1996@13:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LIST(DDBLIST) ;DDBLIST=Target array for file number,ien,field,...
 S DDBLIST=-1  ;no selection
EN ;
 N %,%H,%ZISOS,A,D,D0,D1,DA,DDBB,DDBDDF,DDBDIC,DDBFRCD,DDBIEN,DDBRCR,DDBX,DIC,DICS,DIW,DIWF,DIWL,DIWR,DIWT,DK,DL,DN,DX,I,POP,S,X,Y
 ;S DIC=1,DIC(0)="AEMQ" D ^DIC Q:+Y'>0  ;Select file
 D ^DICRW Q:Y'>0
 S DIC="^DD("_+Y_",",DIC(0)="AEMQ"
M S DIC("W")="I $P(^(0),U,2) W $S($P(^DD(+$P(^(0),U,2),.01,0),U,2)[""W"":""  (word-processing)"",1:""  (multiple)"")"
 S DIC("S")="I $P(^(0),U,2)"
 D ^DIC I +Y'>0,$D(@(DIC_"0,""UP"")")) S DIC="^DD("_+^("UP")_"," G M ;Select field/back out of multiples
 Q:+Y'>0
 I $P(@(DIC_+Y_",0)"),U,2) S DIC="^DD("_+$P(^(0),U,2)_",",Y=.01 G D:$P(^DD(+$P(^(0),U,2),.01,0),U,2)["W",M
D ;
 K DIC("S")
 S DDBDIC=$$UP^DIQGU(+$P(DIC,"^DD(",2),.DDBDIC),(DDBX,DDBIEN)=""
 S DDBFRCD=$$GET^DIQGDD(DDBDIC,"","NAME")_":[",DDBB=0
 F  S DDBX=$O(DDBDIC(DDBX)) Q:DDBX'<0  D  Q:$G(Y)'>0
 .K DA D IEN(","_DDBIEN,.DA)
 .S DIC=$$ROOT^DIQGU(+DDBDIC(DDBX),","_DDBIEN),DIC(0)="AEMQ" Q:DIC']""
 .S DDBRCR=$$CREF^DILF(DIC)
 .I $P($G(@DDBRCR@(0)),U,4)'>0 D  K DDBIEN Q
 ..W $C(7),!!,"No Records at "_$S(DDBDIC=+DDBDIC(DDBX):"FILE",1:$P(^DD(+DDBDIC(DDBX),.01,0),U))_" Level.",!
 ..Q
 .D ^DIC I Y'>0 K DDBIEN Q
 .S DDBIEN=+Y_","_DDBIEN
 .S DDBFRCD=DDBFRCD_$S(DDBB:"\",1:"")_$$GET^DIQG(+DDBDIC(DDBX),DDBIEN,.01),DDBB=1
 .K DA D IEN(DDBIEN,.DA)
 .Q
DISP ;
 S DDBDDF=$O(^DD(+DDBDIC(-1),"SB",+DDBDIC(0),"")) Q:'DDBDDF
 S DDBFRCD=DDBFRCD_"] (wp): "_$P(^DD(DDBDIC(0),.01,0),"^")
 I $D(DDBIEN) D  Q
 .N DDBX S DDBX=$P($$GET^DIQG(+DDBDIC(-1),DDBIEN,DDBDDF,"B"),"$CREF$",2)
 .S DDBLIST=$D(@DDBX)
 .S DDBLIST(1)=+DDBDIC(-1)
 .S DDBLIST(2)=DDBIEN
 .S DDBLIST(3)=DDBDDF
 .S DDBLIST(4)="N"
 .S DDBLIST(5)=DDBFRCD
 .S DDBLIST(6)=DDBX
 .Q
 Q
IEN(IEN,DA) S DA=$P(IEN,",") N I F I=2:1 Q:$P(IEN,",",I)=""  S DA(I-1)=$P(IEN,",",I)
 Q

DDBR4
DDBR4 ;SFISC/DCL-LOAD CURRENT LIST ;NOV 04, 1996@13:49
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LOADCL(DDBSA,DDBFLG,DDBPMSG,DDBL,DDBC,DDBLST) ;
 ;DDBSA=source array by value
 ;DDGFLG=no flags currently available
 ;DDBPMSG=text to be displayed (centered) on top line
 ;DDBL=display line default 1st screen/line (22 in most cases)
 ;DDBC=location of column tab array used with right/left arrow keys
 ;DDBLST=location of current list (BROWSER expects ^TMP("DDBLST",$J))
 I $G(DDBSA)']"" N X S X(1)="SOURCE ARRAY("_DDBSA_")" D BLD^DIALOG(202,.X) Q
 I '$D(@DDBSA) N X S X(1)="SOURCE ARRAY("_DDBSA_")" D BLD^DIALOG(202,.X) Q
 N DDBRE,DDBLN,DDBRPE,DDBPSA,DDBTO,I,X,Y
 N DDBFNO,DDBDM,DDBSF,DDBTL,DDBTPG,DDBZN,DDBFTR,DDBHDR,DDBHDRC,DDBST
 S DDBHDR=$$CTXT($G(DDBPMSG,"VA FileMan Browser"),$J("",IOM+1),IOM)
 S DDBHDRC=+$G(DDBHDRC)
 S DDBTL=$P($G(@DDBSA@(0)),"^",3) S:DDBTL'>0 DDBTL=$O(@DDBSA@(" "),-1)
 I DDBTL'>0 D  I DDBTL'>0 D BLD^DIALOG(1700,"*NO TEXT* "_DDBSA) Q
 .N I S I=0 F  S I=$O(@DDBSA@(I)) Q:I'>0  S DDBTL=I
 .Q
 S DDBZN=$D(@DDBSA@(DDBTL,0))#2,DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1),DDBDM=DDBSA="^TMP(""DDB"",$J)",DDBSF=1
 S DDBC=$G(DDBC,"^TMP(""DDBC"",$J)")
 S DDBPSA=0,DDBFLG=$G(DDBFLG)
 S DDBL=$G(DDBL,0) S:DDBL<0 DDBL=0 S:DDBL>DDBTL DDBL=DDBTL
 S (DDBRE,DDBRPE)="",DDBTO=0,DDBST=IOM
 S DDBLST=$G(DDBLST,"^TMP(""DDBLST"",$J)"),DDBLN=$S($D(@DDBLST@("A",DDBSA)):^(DDBSA),1:$O(@DDBLST@(" "),-1)+1)
 D SAVEDDB^DDBR2(DDBLST,DDBLN,1)
 Q
 ;
CTXT(X,T,W) ;Center X in T which is W characters wide (usually spaces) and W for screen width
 Q:X="" $G(T)
 N HW
 S W=$G(W,79),HW=W\2
 S $E(T,HW-($L(X)\2),HW-($L(X)\2)+$L(X))=X Q T
OREF(X) N X1,X2 S X1=$P(X,"(")_"(",X2=$$OR2($P(X,"(",2)) Q:X2="" X1 Q X1_X2_","
OR2(%) Q:%=")"!(%=",") "" Q:$L(%)=1 %  S:"),"[$E(%,$L(%)) %=$E(%,1,$L(%)-1) Q %
 ;
CHDR(D) ;Change Header Message in Window Title
 ;D=direction 1 is down, -1 is up, if 0 restore back to original msg.
 N C
 S C=DDBHDRC+D
 I C<0!(C>DDBTL) W $C(7) Q
 S DDBHDRC=C
ENCHDR I 'DDBHDRC S DDBHDR=$$CTXT^DDBR(DDBPMSG,$J("",IOM+1),IOM)
 E  D
 .I DDBZN S DDBHDR=$$CTXT^DDBR($E(@DDBSA@(DDBHDRC,0),DDBSF,DDBST)_$J("",IOM+1),"",IOM) Q
 .S DDBHDR=$$CTXT^DDBR($E(@DDBSA@(DDBHDRC),DDBSF,DDBST)_$J("",IOM+1),"",IOM)
 .Q
 I DDBRSA S DDBRSA(DDBRSA,"DDBHDRC")=DDBHDRC,DDBRSA(DDBRSA,"DDBHDR")=DDBHDR
 ; repaint screen
 D RPS^DDBRGE
 Q

DDBRAHT
DDBRAHT ;SFISC/DCL-BROWSER ANCHOR & HYPERTEXT PROCESSOR ;NOV 04, 1996@13:50
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
TAB ;
 S DDBRHT=$G(DDBRHT)
 I $P(DDBRHT,DDGLDEL,4)'=DDBSA S DDBRHT=""
 N LIM,ULCLR,ULNEW
 S LIM=DDBL,ULCLR=DDBRHT'>0,ULNEW=0
PSR S DDBL=$S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)
 D SDLR(DDBL+1)
 Q
SDLR(L) N I,J,SFR,STO
 I +DDBRHT<L!(+DDBRHT>LIM) S DDBRHT="",ULCLR=1
 S DX=0,SFR=$P(DDBSY,";",2),STO=$P(DDBSY,";",3)
 S DY=SFR X IOXY
 F I=SFR:1:STO D
 .I $D(@DDBSA@(L)) S X=$S(DDBZN:@DDBSA@(L,0),1:@DDBSA@(L)),DDBL=DDBL+1,L=L+1
 .E  Q
 .I ULCLR,ULNEW Q
 .Q:$L(X,"$.%")'>2
 .S WRF=0,J=$P(X,"$.%",$P(DDBRHT,DDGLDEL,3)),X=$$HTD(X,L-1)
 .I +DDBRHT,J=$P(DDBRHT,DDGLDEL,2) S ULCLR=1,WRF=1
 .Q:'WRF
 .S DY=I
 .X IOXY
 .W $P(DDGLCLR,DDGLDEL),X
 .Q
 ;
 I 'ULNEW S DDBRHT=""
 Q
 ;
HTD(X,WPIEN) ;text
 Q:'DDBRHTF $E(X,DDBSF,DDBST)
 Q:$L(X,"$.")'>2 X
 S:$L(X,"$.$")>2 X=$$HT(X,"$.$","","","","","","")
 S:$L(X,"$.%")>2 X=$$HT(X,"$.%",$P(DDGLVID,DDGLDEL),$P(DDGLVID,DDGLDEL,3),WPIEN'<+DDBRHT,$S(WPIEN=+DDBRHT:$P(DDBRHT,DDGLDEL,3)+2,1:2),$P(DDGLVID,DDGLDEL,4),$P(DDGLVID,DDGLDEL,5))
 Q X
 ;
HT(Y,D,C1,C2,UF,UP,U1,U2) ;
 Q:$L(Y,D)'>2 Y
 N YL,I,Y1
 S YL=$L(Y,D),Y1=""
 F I=1:1:YL D
 .S:I#2 Y1=Y1_$P(Y,D,I)
 .I UF,I=UP,'ULNEW D  Q
 ..S Y1=Y1_C1_U1_$P($P(Y,D,I),"^",$S($P(Y,D,I)["$CREF$":$L($P(Y,D,I),"^"),1:2),255)_U2_C2,ULNEW=1,WRF=1
 ..S DDBRHT=WPIEN_DDGLDEL_$P(Y,D,I)_DDGLDEL_I_DDGLDEL_DDBSA
 .S:'(I#2) Y1=Y1_C1_$P($P(Y,D,I),"^",$S($P(Y,D,I)["$CREF$":$L($P(Y,D,I),"^"),1:2),255)_C2
 .Q
 Q Y1

DDBRAHTE
DDBRAHTE ;SFISC/DCL-BROWSER ANCHOR & HYPERTEXT JUMP EDIT ;NOV 04, 1996@13:51
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
REDIT ; root edit for hypertext jump - CLOSED_ROOT
 Q
 ;prototype - phasing out
 Q:'$$CHKI
 N DDBSAN,DDBSANS,DDBSANX,DDBSANR,X
 S DDBSAN=$$NROOT^DDBRAP(DDBSA),DDBSANX=$P(DDBRHT,DDGLDEL,2)
 S X(1)="                       < Edit Hypertext Jump Closed_Root >"
 S DDBSANS=$G(@DDBSAN@("H",DDBSANX)),DDBSANR=$G(@DDBSAN@("H",DDBSANX,0))
 Q:DDBSAN=""!(DDBSANS="")
GTR S X(1)=$G(X(1)),X(2)=" "_$E(DDBSANX,1,30)_" >"
 W $$WS^DDBR1(.X)
 D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,44,1,DDBSANR,100,1,"","KPW",.X)
 K DIR0
 I $E(X)="?" S X(1)="* Enter closed_root jump for hypertext: "_$E(DDBSANX,1,35)_$S($L(DDBSANX)>35:"...",1:"")_" *" G GTR
 I DDBSANR'=X S @DDBSAN@("H",DDBSANX,0)=X
 G OUT
 ;
IEDIT ; interactive edit/switch
 Q:'$$CHKI
 Q
ANCH ; enter Anchor for jump
 Q
 ;prototype - phasing out
 Q:'$$CHKI
 N DDBSAN,DDBSANS,DDBSANX,DDBSANR,DDBSANCH,X
 S DDBSAN=$$NROOT^DDBRAP(DDBSA),DDBSANX=$P(DDBRHT,DDGLDEL,2)
 S X(1)="                       < Edit Anchor Jump >"
 S DDBSANS=$G(@DDBSAN@("H",DDBSANX)),DDBSANR=$G(@DDBSAN@("H",DDBSANX,0))
 S DDBSANCH=$P(DDBSANS,"^",4)
 Q:DDBSAN=""!(DDBSANS="")
AGTR S X(1)=$G(X(1)),X(2)=" "_$E(DDBSANX,1,30)_" >"
 W $$WS^DDBR1(.X)
 D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,44,1,DDBSANCH,100,1,"","KPW",.X)
 K DIR0
 I $E(X)="?" S X(1)="* Enter FILE#;IEN;FIELD;ANCHOR for: "_$E(DDBSANX,1,35)_$S($L(DDBSANX)>35:"...",1:"")_" *" G AGTR
 I DDBSANCH'=X S $P(@DDBSAN@("H",DDBSANX),"^",4)=X
 G OUT
 Q
 ;
TEDIT ; edit hypertext document title
 I 'DDBRHTF!($G(DUZ(0))'["@") Q
 N DDBSAN,DDBSANX,X
 S DDBSAN=$$NROOT^DDBRAP(DDBSA),DDBSANX=$G(@DDBSAN@("TITLE"))
 S X(1)="                       < Edit Hypertext Document Title >"
TGTR S X(1)=$G(X(1)),X(2)=" Title >"
 W $$WS^DDBR1(.X)
 D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,44,1,DDBSANX,100,1,"","KPW",.X)
 K DIR0
 I $E(X)="?" S X(1)="* Enter Document Name for Title *" G TGTR
 I X'="^" D  D RPS^DDBRGE Q
 .S @DDBSAN@("TITLE")=X
 .S DDBPMSG=X,DDBHDR=$$CTXT^DDBR(X,$J("",IOM+1),IOM)
 .Q
 G OUT
 ;
CHKI() ;return 1 if ok 0 not ok to continue also init DDBRHT if undefined
 S DDBRHT=$G(DDBRHT)
 Q:DDBRHT="" 0
 I 'DDBRHTF!($G(DUZ(0))'["@") Q 0
 I $P(DDBRHT,DDGLDEL,4)'=DDBSA Q 0
 I +DDBRHT>DDBL Q 0
 I +DDBRHT<($S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)+1) Q 0
 Q 1
 ;
OUT D PSR^DDBR0() Q
 ;
RA ;Rebuild Anchors
 I 'DDBRHTF!($G(DUZ(0))'["@") Q
 N X,DDBSAN
 S DDBSAN=$$NROOT^DDBRAP(DDBSA)
 S X(1)="",X(2)="                 < Rebuilding Anchor Index for HyperText Jumps >"
 W $$WS^DDBR1(.X)
 D WP^DDBRAP(DDBSA,"",$G(@DDBSAN@("TITLE"),DDBPMSG))
 R X:2
 G OUT

DDBRAHTJ
DDBRAHTJ ;SFISC/DCL-BROWSER HYPERTEXT JUMP ; 18NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
JUMP(DDBRDIR) ; pass direction 1/forward -1/backward
 ;
 ;
 N DDBSAN,DDBRAFLG,DDBLST
 S DDBSAN=$$NROOT^DDBRAP($NA(@DDBSA)),DDBLST=$NA(^TMP("DDBLST",$J))
 I $G(DDBRDIR)=1 D FRWD Q
 D BCK
 Q
FRWD ; forward
 Q:'$$CHKI
 N DDBRAHP,DDBRAHA,DDBSANX,DDBRAAH,DDBRAHL,DDBRSET,DIERM
 S DDBSANX=$P(DDBRHT,DDGLDEL,2),DDBRAAH=$P(DDBSANX,"^"),DDBRSET=1
 ;jump to another root
 I DDBSANX["$CREF$" D  G STKPT:DDBSANX]"" G PS^DDBR2
 .N DDBRAB,DDBRABR,DDBLSTN,DDBRATR,DDBRANRT,DDBRXC2,DDBRXC3
 .S DDBRATR=$P(DDBSANX,"$CREF$",2)
 .S DDBRAAH=$P($P(DDBSANX,"$CREF$",3),"^")
 .I DDBRATR="" S DDBRAAH="" Q
 .I $D(@DDBRATR)'>9,$E($G(@DDBRATR),1,5)="$XC$^" D  Q:$D(@DDBRATR)'>9
 ..N X,DDBRNR
 ..S DDBRXC3=$P(@DDBRATR,"$XC$^",3)
 ..S X(1)="",X(2)=$$CTXT^DDBR("Loading "_DDBRXC3,"",IOM),X(3)=""
 ..W $$WS^DDBR1(.X)
 ..S DDBRXC2=$P(@DDBRATR,"$XC$^",2) X DDBRXC2
 ..I $D(@DDBRATR)'>9 Q
 ..I DDBRXC3]"" D WP^DDBRAP(DDBRATR,"",DDBRXC3)
 ..Q
 .I $D(@DDBRATR)'>9,$E($G(@DDBRATR),1,6)="$XCR$^" D  W @IOSTBM Q
 ..N X,IOTM,IOBM,IOSTBM
 ..S DDBRXC2=$P(@DDBRATR,"$XCR$^",2),DDBSANX="" X DDBRXC2
 ..W:$D(IOF) @IOF
 ..S X=0 X ^DD("OS",DISYS,"RM")
 ..W $P(DDGLVID,DDGLDEL,8)
 ..Q
 .I '$D(@DDBRATR) S DDBRAAH="" Q
 .S DDBRANRT=$$NROOT^DDBRAP(DDBRATR)
 .I '$D(@DDBRANRT) D WP^DDBRAP(DDBRATR)
 .S DDBLSTN=$S($D(@DDBLST@("A",DDBSA)):^(DDBSA),1:$O(@DDBLST@(" "),-1)+1)
 .D SAVEDDB^DDBR2(DDBLST,DDBLSTN,1),SET
 .S DDBRSET=0
 .S DDBRAAH=$P(DDBRAAH,"#",2),DDBRAFLG=1
 .S DDBSA=DDBRATR,DDBSAN=DDBRANRT
UP .S DDBPMSG=$G(@DDBSAN@("TITLE")) S:DDBPMSG="" DDBPMSG=$$UP^DILIBF($P(DDBSANX,"^",$L(DDBSANX,"^"))) ;**
 .D SAVSET
 .Q
 ;jump to another file, w-pDD#,entry:entry#anchor
 I DDBRAAH,DDBRAAH["@" D  G STKPT
 .N DDBRAB,DDBRABR,DDBLSTN,DDBRATR,DDBRANRT
 .S DDBRAB=$P(DDBRAAH,"#")
 .I DDBRAB="" S DDBRAAH="" Q
 .S DDBRATR=$$GETR^DDBRAP($P(DDBRAB,"@"),$P($P(DDBRAB,"@",2),"#"))
 .I DDBRATR="" D  Q
 ..S DDBRAAH=""
 ..I $G(DIERR) S DIERM=$$CTXT^DDBR($G(^TMP("DIERR",$J,+DIERR,"TEXT",1)))
 ..K DIERR,^TMP("DIERR",$J)
 ..Q
 .S DDBRANRT=$$NROOT^DDBRAP(DDBRATR)
 .I '$D(@DDBRANRT) D WP^DDBRAP(DDBRATR)
 .S DDBLSTN=$S($D(@DDBLST@("A",DDBSA)):^(DDBSA),1:$O(@DDBLST@(" "),-1)+1)
 .D SAVEDDB^DDBR2(DDBLST,DDBLSTN,1),SET
 .S DDBRSET=0
 .S DDBRAAH=$P(DDBRAAH,"#",2),DDBRAFLG=1
 .S DDBSA=DDBRATR,DDBSAN=DDBRANRT
 .S DDBPMSG=$G(@DDBSAN@("TITLE")) S:DDBPMSG="" DDBPMSG="HYPERTEXT JUMP ID#"_$O(@DDBLST@("J",""),-1)+1
 .D SAVSET
 .Q
 ;jump to another entry in the same file, same level
 I DDBRAAH["#",$P(DDBRAAH,"#")]"" D
 .N DDBRAB,DDBRABR,DDBRAIEN,DDBLSTN,DDBRALEV,DDBRANRT
 .S DDBRAB=$P(DDBRAAH,"#")
 .I DDBRAB="" S DDBRAAH="" Q
 .S DDBRALEV="",DDBRABR=$$IENROOT^DDBRAP($NA(@DDBSA),.DDBRALEV)
 .S DDBRAIEN=$O(@DDBRABR@("B",DDBRAB,""))
 .I 'DDBRAIEN S DDBRAAH="" Q
 .S DDBRANRT=$$NROOT^DDBRAP($NA(@DDBRABR@(DDBRAIEN,DDBRALEV)))
 .I '$D(@DDBRANRT) D WP^DDBRAP($NA(@DDBRABR@(DDBRAIEN,DDBRALEV)))
 .S DDBLSTN=$S($D(@DDBLST@("A",DDBSA)):^(DDBSA),1:$O(@DDBLST@(" "),-1)+1)
 .D SAVEDDB^DDBR2(DDBLST,DDBLSTN,1),SET
 .S DDBRSET=0
 .S DDBRAAH=$P(DDBRAAH,"#",2),DDBRAFLG=1
 .S DDBSA=$NA(@DDBRABR@(DDBRAIEN,DDBRALEV))
 .S DDBSAN=DDBRANRT
 .S DDBPMSG=$G(@DDBSAN@("TITLE")) S:DDBPMSG="" DDBPMSG="HYPERTEXT JUMP ID#"_$O(@DDBLST@("J",""),-1)+1
 .D SAVSET
 .Q
STKPT S:DDBRAAH["#" DDBRAAH=$P(DDBRAAH,"#",2)
 I DDBRAAH]"" S DDBRAHA=$G(@DDBSAN@("A",DDBRAAH))
 I DDBRSET,$G(DDBRAHA)'>0 D NOHTJ($G(DIERM)) G PS^DDBR2
 S DDBRAHL=$S($G(DDBRAHA):DDBRAHA+DDBSRL-1,1:0)
 D SET:DDBRSET,GOTO Q
 Q
 ;
SET ; set and save jump info
 S DDBRAHP=$O(@DDBLST@("J",""),-1)+1
 S @DDBLST@("J",DDBRAHP)=DDBSA_DDGLDEL_DDBL_"^"_+$G(DDBLSTN)_DDGLDEL_DDBRHT
 Q
 ;
GOTO ; jump to line in current document
 S DDBL=$S(DDBRAHL'>DDBSRL:0,DDBRAHL>DDBTL:DDBTL,1:DDBRAHL) D PSR^DDBR0(+$G(DDBRAFLG))
 Q
BCK ; backward
 Q:'$D(@DDBLST@("J"))
 N DDBX,DDBY,DDBRAFLG
 S DDBX=$O(@DDBLST@("J",""),-1),DDBY=@DDBLST@("J",DDBX)
 K @DDBLST@("J",DDBX)
 I $P(DDBY,DDGLDEL)'=DDBSA D  S DDBRAFLG=1
 .D USAVEDDB^DDBR2(DDBLST,$P($P(DDBY,DDGLDEL,2),"^",2))
 S DDBL=+$P(DDBY,DDGLDEL,2),DDBRHT=$P(DDBY,DDGLDEL,3,255)
 D PSR^DDBR0(+$G(DDBRAFLG))
 Q
CHKI() ;return 1 if ok 0 not ok to continue also init DDBRHT if undefined
 S DDBRHT=$G(DDBRHT)
 Q:DDBRHT="" 0
 I $P(DDBRHT,DDGLDEL,4)'=DDBSA Q 0
 I +DDBRHT>DDBL Q 0
 I +DDBRHT<($S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)+1) Q 0
 Q 1
 ;
NOHTJ(EM) ; no hypertext jump available
 N X,Y
 S Y=$P(DDBSANX,"^",$S(DDBSANX["$CREF$":$L(DDBSANX,"^"),1:2)),X(1)=$$CTXT^DDBR(Y,"",IOM),EM=$G(EM) S:$P(EM,"Error:",2)]"" EM="<< "_$P(EM,"Error:",2)_" >>"
 S X(2)=""
 S X(3)=$$CTXT^DDBR($S(EM]"":EM,1:"<< "_$$EZBLD^DIALOG(7077)_" >>"),"",IOM) ;**NO HYPERTEXT JUMP
 W $$WS^DDBR1(.X),$C(7)
 R X:5
 Q
 ;
SAVSET ;
 S DDBHDR=$$CTXT^DDBR(DDBPMSG,$J("",IOM+1),IOM)
 S DDBTL=$P($G(@DDBSA@(0)),"^",3) S:DDBTL'>0 DDBTL=$O(@DDBSA@(" "),-1)
 S DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1)
 S DDBZN=$D(@DDBSA@(DDBTL,0))#2
 S DDBDM=0
 S DDBSF=1
 S DDBST=IOM
 S DDBC=$NA(^TMP("DDBC","DDBC",$J))
 I '$D(@DDBC) F I=1,22:22:176 S @DDBC@(I)=""
 Q

DDBRAHTR
DDBRAHTR ;SFISC/DCL-BROWSER ANCHOR & HYPERTEXT PROCESSOR REVERSE TAB ;NOV 04, 1996@13:52
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
REVTAB ; Reverse Tab
 S DDBRHT=$G(DDBRHT)
 I $P(DDBRHT,DDGLDEL,4)'=DDBSA S DDBRHT=""
 N LIM,ULCLR,ULNEW
 S LIM=DDBL,ULCLR=DDBRHT'>0,ULNEW=0
PSR ;S DDBL=$S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)
 D SDLR($S(DDBL'>DDBSRL:0,1:DDBL-DDBSRL)+1)
 Q
SDLR(L) N I,J,SFR,STO
 I +DDBRHT<L!(+DDBRHT>LIM) S DDBRHT="",ULCLR=1
 S DX=0,SFR=$P(DDBSY,";",3),STO=$P(DDBSY,";",2),L=L+DDBSRL
 F I=SFR:-1:STO S L=L-1 Q:$S(DDBZN:$D(@DDBSA@(L,0)),1:$D(@DDBSA@(L)))
 S (SFR,DY)=I X IOXY
 F I=SFR:-1:STO D
 .I $D(@DDBSA@(L)) S X=$S(DDBZN:@DDBSA@(L,0),1:@DDBSA@(L)),L=L-1
 .E  Q
 .I ULCLR,ULNEW Q
 .Q:$L(X,"$.%")'>2
 .S WRF=0,J=$P(X,"$.%",$P(DDBRHT,DDGLDEL,3)),X=$$HTD(X,L+1)
 .I +DDBRHT,J=$P(DDBRHT,DDGLDEL,2) S ULCLR=1,WRF=1
 .Q:'WRF
 .S DY=I
 .X IOXY
 .W $P(DDGLCLR,DDGLDEL),X
 .Q
 ;
 I 'ULNEW S DDBRHT=""
 Q
 ;
HTD(X,WPIEN) ;text
 Q:'DDBRHTF $E(X,DDBSF,DDBST)
 Q:$L(X,"$.")'>2 X
 S:$L(X,"$.$")>2 X=$$HT(X,"$.$","","","","","","")
 S:$L(X,"$.%")>2 X=$$HT(X,"$.%",$P(DDGLVID,DDGLDEL),$P(DDGLVID,DDGLDEL,3),(WPIEN'>+DDBRHT!(DDBRHT="")),$S(WPIEN=+DDBRHT:$P(DDBRHT,DDGLDEL,3)-2,1:$L(X,"$.%")-1),$P(DDGLVID,DDGLDEL,4),$P(DDGLVID,DDGLDEL,5))
 Q X
 ;
HT(Y,D,C1,C2,UF,UP,U1,U2) ;
 Q:$L(Y,D)'>2 Y
 N YL,I,Y1
 S YL=$L(Y,D),Y1=""
 F I=1:1:YL D
 .S:I#2 Y1=Y1_$P(Y,D,I)
 .I UF,I=UP,'ULNEW D  Q
 ..S Y1=Y1_C1_U1_$P($P(Y,D,I),"^",$S($P(Y,D,I)["$CREF$":$L($P(Y,D,I),"^"),1:2),255)_U2_C2,ULNEW=1,WRF=1
 ..S DDBRHT=WPIEN_DDGLDEL_$P(Y,D,I)_DDGLDEL_I_DDGLDEL_DDBSA
 .S:'(I#2) Y1=Y1_C1_$P($P(Y,D,I),"^",$S($P(Y,D,I)["$CREF$":$L($P(Y,D,I),"^"),1:2),255)_C2
 .Q
 Q Y1

DDBRAP
DDBRAP ;SFISC/DCL-BROWSER WP ANCHOR PROCESSOR ;06:56 PM  31 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
WP(DDBROOT,DDBRFLG,DDBRTLE) ;
 ;Pass existing wp root, flag=c/clear all -indexes, title
 I $G(DDBROOT)="" Q
 I '$D(@DDBROOT) Q
 S DDBROOT=$NA(@DDBROOT),DDBRFLG=$G(DDBRFLG),DDBRTLE=$G(DDBRTLE)
 N DDBRINDX,DDBRSUB,DDBRSUBL,DDBNROOT,DDBSROOT,DDBAXRT,DDBRCHK,DDBRCHK1
 N DDBRSX,DDBRSXL,DDBRI,DDBRSXP,DDBRX,DDBRTLER
 S DDBRINDX=0,DDBNROOT=$$NROOT(DDBROOT),DDBAXRT=$NA(@DDBNROOT@("A")),DDBRCHK1=0
 Q:DDBNROOT=""!(DDBAXRT="")
 K @DDBAXRT
 F  S DDBRINDX=$O(@DDBROOT@(DDBRINDX)),DDBRCHK=1 Q:DDBRINDX'>0  D:$L($G(@DDBROOT@(DDBRINDX,0)),"$.$")>1  I DDBRCHK,$L($G(@DDBROOT@(DDBRINDX)),"$.$")>1 S DDBRCHK1=1 D
 .S DDBRCHK=0
 .I DDBRCHK1 S DDBRSX=@DDBROOT@(DDBRINDX),DDBRSXL=$L(DDBRSX,"$.$")
 .E  S DDBRSX=@DDBROOT@(DDBRINDX,0),DDBRSXL=$L(DDBRSX,"$.$")
 .F DDBRI=2:2:DDBRSXL S DDBRSXP=$P(DDBRSX,"$.$",DDBRI) S:'$D(@DDBAXRT@(DDBRSXP)) @DDBAXRT@(DDBRSXP)=DDBRINDX
 .Q
 S DDBRX=""
 I DDBRTLE]"" D
 .I '$D(@DDBNROOT@("TITLE")) S @DDBNROOT@("TITLE")=DDBRTLE
 .Q
 I $G(@DDBNROOT@("TITLE"))']"" D
 .Q:$$QL(DDBROOT)'>1
 .S DDBRTLER=$NA(@DDBROOT,$$QL(DDBROOT)-1)
 .S DDBRTLE=$P($G(@DDBRTLER@(0)),"^")
 .I DDBRTLE]"" S @DDBNROOT@("TITLE")=DDBRTLE Q
 .Q
 S @DDBNROOT@("DATE")=$H
 Q
 ;
NROOT(DDBROOT) ; *FUNCTION* return new (negative) root for wp field X-REF
 ;Q $NA(@DDBROOT@(.001))  ;tested ok
 Q $NA(@DDBROOT@(-1))  ;tested ok and in use
 ;Q $NA(@DDBROOT@(0,0))  ;tested ok
 ;
BINDEX(DDBROOT,DDBRNR,DDBRNRN) ; *FUNCTION* return "B" index root
 N DDBRSUBL,DDBSROOT
 S DDBRSUBL=$$QL(DDBROOT)
 Q:DDBRSUBL'>1 ""
 S DDBSROOT=$NA(@DDBROOT,(DDBRSUBL-2))
 S DDBRNR=DDBSROOT,DDBRNRN=$$QS(DDBROOT,DDBRSUBL)
 Q $NA(@DDBSROOT@("B"))
 ;
IENROOT(DDBROOT,DDBRLEV) ;pass root,.variable~by reference to return
 ;                                           $qs(ddbroot,$ql(ddbroot))~
 N DDBRSUBL,DDBSROOT
 S DDBRSUBL=$$QL(DDBROOT)
 Q:DDBRSUBL'>1 ""
 S DDBRLEV=$$QS(DDBROOT,DDBRSUBL)
 Q $NA(@DDBROOT,(DDBRSUBL-2))
 ;
EN ;create anchors and jumps on existing wp entry
 N DDBC,DDBFLG,DDBL,DDBPMSG,DDBSA,DDBX,IOTM,IOBM
 I '$$TEST^DDBRT W $C(7),!!,$$EZBLD^DIALOG(830),!! Q  ;**
 D LIST^DDBR3(.DDBX)
 I DDBX'>0 W:DDBX=0 $C(7),!!,$$EZBLD^DIALOG(1404),!! Q  ;**NO TEXT
 S DDBSA=DDBX(6)
 S DDBFLG=DDBX(4)
 S DDBPMSG=DDBX(5)
 W !,"...." ;**
 D WP(DDBSA,$G(DDBRFLG),DDBPMSG)
 W !,"done!",!
 Q
 ;
ENP ;create anchors & jumps and 'P'urge non-referenced jumps
 N DDBRFLG
 S DDBRFLG="P"
 G EN
 ;
ENC ;create anchors and jumps and "C"lear out all jumps prior to building
 N DDBRFLG
 S DDBRFLG="C"
 G EN
 ;
 ; THE FOLLOWING CODE WAS COPIED FROM KERNEL'S XLFUTL ROUTINE
QL(X) ;$QLENGTH OF GLOBAL STRING
 N %,%1
 S %1="" F %=0:1 Q:%1=$NA(@X,%)  S %1=$NA(@X,%)
 Q %-1
 ;
QS(X1,X2) ;$QSUBSCRIPT OF GLOBAL STRING
 N %,%1,Y
 I X2=-1,X1?1"^"1"[".E1"]".E Q $TR($P($P($NA(@X1,0),"]"),"[",2),"""")
 I X2=-1,X1?1"^"1"|".E1"|".E Q $TR($P($NA(@X1,0),"|",2,$L($NA(@X1,0),"|")-1),"""")
 I X2=0,(X1'?1"^"1"[".E)&(X1'?1"^"1"|".E) Q $NA(@X1,X2)
 I X2=0,X1?1"^"1"[".E1"]".E Q "^"_$P($NA(@X1,X2),"]",2,999)
 I X2=0,X1?1"^"1"|".E Q "^"_$P($NA(@X1,X2),"|",$L($NA(@X1,X2),"|"))
 S %1=$NA(@X1,X2-1)
 I $E(%1,$L(%1))=")" S %1=$E(%1,1,$L(%1)-1)
 S Y=$P($NA(@X1,X2),%1,2,999),Y=$E(Y,1,$L(Y)-1)
 I X2=1,$E(Y)="(" S Y=$E(Y,2,999)
 I X2>1,$E(Y)="," S Y=$E(Y,2,999)
 I $A(Y)=34,$A(Y,$L(Y))=34 S Y=$E(Y,2,$L(Y)-1)
 Q Y
 ;
GETR(DDBRWPDD,DDBRENS,DDBRFLG) ;return root
 ;pass Word-processing DD#, entries (external format)[separated by(:)]
 ;ie.999008.02,ENTRYONE:SUBENTRY)
 ;
 N DDBRA,DDBROOT,DDBREL,DDBRLVLS,DDBRI,DDBREN,DDBRIEN,DDBRDA,DDBRX,DDBRDD,DDBREEN,X,Y
 Q:'$$UP^DIQGU(DDBRWPDD,.DDBRA)
 S DDBREL=$L(DDBRENS,":"),DDBRLVLS=$O(DDBRA("")),DDBREN=1,DDBRIEN=","
 I $G(DDBRFLG)'["I",$G(DUZ(0))'="@" D  Q:$G(DIERR) ""
 .N DIFILE,DIAC,%
 .S DIFILE=+DDBRA(DDBRLVLS),DIAC="RD"
 .D ^DIAC
 .Q:%
 .D ERR("Read access denied, for file #"_DIFILE)
 .Q
 I ("-"_DDBREL)'=DDBRLVLS Q ""
 F DDBRI=DDBRLVLS:1:-1 D  Q:$G(DIERR)
 .S DDBRDD=+DDBRA(DDBRI),DDBREEN=$P(DDBRENS,":",DDBREN),DDBREN=DDBREN+1
 .D DA^DILF(DDBRIEN,.DDBRDA)
 .S DDBRIEN=","_+$$DIC($$ROOT^DILFD(DDBRDD,DDBRIEN),DDBREEN,.DDBRDA)_DDBRIEN
 .Q
 I $G(DIERR) K DIERR,^TMP("DIERR",$J) Q ""
 S DDBRX=$$GET^DIQG(+DDBRA(-1),$P(DDBRIEN,",",2,99),$O(^DD(+DDBRA(-1),"SB",+DDBRA(0),"")),"B")
 I $G(DIERR) K DIERR,^TMP("DIERR",$J) Q ""
 Q $P(DDBRX,"$CREF$",2)
 ;
DIC(DIC,X,DA) ;dic call for exaxt match
 Q:DIC=""!(X="") ""
 S DIC(0)="X" S:$E(X)="`" DIC(0)="N"
 D ^DIC
 Q $G(Y)
 ;
ERR(DDBERR) N P S P(1)=DDBERR
 I $G(U)="^" N U S U="^"
 D BLD^DIALOG(1700,.P)
 Q

DDBRGE
DDBRGE ;SFISC/DCL-BROWSE GET/EXECUTE EVENT ;2013-01-22  3:34 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EN N DDBGF
 D GETKEY
 S DDBRPE=0
 W @IOSTBM
 S DDBL=$G(DDBL,0) S:DDBL<0 DDBL=0 S:DDBL>DDBTL DDBL=DDBTL D PSR^DDBR0(1)
 S DX=0,DY=$P(DDBSY,";",3) X IOXY
 X DDGLZOSF("EOFF")
 F  S DDBRE=$$READ D  Q:DDBRE="^"
 .I $T(@DDBRE)="" W $C(7) Q
 .X DDGLZOSF("EON")
 .D @DDBRE
 .I DDBRSA S DDBRSA(DDBRSA,"DDBL")=DDBL
 .S DX=0,DY=$P(DDBSY,";",3) X IOXY
 .S DDBRPE=DDBRE
 .X DDGLZOSF("EOFF")
 X DDGLZOSF("EON")
 I $G(DDBFLG)["H" Q
CLS S DX=0 F DY=$P(DDBSY,";"):1:$P(DDBSY,";",4) X IOXY W $P(DDGLCLR,DDGLDEL)
 I DDBRSA S X=DDBL D
 .N DDBL S DDBL=X
 .D SR^DDBRS(DDBRSA,$S(DDBRSA=2:1,1:2),.DDBRSA)
 .W @IOSTBM
 .S DX=0 F DY=$P(DDBSY,";"):1:$P(DDBSY,";",4) X IOXY W $P(DDGLCLR,DDGLDEL)
 .Q
 I $G(DDBC1),$G(DDBC0)]"" K @DDBC0@(1)
 K ^TMP("DDBC","DDBC",$J)
 S IOTM=1,IOBM=IOSL W @IOSTBM,$P(DDGLVID,DDGLDEL,9)
 D:'$D(DDS) KILL^DDGLIB0($G(DDBFLG))
 S DX=0,DY=IOSL-1 X IOXY
 I DDBSRL+2=IOSL W @IOF
 D:$G(DDBFLG)'["P" KTMP
END Q
KTMP D KTMP^DDBRU
 Q
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
C I Y<0 S Y="TO" Q
 ;I Y=13 S Y="COLR" Q
 S S=""
C1 S S=S_$C(Y)
 I DDBGF("DDBIN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDBGF("DDBIN")'[(U_S_U) Y=-1
 I DDBGF("DDBIN")[(U_S_U),S'=$C(27) S Y=$P(DDBGF("DDBOUT"),U,$L($P(DDBGF("DDBIN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q
GETKEY N AU,AD,AR,AL,F1,F2,F3,F4,I,K,N,T
 N FIND,SELECT,PREVSC,NEXTSC,HELP,KP7,KP8
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S AR=$P(DDGLKEY,U,4)
 S AL=$P(DDGLKEY,U,5)
 S F1=$P(DDGLKEY,U,6)
 S F2=$P(DDGLKEY,U,7)
 S F3=$P(DDGLKEY,U,8)
 S F4=$P(DDGLKEY,U,9)
 S FIND=$P(DDGLKEY,U,10)
 S SELECT=$P(DDGLKEY,U,11)
 S PREVSC=$P(DDGLKEY,U,14)
 S NEXTSC=$P(DDGLKEY,U,15)
 S HELP=$P(DDGLKEY,U,16)
 S KP7=$P(DDGLKEY,U,25)
 S KP8=$P(DDGLKEY,U,26)
 F N="DDB" D
 . S DDBGF(N_"IN")="",DDBGF(N_"OUT")=""
 . F I=1:1 S T=$P($T(@(N_"MAP")+I),";;",2,999) Q:T=""  D
 .. S @("K="_$P(T,";",2))
 .. I DDBGF(N_"IN")'[(U_K) D
 ... S DDBGF(N_"IN")=DDBGF(N_"IN")_U_K
 ... S DDBGF(N_"OUT")=DDBGF(N_"OUT")_$P(T,";")_U
 . S DDBGF(N_"IN")=DDBGF(N_"IN")_U
 . S DDBGF(N_"OUT")=$E(DDBGF(N_"OUT"),1,$L(DDBGF(N_"OUT"))-1)
 Q
TO S DDBRE="^" Q
HELP D HELP^DDBR1 Q
HELPS D HELPS^DDBR1 Q
RETURN D SWITCH^DDBR2("","R") Q
SWITCH D SWITCH^DDBR2() Q
RPS I 'DDBRSA D PSR^DDBR0(1) Q
 N DDBRNI F DDBRNI=1,2 D
 .I DDBRSA=2 D SR^DDBRS(2,1,.DDBRSA) W @IOSTBM D PSR^DDBR0(1) Q
 .I DDBRSA=1 S DDBL=DDBRSA(DDBRSA,"DDBL") D SR^DDBRS(1,2,.DDBRSA) W @IOSTBM D PSR^DDBR0(1) Q
 .Q
 Q
PRINT ;Print document
 N DX,DY,X
 S DX=0,DY=$P(DDBSY,";"),X=$$CTXT^DDBR("PRINT DOCUMENT",$J("",IOM+1),IOM)
 X IOXY
 W $P(DDGLVID,DDGLDEL,6)  ;rvon
 W $P(DDGLVID,DDGLDEL,4)  ;uon
 W X
 W $P(DDGLVID,DDGLDEL,10)  ;rvoff
 F DY=$P(DDBSY,";",2):1:$P(DDBSY,";",4) X IOXY W $P(DDGLCLR,DDGLDEL)
 W $P(DDGLVID,DDGLDEL,6)  ;rvon
 W $P(DDGLVID,DDGLDEL,4)  ;uon
 W X
 W $P(DDGLVID,DDGLDEL,10)  ;rvoff
 W @IOSTBM
 S DY=$P(DDBSY,";",2)
 X IOXY
 D PT^DDGLIBP(DDBSA,DDBPMSG),RPS
 Q
NEXT D NOOF^DDBR1 Q
FIND D FIND^DDBR1 Q
GOTO D GOTO^DDBR1 Q
BOT D BOT^DDBR0 Q
TOP D TOP^DDBR0 Q
PD D PD^DDBR0 Q
PU D PU^DDBR0 Q
QUIT ;
EXIT D EXIT^DDBR0 Q
COLR D RR^DDBR0 Q
COLL D RL^DDBR0 Q
COLRE D RRE^DDBR0 Q
COLLE D RLE^DDBR0 Q
COLJ D COLJ^DDBR0 Q
LND D LD^DDBR0 Q
LNU D LU^DDBR0 Q
HU D CHDR^DDBR4(-1) Q
HD D CHDR^DDBR4(1) Q
PH D PRTHELP^DDBRP Q
STPB D STPB^DDBRWB Q
VIEW D VIEW^DDBRWB Q
AHT I DDBRHTF D TAB^DDBRAHT Q
 G BQT
AHTR I DDBRHTF D REVTAB^DDBRAHTR Q
 G BQT
TEHT I DDBRHTF D TEDIT^DDBRAHTE Q
 G BQT
RA I DDBRHTF D RA^DDBRAHTE Q
 G BQT
SCRN1 I DDBRSA=2 D SR^DDBRS(2,1,.DDBRSA) W @IOSTBM G RPS
 G BQT
SCRN2 I DDBRSA=1 D SR^DDBRS(1,2,.DDBRSA) W @IOSTBM G RPS
 G BQT
SPLIT I 'DDBRSA,$D(DDBRSA(1)) D SPLIT^DDBRS Q
 G BQT
FULL I DDBRSA D FULL^DDBRS(.DDBRSA) Q
 G BQT
RESIZU I DDBRSA,(DDBRSA(1,"IOBM")-1)>(DDBRSA(0,"IOTM")+2) S DDBRSA(1,"IOBM")=DDBRSA(1,"IOBM")-1,DDBRSA(2,"IOTM")=DDBRSA(2,"IOTM")-1 D 2,1,ENTB^DDBRS(.DDBRSA,-1) G RPS
 G BQT
RESIZD I DDBRSA,(DDBRSA(2,"IOTM")+1)<(DDBRSA(0,"IOBM")-2) S DDBRSA(1,"IOBM")=DDBRSA(1,"IOBM")+1,DDBRSA(2,"IOTM")=DDBRSA(2,"IOTM")+1 D 1,2,ENTB^DDBRS(.DDBRSA,+1) G RPS
 G BQT
BQT W $C(7)
 Q
1 S DX=0,DY=$P(DDBRSA(1,"DDBSY"),";",4) X IOXY W $P(DDGLCLR,DDGLDEL) Q
2 S DX=0,DY=$P(DDBRSA(2,"DDBSY"),";") X IOXY W $P(DDGLCLR,DDGLDEL) Q
DDBMAP ; (CTRL+E ($C(5)) added by VEN/SMH for Fileman V22.2
 ;;LNU;AU;
 ;;LND;AD;
 ;;COLR;AR;
 ;;COLL;AL;
 ;;EXIT;F1_"E";
 ;;QUIT;F1_"Q";
 ;;QUIT;$C(5);
 ;;PU;F1_AU;
 ;;PU;PREVSC;
 ;;PD;F1_AD;
 ;;PD;NEXTSC;
 ;;COLRE;F1_AR;
 ;;COLLE;F1_AL;
 ;;STPB;F1_"C";
 ;;VIEW;F1_"V";
 ;;TOP;F1_"T";
 ;;BOT;F1_"B";
 ;;GOTO;F1_"G";
 ;;FIND;F1_"F";
 ;;FIND;FIND;
 ;;NEXT;"N";
 ;;NEXT;F1_"N";
 ;;RPS;F1_"P";
 ;;SWITCH;F1_"S";
 ;;SWITCH;SELECT;
 ;;RETURN;"R";
 ;;HELP;F1_"H";
 ;;HELP;"HELP";
 ;;HELPS;F1_F1_"H";
 ;;EXIT;"EXIT";
 ;;SCRN1;F2_AU;
 ;;SCRN2;F2_AD;
 ;;SPLIT;F2_"S";
 ;;FULL;F2_"F";
 ;;RESIZU;F2_F2_AU;
 ;;RESIZD;F2_F2_AD;
 ;;HU;F1_F1_AU;
 ;;HD;F1_F1_AD;
 ;;PH;F1_F1_F1_"H";
 ;;STPB;F1_F1_"C";
 ;;AHT;$C(9);
 ;;AHTR;"Q";
 ;;TEHT;F4_"T";
 ;;RA;F4_"A";
 ;;COLR;$C(13);
 ;;PRINT;F1_F1_"P";

DDBRP
DDBRP ;SFISC/DCL-BROWSER PRINT UTILITY ; 30NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; 
PRTHELP ; Print Help
 ;
 N DDGLI,DDGLHN1,DDGLHN2
 S (DDGLHN1,DDGLHN2)=$S(DDBRHTF:9202,1:9201)
 ;
BRM ;Clear scroll region, title bar and
 N DX,DY,X
 S DX=0,DY=$P(DDBSY,";"),X=$$CTXT^DDBR($$EZBLD^DIALOG(7076.4),$J("",IOM+1),IOM) ;**'PRINT BROWSER HELP'
 X IOXY
 W $P(DDGLVID,DDGLDEL,6)  ;rvon
 W $P(DDGLVID,DDGLDEL,4)  ;uon
 W X
 W $P(DDGLVID,DDGLDEL,10)  ;rvoff
 F DY=$P(DDBSY,";",2):1:$P(DDBSY,";",4) X IOXY W $P(DDGLCLR,DDGLDEL)
 W $P(DDGLVID,DDGLDEL,6)  ;rvon
 W $P(DDGLVID,DDGLDEL,4)  ;uon
 W X
 W $P(DDGLVID,DDGLDEL,10)  ;rvoff
 W @IOSTBM
 S DY=$P(DDBSY,";",2)
 X IOXY
 ;
 ;Reset for Roll/Scroll mode
 S X=$G(IOM,80) X ^DD("OS",DISYS,"RM")
 W $P(DDGLVID,DDGLDEL,9)
 ;
 N POP,XQH
 N IOF,IOSL,DDBUC,DDBLC,DDBRZIS
 N %,%A,%B,%B1,%B2,%B3,%BA,%C,%E,%G,%H,%I,%J,%K,%M,%N
 N %P,%S,%T,%W,%X,%Y,%XX,%YY
 N %A0,%D1,%D2,%DT,%J1,%W0
 ;
DEVICE ;
 ; Save $R, otherwise, it becomes ^%ZTSK in standalone-FM. Fails in DIALOG which saves ^(0)
 ; ^(0) doesn't exist, and it fails on both GT.M and Cache.
 N DINAKED S DINAKED=$NA(^(0))
 S %ZIS=$S($D(^%ZTSK):"Q",1:""),%ZIS("B")=""
 S %ZIS("S")="I $$UP^DILIBF($P(^(0),U))'[""BROWSE"",$E($$GET1^DIQ(3.5,Y,""SUBTYPE""))=""P""" ;**
 S IOF="#",IOSL=DDBSRL
 D ^%ZIS
 K %ZIS
 ;
 ; Restore $R for DIALOG call.
 D:DINAKED]""
 .I DINAKED["(" Q:$O(@(DINAKED))  Q
 .I $D(@(DINAKED))
 ;
 I POP D
 .W !!,$$EZBLD^DIALOG(1901) ;**REPORT CANCELLED
 .H 2
 ;
 ;Queue report
 ;
 E  I $D(IO("Q")),$D(^%ZTSK) D
 .S ZTRTN="PRINTHLP^DDBRP"
 .S ZTDESC="Browser help printout."
 .N I F I="DDGLHN1","DDGLHN2" S ZTSAVE(I)=""
 .D ^%ZTLOAD
 .;
 .; Restore $R again
 .D:DINAKED]""
 ..I DINAKED["(" Q:$O(@(DINAKED))  Q
 ..I $D(@(DINAKED))
 .;
 .; Done with DINAKED
 .K DINAKED
 .;
QUEUED .I $D(ZTSK)#2 W !,$$EZBLD^DIALOG(8161,ZTSK),! ;**
 .E  W !,$$EZBLD^DIALOG(1901),! ;**REPORT CANCELLED
 .K ZTSK
 .S IOP="HOME" D ^%ZIS
 ;
 E  I $E(IOST,1,2)="C-" D
 .W !,$C(7)_$$EZBLD^DIALOG(7076.3),! ;**NOT ON CRT
 .H 2
 ;
 ;Non-queued report
 E  D
 .W !,"..." ;**
 .U IO
 .D PRINTHLP
 .X $G(^%ZIS("C"))
 ;
 ;Reset for Screen Mode
 S X=0 X ^DD("OS",DISYS,"RM")
 W $P(DDGLVID,DDGLDEL,8)
 ;
 ;Repaint help screen
 D RPS^DDBRGE
 Q
 ;
PRINTHLP ;
 ;
 N DDGLJ,DDGLL,DDGLP
 F DDGLI=DDGLHN1:1:DDGLHN2 D
 . I DDGLI'=DDGLHN1 D
 .. I $Y+$O(^DI(.84,DDGLI,2," "),-1)+2'<IOSL W @IOF
 .. E  W !!
 . S DDGLJ=0
 . F  S DDGLJ=$O(^DI(.84,DDGLI,2,DDGLJ)) Q:'DDGLJ  D
 .. S DDGLL=$G(^DI(.84,DDGLI,2,DDGLJ,0))
 .. F  Q:DDGLL'["\"  D
 ... S DDGLP=$F(DDGLL,"\") Q:$E(DDGLL,DDGLP)="\"
 ... S $E(DDGLL,DDGLP-1,DDGLP)=""
 .. W !,DDGLL
 ;
 S:$D(ZTQUEUED) ZTREQ="@"
 Q

DDBRS
DDBRS ;SFISC/DCL-SET UP SPLIT SCREEN ;NOV 04, 1996@13:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
TB(IOTM,IOBM,TA) ;Set Top and Bottom Margins in Target Array
 ;pass IOTM, IOBM and TA all by reference **
 N I,X
 I (((IOBM-IOTM)+1)#2) S IOBM=IOBM-1
 S TA(0,"IOTM")=IOTM
 S TA(0,"IOBM")=IOBM
ETA S X=((IOBM+1)-(IOTM-1)\2)-2
 S TA(1,"IOTM")=IOTM
 S TA(1,"IOBM")=IOTM+X
 S TA(2,"IOBM")=IOBM
 S TA(2,"IOTM")=IOBM-X
ETB D
 .N IOTM,IOBM
 .F I=+$G(I):1:2 S IOTM=TA(I,"IOTM"),IOBM=TA(I,"IOBM") D
 ..S TA(I,"DDBSY")=(IOTM-2)_";"_(IOTM-1)_";"_(IOBM-1)_";"_(IOBM)
 ..S TA(I,"DDBSRL")=(IOBM-IOTM)+1
 ..Q
 .Q
 Q
 ;
ENTB(TA,DDBLD) ;called to reset DDBSY and DDBSRL for resizing split screen
 ;TA PASSED BY REFERENCE
 N I
 S I=1
 D ETB
 F I=1,2 S TA(I,"DDBTPG")=TA(I,"DDBTL")\TA(I,"DDBSRL")+(TA(I,"DDBTL")#TA(I,"DDBSRL")'<1)
 F I="DDBTPG","DDBSY","DDBSRL" S @I=TA(TA,I)
 I DDBLD<0 S TA(1,"DDBL")=TA(1,"DDBL")-$S(TA(1,"DDBL")>0:1,1:0) Q
 S TA(1,"DDBL")=TA(1,"DDBL")+$S(TA(1,"DDBL")<TA(1,"DDBTL"):1,1:0) Q
 Q
 ;
INIT(SUB,TA) ;Finish saving variables for TA pass TA by reference **
 N I G:$G(SUB)]"" SUB
 F SUB=1,2 D SUB
 Q
SUB F I="DDBSRL","DDBHDR","DDBHDRC","DDBTL","DDBSA","DDBSF","DDBST","DDBZN","DDBDM","DDBC","DDBPSA","DDBRPE","DDBPMSG","DDBTPG" S TA(SUB,I)=@I
 S TA(SUB,"DDBL")=+$G(DDBL)
 Q
 ;
SR(X,Y,ARRAY) ;Save, Restore, Array - Pass Array by reference **
 D INIT(X,.ARRAY)
 S X=""
 F  S X=$O(ARRAY(Y,X)) Q:X=""  S @X=ARRAY(Y,X)
 S ARRAY=Y  ;* * active array * *
 Q
 ;
FULL(TA) ;Full Screen
 ;TA passed by reference
 I TA=1 S DDBL=DDBL+(DDBSRL+2)
 N I,X
 F I="IOBM","IOTM","DDBSY","DDBSRL" S @I=TA(0,I)
 S DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1)
 S I=1 D ETA
 W @IOSTBM
 S TA=0  ;* * active array * *
 S DDBL=$G(DDBL,0) S:DDBL<0 DDBL=0 S:DDBL>DDBTL DDBL=DDBTL
 D PSR^DDBR0(1)
 Q
 ;
SPLIT ;Split Screen
 N I
 F I="IOBM","IOTM","DDBSY","DDBSRL" S @I=DDBRSA(2,I)
 S DDBTPG=DDBTL\DDBSRL+(DDBTL#DDBSRL'<1)
 S I=1
 D INIT("",.DDBRSA)
 W @IOSTBM
 S DDBL=$G(DDBL,0) S:DDBL<0 DDBL=0 S:DDBL>DDBTL DDBL=DDBTL
 D PSR^DDBR0(1)
 D SR(2,1,.DDBRSA)
 W @IOSTBM
 S DDBL=DDBL-(DDBSRL+2),DDBRSA(1,"DDBL")=DDBL
 S DDBL=$G(DDBL,0) S:DDBL<0 DDBL=0 S:DDBL>DDBTL DDBL=DDBTL
 D PSR^DDBR0(1)
 Q
 ;
 ;;NOTE: DDBRSA=0 - full screen
 ;;      DDBRSA=1 - top of split screen
 ;;      DDBRSA=2 - bottom of split screen

DDBRT
DDBRT ;SFISC/DCL-BROWSER TEST ROUTINE ;NOV 04, 1996@13:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
TEST() ;TEST IF CRT CAN USE BROWSER;USER MUST GO THRU ZU OR XUP FIRST
 Q:$G(IOST(0)) $$GET(+IOST(0))
 Q:$G(IOS) $$GET($$GET1^DIQ(3.5,+IOS,"SUBTYPE","I"))
 Q:$G(^XUTL("XQ",$J,"IOST(0)")) $$GET(+^("IOST(0)"))
 Q:$G(^XUTL("XQ",$J,"IOS")) $$GET($$GET1^DIQ(3.5,+^("IOS"),"SUBTYPE","I"))
 Q 0
GET(DDBRTIEN) ;
 I $$GET1^DIQ(3.2,DDBRTIEN,"SET TOP & BOTTOM MARGINS")="" Q 0
 I $$GET1^DIQ(3.2,DDBRTIEN,"REVERSE INDEX")="" Q 0
 Q 1

DDBRU
DDBRU ;SFISC/DCL-BROWSER UTILITIES AND EXTRINSIC FUNCTIONS ; 19JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CTRLCH() ;Extrinsic function - returns control characters 1-31
 N I,X S X="" N I F I=1:1:31 S X=X_$C(I)
 Q X
 ;
COL(DDBC) ;Set up colums used by Fileman Print Set DIOEND="D COL^DDBRU()" when calling Browser
 N H,I,P,Q,T,X
 S DDBC=$G(DDBC,"^TMP(""DDBC"",$J)")
 I $D(^TMP("DDBC",$J)) K ^($J)
 S X=0 F  S X=$O(^UTILITY($J,99,X)) Q:X'>0  S T=^(X) D
 .S:T["D ^" H=$P(T,"^",2)
 .S Q=$L(T,"?") I Q>1 F I=1:1:Q S P=+$P(T,"?",I)+1 S @DDBC@(P)=""
 .Q
 I $G(H)]""  F X=1:1 S T=$T(@"HEAD"+X^@H) Q:T=""  D
 .S Q=$L(T,"?") I Q>1 F I=1:1:Q S P=+$P(T,"?",I)+1 S @DDBC@(P)=""
 .Q
 Q
 ;
KTMP K ^TMP("DDB",$J),^TMP("DDBC",$J)
 K ^TMP("DDBLST",$J)
 Q
 ;
TRMERR(DDGLCH) ;Terminal type errors
 N P
 S P(1)=DDGLCH,P(2)=IOST
 D BLD^DIALOG(842,.P)
 Q
 ;
RTN(RTN,TMPGBL) ;
 N I,F,X
 F I=1:1 S X=$T(+I^@RTN) Q:X=""  S F=$F(X," ")-1,$E(X,F)=$E("        ",1,$S(F'>8:8-F,1:1)),@TMPGBL@(I)=$TR(X,$C(9)," ")
 Q
 ;
RTNTB(DDBRTOP,DDBRBOT) ;PASS TOP AND BOTTOM MARGINS
 G DR
 ;
ENDR N DDBENDR S DDBENDR=1
 ;
DR ;Display Routine(s)
 D:'$D(DISYS) OS^DII
 N DESC,RN,RSA,RTN,X,Y
 K ^TMP($J,"DDBDR"),^TMP($J,"DDBDRL"),^UTILITY($J)  ;DR LIST
 X ^DD("OS",DISYS,"RSEL") Q:$O(^UTILITY($J,""))']""
 S RTN=" ",RN=1 F  S RTN=$O(^UTILITY($J,RTN)) Q:RTN=""  D  ; VEN/SMH - Make starting point " " for RTN so it won't crash on Cache
 .S DESC=$P($P($T(+1^@RTN),";",2),"-",2),DESC=$S($L(DESC)>45:$E(DESC,1,45)_"...",1:DESC)
 .S RSA=$NA(^TMP($J,"DDBDR",RN)),RN=RN+1,^TMP($J,"DDBDRL",RTN_$E("        ",1,8-$L(RTN))_": "_DESC)=RSA
 .W !,"...loading ",RTN
 .D RTN^DDBRU(RTN,RSA)
 .Q
 W !,"...building ""Current List"" tables"
 D DOCLIST^DDBR("^TMP($J,""DDBDRL"")","",$G(DDBRTOP),$G(DDBRBOT))
K K ^TMP($J,"DDBDRL"),^TMP($J,"DDBDR"),^UTILITY($J)
 Q
 ;
OUT ;
 D:'$D(DDS) KILL^DDGLIB0($G(DDBFLG))
 D:$G(DDBFLG)'["P" KTMP
 Q
 ;
RE(DDBRTN) G EDIT
RTNEDIT N DDBRTN
EDIT ;ROUTINE EDIT VIA VA FILEMAN SCREEN EDITOR
 ;EITHER PASS ROUTINE NAME RE^DDBRU("ROUTINE_NAME") OR USE
 ;RTNEDIT^DDBRU AND BE PROMPTED FOR ROUTINE NAME
 I '$D(^DD("OS",^DD("OS"),"ZS")) W !,"ROUTINE SAVE NODE NOT DEFINED IN MUMPS OPERATING SYSTEM FILE",! Q
 N DDBRI,DDBRX,X,Y,%,%X,%Y
 I $G(DDBRTN)]"" S X=DDBRTN X ^DD("OS",^DD("OS"),18) I '$T W !,DDBRTN," Invalid",!
 X ^DD("OS",^DD("OS"),"EON")
 R:$G(DDBRTN)="" !,"Enter Routine> ",DDBRTN:DTIME
 I DDBRTN="" W !,"NO ROUTINE SELECTED",! Q
 S X=DDBRTN X ^DD("OS",^DD("OS"),18)
 I '$T W !,"NO SUCH ROUTINE",! Q
 K ^TMP("DDBRTN",$J)
 W !,"Loading ",DDBRTN
 F DDBRI=1:1 S DDBRX=$T(+DDBRI^@DDBRTN) Q:DDBRX=""  S ^TMP("DDBRTN",$J,DDBRI)=$$SP(DDBRX)
 D EDIT^DDW("^TMP(""DDBRTN"",$J)","M",DDBRTN,"Routine: "_DDBRTN)
 K ^UTILITY($J,0)
 S DDBRI=0,$P(^TMP("DDBRTN",$J,1),";",3)=$$NOW
 F  S DDBRI=$O(^TMP("DDBRTN",$J,DDBRI)) Q:DDBRI'>0  S ^UTILITY($J,0,DDBRI)=$$TAB(^(DDBRI))
 S X=DDBRTN
 X ^DD("OS",^DD("OS"),"ZS")
 K ^TMP("DDBRTN",$J),^UTILITY($J,0)
 X ^DD("OS",^DD("OS"),"EON")
 Q
TAB(X) ;CONVERT 1ST SPACE TO TAB IF NO TAB
 N E,L,T
 S X=$G(X)
 Q:X="" ""
 S T=$C(9)
 Q:$E(X)=T X
 S L=$L(X)
 F E=1:1:L Q:$E(X,E)=T  I $E(X,E)=" " S $E(X,E)=T D  Q
 .S E=E+1
 .F  Q:$E(X,E)'=" "  S $E(X,E)=""
 .Q
 Q X
 ;
SP(X) ;MAKE SURE A TAB OR 1ST SPACE IS SET TO SPACES
 N E,L,S,SPS,T
 S X=$G(X)
 Q:X="" ""
 S S=8,$P(SPS," ",S)=" ",T=$E(9)
 I $E(X)=T S $E(X)=" "  ;Q "       "_X
 S L=$L(X)
 F E=1:1:L I $E(X,E)=" " D  S $E(X,E)=$E(SPS,1,S-(E#S)) Q
 .S E=E+1
 .F  Q:$E(X,E)'=" "  S $E(X,E)=""
 .S E=E-1
 .Q
 Q X
 ;
NOW() ;
 N %DT,X,Y
 S %DT="T",X="NOW"
 D ^%DT
 Q $$FMTE^DILIBF(Y,"1U")
 ;
MSMCON ;MSM CONSOLE FOR 132/80 MODES
 ;OR VT TERMINALS
80 W $C(27),"[?",3,$C(108)
 S (IOM,X)=80 X ^DD("OS",^DD("OS"),"RM")
 Q
132 W $C(27),"[?",3,$C(104)
 S (IOM,X)=132 X ^DD("OS",^DD("OS"),"RM")
 Q

DDBRU2
DDBRU2 ;SFISC/DCL-BROWSE LOCAL OR GLOBAL ARRAY DDBROOT DESCENDANTS ;2AUG2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
EN N DDBNCC G CNTNU
ROOT(DDBNCC,DDBRTOP,DDBRBOT) ; Browse Array Root Descendants ; DDBNCC node count check (default=1000)
CNTNU K ^TMP("DDBARD",$J),^TMP("DDBARDL",$J)
 ;W !!,"Enter Root> " R DDBROOT W !!
 ;I DDBROOT="^"!(DDBROOT="") Q
 D ARSEL
 I $O(^TMP("DDBARDL",$J,""))']"" Q
 N DDBARDX,N,X
 S DDBARDX="",DDBNCC=$G(DDBNCC,1000)
 F  S DDBARDX=$O(^TMP("DDBARDL",$J,DDBARDX)) Q:DDBARDX=""  S X=^(DDBARDX) D
 .S N=$O(^TMP("DDBARD",$J,""),-1)+1
 .S ^TMP("DDBARDL",$J,DDBARDX)=$NA(^TMP("DDBARD",$J,N))
 .W !,"...loading ",DDBARDX
 .D BLD(DDBNCC,X,N)
 .Q
 W !,"...building ""Current List"" tables"
 D DOCLIST^DDBR("^TMP(""DDBARDL"",$J)","",$G(DDBRTOP),$G(DDBRBOT))
END K ^TMP("DDBARD",$J),^TMP("DDBARDL",$J)
 Q
 ;
BLD(DDBNCC,DDBROOT,DDBN) ;build structures
 N DDBMAXL,DDBR1X
 S DDBMAXL=$G(DDBMAXL,255)
 S DDBNCC=$G(DDBNCC,1000)
 S DDBR1X=$$OREF^DIQGU(DDBROOT)
 N DDBR1,DDBR1A,DDBR1B,DDBR1I,DDBR1Q,DDBI,DDBII,DDBX,DDBX1,DDBX1L,DDBX2,DDBX2L,DDBX3,DDBX3L,DDBXT
 S DDBR1A=$$OREF^DIQGU($NA(@$$CREF^DIQGU(DDBR1X))),DDBR1Q=""""""
 I $L(DDBR1A,",")>1,$P(DDBR1A,",",$L(DDBR1A,","))]"" S DDBR1Q=$P(DDBR1A,",",$L(DDBR1A,",")),$P(DDBR1A,",",$L(DDBR1A,","))=""
 S DDBR1=DDBR1A_DDBR1Q_")",DDBR1B=$L(DDBR1A)+1,DDBX2=" = ",DDBX2L=$L(DDBX2),DDBII=0
 F DDBI=1:1 S DDBR1=$Q(@DDBR1) Q:$P(DDBR1,DDBR1A)]""!(DDBR1="")  D  Q:DDBII
 .I '(DDBI#DDBNCC) D
 ..W $C(7),!,DDBROOT,!,"Node count: ",DDBI,!!,"Do you wish to continue //Yes  "
 ..R DDBX:$G(DTIME,300) W !!
 ..I DDBX=""!($TR($E(DDBX),"y","Y")="Y") Q
 ..S DDBII=1
 ..Q
 .S DDBX1=DDBR1
 .S DDBX3=@DDBR1
 .S DDBX1L=$L(DDBX1),DDBX3L=$L(DDBX3)
 .S DDBXT=DDBX1L+DDBX2L+DDBX3L
 .I DDBXT'>DDBMAXL S ^TMP("DDBARD",$J,DDBN,DDBI)=DDBX1_DDBX2_DDBX3 Q
 .I DDBX1L+DDBX2L'>DDBMAXL D  Q
 ..S ^TMP("DDBARD",$J,DDBN,DDBI)=DDBX1_DDBX2_$E(DDBX3,1,DDBMAXL-(DDBX1L+DDBX2L))
 ..S DDBI=DDBI+1
 ..S ^TMP("DDBARD",$J,DDBN,DDBI)=$E(DDBX3,(DDBMAXL-(DDBX1L+DDBX2L)+1),DDBMAXL)
 ..Q
 .Q
 Q
 ;
ARSEL ; Array Root Select
 N DDBERR,DDBRLVD,X,Y
 W !!
SEL R !,"Select Root> ",X:$G(DTIME,300)
 I X="" Q
 I X="^" K ^TMP("DDBARDL",$J) Q
 I $E(X)="?" D HLP G SEL
 I X="^TMP"!(X="^TMP(")!($E(X,1,14)="^TMP(""DDBARDL""") D HLP G SEL
 S Y=$$OREF^DIQGU(X),DDBERR=0,Y=$$R(Y) I DDBERR W $C(7),"  ...INVALID",!!,"'",X,"' CAN NOT BE RESOLVED",! G SEL
 S DDBRLVD=$$CREF^DIQGU(Y)
 S Y=$$CREF^DIQGU(X)
 I $D(@Y)'>9 S Y=$X W $C(7),"  ...INVALID",!!,"'",X,"' HAS NO DESCENDANTS",! G SEL
 I DDBRLVD'=Y S X=X_" ["_DDBRLVD_"]"
 S ^TMP("DDBARDL",$J,X_" | DESCENDANTS |")=Y
 G SEL
 ;
HLP ;
 W !!,"Enter a valid local or global array root"
 W !,"Can not be ^TMP, ^TMP( or ^TMP(""DDBARDL""",!
 Q
 ;
R(%R) ;
 N %C,%F,%G,%I,%R1,%R2
 S %R1=$P(%R,"(")_"("
 I $E(%R1)="^" S %R2=$E($P(%R1,"("),2,99) D  Q:$G(DDBERR) %R
 .I $L(%R2)'>0 S DDBERR=1 Q
 .I %R2="%" Q
 .I $E(%R2)="%" D  Q
 ..I $E(%R2,2,99)?.E1P.E S DDBERR=1 Q
 ..Q
 .I %R2?1N.E S DDBERR=1 Q
 .I %R2?.E1P.E S DDBERR=1 Q
 .Q
 .;I %R2'="%"&(%R2'?.A) S DDBERR=1 Q %R
 I $E(%R1)'="^" S %R2=$P(%R1,"(") D  Q:$G(DDBERR) %R
 .I $L(%R2)'>0 S DDBERR=1 Q
 .I %R2="%" Q
 .I $E(%R2)="%" D  Q
 ..I $E(%R2,2,99)?.E1P.E S DDBERR=1 Q
 ..Q
 .I %R2?1N.E S DDBERR=1 Q
 .I %R2?.E1P.E S DDBERR=1 Q
 .Q
 .;,$E(%R1)'="%",$E(%R1)'?.A S DDBERR=1 Q %R
 I $E(%R1)="^" S %R2=$P($Q(@(%R1_""""")")),"(")_"(" S:$P(%R2,"(")]"" %R1=%R2
 S %R2=$P($E(%R,1,($L(%R)-($E(%R,$L(%R))=")"))),"(",2,99)
 S %C=$L(%R2,","),%F=1 F %I=1:1 Q:%I'<%C  S %G=$P(%R2,",",%F,%I) Q:%G=""  I ($L(%G,"(")=$L(%G,")")&($L(%G,"""")#2))!(($L(%G,"""")#2)&($E(%G)="""")&($E(%G,$L(%G))="""")) D
 .S %G=$$S(%G),$P(%R2,",",%F,%I)=%G,%F=%F+$L(%G,","),%I=%F-1,%C=%C+($L(%G,",")-1)
 .Q
 S:'DDBERR DDBERR=%F'=%C
 Q %R1_%R2
S(%Z) ;
 I $G(%Z)']"" Q ""
 I $E(%Z)'="""",$L(%Z,"E")=2,+$P(%Z,"E")=$P(%Z,"E"),+$P(%Z,"E",2)=$P(%Z,"E",2) Q +%Z
 I +%Z=%Z Q %Z
 I $E(%Z)?1N,+%Z'=%Z S DDBERR=1 Q %Z
 I %Z="""""" Q ""
 I $E(%Z)="""" Q %Z
 I $E(%Z)'?1A,"%$+@"'[$E(%Z) S DDBERR=1 Q %Z
 I "+$"[$E(%Z) X "S %Z="_%Z Q $$Q(%Z)
 I $D(@%Z) Q $$Q(@%Z)
 S DDBERR=1  ;Unable to resolve a variable within a reference
 Q %Z
Q(%Z) ;
 S %Z(%Z)="",%Z=$Q(%Z("")) Q $E(%Z,4,$L(%Z)-1)

DDBRWB
DDBRWB ;SFISC/DCL-VA FILEMAN BROWSER PROTOCOLS ;01:54 PM  3 Sep 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
STPB ; Save To Paste Buffer
 I DDBSA=$NA(^TMP("DDWB",$J)) D  G PS^DDBR2
 .N X
 .S X(1)="",X(2)=$$CTXT^DDBR($$EZBLD^DIALOG(7078.3),"",IOM) ;**RESTRICTED
 .W $$WS^DDBR1(.X),$C(7)
 .R X:5
 .Q
 I $E(DDBSA,1,11)="^DI(.84,920" D  G PS^DDBR2
 .N X
 .S X(1)="",X(2)=$$CTXT^DDBR($$EZBLD^DIALOG(7078.4),"",IOM) ;**RESTRICTED
 .W $$WS^DDBR1(.X),$C(7)
 .R X:5
 .Q
 N X,XF,XT
GTR S X(1)=$G(X(1)),X(2)=$$EZBLD^DIALOG(7078) ;**COPY TEXT
 W $$WS(.X)
 D  G:X=""!(X=U) OUT
 .D EN^DIR0($P(DDBSY,";",3)-1,$L($G(X(2)))+2,30,1,"",100,1,"","KPW",.X)
 .K DIR0
 .Q
 I $E(X)="?" S X(1)=$$EZBLD^DIALOG(7078.1) G GTR ;**ENTER LINES
 I 'X&($E(X)'="*") G OUT
 I $E(X)="*" S X=$TR(X,"a","A"),XF=1,XT=DDBTL
 E  S X=$TR(X,"a-/;|* ","A:::::"),XF=+X,XT=+$P(X,":",2)
 I XF<1!(XF>DDBTL) S X(1)=$$EZBLD^DIALOG(7078.2,DDBTL) G GTR ;**ERROR
 I XT,XT<1!(XT>DDBTL) S X(1)=$$EZBLD^DIALOG(7078.2,DDBTL) G GTR ;**
 I XT>0,XT<XF S X(1)=$$EZBLD^DIALOG(1511) G GTR ;**FROM LESS THAN TO
 D SAVE(XF,$S(XT'>0:XF,1:XT),X["A")
 K X
 S X(2)="Text Copied to Buffer"
 W $$WS(.X)
 R X:3
 G OUT
 ;
SAVE(FR,TO,APN) ; Save From To (lines) APN=append to end of current list
 K:'APN ^TMP("DDWB",$J)
 N I,II
 S II=$O(^TMP("DDWB",$J,""),-1)+1
 I DDBZN D  Q
 .F I=FR:1:TO S ^TMP("DDWB",$J,II)=@DDBSA@(I,0),II=II+1
 .Q
 F I=FR:1:TO S ^TMP("DDWB",$J,II)=@DDBSA@(I),II=II+1
 Q
VIEW I DDBSA=$NA(^TMP("DDWB",$J)) S DDBL=0 D SDLR^DDBR0(1),RLPIR^DDBR0 Q
 I $E(DDBSA,1,11)="^DI(.84,920" D  G PS^DDBR2
 .N X
 .S X(1)="",X(2)=$$CTXT^DDBR($$EZBLD^DIALOG(7078.5),"",IOM) ;**RESTRICTED
 .W $$WS^DDBR1(.X),$C(7)
 .R X:5
 .Q
 N DDBHA,DDBHAT S DDBHA=$NA(^TMP("DDWB",$J)),DDBHAT=0
 I $D(^TMP("DDWB",$J))'>9 S ^TMP("DDWB",$J,1)="<  No Text  >",DDBHAT=1
 D BROWSE^DDBR(DDBHA,"PNH","View Paste Buffer",$G(DDBHELPS),"",IOTM-1,IOBM+1)
 K:DDBHAT ^TMP("DDWB",$J)
 W @IOSTBM
 D PSR^DDBR0(1)
 Q
 ;
SWITCH ; Switching Restricted while in View
 N X
 S X(1)="",X(2)=$$CTXT^DDBR($$EZBLD^DIALOG(7078.6),"",IOM) ;**RESTRICTED
 W $$WS^DDBR1(.X),$C(7)
 R X:5
 G PS^DDBR2
 ;
OUT D PSR^DDBR0()
 Q
 ;
WS(X) S DX=0,DY=$P(DDBSY,";",3)-3 X IOXY
 W $P(DDGLGRA,DDGLDEL)
 W $TR($J("",IOM)," ",$P(DDGLGRA,DDGLDEL,3))
 W $P(DDGLGRA,DDGLDEL,2)
 W !,$P(DDGLCLR,DDGLDEL),$G(X(1))
 W !,$P(DDGLCLR,DDGLDEL),$G(X(2))
 W !,$P(DDGLCLR,DDGLDEL),$G(X(3))
 S DY=$P(DDBSY,";",3),DX=$L($G(X(2)))+2 X IOXY
 Q ""

DDBRZIS
DDBRZIS ;SFISC/DCL-BROWSER DEVICE UTILITIES ; 18NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
OPEN ;
 ;DDBRZIS AND DDBDMSG ARE KILLED IN POST
 S DDBRZIS=1,DDBDMSG=$G(DDBDMSG)
 U IO(0)
 I $G(DDBDMSG)="" D  Q:DDBDMSG="$$DTOUT$$"
 .N DIR,X,Y
 .S DIR(0)="FUO^0:78",DIR("A")="BROWSER TITLE (optional)"
 .S DIR("B")="VA FileMan Browser"
 .S DIR("?")="Enter any free text, which will appear in the Title Bar"
 .D ^DIR
 .I $G(DTOUT) S DDBDMSG="$$DTOUT$$" K DTOUT,DUOUT,DIRUT,DIROUT Q
 .S DDBDMSG=$S(Y="":DDBDMSG,1:Y)
 .Q
 W !,"...one moment..."
 U IO
 Q:DDBDMSG]""
 I $G(DHD)="W """" D ^DIDH" S DDBDMSG="DATA DICTIONARY" Q
 S DDBDMSG="VA FileMan Browser"
 Q
 ;
CLOSE ;
 Q:$G(DDBDMSG)="$$DTOUT$$"
 S DDBRZIS=$G(DDBRZIS,1)
 N C,CHAR,EOF,X
 K ^TMP("DDB",$J)
 S EOF="EOF-End Of File"
 S CHAR="" F I=1:1:31 S CHAR=CHAR_$C(I)
 U IO W !,EOF,!
 S DDBRZIS("REWIND")=$$REWIND^%ZIS(IO,IOT,IOPAR)
 I 'DDBRZIS("REWIND") S DDBRZIS=0 U IO(0) W $C(7),!!?5,"<< UNABLE TO REWIND FILE>>",! H 3 Q
 U IO
 S C=0
 F  R X:2 Q:X="EOF-End Of File"  D
 .S X=$TR(X,CHAR)
 .S:X']"" X=" "
 .S C=C+1,^TMP("DDB",$J,C)=$E(X,1,255) Q
IHS I C=1,^TMP("DDB",$J,C)=" " S ^TMP("DDB",$J,2)="BROWSER: No display data sent"
 Q
 ;
POST ;
 I $G(DDBDMSG)="$$DTOUT$$" K DDBDMSG,DDBRZIS W $C(7) Q
 I $G(DDBRZIS) D BROWSE^DDBR("^TMP(""DDB"",$J)","NR",$G(DDBDMSG))
 K DDBRZIS,DDBDMSG
 Q
 ;
DEVICE(MSG) ;TEST IF BROWSER IS BEING INVOKED VIA DEVICE HANDLER
 ;EXTRINSIC FUNCTION
 I $D(DDBRZIS)#2,$G(MSG)]"" S DDBDMSG=MSG Q 1
 Q 0
 ;
MSG(TXT) ;PASS TEXT FOR BROWSER TITLE WHEN BROWSER INVOKED VIA DEVICE HANDLER
 ;PROCEDURE CALL
 S DDBDMSG=$G(TXT)
 Q
STR(X) ;  Remove windows
 N I,Y
 I $L(X,"|")'>2 Q X
 I X["|WRAP|"!(X["| NO WRAP|")!(X["|NOWRAP|") S Y="" F I=1:1:$L(X,"|") S:(I#2) Y=Y_$P(X,"|",I)
 Q $S(X'["|":X,1:$G(Y))

DDD
DDD ; GFT/DI* - Build Meta Data Dictionary ;20JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MAKE ;
 N DDD,FLD,Z,I,L,F D DT^DICRW
 I '$D(^DDD(0)) D ^DDDINIT Q:'$D(^DDD(0))
 G AC:$D(^DIC("AC","DDD")) W !,"SINCE NO FILE IS IN APPLICATION GROUP 'DDD',",!,"the entire FileMan database will be scanned, and"
 D OK Q:'$D(%)
 F DDD=1.99:0 S DDD=$O(^DIC(DDD)) Q:'DDD  D BLD
 G END
 ;
AC W !,"Based on all Files identified as belonging to the 'DDD' Application Group," D OK Q:'$D(%)
 F DDD=0:0 S DDD=$O(^DIC("AC","DDD",DDD)) Q:DDD=""  D BLD
END S DIK="^DDD(" D IXALL^DIK W !,"<DONE>" Q
 ;
BLD N FILE S FILE=DDD,F=$P(^DIC(DDD,0),"^")_"_"
FILE W "." F FLD=0:0 S FLD=$O(^DD(FILE,FLD)) Q:'FLD  S I=I+1 D FLD
 I $D(FILE)>9  S FILE=$O(FILE(0)) S F=FILE(FILE) K FILE(FILE) G FILE
DDDA N FN,IEN Q:'$D(^DIC("AC","DDDA",DDD))
 S FN=$$CREF^DILF(^DIC(DDD,0,"GL")),F=$P(^DIC(DDD,0),U)
 F IEN=0:0 S IEN=$O(@FN@(IEN)) Q:'IEN  S L=$P(@FN@(IEN,0),U),I=$O(^DDD("A"),-1)+1,^DDD(I,0)=F_"_"_L_U_L_U_DDD_U_.01_U_1
 Q
 ;
 ;
FLD Q:'$D(^DD(FILE,FLD,0))  S Z=^(0),%=$P(Z,U,2) I % Q:'$D(^DD(+%,.01,0))  S:$P(^(0),U,2)'["W" FILE(+%)=F_$P(Z,U)_"_"
 S ^DDD(I,0)=F_$P(Z,U)_U_$P(Z,U)_U_FILE_U_FLD
 S L=0,^DDD(I,1,0)=""
DESCR I $D(^DD(FILE,FLD,3)),^(3)]"" S L=1,^DDD(I,1,1,0)=^(3)
 F Z=0:0 S Z=$O(^DD(FILE,FLD,21,Z)) Q:'Z  S L=L+1,^DDD(I,1,L,0)=$E(" ",L=2)_^(Z,0)
 I L=0,%["P" S Z=+$P(%,"P",2) I $D(^DD(Z,.01,0)) S %=$P(^(0),U,2) N FILE,FLD S FILE=Z,FLD=.01 D DESCR
 Q
 ;
OK W !,"a Central Data Dictionary will now be compiled.",!?7,"OK"
 S %=2 D YN^DICN I %-1 K % Q
 S I=0
 S ^DDD(0)=$P(^DDD(0),U,1,2)
 N J F J=0:0 S J=$O(^DDD(J)) Q:J=""  K ^(J) ; Kill all nodes including indexes.
 Q
 ;
 ;
 ;
BUILDS(FILE,FIELD) ;BUILDs in which a field appears
 Q:'FILE!'FIELD
 N D,I,J D IJ^DIUTL(FILE) F D=0:0 S D=$O(^XPD(9.6,D)) Q:'D  I $D(^(D,4,J(0),2,FILE,1,FIELD)) N D0 S D0=D,X=$P(^XPD(9.6,D,0),U) X DICMX Q:'$D(D)

DDDIN001
DDDIN001 ; ;14MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(.9)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(.9,0,"GL")
 ;;=^DDD(
 ;;^DIC("B","META DATA DICTIONARY",.9)
 ;;=
 ;;^DD(.9,0)
 ;;=FIELD^^25^6
 ;;^DD(.9,0,"DT")
 ;;=3021101
 ;;^DD(.9,0,"ID","WDI.03")
 ;;=W "    ",$P(^(0),U,3)_",",$P(^(0),U,4)
 ;;^DD(.9,0,"IX","AFF",.9,.03)
 ;;=
 ;;^DD(.9,0,"IX","AFF2",.9,.04)
 ;;=
 ;;^DD(.9,0,"IX","C",.9,.02)
 ;;=
 ;;^DD(.9,0,"NM","META DATA DICTIONARY")
 ;;=
 ;;^DD(.9,.01,0)
 ;;=NAME^RF^^0;1^K:$L(X)>60!($L(X)<3)!'(X'?1P.E) X
 ;;^DD(.9,.01,1,0)
 ;;=^.1
 ;;^DD(.9,.01,3)
 ;;=Answer must be 3-60 characters in length
 ;;^DD(.9,.01,"DT")
 ;;=3021101
 ;;^DD(.9,.02,0)
 ;;=LOOKUP TERM^F^^0;2^K:$L(X)>30!($L(X)<2) X
 ;;^DD(.9,.02,1,0)
 ;;=^.1
 ;;^DD(.9,.02,1,1,0)
 ;;=.9^C
 ;;^DD(.9,.02,1,1,1)
 ;;=S ^DDD("C",$E(X,1,30),DA)=""
 ;;^DD(.9,.02,1,1,2)
 ;;=K ^DDD("C",$E(X,1,30),DA)
 ;;^DD(.9,.02,1,1,"DT")
 ;;=3021101
 ;;^DD(.9,.02,3)
 ;;=Answer must be 2-30 characters in length
 ;;^DD(.9,.02,"DT")
 ;;=3021101
 ;;^DD(.9,.03,0)
 ;;=DATA DICTIONARY NUMBER^NJ22,6^^0;3^K:+X'=X!(X>999999999999999)!(X<0)!(X?.E1"."7.N) X
 ;;^DD(.9,.03,1,0)
 ;;=^.1
 ;;^DD(.9,.03,1,1,0)
 ;;=.9^AFF^MUMPS
 ;;^DD(.9,.03,1,1,1)
 ;;=N Y S Y=$P(^DDD(DA,0),U,4) S:Y ^DDD("AFF",$E(X,1,30),Y,DA)=""
 ;;^DD(.9,.03,1,1,2)
 ;;=N Y S Y=$P(^DDD(DA,0),U,4) K:Y ^DDD("AFF",$E(X,1,30),Y,DA)
 ;;^DD(.9,.03,1,1,3)
 ;;=MULTIPLE CROSS-REF OF FILE,FIELD
 ;;^DD(.9,.03,1,1,"DT")
 ;;=3021101
 ;;^DD(.9,.03,3)
 ;;=Type a number between 0 and 999999999999999
 ;;^DD(.9,.03,"DT")
 ;;=3021101
 ;;^DD(.9,.04,0)
 ;;=FIELD NUMBER^NJ18,6^^0;4^K:+X'=X!(X>99999999999)!(X<.001)!(X?.E1"."7.N) X
 ;;^DD(.9,.04,1,0)
 ;;=^.1
 ;;^DD(.9,.04,1,1,0)
 ;;=.9^AFF2^MUMPS
 ;;^DD(.9,.04,1,1,1)
 ;;=N Y S Y=$P(^DDD(DA,0),U,3) S:Y ^DDD("AFF",Y,$E(X,1,30),DA)=""
 ;;^DD(.9,.04,1,1,2)
 ;;=N Y S Y=$P(^DDD(DA,0),U,3) K:Y ^DDD("AFF",Y,$E(X,1,30),DA)
 ;;^DD(.9,.04,1,1,3)
 ;;=FILE-FIELD XREF
 ;;^DD(.9,.04,1,1,"DT")
 ;;=3021102
 ;;^DD(.9,.04,3)
 ;;=Type a number between .001 and 99999999999
 ;;^DD(.9,.04,"DT")
 ;;=3021102
 ;;^DD(.9,.05,0)
 ;;=DATA^S^1:YES^0;5
 ;;^DD(.9,1,0)
 ;;=DESCRIPTION^.901^^1;0
 ;;^DD(.9,9.6,0)
 ;;=BUILD(S)^Cm^^ ; ^S %=^DDD(D0,0),X="" D BUILDS^DDD($P(%,U,3),$P(%,U,4))
 ;;^DD(.9,25,0)
 ;;=DATA^S^1:YES^0;4
 ;;^DD(.9,25,0)
 ;;=TYPE^CJ20^^ ; ^S %=^DDD(D0,0),X="" I $P(%,U,3) N D0,DCC S DCC="^DD("_$P(%,U,3)_",",D0=$P(%,U,4) X:D0 $P(^DD(0,.25,0),U,5,99)
 ;;^DD(.9,25,9.01)
 ;;=
 ;;^DD(.9,25,9.1)
 ;;=S %=^DDD(D0,0),X="" I $P(%,U,3) N D0,DCC S DCC="^DD("_$P(%,U,3)_",",D0=$P(%,U,4) X:D0 $P(^DD(0,.25,0),U,5,99)
 ;;^DD(.9,25,"DT")
 ;;=3021101
 ;;^DD(.901,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.901,0,"DT")
 ;;=3021101
 ;;^DD(.901,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.901,0,"UP")
 ;;=.9
 ;;^DD(.901,.01,0)
 ;;=DESCRIPTION^W^^0;1
 ;;^DD(.901,.01,"DT")
 ;;=3021101
 ;;^UTILITY(U,$J,"SBF",.9,.9)
 ;;=
 ;;^UTILITY(U,$J,"SBF",.9,.901)
 ;;=

DDDINIT
DDDINIT ; ;06:35 PM  2 Nov 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DIF,DIFQ,DIFQR,DIFQN,DIK,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DIFROM,DFR,DTN,DIX,DZ,DIRUT,DTOUT,DUOUT
 S DIOVRD=1,U="^",DIFQ=0,DIFROM="1" W !,"This version (#1) of 'DDDINIT' was created on 02-NOV-2002"
EN ;
 S DIFQ=0 K DIRUT,DTOUT,DUOUT
 K ^UTILITY("DIF",$J) S ^UTILITY("DIF",$J,2)="",^(1)=" ;;.9I;META DATA DICTIONARY;^DDD(;0;y;;;;;;n"
 S DIFRDIFI=3,I=1
 W !,"I AM GOING TO SET UP THIS FILE:" S DIF(1)=^UTILITY("DIF",$J,1) D 1 G Q:DIFQ!$D(DIRUT) K DIF(1)
 S DIFROM="1" D PKG:'$D(DIFROM(0)),^DDDINIT1 G Q:'$D(DIFQ) S DIK(0)="AB"
 F DIF=1:2:2 S %=^UTILITY("DIF",$J,DIF),DIK=$P(%,";",5),N=$P(%,";",3),D=$P(%,";",4)_U_N D D K DIFQ(N)
 K DIFQR D ^DDDINIT2,^DDDINIT3
 L  S DUZ=DIDUZ W:1 !,$C(7),"OK, I'M DONE.",!
 I DIFROM F DIF=1:2:2 S %=^UTILITY("DIF",$J,DIF),N=+$P(%,";",3) I N,$P(%,";",8)="y" S ^DD(N,0,"VR")=DIFROM
 I DIFROM(0)>0 F %="PRE","INI","INIT" S:$D(DIFROM(%)) $P(^DIC(9.4,DIFROM(0),%),U,2)=DIFROM(%)
 I $G(DIFQN) S $P(^(0),U,3,4)=$P(DIFQN,U,2)_U_($P(^DIC(0),U,4)+DIFQN) K DIFQN
 S:DIFROM(0)>0 ^DIC(9.4,DIFROM(0),"VERSION")=DIFROM G Q^DIFROM0
D S:$D(^DIC(+N,0))[0 ^(0)=D S X=$D(@(DIK_"0)")),^(0)=D_U_$S(X#2:$P(^(0),U,3,9),1:U)
 S DIFQR=DIFQR(+N)
 I DIFQR D IXALL^DIK:$O(@(DIK_"0)")) W "."
 Q
R G REP^DDDINIT2
 ;
1 S N=+$P(DIF(I),";",3),DIF=$P(DIF(I),";",4),S=$P(DIF(I),";",5)
 W !!?3,N,?13,DIF,$P("  (Partial Definition)",U,$P(DIF(I),";",6)),$P("  (including data)",U,$P(DIF(I),";",13)="y") S Z=$S($D(^DIC(N,0))#2:^(0),1:"")
 I Z="" S DIFQ(N)=1,DIFQN=$G(DIFQN)+1_U_N G S
 I $L($P(Z,DIF)) W $C(7),!,"*BUT YOU ALREADY HAVE '",$P(Z,U),"' AS FILE #",N,"!" D R Q:DIFQ  G S:$D(DIFKEP(N)),1
 S DIFQ(N)=$P(DIF(I),";",7)'="n"
 I $L(Z) W $C(7),!,"Note:  You already have the '",$P(Z,U),"' File." S DIFQ(0)=1
 S %=$E(^UTILITY("DIF",$J,I+1),4,245) I %]"" X % S DIFQ(N)=$T W:'$T !,"Screen on this Data Dictionary did not pass--DD will not be installed!" G S
 I $L(Z),$P(DIF(I),";",10)="y" S DIR("A")="Shall I write over the existing Data Definition",DIR("??")="^D DD^DIFROMH1",DIR("B")="YES",DIR(0)="Y" D ^DIR S DIFQ(N)=Y
S S DIFQR(N)=0 Q:$P(DIF(I),";",13)'="y"!$D(DIRUT)
 I $P(DIF(I),";",15)="y",$O(@(S_"0)"))>0 S DIF=$P(DIF(I),";",14)="o",DIR("A")="Want my data "_$P("merged with^to overwrite",U,DIF+1)_" yours",DIR("??")="^D DTA^DIFROMH1",DIR(0)="Y" D ^DIR S DIFQR(N)=$S('Y:Y,1:Y+DIF) Q
 S %=$P(DIF(I),";",14)="o" W !,$C(7),"I will ",$P("MERGE^OVERWRITE",U,%+1)," your data with mine." S DIFQR(N)=%+1
 Q
Q W $C(7),!!,"NO UPDATING HAS OCCURRED!" G Q^DIFROM0
 ;
PKG S X=$P($T(IXF),";",3),DIC="^DIC(9.4,",DIC(0)="",DIC("S")="I $P(^(0),U,2)="""_$P(X,U,2)_"""",X=$P(X,U) D ^DIC S DIFROM(0)=+Y K DIC
 Q
 ;
IXF ;;;0

DDDINIT1
DDDINIT1 ; ;06:44 PM  2 Nov 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; LOADS AND INDEXES DD'S
 ;
 K DIF,DIK,D,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DFR,DTN,DIX,DZ D DT^DICRW S %=1,U="^",DSEC=1
 S NO=$P("I 0^I $D(@X)#2,X[U",U,%) I %<1 K DIFQ Q
ASKNOT I %=1,$D(DIFQ(0)) S DSEC=1
 Q:'$D(DIFQ)  S %=2 W !!,"ARE YOU SURE EVERYTHING'S OK" D YN^DICN I %-1 K DIFQ Q
 I $D(DIFKEP) F DIDIU=0:0 S DIDIU=$O(DIFKEP(DIDIU)) Q:DIDIU'>0  S DIU=DIDIU,DIU(0)=DIFKEP(DIDIU) D EN^DIU2
 D DT^DICRW K ^UTILITY(U,$J),^UTILITY("DIK",$J) D WAIT^DICD
 D ^DDDIN001
 F  S D=$O(^UTILITY(U,$J,"SBF","")) Q:D'>0  K:'DIFQ(D) ^(D) S D=$O(^(D,"")) I D>0  K ^(D) D IX
NODATA Q
 ;
W S Y=$P($T(@X),";",2) W !,"NOTE: This package also contains "_Y_"S",! Q:'$D(DIFQ(0))
 S %=1 W ?6,"SHALL I WRITE OVER EXISTING "_Y_"S OF THE SAME NAME" D YN^DICN I '% W !?6,"Answer YES to replace the current "_Y_"S with the incoming ones." G W
 S:%=2 DIFQ(X)=0 K:%<0 DIFQ
 Q
 ;
OPT ;OPTION
RTN ;ROUTINE DOCUMENTATION NOTE
FUN ;FUNCTION
BUL ;BULLETIN
KEY ;SECURITY KEY
HEL ;HELP FRAME
DIP ;PRINT TEMPLATE
DIE ;INPUT TEMPLATE
DIB ;SORT TEMPLATE
DIS ;FORM
REM ;REMOTE PROCEDURE
 ;
SBF ;FILE AND SUB FILE NUMBERS
IX W "." S DIK="A" F %=0:0 S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," G IXALL^DIK
 Q

DDDINIT2
DDDINIT2 ; ; 02-NOV-2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J),DIC S DIDUZ=0 S:$D(DUZ)#2 DIDUZ=DUZ S DUZ=.5
 I $D(^DIC(9.2,0))#2,^(0)?1"HEL".E S (DIC,DLAYGO)=9.2,N="HEL",DIC(0)="LX" G ADD
 Q
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R'>0  S X=$P(^(R,0),U,1) W "." K DA D ^DIC I Y>0,'$D(DIFQ(N))!$P(Y,U,3) S ^UTILITY("DIFROM",$J,N,X)=+Y K ^DIC(9.2,+Y,1),^(2),^(3),^(10) S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y D %XY^%RCR
 S DIK=DIC
HELP S R=$O(^UTILITY("DIFROM",$J,N,R)) Q:R=""  W !,"'"_R_"' Help Frame filed." S DA=^(R)
 F X=0:0 S X=$O(^DIC(9.2,DA,2,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$P(I,U,2) S:Y]"" Y=$O(^DIC(9.2,"B",Y,0)) S ^(0)=$P(^DIC(9.2,DA,2,X,0),U,1)_U_$S(Y>0:Y,1:"")_U_$P(^(0),U,3,99)
 S I=0 F X=0:0 S X=$O(^DIC(9.2,DA,10,X)) Q:'X  I $D(^(X,0)) S Y=$P(^(0),U),Y=$S(Y]"":$O(^MAG("B",Y,0)),1:0) S:Y $P(^DIC(9.2,DA,10,X,0),U)=Y,I=I+1,%=X I 'Y K ^DIC(9.2,DA,10,X,0)
 I I S $P(^DIC(9.2,DA,10,0),U,3,4)=%_U_I
IX D IX1^DIK G HELP
 ;
U I $D(DIRUT) S DIFQ=1
 W ! Q
REP S DIR(0)="Y",DIR("A")="Shall I change the NAME of the file to "_DIF
 S DIR("??")="^D REP^DIFROMH1",DIR("B")="NO" D ^DIR G U:$D(DIRUT)
 I Y S DIE=1,DIFQ=0,DA=N,DR=".01////"_DIF D ^DIE Q
 S DIR("A")="Shall I replace your file with mine"
 S DIR("??")="^D AG^DIFROMH1" D ^DIR G U:$D(DIRUT)!'Y
 S DIU(0)="E",DIR("A")="Do you want to keep the Data"
 S DIR("??")="^D CHG^DIFROMH1" D ^DIR G U:$D(DIRUT)
 S:'Y DIU(0)=DIU(0)_"D"
 S DIR("A")="Do you want to keep the Templates"
 S DIR("??")="^D TEMP^DIFROMH1" D ^DIR G U:$D(DIRUT) S:'Y DIU(0)=DIU(0)_"T"
 S DIFQ(N)=1,DIFKEP(N)=DIU(0) W !?15," (",DIF,") " Q

DDDINIT3
DDDINIT3 ; ;05:27 PM  2 Nov 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J) S DIC(0)="LX",(DIC,DLAYGO)=3.6,N="BUL" D ADD:$D(^XMB(3.6,0))
 S X=0 F R=0:0 S X=$O(^UTILITY("DIFROM",$J,N,X)) Q:X=""  W !,"'",X,"' BULLETIN FILED -- Remember to add mail groups for new bulletins."
 I $D(^DIC(9.4,0))#2,^(0)?1"PACK".E S N="PKG",(DIC,DLAYGO)=9.4 D ADD
 G NP:'$D(DA) S %=+$O(^DIC(9.4,DA,22,"B",DIFROM,0)) I $D(^DIC(9.4,DA,22,%,0)) S $P(^(0),U,3)=DT
 I $D(^DIC(9.4,DA,0))#2 S %=$P(^(0),U,4) I %]"" S %=$O(^DIC(9.2,"B",%,0)) S:%]"" $P(^DIC(9.4,DA,0),U,4)=%
OR ;
NP K DIC,^UTILITY("DIFROM",$J) S DIC(0)="LX" I $D(^DIC(19,0))#2,^(0)?1"OPTION".E S (DIC,DLAYGO)=19,N="OPT" D ADD,OP
 I $D(^DIC(19.1,0))#2,($P(^(0),U)?1"SECUR".E)!($P(^(0),U)="KEY") S (DIC,DLAYGO)=19.1,N="KEY" D ADD K ^UTILITY("DIFROM",$J)
 I $D(^DIC(9.8,0))#2,^(0)?1"ROUTINE^".E S (DIC,DLAYGO)=9.8,N="RTN" D ADD
 S DIC=.5,DLAYGO=0,N="FUN" D ADD
 I $P($G(^DIC(8994,0)),U)="REMOTE PROCEDURE" S (DIC,DLAYGO)=8994,N="REM" D ADD
 S DIC("S")="I $P(^(0),U,4)=DIFL" F N="DIPT","DIBT","DIE" S DIC=U_N_"(" D ADD
 K DIC("S") S N="DIST(.404,",DIC=U_N,DLAYGO=.404 D ADD
 S DIC("S")="I $P(^(0),U,8)=DIFL",N="DIST(.403,",DIC=U_N,DLAYGO=.403 D ADD
 K ^UTILITY(U,$J),DIC,DLAYGO F DIFR="DIE","DIPT" D DIEZ
 K ^UTILITY("DIFROM",$J) Q
DIEZ I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 E  S DISYS=^DD("OS")
 Q:'$D(^DD("OS",DISYS,"ZS"))
 S DIFR1=""
DZ1 S DIFR1=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1)) Q:DIFR1=""
 F DIFR2=0:0 S DIFR2=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  S Y=DIFR2 I $D(@(U_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD"),DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 G DZ1
 ;
OP S R=$O(^UTILITY("DIFROM",$J,N,R)) I R="" K ^UTILITY("DIFROM",$J) G Q
 W !,"'"_R_"' Option Filed" S DA=+^UTILITY("DIFROM",$J,N,R) G:$P(^(R),U,2,3)="XUCORE^"!($P(^(R),U,2,3)="XUCOMMAND^") OP
 I $D(^DIC(19,DA,220)) S %=$P(^(220),U) S:%]"" %=$O(^XMB(3.6,"B",%,0)) S $P(^DIC(19,DA,220),U)=%,%=$P(^(220),U,3) S:%]"" %=$O(^XMB(3.8,"B",%,0)) S $P(^DIC(19,DA,220),U,3)=%
 S %=$P(^DIC(19,DA,0),U,12) S:%]"" %=$O(^DIC(9.4,"B",%,0))
 S $P(^DIC(19,DA,0),U,12)=%,%=$P(^(0),U,7),(DZ,DIX)=0
 D:$D(^DIC(19,DA,10,"B")) KAD(DA) S:%]"" %=$O(^DIC(9.2,"B",%,0)) S $P(^DIC(19,DA,0),U,7)=%,%=$P(^(0),U,4),%="MOQXL"[% K ^(10,"B"),^("C")
 F X=0:0 S X=$O(^DIC(19,DA,10,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$S($D(^(U)):^(U),1:"") K ^DIC(19,DA,10,X) I Y]"",% S D=$O(^DIC(19,"B",Y,0)) I D S ^DIC(19,DA,10,X,0)=D_U_$P(I,U,2,9),DZ=DZ+1,DIX=X
 S:% ^DIC(19,DA,10,0)="^19.01PI^"_DIX_U_DZ D IX1^DIK G OP
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R=""  S X=$P(^(R,0),U),DIFL=$S(N="DIST(.403,":$P(^(0),U,8),N="DIST(.404,":$P(^(0),U,2),1:$P(^(0),U,4)) W "." K DA D ^DIC I Y>0,'$D(DIFQ($E(N,1,3)))!$P(Y,U,3) S Y=Y_U D A
Q Q
A I N="BUL" K % S %(0)=$G(@(DIC_"+Y,2,0)")) F %=0:0 S %=$O(@(DIC_"+Y,2,%)")) Q:'%  S %(%)=$G(^(%,0))
 K:N'="KEY"&(N'="OPT") @(DIC_"+Y)") S ^UTILITY("DIFROM",$J,N,X)=Y S:$E(N,1,2)="DI" ^(X,+Y)="" S:N="PKG" DIFROM(0)=+Y Q:$P(Y,U,2,3)="XUCORE^"!($P(Y,U,2,3)="XUCOMMAND^")
 I N="BUL",%(0)]"" S @(DIC_"+Y,2,0)")=%(0) F %=0:0 S %=$O(%(%)) Q:'%  S @(DIC_"+Y,2,%,0)")=%(%)
 I $E(N,1,2)="DI",('DIFL)!('$D(^DD(+DIFL))) D
 .W !,"**WARNING--"_$S(N="DIE":"INPUT",N="DIPT":"PRINT",N="DIBT":"SORT",1:"FORM or BLOCK")_$S(N'["DIST":" template ",1:" ")_$P(Y,U,2)_" has been installed,",!,"but associated file "_DIFL_" is not on your system!"
 .Q
 I N="OPT" S:$P(^DIC(19,+Y,0),U,6)]"" DIOPT=$P(^(0),U,6) I $O(^UTILITY(U,$J,N,R,1,0)) K ^DIC(19,+Y,1)
 I N="DIST(.403," D BLK
 S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y,DIK=DIC D %XY^%RCR
 D IX1^DIK:N'="OPT" I N="OPT",$D(DIOPT) S:$P(^DIC(19,DA,0),U,6)="" $P(^(0),U,6)=DIOPT K DIOPT
 I N="DIST(.403," D
 .N DIFRVAL S DIFRVAL=$$VAL^DIFROMSS(.403,DA)
 .I DIFRVAL W !,"Compiling form: ",$P(^DIST(.403,DA,0),U) D EN^DDSZ(DA) Q
 .W !,"ERROR: Form: ",$P(^DIST(.403,DA,0),U)," cannot be compiled"
 .Q
 Q
BLK F J=0:0 S J=$O(^UTILITY(U,$J,N,R,40,J)) Q:'J  I $D(^(J,0)) S %=$P(^(0),U,2) S:%]"" %=$O(^DIST(.404,"B",%,0)) S:% $P(^UTILITY(U,$J,N,R,40,J,0),U,2)=% D B1
 K A0,A1,A2,J,L Q
B1 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,40,L)) Q:'L  S A0=$G(^(L,0)),%=$P(A0,U) I %]"" S %=$O(^DIST(.404,"B",%,0)) I % S $P(A0,U)=%,^UTILITY(U,$J,N,R,40,J,"BLK",%,0)=A0 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,40,L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,"BLK",%,X)=^(X)
 .Q
 S A0=$G(^UTILITY(U,$J,N,R,40,J,40,0)) Q:A0=""  K ^UTILITY(U,$J,N,R,40,J,40) S (A1,A2)=0
 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L)) Q:'L  S ^UTILITY(U,$J,N,R,40,J,40,L,0)=^(L,0),A1=L,A2=A2+1 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,40,L,X)=^(X)
 .Q
 S $P(A0,U,3,4)=A1_U_A2,^UTILITY(U,$J,N,R,40,J,40,0)=A0 K ^UTILITY(U,$J,N,R,40,J,"BLK")
 Q
KAD(D0) N D1,X
 S X=0 F  S X=$O(^DIC(19,D0,10,"B",X)) Q:X'>0  S D1=0 F  S D1=$O(^DIC(19,D0,10,"B",X,D1)) Q:D1'>0  K ^DIC(19,"AD",X,D0,D1)
 Q

DDFIX
DDFIX ;SFCIOFO/S0/MKO VARIOUS DD AND DIC FIXES ;9:17 AM  15 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
FIXPT ; ==> Fix Bad "PT" Nodes <==
 ;
 N EP,ESC
 I '$D(XPDNM) S EP="PT" D DEVICE
 I $D(ESC) G EXIT
DEQPT N DICFILE,DDFILE,DDFIELD,PGLEN,PG,RPTDT,X
 U IO
 D RPTDT
 S PGLEN=IOSL-5,PG=0
 I '$D(XPDNM) D PTHDR
 ; Loop thru DIC(<file #>,
 S DICFILE=1.99999
 F  S DICFILE=$O(^DIC(DICFILE)) Q:DICFILE'>1.99999!$D(ESC)  D
 . ; Loop thru DD(DICFILE,0,"PT",<file #>
 . S DDFILE=1.99999
 . F  S DDFILE=$O(^DD(DICFILE,0,"PT",DDFILE)) Q:DDFILE'>1.99999!$D(ESC)  D
 .. I $D(^DD(DDFILE,0))#2 D  Q  ; File Exists
 ... ; Check Fields Exists
 ... S DDFIELD=0
 ... F  S DDFIELD=$O(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) Q:'DDFIELD!$D(ESC)  D
 .... I $D(^DD(DDFILE,DDFIELD,0))#2 D  Q  ; Field is still in DD
 ..... I ($P(^(0),U,2)'["P")&($P(^(0),U,2)'["V") D  Q  ; Field Still A Pointer?
 ...... S X="*File: "_DDFILE_" Field: "_DDFIELD_" is Not a Pointer Type." D RPTOUT
 ...... S X="   Deleting ""PT"" node: "_$NA(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) D RPTOUT,K1 Q
 ..... I $P(^(0),U,2)["P",+$P($P(^(0),U,2),"P",2)'=DICFILE D  Q  ; Field Still Point To Same File?
 ...... S X="*File: "_DDFILE_" Field: "_DDFIELD_" Does Not Point To File: "_DICFILE_"." D RPTOUT
 ...... S X="  Deleting ""PT"" Node: "_$NA(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) D RPTOUT,K1 Q
 .... ; **Field No Longer Exists
 .... S X="*Field: "_DDFIELD_" in File: "_DDFILE_" does Not Exist." D RPTOUT
 .... S X="  Deleting ""PT"" node: "_$NA(^DD(DICFILE,0,"PT",DDFILE,DDFIELD)) D RPTOUT,K1 Q
 .. ; **File No Longer Exists
 .. S X="*File: "_DDFILE_" Does Not Exist." D RPTOUT
 .. S X="  Deleting ""PT"" node: "_$NA(^DD(DICFILE,0,"PT",DDFILE)) D RPTOUT
 .. K ^DD(DICFILE,0,"PT",DDFILE)
 G EXIT ; GoTo Common Exit
K1 ; Kill at Field Level
 K ^DD(DICFILE,0,"PT",DDFILE,DDFIELD)
 Q
PTHDR ; Fix "PT" nodes Report Header
 I $E(IOST,1,2)="C-" D  Q:$D(ESC)
 . I PG D PAUSE Q:$D(ESC)
 . W @IOF
 I PG W @IOF
 S PG=PG+1
 W "Fix ""PT"" Nodes Report     "_RPTDT,?(IOM-10),"Page: "_PG,!
 N X
 S X="",$P(X,"-",(IOM-1))="" W X,!
 Q
 ;
FIXNM ; ==> Fix Duplicate 'NM' Nodes <==
 ; From patch DI*21*50, routine DIPR50
 ;
 N EP,ESC
 I '$D(XPDNM) S EP="NM" D DEVICE
 I $D(ESC) G EXIT
DEQNM N DDFILE,DDNAME,DDNEW,PGLEN,PG,RPTDT,X
 U IO
 D RPTDT
 S PGLEN=IOSL-5,PG=0
 I '$D(XPDNM) D NMHDR
 S DDFILE=1.99999
 F  S DDFILE=$O(^DD(DDFILE)) Q:'DDFILE!$D(ESC)  D
 . ; Check and repair duplicate "NM" nodes
 . S DDNAME=$O(^DD(DDFILE,0,"NM","")) Q:DDNAME=""
 . I $O(^DD(DDFILE,0,"NM",DDNAME))="" Q
 . S X="*File/Subfile: "_DDFILE_" has duplicate 'NM' nodes."
 . D RPTOUT
 . S DDNEW=$S($D(^DIC(DDFILE,0))#2:$P(^(0),U),1:$P(^DD(DDFILE,0)," SUB-FIELD"))
 . Q:DDNEW=""
 . K ^DD(DDFILE,0,"NM")
 . S ^DD(DDFILE,0,"NM",DDNEW)=""
 . S X="  ""NM"" node will be set to: "_DDNEW
 . D RPTOUT
 G EXIT ; GoTo Common Exit Point
NMHDR ; Fix "NM" nodes Report Header
 I $E(IOST,1,2)="C-" D  Q:$D(ESC)
 . I PG D PAUSE Q:$D(ESC)
 . W @IOF
 I PG W @IOF
 S PG=PG+1
 W "Fix Duplicate ""NM"" Nodes Report     "_RPTDT,?(IOM-10),"Page: "_PG,!
 N X
 S X="",$P(X,"-",(IOM-1))="" W X,!
 Q
 ;
FIXAG ; ==> Application Group Multiple Bad Xrefs <==
 ; From patch DI*21*58, routine DIPR58
 ;
 N EP,ESC
 I '$D(XPDNM) S EP="AG" D DEVICE
 I $D(ESC) G EXIT
DEQAG N DDAGPKG,DDFILE,IEN,PGLEN,PG,RPTDT,X
 U IO
 D RPTDT
 S PGLEN=IOSL-5,PG=0
 I '$D(XPDNM) D AGHDR
 S DDFILE=1.99999
 F  S DDFILE=$O(^DIC(DDFILE)) Q:DDFILE<1.99999  D
 . I '$D(^DIC(DDFILE,"%")) Q  ; No App. Group Multiple
 . S DDAGPKG=""
 . F  S DDAGPKG=$O(^DIC(DDFILE,"%","B",DDAGPKG)) Q:DDAGPKG=""  D
 .. S IEN=0
 .. F  S IEN=$O(^DIC(DDFILE,"%","B",DDAGPKG,IEN)) Q:'IEN  D
 ... I $P($G(^DIC(DDFILE,"%",IEN,0)),U)=DDAGPKG Q
 ... S X="Deleting App. Group "_DDAGPKG_" ""B"" xref: "_$NA(^DIC(DDFILE,"%","B",DDAGPKG,IEN))
 ... D RPTOUT
 ... K ^DIC(DDFILE,"%","B",DDAGPKG,IEN)
AC ; Loop Thru "AC" xref and Remove Any Entries That Point to
 ; Files That Do Not Exist
 S DDAGPKG=""
 F  S DDAGPKG=$O(^DIC("AC",DDAGPKG)) Q:DDAGPKG=""  D
 . S DDFILE=1.99999
 . F  S DDFILE=$O(^DIC("AC",DDAGPKG,DDFILE)) Q:DDFILE<1.99999  D
 .. I $D(^DIC(DDFILE,0))[0 D  Q
 ... S X="Deleting ""AC"" xref: "_$NA(^DIC("AC",DDAGPKG,DDFILE))
 ... D RPTOUT
 ... K ^DIC("AC",DDAGPKG,DDFILE)
 .. S IEN=0
 .. F  S IEN=$O(^DIC("AC",DDAGPKG,DDFILE,IEN)) Q:'IEN  D
 ... I $P($G(^DIC(DDFILE,"%",IEN,0)),U)'=DDAGPKG D
 .... S X="Deleting ""AC"" xref: "_$NA(^DIC("AC",DDAGPKG,DDFILE,IEN))
 .... D RPTOUT
 .... K ^DIC("AC",DDAGPKG,DDFILE,IEN)
 G EXIT ; GoTo Common Exit Point
AGHDR ; Fix Application Group Xrefs Report Header
 I $E(IOST,1,2)="C-" D  Q:$D(ESC)
 . I PG D PAUSE Q:$D(ESC)
 . W @IOF
 I PG W @IOF
 S PG=PG+1
 W "Fix Application Group Xrefs Report     "_RPTDT,?(IOM-10),"Page: "_PG,!
 N X
 S X="",$P(X,"-",(IOM-1))="" W X,!
 Q
 ;
 ; Common For All Entry Points
 ;
DEVICE ; Output Device Selection
 S %ZIS="MQ"
 D ^%ZIS
 I POP S ESC=1 Q  ;User Escaped Device Selection
 I $D(IO("Q")) D
 . S ZTDESC=$S(EP="PT":"FIX PT NODES",EP="NM":"FIX DUPLICATE 'NM' NODES",EP="AG":"FIX APPLICATION GROUP XREFS",1:"")
 . S ZTRTN=$S(EP="PT":"DEQPT",EP="NM":"DEQNM",EP="AG":"DEQAG",1:"")_"^DDFIX"
 . S ZTSAVE("EP")=""
 . D ^%ZTLOAD
 . I $D(ZTSK)#2 W !,"Report queued!",!,"Task number: "_$G(ZTSK),!
 . S ESC=1
 . K ZTSK,ZTDESC,ZTRTN,ZTSAVE
 . D HOME^%ZIS
 Q
RPTDT ; Get Report Date/Time
 N %,%H,X,Y
 S %H=$H
 D YX^%DTC
 S RPTDT=$P(Y,"@")_"@"_$E($P(Y,"@",2),1,5)
 Q
RPTOUT ; Print Messages
 I $D(XPDNM) D MES^XPDUTL(X) Q  ;  KIDS install being used
 W X,! ; KIDS install not being used
 I $Y'>PGLEN Q
 I EP="PT" D PTHDR Q
 I EP="NM" D NMHDR Q
 I EP="AG" D AGHDR Q
 Q
PAUSE ; End of Page Pause
 N DIR,Y
 S DIR(0)="E"
 D ^DIR
 I $D(DTOUT)!$D(DUOUT)!$D(DIRUT)!$D(DIROUT) K DTOUT,DUOUT,DIRUT,DIROUT S ESC=1 Q
 Q
EXIT ; Common Exit Point
 I $E(IOST,1,2)="P-" D ^%ZISC
 I $D(ZTQUEUED) S ZTREQ="@"
 K EP
 Q

DDGF
DDGF ;SFISC/MKO-FORM BUILDING TOOL ;7JAN2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;Program-wide variables
 ; DDGFILE  = File number^File name
 ; DDGFFM   = Form number^Form name
 ; DDGFPG   = Page number
 ; DDGFWID  = Window id for given page
 ; DDGFWIDB = Window id for block displayer for a given page
 ; DDGFREF  = Global reference where data is stored
 ; DDGFLIM  = Boundaries within which cursor can be moved
 ;            $Y1^$X1^$Y2^$X2
 ; DDGFBV   = If defined, we're in the block view page
 ; DDGFMSG  = Indicates there's a message on the message line.
 ;
 N %,%W,%X,%Y,C,D,D0,DI,DIC,DIEQ,DIW,DIZ,DQ,I,X,Y,DIOVRD
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 D ^DDGF0 G:$G(DIERR) END^DDGF0
 D SEL^DDGFFM G:$D(DDGFFM)[0 END^DDGF0
 D ALL^DDGFASUB,^DDGF1,END^DDGF0
 Q
 ;
REFRESH ;Repaint all windows, status line
 D REPALL^DDGLIBW(),STATUS
 Q
 ;
STATUS ;Paint status line
 N DX,DY,N,S
 K DDGFMSG
 S DY=IOSL-7,DX=0 X IOXY
 W $P(DDGLCLR,DDGLDEL,3)_$TR($J("",IOM-1)," ","_")
 ;
 S DY=IOSL-6 X IOXY
 W "File: "_$P(DDGFFILE,U,2)_" (#"_$P(DDGFFILE,U)_")"
 I $D(DDGFBV)#2 S DX=46 X IOXY W "BLOCK VIEWER"
 W !,"Form: "_$P(DDGFFM,U,2)_" (#"_+DDGFFM_")"
 S N=$G(@DDGFREF@("F",+$G(DDGFPG)))
 W !,"Page: "_$S(N]"":$P(N,U,6)_" ("_$P(N,U,5)_")",1:""),!!!
 I $D(DDGFBV)#2 W $P(DDGLVID,DDGLDEL)_"<F1>V=Main Screen  <F1>H=Help"_$P(DDGLVID,DDGLDEL,10)
 E  W $P(DDGLVID,DDGLDEL)_"<F1>Q=Quit  <F1>E=Exit  <F1>S=Save  <F1>V=Block Viewer  <F1>H=Help"_$P(DDGLVID,DDGLDEL,10)
 Q
 ;
MSG(M) ;Print message
 N DDGFDY,DDGFDX
 S DDGFDY=DY,DDGFDX=DX S:$D(M)[0 M=""
 S DY=IOSL-2,DX=0 X IOXY
 ;
 W $E(M,1,79)_$P(DDGLCLR,DDGLDEL)
 S:M]"" DDGFMSG=1 K:M="" DDGFMSG
 S DY=DDGFDY,DX=DDGFDX X IOXY
 Q
 ;
RESET ;Reset terminal and cleanup
 S DDGFREF="^TMP(""DDGF"",$J)",DDGLREF="^TMP(""DDGL"",$J)"
 K DDSFILE,DDSPAGE,DDSPARM,DR
 G KILL^DDGF0

DDGF0
DDGF0 ;SFISC/MKO-SETUP, CLEANUP ;09:58 AM  9 Sep 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 20
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 D INIT^DDGLIB0() Q:$G(DIERR)
 D SET,GETKEY
 Q
 ;
SET ;Setup variables
 D:$D(DT)[0 DT^DICRW
 S (DIOVRD,DDGFR)=1,DDGFREF="^TMP(""DDGF"",$J)",DDGFCHG=0
 K @DDGFREF,DDGFFM
 Q
 ;
END ;Clear screen, clean up variables
 I $D(DDGFFM)#2 D RECOMP
KILL ;
 D:$G(DIERR) MSG^DIALOG("BW")
 X:$D(DDGLZOSF) DDGLZOSF("EON"),DDGLZOSF("TRMOFF")
 D KILL^DDGLIB0()
 K:$D(DDGFREF) @DDGFREF,DDGFREF
 K ^TMP("DDGFH",$J)
 K DDGF,DDGFBV,DDGFCHG,DDGFE,DDGFFILE,DDGFFM,DDGFLIM,DDGFMSG
 K DDGFPG,DDGFR,DDGFWID,DDGFWIDB
 K DDH
 Q
 ;
RECOMP ;Recompile form
 N DDGFLIST
 S DDGFLIST=$NA(^TMP("DDGFOF",$J))
 D MSG^DDGF("Recompiling ...")
 ;
 D GETBLKS(+DDGFFM,DDGFLIST)
 S DDSQUIET=1 D EN^DDSZ(DDGFFM) K DDSQUIET
 I $D(@DDGFLIST) D
 . N DDGFI
 . S DDGFI=""
 . F  S DDGFI=$O(@DDGFLIST@(DDGFI)) Q:'DDGFI  D EN^DDSZ(DDGFI)
 . K @DDGFLIST
 ;
 D MSG^DDGF("")
 S DX=0,DY=IOSL-1 X IOXY
 Q
 ;
GETBLKS(F,L) ;
 ;Determine if any of the blocks loaded are
 ;used on other forms.
 ; L(Form#)=""        Other forms that need recompiling
 ;
 N P,B
 S P=0 F  S P=$O(@DDGFREF@("F",P)) Q:'P  D
 . S B=0
 . F  S B=$O(@DDGFREF@("F",P,B)) Q:'B  D:'$D(@L@("B",B))
 .. S @L@("B",B)=""
 .. D OTHER(B,F,L)
 K @L@("B")
 Q
 ;
OTHER(B,F,L) ;
 ;Return list L of forms other than F that use block B
 ; L(Form#)=""
 N F1
 S F1=""
 F  S F1=$O(^DIST(.403,"AB",B,F1)) Q:F1=""  I F1'=F S @L@(F1)=""
 S F1="" F  S F1=$O(^DIST(.403,"AC",B,F1)) Q:F1=""  I F1'=F S @L@(F1)=""
 Q
 ;
GETKEY ;Get key sequences and defaults
 N AU,AD,AR,AL,F1,F2,F3,F4,I,K,N,T
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S AR=$P(DDGLKEY,U,4)
 S AL=$P(DDGLKEY,U,5)
 S F1=$P(DDGLKEY,U,6)
 S F2=$P(DDGLKEY,U,7)
 S F3=$P(DDGLKEY,U,8)
 S F4=$P(DDGLKEY,U,9)
 ;
 F N="","S","D" D
 . S DDGF(N_"IN")="",DDGF(N_"OUT")=""
 . F I=1:1 S T=$P($T(@(N_"MAP")+I),";;",2,999) Q:T=""  D
 .. S @("K="_$P(T,";",2))
 .. I DDGF(N_"IN")'[(U_K) D
 ... S DDGF(N_"IN")=DDGF(N_"IN")_U_K
 ... S DDGF(N_"OUT")=DDGF(N_"OUT")_$P(T,";")_U
 . S DDGF(N_"IN")=DDGF(N_"IN")_U
 . S DDGF(N_"OUT")=$E(DDGF(N_"OUT"),1,$L(DDGF(N_"OUT"))-1)
 Q
 ;
MAP ;Keys for main screen
 ;;LNU;AU;          line up
 ;;LND;AD;          line down
 ;;CHR;AR;          char right
 ;;CHL;AL;          char left
 ;;ELR;$C(9);       element right
 ;;ELL;"Q";         element left
 ;;TBR;"S";         tab right
 ;;TBL;"A";         tab left
 ;;EXIT;F1_"E";     exit
 ;;QUIT;F1_"Q";     quit
 ;;ROWCOL;"R";      row/col indicator toggle
 ;;SCT;F1_AU;       top of screen
 ;;SCB;F1_AD;       bottom of screen
 ;;SCR;F1_AR;       right edge of screen
 ;;SCL;F1_AL;       left edge of screen
 ;;SAVE;F1_"S";     save changes
 ;;SELECT;" ";      select an element
 ;;SELECT;$C(13);   select an element
 ;;SELFILE;F1_1;    select file
 ;;VIEW;F1_"V";     view toggle
 ;;EDIT;F3;         edit caption or data length
 ;;FLDADD;F2_"F";   add a new field
 ;;BKADD;F2_"B";    add a new block
 ;;NXTPG;F1_F1_AD;  go to next page
 ;;PRVPG;F1_F1_AU;  go to previous page
 ;;CLSPG;F1_"C";    close popup page
 ;;PGSEL;F1_"P";    select another page
 ;;PGADD;F2_"P";    add a new page
 ;;PGEDIT;F4_"P";   edit page attributes
 ;;FMSEL;F1_"M";    select another form
 ;;FMADD;F2_"M";    add a new form
 ;;FMEDIT;F4_"M";   edit form attributes
 ;;HELP;F1_"H"
 ;;
SMAP ;Keys for moving selected gadgets
 ;;LNU;AU;          line up
 ;;LND;AD;          line down
 ;;CHR;AR;          char right
 ;;CHL;AL;          char left
 ;;TBR;$C(9);       tab right
 ;;TBR;"S";          "   "
 ;;TBL;"Q";         tab left
 ;;TBL;"A";          "   "
 ;;ROWCOL;"R";      row/col indicator toggle
 ;;SCT;F1_AU;       top of screen
 ;;SCB;F1_AD;       bottom of screen
 ;;SCR;F1_AR;       right edge of screen
 ;;SCL;F1_AL;       left edge of screen
 ;;SUBPG;F1_"D";    go into a multiples pop-up page
 ;;DESELECT;" ";    deselect an element
 ;;DESELECT;$C(13); deselect an element
 ;;EDIT;F4;         edit properties
 ;;REORDER;F1_"O";  reorder fields in block
 ;;
DMAP ;Keys for changing data length
 ;;CHR;AR;          char right
 ;;CHL;AL;          char left
 ;;DONE;$C(13);     done
 ;;DONE;" ";        done
 ;;DONE;F3;         done
 ;;

DDGF1
DDGF1 ;SFISC/MKO-MAIN SCREEN ;02:46 PM  12 Oct 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D RC($P(DDGFLIM,U),$P(DDGFLIM,U,2))
 S DDGFE=0 F  S Y=$$READ W:$T(@Y)="" $C(7) D:$D(DDGFMSG) MSG^DDGF() D:$T(@Y)]"" @Y Q:DDGFE
 Q
 ;
LNU I DY>$P(DDGFLIM,U) D RC(DY-1,DX)
 Q
LND I DY<$P(DDGFLIM,U,3) D RC(DY+1,DX)
 Q
CHR I DX<$P(DDGFLIM,U,4) D RC(DY,DX+1)
 Q
CHL I DX>$P(DDGFLIM,U,2) D RC(DY,DX-1)
 Q
 ;
ELR N Y,X
 S Y=DY,X=DX
 S X=$O(@DDGFREF@("RC",DDGFWID,Y,X))
 D:X=""
 . S Y=$O(@DDGFREF@("RC",DDGFWID,Y))
 . S:Y="" Y=$O(@DDGFREF@("RC",DDGFWID,""))
 . S:Y]"" X=$O(@DDGFREF@("RC",DDGFWID,Y,""))
 D:X]"" RC(Y,X)
 Q
ELL N Y,X
 S Y=DY,X=DX
 S X=$O(@DDGFREF@("RC",DDGFWID,Y,X),-1)
 D:X=""
 . S Y=$O(@DDGFREF@("RC",DDGFWID,Y),-1)
 . S:Y="" Y=$O(@DDGFREF@("RC",DDGFWID,""),-1)
 . S:Y]"" X=$O(@DDGFREF@("RC",DDGFWID,Y,""),-1)
 D:X]"" RC(Y,X)
 Q
 ;
TBR I DX<$P(DDGFLIM,U,4) D
 . D RC(DY,$S(DX+5'<$P(DDGFLIM,U,4):$P(DDGFLIM,U,4),1:DX+5))
 E  I DY<$P(DDGFLIM,U,3) D RC(DY+1,$P(DDGFLIM,U,2))
 Q
TBL I DX>$P(DDGFLIM,U,2) D
 . D RC(DY,$S(DX-5'>$P(DDGFLIM,U,2):$P(DDGFLIM,U,2),1:DX-5))
 E  I DY>$P(DDGFLIM,U) D RC(DY-1,$P(DDGFLIM,U,4))
 Q
 ;
SCT I DY>$P(DDGFLIM,U) D RC($P(DDGFLIM,U),DX)
 Q
SCB I DY<$P(DDGFLIM,U,3) D RC($P(DDGFLIM,U,3),DX)
 Q
SCR I DX<$P(DDGFLIM,U,4) D RC(DY,$P(DDGFLIM,U,4))
 Q
SCL I DX>$P(DDGFLIM,U,2) D RC(DY,$P(DDGFLIM,U,2))
 Q
 ;
SAVE ;Save data from DDGFREF
 I 'DDGFPG D ERR(110) Q
 G SAVE^DDGFSV
 ;
SELECT ;Select an item
 I 'DDGFPG D ERR(110) Q
 G SELECT^DDGFEL
 ;
EDIT ;Edit a caption or data length
 I 'DDGFPG D ERR(110) Q
 G EDIT^DDGFEL
 ;
FLDADD ;Add a new field to the form
 I 'DDGFPG D ERR(110) Q
 G ADD^DDGFFLDA
 ;
VIEW ;Go to block viewer
 I 'DDGFPG D ERR(110) Q
 I $O(@DDGFREF@("F",DDGFPG,""))="" D ERR(120) Q
 G ^DDGF3
 ;
BKADD ;Add a new block
 I 'DDGFPG D ERR(110) Q
 G ADD^DDGFBK
 ;
HBKADD ;Add a header block
 I 'DDGFPG D ERR(110) Q
 G ADD^DDGFHBK
 ;
NXTPG ;Go to next page
 I 'DDGFPG D ERR(110) Q
 D NXTPRV^DDGFPG(1) Q
 ;
PRVPG ;Go to previous page
 I 'DDGFPG D ERR(110) Q
 D NXTPRV^DDGFPG(-1) Q
 ;
CLSPG ;Close pop-up page
 G CLSPG^DDGFPG
 ;
PGSEL ;Select a new page
 I 'DDGFPG D ERR(110) Q
 G PGSEL^DDGFPG
 ;
PGADD ;Add a new page to the form
 G ADD^DDGFPG
 ;
PGEDIT ;Edit attributes of a page
 I 'DDGFPG D ERR(110) Q
 G EDIT^DDGFPG
 ;
FMSEL ;Select another form
 G SEL^DDGFFM
 ;
FMADD ;Add a new form
 G ADD^DDGFFM
 ;
FMEDIT ;Edit the form
 G EDIT^DDGFFM
 ;
HELP ;Invoke help screens
 G HLP^DDGFH
 ;
TO ;Time-out
 W $C(7)
 G QUIT
 ;
QUIT ;Exit from form designer
 I DDGLSCR>1 G CLSPG^DDGFPG
 S DDGFE=1
 Q
EXIT ;Save and exit
 I DDGLSCR>1 G CLSPG^DDGFPG
 S DDGFE=1
 G SAVE^DDGFSV
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N DDGFS
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,DDGFS="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W DDGFS_$J("",7-$L(DDGFS))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q
 ;
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGF("IN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGF("IN")'[(U_S_U) Y=-1
 ;
 I DDGF("IN")[(U_S_U),S'=$C(27) S Y=$P(DDGF("OUT"),U,$L($P(DDGF("IN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q
 ;
ERR(X) ;
 D MSG^DDGF($C(7)_$P($T(@X),";;",2,999)) H 3
 D MSG^DDGF()
 Q
110 ;;There are no pages on this form.  Use PF2-P to add a page.
120 ;;There are no blocks on this page.  Use PF2-B to add a block.

DDGF2
DDGF2 ;SFISC/MKO-ACTIONS FOR SELECTED FIELDS ;02:48 PM  12 Oct 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Input:
 ;  B  = internal block number
 ;  F  = internal field order
 ;  T  = type of element ("C" = caption, "D" = data)
 ;  C  = caption
 ;  C1 = $Y of caption
 ;  C2 = $X of caption
 ;  D  = data representation (underlines)
 ;  D1 = $Y of data
 ;  D2 = $X of data
 ;  L  = length of data
 ;  P1 = page $Y
 ;  P2 = page $X
 N DDGFE
 S DDGFE=0,DDGFLSV=DDGFLIM
 S DDGFLIM=$P(@DDGFREF@("F",DDGFPG,B),U,1,2)_U_$P(DDGFLIM,U,3,4)
 ;
 D PAINTS
 S DDGFE=0 F  S Y=$$READ W:$T(@Y)="" $C(7) D:$T(@Y)]"" @Y Q:DDGFE
 D END
 D:$G(DDGFSUBP) SUBPG1^DDGFPG
 Q
 ;
END ;Redraw the field
 S DDGFLIM=DDGFLSV K DDGFLSV
 Q:$D(^DIST(.404,B,40,F,0))[0
 ;
 S C3=C2+$L(C)-1
 I T="C",C]"" D
 . D WRITE^DDGLIBW(DDGFWID,C,C1-P1,C2-P2)
 . S @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C")=""
 ;
 I $D(D) D
 . S D3=D2+L-1
 . D WRITE^DDGLIBW(DDGFWID,D,D1-P1,D2-P2)
 . S @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F,"D")=""
 ;
 S @DDGFREF@("F",DDGFPG,B,F)=C1_U_C2_U_C3_U_C_U_$S($D(D):D1_U_D2_U_D3_U_L,1:"^^^")_U_1,DDGFCHG=1
 X IOXY
 Q
 ;
TO ;Time-out
 W $C(7)
 G DESELECT
 ;
DESELECT ;
 S DDGFE=1
 Q
 ;
LNU I T="C" Q:C1'>$P(DDGFLIM,U)
 I $D(D),D1'>$P(DDGFLIM,U) Q
 D REDRAW S:T="C" C1=C1-1
 S:$D(D) D1=D1-1
 S DY=DY-1
 D PAINTS
 Q
LND I T="C" Q:C1'<$P(DDGFLIM,U,3)
 I $D(D),D1'<$P(DDGFLIM,U,3) Q
 D REDRAW
 S:T="C" C1=C1+1
 S:$D(D) D1=D1+1
 S DY=DY+1
 D PAINTS
 Q
CHR I T="C" Q:C2+$L(C)>$P(DDGFLIM,U,4)
 I $D(D),D2+L>$P(DDGFLIM,U,4) Q
 D REDRAW S:T="C" C2=C2+1
 S:$D(D) D2=D2+1
 S DX=DX+1
 D PAINTS
 Q
CHL I T="C" Q:C2'>$P(DDGFLIM,U,2)
 I $D(D),D2'>$P(DDGFLIM,U,2) Q
 D REDRAW S:T="C" C2=C2-1
 S:$D(D) D2=D2-1
 S DX=DX-1
 D PAINTS
 Q
TBR N X
 I T="C" Q:C2+$L(C)>$P(DDGFLIM,U,4)
 I $D(D),D2+L>$P(DDGFLIM,U,4) Q
 D REDRAW
 I T="C" D
 . S X=$$MIN(5,$P(DDGFLIM,U,4)-(C2+$L(C)),$S($D(D):$P(DDGFLIM,U,4)-(D2+L)+1,1:""))
 . S C2=C2+X
 E  S X=$$MIN(5,$P(DDGFLIM,U,4)-(D2+L)+1)
 S:$D(D) D2=D2+X
 S DX=DX+X
 D PAINTS
 Q
TBL N X
 I T="C" Q:C2'>$P(DDGFLIM,U,2)
 I $D(D),D2'>$P(DDGFLIM,U,2) Q
 D REDRAW
 I T="C" D
 . S X=$$MIN(5,C2-$P(DDGFLIM,U,2),$S($D(D):D2-$P(DDGFLIM,U,2),1:""))
 . S C2=C2-X
 E  S X=$$MIN(5,D2-$P(DDGFLIM,U,2))
 S:$D(D) D2=D2-X
 S DX=DX-X
 D PAINTS
 Q
SCT N Y
 I T="C" Q:C1'>$P(DDGFLIM,U)
 I $D(D),D1'>$P(DDGFLIM,U) Q
 D REDRAW
 I T="C" S Y=$S('$D(D):C1,C1<D1:C1,1:D1)-$P(DDGFLIM,U),C1=C1-Y
 E  S Y=D1-$P(DDGFLIM,U)
 S:$D(D) D1=D1-Y
 S DY=DY-Y
 D PAINTS
 Q
SCB N Y
 I T="C" Q:C1'<$P(DDGFLIM,U,3)
 I $D(D),D1'<$P(DDGFLIM,U,3) Q
 D REDRAW
 I T="C" S Y=$P(DDGFLIM,U,3)-$S('$D(D):C1,C1>D1:C1,1:D1),C1=C1+Y
 E  S Y=$P(DDGFLIM,U,3)-D1
 S:$D(D) D1=D1+Y
 S DY=DY+Y
 D PAINTS
 Q
SCR N X
 I T="C" Q:C2+$L(C)>$P(DDGFLIM,U,4)
 I $D(D),D2+L>$P(DDGFLIM,U,4) Q
 D REDRAW
 I T="C" D
 . S X=$P(DDGFLIM,U,4)-$S('$D(D):C2+$L(C),C2+$L(C)>(D2+L):C2+$L(C),1:D2+L)+1
 . S C2=C2+X
 E  S X=$P(DDGFLIM,U,4)-(D2+L)+1
 S:$D(D) D2=D2+X
 S DX=DX+X
 D PAINTS
 Q
SCL N X
 I T="C" Q:C2'>$P(DDGFLIM,U,2)
 I $D(D),D2'>$P(DDGFLIM,U,2) Q
 D REDRAW
 I T="C" S X=$S('$D(D):C2,C2<D2:C2,1:D2)-$P(DDGFLIM,U,2),C2=C2-X
 E  S X=D2-$P(DDGFLIM,U,2)
 S:$D(D) D2=D2-X
 S DX=DX-X
 D PAINTS
 Q
EDIT ;
 G EDIT^DDGFFLD
SUBPG ;
 G SUBPG^DDGFPG
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N DDGFS
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,DDGFS="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W DDGFS_$J("",7-$L(DDGFS))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q
 ;
REDRAW ;
 D:T="C" REPAINT^DDGLIBW(DDGFWID,(C1-P1)_U_(C2-P2)_U_1_U_$L(C))
 D:$D(D) REPAINT^DDGLIBW(DDGFWID,(D1-P1)_U_(D2-P2)_U_1_U_L)
 Q
 ;
PAINTS ;
 N Y,X
 S Y=DY,X=DX
 I T="C" S DY=C1,DX=C2 X IOXY W $P(DDGLVID,DDGLDEL,6)_$E(C,1,$$MIN($L(C),$P(DDGFLIM,U,4)-C2+1))_$P(DDGLVID,DDGLDEL,10)
 I $D(D) S DY=D1,DX=D2 X IOXY W $P(DDGLVID,DDGLDEL,6)_$E(D,1,$$MIN(L,$P(DDGFLIM,U,4)-D2+1))_$P(DDGLVID,DDGLDEL,10)
 D RC(Y,X)
 Q
 ;
MIN(X,Y,Z) ;Return the minimum of two or three numbers
 N A
 S A=$S(X<Y:X,1:Y)
 Q:$G(Z)="" A
 Q $S(A<Z:A,1:Z)
 ;
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGF("SIN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGF("SIN")'[(U_S_U) Y=-1
 ;
 I DDGF("SIN")[(U_S_U),S'=$C(27) S Y=$P(DDGF("SOUT"),U,$L($P(DDGF("SIN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q

DDGF3
DDGF3 ;SFISC/MKO-Block Viewer Page ;02:49 PM  12 Oct 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Variables used:
 ;  DDGFBV      = flag indicating we're on block viewer page
 ;  DDGFORIG(B) = original $Y^original $X for all blocks that were
 ;                  selected, since they were potentially moved
 ;  DDGFEBV     = flag that can be set to exit block viewer page
 ;                  after a block has been selected
 ;
 N DDGFE
 S DDGFE=0,DDGFBV=1 K DDGFORIG,DDGFEBV
 ;
 D PAINT,RC(DY,DX)
 F  S Y=$$READ W:$T(@Y)="" $C(7) D:$T(@Y)]"" @Y D:$D(DDGFMSG) MSG^DDGF() Q:DDGFE!$G(DDGFEBV)
 D CLEANUP
 Q
 ;
LNU I DY>$P(DDGFLIM,U) D RC(DY-1,DX)
 Q
LND I DY<$P(DDGFLIM,U,3) D RC(DY+1,DX)
 Q
CHR I DX<$P(DDGFLIM,U,4) D RC(DY,DX+1)
 Q
CHL I DX>$P(DDGFLIM,U,2) D RC(DY,DX-1)
 Q
ELR N Y,X
 S Y=DY,X=DX
 F  D  Q:Y=""!(X]"")
 . S X=$O(@DDGFREF@("BKRC",DDGFWIDB,Y,X))
 . S:X="" Y=$O(@DDGFREF@("BKRC",DDGFWIDB,Y))
 D:X]"" RC(Y,X)
 Q
ELL N Y,X
 S Y=DY,X=DX
 F  D  Q:Y=""!(X]"")
 . S X=$O(@DDGFREF@("BKRC",DDGFWIDB,Y,X),-1)
 . S:X="" Y=$O(@DDGFREF@("BKRC",DDGFWIDB,Y),-1)
 D:X]"" RC(Y,X)
 Q
TBR I DX<$P(DDGFLIM,U,4) D
 . D RC(DY,$S(DX+5'<$P(DDGFLIM,U,4):$P(DDGFLIM,U,4),1:DX+5))
 E  I DY<$P(DDGFLIM,U,3) D RC(DY+1,$P(DDGFLIM,U,2))
 Q
TBL I DX>$P(DDGFLIM,U,2) D
 . D RC(DY,$S(DX-5'>$P(DDGFLIM,U,2):$P(DDGFLIM,U,2),1:DX-5))
 E  I DY>$P(DDGFLIM,U) D RC(DY-1,$P(DDGFLIM,U,4))
 Q
 ;
SCT I DY>$P(DDGFLIM,U) D RC($P(DDGFLIM,U),DX)
 Q
SCB I DY<$P(DDGFLIM,U,3) D RC($P(DDGFLIM,U,3),DX)
 Q
SCR I DX<$P(DDGFLIM,U,4) D RC(DY,$P(DDGFLIM,U,4))
 Q
SCL I DX>$P(DDGFLIM,U,2) D RC(DY,$P(DDGFLIM,U,2))
 Q
SELECT ;
 Q:'$D(@DDGFREF@("BKRC",DDGFWIDB,DY))
 G SELECT^DDGFBSEL
 ;
SAVE ;Save data
 G SAVE^DDGFSV
 ;
BKADD ;Add a new block
 G ADD^DDGFBK
 ;
HBKADD ;Add a header block
 G ADD^DDGFHBK
 ;
HELP ;Invoke help screens
 D ^DDGFH,REFRESH^DDGF,RC(DY,DX)
 Q
 ;
TO W $C(7)
QUIT ;
EXIT ;
VIEW S DDGFE=1
 Q
CLEANUP ;
 S DDGFDY=DY,DDGFDX=DX
 D CLOSE^DDGLIBW(DDGFWIDB,1)
 I $D(DDGFORIG) D
 . N A
 . S A=$$AREA^DDGLIBW(DDGFWID)
 . D DESTROY^DDGLIBW(DDGFWID,1)
 . D CREATE^DDGLIBW(DDGFWID,A,$P(@DDGFREF@("F",DDGFPG),U,3)]"")
 . D BLK^DDGFUPDB(.DDGFORIG)
 E  D OPEN^DDGLIBW(DDGFWID)
 S DY=IOSL-6,DX=46 X IOXY W $J("",13)
 S DY=IOSL-1,DX=0 X IOXY W $P(DDGLCLR,DDGLDEL)_$P(DDGLVID,DDGLDEL)_"<PF1>Q=Quit  <PF1>E=Exit  <PF1>S=Save  <PF1>V=Block Viewer  <PF1>H=Help"_$P(DDGLVID,DDGLDEL,10)
 D RC(DDGFDY,DDGFDX)
 K DDGFDY,DDGFDX,DDGFBV,DDGFEBV,DDGFORIG
 Q
 ;
PAINT ;Paint block displayer window
 N B,C,S,DY,DX
 D CLOSE^DDGLIBW(DDGFWID,1)
 S DY=IOSL-6,DX=46 X IOXY W "BLOCK VIEWER"
 S DY=IOSL-1,DX=0 X IOXY W $P(DDGLCLR,DDGLDEL)_$P(DDGLVID,DDGLDEL)_"<PF1>V=Main Screen  <PF1>H=Help"_$P(DDGLVID,DDGLDEL,10)
 I $$EXIST^DDGLIBW(DDGFWIDB) D FOCUS^DDGLIBW(DDGFWIDB) Q
 D CREATE^DDGLIBW(DDGFWIDB,$P(DDGFLIM,U,1,2)_U_($P(DDGFLIM,U,3)-$P(DDGFLIM,U,1)+1)_U_($P(DDGFLIM,U,4)-$P(DDGFLIM,U,2)+1),$P(@DDGFREF@("F",DDGFPG),U,3)]"")
 S B="" F  S B=$O(@DDGFREF@("F",DDGFPG,B)) Q:B=""  D
 . S C=@DDGFREF@("F",DDGFPG,B)
 . S S=$P(C,U,4)
 . S:$P(C,U,3)'<IOM S=$E(S,1,IOM-$P(C,U,2)-1)
 . D WRITE^DDGLIBW(DDGFWIDB,S,$P(C,U)-$P(DDGFLIM,U),$P(C,U,2)-$P(DDGFLIM,U,2))
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q
 ;
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGF("IN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGF("IN")'[(U_S_U) Y=-1
 ;
 I DDGF("IN")[(U_S_U),S'=$C(27) S Y=$P(DDGF("OUT"),U,$L($P(DDGF("IN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q

DDGF4
DDGF4 ;SFISC/MKO-ACTIONS AFTER BLOCK SELECTION ;02:49 PM  12 Oct 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Input:
 ;  B     = Block number
 ;  C     = Block name
 ;  C1    = Block $Y
 ;  C2    = Block $X1
 ;  C3    = Block $X2
 ;  DDGFHDR = 1, if block is immobile (header block)
 ;
 N DDGFE
 S:'$G(DDGFHDR) DDGFHDR=0
 D PAINTS
 ;
 S DDGFE=0 F  S Y=$$READ W:$T(@Y)="" $C(7) D:$T(@Y)]"" @Y Q:DDGFE
 D CLEANUP
 Q
 ;
LNU Q:C1'>$P(DDGFLIM,U)!DDGFHDR
 D REDRAW
 S C1=C1-1,DY=DY-1
 D PAINTS
 Q
LND Q:C1'<$P(DDGFLIM,U,3)!DDGFHDR
 D REDRAW
 S C1=C1+1,DY=DY+1
 D PAINTS
 Q
CHR Q:C2'<$P(DDGFLIM,U,4)!DDGFHDR
 D REDRAW
 S C2=C2+1,DX=DX+1
 D PAINTS
 Q
CHL Q:C2'>$P(DDGFLIM,U,2)!DDGFHDR
 D REDRAW
 S C2=C2-1,DX=DX-1
 D PAINTS
 Q
TBR N X
 Q:C2+$L(C)>$P(DDGFLIM,U,4)!DDGFHDR
 D REDRAW
 S X=$$MIN(5,$P(DDGFLIM,U,4)-C2-$L(C)+1)
 S C2=C2+X,DX=DX+X
 D PAINTS
 Q
TBL N X
 Q:C2'>$P(DDGFLIM,U,2)!DDGFHDR
 D REDRAW
 S X=$$MIN(5,C2-$P(DDGFLIM,U,2))
 S C2=C2-X,DX=DX-X
 D PAINTS
 Q
SCT Q:C1'>$P(DDGFLIM,U)!DDGFHDR
 D REDRAW
 S (C1,DY)=$P(DDGFLIM,U)
 D PAINTS
 Q
SCB Q:C1'<$P(DDGFLIM,U,3)!DDGFHDR
 D REDRAW
 S (C1,DY)=$P(DDGFLIM,U,3)
 D PAINTS
 Q
SCR N X
 Q:C2+$L(C)>$P(DDGFLIM,U,4)!DDGFHDR
 D REDRAW
 S X=$P(DDGFLIM,U,4)-C2-$L(C)+1
 S C2=C2+X,DX=DX+X
 D PAINTS
 Q
SCL N X
 Q:C2'>$P(DDGFLIM,U,2)!DDGFHDR
 D REDRAW
 S X=C2-$P(DDGFLIM,U,2)
 S C2=C2-X,DX=DX-X
 D PAINTS
 Q
 ;
EDIT ;Edit block parameters
 G:'$G(DDGFHDR) EDIT^DDGFBK
 G EDIT^DDGFHBK
 ;
REORDER ;Reorder fields on block
 D EN^DDGFORD(B)
 Q
 ;
TO ;Time-out
 W $C(7)
 G DESELECT
 ;
DESELECT ;
 S DDGFE=1
 Q
 ;
CLEANUP ;
 I '$G(DDGFBDEL) D
 . S C3=C2+$L(C)-1
 . S @DDGFREF@("F",DDGFPG,B)=C1_U_C2_U_C3_U_C_U_1,DDGFCHG=1
 . S @DDGFREF@("BKRC",DDGFWIDB,C1,C2,C3,B)=$S($G(DDGFHDR):"H",1:"")
 ;
 I '$G(DDGFEBV),'$G(DDGFBDEL) D
 . D WRITE^DDGLIBW(DDGFWIDB,C,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2))
 . X IOXY
 K DDGFHDR,DDGFBDEL
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q
 ;
REDRAW ;
 D REPAINT^DDGLIBW(DDGFWIDB,(C1-$P(DDGFLIM,U))_U_(C2-$P(DDGFLIM,U,2))_U_1_U_$$MIN($L(C),$P(DDGFLIM,U,4)-C2+1))
 Q
 ;
PAINTS ;
 N Y,X
 S Y=DY,X=DX
 S DY=C1,DX=C2 X IOXY
 W $P(DDGLVID,DDGLDEL,6)_$E(C,1,$$MIN($L(C),$P(DDGFLIM,U,4)-C2+1))_$P(DDGLVID,DDGLDEL,10)
 D RC(Y,X)
 Q
 ;
MIN(X,Y,Z) ;Return the minimum of two or three numbers
 N A
 S A=$S(X<Y:X,1:Y)
 Q:$G(Z)="" A
 Q $S(A<Z:A,1:Z)
 ;
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGF("SIN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGF("SIN")'[(U_S_U) Y=-1
 ;
 I DDGF("SIN")[(U_S_U),S'=$C(27) S Y=$P(DDGF("SOUT"),U,$L($P(DDGF("SIN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q

DDGFADL
DDGFADL ;SFISC/MKO-ADJUST DATA LENGTH ;11:28 AM  22 Dec 1993
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DDGFE
 D DRAW(1)
 S DDGFE=0 F  S Y=$$READ W:$T(@Y)="" $C(7) D:$T(@Y)]"" @Y Q:DDGFE
 Q
 ;
CHR Q:L'<($P(DDGFLIM,U,4)-D2+1)
 S L=L+1,D=D_"_"
 D DRAW(1)
 Q
CHL Q:L<2
 S L=L-1,D=$E(D,1,$L(D)-1)
 D DRAW(-1)
 Q
DONE ;
 S DDGFE=1,D3=D2+L-1,DDGFDY=DY,DDGFDX=DX
 S DY=IOSL-6,DX=IOM-9
 X IOXY W $J("",7)
 S DY=DDGFDY,DX=DDGFDX X IOXY
 K DDGFDY,DDGFDX
 Q
DRAW(I) ;Draw line
 ;I = 1 if we've increased the data length, -1 if we've decreased it
 ;
 N S,X,Y
 S X=DX,Y=DY
 S DY=D1,DX=D2 X IOXY
 W $P(DDGLVID,DDGLDEL,6)_D_$P(DDGLVID,DDGLDEL,10)_$E(" ",1,I=-1)
 S DY=IOSL-6,DX=IOM-9,S="L="_L X IOXY W S_$J("",7-$L(S))
 I I=-1 D REPAINT^DDGLIBW(DDGFWID,D1_U_(D2+L)_U_1_U_1)
 ;
 S DX=X,DY=Y X IOXY
 Q
 ;
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGF("DIN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGF("DIN")'[(U_S_U) Y=-1
 ;
 I DDGF("DIN")[(U_S_U),S'=$C(27) S Y=$P(DDGF("DOUT"),U,$L($P(DDGF("DIN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q

DDGFAPC
DDGFAPC ;SFISC/MKO-ADJUST PAGE COORDINATES ;01:16 PM  19 Jan 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Input:
 ; T  = PTOP: top of page
 ;      PBRC: bottom right corner of page
 ;Returns:
 ; DDGFLIM
 ;
 N DDGFE,P1,P2,P3,P4
 ;
 D SETUP
 S DDGFE=0 F  S Y=$$READ W:$T(@Y)="" $C(7) D:$T(@Y)]"" @Y Q:DDGFE
 D CLEANUP
 Q
 ;
DESELECT ;
 S DDGFE=1
 Q
 ;
LNU Q:DY'>$P(DDGFLIM,U)
 D MV(DY-1,DX)
 Q
LND Q:DY'<$P(DDGFLIM,U,3)
 D MV(DY+1,DX)
 Q
CHR Q:DX'<$P(DDGFLIM,U,4)
 D MV(DY,DX+1)
 Q
CHL Q:DX'>$P(DDGFLIM,U,2)
 D MV(DY,DX-1)
 Q
TBR Q:DX'<$P(DDGFLIM,U,4)
 D MV(DY,DX+$$MIN(5,$P(DDGFLIM,U,4)-DX))
 Q
TBL Q:DX'>$P(DDGFLIM,U,2)
 D MV(DY,DX-$$MIN(5,DX-$P(DDGFLIM,U,2)))
 Q
SCT Q:DY'>$P(DDGFLIM,U)
 D MV($P(DDGFLIM,U),DX)
 Q
SCB Q:DY'<$P(DDGFLIM,U,3)
 D MV($P(DDGFLIM,U,3),DX)
 Q
SCR Q:DX'<$P(DDGFLIM,U,4)
 D MV(DY,$P(DDGFLIM,U,4))
 Q
SCL Q:DX'>$P(DDGFLIM,U,2)
 D MV(DY,$P(DDGFLIM,U,2))
 Q
 ;
MV(DDGFY,DDGFX) ;
 I T="PTOP" D
 . F DDGFC=P1_U_P2,P1_U_P4,P3_U_P2,P3_U_P4 D REPALL^DDGLIBW(DDGFC_"^1^1")
 . S P1=P1+DDGFY-DY,P2=P2+DDGFX-DX,P3=P3+DDGFY-DY,P4=P4+DDGFX-DX
 ;
 I T="PBRC" D
 . D:DDGFX'=DX REPALL^DDGLIBW(P1_U_P4_"^1^1")
 . D:DDGFY'=DY REPALL^DDGLIBW(P3_U_P2_"^1^1")
 . D REPALL^DDGLIBW(P3_U_P4_"^1^1")
 . S P3=P3+DDGFY-DY,P4=P4+DDGFX-DX
 ;
 D CORNER()
 S DY=DDGFY,DX=DDGFX
 K DDGFC
 Q
 ;
CORNER(N) ;Draw corners of box
 ;In: P1,P2,P3,P4,T; if N:normal video
 N DY,DX
 S DY=P1,DX=P2 X IOXY
 W $P(DDGLGRA,DDGLDEL)_$S($G(N):"",1:$P(DDGLVID,DDGLDEL,6))_$P(DDGLGRA,DDGLDEL,5)
 S DY=P1,DX=P4 X IOXY W $P(DDGLGRA,DDGLDEL,6)
 S DY=P3,DX=P2 X IOXY W $P(DDGLGRA,DDGLDEL,7)
 S DX=P4 X IOXY
 W $P(DDGLGRA,DDGLDEL,8)_$S($G(N):"",1:$P(DDGLVID,DDGLDEL,10))_$P(DDGLGRA,DDGLDEL,2)
 Q
 ;
MIN(X,Y,Z) ;Return the minimum of two or three numbers
 N A
 S A=$S(X<Y:X,1:Y)
 Q:$G(Z)="" A
 Q $S(A<Z:A,1:Z)
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q
 ;
SETUP ;Initial setup
 S DDGFDY=DY,DDGFDX=DX
 ;
 ;Get page coordinates
 S P4=@DDGFREF@("F",DDGFPG)
 S P1=$P(P4,U),P2=$P(P4,U,2),P3=$P(P4,U,3),P4=$P(P4,U,4)
 S DDGFAREA=P1_U_P2_U_(P3-P1+1)_U_(P4-P2+1)
 ;
 ;Draw corners in reverse video, reset DDGFLIM
 D CORNER()
 I T="PTOP" S DDGFLIM=0_U_(DX-P2)_U_(DY+IOSL-8-P3)_U_(DX+IOM-2-P4)
 I T="PBRC" S DDGFLIM=P1+2_U_(P2+2)_U_(IOSL-8)_U_(IOM-2)
 Q
 ;
CLEANUP ;Final cleanup
 I DDGFDY'=DY!(DDGFDX'=DX) D
 . D PAGE^DDGFUPDP(P1,P2,P3,P4,T,DDGFAREA)
 E  D CORNER(1) S DDGFLIM=P1_U_P2_U_P3_U_P4
 ;
 D RC(DY,DX)
 K DDGFDY,DDGFDX,DDGFAREA
 Q
 ;
READ() N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGF("SIN")'[(U_S) D  I Y=-1 W $C(7) Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGF("SIN")'[(U_S_U) Y=-1
 ;
 I DDGF("SIN")[(U_S_U),S'=$C(27) S Y=$P(DDGF("SOUT"),U,$L($P(DDGF("SIN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1 W $C(7)
 Q

DDGFASUB
DDGFASUB ;SFISC/MKO-MANAGE "ASUB" ARRAY ;12:08 PM  14 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ALL ;Get subpages into @DDGFREF@("ASUB")
 N P,B S P=0
 F  S P=$O(^DIST(.403,+DDGFFM,40,P)) Q:'P  D:$P($G(^(P,1)),U,2)]"" ADD(P)
 Q
 ;
ADD(P) ;
 ;Setup @DDGFREF@("ASUB",pg,bk,ddo)=subpage P
 N MP,MB,MF,X
 S MF=$$UC($P(^DIST(.403,+DDGFFM,40,P,1),U,2)) Q:MF=""
 S MP=$P(MF,",",3),MB=$P(MF,",",2),MF=$P(MF,",")
 ;
 S MP=$O(^DIST(.403,+DDGFFM,40,$S(MP=+$P(MP,"E"):"B",1:"C"),MP,""))
 Q:MP=""
 ;
 I MB=+$P(MB,"E") D
 . S MB=$O(^DIST(.403,+DDGFFM,40,MP,40,"AC",MB,""))
 E  D
 . S MB=$O(^DIST(.404,"B",$$UC(MB),"")) Q:MB=""
 . S MB=$O(^DIST(.403,+DDGFFM,40,MP,40,"B",MB,""))
 Q:MB=""
 ;
 S X=$S(MF=+$P(MF,"E"):"B",$D(^DIST(.404,MB,40,"D",MF)):"D",1:"C")
 S MF=$O(^DIST(.404,MB,40,X,MF,"")) Q:MF=""
 S @DDGFREF@("ASUB",MP,MB,MF)=P,@DDGFREF@("ASUB","B",P,MP,MB,MF)=""
 Q
 ;
DEL(P) ;
 ;Delete subpage DDGFPG from @DDGFREF@("ASUB")
 Q:'$D(@DDGFREF@("ASUB","B",P))
 ;
 N MP,MB,MF
 S MP="" F  S MP=$O(@DDGFREF@("ASUB","B",P,MP)) Q:MP=""  D
 . S MB="" F  S MB=$O(@DDGFREF@("ASUB","B",P,MP,MB)) Q:MB=""  D
 .. S MF="" F  S MF=$O(@DDGFREF@("ASUB","B",P,MP,MB,MF)) Q:MF=""  D
 ... K @DDGFREF@("ASUB","B",P,MP,MB,MF),@DDGFREF@("ASUB",MP,MB,MF)
 Q
 ;
EDIT(P) ;
 ;Edit "ASUB" to reflect new parent page
 D DEL(P),ADD(P)
 Q
UC(X) ;
 Q $$UP^DILIBF(X)  ;**

DDGFBK
DDGFBK ;SFISC/MKO-ADD, EDIT, DELETE BLOCK ;2:11 PM  13 Sep 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ADD ;Add a new block
 N B,C1,C2,C3
 S DDGFDY=DY,DDGFDX=DX
 ;
 ;Invoke form to enter block name
 K DDGFBNUM,DDGFBNAM
 D DDS(.404,"[DDGF BLOCK ADD]")
 G:'$D(DDGFBNUM) ADDQ
 ;
 ;Ask whether block should be added or indicate duplicate block
 K DDGFANS
 S DDSPAGE=$S($P(^DIST(.403,+DDGFFM,40,DDGFPG,0),U,2)=DDGFBNUM!$D(^(40,"B",DDGFBNUM)):21,1:11)
 D DDS(.404,"[DDGF BLOCK ADD]","",DDSPAGE)
 G:DDSPAGE=21 ADDQ
 I '$G(DDGFANS) D  G ADDQ
 . I $D(^DIST(.404,DDGFBNUM,0))#2,'$P(^(0),U,2) D
 .. N DIK,DA
 .. S DIK="^DIST(.404,",DA=DDGFBNUM
 .. D ^DIK
 K DDSPAGE,DDGFANS
 ;
 ;Add block to page
 S DIC="^DIST(.403,+DDGFFM,40,DDGFPG,40,",DIC(0)="L"
 S DA(2)=+DDGFFM,DA(1)=DDGFPG
 S DIC("P")=$P(^DD(.4031,40,0),U,2)
 S (DINUM,X)=DDGFBNUM
 K DO,DD D FILE^DICN K DINUM,X
 G:Y=-1 ADDQ
 ;
 ;Stuff in values for block order, coordinates, and type
 S DIE=DIC,DA=+Y
 S DDGFC=DDGFDY-$P(DDGFLIM,U)+1_","_(DDGFDX-$P(DDGFLIM,U,2)+1)
 S DR="1////"_($O(^DIST(.403,+DDGFFM,40,DDGFPG,40,"AC",""),-1)+1\1)_";2////"_DDGFC_";3////e"
 D ^DIE K DA,DIC,DIE,DR,X,Y,DDGFC
 ;
 ;If this looks like a brand new block, stuff in DD number
 I $L(^DIST(.404,DDGFBNUM,0),U)=1,'$O(^(0)) D
 . S DIE="^DIST(.404,",DA=DDGFBNUM
 . S DR="1////"_$P(^DIST(.403,+DDGFFM,0),U,8)
 . D ^DIE K DA,DIE,DR
 ;
 D BK^DDGFLOAD(DDGFPG,DDGFBNUM,$P(DDGFLIM,U),$P(DDGFLIM,U,2),DDGFDY,DDGFDX,0,1)
 ;
 S DY=DDGFDY,DX=DDGFDX
 S B=DDGFBNUM,C=$P(@DDGFREF@("F",DDGFPG,B),U,4)
 S C1=DY,C2=DX,C3=C2+$L(DDGFBNAM)-1
 S DDGFADD=1
 K DDGFBNUM,DDGFBNAM
 S:$G(DDGFBV) DDGFORIG(B)=DY_U_DX
 G EDIT
 ;
ADDQ ;Adding aborted
 D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 K DDGFANS,DDGFBNAM,DDGFBNUM,DDGFDX,DDGFDY,DDSPAGE,DA,DIC,Y
 Q
 ;
EDIT ;Edit block
 ;In: B,C1,C2,C3,C
 S DDGFDY=DY,DDGFDX=DX
 S DDGFBK=B,DDGFC1=C1,DDGFC2=C2,DDGFC3=C3
 S DDGFBKCO=C1-$P(DDGFLIM,U)+1_","_(C2-$P(DDGFLIM,U,2)+1)
 S DDGFBKNO=C
 ;
 ;Invoke form to edit block
 S DDSFILE=.403,DDSFILE(1)=.4032
 S DA(2)=+DDGFFM,DA(1)=DDGFPG,DA=B
 S DR="[DDGF BLOCK EDIT]",DDSPARM="KTW"
 D ^DDS K DDSFILE,DA,DR,DDSPARM
 ;
 ;If block was deleted, remove data from DDGFREF
 I $D(^DIST(.403,+DDGFFM,40,DDGFPG,40,DDGFBK,0))[0 D DELETE(DDGFBK) G EDITQ
 ;
 S:$D(DDGFBKCN)[0 DDGFBKCN=DDGFBKCO
 S:$D(DDGFBKNN)[0 DDGFBKNN=DDGFBKNO
 ;
 S C=DDGFBKNN
 S C1=$P(DDGFBKCN,",")-1+$P(DDGFLIM,U)
 S C2=$P(DDGFBKCN,",",2)-1+$P(DDGFLIM,U,2)
 S C3=C2+$L(C)-1
 ;
 ;Update TMP if coordinates or name changed, or new block
 I DDGFBKCN'=DDGFBKCO!(DDGFBKNN'=DDGFBKNO)!$G(DDGFADD) D
 . D WRITE^DDGLIBW(DDGFWIDB,$J("",$L(DDGFBKNO)),DDGFC1-$P(DDGFLIM,U),DDGFC2-$P(DDGFLIM,U,2),"",1)
 . D WRITE^DDGLIBW(DDGFWIDB,C,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"",1)
 ;
EDITQ D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 S:'$G(DDGFADD) DDGFE=1
 K DDGFADD,DDGFBK,DDGFBKCO,DDGFBKNO,DDGFBKCN,DDGFBKNN
 K DDGFC1,DDGFC2,DDGFC3,DDGFDX,DDGFDY
 Q
 ;
DELETE(B,E) ;Remove block from DDGFREF
 ;E : means don't set DDGFEBV or DDGFBDEL
 ;    (used by EDIT^DDGFHBK when a different header block is chosen)
 N F,N
 ;Remove from TMP
 S F="" F  S F=$O(@DDGFREF@("F",DDGFPG,B,F)) Q:F=""  D
 . S N=@DDGFREF@("F",DDGFPG,B,F)
 . K:$P(N,U,4)]"" @DDGFREF@("RC",DDGFWID,$P(N,U),$P(N,U,2),$P(N,U,3),B)
 . K:$P(N,U,8)>0 @DDGFREF@("RC",DDGFWID,$P(N,U,5),$P(N,U,6),$P(N,U,7),B)
 K @DDGFREF@("F",DDGFPG,B)
 ;
 ;If no blocks on page, set DDGFEBV to exit Block Viewer
 ;DDGFBDEL indicates block name should not be painted
 I $G(DDGFBV) D:'$G(E)
 . I '$P(^DIST(.403,+DDGFFM,40,DDGFPG,0),U,2),'$O(^(40,0)) S DDGFEBV=1
 . S DDGFBDEL=1
 E  D PG^DDGFLOAD(+DDGFFM,+DDGFPG,1,1)
 ;
 ;If used on no other forms, ask whether to delete from block file
 I '$O(^DIST(.403,"AB",B,"")),'$O(^DIST(.403,"AC",B,"")) D
 . K DDGFANS S DDGFBK=B
 . D DDS(.404,"[DDGF BLOCK DELETE]")
 . I $G(DDGFANS) S DIK="^DIST(.404,",DA=DDGFBK D ^DIK K DIK,DA
 . K DDGFANS,DDGFBK
 Q
 ;
DDS(DDSFILE,DR,DA,DDSPAGE) ;
 ;Call DDS
 S DDSPARM="KTW" D ^DDS K DDSPARM
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFBSEL
DDGFBSEL ;SFISC/MKO-SELECT BLOCK ;07:50 AM  23 Aug 1993
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Sets:
 ;  DDGFORIG(B) = original $Y^original $X for all blocks that were
 ;                  selected, since they were potentially moved
SELECT ;
 N B,C,C1,C2,C3
 N B1,X1,X2
 ;
 ;Which element is the cursor on?
 ;Set B=Block
 S X1="" K B
 F  S X1=$O(@DDGFREF@("BKRC",DDGFWIDB,DY,X1)) Q:X1=""!(DX<X1)  D
 . S X2=""
 . F  S X2=$O(@DDGFREF@("BKRC",DDGFWIDB,DY,X1,X2)) Q:X2=""  D  Q:$G(B)
 .. Q:DX>X2
 .. S B=$O(@DDGFREF@("BKRC",DDGFWIDB,DY,X1,X2,""))
 .. I @DDGFREF@("BKRC",DDGFWIDB,DY,X1,X2,B)="H",$O(^(B)) S B=$O(^(B))
 Q:'$G(B)
 ;
 ;Get caption and coordinates
 S B1=$G(@DDGFREF@("F",DDGFPG,B)) Q:B1=""
 S C1=$P(B1,U),C2=$P(B1,U,2),C3=$P(B1,U,3),C=$P(B1,U,4)
 ;
 S:@DDGFREF@("BKRC",DDGFWIDB,C1,C2,C3,B)="H" DDGFHDR=1
 D COVER
 ;
 K B1,X1,X2
 G ^DDGF4
 ;
COVER ;
 N H,O,L
 ;Clear and/or kill portions of DDGFREF
 K @DDGFREF@("BKRC",DDGFWIDB,C1,C2,C3,B)
 ;
 ;Remember original block coordinates
 S:$D(DDGFORIG(B))[0 DDGFORIG(B)=C1_U_C2
 ;
 ;Look for covered (hidden) fields
 ;Set H(B) - array of hidden fields
 S X1=""
 F  S X1=$O(@DDGFREF@("BKRC",DDGFWIDB,C1,X1)) Q:X1=""  D
 . S X2=""
 . F  S X2=$O(@DDGFREF@("BKRC",DDGFWIDB,C1,X1,X2)) Q:X2=""  D
 .. S H=$O(@DDGFREF@("BKRC",DDGFWIDB,C1,X1,X2,""))
 .. I H]"",$D(H(H))[0,$$OVERLAP(C2,C3,X1,X2) S H(H)=""
 ;
 ;Clear in buffer area occupied by element(s) selected
 ;If block on the page border, redraw the lines
 S L=$J("",$L(C)-$S(C3>$P(DDGFLIM,U,4):C3-$P(DDGFLIM,U,4),1:0))
 D WRITE^DDGLIBW(DDGFWIDB,L,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"",1)
 ;
 I $P(@DDGFREF@("F",DDGFPG),U,3) D
 . I C1=$P(DDGFLIM,U)!(C1=$P(DDGFLIM,U,3)) D
 .. S L=$TR(L," ",$P(DDGLGRA,DDGLDEL,3))
 .. S:C2=$P(DDGFLIM,U,2) $E(L)=$P(DDGLGRA,DDGLDEL,$S(C1=$P(DDGFLIM,U):5,1:7))
 .. S:C3'<$P(DDGFLIM,U,4) $E(L,$L(L))=$P(DDGLGRA,DDGLDE,$S(C1=$P(DDGFLIM,U):6,1:8))
 .. D WRITE^DDGLIBW(DDGFWIDB,L,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"G",1)
 . E  I C2=$P(DDGFLIM,U,2) D
 .. D WRITE^DDGLIBW(DDGFWIDB,$P(DDGLGRA,DDGLDEL,4),C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"G",1)
 . E  I C3'<$P(DDGFLIM,U,4) D
 .. D WRITE^DDGLIBW(DDGFWIDB,$P(DDGLGRA,DDGLDEL,4),C1-$P(DDGFLIM,U),$P(DDGFLIM,U,4)-$P(DDGFLIM,U,2),"G",1)
 ;
 ;Write to buffer the overlapped blocks(s)
 I $D(H)>1 S H="" F  S H=$O(H(H)) Q:H=""  D
 . S B1=$G(@DDGFREF@("F",DDGFPG,H)) Q:B1=""
 . D WRITE^DDGLIBW(DDGFWIDB,$P(B1,U,4),$P(B1,U)-$P(DDGFLIM,U),$P(B1,U,2)-$P(DDGFLIM,U,2),"",1)
 Q
 ;
OVERLAP(A1,A2,B1,B2) ;Does line with X-coords A1,A2 overlap B1,B2
 N T
 I A1<B1 S T=A1,A1=B1,B1=T,T=A2,A2=B2,B2=T
 Q A1'<B1&(A1'>B2)!(A2'<B1&(A2'>B2))

DDGFEL
DDGFEL ;SFISC/MKO-SELECT OR EDIT ELEMENT ;07:25 AM  7 Aug 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
SELECT ;Select an element
 N B,F,T,C,C1,C2,C3,D,D1,D2,D3,L,P1,P2
 D GETELEM(DY,DX) Q:$G(F)=""
 ;
 I F="P" G ^DDGFAPC
 ;
 ;Clear and/or kill portions of DDGFREF
 S:T="D" $P(@DDGFREF@("F",DDGFPG,B,F),U,5,8)=""
 K:T="C" @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C"),@DDGFREF@("F",DDGFPG,B,F)
 K:$D(D) @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F,"D")
 ;
 D COVER
 G ^DDGF2
 ;
EDIT ;Edit a caption or data length
 N B,F,T,C,C1,C2,C3,D,D1,D2,D3,L,P1,P2,X,Y
 D GETELEM(DY,DX) Q:"P"[$G(F)
 ;
 S DDGFCHG=1
 I T="C" D
 . K D,D1,D2,D3,L
 . S $P(@DDGFREF@("F",DDGFPG,B,F),U,1,4)="^^^"
 . K @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C")
 . D COVER
 . D
 .. N DX,DY
 .. S DY=IOSL-6,DX=IOM-9 X IOXY W "EDIT   "
 . ;
 . N DDGFCOD,DDGFX
 . D EN^DIR0(C1,C2,$L(C),1,C,"","","","KWT",.DDGFX,.DDGFCOD)
 . S X=DDGFX
 . I $P(DDGFCOD,U)="TO"!(X="!M") W $C(7) S X=C
 . E  I X["^" S X=C
 . E  X $P(^DD(.4044,1,0),U,5,999) I '$D(X) W $C(7) S X=C
 . S C3=C2+$L(X)-1
 . ;
 . S @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C")=""
 . D WRITE^DDGLIBW(DDGFWID,X,C1-P1,C2-P2)
 . I $L(X)<$L(C) D REPAINT^DDGLIBW(DDGFWID,(C1-P1)_U_(C3+1-P2)_U_1_U_($L(C)-$L(X)))
 . S $P(@DDGFREF@("F",DDGFPG,B,F),U,1,4)=C1_U_C2_U_C3_U_X,$P(^(F),U,9)=1
 ;
 I T="D" D
 . K C,C1,C2,C3
 . S $P(@DDGFREF@("F",DDGFPG,B,F),U,5,8)=""
 . K @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F)
 . D COVER,^DDGFADL
 . ;
 . S $P(@DDGFREF@("F",DDGFPG,B,F),U,5,8)=D1_U_D2_U_D3_U_L,$P(^(F),U,9)=1
 . S @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F,"D")=""
 . D WRITE^DDGLIBW(DDGFWID,D,D1-P1,D2-P2)
 ;
 D RC(DY,DX)
 Q
 ;
GETELEM(DY,DX) ;Which element is the cursor on
 ;Returns P,B,F,T,C,C1,C2,C3,D,D1,D2,D3,L,P1,P2
 ;If on pop-up page border, return only B="P",F="P",T="PTOP" or "PBRC"
 ;Set P=page,B=Block,F=DDO,T=type ("D" or "C")
 ;If cursor is not on anything, $G(F)=""
 ;
 Q:'$D(@DDGFREF@("RC",DDGFWID,DY))
 N X1,X2,F1
 S X1="" K F
 F  S X1=$O(@DDGFREF@("RC",DDGFWID,DY,X1)) Q:X1=""!(DX<X1)  D
 . S X2=""
 . F  S X2=$O(@DDGFREF@("RC",DDGFWID,DY,X1,X2)) Q:X2=""  D  Q:$G(F)
 .. Q:DX>X2
 .. S B=$O(@DDGFREF@("RC",DDGFWID,DY,X1,X2,""))
 .. S F=$O(@DDGFREF@("RC",DDGFWID,DY,X1,X2,B,""))
 .. S T=$O(@DDGFREF@("RC",DDGFWID,DY,X1,X2,B,F,""))
 Q:"P"[$G(F)
 ;
 S P1=$P(DDGFLIM,U),P2=$P(DDGFLIM,U,2)
 S F1=$G(@DDGFREF@("F",DDGFPG,B,F))
 ;
 ;Get caption, data, and coordinates
 S C1=$P(F1,U),C2=$P(F1,U,2),C3=$P(F1,U,3),C=$P(F1,U,4)
 I $P(F1,U,8)]"" D
 . S D1=$P(F1,U,5),D2=$P(F1,U,6),D3=$P(F1,U,7)
 . S L=$P(F1,U,8),D=$TR($J("",L)," ","_")
 Q
 ;
COVER ;Look for covered (hidden) fields
 ;Input:
 ; T,C,C1,C2,P1,P2
 ;H(DDO) - array of hidden fields
 ;Erase the element we've selected from buffer
 ;Redraw the element(s) that were covered
 N H,O,X1,X2,Y
 F Y="C1","D1" D
 . I Y="C1",T'="C" Q
 . I Y="D1",'$D(D) Q
 . S X1=""
 . F  S X1=$O(@DDGFREF@("RC",DDGFWID,@Y,X1)) Q:X1=""  D
 .. S X2=""
 .. F  S X2=$O(@DDGFREF@("RC",DDGFWID,@Y,X1,X2)) Q:X2=""  D
 ... N B
 ... S B=$O(@DDGFREF@("RC",DDGFWID,@Y,X1,X2,""))
 ... S O=$O(@DDGFREF@("RC",DDGFWID,@Y,X1,X2,B,""))
 ... I O]"",$D(H(O))[0 D
 .... I T="C",$$OVERLAP(C2,C3,X1,X2) S H(O)=DDGFPG_U_B
 .... E  I $D(D),$$OVERLAP(D2,D3,X1,X2) S H(O)=DDGFPG_U_B
 ;
 ;Clear in buffer area occupied by element(s) selected
 D:T="C" CLEAR(C,C1,C2,C3)
 D:$D(D) CLEAR(D,D1,D2,D3)
 ;
 ;Write to buffer the overlapped field(s)
 I $D(H) S H="" F  S H=$O(H(H)) Q:H=""  D
 . S O=$G(@DDGFREF@("F",$P(H(H),U),$P(H(H),U,2),H)) Q:O=""
 . D WRITE^DDGLIBW(DDGFWID,$P(O,U,4),$P(O,U)-P1,$P(O,U,2)-P2,"",1)
 . I $P(O,U,8)>0 D WRITE^DDGLIBW(DDGFWID,$TR($J("",$P(O,U,8))," ","_"),$P(O,U,5)-P1,$P(O,U,6)-P2,"",1)
 Q
 ;
OVERLAP(A1,A2,B1,B2) ;Does line with X-coords A1,A2 overlap B1,B2
 N T
 I A1<B1 S T=A1,A1=B1,B1=T,T=A2,A2=B2,B2=T
 Q A1'<B1&(A1'>B2)!(A2'<B1&(A2'>B2))
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q
 ;
CLEAR(C,C1,C2,C3) ;Clear in buffer area occupied by element(s) selected
 ;If on the page border, redraw the lines
 N L
 S L=$J("",$L(C)-$S(C3>$P(DDGFLIM,U,4):C3-$P(DDGFLIM,U,4),1:0))
 D WRITE^DDGLIBW(DDGFWID,L,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"",1)
 ;
 I $P(@DDGFREF@("F",DDGFPG),U,3) D
 . I C1=$P(DDGFLIM,U)!(C1=$P(DDGFLIM,U,3)) D
 .. S L=$TR(L," ",$P(DDGLGRA,DDGLDEL,3))
 .. S:C2=$P(DDGFLIM,U,2) $E(L)=$P(DDGLGRA,DDGLDEL,$S(C1=$P(DDGFLIM,U):5,1:7))
 .. S:C3'<$P(DDGFLIM,U,4) $E(L,$L(L))=$P(DDGLGRA,DDGLDEL,$S(C1=$P(DDGFLIM,U):6,1:8))
 .. D WRITE^DDGLIBW(DDGFWID,L,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"G",1)
 . E  I C2=$P(DDGFLIM,U,2) D
 .. D WRITE^DDGLIBW(DDGFWID,$P(DDGLGRA,DDGLDEL,4),C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"G",1)
 . E  I C3'<$P(DDGFLIM,U,4) D
 .. D WRITE^DDGLIBW(DDGFWID,$P(DDGLGRA,DDGLDEL,4),C1-$P(DDGFLIM,U),$P(DDGFLIM,U,4)-$P(DDGFLIM,U,2),"G",1)
 Q

DDGFFLD
DDGFFLD ;SFISC/MKO-EDIT A FIELD ;01:47 PM  22 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EDIT ;
 Q:$D(^DIST(.404,B,40,F,0))[0
 I T="D" Q:C]""  K @DDGFREF@("F",DDGFPG,B,F)
 ;
 S DDGFDY=DY,DDGFDX=DX
 S DDGFTYPE=$P(^DIST(.404,B,40,F,0),U,3)
 I 'DDGFTYPE D
 . I $G(^DIST(.404,B,40,F,20))'?."^" S DDGFTYPE=2 Q
 . I $P($G(^DIST(.404,B,0)),U,2),$G(^DIST(.404,B,40,F,1)) S DDGFTYPE=3
 G:'DDGFTYPE EDITQ
 ;
 S DDGFB2=@DDGFREF@("F",DDGFPG,B)
 S DDGFB1=$P(DDGFB2,U),DDGFB2=$P(DDGFB2,U,2)
 S DDGFDD=$P(^DIST(.404,B,0),U,2)
 S (DDGFSUP,DDGFSUP0)=$S(C]""&(DDGFTYPE'=1):$E(C,$L(C))'=":",1:"")
 S (DDGFCAP,DDGFCAP0)=$S(DDGFTYPE=1!DDGFSUP0:C,1:$E(C,1,$L(C)-1))
 S (DDGFCC,DDGFCC0)=$S(C]"":C1-DDGFB1+1_","_(C2-DDGFB2+1),1:"")
 I $D(D) D
 . S (DDGFDL,DDGFDL0)=L
 . S (DDGFDC,DDGFDC0)=D1-DDGFB1+1_","_(D2-DDGFB2+1)
 K DDGFB1,DDGFB2
 ;
 S DDSFILE=.404,DDSFILE(1)=.4044,DDSPARM="KSTW"
 S DR="[DDGF FIELD "_$P("CAPTION ONLY^FORM ONLY^DD^COMPUTED",U,DDGFTYPE)_"]"
 S DA=F,DA(1)=B
 D
 . N B,F,T,C,C1,C2,D,D1,D2,L,P1,P2
 . D ^DDS K DDSFILE,DDSPARM,DR,DDGFDD
 ;
 ;If caption, caption coords, data length, data coords, or suppress
 ;colon flag changed we need to update some local variables
 I $D(DA)#2,$G(DDSSAVE) D
 . S DDGFNDB=$G(@DDGFREF@("F",DDGFPG,B))
 . S:DDGFCAP="" (DDGFSUP,DDGFCC)=""
 . S DR=""
 . ;
 . I DDGFCAP'=DDGFCAP0!(DDGFSUP'=DDGFSUP0) D
 .. S C=DDGFCAP_$S(DDGFCAP]""&(DDGFTYPE'=1)&'DDGFSUP:":",1:"")
 .. S:DDGFCAP'=DDGFCAP0 DR=DR_"1////"_$S(DDGFCAP]"":DDGFCAP,1:"@")_";"
 .. S:DDGFSUP'=DDGFSUP0 DR=DR_"5.2////"_$S(DDGFSUP:1,1:"@")_";"
 . ;
 . D:DDGFCC'=DDGFCC0
 .. S C1=$S(DDGFCAP]"":$P(DDGFCC,",")-1+$P(DDGFNDB,U),1:"")
 .. S C2=$S(DDGFCAP]"":$P(DDGFCC,",",2)-1+$P(DDGFNDB,U,2),1:"")
 .. S DR=DR_"5.1////"_$S(DDGFCC]"":DDGFCC,1:"@")_";"
 . ;
 . D:$D(D)
 .. D:DDGFDC'=DDGFDC0
 ... S D1=$P(DDGFDC,",")-1+$P(DDGFNDB,U)
 ... S D2=$P(DDGFDC,",",2)-1+$P(DDGFNDB,U,2)
 ... S DR=DR_"4.1////"_DDGFDC_";"
 .. D:DDGFDL'=DDGFDL0
 ... S L=DDGFDL
 ... S D=$TR($J("",L)," ","_")
 ... S DR=DR_"4.2////"_DDGFDL_";"
 . ;
 . I T="D",C]"" D
 .. D WRITE^DDGLIBW(DDGFWID,C,C1-P1,C2-P2,"",1)
 .. S @DDGFREF@("RC",DDGFWID,C1,C2,C2+$L(C)-1,B,F,"C")=""
 . ;
 . I DR]"" D
 .. N B,F,T,C,C1,C2,D,D1,D2,L,P1,P2
 .. S DIE="^DIST(.404,"_DA(1)_",40,"
 .. S DR=$E(DR,1,$L(DR)-1)
 .. D ^DIE
 ;
 K DA,DDGFNDB
 K DDGFSUP,DDGFSUP0,DDGFCAP,DDGFCAP0,DDGFCC,DDGFCC0
 K DDGFDL,DDGFDL0,DDGFDC,DDGFDC0,DDSSAVE
 K DIE,DR
 ;
 D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
EDITQ S DDGFE=1
 K DDGFDY,DDGFDX,DDGFTYPE
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFFLDA
DDGFFLDA ;SFISC/MKO-ADD A FIELD ;2:22 PM  13 Sep 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ADD ;Add a field
 I '$O(^DIST(.403,+DDGFFM,40,DDGFPG,40,0)) D  Q
 . D MSG^DDGF($C(7)_"There are no blocks defined on this page.  To add a block, press <PF2>B.")
 . H 2 D MSG^DDGF()
 S DDGFDY=DY,DDGFDX=DX
 ;
 ;Invoke form to select block, field order, field type
 K DDGFBLCK,DDGFFORD,DDGFTYPE
 S DDSFILE=.404,DDSFILE(1)=.4044
 S DR="[DDGF FIELD ADD]",DDSPARM="KTW"
 D ^DDS K DDSFILE,DA,DR,DDSPARM
 ;
 I '$D(DDGFBLCK)!'$D(DDGFFORD)!'$D(DDGFTYPE) G ADDQ
 ;
 ;Get relative field coordinates
 S (DDGFCAP,DDGFCAP0)=""
 S (DDGFSUP,DDGFSUP0)=""
 S (DDGFCC,DDGFCC0)=""
 ;
 S DDGFB2=@DDGFREF@("F",DDGFPG,DDGFBLCK)
 S DDGFB1=$P(DDGFB2,U),DDGFB2=$P(DDGFB2,U,2)
 ;
 I DDGFTYPE=1 D
 . S DDGFCC0=DDGFDY-DDGFB1+1_","_(DDGFDX-DDGFB2+1)
 E  D
 . S DDGFD1=DDGFDY-DDGFB1+1,DDGFD2=DDGFDX-DDGFB2+1
 . S (DDGFDC,DDGFDC0)=DDGFD1_","_DDGFD2
 . S (DDGFDL,DDGFDL0)=1
 ;
 I DDGFTYPE'=1,DDGFD1<1!(DDGFD2<1) D  G ADDQ
 . D MSG^DDGF($C(7)_"Unable to add a field above or to the left of the block.")
 . H 2 D MSG^DDGF()
 ;
 K DDGFD1,DDGFD2
 ;
 ;Add field order to block file
 S DIC="^DIST(.404,"_DDGFBLCK_",40,",DIC(0)="L"
 S DIC("P")=$P(^DD(.404,40,0),U,2)
 S DA(1)=DDGFBLCK,X=DDGFFORD
 K DD,DO D FILE^DICN
 I Y=-1 K DIC,DA,Y D MSG^DDGF($C(7)_"Unable to add field.") H 2 D MSG^DDGF() G ADDQ
 ;
 ;Stuff values for field type, data coordinate, and data length
 ;If form-only field, also stuff in default read type
 S DIE=DIC,DA(1)=DDGFBLCK,DA=+Y
 S DR="2////"_DDGFTYPE
 S:DDGFTYPE'=1 DR=DR_";4.1////"_DDGFDC_";4.2////1"
 S:DDGFTYPE=2 DR=DR_";20.1////F"
 D ^DIE K DIC,DIE,DR,Y
 ;
 ;Invoke appropriate form
 S DDSFILE=.404,DDSFILE(1)=.4044,DDSPARM="CKTW"
 S DDGFDD=$P(^DIST(.404,DDGFBLCK,0),U,2)
 S DR="[DDGF FIELD "_$P("CAPTION ONLY^FORM ONLY^DD^COMPUTED",U,DDGFTYPE)_"]"
 D ^DDS K DDSFILE,DR,DDSPARM,DDGFDD
 ;
 I $D(DA)#2,DDGFTYPE'=1,$G(DDSCHANG)'=1 D
 . S DIK="^DIST(.404,"_DA(1)_",40,"
 . D ^DIK K DIK
 E  I $D(DA)#2 D
 . D SAVE
 . D LOADF
 ;
ADDQ ;Refresh and cleanup
 D REFRESH^DDGF
 D RC(DDGFDY,DDGFDX)
 ;
 K DA,DDSCHANG
 K DDGFB1,DDGFB2,DDGFD1,DDGFD2
 K DDGFSUP,DDGFSUP0,DDGFCAP,DDGFCAP0,DDGFCC,DDGFCC0
 K DDGFDL,DDGFDL0,DDGFDC,DDGFDC0
 K DDGFDY,DDGFDX,DDGFBLCK,DDGFFORD,DDGFTYPE
 Q
 ;
SAVE ;Save changes to caption, coordinates, data length, and suppress
 ;colon flag
 S:DDGFCAP="" (DDGFSUP,DDGFCC)=""
 S DR=""
 ;
 S:DDGFCAP]"" DR=DR_"1////"_DDGFCAP_";"
 S:DDGFCC]"" DR=DR_"5.1////"_DDGFCC_";"
 S:DDGFSUP DR=DR_"5.2////1;"
 ;
 I DDGFTYPE'=1 D
 . S:DDGFDC'=DDGFDC0 DR=DR_"4.1////"_DDGFDC_";"
 . S:DDGFDL'=DDGFDL0 DR=DR_"4.2////"_DDGFDL_";"
 I DR="" K DR Q
 ;
 S DIE="^DIST(.404,"_DA(1)_",40,"
 S DR=$E(DR,1,$L(DR)-1)
 D ^DIE K DIE,DR,Y
 Q
 ;
LOADF ;Set DDGFREF and window buffer
 N C,C1,C2,C3,D,D1,D2,D3,L
 ;
 I DDGFCAP="" D
 . S (C,C1,C2,C3)=""
 . K @DDGFREF@("F",DDGFPG,DDGFBLCK,DA)
 E  D
 . S C=DDGFCAP_$S(DDGFTYPE'=1&'DDGFSUP:":",1:"")
 . S C1=$P(DDGFCC,",")-1+DDGFB1
 . S C2=$P(DDGFCC,",",2)-1+DDGFB2
 . S C3=C2+$L(C)-1
 . ;
 . S @DDGFREF@("F",DDGFPG,DDGFBLCK,DA)=C1_U_C2_U_C3_U_C
 . S @DDGFREF@("RC",DDGFWID,C1,C2,C3,DDGFBLCK,DA,"C")=""
 . D WRITE^DDGLIBW(DDGFWID,C,C1-$P(DDGFLIM,U),C2-$P(DDGFLIM,U,2),"",1)
 ;
 I DDGFTYPE'=1 D
 . S D1=$P(DDGFDC,",")-1+DDGFB1
 . S D2=$P(DDGFDC,",",2)-1+DDGFB2
 . S D3=D2+DDGFDL-1
 . ;
 . S $P(@DDGFREF@("F",DDGFPG,DDGFBLCK,DA),U,5,8)=D1_U_D2_U_D3_U_DDGFDL
 . I D1]"",D2]"" S @DDGFREF@("RC",DDGFWID,D1,D2,D3,DDGFBLCK,DA,"D")=""
 . D:DDGFDL WRITE^DDGLIBW(DDGFWID,$TR($J("",DDGFDL)," ","_"),D1-$P(DDGFLIM,U),D2-$P(DDGFLIM,U,2),"",1)
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFFM
DDGFFM ;SFISC/MKO-FORM ADD, EDIT, SELECT ;2AUG2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
SEL ;Select another form
ADD ;Add a new form
 N X,DIR0 K DDGFABT
 S DDGFDY=+$G(DY),DDGFDX=+$G(DX),(DY,DX)=0 X IOXY
 W $P(DDGLCLR,DDGLDEL,2)
 X DDGLZOSF("EON"),DDGLZOSF("TRMOFF")
 ;
 ;Select file
FIL S DDS1=8107 D W^DICRW K DDS1 G:Y<0 ADDQ ;**CCO/NI  EDIT/CREATE FORM
 G:'$D(@(DIC_"0)")) ADDQ
 ;
 ;Select form
 W !
 S DIC("S")="I $P(^(0),U,8)=+DDGFFILE"
 I DUZ(0)'="@" S DIC("S")=DIC("S")_" N DDSI F DDSI=1:1:$L($P(^(0),U,3)) I DUZ(0)[$E($P(^(0),U,3),DDSI) Q"
 S DDGFFILE=Y,DIC=.403,DIC(0)="QEAL",D="F"_+Y
 D IX^DIC K DIC,D G:Y<0 ADDQ
 S DDGFY=Y
 ;
 ;Save data for previous form
 I DDGFCHG,$D(DDGFFM)#2 G:+DDGFFM=+DDGFY ADDQ D  G:$G(DDGFABT) ADDQ
 . N DDGFFNAM
 . S DIR(0)="Y",DDGFFNAM=$P(DDGFFM,U,2)
 . S DIR("A")="Save changes to form "_DDGFFNAM
 . S DIR("B")="YES"
 . S DIR("?",1)="  Enter 'Y' or press 'Return' to save changes."
 . S DIR("?",2)="  Enter 'N' to discard changes."
 . S DIR("?")="  Enter '^' to return to form "_DDGFFNAM
 . W ! D ^DIR K DIR I $D(DIRUT) K DIRUT,DUOUT,DTOUT S DDGFABT=1 Q
 . D SAVE^DDGFSV
 ;
 I $D(DDGFFM)#2,+DDGFFM'=+DDGFY D RECOMP^DDGF0
 ;
 S DDGFFM=$P(DDGFY,U,1,2)
 ;
 ;Stuff in values for form
 K DR S DIE=.403,DA=+DDGFY,DDGFNEW=$P(DDGFY,U,3)
 S:DDGFNEW DR="3////"_DUZ_";4///NOW"
 S DR=$S($G(DR)]"":DR_";",1:"")_"5///NOW"
 S:DDGFNEW DR=DR_";7////"_+DDGFFILE
 D ^DIE K DIE,DA,DR,D,%DT
 I DDGFNEW,$G(DUZ(0))]"" D
 . S $P(^DIST(.403,+DDGFFM,0),U,2,3)=DUZ(0)_U_DUZ(0)
 ;
 ;If this is a new form, create Page 1
 N GFT I DDGFNEW D  Q:$D(GFT)
 . K DD,DO
 . S DIC="^DIST(.403,+DDGFFM,40,",DIC("P")=$P(^DD(.403,40,0),U,2)
 . S DIC(0)="",DA(1)=+DDGFFM,X=1
 . D FILE^DICN I Y=-1 K DIC,Y Q
 . S DIE=DIC,DA=+Y,DR="2////1,1;7////Page 1"
 . D ^DIE K DIC,DIE,DA,DR,D,Y
SELPAGE .S Y=^DIC(+DDGFFILE,0,"GL") I $P($G(@(Y_"0)")),U,4)<999  D  I Y=1 D GFT K DDGFFM W !!,"DONE!",! Q
 ..N DIR S DIR(0)="Y",DIR("A")="Do you want your Form to begin with a display of all entries, for selection"
 ..S DIR("?")="Answer YES to save setup time!",DIR("?",1)="Your Form can automatically present a scrolling list of all entries"
 ..I $O(^DD(+DDGFFILE,0,"ID",0)) S DIR("?",2)="including IDENTIFIER fields"
 ..D ^DIR
 ;
 ;Clear data for previous form
 W $P(DDGLCLR,DDGLDEL,2)
 I $D(@DDGFREF) K @DDGFREF D DESTALL^DDGLIBW
 ;
 ;Get first page, load form
 S DDGFPG=$O(^DIST(.403,+DDGFFM,40,"B",""))
 I DDGFPG]"" S DDGFPG=$O(^DIST(.403,+DDGFFM,40,"B",DDGFPG,""))
 D PG^DDGFLOAD(+DDGFFM,DDGFPG),STATUS^DDGF
 S DDGFDY=$P(DDGFLIM,U),DDGFDX=$P(DDGFLIM,U,2)
 ;
ADDQQ X DDGLZOSF("EOFF"),DDGLZOSF("TRMON")
 D RC(DDGFDY,DDGFDX)
 K DDGFABT,DDGFDY,DDGFDX,DDGFNEW,DDGFY
 Q
 ;
 ;
GFT ;BUILD A SELECTION PAGE
 N DIC,FLD,LN,L,DLAYGO,GFTQUIT,GFTID,GFTPOS,DDGH
 S (DLAYGO,DIC)=.404,X=$P(DDGFY,U,2),DIC(0)="LX",DIC("DR")="1////"_+DDGFFILE D FILE^DICN ;CREATE NEW BLOCK FOR DATA
 S DDGFBLK=+Y Q:'$P(Y,U,3)
 S (DLAYGO,DIC)=.404,X=$P(DDGFY,U,2)_" HEADER",DIC(0)="LX",DIC("DR")="1////"_+DDGFFILE D FILE^DICN ;CREATE NEW HEADER BLOCK
 S DDGH=+Y
 S FLD=0,GFTID=U,GFTPOS=2
 S GFT=.01 F  S FLD=FLD+1 D  Q:$G(GFTQUIT)  S GFT=$O(^DD(+DDGFFILE,0,"ID",GFT)) Q:'GFT
 .D FIELD^DID(+DDGFFILE,GFT,"","FIELD LENGTH;LABEL","GFT(GFT)")
 .S L=GFT(GFT,"LABEL") I $L(GFTID)+$L(L)+$L(GFTID,U)>74 S GFTQUIT=1,FLD=FLD-1 Q  ;HEADER RESTRICTS NUMBER OF FIELDS
 .S LN=GFT(GFT,"FIELD LENGTH") S:LN>74 LN=74 S GFTID(FLD)=LN,GFTPOS(FLD)=GFTPOS,GFTPOS=GFTPOS+LN+2,GFTID(FLD,1)=GFT,GFTID=GFTID_L_U
 F  S L=GFTPOS-79\FLD Q:L<1  S LN=0 F X=1:1:FLD D
 .I GFTID(X)-1<6 Q
 .S GFTID(X)=GFTID(X)-1,GFTPOS=GFTPOS-1,GFTPOS(X)=GFTPOS(X)-LN,LN=LN+1 ;TRIM FIELD LENGTHS BY 1
 F X=1:1 Q:'$D(GFTID(X))  D
 .S DIC="^DIST(.404,"_DDGFBLK_",40,",DLAYGO=.4044,DA(1)=DDGFBLK,DIC(0)="LX"
 .S DIC("DR")="2////3;3.1////"_$P(GFTID,U,X+1)_";4////"_GFTID(X,1)_";4.1///2,"_GFTPOS(X)_";4.2///"_GFTID(X)
 .D FILE^DICN ;CREATE A DATA FIELD
 S DIC="^DIST(.404,"_DDGH_",40,",DA(1)=DDGH,DIC(0)="LX",X=1,DIC("DR")="2///4;4.1///1,1;4.2///80;30///S Y=$$HEADER^DDGFFM("_+DDGFFM_")"
 D FILE^DICN ;CREATE THE HEADER FIELD
 S GFT=^DIC(+DDGFFILE,0,"GL") I '$D(^DD(+DDGFFILE,0,"IX","B",+DDGFFILE,.01)) S GFT="F D=0:0 S D=$O("_GFT
 E  S GFT="S GFT="""" F  S GFT=$O("_GFT_"""B"",GFT)) Q:GFT=""""  F D=0:0 S D=$O("_GFT_"""B"",GFT," ;SHOW ENTRIES ALPHABETICALLY IF THERE IS A "B" X-REF
 S GFT=GFT_"D)) Q:'D  N Y S (Y,D0)=D "_$G(^DD(+DDGFFILE,0,"SCR"))_" X DICMX Q:'$D(D)"
 S DIE=.403,DA=+DDGFFM,DR="21///1" D ^DIE ;FORM'S RECORD SELECTION PAGE=1
 S DIC="^DIST(.403,"_DA_",40,1,40,",DA(2)=DA,DA(1)=1,(X,DINUM)=DDGFBLK,DIC(0)="UXL",DIC("P")=".4032IP",DLAYGO=.4032
 S DIC("DR")="1///1;2///2,1;3///e;5///15;98.1///"_+DDGFFILE_";98////^S X=GFT"
 D FILE^DICN ;ADD DATA BLOCK TO PAGE
 S DIE="^DIST(.403,"_+DDGFFM_",40,",DR="1////"_DDGH,DA=1 D ^DIE ;ADD HEADER BLOCK POINTER
 Q
 ;
 ;
HEADER(FORM) ;GIVES NICE HEADER LINE.  CALLED BY HEADER BLOCK COMPUTED EXPRESSION
 N B,X,F,S,L,D,FILE,Y,FILENAME,LABEL,LINE
 S X="",S=0,B=$O(^DIST(.403,FORM,"AY",1,0)) I 'B Q X
 S FILE=$P(^(B),U,3) Q:'FILE
 F F=0:0 S F=$O(^DIST(.403,FORM,"AY",1,B,F)) Q:'F  S Y=$G(^(F,"D")) Q:'Y  S:'$D(LINE) LINE=+Y Q:Y>LINE  D
 .S L=$P(Y,U,3) Q:'L
 .S D=$P(Y,U,4),LABEL=$$LABEL^DIALOGZ(FILE,D)
 .D:$L(LABEL)>L  S LABEL=$E(LABEL,1,L)
 ..N Z,T F Z=0:0 S Z=$O(^DIST(.404,B,40,Z)) Q:'Z  I $G(^(Z,1))=D S T=$P(^(0),U,5) I T]"",$L(T)<$L(LABEL) S LABEL=T Q  ;TRY SHORTER 'UNIQUE NAME'
 .I D=.01,$L(LABEL)+3<L S FILENAME=$$FILENAME^DIALOGZ(FILE) I $L(FILENAME)+$L(LABEL)<L S LABEL=FILENAME_" "_LABEL
 .S D=$P(Y,U,2),$E(X,D,D+L-1)=LABEL
 Q X
 ;
 ;
ADDQ I $D(DDGFFM)#2 D REFRESH^DDGF G ADDQQ
 K DDGFABT,DDGFDY,DDGFDX
 Q
 ;
EDIT ;Invoke form to edit form
 S DDGFDY=DY,DDGFDX=DX
 K DDSFILE S DDSFILE=.403
 S DA=+DDGFFM,DR="[DDGF FORM EDIT]",DDSPARM="KTW"
 D ^DDS K DDSFILE,DR,DDSPARM
 ;
 S $P(DDGFFM,U,2)=$P(^DIST(.403,+DDGFFM,0),U)
 D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
EDITQ K DDGFDY,DDGFDX
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N DDGFS
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,DDGFS="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W DDGFS_$J("",7-$L(DDGFS))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFH
DDGFH ;SFISC/MKO-HELP SCREENS ;09:20 AM  7 Jul 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
HLP ;Print help screens, refresh screen
 D HLP^DDGLIBH(9251,9259,"DDGFH")
 D REFRESH^DDGF,RC(DY,DX)
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N DDGFS
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,DDGFS="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W DDGFS_$J("",7-$L(DDGFS))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFHBK
DDGFHBK ;SFISC/MKO-ADD, EDIT, DELETE HEADER BLOCK ;01:48 PM  22 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ADD ;Add a header block
 ;Check to see if a header block already exists for this page
 S DDGFBH=$P(^DIST(.403,+DDGFFM,40,DDGFPG,0),U,2)
 I DDGFBH D MSG^DDGF($C(7)_"This page already has a header block.") H 2 D MSG^DDGF() K DDGFBH Q
 ;
 N B
 S DDGFDY=DY,DDGFDX=DX
 ;
 ;Invoke form to enter block name
 K DDGFBNUM,DDGFBNAM
 D DDS(.404,"[DDGF HEADER BLOCK SELECT]")
 G:$G(DDGFBNUM)=DDGFBH!'$G(DDGFBNUM) ADDQ
 ;
 I $D(^DIST(.403,+DDGFFM,40,DDGFPG,40,"B",DDGFBNUM)) D DDS(.404,"[DDGF BLOCK ADD]","",21) G ADDQ
 ;
 S $P(^DIST(.403,+DDGFFM,40,DDGFPG,0),U,2)=DDGFBNUM
 ;
 ;If this looks like a brand new block, stuff in DD number
 I $L(^DIST(.404,DDGFBNUM,0),U)=1,'$O(^(0)) D
 . S DIE="^DIST(.404,",DA=DDGFBNUM
 . S DR="1////"_$P(^DIST(.403,+DDGFFM,0),U,8)
 . D ^DIE K DIE,DA,DR
 ;
 D:DDGFBH DELETE^DDGFBK(DDGFBH,1)
 D BK^DDGFLOAD(DDGFPG,DDGFBNUM,$P(DDGFLIM,U),$P(DDGFLIM,U,2),0,0,1,1)
 ;
 S DY=DDGFDY,DX=DDGFDX
 S B=DDGFBNUM,C=$P(@DDGFREF@("F",DDGFPG,B),U,4)
 S DDGFADD=1
 K DDGFBNUM,DDGFBNAM
 G EDIT
 ;
ADDQ ;Abort adding a header block
 D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 K DDGFANS,DDGFBH,DDGFBNUM,DDGFBNAM,DDGFDY,DDGFDX
 Q
 ;
EDIT ;Edit/Delete header block
 ;In: B,C
 N C1,C2,C3
 S DDGFDY=DY,DDGFDX=DX,DDGFBH=B
 S (DDGFBKNN,DDGFBKNO)=C
 S DDSFILE=.403,DDSFILE(1)=.4031,DA(1)=+DDGFFM,DA=DDGFPG
 S DR="[DDGF HEADER BLOCK EDIT]",DDSPARM="KTW"
 D ^DDS K DDSFILE,DA,DR,DDSPARM
 S DDGFBHN=$P(^DIST(.403,+DDGFFM,40,DDGFPG,0),U,2)
 ;
 I DDGFBHN'=DDGFBH D
 . D DELETE^DDGFBK(DDGFBH,DDGFBHN)
 . D:DDGFBHN BK^DDGFLOAD(DDGFPG,DDGFBHN,$P(DDGFLIM,U),$P(DDGFLIM,U,2),0,0,1,1)
 ;
 S C=DDGFBKNN,B=DDGFBHN
 ;
 ;Update TMP if coordinates or name changed, or new block
 I DDGFBKNN'=DDGFBKNO!$G(DDGFADD) D
 . D WRITE^DDGLIBW(DDGFWIDB,$J("",$L(DDGFBKNO)),$P(DDGFLIM,U),$P(DDGFLIM,U,2),"",1)
 . D WRITE^DDGLIBW(DDGFWIDB,C,$P(DDGFLIM,U),$P(DDGFLIM,U,2),"",1)
 ;
 D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 S:'$G(DDGFADD) DDGFE=1
 K DDGFADD,DDGFBH,DDGFBHN,DDGFBKNN,DDGFBKNO,DDGFDY,DDGFDX
 Q
 ;
DDS(DDSFILE,DR,DA,DDSPAGE) ;
 ;Call DDS
 S DDSPARM="KTW" D ^DDS K DDSPARM
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFLOAD
DDGFLOAD ;SFISC/MKO-LOAD PAGE/BLOCK ;12:33 PM  29 Mar 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PG(S,P,V,R) ;
 ;Load and paint page
 ;Called when a new form or page is selected
 ;If Page is not pop-up close all windows first
 ;Input:
 ; S = internal form number
 ; P = internal page number
 ; V = 1 if buffer should be updated but nothing painted
 ;     (new windows are still given focus)
 ; R = 1 to reload blocks/fields on page even if loaded before
 ;Returns:
 ; DDGFWID  = Window number for a given page
 ; DDGFWIDB = Window number of block displayer for a given page
 ; DDGFLIM  = Boundaries within which cursor can be moved
 ;
 I $D(^DIST(.403,+$G(S),40,+$G(P),0))[0 S DDGFWID="P0",DDGFWIDB="B0",DDGFLIM="0^0^"_(IOSL-8)_U_(IOM-2),DDGFPG=0 Q
 ;
 S DDGFWID="P"_DDGFPG,DDGFWIDB="B"_DDGFPG
 I $$EXIST^DDGLIBW(DDGFWID),$G(R) D DESTROY^DDGLIBW(DDGFWID,1)
 I $$EXIST^DDGLIBW(DDGFWID),'$G(R) D  Q
 . S DDGFLIM=$P(@DDGFREF@("F",P),U,1,4)
 . I $P(DDGFLIM,U,3,4)?."^" D
 .. S $P(DDGFLIM,U,3,4)=IOSL-8_U_(IOM-2)
 .. D CLOSEALL^DDGLIBW($G(V))
 . D FOCUS^DDGLIBW(DDGFWID,$G(V))
 ;
 N P1,P2,P3,P4,B,B1,B2
 ;
 ;Get page coordinates
 I $D(@DDGFREF@("F",+P))#2 D
 . N N
 . S N=@DDGFREF@("F",+P)
 . S P1=$P(N,U),P2=$P(N,U,2),P3=$P(N,U,3),P4=$P(N,U,4)
 E  D
 . S P2=$P(^DIST(.403,+S,40,+P,0),U,3),P3=$P(^(0),U,7)
 . S P1=$P(P2,",")-1,P2=$P(P2,",",2)-1
 . S:P1<0 P1=0 S:P2<0 P2=0
 . S:P3]"" P4=$P(P3,",",2)-1,P3=$P(P3,",")-1
 . S @DDGFREF@("F",P)=P1_U_P2_U_$S(P3]"":P3_U_P4,1:U)_U_$P($G(^DIST(.403,+S,40,+P,1)),U)_U_$P(^(0),U)
 ;
 I P3]"" D
 . S DDGFLIM=P1_U_P2_U_P3_U_P4
 . D CREATE^DDGLIBW(DDGFWID,P1_U_P2_U_(P3-P1+1)_U_(P4-P2+1),1,$G(V))
 . S @DDGFREF@("RC",DDGFWID,P1,P2,P4,"P","P","PTOP")=""
 . S @DDGFREF@("RC",DDGFWID,P3,P4,P4,"P","P","PBRC")=""
 ;
 E  D
 . S DDGFLIM=P1_U_P2_U_(IOSL-8)_U_(IOM-2)
 . D CLOSEALL^DDGLIBW($G(V))
 . D CREATE^DDGLIBW(DDGFWID,P1_U_P2_U_(IOSL-7-P1)_U_(IOM-1-P2),"",$G(V))
 ;
 ;Load header block
 S B=$P(^DIST(.403,+S,40,+P,0),U,2) I B]"" D
 . S B1=P1,B2=P2
 . D BK(+P,B,P1,P2,B1,B2,1,$G(V))
 ;
 ;Load all other blocks
 S B=0 F  S B=$O(^DIST(.403,+S,40,+P,40,B)) Q:B'=+$P(B,"E")  D
 . Q:$D(^DIST(.403,+S,40,+P,40,B,0))[0
 . S B2=$P(^DIST(.403,+S,40,+P,40,B,0),U,3)
 . S B1=$P(B2,",")-1,B2=$P(B2,",",2)-1
 . S:B1<0 B1=0 S:B2<0 B2=0
 . S B1=B1+P1,B2=B2+P2
 . D BK(+P,B,P1,P2,B1,B2,"",$G(V))
 Q
 ;
BK(P,B,P1,P2,B1,B2,H,V) ;Load block image
 ; P  = internal page number
 ; B  = internal block number
 ; P1 = page $Y
 ; P2 = page $X
 ; B1 = block abs $Y
 ; B2 = block abs $X
 ; H  = 1 if header block, immobile (optional)
 ; V  = 1 if buffer should be updated but nothing painted (optional)
 N B3,F,F1,C,C1,C2,C3,D1,D2,D3,I,L,N,T
 Q:$D(^DIST(.404,B,0))[0
 ;
 S N=$P(^DIST(.404,B,0),U)
 S:$G(H) B1=P1,B2=P2
 S B3=B2+$L(N)-1
 S @DDGFREF@("F",P,B)=B1_U_B2_U_B3_U_N
 S @DDGFREF@("BKRC",DDGFWIDB,B1,B2,B3,B)=$S($G(H):"H",1:"")
 ;
 S F1=""
 F  S F1=$O(^DIST(.404,B,40,"B",F1)) Q:F1=""  S F=$O(^(F1,"")) D:F
 . Q:$D(^DIST(.404,B,40,F,0))[0
 . S C=$P(^DIST(.404,B,40,F,0),U,2),C2=$P($G(^(2)),U,3)
 . I C]"",'$P($G(^DIST(.404,B,40,F,2)),U,4),$P(^(0),U,3)'=1 S C=C_":"
 . S L=$P($G(^DIST(.404,B,40,F,2)),U,2),D2=$P($G(^(2)),U)
 . S T=$P(^DIST(.404,B,40,F,0),U,3)
 . ;
 . ;Kill nodes that are null or contain only ^s
 . S I=0
 . F  S I=$O(^DIST(.404,B,40,F,I)) Q:'I  I $D(^(I))=1,^(I)?."^" K ^(I)
 . ;
 . ;Check that fields with captions have caption coords
 . I C]"",'C2 S C2="1,1",$P(^DIST(.404,B,40,F,2),U,3)=C2
 . ;
 . ;Check for DD fields that should be Caption fields
 . I T=3,$D(^DIST(.404,B,40,F,1))[0,'$O(^(2)) D
 .. S T=1,(D2,L)=""
 .. S C=$P($G(^DIST(.404,B,40,F,0)),U,2)
 .. S $P(^DIST(.404,B,40,F,0),U,3)=1
 .. S $P(^DIST(.404,B,40,F,2),U,1,4)="^^"_C2_"^"
 . ;
 . ;Check that fields have some coordinate
 . I 'C2,T=1!'D2 D
 .. I C="" D
 ... S C="** Null **",$P(^DIST(.404,B,40,F,0),U,2)=C,$P(^(2),U,4)=""
 ... S:T'=1 C=C_":"
 .. S C2="1,1",$P(^DIST(.404,B,40,F,2),U,3)=C2
 . ;
 . ;Make sure nonCaption fields have data coordinates and length
 . I T'=1 D
 .. S:'D2 D2=+C2_","_($P(C2,",",2)+$L(C)+1),$P(^DIST(.404,B,40,F,2),U)=D2
 .. S:'L L=1,$P(^DIST(.404,B,40,F,2),U,2)=1
 .. I C="",C2 S C2="",$P(^DIST(.404,B,40,F,2),U,3)=""
 . ;
 . I C]"" D
 .. S C1=$P(C2,",")-1+B1,C2=$P(C2,",",2)-1+B2,C3=C2+$L(C)-1
 .. S @DDGFREF@("F",P,B,F)=C1_U_C2_U_C3_U_C
 .. S @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C")=""
 .. D WRITE^DDGLIBW(DDGFWID,C,C1-P1,C2-P2,"",$G(V))
 . ;
 . ;NonCaption fields
 . I T'=1 D
 .. S D1=$P(D2,",")-1+B1,D2=$P(D2,",",2)-1+B2,D3=D2+L-1
 .. S $P(@DDGFREF@("F",P,B,F),U,5,8)=D1_U_D2_U_D3_U_L
 .. S @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F,"D")=""
 .. D WRITE^DDGLIBW(DDGFWID,$TR($J("",L)," ","_"),D1-P1,D2-P2,"",$G(V))
 Q

DDGFORD
DDGFORD ;SFISC/MKO-REORDER THE FIELDS ON BLOCK ;07:13 AM  25 May 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;In: DDGFBK   = Block number
 ;    DDGFPG   = Page number
 ;    DDGFFM   = Form number^Form name
 ;    DDGFREF  = Global reference
 ;
EN(DDGFBK) ;
 N DDO,DA,DIK
 N DDGFLN,DDGFLIST,DDGFR,DDGFC,DDGFN,DDGFO
 ;
 D MSG^DDGF("Reordering ...")
 ;Loop through all fields in DDGFREF and put into DDGFLIST array
 S DDO="" F  S DDO=$O(@DDGFREF@("F",DDGFPG,DDGFBK,DDO)) Q:DDO=""  D
 . S DDGFLN=@DDGFREF@("F",DDGFPG,DDGFBK,DDO)
 . I $P(DDGFLN,U,8)>0 S DDGFLIST(+$P(DDGFLN,U,5),+$P(DDGFLN,U,6),DDO)=""
 . E  I $P(DDGFLN,U,4)]"" S DDGFLIST(+$P(DDGFLN,U),+$P(DDGFLN,U,2),DDO)=""
 ;
 K ^DIST(.404,DDGFBK,40,"B")
 S DDGFN=0
 S DDGFR="" F  S DDGFR=$O(DDGFLIST(DDGFR)) Q:DDGFR=""  D
 . S DDGFC="" F  S DDGFC=$O(DDGFLIST(DDGFR,DDGFC)) Q:DDGFC=""  D
 .. S DDO="" F  S DDO=$O(DDGFLIST(DDGFR,DDGFC,DDO)) Q:DDO=""  D
 ... S DDGFN=DDGFN+1
 ... S DDGFO=$P(^DIST(.404,DDGFBK,40,DDO,0),U)
 ... S:DDGFO'=DDGFN $P(^DIST(.404,DDGFBK,40,DDO,0),U)=DDGFN
 ;
 S DIK="^DIST(.404,DDGFBK,40,",DA(1)=DDGFBK,DIK(1)=".01^B"
 D ENALL^DIK
 D MSG^DDGF("Reordering completed.") H 1
 D MSG^DDGF()
 Q

DDGFPG
DDGFPG ;SFISC/MKO-ADD A NEW PAGE ;2:26 PM  13 Sep 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ADD ;Invoke forms to add a new page
 S DDGFDY=DY,DDGFDX=DX K DDGFPNUM
 ;
 ;Ask for new page number
 S DDSFILE=.403,DDSFILE(1)=.4031
 S DA(1)=+DDGFFM,DA="",DR="[DDGF PAGE ADD]",DDSPARM="KTW"
 D ^DDS K DDSFILE,DA,DR,DDSPARM
 ;
 G:$D(DDGFPNUM)[0 ADDQ
 ;
 ;Ask 'are you sure' page should be added
 K DDGFANS
 S DDSFILE=.403,DDSFILE(1)=.4031
 S DR="[DDGF PAGE ADD]",DA(1)=+DDGFFM,DA="",DDSPARM="KTW",DDSPAGE=11
 D ^DDS K DDSFILE,DA,DR,DDSPARM,DDSPAGE
 ;
 I '$G(DDGFANS) K DDGFANS G ADDQ
 K DDGFANS
 ;
 ;Add page to form
 S DIC="^DIST(.403,+DDGFFM,40,",DIC(0)="L",DA(1)=+DDGFFM
 S DIC("P")=$P(^DD(.403,40,0),U,2),X=DDGFPNUM
 K DD,DO D FILE^DICN K DIC,DA,X G:Y=-1 ADDQ
 S DDGFPG=+Y
 ;
 ;Stuff in values for coordinates and name
 S DIE="^DIST(.403,"_+DDGFFM_",40,",DA(1)=+DDGFFM,DA=DDGFPG
 S DR="2////1,1;7////Page "_DDGFPNUM
 D ^DIE K DIE,DA,DR
 ;
 K DDGFPNUM
 D LOADPG
 S DDGFNEW=1
 G EDIT
 ;
ADDQ D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 K DDGFPNUM,DDGFDY,DDGFDX
 Q
 ;
EDIT ;Invoke form to edit a page
 ;Input:  DDGFNEW (optional)
 ;  Set by ADD to indicate this is a brand new page.
 ;
 S DDGFDY=DY,DDGFDX=DX
 S DDGFND=@DDGFREF@("F",DDGFPG)
 S (DDGFTLC,DDGFTLC0)=$P(DDGFND,U)+1_","_($P(DDGFND,U,2)+1)
 S (DDGFLRC,DDGFLRC0)=$S($P(DDGFND,U,3)]"":$P(DDGFND,U,3)+1_","_($P(DDGFND,U,4)+1),1:"")
 S (DDGFPNM,DDGFPNM0)=$P(DDGFND,U,5)
 S DDGFPAR=$P($G(^DIST(.403,+DDGFFM,40,DDGFPG,1)),U,2)
 ;
 S DDSFILE=.403,DDSFILE(1)=.4031,DDSPARM="KTW"
 S DA(1)=+DDGFFM,DA=DDGFPG,DR="[DDGF PAGE EDIT]"
 D ^DDS K DDSFILE,DA,DR,DDSPARM
 ;
 S DDGFND=$G(^DIST(.403,+DDGFFM,40,DDGFPG,0))
 ;
 ;If page was deleted, destroy windows and set new page
 I DDGFND="" D  Q:DDGFE
 . I $D(DDGFWID)#2,$$EXIST^DDGLIBW(DDGFWID) D DESTROY^DDGLIBW(DDGFWID)
 . I $D(DDGFWIDB)#2,$$EXIST^DDGLIBW(DDGFWIDB) D DESTROY^DDGLIBW(DDGFWIDB)
 . K @DDGFREF@("F",DDGFPG),@DDGFREF@("RC",DDGFWID),@DDGFREF@("BKRC",DDGFWIDB)
 . I $D(@DDGFREF@("ASUB","B",DDGFPG)) D DEL^DDGFASUB(DDGFPG)
 . S DDGFPG=$O(^DIST(.403,+DDGFFM,40,"B",""))
 . S:DDGFPG]"" DDGFPG=$O(^DIST(.403,+DDGFFM,40,"B",DDGFPG,""))
 . D LOADPG,REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 ;
 E  D
 . S:DDGFPNM'=DDGFPNM0 $P(@DDGFREF@("F",DDGFPG),U,5)=DDGFPNM,$P(^(DDGFPG),U,7)=1,DDGFCHG=1
 . D:DDGFPAR'=$P($G(^DIST(.403,+DDGFFM,40,DDGFPG,1)),U,2) EDIT^DDGFASUB(DDGFPG)
 . I DDGFTLC'=DDGFTLC0!(DDGFLRC'=DDGFLRC0) D
 .. D PAGE^DDGFUPDP($P(DDGFTLC,",")-1,$P(DDGFTLC,",",2)-1,$S(DDGFLRC]"":$P(DDGFLRC,",")-1,1:""),$S(DDGFLRC]"":$P(DDGFLRC,",",2)-1,1:""),$S(DDGFTLC=DDGFTLC0:"PBRC",1:"PTOP"))
 .. D STATUS^DDGF,RC($P(DDGFLIM,U),$P(DDGFLIM,U,2))
 . E  D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 ;
 K DDGFDX,DDGFDY,DDGFND,DDGFNEW
 K DDGFLRC,DDGFLRC0,DDGFPOP,DDGFPOP0,DDGFTLC,DDGFTLC0
 K DDGFPAR,DDGFPNM,DDGFPNM0
 Q
 ;
PGSEL ;Select a new page
 S DDGFDY=DY,DDGFDX=DX,DDGFPAGE=DDGFPG
 ;
 S DDSFILE=.403,DDSFILE(1)=.4031
 S DR="[DDGF PAGE SELECT]",DDSPARM="KTW"
 D ^DDS
 K DDSFILE,DA,DR,DDSPAGE,DDSPARM
 ;
 I DDGFPAGE]"",DDGFPAGE'=DDGFPG S DDGFPG=DDGFPAGE D LOADPG
 ;
 D REFRESH^DDGF,RC(DDGFDY,DDGFDX)
 K DDGFPAGE,DDGFDY,DDGFDX
 Q
 ;
NXTPRV(F) ;Go to page
 ;F=1:next page; -1:previous page
 S DDGFPAGE=$P($G(^DIST(.403,+DDGFFM,40,DDGFPG,0)),U,$S($G(F)=-1:5,1:4))
 G:DDGFPAGE="" NXTPRVQ
 S DDGFPAGE=$O(^DIST(.403,+DDGFFM,40,"B",DDGFPAGE,""))
 G:$D(^DIST(.403,+DDGFFM,40,+DDGFPAGE,0))[0!(DDGFPAGE=DDGFPG) NXTPRVQ
 ;
 S DDGFPG=DDGFPAGE
 D LOADPG,REFRESH^DDGF,RC(DDGFDY,DDGFDX)
NXTPRVQ K DDGFPAGE,DDGFDY,DDGFDX
 Q
 ;
CLSPG ;Close page
 Q:$G(DDGLSCR)'>1
 D CLOSE^DDGLIBW(DDGFWID)
 S DDGFPG=$E(DDGLSCR(DDGLSCR),2,999)
 D PG^DDGFLOAD(+DDGFFM,DDGFPG,1)
 D STATUS^DDGF,RC($P(DDGFLIM,U),$P(DDGFLIM,U,2))
 Q
 ;
SUBPG ;Go into subpage
 I $D(@DDGFREF@("ASUB",DDGFPG,B,F))#2 S DDGFSUBP=^(F)
 E  D
 . S DDGFSUBP=+$P($G(^DIST(.404,B,40,F,7)),U,2)
 . S DDGFSUBP=+$O(^DIST(.403,+DDGFFM,40,"B",DDGFSUBP,""))
 ;
 I $D(^DIST(.403,+DDGFFM,40,DDGFSUBP,0))[0 W $C(7) K DDGFSUBP Q
 I DDGFSUBP=DDGFPG K DDGFSUBP Q
 S DDGFE=1
 Q
 ;
SUBPG1 S DDGFPG=DDGFSUBP K DDGFSUBP
 D PG^DDGFLOAD(+DDGFFM,DDGFPG)
 D STATUS^DDGF,RC($P(DDGFLIM,U),$P(DDGFLIM,U,2))
 Q
 ;
LOADPG ;Load new page
 D PG^DDGFLOAD(+DDGFFM,DDGFPG,1)
 S DDGFDY=$P(DDGFLIM,U),DDGFDX=$P(DDGFLIM,U,2)
 Q
 ;
RC(DDGFY,DDGFX) ;Update status line, reset DX and DY, move cursor
 N S
 I DDGFR D
 . S DY=IOSL-6,DX=IOM-9,S="R"_(DDGFY+1)_",C"_(DDGFX+1)
 . X IOXY W S_$J("",7-$L(S))
 S DY=DDGFY,DX=DDGFX X IOXY
 Q

DDGFSV
DDGFSV ;SFISC/MKO- SAVE DATA ;12:41 PM  29 Mar 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SAVE ;Save in form/block files data in DDGFREF
 N P,B,F,P1,B1,F1,N
 ;
 I '$G(DDGFCHG) D MSG^DDGF("Nothing to save.") H 1 D MSG^DDGF() Q
 D MSG^DDGF("Saving data ...")
 ;
 ;Loop through all pages in DDGFREF
 S P="" F  S P=$O(@DDGFREF@("F",P)) Q:P=""  D PG
 ;
 D MSG^DDGF("Data saved.") H 1 D MSG^DDGF()
 S DDGFCHG=0
 Q
 ;
PG ;Save page data
 S P1=@DDGFREF@("F",P)
 I $P(P1,U,7),$D(^DIST(.403,+DDGFFM,40,P,0))#2 D
 . S N=^DIST(.403,+DDGFFM,40,P,0)
 . S $P(N,U,3)=$P(P1,U)+1_","_($P(P1,U,2)+1)
 . S $P(N,U,6,7)=$S($P(P1,U,3)="":U,1:1_U_($P(P1,U,3)+1)_","_($P(P1,U,4)+1))
 . S ^DIST(.403,+DDGFFM,40,P,0)=$$STPU(N)
 . ;
 . S N=$G(^DIST(.403,+DDGFFM,40,P,1))
 . I $P(N,U)'=$P(P1,U,5) D
 .. S DIE="^DIST(.403,"_+DDGFFM_",40,"
 .. S DR="7////"_$P(P1,U,5),DA(1)=+DDGFFM,DA=P
 .. N P D ^DIE K DIE,DR,DA
 ;
 ;Loop through all blocks
 S B="" F  S B=$O(@DDGFREF@("F",P,B)) Q:B=""  D BK
 Q
 ;
BK ;Save block data
 S B1=@DDGFREF@("F",P,B)
 I $P(B1,U,5),$D(^DIST(.403,+DDGFFM,40,P,40,B,0))#2 D
 . S $P(^DIST(.403,+DDGFFM,40,P,40,B,0),U,3)=$P(B1,U)-$P(P1,U)+1_","_($P(B1,U,2)-$P(P1,U,2)+1)
 . I $P(^DIST(.404,B,0),U)'=$P(B1,U,4) D
 .. S DIE="^DIST(.404,",DR=".01////"_$P(B1,U,4),DA=B
 .. N B,P D ^DIE K DIE,DR,DA
 ;
 ;Loop through all fields
 S F="" F  S F=$O(@DDGFREF@("F",P,B,F)) Q:F=""  D FD
 Q
 ;
FD ;Save field data
 S F1=@DDGFREF@("F",P,B,F)
 I $P(F1,U,9),$D(^DIST(.404,B,40,F,0))#2 D
 . S N=""
 . S $P(N,U,1,2)=$S($P(F1,U,8):$S($P(F1,U,5)]""&($P(F1,U,6)]""):$P(F1,U,5)-$P(B1,U)+1_","_($P(F1,U,6)-$P(B1,U,2)+1),1:"")_U_$P(F1,U,8),1:U)
 . S $P(N,U,3,4)=$S($L($P(F1,U,4)):$S($P(F1,U)]""&($P(F1,U,2)]""):$P(F1,U)-$P(B1,U)+1_","_($P(F1,U,2)-$P(B1,U,2)+1),1:"")_U_$S($P(F1,U,4)?.E1":":"",1:1),1:U)
 . S:$P(^DIST(.404,B,40,F,0),U,3)=1 $P(N,U,4)=""
 . S ^DIST(.404,B,40,F,2)=$$STPU(N)
 . ;
 . ;Use DIE to stuff in new caption
 . I $P(^DIST(.404,B,40,F,0),U,2)'=$P(F1,U,4) D
 .. S DIE="^DIST(.404,"_B_",40,"
 .. S DR="1////"_$S($P(F1,U,4)?.1":":"@",$P(F1,U,4)?1.E1":":$E($P(F1,U,4),1,$L($P(F1,U,4))-1),1:$P(F1,U,4))
 .. S DA(1)=B,DA=F
 .. N P,B,F D ^DIE K DIE,DR,DA
 Q
 ;
STPU(X) ;Strip trailing up-arrows from X
 N I
 F I=$L(X):-1:0 Q:$E(X,I)'="^"
 Q $E(X,1,I)

DDGFU
DDGFU ;SFISC/MKO-CALLED FROM THE FORMS ;10:49 AM  27 Jul 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
VAL1 ;Data validation code
 ;Form: DDS FIELD ADD
 I $$GET^DDSVALF("BLOCK","DDGF FIELD ADD")]"",$$GET^DDSVALF("FIELD ORDER","DDGF FIELD ADD")]"",$$GET^DDSVALF("FIELD TYPE","DDGF FIELD ADD")]"" Q
 ;
 S DDGFT(1)=$C(7)_"Unable to save values."
 S DDGFT(2)="All values must be filled in order to add a new field."
 D HLP^DDSUTL(.DDGFT)
 S DDSERROR=1
 K DDGFT
 Q
 ;
DDCAP ;Caption, Post action on change
 ;Form:  DDGF FIELD DD
 N DDGFOPG
 S DDGFOPG=$$OTHPG
 D:DDSOLD="!M" PUT^DDSVAL(.4044,.DA,1.1,"")
 ;
 D:X="" CAPNULL(DDGFOPG)
 D:X]"" UPDDC(DDGFOPG)
 Q
 ;
OTHPG() ;Return Other Params page#
 N FLD,SUB,OPG
 S FLD=$$GET^DDSVAL(.4044,.DA,4)
 I FLD D
 . S OPG=11
 . S SUB=+$P($G(^DD(DDGFDD,FLD,0)),U,2)
 . S:SUB OPG=$S(SUB_$P($G(^DD(SUB,.01,0)),U,2)'["W":21,1:31)
 Q $G(OPG)
 ;
FOCAP ;Caption, Post action on change
 ;Form:  DDGF FIELD FORM ONLY
 D:X'="!M" PUT^DDSVAL(.4044,.DA,1.1,"")
 ;
 D:X="" CAPNULL(21)
 D:X]"" UPDDC(21)
 Q
 ;
COMPCAP ;Caption, Post action on change
 ;Form:  DDGF FIELD COMPUTED
 D:X'="!M" PUT^DDSVAL(.4044,.DA,1.1,"")
 ;
 D:X="" CAPNULL(11)
 D:X]"" UPDDC(11)
 Q
 ;
CAPNULL(OPG) ;Caption changed to null
 N DC,SC
 ;
 ;Clear suppress colon
 S SC=$$GET^DDSVALF("SUPPRESS COLON AFTER CAPTION?")
 D PUT^DDSVALF("SUPPRESS COLON AFTER CAPTION?","","","","I")
 Q:'$G(OPG)
 ;
 ;Clear caption coords
 D PUT^DDSVALF("CAPTION COORDINATE",1,OPG,"")
 ;
 ;Move data to the left
 S DC=$$GET^DDSVALF("DATA COORDINATE",1,OPG)
 S $P(DC,",",2)=$P(DC,",",2)-$L(DDSOLD)-1-'SC
 S:$P(DC,",",2)<1 $P(DC,",",2)=1
 D PUT^DDSVALF("DATA COORDINATE",1,OPG,DC,"I")
 Q
 ;
UPDDC(OPG) ;Update data coords
 N DC,COL
 S DC=$$GET^DDSVALF("DATA COORDINATE",1,OPG)
 S COL=$P(DC,",",2),COL=COL+$L(X)-$L(DDSOLD)
 I DDSOLD="" D
 . D PUT^DDSVALF("CAPTION COORDINATE",1,OPG,DC,"I")
 . S COL=COL+2
 S:COL<1 COL=1
 S $P(DC,",",2)=COL
 D PUT^DDSVALF("DATA COORDINATE",1,OPG,DC)
 Q
 ;
POSTCH1 ;Field, Post Action On Change
 ;Form: DDGF FIELD DD
 ;
 ;Reset (if caption not !M): caption, caption and data coords,
 ; data length
 ;Input:
 ; DDGFPG = Page #
 ; DA(1)  = Block #
 ; DA     = Field order
 ; X      = Fld #
 ; DDSOLD = Prev fld #
 ;
 Q:X=""
 N FILE,FLD,DD,C,C0,CC,DC,SC,L,OPG,OPG0,PLRC
 ;
 S FLD=X
 S FILE=+$P(^DIST(.404,DA(1),0),U,2) Q:'FILE
 S DD=$G(^DD(FILE,FLD,0)) Q:DD?."^"
 S OPG=$$OTHPG
 ;
 S OPG0=11
 I $G(DDSOLD)]"" D
 . N SUB
 . S SUB=+$P($G(^DD(FILE,DDSOLD,0)),U,2)
 . S:SUB OPG0=$S(SUB_$P($G(^DD(SUB,.01,0)),U,2)'["W":21,1:31)
 ;
 S (C,C0)=$$GET^DDSVALF("CAPTION",1,1)
 S:C]"" CC=$$GET^DDSVALF("CAPTION COORDINATE",1,OPG0)
 S DC=$$GET^DDSVALF("DATA COORDINATE",1,OPG0)
 ;
 I OPG'=OPG0 D
 . D:C]"" PUT^DDSVALF("CAPTION COORDINATE",1,OPG,CC)
 . D:DC]"" PUT^DDSVALF("DATA COORDINATE",1,OPG,DC)
 . D DESTROY^DDSUTL(OPG0)
 . 
 ;
 I $D(DDGFREF),$D(DDGFPG) S PLRC=$P($G(@DDGFREF@("F",DDGFPG)),U,4)
 S PLRC=$S($G(PLRC)]"":PLRC-1,1:IOM-2)-$P($G(@DDGFREF@("F",DDGFPG,DA(1))),U,2)
 S L=$$LENGTH(FILE,FLD) S:'L L=1
 ;
 I C'="!M",$P(DD,U)]"" D
 . S C=$P(DD,U)
 . I $P(DD,U,2),$P($G(^DD(+$P(DD,U,2),.01,0)),U,2)'["W" S C="Select "_C
 . D PUT^DDSVALF("CAPTION",1,1,C)
 . ;
 . I C0="" D
 .. S CC=DC
 .. S $P(DC,",",2)=$P(DC,",",2)+2
 .. D PUT^DDSVALF("CAPTION COORDINATE",1,OPG,CC)
 . E  Q:$P(CC,",")'=$P(DC,",")
 . ;
 . S $P(DC,",",2)=$P(DC,",",2)+$L(C)-$L(C0)
 . S:$P(DC,",",2)<1 $P(DC,",",2)=1
 . D PUT^DDSVALF("DATA COORDINATE",1,OPG,DC)
 ;
 I C0'="!M",$P(DC,",",2)-2+L>PLRC S L=PLRC-$P(DC,",",2)+2
 D PUT^DDSVALF("DATA LENGTH",1,OPG,L)
 Q
 ;
HBVAL ;Validate hdr blk
 Q:X=""  Q:'$O(@(DIE_DA_",40,""B"",X,"""")"))
 S DDSERROR=1
 D HLP^DDSUTL($C(7)_DDSEXT_" already exists on this page.")
 Q
 ;
LENGTH(DIFILE,DIFLD) ;Find max field length
 N DD,DIIT,DILEN,DITYPE
 S DILEN=""
 S DD=$G(^DD(DIFILE,DIFLD,0)) Q:DD?."^" DILEN
 S DITYPE=$P(DD,U,2),DIIT=$P(DD,U,5,999)
 ;
 I DIIT["$L(X)>" S DILEN=+$P($P(DIIT,"$L(X)>",2,999),"E")
 E  I DITYPE["N" S DILEN=+$P(DITYPE,"J",2)
 E  I DITYPE["P" S DILEN=$$LENGTH(+$P(DITYPE,"P",2),.01)
 ;
 E  I DITYPE["S" D
 . N DICODE,DICODEA,DIPC
 . S DICODE=$P(DD,U,3)
 . F DIPC=1:1 S DICODEA=$P(DICODE,";",DIPC) Q:DICODEA=""  D
 .. S DILEN=$$MAX(DILEN,$L($P(DICODEA,":")),$L($P(DICODEA,":",2)))
 ;
 E  I DITYPE["D" D
 . N DIDT
 . S DIDT=$P($P(DIIT,"S %DT=""",2,999),"""")
 . S DILEN=$S(DIDT["S"&(DIDT["T"):20,DIDT["T":17,1:11)
 ;
 E  I DITYPE["V" D
 . N DIL,DIX
 . S DIX=0 F  S DIX=$O(^DD(DIFILE,DIFLD,"V",DIX)) Q:'DIX  D
 .. Q:'$G(^DD(DIFILE,DIFLD,"V",DIX,0))
 .. S DIL=$G(DIL)+1
 .. S DIL(DIL)=$$LENGTH(+^DD(DIFILE,DIFLD,"V",DIX,0),.01)
 . S DILEN=$G(DIL(1))
 . F DIL=1:1:$G(DIL)-1 S DILEN=$$MAX(DIL(DIL),DIL(DIL+1))
 ;
 E  I DITYPE D
 . Q:$D(^DD(+DITYPE,.01,0))[0
 . S DILEN=$S($P(^DD(+DITYPE,.01,0),U,2)["W":1,1:$$LENGTH(+DITYPE,.01))
 ;
 Q DILEN
 ;
MAX(X,Y,Z) ;Return max of 2 or 3 numbers
 N M
 S M=$S(X>Y:+X,1:+Y),M=$S(M>$G(Z):M,1:+$G(Z))
 Q M

DDGFUPDB
DDGFUPDB ;SFISC/MKO-UPDATE BLOCK COORDINATES ;03:28 PM  17 Aug 1993
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BLK(DDGFORIG) ;
 ;Update image with adjusted block coordinates
 ; DDGFORIG(B) : defined for all blocks that changed coordinates
 ;               = original $Y^original $X
 N P,P1,P2,B,B1,B2,F,C1,C2,C3,C,D1,D2,D3,L,X1,Y1,N,I
 ;
 ;Get page coordinates
 S P=DDGFPG
 S P1=$P(@DDGFREF@("F",P),U),P2=$P(@DDGFREF@("F",P),U,2)
 ;
 ;Loop through all blocks on page
 S B="" F  S B=$O(@DDGFREF@("F",P,B)) Q:B=""  D BK
 Q
 ;
BK ;Get block coordinates
 S B2=@DDGFREF@("F",P,B)
 S B1=$P(B2,U),B2=$P(B2,U,2)
 ;
 ;Get Y1=delta $Y, X1=delta $X
 I $D(DDGFORIG(B)) S Y1=B1-$P(DDGFORIG(B),U),X1=B2-$P(DDGFORIG(B),U,2)
 E  S (Y1,X1)=0
 I 'Y1,'X1 K DDGFORIG(B)
 ;
 ;Loop through all fields on block
 S F="" F  S F=$O(@DDGFREF@("F",P,B,F)) Q:F=""  D FD
 Q
 ;
FD ;
 ;Get field data
 S N=@DDGFREF@("F",P,B,F)
 S C1=$P(N,U),C2=$P(N,U,2),C3=$P(N,U,3),C=$P(N,U,4)
 S D1=$P(N,U,5),D2=$P(N,U,6),D3=$P(N,U,7),L=$P(N,U,8)
 ;
 I $D(DDGFORIG(B)) D
 . I Y1 S:C1]"" $P(N,U)=C1+Y1 S:L $P(N,U,5)=D1+Y1
 . I X1 D
 .. I C]"" F I=2,3 S $P(N,U,I)=$P(N,U,I)+X1
 .. I L F I=6,7 S $P(N,U,I)=$P(N,U,I)+X1
 . S @DDGFREF@("F",P,B,F)=N
 . ;
 . I C]"" D
 .. K @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C")
 .. S @DDGFREF@("RC",DDGFWID,$P(N,U),$P(N,U,2),$P(N,U,3),B,F,"C")=""
 . I L D
 .. K @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F,"D")
 .. S @DDGFREF@("RC",DDGFWID,$P(N,U,5),$P(N,U,6),$P(N,U,7),B,F,"D")=""
 ;
 I C]"" D WRITE^DDGLIBW(DDGFWID,C,$P(N,U)-P1,$P(N,U,2)-P2)
 I L D WRITE^DDGLIBW(DDGFWID,$TR($J("",L)," ","_"),$P(N,U,5)-P1,$P(N,U,6)-P2)
 Q

DDGFUPDP
DDGFUPDP ;SFISC/MKO-UPDATE PAGE COORDINATES ;01:37 PM  19 Jan 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PAGE(P1,P2,P3,P4,T,A) ;
 ;
 D DESTROY^DDGLIBW(DDGFWID,1),DESTROY^DDGLIBW(DDGFWIDB,1)
 I P3]"" D
 . D REPALL^DDGLIBW($G(A))
 . D CREATE^DDGLIBW(DDGFWID,P1_U_P2_U_(P3-P1+1)_U_(P4-P2+1),1)
 . S DDGFLIM=P1_U_P2_U_P3_U_P4
 E  D
 . D CLOSEALL^DDGLIBW()
 . D CREATE^DDGLIBW(DDGFWID,P1_U_P2_U_(IOSL-7-P1)_U_(IOM-1-P2))
 . S DDGFLIM=P1_U_P2_U_(IOSL-8)_U_(IOM-2)
 D:T="PTOP" TOP(P1,P2,P3,P4)
 D:T="PBRC" BRC(P1,P2,P3,P4)
 Q
 ;
TOP(P1,P2,P3,P4) ;Update page image
 ;
 N B,C,C1,C2,C3,D1,D2,D3,F,I,L,N,P,X1,Y1
 ;
 S P=DDGFPG
 S N=@DDGFREF@("F",P)
 S Y1=P1-$P(N,U),X1=P2-$P(N,U,2)
 I 'Y1,'X1 Q
 ;
 I $P(N,U,3)]"" D
 . K @DDGFREF@("RC",DDGFWID,$P(N,U),$P(N,U,2),$P(N,U,4),"P","P","PTOP")
 . K @DDGFREF@("RC",DDGFWID,$P(N,U,3),$P(N,U,4),$P(N,U,4),"P","P","PBRC")
 I $G(P3)]"" D
 . S @DDGFREF@("RC",DDGFWID,P1,P2,P4,"P","P","PTOP")=""
 . S @DDGFREF@("RC",DDGFWID,P3,P4,P4,"P","P","PBRC")=""
 ;
 S $P(N,U,1,4)=P1_U_P2_U_P3_U_P4,$P(N,U,7)=1,DDGFCHG=1
 S @DDGFREF@("F",P)=N
 ;
 ;Loop through all blocks on page
 S B="" F  S B=$O(@DDGFREF@("F",P,B)) Q:B=""  D
 . S N=@DDGFREF@("F",P,B)
 . S @DDGFREF@("BKRC",DDGFWIDB,$P(N,U)+Y1,$P(N,U,2)+X1,$P(N,U,3)+X1,B)=@DDGFREF@("BKRC",DDGFWIDB,$P(N,U),$P(N,U,2),$P(N,U,3),B)
 . K @DDGFREF@("BKRC",DDGFWIDB,$P(N,U),$P(N,U,2),$P(N,U,3),B)
 . S $P(N,U,1,3)=$P(N,U)+Y1_U_($P(N,U,2)+X1)_U_($P(N,U,3)+X1)
 . S @DDGFREF@("F",P,B)=N
 . ;
 . S F="" F  S F=$O(@DDGFREF@("F",P,B,F)) Q:F=""  D
 .. S N=@DDGFREF@("F",P,B,F)
 .. S C1=$P(N,U),C2=$P(N,U,2),C3=$P(N,U,3),C=$P(N,U,4)
 .. S D1=$P(N,U,5),D2=$P(N,U,6),D3=$P(N,U,7),L=$P(N,U,8)
 .. ;
 .. I Y1 S:C1]"" $P(N,U)=C1+Y1 S:L $P(N,U,5)=D1+Y1
 .. I X1 D
 ... I C]"" F I=2,3 S $P(N,U,I)=$P(N,U,I)+X1
 ... I L F I=6,7 S $P(N,U,I)=$P(N,U,I)+X1
 .. S @DDGFREF@("F",P,B,F)=N
 .. ;
 .. I C]"" D
 ... K @DDGFREF@("RC",DDGFWID,C1,C2,C3,B,F,"C")
 ... S @DDGFREF@("RC",DDGFWID,$P(N,U),$P(N,U,2),$P(N,U,3),B,F,"C")=""
 .. I L D
 ... K @DDGFREF@("RC",DDGFWID,D1,D2,D3,B,F,"D")
 ... S @DDGFREF@("RC",DDGFWID,$P(N,U,5),$P(N,U,6),$P(N,U,7),B,F,"D")=""
 .. ;
 .. D:C]"" WRITE^DDGLIBW(DDGFWID,C,$P(N,U)-P1,$P(N,U,2)-P2)
 .. D:L WRITE^DDGLIBW(DDGFWID,$TR($J("",L)," ","_"),$P(N,U,5)-P1,$P(N,U,6)-P2)
 Q
 ;
BRC(P1,P2,P3,P4) ;Change bottom right coordinate of page
 N B,C,F,L,N,P
 S P=DDGFPG
 S N=@DDGFREF@("F",P)
 I $P(N,U,3)]"" D
 . K @DDGFREF@("RC",DDGFWID,$P(N,U),$P(N,U,2),$P(N,U,4),"P","P","PTOP")
 . K @DDGFREF@("RC",DDGFWID,$P(N,U,3),$P(N,U,4),$P(N,U,4),"P","P","PBRC")
 I $G(P3)]"" D
 . S @DDGFREF@("RC",DDGFWID,P1,P2,P4,"P","P","PTOP")=""
 . S @DDGFREF@("RC",DDGFWID,P3,P4,P4,"P","P","PBRC")=""
 ;
 S $P(N,U,1,4)=P1_U_P2_U_P3_U_P4,$P(N,U,7)=1,DDGFCHG=1
 S @DDGFREF@("F",P)=N
 ;
 ;Loop through all blocks/fields on page
 S B="" F  S B=$O(@DDGFREF@("F",P,B)) Q:B=""  D
 . S F="" F  S F=$O(@DDGFREF@("F",P,B,F)) Q:F=""  D
 .. S N=@DDGFREF@("F",P,B,F)
 .. S C=$P(N,U,4),L=$P(N,U,8)
 .. ;
 .. I C]"" D WRITE^DDGLIBW(DDGFWID,C,$P(N,U)-P1,$P(N,U,2)-P2)
 .. I L D WRITE^DDGLIBW(DDGFWID,$TR($J("",L)," ","_"),$P(N,U,5)-P1,$P(N,U,6)-P2)
 Q

DDGLBXA
DDGLBXA ;SFISC/MKO-A LIST BOX ;1:58 PM  26 Apr 1996
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
LIST(DDGLGLO,DDGLOUT,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLFLG,DDGLMAP) ;
 ;Input:
 ;  DDGLGLO = closed reference of local or global that contains
 ;            the list of entries
 ;               @DDGLGLO("B",entry,index)=""
 ;  DDGLROW = $Y of top left corner
 ;  DDGLCOL = $X of top left corner
 ;  DDGLHT  = height of box
 ;  DDGLWD  = width of box
 ;  DDGLSEL = text of selected item
 ;  DDGLFLG = flags
 ;  DDGLMAP = array to customize key sequences
 ;
 ;Output:
 ;  DDGLOUT = index of selected entry (if any)
 ;  DDGLOUT(0) = selected entry
 ;  DDGLOUT("C") = code indicates what terminated the read
 ;
 ;Other variables:
 N DDGLCID ;  window (control) id
 N DDGLNL ; number of lines in list
 N DDGLNC ; number of columns in list
 N DDGLLINE ; current line number
 N DDGLITEM ; item array
 ;              DDGLITEM(1..DDGLNL) = text of item displayed
 ;
 Q:$G(DDGLGLO)=""
 D INIT
 X DDGLZOSF("EOFF")
 W $P(DDGLVID,DDGLDEL,11)
 ;
 D ^DDGLBXA1
 ;
 W $P(DDGLVID,DDGLDEL,12)
 X DDGLZOSF("EON")
 D DESTROY(DDGLCID,$G(DDGLFLG))
 Q
 ;
CREATE(DDGLGLO,DDGLCID,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLMAP) ;
 ;Create a list box window
 ;Out:
 ; .DDGLCID array = properties of list box
 ; .DDGLCID(id,"SV") = cid^$Y^$X^NL^NC^LINE
 ; .DDGLCID(id,"ITEM",1..nl) = text of item n in display
 ; .DDGLCID(id,"GL") = DDGLGLO
 ; .DDGLCID(id,"KMAP","IN")
 ; .DDGLCID(id,"KMAP","OUT")
 ; .DDGLCID(id,"KMAP","KD")
 ; .DDGLCID(id,"KMAP","TO")
 ;
 Q:$G(DDGLGLO)=""
 N DDGLNL,DDGLNC,DDGLLINE,DDGLLAST,DDGLITEM
 D INIT
 D SETCID
 Q
 ;
DESTROY(DDGLCID,DDGLFLG) ;Destroy the window and cleanup
 D DESTROY^DDGLIBW(DDGLCID)
 K DDGLCID(DDGLCID)
 D KILL^DDGLIB0($G(DDGLFLG))
 Q
 ;
READ(DDGLCID,DDGLOUT) ;
 N DDGLGLO,DDGLROW,DDGLCOL,DDGLNL,DDGLNC,DDGLLINE,DDGLSEL,DDGLITEM
 N DX,DY
 ;
 D SETPARM
 X DDGLZOSF("EOFF")
 W $P(DDGLVID,DDGLDEL,11)
 ;
 D ^DDGLBXA1
 ;
 D SETCID
 W $P(DDGLVID,DDGLDEL,12)
 X DDGLZOSF("EON")
 Q
 ;
UPDATE(DDGLCID,DDGLVAL) ;
 N DDGLGLO,DDGLROW,DDGLCOL,DDGLNL,DDGLNC,DDGLLINE,DDGLSEL,DDGLITEM
 N DDGLI,DDGLT,DX,DY
 ;
 D SETPARM
 ;
 ;Get closest match incl. or foll. DDGLVAL
 S DDGLSEL=$G(DDGLVAL)
 I $G(DDGLSEL)="" S DDGLSEL=$O(@DDGLGLO@(""))
 E  I '$D(@DDGLGLO@(DDGLSEL)) S DDGLSEL=$O(@DDGLGLO@(DDGLSEL))
 Q:DDGLSEL=""
 ;
 ;Check whether DDGLVAL is already on the screen
 I DDGLITEM(1)']]DDGLSEL,DDGLSEL']]DDGLITEM(DDGLNL) D
 . D CUP(DDGLLINE,1)
 . W $E(DDGLITEM(DDGLLINE),1,DDGLNC)
 . F DDGLLINE=1:1:DDGLNL Q:DDGLITEM(DDGLLINE)=DDGLSEL
 . D CUP(DDGLLINE,1)
 . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 ;
 ;If not, adjust the array
 E  D
 . S DDGLT=DDGLSEL
 . F DDGLI=1:1:DDGLNL D
 .. S DDGLITEM(DDGLI)=DDGLT
 .. S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 . D DISP(DDGLSEL)
 ;
 D SETCID
 Q
 ;
SETCID ;Set DDGLCID array
 K DDGLCID(DDGLCID)
 S DDGLCID(DDGLCID,"SV")=DDGLCID_U_DDGLROW_U_DDGLCOL_U_DDGLNL_U_DDGLNC_U_DDGLLINE
 M DDGLCID(DDGLCID,"ITEM")=DDGLITEM
 S DDGLCID(DDGLCID,"GL")=DDGLGLO
 M DDGLCID(DDGLCID,"KMAP")=DDGLKEY("KMAP")
 Q
 ;
SETPARM ;Set parameters from DDGLCID array
 N DDGLI
 S DDGLGLO=DDGLCID(DDGLCID,"GL")
 ;
 K DDGLKEY("KMAP")
 M DDGLKEY("KMAP")=DDGLCID(DDGLCID,"KMAP")
 M DDGLITEM=DDGLCID(DDGLCID,"ITEM")
 ;
 S DDGLI=DDGLCID(DDGLCID,"SV")
 S DDGLROW=$P(DDGLI,U,2)
 S DDGLCOL=$P(DDGLI,U,3)
 S DDGLNL=$P(DDGLI,U,4)
 S DDGLNC=$P(DDGLI,U,5)
 S DDGLLINE=$P(DDGLI,U,6)
 S DDGLSEL=DDGLITEM(DDGLLINE)
 K DDGLCID(DDGLCID)
 Q
 ;
INIT ;Create list box (window) and setup variables
 ;In:      DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLGLO,DDGLMAP
 ;Returns: DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLIND
 ;         DDGLCID,DDGLNL,DDGLNC,DDGLLINE,DDGLITEM,DDGLKEY("KMAP")
 ;
 N DDGLAREA,DDGLI,DDGLT
 D INIT^DDGLIB0()
 ;
 ;Check and default DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLIND
 I $G(DDGLROW,-1)<0 S DDGLROW=5
 E  I DDGLROW+3>IOSL S DDGLROW=IOSL-3
 I $G(DDGLCOL,-1)<0 S DDGLCOL=5
 E  I DDGLCOL+5>IOM S DDGLCOL=IOM-5
 ;
 S DDGLHT=$S($D(DDGLHT)[0:7,DDGLHT<3:3,1:DDGLHT)
 S:DDGLROW+DDGLHT+1>IOSL DDGLHT=IOSL-DDGLROW
 ;
 S DDGLWD=$S($D(DDGLWD)[0:14,DDGLWD<5:5,1:DDGLWD)
 S:DDGLCOL+DDGLWD+1>IOM DDGLWD=IOM-DDGLCOL
 ;
 I $G(DDGLSEL)="" S DDGLSEL=$O(@DDGLGLO@(""))
 E  I '$D(@DDGLGLO@(DDGLSEL)) S DDGLSEL=$O(@DDGLGLO@(DDGLSEL))
 ;
 ;Initialize variables
 F DDGLI=1:1 Q:'$$EXIST^DDGLIBW("LBOX"_DDGLI)
 S DDGLCID="LBOX"_DDGLI
 S DDGLAREA=DDGLROW_U_DDGLCOL_U_DDGLHT_U_DDGLWD
 S DDGLNL=DDGLHT-2
 S DDGLNC=DDGLWD-4
 S DDGLLINE=1
 ;
 ;Fill DDGLITEM array
 S DDGLT=DDGLSEL
 F DDGLI=1:1:DDGLNL D
 . S DDGLITEM(DDGLI)=DDGLT
 . S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 ;
 ;Get key sequences, create window, display list
 D GETKEY
 D CREATE^DDGLIBW(DDGLCID,DDGLAREA,1)
 D DISP(DDGLSEL)
 Q
 ;
DISP(DDGLSEL) ;Display the list
 ;In: DDGLSEL = text of selected item
 ;
 N DDGLI,DDGLT
 F DDGLI=1:1:DDGLNL D
 . D CUP(DDGLI,1)
 . S DDGLT=$E(DDGLITEM(DDGLI),1,DDGLNC)
 . S DDGLT=$S(DDGLT=DDGLSEL:$P(DDGLVID,DDGLDEL,6)_DDGLT_$P(DDGLVID,DDGLDEL,10),1:DDGLT)_$J("",DDGLNC-$L(DDGLT))
 . W DDGLT
 Q
 ;
CUP(Y,X) ;Position cursor relative to list coordinates
 S DY=DDGLROW+Y,DX=DDGLCOL+X+1 X IOXY
 Q
 ;
GETKEY ;Get key sequences and defaults
 N AU,AD,AR,AL,F1,F2,F3,F4
 N FIND,SELECT,INSERT,REMOVE,PREVSC,NEXTSC
 N I,K,N,T
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S AR=$P(DDGLKEY,U,4)
 S AL=$P(DDGLKEY,U,5)
 S F1=$P(DDGLKEY,U,6)
 S FIND=$P(DDGLKEY,U,10)
 S SELECT=$P(DDGLKEY,U,11)
 S PREVSC=$P(DDGLKEY,U,14)
 S NEXTSC=$P(DDGLKEY,U,15)
 ;
 S DDGLKEY("KMAP","IN")="",DDGLKEY("KMAP","OUT")=""
 ;
 I $D(DDGLMAP)>9 S I=0 F  S I=$O(DDGLMAP(I)) Q:'I  D
 . I $P(DDGLMAP(I),";",2)="KEYDOWN" S DDGLKEY("KMAP","KD")=$P(DDGLMAP(I),";") Q
 . I $P(DDGLMAP(I),";",2)="TIMEOUT" S DDGLKEY("KMAP","TO")=$P(DDGLMAP(I),";") Q
 . ;
 . S @("K="_$P(DDGLMAP(I),";",2))
 . I DDGLKEY("KMAP","IN")'[(U_K),K]"" D
 .. S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U_K
 .. S DDGLKEY("KMAP","OUT")=DDGLKEY("KMAP","OUT")_$P(DDGLMAP(I),";")_";"
 ;
 F I=1:1 S T=$P($T(MAP+I),";;",2,999) Q:T=""  D
 . S @("K="_$P(T,";",2))
 . I DDGLKEY("KMAP","IN")'[(U_K),K]"" D
 .. S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U_K
 .. S DDGLKEY("KMAP","OUT")=DDGLKEY("KMAP","OUT")_$P(T,";")_";"
 S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U
 S DDGLKEY("KMAP","OUT")=$E(DDGLKEY("KMAP","OUT"),1,$L(DDGLKEY("KMAP","OUT"))-1)
 Q
 ;
MAP ;Keys for main screen
 ;;UP;AU
 ;;UP;AL
 ;;DN;AD
 ;;DN;AR
 ;;PUP;F1_AU
 ;;PUP;PREVSC
 ;;PDN;F1_AD
 ;;PDN;NEXTSC
 ;;TOP;F1_"T"
 ;;TOP;F1_F1_AU
 ;;TOP;FIND
 ;;BOT;F1_"B"
 ;;BOT;F1_F1_AD
 ;;BOT;SELECT
 ;;SEL;$C(13)
 ;;SEL;F1_"E"
 ;;QT;$C(27)_$C(27)
 ;;QT;F1_"Q"
 ;;QT;F1_"C"
 ;;

DDGLBXA1
DDGLBXA1 ;SFISC/MKO-SINGLE SELECTION LIST BOX ;11:33 AM  26 Apr 1996
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DDGLQT,Y
 D CUP(DDGLLINE,1)
 ;
 S DDGLQT=0
 F  S Y=$$READ D  Q:DDGLQT
 . I Y'[U,$T(@Y)="" W $C(7) Q
 . D @Y
 . D:$G(DDGLKEY("KMAP","KD"))]"" @DDGLKEY("KMAP","KD")
 ;
 S:$P(DDGLQT,U,2,999)]"" DDGLOUT("C")=$P(DDGLQT,U,2,999)
 Q
 ;
UP ;Move up
 I DDGLLINE>1 D
 . D CUP(DDGLLINE,1)
 . W $E(DDGLSEL,1,DDGLNC)
 . S DDGLLINE=DDGLLINE-1
 . S DDGLSEL=DDGLITEM(DDGLLINE)
 . ;
 . D CUP(DDGLLINE,1)
 . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 ;
 E  D
 . N DDGLE
 . D SHIFTDN(1,.DDGLE) Q:$G(DDGLE)
 . S DDGLSEL=DDGLITEM(1)
 . D DISP(DDGLSEL)
 Q
 ;
DN ;Move down
 I DDGLLINE<DDGLNL D
 . Q:DDGLITEM(DDGLLINE+1)=""
 . D CUP(DDGLLINE,1)
 . W $E(DDGLSEL,1,DDGLNC)
 . S DDGLLINE=DDGLLINE+1
 . S DDGLSEL=DDGLITEM(DDGLLINE)
 . ;
 . D CUP(DDGLLINE,1)
 . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 ;
 E  D
 . N DDGLE
 . D SHIFTUP(1,.DDGLE) Q:$G(DDGLE)
 . S DDGLSEL=DDGLITEM(DDGLNL)
 . D DISP(DDGLSEL)
 Q
 ;
PUP ;Page up in list
 I DDGLLINE>1 D
 . D CUP(DDGLLINE,1)
 . W $E(DDGLSEL,1,DDGLNC)
 . S DDGLLINE=1,DDGLSEL=DDGLITEM(1)
 . D CUP(1,1)
 . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 ;
 E  D
 . N DDGLE
 . D SHIFTDN(DDGLNL,.DDGLE) Q:$G(DDGLE)
 . S DDGLSEL=DDGLITEM(1)
 . D DISP(DDGLSEL)
 Q
 ;
PDN ;Page down in list
 I DDGLLINE<DDGLNL D
 . D CUP(DDGLLINE,1)
 . W $E(DDGLSEL,1,DDGLNC)
 . F DDGLLINE=DDGLNL:-1:1 Q:DDGLITEM(DDGLLINE)]""
 . S DDGLSEL=DDGLITEM(DDGLLINE)
 . D CUP(DDGLLINE,1)
 . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 ;
 E  D
 . N DDGLE
 . D SHIFTUP(DDGLNL,.DDGLE) Q:$G(DDGLE)
 . S DDGLSEL=DDGLITEM(DDGLNL)
 . D DISP(DDGLSEL)
 Q
 ;
TOP ;Move to top of list
 N DDGLFRST,DDGLI,DDGLT
 ;
 ;Check whether first item in list is the first displayed
 S DDGLFRST=$O(@DDGLGLO@(""))
 I DDGLFRST=DDGLITEM(1) D:DDGLLINE>1 PUP Q
 ;
 ;Fill DDGLITEM array
 S DDGLT=DDGLFRST
 F DDGLI=1:1:DDGLNL D
 . S DDGLITEM(DDGLI)=DDGLT
 . S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 ;
 S DDGLLINE=1,DDGLSEL=DDGLITEM(1)
 D DISP(DDGLSEL)
 Q
 ;
BOT ;Move to bottom of list
 N DDGLAST,DDGLI,DDGLT,DDGLIND
 ;
 ;Set DDGLIND = index of last non-null DDGLITEM
 F DDGLIND=DDGLNL:-1:1 Q:DDGLITEM(DDGLIND)]""
 ;
 S DDGLAST=$O(@DDGLGLO@(""),-1)
 I DDGLAST=DDGLITEM(DDGLIND) D:DDGLLINE<DDGLIND PDN Q
 ;
 ;Fill DDGLITEM array
 S DDGLT=DDGLAST
 F DDGLI=DDGLNL:-1:1 D
 . S DDGLITEM(DDGLI)=DDGLT
 . S DDGLT=$O(@DDGLGLO@(DDGLT),-1)
 ;
 S DDGLLINE=DDGLNL,DDGLSEL=DDGLITEM(DDGLNL)
 D DISP(DDGLSEL)
 Q
 ;
SEL ;Select item
 K DDGLOUT
 S DDGLOUT=$O(@DDGLGLO@(DDGLSEL,"")),DDGLOUT(0)=DDGLSEL
 S DDGLOUT("C")="SEL"
 S DDGLQT=1
 Q
 ;
QT ;Quit
 K DDGLOUT
 S DDGLOUT=-1,DDGLOUT(0)="",DDGLOUT("C")="QT"
 S DDGLQT=1
 Q
 ;
TO ;Timeout
 D:$G(DDGLKEY("KMAP","TO"))]"" @DDGLKEY("KMAP","TO")
 K DDGLOUT
 S DDGLOUT=-1,DDGLOUT(0)="",DDGLOUT("C")="TO"
 S DDGLQT=1
 Q
 ;
READ() ;Read next key and return mnemonic
 N S,Y
 F  R *Y:DTIME D C Q:Y'=-1
 Q Y
 ;
C I Y<0 S Y="TO" Q
 S S=""
C1 S S=S_$C(Y)
 I DDGLKEY("KMAP","IN")'[(U_S) D  I Y=-1 W $C(7) D FLUSH Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32) S:DDGLKEY("KMAP","IN")'[(U_S_U) Y=-1
 ;
 I DDGLKEY("KMAP","IN")[(U_S_U),S'=$C(27) S Y=$P(DDGLKEY("KMAP","OUT"),";",$L($P(DDGLKEY("KMAP","IN"),U_S_U),U)) Q
 R *Y:5 G:Y'=-1 C1
 W $C(7)
 Q
 ;
SHIFTDN(DDGLN,DDGLE) ;Shift DDGLITEM array down DDGLN times
 ;Out:  DDGLE = 1, if no more items above
 ;
 N DDGLI,DDGLT,DDGLA
 S DDGLE=0
 S DDGLT=DDGLITEM(1) I DDGLT="" S DDGLE=1 Q
 ;
 F DDGLI=-1:-1:-DDGLN S DDGLT=$O(@DDGLGLO@(DDGLT),-1) Q:DDGLT=""  D
 . S DDGLA(DDGLI)=DDGLT
 S:DDGLT="" DDGLI=DDGLI+1
 I DDGLI=0 S DDGLE=1 Q
 S DDGLN=-DDGLI
 ;
 F DDGLI=DDGLNL:-1:DDGLN+1 S DDGLITEM(DDGLI)=DDGLITEM(DDGLI-DDGLN)
 F DDGLI=DDGLN:-1:1 S DDGLITEM(DDGLI)=DDGLA(DDGLI-DDGLN-1)
 Q
 ;
SHIFTUP(DDGLN,DDGLE) ;Shift DDGLITEM array down DDGLN times
 ;Out:  DDGLE = 1, if no more items above
 ;
 N DDGLI,DDGLT,DDGLA
 S DDGLE=0
 S DDGLT=DDGLITEM(DDGLNL) I DDGLT="" S DDGLE=1 Q
 ;
 F DDGLI=1:1:DDGLN S DDGLT=$O(@DDGLGLO@(DDGLT)) Q:DDGLT=""  D
 . S DDGLA(DDGLI)=DDGLT
 S:DDGLT="" DDGLI=DDGLI-1
 I DDGLI=0 S DDGLE=1 Q
 S DDGLN=DDGLI
 ;
 F DDGLI=1:1:DDGLNL-DDGLN S DDGLITEM(DDGLI)=DDGLITEM(DDGLI+DDGLN)
 F DDGLI=DDGLNL-DDGLN+1:1:DDGLNL S DDGLITEM(DDGLI)=DDGLA(DDGLI-DDGLNL+DDGLN)
 Q
 ;
DISP(DDGLSEL) ;Display the list
 ;In: DDGLSEL = text of selected item
 ;
 N DDGLI,DDGLT
 F DDGLI=1:1:DDGLNL D
 . D CUP(DDGLI,1)
 . S DDGLT=$E(DDGLITEM(DDGLI),1,DDGLNC)
 . S DDGLT=$S(DDGLT=DDGLSEL:$P(DDGLVID,DDGLDEL,6)_DDGLT_$P(DDGLVID,DDGLDEL,10),1:DDGLT)_$J("",DDGLNC-$L(DDGLT))
 . W DDGLT
 Q
 ;
FLUSH ;Flush read buffer
 N DDGLX
 F  R *DDGLX:0 E  Q
 Q
 ;
CUP(Y,X) ;Position cursor relative to list coords
 S DY=DDGLROW+Y,DX=DDGLCOL+X+1 X IOXY
 Q

DDGLCBOX
DDGLCBOX ;SFISC/MKO-COMBO BOX ;2:09 PM  26 Apr 1996
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CBOX(DDGLGLO,DDGLOUT,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLFLG) ;
 Q:$G(DDGLGLO)=""
 ;
 N DDGLCBOX,DDGLSEL,DDGLI,DDGLNC,DDGLEMAP,DDGLTERM,DDGLDONE
 ;
 ;Create list box and set up defaults
 D INIT
 ;
 ;Save the # columns and selected text
 S DDGLI=DDGLCBOX(DDGLCBOX,"SV")
 S DDGLNC=$P(DDGLI,U,5)
 S DDGLSEL=DDGLCBOX(DDGLCBOX,"ITEM",$P(DDGLI,U,6))
 K DDGLI
 ;
 ;Write the brackets for the edit field
 S DY=DDGLROW,DX=DDGLCOL X IOXY
 W "["_$J("",DDGLNC)_"]"
 ;
 ;Read for the edit box
 S DDGLEMAP(1)="EKDN^DDGLCBOX;KEYDOWN"
 S DDGLEMAP(2)="EQUIT^DDGLCBOX;$C(27,27)"
 S DDGLEMAP(3)="EQUIT^DDGLCBOX;F1_""Q"""
 S DDGLEMAP(4)="EQUIT^DDGLCBOX;F1_""C"""
 S DDGLEMAP(5)="EEXIT^DDGLCBOX;F1_""E"""
 ;
 F  D  Q:$G(DDGLDONE)
 . D EN^DIR0(DDGLROW,DDGLCOL+1,DDGLNC,1,DDGLSEL,245,0,.DDGLEMAP,"KTW",.DDGLSEL,.DDGLTERM)
 . I $P(DDGLTERM,U)="N" S DDGLDONE=1 Q
 . I $P(DDGLTERM,U)="QUIT" S DDGLDONE=1 Q
 . I $P(DDGLTERM,U)="TO" S DDGLDONE=1 Q
 . ;
 . D READ^DDGLBXA(.DDGLCBOX,.DDGLOUT)
 . I DDGLOUT("C")'="TAB" S DDGLDONE=1 Q
 . S DDGLSEL=DDGLOUT(0)
 ;
 ;Clear edit field and destroy list box
 S DY=DDGLROW,DX=DDGLCOL X IOXY
 W $J("",DDGLNC+2)
 D DESTROY^DDGLBXA(DDGLCBOX,$G(DDGLFLG))
 Q
 ;
EKDN ;
 Q:"^UP^DOWN^RIGHT^LEFT^TAB^"[(U_Y_U)
 ;
 D E1^DIR01
 S DIR0CH=""
 Q:DIR0A=""
 ;
 N DDGLDX,DDGLDY
 W $P(DDGLVID,DDGLDEL,10)
 S DDGLDX=DX,DDGLDY=DY
 ;
 D UPDATE^DDGLBXA(.DDGLCBOX,DIR0A)
 ;
 W $P(DDGLVID,DDGLDEL,6)
 S DX=DDGLDX,DY=DDGLDY
 Q
EQUIT ;
 S DIR0QT="1^QUIT"
 Q
EEXIT ;
 S DIR0QT="1^N"
 Q
LTAB ;
 K DDGLOUT
 S DDGLOUT=$O(@DDGLGLO@(DDGLSEL,"")),DDGLOUT(0)=DDGLSEL
 S DDGLOUT("C")="TAB"
 S DDGLQT=1
 Q
 ;
LKDN ;
 N DY,DX
 S DY=DDGLROW-1,DX=DDGLCOL X IOXY
 W DDGLSEL_$J("",DDGLNC-$L(DDGLSEL))
 Q
 ;
INIT ;Set defaults and create list box
 ;Returns:  DDGLCBOX array
 ;
 D INIT^DDGLIB0()
 ;
 ;Set defaults for row and column
 N DDGLMAP
 I $G(DDGLROW,-1)<0 S DDGLROW=5
 E  I DDGLROW+4>IOSL S DDGLROW=IOSL-4
 I $G(DDGLCOL,-1)<0 S DDGLCOL=5
 E  I DDGLCOL+6>IOM S DDGLCOL=IOM-6
 ;
 ;Check DDGLHT and DDGLWD
 S DDGLHT=$S($D(DDGLHT)[0:7,DDGLHT<3:3,1:DDGLHT)
 S:DDGLROW+DDGLHT+2>IOSL DDGLHT=IOSL-DDGLROW
 ;
 S DDGLWD=$S($D(DDGLWD)[0:14,DDGLWD<5:5,1:DDGLWD)
 S:DDGLCOL+DDGLWD+2>IOM DDGLWD=IOM-DDGLCOL
 ;
 S DDGLMAP(1)="LTAB^DDGLCBOX;$C(9)"
 S DDGLMAP(2)="LKDN^DDGLCBOX;KEYDOWN"
 ;
 D CREATE^DDGLBXA(DDGLGLO,.DDGLCBOX,DDGLROW+1,DDGLCOL+1,DDGLHT,DDGLWD,$G(DDGLSEL),.DDGLMAP)
 Q
 ;

DDGLIB0
DDGLIB0 ;SFISC/MKO-SETUP AND CLEANUP FOR WINDOWS ; 06 MAR 2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
INIT() ;Setup required variables
 ;Set margin to 0
 ;Turn autowrap off
 ;Turn type-ahead on
 ;Variables set:
 ;  DDGLDEL  = delimiter for other DDGL variables
 ;  DDGLVID  = codes that turn on/off video attributes
 ;  DDGLED   = codes for editing
 ;  DDGLCLR  = codes to erase characters
 ;  DDGLGRA  = codes for graphics characters
 ;  DDGLZOSF = array of code from %ZOSF (as of V22.2 - array comes from OS file)
 ;  DDGLREF  = global where window image is stored
 ;  DDGLKEY  = codes for non-alphanumeric keys
 ;  DDGLSCR  = array containing list of visible windows on screen
 ;
 N X
 I $D(DDGLDEL)[0 D SET Q:$G(DIERR)
 S X=0 X DDGLZOSF("RM"),DDGLZOSF("TYPE-AHEAD")
 W $P(DDGLVID,DDGLDEL,8)
 Q
 ;
SET ;Setup screen handling variables
 K DIERR,DDGLSCR
 S U="^",DDGLDEL=$C(127)
 ;
 ; VEN/SMH - remove reliance on %ZOSF node -- next 3 lines changed v 22.2
 D:'$D(DISYS) OS^DII ; garb OS from %ZOSF or Fileman in this sequence
 F X="EOFF","EON","TRMOFF","TRMON","TRMRD","RM","TYPE-AHEAD","NO-TYPE-AHEAD" D  G:$G(DIERR) ABT
 . S DDGLZOSF(X)=$G(^DD("OS",DISYS,X))
 ;
ZIS N %ZIS,IOP S IOP="HOME" D ^%ZIS I POP D BLD^DIALOG(845) G ABT
 I $D(^%ZIS(2)),'$O(^%ZIS(2,+$G(IOST(0)),0)) D BLD^DIALOG(840,"#"_+$G(IOST(0))) G ABT
 ;
 D:$G(IOXY)="" TRMERR("Cursor positioning (XY CRT)")
 ;
 S X="IORVON;IORVOFF;IOELEOL;IOEDEOP;IOUON;IOUOFF;IOSGR0;IOINHI;IOINLOW;IOINORM;IOCUU;IOCUD;IOCUF;IOCUB;IODL;IOIL;IODCH;IOICH;IOEDALL;IOELALL;IORI;IOAWM1;IOAWM0;IOSTBM;IOPF1;IOPF2;IOPF3;IOPF4;IOFIND;IOSELECT;IOINSERT;IOREMOVE;IOPREVSC;IONEXTSC"
 N @$TR(X,";",",")
 N IOBLC,IOBRC,IOBT,IOG1,IOG0,IOHL,IOLT,IOMT,IORT,IOTLC,IOTRC,IOTT,IOVL
 D ENDR^%ZISS,GSET^%ZISS
 I $G(IOPREVSC)="" D  ;"^C-VT220^C-VT320^"[(U_IOST_U) D   IOST MIGHT BE VT-100
 . S IOPREVSC=$C(27)_"[5~"
 . S IONEXTSC=$C(27)_"[6~"
 ;
ATT ;tried: S IOINLOW=X_"32m" ;LOW  = GREEN
 N A,B S A(1)=$C(27,91)_"40m",A(2)=$C(27,91)_"41m",A(3)=$C(27,91)_"45m" ;Defaults 
 I $G(^XTV(8989.5,0))?1"PARAM".E F X=1,2,3 S A=$$GET^XPAR("ALL","DI SCREENMAN COLORS",X),B=$$GET^XPAR("ALL","DI SCREENMAN COLORS",X+3) S:B]"" A(X)=$C(27,91)_(10+B)_"m" S:A]"" A(X)=A(X)_$C(27,91)_+A_"m"
 S IOUON=IOINHI_A(1) ;REQ CAPTION BACKGROUND (BLACK)
 S IOINHI=IOINHI_A(2) ;DATA BACKGROUND (RED)
 S IORVON=IOINHI_A(3) ;CLICKABLE BACKGROUND (MAGENTA)
 S (IORVOFF,IOUOFF)=IOINORM
 S DDGLVID=IOINHI_DDGLDEL_IOINLOW_DDGLDEL_IOINORM_DDGLDEL_IOUON_DDGLDEL_IOUOFF_DDGLDEL_IORVON_DDGLDEL_IORVOFF_DDGLDEL_IOAWM0_DDGLDEL_IOAWM1_DDGLDEL_$G(IOSGR0)
 S DDGLED=$G(IORI)_DDGLDEL_$G(IOSTBM)_DDGLDEL_$G(IOIL)_DDGLDEL_$G(IODL)_DDGLDEL_$G(IOICH)_DDGLDEL_$G(IODCH)
 S DDGLCLR=IOELEOL_DDGLDEL_IOEDALL_DDGLDEL_IOEDEOP_DDGLDEL_$G(IOELALL)
 S DDGLKEY=U_IOCUU_U_IOCUD_U_IOCUF_U_IOCUB_U_IOPF1_U_IOPF2_U_IOPF3_U_IOPF4_U_$G(IOFIND)_U_$G(IOSELECT)_U_$G(IOINSERT)_U_$G(IOREMOVE)_U_$G(IOPREVSC)_U_$G(IONEXTSC)_U
 S DDGLGRA=IOG1_DDGLDEL_IOG0_DDGLDEL_IOHL_DDGLDEL_IOVL_DDGLDEL_IOTLC_DDGLDEL_IOTRC_DDGLDEL_IOBLC_DDGLDEL_IOBRC
 S:DDGLDEL_$P(DDGLGRA,DDGLDEL,3,999)_DDGLDEL[(DDGLDEL_DDGLDEL) DDGLGRA=DDGLDEL_DDGLDEL_"-"_DDGLDEL_"|"_DDGLDEL_"+"_DDGLDEL_"+"_DDGLDEL_"+"_DDGLDEL_"+"
 ;
 D:$P(DDGLKEY,U,1,5)_U[(U_U) TRMERR("Cursor keys")
 D:U_$P(DDGLKEY,U,6,9)_U[(U_U) TRMERR("PF keys")
 D:IOELEOL="" TRMERR("Erase to End of Line")
 D:IOEDALL="" TRMERR("Erase Entire Page")
 D:IOEDEOP="" TRMERR("Erase to End of Page")
 G:$G(DIERR) ABT
 ;
 S DDGLREF="^TMP(""DDGL"",$J,""W"")" K @DDGLREF
 ;
 I "^C-QUME^C-QVT102^C-WYSE75^"[(U_$TR(IOST," ","")_U) D
 . S DDGLVAN=1
 . S $P(DDGLVID,DDGLDEL,4,7)=$S($TR(IOST," ","")="C-WYSE75":IOINHI_DDGLDEL_IOINLOW_DDGLDEL_IOINHI_DDGLDEL_IOINLOW,1:IOINLOW_DDGLDEL_IOINHI_DDGLDEL_IOINLOW_DDGLDEL_IOINHI)
 . S $P(DDGLVID,DDGLDEL,10)=IOINORM
 ;
 D:'$D(^%ZTSK)!($D(^%ZOSF("MGR"))[0) KILL^%ZISS
MOUSEON ;I $G(DDS)>0 W *27,"[?1000h" NOW DONE IN DDS0
 Q
 ;
 ;
ASKIOSL ; not used
 ;N X
 ;X ^%ZOSF("EOFF")
 R X:0 S XX=""
 W $C(27)_7_$C(27)_"[r"_$C(27)_"[999;999H"_$C(27)_"[6n" R X ; R *X:1 R:$T XX S X=$C(X)_XX
 ;S X=+$E(X,3,5) I X S IOSL=X
 Q
 ;
 ;
 ;
TRMERR(DDGLCH) ;Terminal type errors
 N P
 S P(1)=DDGLCH,P(2)=IOST
 D BLD^DIALOG(842,.P)
 Q
 ;
 ;
 ;
KILL(DDGLPARM) ;Cleanup variables
 ;Set margin to IOM
 ;Turn off type-ahead if New Person file so indicates
 ;Turn autowrap on
 ;Reset character attributes
 ;Turn echo on
 ;Turn terminators off
 N X
 D:'$D(DISYS) OS^DII ; garb OS from %ZOSF or Fileman in this sequence
 I $G(DDGLPARM)'["W" D
 . S X=$S($D(IOM)#2:IOM,1:80) X $G(DDGLZOSF("RM"))
 . I $D(DUZ)#2,$D(^VA(200,DUZ,0))#2,$P($G(^(200)),U,9)'="Y" D
 .. I '$G(DUZ("BUF"),1) X $G(DDGLZOSF("NO-TYPE-AHEAD"))
 . W $P($G(DDGLVID),$G(DDGLDEL),9),$P($G(DDGLVID),$G(DDGLDEL),10)
 ;
 I $G(DDGLPARM)'["T" D
 . X $G(DDGLZOSF("EON")),$G(DDGLZOSF("TRMOFF"))
 E  X $G(DDGLZOSF("EOFF")),$G(DDGLZOSF("TRMON"))
 ;
MOUSEOFF ;W *27,"[?1000l"  NOW DONE IN DDS0
ABT K DX,DY,POP
 I '$G(DIERR),$G(DDGLPARM)["K" Q
 K:$G(DDGLREF)]"" @DDGLREF
 D:'$D(^%ZTSK)!($D(^%ZOSF("MGR"))[0) KILL^%ZISS
 ;
 K DDGLDEL,DDGLVID,DDGLED,DDGLCLR,DDGLGRA,DDGLZOSF,DDGLREF
 K DDGLKEY,DDGLSCR,DDGLVAN,DDGLH
 ;
 K DIR0

DDGLIBH
DDGLIBH ;SFISC/MKO-SCREEN EDITOR HELP ; 15NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
HLP(DDGLHN1,DDGLHN2,DDGLSUB,DDGLPLN) ;
 ;DDGLHN1  = Entry number in Dialog file of first help screen
 ;DDGLHN2  = Entry number of last help screen
 ;DDGLSUB  = Subscript in ^TMP to copy help to
 ;DDGLPLN  = $Y to print prompt
 ;
 N DX,DY,DDGLI,DDGLJ,DDGLSC,DDGLTX,DDGLX,DIHELP,DDGL0
 S DDGL0=$C(31)
 D:'$D(DDGLH) GETKEY
 I $D(IOTM)[0 N IOTM S IOTM=1
 I $D(IOBM)[0 N IOBM S IOBM=IOSL
 I '$G(DDGLPLN) S DDGLPLN=IOBM-1
 S DDGLSC=DDGLHN1
 ;
 D DISP(DDGLHN1)
 ;
 F  S DDGLX=$$READ D @DDGLX Q:DDGLX=U
 Q
 ;
UP I DDGLSC>DDGLHN1 S DDGLSC=DDGLSC-1 D DISP(DDGLSC)
 Q
 ;
DN I DDGLSC<DDGLHN2 S DDGLSC=DDGLSC+1 D DISP(DDGLSC)
 Q
 ;
TO W $C(7)
QT S DDGLX=U
 Q
 ;
PT ;Prompt for device and print
 ;Clear screen
 N POP
 N %,%A,%B,%B1,%B2,%B3,%BA,%C,%E,%G,%H,%I,%J,%K,%M,%N
 N %P,%S,%T,%W,%X,%Y
 N %A0,%D1,%D2,%DT,%J1,%W0
 ;
 S DY=IOTM-1,DX=0 X IOXY
 W $P(DDGLVID,DDGLDEL)_"PRINT THE HELP SCREENS"_$P(DDGLVID,DDGLDEL,10)_$P(DDGLCLR,DDGLDEL)
 F DDGLI=1:1:IOBM-IOTM W $C(13,10)_$P(DDGLCLR,DDGLDEL)
 S DY=IOTM+1,DX=0 X IOXY
 ;
 X DDGLZOSF("EON"),DDGLZOSF("TRMOFF")
 S X=$G(IOM,80) X DDGLZOSF("RM") ; VEN/SMH changed.
 W $P(DDGLVID,DDGLDEL,9)
 ;
DEVICE ;Device prompt
 N IOF,IOSL
 S IOF="#",IOSL=IOBM-IOTM+1 ;In case help frames are invoked
 S %ZIS=$S($D(^%ZTSK):"Q",1:""),%ZIS("B")=""
 D ^%ZIS K %ZIS
 ;
 I POP D
 . W !!,"Report canceled!"
 . H 2
 ;
 ;Queue report
 E  I $D(IO("Q")),$D(^%ZTSK) D
 . S ZTRTN="PRINT^DDGLIBH"
 . S ZTDESC="Help screen printout."
 . N I F I="DDGLHN1","DDGLHN2" S ZTSAVE(I)=""
 . D ^%ZTLOAD
 . I $D(ZTSK)#2 W !,"Report queued!",!,"Task number: "_ZTSK,!
 . E  W !,"Report canceled!",!
 . K ZTSK
 . S IOP="HOME" D ^%ZIS
 ;
 E  I $E(IOST,1,2)="C-" D
 . W !,$C(7)_"You cannot print the help screens on a CRT.",!
 . H 2
 ;
 ;Non-queued report
 E  D
 . W !,"Printing ..."
 . U IO
 . D PRINT
 . X $G(^%ZIS("C"))
 ;
 ;Repaint help screen
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMON")
 S X=0 X DDGLZOSF("RM") ; VEN/SMH changed.
 W $P(DDGLVID,DDGLDEL,8)
 D DISP(DDGLSC)
 Q
 ;
PRINT ;
 N DDGLJ,DDGLL,DDGLP
 F DDGLI=DDGLHN1:1:DDGLHN2 D
 . I DDGLI'=DDGLHN1 D
 .. I $Y+$O(^DI(.84,DDGLI,2," "),-1)+2'<IOSL W @IOF
 .. E  W !!
 . S DDGLJ=0
 . F  S DDGLJ=$O(^DI(.84,DDGLI,2,DDGLJ)) Q:'DDGLJ  D
 .. S DDGLL=$G(^DI(.84,DDGLI,2,DDGLJ,0))
 .. F  Q:DDGLL'["\"  D
 ... S DDGLP=$F(DDGLL,"\") Q:$E(DDGLL,DDGLP)="\"
 ... S $E(DDGLL,DDGLP-1,DDGLP)=""
 .. W !,DDGLL
 ;
 S:$D(ZTQUEUED) ZTREQ="@"
 Q
 ;
DISP(DDGLHN) ;Print help screen DDGLHN
 N DDGLHARR
 S DDGLHARR=$NA(^TMP(DDGLSUB,$J,DDGLHN))
 D:'$D(@DDGLHARR) BLD^DIALOG(DDGLHN,"","",DDGLHARR)
 ;
 S DY=IOTM-1,DX=0 X IOXY
 F DDGLI=1:1 Q:'$D(@DDGLHARR@(DDGLI))  S DDGLTX=^(DDGLI) D
 . I DDGLTX["\B" F  S DDGLJ=$F(DDGLTX,"\B") Q:'DDGLJ  D
 .. S $E(DDGLTX,DDGLJ-2,DDGLJ-1)=$P(DDGLVID,DDGLDEL)
 . I DDGLTX["\n" F  S DDGLJ=$F(DDGLTX,"\n") Q:'DDGLJ  D
 .. S $E(DDGLTX,DDGLJ-2,DDGLJ-1)=$P(DDGLVID,DDGLDEL,10)
 . W $S(DDGLI>1:$C(13,10),1:"")_DDGLTX_$P(DDGLCLR,DDGLDEL)
 ;
 F DDGLI=DDGLI:1:IOBM-IOTM+1 W $C(13,10)_$P(DDGLCLR,DDGLDEL)
 Q
 ;
READ() ;
 S DY=DDGLPLN,DX=0 X IOXY
 W $P(DDGLCLR,DDGLDEL)_"Press "
 W:DDGLSC>DDGLHN1 $P(DDGLVID,DDGLDEL)_"<Up>"_$P(DDGLVID,DDGLDEL,10)_" for previous page, "
 W:DDGLSC<DDGLHN2 $P(DDGLVID,DDGLDEL)_"<Down>"_$P(DDGLVID,DDGLDEL,10)_" for next page, "
 W $P(DDGLVID,DDGLDEL)_"P"_$P(DDGLVID,DDGLDEL,10)_" to print, "
 W $P(DDGLVID,DDGLDEL)_"^"_$P(DDGLVID,DDGLDEL,10)_" to exit: "
 D GETCH(DTIME,.DDGLX)
 S DY=DDGLPLN,DX=0 X IOXY W $P(DDGLCLR,DDGLDEL)
 Q DDGLX
 ;
GETCH(DTIME,Y) ;Out: Y = Mnemonic
 F  D  Q:Y'=-1
 . R *Y:DTIME
 . I Y<0 S Y="TO" Q
 . D MNE(.Y)
 Q
 ;
MNE(Y) ;Out: Y = Mnemonic, or -1 if invalid
 N S,F
 S S="",F=0
 F  D MNELOOP Q:F
 Q
 ;
MNELOOP ;Read more
 S S=S_$C(Y)
 I DDGLH("IN")'[(DDGL0_S) D  I Y=-1 D FLUSH Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32)
 . S:DDGLH("IN")'[(DDGL0_S_DDGL0) Y=-1
 ;
 I DDGLH("IN")[(DDGL0_S_DDGL0),S'=$C(27) D  Q
 . S Y=$P(DDGLH("OUT"),DDGL0,$L($P(DDGLH("IN"),DDGL0_S_DDGL0),DDGL0)),F=1
 ;
 R *Y:5 D:Y=-1 FLUSH
 Q
 ;
FLUSH ;
 N DDGLZ
 S F=1 W $C(7) F  R *DDGLZ:0 E  Q
 Q
 ;
GETKEY ;Get key sequences and defaults
 N AU,AD,F1,PREVSC,NEXTSC
 N I,K,N,T
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S F1=$P(DDGLKEY,U,6)
 S PREVSC=$P(DDGLKEY,U,14)
 S NEXTSC=$P(DDGLKEY,U,15)
 ;
 K DDGLH
 S DDGLH("IN")="",DDGLH("OUT")=""
 F I=1:1 S T=$P($T(MAP+I),";;",2,999) Q:T=""  D
 . S @("K="_$P(T,";",2))
 . I DDGLH("IN")'[(DDGL0_K),K]"" D
 .. S DDGLH("IN")=DDGLH("IN")_DDGL0_K
 .. S DDGLH("OUT")=DDGLH("OUT")_$P(T,";")_DDGL0
 S DDGLH("IN")=DDGLH("IN")_DDGL0
 S DDGLH("OUT")=$E(DDGLH("OUT"),1,$L(DDGLH("OUT"))-1)
 Q
 ;
MAP ;Keys
 ;;DN;$C(13)
 ;;DN;AD
 ;;DN;F1_AD
 ;;DN;NEXTSC
 ;;UP;AU
 ;;UP;F1_AU
 ;;UP;PREVSC
 ;;QT;F1_"E"
 ;;QT;F1_"Q"
 ;;QT;"^"
 ;;PT;"P"

DDGLIBP
DDGLIBP ;SFISC/MKO-PRINT FROM WITHIN SCREEN TOOLS ;2013-03-04
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 19
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PT(DDGLROOT,DDGLHDR) ;Prompt for device and print
 N POP,DDGLBAR,DDGLFLAG,DDGLHELP,DDGLI,DDGLPHDR,DDGLREF,DDGLWRAP,DX,DY,DIR0,DDS
 N %,%A,%B,%B1,%B2,%B3,%BA,%C,%E,%G,%H,%I,%J,%K,%M,%N
 N %P,%S,%T,%W,%X,%Y
 N %A0,%D1,%D2,%DT,%J1,%W0
 ;
 S DDGLFLAG=""
 ;
 ;Set terminal characterstics for scroll mode
 X DDGLZOSF("EON"),DDGLZOSF("TRMOFF")
 S X=$G(IOM,80) X DDGLZOSF("RM")
 W $P(DDGLVID,DDGLDEL,9)
 ;
 W:$G(DDGLHDR)]"" "Document: "_DDGLHDR,!
 ;
 ;Prompt whether to print a header
 S DDGLHELP(1)="  Answer 'Y' to print a document title, date/time, and page number"
 S DDGLHELP="  at the top of each page."
 S DDGLPHDR=$$YNREAD("Print a header on each page","N",.DDGLHELP)
 K DDGLHELP
 I DDGLPHDR=-1 D FINISH("Report canceled.") Q
 S:DDGLPHDR DDGLFLAG=DDGLFLAG_"H"
 ;
 ;Prompt whether to wrap text
 S DDGLHELP(1)="  Answer 'Y' to wrap the text at word boundaries to fit within the margins"
 S DDGLHELP(2)="             of the device."
 S DDGLHELP="  Answer 'N' to print the text as-is (no-wrap)."
 S DDGLWRAP=$$YNREAD("Wrap text","N",.DDGLHELP)
 K DDGLHELP
 I DDGLWRAP=-1 D FINISH("Report canceled.") Q
 ;
 ;Prompt whether to interpret word processing (|) windows"
 S DDGLHELP(1)="  Answer 'Y' to have text enclosed within vertical bars (|) interpreted as"
 S DDGLHELP(2)="             word processing windows."
 S DDGLHELP="  Answer 'N' to have vertical bars printed as-is."
 S DDGLBAR=$$YNREAD("Interpret word processing windows (|)","N",.DDGLHELP)
 K DDGLHELP
 I DDGLBAR=-1 D FINISH("Report canceled.") Q
 ;
 ;Set flag for wrap and wp windows
 S DDGLFLAG=DDGLFLAG_$S(DDGLWRAP&'DDGLBAR:"|",'DDGLWRAP&DDGLBAR:"N",'DDGLWRAP&'DDGLBAR:"X",1:"")
 ;
DEVICE ;Device prompt
 N IOF,IOSL
 S IOF="#",IOSL=IOBM-IOTM+1 ;In case help frames are invoked
 S %ZIS=$S($D(^%ZTSK):"Q",1:""),%ZIS("B")=""
 S %ZIS("S")="I $TR($P(^(0),U),""browse"",""BROWSE"")'[""BROWSE"""
 D ^%ZIS K %ZIS
 ;
 I POP D FINISH("Report canceled!") Q
 ;
 ;Get the closed root of the array containing the text, resolve values like $J
 S DDGLREF=$NA(@$$CREF^DILF($G(DDGLROOT)))
 ;
 ;If CRT selected, reset scrolling region to entire screen
 I $E(IOST,1,2)="C-" D
 . I $D(IOSTBM)#2 N IOTM,IOBM S IOTM=0,IOBM=$G(IOSL,24) W @IOSTBM
 . W @IOF
 ;
 ;Queue report
 I $D(IO("Q")),$D(^%ZTSK) D  Q
 . N I,ZTRTN,ZTDESC,ZTSAVE,ZTSK,DDGLMSG
 . S ZTRTN="PRINT^DDGLIBP"
 . S ZTDESC=DDGLHDR
 . F I="DDGLREF","DDGLHDR","DDGLFLAG" S ZTSAVE(I)=""
 . I DDGLREF]"" S ZTSAVE($$OREF^DILF(DDGLREF))=""
 . D ^%ZTLOAD
 . I $D(ZTSK)#2 D
 .. W !,"Report queued!",!,"Task number: "_ZTSK,!
 .. D EOPREAD
 . E  S DDGLMSG="Report canceled!"
 . S IOP="HOME" D ^%ZIS
 . D FINISH($G(DDGLMSG))
 ;
 ;Non-queued report
 D PRINT
 I $E(IOST,1,2)="C-" W @IOF W:$D(IOSTBM)#2 @IOSTBM ; Reset bottom margin
 X $G(^%ZIS("C"))
 D FINISH("Done.")
 Q
 ;
PRINT ;Print the document in DDGLREF, Header text in DDGLHDR
 N DDGLDT,DDGLI,DDGLPAGE,DDGLZN
 I $G(DDGLREF)="" D PRINTQ Q
 I '$D(@DDGLREF) D PRINTQ Q
 ;
 S DDGLZN=$D(@DDGLREF@($O(@DDGLREF@(0)),0))#2
 S DDGLFLAG=$G(DDGLFLAG)
 ;
 ;Format the text, if DDGLFLAG doesn't contain X
 I DDGLFLAG'["X" D
 . D FORMAT(DDGLREF,DDGLZN,DDGLFLAG)
 . S DDGLZN=1
 . S DDGLREF=$NA(^UTILITY($J,"W",1))
 ;
 ;Write the report from the original location or from ^UTILITY
 U IO
 I DDGLFLAG["H" D
 . ;Get current date/time and write first header
 . N %,%H,X,Y
 . S %H=$H D YX^%DTC
 . S DDGLDT=$E(Y,1,18)
 . D HDR
 ;
 ;Print each line
 S DDGLI=0 F  S DDGLI=$O(@DDGLREF@(DDGLI)) Q:'DDGLI  D
 . I DDGLFLAG["H",$Y+6>IOSL W @IOF D HDR
 . W !,$S(DDGLZN:$G(@DDGLREF@(DDGLI,0)),1:$G(@DDGLREF@(DDGLI)))
 ;
 K:$G(DDGLFLAG)'["N" ^UTILITY($J,"W")
 D PRINTQ
 Q
 ;
PRINTQ ;Delete the queued task and quit
 S:$D(ZTQUEUED) ZTREQ="@"
 Q
 ;
HDR ;Print the header DDGLHDR; increment DDGLPAGE
 N DDGLCOL,DDGLPSTR
 S DDGLPAGE=$G(DDGLPAGE)+1
 S DDGLPSTR=DDGLDT_"    Page: "_DDGLPAGE
 S DDGLCOL=IOM-$L(DDGLPSTR)-1
 W DDGLHDR
 W:$X+2'<DDGLCOL !
 W ?DDGLCOL,DDGLPSTR
 W !,$TR($J("",IOM-1)," ","-")
 Q
 ;
YNREAD(DDGLPROM,DDGLDEF,DDGLHELP) ;Issue a Yes/No Read
 N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
 S DIR(0)="Y"
 S DIR("B")=$S("Nn0"[$E($G(DDGLDEF)):"NO",1:"YES")
 M:$D(DDGLHELP)]"" DIR("?")=DDGLHELP
 S:$G(DDGLPROM)]"" DIR("A")=DDGLPROM
 D ^DIR
 Q $S($D(DIRUT):-1,1:Y)
 ;
EOPREAD ; Issue an End-of-Page Read
 N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
 S DIR(0)="E" D ^DIR
 Q
 ;
FORMAT(DDGLREF,DDGLZN,DDGLFLAG) ;Use ^DIWP to format the text
 N DIWL,DIWR,DIWF,X
 K ^UTILITY($J,"W")
 S DIWL=1,DIWR=IOM-1,DIWF=$E("N",DDGLFLAG["N")_$E("|",DDGLFLAG["|")_$E("X",DDGLFLAG["X")
 S DDGLI=0 F  S DDGLI=$O(@DDGLREF@(DDGLI)) Q:'DDGLI  D
 . S X=$S($G(DDGLZN):@DDGLREF@(DDGLI,0),1:$G(@DDGLREF@(DDGLI)))
 . D ^DIWP
 Q
 ;
FINISH(DDGLMSG) ;Print message and reset terminal characteristics
 I $G(DDGLMSG)]"" W !,DDGLMSG H 1
 ;
 ;Reset terminal characteristics for screen handling
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMON")
 S X=0 X DDGLZOSF("RM")
 W $P(DDGLVID,DDGLDEL,8)
 Q

DDGLIBW
DDGLIBW ;SFISC/MKO-WINDOW PRIMITIVES ;02:24 PM  13 Jul 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Area is defined as $Y^$X^height^width
 ; DDGLREF(wid)=$Y^$X^height^width
 ; DDGLREF(wid,$Y+1,"TXT")=string
 ; DDGLREF(wid,$Y+1,"ATT")=attributes (bold,underline,reverse,graphic)
 ;
 ; DDGLSCR array - keeps track of what windows are on the screen and
 ;                the order in which they overlap
 ; Form of DDGLSCR array:
 ;   DDGLSCR           = # of elements
 ;   DDGLSCR(n)        = wid
 ;   DDGLSCR("B",wid,n)= ""
 ;
CREATE(I,A,B,N) ;
 G CREATE1^DDGLIBW1
 ;
OPEN(I,N) ;
 G OPEN1^DDGLIBW1
 ;
FOCUS(I,N) ;
 G FOCUS1^DDGLIBW1
 ;
CLOSE(I,NC) ;
 G CLOSE1^DDGLIBW1
 ;
CLEAR(I,A) ;
 ;Clear area A in window I
 G CLEAR1^DDGLIBW1
 ;
EXIST(I) ;
 ;Does window I exist?
 Q $D(@DDGLREF@(I))#2
 ;
CLOSEALL(N) ;
 ;Close all windows
 W:'$G(N) $P(DDGLCLR,DDGLDEL,2)
 K DDGLSCR
 Q
 ;
DESTROY(I,NC) ;
 ;Destroy window I
 D CLOSE(I,$G(NC))
 K @DDGLREF@(I)
 Q
 ;
DESTALL ;Destroy all windows
 K @DDGLREF,DDGLSCR
 Q
 ;
WRITE(I,S,Y,X,A,N) ;
 ;Write str S in window I at $Y=R, $X=C, attr A
 ; If N=1, update buffer, but don't write
 N A1,A0,A9
 Q:$G(S)=""
 S:$G(I)="" I=-1
 S A9=$$AREA(I)
 Q:X'<$P(A9,U,4)  Q:Y'<$P(A9,U,3)
 S S=$E(S,1,$P(A9,U,4)-X)
 ;
 S $E(@DDGLREF@(I,Y+1,"TXT"),X+1,X+$L(S))=S
 I $G(A)="",$D(@DDGLREF@(I,Y+1,"ATT"))#2 S $E(@DDGLREF@(I,Y+1,"ATT"),X+1,X+$L(S))=$J("",$L(S))
 S:$G(A)]"" $E(@DDGLREF@(I,Y+1,"ATT"),X+1,X+$L(S))=$TR($J("",$L(S))," ",$$CODE(A,.A1,.A0))
 ;
 I '$G(N) D
 . N DY,DX
 . S DY=Y+$P(A9,U),DX=X+$P(A9,U,2) X IOXY W $G(A1)_S_$G(A0)
 ;
 I $G(@DDGLREF@(I,Y+1,"TXT"))?." ",$G(@DDGLREF@(I,Y+1,"ATT"))?." " K @DDGLREF@(I,Y+1,"TXT"),@DDGLREF@(I,Y+1,"ATT")
 Q
 ;
REPALL(A) ;
 ;Repaint absolute area A in all windows in DDGLSCR array
 N J
 I $G(A)="" D
 . W $P(DDGLCLR,DDGLDEL,2)
 . F J=1:1:$G(DDGLSCR) D REPAINT(DDGLSCR(J))
 E  D
 . D CLEAR(-1,A)
 . F J=1:1:$G(DDGLSCR) D REPAINT(DDGLSCR(J),$$RELAREA(DDGLSCR(J),A))
 Q
 ;
REPAINT(I,A) ;
 ;Repaint area A of window I
 N X,Y,H,W,R,C,T,X1,X2,A2,A1,A0,S,DY,DX,P
 I $D(A),A="" Q
 S:$G(I)="" I=-1
 S:'$D(A) A="0^0^"_IOSL_U_IOM
 ;
 S A2=$$AREA(I)
 S A=$P(A,U)+$P(A2,U)_U_($P(A,U,2)+$P(A2,U,2))_U_$P(A,U,3,4)
 S A=$$INTSECT^DDGLIBW1(A,A2)
 S Y=$P(A,U)-$P(A2,U),X=$P(A,U,2)-$P(A2,U,2),H=$P(A,U,3),W=$P(A,U,4)
 ;
 I $D(@DDGLREF@(I))<9,Y+$P(A2,U)=0,X+$P(A2,U,2)=0,H=IOSL,W=IOM W $P(DDGLCLR,DDGLDEL,2) Q
 S P=IOM-X-$P(A2,U,2)-1_""" """
 F R=Y+1:1:Y+H D
 . S S=""
 . S T=$E($G(@DDGLREF@(I,R,"TXT"))_$J("",X+W-$L($G(@DDGLREF@(I,R,"TXT")))),1,X+W)
 . S A=$E($G(@DDGLREF@(I,R,"ATT")),1,X+W)
 . S (X1,X2)=X+1 F  D  Q:$E(T,X2)=""
 .. S X1=X2,C=$E(A,X1)
 .. I C="" S X2=999 S S=S_$E(T,X1,X2) Q
 .. F X2=X1:1:$L(A)+1 Q:C'=$E(A,X2)
 .. D DECODE(C,.A1,.A0)
 .. S S=S_A1_$E(T,X1,X2-1)_A0
 . S DY=R-1+$P(A2,U),DX=X+$P(A2,U,2) X IOXY
 . W $S(S?@P:$P(DDGLCLR,DDGLDEL),1:S)
 Q
 ;
BOX(I,A,C,N) ;
 ;Draw a box in window I representing area A
 ;If C=1 writes spaces within the box
 ;If N=1 write to buffer but not screen
 N Y,X,H,W,L,R,S,A1
 S:$G(I)="" I=-1
 S:$G(A)="" A=$$AREA(I)
 S:$G(N)="" N=0
 S A1=$$ABSAREA(I,A)
 S Y=$P(A,U),X=$P(A,U,2),H=$P(A,U,3),W=$P(A,U,4)
 Q:'H!'W
 S S=$J("",W-2),L=$TR(S," ",$P(DDGLGRA,DDGLDEL,3))
 D WRITE(I,$P(DDGLGRA,DDGLDEL,5)_$S(W>1:L_$P(DDGLGRA,DDGLDEL,6),1:""),Y,X,"G",N)
 F R=Y+1:1:Y+H-2 D
 . D WRITE(I,$P(DDGLGRA,DDGLDEL,4),R,X,"G",N)
 . I W>1 D
 .. I $G(C) D WRITE(I,S,R,X+1,"",N)
 .. D WRITE(I,$P(DDGLGRA,DDGLDEL,4),R,X+W-1,"G",N)
 D:H>1 WRITE(I,$P(DDGLGRA,DDGLDEL,7)_$S(W>1:L_$P(DDGLGRA,DDGLDEL,8),1:""),Y+H-1,X,"G",N)
 Q
 ;
ABSAREA(I,A) ;
 ;Given relative area A in window I, return absolute area
 N X,Y,H,W,X1,Y1
 S Y=$P(A,U),X=$P(A,U,2),H=$P(A,U,3),W=$P(A,U,4)
 S A=$$AREA(I)
 S Y1=Y+$P(A,U),X1=X+$P(A,U,2)
 S:Y1+H>IOSL H=IOSL-Y1 S:X1+W>IOM W=IOM-X1
 Q Y1_U_X1_U_H_U_W
 ;
RELAREA(I,A) ;
 ;Given absolute area A in window I, return relative area
 N X,Y,H,W,X1,Y1
 S Y=$P(A,U),X=$P(A,U,2),H=$P(A,U,3),W=$P(A,U,4)
 S A=$$AREA(I)
 S Y1=Y-$P(A,U),X1=X-$P(A,U,2)
 Q Y1_U_X1_U_H_U_W
 ;
AREA(I) ;Return the coord and area of window I
 Q $S($D(@DDGLREF@(I))#2:@DDGLREF@(I),1:"0^0^"_IOSL_U_IOM)
 ;
CODE(A,A1,A0) ;
 ;Return code char for selected attr
 N I,C,T
 S C=0,(A1,A0)=""
 S T=$TR(A,"burg","BURG")
 F I=1:1:$L(A) D
 . S T=$T(@$E(A,I))
 . I T]"" D
 .. S C=C+$P(T,";",3)
 .. S A1=A1_$P(@$P(T,";",4),DDGLDEL,$P(T,";",5))
 .. S A0=A0_$P(@$P(T,";",4),DDGLDEL,$P(T,";",6))
 Q $C(C+32)
 ;
DECODE(C,A1,A0) ;
 ;Given code char C, return codes to turn on/off attr
 N B,T
 S (A1,A0)="" Q:" "[$G(C)
 S C=$A(C)-32
 S B=1 F  D  Q:B>8
 . I C\B#2,$T(@B)]"" D
 .. S T=$T(@B+1)
 .. S A1=A1_$P(@$P(T,";",4),DDGLDEL,$P(T,";",5))
 .. S A0=A0_$P(@$P(T,";",4),DDGLDEL,$P(T,";",6))
 . S B=B*2
 Q
 ;
1 ;;
B ;;1;DDGLVID;1;2
2 ;;
U ;;2;DDGLVID;4;5
4 ;;
R ;;4;DDGLVID;6;7
8 ;;
G ;;8;DDGLGRA;1;2

DDGLIBW1
DDGLIBW1 ;SFISC/MKO-WINDOWING PRIMITIVES ;02:23 PM  13 Jul 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CREATE(I,A,B,N) ;
CREATE1 ;Create window I of area A and draw border (if B)
 ;N = nn; first n=1 means don't give the window focus
 ;        second n=1 means don't write to screen
 ;
 S:$G(I)="" I=-1
 S:$G(A)="" A="0^0^"_IOSL_U_IOM
 K @DDGLREF@(I) S @DDGLREF@(I)=A
 D:$G(B) BOX^DDGLIBW(I,"0^0^"_$P(A,U,3,4),1,$G(N))
 D:$G(N)<9 FOCUS(I,$G(N)!$G(B))
 Q
 ;
OPEN(I,N) ;
OPEN1 ;Open window I
 G FOCUS1
 ;
FOCUS(I,N) ;
FOCUS1 ;Give focus to window I
 ;If N=1; don't paint window
 Q:$D(@DDGLREF@(I))[0
 Q:$G(DDGLSCR(+$G(DDGLSCR)))=I
 ;
 I '$D(DDGLSCR("B",I)) D
 . S DDGLSCR=$G(DDGLSCR)+1,DDGLSCR(DDGLSCR)=I,DDGLSCR("B",I,DDGLSCR)=""
 E  D
 . N M,N
 . S DDGLSCR(DDGLSCR+1)=I
 . S M=$O(DDGLSCR("B",I,""))
 . F N=M:1:DDGLSCR D
 .. K DDGLSCR("B",DDGLSCR(N),N)
 .. S DDGLSCR(N)=DDGLSCR(N+1)
 .. S DDGLSCR("B",DDGLSCR(N),N)=""
 . K DDGLSCR(DDGLSCR+1)
 D:'$G(N) REPAINT^DDGLIBW(I)
 Q
 ;
CLOSE(I,NC) ;
CLOSE1 ;Close window I
 N A,M,N,W
 S M=$O(DDGLSCR("B",I,""))
 Q:M=""
 ;
 I '$G(NC) D
 . S A=$$AREA(I)
 . D CLEAR(I,"0^0^"_$P(A,U,3,4))
 . F N=1:1:DDGLSCR D:N'=M
 .. S W=DDGLSCR(N)
 .. D REPAINT^DDGLIBW(W,$$RELAREA(W,$$INTSECT($$AREA(W),A)))
 ;
 F N=M:1:DDGLSCR-1 D
 . K DDGLSCR("B",DDGLSCR(N),N)
 . S DDGLSCR(N)=DDGLSCR(N+1)
 . S DDGLSCR("B",DDGLSCR(N),N)=""
 K DDGLSCR("B",DDGLSCR(DDGLSCR),DDGLSCR),DDGLSCR(DDGLSCR)
 S DDGLSCR=DDGLSCR-1
 Q
 ;
CLEAR(I,A) ;
CLEAR1 ;Clear area A in window I
 N Y,X,H,W,S,DY,DX
 S:$G(I)="" I=-1 S:$G(A)="" A=$$AREA(I)
 S A=$$ABSAREA(I,A)
 S Y=$P(A,U),X=$P(A,U,2),H=$P(A,U,3),W=$P(A,U,4)
 I Y=0,X=0,H=IOSL,W=IOM W $P(DDGLCLR,DDGLDEL,2) Q
 S DX=X,S=$S(IOM-X=W:$P(DDGLCLR,DDGLDEL),1:$J("",W))
 F DY=Y:1:Y+H-1 X IOXY W S
 Q
 ;
ABSAREA(I,A) ;
 ;Given relative area A in window I, return absolute area
 N X,Y,H,W,X1,Y1
 S Y=$P(A,U),X=$P(A,U,2),H=$P(A,U,3),W=$P(A,U,4)
 S A=$$AREA(I)
 S Y1=Y+$P(A,U),X1=X+$P(A,U,2)
 S:Y1+H>IOSL H=IOSL-Y1 S:X1+W>IOM W=IOM-X1
 Q Y1_U_X1_U_H_U_W
 ;
RELAREA(I,A) ;
 ;Given absolute area A in window I, return relative area
 N X,Y,H,W,X1,Y1
 S Y=$P(A,U),X=$P(A,U,2),H=$P(A,U,3),W=$P(A,U,4)
 S A=$$AREA(I)
 S Y1=Y-$P(A,U),X1=X-$P(A,U,2)
 Q Y1_U_X1_U_H_U_W
 ;
AREA(I) ;Return the coord and area of window I
 Q $S($D(@DDGLREF@(I))#2:@DDGLREF@(I),1:"0^0^"_IOSL_U_IOM)
 ;
INTSECT(A1,A2) ;
 ;Return the intersection of areas 1 and 2
 N A,X1,Y1,H1,W1,X2,Y2,H2,W2
 S Y1=$P(A1,U),X1=$P(A1,U,2),H1=$P(A1,U,3),W1=$P(A1,U,4)
 S Y2=$P(A2,U),X2=$P(A2,U,2),H2=$P(A2,U,3),W2=$P(A2,U,4)
 S A=""
 S $P(A,U)=$$MAX(Y1,Y2),$P(A,U,2)=$$MAX(X1,X2)
 S $P(A,U,3)=$$LEN(Y1,H1,Y2,H2)
 S $P(A,U,4)=$$LEN(X1,W1,X2,W2)
 Q:'$P(A,U,3)!'$P(A,U,4) ""
 Q A
 ;
MAX(X,Y) ;
 ;Return the max of X and Y
 Q $S(X>Y:X,1:Y)
 ;
LEN(C1,L1,C2,L2) ;
 ;Return intersection length of two lines
 ; C = position along X or Y axis
 ; L = length of line
 Q:C1'>C2 $S(C1+L1'<(C2+L2):L2,C1+L1>C2:L1-C2+C1,1:0)
 Q $S(C2+L2'<(C1+L1):L1,C2+L2>C1:L2-C1+C2,1:0)

DDIOL
DDIOL ;SFISC/MKO-THE LOADER ;14JUN2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
EN(A,G,FMT) ;Write the text contained in local array A or global array G
 ;If one string passed, use format FMT
 N %,Y,DINAKED
 S DINAKED=$NA(^(0))
 ;
 S:'$D(A) A=""
 I $G(A)="",$D(A)<9,$G(FMT)="",$G(G)'?1"^"1A.7AN,$G(G)'?1"^"1A.7AN1"(".E1")" Q
 ;
 G:$D(DDS) SM
 G:$D(DIQUIET) LD
 ;
 N F,I,S
 I $D(A)=1,$G(G)="" D
 . S F=$S($G(FMT)]"":FMT,1:"!")
 . W @F,A
 ;
 E  I $D(A)>9 S I=0 F  S I=$O(A(I)) Q:I'=+$P(I,"E")  D
 . S F=$G(A(I,"F"),"!") S:F="" F="?0"
 . W @F,$G(A(I))
 ;
 E  S I=0 F  S I=$O(@G@(I)) Q:I'=+$P(I,"E")  D
 . S S=$G(@G@(I,0),$G(@G@(I)))
 . S F=$G(@G@(I,"F"),"!") S:F="" F="?0"
 . W @F,S
 ;
 I DINAKED]"" S DINAKED=$S(DINAKED["""""":$O(@DINAKED),1:$D(@DINAKED))
 Q
 ;
LD ;Load text into ^TMP
 N I,N,T
 S T=$S($G(DDIOLFLG)["H":"DIHELP",1:"DIMSG")
 S N=$O(^TMP(T,$J," "),-1)
 ;
 I $D(A)=1,$G(G)="" D
 . D LD1(A,$S($G(FMT)]"":FMT,1:"!"))
 ;
 E  I $D(A)>9 S I=0 F  S I=$O(A(I)) Q:I'=+$P(I,"E")  D
 . D LD1($G(A(I)),$G(A(I,"F"),"!"))
 ;
 E  S I=0 F  S I=$O(@G@(I)) Q:I'=+$P(I,"E")  D
 . D LD1($G(@G@(I),$G(@G@(I,0))),$G(@G@(I,"F"),"!"))
 ;
 K:'N @T S:N @T=N
 I DINAKED]"" S DINAKED=$S(DINAKED["""""":$O(@DINAKED),1:$D(@DINAKED))
 Q
 ;
LD1(S,F) ;Load string S, with format F
 ;In: N and T
 N C,J,L
 S:S[$C(7) S=$TR(S,$C(7),"")
 F J=1:1:$L(F,"!")-1 S N=N+1,^TMP(T,$J,N)=""
 S:'N N=1
 S:F["?" @("C="_+$P(F,"?",2))
 S L=$G(^TMP(T,$J,N))
 S ^TMP(T,$J,N)=L_$J("",$G(C)-$L(L))_S
 Q
 ;
SM ;Print text in ScreenMan's Command Area
 I $D(DDSID),$D(DTOUT)!$D(DUOUT) G SMQ
 N DDIOL
 S DDIOL=1
 ;
 I $D(A)=1&($G(G)="")!($D(A)>9) D
 . D MSG^DDSMSG(.A,"",$G(FMT))
 E  I $D(@G@(+$O(@G@(0)),0))#2 D
 . D WP^DDSMSG(G)
 E  D HLP^DDSMSG(G)
 ;
SMQ I DINAKED]"" S DINAKED=$S(DINAKED["""""":$O(@DINAKED),1:$D(@DINAKED))
 Q

DDMAP
DDMAP ;SFISC/JKS(Helsinki)-GRAPH OF FILEMAN POINTER RELATIONS ;7/1/93  4:14 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;EXPLANATIONS:
 ; N =  normal reference
 ; S =  pointer file not included in the set
 ; C =  cross reference in the pointer file
 ; L =  laygo allowed
 ; * =  reference internally truncated
 ; m =  Multiple field
 ; v =  Variable Pointer
 ;
ST S DDPCK=1 I DUZ(0)'="@",$S($D(^VA(200,DUZ,"FOF",9.4,0)):1,1:$D(^DIC(3,DUZ,"FOF",9.4,0))) G INFO:$P(^(0),U,2),EN1
 I DUZ(0)'="@",$D(^DIC(9.4,0,"DD")) S DDPCK=0 F I=1:1:$L(^("DD")) I DUZ(0)[$E(^("DD"),I) S DDPCK=1 Q
 I 'DDPCK G EN1
INFO W !!,"Prints a graph of pointer relations in a database of FileMan files",!,"named in the Kernel PACKAGE file (9.4) or given separately.",!,"Works best with 132 column output!"
DDPCK D DT^DICRW K ^UTILITY($J),DDTO,DDPCK,DUOUT,DTOUT S DDPCKN="" G GET:'$D(^DD(9.4)) S DIC=9.4,DIC(0)="AEQML" D ^DIC G END:X[U!$D(DTOUT),GET:Y<0 S DDPCK=+Y,DDPCKN=$P(Y,U,2)
 S DDFLE="" F I=1:1 S DDFLE=$O(^DIC(9.4,DDPCK,4,"B",DDFLE)) Q:DDFLE=""  S ^UTILITY($J,"F",DDFLE)=""
 G GET:DDPCKN="" D LIST
REM S DIC=1,DIC(0)="AEMQ",DIC("S")="I $D(^UTILITY($J,""F"",+Y)) Q",DIC("A")="Remove FILE: " D ^DIC G:X[U!$D(DTOUT) END G:Y<0 ADD K ^UTILITY($J,"F",+Y) G REM
GET I DDPCKN="" W !!,"Enter files to be included"
ADD K DIC I DUZ(0)'="@" S DIC("S")="I 1 Q:'$D(^(0,""DD""))  F DC=1:1:$L(^(""DD"")) I DUZ(0)[$E(^(""DD""),DC) Q" D ADD0
 S DIC=1,DIC(0)="QEAM",DIC("A")="Add FILE: " D ^DIC G END:X[U!$D(DTOUT),ADD1:Y<0 S ^UTILITY($J,"F",+Y)="" G ADD
ADD0 I $D(^VA(200,"AFOF")) S DIC("S")="I $D(^VA(200,DUZ,""FOF"",+Y,0)),$P(^(0),U,2) Q"
 I $D(^DIC(3,"AFOF")) S DIC("S")="I $D(^DIC(3,DUZ,""FOF"",+Y,0)),$P(^(0),U,2) Q"
 Q
ADD1 G END:'$D(^UTILITY($J)) D:DDPCKN="" LIST
GO G END:'$D(^UTILITY($J)) W !,"Enter name of file group for optional graph header: " W:DDPCKN]"" DDPCKN,"// " R X:DTIME G:X[U!'$T END I X'[U,X]"",($L(X)<3!($L(X)>20)) W:X'["?" $C(7) G HLP1:X["?",HLP
 S:X="" X=DDPCKN S DDPCKN=X W !
EXIT S %ZIS="Q" D ^%ZIS G:POP EXIT1 S DDFLE=0
 I $D(IO("Q")) S ZTRTN="NXF^DDMAP2" F I="^UTILITY($J,","DDFLE","DDPCKN" S ZTSAVE(I)=""
 I $D(IO("Q")) D ^%ZTLOAD G EXIT1
 U IO G ^DDMAP2
EN1 W !," Access NOT Permitted for this Routine.",!,"(Must have DD Access to the PACKAGE File)"
END K DIC,DDFLE,DDPCKN,DDPCK,^UTILITY($J) Q
EXIT2 I $D(ZTSK) K ^%ZTSK(ZTSK),ZTSK G KILL
EXIT1 I $D(DD9),IO=IO(0) R !,"Enter '^' to exit or return to continue: ",X:$S($D(DTIME):DTIME,1:300) I $T,X'=U D KILL W @IOF G ST
KILL W:$Y @IOF X $G(^%ZIS("C"))
 K ^UTILITY($J),DDA1,DDA2,DDCR,DIC,DDFL,DDFLD,DDFLE,DDFNMAX,DDFRN,DDFPT,I,DDINC,DDLGO,DDLN,DDMAX,DDOUT,DD5,DD7,DD9,DDP,DDPCK,DDPCKN,DDPP
 K %H,%ZISI,%,DISYS,DDPT,DDPTF,DDTB1,DDTB2,DDTO,DDW,X,Y,%T,%XX,%YY,ZTSK,DDMIOSL,DDMAPC
 Q
LIST W !!,"Files included" S DDFLE=0 F I=1:1 S DDFLE=$O(^UTILITY($J,"F",DDFLE)) Q:DDFLE'>0  W ?27,$J(DDFLE,10),"  ",$O(^DD(DDFLE,0,"NM","")),!
 Q
HLP1 W !,"Type a header that can be used for the print out"
HLP W !,"The Header must be between 3 and 20 characters" G GO

DDMAP1
DDMAP1 ;SFISC/JKS(Helsinki)-GRAPH OF FILEMAN PTRS ;22MAY2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
NXF S DDFLE=$O(^UTILITY($J,"FD",DDFLE)) G EXIT2^DDMAP:DDFLE'>0 S DDLN=1,DDOUT=0,DD9=0 I $Y>DDMIOSL D HDR^DDMAP2 G KILL^DDMAP:$D(DTOUT)
 D VIIVA^DDMAP2,TO S DDPCK=$$FILENAME^DIALOGZ(DDFLE) D FSHORT
 W ?DDTB1,"|  ",DDFLE," ",DDPCK W ?DDTB2,"|",! S DDFL="" ;write File name and number in box
 I $Y>DDMIOSL D HDR^DDMAP2 G KILL^DDMAP:$D(DTOUT)
NXFL S DDFL=$O(^UTILITY($J,"FD",DDFLE,"FR",DDFL)),DDFLD=0 I DDFL="" G END
NXFLD S DDFLD=$O(^UTILITY($J,"FD",DDFLE,"FR",DDFL,DDFLD)),DDFPT=0,DD5=DDFL G:DDFLD'>0 NXFL S DDFRN=$$LABEL^DIALOGZ(DDFL,DDFLD)
NXUP I $D(^DD(DD5,0,"UP")) S DD5=^("UP"),DD7=$$FILENAME^DIALOGZ(DD5) S:(DD5'=$P(DDFRN,":",1)) DDFRN=DD7_":"_DDFRN G NXUP
NXPT S DDFPT=$O(^UTILITY($J,"FD",DDFLE,"FR",DDFL,DDFLD,DDFPT)) G NXFLD:DDFPT'>0 S DDA2=^(DDFPT) D TO
REV S DDA1=$S($P(DDA2,U,2)["M":"m",1:""),DDA2=$S($P(DDA2,U,2)["V":"v",1:""),DDMAX=DDFNMAX,DDP=DDFRN D SHORT W ?DDTB1,"| " W:DDP]"" DDA2,DDA1,?DDTB1+4,DDP W ?DDTB2,"|" D OUT S DDFRN="" I $Y>DDMIOSL D HDR^DDMAP2 G KILL^DDMAP:$D(DTOUT)
 G NXPT
FSHORT I DDFNMAX-$L(DDFLE)-$L(DDPCK)<0 S DDPCK=$E(DDPCK,1,DDFNMAX-$L(DDFLE)-1)_"*"
 Q
SHORT Q:$L(DDP)'>DDMAX  S DDPP=$L(DDP,":"),DD5=DDP I DDPP>1 S DD7=DDMAX-DDPP\DDPP,DD5=$E($P(DDP,":",1),1,DD7) F I=2:1:DDPP S DD5=DD5_":"_$E($P(DDP,":",I),1,DD7)
 S DDP=$E(DD5,1,DDMAX-1)_"*" Q
OUT ;
 W "->",$P(DDFPT," ",2) W " " S DDP=$$FILENAME^DIALOGZ(DDFPT) S:DDP="" DDP="*** NONEXISTENT FILE "_DDFPT_"***" S DDMAX=IOM-$X D SHORT W DDP,!
 Q
 ;
 ;
TO N DDLGO ;WRITE LEFT SIDE OF BOX
 S DDP="",(DDCR,DDINC)=0 Q:'$D(^UTILITY($J,"FD",DDFLE,"TO",DDLN))
 S DDPT=$O(^(DDLN,"")),DDPTF=$O(^(DDPT,"")),DDA1=$$LABEL^DIALOGZ(DDPT,DDPTF)_U_$P(^DD(DDPT,DDPTF,0),U,2),DDLN=DDLN+1 I DDPT'>0 S DDP="*** NONEXISTENT FILE ***",DDTO="" G TOOK
 I '$D(^DD(DDPT)) S DDP="*** NONEXISTENT FILE "_DDPT_"***" G TOOK
 S DDPTF=+DDPTF,DDTO=DDPT,DDPP=$P(DDA1,U,1)
TOUP S DD5=$$FILENAME^DIALOGZ(DDTO) I $D(^DD(DDTO,0,"UP")) S DDTO=^("UP") S:(DD5'=$P(DDPP,":",1)) DDPP=DD5_":"_DDPP G TOUP
 S DDINC=$D(^UTILITY($J,"F",DDTO)),DDLGO=$P(DDA1,U,2)'["'",DDA1=$P(DDA1,U,2)["V" S:(DD5'=$P(DDPP,":",1)) DDPP=DD5_":"_DDPP
 S DDCR=0,DD5="",DD7=DDPT,DDP=DDPP S:DD7?.E1"."2N DD7=+$P(DD7,".",1,$L(DD7,".")-1)
 F I=1:1 S DD5=$O(^DD(DD7,0,"IX",DD5)) Q:DD5=""  I $D(^DD(DD7,0,"IX",DD5,DDPT,DDPTF)) S DDCR=1
TOOK Q:DDP=""
 S DDMAX=DDTB1-15,DD5=$P(DDP,":",1),DD7=DDP D  D SHORT
 .I DD5=DD9 S DDP="  "_$P(DDP,":",2,999),DDPT="" Q
 .W "  ",$S(IOST["C":$E(DD5,1,20),1:DD5)," (#",DDTO,")",?DDTB1,"|",?DDTB2,"|",!
 .S DDP="  "_$P(DD7,":",2,999),DD9=DD5,DDPT="" Q
 S DDW=$S('DDINC:"N S",1:"N") D
 .W "  ",DDP," " W:DDA1 "v " D  W ?DDTB1-12,"(",DDW," " S:'$D(DDLGO) DDLGO=0 W:DDCR "C " W:DDLGO "L" W ")->"
 ..F I=$L(DDP):1:DDTB1-18 W "."
 Q
 ;
 ;
END I $D(^UTILITY($J,"FD",DDFLE,"TO",DDLN)) D TO W:$X'>DDTB1 ?DDTB1,"|" W ?DDTB2,"|",! S DDOUT=1 D:$Y>DDMIOSL HDR^DDMAP2 G KILL^DDMAP:$D(DTOUT),END
 I DDOUT S DDOUT=0 D VIIVA^DDMAP2 G NXF
 S DDPCK=+$O(^UTILITY($J,"FD",DDFLE)) I '$D(^DD(DDPCK,0,"UP")) D VIIVA^DDMAP2
 G NXF
 Q

DDMAP2
DDMAP2 ;SFISC/JKS(Helsinki)-GRAPH OF FILEMAN PTRS ;2/4/91  3:38 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NXF ;Loop thru file selected and get to/from pointers
 F DDFLE=0:0 S DDFLE=$O(^UTILITY($J,"F",DDFLE)) G:DDFLE'>0 ST D GETTO,GETFR
GETTO ;Look down "PT" X-ref to find files that point to me.
 F DDPT=0:0 S DDPT=$O(^DD(DDFLE,0,"PT",DDPT)) Q:DDPT'>0  F DDPTF=0:0 S DDPTF=$O(^DD(DDFLE,0,"PT",DDPT,DDPTF)) Q:DDPTF'>0  D NOT I DDW D NOT1
 Q
NOT1 S DDTO(DDFLE)=$S('$D(DDTO(DDFLE)):1,1:DDTO(DDFLE)+1) S ^UTILITY($J,"FD",DDFLE,"TO",DDTO(DDFLE),DDPT,DDPTF)=DDA1
 Q
NOT S DDW=0 I $D(^DD(DDPT,DDPTF,0)) S DDA1=$P(^(0),U,1,2),X=$P(DDA1,U,2) S:(X[("P"_DDFLE))!(X["V") DDW=1 Q
 Q
GETFR S DDPTF=DDFLE ;Look at all fields (and subs) to find pointers to others.
NXTF F DDPCK=0:0 S DDPCK=$O(^DD(DDPTF,DDPCK)) G:DDPCK'>0 SUB S DDA1=$P(^DD(DDPTF,DDPCK,0),U,1,2),DDA2=$P(DDA1,U,2) D SETF:DDA2?.E1"P"1N.E,SETV:DDA2["V"
 Q
SUB F DDMAPC=0:0 S DDPTF=$O(^DD(DDPTF)) Q:'$D(^DD(DDPTF,0,"UP"))!(DDPTF'[DDFLE)  D NXFLD
 Q
NXFLD F DDPCK=0:0 S DDPCK=$O(^DD(DDPTF,DDPCK)) Q:DDPCK'>0  S DDA1=$P(^(DDPCK,0),U,1,2),DDA2=$P(DDA1,U,2) D SETF:DDA2?.E1"P"1N.E,SETV:DDA2["V"
 Q
SETF S DDPT=+$P(DDA2,"P",2) S:DDPT ^UTILITY($J,"FD",DDFLE,"FR",DDPTF,DDPCK,DDPT)=DDA1
 Q
SETV F X=0:0 S X=$O(^DD(DDPTF,DDPCK,"V",X)) Q:X'>0  S DDPT=$P(^(X,0),U),^UTILITY($J,"FD",DDFLE,"FR",DDPTF,DDPCK,DDPT)=$P(DDA1,U,1)_U_"V"_DDPT
 Q
ST S DD9=0,DDFLE="",DDTB1=IOM\2,DDTB2=$S(IOM/4>30:30,1:IOM\4)+DDTB1,DDFNMAX=DDTB2-DDTB1-5,DDMIOSL=IOSL-4 D HDR G KILL^DDMAP:$D(DTOUT),^DDMAP1
VIIVA S DD5=$S($X<DDTB1:1,1:0) W:DD5 ?DDTB1,"-" W:'DD5 " " S DD5=$S(DD5:DDTB1,1:$X-1) F I=1:1:(DDTB2-DD5-1) W "-"
 W "-",! Q
HDR I "C"[$E(IOST) R !,"Enter ""^"" to exit or return to continue: ",X:$S($D(DTIME):DTIME,1:300) I X="^"!'$T S DTOUT=1 Q
 S Y=DT X ^DD("DD") W:$Y @IOF W !,"    File/Package: ",DDPCKN,?DDTB1+3,"Date: ",Y,!!
 W "  FILE (#)",?DDTB1-12,"POINTER","           (#) FILE",!,"   POINTER FIELD",?DDTB1-12," TYPE" W "           POINTER FIELD",?DDTB2+1,"FILE POINTED TO",! F I=1:1:IOM W "-"
 W !,"          L=Laygo      S=File not in set      N=Normal Ref.      C=Xref.",!,"          *=Truncated      m=Multiple           v=Variable Pointer",!!
 Q

DDMOD
DDMOD ;SFISC/MKO-DD MODIFICATION APIS ;1:45 PM  11 Dec 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DELIX(DIFIL,DIFLD,DIXR,DIFLG,DIKDOUT,DIKDMSG) ;Delete traditional xref
 G DELIXX^DIKD
 ;
DELIXN(DIFIL,DIXR,DIFLG,DIKDOUT,DIKDMSG) ;Delete new-style index
 G DELIXNX^DIKD2
 ;
CREIXN(DIKCXREF,DIFLG,DIXR,DIKCOUT,DIKCMSG) ;Create new-style index
 G CREIXNX^DIKCR
 ;
FILESEC(DIFIL,DISEC,DIMSGA) ;Set File Security Codes
 ; DIFIL = File Number
 ; .DISEC = Is the array for each security node
 ; DIMSGA = If passed where the error message is placed
 I (('$D(^DIC(+$G(DIFIL),0))#2)!(+$G(DIFIL)<2)) D  Q
 . D CLEAN^DILF
 . I $G(DIMSGA)'="" D BLD^DIALOG(401,+$G(DIFIL),,DIMSGA,"F") Q
 . D BLD^DIALOG(401,+$G(DIFIL))
 I '$D(DISEC) Q
 N I
 ; DIC(DIFIL,0,"DD") 'Data Dictionary' Security
 ; DIC(DIFIL,0,"RD") 'Read' Security
 ; DIC(DIFIL,0,"WR") 'Write' Security
 ; DIC(DIFIL,0,"DEL") 'Delete' Security
 ; DIC(DIFIL,0,"LAYGO") 'Laygo' Security
 ; DIC(DIFIL,0,"AUDIT") 'Audit Security
 F I="DD","RD","WR","DEL","LAYGO","AUDIT" I $D(DISEC(I))#2 S ^DIC(DIFIL,0,I)=DISEC(I)
 Q

DDMP
DDMP ;SFISC/DPC-IMPORT ASCII DATA ;5DEC2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FILE(DDMPF,DDMPFLDS,DDMPFLG,DDMPFSRC,DDMPFMT) ;
 ;API for import tool.
 ;DDMPF - file# of primary import file.
 ;DDMPFLDS (by ref or value) - 1) name of import template (in [])
 ;         2) ;-delimited fields array. Primary file in top element.
 ;            Other nodes subscripted by subfile#.
 ;DDMPFLG (by ref.) - ("FLAGS"): 'E'xternal; 'F'ile contains specs
 ;                    ("MSGS"): Root to contain error messages.
 ;                    ("MAXERR"): Maximum # of errors allowed.
 ;                    ("IOP"): Device for report printing.
 ;                    ("QTIME"): Queue import time.
 ;DDMPFSRC (by ref.) -("PATH"): Path to source file
 ;                    ("FILE"): Source file name.
 ;DDMPFMT (by value or ref.) - 1) top node = foreign format.
 ;          2) ("FDELIM"):  Field delimiter.
 ;             ("FIXED"): YES if fixed format.
 ;             ("QUOTED"): YES if delimited fields quoted.
 ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DDMPNCNT
 S DDMPFLG=$G(DDMPFLG("FLAGS"),$G(DDMPFLG)) I '$$VERFLG^DIEFU(DDMPFLG,"FE") G OUT
 S DDMPFLG("MAXERR")=$G(DDMPFLG("MAXERR"),1000)
 S DDMPFSRC("PATH")=$G(DDMPFSRC("PATH"))
 I $G(DDMPFSRC("FILE"))="" D BLD^DIALOG(202,"host source file","host source file") G OUT
 D GETFMT^DDMP1(.DDMPFMT) G:$G(DIERR) OUT
 D GETSRC^DDMP1(.DDMPFSRC) G:'$D(^TMP($J,"DDMP")) OUT
 S DDMPNCNT=$O(^TMP($J,"DDMP",""))
 I DDMPFLG["F" D  G:$G(DIERR) OUT
 . I $G(DDMPF)'=""!($D(DDMPFLDS)&($G(DDMPFLDS)'="")) D BLD^DIALOG(1833) Q
 . D INFILE^DDMP1("^TMP($J,""DDMP"")",.DDMPFMT,.DDMPF,.DDMPFLDS,.DDMPNCNT)
 E  I $G(DDMPF)=""!('$D(DDMPFLDS)) D BLD^DIALOG(202,"file or the fields","file or the fields") G OUT
 I DDMPNCNT="" D BLD^DIALOG(1812,DDMPFSRC("FILE"),DDMPFSRC("FILE")) G OUT
 I $E($G(DDMPFLDS))="[" N DDMPERR D  G:DDMPERR'=$G(DIERR) OUT ;import template processing
 . S DDMPERR=$G(DIERR)
 . D TMPL2DR^DDMP1(DDMPF,.DDMPFLDS)
 S DDMPFLDS(DDMPF)=$G(DDMPFLDS(DDMPF),$G(DDMPFLDS))
 I '$$RQIDOK^DDMP1(.DDMPFLDS) G OUT
 N DDMPSQ,DDMPFIEN S (DDMPSQ,DDMPFIEN)=0
 D FLDBLD(DDMPF,.DDMPFLDS,.DDMPSQ,.DDMPFIEN,1) G:$G(DIERR) OUT
 N DDMPIOP,ZTSK,POP ;Device and queuing setup.
 D DEV^DDMP2(.DDMPFLG,.DDMPIOP)
 I $G(DDMPIOP("NG")) D BLD^DIALOG(1850) G OUT
 I $G(DDMPIOP("Q")) D QUE^DDMP2(.DDMPIOP) G OUT
TASK ;Entry point for queued imports.  If not queued, processing continues.
 N DDMPRPSB,DDMPLN,DDMPSTAT,POP
 D REP1^DDMP2(.DDMPRPSB,.DDMPLN)
 S DDMPSTAT("BEG")=$H,(DDMPSTAT("TOT"),DDMPSTAT("NG"))=0
 D PUTDRVR(.DDMPSQ,.DDMPFMT,.DDMPFLG,DDMPNCNT,.DDMPSTAT)
 D REP2^DDMP2(DDMPRPSB,DDMPLN,.DDMPSTAT)
OUT I $D(ZTQUEUED) D
 . S ZTREQ="@"
 . D CLEAN^DIEFU
 E  I $G(DDMPFLG("MSGS"))]"" D CALLOUT^DIEFU(DDMPFLG("MSGS"))
 K ^TMP($J,"DDMP")
 ;K ^XTMP(DDMPRPSB) ;Deletes the report from XTMP
 Q
 ;
FLDBLD(DDMPF,DDMPFLDS,DDMPSQ,DDMPFIEN,DDMPTFIX) ;
 N DDMPI,DDMPNFLD,DDMPNIEN,DDMPINFD
 S DDMPFIEN=DDMPFIEN+1
 S DDMPNIEN="+"_DDMPFIEN_","_$G(DDMPFIEN("UP",DDMPF))
 F DDMPI=1:1 S DDMPINFD=$P(DDMPFLDS(DDMPF),";",DDMPI) Q:DDMPINFD=""  D  Q:$G(DIERR)
 . I DDMPINFD'["[" S DDMPNFLD=DDMPINFD
 . E  N DDMPOFIX S DDMPNFLD=+DDMPINFD,DDMPOFIX=$P($P(DDMPINFD,"]"),"[",2)
 . I '$$VFIELD^DIEFU(DDMPF,DDMPNFLD,"D") Q
 . N DDMP0P2
 . S DDMP0P2=$P($G(^DD(DDMPF,DDMPNFLD,0)),U,2)
 . I +DDMP0P2 D  Q
 . . N DDMPDWF
 . . I $P($G(^DD(+DDMP0P2,.01,0)),U,2)["W" D  Q
 . . . N DDMPE S DDMPE(1)="word processing",DDMPE("FILE")=DDMPF,DDMPE("FIELD")=DDMPNFLD
 . . . D BLD^DIALOG(520,"word processing",.DDMPE)
 . . S DDMPDWF=+DDMP0P2
 . . S DDMPFIEN("UP",DDMPDWF)=DDMPNIEN
 . . I '$D(DDMPFLDS(DDMPDWF)) D  Q
 . . . N DDMPP S DDMPP("FILE")=DDMPDWF
 . . . D BLD^DIALOG(525,.DDMPP,.DDMPP)
 . . D FLDBLD(DDMPDWF,.DDMPFLDS,.DDMPSQ,.DDMPFIEN,DDMPTFIX)
 . S DDMPSQ=DDMPSQ+1
 . I DDMPFMT("FIXED")="YES",'$G(DDMPOFIX) D BLD^DIALOG(1822)
 . S DDMPSQ(DDMPSQ)=DDMPF_"~"_DDMPNIEN_"~"_DDMPNFLD_"~"_$G(DDMPOFIX)
 Q
 ;
PUTDRVR(DDMPSQ,DDMPFMT,DDMPFLG,DDMPNODE,DDMPSTAT) ;
 ;Sets up FDA and files data.
 ;DDMPSQ (by reference):   Contains specs for each field.
 ;DDMPFMT (by reference):  Format of imcoming data
 ;DDMPFLG (by reference):  Import control info.
 ;DDMPNODE (by value):     Number of first node containing data.
 N DDMPTPAR,DDMPNDCT,DDMPUPFG,DDMPREF
 I DDMPFLG["E" S DDMPUPFG="E"
 S DDMPNDCT=1
 S DDMPREF=$NA(^TMP($J,"DDMP",DDMPNODE))
 S DDMPTPAR(1)=^TMP($J,"DDMP",DDMPNODE)
 F  S DDMPREF=$Q(@DDMPREF) Q:$QS(DDMPREF,1)'=$J!($QS(DDMPREF,2)'="DDMP")  D  Q:$G(DDMPSTAT("ABORT"))  ;GFT  $J MIGHT BE NON-NUMERIC
 . I DDMPREF'["OVF" D
 . . D RECPROC
 . . K DDMPTPAR S DDMPNDCT=0
 . S DDMPNDCT=DDMPNDCT+1
 . S DDMPTPAR(DDMPNDCT)=@DDMPREF
 I $G(DDMPSTAT("ABORT")) Q
 D RECPROC
 Q
 ;
RECPROC ; Files a record from DDMPTPAR()
 N DDMPIENS
 K ^TMP($J,"DDMPFDA")
 D TOT(.DDMPSTAT) Q:$G(DDMPSTAT("ABORT"))
 D PARSE(.DDMPSQ,.DDMPTPAR,DDMPNDCT)
 I '$D(^TMP($J,"DDMPFDA")) D RECERR Q
 D UPDATE^DIE($G(DDMPUPFG),"^TMP($J,""DDMPFDA"")","DDMPIENS")
 I $G(DIERR) D
 . D RECERR
 E  I DDMPSTAT("TOT")-DDMPSTAT("NG")>1 S DDMPSTAT("LIEN")=DDMPIENS(1)
 E  S (DDMPSTAT("FIEN"),DDMPSTAT("LIEN"))=DDMPIENS(1)
 Q
 ;
TOT(DDMPSTAT) ;
 S DDMPSTAT("TOT")=DDMPSTAT("TOT")+1
 I '$D(ZTQUEUED) W "."
 E  I DDMPSTAT("TOT")#10=0,$$S^%ZTLOAD D
 . S DDMPSTAT("ABORT")=2
 . S ZTSTOP=1
 Q
 ;
RECERR ;
 N DDMPERLN,DDMPERR
 S DDMPSTAT("NG")=DDMPSTAT("NG")+1
 D LDXTMP^DDMP2("Record #"_DDMPSTAT("TOT")_" Rejected:")
 D MSG^DIALOG("AEB",.DDMPERR,$S($D(IOM):IOM-5,1:75))
 S DDMPERLN=0
 F  S DDMPERLN=$O(DDMPERR(DDMPERLN)) Q:'DDMPERLN  D LDXTMP^DDMP2("   "_DDMPERR(DDMPERLN))
 D CLEAN^DIEFU
 I DDMPSTAT("NG")'<DDMPFLG("MAXERR") S DDMPSTAT("ABORT")=1
 Q
 ;
PARSE(DDMPSQ,DDMPTPAR,DDMPNDCT) ;
 N DDMPQ,DDMPHOLD,DDMPIN,DDMPI,DDMPTVAL,DDMPVAL
 I DDMPTPAR(1)="" D BLD^DIALOG(1860) Q
 S DDMPQ="""",DDMPSQ=0
 F DDMPI=1:1:DDMPNDCT S DDMPIN=DDMPTPAR(DDMPI) F  Q:DDMPIN=""!($G(DIERR))  D
 . I $G(DDMPFMT("QUOTED"))="YES",($E(DDMPIN)=DDMPQ!($E($G(DDMPHOLD))=DDMPQ)) D
 . . I $G(DDMPHOLD)]"" D
 . . . I DDMPHOLD'=DDMPQ,$E(DDMPHOLD,$L(DDMPHOLD))=DDMPQ D
 . . . . S DDMPVAL=DDMPHOLD,DDMPHOLD=""
 . . . . S DDMPIN=$P(DDMPIN,DDMPFMT("FDELIM"),2,99)
 . . . E  D
 . . . . S DDMPVAL=DDMPHOLD_$P(DDMPIN,DDMPQ)_DDMPQ,DDMPHOLD=""
 . . . . S DDMPIN=$P($P(DDMPIN,DDMPQ,2,99),DDMPFMT("FDELIM"),2,99)
 . . E  D
 . . . S DDMPTVAL=$P(DDMPIN,DDMPQ,1,2)_$S($L(DDMPIN,DDMPQ)>2:DDMPQ,1:"")
 . . . S DDMPIN=$E(DDMPIN,$L(DDMPTVAL)+1,$L(DDMPIN)) ; S DDMPIN=$P(DDMPIN,DDMPTVAL,2)
 . . . I DDMPIN=DDMPFMT("FDELIM") S DDMPIN="",DDMPVAL=DDMPTVAL Q
 . . . S DDMPIN=$P(DDMPIN,DDMPFMT("FDELIM"),2,99)
 . . . I DDMPIN="",DDMPI'=DDMPNDCT S DDMPHOLD=DDMPTVAL Q
 . . . S DDMPVAL=DDMPTVAL
 . E  I $G(DDMPFMT("FDELIM"))'="" D
 . . S DDMPTVAL=$P(DDMPIN,DDMPFMT("FDELIM"))
 . . I $L(DDMPIN,DDMPFMT("FDELIM"))=2,$P(DDMPIN,DDMPFMT("FDELIM"),2)="" S DDMPIN="",DDMPVAL=$G(DDMPHOLD)_DDMPTVAL,DDMPHOLD="" Q
 . . S DDMPIN=$P(DDMPIN,DDMPFMT("FDELIM"),2,99)
 . . I $G(DDMPHOLD)]"" S DDMPVAL=DDMPHOLD_DDMPTVAL,DDMPHOLD="" Q
 . . I DDMPIN="",DDMPI'=DDMPNDCT S DDMPHOLD=DDMPTVAL Q
 . . S DDMPVAL=DDMPTVAL
 . E  D
 . . N DDMPLEN,DDMPLAST
 . . I '$D(DDMPSQ(DDMPSQ+1)) D BLD^DIALOG(1862) Q
 . . S DDMPLEN=$P(DDMPSQ(DDMPSQ+1),"~",4)
 . . I $G(DDMPHOLD)]"" D
 . . . S DDMPVAL=DDMPHOLD_$E(DDMPIN,1,DDMPLEN-$L(DDMPHOLD))
 . . . S DDMPIN=$E(DDMPIN,DDMPLEN-$L(DDMPHOLD)+1,255)
 . . . S DDMPHOLD=""
 . . E  D
 . . . S DDMPTVAL=$E(DDMPIN,1,DDMPLEN)
 . . . S DDMPIN=$E(DDMPIN,DDMPLEN+1,255)
 . . . I DDMPIN="",DDMPI'=DDMPNDCT S DDMPHOLD=DDMPTVAL Q
 . . . S DDMPVAL=DDMPTVAL
 . . I $D(DDMPVAL) F  S DDMPLAST=$L(DDMPVAL) Q:$E(DDMPVAL,DDMPLAST)'=" "  S DDMPVAL=$E(DDMPVAL,1,DDMPLAST-1)
 . I $D(DDMPVAL) D  K DDMPVAL
 . . S DDMPSQ=DDMPSQ+1
 . . I '$D(DDMPSQ(DDMPSQ)) D BLD^DIALOG(1862) Q
 . . I $G(DDMPFMT("QUOTED"))="YES" S DDMPVAL=$TR(DDMPVAL,DDMPQ)
 . . D FDASET(DDMPVAL,DDMPSQ(DDMPSQ))
 I $G(DDMPFMT("FIXED"))="YES" F DDMPSQ=DDMPSQ+1:1 Q:'$D(DDMPSQ(DDMPSQ))  S DDMPVAL="" D FDASET(DDMPVAL,DDMPSQ(DDMPSQ))
 Q
 ;
FDASET(DDMPVAL,DDMPSPEC) ;
 S ^TMP($J,"DDMPFDA",$P(DDMPSPEC,"~"),$P(DDMPSPEC,"~",2),$P(DDMPSPEC,"~",3))=DDMPVAL
 Q
 ;

DDMP1
DDMP1 ;SFISC/DPC-ASCII IMPORT UTIILTIES ;9/19/96  14:58
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GETFMT(DDMPFMT) ;
 ; Sets up format info.
 ;DDMPFMT passed by reference.
 N DDMPFRMT
 I '($D(DDMPFMT)\10) D  Q:'($D(DDMPFMT)\10)
 . D FIND^DIC(.44,"","1;5;8","X",DDMPFMT,"","","","","DDMPFRMT")
 . I 'DDMPFRMT("DILIST",0) D BLD^DIALOG(1820,DDMPFMT,DDMPFMT) Q
 . S DDMPFMT("IEN")=DDMPFRMT("DILIST",2,1)
 . S DDMPFMT("FDELIM")=DDMPFRMT("DILIST","ID",1,1)
 . S DDMPFMT("FIXED")=DDMPFRMT("DILIST","ID",1,5)
 . S DDMPFMT("QUOTED")=DDMPFRMT("DILIST","ID",1,8)
 S DDMPFMT("FDELIM")=$G(DDMPFMT("FDELIM"))
 I DDMPFMT("FDELIM") D
 . N DDMPI,DDMPPC,DDMPASCI S DDMPASCI=""
 . F DDMPI=1:1 S DDMPPC=$P(DDMPFMT("FDELIM"),",",DDMPI) Q:'DDMPPC  S DDMPASCI=DDMPASCI_$C(DDMPPC)
 . S DDMPFMT("FDELIM")=DDMPASCI
 S DDMPFMT("QUOTED")=$G(DDMPFMT("QUOTED"),"NO")
 S DDMPFMT("FIXED")=$G(DDMPFMT("FIXED"),"NO")
 I ((DDMPFMT("FIXED")="YES")&(DDMPFMT("FDELIM")'=""))!((DDMPFMT("FIXED")'="YES")&(DDMPFMT("FDELIM")="")) D BLD^DIALOG(1821)
 Q
 ;
GETSRC(DDMPFSRC) ;
 ;Moves data from source file into global.
 N DDMPIMWK
 K ^TMP($J,"DDMP")
 S DDMPIMWK=$$FTG^%ZISH(DDMPFSRC("PATH"),DDMPFSRC("FILE"),$NA(^TMP($J,"DDMP",0)),3)
 I 'DDMPIMWK D BLD^DIALOG(1810,DDMPFSRC("FILE"),DDMPFSRC("FILE")) Q
 I '$D(^TMP($J,"DDMP")) D BLD^DIALOG(1812,DDMPFSRC("FILE"),DDMPFSRC("FILE"))
 Q
 ;
RQIDOK(DDMPFLDS) ;
 ;Verifies that required identifiers present in fields being imported.
 N DDMPF,DDMPRIDS,DDMPRID,DDMPERCT S DDMPF=0,DDMPERCT=$G(DIERR)
 F  S DDMPF=$O(DDMPFLDS(DDMPF)) Q:DDMPF=""  D
 . D REQIDS^DICU(DDMPF,"DDMPRIDS")
 . S DDMPRID=0
 . F  S DDMPRID=$O(DDMPRIDS("REQUIRED IDENTIFIERS",DDMPRID)) Q:DDMPRID=""  D
 . . I ";"_DDMPFLDS(DDMPF)_";"'[(";"_DDMPRID_";"),";"_DDMPFLDS(DDMPF)'[(";"_DDMPRID_"[") D
 . . . N DDMPP S DDMPP("FILE")=DDMPF
 . . . D BLD^DIALOG(312,.DDMPP,.DDMPP)
 Q DDMPERCT=$G(DIERR)
 ;
INFILE(DDMPINAR,DDMPFMT,DDMPFBCK,DDMPDR,DDMPNCNT) ;
 N DDMPDELM,DDMPFLDS,DDMPF,DDMPFSTR,DDMPI,DDMPJ,DDMPVAL,DDMPDONE
 S DDMPNCNT=""
 I DDMPFMT("FIXED")="YES" S DDMPDELM=","
 E  S DDMPDELM=DDMPFMT("FDELIM")
 F  S DDMPNCNT=$O(@DDMPINAR@(DDMPNCNT)) Q:DDMPNCNT=""!$G(DDMPDONE)  S DDMPVAL=^(DDMPNCNT) D  Q:$G(DIERR)
 . I DDMPVAL="" Q
 . I '$D(DDMPF) D  Q
 . . S DDMPF=$P(DDMPVAL,"FILE=",2)
 . . I DDMPF="" D BLD^DIALOG(1831) Q
 . . S DDMPF=$$FILENUM(DDMPF)
 . F DDMPI=1:1 S DDMPFSTR=$P(DDMPVAL,DDMPDELM,DDMPI) Q:DDMPFSTR=""  D
 . . N DDMPFDF,DDMPDPTH,DDMPFLD
 . . S DDMPDPTH=$L(DDMPFSTR,":")
 . . S DDMPFDF=DDMPF
 . . F DDMPJ=1:1:DDMPDPTH S DDMPFLD=$P(DDMPFSTR,":",DDMPJ) D  Q:$G(DIERR)
 . . . N DDMP0P2
 . . . D FLDVAL Q:$G(DIERR)
 . . . S $P(DDMPFSTR,":",DDMPJ)=DDMPFLD_U_DDMPFDF
 . . . S DDMPFDF=+DDMP0P2
 . . S DDMPFLDS(DDMPI)=DDMPFSTR
 . S DDMPDONE=1
 I $O(@DDMPINAR@(DDMPNCNT))="" S DDMPNCNT=""
 I $G(DIERR)!(DDMPNCNT="") Q
 S DDMPFLDS=1
 D TODR(DDMPF,.DDMPFLDS,.DDMPDR)
 S DDMPFBCK=DDMPF
 Q
 ;
FILENUM(DDMPF) ;
 I DDMPF,$$VFILE^DILFD(DDMPF) Q DDMPF
 I $D(^DIC("B",DDMPF))=10 Q $O(^(DDMPF,""))
 D BLD^DIALOG(409,DDMPF,DDMPF)
 Q 0
FLDVAL ;
 N DDMP0
 I 'DDMPFLD S DDMPFLD=$$FLDNUM^DILFD(DDMPFDF,DDMPFLD) Q:$G(DIERR)
 S DDMP0=$G(^DD(DDMPFDF,DDMPFLD,0))
 I DDMP0="" D  Q
 . N DDMPP S DDMPP("FILE")=DDMPFDF,DDMPP(1)=DDMPFLD
 . D BLD^DIALOG(501,.DDMPP,.DDMPP)
 S DDMP0P2=$P(DDMP0,U,2)
 I 'DDMP0P2 D
 . I DDMPJ<DDMPDPTH D BLD^DIALOG(1841)
 E  D
 . I DDMPJ=DDMPDPTH D BLD^DIALOG(1842)
 . I $P($G(^DD(+DDMP0P2,.01,0)),U,2)["W" D
 . . N DDMPP
 . . S DDMPP("FILE")=DDMPFDF,DDMPP("FIELD")=DDMPFLD,DDMPP(1)="word processing"
 . . D BLD^DIALOG(520,.DDMPP,.DDMPP)
 I DDMPI>1,$P($P(DDMPFLDS(DDMPI-1),":",DDMPJ-1),U,2)'=$P($P(DDMPFSTR,":",DDMPJ-1),U,2) D
 . D BLD^DIALOG(1844)
 Q
 ;
TMPL2DR(DDMPF,DDMPFLDS) ;
 N DDMPDR
 N DDMPERR S DDMPERR=$G(DIERR)
 D TMPL2SQ(DDMPF,.DDMPFLDS)
 I DDMPERR'=$G(DIERR) Q
 S DDMPFLDS=1
 D TODR(DDMPF,.DDMPFLDS,.DDMPDR)
 K DDMPFLDS
 M DDMPFLDS=DDMPDR
 Q
 ;
TMPL2SQ(DDMPF,DDMPFLSQ) ;
 N DDMPTPNM,DDMPTPNO,DDMPSQ,DDMPPATH
 S DDMPTPNM=$S($E(DDMPFLSQ)="[":$P($P(DDMPFLSQ,"[",2),"]"),1:DDMPFLSQ)
 S DDMPTPNO=$O(^DIST(.46,"F"_DDMPF,DDMPTPNM,""))
 I 'DDMPTPNO D  Q  ;Template does not exist.
 . N DDMPARAM
 . S DDMPARAM(1)=DDMPTPNM,DDMPARAM("FILE")=DDMPF
 . D BLD^DIALOG(1870,.DDMPARAM,.DDMPARAM)
 D LIST^DIC(.463,","_DDMPTPNO_",","1;2;3;10","I")
 I '$D(^TMP("DILIST",$J,0)) Q
 F DDMPSQ=1:1:+^TMP("DILIST",$J,0) D
 . S DDMPPATH=^TMP("DILIST",$J,"ID",DDMPSQ,10)
 . S DDMPFLSQ(DDMPSQ)=$S(DDMPPATH]"":DDMPPATH_":",1:"")_^(2)_U_^(1) ;naked set on prior line.
 . I ^(3) S DDMPFLSQ("LN",DDMPSQ)=^(3) ;naked set 2 lines above.
 K ^TMP("DILIST",$J)
 Q
 ;
TODR(DDMPF,DDMPFLDS,DDMPDR,DDMPDRTP) ;
 N DDMPPPTH,DDMPCPTH,DDMPDPTH,DDMPFDWN,DDMPDONE,DDMPODTH
 F  D  Q:$G(DDMPDONE)!$G(DIERR)
 . I '$D(DDMPFLDS(DDMPFLDS)) D TMP2DR Q
 . I '$D(DDMPDPTH) S DDMPODTH=$L(DDMPFLDS(DDMPFLDS),":")
 . S DDMPDPTH=$L(DDMPFLDS(DDMPFLDS),":")
 . I '$D(DDMPCPTH) S DDMPPPTH=$P(DDMPFLDS(DDMPFLDS),":",1,DDMPDPTH-1)
 . S DDMPCPTH=$P(DDMPFLDS(DDMPFLDS),":",1,DDMPDPTH-1)
 . I DDMPCPTH=DDMPPPTH D
 . . I $G(DDMPDRTP(DDMPF))[(";"_+$P(DDMPFLDS(DDMPFLDS),":",DDMPDPTH)_";") D  Q
 . . . I +$P(DDMPFLDS(DDMPFLDS),":",DDMPDPTH)=$P(DDMPDRTP(DDMPF),";",2),DDMPDPTH>1 D
 . . . . D TMP2DR
 . . . E  D BLD^DIALOG(1845)
 . . S DDMPDRTP(DDMPF)=$G(DDMPDRTP(DDMPF),";")_+$P(DDMPFLDS(DDMPFLDS),":",DDMPDPTH)_$S('$D(DDMPFLDS("LN")):"",1:"["_DDMPFLDS("LN",DDMPFLDS)_"]")_";"
 . . S DDMPFLDS=DDMPFLDS+1
 . . S DDMPPPTH=DDMPCPTH
 . . S DDMPODTH=DDMPDPTH
 . E  I DDMPDPTH'>DDMPODTH D
 . . D TMP2DR
 . E  D
 . . S DDMPDRTP(DDMPF)=DDMPDRTP(DDMPF)_+$P(DDMPFLDS(DDMPFLDS),":",DDMPDPTH-1)_";"
 . . S DDMPFDWN=$P($P(DDMPFLDS(DDMPFLDS),":",DDMPDPTH),U,2)
 . . D TODR(DDMPFDWN,.DDMPFLDS,.DDMPDR,.DDMPDRTP)
 Q
 ;
TMP2DR ;
 S DDMPDONE=1
 I '$D(DDMPDR(DDMPF)) S DDMPDR(DDMPF)=$E(DDMPDRTP(DDMPF),2,$L(DDMPDRTP(DDMPF))-1)
 E  I DDMPDR(DDMPF)'=$E(DDMPDRTP(DDMPF),2,$L(DDMPDRTP(DDMPF))-1) D
 . D BLD^DIALOG(1846,DDMPF,DDMPF)
 K DDMPDRTP(DDMPF)
 Q
 ;

DDMP2
DDMP2 ;SFISC/DPC-Import Device, Queuing, Reports ;11/5/97  08:10
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DEV(DDMPIOIN,DDMPIOP) ;
 ;Device selection for printed report.
 ;DDMPIOIN might contain preselected info.
 ;DDMPIOP will contain device data for later use with ^%ZIS.
 I $D(DDMPIOIN("IOP")) D
 . I $P(DDMPIOIN("IOP"),";")'="Q" S DDMPIOP=DDMPIOIN("IOP")
 . E  D
 . . S DDMPIOP=$P(DDMPIOIN("IOP"),";",2,99),DDMPIOP("Q")=1
 . . I $D(DDMPIOIN("QTIME")) D SETQTIME
 E  D
 . N %ZIS,POP
 . S %ZIS="QN"
 . S %ZIS("A")="Device for Import Results Report: "
 . D ^%ZIS
 . I POP S DDMPIOP("NG")=1 Q
 . I $E(IOST,1,2)="C-" S DDMPIOP("HOME")=1 Q
 . D SETIOP
 . I $G(IO("Q")) S DDMPIOP("Q")=1 Q
 . D HOME^%ZIS
 . I $P(DDMPIOP,";",2)="P-BROWSER" Q
 . N DIR,DIRUT,Y
 . S DIR(0)="Y"
 . S DIR("A")="Do you want to queue this data import"
 . D ^DIR
 . I $G(DIRUT) S DDMPIOP("NG")=1 Q
 . I Y S DDMPIOP("Q")=1
 Q
 ;
SETIOP ;
 ;Sets up IOP, etc., from variables returned by ^%ZIS.
 S DDMPIOP=ION
 I $G(IOST)]"" S DDMPIOP=DDMPIOP_";"_IOST
 I $G(IO("DOC"))]"" S DDMPIOP=DDMPIOP_";"_IO("DOC") Q
 I $G(IOM) S DDMPIOP=DDMPIOP_";"_IOM
 I $G(IOSL) S DDMPIOP=DDMPIOP_";"_IOSL
 I $G(IOT)="HFS" S DDMPIOP("HFSNAME")=IO,DDMPIOP("HFSMODE")="W"
 Q
 ;
SETQTIME ;
 ;Sets time for queuing from value passed in ("QTIME")
 N X,Y,%DT
 S X=DDMPIOIN("QTIME")
 I X="NOW" S DDMPIOP("QTIME")=$H
 E  D
 . I X'["@" S X="T@"_X
 . S %DT="XT",%DT(0)="NOW"
 . D ^%DT
 . I Y<0 S DDMPIOP("NG")=1 Q
 . S DDMPIOP("QTIME")=Y
 Q
 ;
QUE(DDMPIOP) ;
 ;Queues the import.
 S ZTRTN="TASK^DDMP"
 S ZTIO=""
 S ZTDESC="Queued data import."
 I $D(DDMPIOP("QTIME")) S ZTDTH=DDMPIOP("QTIME")
 S ZTSAVE("^TMP($J,""DDMP"",")=""
 S ZTSAVE("DDMPIOP(")=""
 S ZTSAVE("DDMPIOP")=""
 S ZTSAVE("DDMPF")=""
 S ZTSAVE("DDMPSQ(")=""
 S ZTSAVE("DDMPFMT(")=""
 S ZTSAVE("DDMPFLG")=""
 S ZTSAVE("DDMPFLG(")=""
 S ZTSAVE("DDMPNCNT")=""
 S ZTSAVE("DDMPFSRC(")=""
 D ^%ZTLOAD
 I $G(ZTSK) D
 . W !,"Import queued.  Task number: "_ZTSK
 E  W !,"Queuing of import failed.  Import aborted."
 Q
 ;
REP1(DDMPRPSB,DDMPLN) ;
 N DDMPI,DDMPTXT,DDMPUSR,DDMPFNO,DDMPLEN
 S DDMPLN=0
 I '$D(^XTMP("DDMP1000")) S DDMPRPSB="DDMP1000"
 E  S DDMPRPSB="DDMP"_($P($O(^XTMP("DDMPz"),-1),"DDMP",2)+1)
 S ^XTMP(DDMPRPSB,0)=DT_U_DT_U
 S DDMPUSR=$$GET1^DIQ(200,DUZ_",",.01)
 S ^(0)=^XTMP(DDMPRPSB,0)_"Import report: "_DDMPUSR
 D LDXTMP($P($T(LN1+1),";;",2)_$P(DDMPUSR,",",2)_" "_$P(DDMPUSR,","))
 D LDXTMP("")
 D LDXTMP($P($T(LN1+2),";;",2)_DDMPFSRC("PATH")_DDMPFSRC("FILE"))
 D LDXTMP($P($T(LN1+3),";;",2)_DDMPFMT("FIXED"))
 D LDXTMP($P($T(LN1+4),";;",2)_DDMPFMT("FDELIM"))
 D LDXTMP($P($T(LN1+5),";;",2)_DDMPFMT("QUOTED"))
 D LDXTMP($P($T(LN1+6),";;",2)_$S(DDMPFLG["E":"External",1:"Internal"))
 D LDXTMP("")
 D LDXTMP($P($T(LN1+7),";;",2)_$$GET1^DID(DDMPF,"","","NAME"))
 D LDXTMP("")
 D LDXTMP($P($T(LN1+8),";;",2))
 D LDXTMP($P($T(LN1+9),";;",2))
 F DDMPI=1:1 Q:'$D(DDMPSQ(DDMPI))  D
 . S DDMPFNO=$P(DDMPSQ(DDMPI),"~"),DDMPLEN=$P(DDMPSQ(DDMPI),"~",4)
 . S DDMPTXT=DDMPI_$J("",5-$L(DDMPI))_$S(DDMPLEN:DDMPLEN,1:"n/a")
 . S DDMPTXT=DDMPTXT_$J("",10-$L(DDMPTXT))_$$GET1^DID(DDMPFNO,$P(DDMPSQ(DDMPI),"~",3),"","LABEL")
 . I DDMPF'=DDMPFNO S DDMPTXT=DDMPTXT_$J("",43-$L(DDMPTXT))_$O(^DD(DDMPFNO,0,"NM",""))
 . D LDXTMP(DDMPTXT)
 D LDXTMP("")
 D LDXTMP("")
 D LDXTMP($P($T(LN1+10),";;",2))
 D LDXTMP($P($T(LN1+11),";;",2))
 D LDXTMP("")
 Q
 ;
LDXTMP(DDMPTXT) ;
 S DDMPLN=DDMPLN+1
 S ^XTMP(DDMPRPSB,DDMPLN)=DDMPTXT
 Q
 ;
LN1 ;
 ;;                     Import Initiated By: 
 ;;                             Source File: 
 ;;                            Fixed Length: 
 ;;                            Delimited By: 
 ;;                      Text Values Quoted: 
 ;;                              Values Are: 
 ;;        Primary FileMan Destination File: 
 ;;Seq  Len  Field Name                      Subfile Name (if applicable)
 ;;---  ---  ----------                      ----------------------------
 ;;                                  Error Report
 ;;                                  ------------
 ;
REP2(DDMPRPSB,DDMPLN,DDMPSTAT) ;
 N POP
 I '$G(DDMPSTAT("NG")) D LDXTMP($P($T(LN2+1),";;",2))
 D LDXTMP("")
 D LDXTMP("")
 D LDXTMP($P($T(LN2+2),";;",2))
 D LDXTMP($P($T(LN2+3),";;",2))
 D LDXTMP("")
 I $G(DDMPSTAT("ABORT")) D
 . D LDXTMP($P($T(LN2+4),";;",2))
 . D LDXTMP($P($T(LN2+(4+DDMPSTAT("ABORT"))),";;",2))
 . D LDXTMP("")
 D LDXTMP($P($T(LN2+7),";;",2)_DDMPSTAT("TOT"))
 D LDXTMP($P($T(LN2+8),";;",2)_(DDMPSTAT("TOT")-DDMPSTAT("NG")))
 D LDXTMP($P($T(LN2+9),";;",2)_DDMPSTAT("NG"))
 D LDXTMP("")
 D LDXTMP($P($T(LN2+10),";;",2)_$G(DDMPSTAT("FIEN"),"Nothing filed"))
 D LDXTMP($P($T(LN2+11),";;",2)_$G(DDMPSTAT("LIEN"),"Nothing filed"))
 D LDXTMP("")
 D LDXTMP($P($T(LN2+12),";;",2)_$$HTE^DILIBF(DDMPSTAT("BEG")))
 S DDMPSTAT("END")=$H
 D LDXTMP($P($T(LN2+13),";;",2)_$$HTE^DILIBF(DDMPSTAT("END")))
 D LDXTMP($P($T(LN2+14),";;",2)_$$HDIFF^DILIBF(DDMPSTAT("END"),DDMPSTAT("BEG"),3))
 I $G(DDMPIOP("HOME")) W @IOF D PRNTHM Q
 I $P($G(DDMPIOP),";",2)="P-BROWSER" D BROWSET Q:POP  D PRNTHM Q
 ;Set up queued job for report printing.
 N %ZIS
 S %ZIS="Q"
 S IOP="Q;"_DDMPIOP
 I $D(DDMPIOP("HFSNAME")) S %ZIS("HFSNAME")=DDMPIOP("HFSNAME")
 I $D(DDMPIOP("HFSNODE")) S %ZIS("HFSMODE")=DDMPIOP("HFSMODE")
 D ^%ZIS
 I POP Q  ;ERROR THAT REPORT CANNOT PRINT
 K ZTIO
 S ZTRTN="PRNT^DDMP2"
 S ZTSAVE("DDMPRPSB")=""
 S ZTDTH=$H
 S ZTDESC="Printing of Import Log for User# "_DUZ
 D ^%ZTLOAD
 I '$D(ZTQUEUED) W !,"Task Number for printing: "_ZTSK
 Q
PRNT ;
 ;Tasked print of report.
 S ZTREQ="@"
 U IO
PRNTHM ;Print to home device.  Tasked prints fall through.
 N DDMPCNT,DDMPPG,DDMPIOSL,DDMPOUT
 S DDMPIOSL=$G(IOSL,60)
 S DDMPPG=0,DDMPCNT=0
 D HDR
 F  S DDMPCNT=$O(^XTMP(DDMPRPSB,DDMPCNT)) Q:DDMPCNT=""  D  Q:$G(DDMPOUT)
 . W !,^XTMP(DDMPRPSB,DDMPCNT)
 . I $Y+3>DDMPIOSL D HDR
 I $E(IOST,1,2)'="C-" W @IOF D ^%ZISC
 Q
 ;
BROWSET ;
 N %ZIS
 S IOP=DDMPIOP
 D ^%ZIS
 U IO
 Q
 ;
HDR ;
 I DDMPPG,$E(IOST,1,2)="C-" N DIR,Y S DIR(0)="E" D ^DIR I 'Y S DDMPOUT=1 Q
 I DDMPPG W @IOF
 S DDMPPG=DDMPPG+1
 W $P($T(HDR1+1),";;",2)_DDMPPG
 W !,$P($T(HDR1+2),";;",2)
 W !
 Q
 ;
HDR1 ;
 ;;                         Log for VA FileMan Data Import              Page 
 ;;                         ==============================
LN2 ;
 ;;                   No errors occured during this data import.
 ;;                               Summary of Import
 ;;                               -----------------
 ;;                           <<<IMPORT NOT COMPLETED:
 ;;                              MAXIMUM ERRORS DETECTED>>>
 ;;                              USER ABORT OF TASKED IMPORT>>>
 ;;                     Total Records Read: 
 ;;                    Total Records Filed: 
 ;;                 Total Records Rejected: 
 ;;              IEN of First Record Filed: 
 ;;               IEN of Last Record Filed: 
 ;;                  Import Filing Started: 
 ;;                Import Filing Completed: 
 ;;                  Time of Import Filing:

DDMPSM
DDMPSM ;SFISC/DPC-IMPORT SCREENMAN CALLS ;9/20/96  10:07
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FILESEL ;
 ; Called form Post-actin on change of Primary File prompt
 D PUT^DDSVALF("TMP_NM",1,1,"")
 I DDSOLD'="",$D(DDMPFDSL) S DDMPOLDF=DDSOLD,DDSBR="3^1^3"
 E  D
 . K DDMPCPNM,DDMPCPTH,DDMPFCAP,DDMPCF,DDMPFDNM
 . S DDMPF=X
 . S DDMPFLNM=DDSEXT
 . D UNED^DDSUTL("FLD_JUMP",1,1,$S(X:0,1:1))
 . D UNED^DDSUTL("TMP_NM",1,1,$S(X:0,1:1))
 . D REFRESH^DDSUTL
 Q
 ;
TMPLSCR(DDMPSELF,DDSEXT,DUZ) ;
 ;called from TMP_NM field.
 ;DDMPSELF = currently selected primary file.
 ;DDMPEXT  = External value of selected template.
 I $P(^(0),U,4)'=DDMPSELF Q 0
 I DUZ(0)["@" Q 1
 N DDMPRDAC,DDMPI,DDMPOK
 S DDMPRDAC=$P(^(0),U,3),DDMPOK=0
 F DDMPI=1:1:$L(DDMPRDAC) I DUZ(0)[$E(DDMPRDAC,DDMPI) S DDMPOK=1 Q
 Q DDMPOK
 ;
CHNGFILE ;
 ;Called for Post-action on pop-up file change verification page.
 I X D  ;code for changing selected file.
 . K DDMPFDSL,DDMPCPNM,DDMPCPTH,DDMPFCAP,DDMPCF,DDMPFDNM
 . S (DDMPOSET,DDMPFDCT)=0
 . S DDMPF=$$GET^DDSVALF("F_SEL",1,1)
 . S DDMPFLNM=$$GET^DDSVALF("F_SEL",1,1,"E")
 . I DDMPF="" D UNED^DDSUTL("FLD_JUMP",1,1,1),UNED^DDSUTL("TMP_NM",1,1,1)
 . S DDSBR="FLD_JUMP^1^1"
 . ;D REFRESH^DDSUTL
 E  D
 . D PUT^DDSVALF("F_SEL",1,1,DDMPOLDF,"I")
 . S DDSBR="F_SEL^1^1"
 Q
 ;
IXF ;
 ;Called from input transform of Field Selection field.
 N D0,DA,DIC,DP,Y S DIC="^DD("_DDMPCF_",",DIC(0)="ENZ" D ^DIC
 I Y'>0 K X
 E  S (X,DDMPX)=+$P(Y,"E"),DDMPFDNM=Y(0,0)
 Q
 ;
FDPROC ;
 ;Called from post-action on change of Field Selection prompt.
 N DDMP0P2
 S DDMP0P2=$P(^DD(DDMPCF,DDMPX,0),U,2)
 I +DDMP0P2 D
 . S DDSBR="FLD"
 . I 'DDMPFDCT D HLP^DDSUTL($C(7)_"You must select a field in the top level file before entering multiple.") Q
 . N DDMPI,DDMPOK
 . F DDMPI=1:1:DDMPFDCT I $P(DDMPFDSL(DDMPI),U,$L(DDMPFDSL(DDMPI),U))=DDMPCF S DDMPOK=1 Q
 . I '$G(DDMPOK) D HLP^DDSUTL($C(7)_"You must select a field in a subfile before entering one of its multiples.") Q
 . S DDMPFCAP=$$PATHNM(+DDMP0P2,DDMPFLNM)
 . S DDMPCPTH=$S($L($G(DDMPCPTH)):DDMPCPTH_":",1:"")_DDMPX_U_DDMPCF
 . S DDMPCF=+DDMP0P2
 . S DDMPCPNM=$S($L($G(DDMPCPNM)):DDMPCPNM_":",1:"")_DDMPFDNM
 E  D
 . S DDMPFDCT=DDMPFDCT+1
 . S DDMPFDSL(DDMPFDCT)=$S($L($G(DDMPCPTH)):DDMPCPTH_":",1:"")_DDMPX_U_DDMPCF
 . S DDMPFDSL("CAP",DDMPFDCT)=$S($L($G(DDMPCPNM)):DDMPCPNM_":",1:"")_DDMPFDNM
 . S DDMPOSET=$S(DDMPFDCT>9:DDMPFDCT-9,1:0)
 . S DDSBR=$S($G(DDMPSMFF("FIXED"))="YES":"LEN",1:"FLD")
 Q
 ;
PATHNM(DDMPSFNO,DDMPFLNM) ;
 N DDMPPATH S DDMPPATH=""
 I $D(^DD(DDMPSFNO,0,"UP")) F  D  Q:'$D(^DD(DDMPSFNO,0,"UP"))
 . S DDMPPATH=" : "_$P($P(^DD(DDMPSFNO,0),U),"SUB-FIELD")_"Subfile"_DDMPPATH
 . S DDMPSFNO=^DD(DDMPSFNO,0,"UP")
 Q $G(DDMPFLNM,$P(^DIC(DDMPSFNO,0),U))_DDMPPATH
 ;
UP1 ;
 ;Called from post-action on Field Selection prompt if null entered.
 S DDMPFCAP=$P($G(DDMPFCAP)," : ",1,$L($G(DDMPFCAP)," : ")-1)
 S DDMPCF=$P(DDMPCPTH,U,$L(DDMPCPTH,U))
 S DDMPCPTH=$P(DDMPCPTH,":",1,$L(DDMPCPTH,":")-1)
 S DDMPCPNM=$P(DDMPCPNM,":",1,$L(DDMPCPNM,":")-1)
 Q
 ;
DELFLD ;
 ;Called from post-action on change of the "Do you want to delete" prompt
 I DDMPFDCT=0 Q
 N DDMPL S DDMPL=$L($G(DDMPFDSL(DDMPFDCT-1)),":")
 I DDMPL=1 D
 . S DDMPCF=DDMPF
 . S DDMPFCAP=DDMPFLNM
 . S (DDMPCPNM,DDMPCPTH)=""
 E  D
 . S DDMPCF=$P(DDMPFDSL(DDMPFDCT-1),U,$L(DDMPFDSL(DDMPFDCT-1),U))
 . S DDMPFCAP=$$PATHNM(+DDMPCF,DDMPFLNM)
 . S DDMPCPTH=$P(DDMPFDSL(DDMPFDCT-1),":",1,DDMPL-1)
 . S DDMPCPNM=$P(DDMPFDSL("CAP",DDMPFDCT-1),":",1,DDMPL-1)
 K DDMPFDSL(DDMPFDCT),DDMPFDSL("CAP",DDMPFDCT),DDMPFDSL("LN",DDMPFDCT)
 S DDMPFDCT=DDMPFDCT-1
 I DDMPOSET S DDMPOSET=DDMPOSET-1
 Q
 ;
 ;
VAL ;
 ;Called from form level validation.
 N DDMPMSG
 ;1)Validate format of import.
 I (($G(DDMPSMFF("FIXED"))="YES")&($G(DDMPSMFF("FDELIM"))'=""))!(($G(DDMPSMFF("FIXED"))'="YES")&($G(DDMPSMFF("FDELIM"))="")) D  G VALERR
 . D BLD^DIALOG(1821)
 . S DDSERROR=2
 . S DDSBR="FOR_FMT^1^1"
 . D MSG^DIALOG("AE",.DDMPMSG)
 ;
 ;2) If file specified, move fields selected into DR().  Look for DIERRs created during move.
 I $G(DDMPF)]"" D
 . I $$GET^DDSVALF("TMP_NM",1,1)]"" D
 . . S DDMPFDSL=$$GET^DDSVALF("TMP_NM",1,1,"E")
 . . D TMPL2SQ^DDMP1(DDMPF,.DDMPFDSL)
 . I '$D(DDMPFDSL(1)) D  Q
 . . S DDSERROR=$G(DDSERROR)+1
 . . S DDMPMSG(DDSERROR)="You must specify some fields into which to import data."
 . . S DDSBR="FLD_JUMP^1^1"
 . K DDMPDR
 . S DDMPFDSL=1
 . N DDMPDIER S DDMPDIER=$G(DIERR)
 . D TODR^DDMP1(DDMPF,.DDMPFDSL,.DDMPDR)
 . I $G(DIERR)>DDMPDIER D
 . . S DDSERROR=$G(DDSERROR)+DIERR
 . . D MSG^DIALOG("AE",.DDMPMSG)
 . . S DDSBR="2.2^1^2"
 . . K DDMPDR
 ;
VALERR I $G(DDSERROR) D MSG^DDSUTL(.DDMPMSG) Q
 Q
 ;
FF ;
 ;Called from post-action on change of the Foreign Format field.
 N DDMPI
 I X'="" D
 . S DDMPSMFF=DDSEXT
 . S DDMPSMFF("IEN")=X
 . S DDMPSMFF("FDELIM")=$$GET1^DIQ(.44,X_",",1)
 . S DDMPSMFF("FIXED")=$$GET1^DIQ(.44,X_",",5)
 . S DDMPSMFF("QUOTED")=$$GET1^DIQ(.44,X_",",8)
 . F DDMPI="FIX","FLD_DLM","QUOTE" D
 . . D PUT^DDSVALF(DDMPI,1,1,"")
 . . D UNED^DDSUTL(DDMPI,1,1,1)
 E  D
 . K DDMPSMFF
 . F DDMPI="FIX","FLD_DLM","QUOTE" D UNED^DDSUTL(DDMPI,1,1,0)
 Q

DDMPSM1
DDMPSM1 ;SFISC/DPC-IMPORT SCREENMAN CALLS (CONT) ;9/20/96  11:28
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
HOSTHELP ;Called from HELP on the Host File prompt.
 N DDMPPATH
 S DDMPPATH=$$GET^DDSVALF("PTH",1,1)
 K ^TMP($J,"DDMPHOST")
 D GETHOSTS(DDMPPATH,$NA(^TMP($J,"DDMPHF")))
 S ^TMP($J,"DDMPHOST",1)="Enter the name of the host file that contains the data to be imported."
 I $D(^TMP($J,"DDMPHF")) D
 . S ^TMP($J,"DDMPHOST",2)=""
 . S ^TMP($J,"DDMPHOST",3)="These are the files in the "_DDMPPATH_" directory:"
 . N DDMPHFNM,I S DDMPHFNM=""
 . F I=4:1 S DDMPHFNM=$O(^TMP($J,"DDMPHF",DDMPHFNM)) Q:DDMPHFNM=""  S ^TMP($J,"DDMPHOST",I)=DDMPHFNM S:I#2 ^(I,"F")="?40"
 . D EN^DDIOL("","^TMP($J,""DDMPHOST"")")
 K ^TMP($J,"DDMPHF"),^TMP($J,"DDMPHOST")
 Q
 ;
GETHOSTS(DDMPPATH,DDMPHFAR) ;
 ;Obtains list of all host files in a specified directory.
 ;Input:
 ;DDMPPATH - Directory name w/ full path.
 ;DDMPHFAR - Target array for output from $$LIST^%ZISH call.
 N DDMPHF
 I DDMPPATH="" Q
 S DDMPHF("*.*")=""
 K @DDMPHFAR
 I $$LIST^%ZISH(DDMPPATH,"DDMPHF",DDMPHFAR)
 Q
PAGE2 ;
 ;Call from page 2 pre-action.
 I $D(DDMPFRP4) K DDMPFRP4 Q
 I $G(DDMPF)="" D  Q
 . S DDSBR="F_SEL^1^1"
 . D HLP^DDSUTL($C(7)_"You must choose a file before you can go to the Field Selection page.")
 S DDMPCF=$G(DDMPCF,DDMPF)
 D UNED^DDSUTL("LEN",1,2,$S($G(DDMPSMFF("FIXED"))="YES":0,1:1))
 I $G(DDMPSMFF("FIXED"))="YES",DDMPFDCT,'$D(DDMPFDSL("LN")) D
 . N DDMPHLP
 . S DDSBR="FLD_DEL"
 . S DDMPHLP(1)=$C(7)
 . S DDMPHLP(2)="You have specified a fixed length format for imported data."
 . S DDMPHLP(3)="However, you have not entered field lengths for fields you have chosen."
 . S DDMPHLP(4)="So, you must either delete all the fields entered so far"
 . S DDMPHLP(5)="or change the format to one that is not fixed length."
 . D HLP^DDSUTL(.DDMPHLP)
 Q
 ;
LENCHK ;
 ;Called from the post action on change field of the Length: prompt pop-up page.
 I X="L" D
 . S DDSBR="LEN^1^2"
 E  D
 . D DELFLD^DDMPSM
 . S DDSBR="FLD^1^2"
 . D PUT^DDSVALF("FLD",1,2,"")
 D PUT^DDSVALF(2,1,4,"")
 Q

DDMPU
DDMPU ;SFISC/DPC-IMPORT USER INTERFACE, TEMPLATE CREATE ;9/12/96  17:07
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;Entry point for Import Data option.
 D CLEAN^DIEFU
 N DIQUIET,DIFM S (DIQUIET,DIFM)=1
 N DA
 N DDMPHOST,DDMPSELF,DDMPFLAG,DDMPDR,DDSSAVE,DDMPSMFF,DDMPHOST,DDMPIORE,DDMPFDSL,DDMPTMPL
 D  Q:'$G(DDSSAVE)
 . N DDSPARM,DDSFILE,DR
 . N DDMPF,DDMPCF,DDMPCPNM,DDMPCPTH,DDMPFCAP,DDMPFDCT,DDMPFDNM,DDMPFLNM,DDMPOSET,DDMPX,DDMPFRP4,DDMPOLDF
 . S DDSFILE=.46,DR="[DDMP SPECIFY IMPORT]",DDSPARM="S" D ^DDS
 W @IOF
 I '$D(DDMPSELF) S DDMPFLAG="F"
 I $G(DDMPIORE)="E" S DDMPFLAG=$G(DDMPFLAG)_"E"
 I '($G(DDMPTMPL)]""),$D(DDMPSELF) D
 . N DIR,DIRUT,Y
 . S DIR(0)="Y"
 . S DIR("A")="Do you want to store the selected fields in an Import Template"
 . D ^DIR
 . I Y D MKTMPL(DDMPSELF,.DDMPFDSL,.DDMPDR)
 N DIR,DIRUT,Y S DIR(0)="Y"
 S DIR("A")="Do you want to proceed with the import"
 S DIR("?",1)="If you answer 'YES', the import will occur now."
 S DIR("?")="If you answer 'NO', you will need to respecify the import criteria."
 W ! D ^DIR
 I 'Y!$G(DIRUT) W !!,"Okay, you can do the import later." Q
 D FILE^DDMP($G(DDMPSELF),.DDMPDR,$G(DDMPFLAG),.DDMPHOST,.DDMPSMFF)
 W !!
 I $G(DIERR) D
 . W "Following error messages were generated when import failed."
 . D MSG^DIALOG("","","",3)
 E  I '$G(ZTSK) W "Done."
 Q
 ;
MKTMPL(DDMPF,DDMPFLDS,DDMPDR) ; Create Import Template.
 N DDMPTPNM,DDMPTPNO,DDMPRCNO,DDMPOUT,DDMPSQ,DIR,DIRUT,Y
 F  D  Q:$G(DDMPOUT)!($G(DDMPTPNM)]"")
 . S DIR(0)="FA^3:30^K:(X?1P.E) X"
 . S DIR("?")="Enter name for your import template.  It should be 3-30 characters and it should not start with a punctuation character"
 . S DIR("A")="Name of Import Template:  "
 . W ! D ^DIR
 . I Y']""!$G(DIRUT) S DDMPOUT=1 Q
 . S DDMPTPNM=Y
 . S DDMPTPNO=$O(^DIST(.46,"F"_DDMPF,DDMPTPNM,""))
 . I DDMPTPNO D DUPNAME(DDMPF,.DDMPTPNM,DDMPTPNO) Q:DDMPTPNM=""
 . S DIR("A")="  Are you adding '"_DDMPTPNM_"' as a new Import Template"
 . S DIR(0)="Y"
 . D ^DIR
 . I 'Y S DDMPTPNM="" Q
 . K ^TMP($J,"DDMPFDA")
 . S ^TMP($J,"DDMPFDA",.46,"+1,",.01)=DDMPTPNM
 . S ^TMP($J,"DDMPFDA",.46,"+1,",4)=DDMPF
 . S ^TMP($J,"DDMPFDA",.46,"+1,",5)=DUZ
 . S ^TMP($J,"DDMPFDA",.46,"+1,",2)=DT
 . S:DUZ(0)'="@" (^TMP($J,"DDMPFDA",.46,"+1,",3),^TMP($J,"DDMPFDA",.46,"+1,",6))=DUZ(0)
 . F DDMPSQ=1:1  Q:'$D(DDMPFLDS(DDMPSQ))  D
 . . N DDMPIENS,DDMPLVLS
 . . S DDMPIENS="+"_(DDMPSQ+1)_",+1,"
 . . S DDMPLVLS=$L(DDMPFLDS(DDMPSQ),":")
 . . S ^TMP($J,"DDMPFDA",.463,DDMPIENS,.01)=DDMPSQ
 . . S ^TMP($J,"DDMPFDA",.463,DDMPIENS,1)=$P($P(DDMPFLDS(DDMPSQ),":",DDMPLVLS),U,2)
 . . S ^TMP($J,"DDMPFDA",.463,DDMPIENS,2)=+$P(DDMPFLDS(DDMPSQ),":",DDMPLVLS)
 . . S:$D(DDMPFLDS("LN",DDMPSQ)) ^TMP($J,"DDMPFDA",.463,DDMPIENS,3)=DDMPFLDS("LN",DDMPSQ)
 . . S:DDMPLVLS>1 ^TMP($J,"DDMPFDA",.463,DDMPIENS,10)=$P(DDMPFLDS(DDMPSQ),":",1,DDMPLVLS-1)
 . . S ^TMP($J,"DDMPFDA",.463,DDMPIENS,20)=DDMPFLDS("CAP",DDMPSQ)
 . N DDMPERR S DDMPERR=$G(DIERR)
 . D UPDATE^DIE("","^TMP($J,""DDMPFDA"")","DDMPRCNO")
 . I DDMPERR'=$G(DIERR) W !,"An error occurred during the filing of the import template." S DDMPOUT=1 Q
 . D RECALL^DILFD(.46,DDMPRCNO(1)_",",DUZ)
 . I DUZ(0)="@" S $P(^DIST(.46,DDMPRCNO(1),0),U,3)="@",$P(^(0),U,6)="@"
 I $G(DDMPOUT) W !,"No import template will be created."
 Q
 ;
DUPNAME(DDMPF,DDMPTPNM,DDMPTPNO) ;selected template exists.
 ;If Import template name remains in DDMPTPNM after subroutine,
 ;user has chosen to delete existing template.
 W !!,"Import Template "_DDMPTPNM_" already exists."
 N DDMPDLOK S DDMPDLOK=0
 I DUZ(0)="@" D
 . S DDMPDLOK=$$CKDLT
 E  D
 . N DDMPWRAC,I
 . S DDMPWRAC=$$GET1^DIQ(.46,DDMPTPNO_",",6)
 . F I=1:1:$L(DDMPWRAC) I DUZ(0)[$E(DDMPWRAC,I) S DDMPDLOK=$$CKDLT Q
 I DDMPDLOK D
 . N DIK,DA S DIK="^DIST(.46,",DA=DDMPTPNO D ^DIK
 . W !,"Existing Import Template "_DDMPTPNM_" has been deleted."
 E  S DDMPTPNM="" W !!,"Choose another template name."
 Q
 ;
CKDLT() ;
 ;user has write access to the template.  Do they want to delete it?
 N DIR,DIRUT
 S DIR(0)="Y"
 S DIR("A")="Do you want to replace the existing template with a new one"
 S DIR("?",1)="If you answer 'YES', the existing template will be deleted."
 S DIR("?")="Answer YES or NO."
 D ^DIR
 I 'Y!$G(DIRUT) Q 0
 Q 1

DDPA1
DDPA1 ;SFISC/TKW  RESET IX NODES ON HAND-EDITED TEMPLATES ;5/12/95  11:23
V ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 N A,B,I,J,X,DIR
 S DIR("?",1)="This will repair known hand-edited templates in national packages.",DIR("?",2)="If none show on the report, it means that none of the templates on your system"
 S DIR("?")="needed to be repaired."
 S DIR(0)="Y",DIR("A")="Repair ""IX"" nodes on hand-edited templates",DIR("B")="Yes" D ^DIR Q:Y'=1
 W !!,"Searching Sort Template file...please wait",!!,"Report of templates repaired",!!
 K ^TMP($J) S U="^"
 S ^TMP($J,"DG FEMALE INPATIENTS")="^DPT(""CN"",^DPT(^2"
 S ^TMP($J,"RT WARD LIST")="^DPT(""AA"",^DPT(^2"
 S J="RT CHARGED BY HOME BY BOR^RT CHARGED BY HOME BY NAME^RT OVER BY HOME BY BOR^RT OVER BY HOME BY NAME^RT OVER BY DIV BY BOR^RT OVER BY DIV BY NAME^RT OVER BY DIV BY TD^RT OVER BY HOME BY TD^RT CHARGED BY HOME BY TD"
 F I=1:1 S X=$P(J,U,I) Q:X=""  S ^TMP($J,X)="^RT(""AC"",^RT(^2"
 S J="RT HOME LIST BY BOR^RT HOME LIST BY NAME^RT HOME LIST BY TD"
 F I=1:1 S X=$P(J,U,I) Q:X=""  S ^TMP($J,X)="^RT(""AH"",^RT(^2"
 S ^TMP($J,"RT LOOSE FILING")="^RT(""AL"",^RT(^2"
 S ^TMP($J,"DGPT WORKFILE")="^DG(45.85,""ACENSUS"",^DG(45.85,^2"
 S ^TMP($J,"A1B2 OUTPUT1")="^A1B2(11500.2,""AREM"",^A1B2(11500.2,^2"
 S ^TMP($J,"DG PTF NO ADMISSION")="^DGPM(""ATT3"",^DGPM(^2"
 S (^TMP($J,"XTLK KEYWORD ALPHA"),^TMP($J,"XTLK KEYWORD CODES"))="^XT(8984.1,""AD"",^XT(8984.1,^2"
 F I=0:0 S I=$O(^DIBT(I)) Q:'I  S X=$P($G(^(I,0)),U) I $D(^TMP($J,X)) D
 . S B=$G(^DIBT(I,2,1,"IX")),A=^TMP($J,X) Q:A=B
 . W X,!,"  Before: ",B,!
 . S ^DIBT(I,2,1,"IX")=A
 . W "  After:  ",^DIBT(I,2,1,"IX"),!
 . Q
 K ^TMP($J) W !!!,"DONE!!",!
 Q

DDPA2
DDPA2 ;SFISC/TKW  FIND NON-CANONIC SORT RANGES WITH NO ASK NODE ;8/8/95  10:46
V ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;  This routine will find any sort templates that have a sort field
 ; with a range that is FROM or TO a non-canonic number, has no
 ; ASK node, and that has
 ; had an extra space inserted by FM21 prior to patch DI*21*9.
 N I,J,X,Y,DIR,DIERR,DTOUT,DIRUT,DIROUT,DUOUT
 W !!,"This routine will report any sort templates that have been corrupted due to",!,"a bug in FM21 that has been repaired by patch DI*21*9.",!!
 W "If any templates are reported here, you can repair them by editing the template,",!,"without changing any of the sort fields.",!
 S DIR("?",1)="This routine will report any sort templates that may have been corrupted.",DIR("?",2)="If none show on the report, it means that none of the templates on your system"
 S DIR("?")="needed to be edited."
 S DIR(0)="Y",DIR("A")="Report corrupted sort templates",DIR("B")="Yes" D ^DIR K DIR Q:Y'=1
 W !!,"Searching Sort Template file...please wait",!!,"Report of templates that need to be repaired",!!
 F I=0:0 S I=$O(^DIBT(I)) Q:'I  S X=$P($G(^(I,0)),U) D
 . S DIERR=0 F J=0:0 Q:DIERR=1  S J=$O(^DIBT(I,2,J)) Q:'J  I $P($G(^(J,0)),U,10)=4,'$G(^("ASK")),$G(^("SRTTXT"))]"" D
 .. S Y=$P($G(^DIBT(I,2,J,"F")),U,2) I Y?1." "1.E S DIERR=1 Q
 .. S Y=$P($G(^DIBT(I,2,J,"T")),U,2) I Y?1." "1.E S DIERR=1 Q
 .. Q
 . I DIERR=1 W "No. "_I_"   Name: "_X,!
 . Q
 Q

DDR
DDR ;ALB/MJK,SF/DCM-FileMan Delphi Components' RPCs ;4/28/98  10:38
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
LISTC(DDRDATA,DDR) ; -- broker callback to get list data
 N DDRFILE,DDRIENS,DDRFLDS,DDRMAX,DDRFROM,DDRPART,DDRXREF,DDRSCRN,DDRID,DDRVAL,DDRERR,DDRRSLT,DDRFLD,DDRFLAGS,DDROPT,DDROUT
 ; -- parse array to parameters
 D PARSE(.DDR)
 S DDRPART=$TR(DDRPART,$C(13)_$C(10),"")
 ; -- get specific field criteria
 IF $G(DDR("DDFILE")),$G(DDR("DDFIELD")),$D(^DD(DDR("DDFILE"),DDR("DDFIELD"),12.1)) D
 . N DIC X ^(12.1) S:$D(DIC("S")) DDRSCRN=DIC("S")
 I 'XWBAPVER D V0 Q
 I XWBAPVER>0 D V1 Q
 Q
 ;
DIC D LIST^DIC(DDRFILE,DDRIENS,DDRFLDS,DDRFLAGS,DDRMAX,.DDRFROM,DDRPART,DDRXREF,DDRSCRN,DDRID,DDROUT,"DDRERR")
 Q
 ;
V0 S DDROUT="DDRRSLT",DDRFLAGS=$G(DDRFLAGS)_"P",DDRFLDS=$G(DDRFLDS)_";@"
 D DIC
 N Y,I,N S N=0
 I $G(DDRFROM)]"" D SET("[Misc]"),SET("MORE"_U_DDRFROM_U_DDRFROM("IEN"))
 I $D(DDRRSLT("DILIST")) D
 . D SET("[Data]")
 . S I=0 F  S I=$O(DDRRSLT("DILIST",I)) Q:'I  D SET(DDRRSLT("DILIST",I,0))
 IF $D(DDRERR) D SET("[Errors]")
 S X=$$STYPE^XWBTCPC("ARRAY")
 Q
 ;
V1 S DDROUT=""
 I XWBAPVER=1,DDRFLAGS["P" S DDRFLAGS=DDRFLAGS_"S" ;only P flag is sent from client for V1 of FMCD
 D DIC
 I $G(DDRFLAGS)["P" D  Q
 . I $D(^TMP("DILIST",$J)) D
 . . N END S END=+^TMP("DILIST",$J,0)
 . . I XWBAPVER>1 S ^(.3)="[MAP]",^TMP("DILIST",$J,.4)=^TMP("DILIST",$J,0,"MAP")
 . . K ^TMP("DILIST",$J,0) S ^(.5)="[BEGIN_diDATA]",^(END+1)="[END_diDATA]"
 . D 11,31
 . S DDRDATA=$NA(^TMP("DILIST",$J))
 . Q
 I $G(DDRFLAGS)'["P" D 11,UNPACKED,31 S DDRDATA=$NA(^TMP("DILIST",$J)) Q
 Q
11 I $G(DDRFROM)]"" S ^TMP("DILIST",$J,.1)="[Misc]",^(.2)="MORE"_U_DDRFROM_U_DDRFROM("IEN")_$S(XWBAPVER>1:U_$P($G(^TMP("DILIST",$J,0)),U,4),1:"")
 Q
31 I $D(DIERR) D ERROR
 Q
SET(X) ;
 S N=N+1
 S DDRDATA(N)=X
 Q
PARSE(DDR) ; -- array parsing
 S DDRFILE=$G(DDR("FILE"))
 S DDRIENS=$G(DDR("IENS"))
 S DDRFLDS=$G(DDR("FIELDS"))
 S DDRFLAGS=$G(DDR("FLAGS"))
 S DDRMAX=$G(DDR("MAX"),"*")
 M DDRFROM=DDR("FROM")
 S DDRPART=$G(DDR("PART"))
 S DDRXREF=$G(DDR("XREF"))
 S DDRSCRN=$G(DDR("SCREEN"))
 S DDRID=$G(DDR("ID"))
 S DDROPT=$G(DDR("OPTIONS"))
 Q
ERROR ;
 N I S I=1
 D Z("[BEGIN_diERRORS]")
 N A S A=0 F  S A=$O(DDRERR("DIERR",A)) Q:'A  D
 . N HD,PARAM,B,C,TEXT,TXTCNT,D,FILE,FIELD,IENS
 . S HD=DDRERR("DIERR",A)
 . I $D(DDRERR("DIERR",A,"PARAM",0)) D
 . . S (B,D)=0 F C=1:1 S B=$O(DDRERR("DIERR",A,"PARAM",B)) Q:B=""  D
 . . . I B="FILE" S FILE=DDRERR("DIERR",A,"PARAM","FILE")
 . . . I B="FIELD" S FIELD=DDRERR("DIERR",A,"PARAM","FIELD")
 . . . I B="IENS" S IENS=DDRERR("DIERR",A,"PARAM","IENS")
 . . . S D=D+1,PARAM(D)=B_U_DDRERR("DIERR",A,"PARAM",B)
 . S C=0 F  S C=$O(DDRERR("DIERR",A,"TEXT",C)) Q:'C  S TEXT(C)=DDRERR("DIERR",A,"TEXT",C),TXTCNT=C
 . S HD=HD_U_TXTCNT_U_$G(FILE)_U_$G(IENS)_U_$G(FIELD)_U_$G(D) D Z(HD)
 . S B=0 F  S B=$O(PARAM(B)) Q:'B  S %=PARAM(B) D Z(%)
 . S B=0 F  S B=$O(TEXT(B)) Q:'B  S %=TEXT(B) D Z(%)
 . Q
 D Z("[END_diERRORS]")
 Q
Z(%) ;
 S ^TMP("DILIST",$J,"ZERR",I)=%,I=I+1 Q
 ;
UNPACKED ;
 Q:'$D(^TMP("DILIST",$J))
 N COUNT,IXCNT
 S COUNT=+^TMP("DILIST",$J,0) Q:'COUNT
 I XWBAPVER>1 S ^TMP("DILIST",$J,.3)="[MAP]",^TMP("DILIST",$J,.4)=^TMP("DILIST",$J,0,"MAP")
 K ^TMP("DILIST",$J,0)
 S ^TMP("DILIST",$J,.5)="[BEGIN_diDATA]"
 I XWBAPVER=1 D IX1
 D IENS,FLDS,WID,END
 Q
IX1 I DDROPT["IX",$D(^TMP("DILIST",$J,1)) D
 . S ^TMP("DILIST",$J,1,COUNT+1)="END_IXVALUES" D  S ^(.1)="BEGIN_IXVALUES",^(.2)=IXCNT
 . . N Z S Z=0,IXCNT=0 I $G(^TMP("DILIST",$J,1,1))]"" S IXCNT=1 Q
 . . F  S Z=$O(^TMP("DILIST",$J,1,1,Z)) Q:'Z  S IXCNT=IXCNT+1
 I DDROPT'["IX" K ^TMP("DILIST",$J,1)
 Q
IENS I $D(^TMP("DILIST",$J,2)) D
 .  S ^TMP("DILIST",$J,2,.1)="BEGIN_IENs",^(COUNT+1)="END_IENs"
 Q
FLDS I DDRFLDS]"",$D(^TMP("DILIST",$J,"ID")) D
 . N Z,FLD,FLDCNT S FLD="",(Z,FLDCNT,I)=0
 . ;I XWBAPVER>1,DDRFLDS["IX" D
 . ;. F  S I=$O(^TMP("DILIST",$J,"ID",1,0,I)) Q:'I  S IXCNT=IXCNT+1
 . ;. S ^TMP("DILIST",$J,"ID",0,0)="IXCNT="_IXCNT Q
 . F  S Z=$O(^TMP("DILIST",$J,"ID",1,Z)) Q:'Z   S FLD=FLD_Z_";",FLDCNT=FLDCNT+1
 . Q:'FLDCNT
 . S ^TMP("DILIST",$J,"ID",0)="BEGIN_IDVALUES"
 . I XWBAPVER=1 S ^TMP("DILIST",$J,"ID",.1)=FLD_U_FLDCNT
 . S ^TMP("DILIST",$J,"ID",COUNT+1)="END_IDVALUES"
 E  D
 . N Z S Z=0 F  S Z=$O(^TMP("DILIST",$J,"ID",Z)) Q:'Z  K ^TMP("DILIST",$J,"ID",Z)
 Q
WID I (DDROPT["WID")!(DDRFLDS["WID"),$D(^TMP("DILIST",$J,"ID","WRITE")) D
 . N Z,N,I,IEN,WIDCNT S (N,I)=0
 . M Z=^TMP("DILIST",$J,"ID","WRITE") K ^TMP("DILIST",$J,"ID","WRITE")
 . S ^TMP("DILIST",$J,"ID","WID",0)="BEGIN_WIDVALUES",N=N+1
 . F  S I=$O(Z(I)) Q:'I  S IEN=$G(^TMP("DILIST",$J,2,I)) D
 . . N J S (J,WIDCNT)=0 F  S J=$O(Z(I,J)) Q:'J  S WIDCNT=WIDCNT+1
 . . S ^TMP("DILIST",$J,"ID","WID",N)="WID"_U_IEN_U_WIDCNT,N=N+1
 . . N J S J=0 F J=1:1:WIDCNT S ^TMP("DILIST",$J,"ID","WID",N)=Z(I,J),N=N+1
 . S ^TMP("DILIST",$J,"ID","WID",N)="END_WIDVALUES"
 I (DDROPT'["WID")&(DDRFLDS'["WID") K ^TMP("DILIST",$J,"ID","WRITE")
 Q
END S ^TMP("DILIST",$J,"IDZ")="[END_diDATA]"
 Q

DDR0
DDR0 ;SF/DCM-FileMan Delphi Components' RPCs ;4/28/98  10:52
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
FINDC(DDRDATA,DDR) ; -- broker callback to get list data
 N DDRFILE,DDRIENS,DDRFLDS,DDRFLAGS,DDRVAL,DDRMAX,DDRXREF,DDRSCRN,DDRID,DDRROOT,DDRERR,DDRRSLT,DDROPT,DDROUT
 ; -- parse array to parameters
 D PARSE(.DDR)
 S DDROUT=""
 D FIND^DIC(DDRFILE,DDRIENS,DDRFLDS,DDRFLAGS,DDRVAL,DDRMAX,DDRXREF,DDRSCRN,DDRID,DDROUT,"DDRERR")
 I $G(DDRFLAGS)["P" D
 . Q:'$D(^TMP("DILIST",$J))
 . N COUNT S COUNT=^TMP("DILIST",$J,0) Q:'COUNT  D 1
 . I XWBAPVER>1 S ^(.3)="[MAP]",^TMP("DILIST",$J,.4)=^TMP("DILIST",$J,0,"MAP")
 . K ^TMP("DILIST",$J,0) S ^(.5)="[BEGIN_diDATA]",^(COUNT+1)="[END_diDATA]"
 . Q
 I $G(DDRFLAGS)'["P" D
 . Q:'$D(^TMP("DILIST",$J))
 . N COUNT S COUNT=^TMP("DILIST",$J,0) Q:'COUNT
 . D 1,UNPACKED
 . Q
 D 3,4
 Q
1 Q:'$P(COUNT,U,3)
 S ^TMP("DILIST",$J,.1)="[Misc]",^(.2)="MORE"
 Q
3 I $D(DIERR) D ERROR
 Q
4 S DDRDATA=$NA(^TMP("DILIST",$J))
 Q
PARSE(DDR) ; -- array parsing
 S DDRFILE=$G(DDR("FILE"))
 S DDRIENS=$G(DDR("IENS"))
 S DDRFLDS=$G(DDR("FIELDS"))
 S DDRFLAGS=$G(DDR("FLAGS"))
 S DDRMAX=$G(DDR("MAX"),"*")
 S DDRVAL=$G(DDR("VALUE"))
 S DDRXREF=$G(DDR("XREF"))
 S DDRSCRN=$G(DDR("SCREEN"))
 S DDRID=$G(DDR("ID"))
 S DDRROOT=$G(DDR("ROOT"))
 S DDROPT=$G(DDR("OPTIONS"))
 Q
ERROR ;
 N I S I=1
 D Z("[BEGIN_diERRORS]")
 N A S A=0 F  S A=$O(DDRERR("DIERR",A)) Q:'A  D
 . N HD,PARAM,B,C,TEXT,TXTCNT,D,FILE,FIELD,IENS
 . S HD=DDRERR("DIERR",A)
 . I $D(DDRERR("DIERR",A,"PARAM",0)) D
 . . S (B,D)=0 F C=1:1 S B=$O(DDRERR("DIERR",A,"PARAM",B)) Q:B=""  D
 . . . I B="FILE" S FILE=DDRERR("DIERR",A,"PARAM","FILE")
 . . . I B="FIELD" S FIELD=DDRERR("DIERR",A,"PARAM","FIELD")
 . . . I B="IENS" S IENS=DDRERR("DIERR",A,"PARAM","IENS")
 . . . S D=D+1,PARAM(D)=B_U_DDRERR("DIERR",A,"PARAM",B)
 . S C=0 F  S C=$O(DDRERR("DIERR",A,"TEXT",C)) Q:'C  S TEXT(C)=DDRERR("DIERR",A,"TEXT",C),TXTCNT=C
 . S HD=HD_U_TXTCNT_U_$G(FILE)_U_$G(IENS)_U_$G(FIELD)_U_$G(D) D Z(HD)
 . S B=0 F  S B=$O(PARAM(B)) Q:'B  S %=PARAM(B) D Z(%)
 . S B=0 F  S B=$O(TEXT(B)) Q:'B  S %=TEXT(B) D Z(%)
 . Q
 D Z("[END_diERRORS]")
 Q
Z(%) ;
 S ^TMP("DILIST",$J,"ZERR",I)=%,I=I+1
 Q
UNPACKED ;
 K ^TMP("DILIST",$J,0)
 S ^TMP("DILIST",$J,.5)="[BEGIN_diDATA]" K ^TMP("DILIST",$J,1)
 S ^TMP("DILIST",$J,2,.1)="BEGIN_IENs",^(COUNT+1)="END_IENs"
 I DDRFLDS]"",$D(^TMP("DILIST",$J,"ID")) D
 . N Z,FLD,FLDCNT S Z=0,FLD="",FLDCNT=0
 . F  S Z=$O(^TMP("DILIST",$J,"ID",1,Z)) Q:'Z   S FLD=FLD_Z_";",FLDCNT=FLDCNT+1
 . Q:'FLDCNT
 . S ^TMP("DILIST",$J,"ID",0)="BEGIN_IDVALUES",^(.1)=FLD_U_FLDCNT,^(COUNT+1)="END_IDVALUES"
 E  D
 . N Z S Z=0 F  S Z=$O(^TMP("DILIST",$J,"ID",Z)) Q:'Z  K ^TMP("DILIST",$J,"ID",Z)
 I $G(DDROPT)["WID",$D(^TMP("DILIST",$J,"ID","WRITE")) D
 . N Z,N,I,IEN,WIDCNT S (N,I)=0
 . M Z=^TMP("DILIST",$J,"ID","WRITE") K ^TMP("DILIST",$J,"ID","WRITE")
 . S ^TMP("DILIST",$J,"ID","WID",0)="BEGIN_WIDVALUES",N=N+1
 . F  S I=$O(Z(I)) Q:'I  S IEN=$G(^TMP("DILIST",$J,2,I)) D
 . . N J S (J,WIDCNT)=0 F  S J=$O(Z(I,J)) Q:'J  S WIDCNT=WIDCNT+1
 . . S ^TMP("DILIST",$J,"ID","WID",N)="WID"_U_IEN_U_WIDCNT,N=N+1
 . . N J S J=0 F J=1:1:WIDCNT S ^TMP("DILIST",$J,"ID","WID",N)=Z(I,J),N=N+1
 . S ^TMP("DILIST",$J,"ID","WID",N)="END_WIDVALUES"
 I $G(DDROPT)'["WID" K ^TMP("DILIST",$J,"ID","WRITE")
 S ^TMP("DILIST",$J,"IDZ")="[END_diDATA]"
 Q

DDR1
DDR1 ;ALB/MJK-FileMan Delphi Components' RPCs ;4/18/97  16:15
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
 ;
DIKC(DDROK,DDR) ; -- broker callback to kill a file entry via ^DIK
 N DIK,DA,FILE,IENS,FDA
 S FILE=$G(DDR("FILE"))
 S IENS=$G(DDR("IENS"))
 I $$FNO^DILIBF(FILE)=FILE,$L(IENS,",")=2 D  Q
 . S DIK=$G(^DIC(FILE,0,"GL")),DA=+IENS D ^DIK S DDROK=1
 S FDA(FILE,IENS,.01)="@"
 D FILE^DIE("","FDA")
 S DDROK='$G(DIERR)
 Q
 ;
LOCKC(DDROK,DDR) ; -- broker callback to lock/unlock a node
 N DDRNODE
 S DDRNODE=$G(DDR("NODE"))
 IF DDRNODE]"" D
 . IF $G(DDR("LOCKMODE")) D
 . . L @("+"_DDRNODE_":"_$G(DDR("TIMEOUT"),5))
 . . S DDROK=$T
 . ELSE  D
 . . L @("-"_DDRNODE)
 . . S DDROK=1
 ELSE  D
 . S DDROK=0
 Q
 ;
FILENOC(DDRFLNO,DDRNAME) ; -- broker callback to get File #
 ;
 S DDRFLNO=+$O(^DIC("B",DDRNAME,""))
 Q
 ;
NODEC(DDRNODE,DDRROOT) ; -- broker callback to get global node value
 ;
 ;S DDRNODE=$G(@DDRROOT)
 IF $D(@DDRROOT)=0!($D(@DDRROOT)=10) D
 . S DDRNODE="{{"_$D(@DDRROOT)_"}}"
 IF $D(@DDRROOT)=1!($D(@DDRROOT)=11) D
 . S DDRNODE=$G(@DDRROOT)
 Q
 ;
GLCNT(DDROK,DDR) ; -- extrinsic call to invoke broker to return number of
 ;       global nodes found at cross reference
 N DDRNODE,DDRTEAM,DDRXREF
 ;
 S DDRNODE=$G(DDR("ROOT"))
 S DDRXREF=$G(DDR("XREF"))
 S DDRVAL=$G(DDR("VALUE"))
 ;
 S:DDRXREF="" DDRXREF="B"
 S I="",X=0
 F  S I=$O(@DDRNODE@(DDRXREF,DDRVAL,I)) Q:I=""  D
 . S X=X+1
 S DDROK=$G(X)
 Q
 ;
IFNODE(DDRNODE,DDRROOT) ; -- extrinsic call to check if node exists.
 ; passes in full node reference
 N X
 ;
 IF $D(@DDRROOT)=0!($D(@DDRROOT)=10) D
 . S DDRNODE="{{"_$D(@DDRROOT)_"}}"
 IF $D(@DDRROOT)=1!($D(@DDRROOT)=11) D
 . S DDRNODE=$G(@DDRROOT)
 Q

DDR2
DDR2 ;ALB/MJK-FileMan Delphi Components' RPCs ;4/20/98  11:38
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
 ;
FIND1C(DDRDATA,DDR) ; DDR FIND1 rpc callback
 N DDRFILE,DDRIENS,DDRFLAGS,DDRVAL,DDRXREF,DDRSCRN,DDRERR,A,IEN,N
 D PARSE(.DDR) S DDRVAL=$G(DDR("VALUE"))
 S A=$$FIND1^DIC(DDRFILE,DDRIENS,DDRFLAGS,DDRVAL,DDRXREF,DDRSCRN,"DDRERR")
 S A=$S($G(DIERR):"",1:A)
 S N=0 D SET(A)
 I $G(DIERR) D ERROR Q
 I $G(DDROPT)["R" S IEN=$S($G(DDRIENS)]"":A_DDRIENS,1:A_",") D RECALL^DILFD(DDRFILE,IEN,DUZ)
 Q
 ;
GETSC(DDRDATA,DDR) ; DDR GETS ENTRY DATA rpc callback
 N DDRFILE,DDRIENS,DDRFLDS,DDRFLAGS,DDROPT,DDRRSLT,DDRERR
 N DDRXREF,DDRSCRN,N
 D PARSE(.DDR)
 D GETS^DIQ(DDRFILE,DDRIENS,DDRFLDS,DDRFLAGS,"DDRRSLT","DDRERR")
 S N=0
 I '$D(DDROPT) D 1,2 Q
 I $G(DDROPT)["U" D 11,21
 I $G(DDROPT)["?" D HLP
 Q
1 I $D(DDRRSLT) D
 . N DDRFIELD,X,J
 . D SET("[Data]")
 . S DDRFIELD=0 F  S DDRFIELD=$O(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD)) Q:'DDRFIELD  D
 . . ;Do not remove stripping of ',' from IENS in line below if this code should work with T11 (21.1T1) of FM components.
 . . S X=DDRFILE_"^"_$E(DDRIENS,1,$L(DDRIENS)-1)_"^"_DDRFIELD_"^"
 . . ; -- below call to $$GET1 is too slow...working w/FM team for speed
 . . ;IF $$GET1^DID(DDRFILE,DDRFIELD,"","TYPE")="WORD-PROCESSING" D
 . . ;IF $P($G(^DD(DDRFILE,DDRFIELD,0)),U,4)[";0" D <<Replaced by more generic check below.
 . . I $P($G(^DD(+$P($G(^DD(DDRFILE,DDRFIELD,0)),U,2),.01,0)),U,2)["W" D
 . . . D SET(X_"[WORD PROCESSING]")
 . . . S J=0 F  S J=$O(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,J)) Q:'J  D
 . . . . D SET(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,J))
 . . . D SET("$$END$$")
 . . E  D
 . . . D SET(X_$G(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,"I"))_"^"_$G(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,"E")))
 Q
11 N HD,I,E,B,J,K
 D SET("[BEGIN_diDATA]")
 S HD=DDRFILE_U_$E(DDRIENS,1,$L(DDRIENS)-1)
 S I=DDRFLAGS["I",E=DDRFLAGS["E",B=(I&E)
 S DDRFIELD=0 F  S DDRFIELD=$O(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD)) Q:'DDRFIELD  D
 . I $P($G(^DD(+$P($G(^DD(DDRFILE,DDRFIELD,0)),U,2),.01,0)),U,2)["W" D  Q
 . . S (K,J)=0 F  S K=$O(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,K)) Q:'K  S J=J+1
 . . D SET(HD_U_DDRFIELD_U_"W"_U_J)
 . . S J=0  F  S J=$O(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,J)) Q:'J  D SET(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,J))
 . . Q
 . S FLG=$S(B:"B",I:"I",1:"E")
 . D SET(HD_U_DDRFIELD_U_FLG)
 . I B D SET(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,"E")),SET(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,"I")) Q
 . I E D SET(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,"E")) Q
 . I I D SET(DDRRSLT(DDRFILE,DDRIENS,DDRFIELD,"I")) Q
 D SET("[END_diDATA]")
 Q
2 IF $D(DDRERR) D SET("[ERROR]")
 Q
21 I $D(DIERR) D ERROR
 Q
SET(X) ;
 S N=N+1
 S DDRDATA(N)=X
 Q
HLP ;
 N FLD,FLG,Z,%
 S FLD=0,FLG="?"
 D SET("[BEGIN_diHELP]")
 F Z=1:1 S FLD=+$P(DDRFLDS,";",Z) Q:'FLD  D HELP(DDRFILE,DDRIENS,FLD,FLG)
 D SET("[END_diHELP]")
 Q
 ;
GETHLPC(DDRDATA,DDR) ; DDR GET DD HELP rpc callback
 N DDRFILE,DDRFIELD,DDRFLGS,N
 S DDRFILE=$G(DDR("FILE"))
 S DDRFIELD=$G(DDR("FIELD"))
 S DDRFLGS=$G(DDR("FLAGS"))
 S N=0
 D SET("[BEGIN_diHELP]")
 D HELP(DDRFILE,"",DDRFIELD,DDRFLGS)
 D SET("[END_diHELP]")
 Q
 ;
HELP(FILE,IENS,FIELD,FLGS) ;
 N DDRHLP,HD,A
 D HELP^DIE(FILE,IENS,FIELD,FLGS,"DDRHLP")
 Q:'$D(DDRHLP("DIHELP"))
 S HD=FILE_U_FIELD_U_"?"_U_DDRHLP("DIHELP") D SET(HD)
 S A=0 F  S A=$O(DDRHLP("DIHELP",A)) Q:'A   D SET(DDRHLP("DIHELP",A))
 Q
ERROR ;
 D SET("[BEGIN_diERRORS]")
 N A S A=0 F  S A=$O(DDRERR("DIERR",A)) Q:'A  D
 . N HD,PARAM,B,C,TEXT,TXTCNT,D,FILE,FIELD,IENS
 . S HD=DDRERR("DIERR",A)
 . I $D(DDRERR("DIERR",A,"PARAM",0)) D
 . . S (B,D)=0 F C=1:1 S B=$O(DDRERR("DIERR",A,"PARAM",B)) Q:B=""  D
 . . . I B="FILE" S FILE=DDRERR("DIERR",A,"PARAM","FILE")
 . . . I B="FIELD" S FIELD=DDRERR("DIERR",A,"PARAM","FIELD")
 . . . I B="IENS" S IENS=DDRERR("DIERR",A,"PARAM","IENS")
 . . . S D=D+1,PARAM(D)=B_U_DDRERR("DIERR",A,"PARAM",B)
 . S C=0 F  S C=$O(DDRERR("DIERR",A,"TEXT",C)) Q:'C  S TEXT(C)=DDRERR("DIERR",A,"TEXT",C),TXTCNT=C
 . S HD=HD_U_TXTCNT_U_$G(FILE)_U_$G(IENS)_U_$G(FIELD)_U_$G(D) D SET(HD)
 . S B=0 F  S B=$O(PARAM(B)) Q:'B  S %=PARAM(B) D SET(%)
 . S B=0 F  S B=$O(TEXT(B)) Q:'B  S %=TEXT(B) D SET(%)
 . Q
 D SET("[END_diERRORS]")
 Q
PARSE(DDR) ;
 S DDRFILE=$G(DDR("FILE"))
 S DDRIENS=$G(DDR("IENS"))
 S DDRFLDS=$G(DDR("FIELDS"))
 S DDRFLAGS=$G(DDR("FLAGS"))
 S DDRXREF=$G(DDR("XREF"))
 S DDRSCRN=$G(DDR("SCREEN"))
 S:$D(DDR("OPTIONS")) DDROPT=DDR("OPTIONS")
 Q

DDR3
DDR3 ;ALB/MJK,SF/DCM-FileMan Delphi Components' RPCs ;2/24/98  10:01
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
 ;
FILEC(DDRDATA,DDRMODE,DDRROOT,DDRFLAGS,DDRIENS) ;  DDR FILER rpc callback
 N DDRRTN,DDRFDA,DDRERR,N,I
 D FDASET(.DDRROOT,.DDRFDA)
 ; -- set up placeholder DINUM's if any
 ; -- NOTE:  Can't use until multiple arrays can be passed by broker
 I $D(DDRROOT("IENs")) M DDRIENS=DDRROOT("IENs")
 S I="" F  S I=$O(DDRIENS(I)) Q:I=""  S DDRRTN(+I)=+DDRIENS(I)
 IF DDRMODE="ADD" D
 . D UPDATE^DIE("","DDRFDA","DDRRTN","DDRERR")
 ELSE  D
 . S DDRFLAGS=$S($D(DDRFLAGS):DDRFLAGS,1:"")
 . D FILE^DIE(DDRFLAGS,"DDRFDA","DDRERR")
 S N=0
 D SET("[Data]")
 ; -- send back info on entry #'s for placeholders
 S I=0 F  S I=$O(DDRRTN(I)) Q:'I  D SET("+"_I_","_U_DDRRTN(I))
 IF $D(DDRERR) D ERROR
 Q
 ;
FDASET(DDRROOT,DDRFDA) ;
 N DDRFILE,DDRIEN,DDRFIELD,DDRVAL,DDRERR,I
 S I=0
 F  S I=$O(DDRROOT(I)) Q:'I  S X=DDRROOT(I) D
 . S DDRFILE=$P(X,U)
 . S DDRFIELD=$P(X,U,2)
 . S DDRIEN=$P(X,U,3)
 . S DDRVAL=$P(X,U,4,99)
 . D FDA^DILF(DDRFILE,DDRIEN_$S($E(DDRIEN,$L(DDRIEN))'=",":",",1:""),DDRFIELD,"",DDRVAL,"DDRFDA","DDRERR")
 Q
 ;
VALC(DDRDATA,DDR) ; DDR VALIDATOR rpc callback
 N DDRFILE,DDRIENS,DDRFIELD,DDRVAL,DDRRSLT,DDRERR,DDRFLAGS,N
 S DDRFLAGS="EH"
 S DDRFILE=$G(DDR("FILE"))
 S DDRIENS=$G(DDR("IENS"))
 S DDRFIELD=$G(DDR("FIELD"))
 S DDRVAL=$G(DDR("VALUE"))
 D VAL^DIE(DDRFILE,DDRIENS,DDRFIELD,DDRFLAGS,DDRVAL,.DDRRSLT,"","DDRERR")
 S N=0
 D SET("[FILLER]")
 D SET("[Data]")
 D SET($G(DDRRSLT,U))
 D SET($G(DDRRSLT(0)))
 IF $D(DDRERR) D ERROR,HELP
 Q
SET(X) ;
 S N=N+1
 S DDRDATA(N)=X
 Q
HELP ;
 Q:'$D(DDRERR("DIHELP"))
 D SET("[BEGIN_diHELP]")
 S HD=DDRFILE_U_DDRFIELD_U_"?"_U_DDRERR("DIHELP") D SET(HD)
 N A S A=0 F  S A=$O(DDRERR("DIHELP",A)) Q:'A  D SET(DDRERR("DIHELP",A))
 D SET("[END_diHELP]")
 Q
ERROR ;
 D SET("[BEGIN_diERRORS]")
 N A S A=0 F  S A=$O(DDRERR("DIERR",A)) Q:'A  D
 . N HD,PARAM,B,C,TEXT,TXTCNT,D,FILE,FIELD,IENS
 . S HD=DDRERR("DIERR",A)
 . I $D(DDRERR("DIERR",A,"PARAM",0)) D
 . . S (B,D)=0 F C=1:1 S B=$O(DDRERR("DIERR",A,"PARAM",B)) Q:B=""  D
 . . . I B="FILE" S FILE=DDRERR("DIERR",A,"PARAM","FILE")
 . . . I B="FIELD" S FIELD=DDRERR("DIERR",A,"PARAM","FIELD")
 . . . I B="IENS" S IENS=DDRERR("DIERR",A,"PARAM","IENS")
 . . . S D=D+1,PARAM(D)=B_U_DDRERR("DIERR",A,"PARAM",B)
 . S C=0 F  S C=$O(DDRERR("DIERR",A,"TEXT",C)) Q:'C  S TEXT(C)=DDRERR("DIERR",A,"TEXT",C),TXTCNT=C
 . S HD=HD_U_TXTCNT_U_$G(FILE)_U_$G(IENS)_U_$G(FIELD)_U_$G(D) D SET(HD)
 . S B=0 F  S B=$O(PARAM(B)) Q:'B  S %=PARAM(B) D SET(%)
 . S B=0 F  S B=$O(TEXT(B)) Q:'B  S %=TEXT(B) D SET(%)
 . Q
 D SET("[END_diERRORS]")
 Q
 ;

DDR4
DDR4 ;SFCIOFO/DPC-FileMan Delphi Components' RPCs ;2/24/96  12:02
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
KEYVAL(DDROUT,DDRFDARW) ;
 N DDRFDA,DDRERR
 D FDASET2(.DDRFDARW,.DDRFDA)
 S DDROUT(1)=$$KEYVAL^DIEVK("","DDRFDA","DDRERR")
 Q
 ;
FDASET2(DDRFDARW,DDRFDA) ;
 N DDRI,DDRLINE,DDRFILE,DDRIENS,DDRFIELD
 F DDRI=1:1 S DDRLINE=$G(DDRFDARW(DDRI)) Q:DDRLINE=""  D
 . I DDRI#2 D
 . . S DDRFILE=$P(DDRLINE,U)
 . . S DDRIENS=$P(DDRLINE,U,2)
 . . S DDRFIELD=$P(DDRLINE,U,3)
 . E  D
 . . S DDRFDA(DDRFILE,DDRIENS,DDRFIELD)=$TR(DDRLINE,$C(13)_","_$C(10))
 Q

DDS
DDS ;SFISC/MLH,MKO-MAIN ROUTINE ;18JUN2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIE,DX,DY,X,Y
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 D EN^DDS0(.DDSFILE,DR,.DA)
 I $G(DIERR) D:$G(DDSPARM)'["E"  G END^DDS0
 . W !,$C(7)_$$EZBLD^DIALOG(3000)
 . D MSG^DIALOG("BW")
 . S DIMSG=""
 ;
 N DR
 X:$G(^DIST(.403,+DDS,11))'?."^" ^(11)
 F  D PG Q:DDACT="Q"
 X:$G(^DIST(.403,+DDS,12))'?."^" ^(12)
 ;
 D:$G(@DDSREFT@("HLP"))>0 HLP^DDSMSG()
 G END^DDS0
 ;
PROC ;Main loop
 F  D PG Q:DDACT="Q"
 Q
 ;
PG ;Load page
 N DDSMX,DDSMY,DDSMOUSE,FND
 S DDACT="N"
 D ^DDS1(DDSPG)
 I $G(DIERR) D  Q
 . N P S P(1)=$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U),P(2)=$P($G(^(1)),U)
 . S:P(2)="" P(2)="unnamed"
 . D BLD^DIALOG(3041,.P),ERR^DDSMSG H 2
 . S DDACT="Q"
 ;
 ;Pre-action, save old and get next page
 S DDSOPB=DDSPG
 I $G(^DIST(.403,+DDS,40,DDSPG,11))'?."^" D PA(^(11)) Q:DDACT="NP"
 S DDSNP=$$NP^DDS5(.Y) S:'Y DDSNP=""
 ;
 ;Get DDO and DDSBK
 I $S($D(DDSBR)[0:1,1:$D(@DDSREFS@(DDSPG,$S(DDO:+DDSBK,1:0),DDO,"N"))[0) D
 . S DDO=+$G(@DDSREFS@(DDSPG,"FIRST")),DDSBK=$P($G(^("FIRST")),",",2)
 I 'DDSBK D  Q
 . D BLD^DIALOG(3055,"number "_$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U)_$S($G(^(1))]"":" ("_$P($G(^(1)),U)_")",1:""))
 . D ERR^DDSMSG H 2
 . S DDACT="Q"
 ;
 ;Get DDSPOP and update DDSSC array
 ;If we're going to another page
 I '$D(DDSPGUP) D
 . S DDSLN=^DIST(.403,+DDS,40,DDSPG,0),DDSPOP=$P(DDSLN,U,6)
 . K:'DDSPOP DDSSC
SEL . I $D(DDSSEL),+$G(^DIST(.403,+DDS,21))=DDSPG D  ;IF IT'S (REALLY) A RECORD SELECTION PAGE FORGET DA
 .. S DDSDASV=DDSDA,DDSDLSV=DDSDL
 .. M DDSORGSV=DDSDAORG
 .. K DA,@$$D0(DDSDL),DDSDAORG
 .. S (DA,D0,DDSDAORG)="",DDSDA="0,",DDSDL=0
 . I '$D(DDSSC("B",DDSPG)) D
 .. S DDSSC=$G(DDSSC)+1,DDSSC(DDSSC)=DDSPG,DDSSC("B",DDSPG,DDSSC)=""
 .. S:DDSPOP $P(DDSSC(DDSSC),U,2,3)=$P(DDSLN,U,3)_U_$P(DDSLN,U,7)
 .. I $G(DDSSTK) S $P(DDSSC(DDSSC),U,4)=1 K DDSSTK
 .. K DDSPOP
 . E  D
 .. Q:$P($G(DDSSC(+$G(DDSSC))),U)=DDSPG
 .. N I,J,S
 .. S I=$O(DDSSC("B",DDSPG,"")),S=DDSSC(I) K DDSSC("B",DDSPG,I)
 .. F J=I:1:DDSSC-1 D
 ... K DDSSC("B",$P(DDSSC(J+1),U),J)
 ... S DDSSC(J)=DDSSC(J+1),DDSSC("B",$P(DDSSC(J),U),J)=""
 .. S DDSSC(DDSSC)=S,DDSSC("B",DDSPG,DDSSC)=""
 ;
 ;If we've moving up from a pop-up page
 E  K DDSPGUP
 ;
 ;Paint the page
 D RP^DDSR(DDSSC(DDSSC),DDSSC=1)
 ;
P1 F  D BLK Q:"^Q^NP^"[(U_DDACT_U)
 ;
 ;PAGE Post action, print any help
 D:$G(^DIST(.403,+DDS,40,+DDSOPB,12))'?."^" PA(^(12))
 D:$G(@DDSREFT@("HLP"))>0 HLP^DDSMSG()
 G:"^NB^N^"[(U_DDACT_U) P1
 ;
 I DDACT="Q" D
 . I '$P(DDSSC(DDSSC),U,4) D
 .. I $G(DDSSEL) D GDA^DDSRSEL Q:'DA  ;Do the RECORD SELECTION Page, if there is one
 .. D:$G(DDSSC)>1 CLEAR^DDSBOX($P(DDSSC(DDSSC),U,2),$P(DDSSC(DDSSC),U,3))
 .. S:DDSSC>1 DDSPG=$P(DDSSC(DDSSC-1),U),DDACT="N",DDSPGUP=1
 . K DDSSC("B",$P(DDSSC(DDSSC),U),DDSSC),DDSSC(DDSSC) S DDSSC=DDSSC-1
 Q
 ;
BLK S DDACT="N",DDSOSV=0
 ;
 I $D(@DDSREFS@(DDSPG,DDSBK))[0 S DDACT="Q" Q
 S DDSLN=@DDSREFS@(DDSPG,DDSBK)
 ;
 S DDSDN=$P(DDSLN,U,4),DDSTP=$P(DDSLN,U,5)
 S DDSREP=$P(DDSLN,U,7),DDSPTB=$P(DDSLN,U,8)
 K:'DDSDN DDSDN K:DDSTP="e" DDSTP K:'DDSPTB DDSPTB K:DDSREP'>1 DDSREP
 ;
 I $D(DDSPTB)!$D(DDSREP) N DDP,DDSDA,DIE D  ;NEW WHEN WE GO INTO MULTIPLE!!
 . S DDP=$P(DDSLN,U,3)
DIE . S DDSDA=$P(@DDSREFT@(DDSPG,DDSBK),U) I DDSDA'>0,$G(^(DDSBK,"COMP MUL"))="" S DIE=$G(DIE) Q  ;Get Entry Number
 . S DIE=@DDSREFT@(DDSPG,DDSBK,DDSDA,"GL")
 ;
 I $D(DDSPTB) N DA,@$$D0(DDSDL),DDSDL D
 . S DDSPTB=@DDSREFS@(DDSPG,DDSBK,"PTB")
 . S DDSDL=$L(DDSDA,",")-2
 . S (D0,DA)=+DDSDA
 ;
 I $D(DDSREP) N DDSDL,DA D
 . S DDSREP=$P(@DDSREFT@(DDSPG,DDSBK,DDSDA),U,2,999)
 . S DDSDA=$G(@DDSREFT@(DDSPG,DDSBK,$P(DDSREP,U),$P(DDSREP,U,4)),"0,"_DDSDA) ;2-arg $G -- go to empty line if none other specified
 . S:'$P(DDSREP,U,7) DDSDA=$P(DDSDA,",")_","
 . S DDSDL=$L(DDSDA,",")-2
 I  N @$$D0(DDSDL) D
 . D BLDDA(DDSDA)
 . S:'DA DDO=+$P(DDSREP,U,8) ;If this is a new subEntry, start at 1st editable field
 ;
PTB I $D(DDSPTB),'$D(DDSREP),'DDSDA,DDSDAORG  D  Q
 . N DDSBK0
 . S DDSBK0=DDSBK
 . F  S DDSBK=$$NB^DDS5(.Y) Q:DDSBK=DDSBK0!'Y!$G(@DDSREFT@(DDSPG,DDSBK))
 . Q:Y
 . I DDSNP]"" S DDSPG=DDSNP,DDACT="NP" Q
 . S DDSPG=$$PP^DDS5(.Y) I Y S DDACT="NP" Q
 . S DDACT="Q"
 ;
 S $P(DDSOPB,U,2)=DDSBK
 I $G(^DIST(.403,+DDS,40,DDSPG,40,DDSBK,11))'?."^" D PA(^(11)) Q:DDACT="NP"
 I $G(^DIST(.404,DDSBK,11))'?."^" D PA(^(11)) Q:DDACT="NP"
1 I $S($D(DDSBR)[0:1,1:$D(@DDSREFS@(DDSPG,$S(DDO:+DDSBK,1:0),DDO,"N"))[0) D
 . S DDO=$P(@DDSREFS@(DDSPG,DDSBK),U,9) ;First field
 K DDSLN
 ;
B1 D ^DDS01
 ;
 I $G(^DIST(.403,+DDS,40,DDSPG,40,$P(DDSOPB,U,2),12))'?."^" D PA(^(12)) G:DDACT="N" B1
 I $G(^DIST(.404,$P(DDSOPB,U,2),12))'?."^" D PA(^(12)) G:DDACT="N" B1
 Q
 ;
BLDDA(DDSDA) ;
 N I
 S (DA,@("D"_DDSDL))=$P(DDSDA,",")
 F I=1:1:DDSDL S (DA(I),@("D"_(DDSDL-I)))=$P(DDSDA,",",I+1)
 Q
 ;
D0(DL) ;Given DL, return string D0,D1,...,Dn
 N I,S
 S S="" F I=0:1:DL S S=S_"D"_I_","
 S:S?.E1"," S=$E(S,1,$L(S)-1)
 Q S
 ;
CLRMSG ;
 I $G(DDSKM) H 2 K DDSKM ;GFT  ** IF WE WERE KEEPING SOMETHING IN HELP AREA, HOLD UP 2 SECONDS  ISB-0603-31054
 K DDQ S DDSH=1,(DDM,DX)=0,DY=DDSHBX+1 X DDXY W $P(DDGLCLR,DDGLDEL,3) ;CLEAR WHOLE COMMAND AREA
 N I F  S I=$O(DDSMOUSE(DDSHBX)) Q:I+1=IOSL!'I  K DDSMOUSE(I)
 Q
 ;
PA(DDSPA) ;
 N DDSBRORG S:$D(DDSBR)#2 DDSBRORG=DDSBR
 K DDSBR X DDSPA ;PRE-ACTION OR POST-ACTION
 I $D(DDSBR)[0 S:$D(DDSBRORG)#2 DDSBR=DDSBRORG Q
 D BR^DDS2
 Q
 ;
 ;
 ;
 ;
 ;
 ;
RESET ;Programmer entry point to reset terminal and cleanup
 D INIT^DDGLIB0() D:$G(DIERR) MSG^DIALOG("BW")
 W $P($G(DDGLVID),DDGLDEL,10)
 K DDSPARM
 S DDSREFT="^TMP(""DDS"",$J)"
 D END^DDS0
 G RESET^DDGF
 ;
RUN ;Run a form
 G ^DDSRUN
CLONE ;Clone a form
 G ^DDSCLONE
PRINT ;Print a form
 G ^DDSPRNT
DFRM ;Delete a form
 G ^DDSDFRM
DBLK ;Delete unused blocks
 G ^DDSDBLK

DDS0
DDS0 ;SFISC/MLH-SETUP, CLEANUP ;24FEB2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EN(DDSFILE,DR,DA) ;Initial setup
 S U="^"
 D INIT^DDGLIB0() Q:$G(DIERR)
 D FORM(.DDSFILE,DR) Q:$G(DIERR)
 ;
 ;Compile the form if not already compiled
 S DDSREFS=$$REF(DDS)
 I '$$COMPILED(DDS) D EN^DDSZ(DDS) Q:$G(DIERR)
 N:$P(^DIST(.403,+DDS,0),U,10) DA
 ;
 D FRSTPG(DDS,.DA,$G(DDSPAGE)) Q:$G(DIERR)
 D REC(DDP,.DA) Q:$G(DIERR)
 D INIT
 Q
 ;
FORM(DDSFILE,DR) ;Form lookup
 ;Output:
 ;  DDS     = Form number^Form name
 ;  DDP     = File number (or 0)
 ;  DDSPG   = First page to go to on form
 ;  DIERR
 ;
 I $D(DDSFILE)[0 D BLD^DIALOG(201,"DDSFILE") Q
 ;
 N DIC,X,Y
 ;
 S DDP=$S(DDSFILE=+DDSFILE:DDSFILE,1:+$P($G(@(DDSFILE_"0)")),U,2))
 S X=$S(DR:DR,1:$P($P(DR,"[",2),"]"))
 S DIC="^DIST(.403,",DIC(0)="FNX",D="F"_DDP
 D IX^DIC K DIC
 ;
 I Y<0 D BLD^DIALOG(3021,X) Q
 I '$O(^DIST(.403,+Y,40,"B","")) D BLD^DIALOG(3022,X) Q
 S DDS=Y
 ;
 I $D(DDSFILE(1))#2 S DDP=$S(DDSFILE(1)=+DDSFILE(1):DDSFILE(1),1:+$P($G(@(DDSFILE(1)_"0)")),U,2))
 Q
 ;
FRSTPG(DDS,DA,DDSPAGE) ;Get first page of form
 ;Output:
 ;  DDSPG
 ;  DDSSEL = 1, if DA is null and there is a record selection page
 ;  DIERR
 ;
 N P
 I $G(DA)!$P(^DIST(.403,+DDS,0),U,10) D
 . S P=$S($G(DDSPAGE):DDSPAGE,1:1)
 . S DDSPG=$O(^DIST(.403,+DDS,40,"B",P,""))
 . I $D(^DIST(.403,+DDS,40,+DDSPG,0))[0 D BLD^DIALOG(3023,"number "_P)
 E  D PG^DDSRSEL D:'$G(DDSSEL) BLD^DIALOG(202,"record")
 Q
 ;
REC(DDP,DA) ;Check record and lock
 ;Output:
 ;  DIE      = Global root
 ;  DDSDA    = DA,DA(1),...,
 ;  DDSDAORG = Original DA array
 ;  DDSDL    = Level number (top=0)
 ;  DDSDLORG = Original level number
 ;  DDSFLORG  = Orig DDP^Orig DIE
 ;  D0,D1,etc.
 ;  DIERR
 ;
 I '$G(DA) D  Q
 . S DIE="",(DDSDL,DDSDLORG)=0,DDSDA="0,"
 . S DA="",DDSDAORG=DA
 ;
 D GL^DDS10(DDP,.DA,.DIE,.DDSDL,.DDSDA,'$P(^DIST(.403,+DDS,0),U,9)) Q:$G(DIERR)  ;Don't LOCK record if screen is DISPLAY-ONLY
 ;
 I $D(DIOVRD)[0 D  Q:$G(DIERR)
 . N DDSTOP S DDSTOP=$$FNO^DILIBF(DDP)
 . Q:$P($G(^DD(DDSTOP,0,"DI")),U,2)'["Y"
EGP . N P S P("FILE")=$$FILENAME^DIALOGZ(DDSTOP) ;**CCO/NI RESTRICTED FILE NAME
 . D BLD^DIALOG(405,DDSTOP,.P)
 ;
 S DDSDLORG=DDSDL
 K DDSDAORG S (DDSDAORG,@("D"_DDSDL))=DA
 F DDSI=1:1:DDSDL S (DDSDAORG(DDSI),@("D"_(DDSDL-DDSI)))=DA(DDSI)
 S DDSFLORG=$G(DDP)_$G(DIE)
 K DDSI
 Q
 ;
INIT ;Initialize some variables
 ; DDSHBX   = $Y of first line of help area
 ; DDSREFT  = Global reference of temporary global location
 ; DDSFDO   = 1 if entire form is display-only
 ; DDSCHG   = Change flag
 ; DDSKM    = Flag to keep whatever's in help area
 ; DDSH     = Flag to indicate help area is empty
 ; DDSSC    = Array to indicate what pages are on the screen
 ;
DDSHBX S DDSHBX=17 I $G(DDS),$G(DDSPG),$D(DDSREFS) D
 .N % S %=$O(@DDSREFS@("X",DDSPG,""),-1)+1 I %>DDSHBX S DDSHBX=% ;LAST FIELD CAPTION
 .F DDH=0:0 S DDH=$O(@DDSREFS@(DDSPG,DDH)) Q:'DDH  I $G(^(DDH)) S %=$P(^(DDH),U,7)+^(DDH) I %>DDSHBX S DDSHBX=%
 S DDXY=IOXY_" S $X=DX,$Y=DY"
 ;
 K DDH,DDSSC,DDSCHANG,DDSSAVE
 S DDSH=1,(DDH,DDM,DDSCHG,DDSSC)=0,DDACT="N"
DDSREFT S DDSREFT=$NA(^TMP("DDS",$J,+DDS)) ;GFT
 K @DDSREFT
MOUSEON I $G(DDS)>0 W *27,"[?1000h"
 N %,%H,%I,X
 D NOW^%DTC
 S $P(^DIST(.403,+DDS,0),U,6)=$E(%,1,12)
 Q
 ;
END I $D(DDSHBX) S DX=0,DY=IOSL-1 X IOXY
 D KILL^DDGLIB0($G(DDSPARM))
 ;
 D:$D(^TMP("DDS",$J,"LOCK")) UNLOCK
 ;
 K:'$G(DA) DA
 I $D(DA),$D(DDSDAORG)#2,$D(DDSDLORG)#2 D
 . K DA,D0
 . S DA=DDSDAORG
 . F DDSI=1:1:DDSDLORG S DA(DDSI)=DDSDAORG(DDSI) K @("D"_DDSI)
MOUSEOFF W *27,"[?1000l"
 K:$G(DDSPARM)'["E" DIERR,^TMP("DIERR",$J)
 K:$D(DDSREFT)#2 @DDSREFT,DDSREFT
 K ^TMP("DDSH",$J),^TMP("DDSWP",$J)
 K DDACT,DDH,DDM,DDO,DDP,DDQ,DDS,DDSDDP
 K DDSBK,DDSBR,DDSCHG,DDSDA,DDSDAORG,DDSDL
 K DDSDLORG,DDSDN,DDSEXT,DDSFDO,DDSFLD,DDSFLORG,DDSGL,DDSH,DDSI
 K DDSKM,DDSLN,DDSNP,DDSO,DDSOLD,DDSORD,DDSOPB,DDSOSV,DDSPTB,DDSPG
 K DDSPX,DDSPY,DDSQ,DDSREP,DDSSC,DDSSP,DDSSTACK,DDSTP,DDSU,DDSX
 K DDSHBX,DDSREFS,DDXY
 K DIC,DIR,DIR0N,DIROUT,DIRUT,DUOUT,DY,DX
 K A1,D,DDC,DDD,DI,DIEQ,DIK,DIW,DIY,DIZ,DS
 Q
 ;
UNLOCK ;Unlock any lock records
 N I
 S I="" F  S I=$O(^TMP("DDS",$J,"LOCK",I)) Q:I=""  L -@I
 K ^TMP("DDS",$J,"LOCK")
 Q
 ;
COMPILED(DDS) ;Return 1 if form is compiled
 Q $D(@$$REF(DDS))>0
 ;
REF(DDS) ;Return global reference for compiled global
 Q $NA(^DIST(.403,+DDS,"AY"))
 ;
OLDREF(DDS) ;Return global reference for compiled global used prior
 ;to version 22.0
 Q $NA(^DIST(.403,+DDS,"AZ"))
 ;
IXF ;
 N D0,DA,DIC,DP,Y S DIC="^DD("_DDGFDD_",",DIC(0)="EN" D ^DIC
 I Y'>0 K X
 E  S X=+$P(Y,"E")
 Q

DDS01
DDS01 ;SFISC/MLH,MKO-PROCESS BLOCK ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;***BE CAREFUL PUTTING TAGS INTO THIS IMPORTANT ROUTINE!  $T LOOKS FOR A NON-EXISTENCE OF A TAG!****
 ;
 F  D IN,CHK Q:"^Q^NB^NP^"[(U_DDACT_U)
 Q
 ;
IN K DDSBR,DDSFLD,DDSO,DDSU,DIR,DDSREPNT
 S:$D(@DDSREFS@(DDSPG,$S(DDO:DDSBK,1:0),DDO,"N"))#2 DDSU("N")=^("N")
 I DDM,'$G(DDSKM) D CLRMSG^DDS
 G:'DDO COM^DDSCOM
 ;
 S DDSOSV=0
 F DDSI=0,1,2,4,7,10:1:14,20 D  ;MOVE FIELD DEFINITION INTO DDSO ARRAY
 . S:$D(^DIST(.404,DDSBK,40,DDO,DDSI))#2 DDSO(DDSI)=^(DDSI)
 K DDSI
 ;
 S DDSFLD=$G(DDSO(1)) K DDSO(1)
 I $P($G(DDSO(0)),U,3)=2 N DDP S DDP=0,DDSFLD=DDO_","_DDSBK
 ;
 I DDSFLD]"",DDSDA]"" M DDSU=@DDSREFT@("F"_DDP,DDSDA,DDSFLD) ;Restore field's specs & value from ^TMP
 ;
 I '$D(DDSREP)!DDSDA,$$UNED($G(DDSU("A")),$G(DDSO(4)),$G(DDSU("N"))) D  Q
 . I $D(DDSACT)#2 S DDACT=DDSACT K DDSACT
 . S:DDACT="U" DDACT="L"
 . S:DDACT="D" DDACT="R"
 . D CURSOR Q:$D(DDSBR)#2
 . S DDSCHKQ=1
 K DDSACT
 ;
 S (X,DDSOLD)=$G(DDSU("D")),DDSEXT=$G(DDSU("X"),X)
 ;
 X:$G(DDSO(11))'?."^" DDSO(11) ;PRE-ACTION
 I $D(DDSBR)#2 D BR^DDS2 Q:$D(DDSBR)#2
 I DDACT]"",$T(@DDACT)]"" D @DDACT S DDSCHKQ=1 Q
 ;
 S DIR0N=1 Q:DDSFLD=""
 ;
 S:$G(^DD(DDP,DDSFLD,0))'?."^" DDSU("DD")=^(0)
 I $D(DDSU("N"))[0 S DDACT="N" Q
 Q:$D(DDSO(2))[0
 ;
 D:$G(@DDSREFT@("HLP"))>0 HLP^DDSMSG()
 K DDSKM,DDQ
 ;
 S DIR0=$P(@DDSREFS@(DDSPG,DDSBK,DDO,"D"),U,1,3)
 S:$P(@DDSREFS@(DDSPG,DDSBK,DDO,"D"),U,10) $P(DIR0,U,6)=1
HITE S:$P($G(DDSREP),U,3)>1 $P(DIR0,U)=$P(DIR0,U)+($P(DDSREP,U,3)-1*$$HITE^DDSR(DDSBK)) ;DJW/GFT
 ;
 I $D(DDSREP),'DDSDA,$P(DDSO(0),U,3)'=2 K DDSU("DD") G SEL^DDSM
 I $D(DDSU("M"))#2 S DDSGL=U_$P(DDSU("M"),U,2) G:'DDSU("M") WP^DDSWP
 S DIR("B")=$G(DDSU("X"),DDSOLD)
 ;
 I $D(DDSU("M"))#2 D SEL^DDS5 G:X'=DDSOLD&(DDACT="N") EXT
 I $P($G(DDSO(0)),U,3)'=2 S DIR(0)=DDP_","_DDSFLD_"O" ;IT'S A FIELD-TYPE READ
 E  D DIR^DDSFO
 D ^DIR K DIR,DUOUT,DIRUT,DIROUT ;DO THE READ!
 I DIR0N S (X,Y)=DDSOLD Q
 ;
EXT I $E(X)=U!$D(DTOUT) S DIR0N=1 Q
 G EXT^DDS02
 ;
CHK Q:$D(DDSBR)#2
 I $G(DDSCHKQ)=1 K DDSCHKQ Q
 G:$D(DTOUT) TO^DDS3
 G:$E(X)=U UPA^DDS2
 I $G(DDSFLD)=.01,X="",$G(DA),DDSOLD]"" G ^DDS6 ;DELETE ENTRY
 ;
 I $P($G(DDSU("DD")),U,2)["I",$G(DDSOLD)]"" D  I %]"",X'=% S DDSNOED=1 ;UNEDITABLE FIELD ALREADY HAS A VALUE
 .N DIERR S %=$$GET1^DIQ(DDSFILE,DDSDA,DDSFLD)
 E  I $P($G(DDSU("DD")),U,5,99)["DINUM" S DDSNOED=1
 E  S DDSNOED=$S($P($G(DDSU("A")),U,4)="":$P($G(DDSO(4)),U,4),1:$P($G(DDSU("A")),U,4)) ;FIELD 6.4 ('DISABLE EDITING') IN THE FIELD MULTIPLE
 I $G(DDSFLD)]"",$G(DDSOLD)]"",X'=DDSOLD,DDSNOED S %=1 D  I %["," S DDSDA=% D POSDA^DDSM(DDSDA,DDSOLD) K DDSCHKQ Q
 .N F,L
 .I $P($G(DDSO(0)),U,3)=2 N DDP S DDP=0,F="" F  S F=$O(@DDSREFT@("F0",F)) Q:F=""  D  Q:%[","
 ..S L="" F  S L=$O(@DDSREFT@("F0",F,L)) Q:L=""  I +L=DDO,$P(L,",",2)=DDSBK,$P($G(@DDSREFT@("F0",F,L,"O")),X)="" S %=F Q  ;FIND A MATCHING FORM-ONLY VALUE
 .I %'["," S F="" F  S F=$O(@DDSREFT@("F"_DDP,F)) Q:F=""  D  Q:%[","
 ..I F'=DDSDA S L=$G(@DDSREFT@("F"_DDP,F,DDSFLD,"D")) I L]"",$P(L,X)="" S %=F   ;FIND A MATCHING FIELD VALUE
 .S @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D")=DDSOLD S:$D(DDSU("X"))#2 ^("X")=DDSU("X")
 .
 I 'DIR0N,$G(DDSFLD),$D(DDSU("M"))[0,$G(DDSCHKQ)'=2,DDSNOED D  K DDSNOED Q  ;User tried to change uneditable field (was UNED^DDS02)
 .S %=$P($G(DDSO(0)),U,2) I %="" S %=$P($G(DDSO(0)),U,5) ;GET CAPTION or UNIQUE NAME
 .D MSG^DDSMSG($$EZBLD^DIALOG(3090,%),1) ;'UNEDITABLE'
 .I $P($G(DDSO(0)),U,3)=2 N DDP S DDP=0
 .S @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D")=DDSOLD S:$D(DDSU("X"))#2 ^("X")=DDSU("X")
 ;
 K DDSCHKQ,DDSNOED
 ;
 I $G(DDSFLD)=.01,$G(DDSPTB)]"",$G(DDSREP)<2,'DIR0N D RPF^DDS7(DDP,DDSPTB,DDSDA,.DA)
 I $G(DDSO(12))'?."^" X DDSO(12) ;POST ACTION
 ;
 I 'DIR0N,DDO,$G(DDSFLD)]"" D
 . I $P($G(DDSO(0)),U,3)=2 N DDP S DDP=0
 . S DDSCHG=1
 . I DDSDA!'$D(DDSREP),+$G(DDSU("F"))'=1 S $P(@DDSREFT@("F"_DDP,DDSDA,DDSFLD,"F"),U)=1
 . I $G(DDSO(13))'?."^" X DDSO(13) ;POST ACTION ON CHANGE
 . D:$D(@DDSREFS@("PT",DDP,DDSFLD)) RPB^DDS7(DDP,DDSFLD,DDSPG)
 . D:$D(@DDSREFS@("COMP",DDP,DDSFLD,DDSPG)) RPCF^DDSCOMP(DDSPG)
 ;
 I $D(DDSBR)#2 D BR^DDS2 Q:$D(DDSBR)#2
 Q:DDACT=""  I $T(@DDACT)]"" G @DDACT
 I 'DDO G:X]"" ^DDS3 S DDSO(0)=0
 I DDACT="D",$D(DDSREP),'DA S DDACT="N" ;GFT  DON'T DOWN-ARROW THRU A MULTIPLE THAT HAS NO .01 FIELD DEFINED
 G:"^U^D^R^L^"[(U_DDACT_U) CURSOR
 G:$D(DDSU("M"))[0 NF
 G:DDSU("M") ^DDS5
 D EDIT^DDSWP I '$D(DDGLCLR) S DDACT="Q" Q
 D R^DDSR
 ;
NF I 'DDO,DDSOSV S DDO=DDSOSV Q
 ;
 I DDO,$S($D(DDSREP):DDSDA,1:1) D
 . D:'$D(DDSU("M"))
 .. I $G(@DDSREFS@("ASUB",DDSPG,DDSBK,DDO))]"" S DDSSTACK="`"_^(DDO) ;ANOTHER PAGE HAS THIS FIELD AS ITS PARENT FIELD!
 .. E  I $P($G(DDSO(7)),U,2)]"" S DDSSTACK=$P(DDSO(7),U,2) ;OR THERE IS A SUBPAGE LINK FROM THIS FIELD
 . X:$G(DDSO(10))'?."^" DDSO(10) ;BRANCHING LOGIC
 ;
 I $D(DDSSTACK) D:$G(^DIST(.403,+DDS,21400)) REFRESH^DDS02(DDSSTACK) D ^DDSSTK,R^DDS3 K DDSU ;WE DO A WHOLE RECURSION TO THE SUBPAGE, AND THEN REPAINT THIS PAGE
 I $D(DDSBR)#2 D BR^DDS2 Q:$D(DDSBR)#2
 S DDACT="N"
 ;
CURSOR N ACT,B,BLK,BLK0,FND,N,REP
 K DDSACT
 S:$D(DDSU("N"))[0 DDSU("N")=$G(@DDSREFS@(DDSPG,DDSBK,DDO,"N"))
 S FND=0
 I $D(DDSREP),DDO D MNAV^DDSM(.FND) Q:FND
 ;
 S B=U,(BLK,BLK0)=DDSBK,N=DDSU("N"),ACT=$S(DDO&$G(DDSDN):"N",1:DDACT)
 F  D  Q:FND!$D(REP)
 . S DDO=$P(N,U,$L($P("U^D^R^L^N",ACT),U))
 . I 'DDO S (DDO,DDSBK)=0,FND=1 Q
 . ;
 . S DDSBK=$P(DDO,",",2),DDO=+DDO
 . I DDSBK D  Q:$D(REP)
 .. I $P($G(@DDSREFS@(DDSPG,DDSBK)),U,4) D
 ... S DDO=$P($G(@DDSREFS@(DDSPG,DDSBK)),U,9),ACT="N"
 .. E  S ACT=DDACT
 .. I '$P($G(@DDSREFT@(DDSPG,DDSBK)),U),DDSDAORG S B=B_DDSBK_U
 .. E  I $P(@DDSREFS@(DDSPG,DDSBK),U,7)>1 S REP=1,DDACT="NB",DDSBR=""
 . E  S DDSBK=BLK
 . ;
 . I B'[(U_DDSBK_U) S FND=1 S:DDSBK'=BLK0 DDACT="NB",DDSBR="",DDSACT=ACT
 . ;
 . S:'FND N=$G(@DDSREFS@(DDSPG,DDSBK,+DDO,"N")),BLK=DDSBK
 Q
 ;
NP ;;
 G:$D(DDSREP)&DDO PGDN^DDSM ;If in REPEATING BLOCK
 S:DDSNP]"" DDSPG=DDSNP
 S:DDSNP="" DDACT="N"
 Q
PP ;;
 G:$D(DDSREP)&DDO PGUP^DDSM ;If in REPEATING BLOCK
 S DDSPG=$$PP^DDS5(.Y)
 S DDACT=$S(Y=1:"NP",1:"N")
 Q
NB ;;
 S DDSBK=$$NB^DDS5(.Y),DDACT=$S(Y=1:"NB",1:"N")
 Q
SEL ;;
 ;I $G(DDSSEL) W $C(7) Q
 S DDACT="N" G PG^DDSRSEL
SV ;;
 G SV^DDS02
QT ;;
 G QT^DDS3
EX ;;
 G EX^DDS3
CL ;;
 G CL^DDS3
MOUSE ;;
 G MOUSE^DDS2
PRNT ;;
 D EN^DDSRP(+DDS,DDSPG)
RF ;;
 S DDACT="N" I $G(^DIST(.403,+DDS,21400)) D REFRESH^DDS02(DDSPG) ;RE-DO THE DATA BEFORE REFRESHING PAGE
 G R^DDSR
 ;
 ;
UNED(ATT,DEF,N) ;
 Q $S(N="":1,$P(ATT,U,4)="":$P(DEF,U,4)=1,1:$P(ATT,U,4)=1)&'$P(N,U,11)

DDS02
DDS02 ;SFISC/MKO-OVERFLOW FROM ^DDS01 ;29MAR2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
REFRESH(DDSPG) ;Refreshes the setup for page
 N B,D,I,DIE,DDSDA,DDP
 F B=0:0 S B=$O(@DDSREFT@(DDSPG,B)) Q:'B  D
 .I '$D(DDSDA) S DDSDA=^(B),DIE=^(B,DDSDA,"GL"),DDP=$P(@DDSREFS@(DDSPG,B),U,3) ;GET THE ORIGINAL PAGE DATA
 .S D="" F  S D=$O(@DDSREFT@(DDSPG,B,D)) Q:D=""  I +$G(^(D))=1 S $P(^(D),U)=0 ;REMEMBER TO RELOAD BLOCKS ON THIS PAGE!
 .S I="" F  S I=$O(@DDSREFT@("F0",I)) Q:I=""  F  S D=$O(@DDSREFT@("F0",I,D)) Q:D=""  I $P(D,",",2)=B,$G(^(D,"F"))=3 K @DDSREFT@("F0",I,D) ;KILL OLD FORM-ONLY VALUE
 I $D(D) D ^DDS1(DDSPG)
 Q
 ;
 ;
 ;
SV ;Save
 S DDACT="N"
 I $G(DDSDN)=1,DDO D ERR3^DDS3 Q
 I DDSSC'>1,'$P(DDSSC(DDSSC),U,4) D S^DDS3 Q  ;INCLUDED '$G(DDSSEL)
 D MSG^DDSMSG($$EZBLD^DIALOG(3093),1) ;**CANNOT SAVE
 Q
 ;
EXT ;Process external form
 I '$P($G(DDSU("DD")),U,2),$P($G(DDSU("DD")),U,2)["P" D PT
 I $P($G(DDSO(0)),U,3)=2,$E($P($G(DDSO(20)),U))="P" D PTFO
 ;
 S:DDSOLD=Y DIR0N=1
 S DDSX=X,DDSY=Y
 I Y]"",$P($G(DDSU("DD")),U,2)["O",$G(^DD(DDP,DDSFLD,2))'?."^" K Y(0) X ^(2) S Y(0)=Y
 ;
 S DDSEXT=$G(Y(0,0),$G(Y(0),Y)),X=DDSY
 ;
 I $D(DDSO(14)) K DDSERROR X DDSO(14) I $D(DDSERROR)#2 D  Q
 . K DDSERROR,DDSY S DIR0("L")=DDSEXT,DDSCHKQ=1
 ;
 I DDSY="",DDSFLD'=.01 D  Q:'$D(DDSY)
 . N DDSREQ,DDSKEY
 . S DDSREQ=$P($G(DDSU("A")),U)
 . S:DDSREQ="" DDSREQ=$P($G(DDSO(4)),U)
 . S:DDSREQ="" DDSREQ=$P($G(DDSU("DD")),U,2)["R"
 . S DDSKEY=$D(^DD("KEY","F",DDP,DDSFLD))>0
 . I 'DDSREQ,'DDSKEY Q
 . K DDSY
 . S DDSCHKQ=1,DIR0("L")=DDSEXT
 . D MSG^DDSMSG($$EZBLD^DIALOG($S(DDSKEY:3092.2,1:3092.1)),1) ;'REQUIRED KEY FIELD'
 ;
 S DY=$P(DIR0,U),DX=$P(DIR0,U,2)
REPNT I DDSEXT'=DDSX!$G(DDSREPNT) D  K DDSREPNT ;WRITE OUT NEW VALUE, IF IT DIFFERS FROM WHAT WAS INPUT
 . X IOXY
 . S DDSX=$E(DDSEXT,1,$P(DIR0,U,3))
 . I '$P(DIR0,U,6) S DDSX=DDSX_$J("",$P(DIR0,U,3)-$L(DDSEXT))
 . E  S DDSX=$J("",$P(DIR0,U,3)-$L(DDSEXT))_DDSX
 . W $P(DDGLVID,DDGLDEL)_DDSX_$P(DDGLVID,DDGLDEL,10)
 ;
CHECKEY I $G(DDSU("K")),DDSY]""!(DDSFLD'=.01) D  Q:'$D(DDSY)  ;CHECK KEY
 . N DDSFXR,DDSUI,DDSUNIQ,DDSVSV,DIIENS
 . D LOADXREF^DIKC1(DDP,"","",DDSU("K"),$NA(@DDSREFT@("F"))_"_","DDSFXR")
 . S:$D(@DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D"))#2 DDSVSV=^("D") S ^("D")=DDSY
 . S DDSUNIQ=1,DDSUI=0
 . F  S DDSUI=$O(DDSFXR(DDP,DDSUI)) Q:'DDSUI  D  Q:'DDSUNIQ
 .. S DIIENS=DDSDA
 .. D SETXARR^DIKC(DDP,DDSUI,"DDSFXR","","D")
 .. S DDSUNIQ=$$UNIQUE^DIKK2(DDP,DDSUI,.X,.DA,"DDSFXR")
 . I 'DDSUNIQ D
 .. K DDSY
 .. S DDSCHKQ=1,DIR0("L")=DDSEXT
 .. D MSG^DDSMSG($$EZBLD^DIALOG(3094),1) ;"Another Entry already exists with this KEY value."
 .. K @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D") S:$D(DDSVSV)#2 ^("D")=DDSVSV
 ;
 D:$G(DDSDA)!'$D(DDSREP)
 . S:$D(Y(0)) @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"X")=DDSEXT
 . S @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D")=DDSY I DDSY="",$D(DDSU("X")) S ^("X")="" ;CHANGE THE DATA!
 K DDSY
 Q
 ;
DEC(FILE,FIELD,DEC) ;NOT USED (??)
 S DEC="S X=$G(@DDSREFT@(""F"_FILE_""",DIIENS,"_FIELD_",""D""),"_$E(DEC,5,999)_")"
 Q
 ;
PT ;Modify Y for pointer type fields
 I $P(Y,U,3)=1 D
 . S ^("ADD")=$G(@DDSREFT@("ADD"))+1,^("ADD",^("ADD"))=+Y_","_U_$P(DDSU("DD"),U,3)
 S Y=$P(Y,U)
 Q
 ;
PTFO ;Modify Y for pointer type form only fields
 I $P(Y,U,3)=1 D
 . N R,I S R=""
 . F I=1:1 Q:$D(DA(I))[0  S R=R_DA(I)_","
 . S ^("ADD")=$G(@DDSREFT@("ADD"))+1,@DDSREFT@("ADD",@DDSREFT@("ADD"))=+Y_","_R_$S($P(DDSO(20),U,3):^DIC(+$P(DDSO(20),U,3),0,"GL"),1:U_$P($P(DDSO(20),U,3),":"))
 S Y=$S(Y=-1:"",1:$P(Y,U))
 Q

DDS1
DDS1(DDSPG) ;SFISC/MKO-LOAD PAGE ;31MAY2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Input:
 ;  DDS     = Form number^Form name
 ;  DDSPG   = Internal page number
 ;  DA      = Record array
 ;  DDSREFT = Global location where data (temporarily) is stored
 ;  DDP     = Primary file number of form
 ;  DIE     = Global root of form
 ;  DDSDA   = DA,DA(1),... of form
 ;  DDSDL   = Level number
 ;Also needed for pointed-to blocks:
 ;  DDSDAORG
 ;  DDSDLORG
 ;Returns:
 ;  DIERR
 ;
 N DDS1B,DDS1BO K DDSMOUSE S U="^"
 ;
 ;Get header block
 S DDS1B=$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U,2)
 I DDS1B]"" D BLK(DDSPG,DDS1B,"",1) G:$G(DIERR) END
 ;
 ;Get all other blocks on page
 S DDS1BO="" F  S DDS1BO=$O(^DIST(.403,+DDS,40,DDSPG,40,"AC",DDS1BO)) Q:DDS1BO=""  S DDS1B=$O(^(DDS1BO,0)) Q:'DDS1B  D BLK(DDSPG,DDS1B,DDS1BO) G:$G(DIERR) END
 ;
END K DDSMOUSE
 Q
 ;
BLK(DDSPG,DDS1B,DDS1BO,DDS1H,DDS1E) ;Load block
 ;In:  DDS1H  = 1 if a header block
 ;     DDS1E  = 1 if we're loading up a pointed-to block and
 ;              we want interactive dialog (DIC(0)["E") in the lookup
 ;
 I $D(^DIST(.404,DDS1B,0))[0 D BLD^DIALOG(3051,"#"_DDS1B) Q
 ;
 N DDS1PTB,DDS1REP S DDS1PTB=""
 I '$G(DDS1H) D
 . S DDS1PTB=$G(^DIST(.403,+DDS,40,DDSPG,40,DDS1B,1)),DDS1REP=$G(^(2))
 . K:DDS1REP<2 DDS1REP
 ;
 I DDS1PTB]"" N @$$D0(DDSDL),DA,DDP,DIE,DDSDL,DDSDA D  Q:$G(DIERR)
 . I $G(DDS1REP)>1 D
 .. D BK^DDS10(.DDS1B,.DDP) Q:$G(DIERR)
 .. D GDA^DDS10(DDS1B,$G(DDS1E),.DA) Q:$G(DIERR)
 .. S DDP=$G(^DD(DDP,0,"UP"),DDP) ;GFT
 .. D GL^DDS10(DDP,.DA,.DIE,.DDSDL,.DDSDA,1)
 .. D GETD0(.DA,DDSDL)
 . E  D
 .. D SET^DDS10(DDS1B,$G(DDS1E),.DA,.DDP,.DIE,.DDSDL,.DDSDA) ;GO GET THE NEW 'DA' VALUE
 .. I +$G(DIERR)=1,$G(^TMP("DIERR",$J,1))=601 D  Q
 ... L -@(DIE_DA_")")
 ... K ^TMP("DDS",$J,"LOCK",DIE_DA_")")
 ... D CLEAN^DILF
 ... S (DA,D0,DDSDA)=""
 .. Q:$G(DIERR)
 .. I DA="",'$G(DDS1E),$P($G(@DDSREFT@(DDSPG,DDS1B)),U)]"" S DDSDA=$P(^(DDS1B),U),DA=+DDSDA
 .. S D0=DA
 ;
 I $G(DA)!'$G(DDSDAORG),$G(@DDSREFT@(DDSPG,DDS1B,DDSDA))<1 D
 . S $P(@DDSREFT@(DDSPG,DDS1B,DDSDA),U)=1
 . I $G(DDS1REP)>1 D REP Q
 . ;
 . S @DDSREFT@(DDSPG,DDS1B,DDSDA,"GL")=DIE
 . D ^DDS11(DDS1B)
 ;
 S $P(@DDSREFT@(DDSPG,DDS1B),U)=$G(DDSDA)
 Q
 ;
REP ;Load data for repeating block
 N DDS1DDP,DDS1IND,DDS1INI,DDS1MUL,DDS1PDA,DDS1REF,DDS1RT,DDS1SEL
 N DDS1SN,DDS1VAL,DDS1FSCR,DDS1SCNT,DDS1STRT,DDS1Q,DDS1ACT
 S DDS1REF=$NA(@DDSREFT@(DDSPG,DDS1B))
 S DDS1DDP=$P(@DDSREFS@(DDSPG,DDS1B),U,3)
 S DDS1IND=$P(DDS1REP,U,2) S:DDS1IND="" DDS1IND="B"
 S DDS1INI=$P(DDS1REP,U,3)
 S DDS1SEL=$P(@DDSREFS@(DDSPG,DDS1B),U,10)
 S DDS1PDA=DDSDA
 ;
 S DDS1MUL=$O(^DD(+DDP,"SB",DDS1DDP,""))
 S:$G(^DD(DDS1DDP,0,"SCR"))]"" DDS1FSCR=^("SCR")
ACT S:$G(^("ACT"))]"" DDS1ACT=^("ACT")
 ;
 S $P(@DDS1REF@(DDS1PDA),U,7,10)=DDP_U_DDS1MUL_U_DDS1SEL_U_DDS1IND
 S @DDS1REF@(DDSDA,"GL")=$S(DDS1MUL:DIE_+DA_","""_$P($P(^DD(DDP,DDS1MUL,0),U,4),";")_""",",1:^DIC(DDS1DDP,0,"GL"))
 ;
 N DIE,DDP
 S DIE=@DDS1REF@(DDSDA,"GL"),DDS1RT=$$CREF^DILF(DIE),DDP=DDS1DDP
 S DDS1SN=0
 ;
 I DDS1MUL D  ;IT'S A MULTIPLE FIELD WITHIN TOP-LEVEL FILE
 . D DDA^DDS5(0,.DA,.DDSDL)
 . S DDSDA=","_DDSDA
 . S:'$D(@DDS1RT@(DDS1IND)) DDS1IND="!IEN"
 . I DDS1IND="!IEN" D
 .. S DA=0 F  S DA=$O(@DDS1RT@(DA)) Q:'DA  D REPLD
 . E  D
 .. S (DDS1Q,DDS1STRT)=$NA(@DDS1RT@(DDS1IND)),DDS1SCNT=$QL(DDS1Q)
 .. F  S DDS1Q=$Q(@DDS1Q) Q:DDS1Q=""  Q:$NA(@DDS1Q,DDS1SCNT)'=DDS1STRT  D
 ... S DA=$QS(DDS1Q,$QL(DDS1Q)) D REPLD
 ;
GFT E  I $G(^DIST(.403,+DDS,40,DDSPG,40,DDS1B,"COMP MUL"))]"" D  S DDSDA=DDS1PDA,DA=+DDSDA,@DDS1REF@("COMP MUL")=$G(^DIST(.403,+DDS,40,DDSPG,40,DDS1B,"COMP MUL PTR")) ;COMPUTED MULTIPLE BUILDS A REPEATING BLOCK
 .N DICMX,D
 .I $G(^("COMP MUL PTR"))="" S DICMX="S DA=$G(D0,$G(D)) N D D NOFILE^DDS1"
 .E  S DICMX="S DA=$G(D0,$G(D)) N D D REPLD^DDS1"
 .X ^("COMP MUL")
 ;
 E  I $G(DA) S DDS1VAL=DA N D0,DA,DDSDA D  ;IT'S A RELATIONAL JUMP  (DA COULD BE UNDEFINED FOR AN UNRELATED FILE!)
 . S DDSDA=","
 . S (DDS1Q,DDS1STRT)=$NA(@DDS1RT@(DDS1IND,DDS1VAL)),DDS1SCNT=$QL(DDS1Q)
 . F  S DDS1Q=$Q(@DDS1Q) Q:DDS1Q=""  Q:$NA(@DDS1Q,DDS1SCNT)'=DDS1STRT  D
 .. S DA=$QS(DDS1Q,$QL(DDS1Q)) D REPLD
 ;
 E  S DIERR=1 Q
 ;Now set INITIAL POSITION
DISV I DDS1INI="u" S DDS1INI="l" I $G(DUZ)]"",$G(DIE)]"" D  I DDS1INI
 .N T
 .S T=$G(^DISV(DUZ,DIE)) Q:'T  S T=$G(@DDS1REF@(DDS1PDA,"B",T_",")) Q:'T  ;Get entry that SPACE-BAR would return
 .S DDS1SN=T,T=T-DDS1REP+1
 .I T>0 S DDS1INI=T_U_(DDS1SN-T+1)_U_DDS1SN Q
 .S DDS1INI=1_U_DDS1SN_U_DDS1SN
 E  I DDS1INI="l"!(DDS1INI="n") D
 . N N,T
 . S N=DDS1INI="n"
F . S DDS1SN=$O(@DDS1REF@(DDS1PDA," "),-1)+N S:'DDS1SN DDS1SN=1 ;Don't want 1^0^0
 . S T=DDS1SN-DDS1REP+2-N
 . S DDS1INI=$S(T<1:1_U_DDS1SN,1:T_U_(DDS1REP-'N))_U_DDS1SN
 E  S DDS1INI="1^1^1"
 ;
 S $P(@DDS1REF@(DDS1PDA),U,2,6)=DDS1PDA_U_DDS1INI_U_+DDS1REP
 ;
 I DDS1MUL D
 . D UDA^DDS5(.DA,.DDSDL)
 . S DDSDA=$P(DDSDA,",",2,999)
 Q
 ;
REPLD ;Load data
 Q:'$D(@DDS1RT@(DA,0))  I $D(DDS1FSCR) N Y S Y=DA X DDS1FSCR Q:'$T
 I $D(DDS1ACT) D
 .N DIC,Y
 .S DIC(0)="E",Y=DA_U_$P(@DDS1RT@(DA,0),U)
 .X DDS1ACT ;HERE IS WHERE ACCESS AUDITING WOULD TAKE PLACE IF IT IS SET UP IN POST-ACTION!
NOFILE S DDS1SN=DDS1SN+1,$P(DDSDA,",")=DA,@("D"_DDSDL)=DA
 S @DDS1REF@(DDS1PDA,DDS1SN)=DDSDA
 S @DDS1REF@(DDS1PDA,"B",DDSDA)=DDS1SN
 D ^DDS11(DDS1B)
 Q
 ;
D0(DL) ;Given DL, return string D0,D1,...,Dn
 N I,S
 S S="" F I=0:1:DL S S=S_"D"_I_","
 S:S?.E1"," S=$E(S,1,$L(S)-1)
 Q S
 ;
GETD0(DA,DL) ;Given DA array, set D0,D1...
 N I
 S @("D"_DL)=DA
 F I=1:1:DL-1 S @("D"_(DL-I))=DA(I)
 Q

DDS10
DDS10 ;SFISC/MKO-BLOCK SETUP ;21SEP2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
SET(DDS1B,DDS1E,DA,DDP,DIE,DL,DDSDA) ;Get values for pointed-to block
 ;In:
 ;  DDS1B   = Block number or [Block name] (by ref)
 ;  DDS1E   = 1, if we're loading a pointed-to block and we want
 ;               interactive dialog (DIC(0)["E") in the lookup
 ;  DA      = Record array
 ;Returns:
 ;  DDS1B = Block number
 ;  DDP   = File number of block
 ;  DIE   = Global root based on DDP and DA
 ;  DL    = Level number (top=0)
 ;  DDSDA = DA,DA(1),...,
 ;
 D BK(.DDS1B,.DDP) Q:$G(DIERR)
 D GDA(DDS1B,DDS1E,.DA) Q:$G(DIERR)
 D GL(DDP,.DA,.DIE,.DL,.DDSDA,$P($G(^DIST(.403,+DDS,40,+$G(DDSPG),40,DDS1B,0)),U,4)'="d") Q:$G(DIERR)  ;Don't LOCK record if block is display-only
 Q
 ;
BK(DDSBK,DDP) ;Lookup block, get file number
 ;Input:
 ;  DDSBK = Block number or [Block name] (by ref)
 ;Returns:
 ;  DDSBK = Block number
 ;  DDP   = File number
 ;  DIERR
 ;
 I DDSBK=+$P(DDSBK,"E")  D  Q
 . I $D(^DIST(.404,DDSBK,0))[0 D BLD^DIALOG(3051,"#"_DDSBK) Q
 . S DDP=+$P(^DIST(.404,DDSBK,0),U,2)
 I DDSBK?1"["1.E1"]" D  Q
 . N X,Y,DIC
 . S X=$E(DDSBK,2,$L(DDSBK)-1),DIC="^DIST(.404,",DIC(0)="FZ"
 . D ^DIC I Y<0 D BLD^DIALOG(3051,"named "_X) Q
 . S DDSBK=+Y,DDP=+$P(Y(0),U,2)
 D BLD^DIALOG(3051,"#"_DDSBK)
 Q
 ;
GDA(DDS1B,DDS1E,DA) ;Find new DA
 ;Input:
 ;  DDS1B    = Block number
 ;  DDS1E    = 1:Interactive lookup
 ;  DDSDAORG = Original DA array
 ;  DDSDLORG = Original DL
 ;  DDSPG
 ;Returns:
 ;  DA      = Record number
 ;  DIERR
 ;
 N DDSDA,DDSI,X
 ;
 ;Set DA array to its original value
 S DA=DDSDAORG
 F DDSI=1:1:DDSDLORG S DA(DDSI)=DDSDAORG(DDSI)
 D DDSDA(.DA,DDSDLORG,.DDSDA)
 ;
 ;Xecute each PTB node
 F DDSI=1:1 Q:DA=""!'$D(@DDSREFS@(DDSPG,DDS1B,"PTB",DDSI))  X ^(DDSI) S:$G(X)'>0 DA=""
 ;
 ;Kill descendants of DA
 I '$G(DIERR) S DDSI=DA K DA S DA=DDSI
 S:DA'>0!$G(DIERR) DA=""
 Q
 ;
GL(F,DA,DIE,DL,DDSDA,DDSL) ;Get global root, level, and IEN
 ;Input variables:
 ;  F    = file #
 ;  DA   = array
 ;  DDSL = flag to lock record
 ;Returns:
 ;  DIE   = global root of file (null if error)
 ;  DL    = level (top=0) (null if error)
 ;  DDSDA = IEN
 ;  DIERR = Error flag
 ;
 I '$D(^DD(F)) D BLD^DIALOG(401,F) S (DIE,DL)="" Q
 I $D(^DIC(F,0,"GL"))#2 S DIE=^("GL"),DL=0
 E  D SUBGL Q:$G(DIERR)
 ;
 I '$G(DA) S DDSDA="0," Q
 D DDSDA(.DA,DL,.DDSDA)
 ;
 N DDSP S DDSP("FILE")=F,DDSP("IEN")=DDSDA
 ;
 I $D(@(DIE_DA_",0)"))[0 D BLD^DIALOG(601,"",.DDSP)
 I $D(@(DIE_DA_",-9)")) D BLD^DIALOG(602,"",.DDSP)
 ;
 I $G(DDSL),$D(^TMP("DDS",$J,"LOCK",DIE_DA_")"))[0 D  Q:$G(DIERR)
 . D LOCK^DILF(DIE_DA_")") E  D BLD^DIALOG(110,"",.DDSP) Q  ;**147
 . S ^TMP("DDS",$J,"LOCK",DIE_DA_")")=""
 Q
 ;
SUBGL ;Get root and level for subfile
 N D,I,S,U1
 S D=F
 F DL=0:1 Q:$D(^DD(D,0,"UP"))[0  S U1=^("UP") G:'$D(^DD(U1,"SB",D)) SUBER G:$D(^DD(U1,$O(^(D,"")),0))[0 SUBER S S(DL+1)=""""_$P($P(^(0),U,4),";")_"""",D=U1
 G:$D(^DIC(D,0,"GL"))[0 SUBER S DIE=^("GL")
 F I=DL:-1:1 G:$D(DA(I))[0 SUBER S DIE=DIE_DA(I)_","_S(I)_","
 Q
 ;
SUBER ;Come here if an error is encountered in GL
 S (DIE,DL)=""
 D BLD^DIALOG(309)
 Q
 ;
DDSDA(DA,DL,DDSDA) ;Determine DDSDA
 ;Input:
 ;  DA    = Record array
 ;  DL    = Level number (top=0)
 ;Output:
 ;  DDSDA = DA,DA(1),...,
 ;
 N I
 I DA="" S DDSDA="" Q
 S DDSDA=DA_"," F I=1:1:DL S DDSDA=DDSDA_DA(I)_","
 Q

DDS11
DDS11(DDSBK,DDSNFO) ;SFISC/MLH,MKO-LOAD DATA ;4JUNE2007; LOAD DATA TO BE SHOWN ON SCREEN
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Input variables:
 ;  DDSBK   = Block #
 ;  DDSPG   = Page # (needed for form-only fields)
 ;  DDSREFT = Temporary global location
 ;  DDP     = File number of block
 ;  DIE     = Global root of block
 ;  DDSDA   = DA,DA(1),...
 ;  DDSNFO  = Flag means don't reload form only fields
 ;
 N X,Y
 S DDS1REFD=$NA(@DDSREFT@("F"_DDP,DDSDA))
 ;
 S DDS1FO=0
 F  S DDS1FO=$O(^DIST(.404,DDSBK,40,DDS1FO)) Q:'DDS1FO  D LD
 ;
 I DDP,DDSDA S @DDS1REFD@("GL")=DIE
 ;
 K DDS1REFD,DDS1FLD,DDS1FO,DDS1KEY,DDS1LN,DDS1ND,DDS1PC,DDS1UI,DDS1DV
 K DDS1D1,DDS1D2,DDS1D3
 Q
 ;
LD ;Load data for a field
 ;
 ;Get form only fields
 I $P($G(^DIST(.404,DDSBK,40,DDS1FO,0)),U,3)=2,$P($G(^(20)),U)]"" D  Q
 . Q:$G(DDSNFO)
 . N DDP
 . S DDP=0,DDS1FLD=DDS1FO_","_DDSBK
 . Q:"^1^3^"[(U_$G(@DDSREFT@("F0",DDSDA,DDS1FLD,"F"))_U)
 . S Y=""
 . I $D(@DDSREFT@("F0",DDSDA,DDS1FLD,"F"))[0,$G(^DIST(.404,DDSBK,40,DDS1FO,3))]"" D DEF(^(3),$G(^(3.1)))
 . S (@DDSREFT@("F0",DDSDA,DDS1FLD,"D"),^("O"))=Y
 ;
 ;Get DD fields
 S DDS1FLD=$G(^DIST(.404,DDSBK,40,DDS1FO,1)) Q:DDS1FLD?."^"
 Q:"^1^3^"[(U_$G(@DDS1REFD@(DDS1FLD,"F"))_U)
 ;
 S DDS1LN=$G(^DD(DDP,DDS1FLD,0)) Q:DDS1LN?."^"
 S DDS1PC=$P(DDS1LN,U,4),DDS1ND=$P(DDS1PC,";"),DDS1PC=$P(DDS1PC,";",2)
 S DDS1DV=$P(DDS1LN,U,2),X=$P(DDS1LN,U,3)
 ;
 D @($S(DDS1FLD=.001:"L3",DDS1PC=0:"L2",1:"L1"))
 ;
 I DDS1DV["O"!(DDS1DV["P")!(DDS1DV["V")!(DDS1DV["D")!(DDS1DV["S") D
 . Q:$D(@DDS1REFD@(DDS1FLD,"X"))
 . D:Y]"" XFORM
 . S @DDS1REFD@(DDS1FLD,"X")=Y
 ;
 I DDS1PC=0,DDS1DV,DDS1DV'["W",$D(@DDS1REFD@(DDS1FLD,"X"))[0 S ^("X")=Y
 Q
 ;
L1 ;Get non-multiple field
 S DDS1LN=$G(@(DIE_"DA,DDS1ND)"))
 I $E(DDS1PC)'="E" S Y=$P(DDS1LN,U,DDS1PC)
 E  S Y=$E(DDS1LN,+$E(DDS1PC,2,999),$P(DDS1PC,",",2)) S:Y?." " Y=""
 ;
 K @DDS1REFD@(DDS1FLD,"X")
 I Y="",$D(@DDS1REFD@(DDS1FLD,"F"))[0,$D(^DIST(.404,DDSBK,40,DDS1FO,3))#2 D DEF(^(3),$G(^(3.1)))
MUMPS I $G(DUZ(0))'="@",DDS1DV["K" S $P(@DDS1REFD@(DDS1FLD,"A"),U,4)=1,Y=$TR($J("",$L(Y))," ","*") ;**151
 S @DDS1REFD@(DDS1FLD,"D")=Y
 ;
 ;Get key info
 I '$D(@DDS1REFD@(DDS1FLD,"K")) D
 . S DDS1KEY=0
 . F  S DDS1KEY=$O(^DD("KEY","F",DDP,DDS1FLD,DDS1KEY)) Q:'DDS1KEY  D
 .. S DDS1UI=$P(^DD("KEY",DDS1KEY,0),U,4) Q:'DDS1UI
 .. Q:$P($G(^DD("IX",DDS1UI,0)),U,6)'="F"
 .. S ^("K")=$G(@DDS1REFD@(DDS1FLD,"K"))_DDS1UI_U
 Q
 ;
L2 ;Get multiple field
 S DDS1SUB=+$P(DDS1LN,U,2) Q:$D(^DD(DDS1SUB,.01,0))[0
 S DDS1DV=DDS1SUB_$P(^DD(DDS1SUB,.01,0),U,2),X=$P(^(0),U,3)
 S DDS1DIC=DIE_DA_","""_DDS1ND_""","
 ;
 D:DDS1DV'["W"
 . I $D(^DIST(.404,DDSBK,40,DDS1FO,3))#2 D  D L22
 .. D DEF(^DIST(.404,DDSBK,40,DDS1FO,3),$G(^(3.1)),1)
 .. S DDS1RN=$S($G(Y)="FIRST":$O(@(DDS1DIC_"0)")),$G(Y)="LAST":$O(@(DDS1DIC_""" "")"),-1),1:+$G(Y))
 . E  I $D(DUZ)#2,$L(DDS1DIC)<29,$D(^DISV(DUZ,DDS1DIC))#2 S DDS1RN=^(DDS1DIC) D L22
 . E  S DDS1RN=$S($D(@(DDS1DIC_"0)"))#2:$P(^(0),U,3),1:$O(^(0))) D L22
 . E  S (Y,@DDS1REFD@(DDS1FLD,"D"))=""
 ;
 S @DDS1REFD@(DDS1FLD,"M")=$S(DDS1DV["W":0,1:1)_DDS1DIC_U_DDS1SUB
 K DDS1DIC,DDS1RN,DDS1SUB
 Q
L22 ;
 I DDS1RN>0,$D(@(DDS1DIC_+DDS1RN_",0)"))#2 S Y=$P(^(0),U),@DDS1REFD@(DDS1FLD,"D")=+DDS1RN
 Q
 ;
DEF(DDS1LN3,DDS1LN31,DDS1MULT) ;Get default
 N DDS1PTR,DDS1OT
 Q:DDS1LN3=""
 I DDS1LN3'="!M" S Y=DDS1LN3
 E  I DDS1LN31'?."^" X DDS1LN31 S:$D(Y)[0 Y=""
 Q:Y=""!$G(DDS1MULT)
 ;
 K DIR
 I DDS1FLD["," D
 . S DIR(0)=$P(^DIST(.404,DDSBK,40,DDS1FO,20),U)_$P(^(20),U,2,3)
 . S:DIR(0)?1"DD".E DIR(0)=$P(DIR(0),U,2,999)
 . I $E($P(DIR(0),U))="P" S DDS1PTR=1
 E  D
 . S DIR(0)=DDP_","_DDS1FLD
 . S DDS1PTR=$P($G(^DD(DDP,DDS1FLD,0)),U,2)
 . S DDS1OT=DDS1PTR["O",DDS1PTR=DDS1PTR["P"
 S DIR("V")="",(X,DIR("B"))=Y
 D ^DIR
 ;
 I DDER S Y=""
 I Y]"" D
 . I $G(DDS1PTR) S Y=$P(Y,U)
 . S $P(@DDSREFT@("F"_DDP,DDSDA,DDS1FLD,"F"),U)=3
 . I $G(DDS1PTR),$G(DDS1OT),$D(^DD(DDP,DDS1FLD,2))#2 K Y(0),Y(0,0)
 . S:$D(Y(0)) @DDSREFT@("F"_DDP,DDSDA,DDS1FLD,"X")=$S($D(Y(0,0))#2:Y(0,0),1:Y(0))
 . S DDSCHG=1
 K DDER,DIR
 Q
 ;
L3 ;Get number field
 S (@DDS1REFD@(.001,"D"),Y)=DA
 Q
 ;
EXT(DDP,DDS1FLD,Y) ;Return external form of Y
 N DDS1DV,X
 S DDS1DV=$P(^DD(DDP,DDS1FLD,0),U,2),X=$P(^(0),U,3)
 I DDS1DV'["O",DDS1DV'["P",DDS1DV'["V",DDS1DV'["D",DDS1DV'["S" Q Y
 I DDS1DV'["O",Y="" Q ""
 D XFORM
 Q Y
 ;
XFORM ;
 N DDS1N
 I DDS1DV["O",+DDS1FLD,$D(^DD(DDP,+DDS1FLD,2))#2 X ^(2) Q
 I DDS1DV["P",@("$D(^"_X_"0))") S X=+$P(^(0),U,2) Q:'$D(^(Y,0))  S Y=$P(^(0),U),X=$P(^DD(X,.01,0),U,3),DDS1DV=$P(^(0),U,2) G XFORM
 I DDS1DV["V",+$P(Y,"E"),$P(Y,";",2)["(",$D(@(U_$P(Y,";",2)_"0)"))#2 S X=+$P($P(^(0),U,2),"E") Q:$D(^(+$P(Y,"E"),0))[0  S Y=$P(^(0),U) I $D(^DD(+$P(X,"E"),.01,0))#2 S DDS1DV=$P(^(0),U,2),X=$P(^(0),U,3) G XFORM
 I DDS1DV["D" X ^DD("DD")
 I DDS1DV["S" D
 .I +DDS1FLD,$G(^DD(DDP,+DDS1FLD,0))[X S Y=$$SET^DIQ(DDP,+DDS1FLD,Y) ;FOREIGN-LANGUAGE SET VALUE
 .E  D PARSET^DIQ(X,.Y)
 Q

DDS2
DDS2 ;SFISC/MLH-UP ARROW JUMP, BRANCH ;20JUNE2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
MOUSE ;Mouse has clicked: DDSMX=$X,DDSMY=$Y
 N DDSBO,P,DDS2O,%
 S DDACT="N",DDSMOUSY=1,DDS2O=DDO,DDSBO=DDSBK
 S X="" F  S X=$O(DDSMOUSE(DDSMY,X)) Q:X=""!(X>DDSMX)  S P=$O(DDSMOUSE(DDSMY,X,"")) I P'<DDSMX S X=$G(DDSMOUSE(DDSMY,X,P)) Q:X=""  D  S:X'[U X=X_"^DDS01" G @X
 .;If they've clicked "+" on a different block, just go to that block
 .I X="NP"!(X="PP") N B S P=$$FINDXY(DDSMY,DDSMX+1),B=$P(P,",",2) I B,B-DDSBO S DDSMX=DDSMX+1,X="F^DDS2"
 I DDSMY+1=IOSL G OUT ;They clicked on COMMAND LINE
F S X=$$FINDXY(DDSMY,DDSMX) Q:'X
 I $L(X,",")<4 S DDO=X,DDS2X="" D DDO S:DDSBK-DDSBO DDACT="NB" Q  ;Going to single-valued field might mean leaving this block
 N D,B,DDSCL,DDSDDO,DDSNR,DDSPDA,DDSSN,DDSSTL ;Going to a multiple...
 S DDSCL=$P(X,",",4)
 I $P(X,",",2)=DDSBK,$D(DDSREP),$P(DDSREP,U,3)=DDSCL S DDO=$P(X,",",1,3),DDS2X="" D DDO Q  ;We clicked on a Field in the current multiple
 S P=$P(X,",",3),B=$P(X,",",2),DDSDDO=+X
 I B'=DDSBK S D=@DDSREFT@(P,B),DDSREP=$P(^(B,D),U,2,99),DDSBK=B
 S DDSPDA=$P(DDSREP,U),DDSSTL=$P(DDSREP,U,2),DDSSN=DDSSTL-1+DDSCL
 S X=DDSDA M %=DA N DDSDA,DA S DDSDA=X M DA=% ;We want the current DA & DDSDA to come back after we leave the multiple we're gonna enter!
 D MDA^DDSM S DDACT="NB",DDSBR="" ;Fake out 1^DDS
 Q
 ;
FINDXY(DY,DX) ;Find Field that is at mouseclick position
 N F,B,Z,CAP,HITE,REP,TOP,D,ABOVE,PYX,PY
 S PYX=$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U,3) Q:'PYX  ;Page co-ords --must be added to Block's!
 F B=0:0 S B=$O(@DDSREFS@(DDSPG,B)) Q:'B  D  Q:$G(Z)
 .Q:'$D(^DIST(.403,+DDS,40,DDSPG,40,B,0))
 .S REP=$G(^(2)),TOP=$P($G(^(0)),U,3)+PYX-1 I DY+1<TOP!($P(^(0),U,4)'="e") Q  ;Click is above this Block, or Block's not editable
 .I REP<2 D DX(DY) Q  ;NON-REPEATING BLOCK  May return Z
 .S HITE=$$HITE^DDSR(B),D=$G(@DDSREFT@(DDSPG,B)) Q:D=""!'HITE
 .S ABOVE=$P($G(^(B,D)),U,3)-1 Q:ABOVE<0
 .S PY=$P(PYX,",",2)-1
 .F F=0:0 S F=$O(^DIST(.404,B,40,F)) Q:'F  D  I $D(Z) S Z=F_","_B_","_DDSPG_","_Z Q
 ..S S=$P($P($G(^(F,2)),U),",",2) Q:'S  S S=S+PY Q:S+$P(^(2),U,2)-2<DX  ;Click is to the right of data
 ..I DX+1<S S CAP=$P($P(^(2),U,3),",",2) Q:'CAP  S CAP=CAP+PY Q:CAP-1>DX  ;Click is to the left of Caption
 ..S S=^(2)+TOP-2 ;$Y OF THE FIRST MULTIPLE for this Field
 ..S S=DY-S+HITE/HITE Q:S<1!(S[".")!(S>REP)  ;Can't click above or below the window
 ..I $D(@DDSREFT@(DDSPG,B,D,S+ABOVE)) S Z=S Q  ;Z IS THE LINE   MUST BE OFFSET BY NUMBER OF ONES ABOVE!
 ..I $P(@DDSREFS@(DDSPG,B),U,9)'=F Q  ;Must go to 1st field of new multiple
 ..I S=1!$D(@DDSREFT@(DDSPG,B,D,S-1+ABOVE)) S Z=S
 Q $G(Z) ;Returns FIELD,BLOCK,PAGE,DDSCL
 ;
DX(DY) F F=0:0 S F=$O(@DDSREFS@(DDSPG,B,F)) Q:'F  I $D(^(F,"N")),+$G(^("D"))=DY D  Q:$G(Z)
 .I $P(@DDSREFS@(DDSPG,B,F,"D"),U,2)+$P(^("D"),U,3)'>DX Q  ;Click is to the right of data
 .I DX<$P(^("D"),U,2) Q:'$G(^DIST(.404,B,40,F,2))  S CAP=$P($P(^(2),U,3),",",2) Q:'CAP  Q:CAP-1>DX  ;Click is to the left of Caption
 .S Z=F_","_B_","_DDSPG
 Q
 ;
NP ;from indirect GO in MOUSE+3, above
 S DDACT="NP" G NP^DDS01
 ;
 ;
UPA ;Up-arrow jump
 Q:$E(X)'=U
 I X?1"^"1.E,X'="^^",$G(DDSDN) D MSG^DDSMSG($$EZBLD^DIALOG(3096),1) Q  ;**
 I X?1"^"1.E,X'="^^" D JMP Q
 ;
 ;Up-arrow only
OUT I 'DDO D E^DDS3 Q
 I $D(DDSREP),DA D POSTACT D:$D(DDSBR)[0 END^DDSM Q
 I $G(DDSDN)=1 D MSG^DDSMSG($$EZBLD^DIALOG(3095),1) Q  ;**
 D POSTACT S:$D(DDSBR)[0 DDSOSV=DDO,DDO=0 Q
 Q
 ;
POSTACT ;Execute post action
 Q:$G(DDSO(12))?." "
 N X
 S X=$G(DDSOLD) X DDSO(12)
 D:$D(DDSBR)#2 BR
 Q
 ;
JMP ;Up-arrow jump
 S DDS2X=X,X=$P(X,U,2) I X="" W $C(7) G KILL
 K DDH,DDQ S DDH=0
 S (X,DDSX)=$$UPCASE($E(X,1,63))
 ;
 ;Find exact matches
 D:$D(@DDSREFS@("CAP",X)) CAP
 D:$D(@DDSREFT@("XCAP",DDSPG,X)) XCAP
 ;
 ;Find partial matches
 S:X="?" (X,DDSX)=""
 F  S DDSX=$O(@DDSREFS@("CAP",DDSX)) Q:DDSX=""!($P(DDSX,X)]"")  D CAP
 S DDSX=X F  S DDSX=$O(@DDSREFT@("XCAP",DDSPG,DDSX)) Q:DDSX=""!($P(DDSX,X)]"")  D XCAP
 ;
NO I 'DDH D MSG^DDSMSG($$EZBLD^DIALOG(3098,$P(DDS2X,U,2)),1) G KILL ;**
 S DDS2O=DDO
 I DDH=1 S DDO=$O(DDH(DDH,""))
 E  S DDD="J" D SC^DDSU
DDO ;DDO=FIELD,BLOCK,PAGE
 S DDS2B=$P(DDO,",",2),DDS2P=$P(DDO,",",3),DDO=+DDO
 G:'DDS2B KILL
 ;
 S DDS2DA=DDSDA
 I DDS2P'=DDSPG D  ;Different Page
 . D:'$D(@DDSREFT@(DDS2P,DDS2B)) ^DDS1(DDS2P)
 . S DDS2DA=@DDSREFT@(DDS2P,DDS2B)
 . I DDS2DA="" D
 .. D MSG^DDSMSG($C(7)_$P($T(ERR),";;",2))
 .. S DDO=DDS2O
 . E  D CKUNED D:'$G(DDS2UNED)
 .. D POSTACT
 .. S:$D(DDSBR)[0 DDACT="NP",DDSPG=DDS2P,DDSBK=DDS2B,DDSBR="" ;Set the new page
 ;
 E  I DDS2B'=DDSBK D  ;Different Block
 . S DDS2DA=@DDSREFT@(DDS2P,DDS2B)
 . I DDS2DA="" D
 .. D MSG^DDSMSG($C(7)_$P($T(ERR),";;",2))
 .. S DDO=DDS2O
 . E  I $P($G(@DDSREFS@(DDS2P,DDS2B)),U,4) D
 .. D MSG^DDSMSG($C(7)_$P($T(ERR1),";;",2))
 .. S DDO=DDS2O
 . E  D CKUNED D:'$G(DDS2UNED)
 .. D POSTACT
 .. S:$D(DDSBR)[0 DDACT="NB",DDSBK=DDS2B,DDSBR="" ;Set the new Block
 ;
 E  D CKUNED D:'$G(DDS2UNED)
 . D POSTACT
 . S:$D(DDSBR)[0 DDACT="N"
 ;
KILL S X=DDS2X
 K DDH,DDSI,DDSPGRP,DDSX
 K DDS2ATT,DDS2B,DDS2DA,DDS2F,DDS2O,DDS2P,DDS2UNED,DDS2X
 Q
 ;
CKUNED ;Check uneditable status
 N DDP,DDSFLD
 ;
 I $P($G(^DIST(.404,DDS2B,40,+DDO,0)),U,3)=2 D
 . S DDP=0
 . S DDSFLD=+DDO_","_DDS2B
 E  D
 . S DDP=$P($G(@DDSREFS@(DDS2P,DDS2B)),U,3)
 . S DDSFLD=$P($G(^DIST(.404,DDS2B,40,+DDO,1)),U)
 I 'DDSFLD S DDS2UNED=1,DDO=DDS2O Q
 S DDS2ATT=$P($G(@DDSREFT@("F"_DDP,DDS2DA,DDSFLD,"A")),U,4)
 ;
 I DDO,$S(DDS2ATT="":$P($G(^DIST(.404,DDS2B,40,+DDO,4)),U,4)=1,1:DDS2ATT=1),'$P(@DDSREFS@(DDS2P,DDS2B,+DDO,"N"),U,11) D
UNED .S DDS2UNED=$P(^DIST(.404,DDS2B,40,+DDO,0),U,2) I DDS2UNED="" S DDS2UNED=$P(^(0),U,5) I DDS2UNED="",$G(^(1)),$D(^DD(DDP,^(1),0)) S DDS2UNED=$P(^(0),U)
 .D MSG^DDSMSG($$EZBLD^DIALOG(3090,DDS2UNED),1) ;**FIELD is UNEDITABLE!
 .S DDS2UNED=1,DDO=DDS2O
 Q
 ;
CAP ;Find all captions that match DDSX
 S DDSPGRP="" F  S DDSPGRP=$O(@DDSREFS@("CAP",DDSX,DDSPGRP)) Q:DDSPGRP=""  D
 . Q:U_DDSPGRP_U'[(U_DDSPG_U)
 . S DDS2P="" F  S DDS2P=$O(@DDSREFS@("CAP",DDSX,DDSPGRP,DDS2P)) Q:'DDS2P  D
 .. S DDS2B="" F  S DDS2B=$O(@DDSREFS@("CAP",DDSX,DDSPGRP,DDS2P,DDS2B)) Q:'DDS2B  D
 ... S DDS2F="" F  S DDS2F=$O(@DDSREFS@("CAP",DDSX,DDSPGRP,DDS2P,DDS2B,DDS2F)) Q:'DDS2F  D FILL
 Q
 ;
XCAP ;Find all xecutable captions that match DDSX
 S DDS2P=DDSPG
 S DDS2B=0 F  S DDS2B=$O(@DDSREFT@("XCAP",DDSPG,DDSX,DDS2B)) Q:'DDS2B  D
 . S DDS2F=0 F  S DDS2F=+$O(@DDSREFT@("XCAP",DDSPG,DDSX,DDS2B,DDS2F)) Q:'DDS2F  D
 .. I $D(^DIST(.404,DDS2B,40,DDS2F,0))#2,$P(^(0),U,3)'=1 D FILL
 Q
 ;
FILL ;Fill DDH array with possible choices
 S DDS2V=DDSX_$S($P(^DIST(.404,DDS2B,40,DDS2F,0),U,4)]"":" ("_$P(^(0),U,4)_")",1:"")
 S:DDS2P'=DDSPG DDS2V=DDS2V_" ("_$S($P($G(^DIST(.403,+DDS,40,DDS2P,1)),U)]"":$P(^(1),U),1:"Page "_$P(^(0),U))_")"
 S DDH=DDH+1,DDH(DDH,DDS2F_","_DDS2B_","_DDS2P)=DDS2V
 K DDS2V
 Q
 ;
BR ;Evaluate DDSBR
 N B,B1,F,F1,P,P1,E,X Q:$D(DDSBR)[0  I DDSBR="QUIT" S DDACT="Q" Q  ;**
 S P=$P($G(DDSOPB),U),B=$P($G(DDSOPB),U,2),F=$G(DDO),E=1
 S:'B B=+$P(@DDSREFS@(+P,"FIRST"),",",2)
 S P1=$P(DDSBR,U,3),B1=$P(DDSBR,U,2),F1=$P(DDSBR,U)
 ;
 D @$S(P1]"":"PG",B1]"":"BK",1:"FD")
 S:'E DDACT=$S(P'=+DDSOPB:"NP",B'=$P(DDSOPB,U,2):"NB",1:"N"),DDSPG=P,DDSBK=B,DDO=F
 K:E DDSBR
 Q
 ;
PG ;
 I P1=+$P(P1,"E") S P=$O(^DIST(.403,+DDS,40,"B",P1,""))
 E  S P=$O(^DIST(.403,+DDS,40,"C",$$UPCASE(P1),""))
 Q:'P
 S:B1="" B1=$O(^DIST(.403,+DDS,40,P,40,"AC","")) Q:B1=""
BK ;
 I B1=+$P(B1,"E") D
 . S B=$O(^DIST(.403,+DDS,40,P,40,"AC",B1,""))
 E  D
 . S B=$O(^DIST(.404,"B",B1,"")) Q:B=""
 . S B=$O(^DIST(.403,+DDS,40,P,40,"B",B,""))
 Q:'B
 S:F1="" F1=$O(^DIST(.404,B,40,"B",""))
FD ;
 Q:F1=""
 I F1="COM" S (E,F)=0 Q
 I F1=+$P(F1,"E") S X="B"
 E  S F1=$$UPCASE(F1),X=$S($D(^DIST(.404,B,40,"D",F1)):"D",1:"C")
 S F=$O(^DIST(.404,B,40,X,F1,""))
 S:F E=0
 Q
 ;
UPCASE(X) ;
 ;Return X in uppercase
 Q $$UP^DILIBF(X)  ;**
 ;
ERR ;;Unable to jump to that field.  The block on which that field is located has no record associated with it.
 ;
ERR1 ;;Unable to jump to that field.  The block on which that field is located has navigation disabled.

DDS3
DDS3 ;SFISC/MLH-COMMAND UTILS ;16FEB2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $G(Y(0))]"","ECNRSPQ"[$E(Y(0)) D @$E(Y(0)) ;'Y' is carried over from the ^DIR read in DDSCOM
 Q
 ;
S ;Save the form
 D ^DDS4,R^DDSR
 D:$D(DDSBR)#2 BR^DDS2
 Q
 ;
R ;Repaint all pages on current screen
 ;Called after wp, mults, and deletions
 G R^DDSR
 ;
E ;Exit
 I DDSSC>1!'DDSCHG!$P(DDSSC(DDSSC),U,4) S DDACT="Q" Q
 S DDM=1
 S Y=1 G EX ;S Y=0 I $G(^XTV(8989.5,0))?1"PARAM".E S Y=$$GET^XPAR("ALL","DI SCREENMAN DON'T ASK SAVE") I Y=1 G EX ;**AVOID THE Y/N QUESTION
 K DIR S DIR(0)="YO"
 S DIR("A")=$$EZBLD^DIALOG(8075)
 D BLD^DIALOG(9037,"","","DIR(""?"")")
 S DIR0=IOSL-1_U_($L(DIR("A"))+1)_"^3^"_(IOSL-1)_"^0"
 D ^DIR
 K DIR,DIROUT,DIRUT
 I Y=0!$D(DTOUT)!$D(DUOUT) D QT Q
 I Y="" S DDACT="N" Q
 I Y=1 D EX
 Q
 ;
C ;Close
 S DDACT="Q"
 Q
 ;
N ;Next page
 S:DDSNP]"" DDSPG=DDSNP,DDACT="NP"
 Q
 ;
P ;Previous
 D PP^DDS01 Q
 ;
Q ;
QT ;Exit, don't save
 I $G(DDSDN)=1,DDO G ERR3
 S DDACT="Q"
 I DDSSC>1!$P(DDSSC(DDSSC),U,4) D MSG1 Q  ;IT ALSO QUIT HERE IF $G(DDSSEL)
 Q:'DDSCHG
 D DEL^DDS6
 S DX=0,DY=IOSL-1 X IOXY
 W $P(DDGLCLR,DDGLDEL),$S($D(DTOUT):$$EZBLD^DIALOG(8076),1:"")_$$EZBLD^DIALOG(8077) H 1
 Q
 ;
EX ;Exit, save
 I $G(DDSDN)=1,DDO G ERR3
 S DDACT="Q"
 I DDSSC>1!$P(DDSSC(DDSSC),U,4) D MSG1 Q  ;IT ALSO QUIT HERE IF $G(DDSSEL)
 D ^DDS4 I 'Y S DDACT="N" D R D:$D(DDSBR)#2 BR^DDS2
 Q
 ;
CL ;Close
 I $G(DDSDN)=1,DDO G ERR3
 G E
 ;
TO ;Time-out
 I DDO,$G(DDSDN) S DDACT="N" G CURSOR^DDS01
 I DDO S DDSOSV=DDO,DDO=0
 E  D E
 Q
 ;
MSG1 ;Print closing page message
 S DX=0,DY=IOSL-1 X IOXY
 W $P(DDGLCLR,DDGLDEL)_"..." H 1
 Q
 ;
ERR3 ;
 D MSG^DDSMSG("Since navigation for the block is disabled, that key sequence is disabled.",1)
 S DDACT="N"
 Q
 ;
 ;#8075  Save changes before leaving form (Y/N)?
 ;#8076  Time out.
 ;#8077  Changes not saved!
 ;#9037  Enter 'Y' to save before exiting...(3 lines)

DDS4
DDS4 ;SFISC/MKO-FILE AND RELOAD ;9DEC2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D ^DDS41 Q:Y'=1
 N DA,DDO,DIE,DDP,DDSDA
 ;
 S DX=0,DY=IOSL-1 X IOXY W "Filing form"_$P(DDGLCLR,DDGLDEL)
 ;
 ;File data
 S DDS4FI="F"
 F  S DDS4FI=$O(@DDSREFT@(DDS4FI)) Q:DDS4FI'?1"F".E  D
 . S DDP=$E(DDS4FI,2,999),DDS4DA=" "
 . F  S DDS4DA=$O(@DDSREFT@(DDS4FI,DDS4DA)) Q:DDS4DA=""  D REC
 ;
 ;Reload all pages on form
 S DDS4P=0
 F  S DDS4P=$O(@DDSREFT@(DDS4P)) Q:'DDS4P  D
 . S DDS4B=0
 . F  S DDS4B=$O(@DDSREFT@(DDS4P,DDS4B)) Q:'DDS4B  D
 .. S DDP=$P(@DDSREFS@(DDS4P,DDS4B),U,3),DDSDA=" "
 .. F  S DDSDA=$O(@DDSREFT@(DDS4P,DDS4B,DDSDA)) Q:'DDSDA  D
 ... S $P(@DDSREFT@(DDS4P,DDS4B,DDSDA),U)=1,DIE=^(DDSDA,"GL")
 ... Q:$P(@DDSREFT@(DDS4P,DDS4B,DDSDA),U,6)>1
 ... D GDA(DDSDA)
 ... D ^DDS11(DDS4B,1)
 ;
 I $G(^DIST(.403,+DDS,14))'?."^" D
 . I $G(DDSPTB)_$G(DDSREP)]"" N DIE,DDP,DDSDA,DA,DDSDL D
 .. S DA=DDSDAORG,DDSDL=DDSDLORG,DDSDA=DA_","
 .. F DDSI=1:1:DDSDL S DA(DDSI)=DDSDAORG(DDSI),DDSDA=DDSDA_DA(DDSI)_","
 .. S DDP=$P($G(DDSFLORG),U),DIE=U_$P($G(DDSFLORG),U,2) S:DIE=U DIE=""
 . X ^DIST(.403,+DDS,14)
 I '$G(DDSSAVE),$G(DDSPARM)["S" S DDSSAVE=1
 S (Y,DDSH)=1,(DDSCHG,DX)=0,DY=IOSL-1 X IOXY W $P(DDGLCLR,DDGLDEL)
 K @DDSREFT@("ADD"),@DDSREFT@("RXR")
 K DIC,DDS1B,DDS1DA,DDS4B,DDS4DA,DDS4FI,DDS4FLD,DDS4FO,DDS4P
 K DDSEXT,DDSI,DDSINT,DDSLC,DDSLN,DDSND,DDSOND,DDSOLD,DDSP,DDSPC
 K DDSW,DDSX,DV
 Q
 ;
 ;
REC ;
 G:DDS4FI="F0" FORMONLY
 ;
 S DIE=$G(@DDSREFT@(DDS4FI,DDS4DA,"GL")) I DIE="" Q  ;JUST TO BE SAFE!
 D GDA(DDS4DA)
 S DDSOND=-1 K DDSLN
 S DDS4FLD=""
 F  S DDS4FLD=$O(@DDSREFT@(DDS4FI,DDS4DA,DDS4FLD)) Q:DDS4FLD=""  D FLD
 S:$D(DDSLN)#2 @(DIE_"DA,DDSND)")=DDSLN
 ;
 I $D(@DDSREFT@("RXR")) D
 . D FIRE^DIKC(DDP,.DA,"KS",$NA(@DDSREFT@("RXR")),"O^")
 . K @DDSREFT@("RXR")
 Q
FLD ;
 Q:'$G(@DDSREFT@(DDS4FI,DDS4DA,DDS4FLD,"F"))  S ^("F")=""
 I '$G(DDSCHANG),$G(DDSPARM)["C" S DDSCHANG=1
 S DDSINT=$G(@DDSREFT@(DDS4FI,DDS4DA,DDS4FLD,"D"))
 ;
 ;Word processing fields (quit if multiple)
 I $D(@DDSREFT@(DDS4FI,DDS4DA,DDS4FLD,"M"))#2 D:'$P(^("M"),U)  Q
WP .N FR,TO,DDS4M
 .S DDS4M=^("M")
 . S FR=$NA(@DDSREFT@(DDS4FI,DDS4DA,DDS4FLD,"D"))
 . S TO=U_$$CREF^DILF($P(DDS4M,U,2))
 .I $P($G(^DD(+$P(DDS4M,U,3),.01,0)),U,2)["a" D WP^DIET($E(DDS4FI,2,99),DDS4FLD,DDS4DA,TO) ;AUDIT Word -Processing
 . K @TO
 . M @TO=@FR
 . K @FR,@DDSREFT@(DDS4FI,DDS4DA,DDS4FLD,"F")
 ;
 Q:$G(^DD(DDP,DDS4FLD,0))?."^"  S DDSND=$P(^(0),U,4)
 S DDSPC=$P(DDSND,";",2) Q:"0 "[DDSPC
 S DDSND=$P(DDSND,";")
 ;
 I DDSOND'=DDSND D
 . S:$D(DDSLN)#2 @(DIE_"DA,DDSOND)")=DDSLN
 . S DDSLN=$G(@(DIE_"DA,DDSND)"))
 . S DDSOND=DDSND
 ;
 I DDSPC D
 . S DDSOLD=$P(DDSLN,U,DDSPC)
 . S $P(DDSLN,U,DDSPC)=DDSINT
 E  D
 . S DDSW=$E(DDSPC,2,999),DDSP=$P(DDSW,",",2)+1
 . S DDSOLD=$E(DDSLN,+DDSW,DDSP-1)
 . S DDSX=$E(DDSLN,DDSP,999)
 . S DDSLN=$E(DDSLN,1,DDSW-1)_$J("",DDSW-1-$L(DDSLN))_DDSINT
 . S:DDSX'?." " DDSLN=DDSLN_$J("",DDSP-DDSW-$L(DDSINT))_DDSX
 ;
 I $D(^DD(DDP,DDS4FLD,1))!($P(^(0),U,2)["a")!$D(^DD("IX","F",DDP,DDS4FLD)) D XR
 Q
XR ;
 N DICRREC,DG,DP,DDS4AUD1,DDS4AUD2,DIANUM,DIIX,C,Y
 S DP=DDP,DDSOND=-1
 I $D(DDSLN)#2 S @(DIE_"DA,DDSND)")=DDSLN K DDSLN
 S DICRREC="TRIG^DDS4"
 ;
 I $P(^DD(DDP,DDS4FLD,0),U,2)["a" D
 . S (DDS4AUD1,DDS4AUD2)=1
 . I $G(^DD(DDP,DDS4FLD,"AUDIT"))["e",DDSOLD="" S DDS4AUD1=0
 ;
 I DDSOLD]"" D
 . S DG=0 F  S DG=$O(^DD(DDP,DDS4FLD,1,DG)) Q:DG<1  D  ;YIKES!  GOES THRU ALL CROSS-REFERENCES, EVEN IF NO CHANGE IN THE DATA!
 .. S DIC=DIE,X=DDSOLD
 .. X:$D(^DD(DDP,DDS4FLD,1,DG,2))#2 ^(2)
 . I $G(DDS4AUD2) S DG=1,X=DDSOLD,DIIX="2^"_DDS4FLD D AUDIT^DIET
 ;
 I DDSINT]"" D
 . S DG=0 F  S DG=$O(^DD(DDP,DDS4FLD,1,DG)) Q:DG<1  D
 .. S DIC=DIE,X=DDSINT
 .. X:$D(^DD(DDP,DDS4FLD,1,DG,1))#2 ^(1)
 . I $G(DDS4AUD1) S DG=1,X=DDSINT,DIIX="3^"_DDS4FLD D AUDIT^DIET
 Q:'$D(^DD("IX","F",DDP,DDS4FLD))
 ;
 ;Process index file xrefs
 N DDSFXR,DDSFXREF,DDSRXREF
 D LOADFLD^DIKC1(DDP,DDS4FLD,"KS","",$NA(@DDSREFT@("F"))_"_","DDSFXR",$NA(@DDSREFT@("RXR")),.DDSFXREF,.DDSRXREF)
 I $G(DDSRXREF)]""!($G(DDSFXREF)]"") D
 . S @DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"O")=DDSOLD ;BRX-0404-11337
 D:$G(DDSFXREF)]"" FIRE^DIKC(DDP,.DA,"KS","DDSFXR","O^")
 Q
GDA(DDSDA) ;
 N I
 K DA S DA=$P(DDSDA,",")
 F I=2:1:$L(DDSDA,",")-1 S DA(I-1)=$P(DDSDA,",",I)
 Q
 ;
FORMONLY ;
 N X
 D GDA(DDS4DA)
 S DDS4FLD=""
 F  S DDS4FLD=$O(@DDSREFT@("F0",DDS4DA,DDS4FLD)) Q:DDS4FLD=""  D
 . Q:'$G(@DDSREFT@("F0",DDS4DA,DDS4FLD,"F"))
 . S DDS4FO=$P(DDS4FLD,","),DDS4B=$P(DDS4FLD,",",2)
 . S DDSOLD=$G(@DDSREFT@("F0",DDS4DA,DDS4FLD,"O")),X=$G(^("D")),DDSEXT=$G(^("X"),X)
 . X:$G(^DIST(.404,DDS4B,40,DDS4FO,23))'?."^" ^(23)
 . S ^("O")=@DDSREFT@("F0",DDS4DA,DDS4FLD,"D"),^("F")=""
 Q
 ;
TRIG ;Called from trigger logic (from DICR via DICRREC)
 N DDSRXREF
 D LOADFLD^DIKC1(DIH,DIG,"KS","",$NA(@DDSREFT@("F"))_"_","",$NA(@DDSREFT@("RXR")),"",.DDSRXREF)
 I $G(DDSRXREF)]"",'$D(@DDSREFT@("F"_DIH,DICRIENS,DIG,"O")) S ^("O")=DIU
 Q

DDS41
DDS41 ;SFISC/MKO-VERIFY DATA ;30JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DDO,DIERR
 N DDS4B,DDS4DA,DDS4DONE,DDS4ERR,DDS4FLD,DDS4OUT,DDS4PG,DDS4PG1,DDS4TP
 N DDSCAP,DDSERROR,DDSFDA,DDSI,DDSKEY,DDSPID,DDSREQ
 ;
 S DDS4OUT=$NA(@DDSREFT@("VALMSG"))
 S DDS4PG=DDSPG
 ;
 K @DDS4OUT,@DDSREFT@("MSG"),@DDSREFT@("KMSG")
 ;
 I $G(DDSPTB)_$G(DDSREP)]"" N DIE,DDP,DDSDA,DA,DDSDL D
 . S DA=+DDSDAORG,DDSDL=DDSDLORG,DDSDA=DA_"," ;GFT
 . F DDSI=1:1:DDSDL S DA(DDSI)=DDSDAORG(DDSI),DDSDA=DDSDA_DA(DDSI)_","
 . S DDP=$P($G(DDSFLORG),U),DIE=U_$P($G(DDSFLORG),U,2) S:DIE=U DIE=""
 ;
 D LDALL
 I $G(DIERR) D  G END
 . N P
 . S P(1)=$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U),P(2)=$P($G(^(1)),U)
 . S:P(2)="" P(2)="unnamed"
 . D BLD^DIALOG(3041,.P),ERR^DDSMSG
 . S DDS4ERR=1
 ;
 D LP
 ;
 ;Validate keys
 S DDSKEY=1
 I $D(DDSFDA) D
 . S DDSKEY=$$KEYVAL^DIE("","DDSFDA",$NA(@DDSREFT@("KMSG")))
 . I 'DDSKEY,$D(DDS4ERR)[0 S DDS4ERR=1 D BLD^DIALOG(3091,"","",DDS4OUT,"S")
 ;
 S DDSPG=DDS4PG
 I '$G(DDS4ERR),$G(^DIST(.403,+DDS,20))'?."^" X ^(20) ;DATA VALIDATION
 I $G(@DDSREFT@("MSG"))>0!$G(DDS4ERR)!'DDSKEY D PRNT
 ;
END S Y='$D(DDSERROR)&'$G(DDS4ERR)&$G(DDSKEY) ;BRX-0903-10662
 K @DDS4OUT,@DDSREFT@("MSG"),@DDSREFT@("KMSG")
 Q
 ;
LDALL ;Load all pages
 S DX=0,DY=IOSL-1 X IOXY
 W "..."_$P(DDGLCLR,DDGLDEL) ;**'PLEASE WAIT'
 S (DDSPG,DDS4PG1)=$O(^DIST(.403,+DDS,40,"B",$S($G(DDSPAGE)]"":DDSPAGE,1:1),""))
 S Y=1
 F  D ^DDS1(DDSPG) Q:$G(DIERR)  S DDSPG=$$NP^DDS5(.Y) Q:DDSPG=DDS4PG1!'Y
 Q
 ;
LP ;Loop through all pages/blocks
 N DDP
 S DX=0,DY=IOSL-1 X IOXY
 W "..."_$P(DDGLCLR,DDGLDEL) ;**'VERIFYING'
 ;
 S DDSPG=0 F  S DDSPG=$O(@DDSREFT@(DDSPG)) Q:'DDSPG  D
 . S DDS4B=0 F  S DDS4B=$O(@DDSREFT@(DDSPG,DDS4B)) Q:'DDS4B  D
 .. Q:$D(DDS4DONE(DDS4B))  Q:$P(@DDSREFS@(DDSPG,DDS4B),U,5)'="e"
 .. S DDSPID=$S($P($G(^DIST(.403,+DDS,40,DDSPG,1)),U)]"":$P(^(1),U),1:"Page "_$P(^(0),U))
 .. S DDS4DONE(DDS4B)="",DDP=$P(^DIST(.404,DDS4B,0),U,2)
 .. S DDO=0 F  S DDO=$O(^DIST(.404,DDS4B,40,DDO)) Q:'DDO  D VF
 Q
 ;
VF ;Check required and key fields
 Q:$D(^DIST(.404,DDS4B,40,DDO,0))[0  S DDS4TP=$P(^(0),U,3)
 Q:DDS4TP=1  Q:DDS4TP=4
 S DDSCAP=$P(^DIST(.404,DDS4B,40,DDO,0),U,2)_$S($P(^(0),U,4)]"":" ("_$P(^(0),U,4)_")",1:"")
 S DDSREQ=$P($G(^DIST(.404,DDS4B,40,DDO,4)),U)
 S DDSKEY=0
 ;
 I DDS4TP=2 N DDP D
 . S DDP=0,DDS4FLD=DDO_","_DDS4B
 . S:DDSCAP="" DDSCAP=$P(^DIST(.404,DDS4B,40,DDO,0),U,5)
 ;
 E  D  Q:DDS4FLD'=+$P(DDS4FLD,"E")
 . S DDS4FLD=$G(^DIST(.404,DDS4B,40,DDO,1))
 . I $G(^DD(DDP,DDS4FLD,0))?."^" S DDS4FLD="" Q
 . S:DDSCAP="" DDSCAP=$$LABEL^DIALOGZ(DDP,DDS4FLD) ;FOR SOME REASON, HE USED TO GRAB TITLE, IF PRESENT!
 . S:DDSREQ="" DDSREQ=$P(^DD(DDP,DDS4FLD,0),U,2)["R"
 . S DDSKEY=$D(^DD("KEY","F",DDP,DDS4FLD))>0
 ;
 S DDS4DA=" "
DAS F  S DDS4DA=$O(@DDSREFT@(DDSPG,DDS4B,DDS4DA)) Q:DDS4DA'[","  D  ;IGNORE "COMP MUL" NODE
 . I $P(@DDSREFT@(DDSPG,DDS4B,DDS4DA),U,6)<2 D VR Q
 . ;
 . N DDS4PDA S DDS4PDA=DDS4DA N DDS4DA
 . S DDS4DA=""
 . F  S DDS4DA=$O(@DDSREFT@(DDSPG,DDS4B,DDS4PDA,"B",DDS4DA)) Q:'DDS4DA  D VR
 Q
 ;
VR ;Check individual records
 I $P($G(@DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"A")),U)]"" N DDSREQ S DDSREQ=$P(^("A"),U)
 I 'DDSREQ,'DDSKEY Q
 ;
 ;Required WP fields (quit if mult)
 I DDP,$D(@DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"M")) D:'^("M")  Q
 . N DDS4I,DDS4REF,DDS4VAL
 . I $G(@DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"F")) S DDS4REF=$NA(^("D"))
 . E  S DDS4REF=$P(@DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"M"),U,2),DDS4REF=U_$E(DDS4REF,1,$L(DDS4REF)-1)_")"
 . S (DDS4VAL,DDS4I)=0
 . F  S DDS4I=$O(@DDS4REF@(DDS4I)) Q:'DDS4I  I $G(@DDS4REF@(DDS4I,0))'?." " S DDS4VAL=1 Q
 . D:'DDS4VAL LDERR
 ;
 I $G(@DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"D"))="" D LDERR Q
 ;
 I DDSKEY,$D(@DDSREFT@("F"_DDP,DDS4DA,DDS4FLD,"F")) S DDSFDA(DDP,DDS4DA,DDS4FLD)=$G(^("D"))
 Q
 ;
LDERR ;Call ^DIALOG to load error
 N P,E
 I $D(DDS4ERR)[0 S DDS4ERR=1 D BLD^DIALOG(3091,"","",DDS4OUT,"S") ;'THE DATA COULD NOT BE FILED.'
 S P(1)=DDSPID,P(2)=DDSCAP
 I $L(DDS4DA,",")>2
 E  S E=$O(@DDSREFT@("F"_DDP,"")) I E]"" S E=$O(^(E)) I E]"" ;ARE THERE MORE THAN ONE OF THESE ENTRIES?
 I  S P(3)=$$GET1^DIQ(DDP,DDS4DA,.01,,,"E") I P(3)]"" S P(3)="("_$$EZBLD^DIALOG(8079)_": "_P(3)_")" ;'SUBRECORD'
 D BLD^DIALOG(3092,.P,"",DDS4OUT,"S") ; '|1|, |2| is a required field |3|'
 Q
 ;
PRNT ;Print messages
 N DDSABT
 S (DDSABT,DX,DY)=0 X IOXY
 W $P(DDGLCLR,DDGLDEL,2)
 S $X=0,$Y=0
 ;
 ;Print required field messages
 I $G(DDS4ERR) S DDSI=0 F  S DDSI=$O(@DDS4OUT@(DDSI)) Q:'DDSI  D  Q:DDSABT
 . D:$G(@DDS4OUT@(DDSI))]"" WLIN(^(DDSI))
 ;
 ;Print duplicate key messages
 S DDSI=0 F  S DDSI=$O(@DDSREFT@("KMSG","DIERR",DDSI)) Q:'DDSI  D  Q:DDSABT
 . D WLIN(" "),WLIN(@DDSREFT@("KMSG","DIERR",DDSI,"TEXT",1))
 . Q:@DDSREFT@("KMSG","DIERR",DDSI)'=740
 . ;
 . N DA,FIL,FILE,FLD,FLDS,FNAME,IENS,J,KEY,LEV,RNAME
 . S FILE=@DDSREFT@("KMSG","DIERR",DDSI,"PARAM","FILE"),IENS=$G(^("IENS")),KEY=$G(^("KEY"))
 . D FRNAME^DIKCU1(FILE,IENS,.FNAME,.RNAME,.LEV)
 . ;
 . I LEV D
 .. S FNAME=$J("",7)_"Subfile: "_FNAME D WLIN(.FNAME,16)
 .. S RNAME=$J("",8)_"Record: "_RNAME D WLIN(.RNAME,16)
 . ;
 . S FLDS="",J=0 F  S J=$O(^DD("KEY",KEY,2,J)) Q:'J  D
 .. Q:'$D(^DD("KEY",KEY,2,J,0))  S FLD=$P(^(0),U),FIL=$P(^(0),U,2)
 .. Q:'$D(^DD(FIL,FLD,0))  S FLDS=FLDS_$P(^(0),U)_" (#"_FLD_"), "
 . D:FLDS]"" WLIN("  Key Field(s): "_$E(FLDS,1,$L(FLDS)-2),16)
 ;
 ;Print developer messages
 S DDSI=0 F  S DDSI=$O(@DDSREFT@("MSG",DDSI)) Q:'DDSI  D  Q:DDSABT
 . D:@DDSREFT@("MSG",DDSI)]"" WLIN(^(DDSI))
 ;
 D EOP
 Q
 ;
WLIN(DDSX,DDSINDNT) ;Write a single line, wrap at word boundaries
 N I
 D WRAP^DIKCU2(.DDSX,IOM-1-$G(DDSINDNT),IOM-1)
 S DDSX(0)=DDSX
 F I=0:1 Q:'$D(DDSX(I))  D  Q:DDSABT
 . I $Y+4>IOSL D EOP I 'Y S DDSABT=1 Q
 . W !,$J("",$S(I:$G(DDSINDNT),1:0))_DDSX(I)
 Q
EOP ;Issue EOP prompt
 N X
 S DX=0,DY=IOSL-1 X IOXY
 W $$EZBLD^DIALOG(8053) R X:DTIME ;**
 S Y=X'[U&$T
 I Y S (DX,DY)=0 X IOXY W $P(DDGLCLR,DDGLDEL,2) S $X=0,$Y=0
 Q

DDS5
DDS5 ;SFISC/MKO-MULTS,NEXT/PREV PAGE,NEXT BLOCK ;9:53 AM  1 Oct 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I X="" D:DDSOLD="" NF^DDS01 D:DDSOLD]"" DM^DDS6 Q
 I DIR0N,$D(DUZ)#2 S ^DISV(DUZ,$E(DDSGL,1,28))=$E(DDSGL,29,999)_X
 I $G(@DDSREFS@("ASUB",DDSPG,DDSBK,DDO))]"" S DDS5PG=^(DDO)
 E  I $P($G(DDSO(7)),U,2)="" D:X=DDSOLD NF^DDS01 Q
 D MULT,R^DDSR
 ;
 K DDSSTACK
 X:$G(^DIST(.404,DDSBK,40,DDO,10))'?."^" ^(10)
 I $D(DDSSTACK) D ^DDSSTK,R^DDS3 K DDSBR
 D:$D(DDSBR)#2 BR^DDS2
 Q
MULT ;
 N DIE,DDO,DDSBK,DDSDN,DDSNP,DDSOPB,DDSPG,DDSPTB,DDSREP,DDSTP
 ;
 I $G(DDS5PG) S DDSPG=DDS5PG K DDS5PG
 E  D
 . S DDSPG(1)=$P($G(DDSO(7)),U,2) Q:DDSPG(1)=""
 . S DDSPG=$O(^DIST(.403,+DDS,40,"B",DDSPG(1),"")) Q:DDSPG=""
 Q:$D(^DIST(.403,+DDS,40,+$G(DDSPG),0))[0
 N:'$P(^(0),U,6) DDSSC
 ;
 D DDA(Y,.DA,.DDSDL)
 I Y'=-1 D
 . N DDP,DDSDA,DDSFLD,DDSDLORG,DDSDAORG,DDSFLORG
 . S DIE=U_$P(DDSU("M"),U,2),DDP=$P(DDSU("M"),U,3)
 . S DDSDLORG=DDSDL,DDSDAORG=DA,DDSDA=DA_","
 . F DDSI=1:1:DDSDL S DDSDAORG(DDSI)=DA(DDSI),DDSDA=DDSDA_DA(DDSI)_","
 . K DDSI
 . S DDSSTK=1
 . D PROC^DDS
 D LST(.DA,.DDSDL,DDP,DDSDA,DDSFLD)
 D UDA(.DA,.DDSDL)
 Q
 ;
LST(DA,DDSDL,DDP,DDSDA,DDSFLD) ;Save last edited subrecord
 ;In:  DA array, DDSDL      at subfile level
 ;     DDP, DDSDA, DDSFLD   at file level
 N DDSDIE,Y
 S DDSDIE=U_$P(@DDSREFT@("F"_DDP,DDSDA,DDSFLD,"M"),U,2)
 I $D(@(DDSDIE_"+$G(DA),0)"))[0 D
 . S DA=$S($D(@(DDSDIE_"0)"))#2:$P(^(0),U,3),1:$O(^(0)))
 . I DA>0 D
 .. N C
 .. S Y=$P(@(DDSDIE_DA_",0)"),U)
 .. S C=$P(^DD(+$P(^DD(DDP,DDSFLD,0),U,2),.01,0),U,2)
 .. D Y^DIQ
 . E  S (DA,Y)=""
 E  S (DA,Y)=""
 I DA>0,$D(DUZ)#2 S ^DISV(DUZ,$E(DDSDIE,1,28))=$E(DDSDIE,29,999)_DA
 ;
 S @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"X")=Y,^("D")=DA,DDACT="N"
 Q
 ;
SEL ;Issue the read at the Select mult prompt
 S DIR(0)="PO"_DDSGL_":QEMZ"_$E("L",'$D(DDSTP)&'$P($G(DDSO(4)),U,5))_$E("V",$P($G(DDSO(4)),U,6))
 I $D(@(DDSGL_"0)"))[0 S ^(0)=U_$P($G(DDSU("DD")),U,2)_U_U
 E  I $P(@(DDSGL_"0)"),U,2)'=$P($G(DDSU("DD")),U,2) S $P(^(0),U,2)=$P($G(DDSU("DD")),U,2)
 D DDA(0,.DA,.DDSDL) S DDSDA="0,"_DDSDA
 D ^DIR K DIR,DUOUT,DIRUT,DIROUT
 D UDA(.DA,.DDSDL) S DDSDA=$P(DDSDA,",",2,999)
 Q:DDACT'="N"
 ;
 I DIR0N S (X,Y)=DDSOLD Q
 I $P(Y,U,3)=1 S ^("ADD")=$G(@DDSREFT@("ADD"))+1,^("ADD",^("ADD"))=+Y_","_DDSDA_DDSGL
 E  S DIR0N=1
 S Y=$P(Y,U)
 S:X="" Y=""
 Q
 ;
DDA(Y,DA,DL) ;Push Y onto DA array
 N I
 F I=DL:-1:1 S DA(I+1)=DA(I)
 S DA(1)=DA,DL=DL+1
 S (DA,@("D"_DL))=$S(+$P($G(Y),"E"):+$P(Y,"E"),1:0)
 Q
 ;
UDA(DA,DL) ;Pop DA array
 N I
 S DA=DA(1)
 F I=2:1:DL S DA(I-1)=DA(I)
 K DA(DL),@("D"_DL)
 S DL=DL-1
 Q
NP(Y) ;Returns: Next page
 ;         (Y=1 if found, 0 if not found)
 N P,P1
 S Y=0,P1=$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U,4)
 I P1]"" D
 . S P=$O(^DIST(.403,+DDS,40,"B",P1,""))
 . I P,P'=DDSPG,$D(^DIST(.403,+DDS,40,P,0))#2 S Y=1
 Q $S(Y=1:P,1:DDSPG)
PP(Y) ;
 N P,P1
 S Y=0,P1=$P($G(^DIST(.403,+DDS,40,DDSPG,0)),U,5)
 I P1]"" D
 . S P=$O(^DIST(.403,+DDS,40,"B",P1,""))
 . I P,P'=DDSPG,$D(^DIST(.403,+DDS,40,P,0))#2 S Y=1
 Q $S(Y=1:P,1:DDSPG)
NB(Y) ;
 N B,BO,X
 S (B,Y)=0,BO=$P($G(^DIST(.403,+DDS,40,DDSPG,40,DDSBK,0)),U,2)
 I BO F  D  Q:B=DDSBK!Y
 . S BO=$O(^DIST(.403,+DDS,40,DDSPG,40,"AC",BO)) S:'BO BO=$O(^("")) S B=$O(^(BO,""))
 . S X=$G(@DDSREFS@(DDSPG,B))
 . I $P(X,U)]"",$P(X,U,5)'="h",$P(X,U,9),B'=DDSBK S Y=1
 Q B

DDS6
DDS6 ;SFISC/MKO-DELETIONS ; 14NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;Enter here if user deleted record from the .01 of the (sub)record
 ;(called from DDS01)
 ;In:  DDSU array, DDSOLD, DDSFLD
 D D
 I 'Y D  ;DELETE DIDN'T HAPPEN
 . S @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D")=DDSOLD
 . S:$D(DDSU("X"))#2 @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"X")=DDSU("X")
 E  D
 . I $D(DDSREP) D
 .. D DEL^DDSM1(DDSDA)  ;THIS WILL COME BACK TO K IN THIS ROUTINE!
 . E  D K(DDSDA,DIE) I $D(DDSPTB) D
 .. S DDACT="NB"
 .. S $P(@DDSREFT@(DDSPG,DDSBK),U)=""
 .. D DB^DDSR(DDSPG,DDSBK)
 .. D RPF^DDS7(DDP,DDSPTB,DDSDA,.DA)
 . E  S DDACT="Q",DA="",DDSDAORG=DA,DDSDA="0,"
 . I '$D(DDSPTB),'$P(DDSSC(DDSSC),U,4),'$D(DDSREP) D
 .. D PG^DDSRSEL
 .. I $G(DDSSEL) D
 ... D CLRDAT^DDSRSEL
 ... D R^DDSR
 ... D PUT^DDSVALF(1,1,$P(^DIST(.403,+DDS,21),U),"","","0,")
 Q
 ;
DM ;Enter here if user deleted record from the Select prompt
 ;(called from DDS5)
 ;In:  DDSU array, DDSOLD, DDSFLD
 ;
 ;Get DA and DIE for subfile level and delete
 D DDA^DDS5(DDSOLD,.DA,.DDSDL)
 D
 . N DIE,DDSDA
 . S DIE=U_$P(DDSU("M"),U,2)
 . S DDSDA=DA_"," F DDSI=1:1:DDSDL S DDSDA=DDSDA_DA(DDSI)_","
 . K DDSI
 . D D
 . D:Y K(DDSDA,DIE)
 ;
 I 'Y D
 . S @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"D")=DDSOLD
 . S:$D(DDSU("X"))#2 @DDSREFT@("F"_DDP,DDSDA,DDSFLD,"X")=DDSU("X")
 . D UDA^DDS5(.DA,.DDSDL)
 E  D
 . D LST^DDS5(.DA,.DDSDL,DDP,DDSDA,DDSFLD)
 . D UDA^DDS5(.DA,.DDSDL)
 Q
 ;
D ;Delete the subrecord
 ;In: DA array, DIE, DDSDL; Out: Y=1 if successful
 N DR,DDS6DA,DDSI
 D:DDM CLRMSG^DDS
 S DDM=1
 ;
 K DIR S DIR(0)="YO"
 D BLD^DIALOG(8080,$$EZBLD^DIALOG(8078+(DDSDL>0)),"","DIR(""A"")")
 D BLD^DIALOG(9038,"","","DIR(""?"")")
 ;
 S DIR0=IOSL-1_U_($L(DIR("A"))+1)_"^3^"_(IOSL-3)_"^0"
 D ^DIR K DIR
 D CLRMSG^DDS
 I X=""!$D(DIRUT)!'Y S Y=0 K DIRUT,DUOUT,DIROUT,DTOUT Q
 ;
 S DDS6DA=DA N D0
 F DDSI=1:1 Q:$D(DA(DDSI))[0  S DDS6DA(DDSI)=DA(DDSI) N @("D"_DDSI)
 W $P(DDGLVID,DDGLDEL,9) S X=IOM X DDGLZOSF("RM")
 S DR=".01///@" D ^DIE K DI ;DELETE THE SUB-RECORD!
 W $P(DDGLVID,DDGLDEL,8) S X=0 X DDGLZOSF("RM")
 ;
 ;I $D(DA) H 2 W $P(DDGLCLR,DDGLDEL,2) D R^DDSR S Y=0 Q
 I $D(DA) S:$Y>(DDSHBX+1) DDSKM=1,DDM=1 S Y=0 Q
 ;
 S Y=1,DA=DDS6DA
 I '$G(DDSCHANG),$G(DDSPARM)["C" S DDSCHANG=1
 F DDSI=1:1 Q:$D(DDS6DA(DDSI))[0  S DA(DDSI)=DDS6DA(DDSI)
 Q
 ;
K(DDSIEN,DIE) ;Remove all data pertaining to the (sub)record from @DDSREFT
 ;In: DDSIEN = IENS of record being deleted
 ;    DIE    = global root
 ;
 N B,P,FN,PAT,PDA,IENS
 S PAT=".E1"""_DDSIEN_""""
 ;
 ;Loop through all pages/blocks in ^TMP
 S P=0 F  S P=$O(@DDSREFT@(P)) Q:'P  D
 . S B=0 F  S B=$O(@DDSREFT@(P,B)) Q:'B  D
 .. ;Get file number of the block
 .. S FN="F"_$P(@DDSREFS@(P,B),U,3)
 .. ;
 .. ;Loop through all records loaded for that block
 .. S IENS=" "
B .. F  S IENS=$O(@DDSREFT@(P,B,IENS)) Q:IENS'[","  D
 ... ;
 ... ;If the data pertains to the current or ancestor file, kill it
 ... ;Get the parent IENS (also indicates the block is repeating)
 ... S PDA=$P($G(@DDSREFT@(P,B,IENS)),U,2)
 ... ;
 ... I 'PDA,IENS?@PAT,$P(@DDSREFT@(P,B,IENS,"GL"),DIE)="" D
 .... K @DDSREFT@(P,B,IENS)
 .... K @DDSREFT@(FN,IENS)
SUB ... E  I $P($G(@DDSREFT@(P,B,IENS)),U,6)!PDA,@DDSREFT@(P,B,IENS,"GL")=DIE D  ;IF IT'S A MULTIPLE IN A REPEATING BLOCK
 .... D DELP(P,B,PDA,DDSIEN)
 .... K @DDSREFT@(FN,DDSIEN)
 Q
 ;
DELP(P,B,PDA,IENS) ;Delete subrecord from parent's list
 ;In: P    = page number
 ;    B    = block number
 ;    PDA  = parent IENS
 ;    IENS = IENS of record to remove
 N R,S
 ;
 S S=$G(@DDSREFT@(P,B,PDA,"B",IENS)) Q:'S
 K @DDSREFT@(P,B,PDA,"B",IENS)
 ;
 F S=S:1 Q:$D(@DDSREFT@(P,B,PDA,S+1))[0  D
 . S R=@DDSREFT@(P,B,PDA,S+1)
 . S @DDSREFT@(P,B,PDA,S)=R
 . S @DDSREFT@(P,B,PDA,"B",R)=S
 K @DDSREFT@(P,B,PDA,S)
 Q
 ;
DEL ;Delete (sub)records added between saves
 ;(user quit without saving)
 N DA,DIK
 S DDSI=0
 F  S DDSI=$O(@DDSREFT@("ADD",DDSI)) Q:'DDSI  D
 . K DA
 . S DA=$P(@DDSREFT@("ADD",DDSI),U),DIK=U_$P(^(DDSI),U,2)
 . F DDSX=2:1:$L(DA,",")-1 S DA(DDSX-1)=$P(DA,",",DDSX)
 . S DA=+DA
 . D ^DIK
 K DDSI,DDSX
 Q
 ;#8078  record
 ;#8079  subrecord
 ;#8080  WARNING: DELETIONS ARE DONE...
 ;#9038  Enter 'Y' to delete...

DDS7
DDS7 ;SFISC/MKO-Relational ;1:39 PM  28 Jun 1996
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
RPB(DDP,DDSFLD,DDSPG) ;Repaint pointed-to block(s) recursively
 N DDS7B
 S DDS7B=""
 F  S DDS7B=$O(@DDSREFS@("PT",DDP,DDSFLD,DDSPG,DDS7B)) Q:DDS7B=""  D
 . N DDP,DDSFLD
 . I $P($G(@DDSREFS@(DDSPG,DDS7B)),U,8) D
 .. D BLK^DDS1(DDSPG,DDS7B,"","",1)
 .. D DB^DDSR(DDSPG,DDS7B)
 . S DDP=$P($G(@DDSREFS@(DDSPG,DDS7B)),U,3)
 . D:$D(@DDSREFS@("PT",DDP))
 .. S DDSFLD=""
 .. F  S DDSFLD=$O(@DDSREFS@("PT",DDP,DDSFLD)) Q:DDSFLD=""  D
 ... D:$D(@DDSREFS@("PT",DDP,DDSFLD,DDSPG)) RPB(DDP,DDSFLD,DDSPG)
 Q
 ;
RPF(DDP,DDSPTB,DDSDA,DA) ;Repaint and update pointer field of
 ;pointer blocks because user changed the .01 value
 S DDS7V=$G(@DDSREFT@("F"_DDP,DDSDA,.01,"D")) I DDS7V]"",$D(^("X"))#2 S DDS7V=^("X")
 S DDS7DAS=U_DA_U
 F DDS7I=$L(DDSPTB,U):-1:1 D  Q:$G(DDS7FD)'=.01
 . S DDS7PTB=$P(DDSPTB,U,DDS7I)
 . D:DDS7PTB]"" RPF1
 K DDS7B,DDS7D,DDS7DA,DDS7DAS,DDS7DAST,DDS7DDO,DDS7FD,DDS7FI
 K DDS7I,DDS7L,DDS7PTB,DDS7REF,DDS7RJ,DDS7V,DDS7X
 Q
RPF1 ;
 I DDS7PTB[";J" S DDS7FD="" Q
 S DDS7PTB=$P(DDS7PTB,";")
 I $L(DDS7PTB,",")=2 S DDS7FI=+DDS7PTB,DDS7FD=$P(DDS7PTB,",",2)
 E  I $L(DDS7PTB,",")=3 S DDS7FI=0,DDS7FD=$P(DDS7PTB,",",2,3)
 E  Q
 Q:DDS7FI=""!(DDS7FD="")
 ;
 ;Repaint pointer field on current page
 S DDS7B=""
 F  S DDS7B=$O(@DDSREFS@("F"_DDS7FI,DDS7FD,"L",DDSPG,DDS7B))  Q:DDS7B=""  D
 . S DDS7DDO=""
 . F  S DDS7DDO=$O(@DDSREFS@("F"_DDS7FI,DDS7FD,"L",DDSPG,DDS7B,DDS7DDO)) Q:DDS7DDO=""  D
 .. Q:$G(@DDSREFS@(DDSPG,DDS7B,DDS7DDO,"D"))=""  S DY=+^("D"),DX=$P(^("D"),U,2),DDS7L=$P(^("D"),U,3),DDS7RJ=$P(^("D"),U,10)
 .. X IOXY
 .. S DDS7X=$P(DDGLVID,DDGLDEL)_$E(DDS7V,1,DDS7L)_$P(DDGLVID,DDGLDEL,10)
 .. W $S(DDS7RJ:$J(" ",DDS7L-$L(DDS7V))_DDS7X,1:DDS7X_$J(" ",DDS7L-$L(DDS7V)))
 ;
 ;Reset external form of pointer data.
 ;
 ;If the pointer field is the .01, then we may have to follow back
 ;to pointers that point to this pointer block.
 ;
 ;DDS7DAS initially contains a list of records whose .01s we changed.
 ;DDS7DAST keeps a running list of all records in the pointer block
 ;that we change.
 ;DDS7DAS is finally set to this running list, so that when we go
 ;to update the pointer to the pointer block, we know which pointers
 ;to update.
 ;
 S DDS7DAST="",DDS7DA=" "
 F  S DDS7DA=$O(@DDSREFT@("F"_DDS7FI,DDS7DA)) Q:DDS7DA'[","  D
 . S DDS7REF=$NA(@DDSREFT@("F"_DDS7FI,DDS7DA,DDS7FD))
 . S DDS7D=$G(@DDS7REF@("D"))
 . I DDS7DAS[(U_$P(DDS7D,";")_U),$S(DDS7D[";":U_$P(DDS7D,";",2)=DIE,1:1) D
 .. I DDS7V="",DDS7FD'=.01 S @DDS7REF@("D")="",^("F")=3
 .. S:$D(@DDS7REF@("X"))#2 ^("X")=$S(DDS7V=""&(DDS7FD=.01):@DDS7REF@("D"),1:DDS7V)
 .. I DDS7FD=.01,DDS7DAST_U'[(U_+DDS7DA_U) S DDS7DAST=DDS7DAST_U_+DDS7DA
 S DDS7DAS=DDS7DAST_U
 Q

DDSBOX
DDSBOX(DDSUL,DDSLR) ;SFISC/MKO-DRAW A BOX ;08:17 AM  9 Apr 1993
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D BOUNDS Q:'Y
 ;
 S DDS3L=""
 S $P(DDS3L,$P(DDGLGRA,DDGLDEL,3),$P(DDSLR,",",2)-$P(DDSUL,",",2))=""
 S DDS3M=$P(DDGLGRA,DDGLDEL,4)_$J("",$P(DDSLR,",",2)-$P(DDSUL,",",2)-1)_$P(DDGLGRA,DDGLDEL,4)
 ;
 S DY=$P(DDSUL,",")-1,DX=$P(DDSUL,",",2)-1 X IOXY
 W $P(DDGLGRA,DDGLDEL)_$P(DDGLGRA,DDGLDEL,5)_DDS3L_$P(DDGLGRA,DDGLDEL,6)
 ;
 F DY=$P(DDSUL,","):1:$P(DDSLR,",")-2 D
 . S DX=$P(DDSUL,",",2)-1 X IOXY
 . W DDS3M
 ;
 S DY=$P(DDSLR,",")-1,DX=$P(DDSUL,",",2)-1 X IOXY
 W $P(DDGLGRA,DDGLDEL,7)_DDS3L_$P(DDGLGRA,DDGLDEL,8)_$P(DDGLGRA,DDGLDEL,2)
 ;
 K DDS3L,DDS3M
 Q
 ;
CLEAR(DDSUL,DDSLR) ;Clear area within upper left and lower right coords
 N S
 D BOUNDS Q:'Y
 ;
 S S=$J("",$P(DDSLR,",",2)-$P(DDSUL,",",2)+1)
 S DX=$P(DDSUL,",",2)-1
 F DY=$P(DDSUL,",")-1:1:$P(DDSLR,",")-1 X IOXY W S
 Q
 ;
BOUNDS ;Make sure area is within acceptable boundaries
 N DDSV,DDSP
 S Y=1
 I $G(DDSUL)=""!($G(DDSLR))="" S Y=0 Q
 ;
 F DDSV="DDSUL","DDSLR" D
 . S:$P(@DDSV,",")>DDSHBX $P(@DDSV,",")=DDSHBX
 . S:$P(@DDSV,",",2)>(IOM-1) $P(@DDSV,",",2)=IOM-1
 . F DDSP=1,2 S:$P(@DDSV,",",DDSP)<1 $P(@DDSV,",",DDSP)=1
 ;
 I $P(DDSLR,",")-$P(DDSUL,",")<2 S Y=0 Q
 I $P(DDSLR,",",2)-$P(DDSUL,",",2)<2 S Y=0 Q
 ;
 Q

DDSCAP
DDSCAP ;SFISC/MKO-INPUT TRANSFORM FOR CAPTIONS ;01:24 PM  14 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
FUNC(X) ;
 Q:$E(X)'="!"
 N E,F,Y
 S F=$E(X,2,999)
 S:$P(F,"(")?.A1.L.A F=$$UPCASE($P(F,"("))_$S(F["(":"("_$P(F,"(",2,999),1:"")
 Q:$P(F,"(")'?1U.7UN X
 Q:$T(@$P(F,"("))="" X
 ;
 D  Q:$G(E) X
 . N X S X="S Y=$$"_F
 . N F D ^DIM
 . S:'$D(X) E=1
 ;
 S @("Y=$$"_F)
 Q Y
 ;
L() ;;Get label of field
 N F1,F2
 S X=""
 S F1=$$GET^DDSVAL(DIE,.DA,4) Q:'F1 X
 S F2=$$GET^DDSVAL(.404,DA(1),1) Q:'F2 X
 S X=$P($G(^DD(F2,F1,0)),U)
 Q X
 ;
T() ;;Get title of field
 N F1,F2
 S X=""
 S F1=$$GET^DDSVAL(DIE,.DA,4) Q:'F1 X
 S F2=$$GET^DDSVAL(.404,DA(1),1) Q:'F2 X
 S X=$G(^DD(F2,F1,.1))
 Q X
 ;
U() ;;Get unique name of field
 Q $$GET^DDSVAL(DIE,.DA,3.1)
 ;
DUP(X1,X) ;;The DUP function
 Q:$G(X1)="" ""
 N %
 S %=X,X="",$P(X,X1,%\$L(X1)+1)=X1,X=$E(X,1,%)
 Q X
 ;
UPCASE(X) ;Convert X to uppercase
 Q $$UP^DILIBF(X)  ;**

DDSCLONE
DDSCLONE ;SFISC/MKO-CLONE A FORM ;2OCT2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N %,%CHK,%RET,%X,%Y,D,D0,D1,DA,DI,DIOVRD,DIC,DIR,DIZ,DQ,DREF,X,Y
 K ^TMP("DDSCLONE",$J)
 S DDSQUIT=0,DIOVRD=1
 ;
 S DDSFORM=$$FORM G:DDSFORM=-1 QUIT
 ;
 D GETBLKS
 D REPORT G:DDSQUIT QUIT
 D RENMSP G:DDSQUIT QUIT
 D RENAME G:DDSQUIT QUIT
 D ^DDSCLONF
DONE I '$G(DDSQUIT) W !!!,"DONE!"
 ;
QUIT ;Cleanup
 K ^TMP("DDSCLONE",$J)
 K DDSBK,DDSBKDA,DDSFILE,DDSFORM,DDSNFRM,DDSNNS,DDSONS,DDSQUIT
 K DDH,DIRUT,DIROUT,DTOUT,DUOUT
 Q
 ;
FORM() ;Prompt for form
 ;Select file
 N D,DIC
EGP S DDS1=8108 D W^DICRW K DDS1 G:Y<0 FORMQ ;**CCO/NI 'CLONE FORM'
 I '$D(@(DIC_"0)")) S Y=-1 G FORMQ
 S DDSFILE=Y
 ;
 ;Select form
 W ! K DIC
 S DIC="^DIST(.403,",DIC(0)="QEAM"
 S DIC(0)="QEA",D="F"_+DDSFILE
 S DIC("S")="I $P(^(0),U,8)=+DDSFILE"
 S DIC("A")="Select FORM to clone: "
 S DIC("W")=$P($T(DICW),";",3,999)
DICW ;;N %G S %G=^(0) W:$X>35 ! W ?35,"#"_Y N Y S Y=$P(%G,U,5) W:Y]"" ?43,$$OUT^DIALOGU(Y,"FMTE","2D") S Y=$P(%G,U,4) W:Y]"" ?53," User #"_Y S Y=$P(%G,U,8) W:Y]"" ?65," File #"_Y ;**CCO/NI NICE DATE OUTOUT
 D IX^DIC
 ;
FORMQ Q Y
 ;
GETBLKS ;Get all blocks on form
 ; ^TMP("DDSCLONE",$J,bk#)=Block name
 ;
 N B,P
 S P=0 F  S P=$O(^DIST(.403,+DDSFORM,40,P)) Q:'P  D
 . S B=$P(^DIST(.403,+DDSFORM,40,P,0),U,2)
 . I B]"",'$D(^TMP("DDSCLONE",$J,B)) D
 .. S ^TMP("DDSCLONE",$J,B)=$P($G(^DIST(.404,B,0)),U)
 . S B=0
 . F  S B=$O(^DIST(.403,+DDSFORM,40,P,40,B)) Q:'B  D
 .. Q:$D(^TMP("DDSCLONE",$J,B))
 .. S ^TMP("DDSCLONE",$J,B)=$P($G(^DIST(.404,B,0)),U)
 Q
 ;
REPORT ;Print report
 N B
 W !!!
 I '$D(^TMP("DDSCLONE",$J)) S DDSQUIT=1 W "There are no blocks on this form." Q
 ;
 W "  BLOCKS USED ON FORM """_$P(DDSFORM,U,2)_""" (IEN #"_+DDSFORM_")"
 W !!,"  Internal"
 W !,"  Entry Number   Block Name"
 W !,"  ------------   ----------"
 ;
 S B="" F  S B=$O(^TMP("DDSCLONE",$J,B)) Q:B=""  D
 . W !,"  "_B,?17,$P(^TMP("DDSCLONE",$J,B),U)
 ;
 K DIR
 S DIR(0)="E"
 W ! D ^DIR K DIR
 I $D(DIRUT) S DDSQUIT=1
 W !
 Q
 ;
RENMSP ;Prompt for new namespace
 W !!,"The new form and blocks must be given unique names.",!
 ;
 K DIR
 S DIR(0)="Y",DIR("B")="YES"
 S DIR("A",1)="Give the new form and blocks the same names as the original,"
 S DIR("A")="but a different namespace"
 S DIR("?",1)="   Answer 'YES' if the original form and blocks are namespaced, and you want"
 S DIR("?")="   the new forms and blocks to have a different namespace."
 D ^DIR K DIR
 I $D(DIRUT) S DDSQUIT=1 Q
 I 'Y K DDSONSP,DDSNNSP Q
 ;
 K DIR
 W !!
 S DIR(0)="FA^1:30"
 S DIR("A")="Original namespace: "
 S DIR("?")="   Enter the namespace of the original form and blocks"
 D ^DIR K DIR
 I $D(DIRUT) S DDSQUIT=1 Q
 S DDSONS=Y
 ;
 K DIR,X,Y
 S DIR(0)="FA^1:30"
 S DIR("A")="     New namespace: "
 S DIR("?")="   Enter the namespace of the new form and blocks"
 D ^DIR K DIR
 I $D(DIRUT) S DDSQUIT=1 Q
 S DDSNNS=Y
 K X,Y
 Q
 ;
RENAME ;Prompt for new names
 N DDSBK,DDSBKDA
 D:'$D(IOST) HOME^%ZIS
 W @IOF
 W "Enter names for the new form and blocks."
 ;
 D RENFORM Q:DDSQUIT
 ;
 W !
 S DDSBKDA=0
 F  S DDSBKDA=$O(^TMP("DDSCLONE",$J,DDSBKDA))  Q:'DDSBKDA!DDSQUIT  D
 . S DDSBK=^TMP("DDSCLONE",$J,DDSBKDA)
 . D RENBLK(.DDSBK) Q:DDSQUIT
 . S ^TMP("DDSCLONE",$J,DDSBKDA)=DDSBK
 . S ^TMP("DDSCLONE",$J,"B",$P(DDSBK,U,2))=""
 ;
 Q
 ;
RENFORM ;Rename the form
 N DDSANS,DDSCOD
 F  D  Q:DDSANS]""!DDSQUIT
 . W !!,"Original form name: "_$P(DDSFORM,U,2)
 . W !,"     New form name: "
 . D EN^DIR0($S($Y>IOSL:IOSL-1,1:$Y),$X,30,1,$$NAME($P(DDSFORM,U,2),$G(DDSONS),$G(DDSNNS)),30,"","","",.DDSANS,.DDSCOD)
 . ;
 . I $P(DDSCOD,U)="TO"!(DDSANS=U) S DDSQUIT=1 Q
 . I DDSANS?1."?" W !!,"  Enter the name of the new form." S DDSANS=""
 . Q:DDSANS=""
 . S X=DDSANS X $P(^DD(.403,.01,0),U,5,999)
 . I '$D(X) S DDSANS="" W !!,$C(7)_"  Invalid name." Q
 . I $D(^DIST(.403,"B",DDSANS)) D  Q
 .. S DDSANS=""
 .. W !!,$C(7)_"  Form with this name already exists."
 Q:DDSQUIT
 ;
 S $P(DDSFORM,U,3)=DDSANS
 Q
 ;
RENBLK(DDSBK) ;Rename the blocks
 N DDSANS,DDSCOD
 F  D  Q:DDSANS]""!DDSQUIT
 . W !!,"Original block name: "_$P(DDSBK,U)
 . W !,"     New block name: "
 . D EN^DIR0($S($Y>IOSL:IOSL-1,1:$Y),$X,30,1,$$NAME($P(DDSBK,U),$G(DDSONS),$G(DDSNNS)),30,"","","",.DDSANS,.DDSCOD)
 . ;
 . I $P(DDSCOD,U)="TO"!(DDSANS=U) S DDSQUIT=1 Q
 . I DDSANS?1."?" W !!,"  Enter the name of the new form." S DDSANS=""
 . Q:DDSANS=""
 . S X=DDSANS X $P(^DD(.404,.01,0),U,5,999)
 . I '$D(X) S DDSANS="" W !!,$C(7)_"  Invalid name." Q
 . D:$D(^DIST(.404,"B",DDSANS))!$D(^TMP("DDSCLONE",$J,"B",DDSANS))
 .. S DDSANS=""
 .. W !!,$C(7)_"  Block with this name already exists."
 Q:DDSQUIT
 ;
 S $P(DDSBK,U,2)=DDSANS
 Q
 ;
NAME(NAME,ONS,NNS) ;Replace old namespace with new
 I $G(ONS)=""!($G(NNS)="") Q NAME
 I $P(NAME,ONS)]"" Q NAME
 Q NNS_$E(NAME,$L(ONS)+1,999)

DDSCLONF
DDSCLONF ;SFISC/MKO-CLONE A FORM ;15OCT2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D ASKCONT Q:DDSQUIT
 D CREATBK Q:DDSQUIT
 D CREATFM Q:DDSQUIT
 D EDITFM
 D INDEXFM
 K DDSNFRM
 Q
 ;
CREATBK ;Create blocks
 N DA,DIC
 W !!,"Creating new blocks ...",!
 S DDSBKDA=0
 F  S DDSBKDA=$O(^TMP("DDSCLONE",$J,DDSBKDA)) Q:'DDSBKDA!DDSQUIT  D
 . S DDSBK=^TMP("DDSCLONE",$J,DDSBKDA)
 . W !?2,$P(DDSBK,U,2)
 . K DIC,DD,DO
 . S DIC="^DIST(.404,",DIC(0)="QL",X=$P(DDSBK,U,2)
 . D FILE^DICN K DIC
 . I Y=-1 D  Q
 .. W !,$C(7)_"Attempt to create block "_$P(DDSBK,U,2)_" failed."
 .. S DDSQUIT=1
 . M ^DIST(.404,+Y)=^DIST(.404,DDSBKDA)
 . S $P(^DIST(.404,+Y,0),U)=$P(DDSBK,U,2)
 . W ?35,"#"_+Y
 . S $P(^TMP("DDSCLONE",$J,DDSBKDA),U,3)=+Y
 Q
 ;
CREATFM ;Create form
 N DA,DIC,DDSI,DDSJ
 W !!,"Creating new form ..."
 W !?2,$P(DDSFORM,U,3)
 K DIC
 S DIC="^DIST(.403,",DIC(0)="QL",X=$P(DDSFORM,U,3)
 D FILE^DICN K DIC
 I Y=-1 D  Q
 . W !,$C(7)_"Attempt to create form "_$P(DDSFORM,U,3)_" failed."
 . S DDSQUIT=1
 M ^DIST(.403,+Y)=^DIST(.403,+DDSFORM)
 S $P(^DIST(.403,+Y,0),U,5)=DT ;GFT  CREATE DATE IS TODAY!
 ;
 ;Kill page and block multiple indexes
 S DDSJ=" " F  S DDSJ=$O(^DIST(.403,+Y,40,DDSJ)) Q:DDSJ=""  D
 . K ^DIST(.403,+Y,40,DDSJ)
 S DDSI=0 F  S DDSI=$O(^DIST(.403,+Y,40,DDSI)) Q:'DDSI  D
 . S DDSJ=" "
 . F  S DDSJ=$O(^DIST(.403,+Y,40,DDSI,40,DDSJ)) Q:DDSJ=""  D
 .. K ^DIST(.403,+Y,40,DDSI,40,DDSJ)
 K @$$REF^DDS0(+Y)
 ;
 S $P(^DIST(.403,+Y,0),U)=$P(DDSFORM,U,3)
 W ?35,"#"_+Y
 S DDSNFRM=+Y
 Q
 ;
EDITFM ;Edit blocks used on new form
 W !!,"Repointing to new blocks ..."
 N DDSBK,DDSNBK,DDSPG
 S DDSPG=0 F  S DDSPG=$O(^DIST(.403,DDSNFRM,40,DDSPG)) Q:'DDSPG  D
 . S DDSBK=$P(^DIST(.403,DDSNFRM,40,DDSPG,0),U,2)
 . I DDSBK]"" D
 .. N DIE,DA,DR
 .. S DIE="^DIST(.403,"_DDSNFRM_",40,"
 .. S DA(1)=DDSNFRM,DA=DDSPG
 .. S DR="1////"_$P(^TMP("DDSCLONE",$J,DDSBK),U,3)
 .. D ^DIE
 . ;
 . N DA,DIK
 . S DIK="^DIST(.403,"_DDSNFRM_",40,"_DDSPG_",40,"
 . S DA(2)=DDSNFRM,DA(1)=DDSPG
 . S DDSBK=0
 . F  S DDSBK=$O(^DIST(.403,DDSNFRM,40,DDSPG,40,DDSBK)) Q:'DDSBK  D
 .. Q:$D(^TMP("DDSCLONE",$J,DDSBK))[0  S DDSNBK=$P(^(DDSBK),U,3)
 .. M ^DIST(.403,DDSNFRM,40,DDSPG,40,DDSNBK)=^DIST(.403,DDSNFRM,40,DDSPG,40,DDSBK)
 .. S $P(^DIST(.403,DDSNFRM,40,DDSPG,40,DDSNBK,0),U)=DDSNBK
 .. S DA=DDSBK
 .. D ^DIK
 Q
 ;
INDEXFM ;Index new form
 W !,"Reindexing new form ..."
 N DIK,DA
 S DIK="^DIST(.403,",DA=DDSNFRM
 D IX1^DIK
 ;
 D EN^DDSZ(DDSNFRM)
 Q
 ;
ASKCONT ;Final chance to abort
 K DIR S DIR(0)="Y"
 S DIR("A",1)=""
 S DIR("A")="Ready to clone form"
 S DIR("?")="  Enter 'Y' to clone form.  Enter 'N' to exit."
 D ^DIR K DIR
 S:$D(DIRUT)!'Y DDSQUIT=1
 Q

DDSCOM
DDSCOM ;SFISC/MLH-COMMAND UTILS ;12NOV2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
COM ;Command line prompt
 D:$G(@DDSREFT@("HLP"))>0 HLP^DDSMSG()
 N DDSCOM,DIR K DTOUT
 D SETUP(.DDSCOM,.X,.DIR)
 S DIR("?",1)=X
 S DIR("A")=$$EZBLD^DIALOG(8000),DIR("?",2)=" ",DIR("?")=$$EZBLD^DIALOG($S($G(DDSMOUSY):8000.101,1:8000.1)) ;'COMMAND' LINE & 'Enter a COMMAND'
 S DIR("??")="^D CHLP^DDSCOM"
 D:'$G(DDSKM)
 .K DDH,DDQ
 .F DDH=1:1:IOSL-DDSHBX-6 S DDH(DDH,"T")=" " ;ERASE EVERYTHING IN HELP AREA...
 .S DDH=DDH+1,DDH(DDH,"T")=DIR("?",1)
 .S DDH=DDH+1,DDH(DDH,"T")=DIR("?",2)
 .S DDH=DDH+1,DDH(DDH,"T")=DIR("?")
 .D SC^DDSU
 S DDM=1 K DDSKM
 S DIR0=IOSL-1_U_($L(DIR("A"))+1)_"^30^"_(IOSL-1)_"^0"
 D ^DIR K DUOUT,DIROUT,DIRUT
TRANS S:X?1A.E (X,Y,Y(0))=$E("ECSNRPQ",$F(DIR("X"),$E($$UP^DILIBF(X)))-1)
 M DDSMOUSE(IOSL-5)=DDSCOM ;...DOWN TO 'Exit  Save....'  REMEMBER WHERE THESE SHOW FOR MOUSE
 D:X="C"
 . S:DDACT="N" Y="c"
 . S Y(0)="CLOSE"
 . S:DDACT'="N" (X,Y,Y(0))=""
 Q
 ;
BOT ;from DIR0 & DIR02
 I DDS?.N1"^MSCXQSCR" Q  ;!!!!!!
 N X,XVIS,I,DIR,M,DIREPLIN
 S DY=IOSL-1,DX=0,$X=0 X IOXY W $P(DDGLCLR,DDGLDEL) ;Clear the bottom line
 S DIREPLIN=$P($$EZBLD^DIALOG(7002),U,$S($G(DIR0("REP")):2,1:1)) ;INSERT/REPLACE
 I '$G(DDSMOUSY) D
 .I DDO,'$G(DDM) W $$EZBLD^DIALOG(8000) ;**'COMMAND:'
 E  I DDO D
 .D SETUP(.M,.X,.DIR)
 .K DDSMOUSE(DY) M DDSMOUSE(DY)=M S DX=0 W X
 S X=$$EZBLD^DIALOG($G(DDSMOUSY)/10+8074),DX=IOM-$L(DIREPLIN)-3-$L(X) I DX>$X D  ;'F1-H FOR HELP' or 'HELP' if we have room
 . X IOXY
 . W $P(DDGLVID,DDGLDEL,10)_$P(DDGLVID,DDGLDEL,6)_X_$P(DDGLVID,DDGLDEL,10)
 .S DDSMOUSE(DY,DX,DX+$L(X)-1)="H^DIR0H"
 S DX=IOM-$L(DIREPLIN)-1 X IOXY
 W $S('$D(DDGLVAN):$P(DDGLVID,DDGLDEL,6),1:"")_DIREPLIN_$P(DDGLVID,DDGLDEL,10) ;INSERT/REPLACE
 S DDSMOUSE(DY,DX,DX+$L(DIREPLIN)-1)="RPM^DIR01" ;Make 'REPLACE' clickable
 Q
 ;
 ;
 ;
SETUP(DDSM,X,DIR) ;DDSM, DIR, & X are return variables
 ;DDSM shows mouse positions
 ;DIR is array
 ;X is writeable string
 K DDSM,DIR("X") N DDSCH,DDSPP,XVIS
 F X=1:1:7 S DDSCH(X)=$$EZBLD^DIALOG(X/100+8000),$E(DIR("X"),X)=$C($A(DDSCH(X))),DDSCH(X,0)=$C($A(DDSCH(X))+32)_":"_$$UP^DILIBF(DDSCH(X))
 S DDSPP=$$PP^DDS5(.X) I 'X S DDSPP="" ;Previous Page
 S X="" ;This will be the string of COMMANDs, with control sequences to highlight
 S XVIS="" ;just visible chars
 S DIR(0)="SO^"
 I DDSSC>1!$P(DDSSC(DDSSC),U,4) D  ;POP-UP PAGE.   IT ALSO DID THIS IF $G(DDSSEL)
 .D EXSANEXR(2,"CL"),EXSANEXR(5,"RF")
 .S DIR("B")=DDSCH(2) ;"Close" in Command Line
 E  D
 .D EXSANEXR(1,"EX") D:$D(DDSFDO)[0 EXSANEXR(3,"SV") D:DDSNP]"" EXSANEXR(4,"NP^DDS2") D:DDSPP]"" EXSANEXR(6,"PP") D EXSANEXR(5,"RF") D EXSANEXR(7,"QT")
 S X=$E(X,1,$L(X)-4)
 Q
EXSANEXR(N,JUMP) S DIR(0)=DIR(0)_DDSCH(N,0)_";",N=DDSCH(N),DDSM=$L(XVIS)
 S XVIS=XVIS_N_"    " ;BUILD 'Exit   Save   ...' STRING
 I $G(DDSMOUSY) S X=X_$$HIGH^DDSU(N)_"    "
 E  S X=XVIS
 S DDSM(DDSM,DDSM+$L(N)-1)=JUMP ;Mouse positions for each character of displayed text
 Q
 ;
 ;
 ;
CHLP ;
 K DDH,DDQ
 S DDH=0,DDS3CD=$P(DIR(0),U,2)
 F DDS3PC=1:1:$L(DDS3CD,";") D
 . S DDS3C=$C($A($P($P(DDS3CD,";",DDS3PC),":"))-32)
 . I "^E^C^S^N^R^P^Q^"[(U_DDS3C_U) D
 .. S DDH=DDH+1
 .. S DDH(DDH,"T")=$E($P($T(@("H"_DDS3C)),";",3)_"           ",1,11)_"- "_$$EZBLD^DIALOG($P($T(@("H"_DDS3C)),";",4)) ;**CC0/NI  THE DIFFERENT COMMAND-LINE RESPONSES
 D:DDH>0 SC^DDSU
 K DDS3C,DDS3CD,DDS3PC
 Q
HE ;;Exit;8000.11;**CCO/NI  CHANGED THRU BOTTOM OF ROUTINE
HC ;;Close;8000.12
HS ;;Save;8000.13
HN ;;Next Page;8000.14
HR ;;Refresh;8000.15
HP ;;Previous Page;8000.16
HQ ;;Quit;8000.17

DDSCOMP
DDSCOMP ;SFISC/MKO-EVALUATE COMPUTED EXPRESSIONS ;8:55 AM  12 Feb 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PARSE(DDP,EXP,BK,NEXP,AR,FDL) ;Parse the computed expression EXP
 ;Returns:
 ;  NEXP = EXP with {expr} replaced with DDSE(n)
 ;  AR   = array when executed sets DDSE(n)
 ;  FDL  = list of fields referenced
 N I,J,N,ST
 ;
 S NEXP="",(N,AR)=0,ST=1
 S I=0 F  D  Q:'I!$G(DIERR)
 . S I=$$FIND^DDSLIB(EXP,"{",I) Q:'I
 . S N=N+1
 . S NEXP=NEXP_$E(EXP,ST,I-2)_"DDSE("_N_")"
 . S ST=$$FIND^DDSLIB(EXP,"}",I)
 . D EVAL(DDP,$E(EXP,I,ST-2),BK,N,.AR,.FDL) Q:$G(DIERR)
 . S I=ST
 Q:$G(DIERR)
 S NEXP=$S(EXP?1"=".E:"S Y",1:"")_NEXP_$E(EXP,ST,999)
 ;
 S AR=N
 S:$G(FDL)]"" FDL=$E(FDL,1,$L(FDL)-1)
 Q
 ;
EVAL(DDP,EXP,BK,N,AR,FDL) ;Evaluate field expression
 ;In:
 ;  EXP = computed expr
 ;  N   = expr number -- index into DDSE()
 ;Out:
 ;  AR  = array of code that sets DDSE(n)
 ;  FDL = list of fields used in expr
 ;
 N CD
 D:EXP?1"FO(".E FO^DDSPTR(DDP,EXP,"","",BK,.CD,.FDL,1)
 D:EXP'?1"FO(".E DD^DDSPTR(DDP,EXP,"",.CD,.FDL,1)
 Q:$G(DIERR)
 ;
 I CD=1 S AR(N)="N X "_CD(1)_",DDSE("_N_")=X"
 E  D
 . F CD=1:1:CD S AR(N,CD)=CD(CD)
 . S AR(N,CD)=AR(N,CD)_",DDSE("_N_")=X"
 . S AR(N)="N DDSI,X S DDSE("_N_")="""" F DDSI=1:1:"_CD_" Q:DDSI>1&($G(X)'>0)!'$D(*DDSREFC*,DDSI))  X ^(DDSI)"
 Q
 ;
RPCF(DDSPG) ;Repaint computed fields
 ;Called from ^DDS01 and ^DDSVALF when value used in
 ;computed expression changes
 N DDSCBK,DDSCDDO
 ;
 S DDSCBK="" F  S DDSCBK=$O(@DDSREFS@("COMP",DDP,DDSFLD,DDSPG,DDSCBK)) Q:DDSCBK=""  D
 . I $P($G(@DDSREFS@(DDSPG,DDSCBK)),U,7)>1 D DB^DDSR(DDSPG,DDSCBK) Q
 . N DA,DDSDA
 . D GETDA(DDSPG,DDSCBK,.DA)
 . S DDSDA=$$DDSDA(.DA)
 . S DDSCDDO="" F  S DDSCDDO=$O(@DDSREFS@("COMP",DDP,DDSFLD,DDSPG,DDSCBK,DDSCDDO)) Q:DDSCDDO=""  D RPCF1
 ;
 Q
 ;
RPCF1 ;
 N DDSC,DDSE,DDSLEN,DDSX
 S DDSC=$G(@DDSREFS@(DDSPG,DDSCBK,DDSCDDO,"D")) Q:DDSC=""
 S DDSX=$$VAL(DDSCDDO,DDSCBK,DDSDA)
 ;
 S DY=+DDSC,DX=$P(DDSC,U,2),DDSLEN=$P(DDSC,U,3)
 I $P(DDSC,U,10) S DDSX=$J("",DDSLEN-$L(DDSX))_$E(DDSX,1,DDSLEN)
 E  S DDSX=$E(DDSX,1,DDSLEN)_$J("",DDSLEN-$L(DDSX))
 X IOXY
 W $P(DDGLVID,DDGLDEL)_DDSX_$P(DDGLVID,DDGLDEL,10)
 ;
 N DDP,DDSFLD
 S DDP=0,DDSFLD=DDSCDDO_","_DDSBK
 D:$D(@DDSREFS@("COMP",DDP,DDSFLD,DDSPG)) RPCF(DDSPG)
 ;
 Q
 ;
GETDA(P,B,DA) ;Get DA array of block
 N I K DA
 S DA=$G(@DDSREFT@(P,B)) Q:DA=""  Q:'$G(^(B,DA))
 F I=2:1:$L(DA,",")-1 S DA(I-1)=$P(DA,",",I)
 S DA=+DA
 Q
 ;
VAL(DDSDDO,DDSBK,DDSDA) ;Return value of computed field
 N DDSE,DDSX,Y
 I $D(DDSDA) N DA D DA(DDSDA,.DA)
 S DDSX=0 F  S DDSX=$O(@DDSREFS@("COMPE",DDSBK,DDSDDO,DDSX)) Q:DDSX=""  X ^(DDSX)
 K Y X $G(@DDSREFS@("COMPE",DDSBK,DDSDDO))
 Q $G(Y)
 ;
DA(DDSDA,DA) ;Return DA array based on DDSDA
 N I
 S DA=$P(DDSDA,",")
 F I=2:1:$L(DDSDA,",") S DA(I-1)=$P(DDSDA,",",I)
 Q
 ;
DDSDA(DA) ;Return DDSDA based on DA array
 N DDSDA,I
 I $G(DA)="" S DDSDA="0,"
 E  D
 . S DDSDA=DA_","
 . F I=1:1 Q:$G(DA(I))=""  S DDSDA=DDSDA_DA(I)_","
 Q DDSDA

DDSDBLK
DDSDBLK ;SFISC/MKO-DELETE UNUSED BLOCKS ;01:25 PM  11 Oct 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N %,D,DIAC,DIC,DIFILE,DIOVRD,X,Y
 D INIT
 S DDSFILE=$$FILE G:DDSFILE=-1 QUIT
 D SUB(+DDSFILE,DDSSUB),FINDB(DDSSUB,DDSBLK),PROC,QUIT
 Q
 ;
ALL ;Purge all unused blocks regardless of file
 N %,DIC,DIOVRD,X,Y
 K DDSFILE
 D INIT,FINDALL(DDSBLK),PROC,QUIT
 Q
 ;
PROC ;Delete blocks in @DDSBLK
 I '$D(@DDSBLK) D  Q
 . W !!!,"There are no unused blocks associated with this file."
 ;
 D REPORT
 D ASKDEL Q:DDSQUIT
 D ASKCONT Q:DDSQUIT
 ;
 ;Delete blocks
 D:$G(DDSDEL) DELNPR
 D:'$G(DDSDEL) DELPR
 W !!,"DONE!"
 Q
 ;
INIT ;Initialize variables
 S (DDSDEL,DDSQUIT)=0,DIOVRD=1
 S DDSBLK=$NA(^TMP("DDSDBLK",$J,"BLK"))
 S DDSSUB=$NA(^TMP("DDSDBLK",$J,"SUB"))
 K @DDSBLK,@DDSSUB
 Q
 ;
QUIT ;Cleanup
 K @DDSBLK,@DDSSUB
 K DDSBLK,DDSDEL,DDSFILE,DDSQUIT,DDSSUB
 K DDH,DIRUT,DIROUT,DTOUT,DUOUT
 Q
 ;
FINDB(DDSSUB,DDSBLK) ;Find blocks associated with a specific file
 N B,B0,N
 S B=0 F  S B=$O(^DIST(.404,B)) Q:'B  S B0=$G(^(B,0)) D
 . S N=$P(B0,U,2)
 . I N,$D(@DDSSUB@(N)),'$D(^DIST(.403,"AB",B)),'$D(^DIST(.403,"AC",B)) S @DDSBLK@(B)=$P(B0,U)
 Q
 ;
FINDALL(DDSBLK) ;Find all unused blocks
 N B,B0
 S B=0 F  S B=$O(^DIST(.404,B)) Q:'B  S B0=$G(^(B,0)) D
 . I '$D(^DIST(.403,"AB",B)),'$D(^DIST(.403,"AC",B)) D
 .. S @DDSBLK@(B)=$P(B0,U)
 Q
 ;
FILE() ;Prompt for form
 ;Select file
 N DIC,Y
EGP S DDS1=8108.1 D W^DICRW K DDS1 G:Y<0 FILEQ ;**CCO/NI  'PURGE UNUSED BLOCKS'
 S:'$D(@(DIC_"0)")) Y=-1
FILEQ Q Y
 ;
DELPR ;Delete blocks with prompting
 N DDSB
 W ! K DIK,DIR,DIRUT
 S DIR(0)="YA",DIR("B")="NO"
 S DIR("?")="  Enter 'Y' to delete, 'N' to keep."
 S DIK="^DIST(.404,"
 ;
 S DDSB=""
 F  S DDSB=$O(@DDSBLK@(DDSB)) Q:DDSB=""!DDSQUIT  D
 . S DIR("A")=$P(@DDSBLK@(DDSB),U)_$J("",30-$L($P(@DDSBLK@(DDSB),U)))_"Delete (Y/N)? "
 . D ^DIR S:$D(DIRUT) DDSQUIT=1 Q:'Y
 . S DA=DDSB D ^DIK
 K DA,DIR,DIK,DIRUT,DTOUT,DUOUT,DIROUT
 Q
 ;
DELNPR ;Delete blocks without prompting
 N DDSB
 W ! K DIK
 S DIK="^DIST(.404,"
 S DDSB=""
 F  S DDSB=$O(@DDSBLK@(DDSB)) Q:DDSB=""  D
 . W !,"Deleting block "_$P(@DDSBLK@(DDSB),U)_" (IEN #"_DDSB_") ..."
 . S DA=DDSB D ^DIK
 K DIK,DA
 Q
 ;
ASKDEL ;Ask if user wants to delete all unused blocks w/o confirmation
 W ! S DIR(0)="YA",DIR("B")="NO"
 S DIR("A",1)=""
 S DIR("A")="Delete all unused blocks without prompting (Y/N)? "
 S DIR("?",1)="  Enter 'Y' to delete unused blocks from the BLOCK file"
 S DIR("?",2)="    without confirmation."
 S DIR("?",3)=""
 S DIR("?")="  Enter 'N' to confirm each delete."
 D ^DIR K DIR I $D(DIRUT) S DDSQUIT=1 Q
 S DDSDEL=Y
 Q
 ;
ASKCONT ;Final chance to abort
 K DIR S DIR(0)="YA",DIR("B")="NO"
 S DIR("A",1)=""
 S DIR("A")="Continue (Y/N)? "
 S DIR("?")="  Enter 'Y' to delete form.  Enter 'N' to exit."
 D ^DIR K DIR
 S:$D(DIRUT)!'Y DDSQUIT=1
 Q
 ;
REPORT ;Print report
 N B
 W !!!
 W "  UNUSED BLOCKS"
 W:$D(DDSFILE) " ASSOCIATED WITH FILE "_$P(DDSFILE,U,2)_" (#"_$P(DDSFILE,U)_")"
 W !!,"  Internal"
 W !,"  Entry Number   Block Name"
 W !,"  ------------   ----------"
 ;
 S B="" F  S B=$O(@DDSBLK@(B)) Q:B=""  W !,"  "_B,?17,@DDSBLK@(B)
 Q
 ;
SUB(FN,OUT) ;
 ;Set OUT array for file number FN and all its subfiles
 N SUB
 I $D(^DD(FN)) S @OUT@(FN)=""
 S SUB="" F  S SUB=$O(^DD(FN,"SB",SUB)) Q:SUB=""  D SUB(SUB,OUT)
 Q

DDSDEL
DDSDEL ;SFISC/MKO-DELETE FORMS FOR A FILE ;24JUL2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
FORM(DDSFILE,DDSECHO) ;
 ;Delete all forms/blocks associated with file DDSFILE
 N DDSREF,DDSBLK,DDSBNAM,DDSFRM,DDSOFRM,DDSLN,DDSPDD,DDSPG
 N %,DIK,DIOVRD,DA,D0,X,Y
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIOVRD=1
 D SETUP,GETFORMS(DDSFILE,DDSREF)
 ;
 ;Delete forms
 W:DDSECHO !?3,"Deleting the FORMS..."
 S DDSFRM="",DIK="^DIST(.403,"
 F  S DDSFRM=$O(@DDSREF@("FRM",DDSFRM)) Q:'DDSFRM  S DA=DDSFRM D ^DIK
 K DIK,DA
 ;
 ;Delete blocks
 W:DDSECHO !?3,"Deleting the BLOCKS..."
 S DDSBLK="",DIK="^DIST(.404,"
 F  S DDSBLK=$O(@DDSREF@("BLK",DDSBLK)) Q:'DDSBLK  D
 . S DDSLN=@DDSREF@("BLK",DDSBLK)
 . S DDSBNAM=$P(DDSLN,U),DDSOFRM=$P(DDSLN,U,2),DDSPDD=$P(DDSLN,U,3)
 . ;
 . I DDSOFRM,DDSPDD D
 .. I DDSECHO D
 ... W !!?3,$C(7)_"***  Warning  ***"
 ... W !!?3,"Block "_DDSBNAM_" (#"_DDSBLK_")"
 ... W !?3,"was deleted from the Block file."
 ... W !!?3,"I'm deleting pointers to that block from"
 .. S DDSFRM=""
 .. F  S DDSFRM=$O(@DDSREF@("BLK",DDSBLK,DDSFRM)) Q:'DDSFRM  D
 ... W:DDSECHO !?6,"Form "_$P(^DIST(.403,DDSFRM,0),U)_" (#"_DDSFRM_") ..."
 ... D DELBLK(DDSBLK,DDSFRM)
 .. W:DDSECHO !!?3,"The above form(s) need to be redesigned.",!
 . ;
 . E  I 'DDSOFRM D
 .. S DA=DDSBLK D ^DIK
 ;
QUIT ;Cleanup and quit
 K @DDSREF
 Q
 ;
SETUP ;Setup local variables
 S:$D(DDSECHO)[0 DDSECHO=0
 S DDSREF="^TMP(""DDSDEL"","""_$J_""")" ;IF $J IS NOT NUMERIC
 K @DDSREF
 Q
 ;
GETFORMS(FILE,REF) ;
 ;Get all forms and blocks associated with file number FILE
 ;and all subfiles associated with FILE
 ;Put results in
 ;  @REF@("DD",file#)         = null
 ;       ("FRM",form#)        = form name
 ;       ("BLK",block#)       = block name^used on forms not being
 ;                              deleted^dd of block is being deleted
 ;       ("BLK",block#,form#) = null for all blocks that are found
 ;                              on a form not being deleted
 ;
 N B,F,P,FNAM
 ;Get DDs of file and subfiles
 D DD(FILE,REF)
 ;
 ;Get all forms associated with file
 S FNAM="" F  S FNAM=$O(^DIST(.403,"F"_FILE,FNAM)) Q:FNAM=""  D
 . S F="" F  S F=$O(^DIST(.403,"F"_FILE,FNAM,F)) Q:F=""  D
 .. Q:$D(^DIST(.403,F,0))[0
 .. S @REF@("FRM",F)=$P(^DIST(.403,F,0),U)
 ;
 ;Get all blocks associated with each form
 S F="" F  S F=$O(@REF@("FRM",F)) Q:F=""  D
 . S P=0 F  S P=$O(^DIST(.403,F,40,P)) Q:'P  D
 .. S B=$P($G(^DIST(.403,F,40,P,0)),U,2)
 .. I B D SETBLK(B,REF)
 .. S B=0 F  S B=$O(^DIST(.403,F,40,P,40,B)) Q:'B  D SETBLK(B,REF)
 Q
 ;
SETBLK(B,REF) ;
 ;Put block info into @REF
 N B0
 S B0=$G(^DIST(.404,B,0)) Q:B0?."^"
 S @REF@("BLK",B)=$P(B0,U)_U_$$OTHER(B,REF)_U_($D(@REF@("DD",+$P(B0,U,2)))#2)
 Q
 ;
DELBLK(DDSBLK,DDSFRM) ;
 ;Delete block DDSBLK from form DDSFRM
 N DIK,DA,D0
 S DDSPG=0 F  S DDSPG=$O(^DIST(.403,DDSFRM,40,DDSPG)) Q:'DDSPG  D
 . I $D(^DIST(.403,DDSFRM,40,DDSPG,40,"B",DDSBLK)) D
 .. S DIK="^DIST(.403,"_DDSFRM_",40,"_DDSPG_",40,"
 .. S DA(2)=DDSFRM,DA(1)=DDSPG,DA=DDSBLK
 .. D ^DIK
 Q
 ;
DD(F,REF,K) ;
 ;Put file # and all its subfile #s into array @REF@("DD")
 ;Kill REF first if $G(K)=""
 N SB
 K:$G(K)="" @REF@("DD")
 S @REF@("DD",F)=""
 S SB="" F  S SB=$O(^DD(F,"SB",SB)) Q:SB=""  D DD(SB,REF,1)
 Q
 ;
OTHER(B,REF) ;
 ;Is block B found on forms other than what's in @REF@("FRM",F)=""
 ;If so, put form numbers in @REF@("BLK",B,F)
 N F,O,C
 S O=0,F=""
 F C="AB","AC" F  S F=$O(^DIST(.403,C,B,F)) Q:F=""  D
 . I $D(@REF@("FRM",F))[0 S O=1,@REF@("BLK",B,F)=""
 Q O

DDSDFRM
DDSDFRM ;SFISC/MKO-DELETE A FORM ;11:22 AM  4 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N %,DIC,DIOVRD,X,Y
 D INIT
 S (DDSDEL,DDSQUIT)=0
 ;
 S DDSFORM=$$FORM G:DDSFORM=-1 QUIT
 ;
 D GETBLKS
 D REPORT
 I $D(@DDSBLK) D ASKDEL G:DDSQUIT QUIT
 D ASKCONT G:DDSQUIT QUIT
 ;
 ;Delete form
 W !!,"Deleting form "_$P(DDSFORM,U,2)_" (IEN #"_+DDSFORM_") ..."
 S DIK="^DIST(.403,",DA=+DDSFORM
 D ^DIK K DIK,DA
 ;
 ;Delete blocks
 I DDSDEL D:'$G(DDSDEL(1)) DELPR D:$G(DDSDEL(1)) DELNPR
 W !!,"DONE!"
 D QUIT
 Q
 ;
EN(DDSFORM) ;Delete form number DDSFORM
 N %,DA,DDSB,DDSBLK,DIC,DIK,DIOVRD,X,Y
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 D INIT
 D GETBLKS
 ;
 ;Delete form
 S DIK="^DIST(.403,",DA=+DDSFORM
 D ^DIK K DIK,DA
 ;
 ;Delete blocks
 S DIK="^DIST(.404,"
 S DDSB="" F  S DDSB=$O(@DDSBLK@(DDSB)) Q:DDSB=""  D
 . Q:$P(@DDSBLK@(DDSB),U,2)
 . S DA=DDSB D ^DIK
 ;
 K @DDSBLK
 Q
 ;
INIT ;Setup
 S DIOVRD=1
 S DDSBLK=$NA(^TMP("DDSDFRM",$J,"BLK"))
 K @DDSBLK
 Q
 ;
QUIT ;Cleanup
 K @DDSBLK
 K DDSBLK,DDSDEL,DDSFILE,DDSFORM,DDSQUIT
 K DDH,DIRUT,DIROUT,DTOUT,DUOUT
 Q
 ;
FORM() ;Prompt for form
 ;Select file
 N D,DIC
EGP S DDS1=8108.2 D W^DICRW K DDS1 G:Y<0 FORMQ ;**CCO/NI  'DELETE FORM'
 I '$D(@(DIC_"0)")) S Y=-1 G FORMQ
 S DDSFILE=Y
 ;
 ;Select form
 W ! K DIC
 S DIC="^DIST(.403,",DIC(0)="QEAM"
 S DIC(0)="QEA",D="F"_+DDSFILE
 S DIC("S")="I $P(^(0),U,8)=+DDSFILE"
 S DIC("A")="Select FORM to delete: "
 S DIC("W")=$P($T(DICW),";",3,999)
DICW ;;N %G S %G=^(0) W:$X>35 ! W ?35,"#"_Y N Y S Y=$P(%G,U,5) W:Y]"" ?43,$$OUT^DIALOGU(Y,"FMTE","2D") S Y=$P(%G,U,4) W:Y]"" ?53," User #"_Y S Y=$P(%G,U,8) W:Y]"" ?65," File #"_Y ;**CCO/NI   NICE DATE FORMAT
 D IX^DIC
 ;
FORMQ Q Y
 ;
GETBLKS ;Get all blocks on form
 ; @DDSBLK@(bk#)=Block name^flag (1=used on other forms)
 ;
 N P,B
 S P=0 F  S P=$O(^DIST(.403,+DDSFORM,40,P)) Q:'P  D
 . S B=$P(^DIST(.403,+DDSFORM,40,P,0),U,2)
 . I B]"",'$D(@DDSBLK@(B)) D
 .. S @DDSBLK@(B)=$P($G(^DIST(.404,B,0)),U)_U_$$COMMON(B,+DDSFORM)
 . S B=0
 . F  S B=$O(^DIST(.403,+DDSFORM,40,P,40,B)) Q:'B  D:'$D(@DDSBLK@(B))
 .. S @DDSBLK@(B)=$P($G(^DIST(.404,B,0)),U)_U_$$COMMON(B,+DDSFORM)
 Q
 ;
DELPR ;Delete blocks with prompting
 N DDSB
 W ! K DIK,DIR,DIRUT
 S DIR(0)="YA",DIR("B")="NO"
 S DIR("?")="  Enter 'Y' to delete, 'N' to keep."
 S DIK="^DIST(.404,"
 ;
 S DDSB=""
 F  S DDSB=$O(@DDSBLK@(DDSB)) Q:DDSB=""!DDSQUIT  D
 . Q:$P(@DDSBLK@(DDSB),U,2)
 . S DIR("A")=$P(@DDSBLK@(DDSB),U)_$J("",30-$L($P(@DDSBLK@(DDSB),U)))_"Delete (Y/N)? "
 . D ^DIR S:$D(DIRUT) DDSQUIT=1 Q:'Y
 . S DA=DDSB D ^DIK
 K DA,DIR,DIK,DIRUT,DTOUT,DUOUT,DIROUT
 Q
 ;
DELNPR ;Delete blocks without prompting
 N DDSB
 W ! K DIK
 S DIK="^DIST(.404,"
 S DDSB=""
 F  S DDSB=$O(@DDSBLK@(DDSB)) Q:DDSB=""  D
 . Q:$P(@DDSBLK@(DDSB),U,2)
 . W !,"Deleting block "_$P(@DDSBLK@(DDSB),U)_" (IEN #"_DDSB_") ..."
 . S DA=DDSB D ^DIK
 K DIK,DA
 Q
 ;
ASKDEL ;Ask if user wants to delete all the blocks on this form
 K DIR W ! S DIR(0)="YA",DIR("B")="YES"
 S DIR("A",1)=""
 S DIR("A",2)="Delete all deletable blocks used on form "_$P(DDSFORM,U,2)
 S DIR("A")="from the BLOCK file (Y/N)? "
 S DIR("?",1)="  Enter 'Y' to delete blocks used on form"
 S DIR("?",2)="    "_$P(DDSFORM,U,2)_" from the BLOCK file."
 S DIR("?",3)="    (Only blocks not used on other forms can be deleted.)"
 S DIR("?",4)=""
 S DIR("?")="  Enter 'N' to delete the form but not the blocks."
 D ^DIR K DIR I $D(DIRUT) S DDSQUIT=1 Q
 S DDSDEL=Y Q:'DDSDEL
 ;
 ;Ask if user wants to delete without prompting
 W ! S DIR(0)="YA",DIR("B")="NO"
 S DIR("A",1)=""
 S DIR("A")="Delete blocks without prompting (Y/N)? "
 S DIR("?",1)="  Enter 'Y' to delete blocks from the BLOCK file"
 S DIR("?",2)="    without confirmation."
 S DIR("?",3)=""
 S DIR("?")="  Enter 'N' to confirm each delete."
 D ^DIR K DIR I $D(DIRUT) S DDSQUIT=1 Q
 S DDSDEL(1)=Y
 Q
 ;
ASKCONT ;Final chance to abort
 K DIR S DIR(0)="YA",DIR("B")="NO"
 S DIR("A",1)=""
 S DIR("A")="Continue (Y/N)? "
 S DIR("?")="  Enter 'Y' to delete form.  Enter 'N' to exit."
 D ^DIR K DIR
 S:$D(DIRUT)!'Y DDSQUIT=1
 Q
 ;
REPORT ;Print report
 N B
 W !!! I '$D(@DDSBLK) W "There are no blocks on this form." Q
 W "  BLOCKS USED ON FORM """_$P(DDSFORM,U,2)_""" (IEN #"_+DDSFORM_")"
 W !!,"  Internal",?50,"Used on"
 W !,"  Entry Number   Block Name",?50,"Other Forms?   Deletable?"
 W !,"  ------------   ----------",?50,"------------   ----------"
 ;
 S B="" F  S B=$O(@DDSBLK@(B)) Q:B=""  D
 . W !,"  "_B,?17,$P(@DDSBLK@(B),U),?54
 . W $S($P(@DDSBLK@(B),U,2):"YES",1:"NO")
 . W ?68,$S($P(@DDSBLK@(B),U,2):"NO",1:"YES")
 Q
 ;
COMMON(B,F) ;Is block B found on forms other than F
 N C,F1
 S C=0,F1=""
 F  S F1=$O(^DIST(.403,"AB",B,F1)) Q:F1=""  I F1'=F S C=1 Q
 I 'C S F1="" F  S F1=$O(^DIST(.403,"AC",B,F1)) Q:F1=""  I F1'=F S C=1 Q
 Q C

DDSFO
DDSFO ;SFISC/MKO-FORM ONLY FIELDS ;1:52 PM  19 Jun 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DIR ;Setup input variables to DIR
 N I,J
 S DIR(0)=$P(DDSO(20),U)_$P(DDSO(20),U,2,3)
 S:DIR(0)?1"DD".E DIR(0)=$P(DIR(0),U,2,999)
 S:$P(DIR(0),U)'["O" $P(DIR(0),U)=$P(DIR(0),U)_"O"
 I $P(DIR(0),U)["P",$P($P(DIR(0),U,2),":",2)'["Z" D
 . S I=$P(DIR(0),U,2) Q:$P(I,":",2)["Z"
 . S $P(I,":",2)=$P(I,":",2)_"Z"
 . S $P(DIR(0),U,2)=I
 S:$G(^DIST(.404,DDSBK,40,DDO,22))'?."^" $P(DIR(0),U,3)=^(22)
 I $D(^DIST(.404,DDSBK,40,DDO,21)) D
 . S (I,J)=0
 . F  S I=$O(^DIST(.404,DDSBK,40,DDO,21,I)) Q:I=""  I $D(^(I,0))#2 S J=J+1,DIR("?",J)=^(0)
 . I J>0 S DIR("?")=DIR("?",J) K DIR("?",J)
 X:$G(^DIST(.404,DDSBK,40,DDO,24))'?."^" ^(24)
 Q

DDSIT
DDSIT ;SFISC/MKO-INPUT TRANSFORMS ;09:07 AM  24 Oct 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PFIELD ;Input transform for the PARENT FIELD field of the PAGE multiple
 ;of the Form file.
 N DDSMF
 S DDSMF=$$GETFLD^DDSLIB($P(X,","),$P(X,",",2),$P(X,",",3),DA(1))
 G QUIT
 ;
PLINK ;Input transform for POINTER LINK field of the BLOCK multiple of
 ;the PAGE MULTIPLE of the Form file.
 N DDP,DDSCD,DDSERR,DDS
 ;
 S DDP=$P($G(^DIST(.403,DA(2),0)),U,8)
 I 'DDP D  G QUIT
 . N P
 . S P(1)="PRIMARY FILE",P(2)="FORM"
 . D BLD^DIALOG(3011,.P)
 ;
 S DDS=DA(2)_U_$P(^DIST(.403,DA(2),0),U)
 D:X?1"FO(".E FO^DDSPTR(DDP,X,DA(2),DA(1))
 D:X'?1"FO(".E DD^DDSPTR(DDP,X,DA)
 G QUIT
 ;
CEXPR ;Input transform for COMPUTED EXPRESSION field
 N DDP,DDSX,DDSNEXP
 S DDP=$P($G(^DIST(.404,DA(1),0)),U,2)
 D PARSE^DDSCOMP(DDP,X,DA(1),.DDSNEXP) G:$G(DIERR) QUIT
 ;
 S DDSX=X,X=DDSNEXP D ^DIM S:$D(X) X=DDSX
 Q
 ;
QUIT ;Check error and quit
 I $G(DIERR) N DDSERR D MSG^DIALOG("AB",.DDSERR),EN^DDIOL(.DDSERR) K X
 Q

DDSLIB
DDSLIB ;SFISC/MKO-LIBRARY FUNCTIONS ;11:55 AM  14 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FIND(E,C,S) ;Find in expression E, starting from pos S, the char pos
 ;after the next occurrence of char C, ignoring those within quoted
 ;strings.
 N I,J,P
 S:'$D(S) S=1
 F  D  Q:$D(P)
 . S I=$F(E,C,S),J=$F(E,"""",S)
 . I 'I S P=I Q
 . I J,J<I S S=$$AFTQ(E,J-1) Q
 . S P=I
 Q P
 ;
PIECE(E,C,N1,N2) ;Return the N1th to N2th C-piece of E
 ;ignoring those within quoted strings
 ;Start looking from pos 1
 N I,J,S,F
 S:'$D(N1) N1=1 Q:'N1
 S:'$D(N2) N2=N1 Q:N2<N1
 S S=1 F I=1:1:N1-1 S S=$$FIND(E,C,S) Q:'S
 Q:'S $S(N1=1:E,1:"")
 S F=S F I=1:1:N2-N1+1 S F=$$FIND(E,C,F) Q:'F
 Q:'F $E(E,S,999)
 Q $E(E,S,F-2)
 ;
RPAR(E,S) ;Find in expression E, from char pos S (the position
 ;of the left paren) the char pos after the right paren,
 ;ignoring nested parens, or parens within quotes
 N I,L,P,R
 S P=1,I=S+1
 F  D  Q:'P
 . S R=$$FIND(E,")",I),L=$$FIND(E,"(",I)
 . I L,L<R S P=P+1,I=L Q
 . S P=P-1,I=R
 Q I
 ;
AFTQ(E,I) ;Return character position after quoted string
 ;E = string, I=character position of first quote
 S:'$G(I) I=1
 F  S I=$F(E,"""",I+1) Q:$E(E,I)'=""""
 S:'I I=$L(E)+1
 Q I
 ;
QT(X) ;Return X quoted
 Q:$G(X)="" """"""
 S X(X)="",X=$Q(X(""))
 Q $E(X,3,$L(X)-1)
 ;
UQT(X) ;Return quoted string X unquoted
 Q:$G(X)="" ""
 S @("X("_X_")=""""")
 Q $O(X(""))
 ;
FIELD(DDP,FLD) ;Get field number
 N F,P
 I FLD="" D BLD^DIALOG(202,"field") Q ""
 S:$E(FLD)="""" FLD=$$UQT($E(FLD,1,$$AFTQ(FLD)-1))
 S F=FLD,P("FILE")=DDP
 I FLD'=+$P(FLD,"E") D  Q:$G(DIERR) ""
 . S F=$O(^DD(DDP,"B",FLD,""))
 . I F="" S P(1)=FLD D BLD^DIALOG(501,.P)
 ;
 I $D(^DD(DDP,F,0))[0 S P(1)="#"_F D BLD^DIALOG(501,.P) Q ""
 Q F
 ;
GETFLD(FD,BK,PG,DDS,DDSPG,DDSBK,DDSFLG) ;Return "DDO,bk#,pg#"
 ;DDSPG=current page, DDSBK=current block
 ; -- when block and page are optional
 ;PG is required only if block order is sent
 ;DDSFLG["F" means field must be form-only
 N F,B,P,N
 I FD?.N.1"."1.N1",".N.1"."1.N,BK="",PG="" Q FD
 S:$E($G(FD))="""" FD=$$UQT(FD)
 S:$E($G(BK))="""" BK=$$UQT(BK)
 S:$E($G(PG))="""" PG=$$UQT(PG)
 S P=+$G(DDSPG),B=+$G(DDSBK)
 D @$S($G(PG)]"":"PG",$G(BK)]"":"BK",1:"FD") Q:$G(DIERR) ""
 Q F_","_B_","_P
 ;
PG ;Get internal page number
 I '$G(DDS) D BLD^DIALOG(3084) Q
 S N=PG=+$P(PG,"E")
 I N S P=$O(^DIST(.403,+DDS,40,"B",PG,""))
 E  I PG?1"`".N.1"."1.N S P=+$P(PG,"`",2),N=2
 E  S P=$O(^DIST(.403,+DDS,40,"C",$$UPCASE(PG),""))
 ;
 I $D(^DIST(.403,+DDS,40,+P,0))[0 D BLD^DIALOG(3023,$S(N=2:"#",N:"number ",1:"named ")_PG) Q
 ;
 I BK="" D  Q:$G(DIERR)
 . S BK=$O(^DIST(.403,+DDS,40,P,40,"AC",""))
 . I BK="" D BLD^DIALOG(3055,$S(N:"number ",1:"named ")_PG)
 ;
BK ;Get internal block number
 S N=BK=+$P(BK,"E")
 I N D  Q:$G(DIERR)
 . I P S B=$O(^DIST(.403,+DDS,40,P,40,"AC",BK,"")) Q
 . D BLD^DIALOG(3085)
 E  I BK?1"`".N.1"."1.N S B=+$P(BK,"`",2),N=2
 E  D  Q:$G(DIERR)
 . S B=$O(^DIST(.404,"B",BK,""))
 . I B="" D BLD^DIALOG(3051,BK) Q
 . S B=$O(^DIST(.403,+DDS,40,P,40,"B",B,""))
 ;
 I P,$D(^DIST(.403,+DDS,40,P,40,+B,0))[0 D  Q
 . N P1
 . S P1(1)=$S(N=2:"#",N:"order ",1:"")_BK
 . S P1(2)="number "_$P(^DIST(.403,+DDS,40,P,0),U)_$S($G(^(1))]"":" ("_$P(^(1),U)_")",1:"")
 . D BLD^DIALOG(3053,.P1)
 ;
 I FD="" D  Q:$G(DIERR)
 . S FD=$O(^DIST(.404,B,40,"B",""))
 . D:FD="" BLD^DIALOG(3071,$P(^DIST(.404,B,0),U))
 ;
FD ;Get internal field number
 I 'B D BLD^DIALOG(3082) Q
 S N=FD=+$P(FD,"E")
 I N S F=$O(^DIST(.404,B,40,"B",FD,""))
 E  I FD?1"`".N.1"."1.N S F=+$P(FD,"`",2),N=2
 E  D  Q:$G(DIERR)
 . N X
 . S FD=$$UPCASE(FD),X=$S($D(^DIST(.404,B,40,"D",FD)):"D",1:"C")
 . S F=$O(^DIST(.404,B,40,X,FD,""))
 ;
 I $D(^DIST(.404,B,40,+F,0))[0 D
 . N P
 . S P(1)=$S(N=2:"#",N:"order ",1:"with caption or unique name ")_FD
 . S P(2)=$P(^DIST(.404,B,0),U)
 . D BLD^DIALOG(3072,.P)
 ;
 I '$G(DIERR),$G(DDSFLG)["F","^2^4^"'[(U_$P($G(^DIST(.404,B,40,+F,0)),U,3)_U) D BLD^DIALOG(3081)
 Q
 ;
UPCASE(X) ;
 ;Return X in uppercase
 Q $$UP^DILIBF(X)  ;**

DDSM
DDSM ;SFISC/MKO-MULTILINE ;24JUNE2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MNAV(FND) ;Navigate within repeating blocks
 ;Returns FND if navigating to another field within the repeating
 ;block
 N DDSCL,DDSDDO,DDSNR,DDSPDA,DDSSN,DDSSTL
 S DDSDDO=$P(DDSU("N"),U,$L($P("U^D^R^L^N",DDACT),U)+5)
 ;
 S DDSPDA=$P(DDSREP,U),DDSSTL=$P(DDSREP,U,2),DDSCL=$P(DDSREP,U,3)
 S DDSSN=$P(DDSREP,U,4),DDSNR=$P(DDSREP,U,5)
 ;
 I $P(DDSDDO,",",2)="-1" D MUP Q
 I $P(DDSDDO,",",2)="+1" D MDN Q
 I DA S DDO=+DDSDDO,FND=1 Q
 Q
 ;
MUP ;Move up a line
 Q:DDSSN'>1
 S DDSSN=DDSSN-1
 I DDSCL>1 D
 . S DDSCL=DDSCL-1 D MDA
 E  D
 . S DDSSTL=DDSSTL-1
 . D MDA,DB^DDSR(DDSPG,DDSBK)
 Q
 ;
MDN ;Move down a line
 Q:'DA
 S DDSSN=DDSSN+1
 I DDSCL<DDSNR D
 . S DDSCL=DDSCL+1 D MDA
 E  D
 . S DDSSTL=DDSSTL+1 ;ADD ONE TO WHAT THE TOP LINE NUMBER IS NOW
 . D MDA,DB^DDSR(DDSPG,DDSBK)
 Q
 ;
MDA ;Update DDO, DA and Dn, set FND=1
 N DDSDASV
 S $P(DDSREP,U,2,4)=DDSSTL_U_DDSCL_U_DDSSN
 S $P(@DDSREFT@(DDSPG,DDSBK,DDSPDA),U,2,999)=DDSREP
 S DDSDASV=DDSDA
 S DDSDA=$G(@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN),"0,"_$P(DDSDA,",",2,999))
 S DA=+DDSDA,@("D"_DDSDL)=DA
 S DDO=$S(DA:+DDSDDO,1:$P(DDSREP,U,8))
 S FND=1
 Q
 ;
SEL ;Issue read
 N DIRUT
 S DIR(0)="PO"_DIE_":QEMZ"_$E("L",'$D(DDSTP)&'$P(^DIST(.403,+DDS,40,DDSPG,40,DDSBK,2),U,4))_$E("V",$P(^(2),U,6))
 I $P(DDSREP,U,7) D  ;Multiple Field
 . N DDSMSPEC S DDSMSPEC=$P(^DD($P(DDSREP,U,6),$P(DDSREP,U,7),0),U,2)
 . I $D(@(DIE_"0)"))[0 S ^(0)=U_DDSMSPEC_U_U
 . E  I $P(@(DIE_"0)"),U,2)'=DDSMSPEC S $P(^(0),U,2)=DDSMSPEC
 . I $P(DDSREP,U,9)]"" D
 .. N DDSROOT,DDSSUB
 .. S DDSROOT=$NA(@DDSREFT@(DDSPG,DDSBK,$P(DDSREP,U),"B"))
 .. S DDSSUB="Y_"",""_"""_$P(DDSREP,U)_""""
 .. S DDSROOT=$E(DDSROOT,1,$L(DDSROOT)-1)_","_DDSSUB_")"
 .. S DIR("S")="I $D("_DDSROOT_")"
GFT E  I $G(@DDSREFT@(DDSPG,DDSBK,"COMP MUL")) D
 .S DIR("S")="I +$O(@DDSREFT@(""F"_^("COMP MUL")_""",+Y_""+""))=+Y"
 E  N DDSLASCN D  ;Backwards pointer
 . S DDSLASCN=$NA(@(DIE_""""_$P(DDSREP,U,9)_""","_+$P(DDSREP,U)_")"))
 . S DIR("S")="X ""I 0"" N R,S S (R,S)=DDSLASCN F  S R=$Q(@R) Q:R=""""!($NA(@R,"_$QL(DDSLASCN)_")'=S)  I $QS(R,$QL(R))=Y Q"
 D ^DIR K DIR,DUOUT,DIROUT Q:DIR0N!$D(DIRUT)
 ;
 S DA=+Y,$P(DDSDA,",")=DA,@("D"_DDSDL)=DA
 I $P(Y,U,3)=1 D  ;We've added a new one
 . N DDSFN,DDSLN,DDSPDA,DDSSN
 . S DDSPDA=$P(DDSREP,U),DDSLN=$P(DDSREP,U,3),DDSSN=$P(DDSREP,U,4)
 . S DDSFN=+$P(@DDSREFS@(DDSPG,DDSBK),U,3)
 . ;
STUFF .I '$P(DDSREP,U,7),DDSREP>0,'$G(@DDSREFT@(DDSPG,DDSBK,"COMP MUL")) D  ;If this is top level of a pointing file, stuff the pointer back to where we came from
 .. N DR,X,Y
 .. S Y=$P(DDSREP,U,9) Q:Y=""
 .. S DR=$O(^DD(DDSFN,0,"IX",Y,DDSFN,""))_"////"_+DDSREP Q:'DR
 .. D ^DIE
 . ;
 . D ADD(DDSDA,DDSPDA,DDSSN)
 . S DDSFN="F"_DDSFN
 . D DMULT1^DDSR(DDSPG,DDSBK,DDSFN,DDSDA,DDSLN,DDSSN)
 . S DDSCHKQ=2
 E  D
 . S DDSCHKQ=1
 . D POSDA(DDSDA) ;They have entered something already on the muliple display. Jump to it.
 ;
 S Y=$P(Y,U)
 S:X="" Y=""
 Q
 ;
END ;
 S DDACT="N"
 Q:'DA
 D POSSN(999999999999)
 Q
 ;
PGDN ;Page down
 S DDACT="N"
 I 'DA D
 . I DDSNP]"" S DDSPG=DDSNP,DDACT="NP"
 E  D POSSN($P(DDSREP,U,2)+$P(DDSREP,U,5))
 Q
 ;
PGUP ;Page up
 S DDACT="N"
 I $P(DDSREP,U,4)=1 D
 . S DDSPG=$$PP^DDS5(.Y)
 . S:Y=1 DDACT="NP"
 E  D POSSN($P(DDSREP,U,2)-$P(DDSREP,U,5))
 Q
 ;
POSSN(DDSSN,DDSPAINT) ;Make line with given DDSSN current
 N DDSLSN,DDSPDA,DDSSTL
 S DDSPDA=$P(DDSREP,U)
 S DDSSTL=$P(DDSREP,U,2)
 ;
 S DDSLSN=$O(@DDSREFT@(DDSPG,DDSBK,DDSPDA," "),-1)+1
 S DDSSN=$$MIN(DDSLSN,DDSSN)
 S:DDSSN<1 DDSSN=1
 ;
 S DDSDA=$G(@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN),"0,"_$P(DDSDA,",",2,999))
 S DA=+DDSDA,@("D"_DDSDL)=DA
 ;
 S:'DA DDO=$P(DDSREP,U,8)
 I DDSSN'<DDSSTL,DDSSN<(DDSSTL+$P(DDSREP,U,5)) D
 . S $P(DDSREP,U,3,4)=DDSSN-DDSSTL+1_U_DDSSN
 . S $P(@DDSREFT@(DDSPG,DDSBK,DDSPDA),U,2,999)=DDSREP
 . D:$G(DDSPAINT) DB^DDSR(DDSPG,DDSBK)
 E  D
 . S DDSSTL=$$MIN(DDSLSN-$P(DDSREP,U,5)+1,DDSSN)
 . S:DDSSTL<1 DDSSTL=1
 . S $P(DDSREP,U,2,4)=DDSSTL_U_(DDSSN-DDSSTL+1)_U_DDSSN
 . S $P(@DDSREFT@(DDSPG,DDSBK,DDSPDA),U,2,999)=DDSREP
 . D DB^DDSR(DDSPG,DDSBK)
 Q
 ;
POSDA(DDSDA,REWRITE) ;Make line with given DDSDA current  REWRITE called from DDS01 if the line we read from is not empty
 N DDSPDA,DDSSN,DDSSTL
 S DDSSN=@DDSREFT@(DDSPG,DDSBK,$P(DDSREP,U),"B",DDSDA)
 S DDSPDA=$P(DDSREP,U),DDSSTL=$P(DDSREP,U,2)
 ;
 I DDSSN'<DDSSTL,DDSSN<(DDSSTL+$P(DDSREP,U,5)) D
 . S $P(DDSREP,U,3,4)=DDSSN-DDSSTL+1_U_DDSSN
 . S $P(@DDSREFT@(DDSPG,DDSBK,DDSPDA),U,2,999)=DDSREP
 . I $G(REWRITE)]"" X IOXY W $P(DDGLVID,DDGLDEL),$E(REWRITE,1,$P(DIR0,U,3)) Q
 . N DX,DY S DY=$P(DIR0,U),DX=$P(DIR0,U,2) X IOXY W $J("",$P(DIR0,U,3)) ;CLEARS THE LINE WE JUST READ FROM
 E  D
 . S $P(DDSREP,U,2,4)=DDSSN_"^1^"_DDSSN
 . S $P(@DDSREFT@(DDSPG,DDSBK,DDSPDA),U,2,999)=DDSREP
 . D DB^DDSR(DDSPG,DDSBK)
 Q
 ;
ADD(DDSDA,DDSPDA,DDSSN) ;Add entry
 S @DDSREFT@(DDSPG,DDSBK,DDSPDA,"B",DDSDA)=DDSSN
 S ^("ADD")=$G(@DDSREFT@("ADD"))+1,^("ADD",^("ADD"))=DDSDA_DIE
 S @DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN)=DDSDA
 D ^DDS11(DDSBK)
 S DDSCHG=1
 Q
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDSM1
DDSM1 ;SFISC/MKO-MULTILINE, LOAD AND DELETE ;26SEP2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
LOAD(DDSIEN) ;Load subentries
MLOAD ;Entry point from MLOAD^DDSUTL
 ;@DDSIEN is an array of record numbers
 ;
 Q:$D(DDSIEN)[0
 Q:$D(@DDSIEN)<9
 ;
 N DDSI,DDSPDA,DDSRN,DDSSN
 S DDSPDA=$P(DDSREP,U)
 S DDSSN=$O(@DDSREFT@(DDSPG,DDSBK,DDSPDA," "),-1)
 ;
 ;Add records to internal ^TMP array
 ;Load data for each record
 S DDSI="" F  S DDSI=$O(@DDSIEN@(DDSI)) Q:DDSI=""  D
 . S DDSRN=@DDSIEN@(DDSI) Q:'DDSRN
 . S DA=+DDSRN,$P(DDSDA,",")=DA,@("D"_DDSDL)=DA
 . I $D(@DDSREFT@(DDSPG,DDSBK,DDSPDA,"B",DDSDA))[0 D
 .. S DDSSN=DDSSN+1
 .. S @DDSREFT@(DDSPG,DDSBK,DDSPDA,"B",DDSDA)=DDSSN
 .. S @DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN)=DDSDA
 .. S ^("ADD")=$G(@DDSREFT@("ADD"))+1,^("ADD",^("ADD"))=DDSDA_DIE
 . D ^DDS11(DDSBK)
 . S DDSCHG=1
 ;
 ;Position the cursor on blank (Select) line
 ;Repaint all lines in the repeating block
 D POSSN^DDSM(999999999999)
 D DMULTN^DDSR(DDSPG,DDSBK,DDSPDA,$P(DDSREP,U,5),1)
 ;
 ;Update DIR0
DIR0 S DIR0=$P(@DDSREFS@(DDSPG,DDSBK,DDO,"D"),U,1,3)
 S:$P($G(DDSREP),U,3)>1 $P(DIR0,U)=$P(DIR0,U)+($P(DDSREP,U,3)-1*$$HITE^DDSR(DDSBK)) ;DJW/GFT
 Q
 ;
DEL(DDSIEN) ;Delete subentries
MDEL ;Entry point from MDEL^DDSUTL
 ;In:
 ; If DDSIEN contains a record number, delete that one (G MDELONE)
 ; If DDSIEN contains a closed root, @DDSIEN is an array
 ;  of record numbers to delete
 ; DIE   = global root
 ; DDSDA = current IENS
 ;
 Q:$D(DDSIEN)[0
 G:+$P(DDSIEN,"E") MDELONE
 Q:$D(@DDSIEN)<9
 ;
 N DDSI,DDSPDA,DDSRN,DDSSN
 S DDSPDA=$P(DDSREP,U)
 ;
 ;Loop through passed array and delete subentries
 S DDSI="" F  S DDSI=$O(@DDSIEN@(DDSI)) Q:DDSI=""  D
 . ;S DDSRN=@DDSIEN@(DDSI) Q:'DDSRN
 . ;S DDSIENS=DDSDA,$P(DDSIENS,",")=+DDSRN
 . ;D K^DDS6(DDSIENS,DIE)
 . ;Q
 . ;
 . S DDSRN=@DDSIEN@(DDSI) Q:'DDSRN
 . S DA=+DDSRN,$P(DDSDA,",")=DA
 . S DDSSN=$G(@DDSREFT@(DDSPG,DDSBK,DDSPDA,"B",DDSDA)) Q:'DDSSN
 . K @DDSREFT@(DDSPG,DDSBK,DDSPDA,"B",DDSDA)
 . K @DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN)
 . K @DDSREFT@("F"_DDP,DDSDA)
 . K @DDSREFT@("F0",DDSDA)
 ;
 ;Close up gaps in ^TMP array
 S (DDSI,DDSSN)=0
 F  S DDSI=$O(@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSI)) Q:'DDSI  D
 . S DDSSN=DDSSN+1 Q:DDSI=DDSSN
 . S DDSRN=@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSI)
 . S @DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN)=DDSRN
 . S @DDSREFT@(DDSPG,DDSBK,DDSPDA,"B",DDSRN)=DDSSN
 ;
 F  S DDSSN=$O(@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN)) Q:'DDSSN  D
 . K @DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN)
 ;
 ;Position cursor on "Select" line
 ;Repaint all lines in repeating block
 D POSSN^DDSM(999999999999,1)
 ;
 ;Update DIR0
DIR01 D DIR0
 Q
 ;
MDELONE ;Delete one subentry in the current repeating block
 ;In:  DDSIEN = IENS of record to be deleted
 ;     DDSREP = data for repeating blocks
 ;     DDSDA  = current IENS
 ;     DIE    = current global root
 ;
 N DDSPDA,DDSRN,DDSSN
 ;
 ;Get parent IENS
 S DDSPDA=$P(DDSREP,U)
 ;
 ;Kill all data pertaining to current (sub)record
 D K^DDS6(DDSIEN,DIE)
 ;
 ;Repaint lines and reposition cursor
 I DDSDA=DDSIEN D
 . D DMULTN^DDSR(DDSPG,DDSBK,DDSPDA,$P(DDSREP,U,5),$P(DDSREP,U,3))
 . S DDSSN=$P(DDSREP,U,4)
 . I $D(@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN))[0 D
 .. S DDSSN=$O(@DDSREFT@(DDSPG,DDSBK,DDSPDA,DDSSN),-1)
 . D POSSN^DDSM(DDSSN)
 ;
 E  D POSSN^DDSM(999999999999,1)
 ;
DIR02 D DIR0
 Q

DDSMSG
DDSMSG ;SFISC/MKO-PRINT MESSAGES ;3:14 PM  9 Feb 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ERR ;Print "DIERR" messages in help box
 N DDSE,DDSL,DDSLMT,DDSN
 K DDH,DDQ
 S DDSLMT=$G(DDC,15),DDSE=0
 ;
 W $C(7)
 S DDSN=0
 F  S DDSN=$O(^TMP("DIERR",$J,DDSN)) Q:'DDSN!DDSE  D
 . S DDSL=0
 . F  S DDSL=$O(^TMP("DIERR",$J,DDSN,"TEXT",DDSL)) Q:'DDSL!DDSE  D
 .. D LD($G(^TMP("DIERR",$J,DDSN,"TEXT",DDSL)),"!")
 .. I DDH'<DDSLMT D SC^DDSU S:$D(DTOUT)!($D(DUOUT)) DDSE=1
 ;
 I $G(DDH) S:$G(DDH(1,"T"))?1.C DDH(1,"T")="" D SC^DDSU
 S DDSKM=1
 K DIERR,^TMP("DIERR",$J)
 Q
 ;
HLP(DDSG) ;Print messages from @DDSG in help area
 N DDSE,DDSL,DDSLMT,DDSNXTF,DDST
 S:$G(DDSG)="" DDSG=$NA(@DDSREFT@("HLP"))
 ;
 K DDH
 I $G(DDQ)-1=DDSHBX,'$X K DDQ
 D:$G(DDQ)>DDSHBX SETDDH
 S DDSLMT=$G(DDC,15),(DDSE,DDSL)=0
 ;
 F  S DDSL=$O(@DDSG@(DDSL)) Q:'DDSL!DDSE  D
 . S DDST=$G(@DDSG@(DDSL))
 . I DDST="$$EOP" S DDH=$G(DDH)+1,DDH(DDH,"E")=""
 . E  D LD(DDST,$G(@DDSG@(DDSL,"F"),"!"))
 . S DDSNXTF=$G(@DDSG@(DDSL+1,"F"),"!")
 . I DDH'<DDSLMT,DDSNXTF["!"!(DDSNXTF'["?") D SC^DDSU S:$D(DTOUT)!($D(DUOUT)) DDSE=1
 ;
 I $G(DDH) S:$G(DDH(1,"T"))?1.C DDH(1,"T")="" D SC^DDSU
 K:DDSG=$NA(@DDSREFT@("HLP")) @DDSG
 S:'$D(DDSID) DDSKM=1
 Q
 ;
WP(DDSR) ;Print the contents of a wp field @DDSR in help area
 N DDSE,DDSL,DDSLMT,DDSNXTF
 ;
 K DDH
 I $G(DDQ)-1=DDSHBX,'$X K DDQ
 D:$G(DDQ)>DDSHBX SETDDH
 S DDSLMT=$G(DDC,15),(DDSE,DDSL)=0
 ;
 F  S DDSL=$O(@DDSR@(DDSL)) Q:'DDSL!DDSE  D
 . D LD($G(@DDSR@(DDSL,0)),$G(@DDSR@(DDSL,"F"),"!"))
 . S DDSNXTF=$G(@DDSR@(DDSL+1,"F"),"!")
 . I DDH'<DDSLMT,DDSNXTF["!"!(DDSNXTF'["?") D SC^DDSU S:$D(DTOUT)!($D(DUOUT)) DDSE=1
 ;
 I $G(DDH) S:$G(DDH(1,"T"))?1.C DDH(1,"T")="" D SC^DDSU
 S:'$D(DDSID) DDSKM=1
 Q
 ;
MSG(DDSMSG,DDSFLG,DDSFMT) ;Print local var or array DDSMSG in help area
 ;DDSFLG [ 1 : Write bell
 ;DDSFMT : Format if one line is sent
 N DDSL
 K DDH
 I $G(DDQ)-1=DDSHBX,'$X K DDQ
 D:$G(DDQ)>DDSHBX SETDDH
 ;
 I $D(DDSMSG)=1 D
 . D LD(DDSMSG,$S($G(DDSFMT)]"":DDSFMT,1:"!"))
 ;
 E  S DDSL=0 F  S DDSL=$O(DDSMSG(DDSL)) Q:'DDSL  D
 . D LD($G(DDSMSG(DDSL)),$G(DDSMSG(DDSL,"F"),"!"))
 Q:'$G(DDH)
 ;
 I $G(DDH) D
 . S:$G(DDH(1,"T"))?1.C DDH(1,"T")=""
 . S:$G(DDSFLG)[1 DDH(1,"T")=$C(7)_$G(DDH(1,"T"))
 . D SC^DDSU
 S:'$D(DDSID) DDSKM=1
 Q
 ;
SETDDH ;Setup DDH and DDQ for identifiers and executable help
 ;that called EN^DDIOL
 S:$X>IOM $X=IOM
 S DDH=1
 S DDH(1,"T")=$TR($J("",$X)," ",$C(0))
 S DDQ=$S(DY>(IOSL-1):IOSL-1,1:DY)-1_U_$X
 Q
 ;
LD(S,F) ;Load string S with format F into DDH array
 N A,C,J,L
 S DDH=+$G(DDH)
 F J=1:1:$L(F,"!")-1 S DDH=DDH+1,DDH(DDH,"T")=""
 S:'DDH DDH=1
 S:F["?" @("C="_$P(F,"?",2))
 S L=$G(DDH(DDH,"T"))
 S S=L_$J("",$G(C)-$L(L))_S
 ;
 D WRAP(S,.A,IOM-1)
 S DDH=DDH-1
 F A=1:1:A S DDH=$G(DDH)+1,DDH(DDH,"T")=A(A)
 Q
 ;
WRAP(L,A,M) ;Wrap line at word boundaries
 ; L    = Line of text
 ; M    = Margin width
 ;Return:
 ; A    = Number of lines
 ; A(n) = Array of text
 ;
 S:'$G(M) M=$S($G(IOM):IOM-5,1:75)
 N I,N
 S N=0
 F I=$L(L," "):-1:1 D  Q:L=""
 . I I=1 S N=N+1,A(N)=$E(L,1,M),L=$E(L,M+1,999) Q
 . I $L($P(L," ",1,I))'>M D
 .. S N=N+1,A(N)=$P(L," ",1,I),L=$P(L," ",I+1,999)
 S A=N
 Q

DDSOPT
DDSOPT ;SFISC/MLH,MKO-SCREENMAN OPTIONS ;18JAN2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
0 S DIC="^DOPT(""DDS"","
 G OPT:$D(^DOPT("DDS",7)) S ^(0)="SCREENMAN OPTION^1.01" K ^("B")
 F X=1:1:7 S ^DOPT("DDS",X,0)=$P($T(@X),";;",2)
 S DIK=DIC D IXALL^DIK
OPT ;
 S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN G 0
 ;
EN ;Entry point for all screenman options
 D @DI W !!
Q K %,DI,DIC,DIK,X,Y Q
 ;
1 ;;EDIT/CREATE A FORM
CREATE G ^DDGF
 ;
2 ;;RUN A FORM
 G ^DDSRUN
 ;
3 ;;DELETE A FORM
 G ^DDSDFRM
 ;
4 ;;PURGE UNUSED BLOCKS
 G ^DDSDBLK
 ;
5 ;;PRINT A FORM
 G PRINT^DDS
 ;
6 ;;CUSTOMIZE COLORS
 I $G(^XTV(8989.5,0))'?1"PARAM".E W !,"PARAMETERS SYSTEM IS NOT INSTALLED HERE" Q
 D EDITPAR^XPAREDIT("DI SCREENMAN COLORS") Q
  ;
7 ;;CLONE A FORM
 D ^DDSCLONE

DDSPRNT
DDSPRNT ;SFISC/MKO-PRINT A FORM ;02:51 PM  18 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 N DDSFORM,DDSPBRK
 D SELFORM(.DDSFORM) Q:DDSFORM=-1
 D PAGEBRK(.DDSPBRK) Q:$D(DDSPBRK)[0
 ;
 ;Device
 S %ZIS=$S($D(^%ZTSK):"Q",1:"")
 W ! D ^%ZIS K %ZIS I $G(POP) K POP Q
 K POP
 ;
 ;Queue report
 I $D(IO("Q")),$D(^%ZTSK) D  G END
 . S ZTRTN="PRINT^DDSPRNT"
 . S ZTDESC="Report of Form "_$P(DDSFORM,U,2)
 . N I F I="DDSFORM","DDSFORM(0)","DDSPBRK" S ZTSAVE(I)=""
 . D ^%ZTLOAD
 . I $D(ZTSK)#2 W !,"Report queued!",!,"Task number: "_$G(ZTSK),!
 . E  W !,"Report canceled!",!
 . K ZTSK
 . S IOP="HOME" D ^%ZIS
 ;
 U IO
 ;
PRINT ;Entry point for queued reports
 N DDSBK,DDSCOL1,DDSCOL2,DDSCOL3,DDSCRT,DDSFILE
 N DDSHLIN,DDSHBK,DDSPAGE,DDSQUE
 N DX,DY,X,Y
 ;
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 D INIT
 D @("HDR"_(2-DDSCRT))
 D FORM,END
 Q
 ;
FORM ;Form data
 W !
 ;
 ;Description
 D WP($NA(^DIST(.403,+DDSFORM,15))) Q:$D(DIRUT)
 ;
 ;Other properties
 D W("PRIMARY FILE: "_$P(DDSFORM(0),U,8),9) Q:$D(DIRUT)
 W ?49,"READ ACCESS: "_$P(DDSFORM(0),U,2)
 D W("DATE CREATED: "_$$EXTERNAL^DILFD(.403,4,"",$P(DDSFORM(0),U,5)),9) Q:$D(DIRUT)
 W ?48,"WRITE ACCESS: "_$P(DDSFORM(0),U,3)
 D W("DATE LAST USED: "_$$EXTERNAL^DILFD(.403,5,"",$P(DDSFORM(0),U,6)),7) Q:$D(DIRUT)
 W ?53,"CREATOR: "_$P(DDSFORM(0),U,4)
 D W() Q:$D(DIRUT)
 ;
 I $P(DDSFORM(0),U,7)]"" D W("TITLE: "_$P(DDSFORM(0),U,7),16) Q:$D(DIRUT)
 I $P($G(^DIST(.403,+DDSFORM,21)),U)]"" D W("RECORD SELECTION PAGE: "_$P(^(21),U)) Q:$D(DIRUT)
 ;
 I $X D W() Q:$D(DIRUT)
 S X=$G(^DIST(.403,+DDSFORM,11))
 I X]"" D W("PRE ACTION:",11) Q:$D(DIRUT)  D PCOL(X,23)
 S X=$G(^DIST(.403,+DDSFORM,12))
 I X]"" D W("POST ACTION:",10) Q:$D(DIRUT)  D PCOL(X,23)
 S X=$G(^DIST(.403,+DDSFORM,14))
 I X]"" D W("POST SAVE:",12) Q:$D(DIRUT)  D PCOL(X,23)
 S X=$G(^DIST(.403,+DDSFORM,20))
 I X]"" D W("DATA VALIDATION:",6) Q:$D(DIRUT)  D PCOL(X,23)
 K DDSFORM(0)
 ;
 ;Loop through all pages
 I $X D W() Q:$D(DIRUT)
 Q:'$O(^DIST(.403,+DDSFORM,40,0))
 ;
 N DDSPG,DDSPGN
 S DDSPGN="",DDSPFRST=1
 F  S DDSPGN=$O(^DIST(.403,+DDSFORM,40,"B",DDSPGN)) Q:DDSPGN=""!$D(DIRUT)  S DDSPG=0 F  S DDSPG=$O(^DIST(.403,+DDSFORM,40,"B",DDSPGN,DDSPG)) Q:'DDSPG!$D(DIRUT)  D PAGE^DDSPRNT1
 K DDSPFRST Q:$D(DIRUT)
 ;
 D:$D(DDSHBK) HBLKS^DDSPRNT1
 Q
 ;
WR(DDSLAB,DDSVAL,DDSFLG) ;Write label and value
 I DDSVAL="",'$G(DDSFLG) Q
 ;
 D W() Q:$D(DIRUT)
 W ?DDSCOL2,DDSLAB
 ;
 I $X>DDSCOL3 N DDSCOL3 S DDSCOL3=$X+1
 D PCOL(DDSVAL,DDSCOL3)
 Q
 ;
PCOL(DDSVAL,DDSCOL) ;Print DDSVAL
 N DDSWIDTH,DDSIND
 S DDSWIDTH=IOM-DDSCOL-1
 F DDSIND=1:DDSWIDTH:$L(DDSVAL) D  Q:$D(DIRUT)
 . I DDSIND>1 D W() Q:$D(DIRUT)
 . W ?DDSCOL,$E(DDSVAL,DDSIND,DDSIND+DDSWIDTH-1)
 Q
 ;
WP(DDSWP,DIWL,DDSLF) ;Print text in array @DDSWP
 ;DDSLF [ A : LF after (def)
 ;        B : LF feed before
 ;
 Q:'$P($G(@DDSWP@(0)),U,3)
 N DIW,DIWF,DIWI,DIWR,DIWT,DIWTC,DIWX,DN
 N DDSI,DDSCNT,I,X,Z
 ;
 K ^UTILITY($J,"W")
 S:'$G(DIWL) DIWL=1
 S DIWR=IOM-1
 S:'$D(DDSLF) DDSLF="A"
 ;
 S DDSCNT=$P($G(@DDSWP@(0)),U,3)
 I DDSCNT D
 . F DDSI=1:1:DDSCNT I $D(@DDSWP@(DDSI,0))#2 S X=^(0) D ^DIWP
 . ;
 . I DDSLF'["B" D
 .. W ?DIWL-1,$G(^UTILITY($J,"W",DIWL,1,0))
 .. S DDSCNT=1
 . E  S DDSCNT=0
 . F  S DDSCNT=$O(^UTILITY($J,"W",DIWL,DDSCNT)) Q:'DDSCNT!$D(DIRUT)  D
 .. D W($G(^UTILITY($J,"W",DIWL,DDSCNT,0)),DIWL-1)
 ;
 K ^UTILITY($J,"W")
 D:DDSLF["A" W()
 Q
 ;
W(DDSSTR,DDSCOL) ;Write DDSSTR
 I $Y+3'<IOSL D HEADER Q:$D(DIRUT)
 W !?+$G(DDSCOL),$G(DDSSTR)
 Q
 ;
HEADER ;All headers except first
 I DDSCRT D  Q:$D(DIRUT)
 . N DIR,X,Y
 . S DIR(0)="E" W ! D ^DIR
 I DDSQUE,$$S^%ZTLOAD S (ZTSTOP,DIRUT)=1 Q
 ;
HDR1 ;First header for CRTs
 W @IOF
 ;
HDR2 ;First header for non-CRTs
 ;
 S DDSPAGE=$G(DDSPAGE)+1
 W "FORM LISTING - "_$P(DDSFORM,U,2)_" (#"_+DDSFORM_")"
 W !,"FILE: "_DDSFILE
 W ?(IOM-$L(DDSHLIN)-$L(DDSPAGE)-1),DDSHLIN_DDSPAGE
 W !,$TR($J("",IOM-1)," ","-")
 Q
 ;
SELFORM(DDSFORM) ;Select form
 N %,%W,%Y,C,I,Q,DDH,DIC,X,Y
 S DIC="^DIST(.403,",DIC(0)="QEAMZ"
 D ^DIC K DIC
 S DDSFORM=Y,DDSFORM(0)=$G(Y(0))
 Q
 ;
PAGEBRK(DDSPBRK) ;Prompt
 N DIR,DIRUT,DUOUT,DTOUT,DIROUT,X,Y
 S DIR(0)="YO"
 S DIR("A")="Start each page of the form on a new page"
 S DIR("B")="Yes"
 W ! D ^DIR Q:$D(DIRUT)
 S DDSPBRK=Y
 Q
 ;
INIT ;Setup
 N %,%H,X,Y
 S %H=$H D YX^%DTC
 S DDSHLIN=$P(Y,"@")_"  "_$P($P(Y,"@",2),":",1,2)_"    PAGE "
 S DDSFILE=$P(DDSFORM(0),U,8)
 I DDSFILE,$D(^DIC(DDSFILE,0))#2 S DDSFILE=$P(^(0),U)_" (#"_DDSFILE_")"
 E  S DDSFILE=""
 S DDSCRT=$E(IOST,1,2)="C-"
 S DDSQUE=$D(ZTQUEUED)
 Q
 ;
END ;Finish up
 I $D(ZTQUEUED) S ZTREQ="@"
 E  X $G(^%ZIS("C"))
 K DIRUT,DUOUT,DTOUT
 Q

DDSPRNT1
DDSPRNT1 ;SFISC/MKO-PRINT A FORM ;9DEC2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PAGE ;Print page properties
 I $Y+7'<IOSL!(DDSPBRK&'$D(DDSPFRST)) D HEADER^DDSPRNT Q:$D(DIRUT)
 I DDSPBRK!$D(DDSPFRST) D
 . W !,"Page    Page"
 . W !,"Number  Properties"
 . W !,"------  ----------"
 K DDSPFRST
 ;
 S DDSCOL1=0,DDSCOL2=8,DDSCOL3=32
 F X=0,1 S DDSPG(X)=$G(^DIST(.403,+DDSFORM,40,DDSPG,X))
 Q:DDSPG(0)=""
 ;
 D W() Q:$D(DIRUT)
 W ?DDSCOL1,$P(DDSPG(0),U),?DDSCOL2,$P(DDSPG(1),U)
 ;
 D W() Q:$D(DIRUT)
 D WP^DDSPRNT($NA(^DIST(.403,+DDSFORM,40,DDSPG,15)),DDSCOL2+1)
 Q:$D(DIRUT)
 ;
 S X=$P(DDSPG(0),U,2)
 I X]"" D  Q:$D(DIRUT)
 . D WR("HEADER BLOCK:",$P($G(^DIST(.404,X,0)),U)_" (#"_X_")")
 . S DDSHBK(X)=""
 ;
 D WR("PAGE COORDINATE:",$P(DDSPG(0),U,3)) Q:$D(DIRUT)
 I $P(DDSPG(0),U,6) D WR("IS THIS A POP UP PAGE?:","YES") Q:$D(DIRUT)
 D WR("LOWER RIGHT COORDINATE:",$P(DDSPG(0),U,7)) Q:$D(DIRUT)
 ;
 D WR("NEXT PAGE:",$P(DDSPG(0),U,4)) Q:$D(DIRUT)
 D WR("PREVIOUS PAGE:",$P(DDSPG(0),U,5)) Q:$D(DIRUT)
 D WR("PARENT FIELD:",$P(DDSPG(1),U,2)) Q:$D(DIRUT)
 ;
 D WR("PRE ACTION:",$G(^DIST(.403,+DDSFORM,40,DDSPG,11))) Q:$D(DIRUT)
 D WR("POST ACTION:",$G(^DIST(.403,+DDSFORM,40,DDSPG,12))) Q:$D(DIRUT)
 K DDSPG(0),DDSPG(1)
 ;
 ;Loop through all blocks
 I $X D W() Q:$D(DIRUT)
 Q:'$O(^DIST(.403,+DDSFORM,40,DDSPG,40,0))
 ;
 I $Y+7'<IOSL D HEADER^DDSPRNT Q:$D(DIRUT)
 W !?DDSCOL2,"Block  Block"
 W !?DDSCOL2,"Order  Properties (Form File)"
 W !?DDSCOL2,"-----  ----------------------"
 ;
 N DDSBKO
 S DDSBKO=""
 F  S DDSBKO=$O(^DIST(.403,+DDSFORM,40,DDSPG,40,"AC",DDSBKO)) Q:DDSBKO=""!$D(DIRUT)  S DDSBK=0 F  S DDSBK=$O(^DIST(.403,+DDSFORM,40,DDSPG,40,"AC",DDSBKO,DDSBK)) Q:'DDSBK!$D(DIRUT)  D BLOCK
 Q
 ;
BLOCK ;Print Block properties
 S DDSCOL1=8,DDSCOL2=15,DDSCOL3=39
 F X=0,1,2,"COMP MUL","COMP MUL PTR" S DDSBK(X)=$G(^DIST(.403,+DDSFORM,40,DDSPG,40,DDSBK,X))
 Q:DDSBK(0)=""
 ;
 D W($P(DDSBK(0),U,2),DDSCOL1) Q:$D(DIRUT)
 W ?DDSCOL2,$P($G(^DIST(.404,DDSBK,0)),U)_" (#"_DDSBK_")"
 D W() Q:$D(DIRUT)
 ;
 D WR("TYPE OF BLOCK:",$$EXTERNAL^DILFD(.4032,3,"",$P(DDSBK(0),U,4))) Q:$D(DIRUT)
 D WR("BLOCK COORDINATE:",$P(DDSBK(0),U,3)) Q:$D(DIRUT)
 D WR("POINTER LINK:",$P(DDSBK(1),U)) Q:$D(DIRUT)
 D WR("REPLICATION:",$P(DDSBK(2),U)) Q:$D(DIRUT)
 D WR("INDEX:",$P(DDSBK(2),U,2)) Q:$D(DIRUT)
 D WR("INITIAL POSITION:",$P(DDSBK(2),U,3)) Q:$D(DIRUT)
 D WR("DISALLOW LAYGO",$P(DDSBK(2),U,4)) Q:$D(DIRUT)
 D WR("FIELD FOR SELECTION:",$P(DDSBK(2),U,5)) Q:$D(DIRUT)
 D WR("COMPUTED MULTIPLE:",DDSBK("COMP MUL")) Q:$D(DIRUT)
 D WR("COMPUTED MULTIPLE POINTER:",DDSBK("COMP MUL PTR")) Q:$D(DIRUT)
 ;
 D WR("PRE ACTION:",$G(^DIST(.403,+DDSFORM,40,DDSPG,40,DDSBK,11))) Q:$D(DIRUT)
 D WR("POST ACTION:",$G(^DIST(.403,+DDSFORM,40,DDSPG,40,DDSBK,12))) Q:$D(DIRUT)
 ;
 K DDSBK(1),DDSBK(2)
 S DDSBK(0)=$G(^DIST(.404,DDSBK,0)) Q:DDSBK(0)=""
 ;
 I $Y+6'<IOSL D HEADER^DDSPRNT Q:$D(DIRUT)
 W !!?DDSCOL2,"Block Properties (Block File)"
 W !,?DDSCOL2,"-----------------------------"
 D BLOCK^DDSPRNT2
 Q
 ;
HBLKS ;Header blocks
 Q:'$D(DDSHBK)
 I $Y+7'<IOSL D HEADER^DDSPRNT Q:$D(DIRUT)
 W !!,"Header Block Properties"
 W !,"------------------------"
 S DDSCOL1=8,DDSCOL2=15,DDSCOL3=39
 S DDSBK="" F  S DDSBK=$O(DDSHBK(DDSBK)) Q:'DDSBK!$D(DIRUT)  D
 . S DDSBK(0)=$G(^DIST(.404,DDSBK,0)) Q:DDSBK(0)=""
 . D W("NAME: "_$P(DDSBK(0),U)_" (#"_DDSBK_")") Q:$D(DIRUT)
 . D W() Q:$D(DIRUT)
 . D BLOCK^DDSPRNT2
 . D W() Q:$D(DIRUT)
 Q
 ;
WR(DDSLAB,DDSVAL,DDSFLG) ;Write label and value
 I DDSVAL="",'$G(DDSFLG) Q
 ;
 D W() Q:$D(DIRUT)
 W ?DDSCOL2,DDSLAB
 ;
 I $X>DDSCOL3 N DDSCOL3 S DDSCOL3=$X+1
 D PCOL(DDSVAL,DDSCOL3)
 Q
 ;
PCOL(DDSVAL,DDSCOL) ;Print DDSVAL starting in column DDSCOL
 N DDSWIDTH,DDSIND
 S DDSWIDTH=IOM-DDSCOL-1
 F DDSIND=1:DDSWIDTH:$L(DDSVAL) D  Q:$D(DIRUT)
 . I DDSIND>1 D W() Q:$D(DIRUT)
 . W ?DDSCOL,$E(DDSVAL,DDSIND,DDSIND+DDSWIDTH-1)
 Q
 ;
W(DDSSTR,DDSCOL) ;Write DDSSTR preceded by !?DDSCOL
 I $Y+3'<IOSL D HEADER^DDSPRNT Q:$D(DIRUT)
 W !?+$G(DDSCOL),$G(DDSSTR)
 Q

DDSPRNT2
DDSPRNT2 ;SFISC/MKO-PRINT A FORM ;29JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BLOCK ;Print Block properties from Block file
 D WP^DDSPRNT($NA(^DIST(.404,DDSBK,15)),DDSCOL2+1,"AB") Q:$D(DIRUT)
 ;
 D WR("DATA DICTIONARY NUMBER:",$P(DDSBK(0),U,2),1) Q:$D(DIRUT)
 S X=$P(DDSBK(0),U,3)
 I X]"" D WR("DISABLE NAVIGATION:",$$EXTERNAL^DILFD(.404,2,"",$P(DDSBK(0),U,3))) Q:$D(DIRUT)
 ;
 D WR("PRE ACTION:",$G(^DIST(.404,DDSBK,11))) Q:$D(DIRUT)
 D WR("POST ACTION:",$G(^DIST(.404,DDSBK,12))) Q:$D(DIRUT)
 K DDSBK(0)
 ;
 ;Loop through all fields
 I $X D W() Q:$D(DIRUT)
 Q:'$O(^DIST(.404,DDSBK,40,0))
 ;
 D:$Y+7'<IOSL HEADER^DDSPRNT Q:$D(DIRUT)
 W !?DDSCOL2,"Field  Field"
 W !?DDSCOL2,"Order  Properties"
 W !?DDSCOL2,"-----  ----------"
 ;
 N DDSFD,DDSFDO
 S DDSFDO=""
 F  S DDSFDO=$O(^DIST(.404,DDSBK,40,"B",DDSFDO)) Q:DDSFDO=""!$D(DIRUT)  S DDSFD=0 F  S DDSFD=$O(^DIST(.404,DDSBK,40,"B",DDSFDO,DDSFD)) Q:'DDSFD!$D(DIRUT)  D FIELD
 ;
 Q
 ;
FIELD ;Print Block properties
 S DDSCOL1=15,DDSCOL2=22,DDSCOL3=45
 F X=0,2,4,20 S DDSFD(X)=$G(^DIST(.404,DDSBK,40,DDSFD,X))
 Q:DDSFD(0)=""
 ;
 D W(DDSFDO,DDSCOL1) Q:$D(DIRUT)
 W ?DDSCOL2,"FIELD TYPE:"
 W ?DDSCOL3,$$EXTERNAL^DILFD(.4044,2,"",$P(DDSFD(0),U,3))
 ;
 D WR("CAPTION:",$P(DDSFD(0),U,2)) Q:$D(DIRUT)
 D WR("EXECUTABLE CAPTION:",$G(^DIST(.404,DDSBK,40,DDSFD,.1))) Q:$D(DIRUT)
 D WR("DISPLAY GROUP:",$P(DDSFD(0),U,4)) Q:$D(DIRUT)
 ;
 D WR("UNIQUE NAME:",$P(DDSFD(0),U,5)) Q:$D(DIRUT)
 ;
 D WR("FIELD:",$P($G(^DIST(.404,DDSBK,40,DDSFD,1)),U)) Q:$D(DIRUT)
 D WR("COMPUTED EXPRESSION:",$G(^DIST(.404,DDSBK,40,DDSFD,30))) Q:$D(DIRUT)
 ;
 I DDSFD(20)'?."^" D  Q:$D(DIRUT)
 . D WR("READ TYPE:",$$EXTERNAL^DILFD(.4044,20.1,"",$P(DDSFD(20),U))) Q:$D(DIRUT)
 . D WR("PARAMETERS:",$P(DDSFD(20),U,2)) Q:$D(DIRUT)
 . D WR("QUALIFIERS:",$P(DDSFD(20),U,3)) Q:$D(DIRUT)
 . ;
 . S DDSWP=$NA(^DIST(.404,DDSBK,40,DDSFD,21))
 . I $P($G(@DDSWP@(0)),U,3) D
 .. D W("HELP:",DDSCOL2) Q:$D(DIRUT)
 .. D WP^DDSPRNT(DDSWP,DDSCOL2+3,"B")
 . K DDSWP Q:$D(DIRUT)
 . ;
 . D WR("INPUT TRANSFORM:",$G(^DIST(.404,DDSBK,40,DDSFD,22))) Q:$D(DIRUT)
 . D WR("SAVE CODE:",$G(^DIST(.404,DDSBK,40,DDSFD,23))) Q:$D(DIRUT)
 . D WR("SCREEN:",$G(^DIST(.404,DDSBK,40,DDSFD,24))) Q:$D(DIRUT)
 . K DDSFD(20)
 ;
 D WR("CAPTION COORDINATE:",$P(DDSFD(2),U,3)) Q:$D(DIRUT)
 D WR("DATA COORDINATE:",$P(DDSFD(2),U)) Q:$D(DIRUT)
 D WR("DATA LENGTH:",$P(DDSFD(2),U,2)) Q:$D(DIRUT)
 D WR("SUPPRESS COLON:",$S($P(DDSFD(2),U,4):"YES",1:"")) Q:$D(DIRUT)
 ;
 D WR("DEFAULT:",$P($G(^DIST(.404,DDSBK,40,DDSFD,3)),U)) Q:$D(DIRUT)
 D WR("EXECUTABLE DEFAULT:",$G(^DIST(.404,DDSBK,40,DDSFD,3.1))) Q:$D(DIRUT)
 ;
 I DDSFD(4)'?."^" D
 . D WR("REQUIRED:",$S($P(DDSFD(4),U):"YES",$P(DDSFD(4),U)=0:"NO",1:"")) Q:$D(DIRUT)
 . D WR("DISABLE EDITING:",$S($P(DDSFD(4),U,4)=2:"REACHABLE",$P(DDSFD(4),U,4):"YES",1:"")) Q:$D(DIRUT)
 . D WR("RIGHT JUSTIFY:",$S($P(DDSFD(4),U,3):"YES",1:"")) Q:$D(DIRUT)
 . D WR("DISALLOW LAYGO:",$S($P(DDSFD(4),U,5):"YES",1:"")) Q:$D(DIRUT)
 K DDSFD(4)
 ;
 D WR("SUB PAGE LINK:",$P($G(^DIST(.404,DDSBK,40,DDSFD,7)),U,2)) Q:$D(DIRUT)
 ;
 D WR("BRANCHING LOGIC:",$G(^DIST(.404,DDSBK,40,DDSFD,10))) Q:$D(DIRUT)
 D WR("PRE ACTION:",$G(^DIST(.404,DDSBK,40,DDSFD,11))) Q:$D(DIRUT)
 D WR("POST ACTION:",$G(^DIST(.404,DDSBK,40,DDSFD,12))) Q:$D(DIRUT)
 D WR("POST ACTION ON CHANGE:",$G(^DIST(.404,DDSBK,40,DDSFD,13))) Q:$D(DIRUT)
 D WR("DATA VALIDATION:",$G(^DIST(.404,DDSBK,40,DDSFD,14))) Q:$D(DIRUT)
 ;
 D W() Q:$D(DIRUT)
 Q
 ;
WR(DDSLAB,DDSVAL,DDSFLG) ;Write label and value
 I DDSVAL="",'$G(DDSFLG) Q
 ;
 D W() Q:$D(DIRUT)
 W ?DDSCOL2,DDSLAB
 ;
 I $X>DDSCOL3 N DDSCOL3 S DDSCOL3=$X+1
 D PCOL(DDSVAL,DDSCOL3)
 Q
 ;
PCOL(DDSVAL,DDSCOL) ;Print DDSVAL starting in column DDSCOL
 N DDSWIDTH,DDSIND
 S DDSWIDTH=IOM-DDSCOL-1
 F DDSIND=1:DDSWIDTH:$L(DDSVAL) D  Q:$D(DIRUT)
 . I DDSIND>1 D W() Q:$D(DIRUT)
 . W ?DDSCOL,$E(DDSVAL,DDSIND,DDSIND+DDSWIDTH-1)
 Q
 ;
W(DDSSTR,DDSCOL) ;Write DDSSTR preceded by !?DDSCOL
 I $Y+3'<IOSL D HEADER^DDSPRNT Q:$D(DIRUT)
 W !?+$G(DDSCOL),$G(DDSSTR)
 Q

DDSPTR
DDSPTR ;SFISC/MKO-SET "PT" AND "PTB" NODES ;7JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PT(DDSDDP,EXP,DDS,PG,BK) ;Set "PT" and "PTB" nodes
 N DDP,FDL,CD,FD
 S DDP=DDSDDP
 S $P(@DDSREFS@(PG,BK),U,8)=1
 ;
 D:EXP?1"FO(".E FO(DDP,EXP,DDS,PG,BK,.CD,.FDL)
 D:EXP'?1"FO(".E DD(DDP,EXP,BK,.CD,.FDL)
 Q:$G(DIERR)
 ;
 S:FDL?.E1"^" FDL=$E(FDL,1,$L(FDL)-1)
 S @DDSREFS@(PG,BK,"PTB")=FDL
 F CD=1:1:CD S @DDSREFS@(PG,BK,"PTB",CD)=CD(CD)
 F CD=1:1:$L(FDL,U) D
 . S FD=$P($P(FDL,U,CD),";"),DDP=+FD,FD=$P(FD,",",2,99)
 . S @DDSREFS@("PT",DDP,FD,PG,BK)=""
 Q
 ;
DD(DDP,EXP,BK,CD,FDL,COMP) ;Parse DD expression
 ;In:
 ;  DDP  = file #
 ;  EXP  = rel expr
 ;  BK   = blk # (to get DD# of blk)
 ;  COMP = flag, EXP not pointer link
 ;         1, def is ext (DDSCOMP and DDSVAL)
 ;         2, def is int (DDSVAL)
 ;Returns:
 ;  CD   = array of code that sets DA
 ;  FDL  = list of flds used in expr
 ;
 N FD1,FD2,P,TYP
 I EXP?1"DD(".E D
 . N I
 . S I=$$RPAR^DDSLIB(EXP,3)
 . S DDP=$P($E(EXP,4,I-2),",")
 . S EXP=$P($E(EXP,4,I-2),",",2,999)_$E(EXP,I,999)
 ;
 I $G(DDP)="" D BLD^DIALOG(202,"file") Q
 ;
LOOP S CD=$G(CD)+1
LOOP1 I $E(EXP)="""" D
 . N I S I=$$AFTQ^DDSLIB(EXP)
 . S FD1=$$UQT^DDSLIB($E(EXP,1,I-1)),FD2=$P($E(EXP,I,999),":",2,999)
 . S P=$P($E(EXP,I,999),":")
 E  D
 . S FD1=$P($P(EXP,":"),";"),FD2=$P(EXP,":",2,999)
 . S P=$P($P(EXP,":"),";",2,999)
 S FD1=$$FIELD^DDSLIB(DDP,FD1) Q:$G(DIERR)
 ;
 S TYP=$P(^DD(DDP,FD1,0),U,2)
 I TYP S DDP=+TYP,EXP=FD2 D:EXP="" BLD^DIALOG(3083) Q:EXP=""  G LOOP1
 ;
 I FD2="",$G(COMP) D  Q
 . S P=$S(COMP=1:P'["I",1:P["E")
 . S CD(CD)="S X=$$GET^DDSVAL("_DDP_","_$S(CD=1:".DA",1:"X")_","_FD1_$S(P:","""",""E""",1:"")_")"
 . S FDL=$G(FDL)_DDP_","_FD1_U
 ;
 I TYP["V" D  Q:$G(DIERR)
 . S CD(CD)="S X=+$$GET^DDSVAL("_DDP_","_$S(CD=1:".DA",1:"X")_","_FD1_")"
 . S FDL=$G(FDL)_DDP_","_FD1_U
 . D GETFF(.FD2,.DDP)
 E  I TYP["P" D
 . S CD(CD)="S X=$$GET^DDSVAL("_DDP_","_$S(CD=1:".DA",1:"X")_","_FD1_")"
 . S FDL=$G(FDL)_DDP_","_FD1_U
 . S DDP=+$P(TYP,"P",2)
COMPTR E  I TYP["Cp" D
 .S CD(CD)="N D0 S D0=DA X $P(^DD("_DDP_","_FD1_",0),U,5,999) S X=X"
 .S FDL=$G(FDL)_DDP_","_FD1_U
 .S DDP=+$P(TYP,"p",2)
 E  D  Q:$G(DIERR)
 . N D,F,S
 . S FDL=$G(FDL)_DDP_","_FD1_";J^"
 . D LKPARM(P,.F,.D,.S)
 . S CD(CD)="N D,DIC,Y S X=$$GET^DDSVAL("_DDP_","_$S(CD=1:".DA",1:"X")_","_FD1_$S(F:"",1:","""",""E""")_")"
 . D GETFF(.FD2,.DDP) Q:$G(DIERR)
 . I FD2="" D  Q:$G(DIERR)
 .. I $G(COMP) D BLD^DIALOG(3083) Q
 .. S DDP=$P(^DIST(.404,BK,0),U,2)
 . I DDP="" D BLD^DIALOG(202,"file") Q
 . I '$D(^DD(DDP))!'$D(^DIC(DDP,0,"GL")) D  Q
 .. N P S P("FILE")=DDP D BLD^DIALOG(401,.P)
 . S CD(CD)=CD(CD)_",DIC="""_^DIC(DDP,0,"GL")_""""_D_S_" S X=+Y"
 ;
 I FD2]"" S EXP=FD2 G LOOP
 S CD(CD)=CD(CD)_",DA=X"
 Q
 ;
FO(DDP,EXP,DDS,PG,BK,CD,FDL,COMP) ;Parse FO expression
 N FD1,FD2,I,P
 ;
 S:'$D(DDS) DDS="" S:'$D(PG) PG="" S:'$D(BK) BK=""
 S CD=1
 S I=$$RPAR^DDSLIB(EXP,3)
 S FD1=$E(EXP,4,I-2),P=$P($E(EXP,I,999),":")
 S FD2=$P($E(EXP,I,999),":",2,999)
 F I=1:1:3 S P(I)=$$PIECE^DDSLIB(FD1,",",I)
 ;
 S FD1=$P($$GETFLD^DDSLIB(P(1),P(2),P(3),DDS,PG,BK,"F"),",",1,2)
 Q:$G(DIERR)
 ;
 I FD2="",$G(COMP) D  Q
 . S P=$S(COMP=1:P'["I",1:P["E")
 . S CD(1)="S X=$$GET^DDSVALF("""_FD1_""","""","""","""_$S(P:"E",1:"")_""",DDSDA)"
 . S FDL=$G(FDL)_"0,"_FD1_U
 ;
 I $P($G(^DIST(.404,+$P(FD1,",",2),40,+FD1,20)),U)="" D  Q
 . N P S P(1)="READ TYPE",P(2)="form-only field in the BLOCK"
 . D BLD^DIALOG(3011,.P)
 ;
 I $P(^DIST(.404,+$P(FD1,",",2),40,+FD1,20),U)["P" D
 . S CD(1)="S X=$$GET^DDSVALF("""_FD1_""","""","""","""",DDSDA)"
 . S FDL=$G(FDL)_"0,"_FD1_U
 . S DDP=U_$P($P(^DIST(.404,+$P(FD1,",",2),40,+FD1,20),U,3),":")
 E  D  Q:$G(DIERR)
 . N D,F,S
 . S FDL=$G(FDL)_"0,"_FD1_";J^"
 . D LKPARM(P,.F,.D,.S)
 . S CD(1)="N D,DIC,Y S X=$$GET^DDSVALF("""_FD1_""","""","""","""_$S(F:"",1:"E")_""",DDSDA)"
 . D GETFF(.FD2,.DDP) Q:$G(DIERR)
 . I FD2="" S DDP=$P(^DIST(.404,BK,0),U,2)
 . I DDP="" D BLD^DIALOG(202,"file") Q
 . I '$D(^DD(DDP))!'$D(^DIC(DDP,0,"GL")) D  Q
 .. N P S P("FILE")=DDP D BLD^DIALOG(401,.P)
 . S CD(1)=CD(1)_",DIC="""_^DIC(DDP,0,"GL")_""""_D_S_" S X=+Y"
 ;
 I FD2="" S CD(CD)=CD(CD)_",DA=X"
 E  S EXP=FD2 D DD(DDP,EXP,BK,.CD,.FDL,$G(COMP))
 Q
 ;
GETFF(FD2,DDP) ;Get file, field
 ;Input:  FD2=file:field:...
 ;Output: FD2=field:...
 ;        DDP=file number
 I $E(FD2)="""" D
 . N I S I=$$AFTQ^DDSLIB(FD2,1)
 . S DDP=$$UQT^DDSLIB($E(FD2,1,I-1)),FD2=$E(FD2,I,999)
 E  S DDP=$P(FD2,":"),FD2=$P(FD2,":",2,999)
 ;
 I DDP]"",DDP'=+$P(DDP,"E") D
 . I '$D(^DIC("B",DDP)) D BLD^DIALOG(3012,DDP) Q
 . S DDP=$O(^DIC("B",DDP,""))
 Q
 ;
LKPARM(P,F,D,S) ;Parse lookup params
 ;In:  P = specifiers separated by ;
 ;Out: F = 1 if int form wanted
 ;     D = code that sets D and DIC(0)
 ;     S = code that calls ^DIC
 N I,IP,L,M
 S (D,F,L,M)=""
 F I=1:1:$L(P,";") D
 . S IP=$P(P,";",I) Q:IP=""
 . I IP="I" S F=1 Q
 . I IP="L" S L=1 Q
 . I IP?.1"M"1"IX(".E1")" D  Q
 .. S IP=$P($P(IP,"(",2),")")
 .. S:$E(IP)'="""" IP=$$QT^DDSLIB(IP)
 .. S D=",D="_IP
 .. I $L(IP,U)>1 S D=D_",DIC(0)=""MF""",S=" D MIX^DIC1"
 .. E  S D=D_",DIC(0)=""F""",S=" D IX^DIC"
 S:D="" D=",DIC(0)=""MF""",S=" D ^DIC"
 S D=D_" S:$G(DDS1E) DIC(0)=DIC(0)_""E"_$E("L",L)_""""
 Q

DDSR
DDSR ;SFISC/MKO-PAINT ;20FEB2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
R ;All pages
 ;Called after wp, mults, & deletions
 F DDSSC=1:1:DDSSC D RP(DDSSC(DDSSC),DDSSC=1)
 Q
 ;
RP(X,DDS3LIN) ;Paint page
 ; X       = DDSSC(DDSSC) node
 ; DDS3LIN = paint bottom line
 ;
 S DDS3P=$P(X,U),DDS3UL=$P(X,U,2),DDS3LR=$P(X,U,3)
 I DDS3UL="" W $P(DDGLCLR,DDGLDEL,2)
 E  D ^DDSBOX(DDS3UL,DDS3LR)
 ;
 ;Write caps in "X" nodes
 D CAP^DDSR1
 ;
 ;Paint data & exec caps
 ;Hdr blk
 S DDS3B=$P($G(^DIST(.403,+DDS,40,DDS3P,0)),U,2)
 D:DDS3B]"" DB(DDS3P,DDS3B)
 ;
 ;Other blks
 S DDS3BO="" F  S DDS3BO=$O(^DIST(.403,+DDS,40,DDS3P,40,"AC",DDS3BO)) Q:'DDS3BO  S DDS3B=$O(^(DDS3BO,"")) Q:'DDS3B  D DB(DDS3P,DDS3B)
 K DDS3B,DDS3BO
 ;
 I DDS3LIN D
 . S DDSH=1,DX=0,DY=DDSHBX X IOXY W $TR($J("",IOM-1)," ","_") ;WRITE ____ LINE SO WE ARE AT LAST (80TH) COLUMN POSITION
 .I DDS3UL]"" S DY=DY+1 X IOXY W $P(DDGLCLR,DDGLDEL,3) N Y F Y=DY:1:IOSL K DDSMOUSE(Y)
 K DDS3P,DDS3UL,DDS3LR
 Q
 ;
DB(DDS3P,DDS3B) ;Paint data
 K @DDSREFT@("XCAP",DDS3P,DDS3B)
 S DDS3=@DDSREFS@(DDS3P,DDS3B)
 S DDS3FN="F"_$P(DDS3,U,3),DDS3REP=$P(DDS3,U,7),DDS3PTB=$P(DDS3,U,8)
 K DDS3
 ;
 I $G(DDS3REP)'>1 D
 . N DIE
 . S DDS3DA=$G(@DDSREFT@(DDS3P,DDS3B))
 . S:DDS3DA]"" DIE=$G(@DDSREFT@(DDS3P,DDS3B,DDS3DA,"GL"))
 . S DDS3DDO=0
 . F  S DDS3DDO=$O(@DDSREFS@(DDS3P,DDS3B,DDS3DDO)) Q:DDS3DDO'=+DDS3DDO  S DDS3C=$G(^(DDS3DDO,"D")) D:DDS3C]"" DF(DDS3P,DDS3B,DDS3DDO,DDS3DA,DDS3C,DDS3FN,DDS3PTB)
 . K DDS3C,DDS3DA,DDS3DDO
 E  D DMULT(DDS3P,DDS3B,DDS3FN)
 ;
 K DDS3FN,DDS3PTB,DDS3REP
 Q
 ;
DMULT(DDS3P,DDS3B,DDS3FN) ;Paint data, all lines
 N X,DIE
 S DDS3PDA=$P($G(@DDSREFT@(DDS3P,DDS3B)),U)
GFT I '$D(^(DDS3B,"COMP MUL")),'DDS3PDA  D
 . S X="",DDS3STL=1
 . S DDS3NREP=$P(@DDSREFS@(DDS3P,DDS3B),U,7),DDS3SEL=$P(^(DDS3B),U,10)
 E  D
 . S X=@DDSREFT@(DDS3P,DDS3B,DDS3PDA)
 . S DDS3STL=$P(X,U,3),DDS3NREP=$P(X,U,6),DDS3SEL=$P(X,U,9) ;3RD PIECE SAYS WHICH LINE IS NOW TOP LINE
 S DIE=$G(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,"GL"))
 ;
 F DDS3LN=1:1:DDS3NREP D  ;PAINT LINES ONE BY ONE
 . S DDS3SN=DDS3LN+DDS3STL-1
 . S DDS3DA=$G(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,DDS3SN))
 . S:DDS3LN=1 DDS3MORE=$S(DDS3STL>1:"+",1:" ") ;IF 1ST LINE ISN'T REALLY FIRST
LAST . I DDS3LN=DDS3REP S DDS3MORE=" " I $D(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,DDS3SN+1))#2 S DDS3MORE="+",DDS3MORE("LAST")=1 ;IF LAST LINE ISN'T REALLY LAST
 . D DMULT1(DDS3P,DDS3B,DDS3FN,DDS3DA,DDS3LN,DDS3SN,.DDS3MORE,DDS3SEL)
 . K DDS3MORE
 ;
 K DDS3DA,DDS3LN,DDS3NREP,DDS3PDA,DDS3SEL,DDS3SN,DDS3STL
 Q
 ;
DMULTN(DDS3P,DDS3B,DDS3PDA,DDS3REP,DDS3LN) ;Paint lines from DDS3LN
 S DDS3FN="F"_$P(@DDSREFS@(DDS3P,DDS3B),U,3)
 S DDS3STL=$P(@DDSREFT@(DDS3P,DDS3B,DDS3PDA),U,3),DDS3SEL=$P(^(DDS3PDA),U,9)
 F DDS3LN=DDS3LN:1:DDS3REP D
 . S DDS3SN=DDS3LN+DDS3STL-1
 . S DDS3DA=$G(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,DDS3SN))
 . S:DDS3LN=1 DDS3MORE=$S(DDS3STL>1:"+",1:" ")
 . S:DDS3LN=DDS3REP DDS3MORE=$S($D(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,DDS3SN+1))#2:"+",1:" ")
 . D DMULT1(DDS3P,DDS3B,DDS3FN,DDS3DA,DDS3LN,DDS3SN,.DDS3MORE,DDS3SEL)
 . K DDS3MORE
 K DDS3DA,DDS3FN,DDS3LN,DDS3SEL,DDS3SN,DDS3STL
 Q
 ;
DMULT1(DDS3P,DDS3B,DDS3FN,DDS3DA,DDS3LN,DDS3SN,DDS3MORE,DDS3SEL) ;Paint 1 line, LINE DDS3LN
 N DDSHITE S DDSHITE=$$HITE(DDS3B),DDS3DDO=0
 F  S DDS3DDO=$O(@DDSREFS@(DDS3P,DDS3B,DDS3DDO)) Q:DDS3DDO'=+DDS3DDO  S DDS3C=$G(^(DDS3DDO,"D")) I DDS3C]"" D  ;go thru fields in the multiple
 . S $P(DDS3C,U)=$P(DDS3C,U)+(DDS3LN-1*DDSHITE) ;DJW/GFT
 . S:$P(DDS3C,U,5)]"" $P(DDS3C,U,5)=$P(DDS3C,U,5)+(DDS3LN-1*DDSHITE) ;DJW/GFT
 . I $D(DDS3MORE),DDS3SEL=DDS3DDO,$P(DDS3C,U)?1.N D
 .. S DY=+DDS3C,DX=$P(DDS3C,U,2)-1 Q:DX<0
PLUSSIGN .. X IOXY D
 ...I DDS3MORE="+" S DDSMOUSE(DY,DX,DX)=$S($D(DDS3MORE("LAST")):"NP",1:"PP") I $G(DDSMOUSY) S DDS3MORE=$$HIGH^DDSU(DDS3MORE)
 ...W DDS3MORE
 . D DF(DDS3P,DDS3B,DDS3DDO,DDS3DA,DDS3C,DDS3FN,1,DDS3LN,DDS3SN) ;7TH parameter says ALWAYS PAINT AREA even if value is null
 K DDS3C,DDS3DDO
 Q
 ;
HITE(BLK) N D,Z,H,L,F S D=1,H=1,L=999 F F=0:0 S F=$O(^DIST(.404,BLK,40,F)) Q:'F  S Z=$G(^(F,2)) D
 .I 'Z S Z=$P(Z,U,3) ;MIGHT BE JUST A CAPTION
 .I Z S:Z<L L=Z S:Z>H H=Z S D=H-L+1 ;GFT
 Q D
 ;
 ;
DF(DDS3P,DDS3B,DDS3DDO,DDS3DA,DDS3C,DDS3FN,DDS3FLG,DDS3LN,DDS3SN) ;
 ;Paint field
 N DDS3FLD,DDS3LEN,DDSX
 D:$P(DDS3C,U,5)]"" XCAP
 ;
 S DY=+DDS3C,DX=$P(DDS3C,U,2)
 S DDS3LEN=$P(DDS3C,U,3),DDS3FLD=$P(DDS3C,U,4)
 ;
 ;Computed flds
 I DDS3DA]"",$P(DDS3C,U,9) S DDSX=$$VAL^DDSCOMP(DDS3DDO,DDS3B,DDS3DA)
 ;
 ;Form only flds
 Q:DDS3FLD=""
 I DDS3FLD'=+DDS3FLD N DDS3FN S DDS3FN="F0"
 ;
 ;External form
 S:DDS3FLD DDSX=$S(DDS3DA="":"",$D(@DDSREFT@(DDS3FN,DDS3DA,DDS3FLD,"X"))#2:^("X"),1:$G(^("D")))
PAINT D  ;I $G(DDSX)]""!$G(DDS3FLG) D   PAINT NULL FIELD TO SHOW COLOR
 . I DDS3LEN=1 I $$WPLUS^DDSWP(DDS3FN,DDS3DA,DDS3FLD) S DDSX="+" ;GO SEE IF WE NEED PLUS SIGN IN WORD-PROCESSING BOX
 . S:$D(DDSX)[0 DDSX=""
 . X IOXY
 . I '$P(DDS3C,U,10) S DDSX=$E(DDSX,1,DDS3LEN)_$J("",DDS3LEN-$L(DDSX))
 . E  S DDSX=$J("",DDS3LEN-$L(DDSX))_$E(DDSX,1,DDS3LEN)
 . W $P(DDGLVID,DDGLDEL)_DDSX_$P(DDGLVID,DDGLDEL,10) ;I DDSX["^DIZ(600001,""C""," W "<" H 9
 Q
 ;
 ;
XCAP ;Paint exec caps
 N Y,DDSLN,DDSSN
 I 'DDS3DA N DA,D0 S (DA,D0)=""
 ;
 I DDS3DA N DDSDL S DDSDL=$L(DDS3DA,",")-2
 I  N DA,@$$D0^DDS(DDSDL)
 I  D BLDDA^DDS(DDS3DA)
 ;
 S DDS3TP=$P($G(@DDSREFS@(DDS3P,DDS3B)),U,5)
 S DDS3L0=$G(^DIST(.404,DDS3B,40,DDS3DDO,0)) G:DDS3L0?."^" XCAPQ
 S DDS3L01=$G(^DIST(.404,DDS3B,40,DDS3DDO,.1)) G:DDS3L01?."^" XCAPQ
 ;
 S:$D(DDS3LN) DDSLN=DDS3LN
 S:$D(DDS3SN) DDSSN=DDS3SN
 ;
 X DDS3L01 G:$G(Y)="" XCAPQ
 S DDS3CAP=Y
 ;
 I DDS3TP="e","^2^3^"[(U_$P(DDS3L0,U,3)_U)!'$P(DDS3L0,U,3) D
 . S Y=$$UP^DILIBF(Y) ;**
 . S @DDSREFT@("XCAP",DDS3P,Y,DDS3B,DDS3DDO)=""
 ;
 S DY=$P(DDS3C,U,5),DX=$P(DDS3C,U,6)
 S DDS3CAP=DDS3CAP_$P(DDS3C,U,7)
 S:$P(DDS3C,U,8) DDS3CAP=$P(DDGLVID,DDGLDEL,4)_DDS3CAP_$P(DDGLVID,DDGLDEL,10)
 X IOXY W DDS3CAP
XCAPQ K DDS3CAP,DDS3L0,DDS3L01,DDS3TP
 Q

DDSR1
DDSR1 ;SFISC/MKO-PAINT ;11AUG2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CAP ;Write captions in "X" nodes
 N DDGLVAN S DDGLVAN=1 ;** DEFEAT OLD LOGIC ABOUT LO-INTENSITY
 W:$D(DDGLVAN) $P(DDGLVID,DDGLDEL,2)
 ;
EGP N DDCAP,A,C,C1,C2,P,PC,V,X ;**CCO/NI
 I $G(DUZ("LANG"))>1 S DY=$NA(@DDSREFS@("CAP")) F  S DY=$Q(@DY) Q:$QS(DY,4)'="CAP"  D  ;IF WE HAVE A FIELD WITH A FOREIGN LABEL ENTERED, USE IT
 .I $QS(DY,7)=DDS3P S C1=+$QS(DY,8),C2=$P($G(@DDSREFS@(DDS3P,C1)),U,3) I C2 S X=$G(^(C1,+$QS(DY,9),"D")),A=$P(X,U,4) I A S P=$P($G(^DD(C2,A,0)),U),A=$$LABEL^DIALOGZ(C2,A) I A]"",A'=P S DDCAP($$UP^DILIBF($QS(DY,5)))=A
 S DY="" F  S DY=$O(@DDSREFS@("X",DDS3P,DY)) Q:DY=""  S DX=$O(^(DY,"")),DDS3CAP=^(DX) D  X IOXY W DDS3CAP
 .I $G(DUZ("LANG"))>1 D
 ..;I $D(@DDSREFS@("X",DDS3P,DY,DX,"LANG",DUZ("LANG"))) S DDS3CAP=^(DUZ("LANG")) Q
 ..S C="",C2=$$UP^DILIBF(DDS3CAP) F  S C=$O(DDCAP(C)) Q:C=""  D
 ...S C1=$L(C),P=$F(C2,C) I P S $E(DDS3CAP,P-C1,P-1)=$E(DDCAP(C)_$J("",80),1,C1) ;COULD FIND "NAME" IN "FATHER'S NAME" AND REPLACE IT WITH "NOBRE"!
 ..Q
 ..S C=DDS3CAP,C1=C?.E1":" I C1 S C=$E(C,1,$L(C)-1)
 . Q:'$D(@DDSREFS@("X",DDS3P,DY,DX,"A"))  S A=^("A")
 . S X=DDS3CAP,DDS3CAP="",P=1
 . F PC=1:1:$L(A,U) S C=$P(A,U,PC) D:C]""
 .. S C1=$P(C,";"),C2=$P(C,";",2)
 .. S V=$S($P(C,";",3)="U":$P(DDGLVID,DDGLDEL,4),1:"")
 .. S DDS3CAP=DDS3CAP_$E(X,P,C1-1)_V_$E(X,C1,C2)_$P(DDGLVID,DDGLDEL,10)_$S($D(DDGLVAN):$P(DDGLVID,DDGLDEL,2),1:"")
 .. S P=C2+1
 . S DDS3CAP=DDS3CAP_$E(X,P,999)
 ;
 W:$D(DDGLVAN) $P(DDGLVID,DDGLDEL,10)
 K DDS3CAP
 Q

DDSRP
DDSRP ;GFT/GFT - PRINT FORM 'DDS', PAGE 'DDS3P';2013-01-25  12:19 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DDS,DDS3P,DDSJ) ; Main Entry Point
 I '$G(DDSJ) S DDSJ=$J
 N X,Y,IOP,POP,BLK,DDSREFS,DDSREFT
 S DDSREFT=$NA(^TMP("DDS",DDSJ,DDS))
 S DDSREFS=$NA(^DIST(.403,+DDS,"AY"))
 K ^UTILITY($J,"DDSRP")
 ;Set terminal characterstics for scroll mode
 W *27,"[?1000l" ; Mouse Off
 W $P(DDGLCLR,DDGLDEL,2) ; Clear ALL screen
 S DX=0,DY=0 X IOXY ; Take cursor to 0,0
 W $P(DDGLVID,DDGLDEL)_"PRINT SCREEN"_$P(DDGLVID,DDGLDEL,10) ; Write to screen in bold
 D KILL^DDGLIB0() ; Turn off screen handling
 D ^%ZIS ; Select Device
 I POP D HLP^DDSUTL("SORRY, PRINTING FAILED") G ENQ  ; Quit if can't open
 I $E(IOST,1,2)="C-" S IOF="!" ; On a terminal, make Form Feed a Line Feed
 U IO ; Use printer device
 D CAP,BLKS,PRINT ; This is where the printing really happens.
 D  ; Block to new DDS so that the reader can't find it for writing to screen
 . N DDS,DIR I $E(IOST,1,2)="C-" S DIR(0)="E" D ^DIR ; Press Enter to continue 
 D ^%ZISC ; Close device
ENQ ; Goto label in case we fail to open the device.
 D INIT^DDGLIB0() ; Turn screen handling back on again.
 I $G(DDS)>0 W *27,"[?1000h" ; Mouse On
 D FINISH^DDGLIBP() ; Turn on terminators, off echo, and set RM to zero.
 Q
BLKS ;FROM ^DDSR
 S BLK=$P($G(^DIST(.403,+DDS,40,DDS3P,0)),U,2) ;Hdr blk
 D:BLK]"" DB(DDS3P,BLK)
 ;
 ;Other blks
 N DDS3BO
 S DDS3BO="" F  S DDS3BO=$O(^DIST(.403,+DDS,40,DDS3P,40,"AC",DDS3BO)) Q:'DDS3BO  S BLK=$O(^(DDS3BO,"")) Q:'BLK  D DB(DDS3P,BLK)
 Q
 ;
PRINT ;
 N DDSI S DDSI=1
 F Y=0:1:$O(^UTILITY($J,"DDSRP",""),-1) W !,$G(^UTILITY($J,"DDSRP",Y)) S DDSI=DDSI+1 I $G(IOSL),DDSI'<IOSL S DDSI=1 I $G(IOF)]"" W @IOF
 W ! F Y=1:1:80 W "_"
 W:$D(IOF) @IOF
 Q
 ;
CAP N DDCAP,A,C,C1,C2,P,PC,V ; FROM ^DDSR1
 I $G(DUZ("LANG")) S DY=$NA(@DDSREFS@("CAP")) F  S DY=$Q(@DY) Q:$QS(DY,4)'="CAP"  D
 .I $QS(DY,7)=DDS3P S C1=+$QS(DY,8),C2=$P($G(@DDSREFS@(DDS3P,C1)),U,3) I C2 S X=$G(^(C1,+$QS(DY,9),"D")),A=$P(X,U,4) I A S A=$$LABEL^DIALOGZ(C2,A) I A]"" S DDCAP($$UP^DILIBF($QS(DY,5)))=A
 S DY="" F  S DY=$O(@DDSREFS@("X",DDS3P,DY)) Q:DY=""  S DX=$O(^(DY,"")),DDS3CAP=^(DX) D PUT(DDS3CAP)
 ;.I $G(DUZ("LANG")) D
 ;..S C="",C2=$$UP^DILIBF(DDS3CAP) F  S C=$O(DDCAP(C)) Q:C=""  D
 ;...S C1=$L(C),P=$F(C2,C) I P S $E(DDS3CAP,P-C1,P-1)=$E(DDCAP(C)_$J("",80),1,C1)
 ;..Q
 ;..S C=DDS3CAP,C1=C?.E1":" I C1 S C=$E(C,1,$L(C)-1)
 ;. Q:'$D(@DDSREFS@("X",DDS3P,DY,DX,"A"))  S A=^("A")
 ;. S X=DDS3CAP,DDS3CAP="",P=1
 ;. F PC=1:1:$L(A,U) S C=$P(A,U,PC) D:C]""
 ;.. S C1=$P(C,";"),C2=$P(C,";",2)
 ;.. S DDS3CAP=DDS3CAP_$E(X,P,C1-1)_V_$E(X,C1,C2)
 ;.. S P=C2+1
 ;. S DDS3CAP=DDS3CAP_$E(X,P,999)
 Q
 ;
DB(DDS3P,DDS3B) ;DATA BLOCK
 K @DDSREFT@("XCAP",DDS3P,DDS3B)
 S DDS3=@DDSREFS@(DDS3P,DDS3B)
 S DDS3FN="F"_$P(DDS3,U,3),DDS3REP=$P(DDS3,U,7),DDS3PTB=$P(DDS3,U,8)
 K DDS3
 ;
 I $G(DDS3REP)'>1 D
 . N DIE
 . S DDS3DA=$G(@DDSREFT@(DDS3P,DDS3B))
 . S:DDS3DA]"" DIE=$G(@DDSREFT@(DDS3P,DDS3B,DDS3DA,"GL"))
 . S DDS3DDO=0
 . F  S DDS3DDO=$O(@DDSREFS@(DDS3P,DDS3B,DDS3DDO)) Q:DDS3DDO'=+DDS3DDO  S DDS3C=$G(^(DDS3DDO,"D")) D:DDS3C]"" DF(DDS3P,DDS3B,DDS3DDO,DDS3DA,DDS3C,DDS3FN,DDS3PTB)
 . K DDS3C,DDS3DA,DDS3DDO
 E  D DMULT(DDS3P,DDS3B,DDS3FN)
 ;
 K DDS3FN,DDS3PTB,DDS3REP
 Q
 ;
DMULT(DDS3P,DDS3B,DDS3FN) ;Paint data, all lines
 N X,DIE
 S DDS3PDA=$P($G(@DDSREFT@(DDS3P,DDS3B)),U)
GFT I '$D(^(DDS3B,"COMP MUL")),'DDS3PDA  D
 . S X="",DDS3STL=1
 . S DDS3NREP=$P(@DDSREFS@(DDS3P,DDS3B),U,7),DDS3SEL=$P(^(DDS3B),U,10)
 E  D
 . S X=@DDSREFT@(DDS3P,DDS3B,DDS3PDA)
 . S DDS3STL=$P(X,U,3),DDS3NREP=$P(X,U,6),DDS3SEL=$P(X,U,9) ;3RD PIECE SAYS WHICH LINE IS NOW TOP LINE
 S DIE=$G(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,"GL"))
 ;
 F DDS3LN=1:1:$O(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,"A"),-1) D  ;PAINT LINES ONE BY ONE
 . S DDS3SN=DDS3LN ;START WITH LINE 1 ALWAYS
 . S DDS3DA=$G(@DDSREFT@(DDS3P,DDS3B,DDS3PDA,DDS3SN))
 . D DMULT1(DDS3P,DDS3B,DDS3FN,DDS3DA,DDS3LN,DDS3SN,DDS3SEL)
 F DDS3LN=DDS3LN+1:1:DDS3REP S DY=DY+1,DX=2 D PUT("  ") ;BLANK LINES AT END OF MULTIPLES
 K DDS3DA,DDS3LN,DDS3NREP,DDS3PDA,DDS3SEL,DDS3SN,DDS3STL
 Q
 ;
DMULT1(DDS3P,DDS3B,DDS3FN,DDS3DA,DDS3LN,DDS3SN,DDS3SEL) ;Paint 1 line, LINE DDS3LN
 N DDSHITE S DDSHITE=$$HITE^DDSR(DDS3B),DDS3DDO=0
 F  S DDS3DDO=$O(@DDSREFS@(DDS3P,DDS3B,DDS3DDO)) Q:DDS3DDO'=+DDS3DDO  S DDS3C=$G(^(DDS3DDO,"D")) I DDS3C]"" D
 . S $P(DDS3C,U)=$P(DDS3C,U)+(DDS3LN-1*DDSHITE) ;DJW/GFT
 . S:$P(DDS3C,U,5)]"" $P(DDS3C,U,5)=$P(DDS3C,U,5)+(DDS3LN-1*DDSHITE) ;DJW/GFT
 . D DF(DDS3P,DDS3B,DDS3DDO,DDS3DA,DDS3C,DDS3FN,1,DDS3LN,DDS3SN)
 K DDS3C,DDS3DDO
 Q
 ;
DF(DDS3P,DDS3B,DDS3DDO,DDS3DA,DDS3C,DDS3FN,DDS3FLG,DDS3LN,DDS3SN) ;Paint field
 N DDS3FLD,DDS3LEN,DDSX
 D:$P(DDS3C,U,5)]"" XCAP
 ;
 S DY=+DDS3C,DX=$P(DDS3C,U,2)
 S DDS3LEN=$P(DDS3C,U,3),DDS3FLD=$P(DDS3C,U,4)
 ;
 ;Computed flds
 I DDS3DA]"",$P(DDS3C,U,9) S DDSX=$$VAL^DDSCOMP(DDS3DDO,DDS3B,DDS3DA)
 ;
 ;Form only flds
 Q:DDS3FLD=""
 I DDS3FLD'=+DDS3FLD N DDS3FN S DDS3FN="F0"
 ;
 ;External form
 S:DDS3FLD DDSX=$S(DDS3DA="":"",$D(@DDSREFT@(DDS3FN,DDS3DA,DDS3FLD,"X"))#2:^("X"),1:$G(^("D")))
 I $G(DDSX)]""!$G(DDS3FLG) D
 . S:$D(DDSX)[0 DDSX=""
 . I '$P(DDS3C,U,10) S DDSX=$E(DDSX,1,DDS3LEN)_$J("",DDS3LEN-$L(DDSX))
 . E  S DDSX=$J("",DDS3LEN-$L(DDSX))_$E(DDSX,1,DDS3LEN)
 . D PUT(DDSX)
 Q
 ;
XCAP ;Paint exec caps
 N Y,DDSLN,DDSSN
 I 'DDS3DA N DA,D0 S (DA,D0)=""
 ;
 I DDS3DA N DDSDL S DDSDL=$L(DDS3DA,",")-2
 I  N DA,@$$D0^DDS(DDSDL)
 I  D BLDDA^DDS(DDS3DA)
 ;
 S DDS3TP=$P($G(@DDSREFS@(DDS3P,DDS3B)),U,5)
 S DDS3L0=$G(^DIST(.404,DDS3B,40,DDS3DDO,0)) G:DDS3L0?."^" XCAPQ
 S DDS3L01=$G(^DIST(.404,DDS3B,40,DDS3DDO,.1)) G:DDS3L01?."^" XCAPQ
 ;
 S:$D(DDS3LN) DDSLN=DDS3LN
 S:$D(DDS3SN) DDSSN=DDS3SN
 ;
 X DDS3L01 G:$G(Y)="" XCAPQ
 S DDS3CAP=Y
 ;
 I DDS3TP="e","^2^3^"[(U_$P(DDS3L0,U,3)_U)!'$P(DDS3L0,U,3) D
 . S Y=$$UP^DILIBF(Y) ;**
 . S @DDSREFT@("XCAP",DDS3P,Y,DDS3B,DDS3DDO)=""
 ;
 S DY=$P(DDS3C,U,5),DX=$P(DDS3C,U,6)
 S DDS3CAP=DDS3CAP_$P(DDS3C,U,7)
 D PUT(DDS3CAP)
XCAPQ K DDS3CAP,DDS3L0,DDS3L01,DDS3TP
 Q
 ;
PUT(X) S $E(^UTILITY($J,"DDSRP",DY),DX+1,DX+$L(X))=X Q
 ;

DDSRSEL
DDSRSEL ;SFISC/MKO-RECORD SELECTION ;7JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PG ;Called from:
 ;  DDS01 when user presses SELECT
 ;  FIRSTPG^DDS0 if no DA was passed in.
 ;
 ;Returns (if there is a record selection page and we're not in
 ;a multiple)
 ; DDSPG  = Record selection page #
 ; DDACT  = "NP"
 ; DDSSEL = 1 (undefined if no record selection page)
 ;
 N P,P1 K DDSSEL
 I $D(DDSSC),$P($G(DDSSC(DDSSC)),U,4) Q  ;GFT
 ;
 S P="",P1=$P($G(^DIST(.403,+DDS,21)),U)
 I P1]"" D
 . S P=$O(^DIST(.403,+DDS,40,"B",P1,""))
 . I P]"",$D(^DIST(.403,+DDS,40,P,0))[0 S P=""
 ;
 I P]"" D
 . I $G(DDO),$G(DDSDN)=1 D
 .. D ERR3^DDS3
 . E  S DDSPG=P,DDACT="NP",DDSSEL=1
 Q
 ;
GDA ;Called from DDS
 ;After a record selection page is closed get the DA from
 ;the first field on the page.
 N DDSANS,DDSREC,Y,PG
 S DDSANS=""
GFT S PG=$P($G(^DIST(.403,+DDS,21)),U) G KILL:'PG N P S P=$O(^(40,"B",PG,0)) D:P  I '$D(Y) G KILL
 .F Y=0:0 S Y=$O(^DIST(.403,+DDS,40,P,40,Y)) Q:'Y  I $G(^(Y,"COMP MUL"))]"" K Y Q
 E  S DDSREC=$$GET^DDSVALF(1,1,PG) ;ON THE OLD KIND OF LOOKUP PAGE, THERE IS 1 FIELD, 1 BLOCK
 ;
 K DA,DDSDAORG
 S DDSDA=DDSDASV,DDSDL=DDSDLSV
 D BLDDA^DDS(DDSDA)
 M DDSDAORG=DDSORGSV
 ;
 I 'DDSREC,DA S DDSREC=DA
 E  I DDSREC,DDSREC'=DA D
 . I DA D  Q:DDSREC=DA
 .. S DDSANS=$$ASKSAVE
 .. I DDSANS="R" S DDSREC=DA
 .. E  I DDSANS="S" D
 ... D ^DDS4
 ... S:Y'=1 DDSREC=DA
 . ;
 . S DA=DDSREC
 . D REC^DDS0(DDP,.DA)
 . ;
 . I $G(DIERR) D  Q
 .. D ERR^DDSMSG H 2
 .. S DA=+$G(DDSDASV),DDACT="N"
 .. D REC^DDS0(DDP,.DA)
 . ;
 . S DDACT="N"
 . I DDSSC=1 D FRSTPG^DDS0(DDS,.DA,$G(DDSPAGE))
 . D CLRDAT,UNLOCK
 ;
KILL K DDSSEL,DDSDASV,DDSDASV,DDSDLSV,DDSORGSV
 Q
 ;
ASKSAVE() ;
 ;Ask user whether to save the previous record
 N X,Y
 D:DDM CLRMSG^DDS
 S DDM=1
 ;
 K DIR S DIR(0)="SM^S:SAVE;D:DISCARD;R:RETURN"
 S DIR("A",1)="  NOTE:  You must Save or Discard all edits to the"
 S DIR("A",2)="         previous record before editing the next record."
 S DIR("A",3)=" "
 S DIR("A")="Save, Discard, or Return (S/D/R)"
 S DIR("B")="SAVE"
 ;
 S DIR("?",1)="Enter 'S' to save or 'D' to discard."
 S DIR("?")="Enter 'R' or '^' to return to previous record."
 ;
 S DIR0=IOSL-1_U_($L(DIR("A"))+1)_"^7^"_(IOSL-4)_"^0"
 D ^DIR
 I $D(DIRUT) S Y="R"
 E  I X="SAVE" S Y="S"
 K DIR,DIROUT,DIRUT,DTOUT,DUOUT
 Q Y
 ;
CLRDAT ;Clear all data values from @DDSREFT
 N F,P
 S P=0 F  S P=$O(@DDSREFT@(P)) Q:'P  K @DDSREFT@(P)
 S F="F" F  S F=$O(@DDSREFT@(F)) Q:$E(F)'="F"  K @DDSREFT@(F)
 Q
 ;
UNLOCK ;Unlock all records locked
 Q:'$D(^TMP("DDS",$J,"LOCK"))
 N I S I=""
 F  S I=$O(^TMP("DDS",$J,"LOCK",I)) Q:I=""  D
 . I I'=(DIE_DA_")") L -@I K ^TMP("DDS",$J,"LOCK",I)
 Q

DDSRUN
DDSRUN ;SFISC/MKO-RUN A FORM ;8DEC2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;Select file (DDSFILE)
EGP S DDS1=8108.3 D W^DICRW K DDS1 G:Y<0 RUNQ ;**CCO/NI 'RUN FORM:'
 G:'$D(@(DIC_"0)")) RUNQ
 K DDSFILE S DDSFILE=+Y
 ;
 ;Select form (DDSRUNDR)
 K DIC
 S DIC=.403,DIC(0)="QEA",D="F"_+Y
 S DIC("S")="I $P(^(0),U,8)=+DDSFILE"
 I DUZ(0)'="@" S DIC("S")=DIC("S")_" N DDSI F DDSI=1:1:$L($P(^(0),U,2)) I DUZ(0)[$E($P(^(0),U,2),DDSI) Q"
 W ! D IX^DIC K DIC,D G:Y<0 RUNQ
 S DDSRUNDR=+Y
 ;
 I '$$COMPILED^DDS0(DDSRUNDR) D EN^DDSZ(DDSRUNDR) G:$G(DIERR) RUNQ
 ;
 ;Select page (DDSPAGE)
PAGE K DIR S Y=$O(^DIST(.403,DDSRUNDR,40,0)) I '$O(^(Y)) S DDSPAGE=1 G REC ;DON'T ASK IF ONLY ONE!
 S Y=$G(^DIST(.403,DDSRUNDR,21)) I Y S DDSPAGE=+Y G REC ;IF THERE'S A RECORD SELECTION PAGE, USE IT
 S DIR(0)="NOA^1:999.9:1"
 S DIR("A")="Enter number of first page: ",DIR("B")=1
 W ! D ^DIR K DIR G:$D(DIRUT) RUNQ
 K DDSPAGE S:Y'=1 DDSPAGE=Y
 ;
REC ;Select record (DA)
 K DA
 I '$P(^DIST(.403,DDSRUNDR,0),U,10),$S($G(DDSPAGE):$G(^(21))-DDSPAGE,1:1) D  G:DA<0 RUNQ ;IF IT'S A RECORD SELECTION PAGE, THAT WILL FIND 'DA'
 . S DIC=DDSFILE,DIC(0)="QEALM"
 . W ! D ^DIC K DIC
 . S DA=+Y
 K D,DIC,X,Y
 ;
 ;Invoke form
 K DR S DR=DDSRUNDR D ^DDS G:$D(DA) REC
 ;
RUNQ ;Clean up and quit
 I $D(DIERR) W !,$C(7) D MSG^DIALOG("BW")
 K D,DIC,X,Y
 K DDSFILE,DDSPAGE,DDSRUNDR,DA,DR
 K DIRUT,DTOUT,DUOUT
 Q

DDSSTK
DDSSTK ;SFISC/MKO-STACK CONTEXT, GO TO A NEW PAGE ;19JUNE2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DDO
 N DDSBK,DDSDN,DDSFLD,DDSNP,DDSOPB,DDSPG,DDSPTB,DDSREP,DDSTP
 ;
 I DDSSTACK?1"`".E D
 . S DDSSTACK=+$E(DDSSTACK,2,999)
 E  I DDSSTACK=+$P(DDSSTACK,"E") D
 . S DDSSTACK=+$O(^DIST(.403,+DDS,40,"B",DDSSTACK,""))
 E  D
UP . S DDSSTACK=$O(^DIST(.403,+DDS,40,"C",$$UP^DILIBF(DDSSTACK),"")) ;**
 ;
 I 'DDSSTACK!($D(^DIST(.403,+DDS,40,+$G(DDSSTACK),0))[0) D  Q
 . K DDSSTACK,DDSBR
 ;
 N DDSDAORG,DDSDLORG,DDSFLORG,DDSPG
 N:'$P(^DIST(.403,+DDS,40,+$G(DDSSTACK),0),U,6) DDSSC ;N DDSSC (Page array) if not going to a POPUP PAGE
 ;
 S DDSPG=DDSSTACK
 K DDSSTACK,DDSBR
 ;
 S DDSDLORG=DDSDL,DDSDAORG=DA
 F DDSI=1:1:DDSDL S DDSDAORG(DDSI)=DA(DDSI)
 K DDSI
 ;
DDSH S DDSSTK=1,DDSH=1 ;DDSH tells SM+6^DIR0 to refresh the COMMAND LINE
 D PROC^DDS
 Q

DDSU
DDSU ;SFISC/MLH-PROCESS HELP ; 14NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LIST ;
 I '$D(DDS) D  Q
FM .;FileMan help - Non screen
 .N A0,A1,A2,A3,A4,DDSDIW,DDSDIY,Y
 .S A0=""
 .F  S A0=$O(DDH(A0)) Q:'A0  S DDSDIW=$X,DDSDIY=$Y D W I $G(DDD)>2,DDSDIW-$X!(DDSDIY-$Y) D STP Q:$D(DTOUT)
 .I $G(DIPGM)="DICQ1",$G(DP),$G(DIC("?N",DP)) D
 ..N DIZ S DIZ=0 D T Q
Q .I '$D(DTOUT) D SV S DDH=0 Q
 .K DDH D:'DTOUT  Q
 ..K DTOUT N % S %=$G(DIPGM) I %'="DICQ1",%'="DIEQ" Q
 ..S DUOUT=1
 ;
 ;SCREENMAN HELP
 N DIR0A K DICQRETA,DICQRETV D SC I $D(DIR0A) S DICQRETV=DIR0A ;RETURN VALUE from MOUSE
 Q
 ; 
SC ;Screen Help, also from DDS2,DDSCOM,DDSMSG
 N A0,A1,A2,A3,A4,A5,A6,DDSB1,X,Y
 K DTOUT,DUOUT
 ;
 W $P(DDGLVID,DDGLDEL,9) S X=$G(IOM,80)-1 X DDGLZOSF("RM")
 I $D(DDQ)#2,DDQ<(IOSL-1),DDQ>DDSHBX!$P(DDQ,U,2)!$D(DDIOL) S DY=$P(DDQ,U),DX=$P(DDQ,U,2)
 E  D CLRMSG^DDS S DY=DDSHBX
 X DDXY
 ;
 S:$G(DDD,5)=5 DDD=1
 S:$D(DDO) DDSB1=DDO
 S DDM=1,DDO=.5
 S (A0,DIY,X)="",A1=0,A5=$S(DDD=2:$O(DS(0)),1:$O(DDH(A0)))
 K A2,DDSQ
 ;Now loop thru the DDHs
 F  D  Q:DDO'<1!(X=U)!'A0!DIY!$D(DTOUT)!$D(DUOUT)!$D(DIR0A)
SC1 .S A6=A0,A0=$O(DDH(A0)) S:A6="" A6=A0-1
 .I 'A0,DDD Q:DDD=1  Q:DD<DS
 .S A4=$O(DDH(+A0,""))
 .I A4'="X"!(DY'>DDSHBX) S DY=DY+1 X DDXY
 .I A4="E" D SC2 Q
MORE .I $Y'<(IOSL-2)!'A0 D SC2 Q:DDO'<1!(X=U)!'A0!DIY!$D(DTOUT)!$D(DUOUT)!$D(DIR0A)  S DY=DDSHBX+1,DX=0 X DDXY
 .Q:A4=""
 .D WR ;Write something!
 .I $Y'<(IOSL-1),'$D(DTOUT),'$D(DUOUT) D  Q  ;SEE IF WE ARE 2 LINES FROM BOTTOM
 ..W ! S A6=A0 D SC2 ;Now that we have written choice #A0, allow them to choose it
 ..W $P(DDGLVID,DDGLDEL,8) S X=0 X DDGLZOSF("RM") D REFRESH^DDSUTL
 ..W $P(DDGLVID,DDGLDEL,9) S X=$G(IOM,80)-1 X DDGLZOSF("RM")
 ..S DX=0,DY=DDSHBX X DDXY
 .S DY=$Y,DX=0
 I $D(DDSB1) S:DDO<1 DDO=DDSB1
 E  K DDO
 ;
 S %=0
 S DDQ=$S(DY>(IOSL-1):IOSL-1,1:DY)_U_DX
 S:DDQ>DDSHBX DDM=1
 I $D(A2) K DDD,DDH,DDQ S %=A2 S:%'=1 DDSQ=1 D CLRMSG^DDS G QQ
 I $D(DDC),DDC'<0 D SV
 E  K DDD,DDH S DDSQ=1 ;DDSQ means we're done with the Lister
 ;
QQ S A0=$X S X=0 X DDGLZOSF("RM") W $P(DDGLVID,DDGLDEL,8) S $X=A0
 Q
 ;
 ;
SC2 S DX=0,DY=IOSL-1 X DDXY
 I DDD=1 W $$EZBLD^DIALOG(8053) D READ Q  ;DDD=1 means 'HIT RETURN to CONTINUE'
 W $$EZBLD^DIALOG(8081,A5_"-"_A6)_$P(DDGLCLR,DDGLDEL) ;CHOOSE 1-3 ...
 D READ I $G(DUOUT) K DDC G Q2
 I X]"",X<A5!(X>A6) W $C(7) G SC2
 E  I X S:DDD["J" DDO=$O(DDH(X,"")) K DDC
 D CLRMSG^DDS
 S DDM=1
Q2 S DIY=X,DY=DDSHBX
 Q
 ;
 ; 
SV ;Kill DDH array, but save the "ID" nodes and DDH itself
 K A1,A2
 S:$D(DDH("ID")) A1=DDH("ID")
 S:$D(DDH("ID",1)) A2=DDH("ID",1)
 K DDH S DDH=0
 S:$D(A1) DDH("ID")=A1
 S:$D(A2) DDH("ID",1)=A2
 Q
 ;
 ;
 ;
Z ;From DICQ1,DIEQ
 D Y,T Q
 ;
Y D:'$D(DISYS) OS^DII
 S $X=0,$Y=0
 S DIZ=$S($D(DILN)&'$D(DIR0):DILN,$G(IOSL):IOSL-3,1:21) ;**
 Q
 ;
 ;
 ;
STP Q:$D(DD)[0!($D(DIY)[0)  I DD+DIY'>79 W ?DD S DD=DD+DIY Q
 ;
T W !?3 S DD=DIY+3
 I $Y>DIZ!'$Y D
 .N DDSUP S DDSUP=$$EZBLD^DIALOG(8053) W DDSUP R %Y:$G(DTIME,300) ;**
 . E  S DTOUT=1 K DDD
 . W $C(13),$J("",$L(DDSUP)+3),$C(13) Q:$D(DTOUT)
 . I %Y[U S DTOUT=0 K DDD
 . D Y W ?3
 Q
 ;
W S A4=$O(DDH(A0,"")) Q:A4=""  Q:DDH(A0,A4)=""
 W:'$D(DDD) !
 I $G(DDD)=3,A4["T" K DDD
 ;
WR I A4["X" D  Q
 . N DDD,DIY,DDSXEC
 . S DDSXEC=DDH(A0,A4)
 . N DDH
 . I $D(DDS) N DDSID S DDSID=1 S DDQ=$S(DY>(IOSL-1):IOSL-1,1:DY)_U_DX
 . X DDSXEC
 ;
 I A4["Q" D  Q
 . S A4=DDH(A0,A4),%=$P(A4,U,1)
 . I $D(DDS) D ASK Q
 . W $P(A4,U,2)
 . D YN^DICN
 ;
 I A4["T" D  Q
 . I DDH(A0,A4)[$C(0) D
 .. S DX=$L(DDH(A0,A4),$C(0))-1
 .. X DDXY
 .. S DDH(A0,A4)=$TR(DDH(A0,A4),$C(0),"")
 . W DDH(A0,A4)
 ;
 I '$D(DDS),$G(DDD)'["J",A4'=+A4 Q
 I $D(DDS),$G(DDD)=2!($G(DDD)["J") W A0,?7
 ;
CHOICE I $D(DDS),$G(DDSMOUSY) D
 .W "   " D WRITMOUS(DDH(A0,A4))
 E  W DDH(A0,A4)
 I $D(DDH("ID")) D  S:$D(DUOUT) DIY=U
 . N DDD,DIY,DDSID
 . S DDSID=DDH("ID")
 . S:$D(DDH("ID",1))#2 DDSID(1)=DDH("ID",1)
 . N DDH
 . S:$D(DDSID(1))#2 DDH("ID",1)=DDSID(1) K DDSID(1)
 . S Y=A4
 . S:$D(DDS) DDQ=$S(DY>(IOSL-1):IOSL-1,1:DY)_U_$X
 . X DDSID
 Q
 ;
 ;
WRITMOUS(C) ;MAKE THE CHOICES IN THE COMMAND AREA CLICKABLE!!
 W $P(DDGLCLR,DDGLDEL)
 N F
 F  Q:$A(C)-32  S C=$E(C,2,999) W " " ;LEADING BLANKS
 F F=0:1 Q:$A(C,$L(C))-32  S C=$E(C,1,$L(C)-1)
 I $G(DDSMOUSY) S DDSMOUSE($Y,$X,$X+$L(C)-1,1)=C W $$HIGH(C)
 E  W C
 W $J("",F)
 Q
 ;
 ;
 ;
HIGH(X) ;also from DDSCOM, DDSR
 I '$D(DDGLVID) Q X
 Q $P(DDGLVID,DDGLDEL,10)_$P(DDGLVID,DDGLDEL,6)_X_$P(DDGLVID,DDGLDEL,10)
 ;
 ;
 ;
ASK W $P(A4,U,2)_$S(%'>2:"? ",1:"")_$S(%>0&(%<3):$P($$EZBLD^DIALOG(7001),U,%)_"// ",1:"")_$P(DDGLCLR,DDGLDEL)
 S A2=0
 D READ I $G(DUOUT) S A2=-1 Q
 I %>2 S A2=X Q
 N %1 S %1=$$PRS^DIALOGU(7001,X) S:%1>0 X=$E($P(%1,U,2))
 K %1
 I "YyNn^"'[X W $C(7) X DDXY G ASK
 I X]"","^Nn"[X S A2=2 K DDC Q
 S:"Yy"[X A2=1
 S:X=""&(%]"") A2=+%
 S DDD=1
 Q
 ;
 ;
READ ;RETURNS 'X' & 'DICQRETA'
 N DIR0P,DIR0KD,S
 X DDGLZOSF("EOFF")
 S (DIR0P,X)="" F  D  Q:'$D(S)
 .D READ^DIR01(.S) I S="TO" S DTOUT=1 K DCC G Q2
 .I $L(S)=1 S X=X_S W S Q
 .I S="CR" K S Q
 .I S="EX"!(S="SV")!(S="QT") S DICQRETA=S,DUOUT=1,X=U K S Q
 .I S="MOUSEDN" Q  ;ignore down-click
 .I S="MOUSE" K S D MOUSE^DIR01 K:$G(DIR0A)?."??" DIR0A S DUOUT=1,DDSQ=1 Q
 .W *7
 X DDGLZOSF("EON")
 I X?1."^" S DUOUT=1,X=U Q
 D CLRMSG^DDS S DDM=1 Q
 ;
 ;
 ;
 ;
H ;From DICN
 S:'$D(A1) A1="T"
 S DDH=$G(DDH)+1,DDH(DDH,A1)=DST
 K A1,DST
 D SC
 Q
 ;#8053  Press 'RETURN' to continue...
 ;#8081  Choose |from-to| or '^'...
 ;#7001  Yes^No

DDSUTL
DDSUTL ;SFISC/MKO-PROGRAMMER UTILITIES ;11:37 AM  25 Jul 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
MSG(TXT) ;
 ;Data validation messages
 D PROC(.TXT,$NA(@DDSREFT@("MSG")))
 Q
 ;
HLP(TXT) ;
 ;Help box messages
 D PROC(.TXT,$NA(@DDSREFT@("HLP")))
 Q
PROC(TXT,GLB) ;
 ;Put text into global
 N CNT,I
 S CNT=$G(@GLB)
 I $D(TXT)<9 S CNT=CNT+1,@GLB@(CNT)=TXT
 E  S I="" F CNT=CNT:1 S I=$O(TXT(I)) Q:I=""  S @GLB@(CNT+1)=TXT(I)
 S @GLB=CNT
 Q
 ;
REFRESH ;Refresh the screen
 G R^DDSR
 ;
MLOAD(DDSIEN) ;Load subrecords for current multiple
 G MLOAD^DDSM1
 ;
MDEL(DDSIEN) ;Delete subrecords for current multiple
 G MDEL^DDSM1
 ;
UNED(DDSF,DDSB,DDSP,DDSVAL,DDSUDA) ;Change DISABLE EDITING attribute
 S:$D(DDSVAL)[0 DDSVAL=""
 D SETATT(4)
 Q
 ;
REQ(DDSF,DDSB,DDSP,DDSVAL,DDSUDA) ;Change REQUIRED attribute
 S:$D(DDSVAL)[0 DDSVAL=""
 D SETATT(1)
 Q
 ;
 ;
SETATT(DDSUPC) ;Set attribute node, piece DDSUPC
 N DDSOVAL,DDSUDDP,DDSUFLD,DDSUTP
 I $D(DDSPG)[0 N DDSPG S DDSPG=""
 I $D(DDSBK)[0 N DDSBK S DDSBK=""
 S DDSP=$$GETFLD^DDSLIB(DDSF,$G(DDSB),$G(DDSP),+DDS,DDSPG,DDSBK)
 I $G(DIERR) D ERR^DDSMSG Q
 ;
 S DDSF=$P(DDSP,","),DDSB=$P(DDSP,",",2),DDSP=$P(DDSP,",",3)
 ;
 S DDSUDDP=+$P($G(^DIST(.404,DDSB,0)),U,2)
 I DDSUDDP,$G(DDSUDA)]"" N DDSDA S DDSDA=DDSUDA
 E  I DDSUDDP,DDSB'=DDSBK N DDSDA D GL^DDS10(DDSUDDP,.DDSDAORG,"","",.DDSDA)
 ;
 S DDSUTP=$P($G(^DIST(.404,DDSB,40,DDSF,0)),U,3) S:'DDSUTP DDSUTP=3
 I DDSUTP=2 D
 . S DDSUFLD=DDSF_","_DDSB
 . S DDSUDDP=0
 E  I DDSUTP=3 D  Q:'DDSUFLD
 . S DDSUFLD=$P($G(^DIST(.404,DDSB,40,DDSF,1)),U)
 E  Q
 ;
 S DDSOVAL=$P($G(@DDSREFT@("F"_DDSUDDP,DDSDA,DDSUFLD,"A")),U,DDSUPC)
 Q:DDSVAL=DDSOVAL
 S $P(@DDSREFT@("F"_DDSUDDP,DDSDA,DDSUFLD,"A"),U,DDSUPC)=DDSVAL
 Q
 ;
ADD(DDSFIL,X,DA,DINUM,DDSDIC0,DDSDR,DDSL) ;
 ;Add an entry as part of a transaction
 ;DDSL=1 means don't lock
 ;
 N %,%W,%Y,C,D0,DD,DO,DI,DIC,DIE,DQ,DR
 N DDSDA,DDSDIC,DDSFD,DDSREQ,DDSUP,I
 K DIERR,^TMP("DIERR",$J)
 K:'$G(DINUM) DINUM
 S:$G(DDSDIC0)="" DDSDIC0="L"
 S DIC(0)=DDSDIC0,Y=-1
 S:$G(DDSDR)]"" DIC("DR")=DDSDR
 S DIC=$$ROOT^DILFD(DDSFIL,.DA),DDSDIC=$$CREF^DIQGU(DIC)
 ;
 I $D(@DDSDIC@(0))[0 D  Q:$G(DIC("P"))=""
 . S DDSUP=$G(^DD(DDSFIL,0,"UP")) Q:'DDSUP
 . S DDSFD=$O(^DD(DDSUP,"SB",DDSFIL,"")) Q:'DDSFD
 . S DIC("P")=$P($G(^DD(DDSUP,DDSFD,0)),U,2)
 ;
 I DDSDIC0'["E",$$REQID(DDSFIL,.DDSREQ) D  Q:$G(DIERR)
 . N F
 . S F=""
 . F  S F=$O(DDSREQ(F)) Q:'F  I $G(DIC("DR"))'[(F_"///") D BLD^DIALOG(3031,"ADD^DDSUTL") Q
 ;
 D FILE^DICN K DTOUT,DUOUT Q:Y=-1!'$D(DDS)
 ;
 I '$G(DDSL) D
 . N I,L,R
 . S L=1,R=DIC_DA_","
 . F I=$L(R,",")-1:-1:1 I $D(^TMP("DDS",$J,"LOCK",$P(R,",",1,I)_")"))#2 S L=0 Q
 . I L,$D(^TMP("DDS",$J,"LOCK",$P(R,"(")))#2 S L=0
 . I L L +@(DIC_+Y_")"):0 S ^TMP("DDS",$J,"LOCK",DIC_+Y_")")=""
 ;
 S DDSDA=+Y_","
 F I=1:1 Q:$D(DA(I))[0  S DDSDA=DDSDA_DA(I)_","
 S ^("ADD")=$G(@DDSREFT@("ADD"))+1,^("ADD",^("ADD"))=DDSDA_DIC
 Q
 ;
REQID(FIL,REQ) ;
 ;Get list of required identifiers into DDSREQ
 N F
 K REQ
 S F="" F  S F=$O(^DD(FIL,0,"ID",F)) Q:F'=+$P(F,"E")  D
 . S:$P($G(^DD(FIL,F,0)),U,2)["R" REQ(F)=""
 Q $D(REQ)>0
 ;
DESTROY(PG) ;Destroy all data for page PG
 N P,B,F,IENS,TP,FIL,FLD
 S P=$O(^DIST(.403,+DDS,40,"B",PG,"")) Q:'P
 S B=0 F  S B=$O(^DIST(.403,+DDS,40,P,40,B)) Q:'B  D
 . Q:'$D(^DIST(.403,+DDS,40,P,40,B,0))
 . Q:'$D(^DIST(.404,B,0))  S FIL=$P(^(0),U,2)
 . S F=0 F  S F=$O(^DIST(.404,B,40,F)) Q:'F  D
 .. Q:'$D(^DIST(.404,B,40,F,0))  S TP=$P(^(0),U,3)
 .. S:'TP TP=3
 .. ;
 .. I TP=3 S FF="F"_FIL,FLD=$G(^DIST(.404,B,40,F,1)) Q:FLD?."^"
 .. E  I TP=2 S FF="F0",FLD=F_","_B
 .. E  Q
 .. ;
 .. S IENS=" "
 .. F  S IENS=$O(@DDSREFT@(FF,IENS)) Q:IENS=""  K ^(IENS,FLD)
 ;
 K @DDSREFT@(P),@DDSREFT@("XCAP",P)
 Q
 ;
 ;
DDSDA(DA,DL,DDSDA) ;Determine DDSDA
 ;
 N I
 I DA="" S DDSDA="" Q
 S DDSDA=DA_"," F I=1:1:DL S DDSDA=DDSDA_DA(I)_","
 Q

DDSVAL
DDSVAL ;SFISC/MKO-GET,PUT FOR DD IELDS ;2OCT2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GET(DDSFILE,DA,DDSFLD,DDSER,DDSPARM) ;Get value for file/field
 N DDP,DIE,DDSANS,DDSTMP,X
 N DDSVDA,DDSVDDL0,DDSVDL,DDSVDV,DDSVND,DDSVPC,DIERR
 ;
 S DDSANS=""
 I $G(DDSPARM)'["I",$G(DDSPARM)'["E" S DDSPARM=$G(DDSPARM)_"I"
 ;
 D GDIE() G:$G(DIERR) GETQ G:'$G(DDSVDA) GETQ
 ;
 I DDSFLD[":",$$FIND^DDSLIB(DDSFLD,":") D  G GETQ
 . S DDSANS=$$REL^DDSVALM(DDP,.DA,DDSFLD,DDSPARM)
 ;
 S DDSFLD=$$FIELD(DDP,DDSFLD) G:$G(DIERR) GETQ
 ;
 S:$D(DDSREFT)#2 DDSTMP=$NA(@DDSREFT@("F"_DDP,DDSVDA,DDSFLD))
 I $D(DDS),$D(DDSREFT)#2,$D(@DDSTMP@("D")) D
 . I $D(@DDSTMP@("M")),'^("M") D  Q
 .. S DDSANS=$NA(^TMP("DDSWP",$J,DDP,DDSVDA,DDSFLD))
 .. M @DDSANS=@DDSTMP@("D")
 . S DDSANS=$G(@DDSTMP@("D")) I DDSPARM["E",$D(^("X"))#2 S DDSANS=^("X")
 E  D
 . D GNDPC Q:$G(DIERR)
 . I DDSVPC=0,DDSVDV["W" D GETWP^DDSVALM Q
 . S DDSANS=$$GVAL(DIE,DA,DDSVND,DDSVPC)
 . I DDSPARM["E" S DDSANS=$$EXTERNAL^DILFD(DDP,DDSFLD,"",DDSANS)
 ;
GETQ D:$G(DIERR) ERR^DDSVALM("$$GET^DDSVAL")
 Q DDSANS
 ;
PUT(DDSFILE,DA,DDSFLD,DDSVAL,DDSER,DDSPARM) ;Put value for file/field
 N DDP,DDSVDA,DDSV0,DDSV02,DDSVDL,DIE
 N DIERR
 ;
 S:$D(DDSVAL)[0 DDSVAL=""
 I $G(DDSPARM)'["I",$G(DDSPARM)'["E" S DDSPARM=$G(DDSPARM)_"E"
 ;
 D GDIE($D(DDS)#2) G:$G(DIERR) PUTQ G:'$G(DDSVDA) PUTQ
 S DDSFLD=$$FIELD(DDP,DDSFLD) G:$G(DIERR) PUTQ
 I DDSFLD=.01,"@"[DDSVAL D BLD^DIALOG(3086) G PUTQ
 ;
 S DDSV0=^DD(DDP,DDSFLD,0),DDSV02=$P(DDSV0,U,2)
 I +DDSV02 D
 . D MULT^DDSVALM
 E  D VALPUT
 ;
PUTQ D:$G(DIERR) ERR^DDSVALM("PUT^DDSVAL")
 Q
 ;
VALPUT ;Validate and put
 N DDSVY
 I DDSPARM["E" D
 . D VAL^DIE(DDP,DDSVDA,DDSFLD,"ER",DDSVAL,.DDSVY)
 E  D
 . D AUXVAL^DIEV(DDP,DDSVDA,DDSFLD,"EIR",DDSVAL,.DDSVY,DDSV0,DDSV02)
 Q:$G(DIERR)
 I DDSVY=DDSVY(0),'$D(@DDSREFT@("F"_DDP,DDSVDA,DDSFLD,"X")) K DDSVY(0)
 ;
 I $D(DDS) D
 . S:'$D(@DDSREFT@("F"_DDP,DDSVDA,DDSFLD)) ^("GL")=DIE
 . D UPDATE(DDP,DDSVDA,.DA,DDSFLD,DDSPG,.DDSVY)
 . S DDSCHG=1
 E  D
 . N DDSFDA
 . S DDSFDA(DDP,DDSVDA,DDSFLD)=DDSVY
 . D FILE^DIE("","DDSFDA")
 Q
 ;
UPDATE(DDP,DDSVDA,DA,FLD,PG,Y) ;Store value, repaint
 N DX,DY,BK,DDO,LEN,EXT,PAGE,RJ,REP,VAL
 S (EXT,@DDSREFT@("F"_DDP,DDSVDA,FLD,"D"))=Y,^("F")=3 S:$D(Y(0))#2 (EXT,^("X"))=Y(0)
 ;
 D:FLD=.01
 . S PAGE=0 F  S PAGE=$O(@DDSREFS@("F"_DDP,FLD,"L",PAGE)) Q:'PAGE  D
 .. S BK=0 F  S BK=$O(@DDSREFS@("F"_DDP,FLD,"L",PAGE,BK)) Q:'BK  D
 ... D:$P($G(@DDSREFS@(PAGE,BK)),U,8)
 .... N DDSPTB S DDSPTB=$G(@DDSREFS@(PAGE,BK,"PTB"))
 .... D:DDSPTB]"" RPF^DDS7(DDP,DDSPTB,DDSVDA,.DA)
 ;
 S BK=0 F  S BK=$O(@DDSREFS@("F"_DDP,FLD,"L",PG,BK)) Q:'BK  D
 . S DDO=0 F  S DDO=$O(@DDSREFS@("F"_DDP,FLD,"L",PG,BK,DDO)) Q:'DDO  D
 .. S LEN=$G(@DDSREFS@(PG,BK,DDO,"D")) Q:LEN=""
 .. S DY=+LEN,DX=$P(LEN,U,2),RJ=$P(LEN,U,10),LEN=$P(LEN,U,3)
 .. S REP=$P($G(@DDSREFS@(PG,BK)),U,7)
 .. I $G(REP) D  Q:DY=""
 ... N SN,PDA,OFS
 ... S PDA=$G(@DDSREFT@(PG,BK)) I 'PDA S DY="" Q
 ... S REP=$P($G(@DDSREFT@(PG,BK,PDA)),U,2,999) I REP="" S DY="" Q
 ... S SN=$G(@DDSREFT@(PG,BK,PDA,"B",DDSVDA)) I 'SN S DY="" Q
HITE ... N HITE S HITE=$$HITE^DDSR(BK),OFS=SN-$P(REP,U,2)*HITE ;DJW/GFT
 ... I OFS'<0,$P(REP,U,5)*HITE>OFS S DY=DY+OFS ;GFT OFFSET CAN'T BE OUTSIDE SCROLLING WINDOW
 ... E  S DY=""
 .. S VAL=$P(DDGLVID,DDGLDEL)_$E(EXT,1,LEN)_$P(DDGLVID,DDGLDEL,10)
 .. X IOXY
 .. W $S(RJ:$J("",LEN-$L(EXT))_VAL,1:VAL_$J("",LEN-$L(EXT)))
 ;
 D:$D(@DDSREFS@("PT",DDP,FLD)) RPB^DDS7(DDP,FLD,PG)
 D:$D(@DDSREFS@("COMP",DDP,FLD,PG)) RPCF^DDSCOMP(PG)
 Q
 ;
GDIE(DDSVL) ;In:
 ;  DDSFILE = File # or root
 ;  DA      = Record array
 ;  DDSVL   = Flag to lock record
 ;Returns:
 ;  DIE    = Global root of file
 ;  DDP    = File #
 ;  DDSVDL = Level #
 ;  DDSVDA = DA,DA(1),...,
 S DDP=$S(DDSFILE=+DDSFILE:DDSFILE,1:+$P($G(@(DDSFILE_"0)")),U,2))
 I DDP=0 D BLD^DIALOG(202,"file") Q
 D GL^DDS10(DDP,.DA,.DIE,.DDSVDL,.DDSVDA,$G(DDSVL))
 Q
 ;
GNDPC ;In:
 ;  DDP    = File #
 ;  DDSFLD = Field #
 ;Returns:
 ;  DDSVDDL0 = 0 node of DD
 ;  DDSVND   = Node where data resides
 ;  DDSVPC   = Piece where data resides
 ;  DDSVDV   = Field specifications
 ;  X        = Pointed to file root or set of codes
 I $G(DDSFLD)="" D BLD^DIALOG(202,"field") Q
 S DDSVDDL0=$G(^DD(DDP,DDSFLD,0))
 I DDSVDDL0?."^" D  Q
 . N I,E
 . S (I("FILE"),E("FILE"))=DDP,I(1)="#"_DDSFLD,E("FIELD")=DDSFLD
 . D BLD^DIALOG(501,.I,.E)
 ;
 S DDSVPC=$P(DDSVDDL0,U,4)
 S DDSVND=$P(DDSVPC,";"),DDSVPC=$P(DDSVPC,";",2)
 S DDSVDV=$P(DDSVDDL0,U,2),X=$P(DDSVDDL0,U,3)
 ;
 N P S P("FILE")=DDP,P("FIELD")=DDSFLD
 I DDSVPC=" " D
 . D BLD^DIALOG(520,"computed",.P)
 I DDSVPC=0 D
 . S DDSVDV=+DDSVDV_$P($G(^DD(+DDSVDV,.01,0)),U,2)
 . D:DDSVDV'["W" BLD^DIALOG(520,"multiple",.P)
 Q
 ;
GVAL(DIE,DA,ND,PC) ;Get value
 N LN,Y
 S LN=$G(@(DIE_"DA,ND)"))
 I $E(PC)'="E" S Y=$P(LN,U,PC)
 E  S Y=$E(LN,+$E(PC,2,999),$P(PC,",",2)) S:Y?." " Y=""
 Q Y
 ;
FIELD(DDP,FLD) ;Get field number
 N F,P
 S:$E(FLD)="""" FLD=$$UQT^DDSLIB($E(FLD,1,$$AFTQ^DDSLIB(FLD)-1))
 ;
 S F=FLD,P("FILE")=DDP
 I FLD'=+$P(FLD,"E") D  Q:$G(DIERR) ""
 . S F=$O(^DD(DDP,"B",FLD,""))
 . I F="" S P(1)=FLD D BLD^DIALOG(501,.P)
 ;
 I $D(^DD(DDP,F,0))[0 S P(1)="#"_F D BLD^DIALOG(501,.P) Q ""
 Q F

DDSVALF
DDSVALF ;SFISC/MKO-GET,PUT VALUES FOR FORM ONLY FIELDS ;2OCT2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GET(DDSVFD,DDSVBK,DDSVPG,DDSPARM,DDSVDA) ;Get value
 ;In:  DDSPG = Current page
 ;     DDSBK = Current block
 ;     DDSPARM = "I" : internal, "E" : external form
 ;
 N DDSANS,DDSFLD,DDSVDDP,DIERR
 I $D(DDSPG)[0 N DDSPG S DDSPG=0
 I $D(DDSBK)[0 N DDSBK S DDSBK=0
 S DDSANS=""
 I $G(DDSPARM)'["I",$G(DDSPARM)'["E" S DDSPARM=$G(DDSPARM)_"I"
 ;
 S DDSFLD=$P($$GETFLD^DDSLIB($G(DDSVFD),$G(DDSVBK),$G(DDSVPG),DDS,$G(DDSPG),$G(DDSBK),"F"),",",1,2)
 G:$G(DIERR) GETQ
 ;
 S DDSVFD=+DDSFLD,DDSVBK=+$P(DDSFLD,",",2)
 ;
 S DDSVDDP=+$P($G(^DIST(.404,DDSVBK,0)),U,2)
 I DDSVDDP,$G(DDSVDA)]"" N DDSDA D
 . I DDSVDA'["," S DDSVDA=$$IENS^DILF(.DDSVDA)
 . E  S:DDSVDA'?.E1"," DDSVDA=DDSVDA_","
 . S DDSDA=DDSVDA
 E  I DDSVDDP,DDSVBK'=DDSBK N DDSDA D GL^DDS10(DDSVDDP,.DDSDAORG,"","",.DDSDA)
 ;
 I $D(@DDSREFT@("F0",DDSDA,DDSFLD,"D"))#2 S DDSANS=^("D") S:DDSPARM["E"&($D(^("X"))#2) DDSANS=^("X") G GETQ
 ;
 I "013"[$P(^DIST(.404,DDSVBK,40,DDSVFD,0),U,3) D BLD^DIALOG(520,"DD or caption-only") G GETQ
 ;
 ;Form-only fields
 I $P($G(^DIST(.404,DDSVBK,40,DDSVFD,0)),U,3)=2 D  G:$G(DIERR) GETQ
 . I $P($G(^DIST(.404,DDSVBK,40,DDSVFD,20)),U)="" D  Q
 .. N P S P(1)="READ TYPE",P(2)="FIELD multiple of the BLOCK"
 .. D BLD^DIALOG(3011,.P)
 . D:$D(^DIST(.404,DDSVBK,40,DDSVFD,3))#2 DEF(^(3),$G(^(3.1)),.DDSANS)
 . S (@DDSREFT@("F0",DDSDA,DDSFLD,"D"),^("O"))=DDSANS
 . I DDSANS]"" D
 .. D:$D(DDSANS(0))
 ... S @DDSREFT@("F0",DDSDA,DDSFLD,"X")=$G(DDSANS(0,0),DDSANS(0))
 ... S:DDSPARM["E" DDSANS=$G(DDSANS(0,0),DDSANS(0))
 .. S $P(@DDSREFT@("F0",DDSDA,DDSFLD,"F"),U)=3,DDSCHG=1
 ;
 ;Computed fields
 E  S:$P($G(^DIST(.404,DDSVBK,40,DDSVFD,0)),U,3)=4 DDSANS=$$VAL^DDSCOMP(DDSVFD,DDSVBK,DDSDA)
 ;
GETQ D:$G(DIERR) ERR^DDSVALM("$$GET^DDSVALF")
 Q DDSANS
 ;
PUT(DDSVFD,DDSVBK,DDSVPG,DDSVAL,DDSPARM,DDSVDA) ;Put value
 N DIR,X,Y
 N DDER,DDSFLD,DDSVDDP,DDSVX,DIERR
 I $D(DDSPG)[0 N DDSPG S DDSPG=0
 I $D(DDSBK)[0 N DDSBK S DDSBK=0
 S:$D(DDSVAL)[0 DDSVAL=""
 I $G(DDSPARM)'["I",$G(DDSPARM)'["E" S DDSPARM=$G(DDSPARM)_"E"
 ;
 S DDSFLD=$$GETFLD^DDSLIB($G(DDSVFD),$G(DDSVBK),$G(DDSVPG),DDS,DDSPG,DDSBK,"F")
 G:$G(DIERR) PUTQ
 S DDSVFD=+DDSFLD,DDSVBK=+$P(DDSFLD,",",2),DDSVPG=$P(DDSFLD,",",3)
 S DDSFLD=$P(DDSFLD,",",1,2)
 ;
 S DDSVDDP=+$P($G(^DIST(.404,DDSVBK,0)),U,2)
 I DDSVDDP,$G(DDSVDA)]"" N DDSDA D
 . I DDSVDA'["," S DDSVDA=$$IENS^DILF(.DDSVDA)
 . E  S:DDSVDA'?.E1"," DDSVDA=DDSVDA_","
 . S DDSDA=DDSVDA
 E  I DDSVDDP,DDSVBK'=DDSBK N DDSDA D GL^DDS10(DDSVDDP,.DDSDAORG,"","",.DDSDA)
 ;
 I $P(^DIST(.404,DDSVBK,40,DDSVFD,0),U,3)'=2 D BLD^DIALOG(520,"DD, computed, or caption-only") G PUTQ
 ;
 S DIR(0)=$P(^DIST(.404,DDSVBK,40,DDSVFD,20),U)_$P(^(20),U,2,3)
 I DDSPARM["I",$E(DIR(0))="P"!(DIR(0)?1"DD".E) D
 . N FIL,FILROOT,FLD
 . S Y=DDSVAL
 . I $E(DIR(0))="P" D
 .. S FIL=$P($P(DIR(0),U,2),":")
 .. I 'FIL S FILROOT=U_FIL,FIL=+$P($G(@(U_FIL_"0)")),U,2) Q:'FIL
 .. E  S FILROOT=$G(^DIC(FIL,0,"GL")) Q:FILROOT=""
 .. S Y(0)=$P($G(@(FILROOT_Y_",0)")),U)
 .. S Y(0)=$$EXTERNAL^DILFD(FIL,.01,"",Y(0))
 . E  D
 .. N DV,I S FIL=$P($P(DIR(0),","),U,2),FLD=$P(DIR(0),",",2)
 .. S DV=$P($G(^DD(FIL,FLD,0)),U,2)
 .. F I="O","P","V","D","S" I DV[I S Y(0)=$$EXTERNAL^DILFD(FIL,FLD,"",Y) Q
 E  D  G:$G(DDER) PUTQ
 . I DDSVAL="" D  Q
 .. N DDSVREQ
 .. S DDSVREQ=$P($G(@DDSREFT@(DDSVPG,DDSVBK,DDSVFD)),U)
 .. S:DDSVREQ]"" DDSVREQ=$P($G(^DIST(.404,DDSVBK,40,DDSVFD,4)),U)
 .. I DDSVREQ S DDER=1
 .. E  S Y=""
 . S DIR("V")="",(X,DIR("B"))=DDSVAL
 . S:DIR(0)?1"DD".E DIR(0)=$P(DIR(0),U,2,999)
 . I $P(DIR(0),U)["P",$P($P(DIR(0),U,2),":",2)'["Z" D
 .. N I
 .. S I=$P(DIR(0),U,2) Q:$P(I,":",2)["Z"
 .. S $P(I,":",2)=$P(I,":",2)_"Z"
 .. S $P(DIR(0),U,2)=I
 . D ^DIR
 . I $E($P(DIR(0),U))="P" S Y=$P(Y,U)
 ;
 ;Update ^TMP
 S DDSCHG=1
 S (DDSVX,@DDSREFT@("F0",DDSDA,DDSFLD,"D"))=Y,^("F")=3 S:$D(Y(0))#2 (DDSVX,^("X"))=$S($D(Y(0,0))#2:Y(0,0),1:Y(0)) I $D(^("X"))#2,Y="" S (DDSVX,^("X"))=""
 ;
 ;Repaint field if it appears on the current page
 I $D(@DDSREFS@("F0",DDSFLD,"L",DDSPG,DDSVBK,DDSVFD))#2 D
 . N DY,DX,DDSVL,DDSVRJ,DDSX,DDSVREP
 . S DDSVREP=$P($G(@DDSREFS@(DDSPG,DDSVBK)),U,7)
 . S DY=+@DDSREFS@(DDSPG,DDSVBK,DDSVFD,"D"),DX=$P(^("D"),U,2),DDSVL=$P(^("D"),U,3),DDSVRJ=$P(^("D"),U,10)
 . I $G(DDSVREP) D  Q:DY=""
 .. N DDSVSN,DDSVPDA,DDSVOFS
 .. S DDSVPDA=$G(@DDSREFT@(DDSPG,DDSVBK)) I 'DDSVPDA S DY="" Q
 .. S DDSVREP=$P($G(@DDSREFT@(DDSPG,DDSVBK,DDSVPDA)),U,2,999) I DDSVREP="" S DY="" Q
 .. S DDSVSN=$G(@DDSREFT@(DDSPG,DDSVBK,DDSVPDA,"B",DDSDA)) I 'DDSVSN S DY="" Q
HITE .. N HITE S HITE=$$HITE^DDSR(DDSVBK),DDSVOFS=DDSVSN-$P(DDSVREP,U,2)*HITE ;DJW/GFT
 .. I DDSVOFS'<0,$P(DDSVREP,U,5)*HITE>DDSVOFS S DY=DY+DDSVOFS ;GFT  OFFSET CAN'T BE OUTSIDE SCROLLING WINDOW
 .. E  S DY=""
 . S DDSX=$P(DDGLVID,DDGLDEL)_$E(DDSVX,1,DDSVL)_$P(DDGLVID,DDGLDEL,10)
 . X IOXY
 . W $S(DDSVRJ:$J("",DDSVL-$L(DDSVX))_DDSX,1:DDSX_$J("",DDSVL-$L(DDSVX)))
 ;
 D
 . N DDP,DDSDA S DDP=0,DDSDA="0,"
 . D:$D(@DDSREFS@("PT",DDP,DDSFLD)) RPB^DDS7(DDP,DDSFLD,DDSPG)
 . D:$D(@DDSREFS@("COMP",DDP,DDSFLD,DDSPG)) RPCF^DDSCOMP(DDSPG)
 ;
PUTQ D:$G(DIERR) ERR^DDSVALM("PUT^DDSVALF")
 Q
 ;
DEF(DDSLN3,DDSLN31,Y) ;Get default
 N DDER,DIR,X
 Q:DDSLN3=""
 ;
 I DDSLN3'="!M" S Y=DDSLN3
 E  I DDSLN31'?."^" X DDSLN31 S:$D(Y)[0 Y=""
 Q:Y=""
 ;
 S DIR(0)=$P(^DIST(.404,DDSVBK,40,DDSVFD,20),U)_$P(^(20),U,2,3)
 S:DIR(0)?1"DD".E DIR(0)=$P(DIR(0),U,2,999)
 S DIR("V")="",(X,DIR("B"))=Y
 D ^DIR I DDER K Y S Y=""
 ;
 I Y]"",$E($P(DIR(0),U))="P" S Y=$P(Y,U)
 Q
 ;

DDSVALM
DDSVALM ;SFISC/MKO-PUT FOR MULTIPLES (SELECT PROMPT) ;10:45 AM  9 Sep 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
MULT ;Put multiple or wp field
 N DDSVDIC,DDSVDV,DDSVND,DDSVPC,DDSVSUB
 S DDSVPC=$P(DDSV0,U,4),DDSVND=$P(DDSVPC,";"),DDSVPC=$P(DDSVPC,";",2)
 S DDSVSUB=+DDSV02 Q:$D(^DD(DDSVSUB,.01,0))[0
 S DDSVDV=DDSVSUB_$P(^DD(DDSVSUB,.01,0),U,2),X=$P(^(0),U,3)
 S DDSVDIC=DIE_DA_","""_DDSVND_""","
 ;
 I DDSVDV["W" D PUTWP
 I DDSVDV'["W" D PUTMULT
 Q
 ;
PUTMULT ;Put for multiples
 N DDSVRN
 S DDSVRN=$S(DDSVAL="FIRST":$O(@(DDSVDIC_"0)")),DDSVAL="LAST":$O(@(DDSVDIC_""" "")"),-1),1:+$G(DDSVAL))
 ;
 K Y S Y="",Y(0)=""
 I DDSVRN>0,$D(@(DDSVDIC_+DDSVRN_",0)"))#2 S Y(0)=$P(^(0),U) D
 . I DDSVDV["O"!(DDSVDV["P")!(DDSVDV["V")!(DDSVDV["D")!(DDSVDV["S") D
 .. S Y(0)=$$EXTERNAL^DILFD(DDSVSUB,.01,"",DDSVRN)
 . S Y=DDSVRN
 ;
 S:'$D(@DDSREFT@("F"_DDP,DDSVDA,DDSFLD,"M")) ^("M")=1_DDSVDIC_U_DDSVSUB
 D UPDATE^DDSVAL(DDP,DDSVDA,.DA,DDSFLD,DDSPG,.Y)
 Q
 ;
PUTWP ;File wp field from @DDSVAL into @DDSREFT
 N DDSTMP
 S DDSTMP=$NA(@DDSREFT@("F"_DDP,DDSDA))
 ;
 I DDSVAL]"",$D(@DDSVAL) D  Q:$G(DIERR)
 . D PUTWP^DIEFW($E("A",DDSPARM["A"),DDSVAL,$NA(@DDSTMP@(DDSFLD,"D")))
 E  K @DDSTMP@(DDSFLD,"D")
 ;
 S:$D(@DDSTMP@(DDSFLD,"M"))[0 ^("M")="0"_DDSVDIC_U_DDSVSUB
 S:$D(@DDSTMP@("GL"))[0 ^("GL")=DIE
 S (DDSCHG,@DDSTMP@(DDSFLD,"F"))=3
 Q
 ;
GETWP ;Merge wp field into ^TMP, return root in DDSANS
 N DDSGL
 S DDSGL=DIE_DA_","""_DDSVND_""","
 S DDSANS=$NA(^TMP("DDSWP",$J,DDP,DDSDA,DDSFLD))
 ;
 K @DDSANS
 M:$D(@(DDSGL_"0)"))#2 @DDSANS=@($E(DDSGL,1,$L(DDSGL)-1)_")")
 Q
 ;
REL(DDP,DA,DDSFLD,DDSPARM) ;Relational syntax
 N DDSCD,DDSI,X
 D DD^DDSPTR(DDP,DDSFLD,"",.DDSCD,"",DDSPARM["I"+1)
 F DDSI=1:1:DDSCD X DDSCD(DDSI)
 Q X
 ;
ERR(DDSVEP) ;Print error messages
 Q:'$G(DIERR)
 I '$D(DDS) D MSG^DIALOG("BW") Q
 N DDSVMSG
 S DDSER=DIERR
 D BLD^DIALOG(3031,DDSVEP,"","DDSVMSG")
 D MSG^DDSMSG(DDSVMSG(1)),ERR^DDSMSG
 Q

DDSWP
DDSWP ;SFISC/MKO-WP ;20FEB2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EDIT ;Edit the word processing field
 N I
 S DDSUE=$D(DDSTP)#2!$S($P($G(DDSU("A")),U,4)="":$P($G(DDSO(4)),U,4),1:$P(DDSU("A"),U,4))
 I 'DDSUE S I=$P((DDSU("DD")),U,2) I I,$P($G(^DD(I,.01,0)),U,2)["I",$G(DDSGL)["(",$O(@(DDSGL_"0)")) S DDSUE=1 ;UNEDITABLE WORD-PROCESSING FIELD
 I DDSUE D  I $D(DIRUT) K DIRUT,DUOUT,DIROUT G EDITQ
 .D:DDM CLRMSG^DDS
 .N DDSWP D BLD^DIALOG(8178,,,"DDSWP"),MSG^DDSMSG(.DDSWP) H 2 Q  ;**
 S DDSUTL=$NA(@DDSREFT@("F"_DDP,DDSDA,DDSFLD))
 ;
 I $D(@DDSUTL@("F"))[0,$D(@(DDSGL_"0)"))#2 D
 . K @DDSUTL@("D")
 . M @DDSUTL@("D")=@($E(DDSGL,1,$L(DDSGL)-1)_")")
MOUSEOFF W *27,"[?1000l"
 S (DY,DX)=0 X IOXY W $P(DDGLCLR,DDGLDEL,2)
 S DIC=$E(DDSUTL,1,$L(DDSUTL)-1)_",""D"",",DWPK=1
 S DIWESUB=$P($G(DDSU("DD")),U) K:DIWESUB="" DIWESUB
 ;S DDWFLAGS=$G(DDWFLAGS)_"K"
 D EN^DIWE ;,INIT^DDGLIB0()
 K DIC,DIWESUB,DWPK
 I 'DDSUE S DDSCHG=1,@DDSUTL@("F")=1
 E  K @DDSUTL@("D")
MOUSEON I $G(DDS)>0,$G(DDSMOUSY) W *27,"[?1000h"
EDITQ K DDSUE,DDSUTL
 Q
 ;
WP ;At the wp field
 S DIR(0)="FO^0:0"
 I $$WPLUS("F"_DDP,DDSDA,DDSFLD) S DIR("B")="+" ;WHEN CURSOR IS ON FIELD, "+" WILL SHOW IF THERE IS ALREADY W-P DATA THERE
EGP S DIR("?")="^W $$EZBLD^DIALOG(8179)" ;**CCO/NI "Press <Enter> to edit this word processing field."
 S DIR("??")="^D HELP^DDSWP"
 D ^DIR K DIR,DUOUT,DIRUT,DIROUT
 Q
 ;
WPLUS(FFILE,DA,FIELD) ;SAYS WHETHER WP FIELD HAS SOME DATA
 ;EXAMPLE:
 ;^TMP("DDS",4028,181,"F666001","889,",15,"F")=1
 ;^TMP("DDS",4028,181,"F666001","889,",15,"M")="0^DIZ(666001,889,""17"",^666001.0"
 N WP
 I DA="" Q 0
 I 'FIELD Q 0
 I $G(@DDSREFT@(FFILE,DA,FIELD,"F"))=1 Q $O(^("D",0))>0 ;IF WE'VE EDITED, ARE THERE LINES LEFT?
 I $G(@DDSREFT@(FFILE,DA,FIELD,"M"))?1"0^".E S WP=$P(^("M"),U,2) I WP["(" S WP=U_$$CREF^DILF(WP_0),WP=$P($G(@WP),U,3) Q ''WP ;IF WE HAVEN'T EDITED, LOOK IN THE DATA
 Q 0
 ;
 ;
HELP ;?? help at the WP field
 S DDSFN=+$P(DDSU("M"),U,3)
 D:$G(^DD(DDSFN,.01,3))]"" MSG^DDSMSG($$HELP^DIALOGZ(DDSFN,.01)) ;**CCO/NI  WORD-PROCESSING FIELD HELP
 X:$G(^DD(DDSFN,.01,4))]"" ^(4)
 D:$D(^DD(DDSFN,.01,21)) WP^DDSMSG("^DD("_DDSFN_",.01,21)")
 K DDSFN
 Q

DDSZ
DDSZ ;SFISC/MKO-FORM COMPILER ;17JUN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;Prompt, compile
 N DDSFRM,DDSDDP,DDSREFS
 N C,DIC,X,Y
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 S DIC="^DIST(.403,",DIC(0)="AEQZ"
 D ^DIC K DIC Q:Y=-1!'$D(^DIST(.403,+Y,0))
 S DDSFRM=Y,DDSDDP=$P(Y(0),U,8)
 ;
 W !!,"Compiling "_$P(Y,U,2)_" (#"_+Y_") ...",!
 D EN(DDSFRM,DDSDDP)
 I $G(DIERR) W $C(7) D MSG^DIALOG("BW")
 Q
 ;
ALL ;Compile all forms
 N DDSFRM,DDSDDP,DDSFNUM,DDSREFS
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 W:'$D(DDSQUIET) !,"Compiling all forms ...",!
 ;
 S DDSFNUM=0
 F  S DDSFNUM=$O(^DIST(.403,DDSFNUM)) Q:'DDSFNUM  D
 . Q:$D(^DIST(.403,DDSFNUM,0))[0
 . S DDSFRM=DDSFNUM_U_$P(^DIST(.403,DDSFNUM,0),U),DDSDDP=+$P(^(0),U,8)
 . S DDSREFS=$$REF^DDS0(DDSFRM)
 . W:'$D(DDSQUIET) !?3,$P(DDSFRM,U,2),?35,"(#"_+DDSFRM_")"
 . D EN(DDSFRM,DDSDDP)
 . I $G(DIERR),'$D(DDSQUIET) W !,$C(7) D MSG^DIALOG("BW") W !
 Q
 ;
EN(DDSFRM,DDSDDP,DDSREFS) ;Compile a form
 N DDSDO,DDSPG,DDSNDD,DDSPGRP
 ;
 S:'$G(DDSDDP) DDSDDP=$P(^DIST(.403,+DDSFRM,0),U,8)
 S:$G(DDSREFS)="" DDSREFS=$$REF^DDS0(DDSFRM)
 K @DDSREFS
 ;
 ;Find page groups
 D PGRP^DDSZ3(+DDSFRM,.DDSPGRP)
 ;
 S DDSPG=0,(DDSDO,DDSNDD)=1
 F  S DDSPG=$O(^DIST(.403,+DDSFRM,40,DDSPG)) Q:'DDSPG  D PG(DDSFRM,DDSPG,DDSDDP,.DDSDO,.DDSNDD) Q:$G(DIERR)
 I $G(DIERR) D ERR(DDSFRM,DDSREFS) Q
 S $P(^DIST(.403,+DDSFRM,0),U,9,11)=+$G(DDSDO)_U_+$G(DDSNDD)_U_1 ;DDSNDD=1 means don't need a starting DA
 Q
 ;
PG(DDSFRM,DDSPG,DDSDDP,DDSDO,DDSNDD) ;Compile a page
 ;
 Q:$D(^DIST(.403,+DDSFRM,40,DDSPG,0))[0
 D:$P($G(^DIST(.403,+DDSFRM,40,DDSPG,1)),U,2)]"" ASUB^DDSZ3(DDSPG,DDSFRM)
 ;
 ;Get page coordinates
 S DDSPX=$P(^DIST(.403,+DDSFRM,40,DDSPG,0),U,3)
 S DDSPY=$P(DDSPX,",")-1,DDSPX=$P(DDSPX,",",2)-1
 S:DDSPY<0 DDSPY=0 S:DDSPX<0 DDSPX=0
 ;
 ;Compile header block
 S DDSB=$P($G(^DIST(.403,+DDSFRM,40,DDSPG,0)),U,2)
 I DDSB]"" D BLK(DDSFRM,DDSPG,DDSDDP,DDSPY,DDSPX,DDSB,"",1,"",.DDSNDD,.DDSSCR,.DDSNAV,.DDSORD) G:$G(DIERR) END
 ;
 ;Compile all other blocks on page
 S DDSBO="" F  S DDSBO=$O(^DIST(.403,+DDSFRM,40,DDSPG,40,"AC",DDSBO)) Q:DDSBO=""  S DDSB=$O(^(DDSBO,0)) Q:'DDSB  D BLK(DDSFRM,DDSPG,DDSDDP,DDSPY,DDSPX,DDSB,DDSBO,"",.DDSDO,.DDSNDD,.DDSSCR,.DDSNAV,.DDSORD) G:$G(DIERR) END
 ;
 D:$D(DDSSCR)!$D(DDSORD) EN^DDSZ2(.DDSSCR,.DDSNAV,.DDSORD,.DDSRNAV)
 ;
END K DDSB,DDSBO,DDSMUL,DDSNAV,DDSORD
 K DDSP,DDSPX,DDSPY,DDSREP,DDSRNAV,DDSSCR
 Q
 ;
BLK(DDSFRM,DDSPG,DDSDDP,DDSPY,DDSPX,DDSB,DDSBO,DDSH,DDSDO,DDSNDD,DDSSCR,DDSNAV,DDSORD) ;
 ;Compile block
 ; DDSH   = 1 if header block
 ; DDSDO  = killed if any edit blocks
 ; DDSNDD = killed if any DD fields
 ;
 N DDP
 I $D(^DIST(.404,DDSB,0))[0 D BLD^DIALOG(3051,"#"_DDSB) Q
 S DDSDN=$P(^DIST(.404,DDSB,0),U,3),DDP=+$P(^(0),U,2)
 ;
 S DDSPTB=""
 S:'$G(DDSH) DDSPTB=$G(^DIST(.403,+DDSFRM,40,DDSPG,40,DDSB,1))
 ;
 ;Get DDSBY,DDSBX,DDSTP
 I $G(DDSH) S DDSBY=DDSPY,DDSBX=DDSPX,DDSTP="h",DDSREP=1
 E  D
 . S DDSBX=$P(^DIST(.403,+DDSFRM,40,DDSPG,40,DDSB,0),U,3),DDSTP=$P(^(0),U,4) S DDSREP=$S($G(^(2)):^(2),1:1)
 . K:DDSTP="e" DDSDO
 . S DDSBY=$P(DDSBX,",")-1,DDSBX=$P(DDSBX,",",2)-1
 . S:DDSBY<0 DDSBY=0 S:DDSBX<0 DDSBX=0
 . S DDSBY=DDSBY+DDSPY,DDSBX=DDSBX+DDSPX
IND . I DDSREP>1,+$G(^DIST(.403,+DDSFRM,21))=+$P($G(^DIST(.403,+DDSFRM,40,DDSPG,0)),U) D  ;RECORD SELECTION PAGE USING REPEATING BLOCK
 ..N IND
 ..S IND=$P(^DIST(.403,+DDSFRM,40,DDSPG,40,DDSB,2),U,2) I IND]"",$D(^DD(+DDSDDP,0,"IX",IND,+DDSDDP)) D
 ...S IND=^DIC(+DDSDDP,0,"GL")_""""_IND_"""" ;BUILD COMPUTED MULTIPLE OFF THE REPEATING-BLOCK INDEX
 ...I $D(^DIST(.403,+DDSFRM,40,DDSPG,40,DDSB,"COMP MUL"))
 ...S ^("COMP MUL")="N D,DIMQ,DIMSTRT,DIMSCNT S (DIMQ,DIMSTRT)=$NA("_IND_")),DIMSCNT=$QL(DIMQ) F  S DIMQ=$Q(@DIMQ) Q:DIMQ=""""  Q:$NA(@DIMQ,DIMSCNT)'=DIMSTRT  S D=$QS(DIMQ,$QL(DIMQ)) Q:'D  I @DIMQ="""" N D0 S D0=D X DICMX"
 ..I $G(^DIST(.403,+DDSFRM,40,DDSPG,40,DDSB,"COMP MUL"))]"" S ^("COMP MUL PTR")=+DDSDDP
 ;
 ;Set @DDSREFS@(DDSPG,DDSB)
 S @DDSREFS@(DDSPG,DDSB)=DDSBY_U_DDSBX_U_$P($G(^DIST(.404,DDSB,0)),U,2)_U_DDSDN_U_DDSTP_$S(DDSREP>1:U_U_+DDSREP,1:"")
 ;
 D:DDSPTB]"" PT^DDSPTR(DDSDDP,DDSPTB,DDSFRM,DDSPG,DDSB)
 D EN^DDSZ1(DDSPG,DDSB,DDP,DDSBY,DDSBX,DDSBO,DDSTP,DDSREP,.DDSNDD,.DDSPGRP,.DDSSCR,.DDSNAV,.DDSORD,.DDSRNAV)
 ;
 K DDSBX,DDSBY,DDSDN,DDSPTB,DDSTP
 Q
 ;
ENGRP(DDSFRM) ;Compile a form and all forms that use any of the blocks
 ;on that form
 N DDSLST
 D FRMLST(DDSFRM,.DDSLST)
 ;
 ;Compile all forms in DDSLST
 S DDSFRM=0 F  S DDSFRM=$O(DDSLST(DDSFRM)) Q:'DDSFRM  D EN(DDSFRM)
 Q
 ;
DELGRP(DDSFRM) ;Uncompile a form and all forms that use any of the blocks
 ;on that form
 N DDSLST
 D FRMLST(DDSFRM,.DDSLST)
 ;
 ;Uncompile all forms in DDSLST
 S DDSFRM=0 F  S DDSFRM=$O(DDSLST(DDSFRM)) Q:'DDSFRM  D DEL(DDSFRM)
 Q
 ;
ENLIST(DDSROOT) ;Compile all forms in @DDSROOT
 N DDSFRM
 S DDSFRM=0 F  S DDSFRM=$O(@DDSROOT@(DDSFRM)) Q:'DDSFRM  D EN(DDSFRM)
 Q
 ;
FRMLST(DDSFRM,DDSLST) ;Build list of forms that contain blocks on this form
 N DDSPG,DDSBK
 S DDSPG=0 F  S DDSPG=$O(^DIST(.403,DDSFRM,40,DDSPG)) Q:'DDSPG  D
 . D BLDLST($P($G(^DIST(.403,DDSFRM,40,DDSPG,0)),U,2),.DDSLST)
 . S DDSBK=0 F  S DDSBK=$O(^DIST(.403,DDSFRM,40,DDSPG,40,DDSBK)) Q:'DDSBK  D
 .. D BLDLST($P($G(^DIST(.403,DDSFRM,40,DDSPG,40,DDSBK,0)),U),.DDSLST)
 Q
 ;
BLDLST(DDSBK,DDSLST) ;Build list of forms that contain a given block
 N DDSFRM
 Q:'$G(DDSBK)
 S DDSFRM=0 F  S DDSFRM=$O(^DIST(.403,"AB",DDSBK,DDSFRM)) Q:'DDSFRM  S DDSLST(DDSFRM)=""
 S DDSFRM=0 F  S DDSFRM=$O(^DIST(.403,"AC",DDSBK,DDSFRM)) Q:'DDSFRM  S DDSLST(DDSFRM)=""
 Q
 ;
DELALL ;Delete compile global for all forms
 N DDSFRM,DDSFNUM,DDSREFS
 W:'$D(DDSQUIET) !,"Deleting compiled form data ...",!
 ;
 S DDSFNUM=0
 F  S DDSFNUM=$O(^DIST(.403,DDSFNUM)) Q:'DDSFNUM  D
 . Q:$D(^DIST(.403,DDSFNUM,0))[0
 . S DDSFRM=DDSFNUM_U_$P(^DIST(.403,DDSFNUM,0),U)
 . W:'$D(DDSQUIET) !?3,$P(DDSFRM,U,2),?35,"(#"_+DDSFRM_")"
 . D DEL(DDSFRM)
 Q
 ;
DEL(DDSFRM) ;Delete compiled global
 N DDSREFS
 S DDSREFS=$$REF^DDS0(DDSFRM) K @DDSREFS
 S $P(^DIST(.403,+DDSFRM,0),U,11)=""
 Q
 ;
ERR(DDSFRM,DDSREFS) ;Print error, kill compiled global
 Q:'$G(DIERR)
 N DDSNAM
 S DDSNAM=$P(DDSFRM,U,2)
 S:DDSNAM="" DDSNAM=$P($G(^DIST(.403,+DDSFRM,0)),U)
 D BLD^DIALOG(3002,DDSNAM)
 S $P(^DIST(.403,+DDSFRM,0),U,11)=""
 K @DDSREFS
 Q

DDSZ1
DDSZ1 ;SFISC/MKO-GET BLOCK INFO,SCREEN IMAGE ;20JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DDSPG,DDSBK,DDP,DDSBY,DDSBX,DDSBO,DDSTP,DDSREP,DDSNDD,DDSPGRP,DDSSCR,DDSNAV,DDSORD,DDSRNAV) ;
 ;Input:
 ;  DDSREFS = Global ref
 ;Output:
 ;  DDSSCR
 ;  DDSNAV
 ;  DDSORD
 ;  DDSRNAV
 ;
 N Y
 S:$G(DDSTP)="" DDSTP="e"
 I DDSTP'="h",$G(DDSBO),$D(DDSORD(DDSBO))[0 D
 . S DDSORD(DDSBO)=DDSBK
 . S:$G(DDSREP)>1 $P(DDSORD(DDSBO),U,2)=$S($P(DDSREP,U,5)]"":$P($$GETFLD^DDSLIB($P(DDSREP,U,5),"","","","",DDSBK),","),1:"FIRST")
 ;
LOOP N DDSHITE S DDSHITE=$$HITE^DDSR(DDSBK),DDSF=0 ;DJW/GFT  HEIGHT OF MULTIPLES
 F  S DDSF=$O(^DIST(.404,DDSBK,40,DDSF)) Q:DDSF'=+DDSF  D FLD
 ;
KILL K DDSC1,DDSC2,DDSCAP,DDSCLN,DDSD1,DDSD2,DDSD3
 K DDSDDL0,DDSF,DDSFLD,DDSKEY,DDSL0,DDSL01,DDSL2,DDSL4,DDSN
 Q
 ;
FLD ;Set up
 ;  @DDSREFS@(pg,bk,ddo,
 ;    "D")       = data $Y^data $X^data $L^field#
 ;                  ^xcap $Y^xcap $X^xcap colon^xcap req
 ;                  ^1 if computed field^1 if right justified
 ;    "COMPE")   = M code that sets X
 ;    "COMPE",1) = array sets DDSE(n)
 ;
 ;  @DDSREFS@("Ffile#",field#,"L",pg,bk,ddo)=""
 ;
 ;  DDSSCR(row)     = captions on that row
 ;  DDSSCR(row,col) = final columns underlined
 ;  DDSNAV(row,col) = ddo,bk for editable fields
 ;  DDSORD(bo,fo)   = ddo for editable fields
 ;
 ;Get field properties
 S:'$P(^DIST(.404,DDSBK,40,DDSF,0),U,3) $P(^(0),U,3)=3
 S DDSL0=$G(^DIST(.404,DDSBK,40,DDSF,0)),DDSL01=$G(^(.1)),DDSFLD=$S($P(DDSL0,U,3)=2:DDSF_","_DDSBK,1:+$G(^(1))),DDSL2=$G(^(2)),DDSL4=$G(^(4))
 K:$P(DDSL0,U,3)=3!'$P(DDSL0,U,3) DDSNDD ;REMEMBER THAT AT LEAST ONE FIELD IS A DATA DICTIONARY
 S DDSDDL0=$G(^DD(DDP,DDSFLD,0)) Q:DDSL0?."^"!(DDSL2?."^")
 S DDSKEY=DDSFLD'[","&($D(^DD("KEY","F",DDP,DDSFLD))>1)
 S DDSD1=$P($P(DDSL2,U),",")+DDSBY-1
 S DDSD2=$P($P(DDSL2,U),",",2)+DDSBX-1
 S DDSD3=$P(DDSL2,U,2)
 S DDSC1=$P($P(DDSL2,U,3),",")+DDSBY-1
 S DDSC2=$P($P(DDSL2,U,3),",",2)+DDSBX-1
 S DDSCAP=$TR($P(DDSL0,U,2)," ",$C(0))
 S DDSCLN=$S(DDSCAP="":"",$P(DDSL0,U,3)=1:"",$P(DDSL2,U,4):"",1:":")
 ;
 I DDSC1'<0,DDSC2'<0,$L(DDSCAP)>0,DDSCAP'="!M" D
 . ;Set CAP xref for ^-jumping
 . I DDSTP="e","^2^3^"[(U_$P(DDSL0,U,3)_U)!'$P(DDSL0,U,3) D
 .. N C,I,L
 .. S I=0 F  S I=$O(DDSPGRP(I)) Q:'I  Q:U_DDSPGRP(I)_U[(U_DDSPG_U)
 .. Q:'I
 .. S C=$P(DDSL0,U,2)
 .. S:C?1"Select ".E C=$P(C,"Select ",2,999)
UP .. S C=$E($$UP^DILIBF(C),1,40)
 .. S L=$L(DDSREFS)+$L(C)+$L(DDSPGRP(I))+$L(DDSPG)+$L(DDSBK)+$L(DDSF)+30
 .. S:L>127 C=$E(C,1,$L(C)-(L-127))
 .. S:C]"" @DDSREFS@("CAP",C,DDSPGRP(I),DDSPG,DDSBK,DDSF)=""
 . ;
 . ;Set DDSSCR
 . I DDSC1'<0,DDSC2'<0,$L(DDSCAP)>0,DDSCAP'="!M" D
 .. N DDSI,DDSX
 .. S DDSX=DDSCAP_DDSCLN
 .. F DDSI=1:1:+DDSREP D
CAPS ... S $E(DDSSCR(DDSI-1*DDSHITE+1+DDSC1),DDSC2+1,DDSC2+$L(DDSX))=DDSX ;GFT
 ... S:$S($P(DDSL4,U)]"":+DDSL4,1:$P(DDSDDL0,U,2)["R")!DDSKEY DDSSCR(DDSI-1*DDSHITE+1+DDSC1,DDSC2+1)=DDSC2+$L(DDSCAP)
 ;
 ;Set "D", "L" nodes, DDSNAV, and DDSORD
 I DDSD1'<0,DDSD2'<0,DDSD3>0 D
 . S @DDSREFS@(DDSPG,DDSBK,DDSF,"D")=DDSD1_U_DDSD2_U_DDSD3_U_DDSFLD
 . S @DDSREFS@("F"_$S(DDSFLD[",":0,1:DDP),DDSFLD,"L",DDSPG,DDSBK,DDSF)=""
 I DDSCAP="!M",DDSC1'<0,DDSC2'<0 S $P(@DDSREFS@(DDSPG,DDSBK,DDSF,"D"),U,5,8)=DDSC1_U_DDSC2_U_DDSCLN_U_($P(DDSDDL0,U,2)["R"!+DDSL4!DDSKEY)
 S:$P(DDSL4,U,3) $P(@DDSREFS@(DDSPG,DDSBK,DDSF,"D"),U,10)=1
 ;
 ;Computed fields
 I $P(DDSL0,U,3)=4 D  K DDSCOMP,DDSAR,DDSEXP,DDSFD Q
 . S DDSCOMP=$G(^DIST(.404,DDSBK,40,DDSF,30)) Q:DDSCOMP?."^"
 . D PARSE^DDSCOMP(DDP,DDSCOMP,DDSBK,.DDSEXP,.DDSAR,.DDSFD)
 . Q:DDSEXP=""!$G(DIERR)
 . S @DDSREFS@("COMPE",DDSBK,DDSF)=DDSEXP
 . F DDSAR=1:1:DDSAR D
 .. S:DDSAR(DDSAR)["*DDSREFC*" DDSAR(DDSAR)=$P(DDSAR(DDSAR),"*DDSREFC*")_$E(DDSREFS,1,$L(DDSREFS)-1)_",""COMPE"","_DDSBK_","_DDSF_","_DDSAR_$P(DDSAR(DDSAR),"*DDSREFC*",2,999)
 .. S @DDSREFS@("COMPE",DDSBK,DDSF,DDSAR)=DDSAR(DDSAR)
 .. I $D(DDSAR(DDSAR))>9 N I F I=1:1 Q:$D(DDSAR(DDSAR,I))[0  D
 ... S @DDSREFS@("COMPE",DDSBK,DDSF,DDSAR,I)=DDSAR(DDSAR,I)
 . S $P(@DDSREFS@(DDSPG,DDSBK,DDSF,"D"),U,9)=1
 . I $G(DDSFD)]"" F DDSAR=1:1:$L(DDSFD,U) D
 .. N F S F=$P(DDSFD,U,DDSAR) Q:F=""
 .. S @DDSREFS@("COMP",$P(F,","),$P($P(F,",",2,99),";"),DDSPG,DDSBK,DDSF)=""
 ;
 Q:DDSD1<0!(DDSD2<0)!(DDSD3'>0)!(DDSL2?."^")
 Q:$P(DDSDDL0,U,4)=" ; "  Q:DDSTP="h"  Q:DDSFLD=.001
 I '$P(DDSDDL0,U,2),DDSTP'="e" Q
 ;
 S DDSORD(DDSBO,+DDSL0)=DDSF
 S DDSNAV(DDSD1,DDSD2)=DDSF_","_DDSBK
 S:$P(DDSDDL0,U,2) DDSMUL(DDSBK,DDSF)=""
 ;
 I $G(DDSREP)>1 D
 . S $P(DDSNAV(DDSD1,DDSD2),",",3)=DDSBO
 . S DDSRNAV(DDSBO,DDSD1)=DDSBK
 . S DDSRNAV(DDSBO,DDSD1,DDSD2)=DDSF
HITE . S DDSRNAV(DDSBO,DDSD1-.4,DDSD2)=DDSF_",-1" ;DJW/GFT??
 . S DDSRNAV(DDSBO,DDSD1+.4,DDSD2)=DDSF_",+1"
 Q

DDSZ2
DDSZ2 ;SFISC/MKO-LOAD SCR, NAV, AND ORDER INFO ;21JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(SC,N,O,RNAV) ;
 ;Input:
 ;  DDSPG
 ;  DDSREFS
 ;
 D SCR(.SC),NAV(.N,.RNAV),ORD(.O)
 D:$D(RNAV) RNAV(.RNAV,.O)
 Q
 ;
SCR(SC) ;Move image from SC to global
 N C,P,R,S
 Q:'$D(SC)
 S R=0 F  S R=$O(SC(R)) Q:'R  D
 . F C=1:1 Q:$E(SC(R),C)'=" "
 . S @DDSREFS@("X",DDSPG,R-1,C-1)=$TR($E(SC(R),C,999),$C(0)," ")
 . I $D(SC(R))=11 D
 .. S S="",P=0
 .. F  S P=$O(SC(R,P)) Q:'P  S S=S_(P-C+1)_";"_(SC(R,P)-C+1)_";U"_U
 .. S:S?.E1"^" S=$E(S,1,$L(S)-1)
 .. S:S]"" @DDSREFS@("X",DDSPG,R-1,C-1,"A")=S
 Q
 ;
NAV(N,RNAV) ;
 N B,D1,D2,F,LN
 S N(9999,1)="0,0"
 ;
 S D1="" F  S D1=$O(N(D1)) Q:D1=""  D
 . S D2="" F  S D2=$O(N(D1,D2)) Q:D2=""  D
 .. S F=$P(N(D1,D2),","),B=$P(N(D1,D2),",",2),LN=""
 .. D NAV1(.N,.RNAV,D1,D2,.LN)
 .. S @DDSREFS@(DDSPG,B,F,"N")=LN
 .. S:$D(DDSMUL(B,F)) $P(@DDSREFS@(DDSPG,B,F,"N"),U,11)=1
 Q
 ;
NAV1(N,RNAV,D1,D2,LN) ;Setup "N" for navigation
 N E1,E2,I
 ;
 S E1=$S($O(N(D1),-1)]"":$O(N(D1),-1),1:$O(N(""),-1))
 S E2=D2
 I $D(N(E1,E2))[0 S E2=$S($O(N(E1,E2),-1)]"":$O(N(E1,E2),-1),1:$O(N(E1,E2)))
 I E1]"",E2]"" D
 . N RBO
 . S RBO=$P(N(E1,E2),",",3)
 . I RBO,$D(RNAV(RBO,E1))#2 D  Q:E2=""
 .. S E2="" F  S E2=$O(RNAV(RBO,E1,E2)) Q:E2=""  Q:RNAV(RBO,E1,E2)'[","
 . S $P(LN,U)=$P(N(E1,E2),",",1,2)
 ;
 S E1=$S($O(N(D1))]"":$O(N(D1)),1:$O(N("")))
 S E2=D2
 I $D(N(E1,E2))[0 S E2=$S($O(N(E1,E2),-1)]"":$O(N(E1,E2),-1),1:$O(N(E1,E2)))
 I E1]"",E2]"" D
 . N RBO
 . S RBO=$P(N(E1,E2),",",3)
 . I RBO,$D(RNAV(RBO,E1))#2 D  Q:E2=""
 .. S E2="" F  S E2=$O(RNAV(RBO,E1,E2)) Q:E2=""  Q:RNAV(RBO,E1,E2)'[","
 . S $P(LN,U,2)=$P(N(E1,E2),",",1,2)
 ;
 S E1=D1,E2=$O(N(D1,D2))
 I E2="" S E1=$S($O(N(E1))]"":$O(N(E1)),1:$O(N(""))),E2=$O(N(E1,""))
 I E1]"",E2]"" S $P(LN,U,3)=$P(N(E1,E2),",",1,2)
 ;
 S E1=D1,E2=$S($O(N(E1,D2),-1)]"":$O(N(E1,D2),-1),1:"")
 I E2="" S E1=$S($O(N(E1),-1)]"":$O(N(E1),-1),1:$O(N(""),-1)),E2=$S($O(N(E1,""),-1)]"":$O(N(E1,""),-1),1:"")
 I E1]"",E2]"" S $P(LN,U,4)=$P(N(E1,E2),",",1,2)
 ;
 F I=1:1:4 S:$P($P(LN,U,I),",",2)=B!'$P($P(LN,U,I),",",2) $P(LN,U,I)=+$P(LN,U,I)
 Q
 ;
ORD(O) ;Setup field order info
 N B,BO,BP,F,FO,FP
 S (BO,FO)="" F  S BO=$O(O(BO)) Q:BO=""  S FO=$O(O(BO,"")) Q:FO]""
 S:FO="" BO=$O(O(""))
 S B=+$G(O(+BO)),F=+$G(O(+BO,+FO))
 S @DDSREFS@(DDSPG,"FIRST")=F_","_B
 ;
 S (BP,FP)=0
 S BO="" F  S BO=$O(O(BO)) Q:BO=""  D
 . S B=+O(BO),F=0
 . S FO=$O(O(BO,"")) S:FO]"" F=O(BO,FO)
 . S $P(@DDSREFS@(DDSPG,B),U,9)=F
 . S:$P(O(BO),U,2)]"" $P(@DDSREFS@(DDSPG,B),U,10)=$S($P(O(BO),U,2)="FIRST":F,1:$P(O(BO),U,2))
 . S FO="" F  S FO=$O(O(BO,FO)) Q:FO=""  D
 .. S F=O(BO,FO)
 .. S $P(@DDSREFS@(DDSPG,BP,FP,"N"),U,5)=F_$S(B'=BP:","_B,1:"")
 .. S FP=F,BP=B
 S $P(@DDSREFS@(DDSPG,BP,FP,"N"),U,5)=0
 Q
 ;
RNAV(DDSRNAV,DDSO) ;Setup nav and fo info for rep blocks
 N DDSBO,DDSN,B,D1,D2,DN,F,F1,FO,LN,NX,RT
 S DDSBO="" F  S DDSBO=$O(DDSRNAV(DDSBO)) Q:DDSBO=""  D
 . K DDSN M DDSN=DDSRNAV(DDSBO)
 . S D1="" F  S D1=$O(DDSN(D1)) Q:D1=""  D:$D(DDSN(D1))#2
 .. S B=DDSN(D1)
 .. N HITE S HITE=$$HITE^DDSR(B)
 .. S D2="" F  S D2=$O(DDSN(D1,D2)) Q:D2=""  D
 ... S F=DDSN(D1,D2),LN="" Q:F[","
 ... D NAV1(.DDSN,.DDSRNAV,D1,D2,.LN)
 ... S $P(@DDSREFS@(DDSPG,B,F,"N"),U,6,9)=LN
 ... Q:HITE<2  ;GFT
FIRST ...S FO=$O(DDSO(DDSBO,"")) S:FO FO=DDSO(DDSBO,FO)
 ...S F1=$O(DDSO(DDSBO,""),-1) S:F1 F1=DDSO(DDSBO,F1)
 ... I $P(@DDSREFS@(DDSPG,B,F,"N"),U,9)["-" S $P(^("N"),U,9)=$P(^("N"),U,4) I $P(^("N"),U,4)[","!'$P(^("N"),U,4) S $P(^("N"),U,9)=F1_",-1" ;WHERE 'F4' GOES
 ... I $P(^("N"),U,8)["+" S $P(^("N"),U,8)=$P(^("N"),U,3) I '$P(^("N"),U,3) S $P(^("N"),U,8)=FO_",+1" ;WHERE 'TAB' GOES
 . S B=+$G(DDSO(+DDSBO)) Q:'B
 . S FO=$O(DDSO(DDSBO,"")) Q:FO=""
 . S (F,F1)=DDSO(DDSBO,FO)
 . F  S FO=$O(DDSO(DDSBO,FO)) Q:FO=""  D
 .. S $P(@DDSREFS@(DDSPG,B,F,"N"),U,10)=DDSO(DDSBO,FO)
 .. S F=DDSO(DDSBO,FO)
 . S $P(@DDSREFS@(DDSPG,B,F,"N"),U,10)=F1_",+1"
 . ;
 . S DN=0
 . S F=0 F  S F=$O(@DDSREFS@(DDSPG,B,F)) Q:DN=2!(F="")  D
 .. S LN=$G(@DDSREFS@(DDSPG,B,F,"N")) Q:LN=""
 .. S RT=$P(LN,U,3),NX=$P(LN,U,5)
 .. S:RT[","!'RT DN=DN+1
 .. S:NX[","!'NX DN=DN+1
 . ;
 . S F=0 F  S F=$O(@DDSREFS@(DDSPG,B,F)) Q:F=""  D
 .. S $P(@DDSREFS@(DDSPG,B,F,"N"),U,3)=RT
 .. S $P(@DDSREFS@(DDSPG,B,F,"N"),U,5)=NX
 Q

DDSZ3
DDSZ3 ;SFISC/MKO-FORM COMPILER ;02:49 PM  30 Dec 1993
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ASUB(DDSPG,DDSFRM) ;
 ;Set @DDSREFS@("ASUB",pg,bk,ddo)=subpage for parent field
 N MF,MB,MP
 S MF=$P(^DIST(.403,+DDSFRM,40,DDSPG,1),U,2) Q:MF=""
 S MP=$P(MF,",",3),MB=$P(MF,",",2),MF=$P(MF,",")
 ;
 S MF=$$GETFLD^DDSLIB(MF,MB,MP,DDSFRM)
 I $G(DIERR) K DIERR,^TMP("DIERR",$J) Q
 S @DDSREFS@("ASUB",$P(MF,",",3),$P(MF,",",2),$P(MF,","))=DDSPG
 Q
 ;
PGRP(FRM,G) ;Find page groups
 ;In:  FRM = Form number
 ;Out: G   = Array of page groups
 ;
 N B,I,NP,P,PP,PG
 S G=0
 S P=0 F  S P=$O(^DIST(.403,FRM,40,P)) Q:'P  D
 . Q:'$D(^DIST(.403,FRM,40,P,0))  S NP=$P(^(0),U,4),PP=$P(^(0),U,5)
 . F PG="NP","PP" I @PG D
 .. S @PG=$O(^DIST(.403,FRM,40,"B",@PG,"")) Q:'@PG
 .. S:$D(^DIST(.403,FRM,40,@PG,0))[0 @PG=""
 . S:NP=P NP=0 S:PP=NP!(PP=P) PP=0
 . S I=0 F  S I=$O(G(I)) Q:'I  Q:U_G(I)_U[(U_P_U)
 . I 'I S G=G+1,G(G)=P_$S(NP:U_NP,1:"")_$S(PP:U_PP,1:"") Q
 . F PG="NP","PP" I @PG,U_G(I)_U'[(U_@PG_U) S G(I)=G(I)_U_@PG
 Q

DDU
DDU ;SFISC/DCM-DD UTILITES ;18JUN2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
0 S DIC="^DOPT(""DDU"","
 G OPT:$D(^DOPT("DDU",4)) S ^(0)="DATA DICTIONARY UTILITY OPTION^1.01" K ^("B")
 F X=1:1:4 S ^DOPT("DDU",X,0)=$P($T(@X),";;",2)
 S DIK=DIC D IXALL^DIK
OPT ;
 S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN G 0
 ;
EN ;
 D @DI W !!
Q K %,DIC,DIK,DI,DA,I,J,X,Y Q
 ;
1 ;;LIST FILE ATTRIBUTES
 G ^DID
 ;
2 ;;MAP POINTER RELATIONS
 G ^DDMAP
 ;
3 ;;CHECK/FIX DD STRUCTURE
 G ^DDUCHK
 ;
4 ;;FIND POINTERS INTO A FILE
 G ^DIDGFTPT
 ;

DDUCHK
DDUCHK ;SFISC/RWF-CHECK DD ;11:25 AM  30 Dec 2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; DDUCFI=home file, DDUCFE=home field, DDUCFIX=flag to fix DD
 ; DDUCRFI=referenced file, DDUCRFE=referenced field.
A W !!,"Check the Data Dictionary." D
 . W !,"Note: Messages that begin with an asterisk(*) can NOT be corrected and"
 . W !,"will need careful evaluation by software development!"
 S DDUC=""
 D DT^DICRW
 D L^DICRW1
 I X'>0 D  G EXIT
 . I X'="" Q
 . W !?5,"*The file: "_$P($G(Y),U,2)_"(#"_$P($G(Y),U)_") is missing its ""GL"" (Global Location) node."
 . W !?6,"No further checking for this file can occur!"
 S DDUCFIS=+X-.000001,DDUCFIE=DIB(1)
 S DIR(0)="Y",DIR("A")="Remove erroneous nodes",DIR("B")="NO",DIR("?",1)="This routine will try to fix certain nodes that are erroneous and may set some nodes to a file referenced by the selected file."
 S DIR("?")="Say 'NO' here to leave the DD untouched.  It will only flag the ones it finds erroneous."
 D ^DIR G EXIT:$D(DIRUT) S DDUCFIX=+Y K DIR
ZIS S %ZIS="Q" D ^%ZIS G EXIT:POP
 I $D(IO("Q")) S ZTRTN="DQ^DDUCHK",ZTSAVE("DDUCFIX")="",ZTSAVE("DDUCFIS")="",ZTSAVE("DDUCFIE")="" D ^%ZTLOAD G EXIT
DQ U IO K DDUCSTK,^TMP("DDUCHK",$J) S DDUCSTK=0,DDUCFX=DDUCFIX
 F DDUCFILE=DDUCFIS:0:DDUCFIE S DDUCFILE=$O(^DIC(DDUCFILE)) Q:DDUCFILE'>0!(DDUCFILE>DDUCFIE)  D PAGE Q:$D(DIRUT)  D
 . N DDUERR S DDUERR=0
 . W !!,"Checking file ",DDUCFILE
 . S (DDUCFI,DIFILE)=+DDUCFILE
 . D DDAC
 . D CHKHDR
 . I DDUERR Q
 . D CHK
EXIT ;
 I $G(DUZ(0))="@",$D(^TMP("DDUCHK",$J)) D
 . W:$G(IOF)]"" @IOF
 . W !!,"List of ;;<file#>^<field #>^<cross reference#> that contain $Next"
 . N DDFIL S DDFIL=0 N I S I=1 N DDSP S DDSP="        "
 . F  S DDFIL=$O(^TMP("DDUCHK",$J,DDFIL)) Q:'DDFIL  D
 .. N DDFLD S DDFLD=0
 .. F  S DDFLD=$O(^TMP("DDUCHK",$J,DDFIL,DDFLD)) Q:'DDFLD  D
 ... N DDXRN S DDXRN=0
 ... F  S DDXRN=$O(^TMP("DDUCHK",$J,DDFIL,DDFLD,DDXRN)) Q:'DDXRN  D
 .... W !,I_$E(DDSP,1,(8-$L(I)))_";;"_DDFIL_U_DDFLD_U_DDXRN
 .... S I=I+1
 . S I=9999 W !,I_$E(DDSP,1,(8-$L(I)))_";;LAST LINE"
 K ^TMP("DDUCHK",$J)
 D ^%ZISC
 K DDUCFI,DDUCFIX,DDUCFILE,DDUCFIS,DDUCFIE,DDUCFE,DDUCX,DDUCX1,DDUCX2,DDUCX4,DDUCRFI
 K DDUCRFE,DDUCSTK,DDUCSTK,DDUCDNAM,DDUCNAME,DDUCXX,DDUCY,DDUCUP,DDUCXN
 K DDUCF,DDUCXREF,DDUCZ,DDUC5,DDUCYY,DDUCYY1,DDUCOK,DDUCYYX,DIB,DDUC,DDUCFX,DIAC,DIFILE
 Q
 ;
PAGE I $Y+3>IOSL S DIR(0)="E" D:IOST["C-" ^DIR W @IOF
 Q
 ;
DDAC I DUZ(0)'="@" S DIAC="DD" D ^DIAC S DDUCFIX=DDUCFX I 'DIAC,DDUCFX W !,"You don't have DD access to this file.  No fixing will be done on this file." S DDUCFIX=0 Q
 Q
CHK I $G(^DIC(DDUCFI,0))]"",'$P(^(0),U,2) S:DDUCFIX $P(^(0),U,2)=DDUCFI
 I $D(^DD(DDUCFI,0))[0 S DDUCRFI=DDUCFI W !?5,"*File: "_DDUCRFI_", is missing its file header node."
 I $D(^DD(DDUCFI,0,"ID")) D ID^DDUCHK1
 I $D(^DD(DDUCFI,0,"IX")) D IX^DDUCHK1
 I $D(^DD(DDUCFI,0,"PT")) D PT^DDUCHK1
 D CHKGL^DDUCHK2
 D CHKSB^DDUCHK2
 S DDUCNAME=$O(^DD(DDUCFI,0,"NM","")),DDUCDNAM=$O(^(DDUCNAME)),DDUCRFI=DDUCFI I DDUCDNAM]"" D WFI W "has duplicate 'NM' nodes." I DDUCFIX D NM^DDUCHK1
 I $D(^DD("ACOMP",DDUCFI)) D AC^DDUCHK1
 D INDEX^DDUCHK4(DDUCFI,DDUCFIX),KEY^DDUCHK5(DDUCFI,DDUCFIX)
 G ^DDUCHK2
WFI W !?8,"File: ",DDUCRFI," " Q
 ;
EN ;
 Q:'$D(DDUCFI)!'$D(DDUCFIX)  S U="^"
 I DDUCFI Q:'$D(^DIC(DDUCFI,0,"GL"))  G EN1
 Q:'$D(@(DDUCFI_"0)"))  S DDUCFI=+$P(^(0),U,2)
EN1 S DDUCFIS=+DDUCFI-.000001,DDUCFIE=+DDUCFI
 G ZIS
 ;
CHKHDR ; Check for Missing or Incorrect File Header Node ;22*130
 ;W !?5,"File: ",DDUCFI," Checking File Header Node."
 N DDUCGL,DDUCNA,DDUCHDR
 S DDUCGL=$G(^DIC(DDUCFI,0,"GL"))
 I DDUCGL="" W !?5,"*File: "_DDUCFI_", is missing file's ""GL"" (Global Location) node.",!?6,"No further checking can occur!" S DDUERR=1 Q
 S DDUCHDR=DDUCGL_"0)",DDUCHDR=$G(@DDUCHDR)
 S DDUCNA=$P(^DIC(DDUCFI,0),U)
 I DDUCHDR="" W !?5,"*File: "_DDUCFI_", is missing the File header node." Q
 I $P(DDUCHDR,U)'=DDUCNA W !?5,"*File: "_DDUCFI_", header name is incorrect." Q
 I +$P(DDUCHDR,U,2)'=DDUCFI W !?5,"*File: "_DDUCFI_" File header number is incorrect." Q
 Q

DDUCHK1
DDUCHK1 ;SFISC/RWF-CHECK DD part 2 ;3JUNE2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ID S DDUCRFE="" F DDUCZ=0:0 S DDUCRFE=$O(^DD(DDUCFI,0,"ID",DDUCRFE)) Q:DDUCRFE=""  S DDUCX=$S($D(^DD(DDUCFI,0,"ID",DDUCRFE))#2:^(DDUCRFE),1:"") I DDUCX="Q" W !?5,"'ID' node for field ",DDUCRFE," = 'Q'" D:DDUCFIX ID1
 Q
ID1 K ^DD(DDUCFI,0,"ID",DDUCRFE) D M1 W """ID"",",DDUCRFE D M2
 Q
IX S DDUCXREF="" F DDUCZ=0:0 S DDUCXREF=$O(^DD(DDUCFI,0,"IX",DDUCXREF)) Q:DDUCXREF=""  F DDUCRFI=0:0 S DDUCRFI=$O(^DD(DDUCFI,0,"IX",DDUCXREF,DDUCRFI)) Q:DDUCRFI'>0  D IX1
 Q
IX1 D IXDUP ;22*130
 F DDUCRFE=0:0 S DDUCRFE=$O(^DD(DDUCFI,0,"IX",DDUCXREF,DDUCRFI,DDUCRFE)) Q:DDUCRFE'>0  D
 . I $D(^DD(DDUCRFI,DDUCRFE,0))[0 D WFI W """IX"" Subscript: "_DDUCXREF_"  " D WFE,WMS D:DDUCFIX IX2 Q
 . I $D(^DD(DDUCRFI,DDUCRFE,1,0))=0,$D(^DD(DDUCRFI,DDUCRFE,1))=10 S:DDUCFIX ^DD(DDUCRFI,DDUCRFE,1,0)="^.1"
 . S DDUCRFE1=0,DDUCRFEX="" F  S DDUCRFE1=$O(^DD(DDUCRFI,DDUCRFE,1,DDUCRFE1)) Q:DDUCRFE1'>0  S DDUCRFEX=$G(^(DDUCRFE1,0)) I $P(DDUCRFEX,U,2)=DDUCXREF K DDUCRFEX Q
 . I $D(DDUCRFEX) W !?5,"Cross-reference logic is missing for """,DDUCXREF,""" x-ref" D:DDUCFIX IX2 Q
 K DDUCRFE1 Q
IX2 K ^DD(DDUCFI,0,"IX",DDUCXREF,DDUCRFI,DDUCRFE) D M1 W """IX"",",DDUCXREF_","_DDUCRFI_","_DDUCRFE D M2
 Q
PT F DDUCRFI=0:0 S DDUCRFI=$O(^DD(DDUCFI,0,"PT",DDUCRFI)) Q:DDUCRFI'>0  F DDUCRFE=0:0 S DDUCRFE=$O(^DD(DDUCFI,0,"PT",DDUCRFI,DDUCRFE)) Q:DDUCRFE'>0  D PT1
 Q
PT1 I $D(^DD(DDUCRFI,0))[0 D WFI,WMS I DDUCFIX K ^DD(DDUCFI,0,"PT",DDUCRFI) D M1 W """PT"",",DDUCRFI D M2 Q
 I $D(^DD(DDUCRFI,DDUCRFE,0))[0 D WFI W """PT"" Subscript " D WFE,WMS D:DDUCFIX PTM Q
 I ($P(^(0),U,2)'["P")&($P(^(0),U,2)'["V") D WFI,WFE W "is not a pointer." D:DDUCFIX PTM Q
 I $P(^(0),U,2)["P",+$P($P(^(0),U,2),"P",2)'=DDUCFI D WFI,WFE W "is not a pointer to file ",DDUCFI D:DDUCFIX PTM
 Q
PTM K ^DD(DDUCFI,0,"PT",DDUCRFI,DDUCRFE)
 D M1 W """PT"",",DDUCRFI,",",DDUCRFE D M2
 Q
AC F DDUCFE=0:0 S DDUCFE=$O(^DD("ACOMP",DDUCFI,DDUCFE)) Q:DDUCFE'>0  D AC1
 Q
AC1 F DDUCRFI=0:0 S DDUCRFI=$O(^DD("ACOMP",DDUCFI,DDUCFE,DDUCRFI)) Q:DDUCRFI'>0  F DDUCRFE=0:0 S DDUCRFE=$O(^DD("ACOMP",DDUCFI,DDUCFE,DDUCRFI,DDUCRFE)) Q:DDUCRFE'>0  D AC2
 Q
AC2 I $D(^DD(DDUCRFI,DDUCRFE,0))[0 D:DDUCFIX ACM Q
 S DDUCX=^(0) I $P(DDUCX,U,2)'["C" D:DDUCFIX ACM Q
 I $P(DDUCX,U,2)["C" S DDUCX1=$S($D(^(9.01)):^(9.01),1:""),DDUCF=0 D AC3
 Q
AC3 F DDUCZ=1:1 S DDUCX2=$P(DDUCX1,";",DDUCZ) Q:DDUCX2=""  I DDUCX2=DDUCFI_U_DDUCFE S DDUCF=1 Q
 I 'DDUCF D:DDUCFIX ACM
 Q
ACM K ^DD("ACOMP",DDUCFI,DDUCFE,DDUCRFI,DDUCRFE)
 Q
NM S DDUCRFI(1)=$S($D(^DIC(DDUCFI,0))#2:$P(^(0),U),1:$P(^DD(DDUCFI,0)," SUB-FIELD"))
 Q:DDUCRFI(1)']""  K ^DD(DDUCFI,0,"NM") S ^DD(DDUCFI,0,"NM",DDUCRFI(1))="" W !?10,"Duplicate ""NM"" node was deleted."
 Q
WHO W !?5,"Field: ",DDUCFE," (",$P(DDUCX,U),") " Q
WFI W !?5,"File: ",DDUCRFI," " Q
WFE W ?5,"Field: ",DDUCRFE," " Q
WMS W "is missing." Q
M1 W !?10,"^DD(",DDUCFI,",0," Q
M2 W ") was killed." Q
 Q
 ;
IXDUP ;Check for duplicate fields for same xref ;22*130
 N DDUCRFE,DDUCRFEP
 S (DDUCRFE,DDUCRFEP)=0
 S DDUCRFE=$O(^DD(DDUCFI,0,"IX",DDUCRFI,DDUCRFE)) ;HUH??
 D
 . F  S DDUCRFE=$O(^DD(DDUCFI,0,"IX",DDUCXREF,DDUCRFI,DDUCRFE)) Q:'DDUCRFE  D
 .. I 'DDUCRFEP S DDUCRFEP=DDUCRFE Q
 .. I DDUCRFE'=DDUCRFEP D
MN ...N I F I=0:0 S I=$O(^DD(DDUCRFI,DDUCRFE,1,I)) Q:'I  I +$G(^(I,0))=DDUCFI,$P(^(0),U,2)=DDUCXREF,$P(^(0),U,3)="MNEMONIC" K I Q
 ...Q:'$D(I)
 ... W !?5,"*File: ",DDUCRFI," Index: """_DDUCXREF_""" has duplicate Fields."
 ... W !?21,"Field: ",DDUCRFEP,"  Field: ",DDUCRFE
 .. S DDUCRFEP=DDUCRFE
 .. Q
 . S DDUCRFEP=0
 . Q

DDUCHK2
DDUCHK2 ;SFISC/RWF/SO-CHECK DD (FIELDS) ;11:46 AM  5 Mar 2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CHK6 ;W !?5,"Checking FIELDs"
 F DDUCFE=0:0 S DDUCFE=+$O(^DD(DDUCFI,DDUCFE)) Q:DDUCFE'>0  D FIELD Q:$D(DIRUT)  D FIVE,DXREF^DDUCHK3,XREF^DDUCHK3,COMP^DDUCHK3
 ;D CHKSB,CHKGL
 Q
FIELD ;W "."
 I $D(^DD(DDUCFI,DDUCFE,0))[0 W !?5,"*Field: ",DDUCFE," is missing its zero node." Q  ;22*100,22*130
 S DDUCX=^DD(DDUCFI,DDUCFE,0),DDUCX2=$P(DDUCX,U,2),DDUCX4=$P(DDUCX,U,4),DDUCXN=$P(DDUCX,U)
 I $P(DDUCX,U,5,999)["$N(",$P(DDUCX,U,5,999)'["$$N(" W !?5,"*Field: ",DDUCFE,"'s Input Transform contains $Next."
 ;I DDUCX2["F",DDUCX4[";E1",$S($D(^DD(DDUCFI,DDUCFE,9)):^(9),1:"")'="@" D WHO W "doesn't have the correct protection for a field with executable code." I DDUCFIX S ^DD(DDUCFI,DDUCFE,9)="@" W !?10,"^DD(",DDUCFI,",",DDUCFE,",9) = ""@"" was set."
 D @$S(+DDUCX2:"MULT",DDUCX2["P":"PT",DDUCX2["V":"VP",1:"Q") Q
 Q
FIVE K DDUCXX F DDUCY=0:0 S DDUCY=$O(^DD(DDUCFI,DDUCFE,5,DDUCY)) Q:DDUCY'>0  S DDUCX=^(DDUCY,0) I $D(^DD(+DDUCX,+$P(DDUCX,U,2),1,+$P(DDUCX,U,3),0))#2 S DDUCXX(DDUCX)=""
 Q:'DDUCFIX
 K ^DD(DDUCFI,DDUCFE,5)
 S DDUCX="" F DDUCY=1:1 S DDUCX=$O(DDUCXX(DDUCX)) Q:DDUCX=""  S ^DD(DDUCFI,DDUCFE,5,DDUCY,0)=DDUCX
 Q
VP F DDUCY=0:0 S DDUCY=$O(^DD(DDUCFI,DDUCFE,"V",DDUCY)) Q:DDUCY'>0  S DDUCRFI=$S($D(^DD(DDUCFI,DDUCFE,"V",DDUCY,0)):^(0),1:"") I DDUCRFI D PT1
 Q
PT N DDUERR S DDUCRFI=+$P(DDUCX2,"P",2),DDUERR=0 D  Q:DDUERR
 . I $D(^DD(DDUCRFI,0))[0 W !?5,"*Field: ",DDUCFE," (",DDUCXN,") points to missing file: ",DDUCRFI S DDUERR=1 Q
 . N DDUCGL,DDUCNA,DDUCHDR
 . S DDUCGL=$G(^DIC(DDUCRFI,0,"GL"))
 . I DDUCGL="" W !?5,"*Field: ",DDUCFE," (",DDUCXN,") points to File: "_DDUCRFI_", is missing file's ""GL"" (Global Location) node." S DDUERR=1 Q
 . S DDUCHDR=DDUCGL_"0)",DDUCHDR=$G(@DDUCHDR)
 . I DDUCHDR="" W !?5,"*Field: ",DDUCFE," (",DDUCXN,") points to File: "_DDUCRFI_", missing File header node." S DDUERR=1
 . Q
PT1 I $D(^DD(+DDUCRFI,0,"PT",DDUCFI,DDUCFE))[0 D WHO W "is missing its 'PT' node in the pointed-to-file." I DDUCFIX S ^DD(+DDUCRFI,0,"PT",DDUCFI,DDUCFE)="" W !?10,"^DD(",+DDUCRFI,",0,""PT"",",DDUCFI,",",DDUCFE,") = """" was set."
Q Q  ;QUIT TAG
MULT ;Work subfile
 D PAGE^DDUCHK Q:$D(DIRUT)
 I $D(^DD(+DDUCX2,0))[0 W !?5,"*Field: ",DDUCFE," (",DDUCXN,") missing subfile: ",+DDUCX2 Q
 S DDUCUP=$S($D(^DD(+DDUCX2,0,"UP")):^("UP"),1:"") I DDUCUP'=DDUCFI D WHO W "Bad 'UP' pointer in subfile #",+DDUCX2 I DDUCFIX S ^DD(+DDUCX2,0,"UP")=DDUCFI W !?10,"^DD(",+DDUCX2,",0,""UP"") = ",DDUCFI," was set."
 D PUSH S DDUCFI=+DDUCX2 W !?3,"Checking subfile ",DDUCFI D CHK^DDUCHK,POP W !?3,"Returning to ",$S('DDUCSTK:"main ",1:"sub"),"file",$S('DDUCSTK:" "_DDUCFILE_".",1:" "_DDUCFI)
 Q
PUSH S DDUCSTK=DDUCSTK+1,DDUCSTK(DDUCSTK,1)=DDUCFI,DDUCSTK(DDUCSTK,2)=DDUCFE Q
POP S DDUCFI=DDUCSTK(DDUCSTK,1),DDUCFE=DDUCSTK(DDUCSTK,2),DDUCSTK=DDUCSTK-1 Q
WHO W !?8,"Field: ",DDUCFE," (",DDUCXN,") " Q
 ;
CHKSB ;Check for duplicate "SB" x-refs ;22*130
 N DDUCSB
 S DDUCSB=0
 F  S DDUCSB=+$O(^DD(DDUCFI,"SB",DDUCSB)) Q:'DDUCSB  D
 . N DDUCFE,DDUCSAV,DDUNFE
 . S DDUCFE=0
 . F  S DDUCFE=+$O(^DD(DDUCFI,"SB",DDUCSB,DDUCFE)) Q:'DDUCFE  D CHKSBA I '$D(DDUNFE),$O(^DD(DDUCFI,"SB",DDUCSB,DDUCFE)) D
 .. N DDUCFE1,DDUCX
 .. ;Is the TYPE "WP"?
 .. S DDUCX=$O(^DD(DDUCFI,"SB",DDUCSB,DDUCFE)) I $D(^DD(DDUCFI,DDUCX,0)),$P(^DD(DDUCFI,DDUCX,0),U,4)["WP" Q
 .. S DDUCSAV(DDUCFE)=""
 .. S DDUCFE1=DDUCFE
 .. F  S DDUCFE1=+$O(^DD(DDUCFI,"SB",DDUCSB,DDUCFE1)) Q:'DDUCFE1  S DDUCSAV(DDUCFE1)=""
 . N X1,X2
 . S X1=0
 . F  S X1=$O(DDUCSAV(X1)) Q:'X1  D
 .. I '$D(X2) W !?5,"*Duplicate Fields represent Sub-file: "_DDUCSB,!?7 S X2=1
 .. W "field: "_X1_"; "
 Q
 ;
CHKSBA ;Check if Feidl exists
 I '$D(^DD(DDUCFI,DDUCFE,0))#2 W !?7,"*Field: "_DDUCFE_", File: "_DDUCFI_", ""SB"" subscript for subfile: "_DDUCSB_" is missing." S DDUNFE=1 Q
 Q
 ;
CHKGL ;Check for duplicate "GL" nodes ;22*130
 N DDUCN
 S DDUCN=""
 F  S DDUCN=$O(^DD(DDUCFI,"GL",DDUCN)) Q:DDUCN=""  D
 . N DDUCP
 . S DDUCP=0
 . F  S DDUCP=+$O(^DD(DDUCFI,"GL",DDUCN,DDUCP)) Q:'DDUCP  D
 .. N DDUCFE2,DDUCSAV
 .. S DDUCFE2=0
 .. F  S DDUCFE2=+$O(^DD(DDUCFI,"GL",DDUCN,DDUCP,DDUCFE2)) Q:'DDUCFE2  I $O(^DD(DDUCFI,"GL",DDUCN,DDUCP,DDUCFE2)) D
 ... S DDUCSAV(DDUCN_";"_DDUCP,DDUCFE2)=""
 ... N X
 ... S X=0
 ... S X=$O(^DD(DDUCFI,"GL",DDUCN,DDUCP,DDUCFE2)) Q:'X  S DDUCSAV(DDUCN_";"_DDUCP,X)=""
 .. N X1,X2
 .. S X1="" ;Global Location
 .. F  S X1=$O(DDUCSAV(X1)) Q:X1=""  D
 ... I '$D(X2) W !?5,"*Duplication at global location subscript: "_$P(X1,";")_", piece: "_$P(X1,";",2),!?9 S X2=1
 ... N X3
 ... S X3=0 ;Field #
 ... F  S X3=$O(DDUCSAV(X1,X3)) Q:'X3  W "field: "_X3_"; "
 Q

DDUCHK3
DDUCHK3 ;SFISC/RWF-CHECK DD (XREF,COMPUTED) ;12:40 PM  4 Mar 2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
XREF F DDUCY=0:0 S DDUCY=$O(^DD(DDUCFI,DDUCFE,1,DDUCY)) Q:DDUCY'>0  S DDUCX=^(DDUCY,0),DDUCRFI=+DDUCX,DDUCX1=$P(DDUCX,U,2) D XREF1
 Q
XREF1 ;
 I DDUCRFI,$D(^DD(DDUCRFI,0)),$D(^DD(DDUCRFI,0,"IX",DDUCX1,DDUCFI,DDUCFE))[0 D WHO,WFI W "missing 'IX' node." D:DDUCFIX XREFM Q
 I DDUCX["TRIGGER" S DDUCRFI=+$P(DDUCX,U,4),DDUCRFE=+$P(DDUCX,U,5),DDUC5=DDUCFI_U_DDUCFE_U_DDUCY D TRIG
 Q
XREFM S ^DD(DDUCRFI,0,"IX",DDUCX1,DDUCFI,DDUCFE)="" W !?10,"^DD(",DDUCRFI,",0,""IX"",""",DDUCX1,""",",DDUCFI,",",DDUCFE,") = """" was set."
 Q
TRIG I $D(^DD(DDUCRFI,0))[0 W !?5,"Field: ",DDUCFE," (",DDUCXN,") triggers missing file ",DDUCRFI Q
 I $D(^DD(DDUCRFI,DDUCRFE,0))[0 W !?5,"*Field: ",DDUCFE," (",DDUCXN,") triggers missing field ",DDUCRFE," in file ",DDUCRFI Q
 I '$D(^DD(DDUCRFI,DDUCRFE,5)) D WHO,WFI,WFE W " 5 node is missing." I DDUCFIX S ^DD(DDUCRFI,DDUCRFE,5,1,0)=DDUC5 W !?10,"^DD(",DDUCRFI,",",DDUCRFE,",5,1,0) = ",DDUC5," was set." Q
 Q:'DDUCFIX  S (DDUCYY1,DDUCOK)=0
 F DDUCYY=0:0 S DDUCYY=$O(^DD(DDUCRFI,DDUCRFE,5,DDUCYY)) Q:DDUCYY'>0  S DDUCYY1=DDUCYY,DDUCYYX=^(DDUCYY,0) I DDUCYYX=DDUC5 S DDUCOK=1 Q
 I 'DDUCOK D WHO,WFI,WFE W " 5 node is missing." D:DDUCFIX TRIGM Q
 Q
TRIGM S ^DD(DDUCRFI,DDUCRFE,5,(DDUCYY1+1),0)=DDUC5
 I DDUCRFI'=DDUCFE W !?10,"^DD(",DDUCRFI,",",DDUCRFE,",5,",DDUCYY1+1,",0) = ",DDUC5," was set."
 Q
COMP Q:DDUCX2'["C"  S DDUCX=$S($D(^DD(DDUCFI,DDUCFE,9.01)):^(9.01),1:"")
 F DDUCX1=1:1 Q:$P(DDUCX,";",DDUCX1)=""  S DDUCRFI=+$P(DDUCX,";",DDUCX1),DDUCRFE=+$P($P(DDUCX,";",DDUCX1),U,2) I $D(^DD("ACOMP",DDUCRFI,DDUCRFE,DDUCFI,DDUCFE))[0 S:DDUCFIX ^DD("ACOMP",DDUCRFI,DDUCRFE,DDUCFI,DDUCFE)=""
 Q
WHO W !?8,"Field: ",DDUCFE," (",DDUCXN,") " Q
WFI W !?8,"File: ",DDUCRFI," " Q
WFE W ?8,"Field: ",DDUCRFE," " Q
 ;
DXREF ; Check for $Next usage; 22*130
 ; DDUCFI = File #
 ; DDUCFE = Field #
 ; XRN = Cross Reference #
 N XRN S XRN=0
 F  S XRN=$O(^DD(DDUCFI,DDUCFE,1,XRN)) Q:'XRN  D
 . ; XRN1 = Cross Reference Node Data
 . N XRN1 S XRN1=""
 . ; XRNW = 0 Have Not written warning, 1 have written warning
 . N XRNW S XRNW=0
 . F  S XRN1=$O(^DD(DDUCFI,DDUCFE,1,XRN,XRN1)) Q:XRN1=""  D
 .. N GMSG S GMSG=0 ;1 equals use general message
 .. I XRN1="%D" Q
 .. I XRN1="DT" Q
 .. ; Check for $Next any cross reference code
 .. I ^DD(DDUCFI,DDUCFE,1,XRN,XRN1)["$N(",^DD(DDUCFI,DDUCFE,1,XRN,XRN1)'["$$N(" D  I GMSG W !?5,"*Field: ",DDUCFE,", Cross Reference #: ",XRN,", Sub-Script: ",XRN1,", contains $Next."
 ... I $P(^DD(DDUCFI,DDUCFE,1,XRN,0),U,3)'="TRIGGER" S GMSG=1 Q
 ... ; Display/Fix known old FileMan TRIGGER Code:
 ... ; "D ^DICR:$N(^DD(DIH,DIG,1,0))>0"
 ... N DICRVAL
 ... S DICRVAL=$G(^DD(DDUCFI,DDUCFE,1,XRN,XRN1))
 ... I DICRVAL'["D ^DICR:$N(^DD(DIH,DIG,1,0))>0" S GMSG=1 Q
 ... I 'XRNW D
 .... W !?5,"*File: "_DDUCFI_", Field: "_DDUCFE_", XREF: "_XRN_" contains $Next in TRIGGER code."
 .... S ^TMP("DDUCHK",$J,DDUCFI,DDUCFE,XRN)=""
 .... S XRNW=1
 Q

DDUCHK4
DDUCHK4 ;SFISC/MKO-CHECK INDEXES ON FILE ;6:36 AM  28 Dec 2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
INDEX(DDUCFI,DDUCFIX) ;Check and optionally fix structure of Index file entry
 N DDUCIX
 Q:'$G(DDUCFI)  S DDUCFIX=$G(DDUCFIX)
 ;
 ;Loop through "B" index to find INDEXes that reside on this file
 D WCHK
 S DDUCIX=""
 F  S DDUCIX=$O(^DD("IX","B",DDUCFI,DDUCIX)) Q:DDUCIX=""  D CHKIX
 ;
 ;Check "AC","BB", and "F" indexes
 D CHKAC,CHKBB,CHKF
 Q
 ;
CHKIX ;Check Index DDUCIX found in "B" index
 ;In:
 ; DDUCIX  = index #
 ; DDUCFI  = file #
 ; DDUCFIX = flag to fix
 N DDUCIX0,DDUCIXID,DDUCNM,DDUCRF,DDUCRV
 S DDUCIXID=$$IXID(DDUCIX,"")
 ;
 ;Check that Index exists
 I '$D(^DD("IX",DDUCIX)) D  Q
 . D WNOIX
 . D:DDUCFIX KILL($NA(^DD("IX","B",DDUCFI,DDUCIX)))
 ;
 ;Check that index has a FILE
 S DDUCIX0=$G(^DD("IX",DDUCIX,0))
 I $P(DDUCIX0,U)="" D
 . D WMS("FILE (#.01) for "_DDUCIXID)
 . D:DDUCFIX FFILE
 ;
 ;Get Name
 S DDUCNM=$P(DDUCIX0,U,2)
 I DDUCNM]"" S DDUCIXID=$$IXID(DDUCIX,DDUCNM)
 E  D WMS("NAME for "_DDUCIXID)
 ;
 ;Check Root File not null, and "AC" index exists
 S DDUCRF=$P(DDUCIX0,U,9)
 I 'DDUCRF D
 . D WMS("ROOT FILE for "_DDUCIXID)
 . D:DDUCFIX FRF
 ;
 ;Check Cross-Reference Values multiple
 S DDUCRV=0
 F  S DDUCRV=$O(^DD("IX",DDUCIX,11.1,DDUCRV)) Q:'DDUCRV  D CRV
 ;
 ;Reindex Index file entry
 I DDUCFIX D
 . N DIC,DIK,DA,X
 . S DIK="^DD(""IX"",",DA=DDUCIX
 . D IX^DIK
 Q
 ;
CRV ;Check a Cross-Reference Value
 ;In:
 ; DDUCIX   = Index #
 ; DDUCRV   = CRV #
 ; DDUCFIX  = Flag to fix
 ; DDUCRF   = Root file #
 ; DDUCIXID = String that identifies Index
 N DDUCFIL,DDUCFLD,DDUCGL,DDUCOID,DDUCORD,DDUCRV0
 ;
 S DDUCRV0=$G(^DD("IX",DDUCIX,11.1,DDUCRV,0))
 Q:$P(DDUCRV0,U,2)="C"
 S DDUCORD=$P(DDUCRV0,U),DDUCFIL=$P(DDUCRV0,U,3),DDUCFLD=$P(DDUCRV0,U,4)
 ;
 ;Check .01 of CRV
 I DDUCORD="" D
 . D WMS("ORDER NUMBER of Cross-Reference Value #"_DDUCRV_" of "_DDUCIXID)
 . D:DDUCFIX FON
 S DDUCOID=$$OID(DDUCORD,"","",DDUCIXID)
 ;
 ;Make sure FILE is not null
 I 'DDUCFIL D
 . D WMS("FILE for "_DDUCOID,1)
 ;
 ;If there's a File, make sure it is equal to Root File
 ;and that referenced field exists.
 E  D
 . D:DDUCFIL'=DDUCRF WNE
 . D:$D(^DD(DDUCFIL,DDUCFLD,0))[0 WFMS
 . I $D(^DD("IX","F",DDUCFIL,DDUCFLD,DDUCIX,DDUCRV))[0 S DDUCGL=$NA(^(DDUCRV)) D
 .. D WMS(DDUCGL)
 .. D:DDUCFIX SET(DDUCGL)
 Q
 ;
CHKAC ;Check "AC index (In: DDUCFI = file; DDUCFIX = flag to fix)
 N DDUCGL,DDUCIX
 S DDUCIX=0 F  S DDUCIX=$O(^DD("IX","AC",DDUCFI,DDUCIX)) Q:'DDUCIX  D
 . I $P($G(^DD("IX",DDUCIX,0)),U,9)]"",$P(^(0),U,9)'=DDUCFI D
 .. S DDUCGL=$NA(^DD("IX","AC",DDUCFI,DDUCIX))
 .. D WEN(DDUCGL)
 .. D:DDUCFIX KILL(DDUCGL)
 Q
 ;
CHKBB ;Check "BB" index (In: DDUCFI = file; DDUCFIX = flag to fix)
 N DDUCGL,DDUCIX,DDUCIX0,DDUCIXID,DDUCNM,DDUCNML
 S DDUCNM=""
 F  S DDUCNM=$O(^DD("IX","BB",DDUCFI,DDUCNM)) Q:DDUCNM=""  D
 . S DDUCIX=0
 . F DDUCIX=$O(^DD("IX","BB",DDUCFI,DDUCNM,DDUCIX)) Q:'DDUCIX  D
 .. S DDUCIX0=$G(^DD("IX",DDUCIX,0))
 .. I $D(^DD("IX",DDUCIX)),$P(DDUCIX0,U,2)="" S DDUCNML(DDUCIX,DDUCNM)=""
 .. E  I $P(DDUCIX0,U)'=DDUCFI!($P(DDUCIX0,U,2)'=DDUCNM) D
 ... S DDUCGL=$NA(^DD("IX","BB",DDUCFI,DDUCNM,DDUCIX))
 ... D WEN(DDUCGL)
 ... D:DDUCFIX KILL(DDUCGL)
 ;
 ;If any of the Indexes have null Names, check whether a single name
 ;for it was found in the "BB" index.
 I $D(DDUCNML) S DDUCIX=0 F  S DDUCIX=$O(DDUCNML(DDUCIX)) Q:'DDUCIX  D
 . S DDUCNM=$O(DDUCNML(DDUCIX,""))
 . I $O(DDUCNML(DDUCIX,DDUCNM))="" D
 .. S DDUCIXID=$$IXID(DDUCIX,"")
 .. D WNM
 .. D:DDUCFIX FNM
 . E  F  D  S DDUCNM=$O(DDUCNML(DDUCIX,DDUCNM)) Q:DDUCNM=""
 .. S DDUCGL=$NA(^DD("IX","BB",DDUCFI,DDUCNM,DDUCIX))
 .. D WEN(DDUCGL)
 .. D:DDUCFIX KILL(DDUCGL)
 Q
 ;
CHKF ;Check "F" index (In: DDUCFI = file; DDUCFIX = flag to fix)
 N DDUCFLD,DDUCGL,DDUCIX,DDUCRV
 S DDUCFLD=0
 F  S DDUCFLD=$O(^DD("IX","F",DDUCFI,DDUCFLD)) Q:'DDUCFLD  D
 . S DDUCIX=0
 . F  S DDUCIX=$O(^DD("IX","F",DDUCFI,DDUCFLD,DDUCIX)) Q:'DDUCIX  D
 .. S DDUCRV=0
 .. F  S DDUCRV=$O(^DD("IX","F",DDUCFI,DDUCFLD,DDUCIX,DDUCRV)) Q:'DDUCRV  D
 ... I $P($G(^DD("IX",DDUCIX,11.1,DDUCRV,0)),U,3)'=DDUCFI!($P($G(^(0)),U,4)'=DDUCFLD) D
 .... S DDUCGL=$NA(^DD("IX","F",DDUCFI,DDUCFLD,DDUCIX,DDUCRV))
 .... D WEN(DDUCGL)
 .... D:DDUCFIX KILL(DDUCGL)
 Q
 ;
 ;---------------
FFILE ;Set the .01 of index to DDUCFI
 S $P(^DD("IX",DDUCIX,0),U)=DDUCFI
 D WRITE("FILE (#.01) for "_DDUCIXID_" set to "_DDUCFI_".",10)
 Q
 ;
FRF ;Set Root File equal to File and Root Type to 'INDEX FILE'
 S $P(^DD("IX",DDUCIX,0),U,8)="I"
 S $P(^DD("IX",DDUCIX,0),U,9)=DDUCFI
 S DDUCRF=DDUCFI
 D WRITE("ROOT FILE for "_DDUCIXID_" set to "_DDUCFI_".",10)
 D WRITE("ROOT TYPE for "_DDUCIXID_" set to 'INDEX FILE'.",10)
 Q
 ;
FON ;Determine Order Number
 N DDUCI,DDUCO
 ;
 ;Look for Order Number in "B" index
 S DDUCORD=0
 F  S DDUCORD=$O(^DD("IX",DDUCIX,11.1,"B",DDUCORD)) Q:'DDUCORD  Q:$O(^DD("IX",DDUCIX,11.1,"B",DDUCORD,0))=DDUCRV
 ;
 ;If not found, just pick an unused Order Number
 I 'DDUCORD D
 . S DDUCI=0
 . F  S DDUCI=$O(^DD("IX",DDUCIX,11.1,DDUCI)) Q:'DDUCI  S:$P($G(^(DDUCI,0)),U)]"" DDUCO($P(^(0),U))=""
 . S DDUCORD=$O(DDUCO(""),-1)
 . S:'DDUCORD DDUCORD=1
 ;
 S $P(^DD("IX",DDUCIX,11.1,DDUCRV,0),U)=DDUCORD
 D WRITE("ORDER NUMBER for Cross-Reference Value #"_DDUCRV_" of "_DDUCIXID_" set to "_DDUCORD_".",10)
 Q
 ;
FNM ;Set the NAME for the Index
 S $P(^DD("IX",DDUCIX,0),U,2)=DDUCNM
 D WRITE("NAME for "_DDUCIXID_" set to '"_DDUCNM_"'.",10)
 Q
 ;
KILL(GL) ;Kill a global and print a message
 Q:'$D(@GL)
 K @GL
 W !?10,GL_" was killed."
 Q
 ;
SET(GL,VAL) ;Set a global and print a message
 Q:$D(@GL)
 S VAL=$G(VAL),@GL=VAL
 W !?10,GL_" was set"_$S(VAL]"":" to "_VAL,1:"")_"."
 Q
 ;
 ;Write messages
WCHK Q  ;D WRITE("Checking Indexes.",5) Q
WNOIX D WRITE(DDUCIXID_" does not exist.",7) Q
WMS(S,N) D WRITE("*"_S_" is missing."_$S($G(N):" ",1:""),7) Q
WNE D WRITE("*FILE does not equal ROOT FILE in "_DDUCOID_".",7) Q  ;22*130
WFMS D WRITE("*File/Sub-file #"_$S($G(FIL)'="":FIL,1:DDUCFIL)_", Field #"_$S($G(FLD)'="":FLD,1:DDUCFLD)_" referenced in "_DDUCOID_" is missing.",7) Q  ;22*130
WEN(GL) D WRITE("Erroneous node "_GL_" is set.",7) Q
WNM D WRITE("NAME for "_DDUCIXID_" looks like it should be '"_DDUCNM_"'.",7) Q
 ;
WRITE(TXT,TAB) ;Write text, wrap at word boundaries.
 N I
 D WRAP^DIKCU2(.TXT,-TAB-2,-TAB)
 W !?TAB,$G(TXT,$G(TXT(0))) F I=1:1 Q:'$D(TXT(I))  W !?TAB+2,TXT(I)
 Q
 ;
IXID(IX,NM) ;Return string that identifies an Index
 S:'$D(NM) NM=$P($G(^DD("IX",IX,0)),U,2)
 Q $S(NM]"":"'"_NM_"' Index (#"_IX_")",1:"Index #"_IX)
 ;
OID(ORD,IX,NM,IXID) ;Return string that identifies Cross-Reference Value
 I '$D(IXID),$G(IX) S IXID=$S($D(NM)#2:$$IXID(IX,NM),1:$$IXID(IX))
 Q "Order #"_ORD_" of "_$S($G(IXID)]"":IXID,1:"")

DDUCHK5
DDUCHK5 ;SFISC/MKO-CHECK KEYS ON FILE ;8/8/03  06:26
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
KEY(DDUCFI,DDUCFIX) ;Check and optionally fix structure of Key file entry
 N DDUCKEY
 Q:'$G(DDUCFI)  S DDUCFIX=$G(DDUCFIX)
 ;
 ;Loop through "B" index to find KEYs that reside on this file
 D WCHK
 S DDUCKEY=""
 F  S DDUCKEY=$O(^DD("KEY","B",DDUCFI,DDUCKEY)) Q:DDUCKEY=""  D CHKKEY
 ;
 ;Check "AP","BB", and "F" indexes
 D CHKAP,CHKBB,CHKF
 Q
 ;
CHKKEY ;Check Key DDUCKEY found in "B" index
 ;In:
 ; DDUCKEY  = Key #
 ; DDUCFI   = File #
 ; DDUCFIX  = Flag to fix
 N DDUCIEN,DDUCKEY0,DDUCKID,DDUCNM,DDUCUI
 S DDUCKID=$$KEYID(DDUCKEY,"")
 ;
 ;Check that Key exists
 I '$D(^DD("KEY",DDUCKEY)) D  Q
 . D WNOKEY
 . D:DDUCFIX KILL($NA(^DD("KEY","B",DDUCFI,DDUCKEY)))
 ;
 ;Check that Key has a FILE
 S DDUCKEY0=$G(^DD("KEY",DDUCKEY,0))
 I $P(DDUCKEY0,U)="" D
 . D WMS("FILE (#.01) for "_DDUCKID)
 . D:DDUCFIX FFILE
 ;
 ;Get Name
 S DDUCNM=$P(DDUCKEY0,U,2)
 I DDUCNM]"" S DDUCKID=$$KEYID(DDUCKEY,DDUCNM)
 E  D WMS("NAME for "_DDUCKID)
 ;
 ;Check Priority
 S DDUCPRI=$P(DDUCKEY0,U,3)
 D:DDUCPRI="" WMS("PRIORITY for "_DDUCKID)
 ;
 ;Check Uniqueness Index
 S DDUCUI=$P(DDUCKEY0,U,4)
 I 'DDUCUI D
 . D WMS("Uniqueness Index for "_DDUCKID,1)
 E  D
 . I '$D(^DD("IX",DDUCUI,0)) D  Q
 .. D WMS("Dangling pointer. Uniqueness Index #"_DDUCUI_" pointed to by "_DDUCKID,1)
 . D GETFLD^DIKKUTL2(DDUCKEY,DDUCUI,.DDUCKFLD,.DDUCUFLD)
 . D:'$$GCMP^DIKCU2("DDUCKFLD","DDUCUFLD") WNE
 ;
 ;Check Field multiple
 S DDUCIEN=0
 F  S DDUCIEN=$O(^DD("KEY",DDUCKEY,2,DDUCIEN)) Q:'DDUCIEN  D FLD
 ;
 ;Reindex Key file entry
 I DDUCFIX D
 . N DIC,DIK,DA,X
 . S DIK="^DD(""KEY"",",DA=DDUCKEY
 . D IX^DIK
 Q
 ;
FLD ;Check a Cross-Reference Value
 ;In:
 ; DDUCKEY = Key #
 ; DDUCIEN = IEN in FIELD multiple
 ; DDUCFIX = Flag to fix
 ; DDUCKID = String that identifies Key
 ; DDUCUI  = Uniqueness index #
 N DDUCFIL,DDUCFLD,DDUCFLD0,DDUCKFLD,DDUCSEQ,DDUCUFLD
 ;
 S DDUCFLD0=$G(^DD("KEY",DDUCKEY,2,DDUCIEN,0))
 S DDUCFLD=$P(DDUCFLD0,U),DDUCFIL=$P(DDUCFLD0,U,2)
 S DDUCSEQ=$P(DDUCFLD0,U,3)
 ;
 ;Check that field, file, and sequence are filled in
 D:'DDUCFLD!'DDUCFIL!'DDUCSEQ WINC
 ;
 ;Make sure file/field exists and is in the "F" index
 I DDUCFLD,DDUCFIL D
 . D:$D(^DD(DDUCFIL,DDUCFLD,0))[0 WFMS
 . I $D(^DD("KEY","F",DDUCFIL,DDUCFLD,DDUCKEY,DDUCIEN))[0 S DDUCGL=$NA(^(DDUCIEN)) D
 .. D WMS(DDUCGL)
 .. D:DDUCFIX SET(DDUCGL)
 Q
 ;
CHKAP ;Check "AP" index (In: DDUCFI = file; DDUCFIX = flag to fix)
 N DDUCGL,DDUCKEY,DDUCKEY0,DDUCPRI,DDUCPRIL
 ;
 S DDUCPRI=""
 F  S DDUCPRI=$O(^DD("KEY","AP",DDUCFI,DDUCPRI)) Q:DDUCPRI=""  D
 . S DDUCKEY=0
 . F  S DDUCKEY=$O(^DD("KEY","AP",DDUCFI,DDUCPRI,DDUCKEY)) Q:'DDUCKEY  D
 .. S DDUCKEY0=$G(^DD("KEY",DDUCKEY,0))
 .. I $D(^DD("KEY",DDUCKEY)),$P(DDUCKEY0,U,3)="" S DDUCPRIL(DDUCKEY,DDUCPRI)=""
 .. E  I $P(DDUCKEY0,U)'=DDUCFI!($P(DDUCKEY0,U,3)'=DDUCPRI) D
 ... S DDUCGL=$NA(^DD("KEY","AP",DDUCFI,DDUCPRI,DDUCKEY))
 ... D WEN(DDUCGL)
 ... D:DDUCFIX KILL(DDUCGL)
 ;
 ;If any of the Keys have null Priorities, check whether a single
 ;priority for it was found in the "AP" index.
 I $D(DDUCPRIL) S DDUCKEY=0 F  S DDUCKEY=$O(DDUCPRIL(DDUCKEY)) Q:'DDUCKEY  D
 . S DDUCPRI=$O(DDUCPRIL(DDUCKEY,""))
 . I $O(DDUCPRIL(DDUCKEY,DDUCPRI))="" D
 .. S DDUCKID=$$KEYID(DDUCKEY)
 .. D WPRI
 .. D:DDUCFIX FPRI
 . E  F  D  S DDUCPRI=$O(DDUCPRIL(DDUCKEY,DDUCPRI)) Q:DDUCPRI=""
 .. S DDUCGL=$NA(^DD("KEY","AP",DDUCFI,DDUCPRI,DDUCKEY))
 .. D WEN(DDUCGL)
 .. D:DDUCFIX KILL(DDUCGL)
 Q
 ;
CHKBB ;Check "BB" index (In: DDUCFI = file; DDUCFIX = flag to fix)
 N DDUCGL,DDUCKEY,DDUCKEY0,DDUCKID,DDUCNM,DDUCNML
 S DDUCNM=""
 F  S DDUCNM=$O(^DD("KEY","BB",DDUCFI,DDUCNM)) Q:DDUCNM=""  D
 . S DDUCKEY=0
 . F DDUCKEY=$O(^DD("KEY","BB",DDUCFI,DDUCNM,DDUCKEY)) Q:'DDUCKEY  D
 .. S DDUCKEY0=$G(^DD("KEY",DDUCKEY,0))
 .. I $D(^DD("KEY",DDUCKEY)),$P(DDUCKEY0,U,2)="" S DDUCNML(DDUCKEY,DDUCNM)=""
 .. E  I $P(DDUCKEY0,U)'=DDUCFI!($P(DDUCKEY0,U,2)'=DDUCNM) D
 ... S DDUCGL=$NA(^DD("KEY","BB",DDUCFI,DDUCNM,DDUCKEY))
 ... D WEN(DDUCGL)
 ... D:DDUCFIX KILL(DDUCGL)
 ;
 ;If any of the Keys have null Names, check whether a single name
 ;for it was found in the "BB" index.
 I $D(DDUCNML) S DDUCKEY=0 F  S DDUCKEY=$O(DDUCNML(DDUCKEY)) Q:'DDUCKEY  D
 . S DDUCNM=$O(DDUCNML(DDUCKEY,""))
 . I $O(DDUCNML(DDUCKEY,DDUCNM))="" D
 .. S DDUCKID=$$KEYID(DDUCKEY,"")
 .. D WNM
 .. D:DDUCFIX FNM
 . E  F  D  S DDUCNM=$O(DDUCNML(DDUCKEY,DDUCNM)) Q:DDUCNM=""
 .. S DDUCGL=$NA(^DD("KEY","BB",DDUCFI,DDUCNM,DDUCKEY))
 .. D WEN(DDUCGL)
 .. D:DDUCFIX KILL(DDUCGL)
 Q
 ;
CHKF ;Check "F" index (In: DDUCFI = file; DDUCFIX = flag to fix)
 N DDUCFLD,DDUCGL,DDUCKEY,DDUCIEN
 S DDUCFLD=0
 F  S DDUCFLD=$O(^DD("KEY","F",DDUCFI,DDUCFLD)) Q:'DDUCFLD  D
 . S DDUCKEY=0
 . F  S DDUCKEY=$O(^DD("KEY","F",DDUCFI,DDUCFLD,DDUCKEY)) Q:'DDUCKEY  D
 .. S DDUCIEN=0
 .. F  S DDUCIEN=$O(^DD("KEY","F",DDUCFI,DDUCFLD,DDUCKEY,DDUCIEN)) Q:'DDUCIEN  D
 ... I $P($G(^DD("KEY",DDUCKEY,2,DDUCIEN,0)),U,2)'=DDUCFI!($P($G(^(0)),U)'=DDUCFLD) D
 .... S DDUCGL=$NA(^DD("KEY","F",DDUCFI,DDUCFLD,DDUCKEY,DDUCIEN))
 .... D WEN(DDUCGL)
 .... D:DDUCFIX KILL(DDUCGL)
 Q
 ;
 ;---------------
FFILE ;Set the .01 of Key to DDUCFI
 S $P(^DD("KEY",DDUCKEY,0),U)=DDUCFI
 D WRITE("FILE (#.01) for "_DDUCKID_" set to "_DDUCFI_".",10)
 Q
 ;
FNM ;Set the NAME for the Key
 S $P(^DD("KEY",DDUCKEY,0),U,2)=DDUCNM
 D WRITE("NAME for "_DDUCKID_" set to '"_DDUCNM_"'.",10)
 Q
 ;
FPRI ;Set the PRIORITY for the Key
 S $P(^DD("KEY",DDUCKEY,0),U,3)=DDUCPRI
 D WRITE("PRIORITY for "_DDUCKID_" set to '"_DDUCPRI_"'.",10)
 Q
 ;
KILL(GL) ;Kill a global and print a message
 Q:'$D(@GL)
 K @GL
 W !?10,GL_" was killed."
 Q
 ;
SET(GL,VAL) ;Set a global and print a message
 Q:$D(@GL)
 S VAL=$G(VAL),@GL=VAL
 W !?10,GL_" was set"_$S(VAL]"":" to "_VAL,1:"")_"."
 Q
 ;
 ;Write messages
WCHK Q  ;D WRITE("Checking Keys.",5) Q
WNOKEY D WRITE(DDUCKID_" does not exist.",7) Q
WMS(S,N) D WRITE(S_" is missing."_$S($G(N):" Nothing done.",1:""),7) Q
WINC D WRITE("Field information in "_DDUCKEY_" is incomplete. Nothing done.",7) Q
WFMS D WRITE("*File #"_DDUCFIL_", Field #"_DDUCFLD_" referenced in "_DDUCKEY_" is missing.",7) Q  ;22*130
WNE D WRITE("*Fields in "_DDUCKID_" don't match fields in Uniqueness Index.",7) Q  ;22*130
WEN(GL) D WRITE("Erroneous node "_GL_" is set.",7) Q
WNM D WRITE("NAME for "_DDUCKID_" looks like it should be '"_DDUCNM_"'.",7) Q
WPRI D WRITE("PRIORITY for "_DDUCKID_" looks like it should be '"_DDUCPRI_"'.",7) Q
 ;
WRITE(TXT,TAB) ;Write text, wrap at word boundaries.
 N I
 D WRAP^DIKCU2(.TXT,-TAB-2,-TAB)
 W !?TAB,$G(TXT,$G(TXT(0))) F I=1:1 Q:'$D(TXT(I))  W !?TAB+2,TXT(I)
 Q
 ;
KEYID(KEY,NM) ;Return string that identifies a Key
 S:'$D(NM) NM=$P($G(^DD("KEY",KEY,0)),U,2)
 Q $S(NM]"":"Key '"_NM_"' (#"_KEY_")",1:"Key #"_KEY)

DDW
DDW ;SFISC/PD KELTZ-SCREEN EDITOR MAIN ROUTINE ;24MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MAIN N DX,DY,IOTM,IOBM
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 D INIT I $G(DDWERR) K DDWERR Q
 D ^DDWT1,END
 Q
 ;
EDIT(DIC,DDWFLAGS,DIWETXT,DIWESUB,DDWRW,DDWC,DDWTM,DDWBM,DDWLMAR,DDWRMAR,DDWAUTO,DDWTAB) ;DDWRW=ROW #
 N DWHD,DWLC,DDWEDIT,DDWRWSET
 S DDWEDIT=1,DDWRWSET=1 ;WE MEAN IT
 G MAIN
 ;
MSG(DDWX) ;Write message
 S DY=$G(DDWBM,IOSL)-1,DX=0 X IOXY
 W $P(DDGLCLR,DDGLDEL)_$G(DDWX)
 I $G(DDWX)="",$D(DDWMARK) D IND^DDW7(1)
 Q
 ;
INIT ;Setup, initialize variables
 N X,DDWI K DIERR
 D INIT^DDGLIB0() G:$G(DIERR) ERR
 I $P(DDGLED,DDGLDEL,2)_$P(DDGLED,DDGLDEL,3)_$P(DDGLED,DDGLDEL,4)="" D TRMERR^DDGLIB0("Set Top and Bottom Margins, Delete Line, and Insert Line") G ERR
 ;
 G:'$D(DIC) FERR
 S DDWDIC=$$CREF^DILF(DIC)
 S X="S X="_DDWDIC D ^DIM G:'$D(X) FERR
 G:'$D(@DDWDIC) FERR
 S DDWDIC=$NA(@DDWDIC)
 S DIC=$$OREF^DILF(DDWDIC)
 ;
 I IOSL>100 S DDWIOSL=IOSL,IOSL=24
 S IOTM=$G(DDWTM,1)+2,IOBM=$G(DDWBM,IOSL)-3
MAR I IOBM-IOTM<3 D BLD^DIALOG(202,$$EZBLD^DIALOG(831)) G ERR ;**'TOP & BOTTOM'
 ;
 S:'$G(DDWLMAR) DDWLMAR=1 S:'$G(DDWRMAR) DDWRMAR=74
 I DDWRMAR'>DDWLMAR!(DDWLMAR>231)!(DDWRMAR>245) D BLD^DIALOG(202,"Left and/or Right Margin") G ERR
 ;
 D:$D(DDW("IN"))[0 GETKEY^DDWK
 ;
 D CLR
 W:$P(DDGLED,DDGLDEL,2)]"" @$P(DDGLED,DDGLDEL,2)
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMON")
 ;
 K DDWL,^TMP("DDW",$J),^TMP("DDW1",$J)
 S (DDWA,DDWSTB,DDWSTAT)=0,DDWBF="0010"
 ;
 S DDWREP=$G(DDWFLAGS)["R"
 S DDWRAP=$G(DDWFLAGS)'["M"
 I 'DDWRAP D
 . S DDWLMAR(1)=DDWLMAR,DDWLMAR=1
 . S DDWRMAR(1)=DDWRMAR,DDWRMAR=245
 ;
 I '$G(DDWRW),$G(DDWRW)'="B" S DDWRW=1
 I '$G(DDWC),$G(DDWC)'="E" S DDWC=1
 ;
 S DDWTO=DTIME
 S DDWOFS="0^20^^1",$P(DDWOFS,U,3)=IOM-$P(DDWOFS,U,2)
 S DDWMR=IOBM-IOTM+1
 ;
 S:$G(DDWTAB)="" DDWTAB="+8"
 S DDWRUL=$$RULER^DDW2(DDWTAB)
 ;
 I $G(DDWAUTO) D
 . N DDWX,DDWERR
 . S (DDWAUTO,DDWX)=$E(DDWAUTO,1,15)
 . D AUTOVAL^DDW1
 . I $D(DDWERR)#2!($G(DDWAUTO)'>0) K DDWAUTO Q
 . S DDWAUTO("H")=$H
 . S DDWAUTO("S")=DDWAUTO*60
 E  K DDWAUTO
 Q
 ;
RESET ;Reset terminal and cleanup
 K DIERR D INIT^DDGLIB0() D:$G(DIERR) MSG^DIALOG("BW")
 W $P($G(DDGLVID),DDGLDEL,10)
 ;
END ;Cleanup
 S:$D(DDWIOSL)#2 IOSL=DDWIOSL
 I $P(DDGLED,DDGLDEL,2)]"" D
 . S IOTM=1,IOBM=$S($D(IOSL)#2:IOSL,1:24) W @$P(DDGLED,DDGLDEL,2)
 D CLR
 ;
 K DDW,DDWA,DDWBF,DDWC,DDWCHG,DDWCNT,DDWDIC,DDWED,DDWFIN,DDWFIND,DDWHLOG
 K DDWIOSL,DDWL,DDWMARK,DDWMR,DDWN,DDWOFS,DDWQ,DDWRAP,DDWREP
 K DDWRUL,DDWRW,DDWSTAT,DDWSTB,DDWTC,DDWTO
 K ^TMP("DDW",$J),^TMP("DDW1",$J),^TMP("DDWH",$J)
 I $$ROUEXIST^DILIBF("XPDUTL"),$$VERSION^XPDUTL("XU")>7.1
 E  K ^TMP("DDWB",$J)
 ;
 ;D:'$D(DIWE) X^DIWE
 I $D(DDS) D
 . D:$D(DIWESW) KILL^DDGLIB0("K")
 E  D KILL^DDGLIB0($G(DDWFLAGS))
 Q
 ;
CLR ;Clear screen
 I $G(DDWTM,1)=1,$G(DDWBM,IOSL)=IOSL W $P(DDGLCLR,DDGLDEL,2)
 E  D
 . S DX=0
 . F DY=$G(DDWTM,1)-1:1:$G(DDWBM,IOSL)-1 X IOXY W $P(DDGLCLR,DDGLDEL)
 Q
 ;
FERR ;File input parameter error
 D BLD^DIALOG(202,"File")
 D ERR
 Q
 ;
ERR ;Error during setup
 W $C(7),! D MSG^DIALOG("BW") W !
 D KILL^DDGLIB0()
 S DDWERR=1
 Q

DDW1
DDW1 ;SFISC/PD KELTZ-LOAD, SAVE ;06:11 PM  25 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
LOAD ;Put up "box" and load document
 N DDWI,DDWX
 D BOX
 ;
 I $D(DWLC)[0 D
 . S DWLC=$S($D(@DDWDIC@(0))#2:+$P(@DDWDIC@(0),U,4),1:$O(@DDWDIC@(""),-1))
 . S:$D(@DDWDIC@(1))#2 $E(DDWBF,4)=1
 S DDWCNT=$S(DWLC:DWLC,1:1)  ;HOW MANY LINES WE HAVE TOTAL
 ;
 D:DDWCNT>1 MSG^DDW("...")
 F DDWI=DDWCNT:-1:DDWMR+1 D  ;PUT HIDDEN LINES INTO ^TMP
 . S DDWSTB=DDWSTB+1
 . S DDWX=$S('$E(DDWBF,4):$G(@DDWDIC@(DDWI,0)),1:$G(@DDWDIC@(DDWI)))
 . D:DDWX?.E1C.E CTRL
 . S ^TMP("DDW1",$J,DDWSTB)=DDWX
 ;
 F DDWI=1:1:DDWMR D  ;start writing from line 1 (!)
 . S DDWX=$S(DDWI>DDWCNT:"",'$E(DDWBF,4):$G(@DDWDIC@(DDWI,0)),1:$G(@DDWDIC@(DDWI)))
 . D:DDWX?.E1C.E CTRL
 . S DDWL(DDWI)=DDWX
 . I DDWC'>IOM,DDWRW'>DDWMR,DDWI'>DDWCNT,DDWX'?." " D
 .. D CUP(DDWI,1) W $E(DDWX,1,IOM) ;HERE'S WHERE A LINE IS WRITTEN OUT
 ;
 I DDWCNT=1,DDWL(1)?1." " S DDWL(1)=""
 D:DDWCNT>1 MSG^DDW()
 ;
CTRLREM D:$G(DDWED) MSG^DDW($C(7)_$P(DDGLVID,DDGLDEL,6)_$$EZBLD^DIALOG(8128)_$P(DDGLVID,DDGLDEL,10)) ;**'CONTROL CHARACTERS REPLACED'
 ;
 I DDWRW="B" D
 . D BOT^DDW3
 E  D LINE^DDWG(DDWRW,DDWC)
 Q
 ;
CTRL ;Strip control characters from DDWX
 N I
 S DDWED=1
 F I=1:1:$L(DDWX) S:$E(DDWX,I)?1C $E(DDWX,I)=" "
 Q
 ;
BOX ;Draw box
 N DDWX
 ;
 I $D(DIWETXT) D
 . D CUP(-1,1)
 . W $P(DDGLVID,DDGLDEL)_$E(DIWETXT,1,IOM)_$P(DDGLVID,DDGLDEL,10)
 ;
 I $D(DIWESUB) S DDWX=DIWESUB
 E  I $D(DH)#2,$D(DIE) S DDWX=DH
 S DDWX=$E($G(DDWX),1,30)
 ;
 D CUP(0,1) W $TR($J("",IOM)," ","=")
 I DDWRAP S DX=2 X IOXY W "[ WRAP ]"
 S DX=12 X IOXY W "["_$$UP^DILIBF($P($$EZBLD^DIALOG(7002),U,$S(DDWREP:2,1:1)))_"]" ;**INSERT/REPLACE
 S DX=40-($L(DDWX)\2) X IOXY W "< "_$E(DDWX,1,30)_" >"
 N DDWH S DDWH="["_$$EZBLD^DIALOG(8074)_"]",DX=76-$L(DDWH) X IOXY W DDWH ;**
 ;
 D CUP(DDWMR+1,1) W $E(DDWRUL,1,IOM)
 I DDWLMAR-DDWOFS'<1,DDWLMAR-DDWOFS'>IOM D
 . S DX=DDWLMAR-DDWOFS-1 X IOXY W "<"
 I DDWRMAR-DDWOFS'<1,DDWRMAR-DDWOFS'>IOM D
 . S DX=DDWRMAR-DDWOFS-1 X IOXY W ">"
 Q
 ;
AUTOTM ;Prompt for autosave time
 N DDWHLP,DDWANS,DDWCOD
 S DDWHLP(1)="  Enter the interval in MINUTES you wish to have the Screen Editor"
 S DDWHLP(2)="  automatically save the text. Enter a number between 0 and 120."
 S DDWHLP(3)="  A value of 0 means text is NOT automatically saved."
 D ASK^DDWG(5,"Interval in MINUTES to automatically save text: ",15,+$G(DDWAUTO),"D AUTOVAL^DDW1",.DDWHLP,.DDWANS,.DDWCOD)
 ;
 Q:DDWCOD="TO"!(DDWANS=U)
 I $G(DDWANS) D
 . S DDWAUTO=DDWANS
 . S DDWAUTO("H")=$H
 . S DDWAUTO("S")=DDWAUTO*60
 E  K DDWAUTO
 Q
 ;
AUTOVAL ;Validate autosave time
 K DDWERR
 I DDWX?."^"!($P($G(DDWCOD),U)="TO") S DDWX=U Q
 I $L(DDWX)>15 D
 . S DDWERR="  Response must not be more than 15 characters in length."
 I DDWX'=+$P(DDWX,"E") D
 . S DDWERR="  Response must be numeric."
 I DDWX>120!(DDWX<0) D
 . S DDWERR="  Response must be between 0 and 120."
 Q
 ;
AUTOSV ;Autosave
 I $D(DDWED) K DDWED D SV
 S DDWAUTO("H")=$H
 Q
 ;
SV ;Called from DDWT1 and AUTOSV
 D SAVE
 S:DDWCNT<1 DDWCNT=1
 I DDWRW+DDWA>DDWCNT D
 . D POS(DDWCNT-DDWA,"E","RN")
 E  D POS(DDWRW,DDWC)
 Q
 ;
SAVE ;Save document
 N DDWI,DDWLMEM,DDWLSTB,DDWX
 D MSG^DDW($$EZBLD^DIALOG(8075.5)) H .5 ;**'SAVING CHANGES'
 S DDWCNT=0
 K @DDWDIC
 ;
 F DDWI=1:1:DDWA D
 . S DDWCNT=DDWCNT+1,DDWX=$$NTS(^TMP("DDW",$J,DDWI))
 . I '$E(DDWBF,4) S @DDWDIC@(DDWCNT,0)=DDWX
 . E  S @DDWDIC@(DDWCNT)=DDWX
 ;
 S DDWLMEM=999
 F DDWI=1:1:DDWSTB+1 Q:DDWI>DDWSTB  Q:^TMP("DDW1",$J,DDWI)'?." "
 I DDWI'>DDWSTB S DDWLSTB=DDWI
 E  D
 . F DDWI=DDWMR:-1:0 Q:'DDWI  Q:DDWL(DDWI)'?." "
 . S DDWLMEM=DDWI
 ;
 F DDWI=1:1:$$MIN(DDWLMEM,DDWMR) D
 . S DDWCNT=DDWCNT+1,DDWX=$$NTS(DDWL(DDWI))
 . I '$E(DDWBF,4) S @DDWDIC@(DDWCNT,0)=DDWX
 . E  S @DDWDIC@(DDWCNT)=DDWX
 ;
 I $D(DDWLSTB) F DDWI=DDWSTB:-1:DDWLSTB D
 . S DDWCNT=DDWCNT+1,DDWX=$$NTS(^TMP("DDW1",$J,DDWI))
 . I '$E(DDWBF,4) S @DDWDIC@(DDWCNT,0)=DDWX
 . E  S @DDWDIC@(DDWCNT)=DDWX
 ;
 S DWLC=DDWCNT,DWHD=U
 I DDWCNT,'$E(DDWBF,4) S @DDWDIC@(0)=U_U_DWLC_U_DWLC_U_DT_U
 D MSG^DDW()
 Q
 ;
QUIT ;If any edits were made, issue confirmation prompt.
 S DDWFIN=""
 Q:$G(DDWFLAGS)["Q"!'$D(DDWED)
 ;
 N DDWHLP,DDWANS,DDWCOD
 S DDWHLP(1)="  Enter 'Yes' to save changes and quit."
 S DDWHLP(2)="  Enter 'No' to discard changes and quit."
 S DDWHLP(3)="  Enter '^' to return to the editor without saving or quitting."
 ;
 D ASK^DDWG(5,$$EZBLD^DIALOG(8075.1),3,"","D QUITVAL^DDW1",.DDWHLP,.DDWANS,.DDWCOD) ;**'DO YOU WANT TO SAVE CHANGES? '
 ;
 I DDWCOD="TO"!(DDWANS=U) K DDWFIN
 E  I DDWANS="Y" D SAVE K DUOUT ;GFT
 Q
 ;
QUITVAL ;Validate responses to the confirmation prompt
 K DDWERR
 I DDWX[U!($P(DDWCOD,U)="TO") S DDWX=U Q
 I DDWX="" S DDWERR=$$EZBLD^DIALOG(8041) Q  ;**'REQUIRED'
 ;
 S:DDWX?.E1L.E DDWX=$$UP^DILIBF(DDWX) ;**
 ;
 I $P("YES",DDWX)]"",$P("NO",DDWX)]"" D  Q
 . S DDWERR=$$EZBLD^DIALOG(1401) ;**'NOT VALID'
 ;
 S DDWX=$E(DDWX)
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
CUP(Y,X) ;Cursor positioning
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
MIN(X,Y) ;Return the minimum of X and Y
 Q $S(X<Y:X,1:Y)
 ;
NTS(X) ;Change "" to " "
 Q $S(X="":" ",1:X)
 ;
TR(X,F) ;Strip trailing blanks
 ;If F["B" return " " if X=""
 I $G(X)]"" D
 . N I
 . F I=$L(X):-1:0 Q:$E(X,I)'=" "
 . S X=$E(X,1,I)
 I X="",$G(F)["B" S X=" "
 Q X

DDW2
DDW2 ;SFISC/MKO-SETTINGS, MODES ;07:22 PM  5 Dec 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
TSET N DDWX
 S DDWX=$E(DDWRUL,DDWC)
 S DDWX=$S(DDWX="T":"=",DDWX="=":"T",1:DDWX)
 S $E(DDWRUL,DDWC)=DDWX
 I DDWC'=DDWLMAR,DDWC'=DDWRMAR D
 . D CUP(DDWMR+1,DDWC-DDWOFS) W DDWX
 . D POS(DDWRW,DDWC)
 Q
 ;
TSALL ;Prompt for tab stops
 N DDWHLP,DDWANS,DDWCOD
 D BLD^DIALOG(8136,,,"DDWHLP")
 D ASK^DDWG(5,$$EZBLD^DIALOG(8136.1)_" ",30,$G(DDWTAB),"D TSALLVAL^DDW2",.DDWHLP,.DDWANS,.DDWCOD)
 ;
 Q:DDWCOD="TO"!(DDWANS=U)!(DDWANS=DDWTAB)
 S DDWTAB=DDWANS
 S DDWRUL=$$RULER(DDWTAB)
 D RULER^DDW3,POS(DDWRW,DDWC)
 Q
 ;
TSALLVAL ;Validate tab stops
 K DDWERR
 S:DDWX="@" DDWX=""
 I DDWX?1."^"!($P($G(DDWCOD),U)="TO") S DDWX=U Q
 I $TR(DDWX,"+,")?.E1.APC.E D
 . S DDWERR=$$EZBLD^DIALOG(8136.2) ;**TAB response rule
 Q
 ;
RULER(TAB) ;Return the ruler with tab stops
 N C,INT,LAST,POS,RUL
 S RUL=$TR($J("",255)," ","=")
 ;
 ;Process each comma piece in tab
 S LAST=1
 F C=1:1:$L(TAB,",") D
 . S POS=$P(TAB,",",C) Q:POS'?.1"+"1.3N
 . I $E(POS)="+" D
 .. S INT=+$E(POS,2,999)
 .. F POS=LAST+INT:INT:255 S $E(RUL,POS)="T"
 . E  S:POS<256 $E(RUL,POS)="T",LAST=POS
 Q RUL
 ;
LSET I 'DDWRAP D ERR($$EZBLD^DIALOG(8138.1)) Q
 I DDWC>231 D ERR($$EZBLD^DIALOG(8138.2)) Q
 I DDWC'<DDWRMAR D ERR($$EZBLD^DIALOG(8138.3)) Q
 I DDWLMAR-DDWOFS'<1,DDWLMAR-DDWOFS'>IOM D
 . D CUP(DDWMR+1,DDWLMAR-DDWOFS) W $E(DDWRUL,DDWLMAR)
 D CUP(DDWMR+1,DDWC-DDWOFS) W "<" D POS(DDWRW,DDWC)
 S DDWLMAR=DDWC
 Q
 ;
RSET I 'DDWRAP D ERR($$EZBLD^DIALOG(8138.1)) Q
 I DDWC>245 D ERR($$EZBLD^DIALOG(8138.4)) Q
 I DDWC'>DDWLMAR D ERR($$EZBLD^DIALOG(8138.5)) Q
 I DDWRMAR-DDWOFS'<1,DDWRMAR-DDWOFS'>IOM D
 . D CUP(DDWMR+1,DDWRMAR-DDWOFS) W $E(DDWRUL,DDWRMAR)
 D CUP(DDWMR+1,DDWC-DDWOFS) W ">" D POS(DDWRW,DDWC)
 S DDWRMAR=DDWC
 Q
 ;
WRAPM S DDWRAP=DDWRAP+1#2
 D CUP(0,3) W $S(DDWRAP:"[ WRAP ]",1:"========")
 I 'DDWRAP D
 . S DDWLMAR(1)=DDWLMAR,DDWLMAR=1
 . S DDWRMAR(1)=DDWRMAR,DDWRMAR=245
 E  D
 . S DDWLMAR=DDWLMAR(1) K DDWLMAR(1)
 . S DDWRMAR=DDWRMAR(1) K DDWRMAR(1)
 D RULER^DDW3,POS(DDWRW,DDWC)
 Q
 ;
REPLM S DDWREP=DDWREP+1#2
 D CUP(0,13) W "[",$$UP^DILIBF($P($$EZBLD^DIALOG(7002),U,$S(DDWREP:2,1:1))),"]" ;**
 D POS(DDWRW,DDWC)
 Q
 ;
STAT S DDWSTAT=DDWSTAT+1#2
 I DDWSTAT S DDWTO=1
 E  D
 . D CUP(DDWMR+2,1)
 . W $P(DDGLCLR,DDGLDEL) D POS(DDWRW,DDWC)
 . S DDWTO=DTIME
 . K DDWTC
 Q
 ;
CUP(Y,X) ;Cursor positioning
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
SCR(C) ;Return screen number
 Q C-$P(DDWOFS,U,2)-1\$P(DDWOFS,U,3)+1
 ;
ERR(DDWX) ;Error
 W $C(7)
 D MSG^DDW(DDWX) H 2 D MSG^DDW()
 F  R *DDWX:0 E  Q
 D POS(DDWRW,DDWC)
 Q

DDW3
DDW3 ;SFISC/MKO-TOP, BOTTOM, SCROLL ;11:57 AM  24 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
TOP N DDWI
 I DDWA=0 D POS(1,1,"RN") Q
 D SHFTUP(1),POS(1,1,"RN")
 Q
 ;
SHFTUP(DDWFL) ;
 N DDWSH,DDWI
 S DDWSH=DDWA+1-DDWFL
 D:DDWSH>DDWMR MSG^DDW(" ...") ;**
 ;
 F DDWI=DDWMR:-1:$$MAX(1,DDWMR-DDWSH+1) D:DDWI+DDWA'>DDWCNT
 . S DDWSTB=DDWSTB+1,^TMP("DDW1",$J,DDWSTB)=DDWL(DDWI)
 . S ^TMP("DDW",$J,DDWA+DDWI)=DDWL(DDWI)
 ;
 I $E(DDWBF,2) F DDWI=DDWA:-1:DDWFL+DDWMR D
 . S DDWSTB=DDWSTB+1
 . S ^TMP("DDW1",$J,DDWSTB)=^TMP("DDW",$J,DDWI)
 E  S DDWSTB=$$MAX(DDWCNT-DDWFL+1-DDWMR,0)
 ;
 S DDWA=DDWFL-1
 I DDWSH>DDWMR D
 . F DDWI=1:1:DDWMR S DDWL(DDWI)=^TMP("DDW",$J,DDWFL+DDWI-1)
 . I $P(DDWOFS,U,4)=1 D
 .. D CUP(1,1)
 .. F DDWI=1:1:DDWMR W $P(DDGLCLR,DDGLDEL)_$$LINE(DDWI,$G(DDWMARK))_$S(DDWI<DDWMR:$C(13,10),1:"")
 . D MSG^DDW()
 E  D
 . F DDWI=DDWMR:-1:DDWSH+1 S DDWL(DDWI)=DDWL(DDWI-DDWSH)
 . F DDWI=DDWSH:-1:1 S DDWL(DDWI)=^TMP("DDW",$J,DDWFL+DDWI-1)
 . D:$P(DDWOFS,U,4)=1 SCRDN(DDWSH)
 ;
 S:'DDWA $E(DDWBF,2)=0
 Q
 ;
BOT N DDWI
 I DDWSTB=0 D POS($$MIN(DDWMR,DDWCNT-DDWA),"E","RN") Q
 D SHFTDN($$MAX(1,DDWCNT-DDWMR+1))
 D POS(DDWMR,"E","RN")
 Q
 ;
SHFTDN(DDWFL,DDWCOL) ;
 N DDWNSTB,DDWSH,DDWI
 S DDWSH=DDWFL-DDWA-1,DDWNSTB=DDWCNT-DDWFL+1
 D:DDWSH>DDWMR MSG^DDW(" ...") ;**
 ;
 F DDWI=1:1:$$MIN(DDWSH,DDWMR) D
 . S DDWA=DDWA+1,^TMP("DDW",$J,DDWA)=DDWL(DDWI)
 . S ^TMP("DDW1",$J,DDWSTB+DDWMR-DDWI+1)=DDWL(DDWI)
 .
 ;
 I $E(DDWBF,3) F DDWI=DDWSTB:-1:DDWNSTB+1 D
 . S DDWA=DDWA+1
 . S ^TMP("DDW",$J,DDWA)=^TMP("DDW1",$J,DDWI)
 E  S DDWA=DDWFL-1
 ;
 I DDWSH>DDWMR D
 . F DDWI=1:1:DDWMR S DDWL(DDWI)=$S(DDWNSTB-DDWI+1>0:^TMP("DDW1",$J,DDWNSTB-DDWI+1),1:"")
 . I $P(DDWOFS,U,4)=$$SCR($S($D(DDWCOL):DDWCOL,1:$L(DDWL(DDWMR))+1)) D
 .. D CUP(1,1)
 .. F DDWI=1:1:DDWMR W $P(DDGLCLR,DDGLDEL)_$$LINE(DDWI,$G(DDWMARK))_$S(DDWI<DDWMR:$C(13,10),1:"")
 . D MSG^DDW()
 E  D
 . F DDWI=1:1:DDWMR-DDWSH S DDWL(DDWI)=DDWL(DDWI+DDWSH)
 . F DDWI=DDWMR-DDWSH+1:1:DDWMR S DDWL(DDWI)=$S(DDWNSTB-DDWI+1>0:^TMP("DDW1",$J,DDWNSTB-DDWI+1),1:"")
 . D:$P(DDWOFS,U,4)=$$SCR($L(DDWL(DDWMR))+1) SCRUP(DDWSH)
 ;
 S DDWSTB=$$MAX(0,DDWNSTB-DDWMR)
 S:'DDWSTB $E(DDWBF,3)=0
 Q
 ;
MVFWD(DDWNUM) ;
 N DDWI
 F DDWI=1:1:DDWNUM D
 . S DDWA=DDWA+1,^TMP("DDW",$J,DDWA)=DDWL(DDWI)
 . S ^TMP("DDW1",$J,DDWSTB+DDWMR-DDWI+1)=DDWL(DDWI)
 F DDWI=1:1:DDWMR-DDWNUM S DDWL(DDWI)=DDWL(DDWI+DDWNUM)
 F DDWI=DDWMR-DDWNUM+1:1:DDWMR D
 . S DDWL(DDWI)=^TMP("DDW1",$J,DDWSTB),DDWSTB=DDWSTB-1
 D SCRUP(DDWNUM)
 Q
 ;
SCRUP(DDWNUM) ;
 N DDWI
 D CUP(DDWMR,1)
 F DDWI=DDWMR-DDWNUM+1:1:DDWMR D
 . I $P(DDGLED,DDGLDEL,2)]"" W $C(10)
 . E  D
 .. D CUP(1,1) W $P(DDGLED,DDGLDEL,4)
 .. D CUP(DDWMR,1) W $P(DDGLED,DDGLDEL,3)
 . I DDWL(DDWI)'?." " D
 .. D CUP(DDWMR,1)
 .. W $$LINE(DDWI,$G(DDWMARK))
 D POS(DDWMR,DDWC,"RN")
 Q
 ;
MVBCK(DDWNUM) ;
 N DDWI
 F DDWI=DDWMR:-1:DDWMR-DDWNUM+1 D:DDWI+DDWA'>DDWCNT
 . S DDWSTB=DDWSTB+1,^TMP("DDW1",$J,DDWSTB)=DDWL(DDWI)
 . S ^TMP("DDW",$J,DDWA+DDWI)=DDWL(DDWI)
 F DDWI=DDWMR:-1:DDWNUM+1 S DDWL(DDWI)=DDWL(DDWI-DDWNUM)
 F DDWI=DDWNUM:-1:1 S DDWL(DDWI)=^TMP("DDW",$J,DDWA),DDWA=DDWA-1
 D SCRDN(DDWNUM)
 Q
 ;
SCRDN(DDWNUM) ;
 N DDWI
 D CUP(1,1)
 F DDWI=DDWNUM:-1:1 D
 . I $P(DDGLED,DDGLDEL,2)]"" W $P(DDGLED,DDGLDEL)
 . E  D
 .. D CUP(DDWMR,1) W $P(DDGLED,DDGLDEL,4)
 .. D CUP(1,1) W $P(DDGLED,DDGLDEL,3)
 . I DDWL(DDWI)'?." " D
 .. D CUP(1,1)
 .. W $$LINE(DDWI,$G(DDWMARK))
 D POS(1,DDWC,"RN")
 Q
 ;
ERR ;
 W $C(7)
 Q
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
SHIFT(C,DDWOFS) ;
 N DDWI,N,M,S
 S N=$P(DDWOFS,U,2),M=$P(DDWOFS,U,3)
 S S=$$SCR(C)
 S DDWOFS=S-1*M_U_N_U_M_U_S
 D RULER
 F DDWI=1:1:$$MIN(DDWMR,DDWCNT) D
 . S DY=IOTM+DDWI-2,DX=0 X IOXY
 . W $P(DDGLCLR,DDGLDEL)_$$LINE(DDWI,$G(DDWMARK))
 Q
 ;
RULER ;Write ruler
 D CUP(DDWMR+1,1)
 W $P(DDGLCLR,DDGLDEL)_$E(DDWRUL,1+DDWOFS,IOM+DDWOFS)
 I DDWLMAR-DDWOFS'<1,DDWLMAR-DDWOFS'>IOM D
 . D CUP(DDWMR+1,DDWLMAR-DDWOFS) W "<"
 I DDWRMAR-DDWOFS'<1,DDWRMAR-DDWOFS'>IOM D
 . D CUP(DDWMR+1,DDWRMAR-DDWOFS) W ">"
 Q
 ;
LINE(DDWI,DDWMARK) ;
 N DDWX
 S DDWX=$E(DDWL(DDWI),1+DDWOFS,IOM+DDWOFS)
 Q:$G(DDWMARK)="" DDWX
 ;
 N DDWR1,DDWC1,DDWR2,DDWC2
 S DDWR1=$P(DDWMARK,U,1),DDWC1=$P(DDWMARK,U,2)
 S DDWR2=$P(DDWMARK,U,3),DDWC2=$P(DDWMARK,U,4)
 ;
 I DDWI'<(DDWR1-DDWA),DDWI'>(DDWR2-DDWA) D
 . N DDWX1,DDWX2
 . S DDWX1=$S(DDWI=(DDWR1-DDWA):DDWC1,1:1)
 . S DDWX2=$S(DDWI=(DDWR2-DDWA):DDWC2,1:999)
 . S DDWX=$E(DDWL(DDWI),1+DDWOFS,DDWX1-1)_$P(DDGLVID,DDGLDEL,6)_$E(DDWL(DDWI),$$MAX(DDWX1,1+DDWOFS),$$MIN(DDWX2,IOM+DDWOFS))_$P(DDGLVID,DDGLDEL,10)_$E(DDWL(DDWI),$$MAX(DDWX2+1,1+DDWOFS),IOM+DDWOFS)
 Q DDWX
 ;
SCR(C) ;
 Q C-$P(DDWOFS,U,2)-1\$P(DDWOFS,U,3)+1
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDW4
DDW4 ;SFISC/PD KELTZ-OTHER NAVIGATION, DEL ;2:54 PM  23 Aug 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
TAB N DDWX
 S DDWX=$F(DDWRUL,"T",DDWC+1) G:'DDWX ERR
 D POS(DDWRW,DDWX-1,"R")
 Q
 ;
DEOL S (DDWN,DDWL(DDWRW))=$E(DDWN,1,DDWC-1)
 W $P(DDGLCLR,DDGLDEL)
 Q
 ;
DELW N DDWI,DDWW
 I $D(DDWMARK),DDWRW+DDWA'>$P(DDWMARK,U,3) D UNMARK^DDW7
 I DDWC>$L(DDWN) D  Q
 . I DDWN?." " D
 .. D XLINE^DDW5()
 . E  D
 .. N DDWY,DDWX
 .. S DDWY=DDWRW+DDWA,DDWX=DDWC
 .. D JOIN^DDW6
 .. D POS(DDWY-DDWA,DDWX,"RN")
 ;
 S DDWI=$$WRPOS(DDWN)
 S DDWW=$E(DDWN,DDWC,DDWI-1)
 S $E(DDWN,DDWC,DDWI-1)="",DDWL(DDWRW)=DDWN
 I $P(DDGLED,DDGLDEL,6)]"" D
 . F DDWI=1:1:$L(DDWW) W $P(DDGLED,DDGLDEL,6)
 . S DDWI=$E(DDWN,IOM-$L(DDWW)+1+DDWOFS,IOM+DDWOFS)
 . I DDWI]"" D CUP(DDWRW,IOM-$L(DDWW)+1) W DDWI D CUP(DDWRW,DDWC-DDWOFS)
 E  D
 . W $E(DDWN_$J("",$L(DDWW)),DDWC,IOM+DDWOFS)
 . D CUP(DDWRW,DDWC-DDWOFS)
 Q
 ;
WORDR N DDWI
 S DDWI=$$WRPOS(DDWN)
 D POS(DDWRW,DDWI,"R")
 Q
 ;
WRPOS(DDWT) ;
 N DDWP,DDWS
 S DDWT=$$PUNC(DDWT)
 S DDWS=$F(DDWT," ",DDWC+1),DDWP=$F(DDWT,"!",DDWC+1)
 S:'DDWS DDWS=999 S:'DDWP DDWP=999
 ;
 I DDWC>$L(DDWT) D
 . I DDWRW+DDWA'<DDWCNT S DDWI=$L(DDWT)+1
 . E  D DN^DDWT1 S DDWI=1
 E  I DDWS=999,DDWP=999 D
 . S DDWI=$L(DDWT)+1
 E  I $E(DDWT,DDWC)="!" D
 . F DDWI=DDWC+1:1 Q:$E(DDWT,DDWI)'="!"
 . F DDWI=DDWI:1 Q:$E(DDWT,DDWI)'=" "
 E  I DDWS<DDWP D
 . F DDWI=DDWS:1 Q:$E(DDWT,DDWI)'=" "
 E  S DDWI=DDWP-1
 Q DDWI
 ;
WORDL N DDWD,DDWI,DDWT
 S DDWT=$$PUNC(DDWN)
 ;
 I DDWC=1 D
 . I DDWRW=1,'DDWA S DDWI=1
 . E  D UP^DDWT1 S DDWI=$L(DDWN)+1
 E  D
 . S DDWI=DDWC-1
 . S:$E(DDWT,DDWI)="" DDWI=$L(DDWT)
 . I $E(DDWT,DDWI)=" " F DDWI=DDWI-1:-1:0 Q:$E(DDWT,DDWI)'=" "
 . I $E(DDWT,DDWI)="!" D
 .. F DDWI=DDWI-1:-1:0 Q:$E(DDWT,DDWI)'="!"
 . E  I DDWI D
 .. F DDWI=DDWI-1:-1:0 Q:" !"[$E(DDWT,DDWI)
 . S DDWI=DDWI+1
 D POS(DDWRW,DDWI,"R")
 Q
 ;
PGDN N DDWX
 I DDWRW<DDWMR D
 . D POS($$MIN(DDWCNT-DDWA,DDWMR),DDWC,"RN")
 E  D
 . S DDWX=$$MIN(DDWSTB,DDWMR)
 . D:DDWX MVFWD^DDW3(DDWX)
 Q
 ;
PGUP N DDWX
 I DDWRW>1 D
 . D POS(1,DDWC,"RN")
 E  D
 . S DDWX=$$MIN(DDWA,DDWMR)
 . D:DDWX MVBCK^DDW3(DDWX)
 Q
 ;
JLEFT I DDWC=1,'DDWOFS Q
 N DDWX
 I DDWN?." " S DDWX=1
 E  F DDWX=1:1:$L(DDWN) Q:$E(DDWN,DDWX)'=" "
 I DDWC-DDWOFS=1,DDWC>1 D POS(DDWRW,DDWC-1,"R") Q:DDWC=DDWX
 S DDWC=$$MAX($S($$SCR(DDWX)=$$SCR(DDWC)&(DDWC'=DDWX):DDWX,1:0),1+DDWOFS)
 D POS(DDWRW,DDWC,"R")
 Q
JRIGHT N DDWX
 S DDWX=$L(DDWN)+1
 I DDWC-DDWOFS=IOM,DDWC<246 D POS(DDWRW,DDWC+1,"R") Q:DDWC=DDWX
 S DDWC=$$MIN($S($$SCR(DDWX)=$$SCR(DDWC)&(DDWC'=DDWX):DDWX,1:999),$$MIN(IOM+DDWOFS,246))
 D POS(DDWRW,DDWC,"R")
 Q
 ;
LBEG N DDWX
 I DDWN?." " D POS(DDWRW,1,"R") Q
 I $E(DDWN,1,DDWC-1)?." ",$E(DDWN,DDWC)'=" " D POS(DDWRW,1,"R") Q
 F DDWX=1:1:$L(DDWN) Q:$E(DDWN,DDWX)'=" "
 D POS(DDWRW,DDWX,"R")
 Q
LEND D POS(DDWRW,"E","R")
 Q
 ;
ERR ;Beep
 W $C(7)
 Q
 ;
CUP(Y,X) ;Cursor positioning
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
SCR(C) ;Screen #
 Q C-$P(DDWOFS,U,2)-1\$P(DDWOFS,U,3)+1
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)
PUNC(X) ;
 Q $TR(X,"`~!@#$%^&*()-_=+\|[{]};:'"",<.>/?",$TR($J("",32)," ","!"))

DDW5
DDW5 ;SFISC/PD KELTZ-WRAP, BREAK, ILINE, XLINE ;01:23 PM  21 Dec 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
WRAP ;Wrap at word boundary
 S:$E(DDWN,DDWC,999)?1." " (DDWN,DDWL(DDWRW))=$E(DDWN,1,DDWC-1)
 I DDWC'>$L(DDWN) D WRAPI Q
 I 'DDWRAP D POS(DDWRW,DDWRMAR+1,"R"),BREAK(1) Q
 D WRAPW
 Q
 ;
WRAPI ;Cursor in middle
 I $E(DDWN,DDWLMAR,999)'[" "!'DDWRAP D BREAK(-1),POS(DDWRW-1,"E","RN") Q
 N DDWCSV,DDWI,DDWLST,DDWRMSV
 S DDWI=$F(DDWN," ",DDWC)
 I DDWI,DDWI-2'>DDWRMAR D
 . S DDWCSV=DDWC
 . S (DDWN,DDWL(DDWRW))=$$TR(DDWN)
 . D POS(DDWRW,DDWI,"R"),BREAK(-1),POS(DDWRW-1,DDWCSV,"RN")
 . S (DDWN,DDWL(DDWRW))=$$TR(DDWN)
 E  I DDWC=2 D
 . D POS(DDWRW,DDWRMAR+1,"R"),BREAK(-1),POS(DDWRW-1,2,"RN")
 E  D
 . S DDWLST=$$TR($E(DDWN,DDWC,999))
 . S (DDWL(DDWRW),DDWN)=$E(DDWN,1,DDWC-1)
 . S DDWRMSV=DDWRMAR,DDWRMAR=$$MIN(DDWRMAR,DDWC-2)
 . D WRAPW
 . W $E(DDWLST,1,IOM+DDWOFS-DDWC)
 . S DDWL(DDWRW)=DDWN_DDWLST,DDWRMAR=DDWRMSV
 . D POS(DDWRW,DDWC,"RN")
 Q
 ;
WRAPW ;Cursor at end
 N DDWI,DDWS1,DDWS2,DDWTXT
 S DDWTXT(1)=DDWN
 D ADJMAR^DDW6(.DDWTXT,"","I")
 ;
 S DDWS1=$$SCR($L(DDWTXT(1))+1),DDWS2=$$SCR($L(DDWTXT(DDWTXT))+1)
 I DDWS1=$P(DDWOFS,U,4),DDWS2=$P(DDWOFS,U,4),DDWTXT=2 D
 . S (DDWN,DDWL(DDWRW))=DDWTXT(1)_DDWTXT(2)
 . S DDWC=$L(DDWTXT(1))+1
 . D POS(DDWRW,DDWC),BREAK(1)
 ;
 E  D
 . F DDWI=1:1:DDWTXT-1 D
 .. S (DDWN,DDWL(DDWRW))=DDWTXT(DDWI)
 .. D ILINE
 .. S (DDWN,DDWL(DDWRW))=DDWTXT(DDWI+1)
 .. I DDWS2=$P(DDWOFS,U,4) D
 ... D CUP(DDWRW-1,1)
 ... W $P(DDGLCLR,DDGLDEL)_$E(DDWTXT(DDWI),1+DDWOFS,IOM+DDWOFS)
 ... D CUP(DDWRW,1) W $E(DDWN,1+DDWOFS,IOM+DDWOFS)
 . D POS(DDWRW,"E","R")
 Q
 ;
BREAK(DDWFLAG) ;Break line, make new line current
 ;Final cursor position:
 ; 0:lmar of new line (used by <RET>)
 ; 1:end of new line (used by Wrap)
 ;-1:doesn't matter (used by Wrap)
 N DDWRST
 I $D(DDWMARK),DDWRW+DDWA'>$P(DDWMARK,U,3) D UNMARK^DDW7
 S DDWRST=$E(DDWN,DDWC,999)
 I DDWLMAR>1,DDWRST'?@(DDWLMAR-1_""" "".E") D
 . S DDWRST=$J("",DDWLMAR-1)_$$LD(DDWRST)
 S (DDWN,DDWL(DDWRW))=$E(DDWN,1,DDWC-1)
 W $P(DDGLCLR,DDGLDEL)
 D ILINE
 S (DDWN,DDWL(DDWRW))=DDWRST
 ;
 I $G(DDWFLAG)=1 D
 . I $$SCR($L(DDWN)+1)=$P(DDWOFS,U,4) D
 .. D CUP(DDWRW,1) W $E(DDWN,1+DDWOFS,IOM+DDWOFS)
 . D POS(DDWRW,"E","R")
 ;
 E  I '$G(DDWFLAG) D
 . I $P(DDWOFS,U,4)=1 D CUP(DDWRW,1) W $E(DDWN,1,IOM)
 . D POS(DDWRW,DDWLMAR,"R")
 ;
 E  D CUP(DDWRW,1) W $E(DDWN,1+DDWOFS,IOM+DDWOFS)
 Q
 ;
ILINE ;Insert line below current line, make that current
 ;Column is unchanged
 N DDWI,DDWX
 I DDWRW<DDWMR D
 . I DDWA+DDWMR'>DDWCNT D
 .. S DDWSTB=DDWSTB+1,^TMP("DDW1",$J,DDWSTB)=DDWL(DDWMR)
 . F DDWI=DDWMR:-1:DDWRW+2 S DDWL(DDWI)=DDWL(DDWI-1)
 . S DDWL(DDWRW+1)=""
 . D CUP(DDWRW+1,1)
 . ;
 . I $P(DDGLED,DDGLDEL,3)]"" D
 .. I $P(DDGLED,DDGLDEL,2)="" D
 ... D CUP(DDWMR,1) W $P(DDGLED,DDGLDEL,4) D CUP(DDWRW+1,1)
 .. W $P(DDGLED,DDGLDEL,3)
 . E  D
 .. S DDWX=IOTM
 .. S IOTM=IOTM+DDWRW W @$P(DDGLED,DDGLDEL,2) S IOTM=DDWX
 .. D CUP(DDWRW+1,1) W $P(DDGLED,DDGLDEL)
 .. W @$P(DDGLED,DDGLDEL,2)
 . D POS(DDWRW+1,DDWC,"RN")
 ;
 E  D
 . S DDWA=DDWA+1,^TMP("DDW",$J,DDWA)=DDWL(1)
 . F DDWI=1:1:DDWMR-1 S DDWL(DDWI)=DDWL(DDWI+1)
 . S DDWL(DDWMR)=""
 . D SCRUP^DDW3(1)
 S DDWCNT=DDWCNT+1
 S $E(DDWBF,1,3)=111
 Q
 ;
XLINE(DDWFLAG,DDWNP) ;Delete current line
 ;DDWFLAG:
 ; 1:leave cursor on deleted line (used by Join)
 ; 0:move cursor up one line if deleted line is last line
 ;   (used by PF1-D and DELBLK)
 ; DDWNP = 1:don't bother printing, used by DELBLK
 N DDWI,DDWX
 I $D(DDWMARK),DDWRW+DDWA'>$P(DDWMARK,U,3) D UNMARK^DDW7
 F DDWI=DDWRW:1:DDWMR-1 S DDWL(DDWI)=DDWL(DDWI+1)
 S DDWX="" S:DDWSTB DDWX=^TMP("DDW1",$J,DDWSTB),DDWSTB=DDWSTB-1
 S DDWL(DDWMR)=DDWX
 ;
 D:'$G(DDWNP) XLINEP
 ;
 S DDWCNT=DDWCNT-1
 I 'DDWCNT D
 . S DDWCNT=1 D POS(1,DDWLMAR,"RN")
 E  I DDWA+DDWRW>DDWCNT,'$G(DDWFLAG) D
 . D UP^DDWT1
 E  D POS(DDWRW,DDWC,"N")
 S $E(DDWBF,1,3)=111
 Q
 ;
XLINEP ;Redisplay screen
 I $P(DDGLED,DDGLDEL,4)]"" D
 . W $P(DDGLED,DDGLDEL,4)
 . I $P(DDGLED,DDGLDEL,2)="" D CUP(DDWMR,1) W $P(DDGLED,DDGLDEL,3)
 E  I DDWRW<DDWMR D
 . S DDWX=IOTM
 . S IOTM=IOTM+DDWRW-1 W @$P(DDGLED,DDGLDEL,2) S IOTM=DDWX
 . D CUP(DDWMR,1) W $C(10)
 . W @$P(DDGLED,DDGLDEL,2)
 E  D
 . D CUP(DDWMR,1) W $P(DDGLCLR,DDGLDEL)
 ;
 I DDWL(DDWMR)'?." " D
 . D CUP(DDWMR,1)
 . W $E(DDWL(DDWMR),1+DDWOFS,IOM+DDWOFS)
 Q
 ;
TR(X) Q:$G(X)="" X
 N I
 F I=$L(X):-1:0 Q:$E(X,I)'=" "
 Q $E(X,1,I)
 ;
LD(X) Q:$G(X)="" X
 N I
 F I=1:1:$L(X)+1 Q:$E(X,I)'=" "
 Q $E(X,I,999)
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
SCR(C) ;
 Q C-$P(DDWOFS,U,2)-1\$P(DDWOFS,U,3)+1
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)

DDW6
DDW6 ;SFISC/MKO-JOIN ;10:41 AM  16 Jun 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
REFMT ;Reformat
 N DDWRFMT
 I $D(DDWMARK),DDWRW+DDWA'>$P(DDWMARK,U,3) D UNMARK^DDW7
 D POS(DDWRW,DDWLMAR,"R")
 S DDWRFMT=0 F  D JOIN Q:DDWRFMT
 Q
 ;
JOIN ;Join
 N DDWI,DDWSCR,DDWNSV,DDWLL,DDWTXT,DDWTXT0
 I $D(DDWMARK),DDWRW+DDWA'>$P(DDWMARK,U,3) D UNMARK^DDW7
 ;
 ;Get current line
 S (DDWTXT(1),DDWNSV)=DDWN
 ;
 ;Get next line
 I DDWRW=DDWMR S:DDWSTB DDWTXT(2)=^TMP("DDW1",$J,DDWSTB)
 E  S:DDWA+DDWRW<DDWCNT DDWTXT(2)=DDWL(DDWRW+1)
 ;
 I $G(DDWTXT(2))?." " D  Q:$G(DDWRFMT)
 . I $L(DDWN)>DDWRMAR S:$D(DDWTXT(2))#2 DDWLL=DDWTXT(2)
 . E  I $D(DDWRFMT) S DDWRFMT=1
 ;
 ;Adjust
 S DDWTXT0=$O(DDWTXT(""),-1)
 D ADJMAR(.DDWTXT,"","I")
 S:$D(DDWLL) DDWTXT=DDWTXT+1,DDWTXT(DDWTXT)=DDWLL
 S (DDWN,DDWL(DDWRW))=DDWTXT(1)
 ;
 ;Delete next line
 I DDWTXT0>1,DDWTXT=1 D
 . I DDWRW=DDWMR S DDWSTB=DDWSTB-1,DDWCNT=DDWCNT-1,$E(DDWBF,1,3)=111
 . E  D POS(DDWRW+1,DDWC,"RN"),XLINE^DDW5(1),POS(DDWRW-1,DDWC,"RN")
 ;
 ;DDWSCR: curr scr = final scr
 I DDWTXT=1,'$D(DDWRFMT) S DDWSCR=$L(DDWTXT(1))+1-DDWOFS
 E  S DDWSCR=DDWLMAR-DDWOFS
 S DDWSCR=DDWSCR'<1&(DDWSCR'>IOM)
 ;
 I DDWSCR,DDWNSV'=DDWN D
 . I DDWNSV]"",$P(DDWNSV,DDWN)="" D
 .. D CUP(DDWRW,$$MAX($L(DDWN)+1-DDWOFS,1))
 .. W $P(DDGLCLR,DDGLDEL)
 . E  I DDWN]"",$P(DDWN,DDWNSV)="" D
 .. D CUP(DDWRW,$$MAX($L(DDWNSV)+1-DDWOFS,1))
 .. W $E(DDWN,$$MAX($L(DDWNSV),DDWOFS)+1,IOM+DDWOFS)
 . E  D
 .. D CUP(DDWRW,DDWOFS+1)
 .. W $P(DDGLCLR,DDGLDEL)_$E(DDWN,DDWOFS+1,IOM+DDWOFS)
 ;
 I DDWTXT=1 D
 . I '$D(DDWRFMT) D
 .. D POS(DDWRW,"E","RN")
 . E  D POS(DDWRW,DDWLMAR,"RN")
 E  D JOIN2
 Q
 ;
JOIN2 ;Join produced >1 lines
 D POS(DDWRW,DDWLMAR,"R")
 ;
 I DDWTXT0=2 D
 . I DDWRW<DDWMR D
 .. S DDWL(DDWRW+1)=DDWTXT(2)
 .. S DDWRW=DDWRW+1
 .. I DDWSCR D
 ... D CUP(DDWRW,1)
 ... W $P(DDGLCLR,DDGLDEL)_$E(DDWL(DDWRW),1+DDWOFS,IOM+DDWOFS)
 . E  D
 .. S ^TMP("DDW1",$J,DDWSTB)=DDWTXT(2)
 .. D MVFWD^DDW3(1)
 ;
 F DDWI=DDWTXT0+1:1:DDWTXT D
 . D ILINE^DDW5
 . S (DDWN,DDWL(DDWRW))=DDWTXT(DDWI)
 . D CUP(DDWRW,1)
 . W $P(DDGLCLR,DDGLDEL)_$E(DDWN,1+DDWOFS,IOM+DDWOFS)
 ;
 D POS(DDWRW-($D(DDWLL)#2),DDWLMAR,"RN")
 Q
 ;
ADJMAR(DDWT,DDWW,DDWFLG) ;Adjust length of text in DDWT array
 ;  DDWT = Text array
 ;  DDWW = Width
 ;DDWFLG = I:First line $L=DDWRMAR, subsequent $L=DDWRMAR-DDWLMAR+1
 ;
 N DDWJ
 S DDWJ=1
 I $G(DDWFLG)["I" S DDWW=DDWRMAR
 E  I '$D(DDWW) S DDWW=DDWRMAR-DDWLMAR+1
 ;
 F  Q:'$D(DDWT(DDWJ))  D AMLOOP
 S DDWT=$O(DDWT(""),-1)
 I DDWLMAR>1 F DDWJ=$G(DDWFLG)["I"+1:1:DDWT D
 . S DDWT(DDWJ)=$J("",DDWLMAR-1)_DDWT(DDWJ)
 Q
 ;
AMLOOP ;Process DDWT(DDWJ)
 I $E(DDWT(DDWJ),1,DDWW)=$J("",DDWW) S DDWT(DDWJ)=$$LD(DDWT(DDWJ))
 ;
 E  I $L(DDWT(DDWJ))>DDWW F  D  Q:$L(DDWT(DDWJ))'>DDWW
 . N DDWK,DDWFST,DDWLST
 . F DDWK=$O(DDWT(""),-1)+1:-1:DDWJ+2 S DDWT(DDWK)=DDWT(DDWK-1)
 . D SLICE(DDWT(DDWJ),DDWW,.DDWFST,.DDWLST)
 . S DDWT(DDWJ)=DDWFST,DDWT(DDWJ+1)=DDWLST
 . D AMINCJ
 ;
 E  I $L(DDWT(DDWJ))=DDWW!'$D(DDWT(DDWJ+1)) D
 . I DDWRAP,$D(DDWT(DDWJ+1)) S DDWT(DDWJ+1)=$$LD(DDWT(DDWJ+1))
 . D AMINCJ
 ;
 E  I 'DDWRAP D
 . N DDWK S DDWK=DDWW-$L(DDWT(DDWJ))
 . S DDWT(DDWJ)=DDWT(DDWJ)_$E(DDWT(DDWJ+1),1,DDWK)
 . S DDWT(DDWJ+1)=$E(DDWT(DDWJ+1),DDWK+1,999)
 . D:DDWT(DDWJ+1)="" AMSHIFT(.DDWT,DDWJ+1)
 ;
 E  D
 . N DDWD,DDWI,DDWNXT,DDWSP,DDWX1,DDWX2
 . S DDWD=0 F  D  Q:DDWD
 .. S DDWX1=DDWT(DDWJ),(DDWX2,DDWT(DDWJ+1))=$$LD(DDWT(DDWJ+1))
 .. I DDWX2="" S DDWD=1 Q
 .. S DDWNXT=$P(DDWX2," "),DDWI=$L(DDWNXT)
 .. I $E(DDWX2,DDWI+2)=" ",$E(DDWX2,DDWI+3,999)'?." " D
 ... F DDWI=DDWI+2:1 Q:$E(DDWX2,DDWI+1)'=" "
 .. S DDWSP=DDWX1'?.E1" "
 .. I $L(DDWX1)+DDWSP+$L($E(DDWX2,1,DDWI))>DDWW S DDWD=1 Q
 .. S DDWT(DDWJ)=DDWX1_$E(" ",DDWSP)_$E(DDWX2,1,DDWI)
 .. S DDWT(DDWJ+1)=$$LD($E(DDWX2,DDWI+1,999))
 . ;
 . I DDWT(DDWJ+1)="" D
 .. D AMSHIFT(.DDWT,DDWJ+1)
 . E  D AMINCJ
 Q
 ;
AMSHIFT(DDWT,DDWJ) ;Delete DDWT(DDWJ) and shift up
 N DDWI
 F DDWI=DDWJ:1:$O(DDWT(""),-1)-1 S DDWT(DDWI)=DDWT(DDWI+1)
 K DDWT($O(DDWT(""),-1))
 Q
 ;
AMINCJ ;Incr DDWJ
 I DDWJ=1,$G(DDWFLG)["I" S DDWW=DDWRMAR-DDWLMAR+1
 S DDWJ=DDWJ+1
 Q
 ;
SLICE(DDWN,DDWW,DDWFST,DDWRST) ;
 ;Out: DDWFST=first part of text, $L<=DDWRMAR
 ;     DDWRST=remaining part (lead blanks removed)
 N DDWI,DDWP,DDWX
 S:'$G(DDWW) DDWW=DDWRMAR
 I 'DDWRAP S DDWFST=$E(DDWN,1,DDWW),DDWLST=$E(DDWN,DDWW+1,999) Q
 ;
 ;Set DDWI to column # at which to break
 S DDWX=$E(DDWN,1,DDWW),DDWI=DDWW
 I DDWX'[" "
 E  I DDWX?." "
 E  I $E(DDWX,DDWW)=" ",$E(DDWN,DDWW+1)'=" "
 E  D
 . F DDWP=$L(DDWX," "):-1:0 Q:$P(DDWX," ",DDWP)]""
 . Q:DDWP=1
 . S DDWI=$L($P(DDWX," ",1,DDWP-1))+1
 . S:DDWI'>$S(DDWW=DDWRMAR:DDWLMAR,1:1) DDWI=DDWW
 ;
 S DDWFST=$E(DDWN,1,DDWI),DDWRST=$$LD($E(DDWN,DDWI+1,999))
 Q
 ;
TR(X) Q:$G(X)="" X
 N I
 F I=$L(X):-1:0 Q:$E(X,I)'=" "
 Q $E(X,1,I)
 ;
LD(X) Q:$G(X)="" X
 N I
 F I=1:1:$L(X)+1 Q:$E(X,I)'=" "
 Q $E(X,I,999)
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
SCR(C) ;Screen number
 Q C-$P(DDWOFS,U,2)-1\$P(DDWOFS,U,3)+1
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDW7
DDW7 ;SFISC/MKO-MARK TEXT ;2:30 PM  27 Jul 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
MARK ;Mark the text
 I $D(DDWMARK) D
 . D BOUND
 E  D
 . S DDWMARK=DDWA+DDWRW_U_DDWC_U_(DDWA+DDWRW)_U_$$MAX(DDWC,$L(DDWN))
 . D PAINT(DDWMARK,1),IND(1)
 Q
 ;
BOUND ;Mark ending boundary, highlight selected text
 N DDWI,DDWX,DDWY
 ;
 S DDWI=DDWA+DDWRW_U_DDWC
 S DDWX=$P(DDWMARK,U,1,2)
 S DDWY=$P(DDWMARK,U,3,4)
 ;
 I $$ISLESS(DDWI,DDWX) D
 . D PAINT(DDWX_U_DDWY)
 . D PAINT(DDWI_U_DDWX,1)
 . S DDWMARK=DDWI_U_DDWX
 E  D
 . I $$ISLESS(DDWI,DDWY) D
 .. D PAINT(DDWI_U_DDWY),PAINT(DDWI_U_DDWI,1)
 . E  D PAINT(DDWY_U_DDWI,1)
 . S DDWMARK=DDWX_U_DDWI
 D CUP(DDWRW,DDWC-DDWOFS)
 Q
 ;
UNMARK ;Unmark the text
 D:$D(DDWMARK) PAINT(DDWMARK),IND()
 K DDWMARK
 Q
 ;
PAINT(DDWMARK,DDWREV) ;Paint selected text
 N DDWI,DDWE1,DDWE2,DDWL1,DDWL2,DDWR1,DDWC1,DDWR2,DDWC2
 S DDWR1=$P(DDWMARK,U,1),DDWC1=$P(DDWMARK,U,2)
 S DDWR2=$P(DDWMARK,U,3),DDWC2=$P(DDWMARK,U,4)
 S DDWL1=$$MAX(DDWR1-DDWA,1),DDWL2=$$MIN(DDWR2-DDWA,DDWMR)
 Q:DDWL1>DDWL2
 ;
 W:$G(DDWREV) $P(DDGLVID,DDGLDEL,6)
 F DDWI=DDWL1:1:DDWL2 D
 . S DDWE1=$$MAX($S(DDWI+DDWA=DDWR1:DDWC1,1:1),DDWOFS+1)
 . S DDWE2=$$MIN($S(DDWI+DDWA=DDWR2:DDWC2,1:999),IOM+DDWOFS)
 . Q:DDWE1>DDWE2
 . D CUP(DDWI,DDWE1-DDWOFS)
 . W $E(DDWL(DDWI),DDWE1,DDWE2)
 W:$G(DDWREV) $P(DDGLVID,DDGLDEL,10)
 Q
 ;
IND(DDWX) ;Paint indicator
 S DY=$G(DDWBM,IOSL)-1,DX=IOM-7 X IOXY
 W $S($G(DDWX):$P(DDGLVID,DDGLDEL,6)_"Select"_$P(DDGLVID,DDGLDEL,10),1:$P(DDGLCLR,DDGLDEL))
 D CUP(DDWRW,DDWC-DDWOFS)
 Q
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
ISLESS(X,Y) ;Is coordinate X less than coordinate Y
 N R1,C1,R2,C2
 S R1=$P(X,U),C1=$P(X,U,2)
 S R2=$P(Y,U),C2=$P(Y,U,2)
 ;
 Q:R1>R2 0
 Q:R1<R2 1
 Q:C1>C2 0
 Q 1
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDW8
DDW8 ;SFISC/MKO-COPY, CUT, PASTE ;12:09 PM  24 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CUT() ;Cut selected text
 N DDWADJ,DDWC1,DDWC2,DDWCSV,DDWISIN,DDWNDEL,DDWR1,DDWR2,DDWRSV
 I '$D(DDWMARK) D ERR($$EZBLD^DIALOG(1404)) Q  ;**'NO TEXT'
 ;
 S DDWED=1
 S DDWISIN=$$ISINSEL()
 D PMARK(DDWMARK,.DDWR1,.DDWC1,.DDWR2,.DDWC2)
 D COPYBUF
 ;
 S DDWRSV=DDWRW,DDWCSV=DDWC
 I DDWR2>DDWA,DDWR2-DDWA<DDWRW S DDWADJ=1
 E  I DDWR1-DDWA'>DDWMR,DDWR1-DDWA>DDWRW S DDWADJ=0
 ;
 D DELBLK^DDW9(.DDWNDEL)
 D:$D(DDWADJ) POS(DDWRSV-(DDWADJ*DDWNDEL),DDWCSV,"RN")
 D:'DDWISIN PASTE()
 Q
 ;
COPY() ;Copy selected text
 N DDWC1,DDWC2,DDWISIN,DDWR1,DDWR2
 I '$D(DDWMARK) D ERR($$EZBLD^DIALOG(1404)) Q  ;**'NO TEXT'
 ;
 S DDWISIN=$$ISINSEL()
 D PMARK(DDWMARK,.DDWR1,.DDWC1,.DDWR2,.DDWC2)
 D COPYBUF
 D UNMARK^DDW7
 D:'DDWISIN PASTE()
 Q
 ;
COPYBUF ;Copy selected text to buffer
 N DDWND,DDWI,DDWX,DDWX1,DDWX2
 K ^TMP("DDWB",$J)
 S DDWND=0
 ;
 D:DDWR2-DDWR1>50 MSG^DDW(" ...") ;**
 ;
 F DDWI=DDWR1:1:$$MIN(DDWA,DDWR2) D
 . S DDWND=DDWND+1
 . S DDWX=^TMP("DDW",$J,DDWI)
 . S DDWX=$E(DDWX,$S(DDWI=DDWR1:DDWC1,1:1),$S(DDWI=DDWR2:DDWC2,1:999))
 . S ^TMP("DDWB",$J,DDWND)=DDWX
 ;
 F DDWI=$$MAX(DDWR1-DDWA,1):1:$$MIN(DDWR2-DDWA,DDWMR) D
 . S DDWX=$E(DDWL(DDWI),$S(DDWI+DDWA=DDWR1:DDWC1,1:1),$S(DDWI+DDWA=DDWR2:DDWC2,1:999))
 . S DDWND=DDWND+1
 . S ^TMP("DDWB",$J,DDWND)=DDWX
 ;
 S DDWX1=$$RTOSTB(DDWR1),DDWX2=$$RTOSTB(DDWR2)
 F DDWI=$$MIN(DDWSTB,DDWX1):-1:DDWX2 D
 . S DDWND=DDWND+1
 . S DDWX=^TMP("DDW1",$J,DDWI)
 . S DDWX=$E(DDWX,$S(DDWI=DDWX1:DDWC1,1:1),$S(DDWI=DDWX2:DDWC2,1:999))
 . S ^TMP("DDWB",$J,DDWND)=DDWX
 ;
 D:DDWR2-DDWR1>50 MSG^DDW()
 Q
 ;
PASTE() ;Paste text
 I $D(DDWMARK) D ERR("You curently have text selected.") Q
 I '$D(^TMP("DDWB",$J)) D ERR($$EZBLD^DIALOG(1404)) Q  ;**
 ;
 S DDWED=1
 N DDWBSIZ,DDWFC,DDWI,DDWLST,DDWNSV,DDWTXT,DDWX
 S DDWBSIZ=$O(^TMP("DDWB",$J,""),-1)
 ;
 S DDWTXT=1
 S:$L(DDWN)+1<DDWC DDWN=DDWN_$J("",DDWC-$L(DDWN)-1)
 S (DDWNSV,DDWX)=$E(DDWN,1,DDWC-1)
 S DDWTXT(1)=DDWX
 I $L(DDWX)+$L(^TMP("DDWB",$J,1))<256!(DDWX="") S DDWTXT(1)=DDWTXT(1)_^(1)
 E  S DDWTXT=DDWTXT+1,DDWTXT(DDWTXT)=^TMP("DDWB",$J,1)
 ;
 S DDWLST=$E(DDWN,DDWC,999)
 I DDWRAP,DDWLST?1." " S DDWLST=""
 I DDWLST]"",DDWBSIZ=1 S DDWTXT=DDWTXT+1,DDWTXT(DDWTXT)=DDWLST,DDWLST=""
 ;
 D:DDWTXT ADJMAR^DDW6(.DDWTXT,"","I")
 S (DDWN,DDWL(DDWRW))=DDWTXT(1)
 ;
 I DDWBSIZ=1,DDWTXT=1 S DDWFC=$L(DDWNSV)+$L(^TMP("DDWB",$J,1))+1
 E  I DDWBSIZ=1,DDWTXT=2,DDWLST="" S DDWFC=$L(DDWTXT(2))+1
 E  S DDWFC=1
 ;
 I $$SCR(DDWFC)=$P(DDWOFS,U,4) D
 . D POS(DDWRW,$$MIN($L(DDWNSV),$L(DDWN))+1)
 . W $P(DDGLCLR,DDGLDEL)_$E(DDWN,$L(DDWNSV)+1,IOM+DDWOFS)
 ;
 D POS(DDWRW,DDWFC,"R")
 ;
 F DDWI=2:1:DDWTXT D
 . D ILINE^DDW5
 . S (DDWN,DDWL(DDWRW))=DDWTXT(DDWI)
 . D CUP(DDWRW,1)
 . W $E(DDWN,1+DDWOFS,IOM+DDWOFS)
 ;
 F DDWI=2:1:DDWBSIZ D
 . D ILINE^DDW5
 . S (DDWN,DDWL(DDWRW))=^TMP("DDWB",$J,DDWI)
 . D CUP(DDWRW,1)
 . W $E(DDWN,1+DDWOFS,IOM+DDWOFS)
 ;
 I DDWLST]"" D
 . D ILINE^DDW5
 . S (DDWN,DDWL(DDWRW))=DDWLST
 . D CUP(DDWRW,1)
 . W $E(DDWN,1+DDWOFS,IOM+DDWOFS)
 ;
 D POS(DDWRW,DDWFC,"RN")
 Q
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
ISINSEL() ;Is the cursor within the selected text
 N DDWI,DDWY
 S DDWI=DDWRW+DDWA,DDWY=0
 I DDWI<$P(DDWMARK,U)
 E  I DDWI>$P(DDWMARK,U,3)
 E  I DDWI=$P(DDWMARK,U),DDWC<$P(DDWMARK,U,2)
 E  I DDWI=$P(DDWMARK,U,3),DDWC-1>$P(DDWMARK,U,4)
 E  S DDWY=1
 Q DDWY
 ;
PMARK(M,R1,C1,R2,C2) ;Parse M (DDWMARK)
 S R1=$P(M,U),C1=$P(M,U,2)
 S R2=$P(M,U,3),C2=$P(M,U,4)
 Q
 ;
ERR(DDWX) ;
 D MSG^DDW($C(7)_DDWX) H 2 D MSG^DDW()
 D CUP(DDWRW,DDWC-DDWOFS)
 F  R *DDWX:0 E  Q
 Q
 ;
TR(X) ;Strip trailing blanks
 Q:$G(X)="" X
 N I
 F I=$L(X):-1:0 Q:$E(X,I)'=" "
 Q $E(X,1,I)
 ;
LD(X) ;Strip leading blanks
 Q:$G(X)="" X
 N I
 F I=1:1:$L(X)+1 Q:$E(X,I)'=" "
 Q $E(X,I,999)
 ;
RTOSTB(R) ;Return node in STB given line #
 Q DDWSTB+DDWA+DDWMR+1-R
 ;
SCR(C) ;Return screen number
 Q C-$P(DDWOFS,U,2)-1\$P(DDWOFS,U,3)+1
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDW9
DDW9 ;SFISC/MKO-MARK TEXT ;12:20 PM  24 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CHKDEL(DDWY) ;Check that cursor is on block and delete
 N DDWI
 N DDWC1,DDWC2,DDWR1,DDWR2,DDWI
 D PMARK(DDWMARK,.DDWR1,.DDWC1,.DDWR2,.DDWC2)
 S DDWY=0,DDWI=DDWRW+DDWA
 Q:DDWI<DDWR1
 Q:DDWI>DDWR2
 I DDWI=DDWR1,DDWC<DDWC1 D UNMARK^DDW7 Q
 I DDWI=DDWR2,DDWC-1>DDWC2 D UNMARK^DDW7 Q
 ;
 D DELBLK()
 S DDWY=1
 Q
 ;
DELBLK(DDWNDEL) ;Delete block
 ;Returns: DDWNDEL=# lines deleted from the screen
 N DDWNP,DDWI,DDWX
 I '$D(DDWR1) N DDWR1,DDWR2,DDWC1,DDWC2 D
 . D PMARK(DDWMARK,.DDWR1,.DDWC1,.DDWR2,.DDWC2)
 ;
 S DDWNDEL=0,$E(DDWBF,1,3)=111
 K DDWMARK
 ;
 I DDWR2-DDWA<1 D
 . D DELABV
 E  I DDWR1-DDWA>DDWMR D
 . D DELBEL
 E  D DELMID
 ;
 D IND^DDW7()
 Q
 ;
DELABV ;All of the block is above the screen
 I DDWR1=DDWR2 D  Q
 . N DDWX
 . S DDWX=^TMP("DDW",$J,DDWR1),$E(DDWX,DDWC1,DDWC2)=""
 . I DDWX]"" S ^TMP("DDW",$J,DDWR1)=DDWX
 . E  D SHIFTA(DDWR1,DDWR1)
 ;
 D:DDWR2-DDWR1>50 MSG^DDW(" ...") ;**
 N DDWFST,DDWLST
 S DDWFST=$E(^TMP("DDW",$J,DDWR1),1,DDWC1-1)
 S DDWLST=$E(^TMP("DDW",$J,DDWR2),DDWC2+1,999)
 I DDWFST]"" S ^TMP("DDW",$J,DDWR1)=DDWFST,DDWFST=DDWR1+1
 E  S DDWFST=DDWR1
 I DDWLST]"" S ^TMP("DDW",$J,DDWR2)=DDWLST,DDWLST=DDWR2-1
 E  S DDWLST=DDWR2
 D SHIFTA(DDWFST,DDWLST)
 D:DDWR2-DDWR1>50 MSG^DDW()
 Q
 ;
SHIFTA(DDWA1,DDWA2) ;
 N DDWNL
 S DDWNL=DDWA2-DDWA1+1
 I DDWA2=DDWA S DDWA=DDWA-DDWNL,DDWCNT=DDWCNT-DDWNL Q
 ;
 N DDWI
 F DDWI=DDWA1:1:DDWA-DDWNL S ^TMP("DDW",$J,DDWI)=^TMP("DDW",$J,DDWI+DDWNL)
 S DDWA=DDWA-DDWNL,DDWCNT=DDWCNT-DDWNL
 Q
 ;
DELBEL ;All of the block is below the screen
 N DDWS1,DDWS2
 S DDWS1=DDWA+DDWMR+DDWSTB-DDWR1+1,DDWS2=DDWA+DDWMR+DDWSTB-DDWR2+1
 I DDWS1=DDWS2 D  Q
 . N DDWX
 . S DDWX=^TMP("DDW1",$J,DDWS1),$E(DDWX,DDWC1,DDWC2)=""
 . I DDWX]"" S ^TMP("DDW1",$J,DDWS1)=DDWX
 . E  D SHIFTB(DDWS1,DDWS1)
 ;
 D:DDWR2-DDWR1>50 MSG^DDW(" ...") ;**
 N DDWFST,DDWLST
 S DDWFST=$E(^TMP("DDW1",$J,DDWS1),1,DDWC1-1)
 S DDWLST=$E(^TMP("DDW1",$J,DDWS2),DDWC2+1,999)
 I DDWFST]"" S ^TMP("DDW1",$J,DDWS1)=DDWFST,DDWFST=DDWS1-1
 E  S DDWFST=DDWS1
 I DDWLST]"" S ^TMP("DDW1",$J,DDWS2)=DDWLST,DDWLST=DDWS2+1
 E  S DDWLST=DDWS2
 D SHIFTB(DDWFST,DDWLST)
 D:DDWR2-DDWR1>50 MSG^DDW()
 Q
 ;
SHIFTB(DDWS1,DDWS2) ;
 N DDWNL
 S DDWNL=DDWS1-DDWS2+1
 I DDWS1=DDWSTB S DDWSTB=DDWSTB-DDWNL,DDWCNT=DDWCNT-DDWNL Q
 ;
 N DDWI
 F DDWI=DDWS2:1:DDWSTB-DDWNL S ^TMP("DDW1",$J,DDWI)=^TMP("DDW1",$J,DDWI+DDWNL)
 S DDWSTB=DDWSTB-DDWNL,DDWCNT=DDWCNT-DDWNL
 Q
 ;
DELMID ;A portion of the block appears on the screen
 I DDWR2-1-DDWA>DDWMR D
 . S DDWX=DDWR2-(DDWA+DDWMR+1)
 . S DDWSTB=DDWSTB-DDWX,DDWCNT=DDWCNT-DDWX
 ;
 I DDWR2-DDWA>DDWMR D
 . S DDWX=$E(^TMP("DDW1",$J,DDWSTB),DDWC2+1,999)
 . I DDWX="" S DDWSTB=DDWSTB-1,DDWCNT=DDWCNT-1
 . E  S ^TMP("DDW1",$J,DDWSTB)=DDWX
 ;
 D POS($$MAX(DDWR1-DDWA,1),$S(DDWR1=DDWR2:DDWC1,1:1),"RN")
 ;
 S DDWNP=DDWR2-DDWA'<DDWMR
 F DDWI=DDWRW:1:$$MIN(DDWR2-DDWA,DDWMR) D
 . S DDWX=$E(DDWL(DDWRW),1,$S(DDWI+DDWA=DDWR1:DDWC1,1:1)-1)_$E(DDWL(DDWRW),$S(DDWI+DDWA=DDWR2:DDWC2,1:999)+1,999)
 . I DDWX]"" D
 .. S DDWL(DDWRW)=DDWX
 .. I 'DDWNP D
 ... D CUP(DDWRW,1)
 ... W $P(DDGLCLR,DDGLDEL)_$E(DDWX,1+DDWOFS,IOM+DDWOFS)
 .. D POS(DDWRW+(DDWI<$$MIN(DDWR2-DDWA,DDWMR)),DDWC,"RN")
 . E  D XLINE^DDW5(1,DDWNP) S DDWNDEL=DDWNDEL+1
 ;
 I DDWNP F DDWI=$$MAX(DDWR1-DDWA,1):1:DDWMR D
 . D CUP(DDWI,1)
 . W $P(DDGLCLR,DDGLDEL)_$E(DDWL(DDWI),1+DDWOFS,IOM+DDWOFS)
 ;
 I DDWR1+1'>DDWA D
 . S DDWX=DDWA-DDWR1
 . S DDWA=DDWA-DDWX,DDWCNT=DDWCNT-DDWX
 ;
 I DDWR1'>DDWA D
 . S DDWX=$E(^TMP("DDW",$J,DDWA),1,DDWC1-1)
 . I DDWX="" S DDWA=DDWA-1,DDWCNT=DDWCNT-1
 . E  S ^TMP("DDW",$J,DDWA)=DDWX
 ;
 S:DDWCNT<1 DDWCNT=1
 D:DDWRW+DDWA>DDWCNT UP^DDWT1
 Q
 ;
PMARK(M,R1,C1,R2,C2) ;Parse M (DDWMARK)
 S R1=$P(M,U),C1=$P(M,U,2)
 S R2=$P(M,U,3),C2=$P(M,U,4)
 Q
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDWC
DDWC ;SFISC/MKO-CHANGE (REPLACE) ;02:24 PM  14 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CHG ;Change
 N DDWOPT
 D SETUP^DDWC1
 F  D PROC Q:DDWOPT=-1
 D RESTORE^DDWC1
 K DDWCHG(1)
 Q
 ;
PROC ;Main procedure
 N DDWCOD,DDWT
 ;
 D:$D(DDWMARK) UNMARK^DDW7
 D EN^DIR0(IOTM+DDWMR,14,30,"",$G(DDWFIND),100,"","","AKTW",.DDWT,.DDWCOD)
 I DDWT=""!($P(DDWCOD,U)="TO") S DDWOPT=-1 Q
 S DDWFIND=DDWT,DDWT=$$UC(DDWT)
 ;
 K DDWCHG(1)
 D EN^DIR0(IOTM+DDWMR+1,14,30,"",$G(DDWCHG),100,"","","AKTW",.DDWCHG,.DDWCOD)
 I $P(DDWCOD,U)="TO" S DDWOPT=-1 Q
 S:DDWCHG?1L.E DDWCHG(1)=$$UC($E(DDWCHG))_$E(DDWCHG,2,999)
 ;
 F  D OPT Q:DDWOPT]""
 Q
 ;
OPT ;Prompt for and process option
 W $P(DDGLVID,DDGLDEL,6)
 F  D  Q:DDWOPT]""
 . D CUP(DDWMR+4,15) W " "_$C(8)
 . R DDWOPT#1:DTIME E  S DDWOPT="Q" Q
 . I DDWOPT=U S DDWOPT="Q"
 . I DDWOPT="" S DDWOPT="E" Q
 . I DDWOPT="?" S DDWOPT="H" Q
 . S DDWOPT=$$UC(DDWOPT)
 . I "^F^R^A^Q^"'[(U_DDWOPT_U) W $C(7) S DDWOPT=""
 D CUP(DDWMR+4,15) W $P(DDGLVID,DDGLDEL,10)_" "
 D @DDWOPT
 Q
 ;
F ;Find next
 D FINDT^DDWF(DDWFIND)
 S DDWOPT=""
 Q
 ;
R ;Replace
 N DDWE
 I '$D(DDWMARK) D CERR Q
 D RS(.DDWE) Q:$G(DDWE)
 D F
 Q
 ;
RS(DDWE) ;Change selected text
 N DDWDIF
 S DDWDIF=$L(DDWCHG)-$P(DDWMARK,U,4)+$P(DDWMARK,U,2)-1
 I $L(DDWN)+DDWDIF>245 D  Q
 . S DDWE=1,DDWOPT=""
 . D MSG($C(7)_$$EZBLD^DIALOG(347)) ;**TOO LONG
 ;
 S DDWE=0,DDWED=1
 S $E(DDWN,$P(DDWMARK,U,2),$P(DDWMARK,U,4))=$S($E(DDWN,$P(DDWMARK,U,2))?1U:$G(DDWCHG(1),DDWCHG),1:DDWCHG)
 S DDWL(DDWRW)=DDWN
 D CUP(DDWRW,1) W $P(DDGLCLR,DDGLDEL)_$E(DDWN,1+DDWOFS,IOM+DDWOFS)
 K DDWMARK D IND^DDW7()
 D POS(DDWRW,DDWC+DDWDIF,"R")
 Q
 ;
A ;Change all
 N DDWE,DDWF,DDWI,DDWND,DDWX
 D MSG^DDW("...") ;**'CHANGING TEXT'
 I $D(DDWMARK) D RS(.DDWE) G:$G(DDWE) AEND
 ;
 S DDWX=$F($$UC(DDWL(DDWRW)),DDWT,DDWC)
 I DDWX D
 . S DDWL(DDWRW)=$$REP(DDWL(DDWRW),DDWFIND,.DDWCHG,DDWX,.DDWE),DDWF=1
 . S:$G(DDWE) DDWE=DDWRW+DDWA_U_DDWE
 ;
 I '$G(DDWE) F DDWI=DDWRW+1:1:DDWMR D  Q:$G(DDWE)
 . S DDWX=$F($$UC(DDWL(DDWI)),DDWT)
 . S:DDWX DDWL(DDWI)=$$REP(DDWL(DDWI),DDWFIND,.DDWCHG,DDWX,.DDWE),DDWF=1
 . S:$G(DDWE) DDWE=DDWI+DDWA_U_DDWE
 ;
 I '$G(DDWE) F DDWI=DDWSTB:-1:1 D  Q:$G(DDWE)
 . S DDWND=^TMP("DDW1",$J,DDWI)
 . S DDWX=$F($$UC(DDWND),DDWT)
 . S:DDWX ^TMP("DDW1",$J,DDWI)=$$REP(DDWND,DDWFIND,.DDWCHG,DDWX,.DDWE),DDWF=1
 . S:$G(DDWE) DDWE=DDWA+DDWMR+DDWSTB-DDWI+1_U_DDWE
 ;
 I $G(DDWF) D
TOOLONG . D:$G(DDWE) MSG^DDW($C(7)_$$EZBLD^DIALOG(347)) H 2 ;**
 . F DDWI=1:1:$$MIN(DDWMR,DDWCNT-DDWA) D
 .. D CUP(DDWI,1)
 .. W $P(DDGLCLR,DDGLDEL)_$E(DDWL(DDWI),1+DDWOFS,IOM+DDWOFS)
 . D:$G(DDWE) LINE^DDWG(+DDWE,1),POS(DDWRW,$P(DDWE,U,2),"R")
 E  D MSG^DDW("Text not found.") H 2 D FLUSH
 ;
AEND D MSG^DDW(),CUP(DDWRW,DDWC)
 S DDWOPT=$S($G(DDWE):-1,1:"")
 Q
 ;
REP(DDWND,DDWFIND,DDWCHG,DDWX,DDWE) ;String replacement of DDWND
 N DDWDIF,DDWFST,DDWSV
 S DDWDIF=$L(DDWCHG)-$L(DDWFIND)
 F  D  Q:'DDWX!$G(DDWE)
 . S DDWSV=DDWND,DDWFST=DDWX-$L(DDWFIND)
 . I $L(DDWND)+DDWDIF>245 S DDWE=DDWFST Q
 . S $E(DDWND,DDWFST,DDWX-1)=$S($E(DDWND,DDWFST)?1U:$G(DDWCHG(1),DDWCHG),1:DDWCHG)
 . S DDWX=DDWX+DDWDIF
 . S DDWX=$F($$UC(DDWND),DDWFIND,DDWX)
 Q $S($G(DDWE):DDWSV,1:DDWND)
 ;
E ;Edit Find
 D FLUSH
 Q
 ;
Q ;Quit option
 D FLUSH
 S DDWOPT=-1
 Q
 ;
H ;Help
 D MSG("Press the highlighted letter of one of the Options.")
 S DDWOPT=""
 Q
 ;
CERR ;The Change options are disabled
 D MSG($C(7)_"You must Find the text before you can Change it.")
 S DDWOPT=""
 Q
 ;
MSG(DDWX) ;
 D CUP(DDWMR+5,1) W $P(DDGLCLR,DDGLDEL)_$G(DDWX) H 2
 D CUP(DDWMR+5,1) W $P(DDGLCLR,DDGLDEL)
 D FLUSH
 Q
 ;
FLUSH ;Flush read buffer
 N DDWX F  R *DDWX:0 E  Q
 Q
 ;
UC(X) ;Return uppercase of X
 Q $$UP^DILIBF(X)  ;**
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
CUP(Y,X) ;Pos cursor
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q

DDWC1
DDWC1 ;SFISC/MKO-CHANGE ;04:37 PM  24 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SETUP ;Setup new scrolling region
 N DDWI
 F DDWI=$$MIN(DDWMR,DDWCNT-DDWA):-1:DDWMR-4 D
 . S DDWSTB=DDWSTB+1,^TMP("DDW1",$J,DDWSTB)=DDWL(DDWI)
 S IOBM=IOBM-5,DDWMR=DDWMR-5
 W:$P(DDGLED,DDGLDEL,2)]"" @$P(DDGLED,DDGLDEL,2)
 ;
 ;Print dialog box
 N DDWR0,DDWR1
 S DDWR1=$P(DDGLVID,DDGLDEL,6),DDWR0=$P(DDGLVID,DDGLDEL,10)
 ;
 D CUP(DDWMR+1,1)
 W $P(DDGLGRA,DDGLDEL)_$TR($J("",IOM)," ",$P(DDGLGRA,DDGLDEL,3))_$P(DDGLGRA,DDGLDEL,2),!
FIND D CUP(DDWMR+2,1) W $P(DDGLCLR,DDGLDEL)_"   "_$$EZBLD^DIALOG(8126) ;**'FIND WHAT:'
 D CUP(DDWMR+3,1) W $P(DDGLCLR,DDGLDEL)_$$EZBLD^DIALOG(8126.1)_$G(DDWCHG) ;**'REPLACE WITH:'
 D CUP(DDWMR+4,1) W $P(DDGLCLR,DDGLDEL)_"      Option:"_$P(DDGLCLR,DDGLDEL)_$J("",20)_DDWR1_"F"_DDWR0_"ind Next   "_DDWR1_"R"_DDWR0_"eplace   Replace "_DDWR1_"A"_DDWR0_"ll   "_DDWR1_"Q"_DDWR0_"uit"
 D CUP(DDWMR+5,1) W $P(DDGLCLR,DDGLDEL)
 Q
 ;
RESTORE ;Restore original scrolling region
 N DDWI
 S IOBM=IOBM+5,DDWMR=DDWMR+5
 W:$P(DDGLED,DDGLDEL,2)]"" @$P(DDGLED,DDGLDEL,2)
 F DDWI=DDWMR-4:1:DDWMR D
 . I DDWI+DDWA'>DDWCNT D
 .. S DDWL(DDWI)=^TMP("DDW1",$J,DDWSTB),DDWSTB=DDWSTB-1
 . E  S DDWL(DDWI)=""
 . D CUP(DDWI,1)
 . W $P(DDGLCLR,DDGLDEL)_$E(DDWL(DDWI),1+DDWOFS,IOM+DDWOFS)
 .
 D POS(DDWRW,DDWC,"RN")
 Q
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
CUP(Y,X) ;Pos cursor
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q

DDWF
DDWF ;SFISC/MKO-FIND, REPLACE ;02:43 PM  24 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
NEXT ;Find next occurrence of same text
 N DDWT
 G:$G(DDWFIND)="" FIND
 S DDWT=DDWFIND
 D FINDT(DDWT,$G(DDWFIND(1)))
 Q
 ;
FIND ;Prompt and find text
 N DDWCOD,DDWF,DDWT
 D ASK^DDWG(3,$$EZBLD^DIALOG(8126),30,$G(DDWFIND),"","",.DDWT,.DDWCOD) ;**'FIND WHAT: '
 Q:DDWT=""
 D FINDT(DDWT,$P($G(DDWCOD),U)="U")
 Q
 ;
FINDT(DDWT,DDWBACK) ;Find DDWT
 D:$D(DDWMARK) UNMARK^DDW7
 S DDWFIND=DDWT,DDWT=$$UC(DDWT)
 I $G(DDWBACK) D
 . S DDWFIND(1)=1 D LOOKB
 E  K DDWFIND(1) D LOOK
 Q
 ;
LOOK ;Look in arrays
 N DDWF,DDWI,DDWX
 S DDWF=$F($$UC(DDWL(DDWRW)),DDWT,DDWC)
 I DDWF D REPOS(DDWRW+DDWA,DDWF,DDWT) Q
 ;
 F DDWI=DDWRW+1:1:DDWMR D  Q:DDWF
 . S DDWX=$F($$UC(DDWL(DDWI)),DDWT)
 . I DDWX D REPOS(DDWI+DDWA,DDWX,DDWT) S DDWF=1
 Q:DDWF
 ;
 D MSG^DDW(" ...") ;**
 F DDWI=DDWSTB:-1:1 D  Q:DDWF
 . S DDWX=$F($$UC(^TMP("DDW1",$J,DDWI)),DDWT)
 . I DDWX D
 .. D MSG^DDW()
 .. D REPOS(DDWA+DDWMR+DDWSTB-DDWI+1,DDWX,DDWT)
 .. S DDWF=1
 Q:DDWF
 ;
 D MSG^DDW($$EZBLD^DIALOG(8127)) H 2 ;**'TEXT NOT FOUND'
 D MSG^DDW(),CUP(DDWRW,DDWC)
 F  R *DDWX:0 E  Q
 Q
 ;
LOOKB ;Look backward in arrays
 N DDWF,DDWI,DDWX
 S DDWF=$$RF($E($$UC(DDWL(DDWRW)),1,DDWC-1),DDWT)
 I DDWF=DDWC S DDWF=$$RF($E($$UC(DDWL(DDWRW)),1,DDWC-$L(DDWT)-1),DDWT)
 I DDWF D REPOS(DDWRW+DDWA,DDWF,DDWT) Q
 ;
 F DDWI=DDWRW-1:-1:1 D  Q:DDWF
 . S DDWX=$$RF($$UC(DDWL(DDWI)),DDWT)
 . I DDWX D REPOS(DDWI+DDWA,DDWX,DDWT) S DDWF=1
 Q:DDWF
 ;
 D MSG^DDW(" ...") ;**
 F DDWI=DDWA:-1:1 D  Q:DDWF
 . S DDWX=$$RF($$UC(^TMP("DDW",$J,DDWI)),DDWT)
 . I DDWX D
 .. D MSG^DDW()
 .. D REPOS(DDWI,DDWX,DDWT)
 .. S DDWF=1
 Q:DDWF
 ;
 D MSG^DDW($$EZBLD^DIALOG(8127)) H 2 ;**'TEXT NOT FOUND'
 D MSG^DDW(),CUP(DDWRW,DDWC)
 F  R *DDWX:0 E  Q
 Q
 ;
REPOS(DDWY,DDWX,DDWT) ;Define DDWMARK, paint if on screen
 S DDWMARK=DDWY_U_(DDWX-$L(DDWT))_U_DDWY_U_(DDWX-1)
 I DDWY-DDWA>0,DDWY-DDWA'>DDWMR,DDWX-DDWOFS>0,DDWX-DDWOFS'>IOM D
 . D PAINT^DDW7(DDWMARK,1)
 . D POS(DDWY-DDWA,DDWX,"RN")
 E  D LINE^DDWG(DDWY,DDWX)
 D IND^DDW7(1)
 Q
 ;
UC(X) ;Return uppercase of X
 Q $$UP^DILIBF(X)  ;**
 ;
RF(X,T) ;Find last occurrence of T in X
 N Y
 Q:X'[T 0
 S Y=1 F  S Y=$F(X,T,Y) Q:'$F(X,T,Y)
 Q Y
 ;
CUP(Y,X) ;Cursor positioning
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q

DDWG
DDWG ;SFISC/MKO-GOTO ;05:49 PM  24 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GOTO ;Go to a specific location
 N DDWANS,DDWI,DDWHLP
 D BLD^DIALOG(8140,,,"DDWHLP") ;**
 D ASK(4,$$EZBLD^DIALOG(7069)_": ",17,"","D VALGTO",.DDWHLP,.DDWANS) ;**
 I U[DDWANS
 E  I "Ss"[$E(DDWANS)!(DDWANS'?1A.E) D
 . D GOTOS
 E  I "Ll"[$E(DDWANS) D
 . D GOTOL
 E  I "Cc"[$E(DDWANS) D
 . D GOTOC
 Q
 ;
GOTOS ;Go to a page
 N DDWS
 S DDWS=DDWANS
 S:DDWS?1A.E DDWS=$E(DDWS,2,999)
 S:DDWS?1P.E DDWS=$E(DDWS,2,999)
 I DDWANS["+" S DDWS=$$SCREEN+DDWS
 E  I DDWANS["-" S DDWS=$$SCREEN-DDWS
 I DDWS<1 S DDWS=1
 E  I DDWS>$$LTOSC(DDWCNT) S DDWS=$$LTOSC(DDWCNT)
 D LINE(DDWS-1*DDWMR+1)
 Q
 ;
GOTOL ;Go to a line
 N DDWLN
 S DDWLN=DDWANS
 S:DDWLN?1A.E DDWLN=$E(DDWLN,2,999)
 S:DDWLN?1P.E DDWLN=$E(DDWLN,2,999)
 I DDWANS["+" S DDWLN=DDWA+DDWRW+DDWLN
 E  I DDWANS["-" S DDWLN=DDWA+DDWRW-DDWLN
 I DDWLN<1 S DDWLN=1
 E  I DDWLN>DDWCNT S DDWLN=DDWCNT
 D LINE(DDWLN)
 Q
 ;
GOTOC ;Go to a column
 N DDWCOL
 S DDWCOL=DDWANS
 S:DDWCOL?1A.E DDWCOL=$E(DDWCOL,2,999)
 S:DDWCOL?1P.E DDWCOL=$E(DDWCOL,2,999)
 I DDWANS["+" S DDWCOL=DDWC+DDWCOL
 E  I DDWANS["-" S DDWCOL=DDWC-DDWCOL
 I DDWCOL<1 S DDWCOL=1
 E  I DDWCOL>246 S DDWCOL=246
 D POS(DDWRW,DDWCOL,"R")
 Q
 ;
LINE(DDWLN,DDWCOL) ;Adjust arrays and position cursor on line DDWLN
 I $G(DDWCOL)'="E",'$G(DDWCOL) S DDWCOL=1
 S:DDWLN>DDWCNT DDWLN=DDWCNT
 I DDWLN>DDWA,DDWLN'>(DDWA+DDWMR-1) D
 . D POS(DDWLN-DDWA,DDWCOL,"RN")
 E  I DDWLN>DDWA D
 . D SHFTDN^DDW3(DDWLN,DDWCOL),POS(DDWLN-DDWA,DDWCOL,"RN")
 E  D
 . D SHFTUP^DDW3(DDWLN),POS(1,DDWCOL,"RN")
 Q
 ;
ASK(DDWLC,DDWS,DDWLEN,DDWDEF,DDWVAL,DDWHLP,DDWANS,DDWCOD) ;Prompt user
 N DDWI
 D CUP(DDWMR-DDWLC,1)
 W $P(DDGLGRA,DDGLDEL)_$TR($J("",IOM)," ",$P(DDGLGRA,DDGLDEL,3))_$P(DDGLGRA,DDGLDEL,2)
 F DDWI=DDWMR-DDWLC+1:1:DDWMR D CUP(DDWI,1) W $P(DDGLCLR,DDGLDEL)
 K DDWANS F  D PROMPT Q:$D(DDWANS)
 ;
 F DDWI=DDWMR-DDWLC:1:DDWMR D
 . D CUP(DDWI,1)
 . W $P(DDGLCLR,DDGLDEL)_$E(DDWL(DDWI),1+DDWOFS,IOM+DDWOFS)
 D POS(DDWRW,DDWC,"RN")
 Q
 ;
PROMPT ;Issue read
 N DDWERR,DDWX
 D CUP(DDWMR-DDWLC+1,1) W DDWS_$P(DDGLCLR,DDGLDEL)
 D EN^DIR0(IOTM+DDWMR-DDWLC-1,$L(DDWS),DDWLEN,1,$G(DDWDEF),245,"","","AKTW",.DDWX,.DDWCOD)
 ;
 I DDWX?1."?",$D(DDWHLP)>9!($G(DDWHLP)]"") D HELP(.DDWHLP) Q
 I $G(DDWVAL)]"" X DDWVAL I $D(DDWERR) W $C(7) D HELP(.DDWERR) Q
 S DDWANS=DDWX
 Q
 ;
VALGTO ;Validate DDWX
 N DDWCH
 Q:U[DDWX
 S DDWERR=$$EZBLD^DIALOG(1401) ;**
 Q:DDWX'?.1A.1P1.15N
 I DDWX?1A.E S DDWCH=$E(DDWX) Q:"SsLlCc"'[DDWCH
 I DDWX?.E1P.E I DDWX'["+",DDWX'["-" Q
 K DDWERR
 Q
 ;
HELP(DDWMSG) ;Print message
 N DDWI,DDWEC
 S:$D(DDWMSG)<9 DDWMSG(1)=DDWMSG
 S DDWEC=$O(DDWMSG(""),-1)
 F DDWI=2:1:DDWLC D
 . D CUP(DDWMR-DDWLC+DDWI,1)
 . W $P(DDGLCLR,DDGLDEL)_$G(DDWMSG(DDWI-DDWLC+DDWEC))
 Q
 ;
SCREEN() ;Return current screen
 Q DDWA+DDWRW-1\DDWMR+1
 ;
LTOSC(L) ;Convert line number to page number
 Q L-1\DDWMR+1
 ;
CUP(Y,X) ;Pos cursor
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q

DDWH
DDWH ;SFISC/MKO-SCREEN EDITOR HELP ;08:38 AM  23 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
HLP ;
 N DX,DY,DDWI
 ;
 D HLP^DDGLIBH(9211,9214,"DDWH",IOBM+2)
 D BOX^DDW1
 ;
 S DY=IOTM-1,DX=0 X IOXY
 F DDWI=1:1:DDWMR W $P(DDGLCLR,DDGLDEL)_$$LINE(DDWI,$G(DDWMARK))_$S(DDWI<DDWMR:$C(13,10),1:"")
 ;
 D:$D(DDWMARK) IND^DDW7(1)
 Q
 ;
LINE(DDWI,DDWMARK) ;
 N DDWX
 S DDWX=$E(DDWL(DDWI),1+DDWOFS,IOM+DDWOFS)
 Q:$G(DDWMARK)="" DDWX
 ;
 N DDWR1,DDWC1,DDWR2,DDWC2
 S DDWR1=$P(DDWMARK,U,1),DDWC1=$P(DDWMARK,U,2)
 S DDWR2=$P(DDWMARK,U,3),DDWC2=$P(DDWMARK,U,4)
 ;
 I DDWI'<(DDWR1-DDWA),DDWI'>(DDWR2-DDWA) D
 . N DDWX1,DDWX2
 . S DDWX1=$S(DDWI=(DDWR1-DDWA):DDWC1,1:1)
 . S DDWX2=$S(DDWI=(DDWR2-DDWA):DDWC2,1:999)
 . S DDWX=$E(DDWL(DDWI),1+DDWOFS,DDWX1-1)_$P(DDGLVID,DDGLDEL,6)_$E(DDWL(DDWI),$$MAX(DDWX1,1+DDWOFS),$$MIN(DDWX2,IOM+DDWOFS))_$P(DDGLVID,DDGLDEL,10)_$E(DDWL(DDWI),$$MAX(DDWX2+1,1+DDWOFS),IOM+DDWOFS)
 Q DDWX
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
MAX(X,Y) ;
 Q $S(X>Y:X,1:Y)

DDWK
DDWK ;SFISC/MKO-SCREEN EDITOR MAIN ROUTINE ;11:32 AM  25 Aug 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
GETKEY ;Get key sequences and defaults
 N AU,AD,AR,AL,F1,F2,F3,F4
 N FIND,SELECT,INSERT,REMOVE,PREVSC,NEXTSC
 N A1,A2,A3,I,K,N,T
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S AR=$P(DDGLKEY,U,4)
 S AL=$P(DDGLKEY,U,5)
 S F1=$P(DDGLKEY,U,6)
 S F2=$P(DDGLKEY,U,7)
 S F3=$P(DDGLKEY,U,8)
 S F4=$P(DDGLKEY,U,9)
 S FIND=$P(DDGLKEY,U,10)
 S SELECT=$P(DDGLKEY,U,11)
 S INSERT=$P(DDGLKEY,U,12)
 S REMOVE=$P(DDGLKEY,U,13)
 S PREVSC=$P(DDGLKEY,U,14)
 S NEXTSC=$P(DDGLKEY,U,15)
 ;
 S A1="DDW(""IN"")",A2="DDW(""OT"")",A3=0
 S (DDW("IN"),DDW("OT"))=""
 F I=1:1 S T=$P($T(MAP+I),";;",2,999) Q:T=""  D
 . S @("K="_$P(T,";",2)),T=$P(T,";")
 . I K]"",@A1'[(U_K) D
 .. I $L(@A1)+$L(K)+2>255!($L(@A2)+$L(T)+1>255) D
 ... S @A1=@A1_U,$E(@A2,$L(@A2))=""
 ... S A3=A3+1,A1=$NA(@A1@(A3)),A2=$NA(@A2@(A3))
 ... S (@A1,@A2)=""
 .. S @A1=@A1_U_K
 .. S @A2=@A2_T_U
 S @A1=@A1_U,$E(@A2,$L(@A2))=""
 Q
 ;
MAP ;Keys for main screen
 ;;UP;AU
 ;;DN;AD
 ;;RT;AR
 ;;LT;AL
 ;;TAB;$C(9)
 ;;PUP;F1_AU
 ;;PUP;PREVSC
 ;;PDN;F1_AD
 ;;PDN;NEXTSC
 ;;JLT;F1_AL
 ;;JRT;F1_AR
 ;;LB;FIND
 ;;LB;F1_F1_AL
 ;;LE;SELECT
 ;;LE;F1_F1_AR
 ;;TOP;F1_"T"
 ;;BOT;F1_"B"
 ;;WRT;F1_" "
 ;;WRT;$C(12)
 ;;WLT;$C(10)
 ;;RUB;$C(127)
 ;;RUB;$C(8)
 ;;DEL;REMOVE
 ;;DEL;F4
 ;;DEOL;F1_F2
 ;;BRK;$C(13)
 ;;JN;F1_"J"
 ;;RFT;F1_"R"
 ;;ST;F1_"?"
 ;;XLN;F1_"D"
 ;;TST;F1_$C(9)
 ;;TSALL;F1_F1_$C(9)
 ;;LST;F1_","
 ;;RST;F1_"."
 ;;WRM;F2
 ;;RPM;INSERT
 ;;RPM;F3
 ;;SV;F1_"S"
 ;;SW;F1_"A"
 ;;EX;F1_"E"
 ;;QT;F1_"Q"
 ;;QT;$C(5)
 ;;HLP;F1_"H"
 ;;DLW;$C(23)
 ;;MRK;F1_"M"
 ;;UMK;F1_F1_"M"
 ;;CUT;F1_"X"
 ;;CPY;F1_"C"
 ;;PST;F1_"V"
 ;;FND;F1_"F"
 ;;NXT;F1_"N"
 ;;GTO;F1_"G"
 ;;CHG;F1_"P"
 ;;AUT;F1_F1_"S"
 ;;';$C(27)_"Q"
 ;;';$C(27)_"R"
 ;;";$C(27)_"S"
 ;;";$C(27)_"T"
 ;;

DDWT1
DDWT1 ;SFISC/PD KELTZ,MKO-READ AND PROCESS ;12AUG2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D LOAD^DDW1 K DUOUT
 I '$G(DDWRWSET) D BOT^DDW3 I $L(DDWN) D BREAK^DDW5() ;GFT -- GO TO BOTTOM OF TEXT
 F  D GETIN Q:$D(DDWFIN)
 Q
 ;
GETIN ;Get input
 I DDWC'>DDWRMAR,DDWC-DDWOFS<IOM,DDWC>$L(DDWN)!DDWREP,'$D(DDWMARK) D
 . N DDWANS
 . D PREAD($$MIN(DDWRMAR,IOM-1+DDWOFS)-DDWC+1,DDWTO,.DDWANS,.DDWQ)
 . I DDWANS]"" D
 .. S DDWED=1
 .. I DDWSTAT,DDWQ="TO",DDWTO<DTIME S DDWQ=""
 .. S $E(DDWN,DDWC,DDWC+$L(DDWANS)-1)=DDWANS,DDWL(DDWRW)=DDWN
 .. S DDWC=DDWC+$L(DDWANS)
 E  D
 . D READ(DDWTO,.DDWQ)
 . D:$L(DDWQ)=1 DISPL
 ;
 I DDWSTAT D
 . I DDWQ="TO" D
 .. I $G(DDWTC) S:$$HDIFF(DDWTC,$H)+1<DTIME DDWQ=""
 .. E  S DDWTC=$H,DDWQ="" D:DDWSTAT STATUS
 . E  K DDWTC
 ;
 I $G(DDWAUTO),DDWQ'="TO",$$HDIFF(DDWAUTO("H"),$H)'<DDWAUTO("S") D AUTOSV^DDW1
 ;
 I $L(DDWQ)>1 D @DDWQ D:DDWSTAT STATUS
 Q
 ;
DISPL ;Display char
 I DDWC>245 W $C(7) Q
 ;
 S DDWED=1
 I $D(DDWMARK),DDWRW+DDWA'>$P(DDWMARK,U,3) D UNMARK^DDW7
 S:DDWC-1>$L(DDWN) DDWN=DDWN_$J("",DDWC-$L(DDWN)-1)
 S (DDWN,DDWL(DDWRW))=$E(DDWN,1,DDWC-1)_DDWQ_$E(DDWN,DDWC+DDWREP,999)
 S DDWC=DDWC+1
 ;
 I DDWREP W DDWQ
 E  D
IC . I 0  ;$P(DDGLED,DDGLDEL,5)]"" W $P(DDGLED,DDGLDEL,5)_DDWQ   GFT --  DON'T USE "INSERT CHARACTER"  IT SEEMS NOT TO WORK
 . E  W DDWQ_$E(DDWN,DDWC,IOM+DDWOFS)
 D POS(DDWRW,DDWC,"R")
 D:$L(DDWN)>DDWRMAR WRAP^DDW5
 Q
 ;
RUB N DDWX
 S DDWED=1
 I $D(DDWMARK) D CHKDEL^DDW9(.DDWX) Q:DDWX
 ;
 I DDWC=1 D
 . I DDWRW=1 D
 .. I 'DDWA W $C(7)
 .. E  D MVBCK^DDW3(1),POS(1,"E","R")
 . E  D POS(DDWRW-1,"E","RN")
 E  D
 . S DDWC=DDWC-1,$E(DDWN,DDWC)="",DDWL(DDWRW)=DDWN
 . S DDWX=$E(DDWN,IOM+DDWOFS)
 . I DDWC-DDWOFS>0 D
 .. D CUP(DDWRW,DDWC-DDWOFS)
 .. I $P(DDGLED,DDGLDEL,6)]"" D
 ... W $P(DDGLED,DDGLDEL,6)
 ... I DDWX]" " D CUP(DDWRW,IOM) W DDWX D CUP(DDWRW,DDWC-DDWOFS)
 .. E  W $E(DDWN_" ",DDWC,IOM+DDWOFS) D CUP(DDWRW,DDWC-DDWOFS)
 . E  D POS(DDWRW,DDWC)
 Q
 ;
DEL N DDWX
 S DDWED=1
 I $D(DDWMARK) D CHKDEL^DDW9(.DDWX) Q:DDWX
 ;
 I DDWC>$L(DDWN) D  Q
 . I DDWN?." " D
 .. N DDWLAST
 .. S DDWLAST=DDWRW+DDWA=DDWCNT
 .. D XLINE^DDW5()
 .. D:DDWLAST POS(DDWRW,"E","R")
 . E  D
 .. N DDWY,DDWX
 .. S DDWY=DDWRW+DDWA,DDWX=DDWC
 .. D JOIN^DDW6
 .. D POS(DDWY-DDWA,DDWX,"RN")
 ;
 S $E(DDWN,DDWC)="",DDWL(DDWRW)=DDWN,DDWX=$E(DDWN,IOM+DDWOFS)
 I $P(DDGLED,DDGLDEL,6)]"" D
 . W $P(DDGLED,DDGLDEL,6)
 . I DDWX]" " D CUP(DDWRW,IOM) W DDWX D CUP(DDWRW,DDWC-DDWOFS)
 E  D
 . W $E(DDWN_" ",DDWC,IOM+DDWOFS)
 . D CUP(DDWRW,DDWC-DDWOFS)
 Q
 ;
STATUS N DDWX,DDWS
 S DDWS="Scr "_(DDWA+DDWRW-1\DDWMR+1)_" of "_(DDWCNT-1\DDWMR+1)
 S DDWX="Ln "_(DDWA+DDWRW)_" of "_DDWCNT
 S $E(DDWS,IOM\2+1-($L(DDWX)\2),999)=DDWX
 S DDWX="Col "_DDWC
 S $E(DDWS,IOM-$L(DDWX),999)=DDWX
 D CUP(DDWMR+2,1) W $P(DDGLCLR,DDGLDEL)_DDWS
 D POS(DDWRW,DDWC)
 Q
 ;
UP I DDWRW>1 D
 . D POS(DDWRW-1,DDWC,"RN")
 E  I DDWA D
 . D MVBCK^DDW3(1)
 E  W $C(7)
 I DDWC>246,$L(DDWN)<246 D POS(DDWRW,246,"R")
 Q
DN I DDWN="",DDWA+DDWRW>DDWCNT W $C(7) Q  ;**GFT  DOWN-ARROW: ALLOW GOING TO ENDING BLANK LINE
 I DDWRW<DDWMR D
 . D POS(DDWRW+1,DDWC,"RN")
 E  I DDWSTB D
 . D MVFWD^DDW3(1)
 E  W $C(7) Q
 I DDWC>246,$L(DDWN)<246 D POS(DDWRW,246,"R")
 Q
RT I DDWC>245,DDWC>$L(DDWN) W $C(7)
 E  D POS(DDWRW,DDWC+1,"R")
 Q
LT I DDWC=1 D
 . I DDWRW=1,'DDWA W $C(7)
 . E  D UP,POS(DDWRW,"E","R")
 E  D POS(DDWRW,DDWC-1,"R")
 Q
 ;
SV K DDWED G SV^DDW1
SW D SAVE^DDW1 S DDWFIN="",DIWESW=1 Q
EX D SAVE^DDW1 S DDWFIN="" Q
QT S DUOUT=1 G QUIT^DDW1 ;GFT
TO D SAVE^DDW1 S DTOUT=1,DDWFIN="" W $C(7) Q
HLP D HLP^DDWH,POS(DDWRW,DDWC) Q
AUT G AUTOTM^DDW1
 ;
TST G TSET^DDW2
TSALL G TSALL^DDW2
LST G LSET^DDW2
RST G RSET^DDW2
WRM G WRAPM^DDW2
RPM G REPLM^DDW2
ST G STAT^DDW2
 ;
TOP G TOP^DDW3
BOT G BOT^DDW3
 ;
PDN G PGDN^DDW4
PUP G PGUP^DDW4
TAB G TAB^DDW4
JLT G JLEFT^DDW4
JRT G JRIGHT^DDW4
LB G LBEG^DDW4
LE G LEND^DDW4
WRT G WORDR^DDW4
WLT G WORDL^DDW4
DLW S DDWED=1 G DELW^DDW4
DEOL S DDWED=1 G DEOL^DDW4
 ;
BRK I $G(DDWCNT)>1,$G(DDWN)="",$G(DDWL(DDWRW-1))="",DDWA+DDWRW'<DDWCNT D SAVE^DDW1 S DDWFIN="",DDWCNT=DDWCNT-1 Q  ;**GFT  GET OUT WITH TWO RETURNS AT BOTTOM
 S DDWED=1 D BREAK^DDW5() Q
XLN S DDWED=1 D XLINE^DDW5() D:DDWC'=1 POS(DDWRW,1,"R") Q
 ;
JN S DDWED=1 G JOIN^DDW6
RFT S DDWED=1 G REFMT^DDW6
 ;
MRK G MARK^DDW7
UMK G UNMARK^DDW7
 ;
CPY D COPY^DDW8() Q
CUT D CUT^DDW8() Q
PST D PASTE^DDW8() Q
 ;
FND G FIND^DDWF
 ;
NXT G NEXT^DDWF
GTO G GOTO^DDWG
CHG G CHG^DDWC
 Q
 ;
READ(DDWTO,Y) ;Out: Y = Char or mnemonic
 F  D  Q:Y'=-1
 . R *Y:DDWTO
 . I Y>127 D HS(.Y)
 . I Y>31,Y<127 S Y=$C(Y) Q
 . I Y<0 S Y="TO" Q
 . D MNE(.Y)
 Q
 ;
PREAD(DDWLEN,DDWTO,DDWST,Y) ;
 ;In:  DDWLEN = # chars to read
 ;Out:  DDWST = String
 ;          Y = Mnemonic, Null if DDWLEN chars read or invalid
 X DDGLZOSF("EON")
 R DDWST#DDWLEN:DDWTO E  S Y="TO" Q
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMRD")
 ;
 D:DDWST?.E1.C.E H(.DDWST)
 ;
 I $C(Y)?1C,Y D
 . D MNE(.Y)
 . I Y=-1 S Y=""
 . E  I $L(Y)=1 W Y S DDWST=DDWST_Y,Y=""
 E  S Y=""
 Q
 ;
MNE(Y) ;In:  Y = Ascii value of first character
 ;Out: Y = Mnemonic, or -1 if invalid
 N S,F,T
 I Y=13 S DDWHLOG=$P($H,",",2)
 E  I Y=10,$D(DDWHLOG)#2,$P($H,",",2)-DDWHLOG<1 K DDWHLOG S Y=-1 Q
 E  K DDWHLOG
 S S="",F=0,T="DDW(""IN"")"
 F  D MNELOOP(.S,.Y,.T,.F) Q:F
 Q
 ;
MNELOOP(S,Y,T,F) ;Read more
 ;In/Out:
 ;  S = string of input chars
 ;  Y = ascii of current char
 ;  T = table under consideration
 ;Out:
 ;  Y = mnemonic, or -1
 ;  F = 1 : done
 ;
 N E
 S S=S_$C(Y)
 I @T'[(U_S) D
 . I $C(Y)?1L D
 .. S $E(S,$L(S))=$C(Y-32)
 .. S:@T'[(U_S_U) E=1
 . E  S E=1
 I $T,$G(E) D  Q
 . S T=$Q(@T)
 . I T]"" S $E(S,$L(S))=""
 . E  D FLUSH S F=1,Y=-1
 ;
 I @T[(U_S_U),S'=$C(27) D  Q
 . S Y=$P(@$TR(T,"IN","OT"),U,$L($P(@T,U_S_U),U)),F=1
 ;
 R *Y:5 I Y=-1 D FLUSH S F=1
 Q
 ;
H(DDWST) ;
 S DDWST=$TR(DDWST,$C(145,146,147,148),"''""""")
 I DDWST?.E1.C.E D
 . N DDWCON,DDWI
 . S DDWCON=""
 . F DDWI=128:1:255 S DDWCON=DDWCON_$C(DDWI)
 . S DDWST=$TR(DDWST,DDWCON,$J(" ",128))
 D POS(DDWRW,DDWC)
 W DDWST
 Q
 ;
HS(Y) ;
 I Y>144,Y<149 S Y=$A($E("''""""",Y-144))
 E  S Y=32
 Q
 ;
FLUSH ;
 N DDWX
 W $C(7) F  R *DDWX:0 E  Q
 Q
 ;
CUP(Y,X) ;
 S DY=IOTM+Y-2,DX=X-1 X IOXY
 Q
 ;
POS(R,C,F) ;Pos cursor based on char pos C
 N DDWX
 S:$G(C)="E" C=$L($G(DDWL(R)))+1
 S:$G(F)["N" DDWN=$G(DDWL(R))
 S:$G(F)["R" DDWRW=R,DDWC=C
 ;
 S DDWX=C-DDWOFS
 I DDWX>IOM!(DDWX<1) D SHIFT^DDW3(C,.DDWOFS)
 S DY=IOTM+R-2,DX=C-DDWOFS-1 X IOXY
 Q
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)
 ;
HDIFF(H1,H2) ;# seconds between two $H's
 Q (H2-H1)*86400+$P(H2,",",2)-$P(H1,",",2)

DDXP
DDXP ;SFISC/DPC-EXPORT MENU DRIVER ;12:09 PM  16 Jun 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NOKL ;
 I ($G(^DIC(.44,0,"GL"))'="^DIST(.44,")!($G(^DIC(.81,0,"GL"))'="^DI(.81,") W !!,$C(7),"SORRY. You cannot use the Data Export options",!,"because you do not have the necessary files on your system." G Q^DII1
 S DIK="^DOPT(""DDXP"","
 I $D(^DOPT("DDXP",5)) G CHOOSE
 S ^DOPT("DDXP",0)="DATA EXPORT TO FOREIGN FORMAT OPTION^1.01^" K ^("B")
 F I=1:1:5 S ^DOPT("DDXP",I,0)=$P($T(@I),";;",2)
 K I D IXALL^DIK
CHOOSE ;
 W ! S DIC=DIK,DIC(0)="AEQI" D ^DIC K DIC,DIK
 I Y'<0 S X=+Y K Y D @X G NOKL
 W !
 G Q^DII1
 ;
1 ;;DEFINE FOREIGN FILE FORMAT
 S DDXP=1 D EN1^DDXP1
 D Q
 Q
 ;
2 ;;SELECT FIELDS FOR EXPORT
 S DDXP=2 D EN1^DDXP2
 D Q
 Q
 ;
3 ;;CREATE EXPORT TEMPLATE
 S DDXP=3 D EN1^DDXP3
 D Q
 Q
 ;
4 ;;EXPORT DATA
 S DDXP=4 D EN1^DDXP4
 D Q
 Q
 ;
5 ;;PRINT FORMAT DOCUMENTATION
 S DDXP=5 D EN1^DDXP5
 D Q
 Q
Q ;
 K DDXP,X,DIRUT,DUOUT,DTOUT Q
 ; Export API
EXPORT(DDXPFINO,DDXPXTNM,DDXPTMDL,DDXPBY,FR,TO,DIS,DISTOP,IOP,DQTIME) ;
 ; DDXPFINO = File Number or "1.1^<file number>"
 ; DDXPXTNM = Export Template Name
 ; DDXPTMDL = 0=Export Template SHOULD NOT Be Deleted
 ;            1=Export Template SHOULD Be Deleted
 ; DDXPBY = Sort Template Name
 ; [.]FR = FROM Values as Documentated in DIP
 ; [.]TO = TO Values as Documentated in DIP
 ; .DIS = DIS array as Documentated in DIP
 ; [.]DISTOP = DISTOP array as Documentated in DIP
 ; IOP = IOP as Documentated in DIP
 ; DQTIME = DQTIME as Documentated in DIP
 G EN2^DDXP4

DDXP1
DDXP1 ;SFISC/DPC-CREATE/EDIT FOREIGN FORMAT ;1/8/93  09:09
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN1 ;
 K DA S DLAYGO=0
GETFF ;
 W !
 S DIC="^DIST(.44,",DIC(0)="QEALMZ" D ^DIC K DIC
 G:Y=-1 QUIT
 S DDXPFMNM=$P(Y,U,2),DDXPFMNO=+Y
 I $P(Y(0),U,9) D USEDFF G:'($D(DA)#2) GETFF
EDITFF ;
 S:'($D(DA)#2) DA=DDXPFMNO S DDSFILE="^DIST(.44,",DR="[DDXP FF FORM1]"
 D ^DDS
QUIT ;
 K DDXPFMNM,DDXPFMNO,DA,DR,DDSFILE,Y,DLAYGO,X
 Q
USEDFF ;
 W !!,DDXPFMNM_" foreign format has been used to create an Export Template."
 W !,"Therefore, its definition cannot be changed.",!
 S DIR(0)="YA",DIR("A")="Do you want to see the contents of "_DDXPFMNM_" format? ",DIR("B")="NO"
 D ^DIR K DIR Q:$D(DIRUT)
 I Y W !! S DIC="^DIST(.44,",DA=DDXPFMNO D EN^DIQ K DIC,DA
 S DIR(0)="YA",DIR("A")="Do you want to use "_DDXPFMNM_" as the basis for a new format? ",DIR("B")="NO"
 D ^DIR K DIR Q:$D(DIRUT)!('Y)
NEWFF S DIC="^DIST(.44,",DIC(0)="QEAL",DIC("A")="Name for new FOREIGN FORMAT: " W !
 D ^DIC K DIC Q:$D(DTOUT)!($D(DUOUT))!(X="")
 I '$P(Y,U,3) W !,$C(7),$P(Y,U,2)_" is already being used.",!,"Please enter a new name for the format.",! G NEWFF
 S DDXPFMNM=$P(Y,U,2),(DIT("F"),DIT("T"))="^DIST(.44,",DA("F")=DDXPFMNO,(DA("T"),DDXPFMNO)=+Y D EN^DIT0
 S DIE="^DIST(.44,",DA=DDXPFMNO,DR="40///0" D ^DIE K DIT,DIE,DR,Y
 Q
 ;
FORMVAL ;
 N FLDLM,FIXREC,MSGCNT,ERRMSG,USEQT,MAXLEN,SUBNULL S DDSERROR=0,MSGCNT=1
 S FLDLM=$$GET^DDSVAL(DIE,DA,1),FIXREC=$$GET^DDSVAL(DIE,DA,5),USEQT=$$GET^DDSVAL(DIE,DA,8),MAXLEN=$$GET^DDSVAL(DIE,DA,7),SUBNULL=$$GET^DDSVAL(DIE,DA,11)
 I FIXREC D
 . I FLDLM]"" D
 . . S DDSERROR=DDSERROR+1
 . . S ERRMSG(MSGCNT)="You cannot specify a record delimiter and",MSGCNT=MSGCNT+1
 . . S ERRMSG(MSGCNT)="indicate that record lengths are fixed",MSGCNT=MSGCNT+1
 . . S ERRMSG(MSGCNT)="for the same foreign format.",MSGCNT=MSGCNT+1
 . . Q
 . I USEQT D
 . . S DDSERROR=DDSERROR+1
 . . S ERRMSG(MSGCNT)="You cannot choose to have non-numeric fields quoted",MSGCNT=MSGCNT+1
 . . S ERRMSG(MSGCNT)="when you are exporting fixed length records.",MSGCNT=MSGCNT+1
 . . Q
 . I MAXLEN>255 D
 . . S DDSERROR=DDSERROR+1
 . . S ERRMSG(MSGCNT)="You cannot set the Maximum Record Length larger than 255 characters ",MSGCNT=MSGCNT+1
 . . S ERRMSG(MSGCNT)="when you are defining a fixed record length format.",MSGCNT=MSGCNT+1
 . . Q
 . I SUBNULL]"" D
 . . S DDSERROR=DDSERROR+1
 . . S ERRMSG(MSGCNT)="During fixed length exports, null values will always be exported as nothing.",MSGCNT=MSGCNT+1
 . . S ERRMSG(MSGCNT)="So, you cannot specify characters to be substituted for null numeric values.",MSGCNT=MSGCNT+1
 . . Q
 . Q
 I DDSERROR D
 . S ERRMSG(MSGCNT)=" ",MSGCNT=MSGCNT+1
 . S ERRMSG(MSGCNT)="Please correct "_$S(DDSERROR>1:"these discrepancies.",1:"this discrepancy."),MSGCNT=MSGCNT+1
 . S ERRMSG(MSGCNT)="You CANNOT save the form until you correct it!"
 . Q
 D:DDSERROR MSG^DDSUTL(.ERRMSG)
 K:'DDSERROR DDSERROR
 Q

DDXP2
DDXP2 ;SFISC/DPC-SELECTED FIELDS FOR EXPORT ;10/11/94  14:34
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN1 ;
 N Y,D,DICS D ^DICRW I Y=-1 G QUIT
 S Q="""",C=",",DC=0,L=1,DI=DIC,DALL(1)=1 W !
 D ^DIP2
 I $D(DDXPFDTM) S DIE="^DIPT(",DA=DDXPFDTM,DR="8///7" D ^DIE
QUIT ;
 K C,DA,DALL,DC,DI,DIE,DIC,DR,DTOUT,DUOUT,L,Q
 Q
VALALL ;
 W !,$C(7),"SORRY.  When choosing export fields, you cannot use ALL to select all fields.",!
 S Y=0 K X
 Q
VAL1 ;validates raw user input -- X contains user input
 S DDXPNG=0
 F DDXPCK=";C",";D",";L",";N",";R",";S",";T",";W",";X" D
 . I X[DDXPCK S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot add "_DDXPCK_" to the export field specifications.",!
 . Q
 F DDXPCK="+","#","*","&","!" D
 . I $E(X)=DDXPCK S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot choose the "_DDXPCK_" statistical operator when selecting fields for export.",!
 . Q
 I $E(X,$L(X))=":" S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot jump to another file when selecting fields for export.",!
 I X[";""" S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot enter a custom heading when selecting fields for export."
 K:DDXPNG X K DDXPNG,DDXPCK
 Q
VAL2 ;validates found field -- Y(0) contains 0-node of field DD
 S DDXPNG=0
 S %=+$P(Y(0),U,2) I '% G VAL2OUT
 I $P($G(^DD(%,.01,0)),U,2)["W" S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot choose a word processing field for export.",!
VAL2OUT K:DDXPNG Y(0) K %,DDXPNG
 Q
VAL3 ;validates expression returned from DICOMP -- S contains expression
 S DDXPNG=0
 I S[";W"!(S[";m") S DDXPNG=1 W !!,$C(7),"SORRY.  That response is not acceptable when selecting fields for export.",!
 K:DDXPNG S K DDXPNG
 Q

DDXP3
DDXP3 ;SFISC/DPC-CREATE EXPORT TEMPLATE ;10/14/94  14:56
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN1 ;
 N DDXPNOUT
 N T,Q S T="~",Q="""" K ^TMP($J,"DIP")
 N Y,D,DICS D ^DICRW I Y=-1 G QUIT
 S DDXPFINO=+Y
FLDT ;
 D FLDTEMP^DDXP33 G:DDXPOUT QUIT
FRMT ;
 S DIC="^DIST(.44,",DIC(0)="QEAMZ" D ^DIC K DIC
 G:Y=-1 QUIT
 S DDXPFMNO=+Y,DDXPFMZO=Y(0)
XPTEMP ;
 D XPT^DDXP31 G:DDXPOUT QUIT
 D FLOAD,CAPDT^DDXP32 G:DDXPOUT QUIT
 I $P(DDXPFMZO,U,6) D LENGTH^DDXP31 G:DDXPOUT QUIT
 I $P(DDXPFMZO,U,7) D FLDNAME^DDXP31 G:DDXPOUT QUIT
 I $P(DDXPFMZO,U,11) D DTYPE^DDXP31 G:DDXPOUT QUIT
 D SETFLD^DDXP32
 I '$P(DDXPFMZO,U,8) D IOM^DDXP31 G:DDXPOUT QUIT S ^DIPT(DDXPXTNO,"IOM")=$G(DDXPIOM)
 D SETEMP^DDXP32
SETDELM ;
 I $TR($P(DDXPFMZO,U,2),"ask","ASK")="ASK" D ASKDELM^DDXP31 G:DDXPOUT QUIT
 S:'$D(DDXPDELM) DDXPDELM=$P(DDXPFMZO,U,2)
 I DDXPDELM]"" S DDXPDELM=$$BLDELIM(DDXPDELM)
TPROC ;
 S DDXPFONO=1,DDXPFOUT="",DDXPXPOS=1
 F DDXPFLD=1:1:DDXPTOTF D
 . S (DDXPNPC,DDXPRNPC)=^TMP($J,"TIN",DDXPFLD)
 . I $P(DDXPFMZO,U,10),'DDXPNOUT(DDXPFLD) D QUOT^DDXP32
 . I $P(DDXPFMZO,U,6) D FIXLEN
 . I '$P(DDXPFMZO,U,6),((DDXPFLD'=1)!(DDXPNPC'=DDXPRNPC)) D RUNON
 . I $P(DDXPFMZO,U,10),'DDXPNOUT(DDXPFLD) D QUOT^DDXP32
 . I DDXPDELM]"",'DDXPNOUT(DDXPFLD) D DELIM
 . D FPROC
 . Q
RECPROC ;
 I '$P(DDXPFMZO,U,12),DDXPDELM]"" S DDXPFOUT=$P(DDXPFOUT,T,1,($L(DDXPFOUT,T)-2))_T
 I $TR($P(DDXPFMZO,U,3),"ask","ASK")="ASK" D ASKRDLM^DDXP31 G:DDXPOUT QUIT
 S:'$D(DDXPRDLM) DDXPRDLM=$P(DDXPFMZO,U,3)
 I DDXPRDLM]"" S DDXPRDLM=$$BLDELIM(DDXPRDLM) D RECDELIM D FPROC
FINISH ;
 I DDXPFOUT]"" S ^DIPT(DDXPXTNO,"F",DDXPFONO)=DDXPFOUT
 S DIE="^DIST(.44,",DA=DDXPFMNO,DR="40///1" D ^DIE
 S DIE="^DIPT(",DA=DDXPFDTM,DR="110///1" D ^DIE K DIE,DA,DR
 W !!,?10,"Export Template created.",!
 I $G(DDXPTMDL) D
 . S DIK="^DIPT(",DA=DDXPFDTM D ^DIK K DIK,DA
 . W ?10,"Selected Fields template "_DDXPFDNM_" deleted.",!
 . Q
 G DONE
QUIT ;
 W !!,?10,"Export Template NOT created!!"
 I $G(DDXPTMDL) W !,?10,"Selected Fields template "_DDXPFDNM_" not deleted."
 I $D(DDXPXTNO) S DIK="^DIPT(",DA=DDXPXTNO D ^DIK K DIK,DA
DONE ; 
 K X,Y,DDXPDELM,DDXPDT,DDXPFDTM,DDXPFCAP,DDXPFFNM,DDXPFIN,DDXPFINO,DDXPFLD,DDXPIOM,DDXPFLEN,DDXPFMNO,DDXPFMZO,DDXPFONO,DDXPTLEN,DDXPTMDL
 K DDXPFDNM,DDXPFOUT,DDXPLNMX,DDXPRNPC,DDXPNPC,DDXPOUT,DDXPTIN,DDXPATH,DDXPTOTF,DDXPXPOS,DDXPXTNM,DDXPXTNO,DDXPRDLM,Q,T,DTOUT,DUOUT,DIRUT
 K ^TMP($J,"DIP")
 Q
FLOAD ;
 S DDXPFLD=0
 F FIN=0:0 S FIN=$O(^DIPT(DDXPFDTM,"F",FIN)) Q:FIN=""  S DDXPFIN=^(FIN) D
 . F TCNT=1:1 S DDXPTIN=$P(DDXPFIN,T,TCNT) Q:DDXPTIN=""  D
 . . S DDXPFLD=DDXPFLD+1
 . . S ^TMP($J,"TIN",DDXPFLD)=DDXPTIN
 . . S DDXPNOUT(DDXPFLD)=$$NOUT(DDXPTIN)
 . . Q
 . Q
 S DDXPTOTF=DDXPFLD
 K FIN,TCNT Q
FIXLEN ;
 S DDXPLNMX=$S(+$P(DDXPFMZO,U,8):$P(DDXPFMZO,U,8),$G(DDXPIOM):DDXPIOM,1:80)
 I DDXPXPOS+DDXPFLEN(DDXPFLD)>(DDXPLNMX+1) S DDXPXPOS=1
 S DDXPNPC=DDXPNPC_";L"_DDXPFLEN(DDXPFLD)_";C"_DDXPXPOS
 S DDXPXPOS=DDXPXPOS+DDXPFLEN(DDXPFLD)
 Q
RUNON ;
 S DDXPNPC=DDXPNPC_";X"
 Q
DELIM ;
 S DDXPNPC=DDXPNPC_T_"W $C("_DDXPDELM_")"
 I '$P(DDXPFMZO,U,6) D RUNON
 Q
RECDELIM ;
 S DDXPNPC="W $C("_DDXPRDLM_")"
 I '$P(DDXPFMZO,U,6) D RUNON
 Q
BLDELIM(%) ;
 N CHAR,DELM
 I +% S DELM=% G BLDOUT
 S DELM=$A(%)
 F CHAR=2:1 Q:$E(%,CHAR)=""  S DELM=DELM_","_$A($E(%,CHAR))
BLDOUT Q DELM
FPROC ;
 I $L(DDXPFOUT)+$L(DDXPNPC)<220 S DDXPFOUT=DDXPFOUT_DDXPNPC_T Q
 S ^DIPT(DDXPXTNO,"F",DDXPFONO)=DDXPFOUT
 S DDXPFOUT=DDXPNPC_T,DDXPFONO=DDXPFONO+1
 Q
 ;
NOUT(DDXPTIN) ;
 I DDXPTIN["SETDATA"!(DDXPTIN["SETPARAM") Q 1
 Q 0

DDXP31
DDXP31 ;SFISC/DPC-CREATE EXPORT TEMPLATE ;30SEP2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
XPT ;
 N DIC,DIR,DLAYGO
 W ! S DDXPOUT=0
 ;S DIR(0)="F^2:30",DIR("A")="Enter name for EXPORT Template"
 ;S DIR("?",1)="Enter the name of the Export Template to be produced.",DIR("?",2)="The name must be from 2 to 30 characters." ;,DIR("?")="The new Export Template cannot overwrite an existing Print Template file entry."
 ;D ^DIR
 ;I $D(DIRUT) S DDXPOUT=1 Q
 S DIC("S")="I $P(^(0),U,8)=3,$P(^(0),U,4)=DDXPFINO,$P(^(0),U,5)=DUZ!'$P(^(0),U,5)" ;**GFT Let them pick one of their own existing EXPORT TEMPLATES for this FILE
 S DIC="^DIPT(",DIC(0)="AOVELZ",DLAYGO=0 W ! D ^DIC I Y<0 S DDXPOUT=1 Q
 I '$P(Y,U,3) S $P(^(0),U,4)="",X=0 F  S X=$O(^(X)) Q:X=""  K ^(X) ;Throw away FILE so it can be stuffed back. throw away rest of Template
 ;'$P(Y,U,3) W !,$C(7),$P(Y,U,2)_" entry in the Print Template file already exists.",!,"Please enter the name of a new template.",!! G XPT
 S DDXPXTNO=+Y
 Q
 ;
LENGTH ;
 W !!,"This template will produce fixed length records."
 W !,"Enter the length of each field below."
 W !,"The specified number should be the length in the TARGET file.",!!
 D GETOUT Q:DDXPOUT
 S DDXPTLEN=0
 S DIR(0)="N^1:255:0",DIR("?")="Enter a number from 1 to 255 as the length of this field in the TARGET file"
 F DDXPFLD=1:1:DDXPTOTF D  I DDXPOUT Q  G LENGTH
 . I DDXPNOUT(DDXPFLD) S DDXPFLEN(DDXPFLD)=0 Q
 . S DIR("A")=DDXPFCAP(DDXPFLD),DDXPOUT=0 D ^DIR
 . I $D(DIRUT) S DDXPOUT=1 Q
 . S DDXPFLEN(DDXPFLD)=Y,DDXPTLEN=DDXPTLEN+Y
 . Q
 K DIR,X,Y
 Q
FLDNAME ;
 W !!,"Enter the name of the fields below in the TARGET file."
 W !,"If you press <RET>, no name will be used.",!!
 D GETOUT Q:DDXPOUT
 S DIR(0)="FO^0:30"
 S DIR("?")="Enter up to 30 characters as the name of this field in the TARGET file"
 F DDXPFLD=1:1:DDXPTOTF D  I DDXPOUT=1 Q  G FLDNAME
 . I DDXPNOUT(DDXPFLD) Q
 . S DIR("A")=DDXPFCAP(DDXPFLD),DDXPOUT=0 D ^DIR
 . I $D(DTOUT)!$D(DUOUT) S DDXPOUT=1 Q
 . S DDXPFFNM(DDXPFLD)=Y
 . Q
 K DIR,X,Y
 Q
DTYPE ;
 W !!,"Enter the data types of the fields being exported below.",!!
 D GETOUT Q:DDXPOUT
 S DIR(0)=".42,1"
 F DDXPFLD=1:1:DDXPTOTF D  I DDXPOUT=1 Q  G DTYPE
 . I DDXPNOUT(DDXPFLD) Q
 . S DIR("A")=DDXPFCAP(DDXPFLD),DIR("B")=$P(^DI(.81,DDXPDT(DDXPFLD),0),U,1),DDXPOUT=0 D ^DIR
 . I $D(DIRUT) S DDXPOUT=1 Q
 . S DDXPDT(DDXPFLD)=+Y
 . Q
 K DIR,X,Y
 Q
IOM ;
 S DDXPOUT=0
 W !!,"Enter the maximum length of a physical record that can be exported.",!,"Enter '^' to stop the creation of an EXPORT template.",!
 I $D(DDXPTLEN) D
 . W "The default shown is based on the total lengths of the fields being exported.",!
 . S DIR("B")=DDXPTLEN+1
 . Q
RIOM S DIR(0)=".44,7" D ^DIR K DIR
 I $D(DTOUT)!$D(DUOUT) S DDXPOUT=1 Q
 I Y>255,$P(DDXPFMZO,U,6) W !!,$C(7),"The length cannot be greater than 255 when sending fixed length records.",! G RIOM
 S DDXPIOM=Y
 Q
 ;
ASKDELM ;
 S DDXPOUT=0
 W !!,"You can choose a delimiter to be placed between output fields.",!,"Enter <RET> to use no delimiter.",!,"Enter '^' to stop the creation of an EXPORT template.",!
 S DIR(0)=".44,1" D ^DIR K DIR
 I $D(DUOUT)!$D(DTOUT) S DDXPOUT=1 Q
 S:X="@" Y=X S DDXPDELM=Y
 Q
ASKRDLM ;
 S DDXPOUT=0
 W !!,"You can choose a delimiter to be placed between output records.",!,"Enter <RET> to use no delimiter",!,"Enter '^' to stop the creation of an EXPORT template.",!
 S DIR(0)=".44,2" D ^DIR K DIR
 I $D(DUOUT)!$D(DTOUT) S DDXPOUT=1 Q
 S:X="@" Y=X S DDXPRDLM=Y
 Q
GETOUT ;To see if user wants to continue.
 S DDXPOUT=0
 W "Do you want to continue?"
 S DIR(0)="Y",DIR("B")="YES"
 S DIR("?")="If you do not give this information, an EXPORT template will NOT be created."
 D ^DIR K DIR I $D(DIRUT)!'Y S DDXPOUT=1 Q
 W !!
 Q

DDXP32
DDXP32 ;SFISC/DPC-CREATE EXPORT TEMPLATE (CONT) ;12:44 PM  7 Jun 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CAPDT ;
 K DDXPFCAP,DDXPDT,DDXPATH N FCAP,NUMPC,C S C=","
 F DDXPCNDX=1:1:DDXPTOTF D
 . I DDXPNOUT(DDXPCNDX) Q
 . S DDXPX=^TMP($J,"TIN",DDXPCNDX),DDXPTGFL=DDXPFINO,NUMPC=0 K FCAP
 . D FLDFIND
 . S DDXPFCAP(DDXPCNDX)=FCAP(NUMPC)
 . F NUMPC=NUMPC-1:-1 Q:'$D(FCAP(NUMPC))  D
 . . S DDXPFCAP(DDXPCNDX)=DDXPFCAP(DDXPCNDX)_" in "_FCAP(NUMPC)_" subfile"
 . . Q
 . K FCAP,NUMPC
 . Q
 I $D(DDXPATH) D MULTVER
 K DDXPX,DDXPCNDX,DDXPTGFL,DDXPDD0 Q
FLDFIND ;
 S NUMPC=NUMPC+1
 I DDXPX=0 D  Q
 . S FCAP(NUMPC)="NUMBER",DDXPDT(DDXPCNDX)=4
 . Q
 I +DDXPX D
 . S DDXPDD0="^DD("_DDXPTGFL_","_+DDXPX_",0)"
 . Q
 I DDXPX=+DDXPX D  Q
 . S FCAP(NUMPC)=$P(@DDXPDD0,U,1)
 . S %=$P(@DDXPDD0,U,2),DDXPDT(DDXPCNDX)=$S(%["D":1,%["N":2,1:4) K %
 . Q
 I '+DDXPX D  Q
 . S DDXPDT(DDXPCNDX)=4
 . I $E(DDXPX)=Q S FCAP(NUMPC)=DDXPX Q
 . S %=$P(DDXPX,";Z;",2),%=$P(%,Q,2,99),%=$P(%,";",1),FCAP(NUMPC)=$E(%,1,($L(%)-1)) K %
 . Q
MULT ;
 S FCAP(NUMPC)=$P(@DDXPDD0,U,1)
 S DDXPTGFL=+$P(@DDXPDD0,U,2)
 I NUMPC=1 D
 . N %,I,DONE S %=$P(DDXPX,C,1,$L(DDXPX,C)-1),DONE=0
 . F I=2:1:$L(DDXPX,C) Q:DONE  D
 . . Q:+$P(%,C,I)
 . . S %=$P(%,C,1,I-1),DONE=1
 . . Q
 . S DDXPATH(DDXPCNDX)=%
 . Q
 S DDXPX=$P(DDXPX,C,2,99)
 G FLDFIND
SETFLD ;
 S %L=$S($D(DDXPFLEN):";2///^S X=DDXPFLEN(DDXPFLD)",1:"")
 S %F=$S($D(DDXPFFNM):";3///^S X=DDXPFFNM(DDXPFLD)",1:"")
 S (DIC,DIE)="^DIPT("_DDXPXTNO_",100,",DA(1)=DDXPXTNO,DIC("P")=$P(^DD(.4,100,0),U,2),DIC(0)="L" K DO
 F DDXPFLD=1:1:DDXPTOTF D
 . I DDXPNOUT(DDXPFLD) Q
 . S (DINUM,X)=DDXPFLD K DD D FILE^DICN
 . S DA=DDXPFLD,DR="1////^S X=DDXPDT(DDXPFLD)"_%L_%F D ^DIE
 . Q
 K DIE,DIC,X,Y,DA,DR,%L,%F
 Q
SETEMP ;
 S DR="2///NOW;4///"_DDXPFINO_";5///"_DUZ_";8///3;105////"_DDXPFMNO S:$G(DDXPATH) DR=DR_";115///"_DDXPATH
 S DA=DDXPXTNO,DIE="^DIPT(" D ^DIE K DIE,DA,DR
 ; Hard Set ReadAccess and WriteAccess
 I $D(^DIPT(DDXPXTNO,0))#2,$D(DUZ(0))#2 D
 . S $P(^DIPT(DDXPXTNO,0),U,3)=DUZ(0) ; Read Access
 . S $P(^DIPT(DDXPXTNO,0),U,6)=DUZ(0) ; Write Access
 S %X="^DIPT("_DDXPFDTM_",""DXS"",",%Y="^DIPT("_DDXPXTNO_",""DXS""," D %XY^%RCR K %X,%Y
 S ^DIPT(DDXPXTNO,"SUB")=1
 S ^DIPT(DDXPXTNO,"H")="@@"
 Q
MULTVER ;
 N I,MP,LP,MPC,LPC,NOMATCH S LP="",NOMATCH=0
 F I=1:1:DDXPTOTF D  Q:NOMATCH
 . S MP=$G(DDXPATH(I)) Q:'MP
 . I LP=MP Q
 . I 'LP S LP=MP Q
 . S LPC=$L(LP,C),MPC=$L(MP,C)
 . I LPC=MPC S NOMATCH=1 Q
 . I LPC>MPC D  Q
 . . I MP=$P(LP,C,1,MPC) Q
 . . S NOMATCH=1
 . . Q
 . I LP=$P(MP,C,1,LPC) S LP=MP Q
 . S NOMATCH=1
 . Q
 I 'NOMATCH S DDXPATH=LP Q
 W !!,$C(7),"The "_DDXPFDNM_" template has fields in more than one multiple path."
 W !,"Therefore, export of the data will not succeed."
 W !,"Refer to the VA FileMan User Manual for more details.",!
 S DDXPOUT=1
 Q
QUOT ;
 N QPC,Q1ST
 I DDXPDT(DDXPFLD)=2 Q
 S Q1ST=$S(DDXPNPC=DDXPRNPC:1,1:0)
 S QPC="W $C(34)"_$S(Q1ST&(DDXPFLD=1):"",1:";X")
 I Q1ST S DDXPNPC=QPC_T_DDXPNPC
 E  S DDXPNPC=DDXPNPC_T_QPC
 Q

DDXP33
DDXP33 ;SFISC/DPC - CREATE EXPORT TEMPLATE (CONT) ;12:45 PM  7 Jun 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FLDTEMP ;
 S DDXPOUT=0
 S DIC="^DIPT(",DIC(0)="QEASZ",DIC("S")="I $P(^(0),U,8)=7",DIC("A")="Enter SELECTED EXPORT FIELDS Template: ",D="F"_DDXPFINO W ! D IX^DIC K DIC,D
 I Y=-1 S DDXPOUT=1 Q
 S DDXPFDTM=+Y,DDXPFDNM=$P(Y,U,2)
 N DDXPY
 S DDXPY=Y(0)
 D SHOWFLD G:DDXPOUT FLDTEMP
 Q
SHOWFLD ;
 W !!,"Do you want to see the fields stored in the "_DDXPFDNM_" template?"
 S DIR(0)="Y",DIR("B")="NO" D ^DIR K DIR
 I $D(DIRUT) S DDXPOUT=1 Q
 I Y D  Q:DDXPOUT
 . W ! S D0=DDXPFDTM D ^DIPT K D0
 . W !,"Do you want to use this template?"
 . S DIR(0)="Y",DIR("B")="YES" D ^DIR K DIR W !
 . I 'Y!$D(DIRUT) S DDXPOUT=1
 . Q
 S DDXPTMDL=0
 I DUZ(0)[$E($P(DDXPY,U,6),1)!(DUZ(0)="@") D  I $D(DIRUT) K DDXPY S DDXPOUT=1 Q
 . W !!,"Do you want to delete the "_DDXPFDNM_" template"
 . W !,"after the export template is created?"
 . S DIR(0)="Y",DIR("B")="NO" D ^DIR K DIR W !
 . S:Y DDXPTMDL=1
 . K DDXPY
 Q

DDXP4
DDXP4 ;SFISC/DPC,S0-EXPORT DATA ;7:37 AM  30 May 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN1 ;
 K ^UTILITY($J)
 D ^DICRW I Y=-1 G QUIT
 S DDXPFINO=+Y
XTEM ;
 S DIC="^DIPT(",DIC(0)="QEASZ",DIC("A")="Choose an EXPORT template or '^' to Quit: ",DIC("S")="I $P(^(0),U,8)=3",D="F"_DDXPFINO W !
 D IX^DIC K DIC,D I $D(DTOUT)!$D(DUOUT) G QUIT
 I Y=-1 G XTEM
 S DDXPXTNO=+Y,DDXPXTNM=$P(Y,U,2),FLDS="["_DDXPXTNM_"]"
 I DUZ(0)[$E($P(Y(0),U,6),1)!(DUZ(0)="@") D  I $D(DIRUT) G QUIT
 . W !,"Do you want to delete the "_DDXPXTNM_" template",!,"after the data export is complete?",!
 . S DDXPTMDL=0,DIR(0)="Y",DIR("B")="NO" D ^DIR K DIR W !
 . S:Y DDXPTMDL=1
 S DDXPFFNO=+$G(^DIPT(DDXPXTNO,105)),DDXPFMZO=$G(^DIST(.44,DDXPFFNO,0))
 I $G(^DIST(.44,DDXPFFNO,6))]"" S DDXPDATE=1
 S DDXPATH=$P($G(^DIPT(DDXPXTNO,105)),U,4) I DDXPATH]"" D MULTBY
SORS ;
 W ! S DIR(0)="YA",DIR("B")="NO",DIR("A")="Do you want to SEARCH for entries to be exported? "
 S DIR("?",1)="To use VA FileMan's SEARCH option to choose entries, answer 'YES'."
 S:'$D(BY) DIR("?",2)="After the SEARCH, you can respond to VA FileMan's 'SORT BY:' prompt."
 S DIR("?")="If you answer 'NO', "_$S('$D(BY):"you can only SORT entries before export.",1:"the data export will begin.")
 D ^DIR K DIR I $D(DIRUT) G QUIT
 S DDXPSORS=Y,DIC=DDXPFINO,L=0
 D DIOBEG,DIOEND
 I DDXPSORS D EN^DIS
 I $G(X)="^"!($G(POP)) G QUIT
 I 'DDXPSORS D EN1^DIP
 I $G(X)="^"!($G(POP)) G QUIT
 I $G(DDXPQ),$G(DDXPTMDL) W !,?5,"Export template "_DDXPXTNM_" will be deleted",!,?5,"when queued export is completed." G DONE
 I $G(DDXPTMDL) S DIK="^DIPT(",DA=DDXPXTNO D ^DIK K DIK,DA
 G DONE
QUIT ;
 W !!,?10,"Export NOT completed!"
DONE ;
 K DDXPFINO,DDXPSORS,DDXPIOM,DDXPIOSL,DDXPXTNO,DDXPXTNM,DDXPFFNO,DDXPFMZO,DDXPCUSR,DDXPDATE,DDXPTMDL,DDXPY,DDXPATH,L,Y,DTOUT,DUOUT,DIRUT,DIC,FLDS,BY,FR,DIOEND,DIOBEG,DDXPQ,X,POP
 Q
ZIS ;
 S %ZIS="Q"
 S DDXPIOM=$S($P(DDXPFMZO,U,8):$P(DDXPFMZO,U,8),$G(^DIPT(DDXPXTNO,"IOM")):^("IOM"),1:80)
 S DDXPIOSL=99999
 Q
MULTBY ;
 N NUMPC,I,C S BY="",C=",",NUMPC=$L(DDXPATH,C)
 W !!,"Since you are exporting fields from multiples,"
 W !,"a sort will be done automatically."
 W !,"You will NOT have the opportunity to sort the data before export.",!
 F I=1:1:NUMPC D
 . S BY=BY_DDXPATH_",NUMBER,"
 . S DDXPATH=$P(DDXPATH,C,1,$L(DDXPATH,C)-1)
 . Q
 S BY=$E(BY,1,$L(BY)-1),FR=""
 Q
DIOBEG ;
 S DDXPBEG=$G(^DIST(.44,DDXPFFNO,1))
 I DDXPBEG']"" G QBEG
 I $E(DDXPBEG)="""" S DIOBEG="W "_DDXPBEG G QBEG
 S DIOBEG=DDXPBEG
QBEG K DDXPBEG
 Q
DIOEND ;
 S DDXPEND=$G(^DIST(.44,DDXPFFNO,2))
 I DDXPEND']"" G QEND
 I $E(DDXPEND)="""" S DIOEND="W "_DDXPEND G QEND
 S DIOEND=DDXPEND
QEND K DDXPEND
 Q
DJTOPY(Y) ;
 N BJ,EJ,YOUT,NUMW,TYPEJ,DDXPXORY,SUB S YOUT=Y
 S BJ=$F(Y,"$J(") I BJ D
 . S DDXPXORY=$P($E(Y,BJ,999),",",1)
 . S NUMW=$L($E(Y,1,BJ),"W")-1 I NUMW'>0 Q
 . S EJ=$F(Y,") ",BJ)
 . S TYPEJ=$L($E(Y,BJ,$S(EJ:EJ-1,1:999)),",")
 . I TYPEJ'=2&(TYPEJ'=3) Q
 . I TYPEJ=3 S SUB="$S("_DDXPXORY_"]"""":+"_DDXPXORY_",1:"""_$P(DDXPFMZO,U,13)_""")"
 . I TYPEJ=2 S SUB=DDXPXORY
 . S YOUT=$P($E(Y,1,BJ),"W",1,NUMW)_"W "_SUB_$S(EJ:$E(Y,EJ-1,999),1:"")
 . Q
 Q YOUT
DT ;
 N X
 I 'Y S DDXPY=Y Q
 S X=Y
 I $D(^DIST(.44,DDXPFFNO,6)) X ^(6) S DDXPY=$G(Y)
 Q
EN2 ; Export API from EXPORT^DDXP
 N DDXP,DDXPXTNO,DDPXFFNO,DDXPFMZO,DDXPDATE,DDXPATH,DDXPOUT,ERROR,DIA
 K ^UTILITY($J)
 ; Check for valild file number
 I '$G(DDXPFINO) S ERROR="File Number Missing." D EN2ERR G DONE
 I DDXPFINO[U D  I $D(DDXPOUT) K DDXPOUT G DONE
 . I $P(DDXPFINO,U)'=1.1 S DDXPOUT=1,ERROR="You can only use the "","" syntax if doing an Export of the Audit File(1.1)" D EN2ERR Q
 . I '$D(^DIC(+$P(DDXPFINO,U,2),0))#2 S DDXPOUT=1,ERROR="File Does Not Exist on This System." D EN2ERR Q
 I DDXPFINO'[U,'$D(^DIC(+DDXPFINO,0))#2 S ERROR="File Does Not Exist on This System." D EN2ERR G DONE
 N DIC,D,X
 S DIC="^DIPT(",DIC(0)="SZ",DIC("S")="I $P(^(0),U,8)=3",D="F"_+DDXPFINO,X=DDXPXTNM
 D IX^DIC K DIC
 I Y<0 S ERROR="The Template is Not an Export Template or Is Missing." D EN2ERR G DONE
 S DDXPXTNO=+Y
 S DDXPFFNO=+$G(^DIPT(DDXPXTNO,105)),DDXPFMZO=$G(^DIST(.44,DDXPFFNO,0))
 I $G(^DIST(.44,DDXPFFNO,6))]"" S DDXPDATE=1
 I $G(DDXPBY)="" S DDXPATH=$P($G(^DIPT(DDXPXTNO,105)),U,4) I DDXPATH]"" D MULTBY
 ; Setup For Sort Template If BY NOT Setup by MULTBY
 I '$D(BY) D  I $D(DDXPOUT) K DDXPOUT S ERROR="Sort Template Invalid or Missing." D EN2ERR G DONE
 . I $G(DDXPBY)]"" D  Q:$D(DDXPOUT)
 .. N DIC,X
 .. S DIC="^DIBT(",DIC(0)="Z",X=DDXPBY
 .. D ^DIC K DIC
 .. I Y<0 S DDXPOUT=1 Q
 .. D SORTCHK I $D(DDXPOUT) Q
 .. S BY="["_DDXPBY_"]"
 S DDXP=4 ; Tell other FileMan routines we are Exporting
 S DIC=$S(+DDXPFINO=1.1:"^DIA("_+$P(DDXPFINO,U,2)_",",1:+DDXPFINO)
 S L=0
 S FLDS="["_DDXPXTNM_"]"
 D DIOBEG,DIOEND,EN1^DIP
 I $G(X)="^"!($G(POP)) K DDXP,DDXPBY,DDXPFR,DDXPTO G QUIT
 K:$D(DIA) DIA ; **Leaking Variable**
 I $G(DDXPTMDL) S DIK="^DIPT(",DA=DDXPXTNO D ^DIK K DIK,DA
 K DDXP,DDXPBY,DDXPFR,DDXPTO
 G DONE
SORTCHK ; Check Sort For Illegal Qualifiers
 N D0,D1,DDXPX,I
 S D0=+Y
 S D1=0
 F  S D1=$O(^DIBT(D0,2,D1)) Q:D1<1!$D(DDXPOUT)  D
 . S DDXPX=^DIBT(D0,2,D1,0)
 . F I="#","!","+","@" D  Q:$D(DDXPOUT)
 .. I $P(DDXPX,U,4)[I,I'="@" S DDXPOUT=1,ERROR="You can not use the """_I_""" when exporting." D EN2ERR Q
 .. I I="@",$P(DDXPX,U,4)["@",$P(DDXPX,U,4)'["@B" S DDXPOUT=1,ERROR="You can not use the ""@"" when exporting." D EN2ERR Q
 . F I=";C",";S" D  Q:$D(DDXPOUT)
 .. I $P(DDXPX,U,5)[I S DDXPOUT=1,ERROR="You can not use "_I_" when exporting." D EN2ERR Q
 .. I $P(DDXPX,U,5)[";""" S DDXPOUT=1,ERROR="You can Replace a Caption when exporting." D EN2ERR Q
 Q
EN2ERR ; Error Processing
 I $D(IOST),$E(IOST,1,2)="C-" W $C(7)
 W "=>"_ERROR,!
 K DDXPBY,DDXPFR,DDXPTO,ERROR
 Q

DDXP41
DDXP41 ;SFISC/DPC-EXPORT DATA (CONT) ;1/8/93  09:18
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SORTVAL ;
 N DDXPNG,CHK
 S DDXPNG=0
 F CHK="#","!","+","@" D
 . I $E(X)=CHK S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot use the "_CHK_" sort qualifier when exporting data.",!
 . Q
 F CHK=";C",";S" D
 . I X[CHK S DDXPNG=1 W !!,$C(7),"SORRY.  Using "_CHK_" will have no effect when exporting data.",!
 . Q
 I X[";""" S DDXPNG=1 W !!,$C(7),"SORRY.  You cannot replace a caption with a literal when exporting data.",!
 K:DDXPNG X
 Q

DDXP5
DDXP5 ;SFISC/DPC-PRINT FOREIGN FORMAT DOC ;12/17/92  10:15
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN1 ;
 N SEL,CHOICE,OUT,NOMORE K DIS
 S DIR(0)="SM^1:Only print selected foreign formats;2:Print all foreign formats"
 D ^DIR K DIR Q:$D(DIRUT)  S SEL=Y,OUT=0
 I SEL=1 D  Q:$G(CHOICE)=1
 . S DIC="^DIST(.44,",DIC(0)="QEAM",NOMORE=0
 . F CHOICE=1:1 D  Q:OUT
 . . W ! D ^DIC I Y=-1 S OUT=1 Q
 . . S DIS(CHOICE)="I D0="_+Y
 . . Q
 . K DIC
 . Q
 S DIC="^DIST(.44,",L=0,FLDS="[DDXP FORMAT DOC]",DHD="[DDXP FORMAT DOC HDR]",BY="NAME;S2;C1",FR="" W !
 D EN1^DIP
 K Y,DIRUT
 Q

DDXPLIB
DDXPLIB ;SFISC/DPC-EXPORT LIBRARY ;1/25/93  13:05
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FLDNM(DDXPXTNO) ;
 N %D,%I,FLD,NAMELST,NAME
 S NAMELST=""
 S %D=$P($G(^DIST(.44,+$G(^DIPT(DDXPXTNO,105)),0)),U,2)
 S %D=$$BLDELIM^DDXP3(%D)
 S %D=$C(%D),FLD=0
 F %I=0:1 S FLD=$O(^DIPT(DDXPXTNO,100,FLD)) Q:FLD<1  D
 . S NAME=$P(^DIPT(DDXPXTNO,100,FLD,0),U,4)
 . S NAMELST=NAMELST_NAME_%D
 . Q
 S NAMELST=$P(NAMELST,%D,1,%I)
 Q NAMELST
 ;
DP123(DDXPXTNO) ;
 N FLD,FLDZO,DPLN,I,DT,LEN,DTCHAR
 S DPLN=""
 F FLD=0:0 S FLD=$O(^DIPT(DDXPXTNO,100,FLD)) Q:FLD<1  S FLDZO=^(FLD,0) D
 . S DT=$P(FLDZO,U,2)
 . S LEN=$P(FLDZO,U,3)
 . S DTCHAR=$S(DT=4:"L",DT=2:"V",DT=1:"D",1:"L")
 . S DPLN=DPLN_DTCHAR
 . F I=1:1:LEN-1 S DPLN=DPLN_">"
 . Q
 Q DPLN
 ;
DPXCEL(DDXPXTNO) ;
 N DPLN,FLD,FLDZO,LEN,I
 S DPLN=""
 F FLD=0:0 S FLD=$O(^DIPT(DDXPXTNO,100,FLD)) Q:FLD<1  S FLDZO=^(FLD,0) D
 . S LEN=$P(FLDZO,U,3)
 . S DPLN=DPLN_"|"
 . F I=1:1:LEN-1 S DPLN=DPLN_" "
 . Q
 Q DPLN
 ;
SASCOL ;
 N INPUTLN,FLD,NAME,DTYPE,DTYPEFOR,START,END,LENGTH,FLD0
 S INPUTLN="INPUT ",START=1,FLD=0
 F  S FLD=$O(^DIPT(DDXPXTNO,100,FLD)) Q:FLD<1  S FLD0=^(FLD,0) D
 . S NAME=$P(FLD0,U,4)_" ",LENGTH=$P(FLD0,U,3),DTYPE=$P(FLD0,U,2)
 . S DTYPEFOR=$S(DTYPE=4:"$ ",DTYPE=1:"YYMMDD"_LENGTH_". ",1:"")
 . S END=START+LENGTH-1
 . S INPUTLN=INPUTLN_NAME_DTYPEFOR_$S(DTYPE=1:"",1:START_"-"_END_" ")
 . S START=END+1
 . Q
 S INPUTLN=$E(INPUTLN,1,$L(INPUTLN)-1)_";"
 W INPUTLN,!,"CARDS;"
 Q
 ;
ORACTL ;
 N FLD,FLD0,DELIM,NAME,LENGTH,DTYPEFRM,END,START,POS
 S FLD=0,DELIM=$P(^DIST(.44,DDXPFFNO,0),U,2),START=1,POS=""
 W "LOAD DATA",!
 W "INFILE *",!
 W "APPEND",!
 W "INTO TABLE "_$TR($P(^DIPT(DDXPXTNO,0),U,1)," ","_"),!
 W:DELIM]"" "FIELDS TERMINATED BY '"_DELIM_"' OPTIONALLY ENCLOSED BY '""'",!
 W "("
 F  S FLD=$O(^DIPT(DDXPXTNO,100,FLD)) Q:FLD<1  W:FLD>1 ",",! S FLD0=^(FLD,0) D
 . S NAME=$P(FLD0,U,4)_" ",LENGTH=$P(FLD0,U,3)
 . S DTYPEFRM=$S($P(FLD0,U,2)=1:" DATE 'MON DD,YYYY'",1:"")
 . I LENGTH>0 D
 . . S END=START+LENGTH-1
 . . S POS="POSITION ("_START_":"_END_")"
 . . S START=END+1
 . . Q
 . W NAME_POS_DTYPEFRM
 W " )",!
 W "BEGINDATA",!
 Q

DI
DI ;SFISC/GFT-DIRECT ENTRY TO VA FILEMAN ;2OCT2012
V ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 G QQ:$G(^DI(.84,0))']""
C G QQ:$G(^DI(.84,0))']"" K (DTIME,DUZ) G ^DII
D G QQ:$G(^DI(.84,0))']"" G ^DII
P G QQ:$G(^DI(.84,0))']"" K (DTIME,DUZ)
Q G QQ:$G(^DI(.84,0))']"" S DUZ(0)="@" G ^DII
VERSION ;
 S VERSION=$P($T(V),";",3),X=$P($T(V),";",4)_" "_VERSION Q
 ;
QQ ;
 W $C(7),!!,"You must run ^DINIT first."
 Q

DIA
DIA ;SFISC/GFT-SELECT FIELDS TO EDIT ;4JUNE2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D DICS
1 D F W !?F*3,"EDIT WHICH "_X I $S(DB:DIAT="",1:1) R ": ALL// ",X:DTIME S:'$T X=U,DTOUT=1 G ALL^DIA1:X=""!(X="ALL"),TEMP^DIA1:X?1"[".E&'F,L
ED G NDB:DIAT=""
GDB S Y=$P(DIAT,";",DB) I "Q"[Y G NDB:Y="" D DB G GDB
 I Y?.NP,$P(Y,":",2),Y'["/" S Y=+Y_"-"_$P(Y,":",2)
 S %=$G(DI(DB,DIARTLVL-1,DI,DIAO)) I %]"" S Y=%
 E  I Y?1"^"1N1"."1.2N S DB=DB+1 G GDB ;WPB-0804-30857
 W ": "_Y D RW
 I X="" S X=Y I X="ALL" G ALL^DIA1
L S DSC=X?1"^".E I DSC S X=$E(X,2,999) I U[X K DR Q
 I $A(X)=64 G X:X'?1P.N,P:$L(X)>1,X:'DB S DB=DB+1 G 2
 K DIC,DIAB D DICS S DV="",J=$P(X,"-",2) I +J=J,$P(X,"-",1)=+X,J>X S D(F)=J K DA D RANGE^DIA1 K D S Y=DA G X:Y="" D DB G 2
DIC ;
EGP S DIC(0)="EZI",DIC="^DD(DI,",Y=-1 G X^DIA3:X[";" D DICW^DIALOGZ(DI),^DIC Q:$D(DTOUT)  ;**CCO/NI
 I Y>0 D SET S Y=$P(Y(0),U,2) G 2:'Y S L=L+1,(DI,J(L))=+Y,I(L)=""""_$P($P(Y(0),U,4),";")_"""" G DOWN
 I $E(X)="]" S DRS=9,X=$E(X,2,999) G DIC:X]"",2
 G DIA^DIQQQ:X?."?" I $D(^DD(DI,"GR")) K Y S Y=-1 D:$L(X)<31
 . N I,DIGRP,DTOUT,DUOUT,DIRUT,DIROUT,DIYN S DIGRP=X,DIYN=0
 . D:$D(^DD(DI,"GR",DIGRP))  Q:DIYN  F  S DIGRP=$O(^DD(DI,"GR",DIGRP)) Q:$E(DIGRP,1,$L(X))'=X  D  Q:DIYN
 .. N X,I
 .. F I=0:0 S I=$O(^DD(DI,"GR",DIGRP,I)) Q:'I  I $G(^DD(DI,I,0))]"" S I(I)=I_U_$P(^(0),U)
 .. Q:'$O(I(0))
 .. W !!,"Fields in Group: ",DIGRP F I=0:0 S I=$O(I(I)) Q:'I  W !,?2,I,?10,$P(I(I),U,2)
 .. D  Q:DIYN'=1
 ... N X,Y S DIR(0)="Y",DIR("A")="Edit this GROUP of fields",DIR("B")="YES" D ^DIR S DIYN=$S(Y=1:1,$G(DIRUT):2,1:0) Q
 .. M Y=I S Y=0 Q
 . Q
 K DIYN G X^DIA3
 ;
F S X=$P(^DD(DI,0),U) I F,X="FIELD" S X=$O(^(0,"NM",0))_" "_X
 Q
 ;
X ;
 W $C(7),"??" D DICS
2 ;
 G 1:'$D(DR(F+1,DI)) D F W !?F*3,"THEN EDIT "_X G ED:DB
R R ": ",X:DTIME E  W $C(7) S X=U,DTOUT=1
 I X]"" G L
UP ;
 G ^DIA1:'F K I(L),J(L) S L=L-1 I '$D(J(L)) F L=L-99:1 Q:'$D(J(L+1))
 I DB S DB=DB(F),DIARTLVL=DIARTLVL(F),DIAO=DIAO(F),DIAT=$S(DIAO<0:"",DIAO:$G(^DIE(DIAA,"DR",DIARTLVL,J(L),DIAO)),$D(^DIE(DIAA,"DR",DIARTLVL,J(L))):^(J(L)),1:"")
 S DIARLVL=DIARLVL(F),DIAP=DIAP(F),DI=J(L),F=F-1 G 2
 ;
NDB I DB,DIAO'<0 S DIAO=DIAO+1 I $D(^DIE(DIAA,"DR",DIARLVL,DI,DIAO)) S DIAT=^(DIAO),DB=1 G GDB
 S DIAO=-1 G R
 ;
 ;
 ;
EN ;Entry point from DIB routine
 N DIARTLVL,DIARLVL,DIAL,DIESP,DRR D OS^DII:'$D(DISYS)
FILETOP D DICS ;Enter from DIA3 when there is a file jump
DOWN S F=F+1,DIAL(F)=+$G(DIAL),DIARLVL(F)=+$G(DIARLVL) F %=F+1:.01 I '$D(DR(%,DI)) Q  ;Find 2.01 if we have already gone down to DR(2,DI) -- WPB-0804-30857
 S:%["." @DRR=@DRR_U_%_";",DIAP=DIAP+1 S DIARLVL=%
 S DIAP(F)=DIAP,DIAP=0
 I DB S DIARTLVL(F)=DIARTLVL D  S DB(F)=DB,DB=1,DIAO(F)=DIAO,DIAO=0,DIAT=$G(^DIE(DIAA,"DR",DIARTLVL,DI)),DIARTLVL(DIARTLVL,DI)=""
 .S %=$P(DIAT,";",DB) I %?1"^"1.NP S DIARTLVL=$P(%,U,2),DB=DB+1 Q
 .F DIARTLVL=F+1:.01 I '$D(DIARTLVL(DIARTLVL,DI)) Q
 G 1:$P(^DD(DI,.01,0),U,2)'["W",1:L#100=0,UP
 ;
DICS ;
 S DIC("S")="I Y>.001,$P(^(0),U,2)'[""C"""_$S(DUZ(0)="@":"",1:",$P(^(0),U,2)'[""K""")_" Q:'$D(^(9))  I ^(9)'=U"_$S(DUZ(0)'="@":" F DW=1:1:$L(^(9)) I DUZ(0)[$E(^(9),DW) Q",1:"") Q
 ;
P ;
 S DRS=99,Y=X D DB G 2
 ;
SET S Y=+Y_DV
DB ;
 I DB,'DSC S DB=DB+1
D ;takes 'Y' and puts it into 'DR' array -- Also called from DIA3
 N %,B
 S (DRR,B)=$NA(DR(DIARLVL,DI)),%=$O(@DRR@(""),-1)
 I % S DRR=$NA(@DRR@(%))
 I '$D(@DRR) S @DRR="",DIAP=0
 E  I $L(Y)+$L(@DRR)>230 S DRR=$NA(@B@(%+1)),DIAP=DIAP\1000+1*1000,@DRR=""
 S @DRR=@DRR_Y_";",DRS=$G(DRS)+1
 S DIAP=DIAP+1
DIAB I $D(DIAB) S ^UTILITY($J,DIAP#1000,DIARLVL-1,DI,DIAP\1000)=DIAB K DIAB
 Q
 ;
RW I $L(Y)>19 D RW^DIR2 Q
 W "// " R X:DTIME I '$T S X=U,DTOUT=1 W $C(7)

DIA1
DIA1 ;SFISC/GFT-PROCESS TEMPLATES, RANGES FOR INPUT ;20MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
S D NOW^%DTC S DIADT=+$J(%,0,4) K %,DW G Q:DRS<5 R !,"STORE THESE FIELDS IN TEMPLATE: ",X:DTIME S:'$T DTOUT=1 G Q:X="" S DIC(0)="LZSEQ",DLAYGO=0 D T K DLAYGO,DIC I Y<0 G S:X'[U K DR G Q
 S X=$P(^(0),U,6) I DUZ(0)'["@",X]"" F %=1:1 I DUZ(0)[$E(X,%) Q:%'>$L(X)  W !?7,$C(7),"YOU HAVE NO 'WRITE ACCESS' TO THIS TEMPLATE",! G S
 S DW=$S('$D(^("ROU")):1,^("ROU")'[U:1,$D(^("ROUOLD")):^("ROUOLD"),1:1),%=0,X=$P(Y,U,2)
 I $O(^(0))]"" W $C(7),!,X_" TEMPLATE ALREADY EXISTS.... OK TO REPLACE" D YN^DICN W ! G S:%-1 L +^DIE(+Y) S %Y="" F %X=0:0 S %Y=$O(^DIE(+Y,%Y)) Q:%Y=""  K:",%D,ROUOLD,W,"'[(","_%Y_",") ^(%Y)
 S ^DIE(+Y,0)=X_U_DIADT_U_$S('%:DUZ(0),1:$P(Y(0),U,3))_U_DI_U_DUZ_U_$S('%:DUZ(0),1:$P(Y(0),U,6))_U_DT,^DIE("F"_DI,X,+Y)=1 L -^DIE(+Y)
M S %X="DR(",%Y="^DIE(+Y,""DR""," D %XY^%RCR M ^DIE(+Y,"DIAB")=^UTILITY($J)
 S X=DW,DP=DIA("P"),DMAX=^DD("ROU") I X'=1,$D(^DD("OS",DISYS,"ZS")) D EN^DIEZ S DR(1,DIA("P"))=U_DNM
Q K DNM,DIAO,DI,DIAP,%,%I,DIADT,DIAT,DIE,DMAX,%X,%Y Q
 ;
ALL ;Called by DIETED, DIA
 S %=DI,^UTILITY($J,1,F,%,DIAP\1000)="ALL" K DA D  G UP^DIA:F,S:$D(DRS) Q
 .N DIA1 S DIA1=DIARLVL D A
 ;
RANGE ;called by DIA, DIE17, DIETED
 N DIA1 S DIA1=F+1 S %=DI I X>0 S Y=X-.000001 G B
A S Y=0
B S DA="",X=0
G S DG=Y
DR S Y=$O(^DD(%,Y)) S:Y="" Y=-1 I $D(D(F)),Y'>0!(Y>D(F)) D DG:X Q
 I Y'>0 D DG:X S:$D(DR(DIA1,%))[0 DR(DIA1,%)=DA Q
 I $D(^(Y,0)),X X DIC("S") G G:$T D DG G DR
 X DIC("S") E  G DR
 S X=Y G G
 ;
DG S DA=DA_$E(";",1,$L(DA))_X_$P(":"_DG,U,X'=DG)
 S DQ=0 F  S DQ=$O(^DD(%,"SB",DQ)) Q:DQ=""  S DP=$O(^(DQ,0)) I DP'<X,DP'>DG S Y(F,DQ)=""
 S DQ=-1
Y S X=$O(Y(F,0)) I X>0 K Y(F,X) S DA(F)=DA,Y(F)=Y,%(F)=%,F=F+1,DIA1=DIA1+1,%=X D A S F=F-1,DIA1=DIA1-1,%=%(F),Y=Y(F),DA=DA(F) G Y
 S X="",DG=0 K DP Q
 ;
TEMP ;
 S DIC(0)="ZSEQ" D T K DIC Q:$D(DTOUT)  G DB:Y<0
 S %=$P(Y(0),U,6) G ED:DUZ(0)="@"!'$L(%) F X=1:1:$L(%) I DUZ(0)[$E(%,X) G ED
GT I $G(^("ROU"))[U S DR(1,DIA("P"))=^("ROU")
 E  S:$D(^("W")) DIE("W")=^("W") S %X="^DIE(+Y,""DR"",",%Y="DR(" D %XY^%RCR
 S $P(^DIE(+Y,0),U,7)=DT
 Q
 ;
T K DIC("W") S D="F"_DI,X=$P(X,"]",1),X=$P(X,"[",1)_$P(X,"[",2),DIC="^DIE(",DIC("S")="I $P(^(0),U,4)=DI"_$P(" S %=$P(^(0),U,3) F DW=1:1:$L(%) I DUZ(0)[$E(%,DW) Q",9,DUZ(0)'="@") G IX^DIC
 ;
ED I Y<1 G GT
 S %=2 W !,"WANT TO EDIT '",$P(Y,U,2),"' INPUT TEMPLATE" D YN^DICN G GT:%-1
 S DIE="^DIE(",DA=+Y,DR=".01;3;6" D ^DIE K DR I '$D(DA) S DB=0 G DB
 S:$D(^DIE(DA,"DR"))#2 ^("DR",1,J(0))=^("DR")
 S DIAA=DA,DRS=9,DIAT=$S($D(^DIE(DA,"DR",1,J(0))):^(J(0)),1:"")
 M DI=^DIE(DA,"DIAB")
 S F=0,(DIARTLVL,DB)=1,DIAO=0 F DXS=1:1 Q:'$D(DR(99,DXS))
DB S DI=J(0) G ^DIA

DIA2
DIA2 ;SFISC/GFT-SELECT ENTRY TO EDIT, ^LOOP ;16MAY2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DIT",$J),DA,DRS,DW,DIAP,DI I '$D(DR(1,J(0))) S DR(1,J(0))=".01:99999999"
 I $L(DR(1,J(0)))+$L(DIA)<216,+DR(1,J(0))=.01 S DR(1,J(0))="S:DIA(9) DQ=2,X=$P("_DIA_"DA,0),U,1);"_DR(1,J(0))
DIC W !! G Q^DIB:$D(DTOUT) D L S DIA(1)=+Y,DIA(9)=$P(Y,U,3) I Y>0 D DIE,^DIA3:'$D(DA) G DIC
 I X'["LOOP",X'["loop" D PTS^DITP:$O(^UTILITY("DIT",$J,0))>0 K ^UTILITY("DIT",$J) G Q^DIB
 S L="EDIT ENTRIES",DHD="@",IOP="HOME",FLDS="",DHIT="S DCC="""_$$CONVQQ^DILIBF(DIA)_""" D LOOP^DIA2 S:'$D(DCC) DN=0" D EN1^DIP W !!?4,"LOOP ENDED!" Q:$D(DTOUT)  G DIC
 ;
L K Y,I,J,F,DIC S (DIC,DIE)=DIA,DIC(0)="QEALM" D  K DIE S DIE=DIA Q
 .N DIA,DR D ^DIC ;could go to a custom lookup that deranges these variables
 ;
DIE S DP=DIA("P"),DA=+Y,DR=DR(1,DP)
 K DIC,Y,C,DB S DIC=DIE,DILK=DIE_DA_")" D LOCK^DILF(DILK) ;**147
 E  W $C(7),!,"ANOTHER TERMINAL IS EDITING THIS ENTRY!" K DILK Q
 I DR?1"^".AN D @DR L @("-"_DILK) K DILK Q
 E  D GO^DIE L @("-"_DILK) K DILK Q
 ;
LOOP ;DELETE OR REPLACE POINTERS
 G NUL:$D(@(DCC_D0_",-9)")) I '($G(DIFIXPT)=1) W !!,?3
 S X=$P(@(DCC_"0)"),U,2) G NUL:'$D(^(D0,0)) S (DI,Y)=$P(^(0),U,1),C=$P(^DD(+X,.01,0),U,2)
 D
 . N X D Y^DIQ
 I $G(DIFIXPT)=1 D
 . I $D(DIFIXPTH) S ^TMP("DIFIXPT",$J,DIFIXPTC)=DIFIXPTH,DIFIXPTC=DIFIXPTC+1 K DIFIXPTH
 . S ^TMP("DIFIXPT",$J,DIFIXPTC)=" Entry:"_D0_"-"_$E(Y,1,20)_"     "
 . Q
 I '($G(DIFIXPT)=1) W Y
 S Y=D0,(DIE,DIC)=DCC,%C=0
 I X["I",'($G(DIFIXPT)=1) S %Y=0 F  S %C=$O(^DD(+X,0,"ID",%C)) Q:%C=""  S %=^(%C) D
 . N DIQUIET
 . W "  ",$E(@(DCC_"Y,0)"),0) X %
 K DO S %C=-1,DO(2)=X,Y=Y_U_DI,DIC(0)=$P("E^",U,('($G(DIFIXPT)=1))) D ACT^DICM1 S DI=99 K DO,DIY Q:Y<0
 S Y=D0 D DIE S:$G(DIFIXPT) DIFIXPTC=DIFIXPTC+1 I $D(DTOUT) K DCC,Y
 I $D(Y) K Y I '($G(DIFIXPT)=1) S %=1 W $C(7),!!,"WANT TO STOP LOOPING" D YN^DICN I %-2 K DCC
NUL S DI=99,(^UTILITY($J,99,0),DX(0))="Q" K D1,D2,D3,D4,D5
 Q

DIA3
DIA3 ;SFISC/GFT-UPDATE POINTERS, CHECK CODE IN INPUT STRING, CHECK FILE ACCESS ;19SEP2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S Y=DIA("P"),DH=1,DTO=DIA D PTS^DIT:'$D(^UTILITY("DIT",$J,0)) S ^UTILITY("DIT",$J,0)=0 Q:$D(^(0))<9
 D ASK^DITP Q:%-1
 S Y=0 I @("$O("_DIC_"0))'>0") G D
C W !,"WHICH DO YOU WANT TO DO? --",!?4,"1) DELETE ALL SUCH POINTERS",!?4,"2) CHANGE ALL SUCH POINTERS TO POINT TO A DIFFERENT '"_$P(^(0),U,1)_"' ENTRY",!!,"CHOOSE 1) OR 2): " R %:DTIME G F:U[%,W:%=2,C:%'=1
D W !,"DELETE ALL POINTERS" D YN^DICN G F:%<0,C:%-1,DITP
W W !,"THEN PLEASE INDICATE WHICH ENTRY SHOULD BE POINTED TO" D L^DIA2 G DITP:Y>0
F W $C(7),!,"OK... FORGET IT... LET'S GO ON TO EDIT ANOTHER ENTRY" Q
DITP S (^UTILITY("DIT",$J,DIA(1)),^(DIA(1)_";"_$E(DIA,2,999)))=+Y_";"_$E(DIA,2,999)
 W !?4,"("_$P("DELETION^RE-POINTING",U,''Y+1)_" WILL OCCUR WHEN YOU LEAVE 'ENTER/EDIT' OPTION)"
 Q
 ;
FIXPT(DIFLG,DIFILE,DIDELIEN,DIPTIEN) ;DELETE OR REPOINT POINTERS  ---never done??
 ;In V21, will just delete pointers.  Later, DIPTIEN will be record to repoint to.
 ;DIFLG="D" (delete), DIFILE=File# previously pointed to, DIDELIEN=Record# previously pointed to, DIPTIEN=New pointed-to record(future)
 N %X,%Y,X,Y,DIPTIEN,DIFIXPT,DIFIXPTC,DIFIXPTH D  I $G(X)]"" D BLD^DIALOG(201,X) Q
 . S X="DIFLG" Q:$G(DIFLG)'="D"  S X="DIDELIEN" Q:'$G(DIDELIEN)  S X="DIFILE" Q:'$G(DIFILE)  Q:$G(^DIC(DIFILE,0,"GL"))=""
 . S X="DIPTIEN" I $G(DIPTIEN) S Y=$G(^DD(DIFILE,0,"GL")) Q:Y=""  I '$D(@(Y_DIPTIEN_",0)")) Q  ;<<<Kevin T found bad code 11/14/05
 . K X Q
 S DIPTIEN=+$G(DIPTIEN),(DIFIXPT,DIFIXPTC)=1
 N %,BY,D,DHD,DHIT,DIA,DIC,DISTOP,DL,DR,DTO,FLDS,FR,IOP,L,TO,X,Y,Z K ^UTILITY("DIT",$J),^TMP("DIFIXPT",$J)
 S (DIFILE,DIA("P"),Y)=+DIFILE,(DIA,DTO)=^DIC(DIFILE,0,"GL"),DIA(1)=DIDELIEN
 D PTS^DIT S ^UTILITY("DIT",$J,0)=0 G:$D(^(0))<9 QFIXPT
 S (^UTILITY("DIT",$J,DIA(1)),^(DIA(1)_";"_$E(DIA,2,999)))=DIPTIEN_";"_$E(DIA,2,999)
 D P^DITP
QFIXPT K ^UTILITY("DIT",$J),DIFLG,DIFILE,DIDELIEN,DIIOP,DIPTIEN Q
 ;
X ;
 I 'Y S:'DSC&DB DB=DB+1 S Y=0 F  S Y=$O(Y(Y)) D D^DIA:Y'="" I Y="" S Y=-1 G 2^DIA
 S Y=X I DUZ(0)="@",X'?.E1":" S X=$S(X["//^":$P(X,"//^",2),1:X),X=$S(X[";":$P(X,";"),1:X) D ^DIM G:$D(X) P^DIA:X=Y I Y["//^",'$D(X) G BAD
 I Y[";" F %=2:1 S D=$P(Y,";",%) Q:D=""  S D=$S(D="DUP":"d",D="REQ":"R","""R""d"""[D:"",$A(D)=34:$E(D,2,$F(D,"""",2)-2),D="T":D,1:"") G BAD:D="",DIA3^DIQQQ:$A(D)>45&($A(D)<58)!(D[":") S DV=D_$C(126)_DV
 I Y[";" S X=$P(Y,";",1) S:'$D(DIAB) DIAB=Y G DIC^DIA
 F DK="///+","//+","///","//" I Y[DK S DP=$P(Y,DK,2,9) I DP'?1"/".E&(DP'?1"^".E)!(DUZ(0)="@") G DEF
 G BAD:Y'?.E1":"
E K X S:'$D(DIAB) DIAB=Y S DICOMP=L_"WE?",DQI="Y(",DA="DR(99,"_DXS_",",X=Y,DICMX=1 D ^DICOMPW I '$D(X) K DIAB G BAD:'$D(DP),ACC
L I $D(X)>1 S DXS=DXS+1,%=0 F  S %=$O(X(%)) Q:%=""  S @(DA_"%)=X(%)")
 S %=-1 S L=$S(Y>L:+Y,1:L\100+1*100),Y=U_DP_U_U_X_" S X=$S(D(0)>0:D(0),1:"""")",DRS=99 K X D DB^DIA S DI=+DP G FILETOP^DIA
 ;
DEF S X="DA,DV,DWLC,0)=X" F J=L:-1 Q:I(J)[U  S X="DA("_(L-J+1)_"),"_I(J)_","_X
 S DICMX="S DWLC=DWLC+1,"_DIA_X,DA="DR(99,"_DXS_",",DHIT=Y,X=DP,DQI="X(",DICOMP=L_"T?" D EN^DICOMP,DICS^DIA,XEC K X S X=$P(DHIT,DK,1),DV=DV_DK_DP G DIC^DIA:DV'[";"
BAD Q:$D(DTOUT)  G X^DIA
ACC K DIAB W !?9,"YOU HAVE NO WRITE ACCESS TO FILE "_+DP G BAD
 Q
 ;
XEC I $D(X),Y["m" S DIC("S")="S %=$P(^(0),U,2) I %,$D(^DD(+%,.01,0)),$P(^(0),U,2)[""W"",$D(^DD(DI,Y,0)) "_DIC("S")
 S Y=0 F  S Y=$O(X(Y)) Q:Y=""  S @(DA_"Y)=X(Y)")
 S Y=-1 I $D(X) S %=1,Y="DO YOU MEAN '"_DP_"' AS A VARIABLE" W !?63-$L(Y),Y D YN^DICN Q:%-1  S Y="Q",DXS=DXS+1,DP=U_X,DRS=99 D D^DIA:$S(DIAP:$P(DR(F+1,DI),";",DIAP#1000)'="Q",1:1) S:'$D(DIAB) DIAB=DHIT
 Q:DP'="@"  I DK="//" S DA=U_U Q
 W !,$C(7),"    WARNING: THIS MEANS AUTOMATIC DELETION!!"

DIAC
DIAC ;SFISC/YJK-FILE ACCESS CHECK ;3/18/99  12:59
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EN Q:'$D(DIAC)!'$D(DIFILE)
 I '$D(^DIC(DIFILE,0))#2 S (DIAC,%)=0 Q
 I DUZ(0)="@" S (DIAC,%)=1 Q
 S A1=$S(DIAC="DD":2,DIAC="DEL":3,DIAC="LAYGO":4,DIAC="RD":5,DIAC="WR":6,DIAC="AUDIT":7,1:0) D:A1 CK
 K A1 S %=DIAC Q
 ;
CK I $S($D(^VA(200,"AFOF")):1,1:$D(^DIC(3,"AFOF"))) D FOF Q
 I '$D(^DIC(DIFILE,0,DIAC)) S DIAC=1 Q
 S %=^(DIAC) I %="" S DIAC=1 Q
 F A1=1:1:$L(%) I DUZ(0)[$E(%,A1) S DIAC=1 Q
 I 'DIAC S DIAC=0
 Q
 ;
FOF S DIAC=0 I $S($D(^VA(200,DUZ,"FOF",DIFILE,0)):1,1:$D(^DIC(3,DUZ,"FOF",DIFILE,0))),$P(^(0),U,A1) S DIAC=1
 Q
 ;
 ;;

DIALOG
DIALOG ;SFISC/TKW - BUILD FILEMAN DIALOGUE ;24JAN2012
V ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DIANUM,DIPI) N DIERR,DIMSG,DIHELP,DIT Q:'$D(^DI(.84,DIANUM,0))  S DIT=$P(^(0),U,2)
 K ^TMP($S(DIT=1:"DIERR",DIT=2:"DIMSG",1:"DIHELP"),$J)
 S IOM=$G(IOM,80)
 D BLD(DIANUM,.DIPI),MSG("W"_$E("EMH",DIT),,IOM,1)
 Q
 ;
BLD(D0,DIPI,DIPE,DIALOGO,DIFLAG) ;BUILD FILEMAN DIALOG
 ;1)DIALOG file IEN, 2)Internal params, 3)External params, 4)Output array name, 5)S=Suppress blank line between messages, F=Format output like ^TMP
 N DINAKED S DINAKED=$NA(^(0))
 I $G(^DI(.84,+$G(D0),0))="" G Q1
 N E,I,J,K,L,M,N,P,R,S,X,O,DILANG S DILANG=+$G(DUZ("LANG")),DIFLAG=$G(DIFLAG)
 I $G(DIPE)]"",$O(DIPE(""))="" S DIPE(1)=DIPE
 I '$O(^DI(.84,D0,4,DILANG,1,0))!('DILANG) S DILANG=1
 S P=$P(^DI(.84,+D0,0),U,3)["y",R=$P(^(0),U,2) S:'R R=1
 S O=$G(DIALOGO) S:O="" O="^TMP(",DIFLAG=DIFLAG_"F" D  S DIALOGO=O
 . S I=$E(O,$L(O)) I $E(O,1,4)="DIR(" S DIFLAG=$TR(DIFLAG,"F","")
 . I DIFLAG'["F" S O=$E(O,1,($L(O)-1))_$S(I="(":"",I=",":")",1:I) Q
 . S O=$P(O,")",1)_$S("(,"[I:"",O'["(":"(",1:",")_""""_$P("DIERR^DIMSG^DIHELP",U,R)_""""_$P(","""_$J_"""",U,O["^TMP(")_")" ;WORRIED THAT $J WOULD NOT BE NUMERIC
 . Q
 S N=$O(@DIALOGO@(":"),-1)
 S N=N+1,(I,J,M)=0 S:R>1!(DIFLAG'["F") J=N-1
 I R=1,DIFLAG["F" S O=$P(O,")",1)_","_N_",""TEXT"")"
 I DILANG>1 F  S I=$O(^DI(.84,D0,4,DILANG,1,I)) Q:'I  S M=M+1,K(M)=$G(^(I,0)) I P S L=0 D PARAM
 I DILANG'>1 F  S I=$O(^DI(.84,D0,2,I)) Q:'I  S M=M+1,K(M)=$G(^(I,0)) I P S L=0 D PARAM
 G:'M Q2 D
 . N X S X=M
 . I N>1,DIFLAG'["S" I DIFLAG'["F"!(R>1) S J=J+1,@O@(J)=" ",X=X+1
 . I DIALOGO'["DIR" S:R=1 DIERR=($P($G(DIERR),U)+1)_U_($P($G(DIERR),U,2)+X) S:R=2 DIMSG=$G(DIMSG)+X S:R=3 DIHELP=$G(DIHELP)+X
 . D BTXT Q
 I (DIALOGO["DIR")!(R'=1)!(DIFLAG'["F") G Q2
 S @DIALOGO@(N)=D0
 S I="",J=0 F  S I=$O(DIPE(I)) Q:I=""  I $G(DIPE(I))]"" S @DIALOGO@(N,"PARAM",I)=DIPE(I),J=J+1
 I J S @DIALOGO@(N,"PARAM",0)=J
 S @DIALOGO@("E",D0,N)=""
 ;
Q2 I $G(^DI(.84,D0,6))]"" X ^(6)
Q1 Q:DINAKED=""  I DINAKED["(" Q:$O(@(DINAKED))]""  Q
 I $D(@(DINAKED))
 Q
 ;
PARAM S S=$F(K(M),"|",L) G:'S QP S E=$F(K(M),"|",S) G:'E QP
 S X=$E(K(M),S,E-2) G:X="" PARAM
 S DIPI(X)=$S($G(DIPI(X))]"":DIPI(X),1:$G(DIPI)),L=S+$L(DIPI(X))-$L(X)
 I ($L(K(M))+$L(DIPI(X)))<245 S K(M)=$E(K(M),1,S-2)_DIPI(X)_$E(K(M),E,9999) G:K(M)]"" PARAM K K(M) S M=M-1 G QP
 I $L($E(K(M),1,S-2))+$L(DIPI(X))<245 S K(M+1)=$E(K(M),E,9999),K(M)=$E(K(M),1,S-2)_DIPI(X),M=M+1,L=0 G PARAM
 I $L(DIPI(X))+$L($E(K(M),E,9999))<245 S K(M+1)=DIPI(X)_$E(K(M),E,9999),K(M)=$E(K(M),1,S-2),M=M+1,L=0 G PARAM
 S K(M+1)=DIPI(X),K(M+2)=$E(K(M),E,9999),K(M)=$E(K(M),1,S-2),M=M+2,L=0
 G PARAM
QP Q
 ;
BTXT N M
 F M=0:0 S M=$O(K(M)) Q:'M  S J=J+1 D
 .I DIALOGO'["DIR" S @O@(J)=K(M) Q
 .I '$O(K(M)),'$O(^DI(.84,D0,2,I)) S @DIALOGO=K(M) Q
 .S @DIALOGO@(J)=K(M) Q
 Q
 ;
EZBLD(D0,DIPI) ;RETURN SINGLE LINE OF TEXT FROM DIALOG FILE.
 ;D0 = DIALOG file IEN, DIPI = Input Params
 N DINAKED S DINAKED=$NA(^(0)) I $G(^DI(.84,+$G(D0),0))="" D Q1 Q ""
 N DILANG S DILANG=+$G(DUZ("LANG"))
 N X I DILANG>1 S X=$O(^DI(.84,+D0,4,DILANG,1,0)) S:X X=$G(^(X,0))
 I $G(X)']"" S X=$O(^DI(.84,+D0,2,0)) S:X X=$G(^(X,0))
 I ($P(^DI(.84,+D0,0),"^",3)'["y"!($G(X)="")) S X=$G(X) G QEZ
 N K,S,L,M,I,E S M=1,L=0,K(M)=X
 I $G(DIPI)]"",$O(DIPI(""))="" S DIPI(1)=DIPI
 D PARAM S X=$G(K(1))
QEZ D  Q X
 . N X D Q2 Q
 ;
 ;
MSG(DIFLGS,DIOUT,DIMARGIN,DICOLUMN,DIINNAME) ;WRITE MESSAGES OR MOVE THEM TO SIMPLE ARRAY.
 ;1)Flags, 2)Output array name, 3)Margin width of text, 4)Starting column no., 5)Input array name.
 N Z,%,X,Y,I,J,K,N,DITYP,DIWIDTH,DITMP,DIIN,DINAKED S DINAKED=$NA(^(0))
 S:$G(DIFLGS)="" DIFLGS="W" D
 . S DITMP=0 I $G(DIINNAME)="" S DIINNAME="^TMP(",DITMP=1 Q
 . N % S %=DIINNAME I %'["(" S DIINNAME=DIINNAME_"(" Q
 . Q:$E(%,$L(%))=","
 . I $E(%,$L(%))=")" S DIINNAME=$P(%,")",1)_"," Q
 . S DIINNAME=%_"," Q
 S DITYP="",%=0 D
 . F Z="E","H","M" S %=%+1 I DIFLGS[Z,$D(@(DIINNAME_""""_$P("DIERR^DIHELP^DIMSG",U,%)_""""_$P(","""_$J_"""",U,(DITMP>0))_")")) S $P(DITYP,U,%)=$P("DIERR^DIHELP^DIMSG",U,%)
 . I DITYP="",$D(@(DIINNAME_"""DIERR"""_$P(","""_$J_"""",U,(DITMP>0))_")")) S DITYP="DIERR"
 . Q
 S DIWIDTH=$S($G(DIMARGIN):DIMARGIN,$G(IOM):(IOM-5),1:75),DICOLUMN=+$G(DICOLUMN)
 K:DIFLGS["A" DIOUT S (K,Z)=0
AWS S K=K+1 I K>3 G Q1
 G:$P(DITYP,U,K)="" AWS
 S DIIN=DIINNAME_""""_$P(DITYP,U,K)_"""" S:DITMP DIIN=DIIN_","""_$J_""""
 S (I,N)=0
 F  S N=$O(@(DIIN_")")@(N)) Q:'N  S:K>1 X=$G(@(DIIN_","_N_")")) D:K>1  I K=1 D:I&(DIFLGS'["B") LN S I=1,J=0 F  S J=$O(@(DIIN_")")@(N,"TEXT",J)) Q:'J  S X=$G(@(DIIN_","_N_",""TEXT"","_J_")")) D
 . I DIFLGS["A",'$G(DIMARGIN) S Z=Z+1,DIOUT(Z)=X
 . I DIFLGS'["W",'$G(DIMARGIN) Q
 . S Y=X D:X=""  F  Q:X=""  F %=$L(X," "):-1:1 S:%=1&($L($P(X," ",1,%))>DIWIDTH) X=$E(X,1,(DIWIDTH-1))_" "_$E(X,DIWIDTH,$L(X)),%=%+1 I $L($P(X," ",1,%))'>DIWIDTH S Y=$P(X," ",1,%) D  S X=$P(X," ",%+1,$L(X," ")) Q
 .. W:DIFLGS["W" !?DICOLUMN,Y S:DIFLGS["A"&$G(DIMARGIN) Z=Z+1,DIOUT(Z)=Y
 .. Q
 . Q
 F I=K:1:2 I $P(DITYP,U,I+1)]"" D LN Q
 I DIFLGS["A",DIFLGS["T" S DIOUT=Z
 I DIFLGS'["S" K @(DIIN_")"),@($P(DITYP,U,K))
 G AWS
 ;
LN W:DIFLGS["W" ! S:(DIFLGS["A")&Z Z=Z+1,DIOUT(Z)="" Q

DIALOGU
DIALOGU ;SFISC/MMW - FUNCTIONS FOR DIALOGS ;24MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q  ;not for interactive use
OUT(Y,DIALF,%F) ;convert FileMan Data to language dependant output format
 ;Y is the value to transform, DIALF is the type of data
 ;%F Only for "FMTE" node. Passed from FMTE^DILIBF, indicates date format.
 ;DIALF must correspond to at least a subscript in the language file
 ;for the english language (entry #1) but may also have corresponding
 ;entries for other languages
 I $D(Y)[0!($G(DIALF)="") Q ""
 N DINAKED,DIY S DINAKED=$NA(^(0))
 N DILANG S DILANG=+$G(DUZ("LANG")) S:DILANG<1 DILANG=1
 S DIY=$G(^DI(.85,DILANG,DIALF)) I DIY="" S:DILANG'=1 DIY=$G(^DI(.85,1,DIALF)) I DIY="" S Y="" G Q
 X DIY
Q D:DINAKED]""
 . I DINAKED["(" Q:$O(@(DINAKED))  Q
 . I $D(@(DINAKED))
 . Q
 Q Y
 ;
PRS(D0,X) ;parse language dependant user input
 ;D0 is an entry in the DIALOG file
 ;X is the user input
 ;the function returns the number of the matching command word
 ;plus the corresponding english text. If no match was found -1 will
 ;be returned. If there is no user input the function returns the
 ;null string.
 N DINAKED,Y S DINAKED=$NA(^(0))
 I '$D(^DI(.84,+$G(D0)))!($G(X)']"") S Y=0 G Q
 N R,I,I1,IL,T,W,%,DILANG
 S DILANG=+$G(DUZ("LANG")) S:DILANG<1 DILANG=1
 I DILANG>1,'$O(^DI(.84,D0,4,DILANG,1,0)) S DILANG=1
 S X=$$OUT(X,"UC"),U="^"
 S R=$S(DILANG=1:"^DI(.84,"_D0_",2)",1:"^DI(.84,"_D0_",4,"_DILANG_",1)")
 S (I,I1,%)=0 F  S I=$O(@R@(I)) Q:'I!%  S T=$$OUT(@R@(I,0),"UC") D
 .F IL=1:1 S W=$P(T,U,IL) Q:W=""!%  S I1=I1+1 S:$E(W,1,$L(X))=X %=I1_U_$P(@R@(I,0),U,IL)
 I '% S Y=-1 G Q
 I DILANG=1 S Y=% G Q
 S (I,I1)=0,%=+% F  S I=$O(^DI(.84,D0,2,I)) Q:'I!(I1=%)  S T=^(I,0) D
 .F IL=1:1 Q:$P(T,U,IL)=""!(I1=%)  S I1=I1+1,W=$P(T,U,IL)
 S Y=%_U_$G(W) G Q

DIALOGZ
DIALOGZ ;GFT/GFT - CREATE AND USE FOREIGN-LANGUAGE ADDITIONS TO THE DATA DICTIONARY ; 16NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;FOREIGN-LANGUAGE UTILITES
 ;
 D LANG($G(DUZ("LANG"),1)) Q
 ;
ENGLISH ;
 N LANG D LANG(1) Q
GERMAN ;
 N LANG D LANG(2) Q
SPANISH ;
 N LANG D LANG(3) Q
FINNISH ;
 N LANG D LANG(5) Q
PORTUG ;
 N LANG D LANG(7) Q
ARABIC ;
 N LANG D LANG(10) Q
 ;
LANG(LANG) ;
 N DIC,DIR,DIAL,Y,DLAYGO,DIF,DIE,DSTART,DIALFILE,DA,DR,DIALDD,DUOUT
 S U="^",DIAL=$P(^DI(.85,LANG,0),U)
 D D^DICRW Q:Y<1
FILE S (DIALFILE,DSTART)=+Y,DIF=$P(Y,U,2) I $D(^DIC(DIALFILE,"ALANG",LANG,0)) S DIR("B")=^(0)
 D DIR(60) I X="@"!'$D(DUOUT)  D
 .I $D(DIR("B")) K ^DIC("ALANG"_LANG,DIR("B"),DIALFILE)
 .I Y="" K ^DIC(DIALFILE,"ALANG",LANG) W "  <DELETED!>" Q
 .S ^DIC("ALANG"_LANG,Y,DIALFILE)="",^DIC(DIALFILE,"ALANG",LANG,0)=Y
 K DIR
FIELDS F  D  Q:'$D(DSTART)
 .S DIC="^DD(DIALFILE,",DIC(0)="AEQM"
 .D DICW(DIALFILE)
 .W !! D ^DIC I Y<0 D  Q
 ..I DIALFILE=DSTART K DSTART Q
 ..S DIALFILE=DSTART
 .K DIR,DUOUT S DIALDD=+Y,DIF=$P(Y,U,2)
 .I $D(^DD(DIALFILE,DIALDD,.008,LANG,0)) S DIR("B")=^(0)
 .D DIR(60) K DIR I X="@"!'$D(DUOUT) D
 ..S ^DD(DIALFILE,DIALDD,.008,LANG,0)=Y
 ..I Y="" K ^(0) W "  <DELETED!>"
 .S Y=+$P(^DD(DIALFILE,DIALDD,0),U,2) I Y,$D(^DD(Y,.01,0)),$P(^(0),U,2)'["W" S DIALFILE=Y Q  ;GO DOWN INTO MULTIPLE
HLP .D:$G(^DD(DIALFILE,DIALDD,3))]""  Q:$D(DUOUT)
 ..W !!,"Current ",DIF," Field Help " S DIF="Prompt" W DIF,": "
 ..W:$X+$L(^(3))>75 !?2 W ^(3) D
 ...N DUZ S DUZ("LANG")=LANG I $D(^(.009,LANG,0)) S DIR("B")=^(0)
 ..D DIR(240) Q:X'="@"&$D(DUOUT)
 ..K DIR S ^DD(DIALFILE,DIALDD,.009,LANG,0)=Y
 ..I Y="" K ^(0) W "  <DELETED!>"
SET .D:$P(^DD(DIALFILE,DIALDD,0),U,2)["S"
 ..N SET
 ..S SET=$$SL($P(^(0),U,3)),DIF="SET values"
 ..W !!,"Current ",DIF,": " W:$X+$L(SET)>75 !?2 W SET
 ..I $D(^(.007,LANG,0)) S DIR("B")=^(0)
 ..S DIR("?")="YOU MUST ENTER "_$L($$SL(SET),";")_" EXTERNAL VALUES, SEPARATED BY SEMICOLONS(;)"
 ..D DIR("240^S X=$$SL^DIALOGZ(X) K:$L(X,"";"")-$L(SET,"";"")!(X["":"") X") Q:X'="@"&$D(DUOUT)
 ..K DIR S ^DD(DIALFILE,DIALDD,.007,LANG,0)=Y
 ..I Y="" K ^(0) W "  <DELETED!>"
 W !!! Q
 ;
SL(S) ;
 I S?.E1";" S S=$E(S,1,$L(S)-1)
 Q S
 ;
 ;
DIR(LN) S DIR("A")=DIAL_" translation of "_DIF,DIR(0)="FO^2:"_LN
 K DUOUT G ^DIR
 ;
FILENAME(FILE) ;
 N N,F
 I 'FILE Q "FIELD"
 I $D(^DIC(FILE,0))#2 D  Q F
 .S F=$P(^(0),"^")
 .I $G(DUZ("LANG")),$D(^("ALANG",DUZ("LANG"),0))#2 S F=^(0)
 S N=$G(^DD(FILE,0,"UP")) I N S F=$O(^DD(N,"SB",FILE,0)) I F Q $$LABEL(N,F)
 Q ""
 ;
 ;
LABEL(FILE,FIELD) ;Called many places to return the foreign-language FIELD NAME
 N N
 S N=$P($G(^DD(FILE,FIELD,0)),"^") I N="" Q N
 I $P(^(0),"^",2)["W",$G(^DD(FILE,0,"UP")) Q $$LABEL(^("UP"),$O(^DD(^("UP"),"SB",FILE,0)))
 I $G(DUZ("LANG")),$D(^(.008,DUZ("LANG"),0))#2 Q ^(0)
 Q N
 ;
HELP(FILE,FIELD) ;
 G 3:FILE<2!'$G(DUZ("LANG")),3:$G(^DD(FILE,FIELD,3))'?.P&(DUZ("LANG")'>1)
 I $D(^DD(FILE,FIELD,.009,DUZ("LANG"),0))#2 Q ^(0)
 N Y,DICATT5,DICATT2,P
 S DICATT2=$P(^DD(FILE,FIELD,0),U,2),DICATT5=$P(^(0),U,5,999)
 I DICATT2["D" D
 .D EARLY^DICATTD1 S:$D(Y) P(1)=Y D LATEST^DICATTD1 S:$D(Y) P(2)=Y
 .K Y I $D(P(1)) S Y=$$EZBLD^DIALOG($S($D(P(2)):9114,1:9114.01),.P)
 I DICATT2["N" D
 .S P(1)=+$P(DICATT5,"X<",2)
 .S P(2)=+$P(DICATT5,"X>",2)
 .S P(3)=$P(DICATT5,"1"".""",2)-1 I P(3)<0 S P(3)=0 S:DICATT5["""$""" P(3)=2
 .S Y=$$EZBLD^DIALOG($S(DICATT5["""$""":9118.1,1:9118),.P)
 I DICATT2["F" D
 .S P(1)=+$P(DICATT5,"$L(X)<",2) I P(1) S P(2)=+$P(DICATT5,"$L(X)>",2) I P(2) S Y=$$EZBLD^DIALOG($S(P(1)=P(2):9119.1,1:9119),.P)
 I $D(Y) S ^DD(FILE,FIELD,.009,DUZ("LANG"),0)=Y
 I $G(Y)]"" Q Y
3 Q $G(^DD(FILE,FIELD,3))
 ;
DICW(FILE) ;
 S DIC("W")="N % S %=$P(^(0),U,2)" ;**CCO/NI + NEXT 2 LINES  WRITE OUT FIELD NAME IN 2 LANGUAGES
 I $G(DUZ("LANG"))>1 S DIC("W")=DIC("W")_" W:$D(^(.008,DUZ(""LANG""),0)) ?37,$$LABEL^DIALOGZ("_FILE_",+Y)"
 S DIC("W")=DIC("W")_" W:% $P(""  (multiple)^  (word-processing)"",U,$P($G(^DD(+%,.01,0)),U,2)[""W""+1)"
 Q
 ;
 ;
SETIN() ;NAKED REFERENCE  Builds the SET STRING user sees, with  1,2,3...
 N C,P
 S C=$P(^(0),U,3)
 I $D(^(.007,DUZ("LANG"),0)) D
 .S C=^(0) F P=1:1:$L(C,";") S $P(C,";",P)=P_":"_$P(C,";",P)
 E  D
 .N TRY,OUT,O
 .S TRY="" F P=1:1 Q:$P(C,";",P)=""  S O=$P($P(C,";",P),":",2),OUT=$$YESORNO(O),TRY=TRY_P_":"_OUT_";" I OUT=O K TRY Q
 .I $D(TRY) S C=TRY
 Q C
 ;
SETOUT() ;NAKED REFERENCE    Builds the SET STRING that converts INTERNAL to user's EXTERNAL
 N P,V,C
 S C=$P(^(0),U,3)
 I $D(^(.007,DUZ("LANG"),0)) D
 .F P=1:1:$L(^(0),";") S V=$P(C,";",P),$P(V,":",2)=$P(^(0),";",P),$P(C,";",P)=V
 E  F P=1:1:$L(C,";") S V=$P(C,";",P),$P(V,":",2)=$$YESORNO($P(V,":",2)),$P(C,";",P)=V
 Q C
 ;
YESORNO(Y) ;TRY TO TURN YES OR NO INTO 'SI', WHATEVER
 Q:'$G(DUZ("LANG")) Y
 I $$UP^DILIBF(Y)="YES",$D(^DI(.84,7001,4,DUZ("LANG"),1,1,0)) Q $P(^(0),U)
 I $$UP^DILIBF(Y)="NO",$D(^DI(.84,7001,4,DUZ("LANG"),1,1,0)) Q $P(^(0),U,2)
 Q Y
 ;

DIAR
DIAR ;SFISC/TKW,WISC/CAP-ARCHIVING FUNCTIONS ;7/1/93  4:17 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G NOKL
 ;
1 ;;SELECT ENTRIES TO ARCHIVE
 S DIAR=1 D DIAR^DICRW G Q:Y<0 S %=$P(Y,U,2),(Y,DIARF,DIART)=+Y
 ;TEMPORARY CHANGE TO SKIP SUB-FILE OPTION--NOT COMPLETE
 G O
 G O:'$O(^DD(DIARF,"SB",0))
 W !!,"IF YOU PLAN TO ARCHIVE DATA ONLY FROM ONE SUB-FILE"
 W !,"PLEASE IDENTIFY IT HERE.  OTHERWISE, JUST PRESS RETURN.",!
 D SUB^DICRW G Q:$D(DTOUT)!$D(DUOUT),O:'$D(DIA) S DIARF=DIA
 S DIARF0="D0," F D=1:1 Q:'$D(^DD(DIA,0,"UP"))  S DIARF0=DIARF0_"D"_D_",",DIA=^("UP")
O S I="" D CHK
 I '$D(DIARC) D NEW^DIARCALC G Q:'$D(DIARC) G T1
 I $P(Y(0),U,7)>0 W !!,"There is already an outstanding "_$S(+$P(Y(0),U,17):"extract",1:"archiving")_" activity.",!,"Please finish it or CANCEL it.",$C(7),!! G Q
 D MRK^DIARU
T1 S DIC=DIART,L="]" I $D(DIARF0) S DIARF1=$L(DIARF0,",")-1
 D EN^DIS I '$P(^DIAR(1.11,DIARC,0),U,7) W $C(7),!!,"NO RECORDS WERE SELECTED TO BE "_$S($D(DIAX):"EXTRACTED",1:"ARCHIVED")_"!!",!,"I AM DELETING THIS ARCHIVING ACTIVITY RECORD!!" S DIK="^DIAR(1.11,",DA=DIARC D ^DIK
 G Q
 ;
CHK ;IS THERE A VALID SEARCH ?
 K DIARC,Y(0) S I=0,Y=$S($D(DIARF):DIARF,1:Y)
C S I=$O(^DIAR(1.11,"C",+Y,I)) Q:'I  S Y(0)=""
 G C:'$D(^DIAR(1.11,I,0)) G C:$P(^(0),U,8)>89 S Y(0)=^(0)
 S DIC=$P(Y(0),U,2),DIARC=I,DIARU=$P(Y(0),U,3),DIARP=$P(Y(0),U,4)
 Q
2 ;;ADD/DELETE SELECTED ENTRIES
 S DIAR=2 G ENTE^DIARB
 ;
3 ;;PRINT SELECTED ENTRIES
 S DIAR=3 G OUT^DIARA
 ;
4 ;;CREATE FILEGRAM ARCHIVING TEMPLATE
 S DI=1,DIAR="" G EN^DIFGO
 ;
5 ;;WRITE ENTRIES TO TEMPORARY STORAGE
 S DIAR=4 G OUT^DIARA
 ;
 ;
6 ;;MOVE ARCHIVED DATA TO PERMANENT STORAGE
 S DIAR=5 D FILE^DIARU G Q:'$D(DIARC)
 W !!,"NOTE: This option will 1) print an archive activity report to specified",!,"PRINTER DEVICE and 2) will move archive data to permanent storage to specified",!,"ARCHIVE STORAGE DEVICE."
 W !!,"Select some type of SEQUENTIAL media, such as SDP, TAPE, or DISK FILE (HFS),",!,"for archival storage.",!
 S %ZIS("A")="PRINTER DEVICE: ",%ZIS("B")="",%ZIS="NQ" D ^%ZIS G 65:POP S DIARPDEV=$S($D(ION)#2:ION,1:IO),DIARTRM=$S(IO=IO(0):1,1:0)
 I $D(IOST)#2,IOST]"" S DIARPDEV=DIARPDEV_";"_IOST
 F DIARX="IOM","IOSL" S:($D(@DIARX)#2&@DIARX) DIARPDEV=DIARPDEV_";"_@DIARX
 I $D(IO("Q")) S DIARQUED=1
 S %ZIS="Q",%ZIS("B")="",%ZIS("A")="ARCHIVE STORAGE DEVICE: " D ^%ZIS G 65:POP
 I IOT'["HFS",IOT'["MT",IOT'["SDP" D 63 I $D(DIRUT)!('Y) D 64 G 65
 I $D(IO("Q")),DIARTRM U IO(0) W !,$C(7),"SINCE YOU SELECTED QUEUEING, YOU SHOULD SELECT A PRINTER DEVICE",!,"OTHER THAN YOUR TERMINAL!",! G 65
 D AL I $D(DTOUT)!$D(DIRUT) D 64 G 65
 I $D(IO("Q")) D  G Q
 . I '$D(DIARQUED),'DIARTRM S DIARQUED=1 U IO(0) W !,$C(7),"SINCE YOU SELECTED QUEUEING, REPORT WILL BE QUEUED ALSO!",!
 . S ZTRTN="62^DIAR",ZTSAVE("DIARC")="",ZTSAVE("DIAR")="",ZTDESC="Move archived data to permanent storage",ZTSAVE("DIARPDEV")="",ZTSAVE("DIARQUED")=""
 . D ^%ZTLOAD,HOME^%ZIS Q
62 D ^DIARX
 S DIARL="F  Q:$A(DIARLINE)-32  S DIARLINE=$E(DIARLINE,2,999)"
 U IO F I=0:0 S I=$O(^DIAR(1.11,DIARC,"D",I)) Q:I'>0  I $D(^(I,0)) S DIARLINE=^(0) X:$E(DIARLINE)[" " DIARL W DIARLINE,!
 W "#$#",!
 D 64,OUT^DIARX,UPDATE^DIARU
 G Q
63 U IO(0) W !,$C(7),"The ARCHIVE STORAGE device selected does not look like a SEQUENTIAL",!,"storage medium.",!
 K DIR S DIR(0)="Y",DIR("B")="NO",DIR("A")="Are you sure you want to continue" D ^DIR
 I Y U IO(0) W !,"OK.",!
 Q
64 X $G(^%ZIS("C"))
 Q
65 ;
 G UNLK^DIARA
 ;
7 ;;PURGE STORED ENTRIES
D S DIAR=90 G ENTD^DIARA
 ;
8 ;;CANCEL ARCHIVAL SELECTION
 S DIAR=99 G ENTC^DIARA
 ;
9 ;;FIND ARCHIVED ENTRIES
 S DIC=9.4,DIC(0)="QM",DIC("S")="I $P(^(0),U,2)=""XU""",X="KERNEL" D ^DIC K X,DIC I Y'>0 W !,$C(7),"YOU NEED KERNEL TO RUN THIS OPTION" Q
 I $G(^DIC(9.4,+Y,"VERSION"))'>7.0 W !,$C(7),"YOU NEED KERNEL V7.1 TO RUN THIS OPTION" Q
 G ^DIARR
 ;
Q G Q^DIARB
 ;
AL ; archive device label
 U IO(0) K DIR,DA
 S DIARXXX=$S(IOT["MT":IO_"ARCHIVE"_";"_DT_";"_DIARC,1:IO)
 S DIR(0)="1.11,18",DIR("B")=DIARXXX D ^DIR Q:$D(DTOUT)!$D(DUOUT)
 S DIARXXX=X,DIE=1.11,DA=DIARC,DR="18////^S X=DIARXXX" D ^DIE
 Q
NOKL S DIK="^DOPT(""DIAR""," G GO:$D(^DOPT("DIAR",9))
 S ^(0)="ARCHIVE OPTION^1.01^" K ^("B")
 F I=1:1:9 S ^DOPT("DIAR",I,0)=$P($T(@I),";;",2)
 D IXALL^DIK
GO W ! S DIC=DIK,DIC(0)="AEQI" D ^DIC K DIC,DIK
 I Y'<0 S X=+Y K Y D @X G NOKL
 W ! G Q^DII

DIARA
DIARA ;SFISC/TKW,WISC/CAP-ARCHIVING FUNCTIONS (CONT) ;22SEP2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ENTD ; PURGE
 W:'$D(DIAX) !!,$C(7),$C(7),"BEFORE YOU PURGE, MAKE SURE THAT YOUR ARCHIVE MEDIUM IS READABLE!",!,"YOU MAY USE THE FIND ARCHIVED ENTRIES OPTION TO FIND THE LAST",!,"ARCHIVED RECORD APPEARING ON THE INDEX.",!
 K DIR S DIR(0)="Y",DIR("A")="Do you want to proceed",DIR("B")="NO" D ^DIR Q:$D(DUOUT)!$D(DTOUT)!($G(Y)'=1)
 D FILE^DIARU G Q:'$D(DIARC)
 I $D(^DD(DIARF,0,"PT")) W !!,$C(7),"The records about to be purged should not be 'pointed to' by other records to",!,"maintain database integrity."
 W ! K DIR S DIR(0)="Y",DIR("A",1)="This option will DELETE DATA from both "_$P(^DIC(DIARF,0),U),DIR("A",2)="and from the ARCHIVAL ACTIVITY file.",DIR("A")="Are you sure you want to continue",DIR("B")="NO"
 D ^DIR G UNLK:$D(DUOUT)!$D(DTOUT)!($G(Y)'=1)
 S DIFILE=DIARF,DIAC="DEL" D ^DIAC I '% W !,$C(7),"Sorry, you cannot purge this archival activity!",!,"You do not have DELETE access to ",$P(^DIC(DIARF,0),U),"." G UNLK
 W !!,"The entries will be deleted in INTERNAL NUMBER order."
 S DIARS="" F K="ID","SP" F I=0:0 S I=$O(^DD(DIARF,0,K,I)) Q:+I'=I  I $D(^DD(DIARF,I,0))#2 S X=$P(^(0),U,4) I $P(X,";")=0 S DIARS=DIARS_$P(X,";",2)_U
D0 S DA=$O(^DIBT(DIARU,1,0))
 I DA="" W !!,"<< ",$P(^DIAR(1.11,DIARC,0),U,7)," ENTRIES PURGED >>" K ^("D"),^("EX") D UPDATE^DIARU G Q
 S DIK=DIC,DIARS(0)=$S($D(@(DIC_"DA,0)")):^(0),1:"") K ^DIBT(DIARU,1,DA)
 I DIARS(0)="" S Y=$P(^DIAR(1.11,DIARC,0),U,7),$P(^(0),U,7)=Y-1 G D0
 D ^DIK G D0:DIARF'=DIARF2 S Y=DIARS(0),X=$P(Y,U)
D F I=1:1 Q:$P($G(DIARS),U,I)=""  S %=$P(DIARS,U,I),$P(X,U,%)=$P(Y,U,%)
E G D0
 ;
ENTC ;CANCEL
 S DIC("A")="CANCEL WHICH "_$S($D(DIAX):"EXTRACT",1:"ARCHIVING")_" SELECTION: " D FILE^DIARU G Q:'$D(DIARC)
 S DIR("A")="Are you sure you want to CANCEL this "_$S($D(DIAX):"EXTRACT",1:"ARCHIVING")_" ACTIVITY",DIR("B")="NO",DIR(0)="Y"
 S DIR("??")="^W !!?5,""Enter YES to stop this activity and start again from the beginning."""
 D ^DIR G UNLK:$D(DUOUT)!$D(DTOUT),UNLK:'Y
 F I=0:0 S I=$O(^DIBT(+DIARU,1,I)) Q:'I  K @(DIC_I_",-9)")
 I $D(DIAX) S DIAXNRB=0 I DIARST=6,$D(^DIAR(1.11,DIARC,"EX")) D ASK^DIARB G UNLK:$D(DUOUT)!$D(DTOUT) I 'DIAXNRB,$D(^DIAR(1.11,DIARC,"EX")) S DIK=^DIC(DIAXFNO,0,"GL"),DA=0,DIOVRD=1 F  S DA=$O(^DIAR(1.11,DIARC,"EX","B",DA)) Q:DA'>0  D ^DIK
 S DIK="^DIAR(1.11,",DA=DIARC D ^DIK W !!,">>> DONE <<<"
 G Q
 ;
OUT ;USED TO PRINT LISTING OR TO WRITE TO TEMP.STORAGE
 K DIARC,FLDS D FILE^DIARU G Q:'$D(DIARC)
 S DIARD=0 W !!
 D @DIAR
 I DIAR'=3 K DIARP S DIE="^DIAR(1.11,",DA=DIARC,DR="3;S DIARP=X" D ^DIE G UNLK:$D(DTOUT)!'$D(DIARP) S FLDS="[`"_DIARP_"]"
 S FR="",TO="",L=0 K DIOEND S:(DIAR'=3) DIOEND="W !,$P(^DIAR(1.11,DIARC,0),U,7)"_","""_" ITEMS HAVE BEEN "_$S($D(DIAX):"EXTRACTED",1:"ARCHIVED")_"""",DISTOP=0
 K DIE,DR,DA S BY="[`"_DIARU_"]",DIARI=DIARU S:DIAR=3 BY=BY_",.01"
 S DHD=$P(^DIC(DIARF,0),U)_$S($D(DIAX):" EXTRACT",1:" ARCHIVING")_" ACTIVITY",DIC=^(0,"GL")
 F %=0:0 S %=$O(^DIAR(1.11,DIARC,"S",%)) Q:%'>0  S DIFG(+DIARF2,^(%,0))=^(1)
 S %=$O(DIFG(+DIARF2,"")) K:%="" DIFG
 I $D(DIFG) S DIFG(+DIARF2,"S")="X DIFG("_+DIARF2_","_%_")"
 D EN1^DIP
 I DIAR'=3,$G(POP) G UNLK
 G Q
UNLK S DIAR="" D UPDATE^DIARU
Q K POP G Q^DIARB
 ;
3 W "Enter regular Print Template name or fields you wish to see printed on this",!,"report of entries to be "_$S($D(DIAX):"extracted.",1:"archived.") Q
4 W "You MUST enter a FILEGRAM template name.  This FILEGRAM template will be used",!,"to actually build the archive message." Q

DIARB
DIARB ;SFISC/TKW,WISC/CAP-ARCHIVING FUNCTIONS (CONT) ;4/24/96  10:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ENTE ;ADD/REMOVE ENTRIES TO SELECTED
 S DIC("A")="ADD/DELETE ENTRIES FROM ARCHIVAL ACTIVITY: " K DIARC D FILE^DIARU G Q:'$D(DIARC)
 S DIARCNT=0 K DIC
D S DIC=+DIARF,DIC(0)="AEQMF",DIART=DIARF2,Z=0
E W ! S DIC("W")="W:$D(^DIBT(DIARU,1,+Y)) "" *on "_$S($D(DIAX):"EXTRACT",1:"ARCHIVE")_" list*"" S DIARX="""" F DIARX2=0:0 S DIARX=$O(^DD(+DIARF,0,""ID"",DIARX)) Q:DIARX=""""  S DIARX3=^(DIARX) I $D(@(DIC_""+Y,0)"")) X DIARX3"
 D ^DIC K DIC("W")
 I Y'>0 G QE
 S X=DIART G F:'X S Z=Z+1,%=$P($P(X,U,2),",",Z)
 G F:'% S $P(X,U)=$P($P(X,U),",",2,999),DIC=DIC_+Y_","_%_","
 I $D(@(DIC_"0)")),$P(^(0),U,2)-X=0 S DIART=X G E
 W !,$C(7),"No "_$O(^DD(+X,0,"NM",""))_" entry !!!",!
 G D
F K DR S DA=+Y,DR=0 D EN^DIQ
 I '$D(^DIBT(DIARU,1,DA)) G E1
 S DIR(0)="Y",DIR("A")="DELETE this entry FROM the "_$S($D(DIAX):"EXTRACT",1:"ARCHIVAL")_" SELECTION",DIR("B")="YES"
 D ^DIR G QE:$D(DUOUT)!$D(DTOUT),QE:'$D(Y)
 I 'Y W !!,"OK, I left it IN !" G D
 S DIARCNT=DIARCNT+1,A=^DIAR(1.11,DIARC,0),$P(A,U,7)=$P(A,U,7)-1,$P(A,U,8)=2,^(0)=A
 K ^DIBT(DIARU,1,DA),@(DIC_DA_",-9)") W "  Deleted"
 G D
E1 S DIR(0)="Y",DIR("A")="ADD this entry TO the "_$S($D(DIAX):"EXTRACT",1:"ARCHIVAL")_" SELECTION",DIR("B")="YES"
 D ^DIR G QE:$D(DUOUT)!$D(DTOUT),QE:'$D(Y)
 I 'Y W !!,"OK, I left it OUT !" G D
 S DIARCNT=DIARCNT+1,A=^DIAR(1.11,DIARC,0),$P(A,U,7)=$P(A,U,7)+1,$P(A,U,8)=2,^(0)=A
 S ^DIBT(DIARU,1,DA)="" W "  DONE"
 G D
QE S:'DIARCNT DIAR="" D UPDATE^DIARU
Q K DIAR,DIARC,DIARCNT,DIARD,DIARE,DIARF,DIARF0,DIARF1,DIARF2,DIARI,DIARP,DIARS,DIARST,DIART,DIARU,DIARX,DIAR
 K DIR,DIC,DIARL,DIARLINE,DIARBLNE,DIARPDEV,DIARPG,DIAX,DIAXFNO,DIAXNRB,DIAXMSG,DIARQUED,DIARTAB,DIARTRM,DIARXZ,DIARFLD,DIARFI,DIARXY
 K DIFILE,DIARXXX,DISTOP,DIARX2,DIARX3,DIPG,DIERR,DIOVRD
 Q
ASK W !!,$C(7),"This extract activity has already updated the destination file.",!
 S DIR("A")="Delete the destination file entries created by this extract activity",DIR("B")="NO",DIR(0)="Y"
 S DIR("??")="^W !!?5,""Enter YES to rollback the destination file to its state before the update."""
 D ^DIR I 'Y S DIAXNRB=1
 Q

DIARCALC
DIARCALC ;SFISC/TKW,WISC/CAP-ARCHIVING Variables Doc / Misc Calc.;06:10 PM  5 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;COMPUTE BOUNDARIES
FROM ;SELECT FROM VALUE 4 SORT
 S X="F" D G
FIRST I $D(DIARS) S:A="" A=$P(DIARS,U,2) S:A="" A=$$EZBLD^DIALOG(7070) G Q ;**CCO/NI  'FIRST'
 D H Q:X=""  S DIARS=Y_U_X Q
TO ;SELECT TO VALUE 4 SORT
 S X="T" D G
LAST I $D(DIARE) S:A="" A=$P(DIARE,U,2) S:A="" A=$$EZBLD^DIALOG(7071) G Q ;**CCO/NI 'LAST'
 D H Q:X=""  S DIARE=Y_U_X Q
G S DIART=L,L=0 I $D(DIPP(DJ,X)) S A=$P(DIPP(DJ,X),U,2) Q
 I $D(DPP(DJ,X)) S A=$P(DPP(DJ,X),U,2) Q
 S A="" Q
H ;
 S %=X,%1=DISV
 I +%1,$D(^DIBT(%1,2,DJ,%)) S (X,%2)=$P(^(%),U,2) I "z"'[X
EGP E  S %2=$S(%="T":$$EZBLD^DIALOG(7071),1:$$EZBLD^DIALOG(7070)),X="" ;**CCO/NI 'FIRST' OR 'LAST'
 I X="",'$D(DIAR) S A=%2,L=DIART G Q
 D CK:X'=""
 S L=DIART,A=$S(%="F"&(X]%2):X,%="T"&(%2]X)&(X'=""):X,A'="":A,1:%2)
Q K %,%1,%2,DIART Q
 ;
NEW ;SET UP INITIAL ARCHIVAL ACTIVITY
 D NOW^%DTC
 S X=$P(^DIAR(1.11,0),U,3) F X=X:1 L +^DIAR(1.11,X):0 Q:$T&'$D(^(X))  L -^DIAR(1.11,X)
 S Z="1////"_DIART_";4////"_DT_$S($D(^VA(200)):";8////"_DUZ,1:"")_";30////"_DIARF_";13////"_DIAR_";14////"_%_$S($D(^VA(200)):";15////"_DUZ,1:"")_";16////"_$S($D(DIAX):1,1:0)
 I $D(DIARF0) S Z=Z_";31////"_DIARF0
 S DINUM=X,DIC("DR")=Z
 S DIC="^DIAR(1.11,",DIC(0)="EF"
 K DO D FILE^DICN S DIARC=+Y K DR
 Q
 ;
CK S DIART=%_U_%2_U_A D CK^DIP12
 S %=$P(DIART,U,1),%2=$P(DIART,U,2),A=$P(DIART,U,3) Q
VAR ;
 ;DIAR0 = List of human readable conditions from ^DOPT("DIS" in ^ pieces
 ;DIARC = Internal record number of Archival Activity
 ;DIARD = Array of information from default package archival search
 ;        template for this file.  (Created in DIAR0)
 ;DIARDC= Number of default conditions
 ;DIARE = To value in DIP sort questions
 ;DIARF = Internal number of file being archived
 ;DIARF0= Subfile List or DIAR/DIBT INDEX
 ;DIARI = SEARCH TEMPLATE USED
 ;DIARF1=Level # that search is on
 ;DIARP = Internal record no. of Filegram template
 ;DIARS = Temporary value / From value in DIP sort questions
 ;DIART = Temporary storage variable
 ;DIARU = Internal number of Select Criteria Template
 ;DIARST = Archival Activity upon entry to archival option

DIARR
DIARR ;SFISC/DCM-ARCHIVING FUNCTION, RETRIEVAL OF ARCHIVED RECORD ;8/11/98  13:19
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START W !!,"This option will scan your archived file and will attempt to retrieve entries"
 W !,"that match the name (.01) field and",!,"either Primary KEY or identifier field(s) of the archived file."
 W !!,"Magnetic tapes should be opened with variable length records."
 ;
INIT S DIARX="F  U DIARIO R DIARL Q:DIARL]""""&($A(DIARL)'=13)  "
 D HOME^%ZIS S DIOF=IOF,DIOSL=IOSL
 D DT^DICRW
 K ^TMP("DIAR",$J)
 S (DIARREQ,DIAROUT,DIARZ,DIAREOF,DIARMTCH,DIARFGEN,DIARPG,DIARRCT,DIARZID,DIARZL,DIARZ1,DIARZ2,DIARX1,DIARY,DIARNM,DIARRCT,DIARFND,DIARRHP)=0,DIARLINE=""
 ;
SEQDEV S %ZIS("A")="SEQUENTIAL ARCHIVE DEVICE: ",%ZIS("HFSMODE")="R" D ^%ZIS G EOJ:POP
 I IOT'["MT",IOT'["SDP",IOT'["HFS" D ^%ZISC W !,$C(7),"This has to be a sequential device." G SEQDEV
 I IOT["MT",IOPAR'["V" D ^%ZISC W !,$C(7),"Open this device with variable length records." G SEQDEV
 S DIARIO=IO
 ;
RC X DIARX I $E(DIARL,1,4)'["$IND",$E(DIARL,1,4)'["$DAT" D ^%ZISC W !,$C(7),"Archive information is not in filegram format" G SEQDEV
 I $E(DIARL,1,6)="$INDEX" S DIARIDX=1 D ^DIARR6 G RC3
 U IO(0) W !!,"Sampling archived file...",!
RC2 I $P(DIARL,U)="$DAT" S DIARFILE=$P(DIARL,U,2),DIARFN=+$P(DIARL,U,3)
 X DIARX S DIARNAME=$P(DIARL,"=",2) X DIARX
 F  X DIARX Q:(($P(DIARL,":")="END")&(+$P(DIARL,U,2)=DIARFN))  D RC1:$P(DIARL,":")="BEGIN" I ($P($P(DIARL,U),":")="IDENTIFIER")!($P($P(DIARL,U),":")="SPECIFIER") D ID
 F  X DIARX Q:$P(DIARL,U)["$END DAT"  I +$P(DIARL,U,2)=".01" S DIAR01=$P(DIARL,U) S ^TMP("DIARHLP",$J,DIARRCT+1,.01)=DIAR01_" = "_$P(DIARL,"=",2) Q
 I '$D(DIAR01) S DIARNM=1,^TMP("DIARHLP",$J,DIARRCT+1,.01)="NAME = "_DIARNAME
 S DIARRCT=DIARRCT+1
 F  X DIARX  Q:((DIARL["#$#")!(DIARRCT>5))  G RC2:((DIARRCT'>5)&($P(DIARL,U)["$DAT"))
 ;
RC3 I DIARNM,'$D(DIAR01) S DIAR01="NAME"
 S DIARXXX=$$REWIND^%ZIS(IO,IOT,IOPAR)
 ;
FILE U IO(0) W !,"You are reading archived information from the "_DIARFILE_" file."
 K DIR S DIR(0)="Y",DIR("B")="YES",DIR("A")="Do you want to continue"
 D ^DIR G EOJ:'Y!($D(DIRUT))
 ;
 D ^DIARR1 G EOJ:$D(DTOUT)!($D(DUOUT)&(DIARREQ'>0))!('$D(DIARR))!POP K DIRUT,DUOUT
 D ^DIARR2
 D ^DIARR3
 D ^DIARR5
 D EOJ
 Q
 ;
ID S DIARID(+$P(DIARL,U,2))=$P($P(DIARL,U),":",2)_U_+$P(DIARL,U,2)
 S ^TMP("DIARHLP",$J,DIARRCT+1,$P($P(DIARL,U),":",2))=$P($P(DIARL,U),":",2)_" = "_$P(DIARL,"=",2)
 Q
 ;
RC1 S DIARFN1=+$P(DIARL,U,2)
 F  X DIARX Q:(($P(DIARL,":")="END")&(+$P(DIARL,U,2)=DIARFN1))
 Q
 ;
EOJ D ^%ZISC
 K POP,DIARX,DIARFILE,DIARFN,DIARIO,DIARID,DIAR01,DIARZ,DIARREQ,DIARR,DIR,DIRUT,DTOUT,DUOUT,%MT,DIAROUT,DIARPDEV
 K DIARL,DIARA,DIAREOF,DIARF2,DIARFGEN,DIARFGL,DIARMTCH,DIARNM,DIARY,DIARIDDN,DIARMTID,DIARMT01,DIARZID
 K ^TMP("DIAR",$J),DIARRF,DIARZ1,DIARZ2,DIARRCT,DIARPG,DIARZL,DIARX1,DIARLINE,DIARIDS,DIARQUED,DIARFN1
 K DIARHLP,DIARRHP,DIARZHP,DIARNAME,DIAROFLD,DIAROIDF,DIAROAT,DIAROFLD,DIAROIDF,DIAROLVL,DIAROSTK,DIAROVAL,DIAROXPL
 K DIAROLNE,DIAROLUP,DIAROM,DIAROREQ,DIAROSUB,DIAROTAB,DIAROX,DIAROX1,DIAROZ,DIARZZ,DIARTAB,DIAROBPT,^TMP("DIARO",$J)
 K DIAROBCK,DIAROBF,DIAROBFN,DIAROBF1,DIAROSF,DIAROSFN,DIAROXX,DIARCNT,DIARCTR,DIARFLD,DIARFLGT,DIARFNA,DIARFNO,DIARIDX
 K DIARIXCT,DIARIXX,DIARPC,DIARREC,DIARVAL,DIARXX,DIARFND,DIARYY,DIARXXX,^TMP("DIARHLP",$J),DIAROX2,DIOF,DIOSL
 Q

DIARR1
DIARR1 ;SFISC/DCM-ARCHIVING FUNCTION, PROMPT FOR ARCHIVED RECORD ;7/1/93  8:43 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PROC D N Q:$D(DTOUT)!($D(DUOUT)&(DIARREQ'>0))!('$D(DIARR))
 D PRINTDEV Q:POP
 I '$D(IO("Q")) U IO(0) W !,"Searching archived file..."
 Q
 ;
N U IO(0) I '$D(DIARIDX) W !!,"Type ?? at any prompt to display sampled entries.",!
 W !!,"Multiple requests may be made.",!,"One set of all prompts makes one request.",!
 I $D(DIARIDX) D ASKIX Q:$D(DIRUT)
N1 W !
 K DIR S DIR("?",1)="Enter the "_DIAR01_" (.01) field.",DIR("?",2)="Answer to this prompt will retrieve all entries that match the ",DIR("?")=DIAR01_" field.",DIR("??")="^D HELP^DIARR1"
 S DIR(0)="FO",DIR("A")="Enter "_DIAR01 D ^DIR
 S:((X]"")&(X'="^")) DIARR(DIARREQ+1,".01")=X
 Q:$D(DTOUT)!(DIAROUT&(X=""))!($D(DUOUT))!('$D(DIARID)&$D(DIRUT))
 I $D(DIARID) D IDS Q:$D(DTOUT)
 S:$D(DIARR(DIARREQ+1)) DIARREQ=DIARREQ+1 G N1
 ;
IDS S DIAROUT=0
 K DIR S DIR(0)="FO",DIR("?",1)="Enter identifier information.  Answer to this prompt, along with all",DIR("?",2)="previously answered prompts for this request, will be used in the matching",DIR("?")="process."
 S DIR("??")="^D HELP^DIARR1"
 F DIARZ=.019:0 S DIARZ=$O(DIARID(DIARZ)) Q:DIARZ'>0  S DIR("A")="Enter "_$P(DIARID(DIARZ),U)_" (id) " D ^DIR Q:$D(DTOUT)!$D(DUOUT)  S:((X]"")&(X'="^")) DIARR(DIARREQ+1,"ID",+$P(DIARID(DIARZ),U,2))=X
 I '$D(DIARR(DIARREQ+1)) S DIAROUT=1 Q
 Q
 ;
HELP S DIARZHP="" W @DIOF
 F DIARHLP=0:0 S DIARHLP=$O(^TMP("DIARHLP",$J,DIARHLP)) Q:DIARHLP'>0!$D(DTOUT)!$D(DIRUT)  W ! F  S DIARZHP=$O(^TMP("DIARHLP",$J,DIARHLP,DIARZHP)) Q:DIARZHP=""  W !,^(DIARZHP) I $Y>(DIOSL-3) D E Q:$D(DTOUT)!$D(DIRUT)
 Q
 ;
E ;
 N DIR S DIR(0)="E" D ^DIR Q:$D(DTOUT)!$D(DIRUT)
 W @DIOF
 Q
 ;
PRINTDEV Q:'$D(DIARR)
 S %ZIS="QN",%ZIS("B")="",%ZIS("A")="PRINT FOUND ENTRIES TO DEVICE: " D ^%ZIS Q:POP
 S DIARPDEV=$S($D(ION)#2:ION,1:IO)
 I $D(IOST)#2,IOST]"" S DIARPDEV=DIARPDEV_";"_IOST
 F DIARZ="IOM","IOSL" S:($D(@DIARZ)#2&DIARZ) DIARPDEV=DIARPDEV_";"_@DIARZ
 I $D(IO("Q")) U IO(0) W !,"THE PRINTING OF REPORT WILL BE QUEUED.  PROCESSING CONTINUES..." S DIARQUED=""
 Q
 ;
ASKIX W !,"This archived file contains an index of all archived entries."
 K DIR S DIR(0)="Y",DIR("B")="YES",DIR("A")="Do you want to see the index now" D ^DIR Q:'Y!($D(DIRUT))
 W @DIOF,! S DIARTAB=0 F DIARXX=1:1:DIARCNT S DIARFLD=$P(DIARPC(DIARXX),U,2),DIARTAB=DIARTAB+25 W $E(DIARFLD,1,23),?DIARTAB
 S DIARYY=""
 W ! F DIARXX=1:1:DIARCTR W ! S DIARTAB=0 D  I $Y>(DIOSL-2) D E Q:$D(DTOUT)!$D(DIRUT)
 . F  S DIARYY=$O(DIARPC(DIARYY)) Q:DIARYY'>0  S DIARFLD=+$G(DIARPC(DIARYY)),DIARTAB=DIARTAB+25 W $E($P($G(^TMP("DIARHLP",$J,DIARXX,DIARFLD)),"= ",2),1,23),?DIARTAB
 . Q
 K DTOUT,DIRUT
 Q

DIARR2
DIARR2 ;SFISC/DCM-ARCHIVING(READ ARCHIVED FG) PROCESS REQUEST ;11/18/92  11:29 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $D(DIARIDX) D PROC^DIARR6 G C
 ;
FG F DIARZ=1:1 X DIARX Q:(DIARL="#$#")  S ^TMP("DIARFG",$J,DIARZ)=DIARL D:DIARL="$END DAT" FG1
C S X=DIARIO X ^DD("FUNC",7,1) K:$D(DIARIO)#2&(DIARIO]"") IO(1,DIARIO)
 D EOP
 Q
 ;
FG1 F DIARZ=1:1 S DIARFGL=$G(^TMP("DIARFG",$J,DIARZ)) Q:((DIARFGL="$END DAT")!(DIARFGEN))  D FG2
 D IDS
 D MATCH
 D EOP
 Q
 ;
FG2 Q:$P(DIARFGL,U)="$DAT"
 I DIARNM,$P(DIARFGL,U)=DIARFILE S DIARA(".01")=$P(DIARFGL,"=",2) Q
 I $P(DIARFGL,":")="BEGIN" D FG3 Q
 I $P(DIARFGL,":")="IDENTIFIER" S DIARA("ID",+$P(DIARFGL,U,2))=$P(DIARFGL,"=",2) Q
 I $P(DIARFGL,":")="SPECIFIER" S DIARA("ID",+$P(DIARFGL,U,2))=$P(DIARFGL,"=",2) Q
 I +$P(DIARFGL,U,2)=".01" S DIARA(".01")=$P(DIARFGL,"=",2) S DIARFGEN=1 Q
 Q
 ;
FG3 Q:+$P(DIARFGL,U,2)=DIARFN
 S DIARF2=+$P(DIARFGL,U,2),DIARZ=DIARZ+1
 F DIARZ=DIARZ:1 S DIARFGL=$G(^TMP("DIARFG",$J,DIARZ)) Q:(($P(DIARFGL,":")="END")&(+$P(DIARFGL,U,2)=DIARF2))
 Q
 ;
IDS F DIARIDS=0:0 S DIARIDS=$O(DIARID(DIARIDS)) Q:DIARIDS'>0  I '$D(DIARA("ID",DIARIDS)) S DIARA("ID",DIARIDS)=""
 Q
 ;
MS S DIARMTID="",DIARMT01=0,DIARMTCH=0,DIARIDDN=0,DIARRF(DIARY)=$S($D(DIARRF(DIARY)):DIARRF(DIARY),1:0) Q
 ;
MATCH F DIARY=0:0 S DIARY=$O(DIARR(DIARY)) Q:DIARY'>0  D MS D:$D(DIARR(DIARY,".01")) MATCH01 D:$D(DIARR(DIARY,"ID")) MATCHID:'DIARIDDN D:DIARMTCH FOUND
 Q
 ;
MATCH01 Q:DIARR(DIARY,".01")=""  Q:DIARA(".01")=""
 I $P(DIARA(".01"),DIARR(DIARY,.01))="" S DIARMT01=1
 I $D(DIARR(DIARY,"ID")) D MATCHID I 'DIARMTID Q
 I DIARMT01 S DIARMTCH=1
 Q
 ;
MATCHID F DIARZID=0:0 S DIARZID=$O(DIARR(DIARY,"ID",DIARZID))  Q:DIARZID'>0  D MATCHID1 Q:DIARMTID=0
 I DIARMTID,'$D(DIARR(DIARY,".01")) S DIARMTCH=1
 S DIARIDDN=1
 Q
 ;
MATCHID1 Q:DIARR(DIARY,"ID",DIARZID)=""  Q:DIARA("ID",DIARZID)=""
 I $P(DIARA("ID",DIARZID),DIARR(DIARY,"ID",DIARZID))="" S DIARMTID=1 Q
 S DIARMTID=0
 Q
 ;
FOUND S DIARFND=1
 I $D(DIARIDX) S DIARIXX(DIARIXCT)=DIARIXX(DIARIXCT)_DIARY_"," Q
 S %X="^TMP(""DIARFG"",$J,",%Y="^TMP(""DIAR"",$J,DIARY,DIARRF(DIARY)+1," D %XY^%RCR
 S DIARRF(DIARY)=DIARRF(DIARY)+1
 Q
 ;
EOP S DIARZ=0,DIARFGEN=0
 K ^TMP("DIARFG",$J),DIARA
 Q

DIARR3
DIARR3 ;SFISC/DCM-ARCHIVING FUNCTION, FIGURE OUT FG ;3/15/93  7:55 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIARFND  U IO(0) W !,"Formatting found records..."
 S (DIARTAB,DIAROREQ,DIAROM,DIAROZ,DIARZZ,DIAROIDF,DIAROFLD,DIAROLVL,DIAROBPT,DIAROBFN)=0,DIAROFLD(DIAROLVL)=0 K ^TMP("DIARO",$J)
 F  S DIAROREQ=$O(^TMP("DIAR",$J,DIAROREQ)) Q:DIAROREQ'>0  F  S DIAROM=$O(^TMP("DIAR",$J,DIAROREQ,DIAROM)) Q:DIAROM'>0  D CLEANUP^DIARR4 F  S DIAROZ=$O(^TMP("DIAR",$J,DIAROREQ,DIAROM,DIAROZ)) Q:DIAROZ'>0  S DIAROX=^(DIAROZ) D EN
 Q
EN Q:DIAROX["$END DAT"!(DIAROX="")
 S DIAROX1=$P(DIAROX,":")
 I $P(DIAROX,U)="$DAT" S DIAROSF=$P(DIAROX,U,2),DIAROSFN=+$P(DIAROX,U,3),DIAROLNE="ARCHIVE FILE: "_DIAROSF_" (#"_DIAROSFN_")" D SET D SV Q
 Q:DIAROX["$END DAT"
EN1 I DIAROX1="BEGIN" D BEGIN D SV Q
 I DIAROX1="END" D END D SV Q
 I DIAROX1="IDENTIFIER"!(DIAROX1="SPECIFIER")!(DIAROX1="KEY") D ID D SV Q
 I $L(DIAROX,U)=3,"AMLD"[$P($P(DIAROX,U,3),"=") G:$P(DIAROX,"=",2)?1"@".N1"E" BE^DIARR4 D F1 I DIAROSFN=+$P(DIAROX,U,2) D SV Q
 I DIAROX="^"!(DIAROX=":") D POP^DIARR4 D SV Q
 I $E(DIAROX1)="""" S DIAROLNE=$E(DIAROX1,2,$L(DIAROX1)-1) D SET Q
 D FLDS
SV S DIAROXPL=DIAROX
 Q
BEGIN S DIAROBF=$P($P(DIAROX,U),":",2),DIAROBFN=+$P(DIAROX,U,2),DIARTAB=DIARTAB+2,DIAROLVL=DIAROLVL+1,DIAROSTK(DIAROLVL)=DIAROBF_U_DIAROBFN_U_DIARTAB,DIAROIDF(DIAROLVL)=0,DIAROFLD(DIAROLVL)=0
 S DIAROSUB="@"_$P(DIAROX,"@",2),DIAROAT(DIAROSUB)=$S(DIAROXPL["@":"@"_$P(DIAROXPL,"@",2),1:$P(DIAROXPL,"=",2)) I DIAROBPT D SUB Q
 I DIAROZ=3 G BEGLN1
 I $P(DIAROXPL,U,2)[":" S DIAROLNE="FILE: " D SUB G BEGLN
 I $P(DIAROXPL,":")="BEGIN" S DIAROLNE=".01 POINTER TO FILE: " G BEGLN
 I $L(DIAROXPL,U)=3,"AMLD"[$P($P(DIAROXPL,U,3),"=") S DIAROLNE="SUBFILE: " D SUB G BEGLN
 I $L(DIAROXPL,U)=2 S DIAROLNE="POINTER TO FILE: "
BEGLN S DIAROLNE=DIAROLNE_DIAROBF_" (#"_DIAROBFN_")"
 D SET
BEGLN1 I $D(DIAROLUP(DIAROBF)) S DIARTAB=$P(DIAROSTK(DIAROLVL),U,3),DIAROLNE=$P(DIAROLUP(DIAROBF),U) D SET K DIAROLUP(DIAROBF)
 Q
SUB S DIAROSUB(DIAROBFN)=1_U_DIARTAB
 Q
END S (DIAROIDF(DIAROLVL),DIAROFLD(DIAROLVL))=0,DIAROBF=$P(DIAROSTK(DIAROLVL),U),DIAROBFN=$P(DIAROSTK(DIAROLVL),U,2)
 I $D(DIAROSUB(DIAROBFN)) S DIARTAB=DIARTAB-2 Q
 S:DIAROLVL'=1 DIAROLVL=DIAROLVL-1
 Q
ID I DIAROIDF(DIAROLVL)=0 S DIAROLNE="IDENTIFIERS: ",DIARTAB=+$P(DIAROSTK(DIAROLVL),U,3)+2 D SET S DIAROIDF(DIAROLVL)=1
 S DIAROLNE=$P($P(DIAROX,U),":",2)_" (#"_+$P(DIAROX,U,2)_") = "_$P(DIAROX,"=",2),DIARTAB=+$P(DIAROSTK(DIAROLVL),U,3)+4 D SET
 Q
FLDS S DIAROBCK=0
 I DIAROLVL=1,DIAROFLD(DIAROLVL)=0 S DIAROLNE="FIELDS: ",DIARTAB=+$P(DIAROSTK(DIAROLVL),U,3)+2 D SET S DIAROFLD(DIAROLVL)=1
 S (DIAROVAL,DIAROLUP)=$P(DIAROX,"=",2),DIARTAB=$P(DIAROSTK(DIAROLVL),U,3)+4
 I $L(DIAROX,U)=3 S DIAROBF1=$P(DIAROX,U,2) I $E(DIAROBF1,$L(DIAROBF1))=":" D BKPTR^DIARR4 Q
 I +$P(DIAROX,U,2),DIAROVAL["" S DIAROLNE="FIELD NAME: "_$P(DIAROX,U)_" (#"_+$P(DIAROX,U,2)_") = " D LKUP^DIARR4:$E(DIAROVAL)="@" G:DIAROBCK FLDS
 I $D(DIAROSUB)=11 S DIARTAB=$P(DIAROSTK(DIAROLVL),U,3)+2
 S DIAROLNE=DIAROLNE_DIAROVAL D SET Q
 S:$D(DIAROXX) DIAROX=DIAROXX K DIAROXX
 Q
SET S DIAROTAB="" S:DIARTAB $P(DIAROTAB," ",DIARTAB)=" "
 S DIARZZ=DIARZZ+1,DIAROLNE=DIAROTAB_DIAROLNE
 S ^TMP("DIARO",$J,DIAROREQ,DIAROM,DIARZZ)=DIAROLNE
 Q
F1 S DIAROLUP($P(DIAROX,U))="LOOKUP VALUE (#.01): "_$P(DIAROX,"=",2)
 Q

DIARR4
DIARR4 ;SFISC/DCM-ARCHIVING FUNCTION, FIGURE OUT FG(CONT) ;3/15/93  8:54 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CLEANUP K DIAROSF,DIAROSFN,DIAROBF,DIAROBFN,DIAROFLD,DIAROIDF,DIAROSUB,DIAROLUP
 S (DIARTAB,DIAROIDF,DIAROFLD,DIAROLVL)=0
 Q
 ;
LKUP Q:$E(DIAROVAL)'="@"
 S DIAROVAL=$G(DIAROAT(DIAROVAL)) I $E(DIAROVAL)="@" G LKUP
 S DIAROXX=DIAROX,DIAROX=$P(DIAROX,"=")_"="_DIAROVAL,DIAROBCK=1
 Q
 ;
BKPTR S DIAROLNE="FILE SHIFT (Forward Pointer/Backward Pointer): " D SET^DIARR3
 I DIAROX["=@",$G(^TMP("DIAR",$J,DIAROREQ,DIAROM,DIAROZ+1))'["BEGIN:" S DIAROLNE="FILE: "_$P(DIAROX,U)_" (#"_+$P(DIAROX,U,2)_")" D SET^DIARR3 D SFT2
 Q
 ;
SFT2 S DIAROBPT=1,DIAROXX=DIAROX,DIAROX="BEGIN:"_$P(DIAROX,":")_$P(DIAROX,"=",2)
 D BEGIN^DIARR3
 S DIAROBPT=0
 S DIAROX=DIAROXX K DIAROXX
 Q
 ;
POP S DIAROLVL=DIAROLVL-1 S:DIAROLVL=0 DIAROLVL=1
 K DIAROSUB(DIAROBFN)
 Q
 ;
BE S DIAROLVL=+$P($P(DIAROX,"=",2),"@",2)
 I $P(DIAROX,U)=$P(DIAROSTK(DIAROLVL-1),U) S DIAROSTK(DIAROLVL)=DIAROSTK(DIAROLVL-1)
 S DIAROZ=$O(^TMP("DIAR",$J,DIAROREQ,DIAROM,DIAROZ)),DIAROX2=^(DIAROZ)
 S DIAROLNE="FIELD NAME: "_$P(DIAROX,U)_" (#"_+$P(DIAROX,U,2)_") = "_$P(DIAROX2,"=",2) D SET^DIARR3
 S DIAROLNE="SUBFILE: "_$P(DIAROX,U)_" (#"_$P(DIAROSTK(DIAROLVL),U,2)_") ",DIARTAB=$P(DIAROSTK(DIAROLVL),U,3) D SET^DIARR3
 S DIAROLNE="LOOKUP VALUE (#.01): "_$P(DIAROX2,"=",2) D SET^DIARR3
 S DIAROLNE="FIELD NAME: "_$P(DIAROX2,U)_" (#"_+$P(DIAROX2,U,2)_") = "_$P(DIAROX2,"=",2),DIARTAB=$P(DIAROSTK(DIAROLVL),U,3)+2 D SET^DIARR3 S DIARTAB=DIARTAB-4
 Q

DIARR5
DIARR5 ;SFISC/DCM-ARCHIVING(READ ARCHIVED FG)-PRINT REQUEST ;4/8/93  8:00 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PRINT I $D(DIARQUED) G Q
 S IOP=DIARPDEV D ^%ZIS G Q:POP
DQ S DIARPG=0
 F DIARY=0:0 S DIARY=$O(DIARR(DIARY)) Q:DIARY'>0  D HD Q:$D(DTOUT)!($D(DIRUT))  D PRINT1:$D(^TMP("DIARO",$J,DIARY)) W:'$D(^TMP("DIARO",$J,DIARY)) !,?11,"MATCHES FOUND: ",DIARRF(DIARY)
 D ^%ZISC
 Q
 ;
PRINT1 F DIARZ=0:0 S DIARZ=$O(^TMP("DIARO",$J,DIARY,DIARZ)) Q:DIARZ'>0!$D(DTOUT)!$D(DIRUT)  W ! F DIARZ1=0:0 S DIARZ1=$O(^TMP("DIARO",$J,DIARY,DIARZ,DIARZ1)) Q:DIARZ1'>0  W ^(DIARZ1),! I $Y>(IOSL-2) D HD Q:$D(DTOUT)!$D(DIRUT)
 W !,?11,"MATCHES FOUND: ",DIARRF(DIARY)
 Q
 ;
HD U IO
 I "C"[$E(IOST) K DIR S DIR(0)="E" D ^DIR Q:$D(DTOUT)!($D(DIRUT))
 S Y=DT X ^DD("DD")
 W:$Y @IOF W "ARCHIVE RETRIEVAL LIST",?60,Y,?72,"PAGE: ",DIARPG+1
HD1 W !,"REQUEST: ",DIARY W:$D(DIARR(DIARY,.01)) !,?2,DIAR01," = ",DIARR(DIARY,.01) D HD2:$D(DIARR(DIARY,"ID"))
 S $P(DIARLINE,"-",IOM)="" W !,DIARLINE,! S DIARPG=DIARPG+1
 Q
 ;
HD2 F DIARX1=0:0 S DIARX1=$O(DIARR(DIARY,"ID",DIARX1)) Q:DIARX1'>0  W:DIARX1 !,?2,$P(DIARID(DIARX1),U)," = ",DIARR(DIARY,"ID",DIARX1)
 Q
 ;
Q S ZTRTN="DQ^DIARR5",ZTDTH=$H,ZTSAVE("DIARR(")="",ZTSAVE("^TMP(""DIARO"",$J,")="",ZTSAVE("DIARRF(")="",ZTDESC="RETRIEVAL OF ARCHIVED DATA",ZTIO=DIARPDEV,ZTSAVE("DIAR01")="",ZTSAVE("DIARID(")=""
 D ^%ZTLOAD,HOME^%ZIS
 U IO(0) W !! I '$D(DIARQUED) W:POP "UNABLE TO OPEN SELECTED PRINTER AT THIS TIME.  "
 W "OUTPUT QUEUED!"
 Q

DIARR6
DIARR6 ;SFISC/DCM-PROCESS ARCHIVED FILE WITH INDEX ;11/18/92  11:49 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIARFILE=$P(DIARL,U,3),DIARFN=+$P(DIARL,U,2)
 S DIARREC=$P(DIARL,U,4,99)
 F DIARXX=1:1 S DIARFLD=$P(DIARREC,U,DIARXX) Q:DIARFLD=""  S DIARFNO=$P(DIARFLD,":"),DIARFNA=$P(DIARFLD,":",2) D
 . I +DIARFNO=.01 S DIAR01=DIARFNA
 . S DIARPC(DIARXX)=DIARFNO_U_DIARFNA
 . S:+DIARFNO'=.01 DIARID(DIARFNO)=DIARFNA_U_DIARFNO
 . S DIARCNT=DIARXX
 . Q
 S DIARCTR=0,DIARFLGT=0
 F  X DIARX Q:DIARL["$DAT"  S DIARCTR=DIARCTR+1 F DIARXX=1:1:DIARCNT S DIARFLD=$P(DIARL,U,DIARXX) S DIARFNA=$P(DIARPC(DIARXX),U,2),DIARFNO=+DIARPC(DIARXX),^TMP("DIARHLP",$J,DIARCTR,DIARFNO)=DIARFNA_" = "_DIARFLD D FLGTH
 Q
 ;
FLGTH S $P(DIARPC(DIARXX),U,3)=$S($L(DIARFLD)>+$P(DIARPC(DIARXX),U,3):$L(DIARFLD),1:+$P(DIARPC(DIARXX),U,3))
 Q
 ;
PROC S DIARIXCT=0 K DIARRF
PROC1 F  X DIARX Q:DIARL["$DAT"  G PROC1:DIARL["$INDEX" D PROC2 D MATCH^DIARR2 K:'$G(DIARIXX(DIARIXCT)) DIARIXX(DIARIXCT) G PROC1
 Q:'$D(DIARIXX)
 S (DIARIXCT,DIARXX)=1 D:$G(DIARIXX(DIARIXCT)) FOUND
 F  S DIARXX=$O(DIARIXX(DIARXX)) Q:DIARXX'>0  D PROC1A
 Q
 ;
PROC1A F  X DIARX Q:DIARL["#$#"  I DIARL["$DAT" S DIARIXCT=DIARIXCT+1 I DIARIXCT=DIARXX D FOUND Q
 Q
 ;
PROC2 K DIARA S DIARIXCT=DIARIXCT+1,DIARIXX(DIARIXCT)=""
 F DIARXX=1:1:DIARCNT S DIARVAL=$P(DIARL,U,DIARXX) D PROC2A
 Q
 ;
PROC2A I +$P(DIARPC(DIARXX),U)=.01 S DIARA(.01)=DIARVAL Q
 S DIARA("ID",+$P(DIARPC(DIARXX),U))=DIARVAL
 Q
 ;
FOUND K ^TMP("DIARFG",$J) S DIARZ=1 D SET
 F DIARZ=DIARZ+1:1 X DIARX D SET I DIARL["$END DAT" Q
 F DIARZ=1:1 S DIARY=$P(DIARIXX(DIARIXCT),",",DIARZ) Q:DIARY=""  S DIARRF(DIARY)=$S($D(DIARRF(DIARY)):DIARRF(DIARY)+1,1:0) D SETFG
 Q
 ;
SET S ^TMP("DIARFG",$J,DIARZ)=DIARL
 Q
 ;
SETFG S %X="^TMP(""DIARFG"",$J,",%Y="^TMP(""DIAR"",$J,DIARY,DIARRF(DIARY)," D %XY^%RCR
 Q

DIARU
DIARU ;SFISC/TKW-ARCHIVING FUNCTIONS (CONT) ;2/18/93  5:21 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
UPDATE ;UPDATE ARCHIVING FILE (DJ=#ITEMS SELECTED) called w/in DIO4
 N DIE D:DIAR=3 NOW^%DTC S DA=DIARC,DIE="^DIAR(1.11,",X=""
 S:DIAR&(DIAR'=3) X="7////"_DIAR_";"
 S X=X_"13////@;14////@;15////@"
 I DIAR=1 S X=X_";4////"_DT_$S($D(^VA(200)):";8////"_DUZ,1:"")_";6////"_DJ
 I DIAR=3 S X=X_";12////"_%
 I DIAR=4!(DIAR=5)!(DIAR=6) S X=X_$S($D(^VA(200)):";5////"_DUZ,1:"")_";10////"_DT
 ;I DIAR=3!(DIAR=4),U'[DIARP S %=$P(DIARP,U,2),X=X_";3////"_$S(%:%,1:+DIARP)
 I DIAR=90 S X=X_$S($D(^VA(200)):";9////"_DUZ,1:"")_";11////"_DT
 S DR=X,DA=DIARC D ^DIE S DV=""
 Q
 ;
FILE ;LOOKUP ARCHIVING ACTIVITY
 K DIC S DIC(0)="AEQIMZ",DIC="^DIAR(1.11,",DIC("S")="I $P(^(0),U,8)<90"_$S($D(DIAX):",$P(^(0),U,17)",1:",'+$P(^(0),U,17)"),DIC("A")="Select "_$S($D(DIAX):"EXTRACT",1:"ARCHIVAL")_" ACTIVITY: "
 D ^DIC Q:Y<0!$D(DUOUT)!$D(DTOUT)
 I $P(Y(0),U,14) D ER1 Q
 S DIARC=+Y,DIARF=$P(Y(0),U,2),DIARU=$P(Y(0),U,3),DIARP=$P(Y(0),U,4),DIARST=$P(Y(0),U,8) S:$D(DIAX) DIAXFNO=+$P(Y(0),U,18)
 I DIAR'=99,'DIARU W !!,$C(7),"No selection template used for this ARCHIVING ACTIVITY--CANCEL it!" K DIARC Q
 I (DIAR=2!(DIAR=4)),DIARST>2 D ER2 K DIARC Q
 I DIAR=5 W:DIARST=5 $C(7),!!,"This data has already been moved to permanent storage once !!",! I DIARST<4 D ER3 K DIARC Q
 I DIAR=6,DIARST=6 W !!,$C(7),"This data has already been moved to the destination file!",!,"PURGE data or CANCEL this extract activity." K DIARC Q
 I DIAR=90,$S($D(DIAX):DIARST'=6,1:DIARST'=5) D ER4 K DIARC Q
 I DIAR=99 D:DIARST=5 MSG I DIARST>6 D ER5 K DIARC Q
 S DIARF2=$S($D(^DIAR(1.11,+Y,1)):^(1),1:DIARF)
 S DIARX=Y(0) D:DIAR'=3 MRK S Y(0)=DIARX,DIC=$G(^DIC(+DIARF,0,"GL")) I DIC="" D ER6 S DIK="^DIAR(1.11,",DA=DIARC D ^DIK K DIK,DIARC Q
 Q
 ;
MRK ;SET FIELDS TO LOCK OUT OTHER USERS DURING ARCHIVING ACTIVITY
 D NOW^%DTC S DIE="^DIAR(1.11,",DA=DIARC,DR="13////"_DIAR_";14////"_%_";15////"_DUZ D ^DIE
 Q
 ;
ER1 W $C(7),!!!,"The following Archival Activity is in progress--no access allowed!",!
 S DIARX=Y(0),Y=$P(Y(0),U,14),C=$P(^DD(1.11,13,0),U,2) D Y^DIQ W Y_"     STARTED: " S Y=$P(DIARX,U,15) X:Y ^DD("DD") W Y_"    BY: " W:$S($D(^VA(200,+$P(DIARX,U,16),0)):1,1:$D(^DIC(3,+$P(DIARX,U,16),0))) $P(^(0),U,1) W ! Q
ER2 I $D(DIAX) W !!,$C(7),"Data has already been moved to the destination file.",!,"List cannot be edited." Q
 W !!,$C(7),"This data has already been archived to "_$S(DIARST=4:"temporary",1:"permanent")_" storage" W:DIARST>5 " and purged" W ".",! W:DIAR=2 "List cannot be edited after data has been archived!" Q
ER3 W !!,$C(7),"Cannot write to permanent storage until data has been written",!,"to temporary storage!!" Q
ER4 W !!,$C(7),$S(DIARST>6:"Data ALREADY purged",$D(DIAX):"Data has NOT YET been moved to the destination file",1:"Data has NOT YET been archived to PERMANENT storage"),"!",! Q
ER5 W !!,$C(7),"Cannot cancel archiving record after archiving has been complete--this now",!,"acts as your history!!" Q
ER6 W !!,$C(7),"Source File is missing!",!,"I AM DELETING THIS ",$S($D(DIAX):"EXTRACT",1:"ARCHIVING")," ACTIVITY!" Q
MSG W !!,$C(7),"Just a reminder--you have already archived these records to permanent storage.",!,"You probably won't want to save the sequential storage media since you",!,"are cancelling this archiving activity!!",! Q

DIARX
DIARX ;SFISC/DCM-ARCHIVING FUNCTION, BUILD INDEX ;8/12/98  10:25
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
IX K ^UTILITY("DIQ1",$J) N DIC
 S DIARREC=^DIAR(1.11,DIARC,0),(DIARIXF,DIC)=$P(DIARREC,U,2),DIARIXST=$P(DIARREC,U,3),(DA,DIARDR,DIARIX,DIARDA)="",DR=".01",DIARLINE=.01_":"_$P(^DD(DIARIXF,.01,0),U)
 N DIXIEN S DIXIEN=$O(^DD("KEY","AP",DIARIXF,"P",0))
 I DIXIEN F  S DIARDR=$O(^DD("KEY",DIXIEN,2,"BB",DIARDR)) Q:'DIARDR  I DIARDR'=.01,$O(^(DIARDR,0))=DIARIXF,$D(^DD(DIARIXF,DIARDR,0)) D IDKEY
 F  S DIARDR=$O(^DD(DIARIXF,0,"ID",DIARDR)) Q:DIARDR'>0  I DIARLINE'[("^"_DIARDR_":"),$D(^DD(DIARIXF,DIARDR,0)) D IDKEY
 S DIARBLNE=DIARLINE
 S DIARLINE="$INDEX"_U_DIARIXF_U_$P(^DIC(DIARIXF,0),U)_U_DIARLINE U IO W DIARLINE,!
 F  S DA=$O(^DIBT(DIARIXST,1,DA)) Q:DA'>0  S DIQ(0)="E" D EN^DIQ1
 F  S DIARDA=$O(^DIBT(DIARIXST,1,DIARDA)) Q:DIARDA'>0  D IX1
 K DIARREC,DIARIXF,DIARIXST,DA,DIARDR,DIARIX,DIARDA,DR,DIARLINE
 Q
 ;
IDKEY ; Save KEY or Identifier data
 S DIARLINE=DIARLINE_U_DIARDR_":"_$P(^DD(DIARIXF,DIARDR,0),U)
 S DR=DR_";"_DIARDR Q
 Q
 ;
IX1 S DIARLINE="" F  S DIARIX=$O(^UTILITY("DIQ1",$J,DIARIXF,DIARDA,DIARIX)) Q:DIARIX'>0  S DIARLINE=DIARLINE_^(DIARIX,"E")_U
 W DIARLINE,!
 Q
 ;
OUT I $D(DIARQUED) G QP
 S IOP=DIARPDEV D ^%ZIS G QP:POP
DQ ;print archive activity report
 S DIARPG=0,DIARLINE="",DIARX=^DIAR(1.11,DIARC,0),DIARFI=$P(DIARX,U,2) U IO S Y=DT X ^DD("DD") S DIARXY=Y
 D HDR,BODY
 Q
HDR W:$Y @IOF W !,"ARCHIVE ACTIVITY REPORT",?IOM-24,DIARXY,?IOM-10,"PAGE: ",DIARPG+1
 S DIARPG=DIARPG+1,$P(DIARLINE,"-",IOM)="" W !,DIARLINE Q
 ;
BODY W !!,"ARCHIVAL ACTIVITY: ",DIARC,!,"ARCHIVE DEVICE LABEL INFORMATION: ",$P(^DIAR(1.11,DIARC,0),U,19)
 W !,"PRIMARY ARCHIVED FILE: ",$P($G(^DIC(DIARFI,0)),U)_" (#"_DIARFI_")"
 W !,"ARCHIVER: ",$P($G(^VA(200,$P(DIARX,U,6),0)),U)
 W !,"SEARCH CRITERIA: " S DIARU=$P(DIARX,U,3),DIARXZ=0
 F  S DIARXZ=$O(^DIBT(DIARU,"O",DIARXZ)) Q:DIARXZ'>0  Q:'$D(^(DIARXZ,0))  W !,?5,^(0)
 W !!,"INDEX INFORMATION: ",! S (DIARTAB,DIARFLD)=0 F DIARXZ=1:1 S DIARFLD=$P($P(DIARBLNE,U,DIARXZ),":",2) Q:DIARFLD=""  W DIARFLD S DIARTAB=DIARTAB+25 W ?DIARTAB
 F DIARXZ=0:0 S DIARXZ=$O(^UTILITY("DIQ1",$J,DIARFI,DIARXZ)) Q:DIARXZ'>0  D HDRC Q:$D(DTOUT)!$D(DIRUT)  W ! S DIARTAB=0 F  S DIARFLD=$O(^UTILITY("DIQ1",$J,DIARFI,DIARXZ,DIARFLD)) Q:DIARFLD'>0  W ^(DIARFLD,"E") S DIARTAB=DIARTAB+25 W ?DIARTAB
 W !!,"*** PLEASE KEEP THIS FOR FUTURE REFERENCE ***"
 I $E(IOST)'="C",$Y W @IOF
 D ^%ZISC
 Q
 ;
HDRC Q:($Y+1<IOSL)
 I "C"[$E(IOST) K DIR S DIR(0)="E" D ^DIR Q:$D(DTOUT)!($D(DIRUT))
 D HDR
 Q
 ;
QP S ZTRTN="DQ^DIARX",ZTSAVE("DIARC")="",ZTDESC="ARCHIVE ACTIVITY REPORT",ZTSAVE("^UTILITY(""DIQ1"",$J,")="",ZTSAVE("DIARBLNE")="",ZTIO=DIARPDEV,ZTDTH=$H
 D ^%ZTLOAD,HOME^%ZIS

DIAU
DIAU ;SFISC/XAK-AUDIT OPTIONS ; 27JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ; Contents
 ;
 ; ^DIAU/O/OPT: Run Audit Menu (Rebuild If Necessary)
 ; EN/Q: Run an Audit Option
 ;
 ; 1/WRITE/Q2: LIST FIELDS BEING AUDITED
 ; 2/21/22: TURN DATA AUDIT ON/OFF
 ; 3: DATA AUDIT TRAIL PURGE
 ; 4: SHOW DD AUDIT TRAIL
 ; 5: DD AUDIT TRAIL PURGE
 ; 6: MONITOR A USER
 ;
 ; KILLDIA: DHIT Code for Option 3 (DATA AUDIT TRAIL PURGE)
 ; ENDKILL: DIOEND Code for Option 3 (DATA AUDIT TRAIL PURGE)
 ; $$DANGLE: Clean Danglers for ENDKILL
 ; ALL: Confirm Purge of All Audit Records for Options 3 & 5
 ; PR: Purge All Audit Records for a File & Its Subfiles for Option 5
 ; M/UP/P/QM: DIOEND Code for Option 5 (DD AUDIT TRAIL PURGE)
 ; WUSRDHD: DHD Code for Option 6 (MONITOR A USER)
 ; WUSR: DHIT Code for Option 6 (MONITOR A USER)
 ;
 ;
0 ; Rebuild DOPT Audit Menu If Necessary
 ;
 S DIC="^DOPT(""DIAU"","
 I '$D(^DOPT("DIAU","B","MONITOR A USER")) D
 .S ^DOPT("DIAU",0)="AUDIT OPTION^1.01" K ^("B")
 .F X=1:1:6 S ^DOPT("DIAU",X,0)=$P($T(@X),";;",2)
 .S DIK=DIC D IXALL^DIK
 ;
OPT ; Run Audit Menu
 ;
 S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN
 ;
 GOTO 0 ; end of ^DIAU/0/OPT
 ;
 ;
EN ; Run an Audit Option
 ;
 D @DI W !!
 ;
Q K %,DIC,DIK,DI,DA,I,J,X,Y
 ;
 QUIT  ; end of EN/Q
 ;
 ;
1 ;;LIST FIELDS BEING AUDITED
 ;
 D L^DICRW1 Q:'$D(DIC)  S (DUB,DIB,DFF)=+Y,BY(0)="^DD(DFF,""AUDIT"",",L(0)=1
 S Y=$O(^DIC(DIB(1))) I Y S DIB(1)=$O(^DD(Y),-1) S:'DIB(1) DIB(1)=DIB
 I $O(^DD(DIB,"AUDIT",""))="" F  S DIB=$O(^DD(+DIB)) Q:'DIB!(DIB>DIB(1))  I $O(^DD(DIB,"AUDIT",""))]"" S (DUB,DFF)=DIB Q
 I 'DIB!(DIB>DIB(1)) G Q2
 S FLDS="W DFF;C1;L9;""FILE"",.001;L9,.01;L20,.25;L15,1.1",DISUPNO=1
 S L=0,DHD="AUDITED FIELDS",DIS(0)="I $D(^DD(DFF,D0,""AUDIT"")),""n""'[^(""AUDIT"")"
 S DIA=1,DIC="^DD(DFF,",DIOEND="G L^DIDC" D EN1^DIP
 ;
 GOTO Q2 ; end of 1 (LIST FIELDS BEING AUDITED)
 ;
 ;
2 ;;TURN DATA AUDIT ON/OFF
 ;
 N J,DUOUT,DIRUT,DA,DDA,DIAU,DIA,C,D,%,DIC,X,Y,DIR
 S (DDA,DIA)=0 D AU^DICRW I 'DIA Q
21 S DIC="^DD("_DIA_",",DIC(0)="QEANIZ",DA(1)=DIA
 S DIC("S")="I 1 S %=$P(^(0),U,2) I $E(%)'=""C"""
22 S DIC("W")="N %,%A S %A=$G(^(""AUDIT"")),%=$P(^(0),U,2) W:% $S($P(^DD(+%,.01,0),U,2)[""W"":""  (word-processing)"",1:""  (multiple)"") S:% %A=$G(^(""AUDIT"")) W ""   "",%A"
 D ^DIC I Y<0 K DIA G Q
 I $P(Y(0),U,2) S DA(1)=+$P(Y(0),U,2),DIC="^DD("_DA(1)_"," G 22
 K DIC,DIR S DDA=+Y S:$D(^("AUDIT")) DIR("B")=^("AUDIT")
 S DIR(0)="0,1.1" D ^DIR I $D(DIRUT) Q:X'="@"  S Y="n"
 D TURNON^DIAUTL(DA(1),DDA,Y) I $D(DIRUT) K ^DD(DA(1),DDA,"AUDIT")
 W !!
 ;
 GOTO 21 ; end of 2/21/22 (TURN DATA AUDIT ON/OFF)
 ;
 ;
3 ;;DATA AUDIT TRAIL PURGE
 ;
 S DIC("S")="I $D(^DIA(+Y)),'$D(^DD(+Y,0,""AUDPURGEFORBID"")) S DIAC=""AUDIT"",DIFILE=+Y D ^DIAC I DIAC"
 S DIA="" D AU^DICRW K DIC("S") G Q2:$D(DTOUT),Q2:Y<0,Q2:'$D(DIC)
 S DDA="DATA" D ALL G Q2:$D(DIRUT)
 I Y W !!,"..." K ^DIA(DIA) H 3 W "DELETED" G Q2
 W ! S L="PURGE AUDIT RECORDS",DIOEND="D ENDKILL^DIAU",DISTOP=0
 S FLDS="",DHD="PURGE OF AUDIT DATA: "_$O(^DD(DIA,0,"NM",0))_" FILE",DISUPNO=1
 S DHIT="D KILLDIA^DIAU",DIACNT=0
 D EN1^DIP K DISTOP,DHIT,DIK,DA,DIACNT
 ;
 GOTO Q2 ; end of 3 (DATA AUDIT TRAIL PURGE)
 ;
 ;
ALL ; Confirm Purge of All Audit Records for Options 3 & 5
 ;
 S DIR(0)="Y",DIR("B")="NO"
 S DIR("A")="DO YOU WANT TO PURGE ALL "_DDA_" AUDIT RECORDS"
 S DIR("??")="^W !!?5,""Answer 'YES' to purge all the "_DDA_" audit records for this file, or"",!?5,""answer 'NO' to sort out the records to be purged."""
 D ^DIR Q:$D(DIRUT)  I Y S DIR("A")="ARE YOU SURE" D ^DIR
 K DIR
 ;
 QUIT  ; end of ALL
 ;
 ;
KILLDIA ; DHIT Code for Option 3 (DATA AUDIT TRAIL PURGE)
 ;
 ; called from DHIT
 S X=$G(^DIA(DIA,D0,0)) K ^DIA(DIA,D0)
 S Y=$P(X,U) I Y K ^DIA(DIA,"B",Y,D0)
 S Y=$P(X,U,2) I Y K ^DIA(DIA,"C",Y,D0)
 S Y=$P(X,U,4) K ^DIA(DIA,"D",+Y,D0)
 S DIACNT=DIACNT+1
 ;
 QUIT  ; end of KILLDIA
 ;
 ;
ENDKILL ; DIOEND Code for Option 3 (DATA AUDIT TRAIL PURGE)
 ;
 ; check danglers
 S $P(^(0),U,4)=$P($G(^DIA(DIA,0)),U,4)-DIACNT
 W !!,"...",! W $$DANGLE(DIA)," POINTERS FIXED."
 W !!,DIACNT," RECORDS PURGED."
 ;
 QUIT  ; end of ENDKILL
 ;
 ;
DANGLE(DIA) ; Clean Danglers for ENDKILL
 ;
 N A,B,D0,AA,C
 S C=0
 F AA=1,2,4 S A=$E("BC D",AA),B="" D
 .F  S B=$O(^DIA(DIA,A,B)) Q:B=""  D
 ..F D0=0:0 S D0=$O(^DIA(DIA,A,B,D0)) Q:'D0  I $P($G(^DIA(DIA,D0,0)),U,AA)'=B K ^DIA(DIA,A,B,D0) S C=C+1
 ;
 Q C ; end of $$DANGLE
 ;
 ;
4 ;;SHOW DD AUDIT TRAIL
 ;
 N DIR,DIRB,%DT S DIRB=$$EZBLD^DIALOG(7065)
 S DIR(0)="FO^^S:X=DIRB X=1900 S %DT=""EP"" D ^%DT",DIR("A")="Show Data Dictionary changes since",DIR("B")=DIRB
 S DIR("?")="Enter a date.  All audited changes to Data Dictionaries, starting with that date, will be shown."
 D ^DIR I Y>0 D DISP^DIAUTL(Y)
 ;
 QUIT  ; end of 4 (SHOW DD AUDIT TRAIL)
 ;
 ;
5 ;;DD AUDIT TRAIL PURGE
 ;
 S DIC("S")="I '$D(^DD(+Y,0,""DDAUDPURGEFORBID"")) S DIAC=""AUDIT"",DIFILE=+Y D ^DIAC I DIAC"
 S DIA="DDA",DDA="DD" D A^DICRW G Q:$D(DTOUT)!(Y<0)!'$D(DIC)
 D ALL G:$D(DIRUT) Q I Y S X=DIA D PR G Q
 W ! S L="PURGE DD AUDIT RECORDS",DIOEND="G M^DIAU",DISTOP=0,DISUPNO=1
 S FLDS="",DHD="PURGE OF DD AUDIT: "_$O(^DD(DIA,0,"NM",0))_" FILE"
 S DHIT="S DIK=DCC,DA=D0,DIACNT=DIACNT+1 D ^DIK",DIACNT=0,DIC="^DDA(DDA,"
 S DDA=DIA D EN1^DIP K DISTOP,DHIT,DIK,DA,DIACNT
 ;
 GOTO Q2 ; end of 5 (DD AUDIT TRAIL PURGE)
 ;
 ;
PR ; Purge All Audit Records for a File & Its Subfiles for Option 5
 ;
 N DIA S DIA=X N X K ^DDA(DIA)
 F X=0:0 S X=$O(^DD(DIA,"SB",X)) Q:X'>0  D PR
 ;
 QUIT  ; end of PR
 ;
 ;
M ; DIOEND Code for Option 5 (DD AUDIT TRAIL PURGE)
 ;
 S DDA=$O(^DDA(DDA))
 I DDA'>0!(DDA-1>DIA) W !!,DIACNT," RECORDS PURGED." G QM
 S %=0,X=DDA D UP
 GOTO P:%,M:'%
 ;
UP Q:'$D(^DD(X,0,"UP"))  S X=^("UP") I X=DIA S %=1 Q
 GOTO UP
 ;
P K ^UTILITY($J,0) S %X="DIPP(",%Y="DPP(" D %XY^%RCR
 S DPP=DIPP,L=0,DJ=DIJS,DPQ=DIPQ,M=DIMS,C=",",DIOSL=IOSL G ^DIO
 QUIT
 ;
QM ; return to ^DIO4 from line tag M+3
 ;
 GOTO STOP^DIO4 ; end of M/UP/P/QM
 ;
 ;
6 ;;MONITOR A USER
 ;
 N DIAUSR,%DT,DHIT,DWHEN,DIC,DIAUIDEN
 S DIC=200,DIC(0)="AQEM",DIC("A")="Select a USER who has signed on to this system: ",DIC("S")="I $G(^(1.1))" D ^DIC K DIC Q:Y<0  S DIAUSR=+Y
 D R1^DICRW ;Creates a DIC("S") that screens out files user has no access to
 S DIC("S")=DIC("S")_" I $D(^DIA(+Y,""D"",DIAUSR))",DIC=1,DIC(0)="QAEI",DIC("A")="Select AUDITED File: "
 S Y=$G(^DISV(DUZ,"^DIC(")) I Y X DIC("S") I  S DIC("B")=Y
 D ^DIC K DIC
 Q:$G(Y)'>0  S DIA=+Y,DIAUIDEN=$G(^DD(DIA,0,"ID","WRITE"))
 K ^UTILITY("DIAU",$J)
 S B=0,%DT="AEPT",%DT("A")="START WITH DATE: FIRST// " D ^%DT S DWHEN=" SINCE "_$$DATE^DIUTL(Y) I Y<1 Q:X]""  S Y=0,DWHEN=""
 S A=$O(^DIA(DIA,"C",Y-.0001)) Q:'A  S B=$O(^(A,0))-.01
 F A=B:0 S A=$O(^DIA(DIA,"D",DIAUSR,A)) Q:'A  S P=$G(^DIA(DIA,A,0)) I P D
 .I $D(^UTILITY("DIAU",$J,0,+P)) S $P(^(+P),U,2)=A Q
 .S ^UTILITY("DIAU",$J,0,+P)=A,DP=$$GET1^DIQ(DIA,+P,.01) S:DP]"" ^UTILITY("DIAU",$J,1,DP,+P)="" ;BY NAME
 ;
WRITE ; Display Monitor a User Report
 ;
 S BY(0)="^UTILITY(""DIAU"","_$J_",1,",L(0)=2,FLDS=""
 S DHD="W ! D WUSRDHD^DIAU"
 S DIC=^DIC(DIA,0,"GL")
 S DIOEND="K ^UTILITY(""DIAU"","_$J_")",DHIT="D WUSR^DIAU(D0)"
 D EN1^DIP
 ;
Q2 K DIA,A,B,DIJ,DP,P,BY,FLDS,DIS,DHD,DCC,L,DNP,DFF,DIB,DIJS,DIPQ,DIMS,DIPP,DUB,DIOEND
 ;
 QUIT  ; end of 6/WRITE/Q2 (MONITOR A USER)
 ;
 ;
WUSRDHD ; DHD Code for Option 6 (MONITOR A USER)
 ;
 ; called by DHD
 W $P(^DIC(DIA,0),U)," RECORDS ACCESSED BY ",$P(^VA(200,DIAUSR,0),U)," (DUZ=",DIAUSR,") ",DWHEN,?IOM-8,"Page ",DC,!
 W ?IOM-50,"EARLIEST ACCESS",?IOM-25,"LATEST ACCESS",!
 W $TR($J("",IOM)," ","-"),!
 ;
 QUIT  ; end of WUSRDHD
 ;
 ;
WUSR(Y) ; DHIT Code for Option 6 (MONITOR A USER)
 ;
 ; called by DHIT
 N X,DIAU,DIC,DITAB
 W $$GET1^DIQ(DIA,Y,.01) ;NAME
 S DITAB=IOM-50 D:DIAUIDEN]""
 .;I IOM>131 W ?80 S $X=19
 .;E  D N^DIO2 W ?19
 .S DIC=^DIC(DIA,0,"GL") I $G(@(DIC_"+Y,0)"))]"" X DIAUIDEN ;CALL ^DD(2,0,"ID","WRITE") WITH NAKED REFERENCE
 .I IOM<132 D N^DIO2
 S DIAU=^UTILITY("DIAU",$J,0,D0),X=+DIAU
 W ?DITAB D  W ?DITAB+25 S X=$P(DIAU,U,2) D:X
 .N Y S Y=$P(^DIA(DIA,X,0),U,2) X ^DD("DD") W Y
 D N^DIO2
 ;
 QUIT  ; end of WUSR
 ;
 ;
EOR ; end of routine DIAU

DIAUTL
DIAUTL ;GFT/GFT - UTILITIES TO TURN ON AND TO ANALYZE FILEMAN AUDITS;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
TURNONDD(DIFILE,DIMODE) ;Turn on DATA DICTIONARY AUDITING  --THIS IS NOW A NO-OP, BECAUSE WE AUDIT ALL DD CHANGES IN FILE .6!!!!
 K:$G(DIMODE)=1 DIMODE S DIMODE=$G(DIMODE,"Y")
 I DIMODE'="Y",DIMODE'="N" D BLD^DIALOG(200) Q
 I DIFILE<1.11 Q
 I '$D(^DIC(+DIFILE)) D BLD^DIALOG(401,DIFILE) Q
 S ^DD(DIFILE,0,"DDA")=DIMODE ;It's really just one SET!
 Q
 ;
DISP(DDB) ;DISPLAY DD CHANGES FROM ^DDA SINCE DATE 'DDB'
 N DIA,FR,BY,TO,DHD,DDHD,DIC,L,POP,DDIO,DIOEND,DDTOUT,DIOSL,DIFIXPT,DIFIXPTH S DIFIXPT=1 ;KEEPS ^%ZIS FROM BEING CALLED IN ^DIP3
 D ^%ZIS Q:POP  S DDIO=IO U IO
 F DIA=0:0 S DIA=$O(^DDA(DIA)) Q:'DIA  S FR=$O(^DDA(DIA,"D",DDB)) D:FR  Q:$D(DDTOUT)
 .U IO W @IOF D DDHD
 .S DIC="^DDA("_DIA_",",BY="-(#.03)@",TO=DT+1,FLDS="[DIAUTL]",L=0
 .S DIOEND="S:$G(DIOO1) DDTOUT=1",DIOSL=IOSL ;DHD="W ?0 D DDHD^DIAUTL",IOP=DDIO
 .D EN1^DIP
 U IO W @IOF D CLOSE^DIO4
 Q
DDHD S DDHD="DATA DICTIONARY CHANGES, "_$P($G(^DIC(DIA,0)),U)_" FILE(#"_DIA_")" S:DDB DDHD=DDHD_" since "_$$DATE^DIUTL(DDB)
 W DDHD,!
 W "FIELD                     ATTRIBUTE                                USER NUMBER",!
 W "------------------------------------------------------------------------------",!
 Q
 ;
 ;
TURNON(DIFILE,FLDS,DIMODE) ;Turn on AUDITING for the FLDS named   --MODE is either "y", "n" or "e"
 N D,DIFIELD,DIE,DR,DA,DIQUIET,DIEZS,D0,DQ,DI,DIC,X
 K:$G(DIMODE)=1 DIMODE S DIMODE=$E($G(DIMODE,"y"))
 I DIMODE'="y",DIMODE'="e",DIMODE'="n" D BLD^DIALOG(200) Q
 S DIQUIET=1,DIEZS=1 Q:DIFILE<1.11&(DIFILE-.4)&(DIFILE-.401)&(DIFILE-.402)&(DIFILE-.403)&(DIFILE-.5)&(DIFILE-.7)&(DIFILE-.84)&(DIFILE-.847)
 D DT^DICRW
 F DIFIELD=0:0 S DIFIELD=$O(^DD(DIFILE,DIFIELD)) Q:'DIFIELD  D:$$FLDSINC(DIFILE,FLDS,DIFIELD) ON
 Q
ON N DIOLD
 S DIOLD=$G(^DD(DIFILE,DIFIELD,"AUDIT")) I DIOLD=DIMODE Q  ;It's already on
 S D=$P($G(^(0)),U,2) Q:D["C"
 I D D TURNON(+D,"**",DIMODE) Q  ;Recursive!
 S DR="1.1////"_DIMODE,DIE="^DD("_DIFILE_",",DA(1)=DIFILE,DA=DIFIELD
 I DA=.001,DIMODE="y" Q  ;CAN'T AUDIT NUMBER FIELD!!
 D ^DIE
 D IN^DIU0(DIFILE,DIFIELD),DDAUDIT(DIFILE,DIFIELD,1.1,DIOLD,DIMODE)
 I $G(^DD(DIFILE,0,"DIK"))]"" D EN2^DIKZ(DIFILE,"",^("DIK")) ;Recompile CROSS-REFS if auditing changes
 Q
 ;
CHANGED(FILE,FLDS,FLAGS,ARRAY,START,END) ;
 ;Returns in @ARRAY the list of entries in FILE who had any of the fields in FLDS changed from START to END
 ;If FLAGS is "O", the Oldest values are saved in @ARRAY@(entry,field)
 N GLO,E,F,T,D,%I
 K @ARRAY
 S FLAGS=$G(FLAGS)
 S GLO=^DIC(FILE,0,"GL")
 I '$G(START) S START=0
 I '$G(END) D NOW^%DTC S END=%
 S T=START D  F  S T=$O(^DIA(FILE,"C",T)) Q:T>END!'T  D
 .F D=0:0 S D=$O(^DIA(FILE,"C",T,D)) Q:'D  D
 ..S E=$G(^DIA(FILE,D,0)) Q:$P(E,U,6)="i"!'E
 ..I $D(@ARRAY@(+E)),FLAGS="" Q
 ..S F=+$P(E,U,3) Q:'$$FLDSINC(FILE,FLDS,F)
 ..I '$D(@(GLO_"+E)")),FLAGS="" Q
 ..S @ARRAY@(+E)="" I FLAGS["O",'$D(@ARRAY@(+E,F)) S @ARRAY@(+E,F)=$G(^DIA(FILE,D,2))
 Q
 ;
FIRST(DIQGR,ENTRY,FLDS) ;
 N LOF S LOF=1 G LOF
LAST(DIQGR,ENTRY,FLDS) ;returns DATE^USER who most recently touched any of the FLDS in ENTRY in File DIQGR
 N LOF S LOF=-1
LOF N E,F,DILAST,DENTRY,L
 S DILAST="",DENTRY=+ENTRY
 I ENTRY["," D
 .F F=2:1 Q:'$D(^DD(DIQGR,0,"UP"))  S DENTRY=$P(ENTRY,",",F)_","_DENTRY
 D E
 S DENTRY=ENTRY_","
 F  S DENTRY=$O(^DIA(DIQGR,"B",DENTRY)) Q:DENTRY-ENTRY  D E
 Q DILAST
 ;
E S E="" F  S E=$O(^DIA(DIQGR,"B",DENTRY,E),LOF) Q:'E  I $$FLDSINC(DIQGR,FLDS,+$P($G(^DIA(DIQGR,E,0)),U,3)) D  Q:DENTRY=ENTRY&DILAST
 .Q:$P(^DIA(DIQGR,E,0),U,6)="i"  ;Ignore INQUIRY
 .S L=$P(^(0),"^",2)_"^"_$P(^(0),"^",4)_"^"_$P($G(^(4.1)),U)
 .I LOF=-1,L>DILAST S DILAST=L
 .I LOF=1,DILAST>L!'DILAST S DILAST=L
 Q
 ;
DATE(FILE,FIELD) ;
 D VALUE(FILE,FIELD,2) Q
 ;
USER(FILE,FIELD) ;
 D VALUE(FILE,FIELD,4) Q
 ;
VALUE(FILE,FIELD,TU) ;FILE' can be SubFile
 N DIACMP,ENTRY,I
 S ENTRY=+$G(D0)
 F I=1:1 Q:'$D(^DD(FILE,0,"UP"))  S ENTRY=ENTRY_","_+$G(@("D"_I)),F=^("UP"),FIELD=$O(^DD(F,"SB",FILE,0))_","_FIELD,FILE=F
 D PRIOR(FILE,ENTRY,FIELD,.DIACMP)
 S D="" F  S D=$O(DIACMP(D),-1) Q:'D  S X=$S($G(TU):$P(^DIA(FILE,D,0),U,TU),1:DIACMP(D)) X DICMX Q:'$D(D)
 S X="" Q
 ;
PRIOR(FILE,ENTRY,FIELD,OUT) ;
 N E
 F E=0:0 S E=$O(^DIA(FILE,"B",ENTRY,E)) Q:'E  I $P($G(^DIA(FILE,E,0)),U,3)=FIELD S OUT(E)=$G(^(2))
 Q
 ;
FLDSINC(DIQGR,DR,DIAUTLF) ;is DIAUTLF within DR?  -- from 'DIQGQ' routine
 I DR=""!'DIAUTLF Q 0
 I DR="*" Q 1
 N DIAUGOT,DIQGCP,DIQGDD,DIQGXDC,DIQGXDF,DIQGXDI,DIQGXDN,DIQGXDD
 S DIQGXDC=0,DIAUGOT=0,DIQGDD=1,DIQGCP="D"
 I '$D(DIQGR) N X S X(1)="FILE" G 202
 S DIQGXDD="^DD("_DIQGR_")"
 S:DIQGR DIQGR=$S(DIQGDD:$$DD(DIQGR),1:$$ROOT^DIQGU(DIQGR,.DA)) I DIQGR="" N X S X(1)="FILE AND IEN COMBINATION" G 202
 F DIQGXDI=1:1 S DIQGXDF=$P(DR,";",DIQGXDI),DIQGXDN=$P(DIQGXDF,":") Q:DIQGXDF=""  D RANGE G GOT:DIAUGOT
NOGOT Q 0
 ;
RANGE I DIQGXDC,$P(^DD(+DIQGXDC,.01,0),"^",2)'["W" S:DR="**" DIQGXDN=DIQGXDN_"*" Q:$L(DIQGXDN,"*")'=2  ;multiple
 I DIQGXDN'?.N,$L(DIQGXDN,"*")=2,$P(DIQGXDN,"*")]"",$D(@DIQGXDD@("B",$P(DIQGXDN,"*"))) S DIQGXDN=$O(^($P(DIQGXDN,"*"),""))_"*"
 I DIQGXDN?1.2"*" S DIAUGOT=1 Q
 Q:DIAUTLF<DIQGXDN  I $P(DIQGXDF,":",2)<DIAUTLF Q:DIAUTLF-DIQGXDN
 S DIAUGOT=1 Q
 ;
GOT Q 1
 ;
DD(X) Q:'$D(^DD(X)) "" Q "^DD("_X_","
202 D BLD^DIALOG(202,.X) Q  ;bad parameter
 ;
 ;
GET(FIL,DA,DATE,TMP,FIELD) ;BUILD 'TMP' ARRAY AS OF DATE
 ;DA is in IEN format    FIELD, optional, means just look at one field
 K @TMP
 N DAT,FLD,FILE,F,D,E,B,C,T
 S F=FIL,FILE=$$FNO^DILIBF(F),@TMP=FILE,D=+$P(DA,",",$L(DA,",")-1) I 'D S D=DA
 I F=FILE F E=0:0 S E=$O(^DIA(FILE,"B",D,E)) Q:'E  D L G Q:$G(@TMP@(F,D_","))
SUBFILES S D=D_"," F  S E=D,D=$O(^DIA(FILE,"B",D)) Q:D-E  D
 .F E=0:0 S E=$O(^DIA(FILE,"B",D,E)) Q:'E  D L
 Q
L I $P($G(^DIA(FILE,E,0)),U)'=D Q
 S FLD=$P(^(0),U,3),DAT=$P(^(0),U,2),I="",F=FILE
 F  S C=$L(FLD,","),I=I_$P(D,",",C)_"," Q:C=1  S T=+FLD G Q:'$D(^DD(F,T,0)) S T=+$P(^(0),U,2) G Q:T'>F!'$D(^DD(T)) S F=T,FLD=$P(FLD,",",2,C)
 I FLD=.01,DAT>DATE,$P(^DIA(FILE,E,0),U,5)="A" K @TMP@(F,I) S @TMP@(F,I)=1 Q  ;THAT ENTRY OR SUB-ENTRY DIDN'T EXIST AS OF DATE  2nd level will only be defined in this case
 I $G(FIELD),FLD-FIELD!(F-FIL) Q
 I '$D(@TMP@(F,I,FLD)) S @TMP@(F,I,FLD)=DAT_U_E Q
 I DAT>DATE Q
 I @TMP@(F,I,FLD)<DAT S @TMP@(F,I,FLD)=DAT_U_E
Q Q
 ;
DIA(DAT,FILE,X,DIAUTLEX) ;FROM DIQG AND DIQGQ
 ;X is a node value from the 'TMP' array built by the GET subroutine, above
 ;DAT is the date/time as of which we want the audited value
 ;DIAUTLEX may contain "E" if we want external value
 I X>DAT Q $$D(2) ;We know what it was before deletion
 Q $$D(3)
D(ON) S X=$G(^DIA(FILE,+$P(X,U,2),ON)) I $G(DIAUTLEX)["E" Q X
 N S,Y S S=$G(^(ON+.1)) I X]"",S="" D  I Y>0 Q Y
 .N %DT S %DT="T" D ^%DT
 S S=$P(S,U) I S]"" Q S
 Q X
 ;
DDAUDIT(B0,DA,A0,A1,A2) ;B0=File or SubFile,  DA=Field, A0=Attribute #, A1=Old value, A2=New value
 N DDA,%,%T,%D,J,B3,I
 Q:'$D(DUZ)!'$G(DT)
 D IJ^DIUTL(B0)
 S A0=+$G(A0),A0=$P($G(^DD(0,A0,0)),U)_U_A0
 K:$G(A1)="" A1 L:$G(A2)="" A2
 D P^DICATTA Q

DIAX
DIAX ;SFISC/DCM-EXTRACT OPTIONS ;12/8/98  07:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
0 S DIK="^DOPT(""DIAX""," G OPT:$D(^DOPT("DIAX",9))
 S ^(0)="EXTRACT OPTION^1.01^" K ^("B")
 F I=1:1:9 S ^DOPT("DIAX",I,0)=$P($T(@I),";;",2)
 D IXALL^DIK
OPT W ! S DIC=DIK,DIC(0)="AEQIZ" D ^DIC K DIC,DIK
 I Y'<0 S DI=+Y K Y D EN G 0
 W ! K %,DIC,DIK,DI,DA,I,J,X,Y,DIAX Q
 ;
EN S DIAX=1
 D @DI
 Q
 ;
1 ;;SELECT ENTRIES TO EXTRACT
 G 1^DIAR
 ;
2 ;;ADD/DELETE SELECTED ENTRIES
 S DIAR=2 G ENTE^DIARB
 ;
3 ;;PRINT SELECTED ENTRIES
 S DIAR=3 G OUT^DIARA
 ;
5 ;;CREATE EXTRACT TEMPLATE
 W !!,"This option lets you build a template where you specify fields to extract",!,"and their corresponding mapping in the destination file."
 W !!,"For more detailed description of requirements on the destination file,",!,"please see your VA FileMan User Manual."
 S DI=1 G EN^DIFGO
 ;
4 ;;MODIFY DESTINATION FILE
 W !!,"This option allows you to build a file which will store data extracted from",!,"other files.  When creating fields in the destination file, all data types"
 W !,"are selectable.  However, only a few data types are acceptable for receiving",!,"extracted data."
 W !!,"Please see your User Manual for more guidance on building the destination file."
 D 41 G Q:'$D(DIAXDIC)
 D 61,Q
 Q
41 ;
 G ^DICATT
61 ;
 Q:$P(@(^DIC(DIAXDIC,0,"GL")_"0)"),U,4)
 K DIR S DIR("A")="ARCHIVE FILE",DIR(0)="YO",DIR("??")="^W !?5,""'YES' will not allow modifications or deletions of data or data dictionary"",!?5,""'NO'  will place no restrictions on the file"""
 S DIR("B")=$S($P($G(^DD(DIAXDIC,0,"DI")),U)["Y":"YES",1:"NO")
 D ^DIR Q:$D(DTOUT)!$D(DUOUT)  S (DIARCH,DIE)=$S(Y:"Y",1:"N")
62 ;
 D FLAG(DIAXDIC,DIE,DIARCH)
 K DIAXDIC,DIE,DIARCH
 Q
H6 W !!?5,"'YES' will not allow editing or deleting existing file entries or adding",!?11,"new file entries"
 W !?5,"'NO'  will place no restrictions on the file"
 Q
6 ;;UPDATE DESTINATION FILE
 N DIAR,DIARC,DIARP,DIARB,DIE,DA,DR,DTOUT,DIAXFNO,%ZIS,POP,ZTRTN,ZTSAVE
 S DIAR=6 D FILE^DIARU G Q:'$D(DIARC)
 N DIARP,DIE,DA,DR
 W !!,"You MUST enter an EXTRACT template name.  This EXTRACT template will be used",!,"to populate your destination file."
 S DIE="^DIAR(1.11,",DA=DIARC,DR="3;I X=""^"" S Y="";S DIARP=X;S DIAXFNO=+$P(^DIPT(DIARP,0),U,9);17////^S X=DIAXFNO" D ^DIE G UNLK:$D(DTOUT)!'$D(DIARP)
 S DIARB=+$P(^DIAR(1.11,DIARC,0),U,3)
 D EN^DIAXM I $G(DIERR) G UNLK
 W $C(7),!,"If entries cannot be moved to the destination file, an exception report",!,"will be printed.",!!,"Select a device where to print the exception report."
 W !!,"QUEUEING to this device will queue the Update process."
 N %ZIS,POP,ZTRTN,ZTSAVE,DIAXIOP
 S %ZIS="Q",%ZIS("A")="EXCEPTION REPORT DEVICE: ",%ZIS("B")="" D ^%ZIS G UNLK:POP S DIAXIOP=ION
 I $D(IO("Q")) S ZTRTN="DQ^DIAXU",(ZTSAVE("DIARP"),ZTSAVE("DIARB"),ZTSAVE("DIARC"))="",ZTSAVE("DIAXIOP")="",ZTIO="" D ^%ZTLOAD G UNLK
 D DIAX^DIAXU
 Q
 ;
7 ;;PURGE EXTRACTED ENTRIES
 S DIAR=90 G ENTD^DIARA
 ;
8 ;;CANCEL EXTRACT SELECTION
 S DIAR=99 G ENTC^DIARA
 ;
9 ;;VALIDATE EXTRACT TEMPLATE
 N X,DIC,Y
 S DIC="^DIPT(",DIC(0)="ASQEM",DIC("A")="Select EXTRACT TEMPLATE: ",DIC("S")="I $P(^(0),U,8)=2"
 D ^DIC Q:Y'>0
 S DIARP=+Y,DIAR=""
 D EN^DIAXM
 D Q G 9
 ;
UNLK N DIAR S DIAR=""
 D UPDATE^DIARU
Q D Q^DIARB
 Q
 ;
FLAG(DIC,DIE,DIARCH) ;
 Q:'DIC  Q:'$D(^DD(DIC,0))
 S $P(^DD(DIC,0,"DI"),U)=DIARCH,$P(^DD(DIC,0,"DI"),U,2)=DIE
 Q

DIAXD
DIAXD ;SFISC/DCM-GET SOURCE DATA ;9/6/96  15:17
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 N DILL,FRFILE,TOFILE,DIAXIEN,DIAXI,DIAXFR,DIAXTO,DATAFR,DATALST,Z
 S (DILL,DIAXI)=$G(DILL)+1,FRFILE=@DIAXTFR@(DILL,"FR"),TOFILE=@DIAXTFR@(FRFILE,"TO"),Z=","
 S DIAXFR="^TMP($J,""DIAXFR"")",DIAXTO="^TMP($J,""DIAXTO"")",DATAFR="^TMP($J,""DATAFR"")",DATALST="^TMP($J,""DATALST"")"
 D Q,TOP I $G(DIERR) D Q Q
 D NEXTLVL
Q K @DIAXFR,@DIAXTO,@DATAFR
 K:$G(DIERR) ^TMP("DIAX",$J)
 Q
TOP ;
 N FRIENS,TOIENS
 S (FRIENS,@DIAXFR@(FRFILE,"IENS"))=DIAXFE_Z
 S (TOIENS,@DIAXTO@(TOFILE,"IENS"),@DIAXTO@(FRFILE,"IENS",FRIENS))=$$DIAXIEN()
 D GETFDA(FRIENS,TOIENS)
 Q
GETFDA(FRIENS,TOIENS) ;
 D GETS Q:$G(DIERR)
 D FDA
 Q
GETS ;
 N DR,FLAGS,FIELDS
 F  S DR=$G(DR)+1 Q:'$G(@DIAXTFR@(FRFILE,"DR",DR))  D  Q:$G(DIERR)
 . S FLAGS="EIN"
 . S FIELDS=@DIAXTFR@(FRFILE,"DR",DR)
 . D GETS^DIQ(FRFILE,FRIENS,FIELDS,FLAGS,DATAFR,DIAXERR) D:$G(DIERR) ERR
 Q
FDA ;
 N A,B,C S A=0
 F  S A=$O(@DATAFR@(FRFILE,FRIENS,A)) Q:A'>0  F C=0,1 S B=$G(@DIAXTTO@(FRFILE,A,C)) D:B]""  Q:$G(DIERR)
 . I $O(@DATAFR@(FRFILE,FRIENS,A,0)) S ^TMP("DIAX",$J,TOFILE,TOIENS,+$P(B,U,2))=U_$P($$GET1^DIQ(FRFILE,FRIENS,A,"B"),U,2) Q
 . S ^TMP("DIAX",$J,TOFILE,TOIENS,+$P(B,U,2))=$S(+$P(B,U,3):@DATAFR@(FRFILE,FRIENS,A,"E"),1:@DATAFR@(FRFILE,FRIENS,A,"I"))
 I '$D(^TMP("DIAX",$J,TOFILE,TOIENS,.01)) S ^TMP("DIAX",$J,TOFILE,TOIENS,.01)=$$GET1^DIQ(FRFILE,FRIENS,.01,"I","",DIAXERR) D:$G(DIERR) ERR
 K @DATAFR
 Q
GETLIST ;
 N SCR,A,B S SCR=$G(DIAXSCR(FRFILE))
 S FRIENS=$G(FRIENS),PART=$G(PART),INDEX=$G(INDEX) K @DATALST
 D LIST^DIC(FRFILE,FRIENS,"","","","",PART,INDEX,.SCR,"",DATALST,DIAXERR)
 I $G(DIERR) D ERR,Q1 Q
 I '$P(@DATALST@("DILIST",0),U) D Q1 Q
 I $G(PART)]"" S FRIENS=Z_@DIAXFR@(PARENT,"IENS")
 S A=0 F  S A=$O(@DATALST@("DILIST",2,A)) Q:A'>0  S B=@DATALST@("DILIST",2,A),@DIAXFR@(FRFILE,"IENS",$E(FRIENS,2,99),B_FRIENS)=""
Q1 K @DATALST,PART,INDEX
 Q
TOIENS ;
 N A,B S A=""
 F  S A=$O(@DIAXFR@(FRFILE,"IENS",FRIENS,A)) Q:A=""  S B=$$DIAXIEN(),@DIAXTO@(FRFILE,"IENS",A)=B_@DIAXTO@(PARENT,"IENS",FRIENS)
 Q
GETDATA ;
 Q:'$D(@DIAXTFR@(FRFILE,"DR"))
 N A,ZFRIENS S A="",ZFRIENS=FRIENS N FRIENS
 F  S A=$O(@DIAXFR@(FRFILE,"IENS",ZFRIENS,A)) Q:A=""  S FRIENS=A D  Q:$G(DIERR)
 . N TOIENS
 . S TOIENS=@DIAXTO@(FRFILE,"IENS",FRIENS)
 . D GETFDA(FRIENS,TOIENS) Q:$G(DIERR)
 . I $D(DIAXFILE(FRFILE)) D  Q
 . . N Y,DIERZ
 . . D RECURSE
 . . I $G(DIERZ) N DIERR,Y S Y("IEN")=DIAXFE D BLD^DIALOG(1300,"",.Y) D STE^DIAXU()
 Q
MULT(FRIENS) ;
 S FRIENS=Z_FRIENS
 D GETLIST Q:$G(DIERR)
 S FRIENS=$E(FRIENS,2,99)
 D TOIENS
 D GETDATA
 Q
ERR ;
 Q:'$D(FRFILE)!('$D(FRIENS))
 Q:'$D(DIAXFILE(FRFILE))
 D STE^DIAXU(FRFILE,FRIENS)
 Q
NEXTLVL ;
 F DIAXI=$G(DIAXI):0 S DIAXI=$O(@DIAXTFR@(DIAXI)) Q:'$D(@DIAXTFR@(+DIAXI,"FR"))  D NEXTLVL2 Q:$G(DIERR)!(DIAXI="")
 Q
NEXTLVL2 ;
 N FRFILE,TOFILE,PARENT,DILL,FRIENS,TOIENS,TAG
 S FRFILE=@DIAXTFR@(DIAXI,"FR"),TOFILE=@DIAXTFR@(FRFILE,"TO"),PARENT=^("PRT"),DILL=^("P2"),TAG=^("P4")
 D @TAG
 Q
3 ;
 I $D(DIAXFILE(FRFILE)) D FILE Q:$G(DIERR)
 I DILL=2 S FRIENS=@DIAXFR@(PARENT,"IENS") D MULT(FRIENS) Q
 N A,B S (A,B)="" F  S B=$O(@DIAXFR@(PARENT,"IENS",B)) Q:B=""  D
 . F  S A=$O(@DIAXFR@(PARENT,"IENS",B,A)) Q:A=""  D  Q:$D(DIAXFILE(PARENT))
 . . S FRIENS=A D MULT(FRIENS) Q:$G(DIERR)
 Q
2 ;
 N PTRFLD,FRIENS,PTRIEN,A,B
 S PTRFLD=$P(@DIAXTFR@(FRFILE,"P5"),":")
 I DILL=2 S FRIENS=@DIAXFR@(PARENT,"IENS") D 21 Q
 S (A,B)="" F  S B=$O(@DIAXFR@(PARENT,"IENS",B)) Q:B=""  D  Q:$G(DIERR)!('PTRIEN)
 . F  S A=$O(@DIAXFR@(PARENT,"IENS",B,A)) Q:A=""  D  Q:$G(DIERR)!'(PTRIEN)!($D(DIAXFILE(PARENT)))
 . . S FRIENS=A D 21
 Q
21 N TOIENS
 S PTRIEN=$$GET1^DIQ(PARENT,FRIENS,PTRFLD,"I","",DIAXERR) D:$G(DIERR)  Q:$G(DIERR)!('PTRIEN)
 . N FRFILE
 . S FRFILE=PARENT
 . D ERR
 S FRIENS=PTRIEN_Z
 S TOIENS=@DIAXTO@(PARENT,"IENS",A)
 D GETFDA(FRIENS,TOIENS)
 Q
4 ;
 N PART,INDEX,FRIENS
 S PART=$$GET1^DIQ(PARENT,@DIAXFR@(PARENT,"IENS"),.01,"I","",DIAXERR) D:$G(DIERR)  Q:PART']""!$G(DIERR)
 . N FRFILE,FRIENS
 . S FRFILE=PARENT
 . S FRIENS=@DIAXFR@(PARENT,"IENS")
 . D ERR
 S INDEX=@DIAXTFR@(FRFILE,"P7")
 I $D(DIAXFILE(FRFILE)) D FILE Q:$G(DIERR)
 S FRIENS="" D GETLIST Q:$G(DIERR)
 S FRIENS=@DIAXFR@(PARENT,"IENS")
 D TOIENS,GETDATA
 Q
DIAXIEN() ;
 S DIAXIEN=$G(DIAXIEN)+1
 Q "+"_DIAXIEN_Z
FILE ;
 Q:'$D(^TMP("DIAX",$J))
 N IEN S IEN="^TMP($J,""IEN"")"
 D Q2,UPDATE^DIE("E","^TMP(""DIAX"",$J)",IEN,DIAXERR)
 I $G(DIERR) D  Q
 . K ^TMP("DIAX",$J)
 . D ERR
 N %,NODE,A,B,FI,VAL,DA S %=0,NODE=DIAXTO
 I $G(@IEN@(1)) S DIAXDA=^(1),FI=0,FI=$O(@NODE@(FI))
 E  S FI=FRFILE
 F  S %=$O(@IEN@(%)) Q:'%  S DA=@IEN@(%) D VAL
Q2 K @IEN Q
VAL S NODE=DIAXTO,NODE=$NA(@NODE@(FI)) F  S NODE=$Q(@NODE) Q:NODE'["DIAXTO"  Q:$QS(NODE,5)'[$G(FRIENS)  S VAL=@NODE I VAL[("+"_%_Z)  S VAL=$P(VAL,"+"_%_Z,1)_DA_Z_$P(VAL,"+"_%_Z,2) S @NODE=VAL D
 . S A=$QS(NODE,3),B=$QS(NODE,5)
 . Q:(A'=DIAXF)&('$D(DIAXFILE(A)))
 . Q:A=""!(B="")
 . I A=DIAXF S B=+B,VAL=+VAL
 . S @DIAXRSLT@("RESULT",A,B)=VAL
 Q
RECURSE ;
 N DIAXIZ,DILLZ,DIERR
 S DIAXIZ=DIAXI,DILLZ=DILL
 D NEXTLVL,FILE
 N NODE,SUB,FILE S FILE=FRFILE
 F  S FILE=$O(@DIAXFR@(FILE)) Q:'FILE  F NODE=$NA(@DIAXFR@(FILE)),$NA(@DIAXTO@(FILE)) F  S NODE=$Q(@NODE) Q:NODE'["IENS"  S SUB=$QS(NODE,5) I SUB[FRIENS K @NODE
 K @DIAXFR@(FRFILE,"IENS",ZFRIENS,FRIENS),@DIAXTO@(FRFILE,"IENS",FRIENS)
 S DIAXI=DIAXIZ,DILL=DILLZ,A=""
 I $G(DIERR) K DIAXDA S DIERZ=1
 Q

DIAXERR
DIAXERR ;SFISC/DCM-EXTRACT MAPPING UTILITIES ;5/1/96  16:49
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ERR(A) ;
 Q:'$D(A)  N DIAXMSG
 S DIPG=+$G(DIPG),DIERR=($G(DIERR)+1)_U_($P($G(DIERR),U)+1)
 S DIAXMSG=$S(+A:$P($T(@(+A)),";",3),1:A)
 I DIPG S ^TMP("DIERR",$J,+DIERR)="",^(+DIERR,"TEXT",1)=DIAXMSG Q
 E  D EN^DDIOL(DIAXMSG)
 Q
5 ;;Destination file does not exist
6 ;;Mapping information does not exist
7 ;;Extract field does not exist
8 ;;Field in destination file does not exist

DIAXF
DIAXF ;SFISC/DCM-FILE EXTRACTED DATA ;5/13/96  14:01
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 Q:'$D(^TMP("DIAX",$J))
 N DIAXDAZ
 S DIAXDAZ="^TMP(""DIAXDAZ"",$J)" K @DIAXDAZ
 D UPDATE^DIE("E","^TMP(""DIAX"",$J)",DIAXDAZ,DIAXERR)
 I $G(DIERR) D  Q
 . K ^TMP("DIAX",$J) I $D(@DIAXDAZ) D  Q
 . . N NODE,DA,DIK S NODE=$Q(@(DIAXDAZ))
 . . S DA=@NODE,DIK=DIAXDFRT
 . . D ^DIK K @DIAXDAZ Q
 S DIAXDA=@($Q(@DIAXDAZ)) K @DIAXDAZ
 Q

DIAXG
DIAXG ;SFISC/DCM-UPDATE DESTINATION FILE ;6/11/93  11:32 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EN I $G(DIAXNTC)'=DIARP D EN^DIAXM G EOJ:$D(DIAXMSG) S DIAXNTC=DIARP
 ;
EN1 K ^TMP("DIAX",$J),DIAXDA
 D INIT^DIAXGI,BODY,EOJ
 Q
 ;
BODY D BASE Q:$D(DIAXMSG)
 D NEXTLVL
 Q
 ;
BASE D ^DIAXGU Q:$D(DIAXMSG)
 D FIELDS
 D ^DIAXU1 Q:$D(DIAXMSG)
 S DIAXDA=^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"DA")
 Q
 ;
NEXTLVL S DIAX(DILL,"DIAXI")=DIAXI,DILL=DILL+1
 F DIAXI=DIAXI:0 S DIAXI=$O(^DIPT(DIARP,1,DIAXI)) Q:DIAXI'=+DIAXI  S X=^(DIAXI,0) D NEXTLVL2 Q:DIAXI=""!$D(DIAXMSG)
 S DILL=DILL-1,DIAXI=DIAX(DILL,"DIAXI")
 Q
 ;
NEXTLVL2 I $P(X,U,2)<DILL S DIAXI="" Q
 Q:$P(X,U,3)'=DIAX(DILL-1,"FILE")
 D FVARS^DIAXGI
 I DIAX(DILL,"XREF")?1A.E D DIAXG3^DIAXG2 Q
 I DIAX(DILL,"XREF")=3 D ^DIAXG2 Q
 Q:'DIAX(DILL,"FE")
 D ^DIAXGU Q:$D(DIAXMSG)
 D FIELDS
 D ^DIAXU1 Q:$D(DIAXMSG)
 D RECURSE
 Q
 ;
RECURSE D NEXTLVL
 Q
 ;
FIELDS D ^DIAXG1
 Q
 ;
EOJ K DIAXI,DILL,DIAXFI,DIAX,X,DIAXET,^TMP("DIAX",$J)
 K:'$D(DIAXMSG) DIAXFE
 Q

DIAXG1
DIAXG1 ;SFISC/DCM-EXTRACT FIELDS ;3/2/93  1:36 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
START K ^UTILITY("DIQ1",$J,DIAX(DILL,"FILE"))
 D DRS
 Q
 ;
DRS S DR="",DIAXDRR="",DIAXDRZ=0
 F DIAX2=0:0 S DIAX2=$O(^DIPT(DIARP,1,DIAXI,"F",DIAX2)) Q:DIAX2'=+DIAX2  I $D(^(DIAX2,0)) S DRX=^(0),DR=DR_+DRX_";",DIAXDR(+DRX)=$P(DRX,U,3),DIAXEXT(+DRX)=$P(DRX,U,5) I $L(DR)>200 D DR S DR="",DIAXDRR=""
 D DR:DR]"" K DIAX2,DIAXDRZ Q
 ;
EN ;
DR I '$D(DIAX(DILL,"MUL")) S DIC=DIAX(DILL,"FILE"),DA=DIAX(DILL,"FE")
 S DIQ(0)="IEN" D EN^DIQ1 K DIQ
 F DIAX2(DILL,"FLD")=0:0 D DR2 Q:DIAX2(DILL,"FLD")'=+DIAX2(DILL,"FLD")  S X=^UTILITY("DIQ1",$J,DIAX(DILL,"FILE"),DIAX(DILL,"FE"),DIAX2(DILL,"FLD"),$S($G(DIAXEXT(DIAX2(DILL,"FLD"))):"E",1:"I")) D FIELD
 D ET
 I '$D(DIAX(DILL,"MUL")) K DA,DIC,DR,DIAXDRR,DIAXDR,DIAXEXT
 K ^UTILITY("DIQ1",$J,DIAX(DILL,"FILE")),DRX
 Q
 ;
DR2 S DIAX2(DILL,"FLD")=$O(^UTILITY("DIQ1",$J,DIAX(DILL,"FILE"),DIAX(DILL,"FE"),DIAX2(DILL,"FLD"))) Q:DIAX2(DILL,"FLD")=""
 I $O(^UTILITY("DIQ1",$J,DIAX(DILL,"FILE"),DIAX(DILL,"FE"),DIAX2(DILL,"FLD"),0)) S V("WP")=0,^UTILITY("DIQ1",$J,DIAX(DILL,"FILE"),DIAX(DILL,"FE"),DIAX2(DILL,"FLD"),"I")="wp"
 Q
 ;
FIELD D:$L(DIAXDRR)+$L(X)>235 ET
 Q:'$D(DIAXDR(DIAX2(DILL,"FLD")))
 I DIAXDR(DIAX2(DILL,"FLD"))=".01" S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"X")=X G F2
 S:X[";" ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),DIAXDR(DIAX2(DILL,"FLD")))=X
 S:'$D(V) DIAXDRR=DIAXDRR_DIAXDR(DIAX2(DILL,"FLD"))_"///"_$S(X'[";":X,1:"^S X=^TMP(""DIAX"",$J,"_DIAXET(DILL,"FILE")_","_DIAXDR(DIAX2(DILL,"FLD"))_")")_";"
 D:$D(V)>9 WP
F2 K X,V
 Q
 ;
WP S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),DIAXDR(DIAX2(DILL,"FLD")),"DTO(1)")=^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"GL"),^("DTL")=1
 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),DIAXDR(DIAX2(DILL,"FLD")),"DFR(1)")=DIAX(DILL,"FGBL")_DIAX(DILL,"FE")_","""_$P($P(^DD(DIAX(DILL,"FILE"),DIAX2(DILL,"FLD"),0),U,4),";")_""",",^("DFL")=1
 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"WP",0)="",^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"WP",DIAXDR(DIAX2(DILL,"FLD")),0)=""
 Q
 ;
ET I '$D(^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"DR")) S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"DR")=DIAXDRR G ET1
 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"DR",$G(DIAXDRZ)+1)=DIAXDRR,DIAXDRZ=$G(DIAXDRZ)+1
 ;
ET1 S DIAXDRR=""
 Q

DIAXG2
DIAXG2 ;SFISC/DCM-EXTRACT SUBFILES ;9/2/94  06:35
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SUBFILE F DIAX(DILL,"FE")=0:0 S DIAX(DILL,"FE")=$O(@(DIAX(DILL,"FGBL")_DIAX(DILL,"FE")_")")) Q:DIAX(DILL,"FE")'=+DIAX(DILL,"FE")!($D(DIAXMSG))  D SUBENTRY
 Q
 ;
SUBENTRY ;
 N DIAXOUT
 D DR S DR(DIAX(DILL,"FILE"))=.01
 S DIAX(DILL,"MUL")=1
 D ^DIAXGU Q:$D(DIAXMSG)!$G(DIAXOUT)
 D DR,DRS
 D ^DIAXU1 G X1:$D(DIAXMSG)
 D RECURSEM
X1 K DIAX(DILL,"MUL"),DA,DR,DIAXDR,DIAXDRR,DIAXEXT,DIAX2,DRX
 Q
 ;
DR K DR S I=0
 F %=DIAX(DILL,"FILE"):0 Q:'$D(^DD(%,0,"UP"))  S X=^("UP"),Y=$O(^DD(X,"SB",%,0)),DR(X)=Y,DA(%)=DIAX(DILL-I,"FE"),%=X,I=I+1
 S DA=DIAX(DILL-I,"FE"),DIC=DIAX(DILL-I,"FILE"),DR=DR(%) K DR(%)
 Q
 ;
DRS S DR(DIAX(DILL,"FILE"))="",DIAXDRR=""
 F DIAX2=0:0 S DIAX2=$O(^DIPT(DIARP,1,DIAXI,"F",DIAX2)) Q:DIAX2'=+DIAX2  I $D(^(DIAX2,0)) S DRX=^(0) D
 . S DR(DIAX(DILL,"FILE"))=DR(DIAX(DILL,"FILE"))_+DRX_";",DIAXDR(+DRX)=$P(DRX,U,3),DIAXEXT(+DRX)=$P(DRX,U,5)
 . I $L(DR(DIAX(DILL,"FILE")))>200 D EN^DIAXG1 S DR(DIAX(DILL,"FILE"))=""
 D EN^DIAXG1:DR(DIAX(DILL,"FILE"))]""
 Q
 ;
RECURSEM D NEXTLVL^DIAXG
 Q
 ;
DIAXG3 ;
FILE F DIAX(DILL,"FE")=0:0 D FILE2 Q:DIAX(DILL,"FE")=""!($D(DIAXMSG))  D ENTRY
 K X
 Q
 ;
FILE2 S DIAX(DILL,"FE")=$O(@(DIAX(DILL,"FGBL")_""""_DIAX(DILL,"XREF")_""","_DIAX(DILL-1,"FE")_","_DIAX(DILL,"FE")_")"))
 Q
 ;
ENTRY S DIAX(DILL,"NAV")=1
 D ^DIAXGU Q:$D(DIAXMSG)
 K DIAX(DILL,"NAV")
 D ^DIAXG1
 D ^DIAXU1 G X1:$D(DIAXMSG)
 D RECURSEF
 Q
 ;
RECURSEF D NEXTLVL^DIAXG
 Q

DIAXGI
DIAXGI ;SFISC/DCM-EXTRACT INITIALIZATION ;11/10/92  2:56 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
INIT S DIAXI=0,DILL=1
 D FIRST
 Q
 ;
FIRST S DIAXI=$O(^DIPT(DIARP,1,DIAXI)) Q:DIAXI'=+DIAXI
 S X=^(DIAXI,0)
 D FVARS
 Q
 ;
FVARS S DILL=$P(X,U,2),DIAX(DILL,"FILE")=+X,DIAXET(DILL,"FILE")=$P(X,U,9),(DIAXET(DILL,"PRT"),DIAXET(DIAXET(DILL,"FILE")))=$P(X,U,10)
 I DILL=1 S DIAX(DILL,"FE")=DIAXFE
 I $P(X,U,4)=1 S DIAX(DILL,"FE")=DIAX(DILL-1,"FE")
 S DIAX(DILL,"XREF")=$S($P(X,U,4)=4:$P(X,U,7),1:$P(X,U,4)),%=$P(X,U,5)
 I $E(%,$L(%))=":" S DIAX(DILL,"NAV")=1 I $P(X,U,4)=2 S DIAX(DILL,"NAV")=2 D DIRECT K %,Y
 I $P(X,U,4)=3 S %=$P(X,U,3),%=$O(^DD(%,"SB",+X,0)),%=^DD(+$P(X,U,3),%,0),%=$P($P(^(0),U,4),";") S:+%'=% %=""""_%_"""" S DIAX(DILL,"FGBL")=DIAX(DILL-1,"FGBL")_DIAX(DILL-1,"FE")_","_%_"," K DIAX(DILL,"NAV") D FGBL Q
 S DIAX(DILL,"FGBL")=^DIC(DIAX(DILL,"FILE"),0,"GL") D FGBL
 Q
 ;
DIRECT S DIAX(DILL,"FE")=0,%=$P(%,":")
 S:'$D(^DD(DIAX(DILL-1,"FILE"),"B",%)) %=$O(^(%))
 S %=$O(^DD(DIAX(DILL-1,"FILE"),"B",%,0))
 Q:%'=+%
 S Y=$P(^DD(DIAX(DILL-1,"FILE"),%,0),U,4),%("N")=$P(Y,";"),%("P")=$P(Y,";",2) S:+%("N")'=%("N") %("N")=""""_%("N")_""""
 I $D(@(DIAX(DILL-1,"FGBL")_DIAX(DILL-1,"FE")_","_%("N")_")")) S Y=@("^("_%("N")_")"),DIAX(DILL,"FE")=$P(Y,U,%("P"))
 Q
 ;
FGBL S DIAXFI=+$P(X,U,10) I 'DIAXFI Q
 I DILL=1 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"GL")=^DIC(DIAXET(DILL,"FILE"),0,"GL") Q
 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"GL")=^TMP("DIAX",$J,DIAXFI,"GL")_$S(DIAXET(DILL,"FILE")'=DIAXFI:^TMP("DIAX",$J,DIAXFI,"DA")_$S($P(X,U,11)]"":","""_$P($P(X,U,11),";")_""",",1:","),1:"")
 S:$D(^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"WP")) ^("DTO(1)")=^("GL") S ^("DA(1)")=DIAXET(DIAXFI,"DA")
 I $G(DIAXET(DIAXFI,"DA(1)"))]"" F DIAXII=1:1 Q:'$D(DIAXET(DIAXFI,"DA("_DIAXII_")"))  S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"DA("_(DIAXII+1)_")")=DIAXET(DIAXFI,"DA("_DIAXII_")")
 K DIAXFI,DIAXII
 Q

DIAXGU
DIAXGU ;SFISC/DCM-EXTRACT FUNCTIONS ;9/2/94  06:40
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LOOKUP D SETX G Q:$D(DIAXMSG)!$G(DIAXOUT)
 D ET
Q K X,X1,^UTILITY("DIQ1",$J),DIQ
 Q
 ;
SETX I '$D(DIAX(DILL,"MUL")) S DIC=DIAX(DILL,"FILE"),DA=DIAX(DILL,"FE"),DR=".01" I '$D(@(DIAX(DILL,"FGBL")_DA_",0)")) D ERR^DIAXERR(97,DIAXFN_U_DIAXFE_U_DIAX(1,.01)) D FIX^DIAXU2 Q
 S DIQ(0)="EIN" D EN^DIQ1
 S X=^UTILITY("DIQ1",$J,DIAX(DILL,"FILE"),DIAX(DILL,"FE"),.01,"E"),X1=^("I")
 I DILL=1 S DIAX(DILL,.01)=X
 I $D(DIAX(DILL,"MUL")),$G(DIAXSCR(DIAX(DILL,"FILE")))]"" D
 .N X S X=X1 X DIAXSCR(DIAX(DILL,"FILE")) S:'$T DIAXOUT=1
 Q
 ;
ET I '$D(DIAX(DILL,"MUL")) K DA,DIC,DR
 I DIAX(DILL,"XREF")=2 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"MODE")="M" Q
 S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"X")=X,^("MODE")="A"
 I $D(DIAX(DILL,"MUL"))!(DIAX(DILL,"XREF")?1A.E) S ^TMP("DIAX",$J,DIAXET(DILL,"FILE"),"DIC(""P"")")=DIAXET(DILL,"FILE")
 Q

DIAXM
DIAXM ;SFISC/DCM-PROCESS MAPPING INFORMATION ;6/16/93  4:04 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ASK S DIAXTAB=DL+DL-2 S:DJ DIAXTAB=DIAXTAB+1
 I $D(DC(DC)),$P(DC(DC),U,3)]"",'DINS S DIAXDEF=$P($G(^DD(DIAXF,$P(DC(DC),U,3),0)),U)_"// "
 W !?DIAXTAB,"MAP ",DIAXDICA," TO ",DIAXEF,$S($D(DIAXSB):" SUB-FIELD: ",1:" FIELD: ") W:'DINS $G(DIAXDEF)
 R DIAXX:DTIME I '$T S (DTOUT,DIRUT)=1 Q
 I DIAXX="",$D(DIAXDEF) S X=$P(DIAXDEF,"//") G ASK1
 I DIAXX=U S (DUOUT,DIRUT)=1 Q
 I $D(DIAXDEF),DIAXX="@" S $P(DC(DC),U,3)="" K DIAXDEF G ASK
 I DIAXX="" W !?DIAXTAB,$C(7),DIAXDICA," will not be extracted" K DIAXDICA Q
 S X=DIAXX
ASK1 D DIC I Y'>0 W:X'["?" $C(7),"??",!?DIAXTAB,"Check available fields for mapping by typing '??'." G ASK
 I +$P(Y(0),U,2),$P(^DD(+$P(Y(0),U,2),.01,0),U,2)["W" S DIAX1=$P(Y(0),U,4),Y(0)=^(0),$P(Y(0),U,4)=DIAX1
 S DIAXLOC(DIAXFILE)=DIAXLOC(DIAXFILE)_U_+Y K:+Y=.01 DIAXE01(DIAXFILE)
 D PR
 Q
DIC K DIC,Y
 S DIAXS1="$P(^(0),U,2)",DIC="^DD("_DIAXF_",",DIC(0)="ZE"_$E("O",DC>0)
 D DICS
 S DIC("S")=DIC("S")_",'$F(DIAXLOC(DIAXFILE)_U,U_+Y_U)"
 D ^DIC
 Q
 ;
DICS I DIAXFT["W" S DIC("S")="I +"_DIAXS1_",$P(^DD(+"_DIAXS1_",.01,0),U,2)[""W""" Q
 I DIAXFT["C" S DIC("S")="I "_DIAXS1_"[""F""!("_DIAXS1_"["""_$S(DIAXFT["D":"D"")",1:"N"")") Q
 S DIC("S")="I "_DIAXS1_"["""_$S(DIAXFT["K":"K""",1:"F""")_$S(DIAXFT["D":"!("_DIAXS1_"[""D"")",DIAXFT["N"!(DIAXFT["P"&'$G(DIAXEXT)):"!("_DIAXS1_"[""N"")",1:"")_$S((DIAXFT["S"&'$G(DIAXEXT)):"!("_DIAXS1_"[""S"")",1:"")
 Q
PR S DIAXTO=1,DIAXFR=0
 D EN1
 Q
EN S DIPG=+$G(DIPG) N DIAXF
 W:'DIPG !!,"Excuse me, this will take a few moments...",!,"Checking the destination file...",!
 I '$P(^DIPT(DIARP,0),U,9)!('$D(^DIC(+$P(^DIPT(DIARP,0),U,9),0))) D ERR^DIAXERR(5) Q
 I '$D(^DIPT(DIARP,1,0)) D ERR^DIAXERR(6) Q
 F DIAX1=0:0 S DIAX1=$O(^DIPT(DIARP,1,DIAX1)) Q:DIAX1'>0  S DIAX41=^(DIAX1,0),(DIAXDK,DK)=+DIAX41,DIAXDL=$P(DIAX41,U,2),DIAXF=$P(DIAX41,U,9),DIAXEF=$O(^DD(DIAXF,0,"NM",0)) D   D IX^DIAXMS
 . S DIAXLNK=+$P(DIAX41,U,4),DIAXE01(DIAXF)=$S(DIAXLNK>2:+$P(DIAX41,U,3),1:DIAXDK)_U_(DIAXLNK>2)
 . F DIAX2=0:0 S DIAX2=$O(^DIPT(DIARP,1,DIAX1,"F",DIAX2)) Q:DIAX2'>0  S DIAX42=^(DIAX2,0),DIAXEXT=+$P(DIAX42,U,5) D
 . . K DIC S X=+DIAX42,DIC="^DD(DIAXDK,",DIC(0)="OZ" D ^DIC I Y'>0 D ERR^DIAXERR(7) Q
 . . I $P(Y(0),U,2) S Y(0)=^DD(+$P(Y(0),U,2),.01,0)
 . . S DIAXFR=1,DIAXTO=0,DIAXTAB=0 D EN1
 . . K Y,DIC
 . . I DIAXF#1 S DIAXSB=1
 . . S X=$P(DIAX42,U,3),DIC="^DD(DIAXF,",DIC(0)="OZ" D ^DIC I Y'>0 D ERR^DIAXERR(8) K DIAXFR Q
 . . I $P(Y(0),U,2) S Y(0)=^DD(+$P(Y(0),U,2),.01,0)
 . . I +Y=.01 K DIAXE01(DIAXF)
 . . D PR,Q
 . . K DIAXSB
 I $D(DIAXE01) D F1^DIAXMS
 I $G(DIERR),'DIPG,DIAR=6 W !!,$C(7),"Sorry, I can not proceed with the update.  Your destination file needs fixing",!,"first."
 I '$G(DIERR),'DIPG,DIAR="" W !,$C(7),"Template looks OK!"
 D Q,Q1^DIAXMS
 Q
EN1 D IN Q:($D(DIAXMSG)&'$D(DIAR))
 D EN^DIAXM1
 Q
IN S DIAXFT=$P(Y(0),U,2),DIAXFTY=$$TYP^DIAXMS(DIAXFT) Q:($D(DIAXMSG)&'$D(DIAR))
 S DIAXA=$S($D(DIAXVPTR):"DIAXVFR",DIAXFR:"DIAXFR",1:"DIAXTO")
 S @(DIAXA_"(""TY"")")=DIAXFT,@(DIAXA_"(""NM"")")=Y(0,0),@(DIAXA_"(""TYP"")")=DIAXFTY
 I "FN"[DIAXFTY S DIAXHI=+$P($P(Y(0),U,5,9),">",2),DIAXLO=+$P($P(Y(0),U,5,9),"<",2) D HL(DIAXHI,DIAXLO)
 Q
Q D Q^DIAXMS
 Q
EN2 S DIAXDICA=Y(0,0),DIAXFR=1,DIAXTO=0,DIAXC=C,DIAXDJ=DJ,DIAXS=S,DIPG=0,DIAXTAB=+$G(DIAXTAB)
 D EN1 I $D(DIAXMSG)!$D(DIRUT) K Y D Q Q
 D ASK,Q
 Q
HL(A,B) S:A]"" @(DIAXA_"(""HI"")")=+A
 S:B]"" @(DIAXA_"(""LO"")")=+B
 Q

DIAXM1
DIAXM1 ;SFISC/DCM-PROCESS MAPPING INFORMATION (CONT) ;7/11/95  06:33
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN D @DIAXFTY Q:DIAXFR  Q:$D(DIAXMSG)
 I DIAXFR("TYP")'=DIAXTO("TYP"),'$D(DIAXEXT) S DIAXEXT=1
 D:'$D(DIAR) DJ
 Q
 ;
F Q:DIAXFR!($D(DIAXMSG))  I DIAXFR("TY")["C" D CF^DIAXM2 Q
 I "FSP"[DIAXFR("TYP"),+DIAXFR("LO"),DIAXFR("LO")<DIAXTO("LO") S DIAXE2=DIAXFR("LO") D E1,E3
 I "FSP"[DIAXFR("TYP"),DIAXFR("HI")>DIAXTO("HI") S DIAXE2=DIAXFR("HI") D E2
 I DIAXFR("TY")["N",DIAXFR("LE")<DIAXTO("LO") S DIAXE2=DIAXFR("LE") D E1,E3
 I DIAXFR("TY")["N",DIAXFR("LE")>DIAXTO("HI") S DIAXE2=DIAXFR("LE") D E2
 I DIAXFR("TY")["D",DIAXTO("LO")>14 S DIAXE2=14 D E1,E3
 I DIAXFR("TY")["D",DIAXTO("HI")<14 S DIAXE2=14 D E2
 Q
 ;
N G N^DIAXM3
 ;
D G D^DIAXM3
 ;
P D XT I DIAXEXT D P^DIAXM2 Q:$D(DIAXMSG)!DIAXFR
 D HL^DIAXM(15,1)
 Q
 ;
V D XT I DIAXEXT D V^DIAXM2 Q:$D(DIAXMSG)!DIAXFR
 D HL^DIAXM(30,3)
 Q
 ;
C G C^DIAXM2
 ;
S I DIAXTO W:'$D(DIAR) !?DIAXTAB,$C(7),"Make sure the SET OF CODES are identical as the extract field." Q
 D XT D S^DIAXM2
 Q
 ;
W Q:DIAXFR
 I DIAXFR("TY")["L",DIAXTO("TY")'["L" D E3 S DIAXEM=DIAXEM_"be in 'L'ine mode." D X
 Q
 ;
K Q
 ;
E1 S DIAXE1="minimum" Q
E2 S DIAXE1="maximum"
E3 S DIAXEM=DIAXTO("NM")_" field in "_DIAXEF_$S($D(DIAXSB):" subfile",1:" file")_" should " Q:DIAXFTY["W"
 S DIAXEM=DIAXEM_"have a "_DIAXE1_" length of at least "_DIAXE2_" characters."
X D ERR^DIAXERR(DIAXEM)
 K DIAXE1,DIAXE2
 Q
 ;
DJ S DIAXDJ=DIAXDJ+1
 S ^UTILITY("DIFG",$J,DIAXC,DIAXDJ)=DIAXS_U_U_+Y_U_$P(Y(0),U,4)_U_$G(DIAXEXT)
 S S=DIAXS,DJ=DIAXDJ,C=DIAXC
 Q
 ;
XT S DIAXEXT=+$G(DIAXEXT) I '$D(DIAR),$D(DC(DC)) S DIAXEXT=+$P(DC(DC),U,5) Q:'DINS
 Q:$D(DIAR)
 K DIR N Y S DIR(0)="Y",DIR("A")="Move EXTERNAL form of the data to the extract field",DIR("B")="Yes",DIR("?")="Answer YES if the RESOLVED value of data should be moved"
 D ^DIR K DIR Q:'Y
 S DIAXEXT=1
 Q

DIAXM2
DIAXM2 ;SFISC/DCM-PROCESS MAPPING INFORMATION (CONT) ;3/11/93  2:59 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
P K DIC
 ;
P1 S DIC="^DD("_+$P($P(Y(0),U,2),"P",2)_",",DIC(0)="Z",X=.01
 D ^DIC I Y'>0 S DIAXEM=DIAXFR("NM")_" points to missing pointed to file." D E Q
 S DIAXFTY=$$TYP^DIAXMS($P(Y(0),U,2)) Q:$D(DIAXMSG)
 I $P(Y(0),U,2)["P" G P1
 Q:$D(DIAXVPTR)
 D EN1^DIAXM
 Q
V S DIAXVPTR=1,DIAXZZ=0,DIAXVFLD=+Y,DIAXVFI=DK
 ;
V1 F  S DIAXZZ=$O(^DD(DK,DIAXVFLD,"V","B",DIAXZZ)) Q:DIAXZZ'>0  D V2 Q:$D(DIAXMSG)
 Q:$D(DIAXMSG)
 S DIAXFR("TY")=$S(DIAXFR("TY")["F":DIAXFR("TY"),1:"F"),DIAXFR("TYP")="F"
 S DIAXFR("LO")=$S(+DIAXFR("LO")+1:DIAXFR("LO"),1:3)
 S DIAXFR("HI")=$S(+DIAXFR("HI")+1:DIAXFR("HI"),1:45)
 S DIAXFT=DIAXFR("TY"),Y(0)=U_DIAXFT K DIAXVPTR D EN^DIAXM1
 Q
V2 S DIC="^DD(+DIAXZZ,",DIC(0)="Z",X=.01 D ^DIC I Y'>0 S DIAXEM="Missing pointed to file." D E Q
 I $P(Y(0),U,2)["P" D P1 Q:$D(DIAXMSG)
 D IN^DIAXM Q:$D(DIAXMSG)
 S DIAXFR("TY")=$S($G(DIAXFR("TY"))["F":DIAXFR("TY"),1:DIAXVFR("TY"))
 S:DIAXVFR("TY")["F" DIAXFR("LO")=$S(+$G(DIAXFR("LO"))<DIAXVFR("LO"):+$G(DIAXFR("LO")),1:DIAXVFR("LO"))
 S:DIAXVFR("TY")["F" DIAXFR("HI")=$S(+$G(DIAXFR("HI"))>DIAXVFR("HI"):+$G(DIAXFR("HI")),1:DIAXVFR("HI"))
 Q
 ;
S S DIAXZ=$P(Y(0),U,3),DIAXZL=0,DIAXPC=$S(DIAXEXT:2,1:1)
 F DIAXZZ=1:1:$L(DIAXZ,";") S DIAXZY=$P(DIAXZ,";",DIAXZZ) Q:DIAXZY=""  S DIAXZL=$S($L($P(DIAXZY,":",DIAXPC))>+DIAXZL:$L($P(DIAXZY,":",DIAXPC)),1:+DIAXZL),DIAXZLL=$S(+$G(DIAXZLL)<DIAXZL:+$G(DIAXZLL),1:DIAXZL)
 D HL^DIAXM(DIAXZL,DIAXZLL)
 Q
 ;
C S DIAXFR("DC")=+$P($P(Y(0),U,2),",",2)
 S DIAXFR("LE")=+$P($P(Y(0),U,2),"J",2)
 Q
 ;
CN I DIAXFR("TY")["B",DIAXTO("LO")'=0 D E1 S DIAXEM=DIAXEM_"have a minimum value of 0." D E Q
 I DIAXFR("TY")["J",DIAXTO("DC")<DIAXFR("DC") D E1 S DIAXEM=DIAXEM_"have at least "_DIAXFR("DC")_" decimal places." D E
 I DIAXFR("TY")["J",DIAXFR("LE")>DIAXTO("LE") D E1 S DIAXEM=DIAXEM_"be at least "_DIAXFR("LE")_" characters long." D E
 Q
 ;
CF I DIAXFR("TY")["B",DIAXTO("LO")'=1 D E1 S DIAXEM=DIAXEM_"have a minimum length of 1." D E Q
 Q:DIAXFR("TY")["B"
 I DIAXFR("TY")["D",DIAXTO("LO")>7 D E1 S DIAXEM=DIAXEM_"a minimum length of at least 7." D E
 I DIAXFR("TY")["D",DIAXTO("HI")<7 D E1 S DIAXEM=DIAXEM_"a maximum length of at least 7." D E
 I DIAXFR("TY")["J",DIAXFR("LE")<DIAXTO("LO") D E1 S DIAXEM=DIAXEM_"have a minimum length of at least"_DIAXFR("LE")_" characters." D E
 I DIAXFR("TY")["J",DIAXFR("LE")>DIAXTO("HI") D E1 S DIAXEM=DIAXEM_"have a maximum length of at least "_DIAXFR("LE")_" characters." D E
 Q
 ;
CD I DIAXFR("TY")["D",+DIAXTO("LO")!+DIAXTO("HI") D E1 S DIAXEM=DIAXEM_"not have set date ranges." D E
 Q
 ;
E1 S DIAXEM=DIAXTO("NM")_" field in "_DIAXEF_$S($D(DIAXSB):" subfile",1:" file")_" should " Q
 ;
E D ERR^DIAXERR(DIAXEM)
 Q

DIAXM3
DIAXM3 ;SFISC/DCM-PROCESS MAPPING INFORMATION (CONT) ;3/3/93  12:23 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
N S DIAXNO=$P(Y(0),U,2),DIAXLE=+$P(DIAXNO,"J",2) S:DIAXFR DIAXFR("DLR")=$P(Y(0),U,5)["$"
 S @(DIAXA_"(""LE"")")=DIAXLE,@(DIAXA_"(""DC"")")=+$P(DIAXNO,",",2)
 Q:DIAXFR  I DIAXFR("TY")["C" D CN^DIAXM2 Q
 I DIAXFR("TY")["P" G N1
 I DIAXFR("DLR"),DIAXTO("DC")<2 D E3 S DIAXEM=DIAXEM_"contain at least 2 decimal places." D E
 I DIAXFR("DC")>DIAXTO("DC") D E3 S DIAXEM=DIAXEM_"contain at least "_DIAXFR("DC")_" decimal places." D E
 I DIAXFR("LE")>DIAXTO("LE") D E3 S DIAXEM=DIAXEM_"be at least "_DIAXFR("LE")_" digits long." D E
N1 I DIAXTO("LO")>DIAXFR("LO") S DIAXE2=DIAXFR("LO") D E1,E3,E4
 I DIAXTO("HI")<DIAXFR("HI") S DIAXE2=DIAXFR("HI") D E2,E4
 Q
 ;
D S DIAXDT=$P(Y(0),U,5,99),DIAXLO=$P($P(DIAXDT,"<X!(",2),">X"),DIAXHI=$P($P(DIAXDT,"K:",2),"<X!(")
 S @(DIAXA_"(""DT"")")=$P(DIAXDT,"""",2) D HL^DIAXM(+DIAXHI,+DIAXLO)
 Q:DIAXFR  I DIAXFR("TY")["C" D CD^DIAXM2 Q
 I DIAXTO("DT")["R",DIAXFR("DT")'["R" D E3 S DIAXEM=DIAXEM_"not 'R'equire time." D E
 I DIAXTO("DT")["S",DIAXFR("DT")'["S" D E3 S DIAXEM=DIAXEM_"not expect 'S'econds to be returned." D E
 I DIAXTO("DT")["X",DIAXFR("DT")'["X" D E3 S DIAXEM=DIAXEM_"not require e'X'act date." D E
 I DIAXTO("LO"),'DIAXFR("LO") D E3 S DIAXEM=DIAXEM_"not have an earliest date." D E
 I DIAXTO("HI"),'DIAXFR("HI") D E3 S DIAXEM=DIAXEM_"not have a latest date." D E
 I DIAXTO("LO"),DIAXTO("LO")>DIAXFR("LO") S DIAXDTY=DIAXFR("LO") D DT,E3 S DIAXEM=DIAXEM_"have an earliest date of at least "_DIAXDTY D E
 I DIAXTO("HI"),DIAXTO("HI")<DIAXFR("HI") S DIAXDTY=DIAXFR("HI") D DT,E3 S DIAXEM=DIAXEM_"have a latest date of at least "_DIAXDTY D E
 Q
 ;
DT N Y
 S Y=DIAXDTY X ^DD("DD") S DIAXDTY=Y
 Q
 ;
E1 S DIAXE1="minimum" Q
E2 S DIAXE1="maximum"
E3 S DIAXEM=DIAXTO("NM")_" field in "_DIAXEF_$S($D(DIAXSB):" subfile",1:" file")_" should " Q
E4 S DIAXEM=DIAXEM_"have a "_DIAXE1_" value of at least "_DIAXE2
E D ERR^DIAXERR(DIAXEM)
 K DIAXE1,DIAXE2
 Q

DIAXMS
DIAXMS ;SFISC/DCM-MAP SUBFILES ;9/2/94  06:17
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIAXSB=1,DIAXTAB=DL+DL-2 S:DJ DIAXTAB=DIAXTAB+1 S $P(DIAXTABZ," ",DIAXTAB)=" "
 W !,$C(7),?DIAXTAB,DIAXDICA," is a multiple valued field",!,?DIAXTAB,"It MUST be mapped to a subfile."
 K DIC,DIAXUP N Y
 I $D(DC(DC)),$P(DC(1),U,3)]"" S DIAXDEF=$P(DC(1),U,3)
 S DIC="^DD(DIAXF,",DIC(0)="QEAZ",DIC("S")="I $P(^(0),U,2),'$F(DIAXLOC(DIAXFILE)_U,U_+Y_U),$P(^DD(+$P(^(0),U,2),.01,0),U,2)'[""P"",$P(^(0),U,2)'[""W"",$P(^(0),U,2)'[""V"""
 S DIC("A")=DIAXTABZ_"MAP "_DIAXDICA_" TO "_DIAXEF_" SUBFILE: " S:$D(DIAXDEF) DIC("B")=DIAXDEF
 D ^DIC I Y'>0 S DIAXUP=1 W:X=""&'$D(DTOUT) !,$C(7),DIAXDICA_" will not be extracted" S:$D(DTOUT) DIRUT=1 G QQ
 S DIAXLOC(DIAXFILE)=DIAXLOC(DIAXFILE)_U_+Y,DIAXEF=Y(0,0)
 S (DIAXFILE,DIAXF)=+$P(Y(0),U,2),DIAXLOC(DIAXFILE)="",DIAXNP(DL-1)=$P(Y(0),U,4)
QQ K DIAXDEF,DIAXDICA
 Q
IX Q:$P($G(^DD($$FNO^DILIBF(DIAXF),0,"DI")),U)'["Y"
 S (DIAXIX,DIAXFI,DIAXFD)=""
 F  S DIAXIX=$O(^DD(DIAXF,0,"IX",DIAXIX)) Q:DIAXIX=""  F  S DIAXFI=$O(^DD(DIAXF,0,"IX",DIAXIX,DIAXFI)) Q:DIAXFI'>0  F  S DIAXFD=$O(^DD(DIAXF,0,"IX",DIAXIX,DIAXFI,DIAXFD)) Q:DIAXFD'>0  D
 . I '$D(^DD(DIAXFI,DIAXFD,1)) S DIAXEM="Erroneous 'IX' node for "_DIAXIX D ERR^DIAXERR(DIAXEM) Q
 . S DIAXIXN=0 F  S DIAXIXN=$O(^DD(DIAXFI,DIAXFD,1,DIAXIXN)) Q:DIAXIXN'>0  S DIAXIX0=$P(^(DIAXIXN,0),U,2) Q:DIAXIX=DIAXIX0
 . Q:DIAXIXN'>0  S DIAXIX0=$P(^DD(DIAXFI,DIAXFD,1,DIAXIXN,0),U,3) D
 . . Q:DIAXIX0=""
 . . I DIAXIX0["MNE"!(DIAXIX0["REG")!(DIAXIX0["KWI")!(DIAXIX0["SOU") Q
 . . S DIAXEM="The """_DIAXIX_""" cross-reference in "_$P(^DD(DIAXFI,DIAXFD,0),U,1)_" is not allowed for an archive file." D ERR^DIAXERR(DIAXEM) Q:DIPG
 Q
 ;
Q K DIAXZ,DIAXFT,DIAXHI,DIAXLO,DIAXNO,DIAXLE,DIAXTABZ,DIC,DIAXDICA,DIAXS,DIAXDJ,DIAXC
 K DIAXDEF,DIAXA,DIAXX,DIAXFR,DIAXTO,DIAXS1,DIAXDT,DIAXZL,DIAXZLL,DIAXZY,DIAXZZ
 K DIAXIX,DIAXIX0,DIAXIXN,DIAXVFI,DIAXVFLD,DIAXVFR,DIAXDTY
 K DIAX41,DIAX42,DIAXFTY,DIAXEXT,DIAXE1,DIAXE2,DIAXPC I '$G(DIPG),'$G(DIAR)!($G(DIAR)=6) K DIAXMSG
 Q
Q1 K DIAXDK,DIAXDL,DIAXEF,DIAXF,DIAXFD,DIAXIX,DIAXIX0,DIAXIXN,DIAXTAB
 K DIAX1,DIAX2,DIAXFI,DIAXEM,DIAXLNK
 Q
F1 S (A1,B1,D1)=0 S:'$D(DIAR) DIAR=""
 F  S A1=$O(DIAXE01(A1)) Q:A1'>0  S B1=$G(DIAXE01(A1)),C="DIAXFR" S:+$P(B1,U,2) DIAXSB=1 D EN(B1,C) S C="DIAXTO",DIAXFR=0 D EN(A1,C) K DIAXSB
 K DIAXE01,A1,B1,D1 Q
EN(W,Z) S @Z=1
 S DIC="^DD("_+W_",",X=.01,DIC(0)="Z",DIAXEF=$O(^DD(+W,0,"NM","")) D ^DIC I Y'>0 Q
 D EN1^DIAXM
 Q
TYP(%) N W,W1,W2,X,Y
 S W="NPSVWCDFK",W1=%
 F X=1:1:$L(W) S W2=$F(W1,$E(W,X)) Q:W2
 S Y=$E(W1,W2-1)
 S:Y="" Y="F"
 Q Y

DIAXP
DIAXP ;SFISC/DCM-EXCEPTION REPORT ;5/16/96  10:56
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 N PAGE,LINE,DIAXX,FILE,FNAME,Y,DATE,DIRUT,Z
 S PAGE=0,LINE="",DIAXX=^DIAR(1.11,DIARC,0),FILE=$P(DIAXX,U,2),FNAME=$P($G(^DIC(FILE,0)),U)
 S Y=DT X ^DD("DD") S DATE=Y
 D HDR,BODY,END
 Q
 ;
C I IOST["C-" N DIR S DIR(0)="E" D ^DIR Q:$D(DIRUT)
 ;
HDR W:$Y @IOF W !,"EXTRACT ACTIVITY EXCEPTION REPORT",?IOM-24,DATE,?IOM-10,"PAGE: ",PAGE+1
 S PAGE=PAGE+1,$P(LINE,"-",IOM)="" W !,LINE
 Q
 ;
BODY W !!,"EXTRACT ACTIVITY: ",DIARC,?31,"ARCHIVER: ",$P($G(^VA(200,$P(DIAXX,U,6),0)),U)
 W !!,"THE FOLLOWING RECORDS IN THE '"_FNAME_"' FILE WERE NOT PROCESSED BY THE",!,"EXTRACT TOOL"
 N REC,LINE,ERR S REC=0 D REC Q:$D(DIRUT)
 W !!,"*** PLEASE KEEP THIS FOR FUTURE REFERENCE ***"
 Q
REC S LINE="Entry # "
 S REC=$O(^TMP("DIAXU",$J,"RESULT","ERR",FILE,REC)) Q:'REC  S ERR=^(REC)
 S LINE=LINE_+REC_" was NOT processed because:"
 D C:($Y+3>IOSL) Q:$D(DIRUT)
 W !!,LINE N A,B S A=1 D ERR
 G REC
ERR S B=$P(ERR,";",A) Q:B=""  S A=A+1
 N Z S Z=0
 F  S Z=$O(^TMP("DIERR",$J,+B,"TEXT",Z)) Q:'Z  D C:($Y+1>IOSL) Q:$D(DIRUT)  W !?2,$G(^(Z))
 G ERR
 ;
END I $E(IOST)'="C",$Y W @IOF
 D ^%ZISC
 K ^TMP("DIAXU",$J),^TMP("DIERR",$J)
 Q

DIAXT
DIAXT ;SFISC/DCM-GET EXTRACT TEMPLATE SPECS ;5/13/96  14:01
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN N DIAXI,DILL,DIAX
 S DIAXTTO="^TMP($J,""DIAXTTO"")",DIAXTFR="^TMP($J,""DIAXTFR"")"
 K @DIAXTTO,@DIAXTFR
 D SPEC
 Q
SPEC ;get specs
 D TOP,DR
 D NEXTLVL
 Q
TOP ;get base file specs from extract template
 N X
 S DIAXI=0
 S DIAXI=$O(^DIPT(DIAXT,1,DIAXI)) Q:DIAXI'>0  S X=^(DIAXI,0)
 S DILL=$P(X,U,2)
FILE S @DIAXTFR@(DIAXI,"FR")=+X
 S @DIAXTFR@(+X,"TO")=$P(X,U,9)
 S @DIAXTFR@(+X,"PRT")=$P(X,U,3)
 S @DIAXTFR@(+X,"P4")=$P(X,U,4)
 S @DIAXTFR@(+X,"P2")=$P(X,U,2)
 S @DIAXTFR@(+X,"P5")=$P(X,U,5)
 S @DIAXTFR@(+X,"P7")=$P(X,U,7)
 I DILL>1,$P(X,U,9)'=$P(X,U,10) S @DIAXTTO@(+$P(X,U,9),"PRT")=+$P(X,U,10)
 Q
DR ;get fields
 N DR,DRN,DRX,DRZ,FILE
 S DR="",DRN=1,DRZ=0,FILE=@DIAXTFR@(DILL,"FR")
 F  S DRZ=$O(^DIPT(DIAXT,1,DIAXI,"F",DRZ)) Q:'DRZ  I $D(^(DRZ,0)) S DRX=^(0) D
 . S DR=DR_+DRX_";",FILE=@DIAXTFR@(DIAXI,"FR")
 . S @DIAXTTO@(FILE,+DRX,+$P(DRX,U,5))=@DIAXTFR@(FILE,"TO")_U_$P(DRX,U,3)_U_$P(DRX,U,5)
 . I $L(DR)>245 S @DIAXTFR@(FILE,"DR",DRN)=DR,DRN=DRN+1,DR=""
 S:DR]"" @DIAXTFR@(FILE,"DR",DRN)=DR
 Q
NEXTLVL ;
 S DIAX(DILL,"DIAXI")=DIAXI,DILL=DILL+1
 F DIAXI=DIAXI:0 S DIAXI=$O(^DIPT(DIAXT,1,DIAXI)) Q:DIAXI'=+DIAXI  S X=^(DIAXI,0) D NEXTLVL2 Q:DIAXI=""
 S DILL=DILL-1,DIAXI=DIAX(DILL,"DIAXI")
 Q
NEXTLVL2 ;
 I $P(X,U,2)<DILL S DIAXI="" Q
 Q:$P(X,U,3)'=@DIAXTFR@(DIAX(DILL-1,"DIAXI"),"FR")
 D FILE
 D DR
 D RECURSE
 Q
RECURSE ;
 D NEXTLVL
 Q

DIAXU
DIAXU ;SFISC/DCM-UPDATE DESTINATION FILE ;8/16/96  16:42
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
DIAX ;called from ^DIAX (Update Destination File option)
DQ ;
 I $D(ZTQUEUED) N DIAR,DIAX S ZTREQ="@",DIAR=6,DIAX=1 D MRK^DIARU
 N DIAXF,DIAXFRT S DIAXF=$P(^DIAR(1.11,DIARC,0),U,2),DIAXFRT=$$ROOT^DILFD(DIAXF)
 D EXTRACT(DIAXF,DIARB,DIARP)
 D UPDATE^DIARU
 I $D(ZTQUEUED),$G(DIERR) S ZTIO=DIAXIOP,ZTRTN="XREP^DIAXU",ZTDESC="EXTRACT TOOL EXCEPTION REPORT",ZTSAVE("^TMP(""DIAXU"",$J)")="",ZTSAVE("^TMP(""DIERR"",$J)")="",ZTSAVE("DIARC")="" D ^%ZTLOAD Q 
XREP ;
 I $D(ZTQUEUED) S ZTREQ="@"
 D ^DIAXP
 Q
EN ; obsolete, replaced by EXTRACT
 N %,DIAXERR S DIAXERR=""
 D CLEAN^DIEFU
 F %=$G(DIAXF)_U_"DIAXF",$G(DIAXFE)_U_"DIAXFE",$G(DIAXT)_U_"DIAXT" I $P(%,U,1)']"" D ERR(201,$P(%,U,2))
 Q:$G(DIERR)
 D EXTRACT(DIAXF,DIAXFE,DIAXT,$S($D(DIAXDEL):"D",1:""))
 I '$G(DIERR),$D(^TMP("DIAXU",$J,"RESULT",DIAXF,DIAXFE)) S DIAXDA=^(DIAXFE)
 Q
 ;
DIPT N X,D,SCR,DIARP,DIAR,DIPG
 S X=$S(DIAXT:DIAXT,1:$P($P(DIAXT,"[",2),"]")),D="F"_DIAXF,SCR="I $P(^(0),U,8)=2"
 S DIARP=$$FIND1^DIC(.4,"","XA",X,D,SCR,DIAXERR)
 Q:$G(DIERR)  I 'DIARP D ERR(202,"EXTRACT TEMPLATE") Q
 S DIAR=6,DIPG=1,DIAXT=DIARP,DIAXDF=$P(^DIPT(DIAXT,0),U,9),DIAXDFRT=$$ROOT^DILFD(DIAXDF)
 D EN^DIAXM
 Q
DIK N DIK,DA
 S DIK=$$ROOT^DILFD(DIAXF),DA=DIAXFE
 D ^DIK
 Q
K K @DIAXTFR,@DIAXTTO
 Q
ONE I '$$VENTRY^DIEFU(DIAXF,DIAXFE) D ERR(601,DIAXFE),STE() Q
 D ^DIAXD I $G(DIERR) D:$D(DIAXFILE)  D STE() Q
 . N DIERR,A S A("IEN")=DIAXFE
 . D BLD^DIALOG(1300,"",.A)
 D ^DIAXF I $G(DIERR) D STE() Q
 Q:$D(DIAX)
 I $G(DIAXFLGS)["D" D DIK
 I $G(DIAXDA) S @DIAXRSLT@("RESULT",DIAXF,DIAXFE)=DIAXDA
 Q
 ;
DIBT N SCR,D
 S D="F"_DIAXF,SCR="I $P(^(0),U,4)="_DIAXF_",'$P(^(0),U,8)"
 S DIAXST=$S($G(DIAXST):DIAXST,1:$$FIND1^DIC(.401,"","AX",DIAXST,D,SCR,DIAXERR))
 I 'DIAXST!('$D(^DIBT(DIAXST,1))) D ERR(202,"SEARCH TEMPLATE") S:$G(DIAR) DIAR="" Q
 N Z S Z=0 F  S Z=$O(^DIBT(DIAXST,1,Z)) Q:Z'>0  D
 . N DIAXDA,DIAXFE,DIERR
 . S DIAXFE=Z
 . D ONE
 . Q:$G(DIERR)
 . I $G(DIAX) D  Q
 . . N FDA,IEN
 . . S FDA(1.14,"+"_+DIAXFE_","_DIARC_",",.01)=DIAXDA,IEN(DIAXFE)=DIAXDA
 . . D UPDATE^DIE("","FDA","IEN")
 . . S @(DIAXFRT_"DIAXFE,-9)")=DIARC
 . I $G(DIAXFLGS)["D" K ^DIBT(DIAXST,1,DIAXFE)
 Q
STE(FI,IEN) N Z
 S:$G(FI)="" FI=DIAXF
 S:$G(IEN)="" IEN=DIAXFE
 S DIERRZ=(DIERR+DIERRZ)_U_($P(DIERR,U,2)+($P(DIERRZ,U,2)))
 F DIERRLST=DIERRLST:1:$O(^TMP("DIERR",$J,"E"),-1) S Z=DIERRLST_";"
 S @DIAXRSLT@("RESULT","ERR",FI,IEN)=Z
 Q
ERR(DIAXER,DIAXTXT) ;
 D BLD^DIALOG(DIAXER,DIAXTXT,"",DIAXERR,"F")
 Q
EXTRACT(DIAXF,DIAXSRCE,DIAXT,DIAXFLGS,DIAXSCR,DIAXFILE,DIAXRSLT,DIAXERRA) ;
 N DIAXST,DIAXFE,T,DIFM,DIOVRD,DIERRLST,DIAXTFR,DIAXTTO,DIAXDF,DIAXDFRT,DIAXERR,DIERRZ,DIAXDA
 S DIAXRSLT=$S($G(DIAXRSLT)]"":DIAXRSLT,1:"^TMP(""DIAXU"",$J)"),(DIFM,DIOVRD)=1,(DIERRLST,DIERRZ)=0,DIAXERR=""
 K ^TMP("DIAXU",$J),^TMP("DIAX",$J),^TMP($J) D CLEAN^DIEFU
 I '$G(DIAR) D  Q:$G(DIERR)
 . N %,PARAM F %=1:1:3 S PARAM=$S(%=1:$G(DIAXF)_U_"FILE",%=2:$G(DIAXSRCE)_U_"SOURCE",1:$G(DIAXT)_U_"EXTRACT TEMPLATE") I $P(PARAM,U)']"" D ERR(202,$P(PARAM,U,2))
 . Q:$G(DIERR)
 . I '$$VFILE^DIEFU(DIAXF) D ERR(202,"FILE") Q
 . I $G(DIAXSRCE) S DIAXFE=+DIAXSRCE,T="ONE"
 . I $E(DIAXSRCE)="[" S DIAXST=$P($P(DIAXSRCE,"[",2),"]"),T="DIBT"
 . D DIPT
 . Q
 E  S T="DIBT",DIAXST=DIAXSRCE
 D ^DIAXT I $G(DIERR) S:$G(DIAR) DIAR="" Q
 D @T,K
 I $G(DIERRZ) S DIERR=DIERRZ
 I $G(DIERR),$G(DIAXERRA)]"" M @DIAXERRA@("DIERR")=^TMP("DIERR",$J) K ^TMP("DIERR",$J)
 Q

DIAXU1
DIAXU1 ;SFISC/DCM-UPDATE DESTINATION FILE (CONT) ;3/5/93  2:34 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START K DIC,DO,DA,DR,DD,X
 D SETVAR,PROCESS,EOJ
 Q
 ;
SETVAR S DIAXFILE=DIAXET(DILL,"FILE")
 S DIAXMODE=$P(^TMP("DIAX",$J,DIAXFILE,"MODE"),U)
 I $D(^TMP("DIAX",$J,DIAXFILE,"X")) S X=^("X")
 I $D(^TMP("DIAX",$J,DIAXFILE,"DA(1)")) F DIAXII=1:1 Q:'$D(^("DA("_DIAXII_")"))  S @("DA("_DIAXII_")="_^("DA("_DIAXII_")"))
 I $D(^TMP("DIAX",$J,DIAXFILE,"DIC(""P"")")) S DIC("P")=^("DIC(""P"")")
 Q
 ;
PROCESS I DIAXMODE="A" S DIC=^TMP("DIAX",$J,DIAXFILE,"GL") D CALLDIC^DIAXU2 Q:$D(DIAXMSG)  S DIAXAVAL=+Y D ADDCONT Q
 D BUILDDR
 S DIE=^TMP("DIAX",$J,DIAXFILE,"GL"),@("DA="_^("DA")) I $G(DR)]"" D CALLDIE^DIAXU2 Q:$D(DIAXMSG)
 I $D(^TMP("DIAX",$J,DIAXFILE,"WP")) D WP^DIAXU2
 Q
 ;
ADDCONT S DA=DIAXAVAL,DIE=DIC
 I $D(^TMP("DIAX",$J,DIAXFILE,"WP")) D WP^DIAXU2
 D BUILDDR
 I $G(DR)]"" D CALLDIE^DIAXU2 Q:$D(DIAXMSG)
 D DA
 Q
 ;
BUILDDR I $D(^TMP("DIAX",$J,DIAXFILE,"DR")) S DR=^("DR")
 I $D(^TMP("DIAX",$J,DIAXFILE,"DR"))=11 S DIAXZRO=0 F DIAXL=0:0 S DIAXZRO=$O(^TMP("DIAX",$J,DIAXFILE,"DR",DIAXZRO)) Q:'DIAXZRO  S DR(1,DIAXFILE,DIAXZRO)=^(DIAXZRO)
 Q
 ;
DA S (DIAXET(DIAXFILE,"DA"),^TMP("DIAX",$J,DIAXFILE,"DA"))=DIAXAVAL
 S DIAXX=$G(DIAXET(DIAXFILE)) I DIAXX=""!(DIAXFILE=DIAXX) Q
 I $D(DIAXET(DIAXX,"DA")) S DIAXET(DIAXFILE,"DA(1)")=DIAXET(DIAXX,"DA")
 I $D(DIAXET(DIAXX,"DA(1)")) F DIAXII=1:1 Q:'$D(DIAXET(DIAXX,"DA("_DIAXII_")"))  S DIAXET(DIAXFILE,"DA("_(DIAXII+1)_")")=DIAXET(DIAXX,"DA("_DIAXII_")")
 Q
 ;
EOJ K DIC,DIE,DIK,DA,DR,DIAXAVAL,X,Y
 K:$D(DIAXMSG) ^TMP("DIAX",$J)
 K ^TMP("DIAX",$J,DIAXFILE,"DR"),^("WP")
 K DIAXII,DIAXFILE,DIAXMODE,DIAXDRVL,DIAXZRO,DIAXX,DIAXL,DIAX("FIELD")
 Q

DIAXU2
DIAXU2 ;SFISC/DCM-UPDATE DESTINATION FILE (CONT) ;10/13/94  10:01 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CALLDIC S DIADD=1,DIC(0)="FLI",DLAYGO=DIAXFILE
 D ^DIC I Y<1 D ERR^DIAXERR(99,DIAXFN_U_DIAXFE_U_DIAX(1,.01)) D FIX
 K DLAYGO,DR,DINUM,DIADD,X
 Q
 ;
CALLDIE ;I DR[".01///"&($P(^DD(DIAXFILE,.01,0),U,5,99)["DINUM"!$D(^TMP("DIAX",$J,DIAXFILE,"DINUM"))) S DIAXDRVL=$P($P(DR,".01///",2),";"),DR=$P(DR,".01///"_DIAXDRVL)_$P(DR,".01///"_DIAXDRVL_";",2)
 D ^DIE I $D(Y) D ERR^DIAXERR(98,DIAXFN_U_DIAXFE_U_DIAX(1,.01)) D FIX
 Q
 ;
WP S DIAX("FIELD")=0
 ;
WP1 S DIAX("FIELD")=$O(^TMP("DIAX",$J,DIAXFILE,"WP",DIAX("FIELD"))) Q:DIAX("FIELD")'>0
 S DKP=0
 F A9="DTL","DTO(1)","DFL","DFR(1)" S @A9=^TMP("DIAX",$J,DIAXFILE,DIAX("FIELD"),A9)
 S DTO(1)=DTO(1)_DIAXAVAL_","""_$P($P(^DD(DIAXET(DILL,"FILE"),DIAX("FIELD"),0),U,4),";")_""","
 D WORD^DITR1
 K DFR,DKP,DTO,V,A9,DFL,DTL
 G WP1
 ;
FIX I $G(^TMP("DIAX",$J,DIAXFNO,"DA")) S DA=^("DA"),DIK=^("GL") D ^DIK
 Q:DIPG
 S $P(^(0),U,7)=$P(^DIAR(1.11,DIARC,0),U,7)-1
 S:$G(DIOEND)'["DIAXU3" DIOEND=DIOEND_" D ^DIAXU3"
 K ^DIBT(DIARU,1,DIAXFE),@(DIAXF_DIAXFE_",-9)")
 Q

DIAXU3
DIAXU3 ;SFISC/DCM-EXCEPTION REPORT ;6/9/93  3:55 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 S DIPAGE=0,DIAXLINE="",DIAXX=^DIAR(1.11,DIARC,0),DIAXZ1=$P(DIAXX,U,2),DIAXZ2=$P($G(^DIC(DIAXZ1,0)),U),DIAXZ=0
 S Y=DT X ^DD("DD") S DIAXY=Y
 D HDR,BODY,END
 Q
 ;
HDR W:$Y @IOF W !,"ARCHIVAL ACTIVITY EXCEPTION REPORT",?IOM-24,DIAXY,?IOM-10,"PAGE: ",DIPAGE+1
 S DIPAGE=DIPAGE+1,$P(DIAXLINE,"-",IOM)="" W !,DIAXLINE
 Q
 ;
BODY W !!,"ARCHIVAL ACTIVITY: ",DIARC,?31,"ARCHIVER: ",$P($G(^VA(200,$P(DIAXX,U,6),0)),U)
 W !!,"THE FOLLOWING RECORDS IN THE '"_DIAXZ2_"' FILE WERE NOT MOVED BY THE EXTRACT TOOL"
 W !!?3,"INTERNAL",?16,$P(^DD(DIAXZ1,.01,0),U),!,"ENTRY NUMBER",!
 F  S DIAXZ=$O(^TMP("DIERR",$J,DIAXZ)) Q:DIAXZ'>0  W !,?5,$G(^(DIAXZ,"PARAM",2,0)),?16,$E($G(^TMP("DIERR",$J,DIAXZ,"PARAM",3,0)),1,50)
 W !!,"*** PLEASE KEEP THIS FOR FUTURE REFERENCE ***"
 Q
 ;
END I $E(IOST)'="C",$Y W @IOF
 D ^%ZISC
 K ^TMP("DIERR",$J),DIAXY,DIAXLINE,DIPAGE,DIAXX,DIAXZ,DIAXZZ,DIR,DIRUT,DTOUT,DUOUT,DIAXZ1,DIAXZ2
 Q
 ;
HDRC Q:($Y+1<IOSL)
 I "C"[$E(IOST) K DIR S DIR(0)="E" D ^DIR Q:$D(DTOUT)!($D(DIRUT))
 D HDR
 Q
 ;

DIB
DIB ;SFISC/GFT,XAK-CREATE A NEW FILE ;9JUN2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 W !! K DLAYGO,DTOUT D W^DICRW G Q:$D(DTOUT) K DICS,DIA Q:Y<0
1 I '$D(@(DIC_"0)")) W !!,$C(7),"DATA GLOBAL DOES NOT EXIST!" K DIC Q
 I $P($G(^DD(+$P(@(DIC_"0)"),U,2),0,"DI")),U,2)["Y" W !!,$C(7),"RESTRICTED"_$S($P(^("DI"),U)["Y":" (ARCHIVE)",1:"")_" FILE - NO EDITING ALLOWED!" Q
 S:$D(@(DIC_"0)")) DIA=DIC,X=^(0),(DI,J(0),DIA("P"))=+$P(X,U,2)
 D QQ S DR="",(L,DRS,DIAP,DB,DSC)=0,F=-1,I(0)=DIA,DXS=1
 D EN^DIA:$O(^DD(DI,.01))>0 I $D(DR) G ^DIA2
Q K DI,DLAYGO,DIA,I,J
QQ K ^UTILITY($J),DIAT,DIAB,DIZ,DIAO,DIAP,DIAA,IOP,DSC,DHIT,DRS,DIE,DR,DA,DG,DIC,F,DP,DQ,DV,DB,DW,D,X,Y,L,DIZZ Q
 ;
DIE ;
 S F=+Y,(DG,X)="^DIZ("_F_","
 I DUZ(0)="@" W !!,"INTERNAL GLOBAL REFERENCE: "_DG R "// ",X:DTIME S:'$T X="^" S:X="" X=DG I X?."?" W !,"TYPE A GLOBAL NAME, LIKE '^GLOBAL(' OR '^GLOBAL(4,'",!,"OR JUST HIT 'RETURN' TO STORE DATA IN '"_DG_"'" G DIE
 ;
 I X?1"^".E S X=$P(X,U,2,9) I X?.P G ABORT
 I X?1.AN W $C(7)_"  ??" G DIE
 ;
 S DG=X
 D VALROOT(.X,.%)
 I %'=1 G DIE:DUZ(0)="@"&(DG'=X),ABORT
 ;
 W !
 W:DG'=X !?2,"Global reference selected: ^"_X,!
 S DG=U_X
 ;
SET D WAIT^DICD S $P(^DIC(F,0),U,2)=F,^("%A")=DUZ_U_DT,X=$P(^(0),U,1),^(0,"GL")=DG
 I DUZ(0)]"" F %="DD","DEL","RD","WR","LAYGO","AUDIT" S ^DIC(F,0,%)=DUZ(0)
 I DUZ(0)'="@",$S($D(^VA(200,"AFOF")):1,1:$D(^DIC(3,"AFOF"))) D SET1
 S %="" I @("$D("_DG_"0))") S %=^(0)
 S @(DG_"0)=X_U_F_U_$P(%,U,3,9)")
 K ^DD(F) S ^(F,0)="FIELD^^.01^1",^DD(F,.01,0)="NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X"
 S ^(3)="NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION" W !?5,"A FreeText NAME Field (#.01) has been created."
 S DA="B",^DD(F,.01,1,0)="^.1",^(1,0)=F_U_DA,X=DG_""""_DA_""",$E(X,1,30),DA)",^(1)="S "_X_"=""""",^(2)="K "_X
 S DIK="^DIC(",DA=F D IX1^DIK
 S DLAYGO=F,DIK="^DD(DLAYGO,",DA=.01,DA(1)=DLAYGO G IX1^DIK
 ;
ABORT ;Delete file and abort
 W !!?9,$C(7)_"No new file created!"
 S DIK="^DIC(",DA=F
 K DG
 G ^DIK
 ;
VALROOT(X,%) ;Validate the root in X
 ;Returns:
 ;  X = open root
 ;  % = 0 : invalid root
 ;      1 : valid root
 ;
 N CREF,FNUM,N,OREF,PROMPT,QLEN,ROOT
 ;
 S (OREF,X)=$$OREF^DILF(X)
 S:$E(OREF)=U OREF=$E(OREF,2,999)
 ;
 ;Check syntax
 I OREF?1(1A,1"%").AN1"("
 E  I OREF?1(1A,1"%").AN1"("1.E1","
 E  I OREF?1"["1.E1"]"1(1A,1"%").AN1"("
 E  I OREF?1"["1.E1"]"1(1A,1"%").AN1"("1.E1","
 E  I OREF?1"|"1.E1"|"1(1A,1"%").AN1"("
 E  I OREF?1"|"1.E1"|"1(1A,1"%").AN1"("1.E1","
 E  W $C(7)_"  ?? Bad syntax" S %=0 Q
 ;
 S CREF=U_$$CREF^DILF(OREF)
 ;
 ;Check whether files stored in ancestors
 S %=1
 S QLEN=$QL($NA(@CREF))
 F N=QLEN:-1:0 D  Q:'%
 . S ROOT=$NA(@CREF,N)
 . Q:ROOT="^DIC"&(N'=QLEN)
 . S FNUM=+$P($P($G(@ROOT@(0)),U,2),"E")
 . I FNUM D  Q:'%
 .. S OROOT=$$OREF^DILF(ROOT)
 .. I $G(^DIC(FNUM,0,"GL"))=OROOT D
 ... W !!,$C(7)_"  ERROR -- "_OROOT_" already used by File #"_FNUM_"!"
 ... S %=0
 . I N=QLEN,$O(@CREF@(0))]"" D
 .. W !,$C(7)
 .. S PROMPT=" -- ^"_OREF_" already exists!"
 .. I DUZ(0)'="@" S %=0 W !,"  ERROR"_PROMPT
 .. E  D YN("  WARNING"_PROMPT_"  --OK",.%)
 Q
 ;
YN(PROMPT,%) ;Prompt yes/no
 N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
 S DIR(0)="Y"
 S:$G(PROMPT)]"" DIR("A")=PROMPT
 S DIR("B")="No"
 D ^DIR
 S %=Y=1
 Q
 ;
EN ; Enter here when the user is allowed to select his fields
 S DIC=DIE S:DIC DIC=$S($D(^DIC(DIC,0,"GL")):^("GL"),1:"")
 D 1:DIC]"" K DIC Q
 ;
SET1 ;
 I $D(^VA(200,"AFOF")) S:'$D(^VA(200,DUZ,"FOF",0)) ^(0)="^200.032PA^"_+F_"^1" S ^(+F,0)=F_"^1^1^1^1^1^1"
 I $D(^DIC(3,"AFOF")) S:'$D(^DIC(3,DUZ,"FOF",0)) ^(0)="^3.032PA^"_+F_"^1" S ^(+F,0)=F_"^1^1^1^1^1^1"
 S DIK=$S($D(^VA(200)):"^VA(200,DUZ,""FOF"",",1:"^DIC(3,DUZ,""FOF"","),DA=F,DA(1)=DUZ D IX1^DIK
 Q

DIBT
DIBT ;SFISC/GFT,TKW,TOAD-STORE A SORT TEMPLATE ;29JUNE2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MENU ;
0 ; select and edit templates, until user quits
 S DIC="^DOPT(""DIBT"",",DICF=DI
 I '$D(^DOPT("DIBT",.402)) S ^(0)="TEMPLATE FILE^1.01" K ^("B") D
 .F X=.4,.401,.402 S ^DOPT("DIBT",X,0)=$P(^DIC(X,0),U)
 .N DIK S DIK=DIC D IXALL^DIK
 S DIC(0)="QEAIN",DIC("A")="Select TEMPLATE File: "
 S DIC("S")="I Y=.4!(Y=.401)!(Y=.402)"
 D ^DIC K DIC Q:Y<0
 K DTOUT F  Q:'$$T(+Y,DICF)  I $D(DTOUT) K DTOUT Q
 Q
 ;
T(DDSFILE,DICF) ;=.4,.401,.402
 N Y,DIC,DIERR,DDSPARM,DR,DA,DIN
 W !! S DIC=DDSFILE,DIC("S")="I $P(^(0),U,4)="_DICF_",Y'<1",D="F"_DICF
 S DIC(0)="AEQI" D IX^DIC I Y<0 Q 0
 S DA=+Y,DIN=$$SCREEN G SCROLL:DIN=0 I 'DIN Q 0
 S DIN=$S(DDSFILE=.4:"DIPTED",DDSFILE=.402:"DIETED",1:"DIBTED")
 S DR="["_DIN_"]",DDSPARM="" D ^DDS Q '$D(DIERR)
 ;
SCROLL N DIE,DIOVRD,DR
 S DIE=DDSFILE,DR=".01:3;5:7;10;707;491620",DIOVRD=1 D ^DIE Q 1
 ;
SCREEN(HELP) ;
 N DIR,DIRUT,DUOUT,X,Y,DIERR
 K DUZ("SCREEN") ;COMMENT OUT THIS LINE IF YOU WANT FILEMAN TO REMEMBER!
 I $G(DUZ("SCREEN"))=0 Q 0
 D SET^DDGLIB0 I $D(DIERR) Q 0
 I '$G(DUZ("SCREEN")) D  I '$D(DUZ("SCREEN")) Q U  ;ABORT
 .S DIR(0)="Y",DIR("A")="Do you want to use the screen-mode version",DIR("B")="YES"
 .I $D(HELP) S DIR("?")=HELP
 .D ^DIR I Y-1 S:Y=0 DUZ("SCREEN")=0 Q
 .S DUZ("SCREEN")=1
 D KILL^DDGLIB0()
 ;I ^DD("OS")=9 U $I:VT=1 ;FOR DATATREE
 Q +$G(DUZ("SCREEN"))
 ;
S ;
 D S1^DIBT1 K DIRUT,DIROUT G Q^DIP:$D(DUOUT)!($D(DTOUT))
 G N:X="",S:Y<0
 S DIBT1=+Y
SNEW K ^DIBT(DIBT1,2),^("BY0"),^("BY0D") S $P(^DIBT(DIBT1,0),U,7)=DT
 I $G(BY(0))]"",$D(DPP(0)) D
 . N DIBY,DIREC,%,I,D,F,T,Q1,Q2,O S %=DIBT1_"," S DIBY(.401,%,1622)=$P(BY(0),U,2),DIBY(.401,%,1623)=DPP(0)+1 D FILE^DIE("E","DIBY")
 . F I=1:1:DPP(0) D
 .. S F=$P($G(DPP(I,"F")),U,2),T=$P($G(DPP(I,"T")),U,2),O=$P($G(DPP(I)),U,4),Q1="" S:O["!" Q1=Q1_"!" S:O["#" Q1=Q1_"#" S Q2=$P($G(DPP(I)),U,5),O=$G(DPP(I,"OUT"))
 .. S %="+"_I_","_DIBT1_"," K DIBY(.4011624,%)
 .. S:F]"" DIBY(.4011624,%,1)=F S:T]"" DIBY(.4011624,%,2)=T S:Q1]"" DIBY(.4011624,%,3.1)=Q1 S:Q2]"" DIBY(.4011624,%,3.2)=Q2 S:O]"" DIBY(.4011624,%,4)=O
 .. Q:'$D(DIBY(.4011624,%))  S DIBY(.4011624,%,.01)=I,DIREC(I)=I Q
 . D UPDATE^DIE("E","DIBY","DIREC")
 . Q
 S (DIBT2,DIBT3)=+$G(DPP(0)) F  S DIBT3=$O(DPP(DIBT3)) Q:'DIBT3  S DIBT2=DIBT2+1 D
 .N DIC,DA,DIE,DINUM,DIOVRD,DR,DO S X=$P(DPP(DIBT3),U) Q:+$P(X,"E")'=X  S DIC="^DIBT("_DIBT1_",2,",DIC(0)="L",DA(1)=DIBT1,DINUM=DIBT2,DIOVRD=1,DIC("P")=$P(^DD(.401,1621,0),U,2) D FILE^DICN K DIC,DA,DINUM,DIOVRD
 .N A,B,C,D S $P(^DIBT(DIBT1,2,DIBT2,0),U,2,10)=$P(DPP(DIBT3),U,2,10)
EGP .I $D(DPP(DIBT3,"LANG"))=11 S $P(^(0),U,3)=DPP(DIBT3,"LANG") ;**CCO/NI PUT THE CORRECT NAME INTO STORED TEMPLATE
 .S A="A" F  S A=$O(DPP(DIBT3,A)) Q:A=""  S %=$G(DPP(DIBT3,A)) I %]"",(A'="TXT")!($G(DUZ("LANG"))'>1) S ^DIBT(DIBT1,2,DIBT2,A)=% ;**CCO/NI DON'T SAVE FURRIN-LANGUAGE 'TEXT'
 .S (C,D)=0 F A=-1:0 S A=$O(DPP(DIBT3,A)) Q:+$P(A,"E")'=A  D
 ..I $G(DPP(DIBT3,A))]"" S C=C+1,%=1,%(1)=17,X=A,DINUM=C,DIC("DR")="1////"_DPP(DIBT3,A) D DICM
 ..S B="" F  S B=$O(DPP(DIBT3,A,B)) Q:B=""  S D=D+1,%=2,%(1)=18,X=A,DINUM=D D DICM S:Y>0 ^DIBT(DIBT1,2,DIBT2,2,+Y,"RCOD")=$P(DPP(DIBT3,A,B),U,4,99)
 ..Q
 .S D=0,A="OV" F  S A=$O(DPP(DIBT3,A)) Q:$E(A,1,2)'="OV"  S B="" F  S B=$O(DPP(DIBT3,A,B)) Q:B=""  S C=$G(DPP(DIBT3,A,B)) I C]"" S D=D+1,%=3,%(1)=19,X=A,DINUM=D D DICM I Y>0 S $P(^DIBT(DIBT1,2,DIBT2,3,+Y,0),U,2)=B,^("OVF0")=C
 .Q
 I $D(DIBTOLD) K DIBTOLD D K Q
 S DIBT2=+$G(DPP(0))
S0 S DIBT2=DIBT2+1 G N:DIBT2>DPP,S0:'$D(DPP(DIBT2,"F")),S0:$P(DPP(DIBT2),U,4)["B"
 S DIR("?",1)="Answer YES if you want the to allow the user to specify beginning and",DIR("?")="ending sort values when the print job is run."
 W ! S DIR("A")="SHOULD TEMPLATE USER BE ASKED 'FROM'-'TO' RANGE FOR '"_$P(DPP(DIBT2),U,3)_"'",DIR("B")="NO",DIR(0)="Y" D ^DIR K DIR I $D(DIRUT) D K G Q^DIP
 G:Y=0 S0
S1 S ^DIBT(DIBT1,2,DIBT2,"ASK")=1
 G S0
 ;
DICM S DIC="^DIBT("_DIBT1_",2,"_DIBT2_","_%_",",DA(2)=DIBT1,DA(1)=DIBT2,DIC(0)="L",DIOVRD=1,DIC("P")=$P(^DD(.4014,%(1),0),U,2)
 N C,D
 I %(1)=18 S DIC("DR")="1////"_B F C=1,2,3 S D=$P(DPP(DIBT3,A,B),U,C) I D]"" S DIC("DR")=DIC("DR")_";"_(C+1)_"////"_D
 N A,B,DD,DO D FILE^DICN K DIC,DA,DINUM,DIOVRD Q
 ;
US S $P(^DIBT(DIBT1,0),U,7)=DT I '$O(^DIBT(+$G(DIBT1),2,0)) Q
 N % F X=+$G(DPP(0)):0 S X=$O(DPP(X)) Q:'X  D
 . F %="F","T","SER","TXT","IX","PTRIX","QCON","SRTTXT" K ^DIBT(DIBT1,2,X,%) I $G(DPP(X,%))]"" S:%'="SER" ^DIBT(DIBT1,2,X,%)=DPP(X,%)
 . Q
 Q
 ;
K K DIEDT,DIBT2,DIBT3 Q
N D K G N^DIP1

DIBT1
DIBT1 ;SFISC/GFT,TKW-STORE A SORT TEMPLATE ;8/2/94  15:57
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
S1 K DIR S DIR(0)="O",DIR("A")="STORE IN 'SORT' TEMPLATE",DIR("?")="^D H1^DIBT1"
 D SAV Q:$D(DIRUT)  D DIC Q
 ;
S2 K DIR S DIR(0)="O",DIR("A")="STORE THESE ENTRY ID'S IN TEMPLATE",DIR("?")="^D H2^DIBT1"
 D SAV Q:$D(DIRUT)  D MRG Q
 ;
S3 K DIR S DIR(0)="O",DIR("A")="STORE RESULTS OF SEARCH IN TEMPLATE",DIR("?")="^D H3^DIBT1"
 S:$D(DIAR) DIR(0)=""
 D SAV Q:$D(DIRUT)  D MRG Q
 ;
SAV S DIR(0)="F"_DIR(0)_"^1,30"
 D ^DIR K DIR Q:$D(DIRUT)
 I $E(X)="[" S X=$P($E(X,2,99),"]",1)
 Q
H1 N A,B S A="sort criteria",B="SORT" D H,DIC Q
H2 N A,B S A="list of entries",B="SEARCH/SORT" D H,MRG Q
H3 N A,B S A="list of entries from the search",B="SEARCH/SORT"
 W:$D(DIAR) !!,"You must store the results in a template.",!,"Otherwise you will have to rerun this search to archive the entries."
 D H,MRG Q
H W !!,"If you wish to save this "_A_" for later re-use",!,"enter the name of a "_B_" TEMPLATE here (1-30 characters)." Q
MRG ;
 S DIBT1=1
DIC K DIC S DIC="^DIBT(",DLAYGO=0,DIC(0)="QELSZ",DIOVRD=1,DIC("S")="I "_$S($D(DIAR)&('$D(DIARI)):"",1:"'")_"$P(^(0),U,8)"
 S DIC("S")=DIC("S")_",$P(^(0),U,4)=DK,$P(^(0),U,5)=DUZ!'$P(^(0),U,5)!$D(DIEDT)",D="F"_DK
 D IX^DIC S DIBTY=Y K DIC,DLAYGO,DIEDT,DIOVRD G QDIC:Y'>0
 N X,DIBTSEC S DIBTSEC="" I $O(^DIBT(+Y,0))]"" S DIBTSEC=Y(0) D ALR
 I $D(DIRUT)!(Y'>0) G QDIC
 D NOW^%DTC
 S ^DIBT("F"_DK,$P(Y,U,2),+Y)=1,^DIBT(+Y,0)=$P(Y,U,2)_U_+$J(%,0,4)_U_$S(DIBTSEC]"":$P(DIBTSEC,U,3),1:DUZ(0))_U_DK_U_DUZ_U_$S(DIBTSEC]"":$P(DIBTSEC,U,6),1:DUZ(0)) I $D(DIAR),'$D(DIARI) S $P(^(0),U,8)=1
 K DIBTSEC N DIE,DA,DI,DK,DR,Y S DIE="^DIBT(",DA=+DIBTY,DR=10,DIOVRD=1 D ^DIE K DUOUT,DIROUT,DIRUT
QDIC K DIBT1,DIBTY,DIOVRD,%,%X,%Y Q
ALR W !,$C(7) I $D(DIBT),+Y=DIBT W "NO!! YOU ARE USING THAT TEMPLATE FOR YOUR LIST OF ENTRIES!" S Y=-1 Q
 I $D(DISV),+Y=DISV W "NO!! YOU ARE GOING TO STORE SEARCH RESULTS IN THAT TEMPLATE!" S Y=-1 Q
 N DIR S DIR(0)="Y",DIR("B")="NO",DIR("A")="DATA ALREADY STORED THERE....OK TO PURGE" D ^DIR Q:$D(DIRUT)
 I Y=1 S %Y="" D  S Y=DIBTY Q
 .F  S %Y=$O(^DIBT(+DIBTY,%Y)) Q:%Y=""  I %Y'="%D",%Y'="ROU",%Y'="ROUOLD",%Y'="DIPT" K ^DIBT(+DIBTY,%Y)
 .Q
 S %Y=-1 I $O(^DIBT(+DIBTY,1,0))'>0!'$D(DIBT1) S Y=-1 Q
 F %=0:0 S %=$O(^(%)),%Y=%Y+1 Q:%'>0
 K DIR S DIR(0)="Y",DIR("B")="NO",DIR("A",1)="WANT TO MERGE THESE ENTRIES",DIR("A")="WITH THE "_%Y_" ALREADY IN '"_$P(DIBTY,U,2)_"' TEMPLATE"
 D ^DIR S Y=$S(Y=0:-1,1:DIBTY) W ! Q

DIBTED
DIBTED ;SFISC/GFT-SCREEN-EDIT A SORT TEMPLATE ; 15NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DIC,DIBT0,DIBTED,DRK,I,J,DDSCHG
 S DIC=.401,DIC(0)="AEQ" D ^DIC Q:Y<1
 S DIBT0=+Y D E
 D PUT
K K ^UTILITY("DIBTED",$J)
 Q
 ;
EDIT(DIBT0) ; EDIT VIA VA FILEMAN SCREEN EDITOR
 N DRK,DIBTED,I,J
E N DA,DPQ,DM,DP,DPP,D0,DIBTEDER,DIBTH,L,N,BY,DE,Y,DIBTX,Q,DIBTROW,DCL,DXS,DHD,DIJJ,DDH,DI,DV,DJ,DL,DK,DIL,DU,P,DNP,DIPP,G,S,C,Q,B,DIPA,DCC
 D:'$D(DISYS) OS^DII X ^DD("OS",DISYS,"EON")
 I '$D(^DIBT(DIBT0,0)) W !,"NO TEMPLATE SELECTED",! G K
 I $D(^("BY0")) W !,"CANNOT EDIT A ""BY(0)"" TEMPLATE WITH SCREEN EDITOR",! H 3 G K
 S DIBTED="Sort Template """_$P(^(0),U)_"""",(S,DRK)=$P(^(0),U,4),DCC=^DIC(S,0,"GL")
 W "..."
 D GET("^TMP(""DIBTED"",$J)") I '$D(^TMP("DIBTED",$J)) D  H 2 G K
 . I '$D(^DIBT(+D0,"DIS")) W !,"NO EDITABLE FIELDS EXIST IN THIS TEMPLATE.",!
 . W !,"A SEARCH TEMPLATE HAS NO EDITABLE SORT FIELDS.",!
 S DIBTH="Editing "_DIBTED,DIBTROW=1
DDW D EDIT^DDW("^TMP(""DIBTED"",$J)","M",DIBTH,"(File "_DRK_")",DIBTROW)
 K ^UTILITY($J,0),^UTILITY("DIBTED",$J),I,J,DPP
 I $D(DUOUT)!$D(DTOUT) K ^TMP("DIBTED",$J) W $C(7),$$EZBLD^DIALOG(8077) Q
 S C=",",Q=""""
 S (DV,DNP)="",DE="SORT",(DIL,L)=0,(DL,DJ)=1,(DI,S)=DRK
 D PROCESS("^TMP(""DIBTED"",$J)")
 X ^DD("OS",DISYS,"EON")
 S DIBTROW=$O(DIBTEDER(0)) I DIBTROW W "  ",DIBTEDER(DIBTROW) H 2 S DIBTH="ERROR!  Re-editing "_DIBTED K DIBTEDER G DDW
 K ^TMP("DIBTED",$J)
 S DDSCHG=1
 Q
 ;
GET(DIBTA) ;put displayable template into @DIBTA
 N DIBTITLE,DIPR,DIJ,%X,%Y,D,DPP,DIBTAD,DJ,DIPP,DIBTRPT,DIBTOLD,C,X
 K @DIBTA
 S (DJ,DIBTRPT)=1,C=",",(X,D0)=DIBT0,D="^DIBT("_X_C
 D ENDIPT^DIP11
 S X="",DIBTAD=0
 F DIJ=0:0 S DIJ=$O(DPP(DIJ)) Q:DIJ=""  S DIPP(DIJ)=DPP(DIJ),%=+DPP(DIJ),DJ=DIJ D E1^DIP0 S %X=0 D E2^DIP0
 K DPP,DIJJ F DIJ=0:0 S DIJ=$O(DIPP(DIJ)) Q:DIJ=""  D
 .N Y,%Y,%
 .D NL
 .S Y=$P(DIPP(DIJ),U,5),%=$P($P(DIPP(DIJ),U,4),"""",1) I %="@B" S %="@" ;DON'T SHOW 'BOOLEAN'
 .D W($S($D(DIBTITLE):"WITHIN "_DIBTITLE_", ",DIJ>1:"WITHIN "_DPP(DIJ-1)_", ",1:"")_"SORT BY: "_%_$P(DIPP(DIJ),U,3)_Y)
 .K DIBTITLE I $L(Y,"""")=3 S DIBTITLE=$$STRIP($P(Y,"""",2)) I DIBTITLE?.E1":" S DIBTITLE=$E(DIBTITLE,1,$L(DIBTITLE)-1)
 .S DPP(DIJ)=$P(DIPP(DIJ),U,3)
 .I $D(^DD(+DIPP(DIJ),+$P(DIPP(DIJ),U,2),0)) S X=+$P(^(0),U,2) I X,$D(DIPP(DIJ,X)),$D(^DD(X,0)) D NL,W($P(^DD(X,0),U)_": "_DIPP(DIJ,X)) K DIPP(DIJ,X)
 .F %=0:0 S %=$O(DIPP(DIJ,%)) Q:'%  I $D(DIPP(DIJ,%))#2 D NL,W($S('$D(^DD(%,0,"UP")):$O(^("NM",0))_" ",1:"")_$P(^DD(%,0),U)_": "_DIPP(DIJ,%)) S DPP(DIJ)=DIPP(DIJ,%)
 .Q:$P(DIPP(DIJ),U,4)["B"
 .D NL
 .S Y=$G(^DIBT(D0,2,DIJ,"F")),%Y=$P($G(^("T")),U)
 .S %Y=$S(%Y="z":"",$TR(%Y," ")="@":"@",1:%Y)
FROMDATE .S:Y[".9999" Y=$P(Y,".")+1 X:$P(DIPP(DIJ),U,10)=1 ^DD("DD")
 .S %=$F(Y,"z"),X="From: "_$S(%:$E(Y,1,%-3)_$C($A(Y,%-2)+1),1:Y),Y=%Y D W(X)
 .D NL,W("To: ") I Y]"" S:Y[".9999" Y=Y\1 D:$P(DIPP(DIJ),U,10)=1  D W(Y)
TODATE ..S:X'?.E1"@"1.NP Y=Y\1 X ^DD("DD")
 .I $D(^DIBT(D0,2,DIJ,"F")) S Y=$G(^("ASK")) D NL,W($P("Do NOT ask^ASK",U,''Y+1)_" range of values")
 Q
 ;
NL S DIBTAD=DIBTAD+1,@DIBTA@(DIBTAD)=$J("",DIJ*3-3) Q
 ;
W(X) S @DIBTA@(DIBTAD)=@DIBTA@(DIBTAD)_X Q
 ;
PROCESS(DIBTA) ;puts nodes into ^UTILITY("DIBTED")
 N DIPP,DIBTMORE,DIBTAB,BY,FR,TO,DIPR,DC,DJ,DK,DIJ,R,ERR,DIBTLINE,DIBTASK,X,A,DIQUIET
 K DPP S DIPP(1)="" ;Trick: if 1st Sort Field is screwy, DPP(1) will come back null
 S DIQUIET=1,DK=DRK,DIBTLINE=1,DIJ=0,DIBTAB=1,DC=0,DI=^DIC(DK,0,"GL"),DNP=""
 F DJ=1:1 D  Q:'DIBTMORE
 .F  S BY=$$STRIP($P($$LINE,"SORT BY:",2)) Q:BY'?.P  G Q:'DIBTMORE
 .S DIBTEDER=DIBTLINE,FR(DJ)="",TO(DJ)=""
 .F  Q:DIBTMORE-DIBTAB  S X=$$LINE Q:X'["FIELD: "  S BY=BY_","_$$STRIP($P(X,"FIELD:",2))
 .I DIBTMORE=DIBTAB S DIBTLINE=DIBTLINE-1,FR(DJ)=$$STRIP($P($$LINE,"From:",2))
 .I DIBTMORE=DIBTAB S TO(DJ)=$$STRIP($P($$LINE,"To:",2))
 .I TO(DJ)]"",FR(DJ)="" S DIBTMORE=0,DIBTEDER(DIBTEDER)="IF YOU HAVE A 'TO' VALUE, YOU MUST HAVE A 'FROM' VALUE" Q
 .K DIBTASK I DIBTMORE=DIBTAB S DIBTASK=$$UP^DILIBF($$LINE)
 .D DJ^DIP
GOODQ .I $G(DJ),$G(DPP(DJ))]"" D  Q  ;Does this sort level pass muster?
 ..S DIBTAB=DIBTMORE
 ..I $G(DIBTASK)["ASK",DIBTASK'["DON'T",DIBTASK'["NOT" S DPP(DJ,"ASK")=1
 .S DIBTMORE=0,DIBTEDER(DIBTEDER)=""
Q .Q
 Q:'$D(DJ)  K A D DPQ^DIP1 I $D(A(1)) S DIBTEDER(1)="YOU ARE SORTING BY THE SAME FIELD TWICE" Q
 M ^UTILITY("DIBTED",$J,"DPP")=DPP
 Q
 ;
LINE() N P,X
G S X=$G(@DIBTA@(DIBTLINE)),DIBTMORE=0
 F  S DIBTLINE=DIBTLINE+1 Q:'$D(@DIBTA@(DIBTLINE))  S P=@DIBTA@(DIBTLINE) I P'?.P D  Q
 .F DIBTMORE=1:1 Q:$A(P,DIBTMORE)-32
 Q $$STRIP(X)
 ;
STRIP(X) N P F P=$L(X):-1:1 Q:$A(X,P)>32  S X=$E(X,1,P-1)
B I $A(X)-32 Q X
 S X=$E(X,2,999) G B
 ;
PUT ;save template from ^UTILITY
 I '$D(^UTILITY("DIBTED",$J)) Q
 N DIC
 S DIC("B")=DIBT0
SAVEAS S DIC=.401,DIC("A")="Save revised "_DIBTED_" as: ",DIC(0)="AEQL",DIC("S")="I $P(^(0),U,4)=DRK"
 D ^DIC
 Q:Y<0  I $O(^DIBT(+Y,0))]"" W !,$C(7),"Are you sure you want to overwrite this '",$P(Y,U,2)," 'Template" S %=1 D YN^DICN I %-1 Q:%<2  K DIC("B") G SAVEAS
 L +^DIBT(+Y)
 S $P(^DIBT(+Y,0),U,4)=J(0)
 L -^DIBT(+Y)
 D SAVEFLDS(+Y)
 Q
 ;
SAVEFLDS(DIBT1) ;
 N DPP,DIBTOLD
 Q:'$D(^UTILITY("DIBTED",$J))!'$G(DIBT1)
NOW D NOW^%DTC S $P(^DIBT(DIBT1,0),U,2)=+$J(%,0,4)
 S $P(^DIBT(DIBT1,0),U,5)=$G(DUZ)
 M DPP=^UTILITY("DIBTED",$J,"DPP")
 S DIBTOLD=1 D SNEW^DIBT
 Q
 ;
 ;
 ;
BUILDNEW(GFTOUT,DRK,ARRAY,DINAME) ;TAKE SORT TEMPLATE SPEC FOR FILE 'DRK' AND RETURN NEW SORT TEMPLATE NUMBER AND NAME
 N DV,DNP,DE,DIL,L,DL,DI,DJ,S,DCC,C,Q,DIC,DIBTEDER,Y,X
 S GFTOUT=-1 Q:'$G(DRK)!'$O(@ARRAY@(0))
 S DCC=$G(^DIC(DRK,0,"GL")) Q:DCC'[U
 K ^UTILITY($J,0),^UTILITY("DIBTED",$J),I,J,DPP
 S C=",",Q=""""
 S (DV,DNP)="",DE="SORT",(DIL,L)=0,(DL,DJ)=1,(DI,S)=DRK
 D PROCESS(ARRAY) I '$D(^UTILITY("DIBTED",$J)) Q
 S Y=$O(DIBTEDER(0)) I Y S GFTOUT="-1^LINE "_Y_" OF TEMPLATE COULD NOT BE PROCESSED" Q
 S:$G(DINAME)="" DINAME="ZZZZZ "_$J
 S X=DINAME
 S DIC="^DIBT(",DIC("S")="I '$G(^(""GFT"")),$D(^(2)),$P(^(0),U,4)="_DRK,DIC(0)="XY" D ^DIC I Y+1 S GFTOUT="-1^TEMPLATE NAMED '"_DINAME_"' ALREADY EXISTS" Q
 S DIC(0)="LX",DIC("S")="I $P(^(0),U,5)=$G(DUZ),$G(^(""GFT""))",DIC("DR")="4///"_DRK_";5///"_+$G(DUZ)
 D ^DIC K DIC S DINAME=Y
 I Y>0 S ^DIBT(+Y,"GFT")=$H D SAVEFLDS(+Y)
 S GFTOUT=DINAME
 Q
 ;
TEST K GFT S GFT(1)="SORT BY: NAME"
 S GFT(2)="From: X"
 S GFT(3)="To: z"
 D BUILDNEW(.OUT,200,"GFT") W !,OUT
 Q

DIC
DIC ;SFISC/XAK,TKW,SEA/TOAD-VA FileMan: Lookup, Part 1 ;29AUG2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N %,D,DF,DIFILEI,DIENS,DINDEX,DS,DIASKOK,DIY,DO S U="^",DIC(0)=$G(DIC(0))
 D GETFILE^DIC0(.DIC,.DIFILEI,.DIENS) I DIFILEI="" S Y=-1 Q
 S %=$P("K^",U,DIC(0)["K"),(D,DINDEX,DINDEX("START"))=$$DINDEX^DICL(DIFILEI,%) ;ASSUMES A "B" CROSS-REFERENCE
 K %
EN I $G(DIFILEI)=""!('$D(DINDEX)#2) N DIFILEI,DIENS,DINDEX,DIASKOK,%
 K DO,DICR,DIROUT,DTOUT,DUOUT S U="^"
 D INIT^DIC0 I DIFILEI="" S Y=-1 D Q^DIC2 Q
 S DIC(0)=$G(DIC(0)) D
 . I DIC(0)["T" K ^TMP($J,"DICSEEN") S ^TMP($J,"DICSEEN",DIFILEI)=""
 . I $D(ZTQUEUED),$E($G(IOST),1,2)'="C-" S DIC(0)=$TR(DIC(0),"AEQ")
 . I DIC(0)["X",DIC(0)["O" S DIC(0)=$TR(DIC(0),"O")
 . S:DINDEX("#")>1 DIC(0)=$TR(DIC(0),"M") Q
 N DIPGM S DIPGM=$$PGM^DIC2(.DIC,$G(DF),DIFILEI)
 I DIPGM]"" D KILL1^DIC0 K DIC("W") S DIPGM(0)=1 G @DIPGM
ASK I $G(DIFILEI)=""!('$D(DINDEX)#2) N DIFILEI,DIENS,DINDEX,DIASKOK,% D INIT^DIC0 I DIFILEI="" S Y=-1 D Q^DIC2 Q
 I '$D(DIVAL) N DIVAL,DIALLVAL
 K DIVAL,DIALLVAL S DIVAL(0)=0,Y=-1,DIALLVAL=1
 I DIC(0)["A" K X W ! D ^DIC1 I $G(DTOUT) D Q^DIC2 Q
 I DIC(0)'["A" D CHKVAL^DIC0,CHKVAL2^DIC0(DINDEX("#"),.DIVAL,DIC(0),.DDS)
A1 I DIVAL(0) D
 . D CHKVAL1^DIC0(DINDEX("#"),.DIVAL,DIC(0),DIC(0),.DIALLVAL) Q:'DIVAL(0)
 . I $D(DIADD),X]"",X'["""" S (X,DIVAL(1))=""""_X_"""" S:DINDEX("#")>1 X(1)=X
 . N DUOUT K DINDEX S (DINDEX,DINDEX("START"))=D,DINDEX("WAY")=1
 . D INDEX^DICUIX(.DIFILEI,"4l",.DINDEX,"",.DIVAL) Q
X ;from DICM0
 I $G(DIFILEI)=""!('$D(DINDEX)#2) K DUOUT,DTOUT N DIFILEI,DIENS,DINDEX,DIASKOK,% N:'$D(DIVAL(0)) DIVAL,DIALLVAL D  I DIFILEI="" S Y=-1 D Q^DIC2 Q
 . D INIT^DIC0 Q:$D(DIVAL(0))!(DIFILEI="")
 . D SETVAL^DIC0 Q
 I DIVAL(0),$D(^DD(DIFILEI,.01,7.5)) X ^(7.5) D NODE75^DIC5 I $G(X)="" G:DIC(0)["A" ASK D Q^DIC2 Q
 N DIPGM S DIPGM=$S(DIVAL(0)'>1:$$PGM^DIC2(.DIC,$G(DF),DIFILEI),1:"")
 I DIPGM]"" D KILL2^DIC0 S DIPGM(0)=2 G @DIPGM
RTN I $G(DIFILEI)=""!('$D(DINDEX)#2) N DIFILEI,DIENS,DINDEX,DIASKOK,% N:'$D(DIVAL(0)) DIVAL,DIALLVAL D  I DIFILEI="" S Y=-1 D Q^DIC2 Q
 . D INIT^DIC0 Q:$D(DIVAL(0))!(DIFILEI="")
 . D SETVAL^DIC0 Q
 I X?1."?" D  Q:$G(DTOUT)  G:DIC(0)["A" ASK Q
 . D DSPHLP^DICQ(.DIC,.DIFILEI,.DINDEX,X)
 . S Y=-1 Q
 I DIVAL(0)=0!($G(DUOUT)) S Y=-1 D Q^DIC2 Q
 D:'$D(DO(2)) GETFA^DIC1(.DIC,.DO)
GRV I X?1"`".NP S Y=-1 G DBLGRV:X?1"``".E&(DO(2)["P") D BYIEN1^DIC5 Q:Y>0  I '$$TRYADD^DIC11(.DIC,DIFILEI) D DING G:DIC(0)["A" ASK D Q^DIC2 Q
 I DIVAL(0)=1,+$P(X,"E")=X,X>0 S Y=-1 N DISKIPIX D BYIEN2^DIC5 Q:Y>0
 I X=" ",$L(DIC)<29,$D(^DISV(DUZ,DIC))#2 S Y=+^(DIC) D SPACEBAR^DIC5 Q:Y>0  D DING G:DIC(0)["A" ASK D Q^DIC2 Q
F ; Start regular lookup
 N DD,DS,DIX,DIY,DIYX,DIDONE,DISAVDS,%Y,%H,DISYS
 I $G(DIFILEI)=""!('$D(DINDEX)#2) N DIFILEI,DIENS,DINDEX,DIASKOK,% N:'$D(DIVAL(0)) DIVAL,DIALLVAL D
 . D INIT^DIC0 Q:$D(DIVAL(0))
 . D SETVAL^DIC0 Q
F1 S (DD,DS,DS(0),DS("DD"))=0
 D SEARCH^DIC3
 I $G(DTOUT)!(Y'<0) D Q^DIC2 Q
 I $P(DS(0),U,2)="?",(DIC(0)_$G(DICR(1,0)))'["A" D K G F1
 I +DS(0)=2 S X=$P(DS(0),U,2) D K D  G A1
 . K DIVAL,DIALLVAL S DIVAL(0)=0,Y=-1,DIALLVAL=1
 . D CHKVAL^DIC0,CHKVAL2^DIC0(DINDEX("#"),.DIVAL,DIC(0),.DDS)
 . Q
 D  D K I Y<0,DIC(0)["A" D D^DIC0 W:DIC(0)["E" ! K:$D(DIROUT) DIROUT G ASK
 . Q:$G(DIROUT)
 . I DS(0),$P(DS(0),U,2)="" S:DIC(0)["Y"&($O(Y(0))) Y=0 D DING Q
 . Q:'($D(DS)#2)
 . I (DS(0)=0!($P(DS(0),U,2)="U")),DS("DD")=DS,(DO(2)["O"!($G(DIASKOK))!(DIC(0)["T")),DO(2)'["A",DO(2)'["P",DO(2)'["V",DO(2)'["D",DO(2)'["S",DIC(0)["L" D L^DICM
 . Q
 D Q^DIC2 Q
 ;
 ;
DBLGRV S X=$E(X,2,999) S:'$D(DICR(1)) DICR=0 S %="B",DS=^DD(+DO(2),.01,0) D A^DICM K DO S DO="DUMMY" D P^DICM0 S DIC(0)="U"_DIC(0) D D^DICM I Y>0 G K^DICM ;RECURSIVE LOOKUP ON THE SECOND `
NOGOOD D DING G:DIC(0)["A" ASK D Q^DIC2 Q
 ;
 ;
K K DD,DS,DIX,DIY,DIYX,DIDONE,DISAVDS
 I '$G(DICR),DIC(0)["T" K ^TMP($J,"DICSEEN") S ^TMP($J,"DICSEEN",DIFILEI)=""
 Q
 ;
DING Q:DIC(0)'["Q"!(DIC(0)'["E")
 W:'$D(DUOUT) $C(7)_$S('$D(DDS):" ??",1:"") Q
 ;
 ;
IX N DINDEX,DF
 S (DF,DINDEX,DINDEX("START"))=D
 G EN
 ;
A K DIY,DIYX,DS I DIC(0)["A" D D^DIC0 Q
NO S Y=-1 D Q^DIC2 Q
 ;
 ; DBS Entry points
LIST(DIFILE,DIFIEN,DIFIELDS,DIFLAGS,DINUMBER,DIFROM,DIPART,DINDEX,DISCREEN,DIWRITE,DILIST,DIMSGA) ;
 ;ENTRY POINT--return a list of entries from a file  (SEA/TOAD)
 G IN^DICL
 ;
FIND1(DIFILE,DIFIEN,DIFLAGS,DIVALUE,DIFORCE,DISCREEN,DIMSGA) ;SEA/TOAD
 ;ENTRY POINT--find a single entry in the file
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DICLERR S DICLERR=$G(DIERR) K DIERR
 N DIERN,DIFIND,DIPE,DITARGET
 N DIVALS M DIVALS=DIVALUE I $G(DIVALS)="" S DIVALS=$G(DIVALUE(1))
 D FIND^DICF($G(DIFILE),$G(DIFIEN),"",$G(DIFLAGS)_"f",.DIVALUE,1,$G(DIFORCE),.DISCREEN,"","DITARGET")
 I $D(DIERR) S DIFIND=""
 E  I $P($G(DITARGET(0)),U,3) K DITARGET S DIFIND="" D
 . I $O(DIVALS(1)) N I F I=1:0 S I=$O(DIVALS(I)) Q:'I  D:DIVALS(I)]""  Q:'I
 . . I ($L(DIVALS)+$L(DIVALS(I)))>100 S DIVALS=DIVALS_"...",I="" Q
 . . S DIVALS=DIVALS_$P(", ^",U,DIVALS]"")_DIVALS(I) Q
 . D ERR^DICF4(299,$G(DIFILE),$G(DIFIEN),"",DIVALS)
 . Q
 E  S DIFIND=+$G(DITARGET(1))
 I DICLERR'=""!$G(DIERR) D
 . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 I $G(DIMSGA)'="" D CALLOUT^DIEFU(DIMSGA)
 Q DIFIND
 ;
FIND(DIFILE,DIFIEN,DIFIELDS,DIFLAGS,DIVALUE,DINUMBER,DIFORCE,DISCREEN,DIWRITE,DILIST,DIMSGA) ;SEA/TOAD
 ;ENTRY POINT--in a file find entries that match a value
 G FINDX^DICF
 ;
 ; Error messages:
 ; 299  More than one entry matches the value(s) '|1|'
 ; 120  The previous error occurred when performing
 ; 8090 Pre-lookup transform (7.5 node)
 ;

DIC0
DIC0 ;SFISC/TKW-Lookup routine utilities called by DIC ;16JAN2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, 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)[0 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
 . ;I DIC["^DD(",'$D(@(DIC_"0)")) S DIFILE="" Q
 . 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 DIC1 & DIC2)
 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
 ;

DIC1
DIC1 ;SFISC/GFT/TKW-READ X, SHOW CHOICES ;29SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DUOUT,DTOUT N DD,DIY,DISUB,DIPRMT
 D GETFA(.DIC,.DO)
 N DIPRMT D GETPRMT^DIC11(.DIC,.DO,.DINDEX,.DIPRMT)
B I $D(DIC("B")) D
 . N B S B(1)=$G(DIC("B")) M B=DIC("B")
 . N DIGBL,DINONULL S DIGBL=DIC_""""_DINDEX_"""",DINONULL=1
 . F DISUB=1:1:DINDEX("#") D  S:B]"" DIY(DISUB)=B
 . . S B=$G(B(DISUB)) I B="" S DINONULL=0 Q
 . . S X="" S:DINONULL X=$O(@(DIGBL_",B)"))
 . . S B=$S($D(^(B)):B,$F(X,B)-1=$L(B):X,$D(@(DIC_"B,0)")):$P(^(0),U),1:B)
 . . N B1 S B1=B I "VPD"[DINDEX(DISUB,"TYPE") D
 . . . I B D  Q:$D(DIY(DISUB,"EXT"))
 . . . . N TYPE S TYPE=DINDEX(DISUB,"TYPE")
 . . . . I TYPE="D" Q:B'?7N.1".".N
 . . . . I TYPE="P" Q:B'?.N.1".".N
 . . . . I TYPE="V" Q:B'?1.N.1".".N1";".E
 . . . . S DIY(DISUB,"EXT")=$$EXT^DIC2(DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),B)
 . . . . S:TYPE="P" B=DIY(DISUB,"EXT") Q
 . . . D CHK^DIE(DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),"",B,.B1,"DIERROR") S:$G(DIERROR) B1=B
 . . . K DIERROR,DIERR Q
 . . S:DINONULL DIGBL=DIGBL_","_$S(+$P(B1,"E")=B1:B1,1:""""_B1_"""")
 . . Q
 . Q
PROMPT ; Prompt user for lookup values
 D PROMPT^DIC11
 Q
 ;
 ;
GETFA(DIC,DO) ; Get file attributes
 ; DIC is open global reference, output same as documented in DO^DIC1.
 D DO Q
 ;
DO ; GET FILE ATTR
 Q:$D(DO(2))  I $D(@(DIC_"0)")) S DO=^(0)
 E  S DO="0^-1" I $D(DIC("P")) S DO=U_DIC("P"),^(0)=DO
EGP I $P(DO,U,2)>1.9 S $P(DO,U)=$$FILENAME^DIALOGZ(+$P(DO,U,2)) ;**CCO/NI PROMPT FILE NAME and following line
DO2 S DO(2)=$P(DO,U,2) I DO?1"^".E S $P(DO,U)=$$FILENAME^DIALOGZ(+DO(2))
 I DO(2)["s",$D(^DD(+DO(2),0,"SCR")) S DO("SCR")=^("SCR")
 Q:$D(DIC("W"))  Q:DO(2)'["I"  Q:'$D(^DD(+DO(2),0,"ID"))
 S DIC("W")=""
P ; Add code to DIC("W") to display identifiers on pointed-to files
 I DO(2)["P" D WOV,PTRID^DIC5(.DO,.DIC) Q
 N % S %=0
 ;
W F  S %=$O(^DD(+DO(2),0,"ID",%)) D:%]""  Q:%=""
 . N X S X=^DD(+DO(2),0,"ID",%) Q:X="W """""
 . I $L(DIC("W"))+$L(X)>224 D WOV S %="" Q
 . I DIC("W")="" S DIC("W")="N C,DINAME"
 . S DIC("W")=DIC("W")_" W ""  "" "_X
 . Q
 Q
 ;
WOV S DIC("W")="N DIFILEI,DIEN,DIGBL S DIFILEI=+DO(2),DIEN=Y,DIGBL=DIC D WOV^DICQ1"
 Q
 ;
RENUM ;
 D GETFA(.DIC,.DO)
 I '$D(DF),X?.NP,^DD(+DO(2),.01,0)["DINUM",$D(@(DIC_"X)")) D  Q:Y>0
 . S Y=X D S^DIC3 I $T N DZ D ADDKEY^DIC3,GOT^DIC2 Q
 . S Y=-1 Q
 D F^DIC Q
 ;
DT S DST=DST_$$DATE^DIUTL(%) ;**CCO/NI DATE FORMAT
 I '$D(DDS) W DST S DST=""
 Q
 ;
Y ; Display a list of entries
 N DD,DDD,DDC,DDH,DIOUT S DIY="",DIOUT=0,DD=DS("DD")
 I DD=0,DIC(0)["T",DIC(0)["E" D DSPH^DIC0
 F  S DD=$O(DS(DD)) Q:'DD  D  Q:DIOUT
 . S DDH=DD-1,DIYX=0,DS("DD")=DD
 . I DIC(0)["E" W:'$D(DDS) !?5,DD,?9 D
 . . N Y S Y=+DS(DD)
 . . D E Q
 . I DIC(0)["Y" Q:DD<DS  D
 . . F Y=DS:-1 Q:'$G(DS(Y))  S Y(+DS(Y))=""
 . . Q
 . I DIC(0)'["E"!(DIC(0)["Y") S DS(0)="1^",DIOUT=1,DIY="" Q  ;IMPORTANT!  STOPS FURTHER LOOKUP
 . I DS>DD Q:DD#5
 . S DIOUT=1
 . I $D(DDS) S DDD=2,DDC=5 D LIST^DDSU K DDD,DDC
 . I '$D(DDS) D
 . . I DS>DD W !,$$EZBLD^DIALOG(8087,$S(DIC(0)["T":"'^^' to exit all lists,",1:"")) ;**PATCH 122
 . . N R S R(1)=$O(DS(0)),R(2)=DD W !,$$EZBLD^DIALOG(8088,.R) R DIY:$S($D(DTIME):DTIME,1:300) S:'$T DTOUT=1 Q  ;**
 . I $G(DTOUT) W $C(7) S X="" Q
 . I DIY[U!($G(DUOUT)) S DUOUT=1,X=U D  Q
 . . I DIY?1"^^".E,DIC(0)["T" S DIROUT=1 Q
 . . I DIY?1"^".E,DIC(0)["E",DIC(0)'["T" S DIROUT=1 Q
 . Q
 I DIY?1.N.1".".N D  I DIY,DIY'>DD,$G(DS(DIY)) S Y=+DS(DIY) D GOT S DS(0)=1_"^"_+Y Q
 . S:($L($P(DIY,"."))>25!($L($P(DIY,".",2))>25)) DIY="-1" Q
 I $L(DIY)>25 S DIY=-1
 N I S I=$S($G(DUOUT):"1^U",$G(DTOUT):"1^T",DIY?1."?":"1^?",DIY:1,1:"")
 I 'I,DIY]"",+$P(DIY,"E")'=DIY,'$G(DICR),DINDEX("#")=1 S I="2^"_DIY
 Q:'I
 S DS(0)=I,Y=-1
 I DIY?1."?" D
 . I (DIC(0)_$G(DICR(1,0)))'["A",$D(DICRS) Q
 . N X,Y,DS D DSPHLP^DICQ(.DIC,.DIFILEI,.DINDEX,"?",1)
 K DIY,DIYX Q
 ;
E S DST="" D
 . Q:DIC(0)["U"
 . I $O(DS(DD,0)) S DST=$$BLDDSP(.DS,DD) Q
 . S %=$S($G(DILONGX):DICR(DILONGX,"ORG"),$G(DINDEX("IXTYPE"))'="S":$P(X,U),1:"")
 . S %=%_$P(DS(DD),U,2,9)_$S($G(DIYX(DD)):DIY(DD),1:"")
 . I ($G(DITRANX)!($G(DICRS))),$G(DINDEX(1,"TRANOUT"))]"",%]"" D  Q
 . . N X S X=% X DINDEX(1,"TRANOUT") S DST=$G(X) Q
 . I +$P(%,"E")=%,$D(DIDA) D DT Q
 . I $G(DICRS),$G(DINDEX("IXTYPE"))="R" D
 . . N F1,F2 S F1=$G(DINDEX(1,"FILE")),F2=$G(DINDEX(1,"FIELD"))
 . . I F1,F2 S %=$$EXT^DIC2(F1,F2,%,"h")
 . . Q
 . S DST=% Q
 I DIC(0)["s" S DIC(0)=$TR(DIC(0),"s")
 I $D(DS(DD,"K")) S %=$G(DIX) M DIX=DS(DD) S DIX=%
 S DIY=$S($G(DIYX(DD)):"",1:DIY(DD)) D WO^DIC2 Q
 ;
BLDDSP(DS,DD,DINDXFL,DIYX,DIY,DICRS) ; Build display of index values
 N X,I S X=""
 F I=0:0 S I=$O(DS(DD,I)) Q:'I  D
 . I $L(X)+$L(DS(DD,I))>240 Q
 . I I=1,$G(DINDXFL) S X=$P(DS(1),U,2,99)_$S($G(DIYX(1)):$G(DIY(1)),1:"") Q
 . I I=1,$G(DICRS) Q
 . S X=X_$P("  ^",U,I>1)_DS(DD,I) Q
 Q X
 ;
GOT ; Set data for single entry selected by user.
 N I,J,K
 I DIY(DIY)="" S DIY(DIY)=$P($G(@(DIC_"Y,0)")),U)
 S:$D(DDS) DST=X_$P(DS(DIY),U,2,9)_$S($G(DIYX(DIY)):$G(DIY(DIY)),1:"")
 S K=$O(DIVPSEL("A"),-1) I K]"" S DIVPSEL(K)=Y
 I $G(DIFINDR) D  Q
 . S:$D(DDS) DS(0,"DST")=DST
 . S DS(0,"Y")=+DS(DIY),DS(0,"X")=X_$P(DS(DIY),"^",2),DS(0,"DIYX")=$G(DIYX(DIY)),DS(0,"DIY")=DIY(DIY)
 . M DS(0,1)=DS(DIY)
 . Q
 I $G(DIYX(DIY)) K DIYX S DIY(DIY)=$P($G(@(DIC_"Y,0)")),U)
 D C^DIC2 Q
 ;
OK ;
 S %=1 I $G(DS)=1 S DST="         ...OK" D Y^DICN W:'$D(DDS) !
 I %>0 Q:%=1  D  S X=$G(DIX),Y=-1 Q  ;%=1=Yes, %=2=No
 . I $G(DICR) S DICR(DICR,31.2)=+Y ;Preserve IEN for future reference
 . I +$G(DS) K DS S (DS,DS(0),DS("DD"))=0 ;ReInit Display array
 . Q
 I %=0 W !?4,$$EZBLD^DIALOG(8040),! G OK ;User asked for Help
 I %=-1,$D(DTOUT) S DIROUT=1 ;User TIMED Out; DTOUT set in DICN
 I %=-1,'$D(DTOUT) S (DUOUT,DIROUT)=1 ;User single up-arrowed out
BAD S Y=-1
 I $G(%Y)?1"^^".E S (DIROUT,DUOUT)=1
 S DS(0)=$S($G(DTOUT):"1^T",$G(DUOUT):"1^U",$G(%)=-1:"1^U",1:"1^") Q
MIX ;
 N DID S DID=D_"^-1",DID(1)=2
 N D S D=$P(DID,U)
 G IX^DIC
 ;
 ;#8042  Select |filename|:
 ;#8040   Answer with 'Yes' or 'No'

DIC11
DIC11 ;SFISC/TKW-PROMPT USER FOR LOOKUP VALUES ;05:33 PM  11 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PROMPT N DIOUT S (DIVAL(0),DIOUT)=0
 F DISUB=1:1:DINDEX("#") D PR1 Q:DIOUT
 S X=$G(DIVAL(1))
 I DINDEX("#")>1 M X=DIVAL D  K X(0) ; W:$O(DIVAL(1)) !
 . I X?1"^"1.E K X S X=$G(DIVAL(1)) Q
 Q
 ;
PR1 S DIY=DIPRMT(DISUB),DIVAL(DISUB)="" N X
 I $G(DIY(DISUB))]"" S DIY=DIY_$S($D(DIY(DISUB,"EXT")):DIY(DISUB,"EXT"),1:DIY(DISUB))_"// "
 W DIY R X:$S($G(DTIME):DTIME,1:300)
 I '$T S (DIOUT,DTOUT)=1 W $C(7) K DIVAL S DIVAL(0)=0 Q
 I X'?.ANP D:DIC(0)["Q"  S DISUB=DISUB-1 Q
 . W $C(7),"  ",$$EZBLD^DIALOG(204),! Q
 I X?1.N.1"."1.N,($L($P(X,"."))>25!($L($P(X,".",2))>24)) D:DIC(0)["Q"  S DISUB=DISUB-1 Q
 . W $C(7),"  ",$$EZBLD^DIALOG(208),! Q
 I X="^"!($E(X)="^"&(DISUB>1)) S (DIOUT,DUOUT)=1 K DIVAL S DIVAL(0)=0,DIVAL(1)="^" Q
 I $L(X)>250 D:DIC(0)["Q"  S DISUB=DISUB-1 Q
 . W $C(7)," ",$$EZBLD^DIALOG(209),! Q
 I X?1."?" K DIVAL S DIVAL(1)=$E(X,1,2),DIVAL(0)=0,DIOUT=1 Q
 I (X?1"`".NP)!(X=" ") K DIVAL S DIVAL(1)=X,(DIVAL(0),DIOUT)=1 Q
 W:DINDEX("#")>1 !
 S DIVAL(DISUB)=X
 I X="",$G(DIY(DISUB))]"" S DIVAL(DISUB)=DIY(DISUB) S:DIC(0)'["O" DIC(0)=DIC(0)_"O"
 Q:DIVAL(DISUB)=""
 S DIVAL(0)=DIVAL(0)+1
 S:$E(X)="^" (DIOUT,DUOUT)=1
 Q
 ;
GETPRMT(DIC,DO,DINDEX,DIPRMT) ; Build list of prompts for each lookup value
 N DICA I $D(DIC("A")) S DICA(1)=$G(DIC("A")) M DICA=DIC("A")
 N DISUB,I,L,P S L=0
 F DISUB=1:1:DINDEX("#") D
 . I $G(DICA(DISUB))]"" D  I DIPRMT(DISUB)]""
 . . S DIPRMT(DISUB)=""
ANOTHER . . I DISUB=1,DINDEX("#")>1,DICA(DISUB)=$$EZBLD^DIALOG(8199) Q  ;**CCO/NI  'ANOTHER ONE:'
 . . S DIPRMT(DISUB)=DICA(DISUB) Q
 . E  D
 . . S P=$S(DISUB=1:$P(DO,U),1:"")
 . . I DISUB=1,$G(DICA(DISUB))=$$EZBLD^DIALOG(8199) S P=$$EZBLD^DIALOG(8050)_P
 . . I DINDEX("#")=1,D'="B"&(DIC(0)["M")!(D="B"&(DO(2)'>1.9)) S DIPRMT(DISUB)=$$EZBLD^DIALOG(8042,P) Q
 . . N X S X=DINDEX(DISUB,"PROMPT") I X]"" D
 . . . I DISUB=1 Q:DINDEX("#")=1&(P[X!(X[P))  S P=P_" "
 . . . S P=P_X Q
 . . I DISUB=1 S DIPRMT(DISUB)=$$EZBLD^DIALOG(8042,P)
 . . E  S DIPRMT(DISUB)=P_": "
 . . Q
 . S I=$L(DIPRMT(DISUB)) S:I>L L=I Q
 Q:DINDEX("#")=1
 S I="",$P(I," ",L)=""
 F DISUB=1:1:DINDEX("#") S DIPRMT(DISUB)=$E(I,1,(L-$L(DIPRMT(DISUB))))_DIPRMT(DISUB)
 Q
 ;
TRYADD(DIC,DIFILEI) ; Return 1 if user should be allowed to attempt to add record
 ; when lookup value `ien and .01 is a pointer.
 Q:DIC(0)'["L" 0
 N % S %=$P($G(^DD(DIFILEI,.01,0)),U,2)
 I %["P"!(%["V") Q 1
 Q 0
 ;
 ; Error messages
 ; 204  The input value contains control characters.
 ; 208  Input value is an illegal number.
 ; 209  Input value is too long.
 ;8042  Select |1|:
 ;8050  Another
 ;

DIC2
DIC2 ;SF/XAK/TKW-LOOKUP (CONT) ;06:31 PM  7 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
WO ; Display .01 field, Primary KEY values and Identifiers for an entry.
 I '$D(DST) N DST
 S DST=$G(DST)_"  " D WR
 I $D(DIC("W")),$D(@(DIC_"Y,0)")) D:$D(DDS)&'$D(DDH("ID")) ID^DICQ1 I '$D(DDS) D
 . I $G(DST)]"" W DST,"  "
 . N DISAVEX M DISAVEX=Y N Y M Y=DISAVEX S DISAVEX=X N X S X=DISAVEX K DISAVEX
 . I $D(@(DIC_"Y,0)")) X DIC("W")
 . K DST Q
 Q
WR ; Put .01 field into DST for display
 D:'$D(DO) GETFA^DIC1(.DIC,.DO) I '$D(DST) N DST
 I (DIC(0)["S"!(DIC(0)["s")),DIVAL(1)'=" " Q:"  "[$G(DST)&('$D(DIX("K")))  D S Q
 S DST=$G(DST)
 I DO(2)["V",DIY?1.N1";"1.E S DST=DST_$$EXT(+DO(2),.01,DIY) D S Q
 I DIY?.N.1".".N,(DO(2)["P"!(DO(2)["D")),DIY D  D S Q
 . I DO(2)["P" S DST=DST_$$EXT(+DO(2),.01,DIY) Q
 . N % S %=DIY D DT^DIC1 Q
W1 I '$G(DIYX),DIY]"",((DST'[DIY)!($P(DST,DIY)]"")) S DST=DST_DIY
S ; Put Primary KEY values into DST, display DST if not in ScreenMan
 I $D(DIX("K")),DIC(0)'["S" N I,F,% F I=0:0 S I=$O(DIX("K",I)) Q:'I  F F=0:0 S F=$O(DIX("K",I,F)) Q:'F  D
 . I DIY]"",F=.01 Q
 . I $G(DIX("F"))[("^"_F_"^") Q
 . S %=DIX("K",I,F) Q:%=""  I $L(%)+$L(DST)>240 Q
 . S DST=DST_$P("  ^",U,DST]"")_% Q
 N A1 S A1=Y I '$D(DDS) W DST K DST Q
H ; Display .01 and Primary KEY values if in ScreenMan
 I '$D(A1) N A1 S A1="T"
 S DDH=$G(DDH)+1,DDH(DDH,A1)=DST K DST Q
 ;
EXT(DIFILE,DIFIELD,DIVAL,DIF) ; Return external value of field
 N DIERR,DISAV S DISAV=$G(DIVAL) I DISAV="" Q DISAV
 S DIF=$G(DIF) S:DIF="" DIF="F"
 S DIVAL=$$EXTERNAL^DIDU(DIFILE,DIFIELD,DIF,DIVAL,"DIERR")
 I $D(DIERR) S DIVAL=DISAV
 Q DIVAL
 ;
PGM(DIC,DF,DIFILE) ; Return special lookup program name
 I DIC(0)["I"!($G(DF)]"") Q ""
 N DIPGM S DIPGM=$G(^DD(DIFILE,0,"DIC")) Q:DIPGM=""!(DIPGM?1"DI".E) ""
 Q U_DIPGM
 ;
GOT I DIC(0)["E" D
 . N:'$D(DST) DST N DDH D WO
 . I $D(DDS),$D(DDH)>10 D LIST^DDSU K DDH("ID")
 . Q
 S Y=Y_"^"_$S(DIY="":X,$G(DIYX):X_DIY,1:DIY)
 I DIC(0)["E" D  Q:Y<0
 . I DO(2)["O"!($G(DIASKOK)) D OK^DIC1 Q
 . Q:DIC(0)'["T"
 . I $G(DICR) Q:'$G(DICRS)!(DICR'=1)  D OK^DIC1 Q
 . D OK^DIC1 Q
R D:'$G(DICR)  I Y<0 D A^DIC S DS(0)="1^" Q
 . D ACT^DICM1 Q:Y<0
 . Q:DINDEX("#")'>1!(DINDEX("START")'=DINDEX)
 . N I F I=1:1:DINDEX("#") I $D(DIX(I))#2 S X(I)=DIX(I)
 . Q
 I DIC(0)["Z" S Y(0)=@(DIC_"+Y,0)"),Y(0,0)=$$EXT(DIFILEI,.01,$P(Y(0),U))
ACT I DIC(0)'["F",$D(DUZ)#2 S ^DISV(DUZ,$E(DIC,1,28))=$E(DIC,29,999)_+Y
 I $D(@(DIC_"+Y,0)")) D:DIC(0)'["T" Q Q
 S Y=-1 D Q S DS(0)="1^" Q
 ;
Q K DIDA,DID,DISMN,DINUM,DS,DF,DD,DIX,DIY,DIYX,DZ,DO,D,DIAC,DIFILE
 I '$G(DICR) K DIC("W"),DIROUT I DIC(0)["T" K ^TMP($J,"DICSEEN")
 Q
 ;
G ; Display index values for a single looked-up entry
 I $D(DS(0,"DICRS")),'$D(DICRS) N DICRS S DICRS=1
 I $D(DS(0,"DIDA")),'$G(DIDA) N DIDA S DIDA=1
 I $D(DIDA),$P(DS(1),U,2,99)]"" N:'$G(DIASKOK) DIASKOK S DIASKOK=1
 I DIC(0)["T",DIC(0)["E",'$D(DDS) D DSPH^DIC0 W !
 S DIY=1,DIX=X I DIC(0)["E",DIC(0)'["U" D
 . I DIC(0)["D" Q:$P(DS(1,"F"),U,2)=.01  N DIENTIRE S DIENTIRE=1
 . N D,% S (D,%)=""
 . I $G(DIDA),$P(DS(1),U,2,99)]"" S %="  partial match to:"
 . I $O(DS(1,0)) D
 . . I DINDEX("#")=1,'$G(DIDA) S D=%_$$BLDDSP^DIC1(.DS,1,1,.DIYX,.DIY,$G(DICRS)) Q
 . . S D=%_$$BLDDSP^DIC1(.DS,1,"","","",$G(DICRS)) Q
 . E  I $G(DITRANX) D
 . . S D=X_$P(DS(1),U,2,99)_$S($G(DIYX(1)):$G(DIY(1)),1:"")
 . . I $G(DINDEX(1,"TRANOUT"))]"" N X S X=D X DINDEX(1,"TRANOUT") S D=$G(X)
 . . S:D]"" D="  "_D  I $G(DIFINDER)["p",'$D(DDS) W !
 . . Q
 . E  I '$D(DICRS) D
 . . I $G(DIDA) S D=$P(DS(1),U,2,99) I D]"" S D=%_"  "_$$DATE^DIUTL(X_D) W:'$D(DDS) ! Q  ;**CCO/NI
 . . S D=$P(DS(1),U,2,99)_$S($G(DIYX(1)):$G(DIY(1)),1:"")
 . . I $G(DIFINDER)["p" S D=X_D W:'$D(DDS)&(DIC(0)'["T") ! Q
 . . I DIC(0)["T"!($G(DIENTIRE)) S D=X_D
 . . Q
 . S DST=$P("  ^",U,$D(DST)#2)_D
 . I '$D(DDS) W DST S DST=""
 . Q
C S Y=$G(DIX) M DIX=DS(DIY) S DIX=Y
 I $O(DS(1)) K DIX("F")
 S Y=+DS(DIY),X=X_$P(DS(DIY),"^",2),DIYX=$G(DIYX(DIY)),DIY=DIY(DIY)
 D GOT Q
 ;
 ;

DIC3
DIC3 ;SFISC/XAK,TKW,SEA/TOAD-VA FileMan: Lookup, Part 1 (called from DIC) ;28SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
SEARCH ; Begin search through x-refs.
 I DIC(0)["T",'$G(DICR) N:'$D(DICR(1)) DICR S DICR=0 D:DIC(0)["O"
 . I DIC(0)'["X" S DIC(0)=DIC(0)_"X" Q
 . S DIC(0)=$TR(DIC(0),"X") Q
 I X?1"`".NP D ^DICM Q
 I $L(X)>DINDEX(1,"LENGTH"),'$G(DILONGX) D ^DICM Q
 N DIOK,DIEXACTN K % I $G(DISKIPIX)=D K DISKIPIX G M
EXACT ; Find all exact matches to the lookup values
 S DISAVDS=DS,DIEXACTN=0
 I $G(DILONGX) D  ;G:$L(DICR(DICR,"ORG"))'>DINDEX(1,"LENGTH") M D  ;JUMPED AWAY FROM USING THIS INDEX, EVEN THOUGH IT MIGHT NEVER HAVE BEEN TRIED BEFORE
 . S (X,X(1),DIVAL,DIVAL(1))=$E(DICR(DILONGX,"ORG"),1,DINDEX(1,"LENGTH")) ;TRIM LOOKUP VALUE DOWN TO SIZE!
 I DINDEX("#")>1,($G(DIALLVAL)!($G(DICR))),(DIC(0)["X"!(DIC(0)["O")) D EXACT^DIC4,SET^DIC4
 I DINDEX("#")'>1 S Y=0,DIX=X F  D MOREX Q:Y=-1!(DS(0))
 I DS(0) Q:DIC(0)'["T"  Q:$P(DS(0),U,2)'="U"!($G(DIROUT))  S DS(0)=0
 I DIC(0)["T",DIC(0)["E",$G(DUOUT) D  ;22*70
 . ; Set up variables for next index lookup
 . K DS,DUOUT
 . S (DS,DS(0),DS("DD"))=0
 . S X=DIVAL(1)
 . Q
 I DISAVDS=0,DS=1,DIC(0)["O"!(DIC(0)'["E"),DIC(0)'["T" D  Q:Y>0!($D(DIROUT))  ;Good IEN returned or user bailed out
 . I DINDEX("#")'>1,DIEXACTN>1,DINDEX'="B" S Y=-1 Q
 . S Y=+DS(1),DS("DD")=1
 . I DINDEX("#")'>1,DIEXACTN'>1 S DIY=1 D C^DIC2 Q
 . D G^DIC2 Q
 ;
PARTIAL ; Find all partial matches to the lookup values
 I DIC(0)'["X",DINDEX("#")>1 D PARTIAL^DIC4,SET^DIC4
 I DIC(0)'["X",DINDEX("#")'>1 F  D  Q:$G(DIX)=""!(DS(0))
 . N DITYP S DITYP=$G(DINDEX(1,"TYPE"))
 . D
 . . I DIC(0)["E",(DITYP["F"!(DITYP["S")) Q:DIC(0)["n"
 . . I $TR(X,"-.")?.N,DO(2)'["D",'$D(DIDA) S DIX=$O(@(DIC_"D,DIX_"" "")"),-1)
 . . Q
 . S DIX=$O(@(DIC_"D,DIX)"))
 . Q:DIX=""
 . I $P(DIX,X)'="" D  Q:DIX=""
 . . I +$P(X,"E")'=X!(DIC(0)'["E") S DIX="" Q
 . . I DIC(0)'["n"!(DITYP'["F"&(DITYP'["S")) S DIX="" Q
 . . D FINDMORE^DICLIX0(1,.DIX,X,.DINDEX) ;DIC(0)["n" SO WE KEEP LOOKING FOR PARTIAL NUMERIC MATCHES
 . . S:$P(DIX,X)'="" DIX="" Q
 . S Y=0 F  D MOREX Q:Y=-1!(DS(0))
 . Q
 I DS(0) Q:DIC(0)'["T"  Q:$P(DS(0),U,2)'="U"!($G(DIROUT))  S DS(0)=0
 I DIC(0)["T",DIC(0)["E",$G(DUOUT) D  ;22*70
 . ; Set up variables for next index lookup
 . K DS,DUOUT
 . S (DS,DS(0),DS("DD"))=0
 . S X=DIVAL(1)
 . Q
 ;
M ; Find the next index.  At end, display the rest
 I DIC(0)["T" D KEEPON^DIC5 I DS(0) Q:$P(DS(0),U,2)'="U"!($G(DIROUT))
 I DIC(0)["M" S DIOK=0 F  D  Q:DIOK
 . N Y S Y=DINDEX("START") K DINDEX S DINDEX("WAY")=1,DINDEX("START")=Y,DINDEX("#")=1
 . S (D,DINDEX)=$S($D(DID):$P(DID,U,DID(1)),1:$O(@(DIC_"D)"))) ;GRAB THE NEXT EXISTING CROSS-REF
 . S:$D(DID) DID(1)=DID(1)+1
 . I D=""!(D=-1) S D="",DIOK=1 Q
 . I $D(@(DIC_"D)"))-10 Q
 . ; Check Index, build index info
 . D IXCHK^DIC4(.DIFILEI,.DINDEX,.DIOK,.DIALLVAL,.DIVAL,$G(DID)) ;DINDEX=D.  Check that it's OK
 I DIC(0)["M",D]"" G EXACT
 D:DIC(0)["M" D^DIC0
 I DS=1 S DS("DD")=1 D G^DIC2 Q
 I DS D Y^DIC1 Q:DS(0)  I DINDEX("#")'>1 D:DO(2)["O"&(DO(2)'["A") L^DICM Q
 I $G(DILONGX) S X=$E(DICR(DILONGX,"ORG"),1,30)
 I DIC(0)["T",'$G(DICR),DIC(0)["O",DIC(0)["X" G SEARCH
 I DINDEX("#")>1,'$G(DICR) D:DIC(0)["L"  D:Y=-1 BAD^DIC1 Q
 . S Y=-1 I $G(DICR)="" N DICR S DICR=0
 . I $A(X)=34,X?.E1"""" D N^DICM Q
 . K DD D L^DICM Q
 D ^DICM Q
 ;
 ;
MOREX ; Find more exact matches to lookup value DIX
 S Y=$O(@(DIC_"D,DIX,Y)")) I 'Y S Y=-1 Q
 I $D(DIEXACTN)#2 S DIEXACTN=DIEXACTN+1
 D MN Q:'$T  D K  Q:$G(DS(0))
 I DS>1,DIC(0)'["E",DIC(0)'["Y" K DS S DS=0,DS(0)=1,Y=-1
 Q
 ;
MN N DZ S DZ=$S((DIC(0)["D"&(DINDEX="B")):1,$G(DINDEX("#"))>1:0,$G(@(DIC_"D,DIX,Y)")):1,1:0) S DIYX=0
 D:'$D(DO) GETFA^DIC1(.DIC,.DO)
 I D="B",'DZ,'($D(@(DIC_"D,DIX,Y)"))#2) D
 . N I S I=Y F  S DZ=$G(^(I)),I=$O(^(I,0)) Q:I=""
 . Q
 S DIY="" I '$D(@(DIC_"Y,0)")) X "I 0" Q
 I D="B",'DZ,'$D(DO("SCR")),$L(DIX)<30,'$D(DIC("S")),'$D(@(DIC_"Y,-9)")),'$G(DINDEX("OLDSUB")) D ADDKEY I 1 Q
 D S I  D
 . I DINDEX("FLISTD")["^.01^",DINDEX("#")=1,'DZ,$P(DIY,DIX)="",'$G(DINDEX("OLDSUB")) D  Q
 . . N I S I=$S($G(DILONGX):DICR(DILONGX,"ORG"),1:DIX)
 . . S DIY=$P(DIY,I,2,9),DIYX=1 D ADDKEY Q
 . Q:DIC(0)["Y"
 . I ($G(DINDEX("#"))>1)!($G(DINDEX("OLDSUB"))) D  Q
 . . D ADDIX^DIC4(.DIFILEI,Y,.DINDEX,.DIX,.DISCREEN)
 . . D ADDKEY Q
 . D ADDKEY
 . I DINDEX("FLISTD")["^.01^",'DZ S DIY=""
 . Q
 Q
 ;
S D:'$D(DO) GETFA^DIC1(.DIC,.DO)
 I $D(@(DIC_"Y,0)")),'$D(^(-9)) S DIY=$P(^(0),U)
 E  S DIY="" Q
 I '$D(DIC("S")),'$D(DO("SCR")) Q
 I $G(DINDEX("#"))>1!($G(DINDEX("OLDSUB"))) Q
 I $G(DILONGX) N DI0NODE,DIVAL D
 . N % S %=DINDEX(1,"GET")
 . I %="DIVAL=DINDEX(DISUB)" S DIVAL=X Q
 . I %["DI0NODE" S DI0NODE=@(DIC_"Y,0)")
 . N DIFILE S DIFILE=DIFILEI,DIFILE(DIFILE)=DIFILEI(DIFILEI)
 . N DIEN S DIEN=Y_DIENS
 . S @% Q
 N DIAC,DIFILE,DISAVEX,DISAVEY,DISAVED
 M DISAVEX=X,DISAVEY=Y S DISAVED=D I $D(@(DIC_"Y,0)"))
 I $D(DIVAL(1)),$D(DIVAL)=10 S DIVAL=DIVAL(1) ;*159
 I 1 X:$D(DIC("S")) DIC("S") K DIAC,DIFILE D:$D(DIC("S")) SX Q:'$T
 I $D(DO("SCR")),$D(@(DIC_"Y,0)")) X DO("SCR") D SX Q:'$T
 I 1 Q
 ;
SX M X=DISAVEX,Y=DISAVEY S D=DISAVED Q
 ;
ADDKEY ; Put KEY values into output array for display
 S DIX("F")="" I DIC(0)'["U" S DIX("F")=$G(DINDEX("FLISTD"))
 Q:'$D(DIFILEI(DIFILEI,"KEY"))  Q:DIC(0)["S"
 N DIKX,DII,DIFLD,DIERR,I
 M DIKX=DIFILEI(DIFILEI,"KEY",DIFILEI) Q:'$D(DIKX)
 K DIX("K")
 F I=0:0 S I=$O(DIKX(I)) Q:'I  F DIFLD=0:0 S DIFLD=$O(DIKX(I,DIFLD)) Q:'DIFLD  D
 . I DIFLD=.01,$G(DZ)=0 S DIY=""
 . S DIX("K",I,DIFLD)=$$GET1^DIQ(DIFILEI,Y_DIFILEI(DIFILEI,"KEY","IEN"),DIFLD,"","","DIERR") Q
 Q
 ;
K ; Put an IEN into the DS array for display
 N DZ,I S DZ=$O(DS(0)) F I=DZ:1:DS I +$G(DS(I))=Y,DIC(0)'["C" S I=-1 Q
 I I'=-1,DIC(0)["T" D
 . Q:'$D(^TMP($J,"DICSEEN",DIFILEI))
 . I $D(^TMP($J,"DICSEEN",DIFILEI,Y)) S I=-1 Q
 . S ^TMP($J,"DICSEEN",DIFILEI,Y)="" Q
 I I=-1 S I=DIX K DIX S DIX=I,I=-1 Q
 I DS-DZ>100 D
 . N D1,D2 S D2=DZ+19 F D1=DZ:1:D2 K DS(D1),DIY(D1),DIYX(D1)
 . Q
 S DS=DS+1 D
 . S I=DS M DS(DS)=DIX S DS=I,I=DIX K DIX S DIX=I
 . S DS(DS)=Y_"^"_$P(DIX,X,2,99) Q
 S DIY(DS)=DIY S:DIY]""&$G(DIYX) DIYX(DS)=1
 I DS#5-1!(DS=1)!(DIC(0)["Y") Q
 D Y^DIC1 Q

DIC4
DIC4 ;SFISC/TKW-VA FileMan Lookup utilities ;5:59 AM  20 Sep 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EXACT ; Find next exact match on a compound index
 N DIFLAGS,DIFIELDS,DIWRITE,DIIENS,DIFORCE,DIERR,DISCR,DIQUIET,DIIX
 S DIFLAGS="lX" D GETPAR N DINDEX
 D FIND^DICF(.DIFILEI,DIIENS,DIFIELDS,DIFLAGS,.DIVAL,"*",.DIFORCE,.DISCR,$G(DIC("W")),"DS","DIERR",.DIIX,.DIC,.DIY,.DIYX)
 D:$G(DIERR) PROCERR Q
 ;
PARTIAL ; Find next partial match on a compound index
 N DIFLAGS,DIFIELDS,DIWRITE,DIIENS,DIFORCE,DIERR,DISCR,DIQUIET,DIIX
 S DIFLAGS="l" D GETPAR K DIIX("DONE") N DINDEX
 I DIFLAGS'["Q",$G(DS("INT"))]"","VP"[DIIX(1,"TYPE") N I M I=DIVAL N DIVAL D
 . S (I,I(1),DIIX(1),DIIX(1,"FROM"),DIIX(1,"PART"))=DS("INT")
 . S DIIX(1,"TYPE")="F" M DIVAL=I K I Q
 D FIND^DICF(.DIFILEI,DIIENS,DIFIELDS,DIFLAGS,.DIVAL,"*",.DIFORCE,.DISCR,$G(DIC("W")),"DS","DIERR",.DIIX,.DIC,.DIY,.DIYX)
 D:$G(DIERR) PROCERR Q
 ;
SET I $P(DS(0),U,2) D SETY Q
 S Y=-1 Q:'DS(0)  D SETOUT Q
 ;
SETOUT ; Set variables if user up-arrowed or timed out.
 S Y=-1 N I S I=$P(DS(0),U,2)
 I I="U",DIC(0)'["A" S DUOUT=1
 S:I="T" DTOUT=1 Q
 ;
SETY ; If entry was selected by user, set output variables.
 S Y=DS(0,"Y")
 S:$D(DDS) DST=DS(0,"DST")
 S (X,X(1))=DS(0,"X"),DIYX=DS(0,"DIYX"),DIY=DS(0,"DIY")
 N % S:$G(DIX)]"" %=DIX M DIX=DS(0,1) K DS(0),DIX("F") S:$D(%) DIX=%
 D GOT^DIC2 I Y<0 S DS(0)="1^" Q
 S DS(0)="1^"_+Y Q
 ;
GETPAR ; Set parameters for Finder call
 D:DIFLAGS'["Q"
 . N I S I=0 I $A(X)=34,X?.E1"""" S I=1
 . I I!(DIC(0)["U")!(DIC(0)["M")!($G(DICR)) S DIFLAGS=DIFLAGS_"Q"
 . Q
 S DIIENS=$S(DIC(0)["p":",",1:DIENS)
 I DIC(0)'["E" S DIQUIET=1
 S (DIFORCE,DIFORCE(1))=1,DIFORCE(0)=DINDEX
 I $D(DIC("PTRIX")) M DIFORCE("PTRIX")=DIC("PTRIX")
 D:$G(DIC("S"))]""
 . M DISCR("S")=DIC("S")
 . S I="S" F  S I=$O(DIC(I)) Q:$E(I)'="S"  S DISCR(I)=DIC(I)
 . Q
 I $D(DIC("V"))]"" M DISCR("V")=DIC("V")
 S DIFIELDS="@" M DIIX=DINDEX Q
 ;
ADDIX(DIFILEI,Y,DINDEX,DIX,DISCREEN) ; Put index values into DIX variable for display
 N DISUB,DIVAL,DI0NODE,DIFILE S DI0NODE=$G(@DIFILEI(DIFILEI)@(Y,0)),DIX(1)="" M DIFILE=DIFILEI
 I $G(DINDEX("OLDSUB")) N DIO,DIN S DIN=0 F DIO=1:1:DINDEX("OLDSUB") D
 . S DIVAL=""
 . I $G(DISCREEN("X",DIO,"GET"))]"" D
 . . X DISCREEN("X",DIO,"GET") Q
 . E  S DIN=$O(DINDEX(DIN)) I DIN,DIN'>DINDEX("#") S DISUB=DIN D GETVAL
 . S:DIVAL]"" DIX(DIO)=DIVAL Q
 Q:$G(DINDEX("OLDSUB"))
 F DISUB=1:1:DINDEX("#") D GETVAL S:DIVAL]"" DIX(DISUB)=DIVAL
 Q
GETVAL ; Return index value in DIVAL
 I $G(DINDEX(DISUB,"TRANOUT"))]"" D  Q
 . S DIVAL=DINDEX(DISUB) Q:DIVAL=""  N X S X=DIVAL
 . X DINDEX(DISUB,"TRANOUT") S:X]"" DIVAL=X Q
 S @DINDEX(DISUB,"GET") Q:DIVAL=""
 I "VPSD"[DINDEX(DISUB,"TYPE")!(DISUB=1&($G(DS("INT"))]"")) D
 . I DISUB>1,"VP"[DINDEX(DISUB,"TYPE") Q
 . S DIVAL=$$EXT^DIC2(DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),DIVAL) Q
 Q
 ;
IXCHK(DIFILEI,DINDEX,DIOK,DIALLVAL,DIVAL,DID) ; Build INDEX info, make sure indexed field not a pointer.
 S DIOK=0 N DIVALX S DIVALX=$G(DIVAL(1))
 N DIXIEN S DIXIEN=+$O(^DD("IX","BB",DIFILEI,DINDEX,""))
 I DIXIEN,$G(DID)="",$P($G(^DD("IX",DIXIEN,0)),U,14)'["L" Q
 I 'DIXIEN!('$O(^DD("IX",DIXIEN,11.1,"AC",1))) D  Q
 . N DIFLAGS S DIFLAGS="hql" S:$G(DILONGX)!(DIC(0)["T") DIFLAGS="4l"
 . I +$P(DIVALX,"E")=DIVALX,DIC(0)["E" S DIFLAGS="4l"
 . D INDEX^DICUIX(.DIFILEI,DIFLAGS,.DINDEX)
 . I +$P(DIVALX,"E")=DIVALX,$G(DINDEX(1,"TYPE"))="P" D  Q  ;22*70  IGNORE POINTERS IF YOU ARE LOOKING UP A NUMBER VALUE!!
 . .I DIC(0)["T",DIC(0)["E" S (DIOK,DIOK("T"))=1 ;22*70
 . S DIOK=1 Q
 D INDEX^DICUIX(.DIFILEI,"4l",.DINDEX,"",.DIVAL)
 S (DIALLVAL,DIOK)=1
 N I F I=1:1:DINDEX("#") S:$G(DINDEX(I,"PART"))="" DIALLVAL=0
 Q
 ;
PROCERR ; Display errors generated from call to Finder.
 I DIC(0)'["E" K DIERR Q
 W $C(7) W:'$D(DDS) !
 N A1,DDH,I,J S DDH=0
 F I=1:1:+DIERR F J=0:0 S J=$O(DIERR("DIERR",I,"TEXT",J)) Q:'J  D
 . I '$D(DDS) W DIERR("DIERR",I,"TEXT",J),! Q
 . S DDH=DDH+1,DDH(DDH)=DIERR("DIERR",I,"TEXT",J) Q
 K DIERR I '$D(DDS) W !! Q
 S A1="T" D LIST^DDSU Q
 ;

DIC5
DIC5 ;SFISC/XAK,TKW,SEA/TOAD-VA FileMan: Lookup, Part 1 (utilities) ;24MAY2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NODE75 ; Do after executing 7.5 node on DD, called from ^DIC
 I $D(X)#2 S (DIVAL,DIVAL(1))=X Q
 S Y=-1 Q:DIC(0)'["Q"!(DIC(0)'["E")
 W $C(7) Q:$D(DDS)
 W !,$$EZBLD^DIALOG(120,$$EZBLD^DIALOG(8090)) Q
 ;
BYIEN1 ; Lookup record by IEN when user enters `n for a number 'n', called from ^DIC
 S Y=$E(X,2,30) I Y="" S Y=-1 Q
 N % S %=DINDEX("START") N DINDEX S DINDEX="",DINDEX("#")=1,DINDEX("START")=%
 D S^DIC3 I '$T S Y=-1 Q
 N DD,DS,DZ S DS=1,DD=Y,DIX=X D ADDKEY^DIC3,GOT^DIC2
 Q
 ;
BYIEN2 ; Lookup record by IEN when user enters a numeric lookup value, called from ^DIC
 Q:DO(2)<0!($D(DF))
 N T S T=DINDEX(1,"TYPE")
 I $D(@(DIC_"X,0)")) D  Q:Y>0
 . N DD S DD=$D(^DD(DIFILEI,.001))
 . I 'DD Q:T["N"  I '$O(@(DIC_"""A["")")),$O(^("A["))]"" Q
 . N % S %=DINDEX("START") N DINDEX S DINDEX="",DINDEX("#")=1,DINDEX("START")=%
 . S Y=X D S^DIC3 I '$T S Y=-1 Q
 . N DZ,DS,DIX,DIC5D S DIC5D=D,DS=1,DIX=X D ADDKEY^DIC3,GOT^DIC2 Q:Y>0
 . D DO^DIC1 S D=DIC5D
 I T["P"!(T["V"),DIC(0)'["U" S DISKIPIX=D
 Q
 ;
SPACEBAR ; Lookup last record selected by this user when user enters space bar return.  Called from ^DIC
 N % S %=DINDEX("START") N DINDEX S DINDEX="",DINDEX("#")=1,DINDEX("START")=%
 D S^DIC3 I '$T S Y=-1 Q
 N DZ,DS,DIX S DS=1,DIX=X D ADDKEY^DIC3,GOT^DIC2 Q
 ;
KEEPON ; If DIC(0)["T", display entries found so far, then check for internal value if index is date, set, pointer, VP.  Called from ^DIC3.
 I DS D  Q:Y>0!($G(DTOUT))!($G(DIROUT))
 . N I M I=X N X M X=I S I=D N D S D=I K I
 . I DS=1 D
 . . S DS("DD")=1 D G^DIC2 Q
 . E  I $G(DS("DD"))'=DS D Y^DIC1 I '$D(DIROUT),$D(DUOUT) K DUOUT ;22*70
 . K DD,DS,DIX,DIYX S (DD,DS,DS("DD"))=0
 . S:DIC(0)["E" DS(0,"HDRDSP",DIFILEI)=1
 . S DS(0)=$S(Y>0:"1^"_+Y,$G(DTOUT):"1^T",$G(DIROUT):"1^U",1:0)
 . Q
 Q:DIC(0)["U"  I DINDEX=DINDEX("START"),$G(DINDEX("#"))>1 Q
 N I M I=X N X M X=I S I=D N D S D=I K I
 D 1^DICM
 K DD,DS,DIX,DIYX S (DD,DS,DS("DD"))=0
 S DS(0)=$S(Y>0:"1^"_+Y,$G(DTOUT):"1^T",$G(DIROUT):"1^U",1:0)
 Q
 ;
PTRID(DO,DIC) ; Build code in DIC("W") to display Identifiers on pointed-to files
 N DIFILEI,DIGBL,DIOGBL S DIFILEI=+DO(2),DIOGBL=DIC
 F  S DIFILEI=+$P($P($G(^DD(DIFILEI,.01,0)),U,2),"P",2) Q:'DIFILEI  S DIGBL=$G(^DIC(DIFILEI,0,"GL")) Q:DIGBL=""  D Q
 Q
Q ; Build Identifier code for a single pointed-to file
 N DIGBL1 S DIGBL1=DIGBL
 I DIGBL[$C(34) S DIGBL1=$$CONVQQ^DILIBF(DIGBL)
 N N,O,% S N=$O(DIC("W",999999),-1)
 S O=$S(N:DIC("W",N),1:DIC("W"))
 N % S %="I '$G(DICR) S DIEN=+"_DIOGBL_"DIEN,0) I $D("_DIGBL_"DIEN,0)) S DIFILEI="_DIFILEI_",DIGBL="""_DIGBL1_""" D WOV^DICQ1"
 S DIOGBL=DIGBL
 I ($L(O)+$L(%))<230 D  Q
 . I 'N S DIC("W")=DIC("W")_" "_% Q
 . S DIC("W",N)=DIC("W",N)_" "_% Q
 S N=N+1,DIC("W",N)=%
 I N=1 S DIC("W")=DIC("W")_" X DIC(""W"",1)" Q
 S DIC("W",N-1)=DIC("W",N-1)_" X DIC(""W"","_N_")"
 Q
 ;

DICA
DICA ;SEA/TOAD-VA FileMan, Updater, Engine ;18APR2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ADD(DIFLAGS,DIFDA,DIEN,DIMSGA) ;
 ;
ADDX ; Branch in from UPDATE^DIE
 ; ENTRY POINT--add a new entry to a file
 ; subroutine, DIEN passed by reference
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DICLERR S DICLERR=$G(DIERR) K DIERR
INPUT ;
 ; initialize input parameters & check
 N DIRULE S DIRULE=$$GETTMP^DIKC1("DICA")
 N DIFDAO
 S DIFLAGS=$G(DIFLAGS)
 I $TR(DIFLAGS,"EKSUY")'="" D  Q
 . D ERR^DICA3(301,"","","",DIFLAGS),CLOSE
 S DIFDA=$G(DIFDA) I $D(@DIFDA)<10 D  Q
 . D ERR^DICA3(202,"","","","FDA"),CLOSE
 S DIFDAO=DIFDA
 S DIEN=$G(DIEN) I DIEN="" S DIEN="DIDUMMY" N DIDUMMY
PRE ;
 N DIOK S DIOK=1 D CHECK^DICA1(DIFLAGS,.DIFDA,DIEN,DIRULE,.DIOK)
 I $G(DIERR) D CLOSE Q
 I 'DIOK D ERR^DICA3(202,"","","","FDA"),CLOSE Q
SEQ ;
 N DICHECK,DIENTRY,DIFILE,DIOUT1,DINEXT
 S (DIOUT1,DINEXT)="" F  D  Q:DIOUT1
 . S DINEXT=$O(@DIRULE@("NEXT",DINEXT)) I DINEXT="" S DIOUT1=1 Q
 . X @DIRULE@("NEXT",DINEXT)
FILES . ;
 . I $P($G(^DD($$FNO^DILIBF(DIFILE),0,"DI")),U,2)["Y" D  Q:DIOUT1  ;Entries in file cannot be edited.
 . . S DIOUT1=DIFLAGS'["Y"&'$D(DIOVRD)
 . . I DIOUT1 D ERR^DICA3(405,DIFILE,"","",DIFILE)
ENTRIES . ;
 . N DIDA,DIENP,DIOP,DIROOT,DISEQ
 . S DIDA=$P(DIENTRY,",") I +DIDA=DIDA Q
 . S DIENP=$$IEN(DIENTRY,"",DIRULE)
 . S DIOP=$E(DIDA,1,2) I DIOP'="?+" S DIOP=$E(DIOP)
 . S DISEQ=$P(DIDA,DIOP,2)
FINDING . ;
 . ; Finding (?) or LAYGO/FInding (?+) nodes
 . I DIOP["?" D  Q
 . . I DIOP="?+",DIENP[",," S @DIRULE@("NEXTADD",DINEXT)=@DIRULE@("NEXT",DINEXT) Q
 . . N DIFIND,DIFORMAT,DIGET,DIINDEX,DIVALUE
 . . S DIFORMAT="B"_$S(DIFLAGS["E":"",1:"Q")_$S(DIOP="?+":"X",1:"")
 . . S DIGET=DIFDA
 . . I DIFLAGS["E",DIOP["?" S DIGET=DIFDAO
 . . I DIFLAGS["K",$D(^TMP("DIKK",$J,"P",DIFILE))#2 D
 . . . D GETKVALS(.DIVALUE,.DIINDEX)
 . . E  S DIVALUE=$G(@DIGET@(DIFILE,DIENTRY,.01))
 . . S DIFIND=$$FIND1^DIC(DIFILE,DIENP,DIFORMAT,.DIVALUE,$G(DIINDEX))
 . . I $G(DIERR) S DIOUT1=1 Q
 . . I DIOP="?+",'DIFIND S @DIRULE@("NEXTADD",DINEXT)=@DIRULE@("NEXT",DINEXT) Q
 . . I 'DIFIND S DIOUT1=1 D  Q
 . . . I $D(DIVALUE)=10 N I,Q S DIVALUE="",(I,Q)=0 F  S I=$O(DIVALUE(I)) Q:'I  D  Q:Q
 . . . . Q:DIVALUE(I)=""
 . . . . S:DIVALUE]"" DIVALUE=DIVALUE_";"
 . . . . I $L(DIVALUE)+$L(DIVALUE(I))>252 D
 . . . . . S DIVALUE=$E(DIVALUE,1,252)_$E(DIVALUE(I),1,252-$L(DIVALUE))_"..."
 . . . . . S Q=1
 . . . . E  S DIVALUE=$G(DIVALUE)_$E(DIVALUE(I),1,251)
 . . . D ERR^DICA3(703,DIFILE,DIENTRY,"",DIVALUE)
 . . S @DIEN@(DISEQ)=DIFIND
 . . I DIOP="?+" S @DIEN@(DISEQ,0)="?"
 . . S @DIRULE@("IEN",DISEQ)=DIFIND
 . . I DIFLAGS["K",$D(^TMP("DIKK",$J,"P",DIFILE)) D SAVEK Q
 . . D SAVE
 . ; Adding (+) nodes
 . I '$G(DICHECK) S DICHECK=1 D ADDLF S:DIENP[",," DIENP=$$IEN(DIENTRY,"",DIRULE) I $G(DIERR) S DIOUT1=1 Q
 . D ADDING
 ;
FILER ; file the data for the new records
 I '$G(DIERR),$D(@DIFDA) D
 . I '$G(DICHECK) D ADDLF Q:$G(DIERR)!'$D(@DIFDA)  ;QUITS HERE WHEN KEY IS BAD!
 .K ^TMP("DIKK",$J,"L") D FILE^DIEF($E("S",DIFLAGS["S")_"U",DIFDA,"",DIEN) ;GFT  Artf8720:recursive UPDATE^DIE call would look at KEY
 I '$G(DIERR),DIFLAGS'["S" K @DIFDAO
 I $G(DIERR)!(DIFLAGS["S"),DIFLAGS'["E" D
 . M @DIFDA=@DIRULE@("SAVE")
 D CLOSE
 Q
 ;
ADDING ;
 N DIENEW,DIKEY
 I $L(DIENP,",")>2 S DIOK=$$VMINUS9^DIEFU(DIFILE,DIENP) I 'DIOK D  Q
 . S DIOUT1=1
 . D ERR^DICA3(602,DIFILE,$P(DIENP,",",$L(DIENP,",")-1))
 S DIROOT=$$ROOT^DIQGU(DIFILE,DIENP)
 D DA^DILF(DIENTRY,.DIENEW)
A1 S DIENEW=$$IEN(DIENTRY,$G(@DIEN@(DISEQ)),DIRULE)
 S DIKEY=$G(@DIFDA@(DIFILE,DIENTRY,.01)) I DIKEY="" D  Q
 . S DIOUT1=1 D ERR^DICA3(202,"","","","FDA")
 S DIOK=$$LAYGO(DIFILE,.DIENEW,DIKEY)
 I 'DIOK S DIOUT1=1 D  Q
 . I '$G(DIERR) D ERR^DICA3(405,DIFILE,"","",DIFILE) Q
 . N DIENS S DIENS="New entry"
 . I $L(DIENEW,",")>2 S DIENS=DIENS_" under record: "_DIENEW
 . N DI1 S DI1="LAYGO Node on the new value '"_DIKEY_"'"
 . D ERR^DICA3(120,DIFILE,DIENS,.01,DI1)
 D CREATE^DICA3(DIFILE,.DIENEW,DIROOT,DIKEY) ;THIS SHOULD SET DIERR
 S DIENEW=+DIENEW
 I 'DIENEW S DIOUT1=1 Q
 L -@(DIROOT_"DIENEW)")
 S @DIEN@(DISEQ)=DIENEW ;SET RETURN VALUE
 I DIOP="?+" S @DIEN@(DISEQ,0)="+" ;SET ZERO NODE IN IEN ARRAY
 S @DIRULE@("IEN",DISEQ)=DIENEW
 D SAVE
 Q
 ;
LAYGO(DIFILE,DIEN,DIKEY) ;
 ; ADDING--return if LAYGO permitted
 ; function, all by value
 N DA,DIOK,DINODE,DIOUTS,X,Y,Y1
 S DIOK=1,DINODE="",DIOUTS=0 F  D  I DIOUTS!'DIOK Q
 . S DINODE=$O(^DD(DIFILE,.01,"LAYGO",DINODE))
 . I DINODE'>0 S DIOUTS=1 Q
 . I $D(^DD(DIFILE,.01,"LAYGO",DINODE,0))[0 Q
 . S X=DIKEY M DA=DIEN S Y=$P(DA,","),Y1=DA,DA=$P(DA,",")
 . I 1 X ^DD(DIFILE,.01,"LAYGO",DINODE,0) S DIOK=$T&'$G(DIERR)
 Q DIOK
 ;
SAVE I DIFLAGS'["E" D
 . S @DIRULE@("SAVE",DIFILE,DIENTRY,.01)=@DIFDA@(DIFILE,DIENTRY,.01)
 K @DIFDA@(DIFILE,DIENTRY,.01)
 Q
 ;
SAVEK ; Remove primary key field from FDA; save in ^TMP first if necessary
 N DIFLD
 S DIFLD=0
 F  S DIFLD=$O(^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD)) Q:'DIFLD  D
 . Q:'^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD)
 . Q:$D(@DIGET@(DIFILE,DIENTRY,DIFLD))[0
 . S:DIFLAGS'["E" @DIRULE@("SAVE",DIFILE,DIENTRY,DIFLD)=@DIFDA@(DIFILE,DIENTRY,DIFLD)
 . K @DIFDA@(DIFILE,DIENTRY,DIFLD)
 Q
 ;
IEN(DIENTRY,DIENF,DIRULE) ;
 ; ADDING/FINDING--return translated IEN String
 ; function, DIENTRY passed by value
 N DIC,DIENEW,DIOP,DIP,DIPNEW,DISEQ
 S DIENEW=""
 S DIENF=$G(DIENF)
 S DIP="" F DIC=1:1 D  I DIP="" Q
 . S DIP=$P(DIENTRY,",",DIC) I DIP="" Q
 . D
 . . I +DIP=DIP S DIPNEW=DIP Q
IEN1 . . I DIC=1 S DIPNEW=DIENF Q
 . . S DIOP=$E(DIP,1,2) I DIOP'="?+" S DIOP=$E(DIOP)
 . . S DISEQ=$P(DIP,DIOP,2,9999)
 . . S DIPNEW=$G(@DIRULE@("IEN",DISEQ))
 . S $P(DIENEW,",",DIC)=DIPNEW
 I DIENEW'="" S DIENEW=DIENEW_","
 Q DIENEW
 ;
CLOSE I DICLERR'=""!$G(DIERR) D
 . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 I $G(DIMSGA)'="" D CALLOUT^DIEFU(DIMSGA)
 K @DIRULE,^TMP("DIKK",$J)
 Q
 ;
GETKVALS(DIVALUE,DIINDEX) ; Get primary key values and uniq index
 N DIFLD,DIKEY,DISQ
 K DIVALUE
 S DIKEY=$P(^TMP("DIKK",$J,"P",DIFILE),U),DIINDEX=$P(^(DIFILE),U,4)
 Q:DIINDEX=""!'DIKEY
 ;
 S DIFLD=0
 F  S DIFLD=$O(^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD)) Q:'DIFLD  D
 . S DISQ=^TMP("DIKK",$J,"P",DIFILE,DIFILE,DIFLD) Q:'DISQ
 . Q:$D(@DIGET@(DIFILE,DIENTRY,DIFLD))[0
 . S DIVALUE(DISQ)=@DIGET@(DIFILE,DIENTRY,DIFLD)
 Q
 ;
ADDLF ; Check key integrity
 I $D(^TMP("DIKK",$J,"L")),'$$CHECK^DIEVK(DIFDA,DIFLAGS,DIEN) Q
 ;
 ; Add records for LAYGO/Finding nodes which were not found
 N DINEXT
 S (DINEXT,DIOUT1)=""
 F  S DINEXT=$O(@DIRULE@("NEXTADD",DINEXT)) Q:DINEXT=""  D  Q:DIOUT1
 . N DIENP,DIFILE,DIENTRY,DIOP,DIROOT,DISEQ
 . X @DIRULE@("NEXTADD",DINEXT)
 . S DIENP=$$IEN(DIENTRY,"",DIRULE)
 . S DIOP="?+"
 . S DISEQ=$P($P(DIENTRY,","),DIOP,2)
 . D ADDING
 Q

DICA1
DICA1 ;SEA/TOAD-VA FileMan: Updater, Pre-Processor ;11:57 AM  6 Sep 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, 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=$$FILENAME^DIALOGZ(DIFILE) S:DIFILNAM?." " DIFILNAM="#"_DIFILE ;**CCO/NI
 N DIFLDNAM S DIFLDNAM=$$FLDNM^DIEFU(DIFILE,DIFIELD)
 D ERR^DICA3(712,DIFILE,"",DIFIELD,DIFLDNAM,DIFILNAM)
 Q

DICA2
DICA2 ;SEA/TOAD-VA FileMan: Updater, Pre-Processor Part 2 ;8:12 AM  10 Jun 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
IEN(DIFILE,DIEN,DIDA,DIRULE,DIOK) ;
 ; ENTRY POINT--return whether the IEN String is valid
 ; proc, DIEN passed by value
 I $G(DIFILE("C"))'=DIFILE D PARENTS^DIDU1(.DIFILE,DIRULE)
 I $E(DIEN,$L(DIEN))'="," D ERR^DICA3(304,"",DIEN) Q
 I DIFILE("L")+1'=$L(DIEN,",") D ERR^DICA3(205,"",DIEN,"",DIFILE) Q
 I $E(DIEN)=","!(DIEN[",,") D ERR^DICA3(307,"",DIEN) Q
 K @DIRULE@("TEMP")
PIECES ;
 K DIDA N DICRSR,DIOUT S DIOUT=0 F DICRSR=1:1 D  Q:DIOUT!$G(DIERR)
 . N DIPIECE S DIPIECE=$P(DIEN,",",DICRSR)
 . N DIRIGHT S DIRIGHT=$P(DIEN,",",DICRSR+1,99999)
 . I DIPIECE="" S DIOUT=1,DIOK=1 Q
 . D PIECE(.DIFILE,DIFDA,DIRULE,DICRSR,DIPIECE,.DIDA,DIRIGHT,.DIOK)
 . I $G(DIERR) S DIOK=0 Q
 . I 'DIOK D ERR^DICA3($S(DIOK=0:308,1:310),"",DIEN) Q
 . Q
 I $G(DIERR) Q
ALLGOOD ;
 M @DIRULE@("SEQ")=@DIRULE@("TEMP")
 N DIN S DIN="S DIFILE="_DIFILE_",DIENTRY="""_DIEN_""""
 S @DIRULE@("ORDER",@DIRULE@("OP"),DIFILE("L"),DIFILE,@DIRULE@("NUM"))=DIN
 Q
 ;
PIECE(DIFILE,DIFDA,DIRULE,DICRSR,DIPIECE,DIDA,DIRIGHT,DIOK) ;
 ; IEN--return whether a piece of the IEN String is valid
 ; proc, DIF, DIOK, & DIRULE passed by ref
 N DICHECK,DIF,DIPREFIX,DIR,DISEQ
 S DIF=DIFILE(DICRSR)
 I DIPIECE'["+",DIRIGHT["+" S DIOK=0 Q
FILING I +DIPIECE=DIPIECE,$E(DIPIECE)'="+" D  Q
 . S DIOK=DIPIECE>0 I 'DIOK Q
 . S DIOK=DIRIGHT'["+"&(DIRIGHT'["?") I 'DIOK Q
 . S DIR=$G(@DIRULE@("ROOT",DIF,","_DIRIGHT))
 . I DIR="" D
 . . S DIR=$$ROOT^DIQGU(DIF,","_DIRIGHT,1,1)
 . . S @DIRULE@("ROOT",DIF,","_DIRIGHT)=DIR
 . S DIOK=$P($G(@DIR@(DIPIECE,0)),U)'=""
 . I 'DIOK D ERR^DICA3(601,DIFILE,DIPIECE_","_DIRIGHT) Q
 . I DICRSR=1 S DIDA=DIPIECE
 . E  S DIDA(DICRSR-1)=DIPIECE
 . I DICRSR'=1 Q
 . S @DIRULE@("OP")=4
 . S @DIRULE@("NUM")=DIPIECE
PREFIX S DIPREFIX=$E(DIPIECE,1,2) I DIPREFIX'="?+" S DIPREFIX=$E(DIPREFIX)
 I DIPREFIX'="+",DIPREFIX'="?",DIPREFIX'="?+" S DIOK=0 Q
 ;
GOODPC I $P(DIPIECE,DIPREFIX,2,9999)?1N.N S DIOK=1 D  Q
 . S DISEQ=$P(DIPIECE,DIPREFIX,2,999)
 . I +DISEQ'=DISEQ S DIOK=0 Q
FIRSTPC . I DICRSR=1 D
 . . S @DIRULE@("OP")=$S(DIPREFIX="?":1,DIPREFIX="?+":2,1:3)
 . . S @DIRULE@("NUM")=DISEQ
WHEREPC . S DICHECK=""
 . I $D(@DIRULE@("SEQ",DISEQ)) S DICHECK=$NA(@DIRULE@("SEQ"))
 . E  I $D(@DIRULE@("TEMP",DISEQ)) S DICHECK=$NA(@DIRULE@("TEMP"))
ILLEGAL . I DICHECK'="" D  I 'DIOK Q
 . . I $O(@DICHECK@(DISEQ,""))'=DIPREFIX S DIOK="C" Q
 . . I $O(@DICHECK@(DISEQ,DIPREFIX,""))'=DIF S DIOK="C" Q
 . . I $G(@DICHECK@(DISEQ,DIPREFIX,DIF))'=DIRIGHT S DIOK="C" Q
 . I DICHECK="",'$D(@DIFDA@(DIF,DIPIECE_","_DIRIGHT)) S DIOK="C" Q
LEARN . S @DIRULE@("TEMP",DISEQ,DIPREFIX,DIF)=DIRIGHT
 . I DICRSR=1 S DIDA=DIPREFIX
 . E  S DIDA(DICRSR-1)=DIPREFIX
 ;
BADPIEC S DIOK=0 Q

DICA3
DICA3 ;SEA/TOAD-VA FileMan: Updater, Adder ;16FEB2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CREATE(DIFILE,DIEN,DIROOT,DIVALUE) ;If DIEN comes in with a leading number, use it as IEN
 N DIENP S DIENP=","_$P(DIEN,",",2,999)
 S DIEN=$P(DIEN,",")
 N DINEXT S DINEXT=$P($G(@(DIROOT_"0)")),U,3)
 I DINEXT="" D  I $G(DIERR) S DIEN="" Q
 . N DIHEADER S DIHEADER=$$HEADER^DIDU2(.DIFILE,DIENP)
 . I '$G(DIERR) S @(DIROOT_"0)")=DIHEADER
GETNUM ;
 N DINUM,DIFAUD S DINUM=DIEN'="",DIFAUD=0 I 'DINUM S DIEN=DINEXT\1 I $D(^DIA(DIFILE,"B")) S DIFAUD=DIFILE
 N DIFAIL,DIOUT S DIFAIL=0,DIOUT=0 F  D  I DIOUT!DIFAIL Q
 . I 'DINUM S DIEN=DIEN+1 I $D(@(DIROOT_"DIEN)")) Q  ;**GFT LOOK BEFORE LOCKING
 . I DIFAUD,+$O(^DIA(DIFAUD,"B",DIEN_","))=DIEN!$D(^(DIEN)) Q  ;**GFT   DON'T PICK AN ALREADY-AUDITED NUMBER
 . I DIEN'>0 D ERR(202,DIFILE,DIEN,.01,"ASSIGNED IEN") S DIFAIL=1 Q  ;ARTF10963 -- "The input parameter that identifies the ASSIGNED IEN is missing or invalid."
 . D LOCK^DILF(DIROOT_"DIEN)") ;**147
 . I '$T S DIFAIL=DINUM Q:'DIFAIL  D ERR(110,DIFILE,DIEN_DIENP) Q  ;RECORD IS LOCKED
ZERO . I $D(@(DIROOT_"DIEN,0)")) L -@(DIROOT_"DIEN)") D  Q
 . . S DIFAIL=DINUM I 'DIFAIL Q  ;COULDN'T DO DINUM!
 . . D ERR(302,DIFILE,DIEN_DIENP) ;ENTRY ALREADY EXISTS
 . S DIOUT=1
 I DIFAIL S DIEN="" Q
SETREC ;
 N DICAFILE M DICAFILE=DIFILE N DIFILE
 S @(DIROOT_"DIEN,0)")=DIVALUE
 D LOCK^DILF(DIROOT_"0)") ;**147
 S $P(^(0),U,3,4)=DIEN_U_($P(@(DIROOT_"0)"),U,4)+1)
 I  L -@(DIROOT_"0)")
 S DIEN=DIEN_DIENP
 D XA^DIEFU(DICAFILE,DIEN,.01,DIVALUE,"")
 D INDEX^DIKC(DICAFILE,DIEN,.01,"","SC")
 Q
 ;
PROOT(DIFILE,DIEN) ;
 ; ENTRY POINT--return the global root of a subfile's parent
 ; extrinsic function, all passed by value
 N DIENP S DIENP=$P(DIEN,",",2,999)
 Q $NA(@$$ROOT^DILFD($$PARENT(DIFILE),DIENP,1)@(+DIENP))
 ;
PARENT(DIFILE) ;
 ; ENTRY POINT--return the file number of a subfile's parent
 ; extrinsic function, all passed by value
 Q $G(^DD(DIFILE,0,"UP"))
 ;
SUBFILE(DIFILE) ;
 ; ENTRY POINT--return whether the file is a subfile
 ; extrinsic function, passed by value
 Q $D(^DD(DIFILE,0,"UP"))#2
 ;
ERR(DIERN,DIFILE,DIIENS,DIFIELD,DI1,DI2,DI3) ;
 ; error logging procedure
 N DIPE
 N DI F DI="FILE","IENS","FIELD",1:1:3 S DIPE(DI)=$G(@("DI"_DI))
 D BLD^DIALOG(DIERN,.DIPE,.DIPE)
 Q

DICATT
DICATT ;SFISC/GFT,XAK-MODIFY FILE ATTR ;25MAY2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $D(DIAX) S %=2
 E  S %=$$SCREEN^DIBT("^D SCREENQ^DICATT") Q:%=U  S %=2-%
 G ^DICATTD:%=1 Q:%<2  ;JUMP TO THE SCREENMAN EDITOR
 S DLAYGO=1 D D^DICRW Q:Y<0  I $P($G(^DD(+Y,0,"DI")),U)["Y",($P(@(^DIC(+Y,0,"GL")_"0)"),U,4)) W !!,$C(7),"DATA DICTIONARY MODIFICATIONS ON ARCHIVE FILES ARE NOT ALLOWED!" Q
 I '$D(DIC) D DIE^DIB Q:'$D(DG)  S DIC=DG
 S:$D(DIAX) DIAXDIC=+$P(@(DIC_"0)"),U,2)
EN ;
 K I S Q="""",I(0)=DIC,B=+$P(@(DIC_"0)"),U,2),S=";"
B ;
 K DA,J,DIU0,DDA S A=B,DICL=0,J(0)=B,DDA=""
M ;
 I $G(Z)["W",A-B G B
 W !!! K O,DQ,DIC,DIE,DG,M G Q^DIB:$D(DTOUT)
 S O=1,E=0,DIC(0)="ALEQIZ",DIC="^DD("_A_"," S:$D(DICS) DIC("S")=DICS
 S DIC("W")="S %=$P(^(0),U,2) I % W $P(""  (multiple)^  (word-processing)"",U,$P(^DD(+%,.01,0),U,2)[""W""+1)"
 I $P(^DD(A,.01,0),U,2)["W" S DIC(0)="AEQZ",DIC("B")=.01
 E  I $D(DA),$D(^DD(A,DA,0)),'$P(^(0),U,2),$P(^(0),U,4)'?.P S E=DA
 D ^DIC S:$P(Y,U,3) DDA="N" I Y<0 G B:A-B,Q^DICATT2 ;IF NO FIELD IS CHOSEN, POP UP.  IF AT TOP LEVEL OF FILE, QUIT OUT
SV I '$P(Y,U,3) S DIU0=A,O(1)=$P(^DD(A,+Y,0),U,1,2),O(2)=$S($D(^(.1)):$P(^(.1),U),1:""),DDA="E" D SV^DICATTA
 S DDA(1)=A
 S DIAC="AUDIT",DIFILE=A D ^DIAC S O=+% K DIAC,DIFILE
SKP S (D0,DA)=+Y,DA(1)=A,DIE=DIC,M=Y(0),T=$P(M,U,2) S:T["C"!(T["W") O=0
 S DR=$P(".01:.1;",U,DUZ(0)="@"!'$F(T,"X"))_$P("1.1;",U,T'["C")_$S(DUZ(0)="@"&(T'["C"):"1.2;",1:"")_$S(T["C":"8;",1:"8:9;10:")_"11;20:29"
 S O=$S($P(Y,U,3):0,1:1_U_$P(M,U,2,99)),F=$P(M,U) K DIC,DQI
 S X=0 F  S X=$O(^DD(A,DA,1,X)) Q:X'>0  I +^(X,0)=B,$P(^(0),B,2)?1"^"1.A S DQI=$P(^(0),U,2)
 G MULTIPLE:T
 I O D  Q:$D(DTOUT)  I '$D(DA) G N:$P(O,U,4)?.P,^DICATT4 ;IF DELETING THE FIELD, CLEANUP IN 'DICATT4' UNLESS IT WAS A COMPUTED FIELD
 .N DICASPEC S DICASPEC=$P(^DD(A,DA,0),U,2)
 .D DIE ;EDIT THE CHARACTERISTICS OF A SINGLE-VALUED FIELD
 .I '$D(DA) S DDA="D" Q
 .I DICASPEC'=$P(^DD(A,DA,0),U,2),$G(^DD(B,0,"DIK"))]"" D
 ..N A D EN2^DIKZ(B,"",^("DIK")) ;Recompile CROSS-REFS if auditing changes
 G TYPE^DICATT2
 ;
MULTIPLE ;EDIT THE CHARACTERISTICS OF A MULTIPLE FIELD
 S DR=".01;8;9;10:11;20:29" D DIE I '$D(DA) S DDA="D" S DQ(+T)=0 G NEW^DICATT4
 S X=$P($P(M,U,4),";"),M=^DD(A,DA,0),E=$P(M,U),A=+T,DICL=DICL+1,J(DICL)=A,Y=$E(Q,+X'=X),I(DICL)=Y_X_Y I E'=F S ^(0)=E_" SUB-FIELD^"_$P(^DD(A,0),U,2,9) K ^(0,"NM") S ^("NM",E)=""
 G 5:$P(M,U,2)["W",N ;NOW WE ARE DOWN TO LOWER-LEVEL MULTIPLE
 ;
 ;
E S DE=^DD(A,E,0) W $P(DE,U) Q
 ;
P S DI=DIU0 D:$D(O(1))
 .I '$D(DA) S DA=D0 D DIPZ^DIU0 Q
 .I $D(^DD(DI,DA,0)),O(1)'=$P(^(0),U,1,2) D DIPZ^DIU0 Q
 .I $D(^(.1)),O(2)'=$P(^(.1),U) D DIPZ^DIU0 Q
 K DIU0 Q
 ;
N D:DDA]"" AUDIT^DICATT22(DDA(1),D0,DDA) ;FINISH THIS FIELD, GO BACK TO RE-ASK ANOTHER FIELD
 D:$D(DIU0) P S DIZZ=$S(('O&$D(DIZ)):DIZ,1:$P(O,U,2,3)) G M
 ;
X W $C(7),"    '",F,"' DELETED!" S DDA=$S(DDA="":"D",1:"")
 S DIK="^DD(A,",DA(1)=A D ^DIK G N
 ;
CHECK G:$P(^DD(A,DA,0),U,2)']"" X:$D(DTOUT) G NO^DICATT2
 ;
DIE ;
 N I,J,DICATTED,A,B
 S DICATTED=1 D ^DIE ;'DA' VARIABLE IS KILLED IF USER KILLS THE FIELD BY DELETING THE LABEL
 Q
 ;
 ;
 ;
0 S C=$P(O,U,5,99) G @N ;COME HERE FROM 2 PLACES IN DICATT2.  GO DEPENDS ON DATA TYPE (1-9)
1 ;
2 G ^DICATT0
3 ;
4 G ^DICATT6
5 S W="0;1",(Z,DIZ)="W^",C="Q",V=1,L=1 G ^DICATT2:O,SUB^DICATT1
6 G ^DICATT3 ;COMPUTED
7 G ^DICATT5
8 G VP^DICATT4
9 S (Z,DIZ)="K^",V=0,C="K:$L(X)>245 X D:$D(X) ^DIM",L=245
 S:$P(^DD(A,DA,0),U,4)]"" W=$P(^(0),U,4) G ^DICATT2:O,SUB^DICATT1
 ;
SCREENQ ;
 W !,"'YES' will invoke the ScreenMan editor.",!,"The same questions are asked in both screen & scrolling mode."

DICATT0
DICATT0 ;SFISC/GFT,XAK-DATES, NUMERIC ;1/7/2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 17
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G @N
 ;
DIE K Y S DP=0 F  S DL=1,DP=$O(DQ(DP)) Q:DP=""  S:$D(DE(DP)) DG(DP)=DE(DP)
 S DP=-1 D DQ^DIED K DQ,DICATTZ G CHECK^DICATT:$D(Y)!$D(DTOUT),@(N_0)
 ;
1 S %DT="E",DQ="^I X'?1""DT"".NP D ^%DT S X=Y K:Y<0 X",DQ(1)="EARLIEST DATE (OPTIONAL)^D^^1"_DQ,DQ(0,2)="S:'$L(X) Y=""CAN""",DQ(3)="LATEST DATE^RD^^3"_DQ_" I $D(X),X<DG(1) K X"
 S P="<X!(" I C[P S DE(1)=$P($P(C,P,2),">X",1),DE(3)=$P($P(C,"K:",2),P,1)
 S DQ(4)="CAN DATE BE IMPRECISE (Y/N)^S^Y:YES;N:NO;^4^Q",DE(4)=$E("YN",$P(C,Q,2)["X"+1),DQ(4,3)="E.G., WOULD 'FEB, 1980' BE ALLOWED?"
 S DQ(5)="CAN TIME OF DAY BE ENTERED (Y/N)^S^Y:YES;N:NO;^5^S:X=""N"" (DG(7),DG(6))=X K:X=""N"" DQ(6)"
 S DQ(6)="CAN SECONDS BE ENTERED (Y/N)^S^Y:YES;N:NO;^6^S DG(6)=X",DE(6)=$E("NY",$P(C,Q,2)["S"+1)
 S DE(5)=$E("NY",$P(C,Q,2)["T"+1),DQ(5,3)="CAN USER ENTER TIME ALONG WITH DATE, AS IN 'JULY 20@4:30'?"
 S DQ(7)="IS TIME REQUIRED (Y/N)^S^Y:YES;N:NO;^7^Q",DQ(7,3)="MUST USER ENTER TIME ALONG WITH DATE",DQ(0,6)="I X=""N"" S Y=U,DQ=DQ+1",DE(7)=$E("NY",$P(C,Q,2)["R"+1)
 S DICATTZ=1 G DIE
 ;
10 S C="S %DT=""E"_$E("S",DG(6)="Y")_$E("T",DG(5)="Y")_$E("X",DG(4)="N")_$E("R",DG(7)="Y")_""" D ^%DT S X=Y K:"
 F X=1,3 G ND:'$D(DG(X)) S Y(X)=$S(DG(X):DG(X)\10000+1700,1:DG(X)) I DG(X)#100 S Y(X)=DG(X)#100_"/"_Y(X) I $E(DG(X),4,5) S Y(X)=+$E(DG(X),4,5)_"/"_Y(X)
 I DG(1)]"" S M="Type a date between "_Y(1)_" and "_Y(3)_".",C=C_DG(3)_P_DG(1)_">X) X" G ED
ND S C=C_"Y<1 X"
ED S Z="D^",L=DG(5)="Y"*5+7,DG(6)="" G H
 ;
2 K DG S DQ("A1")="!(X'["".""&($L(X)>15))!(X["".""&($L($P(+X,"".""))+$L($P(+X,""."",2))>15)) X"
 S DQ(1)="INCLUSIVE LOWER BOUND^R^^1^K:+X'=X"_DQ("A1"),DQ(2)="INCLUSIVE UPPER BOUND^R^^2^K:X<DG(1)!(+X'=X)"_DQ("A1"),DQ(3)="IS THIS A DOLLAR AMOUNT (Y/N)^S^Y:YES;N:NO;^3^Q" K DQ("A1")
 S P="1"".""",Z=$S(C["$":3,1:+$P(C,P,2)),DE(3)=$E("NY",C["$"+1),DE(5)=$S(Z:Z-1,1:0)
 S DQ(0,4)="S:X=""Y"" Y=U,DQ=9,DG(5)=2",DQ(5)="MAXIMUM NUMBER OF FRACTIONAL DIGITS^RN^^5^K:X'?1N X"
 I O S DE(1)=+$P(C,"X<",2),DE(2)=+$P(C,"X>",2)
 G DIE
20 I DG(1)>DG(2) W $C(7),"??" G 2
 S M="Type a "_$P("number^dollar amount",U,DG(3)="Y"+1)_" between "_DG(1)_" and "_DG(2)_", "_DG(5)_" decimal digit"_$E("s",DG(5)'=1)_"."
 S C="K:+X'=X",T=DG(5)+1,Z="!(X?.E"_P_T_"N.N)"
 I DG(3)="Y",DA-.001 S C="S:X[""$"" X=$P(X,""$"",2) K:X'?"_$P(".""-""",U,DG(1)<0)_".N."_P_".2N",Z=""
 S C=C_"!(X>"_DG(2)_")!(X<"_DG(1)_")"_Z_" X",L=$L(DG(2)\1)+T-(T=1),Z="NJ"_L_","_DG(5)_U
H S DIZ=Z G ^DICATT1

DICATT1
DICATT1 ;SFISC/GFT,XAK-NODE AND PIECE, SUBFILE ;21APR2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I DA=.001 S W=" " G 2
 S (DG,W)=$P(O,U,4) G M:W="" S T=0,DP=DA,Y=$P(W,";"),N=$P(W,";",2) D MX S L=L-T D MAX I T+3<$G(^DD("STRING_LIMIT"),255) S W=DG G ^DICATT2
 D TOO G NO^DICATT2
M K DE,DG W !,"WILL "_F_" FIELD BE MULTIPLE" S %=2 D YN^DICN I % S V=%=1 G BACK:%<0,SUB
 W !,"FOR A GIVEN ENTRY, WILL THERE BE MORE THAN 1 "_F,!," ON FILE AT ONCE?" G M
E ;
 S V=0,DE(3)=$S($D(^(3)):^(3),1:""),T=0,DP=E,N=$P($P(DE,U,4),";",2) D MX S L=T
SUB S:$P(DIZ,"^")["K" V=1 S T=0 F Y=0:1 Q:'$D(^DD(A,"GL",Y+1))
 D MAX:'V I T>245!$D(^DD(A,"GL",Y,0))!V S Y=$S(+Y=Y:Y+1,1:$C($A(Y)+1))
 G SB:DUZ(0)'="@"
 W !!,"SUBSCRIPT: ",Y,"// " R X:DTIME S:'$T X=U,DTOUT=1 S:X="" X=Y
 I X'?.ANP W !?5,$C(7),"Control Characters are not allowed." G SUB
 I +X'=X G BACK:X[U,DICATT1^DIQQQ:X["?" I X?1P.E!(X[",")!(X[":")!(X[S)!(X[Q)!(X["=") G SUB
 I Y'=X S Y=X D MAX I T+5>$G(^DD("STRING_LIMIT"),255) D TOO G SUB
SB S W=Y,X=0 G V:V,U:$D(^DD(A,"GL",W,0))
PIECE S Y=1,P=0
PC S X=$O(^DD(A,"GL",W,X)) I X'="" S P=$P(X,",",2),Y=$S(Y>P:Y,1:P+1) G PC
 S X=-1 I P S Y="E"_Y_","_(L+Y-1)
 E  F Y=1:1 Q:'$D(^(Y))
 S P=Y I DUZ(0)="@" W !,"^-PIECE POSITION: ",Y,"// " R P:DTIME S:'$T DTOUT=1 G CHECK^DICATT:$D(DTOUT) S:P="" P=Y
 G PQ:P["?" I P?1"E"1N.N1","1N.N S N=$P(P,",",2)-$E(P,2,9)+1 G USED:N'<L W $C(7),!,"CAN'T BE <",L G PIECE
 I P>0,P<100,P\1=P G USED
 S W="" I X'[U W $C(7),"??" G SUB
BACK G CHECK^DICATT:$D(DTOUT),TYPE^DICATT2
 ;
PQ W "  TYPE A NUMBER FROM 1 TO 99"
 I Y=1 W !?9,"OR AN $EXTRACT RANGE (E.G., ""E2,4"")"
 E  W !?15,"CURRENTLY ASSIGNED:",! S Y="" F P=0:0 S Y=$O(^DD(A,"GL",W,Y)) Q:Y=""  S P=$O(^(Y,0)) I $D(^DD(A,P,0)) W ?11,$S(Y:"PIECE ",1:"")_Y,?22,"FIELD #"_P_", '"_$P(^(0),U,1)_"'",!
 G PIECE
 ;
USED S W=W_S_P,X=P G DE:'$D(^(X))
U W !,$C(7),X_" ALREADY USED FOR "_$P(^DD(A,$O(^(X,0)),0),U,1) G SUB
 ;
MAX S N=0 F T=L:0 S N=$O(^DD(A,"GL",Y,N)) Q:N=""  S DP=$O(^(N,0)) D MX
 S N=-1 Q
MX I N?1"E".E S T=T+$P(N,",",2)-$E(N,2,9)+1
 Q:'N  S P=$P(^DD(A,DP,0),U,2),W=$S(P["J":$P(P,"J",2),P["P":9,P["N":14,P["D":7,1:0) G W:W
 I P["S" F P=1:1 S X=$L($P($P($P(^(0),U,3),";",P),":",1)) S:X>W W=X G W:'X
 S W=$P(^(0),"$L(X)>",2),W='W*30+W
W S T=T+W+1 Q
 ;
V I $D(^DD(A,"GL",W)) W $C(7),!?9,"CAN'T STORE A "_$S($P(DIZ,U)["K":"MUMPS",1:"MULTIPLE")_" FIELD IN AN ALREADY-USED SUBSCRIPT!" G SUB
 I $P(Z,U)'["K" S W=W_S_0 S:$P(DIZ,U)["K" W=$P(W,";")_";E1,245"
DE I $D(DE) S ^DD(A,DA,0)=F_U_$P(DE,U,2,3)_U_W_U_$P(DE,U,5,99),DIK="^DD(A,",DA(1)=A,^(3)=DE(3),^("DT")=DT D IX1^DIK G N^DICATT
2 S:$P(Z,U)["K" V=0,W=W_";E1,245",M="This is Standard MUMPS code." G ^DICATT2
 ;
TOO W $C(7),!," TOO MUCH TO STORE AT THAT SUBSCRIPT!"

DICATT2
DICATT2 ;SFISC/GFT,XAK-DEFINING MULTIPLES ;4APR2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S T=$E(Z) G CHECK^DICATT:$D(DTOUT)
 F P="I","O","L","x" S:$P(O,U,2)[P Z=$P(Z,U)_P_U_$P(Z,U,2)
1 K DS S:$P(Z,U)'["K" V=W[";0"
 S P=0,N=DICL,DQ=4,DP=6,DQI=" S:$D(X) DINUM=+X",DREF=$F(O,DQI)-1=$L(O),DE(7,0)="NO",DG(7)="N"
 S:T="*" T=$S($P(Z,U)["S":"S",1:"P") G 1^DICATT22:DA=.001
 G W:T="W" S:$D(DTIME)[0 DTIME=300
 I T'["F",T'["S",T'["K",'O!DREF S:DREF DE(7,0)="YES",DG(7)="Y"
S F Y=4:1:6 S DQ(Y)=$P($T(DQ+Y),";",3)_F_$P($T(DQ+Y),";",4)_" (Y/N)^RS^Y:YES;N:NO^"_Y_"^Q" I 'V,DA-.01!'N Q
 S DG(5)="Y",DE(4,0)="NO",DP=-1,DL=1
 I T["P"!(T["N") S DE(5,0)="YES"
 I O S DE(6,0)=$E("NY",$P(O,U,2)["M"+1) S:$P(O,U,2)["R" DE(4,0)="Y" I DA=.01,N S P=$O(^DD(J(N-1),"SB",A,0)) S:P="" P=-1 S Y=$P(^DD(J(N-1),P,0),U,2),DE(5,0)=$E("YN",Y["A"+1)
 K Y S DIFLD=-1 D RE^DIED K DQ,DIFLD G:$D(Y) N^DICATT:$P(Z,U)["X",CHECK^DICATT I $D(DTOUT) K DTOUT G CHECK^DICATT
 S:DG(5)="N" T=T_"A" I DG(4)="Y",$P(Z,U)'["R" S Z="R"_Z
 I $D(DG(6)),DG(6)="Y",$P(Z,U)'["M" S Z="M"_Z
G S DIZ=Z G ^DICATT22
Q ;
 K T,B,A,J,DA,DIC,E,DR,W,S,Q,P,N,V,I,L,F,DQI,DIK,C,Z,Y,DE,O,DICS,DICL,DDA Q
 ;
W S %=Z["L"+1 W !,"SHALL THIS TEXT NORMALLY APPEAR IN WORD-WRAP MODE" D YN^DICN
 G CHECK^DICATT:%<0 I % S Z=$P($TR(Z,"L"),U)_$E("L",%=2)_U G WINDOW
 W !,"ANSWER 'YES' IF THE INTERNALLY-STORED '"_F_"' TEXT"
 W !?5,"SHOULD NORMALLY BE PRINTED OUT IN FULL LINES, BREAKING AT WORD BOUNDARIES."
 W !?2,"ANSWER 'NO' IF THE INTERNAL TEXT SHOULD NORMALLY BE PRINTED OUT"
 W !?5,"LINE-FOR-LINE AS IT STANDS.",! G W
 ;
 ;
WINDOW S %=2-(Z["x"!'O) W !,"SHALL ""|"" CHARACTERS IN THIS TEXT BE TREATED LIKE ANY OTHER CHARACTERS" D YN^DICN
 G CHECK^DICATT:%<0 I % S Z=$P($TR(Z,"x"),U)_$E("x",%=1)_U G G
 W !,"ANSWER 'YES' IF THE INTERNALLY-STORED '"_F_"' TEXT MAY HAVE ""|"" CHARACTERS"
 W !?3,"IN IT (SUCH AS HL7 MESSAGES) THAT NEED TO DISPLAY EXACTLY AS THEY ARE STORED."
 W !,"ANSWER 'NO' IF THE INTERNAL TEXT SHOULD NORMALLY BE PRINTED OUT WITH ANYTHING"
 W !?3,"THAT IS DELIMITED BY ""|"" CHARACTERS INTERPRETED AS VARIABLE TEXT.",! G WINDOW
 ;
 ;
 ;
X ;
 W "   (FIELD DEFINITION IS NOT EDITABLE)"
 I N=4 K DIRUT D LENGTH(A,DA) I $D(DIRUT) K DIRUT G N^DICATT
 S T=$E(^DOPT("DICATT",N,0)),Y=^DD(A,DA,0),Z=$TR($P(Y,U,2),"MR")_U_$P(Y,U,3),W=$P(Y,U,4),C=$P(Y,U,5,99) S:Z["K" V=0
 G N^DICATT:N=6,1
 ;
LENGTH(DI,DIFIELD) ;
 N DIR,DICY,Y,X,A0,B0,A1,A2
 S DICY=$G(^DD(DI,DIFIELD,0)) I $P(DICY,U,2)'["F" Q
 S A0=250,A1=$P($P($P(DICY,U,4),";",2),"E",2) I A1 S A2=$P(A1,",",2) I A2 S A0=A2-A1+1,DIR("?",1)="Data is stored by '$E"_A1_"'"
 S DIR("A")="MAXIMUM LENGTH OF '"_$P(DICY,U)_"'",DIR(0)="N^1:"_A0,DIR("B")=$$FL^DIQGDDU(DI,DIFIELD)
 S DIR("?")="THIS MAXIMUM WILL BE USED FOR OUTPUT PURPOSES, BUT WILL NOT BE PART OF THE INPUT CHECK FOR THE FIELD"
 D ^DIR Q:'Y
 N F S X=$P(DICY,U,2),F=$F(X,"J") I F Q:+$E(X,F,99)=Y  F  Q:$E(X,F)'?1N  S X=$E(X,1,F-1)_$E(X,F+1,99)
 S X=$TR(X,"J")_"J"_Y,$P(^DD(DI,DIFIELD,0),U,2)=X
 I $D(DDA) S DDA="E",A0="LENGTH^.23",A1=DIR("B"),A2=Y D IT^DICATTA
 Q
 ;
NO ;
 W !,$C(7),"  <DATA DEFINITION UNCHANGED>" I $P(Z,U)["K"&(DUZ(0)'="@") G N^DICATT
TYPE K Y,M,DE,DIE,DQ,DG G Q^DIB:$D(DTOUT) S N=0,DQI=DICL+9,Y=^DD(A,DA,0),F=$P(Y,U),Z="" W !!,"DATA TYPE OF ",F,": " I 'O R X:DTIME S:'$T DTOUT=1 G X^DICATT:X[U!'$T S:DUZ(0)'="@" DIC("S")="I Y-9" S:DA=.001 DIC("S")="I Y<4!(Y=7)" G NEW
 F N=9:-1:5,1:1:4 Q:$P(Y,U,2)[$E("DNSFWCPVK",N)
 W $P(^DOPT("DICATT",N,0),U) G X:$P(Y,U,2)["K"&(DUZ(0)'="@")
 G X:$P(Y,U,2)["X",6^DICATT:N=6 R "// ",X:DTIME S:'$T DTOUT=1 G N^DICATT:X[U!'$T,0^DICATT:X="" S DIC("S")="I Y-6,Y-9"_$P(",Y-5",U,N\2-2!(A=B)!(DA-.01)!$O(^DD(A,DA))>0),DIC("S")=DIC("S")_$S(N=7:",Y-8",N=8:",Y-7",1:"")
NEW I 'O,X=" ",E,$P(^DD(A,E,0),U,2)'["P",$P(^(0),U,2)'["V" W " <",$C(7) D E^DICATT W " DUPLICATED>" S DIZ=$S($D(DIZ):DIZ,1:DIZZ) G E^DICATT1
 S DIC(0)="QEI",DIC="^DOPT(""DICATT""," D ^DIC I Y>0 S:N-Y&O M="",O=$P(O,U,1,2)_U_U_$P(O,U,4) S N=+Y G 0^DICATT
 I 'O,X["?",E,$P(^DD(A,E,0),U,2)'["P",$P(^(0),U,2)'["V" D DICATT^DIQQQ,E^DICATT W ", JUST HIT THE SPACE KEY"
 G TYPE
 ;
DQ ;;
 ;
 ;
 ;
 ;;IS ; ENTRY MANDATORY
 ;;SHOULD USER SEE AN "ADDING A NEW ;?" MESSAGE FOR NEW ENTRIES
 ;;HAVING ENTERED OR EDITED ONE ;, SHOULD USER BE ASKED ANOTHER

DICATT22
DICATT22 ;SFISC/GFT-CREATE A SUBFILE ;28MAY2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 G M:V I P,$D(^DD(J(N-1),P,0)) S I=A_$E("I",$P(^(0),U,2)["I") D P
 I O,DA=.01,'N S I=$P(@(I(0)_"0)"),U,2) D P
1 ;
 S %=$L(F)+$L(W)+$L(C)+$L(Z) I %>242 W $C(7),!?5,"Field Definition is TOO LONG by ",%-242," characters!" G TYPE^DICATT2
 I T["P",$D(O)=11,+$P($P(O(1),U,2),"P",2)'=+$P(Z,"P",2) S X=$P(O(1),U,2),DA(1)=A X:$D(^DD(0,.2,1,3,2)) ^(2)
 S ^DD(A,DA,0)=F_U_Z_U_W_U_C S:$P(Z,U)["K" ^(9)="@" D SDIK,I G N^DICATT
 ;
Q W $C(7),!,"NUMBER MUST BE BETWEEN ",A," & ",%+1," AND NOT ALREADY IN USE"
M S %=$P(A,"."),DE=%_"."_+$P(A,".",2)_DA I +DE'=DE!$D(^DD(DE)) F DE=A+.01:.01:%+.7,%+.7:.001:%+.9,%+.9:.0001 Q:DE>A&'$D(^DD(DE))
 I DUZ(0)="@" W !,"SUB-DICTIONARY NUMBER: "_DE_"// " R DG:DTIME S:'$T DTOUT=1 G:DG=U!'$T ^DICATT2 S:DG]"" DE=DG G Q:+DE'=DE!(DE<A)
 G Q:%+1'>DE!$D(^DD(DE)) S I=DE,^(I,0)=F_" SUB-FIELD^^.01^1",^(0,"UP")=A,^("NM",F)="",%X="^DD("_A_","_DA_")",@%X@(0)=F_"^^^"_W D P
 S W=$P(W,";") D SDIK S:+W'=W W=""""_W_""""
 S DICATT22=DA,(N,DICL)=N+1,I(N)=W,J(N)=DE,DA=.01,^DD(DE,DA,0)=F_U_Z_"^0;1^"_C,%Y="^DD("_DE_",.01)"
VARPOINT I T["V" D
 . N I,FI,FD,P
 . S FI=$QS(%X,1),FD=$QS(%X,2)
 . S I=0
 . F  S I=$O(@%X@("V",I)) Q:'I  S P=+$G(^(I,0)) K:P ^DD(P,0,"PT",FI,FD)
 . M @%Y@("V")=@%X@("V") K @%X@("V")
POINT I T["P" F %=12,12.1 I $D(@%X@(%)) S @%Y@(%)=@%X@(%) K @%X@(%)
 K %X,%Y
 I T'["W" D
 .S ^DD(DE,DA,1,0)="^.1",^(1,0)=DE_"^B",DIK=W_",""B"",$E(X,1,30),DA)"
 .F %=DICL-1:-1 S DIK=I(%)_$E(",",1,%)_"DA("_(DICL-%)_"),"_DIK I '% S ^(1)="S "_DIK_"=""""",^(2)="K "_DIK S:T["V" ^(3)="Required Index for Variable Pointer" Q
 D SDIK,I S DICL=DICL-1
 D AUDIT(DA(1),.01,"N") S DA=DICATT22 K DICATT22 ;AUDIT THE NEW .01 FIELD AT THE LOWER LEVEL
 G N^DICATT
 ;
AUDIT(DIFILE,DIFIELD,DITYPE) ;
 N DDA,DA,B0,A0
 S DDA(1)=DIFILE,DA=DIFIELD,DDA=$G(DITYPE,"E")
 D AUDT^DICATTA
 Q
 ;
 ;
 ;
I I $P(O,U,2,99)'=$P(^DD(J(N),DA,0),U,2,99) S:$D(M)#2 ^(3)=M S M(1)=0
 K DR,DG,DB,DQ,DQI,^DD(U,$J),^UTILITY("DIVR",$J)
EGP ;K ^DD(DA(1),DA,.009) ; GET RID OF FOREIGN-LANGUAGE HELP MESSAGE WHEN THE BASIC ENGLISH ONE IS BEING RE-EDITED??
 S DIE=DIK,DR=$S(DUZ(0)="@":"3;4",1:3)_$P(";21",U,'O) D  I T="W" K DE
 .N I,J,T
 .D ^DIE
 I $D(M)>9,O S V=DICL,DR=$P(Z,U),Z=$P(Z,U,2) D  ;It's not clear that we need these variables set, now we are calling DIVR^DIUTL 12/01
V .N D0 S DI=J(N) D DIPZ^DIU0 Q:$D(DTOUT)!'$D(DIZ)  ;NEEDS 'DI' & 'DA'
 .D DIVR^DIUTL(A,DA)
 K DR,M Q
 ;
 ;
P F Y="S","D","P","A","V" S:I[Y I=$P(I,Y)_$P(I,Y,2)_$P(I,Y,3) S:T[Y I=I_Y
 S ^(0)=$P(^(0),U)_U_I_U_$P(^(0),U,3,99) Q
 ;
SDIK N %X
 S DA(1)=J(DICL),DIK="^DD("_DA(1)_"," I O K ^DD(DA(1),"RQ",DA)
 W !,"...." G IX1^DIK

DICATT3
DICATT3 ;SFISC/COMPUTED FIELDS ;6MAY2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K DIRUT,DTOUT D COMP I $P(^DD(A,DA,0),U,2)["C" G N^DICATT
 S DTOUT=1 G CHECK^DICATT
 ;
COMP N DIR,DICOMPX,DISPEC,DICMIN,DIL,DIJ,DIE,DIDEC
 S DISPEC=$P($G(^DD(A,DA,0)),U,2)
 S DIR(0)="FU",DIR("A")="'COMPUTED-FIELD' EXPRESSION"
 I O,$D(^DD(A,DA,9.1)) S DIR("B")=^(9.1)
 S DIR("?")="^D DICATT3^DIQQ"
 D ^DIR Q:$D(DIRUT)
 I $D(DIR("B")),DIR("B")=Y G GETTYPE
 K DICOMPX S DICOMPX=""
 S DICMIN=Y,DQI="Y("_A_","_DA_",",DICMX="X DICMX",DICOMP="?I"
 D ^DICOMP I '$D(X) W $C(7),"  ...??" G 6
 I DUZ(0)="@" W !,"TRANSLATES TO THE FOLLOWING CODE:",!,X,!
 I Y["m" W !,"FIELD IS 'MULTIPLE-VALUED'!",!
 I O,$D(^DD(A,DA,9.01))!(DICOMPX]"") D ACOMP
 S DISPEC=$E("D",Y["D")_$E("B",Y["B")_"C"_$S(Y'["m":"",1:"m"_$E("w",Y["w"))_$S(Y["p":"p"_$S($P(Y,"p",2):+$P(Y,"p",2),1:""),1:"")_$S(Y'["B":"",1:"J1")
 S ^DD(A,DA,0)=F_U_DISPEC_"^^ ; ^"_X,^(9)=U,^(9.1)=DICMIN,^(9.01)=DICOMPX
 F Y=9.2:0 Q:'$D(X(Y))  S ^(Y)=X(Y),Y=$O(X(Y))
 K X,DICOMPX
GETTYPE K DIR S DIR(0)="SBA^S:STRING;N:NUMERIC;B:BOOLEAN;D:DATE;m:MULTIPLE;p:POINTER;mp:MULTIPLE POINTER"
 S DIR("A")="TYPE OF RESULT: "
 S DIR("B")=$P($E(DIR(0),$F(DIR(0),$$TYPE(DISPEC)_":"),99),";")
 D ^DIR I $D(DIRUT) G END
 S DISPEC=$TR(Y,"SN") I Y="B"!(Y="D") D P(Y) G END
 I Y["p" D POINT G END
 S DIJ="",DIE=$P($P(O,U,2),"J",2) F J=0:0 S N=$E(DIE) Q:N?.A  S DIE=$E(DIE,2,99),DIJ=DIJ_N
 S DIDEC=$P(DIJ,",",2),DIL=$S(DIJ:+DIJ,1:8) S:Y'="N" DIDEC=""
 I DISPEC["m" D P(DISPEC) G END
 D DEC:Y="N" I '$D(DIRUT) D LEN
END I O S DI=A D PZ^DIU0 Q
 D SDIK^DICATT22
6 Q  ;leave this here
 ;
 ;
DEC N DG,O,M
FRAC K DIR S DIR("A")="NUMBER OF FRACTIONAL DIGITS TO OUTPUT: "
 I DIDEC]"" S DIR("B")=DIDEC
 S DIR("?")="Enter the number of decimal digits that should normally appear in the result."
 S DIR(0)="NAO^0:14:0" D ^DIR Q:$D(DIRUT)  S DIDEC=Y
 S DG=" S X=$J(X,0,",M=$P(^DD(A,DA,0),DG),%=M_DG_DIDEC_")"'=^(0)+1
 W !,"SHOULD VALUE ALWAYS BE INTERNALLY ROUNDED TO ",DIDEC," DECIMAL PLACE",$E("S",DIDEC'=1)
 D YN^DICN G FRAC:'% Q:%'>0  S ^DD(A,DA,0)=M_$P(DG_DIDEC_")",U,%)
S S DQI="Y(",O=$D(^(9.02)),X=^(9.1) K DICOMPX,^(9.02) Q:'$D(^(9.01))
 F Y=1:1 S M=$P(^(9.01),";",Y) Q:M=""  S DICOMPX(1,+M,+$P(M,U,2))="S("""_M_""")",DICOMPX=""
 Q:Y<2  I X'["/",X'["\" Q:X'["*"  Q:Y<3
 D ^DICOMP Q:$D(X)-1
 S %=2-O W !,"WHEN TOTALLING THIS FIELD, SHOULD THE SUM BE COMPUTED FROM",!?7,"THE SUMS OF THE COMPONENT FIELDS" D YN^DICN
 I %=1 S ^DD(A,DA,9.02)=X_" S Y=X"
 S:%<1 DIRUT=1
 Q
 ;
LEN K DIR
 S DIR(0)="NAO^1::0",DIR("A")="LENGTH OF FIELD: ",DIR("B")=DIL
 S DIR("?")="Maximum number of character expected to be output."
 D ^DIR Q:$D(DIRUT)
 D P($P(DISPEC,"J")_"J"_Y_$E(",",DIDEC]"")_DIDEC_DIE) Q
 ;
POINT K DIR
 S DIR(0)="P^1:QEF",DIR("A")="POINT TO WHAT FILE"
 S DIR("S")="I $$OKFILE^DICOMPX(Y,""W"")"
 S X=$P($P(^DD(A,DA,0),U,2),"p",2) I 'X S X=$P($P(O,U,2),"p",2)
 I X,$D(^DIC(+X,0)) S DIR("B")=$P(^(0),U)
 D ^DIR I '$D(DIRUT) S $P(DISPEC,"p",2)=+Y D P(DISPEC)
 Q
 ;
P(C) S $P(^DD(A,DA,0),U,2)="C"_$TR(C,"C^") Q
 ;
ACOMP ;SET/KILL ACOMP NODES
 N X,I I $G(^DD(A,DA,9.01))]"" S X=^(9.01) X ^DD(0,9.01,1,1,2)
 I DICOMPX]"" S X=DICOMPX X ^DD(0,9.01,1,1,1)
 Q
 ;
TYPE(S) ;
 Q $S(S["D":"D",S["B":"B",S["mp":"mp",S["m":"m",S["p":"p",S'["J":"S",S[",":"N",1:"S") ;figure out TYPE OF RESULT

DICATT4
DICATT4 ;SFISC/XAK-DELETE A FIELD ;12:39 PM  7 Mar 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DIEZ S DI=A,DA=D0 D DIPZ^DIU0
 K ^DD(A,0,"ID",D0),^DD(A,0,"SP",D0)
EN I $O(@(I(0)_"0)"))>0 D
 .N X,T,Y,Z,MUL
 .S MUL=+$P(O,U,2)
 .S %=1,Y=$P(O,U,4),X=$P(Y,";"),Y=$P(Y,";",2),Z=$S(+X=X:X,1:""""_X_"""")_")",E="^("_Z
 .I $O(^DD(A,"GL",X,""))="" S T="K ^(M,"_Z G F
 .I Y S T="U_$P("_E_",U,"_(Y+1)_",999) K:"_E_"?.""^"" "_E S:Y>1 T="$P("_E_",U,1,"_(Y-1)_")_U_"_T
 .E  S X=+$E(Y,2,4),Y=+$P(Y,",",2) Q:'X!'Y  S T="$E("_E_",1,"_(X-1)_")_$J("""","_(Y-X+1)_")_$E("_E_","_(Y+1)_",999)"
 .S T="I $D(^(M,"_Z_")#2 S "_E_"="_T
F .I '$D(DIU(0)) W $C(7),!,"OK TO DELETE '",$P(M,U),"' FIELDS IN THE EXISTING ENTRIES" D YN^DICN I %-1 D:'$D(DIU) DELXRF(A,D0) Q
KILLIX .I $D(DICATT4M) D  S M="" F  S M=$O(^DD(J(0),0,"IX",M)) Q:M=""  I $O(^(M,MUL,0)) K @(I(0)_""""_M_""")")
 ..D INDEX^DIKC(J(0),"","","","KiRW"_MUL)
 .E  D:'$D(DIU) DELXRF(A,D0,1,J(0))
 .S M="",X=DICL,Y=I(0) I $D(DQI) K @(I(0)_""""_DQI_""")")
L .S O="M" S:X O=O_"("_X_")" S Y=Y_O,M=M_"F "_O_"=0:0 S "_O_"=$O("_Y_")) Q:"_O_"'>0  "
 .S X=X-1 I X+1 S Y=Y_","_I(DICL-X)_"," G L
 .S M=M_"X T"_$P(" W "".""",U,$S('$D(DIU(0)):1,DIU(0)["E":1,1:0))
 .X M ;HERE'S THE LOOP WHERE WE KILL THE VALUES!
N Q:$D(DIU)!$D(DICATT4M)  G N^DICATT
 ;
NEW ;Delete the data in the multiple
 S DICATT4M=$NA(^DD(A,D0))
 S DICATT4M("SB")=$NA(^DD(A,"SB",+$P(O,U,2),D0))
 S ^DD(A,D0,0)=O,^DD(A,"SB",+$P(O,U,2),D0)=""
 D DICATT4
 K @DICATT4M,@DICATT4M("SB"),DICATT4M
 ;
 ;Kill the DD globals and go back to N^DICATT
 D KDD G N^DICATT
 ;
VP ; VARIABLE POINTER
 S DA(2)=DA(1),DA(1)=DA,DICATT=DA I $D(DICS) S DICSS=DICS K DICS
V S DA(2)=A,DA(1)=DICATT,DIC="^DD("_A_","_DICATT_",""V"",",DIC("P")=".12P",DIC(0)="QEAMLI",DIC("W")="W:$S($D(^DIC(+^(0),0)):$P(^(0),U)'=$P(^DD(DA(2),DA(1),""V"",+Y,0),U,2),1:0) ?30,$P(^(0),U,2)" D ^DIC S DIE=DIC K DIC
 I Y>0 S DA=+Y,Z="P",DR=".01:.04;"_$S($P($G(^DD(+$P(Y,U,2),0,"DI")),U,2)["Y":".06///n",1:".06T")_";S:DUZ(0)'=""@"" Y=0;.05;I ""n""[X K ^DD(DA(2),DA(1),""V"",DA,1),^(2) S Y=0;S DIE(""NO^"")=""BACK"";1;2;" S:$P(Y,U,3) DIE("NO^")=""
 I Y>0 D ^DIE K DIE W ! S:$D(DTOUT) DA=DICATT G CHECK^DICATT:$D(DTOUT),V
 S Z="V^",DIZ=Z,C="Q",L=18,DA=DICATT,DA(1)=A S:$D(DICSS) DICS=DICSS K DICSS,DR,DIE,DA(2),DICATT G CHECK^DICATT:$D(DTOUT)!(X=U),^DICATT1
 Q
HELP ;
 W !?5,"Enter a MUMPS statement that sets DIC(""S"") to code that sets $T."
 W !?5,"Those entries for which $T=1 will be selectable."
 I Z?1"P".E D  Q
 . W !?5,"The naked reference will be at the zeroeth node of the pointed to"
 . W !?5,"file, e.g., ^DIZ(9999,Entry Number,0).  The internal entry number"
 . W !?5,"of the entry that is being processed in the pointed to file will be"
 . W !?5,"in the variable Y."
 W !?5,"The variable Y will be equal to the internally-stored code of the item"
 W !?5,"in the set which is being processed."
 Q
KDD ;
 I '$D(DIANC) S X=A F  S DIANC(X)="" Q:$D(^DD(X,0,"UP"))[0  S X=^("UP")
 S DQ=$O(DQ(0)),X=0 I DQ="" S DQ=-1 K DIANC Q
 D KIX(.DIANC,DQ)
 F  S X=$O(^DD(DQ,"SB",X)) Q:'X  S DQ(X)=0
 N DIFLD S DIFLD=0 F  S DIFLD=$O(^DD(DQ,DIFLD)) Q:'DIFLD  D
 . I $D(^DD(DQ,DIFLD,9.01)) S X=^(9.01),Y=DIFLD D KACOMP
 . D KTRB(.DIANC,DQ,DIFLD)
 . S X=$P($G(^DD(DQ,DIFLD,0)),U,2) I X'["P",X'["V" Q
 . I X["P" S X=+$P(X,"P",2) K:X ^DD(X,0,"PT",DQ,DIFLD) Q
 . F %=0:0 S %=$O(^DD(DQ,DIFLD,"V",%)) Q:'%  S X=+$G(^(%,0)) K:X ^DD(X,0,"PT",DQ,DIFLD)
 . Q
 K DQ(DQ),^DD(DQ),^DD("ACOMP",DQ),^DDA(DQ)
 S Y=0 F  S Y=$O(DIANC(Y)) Q:'Y  K ^DD(Y,"TRB",DQ)
 D DELXR(DQ)
 S Y=0 F  S Y=$O(^DIE("AF",DQ,Y)) Q:Y=""  S %=0 F  S %=$O(^DIE("AF",DQ,Y,0)) Q:%=""  K ^(%),^DIE(%,"ROU")
 S Y=0 F  S Y=$O(^DIPT("AF",DQ,Y)) G KDD:Y="" S %=0 F  S %=$O(^DIPT("AF",DQ,Y,0)) Q:%=""  K ^(%),^DIPT(%,"ROU")
 ;
KIX(DIANC,DIFIL) ;
 N F,NM
 S F=0 F  S F=$O(DIANC(F)) Q:'F  D
 . S NM="" F  S NM=$O(^DD(F,0,"IX",NM)) Q:NM=""  K:$D(^(NM,DIFIL)) ^(DIFIL)
 Q
KACOMP N DA,I,% S DA(1)=DQ,DA=Y X ^DD(0,9.01,1,1,2) Q
 ;
KTRB(DIANC,DIFIL,DIFLD) ;Kill 5 node of triggered field
 ;Also kill "TRB" nodes here if triggered field is in another file
 N %,F,DITFLD,DITFIL,DIXR,DIXR0
 S DIXR=0
 F  S DIXR=$O(^DD(DIFIL,DIFLD,1,DIXR)) Q:'DIXR  S DIXR0=$G(^(DIXR,0)) D:$P(DIXR0,U,3)="TRIGGER"
 . S DITFIL=$P(DIXR0,U,4),DITFLD=$P(DIXR0,U,5) Q:'DITFIL!'DITFLD
 . S %=0
 . F  S %=$O(^DD(DITFIL,DITFLD,5,%)) Q:'%  I $P($G(^(%,0)),U,1,3)=(DIFIL_U_DIFLD_U_DIXR) D  Q
 .. K ^DD(DITFIL,DITFLD,5,%) Q:DITFIL=DIFIL!$D(DIANC(DITFIL))
 .. S F=DITFIL
 .. F  K ^DD(F,"TRB",DIFIL) S F=$G(^DD(F,0,"UP")) Q:'F!$D(DIANC(+F))
 Q
DELXR(DIFIL) ;Delete the Key and Index file entries for file DIFIL
 Q:'$G(DIFIL)
 N DA,DIK
 ;
 ;Kill keys on file DIFIL
 S DIK="^DD(""KEY"","
 S DA=0 F  S DA=$O(^DD("KEY","B",DIFIL,DA)) Q:'DA  D ^DIK
 ;
 ;Kill indexes on file DIFIL
 S DIK="^DD(""IX"","
 S DA=0 F  S DA=$O(^DD("IX","AC",DIFIL,DA)) Q:'DA  D ^DIK
 Q
 ;
DELXRF(DIFIL,DIFLD,DIFLG,DITOPFIL) ;Delete Keys and Indexes on field
 ;If DIFLG=1, also delete the Indexes from the data global.
 Q:'$G(DIFIL)!'$G(DIFLD)
 N DA,DIK
 ;
 ;Execute the kill logic for all indexes defined on the field
 ;for all entries in the file.
 I $G(DIFLG) D
 . S:$G(DITOPFIL)="" DITOPFIL=$$FNO^DILIBF(DIFIL)
 . D:DITOPFIL INDEX^DIKC(DITOPFIL,"",DIFLD,"","RKW"_DIFIL)
 ;
 ;Kill keys on file/field
 S DIK="^DD(""KEY"","
 S DA=0 F  S DA=$O(^DD("KEY","F",DIFIL,DIFLD,DA)) Q:'DA  D ^DIK
 ;
 ;Kill indexes on file/field
 S DIK="^DD(""IX"","
 S DA=0 F  S DA=$O(^DD("IX","F",DIFIL,DIFLD,DA)) Q:'DA  D ^DIK
 Q

DICATT5
DICATT5 ;SFISC/XAK-POINTERS ;12:04 PM  25 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
7 K DIC S Y="",%=$P(O,U,3),DIC(0)="EFQIZ"
 S:$P(O,U,2)["P"&$L(%) Y=$S($D(@("^"_%_"0)")):$P(^(0),U),1:"")
 W !,"POINT TO WHICH FILE: " W:Y]"" Y_"// " R X:DTIME S:'$T DTOUT=1 G CHECK^DICATT:X=U!'$T I Y]"",X="" S X=Y,DIC(0)=DIC(0)_"O"
 S DIC=1,DIC("S")="I Y'=1.1 S DIFILE=+Y,DIAC=""RD"" D ^DIAC I %"
 D ^DIC K DIC,DIFILE,DIAC G:Y<0 7:X["?",T S X=^(0,"GL"),DE=Y G 77
T K DIC G CHECK^DICATT:$D(DTOUT),NO^DICATT2
77 S DIFILE=+Y,DIAC="LAYGO" D ^DIAC S %=0 S:'DIAC!($P($G(^DD(DIFILE,0,"DI")),U,2)["Y") %=2 K DIFILE,DIAC
P I % W !,$C(7) D A W !,"WILL NOT " D B
 E  S %=1+$S($P(O,U,2)["'":1,$P(O,U,2)']"":1,1:0) W !,"SHOULD " D A W ! D B,YN^DICN G T:%<1
 S Z="P"_+DE_$E("'",%=2)_X,C="Q",L=9,E=X G H:DUZ(0)'="@" D S G T:X=U,H
S ;
 S D=$S($D(^DD(A,DA,12.1)):^(12.1),1:""),%=2-(D]""),P=$S($D(^(12)):^(12),1:""),I=$S($D(^(12.2)):^(12.2),1:"")
 W !,"SHOULD '"_$P(DE,U,2)_"' ENTRIES BE SCREENED" D YN^DICN S:%<0 X=U Q:X=U  I '% W !?5,"Answer YES if there is a condition which should prohibit",!?5,"selection of some entries." G S
 I %=2 K ^(12.1),^(12),^(12.2) Q
 G M ;W !,"ENTER A TRUTH-VALUED EXPRESSION WHICH MUST BE TRUE OF ANY ENTRY POINTED TO:",!?4 I I]"" W I_"// " W:$X>35 !?4
 R X:DTIME S:'$T DTOUT=1 G T:X=U!'$T S:X="" X=I I X="" G M:DUZ(0)="@",S
 K DG,K S ^(12.2)=X,K=100,DQI="Y(",DG(K)=K,K(1,1)=K,(DLV,DLV0)=K,J(K)=+DE,I(K)=E,K=0 D EN^DICOMP
 G S:'$D(X) I $D(X)>1!(X[" ^DIC") W $C(7),!,"TOO COMPLICATED!" G S
 S I=0 I 'DBOOL W $C(7),!?8,"WARNING-- THIS DOESN'T LOOK LIKE A TRUTH-VALUED EXPRESSION"
D0 S I=$F(X,E_"D0",I) I I S X=$E(X,1,I-3)_"Y"_$E(X,I,999) G D0
Q S I=$F(X,"""",I) I I S X=$E(X,1,I-1)_""""_$E(X,I,999),I=I+1 G Q
 S (D,X)="S DIC(""S"")="""_X_" I X""" G E:DUZ(0)'="@"
M W !,"MUMPS CODE THAT WILL SET 'DIC(""S"")': " W:D]"" D S Y=D D:D]"" RW^DIR2 G S:X="@" I D']"" R X:DTIME S:'$T DTOUT=1 Q:X=U!'$T
 I X="" S X=D G S:X=""
 I X?."?" D HELP^DICATT4 G M
 D ^DIM:'$T I '$D(X) S X="" G S
 I X'["DIC(""S"")" W $C(7),!,?8,"WARNING - Screen Does Not Contain DIC(""S"")"
E W !,"EXPLANATION OF SCREEN: " W:P]"" P_"// " R %:DTIME S:'$T %=U,DTOUT=1 S:%="" %=P G S:%=U I %?.P W !?5,$C(7),"An explanation must be entered." G E
 I $D(^DD(A,DA,12.1)) S:X'=^(12.1) M(1)=0
 S ^DD(A,DA,12)=%,^(12.1)=X,Z="*"_Z S:Z?1"*P".E C=X_" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X" Q
H S DIZ=Z G ^DICATT1
 ;
A W "'ADDING A NEW "_$P(DE,U,2)_" FILE ENTRY' (""LAYGO"")" Q
B W "BE ALLOWED WHEN ANSWERING THE "_F_"' QUESTION" Q
 Q

DICATT6
DICATT6 ;SFISC/XAK-SETS,FREE TEXT ;2013-01-16  11:41 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G @N
 ;
3 S Z="",L=1,P=0,Y="INTERNALLY-STORED CODE: "
P S P=P+1,C=$P($P(O,U,3),S,P) W !,Y W:C]"" $P(C,":",1)_"// " R T:DTIME G T:'$T
 I T_C]"" G P:T="@" S:T="" T=$P(C,":",1) S X=T,L=$S($L(X)>L:$L(X),1:L) D C I $D(X) W "  WILL STAND FOR: " W:C]"" $P(C,":",2),"// " R X:DTIME G:'$T T S:X="" X=$P(C,":",2) D C I $D(X) G TOO:$L(Z)+$L(T)+$L(X)+$L(F)>235 S Z=Z_T_":"_X_S G P:X]"",T
 G T:Z=""!'$D(X) S (DIZ,Z)="S^"_Z I DUZ(0)="@" S DE="^"_F D S^DICATT5 K DE G CHECK^DICATT:$D(DTOUT)!(X=U)
 S C="Q" G H
 ;
C I X["?",P=1 K X W !,"For Example: Internal Code 'M' could stand for 'MALE'",! Q
 I X[":"!(X[U)!(X[S)!(X[Q)!(X["=") K X W $C(7),!,"SORRY, ';' ':' '^' '""' AND '=' AREN'T ALLOWED IN SETS!",! Q
 I X'?.ANP W !,$C(7),"Cannot use CONTROL CHARACTERS!" K X
 Q
 ;
TOO W $C(7),!,"TOO MUCH!! -- SHOULD BE 'POINTER', NOT 'SET'"
T W ! G NO^DICATT2:'$D(X) S DTOUT=1 G CHECK^DICATT
 ;
4 K DG,DE,M S L=$G(^DD("STRING_LIMIT"),255)-5,P=$P($P($P(^DD(A,DA,0),U,4),";",2),"E",2) I P S M=$P(P,",",2) I M S L=M-P+1
 S DL=1,DP=-1,DQ(1)="MINIMUM LENGTH^NR^^1^K:X\1'=X!(X<1) X",DQ(2)="MAXIMUM LENGTH^RN^^2^K:X\1'=X!(X>"_L_")!(DG(1)>X) X"
 S T="",L=1,P=" X",DQ(3)="(OPTIONAL) PATTERN MATCH (IN 'X')^^^3^S X=""I ""_X D ^DIM S:$D(X) X=$E(X,3,999) I $D(X) K:X?.NAC X",DQ(3,3)="EXAMPLE: ""X?1A.A"" OR ""X'?.P"""
 G DIED:'O,DG:C'?.E1"K:$L".E1" X"
 S T=$P(C,"K:$L",1),DE(2)=+$P(C,"$L(X)>",2),DE(1)=+$P(C,"$L(X)<",2)
 S Y=0,I=0,Z=$P(C,")!'(",2,99) I Z="" K:'DE(2) DE(2) G DG
L S I=I+1,X=$E(Z,I) G L:X'?.P,DG:X="" I X=Q S Y='Y G L
 G L:Y I X="(" S L=L+1
 G L:X'=")" S L=L-1 G L:L
 S DE(3)=$E(Z,1,I-1),P=$E(Z,I+1,999)
DG S:$D(^DD(A,DA,3)) M=^(3) F L=1,2,3 S:$D(DE(L)) DG(L)=DE(L)
DIED K Y S DM=0 D DQ^DIED K DQ,DM G CHECK^DICATT:$D(DTOUT)!($D(Y))
 S Y=DG(1),L=DG(2),X=$S(L=Y:L,1:Y_"-"_L) I L<Y W $C(7),"??" G 4
 S Z="Answer must be "_X_" character"_$E("s",X'=1)_" in length." I $S($D(M):M'[Z,1:1) S M=Z
 S X=$S('$D(DG(3)):"",DG(3)="":"",1:"!'("_DG(3)_")")
 S C=T_"K:$L(X)>"_L_"!($L(X)<"_Y_")"_X_P
Z S (DIZ,Z)="FJ"_L_U
H G ^DICATT1

DICATTA
DICATTA ;SFISC/YJK-DD AUDIT ;11JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
SV ;From DICATT & DICATTD
 F %=1:1 S A0=$P($$I,",",%) Q:A0=""  I $D(^DD(A,+Y,A0)) S ^UTILITY("DDA",$J,A,+Y,A0)=^(A0)
 K %,A0 Q
 ;
 ;
 ;
 ;
AUDT ;
 N OLD,NEW
 S B0=DDA(1) I DDA="E" D B G QQ
 S A0="LABEL^.01" I DDA["D" S OLD=$P(^UTILITY("DDA",$J,B0,DA,0),U)
 E  S NEW=$P(^DD(B0,DA,0),U)
 D ADD(.OLD,.NEW) G QQ
 ;
B S A0="",A1=^UTILITY("DDA",$J,B0,DA,0),A2=^DD(B0,DA,0)
 S A3=1,A5="LABEL^TYPE^TYPE",B3=".01^.25^.25"
 F %=1:1:3 I $P(A1,U,%)'=$P(A2,U,%) S $P(A0,",",A3)=$P(A5,U,%),$P(A4,",",A3)=$P(B3,U,%),$P(B1,"^",A3)=$P(A1,U,%),$P(B2,"^",A3)=$P(A2,U,%),A3=A3+1
 I $P(A1,U,5,99)'=$P(A2,U,5,99) S $P(A0,",",A3)="INPUT TRANSFORM",$P(B1,"^",A3)=$P(A1,U,5,99),$P(B2,"^",A3)=$P(A2,U,5,99),$P(A4,",",A3)=.5
 I A0]"" S A0=A0_"^"_A4,A1=B1,A2=B2 D ADD(A1,A2)
 K B3,A1,A2,A3,A4,A5 D B1($$I)
 Q
 ;
 ;
I() Q "0,.1,3,4,8,8.5,9,9.1,10,AUDIT,AX"
 ;
 ;
 ;
B1(B1) F B2=2:1 S %=$P(B1,",",B2) Q:%=""  S:$D(^UTILITY("DDA",$J,B0,DA,%)) A1=^(%) S:$D(^DD(B0,DA,%)) A2=^(%) I $D(A1)!$D(A2) S %=$S(%="AUDIT":1.1,%="AX":1.2,1:%),A0=$S($D(^DD(0,%,0)):$P(^(0),U,1),1:"")_"^"_% D P
 Q
 ;
 ;
DDAUDITQ(FILE) ;ALWAYS DO DD AUDIT
 Q 1
 ;F  Q:'$G(^DD(FILE,0,"UP"))  S FILE=^("UP")
 ;Q $G(^DD(FILE,0,"DDA"))="Y"
 ;
 ;
 ;
UPDATED(FILE,FIELD) I $D(^DD(FILE,FIELD,0)) S ^("DT")=DT
 S ^DD(FILE,0,"DT")=DT
 F  Q:'$G(^DD(FILE,0,"UP"))  S FILE=^("UP")
 S ^DD(FILE,0,"DT")=DT,$P(^DIC(FILE,"%MSC"),U)=$$NOWINT^DIUTL
 Q
 ;
 ;
P ;From ^DIAUTL & B1 above
 I $D(A1),'$D(A2) S DDA="D" D ADD(A1) K A1 Q
 I '$D(A1),$D(A2) S DDA="N" D ADD(,A2) K A2 Q
 I A1'=A2 S DDA="E" D ADD(A1,A2)
 K A1,A2 Q
 ;
 ;
 ;
 ;
ADD(OLD,NEW) D UPDATED(B0,DA) I '$$DDAUDITQ(B0) K %D Q  ;%D is return variable.  If it is not there, we are not auditing.
 N B3,%T
 I '$D(^DDA(B0,0)) S %=$P(^DIC(J(0),0),U),^DDA(B0,0)=$S(B0=J(0):%,1:%_" ("_$P(^DD(B0,0),U,1)_")")_" DD AUDIT^.6I"
 F B3=$P(^(0),U,3):1 I '$D(^(B3)) L +^DDA(B0,B3):0 Q:$T
 S $P(^(0),U,3,4)=B3_U_($P(^(0),U,4)+1),^(B3,0)=DA L -^DDA(B0,B3)
 S %T=$$NOWINT^DIUTL,^DDA(B0,"D",%T,B3)="",^DDA(B0,"E",DUZ,B3)="",^DDA(B0,"B",DA,B3)="",^DDA(B0,B3,0)=DA_U_DDA_U_%T_U_DUZ_U_A0_U_B0
 S:$G(OLD)]"" ^(1)=OLD S:$G(NEW)]"" ^(2)=NEW
 S %D=B3 Q  ;RETURNS %D
 ;
 ;
IT ;From DIU3, DIU31, DICATT2
 S B0=DI,DDA="E" D ADD(A1,A2) G QQ
 ;
IT1 ;From DIU31
 S B0=DI D B1(",3,4,12.1") G QQ
 ;
XS ;From DICE
 I $P(^DD(J(N),DA,1,DQ,0),U,3)["TRIG"!($P(^(0),U,3)["BULL") S DDA="TE" Q:'$D(^(3))  S ^UTILITY("DDA",$J,J(N),DA,3)=^(3) Q
 S %=0 F B1=1:1 S %=$O(^DD(J(N),DA,1,DQ,%)) Q:+%'>0  S ^UTILITY("DDA",$J,J(N),DA,B1)=^(%)
 K B1,% Q
 ;
XA ;From DICE, DICE0, DIKD, DICD
 S B0=J(N),DA=DL,A0="CROSS REFERENCE^1"
 I DDA["T" S DDA="E" D  G QQ
TR .K A1,A2 S:$D(^DD(B0,DA,1,DQ,3)) A2=^(3) S:$D(^UTILITY("DDA",$J,B0,DA,3)) A1=^(3) Q:'$D(A1)&'$D(A2)
 .D ADD($G(A1),$G(A2)) Q
 S %=0 D  I % D ADD(,) I $G(%D)>0 S B1=$S(DDA["D":1.1,1:2.1),A0="^DD(B0,DA,1,DQ," D XL
CK .K A1,A2 F B1=1:1:3 S:$D(^DD(B0,DA,1,DQ,B1)) A1=^(B1) S:$D(^UTILITY("DDA",$J,B0,DA,B1)) A2=^(B1) I $D(A1)!$D(A2) D  Q:%
C ..I ($D(A1)&'$D(A2))!('$D(A1)&$D(A2)) S %=1 Q
 ..S:A1'=A2 %=1
QQ S DDA="" K B0,%D,B1,B2,%,A0,A1,A2,^UTILITY("DDA",$J) Q
 ;
 ;
 ;
 ;
XL Q:$G(%D)'>0  S %=0 F B2=1:1 S %=$O(@(A0_%_")")) Q:+%'>0  S ^DDA(B0,%D,B1,B2,0)=^(%)
 S B2=B2-1,%=$S(B1=1.1:.601,1:.602),^DDA(B0,%D,B1,0)="^"_%_"^"_B2_"^"_B2_"^"_DT
 I DDA["E",B1=2.1 S B1=1.1,A0="^UTILITY(""DDA"",$J,B0,DA," G XL
 K %,B2 Q

DICATTD
DICATTD ;SFISC/GFT-SCREEN-MODE 'MODIFY FILE ATTRIBUTES' ;13MAY2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DG,DLAYGO,DIC,DICATTB,DICATTA,DICATTF,DA,DDA
 K ^UTILITY("DICATTD",$J),^UTILITY("DDA",$J) ;auditing
 S DLAYGO=1 D D^DICRW Q:Y<0  I $P($G(^DD(+Y,0,"DI")),U)["Y",$P(@(^DIC(+Y,0,"GL")_"0)"),U,4) W !!,$C(7),"DATA DICTIONARY MODIFICATIONS ON ARCHIVE FILES ARE NOT ALLOWED!" Q
 I '$D(DIC) D DIE^DIB Q:'$D(DG)  S DIC=DG
LOCK S (DA,DICATTB,DICATTA)=+$P(@(DIC_"0)"),U,2) L +^DICATTD(DA):1 E  W !!,"SOMEONE ELSE IS EDITING THIS FILE" Q  ;N.B.--There is no such Global
DDA S DDA="" ;DD auditing
ASKLOOP F  K DICATTF D M I $S('$D(DICATTF):1,'$D(^DD(DICATTA)):1,DICATTF-.01:0,1:$P(^DD(DICATTA,DICATTF,0),U,2)["W") Q:DICATTA=DICATTB  S DICATTA=DICATTB
END L -^DICATTD(DICATTB) Q
 ;
M N DICATTVP,DICATTDK,DICATT2N,DICATTMN,DICATTDW,DDSERROR,DICS,DICATTSC
 N DICATT2,DICATT4,DICATT3,DICATT3N,DICATTL,DICATTLN,DICATT5,DICATT5N,DICATT5P
 N O,DIU0,I,J,DR,A,DQ
 N DDSFILE,DIMSG,DUOUT,DTOUT,DDSPAGE,DDSPARM,DDSSAVE,DICATTNW
FIELD W !!! K DIC,O,^UTILITY("DICATTD",$J) ;clean WP buffer
 S DIC(0)="ALEQIZ",DIC="^DD("_DICATTA_"," S:$D(DICS) DIC("S")=DICS
 S DIC("W")="S %=$P(^(0),U,2) I % W $P(""  (multiple)^  (word-processing)"",U,$P(^DD(+%,.01,0),U,2)[""W""+1)"
 I $P(^DD(DICATTA,.01,0),U,2)["W" S DIC(0)="AEQZ",DIC("B")=.01
 D ^DIC K DIC I Y<0 K DICATTF Q  ;look-up
NEWFIELD I $P(Y,U,3) S DICATTNW=1 S:$D(DDA) DDA="N"
 E  S DIU0=DICATTA,O(1)=$P(^(0),U,1,2),O(2)=$G(^(.1)) I $D(DDA) D
 .N A S A=DIU0 S DDA="E" D SV^DICATTA
 S:$D(DDA) DDA(1)=DICATTA
 S DICATTF=+Y
 D GET
MUL I DICATT2 D  Q:'DICATTA!'$D(^DD(DICATTA))  G FIELD ;If it's multiple...
 .N DICATT2N,DDSPAGE,DDSPARM,DDSSAVE
 .S DDSPARM="S",DDSPAGE=10 D DDS ;...we do Page 10
 .I $G(DDSSAVE) S DICATTA=+$G(DICATT2) ;Go down into multiple unless they aborted  with F1-Q
DDS K DDSSAVE,DIMSG S DDSPARM="S",DA="",DR="[DICATT]",DDSFILE=1
 D ^DDS ;invoke SCREENMAN!
 Q:'$D(^DD(DICATTA,DICATTF,0))
 S DICATT2N=$P(^(0),U,2) I DICATT2N="",DICATTF-.01 D DELFLD^DICATTDK(DICATTA,DICATTF) Q  ;delete field
VERIFY I '$D(DTOUT),'$D(DIMSG),$D(DDSSAVE) D N^DICATTDE I 'DICATT2N,'$G(DICATTNW),$D(DICATTMN) D DIVR^DIUTL(DICATTA,DICATTF) ;re-verify fields
 Q
 ;
GET ;
 K DICATT2N,DICATT3N,DICATT5N,DICATTLN,DICATT5P
 S DICATT2=$P(^DD(DICATTA,DICATTF,0),U,2),DICATT3=$P(^(0),U,3),DICATT4=$P(^(0),U,4),DICATT5=$P(^(0),U,5,99)
 I $D(^DD(DICATTA,DICATTF,"V")) D GET^DICATTD8 ;Variable-pointer
 Q
 ;
PRE ;PRE-ACTION of first block
 N DIAC,DIFILE
 I DICATTF=.01 D REQ^DDSUTL(1,"DICATT",1,1) ;for now
 I DICATT2["C" D CUNED^DICATTD6(DICATT2)
 I DICATT2["W" F X=18 D UNED(X)
 S X=1 I DICATTF=.01,DICATTA-DICATTB S X=2
 D UNED^DDSUTL(20.5,"DICATT",1,X) ;2 means REACHABLE but not EDITABLE
 S DIAC="AUDIT",DIFILE=DICATTB D ^DIAC I %-1 D UNED(3) ;check AUDIT ACCESS
 I DUZ(0)'="@" D  ;only programmers can...
 .D UNED(4),UNED(99) ; ..edit AUDIT CONDITION, XECUTABLE HELP, or ...
 .I DICATT2["X" D X,UNED(1),UNED(2) ;edit LABEL of 'X' field,  or ...
 .I $$TYPE=9 D UNED(20) ;edit a MUMPS type
 .F I=4,5 D UNED^DDSUTL(I,"DICATTVP",8,1) ;build VARIABLE-POINTER SCREEN
 .F I=16,17 D UNED^DDSUTL(I,"DICATTM",3,1) ;specify location of
 .F I=76,76.1 D UNED^DDSUTL(I,"DICATTS",4,1) ;...data
 Q:DICATT2'["X"
X I DICATT2'["F" D UNED(20) D HLP^DDSUTL("NOTE THAT THIS FIELD'S DEFINITION IS NOT EDITABLE") Q
 D UNED^DDSUTL(20,"DICATT",1,2) ;FREE-TEXT DATA TYPE REACHABLE BUT NOT EDITABLE
 F I=68,70 D UNED^DDSUTL(I,"DICATT4",2.4,1) ;MINIMUM LENGTH & PATTERN MATCH NOT EDITABLE
 S DICATT5="$L(X)>"_$$FL^DIQGDDU(DICATTA,DICATTF)
 Q
 ;
UNED(I) D UNED^DDSUTL(I,"DICATT",1,1) Q
 ;
NUMBER ;
 D IJ^DIUTL(DICATTA) S Y=" File #"_J(0)
 F I=1:1 Q:'$D(J(I))  S Y=" Sub-File #"_J(I)_" of"_Y
 S Y="Field #"_DICATTF_" in"_Y
 I $P($G(^DD(DICATTA,DICATTF,0)),U,2) S Y="Multiple "_Y
 S Y=$J("",78-$L(Y)\2)_Y Q
 ;
TYPE() ;Figure out TYPE from the second piece of the zero node
 I DICATT2="" Q ""
 N N F N=9:-1:5,1:1:4,100 I DICATT2[$E("DNSFWCPVK",N) Q
 S:N=100 N=4 Q N
 ;
SCREEN ;
 N N
 I DICATTF=.001 S DIR("S")="I Y<4!(Y=7)" Q
 S N=$$TYPE I N="" S:DUZ(0)'="@" DIR("S")="I Y-9" Q
 I N=6 S DIR("S")="I Y=6" Q  ;can't change a COMPUTED FIELD's type
 S DIR("S")="I Y-6,Y-9"_$P(",Y-5",U,N\2-2!'$D(^DD(DICATTA,0,"UP"))!(DICATTF-.01)!($O(^DD(DICATTA,DICATTF))>0))_$S(N=7:",Y-8",N=8:",Y-7",1:"")
 Q
 ;
BRANCH ;given X=TYPE
 F I=31,32 D REQ^DDSUTL(I,"DICATT2",2.2,X=2) ;UPPER BOUND & LOWER BOUND if we are doing a NUMERIC
 F I=68,69 D REQ^DDSUTL(I,"DICATT4",2.4,X=4&(DICATT2'["X")) ;MAX LENGTH & MIN LENGTH if we are doing a FREE TEXT (but not if UNEDITABLE)
 I X=9 G ^DICATTD9
 I DICATT4="",DICATTF>.001 D UNED^DDSUTL(20.5,"DICATT",1,X=5) ;W-P doesn't ask MULTIPLE
 K DICATTSC
 S DDSSTACK="2."_X Q  ;For types 1-8, go to PAGE 2.1 - 2.8
 ;
CHNG I DICATT5N=DICATT5 K DICATTMN ;No DICATTMN means no change
 D:$D(DICATTMN) PUT^DDSVALF(98,"DICATT",1,DICATTMN) ;HELP-PROMPT prompted
 Q
 ;

DICATTD0
DICATTD0 ;GFT/GFT - CREATE WORD-PROCESSING ATTRIBUTES IN SCREENMAN ;01:06 PM  9 Jan 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
WORD(DICT) ;DICT=21 or 23  for DESCRIPTION and TECHNICAL DESCRIPTION
 N DIC,DUOUT,DTOUT,DICR,DIWETXT
 D DICR
 I $D(@DICR)=0 M @DICR=^DD(DICATTA,DICATTF,DICT) S DICATTDW(DICT)=1 I $D(@DICR)=0 S @DICR@(0)=0
 S DIWETXT="Editing '"_$P(^DD(DICATTA,DICATTF,0),U)_"' "_$P(^DD(0,DICT,0),U)
 S DIC=$P(DICR,")")_"," D EN^DIWE
 I $D(DUOUT)!$D(DTOUT) K @DICR,DICATTDW(DICT) W $$EZBLD^DIALOG(8077)
 S DDSCHG=1 Q
 ;
DICR S DICR="^UTILITY(""DICATTD"",$J,DICT)" Q
 ;
 ;
FILEWORD ;when we're done
 N DICT,DICR
 D DICR
 F DICT=21,23 D
 .I $D(DICATTDW(DICT)) K ^DD(DICATTA,DICATTF,DICT) M ^DD(DICATTA,DICATTF,DICT)=@DICR
 Q

DICATTD1
DICATTD1 ;SFISC/GFT- DATE,TIME ;2 FEB 2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 11
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EARLY ;
 S Y=">X" G Y
 ;
LATEST ;
 S Y="<X"
Y S Y=$F(DICATT5,Y) I Y S Y=$E(DICATT5,Y-9,Y-3) S:Y?.E1"DT" Y="DT" D:Y DD^%DT Q
 K Y Q
 ;
POST1 ;check DATE
 N Z,Y,%DT,I K DDSERROR
 S %DT="T"
 D  I $D(DDSERROR) D HLP^DDSUTL("'EARLIEST DATE' & 'LATEST DATE' ARE IN WRONG ORDER") S DDSBR="21^DICATT1^2.1" Q
 .S Y=$$G(21) I Y="DT" S X=$$G(22) D:X]""  Q
 ..I X'="DT" D ^%DT I Y<DT S DDSERROR=1 Q
 .Q:Y=""  S X=Y D ^%DT S X=$$G(22) Q:X=""  I X="DT" S:Y>DT DDSERROR=1 Q
 .S Z=Y D ^%DT I Y<Z S DDSERROR=1
 S DICATT5N="S %DT=""E"_$E("S",$$G(25)=1)_$E("T",$$G(24)=1)_$E("X",$$G(23)=0)_$E("R",$$G(26)=1)_""" D ^%DT S X=Y K:"
FROMTO K DICATTMN F I=21,22 S Z=$$G(I) Q:Z=""  D
 .I Z="DT" S Y=Z,Z="CURRENT DATE"
 .E  S X=Z D ^%DT S X=Y D DD^%DT S Z=Y,Y=X
 .S DICATTMN(I)=Z,DICATT5N(I)=Y ;Z is readable, Y internal
 I $D(DICATTMN(22)) S DICATTMN="Type a date between "_DICATTMN(21)_" and "_DICATTMN(22)_".",DICATT5N=DICATT5N_DICATT5N(22)_"<X!("_DICATT5N(21)_">X) X"
 E  I $D(DICATTMN(21)) S DICATTMN="Type a date not earlier than "_DICATTMN(21)_".",DICATT5N=DICATT5N_DICATT5N(21)_">X X"
 E  S DICATT5N=DICATT5N_"X<1 X",DICATTMN="(No range limit on date)"
 S DICATTLN=$$G(24)=1*5+7
 S DICATT2N="D",DICATT3N=""
 S X=DICATT5N K DICATT5N S DICATT5N=X ;get rid of those damn subscripts
CHNG I DICATT5N=DICATT5 K DICATTMN ;No DICATTMN means no change
 D:$D(DICATTMN) PUT^DDSVALF(98,"DICATT",1,DICATTMN)
 Q
 ;
G(I) N X Q $$GET^DDSVALF(I,"DICATT1",2.1,"I","")

DICATTD2
DICATTD2 ;SFISC/GFT-NUMERIC FIELD ;1/7/2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 11
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
POST2 ;check NUMERIC
 N L,D,DD,Z,T
 S DD=$$G(34),D=$$G(33),Y=$$G(31) Q:Y=""  S L=$$G(32) Q:L=""
 I L<Y S DDSERROR=1,DDSBR="31^DICATT2^2.2" D HLP^DDSUTL("'MINIMUM' & 'MAXIMUM' ARE IN WRONG ORDER") Q
 S DICATTMN="Type a "_$P("number^dollar amount",U,$$G(33)=1+1)_" between "_Y_" and "_L_", "_DD_" decimal digit"_$E("s",DD'=1)_"."
 S DICATT5N="K:+X'=X",T=DD+1,Z="!(X?.E"_"1""."""_T_".N)"
DOLLAR I D,DICATTF-.001 S DICATT5N="S:X[""$"" X=$P(X,""$"",2) K:X'?"_$P(".""-""",U,Y<0)_".N.1""."".2N"
 S DICATT5N=DICATT5N_"!(X>"_L_")!(X<"_Y_")"_Z_" X",DICATTLN=$L(L\1)+T-(T=1)+(L<0),DICATT2N="NJ"_DICATTLN_","_DD,DICATT3N=""
CHNG I DICATT5N=DICATT5 K DICATTMN ;No DICATTMN means no change
 D:$D(DICATTMN) PUT^DDSVALF(98,"DICATT",1,DICATTMN)
 Q
 ;
G(I) N X Q $$GET^DDSVALF(I,"DICATT2",2.2,"I","")

DICATTD3
DICATTD3 ;GFT/GFT - Set of Codes ;09:06 AM  21 Jan 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
Y(ORDER,CM) ;
 S Y=$P($P(DICATT3,";",ORDER),":",CM) Q
C ;
 N C
 F C=":",";","=","""" I X[C D HLP^DDSUTL("SORRY -- '"_C_"' NOT ALLOWED IN SET VALUES!") K X Q
 Q
 ;
POST3 ;
 N I,X,F
 K DDSBR,DDSERROR
 S F=$$GET^DDSVALF(1,"DICATT",1,"I","") ;we need FIELD LABEL to check total length of "0" node
 S DICATTLN=1,DICATT3N=""
 F X=35:2:59 S I=$$G(X) D  I $D(DDSERROR) G ERROR
 .I I="" Q:$$G(X+1)=""  S DDSERROR=1,DDSBR=X D H("THERE MUST BE A CODE FOR '"_$$G(X+1)_"'!") Q
 .I $D(F(I)) S DDSERROR=1,DDSBR=X D H("CAN'T HAVE TWO IDENTICAL CODES!") Q
 .S X(X)=I,F(I)=""
 .I $L(I)>DICATTLN S DICATTLN=$L(I)
 .S I=$$G(X+1) I I="" S DDSERROR=1,DDSBR=X+1 D H("'"_X(X)_"' MUST MEAN SOMETHING!") Q
 .I $L(DICATT3N)+$L(X(X))+$L(I)+$L(F)>235 S DDSERROR=1,DDSBR=X D H("TOO MUCH!!  TO STORE THAT MUCH, BUILD A NEW FILE AND USE A POINTER!") Q
 .S DICATT3N=DICATT3N_X(X)_":"_I_";"
 S DICATT2N="S",DICATT5N="Q"
 S DICATTMN=$$GET^DDSVALF(98,"DICATT",1,"I","") ;says we have a change
BRANCH I '$D(DICATTSC),DUZ(0)="@" S DICATTSC=3,DDSBR="65^DICATT SCREEN^6" Q
 D SCREEN
 Q
 ;
G(I) N X Q $$GET^DDSVALF(I,"DICATT3",2.3,"I","")
 ;
H(I) N X S X(1)=I,X(2)="$$EOP"
 D HLP^DDSUTL(.X)
 Q
 ;
ERROR S DDSBR=DDSBR_"^DICATT3^2.3" Q
 ;
SCREEN ;
 I DUZ(0)'="@" Q
 I $$S(66)]"" S DICATT5N(12.1)=$$S(66),DICATT5N(12)=$$S(67),DICATT2N="*"_DICATT2N
 Q
 ;
S(I) Q $$GET^DDSVALF(I,"DICATT SCREEN",6,"I","")

DICATTD4
DICATTD4 ;GFT/GFT - FREE TEXT FIELDS;14NOV2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PRE4 ;PATTERN MATCH default
 N I,Z,X,L,YY
 S DICATT5P=" X",YY=0,I=0,L=1,Y="",Z=$P(DICATT5,")!'(",2,99) Q:Z=""
L S I=I+1,X=$E(Z,I) G L:X'?.P Q:X=""  I X="""" S YY='YY G L
 G L:YY I X="(" S L=L+1
 G L:X'=")" S L=L-1 G L:L
 S Y=$E(Z,1,I-1),DICATT5P=$E(Z,I+1,999) Q
 ;
POST4 ;check FREE TEXT
 N L,A1,A2 S L=$$G(69) Q:L=""
E S A1=$P($P(DICATT4,";",2),"E",2) I A1 S A2=$P(A1,",",2) I A2,A2-A1+1<L S DDSERROR=1,DDSBR="69^DICATT4^2.4" D HLP^DDSUTL("          DATA IS STORED AS $E"_A1) Q
 I DICATT2["X" D  S L=L_"X" G FJ ;EDIT LENGTH, EVEN IF NOTHING ELSE
 .S DICATTMN=$$GET^DDSVALF(98,"DICATT",1),Y="MAXIMUM LENGTH: " I DICATTMN=""!$P(DICATTMN,Y,2) S DICATTMN=Y_L D PUT^DDSVALF(98,"DICATT",1,DICATTMN)
 S Y=$$G(68) Q:Y=""
 I L<Y S DDSERROR=1,DDSBR="68^DICATT4^2.4" D HLP^DDSUTL("'MINIMUM' & 'MAXIMUM' ARE IN WRONG ORDER") Q
 S X=$S(L=Y:L,1:Y_"-"_L),DICATTMN="Answer must be "_X_" character"_$E("s",X'=1)_" in length."
 S X=$$G(70) I X]"" S X="!'("_X_")"
 S DICATT5N="K:$L(X)>"_L_"!($L(X)<"_Y_")"_X_DICATT5P
 D CHNG^DICATTD
FJ S DICATTLN=+L,DICATT2N="FJ"_L,DICATT3N=""
 Q
 ;
G(I) N X Q $$GET^DDSVALF(I,"DICATT4",2.4)

DICATTD5
DICATTD5 ;GFT/GFT - SUBDICTIONARY NUMBER FOR MULTIPLE FIELDS IN SCREENMAN ;06:12 PM  23 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SUBDIC ;
 N %,DE
 S %=$P(DICATTA,"."),DE=%_"."_+$P(DICATTA,".",2)_DICATTF
 I +DE'=DE!$D(^DD(DE)) F DE=DICATTA+.01:.01:%+.7,%+.7:.001:%+.9,%+.9:.0001 Q:DE>DICATTA&'$D(^DD(DE))
 S Y=DE Q
 ;
CHKDIC ;
 N %
 S %=$P(DICATTA,".")
 I X<DICATTA K X Q
 I %+1'>X!$D(^DD(X)) K X Q
 Q

DICATTD6
DICATTD6 ;GFT/GFT - Computed Field;12:54 PM  21 Mar 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;78 = COMPUTED EXPRESSION
 ;79 = TYPE OF RESULT
 ;80 = NUMBER OF FRACTIONAL DIGITS
 ;81 = ROUNDED?
 ;82 = TOTALLING SUMS
 ;83 = LENGTH
 ;83.1 = POINT TO FILE
 ;
VAL6 ;validate COMPUTED EXPRESSION (78)
 Q:X=""
 N A,DA,I,J,DQI,DICMX,DICM,DICOMP,DICOMPX,XSAVE
 S DQI="Y("_DICATTA_","_DICATTF_",",XSAVE=X
 D DICOMP I '$D(X) S DDSBR=78 D PUT^DDSVALF(78,,,DDSOLD) Q
 I DUZ(0)="@" K DQI S DQI(1)="TRANSLATES TO THE FOLLOWING CODE:",DQI(2)=X D HLP^DDSUTL(.DQI)
 S DICATT5=X,DICM=Y["m"
 F I=80:1:83 D UNED^DDSUTL(I,"DICATT6",2.6,DICM) ;If multiple, don't ask other questions
 D UNED^DDSUTL(83.1,"DICATT6",2.6,Y'["p")
 K DICATT5N M DICATT5N=X S DICATT5N(9)="^",DICATT5N(9.1)=XSAVE,DICATT5N(9.01)=DICOMPX ;remember all the stuff in DICATT5N array
TYPE S DICATT2N=$S(Y["D":"D",Y["B":"B",1:"")_"C"_$S('DICM:$S(Y["B":"J1",1:"J"),1:"m"_$E("w",Y["w"))_$S(Y["p":"p"_$S($P(Y,"p",2):+$P(Y,"p",2),1:""),1:"")
 I DICATT2N="CJ" D  ;may be numeric for TOTALLING
 .K DICOMPX
 .F Y=1:1 S %=$P(DICATT5N(9.01),";",Y) Q:'%  S DICOMPX(1,+%,+$P(%,U,2))="S("""_%_""")"
 .Q:Y<2  I DICATT5'["/",DICATT5'["\" Q:DICATT5'["*"!(Y<3)
 .S DQI="Y(",X=XSAVE D DICOMP
 .I $D(X)=1 S DICATT5N(9.02)=X_" S Y=X"
 D CUNED(DICATT2N) ;Re-prompt TYPE
 D UNED^DDSUTL(82,"DICATT6",2.6,'$D(DICATT5N(9.02))) ;If no components, don't ask 'SUMS' question
 Q
 ;
CUNED(S) ;also called by DICATTD
 D PUT^DDSVALF(79,"DICATT6",2.6,$$TYPE^DICATT3(S))
 N DICUNED F DICUNED=18,3,4,6,7,8,98,99 D UNED^DDSUTL(DICUNED,"DICATT",1,1) ;Make 'MANDATORY?',etc. uneditable
 Q
 ;
DICOMP S A=DICATTA,DA=DICATTF,DICOMPX="",DICOMP="I",DICMX="X DICMX"
 D IJ^DIUTL(A)
 D ^DICOMP Q
 ;
 ;
BR79 ;branch from TYPE
 N A,S
 D UNED^DDSUTL(83.1,"DICATT6",2.6,X'["p")
 S A="" I X["p" S A=$P($G(DICATT2N),"p",2) S:'A A=$P(DICATT2,"p",2) S:A A=$P($G(^DIC(+A,0)),U)
 D PUT^DDSVALF(83.1,,,A)
 S S=X["D"!(X["B")!(X["m")!(X["p")
 F A=80:1:83 D UNED^DDSUTL(A,"DICATT6",2.6,S) I S D PUT^DDSVALF(A,,,"") ;for DATE, BOOLEAN POINTER, & MULTIPLE, don't ask other questions
 I $$G(79)="" D PUT^DDSVALF(83,,,8) ;default length of field=8
 Q:X="N"
 F A=80,81,82 D PUT^DDSVALF(A,,,""),UNED^DDSUTL(A,"DICATT6",2.6,1)
 Q
 ;
 ;
POST6 ;POST ACTION of Page 2.6
 N T,I
 I $$G(82)=0 K DICATT5N(9.02)
 S T=$$G(79)
 F I="D","B","m","mp","p" I T=I S:T["p" T=T_$$G(83.1) S DICATT2N="C"_T G CHNGD
 S I="" I T="N" S I=$$G(80) ;if numeric, get fractional digits
 S DICATT2N="CJ"_$$G(83) ;length of field
 S T=" S X=$J(X,0,"
 S DICATT5N=$S($D(DICATT5N)#2:DICATT5N,1:$P(DICATT5,T))
 I I D
 .S DICATT2N=DICATT2N_","_I
 .I $$G(81) S DICATT5N=DICATT5N_T_I_")"
CHNGD S DICATTMN=""
 D UNED^DDSUTL(20.5,"DICATT",1,1) ;don't ask multiple
 S DICATT4N=" ; " ;Computed Field is stored nowhere!
 Q
 ;
G(I) Q $$GET^DDSVALF(I,"DICATT6",2.6,"I","")

DICATTD7
DICATTD7 ;SFISC/GFT-POINTERS ;03:29 PM  15 Dec 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
POST7 ;
 N F
 S F=$$G(84)
 S DICATTMN=$G(^DD(DICATTA,DICATTF,3))
 S DICATT2N="P",DICATT5N="Q",DICATTLN=9,DICATT2N="P"_F_$E("'",'$$G(85))
 I F,$D(^DIC(F,0,"GL")) S DICATT3N=$P(^("GL"),U,2)
BRANCH I '$D(DICATTSC),DUZ(0)="@" S DICATTSC=7,DDSBR="65^DICATT SCREEN^6" Q
 D SCREEN^DICATTD3
 I $G(DICATT5N(12.1))]"" S DICATT5N=DICATT5N(12.1)_" D ^DIC K DIC S DIC=$G(DIE),X=+Y K:Y<0 X"
 Q
 ;
G(I) Q $$GET^DDSVALF(I,"DICATT7",2.7,"I","")

DICATTD8
DICATTD8 ;SFISC/GFT;12:19 PM  13 Dec 2001;VARIABLE POINTER FIELDS
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
GET ;
 K DICATTVP
 F DA=0:0 S DA=$O(^DD(DICATTA,DICATTF,"V",DA)) Q:'DA  I $D(^(DA,0)) D
 .F DR=1:1:6 S DICATTVP(DA,DR)=$P(^(0),U,DR)
 .I $G(^(1))]"" S DICATTVP(DA,7)=^(1)
 .I $G(^(2))]"" S DICATTVP(DA,8)=^(2)
 Q
 ;
Y(I,J) ;defaults for Page 2.8
 S Y=$G(DICATTVP(I,J)) Q
 ;
PRE8 ;PRE-ACTION for Page 8
 F I=1:1:5 D P(I)
 I $P($G(^DD(+$$GET^DDSVALF(DICATTVP+90,"DICATT8",2.8,""),0,"DI")),U,2)["Y" D PUT(3,"n"),UNED^DDSUTL(3,,,1,"") ;ARCHIVE File can't be LAYGO'd
 Q
 ;
P(FLD) ;
 D PUT(FLD,$G(DICATTVP(DICATTVP,$$V(FLD)))) Q
 ;
V(FLD) Q $E(24678,FLD) ;Field 1 is .02, etc
 ;
DICS ;
 I DUZ(0)'="@" S DIC("S")="I Y-1.1 Q:'$L($G(^(0,""RD""))) I $TR(DUZ(0),^(""RD""))'=DUZ(0)" Q
 S DIC("S")="I Y-1.1"
 Q
 ;
POST8 ;POST-ACTION for Page 8
 N I,Y
 F I=1:1:5 S Y=$$GET^DDSVALF(I,"DICATTVP",8,"",""),DICATTVP(DICATTVP,$$V(I))=Y
 I DICATTVP(DICATTVP,7)="" S DICATTVP(DICATTVP,8)="" ;if no SCREEN, no EXPLANATION
 F I=1:1:5 D PUT(I,"") ;clean out the screen
 S DICATTLN=18 ;so 'IS THIS FIELD MULTIPLE' will be asked  --  a V-P field can be expected to take up 18 bytes of storage
 Q
 ;
G(I) Q $$GET^DDSVALF(I,"DICATT8",2.8,"I","")
 ;
PUT(I,VAL) D PUT^DDSVALF(I,"DICATTVP",8,VAL,"I","") Q
 ;
POSTVP ;
 N I,S,ERR
 D RECALL^DILFD(1,DICATTB_",",DUZ) ;we've looked up other files, so remember this one
 S DICATTMN="",DICATT2N="V",DICATT3N="",DICATT5N=""
 F I=91:1:97 S DICATTVP(I-90,1)=$$G(I)
 F I=91.1:1:97.1 S S=$$G(I) I S]""!$D(DICATTVP(I-90.1,3)) S DICATTVP(I-90.1,3)=S ;ORDER
 F I=0:0 S I=$O(DICATTVP(I)) Q:'I  D  I $D(ERR) Q
 .I '$G(DICATTVP(I,1)) K DICATTVP(I) Q
 .I $D(I(1,DICATTVP(I,1))) S ERR="DUPLICATE FILE NUMBER" Q
 .S I(1,DICATTVP(I,1))=""
 .I $G(DICATTVP(I,2))="" S ERR="MESSAGE REQUIRED" Q
 .I '$G(DICATTVP(I,3)) S ERR="ORDER NUMBER REQUIRED" Q
 .I $D(I(3,DICATTVP(I,3))) S ERR="DUPLICATE ORDER NUMBER" Q
 .S I(3,DICATTVP(I,3))=""
 .I $G(DICATTVP(I,4))="" S ERR="PREFIX REQUIRED" Q
 .I DICATTVP(I,4)["""" S ERR="BAD PREFIX" Q
 .I $D(I(4,DICATTVP(I,4))) S ERR="DUPLICATE PREFIX" Q
 .S I(4,DICATTVP(I,4))=""
 .S S=$G(DICATTVP(I,7))]"",DICATTVP(I,5)=$E("ny",S+1)
 .I S,$G(DICATTVP(I,8))="" S ERR="SCREEN MUST HAVE EXPLANATION" Q
 I '$D(ERR) Q
 S DDSBR=90+I,S(1)="ERROR IN VARIABLE-POINTER SPECIFICATIONS, FILE "_$G(DICATTVP(I,1)),S(2)=ERR,S(3)="$$EOP"
 D HLP^DDSUTL(.S)
 Q
 ;
FILE ;come here from ^DICATTDE
 N I,DIK,DA
 F I=0:0 S I=$O(^DD(DICATTA,DICATTF,"V","B",I)) Q:'I  K ^DD(+I,0,"PT",DICATTA,DICATTF) ;delete old POINTED-TOs
 K ^DD(DICATTA,DICATTF,"V") ;all other cross_references are with the subfile
 I $G(DICATT2N)'["V" Q  ;stop now if field is no longer V-P!
 S DA=0 F I=1:1 S DA=$O(DICATTVP(DA)) Q:'DA  D
 .S DICATTVP(DA,5)=$E("ny",$G(DICATTVP(DA,7))]""+1)
 .F DIK=1:1:6 S $P(^DD(DICATTA,DICATTF,"V",I,0),U,DIK)=$G(DICATTVP(DA,DIK))
 .F DIK=7,8 I $D(DICATTVP(DA,DIK)) S ^(DIK-6)=DICATTVP(DA,DIK)
 S ^DD(DICATTA,DICATTF,"V",0)="^.12P^",DA(2)=DICATTA,DA(1)=DICATTF
 S DIK="^DD("_DICATTA_","_DICATTF_",""V""," D IXALL^DIK
 Q

DICATTD9
DICATTD9 ;SFISC/GFT ;10:55 AM  26 Jan 2001;MUMPS FIELDS
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
2 S DICATT2N="K",DICATT3N=""
 S DICATT5N="K:$L(X)>245 X D:$D(X) ^DIM",DICATTLN=245
 S DICATTMN="Enter Standard MUMPS code" D CHNG
 D PUT^DDSVALF(7,,,"@","") ;no WRITE ACCESS
 Q
 ;
CHNG I DICATT5N=DICATT5 K DICATTMN ;No DICATTMN means no change
 D:$D(DICATTMN) PUT^DDSVALF(98,"DICATT",1,DICATTMN)
 Q
 ;

DICATTDD
DICATTDD ;GFT/GFT - Multiple Fields;12:02 PM  8 Apr 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
MULMAKE(DICATTD,TYPE) ;DICATTD=sub-dictionary number, TYPE 1-9
 ;only called from DICATTDE
 N F,DA,DIK,I,J,DIC
 S F=$$G(1),^DD(DICATTD,0)=F_" SUB-FIELD^^.01^1"
 S ^(0,"UP")=DICATTA,^("NM",F)=""
 S ^DD(DICATTD,.01,0)=F_"^^^0;1"
 I TYPE-5 D  ;build a "B" x-ref unless this is a W-P multiple
 .S ^DD(DICATTD,.01,1,0)="^.1",^(1,0)=DICATTD_"^B"
 .S:+DICATT4S'=DICATT4S DICATT4S=""""_DICATT4S_""""
 .S DIK=DICATT4S_",""B"",$E(X,1,30),DA)"
 .D IJ^DIUTL(DICATTA) S I=$O(I(""),-1)
 .F DA=I:-1:0 S DIK=I(DA)_$E(",",''DA)_"DA("_(I+1-DA)_"),"_DIK
 .S ^DD(DICATTD,.01,1,1,1)="S "_DIK_"=""""",^(2)="K "_DIK
 .I TYPE=8 S ^(3)="Required for Variable Pointer"
 S DA=.01,DA(1)=DICATTD,(DIC,DIK)="^DD("_DICATTD_","
 D IX1^DIK
 S $P(^DD(DICATTA,DICATTF,0),U,2)=DICATTD ;K DICATT2N
 S ^DD(DICATTA,"SB",DICATTD,DICATTF)=""
 Q
 ;
MULEDIT S G=$$G(1) I G="" G ^DICATTDK:$D(DICATTDK) S DDSBR=1,DDSERROR=1 Q
 S $P(^DD(+DICATT2,0),U)=G_" SUB-FIELD" K ^(0,"NM") S ^("NM",G)=""
 S DR=".01////"_G F X=5,7,8 D 0
DIE S DICATTED=1,DA=DICATTF,DA(1)=DICATTA,(DIC,DIE)="^DD(DICATTA,"
 D ^DIE
 D FILEWORD^DICATTD0 Q
 ;
0 S T=$T(@X),G=$TR($$G(X),";") Q:G="@"  S:G="" G="@" S DR=DR_$P(T,";",2,3)_"////"_G Q
5 ;;8
7 ;;9
8 ;;10
 ;
G(I) N X Q $$GET^DDSVALF(I,"DICATT MUL",10,"I","")

DICATTDE
DICATTDE ;GFT/GFT -- END screen edit;24MAY2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
LAYGODEF ;should user see 'ADDING NEW'?
 N %
 I DICATTF=.01,$G(^DD(DICATTA,0,"UP")) S Y=^("UP"),%=$O(^DD(Y,"SB",DICATTA,0)) I %,$P($G(^DD(Y,%,0)),U,2)["A" S Y="NO" Q
 S Y="YES"
 Q
 ;
POST ;This is the DATA VALIDATION of the DICATT FORM
 N DICATT1N,DICATTM,DICATT4N,DICATT4S,DICATTED,X,T,G,DIC,DIE,DR,DA
 K DDSBR,DDSERROR
 I DICATT2 G MULEDIT^DICATTDD
VP I $$G(20)=8 D POSTVP^DICATTD8 I $D(DDSBR) S DDSERROR=1,DDSBR=DDSBR_"^DICATT8^2.8" Q
 S DICATT1N=$$G(1)
 I DICATT1N="" G ^DICATTDK:$D(DICATTDK) S DDSBR=1,DDSERROR=1 Q
 I DICATT1N=$$G(2) S DDSERROR=1,DDSBR=1 D HLP^DDSUTL("NAME AND TITLE MUST BE DIFFERENT") Q
 I $G(DICATTLN) D  I $D(DDSERROR) D HLP^DDSUTL("YOUR REDEFINITION OF THE FIELD WOULD CAUSE TOO MUCH DATA STORAGE!") Q
 .N W,DP,N,A,L,Y
 .S A=DICATTA,DP=DICATTF,W=$P(^DD(A,DP,0),U,4),Y=$P(W,";"),N=$P(W,";",2),T=0,L=DICATTLN Q:W=""
 .D MX^DICATT1
TOOMUCH .I $$MAX^DICATTDM(L-T,Y)>($G(^DD("STRING_LIMIT"),255)-4) S DDSERROR=1,DDSBR=20
NEW I DICATT4="",'$D(DICATT4N)  D  I $D(DDSERROR) D HLP^DDSUTL("DATA-STORAGE INFO INCOMPLETE") Q
 .I DICATTF=.001 S DICATT4N=" " Q
 .S G=$$G(20) I G=6 S DICATT4N=" ; " Q
 .I G=5!$$G(20.5) D  Q:$D(DDSERROR)  S DICATT4N=DICATTM(76)_";0" Q  ;Note that we can $$GET the defaulted values for storage, even if user has not seen Pages 3 or 4
 ..F T=76,76.1 S DICATTM(T)=$$GET^DDSVALF(T,"DICATTS",4,"","") I DICATTM(T)="" S DDSERROR=1,DDSBR="76^DICATTS^4" Q
 .S G=$$GET^DDSVALF(16,"DICATTM",3,"",""),T=$$GET^DDSVALF(17,"DICATTM",3,"","")
 .I G=""!(T="") S DDSERROR=1,DDSBR="16^DICATTM^3" Q
 .S DICATT4N=G_";"_T Q
 S X=^DD(DICATTA,DICATTF,0) D  I $D(DDSERROR) D HLP^DDSUTL("FIELD DEFINITION IS TOO LONG!") Q  ;Can't fit it into the zero node
 .S T=$L(DICATT1N)+$L($S($D(DICATT2N):DICATT2N,1:$P(X,U,2)))+$L($S($D(DICATT3N):DICATT3N,1:$P(X,U,3)))+$L($S($D(DICATT4N):DICATT4N,1:$P(X,U,4)))+$L($S($D(DICATT5N)#2:DICATT5N,1:$P(X,U,5,999)))
 .I T>($G(^DD("STRING_LIMIT"),255)-13) S DDSERROR=1
FILE ;Everything's good!   We're gonna file it
 I $D(DICATT4N) S $P(^DD(DICATTA,DICATTF,0),U,4)=DICATT4N I DICATT4N'?.P S DICATT4S=$P(DICATT4N,";"),^DD(DICATTA,"GL",DICATT4S,$P(DICATT4N,";",2),DICATTF)="" ;new Piece 4
 I $D(DICATTM),$D(DICATT4S) D  Q  ;make a MULTIPLE
 .N TYPE S TYPE=$$G(20)
 .D MULMAKE^DICATTDD(DICATTM(76.1),TYPE)
WP .I TYPE=5 N DICATTA,DICATTF S:'$D(DICATT2N) DICATT2N="W" ;so we'll bounce back up from W-P multiple
 .S DICATTA=DICATTM(76.1),DICATTF=.01,DICATTMN="" D CHANGED ;make the .01 Field of the new multiple
CHANGED S X=$E("R",$$G(18)) I DICATT2["R"'=$L(X)!$D(DICATTMN) D
 .S DICATTMN="" K ^DD(DICATTA,"RQ",DICATTF) I X["R" S ^(DICATTF)=""
 .I '$D(DICATT2N) S DICATT2N=$TR(DICATT2,"R") I DICATT2["W" S DICATT2N="W"
 .S DICATT2N=X_DICATT2N_$E("I",$G(DICATT2)["I")
 .S %=$P(DICATT2,"P",2) I % K ^DD(+%,0,"PT",DICATTA,DICATTF) ;remove old PT node
 .F %=DICATTA:0  S ^DD(%,0,"DT")=DT Q:'$D(^("UP"))  S %=^("UP") Q:'$D(^DD(%))
 .S %=$P(DICATT2N,"P",2) I % S ^DD(+%,0,"PT",DICATTA,DICATTF)=""
COMPUTED .I DICATT2N["C" D
 ..N DICOMPX,A,DA
 ..S A=+$P(DICATT2,"p",2) I A,$D(^DD(A,0)) K ^(0,"PTC",DICATTA,DICATTF)
 ..S A=+$P(DICATT2N,"p",2) I A,$D(^DD(A,0)) S ^(0,"PTC",DICATTA,DICATTF)=""
 ..S (DA(1),A)=DICATTA,DA=DICATTF,DICOMPX=$G(DICATT5N(9.01)) K ^DD(A,DA,9.02) D ACOMP^DICATT3
 .I DICATTF=.01 D
 ..I DICATTA=DICATTB D  Q
 ...I $D(^DIC(DICATTA,0,"GL")),$D(@(^("GL")_"0)")) D UP2("",DICATT2N)
 ..S Y=$$GET^DDSVALF(2,"DICATTMUL",5,"I","") I Y?1N S DICATT2N=$E("M",Y=1)_DICATT2N
 ..S DR=$$GET^DDSVALF(1,"DICATTMUL",5,"I","")
 ..I $G(^DD(DICATTA,0,"UP")) S Y=^("UP"),%=$O(^DD(Y,"SB",DICATTA,0)) I Y,%,$D(^DD(Y,%,0)) D UP2(DR,DICATT2N) ;Reset the MULTIPLE field at the higher level
 .S $P(^DD(DICATTA,DICATTF,0),U,2)=DICATT2N
PIECE3 .I $D(DICATT3N) S $P(^(0),U,3)=$G(DICATT3N)
 .I $D(DICATTVP) D FILE^DICATTD8
SCREEN S %=$$GET^DDSVALF(65,"DICATT SCREEN",6,"I",""),X=$P(^DD(DICATTA,DICATTF,0),U,2) I %=0!(%="NO")!(X'["P"&(X'["S")) K ^(12),^(12.1)
 F %=8:0 S %=$O(DICATT5N(%)) Q:'%  S ^DD(DICATTA,DICATTF,%)=DICATT5N(%)
 I $D(DICATT5N)#2 S $P(^(0),U,5,99)=DICATT5N
 S DR="50////^S X=DT" F X=1:1:8 D 0
 D DIE
EGP ;K ^DD(DICATTA,DICATTF,.009) ;**CCO/NI  WHEN FIELD CHANGES, KILL OFF ITS HELP TRANSLATIONS
 S DR="Q",X=98 D 0,DIE
 S DR="Q",X=99 D 0,DIE
 D FILEWORD^DICATTD0
MUMPS I $P(^DD(DICATTA,DICATTF,0),U,2)["K" S ^(9)="@" ;**151
AUDIT I $G(DICATT2)]"",$P(^(0),U,2)'=DICATT2,$G(^DD(DICATTB,0,"DIK"))]"" D EN2^DIKZ(DICATTB,"",^("DIK")) ;Recompile CROSS-REFS if auditing changes
RESET D GET^DICATTD ;now that we have filed, the NEW is OLD, in case they keep editing!
Q Q
 ;
UP2(A,X) N T,Y ;A=0 if NO LAYGO  X=SPECIFIER
 S Y=$P(^(0),U,2),Y=$TR(Y,"SDPV")
 F T="S","V","P","D" I X[T S Y=Y_T Q
 I A?1N S Y=$TR(Y,"A")_$E("A",DR=0)
 S $P(^(0),U,2)=Y
 Q
 ;
0 S T=$T(@X),G=$TR($$G(X),";") Q:G="@"!(G="^")  S:G="" G="@" S DR=DR_$P(T,";",2,3)_"////"_G Q  ;Re-file NAME, TITLE, etc.  Delete if they are now gone.  Leave "@" alone
1 ;;.01
2 ;;.1
3 ;;1.1
4 ;;1.2
5 ;;8
6 ;;8.5
7 ;;9
8 ;;10
98 ;;3
99 ;;4
 ;
DIE S DICATTED=1,DA=DICATTF,DA(1)=DICATTA,(DIC,DIE)="^DD(DICATTA,"
 D ^DIE
 Q
 ;
N ;
 S DA=DICATTF I $G(DDA(1))]"" S:$G(DICATTA) DDA(1)=DICATTA S:'$D(^DD(DDA(1),DA)) DDA="D" D AUDT^DICATTA
 I $D(DIU0) N DI D IJ^DIUTL(DICATTA),P^DICATT
 Q
 ;
G(I) N X Q $$GET^DDSVALF(I,"DICATT",1,"I","")

DICATTDK
DICATTDK ;SFISC/GFT-DELETE FIELD ;25MAY2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;FROM ^DICATTDE
KILL N M,DI,DA,DQ,DICL,D0,DIU,DQI,S,Q,O,X,DICATT4M
 I $D(DDA) S DDA="D" ;'DELETE' flag for Auditing
 S S=";",Q=""""
MAYBGONE S (A,DA(1))=DICATTA,(D0,DA)=DICATTF I '$D(^DD(A,DA)) Q
 D IJ^DIUTL(A) S DICL=$O(J(""),-1),DQ=""
 F  S DQ=$O(^DD(0,.01,"DEL",DQ)) Q:DQ=""  I $D(^(DQ,0)) X ^(0) I  S DDSERROR=1,DDSBR=1 H 3 G Q  ;Delete checks
 S O=^DD(A,D0,0),M=$P(O,U),X=0
 F  S X=$O(^DD(A,DA,1,X)) Q:'X  I +^(X,0)=DICATTB,$P(^(0),DICATTB,2)?1"^"1.A S DQI=$P(^(0),U,2) ;HMMMMM  remember that this field cross-referenced top level
MUL I $G(DICATT2) D  ;Delete a multiple field
 .K ^DD(A,"GL",$P($P(O,U,4),";")) ;SO EN+4^DICATT4 KNOWS TO DELETE THE ENTRIES CORRECTLY
 .S DQ(+DICATT2)=0
NEW .S DICATT4M(0)=$NA(^DD(A,D0)) ;from NEW^DICATTD4
 .S DICATT4M("SB")=$NA(^DD(A,"SB",+$P(O,U,2),D0))
 .S ^DD(A,D0,0)=O,^DD(A,"SB",+$P(O,U,2),D0)=""
 .D ^DICATT4
 .K @DICATT4M(0),@DICATT4M("SB")
 .D KDD^DICATT4 ;Kill the DD globals below
ENTRIES E  I $P(O,U,2)'["C"," "'[$P(O,U,4) S DICATT4M=1 D ^DICATT4
 D DELFLD(DICATTA,DICATTF)
 D N^DICATTDE
Q Q
 ;
DELFLD(DICATTA,DA) ;ALSO FROM ^DICATTD
 W $C(7),!,"FIELD DELETED!" S:$D(DDA) DDA=$E("D",DDA="")
 N A,D0,DIC,DIK,O,M S (DIC,DIK)="^DD(DICATTA,",DA(1)=DICATTA,DA=DICATTF
AUD S:$D(DDA) ^UTILITY("DDA",$J,DICATTA,DA,0)=$G(^DD(DICATTA,DA,0))
 D ^DIK
 Q
 ;
 ;
 ;
 ;
POST9 ;POST-ACTION OF FIELD 99, 'ARE YOU SURE YOU WANT TO DELETE THE ENTIRE FIELD?'
 I 'X D  Q  ;IF THEY DON'T ANSWER "YES", REPAINT FIELD LABEL AND QUIT
 .S X=$P(^DD(DICATTA,DICATTF,0),U)
 .I $G(DICATT2) D PUT^DDSVALF(1,"DICATT MUL",10,X) Q
 .D PUT^DDSVALF(1,"DICATT",1,X)
 S DICATTDK=1,DDACT="EX" ;FORCE EXIT FROM SCREENMAN
 D REQ^DDSUTL(20,"DICATT",1,0)
NOREQ ;(not sure anyone uses this entry point yet)
 D REQ^DDSUTL(67,"DICATT SCREEN",6,0)
 D REQ^DDSUTL(31,"DICATT2",2.2,0)
 D REQ^DDSUTL(32,"DICATT2",2.2,0)
 D REQ^DDSUTL(68,"DICATT4",2.4,0)
 D REQ^DDSUTL(69,"DICATT4",2.4,0)
 D REQ^DDSUTL(78,"DICATT6",2.6,0)
 Q
 ;

DICATTDM
DICATTDM ;GFT/GFT - SUBSCRIPT AND PIECE-POSITION FOR STORAGE OF SINGLE-VALUED DATA IN SCREENMAN ;16JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
SUBDEF ;EXECUTABLE DEFAULT for FIELD 16 (SUBSCRIPT)
 S Y=$O(^DD(DICATTA,"GL",""),-1) ;find the highest subscript now used for storage of this File's data
 I $$CHKSUB(Y,1) Q
NXT I Y S Y=Y+1 Q  ;get a new subscript
 F Y=+$O(^DD(DICATTA,"GL","A"),-1):1 Q:'$D(^(Y))
 Q
 ;
PIECDEF ;
 I $E($G(DICATT2N))="K" S Y="E1,245" Q
 S Y=$$G(16) I Y]"" S Y=$$P(Y)
 Q
 ;
P(Y) ;given SUBSCRIPT Y, return PIECE prompt
 N P,X,%
 S X=0,%=1,P=0
PC S X=$O(^DD(DICATTA,"GL",Y,X)) I X'="" S P=$P(X,",",2),%=$S(%>P:%,1:P+1) G PC
 I P S %="E"_%_","_(DICATTLN+%-1)
 E  S %=$O(^(99999),-1)+1
 Q %
 ;
SUBHELP ;
 S Y=$E($G(DICATT2N))="K" D UNED^DDSUTL(17,"DICATTM",3,Y)
 N X,Y,T
 S X(1)="Enter name of MUMPS Global subscript where this Field's data will be stored."
 S X(2)="Already assigned:"
 S Y="",T=3
 F  S Y=$O(^DD(DICATTA,"GL",Y)) Q:Y=""  S X(T)=$G(X(T))_$J(Y,9) I $L(X(T))>66 S T=T+1
 D HLP^DDSUTL(.X)
 Q
 ;
CHKSUB(X,DISHORT) ;used as INPUT TRANSFORM for Fields 16 (SUBSCRIPT) & 76 (MUL SUBSCRIPT)  X is the subscript name.  DISHORT says 'don't go beyond 250'
 N M
 S M=$$GET^DDSVALF(20.5,"DICATT",1,"","") ;'Is this field Multiple?'
 I $D(^DD(DICATTA,"GL",X)),M Q "Another Field is already stored at '"_X_"'"
 I $D(^(X,0)) Q "A multiple field is already stored at '"_X_"'"
 I '$G(DICATTLN) Q 1 ;if we do not have a current length for the field, we are OK
 S M=$S($G(DISHORT):250,1:$G(^DD("STRING_LIMIT"),255)-5) I $$MAX(DICATTLN,X)>M Q "Too much to store at the '"_X_"' subscript"
 Q 1
 ;
MAX(L,Y) ;given L=length of new data, Y=subscript name
 N T,A,DP,N,W
 S A=DICATTA,DP=DICATTF
 D MAX^DICATT1 Q T  ;returns maximum length of subscript's data
 ;
CHKPIEC(P) ;
 N N,S
 S S=$$G(16) I S="" Q S  ;must have subscript
 I P?1"E"1.N1","1.N S N=$P(P,",",2)-$E(P,2,9)+1 G USED:N'<$G(DICATTLN) Q "Can't be less than "_DICATTLN
 I P>0,P<100,P?.N,+P=P G USED
 Q ""
USED I $D(^DD(DICATTA,"GL",S,P)) Q "Already used for '"_$P(^DD(DICATTA,$O(^(P,0)),0),U)_"'"
 I P["E",$O(^(0)) Q "Can't store by $EXTRACT in the same subscript with $PIECES"
 Q 1
 ;
PIECHELP ;
 N X,G,Y,P,T
 S X(1)="Type a number from 1 to 99"
 S G=$$G(16) Q:G=""
 I '$D(^DD(DICATTA,"GL",G)) S X(1)=X(1)_" or an $EXTRACT range such as ""E2,4""." Q
 S X(1)=X(1)_".",X(2)="Currently assigned: ",Y="",T=2
 F  S Y=$O(^DD(DICATTA,"GL",G,Y)) Q:Y=""  S P=$O(^(Y,0)) I $D(^DD(DICATTA,P,0)) S X(T)=$G(X(T))_$J(Y,7) I $L(X(T))>66 S T=T+1
 D HLP^DDSUTL(.X)
 Q
 ;
POST ;POST-ACTION of Page 3
 N %
 S %=$$CHKPIEC($$G(17)) I '% S DDSBR=% K % S %(1)=DDSBR,DDSBR=16 D H(.%)
 Q
 ;
H(%) S %($O(%(""),-1)+1)="$$EOP"
 D HLP^DDSUTL(.%)
 Q
 ;
G(I) Q $$GET^DDSVALF(I,"DICATTM",3,"","")

DICD
DICD ;SFISC/XAK-DISP,SELECT,DELETE,EDIT XREF ;11:26 AM  18 Aug 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DICD S (DA,DL)=+Y D CHIX I 'DQ D ^DICE G Q
 D RD G:$D(DIRUT) Q I Y["C" D ^DICE G Q
 I Y["E" D EDT^DICE G Q
 D DEL G Q
 ;
DEL I DH(DQ,4) D R Q:'$D(DICD)  S DQ=DICD
 I $D(DH(DQ,3)) W !?5,$C(7),"This cross-reference cannot be deleted.",! Q
ASK S %=2 W !,"Are you sure that you want to delete the CROSS-REFERENCE " D YN^DICN Q:(%<0)!(%=2)
 I %=0 W !?7,"Answer YES if you want to delete the Cross-Reference." G ASK
 W !,"  ...OK",! K:I["SOUNDEX" ^DD(DI,0,"LOOK"),^("QUES")
 S ^DD(J(N),DL,1,0)="^.1",X=^(DQ,2),Y=$P(I,U,2) I Y?1A.E,+I=J(0),I'["MNEM",I'["MUM" K @(I(0)_"Y)") G DDD
 G DDD:X="Q"!$F(I,"BUL") I $P(I,U,3)]"",I'["MUM",I'["TRIG" D DD G DDD
 S %=1 W "DO YOU WANT THE INDIVIDUAL CROSS-REFERENCE VALUES DELETED" D YN^DICN Q:%<1
 D DD:%=1
DDD I $D(DDA) S DDA="D" D XA^DICATTA
 S DIK="^DD(J(N),DL,1,",DA(1)=DL,DA(2)=J(N),DA=DQ D ^DIK K DIK,DA
 S DA=DL D DIEZ^DIU0
D I $D(^DD(J(0),0,"DIK")) S X=^("DIK"),Y=J(0),DMAX=^DD("ROU") D EN^DIKZ
 Q
 ;
CHIX ;
 K DH S DQ=0,X="CURRENT CROSS-REFERENCE"
 F Y=0:1 S DQ=$O(^DD(DI,DA,1,DQ)) Q:DQ'>0  S DH(DQ)=^(DQ,0),DH(DQ,4)=Y S:$D(^(3)) DH(DQ,3)=^(3)
 W !! I 'Y S DQ=0 W "NO ",X Q
 I Y=1 W X_" IS " S DQ=$O(DH(0)) D L Q:'$D(DICD)  S %=2 W !,"WANT TO "_DICD_" IT" D YN^DICN S:%=-1 DICDF=1 S:%=1 DICD=DQ Q
 D M Q:'$D(DICD)  S %=2 W !,"WANT TO "_DICD_" ONE OF THEM" D YN^DICN Q:%-1
R R !,"WHICH NUMBER: ",X:DTIME Q:U[X  I X\1'=X!'$D(DH(X)) D M G R
 S DICD=X,I=DH(X) Q
M W !,"CURRENT CROSS-REFERENCES:" F J=0:0 S J=$O(DH(J)) Q:J'>0  W !?8,J,?14 S DQ=J D L
 Q
 ;
L S I=DH(DQ),X=$P(I,U,3) S:X="" X="REGULAR" W X
 G E:X["BULL" I X["TRIGGER" S %=+$P(I,U,4),(%F,Y)=+$P(I,U,5) W " OF " D WR^DIDH:$D(^DD(%,Y,0)),N Q
 W " '",$P(I,U,2),"' INDEX OF " I +I=J(0) W "FILE"
 W:'$T $P(^DD(+I,0),U)
N W:$D(DH(DQ,3)) !?14,"("_DH(DQ,3)_")" Q
 ;
E F %="CREA","DELE" S %=%_"TE VALUE" I $D(^DD(DI,DA,1,DQ,%)),^(%)'="NO EFFECT" W "  ("_^(%)_")"
 D N Q
 ;
DD ;
 N DIKJ,DA,DV,DH,Y,DCNT,DIK S DIKJ=$J
 K ^UTILITY("DIK",$J) S J=J(N),^($J)=$H,^($J,J,DL,1)=X,Y=$P(^DD(DI,DL,0),U,4),^UTILITY("DIK",$J,J,DL)=$P(Y,";",1),Y=$P(Y,";",2),^(DL,0)="S X=$"_$S(Y:"P(^(X),U,"_Y_")",1:"E(^(X),"_+$E(Y,2,9)_","_$P(Y,",",2)_")")
 I $D(^DD(J,DL,1,DQ,"DIK")) S ^UTILITY("DIK",$J,J,DL,1)="D RCR",^(1,0)=X
 K Y,DA,DV,DH S DH(1)=J(0) F Y=1:1:N S DV(J(Y-1),1)=I(Y),DV(J(Y-1),1,0)=J(Y)
 D WAIT S DIK=DIU,DA=0,DCNT=0 G CNT^DIK1
 ;
KOLD K DIR S DIR(0)="Y",DIR("A")="DO YOU WANT TO EXECUTE THE OLD KILL LOGIC NOW",DIR("?",1)="Enter 'YES' to execute the original kill logic now.",DIR("?")="Otherwise, enter 'NO'."
 D ^DIR K DIR I 'Y!$D(DIRUT) K DTOUT,DUOUT,DIRUT,DIROUT Q
 N DA W !!,"Executing old kill logic...",! S X=A1(2) D DD Q
WAIT ;
 W !,"..."
 W $P("HMMM^EXCUSE ME^SORRY","^",$R(3)+1),", ",$P("THIS MAY TAKE A FEW MOMENTS^LET ME PUT YOU ON 'HOLD' FOR A SECOND^HOLD ON^JUST A MOMENT PLEASE^I'M WORKING AS FAST AS I CAN^LET ME THINK ABOUT THAT A MOMENT","^",$R(6)+1)_"..."
 Q
 ;
RD ;
 N DQ,DH W ! S DIR(0)="SAO^E:EDIT;D:DELETE;C:CREATE",DIR("A")="Choose E (Edit)/D (Delete)/C (Create): "
 S DIR("?",1)="Enter 'E' to edit an existing X-reference",DIR("?",2)="      'D' to delete it",DIR("?")="      'C' to create a new X-reference."
 D ^DIR K DIR Q
 ;
Q D Q^DICE K DICD,DDA Q

DICE
DICE ;SFISC/GFT-CREATE AN XREF ;17DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S %=2,DCOND="CROSS-REFERENCE" W !,"WANT TO CREATE A NEW ",DCOND," FOR THIS FIELD" D YN^DICN G Q:%-1
N F DQ=1:1 Q:'$D(^DD(DI,DA,1,DQ))
 W !,"CROSS-REFERENCE NUMBER: "_DQ_"// " R X:DTIME S:'$T DTOUT=1 G Q:'$T S:X="" X=DQ G NQ:X'?.N!'X,X:$D(^(X)) S DQ=X
 S DH=0,DIC="^DOPT(""DICR"",",DIC(0)="EQA",DIC("B")=1,DIC("S")="I 1"_$P(",Y-4",U,DUZ(0)'="@")_$P(",Y-5",U,$D(^DD(J(N),0,"LOOK"))>0)_$P(",Y-7",U,'$D(^XMB(3.6))) S:$P($G(^DD($$FNO^DILIBF(J(N)),0,"DI")),U)="Y" DIC("S")=DIC("S")_",Y-4,Y-6,Y-7"
 D ^DIC K DIC D QQ S Y=+Y G X:Y<0,6^DICE0:Y=6,^DICE7:Y=7 ;1=REGULAR 2=KWIC 3=MNEMONIC 4=MUMPS 5=SOUNDEX 6=TRIGGER 7=BULLETIN
 G A:'N W !,"WANT TO ",DCOND," WHOLE FILE BY THIS FIELD" D YN^DICN G X:%<1 I %=1 S DH=N G A
 F DH=N-1:-1 Q:'DH  S %=1 W !,"WANT TO "_DCOND_" "_$P(^DD(J(N-DH),0),U,1)_" BY THIS FIELD" D YN^DICN G X:%<1,A:%=1
A S %=1,DIK="" I Y=1!(Y=4) W !,"WANT ",DCOND," TO BE USED FOR LOOKUP AS WELL AS FOR SORTING" D YN^DICN G X:%<1 I %=2 S DIK="A"
 I Y=2 S DIKWIC="(,.?! '-/&:;)" W !,"PARSE ON THE FOLLOWING CHARACTERS: ",DIKWIC,"//" R X:DTIME S:'$T DTOUT=1 G Q:X=U!'$T S:X]"" DIKWIC=X I X["""" S X="?"
 I Y=2,X]"",X'?1P.P!(X?1"?"."?") W !?5,"Please enter the punctuation marks (except quotes) which will be used to ",!?5,"separate the words in this field." G A
 I Y=3 F I=0:0 S I=$O(^DD(J(N-DH),.01,1,I)) G X:I=""!(DL=.01&'DH) I $D(^(I,0)) S DE=$P(^(0),U,2) G CKF:DE?1U.UN
 I Y=4 D M G:$D(DIRUT) Q S:$D(XX(1)) X(1)=XX(1) S:$D(XX(2)) X(2)=XX(2) K XX
 ;GFT MODIFIED NEXT 6 LINES: INDEX MUST BE UPPER-CASE, START WITH PROPER LETTER, AND NOT BE A DUPLICATE
 N DISTART S DISTART=$S(Y-1&(Y-3)!(DA-.01):67,1:66) ;START WITH "B" OR "C"
IX F X=DISTART:1 S DE=DIK_$C(X) D  I $D(DE) G CKF:DUZ(0)'="@" W !,"INDEX: ",DE,"// " R X:DTIME S:'$T DTOUT=1 S:X]"" DE=X G Q:X[U!'$T D  G IX:'$D(DE) Q
 .I $D(^DD(J(N-DH),0,"IX",DE))!$D(^DD("IX","BB",J(N-DH),DE)) K DE Q  ;SUBROUTINE CALLED TWICE!  KILLS 'DE' IF NO GOOD   CAN'T ALREADY EXIST
 .I DE'?1U.UN K DE Q
 .I DIK="A" K:DE'?1"A".E DE Q
 .E  I DE?1"A".E K DE
CKF W !,"..." S DREF=Y
 D ^DICE0 W ! D DSC,DIEZ^DIU0,F G Q
 ;
F S X=^DD(J(N),DA,1,DQ,1),%=1 I DREF=1!(DREF=4)!$D(^("CONDITION")),@("$O("_DIU_"0))>0") D  G:'% F
 . W !!,"DO YOU WANT TO CROSS-REFERENCE EXISTING DATA NOW"
 . S %=0 D YN^DICN Q:%
 . W !!,"Enter 'YES' to execute the new set logic now."
 . W !,"Otherwise, enter 'NO'."
 D DD^DICD:%=1 I $D(DDA),DDA="" S DDA="N" D XA^DICATTA
 K % Q
 ;
M N Y,DQ
 F I=1,2 S DIR(0)=".1,"_I D  Q:$D(DTOUT)!$D(DUOUT)
 . F  D ^DIR Q:$D(DTOUT)!$D(DUOUT)  I X]"" S XX(I)=X Q
 K DIR Q
 ;
Q D QQ K DE,DB,DREF,DCOND,DICOMPX,I,DQ,DA,DH,DIK,DIC,N,DL,J,X,Y,A,XX Q
 ;
EDT ;
 I DH(DQ,4) D R^DICD Q:'$D(DICD)  S DQ=DICD
 I $D(DDA) S DDA="E" D XS^DICATTA
 W ! F A0=1:1:2 S A1(A0)=^DD(J(N),DA,1,DQ,A0)
 S A0=DI,DR=$S(DUZ(0)="@"&($P(DH(DQ),U,3)["MUMPS"):"1:3;10;666",DUZ(0)="@"&($P(DH(DQ),U,3)]""):"3;10;666",1:"3;10") D ED ;NOREINDEX  PATCH 167
 F A0=1:1:2 I A1(A0)'=^DD(J(N),DA,1,DQ,A0) S ^("DT")=DT,DREF=4 D DIEZ^DIU0,KOLD^DICD,F,D^DICD Q
 K A0,A1 I $D(DDA) D XA^DICATTA
 Q
 ;
ED S:$D(DA(1))#2 A1(3)=DA(1) S DICD=DL,DA(2)=A0,DA(1)=DA,DA=DQ,DIE="^DD("_DA(2)_","_DA(1)_",1," D DIE K DIE,DR
 S DL=DICD,DQ=DA,DA=DA(1) S:$D(A1(3)) DA(1)=A1(3) K DICD Q
 ;
DIE N J,N,DI,A1 D ^DIE Q
DSC S A0=J(N),DR="3;4///"_DT_";10" D ED K A0 Q
 ;
NQ I X'[U D HLP G N
X W $C(7),"??" G Q
 ;
QQ K ^UTILITY("DICE",$J),DBOOL,DLAY,DQI,DICOMPX,DIN,DCNEW,DFLD,DREF,DENEW,DLOC,DSUB,DHI,DOLD,DNEW,%X,V
 Q
HLP ; Traditional Cross Reference Help - Called From NQ
 ; SF-CIOFO/SO 1/12/00
 W !
 W !,?5,"You may use the number shown if you are the custodian of the file this"
 W !,?5,"cross-reference is in.  If you are not the custodian of the file, you"
 W !,?5,"should select a number that corresponds with a numberspace for which you"
 W !,?5,"have custody.  Questions regarding numberspace custody may be referred"
 W !,?5,"to:  DBA@FORUM.VA.GOV",!
 Q

DICE0
DICE0 ;SFISC/GFT,XAK-XREF'S ;5/24/94  2:21 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S ^DD(J(N),DA,1,0)="^.1",^(DQ,0)=J(N-DH)_U_DE,X=I(0)
 F Y=N:-1:DH+1 S X=X_"DA("_Y_"),"_I(N+1-Y)_","
 S X=X_""""_DE_""",",Y=",DA)" F %=1:1:DH S Y=",DA("_%_")"_Y
 D @DREF ;I DE'="B" K DICOMPX S DE(0)=Y(0) D COND^DICE4 S Y(0)=DE(0) I $D(DCOND) S ^(1)=X_" I X S X=DIV "_^DD(J(N),DA,1,DQ,1),^(2)=X_" I X S X=DIV "_^(2),^("CONDITION")=DCOND(0)
 S DIK="^DD(J(N),",DA(1)=J(N) D IX1^DIK
 I $D(^DD(J(0),0,"DIK")) S X=^("DIK"),Y=J(0),DMAX=^DD("ROU") D EN^DIKZ
 Q
 ;
1 S Y="$E(X,1,30)"_Y,^(2)="K "_X_Y
 S ^DD(J(N),DA,1,DQ,1)="S "_X_Y_"=""""" Q
 ;
2 S ^(0)=^(0)_"^KWIC",^(1)="S %1=1 F %=1:1:$L(X)+1 S I=$E(X,%) I """_DIKWIC_"""[I S I=$E($E(X,%1,%-1),1,30),%1=%+1 I $L(I)>2,^DD(""KWIC"")'[I S "_X_"I"_Y_"="""""
 S ^(2)="S %1=1 F %=1:1:$L(X)+1 S I=$E(X,%) I """_DIKWIC_"""[I S I=$E($E(X,%1,%-1),1,30),%1=%+1 I $L(I)>2 K "_X_"I"_Y K DIKWIC Q
 ;
3 D 1 S ^(1)="S:'$D("_X_Y_") ^(DA)=1",^(2)="I $D("_X_Y_"),^(DA) K ^(DA)",^(0)=^(0)_"^MNEMONIC" Q
 ;
4 S ^(0)=^(0)_"^MUMPS",^(1)=X(1),^(2)=X(2) K X Q
 ;
5 S ^(0)=^(0)_"^SOUNDEX",X=X_"X_I"_Y,Y="S I=$E(X,1,27) D SOU^DICM ",^(1)=Y_"S "_X_"=""""",^(2)=Y_"K "_X,(^DD(J(N),0,"LOOK"),^("QUES"))="SOUNDEX" Q
 ;
6 ;
 D ^DICE1 G Q:U[X S ^UTILITY("DICE",$J,0)="^^TRIGGER^"_DIN_U_DENEW,^("FIELD")=DCNEW
 F DIK=1,2 D ^DICE2 G M^DICATT:$D(DTOUT),Q:U=X
 I '$D(^DD(DIN,DENEW,9))!($G(^(9))="") S %=2 W !!,"WANT TO PROTECT THE '",DNEW,"' FIELD, SO THAT",!,"IT CAN'T BE CHANGED BY THE 'ENTER & EDIT' ROUTINE" D YN^DICN G QQ:%<0 S:%=1 ^(9)=U
 ;
X ;
 S DA=DL,%Y="^DD("_DI_","_DL_",1,"_DQ_",",%X="^UTILITY(""DICE"",$J," I @("$O("_%Y_"0))>0") W $C(7),!!,"HEY, WHILE WE WERE TALKING, SOMEONE ELSE CREATED CROSS-REFERENCE #"_DQ_"!!!" G Q
 D %XY^%RCR,DSC^DICE,DIEZ^DIU0 I $D(DDA) S DDA="N" D XA^DICATTA
 D:$D(^DD(J(0),0,"DIK")) D^DICD D QQ S DIK="^DD("_DI_","_DL_",1,",(DA,DREF)=DQ,DA(1)=DL,DA(2)=DI,@(DIK_"0)=U_.1") D IX1^DIK W !,"...CROSS-REFERENCE IS SET"
 S %=2 I @(DIK_DREF_",1)'=""Q"""),@("$O("_DIU_"0))>0") W !!,"DO YOU WANT TO RUN THE CROSS-REFERENCE FOR EXISTING ENTRIES NOW" D YN^DICN I %=1 S X=^DD(DI,DL,1,DQ,1) D DD^DICD
Q G Q^DICE
QQ G QQ^DICE

DICE1
DICE1 ;SFISC/XAK-TRIGGER LOGIC ;10:24 AM  9 Jul 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FIELD S %=DI,%F=DL,DOLD=$P(^DD(DI,DL,0),U) W !!,"WHEN THE " D WR^DIDH
 R "IS CHANGED,",!,"WHAT FIELD SHOULD BE 'TRIGGERED': ",X:DTIME Q:U[X
 I X?1."?" S DIC="^DD("_DI_",",DIC(0)="QE",DIC("S")="S %=$P(^(0),U,2) I %'[""C""&(%'[""W"")",DIC("W")="W:$P(^(0),U,2) ""   (multiple)""" D ^DIC K DIC G FIELD
 F %=0:0 S %=$F(X," IN ") Q:'%  S X=$E(X,1,%-5)_":"_$E(X,%,999),%=$F(X," FILE") S:% X=$E(X,1,%-6)_$E(X,%,999)
 F %=99:0 S %=$O(I(%)) Q:%=""  K I(%),J(%)
 S %=-1,DCNEW=X,DICOMP="SW?",X="INTERNAL("_$P(X,":")_")"_$S($F(X,":"):":",1:"")_$P(X,":",2,99) D DA,DICOMP
 I '$D(X) S X=DCNEW,DICOMP="SW?" D DICOMP
 F %=9.2:.1 Q:'$D(X(%))  S ^UTILITY("DICE",$J,%+80)=X(%)
 I '$D(X)!'DICOMPX W !,"  ...",I,$C(7),!,"YOU MUST IDENTIFY SOME FIELD, EITHER WITHIN THE",!,"'",@("$P("_DIU_"0),U)"),"' FILE OR IN SOME OTHER" G FIELD
 S DFLD=X,DENEW=+$P(DICOMPX,U,2),DIN=+DICOMPX,DREF="",DLAY=Y["L"
 K X F X=Y\100*100:-100:0 F %=X:1 Q:'$D(J(%))  G CK:J(%)=DIN
 W $C(7),!,"SORRY, I AM CONFUSED" G FIELD
CK I DENEW=.001 W $C(7),!,"CAN'T UPDATE A 'NUMBER' FIELD!" G FIELD
 I DENEW=DL,DIN=DI W $C(7),!,"CAN'T HAVE A FIELD TRIGGERING ITSELF!!!" G FIELD
 S DIFILE=J(X),DIAC="DD" D ^DIAC I '% W $C(7),!,"YOU DON'T HAVE 'DATA DEFINITION' ACCESS TO",!,"  THE '",$O(^DD(J(X),0,"NM",0)),"' FILE!" G FIELD
 I $P($G(^DD(J(X),0,"DI")),U,2)["Y" W $C(7),!,"CAN'T TRIGGER A RESTRICTED"_$S($P(^("DI"),U)["Y":" (ARCHIVE)",1:"")_" FILE!" G FIELD
 F X=X:1 S %=X#100,DREF=DREF_I(X)_$E(",",1,%)_"DIV("_%_"),",A=X S:$S('$D(J(%)):1,1:J(%)-J(X))&'$D(DICOMPX(0,J(X))) ^UTILITY("DICE",$J,"DIC")="LOOKUP" Q:J(X)=+DICOMPX!'$D(I(X+1))
 S DLOC=$P(^DD(DIN,DENEW,0),U,4),DSUB=$P(DLOC,";"),DLOC=$P(DLOC,";",2),DNEW=$P(^(0),U) S:+DSUB'=DSUB DSUB=""""_DSUB_""""
 I $P(^(0),U,2)["C" W !,$C(7),"CAN'T TRIGGER A COMPUTED FIELD!" G FIELD
 W "  ...OK" K DIFILE,DIAC Q
 ;
DA S DA="^DD("_DI_","_DL_",1,"_DQ_","_8 Q
 ;
DICOMP ;
 S DICOMPX="",DICOMPX(0)="DIV(",DQI="Y(" G ^DICOMP
 ;

DICE2
DICE2 ;SFISC/GFT-TRIGGER LOGIC ;09:41 AM  10 Jul 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:$D(DTOUT)  W !!!,"---",$P("SET^KILL",U,DIK)," LOGIC---" S DA="^DD("_DI_","_DL_",1,"_DQ_","_(DIK+3)
C K DICOMPX,DATE S:DOLD=DNEW DNEW="TRIGGERED "_DNEW S DNEW=$E(DNEW,1,30),DICOMPX(DNEW)="DIU",DICOMPX(DNEW,U)=DIN_U_DENEW,DCOND="SET" S:$P(^DD(DIN,DENEW,0),U,2)["D" DICOMPX(DNEW,"DATE")=1
 W !!,"IN ANSWERING THE FOLLOWING QUESTION, '"_DNEW_"'",!?2,"CAN BE USED TO REFER TO THE EXISTING TRIGGERED FIELD VALUE.",!
 S DICOMP="?",DICOMPX="",%=DIN S:DIK=1 DICOMPX(1,DI,DL)="DIV"
 D OLD W "PLEASE ENTER AN EXPRESSION WHICH WILL BECOME THE VALUE OF THE",! S %F=DENEW D WR^DIDH
 D GET Q:U[X  I X="""@""" K X G DICE2^DIQQ
 I X="@" S X="S X="""""
 E  D ^DICOMP G DICE2^DIQQ:'$D(X) F %=9.2:.1 Q:'$D(X(%))  S ^UTILITY("DICE",$J,DIK+3*10+%)=X(%)
 K DICOMPX(DNEW) I X="S X=""""" S DE=X,DCOND="DELE" D DEL^DICE3 G Q:X=U,^DICE4:DENEW-.01 F X=0:1 G D01:'$D(J(X)) I J(X)=DIN W $C(7),!,"BUT THE TRIGGERING FIELD DEPENDS ON THE TRIGGERED FIELD!" S X=U G Q
 S DE="S X=DIV "_X,%=$P(^DD(DIN,DENEW,0),U,2) I %["D",'Y["D" W $C(7),!,"WARNING -- THIS SHOULD PRODUCE A DATE VALUE, AND IT MAY NOT!"
 S V=$P(%,"P",2) I V,DICOMPX-V!($P(DICOMPX,U,2)-.001) W !,$C(7),"WARNING -- THIS MUST BE '",$P(^DIC(+V,0),U)," NUMBER'!"
 I Y["B" W $C(7),!,"WARNING--THIS TRUTH-VALUED EXPRESSION WILL PRODUCE ONLY VALUES OF '0' OR '1'"
 I %'["D",Y["D" W $C(7),!,"WARNING -- THIS MAY PRODUCE A 'DATE', AND IT SHOULDN'T!"
 D ^DICE3 G ^DICE4:X'=U
Q Q
 ;
OLD ;
 I DIK=2 S X=$E("OLD "_DOLD,1,30),DICOMPX(X)="X",DICOMPX(X,U)=DI_U_DL W ?2,"NOTE: '"_X_"' CAN BE USED TO REFER TO THE VALUE OF THE",!?2,DOLD_" FIELD BEFORE ITS CHANGE OR DELETION.",! S:$P(^DD(DI,DL,0),U,2)["D" DICOMPX(X,"DATE")=1
 Q
 ;
D01 S V=DREF,X=$L(V)-1 F %=X:-1 I "(,"[$E(V,%) S DHI=$E(V,%+1,X) I DHI'?1N1")" S V=$E(V,1,%),X=0 Q
DQ S X=$F(V,"""",X) I X>0 S V=$E(V,1,X-1)_""""_$E(V,X,999),X=X+2 G DQ
 S X="I "_DHI_">0 N DIK S DIK(0)=DA,",V="DIK="""_V_""",",DHI="DA="_DHI_" D ^DIK",DTAG="S DA=DIK(0)"
 F %=1:1:N S X=X_"DIK("_%_")=DA("_%_"),",DTAG=DTAG_",DA("_%_")=DIK("_%_")"
 F %=1:1:A#100 S DHI="DA("_%_")=DIV("_(A#100-%)_"),"_DHI
 S X=X_V_DHI,^UTILITY("DICE",$J,"DIK")="DELETE" G F^DICE4
 ;
GET ;
 W !," WHENEVER THE '"_DOLD_"' FIELD IS "_$P("ENTERED OR CHANGED^CHANGED OR DELETED",U,DIK)
 R ": ",X:DTIME S:'$T X=U S Y=X I X="" S Y="NO EFFECT",^UTILITY("DICE",$J,DIK)="Q" W "  ",Y I DIK=2,^UTILITY("DICE",$J,1)="Q" W $C(7),"??" S X=U
 S ^UTILITY("DICE",$J,$P("CREA^DELE",U,DIK)_"TE VALUE")=Y

DICE3
DICE3 ;SFISC/GFT-TRIGGER LOGIC ;8/14/89  12:37
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G DIU:DIK=1
 ;
DEL ;
 G DIU:'DLAY
 W !!,$C(7),"ARE YOU SURE YOU WANT TO 'ADD A NEW ENTRY' WHEN THIS "_$P("SET^KILL",U,DIK)_" LOGIC OCCURS"
 S %=2 D YN^DICN W ! I %<1 S X=U Q
 G DIU:%=1 W "..OK, LET ME THINK A SECOND...",! S X=DCNEW,DICOMP="",DA="^DD("_DI_","_DL_",1,"_DQ_","_9 D DICOMP^DICE1
 S DFLD=X F %=9.2:.1 Q:'$D(X(%))  S ^UTILITY("DICE",$J,90+%)=X(%)
DIU S Y=DFLD_" S DIU=X K Y",DA="^DD("_DI_","_DL_",1,"_DQ_","

DICE4
DICE4 ;SFISC/GFT-TRIGGER LOGIC ;26NOV2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 3
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D SET S DTAG="S DIH=$G("_DREF_DSUB_")),DIV=X "_$P("I $D(^(0)) ","""",A>99)_X_",DIH="_DIN_",DIG="_DENEW_" D ^DICR",X=""
 S:$L(DE)+$L(DTAG)>160&($L(DE)>30) ^UTILITY("DICE",$J,DIK+.1)=DE,DE="X "_DA_DIK_".1)" S X=DE
F ;
 S DB=DA_DIK
 S:$L(Y)+$L(X)>190 ^UTILITY("DICE",$J,DIK+.2)=Y,Y="X "_DB_".2)" S:$L(Y) X=Y_" "_X
 K DICOMPX(DNEW) S DHI=X,DCOND=DCOND_"TING OF '"_DNEW_"'" D COND G P:'$D(DCOND) I DLAY,DICOMPX,DICOMPX-DI W !,"SORRY, CAN'T DO THIS WHEN 'LAYGO' ALLOWED" S X=U Q
 S DHI="I X S X=DIV "_DHI I $O(J(A))>0 S ^("DIC")=""
P S:$L(DHI)+$L(X)>220 ^UTILITY("DICE",$J,DIK+.3)=X,X="X "_DB_".3)" S X=X_" "_DHI
 S:$L(DTAG)+$L(X)>225 ^UTILITY("DICE",$J,DIK+.4)=DTAG,DTAG="X "_DB_".4)" S ^UTILITY("DICE",$J,DIK)=X_" "_DTAG K DTAG,D Q
 ;
SET G PIECE:DLOC S DHI=$P(DLOC,",",2),%=+$E(DLOC,2,9),X="S DE="_(%-1)_"-$L(DIH),DIU=$E(DIH,"_%_","_DHI_"),Y=$E(DIH,"_(DHI+1)_",999),^("_DSUB_")="
 I %>1 S X=X_"$E(DIH,1,"_(%-1)_")_"
 S X=X_"$J("""",$S(DE>0:DE,1:0))_DIV_$S(Y?."" "":"""",1:$J("""","_(DHI-%+1)_"-$L(DIV))_Y)" Q
PIECE S X="S $P(^("_DSUB_"),U,"_DLOC_")=DIV" Q
 ;
COND S DE=" DIV=X" F %=0:1:N S DE=DE_",D"_%_"=DA"_$S(%=N:"",1:"("_(N-%)_")") I A#100'<% S DE=DE_",DIV("_%_")=D"_%
 D CC I $D(DCOND) S DE=DE_" "_X
 S X="K DIV S"_DE
Q Q
 ;
CC ;
 S DA=DA_(DIK+5)
R W !!,"DO YOU WANT TO MAKE THE "_DCOND_" CONDITIONAL" K DICOMPX S %=2,DICOMPX="",DICOMP="?",D="ENTER AN EXPRESSION FOR THE CONDITION: " D YN^DICN I %-1 K DCOND Q
 I DIK=1 S DICOMPX("Y(0)")="Y(0)",DICOMPX(1,DI,DL)="Y(0)",DICOMPX("Y(0)",U)=DI_U_DL
 E  W ! D OLD^DICE2 S Y="CREATE CONDITION" I $D(^UTILITY("DICE",$J,Y)) W !,D_^(Y)_"// " R X:DTIME S:'$T DTOUT=1 G Q:X=U!'$T S:X="" X=^(Y) G X
 W !,D R X:DTIME S:'$T DTOUT=1 G Q:X=U!'$T
X I X?."?" W !,"ENTER A TRUTH-VALUED 'COMPUTED-FIELD' EXPRESSION ",!?4,"(PERHAPS INVOLVING '"_DOLD_"')" G R
 S DCOND(0)=X D ^DICOMP I $D(X) W:Y'["B" !,"WARNING--THIS DOESN'T LOOK LIKE A CONDITION EXPRESSION!" S X="S Y(0)=X "_X,^UTILITY("DICE",$J,$P("CREA^DELE",U,DIK)_"TE CONDITION")=DCOND(0) F %=9.2:.1 G Q:'$D(X(%)) S ^(DIK+5*10+%)=X(%) K X(%)
 W $C(7),"??" G R

DICE7
DICE7 ;SFISC/GFT-BULLETIN X-REFS ;12:38 PM  8 Jun 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DICE",$J) S ^($J,0)="^^BULLETIN MESSAGE",DOLD=$P(^DD(DI,DL,0),U,1)
 F DIK=1,2 Q:$D(DTOUT)  D M G QQ:X[U!$D(DTOUT) I X]"" S DQI="Y(",DCOND="SENDING OF '"_DREF_"'" D DA,CC^DICE4,DA G QQ:$D(DTOUT) S DHI=0,DLAY=$S($D(DCOND):X,1:"") D S G QQ:X=U
 Q:$D(DTOUT)  G X^DICE0
QQ G QQ^DICE
 ;
DA S DA="^DD("_DI_","_DL_",1,"_DQ_"," Q
 ;
M W !!!,"---"_$P("SET^KILL",U,DIK)_" LOGIC---",!!,"ENTER THE NAME OF A 'BULLETIN' MESSAGE, IF YOU WANT THAT MESSAGE SENT"
 D GET^DICE2 Q:U[X  S DIC=3.6,DIC(0)="ELMQ",DIC("DR")=".01;2;4;11;10" D ^DIC K DIC,DICOMPX G M:Y<0
 S (DREF,^UTILITY("DICE",$J,$P("CREA^DELE",U,DIK)_"TE VALUE"))=$P(Y,U,2),DCOND=DI_U_DL_U_DIK_U_DQ
 S DIE=3.6,DA=+Y,DR=10 D:'$P(Y,U,3) ^DIE S X=DREF,DI=$P(DCOND,U,1),DL=$P(DCOND,U,2),DIK=$P(DCOND,U,3),DQ=$P(DCOND,U,4) Q
 ;
S W "  ..OK",! S DHI=DHI+1
SS S DLOC="PARAMETER #"_DHI I DHI>1 W !,"NOW, IF THE BULLETIN IS TO HAVE "_DHI_" OR MORE PARAMETERS INSERTED,"
 W !,"ENTER A FIELD NAME (FOR EXAMPLE, '"_DOLD_"'),",!,"OR A 'COMPUTED-FIELD' EXPRESSION,",!,"THE VALUE OF WHICH WILL BE PASSED INTO THE '"_DREF_"' MESSAGE,",!,"AS "_DLOC
 S X=$O(^XMB(3.6,"B",DREF,0)) S:X="" X=-1 I X F Y=1:1 Q:'$D(^XMB(3.6,X,4,Y,0))  I ^(0)=DHI F D=1:1 G T:'$D(^XMB(3.6,X,4,Y,1,D,0)) W !?4,"-- ",^(0)
 W !,"(NOTE THAT NO SUCH PARAMETER IS DEFINED FOR THE '"_DREF_"' BULLETIN)"
T W ! D OLD^DICE2 W DLOC_": " R X:DTIME S:'$T DTOUT=1 G:X?.P QQ:X=U!'$T,SET:X="",SS S DSUB=X,DICOMP="?" D ^DICOMP I $D(X)-1 W $C(7),"??",! G SS
 S DHI(DHI)=X_$P(" S Y=X X ^DD(""DD"") S X=Y",1,Y["D"),^UTILITY("DICE",$J,$P("CREA^DELE",U,DIK)_"TE "_DLOC)=DSUB G S
SET W !
 S ^UTILITY("DICE",$J,DIK)="K XMY S XMB="""_DREF_""" D ^XMB:$D(^XMB(3.6,""B"",XMB)) K Y,XMB"
 ;
 F D=1:1 Q:'$D(DHI(D))  D
 . S X="S X=Y(0) "_DHI(D)_" S XMB("_D_")=X"
 . S %=DIK_"."_$E("00",1,3-$L(D))_D
 . S ^UTILITY("DICE",$J,+%)=X
 ;
 S Y=""
 S:$D(DHI(1))#2 Y=" X ""N DIIND F DIIND="_DIK_".001:.001 Q:$D("_DA_"DIIND))[0  X ^(DIIND)"""
 S I="S Y(0)=X,D"_N_"=DA" F %=1:1:N S I=I_",D"_(N-%)_"=DA("_%_")"
 ;
 I $L(DLAY) D
 . S Y=" I X"_Y
 . S:$L(I)+$L(Y)+$L(DLAY)+$L(^(DIK))>238 ^(DIK+.9)=DLAY,DLAY="X "_DA_(DIK+.9)_")"
 . S DLAY=" "_DLAY
 ;
 S:Y]""!$L(DLAY) ^(DIK)=I_DLAY_Y_" "_^(DIK)

DICF
DICF ;VEN/TOAD,SF/TKW - Lookup: Finder, Part 1 (Main) ; 1/24/13 3:51pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ; Contents
 ;
 ; $$FIND/FINDX/INPUT/HOOK75/LOOKUP: Finder Implementation
 ; $$BADVAL: Validate a Lookup Value
 ; CLOSE: Cleanup before Exiting Finder
 ;
 ;
FIND(DIFILE,DIFIEN,DIFIELDS,DIFLAGS,DIVALUE,DINUMBER,DIFORCE,DISCREEN,DIWRITE,DILIST,DIMSGA,DINDEX,DIC,DIY,DIYX) ;
 ; Finder Implementation [internal use only]
 ;
FINDX ; 1. Finder Pre-initialization [from FIND or FIND^DIC]
 ;
 I '$D(DIQUIET),$G(DIC(0))'["E" N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DICLERR S DICLERR=$G(DIERR) K DIERR
 N DIDENT S DIDENT(-1)=+$G(DILIST("C"))
 ;
INPUT ; 2. Validate Input Parameters
 ;
 N DIEN M DIEN=DIVALUE N DIVALUE M DIVALUE=DIEN K DIEN
 S DIFLAGS=$G(DIFLAGS) ; Validate Flags (DIFLAGS), part 1 of 3
 I DIFLAGS'["l" N DINDEX S DINDEX("WAY")=1
 ;
 N DIFAIL S DIFAIL=0
 D  I DIFAIL D CLOSE Q
 . ;
I1 . ; 2.1. Validate Flags (DIFLAGS), part 2 of 3
 . ;
 . I DIFLAGS["p" S DIFLAGS=DIFLAGS_"f"
 . I DIFLAGS'["p" D  Q:DIFAIL
 . . I $G(DIFIELDS)["IX",DIFIELDS'["-IX" D
 . . . N D S D=";"_DIFIELDS_";" I D'[";IX;",D'[";IXE",D'[";IXIE" Q
 . . . S DIDENT(-5)=1
 . . S DIFLAGS=DIFLAGS_4
 . . I DIFLAGS["O",DIFLAGS["X" S DIFLAGS=$TR(DIFLAGS,"O")
 . . S DIFLAGS=DIFLAGS_"t"
 . . ;
I2 . . ; 2.2. Validate Value (DIVALUE)
 . . ;
 . . I DIFLAGS'["l" N DIERRM D  I DIFAIL D ERR^DICF4(202,"","","",DIERRM) Q
 . . . S DIERRM="Lookup values"
 . . . I $G(DIVALUE(1))="" S DIVALUE(1)=$G(DIVALUE)
 . . . N I,DIEND S DIFAIL=1,DIEND=$O(DIVALUE(999999),-1)
 . . . F I=1:1:DIEND S DIVALUE(I)=$G(DIVALUE(I)) I DIVALUE(I)]"" S DIFAIL=$$BADVAL(DIVALUE(I)) Q:DIFAIL
 . ;
I3 . ; 2.3. Validate Target_Root (DILIST) & Init Target Array
 . ;
 . S DILIST=$G(DILIST)
 . I DILIST'="",DIFLAGS'["l" D
 . . I DIFLAGS'["p" K @DILIST
 . . I DIFLAGS'["f" S DILIST=$NA(@DILIST@("DILIST"))
 . I DILIST="" S DILIST="^TMP(""DILIST"",$J)" K @DILIST
 . ;
I4 . ; 2.4. Validate File (DIFILE), IENS (DIFIEN), & Screen (DISCREEN)
 . ;
 . D:DIFLAGS'["v"&(DIFLAGS'["l") FILE^DICUF(.DIFILE,.DIFIEN,DIFLAGS)
 . I $G(DIERR) S DIFAIL=1 Q
 . D SCREEN^DICUF(DIFLAGS,.DIFILE,.DISCREEN)
 . D DA^DILF(DIFIEN,.DIEN)
 . ;
I5 . ; 2.5. Validate Fields (DIFIELDS)
 . ;
 . S DIFIELDS=$G(DIFIELDS)
 . ;
I6 . ; 2.6. Validate Flags (DIFLAGS), part 3 of 3
 . ;
 . I DIFLAGS'["p",DIFLAGS'["l" D  Q:DIFAIL
 . . I $TR(DIFLAGS,"ABCKMOPQSUXfglpqtv4E")'="" S DIFAIL=1 D  Q  ;GFT
 . . . D ERR^DICF4(301,"","","",$TR(DIFLAGS,"fglpqtv4"))
 . ;
I7 . ; 2.7. Validate Indexes (DIFORCE), Set Starting Index (DINDEX)
 . ;
 . I DIFLAGS'["l" D  Q:DIFAIL
 . . S DIFORCE=$G(DIFORCE),DIFORCE(1)=1
 . . I "*"[DIFORCE D
 . . . I DIFLAGS["M" S DIFORCE=0,DIFORCE(0)="*" Q
 . . . S DIFORCE(0)=$$DINDEX^DICL(DIFILE,DIFLAGS),DIFORCE=1 Q
 . . E  D  I DIFAIL D ERR^DICF4(202,"","","","Indexes") Q
 . . . I $P(DIFORCE,U)="" S DIFAIL=1 Q
 . . . S DIFORCE(0)=DIFORCE,DIFORCE=1
 . . . I $P(DIFORCE(0),U,2)]"",DIFLAGS'["M" S DIFLAGS=DIFLAGS_"M"
 . . I DIFORCE S DINDEX=$P(DIFORCE(0),U) Q
 . . S DINDEX=$$DINDEX^DICL(DIFILE,DIFLAGS) Q
 . ;
I8 . ; 2.8. Validate Number (DINUMBER) & Identifier (DIWRITE)
 . ;
 . I DIFLAGS'["p",DIFLAGS'["l" D  Q:DIFAIL
 . . S DINUMBER=$S($G(DINUMBER):DINUMBER,1:"*")
 . . I DINUMBER'="*" D  Q:DIFAIL
 . . . I DINUMBER\1=DINUMBER,DINUMBER>0 Q
 . . . S DIFAIL=1 D ERR^DICF4(202,"","","","Number")
 . S DIWRITE=$G(DIWRITE)
 ;
I9 ; 2.9. Init Map (DIDENT(-3)), Window (DIDENT(-1)), & Done (DIOUT)
 ;
 I DIFLAGS["P" S DIDENT(-3)=""
 S DIDENT(-1,"MAX")=DINUMBER
 S DIDENT(-1,"MORE?")=0
 S DIDENT(-1,"JUST LOOKING")=0
 N DIOUT S DIOUT=0
 ;
HOOK75 ; 3. Process Pre-lookup Transform
 ;
 N DIHOOK75
 S DIHOOK75=$G(^DD(DIFILE,.01,7.5))
 I DIHOOK75'="",DIVALUE(1)]"",DIVALUE(1)'?."?",'$O(DIVALUE(1)),DIFLAGS'["l" D  I DIOUT D CLOSE Q
 .N DIC D  ;I DIFLAGS["p" N DIC D
 . . S DIC=DIFILE,DIC(0)=$TR(DIFLAGS,"2^fglpqtv4") Q
 . N %,D,X,Y,Y1
 . S X=DIVALUE(1),D=DINDEX
 . M Y=DIEN S Y="",Y1=DIFIEN
 . X DIHOOK75 I '$D(X)!$G(DIERR) S DIOUT=1 D:$G(DIERR)  Q
 . . S %=$$EZBLD^DIALOG(8090) ;Pre-lookup transform (7.5 node)
 . . D ERR^DICF4(120,DIFILE,"",.01,%)
 . S DIVALUE(1)=X,DIOUT=$$BADVAL(DIVALUE(1)) Q:DIOUT
 . I $G(DIC("S"))'="" S DISCREEN("S")=DIC("S") ;DIHOOK MAY HAVE SET THIS
 . I $G(DIC("V"))'="" S (DISCREEN("V"),DISCREEN("V",1))=DIC("V") ;...OR THIS
 ;
LOOKUP ; 4. Finder Main Lookup Code
 ;
 I DIFLAGS'["l" D  I DIOUT!($G(DIERR)) D CLOSE Q
 . D INDEX^DICUIX(.DIFILE,DIFLAGS,.DINDEX,"",.DIVALUE,DINUMBER,.DISCREEN,DILIST,.DIOUT) Q
 I '$D(DINDEX("MAXSUB")) D
 . S DINDEX("MAXSUB")=$P($G(^DD("OS",+$G(^DD("OS")),0)),U,7)
 . I DINDEX("MAXSUB") S DINDEX("MAXSUB")=DINDEX("MAXSUB")-13 Q
 . S DINDEX("MAXSUB")=50
 I $D(DISCREEN("V")) D VPDATA^DICUF(.DINDEX,.DISCREEN)
 I (DINDEX'="#")!($O(DIVALUE(1))) D CHKVAL1^DIC0(DINDEX("#"),.DIVALUE,DIFLAGS) I $G(DIERR) D CLOSE Q
 I DIFLAGS'["f" D  I $G(DIERR) D CLOSE Q
 . D IDENTS^DICU1(DIFLAGS,.DIFILE,DIFIELDS,DIWRITE,.DIDENT,.DINDEX)
 I DIFLAGS'["p",DIFLAGS'["l" D  I DIOUT!($G(DIERR)) D CLOSE Q
 . N I F I=2:1:DINDEX("#") Q:$G(DIVALUE(I))]""
 . Q:$G(DIVALUE(I))]""
 . D SPECIAL^DICF1(.DIFILE,.DIEN,DIFIEN,DIFLAGS,DIVALUE(1),.DINDEX,.DISCREEN,.DIDENT,.DIOUT,.DILIST)
 I DIFLAGS["t" D XFORM^DICF1(.DIFLAGS,.DIVALUE,.DISCREEN,.DINDEX)
 I DIFLAGS'["X" D  ; unless we are doing exact matches, also load FROM
 . D BACKFROM^DICF1(.DIVALUE,.DINDEX) ; values for backward traversal
 I DINDEX("#")>1,DIVALUE(1)="" N S M S=DISCREEN N DISCREEN M DISCREEN=S K S D
 . I DIFIELDS["IX",DIFIELDS'["-IX" Q
 . N DISAVMAX S DISAVMAX=DINDEX("MAXSUB")
 . D ALTIDX^DICF0(.DINDEX,.DIFILE,.DIVALUE,.DISCREEN,DINUMBER)
 . S DINDEX("MAXSUB")=DISAVMAX
 D CHKALL^DICF2(.DIFILE,.DIEN,DIFIEN,.DIFLAGS,.DIVALUE,.DISCREEN,DINUMBER,.DIFORCE,.DINDEX,.DIDENT,.DILIST,.DIC,.DIY,.DIYX)
 D CLOSE
 ;
 QUIT  ; end of $$FIND/FINDX/INPUT/HOOK75/LOOKUP
 ;
 ;
BADVAL(DIVALUE) ; Validate a Lookup Value
 ;
 I "^"[DIVALUE Q 1
 I DIVALUE'?.ANP D ERR^DICF4(204,"","","",DIVALUE) Q 1
 ;
 QUIT 0 ; end of $$BADVAL
 ;
 ;
CLOSE ; Cleanup before Exiting Finder
 ;
 I $G(DIMSGA)'="" D CALLOUT^DIEFU(DIMSGA)
 I DICLERR'=""!$G(DIERR) D
 . I DIFLAGS["l",+DIERR=1 Q
 . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 I $G(DIERR) D  Q
 . Q:$G(DILIST)=""  K @DILIST@("B") Q
 I DIFLAGS["p" S @DILIST=DIDENT(-1) Q
 Q:DIFLAGS["l"
 S @DILIST@(0)=DIDENT(-1)_U_DIDENT(-1,"MAX")_U_DIDENT(-1,"MORE?")_U_$S(DIFLAGS[2:"H",1:"")
 I DIFLAGS["P" S @DILIST@(0,"MAP")=$G(DIDENT(-3))
 E  D SETMAP^DICL1(.DIDENT,DILIST)
 K @DILIST@("B")
 ;
 QUIT  ; end of CLOSE
 ;
 ;
 ; Error messages:
 ; 120  The previous error occurred when performin
 ; 202  The input parameter that identifies the |1
 ; 204  The input value contains control character
 ; 301  The passed flag(s) '|1|' are unknown or in
 ; 8090 Pre-lookup transform (7.5 node)
 ; 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
 ;
 ;
EOR ; end of routine DICF

DICF0
DICF0 ;SEA/TOAD,SF/TKW-VA FileMan: Finder, get alternate index ;2/8/00  11:11
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ALTIDX(DINDEX,DIFILE,DIVALUE,DISCREEN,DINUMBER) ; Find alternate index when lookup value for first subscript is null.
 N DIX S DIX=DINDEX,DIX("WAY")=DINDEX("WAY"),DIX("OLDSUB")=DINDEX("#")
 D IDXOK(.DINDEX,DIFILE,.DIX) Q:DIX'=DINDEX
A1 ; Find next lookup value
 N DIFIELD,DISUB,DITYPE,I,J,K,X,Y,Z
 F DISUB=1:0 S DISUB=$O(DIVALUE(DISUB)) Q:'DISUB  I DIVALUE(DISUB)]"" D
 . S X=$G(DINDEX(DISUB,"TYPE"))
 . S DITYPE=$S(X="V":3,X="P":2,1:1),DITYPE(DITYPE,DISUB)=""
 . Q
 S DIX=""
 F DITYPE=1,2,3 Q:DIX]""  I $D(DITYPE(DITYPE)) F DISUB=0:0 D  Q:'DISUB  Q:DIX]""
 . S DISUB=$O(DITYPE(DITYPE,DISUB)) Q:'DISUB
 . S DIFIELD=DINDEX(DISUB,"FIELD")
A2 . ; find alternate index on that field.
 . F I=0:0 S I=$O(^DD(DIFILE,DIFIELD,1,I)) Q:'I  S X=$G(^(I,0)) D  Q:DIX]""
 . . I $P(X,U,3)="",$P(X,U,2)]"A[" S DIX=$P(X,U,2) Q:DIX'=DINDEX
 . . S DIX="" Q
 . I DIX]"" S DIX("#")=1,DIX(1)=DISUB Q
 . F I=0:0 S I=$O(^DD("IX","F",DIFILE,DIFIELD,I)) Q:'I  D  Q:DIX]""
 . . S DIX=$P($G(^DD("IX",I,0)),U,2) Q:DIX=""
 . . I DIX=DINDEX S DIX="" Q
 . . D IDXOK(.DINDEX,DIFILE,.DIX,I,.DIVALUE)
 . . Q
 . Q
 Q:DIX=""
A3 ; Rearrange lookup values and for new index
 N DIV,DIS
 M DIS("S")=DISCREEN("S"),DIS("F")=DISCREEN("F")
 F I=1:1:DIX("#") S J=DIX(I) D
 . Q:DIVALUE(J)=""
 . M DIV(I)=DIVALUE(J),DIS(I)=DISCREEN(J)
 . K DIVALUE(J),DISCREEN(J) Q
A4 ; Build screening logic for fields whose lookup values are not on new index.
 F J=0:0 S J=$O(DIVALUE(J)) Q:'J  D
 . M DIS("VAL",J)=DIVALUE(J)
 . I $D(DISCREEN(J)) D
 . . S X="DINDEX(",Z="DISCREEN(""VAL"","
 . . F K=0:0 S K=$O(DISCREEN(J,K)) Q:'K  S Y=DISCREEN(J,K) I Y[X S DISCREEN(J,K)="" F  Q:Y'[X  D
 . . . N L,S S S=$P(Y,X),L=$L(S_X),S=S_Z,Y=$E(Y,L+1,$L(Y))
 . . . S DISCREEN(J,K)=DISCREEN(J,K)_S
 . . . I Y'[X S DISCREEN(J,K)=DISCREEN(J,K)_Y
 . . . Q
 . . M DIS("X",J)=DISCREEN(J) Q
 . N DICODE,DINODE
 . D GET^DICUIX1(DIFILE,DIFILE,DINDEX(J,"FIELD"),.DINODE,.DICODE)
 . I "PVSD"'[DINDEX(J,"TYPE") S DIS("X",J,"GET")="S DIVAL="_DICODE Q
 . S DIS("X",J,"GET")="S DIVAL=$$EXTERNAL^DIDU("_DIFILE_","_DINDEX(J,"FIELD")_","""","_DICODE_")"
 . D
 . . N DISAVJ S DISAVJ=J N J
 . . S X=$$EXTERNAL^DIDU(DINDEX(DISAVJ,"FILE"),DINDEX(DISAVJ,"FIELD"),"",DIS("VAL",DISAVJ),"DIERR")
 . . S J=$O(DIS("VAL",DISAVJ,99999),-1)+1
 . . S DIS("VAL",DISAVJ,J)=X Q
 . Q
 K DINDEX S DINDEX=DIX,DINDEX("WAY")=DIX("WAY")
 I DIFLAGS["l" S DINDEX("START")=DIX,DINDEX("OLDSUB")=DIX("OLDSUB")
 K DISCREEN,DIVALUE M DISCREEN=DIS,DIVALUE=DIV K DIS,DIV
 D INDEX^DICUIX(.DIFILE,DIFLAGS,.DINDEX,"",.DIVALUE,DINUMBER,.DISCREEN)
 D XFORM^DICF1(DIFLAGS,.DIVALUE,.DISCREEN,.DINDEX)
 Q
 ;
IDXOK(DINDEX,DIFILE,DIX,DIXIEN,DIVALUE) ; Return alternate index name DIX if it has no set/kill conditions and all subscripts are fields from original index DINDEX.
 I '$G(DIXIEN) S DIXIEN=$O(^DD("IX","BB",DIFILE,DIX,0)) I 'DIXIEN S DIX="" Q
 I $G(^DD("IX",DIXIEN,1.4))]""!($G(^(2.4))]"") S DIX="" Q
 N I,J,X,DIFIELD,DISKIP S DISKIP=1 I $O(DIVALUE(0)) S DIX("#")=0
 F I=0:0 S I=$O(^DD("IX",DIXIEN,11.1,"AC",I)) Q:'I  S DISKIP=1 D  Q:DISKIP
 . S X=$G(^DD("IX",DIXIEN,11.1,I,0))
 . Q:$P(X,U,3)'=DIFILE  Q:$P(X,U,6)'=I  S DIFIELD=$P(X,U,4) Q:'DIFIELD
 . Q:$G(^DD("IX",DIXIEN,11.1,I,2))]""
 . I '$O(DIVALUE(0)) S DISKIP=0 Q
 . F J=1:1:DINDEX("#") D  Q:'DISKIP
 . . Q:DINDEX(J,"FIELD")'=DIFIELD
 . . I I=1,DIVALUE(J)="" Q
 . . S DIX(I)=J,DISKIP=0 Q
 . I 'DISKIP S DIX("#")=DIX("#")+1
 . Q
 I DISKIP S DIX="" Q
 Q
 ;

DICF1
DICF1 ;VEN/TOAD,SF/TKW - Lookup: Finder, Part 2 (Xform) ; 1/24/13 3:52pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ; Contents
 ;
 ; XFORM: Add Transformed Lookup Values & Screens, Main Loop
 ; VALUES/LOWER/CHK/COMMA/LONG: Alternate Lookup Values
 ; SPECIAL: Handle Selection by Record Number
 ; ENTRY: Screen & Accept a Record-number Match
 ; BACKFROM: Create From Values for Backward Collation
 ;
 ;
XFORM(DIFLAGS,DIVALUE,DISCREEN,DINDEX) ;
 ; FIND--produce array of values and screens by transforming input
 ; subroutine, DIVALUE, DINDEX, & DISCREEN passed by reference
 ;
 N DISUB F DISUB=1:1:DINDEX("#") D VALUES
 ;
 QUIT  ; end of XFORM
 ;
 ;
VALUES ; Alternate Lookup Values
 ;
 ; 1. Add Original Lookup Value to Arrays
 ;
 I $D(DIVALUE(DISUB,0,1)) S DIVALUE(DISUB)=DIVALUE(DISUB,0,1)
 N I F I="PART","FROM","TO" I $D(DIVALUE(DISUB,0,1,I)) D
 . S DINDEX(DISUB,I)=DIVALUE(DISUB,0,1,I) Q
 D
 . S I=-1 F  S I=$O(DIVALUE(DISUB,I)) Q:I=""  K DIVALUE(DISUB,I)
 . S I=-1 F  S I=$O(DISCREEN(DISUB,I)) Q:I=""  K DISCREEN(DISUB,I)
 S DIVALUE(DISUB,1)=DIVALUE(DISUB)
 Q:DIVALUE(DISUB)=""
 I DIFLAGS["Q" D LONG Q
 ;
LOWER ; 2. Add Upper-case Lookup Value to Array, If Needed
 ;
 I DIVALUE(DISUB)?.E1L.E,DIFLAGS'["X" D
 . S DIVALUE(DISUB,2)=$$OUT^DIALOGU(DIVALUE(DISUB),"UC")
 ;
CHK ; 3. Skip Remaining Transforms for Most Data Types
 ;
 ; Quit if data type not free-text, pointer or vp
 ; or if lookup value is numeric or a date
 ;
 I "PVF"'[$G(DINDEX(DISUB,"TYPE"))!(DIVALUE(DISUB)?.NP) Q
 N Y D  Q:Y>0
 . N X S X=DIVALUE(DISUB) N %DT,DIFLAGS,DIVALUE,DISCREEN,DINDEX,DISUB
 . S %DT="T" D ^%DT
 ;
COMMA ; 4. Add Comma-piece Lookup Value to Arrays, If Needed
 ;
 I DIVALUE(DISUB)[",",DIFLAGS'["X" D
 . N DISTEMP,DIPIECE1 S DISTEMP="",DIPIECE1=$P(DIVALUE(DISUB),",")
 . Q:$L(DIPIECE1)>DINDEX(DISUB,"LENGTH")
 . Q:'$L(DIPIECE1)  ;SO
 . ;
21 . ; Handle Original Form of Comma-piece Lookup (C Flag)
 . ;
 . I DIFLAGS["C" D
 . . N DIPART1 S DIPART1=" I %?.E1P1"""
 . . N DIPART2 S DIPART2=""".E!(D'=""B""&(%?1"""
 . . N DIPART3 S DIPART3=""".E))"
 . . N DIOUT S DIOUT=0
 . . N DIPIECE,DIVPIECE F DIPIECE=2:1 D  I DIOUT Q
 . . . S DIVPIECE=$P(DIVALUE(DISUB),",",DIPIECE)
 . . . I DIVPIECE["""" Q
 . . . I $E(DIVPIECE)=" " S DIVPIECE=$E(DIVPIECE,2,$L(DIVPIECE))
 . . . I DIVPIECE="" S DIOUT=1 Q
 . . . I $L(DIVPIECE)*2+$L(DISTEMP)+33+14+34>255 S DIOUT=1 Q
 . . . S DISTEMP=DISTEMP_DIPART1_DIVPIECE_DIPART2_DIVPIECE_DIPART3
 . . . Q:DISTEMP=""
 . . . S DISTEMP="S %=DIVAL "_DISTEMP Q  ;22*135
 . . I DISTEMP="" Q
 . ;
22 . ; Handle New, Reduced Form of Comma-piece Lookup
 . ;
 . I DIFLAGS'["C" N DIPIECE2,DIPC2 D
 . . S (DIPC2,DIPIECE2)=$P(DIVALUE(DISUB),",",2)
 . . I DIPIECE2["""" S DIPC2=$$CONVQQ^DILIBF(DIPIECE2)
 . . S DISTEMP="S %=$P(DIVAL,"","",2) I $E(%,1,"_$L(DIPIECE2)_")="""_DIPC2_""""
 . ;
23 . ; Either Way, Add Value and Screen to Arrays
 . ;
 . S DIVALUE(DISUB,3)=DIPIECE1
 . S DISCREEN(DISUB,3)=DISTEMP
 . I DIFLAGS'["C" S DIVALUE(DISUB,3,"c")=DIPIECE2
 . ;
24 . ; Handle Combo of Comma-piecing and Lowercase
 . ;
 . I DIVALUE(DISUB)'?.E1L.E Q
 . S DIVALUE(DISUB,4)=$$OUT^DIALOGU(DIPIECE1,"UC")
 . S DISCREEN(DISUB,4)=$$OUT^DIALOGU(DISTEMP,"UC")
 . I DIFLAGS'["C" S DIVALUE(DISUB,4,"c")=$$OUT^DIALOGU(DIPIECE2,"UC")
 ;
LONG ; 5. Add Long Lookup Value to Arrays, If Needed
 ;
 I $L(DIVALUE(DISUB))'>DINDEX(DISUB,"LENGTH") Q
 N J,X,DISLONG,DISPART,DISXACT,DIREF
 F I=0:0 S I=$O(DIVALUE(DISUB,I)) Q:'I  D
 . N L,M S L=DINDEX(DISUB,"LENGTH")
 . Q:$L(DIVALUE(DISUB,I))'>L
 . S X=DIVALUE(DISUB,I) K DIVALUE(DISUB,I) S DIVALUE(DISUB,0,I)=X
 . I $G(DISCREEN(DISUB,I))]"" S X=DISCREEN(DISUB,I) K DISCREEN(DISUB,I) S DISCREEN(DISUB,0,I)=X
 . S DIVALUE(DISUB,I)=$E(DIVALUE(DISUB,0,I),1,L)
 . I I=1 D
 . . S (DIVALUE(DISUB),DINDEX(DISUB))=DIVALUE(DISUB,I)
 . . F J="PART","FROM","TO" S M=$L($G(DINDEX(DISUB,J))) D:M>L
 . . . S DIVALUE(DISUB,0,I,J)=DINDEX(DISUB,J)
 . . . S DINDEX(DISUB,J)=$E(DINDEX(DISUB,J),1,L)
 . S DISLONG=""
 . I $D(DISCREEN(DISUB,0,I)) S DISLONG=" X DISCREEN("_DISUB_",0,"_I_")"
 . S DIREF="DINDEX("_DISUB_",0,"_I_")"
 . S DISPART="I $P(DIVAL,$G("_DIREF_"))="""""_DISLONG ;DI*22*70
 . S DISXACT="I $P(DIVAL,U)="_DIREF_DISLONG
 . ;
L10 . ; Handle Combo of Long Input and Exact Matching
 . ;
 . I DIFLAGS["X" S DISCREEN(DISUB,I)=DISXACT Q
 . I DIFLAGS'["O" S DISCREEN(DISUB,I)=DISPART Q
 . S DISCREEN(DISUB,I)=DISXACT
 . S DISCREEN(DISUB,I,2)=DISPART
 ;
 QUIT  ; end of VALUES/LOWER/CHK/COMMA/LONG
 ;
 ;
SPECIAL(DIFILE,DIEN,DIFIEN,DIFLAGS,DIVALUE,DINDEX,DISCREEN,DIDENT,DIOUT,DILIST) ;
 ; Process space-bar return, 'IEN or DIVALUE equal to an IEN.
 ;
 S DIOUT=0
 ;
11 ; 1. Handle Space Lookup Value (Space-bar Recall)
 ;
 I DIVALUE=" " D  S DIOUT=1 Q
 . N DIROOT S DIROOT=$$ROOT^DIQGU(DIFILE,DIFIEN,"Q")
 . N DINODE S DINODE=$G(^DISV(DUZ,$E(DIROOT,1,28)))
 . N DINODEL S DINODEL=$L(DINODE,",")
 . I $P(DINODE,",",1,DINODEL-1)'=$E(DIROOT,29,9999) Q
 . S DIEN=$P(DINODE,",",DINODEL)
 . I 'DIEN S DIEN="" Q
 . D ENTRY
 ;
12 ; Handle Accent-grave Lookup Value
 ;
 I DIVALUE?1"`".NP D  Q:DIOUT=1
 . S DIEN=$E(DIVALUE,2,$L(DIVALUE)) Q:+DIEN'=DIEN
 . D ENTRY S DIOUT=1
 ;
13 ; Handle Pure Numeric Lookup Value (Possible IEN)
 ;
 I $S(DIVALUE?1.N:1,DIVALUE'?.NP:0,1:+DIVALUE=DIVALUE) D
 . N DI001 S DI001=$D(^DD(DIFILE,.001))
 . N DI01FLAG S DI01FLAG=$P($G(^DD(DIFILE,.01,0)),U,2)
 . I $D(@DIFILE(DIFILE)@(DIVALUE)) D
 . . I DIFLAGS'["A",'DI001,DI01FLAG["N"!($O(@DIFILE(DIFILE)@("A["))'="") Q
 . . S DIEN=DIVALUE
 . . D ENTRY
 . . I $G(DINDEX("DONE"))!($G(DIERR)) S DIEN="",DIOUT=1
 ;
 QUIT  ; end of SPECIAL
 ;
 ;
ENTRY ; Execute screens, and if entry passes, do ACCEPT to add it to output.
 ;
 N DI0NODE S DI0NODE=$G(@DIFILE(DIFILE)@(DIEN,0))
 Q:$$SCREEN^DICL2(.DIFILE,.DIEN,DIFLAGS,DIFIEN,.DISCREEN,.DINDEX,DI0NODE)
 D ACCEPT^DICL2(.DIFILE,.DIEN,.DIFLAGS,DIFIEN,.DINDEX,.DIDENT,.DILIST,DI0NODE)
 ;
 QUIT  ; end of ENTRY
 ;
 ;
BACKFROM(DIVALUE,DINDEX) ; create From values for backward collation
 ;
 ;;private;procedure;clean;silent;SAC compliant
 ; input:
 ;   .DINDEX("#") = # of lookup values supplied
 ;   .DIVALUE(subscript #) = default lookup value
 ;   .DIVALUE(subscript #,value #) = each additional lookup value
 ; output:
 ;   .DIVALUE("BACK",DISUB,...) = From values for backwards
 ; called only by:
 ;   LOOKUP^DICF
 ; calls:
 ;   $$BACKFROM^DICUIX2 to compute each From value for backwards
 ;
 N DISUB F DISUB=1:1:DINDEX("#") D  ; traverse lookup values
 . ;
 . M DIVALUE("BACK",DISUB)=DIVALUE(DISUB) ; initialize From values
 . ;
 . I DIVALUE(DISUB)'="" D  ; if default exists
 . . N B S B=$$BACKFROM^DICUIX2(DIVALUE(DISUB))
 . . S DIVALUE("BACK",DISUB)=B ; add default back-from value
 . ;
 . N DIVAL S DIVAL=0
 . F  D  Q:'DIVAL  ; traverse alternate values
 . . S DIVAL=$O(DIVALUE(DISUB,DIVAL)) ; each alternate
 . . Q:'DIVAL
 . . I $G(DIVALUE(DISUB,DIVAL))'="" D  ; if alternate exists
 . . . N B S B=$$BACKFROM^DICUIX2(DIVALUE(DISUB,DIVAL))
 . . . S DIVALUE("BACK",DISUB,DIVAL)=B ; add alternate back-from val
 ;
 QUIT  ; end of BACKFROM
 ;
 ;
EOR ; end of routine DICF1

DICF2
DICF2 ;SEA/TOAD,SF/TKW-VA FileMan: Finder, Part 3 (All Indexes) ;12/17/99  08:24
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CHKALL(DIFILE,DIEN,DIFIEN,DIFLAGS,DIVALUE,DISCREEN,DINUMBER,DIFORCE,DINDEX,DIDENT,DILIST,DIC,DIY,DIYX) ;
 ; Loop through all indexes to be searched, perform data type
 ; transforms on lookup values.
 N DIOUT
 I DIFLAGS["O",DIFLAGS'["p" S DIOUT=DIFLAGS N DIFLAGS S DIFLAGS=DIOUT_"X"
 S DIOUT=0 N DISKIP
41 F  D  Q:$G(DIERR)!($G(DINDEX("DONE")))!DIOUT
 . S DISKIP=0
 . N DILINK S DILINK=DIFILE_U_DINDEX
 . I DINDEX="#" D
 . . S DIFILE("CHAIN",DILINK)=""
 . . Q:+$P(DIVALUE,"E")'=DIVALUE  Q:'$D(@DIFILE(DIFILE)@(DIVALUE))
 . . N DIEN S DIEN=DIVALUE D ENTRY^DICF1 Q
 . I '$D(DIFILE("CHAIN",DILINK)) D  K DIFILE("CHAIN",DILINK)
 . . S DIFILE("CHAIN",DILINK)=""
 . . D:DIFLAGS'["Q" PREPIX(.DIFILE,DIFLAGS,.DINDEX,.DIVALUE,.DISKIP)
 . . I 'DISKIP D CHKONE^DICF3(.DIFLAGS,.DIVALUE,.DINDEX,.DIDENT,.DIFILE,.DIEN,DIFIEN,.DISCREEN,.DILIST,.DIC,.DIY,.DIYX)
 . . D CLEANIX(.DINDEX,.DIVALUE) Q
43 . I $G(DIERR)!($G(DINDEX("DONE"))) Q
 . I DIFLAGS["l" S (DIOUT,DINDEX("DONE"))=1 Q
 . D NXTINDX(.DINDEX,.DIFORCE,.DIFILE,.DIFLAGS,.DIVALUE,DINUMBER)
 . I DINDEX="" D  Q:DINDEX=""
 . . S DIOUT=1
 . . Q:DIFLAGS'["O"  Q:DIFLAGS'["X"  Q:DIFLAGS["p"  Q:DIDENT(-1)
 . . S DIFLAGS=$TR(DIFLAGS,"X"),DIOUT=0,DIFORCE(1)=1
 . . S DINDEX=$S(DIFLAGS["l":DINDEX("START"),DIFORCE:$P(DIFORCE(0),U),1:$$DINDEX^DICL(DIFILE,DIFLAGS))
 . . I DINDEX="" S DIOUT=1 Q
 . . D FIRSTIDX(.DINDEX,.DIFORCE,.DIFILE,DIFLAGS,.DIVALUE,DINUMBER)
 . . Q
 . D
 . . N DICRSR S DICRSR=0
 . . I DIFLAGS["P" D  Q:'DICRSR
 . . . F  S DICRSR=$O(DIDENT(DICRSR)) Q:'DICRSR  Q:$D(DIDENT(DICRSR,0,1,"E"))
 . . . Q
 . . Q:'$D(DIDENT(DICRSR,0,1,"E"))
 . . N DISAVNO,DISAVENT S DISAVNO=DINDEX("#"),DINDEX("#")=1,DISAVENT=$G(DIDENT),DIDENT="IXE"
 . . D THROW^DICU11(DIFLAGS,.DIDENT,"IXE",DICRSR,1,"E",.DINDEX,1)
 . . S DINDEX("#")=DISAVNO,DIDENT=DISAVENT Q
 . Q
 Q
 ;
PREPIX(DIFILE,DIFLAGS,DINDEX,DIVALUE,DISKIP) ;
 ; CHKALL--lookup index data type, add transform values to list
 N DISUB,DITYPE
 F DISUB=1:1:DINDEX("#") D:DIVALUE(DISUB)]""  Q:$G(DIERR)
 . I $G(DINDEX("IXTYPE"))="S" D  Q
 . . N X S X=$$SOUNDEX^DICF5(DINDEX(DISUB)) Q:'X
 . . S DIVALUE(DISUB,5)=X Q
 . S DITYPE=DINDEX(DISUB,"TYPE")
 . I DITYPE["F"!(DITYPE["N") D
 . . Q:$G(DINDEX(DISUB,"TRANCODE"))=""
 . . N X S X=DIVALUE(DISUB) X DINDEX(DISUB,"TRANCODE") Q:X=""
 . . S DIVALUE(DISUB,5)=X
 . . Q
 . N DINODE S DINODE=$G(^DD(+DINDEX(DISUB,"FILE"),+DINDEX(DISUB,"FIELD"),0))
 . I DITYPE["D" D PREPD^DICF5(DISUB,.DINDEX,DINODE,.DIVALUE) Q
 . I DITYPE["S" D PREPS^DICF5(DIFLAGS,DISUB,.DINDEX,DINODE,.DIVALUE) Q
 . I DITYPE'["P",DITYPE'["V" Q
 . I DISUB'=1 D POINT^DICF5(DISUB,DIFLAGS,.DIFILE,.DINDEX,.DIVALUE,.DISCREEN) Q
 . D POINT^DICF4(.DIFILE,.DIFLAGS,.DINDEX,.DIDENT,.DIEN,DIFIEN,.DISCREEN,.DIVALUE,.DIC,.DIFORCE)
 . I '$D(DINDEX(1,"IXROOT"))!($G(DIERR)) S DISKIP=1
 . I $G(DTOUT)!($G(DIROUT)) S (DISKIP,DINDEX("DONE"))=1
 . Q:DISKIP
 . Q:$G(DINDEX(1,"TRANCODE"))=""
 . N DII,X
 . S DII="" F  S DII=$O(@DINDEX(1,"ROOT")@(DII)) Q:DII=""  D
 . . K @DINDEX(1,"ROOT")@(DII)
 . . S X=$P(DII,"^",2) X DINDEX(1,"TRANCODE") Q:X=""
 . . S X=$P(DII,"^")_"^"_X,@DINDEX(1,"ROOT")@(X)="" Q
 . Q
 Q
 ;
CLEANIX(DINDEX,DIVALUE) ;
 ; CHKALL--clear transform values for this index from DIVALUE arrays
 ; clear temporary list of pointed-to entries.
 N I,DISUB
 F DISUB=1:1:DINDEX("#") D
 . I $G(DINDEX(DISUB,"IXROOT"))]"" D
 . . I DISUB=1,DIFLAGS["l" S I=$O(@DINDEX(DISUB,"ROOT")@("")),DS("INT")=$P(I,U,2)
 . . S I=$P(DINDEX(DISUB,"ROOT"),",""B"")",1) Q:I=""
 . . K @(I_")") Q
 . S I=4
 . F  S I=$O(DIVALUE(DISUB,I)) Q:'I  K DIVALUE(DISUB,I)
 . Q
 Q
 ;
FIRSTIDX(DINDEX,DIFORCE,DIFILE,DIFLAGS,DIVALUE,DINUMBER) ;
 ; Return data for starting index before second loop when flags["O"
 D N3 Q
 ;
NXTINDX(DINDEX,DIFORCE,DIFILE,DIFLAGS,DIVALUE,DINUMBER) ;
 ; Return next index
 N D,DIGO,I,J,K,DIX1,DIX2,DIOK,DIOLDL
 S D=DINDEX,I=$G(DINDEX("START")),K=$G(DINDEX("MAXSUB"))
 D:DIFLAGS'["h"
 . F J=1:1:DINDEX("#") S DIOLDL(J)=DINDEX(J,"LENGTH")
 K DINDEX S DINDEX=D,DINDEX("WAY")=1
 S:I]"" DINDEX("START")=I S:K]"" DINDEX("MAXSUB")=K
 S (DIGO,DIOK)=0
N1 I DIFORCE F  D  Q:DIOK!(DIGO)
 . I DIFLAGS["M",DIFORCE(1)=1,$P(DIFORCE(0),U,2)="" S DIGO=1 Q
 . S DIFORCE(1)=DIFORCE(1)+1,DINDEX=$P(DIFORCE(0),U,DIFORCE(1))
 . I DINDEX="#",DIFLAGS'["l",DIFLAGS'["h" S DIOK=1 Q
 . S:DINDEX=-1 DINDEX="" I DINDEX="" S DIOK=1 Q
 . I $O(^DD(DIFILE,0,"IX",DINDEX,0)),$$IDXOK(DIFILE,DINDEX) S DIOK=1 Q
 . S I=$O(^DD("IX","BB",DIFILE,DINDEX,0)) Q:'I
 . S DIOK=1 Q
N2 I ('DIFORCE)!DIGO D
 . S (DIX1,DIX2)=DINDEX
 . F  S DIX1=$O(^DD(DIFILE,0,"IX",DIX1)) Q:DIX1=""  Q:$$IDXOK(DIFILE,DIX1)
 . S DIOK=0 F  S DIX2=$O(^DD("IX","BB",DIFILE,DIX2)) Q:DIX2=""  D  Q:DIOK
 . . S I=$O(^DD("IX","BB",DIFILE,DIX2,0)) Q:'I
 . . Q:$P($G(^DD("IX",I,0)),U,14)'["L"
 . . S J=$O(^DD("IX",I,11.1,"AC",1,0)) Q:'J  Q:$G(^DD("IX",I,11.1,J,0))=""
 . . S DIOK=1 Q
 . I DIX1'="",DIX2=""!(DIX2]DIX1) S DINDEX=DIX1 Q
 . S DINDEX=DIX2 Q
 . Q
N3 Q:DINDEX=""  Q:DIFLAGS["h"
 D INDEX^DICUIX(.DIFILE,DIFLAGS,.DINDEX,"",.DIVALUE,DINUMBER,.DISCREEN)
 I DINDEX("#")>1 F D=1:1:DINDEX("#") S DIVALUE(D)=$G(DIVALUE(D))
 N DINEWVAL S DINEWVAL=0 D
 . N J F J=1:1:DINDEX("#") I DIVALUE(J)]"",DINDEX(J,"LENGTH")'=$G(DIOLDL(J)) S DINEWVAL=1 Q
 . I DINEWVAL D XFORM^DICF1(DIFLAGS,.DIVALUE,.DISCREEN,.DINDEX)
 Q
 ;
IDXOK(DIFILE,%) ; See whether selected index exists in 1 nodes of DD
 N DIX,%Y,DD,X Q:%="" 0
 S DIX=$O(^DD(DIFILE,0,"IX",%,0)) Q:'DIX 0
 S %Y=$O(^DD(DIFILE,0,"IX",%,DIX,0)) Q:'%Y 0
 F DD=0:0 S DD=$O(^DD(DIX,%Y,1,DD)) Q:'DD  S X=$P($G(^(DD,0)),U,2) Q:X=%
 Q:'DD 0
 Q 1
 ;

DICF3
DICF3 ;VEN/TOAD,SF/TKW - Lookup: Finder, Part 3 (One Index) ; 1/24/13 3:53pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ; Contents
 ;
 ; CHKONE: Check One Index for All Possible Matches
 ;
 ;
CHKONE(DIFLAGS,DIVALUE,DINDEX,DIDENT,DIFILE,DIEN,DIFIEN,DISCREEN,DILIST,DIC,DIY,DIYX) ;
 ; Called from CHKALL--check one index for possible matches
 ;
 N I,DISUB F DISUB=1:1:DINDEX("#") D
 . F I=0:0 S I=$O(DINDEX(DISUB,I)) Q:'I  K DINDEX(DISUB,I)
 ;
C1 ; Set up then find eXact matches.
 ;
 I DIFLAGS["X" D  Q
 . ;
 . F DISUB=1:1:DINDEX("#") D  ; loop through lookup values
 . . S (DINDEX(DISUB),DINDEX(DISUB,1))=$G(DINDEX(DISUB,"FROM"))
 . . S DINDEX(DISUB,"USE")=$S(DIFLAGS["Q":1,"VP"[DINDEX(DISUB,"TYPE"):0,1:1)
 . . ;
 . . I DISUB>1!("VP"'[DINDEX(1,"TYPE")) M DINDEX(DISUB)=DIVALUE(DISUB)
 . . ;
 . . Q:DIFLAGS["Q"
 . . ;
 . . I "VP"[DINDEX(DISUB,"TYPE") D  Q:DISUB=1
 . . . S DINDEX(DISUB)=""
 . . . Q:DISUB'=1
 . . . S DINDEX(1,1)="" F I=1:0 S I=$O(DINDEX(1,I)) Q:'I  K DINDEX(1,I)
 . . S I=4 F  S I=$O(DIVALUE(DISUB,I)) Q:'I  S DINDEX(DISUB,I)=DIVALUE(DISUB,I)
 . ;
 . S DIDENT(-4)=1
 . N DIF S DIF=$TR(DIFLAGS,"X")_"X"
 . S DINDEX("TOTAL")=DIDENT(-1)
 . ;
 . D WALK^DICFIX(DIF,.DINDEX,.DIDENT,.DIFILE,.DIEN,.DIFIEN,.DISCREEN,.DILIST,.DIC,.DIY,.DIYX)
 ;
 Q:$G(DIERR)!($G(DINDEX("DONE")))
 ;
C2 ; Find partial matches
 ;
 F DISUB=1:1:DINDEX("#") D  ; loop through lookup values
 . S (DINDEX(DISUB),DINDEX(DISUB,1))=$G(DINDEX(DISUB,"FROM"))
 . S DINDEX(DISUB,"USE")=$S(DIFLAGS["Q"!(DINDEX("#")>1):1,DIFLAGS["O":0,1:1)
 . ;
 . I DISUB>1!("VP"'[DINDEX(1,"TYPE")) D
 . . I DINDEX(DISUB,"WAY")=1 D  ; forward traversal, traverse from
 . . . M DINDEX(DISUB)=DIVALUE(DISUB) ; start of partial matches
 . . I DINDEX(DISUB,"WAY")=-1 D  ; backward traversal, traverse from
 . . . M DINDEX(DISUB)=DIVALUE("BACK",DISUB) ; end of partial matches
 . ;
 . I "VP"[DINDEX(DISUB,"TYPE"),DIFLAGS'["Q" D  Q:DISUB=1
 . . S DINDEX(DISUB)="",DINDEX(DISUB,"USE")=0
 . . Q:DISUB'=1
 . . S DINDEX(1,1)="" F I=1:0 S I=$O(DINDEX(1,I)) Q:'I  K DINDEX(1,I)
 . I DIFLAGS["O" F I=0:0 S I=$O(DISCREEN(DISUB,I)) Q:'I  D
 . . I $D(DISCREEN(DISUB,I,2)) S DISCREEN(DISUB,I)=DISCREEN(DISUB,I,2)
 ;
 S DIDENT(-4)=1
 S DINDEX("TOTAL")=DIDENT(-1)
 ;
 D WALK^DICFIX(.DIFLAGS,.DINDEX,.DIDENT,.DIFILE,.DIEN,DIFIEN,.DISCREEN,.DILIST,.DIC,.DIY,.DIYX)
 ;
 QUIT  ; end of CHKONE
 ;
 ;
EOR ; end of routine DICF3

DICF4
DICF4 ;SEA/TOAD,SF/TKW-VA FileMan: Finder, (pointer indexes) ;19NOV2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
POINT(DIFILE,DIFLAGS,DINDEX,DIDENT,DIEN,DIFIEN,DISCREEN,DIVALUE,DIC,DIFORCE) ;
 ; PREPIX^DICF2--transform value for indexed pointer field
 N DIF,DIFL,DIX,DIPVAL,DISCR,DITARGET,DISKIP,DIPRV,DINEW
 S DIF=$TR(DIFLAGS,$TR(DIFLAGS,"4XOB"))_"Mp",DIX="B"
 I DIFLAGS["B" S DIF=$TR(DIF,"M")
 D GETTMP^DICUIX1(.DITARGET,"DICF")
 S DITARGET("C")=0
 S (DIPRV,DINEW)="S" F  S DINEW=$O(DISCREEN(DINEW)) Q:$E(DINEW)'="S"  S DIPRV=DINEW,DISCR(DIPRV)=DISCREEN(DIPRV)
 S DINEW="S"_($P(DIPRV,"S",2)+1)
P1 ; Process regular pointer
 I DINDEX(1,"TYPE")="P" D  Q
 . S DIFL=+$P($P(DINDEX(1,"NODE"),U,2),"P",2) Q:'DIFL
 . M DIPVAL(1)=DIVALUE(1),DISCR(1)=DISCREEN(1)
 . I DIFLAGS["l" D DIC(.DIC,.DIEN,.DIFILE,.DINDEX,.DIVALUE,DITARGET)
 . I DIFLAGS'["l" D
NUM ..;I +$P(DIPVAL(1),"E")=DIPVAL(1),$G(DINDEX)'="B",DIFLAGS["M" Q  ;GFT  PATCH 165   DO NOT LOOK UP POINTERS.  IN 1040 DID NOT HAVE ,$G(DINDEX)'="B",DIFLAGS["M"
 . . I $D(DIFORCE("PTRIX")) D SETIX(.DIFORCE,.DINDEX,.DIX,.DIF)
 . . N F S F=DIF N DIF S DIF=F K F M DIFL("CHAIN")=DIFILE("CHAIN")
 . . D BLDSCR(.DISCR,DINEW,DIPRV,.DIFL,.DINDEX,.DISCREEN,.DIFILE)
 . . D FIND^DICF(.DIFL,",","",DIF,.DIPVAL,"",.DIX,.DISCR,"",.DITARGET)
 . I $G(DIERR)!('$G(@DITARGET)) K @DITARGET Q
 . S DINDEX(1,"IXROOT")=DINDEX(1,"ROOT"),DINDEX(1,"ROOT")=$NA(@DITARGET@("B"))
 . Q
P2 ; Process variable pointer
 I DIFLAGS["l" D  Q
 . D DIC(.DIC,.DIEN,.DIFILE,.DINDEX,.DIVALUE,DITARGET)
 . I $G(DIERR)!('$G(@DITARGET)) K @DITARGET Q
 . S DINDEX(1,"IXROOT")=DINDEX(1,"ROOT"),DINDEX(1,"ROOT")=$NA(@DITARGET@("B"))
 . Q
 N DIFILES I DIVALUE(1)[".",$P(DIVALUE(1),".")]"" D
 . N V S V=$$OUT^DIALOGU($P(DIVALUE(1),"."),"UC")
 . D VPFILES^DIEV1(DINDEX(1,"FILE"),DINDEX(1,"FIELD"),V,.DIFILES)
 . Q
P21 D P3 I $G(DIERR) K @DITARGET Q
 I $O(DIFILES(0)),'$G(@DITARGET) K DIFILES D P3
 I $G(DIERR)!('$G(@DITARGET)) K @DITARGET Q
 S DINDEX(1,"IXROOT")=DINDEX(1,"ROOT"),DINDEX(1,"ROOT")=$NA(@DITARGET@("B"))
 Q
 ;
P3 N DIVP,G,I,X,DIF1,DIS1
 F DIVP=0:0 S DIVP=$O(^DD(DINDEX(1,"FILE"),DINDEX(1,"FIELD"),"V",DIVP)) Q:'DIVP  S X=$G(^(DIVP,0)) D  Q:$G(DIERR)
 . K DIF1,DIFL,DIPVAL,DIS1,DIX S DIX="B"
 . Q:'X  I $O(DIFILES(0)) Q:'$D(DIFILES(+X))
 . I $G(DISCREEN("V",1))]"" D  Q:G=""
 . . S G=$G(^DIC(+X,0,"GL")) Q:G=""
 . . S:'$D(DINDEX(DISUB,"VP",G)) G="" Q
 . S DIF1=DIF_"v",DIFL=+X
 . I $D(DIFORCE("PTRIX")) D SETIX(.DIFORCE,.DINDEX,.DIX,.DIF1)
 . D FILE^DICUF(.DIFL,"",.DIF1) Q:$G(DIERR)
 . M DIS1=DISCR
 . I '$O(DIFILES(0)) M DIPVAL(1)=DIVALUE(1),DIS1(1)=DISCREEN(1)
 . E  D
 . . S DIF1=DIF1_"t"
 . . S DIPVAL(1)=$P(DIVALUE(1),".",2,99)
 . . Q
 . M DIFL("CHAIN")=DIFILE("CHAIN")
 . D BLDSCR(.DIS1,DINEW,DIPRV,.DIFL,.DINDEX,.DISCREEN,.DIFILE)
 . S DITARGET("C")=+$G(@DITARGET)
 . D FIND^DICF(.DIFL,",","",DIF1,.DIPVAL,"",.DIX,.DIS1,"",.DITARGET)
 . Q
 Q
 ;
SETIX(DIFORCE,DINDEX,DIX,DIF) ; If user passes list of indexes to use on pointed-to file, set up to use them.
 M DIX("PTRIX")=DIFORCE("PTRIX") N %
 S %=$G(DIX("PTRIX",DINDEX(1,"FILE"),DINDEX(1,"FIELD"),DIFL))
 Q:%=""  S DIX=%
 I $P(DIX,U,2)="" S:DIF["M" DIF=$TR(DIF,"M") Q
 S:DIF'["M" DIF=DIF_"M" Q
 ;
BLDSCR(DISCR,DINEW,DIPRV,DIFL,DINDEX,DISCREEN,DIFILE) ; Build screen to make sure entry is in pointer index.
 N DICSUBS S DICSUBS=""
 S DISCR(DINEW)=$S(DIPRV="S":" Q",1:" "_DISCREEN("S")_" Q:$T")
 N I S I="I" S:DINDEX(1,"TYPE")["V" I=I_"_"";"_$P(DIFL(DIFL,"O"),U,2)_""""
 S DISCR("S")=DICSUBS_"N "_DINEW_" S "_DINEW_"="_I_" X DISCREEN("""_DINEW_""")"
 I DINDEX("#")>1 D  Q
 . S DISCR(DINEW)="X ""I 0"" I $D("_DIFILE(DIFILE,"O")_""""_DINDEX_""","_DINEW_"))"_DISCR(DINEW)
 . Q
 S DISCR(DINEW)="X ""I 0"" N I F I=0:0 S I=$O("_DIFILE(DIFILE,"O")_""""_DINDEX_""","_DINEW_",I)) Q:'I  I $D("_DIFILE(DIFILE,"O")_"I,0))"_DISCR(DINEW)
 Q
 ;
SETDA(DIEN) ; Return code that sets DA array to current level when pointer field is in a multiple.  DA itself=DA(1).
 N %,DICODE S DICODE="S DA="_+$G(DIEN(1))
 F %=1:1 Q:'$D(DIEN(%))  S DICODE=DICODE_",DA("_%_")="_DIEN(%)
 Q DICODE
 ;
DIC(DIC,DIEN,DIFILE,DINDEX,DIVALUE,DITARGET) ; If we were called from ^DIC, we want to do recursive lookup there.
 N %,%Y,D,DD,DIVAL,DF,DID,DINUM,DICRS,DS,DO,X,Y,DIFINDER
 S DO(2)=DIFILE,(D,DF)=DINDEX("START"),(X,DIVAL(1))=DIVALUE(1),DIVAL(0)=1
 S DD=0,%=DINDEX,DS=$G(^DD(DINDEX(1,"FILE"),DINDEX(1,"FIELD"),0)),Y=DINDEX(1,"TYPE"),%Y=DINDEX(1,"FIELD")
 S:$G(DICR)="" DICR=0
 D
 . N DIFILE,I
 . S DIFINDER="p"
 . M I=DIC N DIC M DIC=I K I
 . N DA X $$SETDA(.DIEN) N DIEN
 . D A^DICM Q:Y=-1  D ^DICM1 K DICR(DICR) S DICR=DICR-1 I DICR<1 K DICR
 . Q
 Q:Y'>0
 S @DITARGET@("B",($P(Y,U,2)_U_X))="",@DITARGET=1
 Q
 ;
ERR(DIERN,DIFILE,DIIENS,DIFIELD,DI1,DI2,DI3) ;
 ; error logging procedure
 N DIPE
 N DI F DI="FILE","IENS","FIELD",1:1:3 S DIPE(DI)=$G(@("DI"_DI))
 D BLD^DIALOG(DIERN,.DIPE,.DIPE)
 Q
 ;

DICF5
DICF5 ;SEA/TOAD,SF/TKW-VA FileMan: Finder, (Other lookup value transform) ;5/26/99  10:05
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PREPS(DIFLAGS,DISUB,DINDEX,DINODE,DIVALUE) ;
 ; transform value for indexed set of codes field
 ; proc, DINDEX passed by ref
 N DICODE,DIMEAN,DIPAIR,DISKIP,DITRY,DIVAL
 N DISET S DISET=$P(DINODE,U,3)
CODES ;
 N DIP F DIP=1:1:$L(DISET,";")-1 D
 . S DIPAIR=$P(DISET,";",DIP)
 . F DIVAL=1,2 S DITRY=$G(DIVALUE(DISUB,DIVAL)) D:DITRY]""
 . . I DIVAL=2,DIFLAGS["l" Q
 . . S DIMEAN=$P(DIPAIR,":",2)
 . . I $P(DIMEAN,DITRY)'="" Q
 . . I DIFLAGS["X",DIMEAN'=DITRY Q
 . . S DICODE=$P(DIPAIR,":")
 . . I $G(DINDEX(DISUB,"TRANCODE"))="" D  Q
 . . . S:DICODE'=DITRY DIVALUE(DISUB,(4+DIVAL))=DICODE Q
 . . N X S X=DICODE X DINDEX(DISUB,"TRANCODE") Q:X=""
 . . S DIVALUE(DISUB,7)=X Q
 . Q
 Q
 ;
POINT(DISUB,DIFLAGS,DIFILE,DINDEX,DIVALUE,DISCREEN) ; Add transform values for dates and sets at end of pointer chain
 ; save off the primary file info, follow the ptr chain to the end
 N DIVPTR,DIF,DITYPE S DIVPTR=$S(DINDEX(DISUB,"TYPE")="V":1,1:0)
 M DIF=DIFILE N DIFILE M DIFILE=DIF K DIF
 N DIFIL,DIFLD S DIFIL=+DINDEX(DISUB,"FILE"),DIFLD=+DINDEX(DISUB,"FIELD")
 N DINODE S DINODE=$G(^DD(DIFIL,DIFLD,0)) Q:DINODE=""
 D FOLLOW^DICL3(.DIFILE,"",DINODE,1,0,"",DIFLD,DIFIL,DIVPTR,DISUB,.DISCREEN)
 N DIEND F DIEND=0:0 S DIEND=$O(DIFILE("STACKEND",DIEND)) Q:'DIEND  D
 . S DIFIL=$P(DIFILE("STACKEND",DIEND),U,2)
 . S DINODE=$G(^DD(DIFIL,.01,0)),DITYPE=$P(DINODE,U,2)
 . I DITYPE["F"!(DITYPE["N") D  Q
 . . Q:$G(DINDEX(DISUB,"TRANCODE"))=""
 . . N X S X=DIVALUE(DISUB) X DINDEX(DISUB,"TRANCODE") Q:X=""
 . . S DIVALUE(DISUB,5)=X Q
 . I $P(DINODE,U,2)["D" D PREPD(DISUB,.DINDEX,DINODE,.DIVALUE) Q
 . I $P(DINODE,U,2)["S" D PREPS(DIFLAGS,DISUB,.DINDEX,DINODE,.DIVALUE)
 . Q
 Q
 ;
PREPD(DISUB,DINDEX,DINODE,DIVALUE) ;
 ; PREPIX--transform value for indexed date field
 N D S D=$G(DIVALUE(DISUB)) Q:D=""
 N DIFLAGS S DIFLAGS=$P($P(DINODE,"%DT=""",2),"""")
 N DIDATEFM
 D DT^DILF($TR(DIFLAGS,"ER")_"Ne",D,.DIDATEFM)
 I DIDATEFM'>1 Q
 I $G(DINDEX(DISUB,"TRANCODE"))="" S DIVALUE(DISUB,5)=DIDATEFM Q
 N X S X=DIDATEFM X DINDEX(DISUB,"TRANCODE") Q:X=""
 S DIVALUE(DISUB,6)=X
 Q
 ;
SOUNDEX(DIVALUE) ; func, convert value to soundex value
 N DICODE S DICODE="01230129022455012623019202"
 N DISOUND S DISOUND=$C($A(DIVALUE)-(DIVALUE?1L.E*32))
 N DIPREV S DIPREV=$E(DICODE,$A(DIVALUE)-64)
 N DICHAR,DIPOS
 F DIPOS=2:1 S DICHAR=$E(DIVALUE,DIPOS) Q:","[DICHAR  D  Q:$L(DISOUND)=4
 . Q:DICHAR'?1A
 . N DITRANS S DITRANS=$E(DICODE,$A(DICHAR)-$S(DICHAR?1U:64,1:96))
 . Q:DITRANS=DIPREV  Q:DITRANS=9
 . S DIPREV=DITRANS
 . I DITRANS'=0 S DISOUND=DISOUND_DITRANS
 Q $E(DISOUND_"000",1,4)
 ;

DICFIX
DICFIX ;SEA/TOAD,SF/TKW-FileMan: Finder, Search Compound Indexes ;5/26/99  14:40
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
WALK(DIFLAGS,DINDEX,DIDENT,DIFILE,DIEN,DIFIEN,DISCREEN,DILIST,DIC,DIY,DIYX) ;
 ;
 ; a walker to traverse a compound index, taking actions
 ; DINDEX is an array describing the index and how to walk it
 ;
PREP ; prepare to loop through subscript
 ;
 N DISUB S DISUB=DINDEX("AT")
 N DIVAL S DIVAL=DINDEX(DISUB)
 N DIPART,DIMORE S DIPART=$G(DINDEX(DISUB,"PART")),DIMORE=+$G(DINDEX(DISUB,"MORE?"))
 N DITRXNO S DITRXNO=DIDENT(-4)
 I $G(DINDEX(DISUB,"USE")),DIVAL'="" D
 . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),-DINDEX(DISUB,"WAY"))
 ;
LOOP ; loop through subscripts
 ;
 N DIDONE,DISKIP S DIDONE=0 F  D  Q:DIDONE!$G(DIERR)
 . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),DINDEX(DISUB,"WAY"))
 .
DATA . ; if we're in the data subscripts, we need to walk further
 .
 . I DISUB'>DINDEX("#") D  Q
 . . S DISKIP=0
 . . I DIVAL'="",'$D(DINDEX(DISUB,"IXROOT")) D CHK Q:DISKIP
 . . S:DIVAL="" DIDONE=1
 . . I DIDONE Q:'DITRXNO  D  Q:DIDONE!(DISKIP)
 . . . S DITRXNO=$O(DINDEX(DISUB,DITRXNO)) Q:'DITRXNO
 . . . S (DIVAL,DIPART)=DINDEX(DISUB,DITRXNO)
 . . . I DITRXNO=3!(DITRXNO=4),DIDENT(-1)>DINDEX("TOTAL") S DISKIP=1
 . . . S DIDONE=0
 . . . Q
 . . S DINDEX(DISUB)=DIVAL,DINDEX("AT")=DISUB+1
 . . S DINDEX(DISUB,"FOUND")=DITRXNO,DIDENT(-4)=1
 . . I DISUB=1,$D(DINDEX(1,"IXROOT")) S DINDEX(1)=$P(DIVAL,U,2)
 . . D WALK(.DIFLAGS,.DINDEX,.DIDENT,.DIFILE,.DIEN,DIFIEN,.DISCREEN,.DILIST,.DIC,.DIY,.DIYX)
 . . S DINDEX("AT")=DISUB
 . . S DIDENT(-4)=DITRXNO
 . . I DISUB=1,$D(DINDEX(1,"IXROOT")) S DINDEX(1)=DIVAL
 . . I $G(DINDEX("DONE"))!$G(DIERR) S DIDONE=1
 .
IEN . ; otherwise, we're in the IEN subscripts & need to process
 .
 . I DIVAL="" S DIDONE=1 Q
 . I DINDEX="B" N DIMNEM D
 . . I $D(@DINDEX(DISUB,"ROOT")@(DIVAL))#2 Q:'^(DIVAL)
 . . E  Q:'$O(@DINDEX(DISUB,"ROOT")@(DIVAL,""))
 . . S DIMNEM="" Q
 . D TRY
 . Q
CLEAN ; clean up after loop, exit
 S DINDEX(DISUB)=$S(DISUB<(DINDEX("#")+1):$G(DINDEX(DISUB,"FROM")),1:"")
 S DIDENT(-4)=1
 Q
 ;
CHK ; See whether we have a match or are at the end of the subscripts.
 I DISUB>1,"VP"[DINDEX(DISUB,"TYPE"),DIFLAGS'["Q" D  Q
 . N DIFL,DIFLD,DIV
 . S DIFL=DINDEX(DISUB,"FILE"),DIFLD=DINDEX(DISUB,"FIELD"),DIV=DIVAL
 . I DINDEX(DISUB,"TYPE")="V",$G(DISCREEN("V",DISUB))]"" D  Q:DISKIP
 . . N G S G="^"_$P(DIV,";",2) Q:G="^"
 . . S:'$D(DINDEX(DISUB,"VP",G)) DISKIP=1 Q
 . N DIVAL S DIVAL=$$EXTERNAL^DIDU(DIFL,DIFLD,"i",DIV)
 . I $G(DIERR),DIFLAGS["l" K DIERR,^TMP("DIERR",$J) S DIVAL=DIV
 . I DIVAL="" S DIDONE=1 Q
 . F DITRXNO=0:0 S DITRXNO=$O(DINDEX(DISUB,DITRXNO)) Q:'DITRXNO  D  Q:'DIDONE
 . . S DIPART=DINDEX(DISUB,DITRXNO),DIDONE=0
 . . D MATCH I DIDONE,'$G(DINDEX("DONE")),DIMORE,DIFLAGS'["X" D
 . . . S DIDONE=0 D FINDMORE^DICLIX0(DISUB,.DIVAL,DIPART,.DINDEX,.DIMORE) I DIVAL="" S DIDONE=1 Q
 . . . D MATCH Q
 . . Q:DIDONE
 . . S DINDEX(DISUB,"EXT")=$$EXTERNAL^DIDU(DIFL,DIFLD,"",DIV)
 . . I $G(DIERR),DIFLAGS["l" K DIERR,^TMP("DIERR",$J) S DINDEX(DISUB,"EXT")=DIV
 . . Q
 . I DIDONE S DIDONE=0,DISKIP=1
 . Q
 D MATCH I DIDONE,'$G(DINDEX("DONE")),DIMORE,DIFLAGS'["X" D
 . S DIDONE=0 D FINDMORE^DICLIX0(DISUB,.DIVAL,DIPART,.DINDEX,.DIMORE) I DIVAL="" S DIDONE=1 Q
 . D MATCH Q
 Q
 ;
MATCH ; No more subscripts or partial matches, or past our TO value?
 Q:DIVAL=""  I DIFLAGS["l",DINDEX(DISUB,DITRXNO)="" Q
 I DIFLAGS["X",DIVAL'=DINDEX(DISUB,DITRXNO) S DIDONE=1 Q
 I $P(DIVAL,$G(DIPART))'="" S DIDONE=1 Q
 I $G(DINDEX(DISUB,+DITRXNO,"c"))]"" D  Q:DIDONE!(DISKIP)
 . D NXTNAM^DICFIX1(.DIVAL,DIPART,.DINDEX,.DISKIP,.DIDONE) Q
 Q
 ;
TRY ; Apply screens to entry.  If passed, add entry to output.
 S (DIEN,DINDEX(DISUB))=DIVAL
 N DI0NODE S DI0NODE=$G(@DIFILE(DIFILE)@(DIEN,0))
 Q:$$SCREEN^DICL2(.DIFILE,.DIEN,DIFLAGS,DIFIEN,.DISCREEN,.DINDEX,DI0NODE)
 ; If called from ^DIC, special processing.
 I DIFLAGS["l" D DICLIST Q
 ; Else, add entry to output list.
 D ACCEPT^DICL2(.DIFILE,.DIEN,.DIFLAGS,DIFIEN,.DINDEX,.DIDENT,.DILIST,DI0NODE)
 Q:$G(DIERR)
 I DIDENT(-1)=DIDENT(-1,"MAX"),'DIDENT(-1,"JUST LOOKING") S DIDONE=1,DINDEX("DONE")=1
 Q
 ;
DICLIST ; Build output list when Finder is called from ^DIC.
 ; Display entries and allow selection if screen is filled.
 K DTOUT,DUOUT N D,DIX,DIFINDR,DIFILE,X,Y I DIC(0)["E" N DIQUIET
 S Y=DIEN,D=DINDEX,DIX=DINDEX(1),DIFINDR=1
 S X=$S("VP"[DINDEX(1,"TYPE"):DIX,1:DINDEX(1,DINDEX(1,"FOUND")))
 I "VP"[DINDEX(1,"TYPE") S DS(0,"DICRS")=1
 I "D"[DINDEX(1,"TYPE") S DS(0,"DIDA")=1
 D MN^DIC3 Q:'$T
 D K^DIC3
 I DS(0) S (DIDONE,DINDEX("DONE"))=1
 Q
 ;
 ;

DICFIX1
DICFIX1 ;SEA/TOAD,SF/TKW-FileMan: Finder, Search Compound Indexes (cont.) ;15MAY2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
NXTNAM(DIVAL,DIPART,DINDEX,DISKIP,DIDONE) ;
 ; limited comma piece lookup, skip nonmatching names in index
 N DIUTF8 D
 .N X,Y S Y=$C(126),X=$G(^DD("OS",^DD("OS"),"HIGHESTCHAR")) X:X]"" X S DIUTF8=Y
 I $P(DIVAL,",")=DIPART S DIVAL=DIPART_","_DIUTF8,DISKIP=1 Q  ;UTH/SMH
 N DIPREC,DIPOSTC,DIPPOSTC
 S DIPREC=$P(DIVAL,","),DIPOSTC=$P(DIVAL,",",2)
 S DIPPOSTC=DINDEX(DISUB,DITRXNO,"c")
 I $$PREFIX(DIPOSTC,DIPPOSTC) Q
 I $$PREFIX(DIPPOSTC,DIPOSTC) Q
 D SKIP(.DISKIP,.DIVAL,DIPREC,DIPOSTC,DIPART,DIPPOSTC,.DINDEX)
 Q
 ;
PREFIX(DISTRING,DIPREFIX) ;
 Q $E(DISTRING,1,$L(DIPREFIX))=DIPREFIX
 ;
SKIP(DISKIP,DIVAL,DIPREC,DIPOSTC,DIPART,DIPPOSTC,DINDEX) ;
 ; Skip forward within index based on limited comma piecing
 I DIPPOSTC]DIPOSTC D  Q
 . ; Current first name before starting first name, skip to starting first name
 . S DIVAL=DIPREC_","_DIPPOSTC
 . I '$D(@DINDEX(DISUB,"ROOT")@(DIVAL)) S DISKIP=1
 ; Else, skip the rest of the first names within current last name.
 S DIVAL=DIPREC_","_DIUTF8,DISKIP=1 Q  ;UTH/SMH
 ;
 ;

DICL
DICL ;SEA/TOAD,SF/TKW-VA FileMan: Lookup: Lister ;28APR2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
LIST(DIFILE,DIFIEN,DIFIELDS,DIFLAGS,DINUMBER,DIFROM,DIPART,DINDEX,DISCREEN,DIWRITE,DILIST,DIMSGA,DIC) ;
 ; ENTRY POINT--return a list of entries from a file
 ; (Note: DIC parameter only passed if called from ^DICQ)
 ;
IN ; Entry point from LIST^DIC
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DICLERR S DICLERR=$G(DIERR) K DIERR
 ;
INPUT ; Validate input parameters
 N DIERN,DIPE,DIDENT
 S DIFLAGS=$G(DIFLAGS)
 I DIFLAGS["I",DIFLAGS'["Q" S DIFLAGS=DIFLAGS_"Q"
 S DIFIELDS=$G(DIFIELDS)
 I DIFIELDS'["-IX" D
 . N DID S DID=";"_DIFIELDS_";"
 . I (DID["@"!(DIFLAGS["I")),DID'[";IX;",DID'[";IXE",DID'[";IXIE" Q
 . S DIDENT(-5)=1 Q
 S DINUMBER=$G(DINUMBER) I DINUMBER="" S DINUMBER="*"
 I '$D(DIPART(1)) S DIPART(1)=$G(DIPART)
 I '$D(DIFROM(1)) S DIFROM(1)=$G(DIFROM)
 I $O(DIFROM(1)) D
 . N E S E=9999 F  S E=$O(DIFROM(E),-1) Q:'E  Q:DIFROM(E)]""
 . I E N I F I=1:1:E I DIFROM(I)="" D BLD^DIALOG(202,"FROM values"),OUT Q
 . Q
 S DIFROM("IEN")=$G(DIFROM("IEN"))
 S DINDEX("WAY")=1 I DIFLAGS["B" S DINDEX("WAY")=-1
 S DINDEX=$G(DINDEX)
 I '$D(DISCREEN("S")) S DISCREEN("S")=$G(DISCREEN) D:DISCREEN("S")]""
 .N X S X=DISCREEN D ^DIM I '$D(X) D BLD^DIALOG(202,"SCREEN") ;**GFT  CHECK FOR GOOD MUMPS CODE
 S DIWRITE=$G(DIWRITE)
 ;
OUTPUT ; Establish output file name, starting output subscript no.
 I $G(DILIST)="" S DILIST="^TMP(""DILIST"",$J)"
 E  I DIFLAGS'["h" D  I $G(DIERR) D OUT Q
 . I DILIST'?.1"^"1U.7UN.ANP,DILIST'?.1"^%".7UN.ANP D  Q
 . . D BLD^DIALOG(202,"target array")
 . S DILIST=$NA(@DILIST@("DILIST"))
 . Q
 K @DILIST
 S DILIST("ORDER")=$S(DINDEX("WAY")=1:0,1:DINUMBER+1)
 I DINUMBER="*",DINDEX("WAY")=-1 D
 . S DINDEX("WAY")=1,DINDEX("WAY","REVERSE")=1
 . S DILIST("ORDER")=0
 . Q
 ;
FILE ; Validate file number and IENS.
 I DIFLAGS'["h" D FILE^DICUF(.DIFILE,.DIFIEN,DIFLAGS)
 I $G(DIERR) S DIFROM="",DIFROM("IEN")="" D OUT Q
 D SCREEN^DICUF(DIFLAGS,.DIFILE,.DISCREEN)
 ;
CHECKS ;
 I $TR(DIFLAGS,"BIKMPQSUfhuXE")'="" S DIERN=301,DIPE(1)=DIFLAGS D ERROUT Q  ;GFT: "X" and "E" added
 S DIFLAGS=DIFLAGS_3
 I DINUMBER'="*",DINUMBER<1!(DINUMBER\1'=DINUMBER) D  Q
 . S DIERN=202,DIPE(1)="Number" D ERROUT
 ;
IXANDID ; Gather information about index and field data to be returned.
 N DIOUT S DIOUT=0
IXNAME ; Set default index name if null.
 N DIGFT,DIGFTEMP
 I DIFLAGS["X" D DICL^DICLGFT G BADQ ;NOTE: A CROSS-REF MUST BE 1U.UN (IX^DICE); AN INDEX MUST BE 1A.AN
 I DINDEX'="#",DINDEX'?1U.UNP S DINDEX=$$DINDEX(DIFILE,DIFLAGS)
 D INDEX^DICUIX(.DIFILE,DIFLAGS,.DINDEX,.DIFROM,.DIPART,DINUMBER,.DISCREEN,DILIST,.DIOUT)
BADQ I DIOUT!($G(DIERR)) D KTMPIX^DICL1 Q
 I $D(DISCREEN("V")) D VPDATA^DICUF(.DINDEX,.DISCREEN)
 I $O(DIFROM(DINDEX("#")+1))!(DINDEX'="#"&($O(DIPART(DINDEX("#"))))) D BLD^DIALOG(202,"Index"),KTMPIX^DICL1 Q
 D IDENTS^DICU1(DIFLAGS,.DIFILE,DIFIELDS,DIWRITE,.DIDENT,.DINDEX)
 I $G(DIERR) D KTMPIX^DICL1 Q
 ;
BRANCH ; Continue on to actual search.
 D PREP^DICL1
 I $G(DIGFTEMP)["^" K @DIGFTEMP ;**
 Q
 ;
DINDEX(DIFILE,DIFLAGS) ; Set DINDEX to index name for KEY.   Also called at top of ^DIC & by DICF & DICF2
 N I,X S X=""
 I $G(DIFLAGS)["K" D
 . S I=$O(^DD("KEY","AP",DIFILE,"P",0)) Q:'I
 . S X=$P($G(^DD("IX",+$P($G(^DD("KEY",I,0)),U,4),0)),U,2) Q
 Q:X?1U.UNP X
 Q "B"
 ;
ERROUT D BLD^DIALOG(DIERN,.DIPE,.DIPE),OUT Q
 ;
OUT I DICLERR'=""!$G(DIERR) D
 . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 I $G(DIMSGA)'="" D CALLOUT^DIEFU(DIMSGA)
 Q
 ;
 ; Possible messages returned
 ; 202   The input parameter that identifies the |1
 ; 301   The passed flag(s) '|1|' are unknown or in
 ;

DICL1
DICL1 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup: Lister, Part 2 ;10/15/98  14:19
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PREP ; set up subfile's DA array under DIEN, init how many found,
 ; set max, and init array of last entries returned.
 ;
 N DIEN D DA^DILF(DIFIEN,.DIEN)
 N DISUB,DIVAL,X,Y
 S DIDENT(-1)=0
 S DIDENT(-1,"MAX")=DINUMBER
 S DIDENT(-1,"JUST LOOKING")=0
 F DISUB=1:1:DINDEX("#")+1 S DIDENT(-1,"LAST",DISUB)=""
 S (DIDENT(-1,"LAST"),DIDENT(-1,"LAST","IEN"))=""
 ;
PTR ; if 1st indexed field is a pointer or var.ptr., and we're not doing
 ; a quick list, we build info for the
 ; pointer chain(s) to the end file(s) and do the search.
 ;
 I "VP"[DINDEX(1,"TYPE"),DIFLAGS'["Q",'$D(DINDEX("ROOTCNG",1)) D
 . D POINT^DICL10(.DIFILE,.DIFLAGS,.DINDEX,.DIDENT,.DIEN,DIFIEN,.DISCREEN,.DILIST)
 . Q
 ;
GETLIST ; build the output list when first subscript not a ptr. or var.ptr.
 ;
 E  D
 . I $D(DINDEX("ROOTCNG",1)) D BLDTMP^DICLIX1(.DINDEX,.DISCREEN,DIFLAGS,.DIDENT)
 . D WALK^DICLIX(DIFLAGS,.DINDEX,.DIDENT,.DIFILE,.DIEN,.DIFIEN,.DISCREEN,.DILIST,"","",.DIC)
 ;
DSPHLP ; If we're displaying entries for online ^DIC help, display the rest
 ;
 I DIFLAGS["h",$O(DICQ(0)) D
 . K DTOUT,DUOUT S DICQ(0,"MAP")=DIDENT(-3)
 . D DSP^DICQ1(.DINDEX,.DICQ,.DIC,.DIFILE)
 . I $G(DTOUT)!($G(DUOUT)) S (DINDEX("DONE"),DIDONE)=1 Q
 . S DIDENT(-1)=0
 . Q
 ;
KTMPIX ; if we've built temporary indexes, we delete them:
 D KILLB(.DIFILE)
 N DISUB S DISUB=$O(DINDEX("ROOTCNG","")) I DISUB K @DINDEX(DISUB,"ROOT")
 ;
FINAL ; cleanup after search.
 ;
 I $G(DIERR) K @DILIST D OUT^DICL Q
 ;
 ; set the output list header node and map node, output FROM values
 ; for last entries returned.
 ;
 I '$D(DIDENT(-1)) S DIDENT(-1)=0,DIDENT(-1,"MAX")=DINUMBER
 N DIHEADER S DIHEADER=DIDENT(-1)_U_DIDENT(-1,"MAX")_U_+$G(DIDENT(-1,"MORE?"))
 S @DILIST@(0)=DIHEADER_U_$S(DIFLAGS[2:"H",1:"")
 I DIFLAGS["P",$G(DIDENT(-3))]"" S @DILIST@(0,"MAP")=DIDENT(-3)
 E  D SETMAP(.DIDENT,DILIST)
 N I S I=0 F  S I=$O(DIDENT(-1,"LAST",I)) Q:'I  D
 . K DIDENT(-1,"LAST",I,"I")
 . Q:$G(DIDENT(-1,"MORE?"))
 . I I=1 S (DIDENT(-1,"LAST"),DIDENT(-1,"LAST","IEN"))=""
 . S DIDENT(-1,"LAST",I)=""
 . Q
 K DIFROM M DIFROM=DIDENT(-1,"LAST")
 ;
 ; Move arrays to output and QUIT.
 D OUT^DICL
 Q
 ;
KILLB(DIFILE) ; Kill temporary "B" index on current file DIFILE or pointed-to files.
 N DIROOT I $D(DIFILE(DIFILE,"NO B")) S DIROOT=DIFILE(DIFILE,"NO B")_")" K @DIROOT
 Q:'$O(DIFILE("STACK",0))
 N I,J,K
 F I=0:0 S I=$O(DIFILE("STACK",I)) Q:'I  F J=0:0 S J=$O(DIFILE("STACK",I,J)) Q:'J  F K=0:0 S K=$O(DIFILE("STACK",I,J,K)) Q:'K  I $D(DIFILE(K,"NO B")) D
 . S DIROOT=DIFILE(K,"NO B")_")"
 . K @DIROOT Q
 Q
 ;
SETMAP(DIDENT,DILIST) ; Set map node for unpacked format
 N I,J,K,DIMAP,DITMP S (DIMAP,I)=""
 F  S I=$O(DIDENT(-3,I)) Q:I=""  S DITMP="" D  D SETM2
 . I I S J="" F  S J=$O(DIDENT(-3,I,J)) Q:J=""  D
 . . I J?1.N.1"I" D
 . . . N K S K="FID("_I_")"_$P("I^",U,J["I")
 . . . K:$D(DIDENT(-3,I,K)) DIDENT(-3,I,K) Q
 . . S DITMP=DITMP_J_"^" Q
 . Q:I'=0
 . F J=0:0 S J=$O(DIDENT(-3,0,J)) Q:'J  S K="" F  D  Q:K=""
 . . S K=$O(DIDENT(-3,0,J,K)) S:K]"" DITMP=DITMP_K_"^" Q
 Q:DIMAP=""  S $E(DIMAP,$L(DIMAP))=""
 S @DILIST@(0,"MAP")=DIMAP
 Q
 ;
SETM2 N DILENGTH S DILENGTH=$L(DIMAP) Q:$E(DIMAP,DILENGTH-3,DILENGTH)="..."
 I $L(DITMP)+($L(DIMAP))>252 S DIMAP=DIMAP_"..." Q
 S DIMAP=DIMAP_DITMP Q
 ;
 ;

DICL10
DICL10 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup: Lister, Part 2 ;5/21/98  15:27
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
POINT(DIFILE,DIFLAGS,DINDEX,DIDENT,DIEN,DIFIEN,DISCREEN,DILIST) ;
 ; save off the primary file info, follow the ptr chain to the end
 S DIFLAGS=DIFLAGS_"p"
 N DIVPTR,DIF S DIVPTR=$S(DINDEX(1,"TYPE")="V":1,1:0)
 M DIF=DIFILE N DIFILE M DIFILE=DIF K DIF
 D FOLLOW^DICL3(.DIFILE,"",DINDEX(1,"NODE"),1,0,"",DINDEX(1,"FIELD"),DINDEX(1,"FILE"),DIVPTR,1,.DISCREEN)
 D SETB^DICL3
 N DIX1 S DIX1="B"
 S DIX1("WAY")=DINDEX("WAY")
 N DIFROM S DIFROM(1)=$G(DINDEX(1,"FROM")),DIFROM("IEN")=""
 N DIPART S DIPART(1)=$G(DINDEX(1,"PART"))
 S DIFILE("STACK")=1_U_DIFILE("STACKEND",1)
 S DIFILE=$P(DIFILE("STACK"),U,3)
 D INDEX^DICUIX(.DIFILE,.DIFLAGS,.DIX1,.DIFROM,.DIPART)
 I $G(DINDEX(1,"USE")) S DIX1(1,"USE")=1
 N I F I="FIELD","FILE","FROM","GET","TYPE" K DIX1(1,I)
 K DIX1("FLIST")
P1 ; no variable pointers in pointer chain
 I '$O(DIFILE("STACKEND",1)) D  Q
 . D WALK^DICLIX(DIFLAGS,.DIX1,.DIDENT,.DIFILE,.DIEN,.DIFIEN,.DISCREEN,.DILIST,.DINDEX,"",.DIC)
 . Q
P2 ; variable pointer(s) in pointer chain
 N DIXV
 S DIFLAGS=DIFLAGS_"v",DIFILE("STACK")=""
 S I=0 F  S I=$O(DIFILE("STACKEND",I)) Q:'I  D
 . N DIXNAME,DISUB,R S DIXNAME="DIXV("_I_")",DISUB=DIX1(1)
 . N DIFL,DIGL S DIFL=+$P(DIFILE("STACKEND",I),U,2),DIGL=DIFILE(DIFL,"O")
 . S @DIXNAME@(1)=DISUB,@DIXNAME@(1,"MORE?")=DIX1(1,"MORE?"),@DIXNAME@(2)=""
 . S R=DIGL_"DINDEX"
 . S @DIXNAME@(1,"ROOT")=R_")",@DIXNAME@(2,"ROOT")=R_",DINDEX(1))"
 . I $G(DINDEX(1,"USE")),DISUB'="" D
 . . S R=DIGL_"""B"")",DISUB=$O(@R@(DISUB),-DIX1(1,"WAY"))
 . . S @DIXNAME@(1)=DISUB
 . . Q
 . S R=DIGL_"""B"")",DISUB=$O(@R@(DISUB)),@DIXNAME@(1,"NXTVAL")=DISUB
 . I DISUB="" K @DIXNAME,DIFILE("STACKEND",I) Q
 . Q:DIFILE("STACK")
 . S DIFILE("STACK")=I_U_DIFILE("STACKEND",I)
 . Q
 K DIX1(1,"USE")
 I +DIFILE("STACK")=1 S DIX1(1)=DIXV(1,1)
 E  S I="DIXV("_+DIFILE("STACK")_")" M DIX1=@I
 D WALK^DICLIX(DIFLAGS,.DIX1,.DIDENT,.DIFILE,.DIEN,.DIFIEN,.DISCREEN,.DILIST,.DINDEX,.DIXV,.DIC)
 Q
 ;

DICL2
DICL2 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup: Lister, Part 3 ;11JUNE2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;.
SCREEN(DIFILE,DIEN,DIFLAGS,DIFIEN,DISCREEN,DINDEX,DI0NODE) ;
 ;
 ; return 1 if entry should be screened out
 ;
S1 ; entries tagged for archiving, or missing the .01 or already on
 ; the list should be screened out.
 ;
 I DIFILE'<2,'$$VMINUS9^DIEFU(DIFILE,","_DIEN_DIFIEN) Q 1
 I $P(DI0NODE,U)="" Q 1
 I DIFLAGS[4 N DIREC D  I 'DIREC Q 1
 . S DIREC=DIEN I DIFLAGS["v" S DIREC=DIREC_";"_$P(DIFILE(DIFILE,"O"),U,2)
 . I $D(@DILIST@("B",($E($P(DI0NODE,U),1,DINDEX("MAXSUB"))_"^"_DIREC))) S DIREC=0
 . Q
 ;
S2 ; execute any screen on transformed lookup values
 ;
 N DISKIP S DISKIP=0
 I DIFLAGS[4 N DISUB F DISUB=1:1:DINDEX("#") D  Q:DISKIP
 . N DISCR2 S DISCR2=+$G(DINDEX(DISUB,"FOUND"))
 . Q:'$D(DISCREEN(DISUB,DISCR2))
 . N DIVAL,D S @DINDEX(DISUB,"GET"),D=DINDEX
 . X DISCREEN(DISUB,DISCR2) S DISKIP='$T
 . Q
 I DISKIP Q DISKIP
 N DISCR
S3 ; Additional screening for using an alternate index for loop through file.
 I $D(DISCREEN("X")) F DISCR=0:0 S DISCR=$O(DISCREEN("X",DISCR)) Q:'DISCR  D  Q:DISKIP
 . N D,DIPART,DISUB,DIVAL,X
 . X DISCREEN("X",DISCR,"GET") I DIVAL="" S DISKIP=1 Q
 . F DISUB=0:0 S DISUB=$O(DISCREEN("VAL",DISCR,DISUB)) Q:'DISUB  D  Q:'DISKIP
 . . S D="",DISKIP=1
 . . S DIPART=DISCREEN("VAL",DISCR,DISUB) Q:$P(DIVAL,DIPART)'=""
 . . S X=$G(DISCREEN("X",DISCR,DISUB)) I X]"" X X Q:'$T
 . . S DISKIP=0 Q
 . Q
 I DISKIP Q DISKIP
S4 ; Execute Screen parameter, whole file screen.
 F DISCR="F","S" I $G(DISCREEN(DISCR))'="" D  Q:DISKIP
 . N %,D S D=$G(DINDEX)
 . N DIC S DIC=DIFILE(DIFILE,"O")
 . I DIFLAGS[4 S DIC(0)=$TR(DIFLAGS,"2^fqlpqtuv4PQU")
 . E  S DIC(0)=$TR(DIFLAGS,"2^fpq3BIMPQ")
 . N Y M Y=DIEN
 . N Y1 S Y1=DIEN_DIFIEN
 . N X S X=$G(@DIFILE(DIFILE)@(DIEN,0)),X=$P(X,U)
 . I DIFLAGS[4,DIFLAGS["p" N I S I=DIEN
 . D
 . . N DIFILE,DIXV,DIY,DIYX
 . . I 1 X DISCREEN(DISCR) S DISKIP='$T
 .
S5 . ; if the screen returned DIERR, id the error's source with a second
 . ; error and exit
 .
 . I $G(DIERR) D
 . . S DISKIP=1
 . . N DICONTXT
 . . S DICONTXT=$S(DISCR["F":"Whole File Screen",1:"Screen Parameter")
 . . D ERR^DICF4(120,DIFILE,DIEN,"",DICONTXT)
 Q DISKIP
 ;
ACCEPT(DIFILE,DIEN,DIFLAGS,DIFIEN,DINDEX,DIDENT,DILIST,DI0NODE) ;
 ; accept an entry into the output list
 ;
A1 ; if we're doing the final pass (just looking to see if there are any
 ; more entries), we don't actually add it to the list, just note what
 ; we found and quit
 ;
 I DIDENT(-1,"JUST LOOKING") D  Q
 . S DIDENT(-1,"JUST LOOKING")=0
 . S DIDENT(-1,"MORE?")=1
 . Q:DIFLAGS[4
 . N DISAME,I S DISAME=0
 . F I=1:1 Q:I>DINDEX("#")  D  Q:DISAME<I
 . . I DIDENT(-1,"LAST",I,"I")'=DINDEX(I) Q
 . . S DISAME=I Q
 . F I=1:1:(DINDEX("#")+1) K DIDENT(-1,"LAST",I,"I")
 . Q:DISAME=DINDEX("#")
 . F I=(DISAME+2):1:(DINDEX("#")+1) S DIDENT(-1,"LAST",I)=""
 . S DIDENT(-1,"LAST","IEN")="" Q
 ;
A2 ; increment the number found; if it's the max, we flag to make the
 ; next pass a final just looking pass
 ;
 S DIDENT(-1)=DIDENT(-1)+1
 I DIDENT(-1)=DIDENT(-1,"MAX") D
 . S DIDENT(-1,"JUST LOOKING")=1
 . Q:DIFLAGS[4
 . N I F I=1:1:(DINDEX("#")+1) D
 . . S (DIDENT(-1,"LAST",I),DIDENT(-1,"LAST",I,"I"))=DINDEX(I)
 . . I I=1,"VP"[DINDEX(I,"TYPE"),'$D(DINDEX("ROOTCNG",1)) S DIDENT(-1,"LAST",I)=DINDEX0(1)
 . . Q
 . S DIDENT(-1,"LAST")=DIDENT(-1,"LAST",1)
 . S DIDENT(-1,"LAST","IEN")=DIEN
 . Q
 ;
A3 ; increment (or decrement) the output list subscript
 ;
 S DILIST("ORDER")=$S(DIFLAGS[4:DIDENT(-1),1:DILIST("ORDER")+DINDEX("WAY"))
 N DA M DA=DIEN I '$D(DA(1)) N D0 S D0=DA ;***
 ;
A4 ; output the specified values of the record
 ;
 I DIFLAGS'["f" D
 . D IDS^DICU2(.DIFILE,DIEN_DIFIEN,.DIFLAGS,.DINDEX,DILIST("ORDER"),.DIDENT,DILIST,.DI0NODE)
 . Q
 Q:DIFLAGS'[4
 N DIREC S DIREC=DIEN I DIFLAGS["v" S DIREC=DIREC_";"_$P(DIFILE(DIFILE,"O"),U,2)
 I DIFLAGS["f",DIFLAGS'["p" S @DILIST@(DIDENT(-1))=DIREC
 S @DILIST@("B",($E($P(DI0NODE,U),1,DINDEX("MAXSUB"))_U_DIREC))=""
 Q
 ;
 ; Possible output messages
 ; 202    The input parameter that identifies the |1
 ;

DICL3
DICL3 ;SF/TKW-VA FileMan: Lookup: Lister, Part 4 ;1/26/99  08:32
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
FOLLOW(DIFILE,DIF,DIDEF,DICHNNO,DILVL,DIFRFILE,DIFIELD,DIDXFILE,DIVPTR,DISUB,DISCREEN) ;
 ;
 ; follow pointer/vp chains to end, building stack along the way
 ;
F1 ; increment stack level, loop increments at top
 ; if pointing file lacks B index, store that in stack
 ;
 S DILVL=DILVL+1
 I DILVL=1 S DIF(1,DIFILE)=U_DIDXFILE
 I DILVL>1 D
 . S DIF(DILVL,DIFILE)=DIFRFILE_U_DIVPTR
 . I '$D(@DIFILE(DIFILE)@("B")) S DIFILE(DIFILE,"NO B")=""
 . S DIFILE(DIFILE,"O")=$$OREF^DIQGU(DIFILE(DIFILE))
 . Q
F2 ; Find data type of .01 field of pointed-to file, process
 ; end of pointer chain.
 N T S T=$P(DIDEF,U,2)
 I T'["P",T'["V" D  Q
 . S DIFILE("STACKEND",DICHNNO)=DILVL_U_DIFILE
 . N L,F F L=DILVL:-1:1 D
 . . S DIFILE("STACK",DICHNNO,L,DIFILE)=DIFRFILE_U_DIVPTR
 . . Q:L=1
 . . S DIFILE=+DIF(L,DIFILE)
 . . S F=DIF(L-1,DIFILE),DIFRFILE=$P(F,U),DIVPTR=$P(F,U,2)
 . S DICHNNO=DICHNNO+1
 . Q
F3 ; Advance file number, Process regular pointers within pointer chain.
 N DIFRFILE S DIFRFILE=DIFILE
 I T["P" D  Q
 . S DIFILE=+$P($P(DIDEF,U,2),"P",2)
 . S DIFILE(DIFILE)=$$CREF^DIQGU(U_$P(DIDEF,U,3))
 . S DIDEF=$G(^DD(DIFILE,.01,0))
 . D FOLLOW(.DIFILE,.DIF,DIDEF,.DICHNNO,.DILVL,DIFRFILE,"","",0)
 . Q
F4 ; Process variable pointers within the pointer chain.
 N DIVP,G
 S:'$G(DIFIELD) DIFIELD=.01
 F DIVP=0:0 S DIVP=$O(^DD(DIFILE,DIFIELD,"V",DIVP)) Q:'DIVP  S G=$G(^(DIVP,0)) D
 . Q:'G
 . S DIFILE=+G,G=$G(^DIC(DIFILE,0,"GL")) I G="" S DIFILE=DIFRFILE Q
 . I DILVL=1,$D(DISCREEN("V",DISUB)),'$D(DINDEX(DISUB,"VP",G)) S DIFILE=DIFRFILE Q
 . S DIFILE(DIFILE)=$$CREF^DIQGU(G)
 . S DIDEF=$G(^DD(DIFILE,.01,0))
 . N DISAVL S DISAVL=DILVL
 . D FOLLOW(.DIFILE,.DIF,DIDEF,.DICHNNO,.DILVL,DIFRFILE,"","",1)
 . S DILVL=DISAVL,DIFILE=DIFRFILE
 Q
 ;
BACKTRAK(DIFLAGS,DIFILE,DISTACK,DIEN,DIFIEN,DINDEX0,DINDEX,DIDENT,DISCREEN,DILIST) ;
 ;
 ; Back up on pointer stack until we get back to home file.
 ;
B1 ; back up one level on stack, recover file #, root, and index file,
 ; and set value to match equal to the previous level's ien value
 ;
 N F,DIVPTR S F=DIFILE("STACK",+DISTACK,+$P(DISTACK,U,2),+$P(DISTACK,U,3))
 S DIVPTR=$P(F,U,2),F=+F
 N DIVALUE D
 . I 'DIVPTR S DIVALUE=DIEN Q
 . S DIVALUE=DIEN_";"_$P(DIFILE(+$P(DISTACK,U,3),"O"),U,2)
 . Q
 S DISTACK=(+DISTACK)_U_($P(DISTACK,U,2)-1)_U_F
 I $P(DISTACK,U,2)=1 D  Q
 . N DIROOT1 S DIROOT1=$S($D(DIFILE(F,"NO B")):DIFILE(F,"NO B"),1:DIFILE(F,"O")_"DINDEX0")_")"
 . I $O(@DIROOT1@(DIVALUE,""))="" S DIEN="" Q
 . S DINDEX0(1)=DIVALUE,DIEN=""
 . S DIFILE=+F
 . S F=$TR(DIFLAGS,"vp")
 . D WALK^DICLIX(F,.DINDEX0,.DIDENT,.DIFILE,.DIEN,.DIFIEN,.DISCREEN,.DILIST,.DINDEX,"",.DIC)
 . S DIFILE=+$P(DIFILE("STACK"),U,3)
 . Q
 ;
B2 ; loop through matches on pointer index,
 ; quit when no matches, if not back to root of pointer chain yet,
 ; make another recursive call to BACKTRAK to unwind to pointing
 ; file's matches
 ;
 S DIEN="" F  D  Q:DIEN=""!($G(DIERR))
 . N DIROOT1 S DIROOT1=$S($D(DIFILE(F,"NO B")):DIFILE(F,"NO B"),1:DIFILE(F,"O")_"""B""")_")"
 . S DIEN=$O(@DIROOT1@(DIVALUE,DIEN))
 . Q:DIEN=""
 . D BACKTRAK(.DIFLAGS,.DIFILE,DISTACK,DIEN,DIFIEN,.DINDEX0,.DINDEX,.DIDENT,.DISCREEN,.DILIST)
 . Q
 Q
 ;
SETB ; Set temporary "B" index on pointed-to files.
 Q:'$O(DIFILE("STACK",0))
 N I,J,DIFL,DITEMP
 F I=0:0 S I=$O(DIFILE("STACK",I)) Q:'I  F J=0:0 S J=$O(DIFILE("STACK",I,J)) Q:'J  F DIFL=0:0 S DIFL=$O(DIFILE("STACK",I,J,DIFL)) Q:'DIFL  I $D(DIFILE(DIFL,"NO B")) D
 . D TMPB^DICUIX1(.DITEMP,DIFL)
 . S DIFILE(DIFL,"NO B")=DITEMP
 . D BLDB^DICUIX1(DIFILE(DIFL),DITEMP)
 . Q
 Q
 ;

DICLGFT
DICLGFT ;GFT/GFT-- USE ANY SORT VALUES FOR LISTER;07MAR2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DICL ;FROM ^DICL  RETURN TO BADQ^DICL WITH DIERR DEFINED OR ELSE WE HAVE DINDEX SET UP CORRECTLY TO GET SORTED OUTPUT
 N X,I,DITEMP,DICLGFT
 D TMPB^DICUIX1(.DITEMP,DIFILE) ;SETS DITEMP=something like "^TMP("DICLB",2,3188"
 S DIGFTEMP=DITEMP_")" ;so we can remember to KILL the temporary array
BACKWARD I $G(DINDEX("WAY","REVERSE"))=1 D
 .S X=$$SORT(DIFILE,DINDEX,DIGFTEMP,,.DIFROM)
 E  D
 .S X=$$SORT(DIFILE,DINDEX,DIGFTEMP,.DIFROM)
 S DIFROM(1)="" I X D BLD^DIALOG(-X,$P(X,U,2)) K @DIGFTEMP Q  ;We have already done the sort, so "FROM" can be the beginning
 ;now we have the answers in @DITEMP.
 ;D COMMON1^DICUIX2  probably need some of this
 S DICLGFT=$P(X,U,2),DINDEX("#")=DICLGFT ;NUMBER OF LEVELS IN OUR SORT
 S DINDEX("IXTYPE")="["
 F I=1:1:DICLGFT+1 S DINDEX(I,"WAY")=DINDEX("WAY")
 S DINDEX(1,"ROOT")=DITEMP_")",X=DITEMP
 F I=1:1:DICLGFT S X=X_",DINDEX("_(I)_")",DINDEX(I+1,"ROOT")=X_")"
 F I=1:1:DICLGFT S DINDEX(I,"FILE")=DIFILE
 ;S DINDEX(1,"GET")="DIVAL=ZZZ" ;????????
 S DINDEX(1,"TYPE")="[",DINDEX("AT")=1
 F I=1:1:DICLGFT S DINDEX(I)=$G(DIFROM(I)) ;FROM VALUES
 S DINDEX(DICLGFT+1)=0
 Q
 ;
 ;
 ;
 ;
SORT(DIFILE,BY,DICLARAY,FR,TO) ;SORT FILE BY TEMPLATE OR FIELD(S), AND PUT RESULTS IN 'DICLARAY' ARRAY
 ;EXTRINSIC FUNCTION RETURNS
 ;"OK^n" IF SUCCESSFUL, where 'n' is number of levels
 ;
 N L,DIC,FLDS,DHD,DIASKHD,DIPCRIT,PG,DHIT,DIOEND,DIOBEG,DCOPIES,IOP,DQTIME,DIS,DISTOP,DISPAR,DIFIXPTH,DISH,DIS0
 N D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13
 N DIQUIET,DISUPNO S DIQUIET=1,DISUPNO=1
 N X
 N DIOSL S DIOSL=9999999
 N DIFIXPT S DIFIXPT=1,DHD="@@" ;TRICK TO AVOID DEVICE SELECTION!
 S DIOBEG="K ^UTILITY($J,""H"") S DISH=1,IOT="""",$X=0,$Y=0" ;TRICK TO SUPPRESS SUBHEADERS IN SORT TEMPLATE, WHETHER OR NOT THERE IS A PRE-SORT
 I '$D(^DIC(DIFILE,0,"GL")) Q "401^"_DIFILE
 S DIC=^("GL")
 ;
 N DICLGFT S DICLGFT=1
 ;
 I $G(BY)="" Q "-202^SORT VALUE"
DIBT S X=0 I $G(BY)?1"[".E1"]" S X=$O(^DIBT("F"_DIFILE,$TR(BY,"[]"),0)) I X&$O(^(X))!'X Q "-202^SORT TEMPLATE '"_BY_"'" ;MUST HAVE EXACTLY ONE TEMPLATE OF THAT NAME
 I X S L=$O(^DIBT(X,2,999),-1) I L S DICLGFT=L D  G A:$D(X) Q "-202^SORT TEMPLATE '"_BY_"'" ;NUMBER OF LEVELS
 .F L=1:1:L I $G(^DIBT(X,2,L,"ASK")) K X Q  ;NONE OF THE LEVELS MUST ASK
 ;I X,'L S DICLGFT0=1
 ;
FIELD N DICLGFTX,DD S DICLGFTX=$G(BY),DICLGFT=$L(DICLGFTX,",") ;SORT BY FIELD
 S:$D(FR)[0 FR=",,,,,,,,,,,," S:$D(TO)[0 TO=",,,,,,,,,,"
 S DD=DIFILE F  S FLDS=$P(DICLGFTX,","),DICLGFTX=$P(DICLGFTX,",",2) Q:FLDS=""  D
 .S FLDS=$P(FLDS,";") I $D(^DD(DD,FLDS,0))
 .E  S FLDS=$O(^DD(DD,"B",FLDS,0)) Q:'FLDS
 .S L=+$P(^DD(DD,FLDS,0),U,2) I L S DD=L,DICLGFT=DICLGFT-1 ;GOING DOWN INTO A MULTIPLE, SO LEVEL OF SORT IS 1 LESS THAN WE THOT
 ;
A I DICLARAY["^",DICLARAY'["(" Q "-202^BAD ARRAY "_DICLARAY
 K ^UTILITY("DICLGFT",$J),@DICLARAY
 ;
DHIT S DHIT="" ;I $G(DICLGFT0) S DHIT="1," ;IF IT IS JUST A LIST
 F L=1:1:DICLGFT S X="DIOO"_L,DHIT="$S($G("_X_")]"""":"_X_",1:1),"_DHIT
 S DHIT="("_DHIT_"D0)",DHIT="S @DICLARAY@"_DHIT_"=""""" ;CREATES SOMETHING LIKE DHIT = S @DICLARAY@($S($G(DIOO2)]"":DIOO2,1:1),$S($G(DIOO1)]"":DIOO1,1:1),D0)=""
 ;
 S L=0,FLDS="X ""QUIT"";X"
 S $X=0,$Y=0 ;,IOP="NULL"
DIP D EN1^DIP ;HERE IS THE BIG CALL TO FILEMAN'S PRINT MODULE!
 Q "OK^"_DICLGFT  ;EXIT WITH 'DICLGFT' DEFINED AS THE NUMBER OF LEVELS
 ;
 ;
 ;

DICLIB
DICLIB ;SFISC/TKW - LIBRARY OF FUNCTIONS FOR ^DIC ;05:00 PM  14 Oct 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NXTNO(F,DA,FLAGS) ;GET NEXT RECORD NUMBER FOR FILE OR SUBFILE F (F CAN CONTAIN A GLOBAL REFERENCE TO IMPROVE EFFICIENCY)
 ;DA=DA ARRAY (IF F IS A SUBFILE)
 ;FLAGS (OPTIONAL) IF IT CONTAINS "U", WILL UPDATE LAST REC.# ON 0 NODE
 N I,X,Y,DIC,% S X=0,I=1
 S:'F DIC=$TR(F,")",",") S:F DIC=$$ROOT^DIQGU(F,.DA)
 G:DIC="" QI G:'$D(@(DIC_"0)")) QI
INCR L @("+"_DIC_"0):10") G:'$T QL
 I 'X S Y=@(DIC_"0)"),X=$P($P(Y,U,3),"."),%=+$P(Y,U,2) I '$D(^DIA(%,"B")) S %=0
 F I=1:1 S X=X+1 Q:'$D(@(DIC_X_")"))&$S(%:+$O(^DIA(%,"B",X_","))'=X&'$D(^(X)),1:1)  I I=100 S I=0 Q
 I 'I L @("-"_DIC_"0)") G INCR
 I $G(FLAGS)["U" S $P(@(DIC_"0)"),U,3,4)=X_U_($P(Y,U,4)+1)
 L @("-"_DIC_"0)")
 Q X
QI D BLD^DIALOG(200) G Q0
QL D BLD^DIALOG(110,F)
Q0 Q 0
 ;DIALOG #200  'An input variable or parameter is missing or invalid.'
 ;       #110  'The record is currently locked'

DICLIX
DICLIX ;SEA/TOAD,SF/TKW-FileMan: Lister, Search Compound Indexes ;6/5/00  10:13
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
WALK(DIFLAGS,DINDEX,DIDENT,DIFILE,DIEN,DIFIEN,DISCREEN,DILIST,DINDEX0,DIXV,DIC) ;
 ;
 ; a walker to traverse a compound index, taking actions
 ; DINDEX is an array describing the index and how to walk it
 ;
PREP ; prepare to loop through subscript
 ;
 N DISUB S DISUB=DINDEX("AT")
 N DIVAL S DIVAL=DINDEX(DISUB)
 N DIPART,DIMORE S DIPART=$G(DINDEX(DISUB,"PART")),DIMORE=+$G(DINDEX(DISUB,"MORE?"))
 I $G(DINDEX(DISUB,"USE")),DIVAL'="" D
 . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),-DINDEX(DISUB,"WAY"))
 ;
LOOP ; loop through subscripts
 ;
 N DIDONE,DISKIP S DIDONE=0 F  D  Q:DIDONE!$G(DIERR)
 . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),DINDEX(DISUB,"WAY"))
 .
DATA . ; if we're in the data subscripts, we need to walk further
 .
 . I DISUB'>DINDEX("#") D  Q
 . . I DISUB=1,$O(DIXV(0)) D LOWSUB
 . . S DISKIP=0
 . . I DIVAL'="",'$D(DINDEX(DISUB,"IXROOT")) D CHK Q:DISKIP
 . . S:DIVAL="" DIDONE=1
 . . Q:DIDONE
 . . S DINDEX(DISUB)=DIVAL,DINDEX("AT")=DISUB+1
 . . I $D(DINDEX("ROOTCNG",DISUB+1)) D BLDTMP^DICLIX1(.DINDEX,.DISCREEN,DIFLAGS,.DIDENT)
 . . D WALK(.DIFLAGS,.DINDEX,.DIDENT,.DIFILE,.DIEN,DIFIEN,.DISCREEN,.DILIST,.DINDEX0,"",.DIC)
 . . S DINDEX("AT")=DISUB
 . . I $G(DINDEX("DONE"))!$G(DIERR) S DIDONE=1
 . . Q
 .
IEN . ; otherwise, we're in the IEN subscripts & need to process
 .
 . I DIVAL="" S DIDONE=1 Q
 . I DINDEX="B" N DISKIPMN,DIMNEM S DISKIPMN=0 D  Q:DISKIPMN
 . . I $D(@DINDEX(DISUB,"ROOT")@(DIVAL))#2 Q:'^(DIVAL)
 . . E  Q:'$O(@DINDEX(DISUB,"ROOT")@(DIVAL,""))
 . . I DIFLAGS["M" S DISKIPMN=1 Q
 . . S DIMNEM="" Q
 . I $G(DINDEX(DISUB,"TO")) D  Q:DIDONE
 . . Q:$D(DINDEX(DISUB,"IXROOT"))
 . . D BACKPAST^DICLIX1(DIFLAGS,.DINDEX,DISUB,DIVAL,.DIDONE) Q
 . D TRY
 . Q
CLEAN ; clean up after loop, exit
 S DINDEX(DISUB)=""
 I DISUB>1,$G(DINDEX(DISUB,"PART"))]"" S DINDEX(DISUB)=DINDEX(DISUB,"FROM")
 Q
 ;
CHK ; See whether we have a match or are at the end of the subscripts.
 D MATCH I DIDONE,'$G(DINDEX("DONE")),DIMORE D
 . S DIDONE=0 D FINDMORE^DICLIX0(DISUB,.DIVAL,DIPART,.DINDEX,.DIMORE) I DIVAL="" S DIDONE=1 Q
 . D MATCH Q
 Q
 ;
MATCH ; No more subscripts or partial matches, or past our TO value?
 Q:DIVAL=""
 I $P(DIVAL,$G(DIPART))'="" S DIDONE=1 Q
 Q:$G(DINDEX(DISUB,"TO"))=""
 I DIFLAGS["p" D BACKPAST^DICLIX1(DIFLAGS,.DINDEX0,DISUB,DIVAL,.DIDONE) Q
 I $G(DINDEX(DISUB+1,"TO"))="" D BACKPAST^DICLIX1(DIFLAGS,.DINDEX,DISUB,DIVAL,.DIDONE)
 Q
 ;
LOWSUB ; Find next subscript value from multiple pointed-to files
 N I,DILOWNO,DILOWVAL S DILOWNO=+DIFILE("STACK"),DILOWVAL=DIVAL
 I DILOWVAL="" D  I 'DILOWNO K DIXV Q
 . K DIXV(DILOWNO),DIFILE("STACKEND",DILOWNO)
 . S DILOWNO=$O(DIXV(0)),DILOWVAL=$G(DIXV(+DILOWNO,1,"NXTVAL"))
 . Q
 N J S J=DILOWNO
 I DILOWVAL'="" F I=0:0 S I=$O(DIFILE("STACKEND",I)) Q:'I  I I'=J D
 . I DINDEX(1,"WAY")=1,DILOWVAL']]DIXV(I,1,"NXTVAL") Q
 . I DINDEX(1,"WAY")=-1,DIXV(I,1,"NXTVAL")']]DILOWVAL Q
 . S DILOWNO=I,DILOWVAL=$G(DIXV(DILOWNO,1,"NXTVAL"))
 . Q
 I DILOWNO'=DIFILE("STACK") D
 . I DIVAL'="" S DIXV(+DIFILE("STACK"),1,"NXTVAL")=DIVAL
 . S DIFILE("STACK")=DILOWNO_U_DIFILE("STACKEND",DILOWNO)
 . S DIVAL=DILOWVAL
 . S DIFILE=+$P(DIFILE("STACK"),U,3)
 . M DINDEX=DIXV(DILOWNO) Q
 Q
 ;
TRY ; Apply screens to entry.  If passed, add entry to output.
 S (DIEN,DINDEX(DISUB))=DIVAL
 I DIFLAGS["p" D
 . S DINDEX0(1,"EXT")=DINDEX(1)
 . D BACKTRAK^DICL3(.DIFLAGS,.DIFILE,DIFILE("STACK"),.DIEN,DIFIEN,.DINDEX0,.DINDEX,.DIDENT,.DISCREEN,.DILIST)
 . S:$G(DINDEX0("DONE")) (DIDONE,DINDEX("DONE"))=1 Q
 I DIFLAGS'["p" D
 . N DI0NODE S DI0NODE=$G(@DIFILE(DIFILE)@(DIEN,0))
 . Q:$$SCREEN^DICL2(.DIFILE,.DIEN,DIFLAGS,DIFIEN,.DISCREEN,.DINDEX,DI0NODE)
 . D ACCEPT^DICL2(.DIFILE,.DIEN,.DIFLAGS,DIFIEN,.DINDEX,.DIDENT,.DILIST,DI0NODE)
 . Q
 Q:$G(DIERR)!($G(DINDEX("DONE")))
 I DIDENT(-1)=DIDENT(-1,"MAX") D
 . I 'DIDENT(-1,"JUST LOOKING") S DIDONE=1,DINDEX("DONE")=1 Q
 . ; If called from online DIC help ^DICQ, display list.
 . Q:DIFLAGS'["h"
 . K DTOUT,DUOUT S DICQ(0,"MAP")=DIDENT(-3)
 . D DSP^DICQ1(.DINDEX,.DICQ,.DIC,.DIFILE)
 . I $G(DTOUT)!($G(DUOUT)) S (DINDEX("DONE"),DIDONE)=1 Q
 . S DILIST("ORDER")=$S(DINDEX("WAY")=1:0,1:DIDENT(-1,"MAX")+1)
 . S DIDENT(-1)=0,DIDENT(-1,"JUST LOOKING")=0 Q
 Q
 ;
 ;

DICLIX0
DICLIX0 ;SEA/TOAD,SF/TKW-FileMan: Continuation of DICLIX ;7/31/98  09:03
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
FINDMORE(DISUB,DIVAL,DIPART,DINDEX,DIMORE) ; Look across the numeric/string collation boundary
 ; Searching forwards
 N S,DIOUT S DIOUT=0
 I DINDEX(DISUB,"WAY")=1 D  Q
 . I +$P(DIVAL,"E")=DIVAL,DIPART'=0 F  D  Q:DIOUT!(+$P(DIVAL,"E")'=DIVAL)
 . . I DIPART<DIVAL,((DIPART[".")!(DIPART<0)) S DIVAL=" " Q
 . . D NXT(.DIVAL,DIPART,1,DINDEX(DISUB,"ROOT"),.DIOUT) Q
 . Q:DIOUT
 . S DIMORE=0
 . S S=$O(@DINDEX(DISUB,"ROOT")@(DIPART_" "),-1)
 . S S=$O(@DINDEX(DISUB,"ROOT")@(S))
 . Q:S'=""&(DIVAL]]S)  S DIVAL=S Q
 ; Searching backwards
 I +$P(DIVAL,"E")'=DIVAL S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(" "),-1) Q:DIVAL=""
 I DIPART=0 S DIVAL=$S($D(@DINDEX(DISUB,"ROOT")@(0)):0,1:"") Q
 I DIPART>DIVAL,((DIPART[".")!(DIPART>0)) S DIVAL="" Q
 I DIPART<0,DIVAL>DIPART D
 . I $D(@DINDEX(DISUB,"ROOT")@(DIPART)) S DIVAL=DIPART Q
 . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIPART),-1) Q
 Q:$E(DIVAL,1,$L(DIPART))=DIPART!(DIVAL="")
 F  D  Q:DIOUT!(DIVAL="")
 . I DIPART>DIVAL,((DIPART[".")!(DIPART>0)) S DIVAL="" Q
 . D NXT(.DIVAL,DIPART,-1,DINDEX(DISUB,"ROOT"),.DIOUT) Q
 Q
NXT(DIVAL,DIPART,DIWAY,DIROOT,DIOUT) ; Skip values we don't need to look at within numeric entries
 N DIPART2,DIVAL2,I,P,V
 S DIPART2=$P(DIPART,"."),DIVAL2=$P(DIVAL,".")
 S P=$S(DIPART<0:-DIPART2,1:DIPART2)
 S V=$S(DIVAL<0:$E(DIVAL2,2,($L(P)+1)),1:$E(DIVAL2,1,$L(P)))
 S I=$L(DIVAL2)
 I DIWAY=1&(DIPART>0)!(DIWAY=-1&(DIPART<0)) D
 . S:V>P I=I+1 Q
 E  D
 . S DIPART2=DIPART2+$S(DIPART>0:1,1:-1)
 . I P>V,$L(DIPART2)=$L($P(DIPART,".")) S I=I-1
 S V="",I=I-$L(DIPART2)+1 S:I>1 $P(V,"0",I)=""
 S DIVAL=DIPART2_V
 I $E(DIVAL,1,$L(DIPART))=DIPART,$D(@DINDEX(DISUB,"ROOT")@(DIVAL)) S DIOUT=1 Q
 S DIVAL=$O(@DIROOT@(DIVAL),DIWAY)
 S:$E(DIVAL,1,$L(DIPART))=DIPART DIOUT=1
 Q
 ;
 ;

DICLIX1
DICLIX1 ;SEA/TOAD,SF/TKW-FileMan: Lister, Search Compound Indexes (cont.) ;11/5/99  15:13
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
BLDTMP(DINDEX,DISCREEN,DIFLAGS,DIDENT) ; Build temporary index of external values when pointer/vp subscript is encountered.
 N DISUB,DIXSAV,DIX,DIDOUT S DIDOUT=0
 S DIX("AT")=DINDEX("AT") K @DINDEX(DIX("AT"),"ROOT")
 N I S I=$S(DIX("AT")=1:1,1:DIX("AT")-1)
 F DISUB=I:1:DINDEX("#")+1 D
 . S (DIXSAV(DISUB),DIX(DISUB))=DINDEX(DISUB)
 . I "VP"[$G(DINDEX(DISUB,"TYPE")) S DIX(DISUB)=""
 D BT1
 F DISUB=DINDEX("AT"):1:DINDEX("#")+1 S DINDEX(DISUB)=DIXSAV(DISUB)
 Q
 ;
BT1 N DISUB S DISUB=DIX("AT")
 N DIVAL,DISINT,DIDONE,DIPART,DIMORE S DISINT=DIX(DISUB),DIDONE=0
 F  D  Q:DIDONE
 . S DISINT=$O(@DINDEX(DISUB,"IXROOT")@(DISINT),DINDEX(DISUB,"WAY"))
 . S:DISINT="" DIDONE=1 Q:DIDONE
 . I DISUB'>DINDEX("#") D  Q
 . . S DIVAL=DISINT,DIPART=$G(DINDEX(DISUB,"PART")),DIMORE=$G(DINDEX(DISUB,"MORE?"))
 . . I DINDEX(DISUB,"TYPE")="V",$G(DISCREEN("V",DISUB))]"" D  Q:DIVAL=""
 . . . N G S G="^"_$P(DISINT,";",2) Q:G="^"
 . . . S:'$D(DINDEX(DISUB,"VP",G)) DIVAL="" Q
 . . I "VP"[DINDEX(DISUB,"TYPE") D  I DIVAL="" S DIDONE=1 Q
 . . . S DIVAL=$$EXTERNAL^DIDU(DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),"i",DIVAL)
 . . . Q:'$G(DIERR)
 . . . I DIFLAGS["h" K DIERR,^TMP("DIERR",$J) Q
 . . . S DIVAL="",DINDEX("DONE")=1 Q
 . . D CHK^DICLIX I DIDONE D  Q
 . . . I $G(DINDEX("DONE")) S DIDOUT=1 Q
 . . . S:DIVAL]"" DIDONE=0 Q
 . . I DISUB=1,"VP"[DINDEX(1,"TYPE") S @DINDEX(1,"ROOT")@(DIVAL)=DISINT
 . . S DINDEX(DISUB)=DIVAL,DIX(DISUB)=DISINT,DIX("AT")=DISUB+1
 . . D BT1
 . . S DIX("AT")=DISUB
 . . I $G(DIDOUT) S DIDONE=1
 . . Q
 . Q:DIDONE
 . I $G(DINDEX(DISUB,"TO")) D  Q:DIDONE
 . . D BACKPAST(DIFLAGS,.DINDEX,DISUB,DISINT,.DIDONE)
 . . S:DIDONE DIDOUT=1 Q
 . S @DINDEX(DISUB,"ROOT")@(DISINT)=""
 S DIX(DISUB)="" Q
 ;
BACKPAST(DIFLAGS,DINDEX,DISUB,DIVAL,DIDONE) ; Have we gone past TO value?  Lister only.
 N I,DIOUT S DIOUT=0
 F I=1:1:DISUB D  Q:DIOUT
 . N V S V=$S(I=DISUB:DIVAL,1:DINDEX(I))
 . I I=1,DIFLAGS'["p","PV"[DINDEX(1,"TYPE") S V=DINDEX(I,"EXT")
 . Q:V=DINDEX(I,"TO")
 . I DINDEX(I,"WAY")=1,DINDEX(I,"TO")]]V S DIOUT=1 Q
 . I DINDEX(I,"WAY")=-1,V]]DINDEX(I,"TO") S DIOUT=1 Q
 . S DIVAL="",(DIOUT,DIDONE,DINDEX("DONE"))=1 Q
 . Q
 Q:DIOUT
 S DIVAL="",(DIDONE,DINDEX("DONE"))=1 Q
 ;
 ;

DICM
DICM ;SFISC/GFT,XAK,TKW-MULTIPLE LOOKUP FOR FLDS WHICH MUST BE TRANSFORMED ;27OCT2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I '$D(DICR(1)),DIC(0)'["T" N DICR S DICR=0
 I $A(X)=34,X?.E1"""" G N
 I $G(^DD(+DO(2),0,"LOOK"))]"",^("LOOK")'="SOUNDEX" G @^("LOOK")
 I DIC(0)["U" S DD=0 G W
 I DIC(0)["T" G 2
R N DIFLAGS S DIFLAGS="4l"_$P("M^",U,DIC(0)["M")
 N DIFORCE D
 . S DIFORCE=0 I DIC(0)'["M"!($D(DID)) S DIFORCE=1
 . S DIFORCE(0)=$S(DIC(0)'["M":DINDEX,$D(DID):DID,1:"*"),DIFORCE(1)=1
 F  D 1 I DINDEX=""!(Y>0)!($G(DTOUT))!($G(DIROUT)) Q  ;LOOP THRU ALL THE INDEXES!
 G 2
 ;
1 N DS,%Y,DIV
 I $G(DINDEX("IXFILE")) S Y=DINDEX(1,"FILE"),%Y=DINDEX(1,"FIELD")
 E  S Y=$O(^DD(+DO(2),0,"IX",DINDEX,0)) S:Y="" Y=-1 S %Y=+$O(^(Y,0))
 I Y=-1,DINDEX="B" S Y=+DO(2),%Y=.01
 S:Y="" Y=-1 S:%Y="" %Y=-1
 I $D(DICR(U,Y,%Y,DINDEX)) S Y=-1 ;HAVE WE ALREADY TRIED THIS INDEX?
 E  I %Y=.01,DINDEX'="B",Y=+DO(2),$D(DICR(U,Y,%Y,"B")),$G(DINDEX(1,"TRANCODE"))="" S Y=-1 ;!
 I Y'<0 D
 . S DS=$G(^DD(Y,%Y,0)) I DS="" S Y=-1 Q
 . S %=DINDEX,DICR(U,Y,%Y,DINDEX)=0
 . I $D(^DD(Y,%Y,7)) D RS K DS X ^(7) Q
 . I $G(DINDEX("IXTYPE"))="S" D A,SOU^DICM1,D Q:Y>0  S Y=-1 Q
 . S DIX=Y,Y=$P(DS,U,2) I Y["P",DIC(0)'["L",$T(ORDERQ^DICUIX2)]"",$$ORDERQ^DICUIX2(+$P(Y,"P",2)) S Y="" ;TRICK TO SPEED LOOKUP OF ORDERS!
 . S Y=$S(Y["P":"P",Y["D":"D",Y["S":"S",Y["V":"V",1:"") ;TRANSFORMATION WILL BE NECESSARY IF X-REF'D FIELD IS DATE, POINTER, SET OR VARIABLE-POINTER
 . I Y]"" D A D:'Y ^DICM1,D Q:Y>0  S Y=-1 Q
 . I $G(DINDEX(1,"TRANCODE"))]"" S Y="T" D A,^DICM1 N DITRANX S DITRANX=1 D D
 . Q:Y>0  S Y=-1 Q
 Q:Y>0!(DIC(0)["T")  D
 . K DIV M DIV=X S DIV(1)=X N X,Y
 . D NXTINDX^DICF2(.DINDEX,.DIFORCE,.DIFILEI,DIFLAGS,.DIV,"*") Q
 Q
 ;
2 D D^DIC0 S %=D ;HERE'S WHERE WE TRY ALTERNATE LOOKUPS: UPPER CASE, COMMA-PIECING, TRUNCATE LONG INPUT
 G K:Y>0!($G(DIROUT))
 I X?.E1L.E,DIC(0)'["X" D  G K:$G(DIROUT) ;CONVERT TO UPPER-CASE
 . D % N DIFILEI,DINDEX
 . S DIC(0)=$TR(DIC(0),"L"),X=$$UP^DILIBF(X) S:$G(DILONGX) DICR(DILONGX,"ORG")=X
 . D DIC Q
 I Y'>0,X["," S DS="",DIX=$P(X,",") I DIC(0)'["X",$L(DIX)<31 D  G K:$G(DIROUT) ;COMMA-PIECING
 . F %=2:1 S DD=$P(X,",",%) I DD'["""" D  Q:DD=""
 . . F  Q:$A(DD)-32  S DD=$E(DD,2,999)
 . . F  Q:$A(DD,$L(DD))-32  S DD=$E(DD,1,$L(DD)-1)
 . . I $L(DD)*2+$L(DS)>200!(DD="") S DD="" Q
 . . S DS=DS_" I %?.E1P1"""_DD_""".E!(D'=""B""&(%?1"""_DD_""".E))" Q
 . Q:DS=""  S %=D
 . D % S X=DIX N DILONGX
 . S DS="S %=$P(^(0),U)"_DS,DIC(0)=DIC(0)_"D" D 7 Q
 I Y'>0,$L(X)>30 D  ;LONG DATA
 . N DILONGX
 . S %=D D % S DILONGX=DICR,Y="DICR("_DICR_")",DICR(DICR,"ORG")=X
 . S DS=$S(DIC(0)["X":"I DIVAL="_Y,1:"I '$L($P(DIVAL,"_Y_"))")
 . S:DIC(0)["O"&(DIC(0)'["E") DS=DS_",'$L($P(DIVAL,"_Y_",2))"
 . D 7 I Y>0!(X'?.E1L.E)!(DIC(0)["X") Q
 . S %=D D % S (X,DICR(DICR,"ORG"))=$$UP^DILIBF(X)
 . S Y="DICR("_DICR_",""ORG"")"
 . S DS="I '$L($P(DIVAL,"_Y_"))" S:DIC(0)["O"&(DIC(0)'["E") DS=DS_",'$L($P(DIVAL,"_Y_",2))"
 . D 7
 ;
K S DICR=+$G(DICR),DD=$D(DICR(DICR,6)) K:'DICR DICR
 I Y>0 K DIC("W") D R^DIC2 Q
 I $G(DTOUT)!($G(DIROUT)) Q
W I @("$O("_DIC_"""A[""))]""""") G NL:DIC(0)["N",DD
 I DO(2)'["Z" S Y=0 D  Q:Y>0!($G(DIROUT))
DINUM .I $G(DINDEX("1","FIELD"))=.01,X?1.15NP,$P($G(^DD(+DO(2),.01,0)),U,5,99)["DINUM=X",$P($G(@(DIC_"X,0)")),U)=X D  Q:Y>0
 ..S Y=X I 1 X:$D(DIC("S")) DIC("S") I  S DIY="",DS=1 N DZ,DD D ADDKEY^DIC3,GOT^DIC2 Q
 ..S Y=0
 .N DIOUT S DIOUT=0 F DS=1:1 S @("Y=$O("_DIC_"Y))") D  Q:DIOUT  ;GO THRU THE WHOLE FILE BECAUSE WE HAVE NO CROSS-REFERENCE!  (SEE ..DOTS.. BELOW)
 . . I 'Y S Y=-1,DIOUT=1 Q
 . . W:DIC(0)["E"&(DS#20=0) ".."
 . . I $D(@(DIC_Y_",0)")),$P(^(0),U)=X X:$D(DIC("S")) DIC("S") I  S DIOUT=1
 . . I DIOUT S DIY="",DS=1 N DZ,DD D ADDKEY^DIC3,GOT^DIC2
 . . Q
NL I '$G(DICR) D NQ I $T D  Q:Y>0!($G(DTOUT))!($G(DIROUT))
 . N:'$G(DIASKOK) DIASKOK S (DS,DIASKOK)=1 N DZ,DD
 . D ADDKEY^DIC3,GOT^DIC2 Q
DD S Y=-1 I DD D BAD^DIC1 Q
L I DIC(0)["L" K DD G ^DICN
B D BAD^DIC1 Q
 ;
N D RS S X=$E(X,2,$L(X)-1),%=D D
 . I DINDEX("#")>1 S %Y=+$G(DINDEX(1,"FIELD")),DS=$G(^DD(+$G(DINDEX(1,"FILE")),%Y,0)) Q:DS]""
 . S DS=^DD(+DO(2),.01,0),%Y=.01 Q
 F Y="P","D","S","V" I $P(DS,U,2)[Y K:Y="P" DO D ^DICM1 S:$D(X)#2 DS("INT")=X Q
 I $D(X),DINDEX("#")>1 S X(1)=X
 S Y=-1 D L:$D(X),E
 I Y'>0 K DUOUT D BAD^DIC1 Q
 G 2
 ;
A ; Set variables needed for transforming date/set/ptr/var.ptr
 S DICR(DICR+1,4)=%
 D % K DF,DID,DINUM Q
 ;
% ; Set variables up before doing lookup w/transformed value
 I DIC(0)'["L" S DICR(DICR+1,8)=1
 E  I '$$OKTOADD^DICM0(.DIFILEI,.DINDEX,.DIFINDER) S DICR(DICR+1,8)=1
 I $G(DINUM)]"" S DICR(DICR+1,10)=DINUM
 I $D(DF) S DICR(DICR+1,9)=DF S:$G(DID)]"" DICR(DICR+1,9.1)=$G(DID(1))_U_DID
RS S DICR=DICR+1,DICR(DICR)=X,DICR(DICR,0)=DIC(0),DIC(0)=$TR(DIC(0),"A"),DIC(0)=$TR(DIC(0),"Q") Q
 ;
D S:$G(DICR(DICR,10))]"" DINUM=DICR(DICR,10)
 S (D,DF)=DICR(DICR,4) D
 . N T S T=$P($G(DS),U,2)
 . S DIC(0)=$TR(DIC(0),"M","") I T["V" S DIC(0)=$TR(DIC(0),"A","")
 . I D="B",T'["D",'$G(DITRANX) S DIC(0)=DIC(0)_"s"
 . I T["P"!(T["V")!(T["S") S DIC(0)=DIC(0)_"X"
 . Q
 I DICR(DICR,4)=DINDEX N I M I=DINDEX N DINDEX M DINDEX=I K I S DINDEX("START")=DINDEX
 E  N DINDEX D
 . S (DINDEX,DINDEX("START"))=DICR(DICR,4),DINDEX("WAY")=1
 . D INDEX^DICUIX(.DIFILEI,DIFLAGS,.DINDEX,"",.DIVALUE) Q
 I DINDEX("#")>1 S (DINDEX(1),DINDEX(1,"FROM"),DINDEX(1,"PART"))=$G(X)
RCR S:'$D(DIDA) DICRS=1
DIC ;
 I $D(DICR(DICR,8)) S DIC(0)=$TR(DIC(0),"L")
 S Y=-1 I $D(X) D  ;**22*159  WAS: I $D(X),$L(X)<31 D
 . N DIVAL S (DIVAL,DIVAL(1))=X N X S (X,X(1))=DIVAL
 . D RENUM^DIC1 K DIDA Q
 I $G(DICR) S:DIC(0)["L" DICR(DICR-1,6)=1 K:$D(DICR(DICR,4)) DF ;**GFT 12/18/07
E S D="B" D:$G(DICR)  ;**GFT 1/3/06
 .S %=DICR,X=DICR(%),DIC(0)=DICR(%,0),DICR=%-1
 .S:$G(DICR(%,10))]"" DINUM=DICR(%,10)
 .S:$D(DICR(%,9)) (D,DF)=DICR(%,9) I $G(DICR(%,9.1))]"" S:$P(DICR(%,9.1),U)]"" DID(1)=$P(DICR(%,9.1),U) S DID=$P(DICR(%,9.1),U,2,999)
 .K DICRS,DICR(%)
 D DO^DIC1:'$D(DO(2)) Q
 ;
NQ I $L(X)<14,X?.NP,+X=X,@("$D("_DIC_"X,0))") S Y=X D S^DIC3
 Q
 ;
SOUNDEX I DIC(0)["E",'$D(DICRS) W "  " D RS,SOU S DIC(0)=$TR(DIC(0),"L") D RCR Q:Y>0
 G R
 ;
7 S Y=-1 N % S %=$S($D(DIC("S")):DIC("S"),1:1) ;RECURSIVE CALL TO ^DIC!
 I $D(DS),'$D(DIC("S1")) D
 . S DIC("S")=DS I '% S DIC("S")=DIC("S")_" X DIC(""S1"")",DIC("S1")=%
 . I X]"" D
 . . N DIVAL S (DIVAL,DIVAL(1))=X,DIVAL(0)=1 N X S (X,X(1))=DIVAL
 . . N DINDEX,DIFILEI
 . . S DIC(0)=$TR(DIC(0),"L") D F^DIC
 . K DIC("S") S:$D(DIC("S1")) DIC("S")=DIC("S1") K DIC("S1")
 D E Q
 ;
SOU D SOU^DICM1 Q

DICM0
DICM0 ;SF/XAK,TKW - LOOKUP WHEN INPUT MUST BE TRANSFORMED ;2/15/00  14:40
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
P ;Pointers, called by ^DICM1
 S D="" N DICODE,DIASKOK,DIPTRIX
 S DICR(DICR,1)=DIC,DIC=U_$P(DS,U,3),Y=DIC(0),DIC(0)=$TR(Y,"L","")
 S DICR(DICR,2)=$S($$OKTOADD(.DIFILEI,.DINDEX,.DIFINDER):Y,1:DIC(0))
 S DICR(DICR,2.1)=$S($P(DS,U,2)["'":DIC(0),1:Y)
 N:'$D(DIVPSEL) DIVPSEL S DIVPSEL(DICR)=0
 I DIC(0)["B" S DIC(0)=$TR(DIC(0),"M",""),DICR(DICR,2.1)=$TR(DICR(DICR,2.1),"M","")
 S DIC(0)=$TR(DIC(0),"NV","")
 F Y="DR","S","P","W" I $D(DIC(Y)) M DICR(DICR,Y)=DIC(Y) K DIC(Y)
 S DIPTRIX=$G(DIC("PTRIX",DIFILEI,+DINDEX(1,"FIELD"),+$P($P(DS,U,2),"P",2)))
AST ; Process screens on pointers.
 I $P(DS,U,2)["*",DICR(DICR,2)["L" N DID,DF D
 . F DICODE=" D ^DIC"," D IX^DIC"," D MIX^DIC1" D
 . . S Y=$F(DS,DICODE) Q:'Y
 . . N I S I=$P($E(DS,1,Y-$L(DICODE)-1),U,5,99)
 . . D SETSCR(I,.DICR,.DIC,.D,DICODE,.DID,.DF,+$P($P(DS,U,2),"P",2)) Q
 . Q
P1 ; Build screen to make sure selected entry is pointed-to.
 S Y="("_DICR(DICR,1) G L1:'$D(DO) K DO I @("$O"_Y_"0))'>0") G L1
 S I="DIC"_DICR,DICODE="X ""I 0"" N "_I D
 . I DINDEX("#")=1,$D(DICR(DICR,"S")) S DICODE=DICODE_",%Y"_DICR
 . S DICODE=DICODE_" F "_I_"=0:0 S "_I_"=$O"_Y,%=""""_%_""""
 D  G:DICODE="" L1
 . I $G(DINDEX("#"))>1 D BLDC(Y,%,DINDEX("#"),DIFILEI,"",.DICODE,.DICR) Q
 . I @("$O"_Y_%_",0))>0") S DICODE=DICODE_%_",Y,"_I_")) Q:"_I_"'>0  I $D"_Y_I_",0))"_$$CHKTMP(.DIC,DICR,DIFILEI,I) Q
 . I DS["DINUM=X" S DICODE="I $D"_Y_"Y,0))"_$$CHKTMP(.DIC,DICR,DIFILEI,"Y")_" S "_I_"=Y" Q
 . I $P(DS,U,4)="0;1" S DICODE=DICODE_I_")) Q:"_I_"'>0  I $P(^("_I_",0),U)=Y"_$$CHKTMP(.DIC,DICR,DIFILEI,I) Q
 . S DICODE="" Q
 I DINDEX("#")=1,$D(DICR(DICR,"S")) S DICODE=DICODE_" S %Y"_DICR_"=Y,Y="_I_" X DICR("_DICR_",""S"") S Y=%Y"_DICR_" I "
 S DIC("S")=DICODE_" Q"
 ; If user passed list of indexes for lookup on pointed-to file, set-up.
 I DIPTRIX]"" S D=DIPTRIX D SETIX(.D,.DIC,.DID,.DF,.DICR,+$P($P(DS,U,2),"P",2))
 S:$G(D)="" D="B" S Y=0
 N DS,DINDEX,DIFILEI D X^DIC
L1 K DIC("S"),@("DIC"_DICR)
 I Y'>0 I $G(DTOUT)!($G(DIROUT)) G R
 I Y'>0,'$D(DICR(DICR,8)) D  G RETRY
 . I $G(DICR(DICR,31.2)) S DIC("S")="I Y-"_DICR(DICR,31.2)
 . Q:'$D(DICR(DICR,31))
 . S DIC("S")=$S($D(DIC("S")):DIC("S")_" ",1:"")_DICR(DICR,31) Q
 I DICR(DICR,2)["L",DICR(DICR,2)["E",@("$P("_DIC_"0),U,2)'[""O"""),$P(@(DICR(DICR,1)_"0)"),U,2)'["O",'DIVPSEL(DICR) D  G:%-1 L2
 . N I F I=(DICR-1):-1 Q:'$D(DIVPSEL(I))  S DIVPSEL(I)=1
 . S DST="         ...OK",%=1 D Y^DICN W:'$D(DDS) ! Q
R K DICS,DICW,DO,DIC("W"),DIC("S")
 S DIC=DICR(DICR,1),%=DICR(DICR,2),DIC(0)=$P(%,"M")_$P(%,"M",2)
 F X="DR","S","P","W" I $D(DICR(DICR,X)) M DIC(X)=DICR(DICR,X)
 I $D(DIC("P")),+DIC("P")=.12 S DIC(0)=DIC(0)_"X"
 D DO^DIC1 S X=+Y K:X'>0 X Q
 ;
L2 G NO:%-2 S DIC("S")="I Y-"_+Y_$S($D(DICR(DICR,31)):" "_DICR(DICR,31),1:""),X=DICR(DICR) W:'$D(DDS) "     "_X I $D(DDS),$G(DDH) D LIST^DDSU
 K DST ;
RETRY D DO^DIC1 K DICR(U,+DO(2))
 S D=$G(DICR(DICR,2.2)) S:D]"" DF=D S:D="" D="B"
 S DIC(0)=DICR(DICR,2.1) S:"^"[X X=DICR(DICR)
 I $D(DIFILEI) N DS,DINDEX,DIFILEI
 I $D(DICR(DICR,31)),$G(DA(1)),'$G(DA) M DS=DA N DA M DA=DS S DA=DA(1) K DS
 I $D(DICR(DICR,31.1)) S DID=DICR(DICR,31.1),DID(1)=2,DF=D
 D X^DIC K DICR(DICR,6)
 G R
 ;
BLDC(DIGBL,DIXNAM,DIXNO,DIFILEI,DIPGBL,DICODE,DICR) ; Build screening logic to loop through compound index, making sure pointed-to file is pointed-to by entry in index
 N %,I,C,X,Y,DISB S Y="Y"
 I $G(DIPGBL)]"" S Y="(+Y_"";"_$E(DIPGBL,2,99)_""")"
 S %=DIGBL_DIXNAM_","_Y
 S DICODE="N DICROUT,DIC"_DICR D
 . I $D(DICR(DICR,"S")) S DICODE=DICODE_",%Y"_DICR
 . S DICODE=DICODE_" X ""I 0"" I $D"_%_")) S DICROUT=0 X DICR("_DICR_",""SUB"",2)" Q
 F I=2:1:DIXNO S C="N DISB"_I_" S DISB"_I_"="""" " D
 . S C=C_"F  S DISB"_I_"=$O"_%_",DISB"_I_")) Q:DISB"_I_"=""""  X DICR("_DICR_",""SUB"","_(I+1)_") Q:DICROUT"
 . S DICR(DICR,"SUB",I)=C
 . S %=%_",DISB"_I Q
 S I="DIC"_DICR
 S X="S "_I_"=0 F  S "_I_"=$O"_%_","_I_")) Q:'"_I_"  I $D"_DIGBL_I_",0))"_$$CHKTMP(.DIC,DICR,DIFILEI,I)
 I $D(DICR(DICR,"S")) S X=X_" S %Y"_DICR_"=Y,Y="_I_" X DICR("_DICR_",""S"") S Y=%Y"_DICR_" I"
 S DICR(DICR,"SUB",DIXNO+1)=X_"  S DICROUT=1 Q"
 Q
 ;
CHKTMP(DIC,DICR,DIFILEI,DIVAR) ; If DIC(0)["T", add check to make sure entry hasn't already been presented once before.
 I DIC(0)'["T"!(DICR'=1) Q ""
 Q ",'$D(^TMP($J,""DICSEEN"","_DIFILEI_","_DIVAR_"))"
 ;
SETSCR(DICODE,DICR,DIC,D,DICALL,DID,DF,DIFILEI) ; Execute screening logic for screened pointers and var.ptrs.
 N DISAV0 S DISAV0=DIC(0) D  S DIC(0)=DISAV0
 . N DISAV0 X DICODE Q
 S:DIC(0)["B" D="B"
 I $D(DIC("S")) S DICR(DICR,31)=DIC("S")
 Q:$G(D)=""
 I $P(D,U,2)="",DICALL["IX^DIC",DIC(0)["M" D SETIX(.D,.DIC,.DID,.DF,.DICR,DIFILEI) Q
 I $P(D,U,2)]"",DICALL["MIX^DIC1" D SETIX(.D,.DIC,.DID,.DF,.DICR,DIFILEI) Q
 S DICR(DICR,2.2)=D
 Q
 ;
SETIX(D,DIC,DID,DF,DICR,DIFILEI) ; If user passes list of indexes to use on pointed-to file, set up to use them.
 I '$G(DICR) N DICR S DICR=0
 I DICR D
 . N % S %=DICR(DICR,2.1)
 . I %["L",(U_D_U)'["^B^" N D S D=I_"^B"
 . I $P(D,U,2)="" D
 . . I %["M" S DICR(DICR,2.1)=$TR(%,"M")
 . . K DICR(DICR,31.1) Q
 . I $P(D,U,2)]"" D
 . . I %'["M" S DICR(DICR,2.1)=%_"M"
 . . S DICR(DICR,31.1)=D_"^-1" Q
 . S DICR(DICR,2.2)=$P(D,U) Q
 I DIC(0)["L",(U_D_U)'["^B^" S D=D_"^B"
 I $P(D,U,2)="" D
 . I DIC(0)["M" S DIC(0)=$TR(DIC(0),"M")
 . S (D,DF)=$P(D,U) K DID Q
 I $P(D,U,2)]"" D
 . S DID=D_"^-1",DID(1)=2,(D,DF)=$P(D,U)
 . S:DIC(0)'["M" DIC(0)=DIC(0)_"M" Q
 Q
 ;
NO S Y=-1 G R
 ;
OKTOADD(DIFILEI,DINDEX,DIFINDER) ; Return 1 if index is OK for LAYGO.
 Q:$G(DINDEX(1,"TRANCODE"))]"" 0
 Q:$G(DIFINDER)="p" 1
 Q:DINDEX="B" 1
 Q:DINDEX("#")=1 0
 Q:$D(DICR("^",DIFILEI,.01,"B")) 0
 Q:DINDEX(1,"FILE")'=DIFILEI 0
 Q:DINDEX(1,"FIELD")'=.01 0
 Q 1
 ;

DICM1
DICM1 ;SFISC/XAK,TKW-LOOKUP WHEN INPUT MUST BE TRANSFORMED ; 20 Jun 2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G @Y
 ;
P ;POINTERS
 G P^DICM0
 ;
D ;DATES
 I $S(X'?.N:1,$L(X)>15:0,1:X>49) S %DT=$S($D(^DD(+DO(2),.001)):"N",1:"")_$P($P(DS,"%DT=""",2),"""") F %="E","R" D DZ
 I  D ^%DT S X=Y K %DT I X>1 D  Q
 . I $D(DINDEX(1,"TRANCODE"))#2 D  Q
 . . X DINDEX(1,"TRANCODE") I $G(X)="" K X S Y=-1 Q
 . . I ('$D(DINDEX(1,"TRANOUT"))#2)!(DIC(0)'["E")!($D(DDS)) Q
 . . N % S %=X N X S X=% X DINDEX(1,"TRANOUT") W "   ",X Q
 . Q:DIC(0)'["E"
 . I '$D(DDS) W "   " D DT^DIQ
 . S DIDA=1 Q
 K X Q
DZ S %DT=$P(%DT,%)_$P(%DT,%,2) Q
 ;
S ;SETS
 N A8,A9,DDH S DDH=0
 I $P(DS,U,2)["*"!($D(DIC("S"))) D SC
 S DICR(DICR,1)=1,I=$P(DS,U,3),DD=$P(";"_I,";"_X_":",2)
 N DS S DS=0
 I DD]"" S Y=X X:$D(A9) A9 I  D SDSP,SK Q
SS S DICMF=0
 F DICM=1:1 S DD=$P(I,";",DICM) Q:DD=""  I $P($P(DD,":",2),X)="" D
 . S Y=$P(DD,":"),DD=$P(DD,":",2) Q:DIC(0)["X"&(DD'=X)
 . I $D(A9) X A9 E  Q
 . I DIC(0)["O"!(DIC(0)'["E") S:DD=X DICMF=1 I DD'=X,DICMF=1 Q
 . S DS=DS+1 D SDSP
 . S DS(DS)=Y_"^     "_DDH_"   "_DDH(DDH,Y)
 G:DDH=0 NO
 I DDH=1 D  G SK
 . S X=$O(DDH(1,""))
 . W:DIC(0)["E"&('$D(DDS)) "  ("_DDH(1,X)_")"
 . S:$D(DS(1,"T")) X=DS(1,"T") Q
 G:DIC(0)'["E" NO
 I $D(DDS) S DD=DDH,DDD=2 K DDQ D LIST^DDSU K DDD,DDQ G:$D(DTOUT) NO
 I '$D(DDS) F  D  Q:DICM'="AGN"
 . F DICM=1:1:DDH W !,$P(DS(DICM),U,2,999)
 . W !,"CHOOSE 1-"_DDH_": "
 . R DIY:$S($D(DTIME):DTIME,1:300) E  Q
 . Q:U[DIY!(DIY[U)  I DIY?1.N,$D(DS(+DIY)) Q
 . W $C(7),"??" S DICM="AGN"
 G:+$P(DIY,"E")'=DIY NO G:'$D(DS(+DIY)) NO
 S X=$P(DS(DIY),U)
 I '$D(DDS) W "   "_DDH(DIY,X),!
 S:$D(DS(DIY,"T")) X=DS(DIY,"T")
 G SK
 ;
NO K X,Y S Y=-1
SK K DIC("S") S:$D(A8) DIC("S")=A8
 K DDH,DICM,DICMF,DICMS
 Q
SC ;SCREENS ON SETS
 S:$D(DIC("S")) A8=DIC("S") Q:$P(DS,U,2)'["*"
 Q:'$D(^DD(+DO(2),.01,12.1))  X ^(12.1) Q:'$D(DIC("S"))
 S Y="("_DIC,I="DIC"_DICR,%=""""_%_"""",A9="X DIC(""S"")"
 Q:$G(DICR(DICR))?1"""".E1""""
 ;I DS["DINUM=X" S D=D_" E  I $D"_Y_"Y,0))" Q
 S A9=A9_" E  F "_I_"=0:0 S "_I_"=$O"_Y
 I @("$O"_Y_%_",0))'=""""") S A9=A9_%_",Y,"_I_")) Q:"_I_"=""""  "_$S($D(A8):"X ""N Y S Y="_I_" ""_A8 I $T,",1:"I ")_"$D"_Y_I_",0)) Q" Q
 S A9=A9_I_")) Q:'"_I_"  "_$S($D(A8):"X ""N Y S Y="_I_" ""_A8 I $T,",1:"I ")_"$P(^("_I_",0),U)=Y Q" Q
 ;
SDSP ; Execute screen, transform, set up output for display
 N DISAVX,DISAVY,DIXX,DIOUT S DIOUT=0,DIXX=Y
 S DDH=DDH+1,DDH(DDH,Y)=$P("  (^",U,(DS=0))_Y
 I $D(DINDEX(1,"TRANCODE"))#2 D  S:'DIOUT&('DS) X=DIXX I DIOUT S Y=-1 Q
 . S DISAVY=Y N X,Y S X=DISAVY
 . X DINDEX(1,"TRANCODE") I $G(X)="" S DIOUT=1 Q
 . S DIXX=X I DS S DS(DS,"T")=X Q
 I $G(DINDEX(1,"TRANOUT"))]"" D
 . S DISAVY=Y N X,Y S X=DIXX X DINDEX(1,"TRANOUT")
 . S DDH(DDH,DISAVY)=$P("  (^",U,(DS=0))_$G(X) Q
 S DDH(DDH,Y)=DDH(DDH,Y)_"   "_$P(DD,";")_$P(")^",U,(DS=0))
 I DS=0,DIC(0)["E",'$D(DDS) W DDH(DDH,Y)
 Q
 ;
V ;VARIABLE POINTER
 I X["?BAD" K X Q
 D ^DICM2,DO^DIC1
 Q
 ;
T ; Execute TRANSFORM code for indexes other than Pointers, Date, VP or Sets.
 N DIXX S DIXX=X
 X DINDEX(1,"TRANCODE") I $G(X)="" K X S Y=-1 Q
 I DIXX=X K X S Y=-1
 Q
 ;
SOU ;
 S DSOU="01230129022455012623019202",DSOV=X,X=$C($A(X)-(X?1L.E*32)),DIX=$E(DSOU,$A(X)-64) F DIY=2:1 S Y=$E(DSOV,DIY) Q:","[Y  I Y?1A S %=$E(DSOU,$A(Y)-$S(Y?1U:64,1:96)) I %-DIX,%-9 S DIX=% I % S X=X_% Q:$L(X)=4
 S X=$E(X_"000",1,4) K DSOU,DSOV Q
 ;
ACT ;
 S DIY=Y,DIY(1)=DIC,DIC("W")="",DIX=X
A I $G(DO(2)) X:$D(^DD(+DO(2),0,"ACT")) ^("ACT")
 I Y<0 S DIC=DIY(1),X=DIX G W
 I $G(DO(2))["P" N % S %=^DD(+DO(2),.01,0) I $P(%,U,2)["P",$P(%,U,3)]"" S DIC=U_$P(%,U,3) D DO I $D(@(DIC_+$P(Y,U,2)_",0)")) S Y=+$P(Y,U,2)_U_$P(^(0),U) G A
 S Y=DIY,DIC=DIY(1),X=DIX
W K DIC("W")
DO K DO D DO^DIC1
 Q

DICM2
DICM2 ;SFISC/XAK/TKW-LOOKUP FOR VAR PTR ;2/15/00  14:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N A9,DIEX,DISAVIEX,DIV,DIVDIC,DIVDO,DIVP,DIVP1,DIVP2,DIVPDIC,DIVY,DIASKOK
 S DIVDO=+DO(2),DIVDIC=DIC,DIVY=%Y N DIADD,DS
 F %="DR","W","P","V","A" I $D(DIC(%)) M DIV(%)=DIC(%) K DIC(%)
 I $D(DIC("S")) S DICR(DICR,"S")=DIC("S") K DIC("S")
 K DO,DUOUT S (DIEX,DISAVIEX)=X
 I '$D(DICR(DICR,"V")) D
 . I DIC(0)'["L" S DICR(DICR,"V")=1 Q
 . S:DICR>1 DICR(DICR,"V")=1 Q
 G ALL:X'["."
 I $P(X,".",2,999)="" S Y=-1 G ALL
V S DIVP=$P(DIEX,"."),A9=1
 I DIVP="" G ALL
 I $D(^DD(DIVDO,DIVY,"V","P",DIVP)) S (DIVP,DIVPDIC)=+$O(^(DIVP,0)),DIVPDIC=$S($D(^DD(DIVDO,DIVY,"V",DIVP,0)):^(0),1:"") G Q:'DIVPDIC S X=$P(DIEX,".",2,999),A9=0 D ^DICM3 G Q
 S DIVP2="",DIVP=$P(DIEX,".")
 F %=0:0 S DIVP2=$O(^DD(DIVDO,DIVY,"V","M",DIVP2)) Q:DIVP2=""  I $P(DIVP2,DIVP)="" D  G Q:'DIVPDIC D ^DICM3 G Q:Y>0 S DIVP=$P(DIEX,".")
 . S (DIVP,DIVPDIC)=+$O(^DD(DIVDO,DIVY,"V","M",DIVP2,0))
 . S DIVPDIC=$S($D(^DD(DIVDO,DIVY,"V",DIVP,0)):^(0),1:"")
 . S X=$P(DIEX,".",2,999),A9=0 Q
 F DIVP=0:0 S DIVP=+$O(^DD(DIVDO,DIVY,"V",DIVP)) Q:'DIVP  I $D(^(DIVP,0)) S DIVPDIC=^(0) I $D(^DIC(+DIVPDIC,0)) S %=$P(^(0),U) I $P(%,$P(DIEX,"."))="" S X=$P(DIEX,".",2,999),A9=0 D ^DICM3 G Q:Y>0 S X=DIEX
 I A9,$P(DIEX,".")?.E1L.E S $P(DIEX,".")=$$OUT^DIALOGU($P(DIEX,"."),"UC") G V
 I A9 S X=DISAVIEX,A9=0 G ALL
 K X G Q
ALL F DIVP1=0:0 S DIVP1=+$O(^DD(DIVDO,DIVY,"V","O",DIVP1)) Q:'DIVP1  S DIVP=+$O(^(DIVP1,0)) I $D(^DD(DIVDO,DIVY,"V",DIVP,0)) S DIVPDIC=^(0) D ^DICM3 G Q:Y>0!(%<0)!$D(DUOUT) S X=DIEX
 G Q:DICR>1!$D(DICR(DICR,"V")) S DICR(DICR,"V")=1 K DIVP G ALL
 ;
 ;
Q I '$D(DUOUT),Y<0,DICR<2,'$D(DICR(DICR,"V")) S DICR(DICR,"V")=1 K DIVP G V
 K:Y<0 X S DICR(DICR,"V")=1
 F %="DR","W","P","V","A" I $D(DIV(%)) M DIC(%)=DIV(%)
 I $D(DICR(DICR,"S")) S DIC("S")=DICR(DICR,"S")
QQ K:Y DICR(DICR,6)
 K DUOUT,DIVP,DIVDIC,DIVY,DO,DIVDO,DIVPDIC,DIEX,DIVP1,DIVP2,DIV,A9 Q
 ;
NAME ;DETERMINE EXTERNAL FORM FROM INTERNAL FOR VP
 S DINAME=DIY Q:DIY'?1.N1";"1.E
 N % S %=$P(DIY,";",2),DINAME="^"_%_+DIY_",0)",DINAME=$S($D(@DINAME)#2:$P(^(0),U,1),1:DIY),%=$S($D(@("^"_%_"0)")):$P(^(0),U,2),1:"")
 Q:%=""
 I %["P"!(%["S")!(%["D")!(%["V") S DINAME=$$EXT^DIC2(+%,.01,DINAME)
 Q
 ;

DICM3
DICM3 ;SFISC/XAK,TKW-PROCESS INDIVIDUAL FILE FOR VAR PTR ;07:39 PM  8 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DIC ; Does recursive ^DIC call to single pointed-to file.
 Q:$D(DIVP(+DIVPDIC))
 I $D(DIV("V")) N % D  X % I '$T K Y S Y=-1 D DQ Q
 . S Y=DIVP,Y(0)=DIVPDIC
 . S %=$S($G(DIV("V"))]"":DIV("V"),1:$G(DIV("V",1))) Q
 I '$D(^DIC(+DIVPDIC,0,"GL")) S Y=-1 D DQ Q
 S (Y,DIC)=^("GL"),%="DIC"_DICR
 N:'$D(DIVPSEL) DIVPSEL S DIVPSEL(DICR)=0
 S D=$G(DICR(DICR,4)) S:D="" D="B"
 I DIC["""" S Y="" F A1=1:1:$L(DIC,",")-1 S A0=$P(DIC,",",A1) S:A0["""" A0=$P(A0,"""")_""""""_$P(A0,"""",2)_""""""_$P(A0,"""",3) S Y=Y_A0_","
 ;
 ; Build screen to select only pointed-to entries.
 K DIC("S") N DICODE S DICODE=""
 I DIC(0)'["L"!'$D(DICR(DICR,"V")) D
 . N DIX S DIX=""""_D_"""" D
 . . I $G(DINDEX("#"))>1 D BLDC^DICM0("("_DIVDIC,DIX,DINDEX("#"),DIFILEI,Y,.DICODE,.DICR) Q
 . . S DICODE="X ""I 0"" N "_%_$S($D(DICR(DICR,"S")):",%Y"_DICR,1:"")_" "
 . . S DICODE=DICODE_"F "_%_"=0:0 S "_%_"=$O("_DIVDIC_DIX_",(+Y_"";"_$E(Y,2,99)_"""),"_%_")) Q:"_%_"'>0  I $D("_DIVDIC_%_",0))"
 . . I DIC(0)["T",DICR=1 S DICODE=DICODE_$$CHKTMP^DICM0(.DIC,DICR,DIFILEI,%)
 . . I $D(DICR(DICR,"S")) S DICODE=DICODE_" S %Y"_DICR_"=Y,Y="_%_" X DICR("_DICR_",""S"") S Y=%Y"_DICR_" I "
 . . S DICODE=DICODE_" Q" Q
 . S:DICODE]"" DIC("S")=DICODE Q
 ;
 ; Set DIC(0)
 S %=DIC(0),DIC(0)="D"_$E("M",%'["B") D
 . N I F I="E","O","B","T","V" I %[I S DIC(0)=DIC(0)_I
 . Q
 I %["L",$D(DICR(DICR,"V")),$$OKTOADD^DICM0(DIVDO,.DINDEX,.DIFINDER) D
 . I $P(DIVPDIC,U,6)="y" S DIC(0)=DIC(0)_"L"
 . ; Execute screen code for screened pointer (should set DIC("S")).
 . K D Q:$P(DIVPDIC,U,5)'="y"
 . N DICODE S DICODE=$G(^DD(DIVDO,DIVY,"V",DIVP,1)) Q:DICODE=""
 . N DICSSAV S DICSSAV=$G(DIC("S"))
 . X DICODE
 . S DIC("S")=$G(DIC("S"))_$S(DICSSAV]"":" "_DICSSAV,1:"")
 . Q
 E  K D
 ; If user passed list of indexes to use on pointed-to file, setup.
 S %=$G(DIC("PTRIX",DIFILEI,DINDEX(1,"FIELD"),+DIVPDIC))
 I %]"" N DF,DID S D=% D SETIX^DICM0(.D,.DIC,.DID,.DF)
 S:$G(D)="" D="B" N DISAVED S DISAVED=D
 ;
 ; Write prompt
 I DIC(0)["E" D
 . I $G(DICODE)="" D H1^DIE3 W:'$D(DDS) ! Q
 . D H1 Q
 ;
 ; Set up rest of variables needed for DQ^DICQ or ^DIC call.
 D DO^DIC1
 N DS,DINDEX,DIFILEI
 S D=DISAVED K DISAVED
 ; Handle ? help
 I X?."?" D  D DQ Q
 . S DZ=X_$E("?",'$D(DICR(DICR,"V")))
 . D DQ^DICQ S X=$S($D(DZ):DZ,1:"?"),Y=-1 Q
 ; Do ^DIC call.
 D X^DIC I $D(DUOUT) D DQ Q
 ;
 ; Process output from ^DIC call.
 S X=+Y_";"_$E(DIC,2,99),%=1 K:Y<0 X
 I Y<0,DIC(0)["E",$D(DIVP1),$D(DICR(DICR,"V")) W !
 I '$D(DICR(DICR,"V"))!(DICR>1) K DICR("^",+DIVPDIC) S DIVP(+DIVPDIC)=0
 I Y>0,'DIVPSEL(DICR),DIC(0)["E",'$P(Y,U,3),$P(@(DIC_"0)"),U,2)'["O" D
 . N I F I=(DICR-1):-1 Q:'$D(DIVPSEL(I))  S DIVPSEL(I)=1
 . D S1^DIE3 I $G(%Y)?1"^^".E S (DIROUT,DUOUT)=1
 . Q
DQ I $D(DIC("PTRIX")) M DIV("PTRIX")=DIC("PTRIX")
 K A0,A1,DIC,DO S DIC=DIVDIC,D=$S($D(DICR(DICR,4)):DICR(DICR,4),1:"B")
 S DIC(0)=DICR(DICR,0)
 F %="V","PTRIX" I $D(DIV(%)) M DIC(%)=DIV(%)
 Q
 ;
H1 W:'$D(DDS) !
 N A1,DST,DIPAR S A1="T"
EGP S DIPAR(1)=$$FILENAME^DIALOGZ(+DIVPDIC),DIPAR(2)=$$LABEL^DIALOGZ(DIVDO,DIVY) ;**CCO/NI NAME OF FILE, AND VARIABLE-POINTER FIELD THAT POINTS TO IT
 S DST=$$EZBLD^DIALOG(8097,.DIPAR)
 D S^DIE3 W:'$D(DDS) ! Q
 ;
 ;8070 Searching for a |1|
 ;8097 Searching for a |1|, (pointed-to by |2|)
 ;

DICN
DICN ;SFISC/GFT,XAK,TKW,SEA/TOAD-ADD NEW ENTRY ;16NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DIENTRY,DIFILE,DIAC D:'$D(DO(2)) GETFA^DIC1(.DIC,.DO) S DO(1)=1
 I '$D(DINDEX) N DINDEX S DINDEX("#")=1,DINDEX("START")="B"
 N DISUBVAL,V
 I DINDEX("#")>1 M V=X N X D  I X="",DIC(0)'["E"!('$D(DISUBVAL)) D BAD^DIC1 Q
 . D VALIX(+DO(2),.DINDEX,.V,.DISUBVAL,.X,.DS) K V Q
 I $S($D(DLAYGO):DO(2)\1-(DLAYGO\1),1:1) S %=1 D B1 I '% D BAD^DIC1 Q
USR D DS S DIX=X
 I X'?16.N,X?.NP,X,DIC(0)["E",'$G(DICR),DS'["DINUM",$P(DS,U,2)'["N",DIC(0)["N"!$D(^DD(+DO(2),.001,0)) D N^DICN1 I $D(X) S DIENTRY=X G I
 S X=DIX D:DINDEX("#")'>1 VAL G I:$D(X)
 S X=DIX
B D BAD^DIC1 S Y=-1 Q
 ;
B1 Q:'DO(2)  Q:$D(^DD(+DO(2),0,"UP"))!(DO(2)=".12P")
 S DIFILE=+DO(2),DIAC="LAYGO" D ^DIAC K DIAC,DIFILE
 Q
 ;
1 I '$D(DIC("S")) D  ;**CCO/NI 'ARE YOU ADDING'? THRU NEXT 4 LINES
 .N M
 .S M=$$EZBLD^DIALOG(8058,$$OUT^DIALOGU(Y,"ORD"))
 .S:$D(^DD(+DO(2),0,"UP")) M=M_$$EZBLD^DIALOG(8059,$$FILENAME^DIALOGZ(^("UP"))) S M=M_")"
 .I $L(M)+$L(DST)'>$S($G(IOM):IOM,1:80) S DST=DST_M
Y I $D(DDS) S A1="Q",DST=%_U_DST D H^DDSU Q
 W !,DST K DST
YN ;
 N %1 S %1=$$EZBLD^DIALOG(7001) S:'$D(%) %=0 W "? " W:(%>0) $P(%1,U,%),"// "
RX R %Y:$S($D(DTIME):DTIME,1:300) E  S DTOUT=1,%Y=U W $C(7)
 I %Y]""!'% S %=+$$PRS^DIALOGU(7001,%Y) S:(%<0&($A(%Y)'=94)) %=0
 I '%,%Y'?."?" W $C(7),"??",!?4,$$EZBLD^DIALOG(8040),": " G RX
 W:$X>73 ! W:% $S(%>0:"  ("_$P(%1,U,%)_")",1:"") Q
 ;
DS S DS=^DD(+DO(2),.01,0) Q
 ;
VAL I X'?.ANP K X Q
 I X[""""!(X["^") K X Q
 I $P(DS,U,2)'["N",$A(X)=45 K X Q
 I $P(DS,U,2)["*" S:DS["DINUM" DINUM=X Q
 N %T,%DT,C,DIG,DIH,DIU,DIV,DICR ;PRESERVE VARIABLES WHILE WE XECUTE INPUT TRANSFORM ON THE .01 FIELD
 S %=$F(DS,"%DT=""E"),DS=$E(DS,1,%-2)_$E(DS,%,999) N DICTST S DICTST=DS["+X=X"&(X?16.N) K:DICTST X X:'DICTST $P(DS,U,5,99)
UNIQ I $P(DS,U,2)["U",$D(X),$D(@(DIC_"""B"",X)")) K X
 Q
 ;
I1 S DST=$C(7)_$$EZBLD^DIALOG(8060)
 I '$D(DIENTRY),Y]"" S DST=DST_$$EZBLD^DIALOG(8061,Y)
 S %=$$FILENAME^DIALOGZ(+DO(2)) I $L(DST)+$L(%)'>55 S DST=DST_$$EZBLD^DIALOG(8062,%) Q  ;**CCO/NI FILE NAME
 W:'$D(DDS) !,DST K A1 D:$D(DDS) H^DIC2 S DST="    "_$$EZBLD^DIALOG(8062,%) Q
 ;
I I DIC(0)["E",DO(2)'["A",DIC(0)'["W" K DTOUT,DUOUT D  G OUT^DICN0:$G(DTOUT)!($G(DUOUT)) I %'=1 S Y=-1 D BAD^DIC1 Q
 . S (Y,DIX)=X I Y]"" N C S C=$P(^DD(+DO(2),.01,0),U,2) D Y^DIQ
 . D I1 S %=2,Y=$P(DO,U,4)+1,X=DIX D 1
I2 . Q:%>0!($G(DTOUT))  I %=-1 S DUOUT=1 Q
 . W:'$D(DDS) $C(7)_"??",!?4,$$EZBLD^DIALOG(8040) D YN G I2
 G NEW:'$D(DIENTRY)
R D DS S DST="   "_$P(DS,U,1)_": "
 I '$D(DDS) W !,DST K DST R X:DTIME S:$E(X)=U DUOUT=1,Y=-1 S:'$T X=U,DTOUT=1,Y=-1
 I $D(DDS) S A1="Q",DST="3^"_DST D H^DDSU S X=% I $D(DTOUT) S X=U,Y=-1
 I X[U D BAD^DIC1 Q
 I X="" G R
 D VAL
HELP I '$D(X) D  G R ;**CCO/NI  PLUS NEXT 2 LINES HELP MESSAGE FOR .01 FIELD, WHEN TELLING USER HOW TO LAYGO A NEW ONE
 .W $C(7) W:'$D(DDS) "??" S DST=$$HELP^DIALOGZ(+DO(2),.01) Q:DST=""
 .S DST="    "_DST W:'$D(DDS) !,DST D:$D(DDS) H^DDSU
 ;
NEW ; try to add a new record to the file
 G NEW^DICN0
 ;
FILE ; DOCUMENTED ENTRY POINT: add a new record to a file
 ;
 N DIENTRY,DS,DIAC,DIFILE D NEW^DICN0,Q^DIC2 Q
 ;
FIRE ; fire the SET logic of a bulletin or trigger xref (in DZ)
 ; STORLIST^%RCR (called by NEW^DICN0)
 ;
 X DZ
 Q
 ;
VALIX(DIFILEI,DINDEX,V,DISUBVAL,X,DS) ;
 ; Save lookup values in array by field no. so we can update the fields on the new record.
 N VI,DISUB,DIERR,DIFILE,DIFIELD,DO,DIOK
 S X="" I $G(V)]"",$G(V(1))="" S V(1)=V
 F DISUB=1:1:DINDEX("#") I $G(V(DISUB))]"" D
 . S DIFILE=$G(DINDEX(DISUB,"FILE")),DIFIELD=$G(DINDEX(DISUB,"FIELD"))
 . S DIOK=0 I 'DIFILE!('DIFIELD) Q
 . S V=V(DISUB)
 . I DISUB=1 D  I DIOK S:DIOK'=2 DISUBVAL(DIFILE,DIFIELD)=V Q
 . . I $A(V)=34,V?.E1"""" S V=$E(V,2,($L(V))-1)
 . . I $G(DS("INT"))="",'$G(DICRS) S:"VP"[$G(DINDEX(1,"TYPE")) DIOK=2 Q
 . . S DIOK=1
 . . I DIFILE=DIFILEI,DIFIELD=.01 S X=$S($G(DICRS):V,1:DS("INT")) Q
 . . S DISUBVAL(DIFILE,DIFIELD,"INT")=$S($G(DICRS):V,1:DS("INT"))
 . . Q
 . S DISUBVAL(DIFILE,DIFIELD)=V
 . D CHK^DIE(DIFILE,DIFIELD,"",V,.VI,"DIERR") Q:VI="^"
 . I DIFILE=DIFILEI,DIFIELD=.01 S X=VI K DISUBVAL(DIFILE,.01) Q
 . S DISUBVAL(DIFILE,DIFIELD,"INT")=VI
 . Q
 Q
 ;
 ;#7001   Yes/No question
 ;#8040   Answer with 'Yes' or 'No'
 ;#8058   (the |entry number|
 ;#8059   for this |filename|
 ;#8060   Are you adding
 ;#8061   '|.01 field value|' as
 ;#8062   a new |filename|

DICN0
DICN0 ;SFISC/GFT,XAK,SEA/TOAD/TKW-ADD NEW ENTRY ;22MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
NEW ; try to add a new record to the file
 ; called from FILE, ^DICN
 ;
 N %,I,DDH,DI,DIE,DIK,DQ,DR,%H,%T,%DT,C,DIG,DIH,DIU,DIV,DISYS
 K % M %=X N X M X=% S %=+$G(D0) N D0 S:% D0=% K %
 I '$G(DIFILEI)!($G(DINDEX("#"))="") N DINDEX,DIFILEI,DIENS D
 . S DINDEX("#")=1,(DINDEX,DINDEX("START"))="B"
 . D GETFILE^DIC0(.DIC,.DIFILEI,.DIENS) Q
 G:DIFILEI="" OUT
 I '$D(@(DIC_"0)")),'$D(DIC("P")),$E(DIC,1,6)'="^DOPT(" S DIC("P")=$$GETP^DIC0(DIFILEI)
 D:'$D(DO(2)) GETFA^DIC1(.DIC,.DO) I DO="0^-1" G OUT
 S X=$G(X) I X="",DINDEX("#")>1 S X=$G(X(1))
 I X="",(DIC(0)'["E"!(DINDEX("#")'>1)) G OUT
 N DINO01 S DINO01=$S(X="":1,1:0) N DIX,DIY
 ;
N1 ; if LAYGO nodes are present, XECUTE them and verify they don't object
 ;
 S Y=1 F DIX=0:0 D  Q:DIX'>0  Q:'Y
 . S DIX=$O(^DD(+DO(2),.01,"LAYGO",DIX)) Q:DIX'>0
 . I $D(^DD(+DO(2),.01,"LAYGO",DIX,0)) X ^(0) S Y=$T
 I 'Y G OUT
 ;
 ; if the file is in the middle of archiving, keep out
 ;
 I $P($G(^DD($$FNO^DILIBF(+DO(2)),0,"DI")),U,2)["Y" D  I Y G OUT
 . S Y='$D(DIOVRD)&'$G(DIFROM)
 ;
N2 ; process DINUM
 ;
 S DIX=X
 I $D(DINUM) D
 . S X=DINUM D  I '$D(X) S Y=0,X=DIX Q
 . . N DIX D N^DICN1 Q
 . D LOCK(DIC,X,.Y)
 ;
 ; or process DIENTRY (numeric input that might be IEN LAYGO)
 ;
 E  I $D(DIENTRY) D
 . S X=DIENTRY D  I 'Y S X=DIX Q
 . . N DIX D ASKP001^DICN1 Q
 . D LOCK(DIC,X,.Y)
 ;
 ; or get a record number the usual way
 ;
 E  S X=$P(DO,U,3) D INCR N DIFAUD S %=+$P(DO,U,2),DIFAUD=$S($D(^DIA(%,"B")):%,1:0) F  D  Q:Y'="TRY NEXT"
 . F  S X=X\DIY*DIY+DIY Q:'$D(@(DIC_"X)"))&$S('DIFAUD:1,1:+$O(^DIA(DIFAUD,"B",X_","))-X&'$D(^(X)))
 . I $G(DUZ(0))="@"!$P(DO,U,2) N DIX D ASKP001^DICN1 Q:'Y
 . D LOCK(DIC,X,.Y) Q:Y  S Y="TRY NEXT"
 ;
 I 'Y S Y=-1 D BAD^DIC1 Q
 ;
N3 ; add the new record at the IEN selected
 ;
 S @(DIC_"X,0)")=DIX
 L @("-"_DIC_"X)")
 ;
 ; update the file header node
 ;
 K D S:$D(DA)#2 D=DA S DA=X,X=DIX
 I $D(@(DIC_"0)")) S ^(0)=$P(^(0),U,1,2)_U_DA_U_($P(^(0),U,4)+1)
N4 ; if compound index and we don't know internal value of .01, we'll prompt for it in ^DIE.
 I DINO01 D  G:Y>0 D Q
 . D ^DICN1 I Y'>0 S:$G(DO(1)) DS(0)="1^" S (X,DIX)="" Q
 . S (X,DIX)=$P($G(@(DIC_DA_",0)")),U)
 . Q
N5 ; If .01 is marked for auditing, update audit file
 D
 . I DO(2)'["a" Q:$P(^DD(+DO(2),.01,0),U,2)'["a"  Q:^("AUDIT")["e"
 . D AUD^DIET
 ;
 ; index the .01 field of the new entry
 ;
 N DD S DD=0 D
 . N DIFILEI,DINDEX,DIVAL,DIENS,DISUBVAL
 . F  S DD=$O(^DD(+DO(2),.01,1,DD)) Q:'DD  D
 . . K % M %=X N X M X=% K %
 . . I ^DD(+DO(2),.01,1,DD,0)["TRIGGER"!(^(0)["BULL") D  Q
 . . . N %RCR,DZ S %RCR="FIRE^DICN",DZ=^DD(+DO(2),.01,1,DD,1)
 . . . F %="D0","Y","DIC","DIU","DIV","DO","D","DD","DICR","X" S %RCR(%)=""
 . . . D STORLIST^%RCR Q
 . . M %=DIC N DIC M DIC=% K % M %=DA N DA M DA=% K % S %=DD N DD,D
 . . X ^DD(+DO(2),.01,1,%,1) Q
 . Q
 I $O(^DD("IX","F",+DO(2),.01,0)) D
 . K % M %=X N X M X=% K % M %=DIC N DIC M DIC=%
 . K % M %=DA N DA M DA=% K % M %=DO N DO M DO=% K % N DD,D
 . D INDEX^DIKC(+DO(2),DA_DIENS,.01,"","SC") Q
 ;
N6 ; if we have lookup values to stuff, or DIC("DR"), or if the file has
 ; IDs or KEYS, go do DIE.
 ; Code will return at D if successful. We set output and go exit
 ;
 S Y=DA D
 . I $D(DIC("DR"))!($O(DISUBVAL(+DO(2),0)))!($O(^DD("KEY","B",+DO(2),0))) D ^DICN1 Q
 . Q:DIC(0)'["E"
 . I '$O(^DD(+DO(2),0,"ID",0)) Q
 . D ^DICN1 Q
 I Y'>0 S:$G(DO(1)) DS(0)="1^" Q
 ;
 ; Finish adding the new record.
D S Y=DA_U_X_"^1" I $D(D)#2 S DA=D
 D R^DIC2 Q
 ;
INCR S DIY=1 I $P(DO,U,2)>1 F %=1:1:$L($P(X,".",2)) S DIY=DIY/10
 Q
 ;
 ;
OUT I DIC(0)["Q" W $C(7)_$S('$D(DDS):" ??",1:"")
 S Y=-1 I $D(DO(1)),'$D(DTOUT) D A^DIC S DS(0)="1^" Q
 D Q^DIC2 Q
 ;
LOCK(DIROOT,DIEN,DIRESULT) ;
 ;
 ; try to lock the record, and see if it's already there
 ; NEW
 ;
 D LOCK^DILF(DIROOT_"DIEN)") ;L @("+"_DIROOT_"DIEN):1") ;**147
 S DIRESULT='$D(@(DIROOT_"DIEN)"))&$T
 I 'DIRESULT L @("-"_DIROOT_"DIEN)")
 Q
 ;

DICN1
DICN1 ;SFISC/GFT,TKW,SEA/TOAD-PROCESS DIC("DR") ;8MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K DIDA,DICRS,Y,%RCR
 F Y="DIADD","I","J","X","DO","DC","DA","DE","DG","DIE","DR","DIC","D","D0","D1","D2","D3","D4","D5","D6","DI","DH","DIA","DICR","DK","DIK","DL","DLAYGO","DM","DP","DQ","DU","DW","DIEL","DOV","DIOV","DIEC","DB","DV","DIFLD" S %RCR(Y)=""
 S DZ="W !?3,$S("""_$P(DO,U)_"""'=$P(DQ(DQ),U):"""_$P(DO,U)_""",1:"""")_"" ""_$P(DQ(DQ),U)_"": """
 S Y=DA N % S %=0 D  I '$D(%) D W,BAD Q
 . S DD="" N I,J,X,Y
 . I DINO01 D
 . . S DD=".01//"
 . . S I=$G(DISUBVAL(+DO(2),.01)) I I="" S DD=DD_";" Q
 . . S DD=DD_$S(DIC(0)'["E":"/",1:"")_"^S X=DISUBVAL("_+DO(2)_",.01);" Q
 . K DISUBVAL(+DO(2),.01)
 . F I=0:0 S I=$O(DISUBVAL(+DO(2),I)) Q:'I  D
 . . S DD=DD_I_"//"
 . . I $G(DISUBVAL(+DO(2),I,"INT"))]"" S DD=DD_"//^S X=DISUBVAL("_+DO(2)_","_I_",""INT"");" Q
 . . S:DIC(0)'["E" DD=DD_"/"
 . . S DD=DD_"^S X=DISUBVAL("_+DO(2)_","_I_");" Q
 . S DD=DD_$G(DIC("DR")) I DD]"",$E(DD,$L(DD))'=";" S DD=DD_";"
 . Q:DIC(0)'["E"
 . F I=0:0 S I=$O(^DD("KEY","B",+DO(2),I)) Q:'I!('$D(%))  F J=0:0 S J=$O(^DD("KEY",I,2,J)) Q:'J!('$D(%))  D
 . . S X=$G(^DD("KEY",I,2,J,0)) Q:$P(X,U,2)'=+DO(2)
 . . S Y=$P(X,U) Q:'Y  D CKID
 . . Q
 . Q:$D(DIC("DR"))!('$D(%))
 . S Y=0 F  S Y=$O(^DD(+DO(2),0,"ID",Y)) Q:'Y  D CKID Q:'$D(%)
 . Q
 I DD]"",$O(^DD("KEY","B",+DO(2),0)) D
 . N I S I=$S(DIC(0)["E":"M",1:"")
 . S DD=DD_"S DIEFIRE="""_I_"""" Q
 S %RCR="RCR^DICN1" D STORLIST^%RCR
 I $D(Y)<9 S Y=DA Q
 ;
BAD S:$D(D)#2 DA=D K Y I '$D(DO(1)) S Y=-1 D Q^DIC2 Q
 K DO D A^DIC S DS(0)="1^",Y=-1 Q
 ;
CKID I $G(DUZ(0))'="@",$G(^DD(+DO(2),Y,9))]"" D  Q:'$D(%)  Q:$L(^DD(+DO(2),Y,9))<%
 . F %=1:1 I DUZ(0)[$E(^DD(+DO(2),Y,9),%) Q:$L(^(9))'<%  K:$P(^(0),U,2)["R" % Q
 Q:Y=.01
 I $P(DD,"//")=Y!(DD[(";"_Y_"//"))!(DD[(";"_Y_";")) Q
 S DD=DD_Y_";"
Q Q
 ;
W S A1="T",DST="SORRY!  A VALUE FOR '"_$P(^(0),U,1)_"' MUST BE ENTERED," W:'$D(DDS) ! D H
 S A1="T",DST="BUT YOU DON'T HAVE 'WRITE ACCESS' FOR THIS FIELD" W:'$D(DDS) !,?6 D H D:$D(DDS) LIST^DDSU
 S %RCR="D^DICN1" D STORLIST^%RCR Q
 ;
H I $D(DDS) S DDH=$S($D(DDH):DDH+1,1:1),DDH(DDH,A1)=DST K A1,DST Q
 W:'$D(ZTQUEUED) DST K A1,DST Q
RCR ;
 K DR,DIADD,DQ,DG,DE,DO N DISAV0 S DIE=DIC,DR=DD,DIE("W")=DZ,DISAV0=DIC(0) K DIC
 I $D(DIE("NO^")) S %RCR("DIE(""NO^"")")=DIE("NO^")
 S DIE("NO^")="BACKOUTOK" N X
 D:$D(DDS) CLRMSG^DDS D:DR]""  K DIE("W"),DIE("NO^")
 . N DISAV0,DIFILEI,DINDEX,DIVAL,DIENS,DIOPER
 . S DIOPER="A" K % M %=DISUBVAL N DISUBVAL M DISUBVAL=% K %
 . D ^DIE Q
 D:$D(DDS)
 . I $Y<IOSL D CLRMSG^DDS Q
 . D REFRESH^DDSUTL
A I '$D(DA) S Y(0)=0 Q
 I '$$IHSGL($G(DIFILEI)) S:'$$INTEG^DIKK(DIE,DA_DIENS,"","","d") Y(0)=0,X="BADKEY" ;IHS
 Q:$D(Y)<9&'$D(DTOUT)&'$D(DIC("W"))&($G(X)'="BADKEY")
 I $G(X)="BADKEY",DISAV0["E" W !,"      ",$$EZBLD^DIALOG(741)
 S:'$G(DTOUT)&($D(Y)'<9) DUOUT=1
ZAP S DIK=DIE
 I DISAV0["E" S A1="T",DST=$C(7)_"   <'"_$P(@(DIK_"DA,0)"),U,1)_"' DELETED>" W:'$D(DDS)&'$D(ZTQUEUED) !?3 D H D:$D(DDS)&'$D(ZTQUEUED) LIST^DDSU
 D ^DIK S Y(0)=0 K DST Q
 ;
D N DISAV0 S DISAV0=DIC(0),DIE=DIC D ZAP Q
 ;
ASKP001 ; ask user to confirm new record's .001 field value
 ; NEW^DICN
 ;
 ; quit if there's no .001 or we can't ask
 ;
 I DIC(0)'["E" S Y=1 Q
 S Y=$P(DO,U,2)
 I '$D(^DD(+Y,.001,0)) S Y=1 Q
 ;
 ; if this is not a LAYGO lookup in which X looks like an IEN, and we're
 ; adding a new file, and we haven't tried this before, then offer a new
 ; .001 based on the user's or site's file range, whichever's handy.
 ; NEW^DICN will increment this .001 forward to find the first gap, then
 ; drop back through here to the paragraph below (because DO(3) will be
 ; defined next time) to offer it to the user
 ;
 I '$D(DIENTRY),DIC="^DIC(",'$D(DO(3)) D  S Y="TRY NEXT" Q
 . S DO(3)=1
 . I $S($D(^VA(200,DUZ,1))#2:1,1:$D(^DIC(3,DUZ,1))#2),$P(^(1),U) D  Q
 . . S DIY=.1,X=+$P(^(1),U) ; NAKED
 . I $D(^DD("SITE",1)),X\1000'=^(1) S X=^(1)*1000,%=0
 ;
 ; set up our prompt, if .001 looks valid use it as a default, otherwise
 ; count forward until we find a valid one to offer
 ;
 S DST="   "_$P(DO,U)_" "_$P(^DD(+Y,.001,0),U)_": "
 S %=$P(^DD(+Y,.001,0),U,2),X=$S(%'["N"!(%["O"):0,1:X),%Y=X
 I X F %=1:1 D N Q:$D(X)  S X=0 Q:%>999  S X=%Y+DIY,%Y=X
 I X S DST=DST_X_"// "
 ;
 ; prompt user for .001
 ;
 I '$D(DDS) D
 . W !,DST K DST R Y:$S($D(DTIME):DTIME,1:300) E  S DTOUT=1,Y=U W $C(7)
 E  D
 . S A1="Q",DST=3_U_DST N DIY D H,LIST^DDSU S Y=$S($D(DTOUT):U,1:%) K %
 ;
 ; sort through possible responses
 ;
 I Y[U S Y=U Q
 I Y="" S Y=1 Q
 I Y'="?" D  Q:Y
 . S X=Y D N S Y=$D(X)#2 D:Y  Q:Y
 . . I $D(@(DIC_X_")")) K X S Y=0
 . . Q
 . W $C(7)
 . W:'$D(DDS) "??"
 ;
 ; for bad response or help request, offer help and try new IEN
 ;
EGP S DST=$$HELP^DIALOGZ(+DO(2),.001) I $D(^DD(+DO(2),.001,0)),DST]"" S DST="     "_DST ;**CCO/NI HELP MESSAGE FOR .001 FIELD WHEN USER IS LAYGO-ING (NOTE NAKED REFERENCES IN FOLLOWING LINES)
 I '$D(DDS) D
 . W:DST]"" !?5,DST X:$D(^(4)) ^(4) K DST ; NAKED
 E  D
 . S A1=0 N DIY D H S:$D(^(4)) DDH("ID")=^(4) D LIST^DDSU ; NAKED
 S X=$P(DO,U,3) D INCR^DICN0
 S Y="TRY NEXT"
 Q
 ;
IHSGL(X) ;----- CHECK GL NODE OF TOP LEVEL FILE FOR DUZ(2)
 ;USED TO ALLOW USE OF "SOFT" GLOBAL REFERENCES, I.E., DUZ(2)
 ;
 ;      RETURNS:
 ;      0 IF THE TOP LEVEL FILE "GL" NODE DOES NOT CONTAIN DUZ(2)
 ;      1 IF IT DOES
 ;
 ;      INPUT:
 ;      X  =  FILE NUMBER
 ;
 N DITOP,Y
 S Y=0
 I X D
 . S DITOP=X
 . F  Q:'$D(^DD(DITOP,0,"UP"))  S DITOP=^("UP")
 . S Y=$G(^DIC(DITOP,0,"GL"))["DUZ(2)"
 Q Y
 ;
N ; test X as an IEN (apply input transform and numeric restrictions)
 ; USR^DICN, ASKP001
 ;
 I $D(^DD(+$P(DO,U,2),.001,0)),'$D(DINUM) X $P(^(0),U,5,99)
 I $D(X),$L(X)<15,+X=X,X>0,X>1!(DIC'="^DIC(") Q
 K X
 Q
 ;
 ; 741   Either key values are null, or creates a duplicate key.
 ;

DICOMP
DICOMP ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;16JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S DICOMP=$G(DICOMP) N DLV,K S K=0 F DLV=0:1 G A:'$D(J(DLV+1))
EN1 ;
 S K=0 F  S DLV=K,K=$O(I(K)) G A:K="",A:$D(J(K))[0!($D(I(K\100*100))[0)
EN ;
 S DLV=+DICOMP
A N DICO,DPUNC,DLV0,DIM,DIMW,DG,DBOOL,DICV,V,T,DICN,DICF,DIC,DATE,DPS,M,W,DICOMPQI,D,%,%Y,DS,DZ,%DT ;Don't NEW the variable A!
 I DICOMP'["?",'$D(DIQUIET) N DIQUIET S DIQUIET=1
K K K S K=0 I DLV F I=0:100 Q:I>DLV  S K=K+1,K(K)="",K(K,1)=I
 I '$D(DQI) N DQI S DQI="Y(",DICOMPQI=1
 S I=DLV F  S I=$O(J(I)),DICO(1)=DLV Q:I=""  K:DLV I(I),J(I)
 S DPUNC=",'+-():[]!&\/*_=<>",DLV0=DLV\100*100,I=X,DIMW="" K X
 S DIC(0)="ZFO",(M,DPS)=0,DICO=I,DICO(1)=DLV,DICO(0)=DLV\100*100 F %=0:100 Q:'$D(J(%))  S DG(%)=%
TOOEASY G 0:" "[I!(+I=I)!(I'?.ANP)!(I?."?")!($E(I,$L(I))=":")
G D I I X?.NP G:X="" N:I]"",^DICOMP1 I +X=X,X<1700!'$D(DATE(K-1))!'$G(DBOOL) G N:W'=":",N:$D(DPS($$NEST,"$S"))
 G E:$L(X)>30,FUNC:W="(",N:X?1"$"1U
V I $D(DICOMPX(X))#2 D DATE^DICOMP0:$D(DICOMPX(X,"DATE")) S T=X,X=DICOMPX(X) G N:'$D(DICOMPX(T,U)) S T=DICOMPX(T,U),DICN=$P(T,U,2),T=+T,Y(0)=^DD(T,DICN,0),D=$P(Y(0),U,2) D S^DICOMP0 G N
E K Y D ^DICOMP0 G N:+X=X,N:$D(Y),0:$D(DICO("BACK"))-10 S X=DICO,DLV=DICO(1),DICO("BACK")=1 S:$G(DICOMPX)]"" DICOMPX="" G K
N ;
 I X]"" S K=K+1,K(K)=X
 S I=$E(I,M,999),M=0 G G:$F(DPUNC,W)<2
 I W=":",'$D(DPS($$NEST,"$S")) S I=$E(I,2,999) D I,M^DICOMPX,M^DICOMPW:$D(X) S W="" G N:$D(X),0
 S X=W,W="",M=2 G N:X=""
 G DPS:X=")",C:",:"[X,0:"+-'"[X&'$L($E(I,M,999)) I X="(" D ST G N
 S DBOOL="><]['=!&"[X,Y="[]!&/\_><*="
NOT I X="'" S %=$E(I,2) I "_"""[% G 0
 G N:Y'[X
BINOP I ")"'[$E(I_W,M),$G(K(K))]"" I '$D(K(K,2)),'$F($TR(DPUNC,")'"),K(K)),$F(Y,W)<2 D:X="_"  G N:K(K)'="'" S K(K)="'"_X,X="" G N:DBOOL
CONCAT .I $D(DATE(K)) K DATE(K) S X=" S Y=X X ^DD(""DD"") S X=Y_"
0 G 0^DICOMP1
 ;
I ;parse off the next element
 I $A(I,M+1)=34 S M=$F(I,"""",M+2)-1 G I:M>0 S W=0,M=999,X=U Q
MR F M=M+1:1 S W=$E(I,M) Q:DPUNC[W
 S X=$E(I,1,M-1) Q
 ;
C I $D(DPS($$NEST,"SETDATA")) G 0
 S DICF=X D DG S K(K+1,2)=0
 I $O(DPS($$NEST,"$"))["$" S DPS($$NEST)=DPS($$NEST)_Y_DICF G N
 G 0:'$D(W($$NEST)) S (W,W($$NEST))=W($$NEST)-1 K:W<2 W($$NEST) S DPS($$NEST)=" S X"_W_"="_Y_DPS($$NEST) G N
 ;
DPS G 0:'DPS I $D(DPS(DPS,"ST")) D DPS^DICOMPW S:X]"" K=K+1,K(K)=X G DPS
 I $D(DPS(DPS,"BETWEEN")) S DPS(DPS,"BOOL")=1
DUP I $D(DPS(DPS,"DUPLICATED")) D  G 0:'DPS
 .I $G(Y(0))'[U S DPS=0 Q
 .S Y=$O(^DD(J(DLV),"B",$P(Y(0),U),0)) I 'Y S DPS=0 Q
 .F T=0:0 S T=$O(^DD(J(DLV),Y,1,T)) Q:'T  I +$G(^(T,0))=J(DLV0),$P(^(0),U,3,99)="" S Y=$P(^(0),U,2) I Y?1U.AN Q  ;find a regular cross_refs
 .I 'T F T=0:0 S T=$O(^DD("IX","F",J(DLV),Y,T)) Q:'T  I $P($G(^DD("IX",T,0)),U,4)="R",$P(^(0),U,6)="F",$P(^(0),U,9)=J(0) S Y=$P(^(0),U,2) Q  ;or find a regular INDEX
 .I 'T S DPS=0 Q
 .D DIMP^DICOMPZ("N Z S Z=X,X="""" I $L(Z) S Z=$O("_I(DLV0)_""""_Y_""",Z,0)) I Z,Z-D0!$O(^(D0)) S X=1") S DPS(DPS)=X_" S X=X",DPS(DPS,"BOOL")=1
 D DPS^DICOMPW G N:'$D(W(DPS+1)),0
 ;
FUNC S Y=+$O(^DD("FUNC","B",X,0)) I '$D(^DD("FUNC",Y,0)),X'?1N.N2A,X'?1"$"1U G V
 I Y=90!(Y=91)!(Y=92) D PRIOR^DICOMPZ G N:$D(Y),0
 S DICF=X,DBOOL=$G(DBOOL,0) D ST I $G(^DD("FUNC",Y,0))="DUPLICATED" S DPS(1,"INTERNAL")="" D 1 K Y G B
 I "Q"'[$G(^DD("FUNC",Y,1)) D 1 G B
 I DICF'?1"$"1U.U D ^DICOMPY S W="" G DPS:DPS,0
 S DPS(DPS,DICF)=DPS(DPS),DPS(DPS)=" S X="_DICF_W
B S M=M+1,W="" G 0:$E(I,M)=")",N
 ;
2 ;
 D ST
1 S DPS(DPS,DICF)="",DPS(DPS)=" "_$G(^(1))_DPS(DPS)_" S X=X" I $D(^(2)) S %=$P(^(2),U) I %]"" S DPS(DPS,%)=""
 I DPS=1,$G(^(10))]"" S DPS(^(10))=""
 S %=$G(^(3),0) D:%'?.N
 .S %=1 F %Y=M+1:1 S Y=$E(I,%Y) Q:")"[Y  S:Y="," %=%+1
 .S DPS(DPS)=" K X"_%_DPS(DPS)
 S:%>1 W(DPS)=% Q
 ;
ST ;stack
 N Y
 S DPS=DPS+1,%="",Y=K I $D(DBOOL) S DPS(DPS,"BOOL")=DBOOL K DBOOL
S I 'Y S X="",DPS(DPS)=$P(" S X="_%_"X",U,%]"") Q
 I K(Y)="" S Y=Y-1 G S
 I "'"[K(Y)!(K(Y)="+"),$S(Y=1:1,1:K(Y-1)?1P!(K(Y-1)="")) S %=K(Y)_%,K=K-1,Y=Y-1 G S
 D DG S DPS(DPS)="" I K(K)?1P!(K(K)?2P) S DPS(DPS)=" S Y="_%_"X,X="_Y_",X=X",DPS(DPS,U)=K(K)_"Y",K=K-1
 S:$D(DATE(K)) DPS(DPS,"DATE")=1
 S K(K+1,2)=0 Q
 ;
NEST() N I
 F I=DPS:-1 Q:'$D(DPS(I,"ST"))
 Q I
 ;
DG S Y=$$DGI,X=" S "_Y_"=$G(X)"
 Q
DGI() S DG(DLV0)=$G(DG(DLV0))+1 Q DQI_DG(DLV0)_")"
 ;
EXPR(FILE,DICOMP,I,SUBS) ;I=input expression; DICOMP=flags
 S X=$G(DUZ),X(2)=$G(DUZ(2)),DICOMP=$G(DICOMP)
 N DUZ,J,DICOMPX,DICOMPW,DQI,DA,DICMX S DUZ=X,DUZ(0)="@",DUZ(2)=X(2) ;pretend he's programmer
 K X S X=I
 I DICOMP["m" S DICMX="X DICMX" ;Flag 'm' = allow returning multiple values
 S DICOMPW="",DA="X("
 S DICOMPX="",DICOMP=$TR(DICOMP,"F")_"X" ;(Why strip out "F"?)  We don't allow MUMPS
 M DICOMPX=SUBS ;list of terms to substitute
 D IJ^DIUTL(FILE) S FILE=$O(I(""),-1) I FILE S DICOMP=FILE_DICOMP ;FILE may be down a level or 2
 K SUBS,FILE
 D DICOMP
 I '$D(X) Q
 S X("USED")=$G(DICOMPX)
 Q

DICOMP0
DICOMP0 ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;17DEC2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DICOMPI
SETFUNC I DPS,$D(DPS(DPS,"SET")),'$D(W(DPS)) S T="""",D=$P(X,T)_$P(X,T,2) G BAD:$L(D)+2\5-1!(D'?.UN)!(D?1"D".E)!(DUZ(0)'="@") S X=T_D_T,DICOMPX(D)=D,Y=0 Q
LIT I X?1"""".E1"""" S Y=0,%=$E(X,2,$L(X)-1) K:%[""" X "!(%[""" D @") Y S X=""""_$$CONVQQ^DILIBF(%)_"""" Q
L S T=DLV,DICN=X
TRY G M:'$D(J(T))!'$D(I(T)),M:+J(T)'=J(T),M:$G(^DD(J(T),.01,0))="",UP:$P(^(0),U,2)["W" S DIC="^DD("_J(T)_",",DG=$O(^DD(J(T),0,"NM",0))_" "
 S DIC("S")=$S(W="["!($E(I,M,M+1)="'[")!$D(DICMX):"I ",1:"S %=$P(^(0),U,2) I '%,%'[""m"",")_"$$SCREEN^DICOMP0"
 D DICS^DICOMPY:DUZ(0)'="@"
R I X?1"#"1.NP S X=$E(X,2,99) D ^DIC G:Y>0 A:DLV,X S X="#"_X
 D ^DIC G A:Y>0
N I $P(X,DG)="",X=DICN S X=$P(X,DG,2,9) G R
NUMBER I X=$$EZBLD^DIALOG(7099) S Y=.001,Y(0)=0 G D ;**CCO/NI THE WORD 'NUMBER' IN A COMPUTED EXPRESSION
UP S T=T-1,X=DICN G M:T<0,TRY:$D(J(T)) F T=T-99:1 G TRY:'$D(J(T+1))
 ;
A F D=M:1:$L(I)+1 Q:$F(X,$E(I,1,D))-1-D  S W=$E(I,D+1)
 I DICOMP["?",DICN'="#.01",$P(Y,U,2)'=DICN,DG_$P(Y,U,2)'=DICN D  G BAD:%<0,N:%-1
 .N N S N(1)=DICN,N(2)=DG,N(3)=$P(Y,U,2) W !,$$EZBLD^DIALOG(8201,.N) S %=1 D YN^DICN ;**CCO/NI (SAME)
 E  S DICO("BACK",T)=+Y
 S M=D
X I $D(DICOMPX)#2 S %Y=J(T)_U_+Y_$E(";",1,$L(DICOMPX)) S:";"_DICOMPX_";"'[(";"_%Y) DICOMPX=%Y_DICOMPX
 ;Take internal value of V-P Field for VPFILE Function --forgot about it when we realized that FILE Function exits!
D S D=$P(Y(0),"^",2),%=T\100*100,DICN=+Y,DICOMPI=W=")" I D["V"&DICOMPI&$D(DPS($$NEST^DICOMP,"VPFILE")) S DICO("PT")=1
 E  S DICOMPI=DICOMPI&$D(DPS($$NEST^DICOMP,"INTERNAL"))
 D DATE:D["D"&'DICOMPI
 I D["m"!D D MUL^DICOMPZ(D) Q
 I $D(DICOMPX(1,J(T),+Y)) S X=DICOMPX(1,J(T),+Y) G O
 I D["C" S:'$D(DG(%,T,+Y)) DG(%)=DG(%)+1,DG(%,T,+Y)=DG(%) S X=DQI_DG(%,T,+Y)_")" Q:D'["p"!DICOMPI  S DICN=+$P(D,"p",2),%Y=$G(^DIC(DICN,0,"GL")) Q:%Y=""  G POINT
GET I DICOMP["G",T#100=0 S X="$$GET^DDSVAL("_J(T)_",D0,"_+Y_",,"""_$E("E",'DICOMPI)_""")" G O
 D G^DICOMPY ;This will set return value X equal to something like "$P(Y(2),U,3)"
O Q:DICOMPI
 S T=J(T)
S ;
 S %=DLV0,DG=W=":"&'$D(DPS(DPS,"$S"))
OUT I D["O"&(D'["P"!'DG)!(D["V"&'$D(DPS(DPS,"FILE"))) D  Q
 .S X="$$EXTERNAL^DIDU("_T_","_DICN_","""","_X_")",DICO("DIERR")=1  ;S:'K K=1 S K(1)=" N DIERR S X=$G(X)"_$G(K(1))
 .;D DIMP^DICOMPZ("N C,Y S Y="_X_",C="""_D_""" D:$D(^DD("_T_","_DICN_",0)) Y^DIQ S X=Y") S DICF=X D ST^DICOMP S DPS(DPS)=DICF_" S X=X" B  D DPS^DICOMPW Q
SET I D["S" S DG(%)=DG(%)+1,DG(%,DG(%))="$C(59)_$P($G(^DD("_T_","_DICN_",0)),U,3)",X="$P($P("_DQI_DG(%)_"),$C(59)_"_X_"_"":"",2),$C(59))" ;S X="$$SET^DIQ("_T_","_DICN_","_X_")"
 Q:D'["P"  S %Y=U_$P(Y(0),U,3),DICN=+$P(@(%Y_"0)"),U,2)
POINT I W=":" G MR:'$$OKFILE^DICOMPX(DICN,DICOMP)
 I W'=":" S D=$P($G(^DD(DICN,.01,0)),U,2) I D'["V",D'["S",D'["P" D DATE:D["D" S X="$P($G("_%Y_"+"_X_",0)),U)" Q
P G P^DICOMPX
 ;
M S T=$F(X," IN ") I T S X=$E(X,1,T-5),W=":",M=T-4,I=X_W_$E(I,T,999),T=$F(I," FILE",M) S:T&$F(DPUNC,$E(I,T)) I=$E(I,1,T-6)_$E(I,T,999) G DICOMP0
 G MR:$L(X)>30 S DICF=X,T=$O(^DD("FUNC","B",X,0))
 G LITDATE:'$D(^DD("FUNC",+T,3)),LITDATE:^(3)
 I $G(^(1))'="" D 2^DICOMP S Y(0)=0,K=K+1,K(K)=X D DATE:$G(^(2))?1"D".E,DPS^DICOMPW Q
 G MR:X'?1"PRIOR"4.U S Y=X,X="$P($$LAST^DIAUTL("_J(DLV0)_",D0,""*""),U)" I Y["USER",$D(^VA(200)) S $E(X,$L(X))=",2)",DICN=200,%Y="^VA(200," G POINT
 G DATE
 ;
LITDATE S %DT="T" I $L(X)>2 D ^%DT I Y>0 S X=Y,Y(0)=0 D DATE Q  ;may be a literal date
BACKPNT S T=$O(^DIC("B",X)) I T]"",$P(T,X)=""!$D(^(X)),$D(J(0)) S T=DLV0 D ^DICOMPV I D>0 Q  ;try backwards-pointer  TOOK OFF CHECK FOR DICOMPW VARIABLE 3/28/2000
MR I M'>$L(I),+X'=X D MR^DICOMP G L:X]""
DDD I DICOMP["?",$D(^DDD("C")),DICOMP'["d" ; S T=$$EN^DICOMPU(X,.J,DICOMP,.DICMX) G BAD:$D(DUOUT) I T]"" W "  (",T,")" D   I $D(X),$D(Y) S:Y["m" DIMW="m" D:Y["D" DATE S K=K+1,K(K)=X_" S X=X" D DPS^DICOMPW S DLV=+Y Q
 ;.D ST^DICOMPX S D=$E(I,M,999),DICOMP=$TR(DICOMP,"?")_"d" D RCR^DICOMPZ(T) S M=0,I=D
BAD K Y Q
 ;
DATE ;
 S DATE(K+1)=1 Q
 ;
SCREEN() ;Screen out certain fields as we process an atom
 I $D(DICO("BACK"))=11,$G(DICO("BACK",T))=Y Q 0
 I Y=DA,DICO(1)=T Q 0 ;Computed field cannot refer to itself!
 I $P(^(0),U,2) Q '$G(DBOOL) ;A multiple cannot be manipulated as a Boolean!
 I $P(^(0),U,2)'["P" Q 1
 N P S P=$P(^(0),U,3) I P]"",$D(@(U_P_"0)")) Q 1 ;Only allow a pointer that points to an existing file!
 Q 0

DICOMP1
DICOMP1 ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;19JUNE2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F  Q:'$D(DPS(DPS,"ST"))  D DPS^DICOMPW S K=K+1,K(K)=X
 G 0:DPS
INIT S T=99,DLV0=0,X="",K=1 D ST ;ST will build code to get top=level values
NN I $D(K(K,1)) S DLV0=K(K,1) K K(K,1) D ST ;'1' flags a change in levels
 I $D(K(K,9)) F %=1:1:K K DATE(%)
 G S:$D(K(K))[0,K1:K(K)=""
 I " "[$E(K(K)) D
 .Q:X=""
 .I K(K)?1" S ".E D  Q
AS ..D EX I $L(K(K))+$L(X)>160 D M Q
 ..S K(K)=$E(K(K),4,999),X=X_","
 .D EX:W,M:$L(X)+$L(K(K))>180
 E  I 'W D M:$L(X)+$L(K(K))>165 S X=X_" S X=",W=6
 D:K(K)?1P
P .I "\/"[K(K),$G(K(K+1))'?.NP S K=K+1,K(K)=",X=$S("_K(K)_":X"_K(K-1)_K(K)_",1:""*******"")"
 .I $L(X)>150,$F(DPUNC,K(K))>3 D M,SX
 G A:'$D(DATE(K))
DATE I $G(K(K-1))="_",X?.E1"_" S X=$E(X,1,$L(X)-1) D EXTRASB S Y=$$DGI^DICOMP,X=X_" S "_Y_"=X,X="_K(K)_" S Y=X X ^DD(""DD"") S X="_Y_"_Y",K(K)="" G A
 S Y=1 I $G(K(K-1))="+" S X=X_"0,X2=X,X1="_K(K) G DTC
2 G A:$D(K(K+2))[0
 K DATE(K)
 I $D(DATE(K+2))[0,$F("+-",K(K+1))>1 S X=X_K(K)_",X1=X,X2="_K(K+1)_K(K+2),DATE(K+2)=1
 E  G A:K(K+1)'="-" K DATE(K+2) S X=X_K(K)_",X1=X,X2="_K(K+2),Y=0
 S K=K+2
DTC S K=K+1,X=X_",X="""" D"_$P(":X2 ^ C",U,Y+1)_"^%DTC:X1" G S:'$D(K(K)) D SX G NN:'Y S K=K-1,K(K)="" G 2
 ;
A S W='$D(K(K,2)),X=X_K(K)
K1 S K=K+1 G NN:$D(K(K))#2
S S I="" F  S I=$O(M(I)),W=0 Q:I=""  D M:$L(X)>235 S K=$O(M(I,"")),X=X_" S D"_I_"="_$S(DA:DQI_(K+80),1:"I("_K_",0")_")"
 S I=-1 D SS S:X?.E1" S X=X" X=$E(X,1,$L(X)-6) I X'?1"S X="1N.NP!(DICOMP["Z") G Q
0 ;NO GOT!  Come here when parsing fails
 K X,DIM,DATE I DUZ(0)="@",DICOMP'["X" D
 .Q:DICO'[" "
 .S DIM=1 I $L(DICO," ")=2 F Y="OPEN","CLOSE","BREAK","USE" D  I '$D(DIM) Q
 ..I $E(Y)=$P(DICO," ")!(Y=$P(DICO," ")) K DIM
 .I $D(DIM) S X=DICO D ^DIM
 S DICOMP="",DLV=DICO(1)
Q I DICOMP'["S" S K=DICO(1) F  S K=$O(I(K)) Q:K=""  K I(K),J(K)
 I $D(X) S:$D(DICO("DIERR")) X="N DIERR "_X I $G(DICOMPQI) S X="N Y "_X
Y K Y I $D(DICO("RCR")) S Y=DICO("RCR")
 E  S Y=DLV_$E("W",$D(DPS("W")))_$S($G(DBOOL)=1:"B",$D(DATE)>9:"D",1:"")_$E("X",$D(DIM))_$E("L",$D(DICO(2)))
 S Y=Y_DIMW
 I $D(DICO("PT")) S Y=Y_"p"_DICO("PT")
 K K,DLV,DICOMP,DICMX Q
 ;
ST S W=0,DG="" F  S DG=$O(DG(DLV0,DG)),Y=$P(DG,U,2) Q:DG=""  D
 .I Y]"" S:+Y'=Y Y=""""_Y_"""" S I=DQI_DG(DLV0,DG)_")=$S($D(^(" D:T-DG!(DG<DLV0)  S I=I_Y_")):^("_Y_"),1:"""")" G VP
 ..N T,QI,%
X ..S I=$P(I,U),%=DG\100*100
 ..F T=0:1:DG#100 S QI=I(%) S I=I_QI_$E(",",1,T)_$S(DICOMP["T"&(DG<DICO(0)):"I("_%_",0)",1:"D"_T)_",",%=%+1
 ..K DG(DLV0,DG)
 ..;do not change above code to use "$G" until you change E2+4^DIP0 !
C .F  S %=$O(DG(DLV0,DG,0)) Q:'%  D  K DG(DLV0,DG,%) ;for Computed Fields
 ..S I=" X ""N I,Y ""_$P(^DD("_J(DG)_","_%_",0),U,5,99)"
 ..I DICOMP["T",DG<DICO(0) D
 ...N W,SV S SV=X,X="N D0 S D0=I("_DG_",0)"_I D EXTRASB S I=X,X=SV
 ..S I=I_" S "_DQI_DG(DLV0,DG,%)_")=X"
 ..D EX:W,M:$L(X)+$L(I)>180 S X=X_I
 .Q:$D(DG(DLV0,DG))[0
 .S I=DG(DLV0,DG) I I?.N S I=$S(DA:DQI_(DLV0+I+80),1:"I("_(DLV0+I)_",0")_")=$G(D"_I_")"
 .E  S I=DQI_+DG_")="_I
 .K DG(DLV0,DG) G OV:DG?.N1A
VP .I $G(DICV)["V" S I=I_"_$C(59)_"""_$E(I(0),2,99)_""""
OV .I $L(I)+$L(X)>180 D M
 .S:'W X=X_" S " S X=X_I_",",W=2
 D EX S W=0 Q
 ;
M D SS,EX
EXTRASB D DIMP^DICOMPZ(X) S W=0 Q
 ;
SS Q:$A(X)-32  S X=$E(X,2,999) G SS
 ;
EX S X=$E(X,1,$L(X)-W+1) Q
 ;
SX S X=X_" S X=X",W=1
 Q

DICOMPU
DICOMPU ;GFT/GFT - META-DATA-DICTIONARY LOOKUP;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(Y,J,DICOMP,DICMX) ; Main Entry Point
 ;Y=expression; DICOMP=parameter string; J array by reference, as set up by IJ^DIUTL, or just FILE NUMBER; DICMX defined means multiples allowed
 N DATE,D,DD,DIS,DISTART,DICN,FIL,FIELD,F,FLD,DSPI,FILE,DIC,%,X,ASKED
 I $D(J)=1 S D=J K J S J(0)=D
 K DUOUT
 S DISTART=Y K Y I $L(DISTART)>31!($D(J)<9)!($L(DISTART)<3) Q ""  ;1 or 2 characters isn't enough
 I '$D(DICOMP) S DICOMP="?"
 D DRW^DICOMPX ;Sets up DIC("S") (see tags PTQ+2 and ACCESS+2)
 S D="" F  S D=$O(J(D)) Q:D=""  S FILE(J(D))="" ;builds list of Files we know to start with
 ;Here we go, looping thru ^DDD
 S DIS=DISTART
X F DICN=0:0 S DICN=$O(^DDD("C",DIS,DICN)) Q:'DICN  S DIC=$G(^DDD(DICN,0)),X=$P(DIC,U,2),FIL=$P(DIC,U,3),FIELD=$P(DIC,U,4),F=$$LOOK G QX:$D(DUOUT) I F]"" S:$P(DIC,U,5) FIELD=FIELD_"="""_X_"""" G GOT
 ;That 5th piece would be a VALUE, like "ILLINOIS"
 I $L(DISTART)>2 S DIS=$O(^DDD("C",DIS)) I DIS]"",$P(DIS,DISTART)="" G X
 ;Couldn't find simple field name.  Let's see if it's "FILE FIELD"
 S X=DISTART
 F DSPI=1:1:$L(X," ")-1 S FIL=$P(X," ",1,DSPI) I FIL]"",$L(FIL)<32 S FIL=$O(^DIC("B",FIL,0)) I FIL S FIELD=$P(X," ",DSPI+1,999) I FIELD]"",$L(FIELD)<32 S FIELD=$O(^DD(FIL,"B",FIELD,0)),F=$$LOOK Q:$D(DUOUT)  G GOT:F]""
QX K ^TMP("DICOMPU",$J) Q ""
 ;
 ;
LOOK() N TRY K ^TMP("DICOMPU",$J)
 ;In ^TMP("DICOMPU",$J,"F") we will store failure to go FORWARD
 ;In ^TMP("DICOMPU",$J,"B") we will store failure to go BACKWARD
 I 'FIL!'FIELD Q ""
 Q $$FIELD(FIL,FIELD)
 ;Following subroutine is called RECURSIVELY
FIELD(F,DD) ;Can we TRANSlate File F, Field DD to the context of FILE?
 I '$D(^DD(F,DD,0)) Q ""
 I '$D(DICMX),$P(^(0),U,2) Q "" ;Can we go to a multiple field?
 I $D(TRY(F)) Q ""
 I '$$ACCESS(F,DD) Q "" ; Not if they don"t have access to that File & Field
 S TRY(F)="" N T M T=TRY N TRY M TRY=T K T ;Inherit everything tried
MULTIPL ;First, can we get to the context by going up from a MULTIPLE
 N OUT,B,T,TRANS,L,D,I
 I $D(DICMX) S T=F,TRANS="" K D D  I $D(D) S TRANS=$$TOOLONG(D,TRANS) D SAVE G OUT:$G(OUT)
 .F  Q:'$D(^DD(T,0,"UP"))  S D=T,TRANS=$O(^DD(T,0,"NM",0))_":"_TRANS,T=^DD(T,0,"UP"),D=$O(^DD(T,"SB",D,0))
 .I TRANS=""!$D(TRY(T)) K D Q
 .I $D(FILE(T)) S D="",OUT=1 Q
 .S D=$$FIELD(T,D) I D="" K D
FORWARD ;Next, can we go FROM our context TO the found File F?
 D  D SAVE G OUT:$G(OUT)
 .N Y,KEEP,UP,FI,FLD ;Can we go from our context to File F?
 .S FI=1.9,KEEP=""
PTQ .S TRANS=KEEP,FI=$O(^DD(F,0,"PT",FI)) I 'FI Q  ;Can we get to this F FILE from another?
 .G PTQ:$D(TRY(FI))!$D(^TMP("DICOMPU",$J,"F",F,FI)) I FI[".",$D(^DD(FI,0,"UP")) G PTQ:'$D(DICMX)
 .S FLD=0
F .S FLD=+$O(^DD(F,0,"PT",FI,FLD)) I 'FLD G PTQ ;go thru all the Pointers to File F in File FI, and take those that...
 .S %=$P($G(^DD(FI,FLD,0)),U,2) I %'["P" G F ;...are regular pointers (not VARIABLE-POINTER)...
 .I +$P(%,"P",2)=FI G F ;not to itself
 .S TRANS=$P(^(0),U)_":" I $D(FILE(FI)) S OUT=1 Q
 .S T=$$FIELD(FI,FLD) I T="" S ^TMP("DICOMPU",$J,"F",F,FI)="" G PTQ
 .S KEEP=$$TOOLONG(T,TRANS) G F
BACK ;Finally, is there a Pointer FROM the found file TO our context?
 ;if file's .01 field is a DINUM pointer, maybe we can get to it by Backwards-pointer syntax -- "FILE NAME:"
 I $P($G(^DD(F,.01,0)),U,2)["P",$P(^(0),U,5,99)["DINUM=X" S T=+$P($P(^(0),U,2),"P",2) I T-F,$D(FILE(T)),$G(^DIC(F,0))[U S TRANS=$P(^(0),U)_":" D SAVE G OUT
 I $D(DICMX) F T=0:0 S T=$O(FILE(T)) Q:'T!$G(OUT)  D
 .N R,D,B,L,I ;Does File F eventually point to File T?
 .F D=1.9:0 S D=$O(^DD(T,0,"PT",D)) Q:'D  D:'$D(TRY(D))&'$D(^TMP("DICOMPU",$J,"B",F,D,T))  Q:$G(OUT)
 ..S B=$$TOP(D) I B>0,B-T F L=0:0 S L=$O(^DD(T,0,"PT",D,L)) Q:'L  I $P($G(^DD(D,L,0)),U,2)["P" F I=0:0 S I=$O(^DD(D,L,1,I)) Q:'I  I +$G(^(I,0))=B,$P(^(0),U,3,9)="" D  D SAVE Q:$G(OUT)
 ...S TRANS=$O(^DD(B,0,"NM",0))_":" I TRANS=":" S TRANS="" Q
 ...I B=F S OUT=1 Q  ;if we are at File F, we have succeeded
 ...N FILE K TRY(F) S TRY(D)="",FILE(B)="",FILE=$$RECURSE ;Otherwise, we CHANGE THE CONTEXT
 ...I FILE]"" S TRANS=$$TOOLONG(TRANS,FILE) Q
 ...S TRANS="",^TMP("DICOMPU",$J,"B",F,D,T)=""
OUT S OUT="",T=0 ;Of our possible paths, let's choose the SHORTEST
 I '$D(DUOUT) F %=1:1 Q:'$D(OUT(%))  S L=$L(OUT(%),":") D
 .I OUT]"" Q:T'>L  I ":"_OUT(%)[":*" Q  ;We don't like * fields
 .S OUT=OUT(%),T=L
 Q OUT
 ;
RECURSE() G MULTIPL
 ;
 ;
TOP(B) ;
UP I '$D(^DD(B,0)) Q -999
 I $D(^(0,"UP")) S B=^("UP") G UP
 Q B
 ;
ACCESS(A,B) I DUZ(0)="@" Q 1
 N Y S Y=$$TOP(A) I '$D(^DIC(Y,0)) Q 0
 X DIC("S") E  Q 0
 I '$D(^DD(A,B,8)) Q 1
 Q $TR(DUZ(0),^(8))'=DUZ(0)
 ;
TOOLONG(A,B) I $L(A)+$L(B)+$L(FIELD)>($G(^DD("STRING_LIMIT"),255)-5) Q ""
 Q A_B
 ;
SAVE I TRANS]"" D ASK I TRANS]"" D  Q
 .;I TRANS'[":" K OUT S OUT=1 Q
 .S OUT($O(OUT(""),-1)+1)=TRANS
 S OUT=$G(DUOUT) Q
 ;
ASK I $D(DUOUT) S TRANS="" Q  ;TRANS is the return value
 I DICOMP'["?"!'DD!$G(DSPI) Q  ;if Field Number is zero, or input was in form of 'FILE FIELD', don't ASK
 I $D(ASKED(FIL,FIELD)) S:'ASKED(FIL,FIELD) TRANS="" Q
 N DIASK
 W !?7 S DIASK(1)=DISTART,DIASK(3)=$P(DIC,U,2),%=$P(DIC,U),DIASK(2)=$P(%,"_",1,$L(%,"_")-1)
 D BLD^DIALOG(8201,.DIASK),MSG^DIALOG("WM")
 S %=1 D YN^DICN I %<0 S DUOUT=1
 S ASKED(FIL,FIELD)=%=1 S:%-1 TRANS="" Q
 ;
GOT K ^TMP("DICOMPU",$J) Q F_"#"_FIELD ;we've GOT the expression.

DICOMPV
DICOMPV ;SFISC/GFT  BACKWARD-POINTERS IN COMPUTED FIELDS ;13APR2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIX,DICOTRY,DICOLEV
 D DRW^DICOMPX
TRY F DICOTRY=1,2 S Y=$$BACK I Y[U Q:Y=U  D:$G(D)-.001 Y^DICOMPX G END
 S D=0 ;'D' is a flag to the calling routine, DICOMP0, saying we've found nothing here in DICOMPV
END Q
 ;
BACK() N DICOB,DICODD
 S DICOB=DLV0,DICODD=0
DD S DICODD=$O(^DD(J(DICOB),0,"PT",DICODD)) I DICODD'>0 S DICOB=DICOB-100,DICODD=0 G DD:DICOB'<0 Q ""
ARCH S Y=DICODD I DICOMP["W",$P($G(^DD(Y,0,"DI")),U,2)["Y" G DD ;No editing RESTRICTED or ARCHIVE file!
 F DICOLEV=0:-1 G DD:'$D(^DD(Y,0)) Q:'$D(^(0,"UP"))  S Y=^("UP")
 I $D(^DIC(Y,0)),$P(^(0),X)="" X DIC("S") I $T,$D(^DIC(Y,0,"GL")) S V=^("GL"),D=0 F  S D=$O(^DD(J(DICOB),0,"PT",DICODD,D)) Q:'D  D  G Y:Y[U
DINUM .I DICODD=Y,D=.01&(DICOTRY=1)&($P($G(^DD(Y,.01,0)),U,5,99)["DINUM=X")!(D=.001&(DICOTRY=2)) D YN("") I %=1 S %Y=V,X="D0" S:$D(DIFG) DIFG=1 D X(Y,D),P^DICOMPX S D=.001,Y=Y_U Q
 .Q:'$D(DICMX)  ;Stop if expression can't be multiple-valued
 .N DICOUT F DIX=0:0 S DIX=$O(^DD(DICODD,D,1,DIX)) Q:DIX'>0  S J=$G(^(DIX,0)) I +J=Y S %=$P(J,U,3,9) I $S(DICOTRY=1:%="",1:%]""&("MUMPS"[%)) D  G:$G(DICOUT) Q
 ..D YN("Cross-reference") I %<1 S Y=U,DICOUT=1 Q
 ..I %=1 D MP S DICOUT=1
 .Q:DICOTRY=1
INDEXES .F DIX=0:0 S DIX=$O(^DD("IX","F",DICODD,D,DIX)) Q:'DIX  I $P($G(^DD("IX",DIX,0)),U,4)="R",$P(^(0),U,9)=DICODD S J=$P(^(0),U,1,3) I +J=Y,$P($G(^(11.1,1,0)),U,2,4)=("F^"_DICODD_U_D) D YN("Index") G Q:%<1 I %=1 D MP G Q
Q .Q
 G DD
 ;
Y Q Y
 ;
 ;
MP S DICN=$S(DA:DQI_(80+DICOB),1:"I("_DICOB_",0")_")",J=""""_$P(J,U,2)_"""",T=D S:$D(DIFG) DIFG=$P(J,"""",2)
 I DICOMP'["W" D  G POP:$D(Y) S (Y,D)=0 Q
 .N DICOMPIX S DICOMPIX=J
 .S D=Y,I(DLV0+100)=V,J(DLV0+100)=D
RCR .D BACKPNT^DICOMPZ Q:'$D(Y)
 .S Y=D,X=$P(^DD(D,.01,0),U,2) D X^DICOMPZ
 .S D="S (D,D0)=$QS(DIMQ,$QL(DIMQ)" I DICOLEV S D=D_DICOLEV
 .D DIMP^DICOMPZ(D_") I D,$D("_V_"D,0)) "_X_" "_DICMX)
 .D DIMP^DICOMPZ("N DIMQ,DIMSTRT,DIMSCNT S (DIMQ,DIMSTRT)=$NA("_V_DICOMPIX_","_DICN_")),DIMSCNT=$QL(DIMQ) F  S DIMQ=$Q(@DIMQ) Q:DIMQ=""""  Q:$NA(@DIMQ,DIMSCNT)'=DIMSTRT  "_X_" Q:'$D(D)  S D=D0")
 .S X=X_" S X="""""
ASK D ASKE^DICOMPW I 'D,T-.01&'DS!(DICODD-Y) S D=0
 E  S DZ=0 D ASK^DICOMPW:'D I D<0 K T Q
 S %=D,D="N DIADD,DIC S DIC="_Y_$S(%=2:",DIADD=1",1:"")_",DIC(0)="""_$P("EQ",U,DS)_$E("L",D>0)_$E("W",$D(DICO(3)))
CROSS I T-.01 S D=D_$P("AM",U,DS)_""",DIC(""S"")=""I $D("_V_""""_J_""","""_"_"_DICN_"_"_""",Y))"" D ^DIC S D0=+Y,DIC("_T_")="_DICN_",DIH="_Y_" D DICL^DICR:$P(Y,U,3)"
 E  S D=D_"U"",X="_DICN_" D ^DIC S D0=+Y"
DIM D DIMP^DICOMPZ(D) I '% S %=":$O(^(D0))>0",X=" S D0=$O("_V_J_","_DICN_",0))"_$S(DS:X_%,1:" S"_%_" D0=0")
 S X=X_" S X=$S(D0>0:D0,1:"""")" S:$D(DICOMPX(0)) X=X_","_DICOMPX(0)_"0)=X"
POP S Y=Y_U,D=1,DICO("PT")=+Y
 D X(+Y,.01) Q
 ;
X(Y,D) S DICN=Y ;Remember that we have used this field
 I $D(DICOMPX)#2 S DICOMPX=Y_U_D_$E(";",1,$L(DICOMPX))_DICOMPX
 Q
 ;
YN(SHOW) N X
 S X=$P(^DIC(Y,0),U)
 S %=1 I DICOMP["?" D
YOU .N N ;**CCO/NI (+ next 2  lines) 'BY SO&SO, DO YOU MEAN THE SUCH&SUCH FILE, POINTING...?'
 .S N(1)=DICN,N(2)=X,N(3)=$P(^DD(DICODD,D,0),U),DICV=$P(^(0),U,2)
 .W !,$$EZBLD^DIALOG(8202,.N)
 .I SHOW]"" W !,"    (""",$P(J,U,2),""" ",SHOW,")"
 .D YN^DICN
 I %=1 F M=M:1:$L(I)+1 Q:$F(X,$E(I,1,M))-1-M  S W=$E(I,M+1)
 Q

DICOMPW
DICOMPW ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;13APR2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
COLON N DICOMPW K DP,Y S DICOMPW=DICOMP ;COME HERE WHEN INPUT ENDS IN COLON
 I $D(DIC)#2,$P(X,":",2)="" S X=$P(X,":"),DIC(0)="FIZO",DIC("S")="N A S A=$P(^(0),U,2) I A[""P""!(A[""p""),'A" N DICR,DO,DIY D ^DIC K DIC S X=X_":" D:Y>0 ARC I Y>0 S X="INTERNAL(#"_+Y_")",DP=+$P($P(Y(0),U,2),"P",2)_U_$P(Y(0),U,3)
 I  I $P(Y(0),U,2)["p" S X=$P(Y(0),U,5,99),DP=+$P($P(Y(0),U,2),"p",2),DP=DP_$G(^DIC(DP,0,"GL")),Y=0 G JUMP:$P(Y(0),U,2)'["m" S DICOMPW=DICOMP+100 D IJ S Y=D_"m" Q  ;computed pointer, possibly multiple
 I $G(Y)'>0 S X=$E(X,1,$L(X)-1),DICOMPX="",DICOMPX(0)="D("
 S DICOMP=DICOMP_"S"
 D EN^DICOMP G Q:'$D(X)
 I '$D(DP) K:Y'>DICOMPW X S %=I(+Y),DP=J(+Y)_$S(%[U:%,1:U_$P(%,"""",1)_$P(%,"""",2)) G Q
JUMP S:$D(DIFG) DIFG=2 S DICOMP=DICOMPW D DRW^DICOMPX G Q:'$D(^DIC(+DP,0)) S D=Y,Y=+DP X DIC("S") S Y=D I '$T K X,DIC("S") G Q
IJ F D=DICOMPW\100*100:1 S X="S I("_D_",0)=D"_(D#100)_" "_X I +DICOMPW=D S X=X_"  S D(0)=+X",D=Y\100+1*100,I(D)=U_$P(DP,U,2),J(D)=+DP,Y=D_U_Y Q
Q S:$D(DIFG)&$D(X) DIFG("DICOMP")=DICOMPX K DICOMP,DICOMPX,DICOMPW Q
 ;
 ;
M ;
 S (D,DS)=0,DZ="""",Y=J(DLV) I DICOMP["W" D ASKE,ASK:'D I D<0 K X Q
 S:DS DZ="E"""
 I D S DZ=$E("W",$D(DICO(3)))_"L"_DZ_$S(DLV=DLV0:"",1:",DIC(""P"")="""_$P(^DD(J(DLV-1),$O(^DD(J(DLV-1),"SB",J(DLV),0)),0),U,2)_"""") I D=2 S DZ=DZ_",X=""""""""_X_"""""""""
 S (%,%Y)=DLV#100,DZ="N DIC S DIC=X N X S X=DIC,"_$P("Y=-1,",U,%>0)_"DIC="""_X_""",DIC(0)=""MF"_DZ_" D ^DIC"_$P(":D"_(%-1)_">0",U,%>0),X=" S (D,D"_%_$S($D(DICOMPX(0)):","_DICOMPX(0)_%_")",1:"")_")=+Y"
 I D F %=%:-1:1 S X=X_",DA("_%_")=DIU("_%_")",DZ=DZ_",DIU("_%_")=$S($D(DA("_%_")):DA("_%_"),1:0),DA("_%_")=D"_(%Y-%)
 S %=X D DIMP^DICOMPZ(DZ) S X=X_%
 I W=":" S M=M+1 Q
 S I="#.01"_$E(I,M,999),M=0 Q
 ;
ASKE ;
 S (D,DS)=0,%=1 I DICOMP["?",DICOMP["E" W !,$$EZBLD^DIALOG(8203,$$FILENAME^DIALOGZ(Y)) D YN^DICN S:%=1 DS=1 ;**CCO/NI 'WILL USER SELECT?'
 S:%<0 D=% Q:%  D DICOMPW^DIQQQ G ASKE
 ;
ASK ;
 G NO:DICOMP'["?",ASK1:DUZ(0)="@"
 S DIFILE=Y,DIAC="LAYGO" D ^DIAC K DIAC,DIFILE G:'% NO
ASK1 W !,$$EZBLD^DIALOG(8204,$$FILENAME^DIALOGZ(Y)) ;**CCO/NI WANT TO PERMIT ADDING...?
 S %=2-(DICOMP["L"),D=0 D YN^DICN W ! I %<1 S D=-1 Q
ASK2 Q:%=2  S D=1 Q:DZ  W $$EZBLD^DIALOG(8205) ;**CCO/NI WELL, WANT TO *FORCCE* ADING...?
 S %=2-(DICOMP["L2") D YN^DICN I %<1 S D=-1 Q
 S D=3-%,DICO(2)=1 Q:%=1!'DS
ASK3 W !,$$EZBLD^DIALOG(8206,$$FILENAME^DIALOGZ(Y)) D YN^DICN I %<1 S D=-1 Q  ;**CCO/NI WANT AN 'ADDING NEW?' MESSAGE?
 Q:%=1  S DICO(3)=% Q
NO S D=0 Q
 ;
DPS ;
 S X=DPS(DPS),%=$O(DPS(DPS,"$")) S:$D(DPS(DPS,"BOOL")) DBOOL=DPS(DPS,"BOOL") I %["$" S X=X_"X)"_DPS(DPS,%) D
 .N % S %=X N X S X=% F  Q:$E(X)'=" "  S X=$E(X,2,999)
 .D ^DIM I '$D(X) S W(DPS)="BAD SYNTAX!"
 I $D(DPS(DPS,"DATE")) S DATE(K+1)=1
 S %=$D(DATE(K)) I $D(DPS(DPS,U)) S K=K+2,K(K-1)=X,K(K)=$E(DPS(DPS,U)),X=$E(DPS(DPS,U),2,99)
 I %&$D(DPS(DPS,"O"))!$D(DPS(DPS,"D"))!$D(DPS(DPS,"DATE")) S DATE(K+1)=1
 E  I '$D(DPS(DPS,"ST")) S K(K+1,9)=0
 K DPS(DPS) S DPS=DPS-1
 Q
ARC ;
 Q:DICOMP'["W"
RES N N S N=+$P($P(Y(0),U,2),"P",2) I $P($G(^DD(N,0,"DI")),U,2)["Y" W !,$C(7),$$EZBLD^DIALOG(405,N) S Y=-1 ;**CCO/NI 'CANNOT EDIT RESTRICTED FILE'
 Q

DICOMPX
DICOMPX ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;2SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
M ;From DICOMP
 S DICOMPXM=M
 F  D F Q:$D(X)  D  Q:'$D(X)  ;Try as long a file name as possible
 .I M<$L(I) F M=M+1:1 S W=$E(I,M) I DPUNC[W S X=$E(I,1,M-1) Q
 S:'$D(X) M=DICOMPXM K DICOMPXM
 Q
 ;
F I '$D(J(0)) K X Q
 S DIC("S")="I $P(^(0),U,2),$P(^DD(+$P(^(0),U,2),.01,0),U,2)'[""W"""
MM S DICN=X,T=DLV S:X?1"#".NP X=$E(X,2,99)
TRY S DIC="^DD("_J(T)_",",DG=$O(^DD(J(T),0,"NM",0))_" " D DICS^DICOMPY,^DIC G R:Y<0
 F D=M:1:$L(I)+1 Q:$F(X,$E(I,1,D))-1-D  S W=$E(I,D+1)
 I DICOMP["?",$P(Y,U,2)'=DICN W !?3,"By '"_DICN_"', do you mean the '"_$P(Y,U,2)_"' Subfield" S %=1 D YN^DICN I %-1 G R:%+1 K X Q
 S M=D,Y=+$P(Y(0),U,2),X=$P($P(Y(0),U,4),";") I +X'=X S X=""""_X_""""
 S (DLV,D)=DLV0+100 F %=T\100*100:1 Q:%>T  S J(DLV)=J(%),I(DLV)=I(%),DLV=DLV+1
 S I(DLV)=X,X=$$CONVQQ^DILIBF(I(D)),J(DLV)=Y D  S DLV0=DLV0+100 F DLV=D:1:DLV D SN
REF .F Y=D+1:1:DLV S V=Y#100-1,DICN=$$CONVQQ^DILIBF(I(Y)),X=X_$S(T<DLV0:"I("_(T\100*100+V)_",0)",1:"D"_V)_","_DICN_","
Q Q
 ;
R I X]"",$P(X,DG)="",X=DICN S X=$P(X,DG,2,9) G TRY
 S T=T-1 I T'<0 G TRY:$D(J(T)) F T=T-99:1 G TRY:'$D(J(T+1))
FILEQ S X=DICN,DIC=1 D DRW,^DIC I Y>0 S X=$$CONVQQ^DILIBF(^(0,"GL")) G Y
 K X Q
 ;
Y ;
 S DLV0=DLV0+100,I(DLV0)=^DIC(+Y,0,"GL"),J(DLV0)=+Y F DLV=DLV+100:-1:DLV0 D SN
 Q
 ;
SN D SV(DLV0-100) S DG(DLV0)=DLV Q
 ;
SV(%X) ;also called from DICOMPY
 S (T,DG(%X))=DG(%X)+1,%=DLV#100,K(K+2,1)=DLV0,DG(%X,T)=%,M(%,%X+%)=T Q
 ;
 ;
OKFILE(Y,DICOMP) ;Called from DICATT6 Block, DICATT3, DICOMP0 to see if we can jump to FILE Y
 I DICOMP'["W",DICOMP'["?" Q 1 ;DICOMP either does or doesn't contain "W" and "?"
 N D,DIC,DIAC,DIFILE,%
 D DRW I $D(^DIC(Y,0)) X DIC("S")
 Q $T
 ;
DRW ;also called from DICOMPV, and DICOMPW to filter FILE names
 S D=$S(DICOMP["W":"""WR""",1:"""RD""")
 S DIC("S")="S DIAC="_D_",DIFILE=+Y D ^DIAC I %"
 Q
 ;
P ;from DINUM^DICOMPV, DICOMP0
 S X=" S D0="_X_" S:'D0!'$D("_%Y_"+D0,0)) D0=-1"
 I $D(DICOMPX(0)) S X=X_" S "_DICOMPX(0)_"0)=D0",DICOMPX(0,DICN)=""
 D ST
 I W=":" D
 .S M=M+1,W="",%=$E(I,M,999) I %,+%=$P(%,")") S I=$E(I,1,M-1)_"#"_%
 E  S I="#.01"_$E(I,M,999),M=1,W=""
 S DLV0=DLV0+100,I(DLV0)=%Y,J(DLV0)=DICN F DLV=DLV+100:-1:DLV0 D SN
 Q
 ;
ST N X D ST^DICOMP S DPS(DPS,"ST")=1,K=K+1,K(K)=X
 Q

DICOMPY
DICOMPY ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;10:22 AM  8 Jan 2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DICOINS,DICOLEFT
 S K(K+1)=X,I=$E(I,M+1,999)
 I I'[")" K Y Q
ARG D  S DICOLEFT=$E(I,%+1,999),I=$E(I,1,%-1)
 .N C,S S S=0
 .F %=1:1 S C=$E(I,%) D:C=""""  S:C="(" S=S+1 S:C=")" S=S-1 Q:S<0!(C="")
 ..F %=%+1:1 Q:""""[$E(I,%)
PREVNEXT I DICF="PREVIOUS"!(DICF="NEXT") N DICMX D  D RCR^DICOMPZ(I) G BAD:'$D(Y) S DICN=X,X=DICF G OK
 .D SV^DICOMPX(DLV0)
 .S %=DLV#100,DICF=" S D"_%_"=+$O("_$$REF^DICOMPZ(DLV)_")"_$P(",-1",U,DICF="PREVIOUS")_") "
 D FUNC
 N DICMX S DICMX=DICOINS
 D RCR^DICOMPZ(I) I $G(Y)'["m" G BAD
OK S K=K+1,K(K)=X,K(K,2)=0,K=K+1,K(K)=DICN I "TOTAL"=DICF!("COUNT"=DICF) K DATE(K-1)
RES S I=DICOLEFT,M=0 Q
 ;
FUNC S DICN=$$DGI^DICOMP,W=DLV#100,K=K+2,K(K)=" S "_DICN_"="""""
NUMBER I DICF S %X=$$DGI^DICOMP,K(K)=" S "_%X_"=0"_K(K) D L S DICOINS=DICOINS_" "_%X_"="_%X_"+1 I "_%X_"="_+DICF_",Y'?."" "" S "_DICN_"=Y Q  ",DPS(DPS,"O")="" Q
 I $T(@DICF)]"" G @DICF
BAD S DPS=0 Q
 ;
 ;
MAXIMUM S %X="'>" G MM
MINIMUM S %X="'<"
MM D L S DICOINS=DICOINS_"&("_DICN_%X_"Y!'$L("_DICN_")) "_DICN_"=Y" Q
TOTAL S DICOINS="S "_DICN_"="_DICN_"+X" Q
COUNT S DICOINS="S:X'?."" "" "_DICN_"="_DICN_"+1",DICN="+"_DICN Q
LAST D L S DICOINS=DICOINS_" "_DICN_"=Y" Q
L S DICOINS="S Y=X S:Y'?."" """
 Q
 ;
 ;
W S X=$P(Y(0),U,4),Y=$P(X,";",1),X=$P(X,";",2) Q
 ;
DICS ;
 S:DUZ(0)'="@" D=DICOMP["W"+8,DIC("S")=DIC("S")_" Q:'$L($G("_DIC_"Y,"_D_")))  I $TR(DUZ(0),^("_D_"))'=DUZ(0)" Q
G ;
 D W I X="" S Y=T#100,X=$S(T<DLV0&$D(M(Y,T))!(DICOMP["T"&(T<DICO(0))):$S(DA:DQI_(T+80)_")",1:"I("_T_",0)"),1:"$S('$D(D"_Y_"):"""",D"_Y_"<0:"""",1:D"_Y_")") Q
 I '$D(DG(%,T_U_Y)) S (DG(%),DG(%,T_U_Y))=DG(%)+1
 S Y="("_DQI_DG(%,T_U_Y)_"),"
EP I X S X="$P"_Y_"U,"_X_")" Q
 I X?1"E".E S X="$E"_Y_+$E(X,2,9)_","_$P(X,",",2)_")"
 Q

DICOMPZ
DICOMPZ ;SFISC/GFT-EVALUATE COMPUTED FLD EXPR ;24MAY2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;.
 ;
PRIOR ;from DICOMP -- PRIOR.. Functions get archived values
 N DIC,DICOMPSP,DICOMPXE,DICOPS
 S X=$E(X,6,99),DICOMPSP=$E("D",X="DATE"),DICOMPXE="D "_X_"^DIAUTL(",W=$F(I,")",M) S:X="USER"&$D(^VA(200)) DICO("PT")=200,DICOMPSP="p200" I 'W!'$D(DICMX)!'$D(J(0)) K Y Q
 S X=$E(I,M+1,W-2),M=W,W=$E(I,M) S:X?1"#"1.NP X=$E(X,2,999)
 S DIC="^DD("_J(DLV)_",",DIC(0)="",DIC("S")="I '$P(^(0),U,2),$P(^(0),U,2)'[""C""" D DICS^DICOMPY,^DIC K DIC I Y<0 K Y Q  ;Find Field that is the argument of PRIOR function
 S DICOMPXE=DICOMPXE_+J(DLV)_","_+Y_")"
 S DICOPS="><[]=",DIMW="m"
 G INSERT
 ;
BACKPNT ;from DICOMPV -- Backwards Pointer
 N DICOPS,D
 S DICOPS="><[]="
 G COLON
 ;
MUL(DICOMPSP) ;DICOMPSP is the SPECIFIER of the Field we have encountered
 N DICOXR,DICOMPXE,DICOPS S DICOPS="><][="
 I DICOMPSP S X=$P(^DD(+DICOMPSP,.01,0),U,2) G WP:X["W" D  S DLV=DLV+1,I(DLV)=""""_$P($P(Y(0),U,4),";")_"""",J(DLV)=+DICOMPSP D X G FOR
 .I T<DLV S DLV0=DLV0+100,%=DLV0-(T\100*100) F DLV=DLV0:1 S I(DLV)=I(DLV-%),J(DLV)=J(DLV-%),DG(DLV-%,DLV0-%)=DLV#100 I DLV-%=T S K(K+1,1)=DLV0,(T,DG(DLV0))=DLV Q
 S Y=+$P(DICOMPSP,"p",2),DIMW="m"_$E("w",DICOMPSP["w"),DICOMPXE=$P(Y(0),U,5,99)
 I Y S (%,DLV,DLV0)=DLV0+100,I(%)=^DIC(Y,0,"GL"),J(%)=Y D X^DICOMPV(Y,.01)
INSERT N DICOMX S D=DICOMPXE,DICOMX=DICMX D CONTAINS Q:'$D(Y)  I DICOMX=DICMX D
 .I DICOMPSP["D" S DICMX="S Y=X X ^DD(""DD"") S X=Y "_DICMX
 .I DICOMPSP["p" S DICMX="S X=$$CP^DIQ1("""_DICOMPSP_""",X) "_DICMX
 N F,Z,I S Z=""
 S F=$F(DICMX,"X DICMX") I F D
 .S Z="N DICOMPM S DICOMPM=$G(DICMX,""Q"") "
 .S DICMX=$E(DICMX,1,F-6)_"DICOMPM"_$E(DICMX,F,999)
 D DIMP(DICMX) S Z=Z_"N DICMX S DICMX="_$$DA_$$DIMC_")"
 D DIMP(D),DICOXR S Z=Z_X
 D DIMP(Z) S X=X_" S X=X" Q
 ;
WP S DIMW="m"_$E("w",X'["L"),DICOPS="["
M S X="S X=^(0)"
FOR N DICOR,DICOT ;These lines build the code for a typical Computed Multiple
 S DICOMPXE=X,DICOT=Y(0) D CONTAINS Q:'$D(Y)
 S Y=T#100+1,D=$P($P(DICOT,U,4),";") I +D'=D S D=""""_D_""""
 S DICOMPXE="D,0))#2 "_DICOMPXE_" "_DICMX_" Q:'$D(D)  S D=D"_Y
 S DICOR=$$REF(T)_","_D_",",D="F D=0:0 S (D,D"_Y_")=$O("_DICOR
 I W=")",$D(DPS(DPS,"INTERNAL")) S D="S D=$G(DIWF) N DIWF S DIWF=D_""XL"" "_D ;**DI*22*152
 S %=+$P(DICOT,U,2)
 I $P($G(^DD(%,.01,0)),U,2)["W"!'$D(^DD(%,0,"IX","B",%,.01))
 E  I '$D(^DD(%,.01,1,1,0))
 E  I $P(^(0),U,3)]""
 I  S D=D_"D)) Q:D'>0  I $D(^("_DICOMPXE ;We will go thru the muliple by ien
 E  D DIMP(D_"""B"",DICOB,D)) Q:D'>0  I $D("_DICOR_DICOMPXE) S D="N DICOB S DICOB="""" F  S DICOB=$O("_DICOR_"""B"",DICOB)) Q:DICOB=""""  "_X_" Q:'$D(D)" ;We will go thru the multiple using the B X-ref
 D DIMP($$I(Y)_D)
 I DICOPS'?1P S K(K+1,2)=1 ;If it is just a multiple, it can't be followed by an operator (see BINOP^DICOMP)
 S (T,DG(DLV0))=DG(DLV0)+1,K(K+2,1)=DLV0,DG(DLV0,T)=Y,M(Y,DLV0+Y)=T
 S X=X_":D"_(Y-1)_">0"
DICOXR S X=X_" S X="_$S(DIMW["m"!'$D(DICOXR):"""""",1:DICOXR)
 Q
 ;
CONTAINS N DICON
 S DICON=W="'",%=$E(I,M+DICON) I %=""!(W=")") S Y=0 Q
 I DICOPS[% S DICOPS=% D R($E(I,M+DICON+1,999)) Q:'$D(Y)  D  Q
 .S DICOXR=$$DGI^DICOMP
 .D DIMP("S Y=X "_X_" I Y"_DICOPS_"X S "_DICOXR_"="_'DICON_" K D") S DICMX=X
 .S K(K+1)=" S "_DICOXR_"="_DICON,K=K+1
 .S DBOOL=1,DIMW=""
COLON I W'=":" Q:W=""  S DICOMPX("X")="X",I="X"_$E(I,M,999),M=0 I DICOPS="[" K Y Q
 N DQI D R($E(I,M+1,999)) Q:'$D(Y)  I '$D(DICO("RCR")) S DICO("RCR")=Y
 I Y#100=0 S W=$G(J(+Y)) I W S DICO("PT")=W
 S DICMX=X_" "_$G(DICMX) Q  ;The 'X" code that we got back from RCR becomes what we eXecute for every multiple!
 ;
R(DICORM) N DICOLEFT,DICOX S DICOLEFT="",DICOX=0 F %=1:1 S W=$E(DICORM,%) Q:W=""  S:W="(" DICOX=DICOX+1 I W=")" S DICOX=DICOX-1 I DICOX<0 S DICOLEFT=$E(DICORM,%,999),DICORM=$E(DICORM,1,%-1)
 S DICOX=$G(X) D RCR(DICORM)
 S W="",M=0,I=DICOLEFT S:'$D(Y) I=DICORM,X=DICOX Q
 ;
RCR(W) ;Tricky and important!  What we get from this recursion will be inserted into the larger expression.
 N D
 S:+W=W W=""""_W_"""" S D="ZXM"_$$DIMC_" S"_DICOMP D  ;Don't allow MUMPS. Remember where to start more nodes in X array.  Allow simple numeric.
 .N X,DICOMP,DLV,DICMXSV,K
 .S X=W,DICOMP=D I $D(DICMX) S DICMXSV=DICMX
DQI .I $D(DQI) S %=DQI N DQI S DQI=%_$$DIMC_","
 .D EN1^DICOMP ;Here is the recursion!  I & J, the context, will be preserved by this entry point
 .I '$D(X) K Y Q
 .K W M W=X
 .I Y["m" K DICMXSV
 .I $D(DICMXSV) S DICMX=DICMXSV
 I $D(Y) M X=W D DIMP(X),DATE^DICOMP0:Y["D" ;Remember if it's a DATE
 Q
 ;
DIMP(D) ;
 N DIM
 S DIM=$$DIMC,DIM=DIM+$S(DIM<9.8:.1,1:.01)
 S X(DIM)=D,X=" X "_$$DA_DIM_")" Q
 ;
DA() Q $S(DA:"^DD("_A_","_DA_",",1:DA)
 ;
DIMC() N DIM
 S DIM=$O(X(99),-1) I 'DIM S DIM=+$P(DICOMP,"M",2) I 'DIM S DIM=9.1
 Q DIM
 ;
X ;
 S X="S X=$P(^(0),U)"_$S(X["D"&'$D(DPS($$NEST^DICOMP,"INTERNAL")):",Y=X X ^DD(""DD"") S X=Y",X["P":" S:$D(^"_$P(^(0),U,3)_"+X,0)) X=$P(^(0),U)",X["S":",Y=$F(^DD("_+D_",.01,0),X_$C(58)) S:Y X=$P($E(^(0),Y,999),$C(59),1)",1:""),DIMW="m" Q
 ;
I(LEV) N S
 S S=DLV0+LEV I DICOMP'["I"!'$D(I(S)) Q ""
 Q "S I("_S_")="""_$$CONVQQ^DILIBF(I(S))_""",J("_S_")="_J(S)_" "
 ;
REF(T) ;
 N L,D,X,V
 F L=T\100*100:1:T S D=I(L) S X=$G(X)_D_$E(",",$D(X))_$S(L<DLV0:"I("_L_",0)",1:"D"_(L#100))_","
 Q $E(X,1,$L(X)-1)

DICQ
DICQ ;SFISC/XAK,TKW-HELP FOR LOOKUPS ;26DEC2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S DZ=X D:DIC(0)]"" DQ
 I '$D(DDS),$G(DDH) D ^DDSU
 S:$D(DZ) X=DZ K DZ,DDH,DIZ,DDD I $D(DTOUT) S Y=-1 D Q^DIC2 Q
 D A^DIC Q
 ;
DQ ; Main entry point for displaying online ^DIC help (list of current
 ; entries in a file.
 N %,%Y,X,Y,DD,DDC,DDD,DS,DID01,DICNT,DIDONE,DIFROM,DIPART,DIW,DIX,DIY,DIZ,DIUPRITE,DST,DIBEGSUB,DIBEGIX
 I $D(DZ)[0 N DZ S DZ=""
 S DDC=$S($D(DDS):7,1:$G(IOSL,24)-9) ;USE SCREEN LENGTH
 N:'$D(DDH) DDH S DDH=+$G(DDH)
 S DIBEGIX=D
 I $D(DIRECUR)[0 N DIRECUR S DIRECUR=0
 I '$D(DO(2)) N DO D GETFA^DIC1(.DIC,.DO)
 I DO="0^-1" K DO S DST="  Pointed-to File does not exist!" D % Q
 S DICNT=$P(DO,U,4),DIY=DO D DIY
NUMEGP S X=$S($D(^DD(+DO(2),.001,0)):$$LABEL^DIALOGZ(+DO(2),.001),DIC(0)["N":$$EZBLD^DIALOG(7099),1:""),DIUPRITE=X]"" ;**CCO/NI "NUMBER"
 S DIW=^DD(+DO(2),.01,0),DIW=$P(DIW,U,2,3)
 G:$D(^DD(+DO(2),0,"QUES")) @^("QUES")
 I DIUPRITE S DS=.001 D DS
DQ1 I $G(DIFILEI),$G(DINDEX)]"" M DIX=DINDEX
 E  N DIFILEI,DIENS K % M %=DA N DA M DA=% K % D
 . D GETFILE^DIC0(.DIC,.DIFILEI,.DIENS)
 . S DIX=$G(D),DIX("WAY")=1 D INDEX^DICUIX(.DIFILEI,"hl",.DIX)
 . Q
 S DIBEGSUB=DIX("#")
 I DIFILEI="" D % Q
 I $D(DIC("?N",DIFILEI)) S DDC=DIC("?N",DIFILEI)
 S DIFROM=""
 N DISAVIX M DISAVIX=DIX
 D IX K DISAVIX
 I 'DICNT D 0 Q
 S DIDONE=0 I DZ'="??" D  I DIDONE D 0 Q
 . D DSPFLD Q:DICNT<11
 . N DIOUT S DIOUT=0 F  D ASKCUR Q:DIOUT
 . Q
 D EN^DICQ1
 Q
 ;
IX N DD,DIF,DIFIL,DIFLD,DIFORCE,DIEND,DITMP,I,P,F,X,%
 S (DD,%)="",DID01=0,DIF="h"_$P("M^",U,DIC(0)["M")
 S DIFORCE=$S($D(DID):1,1:0),DIFORCE(0)=$S($D(DID):DID,1:"*"),DIFORCE(1)=1
 F  D  Q:DIX=""!(DIC(0)'["M")
 . S DIEND=$S(DIX=DIBEGIX:DIX("#"),1:1)
 . S (P,DS)="" F I=1:1:DIEND D
 . . S DIFIL=$G(DIX(I,"FILE")),DIFLD=$G(DIX(I,"FIELD"))
 . . I DIFIL,DIFLD Q:$D(DITMP(DIFIL,DIFLD))  S DITMP(DIFIL,DIFLD)=""
 . . I DIX=DIBEGIX D
 . . . I DIFIL=DIFILEI,DIFLD=.01,DIX("FLISTD")[("^"_.01_"^") S DID01=1
 . . . S DS=.002 Q
 . . E  S X=DIFLD S:DIFILEI'=DIFIL X=DIFIL_" "_DIFLD S:DS]"" DS=DS_"^" S DS=DS_X
 . . S X=$G(DIX(I,"PROMPT"))
FIELDNM . . I $D(^DD(+DIFIL,+DIFLD,0))#2 S X=$$LABEL^DIALOGZ(+DIFIL,+DIFLD) ;**CCO/NI  NAME OF LOOKUP FIELD
 . . I I=1 S %=DIX(1,"TYPE")
 . . Q:X=""  I DIX("#")=1,X=$G(DS(.002)) Q
 . . I $L(X)+$L(P)'>70 S P=P_$P(" & ^",U,P]"")_X Q
 . . S:P'["..." P=P_"..." Q
 . I P]"",DS]"" S X=P D DS
 . I @("$D("_DIC_"DIX))>9!$D(DF)"),DD="" S DD=DIX,DIW=% S:'DICNT DICNT=2 S:'$D(^(DD)) DICNT=0,DIUPRITE=0
 . I DIC(0)'["M" S DIX="" Q
 . D NXTINDX^DICF2(.DIX,.DIFORCE,.DIFILEI,DIF,"","*") Q:DIX=""
 . D INDEX^DICUIX(.DIFILEI,"hql",.DIX) Q
 K DIX
 I DIBEGIX=DD M DIX=DISAVIX
 E  S (DIBEGIX,DIX)=DD I DIX]"" S DIX("WAY")=1 D INDEX^DICUIX(.DIFILEI,"hl",.DIX)
 I DD="" S DIUPRITE=1 I $O(^DD(DIFILEI,0,"IX","AZ"))]""!($O(^DD("IX","BB",DIFILEI,"AZ"))]"") S DICNT=0
 S:DZ["BAD" DICNT=0
 Q
 ;
DSPFLD ; Display list of lookup fields
 N X S DST=$$EZBLD^DIALOG(8063,$P(DO,U)),DS=0
 F X=1:1 S DS=$O(DS(DS)) Q:DS=""  D
 . S:X>1!$G(DS(0)) DST=DST_$$EZBLD^DIALOG(8067)
 . D:$L(DST)+$L(DS(DS))>70 N S DST=DST_" "_DS(DS) Q
 K DS S DST=DST_$E(":",DICNT) D %
 Q
 ;
ASKCUR ; Ask if user wants to see existing entries
 N A1 S DDH=DDH+1,A1=0_U_$$EZBLD^DIALOG(8064)
 I DO(2)'["s",'$D(DIC("S")),'$D(DIC("V")),'$D(DF),'$D(DIC("?PARAM",DIFILEI)) S A1=A1_$$EZBLD^DIALOG(8065,DICNT)
 S DDH(DDH,"Q")=A1_$$EZBLD^DIALOG(8066,$P(DO,U))
 S:$D(DDS) DDD=1 D ^DDSU
 I '$D(DDS),$D(DTOUT) S (DIOUT,DIDONE)=1 Q
 I $D(DDS) S %=1 I $D(DDSQ) S (DIOUT,DIDONE)=1 Q
 ; Process answer to question about seeing existing entries.
 S A1="T",DDH=+$G(DDH)
 S:%=1 %Y=1
 I %Y'="??" D
 . N F S F=$E(%Y,2,99) I $E(%Y)="^",F]"" S DIFROM=F
 . S %Y=F Q
 S:%=2&(DIC(0)["L") DZ=""
 I (%#2)=0!(%<0&(%Y="")) S (DIOUT,DIDONE)=1 Q
 I DIFROM="" S DIOUT=1 Q
 S DIUPRITE=$S(+$P(DIFROM,"E")=DIFROM:1,DIBEGIX]"":0,1:DIUPRITE)
 I +$P(DIFROM,"E")=DIFROM S DIOUT=1 Q
 Q:DIBEGIX=""  I $P(DIW,U,1)'["D" S DIOUT=1 Q
 N %DT,Y S X=DIFROM,%DT="T" D ^%DT S DIFROM=Y,DIUPRITE=0
 I DIFROM<0 S DST=$C(7) D % Q
 S DIOUT=1 Q
 ;
DSPHLP(DIC,DIFILE,DINDEX,DZ,DINOKILL) ; Display online help for lookups (^DIC)
 N D S D=DINDEX
 I $D(DIBTDH) K DIBTDH Q
 S:$D(DDSXEC) DIBTDH=1 ; Set only if there is eXecutable Help to prevent repeated '??' display from AST^DIEQ
 I DIC(0)]"" D DQ Q:$G(DINOKILL)
 I '$D(DDS),$G(DDH) D ^DDSU
 I $D(DTOUT) S Y=-1 D Q^DIC2 Q
 D A^DIC Q
 ;
N D % S DST="    " Q
 ;
% ;CALLED FROM ^DICQ1
 S DDH=$G(DDH)+1,DDH(DDH,"T")=DST K DST Q
 ;
0 Q:$D(DTOUT)!(DIC(0)'["L")  K DIW,DIUPRITE S:$D(DDS) DDD=1 D 0^DICQ1 Q
 ;
DIY S DIY=$P(^DD(+$P(DIY,U,2),.01,0),"$L(X)>",2),DIY=$S(DIY:DIY,1:30)+7 Q
 ;
SOUNDEX G DQ1
 ;
DS S:DO'[X DS(DS)=X I DO[X,$G(DZ)'["??" S DS(0)=1
 Q
 ;
 ;
 ;
 ;#8063  Answer with |Filename|
 ;#8064  Do you want the entire
 ;#8065  |Number of entries| Entry
 ;#8066  |Filename| List
 ;#8067  , or
 ;#8068  Choose from ; couldn't find a reference SO 8/11/00

DICQ1
DICQ1 ;SFISC/GFT,TKW-HELP FOR LOOKUPS ;3JUN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ; Set up parameters for lister call, then display current entries.
 I 'DIRECUR,'$D(DDS) D Z^DDSU
 I DICNT>1,$D(DZ)#2 S DST=" " D:DZ["??"&'$D(DDS) %^DICQ S DST=$$EZBLD^DIALOG(8068) D %^DICQ
 N DISCR S:$G(DIC("S"))]"" DISCR("S")=DIC("S")
 I $D(DIC("V")) M DISCR("V")=DIC("V")
 S %=$G(DIC("?PARAM",DIFILEI,"INDEX")) I %]"" D
 . S (DIX,DIBEGIX)=%,DIX("WAY")=1 D INDEX^DICUIX(.DIFILEI,"hl",.DIX) Q
 I $O(DIC("?PARAM",DIFILEI,"PART",0)) S DIPART(1)="",%=0 D
 . F  S %=$O(DIC("?PARAM",DIFILEI,"PART",%)) Q:'%  I '(%#1) S DIPART(%)=DIC("?PARAM",DIFILEI,"PART",%)
 . S DIPART=DIPART(1) Q
 N DIFLAGS,DIFIELDS,DIIENS S DIFLAGS="MPh"
 I 'DIUPRITE,"PV"[$G(DIX(1,"TYPE")) D
 . N DIFRPRT S DIFRPRT=DIFROM_$G(DIC("?PARAM",DIFILEI,"FROM",1))_$G(DIPART)
 . Q:'$$CHKP^DICUIX1(.DIFILEI,.DIX,DDC,DIFRPRT,.DISCR,1)
 . S DIFLAGS="MPQh" K DIFROM S DIFROM="" Q
 I DIUPRITE S DID01=0,DIBEGIX="#"
 S DIIENS=$S(DIC(0)["p":",",1:DIENS)
W S DIFIELDS="@;IX" D
 .I 'DIUPRITE,DID01!(DIC(0)["S") K DID01 Q
 .N EXT S EXT="$$EXT^DIC2("_DIFILEI_",.01,$P("_DIC_"Y,0),U))"
 .I '$D(DDS)!'$D(DDSMOUSY) S DIC("DID01")="W ""   "","_EXT Q
 .S DIC("DID01")="W ""   "" D WRITMOUS^DDSU("_EXT_")"
E1 K DDD S DD="",DIY=99,DDD=$S($D(DDS):1,1:5),(DIZ,DILN)=21
 I $D(DDH)>10 D LIST^DDSU Q:$D(DDSQ)
 I DIFROM]"" D  S DIFROM(1)=DIFROM
 . I +$P(DIFROM,"E")=DIFROM S DIFROM=DIFROM-.00000001 Q
 . N M F %=$L(DIFROM):-1:1 S M=$A(DIFROM,%) I M>32 S DIFROM=$E(DIFROM,1,%-1)_$C(M-1)_$C(122) Q
 . Q
 I DIFLAGS'["Q" S %=$G(DIC("?PARAM",DIFILEI,"FROM",1)) I %]"" D
 . S:DIFROM="" (DIFROM,DIFROM(1))=% S %=1
 . F  S %=$O(DIC("?PARAM",DIFILEI,"FROM",%)) Q:'%  I '(%#1) S DIFROM(%)=DIC("?PARAM",DIFILEI,"FROM",%)
 . Q
 ;
L ; List current entries in the file.
 N DICQ
 D LIST^DICL(.DIFILEI,DIIENS,DIFIELDS,DIFLAGS,DDC,.DIFROM,.DIPART,DIBEGIX,.DISCR,"","DICQ","",.DIC)
 K DIC("DID01"),DICQ
 D BK^DIEQ S:'$D(DDS) DDD=3 ;D LIST^DDSU ***
 K DDH Q:$D(DDSQ)!($G(DTOUT))
 D 0 Q
 ;
DSP(DINDEX,DICQ,DIC,DIFILE) ; Display entries from DICQ array
 ; note: this routine is called from the lister, DICLIX & DICL1.
 N I,J,F,X,Y,DD,DDD,DIY,DILN,DIZ,DIMAP,DDH,DID01,DIQUIET,DIPGM,DST,DISPACE,DIERR,DP
 S DIMAP=$G(DICQ(0,"MAP")),DDH=0,DST="",DIPGM="DICQ1",$P(DISPACE," ",10)=""
 S:$G(DIC("DID01"))]"" DID01=DIC("DID01")
 N DIKEYL,DIKEY I $O(DIFILE(DIFILE,"KEY",DIFILE,0)),DIC(0)'["S" M DIKEYL=DIFILE(DIFILE,"KEY",DIFILE)
 I $D(DIC("W"))!($D(DID01))!($D(DIKEYL)) D ID
 F I=0:0 S I=$O(DICQ(I)) Q:'I  S X=$G(DICQ(I,0)) I X]"" D
 . S DST=""
 . I DINDEX="#" S DST=$P(X,U)_"  " S:$L(DST)<7 DST=DST_$E(DISPACE,($L(DST)+1),7)
 . I $D(DIKEYL) S DIKEY(+X)="" F J=0:0 S J=$O(DIKEYL(J)) Q:'J!$G(DIERR)  F F=0:0 S F=$O(DIKEYL(J,F)) Q:'F!$G(DIERR)  D
 . . I (F=.01&($D(DID01))!(DINDEX("FLISTD")[("^"_F_"^"))) D  Q
 . . . S:DIKEY(+X)="" DIKEY(+X)=" " Q
 . . S Y=$$GET1^DIQ(DIFILE,+X_DIFILE(DIFILE,"KEY","IEN"),F,"","","DIERR") Q:$G(DIERR)
 . . I ($L(DIKEY(+X)))+($L(Y))+2>240 S DIERR=1 Q
 . . S DIKEY(+X)=DIKEY(+X)_$P("  ^",U,DIKEY(+X)]"")_Y Q
 . F J=2:1 Q:$P(DIMAP,U,J)=""  S Y=$P(X,U,J) D:$P(DIMAP,U,J+1)]""  S:$L(DST_Y)<240 DST=DST_Y
 . . S Y=Y_"   "
 . . I J=(DINDEX("#")+1) S Y=Y_"   "
 . . Q
 . I DST]"" S Y=+X,DDH=DDH+1,DDH(DDH,Y)=DST_"   "
 . Q
 S DD="",DIY=99,DDD=5,DP=DIFILE
 I '$G(DIC("?N",DIFILE)) S (DIZ,DILN)=21
 E  S (DIZ,DILN)=999
 D LIST^DDSU K DICQ
 K DIERR,^TMP("DIERR",$J)
 Q
 ;
ID ; Put code to display .01 field and Identifiers into DDH array.
 S DIY="I $D("_DIC_"Y,0))" I $D(DID01) S DIY=DIY_" "_DID01_" "_DIY
 I $D(DIKEYL) S:$D(DID01) DIY=DIY_" W ""  """ S DIY=DIY_" W DIKEY(Y)"
 I '$D(DIC("W")) S DDH("ID")=DIY Q
 S DIY=DIY_" "
 I $L(DIC("W"))+$L(DIY)<240 S DDH("ID")=DIY_DIC("W") Q
 S DDH("ID")=DIY_"X DDH(""ID"",1)" S DDH("ID",1)=DIC("W") Q
 ;
WOV N DIC,Y,DI1X,DIY,DIYX,%,C,DINAME S DIC=DIGBL,Y=DIEN,DI1X=0
W1 F  S DI1X=$O(^DD(DIFILEI,0,"ID",DI1X)) Q:DI1X=""  S %=^(DI1X) D
 . X "W ""  "",$E("_DIGBL_DIEN_",0),0)",%
 Q
 ;
0 ; If LAYGO allowed, display additional help.
 K DDC,DIEQ,DIW,DS I DIC(0)'["L" D QQ Q
 I $D(%Y)#2 S:%Y="??" DZ=%Y S:%Y?1P DZ="?"
 S DDH=+$G(DDH) N A1,DIACCESS S DIACCESS=1
 I $S($D(DLAYGO):DIFILEI-DLAYGO\1,1:1),DUZ(0)'="@",'$D(^DD(DIFILEI,0,"UP")) D CHKACC
 I '$G(DIACCESS) D RCR Q
10 ; Tell user that they may enter new entries to the file
 I DZ?1."?" S DST=" " D DS^DIEQ S DST=$$EZBLD^DIALOG(8069,$P(DO,U)) D DS^DIEQ D:DZ="?" HP
 D H
 I DO(2)["S" S DST=$$EZBLD^DIALOG(8068)_" " D %^DICQ D
 . N X,Y,A2,DST,DISETOC,DIMAXL S DIMAXL=0,DISETOC=$P(^DD(+DO(2),.01,0),U,3)
 . F X=1:1 S Y=$P($P(DISETOC,";",X),":") Q:Y=""  S:$L(Y)>DIMAXL DIMAXL=$L(Y)
 . S DIMAXL=DIMAXL+4
 . F X=1:1 S Y=$P(DISETOC,";",X) Q:Y=""  S A2="",$P(A2," ",DIMAXL-$L($P(Y,":")))=" ",DST="  "_$P(Y,":")_A2_$P(Y,":",2) D DS^DIEQ
 . Q
 I DO(2)["V" D
 . N DG,DU,D
 . S DU=+DO(2),D=.01 D V^DIEQ Q
 ;
RCR ; Recursive call to display entries on pointed-to file.
 I DO(2)'["P"!($G(DZ(1))=0) D QQ Q
 N %,D,DS,DIPTRIX S D=""
 S DS=^DD(+DO(2),.01,0)
 S DIPTRIX=$G(DIC("PTRIX",+DO(2),.01,+$P($P(DS,U,2),"P",2)))
 M %=DIC("PTRIX"),%(1)=DIC("?N"),%(2)=DIC("?PARAM")
 N DIC M DIC("PTRIX")=%,DIC("?N")=%(1),DIC("?PARAM")=%(2) K %
 S DIC=U_$P(DS,U,3),DIC(0)=$E("L",$P(DS,U,2)'["'")
 I $P(DS,U,2)["*" D
 . N DILCV,DICP,DIPTRIX,DISAV0 S DISAV0=DIC(0)
 . F DILCV=" D ^DIC"," D IX^DIC"," D MIX^DIC1" S DICP=$F(DS,DILCV) I DICP D  S DIC(0)=DISAV0
 . . X $P($E(DS,1,DICP-$L(DILCV)-1),U,5,99) Q
 . S D=$P($G(D),U) Q
 S:DIPTRIX]"" D=$P(DIPTRIX,U) K DIPTRIX,DS
 N DO,DIFILEI,DINDEX I D="" S D="B"
 S DIRECUR=DIRECUR+1
 D DQ^DICQ
QQ Q:$D(DDH)'>10
 K DDD S DD="",DIY=99,DDD=$S($D(DDS):1,1:5),(DIZ,DILN)=21
 S:$D(DDS) DDC=-1 D LIST^DDSU K DDC Q
 ;
HP N DG,X,%,DST
EGP S X=$$HELP^DIALOGZ(+DO(2),.01) D  S X=$G(^DD(+DO(2),.01,12)) D  ;**CCO/NI PLUS NEXT LINE   WRITE HELP MESSAGE FOR .01 FIELD
 .I X]"" F %=$L(X," "):-1:1 I $L($P(X," ",1,%))<70 S DST=$P(X," ",1,%) D DS^DIEQ,P1 Q
 Q
 ;
P1 I %'=$L(X," ") S DST=$P(X," ",%+1,99) D DS^DIEQ
 Q
 ;
H ; Display eXecutable help and long description for .01 field.
 N %,X,DIPGM S %=DIC,X=DZ,DIPGM="DICQ1" D
 . N DIC,D,DP,DIFILEI,DINDEX,DZ S DZ=X
 . S DIC=%,D=.01,DP=+DO(2) D H^DIEQ Q
 Q
 ;
CHKACC ;Check file access
 N A1,DIFILE,DIAC,% S DIFILE=+DO(2),DIAC="LAYGO",%=0 D ^DIAC
 S:% DIACCESS=1 Q
 ;
 ;#8069  You may enter a new |filename|, if you wish
 ;#8068  Choose from

DICR
DICR ;SFISC/GFT-RECURSIVE CALL FOR X-REFS ON TRIGGERED FLDS ;6DEC2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 3
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;From a TRIGGER on field DIH,DIG
 ;DIU is old value, DIV new
AUDIT I $P(^DD(DIH,DIG,0),U,2)["a" D  ;NOIS ISB-1102-31285
 .N DIANUM,DIIX,C,DP
 .I DIU]"" S X=DIU,DIIX=2_U_DIG,DP=DIH D AUDIT^DIET
 .I DIV]"",^DD(DIH,DIG,"AUDIT")'="e"!(DIU]"") S X=DIV,DIIX=3_U_DIG,DP=DIH D AUDIT^DIET ;Don't audit NEW if there's no OLD and mode is EDIT ONLY
 Q:'$O(^DD(DIH,DIG,1,0))&'$D(^DD("IX","F",DIH,DIG))
 N DICRIENS,DICRBADK
 I $D(^DD("KEY","F",DIH,DIG)) D  Q:$G(DICRBADK)
 . N DICRFDA,DICRMSG,DIERR
 . D SAVE
 . S DICRIENS=$$IENS(DIH,.DA)
 . S DICRFDA(DIH,DICRIENS,DIG)=DIV
 . I '$$KEYVAL^DIE("","DICRFDA","DICRMSG") D
 .. S DICRBADK=1
 .. S X=DIU X $$HSET(DIH,DIG)
 . D RESTORE
 ;
 I DIU]"" F DIW=0:0 S DIW=$O(^DD(DIH,DIG,1,DIW)),X=DIU Q:'DIW  I $P(^(DIW,0),U,3)=""!'$D(DB(0,DIH,DIG,DIW,2)) S DB(0,DIH,DIG,DIW,2)=1 D SAVE X ^(2) D RESTORE
 I DIV]"" F DIW=0:0 S DIW=$O(^DD(DIH,DIG,1,DIW)),X=DIV Q:'DIW  I $P(^(DIW,0),U,3)=""!'$D(DB(0,DIH,DIG,DIW,1)) S DB(0,DIH,DIG,DIW,1)=1 D SAVE X ^(1) D RESTORE
 ;
 I $D(^DD("IX","F",DIH,DIG)) D
 . N DICRCTRL,DICRVAL,I
 . D SAVE
 . S:$D(DICRIENS)[0 DICRIENS=$$IENS(DIH,.DA)
 . S DICRVAL(DIH,DICRIENS,DIG,"O")=DIU
 . S DICRVAL(DIH,DICRIENS,DIG,"N")=DIV
 . S:$G(DICRREC)]"" DICRCTRL="r"
 . S DICRCTRL("VAL")="DICRVAL("
 . D INDEX^DIKC(DIH,.DA,DIG,"",.DICRCTRL)
 . D:$G(DICRREC)]"" @DICRREC
 . D RESTORE
Q Q
 ;
SAVE F DB=1:1 Q:'$D(DB(DB))
 F Y="DIC","DIV","DA" S %="" F DB=DB:0 S @("%=$O("_Y_"(%))") Q:%=""  S DB(DB,Y,%)=@(Y_"(%)")
 F %="DIC","DIW","DIU","DIV","DIH","DIG","DB","DG","DA","DICR" S DB(DB,%)="" I $D(@%)#2 S DB(DB,%)=@%
 K DA F Y=-1:1 Q:'$D(DIV(Y+1))
 I Y+1 S DA=DIV(Y) F %=Y-1:-1:0 S DA(Y-%)=DIV(%)
 Q
 ;
RESTORE F DB=1:1 Q:'$D(DB(DB+1))
 F Y="DIC","DIV","DA" K @Y S %="" F DB=DB:0 S %=$O(DB(DB,Y,%)) Q:%=""  S @(Y_"(%)=DB(DB,Y,%)")
 S Y="" F %=0:0 S Y=$O(DB(DB,Y)) Q:Y=""  S @Y=DB(DB,Y)
 K DB(DB) K:DB=1 DB Q
 ;
DICL N I
 K DIC("S"),DLAYGO I '$P(Y,U,3) K DIC Q
DICADD ;
 S (D0,DIV(0))=+Y,DIV(U)=Y
 I DIC S DIH=DIC,DIC=^DIC(DIC,0,"GL")
 E  S @("DIH=+$P("_DIC_"0),U,2)")
 S DICR=$S($D(DA)#2:DA,1:0),DA=D0 F DIG=.001:0 S DIG=$O(DIC(DIG)) Q:DIG'>0  D U:DIC(DIG)]""
 S DA=DICR,Y=DIV(U) K DIC Q
 ;
U S %=$P(^DD(DIH,DIG,0),U,4),Y=$P(%,";",2),%=$P(%,";",1),X="",DIV=DIC(DIG) I @("$D("_DIC_DIV(0)_",%))") S X=^(%)
 G P:Y,Q:Y'?1"E"1N.NP S D=+$E(Y,2,9),Y=$P(Y,",",2),DIU=$E(X,D,Y) I DIU?." " S DIU="" S:$L(X)+1<D X=X_$J("",D-1-$L(X))
 S ^(%)=$E(X,1,D-1)_DIV_$E(X,Y+1,999)
 G DICR
P S DIU=$P(X,U,Y),$P(^(%),U,Y)=DIV
 G DICR
CONV ;
 K DA F %=0:1 Q:'$D(@("D"_%))
 S %=%-1 I '% S DA=D0 K % Q
 S DA=@("D"_%),%=%-1,Y=0
 F %1=%:-1:0 S Y=Y+1,DA(Y)=@("D"_%1)
 K %,%1,Y
 Q
SD ;
 S DIV(0)=DA D U:DA>0 K DA,DIH,DIG,DIV Q
 ;
TRIG(DICRLIST,DICROUT) ;Modify the trigger logic of fields that trigger fields
 ;in DICRLIST so that they call ^DICR unconditionally.
 ;In:
 ; DICRLIST(file#,field#) = array of potentionally triggered fields
 ;Out:
 ; DICROUT(file,field)="" (of triggering field modified)
 ;
 N DICRFIL,DICRFLD
 S DICRFIL=""
 F  S DICRFIL=$O(DICRLIST(DICRFIL)) Q:'DICRFIL  D
 . S DICRFLD=""
 . F  S DICRFLD=$O(DICRLIST(DICRFIL,DICRFLD)) Q:'DICRFLD  D TRMOD(DICRFIL,DICRFLD,.DICROUT)
 Q
 ;
TRMOD(DICRFIL,DICRFLD,DICROUT) ;Modify the trigger logic of fields that
 ;trigger a field so that they call ^DICR unconditionally.
 ;In:
 ; DICRFIL = file# of triggered field
 ; DICRFLD = triggered field#
 ;Out:
 ; DICROUT(file,field)="" (of triggering field modified)
 ;
 ;Loop through 5 node to get triggering fields/xrefs
 N DICRN,DICRFL,DICRFD,DICRXR
 S DICRN=0
 F  S DICRN=$O(^DD(DICRFIL,DICRFLD,5,DICRN)) Q:'DICRN  D
 . S DICRXR=$G(^DD(DICRFIL,DICRFLD,5,DICRN,0))
 . S DICRFL=+$P(DICRXR,U),DICRFD=+$P(DICRXR,U,2),DICRXR=+$P(DICRXR,U,3)
 . Q:'DICRFL!'DICRFD!'DICRXR
 . D MOD(DICRFL,DICRFD,DICRXR,.DICROUT)
 Q
 ;
MOD(DICRFL,DICRFD,DICRXR,DICROUT) ;Modify trigger logic
 ;In:
 ; DICRFL = file# of triggering field
 ; DICRFD = field# of triggering field
 ; DICRXR = xref# of trigger
 ;Out:
 ; DICROUT(file,field)="" (if trigger was modified)
 ;
 Q:'$D(^DD(DICRFL,DICRFD,1,DICRXR))
 N DICRMOD,DICRND,DICRSTR,DICRVAL
 ;
 ;Loop through xref nodes
 S DICRND=0
 F  S DICRND=$O(^DD(DICRFL,DICRFD,1,DICRXR,DICRND)) Q:'DICRND  D
 . S DICRVAL=$G(^DD(DICRFL,DICRFD,1,DICRXR,DICRND)),DICRMOD=0
 . F DICRSTR="D ^DICR:$O(^DD(DIH,DIG,1,0))>0","D ^DICR:$N(^DD(DIH,DIG,1,0))>0" D
 .. F  Q:DICRVAL'[DICRSTR  D
 ... S DICRVAL=$P(DICRVAL,DICRSTR)_"D ^DICR"_$P(DICRVAL,DICRSTR,2,999)
 ... S DICRMOD=1
 . Q:'DICRMOD
 . S ^DD(DICRFL,DICRFD,1,DICRXR,DICRND)=DICRVAL
 . S DICROUT(DICRFL,DICRFD)=""
 Q
 ;
IENS(FIL,DA) ;Build IENS
 N I,IENS
 S IENS=DA_","
 F I=1:1:$$FLEV^DIKCU(FIL) S IENS=IENS_DA(I)_","
 Q IENS
 ;
HSET(FIL,FLD) ;Hard set a value in the file
 Q:$P($G(^DD(FIL,FLD,0)),U)="" ""
 ;
 N HSET,ND,PC,OROOT
 S PC=$P($G(^DD(FIL,FLD,0)),U,4)
 S ND=$P(PC,";"),PC=$P(PC,";",2) Q:ND?." "!("0 "[PC) ""
 S:ND'=+$P(ND,"E") ND=""""_ND_""""
 ;
 S OROOT=$$FROOTDA^DIKCU(FIL,"O")_"DA," Q:OROOT="DA,"
 I PC S HSET="S $P("_OROOT_ND_"),U,"_PC_")=X"
 E  S HSET="S $E("_OROOT_ND_"),"_+$E(PC,2,999)_","_$P(PC,",",2)_")=X"
 Q HSET

DICRW
DICRW ;SFISC/XAK-SELECT A FILE ;17SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
R D DT S D=8101,DIC(0)="QEI",DIA=$G(^DISV(DUZ,"^DIC(")) ;**CCO/NI 'OUTPUT FROM WHAT FILE'
 D R1,DIC K DIAC,DIFILE,DIC("S") Q:$D(DTOUT)  G R:'$T,AU:+Y=1.1,A:+Y=.6
R2 I DUZ(0)'="@" S DICS="I 1 Q:'$D(^(8))  F DW=1:1:$L(^(8)) I DUZ(0)[$E(^(8),DW) Q"
 K DIA Q
 ;
AU S D=8105,DIC(0)="QEI" S:'$D(DIC("S")) DIC("S")="I $D(DDA)!$D(^DIA(+Y,0))"
 S:DIA ^DISV(DUZ,"^DIC(")=DIA D DIC Q:'$D(DIC)  G AU:Y<0
 S DIA=+Y,Y="1.1^"_$P(Y,U,2)_" AUDIT",DIC="^DIA(DIA,"
 Q
A S:'$D(DIC("S")) DIC("S")="S DIFILE=Y,DIAC=""DD"" D ^DIAC I %",DDA=""
 D AU Q:'$D(DIC)
 S %=$P(^DIC(DIA,0),U),Y=DIA D SUB I DIA'>0!$D(DTOUT)!$D(DUOUT) K DIC Q
 I '$D(^DDA(DIA,0)) W !,"  No DD AUDIT entries!" K DIC Q
 S Y=".6^"_$P(Y,U,2)_"DD AUDIT",DIC="^DDA(DIA,"
 Q
SUB I $D(DIT) S L=L+1,DFL(L)=$O(^DD(+Y,0,"NM","")),(DFF,DFF(L))=+Y,Y=-1
 S DIC="^DD("_Y_"," Q:$O(^DD(Y,"SB",0))'>0  Q:$D(DIT)
 S DIC(0)="AEQIZ",DIC("A")="Select "_%_" SUB-FILE: "
 S DIC("S")="I $P(^(0),U,2)" D ^DIC Q:Y<0!$D(DTOUT)  S Y=+$P(Y(0),U,2)
 S DIA=Y,%=$P($P(^DD(DIA,0),U)," SUB-FIELD")
 I $D(DIT) S X=$P($P(Y(0),U,4),";",1),DSUB(L)=$S(X:X,1:""""_X_"""")_","
 G SUB
 ;
R1 S DIC("S")="S DIFILE=+Y,DIAC=""RD"" D ^DIAC I %"
 Q
 ;
 ;
 ;
DT ;
 I $D(IO)#2,$D(IO(0))#2,IO=IO(0),IO=""
 E  W:'$G(DIQUIET) !
DTNOLF ; DT entry point without doing a line feed.
 S:$D(DUZ)#2-1 DUZ=0 S:$D(DUZ(0))#2-1 DUZ(0)="" S X=DUZ(0)="@" D 1
 I '$D(DTIME) S DTIME=300
 I '$D(DILOCKTM) S DILOCKTM=+$G(^DD("DILOCKTM"),1)
 K %DT,DT S:$D(IO(0))[0 IO(0)=$I D NOW^%DTC S DT=X,U="^"
 K DIK,DIC,%I,DICS,%,%H Q  ;**KILL VARIABLES
 ;
 ;
 ;
0 S X=0
1 D:'$D(DISYS) OS^DII
 Q
W ;
 D DT S D=$S('$D(DDS1):8100,1:DDS1),DIC(0)=$E("L",$D(DLAYGO)>0)_"EQI" ;**CCO/NI  'INPUT TO'
 D W1,DIC Q:$T!($D(DTOUT))  G W:'$P(Y,U,3) K DIC Q
W1 S DIC("S")="I Y>.19,Y-1,Y-1.1,Y-.6,Y-.403,Y-.404,Y-.31 S DIFILE=+Y,DIAC=""WR"" D ^DIAC I %"
 Q
DIC W ! S:D D=$$EZBLD^DIALOG(D) S U="^",DIC="^DIC(" ;**CCO/NI GET THE DIALOG TEXT
 I DUZ(0)'="@",DIC(0)'["L",$S($D(^VA(200,"AFOF")):1,1:$D(^DIC(3,"AFOF"))) S DIC=$S($D(^VA(200,"AFOF")):"^VA(200,",1:DIC_"3,")_"DUZ,""FOF"","
 I $D(^DISV(DUZ,DIC)) S Y=^(DIC) I $D(@(DIC_Y_",0)")) X:$D(DIC("S")) DIC("S") I  S Y=Y_U_$P(^DIC(Y,0),U),D=D_$P(Y,U,2)_"// "
 W D S %=$T R X:DTIME E  W $C(7) S X=U,DTOUT=1,Y=-1 K DIC Q
 I '$D(@(DIC_"0)")) W "  There are no selectable files." K DIC S Y=-1 Q
 S:DIC["FOF" DIC(0)=DIC(0)_"O" I X="",% G WW
 S DIC("W")=$P($T(WW1),";",3) D ^DIC I $D(DTOUT) K DIC Q
GOT I $D(^DIC(+Y,0,"GL")) K DIC S DIC=^("GL") Q
 I U[X K DIC
 Q
WW X $P($T(WW1),";",3) G GOT ;**CCO/NI SIMPLER XECUTE
 ;
D D DT S D=8102,DIC(0)="LQEI",DIC("S")="I Y'<2 S DIFILE=+Y,DIAC=""DD"" D ^DIAC I %" ;**CCO/NI 'MODIFY WHAT FILE'
 D DIC S:DUZ(0)'="@" DICS="I 1 Q:'$D(^(9))  Q:^(9)=U  F DW=1:1:$L(^(9)) I DUZ(0)[$E(^(9),DW) Q"
 Q:$T!($D(DTOUT))  G D:'$P(Y,U,3) K DIC
 Q
DIAR ;
 D DT S D=$S($D(DIAX):8103,1:8104),DIC(0)="QEI" D R1 S DIC("S")="I Y'<2 "_DIC("S") ;**CCO/NI 'EXTRACT' or 'ARCHIVE'
 D DIC G R2:$D(DTOUT)!(X="^")!(X="")!(Y>0&($P($G(^DD(+Y,0,"DI")),U)'["Y"))
 W:$P($G(^DD(+Y,0,"DI")),U)["Y" !,$C(7),"SORRY, THIS IS ALREADY AN ARCHIVE FILE!"
 G DIAR
 Q
T ; COMP/MERGE
 D DT S D=8106,DIC=1,DIC(0)="QEI" D W1,DIC Q:$T!($D(DTOUT))  G T ;**CCO/NI  'COMPARE'
 ;
WW1 ;;W:$X>53 !?9 I Y-1.1,Y-.6,$D(^DIC(+Y,0,"GL")),^("GL")'["[",$D(@(^("GL")_"0)")) S %=+$P(^(0),U,4) W ?40,$$EZBLD^DIALOG(%=1+8300,%) ;**CCO/NI  NUMBER OF ENTRIES

DICRW1
DICRW1 ;SFISC/XAK-SELECT A FILE ;11:06 AM  12 Oct 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
L ;LIST DD'S
 S DIB(1)=0 S D=8101.1 D C2 G C4:U[X&(Y<0),L:Y<0 ;**CCO/NI 'START WITH WHAT FILE'
C3 S D=8101.2 D C2 G C3:Y<0&(X'[U) ;**CCO/NI  'GO TO WHAT FILE'
ERR I Y<DIB(1),X'[U W $C(7),!,$$EZBLD^DIALOG(1510) G L ;**CCO/NI  START WITH > GO TO
C4 I X[U!'$D(DIC) K DIC Q
 S X=DIB(1),DIB(1)=+Y,Y=X Q
C2 D R1^DICRW D:$D(DDUC) DU S DIC(0)="QEI" D DIC^DICRW K DIAC,DIFILE Q:X[U!'$D(DIC)!(Y=-1)  S:DIB(1)=0 DIB(1)=+Y Q
DU S DIC("S")="I Y'<2 "_DIC("S")
 Q

DICU
DICU ;SEA/TOAD-VA FileMan: Lookup Utilities ;12APR2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
REQIDS(DIFILE,DITARGET) ;
 ; return REQUIRED IDENTIFIERS file attribute
 ; DIFILE = file#, DITARGET = target array
 N DIATTRBT S DIATTRBT="REQUIRED IDENTIFIERS"
 S @DITARGET@(DIATTRBT,.01)=""
 N DIFIELD
 S DIFIELD=0 F  S DIFIELD=$O(^DD(DIFILE,0,"ID",DIFIELD)) Q:'DIFIELD  D
 . I $D(^DD(DIFILE,"RQ",DIFIELD)) S @DITARGET@(DIATTRBT,DIFIELD)=""
 Q
 ;
RID(DIFILE) ;
 ; return a string listing a file's required identifiers
 ; DIFILE = file#
 N DILIST S DILIST=".01"
 N DID S DID="" F  S DID=$O(^DD(DIFILE,0,"ID",DID)) Q:'DID  D
 . I $D(^DD(DIFILE,"RQ",DID)) S DILIST=DILIST_U_DID
 Q DILIST
 ;
RECALL(DIFILE,DIEN,DIUSER) ;
RECALLX ; input from DILFD
 ;
 ; ENTRY POINT--save a user's selection for use with space-bar recall
 ; procedure, all passed by value
 ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DICLERR S DICLERR=$G(DIERR) K DIERR
 ;
30 S DIFILE=$G(DIFILE)
 I +DIFILE'=DIFILE!(DIFILE<0) D ERR(202,"","","","file") Q
 S DIEN=$G(DIEN) I DIEN="" S DIEN=","
 I '$$IEN^DIDU1(DIEN) D ERR(202,"","","","IEN string") Q
 S DIUSER=+$G(DIUSER)
 ;
32 N DIOROOT,DIOUT S DIOUT=0 D  I DIOUT Q
 . I '$D(^DD(DIFILE)) D ERR(401,DIFILE) S DIOUT=1 Q
 . S DIOROOT=$$ROOT^DILFD(DIFILE,DIEN,"Q")
 . I DIOROOT'?1"^"1.7AN1"(".ANP,DIOROOT'?1"^%".7AN1"(".ANP D  Q  ;JIM SELF --ALLOW LC GLOBAL NAMES
 . . D ERR(402,DIFILE,"","","","","",DIOROOT) S DIOUT=1
 S ^DISV(DIUSER,$E(DIOROOT,1,28))=$E(DIOROOT,29,$L(DIOROOT))_+DIEN
 I DICLERR'=""!$G(DIERR) D
 . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 Q
 ;
FILE(DIFILE,DIDA,DIFLAGS,DIROOT) ;
 ; entry point -- given a root, calculate the file # and DA
 ; DO NOT USE UNTIL $QS & $QL AVAILABLE
 N DIGLOBAL I $G(DIFLAGS)'["O" S DIGLOBAL=DIROOT
 E  S DIGLOBAL=$$CREF^DIQGU(DIROOT),DIROOT=DIGLOBAL
 S DIFILE=+$P($G(@DIGLOBAL@(0)),U,2),DIDA=""
 N DA,DIENTRY S DA=1,DIENTRY=0
 ;
LOOP N DICHAR,DIL,DILEAD,DIQL,DIQS,DIQSL F  D  Q:'DIQL
 .
STRIP .
 . ; S DIQL=$QL(DIGLOBAL) Q:'DIQL
 . ; S DIQS=$QS(DIGLOBAL,DIQL)
 . N DIQSL S DIQSL=$L(DIQS)+1 I +DIQS'=DIQS S DIQSL=DIQSL+2
 . S DIL=$L(DIGLOBAL),DILEAD=DIL-DIQSL
 . S $E(DIGLOBAL,DILEAD+1,DIL-1)=""
 . S DICHAR=$E(DIGLOBAL,DILEAD)
 . I DICHAR="," S $E(DIGLOBAL,DILEAD)=""
 . E  I DICHAR="(" S $E(DIGLOBAL,DILEAD,DILEAD+1)=""
 . E  S DIGLOBAL="ERROR:  "_DIGLOBAL,DIQL=0
 .
ENTRY . I DIENTRY D
 . . S DIFILE(DA)=+$P($G(@DIGLOBAL@(0)),U,2)
 . . S DIROOT(DA)=DIGLOBAL
 . . S DIDA(DA)=DIQS,DA=DA+1
 . S DIENTRY='DIENTRY
 Q
 ;
ERR(DIERN,DIFILE,DIIENS,DIFIELD,DI1,DI2,DI3,DIROOT) ;
 ;
 ; error logging procedure
 ; RECALL
 ;
 N DIPE,DI
 F DI="FILE","IENS","FIELD",1:1:3,"ROOT" S DIPE(DI)=$G(@("DI"_DI))
 D BLD^DIALOG(DIERN,.DIPE,.DIPE)
 S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 Q

DICU1
DICU1 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup Tools, Get IDs & Index ;26JUNE2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
IDENTS(DIFLAGS,DIFILE,DIDS,DIWRITE,DIDENT,DINDEX) ;
 ; get definition of fields to return with each entry
 ;
ID1 ; prepare to build output processor:
 ;
 S DIDS=";"_DIDS_";"
 I DIDS[";@;" S DIDS("@")=""
 E  S:DIDS'[";-WID;" DIDS("WID")="" S:DIDS=";;" DIDS("FID")=""
 N DICRSR,DICOUNT S (DICRSR,DICOUNT)=0
 I DIFLAGS["P" S DICRSR=1,DIDENT(-3)="IEN"
 N DIFORMAT,DIDEFALT S DIDEFALT=$S(DIFLAGS["I":"I",1:"E")
 ;
ID1A ; for Lister: add indexed fields to DIDENT array (to build 1 nodes)
 ;
 I DIFLAGS[3,DIFLAGS'["S",DIDS'[";-IX",'$D(DIDS("@")) D
 . S DIDENT=-2,DIDENT(-2)=1
 . D THROW^DICU11(DIFLAGS,.DIDENT,.DIDS,.DICRSR,.DICOUNT,DIDEFALT,.DINDEX)
 . S DIDENT=0
 ;
ID2 ; decide whether to auto-include the .01 in the field list
 ; will come out in 1 node for Lister, in "ID" nodes for Finder
 ;
 N DIUSEKEY S (DIUSEKEY,DIDENT)=0
 I '$D(DIDS("@")),DIDS'[";-.01;",DIFLAGS'["S" D
 . I DIFLAGS[4 S DIUSEKEY="1F" Q
 . I DIDS[";.01;"!(DIDS[";.01E") Q
 . S DIUSEKEY=1 N DISUB F DISUB=1:1:DINDEX("#") D  Q:'DIUSEKEY
 . . Q:$G(DINDEX(DISUB,"FIELD"))'=.01  ;**GFT
 . . S DIUSEKEY=DINDEX(DISUB,"FILE")'=DIFILE
 . Q
 I DIUSEKEY S DIDENT(-2)=1,DIDENT=.01
 N DICODE,DIDEF,DIEFROM,DIETO,DINODE,DIPIECE,DISTORE,DITYPE,DIFRMAT2
 N DILENGTH,DIOUTI S DILENGTH=$L(DIDS,";"),DIOUTI=0
 ;
ID3 ; Process auto-included .01 field (if included) on first pass,
 ; Start loop to process each field from DIFIELDS parameter
 ; and Identifiers.
 ;
 F  D  Q:$G(DIERR)!DIOUTI
 . S DIFORMAT=""
 . I DIUSEKEY D  Q
 . . D BLD S DIUSEKEY=$S(DIUSEKEY="1F":"F",1:0)
 . . S:DIDENT=-2 DIDENT=.01 Q
 . D  Q:'DIDENT
 . . S DIUSEKEY=0
 . . ; Find next Identifier
 . . I $D(DIDS("FID")) D  Q
 . . . S DIDENT=$O(^DD(DIFILE,0,"ID",DIDENT))
 . . . I 'DIDENT K DIFRMAT2
 . . . I DIDENT="" S:DIDS=";;" DIOUTI=1 K DIDS("FID")
 . .
ID4 . . ; Find next field in DIFIELDS input parameter.
 . .
 . . S DICOUNT=DICOUNT+1
 . . S DIDENT=$P(DIDS,";",DICOUNT)
 . . I DIDENT="",DICOUNT'<DILENGTH S DIOUTI=1
ID4A . . ; process IX specifier
 . . I DIDENT["IX" D  Q
 . . . I $$BADIX(DIDENT) D ERR202 Q
 . . . Q:DIDS[";-IX;"
 . . . D THROW^DICU11(DIFLAGS,.DIDENT,.DIDS,.DICRSR,.DICOUNT,DIDEFALT,.DINDEX)
 . .
ID4B . . ; process FID, WID, and @ specifiers
 . .
 . . I DIDENT["FID" D  S DIDENT="" Q
 . . . Q:DIDENT="-FID"!(DIDS[";-FID;")
 . . . D GETFORM^DICU11(.DIDENT,.DIFRMAT2,.DIDS,.DICOUNT)
 . . . S DIDS("FID")=1 Q
 . . I DIDENT["WID" D  S DIDENT="" Q
 . . . I DIDENT'="WID",DIDENT'="-WID" D ERR202 Q
 . . . Q:DIDENT="-WID"!(DIDS[";-WID;")
 . . . D WRITEID^DICU11(DIFILE,.DIDENT,.DICRSR) K DIDS("WID") Q
ID4X ..I $TR(DIDENT,"@")]"" N X,DICR S X=DIDENT I +X'=$TR(X,"IE") D  Q:$D(X)  ;***GFT
 ...N DISVFILE
 ...S DISVFILE=DIFILE N DIFILE S DIFILE=DISVFILE ;Q^DIC2 KILLS DIFILE
 ...D EXPR^DICOMP(DIFILE,"m",X) Q:'$D(X)  ;Create the code to do the computation
 ...S DICRSR=DICRSR+1 S:$G(Y)["m" DIGFT(DICRSR,"MULTIPLE")=1 S:$G(Y)["D" DIGFT(DICRSR,"DATE")=1
 ...S Y="C"_(DICOUNT-1) ;COMPUTED
 ...S:DIFLAGS["P" $P(DIDENT(-3),U,DICRSR)=Y ;THIS WILL BECOME THE PACKED "MAP"
 ...S:DIFLAGS'["P" DIDENT(-3,$O(^DD(DISVFILE," "),-1)+1,Y)="" ;THIS IS THE UNPACKED MAP
 ...S DIDENT(DICRSR,Y,0)="D COMP^DICU1("_DICRSR_")"
 ...M DIGFT(DICRSR)=X S DIDENT=""
 . . I DIDENT["@" D:DIDENT'="@" ERR202 Q
 . . I 'DIDENT D:DIDENT'="" ERR202 Q
 . .
ID4C . . ; process field # specifiers from DIFIELDS parameter
 . .
 . . D GETFORM^DICU11(.DIDENT,.DIFORMAT,.DIDS,.DICOUNT)
 .
 . ; Here we quit if field is already in the DIDENT array.
 . I DIDS=";;",DIFLAGS[4,DIUSEKEY'="F",DIDENT=.01 Q
 . I DIDS=";;",DIFLAGS[3,DINDEX("FLIST")[("^"_DIDENT_"^") Q
 .
ID5 . ; for file IDs, we skip non-display IDs
 .
 . N DIPLUS S DIPLUS=+DIDENT
 . N DILAST S DILAST=$P(DIDENT,DIPLUS,2,999)
 . I DIDENT["-" D  Q
 . . I DILAST'="" D ERR202 Q
 . . I '$D(^DD(DIFILE,-DIPLUS)) D ERR(501,DIFILE,"","",-DIPLUS) Q
 . E  I (DILAST'?.1"E".1"I")&(DILAST'?.1"I".1"E") D ERR202 Q
 . Q:DIDS[(";-"_DIDENT_";")
 . I $D(DIDS("FID")) D  I DINODE="W """"" Q
 . . S DINODE=$G(^DD(DIFILE,0,"ID",DIDENT))
 . I $G(DIFRMAT2)]"" S DIFORMAT=DIFRMAT2
 . D BLD Q
 ;
ID6 ; Write Identifiers: add to output processor
 ; ID Parameter: add ID parameter to output processor
 ;
 Q:$G(DIERR)
 I $D(DIDS("WID")) D WRITEID^DICU11(DIFILE,.DIDENT,.DICRSR)
 I DIWRITE'="" D
 . S DIDENT="ZZZ ID" I DIFLAGS["P" S DICRSR=DICRSR+1
 . S DIDENT(DICRSR,DIDENT,0)="N DIMSG "_DIWRITE
 . S:DIFLAGS["P" $P(DIDENT(-3),U,DICRSR)="IDP" Q
 Q
 ;
BLD ; get fetch code for value
 D GET^DICUIX1(DIFILE,DIFILE,DIDENT,.DIDEF,.DICODE) Q:DIDEF=""!$G(DIERR)
 I DIFORMAT="" S DIFORMAT=$S(DIUSEKEY="1F":"I",1:DIDEFALT)
 D
 . N DIVALUE S DIVALUE=DIDENT
 . I DIUSEKEY'["F",$D(DIDS("FID")),DIDENT'=.01 S DIVALUE="FID("_DIVALUE_")"
 . S:DIFORMAT="I" DIVALUE=DIVALUE_DIFORMAT
 . I DIFLAGS["P" S $P(DIDENT(-3),U,(DICRSR+1))=DIVALUE Q
 . Q:DIUSEKEY="1F"
 . S DIDENT(-3,+DIDENT,DIVALUE)="" Q
BLD1 ; set up format code and load with fetch code into DIDENT
 N DIVALUE,DISUB S DIVALUE=DICODE,DISUB=0
 S DITYPE=$P(DIDEF,U,2) I DITYPE'["C" D
 . S DIVALUE=$$FORMAT^DICU11(DIDENT,DICODE,DIUSEKEY,DIFORMAT,DIDEFALT,DIFLAGS)
 I DIUSEKEY="1F",DIDENT=.01 S DIDENT=-2,DISUB=.01
 I DIFLAGS["P" S DICRSR=DICRSR+1
 I DITYPE'["C" S DIDENT(DICRSR,DIDENT,DISUB,DIFORMAT)=DIVALUE Q
 S DIDENT(DICRSR,DIDENT,0)=DIVALUE
 S DIDENT(DICRSR,DIDENT,0,"TYPE")="C"
 Q
 ;
 ;
COMP(DIGFTI) ;EXECUTE A COMPUTED FIELD!   COME HERE FROM DICU2
 N X,Y,J,I
 S J=0 F Y=$L(DIEN,","):-1:1 S X=$P(DIEN,",",Y) I X]"" N @("D"_J) S @("D"_J)=X,J=J+1 ;Temporarily set D0,D1,etc
 M X=DIGFT(DIGFTI)
 I '$D(DIGFT(DIGFTI,"MULTIPLE")) X X D:$D(DIGFT(DIGFTI,"DATE"))  S ^TMP("DIMSG",$J,1)=X Q  ;SINGLE-VALUED COMPUTED EXPRESSION
 .N Y S Y=X X:Y ^DD("DD") S X=Y
 N DICMX S DICMX="S ^($O(^TMP(""DIMSG"",$J,999),-1)+1)=X" X X ;MULTIPLE-VALUED COMPUTED EXPRESSION
 Q
 ;
 ;
ERR(DIERN,DIFILE,DIENS,DIFIELD,DI1) ;
 ;
 ; add an error to the message array
 ; GET
 ;
 N DIPE
 S DIPE("FILE")=$G(DIFILE)
 S DIPE("IEN")=$G(DIENS)
 S DIPE("FIELD")=$G(DIFIELD)
 S DIPE(1)=$G(DI1)
 D BLD^DIALOG(DIERN,.DIPE,.DIPE)
 Q
 ;
ERR202 D ERR(202,"","","","FIELDS") Q
 ;
BADIX(DIDENT) ;
 ;
 N DIBAD S DIBAD=DIDENT'="IX"&(DIDENT'="-IX")&(DIDENT'?1"IX"1"E".1"I")
 S DIBAD=DIDENT'?1"IX"1"I".1"E"&DIBAD
 Q DIBAD
 ;
 ; 202   The input parameter that identifies the |1
 ;

DICU11
DICU11 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup Tools, Get IDs & Index ;11/5/99  15:13
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Routines called from DICU1
 ;
THROW(DIFLAGS,DIDENT,DIDS,DICRSR,DICOUNT,DIDEFALT,DINDEX,DICF2) ;
 ;
 ; Build code into DIDENT array to get external field values
 ; for indexed fields.
 ;
T1 N DIFORMAT D GETFORM(.DIDENT,.DIFORMAT,.DIDS,.DICOUNT)
 I DIFORMAT="" S DIFORMAT=DIDEFALT
 N DIEXP,DISUB,DISUB0,DIMAP S DISUB0=$S(DIDENT["IX":0,1:DIDENT)
 F DISUB=1:1:DINDEX("#") D
 . S DIEXP="DINDEX(DISUB)"
 . I DIFORMAT="I",DIFLAGS[3,"VP"[DINDEX(DISUB,"TYPE") D
 . . I DISUB>1 S DIEXP="DIVAL" Q
 . . Q:'$D(DINDEX("ROOTCNG",1))
 . . S DIEXP="$G(@DINDEX(1,""ROOT"")@(DINDEX(1)))" Q
 . I DIFORMAT="E",$G(DINDEX(DISUB,"GETEXT")) D
 . . I DISUB>1,DIFLAGS[4,"VP"[DINDEX(DISUB,"TYPE") S DIEXP="DINDEX(DISUB,""EXT"")" Q
 . . I DINDEX(DISUB,"GETEXT")=3 S DIEXP="$$TRANOUT(DISUB,"_DIEXP_")" Q
 . . S:DINDEX(DISUB,"GETEXT")=2 DIEXP="DIVAL"
 . . S DIEXP=$$FORMAT(DIDENT,DIEXP,0,DIFORMAT,DIDEFALT,DIFLAGS)
 . . I DINDEX="B" S DIEXP="$S('$D(DIMNEM):"_DIEXP_",1:DINDEX(DISUB))"
 . . Q
 . I $G(DICF2) S DIDENT(DICRSR,DISUB0,DISUB,DIFORMAT)=DIEXP Q
 . I DIFLAGS["P" S DICRSR=DICRSR+1
 . S DIDENT(DICRSR,DISUB0,DISUB,DIFORMAT)=DIEXP
 . S DIMAP="IX("_DISUB_")" S:DIFORMAT="I" DIMAP=DIMAP_"I"
 . I DIFLAGS["P" S $P(DIDENT(-3),U,DICRSR)=DIMAP Q
 . I DIDENT'=-2 S DIDENT(-3,0,DISUB,DIMAP)=""
 Q
 ;
GETFORM(DIDENT,DIFORMAT,DIDS,DICOUNT) ;
 ; Strip E or I off specifier and set into DIFORMAT
 N DILENGTH S DILENGTH=$L(DIDENT)
 S DIFORMAT=$E(DIDENT,DILENGTH)
 I $TR(DIFORMAT,"EI")="" D
 . N DIFIRST S DIFIRST=$E(DIDENT,DILENGTH-1) I $TR(DIFIRST,"EI")="" D  Q
 . . S $E(DIDENT,DILENGTH-1)="",$P(DIDS,";",DICOUNT)=DIDENT
 . . S DIFORMAT=DIFIRST,DICOUNT=DICOUNT-1
 . . S $E(DIDENT,DILENGTH-1)=""
 . S $E(DIDENT,DILENGTH)=""
 E  S DIFORMAT=""
 Q
 ;
FORMAT(DIFIELD,DICODE,DIUSEKEY,DIFORMAT,DIDEFALT,DIFLAGS) ;
 ; Format fetch code to return either internal or external
 N DIFILE S DIFILE="DIFILE"
 I DIFIELD'>0 S DIFILE="DINDEX(DISUB,""FILE"")",DIFIELD="DINDEX(DISUB,""FIELD"")"
 I DIFORMAT="E" D
 . N F S F="""""" I DIFLAGS["h" S F="""h"""
 . S DICODE="$$EXTERNAL^DIDU("_DIFILE_","_DIFIELD_","_F_","_DICODE_")"
 Q DICODE
 ;
WRITEID(DIFILE,DIDENT,DICRSR) ;
 ; WRITE Identifiers Loop: add WRITE identifiers to output processor:
 ; for WRITE IDs we save the code as is
 ;
 N DICODE
 S DIDENT=$O(^DD(DIFILE,0,"ID"," "),-1),DIDENT=$O(^(DIDENT))
 F  Q:DIDENT=""  D  S DIDENT=$O(^DD(DIFILE,0,"ID",DIDENT))
 . S DICODE=$G(^DD(DIFILE,0,"ID",DIDENT)) Q:DICODE=""
 . I DIFLAGS["P" S DICRSR=DICRSR+1
 . S DIDENT(DICRSR,DIDENT,0)="N DIMSG "_DICODE
 . S:DIFLAGS["P" $P(DIDENT(-3),U,DICRSR)="WID("_DIDENT_")" Q
 Q
 ;

DICU2
DICU2 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup Tools, Return IDs ;28APR2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
IDS(DIFILE,DIEN,DIFLAGS,DINDEX,DICOUNT,DIDENT,DILIST,DI0NODE) ;
 ;
 ; ENTRY POINT--add an entry's identifiers to output
 ;
I1 ; setup 0-node and ID array interface, and output IEN
 ;
 I DIFLAGS["h" N F,N,I M F=DIFILE S N=$G(DI0NODE),I=+$G(DIEN) N DIFILE,DI0NODE,DIEN M DIFILE=F S DIEN=I S:N]"" DI0NODE=N K F,N,I
 I '$D(DI0NODE) S DI0NODE=$G(@DIFILE(DIFILE)@(+DIEN,0))
 N DID,DIDVAL
 I DIFLAGS["P" N DINODE S DINODE=+DIEN
 E  S @DILIST@(2,DICOUNT)=+DIEN
 ;
I1A ; output primary value (index for Lister, .01 for Finder)
 ;
 I DIFLAGS'["P",$D(DIDENT(-2)) D
 . N DIOUT S DIOUT=$NA(@DILIST@(1,DICOUNT))
 . I DIFLAGS[3 N DISUB D  Q
 . . F DISUB=0:0 S DISUB=$O(DIDENT(0,-2,DISUB)) Q:'DISUB  D
 . . . I DINDEX("#")'>1 D SET(0,-2,DISUB,DIOUT,.DINDEX,.DIFILE) Q
 . . . N I S I=$NA(@DIOUT@(DISUB)) D SET(0,-2,DISUB,I,.DINDEX,.DIFILE)
 . I $D(DIDENT(0,-2,.01)) D SET(0,-2,.01,DIOUT,"",.DIFILE)
 . Q
 ;
I2 ; start loop: loop through output values
 ;
 I DIFLAGS["P" N DILENGTH S DILENGTH=$L(DINODE)
 N DICODE,DICRSR,DIOUT,DISUB S DICRSR=-1
 F  S DICRSR=$O(DIDENT(DICRSR)) Q:DICRSR=""!($G(DIERR))  S DID="" F  S DID=$O(DIDENT(DICRSR,DID)) Q:DID=""!($G(DIERR))  S DISUB="" F  D  Q:DISUB=""!$G(DIERR)
 . I DIFLAGS'["P",DID=-2 Q
 . S DISUB=$O(DIDENT(DICRSR,DID,DISUB)) Q:DISUB=""
 . K DIDVAL
I20 . ; output indexed field if "IX" was in FIELDS parameter
 . I DID=0 D  Q
 . . D SET(DICRSR,DID,DISUB,"DIDVAL",.DINDEX,.DIFILE)
 . . I DIFLAGS["P" D ADD(.DIFLAGS,.DINODE,.DILENGTH,DIDVAL,DIEN,DILIST) Q
 . . M @DILIST@("ID",DICOUNT,0,DISUB)=DIDVAL Q
 .
I3 . ; output field
 . ; distinguish between computed and value fields
 .
 . I DID D  Q:$G(DIERR)
 . . ; process fields that are not computed.
 . . I DIFLAGS["E" N DIERR ;ERROR IN DATA WILL NOT STOP THE LISTING  --GFT
 . . I $G(DIDENT(DICRSR,DID,0,"TYPE"))'="C" D
 . . . D SET(DICRSR,DID,DISUB,"DIDVAL",.DINDEX,.DIFILE) Q
 . .
I4 . . ; computed fields
 . . E  D
 . . . N %,%H,%T,A,B,C,D,DFN,I,X,X1,X2,Y,Z,Z0,Z1
 . . . N DA D DA^DILF(DIEN,.DA) ;M DA=DIEN S DA=$P(DIEN,",")  PATCH 165 MAY,2011
 . . . N DIARG S DIARG="D0"
 . . . N DIMAX S DIMAX=+$O(DA(""),-1)
 . . . N DIDVAR F DIDVAR=1:1:DIMAX S DIARG=DIARG_",D"_DIDVAR
 . . . N @DIARG F DIDVAR=0:1:DIMAX-1 S @("D"_DIDVAR)=DA(DIMAX-DIDVAR)
 . . . S @("D"_DIMAX)=DA
 . . . X DIDENT(DICRSR,DID,0) S DIDVAL=$G(X)
COMPDT . . .I $P($G(^DD(DIFILE,DID,0)),U,2)["D" N Y S Y=DIDVAL X:Y ^DD("DD") S DIDVAL=Y
 . .
I5 . . ; set field into array or pack node
 . .
 . . I DIFLAGS'["P" M @DILIST@("ID",DICOUNT,DID)=DIDVAL
 . . E  D ADD(.DIFLAGS,.DINODE,.DILENGTH,DIDVAL,DIEN,DILIST)
 .
I6 . ; output display-only identifier
 .
 . E  D
 . . N %,D,DIC,X,Y,Y1
 . . S D=DINDEX
 . . S DIC=DIFILE(DIFILE,"O")
 . . S DIC(0)=$TR(DIFLAGS,"2^fglpqtuv104")
 . . M Y=DIEN S Y=$P(DIEN,",")
 . . S Y1=$G(@DIFILE(DIFILE)@(+DIEN,0)),Y1=DIEN
 . .
I7 . . ; execute the identifier's code
 . .
 . . N DIX S DIX=DIDENT(DICRSR,DID,0)
 . . X DIX
 . . I $G(DIERR) D  Q
 . . . N DICONTXT I DID="ZZZ ID" S DICONTXT="Identifier parameter"
 . . . E  S DICONTXT="MUMPS Identifier"
 . . . D ERR^DICF4(120,DIFILE,DIEN,"",DICONTXT)
 . .
I8 . . ; set output from identifier into output array or pack node
 . . N DIGFT S DIGFT=$NA(@DILIST@("ID","WRITE",DICOUNT)) I DID?1"C"1.2N S DIGFT=$NA(@DILIST@("ID",DICOUNT,DID)) ;**GFT
 . . N DI,DILINE,DIEND S DI="" S:DIFLAGS'["P" DIEND=$O(@DIGFT@("z"),-1)
 . . I $O(^TMP("DIMSG",$J,""))="" S ^TMP("DIMSG",$J,1)=""
 . . F  D  Q:DI=""!$G(DIERR)
 . . . S DI=$O(^TMP("DIMSG",$J,DI)) Q:DI=""
 . . . S DILINE=$G(^TMP("DIMSG",$J,DI))
 . . . I DIFLAGS["P" D ADD(.DIFLAGS,.DINODE,.DILENGTH,DILINE,DIEN,DILIST,DI) Q
 . . . S DIEND=DIEND+1,@DIGFT@(DIEND)=DILINE
 . . . Q
 . . K DIMSG,^TMP("DIMSG",$J)
 ;
I9 ; for packed output, set pack node into output array
 ;
 I '$G(DIERR),DIFLAGS["P" S @DILIST@(DICOUNT,0)=DINODE
 Q
 ;
 ;
SET(DICRSR,DIFID,DISUB,DIOUT,DINDEX,DIFILE) ; Move data to DIOUT.
 N F1,F2 M F1=DIFILE N DIFILE M DIFILE=F1
 S F1=$O(DIDENT(DICRSR,DIFID,DISUB,"")),F2=$O(DIDENT(DICRSR,DIFID,DISUB,F1))
 F F1=F1,F2 D:F1]""
 . I DIDENT(DICRSR,DIFID,DISUB,F1)["DIVAL" N DIVAL S @DINDEX(DISUB,"GET")
 . N X S @("X="_DIDENT(DICRSR,DIFID,DISUB,F1))
 . I $G(DIERR),DIFLAGS["h" K DIERR,^TMP("DIERR",$J) S X=DINDEX(DISUB)
 . I X["""" S X=$$CONVQQ^DILIBF(X)
 . I +$P(X,"E")'=X S X=""""_X_""""
 . I F2="" S @(DIOUT_"="_X) Q
 . S O=$NA(@DIOUT@(F1)),@(O_"="_X) Q
 Q
 ;
TRANOUT(DISUB,DIVL) ; Execute TRANSFORM FOR DISPLAY on index value
 N X S X=DIVL
 N DICODE S DICODE=$G(DINDEX(DISUB,"TRANOUT"))
 I DICODE]"" X DICODE
 Q X
 ;
ADD(DIFLAGS,DINODE,DILENGTH,DINEW,DIEN,DILIST,DILCNT) ;
 ;
 ; for Packed output, add DINEW to DINODE, erroring if overflow
 ; xform if it contains ^
 ;
A1 N DINEWLEN,DELIM S DINEWLEN=$L(DINEW),DELIM=$S($G(DILCNT)'>1:"^",1:"~")
 S DILENGTH=DILENGTH+1+DINEWLEN
 I DILENGTH>$G(^DD("STRING_LIMIT"),255) D ERR^DICF4(206,"","","",+DIEN) Q  ;**HERE IS WHERE A PACKED STRING WAS FORCED TO BE ONLY 255 CHARACTERS LONG
 I DIFLAGS'[2,DINEW[U S DIFLAGS="2^"_DIFLAGS D ENCODE(DILIST,.DINODE)
 I DIFLAGS[2,DINEW[U!(DINEW["&") S DINEW=$$HTML^DILF(DINEW) Q:$G(DIERR)
 S DINODE=DINODE_DELIM_DINEW
 Q
 ;
ENCODE(DILIST,DINODE) ;
 ;
 ; ADD: HTML encode records already output (we found an embedded ^)
 ; procedure: loop through list encoding &s
 ;
E1 N DILINE,DIRULE S DIRULE(1,"&")="&amp;"
 N DIREC S DIREC=0 F  S DIREC=$O(@DILIST@(DIREC)) Q:'DIREC  D
 . S DILINE=@DILIST@(DIREC,0) Q:DILINE'["&"
 . S @DILIST@(DIREC,0)=$$TRANSL8^DILF(DILINE,.DIRULE)
 I DINODE["&" S DINODE=$$TRANSL8^DILF(DINODE,.DIRULE)
 Q
 ;

DICUF
DICUF ;SEA/TOAD,SF/TKW-FileMan: Lookup Tools, Files ;12APR2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
FILE(DIFILE,DIFIEN,DIFLAGS) ;
 ; retrieve and calculate info about indexed file
 ;
F1 ; set and check source file number. 
 ;
 S DIFILE=+$G(DIFILE) I 'DIFILE D ERR(202,"","","","","file") Q
 ;
F2 ; get the file's .01 definition; quit & error if bad
 ;
 N DINODE S DINODE=$G(^DD(DIFILE,.01,0))
 I DINODE="" D ERR($S('$D(^DD(DIFILE)):401,1:406),DIFILE) Q
 I $P(DINODE,U,2)["W" D ERR(407,DIFILE) Q
 ;
F3 ; set and check the Lister's IENS parameter
 ;
 S DIFIEN=$G(DIFIEN) I DIFIEN="" S DIFIEN=","
 I '$$IEN^DIDU1(DIFIEN) D  Q
 . I '$$IEN^DIDU1(DIFIEN_",") D ERR(202,"","","","","IENS") Q
 . E  D ERR(304,"",DIFIEN) Q
 I $P(DIFIEN,",")'="" D ERR(306,"",DIFIEN) Q
 ;
F4 ; calculate the source file's global root (open & closed)
 ;
 S DIFILE(DIFILE)=$$ROOT^DIQGU(DIFILE,DIFIEN,1,1) Q:$G(DIERR)
 I DIFILE(DIFILE)'?1"^"1A.ANP,DIFILE(DIFILE)'?1"^%".ANP D  Q  ;JIM SELF --ALLOW LC GLOBAL NAMES
 . D ERR(402,DIFILE,DIFIEN,"",DIFILE(DIFILE))
 S DIFILE(DIFILE,"O")=$$OREF^DIQGU(DIFILE(DIFILE))
 Q
 ;
SCREEN(DIFLAGS,DIFILE,DISCREEN) ;
 ; Set user defined and whole file screen variables.
 ;
 I $G(DISCREEN("S"))="" S DISCREEN("S")=$G(DISCREEN)
 I $G(DISCREEN("V"))]"",$G(DISCREEN("V",1))']"" S DISCREEN("V",1)=DISCREEN("V")
 S DISCREEN("F")="" I DIFLAGS'["U" D
 . Q:$P($G(@DIFILE(DIFILE)@(0)),U,2)'["s"
 . S DISCREEN("F")=$G(^DD(DIFILE,0,"SCR"))
 . Q
 Q
 ;
VPDATA(DINDEX,DISCREEN) ; Add variable pointer info to DINDEX array for executing DIC("V") type screen
 N DISUB,F,I,F1,F2,G,Y
 F DISUB=1:1:DINDEX("#") I $G(DISCREEN("V",DISUB))]"" D
 . S F1=DINDEX(DISUB,"FILE"),F2=DINDEX(DISUB,"FIELD") Q:'F1!('F2)
 . F F=0:0 S F=$O(^DD(F1,F2,"V","B",F)) Q:'F  D
 . . S I=$O(^DD(F1,F2,"V","B",F,0)) Q:'I
 . . S Y(0)=$G(^DD(F1,F2,"V",I,0)) Q:Y(0)=""
 . . X DISCREEN("V",DISUB) Q:'$T
 . . S G=$G(^DIC(F,0,"GL")) Q:G=""
 . . S DINDEX(DISUB,"VP",G)="" Q
 . Q
 Q
 ;
ERR(DIERN,DIFILE,DIIENS,DIFIELD,DIROOT,DI1,DI2,DI3) ;
 ;
 ; error logging procedure
 ;
E1 N DIPE,P
 N DI F DI="FILE","IENS","FIELD","ROOT",1:1:3 D
 . S P=$G(@("DI"_DI)) Q:P=""
 . S DIPE(DI)=P
 D BLD^DIALOG(DIERN,.DIPE,.DIPE)
 Q
 ;

DICUIX
DICUIX ;SEA/TOAD,SF/TKW-FileMan: Lookup Tools, Indexes ;8APR2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
INDEX(DIFILE,DIFLAGS,DINDEX,DIFROM,DIPART,DINUMBER,DISCREEN,DILIST,DIOUT) ;
 ;
 ; build DINDEX array data for index
 ;
I1 ; try to find Index in Index file
 ;
 N DICODE,DIGET,DILENGTH,DINODE,DISUB,DITEMP,DITEMP2,DITO,DITOIEN,DITYPE,DIWAY,DIXIEN
 S DINDEX("FLIST")="",DINDEX("AT")=1,DIFROM("IEN")=+$G(DIFROM("IEN")),DIXIEN="",DIGET=1
 S:DINDEX'="#" DIXIEN=$O(^DD("IX","BB",DIFILE,DINDEX,""))
 I 'DIXIEN D XREF(.DIFILE,.DIFLAGS,.DINDEX,.DIPART,.DIFROM) Q
 ;
I2 ; in Index file, build list of subscript data
 ;
 S DINODE=^DD("IX",DIXIEN,0)
 S DINDEX("IXTYPE")=$P(DINODE,U,4) S:DIFLAGS["4" DINDEX("IXFILE")=DIXIEN
 S DINDEX("#")=0
 S DISUB=$O(^DD("IX",DIXIEN,11.1,"AC","Z"),-1)
 I $G(DIFROM(DISUB+1)) M DIFROM("IEN")=DIFROM(DISUB+1)
 S (DISUB,DIOUT)=0 N S
 F  D  Q:'DISUB  Q:DIOUT
 . S DISUB=$O(^DD("IX",DIXIEN,11.1,"AC",DISUB)) Q:'DISUB  S S=$O(^(DISUB,0)) Q:'S
 . S DINDEX("#")=DISUB,DIGET=1
 . S DINODE=$G(^DD("IX",DIXIEN,11.1,S,0))
 . I DIFLAGS["l" N X D  S DINDEX(DISUB,"PROMPT")=X
 . . S X=$P(DINODE,U,8) Q:X]""
EGP . . I $P(DINODE,U,3),$P(DINODE,U,4) S X=$$LABEL^DIALOGZ($P(DINODE,U,3),$P(DINODE,U,4)) ;**CCO/NI
 . . Q
 . S DINDEX(DISUB,"FIELD")=$P(DINODE,U,4)
 . S DINDEX(DISUB,"FILE")=$P(DINODE,U,3)
 . I $P(DINODE,U,2)["C"!(DINDEX(DISUB,"FILE")="") S DINDEX(DISUB,"FIELD")=""
 . I DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD") D
 . . I $G(^DD("IX",DIXIEN,11.1,S,4))]"" S DINDEX(DISUB,"TRANCODE")=^(4)
 . . I $G(^DD("IX",DIXIEN,11.1,S,2))]"" D
 . . . I $G(^DD("IX",DIXIEN,11.1,S,3))="" S DIGET=0 Q
 . . . S DINDEX(DISUB,"TRANOUT")=^DD("IX",DIXIEN,11.1,S,3),DIGET=3 Q
 . . I "KSMU"[DINDEX("IXTYPE") S DIGET=2
 . . Q
 . S DILENGTH=$P(DINODE,U,5) I 'DILENGTH S DILENGTH=30 ;!(DILENGTH>100) ;GETS THE LENGTH FROM THE DEFINITION OF THE INDEX
 . S DIWAY=$S($P(DINODE,U,7)="B":-1,1:1)
 . D COMMON1^DICUIX2
 . Q
 I DIOUT S @DILIST@(0)="0^"_DINUMBER_"^0" D OUT^DICL Q
 D:DIFLAGS'["q" COMMON2^DICUIX2
 S DINDEX("FLIST")=DINDEX("FLIST")_"^"
 I DIFLAGS'["l",DIFLAGS'["h" Q
 N F,F1,F2,I S F=DINDEX("FLIST")
 F I=1:1:DINDEX("#") I $G(DINDEX(I,"GETEXT"))=0 S F1=$G(DINDEX(I,"FILE")),F2=$G(DINDEX(I,"FIELD")) I F1=DIFILEI,F2 D
 . S F1=$F(F,("^"_F2_"^")) Q:'F1  S F1=F1-2
 . S $E(F,(F1-$L(F2)),F1)="" Q
 S DINDEX("FLISTD")=F Q
 ;
XREF(DIFILE,DIFLAGS,DINDEX,DIPART,DIFROM) ;
 ; Index is in "IX" nodes
 ;
X1 ; Set DINDEX for search through upright file
 ;
 I DINDEX="#" D  Q
 . S DINDEX("#")=0,DINDEX(1,"FILE")=DIFILE,DINDEX(1,"ROOT")=DIFILE(DIFILE),DINDEX(1,"TYPE")="N"
 . N X S X=$S($G(DIFROM(1)):DIFROM(1),DIPART(1):DIPART(1),1:$G(DIFROM("IEN")))
 . S (DIFROM,DIFROM(1))=X S:X DIFROM("IEN")=X
 . I DIFLAGS["l"!(DIFLAGS["h") S DINDEX("FLISTD")=""
 . D:DIFLAGS'["q" COMMON2^DICUIX2 Q
 S DINDEX("#")=1,DINDEX("IXTYPE")="R"
 S DINDEX(1,"FILE")=$O(^DD(DIFILE,0,"IX",DINDEX,""))
 ;
X2 ; Build DINDEX for index in IX nodes.
 ;
 S DIOUT=0,DILENGTH=30
 S DINDEX(1,"FIELD")=""
 I DINDEX(1,"FILE") S DINDEX(1,"FIELD")=$O(^DD(DIFILE,0,"IX",DINDEX,DINDEX(1,"FILE"),""))
 I DINDEX(1,"FIELD")="",DINDEX="B" D
 . S DINDEX(1,"FILE")=DIFILE
 . S DINDEX(1,"FIELD")=.01 Q
 I DIFLAGS[3,DINDEX="B",'$D(@DIFILE(DIFILE)@("B")) D
 . D TMPB^DICUIX1(.DITEMP,DIFILE)
 . S DIFILE(DIFILE,"NO B")=DITEMP Q
 I DIFLAGS["l" S DINDEX(1,"PROMPT")=""
 I DINDEX(1,"FILE"),DINDEX(1,"FIELD") D  I DINDEX("IXTYPE")="*" K DINDEX S DINDEX="" Q
EGP2 . I DIFLAGS["l" S DINDEX(1,"PROMPT")=$$LABEL^DIALOGZ(DINDEX(1,"FILE"),DINDEX(1,"FIELD")) ;**CCO/NI    FIELD LABEL
 . N I,X,Y
 . F I=0:0 S I=$O(^DD(DINDEX(1,"FILE"),DINDEX(1,"FIELD"),1,I)) Q:'I  S X=$G(^(I,0)) I $P(X,U,2)=DINDEX S Y=$G(^(1)) D  Q
 . . S X=$E($P(X,U,3),1,2)
 . . S DINDEX("IXTYPE")=$S(X="":"R",X="KW":"K",X="SO":"S",(X="TR")!(X="BU"):"*",X]"":X,1:"R")
 . . I "KSMU"[DINDEX("IXTYPE") S DIGET=2
 . . S DILENGTH=+$P(Y,"$E(X,1,",2)
 . . S:'DILENGTH DILENGTH=30 Q  ;!(DILENGTH>100)
 . Q
 I $G(DIFROM(2)) S DIFROM("IEN")=DIFROM(2)
 S DISUB=1,DIWAY=1,DIOUT=0
 N I,X,Y
 D COMMON1^DICUIX2
 I DIOUT S @DILIST@(0)="0^"_DINUMBER_"^0" D OUT^DICL Q
 D:DIFLAGS'["q" COMMON2^DICUIX2
 S DINDEX("FLIST")=DINDEX("FLIST")_"^"
 I DIFLAGS["l"!(DIFLAGS["h") D
 . I DIGET=2 S DINDEX("FLISTD")="^^" Q
 . S DINDEX("FLISTD")=DINDEX("FLIST") Q
 S DITEMP=$G(DIFILE(DIFILE,"NO B")) I DITEMP]"" D BLDB^DICUIX1(DIFILE(DIFILE),DITEMP)
 Q
 ;
 ;

DICUIX1
DICUIX1 ;SF/TOAD/TKW-FileMan: Lookup Tools, Indexes (called by DICUIX) ;4JUL2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
GET(DITOP,DIFILE,DIFIELD,DIDEF,DICODE) ;
 ; get the definition and fetch code for a field
 ;
G1 ; handle .001 fields, fetch field definition, & handle undefineds
 ;
 I DIFIELD=.001 S DICODE="DIEN",DIDEF="" Q
 S DIDEF=$G(^DD(DIFILE,DIFIELD,0)),DICODE=""
 I DIDEF="" D ERR^DICU1(501,DIFILE,"","",DIFIELD) Q
 ;
G2 ; piece out the fields data type, & handle multiples and WPs
 ;
 N DITYPE S DITYPE=$P(DIDEF,U,2)
 I DITYPE D  Q
 . I $P($G(^DD(+DITYPE,.01,0)),U,2)["W" S DITYPE="Word-processing"
 . E  S DITYPE="Multiple"
 . D ERR^DICU1(520,DIFILE,"",DIFIELD,DITYPE)
 ;
G3 ; handle computed fields
 ;
 I DITYPE["C" D  Q
 .I DITYPE["m" D ERR^DICU1(520,DIFILE,"",DIFIELD,"Multiple Computed") Q  ;**GFT
 . S DICODE=$P(DIDEF,U,5,9999)
 . S DIDEF=$P(DIDEF,U,1,4)
 ;
G30 ; Handle whole file x-refs
 I DIFILE'=DITOP S DICODE="DINDEX(DISUB)" Q
G4 ; get field's storage location, handle ?, build node fetch code
 ;
 N DISTORE S DISTORE=$P(DIDEF,U,4)
 N DINODE S DINODE=$P(DISTORE,";")
 N DIPIECE S DIPIECE=$P(DISTORE,";",2)
 I DINODE="",$P(DIPIECE,"E")'="",'DIPIECE S (DICODE,DIDEF)="" Q
 I DINODE=0,DIFILE=DITOP S DINODE="DI0NODE"
 E  S DINODE="$G(@DIFILE(DIFILE)@(+DIEN,"""_DINODE_"""))"
 ;
G5 ; build field fetch code (piece or extract) & quit
 ;
 I DIPIECE S DICODE="$P("_DINODE_",U,"_DIPIECE_")"
 E  D
 . N DIEFROM S DIEFROM=$P($E(DIPIECE,2,9999),",")
 . N DIETO S DIETO=$P(DIPIECE,",",2)
 . S DICODE="$E("_DINODE_","_DIEFROM_","_DIETO_")"
 Q
 ;
FIELD(DIFILE,DIFIELD,DINDEX) ;
 ;
 ; return code to fetch field value prior to screen execution
 ;
F1 ; handle .01 & computeds, build node expression
 ;
 I DIFIELD=.01 Q "DINDEX(1)"
 N DISTORE S DISTORE=$P(DINDEX(1,"DEF"),U,4)
 N DINODE S DINODE=$P(DISTORE,";")
 N DIPIECE S DIPIECE=$P(DISTORE,";",2)
 I 'DINODE,$P(DIPIECE,"E")'="",'DIPIECE Q "X"
 I DINODE=0 S DINODE="DI0NODE"
 E  S DINODE="$G(@DIFILE(DIFILE)@(+DIEN,"""_DINODE_"""))"
 ;
F2 ; build fetch code from node expression
 ;
 N DICODE
 I DIPIECE S DICODE="$P("_DINODE_",U,"_DIPIECE_")"
 E  D
 . N DIEFROM S DIEFROM=$P($E(DIPIECE,2,9999),",")
 . N DIETO S DIETO=$P(DIPIECE,",",2)
 . S DICODE="$E("_DINODE_","_DIEFROM_","_DIETO_")"
 Q DICODE
 ;
GETTMP(DITEMP,DISUB) ; Return name of unique entry in ^TMP global.
 I $G(DISUB(1))']"" S DISUB(1)=$G(DISUB)
 N I S DITEMP="^TMP("
 F I=0:0 S I=$O(DISUB(I)) Q:'I  I DISUB(I)]"" D
 . N X S X=DISUB(I) I +$P(X,"E")'=X S X=""""_X_""""
 . S DITEMP=DITEMP_X_","
 N DIKJ,J
 F DIKJ=$J:.01 S J=DITEMP_DIKJ_")" I '$D(@J) L +@J Q
 S @J="",DITEMP=J L -@J Q
 ;
TMPB(DITEMP,DIFILE) ; Set place for temporary "B" index on file
 N DISUB S DISUB(1)="DICLB",DISUB(2)=DIFILE
 D GETTMP(.DITEMP,.DISUB)
 S DITEMP=$E(DITEMP,1,($L(DITEMP)-1)) Q
 ;
BLDB(DIROOT,DITEMP) ; Build temporary "B" index on file
 N DIENTRY,DIVALUE S DIENTRY=0,DITEMP=DITEMP_")"
 F  S DIENTRY=$O(@DIROOT@(DIENTRY)) Q:'DIENTRY  D
 . S DIVALUE=$P($G(@DIROOT@(DIENTRY,0)),U) Q:DIVALUE=""
 . S @DITEMP@(DIVALUE,DIENTRY)=""
 . Q
 Q
 ;
TMPIDX(DISUB,DITEMP,DITEMP2,DINDEX) ; Set data to build temporary index on Lister call with Pointer/VP in index.
 S DITEMP2=DITEMP
 D GETTMP^DICUIX1(.DITEMP,"DICL")
 S DITEMP=$E(DITEMP,1,($L(DITEMP)-1))
 S DINDEX("ROOTCNG",DISUB)=""
 Q
 ;
CHKP(DIFILE,DINDEX,DINUMBER,DIFRPRT,DISCREEN,DICQ1) ; Check whether to build temporary index on Lister call with Pointer/VP in first subscript of index.
 N DIN1,DIN2,X,I,D S DIN2=0
 S DIN1=+$P($G(@DIFILE(DIFILE)@(0)),U,4)
 N DIF,DIVPTR M DIF=DIFILE S DIVPTR=$S(DINDEX(1,"TYPE")="V":1,1:0)
 D FOLLOW^DICL3(.DIF,"",DINDEX(1,"NODE"),1,0,"",DINDEX(1,"FIELD"),DINDEX(1,"FILE"),DIVPTR,1,.DISCREEN)
 F I=1:1 S X=+$P($G(DIF("STACKEND",I)),U,2) Q:'X  D
 . S X=$G(^DIC(X,0,"GL")) Q:X=""  S X=$G(@(X_"0)"))
 . S DIN2=DIN2+$P(X,U,4)
 S D=1 D
 . N F1,F2 S F1=DINDEX(1,"FILE"),F2=DINDEX(1,"FIELD")
 . I 'DIVPTR S I=$P($G(^DD(F1,F2,0)),U,2) S:I["*" D=.5 Q
 . F I=0:0 S I=$O(^DD(F1,F2,"V",I)) Q:'I  I $G(^(I,1))]"" S D=.5 Q
 . S D=D*.5 Q
 S DIN2=$S(DINUMBER!(DIFRPRT]""):DIN2/(40*D),1:DIN2/(20*D))
 I $G(DICQ1),DIFRPRT]"" S DIN2=DIN2/2
 I DIN2>DIN1,DIN1>500,'$G(DICQ1) Q 0
 Q DIN2>DIN1
 ;

DICUIX2
DICUIX2 ;VEN/TOAD,SF/TKW - Lookup: Build Index Data ; 1/25/13 12:32pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ; Contents
 ;
 ; COMMON1: Load Data-subscript Data into DINDEX
 ; $$BACKFROM: Return From Value for Backward Collation
 ; COMMON2: Load IEN-subscript Data into DINDEX
 ; DAT: Process FROM and PART for dates
 ; $$ORDERQ: Is File Like Order File: Dinumed but No B Index?
 ;
 ;
COMMON1 ; Load Data-subscript Data into DINDEX
 ;
 N DIFR,DIPRT
 S DIFR=$G(DIFROM(DISUB)),DIPRT=$G(DIPART(DISUB))
 I DINDEX(DISUB,"FILE")=DIFILE S DINDEX("FLIST")=DINDEX("FLIST")_"^"_DINDEX(DISUB,"FIELD")
 I DIFLAGS["q" D C3 Q
 S DINDEX(DISUB,"USE")=0 D
 . I DIFROM("IEN") S DINDEX(DISUB,"USE")=1 Q
 . S:$G(DIFROM(DISUB+1))]"" DINDEX(DISUB,"USE")=1
 ;
C1 ; 1. Decide which direction to traverse this subscript
 ;
 S DINDEX(DISUB,"WAY")=DIWAY*DINDEX("WAY") ; calculate direction
 I DIFLAGS[4,DIFLAGS'["l" S DINDEX(DISUB,"WAY")=1 ; override?
 I $G(DINDEX("WAY","REVERSE")) S DITO(DISUB)=DIFR,DIFR=""
 ;
C2 ; 2. Adjust From & To to fit max subscript length
 ;
 I DIFLAGS[4 S DINDEX(DISUB,"LENGTH")=DILENGTH
 I DIFLAGS[3 D
 . S DIFR=$E(DIFR,1,DILENGTH)
 . S DIPRT=$E(DIPRT,1,DILENGTH)
 . I $D(DITO(DISUB)) S DITO(DISUB)=$E(DITO(DISUB),1,DILENGTH)
 ;
C3 ; 3. Build code to extract indexed field from data
 ;
 I 'DINDEX(DISUB,"FILE")!('DINDEX(DISUB,"FIELD")) S DINODE="",DICODE="DINDEX(DISUB)"
 E  D GET^DICUIX1(DIFILE,DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),.DINODE,.DICODE)
 I $G(DIERR) D
 . S DINODE="",DICODE="DINDEX(DISUB)"
 . D BLD^DIALOG(8099,DINDEX)
 S DINDEX(DISUB,"GET")="DIVAL="_DICODE
 ;
C4 ; 4. Find & record subscript data-type info
 ;
 S DITYPE=$P(DINODE,U,2)
 N % S %="F" D  S DINDEX(DISUB,"TYPE")=%
 . Q:DIFLAGS["Q"
 . I DITYPE["P" S %="P" S:$$ORDERQ(+$P(DITYPE,"P",2)) %="F",DITYPE="F" Q  ;TRICK:  TREAT FILE 100 POINTERS AS FREE-TEXT!
 . I DITYPE["D" S %="D" Q
 . I DITYPE["S" S %="S" Q
 . I DITYPE["V" S %="V" Q
 . I DITYPE["N" S %="N"
 ;
 Q:DIFLAGS["q"
 I DISUB=1 D
 . S DITEMP=$S($D(DIFILE(DIFILE,"NO B")):DIFILE(DIFILE,"NO B"),1:DIFILE(DIFILE,"O")_"DINDEX")
 . I "VP"[DINDEX(DISUB,"TYPE") D
 . . S DINDEX(1,"NODE")=DINODE Q:DIFLAGS[4
 . . I DIFLAGS'["Q",$$CHKP^DICUIX1(.DIFILE,.DINDEX,+$G(DINUMBER),DIFR_DIPRT,.DISCREEN) D  Q
 . . . D TMPIDX^DICUIX1(1,.DITEMP,.DITEMP2,.DINDEX)
 . . S DINDEX("AT")=2
 ;
 I DISUB>1 D
 . I DIFLAGS[4,"VP"[DINDEX(DISUB,"TYPE") S DINDEX(DISUB,"GET")="DIVAL=$G(DINDEX(DISUB,""EXT""))"
 . I DIFLAGS[3,"VP"[DINDEX(DISUB,"TYPE"),DIFLAGS'["Q",'$D(DINDEX("ROOTCNG")) D TMPIDX^DICUIX1(DISUB,.DITEMP,.DITEMP2,.DINDEX) Q
 . S DITEMP=DITEMP_"DINDEX("_(DISUB-1)_")"
 ;
 S DINDEX(DISUB,"ROOT")=DITEMP_")",DITEMP=DITEMP_","
 I $D(DITEMP2) D
 . S:DISUB>1 DITEMP2=DITEMP2_"DIX("_(DISUB-1)_")"
 . S DINDEX(DISUB,"IXROOT")=DITEMP2_")",DITEMP2=DITEMP2_","
 ;
C5 ; 5. Set Any More?
 ;
 S DINDEX(DISUB,"MORE?")=0
 I +$P(DIPRT,"E")=DIPRT,DITYPE'["D" D
 . ;
 . Q:DIFLAGS["X"  ; no partial-numeric matches if require exact
 . N PNM S PNM=0 ; suppress PNM for pointers or variable pointers?
 . I "VP"[$E(DITYPE) D  Q:'PNM  ; at least for these cases:
 . . I DIFLAGS["l",DIC(0)["U" Q  ; classic, untransformed lookup
 . . I DIFLAGS[3,DIFLAGS["Q" Q  ; Lister, quick list
 . . I DIFLAGS[4,DIFLAGS["Q" Q  ; Finder, quick lookup
 . . S PNM=1 ; otherwise, allow it on ptrs or vptrs
 . ;
 . I DINDEX(DISUB,"WAY")=-1 S DINDEX(DISUB,"MORE?")=1 Q
 . I +$P(DIFR,"E")=DIFR!(DIFR="") S DINDEX(DISUB,"MORE?")=1
 ;
C6 ; 6. Handle partial matches, incl. setting From
 ;
 I DIPRT]"" D
 . I DIFLAGS[4,"VP"[DINDEX(DISUB,"TYPE") Q:DIFLAGS'["l"  Q:DISUB>1
 . I DITYPE["D",DIFLAGS[3 D  Q
 . . N I S I=$S(DINDEX(DISUB,"WAY")=1:"0000000",1:9999999)
 . . D DAT(.DIFR,DIPRT,I,DINDEX(DISUB,"WAY"),.DIOUT)
 . Q:$E(DIFR,1,$L(DIPRT))=DIPRT
 . I DINDEX(DISUB,"WAY")=1 D  Q
 . . I DIFR]](DIPRT_$S(+$P(DIPRT,"E")=DIPRT:" ",1:"")) S DIOUT=1 Q
 . . I +$P(DIPRT,"E")=DIPRT,DIPRT<0 S DIFR=$S(DIPRT[".":$P(DIPRT,".")-1,1:"")  Q
 . . I +$P(DIPRT,"E")=DIPRT,+$P(DIFR,"E")=DIFR,DIFR>DIPRT Q
 . . S DINDEX(DISUB,"USE")=1
 . . S DIFR=DIPRT_$S(+$P(DIPRT,"E")'=DIPRT:"",DIFR]]DIPRT:" ",1:"")
 . ;
 . I DIFR'="",DIPRT]]DIFR S DIOUT=1 Q
 . I +$P(DIPRT,"E")=DIPRT,DIFR?.1"-"1.N.E Q
 . S DINDEX(DISUB,"USE")=1
 . S DIFR=$$BACKFROM(DIPRT) ; start from end of partial matches
 ;
 S DINDEX(DISUB)=$G(DIFR) I DIFR]"" S DINDEX(DISUB,"FROM")=DIFR
 I DIPRT]"" S DINDEX(DISUB,"PART")=DIPRT
 I $D(DITO(DISUB)) S DINDEX(DISUB,"TO")=DITO(DISUB)
 ;
C7 ; 7. Handle subscripts with data-type transforms
 ;
 I $G(DIDENT(-5)) D
 . I $D(DINDEX(DISUB,"TRANOUT")) S DINDEX(DISUB,"GETEXT")=DIGET Q
 . N T S T=DITYPE I T'["D",T'["S",T'["P",T'["V",T'["O" Q
 . I DIFLAGS[3,"PV"[DINDEX(DISUB,"TYPE"),(DISUB>1!($D(DINDEX("ROOTCNG",1)))) D
 . . I DINDEX(DISUB,"FILE")'=DIFILE S DIGET=0 Q
 . . S DIGET=2
 . S DINDEX(DISUB,"GETEXT")=DIGET
 ;
 QUIT  ; end of COMMON1
 ;
 ;
BACKFROM(DIPART) ; Return From Value for Backward Collation
 ;
 ;;private;function;clean;silent;SAC compliant
 ; input: DIPART = the partial-match value
 ; output = From value for backward collation
 ; called by:
 ;   COMMON1, at C6+18
 ;   BACKFROM^DICF1
 ; calls: none
 ;
 N DIFROM S DIFROM=DIPART_"{{{{{{{{{{"
 ;
 QUIT DIFROM ; return From value ; end of $$BACKFROM
 ;
 ;
COMMON2 ; Load IEN-subscript Data into DINDEX
 ;
 N DIEN S DIEN=DINDEX("#")+1
 S:DINDEX'="#" DINDEX(DIEN,"ROOT")=DITEMP_"DINDEX("_(DIEN-1)_"))"
 I $D(DITEMP2) S DINDEX(DIEN,"IXROOT")=DITEMP2_"DIX("_(DIEN-1)_"))"
 I $G(DINDEX("WAY","REVERSE")),DIFROM("IEN") S DINDEX(DIEN,"TO")=DIFROM("IEN"),DIFROM("IEN")=""
 S DINDEX(DIEN)=DIFROM("IEN")
 I DINDEX(DIEN)=0,DINDEX("WAY")=-1 S DINDEX(DIEN)=""
 I DIFROM("IEN") S DINDEX(DIEN,"FROM")=DIFROM("IEN")
 S DINDEX(DIEN,"WAY")=DINDEX("WAY")
 ;
 QUIT  ; end of COMMON2
 ;
 ;
DAT(DIFR,DIPRT,DIAPP,DIWAY,DIOUT) ; Process FROM and PART for dates
 ;
 N L,P,DIPART S L=$L(DIFR),P=$L(DIPRT),DIPART=DIPRT
 I L<P S DIFR=DIFR_$E(DIPART,L+1,P)
 I $L(DIFR)<7 S DIFR=$E(DIFR_DIAPP,1,7)
 Q:$E(DIFR,1,P)=DIPART
 I P<7 S DIPART=$E(DIPART_DIAPP,1,7)
 I DIWAY=1,DIFR]]DIPART S DIOUT=1 Q
 I DIWAY=-1,DIPART]]DIFR S DIOUT=1 Q
 S $E(DIFR,1,P)=DIPRT
 S DINDEX(DISUB,"USE")=1
 ;
 QUIT  ; end of DAT
 ;
 ;
ORDERQ(FILENUM) ; Is File Like Order File: Dinumed but No B Index?
 ;
 I $P($G(^DD(+FILENUM,.01,0)),U,5,99)["DINUM=X",$P(^(0),U,2)'["P",$P(^(0),U,2)'["D",'$D(^DD(+FILENUM,0,"IX","B")) Q 1
 ;
 QUIT 0 ; end of $$ORDERQ
 ;
 ;
EOR ; end of routine DICUIX2

DID
DID ;SFISC/XAK-LIST DD'S ;8SEP2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D KL,L^DICRW1 I $D(DIC) S (DUB,DIB,DFF)=+Y G O:Y'=+DIB(1),SUB
KL K DIS,DIJS,DHIT,DIB,DINM,DIDX,DIGR,DIDH,BY,DICMX,DIOEND,FLDS
 K DFF,DIFF,DID,DUB,DHD,DIC,DICS,POP,DA,DR,S,F,J,K,Z,W,X,Y,M,G,N,I
 K DIWF,DIPP,DPP,DIMS,DIPQ,DJ,DDL1,DDL2,DDL3,DDLF,DDN1,X1,DDRG,I1
 K DIDRANGE,DIDFLD,DIDTYP
 Q
 ;
SUB S DIC="^DD("_+Y_"," G O:$O(^DD(+Y,"SB",0))'>0 S DIC(0)="AEQZ",DIC("A")="      Select SUB-FILE: ",DIC("S")="I $P(^(0),U,2)" D ^DIC G KL:$D(DTOUT) I Y>0 S (DFF,Y)=+$P(Y(0),U,2) G SUB
 G KL:X[U
O K DIC S:DFF-DUB DIC("S")="I Y-5" S DIC="^DOPT(""DID"",",DIC(0)="AEQ",DIC("B")=1 D ^DIC G KL:Y<0
O1 K DIC S DIC="^DD(DFF,"
 I +Y=3 D  D EN^DIP G KL
 .I $D(^DIC(DFF)) S DIB(1)=$O(^DD($O(^DIC(DIB(1)))),-1)
 .S DIS(0)="I $D(^DD(DFF,D0,0))",DIOEND="G L^DIDC"
 .S DIOBEG="S L=0 I $G(DQI),$D(^UTILITY($J,2)) S ^(1.5)=""W $O(^DD(DIB,0,""""NM"""",0)),"""" """" W:'$D(^DIC(DIB)) """"SUB-"""" W """"FILE """""",^(2)=""X ^(1.5) ""_^(2)"
 I +Y=4,'$D(DIFORMAT) D MOD^DID2 G KL:X[U
 S L=0,FLDS="",BY="@.001" I +Y=5 S (FR,TO)=.01,DHIT="S F(1)=DUB",DHD="W """" D H1^DIDG",DIOEND="D T^DID" G G
 I +Y=8 D  G KL:DIDTYP="",KL:DIDFLD=-1,G
 . S DIDTYP=$$ASKTYP Q:DIDTYP=""
 . S DIDFLD=$$ASKFLD(DFF) Q:DIDFLD=-1
 . S (FR,TO)=.01,DHIT="S F(1)=DFF"
 . S DHD="W """" D IXHEAD1^DID"
 . S DIOEND="D IX^DID"
 I +Y=9 S (FR,TO)=.01,DHIT="S F(1)=DFF",DHD="W """" D KEYHEAD1^DID",DIOEND="D KEY^DID" G G
 S DHIT="D ^DID1",DHD="W """" D ^DIDH",(FR,TO)="",DIOEND="D END^DID"
 I +Y=6 S DHIT="D ^DIDG",DIOEND="D END^DIDG"
 I +Y=2 S DHIT="D ^DIDX",DIDX=0,%=2 I '$D(DIFORMAT) D AH^DIDX G KL:%<1
 I +Y=7 S DHIT="S (X1,X2)=DFF D ^DIDC",DHD="@" S DIOEND="D IOF^DID"
 I "^1^2^4^"[(U_+Y_U),'$D(DIGR) D ASKRANGE(DFF,BY,.FR,.TO) G:FR=-1 KL S DIDRANGE=FR]""
G Q:DIB=0  S DIOEND(1)=DIOEND,DIOEND="D LOOP^DID" D EN1^DIP G KL
LOOP I $D(Y),Y=U Q
 X DIOEND(1) I $D(M),M=U Q
 I IOST?1"C-".E W $C(7) R X:DTIME I X[U!'$T Q
 S DN=1,D0=0,DIB=$O(^DIC(+DIB)) Q:DIB>DIB(1)!(+DIB'=DIB)  S (F(1),DUB,DFF)=DIB,DC="," D ^DIO2 I $D(M),M=U Q
 G LOOP
 ;
END ;
 I $D(^UTILITY($J,"P")) W !!!?6,"FILES POINTED TO",?44,"FIELDS",! D PTR^DIDC
D K ^UTILITY($J,"P") G IOF:DHIT["DIDX"!$G(DIDRANGE)
 D IX I M=U S DN=0 Q
T ;
 S S=0,M=1
T1 S S=S+1 D:$Y+3>IOSL HDR^DIDG Q:M=U
 W !!,$S(S<4:$P("INPU^PRIN^SOR",U,S)_"T TEMPLATE(S):",1:"FORM(S)/BLOCK(S):")
 S DFF="^DI"_$P("E^PT^BT^ST(.403)",U,S),DA=""
 F  S DA=$O(@DFF@("F"_F(1),DA)) Q:DA=""  D  Q:M=U
 . S DUB=0 F  S DUB=$O(@DFF@("F"_F(1),DA,DUB)) Q:'DUB  D  Q:M=U
 .. I $D(@DFF@(DUB,0))#2 S %1=^(0) D TEMPL
 K %1 G Q:M=U,T1:S<4
IOF W:IOST'?1"C".E @IOF Q
 ;
TEMPL I $Y+3>IOSL D HDR^DIDG Q:M=U
 W !,$P(%1,U),?30 G:DFF["DIST" FORM
 S W="",Y=$P(%1,U,2) I Y D DD^%DT W Y
 W ?50,"USER #"_+$P(%1,U,5),?61 I $D(@(DFF_"(DUB,""ROU"")")) W ^("ROU")_$P("*",U,DFF["DIBT")_" "
 I $D(^("H")) S Y=^("H"),%=$L(Y) W:65+%>IOM ! W "   ",?IOM-%-1,$E(Y,1,IOM-4)
 G DES:DFF'="^DIBT"
 I $D(^("DIPT")) W ?55 S Y=" '"_^("DIPT")_"' Print Template always used" W:$X+$L(Y)>IOM ! W ?IOM-$L(Y)-1,Y
 I $D(^(2)) S D0=DUB,DICMX="W !?4,X" X $P(^DD(.401,1620,0),U,5,99)
 F Y=1:1 Q:'$D(^DIBT(DUB,"O",Y,0))  W "  " S %=^(0),D=IOM-$L(%)-5 W:$X>D !?$S(D>55:55,1:D) W %
DES N A1,%1,X S A1=$P($G(@(DFF_"(DUB,""%D"",0)")),U,3) F %1=0:0 S %1=$O(@(DFF_"(DUB,""%D"",%1)")) Q:%1'>0  Q:+A1&(%1>A1)  S X=^(%1,0) W !,?5,X
Q W:DFF["DIBT" ! Q
DT G DT^DIO2
 ;
EN ;
 Q:'$D(DIC)  I 'DIC,$D(@(DIC_"0)")) S DIC=+$P(^(0),U,2)
 Q:'DIC!'$D(^DIC(DIC,0,"GL"))  S (DFF,DUB,DIB,DIB(1))=DIC
 G O:'$D(DIFORMAT) S Y=DIFORMAT I 'Y S Y=$O(^DOPT("DID","B",Y,0))
 Q:Y>9!'Y  G O1
 ;
FORM ;
 S Y=$P(%1,U,5) I Y D DD^%DT W ?30,Y
 W ?50,"USER #"_+$P(%1,U,4)
 ;
 N B,L,P
 S L=1,L(1)=U
 S P=0 F  S P=$O(^DIST(.403,DUB,40,P)) Q:'P  D  Q:M=U
 . Q:$D(^DIST(.403,DUB,40,P,0))[0  S B=$P(^(0),U,2) D:B BLOCK  Q:M=U
 . S B=0 F  S B=$O(^DIST(.403,DUB,40,P,40,B)) Q:'B  D BLOCK  Q:M=U
 S %1=0 F  S %1=$O(@DFF@(DUB,15,%1)) Q:'%1  W:$D(^(%1,0))#2 !?5,^(0)
 W !
 Q
BLOCK ;
 N I
 F I=1:1:L I L(I)[(U_B_U) G BLOCKQ
 S:$L(L)+$L(B)+1>245 L=L+1,L(L)=U S L(L)=L(L)_B_U
 Q:$D(^DIST(.404,B,0))[0  S %1=^(0)
 ;
 I $Y+3>IOSL D HDR^DIDG Q:M=U
 W !?2,$P(%1,U) W:$P(%1,U,2)]"" ?32,"DD #"_$P(%1,U,2)
BLOCKQ Q
 ;
IX ;Print index details
 N DIDPG,DIDFLG
 S DIDPG("H")="W """" D IXHEAD^DID S:M=U PAGE(U)=1"
 D WRLN^DIKCP("",0,.DIDPG) Q:M=U
 I DHIT="S F(1)=DFF" D
 . S DIDFLG=$S(DIDTYP="B":"",DIDTYP="T":"O",1:"FR")_$E("M",'$G(DIDFLD))
 E  S DIDFLG="RM"
 S DIDFLG=DIDFLG_"SL2"_$E("N",$D(DINM)#2)
 D PRINT^DIKCP(F(1),$G(DIDFLD),DIDFLG,.DIDPG)
 Q
 ;
IXHEAD S DC=DC+1 I IOST?1"C".E W $C(7) R M:DTIME S:'$T M=U Q:M=U
IXHEAD1 W:$D(DIFF)&($Y) @IOF S DIFF=1
 W $S("B"[$G(DIDTYP):"INDEX AND CROSS-REFERENCE",DIDTYP="T":"TRADITIONAL CROSS-REFERENCE",1:"NEW-STYLE INDEX")
 W " LIST -- FILE #"_DIB_$S($G(DIDFLD):", FIELD #"_DIDFLD,1:"")
 W:$D(DIFF)&($Y) @IOF S DIFF=1 W "INDEX AND CROSS-REFERENCE LIST -- FILE #"_DIB,?(IOM-20),$$OUT^DIALOGU(DT,"FMTE",2)_"     "_$$EZBLD^DIALOG(7095,DC) ;**CCO/NI DATE FORMAT, 'PAGE'
 S M="",$P(M,"-",IOM)="" W !,M
 Q
 ;
KEY ;Print keys
 N DIDPG
 S DIDPG("H")="W """" D KEYHEAD^DID S:M=U PAGE(U)=1"
 D WRLN^DIKKP("",0,.DIDPG) Q:M=U
 D PRINT^DIKKP(F(1),"","ML2",.DIDPG)
 Q
 ;
KEYHEAD S DC=DC+1 I IOST?1"C".E W $C(7) R M:DTIME S:'$T M=U Q:M=U
KEYHEAD1 W:$D(DIFF)&($Y) @IOF S DIFF=1 W "KEY LIST -- FILE #"_DIB,?(IOM-20),$$OUT^DIALOGU(DT,"FMTE",2)_"     "_$$EZBLD^DIALOG(7095,DC) ;**CCO/NI  DATE FORMAT, 'PAGE'
 S M="",$P(M,"-",IOM)="" W !,M
 Q
 ;
ASKFLD(DIDFILE) ;Ask for a single field
 Q:'$G(DIDFILE) ""
 ;
 N %,D,D0,DA,DDD,DIC,DICR,DIX,DO,DP,DZ,X,Y,DTOUT,DUOUT
 S DIC="^DD("_DIDFILE_",",DIC(0)="QAEN"
 S DIC("S")="I '$P(^(0),U,2)&($P(^(0),U,2)'[""C"")"
 S DIC("A")="Which field: ALL// "
 D ^DIC K DIC
 Q $S(X="":"",1:+Y)
 ;
ASKTYP() ;Ask for type of cross-reference
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="SAM^T:TRADITIONAL;N:NEW;B:BOTH"
 S DIR("A")="What type of cross-reference (Traditional or New)? "
 S DIR("B")="Both"
 S DIR("?",1)="Enter 'T' to print only traditional cross-references."
 S DIR("?",2)="  Traditional cross references are stored in the data"
 S DIR("?",3)="  dictionary under ^DD(file#,field#,1)."
 S DIR("?",4)=" "
 S DIR("?",5)="Enter 'N' to print only new-style cross-references."
 S DIR("?",6)="  New-Style cross references are stored in the Index file."
 S DIR("?",7)=" "
 S DIR("?")="Enter 'B' to print both kinds of cross-references."
 D ^DIR
 Q $S($D(DIRUT):"",1:Y)
 ;
ASKRANGE(DIDFILE,DIDBY,DIDFR,DIDTO) ;Ask for a range of fields
 Q:'$G(DIDFILE)
 ;
 N %,D,D0,DA,DDD,DIC,DICR,DIX,DO,DP,DZ,X,Y,DTOUT,DUOUT
 S DIC="^DD("_DIDFILE_",",DIC(0)="QAEN"
 S DIC("A")="Start with field: FIRST// "
 D ^DIC K DIC
 I X="" S (DIDFR,DIDTO)="" Q
 I Y=-1 S (DIDFR,DIDTO)=-1 Q
 S DIDFR=$S(DIDBY[".001":+Y,1:$P(Y,U,2))
 ;
 S DIC="^DD("_DIDFILE_",",DIC(0)="QAEN"
 S DIC("A")="Go to field: "
 D ^DIC K DIC
 I X="" S DIDTO="" Q
 I Y=-1 S (DIDFR,DIDTO)=-1 Q
 S DIDTO=$S(DIDBY[".001":+Y,1:$P(Y,U,2))
 ;
 S:DIDTO']]DIDFR %=DIDTO,DIDTO=DIDFR,DIDFR=%
 Q
 ;
FILELST(DIDROOT) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DIDARRAY
 D EN4^DIQGDD
 M @DIDROOT=DIDARRAY
 Q
 ;
FILE(DIQGR,DIQGPARM,DR,DIQGTA,DIQGERRA,DIQGIPAR) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 G EN2^DIQGDDF
 ;
FIELDLST(DIDROOT) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DIDARRAY
 D EN5^DIQGDD
 M @DIDROOT=DIDARRAY
 Q
 ;
FIELD(DIQGR,DA,DIQGPARM,DR,DIQGTA,DIQGERRA,DIQGIPAR) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 G EN1^DIQGDD
 ;
GET1(DIQGR,DA,DIQGPARM,DR,DIQGETA,DIQGERRA,DIQGIPAR) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 G EN3^DIQGDD
 ;
PIECE(DIQGR,DA,DIQGPARM,DR,DIQGTA,DIQGERRA,DIQGIPAR) ;CLOSEDREF,PIECE,FLAG,ATTRIBUTE,TARGETARRAY,ERRORARRAY,INTERNAL
 ;PROCEDURE CALL AND  * * RETURN RESULTS IN TARGET ARRAY * *
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 G EN6^DIQGDD0

DID1
DID1 ;SFISC/XAK,JLT-STD DD LIST ;16JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DJ(Z)=D0,DDL1=14,DDL2=32 G B
 ;
L S DJ(Z)=0
A S DJ(Z)=$O(^DD(F(Z),DJ(Z))) I DJ(Z)'>0 S:DJ(Z)="" DJ(Z)=-1 W !! S Z=Z-1 Q
B S N=^DD(F(Z),DJ(Z),0) K DDF I $D(DIGR),Z<2!(DJ(Z)-.01) X DIGR E  G ND
 D HD:$Y+$L(X)+6>IOSL Q:M=U  W !!,F(Z),",",DJ(Z)
LABEL W ?(Z+Z+12),$P(N,U),?DDL2+4," "_$P(N,U,4)
 F X=0:0 S X=$O(^DD(F(Z),DJ(Z),.008,X)) Q:'X  S W=$P($G(^(X,0)),U) I W]"",$D(^DI(.85,X,0)) S I=$P(^(0),U,2)_": " W !?(Z+Z+12-$L(I)),I,W ;**CCO/NI DISPLAY FOREIGN LABELS
 S X=$P(N,U,2)
WP I X,$D(^DD(+X,.01,0)) S W=$P(^(0),U,2) I W["W" D  S X=""
 .S X="WORD-PROCESSING #"_+X D  S X="(NOWRAP)" D:W["L"  S X="(IGNORE ""|"")" D:W["X"!(W["x")  S X="(UNEDITABLE)" D:W["I"  S X="(AUDITED)" D:$G(^("AUDIT"))]""
 ..W:$L(X)+$X+5>IOM !?18 W "   ",X
 F W="BOOLEAN","COMPUTED","FREE TEXT","SET","DATE","NUMBER","POINTER","K","VARIABLE POINTER","m","p" I X[$E(W) D VP^DIDX:$E(W)="V" S:W="K" W="MUMPS" S:W="p" W="POINTER" S:W="m" W="MULTIPLE" W ?40," "_W G ND:M=U
TYPE S W=+$P(X,"t",2) I W,$D(^DI(.81,W,0)) S W=" ("_$P(^(0),U)_" Data Type)" D W G ND:M=U
 I +X S W=" Multiple" S W=W_" #"_+X D W G ND:M=U
 I X["V" S I=0 F  S I=$O(^DD(F(Z),D0,"V",I)) Q:I'>0  S %Y=$P(^(I,0),U) I $D(^DIC(%Y,0)),$D(@(^(0,"GL")_"0)")) S ^UTILITY($J,"P",$E($P(^(0),U),1,30),0)=%Y,^(F(Z),DJ(Z))=0
 I 'X D
P .N Y,NM S:X["P" Y=U_$P(N,U,3),NM=+$P(X,"P",2) I X["C" S NM=+$P(X,"p",2) I NM S Y=$G(^DIC(NM,0,"GL"))
 .Q:'$D(Y)  N PF I Y[U,$D(@(Y_"0)")) S W=" TO "_$P(^(0),U)_" FILE (#"_NM_")",PF=$E($P(^(0),U),1,30)
 .E  S PF="UNDEFINED FILE"_$S(NM:" (#"_NM_")",1:""),W="  ***** TO AN "_PF_$S(Y[U:", STORED IN "_$$CREF^DILF(Y),1:"")_" *******",PF="}"_PF,NM="" W:($L(W)+$X)'<IOM !
 .S ^UTILITY($J,"P",PF,0)=NM,^(F(Z),DJ(Z))=0
 .D W
MP I X'["V" D RT^DIDX G:M=U ND
S I X["S" D  G ND:M=U
 .N N1,LANG
 .S N1=$P(N,U,3) F %1=1:1 S Y=$P(N1,";",%1) Q:Y=""  W ! S W="'"_$P(Y,":")_"' FOR "_$P(Y,":",2)_"; " D W Q:M=U  D
 ..F LANG=0:0 S LANG=$O(^DD(F(Z),DJ(Z),.007,LANG)) Q:'LANG  I $D(^(LANG,0)) W " (",$P(^(0),";",%1),")"
 G RD:$D(DINM) I X["C" S W=$P(N,U,5,99) W !?DDL1,"MUMPS CODE: " D W G ND:M=U G RD
 I "Q"'[$P(N,U,5) W !?DDL1,"INPUT TRANSFORM:" S W=$P(N,U,5,99) D W G ND:M=U
 I $D(^DD(F(Z),DJ(Z),2))#2 W !?DDL1,"OUTPUT TRANSFORM:" S W=$S($D(^DD(F(Z),DJ(Z),2.1)):^(2.1),1:^(2)) D W G ND:M=U
RD D ^DID2:$O(^DD(F(Z),DJ(Z),2.99))]"" G ND:M=U I 'X S W="UNEDITABLE" W:X["I" ! D W:X["I" G N
 I $O(^DD(+X,0,"ID",""))]"" W !?DDL1,"IDENTIFIED BY:" S W="" F %=0:0 S %=$O(^DD(+X,0,"ID",%)) S:%>0 W=W_$P(^DD(+X,%,0),U)_"(#"_%_")"_$S($P(^(0),U,2)["R":"[R]",1:"")_", " I %'>0 S:W?.E1", " W=$E(W,1,$L(W)-2) D W G ND:M=U Q
 ;
 ;Print "WRITE" identifiers
 I '$D(DINM) S %=" " F  S %=$O(^DD(+X,0,"ID",%)) Q:%=""  D  Q:M=U
 . N DIDLN,DIDPG
 . S DIDLN(1)=$G(^DD(+X,0,"ID",%)) Q:DIDLN(1)?."^"
 . S DIDLN(0)=""""_%_""":    "
 . S DIDLN(0)=$J("",DDL2-DDL1-$L(DIDLN(0)))_DIDLN(0)
 . S DIDPG("H")="W """" D H^DIDH S:M=U PAGE(U)=1"
 . D WRPHI^DIKCP1(.DIDLN,IOM-1-DDL2,DDL1,DDL2-DDL1,1,.DIDPG)
 G:M=U ND
 ;
 I $D(^DD("KEY","B",+X)) D  G:M=U ND
 . N DIDPG
 . S DIDPG("H")="W """" S DC=DC+1 D ^DIDH1 S:M=U PAGE(U)=1"
 . D PRINT^DIKKP(+X,"","L"_DDL1_"C"_(DDL2-DDL1),.DIDPG)
 I $D(^DD("IX","B",+X)) D  G:M=U ND
 . N DIDPG
 . S DIDPG("H")="W """" S DC=DC+1 D ^DIDH1 S:M=U PAGE(U)=1"
 . D LIST^DIKCP(+X,"","L"_DDL1_"C"_(DDL2-DDL1),.DIDPG)
 S Z=Z+1,DDL1=DDL1+2,DDL2=DDL2+2,F(Z)=+X
 D L
N K DDN1 I X["X" S DDN1=1 W !,?DDL1,"NOTES:",?DDL2,"XXXX--CAN'T BE ALTERED EXCEPT BY PROGRAMMER" W ! G ND:M=U
 S W=0 I $O(^DD(F(Z),DJ(Z),5,W))'="",'$D(DDN1) W !?DDL1,"NOTES:"
TR S W=$O(^DD(F(Z),DJ(Z),5,W)) S:W="" W=-1 G IX:W'>0 S I=^(W,0),%=+I I '$D(^DD(%,$P(I,U,2),0))!$D(W(I)) K ^DD(F(Z),DJ(Z),5,W) G TR
 S W(I)=0 S WS=W D WR^DIDH1 W ! S W=WS K WS G TR
IX S F=0 F  G ND:M=U S F=$O(^DD(F(Z),DJ(Z),1,F)) Q:F'>0  W !?DDL1,"CROSS-REFERENCE:" D IX1
 S:F="" F=-1
 I $D(^DD("IX","F",F(Z),DJ(Z))) D  S:M=U DN=0
 . N DIDPG,DIDFLAG
 . S DIDPG("H")="W """" S DC=DC+1 D ^DIDH1 S:M=U PAGE(U)=1"
 . S DIDFLAG="L"_DDL1_"C"_(DDL2-DDL1)_"T1"
 . D PRINT^DIKCP(F(Z),DJ(Z),$E("R",$G(DIDRANGE))_"FS"_DIDFLAG_$E("N",$D(DINM)#2),.DIDPG) Q:M=U
 . D:'$G(DIDRANGE) LIST^DIKCP(F(Z),DJ(Z),"RS"_DIDFLAG,.DIDPG)
ND S X="" G:M'=U A:Z>1 Q
IX1 S W=^(F,0)_" " K DDF W ?DDL2,W,! G ND:M=U D TP:$P(W,U,3)["TRIG" I '$D(DINM) S X=0 F %=0:0 S X=$O(^DD(F(Z),DJ(Z),1,F,X)) Q:X=""  I X'="%D",X'="DT" S W=^(X) S:$L(W)<248 W=X_")= "_W K:X=3 DDF D W W ! G ND:M=U
 Q:'$D(^("%D"))
 ;
 N DIDI,DIDN,DIDZ,DIWF,DIWL,DIWR,X
 K ^UTILITY($J,"W")
 S DIWF="W",DIWL=DDL2+1,DIWR=IOM,DIDZ=Z
 S DIDN=$P($G(^DD(F(DIDZ),DJ(DIDZ),1,F,"%D",0)),U,3),DIDI=0
 F  S DIDI=$O(^DD(F(DIDZ),DJ(DIDZ),1,F,"%D",DIDI)) Q:'DIDI!(DIDN&(DIDI>DIDN))  S X=^(DIDI,0) D ^DIWP I $D(DN),'DN S M=U Q
 I M'=U D ^DIWW I $D(DN),'DN S M=U
 I M'=U W !
 E  K DIOEND
 S Z=DIDZ
 K ^UTILITY($J,"W")
 Q
 ;
TP S X=+$P(^(0),U,4) I F(Z)-X,$D(^DIC(X,0))#2 S ^UTILITY($J,"P",$E($P(^(0),U,1),1,30),0)=X,^(F(Z),DJ(Z))=6
 Q
W F K=0:0 W:$D(DDF) ! S:(($L(W)+DDL2)>IOM) DDL2=32 W ?DDL2 S %Y=$E(W,IOM-$X,999) W $E(W,1,IOM-$X-1) Q:%Y=""  S W=%Y,DDF=1
 K:'X DDF Q:$Y+6<IOSL
HD S DC=DC+1 D ^DIDH Q

DID2
DID2 ;SFISC/GFT-MODIFIED DD ;25JUL2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I $D(DINM) G DZ:X'["C"!(X["X")!'$D(^DD(F(Z),DJ(Z),9.1)) S %Y=X,X=^(9.1),W=" --  "_X D ^DIM,W1^DIDH1:'$D(X) S X=%Y G Q:M=U G DZ
 F I=9.2:.1 Q:'$D(^(I))#2  W ! S W=I_" = "_^(I) D W G Q:M=U
 I $D(^(9.1))#2 S W=^(9.1),%Y="9.1 = " S:X["C" %Y="ALGORITHM:  " W !,?DDL1,%Y D W S W=$P("  (ALWAYS "_$E(N,$L(N)-1)_" DECIMAL DIGITS)",U,N?.E1" S X=$J(X,0,"1N1")") D W G Q:M=U
DZ ;
 I $D(^("DT")) S Y=^("DT") D D^DIQ W !?DDL1,"LAST EDITED: " S W=Y D W1^DIDH1 G Q:M=U
H K W I $D(^DD(F(Z),DJ(Z),3)),^(3)]"" W !?DDL1,"HELP-PROMPT:" S W=^(3) D W1^DIDH1 G Q:M=U
EGP F %Y=0:0 S %Y=$O(^DD(F(Z),DJ(Z),.009,%Y)) Q:'%Y  I $D(^(%Y,0)) S W="("_^(0)_")" W ! D W1^DIDH1 G Q:M=U ;**CCO/NI  FOREIGN-LANGUAGE HELP-PROMPTS
 F %Y=21,23 I $O(^DD(F(Z),DJ(Z),%Y,0))>0 D DE^DIDH1 G:M=U Q
SC ;
 I $D(^DD(F(Z),DJ(Z),12.1)),'$D(DINM) I X["P"!(X["S") W !?DDL1,"SCREEN:" S W=^(12.1) D W I $D(^(12)) W !?DDL1,"EXPLANATION:" S W=^(12) D W G Q:M=U
 I '$D(DINM),$D(^DD(F(Z),DJ(Z),4)),^(4)]"" W !?DDL1,"EXECUTABLE HELP:" S W=^(4) D W G Q:M=U
 I $D(^(9.02))#2 W !?DDL1,"SUM:" S W=^(9.02) D W G Q:M=U
AUD S W=$G(^DD(F(Z),DJ(Z),"AUDIT")) I "n"'[W D  G:M=U Q
 . W !?DDL1,"AUDIT: "
 . S W=$S(W="y":"YES, ALWAYS",W="e":"EDITED OR DELETED",1:W) D W Q:M=U
 . S W=$G(^DD(F(Z),DJ(Z),"AX"))
 . I '$D(DINM),W]"" W !?DDL1,"AUDIT CONDITION: " D W
PRELKUP I '$D(DINM),DJ(Z)=.01,$G(^DD(F(Z),DJ(Z),7.5))]"" W !?DDL1,"PRE-LOOKUP: " S W=^(7.5) D W G:M=U Q
DEL N DIDND
 I '$D(DINM) S DIDND=$O(^DD(F(Z),DJ(Z),"DEL","")) I DIDND]"" D  G:M=U Q W !
 . W !?DDL1,"DELETE TEST: "
 . F  D  S DIDND=$O(^DD(F(Z),DJ(Z),"DEL",DIDND)) Q:DIDND=""!(M=U)  W !!
 .. S W=$$QT(DIDND)_",0)= " D W Q:M=U
 .. S W=$G(^DD(F(Z),DJ(Z),"DEL",DIDND,0)) D W
LAYGO I '$D(DINM),DJ(Z)=.01 S DIDND=$O(^DD(F(Z),DJ(Z),"LAYGO","")) I DIDND]"" D  G:M=U Q W !
 . N J W !?DDL1,"LAYGO TEST: "
 . F  D  S DIDND=$O(^DD(F(Z),DJ(Z),"LAYGO",DIDND)) Q:DIDND=""!(M=U)  W !!
 .. S W=$$QT(DIDND)_",0)= " D W Q:M=U
 .. S W=$G(^DD(F(Z),DJ(Z),"LAYGO",DIDND,0)) D W
D I $D(^DD(F(Z),DJ(Z),8.5)) W !?DDL1,"DELETE AUTHORITY: " S W=^(8.5) D W G Q:M=U
 I X'["C",$D(^(9))#2,^(9)]"" W !?DDL1,"WRITE AUTHORITY:" S W=^(9) D W G Q:M=U
RD I $D(^(8))#2,^(8)]"" W !?DDL1,"READ AUTHORITY:" S W=^(8) D W G Q:M=U
 I $D(^(10))#2,^(10)]"" W !?DDL1,"SOURCE OF DATA:" S W=^(10) D W G Q:M=U
 I $O(^(11,0))>0 W !?DDL1,"DATA DESTINATION:" S I=0 F  S I=$O(^DD(F(Z),DJ(Z),11,I)) Q:I=""  S:$D(^DIC(.2,+^(I,0),0)) W=$P(^(0),U)
 I  S I=-1 D W G Q:M=U
 I $O(^DD(F(Z),DJ(Z),20,0))>0 W !?DDL1,"GROUP:" S I=0 F  S I=$O(^DD(F(Z),DJ(Z),20,I)) Q:I=""  S W=$P(^(I,0),U)
 I  S I=-1 D W
 Q
 ;
W F K=0:0 S:(($L(W)+DDL2)>IOM) DDL2=32 W ?DDL2 S %Y=$E(W,IOM-$X,999) W $E(W,1,IOM-$X-1) Q:%Y=""  S W=%Y W !
 I $Y+6>IOSL S DC=DC+1 D ^DIDH
 I $D(^DD(F(Z),DJ(Z),0))
 Q
 ;
Q G ND^DID1
 ;
MOD ;FROM DID
 S X=U,%=2 W !,"WANT THE LISTING TO INCLUDE MUMPS CODE" D YN^DICN Q:%<0  S:%=2 DINM=1 I '% W !?5,"Enter YES, to see the MUMPS code as in the STANDARD listing.",!?5,"Enter NO, to eliminate MUMPS code from the listing." G MOD
MOD2 S %=2 W !,"WANT TO RESTRICT LISTING TO CERTAIN GROUPS OF FIELDS" D YN^DICN S:%=2 X=0 Q:%<0!(%=2)  I '% W !?5,"Enter YES, to select the Groups you wish to see in this listing.",!?5,"Enter NO, to see all fields." G MOD2
 W ! S DP="",L=""","_$S(Y-2:"DJ(Z)",1:"D1")_"))"
G R "Include GROUP: ",X:DTIME S:'$T X=U,DTOUT=1 I X[""""!($L(X)>30)!(X'?.ANP) W $C(7),!,"SORRY, THAT ISN'T WHAT A 'GROUP' NAME CAN LOOK LIKE",! G G
 Q:X[U  I X'?."?" S C="!" S:X?1"'"1E.E X=$E(X,2,99),C="&'" S DP=DP_C_"$D(^DD(F(Z),""GR"","""_X_L W !,"And " G G
 I X="" S:DP]"" DIGR="I "_$E(DP,2,999) Q
 W !?5,"To list only those fields which have a particular 'GROUP'",!?5,"(or several 'GROUPS') associated with them, Enter the GROUP NAME",!
 W ?5,"To screen out a group, Type ""'"" in front of its name.",!
 G G
 ;
QT(X) ;Quote X if noncanonic
 Q:X=+$P(X,"E") X
 S X=$NA(X(X)),X=$E(X,3,$L(X)-1)
 Q X

DIDC
DIDC ;SFISC/STAFF-CONDENSED DD ;26APR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
TODAY S DM="",Y=DT,X="I $Y+3>IOSL W $C(7) D P" X ^DD("DD") S DAT=Y ;**CCO/NI TODAY'S DATE
EN S N(0)=$O(^DD(X1),-1),I=0 F  S N(0)=$O(^DD(N(0))) Q:N(0)'>0!(N(0)>X2)  S NAME=$O(^DD(N(0),0,"NM",0)) I NAME'="" S P=0 D P,P2 G:DM["^" EXIT
EXIT K %DT,%ZIS,DAT,I,J,K,K1,M,N,N1,NAME,MO,P,X,X1,X2,Y,KK,NF,NY,POP S D0="B",M=DM K DM Q
P S P=P+1 I IOST?1"C-".E R:P'=1 DM:DTIME Q:DM["^"!'$T
 W:$D(DIFF)&($Y) @IOF S DIFF=1 W !!,"CONDENSED DATA DICTIONARY---",NAME," FILE"," (#",N(0),")" I $D(^%ZOSF("UCI"))#2 X ^("UCI") W ?47,"UCI: "_Y
 W ?63,$S($G(^DD(N(0),0,"VR"))]"":"   VERSION: "_$P(^("VR"),U),1:" ") W !!,"STORED IN: ",$S($D(^DIC(N(0),0,"GL")):^("GL"),1:""),?58,DAT,?70,"PAGE ",P W ! F I=0:1:IOM-1 W "-"
 G P1:P'=1 W !!,?50,"FILE SECURITY"
 W !,?35,"DD SECURITY    : ",$S($D(^DIC(N(0),0,"DD")):^("DD"),1:""),?58,"DELETE SECURITY: ",$S($D(^("DEL")):^("DEL"),1:"")
 W !,?35,"READ SECURITY  : ",$S($D(^("RD")):^("RD"),1:""),?58,"LAYGO SECURITY : ",$S($D(^("LAYGO")):^("LAYGO"),1:"")
 W !,?35,"WRITE SECURITY : ",$S($D(^("WR")):^("WR"),1:"")
AFOF I $D(^VA(200,"AFOF",N(0))) W !?10,"(NOTE: Kernel's File Access Security applies to this File.)",!
 W !,"CROSS REFERENCED BY:",!,?5
 S NY="" F KK=1:1 S NY=$O(^DD(N(0),0,"IX",NY)) Q:NY=""  S NF=+$O(^(NY,0)),N1=+$O(^(NF,0)) D
 .N % S %=0 F  S %=$O(^DD(NF,N1,1,%)) Q:'%  I $D(^(%,0)),+^(0)=N(0),$P(^(0),U,2)=NY W:$X>50&($L($P(^DD(NF,N1,0),"^",1)>20)) !,?5 W " ",$P(^DD(NF,N1,0),"^",1),"(",NY,") "
 D LIST^DIKCP(N(0),"","M")
P1 W !!!,?33,"FILE STRUCTURE",!! W "FIELD",?10,"FIELD",!,"NUMBER",?10,"NAME",! Q
P2 S M(0)=0 F K1=0:0 S M(0)=$O(^DD(N(0),M(0))),K=0 Q:+M(0)'>0!(M(0)?1U.U)  X X Q:DM["^"  W !,M(0),?10,$P(^DD(N(0),M(0),0),U,1)," " D M I J S K=K+1 D MO Q:DM["^"
 Q
MO X X Q:DM["^"  S N(K)=+$P(^DD(N(K-1),M(K-1),0),U,2) S M(K)=0
 F L=0:0 S M(K)=$O(^DD(N(K),M(K))) Q:M(K)'>0  X X Q:DM["^"  W !,?10+((K-1)*5),M(K),?15+((K-1)*5),$P(^DD(N(K),M(K),0),U,1)," " D M I J S K=K+1 D MO Q:DM["^"
 Q:DM["^"  X X Q:DM["^"  S K=K-1 Q
M S J=$P(^(0),U,2) W $S(+J:"(Multiple-"_+J,1:"("_J),"), [",$P(^(0),U,4),"]"
 Q
PTR ;
 S F=0,I=0 F  S F=$O(^UTILITY($J,"P",F)) Q:F=""  D PT
 S F=-1 Q
PT W !,F_" " I ^(F,0) W:$X>24 !?19 W "(#"_^(0)_") "
 S %=0 F  S %=$O(^UTILITY($J,"P",F,%)) Q:%=""  W ?33," ",$S(%=F(1):"",1:$P(^DD(%,0)," SUB-FIELD",1)_":") S S=0 F  S S=$O(^UTILITY($J,"P",F,%,S)) Q:S=""  W ?34,$P(^DD(%,S,0),U)," (#"_S_")",!
 S (%,S)=-1 Q
 ;
L ; CUSTOM LOOP
 I $G(Y)=U!($G(M)=U) G Q
 I DJ,IOST?1"C-".E W $C(7) R X:DTIME I X[U!'$T G Q
 K ^UTILITY($J,0)
DD S DIB=$O(^DD(+DIB)) G:DIB>DIB(1)!(+DIB'=DIB) Q G:$D(^(DIB,0))[0 DD
 I $G(DIPP(0,"IX"))["^DD(DFF,""AUDIT""",$O(^DD(DIB,"AUDIT",""))="" G DD:'$D(^DIC(DIB)) D  G:'DIB!(DIB>DIB(1)) Q
 . F  S DIB=$O(^DIC(+DIB)) Q:'DIB!(DIB>DIB(1))  Q:$O(^DD(DIB,"AUDIT",""))]""
SUBFILES M DPP=DIPP
 F Y="S","N","Q","H","L" D  ;IF THERE ARE SUBTOTALS, ETC, ZERO THEM OUT
 .N C,V S C=Y_"(V)" F V=0:0 S V=$O(@C) Q:V=""  S @C=0
 S L=0,DISEARCH=1,DFF=DIB,DJ=DIJS,DPQ=DIPQ,M=DIMS S:'$D(DIA) DC="," G ^DIO
Q S DFF=DIB(1) G STOP^DIO4

DIDG
DIDG ;SFISC/RWF-GLOBAL MAP ;10JAN2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K W S DJ(Z)=D0,F=0,W=F(Z),M=1,DP=0
 W !
UP I $D(^DD(W,0,"UP")) S Y=^("UP"),N=$O(^DD(Y,"SB",W,0)) I $D(^DD(Y,N,0)) S F=F+1,W(F)=$P($P(^(0),U,4),";",1),W=Y G UP
 S W=$S($D(^DIC(W,0,"GL")):^("GL"),1:"^("),Y=0 F N=F:-1:1 S W=W_"D"_Y_","_$S(+W(N)=W(N):W(N),1:""""_W(N)_"""")_",",Y=Y+1
 S DID(Z-1)=W K W
 ;
L S DN(Z)=""
A S DN(Z)=$O(^DD(F(Z),"GL",DN(Z))),DP(0)=0 I DN(Z)="" D POP Q
 S DID(Z)=DID(Z-1)_"D"_(F+Z-1)_","_DN(Z) I $O(^DD(F(Z),"GL",DN(Z),""))=0 S DP=""
 E  S W=DID(Z)_")=" W ! D WL Q:M=U
B S DP=$O(^DD(F(Z),"GL",DN(Z),DP)) G PUSH:DP=0,A:DP=""
 S DF=$O(^DD(F(Z),"GL",DN(Z),DP,0))
 I DP(0)+1<DP F I1=DP(0)+1:1:DP-1 S W=" ^ " D WL Q:M=U
 S N=^DD(F(Z),DF,0),DP(0)=DP
 S X=$P(N,U,2) I +X S Z=Z+1,F(Z)=+X D L G B
 S W="(#"_DF_") "_$P(N,U,1)_" ["_DP
 F Y="F","S","D","N","P","W","V","K" I X[Y S W=W_Y S:Y="P" W=W_":"_+$P(X,"P",2)
 S W=W_"] ^ " D WL Q:M=U  G B
 ;
PUSH S N=$O(^DD(F(Z),"GL",DN(Z),DP,0)) S:N="" N=-1 S Y=^DD(F(Z),N,0),DID(Z)=DID(Z)_","
 W !,DID(Z)_"0)=^"_$P(Y,U,2)_"^^  (#",N,") "_$P(Y,U,1) S Z=Z+1,F(Z)=+$P(Y,U,2)
 D L Q:M=U  G A
 ;
POP S Z=Z-1,DID(Z)=$E(DID(Z),1,$L(DID(Z))-1) Q:Z  K DN,W,DP,DG,DID S DN=0 W ! Q
 ;
END ;
 S S=0,M=1
T1 S S=S+1 D:$Y+3>IOSL HDR Q:M=U
 W !!,$S(S<4:$P("INPU^PRIN^SOR",U,S)_"T TEMPLATE(S):",1:"FORM(S)/BLOCK(S):")
 S DFF="^DI"_$P("E^PT^BT^ST(.403)",U,S),DA=""
 F  S DA=$O(@DFF@("F"_F(1),DA)) Q:DA=""  D  Q:M=U
 . S DUB=0 F  S DUB=$O(@DFF@("F"_F(1),DA,DUB)) Q:DUB'>0  D  Q:M=U
 .. I $D(@DFF@(DUB,0))#2 S %1=^(0) D TEMPL
 K %1 Q:M=U  G T1:S<4
Q Q
TEMPL I $Y+3>IOSL D HDR Q:M=U
 N % S %=$S($D(^("ROU")):"Compiled: "_^("ROU"),'$D(^("ROU"))&($D(^("ROUOLD"))):"Previously Compiled: "_^("ROUOLD"),1:"")
 I %]"",DFF["DIBT" S %=%_"*"
 I DFF'["DIST" W !,DFF,"("_DUB_")= ",$P(%1,U)_"    "_%
 E  D FORM
 Q
WL I $Y+4>IOSL S %1=W D HD Q:M=U  S W=%1 I W[DID(Z) S W=""
 F I=1:1 S Y=$P(W," ",I)_" " Q:$P(W," ",I,99)=""  W:$X+$L(Y)+2>IOM !,?$L(DID(Z)),"==>" W Y
 Q
W W:$X+$L(W)+3>IOM !,?$S(IOM-$L(W)-5<M:IOM-5-$L(W),1:M),S S %Y=$E(W,IOM-$X,999) W $E(W,1,IOM-$X-1),S Q:%Y=""  S W=%Y G W
 ;
HD S DC=DC+1 D ^DIDH Q:M=U  W !,DID(Z),")= " Q
 ;
HDR ;
 S DC=DC+1 I IOST?1"C".E W $C(7) R M:DTIME S:'$T M=U Q:M=U
H1 W:$D(DIFF)&($Y) @IOF S DIFF=1 W "TEMPLATE LIST  --  FILE #"_DIB,?(IOM-20),$$OUT^DIALOGU(DT,"FMTE","2D")_"    "_$$EZBLD^DIALOG(7095,DC) ;**CCO/NI  DATE AND 'PAGE'
 S M="",$P(M,"-",IOM)="" W !,M
 Q
 ;
FORM ;
 W !,"^DIST(.403,"_DUB_")= ",$P(%1,U)_"    "_%
 ;
 N B,L,P
 S L=1,L(1)=U
 S P=0 F  S P=$O(^DIST(.403,DUB,40,P)) Q:'P  D  Q:M=U
 . Q:$D(^DIST(.403,DUB,40,P,0))[0  S B=$P(^(0),U,2) D:B BLOCK  Q:M=U
 . S B=0 F  S B=$O(^DIST(.403,DUB,40,P,40,B)) Q:'B  D BLOCK  Q:M=U
 W !
 Q
BLOCK ;
 N I
 F I=1:1:L I L(I)[(U_B_U) G BLOCKQ
 S:$L(L)+$L(B)+1>245 L=L+1,L(L)=U S L(L)=L(L)_B_U
 Q:$D(^DIST(.404,B,0))[0  S %1=^(0)
 ;
 I $Y+3>IOSL D HDR Q:M=U
 W !?2,"^DIST(.404,"_B_")= ",$P(%1,U)
BLOCKQ Q

DIDGFTPT
DIDGFTPT ;GFT/GFT  -- GET ALL ENTRIES THAT POINT TO ENTRY GFTIEN IN FILE GFTFILE;14OCT2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 W !!,"THIS UTILITY TRIES TO FIND ALL ENTRIES IN ALL FILES POINTING TO A CERTAIN FILE",!
 D DT^DICRW
 N DIC,DIR,X,Y,GFTIEN,GFTANY,GFTFILE,GFTALL,DIRUT,DIBT,GFTIENLIST
 K ^TMP($J)
 S DIC=1,DIC(0)="AEQM" D ^DIC Q:Y<0  S GFTFILE=+Y,GFTANY=$P(^DIC(GFTFILE,0),U)
 S DIR(0)="S^1:One particular "_GFTANY_" Entry;2:All "_GFTANY_" Entries;3:Non-existent "_GFTANY_" Entries"
 S X="" F  S X=$O(^DIBT("F"_GFTFILE,X)) Q:X=""  F Y=0:0 S Y=$O(^DIBT("F"_GFTFILE,X,Y)) Q:'Y  I $D(^DIBT(Y,1))>1 S DIBT(Y)=""
 I $O(DIBT(0)) S DIR(0)=DIR(0)_";4:Entries from a "_GFTANY_" Search Template"
 S DIR("A")="Find pointers to"
 S DIR("B")=$P($P(DIR(0),";",2),":",2)
 D ^DIR K DIR Q:$G(DIRUT)
 I Y=4 S DIC=.401,DIC("S")="I $D(DIBT(+Y))",GFTANY=Y D ^DIC Q:Y'>0  K DIBT,DIC M GFTIENLIST=^DIBT(+Y,1) G ZIS
 S DIC=GFTFILE,DIC("A")="Find pointers to "_GFTANY_" Entry: ",GFTANY=Y,GFTIENLIST=0
 I Y=1 D ^DIC Q:Y<0  S GFTIENLIST=+Y
ZIS D ^%ZIS Q:$G(POP)  U IO
 W ! S $Y=0
START K DIC
 D DEPEND(GFTFILE,.GFTIENLIST,,"M"_GFTANY)
 ;NOW WE HAVE ALL INFO
 S GFTIEN="" F  S GFTIEN=$O(^TMP($J,GFTFILE,GFTIEN)) Q:GFTIEN=""  D  Q:'$D(GFTIEN)
 .S X=$$GET1^DIQ(GFTFILE,GFTIEN,.01) I X]"" Q:GFTANY=3
 .E  S X="NON-EXISTENT ENTRY # "_GFTIEN
 .W !!,"***",$P(^DIC(GFTFILE,0),U),": "  W X,"***"
 .F I=0:0 Q:'$D(GFTIEN)  S I=$O(^TMP($J,GFTFILE,GFTIEN,I)) Q:'I  W !,"FILE ",I," (",$P(^DIC(I,0),U),")" F J=0:0 S J=$O(^TMP($J,GFTFILE,GFTIEN,I,J)) Q:'J  D  Q:'$D(GFTIEN)
 ..S Y=$O(^(J,""))
 ..W !?9,"`",J,?22,$$GET1^DIQ(I,J,.01)
 ..F  Q:Y=""  W:$X>(IOM-30) ! W ?IOM-30,$P(@("^DD("_Y_",0)"),U) S Y=$O(^TMP($J,GFTFILE,GFTIEN,I,J,Y))
 ..I $E($G(IOST))="C",$G(IOSL,24)-3<$Y S DIR(0)="E" D ^DIR S $Y=0 I 'Y K GFTIEN
 K ^TMP($J)
 I '$G(GFTALL) W !!! D ^%ZISC
 Q
 ;
 ;
DEPEND(GFTFILE,IEN,GFTWHERE,GFTPARAM) ;
 I $G(GFTPARAM)["M" N GFTANY S GFTANY=+$P(GFTPARAM,"M",2)
 S:$G(GFTWHERE)="" GFTWHERE=$NA(^TMP($J))
    K @GFTWHERE ;output array
 I $D(IEN)<9 S GFTIEN(GFTFILE,+IEN)="" ;IEN can be either a scalar...
 E  M GFTIEN(GFTFILE)=IEN ;...or an array
 N A,B
 S A=0 F  S A=+$O(^DD(GFTFILE,0,"PT",A)) Q:'A  D
 . S B=0 F  S B=+$O(^DD(GFTFILE,0,"PT",A,B)) Q:'B  D
 . . D CHASE(A,B,.GFTRCR)
COMPUTED S A=0 F  S A=+$O(^DD(GFTFILE,0,"PTC",A)) Q:'A  D
 .S B=0 F  S B=+$O(^DD(GFTFILE,0,"PTC",A,B)) Q:'B  D
 ..D CHASE(A,B,.GFTRCR)
 Q
         ;
         ;
CHASE(FILE,FIELD,GFTRCR) ;BUILD AN 'XEC' THAT WILL GO THRU FILE REMEMBERING FIELD'S POINTERS
 I FILE=.6!(FILE=1.1) Q  ;NOT AUDIT FILES
 N GFTF,X,I,J,V,XEC,A,B,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DICMX,DIDGFTPT,GFTFISCR
 S GFTF=FILE,L=0,PUT="",DIDGFTPT=1 ;want this defined for special FILE SCREENS
UP F  S I=$G(^DD(GFTF,0,"UP")) Q:'I  S L=L+1,X=$O(^DD(I,"SB",GFTF,0)) Q:'X  S J=$P($G(^DD(I,X,0)),U,4) Q:J'[";0"  S GFTF=I,J(L)=$P(J,";")
 Q:'$D(^DIC(GFTF,0,"GL"))  S J=^("GL"),I=""
 I $G(^DD(GFTF,0,"SCR"))]"" S GFTFISCR=^("SCR")
 F A=L:-1:0 S X="D"_(L-A),PUT=PUT_"_D"_A_"_"",""",I=I_"F "_X_"=0:0 S "_X_"=$O("_J_X_")) Q:'"_X_"  I $D(^("_X_",0)) " I A S J=J_X_","""_J(A)_""","
 D  Q:'$D(XEC)  ;NOW WE HAVE 'L' AS LEVEL AND 'I' AS 'L' FOR LOOPS
 .S X=$P($G(^DD(FILE,FIELD,0)),U,4) Q:X=""  S A=$P(^(0),U,2),FIELD=FILE_","_FIELD,V=$P(X,";",2)
 .I 'V Q:A'["C"  Q:A'["p"  S DICMX=$P(^(0),U,5,99),XEC="X DICMX I X" I A["m" D  Q
 ..S XEC=I_"S DIDGFTPT=D0 "_DICMX,DICMX="D PUT^DIDGFTPT(+$G(D),DIDGFTPT,"""_FIELD_""")" ;m=MULTIPLE COMPUTED POINTER
 .I V S XEC="S X=$P($G(^("""_$P(X,";")_""")),""^"","_+V_") I X" D:A["V"
 ..S XEC=XEC_",$P(X,"";"",2)="""_$$CONVQQ^DILIBF($P(^DIC(GFTFILE,0,"GL"),U,2))_""""
 .S XEC=I_XEC_" D PUT(+X,D0,"""_FIELD_""")"
XEC X XEC
 Q
 ;
PUT(XVAL,Y,FIELD) I '$D(GFTIEN(GFTFILE,XVAL)) Q:$G(GFTANY)<2
 I $D(GFTFISCR) X GFTFISCR E  Q  ;FILE SCREEN!
 N IENS,L,S S IENS=D0_"," F L=1:1 S S=$G(@("D"_L)) Q:S=""  S IENS=S_","_$G(IENS)
 S @GFTWHERE@(GFTFILE,XVAL,GFTF,Y,FIELD,IENS)=""
 Q
 ;
 ;
ALL ;Do all files (SO)
 D ^%ZIS U IO
 N GFTFILE
 S GFTFILE=1.99999
 F  S GFTFILE=$O(^DIC(GFTFILE)) Q:'GFTFILE  D
 . I GFTFILE=80.2 Q
 . I GFTFILE=80.3 Q
 . N GFTIEN,GFTANY,GFTALL
 . S GFTIEN=0,GFTANY=3,GFTALL=1
 . D START
 .Q
 ;
 D ^%ZISC
 Q

DIDH
DIDH ;SFISC/GFT,XAK-HDR FOR DD LISTS ;13SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 D ^DIDH1 I $G(M)=U S DN=0
Q K DDV,%F,M1 Q
 ;
 ;
XR S X=2,J=0,DG=F(Z) W:$Y !
XL S J=$O(^DD(DA,0,"IX",J)) I J="" S F(Z)=DG Q
 F K=0:0 S K=$O(^DD(DA,0,"IX",J,K)) G XL:K'>0 F N=0:0 S N=$O(^DD(DA,0,"IX",J,K,N)) Q:N'>0  I 1 S F(Z)=K,DJ(Z)=N X:$D(DIGR) DIGR D:$T XL1
XL1 F %=0:0 S %=$O(^DD(K,N,1,%)) Q:'%!(M=U)  I $D(^(%,0)),+^(0)=DA,$P(^(0),U,2)=J W:X=2 !,"CROSS",! W $P(", ^REFERENCED BY: ",U,X) S X=$P(^DD(K,N,0),U)_"("_J_")" W:($L(X)+$X+4)'<IOM !?15 W X S X=1 Q:$Y+4'>IOSL  I '$D(DIU) D H S X=2
 Q
 ;
 ;
 ;
POINT ; CALLED BY ^DD(1,.01,"DEL",.5,0)
 N W1,DDPT,DDC,DDV,X1 S M=""
 S W1="W:$Y ! W !,""POINTED TO BY: "",?15" I $O(^DD(DA,0,"PT",""))'="" S DDPT=1
 S X="" F  S X=$O(^DD(DA,0,"PT",X)) Q:X=""  S DG=0 F  S DG=$O(^DD(DA,0,"PT",X,DG)) Q:DG=""  D  W:$D(^DD(DA,0,"PT",X,DG)) !?15 I '$D(DIU) D H G Q:M=U
 .I $S('$D(^DD(X,DG,0)):1,$P(^(0),U,2)["V":0,1:$P($P(^(0),U,2),"P",2)-DA) K ^DD(DA,0,"PT",X,DG) Q
 .D PD
 S W1="W:$Y ! W !,""POINTED TO BY COMPUTED POINTER: "",!?15" I $O(^DD(DA,0,"PTC",""))'="" S DDPT=1
 S X="" F  S X=$O(^DD(DA,0,"PTC",X)) Q:X=""  S DG=0 F  S DG=$O(^DD(DA,0,"PTC",X,DG)) Q:DG=""  D  W:$D(^DD(DA,0,"PTC",X,DG)) !?15 I '$D(DIU) D H G Q:M=U
 .S %=$P($G(^DD(X,DG,0)),U,2) I $P(%,"Cp",2)-DA,$P(%,"mp",2)-DA K ^DD(DA,0,"PTC",X,DG) Q
 .D PD
 S (DG,X)=-1 K W1,DDPT Q
 ;
PD ;
 S %=X,%F=DG
WR I '$D(IOM) S IOP="HOME" N %X D ^%ZIS Q:POP
 I $D(DDPT) X W1 K DDPT
 S X1=$P(^DD(%,%F,0),U)_" field (#"_%F_")"
UP I $L(X1)+$L(%)+$L($O(^DD(%,0,"NM",0)))>225 S X1=X1_" etc... ^" G L1
 S X1=X1_" of the "_$O(^(0))
 I $D(^DD(%,0,"UP")) S X1=X1_" sub-field (#"_%_")",%=^("UP") G UP
 S X1=X1_" File (#"_%_") ^"
L1 F DDC=1:1 S DDV=$P(X1," ",DDC)_" " Q:DDV["^"  W:$L(DDV)+$X>IOM !,?19 W DDV
 K DDC,DDV,X1 Q
 ;
TRIG ;CALLED BY ^DD(1,.01,"DEL","TRB",0)
 S W1="W:$Y ! W !,""A FIELD IS"",!,""TRIGGERED BY :"",?15",DDPT=1
 K X S X="" F  S X=$O(^DD(DA,"TRB",X)) Q:X=""  I X-DA,'$D(^DD(DA,"SB",X)) S %=0 F  S %=$O(^DD(DA,"TRB",X,%)) Q:%=""  S %X=0 F  S %X=$O(^DD(DA,"TRB",X,%,%X)) Q:%X=""  S %Y=0 F  S %Y=$O(^DD(DA,"TRB",X,%,%X,%Y)) Q:%Y'>0  D TT
 S %Y=-1 I $D(X)>9 S %X=0 F  S %X=$O(X(%X)) Q:%X=""  S X=0 F  S X=$O(X(%X,X)) Q:X=""  S %F=X,%=%X D WR:$D(^DD(%,X,0)) W !?15 D:'$D(DIU) H I 1
 K X,%X,%Y,W1,DDPT Q
 ;
TT S X(X,%)=0 I $D(^DD(X,%,0)) Q:$P(^(0),U,2)  I $D(^(1,%X,0)),^(0)["TRIGGER" Q
 K X(X,%),^DD(DA,"TRB",X,%,%X,%Y)
 Q
H I $D(IOSL),$Y+4>IOSL S DC=DC+1 D ^DIDH1 G Q:M=U
 Q
W F K=0:1 W:$D(DDF) !?25 S %Y=$E(W,IOM-$X,999) W $E(W,1,IOM-$X-1) Q:%Y=""  S W=%Y,DDF=1
 K DDF Q
PTR(X) ;finds pointers to file being deleted
 N Y,Z S (Y,Z)=0
 I $O(^DD(X,0,"PT",Y))="" Q Z
 D  Q Z
 . F  S Y=$O(^DD(X,0,"PT",Y)) Q:Y=""  I $$FNO^DILIBF(Y)'=X S Z=1 Q
 . Q

DIDH1
DIDH1 ; SFISC/ALL - HDR FOR DD LISTS; 16NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIDHI,DIDHJ,DIC,W,M1 D
 .N I,J D IJ^DIUTL(DFF) M DIDHJ=J,DIDHI=I S DIDHJ=$O(J(""),-1)
 S M=1 I DC=1 S (F(1),DA)=DFF,Z=1
 E  I $Y,IOST?1"C".E W $C(7) R M:DTIME I M=U!'$T K DIOEND S M=U,DN=0 Q
 S M1=$S($G(^DD(F(1),0,"VR"))]"":" (VERSION "_$P(^("VR"),U)_")   ",1:"") I IOST?1"C".E S DIFF=1
 W:$D(DIFF)&($Y) @IOF S DIFF=1 W $S(DHIT["DIDX":"BRIEF",DHIT["DIDG":"GLOBAL MAP",$D(DINM):"MODIFIED",1:"STANDARD")
 W " DATA DICTIONARY #"_DFF_" -- "_$O(^DD(DFF,0,"NM",0))_" "_$S(DIDHJ:"SUB-",1:"")_"FILE   "
 S DIC=^DIC(DUB,0,"GL") D
 .N X,Y
TODAY .S W=$$OUT^DIALOGU(DT,"FMTE","2D")_"    "_$$EZBLD^DIALOG(7095,DC) W ?(IOM-$L(W)-1),W ;**CCO/NI  TODAY'S DATE, 'PAGE'
 S M=IOM\2,S=" ",W="" I $D(^DD("SITE")) S W="SITE: "_^("SITE")_"   "
 I $D(^%ZOSF("UCI"))#2 X ^("UCI") S W=W_"UCI: "_Y
 W ! I DHIT["DIDX" W W,?(IOM-$L(M1)-1),M1 S W="",$P(W,"-",IOM)="" W !,W S W="" G Q^DIDH
 W "STORED IN ",DIC F I=1:1 Q:'$D(DIDHI(I))  W "D",I-1,",",DIDHI(I),","
 I 'DIDHJ D
 .I $O(@(DIC_"0)"))'>0 W "  *** NO DATA STORED YET ***" Q
 .S I=$P(^(0),U,4) W:I "  ("_I_" ENTR"_$S(I=1:"Y)",1:"IES)")
 W "   ",W,?(IOM-$L(M1)-1),M1 D:DHIT'["DIDG"
 .W !!,"DATA",?14,"NAME",?36,"GLOBAL",?50,"DATA",!,"ELEMENT",?14,"TITLE",?36,"LOCATION",?50,"TYPE"
G W ! F I=1:1:IOM-1 W "-"
 S W="" Q:DC>1!$G(DIDRANGE)
FIRST F DG=0:0 S DG=$O(^DIC(DA,"ALANG",DG)) Q:'DG  I $D(^(DG,0)) S DIWR=$P(^(0),U) I $D(^DI(.85,DG,0)) W !,$P(^(0),U)," FILE NAME: ",DIWR ;**SHOW FOREIGN FILE NAMES
PAGE1 I 'DIDHJ,'$$WP^DIUTL($NA(^DIC(DA,"%D"))) S M="^" Q
 I DIDHJ D  I M=U Q
 .S W=DIDHJ(DIDHJ-1),W=$NA(^DD(W,+$O(^DD(W,"SB",DFF,"")))) I '$$WP^DIUTL($NA(@W@(21))) S M=U Q
 .I $D(@W@(23)) W !,"TECHNICAL DESCRIPTION:",! I '$$WP^DIUTL($NA(@W@(23))) S M=U
 .F I=8,9 I $D(@W@(I)) W !,?15,$P("READ^WRITE",U,I-7)," ACCESS: ",^(I)
 I DHIT["DIDG" D  Q
 . D XR^DIDH Q:M=U
 . N DIDPG S DIDPG("H")="W """" D H^DIDH S:M=U PAGE(U)=1"
 . D LIST^DIKCP(DA,"","C15",.DIDPG) Q:M=U
 . D WRLN^DIKCP1("",0,.DIDPG)
 Q:DHIT["DIDX"!(M=U)  W !
 F %=1:1:4 S X=$P("SCR^DIC^ACT^DIK",U,%) I $G(^DD(DA,0,X))]"" W !,$P("FILE SCREEN (SCR-node) ^SPECIAL LOOKUP ROUTINE ^POST-SELECTION ACTION  ^COMPILED CROSS-REFERENCE ROUTINE",U,%)_": " S W=^(X) D W^DIDH G Q:M=U
 W:$P($G(^DD(DA,0,"DI")),U)["Y" !,"THIS IS AN ARCHIVE FILE."
 W:$P($G(^DD(DA,0,"DI")),U,2)["Y" !,"EDITING OF FILE IS NOT ALLOWED."
 F N="DD","RD","WR","DEL","LAYGO","AUDIT" I $D(^DIC(DA,0,N)) W !?(Z+Z+14-$L(N)),N," ACCESS: ",^(N)
AFOF I $D(^VA(200,"AFOF",DA)) W !!?8,"(NOTE: Kernel's File Access Security applies to this File.)",!
 I $O(^DD(DA,0,"ID",""))]"" W !,"IDENTIFIED BY: "
 S X=0 F  S X=$O(^DD(DA,0,"ID",X)) Q:X=""  Q:'$D(^DD(DA,X,0))  S I1=$P(^(0),U)_" (#"_X_")"_$S($P(^(0),U,2)["R":"[R]",1:"") W:($L(I1)+$X)+1>IOM ! W ?15,I1 I $O(^DD(DA,0,"ID",X)) W ", "
 S:X="" X=-1
 ;
 ;Print "WRITE" identifiers
 I '$D(DINM) S X=" " F  S X=$O(^DD(DA,0,"ID",X)) Q:X=""  D  Q:M=U
 . N DIDLN,DIDPG
 . S DIDLN(1)=$G(^DD(DA,0,"ID",X)) Q:DIDLN(1)?."^"
 . S DIDLN(0)=""""_X_""": "
 . S DIDLN(0)=$J("",15-$L(DIDLN(0)))_DIDLN(0)
 . S DIDPG("H")="W """" D H^DIDH S:M=U PAGE(U)=1"
 . D WRPHI^DIKCP1(.DIDLN,IOM-16,0,15,1,.DIDPG)
 Q:M=U
 ;
 I $D(^DD("KEY","B",DA)) D
 . N DIDPG
 . S DIDPG("H")="W """" D H^DIDH S:M=U PAGE(U)=1"
 . D PRINT^DIKKP(DA,"","C20",.DIDPG)
 D POINT^DIDH Q:M=U  D TRIG^DIDH,XR^DIDH Q:M=U
 I $D(^DD("IX","B",DA)) D  Q:M=U  W !
 . N DIDPG
 . S DIDPG("H")="W """" D H^DIDH S:M=U PAGE(U)=1"
 . D LIST^DIKCP(DA,"","C15",.DIDPG)
CREATED W !! S N=$G(^DIC(DA,"%A")),Y=$P(N,U,2) I Y X ^DD("DD") W ?3,"CREATED ON: "_Y I $S($D(^VA(200,0)):1,1:$D(^DIC(3,0))),^(0)["NEW PERSON"!(^(0)["USER")!(^(0)["EMPLOY"),$D(^(+N,0)) W " by "_$P(^(0),U)
 S Y=+$G(^DIC(DA,"%MSC")) I Y X ^DD("DD") W "    LAST MODIFIED: "_Y
Q Q
W W:$X+$L(W)+3>IOM !,?$S(IOM-$L(W)-5<M:IOM-5-$L(W),1:M),S S %Y=$E(W,IOM-$X,999) W $E(W,1,IOM-$X-1),S Q:%Y=""  S W=%Y G W
 Q
WR ;
 S W="TRIGGERED by the "_$P(^(0),U)_" field"
UP1 S W=W_" of the "_$O(^DD(%,0,"NM",0))
 I $D(^DD(%,0,"UP")) S %=^("UP") S W=W_" sub-field" G UP1
 S W=W_" File"
W1 S DDV1="" W ?DDL2 F K=1:1 S DDV=$P(W," ",K)_" ",DDV1=DDV1_DDV W:$L(DDV)+$X>IOM !?DDL2 W DDV Q:$L(DDV1)>$L(W)
 I $Y+6>IOSL S DC=DC+1 D DIDH1
 K DDV,DDV1 Q
DE ;
 W !?DDL1,$P("DESCRIPTION:^TECHNICAL DESCR:",U,%Y=23+1)
 I '$$WP^DIUTL($NA(^DD(F(Z),DJ(Z),%Y)),DDL2+1) S M="^"
 Q

DIDT
DIDT ;SFISC/GFT-DATE/TIME UTILITY ;27JUL2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
%DT ;
 I $G(DUZ("LANG"))>1,($G(^DI(.85,DUZ("LANG"),20.2))]"") X ^(20.2) Q
CONT ;
 K % S:$D(%DT)[0 %DT="" S:$G(DIQUIET)!($D(DDS)#2)!($D(ZTQUEUED)) %DT=$P(%DT,"E")_$P(%DT,"E",2) G NA:%DT'["A"
 W !,$S($D(%DT("A")):%DT("A"),1:"DATE: "),$S($D(%DT("B")):%DT("B")_"//",1:"")
 R X:$S($D(DTIME):DTIME,1:300) S:'$T X="^",DTOUT=1 G:$L(X)>39 1
 I $D(%DT("B")),X="" S X=%DT("B")
 I "^"[X S Y=-1 K %I,% Q
NA S %(0)=X G 1:X'?.ANP,1:$P(X,"@")?15.N,1:$P(X,"@",2)?15.N,1:$L(X)>39
 F %=1:1:$L(X) Q:X?.UNP  S Y=$E(X,%) I Y?1L S X=$E(X,1,%-1)_$C($A(Y)-32)_$E(X,%+1,99) ;UPPER CASE
 I %DT["E",X?."?" D HELP^%DTC G B
 I %DT["N",X?.N G NO
 I X?1.A,(X["MID"!(X["NOON")) S X="@"_X
 I X'?1"NOV".E,X?1"N".1"OW".1P.E G N^%DTC:%DT["T"!(%DT["R")&(%DT'["M") S X=$E(X,2,99),X="T"_$P(X,"OW")_$P(X,"OW",2)
 I X?1.N." "1.2A!(X?1.N1":"2N." ".2A)!(X?1.N1":"2N1":"2N." ".2A) S X="T@"_X
 I X?7N1"."1.N G R
 I X'["@",%DT'["R" G R
 I %DT'["T",%DT'["R" G NO
 I %DT["M" G NO
 S Y=$P(X,"@",2,9),X=$P(X,"@")
 F %=2,3 S %I=$P(Y,":",%) I %I?1N.E,%I'?2N.PA G 1
 S:X="" X="T" S Y=$P(Y,":")_$P(Y,":",2)_$P(Y,":",3,9),%I=Y
 I Y?1.A S Y=$S(Y["MID":2400,Y["NOON":1200,1:"")
T G G:Y?4N,G1:Y?6N&(%DT["S"),1:Y'?1.6N." ".1(1"AM",1"A",1"A.M",1"PM",1"P",1"P.M").P I %DT["R",Y="" G NO
 S %I=$P(1_%I,+(1_Y),2) S:%I]"" Y=$P(Y,%I)
 I Y?5.6N G:%DT'["S" 1 S %(3)=$E(Y,$L(Y)-1,$L(Y)),Y=$E(Y,1,$L(Y)-2) G 1:%(3)>59
 I Y?1.2N G:Y'<13 1 S Y=Y_"00" S:$E(Y)=0 %I="A"
 I %I["A" S Y=$S(Y=1200&'$G(%(3)):2400,Y>1159:Y-1200,1:Y)
 E  I Y?1.2"0"2N G:%I["P" 1
 E  I Y<1200,%I["P"!(Y<600) S Y=Y+1200 ;ASSUME PM
G G 1:Y>2400,1:Y#100>59,1:('Y&('$G(%(3)))) S %(1)=$S('Y:".0000",1:Y/10000) G R
G1 G 1:Y>240000!'Y,1:$E(Y,3,4)#100>59,1:$E(Y,5,6)#100>59 S %(1)=Y/1000000
R I %DT["F"!(%DT["P") D TY S %(9)=%
7 G 8:X'?7N1".".E&(X'?7N) S Y=$E(X,8,16),%=$E(Y_"000000",2,7)
 I Y,%DT'["T"!(%DT["M") G NO
 I %DT["E",(%'?.N)!(%>240000)!($E(%,3,4)>59)!($E(%,5,6)>59) G NO
 S:Y %(1)=+Y S X=$E(X,4,7)_($E(X,1,3)+1700),%(7)=1
 I %DT["I",'$D(%("ALPHA")) S X=$E(X,3,4)_$E(X,1,2)_$E(X,5,9)
8 S %I=0,%="" I X'?.N G T^%DTC:"T+-"[$E(X),U:X["^",1:$E(X)?1P,MTH:X?3.A&(%DT["M"),X
 I X?8N,X>17999999,$E(X,5,8)<1300 S X=$E(X,5,8)_$E(X,1,4),%("ALPHA")=1 ;MAY BE '200101231' FOR 2001DEC31
 I %DT'["X",X\300=6!(X?2N) S (%I(1),%I(2))=0,%I(3)=X G 3
 F %I=0:1 S Y=$E(X,1,2),X=$E(X,3,9) G OT:Y="" D  G:%I="" 1
 . I %DT["X",%DT'["M",%I<2,'Y S %I="" Q
 . S:%I=2 Y=Y_X,X=""
 . I %DT["X",%I=2,$L(Y)>2,Y'>1799 S %I="" Q
 . S %I(%I+1)=Y Q
 ;
X S Y=$E(X),X=$E(X,2,99) I Y?1N G A:%?.N,Y ;PEEL OFF CHARACTER-BY-CHARACTER
 I Y?1A G A:%?.A,Y
OT D:%]"" % G 1:%I>3,X:Y?1P,1:Y]"",@%I
Y D % S %=Y G 1:%I>3,X
A S %=%_Y G X
TY S %=$H#1461,%=$H\1461*4+(%\365)+141-(%=1460) Q
0 ;
1 W:%DT["E"&'$D(DIER) $C(7),$S('$D(DDS):" ??",1:"") ;INPUT IS BAD!
B G %DT:%DT["A",NO
U S X="^",%(0)=X
NO S Y=-1 G Q:%DT'["A",Q:X["^" W $C(7)," ??" G %DT
2 I %DT["M" S %I(3)=%I(2),%I(2)=0 G 3
 I %I(2)>31!'%I(2),%DT'["X" S %I(3)=%I(2),%I(2)=0 G 1:'%I(2)&$G(%(1)) G 3
 D TY S %I(3)=% D PF^%DTC:$D(%(9)) G C
3 I %I(1)>1700 S %("YF")=%I(1),%I(1)=%I(2),%I(2)=%I(3),%I(3)=%("YF") ;YEAR FIRST: ALLOW '2010-1-31'
 I %I(3)?2N D  G C
 . I '$D(%(9)) D TY S %(9)=%
 . N A S A=$E(%(9))*100
 . I $E(%(9),2,3)=%I(3) S %I(3)=A+%I(3) Q
 . I %DT["P" S %I(3)=$S(%I(3)<$E(%(9),2,3):A,1:A-100)+%I(3) Q
 . I %DT["F" S %I(3)=$S(%I(3)>$E(%(9),2,3):A,1:A+100)+%I(3) Q
 . S %I(3)=A+%I(3)
 . I %(9)-%I(3)>80 S %I(3)=%I(3)+100 Q
 . I %I(3)-%(9)>20 S %I(3)=%I(3)-100
 . Q
 S %I(3)=%I(3)-1700 G 1:%I(3)'?3N
C I %DT["I",'$D(%("ALPHA")),'$D(%("YF")),%I(2)>0 S %=%I(2),%I(2)=%I(1),%I(1)=% ;INTERNATIONAL: REVERSE MONTH/DAY
 I %I(2)="00",'$G(%(7)) G 1
 I %DT["M",$G(%I(2)) G 1
 I %I(1)>12!(%I(1)="00") G 1
 I %I(2)>28,$E("303232332323",%I(1))+28<%I(2),%I(1)-2!(%I(2)-29)!(%I(3)#4)!('(%I(3)#100)&(%I(3)+1700#400)) G 1
D I %DT["M",$G(%I(2)) S %I(2)=0
 D P
E I $D(%(1)) S:$D(%(3)) %(1)=$E(%(1)_"000",1,5)_%(3) S Y=+(Y_%(1))
 I '$E(Y,6,7),Y["." G 1
 I %DT["E" S %=Y D DD W "  ("_Y_")" S Y=%
 I $D(%DT(0)) S %=%DT(0),%I=$S(%["-":Y,1:-Y) D:'% Z I $S(%DT["S":%,1:%\.0001/10000)+%I>0 G 1
Q S X=%(0) K %,%I,%H Q
 ;
Z I $P("NOW",%(0))="" S %=Y
 E  D NOW^%DTC
 S:%DT(0)["-" %=-% Q
 ;
DD I $G(DUZ("LANG"))>1 S Y=$$OUT^DIALOGU(Y,"DD") Q
 Q:'Y  S Y=$S($E(Y,4,5):$E($P($T(M)," ",$E(Y,4,5)+2),1,3)_" ",1:"")_$S($E(Y,6,7):$E(Y,6,7)_", ",1:"")_($E(Y,1,3)+1700)_$S(Y[".":"."_$P(Y,".",2),1:"")
 I Y["." S Y=$P(Y,".")_"@"_$E(Y_0,14,15)_":"_$E(Y_"000",16,17)_$S($E(Y,18,19):":"_$E(Y_0,18,19),1:"")
 I $D(%DT)#2,%DT["S",Y["@",$P(Y,":",3)="" S Y=Y_":00"
 Q
 ;
P S Y=%I(3)_$E(%I(1)+100,2,3)_$E(%I(2)+100,2,3) Q
 ;
MTH S %=X D % G:%I>3 1
 S %I(2)=0
 D TY S %I(3)=% D:$D(%(9)) PF^%DTC
 G D
% ;I %DT["I",%?3.A S %I=9 Q
 I %?3.A S %=$F($T(M)," "_%) I %>0 S %=$L($E($T(M),6,%-1)," ") D:%I=1  S %("ALPHA")=1 ;ONLY MONTH IS ALPHA
 . N T S T=%I(1),%I(1)=%,%=T I $D(%("ALPHA")) S %I=9
 S:%<1&(%'="00")&(%I'=2) %I=9 S %I=%I+1,%I(%I)=%,%=""
M ;; JANUARY FEBRUARY MARCH APRIL MAY JUNE JULY AUGUST SEPTEMBER OCTOBER NOVEMBER DECEMBER

DIDTC
DIDTC ;SFISC/XAK-DATE/TIME OPERATIONS ;3JAN2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
D N %T
 I 'X1!'X2 S X="",%Y=0 Q
 S X=X1 D H S X1=%H,X=X2,X2=%Y+1 D H S X=X1-%H,%Y=%Y+1&X2
 K %H,X1,X2 Q
 ;
C N %,%T,%Y
 S X=X1,X2=$J($G(X2),0,0) I 'X S (X,%H)="" Q
 D H S %H=%H+X2 D YMD S:$P(X1,".",2) X=X_"."_$P(X1,".",2) K X1,X2 Q
S S %=%#60/100+(%#3600\60)/100+(%\3600)/100 Q
 ;
H ;called from DIG, DIP4
 I X<1410000 S (%H,%T)=0,%Y=-1 Q
 S %Y=$E(X,1,3),%M=$E(X,4,5),%D=$E(X,6,7)
 S %T=$E(X_0,9,10)*60+$E(X_"000",11,12)*60+$E(X_"00000",13,14)
TOH N DILEAP D
 . N Y S Y=%Y+1700 S:%M<3 Y=Y-1
 . S DILEAP=(Y\4)-(Y\100)+(Y\400)-446 Q
 S %H=$P("^31^59^90^120^151^181^212^243^273^304^334","^",%M)+%D
 S %=('%M!'%D),%Y=%Y-141
 S %H=(%H+(%Y*365)+DILEAP+%),%Y=$S(%:-1,1:%H+4#7)
 K %M,%D,% Q
 ;
DOW D H S Y=%Y K %H,%Y Q
 ;
DW D H S Y=%Y,X=$P("SUN^MON^TUES^WEDNES^THURS^FRI^SATUR","^",Y+1)_"DAY"
 S:Y<0 X="" Q
 ;
7 I '%H S (%,X)="" Q
 S %=(%H>21608)+(%H>94657)+%H-.1,%Y=%\365.25+141,%=%#365.25\1
 S %D=%+306#(%Y#4=0+365)#153#61#31+1,%M=%-%D\29+1
 S X=%Y_"00"+%M_"00"+%D Q
 ;
YX ;called from DIV, etc
 D YMD S Y=X_% Q:Y=""  G DD^%DT
 ;
YMD ;called from DIP5. Documented entry point for converting a date/time %H in $H format into a date (in X) and time (in %) in FileMan internal format.
 I %H[",0" S %=%H N %H S %H=%-1_",86400"
 N %D,%M,%Y D 7 S %=$P(%H,",",2) D S
 Q
 ;
 ;
T ;from %DT
 F %=1:1 S Y=$E(X,%) Q:"+-"[Y  G 1^%DT:$E("TODAY",%)'=Y
 S X=$E(X,%+1,99) G PM:Y=""
 I X?1.N1"M" S %H=$H D MONTH G D^%DT
 I +X'=X D DMW S X=%
 G:'X 1^%DT
PM S @("%H=$H"_Y_X) D TT G 1^%DT:%I(3)'?3N,D^%DT
 ;
 ;
N ;from %DT
 F %=2:1 S Y=$E(X,%) Q:"+-"[Y  G 1^%DT:$E("NOW",%)'=Y
 I Y="" S %H=$H D %H G RT
 S X=$E(X,%+1,99)
 I X?1.N1"H" S X=X*3600,%H=$H,@("X=$P(%H,"","",2)"_Y_X),%=$S(X<0:-1,1:0)+(X\86400),X=X#86400,%H=$P(%H,",")+%_","_X G RT
 I X?1.N1"'" S X=X*60,%H=$H,@("X=$P(%H,"","",2)"_Y_X),%=$S(X<0:-1,1:0)+(X\86400),X=X#86400,%H=$P(%H,",")+%_","_X G RT
 I X?1.N1"M" S %H=$H D %H,MONTH G RT1
 D DMW G 1^%DT:'% S @("%H=$H"_Y_%),%H=%H_","_$P($H,",",2) D %H
RT D TT
RT1 S %=$P(%H,",",2) D S S %=X_$S(%:%,1:.24) I %DT'["S" S %=+$E(%,1,12)
 Q:'$D(%(0))  S Y=% G E^%DT
 ;
 ;
PF ;from %DT
 S %H=$H D YMD S %(9)=X,X=%DT["F"*2-1 I @("%I(1)*100+%I(2)"_$E("> <",X+2)_"$E(%(9),4,7)") S %I(3)=%I(3)+X
 Q
 ;
 ;
MONTH ;Add months to current date
 S Y=Y_+X
 D TT
 S %=%I(1)+Y,%I(1)=%-1#12+1,%I(3)=%I(3)+(%-$S(%>0:1,1:12)\12)
 S %="31^"_($$LEAP(%I(3))+28)_"^31^30^31^30^31^31^30^31^30^31"
 I %I(2)>$P(%,U,%I(1)) S %I(2)=$P(%,U,%I(1))
 S X=%I(3)_"00"+%I(1)_"00"+%I(2)
 Q
 ;
LEAP(X) ;Return 1 if leap year
 S:X<1700 X=X+1700
 Q '(X#4)&(X#100)!'(X#400)
 ;
TT N %M,%D,%Y D 7 S %I(1)=%M,%I(2)=%D,%I(3)=%Y
 Q
 ;
NOW S %H=$H,%H=$S($P(%H,",",2):%H,1:%H-1)
 D TT S %=$P(%H,",",2) D S S %=X_$S(%:%,1:.24) Q
 ;
DMW S %=$S(X?1.N1"D":+X,X?1.N1"W":X*7,X?1.N1"M":X*30,+X=X:X,1:0)
 Q
 ;
%H I '$P(%H,",",2) S %H=%H-1 Q
 I $P(%H,",",2)<60&(%DT'["S") S $P(%H,",",2)=60
 Q
 ;
COMMA ;
 S %D=X<0 S:%D X=-X S %=$S($D(X2):+X2,1:2),X=$J(X,1,%),%=$L(X)-3-$E(23456789,%),%L=$S($D(X3):X3,1:12)
 F %=%:-3 Q:$E(X,%)=""  S X=$E(X,1,%)_","_$E(X,%+1,99)
 S:$D(X2) X=$E("$",X2["$")_X S X=$J($E("(",%D)_X_$E(" )",%D+1),%L) K %,%D,%L
 Q
 ;
 ;
 ;
HELP S DDH=$S($D(DDH):DDH,1:0),A1="Examples of Valid Dates:" D %
 I %DT["M" D  G 0
 . S A1="  "_$S(%DT["I":1.1957,1:"JAN 1957 or JAN 57")_$S(%DT'["N":" or 0157",1:"") D %
 . S A1="  T    (for this month)" D %
 . S A1="  T+3M (for 3 months in the future)" D %
 . S A1="  T-3M (for 3 months ago)" D %
 . S A1="Only month and year are accepted. You must omit the precise day." D %
 S A1="  "_$S(%DT["I":"20.1.1957",1:"JAN 20 1957 or 20 JAN 57")_" or "_$S(%DT["I":"20/1",1:"1/20")_"/57"_$S(%DT'["N":" or "_$S(%DT["I":200157,1:"012057"),1:"") D %
 S A1="  T   (for TODAY),  T+1 (for TOMORROW),  T+2,  T+7,  etc." D %
 S A1="  T-1 (for YESTERDAY),  T-3W (for 3 WEEKS AGO), etc." D %
 S A1="If the year is omitted, the computer " D  D %
 . I %DT["P" S A1=A1_"assumes a date in the PAST." Q
 . I %DT["F" S A1=A1_"assumes a date in the FUTURE." Q
 . S A1=A1_"uses CURRENT YEAR.  Two digit year" D %
 . S A1="  assumes no more than 20 years in the future, or 80 years in the past."
 . Q
 I %DT'["X" S A1="You may omit the precise day, as:  "_$S(%DT["I":1,1:"JAN,")_" 1957" D %
 I %DT'["T",%DT'["R" G 0
 S A1="If only the time is entered, the current date is assumed." D %
 S A1="Follow the date with a time, such as "_$S(%DT["I":"20.1",1:"JAN 20")_"@10, T@10AM, 10:30, etc." D %
 S A1="You may enter a time, such as NOON, MIDNIGHT or NOW." D %
 S A1="You may enter   NOW+3'  (for current date and time Plus 3 minutes" D %
 S A1="  *Note--the Apostrophe following the number of minutes)" D %
 I %DT["S" S A1="Seconds may be entered as 10:30:30 or 103030AM." D %
 I %DT["R" S A1="Time is REQUIRED in this response." D %
0 Q:'$D(%DT(0))
 S A1=" " D % S A1="Enter a date which is "_$S(%DT(0)["-":"less",1:"greater")_" than or equal to " D %
 S Y=$S(%DT(0)["-":$P(%DT(0),"-",2),1:%DT(0)) D DD^%DT:Y'["NOW"
 I '$D(DDS) W Y,"." K A1 Q
 S DDH(DDH,"T")=DDH(DDH,"T")_Y_"." K A1 Q
 ;
% I '$D(DDS) W !,"     ",A1 Q
 S DDH=DDH+1,DDH(DDH,"T")="     "_A1 Q
 Q

DIDU
DIDU ;SEA/TOAD-VA FileMan: DD Tools, External Format ;21AUG2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
EXTERNAL(DIFILE,DIFIELD,DIFLAGS,DINTERNL,DIMSGA) ;
 ;
 ; convert a value from internal to external format
 ; used all over lookup routines
 ;
XTRNLX ;
 ;
 ; support for documented entry point $$EXTERNAL^DILFD
 ; branch from DILFD or DIQGU
 ;
E1 ; set up DBS environment variables
 ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DICLERR S DICLERR=$G(DIERR) K DIERR
 ;
E2 ; handle bad input variables
 ;
 I $G(DINTERNL)="" Q ""
 S DIMSGA=$G(DIMSGA)
 S DIFLAGS=$G(DIFLAGS)
 I DIFLAGS'?.1(1"F",1"L",1"U",1"i",1"h",1"A") D ERR(DIMSGA,301,"","","",DIFLAGS) Q ""
 I $G(DIFIELD)'>0 D ERR(DIMSGA,202,"","","","FIELD") Q ""
 ;
E3 ; get field definition and type, handle bad file or field
 ;
 I $G(DIFILE)<0 D ERR(DIMSGA,202,"","","","FILE") Q ""
 N DINODE S DINODE=$G(^DD(DIFILE,DIFIELD,0))
 I DINODE="" D  Q ""
 . I '$D(^DD(DIFILE)) D ERR(DIMSGA,401,DIFILE)
 . E  D ERR(DIMSGA,501,DIFILE,"",DIFIELD,DIFIELD)
 N DITYPE S DITYPE=$P(DINODE,U,2)
 ;
E4 ; initialize loop control, transform code, pointer chain window,
 ; pointer file info, and resolved value variables
 ;
 N DICHAIN,DIDONE,DIOUT S (DICHAIN,DIDONE,DIOUT)=0
 N DIXFORM S DIXFORM=""
 N DINEXT,DIPREV,DIPREVF S (DINEXT,DIPREV,DIPREVF)=""
 N DIEN,DIHEAD,DIROOT S DIEN=""
 N DIEXTRNL S DIEXTRNL=""
 ;
E5 ; handle output transforms (see docs for effects of flags)
 ; under right conditions, execute output transform on value & quit
 ;
 F  D  I DIDONE!$G(DIERR)!DIOUT Q
 . I DIFLAGS["U",DIXFORM'="",DITYPE'["P",DITYPE'["V" S DITYPE=DITYPE_"O"
 . I DITYPE["O",DIFLAGS'["i",DIFLAGS'["h" D  I DIDONE!$G(DIERR) Q
 . . I DIFLAGS["F",DICHAIN Q
 . . I DIFLAGS["L",DITYPE["P"!(DITYPE["V") Q
 . . I DIXFORM=""!(DIFLAGS'["U") S DIXFORM=$G(^DD(DIFILE,DIFIELD,2))
 . . I DIXFORM="" Q
 . . I DIFLAGS["U",DITYPE["P"!(DITYPE["V") Q
 . . N Y S Y=DINTERNL X DIXFORM
 . . I $G(DIERR) D ERR^DICF4(120,DIFILE,DIEN,"","Output Transform") Q
 . . S DIEXTRNL=Y,DIDONE=1
 .
E6 . ; continue with loop only for pointers or variable pointers
 .
 . I DITYPE S DIOUT=1 Q
 . I DITYPE'["P",DITYPE'["V" S DIOUT=1 Q
 .
E7 . ; if the value's not numeric, it's not valid; note that throughout
 . ; module we return two different errors depending on whether the
 . ; value passed in is bad, or one found in the pointer chain is
 .
 . I 'DINTERNL D  Q
 . . I 'DICHAIN D ERR(DIMSGA,330,"","","",DINTERNL,"pointer") Q
 . . D ERR(DIMSGA,630,DIFILE,"",DIFIELD,DIEN,DINTERNL,"pointer")
 .
E8 . ; get pointed to file's root and #
 .
 . I DITYPE["P" S DIROOT=$P(DINODE,U,3),DINEXT=+$P($P(DINODE,U,2),"P",2) D  Q:$G(DIERR)
 . . I DIROOT="DIC(.2," S DINEXT=.2
 . . I 'DINEXT!(DIROOT="") D ERR(DIMSGA,537,DIFILE,,DIFIELD)
 . . Q
 . I DITYPE["V" S DIROOT=$P(DINTERNL,";",2),DINEXT="" D  Q:$G(DIERR)
 . . I DIROOT="" D ERR(DIMSGA,348,,,,DINTERNL) Q
 . . S DIHEAD=$G(@(U_DIROOT_"0)"))
 . . I DIHEAD="" D  Q
 . . . D HEADER(DIFILE,DIEN,DIFIELD,DITYPE,DICHAIN,DINTERNL,DINEXT)
 . . S DINEXT=+$P(DIHEAD,U,2) I 'DINEXT D  Q
 . . . D ERR(DIMSGA,404,"","","",$$CREF^DILF(U_DIROOT))
 .
E9 . ; ensure pointed to data file exists, and advance file #s
 .
 . I '$D(@(U_DIROOT_"+DINTERNL)")) D  Q
 . . N DI S DI="pointer to File #"
 . . I 'DICHAIN D ERR(DIMSGA,330,"","","",DINTERNL,DI_DINEXT) Q
 . . D ERR(DIMSGA,630,DIFILE,DIFIELD,"",DIEN,DINTERNL,DI_DINEXT)
 . S DIPREV=DIFILE,DIFILE=DINEXT
 .
E10 . ; advance pointer value, file characteristics, & pointer window
 . ; ensure pointed to record exists, & its .01 has a DD
 . ; set flag that we are now in the pointer chain
 .
 . S DIEN=+DINTERNL
 . S DINTERNL=$P($G(^(DIEN,0)),U) ;***** Naked *****
 . I DINTERNL="" D ERR(DIMSGA,603,DIFILE,"",.01,DIEN) Q
 . S DINODE=$G(^DD(DIFILE,.01,0))
 . S DITYPE=$P(DINODE,U,2)
 . I DITYPE="" D ERR(DIMSGA,510,DIFILE,"",.01) Q
 . S DIPREVF=DIFIELD,DIFIELD=.01
 . S DICHAIN=1
 . S:DIFILE=.2 DIDONE=1 Q
 ;
E11 ; exit if we executed an output transform or ran into an error
 ;
 ; Special "i" flag returns internal value at end of pointer chain
 I DIFLAGS["i" Q DINTERNL
 I DIFILE=.2 Q DINTERNL
 I DIDONE Q DIEXTRNL
 I $G(DIERR) Q ""
 ;
E12 ; handle illegal data types (pointers, word processings, and multiples)
 ;
 I DITYPE["C" D ERRPTR("Computed") Q ""
 I DITYPE["W" D ERRPTR("Word Processing") Q ""
 I DITYPE S DITYPE=$P($G(^DD(+DITYPE,.01,0)),U,2) D  Q ""
 . I DITYPE["W" D ERRPTR("Word Processing") Q
 . D ERRPTR("Multiple") Q
 ;
E13 ; handle sets of codes
 ;
 I DITYPE["S" D  Q DIEXTRNL
 . N DICODES S DICODES=$P(DINODE,U,3)
 . N DISTART S DISTART=$F(";"_DICODES,";"_DINTERNL_":")
 . I 'DISTART S DIEXTRNL="" D  Q
 . . I 'DICHAIN D ERR(DIMSGA,730,DIFILE,"",DIFIELD,DINTERNL,"code") Q
 . . D ERR(DIMSGA,630,DIFILE,DIFIELD,"",DIEN,DINTERNL,"code")
SET . S DISTART=DINTERNL D PARSET^DIQ(DICODES,.DISTART) S DIEXTRNL=DISTART
 ;
E14 ; handle dates, and return all others as they are
 ;
 I DITYPE["D",DINTERNL D  Q DIEXTRNL
 . S DIEXTRNL=$$DATE^DIUTL(DINTERNL) ;**CCO/NI
 . I DIEXTRNL'="" Q
 . I 'DICHAIN D ERR(DIMSGA,330,"","","",DINTERNL,"date") Q
 . D ERR(DIMSGA,630,DIFILE,"",DIFIELD,DIEN,DINTERNL,"date")
 I DICLERR'=""!$G(DIERR) D
 . S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 Q DINTERNL
 ;
HEADER(DIFILE,DIEN,DIFIELD,DITYPE,DICHAIN,DINTERNL,DINEXT) ;
 ;
 ; pick a header error and log it
 ; EXTERNAL
 ;
 I DITYPE["P" D  ; pointer
 . I 'DINEXT!'$D(^DD(DINEXT)) D ERR(DIMSGA,537,DIFILE,"",DIFIELD) Q
 . D ERR(DIMSGA,403,DINEXT)
 ;
 E  D            ; variable pointer
 . I DICHAIN D ERR(DIMSGA,648,DIFILE,"",DIFIELD,DIEN,DINTERNL) Q
 . D ERR(DIMSGA,348,"","","",DINTERNL)
 Q
 ;
ERR(DIMSGA,DIERN,DIFILE,DIIENS,DIFIELD,DI1,DI2,DI3) ;
 ;
 ; error logging procedure
 ; EXTERNAL
 ;
 I $G(DIFLAGS)["A",$$ALLOW(DIERN) S DIDONE=1 Q
 N DIPE,DI F DI="FILE","IENS","FIELD",1:1:3 S DIPE(DI)=$G(@("DI"_DI))
 D BLD^DIALOG(DIERN,.DIPE,.DIPE,DIMSGA,"F")
 S DIERR=$G(DIERR)+DICLERR_U_($P($G(DIERR),U,2)+$P(DICLERR,U,2))
 Q
 ;
ERRPTR(DITYPE) ;
 ;
 ; error logging shell for errors 520 & 537
 ; EXTERNAL
 ;
 I DICHAIN D ERR(DIMSGA,537,DIPREV,"",DIPREVF) Q
 D ERR(DIMSGA,520,DIFILE,"",DIFIELD,DITYPE)
 Q
 ;
ALLOW(X) ;If ALLOW appears, do not call erroneous data an error
 N I,T F I=3:1 S T=$T(ALLOW+I) Q:T?.P  I T[X Q:T'["ALLOW"  K T Q
 Q '$D(T)
 ; 202    The input parameter that identifies the |1
 ; 301    The passed flag(s) '|1|' are unknown or in
 ; 330    The value '|1|' is not a valid |2|.           ALLOW
 ; 348    The passed value '|1|' points to a file th
 ; 401    File #|FILE| does not exist.
 ; 403    File #|FILE| lacks a Header Node.
 ; 404    The File Header node of the file stored at
 ; 501    File #|FILE| does not contain a field |1|.
 ; 510    The data type for Field #|FIELD| in File #
 ; 520    A |1| field cannot be processed by this ut
 ; 537    Field #|FIELD| in File #|FILE| has a corru
 ; 603    Entry #|1| in File #|FILE| lacks the requi
 ; 630    In Entry #|1| of File #|FILE|, the value '    ALLOW
 ; 648    In Entry #|1| of File #|FILE|, the value '
 ; 730    The value '|1|' is not a valid |2| accordi    ALLOW
 ;

DIDU1
DIDU1 ;SEA/TOAD-VA FileMan: DD Tools, IENS Check ;10:39 AM  8 Jul 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
IEN(DIENS,DIFLAGS) ;
 ;ENTRY POINT--return whether the IEN String is valid
 ;extrinsic function, all passed by value
 I $G(DIENS)="" Q 0
 I $G(DIFLAGS,"N")'="N" Q 0
 S DIFLAGS=$G(DIFLAGS)
 N DICHAR,DICRSR,DIPIECE,DISEQ,DIOUT,DIVALID
 S DIPIECE="",DISEQ="",DIOUT=0,DIVALID=1
 F DICRSR=1:1 D  I DIOUT Q
 .S DIPIECE=$P(DIENS,",",DICRSR)
 .I DIPIECE="" D  Q
 ..I $P(DIENS,",",DICRSR,999)="" S DIOUT=1 Q
I1 ..I DICRSR=1 Q
 ..S DIOUT=1,DIVALID=0
 ..Q
 .I +DIPIECE=DIPIECE S DIVALID=DIPIECE>0,DIOUT='DIVALID Q
 .I DIFLAGS["N" S DIVALID=0,DIOUT=1 Q
 .S DICHAR=$E(DIPIECE,1,2) I DICHAR'="?+" S DICHAR=$E(DICHAR)
 .I DICHAR'="+",DICHAR'="?",DICHAR'="?+" S DIOUT=1,DIVALID=0 Q
 .I $P(DIPIECE,DICHAR,2,9999)?1N.N D  Q
 ..S DISEQ=$P(DIPIECE,DICHAR,2,999)
 ..S DIOUT=+DISEQ'=DISEQ!$D(DISEQ(DISEQ)),DIVALID='DIOUT Q
I2 .S DIOUT=1,DIVALID=0
 .Q
 Q $E(DIENS,$L(DIENS))=","&DIVALID
 ;
PROOT(DIFILE,DIENS) ;
 ;ENTRY POINT--return the global root of a subfile's parent
 ;extrinsic function, all passed by value
 Q $$ROOT^DILFD($$PARENT(DIFILE),$P(DIENS,",",2,999),1)
 ;
PARENT(DIFILE) ;
 ;ENTRY POINT--return the file number of a subfile's parent
 ;extrinsic function, all passed by value
 Q $G(^DD(DIFILE,0,"UP"))
 ;
PARENTS(DIFILE,DIRULE) ;
 ;IEN--return the file's parents
 ;procedure, passed by ref
 N DIBACK,DIOUT,DIMOM,DITEMP
 S DIOUT=0,DIMOM=DIFILE
 S DITEMP=DIFILE K DIFILE S (DIFILE,DIFILE("C"))=DITEMP
 S DIFILE("L")=$$LEVEL(DIFILE)
 S DIFILE(1)=DIFILE
 I '$D(DIRULE("L",DIFILE)) S DIRULE("L",DIFILE)=DIFILE("L")
 F DIBACK=2:1 D  I DIOUT Q
 .S DITEMP=DIMOM
 .S DIMOM=$G(DIRULE("UP",DITEMP))
PA1 .I DIMOM="" D  I DIOUT Q
 ..S DIMOM=$G(^DD(DITEMP,0,"UP"))
 ..I DIMOM="" S DIOUT=1 Q
 ..S DIRULE("UP",DITEMP)=DIMOM
 ..I '$D(DIRULE("L",DIMOM)) S DIRULE("L",DIMOM)=DIFILE("L")-DIBACK+1
 ..Q
 .S DIFILE(DIBACK)=DIMOM
 .Q
 Q
 ;
LEVEL(DIFILE) ;
 ;IEN--return the file's level (# parents +1)
 ;function, pass by value
 N DIMOM
 I '$G(DIFILE) Q 0
 S DIMOM=$G(^DD(DIFILE,0,"UP"))
 I DIMOM="" Q 1
 Q $$LEVEL(DIMOM)+1
 ;

DIDU2
DIDU2 ;SEA/TOAD-VA FileMan: DD Tools, Header Nodes ;1:17 PM  12 Jan 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
HEADER(DIFILE,DIENS,DIMSGA) ;
 ;ENTRY POINT--return the value a file's Header Node should have
 ;extrinsic function, DIENS passed by reference
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DIROOT D HINPUT(.DIFILE,.DIENS,.DIMSGA,.DIROOT) I $G(DIERR) D  Q ""
 . D CLOSE
 N DIHEADER S DIHEADER=$$PIECES12(DIFILE,DIROOT) I $G(DIERR) D  Q ""
 . D CLOSE
 N DIRECENT S DIRECENT=$O(@DIROOT@(" "),-1) I DIRECENT="" S DIRECENT=0
 N DICOUNT,DIRECORD S DIRECORD=0
 F DICOUNT=0:1 S DIRECORD=$O(@DIROOT@(DIRECORD)) Q:'DIRECORD  I DICOUNT>10000 S DICOUNT=$P($G(@DIROOT@(0)),U,4) Q
 Q DIHEADER_U_DIRECENT_U_DICOUNT
 ;
HINPUT(DIFILE,DIENS,DIMSGA,DIROOT) ;
 ;evaluate input variables for HEADER call
 I $G(DIMSGA)'="" D
 . K @DIMSGA@("DIERR"),@DIMSGA@("DIHELP"),@DIMSGA@("DIMSG")
 S DIFILE=$G(DIFILE) I DIFILE="" D ERR(202,"","","","FILE") Q
 I $G(^DD(DIFILE,.01,0))="" D  Q
 . I '$D(^DD(DIFILE)) D ERR(401,DIFILE) Q
 . I '$D(^DD(DIFILE,.01)) D ERR(406,DIFILE) Q
 . E  D ERR(502,DIFILE,"",.01)
 S DIENS=$G(DIENS) I DIENS="" S DIENS=","
 I '$$IEN^DIDU1(DIENS) D  Q
 . I '$$IEN^DIDU1(DIENS_",") D ERR(202,"","","","IENS") Q
 . E  D ERR(304,"",DIENS)
 S DIROOT=$G(DIFILE("ROOT")) I DIROOT="" D
 . S DIROOT=$$ROOT^DILFD(DIFILE,DIENS,1,1) Q:DIROOT'=""!$G(DIERR)
 . I '$D(^DD(DIFILE)) D ERR(401,DIFILE) Q
 . E  D ERR(402,DIFILE,DIENS)
 Q
 ;
PIECES12(DIFILE,DIROOT) ;
 ;return pieces 1 & 2 of the Header node
 N DIPIECE1,DIPIECE2
 N DINAME S DINAME=$O(^DD(DIFILE,0,"NM","")) I DINAME="" D  Q ""
 . D ERR(408,DIFILE)
 N DIPARENT S DIPARENT=$G(^DD(DIFILE,0,"UP"))
 ;
P1 I DIPARENT'="" D  ;subfile
 . S DIPIECE1=""
 . I $P(^DD(DIFILE,.01,0),U,2)["W" D  Q
 . . D ERR(407,DIFILE)
 . N DIFIELD S DIFIELD=$O(^DD(DIPARENT,"B",DINAME,""))
 . I DIFIELD="" D  Q
 . . D ERR(501,DIFILE,"","",DINAME)
 . N DINODE S DINODE=$G(^DD(DIPARENT,DIFIELD,0)) I DINODE="" D  Q
 . . D ERR(502,DIFILE,"",DIFIELD)
 . S DIPIECE2=$P(DINODE,U,2) I DIPIECE2="" D  Q
 . . D ERR(502,DIFILE,"",DIFIELD)
 ;
P2 E  D  ;root file
 . S DIPIECE1=DINAME
 . S DIPIECE2=DIFILE_$$CODES(DIFILE,DIROOT) I $G(DIERR) Q
 I $G(DIERR) Q ""
 Q DIPIECE1_U_DIPIECE2
 ;
CODES(DIFILE,DIROOT) ;
 ;collect the file characteristics codes
 N DIFIELD S DIFIELD=$P($G(^DD(DIFILE,.01,0)),U,2) I DIFIELD="" D  Q ""
 . I '$D(^DD(DIFILE,.01)) D ERR(501,DIFILE,"","",.01) Q
 . E  D ERR(510,DIFILE,"",DIFIELD)
 N DICODES S DICODES=""
 N DITYPE F DITYPE="D","S","P","V" I DIFIELD[DITYPE S DICODES=DITYPE Q
 I $D(^DD(DIFILE,0,"ID")) S DICODES=DICODES_"I"
 I $D(^DD(DIFILE,0,"SCR"))#2 S DICODES=DICODES_"s"
 N DINODE S DINODE=$G(@DIROOT@(0))
 I $P(DINODE,U,2)["A" S DICODES=DICODES_"A"
 I $P(DINODE,U,2)["O" S DICODES=DICODES_"O"
 Q DICODES
 ;
CLOSE D CALLOUT^DIEFU($G(DIMSGA)):$G(DIMSGA)'="" Q
 ;
ERR(DIERN,DIFILE,DIIENS,DIFIELD,DI1,DI2,DI3) ;
 ;log an error
 N DIPE
 N DI F DI="FILE","IENS","FIELD",1:1:3 S DIPE(DI)=$G(@("DI"_DI))
 D BLD^DIALOG(DIERN,.DIPE,.DIPE)
 Q

DIDX
DIDX ;SFISC/XAK-BRIEF DD ;25SEP2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S D1=D0,DINM=1,DDRG=1,DDL1=14,DDL2=32 G B
 ;
L S DJ(Z)=0
A I DIDX D  G:D1>0 A:^DD(F(Z),"B",DJ(Z),D1)
 . S DJ(Z)=$O(^DD(F(Z),"B",DJ(Z))) S:DJ(Z)="" D1="" Q:DJ(Z)=""  S D1=$O(^(DJ(Z),0))
 . Q
 E  S (D1,DJ(Z))=$O(^DD(F(Z),DJ(Z)))
 I D1'>0 W ! S Z=Z-1 Q
B I $D(DIGR),D1-.01!'DID X DIGR E  G END
 S N=^DD(F(Z),D1,0) D HD:$Y+9>IOSL Q:M=U  W !!?Z+Z-2,$P(N,U,1),?30,S,F(Z),",",D1,S,S
 S X=$P(N,U,2) I X W ?M,$J(+X,8) I $D(^DD(+X,.01,0)),$P(^(0),U,2)["W" W "  WORD-PROCESSING" S X=""
 W ?M,S,S F W="BOOLEAN","COMPUTED","FREE TEXT","SET","DATE","NUMBER","POINTER","VARIABLE POINTER","K","p","m" I X[$E(W) S:W="K" W="MUMPS" S:W="p" W="POINTER" S:W="m" W="MULTIPLE" D W1 I X["V" D VP0
 I 'X D
 .N Y,NM S:X["P" Y=U_$P(N,U,3),NM=+$P(X,"P",2) I X["C" S NM=+$P(X,"p",2) I NM S Y=$G(^DIC(NM,0,"GL"))
 .Q:'$D(Y)  I Y[U,$D(@(Y_"0)")) S W="TO "_$P(^(0),U)_" FILE (#"_NM_")"
 .E  S W="***** TO A FILE THAT IS UNDEFINED *******"
 .D W1
T ;
 S W=0
H ;
 W ! I $D(^DD(F(Z),D1,.1))#2 W ?(Z*2),^(.1),"   ",?M
 I X["S" S N=$P(N,U,3) F I=1:1 S Y=$P(N,";",I) Q:Y=""  S W="'"_$P(Y,":")_"' FOR "_$P(Y,":",2)_";" W ?M,"  "_W,!
 I $D(^DD(F(Z),D1,3))#2 S W=^(3) W ?M D W1
RD ;
 I X S Z=Z+1,DDL1=DDL1+2,DDL2=DDL2+2,F(Z)=+X,W="   Multiple" D W1,L
END S X="" G:M'=U A:Z>1 Q
 ;
W1 W:$X+$L(W)+3>IOM !,?$S(IOM-$L(W)-5<M:IOM-5-$L(W),1:M),S S %Y=$E(W,IOM-$X,999) W $E(W,1,IOM-$X-1),S I %Y]"" S W=%Y G W1
 D:$Y>IOSL HD Q
 ;
HD S DC=DC+1 D ^DIDH
 Q
VP ;Variable Pointer
 W ?50,W S D1=DJ(Z)
VP0 I '$D(^DD(F(Z),D1,"V",0)) S W="" Q
 S DID1=0,DIMU=0,DID2=0 I '$D(DDRG) D RT
 S W="FILE  ORDER  PREFIX    LAYGO  MESSAGE" W !?(Z+Z+12),W G Q:M=U
VP1 S DID2=$O(^DD(F(Z),D1,"V",DID2)) S:DID2="" DID2=-1 G:DID2'>0 VP2 S DIDV=^(DID2,0) I '$D(^DIC(+DIDV,0)) S DIDV(+DIDV)=""
 S DIVP=$P(DIDV,U),DDLF=(Z+Z+15) I $L(DIVP)>4 W !?(DDLF-$L(DIVP))+1,DIVP
 E  W !?DDLF,DIVP
 W ?(DDLF+5),$P(DIDV,U,3),?(DDLF+10),$P(DIDV,U,4),?(DDLF+23),$P(DIDV,U,6) S DDL3=DDL2,DDL2=DDLF+27,W=$P(DIDV,U,2) D W1^DIDH1 S DDL2=DDL3 S:$P(DIDV,U,5)["y" DIMU=1 D:$Y+4>IOSL HD G ND^DID1:M=U,VP1
VP2 I DIMU S DIDVI=0 F  S DIDVI=$O(^DD(F(Z),D1,"V",DIDVI)) Q:DIDVI'>0  I $D(^(DIDVI,1)) S %=^(0) D VP3 Q:M=U
 S DIDV=0 F  S DIDV=$O(DIDV(DIDV)) Q:DIDV'>0  S W="!! FILE "_DIDV_" DOES NOT EXIST !!" D W^DID1 Q:M=U
Q W ! K DID2,DIMU,DID1,DIDV,DIDVI S W="" Q
VP3 ;
 W !?(Z+Z+12),"SCREEN"_$S('$D(DINM):" ON FILE "_$P(%,U)_":",1:" EXPLANATION ON FILE "_$P(%,U)_":") S W=" "_$S('$D(DINM):^(1),1:$S($D(^(2)):^(2),1:"")) D W^DID1:'$D(DINM),W^DIDH:$D(DINM)
 Q
RT F W="Required","Add New Entry without Asking","Multiply asked","audited" I X[$E(W,1) S W=" ("_W_")" W:($L(W)+$X)'<IOM ! D W^DID1 G ND^DID1:M=U
 I $D(^DD("KEY","F",F(Z),DJ(Z))) S W=" (Key field)" W:($L(W)+$X)'<IOM ! D W^DID1 G ND^DID1:M=U
 W ! I $D(^DD(F(Z),DJ(Z),.1)),^(.1)]"" W !?(Z+Z+12),^(.1),"   ",?M
 Q
AH W !,"ALPHABETICALLY BY LABEL" D YN^DICN Q:%<0  S:%=1 DIDX=1,BY="@.01"
 I '% W !?5,"Enter YES to list the fields ALPHABETICALLY BY LABEL.",!?5,"Enter NO to list the fields by NUMBER." S %=2 G AH
 Q

DIE
DIE ;SFISC/GFT,XAK-PROC.DR-STR ;14AUG2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DG,DNM,DICRREC K DB I DIE S DIE=^DIC(DIE,0,"GL")
 Q:$D(@(DIE_DA_",-9)"))  Q:'$D(@(DIE_"0)"))  S U="^",DP=+$P(^(0),U,2) Q:$P($G(^DD($$FNO^DILIBF(DP),0,"DI")),U,2)["Y"&'$D(DIOVRD)&'$G(DIFROM)
GO Q:DIE?1"^DIA(".E  Q:DA'>0  K DE,DOV,DIOV,DIEC,DTOUT N DIEDA D
 . N %
 . F %=1:1 Q:'$G(DA(%))  S DIEDA(%)=DA(%)
 . S DIEDA=DA
 . Q
 I $D(DIETMP)[0 N DIETMP S DIETMP=$$GETTMP^DIKC1("DIE")
 N DIEFXREF,DIIENS,DIE1,DIE1N K DIEFIRE,DIEBADK,DIESP S DIIENS=$$IENS^DIKCU(DP,.DA)
 S DL=1,DIE1=1,D0=DA,DI=DP,DR(1,DP)=DR D INI I $E(DR)'="[" D DR^DIE17
 S DP=DI,DA=D0,(DQ,DIEL,DK,DP(0))=0 K DIC("S")
MR S DK=DK+1,DH=$P(DR,";",DK) I +DH=DH S (DI,DM)=DH G S:$D(^DD(DP,DI)),MR
 S DI=$P(DH,":",1) I 'DI G K:DI=0,PB
J I DH["//" S DE(DQ+1,0)=$P(DH,"//",2,9),DI=$P(DI,"//",1),DH=""
 G K:+DI=DI S DM=+DI,Y=$P(DI,DM,2,99),DI=DM G MR:Y=""!'$D(^DD(DP,DI,0)) S DQ=DQ+1,DZ=^(0),DIFLD(DQ)=DI
 S $P(DZ,U)=$$LABEL^DIALOGZ(DP,DI) ;PROMPT FIELD NAME
SPC F %=1:1 S DIESP=$P(Y,$C(126),%) Q:DIESP=""  D
 .I DIESP="d"!(DIESP="R") S $P(DZ,U,2)=$P(DZ,U,2)_DIESP Q
 .I DIESP="T"!(DIESP="t") S:$G(^DD(DP,DI,.1))]"" $P(DZ,U)=^(.1) Q
 .S $P(DZ,U)=DIESP,DQ(DQ,"CAPTION")=DIESP
 S:DH'[$C(126) DH=DH_$C(126) S DQ(DQ)=DZ K DZ G Y
 ;
K S DM=$P(DH,":",2),DM=$S(DM:DM,1:DI) I DI,$D(^DD(DP,DI)) G S
NX S DI=$O(^DD(DP,DI)) S:DI="" DI=-1 G MR:DI'>0,MR:DI>DM
S I DQ'<50,'$D(DE(DQ+1)) G H
 S DQ=DQ+1,DQ(DQ)=$$LABEL^DIALOGZ(DP,DI)_U_$P(^DD(DP,DI,0),U,2,99),DIFLD(DQ)=DI ;FIELD NAME
Y S Y=$P(DQ(DQ),"^",4),DG=$P(Y,";",1)
 ;Determine whether field has a xref defined in the Index file
 S DIEXREF=0 F  S DIEXREF=$O(^DD("IX","F",DP,DI,DIEXREF)) Q:'DIEXREF  I $P($G(^DD("IX",DIEXREF,0)),U) S DIEXREF=1 Q
 I $D(^DD(DP,DI,1))!($P(DQ(DQ),U,2)["a")!DIEXREF S DE=0,DB=DM,DM=0,DE(Y)=DQ K DIEXREF F DW=1:1 S DE=$O(^DD(DP,DI,1,DE)) Q:DE<1  S DE(Y,DW,1)=^(DE,1),DE(Y,DW,2)=^(2)
 I  S:DE="" DE=-1
 I $P(DQ(DQ),U,2)["a" S DE(Y,DW,2)="S DIIX=2_U_DIFLD(DE(DQ)) D AUDIT^DIET",DE(Y,DW,1)="S DIIX=3_U_DIFLD(DE(DQ)) D AUDIT^DIET",DE(Y)=DQ I ^DD(DP,DI,"AUDIT")="e" S DE(Y,DW,1)="I $D(DE(DE(DQ)))#2 "_DE(Y,DW,1)
 S Y=$P(Y,";",2) I DU'=DG S D="",DU=DG,@DC G M:Y=0,B:DU=" ",EQ:DW[0 S D=^(DG)
 I Y S:$P(D,"^",Y)]"" DE(DQ)=$P(D,"^",Y)
 E  S Y=$E(D,+$E(Y,2,9),$P(Y,",",2)) S:Y'?." " DE(DQ)=Y
EQ G MR:DI=DM,NX:DM S DM=DB K DB G D
 ;
INI K DIC("S") S DIC=DIE,DU=-1,DC="DW=$D("_DIE_DA_",DG))"
Q Q
 ;
 ;
MORE ;from ^DIE1
 D INI G MR:DI=DM,NX:DI'[U,MR:'$D(^DD(DP,+DI)) S %=$P(DI,U,2),DI=+DI S:%]"" DQ(DQ+1,"CAPTION")=% G S
 ;
 ;
JMP ;from ^DIE0
 D INI G J
 ;
PB I DH="" G D:$D(DR(DIE1,DP))<9 S:'$D(DOV) DOV=0,DR(DIE1,DP)=DR S DOV=$O(DR(DIE1,DP,DOV)) S:DOV="" DOV=-1 G D:DOV'>0 S DR=DR(DIE1,DP,DOV),DK=0 G MR
 G MR:DH?1"@".N I 'DQ G TEM:DH?1"[".E S:"Q"'=DH DQ=1,DQ(0,1)=DH G MR:$A(DH)-94 S DC=$P(DH,U,1,4) X $P(DH,U,5,999) D DIE1N G O^DIE0
E S DK=DK-1,(DI,DM)=1
D G DQ^DIED
 ;
H S DI=DI_U G D
 ;Multiple field
M S Y=$P(DQ(DQ),U,2)_U_DG G DC:DW<9
 I $D(DSC(+Y))#2,$P(DSC(+Y),"I $D(^UTILITY(",1)="" S D=DIEL+1 D D1 X DSC(+Y) S D=$O(^(0)) S:D="" D=-1 S @DC S DC=$O(^(DG,0)) S:DC="" DC=-1 G DE
 I $D(^(DG,0)) S D=$P(^(0),U,3,4) S:$P(^(0),U,2)'=$P(Y,U) $P(^(0),U,2)=$P(Y,U) ;HMMM
 E  S D=$O(^(0)) S:D="" D=-1
DE I D>0 S Y=Y_U_D I DP(0)-Y!($P(DP(0),U,2)-DK),$D(^(+D,0)) S DE(DQ)=$P(^(0),U) ;Default value if this isn't same multiple we were down in before
DC S DC=$P(^DD(+Y,0),U,4)_U_Y,%=DQ(DQ),Y=^(.01,0)
MUL I $P(Y,U,2)'["W" S DQ(DQ)=$P($$EZBLD^DIALOG(8042,$G(DQ(DQ,"CAPTION"),$$LABEL^DIALOGZ(+$P(%,U,2),.01))),": ")_U_1_$P(Y,U,2,99) D DIE1N G D ;MULTIPLE-FIELD LABEL
 I DQ>1 K DQ(DQ) G E:$D(DE(DQ,0)),H
 D
 .Q:DH'[$C(126)
 .N DIEA S DIEA=$P($P(DH,+DH,2),$C(126)) Q:DIEA=""!(DIEA="d")!(DIEA="R")
 .I DIEA="T"!(DIEA="t") S:$D(^DD(+$P(%,U,2),.01,.1)) DQ(DQ,"CAPTION")=^(.1) Q
 .S DQ(DQ,"CAPTION")=DIEA
DIWE S Y=$G(DQ(DQ,"CAPTION"),$$LABEL^DIALOGZ(DP,DI))_U_$P(Y,U,2) D DIEN^DIWE K DQ,DG,DE S DQ=0 G QY^DIE1:$D(DTOUT) G MORE ;WORD-PROCESSING FIELD LABEL
 ;
D1 Q:D'>0  S:'$D(@("D"_D)) @("D"_D)=0 S D=D-1 G D1
 ;
DIE1N N M,I S DIE1N="" F I=DK,DK+1 S M=$P(DR,";",I) I M?1"^"1.NP S DIE1N=$P(M,U,2) S:I>DK DK=DK+1 Q  ;WPB-0804-30857
 Q
 ;
 ;
B K DQ(DQ) S DQ=DQ-1,DU=-9 G EQ
 ;
TEM K:$D(DIETMP)#2 @DIETMP,DIETMP
 S Y=0 F  S Y=$O(^DIE("B",$P($E(DR,2,99),"]"),Y)) G Q:Y="",Q:'$D(^DIE(+Y,0)) Q:$P(^(0),U,4)=DP
 S $P(^(0),U,7)=DT I $G(^("ROU"))[U,$$ROUEXIST^DILIBF($P(^("ROU"),U,2)) G @^DIE(+Y,"ROU")
 S:$D(^("W")) DIE("W")=^("W") S DIE("^")=DR K DR S %X="^DIE(+Y,""DR"",",%Y="DR(" D %XY^%RCR
 S DR=$G(^DIE(Y,"DR"),DR(1,DP)) D DIE K DR S DR=DIE(U)
 Q
 ;
 ;Silent call concerning editing and filing of data.
 ;
FILE(DIEFFLAG,DIEFAR,DIEFOUT) ;
 G FILEX^DIEF
 ;
WP(DIEFF,DIEFIEN,DIEFFLD,DIEFWPFL,DIEFTSRC,DIEFOUT) ;
 G WPX^DIEFW
 ;
HELP(DIEHF,DIEHIEN,DIEHFLD,DIEHFLG,DIEHOUT) ;
 G GETX^DIEH
 ;
VAL(DIEVF,DIEVIEN,DIEVFLD,DIEVFLG,DIEVAL,DIEVANS,DIEVFAR,DIOUTAR) ;
 G VALX^DIEV
 ;
KEYVAL(DIVKFLAG,DIVKFDA,DIVKOUT) ;
 G KEYVALX^DIEVK
 ;
VALS(DIVSFLAG,DIVSEFDA,DIVSIFDA,DIVSMSG) ;
 G VALSX^DIEVS
 ;
CHK(DIEVF,DIEVFLD,DIEVFLG,DIEVAL,DIEVANS,DIOUTAR) ;
 G CHKX^DIEV
 ;
UPDATE(DIFLAGS,DIFDA,DIEN,DIMSGA) ;SEA/TOAD
 ; ENTRY POINT--update database
 ; procedure, all passed by value
 G ADDX^DICA
 ;

DIE0
DIE0 ;SFISC/GFT-BRANCHING, UP-ARROWING ;23DEC2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G Q^DIE1:$D(DTOUT) G:X'?1"^".E T^DIED:$P($P(DQ(DQ),U,4),";E",2),X
 I $D(DIE("NO^")),X=U,DIE("NO^")'["OUTOK" W !?3,$$EZBLD^DIALOG(3095) G X ;**
 I $D(DIE("NO^")),X?1"^"1E.E,DIE("NO^")'["BACK" W !?3,$$EZBLD^DIALOG(3096) G X ;**
 I $L(X,"^")-1>1 S X=$E(X,2,99) G DIE0
 S X=$P(X,U,2),DIC(0)="E"
OUT I X=""!(DP<0) S DIK=X,DC=$S($D(DQ(DQ))#2:$P(DQ(DQ),U,4),1:DQ) G OUT^DIE1
 I DR]"" G A:X?1"@".N S DIC("S")="D S^DIE0" S:'$D(DR(DIE1,DP)) DR(DIE1,DP)=DR
 S DDBK=0,DIC="^DD("_DP_"," D ^DIC I Y>0 D S
 E  W:DDBK !?3,$$EZBLD^DIALOG(3097)
 K DTOUT,DIC,DDBK,DDFND,DDONE,A0,A1,A2
 I Y<0 S DG=DK,DH=":"_DM G X
 S DI=$S(DH[":":+Y,1:DH),DK=DG D ^DIE1:$D(DG)>9 K DG,DB,DE,DQ,DIFLD S DQ=0 G JMP^DIE
X W:X'["?"&'$D(ZTQUEUED) $C(7),"??" G B^DIED:'$D(DB(DQ)),B^DIE1
 ;
BR ;From ^DIED
 S Y=U,X=$G(X) X DQ(0,DQ) D:$D(DIEFIRE)#2 FIREREC^DIE1 G A^DIED:$D(Y)[0,A^DIED:Y=U S D=$S(+Y=Y:9999,1:DQ),X="" I 0[Y S DQ=0 G OUT ;MAKE SURE 'X' EXISTS, AFTER W-P
D S D=D+1 I '$D(DQ(D)) G D:$D(DQ(0,D)) S DQ=9999,X=Y,DIC(0)="FO" G OUT
 G D:$P(DQ(D),Y,1)]"" S DQ=D G RE^DIED
 ;
O ;From ^DIE
 K DQ S (DI,DV,DM)=0 I X]"",$D(@(U_$P(DC,U,3)_X_",0)"))#2 D S^DIE1,DIEC
 S DQ=0 G MORE^DIE
 ;
DIEC S DIE=U_$P(DC,U,3),DIEC(DL)=DA F %=1:1 Q:'$D(DA(%))  S DIEC(DL,%)=DA(%)
 K DA,DB,DE,DG F %=0:1:DIEL-1 S DA="D"_%,DIEC(DL,0,%)=@DA K @DA
 S:$D(DIETMP)#2 DIEC(DL,"IENS")=DIIENS,DIIENS=X_","
 S DIEL=0,(D0,DA)=X Q
 ;
DIEZ ;
 I X="" G @("A"_U_DNM)
 S D=0,DL=DL+1,DNM(DL)=DNM,DNM(DL,0)=DQ,DIEL=DIEL+1 D DIEC G @DGO
 ;
A I $D(DR(DIE1,DP))>9 D OA ;Branching to "@N"
 E  F DG=1:1 S DH=$P(DR(DIE1,DP),";",DG) G X:DH="" I DH=X S:$D(DOV) DOV=0 S DR=DR(DIE1,DP) Q
 S DK=DG,DI=X D ^DIE1 G JMP^DIE
OA S %=0 F  S %=$O(DR(DIE1,DP,%)) Q:%=""  F DG=1:1 S DH=$P(DR(DIE1,DP,%),";",DG) Q:DH=""  I DH=X S DR=DR(DIE1,DP,%),DOV=%,%=9999 Q
 S %=-1 Q
 ;
E ;UNEDITABLE & DINUM fields
 I X="@" Q:DV'["I"  G NO
 Q:X[U!(X?."?")!DV!$D(DITC)
NO W:'$D(DB(DQ)) $C(7),"   NO EDITING!!" K X
Q Q
 ;
 ;
 ;
S ;SCREEN fields;  out= $T
 N DDR S (%,DDFND)=0,DDR=DR(DIE1,DP),DDBK=0,Y=+Y
 I $D(DIE("NO^")),DIE("NO^")["BACK" S DDBK=1
 D S1 I DDFND Q
 I 'DDONE,$D(DR(DL,DP))>9 F %=-1:0 S %=$O(DR(DIE1,DP,%)) Q:%=""  S DDR=DR(DIE1,DP,%) D S1 Q:DDONE!DDFND
 Q
S1 ;selectable?
 S DDONE=0 F DG=1:1 D S2 Q:DDFND!DDONE!(DH="")
 I DDFND S DOV=%,DR=$G(DR(DIE1,DP,%),$G(DR(DIE1,DP)))
 Q
S2 ;parse for ;-piece
 S DH=$P(DDR,";",DG) Q:(DH["///"&(DIC(0)'["F"))!'DH
 ;list
 I 'DDBK,+DH=Y S DDFND=1 Q
 I DDBK,+DH=DIFLD,+DH'=Y S DDONE=1 Q
 I DDBK,+DH=Y S DDFND=1 Q
 Q:$P(DH,"//")'[":"
 ;range
 S A0=+$P(DH,":",1),A1=+$P(DH,":",2)
 I 'DDBK,Y'<A0,Y'>A1 S DDFND=1 Q
 F A2=A0-.000001:0 S A2=$O(^DD(DP,A2)) Q:A2>A1!'A2  S:A2=DIFLD&(A2'=Y)&DDBK DDONE=1 Q:DDONE  I A2=Y,(A2'>DIFLD) S DDFND=1 Q
 Q

DIE1
DIE1 ;SFISC/GFT-FILE DATA, XREF IT, GO UP AND DOWN MULTIPLES ;28MAY2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DQ,DB G E1:$D(DG)<9 I DP<0 K DG S DQ=0 Q
 S DQ="",DU=-2,DG="$D("_DIE_DA_",DU))"
Y S DQ=$O(DG(DQ)),DW=$P(DQ,";",2) G DE:$P(DQ,";")=DU
 I DU'<0 S ^(DU)=DV,DU=-2
 G IX:DQ="" S DU=$P(DQ,";",1),DV="" I @DG S DV=^(DU)
DE I 'DW S DW=$E(DW,2,99),DE=DW-$L(DV)-1,%=$P(DW,",",2)+1,X=$E(DV,%,999),DV=$E(DV,0,DW-1)_$J("",$S(DE>0:DE,1:0))_DG(DQ) S:X'?." " DV=DV_$J("",%-DW-$L(DG(DQ)))_X G Y
PC S $P(DV,"^",DW)=DG(DQ) G Y
 ;
IX S DICRREC="LOADXR^DIED",DQ=$O(DE(" ")) G E1:DQ="",E1:'$D(DG(DQ)) I $D(DE(DE(DQ)))#2 F DG=1:1 Q:'$D(DE(DQ,DG))  S DIC=DIE,X=DE(DE(DQ)) X DE(DQ,DG,2)
 S X="" I DG(DQ)]"" F DG=1:1 Q:'$D(DE(DQ,DG))  S DIC=DIE,X=DG(DQ) X DE(DQ,DG,1)
 D:$D(DIEFXREF) FIREFLD
E1 K DICRREC,DIFLD,DG,DB,DE,DIANUM S DQ=0 Q
 ;
B ;
 I '$D(DB(DQ)) S X="?BAD" G ^DIEQ
 S DC=DQ,DIK="",DL=1
OUT ;
 D DIE1 S Y(DC)=DIK G UP:DL>1,Q:DC=0,QY
 ;
E ;
 I DP'<0 S DC=$S($D(X)#2:X,1:"") D DIE1 S X=DC G G:DI>0,UP:DL>1
Q K Y
QY I $D(DTOUT),$D(DIEDA) D
 . N % K DA
 . F %=1:1 Q:'$D(DIEDA(%))  S DA(%)=DIEDA(%)
 . S DA=DIEDA
 . Q
 K:$D(DTOUT) DG,DQ
 I $D(DIETMP)#2 D FIREREC K @DIETMP,DIETMP
 K DIEBADK,DIEFIRE,DIEXREF,DIEFXREF,DIIENS,DIE1,DIESP
 K DIP,DB,DE,DM,DK,DL,DH,DU,DV,DW,DP,DC,DIK,DOV,DIEL,DIFLD Q
 ;
M ;
 S DD=X,DIC(0)="LM"_$S($D(DB(DQ)):"X",1:"QE"),DO(2)=$P(DC,"^",2),DO=$P($P(DQ(DQ),U)," ",2,99)_"^"_DO(2)_"^"_$P(DC,"^",4,5) D DOWN I @("'$D("_DIC_"0))") S ^(0)="^"_DO(2)
 E  I DO(2)["I" S %=0,DIC("W")="" D W^DIC1
 K DIC("PTRIX") M DIC("PTRIX")=DIE("PTRIX")
DIC S D="B",DLAYGO=DP\1,X=DD D  K DIC("PTRIX")
 .N DIETMP,DICR D X^DIC
 I Y>0 S DA=+Y,DI=0,X=$P(Y,U,2) S:$D(DIETMP)#2 $P(DIIENS,",")=DA S:+DR=.01!(DR="")&$P(Y,U,3) DI=.01,DK=1,DM=$P($P(DR,";",1),":",2),DM=$S(DR="":9999999,DM="":+DR,1:DM) G D1
 S DI(DL-1)=DI(DL-1)_U K DUOUT,DTOUT G U1
 ;
DOWN D S,DIE1,DDA S DIE=DIC Q
 ;
S ;CALLED BY O+1^DIE0
 S DIOV(DL)=$G(DOV,0) K DOV
 S DIE1N(DL)=$G(DIE1N),DP(DL)=DP,DP=+$P(DC,"^",2),DI(DL)=$S(DV'["M":DI,$D(DSC(DP))!$D(DB(DQ)):DI,1:DI_U_$G(DQ(DQ,"CAPTION"))),DIE(DL)=DIE,DK(DL)=DK,DR(DL)=DR
 S DM(DL)=DM,DK=0,DIE1(DL)=DIE1,DL=DL+1,DIE1=$S($G(DIE1N):DIE1N,1:DL),DIEL=DIEL+1,DM=9999999,DR=""
 I $D(DR(DIE1,DP)) S DM=0,DR=DR(DIE1,DP)
 Q
 ;
DDA N T,X
 S T=$T
 F X=+$O(DA(" "),-1):-1:1 K DA(X+1) S:$D(DA(X))#2 DA(X+1)=DA(X)
 K DA(1) S:$D(DA)#2 DA(1)=DA
 S DIC=DIE_DA_","""_$P(DC,U,3)_""","
 S:$D(DIETMP)#2 DIIENS=","_DIIENS
 I T
 Q
 ;
UDA N T,X
 S T=$T
 S DA=$G(DA(1)) ;K DA(1)
 F X=2:1:+$O(DA(" "),-1) I $D(DA(X))#2 S DA(X-1)=DA(X) K DA(X)
 S:$D(DIETMP)#2 DIIENS=$P(DIIENS,",",2,999)
 I T
 Q
N ;
 D DOWN S DA=$P(DC,U,4),DI=.01 S:$D(DIETMP)#2 $P(DIIENS,",")=DA S ^DISV(DUZ,$E(DIC,1,28))=$E(DIC,29,999)_DA
D1 S @("D"_DIEL)=DA
G G MORE^DIE
 ;
UP ;
 Q:$D(DTOUT)
 S DP(0)=DP_U_DK(DL-1) I $D(DIEC(DL)) D DIEC G U
U1 D UDA S DIEL=DIEL-1
U S DQ=0,DL=DL-1,DIE1N=DIE1N(DL),DIE=DIE(DL),DM=DM(DL),DI=DI(DL),DP=DP(DL),DR=DR(DL),DK=DK(DL),DIE1=DIE1(DL) I $D(DIOV(DL)) S DOV=DIOV(DL) K DIOV(DL)
 G G
 ;
DIEC K DA S DA=DIEC(DL) F %=1:1 Q:'$D(DIEC(DL,%))  S DA(%)=DIEC(DL,%)
 F DIEL=0:1 Q:'$D(DIEC(DL,0,DIEL))  S @("D"_DIEL)=DIEC(DL,0,DIEL)
 S:$D(DIETMP)#2 DIIENS=DIEC(DL,"IENS")
 S DIEL=DIEL-1 K DIEC(DL)
 Q
 ;
FIREFLD ;Fire field-level xrefs stored in DIEFXREF
 D:$D(DIEFXREF)>2 FIRE^DIKC(DP,.DA,"KS","DIEFXREF","O","",$E("C",$G(DIOPER)="A"))
 K DIEFXREF
 Q
 ;
FIREREC ;Fire record-level xrefs accumulated in ^TMP
 Q:$D(DIETMP)[0  Q:$D(@DIETMP@("R"))<2
 N DP,DIIENS,DIE,DA,DIKEY,Y
 ;
 S DP=0 F  S DP=$O(@DIETMP@("R",DP)) Q:'DP  D
 . S DIIENS=" " F  S DIIENS=$O(@DIETMP@("R",DP,DIIENS)) Q:DIIENS=""  D
 .. D DA^DILF(DIIENS,.DA)
 .. D FIRE^DIKC(DP,.DA,"KS",$NA(@DIETMP@("R")),"F^^K",.DIKEY,$E("C",$G(DIOPER)="A"))
 ;
 ;If any keys are invalid, restore values
 D:$D(DIKEY)>9 RESTORE(.DIKEY,DIETMP)
 ;
 K DIEFIRE,@DIETMP@("R"),@DIETMP@("V")
 Q
 ;
RESTORE(DIKEY,DIETMP) ;Restore key fields to their pre-edited values
 N DA
 K DIEBADK
 S:$D(DIEFIRE)#2 X="BADKEY"
 ;
 ;Set "write" and "restore" flags
 N DIEWR,DIEREST
 I '$D(ZTQUEUED),'$D(DDS),$D(DIEFIRE)[0!($G(DIEFIRE)["M") S DIEWR=1
 E  S DIEWR=0
 I $D(DIEFIRE)#2,DIEFIRE'["R" S DIEREST=0
 E  S DIEREST=1
 I '$G(DIEWR),'$G(DIEREST),$G(DIEFIRE)'["L" Q
 ;
 N DIEFDA,DIEKK,DIEMSG,DIFIL,DIFLD,DIFLDI,DIIENS,DIIENSA
 N DINEW,DIOLD,DIRFIL,X
 ;
 ;Loop through all keys that are not unique and build FDA
 K DIEFDA
 S DIRFIL=0 F  S DIRFIL=$O(DIKEY(DIRFIL)) Q:'DIRFIL  D
 . S DIEKK=0 F  S DIEKK=$O(DIKEY(DIRFIL,DIEKK)) Q:'DIEKK  D
 .. Q:$D(^DD("KEY",DIEKK,0))[0
 .. K DIFLD
 .. S DIFLDI=0 F  S DIFLDI=$O(^DD("KEY",DIEKK,2,DIFLDI)) Q:'DIFLDI  D
 ... S DIFLD=$P($G(^DD("KEY",DIEKK,2,DIFLDI,0)),U),DIFIL=$P($G(^(0)),U,2)
 ... Q:'DIFLD!'DIFIL
 ... S DIFLD(DIFIL,DIFLD)=$$FLEVDIFF^DIKCU(DIRFIL,DIFIL)
 .. S DIIENS=" " S DIIENS=$O(DIKEY(DIRFIL,DIEKK,DIIENS)) Q:DIIENS=""  D
 ... S DIFIL=0 F  S DIFIL=$O(DIFLD(DIFIL)) Q:'DIFIL  D
 .... S DIFLD=0 F  S DIFLD=$O(DIFLD(DIFIL,DIFLD)) Q:'DIFLD  D
 ..... Q:$D(^DD(DIFIL,DIFLD,0))[0
 ..... S DIIENSA=$P(DIIENS,",",DIFLD(DIFIL,DIFLD)+1,999)
 ..... Q:$D(@DIETMP@("V",DIFIL,DIIENSA,DIFLD,"F"))[0!$D(^("4/"))  S DIOLD=^("F")
 ..... K DA D DA^DILF(DIIENSA,.DA)
 ..... S X=$$DEC^DIKC2(DIFIL,DIFLD) Q:X=""  X X S DINEW=X
 ..... I DIEREST S DIEFDA(DIFIL,DIIENSA,DIFLD)=DIOLD
 ..... I DIEWR!($G(DIEFIRE)["L") D
 ...... S DIEBADK(DIRFIL,DIEKK,DIFIL,DIIENSA,DIFLD,"O")=DIOLD
 ...... S DIEBADK(DIRFIL,DIEKK,DIFIL,DIIENSA,DIFLD,"N")=DINEW
 ;
 I DIEREST,$D(DIEFDA) D FILE^DIE("U","DIEFDA","DIEMSG") K DIERR
 I DIEWR,$D(DIEBADK) D MSG^DIEKMSG(.DIEBADK,DIEREST)
 ;
 I $G(DIEFIRE)'["L" K DIEBADK
 Q

DIE17
DIE17 ;SFISC/GFT-COMPILED TMPLT UTIL ;03:47 PM  13 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $D(DTOUT) S X="" G OUT
 G:$A(X)-94 X:'$P(DW,";E",2),@("T^"_DNM)
 I $D(DIE("NO^")),X=U,DIE("NO^")'["OUTOK" W !?3,"EXIT NOT ALLOWED " S D="" G X
 I $D(DIE("NO^")),X?1"^"1.E,DIE("NO^")'["BACK" W !?3,"JUMPING NOT ALLOWED " S D="" G X
 I $L(X,"^")-1>1 S X=$E(X,2,99) G DIE17
 S X=$P(X,U,2),DIC(0)="E" G OUT
Z ;
 S DL=1,X=0
OUT ;
 I 0[X S DM=DW D FILE G ABORT:DL=1,R
 S DIC="^DD("_DP_"," G OJ:'$D(^DIE(DIEZ,"AB")) S DIEZAB=$S(DL=1:U,1:DNM(DL,0)_U_DNM(DL)) I X?1"@".N,$D(^("AB",DIEZAB,X)) S DNM=^(X) G JMP
 S DDBK=0 I $D(DIE("NO^")),DIE("NO^")["BACK" D DR S DDBK=1,DIC("S")="I $D(^DIE(DIEZ,""AB"",DIEZAB,Y)) D S^DIE0"
 E  S DIC("S")="I $D(^DIE(DIEZ,""AB"",DIEZAB,Y)),DIC(0)[""F""!'$D(^(Y,""///""))"
 S DIC="^DD("_DP_"," D ^DIC S DIC=DIE I Y<0 S D="" W:DDBK !?3,"JUMPING FORWARD NOT ALLOWED "
 I DDBK K DR S DR(1,DP)=^DIE(DIEZ,"ROU"),DR=DI
 K A0,A1,DDBK,DIC,DTOUT G X:Y<0 S DNM=^DIE(DIEZ,"AB",DIEZAB,+Y)
JMP K DIEZAB D FILE S Y=DNM,DNM=$P(Y,U,2),DQ=+Y,D=0 D @("DE^"_DNM) G @Y
 ;
OJ I X?1"@".N,$D(^DIE("AF",X,DIEZ)) S DNM=^(DIEZ)
 E  S DIC("S")="I $D(^DIE(""AF"","_DP_",Y,DIEZ)),DIC(0)[""F""!'$D(^(DIEZ,""///""))" D ^DIC K DIC S DIC=DIE G X:Y<0 S DNM=^DIE("AF",DP,+Y,DIEZ)
 G JMP
F ;
 S DC=$S($D(X)#2:X,1:0) D FILE S X=DC Q
FILE ;
 K DQ Q:$D(DG)<9  S DQ="",DU=-2,DG="$D("_DIE_DA_",DU))"
Y S DQ=$O(DG(DQ)),DW=$P(DQ,";",2) G DE:$P(DQ,";",1)=DU
 I DU'<0 S ^(DU)=DV,DU=-2
 G E1:DQ="" S DU=$P(DQ,";",1),DV="" I @DG S DV=^(DU)
DE I 'DW S DW=$E(DW,2,99),DE=DW-$L(DV)-1,%=$P(DW,",",2)+1,X=$E(DV,%,999),DV=$E(DV,0,DW-1)_$J("",$S(DE>0:DE,1:0))_DG(DQ) S:X'?." " DV=DV_$J("",%-DW-$L(DG(DQ)))_X G Y
PC S $P(DV,U,DW)=DG(DQ) G Y
 ;
IX D:$D(DE(DQ))#2 @DE(DQ)
K K DE(DQ)
E1 S DQ=$O(DE(" ")) I DQ'="" G IX:$D(DG(DQ)),K
 K DG,DE,DIFLD S DQ=0 Q
1 ;
 D FILE
R D UP G @("R"_DQ_U_DNM)
 ;
UP S DNM=DNM(DL),DQ=DNM(DL,0) K DTOUT,DNM(DL) I $D(DIEC(DL)) D DIEC^DIE1 G U
 S DIEL=DIEL-1,%=2,DA=DA(1) K DA(1)
DA I $D(DA(%)) S DA(%-1)=DA(%) K DA(%) S %=%+1 G DA
 S DIIENS=$P(DIIENS,",",2,999)
U S DL=DL-1 Q
 ;
X W:X'["?"&'$D(ZTQUEUED) $C(7),"??" G Z:$D(DB(DQ))
B G @(DQ_U_DNM)
N ;
 D DOWN S DA=$P(DC,U,4),$P(DIIENS,",")=DA,D=0 S ^DISV(DUZ,$E(DIC,1,28))=$E(DIC,29,999)_DA
D1 S @("D"_DIEL)=DA G @(DGO)
M ;
 S DD=X D DOWN S DO(2)=$P(DC,"^",2),DO=DOW_"^"_DO(2)_"^"_$P(DC,"^",4,5),DIC(0)="LM"_$S($D(DB(DNM(DL,0))):"X",1:"QE") I @("'$D("_DIC_"0))") S ^(0)="^"_DO(2)
 E  I DO(2)["I" S %=0,DIC("W")="" D W^DIC1
 K DIC("PTRIX") M DIC("PTRIX")=DIE("PTRIX")
 K DICR S D="B",DLAYGO=DP\1,X=DD D X^DIC K DIC("PTRIX")
 I Y>0 S DA=+Y,$P(DIIENS,",")=DA,X=$P(Y,U,2),D=$P(Y,U,3) G D1
 D UP G @(DQ_U_DNM)
 ;
DOWN S DL=DL+1,DNM(DL)=DNM,DNM(DL,0)=DQ D FILE
 F %=DL+1:-1:1 I $D(DA(%)) S DA(%+1)=DA(%)
 S DA(1)=DA,DIC=DIE_DA_","""_$P(DC,U,3)_""",",DIEL=DIEL+1,DIIENS=","_DIIENS Q
ABORT D E S Y(DM)="" Q
0 ;
 D FILE
E D FIREREC K:$D(DIEZTMP)#2 @DIEZTMP
 K DIP,Y,DE,DOW,DB,DP,DW,DU,DC,DV,DH,DIL,DNM,DIEZ,DLB,DIEL,DGO,DICRREC Q
DR ;
 N F,DA I $E(DR)="[" S %X="^DIE(DIEZ,""DR"",",%Y="DR(" D %XY^%RCR S DR=DR(DL,DP) Q
 S F=0 D DICS^DIA F DDW=1:1 S DDW1=$P(DR,";",DDW) Q:DDW1=""  I $D(^DD(DI,+DDW1,0)),+$P(^(0),U,2)!(DDW1[":") S X=+DDW1,D(F)=+$P(DDW1,":",2) S:'D(F) D(F)=X D RANGE^DIA1
 K DDW,DDW1 Q
 ;
FIREREC ;Fire the record level xrefs
 Q:'$D(DIEZRXR)&$S($D(DIEZTMP)#2:'$D(@DIEZTMP@("R")),1:1)
 N DA,DIE,DIEZXR,DIIENS,DIKEY,DP
 ;
 S DP=0 F  S DP=$O(DIEZRXR(DP)) Q:'DP  D
 . S DIIENS=" " F  S DIIENS=$O(DIEZRXR(DP,DIIENS)) Q:DIIENS=""  D
 .. S DIE=DIEZRXR(DP,DIIENS)
 .. D DA^DILF(DIIENS,.DA)
 .. S DIEZXR=0 F  S DIEZXR=$O(DIEZRXR(DP,DIEZXR)) Q:DIEZXR'=+DIEZXR  D
 ... I $D(DIEZAR(DP,DIEZXR))#2 N DIEXEC S DIEXEC="K" D @DIEZAR(DP,DIEZXR)
 ;
 ;Fire record level indexes for triggered fields not in the template
 S DP=0 F  S DP=$O(@DIEZTMP@("R",DP)) Q:'DP  D
 . S DIIENS=" " F  S DIIENS=$O(@DIEZTMP@("R",DP,DIIENS)) Q:DIIENS=""  D
 .. D DA^DILF(DIIENS,.DA)
 .. D FIRE^DIKC(DP,.DA,"KS",$NA(@DIEZTMP@("R")),"F^^K",.DIKEY,$E("C",$G(DIOPER)="A"))
 ;
 ;If any keys are invalid, restore values
 D:$D(DIKEY)>9 RESTORE^DIE1(.DIKEY,DIEZTMP)
 ;
 K DIEFIRE,DIEZRXR,@DIEZTMP@("V")
 Q
 ;
 ;===========
 ;  $$UNIQUE
 ;===========
 ;Called from compiled routine.
 ;Look at actual (untruncated) values in the matching indexes.
 ;Return 1 if unique.
 ;In:
 ; DIUIR    = Root of matching uniqueness index
 ; DISETX   = Entry point to set X array
 ; DIMAXL(order#) = max length of subscript with order #
 ;
UNIQUE(X,DA,DIUIR,DISETX,DIMAXL) ;
 N DIDASV,DIIENS,DIIENSC,DINDX,DINS,DIUNIQ,DIXSV,I,O
 ;
 M DIDASV=DA,DIXSV=X
 S DIIENSC=$$IENS(.DA)
 ;
 S DIUNIQ=1,DINS=$QL(DIUIR),DINDX=DIUIR
 F  S DINDX=$Q(@DINDX) Q:$NA(@DINDX,DINS)'=DIUIR  D  Q:'DIUNIQ
 . ;Set DA array, quit if this is index for current record
 . S DIIENS=$E(DINDX,$L(DIUIR)+1,$L(DINDX)-1),L=$L(DIIENS,",")
 . S DA=$P(DIIENS,",",L) F I=1:1:L-1 S DA(I)=$P(DIIENS,",",L-I)
 . S DIIENS=$$IENS(.DA) Q:DIIENS=DIIENSC
 . I '$D(DIMAXL) S DIUNIQ=0 Q
 . ;
 . ;Set the X array for the indexed record and compare
 . D @(DISETX_"(""ONFILE"")")
 . S O=0 F  S O=$O(DIMAXL(O)) Q:'O  Q:X(O)'=DIXSV(O)
 . S:'O DIUNIQ=0
 ;
 K DA,X M DA=DIDASV,X=DIXSV
 Q DIUNIQ
 ;
UNIQFERR ;The field is part of a key and is not unique
 I '$D(ZTQUEUED),'$D(DDS) D
 . W $C(7)_"??"
 . W:'$D(DB(DQ)) !,"     ",$$EZBLD^DIALOG(3094)
 K DIEFXREF S ^("N")=@DIEZTMP@("V",DP,DIIENS,DIFLD,"O")
 G:$D(DB(DQ)) Z
 S X="?BAD"
 G @("QS^"_DNM)
 ;
IENS(DA) ;Return IENS from DA array
 N I,IENS
 S IENS=$G(DA)_"," F I=1:1:$O(DA(" "),-1) S IENS=IENS_DA(I)_","
 Q IENS
 ;
TRIG ;Save info for record level indexes on a triggered field.
 ;Called by DICR (via @DICRREC)
 N DIE,DIE17RXR,OLD,XR
 S OLD=DIU
 ;
 ;Get record level indexes on triggered field
 D LOADFLD^DIKC1(DIH,DIG,"KS","",$NA(@DIEZTMP@("V")),"","DIE17RXR","",.RLIST,"f")
 Q:RLIST=""
 ;
 S DIE=$$OREF^DILF($NA(@$$FROOTDA^DIKCU(DIH)))
 I $D(^DIE("AF",DIH,DIG,DIEZ)) D
 . N N,PC,RL,XR
 . S RL=RLIST
 . F  D  Q:RL=""
 .. F PC=1:1:$L(RL,U) S XR=$P(RL,U,PC) S:XR DIEZRXR(DIH,XR)=""
 .. S N=$G(N)+1,RL=$G(RLIST(N))
 . S DIEZRXR(DIH,DICRIENS)=DIE
 E  M @DIEZTMP@("R")=DIE17RXR S @DIEZTMP@("R",DIH,DICRIENS)=DIE
 ;
 ;Save the old value of the field
 S @DIEZTMP@("V",DIH,DICRIENS,DIG,"O")=OLD S:$D(^("F"))[0 ^("F")=OLD
 Q

DIE2
DIE2 ;SFISC/GFT,XAK-DELETE AN ENTRY ;12:37 PM  20 Feb 2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D F,DL Q:$D(DTOUT)  G B^DIED:Y=2,A^DIED:Y,UP^DIE1:DL>1,Q^DIE1
 ;
F S D=$P(DQ(DQ),U,4) S:DP+1 D=DIFLD Q
 ;
Z S DIEZFLAG=1 D DL K DIEZFLAG S DU="" I Y=2 G @(DQ_U_DNM)
 I Y D:$G(DE(DW,"INDEX")) SAVEVALS^@DNM G @("A^"_DNM)
 G R^DIE9:DL>1,E^DIE9
DL ;
 S %=DP,X=D,Y=$P(DQ(DQ),U,4)="0;1"
 G X:$D(DE(DQ))[0,X:DV["R"&'Y,X:$D(^DD("KEY","F",DP,D))&'Y,S:DP<0,DD:DUZ(0)="@" I DV S %=+$P(DC,U,2),X=.01
 G DD:DP<2 I $D(DIDEL),DIDEL\1=(DP\1) G DD
 I Y,$S($D(^VA(200,"AFOF")):1,1:$D(^DIC(3,"AFOF"))) G DD:$D(^DD(DP,0,"UP"))!DV,DAR:'$S($D(^VA(200,DUZ,"FOF",DP)):1,1:$D(^DIC(3,DUZ,"FOF",DP))),DAR:'$P(^(DP,0),U,3),DD
 I Y,$D(^DIC(%,0,"DEL")) S X=^("DEL")
 E  G DD:'$D(^DD(%,X,8.5)) S X=^(8.5)
 G DD:X="" F %=1:1:$L(X) G DD:DUZ(0)[$E(X,%)
DAR D  ;**CCO/NI "DELETE ACCESS REQUIRED"   thru next 5 lines
 .N IN,OUT
 .S IN(1)=$$LABEL^DIALOGZ(DP,DIFLD),IN(2)=$$FILENAME^DIALOGZ(DP)
 .D BLD^DIALOG(712,.IN,,"OUT"),EN^DDIOL(.OUT)
X I $D(DB(DQ)) D N G A
 W:$D(^DD("KEY","F",DP,D))!(DV["R")&'$D(DIER) "  ",$$EZBLD^DIALOG(8041) G R ;This is a required response. Enter '^' to exit
 ;
 ;
DD G MD:DV S DH=0,DU=0 F  S DH=$O(^DD(DP,D,"DEL",DH)) Q:DH=""  I $D(^(DH,0)) X ^(0) Q:$D(DTOUT)  G X:$T ;IF SWITCH ON MEANS NO DELETION ALLOWED
CC ;CONSISTENCY CHECK WOULD GO HERE
 S DH=-1,X=DQ(DQ) I Y,$E(@(DIE_"0)"))'=U S X=^(0)
 D D G R:X I Y D FIREREC(DP) S X=DE(DQ) D DEL:$D(DIU(0)) K DE,DG,DQ,DB S DIK=DIE D ^DIK S Y=0 K:DL<2 DA Q
S S X="",DG($P(DQ(DQ),U,4))="" D:'$G(DIEZFLAG) LOADXR^DIED
A S Y=1 Q
 ;
D I $D(DB(DQ)) S X=0 Q
 W $C(7),!?3,"SURE YOU WANT TO DELETE"
 I Y W " THE ENTIRE " W:DV'["D"&(DV'["P")&(DV'["V") "'"_DE(DQ)_"' " W $P(X,U,1)
 S %=0,X=0 D YN^DICN Q:%=1  S X=1 W:$X>55 !?9
N I $D(DE(DQ))#2,'$D(DDS) W:'$D(ZTQUEUED) $C(7),"  <NOTHING DELETED>"
 Q
 ;
MD G X:DV["R"&($P(DC,U,5)=1) S DH=0,DU=0 F  S DH=$O(^DD(+$P(DC,U,2),.01,"DEL",DH)) Q:DH=""  I $D(^(DH,0)) D DDA X ^(0) D UDA G X:$T
 S DH=-1,Y=DC>1,X=$E(DQ(DQ),8,99) D D
 I 'X D DDA D FIREREC(+$P(DC,U,2)) S DIK=DIC D ^DIK,UDA K DE(DQ) S X=$P(@(DIK_"0)"),U,3,4),DC=$P(DC,U,1,3)_U_X,DIC=DIE S:$D(^(+X,0)) DE(DQ)=$P(^(0),U,1)
R S Y=2 Q
 ;
DDA N T,X
 S T=$T
 F X=+$O(DA(" "),-1):-1:1 K DA(X+1) S:$D(DA(X))#2 DA(X+1)=DA(X)
 S:$D(DA)#2 DA(1)=DA
 S DIC=DIE_DA_","""_$P(DC,U,3)_""",",DA=$P(DC,U,4)
 S:$D(DIETMP)#2 DIIENS=DA_","_DIIENS
 I T
 Q
 ;
UDA N T,X
 S T=$T
 S DA=$G(DA(1)) ;K DA(1)
 F X=2:1:+$O(DA(" "),-1) I $D(DA(X))#2 S DA(X-1)=DA(X) K DA(X)
 S:$D(DIETMP)#2 DIIENS=$P(DIIENS,",",2,999)
 I T
 Q
QS ;
 G ^DIEQ
QQ ;
 G QQ^DIEQ
 Q
DEL I '$S($D(^VA(200,"AFOF",DA)):1,1:$D(^DIC(3,"AFOF",DA))) Q
 S DA(1)="",DIFOF=DA
 F P=0:0 S DA(1)=$S($D(^VA(200,"AFOF")):$O(^VA(200,"AFOF",DA,DA(1))),1:$O(^DIC(3,"AFOF",DA,DA(1)))) Q:'DA(1)  I $S($D(^VA(200,DA(1),"FOF",DA)):1,1:$D(^DIC(3,DA(1),"FOF",DA))) S DIK=$S($D(^VA(200)):"^VA(200,",1:"^DIC(3,")_DA(1)_",""FOF""," D ^DIK
 K DA S DA=DIFOF K DIFOF
 Q
V ;
 G ^DIE3
 ;
FIREREC(DIFILE) ;Fire record-level xrefs accumulated in ^TMP for file
 ;or subfile DIFILE and all its subfiles
 G:$G(DIEZFLAG) FIRERECZ
 Q:$D(DIETMP)[0
 Q:$D(@DIETMP@("R"))<2
 ;
 ;If we're at top level, fire all accumulated record-level xrefs
 N X,Y
 I '$G(^DD(DIFILE,0,"UP")) D FIREREC^DIE1 Q
 ;
 ;Save the DA array and DIIENS
 N DASV,DIIENSSV
 M DASV=DA S DIIENSSV=DIIENS
 ;
 ;Get list of subfiles under DIFILE
 N DA,DIE,DIFLIST,DIIENS,DIPAT,DP
 D SUBFILES^DIKCU(DIFILE,.DIFLIST)
 S DIFLIST(DIFILE)=""
 S DIPAT=".E1"""_DIIENSSV_""""
 ;
 ;Fire record-level cross references DIFILE and its subfiles
 S DP=0 F  S DP=$O(DIFLIST(DP)) Q:'DP  D
 . Q:'$D(@DIETMP@("R",DP))
 . S DIIENS=" " F  S DIIENS=$O(@DIETMP@("R",DP,DIIENS)) Q:DIIENS=""  D
 .. Q:DIIENS'?@DIPAT
 .. S DIE=@DIETMP@("R",DP,DIIENS)
 .. D DA^DILF(DIIENS,.DA)
 .. D FIRE^DIKC(DP,.DA,"KS",$NA(@DIETMP@("R")),"F")
 .. K @DIETMP@("R",DP,DIIENS),@DIETMP@("V",DP,DIIENS)
 . K:'$D(@DIETMP@("V",DP)) @DIETMP@("R",DP)
 Q
 ;
FIRERECZ ;Come here from FIREREC above, for compiled templates
 Q:'$D(DIEZRXR)
 ;
 ;If we're at top level, fire all accumulated record-level xrefs
 N X,Y
 I '$G(^DD(DIFILE,0,"UP")) D FIREREC^DIE17 Q
 ;
 ;Save the DA array and DIIENS
 N DASV,DIIENSSV
 M DASV=DA S DIIENSSV=DIIENS
 ;
 ;Get list of subfiles under DIFILE
 N DA,DIE,DIEZXR,DIFLIST,DIIENS,DIPAT,DP
 D SUBFILES^DIKCU(DIFILE,.DIFLIST)
 S DIFLIST(DIFILE)=""
 S DIPAT=".E1"""_DIIENSSV_""""
 ;
 ;Fire record-level cross references DIFILE and its subfiles
 S DP=0 F  S DP=$O(DIFLIST(DP)) Q:'DP  D
 . Q:'$D(DIEZRXR(DP))
 . S DIIENS=" " F  S DIIENS=$O(DIEZRXR(DP,DIIENS)) Q:DIIENS=""  D
 .. Q:DIIENS'?@DIPAT
 .. S DIE=DIEZRXR(DP,DIIENS)
 .. D DA^DILF(DIIENS,.DA)
 .. S DIEZXR=0 F  S DIEZXR=$O(DIEZRXR(DP,DIEZXR)) Q:DIEZXR'=+DIEZXR  D
 ... D:$D(DIEZAR(DP,DIEZXR))#2 @DIEZAR(DP,DIEZXR)
 .. K DIEZRXR(DP,DIIENS),@DIETMP@("V",DP,DIIENS)
 . K:'$D(@DIETMP@("V",DP)) DIEZRXR(DP)
 Q

DIE3
DIE3 ;SFISC/XAK-PROCESS SINGLE-VALUED VARIABLE PNTR ;03:06 PM  14 Feb 2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
V ;
 S DIEX=X ;I $D(DNM) S DIDS=D
 G ALL:X'["." S DIVP=$P(X,"."),X=$P(X,".",2,999),Y=-1,A9=1 I X="" G Q
 I DIVP]"",$D(^DD(DP,DIFLD,"V","P",DIVP)) D FND G Q
 I DIVP="" G ALL
 S X="" F %=0:0 S X=$O(^DD(DP,DIFLD,"V","M",X)) Q:X=""  I $P(X,DIVP)="" S DIVP=X,X=$P(DIEX,".",2,999) D FND G Q:Y>0 S X=$P(DIEX,".")
 F DIVP=0:0 S DIVP=$O(^DD(DP,DIFLD,"V",DIVP)) Q:+DIVP'>0  I $D(^(DIVP,0)) S DIVPDIC=^(0) I $D(^DIC(+DIVPDIC,0)) S %=$P(^(0),U) I $P(%,$P(DIEX,"."))="" S X=$P(DIEX,".",2,999) D DIC G Q:Y>0 S X=$P(DIEX,".")
 I A9 S X=DIEX,A9=0 G ALL
 G Q
 ;
ALL F DIVP1=0:0 S DIVP1=$O(^DD(DP,DIFLD,"V","O",DIVP1)) Q:+DIVP1'>0  S DIVP=DIVP1 D FND Q:Y>0  S X=DIEX
 G Q
 ;
FND S DIVP=+$O(^(DIVP,0)) I $D(^DD(DP,DIFLD,"V",DIVP,0)) S DIVPDIC=^(0) D DIC
 I Y>0 S A9=0
 Q
 ;
DIC I '$D(^DIC(+DIVPDIC,0,"GL")) S Y=-1 Q
 I $D(DIC("V")) S Y=DIVP,Y(0)=DIVPDIC X DIC("V") I '$T K Y S Y=-1 Q
 N DIVPSEL S DIVPSEL(0)=0
 I $D(DIVP1),'$D(DB(DQ)),'$G(DIQUIET) D H1 W:'$D(DDS) !
 S DIC=^DIC(+DIVPDIC,0,"GL"),DIC(0)="MD"_$E("E",'$D(DB(DQ))&'$D(DIR("V")))_$E("L",$P(DIVPDIC,U,6)="y")_$E("Z",$D(DDS)) I $P(DIVPDIC,U,5)="y",$D(^DD(DP,DIFLD,"V",DIVP,1)),^(1)]"" X ^(1)
 I $D(DIR)=10,'$D(DDS) S DIC(0)=$P(DIC(0),"L")_$P(DIC(0),"L",2)
 D PTRIX S X=+Y_";"_$E(DIC,2,99) K:Y<0 X S %=1
 I Y>0,'DIVPSEL(0),'$D(DB(DQ)),'$P(Y,U,3),'$$CHKO,'$G(DIQUIET) D S1 ; 22*123
 D  Q
 .N DICV
 .I $D(DIC("V")) S DICV=DIC("V")
 .K DIC S DIC=DIE S:$D(DICV) DIC("V")=DICV
 .Q
 ;
S1 S A1="Q",DST=%_U_"        ...OK" D S S:%'=1 Y=-1 Q
 ;
H S DDH=$S($D(DDH):DDH+1,1:1),DDH(DDH,A1)=DST K DST Q
 ;
H1 ;also called by DICM3
 W:'$D(DDS) !
EGP S A1="T",DST=$$EZBLD^DIALOG(8070,$$FILENAME^DIALOGZ(+DIVPDIC)) ;** 'SEARCHING FOR A ...'
S I $D(DDS) D H S DDD=1 D ^DDSU K DDD G QS
 I A1["T" W !,DST G QS
 I A1["Q" S %=+$P(DST,U,1) W !,$P(DST,U,2) D YN^DICN G QS
 I A1["X" X DST
QS K A1,DST Q
 ;
Q K A1,DIVP1,DIVP,DIVPDIC,A9
 I $D(DNM) G:Y>0 @("V^"_DNM) S X=DIEX K DIEX G X^DIE17:'$D(DB(DQ)),B^DIE17
 K DIEX Q:$D(DIR)  G V^DIED:Y>0,X^DIED:'$D(DB(DQ)),B^DIE1
 ;
PTRIX ;Check for DIC("PTRIX"); do appropriate ^DIC call
 K DIC("PTRIX"),D
 M DIC("PTRIX")=DIE("PTRIX")
 ;
 S D=$G(DIE("PTRIX",DP,DIFLD,+DIVPDIC))
 I $P(DIVPDIC,U,6)="y",(U_D_U)'["^B^" S D=D_"^B"
 ;
 I $G(D)]"",$P(D,U,2)="" S DIC(0)=$TR(DIC(0),"M")
 E  S:DIC(0)'["M" DIC(0)="M"_DIC(0)
 ;
 I $P($G(D),U)="" D
 . K D D ^DIC
 E  I $P(D,U,2)]"" D
 . D MIX^DIC1
 E  D IX^DIC
 K DIC("PTRIX")
 Q
 ;
CHKO() ; New with 22*123.  Check for 'O' (Ask 'OK')
 ; Backwards compatibility check
 I $P(^DIC(+DIVPDIC,0),U,2)["O" Q 1
 ; If $P#2 of the File Header ["O" then Quit True
 Q $P(@(^DIC(+DIVPDIC,0,"GL")_"0)"),U,2)["O"
 ;#8070  Searching for a |filename|

DIE9
DIE9 ;SFISC/GFT-JUMPING, FILING, MULTIPLES ;8:03 AM  13 Aug 1997
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G:$A(X)-94 X:'$P(DW,";E",2),@("T^"_DNM)
 I $D(DIE("NO^")),DIE("NO^")="OUTOK"'&(X=U) W $C(7),!?3,"Sorry, ""^"" is not allowed!" G B
 S X=$P(X,U,2),DIC(0)="E"
OUT I 0[X S DM=DW D FILE G ABORT:DL=1,R
 I X?1"@".N,$D(^DIE("AF",X,DIEZ)) S DNM=^(DIEZ)
 E  S DIC="^DD("_DP_",",DIC("S")="I $D(^DIE(""AF"","_DP_",Y,DIEZ))" D ^DIC K DIC S DIC=DIE G X:Y<0 S DNM=^DIE("AF",DP,+Y,DIEZ)
 D FILE S Y=DNM,DNM=$P(Y,U,2),DQ=+Y,D=0 D @("DE^"_DNM) G @Y
 ;
F ;
 S DC=$S($D(X)#2:X,1:0) D FILE S X=DC Q
FILE ;
 K DQ Q:$D(DG)<9  S DQ="",DU=-2,DG="$D("_DIE_DA_",DU))"
Y S DQ=$O(DG(DQ)),DW=$P(DQ,";",2) G DE:$P(DQ,";",1)=DU
 I DU'<0 S ^(DU)=DV,DU=-2
 G E1:DQ="" S DU=$P(DQ,";",1),DV="" I @DG S DV=^(DU)
DE I 'DW S DW=$E(DW,2,99),DE=DW-$L(DV)-1,%=$P(DW,",",2)+1,X=$E(DV,%,999),DV=$E(DV,0,DW-1)_$J("",$S(DE>0:DE,1:0))_DG(DQ) S:X'?." " DV=DV_$J("",%-DW-$L(DG(DQ)))_X G Y
PC S $P(DV,U,DW)=DG(DQ) G Y
 ;
IX I $D(DE(DE(DQ)))#2 F DG=1:1 Q:'$D(DE(DQ,DG))  S DIC=DIE,X=DE(DE(DQ)) X DE(DQ,DG,2)
 S X="" I DG(DQ)]"" F DG=1:1 Q:'$D(DE(DQ,DG))  S DIC=DIE,X=DG(DQ) X DE(DQ,DG,1)
K K DE(DQ)
E1 S DQ=$O(DE(" ")) I DQ'="" G IX:$D(DG(DQ)),K
 K DG,DE,DIFLD S DQ=0 Q
 ;
AST S E=DQ(DQ),Y=$F(E," D ^DIC"),%=8
 I 'Y S Y=$F(E," D IX^DIC"),%=10 G V^DIED:'Y
 S %DD=Y+1 X $P($E(E,1,Y-%),U,5,99) G V^DIED:'$D(DIC("S"))
 S DICSS=DIC("S") D ^DIC S X=+Y
 I $P(Y,U,3) S Y=+Y X:$D(@(DIC_Y_",0)")) DICSS I '$T S D=DA,DA=Y,DIK=DIC D ^DIK K DICSS S DA=D,DV=$P(E,U,2),DU=$P(E,U,3) G X^DIED
 K DICSS X:Y>0 $E(E,%DD,999) K %DD G X^DIED:'$D(X),X^DIED:X<0,Z^DIED
1 ;
 D FILE
R D UP G @("R"_DQ_U_DNM)
 ;
UP S DNM=DNM(DL),DQ=DNM(DL,0),%=2 I $D(DIEC(DL)) D DIEC^DIE1 G U
 S DA=DA(1) K DA(1)
DA I $D(DA(%)) S DA(%-1)=DA(%) K DA(%) S %=%+1 G DA
 S:$D(DIEZTMP)#2 DIIENS=$P(DIIENS,",",2,999)
U K DTOUT,DNM(DL) S DL=DL-1 Q
 ;
X W:'$D(ZTQUEUED) $C(7),"??"
B G @(DQ_U_DNM)
 ;
N D DOWN S DA=$P(DC,U,4),D=0,^DISV(DUZ,$E(DIC,1,28))=$E(DIC,29,999)_DA
D1 S @("D"_(DL-1))=DA G @(DGO)
 ;
M S DD=X D DOWN S DO(2)=$P(DC,"^",2),DO=DOW_"^"_DO(2)_"^"_$P(DC,"^",4,5),DIC(0)=$P("QE",U,'$D(DB(DNM(DL,0))))_"LM" I @("'$D("_DIC_"0))") S ^(0)="^"_DO(2)
 E  I DO(2)["I" S %=0,DIC("W")="" D W^DIC1
 K DICR S D="B",DLAYGO=DP\1,X=DD D X^DIC I Y'>0 D UP G @(DQ_U_DNM)
 S DA=+Y,X=$P(Y,U,2),D=$P(Y,U,3) G D1
 ;
DOWN S DL=DL+1,DNM(DL)=DNM,DNM(DL,0)=DQ D FILE
DDA F %=DL+1:-1:1 I $D(DA(%)) S DA(%+1)=DA(%)
 S DA(1)=DA,DIC=DIE_DA_","""_$P(DC,U,3)_"""," Q
 ;
ABORT D E S Y(DM)="" Q
 ;
0 ;
 D FILE
E K DIP,Y,DE,DB,DP,DW,DU,DC,DV,DH,DIL,DNM,DIEZ,DLB

DIED
DIED ;SFISC/GFT,XAK-MAJOR INPUT PROCESSOR ;3FEB2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
O D W W Y W:$X>48 !?9
 I $L(Y)>19,'DV,DV'["I",(DV["F"!(DV["K")) G RW^DIR2
 I Y]"" W "// " I 'DV,DV["I",$D(DE(DQ))#2 K X S X("FIELD")=DIFLD,X("FILE")=DP,X="  ("_$$EZBLD^DIALOG(3090,$$LABEL^DIALOGZ(DP,DIFLD))_")" W:$L(X)+$X>78 !?9 W X K X S X="" Q  ;**
TR Q:$P(DQ(DQ),U,2)["K"&(DUZ(0)'="@")  R X:DTIME E  S (DTOUT,X)=U W $C(7)
 Q
W I $P(DQ(DQ),U,2)["K"&(DUZ(0)'="@") Q
 I $D(DIE("W")) X DIE("W") Q
 W !?DL+DL-2,$P(DQ(DQ),U,1)_": " Q
 ;
DQ ;
 S:$D(DTIME)[0 DTIME=300 S DQ=1 G B
A K DQ(DQ) S DQ=DQ+1
B S DIFLD=$S($D(DIFLD(DQ)):DIFLD(DQ),1:-1)
 I '$D(DQ(DQ)) G E^DIE1:'$D(DQ(0,DQ)),BR^DIE0
RE ;
 S DIP=$P(DQ(DQ),U,1),DV=$P(DQ(DQ),U,2),DU=$P(DQ(DQ),U,3) G:DV["K"&(DUZ(0)'="@") A G PR:$D(DE(DQ)) D W,TR I $D(DTOUT) K DQ,DG G QY^DIE1
N I X="" G NKEY:$D(^DD("KEY","F",DP,DIFLD)),A:DV'["R",X:'DV,X:$P(DC,U,2)-DP(0),A
RD G ^DIE0:X[U,^DIE2:X="@" I X?."?" G A:$D(DB(DQ)),^DIEQ ;MAC-1201-61253
 I X=" ",DV["d",DV'["P",$D(^DISV(DUZ,"DIE",DIP)) S X=^(DIP) I DV'["D",DV'["S" W "  "_X
T G M^DIE1:DV,^DIE3:DV["V",P:DV'["S" I X?.ANP D SET I 'DDER G V
 K DDER G X
P I DV["P" S DIC=U_DU,DIC(0)=$E("EN",$D(DB(DQ))+1)_"M"_$E("L",DV'["'") S:DIC(0)["L" DLAYGO=+$P(DV,"P",2) G AST:DV["*" D NOSCR S X=+Y,DIC=DIE G X:X<0
 G V:DV'["N" I $L($P(X,"."))>24 K X G Z
 I $P(DQ(DQ),U,5,99)'["$",X?.1"-".N.1".".N,$P(DQ(DQ),U,5,99)["+X'=X" S X=+X
V S DIER=1 X $P(DQ(DQ),U,5,99) K DIER,YS
UNIQ I $P(DQ(DQ),U,2)["U",$D(X),DIFLD=.01 K % M %=@(DIE_"""B"",X)") K %(DA) K:$O(%(0)) X
Z K DIC("S"),DLAYGO I $D(X),X?.ANP,X'=U D LOADXR G:'$$KEYCHK UNIQFERR S DG($P(DQ(DQ),U,4))=X S:DV["d" ^DISV(DUZ,"DIE",DIP)=X G A
X W:'$D(ZTQUEUED) $C(7) W:'$D(DDS)&'$D(ZTQUEUED) "??"
 G B^DIE1
 ;
PR I $D(DE(DQ,0)) S Y=DE(DQ,0) G F:Y?1"/".E I $D(DE(DQ))=10 D Y:$E(Y)=U,O G RD:"@"'[X,A:DV'["R"&(X="@"),X:X="@" S X=Y G N
 S DG=DV,Y=DE(DQ),X=DU I DG["O",$D(^DD(DP,DIFLD,2)) X ^(2) G S
R I DG["P",@("$D(^"_X_"0))") S X=+$P(^(0),U,2) G S:'$D(^(Y,0)) S Y=$P(^(0),U,1),X=$P(^DD(X,.01,0),U,3),DG=$P(^(0),U,2) G R
 I DG["V",+Y,$P(Y,";",2)["(",$D(@(U_$P(Y,";",2)_"0)")) S X=+$P(^(0),U,2) G S:'$D(^(+Y,0)) S Y=$P(^(0),U,1) I $D(^DD(+X,.01,0)) S DG=$P(^(0),U,2),X=$P(^(0),U,3) G R
 X:DG["D" ^DD("DD") I DG["S" S %=$P($P(";"_X,";"_Y_":",2),";") I %]"" S Y=$S($G(DUZ("LANG"))'>1:%,'DIFLD:%,1:$$SET^DIQ(DP,DIFLD,Y))
S D O I $D(DTOUT) K DQ,DG G QY^DIE1
 I X="" S X=DE(DQ) X:$D(DICATTZ) $P(DQ(DQ),U,5,99) G A:'DV,A:DC<2 G N^DIE1
 G RD:DQ(DQ)'["DINUM" D E^DIE0 G RD:$D(X),PR
 ;
F S DB(DQ)=1,X=$E(Y,2,999),DH=$F(DQ(DQ),"%DT=""E") I DH S DQ(DQ)=$E(DQ(DQ),1,DH-2)_$E(DQ(DQ),DH,999)
 I X?1"/".E S X=$E(X,2,999),DH=""
 X:$E(X,1)=U $E(X,2,999) G:X="" A:'DV,A:'$P(DC,U,4),N^DIE1 I $D(DE(DQ))#2,DV["I"!(DQ(DQ)["DINUM") D E^DIE0
 G X:'$D(X),RD:DH]"",RD:X="@",M^DIE1:DV,Z
 ;
Y X $E(Y,2,999) S Y=X I DV["D",Y?7N.NP X ^DD("DD")
Q Q
 ;
SET ;FROM COMPILED TEMPLATES,TOO
 N DIR,DILANG
 I $D(DB(DQ)),'$D(DIQUIET) N DIQUIET S DIQUIET=1
 I $G(DUZ("LANG"))>1,$D(^DD(DP,+$G(DIFLD),0)) S DILANG=$$SETIN^DIALOGZ D
 .I DILANG'=DU S DU=DILANG Q
 .K DILANG
 S DIR(0)="SV"_$E("o",$D(DB(DQ)))_U_DU,DIR("V")=1 S:$D(DIC("S")) DIR("S")=DIC("S") D ^DIR Q:DDER
 I $D(DILANG) S %=$F(";"_DILANG,";"_Y) I % S Y=$P($P($P(^DD(DP,DIFLD,0),U,3),";",Y),":") ;Return the 'REAL' internal value
 S %=Y(0),X=Y
 I $D(^DD(DP,DIFLD,12.1)) X ^(12.1) I $D(DIC("S")) X DIC("S") E  S DDER=1 Q
 W:'$D(DB(DQ)) "  "_%
 Q
 ;
 ;
AST ;G V:DV["'",AST^DIE9
 I DV["'" D
 . D SCRNL(.DICONT)
 E  D SCRL(.DICONT)
 I DICONT="V" K DICONT G V:$D(DNM)[0,@("V^"_DNM)
 I DICONT="X" K DICONT G X:$D(DNM)[0,@("X^"_DNM)
 I DICONT="Z" K DICONT G Z:$D(DNM)[0,@("Z^"_DNM)
 Q
 ;
RW G RW^DIR2
 ;
LOADXR ;Load all index file xrefs for a field
 Q:$D(DIETMP)[0
 N FLIST,RLIST,OLD
 ;
 I $G(DICRREC)]"" N DP,DIFLD,DIIENS S OLD=DIU,DP=DIH,DIFLD=DIG,DIIENS=DICRIENS
 E  S OLD=$G(DE(DQ))
 ;
 ;Get field- and record-level xrefs
 D LOADFLD^DIKC1(DP,DIFLD,"KS","",$NA(@DIETMP@("V")),"DIEFXREF",$NA(@DIETMP@("R")),.FLIST,.RLIST)
 I FLIST="",RLIST="" Q
 S:RLIST]"" @DIETMP@("R",DP,DIIENS)=DIE
 ;
 ;Save the old value of the field
 S @DIETMP@("V",DP,DIIENS,DIFLD,"O")=OLD S:$D(^("F"))[0 ^("F")=OLD
 I $G(DICRREC)="",$G(DE(DQ,0))?1"//".E S @DIETMP@("V",DP,DIIENS,DIFLD,"4/")=""
 E  K @DIETMP@("V",DP,DIIENS,DIFLD,"4/")
 Q
 ;
KEYCHK() ;If this is a key field, return 0 if not unique.
 N DIEKCHK
 Q:$D(DIETMP)[0 1
 Q:'$D(DIEFXREF) 1
 Q:$G(DE(DQ,0))?1"//".E 1
 S @DIETMP@("V",DP,DIIENS,DIFLD,"N")=X
 S DIEKCHK=$$KEYCHK^DIKK2(DP,.DA,DIFLD,"DIEFXREF",DIIENS,"","N")
 K @DIETMP@("V",DP,DIIENS,DIFLD,"N")
 Q DIEKCHK
 ;
UNIQFERR ;The field is part of a key and is not unique
 I '$D(ZTQUEUED),'$D(DDS) D
 . W $C(7)_"??"
 . W:'$D(DB(DQ)) !,"     ",$$EZBLD^DIALOG(3094)
 K DIEFXREF S ^("N")=@DIETMP@("V",DP,DIIENS,DIFLD,"O")
 G B^DIE1
 ;
NKEY ;No value was assigned to this key field
 I '$D(ZTQUEUED),'$D(DDS) W $C(7)_"??  ",$$EZBLD^DIALOG(3092.2)
 G B^DIE1
 ;
NOSCR ;No screen
 N DIXRL
 D GETXRL(DP,DIFLD,+$P(DV,"P",2),.DIXRL)
 I DV'["'",$G(DIXRL)]"",(U_DIXRL_U)'["^B^" S DIXRL=DIXRL_"^B"
 D DIC($G(DIXRL))
 Q
 ;
SCRNL(DICONT) ;Screen, No LAYGO allowed
 N DIFRST,DILAST,DIXRL
 K DICONT
 ;
 D GETXRL(DP,DIFLD,+$P(DV,"P",2),.DIXRL)
 G:$G(DIXRL)="" EXIT
 ;
 D:$D(DNM)#2 @("D^"_DNM)
 D PARSE($P(DQ(DQ),U,5,999),.DIFRST,.DILAST)
 G:'$D(DIFRST) EXIT
 ;
 X DIFRST
 D DIC(DIXRL) S X=+Y
 X:Y>0 DILAST
 S DICONT=$S('$D(X):"X",X<0:"X",1:"Z")
 Q
 ;
SCRL(DICONT) ;Screen, LAYGO allowed
 N DICALL,DICSS,DIFRST,DILAST,DIXRL
 K DICONT
 ;
 D GETXRL(DP,DIFLD,+$P(DV,"P",2),.DIXRL)
 D:$D(DNM) @("D^"_DNM)
 D PARSE($P(DQ(DQ),U,5,999),.DIFRST,.DILAST)
 G:'$D(DIFRST) EXIT
 ;
 K D X DIFRST I '$D(DIC("S")),$G(DIXRL)="" S DICONT="V" Q
 S DICSS=$G(DIC("S"))
 ;
 I $G(DIXRL)="" S DIXRL=$G(D)
 E  S:(U_DIXRL_U)'["^B^" DIXRL=DIXRL_"^B"
 D DIC($G(DIXRL))
 S X=+Y
 ;
 I $P(Y,U,3) S Y=+Y X:$D(@(DIC_Y_",0)")) DICSS E  D  S DICONT="X" Q
 . N DV,DU,DA
 . S DA=Y,DIK=DIC D ^DIK
 ;
 X:Y>0 DILAST
 S DICONT=$S('$D(X):"X",X<0:"X",1:"Z")
 Q
 ;
EXIT ;Cleanup and set flag to continue by executing the input transform
 K DIC("PTRIX")
 S DICONT="V"
 Q
 ;
DIC(D) ;Make the appropriate ^DIC call based on D
 I $G(D)]"",$P(D,U,2)="" S DIC(0)=$TR(DIC(0),"M")
 E  S:DIC(0)'["M" DIC(0)="M"_DIC(0)
 ;
 I $P($G(D),U)="" D
 . D ^DIC
 E  I $P(D,U,2)]"" D
 . D MIX^DIC1
 E  D IX^DIC
 K DIC("PTRIX")
 Q
 ;
PARSE(IT,FRST,LAST) ;Parse input transform
 N CALL,I
 F CALL=" D ^DIC"," D IX^DIC"," D MIX^DIC1","" Q:IT[CALL
 I CALL="" K FRST,LAST Q
 S FRST=$P(IT,CALL),LAST=$P(IT,CALL_" ",2,999)
 I FRST?.E1" " D  S FRST=$E(FRST,1,I)
 . F I=$L(FRST)-1:-1:0 Q:$E(FRST,I)'=" "
 Q
 ;
GETXRL(FIL,FLD,PFIL,LIST) ;Get list of indexes from DIE("PTRIX")
 K DIC("PTRIX"),LIST Q:'$D(DIE("PTRIX"))
 M DIC("PTRIX")=DIE("PTRIX")
 ;
 S LIST=$G(DIE("PTRIX",FIL,FLD,PFIL))
 K:LIST="" LIST
 Q

DIEF
DIEF ;SFISC/DPC-FILER DRIVER ;16FEB2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FILE(DIEFFLAG,DIEFAR,DIEFOUT,DIEFADAR) ;
FILEX ;
 N DIEFF,DIEFCNOD,DIEFNODE,DIEFSPOT,DIEFDAS,DIEFIEN,DIEFRFLD,DIEFFLD,DIEFFVAL,DIEFOVAL,DIEFNVAL,DIEFTSRC,DIEFLOCK,DIEFECNT
 N DIDATA,DIEFFLST,DIEFFREF,DIEFFXR,DIEFLEV,DIEFRLST,DIEFTMP,DIEFTREF
 S DIEFFLAG=$G(DIEFFLAG)
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 I '$$VERFLG^DIEFU(DIEFFLAG,"ISKEOTU") G OUT
 I DIEFFLAG["T",DIEFFLAG'["E" D BLD^DIALOG(301,DIEFFLAG,DIEFFLAG) G OUT
 I '$$VROOT^DIEFU(DIEFAR) G OUT
 I '($D(@DIEFAR)\10) D BLD^DIALOG(305,DIEFAR,DIEFAR) G OUT
 I DIEFFLAG["K" N DIEFNOLK,DIEFLCKS D LOCK^DIEF1 I DIEFNOLK G OUT
 ;batch conversion to internal and key validation if requested.
 I DIEFFLAG["T" S DIEFECNT=$G(DIERR) D  G:DIEFECNT'=$G(DIERR) OUT
 . S DIEFAR("INT")="^TMP($J,""DIEF"")"
 . D VALS^DIEVS("R"_$E("U",DIEFFLAG["U"),DIEFAR,DIEFAR("INT"))
 . S DIEFAR("EXT")=DIEFAR,DIEFAR=DIEFAR("INT")
 S DIEFTMP=$$GETTMP^DIKC1("DIEF")
 D DRIVER
OUT I $D(DIEFLOCK) D UNLOCK^DIEF1
 I DIEFFLAG'["S",'$G(DIERR) K @$G(DIEFAR("EXT"),DIEFAR)
 I $D(DIEFAR("INT")) K @DIEFAR("INT")
 I $G(DIEFOUT)]"" D CALLOUT^DIEFU(DIEFOUT)
 I $D(DIEFTMP) K @DIEFTMP
 Q
DRIVER ;
 S DIEFF=""
 F  S DIEFF=$O(@DIEFAR@(DIEFF)) Q:DIEFF=""  D
 . I DIEFFLAG'["K",'$$VFILE^DIEFU(DIEFF,"D") Q
 . S DIEFFREF=$$FROOTDA^DIKCU(DIEFF,"D",.DIEFLEV,.DIEFTREF) Q:DIEFFREF=""
 . S DIEFDAS=""
 . F  S DIEFDAS=$O(@DIEFAR@(DIEFF,DIEFDAS)) Q:DIEFDAS=""  D
 . . N D,I,DA,S,DIOPER
 . . S DIEFIEN=DIEFDAS
 . . I ($E(DIEFIEN)="?"!($E(DIEFIEN)="+")),$G(DIEFADAR)]"" D
 . . . I $E(DIEFIEN)="+" S DIOPER="A"
 . . . E  I $E(DIEFIEN,1,2)="?+",@DIEFADAR@($TR($P(DIEFIEN,","),"?+"),0)="+" S DIOPER="A"
 . . . S DIEFIEN=$$ADDCONV^DIEF1(DIEFIEN,DIEFADAR)
 . . S S=" " F  S S=$O(@DIEFTMP@("DEL",DIEFF,S)) Q:S=""  I ","_DIEFIEN?@(".E1"","_S_"""") S DIEFDAS=$C(127) Q
 . . Q:DIEFDAS=$C(127)
 . . I DIEFFLAG'["K" Q:'$$GOODIEN(DIEFF,DIEFIEN,DIEFLEV,"","D")
 . . F I=0:1:DIEFLEV S D="D"_(DIEFLEV-I) N @D S (DA(I),@D)=$P(DIEFIEN,",",I+1)
 . . S DA=DA(0) K DA(0)
 . . S DIDATA=$NA(@DIEFFREF@(DA))
 . . Q:'$$VENTRY(DIEFF,DIEFIEN,"D"_$E(9,DIEFFLAG["E"),DIDATA,DIEFTREF)
 . . N DOREPL S DIEFRFLD="",DOREPL=0
 . . F  S DIEFRFLD=$O(@DIEFAR@(DIEFF,DIEFDAS,DIEFRFLD)) Q:DIEFRFLD=""  D
 . . . N DIEFNG
 . . . S DIEFFLD=$$CHKFLD^DIEFU(DIEFF,DIEFRFLD) I 'DIEFFLD Q
 . . . I DIEFFLD=.001 D BLD^DIALOG(520,".001",".001") Q
 . . . S DIEFNVAL=@DIEFAR@(DIEFF,DIEFDAS,DIEFRFLD)
 . . . I DIEFFLAG["E",DIEFFLAG'["T" D VAL Q:$D(DIEFNG)
 . . . I DIEFFLD=.01,"@"[DIEFNVAL D PT01DEL Q
 . . . S DIEFSPOT=$P(^DD(DIEFF,DIEFFLD,0),U,4)
 . . . S DIEFNODE=$NA(@DIDATA@($P(DIEFSPOT,";")))
 . . . S DIEFSPOT=$P(DIEFSPOT,";",2)
 . . . I DIEFNODE'=$G(DIEFCNOD) D:DOREPL REPLACE S DIEFCNOD=DIEFNODE D RETRIEVE
 . . . I DIEFNVAL="@" S DIEFNVAL=""
 . . . D LOADFLD^DIKC1(DIEFF,DIEFFLD,"KS","",$NA(@DIEFTMP@("V")),"DIEFFXR",$NA(@DIEFTMP@("R")),.DIEFFLST,.DIEFRLST)
 . . . I DIEFFLAG'["T",DIEFFLAG'["U",'$$SKEYCHK^DIEF1(DIEFF,DIEFFLD,DIEFNVAL,.DA,DIEFIEN,.DIEFFXR) K DIEFFXR Q
 . . . D PUTDATA^DIEF1 Q:$D(DIEFNG)
 . . . I DIEFNVAL'=$G(DIEFOVAL) D XRFAUD,FIREFLD
 . . D REPLACE:DOREPL K DIEFCNOD
 . . D FIREREC
 Q
PT01DEL ;
 N DIEFERR
 I DIEFNVAL="" F  S DIEFERR=$O(^DD(DIEFF,.01,"DEL",$G(DIEFERR))) Q:DIEFERR=""  I $D(^(DIEFERR,0)) X ^(0) I  D  G Q
 . N INT,EXT
 . S INT(1)=$$FLDNM^DIEFU(DIEFF,DIEFFLD),INT(2)=$$FILENM^DIEFU(DIEFF),EXT("FILE")=DIEFF,EXT("FIELD")=DIEFFLD
 . D BLD^DIALOG(712,.INT,.EXT) ;"CANNOT BE DELETED"
 S DIEFECNT=$G(DIERR)
 N %,DIC,DIK S DIK=$$OREF^DILF($NA(@DIEFFREF)) D ^DIK
 I DIEFECNT'=$G(DIERR) D HKERR^DILIBF(DIEFF,DIEFIEN,DIEFFLD,"cross reference")
 N SB D SUBFILES^DIKCU(DIEFF,.SB) S SB(DIEFF)=""
 S SB=0 F  S SB=$O(SB(SB)) Q:'SB  S @DIEFTMP@("DEL",SB,DIEFIEN)=""
 S DIEFRFLD=$C(127),DOREPL=0
 K @DIEFTMP@("R"),@DIEFTMP@("V")
Q Q
 ;
VAL ;
 N DIEFTYPE,DIEFINT
 D DTYP^DIOU(DIEFF,DIEFFLD,.DIEFTYPE) Q:DIEFTYPE=5
 D VAL^DIEV(DIEFF,DIEFIEN,DIEFFLD,"U",DIEFNVAL,.DIEFINT)
 I DIEFINT'=U S DIEFNVAL=DIEFINT Q
 S DIEFNG=1
 Q
REPLACE ;
 S @DIEFCNOD=DIEFFVAL,DOREPL=0
 Q
RETRIEVE ;
 S DIEFFVAL=$G(@DIEFCNOD)
 Q
 ;
XRFAUD ;
 I $D(^DD(DIEFF,"IX",DIEFFLD)) D REPLACE:$G(DOREPL),IX,RETRIEVE:$D(DOREPL)
 I $D(^DD(DIEFF,"AUDIT",DIEFFLD)) D AUDIT
 Q
IX ;
 N X,DIEFSORK
 I DIEFOVAL'="" S DIEFSORK=2 D FIRE
 I "@"'[DIEFNVAL S DIEFSORK=1 D FIRE
 Q
FIRE ;
 N DIEFI,DICRREC
 S:$D(DIEFTMP) DICRREC="TRIG^DIEF"
 S DIEFI=0
 F  S DIEFI=$O(^DD(DIEFF,DIEFFLD,1,DIEFI)) Q:DIEFI=""  D
 . N I,Y,DIG,DIH,DIU,DIV,XMB,XMY
 . S X=$S(DIEFSORK=1:DIEFNVAL,1:DIEFOVAL)
 . N DIEFECNT S DIEFECNT=$G(DIERR)
 . X ^(DIEFI,DIEFSORK) ;Naked indicator set in For loop, FIRE+2
 . I DIEFECNT'=$G(DIERR) D HKERR^DILIBF(DIEFF,DIEFIEN,DIEFFLD,"cross reference")
 Q
AUDIT ;
 N X,DP,DG,DIIX N DIANUM,C,Y
 S DP=DIEFF,DG=1
 I DIEFOVAL]"" S X=DIEFOVAL,DIIX="2^"_DIEFFLD D AUDIT^DIET
 I "@"'[DIEFNVAL,(DIEFOVAL]""!(^DD(DIEFF,DIEFFLD,"AUDIT")'="e")) S X=DIEFNVAL,DIIX="3^"_DIEFFLD_$S(DIEFFLD=.01&(DIEFOVAL=""):"^A",1:"") D AUDIT^DIET
 Q
 ;
FIREFLD ;Fire field-level xrefs
 Q:'$D(DIEFTMP)
 I $G(DIEFFLST)]""!($G(DIEFRLST)]"") D
 . S:'$D(@DIEFTMP@("V",DIEFF,DIEFIEN,DIEFFLD,"O")) ^("O")=DIEFOVAL
 ;
 I $G(DIEFFLST)]"" D
 . D:$G(DOREPL) REPLACE
 . D FIRE^DIKC(DIEFF,.DA,"KS","DIEFFXR","O","",$E("C",$G(DIOPER)="A"))
 . D:$D(DOREPL) RETRIEVE
 K DIEFFXR,DIEFFLST
 Q
 ;
FIREREC ;Fire record-level xrefs
 N DIKEY
 D FIRE^DIKC(DIEFF,.DA,"KS",$NA(@DIEFTMP@("R")),"O^"_$S(DIEFFLAG'["T"&(DIEFFLAG'["U"):"^K^N",1:""),.DIKEY,$E("C",$G(DIOPER)="A"))
 D:$D(DIKEY)>9 RESTORE^DIEF1(.DIKEY,DIEFTMP)
 K @DIEFTMP@("R"),@DIEFTMP@("V")
 Q
 ;
GOODIEN(DIEFF,DIEFIEN,DIEFLEV,DA,DIEFFLG) ;
 N ERR,P K DA
 I DIEFIEN[",,"!($E(DIEFIEN)=",") D  Q 0
 . D:$G(DIEFFLG)["D" ERR^DIKCU2(307,"",DIEFIEN)
 I $E(DIEFIEN,$L(DIEFIEN))'="," D  Q 0
 . D:$G(DIEFFLG)["D" ERR^DIKCU2(304,"",DIEFIEN)
 I $L(DIEFIEN,",")-2'=DIEFLEV D  Q 0
 . D:$G(DIEFFLG)["D" ERR^DIKCU2(205,"",DIEFIEN,"",DIEFF)
 S ERR=0 F P=1:1:$L(DIEFIEN,",")-1 D  Q:ERR
 . S DA(P-1)=$P(DIEFIEN,",",P)
 . I DA(P-1)'=+$P(DA(P-1),"E")!(DA(P-1)'>0) D
 .. K DA S ERR=1 D:$G(DIEFFLG)["D" ERR^DIKCU2(308,"",DIEFIEN)
 Q:ERR 0
 S DA=DA(0) K DA(0)
 Q 1
 ;
VENTRY(DIEFF,DIEFIEN,DIEFFLG,DIDATA,DIEFTREF) ;
 S DIEFFLG=$G(DIEFFLG)
 ;
 ;Get root of (sub)record and top level file
 I $G(DIDATA)=""!(DIEFFLG[9&($G(DIEFTREF)="")) D  Q:$G(DIDATA)="" 0
 . N DA,DIEFD,DIEFLEV
 . S DIEFD=$E("D",DIEFFLG["D")
 . S DIDATA=$$FROOTDA^DIKCU(DIEFF,DIEFD,.DIEFLEV,.DIEFTREF) Q:DIDATA=""
 . I '$$GOODIEN(DIEFF,DIEFIEN,DIEFLEV,.DA,DIEFD) S DIDATA="" Q
 . S DIDATA=$NA(@DIDATA@(DA))
 ;
 ;Check null .01
 I $P($G(@DIDATA@(0)),U)="" D  Q 0
 . D:DIEFFLG["D" ERR^DIKCU2(601,DIEFF,DIEFIEN)
 ;
 ;Check -9 node
 I DIEFFLG[9,$D(@DIEFTREF@($P(DIEFIEN,",",$L(DIEFIEN,",")-1),-9)) D  Q 0
 . D:DIEFFLG["D" ERR^DIKCU2(602,DIEFF,DIEFIEN)
 ;
 Q 1
 ;
TRIG ;Called from trigger logic (from DICR via @DICRREC)
 Q:'$D(DIEFTMP)
 N DIEFRLST
 D LOADFLD^DIKC1(DIH,DIG,"KS","",$NA(@DIEFTMP@("V")),"",$NA(@DIEFTMP@("R")),"",.DIEFRLST)
 I $G(DIEFRLST)]"",'$D(@DIEFTMP@("V",DIH,DICRIENS,DIG,"O")) S ^("O")=DIU
 Q

DIEF1
DIEF1 ;SFISC/DPC-FILER UTILITIES ;22MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LOAD(DIEFF,DIEFDAS,DIEFFLD,DIEFFLG,DIEFVAL,DIEFAR,DIEFOUT) ;
LOADX ;
 N DIEFIEN
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 I $G(DIEFDAS)']"" D BLD^DIALOG(202,"IENS","IENS") G OUT
 I $E(DIEFDAS,$L(DIEFDAS))="," S DIEFIEN=DIEFDAS
 E  S DIEFIEN=$$IEN^DIEFU(.DIEFDAS)
 I '$$VROOT^DIEFU(DIEFAR) G OUT
 I '$$VFILE^DIEFU(DIEFF,"D") G OUT
 S DIEFFLD=$$CHKFLD^DIEFU(DIEFF,DIEFFLD) G:'DIEFFLD OUT
 I $G(DIEFFLG)["R",'$$VENTRY^DIEFU(DIEFF,DIEFIEN,"D") G OUT
 S @DIEFAR@(DIEFF,DIEFIEN,DIEFFLD)=DIEFVAL
OUT I $G(DIEFOUT)]"" D CALLOUT^DIEFU(DIEFOUT)
 Q
 ;
FLDNUM(DIEFF,DIEFFDNM) ;
FLDNUMX ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 I '$$VFILE^DIEFU(DIEFF,"D") Q 0
 N DIEFFNUM
 I $D(^DD(DIEFF,"B",DIEFFDNM)) D  Q DIEFFNUM
 . S DIEFFNUM=$O(^DD(DIEFF,"B",DIEFFDNM,""))
 . I $O(^DD(DIEFF,"B",DIEFFDNM,DIEFFNUM)) N P S P(1)=DIEFFDNM,P("FILE")=DIEFF D BLD^DIALOG(505,.P,.P) S DIEFFNUM=0
 N P S P("FILE")=DIEFF,P(1)=DIEFFDNM D BLD^DIALOG(501,.P,.P)
 Q 0
 ;
ADDCONV(DIEFIEN,DIEFADAR) ;
 N I,DIEFNIEN,P
 F I=1:1:$L(DIEFIEN,",")-1 D
 . S P=$P(DIEFIEN,",",I)
 . I P,$E(P)'="+" Q
 . S DIEFNIEN=@DIEFADAR@($TR(P,"+?"))
 . S $P(DIEFIEN,",",I)=DIEFNIEN
 Q DIEFIEN
 ;
PUTDATA ;CODE TO ACTUALLY PUT THE DATA INTO THE NODE BEING EDITED. ALSO SAVES ORIGINAL VALUES. CALLED FROM DIEF.
 I +DIEFSPOT D
 . I DIEFNVAL[U D  Q
 . . S DIEFNG=1
 . . N INT,EXT
 . . S INT(1)=$$FLDNM^DIEFU(DIEFF,DIEFFLD),INT(2)=$$FILENM^DIEFU(DIEFF),EXT("FILE")=DIEFF,EXT("FIELD")=DIEFFLD
 . . D BLD^DIALOG(714,.INT,.EXT)
 . S DIEFOVAL=$P(DIEFFVAL,"^",DIEFSPOT)
 . S $P(DIEFFVAL,"^",DIEFSPOT)=DIEFNVAL,DOREPL=1
 E  I $E(DIEFSPOT)="E" D
 . N FR,TO,OLEN,NLEN
 . S FR=$P($P(DIEFSPOT,"E",2),",",1),TO=$P(DIEFSPOT,",",2)
 . S NLEN=$L(DIEFNVAL)
 . I NLEN-1>(TO-FR) D  Q
 . . S DIEFNG=1
 . . N INT,EXT
 . . S INT(1)=$$FLDNM^DIEFU(DIEFF,DIEFFLD),INT(2)=$$FILENM^DIEFU(DIEFF),EXT("FILE")=DIEFF,EXT("FIELD")=DIEFFLD
 . . D BLD^DIALOG(716,.INT,.EXT)
 . S DIEFOVAL=$E(DIEFFVAL,FR,TO),OLEN=$L(DIEFOVAL)
 . I $E(DIEFFVAL,TO+1,999)="" S $E(DIEFFVAL,FR,TO)=DIEFNVAL
 . E  S $E(DIEFFVAL,FR,TO)=DIEFNVAL_$J("",$S(OLEN>NLEN:OLEN-NLEN,1:0))
 . S DOREPL=1
 E  I DIEFSPOT=0 D
 . I $P($G(^DD(+$P(^DD(DIEFF,DIEFFLD,0),U,2),.01,0)),U,2)["W" D
 . . I '$$VROOT^DIEFU(DIEFNVAL) Q
 . . D PUTWP^DIEFW(DIEFFLAG,DIEFNVAL,DIEFNODE)
 . E  D
 . . N INT,EXT
 . . S (INT(1),EXT(1))="MULTIPLE",EXT("FILE")=DIEFF,EXT("FIELD")=DIEFFLD
 . . D BLD^DIALOG(520,.INT,.EXT)
 . . S DIEFNG=1
 E  I DIEFSPOT=" " D
 . N INT,EXT
 . S (INT(1),EXT(1))="COMPUTED",EXT("FILE")=DIEFF,EXT("FIELD")=DIEFFLD
 . D BLD^DIALOG(520,.INT,.EXT)
 . S DIEFNG=1
 Q
 ;
LOCK ;
 S (DIEFNOLK,DIEFLCKS)=0,DIEFF=""
 F  S DIEFF=$O(@DIEFAR@(DIEFF)) Q:DIEFF=""  D  Q:DIEFNOLK
 . I '$$VFILE^DIEFU(DIEFF,"D") S DIEFNOLK=1 Q
 . S DIEFFREF=$$FROOTDA^DIKCU(DIEFF,"D",.DIEFLEV) Q:DIEFFREF=""
 . S DIEFDAS=""
 . F  S DIEFDAS=$O(@DIEFAR@(DIEFF,DIEFDAS)) Q:DIEFDAS=""  D  Q:DIEFNOLK
 . . N DA
 . . I '$$GOODIEN^DIEF(DIEFF,DIEFDAS,DIEFLEV,.DA,"D") S DIEFNOLK=1 Q
 . . S DIEFLCKS=DIEFLCKS+1
 . . S DIEFLOCK(DIEFLCKS)=$NA(@DIEFFREF@(DA))
 . . D LOCK^DILF(DIEFLOCK(DIEFLCKS)) E  D  ;**147
 . . . S DIEFNOLK=1
 . . . N E S E("FILE")=DIEFF,E("IENS")=DIEFDAS D BLD^DIALOG(110,"",.E)
 Q
UNLOCK ;
 N I
 F I=1:1:DIEFLCKS L -@DIEFLOCK(I)
 Q
 ;
RESTORE(DIKEY,DIEFTMP) ;Restore key fields to pre-edited values
 ;DIKEY(rFile#,key#,iens) = "" : if key is not unique
 ;                        = n  : if key fields not assigned a value
 ;DIKEY(rFile#,key#,iens,file,field) = levdiff : set if field not
 ;                                               assigned a value
 N DIEFDA,DIEKK,DIRFIL,DIFIL,DIFLD,DIFLDI,DIIENS,DIIENSA,DIOLD,DILEVD
 K DIEFDA
 ;
 ;Loop through root files and keys in DIKEY
 S DIRFIL=0 F  S DIRFIL=$O(DIKEY(DIRFIL)) Q:'DIRFIL  D
 . S DIEKK=0 F  S DIEKK=$O(DIKEY(DIRFIL,DIEKK)) Q:'DIEKK  D
 .. Q:$D(^DD("KEY",DIEKK,0))[0
 .. ;
 .. ;Get fields in key
 .. K DIFLD
 .. S DIFLDI=0 F  S DIFLDI=$O(^DD("KEY",DIEKK,2,DIFLDI)) Q:'DIFLDI  D
 ... S DIFLD=$P($G(^DD("KEY",DIEKK,2,DIFLDI,0)),U),DIFIL=$P($G(^(0)),U,2)
 ... Q:'DIFLD!'DIFIL
 ... S DIFLD(DIFIL,DIFLD)=""
 .. ;
 .. ;Loop through records in DIKEY
 .. S DIIENS=" " S DIIENS=$O(DIKEY(DIRFIL,DIEKK,DIIENS)) Q:DIIENS=""  D
 ... ;
 ... ;Generate error if key is not unique
 ... D:DIKEY(DIRFIL,DIEKK,DIIENS)="" ERR740^DIEVK1(DIRFIL,DIEKK,DIIENS)
 ... ;
 ... ;Loop through files/fields in key
 ... S DIFIL=0 F  S DIFIL=$O(DIFLD(DIFIL)) Q:'DIFIL  D
 .... S DIFLD=0 F  S DIFLD=$O(DIFLD(DIFIL,DIFLD)) Q:'DIFLD  D
 ..... Q:$D(^DD(DIFIL,DIFLD,0))[0
 ..... ;
 ..... ;Generate error if key field not assigned a value
 ..... I $D(DIKEY(DIRFIL,DIEKK,DIIENS,DIFIL,DIFLD))#2 D
 ...... S (DILEVD,DIFLD(DIFIL,DIFLD))=+DIKEY(DIRFIL,DIEKK,DIIENS,DIFIL,DIFLD)
 ...... D ERR744^DIEVK1(DIFIL,DIFLD,DIEKK,$P(DIIENS,",",DILEVD+1,999))
 ..... ;
 ..... ;Set the FDA to restore the field to original value
 ..... S DILEVD=DIFLD(DIFIL,DIFLD)
 ..... S:DILEVD="" (DILEVD,DIFLD(DIFIL,DIFLD))=$$FLEVDIFF^DIKCU(DIRFIL,DIFIL)
 ..... S DIIENSA=$P(DIIENS,",",DILEVD+1,999)
 ..... Q:$D(@DIEFTMP@("V",DIFIL,DIIENSA,DIFLD,"O"))[0  S DIOLD=^("O")
 ..... S DIEFDA(DIFIL,DIIENS,DIFLD)=DIOLD
 ;
 D:$D(DIEFDA) FILE^DIEF("U","DIEFDA")
 Q
 ;
SKEYCHK(DIEFF,DIEFFLD,DIEFNVAL,DA,DIEFIEN,DIEFFXR) ;Check simple key
 N DIEFKEY,DIEFK,DIEFKCHK
 Q:'$D(^DD("KEY","F",DIEFF,DIEFFLD)) 1
 I DIEFNVAL="" D NKEY(DIEFF,DIEFFLD,DIEFIEN) Q 0
 Q:'$D(DIEFFXR) 1
 S @DIEFTMP@("V",DIEFF,DIEFIEN,DIEFFLD,"N")=DIEFNVAL
 S DIEFKCHK=$$KEYCHK^DIKK2(DIEFF,.DA,DIEFFLD,"DIEFFXR",DIEFIEN,"DIEFKEY","N")
 K @DIEFTMP@("V",DIEFF,DIEFIEN,DIEFFLD,"N")
 Q:DIEFKCHK 1
 S DIEFK=0 F  S DIEFK=$O(DIEFKEY(DIEFF,DIEFIEN,"K",DIEFK)) Q:'DIEFK  D ERR740^DIEVK1(DIEFF,DIEFK,DIEFIEN)
 Q 0
 ;
NKEY(DIEFF,DIEFFLD,DIEFIEN) ;Generate error message #742
 N DIEFK
 S DIEFK=0 F  S DIEFK=$O(^DD("KEY","F",DIEFF,DIEFFLD,DIEFK)) Q:'DIEFK  D
 . S DIEFK(DIEFK)=""
 S DIEFK=0 F  S DIEFK=$O(DIEFK(DIEFK)) Q:'DIEFK  D ERR742^DIEVK1(DIEFF,DIEFFLD,DIEFK,DIEFIEN)
 Q

DIEFU
DIEFU ;SF/DPC-FILER UTILITIES ;06:42 PM  9 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
INIZE ;
 N %,X,%H,DIE,DICS,DIC,%DT,DIK,%Y,%X,%D,%M,%I
 D DTNOLF^DICRW
 D CLEAN
 Q
CLEAN ;
 K DIRUT,DIROUT,DUOUT,DTOUT
 K ^TMP("DIERR",$J),^TMP("DIMSG",$J),^TMP("DIHELP",$J)
 K DIERR,DIHELP,DIMSG
 Q
 ;
CALLOUT(DIOUTAR) ;
 I '$$VROOT(DIOUTAR) Q
 I $D(DIERR) D
 . S @DIOUTAR@("DIERR")=DIERR
 . M @DIOUTAR@("DIERR")=^TMP("DIERR",$J)
 . K ^TMP("DIERR",$J)
 . Q
 I $D(DIHELP) D
 . S @DIOUTAR@("DIHELP")=DIHELP
 . M @DIOUTAR@("DIHELP")=^TMP("DIHELP",$J)
 . K ^TMP("DIHELP",$J)
 . Q
 I $D(DIMSG) D
 . S @DIOUTAR@("DIMSG")=DIMSG
 . M @DIOUTAR@("DIMSG")=^TMP("DIMSG",$J)
 . K ^TMP("DIMSG",$J)
 . Q
 Q
 ;
IEN(DIEFDA) ;
IENX ;
 I '$D(DIEFDA) Q 0
 N I,DIEFIEN S (I,DIEFIEN)="",DIEFDA(0)=$G(DIEFDA)
 F  S I=$O(DIEFDA(I)) Q:I=""  S DIEFIEN=DIEFIEN_DIEFDA(I)_","
 K DIEFDA(0)
 Q DIEFIEN
 ;
DA(DAIEN,DATARG) ;
DAX ;
 K DATARG N I
 F I=1:1:$L(DAIEN,",")-1 S DATARG(I-1)=$P(DAIEN,",",I)
 I $D(DATARG(0)) S DATARG=DATARG(0) K DATARG(0)
 Q
 ;
VROOT(DIEFAR) ;
 I DIEFAR'["(" Q 1
 I $E(DIEFAR,$L(DIEFAR))=")",$F(DIEFAR,")")>($F(DIEFAR,"(")+1) Q 1
 D BLD^DIALOG(202,"array root")
 Q 0
 ;
VFILE(F,FLAG) ;
VFILEX ;
 I $P($G(^DD(F,.01,0)),U,2)]"",$P(^(0),U,2)'["W" Q 1
 I $G(FLAG)["D" N P S P("FILE")=F D BLD^DIALOG(401,.P,.P)
 Q 0
 ;
VENTRY(DIEFF,DIEFIEN,DIEFFLG) ;
 N DIEFROOT,DIEFDA
 S DIEFFLG=$G(DIEFFLG),DIEFDA=$P(DIEFIEN,",")
 S DIEFROOT=$$ROOT^DIQGU(DIEFF,DIEFIEN,1,$S(DIEFFLG["D":1,1:0)) Q:DIEFROOT="" 0
 I $P($G(@DIEFROOT@(DIEFDA,0)),"^",1)="" D  Q 0
 . I DIEFFLG["D" N DIEFP S DIEFP("FILE")=DIEFF,DIEFP("IENS")=DIEFIEN D BLD^DIALOG(601,"",.DIEFP)
 I DIEFFLG["9" Q:'$$VMINUS9(DIEFF,DIEFIEN,DIEFFLG) 0
 Q 1
 ;
VMINUS9(DIEFF,DIEFIEN,DIEFFLG) ;
 N DIEFTOP,DIEFROOT S DIEFFLG=$G(DIEFFLG)
 S DIEFTOP=$P(DIEFIEN,",",$L(DIEFIEN,",")-1),DIEFROOT=$$ROOT^DIQGU($$FNO^DILIBF(DIEFF),.DIEFTOP,1,$S(DIEFFLG["D":1,1:0))
 Q:DIEFROOT="" 0
 I $D(@DIEFROOT@(DIEFTOP,-9)) D  Q 0
 . I DIEFFLG["D" N DIEFP S DIEFP("FILE")=DIEFF,DIEFP("IENS")=DIEFIEN D BLD^DIALOG(602,"",.DIEFP)
 Q 1
 ;
CHKFLD(DIEFF,DIEFFLD) ;
 I DIEFFLD'=+DIEFFLD S DIEFFLD=$$FLDNUM^DIEF1(DIEFF,DIEFFLD) Q:'DIEFFLD 0
 I '$$VFIELD(DIEFF,DIEFFLD,"D") Q 0
 Q DIEFFLD
 ;
VFIELD(F,FLD,FLAG) ;
VFIELDX ;
 I $D(^DD(F,FLD)) Q 1
 I $G(FLAG)["D" N P S (P(1),P("FIELD"))=FLD,P("FILE")=F D BLD^DIALOG(501,.P,.P)
 Q 0
 ;
DT(DIEFDT,DIEFX,DIEFY,DIEFDT0,DIOUTAR) ;
DTX ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE
 N %DT,X,Y
 S DIEFDT=$G(DIEFDT)
 I $G(DIEFX)="" D BLD^DIALOG(202,"date being converted") G DTOUT
 I '$$VERFLG^DIEFU(DIEFDT,"FMNPRSTXEeI") G DTOUT
 I DIEFX?."?" D DT^DIEH1(DIEFDT) S DIEFY=-1 G DTOUT
 S %DT=DIEFDT,X=DIEFX S:$G(DIEFDT0)]"" %DT(0)=DIEFDT0 D ^%DT S DIEFY=Y
 I DIEFY=-1 D:DIEFDT'["e"  G DTOUT
 . N DIEFP
 . S DIEFP(1)=DIEFX,DIEFP(2)="date/time"
 . D BLD^DIALOG(330,.DIEFP,.DIEFP)
 I DIEFDT["E" D DD^%DT S DIEFY(0)=Y
DTOUT I $G(DIOUTAR)]"" D CALLOUT^DIEFU(DIOUTAR)
 Q
 ;
VERFLG(FLG,GDFLGS) ;
 N EI
 S EI=$TR(FLG,GDFLGS,"")
 I EI="" Q 1
 D BLD^DIALOG(301,EI,EI)
 Q 0
 ;
XA(DIEFF,DIEFIEN,DIEFFLD,DIEFNVAL,DIEFOVAL) ;
 N DA,DIEFCNOD,DOREPL
 S DIEFNVAL=$G(DIEFNVAL),DIEFOVAL=$G(DIEFOVAL)
 Q:DIEFNVAL=DIEFOVAL
 D DA(DIEFIEN,.DA)
 D XRFAUD^DIEF
 Q
 ;
FILENM(F) ;
 N NM
 S NM=$$FILENAME^DIALOGZ($$FNO^DILIBF(F)) ;**CCO/NI GET FILE NAME
 ;I NM="" <DO ERROR>
 Q NM
 ;
FLDNM(F,FLD) ;
 N NM,UP
 S NM=$$LABEL^DIALOGZ(F,FLD) ;**CCO/NI GET FIELD LABEL
 F  S UP=$G(^DD(F,0,"UP")) Q:'UP  D
 . S NM=NM_" in "_$P($G(^DD(F,0)),U,1)
 . S F=UP
 . Q
 ;I NM="" <DO ERROR>
 Q NM

DIEFW
DIEFW ;SFISC/DPC-FILER WP ;22MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
WP(DIEFF,DIEFIEN,DIEFFLD,DIEFWPFL,DIEFTSRC,DIEFOUT) ;(FILE,IENS,FIELD,FLAGS,wp_root,msg_root)
WPX ;
 S DIEFWPFL=$G(DIEFWPFL)
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 I DIEFIEN']"" D BLD^DIALOG(202,"IENS","IENS") G OUT
 I '$$VERFLG^DIEFU(DIEFWPFL,"AZK") G OUT
 I "@"'[DIEFTSRC I '$$VROOT^DIEFU(DIEFTSRC) G OUT
 I '$$VFILE^DIEFU(DIEFF,"D") G OUT
 I '$$VFIELD^DIEFU(DIEFF,DIEFFLD,"D") G OUT
 I $P($G(^DD(+$P(^DD(DIEFF,DIEFFLD,0),U,2),.01,0)),U,2)'["W" N EI S EI("FILE")=DIEFF,EI("FIELD")=DIEFFLD D BLD^DIALOG(726,.EI,.EI) G OUT
 I '$$VENTRY^DIEFU(DIEFF,DIEFIEN,"D") G OUT
 N DIEFNODE,DIEFSPOT S DIEFSPOT=" " D GLRF^DIOU(DIEFF,DIEFFLD,.DIEFNODE,.DIEFSPOT)
 N DEPTH,I,D
 S DEPTH=$L(DIEFIEN,",")-1
 F I=DEPTH:-1:1 S D="D"_(DEPTH-I) N @D S @D=$P(DIEFIEN,",",I)
 K DEPTH,D,I
 N DIEFLOCK I DIEFWPFL["K" D  G:'$D(DIEFLOCK) OUT
 . S DIEFLOCK=DIEFNODE
 . D LOCK^DILF(DIEFLOCK) E  D  ;**147
 . . K DIEFLOCK
 . . N EXT S EXT("FILE")=DIEFF,EXT("IENS")=DIEFIEN D BLD^DIALOG(110,"",.EXT)
 D PUTWP(DIEFWPFL,DIEFTSRC,DIEFNODE)
 I $D(DIEFLOCK) L -@DIEFLOCK
OUT I $G(DIEFOUT)]"" D CALLOUT^DIEFU(DIEFOUT)
 Q
 ;
PUTWP(DIEFWPFL,DIEFTSRC,DIEFNODE) ;
 N BEGIN D WP^DIET(DIEFF,DIEFFLD,DIEFIEN,DIEFNODE)
 I "@"[DIEFTSRC K @DIEFNODE Q
 I '($D(@DIEFTSRC)\10) D BLD^DIALOG(305,DIEFTSRC,DIEFTSRC) Q
 I $G(DIEFWPFL)'["A" S BEGIN=1 K @DIEFNODE
 E  S BEGIN=$$NUMLNS(DIEFNODE)+1 K:BEGIN=1 @DIEFNODE
 I $D(@DIEFTSRC@($O(@DIEFTSRC@(0)),0))#2 S DIEFWPFL=$G(DIEFWPFL)_"Z"
 N LINECNT,INLINE S INLINE=0
 F LINECNT=BEGIN:1 S INLINE=$O(@DIEFTSRC@(INLINE)) Q:INLINE'=+$P(INLINE,"E")  D
 . I $G(DIEFWPFL)'["Z" S @DIEFNODE@(LINECNT,0)=$G(@DIEFTSRC@(INLINE))
 . E  S @DIEFNODE@(LINECNT,0)=$G(@DIEFTSRC@(INLINE,0))
 S LINECNT=LINECNT-1
 S @DIEFNODE@(0)=U_U_LINECNT_U_LINECNT_U_DT
 Q
 ;
NUMLNS(DIWPROOT) ;
 N DIWPLN
 S DIWPLN=$P($G(@DIWPROOT@(0)),U,3)
 Q:DIWPLN DIWPLN
 S DIWPLN=$O(@DIWPROOT@(""),-1)
 Q +DIWPLN

DIEH
DIEH ;SFISC/STAFF-HELP ;13APR2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GET(DIEHF,DIEHIEN,DIEHFLD,DIEHFLG,DIEHOUT) ;
GETX ;
 N DIEHZ,DIEHD,DIEHEXIT,DIEHPF,DIEHUFLG
 S DIEHUFLG=$G(DIEHFLG)
 I '$G(DIQUIET) N DIQUIET S DIQUIET=1
 I '$G(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 I $G(DIEHIEN)]"" N DA,C,D,I D DA^DIEFU(DIEHIEN,.DA) S C=$L(DIEHIEN,",")-1 F I=1:1:C S D="D"_(C-I) N @D S @D=$P(DIEHIEN,",",I)
 S DIEHZ=$$ZERO(DIEHF,DIEHFLD) I DIEHZ=0 G GETOUT
 S DIEHD=$P(DIEHZ,U,2)
 D BLDFLGS G:$G(DIEHEXIT) GETOUT
 I DIEHD["P" S DIEHPF=+$P(DIEHD,"P",2)
 S DIHELP=+$O(^TMP("DIHELP",$J,""),-1)
 I DIEHUFLG["F",DIEHFLD=.01 D PXREFS(DIEHF,DIEHFLD)
 I DIEHUFLG["H" D HPROMPT(DIEHF,DIEHFLD)
 I DIEHUFLG["X" D XHLP(DIEHF,DIEHFLD)
 I DIEHUFLG["D" D DESCR(DIEHF,DIEHFLD)
 I DIEHUFLG["P" D SCRNDES(DIEHF,DIEHFLD)
 I DIEHUFLG["C" D SCRNDES(DIEHF,DIEHFLD)
 I DIEHUFLG["T" N DIEHDT S DIEHDT=$P($P($P(DIEHZ,U,5,99),"%DT=""",2),"""",1)  D DT^DIEH1(DIEHDT)
 I DIEHUFLG["S" D SCRNCD(DIEHF,DIEHFLD,DIEHZ)
 I DIEHUFLG["U" D UNSCRNCD(DIEHZ)
 I DIEHUFLG["V" D VPMSG(DIEHF,DIEHFLD)
 I DIEHUFLG["B",DIEHUFLG'["b" D BLD^DIALOG(9115)
 I DIEHUFLG["M" D BLD^DIALOG(9116)
 I DIEHUFLG["G",DIEHFLG'["g",$G(DIEHPF) D FOLLOW(DIEHPF,DIEHFLG)
 I '$G(DIHELP) K DIHELP
GETOUT I $D(DIEHOUT) D CALLOUT^DIEFU(DIEHOUT)
 Q
 ;
BLDFLGS ;
 N A1,A2,C1,C2,DIEHGFLG
 S C1="HX",C2="XD",(A1,A2)=""
 I DIEHD S DIEHF=+DIEHD,DIEHFLD=.01,DIEHD=$P(^DD(DIEHF,.01,0),U,2)
 I DIEHD["W" S (A1,A2)="HD"
 E  I DIEHD["D" S (A1,A2)="T"
 E  I DIEHD["S" S A1="CS",A2="S",DIEHGFLG="U"
 E  I DIEHD["P" S A1="PG",A2="G",DIEHGFLG="F"
 E  I DIEHD="V" S A1="VB",A2="VMB"
 I DIEHFLD=.01,'$D(^DD(DIEHF,0,"UP")) S A1=A1_"F",A2=A2_"F"
 I DIEHUFLG'["r",'$$VERFLG^DIEFU(DIEHUFLG,"bgA?"_C1_C2_A1_A2_$G(DIEHGFLG)) S DIEHEXIT=1
 I DIEHUFLG["??" S DIEHUFLG=DIEHUFLG_C2_A2
 E  I DIEHUFLG["?" S DIEHUFLG=DIEHUFLG_C1_A1
 E  I DIEHUFLG["A" S DIEHUFLG=$TR(C1_C2_A1_A2,"S","U")
 Q
 ;
ZERO(F,D) ;
 I '$$VFILE^DIEFU(F,"D") Q 0
 I '$$VFIELD^DIEFU(F,D,"D") Q 0
 Q ^DD(F,D,0)
 ;
BN ;Insert blank node.
 S:DIHELP DIHELP=DIHELP+1,^TMP("DIHELP",$J,DIHELP)=""
 Q
 ;
HPROMPT(F,D) ;
 N T
 S T=$$HELP^DIALOGZ(F,D)
 I $L(T) D
 . D BN
 . S DIHELP=DIHELP+1,^TMP("DIHELP",$J,DIHELP)=T
 Q
 ;
XHLP(DIEHF,DIEHFLD) ;
 ;DA() and D0,D1,etc. passed thru symbol table.
 N DIEHXH S DIEHXH=$G(^DD(DIEHF,DIEHFLD,4))
 I $L(DIEHXH) D
 . D BN
 . N DIEHECNT S DIEHECNT=$G(DIERR)
 . N DDIOLFLG S DDIOLFLG="H" X DIEHXH
 . I DIEHECNT'=$G(DIERR) D HKERR^DILIBF(DIEHF,"",DIEHFLD,"Xecutable Help")
 Q
 ;
DESCR(F,D) ;
 N L
 S L=$P($G(^DD(F,D,21,0)),U,3)
 I L D
 . D BN
 . N I F I=1:1:L S DIHELP=DIHELP+1,^TMP("DIHELP",$J,DIHELP)=^DD(F,D,21,I,0)
 . Q
 Q
 ;
PXREFS(DIEHF,DIEHFLD) ;
 N DIF,DIFD,DIEHROOT,DIEHIXID,DIEHIXP,DIEHIXNM,DIFULL
 S DIEHIXP=$$FILENM^DIEFU(DIEHF)_" "
 D GETIXNM(DIEHF,.DIEHIXNM)
 S DIF=""
 F  S DIF=$O(DIEHIXNM(DIF)) Q:DIF=""  D  Q:$D(DIFULL)
 . S DIFD=""
 . F  S DIFD=$O(DIEHIXNM(DIF,DIFD)) Q:DIFD=""  D  Q:$D(DIFULL)
 . . I $L(DIEHIXP)+$L(DIEHIXNM(DIF,DIFD))>240 D  Q
 . . . S DIEHIXP=DIEHIXP_", etc     "
 . . . S DIFULL=1
 . . S DIEHIXP=DIEHIXP_DIEHIXNM(DIF,DIFD)_", or "
 S DIEHIXP=$E(DIEHIXP,1,$L(DIEHIXP)-5)
 D BLD^DIALOG(9105,DIEHIXP)
 Q
 ;
GETIXNM(DIEHF,DIEHIXNM) ;
 S DIEHROOT=$$ROOT^DIQGU(DIEHF,"",1)
 S DIEHIXID="Az"
 F  S DIEHIXID=$O(@DIEHROOT@(DIEHIXID)) Q:DIEHIXID=""  D
 . N DIEHIXF,DIEHIXFD
 . S DIEHIXF=$O(^DD(DIEHF,0,"IX",DIEHIXID,"")) Q:DIEHIXF=""
 . S DIEHIXFD=$O(^DD(DIEHF,0,"IX",DIEHIXID,DIEHIXF,"")) Q:DIEHIXFD=""
 . S DIEHIXNM(DIEHIXF,DIEHIXFD)=$$FLDNM^DIEFU(DIEHIXF,DIEHIXFD)
 Q
 ;
SCRNDES(F,D) ;
 N T
 S T=$G(^DD(F,D,12))
 I $L(T) D
 . D BN
 . S DIHELP=DIHELP+1,^TMP("DIHELP",$J,DIHELP)=T
 . Q
 Q
 ;
SCRNCD(F,D,DIEHZ) ;
 N S,DIC,Y,A,T,I
 I $P(DIEHZ,U,2)'["*" D UNSCRNCD(DIEHZ) Q
 S S=$G(^DD(F,D,12.1))
 I S="" D UNSCRNCD(DIEHZ) Q
 D CODES
 I $D(Y) D
 . N DIEHECNT S DIEHECNT=$G(DIERR)
 . D SETSCR^DIR(F,D)
 . D BLD^DIALOG(9101)
 . F I=1:1:T D
 . . S Y=$P(Y(I),";",1)
 . . X DIC("S") I  D CODESOUT
 . I DIEHECNT'=$G(DIERR) D HKERR^DILIBF(F,"",D,"set of codes screen")
 Q
UNSCRNCD(DIEHZ) ;
 N Y,A,T,I
 D CODES
 I $D(Y) D
 . D BLD^DIALOG(9101)
 . F I=1:1:T D CODESOUT
 . Q
 Q
 ;
CODES ;
 S A=$P(DIEHZ,U,3) I $G(DUZ("LANG"))>1,A=$P(^DD(DIEHF,DIEHFLD,0),U,3) S A=$$SETIN^DIALOGZ_";" ;NAKED
 I A]"" D
 . S T=$L(A,";")-1
 . F I=1:1:T S Y(I)=$P(A,";",I)
 . Q
 Q
 ;
CODESOUT ;
 S DIHELP=DIHELP+1,^TMP("DIHELP",$J,DIHELP)=$P(Y(I),":",1)_"        "_$P(Y(I),":",2)
 Q
 ;
VPMSG(F,D) ;
 N I,N,P,L
 D BLD^DIALOG(9103)
 S I=0 F  S I=$O(^DD(F,D,"V",I)) Q:I="B"  S N=^(I,0) D
 . S P(1)=$P(N,U,4),P(2)=$P(N,U,2),L=$S(I=1:"",1:"S")
 . D BLD^DIALOG(9117,.P,.P,"",L)
 . Q
 Q
 ;
FOLLOW(DIEHPF,DIEHUFLG) ;
 D GET(DIEHPF,"",.01,DIEHUFLG_"r")
 Q

DIEH1
DIEH1 ;SFISC/DPC-DBS HELP CON'T ;05:41 PM  8 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;;
DT(DIEHDT,DIWRITE) ; **CCO/NI OPTIONAL 'DIWRITE' PARAMETER ADDED SO WE CAN CALL THIS FROM DIEQ AS WELL AS DIEFU AND DIEH FOR FOREIGN-LANGUAGE DATE-HELP
 N P,Q
 I DIEHDT'["N" S P(1)=$$EZBLD^DIALOG($S(DIEHDT["M":9110.8,1:9110.1)) ;22*85  **CCO/NI 'OR 0157' 'OR 120157'
 D
 . I DIEHDT["P" S P(2)=$$EZBLD^DIALOG(9110.2) Q  ;**CCO/NI 'PAST'
 . I DIEHDT["F" S P(2)=$$EZBLD^DIALOG(9110.3) Q  ;**CCO/NI 'FUTURE'
 . S P(2)=$$EZBLD^DIALOG(9110.4) ;**CCO/NI 'ASSUMES CURRENT YEAR'
 . S P(3)=$$EZBLD^DIALOG(9110.5) ;**CCO/NI '20 YEARS future, 80 past'
 . Q
M I DIEHDT["M" D BLD^DIALOG(9110.7,.P,.P) G W ;22*85
 I DIEHDT'["X" D
 . N X S X=$$EZBLD^DIALOG(9110.6) ;**CCO/NI  'MAY OMIT PRECISE DATE'
 . I $G(P(3))]"" S P(4)=X Q
 . S P(3)=X Q
 D BLD^DIALOG(9110,.P,.P)
 I DIEHDT["T"!(DIEHDT["R") D
 . I DIEHDT["S" S Q(1)=$$EZBLD^DIALOG(9112) ;**CCO/NI 'SECONDS ALLOWED'
 . I DIEHDT["R" S Q(2)=$$EZBLD^DIALOG(9113) ;**CCO/NI 'TIME REQUIRED'
 . D BLD^DIALOG(9111,.Q,.Q)
 . Q
W I $G(DIWRITE) D MSG^DIALOG("WH") ;**CCO/NI NEW DIWRITE PARAMETER WRITES IT OUT
 Q
 ;

DIEKMSG
DIEKMSG ;SFISC/MKO-PRINT MESSAGE ABOUT BAD KEYS ;12:47 PM  18 Feb 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MSG(DIEBADK,DIEREST) ;Print message
 Q:$D(DIEBADK)<2
 ;
 N ANS,FIL,FINFO,FLD,KEY,LEV,MSG,NEW,OLD,REC,RFIL,TXT,DIERR
 K ^TMP("DIEMSG",$J)
 ;
 D PROMPT(DIEREST,.ANS) Q:'ANS
 ;
 W !
 I DIEREST D
 . D L("The following field(s) have been restored to their pre-edited values:")
 E  D L("The following field values are not valid:")
 D L("")
 ;
 ;Loop through root files
 S RFIL=0 F  S RFIL=$O(DIEBADK(RFIL)) Q:'RFIL  D
 . D FILENAME^DIKCU1(RFIL,.TXT,.FINFO) Q:'$D(FINFO)
 . D FILELN(.TXT,FINFO)
 . ;
 . ;Loop through keys
 . S KEY=0 F  S KEY=$O(DIEBADK(RFIL,KEY)) Q:'KEY  D
 .. D L("  Key: "_$P(^DD("KEY",KEY,0),U,2))
 .. ;
 .. ;Loop through files
 .. S FIL=0 F  S FIL=$O(DIEBADK(RFIL,KEY,FIL)) Q:'FIL  D
 ... ;
 ... ;Loop through records
 ... S REC=0 F  S REC=$O(DIEBADK(RFIL,KEY,FIL,REC)) Q:'REC  D
 .... D RECNAME^DIKCU1("",REC,.TXT,.FINFO)
 .... D RECLN(.TXT,FINFO)
 .... ;
 .... ;Loop through fields
 .... S FLD=0 F  S FLD=$O(DIEBADK(RFIL,KEY,FIL,REC,FLD)) Q:'FLD  D
 ..... S OLD=$G(DIEBADK(RFIL,KEY,FIL,REC,FLD,"O"))
 ..... S NEW=$G(DIEBADK(RFIL,KEY,FIL,REC,FLD,"N"))
 ..... S OLD=$S(OLD]"":$$EXTERNAL^DILFD(FIL,FLD,"",OLD,"MSG"),1:"<null>")
 ..... S NEW=$S(NEW]"":$$EXTERNAL^DILFD(FIL,FLD,"",NEW,"MSG"),1:"<null>")
 ..... I $G(DIERR) K DIERR,MSG Q
 ..... D L("")
 ..... D L($J("",14)_"Field: "_$P(^DD(FIL,FLD,0),U)_" (#"_FLD_")")
 ..... D L($J("",6)_"Invalid value: "),L(NEW,1,21)
 ..... D:$G(DIEREST) L($J("",8)_"Restored to: "),L(OLD,1,21)
 .... D L("")
 ;
 I $D(^TMP("DIEMSG",$J)) D PRINT
 K ^TMP("DIEMSG",$J)
 Q
 ;
FILELN(TXT,LEV) ;
 N I,MAR
 S MAR=$S($G(IOM)<40:80,1:IOM)-1
 ;
 S TXT=$S(LEV:"Subfile",1:"File")_": "_TXT
 D WRAP^DIKCU2(.TXT,MAR-9,MAR)
 D L(TXT) F I=1:1 Q:'$D(TXT(I))  D L($J("",9)_TXT(I))
 Q
 ;
RECLN(TXT,LEV) ;
 N I,MAR
 S MAR=$S($G(IOM)<40:80,1:IOM)-1
 ;
 S TXT="    Record: "_TXT
 D WRAP^DIKCU2(.TXT,MAR-12,MAR)
 D L(TXT) F I=1:1 Q:'$D(TXT(I))  D L($J("",12)_TXT(I))
 Q
 ;
L(X,A,LM) ;Add X to the DIEMSG array
 N LC
 S LC=$O(^TMP("DIEMSG",$J,""),-1)
 ;
 I '$G(LM) D  Q
 . I '$G(A) S ^TMP("DIEMSG",$J,LC+1)=X
 . E  S ^(LC)=^TMP("DIEMSG",$J,LC)_X
 ;
 N I,M,T
 S M=$S($G(IOM)<40:80,1:IOM)-1 S:M'>LM LM=0
 F I=1:1 D   Q:X=""
 . S T=$E(X,1,M-LM),X=$E(X,M-LM+1,999)
 . I I=1,$G(A) S ^(LC)=^TMP("DIEMSG",$J,LC)_T
 . E  S LC=LC+1,^TMP("DIEMSG",$J,LC)=$J("",LM)_T
 Q
 ;
PRINT ;Print lines stored in ^TMP("DIEMSG",$J)
 N I,LC,SL
 S SL=$S($G(IOSL)<4:24,1:IOSL)
 S (I,LC)=0 F  S I=$O(^TMP("DIEMSG",$J,I)) Q:'I  D
 . S LC=LC+1
 . W ^TMP("DIEMSG",$J,I),!
 . I LC'<(SL-2) D
 .. N DIR,DUOUT,DTOUT,DIRUT,DIROUT,X,Y
 .. S DIR(0)="E" D ^DIR W !!
 .. S LC=0
 Q
 ;
PROMPT(DIEREST,ANS) ;Ask user whether to print report
 N DIR,X,Y,DTOUT,DUOUT,DIROUT,DIRUT
 W !!,$C(7)_"*****  NOTE  *****"
 W !!,"Some of the previous edits are not valid because they create one or more"
 W !,"duplicate keys."
 I $G(DIEREST) D
 . W "  Some fields have been restored to their pre-edited"
 . W !,"values."
 W !
 ;
 S DIR(0)="Y",DIR("B")="YES"
 S DIR("A")="Do you want to see a list of those fields"
 D ^DIR W !
 S ANS=Y=1
 Q

DIENV
DIENV ;IRMFO-SF/FM STAFF-ENVIRONMENT CHECK ROUTINE ;10/29/98  07:15
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
 ; Check XPDENV 0 = Loading; 1 = Installing
 I 'XPDENV Q  ; Loading Distribution - No Check
 ;
INSCHK ; Do Checks During Install Only
 S XPDNOQUE=1 ;prevents QUEUEING of a FM patch install
 ;
TMCHK ; Check to see if TaskMan is still running
 S X=$$TM^%ZTLOAD
 I X D
 . D MES^XPDUTL("* Install Stopped Because TaskMan Has NOT Been Stopped!")
 . D MES^XPDUTL("     Transport Global Was NOT Unloaded!")
 . S XPDQUIT=2
 ;
LINH ; Check to see if Logons are Inhibited
 D GETENV^%ZOSV  ; $P(Y,"^",2) = Installing Volume
 S X=+$G(^%ZIS(14.5,"LOGON",$P(Y,"^",2)))
 I X D  Q  ; Bail Out of Install
 . D MES^XPDUTL("* Install Stopped Because Logon Were NOT Inhibited.")
 . D MES^XPDUTL("     Transport Global Was NOT Unloaded!")
 . S XPDQUIT=2
 Q

DIENVSTP
DIENVSTP ;IRMFO-SF/FM STAFF-ENVIRONMENT CHECK ROUTINE ;11/6/98  12:53
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Check XPDENV 0 = Loading; 1 = Installing
 I 'XPDENV Q  ; Loading Distribution - No Check
 ;
INSCHK ; Do Checks During Install Only
 S XPDNOQUE=1 ;prevents QUEUEING of a FM patch install
 ;
TMCHK ; Check to see if TaskMan is still running
 S X=$$TM^%ZTLOAD
 I X,'$D(^%ZTSCH("WAIT")) D
 . W $C(7)
 . D MES^XPDUTL("* Install Stopped Because TaskMan Has NOT Been Stopped!")
 . D MES^XPDUTL("     Transport Global Was NOT Unloaded!")
 . S XPDQUIT=2
 ;
LINH ; Check to see if Logons are Inhibited
 D GETENV^%ZOSV  ; $P(Y,"^",2) = Installing Volume
 S X=+$G(^%ZIS(14.5,"LOGON",$P(Y,"^",2)))
 I 'X D  Q  ; Bail Out of Install
 . W $C(7)
 . D BMES^XPDUTL("* Install Stopped Because Logon Were NOT Inhibited.")
 . D MES^XPDUTL("     Transport Global Was NOT Unloaded!")
 . S XPDQUIT=2
 Q

DIENVWRN
DIENVWRN ;IRMFO-SF/FM STAFF-ENVIRONMENT CHECK ROUTINE ;10:10 AM  28 Apr 2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Check XPDENV 0 = Loading; 1 = Installing
 I 'XPDENV D  Q  ; Loading Distribution - No Check
 . ; Make sure exported routines are registered in ROUTINE(#9.8) file
 . ; Edit FOR loop
 . N ROU,ZDATE,%,%H,%I,X
 . D NOW^%DTC
 . S ZDATE=%
 . F ROU="DDS10","DIA2","DICA3","DICN0","DIEF1","DIEFW","DIET","DILF" D
 .. N IEN S IEN=$O(^DIC(9.8,"B",ROU,0))
 .. I 'IEN D
 ... N FDA,DIERR,ZERR,IEN
 ... S IEN="+1,"
 ... S FDA(9.8,IEN,.01)=ROU
 ... S FDA(9.8,IEN,1)="R"
 ... S FDA(9.8,IEN,7.4)=ZDATE
 ... D UPDATE^DIE("","FDA","IEN")
 ... Q
 .. Q
 . D CLEAN^DILF
 . Q
 ;
INSCHK ; Do Checks During Install Only
 W $C(7)
 D MES^XPDUTL("** Although Queuing is allowed - it is HIGHLY recommended that ALL Users and")
 D MES^XPDUTL("VISTA Background jobs be STOPPED before installation of this patch.  Failure")
 D MES^XPDUTL("to do so may result in 'source routine edited' error(s). Edits will be")
 D MES^XPDUTL("lost and record(s) may be left in an inconsistent state, for example,")
 D MES^XPDUTL("not all Cross-Referencing completed; which in turn may cause FUTURE")
 D MES^XPDUTL("VistA/FileMan Hard Errors or corrupted Data. **")
 ;
TMCHK ; Check to see if TaskMan is still running
 S X=$$TM^%ZTLOAD
 I X,'$D(^%ZTSCH("WAIT")) D
 . W $C(7)
 . D BMES^XPDUTL("* Warning TaskMan Has NOT Been Stopped or Placed in a WAIT State!")
 ;
LINH ; Check to see if Logons are Inhibited
 D GETENV^%ZOSV  ; $P(Y,"^",2) = Installing Volume
 S X=+$G(^%ZIS(14.5,"LOGON",$P(Y,"^",2)))
 I 'X D
 . W $C(7)
 . D BMES^XPDUTL("* Warning Logons are NOT Inhibited!")
 Q

DIEQ
DIEQ ;SFISC/XAK,YJK-HELP DURING INPUT ;24AUG2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BN S D=$P(DQ(DQ),U,4) S:DP+1 D=DIFLD
 S DZ=X D EN1 G B^DIED
QQ ;
 I DV,DV["*",$D(^DD(+DV,.01,0)) S DQ(DQ)=$P(DQ(DQ),U,1,4)_U_$P(^(0),U,5,99)
EN1 N DDH,DST,A1 S DDH=0 G M:DV I DP<0 D HP G P
HELP I X="?"!(X["BAD") S X=$$HELP^DIALOGZ(DP,D),A1="T" D N:X]"" I '$G(DISORT),$D(^DD(DP,D,12)) S X=^(12) D N ;***CCO/NI HELP MESSAGE
 D H G:'$D(DZ) Q
 ;
P I DV["P" K DO S DIC=U_DU,D="B",DIC(0)="M"_$E("L",DV'["'") G AST:DV["*"&('$G(DISORT)) D DQ^DICQ D %
VP I DV["V" S DU=DP S:DV DU=+DO(2),D=.01 D V G Q
D I DV["D" S %(0)=0 D DT^DIEH1($P($P($P(DQ(DQ),U,5,9),"%DT=""",2),""""),1) ;**CCO/NI REPLACES CALL TO HELP^%DTC
S I DV["S" D:'$G(DISORT) SETSCR^DIR(DP,D) S A1="T",DST=$$EZBLD^DIALOG(8068)_" " D DS D  K DIC("S")
 .N A,A1,A2
 .S A=$P(DQ(DQ),U,3)
 .I $G(DUZ("LANG"))>1,A=$P(^DD(DP,D,0),U,3) S A=$$SETIN^DIALOGZ_";" ;NAKED
 .F DG=1:1 S Y=$P(A,";",DG) Q:Y=""  S D=$P(Y,":",2),Y=$P(Y,":") I 1 X:$D(DIC("S")) DIC("S") I  S A2="",$P(A2," ",15-($L(Y)+7))=" ",DST="  "_Y_A2_" "_D D DS
Q K DST,A1 S:$D(DIE) DIC=DIE S D=0 I $D(DDH)>10 D LIST^DDSU
 D:DV UDA
 Q
 ;
 ;
 ;
N F  Q:X=""  F %=$L(X," "):-1:1 I $L($P(X," ",1,%))<75 S DST=$P(X," ",1,%) D DS D:X'="" N1 Q
 S X=DZ
 Q
 ;
N1 S X=$P(X," ",%+1,$L(X," ")) Q
 ;
DS S:'$D(A1) A1="T" S DDH=$G(DDH)+1,DDH(DDH,A1)=$S(A1="X":"",1:"     ")_DST K A1,DST Q
 ;
HP I $D(DQ(DQ,3)) S A1="T",DST=DQ(DQ,3) D DS
 I $D(DQ(DQ,4)) S A1="X",DST=DQ(DQ,4) D DS
 Q
 ;
% S %=$G(DIC("V")) K DIC S:%]"" DIC("V")=% Q
 ;
AST S:$D(X)[0 X="?" X $P(DQ(DQ),U,5,99) K DIC G Q
 D ^DIC K DIC,DICS,DICW G Q
 ;
M K DO S DZ=X,DIC=DIE_DA_","_$S(+$P(DC,U,3)=$P(DC,U,3):$P(DC,U,3),1:$C(34)_$P(DC,U,3)_$C(34))_",",D="B",DIC(0)="LM",DZ(1)=0
 I '$D(@(DIC_"0)")) S DO=U_$P(DC,U,2) D DO2^DIC1
 D:'$D(DO) DO^DIC1
 D DDA,DQ^DICQ D % G Q:'$D(DZ)!(DV["S") S X=DZ G P
 ;
H I '$G(DISORT),$D(^DD(DP,D,4)) S A1="X",DST=^(4) D DS,LIST^DDSU Q:'$D(DZ)!$D(DDSQ)
 I $G(X)?1"??".E,X'["BAD" D
 . N DIDG,DG,DDD,DD,DIY,DIZ,DUOUT
 . S DIDG=$P($G(^DD(DP,D,21,0)),U,3)
 . K DDSQ
 . I '$D(DDS) S DDD=5,DD="",DIY=99,DIZ=21 I $G(DIPGM)'="DICQ1" N DIPGM S DIPGM="DIEQ" D Z^DDSU
 . F DG=1:1 Q:'$D(^DD(DP,D,21,DG,0))  Q:+DIDG&(DG>DIDG)  D  Q:$D(DDSQ)
 . . I '($G(DDH)#15) D LIST^DDSU I $G(DTOUT)!($G(DUOUT)) S DDSQ=1
 . . Q:$D(DDSQ)
 . . S DST=^DD(DP,D,21,DG,0) D DS Q
 . I '$D(DDSQ) Q:$D(DDH)'>10  D LIST^DDSU
 . I $D(DDSQ) K DDSQ,DDH
 . Q
 Q
 ;
BK S DDH=$G(DDH)+1,DDH(DDH,"T")=" " Q
 ;
V S DDH=+$G(DDH),A1="T",DST=$$EZBLD^DIALOG(8071) D DS
EGP F Y=0:0 S Y=$O(^DD(DU,D,"V",Y)) Q:Y'>0  I $D(^(Y,0)) S Y(0)=^(0) X:$D(DIC("V")) DIC("V") I  I $D(^DIC(+Y(0),0)) S Y(1)=$P(Y(0),U,4),Y(2)=$$FILENAME^DIALOGZ(+Y(0)),DST=$$EZBLD^DIALOG(8072,.Y) K Y(1),Y(2) D DS ;**CCO/NI V-P FILE NAMES
 D BK S DST=$$EZBLD^DIALOG(8073) D DS S DU="" D BK I DZ'?1"??".E K X,DZ Q
 D T^DIEQ1 K X,DZ Q
 ;
DDA N T,%
 S T=$T
 F %=+$O(DA(" "),-1):-1:1 K DA(%+1) S:$D(DA(%))#2 DA(%+1)=DA(%)
 K DA(1) S:$D(DA)#2 DA(1)=DA
 I T
 Q
 ;
UDA N T,%
 S T=$T
 S DA=$G(DA(1)) ;K DA(1)
 F %=2:1:+$O(DA(" "),-1) I $D(DA(%))#2 S DA(%-1)=DA(%) K DA(%)
 I T
 Q
 ;
 ;#8071  Enter one of the following
 ;#8072  |Prefix|.EntryName to select a |filename|
 ;#8073  To see the entries in any particular file type <Prefix.?>

DIEQ1
DIEQ1 ;SFISC/XAK,YJK-HELP WRITE ;5/27/94  7:29 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
T S A1="T" F DG=2:1 S X=$T(T+DG) Q:X=""  S DST=$E(X,4,99) D DS^DIEQ
 K A1,DST Q
 ;;If you simply enter a name then the system will search each of
 ;;the above files for the name you have entered. If a match is
 ;;found the system will ask you if it is the entry that you desire.
 ;;
 ;;However, if you know the file the entry should be in, then you can
 ;;speed processing by using the following syntax to select an entry:
 ;;      <Prefix>.<entry name>
 ;;                or
 ;;      <Message>.<entry name>
 ;;                or
 ;;      <File Name>.<entry name>
 ;;
 ;;Also, you do NOT need to enter the entire file name or message
 ;;to direct the look up. Using the first few characters will suffice.

DIET
DIET ;SFISC/XAK-DISPLAY INPUT TEMPLATE    ALSO DOES AUDITING! ;15OCT2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DICMX
 I '$D(^DIE(D0,0)) G EXIT
 S DICMX="W X,!"
EN ;
 N DI,DIET,DIETS,D
 S DIET=D0 D GET^DIETED("DIETS")
 F D=0:0 S D=$O(DIETS(D)) Q:'D  S X=DIETS(D) X DICMX Q:'$D(D)
EXIT S X="" Q
 ;
 ;
 ;
AUD N DP,DG,DPS,DIEX,DIIX,DIANUM ; From ^DICN0  DI*22*49
 S DIIX="3^.01^A",DP=+DO(2) D AUDIT:DP>0 Q
AUDIT ;
 N C,DIEDA,DIEF,%T,%F,%D,%,Y
 I $D(^DD(DP,+$P(DIIX,U,2),"AX")) X ^("AX") Q:'$T
 K % S DIEX=X D @+DIIX
 K DIIX,DPS,DIEX
 Q
3 ;'X' is NEW value
 I $D(DG),$D(DIANUM($P(DIIX,U,2))) S Y=X,(DIEX(1),C)=$P(^DD(DP,+$P(DIIX,U,2),0),U,2) D Y^DIQ S @DIANUM($P(DIIX,U,2))=Y K DIANUM($P(DIIX,U,2)) G I
2 ;'X' is OLD value
 S:$D(DP(1)) DPS=DP(1) S DIEDA="",DIEF="",%=1,DP(1)=DP,%F=+DP,X=DA
 F C=1:1 Q:'$D(^DD(DP(1),0,"UP"))  S %F=^("UP"),%=$O(^DD(%F,"SB",DP(1),0)) G Q:'$D(DA(C)) S DIEDA=DA(C)_","_DIEDA,DIEF=%_","_DIEF,DP(1)=%F
 D ADD I $D(DG),+DIIX=2 S DIANUM($P(DIIX,U,2))="^DIA("_%F_","_+Y_",3)"
 S (DIEX(1),C)=$P(^DD(DP,+$P(DIIX,U,2),0),U,2),Y=DIEX D 
 .N %F,%D,DA,DIEX,DP,DPS
 .D Y^DIQ
 S ^DIA(%F,"B",DIEDA_DA,%D)="",X=DIEX S:$D(DPS) DP(1)=DPS
 S ^DIA(%F,%D,0)=DIEDA_DA_U_%T_U_DIEF_+$P(DIIX,U,2)_U_DUZ_U_$P(DIIX,U,3),^(+DIIX)=Y
I I (DIEX(1)["D")!(DIEX(1)["P")!(DIEX(1)["V")!(DIEX(1)["S") S ^(DIIX+.1)=X_U_DIEX(1)
Q Q
 ;
 ;
 ;
 ;
 ;
WP(%F,FLD,IENS,DIEFNODE) ;AUDIT WP FIELD FLD IN (SUB)FILE %F
 N Y,%D,%T,X
 S Y=+$P($G(^DD(%F,FLD,0)),U,2) Q:'Y  Q:$P($G(^DD(+Y,.01,0)),U,2)'["a"  Q:$G(^("AUDIT"))="e"&'$O(@DIEFNODE@(0))
 S X=""
 F  Q:'IENS  S Y=%F,X=+IENS_","_X,IENS=$P(IENS,",",2,99)  Q:'$G(^DD(Y,0,"UP"))  S %F=^("UP"),%=$O(^DD(%F,"SB",Y,0)) I % S FLD=%_","_FLD
 S X=$E(X,1,$L(X)-1) D ADD S ^DIA(%F,Y,0)=X_U_%T_U_FLD_U_DUZ,^DIA(%F,"B",X,Y)=""
 M ^DIA(%F,Y,2.14)=@DIEFNODE
 Q
 ;
 ;
 ;
ACCESSED(%F,REF) ;WILL FLAG ENTRY 'REF' IN FILE '%F' AS BEING ACCESSED BY CURRENT USER, CURRENT TIME, CURRENT OPTION
 N Y,X,%T,%D,%,%I,%H
 Q:'$G(DUZ)
 I '$G(DT) D NOW^%DTC S DT=X,U="^"
 Q:'%F!'REF  S %F=+%F,(REF,X)=+REF Q:'$D(^DIC(%F))
 D ADD ;COMES BACK WITH %T AND Y--THE AUDIT REF
 S ^DIA(%F,Y,0)=REF_U_%T_U_.01_U_DUZ_U_U_"i"
 S ^DIA(%F,"B",REF,Y)=""
 Q
 ;
 ;
 ;
ADD S Y=$O(^DIA(%F,"A"),-1) I 'Y S ^DIA(%F,0)=$P(^DIC(%F,0),U)_" AUDIT^1.1I"
 F Y=Y+1:1 I '$D(^(Y)) D LOCK^DILF("^DIA(%F,Y)") I  Q:'$D(^(Y))  L -^DIA(%F,Y) ;**PATCH 147
 S ^(Y,0)=X L -^DIA(%F,Y)
 S %T=$G(XQY),%D=$S($D(XQORNOD)#2:XQORNOD,$D(HLORNOD)#2:HLORNOD,1:"") I %T!%D S ^DIA(%F,Y,4.1)=%T_U_%D
 S $P(^(0),U,3,4)=Y_U_($P(^DIA(%F,0),U,4)+1)
TIME S %D=Y,%T=$$HTFM^DILIBF($H)
 S ^DIA(%F,"C",%T,Y)="",^DIA(%F,"D",DUZ,Y)=""
 Q

DIETED
DIETED ;SFISC/GFT SCREEN-EDIT AN INPUT TEMPLATE ;15NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIC,DIET,DRK,DIETED,I,J,DDSCHG
 S DIC=.402,DIC(0)="AEQ" D ^DIC Q:Y<1
 S DIET=+Y D E
 D PUT
K K ^UTILITY("DIETEDIAB",$J),^UTILITY("DIETED",$J)
 Q
 ;
EDIT(DIET) ; Edit Template using Screen Editor
 N DRK,DIETED,I,J
E N DUOUT,DTOUT,DP,DI,D0,DIETROW,DIETEDER,DIETH,DR,F,L,DB
 D:'$D(DISYS) OS^DII X ^DD("OS",DISYS,"EON")
 I '$D(^DIE(DIET,0)) W !,"NO TEMPLATE SELECTED",! Q
 S DIETED="Input Template """_$P(^(0),U)_""""
 W "..."
 D GET("^TMP(""DIETED"",$J)")
 S DIETH="Editing "_DIETED,DIETROW=1,DRK=$P(^DIE(DIET,0),U,4)
DDW D EDIT^DDW("^TMP(""DIETED"",$J)","M",DIETH,"(File "_DRK_")",DIETROW)
 I $D(DUOUT)!$D(DTOUT) K DR G KL
 D K K I,J
 D PROCESS("^TMP(""DIETED"",$J)")
 X ^DD("OS",DISYS,"EON")
 S DIETROW=$O(DIETEDER(0)) I DIETROW S DIETH="ERROR!  Re-editing "_DIETED K DIETEDER G DDW
 S DDSCHG=1
KL K ^TMP("DIETED",$J)
 I '$D(DR) W $C(7),$$EZBLD^DIALOG(8077) Q
 M ^UTILITY("DIETED",$J)=DR
 Q
 ;
GET(DIETA,DIT) ;put displayable template into @DIETA
 N DIAO,DIETREL,DIETAD,DB,DIAT,I,J,L,DIAR,DIAB
 K @DIETA
 I '$D(DIT) S DIT=$NA(^DIE(DIET))
 S (DR,DIAT)="",(DIETAD,L,DIAO,DB,DIAR)=0,F=-1
 S J(0)=$P(@DIT@(0),U,4)
 M DI=^("DIAB") S DI=J(0)
 D DOWN
1 S Y=$P(DIAT,";",DB) I "Q"[Y G NDB:Y="" S DB=DB+1 G 1
 S %=+Y I Y?.NP,$P(Y,":",2),Y'["/" S Y=+Y_"-"_$P(Y,":",2),%=""
 I %_"T~"=Y!(%_"t~"=Y),$P($G(^DD(DI,%,0)),U,2) S Y=% ;HWH-1103-40934 -- ignore TITLE of MULTIPLE
 S DIETREL="",DIAB=$G(DI(DB,DIAR-1,DI,DIAO)) E  S:Y?1"^".E DIETREL=Y S:DIAB]"" Y=DIAB
 I Y?1"]".E S Y=$E(Y,2,999)
 I DIAB="",%,$D(^DD(DI,%,0)) S Y=$P(^(0),U)_$P(Y,%,2,999)
 S DB=DB+1,DIETAD=DIETAD+1,@DIETA@(DIETAD)=$J("",F*3)_Y I DIETREL]"" D  G 1 ;Put it in!
 .S L=L\100+1*100,(J(L),DI)=$P(DIETREL,U,2) D DOWN ;Relational jump
 I % S %=+$P($G(^DD(DI,%,0)),U,2) I %,$P($G(^DD(%,.01,0)),U,2)'["W" S L=L+1,(J(L),DI)=% D DOWN ;Down to a multiple
 I Y="ALL" G UP
 G 1
 ;
DOWN S F=F+1,DIAR(F)=DIAR,DIAR=DIAR+1,%=$P(DIAT,";",DB) S:%?1"^"1.NP DB=DB+1,DIAR=$P(%,U,2)
 S DB(F)=DB,DB=1,DIAO(F)=DIAO,DIAO=0
DIAT S DIAT=$G(@DIT@("DR",DIAR,DI),"ALL") Q
 ;
NDB I DIAO'<0 S DIAO=DIAO+1 I $D(@DIT@("DR",DIAR,DI,DIAO)) S DIAT=^(DIAO),DB=1 G 1
 S DIAO=-1
UP Q:'F  K I(L),J(L) S L=$O(J(L),-1)
 S DIAR=DIAR(F),DB=DB(F),DIAO=DIAO(F),DI=J(L),DIAT=$S(DIAO<0:"",DIAO:@DIT@("DR",DIAR,J(L),DIAO),1:$G(@DIT@("DR",DIAR,DI))),F=F-1 G 1
 ;
 ;
 ;
 ;
PROCESS(DIETA) ;puts nodes into ^UTILITY("DIETED")
 N DIAB,LINE,DXS,L,DIAP,DIETSL,DQI,DIETSAVE,DIETAB,ERR,DIAR
 K DR S F=0,(DI,J(0))=DRK,I(0)=^DIC(J(0),0,"GL"),DIAP="",(L,DIETAB)=0,DXS=1,DIAR=1
 F LINE=1:1 Q:'$D(@DIETA@(LINE))  K ERR S X=^(LINE) D
 .I X?1"^".E S LINE=999999999 K DR Q
 .D LINE(X)
 .I $D(ERR) W "LINE ",LINE S DIETEDER(LINE)=ERR,LINE=-LINE Q  ;stop if we find one error
 I LINE<0 W " ERROR!"
 Q
 ;
LINE(X) ;Process one LINE from the screen
 N D,DIC,DICMX,DV,DATE,Y,DICOMPX,DICOMP,DRR
 F D=$L(X):-1:1 Q:$A(X,D)>32  S X=$E(X,1,D-1)
 F D=0:1 Q:$A(X)-32  S X=$E(X,2,999) ;strip off 'D' leading spaces
 Q:X=""
OUT I D<DIETAB,L K I(L),J(L) S L=$O(J(L),-1),DIAP=DIAP(F),DIAR=DIAR(F),DIETAB=$G(DIETAB(F),D),F=F-1,DI=J(L) G OUT ;out-dentation means go up a level (or more)
 S DIETAB=D
 I X?1"@"1.N S Y=X G DR
ALL D DICS^DIA I X="ALL" D  Q
 .S ^UTILITY("DIETEDIAB",$J,1,DIAR-1,DI,DIAP\1000)=X
 .N D,DA,DG D RANGE^DIA1
 S DV="",J=$P(X,"-",2) I +J=J,$P(X,"-")=+X,J>X D  G X:Y="",DR
 .N D,DA,DG S D(F)=J D RANGE^DIA1 S Y=DA
SEMIC I X[";" S Y=X,X=$P(X,";") D  G X:'$D(Y) S DIAB=Y
 .F %=2:1:$L(Y,";") S D=$P(Y,";",%),D=$S(D="DUP":"d",D="REQ":"R","""R""d"""[D:"",$A(D)=34:$E(D,2,$F(D,"""",2)-2),D="T":D,1:""),DV=D_$C(126)_DV I $A(D)>45&($A(D)<58)!(D[":")!(D="") K Y Q
DIC S DIC(0)="OZ",DIC="^DD(DI," D ^DIC
 I Y>0 S Y=+Y_DV D DR S %=+$P(Y(0),U,2) D:%  Q
 .I $P($G(^DD(+%,.01,0)),U,2)["W" Q
 .S L=L+1,(DI,J(L))=+%,I(L)=""""_$P($P(Y(0),U,4),";")_"""" D D
 S (Y,DIETSAVE)=X I DUZ(0)="@",X'?.E1":" S X=$S(X["//^":$P(X,"//^",2),1:X),X=$S(X[";":$P(X,";"),1:X) D ^DIM G:$D(X) DR:X=DIETSAVE I DIETSAVE["//^",'$D(X) G X
 F DIETSL="///+","//+","///","//" I DIETSAVE[DIETSL S DP=$P(DIETSAVE,DIETSL,2,9) I DP'?1"/".E&(DP'?1"^".E)!(DUZ(0)="@") G DEF
 I DIETSAVE?.E1":" S:'$D(DIAB) DIAB=DIETSAVE K X S X=DIETSAVE,DICOMP=L_"WE",DQI="Y(",DA="DR(99,"_DXS_",",DICMX=1 D ^DICOMPW G L:$D(X) ;as in E^DIA3
X S ERR=1 Q
 ;
L I $D(X)>1  M DR(99,DXS)=X S DXS=DXS+1
 S %=-1,L=$S(Y>L:+Y,1:L\100+1*100),Y=U_DP_U_U_X_" S X=$S(D(0)>0:D(0),1:"""")" K X
 D DR S DI=+DP D D
 Q
 ;
D N % S F=F+1,DIAR(F)=DIAR F %=F+1:.01 Q:'$D(DR(%,DI))
 S:%["." @DRR=@DRR_U_%_";",DIAP=DIAP+1 S DIAR=%
 S DIAP(F)=DIAP,DIAP=0,DIETAB(F)=DIETAB Q
 ;
DEF S X=DIETSAVE D  S X=$P(DIETSAVE,DIETSL),DV=DV_DIETSL_DP G X:DV[";",DIC ;as in DEF^DIA3
 .S X="DA,DV,DWLC,0)=X" F J=L:-1 Q:I(J)[U  S X="DA("_(L-J+1)_"),"_I(J)_","_X
 .S DICMX="S DWLC=DWLC+1,"_I(J)_X,DA="DR(99,"_DXS_",",X=DP,DQI="X(",DICOMP=L_"T"
 .D EN^DICOMP,DICS^DIA
XEC .I $D(X),Y["m" S DIC("S")="S %=$P(^(0),U,2) I %,$D(^DD(+%,.01,0)),$P(^(0),U,2)[""W"",$D(^DD(DI,Y,0)) "_DIC("S") ;as in XEC^DIA3
 .S Y=0 F  S Y=$O(X(Y)) Q:Y=""  S @(DA_"Y)=X(Y)")
 .S Y=-1 I $D(X) S Y="Q",DXS=DXS+1,DP=U_X D
 ..D  S:'$D(DIAB) DIAB=DIETSAVE ;assume "YOU MEAN as a VARIABLE"
 ...N DIAB D DR
 .I DP="@",DIETSL="//" S DA=U_U
 .Q
 ;
DR ;takes 'Y' and puts it into 'DR' array
 N %,B
 S (DRR,B)=$NA(DR(DIAR,DI)),%=$O(@DRR@(""),-1)
 I % S DRR=$NA(@DRR@(%))
 I '$D(@DRR) S @DRR="",DIAP=0
 I $L(Y)+$L(@DRR)>230 S DRR=$NA(@B@(%+1)),DIAP=DIAP\1000+1*1000,@DRR=""
 S @DRR=@DRR_Y_";"
 S DIAP=DIAP+1
DIAB I $D(DIAB) S ^UTILITY("DIETEDIAB",$J,DIAP#1000,DIAR-1,DI,DIAP\1000)=DIAB K DIAB
 Q
 ;
PUT ;save template
 I '$D(^UTILITY("DIETED",$J)) Q
 N DIC
 S DIC("B")=DIET
SAVEAS S DIC=.402,DIC("A")="Save revised "_DIETED_" as: ",DIC(0)="AEQL",DIC("S")="I $P(^(0),U,4)=DRK"
 D ^DIC
 Q:Y<0  I $O(^DIE(+Y,0))]"" W !,$C(7),"Are you sure you want to overwrite this '",$P(Y,U,2)," 'Template" S %=1 D YN^DICN I %-1 Q:%<2  K DIC("B") G SAVEAS
 L +^DIE(+Y)
 S ^DIE("F"_J(0),$P(Y,U,2),+Y)=1
 S $P(^DIE(+Y,0),U,4)=J(0)
 L -^DIE(+Y)
 D SAVEFLDS(+Y)
 Q
 ;
SAVEFLDS(Y) ;
 N X,DP,DMAX
 Q:'$D(^UTILITY("DIETED",$J))!'$G(Y)
NOW D NOW^%DTC S $P(^DIE(Y,0),U,2)=+$J(%,0,4)
 S $P(^DIE(Y,0),U,5)=$G(DUZ)
 K ^DIE(Y,"DR") M ^DIE(+Y,"DR")=^UTILITY("DIETED",$J)
 K ^DIE(Y,"DIAB") M ^DIE(+Y,"DIAB")=^UTILITY("DIETEDIAB",$J)
 S X=$S('$D(^DIE(+Y,"ROU")):1,^("ROU")'[U:1,$D(^("ROUOLD")):^("ROUOLD"),1:1),DP=+$P(^(0),U,4),DMAX=^DD("ROU") I X'=1,$D(^DD("OS",DISYS,"ZS")) D EN^DIEZ
 D K
 Q

DIEV
DIEV ;SFISC/DPC-DATA VALIDATOR ;22SEP2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 11
 ;Per VHA Directive 2004-038, this routine should not be modified.
VAL(DIEVF,DIEVIEN,DIEVFLD,DIEVFLG,DIEVAL,DIEVANS,DIEVFAR,DIOUTAR) ;
VALX ;
 N DIEV0,DIEVP2,DA,D,I,C,G K DIEVANS
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIEVFLG=$G(DIEVFLG) I '$$VERFLG^DIEFU(DIEVFLG,"HFERYUK") G OUT
 D FLDVAL G:$G(DIEVAL)=U OUT
IENS S G=$G(DIEVIEN) I G]"" S:G'?.E1"," G=G_"," S C=$L(G,",")-1 F I=1:1:C S D="D"_(C-I) N @D S @D=$P(G,",",I) I @D="" D BLD^DIALOG(308,$G(DIEVIEN)) G OUT
 S DIEVIEN=G D DA^DIEFU(G,.DA)
 D AUXVAL(DIEVF,DIEVIEN,DIEVFLD,DIEVFLG,DIEVAL,.DIEVANS,.DIEV0,.DIEVP2)
 I $G(DIEVANS)=U!("@"[DIEVAL) G OUT
MINVAL ;
 D INT(DIEVF,DIEVFLD,DIEVFLG,DIEVAL,.DIEVANS,$G(DIEV0),$G(DIEVP2))
 I DIEVANS=U D ERR G OUT
 I DIEVFLG'["U",$G(DIEVIEN)'?."," D KEY(DIEVF,DIEVIEN,DIEVFLD,DIEVFLG,DIEVANS,.DIEVANS)
OUT S DIEVANS=$G(DIEVANS,U)
 I DIEVFLG["F",DIEVANS'=U D FDA
 I $G(DIOUTAR)]"" D CALLOUT^DIEFU(DIOUTAR)
 Q
 ;
FLDVAL ;
 N DIEVOUT S DIEVOUT=0
 I '$$VFILE^DIEFU(DIEVF,"D") S DIEVAL=U Q
 I '$$VFIELD^DIEFU(DIEVF,DIEVFLD,"D") S DIEVAL=U Q
 S DIEV0=^DD(DIEVF,DIEVFLD,0),DIEVP2=$P(DIEV0,U,2)
 D DTYPE
 I DIEVOUT=1 S DIEVAL=U
 Q
 ;
AUXVAL(DIEVF,DIEVIEN,DIEVFLD,DIEVFLG,DIEVAL,DIEVANS,DIEV0,DIEVP2) ;
 N DIEVOUT S DIEVOUT=0
 I '$D(DIOVRD),$P($G(^DD($$FNO^DILIBF(DIEVF),0,"DI")),U,2)="Y",DIEVFLG'["Y" D  G AUXERR
 . N INT,EXT S INT(1)=$$FILENM^DIEFU(DIEVF),EXT("FILE")=DIEVF
 . D BLD^DIALOG(405,.INT,.EXT)
 I $P(DIEV0,U,5,99)["DINUM","@"'[DIEVAL D  G AUXERR
 . N EXT,INT S EXT("FILE")=DIEVF,EXT("FIELD")=DIEVFLD,(INT(1),EXT(1))="DINUMed"
 . D BLD^DIALOG(520,.INT,.EXT)
 I $E(DIEVAL)="?"!(DIEVP2["V"&(DIEVAL[".?")) N P S P(1)=DIEVF,P(2)=DIEVFLD D BLD^DIALOG(1610,"",.P) G AUXERR
 I DIEVFLG["R" G:'$$VENTRY^DIEFU(DIEVF,DIEVIEN,"D9") AUXERR
 I DIEVP2["I",$$DATA(DIEVF,DIEVFLD) N P S P("FIELD")=DIEVFLD,P("FILE")=DIEVF D BLD^DIALOG(710,.P,.P) G AUXERR
 I "@"[DIEVAL D DELETE G:DIEVOUT AUXERR Q
 I DIEVFLG["I" D
 . S DIEVANS=DIEVAL
 . I DIEVFLG["E" S DIEVANS(0)=$$EXTERNAL^DILFD(DIEVF,DIEVFLD,"",DIEVAL)
 Q
AUXERR S DIEVANS=U
 Q
 ;
DTYPE ;
 I DIEVP2 D  S DIEVOUT=1 Q
 . N T,INT,EXT D DTYP^DIOU(DIEVF,DIEVFLD,.T)
 . I T=5 S INT(1)="word-processing",EXT("FIELD")=DIEVFLD,EXT("FILE")=DIEVF D BLD^DIALOG(520,.INT,.EXT) Q
 . S INT(1)="multi-valued",EXT("FIELD")=DIEVFLD,EXT("FILE")=DIEVF D BLD^DIALOG(520,.INT,.EXT)
 I DIEVP2["C" N INT,EXT S INT(1)="computed",EXT("FIELD")=DIEVFLD,EXT("FILE")=DIEVF D BLD^DIALOG(520,.INT,.EXT) S DIEVOUT=1 Q
 Q
 ;
DELETE ;
 I $D(^DD(DIEVF,DIEVFLD,"DEL")) D
 . N DIEVECNT S DIEVECNT=$G(DIERR)
 . N I S I="" F  S I=$O(^DD(DIEVF,DIEVFLD,"DEL",I)) Q:I=""  X $G(^(I,0)) I  S DIEVOUT=1
 . I DIEVECNT'=$G(DIERR) S DIEVOUT=1 D HKERR^DILIBF(DIEVF,$G(DIEVIEN),DIEVFLD,"DEL node")
 I DIEVP2["R" D
 . I DIEVFLD'=.01 S DIEVOUT=1 Q
 . I '$D(^DD(DIEVF,0,"UP")) Q
 . I $P($G(@$$ROOT^DILFD(DIEVF,DIEVIEN,1)@(0)),U,4)=1 S DIEVOUT=1
 I 'DIEVOUT,DIEVFLG'["U",DIEVFLD'=.01 D  Q:DIEVOUT
 . N DIEVKEY
 . S DIEVKEY=0
 . F  S DIEVKEY=$O(^DD("KEY","F",DIEVF,DIEVFLD,DIEVKEY)) Q:'DIEVKEY  D
 . . Q:$D(^DD("KEY",DIEVKEY,0))[0
 . . D ERR742^DIEVK1(DIEVF,DIEVFLD,DIEVKEY,DIEVIEN)
 . . S DIEVOUT=1
 I 'DIEVOUT S DIEVANS="" S:DIEVFLG["E" DIEVANS(0)=""
 E  D
 . N INT,EXT
 . S INT(1)=$$FLDNM^DIEFU(DIEVF,DIEVFLD),INT(2)=$$FILENM^DIEFU(DIEVF)
 . S EXT("FILE")=DIEVF,EXT("FIELD")=DIEVFLD
 . D BLD^DIALOG(712,.INT,.EXT)
 Q
 ;
DATA(DIEVF,DIEVFLD) ;
 N DIEVNODE,DIEVSPOT,N S DIEVSPOT=" ",N=0
 D GLRF^DIOU(DIEVF,DIEVFLD,.DIEVNODE,.DIEVSPOT)
 I +DIEVSPOT D
 . I $P($G(@DIEVNODE),U,DIEVSPOT)'="" S N=1
 E  I $E(DIEVSPOT)="E" D
 . N F,T
 . S F=$P($P(DIEVSPOT,"E",2),",",1),T=$P(DIEVSPOT,",",2)
 . I $TR($E($G(@DIEVNODE),F,T)," ")'="" S N=1
 Q N
 ;
INT(%B1,%B2,DIEVFLG,X,DIEVANS,%B3,%B) ;
 N %A,%E,%C,DIR,DIC,Y,DIE,%J,%T,%BA,DP,DIFLD,DDH,%BU,%I,%K,DQ,DIFILE,C,DIEVECNT,DIRDINUM
 I $G(%B3)="" S %B3=^DD(%B1,%B2,0),%B=$P(%B3,U,2)
 I %B["V" D VP^DIEV1(%B1,%B2,DIEVFLG,X,%B3,.DIEVANS) Q
 I %B["N" D  Q:$G(DIEVANS)=U
 . I $L($P(X,"."))>24 S DIEVANS=U Q
 I %B["S" S X=$$UP^DILIBF(X)
 S %A=%B1_","_%B2_",V",%E=0,DIR("V")="",%T=$E(%B1)
 S DIEVECNT=$G(DIERR)
 S:DIEVFLG["N" DIRDINUM=1 D 1^DIR1 ;input transform to 52,3 KILLs off "Y" variable!
 I DIEVECNT'=$G(DIERR) S DIEVANS=U D HKERR^DILIBF(%B1,$G(DIEVIEN),%B2,"screen on a pointer or set of codes or in an input transform") K:$G(DIRDINUM) DINUM Q
 I %E S DIEVANS=U K:$G(DIRDINUM) DINUM Q
 S DIEVANS=$S(%B'["P":Y,1:$P(Y,U))
 I DIEVFLG["E" D
 . I %B["S"!(%B["D") S DIEVANS(0)=$P(Y(0),U)
 . E  I %B["P" S DIEVANS(0)=Y(0,0)
 . E  I %B["O" D
 . . S DIEVECNT=$G(DIERR)
 . . X $G(^DD(%B1,%B2,2))
 . . I DIEVECNT'=$G(DIERR) D HKERR^DILIBF(%B1,$G(DIEVIEN),%B2,"output transform") Q
 . . S DIEVANS(0)=Y
 . . Q
 . E  S DIEVANS(0)=Y
 . Q
 Q
 ;
KEY(DIEVF,DIEVIEN,DIEVFLD,DIEVFLG,DIEVAL,DIEVANS) ;checks Key integrity for a value
 N DIEVKEY,DIEVFDA S DIEVKEY=""
 S DIEVFDA(DIEVF,DIEVIEN,DIEVFLD)=DIEVAL
 I '$$KEYVAL^DIEVK($E("K",DIEVFLG["K"),"DIEVFDA") K DIEVANS S DIEVANS=U
 Q
 ;
FDA ;
 I $G(DIEVFAR)="" D BLD^DIALOG(202,"FDA") Q
 D LOAD^DIEF1(DIEVF,DIEVIEN,DIEVFLD,"",DIEVANS,DIEVFAR)
 Q
 ;
ERR ;
 N INT,EXT
 S INT(1)=$$FLDNM^DIEFU(DIEVF,DIEVFLD),INT(2)=$$FILENM^DIEFU(DIEVF),(INT(3),EXT(3))=DIEVAL
 S EXT("FILE")=DIEVF,EXT("FIELD")=DIEVFLD,EXT("IENS")=$G(DIEVIEN)
 D BLD^DIALOG(701,.INT,.EXT)
 I DIEVFLG["H" D GET^DIEH(DIEVF,"",DIEVFLD,"?b") ;DA() and D0,D1,etc. passed thru symbol table
 Q
 ;
CHKX ;
 N DIEV0,DIEVP2 K DIEVANS
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIEVFLG=$G(DIEVFLG) I '$$VERFLG^DIEFU(DIEVFLG,"HEN") G OUT
 D FLDVAL I $G(DIEVAL)=U D OUT Q
 D MINVAL
 Q

DIEV1
DIEV1 ;SFISC/DPC -- VARIABLE POINTER VALIDATION ;1:39 PM  12 Sep 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
VP(DIEVF,DIEVFLD,DIEVFLG,DIEVAL,DIEV0,DIVPOUT) ;
 N DIVPY,DIVPHITF,DIVPZ,DIVPVP,DIVPRNUM,DIVPFILE,DIVPSAVV,DIVPAMB,DIVPFLK
 K DIVPOUT
 S DIVPAMB=0
 I DIEVAL'["."!($P(DIEVAL,".")="") D ALL,DONE Q
 S DIVPSAVV=DIEVAL,DIVPFLK=$P(DIVPSAVV,"."),DIEVAL=$P(DIVPSAVV,".",2,99)
 N DIVPVPS D VPNUMS(DIEVF,DIEVFLD,DIVPFLK,.DIVPVPS)
 I $D(DIVPVPS) D
 . S DIVPVP=""
 . F  S DIVPVP=$O(DIVPVPS(DIVPVP)) Q:DIVPVP=""  D FINDVP Q:DIVPAMB
 I DIVPAMB S DIVPOUT=U Q
 I $D(DIVPY) D DONE Q
 S DIEVAL=DIVPSAVV
 D ALL,DONE
 Q
 ;
ALL ;
 N DIVPORD S DIVPORD=0
 F  S DIVPORD=$O(^DD(DIEVF,DIEVFLD,"V","O",DIVPORD)) Q:'DIVPORD  D  Q:DIVPAMB
 . S DIVPVP=$O(^DD(DIEVF,DIEVFLD,"V","O",DIVPORD,""))
 . D FINDVP
 Q
 ;
VPNUMS(DIEVF,DIEVFLD,DIVPFLK,DIVPVPS) ;
 I $D(^DD(DIEVF,DIEVFLD,"V","P",DIVPFLK)) S DIVPVPS($O(^(DIVPFLK,"")))="" Q
 N DIVPMES S DIVPMES=""
 F  S DIVPMES=$O(^DD(DIEVF,DIEVFLD,"V","M",DIVPMES)) Q:DIVPMES=""  D
 . I $P(DIVPMES,DIVPFLK)="" S DIVPVPS($O(^DD(DIEVF,DIEVFLD,"V","M",DIVPMES,"")))=""
 S DIVPFILE=0
 F  S DIVPFILE=$O(^DD(DIEVF,DIEVFLD,"V","B",DIVPFILE)) Q:DIVPFILE=""  D
 . I $P($$GET1^DID(DIVPFILE,"","","NAME","","","A"),DIVPFLK)="" S DIVPVPS($O(^DD(DIEVF,DIEVFLD,"V","B",DIVPFILE,"")))=""
 Q
 ;
FINDVP ;
 S DIVPZ=^DD(DIEVF,DIEVFLD,"V",DIVPVP,0)
 S DIVPFILE=+DIVPZ Q:'DIVPFILE
 N DIVPECNT S DIVPECNT=$G(DIERR)
 I $P(DIVPZ,U,5)="y",$G(^DD(DIEVF,DIEVFLD,"V",DIVPVP,1))]"" N DIC X ^DD(DIEVF,DIEVFLD,"V",DIVPVP,1)
 I DIVPECNT'=$G(DIERR) D HKERR^DILIBF(DIEVF,"",DIEVFLD,"variable pointer screen") Q
 S DIVPRNUM=$$FIND1^DIC(DIVPFILE,"","BO",DIEVAL,"",$G(DIC("S")))
 I $D(^TMP("DIERR",$J,"E",299)) K DIVPY S DIVPAMB=1
 I 'DIVPRNUM Q
 I DIVPRNUM,'$D(DIVPY) S DIVPY=DIVPRNUM,DIVPHITF=DIVPFILE Q
 I DIVPRNUM,$D(DIVPY) D
 . K DIVPY
 . S DIVPAMB=1
 . N DIVPP S DIVPP(1)=DIEVAL D BLD^DIALOG(299,.DIVPP,.DIVPP)
 Q
 ;
DONE ;
 I '$G(DIVPY) S DIVPOUT=U Q
 S DIVPOUT=DIVPY_";"_$E($$GET1^DID(DIVPHITF,"","","GLOBAL NAME","","","A"),2,99)
 D IT
 I DIVPOUT=U Q
 I DIEVFLG["E" S DIVPOUT(0)=$$EXTERNAL^DILFD(DIEVF,DIEVFLD,"",DIVPOUT)
 Q
 ;
IT ;
 N X S X=DIVPOUT
 N DIVPECNT S DIVPECNT=$G(DIERR)
 I $G(DIEV0) X $P(DIEV0,U,5,99)
 I '$G(DIEV0) X $P(^DD(DIEVF,DIEVFLD,0),U,5,99)
 I DIVPECNT'=$G(DIERR) S DIVPOUT=U D HKERR^DILIBF(DIEVF,"",DIEVFLD,"input transform") Q
 S DIVPOUT=$G(X,U)
 Q
 ;
VPFILES(DIEVF,DIEVFLD,DIVPFLK,DIVPANS) ;
 N DIVPVPS,DIEVFILE
 D VPNUMS(DIEVF,DIEVFLD,DIVPFLK,.DIVPVPS)
 I '$D(DIVPVPS) Q
 N DIVPVP S DIVPVP=""
 F  S DIVPVP=$O(DIVPVPS(DIVPVP)) Q:DIVPVP=""  D
 . S DIVPANS(+^DD(DIEVF,DIEVFLD,"V",DIVPVP,0))=""
 Q

DIEVK
DIEVK ;SFISC/DPC-KEY VALIDATION ;11:50 AM  5 May 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
KEYVAL(DIVKFLAG,DIVKFDA,DIVKOUT,DIVKFIEN) ;
KEYVALX ;
 ;Init
 N DIVKEYOK
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIVKEYOK=1
 ;
 ;Check input variables
 S DIVKFLAG=$G(DIVKFLAG) I '$$VERFLG^DIEFU(DIVKFLAG,"KQ") S DIVKEYOK=0 G OUT
 S DIVKFDA=$G(DIVKFDA) I '$$VROOT^DIEFU(DIVKFDA) S DIVKEYOK=0 G OUT
 ;
 ;Load key info, and list of records to check
 K ^TMP("DIKK",$J)
 I '$$BUILD^DIEVK1(DIVKFDA,DIVKFLAG) S DIVKEYOK=0 G:DIVKFLAG["Q" OUT
 I $D(^TMP("DIKK",$J,"L")),'$$CHECK(DIVKFDA,DIVKFLAG,$G(DIVKFIEN)) D
 . S DIVKEYOK=0
 ;
OUT ;Move error messages if necessary and quit
 I $G(DIERR),$G(DIVKOUT)]"" D CALLOUT^DIEFU(DIVKOUT)
 K ^TMP("DIKK",$J)
 Q DIVKEYOK
 ;
CHECK(DIVKFDA,DIVKFLAG,DIVKFIEN) ;Loop thru ^TMP and check key integrity
 N DIVKCIEN,DIVKFIL,DIVKIENS,DIVKEY,DIVKEYOK,DIVKQUIT
 ;
 ;If DIVKFIEN passed in, build list of resolved ?n ien's
 I $G(DIVKFIEN)]"",$D(@DIVKFIEN) D
 . S DIVKEY=0
 . F  S DIVKEY=$O(^TMP("DIKK",$J,"L",DIVKEY)) Q:'DIVKEY  D
 .. S DIVKFIL=$P(^TMP("DIKK",$J,"L",DIVKEY),U)
 .. S DIVKIENS=""
 .. F  S DIVKIENS=$O(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,DIVKIENS)) Q:DIVKIENS=""  D
 ... Q:DIVKIENS'["?"
 ... I $E(DIVKIENS)="?",$G(DIVKFLAG)["K",$P($G(^TMP("DIKK",$J,"L",DIVKEY)),U,3)="P" Q
 ... S DIVKCIEN=$$FINDCONV^DIEVK1(DIVKIENS,DIVKFIEN)
 ... Q:DIVKCIEN?.E1(1"+",1"?").E
 ... S ^TMP("DIKK",$J,"F",DIVKEY,DIVKFIL,DIVKCIEN)=""
 ;
 ;Check integrity
 S DIVKEYOK=1,DIVKEY=0
 F  S DIVKEY=$O(^TMP("DIKK",$J,"L",DIVKEY)) Q:'DIVKEY  D  Q:$G(DIVKQUIT)
 . S DIVKFIL=$P(^TMP("DIKK",$J,"L",DIVKEY),U)
 . S DIVKIENS=""
 . F  S DIVKIENS=$O(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,DIVKIENS)) Q:DIVKIENS=""  D  Q:$G(DIVKQUIT)
 .. I '$$CHKREC(DIVKEY,DIVKFIL,DIVKIENS,DIVKFDA,DIVKFLAG,$G(DIVKFIEN)) D
 ... S DIVKEYOK=0 S:DIVKFLAG["Q" DIVKQUIT=1
 Q DIVKEYOK
 ;
CHKREC(DIVKEY,DIVKFIL,DIVKIENS,DIVKFDA,DIVKFLAG,DIVKFIEN) ;
 ;Check integrity of 1 record
 N ACTIENS,CONV,DA,DEC,DEL,FIL,FLD,ML,NULL,OIENS,S,SS,UIR,VAL,X
 ;
 ;Don't need to check primary key for Finding and LAYGO/Finding nodes
 ;used for lookup
 I $E(DIVKIENS)="?",$G(DIVKFLAG)["K",$P($G(^TMP("DIKK",$J,"L",DIVKEY)),U,3)="P" Q 1
 ;
 S UIR=$G(^TMP("DIKK",$J,"L",DIVKEY,"UIR")) M SS=^("SS") Q:UIR="" 1
 ;
 ;Set DA array
 D ACTDA(DIVKIENS,$G(DIVKFIEN),.DA,.CONV)
 ;
 ;Set X array and check for nulls
 ;Set VAL array for values exceeding max length
 ;Set DEC array to data extraction code
 K NULL,VAL,X
 S S=0 F  S S=$O(SS(S)) Q:'S  D  Q:$G(DIVKFLAG)["Q"&$G(NULL)!$G(DEL)
 . S FIL=$P(SS(S),U),FLD=$P(SS(S),U,2),ML=$P(SS(S),U,3)
 . S DEC(S)=^TMP("DIKK",$J,DIVKFIL,FIL,FLD)
 . S X=$$VALUE(FIL,DIVKIENS,.DA,FLD,$G(DIVKFDA),DEC(S),$G(CONV))
 . I X="@",FLD=.01 S DEL=1 Q
 . S X(S)=X
 . I ML,$L(X)'<ML S VAL(S)=X
 . ;
 . I X="@" D ERR742^DIEVK1(FIL,FLD,DIVKEY,DIVKIENS) S NULL=1 Q
 . I X="" D ERR744^DIEVK1(FIL,FLD,DIVKEY,DIVKIENS) S NULL=1 Q
 Q:$G(DEL) 1
 Q:$G(NULL) 0
 ;
 S ACTIENS=$S($G(CONV):$$IENS(.DA),1:DIVKIENS)
 S UIR=$NA(@UIR)
 I $D(@UIR),'$$UNIQIX^DIKK2(UIR,ACTIENS,.DA,.VAL,.DEC,DIVKEY_U_DIVKFIL) D ERR740^DIEVK1(DIVKFIL,DIVKEY,DIVKIENS) Q 0
 I '$$COMP(DIVKEY,DIVKFIL,DIVKIENS,$G(DIVKFDA),.X,.SS,.DEC,$G(DIVKFLAG),$G(DIVKFIEN)) Q 0
 Q 1
 ;
COMP(DIVKEY,DIVKFIL,DIVKIENS,DIVKFDA,DIVKX,SS,DEC,DIVKFLAG,DIVKFIEN) ;
 ;Check uniqueness with subsequent records
 ;in ^TMP("DIKK",$J,"L",key,file)
 N CONV,DA,DIVKQUIT,FIL,FLD,IENS,OK,S,UNIQ,X
 ;
 S OK=1,IENS=DIVKIENS
 F  S IENS=$O(^TMP("DIKK",$J,"L",DIVKEY,DIVKFIL,IENS)) Q:IENS=""  D  Q:$G(DIVKQUIT)
 . ;
 . ;Set DA array
 . D ACTDA(IENS,$G(DIVKFIEN),.DA,.CONV)
 . ;
 . S (UNIQ,S)=0 F  S S=$O(SS(S)) Q:'S  D  Q:UNIQ
 .. S FIL=$P(SS(S),U),FLD=$P(SS(S),U,2)
 .. S X=$$VALUE(FIL,IENS,.DA,FLD,$G(DIVKFDA),DEC(S),$G(CONV))
 .. I "@"[X!(X'=DIVKX(S)) S UNIQ=1
 . ;
 . I 'UNIQ D
 .. D:OK ERR740^DIEVK1(DIVKFIL,DIVKEY,DIVKIENS)
 .. D ERR740^DIEVK1(DIVKFIL,DIVKEY,IENS)
 .. S OK=0 S:$G(DIVKFLAG)["Q" DIVKQUIT=1
 Q OK
 ;
VALUE(DIVKEYFL,DIVKIENS,DA,DIVKEYFD,DIVKFDA,DIVKDEC,DIVKCONV) ;
 N DIVKVALU,X
 I $G(DIVKFDA)="" X DIVKDEC Q X
 ;
 ;Get value from FDA
 S DIVKVALU=$G(@DIVKFDA@(DIVKEYFL,DIVKIENS,DIVKEYFD),U)
 Q:"@"[DIVKVALU "@"
 Q:DIVKVALU'=U DIVKVALU
 ;
 ;Get value from file
 I DIVKIENS?.E1(1"+",1"?").E,'$G(DIVKCONV) Q ""
 X DIVKDEC
 Q X
 ;
IENS(DA) ;Return IENS from DA array
 N I,IENS
 S IENS=$G(DA)_"," F I=1:1:$O(DA(" "),-1) S IENS=IENS_DA(I)_","
 Q IENS
 ;
DA(IENS,DA) ;
 N I
 K DA S DA=$P(IENS,",") F I=2:1:$L(IENS,",")-1 S DA(I-1)=$P(IENS,",",I)
 Q
 ;
ACTDA(IENS,DIVKFIEN,DA,CONV) ;Set the DA array from the IENS
 ;If ?'s replaced with actual IENs, return CONV=1
 K CONV
 I IENS["?",$G(DIVKFIEN)]"",$D(@DIVKFIEN) D
 . N RIENS
 . S RIENS=$$FINDCONV^DIEVK1(IENS,DIVKFIEN)
 . D DA(RIENS,.DA)
 . I RIENS'["?",RIENS'["+" S CONV=1
 E  D DA(IENS,.DA)
 Q

DIEVK1
DIEVK1 ;SFISC/MKO-KEY VALIDATION ;06:38 PM  6 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, 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)=$$FILENAME^DIALOGZ(FILE) S:P(2)?." " P(2)="#"_FILE ;**CCO/NI FILE NAME
 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)=$$FILENAME^DIALOGZ(FILE) S:P(2)?." " P(2)="#"_FILE ;**CCO/NI FILE NAME
 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)=$$FILENAME^DIALOGZ(FILE) S:P(2)?." " P(2)="#"_FILE ;**CCO/NI FILE NAME
 S P("IENS")=IENS
 S PEXT("FILE")=FILE,PEXT("KEY")=KEY,PEXT("IENS")=IENS
 D BLD^DIALOG(746,.P,.PEXT)
 Q

DIEVS
DIEVS ;SFIRMFO/DPC-BATCH VALIDATION ;2:03 PM  21 Jul 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;;
VALS(DIVSFLAG,DIVSEFDA,DIVSIFDA,DIVSMSG) ;
VALSX ;
 N DIVSFILE,DIVSIENS,DIVSFLD,DIVSVAL,DIVSNFLG,DIVSANS,DIVSTYPE
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIVSFLAG=$G(DIVSFLAG) I '$$VERFLG^DIEFU(DIVSFLAG,"KRU") G OUT
 S DIVSEFDA=$G(DIVSEFDA) I '$$VROOT^DIEFU(DIVSEFDA) G OUT
 S DIVSIFDA=$G(DIVSIFDA) I '$$VROOT^DIEFU(DIVSIFDA) G OUT
 I DIVSIFDA=""!(DIVSIFDA=DIVSEFDA) D BLD^DIALOG(313) G OUT
 S DIVSNFLG=$E("R",DIVSFLAG["R")_"FU"
 N DIVSNG S DIVSNG=0
 S DIVSFILE=""
 F  S DIVSFILE=$O(@DIVSEFDA@(DIVSFILE)) Q:DIVSFILE=""  D
 . S DIVSIENS=""
 . F  S DIVSIENS=$O(@DIVSEFDA@(DIVSFILE,DIVSIENS)) Q:DIVSIENS=""  D
 . . S DIVSFLD=""
 . . F  S DIVSFLD=$O(@DIVSEFDA@(DIVSFILE,DIVSIENS,DIVSFLD)) Q:DIVSFLD=""  D
 . . . S DIVSVAL=@DIVSEFDA@(DIVSFILE,DIVSIENS,DIVSFLD)
 . . . ;Quit if field is w-p -- no validation.
 . . . D DTYP^DIOU(DIVSFILE,DIVSFLD,.DIVSTYPE)
 . . . I DIVSTYPE=5 S @DIVSIFDA@(DIVSFILE,DIVSIENS,DIVSFLD)=DIVSVAL Q
 . . . D VAL^DIEV(DIVSFILE,DIVSIENS,DIVSFLD,DIVSNFLG,DIVSVAL,.DIVSANS,DIVSIFDA)
 . . . I DIVSANS=U S @DIVSIFDA@(DIVSFILE,DIVSIENS,DIVSFLD)=U,DIVSNG=1
 ;Now do Key Validation
 I DIVSFLAG'["U" S DIVSNG='$$KEYVAL^DIEVK($E("K",DIVSFLAG["K"),DIVSIFDA)
OUT I $G(DIVSMSG)]"" D CALLOUT^DIEFU(DIVSMSG)
 Q

DIEZ
DIEZ ;SFISC/GFT-COMPILE INPUT TEMPLATE ; 30NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I $G(DUZ(0))'="@" W:$D(^DI(.84,0)) $C(7),$$EZBLD^DIALOG(101) G K
EN1 D:'$D(DISYS) OS^DII
 I '$D(^DD("OS",DISYS,"ZS")) W $$EZBLD^DIALOG(820),$C(7) G K
 S U="^" S:'$G(DTIME) DTIME=300 N L,DNM
 D SIZ^DIPZ0(8033) G:$D(DTOUT)!($D(DUOUT))!('X) K S DMAX=X Q:$D(DIX)
TEM K DIC S DIC="^DIE(",DIC(0)="AEQ",DIC("W")="W ?40,""FILE #"",$P(^(0),U,4) W:$D(^(""ROU"")) ?60,^(""ROU"")",DIC("S")="I Y'<1" D ^DIC G:'$D(^DIE(+Y,"DR")) K S DIPZ=+Y
 D RNM^DIPZ0(8033) G:$D(DTOUT)!($D(DUOUT))!(X="") K S DNM=X K DIC
 W ! S DIR(0)="Y",DIR("A")=$$EZBLD^DIALOG(8020) D ^DIR K DIR G:'Y!($D(DIRUT)) K
 S X=DNM,Y=DIPZ K DIPZ
EN ;
 W:'$G(DIEZS) ! K ^UTILITY($J),DRN N L,DIEZQ,DIR S DMAX=DMAX-2150,DNM=X,DIEZ=+Y,DRN="",DRD=0,DIEZQ=0 D DELETROU(X)
 S DP=$P(^DIE(DIEZ,0),U,4),DIE=^DIC(DP,0,"GL")
 I '$D(^DIE(DIEZ,"DR",1,DP)) S ^DIE(DIEZ,"DR",1,DP)=^DIE(DIEZ,"DR")
 D DT^DICRW S X=-1
 K T S T(1)=$P(^DIE(DIEZ,0),U),T(2)=$$EZBLD^DIALOG(8033),T(3)=DP D BLD^DIALOG(8024,.T,"","DIR") W:'$G(DIEZS) !,DIR K T
 D UNCAF(DIEZ)
 K DOV,^DIE(DIEZ,"RD"),DR S DR=^("DR",1,DP),(DIER,DL)=1,DIEZL=0,DIEZAB=U
 D NEWROU F %=0:0 S %=$O(^DIE(DIEZ,"DR",99,%)) Q:%=""  F %Y=0:0 S %Y=$O(^DIE(DIEZ,"DR",99,%,%Y)) Q:%Y=""  S F=0,Q=^DIE(DIEZ,"DR",99,%,%Y) D QFF^DIEZ2 S X=" S DR(99,"_%_","_%Y_")="_Q D L^DIEZ2
 S X=" N DIEZTMP,DIEZAR,DIEZRXR,DIIENS,DIXR K DIEFIRE,DIEBADK S DIEZTMP=$$GETTMP^DIKC1(""DIEZ"")" D L^DIEZ2
 S X=" M DIEZAR=^DIE("_DIEZ_",""AR"") S DICRREC=""TRIG^DIE17""" D L^DIEZ2
 N DIEZTMP S DIEZTMP=$$GETTMP^DIKC1("DIEZ")
 S X=" S:$D(DTIME)[0 DTIME=300 S D0=DA,DIIENS=DA_"","",DIEZ="_DIEZ_",U=""^""" G ^DIEZ0
 ;
NEWROU ;
 K ^UTILITY($J,0) S DQ=0,T=99,L=3
 S ^UTILITY($J,0,1)=DNM_DRN_" ; "_$P("GENERATED FROM '"_$P(^DIE(DIEZ,0),U,1)_"' INPUT TEMPLATE(#"_DIEZ_"), FILE "_DP,U,DRN="")_";"_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3)
 S ^UTILITY($J,0,2)=" D DE G BEGIN"
 S ^UTILITY($J,0,3)="BEGIN S DNM="""_DNM_DRN_""",DQ=1"
 I '$D(DRN(+DRN)) S DRN(+DRN)=U
 Q
 ;
EN2(Y,DIEZFLGS,X,DMAX,DIEZRLA,DIEZZMSG) ;Silent or Talking with parameter passing
 ;and optionally return list of routines built and if successful
 ;IEN,FLAGS,ROUTINE,RTNMAXSIZE,RTNLISTARRAY,MSGARRAY
 ;Y=TEMPLATE IEN (required)
 ;FLAGS="T"alk  (optional)
 ;X=ROUTINE NAME (required)
 ;DMAX=ROUTINE SIZE (optional)
 ;DIEZRLA=ROUTINE LIST ARRAY, by value (optional)
 ;DIEZZMSG=MESSAGE ARRAY (optional) (default ^TMP)
 ;*
 ;DIEZS will be used to indicate "silent" if set to 1
 ;Write statements are made conditional, if not "silent"
 ;*
 N DIEZS,DNM,DIQUIET,DIEZRIEN,DIEZRLAZ,DIEZRLAF
 N DIK,DIC,%I,DICS
 S DIEZS=$G(DIEZFLGS)'["T"
 S:DIEZS DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D
 .N Y,DIEZFLGS,X,DMAX,DIEZRLA,DIEZS
 .D INIZE^DIEFU
 I $G(Y)'>0 D BLD^DIALOG(1700,"IEN for Edit Template missing or invalid") G EN2E
 I '$D(^DIE(Y,0)) D BLD^DIALOG(1700,"No Edit Template on file with IEN="_Y) G EN2E
 I $G(X)']"" D BLD^DIALOG(1700,"Routine name missing this Edit Template, IEN="_Y) G EN2E
 I X'?1U.NU&(X'?1"%"1U.NU) D BLD^DIALOG(1700,"Routine name invalid") G EN2E
 I $L(X)>7 D BLD^DIALOG(1700,"Routine name too long") G EN2E
 S DIEZRLA=$G(DIEZRLA,"DIEZRLAZ"),DIEZRIEN=Y
 S:DIEZRLA="" DIEZRLA="DIEZRLAZ" S:$G(DMAX)<2500!($G(DMAX)>^DD("ROU")) DMAX=^DD("ROU")
 S DIEZRLAF=""
 K @DIEZRLA
 D EN
 G:'DIEZS!(DIEZRLAF) EN2E
 D BLD^DIALOG(1700,"Compiling Edit Template (IEN="_DIEZRIEN_")"_$S(DIEZRLAF=0:", routine name too long",1:""))
EN2E I 'DIEZS D MSG^DIALOG() Q
 I $G(DIEZZMSG)]"" D CALLOUT^DIEFU(DIEZZMSG)
 Q
 ;
RECOMP S DIX=1 D DIEZ Q:'$D(DIX)  N DIMAX S DIMAX=DMAX
 F DIX=0:0 S DIX=$O(^DIE(DIX)) Q:DIX'>0  I $D(^(DIX,0)),$D(^("ROU")) S %=$P(^(0),"^",1),X=$E(^("ROU"),2,99) I X]"" S Y=DIX,DMAX=DIMAX D EN
 ;
K K %,DDH,DIC,DIX,DIPZ,DMAX,DNM,DTOUT,DIRUT,DIROUT,DUOUT,X,Y Q
 ;DIALOG #101  'only those with programmer's access'
 ;       #820  'no way to save routines on the system'
 ;       #8020 'Should the compilation run now?'
 ;       #8024 'Compiling template name Input template of file n'
 ;       #8033 'Input template'
UNCAF(DIEZ) ;
 ; for one compiled input template (DIEZ), delete its "AF" entries
 N %,X S X=""
 F  S X=$O(^DIE("AF",X)) Q:X=""  K:'X ^(X,DIEZ) S %=0 F  S %=$O(^DIE("AF",X,%)) Q:%'>0  K:$D(^(%,DIEZ)) ^(DIEZ)
 Q
 ;
UNC(DIEZ,DIFLAGS) ;
 ; DBS: silent entry point to uncompile an input template
 ; DIEZ = IEN of input template to uncompile
 ; DIFLAGS = flags:
 ;     D = compiled routines are also deleted
 K ^DIE(DIEZ,"ROU")
 D UNCAF(DIEZ)
 I $G(DIFLAGS)["D" D
 . N DINAME S DINAME=$G(^DIE(DIEZ,"ROUOLD")) Q:DINAME=""
 . N DIROU,DISUF F DISUF="",1:1 D  Q:DIROU=""
 . . S DIROU=DINAME_DISUF I '$$ROUEXIST^DILIBF(DIROU) S DIROU="" Q
 . . N X S X=DIROU X $G(^DD("OS",DISYS,"DEL"))
 Q
 ;
 ;
DELETROU(DIEZNAME) ;DELETE THE ROUTINES NAMED 'DIEZNAME' CONCATENATED WITH NUMBER
 Q:DIEZNAME=""  Q:$L($T(+2^@DIEZNAME),";")>2  ;TRY TO KEEP FROM BLOWING AWAY A REAL ROUTINE!
 N DIEZ,DIEZDEL,X,DIEZEXST,C
 S C=0,DIEZEXST="I $L($T(^@X))",DIEZDEL=$G(^DD("OS",DISYS,"DEL")) Q:DIEZDEL=""
 F DIEZ=1:1:1000 D  Q:C>20  ;STOP IF THERE IS A GAP OF 20
 .S X=DIEZNAME_DIEZ X DIEZEXST I  X DIEZDEL S C=0 Q
 .S C=C+1
 S X=DIEZNAME X DIEZEXST I  X DIEZDEL
 Q

DIEZ0
DIEZ0 ;SFISC/GFT-COMPILE INPUT TEMPLATE ;13SEP2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D L
DL S DQ=0,DK=0,DQFF=0
MR S DK=DK+1,DH=$P(DR,";",DK),DI=$P(DH,":",1),(DIEZP,DIEZDUP,DIEZR)="" G:'DI K:DI=0,PB S DPR=$P(DH,"//",2,99),DM=+DI S:DPR]"" DI=$P(DI,"//",1),DH=""
 G K:DM=DI S Y=$P(DI,DM,2,99) G MR:Y=""!'$D(^DD(DP,DM,0)) F %=1:1 S X=$P(Y,$C(126),%) Q:X=""  S:X="d" DIEZDUP=X S:X="R" DIEZR=X S:X'="d"&(X'="R")&(X'="T") DIEZP=X D:X="T"
 .I $D(^DD(DP,DM,.1)) S DIEZP=^(.1) Q
 .I +$P(^DD(DP,DM,0),U,2),$P(^DD(+$P(^(0),U,2),.01,0),U,2)["W",$D(^(.1)) S DIEZP=^(.1)
 .Q
 S (DI,DM)=+DI G S
K S DM=$P(DH,":",2),DM=$S(DM:DM,1:+DI) I DI,$D(^DD(DP,+DI)) G S
NX ;
 S DI=$O(^DD(DP,+DI)),DIEZP="" S:DI="" DI=-1 G MR:DI'>0,MR:DI>DM
S S Y=^DD(DP,+DI,0),DV=$P(Y,U,2)_$E("#",Y["DINUM")_DIEZR_DIEZDUP ;**CCO/NI FIELD NAME (THRU NEXT 2 LINES)
 S X=$S(DIEZP=""&'DV:"$$LABEL^DIALOGZ(DP,DIFLD)",1:""""_DIEZP_"""")
 S DW=$P(Y,U,4) G NX:$A(DW)=32 I T>DMAX D SV G:DIEZQ K^DIEZ2 G S
 W:'$G(DIEZS) "." S DQ=DQ+1,DI=+DI,DU=$P(Y,U,3),%=" S "
 K DIEZOT I DV["O",$D(^(2)) D O^DIEZ2
 I DQFF S %=" D:$D(DG)>9 F^DIE17,DE S DQ="_DQ_",",DQFF=0
 I DV S Y=X,X=DQ_%_"D=0 K DE(1) ;"_DI D L,DRN G MUL^DIEZ2
VARS S ^UTILITY($J,U,$P(DW,";",1),$P(DW,";",2),DQ)="",T=T+35,X=DQ_%_"DW="""_DW_""",DV="""_DV_""",DU="""",DIFLD="_DI_",DLB="_X D L ;**CCO/NI COMPILE 'SET DLB=$$LABEL^DIALOGZ...' RATHER THAN FIELD NAME, SO IT WORKS FOR ANY LANGUAGE
 I $D(DIEZOT) S X=DIEZOT D L K DIEZOT
 S DIEZXREF=$O(^DD("IX","F",DP,DI,0))
 I $O(^DD(DP,DI,1,0))>0!(DV["a")!DIEZXREF D
 . S DQFF=1,X=" S DE(DW)=""C"_DQ_U_DNM_DRN_""""
 . S:DIEZXREF X=X_",DE(DW,""INDEX"")=1"
 . ;Determine whether this field is part of a field-level key.
 . ;Also, build list: DIEZKEY(uniquenessIndex)=""
 . ;for those indexes that are uniqueness indexes for keys.
 . N DIEZK,DIEZUI
 . K DIEZKEY S DIEZK=0
 . F  S DIEZK=$O(^DD("KEY","F",DP,DI,DIEZK)) Q:'DIEZK  D
 .. S DIEZUI=$P($G(^DD("KEY",DIEZK,0)),U,4) Q:'DIEZUI
 .. S:$P($G(^DD("IX",DIEZUI,0)),U,6)="F" DIEZKEY(DIEZUI)=""
 . S:$D(DIEZKEY) X=X_",DE(DW,""KEY"")=""$$K"_DQ_""""
 . D L
 K DIEZXREF
X D PR,XREF^DIEZ2:DQFF S %=$P(Y,U,5,99),X=$F(%,"%DT=""") I X,DPR?1"/".E S Y=$F(%,"E",X) I Y S %=$E(%,1,Y-2)_$E(%,Y,999)
 I DPR?1"//".E S %=""
 D AF^DIEZ2 S X="X"_DQ_" " I "Q"[% S X=X_"Q" D L G NX
 S X=X_% D L I DV["F" S X=" I $D(X),X'?.ANP K X" D L
 S X=" Q" D L S X=" ;" D L G NX
 ;
PB I DH="" S:'$D(DOV(DL)) DOV(DL)=0 S DOV(DL)=$O(^DIE(DIEZ,"DR",DIER,DP,DOV(DL))) S:DOV(DL)="" DOV(DL)=-1 G UP:DOV(DL)<0 S DR=^(DOV(DL)),DK=0 G MR
 S DQ=DQ+1 I DH?1"@".N S X=DQ_" S DQ="_(DQ+1)_" ;"_DH,^UTILITY($J,"AB",DIEZAB,DH)=DQ_U_DNM_DRN G M
 S X=DQ_" D:$D(DG)>9 F^DIE17,DE S Y=U,DQ="_DQ_" " I "Q"[DH S X=X_"G A" G M
 I DH?1"^".E S F=0,X=X_$P(DH,U,5,999),Q=$P(DH,U,1,3) D L,DRN,QFF^DIEZ2,DIERN^DIEZ2 S X=" S DGO=""^"_DNM_%_""",DC="_Q_" G DIEZ^DIE0",DRN(%)=$P(DH,U,2)_U_DIERN_U_$P(DH,U,3)_U_U_DQ_U_DRN D L S X="R"_DQ_" D DE G A" D L S X=" ;" G M
 S X=X_"D X"_DQ_" D:$D(DIEFIRE)#2 FIREREC^DIE17 G A:$D(Y)[0,A:Y=U S X=Y,DIC(0)=""F"",DW=DQ G OUT^DIE17" D L S X="X"_DQ_" "_DH D L S X=" Q"
M D L G MR
 ;
UP S DQ=DQ+1,X=DQ_" G "_(DL>1)_"^DIE17" D L,^DIEZ1 G:DIEZQ K^DIEZ2 S Y=0
LV S Y=$O(DRN(Y)) S:Y="" Y=-1 I Y<0 G ^DIEZ2
 S X=DRN(Y) G LV:X=U S DRN=Y,DP=+X,DIER=$P(X,U,2),DL=DIER\1,DIE=U_$P(X,U,3),DIEZL=+$P(X,U,4),DIEZAB=$P(X,U,5)_U_DNM_$P(X,U,6),DR=$S($D(^DIE(DIEZ,"DR",DIER,DP)):^(DP),1:"0:9999999"),DRN(Y)=U D N S:+DR=.01!(DR?1"0:".E) ^(3)=^(3)_"+D G B" G DL
 ;
PR ;
 D DU^DIEZ2:DU]"" S X=" G RE" I DW="0;1",DL>1,DQ=1 S X=X_":'D S DQ=2 G 2"
 D PR^DIEZ2:DPR]""
L S L=L+1,^UTILITY($J,0,L)=X,T=T+$L(X)+2 S:X?1N.E T=T+15 Q
 ;
SV D DRN
 S X=DQ+1_" D:$D(DG)>9 F^DIE17 G ^"_DNM_%,DQ=% D L,^DIEZ1 Q:DIEZQ
N G NEWROU^DIEZ
 ;
DRN F %=DRN+1:1 Q:'$D(DRN(%))

DIEZ1
DIEZ1 ;SFISC/GFT-COMPILE INPUT TEMPLATE ;30MAY2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D QF^DIEZ2 S L=2,X="DE S DIE="_Q_",DIC=DIE,DP="_DP_",DL="_DL_",DIEL="_DIEZL_",DU="""" K DG,DE,DB Q:$O("_DIE_"DA,""""))=""""",DS=-1 D L S X=""
DL S DS=$O(^UTILITY($J,U,DS)) S:DS="" DS=-1 I DS<0 K ^UTILITY($J,U) G CN
 S DSN=DS S:+DS'=DS DSN=""""_DSN_"""" S DPP=0,X=X_" I $D(^("_DSN_")) S %Z=^("_DSN_")"
DP S DPP=$O(^UTILITY($J,U,DS,DPP)) I DPP="" D L S X="" G DL
 S %=$O(^(DPP,0)) I +DPP=DPP S Y="P(%Z,U,"_DPP_") S:%]"""" DE("_%_")=%"
 E  S Y="E(%Z,"_+$E(DPP,2,9)_","_+$P(DPP,",",2)_") S:%'?."" "" DE("_%_")=%"
 F %=%:0 S %=$O(^(%)) Q:'%  S Y=Y_",DE("_%_")=%"
 I $L(X)+$L(Y)>240 D L S X=" I "
 S X=X_" S %=$"_Y G DP
 ;
CN F X=" K %Z Q"," ;","W "_$S($D(^DIE(DIEZ,"W")):"S DQ(DQ)=DLB_U_DV_U_U_DW "_^("W"),1:"W !?DL+DL-2,DLB_"": """) D L
 F %=1:1 S X=$E($T(TEXT+%),4,999) Q:X=""  D L
SAVE I $L(DNM_DRN)>8 S DIEZQ=1 W:'$G(DIEZS) $C(7),!,DNM_DRN_$$EZBLD^DIALOG(1503) S:$G(DIEZRLA)]"" DIEZRLAF=0 Q
 S X=DNM_DRN D:'$D(DISYS) OS^DII X ^DD("OS",DISYS,"ZS") N DIR D BLD^DIALOG(8025,DNM_DRN,"","DIR") W:'$G(DIEZS) !,DIR S:$G(DIEZRLA)]"" @DIEZRLA@(DNM_DRN)="",DIEZRLAF=1
 S DRN(+DRN)=U,T=0,DRN=DQ Q
 ;
L S L=L+.001,^UTILITY($J,0,L)=X Q
 ;
 ;DIALOG #1503  'routine name is too long...'
 ;       #8025  'routine filed'
 ;
TEXT ;;
 ;; Q
 ;;O D W W Y W:$X>45 !?9
 ;; I $L(Y)>19,'DV,DV'["I",(DV["F"!(DV["K")) G RW^DIR2
 ;; W:Y]"" "// " I 'DV,DV["I",$D(DE(DQ))#2 K X S X("FIELD")=DIFLD,X("FILE")=DP W "  ("_$$EZBLD^DIALOG(710,.X)_")" K X S X="" Q  ;**
 ;;TR Q:DV["K"&(DUZ(0)'="@")  R X:DTIME E  S (DTOUT,X)=U W $C(7)
 ;; Q
 ;;A K DQ(DQ) S DQ=DQ+1
 ;;B G @DQ
 ;;RE G A:DV["K"&(DUZ(0)'["@"),PR:$D(DE(DQ)) D W,TR
 ;;N I X="" G NKEY:$D(^DD("KEY","F",DP,DIFLD)),A:DV'["R",X:'DV,X:D'>0,A
 ;;RD G QS:X?."?" I X["^" D D G ^DIE17
 ;; I X="@" D D G Z^DIE2
 ;; I X=" ",DV["d",DV'["P",$D(^DISV(DUZ,"DIE",DLB)) S X=^(DLB) I DV'["D",DV'["S" W "  "_X
 ;;T G M^DIE17:DV,^DIE3:DV["V",P:DV'["S" I X?.ANP D SET^DIED I 'DDER G V
 ;; K DDER G X
 ;;P I DV["P" S DIC=U_DU,DIC(0)=$E("EN",$D(DB(DQ))+1)_"M"_$E("L",DV'["'") S:DIC(0)["L" DLAYGO=+$P(DV,"P",2) G:DV["*" AST^DIED D NOSCR^DIED S X=+Y,DIC=DIE G X:X<0
 ;; G V:DV'["N" D D I $L($P(X,"."))>24 K X G Z
 ;; I $P(DQ(DQ),U,5)'["$",X?.1"-".N.1".".N,$P(DQ(DQ),U,5,99)["+X'=X" S X=+X
 ;;V D @("X"_DQ) K YS
 ;;UNIQ I DV["U",$D(X),DIFLD=.01 K % M %=@(DIE_"""B"",X)") K %(DA) K:$O(%(0)) X
 ;;Z K DIC("S"),DLAYGO I $D(X),X'=U D:$G(DE(DW,"INDEX")) SAVEVALS G:'$$KEYCHK UNIQFERR^DIE17 S DG(DW)=X S:DV["d" ^DISV(DUZ,"DIE",DLB)=X G A
 ;;X W:'$D(ZTQUEUED) $C(7),"??" I $D(DB(DQ)) G Z^DIE17
 ;; S X="?BAD"
 ;;QS S DZ=X D D,QQ^DIEQ G B
 ;;D S D=DIFLD,DQ(DQ)=DLB_U_DV_U_DU_U_DW_U_$P($T(@("X"_DQ))," ",2,99) Q
 ;;Y I '$D(DE(DQ)) D O G RD:"@"'[X,A:DV'["R"&(X="@"),X:X="@" S X=Y G N
 ;;PR S DG=DV,Y=DE(DQ),X=DU I $D(DQ(DQ,2)) X DQ(DQ,2) G RP
 ;;R I DG["P",@("$D(^"_X_"0))") S X=+$P(^(0),U,2) G RP:'$D(^(Y,0)) S Y=$P(^(0),U),X=$P(^DD(X,.01,0),U,3),DG=$P(^(0),U,2) G R
 ;; I DG["V",+Y,$P(Y,";",2)["(",$D(@(U_$P(Y,";",2)_"0)")) S X=+$P(^(0),U,2) G RP:'$D(^(+Y,0)) S Y=$P(^(0),U) I $D(^DD(+X,.01,0)) S DG=$P(^(0),U,2),X=$P(^(0),U,3) G R
 ;; X:DG["D" ^DD("DD") I DG["S" S %=$P($P(";"_X,";"_Y_":",2),";") I %]"" S Y=$S($G(DUZ("LANG"))'>1:%,'DIFLD:%,1:$$SET^DIQ(DP,DIFLD,Y))
 ;;RP D O I X="" S X=DE(DQ) G A:'DV,A:DC<2,N^DIE17
 ;;I I DV'["I",DV'["#" G RD
 ;; D E^DIE0 G RD:$D(X),PR
 ;; Q
 ;;SAVEVALS S @DIEZTMP@("V",DP,DIIENS,DIFLD,"O")=$G(DE(DQ)) S:$D(^("F"))[0 ^("F")=$G(DE(DQ))
 ;; I $D(DE(DW,"4/")) S @DIEZTMP@("V",DP,DIIENS,DIFLD,"4/")=""
 ;; E  K @DIEZTMP@("V",DP,DIIENS,DIFLD,"4/")
 ;; Q
 ;;NKEY W:'$D(ZTQUEUED) "??  Required key field" S X="?BAD" G QS
 ;;KEYCHK() Q:$G(DE(DW,"KEY"))="" 1 Q @DE(DW,"KEY")

DIEZ2
DIEZ2 ;SFISC/GFT-COMPILE INPUT TEMPLATE ;15JUN2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DIEZAR D RECXR^DIEZ4(.DIEZAR)
 K ^DIE(DIEZ,"AR") M:$D(DIEZAR) ^DIE(DIEZ,"AR")=DIEZAR
 S %X="^UTILITY($J,""AF"",",%Y="^DIE(""AF""," D %XY^%RCR
 K ^DIE(DIEZ,"AB") S %X="^UTILITY($J,""AB"",",%Y="^DIE(DIEZ,""AB""," D %XY^%RCR
 S ^DIE(DIEZ,"ROUOLD")=DNM,^("ROU")=U_DNM
K K ^DIBT(.402,1,DIEZ),^UTILITY($J)
 K @DIEZTMP,DIEZTMP,DIEZAR,DIER,DIERN
 K DIE,DINC,DK,DL,DMAX,DNR,DP,DQ,DQFF,DRD,DS,DSN,DV,DW,DI,DH,%,%X,%Y,%H,X,Y
 K DIEZ,DIEZDUP,DIEZR,Q,DPP,DPR,DM,DR,DU,T,F,DRN,DOV,DIEZL,DIEZP,DIEZAB
 Q
 ;
XREF ;
 N DIEZR,DIEZX,DIEZLN
 S X="C"_DQ_" G C"_DQ_"S:$D(DE("_DQ_"))[0 K DB" D L
 S DIEZX=L,DIEZLN=0 ;remember cross-refs will start after 'L'
 F %=0:0 S %=$O(^DD(DP,DI,1,%)) Q:%'>0  S DW=^(%,2),X=" S X=DE("_DQ_"),DIC=DIE" D SK ;first build the KILL XREFS
 I DV["a" S X=" S X=DE("_DQ_"),DIIX=2_U_DIFLD D AUDIT^DIET" D X
 ;I X]"" S X="C"_DQ_" ;" D L
 D OVERFLO
 S X="C"_DQ_"S S X="""" G:DG(DQ)=X C"_DQ_"F1 K DB" D L S X=""
 S DIEZX=L,DIEZLN=L
 F %=0:0 S %=$O(^DD(DP,DI,1,%)) Q:%'>0  S DW=^(%,1),X=X_" S X=DG(DQ),DIC=DIE" D SK ;then the SET XREFS
 I DV["a" S X=X_" I $D(DE("_DQ_"))'[0!($G(^DD(DP,DIFLD,""AUDIT""))[""y"") S X=DG(DQ),DIIX=3_U_DIFLD D AUDIT^DIET" D X
 D OVERFLO
 ;Build index code and code to check key
 D INDEX
 S X=X_" Q" D L
 I $D(DIEZKEY) D GETKEY^DIEZ3(DP,DI,.DIEZKEY,DQ) K DIEZKEY
 Q
 ;
SK D X I "Q"[DW S X=" ;" G X
 I DW["Q",^DD(DP,DI,1,%,0)["MUMPS" S Q=DW,F=0 D QFF S X=" X "_Q G X
 S X=" "_DW
X D L S DIEZLN=DIEZLN+$L(X),X="" Q
 ;
OVERFLO I DIEZLN+T+100<DMAX!'DIEZLN Q
 K ^UTILITY($J,"DIEZXR") M ^UTILITY($J,"DIEZXR")=^UTILITY($J,0)
 S DIEZR=DRN,(DIEZR(1),DRN)=$O(DRN(""),-1)+1 D
 .N T,DQ,L
 .D NEWROU^DIEZ ;make a new routine holding just the X-REFS
 .F T=2:1 S DIEZX=DIEZX+1 Q:'$D(^UTILITY($J,"DIEZXR",DIEZX))  S ^UTILITY($J,0,T)=^(DIEZX) K ^UTILITY($J,"DIEZXR",DIEZX)
 .F  K ^UTILITY($J,0,T) S T=$O(^(T)) Q:'T
 .D SAVE^DIEZ1
 K ^UTILITY($J,0) M ^UTILITY($J,0)=^UTILITY($J,"DIEZXR")
 S DRN=DIEZR,T=T-DIEZLN,X=" D ^"_DNM_DIEZR(1) D L
 Q
 ;
MUL ;
 S DNR=%,DW=$P(DW,";",1),X=$P(^DD(+DV,0),U,4)_U_DV_U_DW_U,%=^(.01,0),DV=+DV_$P(%,U,2)
 G 1:DV'["W" I DPR]"" S F=0,Q=DPR D QFF S X=" S DE(1,0)="_Q D L
WPEGP S X=" S Y=""^"_$P(%,U,2,9)_""" S $P(Y,U)="_$S(DIEZP]"":""""_DIEZP_"""",1:"$$LABEL^DIALOGZ(DP,"_DI_")")_" S DG="""_DW_""",DC=""^"_+DV_""" D DIEN^DIWE K DE(1) G A" D L S X=" ;" D L,AF ;**CC0/NI WORD-PROCESSING FIELD LABEL
 S ^UTILITY($J,"AF",+DV,.01,DIEZ)="" D AB G NX^DIEZ0
 ;
1 ;**CCO/NI COMPILE 'SELECT FIELD:' SO IT WORKS FOR ANY LANGUAGE
 S X=" S DIFLD="_DI_",DGO=""^"_DNM_DNR_""",DC="""_X_""",DV="""_DV_""",DW=""0;1"",DOW="_$S(DIEZP]"":""""_DIEZP_"""",1:"$$LABEL^DIALOGZ(DP,DIFLD)")_",DLB=$P($$EZBLD^DIALOG(8042,DOW),"": "") S:D DC=DC_D",DPP=DV["M",DU=$P(^(0),U,3) D L,DU:DU]""
 S X=$P(" G RE:D",U,DPP)_" I $D(DSC("_+DV_"))#2,$P(DSC("_+DV_"),""I $D(^UTILITY("",1)="""" X DSC("_+DV_") S D=$O(^(0)) S:D="""" D=-1 G M"_DQ D L
 S:+DW'=DW DW=""""_DW_"""" S X=" S D=$S($D("_DIE_"DA,"_DW_",0)):$P(^(0),U,3,4),$O(^(0))'="""":$O(^(0)),1:-1)" D L
 S X="M"_DQ_" I D>0 S DC=DC_D I $D("_DIE_"DA,"_DW_",+D,0)) S DE("_DQ_")=$P(^(0),U,1)" D L
 D PR^DIEZ0 S X="R"_DQ_" D DE" D L
 S X=$S(DPP:" S D=$S($D("_DIE_"DA,"_DW_",0)):$P(^(0),U,3,4),1:1) G "_DQ_"+1",1:" G A") D L S X=" ;" D L,AF,DIERN
 S DRN(DNR)=+DV_U_DIERN_DIE_"D"_DIEZL_","_DW_","_U_(DIEZL+1)_U_DQ_U_DRN G NX^DIEZ0
 ;
DIERN ;
 N M S DIERN=DL+1,M=$P(DR,";",DK+1) S:M?1"^"1.NP DK=DK+1,DIERN=$P(M,U,2) Q
 ;
AF ;
 S ^UTILITY($J,"AF",DP,DI,DIEZ)=""
AB I '$D(^UTILITY($J,"AB",DIEZAB,DI)) S ^(DI)=DQ_U_DNM_DRN S:DPR?1"/".E ^(DI,"///")=""
 Q
 ;
DU S F=0,Q=DU D QFF S X=" S DU="_Q,DU=""
L S L=L+1,^UTILITY($J,0,L)=X,T=T+$L(X)+2 Q
 ;
O ;
 S F=0,Q=^(2) D QFF S DIEZOT=" S DQ("_DQ_",2)="_Q Q
 ;
PR ;
 F %=1,2,3 Q:$E(DPR,%)'="/"
 S X=$E(DPR,%,999),Q=X,F=0 D QFF I $A(X)-94 S X=" S Y="_Q
 E  S X=" "_$E(X,2,999) D L S X=" S Y=X"
 D L S X=" G Y" I %>1 S DPP=0,X=" S X=Y,DB(DQ)=1"_$S(%=3:",DE(DW,""4/"")=""""",1:"")_" G:X="""" N^DIE17:DV,A I $D(DE(DQ)),DV[""I""!(DV[""#"") D E^DIE0 G A:'$D(X)" D L S X=" G "_$S(%=3:"RD:X=""@"",Z",1:"RD")
 Q
QF ;
 S F=0,Q=DIE
QFF ;
 S F=$F(Q,"""",F) I F S Q=$E(Q,1,F-1)_$E(Q,F-1,999),F=F+1 G QFF
 S Q=""""_Q_""""
 Q
 ;
INDEX ;Build code field and record level cross references.
 ;In:
 ; DP = file #
 ; DI = field #
 ; DIEZKEY(xref#) = "" : for each xref that is a Uniqueness Index
 ;                       for a simple (single-field key)
 N DIEZCNT,DIEZFLST,DIEZI,DIEZRLST,DIEZXR,DIEZXREF
 S DIEZCNT=0
 ;
 ;Get field- and record-level xrefs
 D LOADFLD^DIKC1(DP,DI,"KS","","@DIEZTMP@(""V"",","DIEZXREF",$NA(@DIEZTMP@("R")),.DIEZFLST,.DIEZRLST)
 I DIEZFLST="",DIEZRLST="" S X="C"_DQ_"F1" Q
 ;
 ;Build code for each field-level xref
 ;Save DIEZKEY(uniquenessIndex)=index tag # (DIEZCNT)
 I DIEZFLST]"" S DIEZXR=0 F  S DIEZXR=$O(DIEZXREF(DP,DIEZXR)) Q:'DIEZXR  D
 . D GETXR(DIEZXR,.DIEZCNT)
 . S:$D(DIEZKEY(DIEZXR))#2 DIEZKEY(DIEZXR)=DIEZCNT
 ;
 ;Build code to set the DIEZRXR array for each record-level xref
 S X="C"_DQ_"F"_(DIEZCNT+1)
 Q:DIEZRLST=""
 S X=X_" S DIEZRXR("_DP_",DIIENS)=$$OREF^DILF($NA(@$$CREF^DILF(DIE)))" D L
 S X=" F DIXR="_$TR(DIEZRLST,U,",")_" S DIEZRXR("_DP_",DIXR)=""""" D L
 S DIEZI=0 F  S DIEZI=$O(DIEZRLST(DIEZI)) Q:'DIEZI  D
 . S X=" F DIXR="_$TR(DIEZRLST(DIEZI),U,",")_" S DIEZRXR("_DP_",DIEZIENS)=""""" D L
 ;
 S X=""
 Q
 ;
GETXR(DIEZXR,DIEZCNT) ;Get code for one index DIEZXR
 N DIEZCOD,DIEZF,DIEZKLOG,DIEZNSS,DIEZSLOG,DIEZO
 S DIEZCNT=$G(DIEZCNT)+1
 ;
 ;Build code to call subroutine to set X array
 S X="C"_DQ_"F"_DIEZCNT_$S(DIEZCNT=1:" N X,X1,X2",1:"")_" S DIXR="_DIEZXR_" D C"_DQ_"X"_DIEZCNT_"(U) K X2 M X2=X D C"_DQ_"X"_DIEZCNT_"(""O"") K X1 M X1=X"
 D L
 ;
 ;Build code to check for null subscripts
 S DIEZNSS="",DIEZO=0
 F  S DIEZO=$O(DIEZXREF(DP,DIEZXR,DIEZO)) Q:'DIEZO  D
 . Q:'$G(DIEZXREF(DP,DIEZXR,DIEZO,"SS"))
 . I DIEZNSS="" S DIEZNSS="$G(X("_DIEZO_"))]"""""
 . E  S DIEZNSS=DIEZNSS_",$G(X("_DIEZO_"))]"""""
 I DIEZNSS]"" S DIEZNSS=" I "_DIEZNSS_" D"
 E  S DIEZNSS=" D"
 ;
 ;Get kill logic and condition
 S DIEZKLOG=$G(DIEZXREF(DP,DIEZXR,"K"))
 I DIEZKLOG'?."^" D
 . S X=DIEZNSS D L
 . ;Get kill condition code
 . S DIEZCOD=$G(DIEZXREF(DP,DIEZXR,"KC"))
 . I DIEZCOD'?."^" D
 .. S X=" . N DIEXARR M DIEXARR=X S DIEZCOND=1" D L
 .. S X=" . "_DIEZCOD D L
 .. S X=" . S DIEZCOND=$G(X) K X M X=DIEXARR Q:'DIEZCOND" D L
 . ;Get kill logic
 . S X=" . "_DIEZKLOG D L
 ;
 ;Get set logic and condition
 S DIEZSLOG=$G(DIEZXREF(DP,DIEZXR,"S"))
 I DIEZSLOG'?."^" D
 . S X=" K X M X=X2"_DIEZNSS D L
 . ;Get set condition code
 . S DIEZCOD=$G(DIEZXREF(DP,DIEZXR,"SC"))
 . I DIEZCOD'?."^" D
 .. S X=" . N DIEXARR M DIEXARR=X S DIEZCOND=1" D L
 .. S X=" . "_DIEZCOD D L
 .. S X=" . S DIEZCOND=$G(X) K X M X=DIEXARR Q:'DIEZCOND" D L
 . ;Get set logic
 . S X=" . "_DIEZSLOG D L
 ;
 S X=" G C"_DQ_"F"_(DIEZCNT+1) D L
 ;
 ;Build code to set X array
 S DIEZF=$O(DIEZXREF(DP,DIEZXR,0))
 S X="C"_DQ_"X"_DIEZCNT_"(DION) K X" D L
 S DIEZO=0
 F  S DIEZO=$O(DIEZXREF(DP,DIEZXR,DIEZO)) Q:'DIEZO  D
 . D BLDDEC(DP,DIEZXR,DIEZO)
 S X=" S X=$G(X("_DIEZF_"))" D L
 S X=" Q" D L
 Q
 ;
BLDDEC(DP,DIEZXR,DIEZO) ;Build data extraction code
 N CODE,NODE,TRANS
 ;
 S CODE=$G(DIEZXREF(DP,DIEZXR,DIEZO)) Q:CODE?."^"
 S TRANS=$G(DIEZXREF(DP,DIEZXR,DIEZO,"T"))
 I TRANS'?."^" D
 . S X=" "_CODE D L
 . D DOTLINE(" I $D(X)#2 "_TRANS)
 . S X=" S:$D(X)#2 X("_DIEZO_")=X" D L
 E  I $D(DIEZXREF(DP,DIEZXR,DIEZO,"F"))#2,CODE?1"S X=".E D
 . S X=" S X("_DIEZO_")"_$E(CODE,4,999) D L
 E  D
 . S X=" "_CODE D L
 . S X=" S:$D(X)#2 X("_DIEZO_")=X" D L
 Q
 ;
DOTLINE(CODE) ;
 I CODE[" Q"!(CODE[" Q:") D
 . S X=" D" D L
 . S X=" ."_CODE D L
 E  S X=CODE D L
 Q

DIEZ3
DIEZ3 ;SFISC/MKO-COMPILE INPUT TEMPLATE, BUILD CODE TO CHECK KEYS ;2:54 PM  15 Jul 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;In:
 ;  DIEZKEY(uniqxref#) = count
 ;  DQ = item # in DR string
 ;
GETKEY(DIEZFIL,DIEZFLD,DIEZKEY,DQ) ;Build routine to check keys
 Q:'$D(DIEZKEY)
 N DIEZUI
 ;
 ;Build code to check field-level keys
 D L("K"_DQ_"() N DIMAXL,DIUIR,DIXR")
 S DIEZUI=0
 F  S DIEZUI=$O(DIEZKEY(DIEZUI)) Q:'DIEZUI  D
 . D BLD(DIEZFIL,DIEZFLD,DIEZUI,DQ,DIEZKEY(DIEZUI))
 Q
 ;
BLD(DIEZFIL,DIEZFLD,DIEZUI,DQ,DIEZCNT) ;Get code for one index DIEZXR
 N DIEZMAXL,DIEZSLIS,DIEZUIR
 D XRINFO^DIKCU2(DIEZUI,.DIEZUIR,"",.DIEZMAXL)
 ;
 D L(" S DIXR="_DIEZUI)
 D L(" S @DIEZTMP@(""V"","_DIEZFIL_",DIIENS,"_DIEZFLD_",""N"")=X")
 D L(" N X D C"_DQ_"X"_DIEZCNT_"(""N"")")
 D L(" K @DIEZTMP@(""V"","_DIEZFIL_",DIIENS,"_DIEZFLD_",""N"")")
 D L(" S DIUIR=$NA("_DIEZUIR_") Q:'$D(@DIUIR) 1")
 ;
 I $D(DIEZMAXL) D
 . N ORD,X
 . S X="S ",ORD=0
 . F  S ORD=$O(DIEZMAXL(ORD)) Q:'ORD  D
 .. S X=X_"DIMAXL("_ORD_")="_DIEZMAXL(ORD)_","
 . I X?.E1"," D L(" "_$E(X,1,$L(X)-1))
 ;
 D L(" Q $$UNIQUE^DIE17(.X,.DA,DIUIR,""C"_DQ_"X"_DIEZCNT_U_DNM_DRN_""""_$S($D(DIEZMAXL):",.DIMAXL",1:"")_")")
 Q
 ;
L(X) ;Add CODE to ^UTILITY
 S L=L+1,^UTILITY($J,0,L)=X,T=T+$L(X)+2
 Q

DIEZ4
DIEZ4 ;SFISC/MKO-COMPILE INPUT TEMPLATE, RECORD-LEVEL INDEXES ;2:15 PM  14 Jul 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;Variables passed in through symbol table:
 ;  DNM  = Name of routine
 ;  DRN(routine#) = "" : array of routine numbers
 ;  DMAX = Maximum routine size
 ;  DIEZTMP = Root of global that contains record-level index info
 ;
 ;Routine-wide variables
 ;  T   = Total byte count of current routine
 ;  L   = Last line number in current routine
 ;  DP  = file #
 ;  DRN = routine #
 ;  DIEZCNT = Count of xrefs processed in current routine (used as
 ;            a line tag)
 ;  DIEZAR(file#,xref#) = linetag^routine (returned)
 ;  DIEZKEYR(file#,key#,uniqxref#) = Xn^routine
 ;
RECXR(DIEZAR) ;Build routines for record-level indexes
 Q:'$D(@DIEZTMP@("R"))
 N DIEZCNT,DIEZXR,DP
 ;
 S DRN=$O(DRN(""),-1)+1
 D NEWROU
 ;
 S DP=0 F  S DP=$O(@DIEZTMP@("R",DP)) Q:'DP  D  Q:$G(DIEZQ)
 . S DIEZXR=0
 . F  S DIEZXR=$O(@DIEZTMP@("R",DP,DIEZXR)) Q:'DIEZXR  D  Q:$G(DIEZQ)
 .. D GETXR(DIEZXR) Q:$G(DIEZQ)
 Q:$G(DIEZQ)
 D SAVE
 Q
 ;
GETXR(DIEZXR) ;Get code for one index DIEZXR
 N DIEZCOD,DIEZF,DIEZKLOG,DIEZNSS,DIEZO,DIEZSLOG
 I T>DMAX D SAVE Q:$G(DIEZQ)  D NEWROU
 ;
 S DIEZCNT=$G(DIEZCNT)+1
 S DIEZAR(DP,DIEZXR)=DIEZCNT_U_DNM_DRN
 ;
 ;Build code to call subroutine to set X array
 D L(DIEZCNT_" N X,X1,X2 S DIXR="_DIEZXR_" D X"_DIEZCNT_"(U) K X2 M X2=X D X"_DIEZCNT_"(""F"") K X1 M X1=X")
 ;
 ;Build code to check for null subscripts
 S DIEZNSS="",DIEZO=0
 F  S DIEZO=$O(@DIEZTMP@("R",DP,DIEZXR,DIEZO)) Q:'DIEZO  D
 . Q:'$G(@DIEZTMP@("R",DP,DIEZXR,DIEZO,"SS"))
 . I DIEZNSS="" S DIEZNSS="$G(X("_DIEZO_"))]"""""
 . E  S DIEZNSS=DIEZNSS_",$G(X("_DIEZO_"))]"""""
 I DIEZNSS]"" S DIEZNSS=" I "_DIEZNSS_" D"
 E  S DIEZNSS=" D"
 ;
 ;Store kill logic and condition
 S DIEZKLOG=$G(@DIEZTMP@("R",DP,DIEZXR,"K"))
 I DIEZKLOG'?."^" D
 . D L(DIEZNSS)
 . ;Build kill condition code
 . S DIEZCOD=$G(@DIEZTMP@("R",DP,DIEZXR,"KC"))
 . I DIEZCOD'?."^" D
 .. D L(" . N DIEZCOND,DIEXARR M DIEXARR=X S DIEZCOND=1")
 .. D L(" . "_DIEZCOD)
 .. D L(" . S DIEZCOND=$G(X) K X M X=DIEXARR Q:'DIEZCOND")
 . ;Store kill logic
 . D L(" . "_DIEZKLOG)
 ;
 ;Store set logic and condition
 S DIEZSLOG=$G(@DIEZTMP@("R",DP,DIEZXR,"S"))
 I DIEZSLOG'?."^" D
 . D L(" K X M X=X2"_DIEZNSS)
 . ;Build set condition code
 . S DIEZCOD=$G(@DIEZTMP@("R",DP,DIEZXR,"SC"))
 . I DIEZCOD'?."^" D
 .. D L(" . N DIEZCOND,DIEXARR M DIEXARR=X S DIEZCOND=1")
 .. D L(" . "_DIEZCOD)
 .. D L(" . S DIEZCOND=$G(X) K X M X=DIEXARR Q:'DIEZCOND")
 . ;Store set logic
 . D L(" . "_DIEZSLOG)
 ;
 ;Build code to check record level keys
 D:$D(^DD("KEY","AU",DIEZXR)) BLDKCHK(DIEZXR)
 D L(" Q")
 ;
 ;Build code to set X array
 S DIEZF=$O(@DIEZTMP@("R",DP,DIEZXR,0))
 D L("X"_DIEZCNT_"(DION) K X")
 ;
 S DIEZO=0
 F  S DIEZO=$O(@DIEZTMP@("R",DP,DIEZXR,DIEZO)) Q:'DIEZO  D BLDDEC(DIEZXR,DIEZO)
 D L(" S X=$G(X("_DIEZF_"))")
 D L(" Q")
 Q
 ;
BLDDEC(DIEZXR,DIEZO) ;Build data extraction code
 N CODE,NODE,TRANS
 ;
 S CODE=$G(@DIEZTMP@("R",DP,DIEZXR,DIEZO)) Q:CODE?."^"
 S TRANS=$G(@DIEZTMP@("R",DP,DIEZXR,DIEZO,"T"))
 I TRANS'?."^" D
 . D L(" "_CODE)
 . D DOTLINE(" I $D(X)#2 "_TRANS)
 . D L(" S:$D(X)#2 X("_DIEZO_")=X")
 E  I $D(@DIEZTMP@("R",DP,DIEZXR,DIEZO,"F"))#2,CODE?1"S X=".E D
 . D L(" S X("_DIEZO_")"_$E(CODE,4,999))
 E  D
 . D L(" "_CODE)
 . D L(" S:$D(X)#2 X("_DIEZO_")=X")
 Q
 ;
BLDKCHK(DIEZUI) ;Build code to check key for xref
 N DIEZKLST,DIEZMAXL,DIEZUIR,I
 ;
 D XRINFO^DIKCU2(DIEZUI,.DIEZUIR,"",.DIEZMAXL)
 ;
 ;Get list of keys with this uniqueness index
 S DIEZKLST="",I=0
 S I=0 F  S I=$O(^DD("KEY","AU",DIEZUI,I)) Q:'I  S DIEZKLST=I_","
 Q:DIEZKLST=""
 S DIEZKLST=$E(DIEZKLST,1,$L(DIEZKLST)-1)
 ;
 D L(" . I $G(DIEXEC)[""K"" D")
 D L(" .. N DIMAXL,DIUIR")
 D L(" .. S DIUIR=$NA("_DIEZUIR_") Q:'$D(@DIUIR)")
 ;
 ;Build code to set DIMAXL(order#)=maxLength
 I $D(DIEZMAXL) D
 . N ORD,X
 . S X="S ",ORD=0
 . F  S ORD=$O(DIEZMAXL(ORD)) Q:'ORD  D
 .. S X=X_"DIMAXL("_ORD_")="_DIEZMAXL(ORD)_","
 . I X?.E1"," D L(" .. "_$E(X,1,$L(X)-1))
 ;
 D L(" .. I '$$UNIQUE^DIE17(.X,.DA,DIUIR,""X"_DIEZCNT_U_DNM_DRN_""""_$S($D(DIEZMAXL):",.DIMAXL",1:"")_") N I F I="_DIEZKLST_" S DIKEY("_DP_",I,DIIENS)=""""")
 Q
 ;
L(X) ;Add CODE to ^UTILITY
 S L=L+1,^UTILITY($J,0,L)=X,T=T+$L(X)+2
 Q
 ;
DOTLINE(X) ;
 I X[" Q"!(X[" Q:") D
 . D L(" D"),L(" ."_X)
 E  D L(X)
 Q
 ;
NEWROU ;Start a new routine
 K ^UTILITY($J,0)
 S ^UTILITY($J,0,1)=DNM_DRN_" ; ;"_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3),T=$L(^(1))
 S ^UTILITY($J,0,2)=" ;;",T=T+$L(^(2))
 S L=2,DIEZCNT=0
 Q
 ;
SAVE ;Get the next available routine number
 N DQ
 F DQ=DRN+1:1 Q:'$D(DRN(DQ))
 ;
 ;Save current routine
 D SAVE^DIEZ1 Q:$G(DIEZQ)
 K ^UTILITY($J,0)
 Q

DIFG
DIFG ;SFISC/DG(OHPRD)-FILEGRAM INSTALLER ;10/9/95  05:50
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $D(DIFGREI) S DIFGLO="^DIAR(1.13,"_DIFGREI_",21," K DIFGLC
 I '$D(DIFGLO) S DIFGER="1^0" Q
 I $E(DIFGLO,$L(DIFGLO))=","!($E(DIFGLO,$L(DIFGLO))="(")
 E  S DIFGER="1.25^0" K DIFGLO,DIFGREI Q
 S DIFGCHKG=$S($E(DIFGLO,$L(DIFGLO))=",":$E(DIFGLO,1,$L(DIFGLO)-1)_")",1:$P(DIFGLO,"("))
 I '$D(@(DIFGCHKG)) S DIFGER="1.5^0" K DIFGCHKG,DIFGLO,DIFGREI Q
 D INIT,START,KILLVAR,EOJ^DIFG5
 Q
 ;
INIT S U="^"
 K ^UTILITY("DIFG",$J),^UTILITY("DIFGFG",$J),^UTILITY("DIFGX",$J),^UTILITY("DIFG@",$J)
 D DT^DICRW
 S DIFGEXC="F DIFGL=1:1 Q:$E(DIFGDIX,DIFGL)'="" """
 S DIFGLINE="S DIFGY=$O("_DIFGLO_"DIFGY)) Q:DIFGY'>0  S DIFGDIX=^(DIFGY,0) X DIFGEXC S DIFGDIX=$E(DIFGDIX,DIFGL,255)"
 Q
 ;
START S (DIFG,DIFGER,DIFGMULT,DIFGEND,DIFGO,DIFGCT,DIFGADD,DIFGTYPE,DIFGINCR,DIFGNDC)=0,DIFGY=$S('$D(DIFGLC):.9999,1:DIFGLC-.0001),DIFGNODL=1 D FILEGRAM,KILLVAR
 D:'DIFGER ^DIFG6
 Q
 ;
FILEGRAM X DIFGLINE
 I $P(DIFGDIX,"^")'="$DAT" S DIFGER=2_U_DIFGY D ERROR G X1
 S DIFG("PARAM")=$P(DIFGDIX,U,4)
 X DIFGLINE
A I $P(DIFGDIX,":")="ENVIRONMENT" S @($P($P(DIFGDIX,":",2),"=")_"="_$P(DIFGDIX,"=",2)) X DIFGLINE G A
 D BASEFILE^DIFG0B G:DIFGER X1
 D FILE
X1 Q
 ;
FILE F DIFGL=0:0 X DIFGLINE D EVAL I DIFGTYPE="TERM"!DIFGER S DIFGTYPE="" Q
 Q
 ;
EVAL D GETTYPE
 I DIFGER G X3
 I DIFGTYPE="TERM" G X3
 I DIFGTYPE="MV FIELD" D ^DIFG2 G X3
 I DIFGTYPE="SV FIELD" D ^DIFG1 G X3
 I DIFGTYPE="WP FIELD" D ^DIFG1 G X3
 I DIFGTYPE="SWITCH" D SWITCH^DIFG0A G X3
 I DIFGTYPE="SKIP" ;computed field, do not process
X3 Q
 ;
GETTYPE I DIFGDIX="^"!(DIFGDIX=":")!(DIFGDIX="$END DAT") S DIFGTYPE="TERM" G X4
 I $P(DIFGDIX,U)="$DAT"!($P(DIFGDIX,":")="$DAT") S DIFGER=3_U_DIFGY,DIFGEND=1,DIFGTYPE="TERM" D ERROR G X4
 I $P(DIFGDIX,U,2)[":" S DIFGSTRT=$F(DIFGDIX,"^"),DIFGFIND=$E(DIFGDIX,DIFGSTRT,245) I $E(DIFGFIND,$F(DIFGFIND,":"))="^" S DIFGTYPE="SWITCH" G X4
 D EVALFLD
X4 Q
 ;
EVALFLD I DIFG("PARAM")["N" S DIFGNUM=+$P(DIFGDIX,U,2)
 E  S DIFGNUM=$O(^DD(DIC,"B",$P(DIFGDIX,U),""))
 I '$D(^DD(DIC,DIFGNUM)) S DIFGER=4_U_DIFGY D ERROR G X5
 I $P(^DD(DIC,DIFGNUM,0),U,2)["C" S DIFGTYPE="SKIP" G X5
 I +$P(^DD(DIC,DIFGNUM,0),U,2) S DIFGMLND=^DD(DIC,DIFGNUM,0),DIFGFLDN=DIFGNUM,DIFGNUM=+$P(DIFGMLND,U,2) S DIFGTYPE=$S($P(^DD(DIFGNUM,.01,0),U,2)'["W":"MV FIELD",1:"WP FIELD")
 E  S DIFGTYPE="SV FIELD"
X5 Q
 ;
ERROR NEW DA,DIC,DIE,X,Y,DO
 S X=$P(DIFGER,U,2),DIC("DR")=".02////"_$P(DIFGER,U),DIC="^DIAR(1.13,",DIC(0)="FL" D FILE^DICN S DIFGLOG=$S(Y>0:+Y,1:-1) G:DIFGLOG=-1 X6
 S B=0 F A=$S($D(DIFGLC):DIFGLC-.0001,1:0):0 S A=$O(@(DIFGLO_"A)")) Q:'A  S B=B+1,^DIAR(1.13,+Y,21,B,0)=$S('$D(^UTILITY("DIFGFG",$J,A)):@(DIFGLO_"A,0)"),1:^UTILITY("DIFGFG",$J,A)) S:A=$P(DIFGER,U,2) $P(DIFGER,U,2)=B Q:^(0)["$END DAT"
 S ^DIAR(1.13,+Y,21,0)="^^"_B_"^"_B_"^"_DT
 S DIE="^DIAR(1.13,",DA=DIFGLOG,DR=".01///"_$P(DIFGER,U,2) D ^DIE K DIE,DA,DR
 S DIFGEROR=""
X6 K A,B Q
 ;
KILLVAR K DIFGFILE,DIFGSAVE,DA,DIC,DIFGTYPE,DIFGM,DIFGNDC,DIFGNODL,DIFGADD,DIFGMO,DIFGLAGO,DIFGSKIP,DIFGDI,DIFGDICS,DIFGADD,DIFGINCR,DIFGNODL,DIFGTYPE,DIFG("SAVE")
 K DIFGDA,DIFGDIC,DIFGFIND,DIFGFIRP,DIFGFLDN,DIFGHAT,DIFGNODE,DIFGNUM,DIFGSECP,DIFGSTRT,DIFGSVN,DIFGSVVL,DIFGMGBL
 Q

DIFG0
DIFG0 ;SFISC/DG(OHPRD)-SETS UP DIC("S"), EVALS 1ST LINE OF A (SUB)FILE ; [ 05/25/93  10:17 AM ]
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NDPC ;DETERMINE NODE,PIECE FOR DATA FOR THIS FIELD
 S DIFGCT=DIFGCT+1
 S:DIFG("PARAM")["N" DIFGNUMF(DIFGCT)=+$P(DIFGDIX,"^",2),DIFGPC(DIFGCT)=$P(^DD(DIC,DIFGNUMF(DIFGCT),0),"^",4)
 I '$D(DIFGPC(DIFGCT)) S DIFGNUMF(DIFGCT)=$O(^DD(DIC,"B",$P($P(DIFGDIX,"^"),":",2),"")),DIFGPC(DIFGCT)=$P(^DD(DIC,DIFGNUMF(DIFGCT),0),"^",4)
 S DIFGHAT=$P(^DD(DIC,DIFGNUMF(DIFGCT),0),U,2) I DIFGHAT["P",$P(DIFGDIX,"=",2)'?1"@"1N.N.1"E" S DIFGPTER(DIFGCT)=""
 D DICS
 D GETVAL
 Q
 ;
DICS ;SET DIC("S")
 I $P(DIFGPC(DIFGCT),";",2)'["," S DIFGDOL="$P(^($P(DIFGPC("_DIFGCT_"),"";"")),U,$P(DIFGPC("_DIFGCT_"),"";"",2))="
 E  S DIFGDOL="$E(^($P(DIFGPC("_DIFGCT_"),"";"")),$P(DIFGPC("_DIFGCT_"),"";"",2))="
 I '$D(DIFGDIC(DIC)) S DIFGDICS(DIC)=1
 E  S DIFGDICS(DIC)=DIFGDICS(DIC)+1
 S DIFGDIC(DIC,DIFGDICS(DIC))="I "_DIFGDOL_$S($D(DIFGPTER(DIFGCT)):"",1:"DIFGVAL("_DIFGCT_")")
 Q
 ;
GETVAL ;GETS VALUE TO RIGHT OF EQUAL SIGN
 I $P(DIFGDIX,"=",2)'?1"@"1N.N.1"E" S (DIFGVAL(DIFGCT),^UTILITY("DIFGX",$J,DIFGCT))=$P(DIFGDIX,"=",2) D:DIFGHAT["S" SETCODES D:DIFGHAT["D" DATE I 1
 E  S DIFGVAL(DIFGCT)=^UTILITY("DIFG@",$J,$P(DIFGDIX,"=",2)) S:$D(^UTILITY("DIFGX",$J,$P(DIFGDIX,"=",2))) ^UTILITY("DIFGX",$J,DIFGCT)=^($P(DIFGDIX,"=",2))
X1 Q
 ;
SETCODES ;DETERMINE INTERNAL VALUE IF FIELD ATTRIBUTE IS SET OF CODES
 I $P(^DD(DIC,DIFGNUMF(DIFGCT),0),U,3)[":"_DIFGVAL(DIFGCT)_";" S DIFGSET=$P(^DD(DIC,DIFGNUMF(DIFGCT),0),U,3),%=$P(DIFGSET,":"_DIFGVAL(DIFGCT)_";"),%A=$L(%,";"),DIFGVAL(DIFGCT)=$P(%,";",%A)
 K DIFGSET,%,%A
 Q
 ;
DATE ;GET INTERNAL FORM OF DATE
 S DIFGSAVX=X,%DT="T",X=$P(DIFGDIX,"=",2) D ^%DT S DIFGVAL(DIFGCT)=Y,X=DIFGSAVX
 I Y=-1 S DIFGER=5_U_DIFGY D ERROR^DIFG
 Q
 ;
BASE ;BASE FILE ENTRY LINE
 K DIFGXRF(DIFGMULT)
 I $P($P(DIFGDIX,U,3),"=",2)?1"@"1N.N1"E" S (DIFGALNK,Y)=^UTILITY("DIFG@",$J,$E($P($P(DIFGDIX,U,3),"=",2),1,$L($P($P(DIFGDIX,U,3),"=",2))-1)),DIFGFLUS="" S:'Y DIFGSKIP(DIFGMULT)="" S DIFG("NOLKUP")=""
 I '$D(DIFG("NOLKUP")) S X=$S($P($P(DIFGDIX,U,3),"=",2)?1"@"1N.N:"`"_$S(^UTILITY("DIFG@",$J,$P($P(DIFGDIX,U,3),"=",2))["^UTILITY":"^"_$P(^($P($P(DIFGDIX,U,3),"=",2)),U,2),1:$P(^($P($P(DIFGDIX,U,3),"=",2)),U)),1:$P($P(DIFGDIX,U,3),"=",2))
 I '$D(DIC) S DIC=$S(+$P(DIFGDIX,U,2):+$P(DIFGDIX,U,2),$D(^DIC("B",$P(DIFGDIX,U))):$O(^DIC("B",$P(DIFGDIX,U),"")),1:"") I DIC S:'$D(^DIC(DIC)) DIC=""
 I 'DIC S DIFGER=20_U_DIFGY D ERROR^DIFG
 I $P(DIFGDIX,U,4)]"" S DIFGXRF(DIFGMULT)=$P(DIFGDIX,U,4)
 Q
 ;
FUNC ;CHECKS FUNCTION ON BASE ENTRY LINE
 S DIFGO=DIFGO+1
 S DIFGINCR=DIFGO
 S %=$P(DIFGDIX,U,3),%=$P(%,"="),^UTILITY("DIFG",$J,DIFGINCR,DIC,"MODE")=$S(%?1A:%,1:"L")_"^"_DIFGY S DIFGMO(DIFGMULT)=$P(^("MODE"),U)_"^"_DIC
 K %
 Q
 ;

DIFG0A
DIFG0A ;SFISC/DG(OHPRD)-CALLED FOR CONTEXT SWITCH ;8MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SWITCH ;CONTEXT SWITCH
 N DIC,DIFGM,DIFGNDC,DA,DIFGINCR,DIFGSKIP,DIFGDI,DIFGMO,DIFGPOIN
 S DIFG=DIFG+1,(DIFGNDC,DIFGLAGO)=0
 S DIFGTYPE="FILE"
 D BASE^DIFG0
 I DIFGER G X1
 D FUNC^DIFG0
 I '$D(DIFG("NOLKUP")) D BEGEND
 I DIFGER G X1
 D SET
 D KILLVAR0
 D FILE^DIFG
 S DIFG=DIFG-1
 D KILLVAR
X1 Q
 ;
BEGEND ;CALL DIFG3 TO PROCESS BEGIN-END BLOCK
 I "AL"[$P(DIFGMO(DIFGMULT),U) S DIFGSECP=$P(^DD(DIC,.01,0),U,2) S:DIFGSECP["P" DIFGPOIN="" I DIFGSECP'["'"!($D(DIFGENV("LAYGO",DIC,.01))) S DIFGLAGO=1
 D ^DIFG3
 Q
 ;
SET ;
 I '$D(DIFGSKIP(DIFGMULT)),$D(^UTILITY("DIFG",$J,DIFGINCR,DIC)),'$D(^(DIC,"DA")) S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"DA")=+Y,^("DR")=""
 I $D(DIFGSKIP(DIFGMULT)) S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"DA")=DIFGALNK S:'$D(DIFGFLUS) ^("X")=$S($E(X)="`":$E(X,2,245)_"^N",X[("^UTILITY(""DIFG@"","_$J):X_"^N",1:X)
 I $D(DIFGFLUS),$P(DIFGMO(DIFGMULT),U)="L" S $P(^UTILITY("DIFG",$J,DIFGINCR,DIC,"MODE"),U)="M"
 S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"GL")=^DIC(DIC,0,"GL"),(DA,DIFGDA(0))=DIFGALNK I $D(^("DIC(""DR"")")) S ^("MODE")="A"_"^"_$P(^("MODE"),U,2)
X2 K DIFGFLUS Q
 ;
KILLVAR0 ;KILL VARIABLES AFTER LOOKUP FOR FILE ON THE WAY TO FIELDS
 K DIFGALNK,DIFGO(DIFGMULT),DIFGFLD,DIFGPC,DIFGVAL,DIFGDOL,DIFGNUMF,DIFGNOLK,DIFGLAGO,Y,DIFG("NOLKUP")
 Q
 ;
KILLVAR ;KILL VARIABLES AFTER EACH CONTEXT SWITCH
 K DIFGDA,DIFGDIC,DIFGDOL,DIFGFIND,DIFGFIRP,DIFGFLDN,DIFGHAT,DIFGMLND,DIFGNODE,DIFGNUM,DIFGNUMF,DIFGPC,DIFGPTER,DIFGSECP,DIFGSTRT,DIFGVAL,DIFGNDC,DIFGM,DIFGFLD,DIFGDIC,DIFGSAVE,DIFGSVVL
 K:$P($G(DIFGMO(DIFGMULT)),U,2)]"" DIFGMOLK($P(DIFGMO(DIFGMULT),U,2))
 K DIFGSKIP
 Q
 ;

DIFG0B
DIFG0B ;SFISC/DG(OHPRD)-PROCESS BASEFILE ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
BASEFILE ;
 S DIFGTYPE="FILE"
 D BASE^DIFG0 G:DIFGER X2 D FUNC^DIFG0
 S DIFGLAGO=0
 I $P(DIFGMO(DIFGMULT),U)="L",$D(DINUM),$D(@(^DIC(DIC,0,"GL")_"DINUM)")) S $P(^UTILITY("DIFG",$J,DIFGINCR,DIC,"MODE"),U)="M",$P(DIFGMO(DIFGMULT),U)="M"
 E  I "AL"[$P(DIFGMO(DIFGMULT),U) S DIFGSECP=$P(^DD(DIC,.01,0),U,2) I DIFGSECP'["'"!($D(DIFGENV("LAYGO",DIC,.01))) S DIFGLAGO=1
 I $D(DINUM),$P(^DD(DIC,.01,0),U,5,99)["DINUM","MD"'[$P(DIFGMO(DIFGMULT),U) S DIFGER=7_U_DIFGY D ERROR^DIFG G X2
 I $D(DINUM) S ^UTILITY("DIFG",$J,DIFGINCR,DIC,$S("MD"[$P(DIFGMO(DIFGMULT),U):"DA",1:"DINUM"))=DINUM
 I $D(DIADD) S:"AL"'[$P(DIFGMO(DIFGMULT),U) DIFGER=8_U_DIFGY D:DIFGER ERROR^DIFG I 'DIFGER S $P(DIFGMO(DIFGMULT),U)="A",$P(^UTILITY("DIFG",$J,DIFGINCR,DIC,"MODE"),U)="A"
 K DIADD,DINUM
 I DIFGER G X2
 S:$D(^UTILITY("DIFG",$J,DIFGINCR,DIC,"DA")) DIFGDINM="" D ^DIFG3
 I DIFGER G X2
 K DIFGLAGO
 D SET^DIFG0A
 D KILLVAR0^DIFG0A
 S DIFGBSE=^UTILITY("DIFG",$J,DIFGINCR,DIC,"DA")_"^"_DIC_$S(^("MODE")["A":"^1",1:"")
X2 Q
 ;

DIFG1
DIFG1 ;SFISC/DG(OHPRD)-SINGLE VALUED FIELDS ; [ 02/03/93  3:17 PM ]
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START ;ASSIGNMENT STATEMENT FOR SINGLE VALUED FIELD
 I DIFGTYPE="WP FIELD" D WPFIELD G X1
 S DIFGSECP=$P(DIFGDIX,"=",2)
 I DIFGSECP="^" S DIFGVAL="@" D SETDR G X1
 I DIFGSECP?1"@"1N.N,'^UTILITY("DIFG@",$J,DIFGSECP),$D(DIFG("UNRESOLVED",DIFGSECP)) S DIFGER=21_U_DIFGY D ERROR^DIFG G X2
 I $P(^DD(DIC,DIFGNUM,0),U,2)["P",DIFGSECP'?1"@"1N.N D LOOKUP I 1
 E  I DIFGSECP'?1"@"1N.N,DIFGSECP[";" D PARSE S DIFGVAL="^S X="_DIFGSECP I 1
 E  S DIFGVAL=$S(DIFGSECP'?1"@"1N.N:DIFGSECP,^UTILITY("DIFG@",$J,DIFGSECP)[DIFGSECP:"^S X="_"""`""_^UTILITY(""DIFG@"","_$J_","""_DIFGSECP_""")",DIFGNUM'=.01:"/"_^UTILITY("DIFG@",$J,DIFGSECP),1:"`"_^UTILITY("DIFG@",$J,DIFGSECP))
 I DIFGER G X1
 D SETDR
 K DIFGSECP,DIFGPC,DIFGFLD,DIFGVAL,DIFGDOL,DIFGNOLK,DIFGPARS,DIFGDOLF
X1 Q
 ;
PARSE ; PARSE AND CHANGE DIFGSECP IF CONTAINS ";"
 NEW I S DIFGPARS="" F I=0:0 S DIFGDOLF=$F(DIFGSECP,";") Q:'DIFGDOLF  S DIFGPARS=DIFGPARS_$S(DIFGDOLF>2:""""_$E(DIFGSECP,1,DIFGDOLF-2)_"""_",1:"")_"$C(59)_" S DIFGSECP=$E(DIFGSECP,DIFGDOLF,245)
 S DIFGSECP=$S(DIFGSECP="":$E(DIFGPARS,1,$L(DIFGPARS)-1),1:DIFGPARS_""""_DIFGSECP_"""")
 Q
 ;
SETDR ;
 S:'$D(^UTILITY("DIFG",$J,DIFGINCR,DIC,"DR")) ^("DR")=""
 I $L(^UTILITY("DIFG",$J,DIFGINCR,DIC,"DR"))+$L(DIFGNUM_"///"_DIFGVAL_";")<241 S ^("DR")=^("DR")_DIFGNUM_"///"_DIFGVAL_";" G X2
 I $D(^UTILITY("DIFG",$J,DIFGINCR,DIC,"DR",DIFGNDC)),$L(^(DIFGNDC))+$L(DIFGNUM_"///"_DIFGVAL_";")<241 S ^(DIFGNDC)=^(DIFGNDC)_DIFGNUM_"///"_DIFGVAL_";"
 E  S DIFGNDC=DIFGNDC+1,^(DIFGNDC)=DIFGNUM_"///"_DIFGVAL_";"
X2 Q
 ;
LOOKUP ;FIELD LOOKUP
 S DIFG=DIFG+1
 S X=$P(DIFGDIX,"=",2)
 S DIFGLAGO=0
 I $P(^DD(DIC,DIFGNUM,0),U,2)'["'"!($D(DIFGENV("LAYGO",DIC,DIFGNUM))) S DIFGLAGO=1
 D ^DIFG3
 I DIFGER G X3
 I Y>0 S DIFGVAL="/"_+Y G X3
 S DIFGVAL="^S X="_"""`""_"_DIFGALNK
X3 S DIFG=DIFG-1
 K Y,DIFGLAGO
 Q
 ;
WPFIELD ;PROCESS WP FIELD
 S DIFG("COUNT")=0
 S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"WP",DIFG("COUNT"))=DIFGFLDN
 F DIFGL=0:0 X DIFGLINE Q:DIFGDIX="."  S DIFG("COUNT")=DIFG("COUNT")+1 D BUILD
 K DIFG("COUNT")
 Q
 ;
BUILD ;
 S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"WP",DIFG("COUNT"))=$E(DIFGDIX,2,$L(DIFGDIX)-1)
 Q
 ;

DIFG2
DIFG2 ;SFISC/DG(OHPRD)-PROCESSING OF MULTIPLES FROM FILEGRAM ; [ 02/02/93  4:21 PM ]
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START ;CALLED BY DIFG
 S DIFG=DIFG+1
 I DIFGMULT=0 S DIFGNDC=0,DIFGM(0)=DIC ;ENTERING HIGHEST LEVEL MULTIPLE
 N DIC
 D MULT
 I DIFGER G X1
 I '$D(DIFG("NOLKUP")) D ^DIFG3 I 1
 E  D NOLOOK
 I DIFGER G X1
 D SET
 K DIFGALNK,DIFGMLND,DIFGPC,DIFGFLD,DIFGVAL,DIFGDOL,DIFGNUMF,DIFGNOLK,DIFGLAGO,Y,DIFG("NOLKUP"),DIFG("ACGRV"),DIFGDIC(DIFGDIC)
 D FILE^DIFG
 K DIFGSKIP(DIFGMULT) ;Going up one level so kill this variable which tells lower level multiples not to do lookup
 D CHANGEDA
 S DIFG=DIFG-1
X1 Q
 ;
MULT ;MULTIPLE FIELD LOOKUP AND CALL TO SET DR STRING FOR MULTIPLE
 I DIFGMULT=0 S DIFGMGBL(DIFGMULT)=$S(DIFGM(0):^DIC(DIFGM(0),0,"GL"),1:DIC),DIFGDA(DIFGMULT)=DA
 S DIFGNODE=$P($P(DIFGMLND,"^",4),";")
 S DIFGLAGO=0
 I $P(^DD(DIFGNUM,.01,0),U,2)'["'"!($D(DIFGENV("LAYGO",DIFGNUM,.01))) S DIFGLAGO=1 ;Not a ptr or a ptr and laygo allowed
 S DIFGMULT=DIFGMULT+1
 I $D(DIFGSKIP(DIFGMULT-1)) S DIFGSKIP(DIFGMULT)=""
 S DIFGMGBL(DIFGMULT)=DIFGMGBL(DIFGMULT-1)_DIFGDA(DIFGMULT-1)_","_""""_DIFGNODE_""""_","
 S DIFGM(DIFGMULT)=DIFGNUM
 S DIC=DIFGNUM D BASE^DIFG0 Q:DIFGER  D FUNC^DIFG0
 Q
 ;
NOLOOK ;IF NO LOOKUP REQUIRED, SET DA ARRAY
 F DIFGI=DIFGMULT:-1:1 S DA(DIFGI)=$S(DIFGI=1:DA,1:DA(DIFGI-1))
 Q
 ;
SET ;
 I '$D(DIFGSKIP(DIFGMULT)) S (DA,DIFGDA(DIFGMULT))=+Y
 E  S (DA,DIFGDA(DIFGMULT))=DIFGALNK I '$D(DIFGFLUS) D
 . S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"X")=$S($E(X)="`":$E(X,2,245)_"^N",($D(DIFG("ACGRV"))!(X[("^UTILITY(""DIFG@"","_$J))):X_"^N",1:X_"^"),^("MODE")="A"_"^"_$P(^("MODE"),U,2),^("DIC(""P"")")=$P(DIFGMLND,U,2)
 S DIC=DIFGM(DIFGMULT)
 S ^UTILITY("DIFG",$J,DIFGINCR,DIC,"DA")=DA,^("GL")=DIFGMGBL(DIFGMULT),^($S($D(DIFGSKIP(DIFGMULT))&('$D(DIFGFLUS)):"DIC(""DR"")",1:"DR"))="" F DIFGI=1:1:DIFGMULT S ^("DA("_DIFGI_")")=DA(DIFGI)
 I $D(DIFGSKIP(DIFGMULT)),'$D(DIFGFLUS) D ENADD^DIFG4
 K DIFGTYP,DIFGFLUS ;DIFGTYP exists due to DIFG3 not killing it if DIFGTYP="MV FIELD" - Needed in case one calls ENADD^DIFG4
 Q
 ;
CHANGEDA ;BACK DOWN ONE LEVEL DA'S, I.E. DA=DA(1),DA(1)=DA(2) ETC.
 S DA=DA(1)
 I DIFGMULT>1 F DIFGI=DIFGMULT:-1:2 S DA(DIFGI-1)=DA(DIFGI)
 K DA(DIFGMULT)
 S DIFGMULT=DIFGMULT-1
 Q
 ;

DIFG3
DIFG3 ;SFISC/DG(OHPRD)-LOOKUP PROCESSING ;3/11/93  1:33 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIFGTYP="" X DIFGLINE
 N DIC,DIFGDRAD,DIFGDRCT,DIFGFLUS
 S DIFG=DIFG+1
 D BEGIN G:DIFGER X5
 S DIFGTYP=$S(DIFGTYPE="MV FIELD":"MV FIELD",DIFGTYPE="SV FIELD":"SV FIELD",1:"FILE")
 I $D(DIFGDINM) K DIFGDINM S Y=^UTILITY("DIFG",$J,DIFGINCR,DIC,"DA") S:'$D(@(^DIC(DIC,0,"GL")_"Y)")) DIFGER=19_U_DIFGY D ERROR^DIFG:DIFGER,SET^DIFG3A:'DIFGER G X5
 I '$D(DIFGNOLK) D PREDIC I 1
 E  I DIFGTYP="MV FIELD",$D(DIFGNOLK) D MVFIELD^DIFG3A I 1
 E  S DIFGDIC=DIC D ^DIFG4,SET^DIFG3A
X5 S DIFG=DIFG-1 K DIFGNOLK,DIFGCOND,DIFG("CONDSET") I DIFGTYP'="MV FIELD" K DIFGTYP
 Q
BEGIN I $P(DIFGDIX,":")'="BEGIN" S DIFGER=6_U_DIFGY D ERROR^DIFG G X
 S DIFGDRCT=0,DIC=$S(+$P(DIFGDIX,U,2):+$P(DIFGDIX,U,2),1:$O(^DIC("B",$P($P(DIFGDIX,U),":",2),""))),DIC("S")="F DIFGI=1:1 Q:'$D(DIFGDIC(DIFGDIC,DIFGI))!('$T)  X DIFGDIC(DIFGDIC,DIFGI)"
 I '$D(^DD(DIC)) S DIFGER=20_U_DIFGY D ERROR^DIFG G X
 I DIFGTYP="" S %=DIFGLAGO NEW DIFGLAGO S DIFGHAT=$P(^DD(DIC,.01,0),U,2) S DIFGLAGO=$S(%=0:0,DIFGHAT'["'":1,$D(DIFGENV("LAYGO",DIC,.01)):1,1:0) K %
 K DIFGHAT
 I DIFGTYPE="SV FIELD"!($D(DIFG("CHKCOND"))) S:$D(^DD(DIC,0,"FD")) DIFGCOND(DIFG,DIC)="" K DIFG("CHKCOND")
 D LINK^DIFG5
 F DIFGL=0:0 X DIFGLINE S DIFGFIRP=$P(DIFGDIX,":") Q:DIFGFIRP="END"!DIFGER  D LINES
 Q
LINES I DIFGFIRP="BEGIN" D RCR S:$S($D(Y):Y<0,1:1) DIFGNOLK="" G:DIFGER X S:'$D(DIFGNOLK) X="`"_+Y S:$D(DIFGNOLK)&(DIFGTYP'="MV FIELD")&(DIFGTYP'="FILE") X=DIFGALNK D:$D(DIFGDIC(DIC))&'$D(DIFGNOLK) ARRAY^DIFG5 K Y G X
 I DIFGFIRP="IDENTIFIER"!(DIFGFIRP="SPECIFIER") D ^DIFG0 G:DIFGER X S:'$D(DIFGPTER(DIFGCT)) DIFGSVVL(DIFGCT)=DIFGVAL(DIFGCT) I $D(DIFGPTER(DIFGCT)) D IDENSPEC^DIFG5 G X
 I DIFGFIRP="KEY" S DIFGKEY="" D KEY^DIFG5
 I DIFGFIRP="$DAT" S DIFGER=3_U_DIFGY D ERROR^DIFG
X Q
RCR N DIC,DIFGDRAD,DIFGDRCT,DIFGNOLK,DIFGFLUS
 S DIFG=DIFG+1,DIFG("CHKCOND")=""
 D BEGIN G:DIFGER X
 I '$D(DIFGNOLK) D PREDIC I 1
 E  S DIFGDIC=DIC D ^DIFG4,SET^DIFG3A
 I $D(DIFGDIC)#2 K DIFGCOND(DIFG,DIFGDIC)
 S DIFG=DIFG-1
 Q
PREDIC I $D(DIFGKEY) D:DIFGTYPE="MV FIELD" MVFIELD^DIFG3A G X2
 S DIFGDIC=DIC
 I DIFGTYP="MV FIELD" D MVFIELD^DIFG3A G X2
 I DIFGTYP="FILE",$P(DIFGMO(DIFGMULT),U)="A" S DIFGSKIP(DIFGMULT)="" D ^DIFG4,SET^DIFG3A G X2
 I '$D(DIFGFLUS) D CALLDIC I 1
 E  D SET^DIFG3A
X2 K DIFGKEY,DIFGSAVE(DIFG,"@NUM")
 K:DIFGTYP'="MV FIELD" DIFG("ACGRV")
 Q
CALLDIC K D
 I $D(DIFGXRF(DIFGMULT)),(DIFGTYP="MV FIELD"!(DIFGTYP="FILE")) S DIFGX=X,X=^UTILITY("DIFG@",$J,$P(DIFGXRF(DIFGMULT),"=",2)) G:X["^UTILITY(""DIFG@""" NOLK S D=$P(DIFGXRF(DIFGMULT),"="),DIC(0)="FI" D  G:$D(DIFGNK) NOLK
 . I $E(DIFGX)="`" S DIFGGRAV="",DIFGX=$E(DIFGX,2,245)
 . E  NEW X S X=DIFGX X $P(^DD(DIFGDIC,.01,0),U,5,99) S:$D(X) DIFGX=X I '$D(X) S DIFGNK="" Q
 . F DIFGI=1:1 Q:'$D(DIFGDIC(DIFGDIC,DIFGI))
 . S DIFGDIC(DIFGDIC,DIFGI)="I $P(^(0),U)=DIFGX"
 E  I $E(X)'="`"!($P(^DD(DIFGDIC,.01,0),U,5,99)["DINUM") S DIC(0)="MFI"
 E  S X=$E(X,2,245),DIC(0)="FI",D="B",DIFG("ACGRV")=""
 I $D(D),'$D(^DD(DIFGDIC,0,"IX",D)) D DOLO^DIFG5 I '$D(DIFG("FOUND")) S DIFGER=18_U_DIFGY D ERROR^DIFG G X6
 K DIFGNK F DIFGI=1:1 Q:'$D(DIFGDIC(DIFGDIC,DIFGI))!$D(DIFGNK)  I $P(DIFGDIC(DIFGDIC,DIFGI),"=",2)["DIFGVAL",@$P(DIFGDIC(DIFGDIC,DIFGI),"=",2)["DIFG(" S DIFGNK=""
 I '$D(DIFG("FOUND")),'$D(DIFGNK) D @$S($D(D):"IX^DIC",1:"^DIC")
NOLK I X["^UTILITY(""DIFG@"""!$D(DIFGNK) S Y=-1
 I $D(DIFGX) S X=$S($D(DIFGGRAV):"`",1:"")_DIFGX K DIFGX,DIFGGRAV
 D CHECKY^DIFG5
 D:'DIFGER SET^DIFG3A
X6 K DIFG("FOUND"),D,DR,DIFGNK
 I DIFGTYP="MV FIELD"!(DIFGTYP="FILE") K DIFGXRF(DIFGMULT)
 Q

DIFG3A
DIFG3A ;SFISC/DG(OHPRD)-SETS VARS BASED ON Y VALUE AFTER LOOKUP ;3/11/93  1:49 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SET ;SET VARIABLES BASED ON LOOKUP
 I $D(DIFGFLUS) S DIFGALNK=^UTILITY("DIFG@",$J,DIFGSAVE(DIFG,"@NUM")) I DIFGTYP="MV FIELD"!(DIFGTYP="FILE") S DIFGSKIP(DIFGMULT)=""
 E  S (DIFGALNK,^UTILITY("DIFG@",$J,DIFGSAVE(DIFG,"@NUM")))=$S(($D(DIFGSKIP(DIFGMULT))&(DIFGTYP="MV FIELD"!(DIFGTYP="FILE")))!($S($D(Y):Y<0,1:1)):"^UTILITY(""DIFG@"","_$J_","""_DIFGSAVE(DIFG,"@NUM")_""")",1:+Y)
 I DIFGALNK S ^UTILITY("DIFGX",$J,DIFGSAVE(DIFG,"@NUM"))=X D EXTVAL
 I '$D(Y) S Y=-1
 I DIFGTYP="MV FIELD",$D(DIFGSKIP(DIFGMULT))
 E  K:$D(DIFGDIC) DIFGDIC(DIFGDIC),DIFGDICS(DIFGDIC)
 Q
 ;
EXTVAL ; Save external value
 K D
 I ($D(DIFG("ACGRV"))!($E(X)="`")),$D(Y),Y>0 K DIC("S") NEW Y S X=$S($E(X)="`":$E(X,2,245),1:X),DIC(0)="FIZ",D="B" D IX^DIC S:Y>0 ^UTILITY("DIFGX",$J,DIFGSAVE(DIFG,"@NUM"))=Y(0,0) I 1
 E  I ($D(DIFG("ACGRV"))!($E(X)="`")),$S('$D(Y):1,Y<0:1,1:0) NEW DIC,Y S X=$S($E(X)="`":$E(X,2,245),1:X),DIC=+$P($P(^DD(DIFGDIC,.01,0),U,2),"P",2) I DIC S DIC(0)="FIZ",D="B" D IX^DIC S:Y>0 ^UTILITY("DIFGX",$J,DIFGSAVE(DIFG,"@NUM"))=Y(0,0)
 Q
 ;
MVFIELD F DIFGI=DIFGMULT:-1:1 S DA(DIFGI)=$S(DIFGI=1:DA,1:DA(DIFGI-1))
 I $D(DIFGKEY) G X
 I $D(DIFGSKIP(DIFGMULT)) D SET G X
 I $P(DIFGMO(DIFGMULT),U)="A" S DIFGSKIP(DIFGMULT)="" D SET G X
 I '$D(DIFGFLUS) S DIC=DIFGMGBL(DIFGMULT),DIFGDIC=DIFGM(DIFGMULT) D CALLDIC^DIFG3 I 1
 E  D SET
X Q

DIFG4
DIFG4 ;SFISC/DG(OHPRD)-HANDLES FAILED IDENTIFIER, SPECIFIER, AND FIELD LOOKUPS ; [ 07/15/91  1:30 PM ]
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START ;
 I DIFGTYP="FILE"!(DIFGTYP="MV FIELD") S DIFGPARM=$P(DIFGMO(DIFGMULT),U) I "DM"[DIFGPARM S DIFGER=9_U_DIFGY D ERROR^DIFG G X1
 I DIFGTYP="MV FIELD" G X1 ;Call ENADD^DIFG4 from SET^DIFG2 if a MV FIELD
 I DIFGTYP="",'DIFGLAGO,'$D(DIFGCOND) S DIFGER=10_U_DIFGY D ERROR^DIFG G X1
 I DIFGTYP="",DIFGLAGO,$D(DIFG("CONDSET")),'$D(DIFGCOND) S DIFGER=24_U_DIFGY D ERROR^DIFG G X1
 I DIFGTYP="",DIFGLAGO,'$D(DIFG("CONDSET"))
 I DIFGTYP="",'DIFGLAGO,$D(DIFGCOND) D ^DIFG4A G X1
 I DIFGTYP="SV FIELD",'DIFGLAGO,'$D(DIFGCOND(DIFG,DIFGDIC)) S DIFGER=11_U_DIFGY D ERROR^DIFG G X1 ;END for the BEGIN-END block for a SV FIELD; must have laygo to the pointed to file from the field allowed OR conditional
 I DIFGTYP="SV FIELD",DIFGLAGO,$D(DIFG("CONDSET")),'$D(DIFGCOND(DIFG,DIFGDIC)) S DIFGER=24_U_DIFGY D ERROR^DIFG G X1
 I DIFGTYP="SV FIELD",DIFGLAGO,'$D(DIFG("CONDSET"))
 E  I DIFGTYP="SV FIELD",'DIFGLAGO D ^DIFG4A G X1
 D ENADD
 I $D(DIFGSVN) S DIFGADD=DIFGSVN K DIFGSVN
X1 K %,DIFGPARM,DIFGADFL Q
 ;
ENADD ;
 I DIFGTYP]"",DIFGTYP'="SV FIELD" S DIFGSVN=DIFGADD,DIFGADD=DIFGINCR,DIFGSKIP(DIFGMULT)=""
 E  S DIFGADD=DIFGADD+.0001
 I DIFGTYP'="MV FIELD",DIFGTYP'="FILE" D ENADD2
 I $D(DIFGKEY),DIFGFIRP="KEY" S ^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DIC(""DR"")")=$S(DIFG("PARAM")["N":+$P(DIFGDIX,U,2),1:$O(^DD(DIC,"B",$P(DIFGDIX,U),"")))_"////"_$P(DIFGDIX,"=",2) G X3
 I '$D(^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DIC(""DR"")")) S ^("DIC(""DR"")")=""
 S DIFGDRCT=0 F DIFGI=1:1 Q:'$D(DIFGDIC(DIFGDIC,DIFGI))  S DIFGDIGT=+$P(DIFGDIC(DIFGDIC,DIFGI),"DIFGPC(",2) D:$D(DIFGNUMF(DIFGDIGT)) DICDR
 K DIFGDR,DIFGDRT,DIFGDRVL,DIFGDIGT,DIFGDRCT
X3 Q
 ;
ENADD2 ;SET VARS IF NOT MV FIELD OR FILE
 S ^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DA")="^UTILITY(""DIFG@"","_$J_","""_DIFGSAVE(DIFG,"@NUM")_""")",^("X")=$S($E(X)="`":$E(X,2,245)_"^N",(X["DIFG(""@")!($D(DIFG("ACGRV"))):X_"^N",1:X)
 S ^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"GL")=^DIC(DIFGDIC,0,"GL"),^("MODE")="A"_"^"_DIFGY
 Q
 ;
DICDR ;SAVE FLD NUMBERS AND VALUES IN DIC("DR")
 I DIFGSVVL(DIFGDIGT)[("^UTILITY(""DIFG@"","_$J) S DIFGDRVL=$S(+@DIFGSVVL(DIFGDIGT):"/"_@DIFGSVVL(DIFGDIGT),1:"^S X="_"""`""_"_DIFGSVVL(DIFGDIGT))
 E  S DIFGDRVL="/"_DIFGSVVL(DIFGDIGT)
 I '$D(^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DIC(""DR"")")) S ^("DIC(""DR"")")=""
 I $L(^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DIC(""DR"")"))+$L(DIFGNUMF(DIFGDIGT)_"///"_DIFGDRVL_";")<241 S ^("DIC(""DR"")")=^("DIC(""DR"")")_DIFGNUMF(DIFGDIGT)_"///"_DIFGDRVL_";" G X2
 I $D(^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DIC(""DR"")",DIFGDRCT)),$L(^(DIFGDRCT))+$L(DIFGNUMF(DIFGDIGT)_"///"_DIFGDRVL_";")<241 S ^(DIFGDRCT)=^(DIFGDRCT)_DIFGNUMF(DIFGDIGT)_"///"_DIFGDRVL_";"
 E  S DIFGDRCT=DIFGDRCT+1,^UTILITY("DIFG",$J,DIFGADD,DIFGDIC,"DIC(""DR"")",DIFGDRCT)=DIFGNUMF(DIFGDIGT)_"///"_DIFGDRVL_";"
X2 K DIFGDRVL
 Q
 ;

DIFG4A
DIFG4A ;SFISC/DG(OHPRD)-CONDITIONALS ; [ 08/21/91  5:15 PM ]
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
START ;
 D CHECK
 I $D(DIFGSTP) K DIFGSTP S DIFG("UNRESOLVED",DIFGSAVE(DIFG,"@NUM"))="" G X1
 S DIFGDRCT=0 F DIFGI=1:1 Q:'$D(DIFGDIC(DIFGDIC,DIFGI))  S DIFGDIGT=+$P(DIFGDIC(DIFGDIC,DIFGI),"DIFGPC(",2) D:$D(DIFGNUMF(DIFGDIGT)) GETVAL
 I $E(X)="`",$S('$D(Y):1,Y<0:1,1:0) NEW DIC S DIC=+$P($P(^DD(DIFGDIC,.01,0),U,2),"P",2) I DIC S DIC(0)="FMZ" D ^DIC S:Y>0 X=Y(0,0)
 I X'["`" S ^UTILITY("DIFGFLD",$J,.01)=X
 K Y
 D COND ;dg/ohprd 8-21-91
 I '$D(Y) S Y=-1
 I Y>0 S DIFG("CONDSET")=""
 I Y=-1 S DIFGER=22_U_DIFGY D ERROR^DIFG
 K DIFGDRCT,DIFGDIGT,^UTILITY("DIFGFLD",$J)
X1 Q
 ;
CHECK ; Check for existence of higher level conds, if exist quit this level
 ; and continue processing
 NEW % S %=0 F  S %=$O(DIFGCOND(%)) S:%<DIFG&% DIFGSTP="" Q:%=""!(%<DIFG)
 Q
 ;
GETVAL ; Save field numbers and values
 I $D(^UTILITY("DIFGX",$J,DIFGDIGT)) S ^UTILITY("DIFGFLD",$J,DIFGNUMF(DIFGDIGT))=^(DIFGDIGT)
 Q
 ;
COND ; Execute conditions
 NEW ORDR,CNUM,NUM,STP,FLD,OP,VAL
 F ORDR=0:0 S ORDR=$O(^DD(DIFGDIC,0,"FD","B",ORDR)) Q:'ORDR!$D(Y)  S CNUM=$O(^(ORDR,"")),TYPE=$P(^DD(DIFGDIC,0,"FD",CNUM,0),U,3) K STP F NUM=0:0 S NUM=$O(^DD(DIFGDIC,0,"FD",CNUM,NUM)) D:NUM'=+NUM SETY Q:NUM'=+NUM  D  Q:$D(STP)
 . S FLD=$P(^DD(DIFGDIC,0,"FD",CNUM,NUM),U),OP=$P(^(NUM),U,2),VAL=$P(^(NUM),U,3)
 . I $S('$D(^UTILITY("DIFGFLD",$J,FLD)):1,1:0) S STP="" Q
 . I @("^UTILITY(""DIFGFLD"",$J,FLD)"_OP_"VAL")
 . E  S STP=""
 Q
 ;
SETY ; Sets Y to value of "D" node or value from execution of "C" node
 I TYPE="M",$D(^DD(DIFGDIC,0,"FD",CNUM,"C")) X ^("C")
 I TYPE="F",$D(^DD(DIFGDIC,0,"FD",CNUM,"D")) S Y=^("D")
 I $D(Y),Y'>0 K Y
 E  I $D(Y),'$D(@(^DIC(DIFGDIC,0,"GL")_"Y)")) K Y
 Q
 ;

DIFG5
DIFG5 ;SFISC/DG(OHPRD)-MISC FUNCTIONS ;3/11/93  1:25 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
CHECKY ;CHECKS Y AFTER DIC CALL
 I Y>0,DIFGTYP="FILE"!(DIFGTYP="MV FIELD"),$P(DIFGMO(DIFGMULT),U)="L" S ^("MODE")="M"_"^"_$P(^UTILITY("DIFG",$J,DIFGINCR,DIFGDIC,"MODE"),U,2)
 I Y>0 G X1
 S DIFGCHEK=0 I DIFGTYP="MV FIELD"!(DIFGTYP="FILE") S DIFGCHEK=1
 I DIFGCHEK,$P(DIFGMO(DIFGMULT),U)="L",DIFGTYP'="MV FIELD" S X=$S($D(DIFG("ACGRV")):X_"^N",1:X),DIFGSKIP(DIFGMULT)="" D ^DIFG4 G X1 ;Set X to X^N if internal pointer value was used in lookup, lets ^DIFG7 know if X internal value or not
 I DIFGCHEK,$P(DIFGMO(DIFGMULT),U)="L",DIFGTYP="MV FIELD" S DIFGSKIP(DIFGMULT)="" G X1
 I 'DIFGCHEK D ^DIFG4 G X1
 I DIFGCHEK,$P(DIFGMO(DIFGMULT),U)="D" G X1 ;If no entry found to delete, continue
 I DIFGCHEK,$P(DIFGMO(DIFGMULT),U)="M" S DIFGER=12_U_DIFGY D ERROR^DIFG G X1 ;Lookup for entry failed (no earlier "add" since DIFGFLUS undefined - if DIFGFLUS defined, wouldn't have done ^DIC)
X1 K DIFGCHEK Q
 ;
KEY ;DETERMINE @LINK VALUE FROM KEY
 S DIFG("KEY","XREF")=""""_$P($P(DIFGDIX,U,3),"=")_"""",DIFG("KEY","VAL")=""""_$P(DIFGDIX,"=",2)_"""",DIFG("KEY","GLO")=^DIC(DIC,0,"GL")
 S Y=$O(@(DIFG("KEY","GLO")_DIFG("KEY","XREF")_","_DIFG("KEY","VAL")_","""")"))
 I Y="" S Y=-1 S DIFGER=13_U_DIFGY D ERROR^DIFG
 I 'DIFGER S (^UTILITY("DIFG@",$J,DIFGSAVE(DIFG,"@NUM")),DIFGALNK)=Y,^UTILITY("DIFGX",$J,DIFGSAVE(DIFG,"@NUM"))=X
 Q
 ;
LINK ;FINDS @NUMBER TO LINK DFN TO FROM LOOKUP
 I $F(DIFGDIX,"@") S DIFGSAVE(DIFG,"@NUM")="@"_+$E(DIFGDIX,$F(DIFGDIX,"@"),99) I $D(^UTILITY("DIFG@",$J,DIFGSAVE(DIFG,"@NUM"))) S DIFGFLUS=""
 ;Line before this checks if DIFG("@NUM") exists.  If it exists because it was a modify then don't need to do the lookup.
 ;If exists and is equal to itself (+^UTILITY("DIFG@",$J,"@NUM"))=0, then previous reference to this @link was an add and stll don't do lookup
 Q
 ;
ARRAY ;SETS EXECUTABLE ARRAY FOR DIC("S")
 F DIFGI=1:1 I '$D(DIFGDIC(DIC,DIFGI)) S DIFGI=DIFGI-1 Q
 S DIFGDIC(DIC,DIFGI)=DIFGDIC(DIC,DIFGI)_+Y,DIFGSVVL(DIFGCT)=+Y
 Q
 ;
IDENSPEC ;called from ^DIFG3
 S %=DIFGLAGO NEW DIFGLAGO S DIFGLAGO=$S(%=0:0,$D(DIFGENV("LAYGO",DIC,DIFGNUMF(DIFGCT))):1,DIFGHAT'["'":1,1:0) K %
 S DIFGSAVE(DIFG,"HX")=X,X=$P(DIFGDIX,"=",2) X DIFGLINE
 S DIFGSVVL(DIFGCT)="^UTILITY(""DIFG@"","_$J_",""@"_$P(DIFGDIX,"@",2)_""")" D RCR^DIFG3 G:DIFGER X
 S:$S($D(Y):Y<0,1:1) DIFGNOLK="" S X=DIFGSAVE(DIFG,"HX")
 D:$D(DIFGDIC(DIC))&'$D(DIFGNOLK) ARRAY
X Q
 ;
DOLO ;called from ^DIFG3
 NEW %,%A
 S %A=$S($D(DIFGMGBL(DIFGMULT)):DIFGMGBL(DIFGMULT),1:^DIC(DIC,0,"GL"))
 F %=0:0 S %=$O(@(%A_"%)")) Q:'%  I +^(%,0)=X X DIC("S") I $T S DIFG("FOUND")="",Y=% Q
 I '$D(DIFG("FOUND")) S Y=-1
 Q
 ;
EOJ ;
 S DIFGEL=DIFGY
 S:$G(DIFGBSE)["^UTILITY" DIFGBSE="~"_$P(DIFGBSE,U,2,99) I 'DIFGER!(DIFGER&($S($D(DIFGBSE):$S(+DIFGBSE:1,1:@($TR($P(DIFGBSE,U),"~","^"))),1:0))) S @("DIFGY="_$TR($P(DIFGBSE,U),"~","^")_"_U_$P(DIFGBSE,U,2,3)")
 E  S DIFGY=-1
 I 'DIFGER K DIFGER
 I $D(DIFGREI),($D(DIFGEROR)!'$D(DIFGER)) S DA=DIFGREI,DIK="^DIAR(1.13," D ^DIK K DIK,DA
 K DIFGI,DIFGL,DIFGDIX,DIFGLO,DIFGEND,DIFGMULT,DIFGO,DIFGCT,DIFGEXC,DIFGLINE,DIFGALNK,DIFGSAVX,DIFG,DIFGBSE,DIFGDOL,DIFGNUMF,DIFGPC,DIFGPTER,DIFGVAL,DIFGKEY,DIFGMLND,DIFGDINM,DIFGREI,DIFGCHKG,DIFGEROR,DIFGLC,DIFGENV
 K ^UTILITY("DIFGX",$J),^UTILITY("DIFG@",$J),^UTILITY("DIFG",$J)
 Q

DIFG6
DIFG6 ;SFISC/DG(OHPRD)-UPDATE FILES ;2/3/93  12:23 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START ;
 S DIFGORDR=0
 F DIFGL=0:0 S DIFGORDR=$O(^UTILITY("DIFG",$J,DIFGORDR)) Q:DIFGORDR=""!(DIFGER)  D SETVAR D:'$D(DIFGNODL) PROCESS K DIFGNODL
 D EOJ
 Q
 ;
SETVAR ;SET UP VARIABLES FOR DI* CALLS FOR A GIVEN ENTRY IN ^UTILITY("DIFG",$J,...)
 S DIFGFILE=$O(^UTILITY("DIFG",$J,DIFGORDR,0))
 S DIFGMODE=$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U)
 I DIFGMODE="D",^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA")=-1 S DIFGNODL="" G X3
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"X")) S:^("X")["^UTILITY" ^("X")="~"_$E(^("X"),2,$L(^("X"))) S X=$S($P(^("X"),U,2)'="N"!(+^("X")):$P(^("X"),U),1:@($TR($P(^("X"),U),"~","^")))
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA(1)")) F DIFGI=1:1 Q:'$D(^("DA("_DIFGI_")"))  S @("DA("_DIFGI_")="_^("DA("_DIFGI_")"))
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DIC(""P"")")) S DIC("P")=^("DIC(""P"")") ;Exists if a multiple and calling DIC to add
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DIC(""DR"")")) S DIC("DR")=^("DIC(""DR"")")
 ;I $D(DIC("DR")) S DIFGZRO=0 F DIFGL=0:0 S DIFGZRO=$O(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DIC(""DR"")",DIFGZRO)) Q:'DIFGZRO  S DIC("DR"
X3 Q
 ;
PROCESS ;DETERMINE WHICH DI* ROUTINE(S) TO CALL FOR A GIVEN ENTRY
 I DIFGMODE="A" S DIC=^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"GL") D CALLDIC^DIFG7 S:'DIFGER DIFGAVAL=+Y D:'DIFGER ADDCONT G X1
 D BUILDDR
 S DIE=^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"GL"),@("DA="_^("DA")) I $D(DR),DR]"" D CALLDIE^DIFG7 I $D(Y) S DIFGER=14_U_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2) D ERROR^DIFG G X1
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"WP")) D WP^DIFG7 I $D(Y) S DIFGER=17_"^"_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2) D ERROR^DIFG G X1
 I DIFGMODE="D",'DIFGER S DIK=DIE D CALLDIK^DIFG7
 I 'DIFGER S $P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA"),"^",2)="I"
X1 K DIC,DIE,DIK,DA,DR,DIFGAVAL
 Q
 ;
ADDCONT ;CONTINUATION OF MODE="A" PROCESSING UPON RETURN FROM ^DIC
 S DA=DIFGAVAL,DIE=DIC
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"WP")) D WP^DIFG7 I $D(Y) S DIK=DIE,@(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA"))="" D CALLDIK^DIFG7 S DIFGER=17_"^"_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2)_"^I" D ERROR^DIFG G X1
 D BUILDDR
 I $D(DR),DR]"" S DA=DIFGAVAL D CALLDIE^DIFG7 I $D(Y) S DIK=DIE,@(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA"))="" D CALLDIK^DIFG7 S DIFGER=15_U_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2) D ERROR^DIFG
 I 'DIFGER S @(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA"))=DIFGAVAL,^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DA")=DIFGAVAL_"^I" D RESET
 Q
 ;
BUILDDR ;SET DR (BUILD DR ARRAY IF APPROPRIATE)
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DR")) S DR=^("DR")
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DR"))=11 S DIFGZRO=0 F DIFGL=0:0 S DIFGZRO=$O(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DR",DIFGZRO)) Q:'DIFGZRO  S DR(1,DIFGFILE,DIFGZRO)=^(DIFGZRO)
 Q
 ;
RESET ;RESETS MODE INDICATOR IN FILEGRAM FROM "A" TO "M"
 I DIFGORDR'<1 S DIFGTMP=DIFGLO_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2)_",0)",DIFGVL0=@DIFGTMP,DIFGVL1=$P(DIFGVL0,"="),DIFGVL2=$P(DIFGVL0,"=",2,3),$P(DIFGVL1,U,3)="M"
 E  G X2
 S DIFGTMP="^UTILITY(""DIFGFG"",$J,$P(^UTILITY(""DIFG"",$J,DIFGORDR,DIFGFILE,""MODE""),U,2))"
 S @(DIFGTMP_"=DIFGVL1_""=""_DIFGVL2")
 ;
X2 Q
 ;
EOJ K DIFGI,DIFGORDR,DIFGFILE,DIFGMODE,DIFGTMP,DIFGVL0,DIFGVL1,DIFGVL2,DIFGDRVL,DIFGDRPT,DIFGZRO
 Q

DIFG7
DIFG7 ;SFISC/DG(OHPRD)-CALLS TO DIC,DIE,DIK ;9MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;;22.0;VA FileMan;;Mar 30, 1999
 ;THIS ROUTINE CONTAINS IHS MODIFICATIONS BY IHS/TUCSON/LAB 3/13/96
 ;This routine is modified to pass back to the caller, an array,
 ;DIFGYFE(file,da) of all entries that were either added or edited
 ;during the filegram install.  It is the responsibility of the 
 ;caller to kill DIFGYFE
 ;
CALLDIC ;
 I $D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DINUM")) S DINUM=^("DINUM")
 S DIADD=1,DIC(0)="FLI" I $P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"X"),U,2)]"" S X="`"_X
 S DLAYGO=DIFGFILE
 S DITC=""
 D ^DIC
 K DITC
 ;----- BEGIN IHS MODIFICATIONS
 ;ORIGINAL MODIFICATIONS BY IHS/TUCSON/LAB 3/13/96
 ;COMMENTED OUT LINE BELOW AND REPLACED WITH NEXT LINE TO ADD ,K Q
 ;SO THAT IF THERE IS AN ERROR VARS WILL GET KILLED THEN QUIT
 ;I Y<1 S DIFGER=16_U_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2) D ERROR^DIFG
 I Y<1 S DIFGER=16_U_$P(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"MODE"),U,2) D ERROR^DIFG,K Q
 ;ADDED NEXT LINE TO PASS BACK TO CALLER, THE IEN,FILE OF ENTRY ADDED
 S DIFGYFE(DIFGFILE,+Y)=$P(Y,U,3)
 ;COMMENTED LINE BELOW AND REPLACED BY NEXT LINE TO ADD LINE LABEL K
 ;SO IT COULD BE CALLED
 ;K DIADD,DLAYGO,DR,DINUM
K K DIADD,DLAYGO,DR,DINUM
 ;----- END IHS MODIFICATIONS
 Q
 ;
CALLDIE ;
 I DR[".01///"&($P(^DD(DIFGFILE,.01,0),U,5,99)["DINUM"!$D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"DINUM"))) S DIFGDRVL=$P($P(DR,".01///",2),";"),DR=$P(DR,".01///"_DIFGDRVL)_$P(DR,".01///"_DIFGDRVL_";",2)
 NEW I F I=0:1 Q:'$D(@("D"_I))  K @("D"_I)
 S DITC=""
 D ^DIE K DITC
 ;----- BEGIN IHS MODIFICATION
 ;ORIGINAL MODIFICATION BY IHS/TUCSON/LAB 3/13/96
 ;NEW LINE ADDED TO PASS BACK IEN,FILE THAT WAS EDITED
 I $G(DA),'$D(DIFGYFE(DIFGFILE,DA)) S DIFGYFE(DIFGFILE,DA)=""
 ;----- END IHS MODIFICATION
 Q
 ;
WP ;PROCESS WORD PROCESSING FIELD
 S DIFG("FIELD")=^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"WP",0)
 F DIFGI=1:1 Q:'$D(^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"WP",DIFGI))  D:^(DIFGI)[";" CHANGE S DR=DIFG("FIELD")_"///+"_^(DIFGI) D ^DIE
 K DR
 Q
 ;
CHANGE ;TEXT CONTAINS A ";"
 S DIFGSECP=^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"WP",DIFGI) D PARSE^DIFG1 S ^UTILITY("DIFG",$J,DIFGORDR,DIFGFILE,"WP",DIFGI)="^S X="_DIFGSECP
 Q
 ;
CALLDIK ;
 D ^DIK
 Q
 ;

DIFGA
DIFGA ;SFISC/XAK-FILEGRAM TEMPLATES ;3/5/93  1:22 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIC=DI,(DIPT,DC(0))=DA,DC(1)=0 D INIT^DIFGA1,GET^DIFGB,L S L=1,DE="",DJ=0
 K DNP Q
 ;
EN D INIT^DIFGA1 I $D(DIAX) G Q:Y'>0
L D RD I X=U!$D(DTOUT) G Q
 I X="",DL=1 D:DJ ^DIFGB D:$D(DIAXE01)&'(U[X) F1^DIAXMS G:(+$G(DIERR)&'(U[X)) ERR G Q
 I 'DJ,$E(X)="[" D TEM^DIFGB G Q:X=U
 D PR
 I $D(Y(0)),+$P(Y(0),U,2),$P(^DD(+$P(Y(0),U,2),.01,0),U,2)["W" S Y(0)=$P(Y,U,2) I $D(DIAX) S $P(Y(0),U,2)=$P(^(0),U,2)
 D:$D(Y) ST G Q:$D(DIRUT)
 I DINS,DINS<DL S DINS(DINS)=DC,DC=0,DINS=""
 G L
ERR W !!,$C(7),"THE DESTINATION FILE DATA DICTIONARY SHOULD BE MODIFIED PRIOR TO ANY MOVEMENT",!,"OF EXTRACT DATA!"
Q G Q^DIFGA1
 ;
RD ;
 S DU=$P(^DD(DK,0),U) S:DU="FIELD" DU=$O(^(0,"NM",0))_" "_DU
 W !?DL+DL-2 W $S(DJ:" THEN",1:"FIRST")_$S($D(DIAX):" EXTRACT ",1:" SEND ")_DU_": "
 G 1:'DC
 D:'$D(DC(DC)) GET^DIFGB G 1:'DC W $P(DC(DC),U)
 I $L($P(DC(DC),U))>19 S Y=$P(DC(DC),U) D RW^DIR2 G 2
 I DC(DC)]"" W "// "
1 R X:DTIME I '$T S DTOUT=1 Q
2 Q:'DC  S DINS=X?1"^"1.E,X=$S(DINS:$E(X,2,999),X="":$P(DC(DC),U),1:X) S:DC(DC)=""&$L(X) DINS=1 S:DINS DINS=DL
 Q
PR ;
 S (S,DM,DIFG,DIFGLINK)="" K DIC,Y
 I X="" D UP Q
 I X?1"""".E1"""".E G QQ
 I X="ALL",'DJ W "  Do you mean ALL the fields in the file" S %=2 D YN^DICN S Y=$S(%<0:"",%=1:"ALL",1:%) Q:X[Y  W !?10,X
 S DIC="^DD(DK,",DIC(0)="ZE"_$E("O",DC>0),DIC("W")="W:$P(^(0),U,2) ""  (multiple)"""
 S DIC("S")=$S('$D(DIAX):"I $P(^(0),U,2)'[""C""",1:"") S:$D(DICS) DIC("S")=DIC("S")_" X DICS"
 D ^DIC Q:Y>0  I X?1"?".E K Y Q
 I DC,X="@" D DC K Y Q
 S DIC(0)="EYZ",D="GR" I $D(^DD(DK,D)),'$D(DIAX) D IX^DIC Q:$D(Y)=11
 G:X'?.E1":" QQ
 I $L(X,":")>2 S %=$O(^DD(DK,"B",$P(X,":"),0)) G:'% QQ G:$P(^DD(DK,%,0),U,2)'["C" QQ
 S DM=X,DQI="DIP(",DA="",DICOMP=DIL_$E("?",''L)_"T"
 S (DICOMPX,DICMX)="",DIFG=$S($L(X,":")>2:5,1:1) D ^DICOMPW G:'$D(X) QQ
 S:+DIFG("DICOMP")=DK DM=$P(^DD(DK,+$P(DIFG("DICOMP"),U,2),0),U,1)_":" S:DIFG?1A.E DIFGLINK=DIFG,DIFG=4 Q
ST ;
 I $D(DIAX),Y="ALL" W !,$C(7),"SORRY, THIS FUNCTIONALITY IS NOT SUPPORTED AT THIS TIME." Q
 I Y="ALL" D N S DJ=DJ+1 K DIFGALL Q
 I 'Y,$D(Y)=11 F Y=0:0 S Y=$O(Y(Y)) Q:Y'>0  S X=^DD(DK,Y,0) D Y
 Q:Y'>0
 I $D(DIAX),$D(Y)=11,$P(Y(0),U,2)["m" W !,$C(7),"SORRY, CANNOT EXTRACT THIS TYPE OF COMPUTED FIELD AT THIS TIME." Q
 I DIFG]"" S %=Y,S=U_$P(DP,U,2)_U_S,X=1 D D1 S DK=+DP,Y=0,DIL=+% D Y Q
 I $P(Y(0),U,2) S DM=$P(Y(0),U) D D,Y S X=$P($P(Y(0),U,4),";"),I(DIL)=$S(+X=X:X,1:$C(34)_X_$C(34)),J(DIL)=DK Q
 S Y=+Y D Y
 Q
 ;
D D D1 S DK=+$P(^DD(DK,+Y,0),U,2),DIL=DIL+1,Y=0,DIFG=3 Q
D1 S DJ1(DL)=DJ,DIL(DL)=DIL,DJ=0,C(DL)=C,DL(DL)=DK,DL=DL+1,(C,C(0))=C(0)+1
 Q
 ;
U S DL=DL-1,C=C(DL),DK=DL(DL),DIL=DIL(DL) S:$D(DIAX) (DIAXF,DIAXFILE)=DIAXDL(DL) S DJ=$S(DJ&'DJ1(DL):1,1:DJ1(DL)) K:DL=1 DIAXSB
 I $D(DINS(DL)) S DC=DINS(DL)-1 K DINS(DL)
 F %=DIL:0 S %=$O(I(%)) Q:%'>0  K I(%),J(%),DJ1(%)
 Q
 ;
DC I 'DINS K:DC>1 DC(DC) D DC1 S DC=DC+1
 Q
DC1 Q:(X'="@"!(DC'=2))  S DC=DC+1
 F  Q:'$D(DC(DC))  K DC(DC) S DC=DC+1
 S DC=DC-2 Q
 ;
Y S S=Y_S
DJ I $D(DIAX) D DIAX Q
 I C,'DJ1(DL-1) S:'$D(^UTILITY("DIFG",$J,C-1)) ^(C-1)=DL(DL-1)_U_(DL-1)_U_U_U_U_DT_U
 I '$D(^UTILITY("DIFG",$J,C))#2 S ^(C)=DK_U_DL_U_$S(DL>1:DL(DL-1),1:"")_U_DIFG_U_DM_U_DT_U_DIFGLINK
 S:$D(DIFGALL) $P(^UTILITY("DIFG",$J,C),U,8)=1
 S:S DJ=DJ+1,^(C,DJ)=S S S="" D DC:DC Q
 ;
N S I=DL,DM="ALL",DIFGALL=1 D Y S DM=""
NN S Y=.001 ;I $D(^DD(DK,Y)) D Y
A S Y=$O(^DD(DK,Y)) I $D(^(Y,8)),$D(DICS) X DICS E  G A
 I Y'>0 G UP:I'<DL D U S Y=Y(DL) G A
 I $P(^(0),U,2) G A:$P(^DD(+$P(^(0),U,2),.01,0),U,2)["W" S Y(DL)=Y D D,Y G NN
 G A ;D Y G A
 ;
UP K DIC I DL>1 D U,DC:DC
 Q
 ;
QQ W $C(7)," ??" K Y Q
 ;
DIAX I 'S,$G(DIFG)>2 S DIAXDICA=$S(DIFG=3:Y(0,0),1:DM) D ^DIAXMS I $D(DIAXUP) D UP K DIAXUP,DIAXSB Q
 S DIAXDK(DK)=DIAXF,DIAXDL(DL)=DIAXF
 I C,'$D(^UTILITY("DIFG",$J,C(DL-1))) S ^(C(DL-1))=DL(DL-1)_U_(DL-1)_U_U_U_U_DT_U_U_U_DIAXDL(DL-1)_U_DIAXDK(DL(DL-1)),DIAXE01(DIAXDL(DL-1))=(DL-1)_U_$G(DIAXSB)
 I '$D(^UTILITY("DIFG",$J,C))#2 S ^(C)=DK_U_DL_U_$S(DL>1:DL(DL-1),1:"")_U_DIFG_U_DM_U_DT_U_DIFGLINK_U_U_DIAXF_U_$S(DL>1:DIAXDK(DL(DL-1)),1:DIAXF)_U_$G(DIAXNP(DL-1)),DIAXE01(DIAXF)=DK_U_$G(DIAXSB)
 I S D EN2^DIAXM Q:$D(DIRUT)
 S S="" D DC:DC W ! Q

DIFGA1
DIFGA1 ;SFISC/XAK,DCM-FILEGRAM TEMPLATES ;2/27/99  12:35
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
Q W:$D(DTOUT) $C(7)
 K Y,C,L,DM,DQI,DA,DICOMP,DICOMPX,I,J,S,DIL,DK
 K D,DIFG,DC,DICS,DP,DU,DXS,DL,DJ,DINS,DIFGLINK
 K DIAXLOC,DIAXMSG,DIAXGL,DIAXF,^UTILITY("DIFG",$J),DJ1,DIAXEF,DIAXDL,DIAXDI,DIAXFILE,DIAXFNO
 K DIAXDICA,DIAXNP,DIAXZ,DIAXDK,DTOUT,DUOUT,DIRUT
 D:$D(DIAX) Q1^DIAXMS
 Q
 ;
INIT K ^UTILITY("DIFG",$J)
 S (L,DL)=1,(I(0),DI)=DIC,(DK,J(0))=+$P(@(DI_"0)"),U,2)
 S DINS="",(DC,DJ,C,C(0),DIL)=0 Q:'$D(DIAX)
 ;
INET K DIC
 S DIC=1,DIC(0)="AEQZ",DIC("S")="I Y'<2,+Y'="_DK_" S DIFILE=+Y,DIAC=""RD"" D ^DIAC I %",DIC("A")="DESTINATION FILE: " D ^DIC Q:Y'>0
 S (DIAXF,DIAXFILE,DIAXFNO,DIAXDL(DL),DIAXDK(DK))=+Y,DIAXGL=$E(^DIC(+Y,0,"GL"),2,99),DIAXEF=Y(0,0),DIAXLOC(DIAXFILE)=""
 Q

DIFGB
DIFGB ;SFISC/XAK-STORE FILEGRAM TEMPLATE ;5/23/96  11:16
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PUT ;
 W !,"STORE ",$S($D(DIAR):"ARCHIVE",$D(DIAX):"EXTRACT",1:"FILEGRAM")_" LOGIC IN TEMPLATE: "
 R X:DTIME S:'$T DTOUT=1,X="" G Q:U[X
 S DIC="^DIPT(",D="F"_DK
 S DIC("S")="S %=^(0) I $P(%,U,8)="_$S($D(DIAX):2,1:1)_",$P(%,U,4)=DK!'$L($P(%,U,4))"_$P(" F DW=1:1:$L($P(%,U,3)) I DUZ(0)[$E($P(%,U,3),DW) Q",U,DUZ(0)'="@"&L)
 S DIC(0)="ELZSQI",DIC("S")="I Y'<1 "_DIC("S"),Y=-1,DLAYGO=0 D IX^DIC:X]"" K DIC,DLAYGO G:Y<0 PUT:X'[U,Q
 S S=$O(^DIPT(+Y,0))]""
 I S W $C(7),!,"TEMPLATE ALREADY STORED THERE...." D W:DUZ(0)'="@" G PUT:'$T W " OK TO REPLACE" S %=0 D YN^DICN W ! G PUT:%-1 D PURGE
 S ^DIPT(+Y,0)=$P(Y,U,2)_U_DT_U_DUZ(0)_U_DK_U_DUZ_U_DUZ(0)_U_DT,^DIPT("F"_DK,$P(Y,U,2),+Y)=1
 I '$D(DIAX) S ^DIPT("FG",$P(Y,U,2),+Y)="",$P(^DIPT(+Y,0),U,8)=1
 E  S $P(^DIPT(+Y,0),U,8,9)=2_U_DIAXFNO
 S Y=+Y,%X=""
 F %=1:1 S %X=$O(^UTILITY("DIFG",$J,%X)) Q:%X=""  S ^DIPT(Y,1,%,0)=^(%X) D FLD
 S:%-1 ^DIPT(Y,1,0)="^.41^"_(%-1)_U_(%-1)
 I '$D(DIAX) S ^DIPT(Y,"F",2)="S DIFGT="""_$P(^DIPT(+Y,0),U)_""",DIFGBFN="_DK_" D FG^DIFGB;X"
Q K ^UTILITY("DIFG",$J),DIFG Q
 ;
PURGE L +^DIPT(+Y)
 S %Y=0 F %X=0:0 S %Y=$O(^DIPT(+Y,%Y)) Q:%Y=""  K:%Y'="%D" ^DIPT(+Y,%Y)
 L -^DIPT(+Y)
 Q
 ;
W S %=$P(^DIPT(+Y,0),U,6) F X=1:1:$L(%) I DUZ(0)[$E(%,X) Q
 Q
 ;
FLD S %Y=""
 F S=1:1 S %Y=$O(^UTILITY("DIFG",$J,%X,%Y)) Q:%Y=""  S ^DIPT(Y,1,%,"F",S,0)=^(%Y)
 S:S-1 ^DIPT(Y,1,%,"F",0)="^.411^"_(S-1)_U_(S-1) Q
 ;
TEM ;
 S X=$E(X,2,99),DIC="^DIPT(",DIC(0)="SQEM",D="FG" I X["?"!($D(DIAX)) S D="F"_DK
 S DIC("S")="I $P(^(0),U,4)="_DK_",$P(^(0),U,8)="_$S($D(DIAX):2,1:1)_$S($D(DIAX):",$P(^(0),U,9)=DIAXFNO",1:"")
 D IX^DIC S X="" Q:Y<0
EN ;
 K DIR S DA=+Y
 S DIR(0)="Y",DIR("A")="WANT TO EDIT '"_$P(Y,U,2)_"' TEMPLATE"
 D ^DIR K DIR S:'Y!$D(DTOUT) X=U Q:'Y  D DIE I '$D(DA) S DC=0 Q
 S DC(1)=0,DC(0)=DA K DA D GET
 S DJ=0,X="" ;D EN^DIFGA,PUT:X'=U
 Q
GET S DC(1)=$O(^DIPT(DC(0),1,+DC(1))),DC=0 Q:+DC(1)'=DC(1)
 S %=^(DC(1),0),X=+% Q:'X  S DC=1
 I DL>1,$P(%,U,2)'>DL F J=$P(%,U,2):1:DL S DC=DC+1,DC(DC)=""
 I $D(DIAX),$P(%,U,4)>2 S $P(DC(1),U,3)=$O(^DD(+$P(%,U,9),0,"NM",""))
 I $P(%,U,5)]"" S DC=DC+1,DC(DC)=$P(%,U,5)
 F J=0:0 S J=$O(^DIPT(DC(0),1,+DC(1),"F",J)) Q:+J'=J  S %=^(J,0),DIAXZ=$P(%,U,2,9),%=+%,%=$S($D(^DD(X,%,0)):$P(^(0),U),1:%) S:'% DC=DC+1,DC(DC)=%_U_DIAXZ
 S DC=$S($D(DC(2)):2,1:0)
 Q
DIE N DL,DK,DI
 S DIE="^DIPT(",DR=".01;3;6" D ^DIE K DIE,DR S X=""
 Q
FG ;Entry from Print template
 K ^UTILITY($J,"W")
 S DIFG("FE")=D0,DIFG("FUNC")="L",DIFG("FGR")="^UTILITY(""DIFG"",$J,"
 I 'DIFGT S DIC="^DIPT(",D="FG",DIC("S")="I $P(^(0),U,4)="_DIFGBFN,DIC(0)="O",X=DIFGT K DIFGBFN D IX^DIC S:+Y DIFGT=+Y I Y'>0 K DIFG,DIFGT G Q
 I $G(DIAR)=4 S DIFG("FGR")="^DIAR(1.11,DIARC,""D""," I DIARF=DIARF2,$D(^DIC(+DIARF,0,"GL")) S D1=^("GL"),@(D1_"D0,-9)")=DIARC
 I $G(DIARP)]"",+DIARP'=+DIFGT S DIFGT=DIARP,^DIPT(DIARP,"F",2)="S DIFGT="_DIARP_" D FG^DIFGB;X"
 N DI,D0 D START^DIFGG
 I $D(DIARD) S DIARD=DIARD+1 W:(DIARD#50=0) !,DIARD," RECORDS PROCESSED"
 I $G(DIAR)=4 S ^DIAR(1.11,DIARC,"D",0)="^1.113^"_DILC_U_DILC Q
 S DIWL=1,DIWR=IOM-1,DIWF="NW"
 F D1=0:0 S D1=$O(^UTILITY("DIFG",$J,D1)) Q:D1'>0  S X=^(D1,0) D ^DIWP Q:'DN
 D:DN ^DIWW G Q
WR F D1=0:0 S D1=$O(^DIAR(1.11,DIARC,"D",D1)) Q:D1'>0  S X=^(D1,0) W X
 G Q

DIFGG
DIFGG ;SFISC/XAK,EDE(OHPRD)-FILEGRAM GENERATOR ;7/25/92  2:15 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DIFG S DIFG=DIC,DIC("A")="Select FILEGRAM TEMPLATE: "
 S DK=+Y,DIC="^DIPT(",DIC("S")="I $P(^(0),U,8)=1 S %=^(0) I $P(%,U,4)=DK!'$L($P(%,U,4))",DIC(0)="QEAIS",D="F"_+Y
 D IX^DIC K DIC,DY Q:Y<0  S (DIFG("TEMPLATE"),DIFGT)=+Y
 S DIC=DIFG,DIC(0)="QEAM" D ^DIC Q:Y<0  S DIFG("FE")=+Y,DIFG("FUNC")="L",DIFG("DUZ")=$S($D(^VA(200,DUZ,0)):$P(^(0),U),$D(^DIC(3,DUZ,0)):$P(^(0),U),1:DUZ)
 D START,SEND,LOG K DIFG,^UTILITY("DIFG",$J) Q
 ;
EN ; EXTERNAL ENTRY POINT
START ;
 D INIT
 I DIFG("QFLG") D EOJ Q
 D HDR,ENV,BODY,TLR,EOJ
 Q
 ;
HDR ; FILEGRAM HEADER
 S V="$DAT"_U_DIFG(DILL,"FNAME")_U_DIFG(DILL,"FILE")_U_DIFG("PARM")_U
 D INCSET^DIFGGU
 K Y Q
 ;
ENV ; ENVIRONMENTAL VARS
 I $D(DIFG("ENV"))
 E  Q
 S DIFG("EV")=""
 F  S DIFG("EV")=$O(DIFG("ENV",DIFG("EV"))) Q:DIFG("EV")=""  S V="ENVIRONMENT:"_DIFG("EV")_"="""_DIFG("ENV",DIFG("EV"))_"""" D INCSET^DIFGGU ;ihs/ohprd/dg;patch 2;8-22-91
 K DIFG("EV") Q
 ;
BODY ; FILEGRAM BODY
 D BASE
 K DIFG("NOKEY")
 D NEXTLVL
 Q
 ;
BASE ; BASEFILE ENTRY
 D LOOKUP^DIFGGU
 D FIELDS
 Q
 ;
NEXTLVL ; DO NEXT LEVEL FILES/SUBFILES (CALLED RECURSIVELY)
 S DIFG(DILL,"DIFGI")=DIFGI
 S DILL=DILL+1
 F DIFGI=DIFGI:0 S DIFGI=$O(^DIPT(DIFGT,1,DIFGI)) Q:DIFGI'=+DIFGI  S X=^(DIFGI,0) D NEXTLVL2 Q:DIFGI=""
 S DILL=DILL-1
 S DIFGI=DIFG(DILL,"DIFGI")
 Q
 ;
NEXTLVL2 ; CHECK TEMPLATE ENTRY
 I $P(X,U,2)<DILL S DIFGI="" Q
 Q:$P(X,U,3)'=DIFG(DILL-1,"FILE")  ; this is probably a template error
 D FVARS^DIFGGI
 I DIFG(DILL,"XREF")?1A.E D DIFGG3^DIFGG4 Q  ; file shift
 I DIFG(DILL,"XREF")=3 D ^DIFGG4 Q  ; subfile shift
 Q:'DIFG(DILL,"FE")
 ; only things left are dinum back pointers, direct forward pointers,
 ; and lookup file shifts, I think.
 D LOOKUP^DIFGGU
 I $D(DIFGGUQ) K DIFGGUQ Q
 D FIELDS
 D RECURSE
 S DITAB=2*(DILL-1)
 S V=":" D INCSET^DIFGGU
 Q
 ;
RECURSE ; RECURSION FOR DINUM BACK POINTERS AND FORWARD DIRECT POINTERS
 D NEXTLVL
 Q
 ;
FIELDS ; FILEGRAM FIELDS
 S DITAB=DITAB+2 D ^DIFGG2 S DITAB=DITAB-2
 Q
 ;
LOG ; RECORD THE SENDING
 Q:$D(DIAR)!$D(DY)
 S DIC=1.12,X="NOW",DIC(0)="L",DLAYGO=1.12,DIADD=1 D ^DIC Q:Y<0  G LOG:'$P(Y,U,3)
 S ^DIAR(1.12,+Y,0)=$P(Y,U,2)_"^s^"_DIFG("DUZ")_U_DIFG_U_DIFG("FE")_U_XMZ_U_DIFG("TEMPLATE")
 K DIC,DIE,DR,DA,DLAYGO,DIADD,XMZ
 Q
 ;
 ;
SEND ; CALL MAILMAN
 Q:$D(DIAR)!$D(DY)
 S XMSUB="FILEGRAM for entry #"_DIFG("FE")_" in "_$O(^DD(DIFG,0,"NM",0))_" FILE (#"_DIFG_")."
 S XMTEXT=DIFG("FGR"),XMDUZ=DUZ D ^XMD
 Q
 ;
TLR ; FILEGRAM TRAILER
 S V="$END DAT",DITAB=0
 D INCSET^DIFGGU
 Q
 ;
INIT ; INITIALIZATION
 D ^DIFGGI
 Q
 ;
EOJ ;
 S:DIFG("QFLG") DIFGER=DIFG("QFLG")
 F I=0:0 S I=$O(DIFG(I)) Q:I'=+I  K DIFG(I)
 K ^UTILITY("DIFGLINK",$J)
 K DIFG2,DIFGI,DIFGT,DILL,DITAB,DIFGENV,DIFGGU,DIFGGF ;Don't kill DILC used by EN^DIFGG;ihs/ohprd/dwg;patch 2;8-22-91
 K %H,%K,%W,S,V,X
 Q

DIFGG2
DIFGG2 ;SFISC/XAK,EDE(OHPRD)-FILEGRAM FIELDS ;2/4/93  10:59 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"))
 D DRS
 K S,V,X,DIFG2
 Q
 ;
DRS S DR=""
 I $P(^DIPT(DIFGT,1,DIFGI,0),U,8) F DIFG2=.001:0 S DIFG2=$O(^DD(DIFG(DILL,"FILE"),DIFG2)) Q:DIFG2'>0  S %=$P(^(DIFG2,0),U,2) I $S('%:%'["C",1:$P(^DD(+%,.01,0),U,2)["W") S DR=DR_DIFG2_";" I $L(DR)>200 D DR S DR=""
 F DIFG2=0:0 S DIFG2=$O(^DIPT(DIFGT,1,DIFGI,"F",DIFG2)) Q:DIFG2'=+DIFG2  I $D(^(DIFG2,0)) S DR=DR_^(0)_";" I $L(DR)>200 D DR S DR=""
 D DR:DR]"" Q
 ;
EN ;
DR I '$D(DIFG(DILL,"MUL")) S DIC=DIFG(DILL,"FILE"),DA=DIFG(DILL,"FE")
 S DIQ(0)="N" D EN^DIQ1 K DIQ
 I $D(DIFGGF(DIFG(DILL,"FILE"),DIFG(DILL,"FE"))) F DIFG2(DILL,"FLD")=0:0 S DIFG2(DILL,"FLD")=$O(DIFGGF(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"))) Q:'DIFG2(DILL,"FLD")  D
 . NEW VAL
 . S VAL=DIFGGF(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"))
 . S ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"))=$S(VAL]"":VAL,1:"^")
 . Q
 F DIFG2(DILL,"FLD")=0:0 D DR2 Q:DIFG2(DILL,"FLD")'=+DIFG2(DILL,"FLD")  S V=^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD")) D FIELD
 I '$D(DIFG(DILL,"MUL")) K DA,DIC,DR
 K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE")),DIFGGF(DIFG(DILL,"FILE"))
 Q
 ;
DR2 S DIFG2(DILL,"FLD")=$O(^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"))) Q:DIFG2(DILL,"FLD")=""
 I $O(^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"),0)) S V("WP")=0,^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"))="wp"
 Q
 ;
EN2 ;
FIELD Q:V=""
 D SETXY
 K F,N,P,W
 S V=$P(^DD(DIFG(DILL,"FILE"),DIFG2(DILL,"FLD"),0),U,1)_U_$S(DIFG("PARM")["N":DIFG2(DILL,"FLD"),1:"")_"="_X
 D INCSET^DIFGGU
 D:Y'="" PTRCHK
 D:$D(V)>9 WP
 K X,Y,V
 Q
 ;
WP NEW I
 S DITAB=DITAB+2
 S DIFG("WP")=""
 F I=0:0 S I=$O(^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFG2(DILL,"FLD"),I)) Q:I=""  S V=""""_^(I)_"""" D INCSET^DIFGGU
 S V="." D INCSET^DIFGGU
 K DIFG("WP")
 S DITAB=DITAB-2
 Q
 ;
SETXY S X=V
 S Y=""
 Q:$P(^DD(DIFG(DILL,"FILE"),DIFG2(DILL,"FLD"),0),U,2)'["P"
 S F=+$P($P(^DD(DIFG(DILL,"FILE"),DIFG2(DILL,"FLD"),0),U,2),"P",2),W=$P(^(0),U,4),N=$P(W,";",1),P=$P(W,";",2)
 S Y=$P(@(DIFG(DILL,"FGBL")_DIFG(DILL,"FE")_",N)"),U,P)
 I $D(^UTILITY("DIFGLINK",$J,F,Y)) S X="@"_^UTILITY("DIFGLINK",$J,F,Y),Y="" Q
 S ^UTILITY("DIFGLINK",$J)=$S($D(^UTILITY("DIFGLINK",$J))#2:^UTILITY("DIFGLINK",$J)+1,1:1)
 S ^UTILITY("DIFGLINK",$J,F,Y)=^UTILITY("DIFGLINK",$J)
 S Y="@"_^UTILITY("DIFGLINK",$J)
 Q
 ;
PTRCHK Q:$P(^DD(DIFG(DILL,"FILE"),DIFG2(DILL,"FLD"),0),U,2)'["P"
 S DITAB=DITAB+2
 S DILL=DILL+1
 D POINTER
 S DITAB=DITAB-2
 K DIFG(DILL)
 S DILL=DILL-1
 Q
 ;
POINTER S DIFG(DILL,"FILE")=+$P($P(^DD(DIFG(DILL-1,"FILE"),DIFG2(DILL-1,"FLD"),0),U,2),"P",2),X=$P(^(0),U,4) S:$P(X,";")'=+X X=""""_$P(X,";")_""";"_$P(X,";",2)
 S DIFG(DILL,"FE")=$P(@(DIFG(DILL-1,"FGBL")_DIFG(DILL-1,"FE")_","_$P(X,";",1)_")"),U,$P(X,";",2))
 I '$D(^DIC(DIFG(DILL,"FILE"),0)) D KILLLL^DIFGGU Q
 S DIFG(DILL,"FGBL")=^DIC(DIFG(DILL,"FILE"),0,"GL")
 I '$D(@(DIFG(DILL,"FGBL")_DIFG(DILL,"FE")_",0)")) D KILLLL^DIFGGU Q
 S DIFG(DILL,"FNAME")=$P(^DIC(DIFG(DILL,"FILE"),0),U,1)
 I $D(Y),Y'="" S Z=Y,Y=""
 I $D(DIFGENV("LAYGO",DIFG(DILL-1,"FILE"),DIFG2(DILL-1,"FLD")))!($P(^DD(DIFG(DILL-1,"FILE"),DIFG2(DILL-1,"FLD"),0),U,2)'["'") S DIFG(DILL,"NOKEY")=""
 D ^DIFGGSB
 Q

DIFGG4
DIFGG4 ;SFISC/XAK,EDE(OHPRD)-FILEGRAM SUBFILES ;6/10/93  1:41 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SUBFILE ; DO ONE SUBFILE
 F DIFG(DILL,"FE")=0:0 S DIFG(DILL,"FE")=$O(@(DIFG(DILL,"FGBL")_DIFG(DILL,"FE")_")")) Q:DIFG(DILL,"FE")'=+DIFG(DILL,"FE")  D SUBENTRY
 Q
 ;
SUBENTRY ; DO ONE SUBFILE ENTRY
 D DIS Q:'$T
 D DR S DR(DIFG(DILL,"FILE"))=.01
 S DIFG(DILL,"MUL")=1
 D LOOKUP^DIFGGU
 I $D(DIFGGUQ) K DIFGGUQ,DIFG(DILL,"MUL") Q
 D DR,DRS
 D RECURSEM
 S V="^" D INCSET^DIFGGU
 K DIFG(DILL,"MUL"),DA,DR
 Q
 ;
DR ; CREATE DR-STRINGS
 K DR S I=0
 F %=DIFG(DILL,"FILE"):0 Q:'$D(^DD(%,0,"UP"))  S X=^("UP"),Y=$O(^DD(X,"SB",%,0)),DR(X)=Y,DA(%)=DIFG(DILL-I,"FE"),%=X,I=I+1
 S DA=DIFG(DILL-I,"FE"),DIC=DIFG(DILL-I,"FILE"),DR=DR(%) K DR(%)
 Q
 ;
DRS ; PROCESS ALL DR STRINGS FOR FILE
 S DR(DIFG(DILL,"FILE"))="",DITAB=DITAB+2
 I $P(^DIPT(DIFGT,1,DIFGI,0),U,8) F DIFG2=.001:0 S %=DIFG(DILL,"FILE"),DIFG2=$O(^DD(%,DIFG2)) Q:DIFG2'>0  D DRA
 F DIFG2=0:0 S DIFG2=$O(^DIPT(DIFGT,1,DIFGI,"F",DIFG2)) Q:DIFG2'=+DIFG2  I $D(^(DIFG2,0)) S DR(DIFG(DILL,"FILE"))=DR(DIFG(DILL,"FILE"))_^(0)_";" I $L(DR(DIFG(DILL,"FILE")))>200 D EN^DIFGG2 S DR(DIFG(DILL,"FILE"))=""
 D EN^DIFGG2:DR(DIFG(DILL,"FILE"))]""
 S DITAB=DITAB-2
 Q
 ;
DRA ;Process all subfields
 S %1=$P(^(0),U,0) I $S('%1:%1'["C",1:$P(^DD(+%1,.01,0),U,2)["W") S DR(%)=DR(%)_DIFG2_";" I $L(DR(%))>200 D EN^DIFGG2 S %=DIFG(DILL,"FILE"),DR(%)=""
 Q
 ;
DIS ; SCREEN THIS ENTRY
 F %=1:1:DILL S @("D"_(%-1))=DIFG(%,"FE")
 I $D(DIFG(DIFG(DILL,"FILE"),"S"))#2 X DIFG(DIFG(DILL,"FILE"),"S") Q
 I 1 Q
 ;
RECURSEM ; RECURSION FOR DEEPER SUBFILE SHIFTS
 S DITAB=DITAB+2
 D NEXTLVL^DIFGG
 S DITAB=DITAB-2
 Q
 ;
 ;
DIFGG3 ; FILEGRAM NAVIGATION
 ; SEE DIFGG3^DIFGGDOC
 ;
FILE ; PROCESS ONE FILE
 F DIFG(DILL,"FE")=0:0 D FILE2 Q:DIFG(DILL,"FE")=""  D ENTRY
 K I,S,V,X
 Q
 ;
FILE2 ;
 S X=$O(^DD(DIFG(DILL,"FILE"),0,"IX",DIFG(DILL,"XREF"),0))
 Q:'X
 S Y=$O(^DD(DIFG(DILL,"FILE"),0,"IX",DIFG(DILL,"XREF"),X,0))
 Q:'Y
 I $P(^DD(X,Y,0),U,2)["V" S DIFG(DILL,"FSV")=""""_DIFG(DILL-1,"FE")_";"_$P(^DIC(DIFG(DILL-1,"FILE"),0,"GL"),U,2)_"""" I 1
 E  S DIFG(DILL,"FSV")=DIFG(DILL-1,"FE")
 S DIFG(DILL,"FE")=$O(@(DIFG(DILL,"FGBL")_""""_DIFG(DILL,"XREF")_""","_DIFG(DILL,"FSV")_","_DIFG(DILL,"FE")_")"))
 Q
 ;
ENTRY ; PROCESS ONE FILE ENTRY
 S DIFG(DILL,"NAV")=1
 D LOOKUP^DIFGGU
 K DIFG(DILL,"NAV")
 I $D(DIFGGUQ) K DIFGGUQ Q
 S DITAB=DITAB+2
 D ^DIFGG2
 D RECURSEF
 S DITAB=2*(DILL-1)
 S V=":" D INCSET^DIFGGU
 Q
 ;
RECURSEF ; RECURSION FOR DEEPER FILE SHIFTS
 D NEXTLVL^DIFGG
 Q

DIFGGI
DIFGGI ;SFISC/XAK,EDE(OHPRD)-FILEGRAM INITIALIZATION ;1/19/93  9:45 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; DIFGER values: 1 = required variable not passed
 ;                2 = variable form invalid
 ;                3 = variable content invalid
 ;
INIT ; INITIALIZATION
 K ^UTILITY("DIFG",$J),^UTILITY("DIFGLINK",$J)
 D SET1,REQ Q:DIFG("QFLG")
 D OPT Q:DIFG("QFLG")
 D FIRST
 Q
 ;
SET1 ; MISC SETS # 1
 S DIFGI=0,DILL=1 K DIFGER S U="^",DIFG("QFLG")=0
 Q
 ;
REQ ;
 ;
FE I '$D(DIFG("FE")) S DIFG("QFLG")=1 Q
 I DIFG("FE")'=+DIFG("FE") S DIFG("QFLG")=2 Q
FUNC I '$D(DIFG("FUNC")) S DIFG("QFLG")="1" Q
 I DIFG("FUNC")="" S DIFG("QFLG")=2 Q
 I "AMLD"'[DIFG("FUNC") S DIFG("QFLG")=3 Q
FGT I '$D(DIFGT) S DIFG("QFLG")=1 Q
 I DIFGT'=+DIFGT S DIFG("QFLG")=2 Q
 I '$D(^DIPT(DIFGT,0)) S DIFG("QFLG")=3 Q
 Q
 ;
OPT ;
 ;
FGR I '$D(DIFG("FGR")) S DIFG("FGR")="^UTILITY(""DIFG"",$J,"
 S X=DIFG("FGR")
 I "(,"'[$E(X,$L(X)) S DIFG("QFLG")=2 Q
 I $P(X,"(")["DIFG" S DIFG("QFLG")=3 Q
LC I $D(DILC),DILC'=+DILC S DIFG("QFLG")=2 Q
 S:'$D(DILC) DILC=0
PARM S:'$D(DIFG("PARM")) DIFG("PARM")="N"
TAB I $D(DITAB),DITAB'=+DITAB S DIFG("QFLG")=2 Q
 S:'$D(DITAB) DITAB=0
FUNCSFT I $D(DIFG("FUNC SFT")) F X=0:0 S X=$O(DIFG("FUNC SFT",X)) Q:X'=+X  D FUNCSFT2 Q:DIFG("QFLG")
 Q
 ;
FUNCSFT2 S Y=DIFG("FUNC SFT",X)
 I Y="" S DIFG("QFLG")=2 Q
 I "AMLD"'[Y S DIFG("QFLG")=3 Q
 Q
 ;
FIRST ; GET PRIMARY FILE VARIABLES
 S DIFGI=$O(^DIPT(DIFGT,1,DIFGI)) Q:DIFGI'=+DIFGI  S X=^(DIFGI,0)
 D FVARS
 I '$D(@(DIFG(DILL,"FGBL")_DIFG("FE")_",0)")) S DIFG("QFLG")=3 Q
 Q
 ;
FVARS ; SETUP FILE VARIABLES
 S DILL=$P(X,U,2),DITAB=2*(DILL-1),DIFG(DILL,"FILE")=+X
 S DIFG(DILL,"FNAME")=$O(^DD(DIFG(DILL,"FILE"),0,"NM",0))
 I DILL=1 S DIFG(DILL,"FE")=DIFG("FE"),DIFG(DILL,"FUNC")=DIFG("FUNC")
 E  S DIFG(DILL,"FUNC")=DIFG(DILL-1,"FUNC")
 I $D(DIFG("FUNC SFT",DIFG(DILL,"FILE"))) S DIFG(DILL,"FUNC")=DIFG("FUNC SFT",DIFG(DILL,"FILE"))
 I $P(X,U,4)=1 S DIFG(DILL,"FE")=DIFG(DILL-1,"FE") ; dinum back pointer
 S DIFG(DILL,"XREF")=$S($P(X,U,4)=4:$P(X,U,7),1:$P(X,U,4)),%=$P(X,U,5) ;Back pointer if $P=4 X-ref in $P7
 I $E(%,$L(%))=":" S DIFG(DILL,"NAV")=1 I $P(X,U,4)=2 S DIFG(DILL,"NAV")=2 D DIRECT K %,Y
 I $P(X,U,4)=3 S %=$P(X,U,3),%=$O(^DD(%,"SB",+X,0)),%=^DD(+$P(X,U,3),%,0),%=$P($P(^(0),U,4),";") S:+%'=% %=""""_%_"""" S DIFG(DILL,"FGBL")=DIFG(DILL-1,"FGBL")_DIFG(DILL-1,"FE")_","_%_"," K DIFG(DILL,"NAV") Q  ; multiple
 S DIFG(DILL,"FGBL")=^DIC(DIFG(DILL,"FILE"),0,"GL")
 D:$P(X,U,4)=5 LOOKUP
 Q
 ;
DIRECT ;DIRECT POINTER
 S DIFG(DILL,"FE")=0,%=$P(%,":")
 S:'$D(^DD(DIFG(DILL-1,"FILE"),"B",%)) %=$O(^(%))
 S %=$O(^DD(DIFG(DILL-1,"FILE"),"B",%,0))
 Q:%'=+%
 S Y=$P(^DD(DIFG(DILL-1,"FILE"),%,0),U,4),%("N")=$P(Y,";"),%("P")=$P(Y,";",2) S:+%("N")'=%("N") %("N")=""""_%("N")_""""
 I $D(@(DIFG(DILL-1,"FGBL")_DIFG(DILL-1,"FE")_","_%("N")_")")) S Y=@("^("_%("N")_")"),DIFG(DILL,"FE")=$P(Y,U,%("P"))
 Q
 ;
LOOKUP ;COMPUTED FIELD LOOKUP FOR FILE SHIFT
 S DIFG(DILL,"FE")=""
 S %=$O(^DD(DIFG(DILL,"FILE"),"B",$P($P(X,U,5),":"),0))
 Q:'%
 X $P(^DD(DIFG(DILL,"FILE"),%,0),U,5,99)
 I $D(X) S DIFG(DILL,"FE")=$S(X?1"`"1N.N:$E(X,2,99),X?1N.N:X,1:"")
 Q

DIFGGSB
DIFGGSB ;SFISC/XAK,EDE(OHPRD)-FILEGRAM SPECIAL BLOCK ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;EDE/OHPRD/IHS changed BEGEN/END line to match BNF
 ;
START ; (CALLED RECURSIVELY)
 K DIFGSB(DILL)
 D BEGIN
 S DITAB=DITAB+2
 D BODY^DIFGGSB1
 S DITAB=DITAB-2
 D END,EOJ
 Q
 ;
BEGIN ; BEGIN LINE
 S V="BEGIN:"_DIFG(DILL,"FNAME")_"^"_$S(DIFG("PARM")["N":DIFG(DILL,"FILE"),1:"")
 I $D(Z),Z'="" S V=V_Z,Z=""
 D INCSET^DIFGGU
 Q
 ;
 ;
END ; END LINE
 S V="END:"_DIFG(DILL,"FNAME")_"^"_$S(DIFG("PARM")["N":DIFG(DILL,"FILE"),1:"")
 D INCSET^DIFGGU
 Q
 ;
EOJ ;
 K DIFGSB(DILL)
 K %,C,D0,J,S,V,X,Y,Z
 Q

DIFGGSB1
DIFGGSB1 ;SFISC/XAK,EDE(OHPRD)-FILEGRAM SPECIAL BLOCK PART 2 ;8/12/98  13:16
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BODY S DIFGSB(DILL,"SPSPEC")=0
 I $D(DIFG(DILL,"FUNC")),"AL"[DIFG(DILL,"FUNC") I 1
 E  I $D(DIFG(DILL,"NOKEY"))
 E  D SPSPEC^DIFGGSB2
 Q:DIFGSB(DILL,"SPSPEC")
 D P01
 D SPEC
 D IDENT
 Q
 ;
P01 ; .01 FIELD WHEN IT IS A POINTER
 Q:$P(^DD(DIFG(DILL,"FILE"),.01,0),U,2)'["P"
 S DIFGSB(DILL,"FLD")=.01
 D SETXY
 Q:Y=""
 D PTRCHK^DIFGGSB2
 Q
 ;
SPEC ; SPECIFIERS
 S DIFGSB(DILL,"SBT")="SPECIFIER:",%=""
 F DIFGSB(DILL,"FLD")=0:0 D SPEC2 Q:DIFGSB(DILL,"FLD")'=+DIFGSB(DILL,"FLD")  S %=%_$S(%="":DIFGSB(DILL,"FLD"),1:";"_DIFGSB(DILL,"FLD"))
 I '$D(DIFG(DILL,"MUL")) S DR=% D:%'="" FIELDS I 1
 E  S DR(DIFG(DILL,"FILE"))=% D:%'="" FIELDS
 K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"))
 I '$D(DIFG(DILL,"MUL")) K DA,DIC,DR
 K % Q
 ;
SPEC2 S DIFGSB(DILL,"FLD")=$O(^DD(DIFG(DILL,"FILE"),0,"SP",DIFGSB(DILL,"FLD")))
 Q
 ;
IDENT ; IDENTIFIERS
 S DIFGSB(DILL,"SBT")="IDENTIFIER:",%=""
 N DIXIEN,DIKEY S DIXIEN=0,DIKEY=";"
 I $G(DIAR)=4 S DIXIEN=$O(^DD("KEY","AP",DIFG(DILL,"FILE"),"P",0))
 F DIFGSB(DILL,"FLD")=0:0 D IDENT2 Q:DIFGSB(DILL,"FLD")'=+DIFGSB(DILL,"FLD")  D:'$D(^DD(DIFG(DILL,"FILE"),0,"SP",DIFGSB(DILL,"FLD"))) IDENT3
 I '$D(DIFG(DILL,"MUL")) S DR=% D:%'="" FIELDS I 1
 E  S DR(DIFG(DILL,"FILE"))=% D:%'="" FIELDS
 K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"))
 I '$D(DIFG(DILL,"MUL")) K DA,DIC,DR
 K %
 Q
 ;
IDENT2 N DIOUT S DIOUT=0
 I DIXIEN F  D  Q:DIOUT!('DIFGSB(DILL,"FLD"))
 . S DIFGSB(DILL,"FLD")=$O(^DD("KEY",DIXIEN,2,"BB",DIFGSB(DILL,"FLD")))
 . Q:'DIFGSB(DILL,"FLD")!(DIFGSB(DILL,"FLD")=.01)
 . Q:$O(^DD("KEY",DIXIEN,2,"BB",DIFGSB(DILL,"FLD"),0))'=DIFG(DILL,"FILE")
 . Q:'$D(^DD(DIFG(DILL,"FILE"),DIFGSB(DILL,"FLD"),0))
 . S DIOUT=1,DIKEY=DIKEY_DIFGSB(DILL,"FLD")_";" Q
 Q:DIOUT  S DIXIEN=0
 F  S DIFGSB(DILL,"FLD")=$O(^DD(DIFG(DILL,"FILE"),0,"ID",DIFGSB(DILL,"FLD"))) Q:'DIFGSB(DILL,"FLD")  Q:DIKEY'[(";"_DIFGSB(DILL,"FLD"))
 Q
 ;
IDENT3 S %=%_$S(%="":DIFGSB(DILL,"FLD"),1:";"_DIFGSB(DILL,"FLD"))
 Q
 ;
FIELDS I $D(DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"))) D DRFIX
 I '$D(DIFG(DILL,"MUL")) Q:DR=""
 E  Q:DR(DIFG(DILL,"FILE"))=""
 K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"))
 S:'$D(DIFG(DILL,"MUL")) DIC=DIFG(DILL,"FILE"),DA=DIFG(DILL,"FE")
 S DIQ(0)="N" D EN^DIQ1 K DIQ
 F DIFGSB(DILL,"FLD")=0:0 D FIELDS2 Q:DIFGSB(DILL,"FLD")'=+DIFGSB(DILL,"FLD")  S X=^(DIFGSB(DILL,"FLD")) D FIELDS3
 Q
 ;
DRFIX ; ADJUST DR FOR MODIFIED/DELETED VALUES
 NEW T
 I '$D(DIFG(DILL,"MUL")) S T=DR
 E  S T=DR(DIFG(DILL,"FILE"))
 F %=1:1 S X=$P(T,";",%) Q:X=""  S %(X)="" I $D(DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),X)) K %(X) S DIFGSB(DILL,"FLD")=X,X=DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),X) D DRFIX2
 S (T,X)=""
 F %=0:0 S X=$O(%(X)) Q:X=""  S T=T_$S(T="":"",1:";")_X
 I '$D(DIFG(DILL,"MUL")) S DR=T
 E  S DR(DIFG(DILL,"FILE"))=T
 Q
 ;
DRFIX2 NEW %,DR,T
 D FIELDS3
 Q
 ;
FIELDS2 S DIFGSB(DILL,"FLD")=$O(^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFGSB(DILL,"FLD")))
 Q
 ;
FIELDS3 Q:X=""
 D SETXY
 K F,N,P,W
 S V=DIFGSB(DILL,"SBT")_$P(^DD(DIFG(DILL,"FILE"),DIFGSB(DILL,"FLD"),0),U,1)_U_$S(DIFG("PARM")["N":DIFGSB(DILL,"FLD"),1:"")
 S:DIFGSB(DILL,"SBT")["KEY" V=V_U_$P(DIFGSB(DILL,"SPSPEC"),U,2)
 S V=V_"="_X
 D INCSET^DIFGGU
 D:Y'="" PTRCHK^DIFGGSB2
 K X,Y
 Q
SETXY ; If previously looked up pointer set @LINK
 S Y=""
 Q:$P(^DD(DIFG(DILL,"FILE"),DIFGSB(DILL,"FLD"),0),U,2)'["P"
 S F=+$P($P(^DD(DIFG(DILL,"FILE"),DIFGSB(DILL,"FLD"),0),U,2),"P",2),W=$P(^(0),U,4),N=$P(W,";",1),P=$P(W,";",2)
 I $D(DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFGSB(DILL,"FLD"),"P")) S Y=DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),DIFGSB(DILL,"FLD"),"P") I 1
 E  S Y=$P(@(DIFG(DILL,"FGBL")_DIFG(DILL,"FE")_",N)"),U,P)
 I $D(^UTILITY("DIFGLINK",$J,F,Y)) S X="@"_^UTILITY("DIFGLINK",$J,F,Y),Y="" Q
 S ^UTILITY("DIFGLINK",$J)=$S($D(^UTILITY("DIFGLINK",$J))#2:^UTILITY("DIFGLINK",$J)+1,1:1)
 S ^UTILITY("DIFGLINK",$J,F,Y)=^UTILITY("DIFGLINK",$J)
 S Y="@"_^UTILITY("DIFGLINK",$J)
 Q

DIFGGSB2
DIFGGSB2 ;SFISC/DG,EDE(OHPRD)- ;6/19/92  9:28 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SPSPEC ; UNIQUE SPECIFIER
 F DIFGSB(DILL,"SPSPEC")=0:0 S DIFGSB(DILL,"SPSPEC")=$O(^DD(DIFG(DILL,"FILE"),0,"SP",DIFGSB(DILL,"SPSPEC"))) Q:'DIFGSB(DILL,"SPSPEC")  I +^(DIFGSB(DILL,"SPSPEC")) Q:$P(^(DIFGSB(DILL,"SPSPEC")),U,2)'=""
 Q:'DIFGSB(DILL,"SPSPEC")
 I $P(^DD(DIFG(DILL,"FILE"),DIFGSB(DILL,"SPSPEC"),0),U,2)["P" S DIFGSB(DILL,"SPSPEC")=0 Q
 S $P(DIFGSB(DILL,"SPSPEC"),U,2)=$P(^DD(DIFG(DILL,"FILE"),0,"SP",DIFGSB(DILL,"SPSPEC")),U,2)
 S DIFGSB(DILL,"FLD")=+DIFGSB(DILL,"SPSPEC")
 I '$D(DIFG(DILL,"MUL")) S DR=+DIFGSB(DILL,"SPSPEC")
 E  S DR(DIFG(DILL,"FILE"))=+DIFGSB(DILL,"SPSPEC")
 S DIFGSB(DILL,"SBT")="KEY:"
 D FIELDS^DIFGGSB1
 Q
 ;
PTRCHK ; CHECK FOR POINTER FIELD
 Q:$P(^DD(DIFG(DILL,"FILE"),DIFGSB(DILL,"FLD"),0),U,2)'["P"
 S DITAB=DITAB+2
 S DILL=DILL+1
 D POINTER
 S DITAB=DITAB-2
 K DIFG(DILL)
 S DILL=DILL-1
 Q
 ;
POINTER ; POINTER FIELDS
 S DIFG(DILL,"FILE")=+$P($P(^DD(DIFG(DILL-1,"FILE"),DIFGSB(DILL-1,"FLD"),0),U,2),"P",2),X=$P(^(0),U,4) S:$P(X,";")'=+X X=""""_$P(X,";")_""";"_$P(X,";",2)
 I $D(DIFGGU(DIFG(DILL-1,"FILE"),DIFG(DILL-1,"FE"),DIFGSB(DILL-1,"FLD"),"P")) S DIFG(DILL,"FE")=DIFGGU(DIFG(DILL-1,"FILE"),DIFG(DILL-1,"FE"),DIFGSB(DILL-1,"FLD"),"P")
 E  S DIFG(DILL,"FE")=$P(@(DIFG(DILL-1,"FGBL")_DIFG(DILL-1,"FE")_","_$P(X,";",1)_")"),U,$P(X,";",2))
 I '$D(^DIC(DIFG(DILL,"FILE"),0)) D KILLLL^DIFGGU Q
 S DIFG(DILL,"FGBL")=^DIC(DIFG(DILL,"FILE"),0,"GL"),DIFG(DILL,"FNAME")=$P(^DIC(DIFG(DILL,"FILE"),0),U,1)
 I '$D(@(DIFG(DILL,"FGBL")_DIFG(DILL,"FE")_",0)")) D KILLLL^DIFGGU Q
 I $D(Y),Y'="" S Z=Y,Y=""
 I $D(DIFGENV("LAYGO",DIFG(DILL-1,"FILE"),DIFGSB(DILL-1,"FLD")))!($P(^DD(DIFG(DILL-1,"FILE"),DIFGSB(DILL-1,"FLD"),0),U,2)'["'") S DIFG(DILL,"NOKEY")=""
 D START^DIFGGSB ; RECURSE
 Q

DIFGGU
DIFGGU ;SFISC/XAK,EDE(OHPRD)-FILEGRAM FUNCTIONS  ; [ 11/10/92  10:38 AM ]
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; Required variables:
 ;
 ;   DILC
 ;   DITAB
 ;   DIFG("PARM")
 ;   DIFG("FGR")
 ;   DILL
 ;   DIFG(DILL,"FILE")
 ;   DIFG(DILL,"FNAME")
 ;   DIFG(DILL,"FE")
 ;   DIFG(DILL,"FGBL")
 ;   DIFG(DILL,"FUNC")
 ;
 Q  ; INVALID ENTRY POINT
 ;
LOOKUP ; EXTERNAL ENTRY POINT
 ; LOOKUP ENTRY IN FILE/SUBFILE
 D SETX
 Q:$D(DIFGGUQ)
 S Z=""
 I '$D(^UTILITY("DIFGLINK",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"))) D SETLINK
 I $D(^DD(DIFG(DILL,"FILE"),0,"UP")) S A=^("UP"),B=$O(^DD(A,"SB",DIFG(DILL,"FILE"),0)),C=$P(^DD(A,B,0),U,1),V=C_U_$S(DIFG("PARM")["N":B,1:"") K A,B,C
 E  S V=DIFG(DILL,"FNAME")_U_$S(DIFG("PARM")["N":DIFG(DILL,"FILE"),1:"")
 S V=V_$S($D(DIFG(DILL,"NAV")):":",1:"")_U_DIFG(DILL,"FUNC")_"="_X
 I $D(DIFG(DILL,"NAV")),DIFG(DILL,"NAV")=1,$G(DIFG(DILL,"XREF"))?1A.E S V=V_U_DIFG(DILL,"XREF")_"=@"_^UTILITY("DIFGLINK",$J,DIFG(DILL-1,"FILE"),DIFG(DILL-1,"FE"))
 D INCSET
 D:Z'="" SPBLK
 K S,V,X,Z
 Q
 ;
SETLINK ;
 S ^UTILITY("DIFGLINK",$J)=$S($D(^UTILITY("DIFGLINK",$J))#2:^UTILITY("DIFGLINK",$J)+1,1:1),^UTILITY("DIFGLINK",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"))=^UTILITY("DIFGLINK",$J)
 S Z="@"_^UTILITY("DIFGLINK",$J)
 Q
 ;
SETX ; SET X TO @LINK OR LOOKUP VALUE
 S X=""
 D SETX2
 Q:$D(DIFGGUQ)
 Q:X'=""
 I $D(DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),.01)) S X=DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),.01) Q
 K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"))
 I '$D(DIFG(DILL,"MUL")) S DIC=DIFG(DILL,"FILE"),DA=DIFG(DILL,"FE"),DR=".01"
 S DIQ(0)="N" D EN^DIQ1 K DIQ
 S X=^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"),.01)
 K ^UTILITY("DIQ1",$J,DIFG(DILL,"FILE"))
 I '$D(DIFG(DILL,"MUL")) K DA,DIC,DR
 Q
 ;
SETX2 ; IF POINTER AND ALREADY LOOKED UP SET @LINK
 K DIFGGUQ
 I $D(^UTILITY("DIFGLINK",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"))) S X="@"_^UTILITY("DIFGLINK",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"))_"E"
 Q:$P(^DD(DIFG(DILL,"FILE"),.01,0),U,2)'["P"
 S X=+$P($P(^DD(DIFG(DILL,"FILE"),.01,0),U,2),"P",2)
 I $D(DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),.01,"P")) S Y=DIFGGU(DIFG(DILL,"FILE"),DIFG(DILL,"FE"),.01,"P") I 1
 E  S Y=$P(@(DIFG(DILL,"FGBL")_DIFG(DILL,"FE")_",0)"),U,1)
 NEW G
 S G="^"_$P(^DD(DIFG(DILL,"FILE"),.01,0),U,3)
 I '$D(@(G_Y_",0)")) S DIFGGUQ=1 Q
 S X=$S($D(^UTILITY("DIFGLINK",$J,X,Y)):"@"_^UTILITY("DIFGLINK",$J,X,Y),1:"")
 K Y
 Q
 ;
SPBLK ; SPECIAL BLOCK
 S DITAB=DITAB+2
 D ^DIFGGSB
 S DITAB=DITAB-2
 Q
 ;
INCSET ; EXTERNAL ENTRY POINT
 ; INCREMENT LINE COUNT AND SET LINE
 S DILC=DILC+1
 S S=""
 I '$D(DIFG("WP")) S:DITAB $P(S," ",DITAB)=" "
 S @(DIFG("FGR")_DILC_",0)")=S_V
 Q
 ;
KILLLL ; EXTERNAL ENTRY POINT
 ; KILL LAST LINE, DECREMENT LINE COUNT, KILL LAST LINK, DECREMENT LINK COUNT
 D KILLDEC,DELLINK
 Q
 ;
KILLDEC ; EXTERNAL ENTRY POINT
 ; KILL LAST LINE AND DECREMENT LINE COUNT
 K @(DIFG("FGR")_DILC_",0)")
 S DILC=DILC-1
 Q
 ;
DELLINK ; EXTERNAL ENTRY POINT
 ; DELETE LAST @LINK AND DECREMENT LINK COUNTER
 K ^UTILITY("DIFGLINK",$J,DIFG(DILL,"FILE"),DIFG(DILL,"FE"))
 S ^UTILITY("DIFGLINK",$J)=^UTILITY("DIFGLINK",$J)-1
 Q

DIFGO
DIFGO ;SFISC/XAK-FILEGRAM OPTIONS ;10:15 AM  7 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
0 S DIC="^DOPT(""DIFG"","
 G OPT:$D(^DOPT("DIFG",6)) S ^(0)="FILEGRAM OPTION^1.01" K ^("B")
 F X=1:1:6 S ^DOPT("DIFG",X,0)=$P($T(@X),";;",2)
 S DIK=DIC D IXALL^DIK
OPT ;
 S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN G 0
 ;
EN ;Entry point for all filegram options
 S:'$D(Y) Y=0 S DIC("S")="I Y>1.99" D:DI#2 ^DICRW G:Y<0 Q K DIC("S") ;ihs/ohprd/dg 8-21-91
 D @DI W !!
Q K %,DIC,DIK,DI,DA,I,J,X,Y Q
 ;
1 ;;CREATE/EDIT FILEGRAM TEMPLATE
 G EN^DIFGA
 ;
2 ;;DISPLAY FILEGRAM TEMPLATE
 S DIC("A")="Select FILEGRAM TEMPLATE: "
 S DIC="^DIPT(",DIC(0)="QEAM",DIC("S")="I $P(^(0),U,8)=1" D ^DIC I Y<0 K DIC Q
 W !! S DA=+Y,DIQ(0)="C" D EN^DIQ K DIC,DIQ G 2
 Q
 ;
3 ;;GENERATE FILEGRAM
 I '($D(IO)#2) D HOME^%ZIS
 I DUZ'>0 W $C(7),!!,"INVALID USER.  YOU CAN'T USE THIS OPTION." Q
 S DIC=+Y G ^DIFGG
 ;
 ;
4 ;;VIEW FILEGRAM
 W !! S DIC(0)="ZQEAMIN",DIC=1.12 D ^DIC Q:Y<0  S IOP="HOME" D ^%ZIS Q:POP
 S D0=+Y D EN1 G 4
EN1 S X=Y(0),Y=$P(X,U,6),Y=$S($D(^XMB(3.9,+Y,0))#2:$P(^(0),U),1:Y) W !!,Y
 S Y=$P(X,U,2) W !,$S(Y="s":"Sent",Y="i":"Installed",1:Y)
 W " on " S Y=$P(X,U) D DT W " by ",$P(X,U,3)
 S DIWL=1,DIWR=78,DIWF="WN" S D0=$P(X,U,6) S:'$D(^XMB(3.9,+D0,0)) D0=-1
 W !! S S=5,D=0 F  S (D,D1)=$O(^XMB(3.9,D0,2,D)) Q:D'>0  I $D(^(D,0))#2 S X=^(0) D ^DIWP Q:'$D(D)  S D=D1,S=S+1 I $E(IOST)="C",S+4>IOSL S DIR(0)="E" D ^DIR Q:'Y  S S=0
 S:D="" (D,D1)=-1 D 0^DIWW K DIP,Y,DIWF
 Q
DT X ^DD("DD")
 W Y Q
 ;
5 ;;SPECIFIERS
 S DI=+Y G 99^DIU
 ;
6 ;;INSTALL/VERIFY FILEGRAM
 S DIC(0)="QEAMNIZ",DIC=1.12 D ^DIC K DIC Q:Y<0  Q:'$P(Y(0),U,6)
 S DIFGLO="^XMB(3.9,"_$P(Y(0),U,6)_",2,",DIFGG=+Y
 D ^DIFG W !,$S($D(DIFGER):"UNSUCCESSFUL INSTALLATION: "_DIFGER,1:"DONE")
 S $P(^DIAR(1.12,DIFGG,0),U,2)=$S($D(DIFGER):"u",1:"i") K DIFGER,DIFGG Q

DIFGSRV
DIFGSRV ;SFISC/RWF-SERVER INTERFACE TO FILEGRAMS ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
HIST ;Add a message to the FileGram History file so it can be processed.
 S DIXM=0,U="^" X XMREC ;get first line
 I $P(XMRG,U)'="$DAT" S DIXM=DIXM+1,XQSTXT(DIXM)="First line of message doesn't start with '$DAT'"
 S DIFG=$P(XMRG,U,3)
 I DIFG<2 S DIXM=DIXM+1,XQSTXT(DIXM)="Can't update a VA FileMan file."
 I "^2^3^19^"[(U_DIFG_U) S DIXM=DIXM+1,XQSTXT(DIXM)="Update to a protected file (#"_DIFG_")."
 Q:DIXM
 S DIFG("FE")=+$P(XQSUB,"#",2),DIFG("TEMPLATE")="",DIFG("DUZ")=XMFROM
 D LOG^DIFGG
 Q

DIFROM
DIFROM ;SFISC/XAK-GENERATE INITS ; 03DEC2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D Q
 S X=$S('$D(^DD("VERSION"))#2:0,1:^("VERSION")),Y=$P($T(DIFROM+1),";",3) G:X'=Y ERV K X,Y
 I $S('$D(DUZ(0)):1,DUZ(0)'="@":1,1:0) W !,"PROGRAMMER ACCESS REQUIRED",! Q
 D WARN
 S DIR("A")="Enter the Name of the Package (2-4 characters)"
 S DIR(0)="FO^2:4:0^I X'?1U1.NU K X"
 S DIR("?")="^D R^DIFROMH",DIR("??")=DIR("?")
 D ^DIR G Q:$D(DIRUT) K DIR
 S DIC="^DIC(9.4,",DIC(0)="EZ",D="C" D IX^DIC K D,DIC S DPK=+Y,DPK(0)=$S($D(Y(0)):Y(0),1:"")
R W !!,"I am going to create a routine called '",X,"INIT'."
 S DTL=X,X=X_"INIT" D OS^DII
 I $D(^DD("OS",DISYS,18)) X ^(18) I  W $C(7),!,"but '"_X_"' is ALREADY ON FILE!" S Q=1
 K DIR S DIR("A")="Is that OK",DIR(0)="Y",DIR("??")="^D R1^DIFROMH"
 D ^DIR G Q:$D(DIRUT)!'Y
 S DIR("A")="Would you like to include Data Dictionaries",DIR("B")="YES"
 S DIR("??")="^D R3^DIFROMH" D ^DIR G Q:$D(DIRUT) I 'Y S F(-1)=0 G DD
 G L:DPK<0 S DIR("A")="Would you like to see the package definition"
 S DIR("??")="^D CUR^DIFROMH1",DIR("B")="NO" D ^DIR G Q:$D(DIRUT)
 I Y D L^DIFROMH1
 S DIR("A")="Do you want to accept the current definition"
 S DIR(0)="Y",DIR("??")="^D PKG^DIFROMH1" D ^DIR G Q:$D(DIRUT) S DIH=Y
 F DA=0:0 S DA=$O(^DIC(9.4,DPK,4,DA)) G:'$D(^(+DA,0)) DD:$D(F),L S Y=+^(0) I $D(^DIC(Y,0))#2 S F(Y)=$P(^(0),U) W !!,F(Y) D SF G Q:%<0
L W !!,"THEN PLEASE LIST THE FILES THAT YOU WISH TO TRANSPORT:" S DIH=0,DPK=-1
 F F=1:1 G Q:$D(DTOUT) K DIC S DIC("S")="I Y>1.9999&'$D(F(+Y))",DIC(0)="AIQEZ",DIC="^DIC(" D ^DIC G:Y<0 Q:X[U,DD S F(+Y)=$P(Y,U,2) D F
DD W ! F Y=1,2,3,4 S D=$P("DIE^DIPT^DIBT^DIST",U,Y),DIC=$P("INPUT^PRINT^SORT^FORM(S):",U,Y)_$S(Y<4:" TEMPLATE(S):",1:"") F %=0:0 S %=$O(^DIC(9.4,DPK,D,%)) Q:'$D(^(+%,0))  S DH=$P(^(0),U),X=$P(^(0),U,2) D T
 S DN=DTL_$E("INI",1,5-$L(DTL))
 K ^UTILITY(U,$J),DR S DRN=0,F=0,Q=DPK G Q:$D(F)+$D(Q)=2
 D VER^DIFROM12 G Q:$D(DIRUT)
S G ^DIFROM0
 ;
T W !,DIC,?24,DH
 I Y'=4 F F=0:0 S @("F=$O(^"_D_"(""B"",DH,F))"),DIC="" Q:'F  I @("$D(^"_D_"(F,0))"),$P(^(0),U,4)=X!'X S Q(D,F)="",DIFC=1 G TQ
 I Y=4 F F=0:0 S F=$O(^DIST(.403,"B",DH,F)),DIC="" Q:'F  I $D(^DIST(.403,F,0)),$P(^(0),U,8)=X S Q(D,F)="",DIFC=1 G TQ
 W $C(7)," **NOT FOUND** "
TQ Q
 ;
SF G F:$O(^DIC(9.4,DPK,4,DA,1,0))'>0
 F %=0:0 S %=$O(^DIC(9.4,DPK,4,DA,1,%)) Q:%'>0  I $D(^(%,0)) S E=$P(^(0),U),D=$O(^DD(+Y,"B",E,0)) D:D="" ERF I $D(^DD(+Y,D,0)) S F(+Y,+Y,D)="",%C=+$P(^(0),U,2) I %C W "  (",E,")" S F(+Y,%C)=0
 S F(+Y,+Y)=1,E=+Y S:(+Y'=200)!(DTL="XU") F(+Y,+Y,.01)=0 G E
F S F(+Y,+Y)=0,%=1,E=0 K %A
 ; VEN/SMH 3121029 - Change below to that S F(+Y,D)=0 not "", to conform with KIDS FIA format. 
 ; IX & KEYS on subfiles don't get exported with KIDS otherwise. For V22.2.
E F E=E:0 S E=$O(F(+Y,E)) Q:E'>0  F D=0:0 S D=$O(^DD(E,"SB",D)) Q:D'>0  I Y-E!'$D(%A)!$D(%A(D)) S F(+Y,D)=0 S:$D(%A) %A(D)=0
 S F(+Y,0)=^DIC(+Y,0,"GL"),D=$P(@(F(+Y,0)_"0)"),U,4),DPK(1)=+Y S:D<2 D=""
 S DA(1)=DPK,DR="222.1;222.2;223;222.4;222.7;S:""n""[X Y=0;222.8;222.9;"
 S DIE=$S(DPK>0:"^DIC(9.4,",1:"^UTILITY($J,")_DA(1)_",4,"
 I DPK<0 S ^UTILITY($J,-1,4,0)="^9.44",^(+Y,0)=+Y,DA=+Y
 I 'DIH W ! S DIE("W")="W !?2,$P(DQ(DQ),U),?32,"": """ D ^DIE I $D(Y) S %=-1
 S F(DPK(1),-222)=$S($D(@(DIE_"DA,222)")):^(222),1:"y"),F(DPK(1),-223)=$S($D(^(223)):^(223),1:"") K DIE,DR
 Q
 ;
ERF S D=-1 W $C(7),!,"  INVALID FIELD LABEL:  "_E,! Q
ERV W $C(7),!!,"Your FileMan Version number: "_X_"  does not match the version number",!,"on the DIFROM routine: "_Y_" !!",!!,"You must run ^DINIT before you can build an INIT!!",! K X,Y Q
Q G Q^DIFROM11
WARN N I F I=1:1 Q:$T(WARN+I)=""  W !,$P($T(WARN+I),";;",2)
 ;;                    * * Please Note * *
 ;;
 ;;     DIFROM generates routines in the following format:
 ;;
 ;;     nmspInxx
 ;;     ^^^^^^^^
 ;;     ||||||||
 ;;     |||||| \\- xx is any combination of numbers and
 ;;     ||||||     uppercase alpha characters.
 ;;     ||||||
 ;;     ||||| \--- n is a number 0 - 9 and uppercase letter N.
 ;;     |||||
 ;;     |||| \---- I is always uppercase letter I.
 ;;     ||||
 ;;      \\\\----- 2 to 4 characters of package namespace.
 ;;
 ;;     Any routines that support the init process should not
 ;;     be in this format.
 ;;

DIFROM0
DIFROM0 ;SFISC/XAK-GATHER PCS TO SEND ; 31OCT2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S %=2,DIT=0,DIH=""
 I DPK<0,$O(F(0))>0 K DIR S DIR(0)="Y",DIR("A")="Do you want to include all the templates and forms",DIR("B")="NO",DIR("??")="^D NOPKG^DIFROMH" D ^DIR G Q:$D(DIRUT) S DIT=Y=1
 W ! S DIR(0)="YA",DIR("??")="^D ^DIFROMH",DIR("B")="YES"
 ;NOTE: I removed 9.8 (ROUTINE FILE) from this list for V19 but none of the supporting code. (tkw)
 F DL=19,3.6,19.1,.5,9.2,8994 I $D(^DIC(DL,0)) S X=$P(^(0),U),DIR("A")="Would you like to include "_X_"S?"_$J("",17-$L(X)) D ^DIR G Q:$D(DIRUT) I Y=1 S DL(DL)=DL,DIFC=1
 G:$D(F(-1))&('$D(DIFC)) Q
S W ! S DIR("A")="Would you like security codes sent along: ",DIR("B")="NO"
 S DIR("??")="^D S^DIFROMH" D ^DIR G Q:$D(DIRUT) S DSEC=Y=1 K ^UTILITY("DI",$J)
M ;
 S DIR("A")="Maximum Routine Size    (2000 - "_^DD("ROU")_") : ",DIR("B")=^DD("ROU"),DIR(0)="NA^2000:"_^DD("ROU") ; VEN/SMH V22.2
 S DIR("??")="^D M^DIFROMH" D ^DIR G Q:$D(DIRUT) S DIFRM=Y
GO W ! D WAIT^DICD
 D:DPK>0 PKG^DIFROM12
 D  I DTL="DI" S DTL="DD" D  S DTL="DM" D  S DTL="DI"
 .F Y=19,3.6,19.1,.5,9.8,9.2,8994 I $D(DL(Y)) S X=$S(Y=19:"OPT",Y=3.6:"BUL",Y=19.1:"SE",Y=.5:"FUN",Y=9.8:"ROU",Y=9.2:"HEL",Y=8994:"REM") D ADD,A:'Y
 D SBF
 K DL,DIR S DL=DRN,DRN=1 G ^DIFROM1
ADD ;
 S DH=$S(DTL="XU":"DD",1:DTL)
 Q:$D(^DIC(Y,0))[0!$D(DTL(Y))  Q:$P(^(0),X,1)]""!'$D(^(0,"GL"))
 S Y=^("GL"),X=$S(X="ROU":"RTN",X="SE":"KEY",1:X)
 Q
A F D=0:0 S D=$O(^DIC(9.4,DPK,"EX",D)) Q:D'>0  I $P(DH,$P(^(D,0),U))="" G DH
 S D=$O(@(Y_"""B"",DH,0)")),%X=Y_"D,",%Y="^UTILITY(U,$J,X,D,"
 G DH:D'>0,DH:D<100&(X="FUN") S Q(X)=0
 D %XY^%RCR G H:X'="OPT"
 S %=^UTILITY(U,$J,X,D,0),%1=+$P(%,U,12),%1=$S($D(^DIC(9.4,%1,0)):$P(^(0),U),1:""),$P(%,U,12)=%1,$P(%,U,5)=""
 S %1=+$P(%,U,7),%1=$S($D(^DIC(9.2,%1,0)):$P(^(0),U),1:""),$P(%,U,7)=%1,^UTILITY(U,$J,X,D,0)=% K ^(3.96),^(10,"B"),^("C")
 I $D(^UTILITY(U,$J,X,D,220)) S %=^(220),%1=$S($D(^XMB(3.6,+%,0)):$P(^(0),U),1:""),$P(%,U)=%1,%1=$S($D(^XMB(3.8,+$P(%,U,3),0)):$P(^(0),U),1:""),$P(%,U,3)=%1,^UTILITY(U,$J,X,D,220)=%
 F %=0:0 S %=$O(^DIC(19,D,10,%)) Q:%'>0  I $D(^(%,0)),$D(^DIC(19,+^(0),0)) S ^UTILITY(U,$J,X,D,10,%,U)=$P(^(0),U)
H K:"BULKEY"[X ^UTILITY(U,$J,X,D,2) G:X'="HEL" DH
 K ^UTILITY(U,$J,X,D,4) S $P(^(0),U,4)="" K ^(2,"B"),^UTILITY(U,$J,X,D,10,"B")
 F %2=0:0 S %2=$O(^UTILITY(U,$J,X,D,10,%2)) Q:'%2  I $D(^(%2,0))#2 S %1=+^(0),%1=$S($D(^MAG(%1,0)):$P(^(0),U,1),1:"") K:%1="" ^UTILITY(U,$J,X,D,10,%2) I %1]"" S $P(^UTILITY(U,$J,X,D,10,%2,0),U,1)=%1
 F %2=0:0 S %2=$O(^UTILITY(U,$J,X,D,2,%2)) G DH:%2'>0 I $D(^(%2,0))#2,$P(^(0),U,2) S %1=^(0),%=1 D HP1 Q:%<0
 K %1,%2 Q
HP1 I $D(^DIC(9.2,+$P(%1,U,2),0)) S ^UTILITY(U,$J,X,D,2,%2,0)=$P(%1,U)_U_$P(^(0),U) Q
 W !,$C(7),"The Help Frame, "_$P(^DIC(9.2,D,0),U)_" has the keyword "_$P(%1,U)
 W !,"whose Related Frame does not exist.  Shall I exclude it" D YN^DICN
 K:%=1 ^UTILITY(U,$J,X,D,2,%2) Q
 ;
DH S DH=$O(@(Y_"""B"",DH)")) G A:DH]""&(DTL="XU"!($P(DH,DTL,1)="")) Q
 ;
ERM W $C(7),!!?5,"Was not able to get a message number for the network INIT",!?10,"DIFROM ABORTED!!",! Q
 ;
Q G Q^DIFROM11
SBF N I,II
 S I=0 F  S I=$O(F(I)) Q:I'>0  S II=0 F  S II=$O(F(I,II)) Q:II'>0  S ^UTILITY("^",$J,"SBF",I,II)=""
 Q

DIFROM1
DIFROM1 ;SFISC/XAK-CREATES RTNS WITH DD'S ; 29OCT2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
L S DH=" F I=1:2 S X=$T(Q+I) Q:X=""""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y",F=$O(F(F))
 I F'>0 D:DSEC SEC K ^UTILITY("DI",$J) G ^DIFROM11
 S ^UTILITY($J,DL+1,0)="^DIC("_F_",0,""GL"")",^UTILITY($J,DL+2,0)="="_F(F,0),^UTILITY($J,DL+3,0)="^DIC(""B"","""_F(F)_""","_F_")",^UTILITY($J,DL+4,0)="=",DL=DL+4
 S DH=" Q:'DIFQ("_F_") "_DH
EGP F E="ALANG","%","%D" S %X="^DIC("_F_","""_E_""",",E=0 D %XY ;**CCO/NI TO TRANSPORT FOREIGN-LANGUAGE FILE NAMES
 I DSEC S E="" F DSEC=DSEC:1 S E=$O(^DIC(F,0,E)) Q:E=""  I E'="GL" S ^UTILITY("DI",$J,DSEC,0)="^DIC("_F_",0,"""_E_""")" S DSEC=DSEC+1 S ^UTILITY("DI",$J,DSEC,0)="="_^DIC(F,0,E)
 F D=0:0 S D=$O(F(F,D)),E=0,%X="^DD("_D_",0" Q:D'>0  S ^UTILITY($J,DL+1,0)=%X_")",DL=DL+2,^UTILITY($J,DL,0)="="_^DD(D,0),%X=%X_"," D V F X=0:0 S X=$O(^DD(D,X)) Q:X'>0  S %X="^DD("_D_","_X_",",E="%Z#2" D SAVE:$D(F(F,D))<9!$D(F(F,D,X))
 ;
KEYSNIX ; TRANSPORT INDEXES AND KEYS; VEN/SMH for FM V22.2 (fallthrough)
 ; FIA array has same format as F currently has. We will just reuse F.
 ; But we need to store it in a global as DIFROMS* uses naked refs.
 K ^UTILITY("FIA",$J),^UTILITY("KX",$J) ; FIA, Keys and Index output.
 M ^UTILITY("FIA",$J)=F ; Load FIA.
 ;
 ; Export DD from KIDS. Includes ^DD and ^DIC.
 ; New Style Indexes and Keys get exported too.
 ; Unfortunately, Indexes and Keys code expects DIFROM Server Style ^DD array.
 ; So this is the easiest way to get them out from the Server.
 D DDOUT^DIFROMS(F,"",$NA(^UTILITY("FIA",$J)),$NA(^UTILITY("KX",$J)))
 ;
 ; We don't need this any more.
 K ^UTILITY("FIA",$J)
 ;
 ; Remove ^DD and ^DIC from the output array.
 K ^UTILITY("KX",$J,"^DD")
 K ^UTILITY("KX",$J,"^DIC")
 ;
 ; Now we loop through output global and store in ^UTILITY($J) so that DIFROM
 ; will store the global in the outputted routines
 N GREF S GREF=$NA(^UTILITY("KX",$J)) ; Global reference for $Q
 N LREF S LREF=$E(GREF,1,$L(GREF)-1)  ; Last reference -- w/o the comma.
 F  S GREF=$Q(@GREF) Q:GREF'[LREF  D  ; Loop until the Global doesn't match itself.
 . S DL=DL+1                     ; next line
 . N REF2STORE S REF2STORE=GREF  ; We need to change the stored reference for the destination system.
 . S $P(REF2STORE,",",2)="$J"    ; Remove our job number, and just put $J. Destination system will resolve it.
 . S ^UTILITY($J,DL,0)=REF2STORE ; Store ref
 . S DL=DL+1                     ; next line
 . S ^UTILITY($J,DL,0)="="_@GREF ; store the value.
 ;
 ; We don't need this anymore.
 K ^UTILITY("KX",$J)
 ;
 ; This dumps the routines out for all of the above (^DD, ^DIC, and ^UTILITY("KX")
 ; Last part (IFff) says if data doesn't come with file do the next file.
 D FILE^DIFROM3 G:'$D(DRN) EQ^DIFROM11 I $P(F(F,-222),U,7)'="y" G L
 ;
 S DL=DL+1,E="%Z#2=0",%X=F(F,0),@("D="_%X_"0)")
 S ^UTILITY($J,DL+1,0)="^UTILITY(U,$J,"_F_")",^UTILITY($J,DL+2,0)="="_%X,^UTILITY($J,DL+3,0)="^UTILITY(U,$J,"_F_",0)",^UTILITY($J,DL+4,0)="="_D,%Y="^UTILITY(U,$J,"_F_",",%Z=0,%C(-1)=0,%B=0,%A="",DL=DL+5
 D N S DH=$P(DH,"DIFQ")_"DIFQR"_$P(DH,"DIFQ",2,99)
 D FILE^DIFROM3 G:'$D(DRN) EQ^DIFROM11 G L
SAVE K DSV I $D(^(X,8)) S DSV(8)=^(8) K ^(8)
 F %Z=8.5,9 I $D(^(%Z)),^(%Z)'=U,'($P(^(0),U,2)["K"&(^(%Z)="@")) S DSV(%Z)=^(%Z) K ^(%Z)
 D %XY
 F %Z=8,8.5,9 I $D(DSV(%Z)),DSV(%Z)]"" S ^DD(D,X,%Z)=DSV(%Z) I DSEC S ^UTILITY("DI",$J,DSEC,0)="^DD("_D_","_X_","_%Z_")",DSEC=DSEC+1,^UTILITY("DI",$J,DSEC,0)="="_DSV(%Z),DSEC=DSEC+1
 Q
 ;
SEC S DH=" I DSEC"_DH,%X="^UTILITY(""DI"",$J,",%Y="^UTILITY($J," D %XY^%RCR
 D FILE^DIFROM3:$O(^UTILITY($J,0))>0 G:'$D(DRN) EQ^DIFROM11 S DH=$E(DH,8,999) Q
 ;
%XY ;
 W "." S %Z=0,%A="",%C(-1)=0,%Y=%X
S S %B=""
N S @("%B=$O("_%X_%A_"%B))"),%C(%Z)=%C(%Z-1) I '%B,%B'?1"0".E,@E S %B=""
 I %B["," F %C=0:0 S %C=$F(%B,",",%C) Q:'%C  S %C(%Z)=%C(%Z)+1
 I %B="" G Q:'%Z S @("%B="_$P(%A,",",%Z+%C(%Z-2),%Z+%C(%Z-1))),%Z=%Z-1,%A=$P(%A,",",1,%Z+%C(%Z-1))_$E(",",%Z>0) G N
 I @("$D("_%X_%A_"%B))#2=1") S %V=^(%B) D W:%V'?.ANP S %=$P("""",U,+%B'=%B),%=%Y_%A_%_%B_%_")" D B:$L(%V)>240 S DL=DL+1,^UTILITY($J,DL,0)=%,DL=DL+1,^UTILITY($J,DL,0)="="_%V
 I @("$D("_%X_%A_"%B))<9") G N
 G D:+%B=%B F %C=0:0 S %C=$F(%B,"""",%C) Q:'%C  S %B=$E(%B,1,%C-1)_""""_$E(%B,%C,999),%C=%C+1
 S %B=""""_%B_""""
D S %A=%A_%B_",",%Z=%Z+1 G S
 ;
B I $L(%V)>255 W !,"WARNING--DATA TOO LONG:  " D X
 S DL=DL+1,^UTILITY($J,DL,0)=%,%=$C(126)_$E(%V,1,160),%V=$E(%V,161,999) Q
 ;
W W !,"WARNING--CONTROL CHARACTER IN DATA:  "
X W $C(7),%X,%A,%B,")--",!?3,%V
Q Q
V K DSV I $D(^DD(D,0,"VR"))#2 S DSV=^("VR") K ^("VR")
 D %XY
 I $D(DSV)#2 S ^DD(D,0,"VR")=DSV K DSV
 Q

DIFROM11
DIFROM11 ;SFISC/XAK-CREATES RTN ENDING IN INIT1 ;APR 13, 1995@14:31;11/24/92  10:31
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S %Y="^UTILITY(U,$J,D,Y,",E=0
 F D="DIE","DIPT","DIBT" S %X=U_D_"(Y,",Y=0 F  S @("Y=$O(^"_D_"(Y))") Q:'Y  I $D(^(Y,0))#2 S DSV=^(0),F=$P(DSV,U,4) I F,$P(DSV,U,8)<3,$D(F(F))!$D(Q(D,Y)) D 1
 S D="DIST(.403,",%X=U_D_"Y,",Y=0 F  S Y=$O(^DIST(.403,Y)) Q:'Y  I $D(^(Y,0))#2 S DSV=^(0),F=$P(DSV,U,8) I F,$D(F(F))!$D(Q("DIST",Y)) D 1
 S X="" F D=0:0 S X=$O(^UTILITY(U,$J,X)) Q:X=""  S %X="^UTILITY(U,$J,"_""""_X_"""," D %XY^DIFROM1
 K ^UTILITY(U,$J) D FILE^DIFROM3:DL K ^UTILITY($J) G:'$D(DRN) EQ
 D DIFROM2 G Q
1 ;
 I 'DIT F %=0:0 S %=$O(^DIC(9.4,DPK,"EX",%)) Q:%'>0  I $P($P(DSV,U),$P(^(%,0),U))="" G QQ
 I D["DIST" I DIT!($P($P(DSV,U),DTL)="")!$D(Q("DIST",Y)) S Q("DIST")=0 D %XY^%RCR S $P(DSV,U,4)="",$P(DSV,U,6)="" S:'DSEC $P(DSV,U,2,3)=U S ^UTILITY(U,$J,D,Y,0)=DSV D BLK G QQ
 I DIT!($P($P(DSV,U),DTL)="")!$D(Q(D,Y)) S Q(D)=0 D %XY^%RCR K ^UTILITY(U,$J,D,Y,"RD"),^("AB") K:'$D(DTL(F))&(D["DIBT") ^(1) S:'DSEC ^(0)=$P(DSV,U,1,2)_U_U_F_U_U_U_U_$P(DSV,U,8,9) W "."
QQ Q
BLK N D,%X S D="DIST(.404,",%X=U_D_"Y,"
 F I=0:0 S I=$O(^UTILITY(U,$J,"DIST(.403,",Y,40,I)) Q:'I  I $D(^(I,0)) S %=+$P(^(0),U,2) S:$D(^DIST(.404,%,0)) $P(^UTILITY(U,$J,"DIST(.403,",Y,40,I,0),U,2)=$P(^(0),U) S K=Y,Y=% D:$D(^DIST(.404,%,0)) %XY^%RCR S Y=K D B2
 Q
B2 F J=0:0 S J=$O(^UTILITY(U,$J,"DIST(.403,",Y,40,I,40,J)) Q:'J  I $D(^(J,0)) S %=+^(0) I $D(^DIST(.404,%,0)) S $P(^UTILITY(U,$J,"DIST(.403,",Y,40,I,40,J,0),U)=$P(^(0),U),K=Y,Y=% D %XY^%RCR S Y=K
 Q
 ;
DIFROM2 ;
 S DIFROM=5,Y=DRN-1,S=""
 S DH=" ; LOADS AND INDEXES DD'S",^UTILITY($J,.3,0)=" K DIF,DIK,D,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DFR,DTN,DIX,DZ D DT^DICRW S %=1,U=""^"",DSEC=1"
 S X="",DD="A" F E=1:1 S DD=$O(Q(DD)) Q:DD=""  S X=X_","""_$E(DD,1,3)_""""
 S DL=0,^UTILITY($J,1.4,0)=" S NO=$P(""I 0^I $D(@X)#2,X[U"",U,%) I %<1 K DIFQ Q"
 S DIRS(1)=" I %<1 K DIFQ Q"
 S:E>1 ^UTILITY($J,2,0)=" F X="_$E(X,2,99)_" D W Q:'$D(DIFQ)"
 G ^DIFROM2
 ;
EQ W $C(7),!!,"PACKAGE TOO LARGE!  DIFROM CAN NOT BUILD ANY MORE INIT ROUTINES.",!!
Q K ^UTILITY($J),^("^",$J),^UTILITY("DIF",$J),DIFROM,DR,DD,DLAYGO,DIRS,DIMA,DWLW,DREF,D1
 K DI,DISYS,DIX,DIY,DO,DZ,DIK,DIDUZ,DIFQ,DDF,DDT,NO,DIF,DIG,DIH,DIU,DIV,DIW
 K %,%1,%2,%A,%B,%C,%DT,%V,%X,%Y,%Z,DDH,DG,D0,DA,DIFRM,DL,D,E,DIC,DIE,DN,DPK,DQ
 K DIFC,DRN,DIRUT,DIROUT,DTOUT,DUOUT,DIR,DIFQR,DNAME,DSEC,DTL
 K A,C,I,J,K,F,L,N,Q,R,S,X,Y,Z,DSV,DIDIU,DIFKEP,DIFR,DIFR1,DIFR2,DIT,DH,DILN2,DIFL,VERSION
 K DIFRDIFI,DIFRF,DIFRIR,DIFRRMAX,DIFRRN,DIFRRTN,DIFRRXT,DIFRS,DIFRTX
 K DIOVRD
 Q

DIFROM12
DIFROM12 ;SFISC/XAK-CREATES RTN ENDING IN INIT1 ;12:50 PM  28 Sep 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
VER ;
 W !!?5,"Now you must enter the information that goes on the second line",!?5,"of the INIT routines.",!
 G:DPK<1 V2
 S DIE=9.4,DA=Q,DR=22,DR(2,9.49)=1 D ^DIE I $D(Y) S (DUOUT,DIRUT)=1 Q
 G V2:'$D(D1) S X=^DIC(9.4,DPK,22,D1,0),DPK(1)=$P(X,U,1),DILN2=" ;;"_DPK(1)_";"_$P(^DIC(9.4,DPK,0),U,1)_";;",Y=$P(X,U,2) D DD^%DT S DILN2=DILN2_Y
 W !! Q
V2 K DIR S DIR(0)="F^4:30",DIR("A")="Package Name",DIR("?")="^D PNM^DIFROMH1" D ^DIR Q:$D(DIRUT)  S DILN2=Y
 K DIR S DIR(0)="F^1:9^K:'(X?1.3N.1""."".2N.1A.2N) X",DIR("A")="Version",DIR("?")="^D VER^DIFROMH1" D ^DIR Q:$D(DIRUT)  S DPK(1)=Y,DILN2=" ;;"_Y_";"_DILN2_";;"
 K DIR S DIR(0)="D^::EX",DIR("A")="Date Distributed",DIR("?")="^D VDT^DIFROMH1" D ^DIR Q:$D(DIRUT)  D DD^%DT S DILN2=DILN2_Y
 W !! Q
PKG ;
 Q:DTL="DIPK"!(DTL="DI")
 S %Y="^UTILITY(U,$J,""PKG"",DPK,",%X="^DIC(9.4,"_DPK_","
 W !,"Moving "_$P(^DIC(9.4,DPK,0),U)_" Entry into Init's."
 S D=%X_"""22""," D %XY^%RCR K DR S:$D(^DISV(DUZ,D)) DR=^(D)
 I $P(^DIC(9.4,DPK,0),U,4) S DL=$S($D(^DIC(9.2,+$P(^(0),U,4),0))#2:$P(^(0),U),1:""),$P(^UTILITY(U,$J,"PKG",DPK,0),U,4)=DL
 F %="PRE","INI","INIT" S:$D(^UTILITY(U,$J,"PKG",DPK,%)) $P(^(%),U,2)=""
 K ^UTILITY(U,$J,"PKG",DPK,"VERSION"),DIE Q:'$D(^ORD(100.99,1,5,DPK,0))
OR ;
 S %X="^ORD(100.99,1,5,DPK,",%Y="^UTILITY(U,$J,""OR"",DPK," D %XY^%RCR
 S %=$P(^ORD(100.99,1,5,DPK,0),U,4)
 I %]"" S %=$S($D(^ORD(100.98,%,0)):$P(^(0),U),1:"") I %]"" S $P(^UTILITY(U,$J,"OR",DPK,0),U,4)=%
 F I=0:0 S I=$O(^ORD(100.99,1,5,DPK,1,I)) Q:'I  I $D(^(I,0)) S %=+$P(^(0),U) I $D(^ORD(101,%,0)) S $P(^UTILITY(U,$J,"OR",DPK,1,I,0),U)=$P(^(0),U) D OR1
 F I=0:0 S I=$O(^ORD(100.99,1,5,DPK,5,I)) Q:'I  I $D(^(I,0)) S %=+$P(^(0),U,3) I $D(^ORD(101,%,0)) S $P(^UTILITY(U,$J,"OR",DPK,5,I,0),U,3)=$P(^(0),U)
 K ^UTILITY(U,$J,"OR",DPK,"B")
 Q
OR1 F J=0:0 S J=$O(^ORD(100.99,1,5,DPK,1,I,1,J)) Q:'J  I $D(^(J,0)) S %=+$P(^(0),U) I $D(^ORD(101,%,0)) S $P(^UTILITY(U,$J,"OR",DPK,1,I,1,J,0),U)=$P(^(0),U)
 Q

DIFROM2
DIFROM2 ;SFISC/XAK-CREATES RTN ENDING IN 'INIT1' ;31OCT2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S ^UTILITY($J,2.5,0)=" Q:'$D(DIFQ)  S %=2 W !!,""ARE YOU SURE EVERYTHING'S OK"" D YN^DICN I %-1 K DIFQ Q"
 I $D(^DIC(9.4,DPK,"INI")),$P(^("INI"),U)]"" S ^UTILITY($J,2.6,0)=" D ^"_$P(^("INI"),U)_" D NOW^%DTC S DIFROM(""INI"")=%"
 S ^UTILITY($J,2.7,0)=" I $D(DIFKEP) F DIDIU=0:0 S DIDIU=$O(DIFKEP(DIDIU)) Q:DIDIU'>0  S DIU=DIDIU,DIU(0)=DIFKEP(DIDIU) D EN^DIU2"
 S ^UTILITY($J,3,0)=" D DT^DICRW K ^UTILITY(U,$J),^UTILITY(""DIK"",$J) D WAIT^DICD" K Q
 S ^UTILITY($J,3.1,0)=" S DN=""^"_DN_""" F R=1:1:"_Y_" D @(DN_$$B36(R)) W ""."""
 S X=4,Q=" ;",^UTILITY($J,X,0)=" F  S D=$O(^UTILITY(U,$J,""SBF"","""")) Q:D'>0  K:'DIFQ(D) ^(D) S D=$O(^(D,"""")) I D>0  K ^(D) D IX"
 S DIRS=" K:%<0 DIFQ"
 S E=$E(DTL_"INIT",1,7),DNAME=E_1,D=-9999 F DD=1:1 S X=$E($T(TEXT+DD),4,999) Q:X=""  S ^UTILITY($J,DD+4,0)=X S:DD=19 ^UTILITY($J,DD+4,0)=X_DIRS
 S ^UTILITY($J,1.5,0)="ASK I %=1,$D(DIFQ(0)) W !,""SHALL I WRITE OVER FILE SECURITY CODES"" S %=2 D YN^DICN S DSEC=%=1"_DIRS(1)
 D ZI^DIFROM3 G ^DIFROM3
 Q
TEXT ;
 ;;KEYSNIX ; Keys and new style indexes installer ; new in FM V22.2
 ;; N DIFRSA S DIFRSA=$NA(^UTILITY("KX",$J)) ; Tran global for Keys and Indexes
 ;; N DIFRFILE S DIFRFILE=0 ; Loop through files
 ;; F  S DIFRFILE=$O(@DIFRSA@("IX",DIFRFILE)) Q:'DIFRFILE  D
 ;; . K ^TMP("DIFROMS2",$J,"TRIG")
 ;; . N DIFRD S DIFRD=0
 ;; . F  S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA) ; install New Style Indexes
 ;; . K ^TMP("DIFROMS2",$J,"TRIG")
 ;; . S DIFRD=0
 ;; . F  S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA) ; install keys
 ;; K @DIFRSA ; kill off tran global
 ;; ; VEN/SMH v22.2: Below I added a K D1 because it leaks from the call causing the key matching algo to fail.
 ;;DATA W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0
 ;; I DIFQR(D) S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=DIFQR(D)'=2 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 K D1 Q:'$D(^(D0,0))  S Z=^(0) D I^DITR
 ;; K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA
 ;; ;
 ;;W S Y=$P($T(@X),";",2) W !,"NOTE: This package also contains "_Y_"S",! Q:'$D(DIFQ(0))
 ;; S %=1 W ?6,"SHALL I WRITE OVER EXISTING "_Y_"S OF THE SAME NAME" D YN^DICN I '% W !?6,"Answer YES to replace the current "_Y_"S with the incoming ones." G W
 ;; S:%=2 DIFQ(X)=0
 ;; Q
 ;; ;
 ;;OPT ;OPTION
 ;;RTN ;ROUTINE DOCUMENTATION NOTE
 ;;FUN ;FUNCTION
 ;;BUL ;BULLETIN
 ;;KEY ;SECURITY KEY
 ;;HEL ;HELP FRAME
 ;;DIP ;PRINT TEMPLATE
 ;;DIE ;INPUT TEMPLATE
 ;;DIB ;SORT TEMPLATE
 ;;DIS ;FORM
 ;;REM ;REMOTE PROCEDURE
 ;; ;
 ;;SBF ;FILE AND SUB FILE NUMBERS
 ;;IX W "." S DIK="A" F %=0:0 S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 ;; S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 ;; I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," G IXALL^DIK
 ;; Q
 ;;B36(X) Q $$N(X\(36*36)#36+1)_$$N(X\36#36+1)_$$N(X#36+1)
 ;;N(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

DIFROM3
DIFROM3 ;SFISC/XAK-CREATES RTN ENDING IN 'INIT2' (HELP FRAMES) ; 6 DEC 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIRS=" S DIFQ=1"
 S DNAME=E_2,DL=0,(DH,Q)=" ;" K ^UTILITY($J) F DD=1:1 S X=$T(TEXT+DD) Q:X=""  S ^UTILITY($J,DD,0)=$E(X,4,999) S:$E(X,4)="U" ^(0)=^(0)_DIRS
 S DIFROM=2 D ZI G ^DIFROM4
 ;
FILE ;
 D:'$D(DISYS) OS^DII S DL=0,Q="Q Q",S=" ;;"
NAME S D=0
 I DRN>12959 K DRN Q
 S DNAME=DN_$$B36(DRN)
ZI ;
 I '$D(DIFROM(1)) S %H=+$H D YX^%DTC S DIFROM(1)=$E(Y,5,6)_"-"_$E(Y,1,3)_"-"_$E(Y,9,12)
2 K ^UTILITY($J,0)
 S ^(0,1)=DNAME_" ; ; "_DIFROM(1),D=$L(^(1))+2 ; (2 = CR/LF)
 S ^(1.1)=DILN2,D=D+$L(^(1.1))+2 ; (2 = CR/LF)
 S ^UTILITY($J,0,2)=DH,D=D+$L(^(2))+2 ; (2 ditto)
 S ^UTILITY($J,0,3)=Q,D=D+$L(^(3))+2 ; (2 ditto)
 F L=4:1 D  Q:DL'>0  I D+257>DIFRM,$E(^(L),4)'="^",$E(^(L),4)'=$C(126) Q  ; 255 for a line extra in M95 + 2 CR/LF
 . S DL=$O(^UTILITY($J,DL))
 . Q:DL'>0
 . S ^UTILITY($J,0,L)=S_^(DL,0)
 . S D=$L(^(L))+D+2 ; VEN/SMH - Add 2 charcaters for CR/LF
 S DRN=DRN+1,X=DNAME X ^DD("OS",DISYS,"ZS") W !,X_" HAS BEEN FILED..." G NAME:DL>0
K K %A,%B,%C,%Z,^UTILITY($J) S DL=0 Q
 ;
B36(X) ;Calculate base 36 number from 0 (000) to 46,655 (ZZZ).
 S X=$G(X) I X>46655 Q ""
 Q $$N(X\(36*36)#36+1)_$$N(X\36#36+1)_$$N(X#36+1)
N(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)
 ;
TEXT ;
 ;; K ^UTILITY("DIFROM",$J),DIC S DIDUZ=0 S:$D(DUZ)#2 DIDUZ=DUZ S DUZ=.5
 ;; I $D(^DIC(9.2,0))#2,^(0)?1"HEL".E S (DIC,DLAYGO)=9.2,N="HEL",DIC(0)="LX" G ADD
 ;; Q
 ;; ;
 ;;ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R'>0  S X=$P(^(R,0),U,1) W "." K DA D ^DIC I Y>0,'$D(DIFQ(N))!$P(Y,U,3) S ^UTILITY("DIFROM",$J,N,X)=+Y K ^DIC(9.2,+Y,1),^(2),^(3),^(10) S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y D %XY^%RCR
 ;; S DIK=DIC
 ;;HELP S R=$O(^UTILITY("DIFROM",$J,N,R)) Q:R=""  W !,"'"_R_"' Help Frame filed." S DA=^(R)
 ;; F X=0:0 S X=$O(^DIC(9.2,DA,2,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$P(I,U,2) S:Y]"" Y=$O(^DIC(9.2,"B",Y,0)) S ^(0)=$P(^DIC(9.2,DA,2,X,0),U,1)_U_$S(Y>0:Y,1:"")_U_$P(^(0),U,3,99)
 ;; S I=0 F X=0:0 S X=$O(^DIC(9.2,DA,10,X)) Q:'X  I $D(^(X,0)) S Y=$P(^(0),U),Y=$S(Y]"":$O(^MAG("B",Y,0)),1:0) S:Y $P(^DIC(9.2,DA,10,X,0),U)=Y,I=I+1,%=X I 'Y K ^DIC(9.2,DA,10,X,0)
 ;; I I S $P(^DIC(9.2,DA,10,0),U,3,4)=%_U_I
 ;;IX D IX1^DIK G HELP
 ;; ;
 ;;U I $D(DIRUT)
 ;; W ! Q
 ;;REP S DIR(0)="Y",DIR("A")="Shall I change the NAME of the file to "_DIF
 ;; S DIR("??")="^D REP^DIFROMH1",DIR("B")="NO" D ^DIR G U:$D(DIRUT)
 ;; I Y S DIE=1,DIFQ=0,DA=N,DR=".01////"_DIF D ^DIE Q
 ;; S DIR("A")="Shall I replace your file with mine"
 ;; S DIR("??")="^D AG^DIFROMH1" D ^DIR G U:$D(DIRUT)!'Y
 ;; S DIU(0)="E",DIR("A")="Do you want to keep the Data"
 ;; S DIR("??")="^D CHG^DIFROMH1" D ^DIR G U:$D(DIRUT)
 ;; S:'Y DIU(0)=DIU(0)_"D"
 ;; S DIR("A")="Do you want to keep the Templates"
 ;; S DIR("??")="^D TEMP^DIFROMH1" D ^DIR G U:$D(DIRUT) S:'Y DIU(0)=DIU(0)_"T"
 ;; S DIFQ(N)=1,DIFKEP(N)=DIU(0) W !?15," (",DIF,") " Q

DIFROM4
DIFROM4 ;SFISC/XAK-CREATES 'INIT3' ;2:49 PM  25 Sep 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DNAME=E_3,DIRS=E_4,DL=0,(DH,Q)=" ;"
 K ^UTILITY($J) F DD=1:1 S X=$T(TXT+DD) Q:X=""  S ^UTILITY($J,DD,0)=$E(X,4,999) S:$E(X,4,5)="OR" ^(0)=^(0)_DIRS
 D ^DIFROM41
 S DIFROM=2 D ZI^DIFROM3 G ^DIFROM42
TXT ;
 ;; K ^UTILITY("DIFROM",$J) S DIC(0)="LX",(DIC,DLAYGO)=3.6,N="BUL" D ADD:$D(^XMB(3.6,0))
 ;; S X=0 F R=0:0 S X=$O(^UTILITY("DIFROM",$J,N,X)) Q:X=""  W !,"'",X,"' BULLETIN FILED -- Remember to add mail groups for new bulletins."
 ;; I $D(^DIC(9.4,0))#2,^(0)?1"PACK".E S N="PKG",(DIC,DLAYGO)=9.4 D ADD
 ;; G NP:'$D(DA) S %=+$O(^DIC(9.4,DA,22,"B",DIFROM,0)) I $D(^DIC(9.4,DA,22,%,0)) S $P(^(0),U,3)=DT
 ;; I $D(^DIC(9.4,DA,0))#2 S %=$P(^(0),U,4) I %]"" S %=$O(^DIC(9.2,"B",%,0)) S:%]"" $P(^DIC(9.4,DA,0),U,4)=%
 ;;OR I $D(^ORD(100.99))&$O(^UTILITY(U,$J,"OR","")) D EN^
 ;;NP K DIC,^UTILITY("DIFROM",$J) S DIC(0)="LX" I $D(^DIC(19,0))#2,^(0)?1"OPTION".E S (DIC,DLAYGO)=19,N="OPT" D ADD,OP
 ;; I $D(^DIC(19.1,0))#2,($P(^(0),U)?1"SECUR".E)!($P(^(0),U)="KEY") S (DIC,DLAYGO)=19.1,N="KEY" D ADD K ^UTILITY("DIFROM",$J)
 ;; I $D(^DIC(9.8,0))#2,^(0)?1"ROUTINE^".E S (DIC,DLAYGO)=9.8,N="RTN" D ADD
 ;; S DIC=.5,DLAYGO=0,N="FUN" D ADD
 ;; I $P($G(^DIC(8994,0)),U)="REMOTE PROCEDURE" S (DIC,DLAYGO)=8994,N="REM" D ADD
 ;; S DIC("S")="I $P(^(0),U,4)=DIFL" F N="DIPT","DIBT","DIE" S DIC=U_N_"(" D ADD
 ;; K DIC("S") S N="DIST(.404,",DIC=U_N,DLAYGO=.404 D ADD
 ;; S DIC("S")="I $P(^(0),U,8)=DIFL",N="DIST(.403,",DIC=U_N,DLAYGO=.403 D ADD
 ;; K ^UTILITY(U,$J),DIC,DLAYGO F DIFR="DIE","DIPT" D DIEZ
 ;; K ^UTILITY("DIFROM",$J) Q

DIFROM41
DIFROM41 ;SFISC/XAK-CREATES 'INIT3' (CONT.) ;11:02 AM  13 Sep 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S L=0 F DD=DD:1 S L=L+1,X=$T(TXT+L) Q:X=""  S ^UTILITY($J,DD,0)=$E(X,4,999)
 Q
TXT ;
 ;;DIEZ I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 ;; E  S DISYS=^DD("OS")
 ;; Q:'$D(^DD("OS",DISYS,"ZS"))
 ;; S DIFR1=""
 ;;DZ1 S DIFR1=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1)) Q:DIFR1=""
 ;; F DIFR2=0:0 S DIFR2=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  S Y=DIFR2 I $D(@(U_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD"),DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 ;; G DZ1
 ;; ;
 ;;OP S R=$O(^UTILITY("DIFROM",$J,N,R)) I R="" K ^UTILITY("DIFROM",$J) G Q
 ;; W !,"'"_R_"' Option Filed" S DA=+^UTILITY("DIFROM",$J,N,R) G:$P(^(R),U,2,3)="XUCORE^"!($P(^(R),U,2,3)="XUCOMMAND^") OP
 ;; I $D(^DIC(19,DA,220)) S %=$P(^(220),U) S:%]"" %=$O(^XMB(3.6,"B",%,0)) S $P(^DIC(19,DA,220),U)=%,%=$P(^(220),U,3) S:%]"" %=$O(^XMB(3.8,"B",%,0)) S $P(^DIC(19,DA,220),U,3)=%
 ;; S %=$P(^DIC(19,DA,0),U,12) S:%]"" %=$O(^DIC(9.4,"B",%,0))
 ;; S $P(^DIC(19,DA,0),U,12)=%,%=$P(^(0),U,7),(DZ,DIX)=0
 ;; D:$D(^DIC(19,DA,10,"B")) KAD(DA) S:%]"" %=$O(^DIC(9.2,"B",%,0)) S $P(^DIC(19,DA,0),U,7)=%,%=$P(^(0),U,4),%="MOQXL"[% K ^(10,"B"),^("C")
 ;; F X=0:0 S X=$O(^DIC(19,DA,10,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$S($D(^(U)):^(U),1:"") K ^DIC(19,DA,10,X) I Y]"",% S D=$O(^DIC(19,"B",Y,0)) I D S ^DIC(19,DA,10,X,0)=D_U_$P(I,U,2,9),DZ=DZ+1,DIX=X
 ;; S:% ^DIC(19,DA,10,0)="^19.01PI^"_DIX_U_DZ D IX1^DIK G OP
 ;; ;
 ;;ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R=""  S X=$P(^(R,0),U),DIFL=$S(N="DIST(.403,":$P(^(0),U,8),N="DIST(.404,":$P(^(0),U,2),1:$P(^(0),U,4)) W "." K DA D ^DIC I Y>0,'$D(DIFQ($E(N,1,3)))!$P(Y,U,3) S Y=Y_U D A
 ;;Q Q
 ;;A I N="BUL" K % S %(0)=$G(@(DIC_"+Y,2,0)")) F %=0:0 S %=$O(@(DIC_"+Y,2,%)")) Q:'%  S %(%)=$G(^(%,0))
 ;; K:N'="KEY"&(N'="OPT") @(DIC_"+Y)") S ^UTILITY("DIFROM",$J,N,X)=Y S:$E(N,1,2)="DI" ^(X,+Y)="" S:N="PKG" DIFROM(0)=+Y Q:$P(Y,U,2,3)="XUCORE^"!($P(Y,U,2,3)="XUCOMMAND^")
 ;; I N="BUL",%(0)]"" S @(DIC_"+Y,2,0)")=%(0) F %=0:0 S %=$O(%(%)) Q:'%  S @(DIC_"+Y,2,%,0)")=%(%)
 ;; I $E(N,1,2)="DI",('DIFL)!('$D(^DD(+DIFL))) D
 ;; .W !,"**WARNING--"_$S(N="DIE":"INPUT",N="DIPT":"PRINT",N="DIBT":"SORT",1:"FORM or BLOCK")_$S(N'["DIST":" template ",1:" ")_$P(Y,U,2)_" has been installed,",!,"but associated file "_DIFL_" is not on your system!"
 ;; .Q
 ;; I N="OPT" S:$P(^DIC(19,+Y,0),U,6)]"" DIOPT=$P(^(0),U,6) I $O(^UTILITY(U,$J,N,R,1,0)) K ^DIC(19,+Y,1)
 ;; I N="DIST(.403," D BLK
 ;; S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y,DIK=DIC D %XY^%RCR
 ;; D IX1^DIK:N'="OPT" I N="OPT",$D(DIOPT) S:$P(^DIC(19,DA,0),U,6)="" $P(^(0),U,6)=DIOPT K DIOPT
 ;; I N="DIST(.403," D
 ;; .N DIFRVAL S DIFRVAL=$$VAL^DIFROMSS(.403,DA)
 ;; .I DIFRVAL W !,"Compiling form: ",$P(^DIST(.403,DA,0),U) D EN^DDSZ(DA) Q
 ;; .W !,"ERROR: Form: ",$P(^DIST(.403,DA,0),U)," cannot be compiled"
 ;; .Q
 ;; Q
 ;;BLK F J=0:0 S J=$O(^UTILITY(U,$J,N,R,40,J)) Q:'J  I $D(^(J,0)) S %=$P(^(0),U,2) S:%]"" %=$O(^DIST(.404,"B",%,0)) S:% $P(^UTILITY(U,$J,N,R,40,J,0),U,2)=% D B1
 ;; K A0,A1,A2,J,L Q
 ;;B1 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,40,L)) Q:'L  S A0=$G(^(L,0)),%=$P(A0,U) I %]"" S %=$O(^DIST(.404,"B",%,0)) I % S $P(A0,U)=%,^UTILITY(U,$J,N,R,40,J,"BLK",%,0)=A0 D
 ;; .N X S X=0
 ;; .F  S X=$O(^UTILITY(U,$J,N,R,40,J,40,L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,"BLK",%,X)=^(X)
 ;; .Q
 ;; S A0=$G(^UTILITY(U,$J,N,R,40,J,40,0)) Q:A0=""  K ^UTILITY(U,$J,N,R,40,J,40) S (A1,A2)=0
 ;; F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L)) Q:'L  S ^UTILITY(U,$J,N,R,40,J,40,L,0)=^(L,0),A1=L,A2=A2+1 D
 ;; .N X S X=0
 ;; .F  S X=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,40,L,X)=^(X)
 ;; .Q
 ;; S $P(A0,U,3,4)=A1_U_A2,^UTILITY(U,$J,N,R,40,J,40,0)=A0 K ^UTILITY(U,$J,N,R,40,J,"BLK")
 ;; Q
 ;;KAD(D0) N D1,X
 ;; S X=0 F  S X=$O(^DIC(19,D0,10,"B",X)) Q:X'>0  S D1=0 F  S D1=$O(^DIC(19,D0,10,"B",X,D1)) Q:D1'>0  K ^DIC(19,"AD",X,D0,D1)
 ;; Q

DIFROM42
DIFROM42 ;SFISC/XAK-CREATES 'INIT4' ;10/9/95  05:59
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DNAME=E_4,DL=0,(DH,Q)=" ;"
 K ^UTILITY($J) F DD=1:1 S X=$T(TXT+DD) Q:X=""  S ^UTILITY($J,DD,0)=$E(X,4,999)
 S DIFROM=2 D ZI^DIFROM3 G ^DIFROM5
TXT ;
 ;;EN S DA(1)=1,DIK="^ORD(100.99,1,5," I $D(^ORD(100.99,1,5,DA)) D ^DIK
 ;; S %X="^UTILITY(U,$J,""OR"","_$O(^UTILITY(U,$J,"OR",""))_",",%Y=DIK_DA_","
 ;; S:'$D(^ORD(100.99,1,5,0)) ^(0)="^100.995P^^" S $P(^(0),U,3,4)=DA_U_($P(^(0),U,4)+1)
 ;; D %XY^%RCR S $P(^ORD(100.99,1,5,DA,0),U)=DA,%=$P(^(0),U,4)
 ;; I %]"" S %=$O(^ORD(100.98,"B",%,0)) I %>0 S $P(^ORD(100.99,1,5,DA,0),U,4)=%
 ;; D OR
 ;; S DA(1)=1 D IX1^DIK
 ;; Q
 ;;OR S (N,I)=0,X=""
 ;; F  S N=$O(^ORD(100.99,1,5,DA,1,N)) Q:'N  S X=$P(^(N,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,0)=% S X=N,I=I+1,(R,J)=0,Y="" D OR1
 ;; S:I $P(^ORD(100.99,1,5,DA,1,0),U,3,4)=X_U_I S (N,I)=0,X=""
 ;; F  S N=$O(^ORD(100.99,1,5,DA,5,N)) Q:'N  S X=$P(^(N,0),U,3) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% $P(^ORD(100.99,1,5,DA,5,N,0),U,3)=% S X=N,I=I+1
 ;; S:I $P(^ORD(100.99,1,5,DA,5,0),U,3,4)=X_U_I K N,R,X,Y,I,J
 ;; Q
 ;;OR1 N X F  S R=$O(^ORD(100.99,1,5,DA,1,N,1,R)) Q:'R  S X=$P(^(R,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,1,R,0)=% S Y=R,J=J+1
 ;; S:J $P(^ORD(100.99,1,5,DA,1,N,1,0),U,3,4)=Y_U_J
 ;; Q
 ;;ADDP N I,J,N,R,DA,DLAYGO,DO S %=""
 ;; S DIC="^ORD(101,",DIC(0)="LX",DLAYGO=101 D FILE^DICN K DIC Q:Y=-1  S %=+Y Q

DIFROM5
DIFROM5 ;SFISC/XAK-CREATES RTN ENDING IN 'INIT' ;03:14 PM  28 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIFRF=0,DIFRRXT="567890ABCDEFGHIJKLMNOPQRUVWXZ",DIFRRN=E,DIFRTX=0
 S DIFRRMAX=$S($G(DIFRM)>1999:DIFRM,$G(^DD("ROU"))>1999:^("ROU"),1:2000)
 F DIFRIR=1:1 S X=0,Q=" Q",DNAME=DIFRRN_$E(DIFRRXT,DIFRIR) D  Q:DIFRF'>0
 .S DIFRS=510
 .F  S DIFRF=$O(F(DIFRF)) Q:DIFRF'>0  D  Q:DIFRS>DIFRRMAX
 ..S X=X+1
 ..S DH=$P(@(F(DIFRF,0)_"0)"),U,2)
 ..S ^UTILITY($J,X,0)=" ;;"_DH_";"_F(DIFRF)_";"_F(DIFRF,0)_";"_$S($D(F(DIFRF,DIFRF)):F(DIFRF,DIFRF),1:"")_";"_$TR(F(DIFRF,-222),"^",";"),DIFRS=DIFRS+$L(^UTILITY($J,X,0))
 ..S X=X+1
 ..S ^UTILITY($J,X,0)=" ;;"_F(DIFRF,-223),DIFRS=DIFRS+$L(^UTILITY($J,X,0))
 ..Q
 .S DH=$S(DIFRIR=1:" K ^UTILITY(""DIF"",$J) S DIFRDIFI=1",1:"")
 .S DH=DH_" F I=1:1:"_X_" S ^UTILITY(""DIF"",$J,DIFRDIFI)=$T(IXF+I),DIFRDIFI=DIFRDIFI+1"
 .S ^UTILITY($J,.5,0)="IXF ;;"_$P(DPK(0),U,1,2)
 .S DIFRTX=DIFRTX+X,D=-9999,DIFROM=X D ZI^DIFROM3 K ^UTILITY($J)
 .Q
 S Q=$S('$D(^DIC(9.4,DPK,"INIT")):1,$P(^("INIT"),U)?1PA.E:$P(^("INIT"),U),1:1)
 S DRN=^DD("VERSION"),X=DIFROM
 S ^UTILITY($J,5,0)=" F DIF=1:2:"_DIFRTX_" S %=^UTILITY(""DIF"",$J,DIF),DIK=$P(%,"";"",5),N=$P(%,"";"",3),D=$P(%,"";"",4)_U_N D D K DIFQ(N)"
 S ^UTILITY($J,9,0)=" L  S DUZ=DIDUZ W:"_(DIFRTX>0)_" !"_$S(Q:",$C(7),""OK, I'M DONE."",!",1:"")_",""NO""_$P(""TE THAT FILE"",U,DSEC)_"" SECURITY-CODE PROTECTION HAS BEEN MADE"""
 I 'Q S ^UTILITY($J,9.1,0)=" D ^"_Q_",NOW^%DTC S DIFROM(""INIT"")=%"
 S ^UTILITY($J,9.11,0)=" I DIFROM F DIF=1:2:"_DIFRTX_" S %=^UTILITY(""DIF"",$J,DIF),N=+$P(%,"";"",3) I N,$P(%,"";"",8)=""y"" S ^DD(N,0,""VR"")=DIFROM"
 S ^UTILITY($J,9.12,0)=" I DIFROM(0)>0 F %=""PRE"",""INI"",""INIT"" S:$D(DIFROM(%)) $P(^DIC(9.4,DIFROM(0),%),U,2)=DIFROM(%)"
 S ^UTILITY($J,9.13,0)=" I $G(DIFQN) S $P(^(0),U,3,4)=$P(DIFQN,U,2)_U_($P(^DIC(0),U,4)+DIFQN) K DIFQN"
 S ^UTILITY($J,9.2,0)=" S:DIFROM(0)>0 ^DIC(9.4,DIFROM(0),""VERSION"")=DIFROM G Q^DIFROM0"
 S ^UTILITY($J,9.3,0)="D S:$D(^DIC(+N,0))[0 ^(0)=D S X=$D(@(DIK_""0)"")),^(0)=D_U_$S(X#2:$P(^(0),U,3,9),1:U)"
 S ^UTILITY($J,9.4,0)=" S DIFQR=DIFQR(+N) I ^DD(""VERSION"")>17.5,$D(^DD(+N,0,""DIK""))#2 S X=^(""DIK""),Y=+N,DMAX=^DD(""ROU"") D EN^DIKZ"
 S ^UTILITY($J,9.5,0)=" I DIFQR D IXALL^DIK:$O(@(DIK_""0)"")) W ""."""
 S ^UTILITY($J,9.6,0)=" Q"
 S ^UTILITY($J,9.7,0)="R G REP^"_E_2
 F DD=1:1 S E=$T(T+DD) Q:E=""  S E=$E(E,4,999) S:E="IXF ;;" E=E_$P(DPK(0),U,1,2)_";"_DUZ S ^UTILITY($J,9+DD,0)=E
 S DIFROM=10 G ^DIFROM6
T ;;
 ;; ;
 ;;1 S N=+$P(DIF(I),";",3),DIF=$P(DIF(I),";",4),S=$P(DIF(I),";",5)
 ;; W !!?3,N,?13,DIF,$P("  (Partial Definition)",U,$P(DIF(I),";",6)),$P("  (including data)",U,$P(DIF(I),";",13)="y") S Z=$S($D(^DIC(N,0))#2:^(0),1:"")
 ;; I Z="" S DIFQ(N)=1,DIFQN=$G(DIFQN)+1_U_N G S
 ;; I $L($P(Z,DIF)) W $C(7),!,"*BUT YOU ALREADY HAVE '",$P(Z,U),"' AS FILE #",N,"!" D R Q:DIFQ  G S:$D(DIFKEP(N)),1
 ;; S DIFQ(N)=$P(DIF(I),";",7)'="n"
 ;; I $L(Z) W $C(7),!,"Note:  You already have the '",$P(Z,U),"' File." S DIFQ(0)=1
 ;; S %=$E(^UTILITY("DIF",$J,I+1),4,245) I %]"" X % S DIFQ(N)=$T W:'$T !,"Screen on this Data Dictionary did not pass--DD will not be installed!" G S
 ;; I $L(Z),$P(DIF(I),";",10)="y" S DIR("A")="Shall I write over the existing Data Definition",DIR("??")="^D DD^DIFROMH1",DIR("B")="YES",DIR(0)="Y" D ^DIR S DIFQ(N)=Y
 ;;S S DIFQR(N)=0 Q:$P(DIF(I),";",13)'="y"!$D(DIRUT)
 ;; I $P(DIF(I),";",15)="y",$O(@(S_"0)"))>0 S DIF=$P(DIF(I),";",14)="o",DIR("A")="Want my data "_$P("merged with^to overwrite",U,DIF+1)_" yours",DIR("??")="^D DTA^DIFROMH1",DIR(0)="Y" D ^DIR S DIFQR(N)=$S('Y:Y,1:Y+DIF) Q
 ;; S %=$P(DIF(I),";",14)="o" W !,$C(7),"I will ",$P("MERGE^OVERWRITE",U,%+1)," your data with mine." S DIFQR(N)=%+1
 ;; Q
 ;;Q W $C(7),!!,"NO UPDATING HAS OCCURRED!" G Q^DIFROM0
 ;; ;
 ;;PKG S X=$P($T(IXF),";",3),DIC="^DIC(9.4,",DIC(0)="",DIC("S")="I $P(^(0),U,2)="""_$P(X,U,2)_"""",X=$P(X,U) D ^DIC S DIFROM(0)=+Y K DIC
 ;; Q
 ;; ;
 ;;IXF ;;

DIFROM6
DIFROM6 ;SFISC/XAK-CREATES RTN ENDING IN 'INIT' ;03:06 PM  28 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DH=" ;",Q=" K DIF,DIFQ,DIFQR,DIFQN,DIK,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DIFROM,DFR,DTN,DIX,DZ,DIRUT,DTOUT,DUOUT"
 S ^UTILITY($J,.3,0)=" S DIOVRD=1,U=""^"",DIFQ=0,DIFROM="""_$S($D(DPK(1)):DPK(1),1:0)_""" W !,""This version"_$S($D(DPK(1)):" (#"_DPK(1)_")",1:"")_" of '"_DTL_"INIT' was created on "_DIFROM(1)_""""
 S ^UTILITY($J,1,0)=" I $D(^DD(""VERSION"")),^(""VERSION"")'<"_+DRN_" G GO"
 S ^UTILITY($J,2,0)=" ;W !,""FIRST, I'LL FRESHEN UP YOUR VA FILEMAN...."" D N^DINIT"
 S ^UTILITY($J,2.9,0)=" I ^DD(""VERSION"")<"_+DRN_" W !,""but I need version "_+DRN_" of the VA FileMan!"" G Q"
 S ^UTILITY($J,3,0)="GO ;"
 S ^UTILITY($J,3.5,0)="EN ; ENTER HERE TO BYPASS THE PRE-INIT PROGRAM"
 S ^UTILITY($J,3.6,0)=" S DIFQ=0 K DIRUT,DTOUT,DUOUT"
 S ^UTILITY($J,3.7,0)=" F DIFRIR=1:1:"_DIFRIR_" S DIFRRTN="_""""_U_DIFRRN_""""_"_$E("_""""_$E(DIFRRXT,1,DIFRIR)_""""_",DIFRIR) D @DIFRRTN"
 S ^UTILITY($J,3.8,0)=" W:"_(DIFRTX>0)_" !,""I AM GOING TO SET UP THE FOLLOWING FILE"_$E("S",X>1)_":"" F I=1:2:"_DIFRTX_" S DIF(I)=^UTILITY(""DIF"",$J,I) D 1 G Q:DIFQ!$D(DIRUT) K DIF(I)"
 S X=$E(DTL_"INIT",1,7)
 S ^UTILITY($J,4,0)=" S DIFROM="""_$S($D(DPK(1)):DPK(1),1:0)_""" D PKG:'$D(DIFROM(0)),^"_X_"1 G Q:'$D(DIFQ) S DIK(0)=""AB"""
 S ^UTILITY($J,6,0)=" K DIFQR D ^"_X_"2,^"_X_3,X=0
 D VERSION^DI
 S ^UTILITY($J,.6,0)=" W !?9,""("_$S($D(^DD("SITE")):"at "_^("SITE")_",",1:"")_" by "_X_")"",!"
 I DPK>0,$D(^DIC(9.4,DPK,"PRE")),$P(^("PRE"),U)]"" S ^UTILITY($J,3.1,0)=" W !,""I HAVE TO RUN AN ENVIRONMENT CHECK ROUTINE."" D PKG,^"_$P(^("PRE"),U)_" Q:'$D(DIFQ)  D NOW^%DTC S DIFROM(""PRE"")=%"
 K ^UTILITY(U,$J),E S D=-9999,DNAME=DTL_"INIT",DL=0 D 2^DIFROM3
 I $G(DPK)>0,$D(^%ZOSF),$D(^%ZTSK) N DIFRINIS D SETUP^DIFROM7(DTL_"INIT",.DIFRINIS) W:$G(DIFRINIS)["INIS" !,DTL,"INIS HAS BEEN FILED..."
 Q
 ;
INTEG W !,"..." S X=0,%X="F %Y=1:1:DD S D=$A(DNAME,%Y)*%Y+D"
 F XCNP=XCNP:0 S X=$O(^UTILITY($J,X)) Q:X=""  W "." X "ZL @X S D=0 F Y=1:1 S DNAME=$T(+Y),DD=$L(DNAME) X %X I 'DD S ^UTILITY(""DINTEG"",$J,X)=D ZL DIFROM6 Q"
 Q

DIFROM7
DIFROM7 ;SFISC/(SLC/STAFF)-SITE TRACKING INSTALL BULLETIN ; 29NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SETUP(ROUTINE,STATUS) ;
 K ^TMP($J) N LINE,LINE1,LINE2,NUM,OK,ROUTINIS,TXT
 D:'$D(DISYS) OS^DII
 D LOAD(ROUTINE,"^TMP($J,",0)
 I $P($P(^TMP($J,1,0),";")," ")'?1U1.3UN1"INIT" S STATUS="not changed" Q
 S ROUTINIS=$P(ROUTINE,"INIT")_"INIS"
 S (OK,LINE)=0 F  S LINE=$O(^TMP($J,LINE)) Q:LINE<0  S TXT=^(LINE,0) S:TXT[("PAC^"_ROUTINIS) OK=2 Q:OK=2  I TXT["=DIFROM G Q^DIFROM" S OK=1 Q
 I 'OK S STATUS="not installed" Q
 I OK=1 D
 .S ^TMP($J,LINE-.9,0)=" I DIFROM,$D(^%ZTSK) S X="""_ROUTINIS_""" X ^%ZOSF(""TEST"") D:$T PAC^"_ROUTINIS_"($T(IXF),.DIFROM)"
 .D SAVE(ROUTINE,"^TMP($J,",0)
 .S STATUS="site tracking installed"
 I OK=2 S STATUS="already installed"
 S LINE1=ROUTINIS_$P(^TMP($J,1,0),ROUTINE,2,99),LINE2=^TMP($J,2,0) K ^TMP($J)
 S ^TMP($J,1,0)=LINE1,^TMP($J,2,0)=LINE2
 F NUM=3:1 S LINE=$P($T(NMSPINIS+NUM),";",3,99) Q:LINE=""  D
 .I LINE["@@@@@@" S LINE=$P(LINE,"@@@@@@")_ROUTINIS_$P(LINE,"@@@@@@",2)
 .S ^TMP($J,NUM,0)=LINE
 D SAVE(ROUTINIS,"^TMP($J,",0)
 S STATUS=STATUS_" -- "_ROUTINIS_" saved"
 K ^TMP($J)
 Q
LOAD(X,DIF,XCNP) X ^DD("OS",DISYS,"LOAD")
 Q
SAVE(X,DIE,XCN) ; VEN/SMH - Modified save code to work on Standalone Fileman
 K ^UTILITY($J,0)
 N I S I=0 F  S I=$O(^TMP($J,I)) Q:'I  S ^UTILITY($J,0,I)=^TMP($J,I,0)
 X ^DD("OS",DISYS,"ZS")
 K ^UTILITY($J,0)
 Q
NMSPINIS ;;
 ;;
 ;;
 ;;PAC(PKG,VER) ; called from package init (DIFROM7 created this routine)
 ;; ; PKG = $T(IXF) of the INIT routine.
 ;; ; VER is an array that is contained in DIFROM from the INIT routine
 ;; ;
 ;; N %,%I,%H,DATE,DIFROM,NOW,PACKAGE,RUN,SERVER,SITE,START,X,XMDUZ,XMSUB,XMTEXT,XMY,Y K ^TMP("@@@@@@",$J)
 ;; ;
 ;; ; Site tracking updates only occur if run in a VA production primary domain
 ;; ; account.
 ;; I $G(^XMB("NETNAME"))'[".VA.GOV" Q
 ;; Q:'$D(^%ZOSF("UCI"))  Q:'$D(^%ZOSF("PROD"))
 ;; X ^%ZOSF("UCI") I Y'=^%ZOSF("PROD") Q
 ;; ;
 ;; S SERVER="S.A5CSTS@FORUM.VA.GOV"
 ;; S PACKAGE=$P($P(PKG,";",3),U)
 ;; S SITE=$G(^XMB("NETNAME"))
 ;; S START=$P($G(^DIC(9.4,VER(0),"PRE")),U,2) I '$L(START) S START="Unknown"
 ;; D  ; check if ok to use kernel functions
 ;; .S X="XLFDT" X ^%ZOSF("TEST") I $T D  Q
 ;; ..S NOW=$$HTFM^XLFDT($H)
 ;; ..S RUN="Unknown" I START S RUN=$$FMDIFF^XLFDT(NOW,START,3)
 ;; ..S START=$$FMTE^XLFDT(START)
 ;; ..S DATE=NOW\1
 ;; ..S NOW=$$FMTE^XLFDT(NOW)
 ;; .D NOW^%DTC S NOW=%,DATE=X
 ;; .S RUN="" ; don't bother to compute
 ;; .S Y=START D DD^%DT S START=Y
 ;; .S Y=NOW D DD^%DT S NOW=Y
 ;; ;
 ;; ; Message for server
 ;; S ^TMP("@@@@@@",$J,1,0)="PACKAGE INSTALL"
 ;; S ^TMP("@@@@@@",$J,2,0)="SITE: "_SITE
 ;; S ^TMP("@@@@@@",$J,3,0)="PACKAGE: "_PACKAGE
 ;; S ^TMP("@@@@@@",$J,4,0)="VERSION: "_VER
 ;; S ^TMP("@@@@@@",$J,5,0)="Start time: "_START
 ;; S ^TMP("@@@@@@",$J,6,0)="Completion time: "_NOW
 ;; S ^TMP("@@@@@@",$J,7,0)="Run time: "_RUN
 ;; S ^TMP("@@@@@@",$J,8,0)="DATE: "_DATE
 ;; ;
 ;; ; Data is sent to server on FORUM - S.A5CSTS
 ;; S XMY(SERVER)="",XMDUZ=.5,XMTEXT="^TMP(""@@@@@@"",$J,",XMSUB=PACKAGE_" VERSION "_VER_" INSTALLATION"
 ;; D ^XMD
 ;; K ^TMP("@@@@@@",$J)
 ;; Q
 ;;

DIFROMH
DIFROMH ;SFISC/XAK-HELP FOR DIFROM ; 31OCT2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;HELP FOR OPTIONS, BULLETINS, ETC.
 W !!?5,"YES means that you want to bring the ",$P(^DIC(DL,0),U)
 W "S in this namespace."
 W !?5,"NO means that you want to leave them out."
 Q:DL'=9.8  W !?5,"This question refers to entries in the ROUTINE documentation file."
 W !!?5,"Also, if you are building a network mail INIT, you must answer",!?5,"YES if you wish to include routines other than just the INIT",!?5,"routines (such as pre and post-inits) into the network mail message."
 Q
R ; HELP FOR PREFIX
 W !!?5,"This is a unique 2 to 4 character prefix beginning with an uppercase"
 W !?5,"letter and followed only by uppercase letters or numbers." Q:X'?1"??".E
 W !?5,"If this is an established package, you may enter one of the prefixes"
 W !?5,"listed in the left column below."
 S DIC="^DIC(9.4,",DIC(0)="QE",DIC("W")="W ?10,$P(^(0),U)",D="C",DILN=15,DZ="??" D DQ^DICQ K DIC,DIZ,DILN Q
 ;
R1 ; HELP FOR RTN NAME
 W !!?5,"Answer YES if you want to create a program called "_DTL_"INIT"
 W:$D(Q) !?5,"even though there already is one on file.  (It will be overwritten.)"
 W !?5,"Answer NO if you don't want to do this." Q
 ;
S ; HELP FOR SECURITY CODES
 W !!?5,"YES means you want to include the security protection currently"
 W !?5,"on the files in the initialization routines.  A recipient of"
 W !?5,"this package will be able to decide whether or not to accept"
 W !?5,"these codes."
 W !?5,"NO means you do not want to include security codes."
 Q
M ; HELP FOR MAX RTN SIZE
 W !!?5,"Enter the maximum number of characters each routine should"
 W !?5,"contain.  This number must be between 2000 and "_^DD("ROU")_"." ; VEN/SMH V22.2
 Q
 ;
MSG ; HELP FOR MAILMAN MESSAGE
 W !!?5,"YES means that you are going to send this Package over"
 W !?5,"the Network as a message."
 W !?5,"NO means that you are going to generate routines."
 Q
Q1 ; HELP FOR SCRAMBLE PASSWORD
 W !?5,"The scramble password is a private code, which must be "
 W !?5,"exactly correct for a reader to to see the message legibly"
 W !?5,"It may be from 3 to 20 characters long.  Upper and lower"
 W !?5,"case characters are treated as the same.",! Q
 ;
Q3 ; HELP FOR SCRAMBLE HINT
 W !?5,"A scramble hint is used to suggest to the reader what"
 W !?5,"the scramble password is.  Since the password is not"
 W !?5,"recoverable after it is entered, the hint can be a "
 W !?5,"helpful reminder to the reader of the message.  The"
 W !?5,"hint will be shown to the recipient just before he "
 W !?5,"is asked to enter the password.",! Q
R3 ;DATA DICTIONARIES
 W !!?5,"Enter YES if you wish to transport dictionaries"
 W !?5,"or NO if you just want to Transport Options, Keys, etc."
 Q
NOPKG ; TEMPLATES WITH NON-PACKAGE FILE PREFIX
 W !!?5,"If YES, then ALL of the templates and forms belonging to the files"
 W !?5,"selected will be included in the initialization routines."
 W !?5,"If NO, only NAMESPACED templates and forms will be included.",!
 Q

DIFROMH1
DIFROMH1 ;SFISC/XAK-HELP FOR ANSWERING DIFROM PROMPTS ;03:15 PM  28 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
REP ;CHANGING YOUR FILE NAME
 W !!?5,"If YES, this will change the existing file name"
 W !?5,"to the incoming file name."
 W !?5,"If NO, it then will go on to the next Question.",!
 Q
CHG ;KEEPING YOUR OLD DATA
 W !!?5,"This allows you to keep your old data if you wish."
 W !?5,"I suggest if you get to this"
 W !?5,"question Just Default to the Question.",!
 Q
TEMP ;DELETING THE TEMPLATES
 W !!,"This will allow you to Delete or Keep the"
 W !,"(Sort,Print,Input) Templates if you wish.",!
 Q
AG ;DELETING FILES THAT ARE THE SAME
 W !!?5,"Enter Yes if you wish to Delete your file"
 W !?5,"This will overwrite your file with my file"
 W !?5,"If you wish to save your file please say"
 W !?5,"NO.  It will then Quit the INIT Process.",!
 Q
PKG ;ACCEPT DEFAULT DEFINITION
 W !!?5,"YES means that the information currently in the Package"
 W !?5,"File will be used to generate the package.  You will not be"
 W !?5,"to alter it."
 W !?5,"NO means that you will be able to define the package as you"
 W !?5,"proceed with the DIFROM."
 Q
L ;DISPLAY CURRENT PKG DEFN
 N %A W ! D WAIT^DICD
 S DIC=9.4,L=0,BY="@NUMBER",FR=DPK,TO=DPK,FLDS="[DI-PKG-DEFAULT-DEFINITION]",IOP="HOME" D EN1^DIP
 K B,P,DP,DIJ,%9
 Q
CUR ;HELP FOR SEEING PACKAGE
 W !!?5,"YES means that the package definition will be displayed to"
 W !?5,"you on your current device."
 W !?5,"NO means that you will continue generating the package.",!
 Q
DD ;HELP FOR OVERWRITING DD'S
 W !!?5,"YES means that the current data definitions will be overwritten"
 W !?5,"with the ones in these routines."
 W !?5,"NO means that only new data fields will be added."
 Q
DTA ;HELP FOR ADDING DATA
 W !!?5,"YES means that the data coming in with these inits will"
 I DIF W !?5,"replace the data on file if a match is found."
 E  W !?5,"only be added if there is no data on file."
 W !!?5,"Entries will be added if they do not match exactly"
 W !?5,"on Name and Identifiers."
 W !!?5,"NO means that everything will be left as is."
 Q
VER ;HELP FOR VERSION NO.
 W !!?5,"Package Version No. must be entered to put onto the second"
 W !?5,"line of the INIT routines."
 W !!?5,"Format can be either the old type of version no. nnn.nn",!,?5,"or the new type, nnnXnn where X is either T for test phase",!?5,"or V for verification phase." Q
PNM ;HELP FOR PACKAGE NAME
 W !!?5,"Enter the Package Name to go on the second line of the INIT routines." Q
VDT ;HELP FOR VERSION DATE
 W !!?5,"Enter the Distribution Date for this Package, to go on the second",!?5,"line of the INIT routines.  It should match the version date",!?5,"on the other routines being sent with this package." Q

DIFROMS
DIFROMS ;SFISC/DCL-DIFROM SERVER DD/DATA IN/OUT ;09:47 AM  19 Jan 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
DDOUT(DIFRFILE,DIFRFLG,DIFRFIA,DIFRTA,DIFRMSGR) ; DD OUT TO TARGET ARRAY
 ;FILE,FLAGS,FIA_ARRAY,TARGET_ARRAY,MSG_ROOT
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(@DIFRTA@("FIA"))
 D EN^DIFROMS1
 G EXIT
 Q
DDIN(DIFRFILE,DIFRFLG,DIFRFIA,DIFRSA,DIFRMSGR) ; DD IN FROM SOURCE ARRAY
 ;FILE,FLAGS,FIA_ARRAY,SOURCE_ARRAY,MSG_ROOT
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(@DIFRSA@("FIA"))
 N DIOVRD S DIOVRD=1
 D EN^DIFROMS2
 G EXIT
 Q
DATAOUT(DIFRFILE,DIFRFLG,DIFRFIA,DIFRTA,DIFRMSGR) ; DATA OUT
 ;FILE,FLAGS,FIA_ROOT,TARGET_ARRAY_ROOT,MSG_ROOT
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(@DIFRTA@("FIA"))
 N DIFRERRC
 D EN^DIFROMS3
 I $G(DIFRERRC) S DIERR=DIFRERRC
 G EXIT
 Q
DATAIN(DIFRFILE,DIFRFLG,DIFRFIA,DIFRSA,DIFRMSGR) ; DATA IN
 ;FILE,FLAGS,FIAROOT,SOURCE_ARRAY,MSG_ROOT
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(@DIFRSA@("FIA"))
 N DIOVRD S DIOVRD=1
 D EN^DIFROMS4
 G EXIT
 Q
 ;
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q

DIFROMS1
DIFROMS1 ;SFISC/DCL/TKW-MOVE DD TO TARGET ARRAY ;17APR2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
EN ;
 I '$D(@DIFRFIA) D ERR(1) Q
 G:$G(DIFRFILE) FCHK
 S DIFRFILE=0 F  S DIFRFILE=$O(@DIFRFIA@(DIFRFILE)) Q:DIFRFILE'>0  D FILE
 Q
FCHK I '$D(@DIFRFIA@(DIFRFILE)) D ERR(2) Q
FILE N DSEC,DIFRD,DIFRX,DIFR01,DIFRFDD
 N DIFRQ,DIFRTART,DIFRK,R,R1,R2,R3,C,F,G,I,DIFRPFD
 S DIFR01=$G(@DIFRFIA@(DIFRFILE,0,1))
 S DIFRFDD=$TR($P(DIFR01,"^",3),"FP","fp")'="p"
 S DSEC=$TR($P(DIFR01,"^",2),"y","Y")="Y"
 S DIFRPFD=@DIFRFIA@(DIFRFILE,DIFRFILE)=0
 I DIFRFDD!DIFRPFD D
 .M @DIFRTA@("^DIC",DIFRFILE,DIFRFILE,"%")=^DIC(DIFRFILE,"%")
 .M @DIFRTA@("^DIC",DIFRFILE,DIFRFILE,"%D")=^DIC(DIFRFILE,"%D")
 .S @DIFRTA@("^DIC",DIFRFILE,DIFRFILE,0)=$P(^DIC(DIFRFILE,0),"^",1,2)
 .S @DIFRTA@("^DIC",DIFRFILE,DIFRFILE,0,"GL")=^DIC(DIFRFILE,0,"GL")
 .S @DIFRTA@("^DIC",DIFRFILE,"B",$E(@DIFRFIA@(DIFRFILE),1,30),DIFRFILE)=""
 .Q
 I DSEC,(DIFRFDD!(DIFRPFD)) D
 .D XY^%RCR("^DIC("_DIFRFILE_",0,",$$OREF^DILF($NA(@DIFRTA@("SEC","^DIC",DIFRFILE,DIFRFILE,0))))
 .K @DIFRTA@("SEC","^DIC",DIFRFILE,DIFRFILE,0,"GL")
 .Q
 S DIFRD=0
 ;              * * Go through each DD and sub-DD * *
 F  S DIFRD=$O(@DIFRFIA@(DIFRFILE,DIFRD)) Q:DIFRD'>0  S DIFRPFD=^(DIFRD)=0 D
 .S DIFRX=0
 .;         * * Merge each field DD to transport structure * *
 .;F  S DIFRX=$O(^DD(DIFRD,DIFRX)) Q:DIFRX'>0  I $D(@DIFRFIA@(DIFRFILE,DIFRD))<9!($D(@DIFRFIA@(DIFRFILE,DIFRD,DIFRX))) D
 .F  S DIFRX=$O(^DD(DIFRD,DIFRX)) Q:DIFRX'>0  I DIFRPFD!($D(@DIFRFIA@(DIFRFILE,DIFRD,DIFRX))) D
 ..M @DIFRTA@("^DD",DIFRFILE,DIFRD,DIFRX)=^DD(DIFRD,DIFRX)
 ..N SEC F SEC=8,8.5,9 I $D(^DD(DIFRD,DIFRX,SEC)) D:SEC=8  I SEC>8,^(SEC)'="^",$P(^(0),"^",2)'["K",^(SEC)'="@" D
 ...I DSEC S @DIFRTA@("SEC","^DD",DIFRFILE,DIFRD,DIFRX,SEC)=^DD(DIFRD,DIFRX,SEC)
 ...K @DIFRTA@("^DD",DIFRFILE,DIFRD,DIFRX,SEC)
 ...Q
 ..; If multiple field sent, send ^DD(SUBFILE#,0) and ^("NM",multiple name) for partial DDs
 ..I 'DIFRPFD D
 ...N SUBNUM S SUBNUM=$$SUBNUM(DIFRD,DIFRX)
 ...I 'SUBNUM Q
 ...S @DIFRTA@("^DD",DIFRFILE,SUBNUM,0)=^DD(SUBNUM,0)
 ...S @DIFRTA@("^DD",DIFRFILE,SUBNUM,0,"NM",$O(^DD(SUBNUM,0,"NM","")))=""
 ...Q
 ..Q
 .;                * * Clean up x-refs in DDs * *
 .S DIFRQ=$NA(@DIFRTA@("^DD",DIFRFILE,DIFRD))
 .S DIFRTART=$$OREF^DILF(DIFRQ)
 .F  S DIFRQ=$Q(@DIFRQ) Q:$P(DIFRQ,DIFRTART)]""!(DIFRQ="")  D:$P(DIFRQ,DIFRTART,2,99)[""""
 ..S DIFRK=1
 ..S R2=$P(DIFRQ,DIFRTART,2,99),$E(R2,$L(R2))="",C=$L(R2,","),F=1,R1=0
 ..F I=1:1 Q:I'<C  S G=$P(R2,",",F,I) Q:G=""  I G'[""""!($L(G,"""")#2&($E(G)="""")&($E(G,$L(G))="""")) S F=F+$L(G,","),I=F-1,R1=R1+1,C=C+($L(G,",")-1) I 'G,G'?1"0".E,R1#2 S DIFRK=DIFRTART_$P(R2,",",1,I)_")" Q
 ..Q:DIFRK
 ..K @DIFRK
 ..Q
 .;           * * Build DD 0 node after x-ref clean up * *
 .;               for full DD or full sub-DD
 .I DIFRFDD!(DIFRPFD) D
 ..M @DIFRTA@("^DD",DIFRFILE,DIFRD,0)=^DD(DIFRD,0)
 ..K @DIFRTA@("^DD",DIFRFILE,DIFRD,0,"VR")
 ..Q
 .Q
IXKEY ; Send entries from KEY and INDEX file
 S DIFRD=0
 F  S DIFRD=$O(@DIFRFIA@(DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 . I $O(^DD("IX","B",DIFRD,0)) D DDIXOUT^DIFROMSX(DIFRFILE,DIFRD,DIFRFDD,DIFRTA)
 . I $O(^DD("KEY","B",DIFRD,0)) D DDKEYOUT^DIFROMSY(DIFRFILE,DIFRD,DIFRTA)
 . Q
 Q
 ;
 Q
SUBNUM(F,FD) ;
 ;Returns 0 if FielD in File is not multiple, otherwise subfile#.
 N SUBNUM S SUBNUM=+$P($G(^DD(F,FD,0)),U,2)
 I 'SUBNUM Q 0
 I $P($G(^DD(SUBNUM,.01,0)),U,2)["W" Q 0
 Q SUBNUM
 ;
ERR(X) D BLD^DIALOG($P($T(ERR+X),";",5)) Q
 ;;FIA Array Does Not Exist;1;9501
 ;;FIA File Number Invalid;2;9502

DIFROMS2
DIFROMS2 ;SFISC/DCL/TKW-INSTALL DD FROM SOURCE ARRAY ;12MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 Q
EN ;
 I '$D(@DIFRSA) D ERR(5) Q
 I '$D(@DIFRFIA) D ERR(4) Q
 G:$G(DIFRFILE) FCHK
 S DIFRFILE=0 F  S DIFRFILE=$O(@DIFRFIA@(DIFRFILE)) Q:DIFRFILE'>0  D FILE ;LOOP THRU ALL INCOMING TOP-LEVEL FILES
 Q
FCHK I '$D(@DIFRFIA@(DIFRFILE)) D ERR(6) Q
FILE ;
 N DIFR01,DIFR02,DIFRVR,DIFRFDD
 S DIFR01=$G(@DIFRFIA@(DIFRFILE,0,1)),DIFR02=$G(^(2))
 I $TR($E(DIFR01),"NY","ny")="n" D ERR(1) Q
 S DIFRFDD=$TR($P(DIFR01,"^",3),"FP","fp")'="p" ;DIFRFDD=0 means PARTIAL DEFINITION
 I 'DIFRFDD,'$D(^DIC(DIFRFILE)) D ERR(7) Q
 I $D(^DIC(DIFRFILE,0)),$G(@DIFRFIA@(DIFRFILE,0,10))]"" X ^(10) I '$T D ERR(3) Q
 ;I $TR($E(@DIFRFIA@(DIFRFILE,0,5)),"NY","ny")="y",$D(^DIC(DIFRFILE)) D ERR(2) Q  ;INSTALL ONLY IF NEW * * PHASING OUT * *
 N %1,DSEC,D,DA,DIC,DIK,DIFRD,DIFRDATA,DIFRFLD,DIFRDIC,DIFRGL,DIFRX,I,X,Y,Z
 S DSEC=$P(DIFR02,"^") ; **>> add file security if new file only <<**
 I 'DSEC,'$D(^DIC(DIFRFILE,0))#2 S DSEC=1 ; Check to see if the file was Deleted during Pre-Install
 ;delete DD wp text for file, field and x-ref description and field tech description
 ;also delete "NM" nodes when installing full DD at specified level
 I 'DIFRFDD D
 .K @DIFRSA@("DIFRNI",DIFRFILE)
 .N DIFRD
 .S DIFRD=DIFRFILE
 .F  S DIFRD=$O(@DIFRFIA@(DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 ..Q:$$UP(DIFRSA,DIFRFILE,DIFRD)  ;abort DIFRD subfile if we can't see its parent
 ..S @DIFRSA@("DIFRNI",DIFRFILE,DIFRD)=""
 ..N DIFRNGF,DIFRNGFD
 ..S DIFRNGF=+$G(@DIFRSA@("UP",DIFRFILE,DIFRD,-1))
 ..S DIFRNGFD=.01 F  S DIFRNGFD=$O(@DIFRSA@("^DD",DIFRFILE,DIFRNGF,DIFRNGFD)) Q:DIFRNGFD=""  Q:+$P($G(^(DIFRNGFD,0)),U,2)=DIFRD
 ..I DIFRNGFD'="" K @DIFRSA@("^DD",DIFRFILE,DIFRNGF,DIFRNGFD)
 ..Q
 .Q
 K:DIFRFDD ^DIC(DIFRFILE,"%D")
 S DIFRD=0
 F  S DIFRD=$O(@DIFRSA@("^DD",DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 .I 'DIFRFDD,$D(@DIFRSA@("DIFRNI",DIFRFILE,DIFRD)) Q
 .K:$D(@DIFRSA@("^DD",DIFRFILE,DIFRD,0,"NM"))\10 ^DD(DIFRD,0,"NM")
 .S DIFRFLD=0
 .F  S DIFRFLD=$O(@DIFRSA@("^DD",DIFRFILE,DIFRD,DIFRFLD)) Q:DIFRFLD'>0  D
 ..K ^DD(DIFRD,DIFRFLD,21),^(23)
 ..S DIFRX=0
 ..F  S DIFRX=$O(@DIFRSA@("^DD",DIFRFILE,DIFRD,DIFRFLD,1,DIFRX)) Q:DIFRX'>0  D
 ...K ^DD(DIFRD,DIFRFLD,1,DIFRX,"%D")
 ...Q
 ..Q
 .Q
 I DIFRFDD F DIFRX="^DIC","^DD" D
 .;I DIFRX="^DIC",'DIFRFDD Q
 .N X
 .I DIFRX="^DIC",$G(^DIC(DIFRFILE,0))]"" S X=$P(^(0),"^",3,9)
 .M @DIFRX=@DIFRSA@(DIFRX,DIFRFILE)
 .I DIFRX="^DIC",$G(X)]"" S $P(^DIC(DIFRFILE,0),"^",3,9)=X
 .I DSEC,$D(@DIFRSA@("SEC",DIFRX,DIFRFILE)) M @DIFRX=@DIFRSA@("SEC",DIFRX,DIFRFILE)
 .Q
 I 'DIFRFDD D
 .N DIFRD
 .S DIFRD=0
 .F  S DIFRD=$O(@DIFRSA@("^DD",DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 ..I $D(@DIFRSA@("DIFRNI",DIFRFILE,DIFRD)) Q  ;ABORT
 ..M ^DD(DIFRD)=@DIFRSA@("^DD",DIFRFILE,DIFRD) ;HERE IS WHERE A WHOLE DD COMES OVER!
SETUP ..I $G(@DIFRSA@("UP",DIFRFILE,DIFRD,-1)) S ^DD(DIFRD,0,"UP")=+^(-1) ;SET THE "UP" NODE, SINCE IT SEEMS NOT TO BE SENT WITH THE REST OF THE ^DD
 ..I DSEC,$D(@DIFRSA@("SEC","^DD",DIFRFILE,DIFRD)) M ^DD(DIFRD)=@DIFRSA@("SEC","^DD",DIFRFILE,DIFRD)
 ..Q
 .Q
 S DIFRD=0 F  S DIFRD=$O(@DIFRFIA@(DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 .I 'DIFRFDD,$D(@DIFRSA@("DIFRNI",DIFRFILE,DIFRD)) Q
 .S D=DIFRD,DIK="A" F  S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 .S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 .I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," D IXALL^DIK
 .Q
 I 'DIFRFDD D  G IXKEY
 .Q:'$D(@DIFRSA@("^DD",DIFRFILE,DIFRFILE,.01))
 .S $P(@(^DIC(DIFRFILE,0,"GL")_"0)"),"^",2)=$$HDR2P^DIFROMSS(DIFRFILE)
 .Q
 S DIFRGL=^DIC(DIFRFILE,0,"GL"),DIFRDIC=$P(^DIC(DIFRFILE,0),U,1,2)
 S $P(DIFRDIC,"^",2)=@DIFRFIA@(DIFRFILE,0,0)
 I DIFRFDD,+$G(@DIFRFIA@(DIFRFILE,0,"VR")) S DIFRVR=^("VR") D
 .S ^DD(DIFRFILE,0,"VR")=$P(DIFRVR,"^")
 .S ^DD(DIFRFILE,0,"VRPK")=$P(DIFRVR,"^",2)
 .Q
 S DIFRDATA=$D(@(DIFRGL_"0)")),^(0)=DIFRDIC_"^"_$S(DIFRDATA#2:$P(^(0),"^",3,9),1:"^")
 ;
IXKEY ; Bring INDEX and KEY entries
 K ^TMP("DIFROMS2",$J,"TRIG")
 S DIFRD=0
 F  S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA)
 K ^TMP("DIFROMS2",$J,"TRIG")
 S DIFRD=0
 F  S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA)
 ;
DIKZ I $D(^DD(DIFRFILE,0,"DIK")) D
 .N %X,DIKJ,DIR,DMAX,X,Y,DIFRDIKA
 .D EN2^DIKZ(DIFRFILE,"",^DD(DIFRFILE,0,"DIK"),^DD("ROU"),"DIFRDIKA")
 .I $D(DIFRDIKA) M @DIFRSA@("DIKZ",DIFRFILE)=DIFRDIKA
 .S @DIFRSA@("DIKZ",DIFRFILE)=^DD(DIFRFILE,0,"DIK")
 .Q
 I 'DIFRFDD,$D(@DIFRSA@("DIFRNI",DIFRFILE)) D
 .N DIFRD
 .S DIFRD=0
 .F  S DIFRD=$O(@DIFRSA@("DIFRNI",DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 ..N DIFRERR S DIFRERR(1)=DIFRD
 ..D BLD^DIALOG(9512,.DIFRERR) ;"parent DD(s) missing"
 ..Q
 .Q
 Q
 ;
UP(ROOT,FILE,DDN) ;Return 1 or 0 to install
 Q:FILE=DDN 1
 Q:$D(^DD(DDN)) 1
 Q:'$D(@ROOT@("UP",FILE,DDN)) 1
 N MP,PARENT,T,X
 S MP=0,X="",T=0
 F  S X=$O(@ROOT@("UP",FILE,DDN,X)) Q:X=""  S PARENT=+^(X) D  Q:T!(MP)
 .I $D(^DD(PARENT))!$D(@ROOT@("FIA",FILE,PARENT)) S:X>-2 T=1 Q  ;***GFT
 .S MP=1
 .Q
 Q T
 ;
ERR(X) D BLD^DIALOG($P($T(ERR+X),";",5)) Q
 ;;FIA Node Is Set To "No DD Update";1;9503
 ;;Already Exist On Target System (INSTALL ONLY IF NEW);2;9504
 ;;Did Not Pass DD Screen;3;9505
 ;;FIA Array Does Not Exist;4;9511
 ;;Distribution Array Does Not Exist;5;9506
 ;;FIA File Number Invalid;6;9507
 ;;Partial DD/File Does Not Already Exist On Target System;7;9508

DIFROMS3
DIFROMS3 ;SFISC/DCL,TKW- DATA TO DISTRIBUTION ARRAY ;5/14/98  12:30
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
EN ;
 I '$D(@DIFRFIA) D ERR(2) Q
 G:$G(DIFRFILE) FILE
 S DIFRFILE=0 F  S DIFRFILE=$O(@DIFRFIA@(DIFRFILE)) Q:DIFRFILE'>0  D FILE
 Q
FCHK I '$D(@DIFRFIA@(DIFRFILE)) D ERR(5) Q  ;  * * * * PHASING OUT * * * *
FILE N DIFRS,DIFRSCR,DIFRDA,DIFROOT,DIFRRLR,DIFR01,DIFRPR,DIFRDNSC,DIFRFRV,DIFRFRVX
 N DIFRQ,DIFRTART,DIFRK,R,R1,R2,R3,C,F,G,I,DIFR2DD,DIFRNODE,DIFRFELD,DIFRPCE,DIFRIENS,DIFRDD0
 S DIFR01=$G(@DIFRFIA@(DIFRFILE,0,1)),DIFRPR=$TR($P(DIFR01,"^",5),"Y","y")="y"
 I $TR($P(DIFR01,"^",7),"Y","y")'="y" Q
 I DIFRPR D PGL^DIFROMSP(DIFRFILE,"",DIFRTA)
 S DIFRS=$G(@DIFRFIA@(DIFRFILE,0,11))]"",DIFRSCR=$G(^(11))
 S DIFROOT=$NA(@($$ROOT^DILFD(DIFRFILE,"",1))),DIFRDA=0  ;$NA/trans gbl $Q
 S DIFRRLR=$G(@DIFRFIA@(DIFRFILE,0,"RLRO"))
 S:DIFRRLR="" DIFRRLR=DIFROOT
 I $D(@DIFRRLR)'>9 D ERR(4) Q
 N Y
 F  S DIFRDA=$O(@DIFRRLR@(DIFRDA)) Q:DIFRDA'>0  D
 .I '$D(@DIFROOT@(DIFRDA,0)) D  Q
 ..N DIFRERR S DIFRERR(1)=DIFRDA,DIFRERR(2)=DIFRFILE
 ..D BLD^DIALOG(9513,.DIFRERR)
 ..Q
 .I DIFRS,$D(@DIFRRLR@(DIFRDA,0)) S Y=DIFRDA X DIFRSCR Q:'$T  ;set *NAKED* and *Y*
 .M @DIFRTA@("DATA",DIFRFILE,DIFRDA)=@DIFROOT@(DIFRDA)
 .Q
 S DIFRQ=$NA(@DIFRTA@("DATA",DIFRFILE))  ;$NA/trans gbl/$Q
 S DIFRTART=$$OREF^DILF(DIFRQ)
 F  S DIFRQ=$Q(@DIFRQ) Q:$P(DIFRQ,DIFRTART)]""!(DIFRQ="")  D:$P(DIFRQ,DIFRTART,2,99)[""""!(DIFRPR)
 .K R1
 .S DIFRK=1
 .S R2=$P(DIFRQ,DIFRTART,2,99),$E(R2,$L(R2))="",C=$L(R2,","),F=1,R1=0
 .F I=1:1 Q:I>C  S G=$P(R2,",",F,I) Q:G=""  I G'[""""!($L(G,"""")#2&($E(G)="""")&($E(G,$L(G))="""")) S F=F+$L(G,","),I=F-1,R1(R1)=G,R1=R1+1,C=C+($L(G,",")-1) I 'G,G'?1"0".E,R1#2 S DIFRK=DIFRTART_$P(R2,",",1,I)_")" Q
 .I DIFRPR,DIFRK,'(R1#2) D  Q  ;RESOLVE POINTERS
 ..D  Q:DIFR2DD'>0
 ...I R1'>3 S DIFR2DD=DIFRFILE Q
 ...S R3=""
 ...F I=0:1:R1-3 S R3=R3_R1(I)_","
 ...S DIFR2DD=+$P($G(@(DIFRTART_R3_"0)")),"^",2)
 ...Q
 ..S DIFRNODE=R1($O(R1(""),-1)),DIFRDNSC=R2
 ..Q:'$D(@DIFRTA@("PGL",DIFR2DD,DIFRNODE))
 ..S DIFRPCE=0
 ..F  S DIFRPCE=$O(@DIFRTA@("PGL",DIFR2DD,DIFRNODE,DIFRPCE)) Q:DIFRPCE=""  D:DIFRPCE>0
 ...Q:$P(@DIFRQ,"^",DIFRPCE)=""
 ...S DIFRFELD=$O(@DIFRTA@("PGL",DIFR2DD,DIFRNODE,DIFRPCE,"")),(I,DIFRIENS)=""
 ...;CREATE IENS * * * * * * * * * * * * * * * * *
 ...F  S I=$O(R1(I),-1) Q:I=""  S:'(I#2) DIFRIENS=DIFRIENS_R1(I)_","
 ...S DIFRDD0=^DD(DIFR2DD,DIFRFELD,0)
 ...D DIERR
 ...S DIFRFRV=$$GET1^DIQ(DIFR2DD,DIFRIENS,DIFRFELD)
 ...D DIERR
 ...I DIFRFRV']"" D  Q
 ....N DIFRERR
 ....S DIFRERR(1)=DIFR2DD,DIFRERR(2)=DIFRIENS,DIFRERR(3)=DIFRFELD
 ....D BLD^DIALOG(9514,.DIFRERR)
 ....D DIERR
 ....Q
 ...S DIFRFRVX="FRV1"
 ...; If .01 field on file level is a pointer use "FRV0" subscript
 ...;I R1'>3,DIFRPCE=1,DIFRNODE=0 S DIFRFRVX="FRV0"
 ...S @DIFRTA@(DIFRFRVX,DIFRFILE,DIFRDNSC,DIFRPCE)=DIFRFRV
 ...S @DIFRTA@(DIFRFRVX,DIFRFILE,DIFRDNSC,DIFRPCE,"F")=$S($P(DIFRDD0,"^",2)["P":";"_$P(DIFRDD0,"^",3),$P(DIFRDD0,"^",2)["V":"1;"_$P($P(@DIFRQ,"^",DIFRPCE),";",2),1:"")
 ...D KEYVAL
 ...Q
 ..Q
 ..;Q:IF HEADER NODE OR IF NOT DATA NODE THEN FIND DD AND CHECK
 ..;  IF DD#,"PGL",DATA NODE EXIST IF SO GET PIECE AND FIELD
 ..;  AND SET IT UP INTO A STRUCTURE ; ALL RESOLVED; .01,IDs AND PTR.
 ..;IT WAS DECIDED NOT TO RESOLVE .01 AND ID POINTERS
 ..Q
 .Q:DIFRK
 .K @DIFRK
 .Q
 Q
 ;
KEYVAL ; Send KEY values if pointed-to file has a primary KEY
 N DIFL S DIFL=$P(DIFRDD0,"^",2)
 I DIFL["P" S DIFL=+$P(DIFL,"P",2)
 E  D
 . S DIFL=$P($P(@DIFRQ,"^",DIFRPCE),";",2)
 . S DIFL=+$P($G(@("^"_DIFL_"0)")),"^",2) Q
 Q:'DIFL
 N DIKEY S DIKEY=$O(^DD("KEY","AP",DIFL,"P",0)) Q:'DIKEY
 N X,DIOUT S DIOUT=0 D  Q:DIOUT
 . S X=$P(^DD("KEY",DIKEY,0),U,4) I 'X S DIOUT=1 Q
 . S X=$P($G(^DD("IX",X,0)),U,2) I X="" S DIOUT=1 Q
 . S @DIFRTA@("FRV1K",DIFRFILE,DIFRDNSC,DIFRPCE)=X Q
 N DIFLD,DIVAL,DIPTR,DIER,DIERR,DIFLDDA,DISEQ
 S DIPTR=+$P(@DIFRQ,"^",DIFRPCE),DIFLDDA=0,DIOUT=0
 F  S DIFLDDA=$O(^DD("KEY",DIKEY,2,DIFLDDA)) Q:'DIFLDDA  S X=$G(^(DIFLDDA,0)) D  Q:DIOUT
 . S DIFLD=$P(X,U),DISEQ=$P(X,U,3) I 'DISEQ S DIOUT=1 Q
 . I $P(X,U,2)'=DIFL S DIOUT=1 Q
 . I DIFLD=.01 S DIVAL=DIFRFRV
 . E  S DIVAL=$$GET1^DIQ(DIFL,DIPTR_",",DIFLD,"","","DIER")
 . I $D(DIER) K DIER S DIOUT=1 Q
 . S @DIFRTA@("FRV1K",DIFRFILE,DIFRDNSC,DIFRPCE,DISEQ)=DIVAL
 . Q
 I DIOUT K @DIFRTA@("FRV1K",DIFRFILE,DIFRDNSC,DIFRPCE)
 Q
 ;
DIERR I $G(DIERR) S DIFRERRC=$$ERRC($G(DIFRERRC),DIERR) K DIERR
 Q
 ;
ERRC(X,Y) ;
 S X=$G(X),Y=$G(Y)
 S $P(X,"^")=+X+Y,$P(X,"^",2)=$P(X,"^",2)+$P(Y,"^",2)
 Q X
 ;
ERR(X) N Y S Y=$P($T(ERR+X),";",5) Q:'Y  D BLD^DIALOG(Y) Q
 ;;FIA Node Is Set To "No Data";1;9509
 ;;FIA Array Does Not Exist;2;9501
 ;;;3;
 ;;Records Do Not Exist;4;9510
 ;;FIA File Number Invalid;5;9502

DIFROMS4
DIFROMS4 ;SFISC/DCL- DATA FROM DISTRIBUTION ARRAY ;5/24/00  15:22
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
EN ;
 I '$D(@DIFRFIA) D ERR(2) Q
 ;N DIFRFILP S DIFRFILP=$D(DIFRFILP)#2
 N %,%H,A,B,D,D0,D1,DA,DDF,DDT,DFL,DFN,DFR,DIC,DIFL,DIIX,DIK,DINUM,DIU
 N DKP,DMRG,DTL,DTN,DTO,I,V,W,X,Y,Z
 G:$G(DIFRFILE) FILE
 S DIFRFILE=0 F  S DIFRFILE=$O(@DIFRFIA@(DIFRFILE)) Q:DIFRFILE'>0  D FILE
 Q
FCHK I '$D(@DIFRFIA@(DIFRFILE)) D ERR(5) Q  ;  * * * PHASING OUT * * *
FILE N DIFRDA,DIFRND0,DIFROOT,DIFR01,DIFR02,DIFRRLR,DIFRFRV
 N DIFRDKP,DIFRDKPD,DIFRDKPR,DIFRDKPS
 D KILL
 I '$D(@DIFRFIA) D ERR(2) Q
 I $G(@DIFRFIA@(DIFRFILE,DIFRFILE)) D  Q
 .N DIFRERR S DIFRERR(1)=DIFRFILE
 .D BLD^DIALOG(9515,.DIFRERR)
 .Q
 S DIFROOT=@DIFRFIA@(DIFRFILE,0),DIFRDA=0
 S DIFR01=@DIFRFIA@(DIFRFILE,0,1),DIFR02=$G(^(2))
 I $P(DIFR02,"^",8)="" S $P(DIFR02,"^",8)=$$TL^DIFROMSP(DIFRFILE,"",DIFRSA)
 S DIFRRLR=$G(@DIFRFIA@(DIFRFILE,0,"RLRI"))  ;  * * * phasing out * * *
 S:DIFRRLR="" DIFRRLR=$NA(@DIFRSA@("DATA",DIFRFILE))
 I $D(@DIFRRLR)'>9 D ERR(4) Q
 ;
 ;   Recover from a failure in Replace Mode RE-INSTALL on target system
 I $D(@DIFRSA@("TMP")) D  K @DIFRSA@("TMP")
 .S (D,DDF(1),DDT(0))=DIFRFILE
 .S DTO=0,DMRG=1,DTO(0)=DIFROOT,DKP=$S($TR($P(DIFR01,"^",8),"O","o")="o":0,1:1)
 .S DFR(1)=$$OREF^DILF(DIFRSA)_"""TMP"",DIFRFILE,D0,"
 .S D0=$O(@DIFRSA@("TMP",DIFRFILE,0)) Q:'$D(^(D0,0))  S Z=^(0)
 .D I^DITR,REINDEX
 .D KILL Q
 ;
 F  S DIFRDA=$O(@DIFRRLR@(DIFRDA)) Q:DIFRDA'>0  D
 .S (D,DDF(1),DDT(0))=DIFRFILE
 .S DTO=0,DMRG=1,DTO(0)=DIFROOT
 .S DFR(1)=$$OREF^DILF($NA(@DIFRSA@("DATA")))_"DDF(1),D0,"
 .S DKP=$S($TR($P(DIFR01,"^",8),"O","o")="o":0,1:1)
 .S (DIFRDKPD,DIFRDKPR)=$S($TR($P(DIFR01,"^",8),"R","r")="r":1,1:0)
 .S (DIFRND0,DIFRDKP)=0
 .S:+DIFR02 (DIFRDKPD,DIFRDKPR)=0  ;if file is new Replace not needed
 .S DIFRDKPS=$P(DIFR02,"^",8)  ;save local data
 .S DIFRFRV=$TR($P(DIFR01,"^",5),"Y","y")="y"
 .S D0=DIFRDA,Z=@DIFRSA@("DATA",DIFRFILE,DIFRDA,0)
 .K @DIFRSA@("TMP")
 .D I^DITR,REINDEX
 .;        If no data in local fields, quit.
 .I $D(@DIFRSA@("TMP"))'>9 D KILL Q
 .;           restore data in local fields from old entry
 .S DIFRDKP=1,DIFRFRV=0
 .K DFR,DA,D0
 .;S DFR(1)="^TMP(""DIFRDKPD"",$J,DIFRFILE,D0,"
 .S DFR(1)=$$OREF^DILF(DIFRSA)_"""TMP"",DIFRFILE,D0,"
 .S D0=$O(@DIFRSA@("TMP",DIFRFILE,0)) Q:'$D(^(D0,0))  S Z=^(0)
 .D I^DITR,REINDEX,KILL
 .Q
 K @DIFRSA@("TMP")
 ; DO A CHECK HERE LIKE Q:'$D(DIFQ) LATER ON
 Q
 ;
KILL K %,%H,A,B,D,D0,D1,DA,DDF,DDT,DFL,DFN,DFR,DIC,DIFL,DIIX,DIK,DINUM,DIU
 K DKP,DMRG,DTL,DTN,DTO,I,V,W,X,Y,Z Q
 ;
REINDEX ; REINDEX ENTRY
 Q:DIFRND0'>0
 N DIK,DA S DA=DIFRND0,DIK=DIFROOT,DIK(0)="AB"
 D IX1^DIK Q
 ;
ERR(X) N Y S Y=$P($T(ERR+X),";",5) Q:'Y  D BLD^DIALOG(Y) Q
 ;;FIA Node Is Set To "No Data";1;9509
 ;;FIA Array Does Not Exist;2;9501
 ;;;3;
 ;;Records Do Not Exist;4;9510
 ;;FIA File Number Invalid;5;9502
 ;;Partial DD.  No sending of data allowed for file |1|;1;9515

DIFROMS5
DIFROMS5 ;SCISC/DCL-DIFROM SERVER PROCESS TEMPLATES OUT ;5APR2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;
EDEOUT ;EXTENDED DATABASE ELEMENTS OUT
 N DIFRDSV,DIFRF,DIFRGBL,DIFRSEC,DIFRTRT
 I $G(DIFRIEN)>0 G EDE
 N DIFRIENX,DIFRIENZ
 S DIFRIENX=$O(@DIFRLST@(0)),DIFRIENZ=$D(@DIFRLST@(DIFRIENX,0))#2,DIFRIENX=0
 F  S DIFRIENX=$O(@DIFRLST@(DIFRIENX)) Q:DIFRIENX'>0  D
 .I DIFRIENZ S DIFRIEN=+@DIFRLST@(DIFRIENX,0) S:DIFRIEN'>0 DIFRIEN=DIFRIENX D EDE Q
 .S DIFRIEN=+@DIFRLST@(DIFRIENX) S:DIFRIEN'>0 DIFRIEN=DIFRIENX D EDE Q
 Q
EDE ;
 ;  DIFRTRT=FULL ROOT IN DIST ARRAY
 ;  DIFRDSV=0TH NODE OF TEMPLATE
 ;         :.401, .4, .402
 ;         :TEMPL NAME^DATE CREATED^READ^FILENR^DUZ^WRITE^DATE LAST USED
 ;         :.403
 ;         :FORM NAME^READ^WRITE^DUZ^DATE CREATED^DATA LAST USED^^FILE^
 ;         :.84
 ;         :DIALOG NUMBER^TYPE^INTERNAL PARM^PACKAGE FILE (pointer)
 ;  DIFRSEC=FILE SECURITY 1=EXPORT SECURITY,0=NO FILE SECURITY
 ;  DIFRIEN=TEMPLATE'S INTERNAL ENTRY NUMBER
 ;         :.5 (FUNCTIONS)
 S DIFRTRT=$NA(@DIFRTA@(DIFRFILE,DIFRIEN))
 S DIFRGBL=$$ROOT^DILFD(DIFRFILE,"",1)
 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 ;
 ; For stand alone FileMan only - KIDS will do the Merge
 ; v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
 ;
 I $G(DIFRSTNA) S DIFRGBL=$$ROOT^DILFD(DIFRFILE,"",1) M @DIFRTRT=@DIFRGBL@(DIFRIEN)
 ;
 ; ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 I DIFRFILE=.5 Q  ;no processing necessary
 S DIFRDSV=$G(@DIFRTRT@(0)),DIFRF=$P(DIFRDSV,U,$S(DIFRFILE=.403:8,1:4))
 I DIFRDSV="" D  Q
 .N DIFRERR S DIFRERR(1)=DIFRFNAM,DIFRERR(2)=DIFRIEN
 .D BLD^DIALOG(9516,.DIFRERR)
 .Q
 I DIFRFILE=.84 G DIALOG
 S DIFRSEC=DIFRFLG'["S"
 I DIFRFILE=.403 G T403
 Q:'$D(@DIFRTRT@(0))  K ^("RD"),^("AB") K:DIFRFILE=.401 ^(1)
 S $P(@DIFRTRT@(0),U,5)="" S:'DIFRSEC ^(0)=$P(DIFRDSV,U,1,2)_U_U_DIFRF_U_U_U_U_$P(DIFRDSV,U,8,9)
 Q
 ;
T403 ;PROCESS FORMS AND EACH BLOCK IT CONTAINES
 S $P(DIFRDSV,U,4)="",$P(DIFRDSV,U,6)="" S:'DIFRSEC $P(DIFRDSV,U,2,3)=U
 S @DIFRTRT@(0)=DIFRDSV
 D T404
 K @DIFRTRT@("AY"),@DIFRTRT@(40,"B"),^("C")
 N X
 S X=0
 F  S X=$O(@DIFRTRT@(40,X)) Q:X'>0  K @DIFRTRT@(40,X,40,"AC"),^("B")
 Q
 ;
T404 ;PROCESS BLOCKS
 ;    :.404
 ;    :BLOCK NAME^
 N DIFR1,DIFR2,D1,D2
 S D1=0
 F  S D1=$O(@DIFRTRT@(40,D1)) Q:'D1  I $D(^(D1,0)) S DIFR1=+$P(^(0),U,2) D
 .I $D(^DIST(.404,DIFR1,0)) D
 ..S $P(@DIFRTRT@(40,D1,0),U,2)=$P(^DIST(.404,DIFR1,0),U) ;SEND PAGE'S HEADER BLOCK NAME, instead of NUMBER POINTER
 ..M @DIFRTA@(.404,DIFR1)=^DIST(.404,DIFR1)
 ..K @DIFRTA@(.404,DIFR1,40,"B"),^("C"),^("D")
 ..Q
 .S D2=0
 .F  S D2=$O(@DIFRTRT@(40,D1,40,D2)) Q:'D2  I $D(^(D2,0)) S DIFR2=+^(0) D
 ..I $D(^DIST(.404,DIFR2)) D
 ...S $P(@DIFRTRT@(40,D1,40,D2,0),U)=$P(^DIST(.404,DIFR2,0),U) ;SEND THE BLOCK NAME, instead of NUMBER POINTER
 ...M @DIFRTA@(.404,DIFR2)=^DIST(.404,DIFR2)
 ...K @DIFRTA@(.404,DIFR2,40,"B"),^("C"),^("D")
 ...Q
 ..Q
 .Q
 Q
 ;
DIALOG ;
 Q:'$D(@DIFRTRT@(0))  K ^(3,"B") K @DIFRTRT@(4,"B") ;GFT -- USED TO KILL ^(4) SO TRANSLATIONS WOULD NOT BE TRANSPORTED!
 Q:$G(DIFRF)'>0
 S:DIFRF DIFRF=$P($G(^DIC(9.4,DIFRF,0)),"^"),$P(@DIFRTRT@(0),"^",4)=DIFRF
 Q

DIFROMS6
DIFROMS6 ;SCISC/DCL-DIFROM SERVER PROCESS TEMPLATES IN;03:07 PM  25 Mar 1994;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;
EDEIN ;EXTENDED DATABASE ELEMENTS IN
 N DIFRDSV,DIFRF,DIFRGBL,DIFRSEC,DIFRTRT
 I $G(DIFRIEN)>0 G EDE
 N DIFRIENX,DIFRIENZ
 S DIFRIENX=$O(@DIFRLST@(0)),DIFRIENZ=$D(@DIFRLST@(DIFRIENX,0))#2,DIFRIENX=0
 F  S DIFRIENX=$O(@DIFRLST@(DIFRIENX)) Q:DIFRIENX'>0  D
 .I DIFRIENZ S DIFRIEN=+@DIFRLST@(DIFRIENX,0) S:DIFRIEN'>0 DIFRIEN=DIFRIENX D EDE Q
 .S DIFRIEN=+@DIFRLST@(DIFRIENX) S:DIFRIEN'>0 DIFRIEN=DIFRIENX D EDE Q
 Q
EDE ;
 ;  DIFRTRT=FULL ROOT IN DIST ARRAY
 ;  DIFRDSV=0TH NODE OF TEMPLATE
 ;         :.401, .4, .402
 ;         :TEMPL NAME^DATE CREATED^READ^FILENR^DUZ^WRITE^DATE LAST USED
 ;         :.403
 ;         :FORM NAME^READ^WRITE^DUZ^DATE CREATED^DATA LAST USED^^FILE^
 ;  DIFRSEC=FILE SECURITY 1=EXPORT SECURITY,0=NO FILE SECURITY
 ;  DIFRIEN=TEMPLATE'S INTERNAL ENTRY NUMBER
 ;         :.5 (FUNCTIONS)
 S DIFRTRT=$NA(@DIFRTA@(DIFRFILE,DIFRIEN))
 ;
ERR(X,Y) ;
 S X(1)=X D BLD^DIALOG(Y,.X)
 Q

DIFROMSB
DIFROMSB ;SCISC/DCL-SILENT DIFROM/INSTALL BLOCKS ;08:35 AM  22 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
BLKSIN(DIFRNAME,DIFRFLG,DIFRSA,DIFRMSGR) ;
 ;PACKAGE_NAME,FLAGS,SOURCE_ROOT,MSG_ROOT
 ;*
 ;PACKAGE_NAME=Package Name
 ;    (Required if Source Root is not passed) - Identifies the
 ;                 unique key subscript in the transport structure.
 ;*
 ;FLAGS=O
 ;    (Optional) - "O"=use Old calls (DIC)
 ;*
 ;SOURCE_ROOT=Source Array Root
 ;    (Optional) - Closed array reference which contain all the
 ;                 Blocks that are to be installed.
 ;    (Note) - Required if Package_Name is not passed.
 ;*
 ;MSG_ROOT=Closed Root for Error Messages
 ;    (Optional) - Array where messages such as errors will be
 ;                 returned.  If not passed, decendents of the ^TMP
 ;                 will be used.
 ;*
 I $G(DIFRNAME)=""&($G(DIFRSA))="" D ERR("PACKAGE NAME/SOUCE ROOT") Q
 N DIFRFILE,DIFRDA,DIFROLD,DIFRX,DIFRY,DIC,DA,DLAYGO,X,Y
 S DIFRFILE=.404,DIFRDA=0
 I $G(DIFRSA)="" S DIFRSA=$NA(^XTMP("XPDI",DIFRNAME,"KRN"))
 S DIFROLD=$G(DIFRFLG)["O"
 I DIFROLD S DLAYGO=DIFRFILE,DIC="^DIST(.404,",DIC(0)="LX" D  Q
 .F  S DIFRDA=$O(@DIFRSA@(.404,DIFRDA)) Q:DIFRDA'>0  S DIFRX=^(DIFRDA,0) D
 ..S X=$P(DIFRX,"^"),DIFRFL=$P(DIFRX,"^",2)
 ..K DA
 ..D ^DIC
 ..I Y>0 S DIFRY=Y D DELADD Q
 ..N DIFRERR S DIFRERR(1)=$P(DIFRX,"^")
 ..D BLD^DIALOG(9517,.DIFRERR)
 ..Q
 ; CODE FOR NEW CALLS                                           <<<***
 G EXIT
 Q
DELADD ;
 K ^DIST(.404,+DIFRY),DA,DIK
 M ^DIST(.404,+DIFRY)=@DIFRSA@(.404,DIFRDA)
 S DIK="^DIST(.404,",DA=+DIFRY
 D IX1^DIK
 I '$D(DD(+DIFRFL)) D
 .N DIFRERR S DIFRERR(1)=$P(DIFRX,"^"),DIFRERR(2)=DIFRFL
 .D BLD^DIALOG(9518,.DIFRERR)
 .Q
 Q
 ;
ERR(X) S X(1)=X D BLD^DIALOG(202,.X)
 Q
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q

DIFROMSC
DIFROMSC ;SCISC/DCL-EDE IN CONTINUE FPRE & FPOST ;08:38 AM  22 Nov 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FPRE ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 N DIOVRD S DIOVRD=1
 S DIFRFILE=$G(DIFRFILE) S:DIFRFILE'>0 DIFRFILE=$G(XPDFIL)
 I DIFRFILE'>0 D BLD^DIALOG(9519) Q
 Q:DIFRFILE'=.403
 I $G(DIFRNAME)="" D BLD^DIALOG(9520) Q
 I $G(DIFRSA)="" S DIFRSA=$NA(^XTMP("XPDI",DIFRNAME,"KRN"))
 I DIFRFILE=.403 D  Q
 .N DIC,DIK,DIFRR,DIFRFILE,DIFRL,DIFRX,X,Y
 .S DIC="^DIST(.404,",DIC(0)="LX",DLAYGO=.404,DIFRFILE=.404
 .S DIFRR=0
 .F  S DIFRR=$O(@DIFRSA@(DIFRFILE,DIFRR)) Q:DIFRR'>0  S DIFRX=^(DIFRR,0) D
 ..S DIFRL=$P(DIFRX,"^",2)
 ..S X=$P(DIFRX,"^")
 ..K DA
 ..D ^DIC
 ..I Y'>0 D  Q
 ...N DIFRERR S DIFRERR(1)=$P(DIFRX,"^")
 ...D BLD^DIALOG(9517,.DIFRERR)
 ...Q
 ..K ^DIST(.404,+Y)
 ..I '$D(^DD(+DIFRL)) D
 ...N DIFRERR S DIFRERR(1)=$P(DIFRX,"^"),DIFRERR(2)=DIFRL
 ...D BLD^DIALOG(9518,.DIFRERR)
 ...Q
 ..M ^DIST(.404,+Y)=@DIFRSA@(DIFRFILE,DIFRR)
 ..S DIK=DIC,DA=+Y
 ..D IX1^DIK
 ..Q
 .Q
 Q
FPOST ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 N DIOVRD S DIOVRD=1
 Q
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q

DIFROMSD
DIFROMSD ;SFISC/DCL-DIFROM SERVER DD LIST(KIDS/BUILD FILE) ;16JAN2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
DD(DIFRFILE,DIFRFLG,DIFRTA) ;FILENUMBER, TARGET ARRAY ROOT FOR SUB DD NRS
 ;FILE, FLAGS, TARGET ARRAY
 ;FILE = File number
 ;FLAG = "W"  Include Word Processing DD numbers
 ;DIFRTA = Target Array in closed array root format where informaiton
 ;         is returned.
 ;         Returns a list of sub DD numbers.  A flag allows wp DD
 ;         numbers to also be returned.
 N DIFRFD,DIFRFE,DIFRFW,DIFRNM,DIFRX
 S DIFRFW=$G(DIFRFLG)'["W"
F S @DIFRTA@(DIFRFILE,DIFRFILE)=$O(^DD(DIFRFILE,0,"NM",""))_"  "_$S($D(^DIC(DIFRFILE,0)):"(File-top level)",1:"(sub-file)"),DIFRFE=0
E F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  D
 .S DIFRFD=0
 .F  S DIFRFD=$O(^DD(DIFRFE,"SB",DIFRFD)) Q:DIFRFD'>0  D
 ..I DIFRFW,$P($G(^DD(DIFRFD,.01,0)),"^",2)["W" Q
 ..I DIFRFILE-DIFRFE!'$D(DIFRFA) S @DIFRTA@(DIFRFILE,DIFRFD)=$O(^DD(DIFRFD,0,"NM",""))_"  (sub-file)"
 ..Q
 .Q
 Q
 ;
DDIOLDD(DIFRFILE,DIFRFLG) ;
 ;FILE,FLAGS
 ;FILE = File number
 ;FLAGS = None
 ;        Returns a list of all the valid DD numbers within a file
 ;        via a call to DDIOL.
 N I,X,Y
 K ^TMP("DIFROMSP",$J)
 D DD(DIFRFILE,"","^TMP(""DIFROMSP"",$J)")
 S (I,X)=0 F  S I=$O(^TMP("DIFROMSP",$J,DIFRFILE,I)) Q:I'>0  S Y=^(I),X=X+1,^TMP("DIFROMSP",$J,"DDIOL",X,0)=I_$J("",(20-$L(I)))_Y
 D EN^DDIOL("","^TMP(""DIFROMSP"",$J,""DDIOL"")")
 K ^TMP("DIFROMSP",$J)
 Q
 ;
CHKDD(DIFRFILE,DIFRDD,DIFRFLG) ;    $$    EXTRINSIC FUNCTION    $$
 ;Extrinsic; Pass file and DD numbers returns 1 if OK
 ; and 0 if not DD not part of File
 ;FILE,DD#
 ;FILE = File number
 ;DD# = File or sub-file number.
 ;      Used to determine if
 ;      the value in DD# is valid for FILE.
 ;FLAGS = "N"umber_"^"_"N"ame of field returned
 ;        Default returns a 1 (true) or 0 (false).
 Q:$G(DIFRDD)="" 0
 Q:$G(DIFRFILE)="" 0
 N DIFRARAY,N
 S N=$G(DIFRFLG)["N"
 D DD(DIFRFILE,"","DIFRARAY")
 I $D(DIFRARAY(DIFRFILE,DIFRDD)) Q:N DIFRDD_"^"_DIFRARAY(DIFRFILE,DIFRDD) Q 1
 Q 0
 ;
DDIOLFLD(DIFRDD,DIFRFLG) ;
 ;FILE/SUB_FILE,FLAGS
 ;FILE = File or sub-file number
 ;FLAGS = "M"ultiple fields excluded
 ;        "W"ord processing fields excluded
 ;        Returns a list of  valid field numbers within a file or
 ;        sub-file via a call to DDIOL.
 N I,M,W,X,Y,Z
 S M=$G(DIFRFLG)["M",W=$G(DIFRFLG)["W"
 K ^TMP("DIFROMSP",$J)
 S (I,X)=0 F  S X=$O(^DD(DIFRDD,X)) Q:X'>0  S Y=$G(^(X,0)) D
 .I $P(Y,"^",2) D  Q:Y=""
 ..S Z=$P(^DD(+$P(Y,"^",2),.01,0),"^",2)
 ..I M,Z'["W" S Y="" Q
 ..I W,Z["W" S Y="" Q
 ..S $P(Y,"^")=$P(Y,"^")_$S(Z["W":"  (word-processing)",1:"  (multiple)")
 ..Q
 .S I=I+1,^TMP("DIFROMSP",$J,I,0)=X_$J("",(12-$L(X)))_$P(Y,"^")
 D EN^DDIOL("","^TMP(""DIFROMSP"",$J)")
 K ^TMP("DIFROMSP",$J)
 Q
 ;
FLDCHK(DIFRDD,DIFRFLD,DIFRFLG) ;     $$    EXTRINSIC FUNCTION     $$
 ;Check if field exist; return 1/FIELD#_NAME, true, or 0, false.
 ;FILE/SUB_FILE,FIELD,FLAGS
 ;FILE/SUB_FILE = File or sub-file number
 ;FIELD = Field number
 ;        If FIELD is valid, returns 1; Otherwise 0 is returned.
 ;FLAGS = "M"ultiple fields excluded
 ;        "W"ord processing fields excluded
 ;        "N"umber_"^"_"N"ame of field returned.
 ;         Default is to return 1 or 0.
 ;
 Q:$G(DIFRDD)="" 0
 Q:$G(DIFRFLD)="" 0
 N M,N,W,Z
 S M=$G(DIFRFLG)["M",W=$G(DIFRFLG)["W",N=$G(DIFRFLG)["N"
 I $P($G(^DD(DIFRDD,DIFRFLD,0)),"^",2) S Z=$P(^DD(+$P(^(0),"^",2),.01,0),"^",2) D  Q:N $S(Z:DIFRFLD_"^"_$P(^DD(DIFRDD,DIFRFLD,0),"^"),1:Z) Q Z
 .I M,Z'["W" S Z=0 Q
 .I W,Z["W" S Z=0 Q
 .S Z=1
 .Q
 I $D(^DD(DIFRDD,DIFRFLD,0))#2 Q:N DIFRFLD_"^"_$P(^(0),"^") Q 1
 Q 0

DIFROMSE
DIFROMSE ;SFISC/DCL-FILE ORDER TO RESOLVE POINTERS ;07:27 AM  2 Jun 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;File Order List for Resolving Pointers
FOLRP(DIFRFLG,DIFRTA) ;FLAGS,TARGET_ARRAY ; Creates the "DIORD" subscript
 ;                structure in the transport array.
 ;FLAGS,TARGET_ARRAY
 ;*
 ;FLAGS = None
 ;*
 ;TARGET_ARRAY = CLOSED ROOT
 ;               This is the Transport Array Root.
 ;               "DIORD" is appended to the array root.
 ;               A ordered list of files is returned
 ;               in the target array.  Each file is given
 ;               a value to determine which file should have
 ;               pointers resolved.  After each file has been
 ;               assigned a value it is ordered by value then
 ;               by file number.  If files have the same value
 ;               the file number is then used to determine the
 ;               order.  This call is used after all the file
 ;               being transported are in the "FIA" structure.
 ;*
 Q:$G(DIFRTA)']""
 N DIFRCNT,DIFRDD,DIFRF,DIFRFILE,DIFRFLD,DIFRX
 S DIFRFILE=0
 K ^TMP("DIFROMSE",$J),^TMP("DIFRORD",$J),^TMP("DIFRFILE",$J),@DIFRTA@("DIORD")
 F  S DIFRFILE=$O(@DIFRTA@("FIA",DIFRFILE)) Q:DIFRFILE'>0  D
 .D FSF^DIFROMSP(DIFRFILE,"","^TMP(""DIFROMSE"",$J)")
 .Q
 S DIFRFILE=0
 F  S DIFRFILE=$O(^TMP("DIFROMSE",$J,DIFRFILE)) Q:DIFRFILE'>0  D
 .S DIFRDD=0,^TMP("DIFRORD",$J,DIFRFILE)=0
 .F  S DIFRDD=$O(^TMP("DIFROMSE",$J,DIFRFILE,DIFRDD)) Q:DIFRDD'>0  D
 ..S DIFRFLD=0
 ..F  S DIFRFLD=$O(^DD(DIFRDD,DIFRFLD)) Q:DIFRFLD'>0  S DIFRX=$G(^(DIFRFLD,0)) D
 ...Q:$P(DIFRX,"^",2)
 ...Q:$P(DIFRX,"^",2)'["P"&($P(DIFRX,"^")'["V")
 ...S DIFRCNT=0
 ...I $P(DIFRX,"^",2)["V" D  G P
 ....S DIFRF=0 F  S DIFRF=$O(^DD(DIFRDD,DIFRFLD,"V","B",DIFRF)) Q:DIFRF'>0  S ^TMP("DIFRFILE",$J,DIFRF)=DIFRCNT+1
 ....Q
 ...I +$P(@("^"_$P(DIFRX,"^",3)_"0)"),"^",2)=DIFRFILE S:$G(^TMP("DIFRORD",$J,DIFRFILE))'>DIFRCNT ^(DIFRFILE)=DIFRCNT Q
 ...I $P(DIFRX,"^",2)["P" S ^TMP("DIFRFILE",$J,+$P(@("^"_$P(DIFRX,"^",3)_"0)"),"^",2))=DIFRCNT+1
P ...S DIFRF=$O(^TMP("DIFRFILE",$J,"")) Q:DIFRF=""  S DIFRCNT=^(DIFRF) K ^(DIFRF)
 ...I $G(^TMP("DIFRORD",$J,DIFRF))'>DIFRCNT S ^(DIFRF)=DIFRCNT
 ...S DIFRX=^DD(DIFRF,.01,0)
 ...I $P(DIFRX,"^",2)["P" S ^TMP("DIFRFILE",$J,+$P(@("^"_$P(DIFRX,"^",3)_"0)"),"^",2))=DIFRCNT+1 G P
 ...G:$P(DIFRX,"^",2)'["V" P
 ...S DIFRF=0 F  S DIFRF=$O(^DD(DIFRDD,DIFRFLD,"V","B",DIFRF)) Q:DIFRF'>0  S ^TMP("DIFRFILE",$J,DIFRF)=DIFRCNT
 ...S DIFRCNT=DIFRCNT+1
 ...G P
 ...Q
 ..Q
 .Q
 S DIFRFILE=0
 F  S DIFRFILE=$O(^TMP("DIFRORD",$J,DIFRFILE)) Q:DIFRFILE'>0  S DIFRX=^(DIFRFILE),^TMP("DIFRORD",$J,"DIORD",DIFRX,DIFRFILE)=""
 S DIFRX="",DIFRCNT=1 F  S DIFRX=$O(^TMP("DIFRORD",$J,"DIORD",DIFRX),-1) Q:DIFRX=""  D
 .S DIFRFILE=0 F  S DIFRFILE=$O(^TMP("DIFRORD",$J,"DIORD",DIFRX,DIFRFILE)) Q:DIFRFILE'>0  D
 ..S @DIFRTA@("DIORD",DIFRCNT)=DIFRFILE,DIFRCNT=DIFRCNT+1
 D KILL
 Q
KILL ;
 K ^TMP("DIFROMSE",$J),^TMP("DIFRORD",$J),^TMP("DIFRFILE",$J)
 Q
 ;
CHK(DIFRFLG,DIFRSA,DIFRTA) ;CHECK FILES POINTED TO AGAINST FILES GOING OUT WITH DATA
 ;Compares the "DIORD" with the "FIA" structures
 ;FLAGS,SOURCE_ARRAY,TARGET_ARRAY
 ;*
 ;FLAGS = None
 ;*
 ;SOURCE_ARRAY = TRANSPORT ARRAY ROOT
 ;*
 ;TARGET_ARRAY = TARGET ARRAY ROOT
 ;               Returns a list of files that are pointed to
 ;               but not being exported.  This is used after
 ;               all the files being exported are in the "FIA"
 ;               structure.
 ;*
 Q:$G(DIFRSA)']""
 Q:$G(DIFRTA)']""
 N DIFRX,DIFRFILE
 S DIFRX=0
 F  S DIFRX=$O(@DIFRSA@("DIORD",DIFRX)) Q:DIFRX'>0  S DIFRFILE=^(DIFRX) D
 .Q:$D(@DIFRSA@("DATA",DIFRFILE))&($P($G(@DIFRSA@("FIA",DIFRFILE,0,1)),"^",5)="y")
 .S @DIFRTA@(DIFRFILE)=""
 .Q
 Q

DIFROMSF
DIFROMSF ;SCISC/DCL-SILENT DIFROM EXTENDED DATABASE FILES;08:41 AM  22 Nov 1994;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;
 ; * EXTENDED DATABASE ELEMENTS (EDE) *
EDEOUT(DIFRIEN,DIFRNAME,DIFRFLG,DIFRFIA,DIFRTA,DIFRLST,DIFRMSGR) ;
 ;ENTRY,PKGNAME,FLAGS,FIA_ARRAY,TARGET_ARRAY,LIST_ARRAY,MSG_ROOT
 I $G(DIFRNAME)']"" D ERR("PACKAGE NAME") Q
 N DIFRFILE
 S DIFRFILE=$S(DIFRFLG="F":.403,DIFRFLG="I":.402,DIFRFLG="P":.4,DIFRFLG="S":.401,DIFRFLG="$":.5,1:"")
 I DIFRFILE'>0 D ERR("FLAG") Q
 I $G(DIFRTA)="" S DIFRTA=$NA(^XTMP("XPDT",DIFRNAME,"KRN"))
 ;
 ;              >*>*>*> c h e c k   h e r e <*<*<*<
 ;
 S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(@DIFRTA@("FIA"))
 I $G(DIFRIEN)'>0&($G(DIFRLST)="") D ERR("NO IENs PASSED") Q
 I $G(DIFRIEN)'>0,$D(@DIFRLST)'>9 D ERR("LIST DOES NOT CONTAIN IENs") Q
 D EDEOUT^DIFROMS5
 G EXIT
 ;
EDEIN ; * EXTENDED DATABASE ELEMENTS *
 Q
FPRE(DIFRFILE,DIFRNAME,DIFRSA) ; FILE-PRE
 K ^TMP("DIFROMS",$J)
 ;FILENUMBER,SUBSCRIPT_NAME(package name for KIDS),SOURCE_ARRAY
 S DIFRFILE=$G(DIFRFILE) S:DIFRFILE'>0 DIFRFILE=$G(XPDFIL)
 I DIFRFILE'>0 D ERR("FILE NUMBER") Q
 Q:DIFRFILE'=.403
 I $G(DIFRNAME)="" D ERR("SUBSCRIPT NAME") Q
 I $G(DIFRSA)="" S DIFRSA=$NA(^XTMP("XPDT",DIFRNAME,"KRN"))
 I DIFRFILE=.403 D  Q  ;If Forms bring in Blocks
 .N DIC,DIFRR,DIFRFILE,DIFRL,DIFRX,X,Y
 .S DIC="^DIST(.404,",DIC(0)="LX",DLAYGO=.404,DIFRFILE=.404
 .S DIFRR=0
 .F  S DIFRR=$O(@DIFRSA@(DIFRFILE,DIFRR)) Q:DIFRR'>0  S DIFRX=^(DIFRR,0) D
 ..S DIFRL=$P(DIFRX,"^",2)
 ..S X=$P(DIFRX,"^")
 ..K DA
 ..D ^DIC
 ..I Y'>0 D ERR("UNABLE TO ADD "_$P(DIFRX,"^")_" BLOCK") Q
 ..K ^DIST(.404,+Y)
 ..I '$D(^DD(+DIFRL)) D ERR("BLOCK: "_$P(DIFRX,"^")_" installed but associated file "_DIFRL_" missing")
 ..M ^DIST(.404,+Y)=@DIFRSA@(DIFRFILE,DIFRR)
 ..S DIK=DIC,DA=+Y
 ..D IX1^DIK
 ..Q
 .Q
 Q
 ;
EPRE(DIFRFILE,DIFRIEN,DIFROIEN,DIFRNAME,DIFRSA) ; ENTRY-PRE
 ;FILENUM,NEW_ENTRY_NUM,OLD_ENTRY_NUM,PKG/SUBSCRIPT_NAME,SOURCE_ARRAY
 ; Entry Pre - delete template on target system
 N DIFRRDA,DIFRX,DIFRF
 S DIFRFILE=$G(DIFRFILE) S:DIFRFILE'>0 DIFRFILE=$G(XPDFIL)
 I DIFRFILE'>0 D ERR("FILE NUMBER") Q
 S DIFRIEN=$G(DIFRIEN) S:DIFRIEN'>0 DIFRIEN=$G(DA)
 I DIFRIEN'>0 D ERR("ENTRY NUMBER") Q
 S DIFROIEN=$G(DIFROIEN) S:DIFROIEN'>0 DIFROIEN=$G(OLDA)
 I DIFRIEN'>0 D ERR("OLD ENTRY NUMBER") Q
 I $G(DIFRNAME)="" D ERR("PACKAGE/SUBSCRIPT NAME MISSING") Q  ;GET VARIABLE FROM RON
 I $G(DIFRSA)="" S DIFRSA=$NA(^XTMP("XPDT",DIFRNAME,"KRN"))
 ; build file root with entry number and kill entry on target system
 S DIFRRDA=$$CREF^DIQGU($$ROOT^DIQGU(DIFRFILE)_DIFRIEN)
 S DIFRX=$P(@DIFRRDA@(0),"^")
 S DIFRF=$S(DIFRFILE=.4:"DIPT",DIFRFILE=.402:"DIE",DIFRFILE=.401:"DIBT",DIFRFILE=.403:"DIST(.403,",DIFRFILE=.404:"DIST(.404,",1:"FUN")
 S ^TMP("DIFROMS",$J,DIFRF,DIFRX)=DIFRIEN
 K @DIFRRDA
 I DIFRFILE=.403 D  ;If Forms resolve Block Pointers
 .N DIFRA0,DIFRA1,DIFRA2,DIFRJ,DIFRL,DIFRP,DIFRX,DIFRY
 .S DIFRJ=0
 .F  S DIFRJ=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ)) Q:'DIFRJ  I $D(^(DIFRJ,0)) S DIFRP=$P(^(0),"^",2) D
 ..S:DIFRP]"" DIFRP=$O(^DIST(.404,"B",DIFRP,0))
 ..S:DIFRP $P(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,0),"^",2)=DIFRP
 ..S DIFRL=0
 ..F  S DIFRL=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,DIFRL)) Q:'DIFRL  S DIFRA0=$G(^(DIFRL,0)),DIFRP=$P(DIFRA0,"^") I DIFRP]"" D
 ...S DIFRP=$O(^DIST(.404,"B",DIFRP,0)) I DIFRP D
 ....S $P(DIFRA0,"^")=DIFRP,@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK",DIFRP,0)=DIFRA0
 ....Q
 ...Q
 ..S DIFRA0=$G(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,0))
 ..Q:DIFRA0=""
 ..K @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40)
 ..S (DIFRA1,DIFRA2)=0
 ..S DIFRL=0
 ..F  S DIFRL=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK",DIFRL)) Q:'DIFRL  S @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,DIFRL,0)=^(DIFRL,0),DIFRA1=DIFRL,DIFRA2=DIFRA2+1
 ..S $P(DIFRA0,"^",3,4)=DIFRA1_"^"_DIFRA2
 ..S @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,0)=DIFRA0
 ..K @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK")
 ..Q
 .Q
 Q
EPOST ; ENTRY-POST
 Q
FPOST ; FILE-POST      RECOMPILE TEMPLATES
 N DIFR,DIFR1,DIFR2,DMAX,X,Y
 K DIC,DLAYGO
 F DIFR="DIE","DIPT" D
 .I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 .E  S DISYS=^DD("OS")
 .Q:'$D(^DD("OS",DISYS,"ZS"))
 .S DIFR1=""
DZ1 .S DIFR1=$O(^TMP("DIFROMS",$J,DIFR,DIFR1)) Q:DIFR1=""
 .F DIFR2=0:0 S DIFR2=$O(^TMP("DIFROMS",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  D
 ..S Y=DIFR2
 ..I $D(@("^"_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD") D
 ...S DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 ...Q
 ..Q
 .G DZ1
 K ^TMP("DIFROMS",$J)
 Q
INITCHK ; check
 ;
 ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 Q
 ;
ERR(X) S X(1)=X D BLD^DIALOG(1700,.X)
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q

DIFROMSI
DIFROMSI ;SCISC/DCL-EDE IN ;3:19 PM  16 Nov 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FPRE(DIFRFILE,DIFRFLG,DIFRNAME,DIFRSA) ;
 G FPRE^DIFROMSC
EPRE(DIFRFILE,DIFRIEN,DIFRFLG,DIFRNAME,DIFRSA,DIFROIEN) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 N DIOVRD S DIOVRD=1
 N DIFRRDA,DIFRX
 S DIFRFILE=$G(DIFRFILE) S:DIFRFILE'>0 DIFRFILE=$G(XPDFIL)
 I DIFRFILE'>0 D BLD^DIALOG(9521) Q
 S DIFRIEN=$G(DIFRIEN) S:DIFRIEN'>0 DIFRIEN=$G(DA)
 I DIFRIEN'>0 D BLD^DIALOG(9522) Q
 S DIFROIEN=$G(DIFROIEN) S:DIFROIEN'>0 DIFROIEN=$G(OLDA)
 I DIFROIEN'>0 D BLD^DIALOG(9523) Q
 I $G(DIFRNAME)="" D BLD^DIALOG(9524) Q
 I $G(DIFRSA)="" S DIFRSA=$NA(^XTMP("XPDI",DIFRNAME,"KRN"))
 S DIFRRDA=$$CREF^DIQGU($$ROOT^DIQGU(DIFRFILE)_DIFRIEN)
 S DIFRX=$P(@DIFRRDA@(0),"^")
 G:DIFRFILE=.84 DIALOG
 ;
 ; preserve security codes if template/form is not new
 I $G(DIFRFLG)'["N",DIFRFILE'=.5 D
 .N X,Y
 .S Y=@DIFRRDA@(0)
 .S X=@DIFRSA@(DIFRFILE,DIFROIEN,0),$P(X,U,3)=$P(Y,U,3),$P(X,U,6)=$P(Y,U,6),^(0)=X
 .Q
 ;
 I DIFRFILE'=.403 K @DIFRRDA
 E  D
 .Q:$G(DIFRFLG)["N"
 .N DA,DIC,DIK,DINUM,X,Y,DO
 .S DIK="^DIST(.403,",DA=DIFRIEN
 .D ^DIK
 .S DIC="^DIST(.403,",DIC(0)="LX",X=DIFRX,DINUM=DIFRIEN
 .D FILE^DICN
 .Q
 I DIFRFILE=.403 D
 .N DIFRA0,DIFRA1,DIFRA2,DIFRJ,DIFRL,DIFRP,DIFRX,DIFRY
 .S DIFRJ=0
 .F  S DIFRJ=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ)) Q:'DIFRJ  I $D(^(DIFRJ,0)) S DIFRP=$P(^(0),"^",2) D
 ..S:DIFRP]"" DIFRP=$O(^DIST(.404,"B",DIFRP,0))
 ..S:DIFRP $P(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,0),"^",2)=DIFRP
 ..S DIFRL=0
 ..F  S DIFRL=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,DIFRL)) Q:'DIFRL  S DIFRA0=$G(^(DIFRL,0)),DIFRP=$P(DIFRA0,"^") I DIFRP]"" D
 ...S DIFRP=$O(^DIST(.404,"B",DIFRP,0)) I DIFRP D
 ....S $P(DIFRA0,"^")=DIFRP,@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK",DIFRP,0)=DIFRA0
 ....N DIFRX
 ....S DIFRX=0
 ....F  S DIFRX=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,DIFRL,DIFRX)) Q:DIFRX=""  S @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK",DIFRP,DIFRX)=^(DIFRX)
 ....Q
 ...Q
 ..S DIFRA0=$G(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,0))
 ..Q:DIFRA0=""
 ..K @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40)
 ..S (DIFRA1,DIFRA2)=0
 ..S DIFRL=0
 ..F  S DIFRL=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK",DIFRL)) Q:'DIFRL  S @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,DIFRL,0)=^(DIFRL,0),DIFRA1=DIFRL,DIFRA2=DIFRA2+1 D
 ...N DIFRX
 ...S DIFRX=0
 ...F  S DIFRX=$O(@DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK",DIFRL,DIFRX)) Q:DIFRX=""  S @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,DIFRL,DIFRX)=^(DIFRX)
 ...Q
 ..S $P(DIFRA0,"^",3,4)=DIFRA1_"^"_DIFRA2
 ..S @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,40,0)=DIFRA0
 ..K @DIFRSA@(DIFRFILE,DIFROIEN,40,DIFRJ,"BLK")
 ..Q
 .Q
 Q
DIALOG N DIFRF,DIFRX
 S DIFRF=$P(@DIFRSA@(DIFRFILE,DIFROIEN,0),"^",4)
 I DIFRF]"" D
 .S DIFRF=$O(^DIC(9.4,"B",DIFRF,0)) I DIFRF,$O(^(DIFRF)) D  S DIFRF=""
 ..N DIFRERR S DIFRERR(1)=DIFRF,DIFRERR(2)=DIFRIEN
 ..D BLD^DIALOG(9525,.DIFRERR)
 ..Q
 .S $P(@DIFRSA@(DIFRFILE,DIFROIEN,0),"^",4)=DIFRF
 F DIFRX=1,2,3,5,6 K @DIFRRDA@(DIFRX)
 Q
EPOST(DIFRFILE,DIFRIEN,DIFRFLG,DIFRNAME,DIFRSA) ;
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 N DIOVRD S DIOVRD=1
 I '$G(DIFRFILE)!('$G(DIFRIEN)) Q
 I $G(DIFRNAME)="" Q
 S:$G(DIFRSA)']"" DIFRSA=$NA(^XTMP("XPDI",DIFRNAME))
 N DA,DIFR,DIFR3,DIFROU,DIK,DMAX,DNM,X,Y,Z,DIFRTN
 S DIK=$$ROOT^DILFD(DIFRFILE),DA=DIFRIEN
 D IX1^DIK
 I DIFRFILE=.403,DIFRIEN D ENGRP^DDSZ(DIFRIEN) Q
 S DIFR=$S(DIFRFILE=.4:"DIPT",DIFRFILE=.402:"DIE",1:"")
 Q:DIFR=""
 I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 E  S DISYS=^DD("OS")
 I '$D(^DD("OS",DISYS,"ZS")) D BLD^DIALOG(9526) Q
 S Y=DIFRIEN
 I $D(@("^"_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S (DIFROU,X)=^("ROUOLD"),DIFRTN=$P(^(0),"^") D:X]""
 .N %X,DIR,DMAX,X,Y,DIFRZTA
 .S DIFR3="DI"_$E(DIFR,3)_"Z"
 .I $$VAL^DIFROMSS(DIFRFILE,DIFRIEN) D  Q
 ..D @("EN2^"_DIFR3_"(DIFRIEN,"""",DIFROU,"""",""DIFRZTA"")")
 ..I $D(DIFRZTA) M @DIFRSA@(DIFR3,DIFRIEN)=DIFRZTA
 ..S @DIFRSA@(DIFR3,DIFRIEN)=DIFROU
 ..Q
 .N DIFRTT,DIFRERR S DIFRTT=$S(DIFRFILE=.4:"PRINT",1:"INPUT")
 .S DIFRERR(1)=DIFRTT,DIFRERR(2)=DIFRTN
 .D BLD^DIALOG(9528,.DIFRERR)
 .Q
 Q
FPOST ;
 G FPOST^DIFROMSC
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q

DIFROMSK
DIFROMSK ;SCISC/DCL-DIFROM SERVER DELETE PARTS ;9:27 AM  4 Jan 2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 1
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;
DEL(DIFRFILE,DIFRFLG,DIFRSA,DIFRMSGR) ;DELETE TEMPLATES
 ;FILE_NUMBER,FLAGS,SOURCE_ARRAY,MSG_ARRAY_ROOT
 ;*
 ;FILE_NUMBER = Template File Number
 ;
 ;     (Required) -
 ;                  Forms           .403   ^DIST(.403,   "DIST(.403,"
 ;                  Blocks          .404   ^DIST(.404,   "DIST(.404,"
 ;                  Note: only Forms can be deleted in KIDS
 ;                  Input Template  .402   ^DIE(         "DIE"
 ;                  Print Template  .4     ^DIPT(        "DIPT"
 ;                  Sort Template   .401   ^DIBT(        "DIBT"
 ;                  Dialog          .84    ^DI(.84,      "DI(.84,"
 ;*
 ;FLAGS = None at this time
 ;*
 ;SOURCE_ARRAY = Source Array where the list of internal
 ;               entry numbers are passed (IEN/DA).
 ;               Format is:   ARRAY(DA)=""
 ;               In this example "ARRAY" is passed.
 ;*
 ;MSG_ARRAY_ROOT = Array Root where the error message will be sent.
 ;*
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 D  I '$G(DIFRFILE) D BLD^DIALOG(9529) Q
 .I $G(DIFRFILE)'>0 Q
 .I DIFRFILE=.4!(DIFRFILE=.401)!(DIFRFILE=.402)!(DIFRFILE=.403)!(DIFRFILE=.404)!(DIFRFILE=.84) Q  ;22*128
 .S DIFRFILE=0
 .Q
 I $G(DIFRSA)']"" D BLD^DIALOG(9506) Q
 I '$D(@DIFRSA) D BLD^DIALOG(9506) Q
 N DIFRDA,DIFROOT,DIFRCR
 S DIFRDA=0,DIFROOT=$$ROOT^DILFD(DIFRFILE),DIFRCR=$$ROOT^DILFD(DIFRFILE,"",1)
 I DIFROOT']"" D BLD^DIALOG(9529) Q
 ;I $$NPT(
 F  S DIFRDA=$O(@DIFRSA@(DIFRDA)) Q:DIFRDA'>0  D:$D(@DIFRCR@(DIFRDA,0))
 .I DIFRFILE=.4!(DIFRFILE=.401)!(DIFRFILE=.402) D DT(DIFROOT,DIFRDA) Q
 .I DIFRFILE=.403 D DFB(DIFRDA) Q  ;22*153 .404 to .403
 .I DIFRFILE=.84,DIFRDA>10000 D DT(DIFROOT,DIFRDA) Q  ;22*128
 .Q
 Q
 ;
DT(DIK,DA) ;Delete Template or Dialog ;22*128
 N DIFRFILE,DIFRSA,DIFRFLG,DIFRMSGR,DIFRDA,DIFRCR,DIFROOT
 N %,A,B,D0,I,W,X,Y,Z
 S Y=""
 D ^DIK
 Q
 ;
DFB(DA) ;Delete Forms(.403) and Blocks(.404), within the specified form.
 D EN^DDSDFRM(DA)
 Q
 ;
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q
 ;

DIFROMSO
DIFROMSO ;SCISC/DCL-DIFROM SERVER EDE OUT ;01:18 PM  8 Feb 1995
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;
 ; * EXTENDED DATABASE ELEMENTS (EDE) OUT *
EDEOUT(DIFRFILE,DIFRIEN,DIFRFLG,DIFRNAME,DIFRFIA,DIFRTA,DIFRLST,DIFRMSGR) ;
 ;FILE,IEN,FLAGS,PKGNAME,FIA_ARRAY,TARGET_ARRAY,RECORD_LIST,MSG_ROOT
 ;FILE=FILE NUMBER can only be:.5,.4,.401,.402,.403
 ;                            (.404 automatically comes with .403)
 ;     (Required) -
 ;                  Forms           .403   ^DIST(.403,   "DIST(.403,"
 ;                  Blocks          .404   ^DIST(.404,   "DIST(.404,"
 ;                  Input Template  .402   ^DIE(         "DIE"
 ;                  Print Template  .4     ^DIPT(        "DIPT"
 ;                  Sort Template   .401   ^DIBT(        "DIBT"
 ;                  Functions       .5     ^DD("FUNC",   "FUN"
 ;                  Dialog          .84    ^DI(.84,      ????
 ;
 ;                  Note: Blocks pointed to by Forms
 ;                        are automatically sent
 ;*
 ;IEN=INTERNAL ENTRY NUMBER - DA
 ;    (Required if LIST_ARRAY is not passed) - Identifies
 ;                 the internal entry number for the
 ;                 EDE being exported.
 ;*
 ;FLAGS="S" Strip Security Codes in Transport Structure (Do not send security codes for Forms and Templates)
 ;*
 ;PKGNAME=Package Name
 ;    (Required) - Identifies the unique key subscript
 ;                 in the export target array.
 ;*
 ;FIA_ARRAY="FIA"_ARRAY_INPUT_ARRAY_ROOT  * *NO LONGER USED* *
 ;    (Optional) - Close Input Array Reference
 ;    See DIFROM SERVER documentation for FIA array structure
 ;    definitions.  If undefined Target Array Root will be used
 ;    to append the "FIA" subscript  Default will be
 ;    ^XTMP("XPDT",DIFRNAME,"FIA")
 ;*
 ;TARGET_ARRAY=CLOSED_OUTPUT_ARRAY_ROOT
 ;    (Optional) - Closed Output Array Reference where the data will
 ;    be retuned to be temporarily stored for distribution.
 ;    ^XTMP("XPDT",DIFRNAME,"KRN") will be default.
 ;*
 ;LIST_ARRAY=LIST OF IENs PASSED BY VALUE
 ;    (Required if ENTRY not passed) - Closed Array
 ;    Reference where records for this type of template
 ;    exist.  Nodes can contain ,0).  If +value is greater
 ;    than 0 it is used, otherwise the subscript is
 ;    used as the IEN.
 ;*
 ;MSG_ROOT=CLOSED ARRAY REFERENCE
 ;    (Optional) - Closed array reference where messages such as
 ;    errors will be returned.  If not passed, decendents of ^TMP
 ;    will be used.
 ;*
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 I $G(DIFRNAME)']"" D BLD^DIALOG(9530) Q
 D
 .N X
 .S X=DIFRFILE
 .I X=.5!(X=.4)!(X=.401)!(X=.402)!(X=.403)!(X=.84) Q
 .S DIFRFILE=0
 .Q
 I DIFRFILE'>0 D BLD^DIALOG(9531) Q
 I $G(DIFRTA)="" S DIFRTA=$NA(^XTMP("XPDT",DIFRNAME,"KRN"))
 ;*
 ;        * *DIFRFIA NO LONGER USED* *
 ;S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(^XTMP("XPDT",DIFRNAME,"FIA"))
 ;I '$D(@DIFRFIA) D BLD^DIALOG(9501) Q
 ;*
 I $G(DIFRIEN)'>0&($G(DIFRLST)="") D BLD^DIALOG(9531) Q
 I $G(DIFRIEN)'>0,$D(@DIFRLST)'>9 D BLD^DIALOG(9532) Q
 S DIFRFLG=$G(DIFRFLG)
 N DIFRFNAM
 S DIFRFNAM=$P($P(".4;PRINT TEMPLATE^.401;SORT TEMPLATE^.402;INPUT TEMPLATE^.403;FORM^.404;BLOCK^.5;FUNCTION^.84;DIALOG",DIFRFILE_";",2),"^")
 D EDEOUT^DIFROMS5
 G EXIT
 ;
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q

DIFROMSP
DIFROMSP ;SFISC/DCL-DIFROM SERVER POINTER LIST ;5/18/98  08:29
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
POINTERS(DIFRFILE,DIFRFLG,DIFRPTA) ;FILENUMBER, POINTER X-REF TARGET ARRAY ROOT
 ;FILE, FLAGS, TARGET ARRAY
 S DIFRFLG=$G(DIFRFLG)
 N DIFRDDNS,DIFRALL
 S DIFRALL=DIFRFLG["A"
 D FP(DIFRFILE,"","DIFRDDNS")  ;ALL DD#s FOR FILE IN DIFRDDNS array
 S DIFRDDNS=0
 F  S DIFRDDNS=$O(DIFRDDNS(DIFRFILE,DIFRDDNS)) Q:DIFRDDNS'>0  D
 .D P(DIFRDDNS,DIFRFLG,$NA(@DIFRPTA@("P",DIFRFILE)))  ;set "P" x-refs in target array
 .Q
 Q
 ;
FP(DIFRFILE,DIFRFLG,DIFRTA) ;FILENUMBER, TARGET ARRAY ROOT FOR SUB DD NRS
 ;FILE, FLAGS, TARGET ARRAY
 N DIFRFD,DIFRFE,DIFRFW,DIFRNM,DIFRX
 S DIFRFW=$G(DIFRFLG)'["W"
F S @DIFRTA@(DIFRFILE,DIFRFILE)=$O(^DD(DIFRFILE,0,"NM",""))_"  "_$S($D(^DIC(DIFRFILE,0)):"(File-top level)",1:"(sub-file)"),DIFRFE=0
E F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  D
 .S DIFRFD=0
 .F  S DIFRFD=$O(^DD(DIFRFE,"SB",DIFRFD)) Q:DIFRFD'>0  D
 ..I DIFRFW,$P(^DD(DIFRFD,.01,0),"^",2)["W" Q
 ..I DIFRFILE-DIFRFE!'$D(DIFRFA) S @DIFRTA@(DIFRFILE,DIFRFD)=$O(^DD(DIFRFD,0,"NM",""))_"  (sub-file)"
 ..Q
 .Q
 Q
 ;
P(DIFRPDD,DIFRFLG,DIFRPTA) ;DIFRPDD=DD#,DIFRPTA=TARGET ARRAY BY VALUE TO SET "P" X-REF
 ;FILE/SUB-DD#,FLAGS,TARGET_ARRAY
 N X,Y,PN,PIDF,PFILE,DIFRALL
 S DIFRFLG=$G(DIFRFLG),DIFRALL=DIFRFLG["A"
 I $G(U)'="^" N U S U="^"
 S X=$S(DIFRALL:0,1:.01)
 F  S X=$O(^DD(DIFRPDD,X)) Q:X'>0  I $D(^(X,0)),'$P(^(0),U,2),$P(^(0),U,2)["P" S Y=^(0) D
 .I 'DIFRALL,$D(^DD(DIFRPDD,0,"IX",X)) Q
 .S PN=0
 .S @DIFRPTA@(DIFRPDD,X,PN)=U_$P(Y,U,3)
 .F  Q:$P($G(^DD(+$P($P(Y,U,2),"P",2),.01,0)),U,2)'["P"  S Y=^(0) D
 ..S PN=PN+1
 ..S @DIFRPTA@(DIFRPDD,X,PN)=U_$P(Y,U,3)
 ..Q
 .S PIDF=0,PFILE=+$P($P(Y,U,2),"P",2)
 .F  S PIDF=$O(^DD(PFILE,0,"ID",PIDF)) Q:PIDF'>0  D
 ..S @DIFRPTA@(DIFRPDD,X,PN,"ID",PIDF)=""
 ..Q
 .;HERE FIND ALL REQUIRED ID OR ALL ID FOR POINTED TOO FILE
 .;AND LIST IN @DIFRPTA@(DIFRPDD,X,PN,"ID",FILEDNUMBER)
 .Q
 Q
 ;
PGL(DIFRFILE,DIFRFLG,DIFRTA) ;  RETURN GL NODES FOR POINTERS IN TARGET ARRAY
 ;FILE,FLAGS,TARGET ARRAY
 N DIFR,DIFRD,DIFRF,DIFRPGL,DIFRX,DIKEY
 Q:'$D(^DD(DIFRFILE))
 Q:$G(DIFRTA)']""
 D FSF(DIFRFILE,"","DIFRPGL")
 S DIKEY=$O(^DD("KEY","AP",DIFRFILE,"P",0))
 S (DIFR,DIFRD)=0
 F  S DIFRD=$O(DIFRPGL(DIFRFILE,DIFRD)) Q:DIFRD'>0  D
 .S DIFRF=.01  ;Dont select .01 fields
 .F  S DIFRF=$O(^DD(DIFRD,DIFRF)) Q:DIFRF'>0  I $D(^(DIFRF,0)) S DIFRX=^(0) D
 ..Q:$P(DIFRX,"^",2)  ;Don't select Multiple/WP fields
 ..I $D(^DD(DIFRD,0,"ID",DIFRF)) Q  ;Don't select IDENTIFIER fields
 ..I DIKEY,$O(^DD("KEY",DIKEY,2,"BB",DIFRF,DIFRD,0)) Q  ;Don't select fields in Primary KEY
 ..I $P(DIFRX,"^",2)["P"!($P(DIFRX,"^",2)["V") S @DIFRTA@("PGL",DIFRD,$$Q^DIQGU($P($P(DIFRX,"^",4),";")),$P($P(DIFRX,"^",4),";",2),DIFRF)=DIFRX Q
 ..;SEND WHOLD NODE NOT $P(DIFRX,"^",2) Q
 ..Q
 .Q
 Q
TP(DIFRFILE,DIFRFLG,DIFRTA) ; $$ Extrinsic Function - Test for Pointers OR Variable Pointers
 ;Returns 1 or 0, if pointers in file
 ;FILE,FLAGS,TARGET ARRAY
 ;If target array exist the entire list of fields being exported will be
 ;in array
 N DIFR,DIFRTMP,DIFRD,DIFRF,DIFRX
 S DIFRX=$G(DIFRTA)]""
 D FSF(DIFRFILE,"","DIFRTMP")
 S (DIFR,DIFRD)=0
 F  S DIFRD=$O(DIFRTMP(DIFRFILE,DIFRD)) Q:DIFRD'>0  D  Q:DIFR
 .S DIFRF=.01  ; Do not include .01 fields
 .F  S DIFRF=$O(^DD(DIFRD,DIFRF)) Q:DIFRF'>0  I $D(^(DIFRF,0)),'$P(^(0),"^",2),($P(^(0),"^",2)["P"!($P(^(0),"^",2)["V")),'$D(^DD(DIFRD,0,"ID",DIFRF)) S:'DIFRX DIFR=1 Q:DIFR  D
 ..S:DIFRX @DIFRTA@(DIFRD,DIFRF)=$S($P(^DD(DIFRD,DIFRF,0),"^",2)["P":"P",1:"V")
 ..Q
 .Q
 Q:DIFRX $D(@DIFRTA)>9
 Q DIFR
 ;
TL(DIFRFILE,DIFRFLG,DIFRSA) ; $$ Extrinsic Function - Test for local fields
 ;FILE,FLAGS,SOURCE_ARRAY - compares local DD with Transport DD
 ;Returns 1 or 0, if local changes exist
 ;RUN THIS AFTER DD IS INSTALLED ON TARGET SITE
 N DIFR,DIFRD,DIFRF,DIFRTMP
 D FSF(DIFRFILE,"","DIFRTMP")
 S (DIFR,DIFRD)=0
 F  S DIFRD=$O(DIFRTMP(DIFRFILE,DIFRD)) Q:DIFRD'>0  D  Q:DIFR
 .S DIFRF=0
 .F  S DIFRF=$O(^DD(DIFRD,DIFRF)) Q:DIFRF'>0  I $D(^(DIFRF,0)),'$D(@DIFRSA@("^DD",DIFRFILE,DIFRD,DIFRF,0)) S DIFR=1 Q
 .Q
 Q DIFR
 ;
FSF(DIFRFILE,DIFRFLG,DIFRTA) ;File-Sub-File List
 ;FILE, FLAGS, TARGET ARRAY
 N DIFRFD,DIFRFE,DIFRFW,DIFRNM,DIFRX
 S DIFRFW=$G(DIFRFLG)'["W"
 S @DIFRTA@(DIFRFILE,DIFRFILE)="",DIFRFE=0
 F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  D
 .S DIFRFD=0
 .F  S DIFRFD=$O(^DD(DIFRFE,"SB",DIFRFD)) Q:DIFRFD'>0  D
 ..I DIFRFW,$P(^DD(DIFRFD,.01,0),"^",2)["W" Q
 ..I DIFRFILE-DIFRFE!'$D(DIFRFA) S @DIFRTA@(DIFRFILE,DIFRFD)=""
 ..Q
 .Q
 Q

DIFROMSR
DIFROMSR ;SFISC/DCL,TKW-RESOLVE POINTERS ON TARGET SYSTEM ;5/14/98  12:29
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
RP(DIFRFLG,DIFRFIA,DIFRSA,DIFRMSGR) ; Resolve Pointers on Target System
 ;The "FRV1" and "FRVL" structures within the
 ;transport array are used.
 ;FILE,FLAGS,FIAROOT,SOURCE_ARRAY,MSG_ROOT
 ;*
 ;FLAGS=(RESERVED FOR LATER USE)
 ;    (Optional)
 ;                 None
 ;*
 ;FIA_ARRAY="FIA"_ARRAY_INPUT_ARRAY_ROOT
 ;    (Optional) - Close Input Array Reference
 ;    See DIFROM SERVER documentation for FIA array structure
 ;    definitions.  If undefined SOURCE_ARRAY will be used
 ;    by appending "FIA" to the source array root subscript.
 ;*
 ;SOURCE_ARRAY=CLOSED_INPUT_ARRAY_ROOT
 ;    (Required) - Closed Input Array Reference where the file data
 ;    is temporarily stored for distribution.
 ;*
 ;MSG_ROOT=CLOSED ARRAY REFERENCE
 ;    (Optional) - Closed array reference where messages such as
 ;    errors will be returned.  If not passed, decendents of ^TMP
 ;    will be used.
 ;*
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 I $G(DIFRSA)']"" D ERR(6) G EXIT
 S DIFRFIA=$G(DIFRFIA) S:DIFRFIA="" DIFRFIA=$NA(@DIFRSA@("FIA"))
 ;
 I '$D(DIFRFIA) D ERR(2) G EXIT
 N DIFRFRVX,DIFRFILE
 S DIFRFRVX="FRV1",DIFRFILE=0 F  S DIFRFILE=$O(@DIFRSA@(DIFRFRVX,DIFRFILE)) Q:DIFRFILE'>0  D FILE
 G EXIT
 ;
FILE N DIFRTART,DIFRDNSC,DIFRPCE,DIFRSDA,DIFRY,DIFRPRV,DIFRPTF,DIFRPTFR,DIFRPRVL,DIFR2DD,DIFRTARL
 N C,D0,DA,DIC,DIK,F,G,I,R1,R2,R3,X,Y
 S DIFRTART=$NA(@DIFRSA@(DIFRFRVX,DIFRFILE))
 S DIFRTARL=$NA(@DIFRSA@("FRVL",DIFRFILE))
 S DIFRSDA=$$OREF^DILF($NA(@DIFRSA@("DATA",DIFRFILE))),DIFRDNSC=""
 F  S DIFRDNSC=$O(@DIFRTART@(DIFRDNSC)) Q:DIFRDNSC=""  D
 .K R1
 .S R2=DIFRDNSC,C=$P(R2,","),F=1,R1=0
 .F I=1:1 Q:I>C  S G=$P(R2,",",F,I) Q:G=""  I G'[""""!($L(G,"""")#2&($E(G)="""")&($E(G,$L(G))="""")) S F=F+$L(G,","),I=F-1,R1(R1)=G,R1=R1+1,C=C+($L(G,",")-1)
 .I R1'>3 S DIFR2DD=DIFRFILE
 .E  D
 ..S R3=""
 ..F I=0:1:R1-3 S R3=R3_R1(I)_","
 ..S DIFR2DD=+$P($G(@(DIFRSDA_R3_"0)")),"^",2)
 ..Q
 .;
 .S DIFRPCE=""
 .F  S DIFRPCE=$O(@DIFRTART@(DIFRDNSC,DIFRPCE)) Q:DIFRPCE'>0  D
 ..S DIFRPRV=$G(@DIFRTART@(DIFRDNSC,DIFRPCE)),DIFRPTF=$G(^(DIFRPCE,"F"))
 ..S DIFRPRVL=$G(@DIFRTARL@(DIFRDNSC)),DIFRPTFR=$P(DIFRPTF,";",2)
 ..I DIFRPRVL="" D ERR(7," (^"_DIFRPTFR_"/"_DIFRPRV_")") Q
 ..I DIFRPTFR="" D ERR(8," ("_DIFRPRVL_"/"_DIFRPRV_")") Q
 ..I DIFRPRV="" D ERR(9," (^"_DIFRPTFR_"/"_DIFRPRVL_")") Q
 ..I '$D(@("^"_DIFRPTFR_"0)")) D ERR(10," (^"_DIFRPTFR_"/"_DIFRPRV_")") Q
 ..D LOOKUP
 ..I +Y'>0 D ERR(11," ("_DIC_"  Entry:"_DIFRPRV_")") S Y=-1
 ..S DIFRY=+Y S:DIFRPTF DIFRY=+Y_";"_DIFRPTFR
 ..S $P(@DIFRPRVL,"^",DIFRPCE)=DIFRY
 ..Q
 ;
 S DIK=@DIFRFIA@(DIFRFILE,0),DIK(0)="AB"
 D IXALL^DIK:$O(@(DIK_"0)"))
 ;
 Q
 ;
LOOKUP ; Lookup entry on pointed-to file
 N DIFRS S DIFRS=$NA(@DIFRSA@("FRV1K",DIFRFILE,DIFRDNSC,DIFRPCE))
 S DIC="^"_DIFRPTFR
 I '$O(@DIFRS@(0)) S DIC(0)="X",X=DIFRPRV D ^DIC Q
 N DIFL,DIKEY,I,DIFRVAL
 S DIKEY=@DIFRS
 S DIFL=+$P(@("^"_DIFRPTFR_"0)"),U,2) I 'DIFL S Y=-1 Q
 F I=0:0 S I=$O(@DIFRS@(I)) Q:'I  S DIFRVAL(I)=@DIFRS@(I)
 S Y=$$FIND1^DIC(DIFL,",","X",.DIFRVAL,DIKEY)
 S:'Y Y=-1 Q
 ;
EXIT I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q
ERR(X,Y) S X=$P($T(ERR+X),";",5) S:$D(Y) Y(1)=Y Q:'X  D BLD^DIALOG(X,.Y) Q
 ;;FIA Node Is Set To "No Data";1;9509
 ;;FIA Array Does Not Exist;2;9501
 ;;;3;
 ;;Records Do Not Exist;4;9510
 ;;FIA File Number Invalid;5;9502
 ;;Source Array Root Missing;6;9533
 ;;Resolved Value Data Link Missing;7;9534
 ;;Pointed Too File Missing;8;9535
 ;;Pointer Resolved Value Missing;9;9538
 ;;Pointed Too File NOT on Target System;10;9536
 ;;Unable To Find Exact Match And Resolve Pointer;11;9537

DIFROMSS
DIFROMSS ;SCISC/DCL-DIFROM SERVER/DATA SORT LIST/SB-DD/HDR2P ;6/2/96  18:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
SEL(DIFRFILE,DIFRX) ;Extrinsic function to return resolved value for
 ;freetext pointer
 ;FILE,X-VALUE
 N D,DIC,DIE,DIX,DIY,DO,DS,X,Y
 N %,%K,%Y,DA,D0,D1,D2,D3
 S DIC="^DIBT(",DIC(0)="QEMZ",X=DIFRX
 S DIC("S")="I $P(^(0),U,4)=DIFRFILE,$D(^(1))>9"
 D ^DIC
 Q:Y'>0 ""
 Q Y(0,0)
 ;
HELP(DIFRFILE) ;
 N D,DIC,DIE,DIX,DIY,DO,DS,X,Y
 N %,%K,%Y,DA,D0,D1,D2,D3
 S DIC="^DIBT(",DIC(0)="M",DIC("S")="I $P(^(0),U,4)=DIFRFILE,$D(^(1))>9",X="??"
 D ^DIC
 Q
 ;
SB(DIFRDD,DIFRFLG,DIFRTA,DIFRVAL) ;Returns a list of sub-DDs for any DD#
 ;DD#,FLAGS,TARGET ARRAY(by value)
 ;DD/SUB DD NUMBER (required)
 ;FLAGS "W"=Include Word-processing fields (optional)
 ;TARGET ARRAY (required)
 ;DIFRVAL - SET TARGET ARRAY EQUAL TO
 N DIFRSDD,DIFRSSDD,DIFRNW
 S DIFRSDD=0,DIFRNW=$G(DIFRFLG)'["W",DIFRVAL=$G(DIFRVAL)
 F  S DIFRSDD=$O(^DD(DIFRDD,"SB",DIFRSDD)) Q:DIFRSDD'>0  D
 .S DIFRSSDD=0
 .I DIFRNW,$P($G(^DD(DIFRSDD,.01,0)),"^",2)["W" Q
 .S @DIFRTA@(DIFRSDD)=DIFRVAL,DIFRSSDD=$O(^DD(DIFRSDD,"SB",0))
 .I DIFRSSDD D SB(DIFRSDD,$G(DIFRFLG),DIFRTA,DIFRVAL)
 .Q
 Q
 ;
HDR2P(DIFRDD) ;Header Node/2nd piece update
 Q:$G(DIFRDD)'>0 ""
 Q:'$D(^DIC(+DIFRDD,0,"GL")) "" S DIFRDD=$TR(DIFRDD_$P($P(@(^("GL")_"0)"),"^",2),+DIFRDD,2),"DPSVIs")
 N DIFRDDT
 I $D(^DD(+DIFRDD,0,"ID")) S DIFRDD=DIFRDD_"I"
 I $D(^DD(+DIFRDD,0,"SCR")) S DIFRDD=DIFRDD_"s"
 F DIFRDDT="D","P","S","V" I $P(^DD(+DIFRDD,.01,0),"^",2)[DIFRDDT S DIFRDD=DIFRDD_DIFRDDT Q
 Q DIFRDD
 ;
EXAM(TA) ;Examine what's in 2nd piece of data Header and put into array sub
 ;TA=Target Array
 Q:$G(TA)']""
 N FN,GR,P2
 S FN=0
 F  S FN=$O(^DIC(FN)) Q:FN'>0  I $D(^DIC(FN,0,"GL")) S GR=^("GL") D
 .Q:'$D(@(GR_"0)"))  S P2=$P(^(0),"^",2),P2=$P(P2,+P2,2)
 .S:P2]"" @TA@(P2)=FN
 .Q
 Q
 ;
VAL(DIFRFILE,DIFRIEN) ;Validate Edit and Print Template's and also Forms
 S DIFRFILE=$G(DIFRFILE),DIFRIEN=$G(DIFRIEN)
 Q:DIFRIEN'>0 0
 N ROOT,PIECE,FILE
 D
 .N X
 .S X=DIFRFILE
 .I X=.4!(X=.402)!(X=.403)!(X=.404) Q
 .S DIFRFILE=0
 .Q
 Q:DIFRFILE'>0 0
 S ROOT="^"_$P($P(".4;DIPT^.402;DIE^.403;DIST(.403)^.404;DIST(.404)",DIFRFILE_";",2),"^")
 S PIECE=$P($P(".4;4^.402;4^.403;8^.404;2",DIFRFILE_";",2),"^")
 Q:'$D(@ROOT@(DIFRIEN,0)) 0
 S FILE=$P(^(0),"^",PIECE)
 I DIFRFILE=.404&('FILE) Q 1
 Q:FILE'>0 0
 I DIFRFILE=.403 N BLOCK D  Q:'BLOCK 0
 .N PAGE,BLOCKP
 .S PAGE=0,BLOCK=1
 .F  S PAGE=$O(@ROOT@(DIFRIEN,40,PAGE)) Q:PAGE'>0  S BLOCKP=$P($G(^(PAGE,0)),"^",2) S:BLOCKP BLOCK=$$VAL(.404,BLOCKP) Q:'BLOCK  D  Q:'BLOCK
 ..N M40
 ..S M40=0
 ..F  S M40=$O(@ROOT@(DIFRIEN,40,PAGE,40,M40)) Q:M40'>0  S BLOCK=$$VAL(.404,M40) Q:'BLOCK
 ..Q
 .Q
 I DIFRFILE=.4,$P(@ROOT@(DIFRIEN,0),"^",8) Q 0
 Q $D(^DD(FILE,0))#2

DIFROMSU
DIFROMSU ;SCISC/DCL-DIFROM SERVER BUILD "FIA" SUBSCRIPTS IN TRANSPORT ARRAY ;6/2/96  18:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
FIA(DIFRFILE,DIFRFLG,DIFRPFL,DIFRTAR,DIFR222,DIFR223,DIFRDSCR,DIFRVER,DIFRMSGR) ;
 ;FILE,FLAGS,PARTIAL_FILE_LIST,TARGET_ARRAY_ROOT,ANSWERS,DD_SCREEN,DATA_SCREEN,VERSION,MSG_ARRAY
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1
 I $G(U)'="^"!($G(DT)'>0)!($G(DTIME)'>0)!('$D(DUZ)) D DT^DICRW
 N DIFRFD,DIFRFE,DIFRX,FIELD,FIELDNR,DIFRTA,DIFRP,DIFR00
 S DIFRTA=$NA(@DIFRTAR@("FIA"))
 I $G(DIFRFILE)'>0 D BLD^DIALOG(9542) Q
 I '$D(^DIC(DIFRFILE)) D BLD^DIALOG(9539,DIFRFILE) Q
 I $P($G(DIFR222),"^",3)'="p" G F
 I $G(DIFRPFL)']"" G F
 I $D(@DIFRPFL)'>9 G F
 G F:$O(@DIFRPFL@(0))'>0
 N DIFRDDC,DIFRFLDC,DIFRTMP
 K ^TMP("FIA",$J)
 S DIFRDDC=0,DIFRTMP=$NA(^TMP("FIA",$J))
 M @DIFRTMP=@DIFRPFL
 F  S DIFRDDC=$O(@DIFRTMP@(DIFRFILE,DIFRDDC)) Q:DIFRDDC'>0  D
 .I '$D(^DD(DIFRDDC)) K @DIFRTMP@(DIFRFILE,DIFRDDC) D BLD^DIALOG(9540,DIFRDDC) Q
 .I '$O(@DIFRTMP@(DIFRFILE,DIFRDDC,0)) D  Q
 ..Q:@DIFRTMP@(DIFRFILE,DIFRDDC)="SUB"
 ..D SB^DIFROMSS(DIFRDDC,"W",$NA(@DIFRTMP@(DIFRFILE)),"SUB")
 ..Q
 .S DIFRFLDC=0
 .F  S DIFRFLDC=$O(@DIFRTMP@(DIFRFILE,DIFRDDC,DIFRFLDC)) Q:DIFRFLDC'>0  D
 ..I '$D(^DD(DIFRDDC,DIFRFLDC,0)) K @DIFRTMP@(DIFRFILE,DIFRDDC,DIFRFLDC) D  Q
 ...N DIFRX S DIFRX(1)=DIFRFLDC,DIFRX(2)=DIFRDDC
 ...D BLD^DIALOG(9541,.DIFRX)
 ...Q
 ..I $P(^DD(DIFRDDC,DIFRFLDC,0),"^",2) S DIFRX=$P(^DD(+$P(^(0),"^",2),.01,0),"^",2) D
 ...I DIFRX["W" S @DIFRTMP@(DIFRFILE,+$P(^DD(DIFRDDC,DIFRFLDC,0),"^",2))=0 Q
 ...K @DIFRTMP@(DIFRFILE,DIFRDDC,DIFRFLDC)
 ...Q
 ..Q
 .Q
 ;
 M @DIFRTA@(DIFRFILE)=@DIFRTMP@(DIFRFILE)
 K @DIFRTMP
 ;
 I $D(@DIFRTA@(DIFRFILE,DIFRFILE))=1 G F
 S @DIFRTA@(DIFRFILE,DIFRFILE)=1,DIFRFE=DIFRFILE
 ;F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  S:$P(^DD(DIFRFE,.01,0),"^",2)'["W" @DIFRTA@(DIFRFILE,DIFRFE,.01)=0
 F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  D
 .S @DIFRTA@(DIFRFILE,DIFRFE)=$D(@DIFRTA@(DIFRFILE,DIFRFE))>9
 .N DIFRX,DIFRY
 .S DIFRY=$$UP^DIQGU(DIFRFE,.DIFRX)
 .Q:'$D(DIFRX)
 .;K DIFRX($O(DIFRX(""))) <<REMOVED IN PATCH 10>>
 .M @DIFRTAR@("UP",DIFRFILE,DIFRFE)=DIFRX
 .Q
 S DIFRFE=DIFRFILE
 F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  D:'^(DIFRFE)!($D(@DIFRTA@(DIFRFILE,DIFRFE,.01)))
 .Q:'$D(^DD(DIFRFE,0,"UP"))
 .N DIFRUP,DIFRFLD
 .S DIFRUP=^DD(DIFRFE,0,"UP"),DIFRFLD=$O(^DD(DIFRUP,"SB",DIFRFE,0))
 .Q:$G(@DIFRTA@(DIFRFILE,DIFRUP))=0!($D(@DIFRTA@(DIFRFILE,DIFRUP,DIFRFLD)))
 .S @DIFRTA@(DIFRFILE,DIFRUP,DIFRFLD)=""
 .Q:$D(@DIFRTA@(DIFRFILE,DIFRUP))#2
 .S @DIFRTA@(DIFRFILE,DIFRUP)=1
 .Q
 ;
 G G
F S @DIFRTA@(DIFRFILE,DIFRFILE)=0,DIFRFE=0
 S:$P(DIFR222,"^",3)'="f" $P(DIFR222,"^",3)="f"
E F  S DIFRFE=$O(@DIFRTA@(DIFRFILE,DIFRFE)) Q:DIFRFE'>0  D
 .S DIFRFD=0
 .F  S DIFRFD=$O(^DD(DIFRFE,"SB",DIFRFD)) Q:DIFRFD'>0  S @DIFRTA@(DIFRFILE,DIFRFD)=0
 .Q
G S @DIFRTA@(DIFRFILE)=$P(^DIC(DIFRFILE,0),"^")
 S (DIFR00,@DIFRTA@(DIFRFILE,0))=^DIC(DIFRFILE,0,"GL")
 S @DIFRTA@(DIFRFILE,0,0)=$P(@(DIFR00_"0)"),"^",2)
 S @DIFRTA@(DIFRFILE,0,1)=$G(DIFR222)
 S @DIFRTA@(DIFRFILE,0,10)=$G(DIFR223)
 S @DIFRTA@(DIFRFILE,0,11)=$G(DIFRDSCR)
 S @DIFRTA@(DIFRFILE,0,"RLRO")=$$ROOT($P(DIFR222,"^",6))
 I $G(DIFRVER)]"" S @DIFRTA@(DIFRFILE,0,"VR")=DIFRVER
FE I $G(DIFRMSGR)]"" D CALLOUT^DIEFU(DIFRMSGR)
 Q
 ;
ERR501(DIFRFILE,DIFRFLD) ;  501 Errors
 N DIFRERRX
 S DIFRERRX("FILE")=DIFRFILE,DIFRERRX(1)=DIFRFLD
 D BLD^DIALOG(501,.DIFRERRX)
 Q
ROOT(IEN) ;Create root from DIBT(ien
 ;
 I $G(IEN)>0,$D(^DIBT(IEN,1))>9 Q "^DIBT("_IEN_",1)"
 I $G(IEN)]"" S IEN=$O(^DIBT("F"_DIFRFILE,IEN,"")) Q:IEN>0 $$ROOT(IEN)
 Q ""

DIFROMSV
DIFROMSV ;SFISC/DCL-DIFROM SERVER UTILITY,PKG REV DATA ;08:40 AM  6 Sep 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
PRD(DIFRFILE,DIFRPRD) ;Package Revision Data for File
EN ;FILE,DATA
 ;Used to install Package Data from Post-Installation Routine
 Q:$G(DIFRFILE)'>1
 Q:'$D(^DD(DIFRFILE))
 S ^DD(DIFRFILE,0,"VRRV")=$G(DIFRPRD)
 Q

DIFROMSX
DIFROMSX ;SFIRMFO/DCM/TKW-MOVE INDEX FILE ENTRIES ;12:31 PM  31 Oct 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DDIXOUT(DIFRFILE,DIFRF2,DIFRFDD,DIFRTA) ; retrieve INDEX entries for file
 ; DIFRFILE=top level file#
 ; DIFRF2=current file/subfile #
 ; DIFRFDD=1 if sending full DD
 ; DIFRTA=Global reference of transport global.
 N DIFRNAME,DIFRD0,DIFRD1,DIFRF,DIFRFLD,DIOUT,X,DICNT1,DICNT2
 S DIFRNAME="",DIOUT=0
 F  S DIFRNAME=$O(^DD("IX","BB",DIFRF2,DIFRNAME)) Q:DIFRNAME=""  D  Q:DIOUT
 . S DIFRD0=$O(^DD("IX","BB",DIFRF2,DIFRNAME,0)) Q:'DIFRD0
 . S (DIFRD1,DICNT1,DICNT2)=0
 . F  S DIFRD1=$O(^DD("IX",DIFRD0,11.1,DIFRD1)) Q:'DIFRD1  D  Q:DIOUT
 . . S X=$G(^DD("IX",DIFRD0,11.1,DIFRD1,0))
 . . S DIFRF=$P(X,U,3),DIFRFLD=$P(X,U,4) Q:'DIFRFLD!('DIFRF)
 . . S DICNT1=DICNT1+1,X=$$FNO^DILIBF(DIFRF)
 . . I '$D(@DIFRTA@("^DD",X,DIFRF,DIFRFLD)) D  Q
 . . . Q:'DIFRFDD&($G(@DIFRTA@("FIA",X,DIFRF))'=0)
 . . . D ERR1(DIFRF,DIFRFLD,DIFRNAME,"INDEX") Q
 . . S DICNT2=DICNT2+1
 . . Q
 . Q:DIOUT  I DICNT2=0,'DIFRFDD Q
 . ;I DICNT1'=DICNT2 D ERR2(DIFRF2,DIFRNAME,"INDEX") Q
 . M @DIFRTA@("IX",DIFRFILE,DIFRF2,DIFRNAME)=^DD("IX",DIFRD0)
 . K @DIFRTA@("IX",DIFRFILE,DIFRF2,DIFRNAME,11.1,"AC")
 . K @DIFRTA@("IX",DIFRFILE,DIFRF2,DIFRNAME,11.1,"B")
 . K @DIFRTA@("IX",DIFRFILE,DIFRF2,DIFRNAME,11.1,"BB")
 . Q
 Q
 ;
DDIXIN(DIFRFILE,DIFRF2,DIFRSA) ; Install INDEX file entries for file DIFRFILE
 ; DIFRFILE=source file#
 ; DIFRF2=current file/subfile#
 ; DIFRSA=name of array containing incoming data.
 N DIFRER,DIFRIN,DIFRNAME,DIFRD1,DIOUT,DIFRIN1,DIFRF,DIFRFLD,X
 I '$D(^DD(.11)) S DIFRER("FILE")=.11 D BLD^DIALOG(401,.DIFRER) Q
 S DIFRIN=$NA(@DIFRSA@("IX",DIFRFILE,DIFRF2))
 S DIFRNAME=""
 F  S DIFRNAME=$O(@DIFRIN@(DIFRNAME)) Q:DIFRNAME=""  D
 . S (DIFRD1,DIOUT)=0,DIFRIN1=$NA(@DIFRIN@(DIFRNAME))
 . F  S DIFRD1=$O(@DIFRIN1@(11.1,DIFRD1)) Q:'DIFRD1  D  Q:DIOUT
 . . S X=$G(@DIFRIN1@(11.1,DIFRD1,0))
 . . S DIFRF=$P(X,U,3),DIFRFLD=$P(X,U,4)
 . . I 'DIFRF!('DIFRFLD) Q
 . . I '$D(^DD(DIFRF,DIFRFLD,0)) D ERR3(DIFRF,DIFRFLD,DIFRNAME,"INDEX") Q
 . . I $O(^DD(DIFRF,DIFRFLD,5,0)) D
 . . . Q:$D(^TMP("DIFROMS2",$J,"TRIG",DIFRFILE,DIFRF,DIFRFLD))
 . . . D TRMOD^DICR(DIFRF,DIFRFLD)
 . . . S ^TMP("DIFROMS2",$J,"TRIG",DIFRFLD,DIFRF,DIFRFLD)="" Q
 . . Q
 . Q:DIOUT
 . N DIEN,DIK,DA,DIC,DO
 . S DIEN=$O(^DD("IX","BB",DIFRF2,DIFRNAME,0))
 . I DIEN D  N DINUM S DINUM=DIEN
 . . S DIK="^DD(""IX"",",DA=DIEN N DIEN D ^DIK Q
 . S DIC="^DD(""IX"",",DIC(0)="L",DIC("DR")=".02///^S X="_""""_DIFRNAME_"""",X=DIFRF2 D FILE^DICN S DIEN=+Y
 . I DIEN'>0 D ERR4(DIFRF2,DIFRNAME,"INDEX") Q
 . M ^DD("IX",DIEN)=@DIFRIN1
 . K DIK,DA S DIK="^DD(""IX"",",DA=DIEN D IX1^DIK
 . Q
 Q
 ;
ERR1(DIFRF,DIFRFLD,DIFRNAME,DIFRTYPE) ;
 N DIFRER S DIFRER(1)=DIFRFLD
 S DIFRER(2)=DIFRF
 S DIFRER(3)=DIFRNAME,DIFRER(4)=DIFRTYPE
 D BLD^DIALOG(9543,.DIFRER) S DIOUT=1 Q
ERR2(DIFRF2,DIFRNAME,DIFRTYPE) ;
 N DIFRER S DIFRER(1)=DIFRNAME,DIFRER(2)=DIFRTYPE
 S DIFRER(3)=DIFRF2
 D BLD^DIALOG(9544,.DIFRER) Q
ERR3(DIFRF,DIFRFLD,DIFRNAME,DIFRTYPE) ;
 N DIFRER S DIFRER(1)=DIFRTYPE,DIFRER(2)=DIFRNAME
 S DIFRER(3)=DIFRFLD
 S DIFRER(4)=DIFRF
 D BLD^DIALOG(9545,.DIFRER) S DIOUT=1 Q
ERR4(DIFRF2,DIFRNAME,DIFRTYPE) ;
 N DIFRER S DIFRER(1)=DIFRTYPE,DIFRER(2)=DIFRNAME,DIFRER(3)=DIFRF2
 D BLD^DIALOG(9549,.DIFRER) Q
 ;
 ;9543  Field |1| of file |2|, part of '|3|' |4| entry, is missing from the transport global...
 ;9544  Field(s) that are part of |1| |2| entry are missing from the transport global.
 ;9545  |1| entry |2| not installed.  The REFERENCE FIELD |3| in file |4| does not exist on the system.
 ;9549 |1| "|2|" on file |3| not installed, FILE^DICN call failed.
 ;

DIFROMSY
DIFROMSY ;SFIRMFO/DCM/TKW-MOVE KEY FILE ENTRIES ;12:32 PM  31 Oct 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DDKEYOUT(DIFRFILE,DIFRF2,DIFRTA) ; retrieve KEY entries for file
 ; DIFRFILE=top level file number
 ; DIFRF2=current file/subfile number
 ; DIFRTA=Global reference of transport global
 N DINODE,DIFRNAME,DIFRDO,DIFRD1,DIFRF,DIFRFLD,DIOUT,X,Y,DICNT1,DICNT2
 S DIFRNAME="",DIOUT=0
 F  S DIFRNAME=$O(^DD("KEY","BB",DIFRF2,DIFRNAME)) Q:DIFRNAME=""  D  Q:DIOUT
 . S DIFRD0=$O(^DD("KEY","BB",DIFRF2,DIFRNAME,0)) Q:'DIFRD0
 . S (DIFRD1,DICNT1,DICNT2)=0
 . F  S DIFRD1=$O(^DD("KEY",DIFRD0,2,DIFRD1)) Q:'DIFRD1  D  Q:DIOUT
 . . S X=$G(^DD("KEY",DIFRD0,2,DIFRD1,0))
 . . S DIFRF=$P(X,U,2),DIFRFLD=$P(X,U)
 . . I 'DIFRF!('DIFRFLD) Q
 . . S DICNT1=DICNT1+1,X=$$FNO^DILIBF(DIFRF)
 . . I '$D(@DIFRTA@("^DD",X,DIFRF,DIFRFLD)) D  Q
 . . . Q:'DIFRFDD&($G(@DIFRTA@("FIA",X,DIFRF))'=0)
 . . . D ERR1^DIFROMSX(DIFRF,DIFRFLD,DIFRNAME,"KEY") Q
 . . S DICNT2=DICNT2+1
 . Q:DIOUT  I DICNT2=0,'DIFRFDD Q
 . ;I DICNT1'=DICNT2 D ERR2^DIFROMSX(DIFRF2,DIFRNAME,"KEY") Q
 . M @DIFRTA@("KEY",DIFRFILE,DIFRF2,DIFRNAME)=^DD("KEY",DIFRD0)
 . S X=$NA(@DIFRTA@("KEY",DIFRFILE,DIFRF2,DIFRNAME,2))
 . F Y="B","BB","S" K @X@(Y)
 . K @DIFRTA@("KEY",DIFRFILE,DIFRF2,DIFRNAME,DIFRD0,3.1,"B")
 . D IXPTR Q
 Q
IXPTR ; export index pointer
 N DIIXPTR S DIIXPTR=$P(^DD("KEY",DIFRD0,0),U,4)
 I 'DIIXPTR D ERR1(9546,DIFRF2,DIFRNAME) Q
 N X,Y S X=$G(^DD("IX",DIIXPTR,0)),Y=$P(X,U,2),X=$P(X,U)
 I (+$P(X,"E")'=X)!(Y="") D ERR1(9546,DIFRF2,DIFRNAME) Q
 S @DIFRTA@("KEYPTR",DIFRFILE,DIFRF2,DIFRNAME)=X_"^"_Y
 Q
 ;
DDKEYIN(DIFRFILE,DIFRF2,DIFRSA) ;
 ; DIFRFILE=top level file#
 ; DIFRF2=current file/subfile#
 ; DIFRSA=global reference of transport global
 I '$D(^DD(.31)) N DIFRER S DIFRER("FILE")=.31 D BLD^DIALOG(401,.DIFRER) Q
 N DIFRIN,DIFRNAME,DIFRD1,DIOUT,DIFRIN1,DIFRF,DIFRFLD,DIFRKPTR,X
 S DIFRIN=$NA(@DIFRSA@("KEY",DIFRFILE,DIFRF2))
 S DIFRNAME=""
 F  S DIFRNAME=$O(@DIFRIN@(DIFRNAME)) Q:DIFRNAME=""  D
 . S (DIFRD1,DIOUT)=0,DIFRIN1=$NA(@DIFRIN@(DIFRNAME))
 . F  S DIFRD1=$O(@DIFRIN1@(2,DIFRD1)) Q:'DIFRD1  D  Q:DIOUT
 . . S X=$G(@DIFRIN1@(2,DIFRD1,0))
 . . S DIFRF=$P(X,U,2),DIFRFLD=$P(X,U)
 . . I 'DIFRF!('DIFRFLD) Q
 . . I '$D(^DD(DIFRF,DIFRFLD,0)) D ERR3^DIFROMSX(DIFRF,DIFRFLD,DIFRNAME,"KEY")
 . . Q
 . Q:DIOUT
 . S X=$G(@DIFRSA@("KEYPTR",DIFRFILE,DIFRF2,DIFRNAME)) D  Q:DIOUT
 . . I X="" D ERR1(9547,DIFRF2,DIFRNAME) Q
 . . S DIFRKPTR=$O(^DD("IX","BB",$P(X,U),$P(X,U,2),0))
 . . I 'DIFRKPTR D ERR1(9547,DIFRF2,DIFRNAME) Q
 . . S $P(@DIFRIN1@(0),U,4)=DIFRKPTR Q
 . N DIEN,DIK,DA,DIC,DO
 . S DIEN=$O(^DD("KEY","BB",DIFRF2,DIFRNAME,0))
 . I DIEN D  N DINUM S DINUM=DIEN
 . . S DIK="^DD(""KEY"",",DA=DIEN N DIEN D ^DIK Q
 . S DIC="^DD(""KEY"",",DIC(0)="L",DIC("DR")=".02///^S X="_""""_DIFRNAME_"""",X=DIFRF2 D FILE^DICN S DIEN=+Y
 . I DIEN'>0 D ERR4^DIFROMSX(DIFRF2,DIFRNAME,"KEY") Q
 . M ^DD("KEY",DIEN)=@DIFRIN1
 . K DIK,DA S DIK="^DD(""KEY"",",DA=DIEN D IX1^DIK
 . Q
 Q
 ;
ERR1(DIER,DIFRF2,DIFRNAME) ;
 N DIFRER S DIFRER(1)=DIFRNAME
 S DIFRER(2)=DIFRF2
 D BLD^DIALOG(DIER,.DIFRER) S DIOUT=1 Q
 ;
 ;9543  Field |1| of file |2|, part of '|3|' |4| entry, is missing from the transport global...
 ;9545  |1| entry |2| is not installed.  The REFERENCE FIELD |3| in file |4| does not exist on the system.
 ;9546  KEY '|1|' for file |2| cannot be transported, problem with Uniqueness Index for the KEY.
 ;9547  Key '|1|' for file |2| not installed.  Pointer to Uniqueness Index cannot be resolved.
 ;9549  |1| "|2|" on file |3| not installed, FILE^DICN call failed.
 ;

DIG
DIG ;SFISC/GFT SUBTOTALS & SCATTERGRAM ;31MAY2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 W ! I '$D(^DOSV(0,IO(0),2)) W "NO SUB-SUB TOTALS WERE RUN" Q
 N POP,IOP,ZTSK S:$D(^%ZTSK) %ZIS="QM" D ^%ZIS Q:POP
 G QUE:$D(IO("Q"))
 ;
DQ N DXMIN,DYMIN,DXMAX,DYMAX,DXI,N,NA,DYI
 S NA=$NA(^DOSV(0,IO(0)))
 S X=$O(@NA@(2,"")),(DXMIN,DXMAX)=X,(DYMIN,DYMAX)=$O(^(X,"")),X=""
 F  S X=$O(@NA@(2,X)) Q:X=""  S DXMAX=X,Y=$O(^(X,"")),DY=$O(^(""),-1) S:DYMIN>Y DYMIN=Y S:DY>DYMAX DYMAX=DY
 I DXMAX-DXMIN*(DYMAX-DYMIN)=0 D STATS(NA) Q
 ;
 ;here's the SCATTERGRAM
NUMNUM N DIGPG,DIGTYPE,%H,%T,%Y,%D,B,I,L,H,T,DIGC,X,Y,DX,DY,DXS,DYS,DXSC,DYSC
 D DIGC
 S H=DYMAX,L=DYMIN,DYS=IOSL-9,N=DYS/6
 D S(1)
 S DYMIN=B,DYSC=I/6,DYMAX=T,DYI=X
DYI I T-B/DYI*6'>DYS,DYI'<2 S DYI=DYI\2 G DYI
 S H=DXMAX,L=DXMIN,DXS=IOM-28,N=DXS/6
 D S(2)
 S DXMIN=B,DXSC=I/6,DXI=X,DXMAX=T,T=X*DXS/(T-B)
 S H=""
LOOP K ^UTILITY($J)
 S DIGTYPE="N",H=$O(@NA@("F",H)) G END:'H
 D TOP(H)
 S (B,DX,DY)="" D  G LOOP:X'=U
I2 .S (DX,X)=$O(@NA@(2,DX)) I X="" W !?5,"(TOTAL = "_B_")",! G O
 .I DIGC(2,0)["D" D H^%DTC S X=%H
 .S X=$J(X-DXMIN/DXSC,0,0)
I3 .S (Y,DY)=$O(@NA@(2,DX,DY)) G I2:Y="" I DIGC(1,0)["D" S C=X,X=Y D H^%DTC S Y=%H,X=C
 .I $D(^(DY,H,"N")) S C=^("N"),Y=$J(Y-DYMIN/DYSC,0,0),B=B+C,^(X)=C+$G(^UTILITY($J,Y,X))
 .G I3
O .S X=0 D X W !?12,"." D P K Y S L=0 F B=DYMIN:DYI:DYMAX S Y($J(L,0,0))=$$E(B,1),L=DYI*DYS/(DYMAX-DYMIN)+L
 .W ".",! F Y=DYS:-1:0 D  W !
 ..I $D(Y(Y)) W ?12-$L(Y(Y)),Y(Y),"+"
 ..E  W ?12,"|"
 ..S X="" F  S X=$O(^UTILITY($J,Y,X)) Q:X=""  S I=^(X) W ?X+13,$S(I>9:"*",I:I,1:"")
 ..W ?DXS+14 I  W "+",Y(Y) Q
 ..W "|"
 .W ?13 D P W ! S X=DXI D X W !?22,"X-AXIS: ",$P(DIGC(2),U,3),"    Y-AXIS: ",$P(DIGC(1),U,3)
 .G EOP
END W:$E(IOST)'="C"&$Y @IOF
 K:$D(ZTSK) ^DOSV(0,IO(0))
Q D CLOSE^DIO4
 Q
 ;
X F B=DXMIN+X:DXI*2:DXMAX S Y=$$E(B,2) W ?B-DXMIN\DXSC-($L(Y)\2)+13,Y
 Q
 ;
S(C) I DIGC(C,0)["D" F B="H","L" S X=@B D H^%DTC S @B=%H
 S B=H-L,X=1 I B>1 F C=1:1 S X=X*10 Q:B'>X
 E  S I=1 Q:'B  F C=0:-1 Q:X/10'>B  S X=X/10
 S B=L-X\X*X F I=B:X/10 Q:I'<L  S B=I
 S T=H+X\X*X F I=T:-X/10 Q:I'>H  S T=I
I S I=T-B/X*10 I I>N S X=X*2 G I
 S X=X/10,I=T-B/N
 Q
 ;
 ;
 ;
STATS(NA,DELIM) ;CROSS-TABS
 N DIGC,DIGB,DIGPG,DIGCOL,DIGSUB,RUN,DIGTYPE,DIG3,I,LT,L,%T,H,DUOUT
 D DIGC S DIGPG=1
1 I $D(@NA@(1)) D  G Q:$D(DUOUT),END
 .F H=0:0 S H=$O(@NA@("F",H)),DIGTYPE="S" Q:'H  D:$P(^(H),U,4)'["D"  S DIGTYPE="N" D  Q:$D(DUOUT)
 ..S Y="",L=0 F I=0:0 S Y=$O(@NA@(1,Y)) Q:Y=""  I $D(^(Y,H,DIGTYPE)) S:$L(^(DIGTYPE))>L L=$L(^(DIGTYPE)) S:$L($$E(Y,1))>I I=$L($$E(Y,1))
 ..I 'I!'L Q
 ..D TOP(H) W !! D TAB(4) W $$CAPT(1),!
 ..S Y="",%T=0
 ..F  S Y=$O(@NA@(1,Y)) Q:Y=""  I $D(^(Y,H,DIGTYPE)) D  Q:$D(DUOUT)
 ...I $Y+2>IOSL D EOP Q:$D(DUOUT)  D TOP(H)
 ...W ! D TAB(4) W $$E(Y,1) D TAB(I+7) S X=@NA@(1,Y,H,DIGTYPE) W $$J(X,L) S %T=%T+X
 ..W !! D TAB(4) W "TOTAL" D TAB(I+7) W $$J(%T,L) D EOP
2 S DIGB=$NA(@NA@(2)) I $D(@DIGB)>9 D ALL2 G END
3 N A,B,C,D,E,NAT ;We had 3 levels of subtotalling, so we build a NAT matrix of TOTALS
 S NAT=$NA(^TMP("DIG",$J,0)) K ^TMP("DIG",$J) F A="F","HD","SHD" M ^TMP("DIG",$J,A)=@NA@(A)
 S A="" F  S A=$O(@NA@(3,A)),B="" Q:A=""  F  S B=$O(@NA@(3,A,B)),C="" Q:B=""  F  S C=$O(@NA@(3,A,B,C)),D="" Q:C=""  F  S D=$O(@NA@(3,A,B,C,D)),E="" Q:D=""  F  S E=$O(@NA@(3,A,B,C,D,E)) Q:E=""  D
 .S ^(E)=^(E)+$G(@NAT@(B,C,D,E)) ;SUM OVER ALL OF THEM
 F RUN=0:0 S RUN=$O(@NA@("F",RUN)) Q:'RUN  F DIGTYPE="S","N" D:$$PAR(NAT,RUN,DIGTYPE)  G END:$D(DUOUT)
 .F X="DIGCOL","DIGSUB","I","L","LT","C" M DIG3(RUN,DIGTYPE,X)=@X
 S DIG3="" F  S DIG3=$O(@NA@(3,DIG3)) Q:DIG3=""  S DIGB=$NA(@NA@(3,DIG3)) D ALL2 G END:$D(DUOUT)
 S NA=$NA(^TMP("DIG",$J)),DIG3="**ALL**",DIGB=NAT D ALL2 ;print grand totals
 G END
 ;
ALL2 F RUN=0:0 S RUN=$O(@NA@("F",RUN)) Q:'RUN  F DIGTYPE="S","N" I $P(@NA@("F",RUN),U,4)'["D"!(DIGTYPE="N") D RUN(RUN,DIGTYPE) Q:$D(DUOUT)  ;don't try to sum dates
 Q
 ;
RUN(RUN,DIGTYPE) N %H,%Y,%D,T,C,X,Y,DX,DXS,DYS,DXSC,DYSC,DIGCOL
 I $D(DIG3) Q:'$D(DIG3(RUN,DIGTYPE))  F X="DIGSUB","DIGCOL","C","L","LT","I" M @X=DIG3(RUN,DIGTYPE,X)
 E  Q:'$$PAR(DIGB,RUN,DIGTYPE)  ;If 3-level, we have already set up PARameters
 D TOP(RUN),SUBTOP
 M @DIGB@($C(127)_"EMPTY")=@DIGB@("  EMPTY") K @DIGB@("  EMPTY")
 S Y=""
 F  S Y=$O(@DIGB@(Y)) Q:Y=""  D  G Q:$D(DUOUT) ;loop writes one output line
 .I $Y+2>IOSL D  Q:$D(DUOUT)  D TOP(RUN),SUBTOP
 ..D EOP
 .N T S X="" W !! D TAB(1) W $$E(Y,2) D TAB(I+5) ;write row caption
 .F N=0:1 S X=$O(DIGCOL(X)) Q:X=""  S %T=$G(@DIGB@(Y,X,RUN,DIGTYPE)) W $$J(+%T,L) S T=$G(T)+%T,DX(X)=$G(DX(X))+%T
 .W $$J(T,LT)
 S X="  "_$TR($J("",IOM\2)," ","-") ;THE UNDERLINE
 I '$D(DELIM) W !! D TAB(I+5) F N=N:-1 W $E(X,1,L) I N=1 W $E(X,1,LT) Q
 W !! D TAB(1) W "TOTALS" D TAB(I+5) S (%T,X)="" F N=0:1 S X=$O(DIGCOL(X)) Q:X=""  W $$J(DX(X),L) S %T=%T+DX(X)
 W $$J(%T,LT)
EOP ;
 W !! I $G(IOST)?1"C".E D
 .N DIR,X,Y
 .S DIR(0)="E" D ^DIR
 Q
 ;
PAR(DIGB,RUN,DIGTYPE)  ;DIGB=NAME OF ARRAY  Sets up DIGCOL array, and:
 ;I=width of left column
 ;L=width of data columns
 ;LT=width of TOTAL column 
 ;C=number of data columns
 N Y,DY,DX,%,S
 K DIGCOL,DIGSUB
 S Y="",I=0,C=0,L=0
 F  S Y=$O(@DIGB@(Y)),X="" Q:Y=""  S DY=$$E(Y,2) S:$L(DY)>I I=$L(DY) D
 .F  S X=$O(@DIGB@(Y,X)) Q:X=""  I $D(^(X,RUN,DIGTYPE)) S:$L(^(DIGTYPE))>L L=$L(^(DIGTYPE)) D:'$D(DIGCOL(X))
 ..S C=C+1,DIGCOL(X)="",DX=$$E(X,1),%=0 F  Q:DX=""  S S=$P(DX," "),DX=$P(DX," ",2,99) I S]"" S %=%+1,DIGSUB(%,X)=S S:$L(S)>L L=$L(S)
 I 'C Q 0
 S X="" F  S X=$O(DIGCOL(X)) Q:X=""  F Y=$O(DIGSUB(""),-1):-1:2 I $G(DIGSUB(Y,X))?." " S DIGSUB(Y,X)=$G(DIGSUB(Y-1,X)) K DIGSUB(Y-1,X)
 S Y=L*C+I+13
 I Y>IOM,'$D(DELIM) U $P W !,"MARGIN WIDTH OF ",IOM," IS TOO SMALL FOR DISPLAY",!,"USE WIDTH OF AT LEAST ",Y H 1 S DUOUT=1 Q 0
 S LT=8 F Y=Y+C+1:C+1:IOM S LT=LT+1,L=L+1
 I Y+3<IOM S I=I+3
 Q 1
 ;
TOP(H) N X,Y,DC
 U IO W:$Y @IOF
 S DC=$G(DIGPG) I $D(@NA@("HD")) D
 .X ^("HD") W !!
 E  D
 .S X=@NA@("F",H)
 .W !,"    ",$O(^DD(+X,0,"NM",0))," FILE: "
 .W $S(DIGTYPE="N":"COUNTS",1:"SUMS")
 .I $P(X,U,2)'=.01,$P(X,U,3)]"" W " OF '",$P(X,U,3),"'"
 .S Y=DT X ^DD("DD")
 .I $G(DIGPG) S Y=Y_"    Page "_DIGPG
 .W ?IOM-$L(Y)-1,Y
SHD I $D(@NA@("SHD")) W !,?IOM-$L(^("SHD"))\2,^("SHD")
 S:$G(DIGPG) DIGPG=DIGPG+1
 Q
 ;
SUBTOP N Y
 I $D(DIG3) W !!?1,$$CAPT(3),": ",$$E(DIG3,3),!
 S Y=$$CAPT(2) F X=1:1:$L(Y," ") W !?2,$P(Y," ",X)
 S Y=$$CAPT(1) W ?(IOM-I-LT-$L(Y)\2+I+4),Y,!
 F Y=1:1 Q:'$D(DIGSUB(Y))  W ! D TAB(I+5) S X="" F  S X=$O(DIGCOL(X)) Q:X=""  W $$J($G(DIGSUB(Y,X)),L)
 ;W " " D TAB(I+5) S X="" F  S X=$O(DIGCOL(X)) Q:X=""  W $$J($$E(X,1),L)
 W $$J("TOTAL",LT)
 I '$D(DELIM) W ! F Y=1:1:IOM W "-"
 Q
 ;
CAPT(N) N F S N=DIGC(N),F=$P(N,U,5) I F[";""" Q $P(F,"""",2)
 Q $P(N,U,3)
 ;
TAB(N) I $D(DELIM) W:$X DELIM Q
 W ?N Q
 ;
J(VALUE,SPACE) I $D(DELIM) Q $TR(VALUE,DELIM)_DELIM
 Q $J(VALUE,SPACE) Q
 ;
DIGC N X,C
 S (X,C)="" F  S X=$O(@NA@("BY",X),-1) Q:'X  D
 .S C=C+1,DIGC(C)=^(X)
 .S DIGC(C,0)=$S($D(^DD(+DIGC(C),+$P(DIGC(C),U,2),0)):$P(^(0),U,2),1:$P(DIGC(C),U,7))
 Q
 ;
E(VALUE,XY) ;2=Y,1=X
 I XY=2,$A(VALUE)=127 S $E(VALUE)="" ;so length isn't thrown off by non-printing char
 Q $TR($$EE,$G(DELIM))
 ;
EE() N %DT,Y
 I $P(DIGC(XY),U,4)["-" S VALUE=-VALUE
 I VALUE,DIGC(XY,0)["D" Q $$DATE^DIUTL(VALUE)
 I DIGC(XY,0)["O" Q VALUE
 I DIGC(XY,0)["S" S Y=$P(DIGC(XY),U,2) S:'Y Y=$P($P(DIGC(XY),U,4),"+""",2) S:Y Y=$$SET^DIQ(+DIGC(XY),Y,VALUE) Q Y
 Q VALUE
 ;
P S L=-1,X=0
PP I L<X W "+" S L=L+T
 E  W "-"
 S X=X+1 G PP:X'>DXS Q
 ;
 ;
QUE ;
 S ZTSAVE("^DOSV(0,$I,")=""
 S ZTIO=ION_";"_IOST_";"_IOM_";"_IOSL,ZTRTN="DQ^DIG"
 D ^%ZTLOAD K ZTSK G END

DIH
DIH ;SFISC/GFT-HISTOGRAM ; 24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NO I $O(^DOSV(0,IO(0),0))'>0 D EN^DIALOG(1520) Q  ;**CCO/NI 'NO SUB-COUNTS'
 K ZTSK S:$D(^%ZTSK) %ZIS="QM" D ^%ZIS G ENDK:POP,QUE:$D(IO("Q"))
DQ S J=$I,DN="=$O(^DOSV(0,J," F X=0:1 Q:'$D(^DOSV(0,J,"BY",X+1))
 G END:'X S A=^(1),DD=$P(A,U,3) I $D(^DD(+A,+$P(A,U,2),0)) S DD=^(0) S $P(DD,U)=$$LABEL^DIALOGZ(+A,+$P(A,U,2))
 S T=$P(DD,U,2),DP=$P(DD,U,3),DF=$S(T["S":1,T["P":2,T["D"!($P(A,U,7)["D"):3,1:0)
 S DMX=DN_X,DX="",F=X
F S DMX=DMX_",D"_F,DX=DX_"S D"_F_"="""" F X=X:0 S D"_F_DMX_")) Q:D"_F_"=""""  "_$P("S X=X+1,DS(X)=0,DD(X)=0,DV(X)="_$E("-",$P(A,U,4)["-")_"D"_X_" ",U,F=X),F=F-1 G F:F
 S DX=DX_"S:$D(^(D1,F,""N"")) DD(X)=DD(X)+^(""N"") S:$D(^(""S"")) DS(X)=DS(X)+^(""S"")"
 I $E(IOST)="C" S DIFF=1
 S F=-1,C="*",DIHIOM=IOM-23,DIHIOSL=IOSL-8 U IO W:$D(DIFF)&($Y) @IOF S DIFF=1
I S @("F"_DN_"""F"",F))") I 'F G END
 S X=0,T=^(F),DS=1 X DX S DIH=X
 D MAX G I
 ;
MAX S DMX=0 F N=1:1:DIH S:DD(N)>DMX DMX=DD(N) D:DS=1&DF  S DV(N)=$E(DV(N),1,14) ;**CCO/NI  THRU NEXT 3 LINES  HISTOGRAM CAPTIONS, INCLUDING NICE DATES
 .I DF=1 S DV(N)=$$SET^DIQ(+A,+$P(A,U,2),DV(N)) Q
 .I DF=2 S DV(N)=$P(@(U_DP_DV(N)_",0)"),U,1) Q
 .S DV(N)=$$DATE^DIUTL(DV(N))
 S X=1 F S=1:1 S X=X*2 Q:DMX'>X
 S D1=DMX+X\X*X F S=D1:-X/2 Q:S'>DMX  S D1=S
 S D2=DIHIOM*X/D1
XX S X=X\2,D2=D2\2 I X>4,$L(X)+7<D2 G XX
 I DMX S S=D1/DIHIOM,D1=D2 F X=1:1:DIH D:X=1!'(X-1#DIHIOSL)  D LN,TR:X=N!'(X#DIHIOSL) I Y=U Q  ;**CCO/NI THRU NEXT 5 LINES 'SUM','COUNT','MEAN'
 .U IO W:$Y+N+1>DIHIOSL @IOF W !! D  W !! Q
 ..N H
 ..S H=$$EZBLD^DIALOG($S(DS=1:7089,DS=2:7090,DS=3:7088,1:-1))
 ..I $D(^DD(+T,0)) S Y=+$P(T,U,2) I Y-.01,$D(^(Y,0)) S H=H_", "_$$LABEL^DIALOGZ(+T,Y)
 ..S H(1)=H,H(2)=$P(DD,U),H=$$EZBLD^DIALOG(7081,.H) W ?IOM-$L(H)-2,H
SUM Q:$P(T,U,4)["D"!(Y=U)  I DS=1 S DS=2 F N=1:1 G:N>DIH MAX S S=DD(N),DD(N)=DS(N),DS(N)=S
MEAN I DS=2 S DS=3 F N=1:1 S DD(N)=$S(DS(N):DD(N)/DS(N),1:0) G MAX:N=DIH
 Q
 ;
END W:($E(IOST)'="C")&($Y) @IOF K:$D(ZTSK) ^DOSV(0,IO) D CLOSE^DIO4
ENDK K ZTSK,DIH,S,A,C,DD,DS,D1,D2,DN,T,DP,F,N,J,POP,DF,X,Y,DX,DMX,DV,DIHIOM,DIHIOSL,DIFF Q
 ;
 ;
LN W ?15-$L(DV(X))-1,DV(X)," |" F Y=1:1:DD(X)/S W C ;The *s
 W ! Q
 ;
TR W ?15 F Y=0:1:DIHIOM W $E("-+",Y#D1=0+1)
 W ! F Y=1:1:DIHIOM I Y#D1=0 S D2=$J(Y*S,0,0) W ?Y+15-($L(D2)\2),D2
 I IOST?1"C".E W $C(7) R Y:DTIME
 Q
 ;
 ;
QUE ;
 S ZTSAVE("^DOSV(0,$I,")=""
 S ZTIO=ION_";"_IOST_";"_IOM_";"_IOSL,ZTRTN="DQ^DIH"
 D ^%ZTLOAD K ZTSK G END
 ;
 ;7081 = __ BY  ___

DII
DII ;SFISC/GFT,XAK,TKW-OPTION RDR, INQUIRY ;9JUN2011
V ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D
 .N VERSION,X D VERSION^DI W !!,X,!
 I '$G(DUZ),$D(^VA(200,0))#2 D  I '$G(DUZ) W $C(7),!,$$EZBLD^DIALOG(7005),! Q  ;MUST HAVE DUZ!
 . N DIC,DTOUT,DUOUT
ASK . S DUZ=0,DIC=200,DIC(0)="AEFNQZ",DIC("A")="Identity = ",DIC("S")="I Y'<1&$L($P(^(0),U,3))"
 . D ^DIC Q:Y'>0
 . S DUZ=+Y,DUZ("LANG")=$P($G(^(200)),U,7),DUZ(1)="",DUZ(2)=$O(^VA(200,DUZ,2,0)) S:'$D(DUZ(0)) DUZ(0)=$P(Y(0),"^",4)
 . S DUZ("AG")=$P($G(^XTV(8989.3,1,0)),"^",8) S:'DUZ(2) DUZ(2)=+$P($G(^("XUS")),U,17)
 . S:'$G(DUZ("LANG")) DUZ("LANG")=$P($G(^XTV(8989.3,1,"XUS")),U,7)
NOKL D DT^DICRW,OS S DIK="^DOPT(""DII""," G F:$D(^DOPT("DII",9)) S ^(0)="OPTION^1.01^" F I=1:1 S X=$E($T(F+I),4,99) Q:X=""  S ^DOPT("DII",I,0)=X
 D IXALL^DIK
F S DIC=DIK,DIC(0)="AEQZ" D ^DIC K DIC,DIK G Q:Y<0 S X=$P(Y(0),U,2,99) K Y D @X W !!! D Q G NOKL
 ;;ENTER OR EDIT FILE ENTRIES^^DIB
 ;;PRINT FILE ENTRIES^^DIP
 ;;SEARCH FILE ENTRIES^^DIS
 ;;MODIFY FILE ATTRIBUTES^^DICATT
 ;;INQUIRE TO FILE ENTRIES^INQ^DII
 ;;UTILITY FUNCTIONS^^DIU
 ;;OTHER OPTIONS^^DII1
 ;;DATA DICTIONARY UTILITIES^^DDU
 ;;TRANSFER ENTRIES^^DIT
 ;
Q D Q^DIB,Q^DICATT2,Q^DIARB
 K DRK,DIL,DIS,DK,DIACD,DIQ,DX,DQI,DISYS,DHIT,%X,%Y,%,DXS,Q,DIAR
 K A0,D9,DNP,DCC,DIJ,DP,DM,DQ,DICATT,DIFLD,D0,DIEL,DL,DC,DU,DIP
 K DH,DIYS,DINS,DIPT,DHD,DCL,DPP,DPQ,DALL,DIRUT,DIROUT,DUOUT,DTOUT
 Q
INQ ;
 W !! D ^DICRW Q:'$D(DIC)  S DI=DIC,DPP(1)=+Y_"^^^@",DK=+Y I $D(DICS) S DICSS=DICS
B K ^UTILITY($J),^(U,$J),DIC,DIQ,DISV,DIBT,DICS S DIC=DI,DIC(0)="AEQM",DIK=0
R D ^DIC I Y>0 S DIK=DIK+1,^UTILITY(U,$J,DIK,+Y)="",DIC("A")=$$EZBLD^DIALOG(8199)_" " G R ;**CCO/NI 'ANOTHER ONE:'
S G Q^DIP:'DIK!(X=U) G:DIK'>3 O
 D  K DIRUT,DIROUT
 . N DIK,DI,DICSS,DX D S2^DIBT1 Q
 G:$D(DTOUT)!($D(DUOUT)) Q^DIP G:X="" O G:Y<0 S
 F X=1:1:DIK S ^DIBT(+Y,1,+$O(^UTILITY(U,$J,X,0)))=""
 S ^DIBT(+Y,"QR")=DT_U_DIK
O K DIC G Q^DIP:$D(DTOUT) S DIC=DI,%=1
 W !,$$EZBLD^DIALOG(8198) D YN^DICN G Q^DIP:%<0 ;**CCO/NI 'STANDARD CAPTIONED OUTPUT?'
 I '% D BLD^DIALOG(9108),MSG^DIALOG("WH") G O ;**CCO/NI 'ANSWER NO ....'
 I %=2 S L=1,Q="""",DPP=1,DPP(1,"IX")="^UTILITY(U,$J,"_DI_"^2" S:$D(DICSS) DICS=DICSS G N^DIP1
 D C G:$D(DIRUT) Q
 S IOP="HOME" D ^%ZIS I $D(DICSS) S DICS=DICSS
DIQ N S S S=1,$Y=0 F DIK=1:1:DIK S DA=+$O(^UTILITY(U,$J,DIK,0)) W ! D:DIK>1 LF^DIQ Q:'S  D  G:'S Q  S S=S+2
 .N DIK D CAPTION^DIQ(DK,DA,DIQ(0))
 W !! Q:$D(DTOUT)  G B
 ;
P G Q^DI
 ;
OS I $D(^%ZOSF("OS"))#2 S DISYS=+$P(^("OS"),"^",2) Q:DISYS>0
 S DISYS=$S($D(^DD("OS"))#2:^("OS"),1:100)
 Q
AUD S DIACD=DIQ(0),DIQ(0)="C",DIQ=DA
 F DA=0:0 S DA=$O(^DIA(DK,"B",DIQ,DA)) Q:DA'>0  S DIC="^DIA("_DK_",",E="N<0",N=-1,DD=1.1,DIA=DK D GUY^DIQ Q:'S  W !
 S DIQ(0)=DIACD Q
 ;
C ;called from ^DIP21
 N DIR,I,L,Y,X,DITXT
 D BLD^DIALOG(7004,"","","DIR") S DITXT="" D  S DITXT=DITXT_DIR
 . F I=1:1 Q:$G(DIR(I))=""  S DITXT=DITXT_DIR(I)
 . Q
 K DIR S DIR(0)="SMB^"_DITXT,DIR("B")=$P($P(DITXT,":",2)," ",1),DIR("A")=$$EZBLD^DIALOG(8002)
 D ^DIR Q:$D(DIRUT)
 F I=1:1 S X=$P($P(DITXT,";",I),":") Q:X=""  I X=Y S DIQ(0)=$S(I=2:"C",I=3:"R",I=4:"CR",1:"") Q
 I X'=Y S DIRUT=1 Q
A I $D(^DIA(DK)) S DIR(0)="Y",DIR("A")=$$EZBLD^DIALOG(8197),DIR("B")="No",DIR("?")=$$EZBLD^DIALOG(9109) D ^DIR Q:$D(DIRUT)  S:Y=1 DIQ(0)=DIQ(0)_"A" ;**CCO/NI 'AUDIT TRAIL' QUERY & HELP
 Q
 ;7004  N:No;Y:Yes;R:Record Number;B:Both Computed and Number
 ;8002  Include COMPUTED fields

DII1
DII1 ;SFISC/XAK-OTHER OPTIONS ;7/25/96  14:15
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
0 S DIC="^DOPT(""DII1"","
 G OPT:$D(^DOPT("DII1",9)) S ^(0)="OTHER OPTION^1.01" K ^("B")
 F X=1:1:9 S ^DOPT("DII1",X,0)=$P($T(@X),";;",2)
 S DIK=DIC D IXALL^DIK
OPT ;
 S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN G 0
 ;
EN ;
 D @DI W !!
Q K %,DIC,DIK,DI,DA,I,J,X,Y Q
 ;
1 ;;FILEGRAMS
 G ^DIFGO
 ;
2 ;;ARCHIVING
 G NOKL^DIAR
 ;
3 ;;AUDITING
 G ^DIAU
 ;
4 ;;SCREENMAN
 G ^DDSOPT
 ;
5 ;;STATISTICS
 G ^DIX
 ;
6 ;;EXTRACT DATA TO FILEMAN FILE
 G ^DIAX
 ;
7 ;;DATA EXPORT TO FOREIGN FORMAT
 G NOKL^DDXP
 ;
8 ;;IMPORT DATA
 G EN^DDMPU
 ;
9 ;;BROWSER
 G ^DDBR

DIINI001
DIINI001 ; ; 28-MAR-2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"KEY",43,0)
 ;;=DIEXTRACT
 ;;^UTILITY(U,$J,"KEY",43,1,0)
 ;;=^^3^3^2930106^
 ;;^UTILITY(U,$J,"KEY",43,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"KEY",43,1,2,0)
 ;;=This key is needed to access the menu for extracting data to a VA FileMan
 ;;^UTILITY(U,$J,"KEY",43,1,3,0)
 ;;=file.
 ;;^UTILITY(U,$J,"KEY",44,0)
 ;;=DDXP-DEFINE
 ;;^UTILITY(U,$J,"KEY",44,1,0)
 ;;=^^3^3^2930108^^
 ;;^UTILITY(U,$J,"KEY",44,1,1,0)
 ;;=Holders of this key can use the Define Foreign File Format option.  That
 ;;^UTILITY(U,$J,"KEY",44,1,2,0)
 ;;=option defines foreign formats, modifies existing formats that have not
 ;;^UTILITY(U,$J,"KEY",44,1,3,0)
 ;;=been used to create an export template, and clones formats.
 ;;^UTILITY(U,$J,"OPT",1328,0)
 ;;=DIEDIT^Enter or Edit File Entries^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1328,1,0)
 ;;=^^2^2^2890316^^^^
 ;;^UTILITY(U,$J,"OPT",1328,1,1,0)
 ;;=This option is used to enter new entries in a file or edit existing ones.
 ;;^UTILITY(U,$J,"OPT",1328,1,2,0)
 ;;=You specify the file and fields within the file to edit.
 ;;^UTILITY(U,$J,"OPT",1328,20)
 ;;=D ^DIB
 ;;^UTILITY(U,$J,"OPT",1328,99)
 ;;=52905,54998
 ;;^UTILITY(U,$J,"OPT",1328,"U")
 ;;=ENTER OR EDIT FILE ENTRIES
 ;;^UTILITY(U,$J,"OPT",1329,0)
 ;;=DIPRINT^Print File Entries^^A^^^^^^^y^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1329,1,0)
 ;;=^19.06^3^3^3000215^^^^
 ;;^UTILITY(U,$J,"OPT",1329,1,1,0)
 ;;=This option is used to print a report from a file, where a number of
 ;;^UTILITY(U,$J,"OPT",1329,1,2,0)
 ;;=entries are to be listed in a columnar format.  Each column can be
 ;;^UTILITY(U,$J,"OPT",1329,1,3,0)
 ;;=individually controlled for format, tabulation, justification, etc.
 ;;^UTILITY(U,$J,"OPT",1329,20)
 ;;=D ^DIP
 ;;^UTILITY(U,$J,"OPT",1329,99.1)
 ;;=55061,47656
 ;;^UTILITY(U,$J,"OPT",1329,"U")
 ;;=PRINT FILE ENTRIES
 ;;^UTILITY(U,$J,"OPT",1330,0)
 ;;=DISEARCH^Search File Entries^^A^^^^^^^y^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1330,1,0)
 ;;=^^3^3^2930728^^^^
 ;;^UTILITY(U,$J,"OPT",1330,1,1,0)
 ;;=This option is used to print a report in which entries are to be selected
 ;;^UTILITY(U,$J,"OPT",1330,1,2,0)
 ;;=according to a pre-determined set of criteria.  After the search criteria 
 ;;^UTILITY(U,$J,"OPT",1330,1,3,0)
 ;;=is met, a standard report will be generated.
 ;;^UTILITY(U,$J,"OPT",1330,20)
 ;;=D ^DIS
 ;;^UTILITY(U,$J,"OPT",1330,"U")
 ;;=SEARCH FILE ENTRIES
 ;;^UTILITY(U,$J,"OPT",1331,0)
 ;;=DIMODIFY^Modify File Attributes^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1331,1,0)
 ;;=^^2^2^2890316^^^
 ;;^UTILITY(U,$J,"OPT",1331,1,1,0)
 ;;=This option is used to modify the structure of a file or the 
 ;;^UTILITY(U,$J,"OPT",1331,1,2,0)
 ;;=characteristics of its fields.
 ;;^UTILITY(U,$J,"OPT",1331,20)
 ;;=D ^DICATT
 ;;^UTILITY(U,$J,"OPT",1331,"U")
 ;;=MODIFY FILE ATTRIBUTES
 ;;^UTILITY(U,$J,"OPT",1332,0)
 ;;=DIINQUIRE^Inquire to File Entries^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1332,1,0)
 ;;=3^^4^4^2890316^^
 ;;^UTILITY(U,$J,"OPT",1332,1,1,0)
 ;;=This option is used to display all the data for a group of specified
 ;;^UTILITY(U,$J,"OPT",1332,1,2,0)
 ;;=entries in a file.  This is useful for a quick look at a small number
 ;;^UTILITY(U,$J,"OPT",1332,1,3,0)
 ;;=of entries.  Use the Print File Entries option for larger numbers
 ;;^UTILITY(U,$J,"OPT",1332,1,4,0)
 ;;=of entries.
 ;;^UTILITY(U,$J,"OPT",1332,20)
 ;;=D INQ^DII
 ;;^UTILITY(U,$J,"OPT",1332,"U")
 ;;=INQUIRE TO FILE ENTRIES
 ;;^UTILITY(U,$J,"OPT",1333,0)
 ;;=DIUTILITY^Utility Functions^^M^^^^^^^^^n^^
 ;;^UTILITY(U,$J,"OPT",1333,1,0)
 ;;=^^2^2^2981020^^^^
 ;;^UTILITY(U,$J,"OPT",1333,1,1,0)
 ;;=This option is a menu of VA FileMan utilities used to maintain the more
 ;;^UTILITY(U,$J,"OPT",1333,1,2,0)
 ;;=technical aspects of files.
 ;;^UTILITY(U,$J,"OPT",1333,10,0)
 ;;=^19.01PI^11^11
 ;;^UTILITY(U,$J,"OPT",1333,10,1,0)
 ;;=1344^^6
 ;;^UTILITY(U,$J,"OPT",1333,10,1,"^")
 ;;=DIEDFILE
 ;;^UTILITY(U,$J,"OPT",1333,10,2,0)
 ;;=1340^^2
 ;;^UTILITY(U,$J,"OPT",1333,10,2,"^")
 ;;=DIXREF
 ;;^UTILITY(U,$J,"OPT",1333,10,3,0)
 ;;=1343^^5
 ;;^UTILITY(U,$J,"OPT",1333,10,3,"^")
 ;;=DIITRAN
 ;;^UTILITY(U,$J,"OPT",1333,10,4,0)
 ;;=1341^^3
 ;;^UTILITY(U,$J,"OPT",1333,10,4,"^")
 ;;=DIIDENT
 ;;^UTILITY(U,$J,"OPT",1333,10,5,0)
 ;;=1342^^4
 ;;^UTILITY(U,$J,"OPT",1333,10,5,"^")
 ;;=DIRDEX
 ;;^UTILITY(U,$J,"OPT",1333,10,6,0)
 ;;=1345^^7
 ;;^UTILITY(U,$J,"OPT",1333,10,6,"^")
 ;;=DIOTRAN
 ;;^UTILITY(U,$J,"OPT",1333,10,7,0)
 ;;=1346^^8
 ;;^UTILITY(U,$J,"OPT",1333,10,7,"^")
 ;;=DITEMP
 ;;^UTILITY(U,$J,"OPT",1333,10,8,0)
 ;;=1347^^9
 ;;^UTILITY(U,$J,"OPT",1333,10,8,"^")
 ;;=DIUNEDIT
 ;;^UTILITY(U,$J,"OPT",1333,10,9,0)
 ;;=1339^^1
 ;;^UTILITY(U,$J,"OPT",1333,10,9,"^")
 ;;=DIVERIFY
 ;;^UTILITY(U,$J,"OPT",1333,10,10,0)
 ;;=1369^^10
 ;;^UTILITY(U,$J,"OPT",1333,10,10,"^")
 ;;=DIFIELD CHECK
 ;;^UTILITY(U,$J,"OPT",1333,10,11,0)
 ;;=8767^^11
 ;;^UTILITY(U,$J,"OPT",1333,10,11,"^")
 ;;=DIKEY
 ;;^UTILITY(U,$J,"OPT",1333,20)
 ;;=
 ;;^UTILITY(U,$J,"OPT",1333,99)
 ;;=62819,35307
 ;;^UTILITY(U,$J,"OPT",1333,"U")
 ;;=UTILITY FUNCTIONS
 ;;^UTILITY(U,$J,"OPT",1334,0)
 ;;=DISTATISTICS^Statistics^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1334,1,0)
 ;;=^^3^3^2890316^^^
 ;;^UTILITY(U,$J,"OPT",1334,1,1,0)
 ;;=After generating output from the Print File Entries or Search File Entries
 ;;^UTILITY(U,$J,"OPT",1334,1,2,0)
 ;;=options, call upon the Statistics option to produce your choice of 
 ;;^UTILITY(U,$J,"OPT",1334,1,3,0)
 ;;=seven types of statistical tallies.
 ;;^UTILITY(U,$J,"OPT",1334,20)
 ;;=D ^DIX
 ;;^UTILITY(U,$J,"OPT",1334,"U")
 ;;=STATISTICS
 ;;^UTILITY(U,$J,"OPT",1335,0)
 ;;=DILIST^List File Attributes^^A^^^^^^^y^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1335,1,0)
 ;;=^^3^3^2890316^^^^
 ;;^UTILITY(U,$J,"OPT",1335,1,1,0)
 ;;=This option is used to print data dictionary listings for a given file.
 ;;^UTILITY(U,$J,"OPT",1335,1,2,0)
 ;;=This listing is useful for programmers, analysts, and others interested
 ;;^UTILITY(U,$J,"OPT",1335,1,3,0)
 ;;=in data base structures.
 ;;^UTILITY(U,$J,"OPT",1335,20)
 ;;=D ^DID
 ;;^UTILITY(U,$J,"OPT",1335,99.1)
 ;;=54447,33461
 ;;^UTILITY(U,$J,"OPT",1335,"U")
 ;;=LIST FILE ATTRIBUTES
 ;;^UTILITY(U,$J,"OPT",1336,0)
 ;;=DITRANSFER^Transfer Entries^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1336,1,0)
 ;;=^^2^2^2890316^^^^
 ;;^UTILITY(U,$J,"OPT",1336,1,1,0)
 ;;=This option is used to transfer entries from one file to another or to
 ;;^UTILITY(U,$J,"OPT",1336,1,2,0)
 ;;=merge data from one entry to another in the same file.
 ;;^UTILITY(U,$J,"OPT",1336,20)
 ;;=D ^DIT
 ;;^UTILITY(U,$J,"OPT",1336,"U")
 ;;=TRANSFER ENTRIES
 ;;^UTILITY(U,$J,"OPT",1337,0)
 ;;=DIUSER^VA FileMan^^M^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1337,1,0)
 ;;=^^2^2^2910205^^^^
 ;;^UTILITY(U,$J,"OPT",1337,1,1,0)
 ;;=This option branches to the VA FileMan main menu, which allows you
 ;;^UTILITY(U,$J,"OPT",1337,1,2,0)
 ;;=to enter, edit, report, inquire, and maintain data dictionaries.
 ;;^UTILITY(U,$J,"OPT",1337,10,0)
 ;;=^19.01PI^11^9
 ;;^UTILITY(U,$J,"OPT",1337,10,1,0)
 ;;=1328^^1
 ;;^UTILITY(U,$J,"OPT",1337,10,1,"^")
 ;;=DIEDIT
 ;;^UTILITY(U,$J,"OPT",1337,10,2,0)
 ;;=1332^^5
 ;;^UTILITY(U,$J,"OPT",1337,10,2,"^")
 ;;=DIINQUIRE
 ;;^UTILITY(U,$J,"OPT",1337,10,4,0)
 ;;=1331^^4
 ;;^UTILITY(U,$J,"OPT",1337,10,4,"^")
 ;;=DIMODIFY
 ;;^UTILITY(U,$J,"OPT",1337,10,5,0)
 ;;=1329^^2
 ;;^UTILITY(U,$J,"OPT",1337,10,5,"^")
 ;;=DIPRINT
 ;;^UTILITY(U,$J,"OPT",1337,10,6,0)
 ;;=1330^^3
 ;;^UTILITY(U,$J,"OPT",1337,10,6,"^")
 ;;=DISEARCH
 ;;^UTILITY(U,$J,"OPT",1337,10,8,0)
 ;;=1336^^9
 ;;^UTILITY(U,$J,"OPT",1337,10,8,"^")
 ;;=DITRANSFER
 ;;^UTILITY(U,$J,"OPT",1337,10,9,0)
 ;;=1333^^6
 ;;^UTILITY(U,$J,"OPT",1337,10,9,"^")
 ;;=DIUTILITY
 ;;^UTILITY(U,$J,"OPT",1337,10,10,0)
 ;;=1359^^10
 ;;^UTILITY(U,$J,"OPT",1337,10,10,"^")
 ;;=DIOTHER
 ;;^UTILITY(U,$J,"OPT",1337,10,11,0)
 ;;=1373^^8
 ;;^UTILITY(U,$J,"OPT",1337,10,11,"^")
 ;;=DI DDU
 ;;^UTILITY(U,$J,"OPT",1337,20)
 ;;=W !!?10,"VA FileMan Version "_^DD("VERSION")
 ;;^UTILITY(U,$J,"OPT",1337,99)
 ;;=62819,35307
 ;;^UTILITY(U,$J,"OPT",1337,99.1)
 ;;=62627,35095
 ;;^UTILITY(U,$J,"OPT",1337,1613)
 ;;=
 ;;^UTILITY(U,$J,"OPT",1337,"U")
 ;;=VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",1338,0)
 ;;=DI DDMAP^Map Pointer Relations^^R^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1338,1,0)
 ;;=^^3^3^2910706^
 ;;^UTILITY(U,$J,"OPT",1338,1,1,0)
 ;;=This option prints a map of the pointer relations between a group of
 ;;^UTILITY(U,$J,"OPT",1338,1,2,0)
 ;;=files. The file selection is from the package file or entered
 ;;^UTILITY(U,$J,"OPT",1338,1,3,0)
 ;;=individually.
 ;;^UTILITY(U,$J,"OPT",1338,25)
 ;;=DDMAP
 ;;^UTILITY(U,$J,"OPT",1338,136)
 ;;=
 ;;^UTILITY(U,$J,"OPT",1338,"U")
 ;;=MAP POINTER RELATIONS
 ;;^UTILITY(U,$J,"OPT",1339,0)
 ;;=DIVERIFY^Verify Fields^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1339,1,0)
 ;;=^^4^4^2890316^^^
 ;;^UTILITY(U,$J,"OPT",1339,1,1,0)
 ;;=This option is used to double check the data that exists in a field
 ;;^UTILITY(U,$J,"OPT",1339,1,2,0)
 ;;=to see that it matches the Data Dictionary specifications.  The user
 ;;^UTILITY(U,$J,"OPT",1339,1,3,0)
 ;;=is allowed to store the discrepancies in a search template so that they
 ;;^UTILITY(U,$J,"OPT",1339,1,4,0)
 ;;=can easily be retrieved for examination and correction.
 ;;^UTILITY(U,$J,"OPT",1339,20)
 ;;=S DI=1 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1339,"U")
 ;;=VERIFY FIELDS
 ;;^UTILITY(U,$J,"OPT",1340,0)
 ;;=DIXREF^Cross-Reference A Field^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1340,1,0)
 ;;=^^5^5^2980908^^
 ;;^UTILITY(U,$J,"OPT",1340,1,1,0)
 ;;=The Cross-Reference a Field sub-option of the Utility Functions option
 ;;^UTILITY(U,$J,"OPT",1340,1,2,0)
 ;;=allows you to identify a field or sub-field for cross-referencing or
 ;;^UTILITY(U,$J,"OPT",1340,1,3,0)
 ;;=for removing cross-referencing from an identified field.
 ;;^UTILITY(U,$J,"OPT",1340,1,4,0)
 ;;=VA FileMan currently has seven types of cross-references -- Regular,
 ;;^UTILITY(U,$J,"OPT",1340,1,5,0)
 ;;=KWIC, Mnemonic, MUMPS, Soundex, Trigger and Bulletin.
 ;;^UTILITY(U,$J,"OPT",1340,20)
 ;;=S DI=2 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1340,"U")
 ;;=CROSS-REFERENCE A FIELD
 ;;^UTILITY(U,$J,"OPT",1341,0)
 ;;=DIIDENT^Identifier^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1341,1,0)
 ;;=^^4^4^2890316^
 ;;^UTILITY(U,$J,"OPT",1341,1,1,0)
 ;;=Use the Identifier sub-option of the Utility Functions option to associate
 ;;^UTILITY(U,$J,"OPT",1341,1,2,0)
 ;;=a field with the .01 (or NAME) field of a file.  The field designated as
 ;;^UTILITY(U,$J,"OPT",1341,1,3,0)
 ;;=an identifier can be displayed along with the selected entry to help
 ;;^UTILITY(U,$J,"OPT",1341,1,4,0)
 ;;=a user positively identify the entry.
 ;;^UTILITY(U,$J,"OPT",1341,20)
 ;;=S DI=3 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1341,"U")
 ;;=IDENTIFIER
 ;;^UTILITY(U,$J,"OPT",1342,0)
 ;;=DIRDEX^Re-Index File^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1342,1,0)
 ;;=^^4^4^2890316^
 ;;^UTILITY(U,$J,"OPT",1342,1,1,0)
 ;;=The Re-index a File sub-option of the Utility Functions option allows
 ;;^UTILITY(U,$J,"OPT",1342,1,2,0)
 ;;=you to re-index a file.  This VA FileMan feature is especially helpful
 ;;^UTILITY(U,$J,"OPT",1342,1,3,0)
 ;;=when you create a new cross reference on a field that already contains
 ;;^UTILITY(U,$J,"OPT",1342,1,4,0)
 ;;=data.
 ;;^UTILITY(U,$J,"OPT",1342,20)
 ;;=S DI=4 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1342,"U")
 ;;=RE-INDEX FILE
 ;;^UTILITY(U,$J,"OPT",1343,0)
 ;;=DIITRAN^Input Transform (Syntax)^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1343,1,0)
 ;;=^^4^4^2901212^^^
 ;;^UTILITY(U,$J,"OPT",1343,1,1,0)
 ;;=The Input Transform sub-option of the Utility Functions option allows
 ;;^UTILITY(U,$J,"OPT",1343,1,2,0)
 ;;=you to enter an executable string of MUMPS code which is used to check
 ;;^UTILITY(U,$J,"OPT",1343,1,3,0)
 ;;=the validity of user input and will then convert the input into an
 ;;^UTILITY(U,$J,"OPT",1343,1,4,0)
 ;;=internal form for storage.
 ;;^UTILITY(U,$J,"OPT",1343,20)
 ;;=Q:DUZ(0)'="@"  S DI=5 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1343,"U")
 ;;=INPUT TRANSFORM (SYNTAX)
 ;;^UTILITY(U,$J,"OPT",1344,0)
 ;;=DIEDFILE^Edit File^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1344,1,0)
 ;;=^^3^3^2890316^^
 ;;^UTILITY(U,$J,"OPT",1344,1,1,0)
 ;;=This option allows the user to document and control a file.  The user
 ;;^UTILITY(U,$J,"OPT",1344,1,2,0)
 ;;=may describe the purpose of the file, assign it security, indicate
 ;;^UTILITY(U,$J,"OPT",1344,1,3,0)
 ;;=application groups which use the file, and change the name of the file.
 ;;^UTILITY(U,$J,"OPT",1344,20)
 ;;=S DI=6 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1344,"U")
 ;;=EDIT FILE
 ;;^UTILITY(U,$J,"OPT",1345,0)
 ;;=DIOTRAN^Output Transform^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1345,1,0)
 ;;=^^3^3^2890316^
 ;;^UTILITY(U,$J,"OPT",1345,1,1,0)
 ;;=The Output Transform sub-option of the Utility Functions option allows
 ;;^UTILITY(U,$J,"OPT",1345,1,2,0)
 ;;=you to enter an executable string of MUMPS code which converts internally
 ;;^UTILITY(U,$J,"OPT",1345,1,3,0)
 ;;=stored data into a readable display.
 ;;^UTILITY(U,$J,"OPT",1345,20)
 ;;=S DI=7 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1345,"U")
 ;;=OUTPUT TRANSFORM
 ;;^UTILITY(U,$J,"OPT",1346,0)
 ;;=DITEMP^Template Edit^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1346,1,0)
 ;;=^^4^4^2890316^
 ;;^UTILITY(U,$J,"OPT",1346,1,1,0)
 ;;=The Template Edit sub-option of the Utility Functions option allows you
 ;;^UTILITY(U,$J,"OPT",1346,1,2,0)
 ;;=to enter a description of any sort, print or input templates in a selected
 ;;^UTILITY(U,$J,"OPT",1346,1,3,0)
 ;;=file.  These descriptions will be printed when you request a Templates
 ;;^UTILITY(U,$J,"OPT",1346,1,4,0)
 ;;=Only data dictionary listing.
 ;;^UTILITY(U,$J,"OPT",1346,20)
 ;;=S DI=8 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1346,"U")
 ;;=TEMPLATE EDIT
 ;;^UTILITY(U,$J,"OPT",1347,0)
 ;;=DIUNEDIT^Uneditable Data^^A^^^^^^^^^n^1^^
 ;;^UTILITY(U,$J,"OPT",1347,1,0)
 ;;=^^4^4^2890316^
 ;;^UTILITY(U,$J,"OPT",1347,1,1,0)
 ;;=The Uneditable Data sub-option of the Utility Functions option allows you
 ;;^UTILITY(U,$J,"OPT",1347,1,2,0)
 ;;=to specify a particular field that CANNOT be edited or deleted by a user.
 ;;^UTILITY(U,$J,"OPT",1347,1,3,0)
 ;;=If an uneditable data field is edited, VA FileMan will display the field
 ;;^UTILITY(U,$J,"OPT",1347,1,4,0)
 ;;=value along with one of the famous 'No Editing' messages.

DIINI002
DIINI002 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"OPT",1347,20)
 ;;=S DI=9 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1347,"U")
 ;;=UNEDITABLE DATA
 ;;^UTILITY(U,$J,"OPT",1348,0)
 ;;=DI SET MUMPS OS^Set Type of Mumps Operating System^^R^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1348,1,0)
 ;;=^^3^3^2880712^
 ;;^UTILITY(U,$J,"OPT",1348,1,1,0)
 ;;=This option allows the user to set the Type of Mumps Operating System.
 ;;^UTILITY(U,$J,"OPT",1348,1,2,0)
 ;;=VA FileMan uses this to perform operating system specific functions
 ;;^UTILITY(U,$J,"OPT",1348,1,3,0)
 ;;=such as determining routine existence or filing routines.
 ;;^UTILITY(U,$J,"OPT",1348,25)
 ;;=OS^DINIT
 ;;^UTILITY(U,$J,"OPT",1348,"U")
 ;;=SET TYPE OF MUMPS OPERATING SY
 ;;^UTILITY(U,$J,"OPT",1349,0)
 ;;=DI MGMT MENU^VA FileMan Management^^M^^XUMGR^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1349,10,0)
 ;;=^19.01PI^7^7
 ;;^UTILITY(U,$J,"OPT",1349,10,1,0)
 ;;=1348^^6
 ;;^UTILITY(U,$J,"OPT",1349,10,1,"^")
 ;;=DI SET MUMPS OS
 ;;^UTILITY(U,$J,"OPT",1349,10,2,0)
 ;;=1350^^5
 ;;^UTILITY(U,$J,"OPT",1349,10,2,"^")
 ;;=DI REINITIALIZE
 ;;^UTILITY(U,$J,"OPT",1349,10,3,0)
 ;;=1353^^1
 ;;^UTILITY(U,$J,"OPT",1349,10,3,"^")
 ;;=DI DD COMPILE
 ;;^UTILITY(U,$J,"OPT",1349,10,4,0)
 ;;=1351^^3
 ;;^UTILITY(U,$J,"OPT",1349,10,4,"^")
 ;;=DI PRINT COMPILE
 ;;^UTILITY(U,$J,"OPT",1349,10,5,0)
 ;;=1352^^2
 ;;^UTILITY(U,$J,"OPT",1349,10,5,"^")
 ;;=DI INPUT COMPILE
 ;;^UTILITY(U,$J,"OPT",1349,10,6,0)
 ;;=1371^^7
 ;;^UTILITY(U,$J,"OPT",1349,10,6,"^")
 ;;=DIWF
 ;;^UTILITY(U,$J,"OPT",1349,10,7,0)
 ;;=1392^^4
 ;;^UTILITY(U,$J,"OPT",1349,10,7,"^")
 ;;=DI SORT COMPILE
 ;;^UTILITY(U,$J,"OPT",1349,99)
 ;;=62819,35307
 ;;^UTILITY(U,$J,"OPT",1349,99.1)
 ;;=55799,10811
 ;;^UTILITY(U,$J,"OPT",1349,"U")
 ;;=VA FILEMAN MANAGEMENT
 ;;^UTILITY(U,$J,"OPT",1350,0)
 ;;=DI REINITIALIZE^Re-Initialize VA FileMan^^R^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1350,25)
 ;;=DINIT
 ;;^UTILITY(U,$J,"OPT",1350,"U")
 ;;=RE-INITIALIZE VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",1351,0)
 ;;=DI PRINT COMPILE^Print Template Compile/Uncompile^^R^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1351,1,0)
 ;;=^^1^1^2930715^^
 ;;^UTILITY(U,$J,"OPT",1351,1,1,0)
 ;;=This option allows the user to compile or uncompile a print template.
 ;;^UTILITY(U,$J,"OPT",1351,25)
 ;;=EN1^DIPZ
 ;;^UTILITY(U,$J,"OPT",1351,"U")
 ;;=PRINT TEMPLATE COMPILE/UNCOMPI
 ;;^UTILITY(U,$J,"OPT",1352,0)
 ;;=DI INPUT COMPILE^Input Template Compile/Uncompile^^A^^^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1352,1,0)
 ;;=^^1^1^2930715^^^^
 ;;^UTILITY(U,$J,"OPT",1352,1,1,0)
 ;;=This option allows the user to compile or uncompile an Input Template.
 ;;^UTILITY(U,$J,"OPT",1352,20)
 ;;=D EN1^DIEZ K DNM
 ;;^UTILITY(U,$J,"OPT",1352,"U")
 ;;=INPUT TEMPLATE COMPILE/UNCOMPI
 ;;^UTILITY(U,$J,"OPT",1353,0)
 ;;=DI DD COMPILE^Data Dictionary Cross-reference Compile/Uncompile^^R^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1353,1,0)
 ;;=^^3^3^2930715^^^^
 ;;^UTILITY(U,$J,"OPT",1353,1,1,0)
 ;;=This option allows the user to compile or uncompile a Data Dictionary's
 ;;^UTILITY(U,$J,"OPT",1353,1,2,0)
 ;;=cross-references into routines which are run whenever an entry
 ;;^UTILITY(U,$J,"OPT",1353,1,3,0)
 ;;=is indexed or deleted.
 ;;^UTILITY(U,$J,"OPT",1353,25)
 ;;=EN1^DIKZ
 ;;^UTILITY(U,$J,"OPT",1353,"U")
 ;;=DATA DICTIONARY CROSS-REFERENC
 ;;^UTILITY(U,$J,"OPT",1354,0)
 ;;=DIAUDIT^Audit Menu^^M^^XUAUDITING^^^^^^VA FILEMAN^^
 ;;^UTILITY(U,$J,"OPT",1354,1,0)
 ;;=^^2^2^3130126^
 ;;^UTILITY(U,$J,"OPT",1354,1,1,0)
 ;;=This menu contains the options that show which files and fields are being
 ;;^UTILITY(U,$J,"OPT",1354,1,2,0)
 ;;=audited as well as the options that purge audit trails.
 ;;^UTILITY(U,$J,"OPT",1354,10,0)
 ;;=^19.01IP^7^7
 ;;^UTILITY(U,$J,"OPT",1354,10,1,0)
 ;;=1355^^1
 ;;^UTILITY(U,$J,"OPT",1354,10,1,"^")
 ;;=DIAUDITED FIELDS
 ;;^UTILITY(U,$J,"OPT",1354,10,3,0)
 ;;=1357^^3
 ;;^UTILITY(U,$J,"OPT",1354,10,3,"^")
 ;;=DIAUDIT PURGE DATA
 ;;^UTILITY(U,$J,"OPT",1354,10,4,0)
 ;;=1358^^5
 ;;^UTILITY(U,$J,"OPT",1354,10,4,"^")
 ;;=DIAUDIT PURGE DD
 ;;^UTILITY(U,$J,"OPT",1354,10,5,0)
 ;;=1370^^2
 ;;^UTILITY(U,$J,"OPT",1354,10,5,"^")
 ;;=DIAUDIT TURN ON/OFF
 ;;^UTILITY(U,$J,"OPT",1354,10,6,0)
 ;;=11396^^4
 ;;^UTILITY(U,$J,"OPT",1354,10,6,"^")
 ;;=DIAUDIT SHOW DD AUDIT TRAIL
 ;;^UTILITY(U,$J,"OPT",1354,10,7,0)
 ;;=11388^^6
 ;;^UTILITY(U,$J,"OPT",1354,10,7,"^")
 ;;=DIAUDIT MONITOR USER
 ;;^UTILITY(U,$J,"OPT",1354,99)
 ;;=62849,43060
 ;;^UTILITY(U,$J,"OPT",1354,"U")
 ;;=AUDIT MENU
 ;;^UTILITY(U,$J,"OPT",1355,0)
 ;;=DIAUDITED FIELDS^List Fields Being Audited^^R^^^^^^^^VA FILEMAN^^
 ;;^UTILITY(U,$J,"OPT",1355,1,0)
 ;;=^^2^2^3130126^
 ;;^UTILITY(U,$J,"OPT",1355,1,1,0)
 ;;=This options lists all the fields that are being audited. One can see all
 ;;^UTILITY(U,$J,"OPT",1355,1,2,0)
 ;;=the fields or just those in a particular file range.
 ;;^UTILITY(U,$J,"OPT",1355,25)
 ;;=1^DIAU
 ;;^UTILITY(U,$J,"OPT",1355,"U")
 ;;=LIST FIELDS BEING AUDITED
 ;;^UTILITY(U,$J,"OPT",1357,0)
 ;;=DIAUDIT PURGE DATA^Data Audit Trail Purge^^R^^^^^^^^VA FILEMAN^^
 ;;^UTILITY(U,$J,"OPT",1357,1,0)
 ;;=^^4^4^3130126^
 ;;^UTILITY(U,$J,"OPT",1357,1,1,0)
 ;;=This option purges all or part of the data-audit trail for a particular
 ;;^UTILITY(U,$J,"OPT",1357,1,2,0)
 ;;=file. Either all of the data audits may be purged or part of the data
 ;;^UTILITY(U,$J,"OPT",1357,1,3,0)
 ;;=audits may be deleted based on a field in the audit file, e.g., date,
 ;;^UTILITY(U,$J,"OPT",1357,1,4,0)
 ;;=user, field.
 ;;^UTILITY(U,$J,"OPT",1357,25)
 ;;=3^DIAU
 ;;^UTILITY(U,$J,"OPT",1357,99.1)
 ;;=56123,39787
 ;;^UTILITY(U,$J,"OPT",1357,"U")
 ;;=DATA AUDIT TRAIL PURGE
 ;;^UTILITY(U,$J,"OPT",1358,0)
 ;;=DIAUDIT PURGE DD^DD Audit Trail Purge^^R^^^^^^^^VA FILEMAN^^
 ;;^UTILITY(U,$J,"OPT",1358,1,0)
 ;;=^^3^3^3130126^
 ;;^UTILITY(U,$J,"OPT",1358,1,1,0)
 ;;=This option purges all or part of the DD audit trail for a particular
 ;;^UTILITY(U,$J,"OPT",1358,1,2,0)
 ;;=file. Either all of the DD audits may be purged or part of it may be
 ;;^UTILITY(U,$J,"OPT",1358,1,3,0)
 ;;=deleted based on a field in the audit file, e.g., date, user, field.
 ;;^UTILITY(U,$J,"OPT",1358,25)
 ;;=5^DIAU
 ;;^UTILITY(U,$J,"OPT",1358,"U")
 ;;=DD AUDIT TRAIL PURGE
 ;;^UTILITY(U,$J,"OPT",1359,0)
 ;;=DIOTHER^Other Options^^M^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1359,1,0)
 ;;=^^3^3^2960724^^^^
 ;;^UTILITY(U,$J,"OPT",1359,1,1,0)
 ;;=This menu contains a series of menus which lead to enhancements in current
 ;;^UTILITY(U,$J,"OPT",1359,1,2,0)
 ;;=and coming versions.  These include auditing, filegrams, and FileMan 
 ;;^UTILITY(U,$J,"OPT",1359,1,3,0)
 ;;=management.
 ;;^UTILITY(U,$J,"OPT",1359,10,0)
 ;;=^19.01PI^9^9
 ;;^UTILITY(U,$J,"OPT",1359,10,1,0)
 ;;=1349^^5
 ;;^UTILITY(U,$J,"OPT",1359,10,1,"^")
 ;;=DI MGMT MENU
 ;;^UTILITY(U,$J,"OPT",1359,10,2,0)
 ;;=1354^^2
 ;;^UTILITY(U,$J,"OPT",1359,10,2,"^")
 ;;=DIAUDIT
 ;;^UTILITY(U,$J,"OPT",1359,10,3,0)
 ;;=1334^^4
 ;;^UTILITY(U,$J,"OPT",1359,10,3,"^")
 ;;=DISTATISTICS
 ;;^UTILITY(U,$J,"OPT",1359,10,4,0)
 ;;=1368^^1
 ;;^UTILITY(U,$J,"OPT",1359,10,4,"^")
 ;;=DIFG
 ;;^UTILITY(U,$J,"OPT",1359,10,5,0)
 ;;=1361^^3
 ;;^UTILITY(U,$J,"OPT",1359,10,5,"^")
 ;;=DDS SCREEN MENU
 ;;^UTILITY(U,$J,"OPT",1359,10,6,0)
 ;;=1380^^6
 ;;^UTILITY(U,$J,"OPT",1359,10,6,"^")
 ;;=DDXP EXPORT MENU
 ;;^UTILITY(U,$J,"OPT",1359,10,7,0)
 ;;=1381^^7
 ;;^UTILITY(U,$J,"OPT",1359,10,7,"^")
 ;;=DIAX EXTRACT MENU
 ;;^UTILITY(U,$J,"OPT",1359,10,8,0)
 ;;=1393^^9
 ;;^UTILITY(U,$J,"OPT",1359,10,8,"^")
 ;;=DDBROWSER
 ;;^UTILITY(U,$J,"OPT",1359,10,9,0)
 ;;=7716^^8
 ;;^UTILITY(U,$J,"OPT",1359,10,9,"^")
 ;;=DDMP IMPORT
 ;;^UTILITY(U,$J,"OPT",1359,99)
 ;;=62849,43060
 ;;^UTILITY(U,$J,"OPT",1359,"U")
 ;;=OTHER OPTIONS
 ;;^UTILITY(U,$J,"OPT",1360,0)
 ;;=DDS EDIT/CREATE A FORM^Edit/Create a Form^^R^^^^^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1360,1,0)
 ;;=^^2^2^2940630^
 ;;^UTILITY(U,$J,"OPT",1360,1,1,0)
 ;;=An option for editing and creating ScreenMan Forms.  This option calls the
 ;;^UTILITY(U,$J,"OPT",1360,1,2,0)
 ;;=Form Editor.
 ;;^UTILITY(U,$J,"OPT",1360,20)
 ;;=
 ;;^UTILITY(U,$J,"OPT",1360,25)
 ;;=DDGF
 ;;^UTILITY(U,$J,"OPT",1360,99)
 ;;=54872,31063
 ;;^UTILITY(U,$J,"OPT",1360,"U")
 ;;=EDIT/CREATE A FORM
 ;;^UTILITY(U,$J,"OPT",1361,0)
 ;;=DDS SCREEN MENU^ScreenMan^^M^^XUSCREENMAN^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1361,10,0)
 ;;=^19.01PI^4^4
 ;;^UTILITY(U,$J,"OPT",1361,10,1,0)
 ;;=1360^^1^Enter/Edit Screen Definition
 ;;^UTILITY(U,$J,"OPT",1361,10,1,"^")
 ;;=DDS EDIT/CREATE A FORM
 ;;^UTILITY(U,$J,"OPT",1361,10,2,0)
 ;;=1374^^2
 ;;^UTILITY(U,$J,"OPT",1361,10,2,"^")
 ;;=DDS RUN A FORM
 ;;^UTILITY(U,$J,"OPT",1361,10,3,0)
 ;;=1394^^3
 ;;^UTILITY(U,$J,"OPT",1361,10,3,"^")
 ;;=DDS DELETE A FORM
 ;;^UTILITY(U,$J,"OPT",1361,10,4,0)
 ;;=1395^^4
 ;;^UTILITY(U,$J,"OPT",1361,10,4,"^")
 ;;=DDS PURGE UNUSED BLOCKS
 ;;^UTILITY(U,$J,"OPT",1361,99)
 ;;=62819,35304
 ;;^UTILITY(U,$J,"OPT",1361,"U")
 ;;=SCREENMAN
 ;;^UTILITY(U,$J,"OPT",1362,0)
 ;;=DIFG CREATE^Create/Edit Filegram Template^^A^^XUFILEGRAM^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1362,1,0)
 ;;=^^4^4^2900124^
 ;;^UTILITY(U,$J,"OPT",1362,1,1,0)
 ;;=Use this option to create a filegram template or edit an existing
 ;;^UTILITY(U,$J,"OPT",1362,1,2,0)
 ;;=filegram template.  This option is the first step in developing a
 ;;^UTILITY(U,$J,"OPT",1362,1,3,0)
 ;;=filegram and is very important since there won't be filegrams without
 ;;^UTILITY(U,$J,"OPT",1362,1,4,0)
 ;;=this template.
 ;;^UTILITY(U,$J,"OPT",1362,20)
 ;;=S DI=1 D EN^DIFGO
 ;;^UTILITY(U,$J,"OPT",1362,"U")
 ;;=CREATE/EDIT FILEGRAM TEMPLATE
 ;;^UTILITY(U,$J,"OPT",1363,0)
 ;;=DIFG DISPLAY^Display Filegram Template^^A^^XUFILEGRAM^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1363,1,0)
 ;;=^^2^2^2900124^
 ;;^UTILITY(U,$J,"OPT",1363,1,1,0)
 ;;=Use this option to display the filegram template in a two-column
 ;;^UTILITY(U,$J,"OPT",1363,1,2,0)
 ;;=format (similar to FileMan's Inquire to File Entries option).
 ;;^UTILITY(U,$J,"OPT",1363,20)
 ;;=S DI=2 D EN^DIFGO
 ;;^UTILITY(U,$J,"OPT",1363,"U")
 ;;=DISPLAY FILEGRAM TEMPLATE
 ;;^UTILITY(U,$J,"OPT",1364,0)
 ;;=DIFG GENERATE^Generate Filegram^^A^^XUFILEGRAM^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1364,1,0)
 ;;=^^3^3^2900124^
 ;;^UTILITY(U,$J,"OPT",1364,1,1,0)
 ;;=Use this option to generate a filegram into a MailMan message after
 ;;^UTILITY(U,$J,"OPT",1364,1,2,0)
 ;;=selecting the file, filegram template and an entry.  It's a good idea
 ;;^UTILITY(U,$J,"OPT",1364,1,3,0)
 ;;=to know that information before using this option.
 ;;^UTILITY(U,$J,"OPT",1364,20)
 ;;=S DI=3 D EN^DIFGO
 ;;^UTILITY(U,$J,"OPT",1364,"U")
 ;;=GENERATE FILEGRAM
 ;;^UTILITY(U,$J,"OPT",1365,0)
 ;;=DIFG VIEW^View Filegram^^A^^^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1365,1,0)
 ;;=^^1^1^2900124^
 ;;^UTILITY(U,$J,"OPT",1365,1,1,0)
 ;;=Use this option to view the filegram in filegram format.
 ;;^UTILITY(U,$J,"OPT",1365,20)
 ;;=S DI=4 D EN^DIFGO
 ;;^UTILITY(U,$J,"OPT",1365,"U")
 ;;=VIEW FILEGRAM
 ;;^UTILITY(U,$J,"OPT",1366,0)
 ;;=DIFG SPECIFIERS^Specifiers^^A^^XUFILEGRAM^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1366,1,0)
 ;;=^^6^6^2900124^
 ;;^UTILITY(U,$J,"OPT",1366,1,1,0)
 ;;=Use this option to identify a particular field in the file as a
 ;;^UTILITY(U,$J,"OPT",1366,1,2,0)
 ;;=reference point for FileMan to use when installing the filegram.
 ;;^UTILITY(U,$J,"OPT",1366,1,3,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1366,1,4,0)
 ;;=Specifiers can be compared to FileMan's identifier, unlike identifiers
 ;;^UTILITY(U,$J,"OPT",1366,1,5,0)
 ;;=which are used for interaction purposes...specifiers are used for
 ;;^UTILITY(U,$J,"OPT",1366,1,6,0)
 ;;=transaction purposes.
 ;;^UTILITY(U,$J,"OPT",1366,20)
 ;;=S DI=5 D EN^DIFGO
 ;;^UTILITY(U,$J,"OPT",1366,"U")
 ;;=SPECIFIERS
 ;;^UTILITY(U,$J,"OPT",1367,0)
 ;;=DIFG INSTALL^Install/Verify Filegram^^A^^XUFILEGRAM^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1367,1,0)
 ;;=^^2^2^2900124^^
 ;;^UTILITY(U,$J,"OPT",1367,1,1,0)
 ;;=Use this option to install the filegram in a FileMan file
 ;;^UTILITY(U,$J,"OPT",1367,1,2,0)
 ;;=from a MailMan message format.  A message of verification should return.
 ;;^UTILITY(U,$J,"OPT",1367,20)
 ;;=S DI=6 D EN^DIFGO
 ;;^UTILITY(U,$J,"OPT",1367,"U")
 ;;=INSTALL/VERIFY FILEGRAM
 ;;^UTILITY(U,$J,"OPT",1368,0)
 ;;=DIFG^Filegrams^^M^^XUFILEGRAM^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1368,1,0)
 ;;=^^1^1^2900124^^^
 ;;^UTILITY(U,$J,"OPT",1368,1,1,0)
 ;;=This is a menu of the Filegram options.
 ;;^UTILITY(U,$J,"OPT",1368,10,0)
 ;;=^19.01PI^6^6
 ;;^UTILITY(U,$J,"OPT",1368,10,1,0)
 ;;=1362^^1
 ;;^UTILITY(U,$J,"OPT",1368,10,1,"^")
 ;;=DIFG CREATE
 ;;^UTILITY(U,$J,"OPT",1368,10,2,0)
 ;;=1363^^2
 ;;^UTILITY(U,$J,"OPT",1368,10,2,"^")
 ;;=DIFG DISPLAY
 ;;^UTILITY(U,$J,"OPT",1368,10,3,0)
 ;;=1364^^3
 ;;^UTILITY(U,$J,"OPT",1368,10,3,"^")
 ;;=DIFG GENERATE
 ;;^UTILITY(U,$J,"OPT",1368,10,4,0)
 ;;=1365^^4
 ;;^UTILITY(U,$J,"OPT",1368,10,4,"^")
 ;;=DIFG VIEW
 ;;^UTILITY(U,$J,"OPT",1368,10,5,0)
 ;;=1366^^5
 ;;^UTILITY(U,$J,"OPT",1368,10,5,"^")
 ;;=DIFG SPECIFIERS
 ;;^UTILITY(U,$J,"OPT",1368,10,6,0)
 ;;=1367^^6
 ;;^UTILITY(U,$J,"OPT",1368,10,6,"^")
 ;;=DIFG INSTALL
 ;;^UTILITY(U,$J,"OPT",1368,99)
 ;;=62819,35306
 ;;^UTILITY(U,$J,"OPT",1368,99.1)
 ;;=54674,36753
 ;;^UTILITY(U,$J,"OPT",1368,"U")
 ;;=FILEGRAMS
 ;;^UTILITY(U,$J,"OPT",1369,0)
 ;;=DIFIELD CHECK^Mandatory/Required Field Check^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1369,1,0)
 ;;=^^1^1^2901205^
 ;;^UTILITY(U,$J,"OPT",1369,1,1,0)
 ;;=Kernel option to emulate the VA FileMan option to check fields for required data.
 ;;^UTILITY(U,$J,"OPT",1369,20)
 ;;=S DI=10 G EN^DIU
 ;;^UTILITY(U,$J,"OPT",1369,"U")
 ;;=MANDATORY/REQUIRED FIELD CHECK
 ;;^UTILITY(U,$J,"OPT",1370,0)
 ;;=DIAUDIT TURN ON/OFF^Turn Data Audit On/Off^^R^^^^^^^^VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",1370,1,0)
 ;;=^^4^4^3130126^
 ;;^UTILITY(U,$J,"OPT",1370,1,1,0)
 ;;=This option lets the user start or stop an audit on a particular data
 ;;^UTILITY(U,$J,"OPT",1370,1,2,0)
 ;;=field. The user must have audit access to the file to turn an audit on or
 ;;^UTILITY(U,$J,"OPT",1370,1,3,0)
 ;;=off. No other attributes in the field definition can be affected by this
 ;;^UTILITY(U,$J,"OPT",1370,1,4,0)
 ;;=option.
 ;;^UTILITY(U,$J,"OPT",1370,25)
 ;;=2^DIAU
 ;;^UTILITY(U,$J,"OPT",1370,"U")
 ;;=TURN DATA AUDIT ON/OFF
 ;;^UTILITY(U,$J,"OPT",1371,0)
 ;;=DIWF^Forms Print^^R^^^^^^^^

DIINI003
DIINI003 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"OPT",1371,1,0)
 ;;=^^7^7^2901206^
 ;;^UTILITY(U,$J,"OPT",1371,1,1,0)
 ;;=This VA FileMan routine asks first for a 'document' file, which must be
 ;;^UTILITY(U,$J,"OPT",1371,1,2,0)
 ;;=a file that contains a word processing field at the first level.  It then
 ;;^UTILITY(U,$J,"OPT",1371,1,3,0)
 ;;=asks the user to choose an entry in that file for which the word
 ;;^UTILITY(U,$J,"OPT",1371,1,4,0)
 ;;=processing field has some text on file.  It then uses that text as a 
 ;;^UTILITY(U,$J,"OPT",1371,1,5,0)
 ;;='print template' for a file.  If the chosen document entry has a pointer
 ;;^UTILITY(U,$J,"OPT",1371,1,6,0)
 ;;=to a file, that file is automatically the one from which the printing
 ;;^UTILITY(U,$J,"OPT",1371,1,7,0)
 ;;=is done.
 ;;^UTILITY(U,$J,"OPT",1371,25)
 ;;=DIWF
 ;;^UTILITY(U,$J,"OPT",1371,"U")
 ;;=FORMS PRINT
 ;;^UTILITY(U,$J,"OPT",1372,0)
 ;;=DI DDUCHK^Check/Fix DD Structure^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1372,1,0)
 ;;=^^4^4^2930125^
 ;;^UTILITY(U,$J,"OPT",1372,1,1,0)
 ;;=This option looks at the internal structure of files and subfiles
 ;;^UTILITY(U,$J,"OPT",1372,1,2,0)
 ;;=and determines if there are inconsistencies or conflicts between the
 ;;^UTILITY(U,$J,"OPT",1372,1,3,0)
 ;;=information in the data dictionary and the structure of the file's global
 ;;^UTILITY(U,$J,"OPT",1372,1,4,0)
 ;;=nodes.  This option will note them and fix or delete the incorrect nodes.
 ;;^UTILITY(U,$J,"OPT",1372,25)
 ;;=DDUCHK
 ;;^UTILITY(U,$J,"OPT",1372,"U")
 ;;=CHECK/FIX DD STRUCTURE
 ;;^UTILITY(U,$J,"OPT",1373,0)
 ;;=DI DDU^Data Dictionary Utilities^^M^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1373,10,0)
 ;;=^19.01PI^3^3
 ;;^UTILITY(U,$J,"OPT",1373,10,1,0)
 ;;=1335^^1
 ;;^UTILITY(U,$J,"OPT",1373,10,1,"^")
 ;;=DILIST
 ;;^UTILITY(U,$J,"OPT",1373,10,2,0)
 ;;=1338^^2
 ;;^UTILITY(U,$J,"OPT",1373,10,2,"^")
 ;;=DI DDMAP
 ;;^UTILITY(U,$J,"OPT",1373,10,3,0)
 ;;=1372^^3
 ;;^UTILITY(U,$J,"OPT",1373,10,3,"^")
 ;;=DI DDUCHK
 ;;^UTILITY(U,$J,"OPT",1373,99)
 ;;=62819,35306
 ;;^UTILITY(U,$J,"OPT",1373,"U")
 ;;=DATA DICTIONARY UTILITIES
 ;;^UTILITY(U,$J,"OPT",1374,0)
 ;;=DDS RUN A FORM^Run a Form^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1374,1,0)
 ;;=^^1^1^2940701^^
 ;;^UTILITY(U,$J,"OPT",1374,1,1,0)
 ;;=Option to run a form.
 ;;^UTILITY(U,$J,"OPT",1374,20)
 ;;=D ^DDSRUN
 ;;^UTILITY(U,$J,"OPT",1374,99.1)
 ;;=56123,39787
 ;;^UTILITY(U,$J,"OPT",1374,"U")
 ;;=RUN A FORM
 ;;^UTILITY(U,$J,"OPT",1375,0)
 ;;=DIFG-SRV-HISTORY^Server to Load a Message into the FG History File^^S^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1375,1,0)
 ;;=^^2^2^2920420^
 ;;^UTILITY(U,$J,"OPT",1375,1,1,0)
 ;;=This option is a SERVER that will take a message and add it to the 
 ;;^UTILITY(U,$J,"OPT",1375,1,2,0)
 ;;=Filegram History file so that it can be installed.
 ;;^UTILITY(U,$J,"OPT",1375,3.91,0)
 ;;=^19.391^^0
 ;;^UTILITY(U,$J,"OPT",1375,25)
 ;;=HIST^DIFGSRV
 ;;^UTILITY(U,$J,"OPT",1375,220)
 ;;=^R^^N^N^N
 ;;^UTILITY(U,$J,"OPT",1375,"U")
 ;;=SERVER TO LOAD A MESSAGE INTO 
 ;;^UTILITY(U,$J,"OPT",1376,0)
 ;;=DDXP DEFINE FORMAT^Define Foreign File Format^^A^^DDXP-DEFINE^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1376,1,0)
 ;;=^^5^5^2930108^
 ;;^UTILITY(U,$J,"OPT",1376,1,1,0)
 ;;=Use this option to define formats.  Formats are entries in the Foreign
 ;;^UTILITY(U,$J,"OPT",1376,1,2,0)
 ;;=Format file.  They are used to control the exporting of data to a
 ;;^UTILITY(U,$J,"OPT",1376,1,3,0)
 ;;=non-MUMPS application.  You can alter an existing format only before it has
 ;;^UTILITY(U,$J,"OPT",1376,1,4,0)
 ;;=been used to create an Export template.  After it has been used, you can
 ;;^UTILITY(U,$J,"OPT",1376,1,5,0)
 ;;=clone a format.  This option is locked with the DDXP-DEFINE key.
 ;;^UTILITY(U,$J,"OPT",1376,20)
 ;;=D 1^DDXP
 ;;^UTILITY(U,$J,"OPT",1376,"U")
 ;;=DEFINE FOREIGN FILE FORMAT
 ;;^UTILITY(U,$J,"OPT",1377,0)
 ;;=DDXP SELECT EXPORT FIELDS^Select Fields for Export^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1377,1,0)
 ;;=^^1^1^2921207^^
 ;;^UTILITY(U,$J,"OPT",1377,1,1,0)
 ;;=Use this option to choose fields to be exported.
 ;;^UTILITY(U,$J,"OPT",1377,20)
 ;;=D 2^DDXP
 ;;^UTILITY(U,$J,"OPT",1377,"U")
 ;;=SELECT FIELDS FOR EXPORT
 ;;^UTILITY(U,$J,"OPT",1378,0)
 ;;=DDXP CREATE EXPORT TEMPLATE^Create Export Template^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1378,1,0)
 ;;=^^2^2^2940519^^^
 ;;^UTILITY(U,$J,"OPT",1378,1,1,0)
 ;;=This option creates an Export template by applying the specifications in a
 ;;^UTILITY(U,$J,"OPT",1378,1,2,0)
 ;;=Foreign Format with the fields in a Selected Fields for Export template.
 ;;^UTILITY(U,$J,"OPT",1378,20)
 ;;=D 3^DDXP
 ;;^UTILITY(U,$J,"OPT",1378,"U")
 ;;=CREATE EXPORT TEMPLATE
 ;;^UTILITY(U,$J,"OPT",1379,0)
 ;;=DDXP EXPORT DATA^Export Data^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1379,1,0)
 ;;=^^4^4^2921207^^
 ;;^UTILITY(U,$J,"OPT",1379,1,1,0)
 ;;=This option sends data to a specified device for export to a foreign
 ;;^UTILITY(U,$J,"OPT",1379,1,2,0)
 ;;=application.  You have the opportunity to choose entries for export with
 ;;^UTILITY(U,$J,"OPT",1379,1,3,0)
 ;;=VA FileMan's Search dialogue.  You use an Export template to control the
 ;;^UTILITY(U,$J,"OPT",1379,1,4,0)
 ;;=export.
 ;;^UTILITY(U,$J,"OPT",1379,20)
 ;;=D 4^DDXP
 ;;^UTILITY(U,$J,"OPT",1379,"U")
 ;;=EXPORT DATA
 ;;^UTILITY(U,$J,"OPT",1380,0)
 ;;=DDXP EXPORT MENU^Data Export to Foreign Format^^M^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1380,1,0)
 ;;=^^1^1^2960722^^
 ;;^UTILITY(U,$J,"OPT",1380,1,1,0)
 ;;=Submenu for the Export tool.
 ;;^UTILITY(U,$J,"OPT",1380,10,0)
 ;;=^19.01PI^5^5
 ;;^UTILITY(U,$J,"OPT",1380,10,1,0)
 ;;=1376^^1
 ;;^UTILITY(U,$J,"OPT",1380,10,1,"^")
 ;;=DDXP DEFINE FORMAT
 ;;^UTILITY(U,$J,"OPT",1380,10,2,0)
 ;;=1377^^2
 ;;^UTILITY(U,$J,"OPT",1380,10,2,"^")
 ;;=DDXP SELECT EXPORT FIELDS
 ;;^UTILITY(U,$J,"OPT",1380,10,3,0)
 ;;=1378^^3
 ;;^UTILITY(U,$J,"OPT",1380,10,3,"^")
 ;;=DDXP CREATE EXPORT TEMPLATE
 ;;^UTILITY(U,$J,"OPT",1380,10,4,0)
 ;;=1379^^4
 ;;^UTILITY(U,$J,"OPT",1380,10,4,"^")
 ;;=DDXP EXPORT DATA
 ;;^UTILITY(U,$J,"OPT",1380,10,5,0)
 ;;=1391^^5
 ;;^UTILITY(U,$J,"OPT",1380,10,5,"^")
 ;;=DDXP FORMAT DOCUMENTATION
 ;;^UTILITY(U,$J,"OPT",1380,99)
 ;;=62819,35304
 ;;^UTILITY(U,$J,"OPT",1380,"U")
 ;;=DATA EXPORT TO FOREIGN FORMAT
 ;;^UTILITY(U,$J,"OPT",1381,0)
 ;;=DIAX EXTRACT MENU^Extract Data To Fileman File^^M^^DIEXTRACT^^^^^^^^^1^^
 ;;^UTILITY(U,$J,"OPT",1381,1,0)
 ;;=^^2^2^2921222^^^^
 ;;^UTILITY(U,$J,"OPT",1381,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1381,1,2,0)
 ;;=This is a menu of the tool for extracting data to Fileman file.
 ;;^UTILITY(U,$J,"OPT",1381,10,0)
 ;;=^19.01PI^9^9
 ;;^UTILITY(U,$J,"OPT",1381,10,1,0)
 ;;=1382^^1
 ;;^UTILITY(U,$J,"OPT",1381,10,1,"^")
 ;;=DIAX SELECT
 ;;^UTILITY(U,$J,"OPT",1381,10,2,0)
 ;;=1383^^2
 ;;^UTILITY(U,$J,"OPT",1381,10,2,"^")
 ;;=DIAX ADD/DELETE
 ;;^UTILITY(U,$J,"OPT",1381,10,3,0)
 ;;=1384^^3
 ;;^UTILITY(U,$J,"OPT",1381,10,3,"^")
 ;;=DIAX PRINT
 ;;^UTILITY(U,$J,"OPT",1381,10,4,0)
 ;;=1385^^4
 ;;^UTILITY(U,$J,"OPT",1381,10,4,"^")
 ;;=DIAX MODIFY
 ;;^UTILITY(U,$J,"OPT",1381,10,5,0)
 ;;=1386^^5
 ;;^UTILITY(U,$J,"OPT",1381,10,5,"^")
 ;;=DIAX CREATE
 ;;^UTILITY(U,$J,"OPT",1381,10,6,0)
 ;;=1387^^6
 ;;^UTILITY(U,$J,"OPT",1381,10,6,"^")
 ;;=DIAX UPDATE
 ;;^UTILITY(U,$J,"OPT",1381,10,7,0)
 ;;=1388^^7
 ;;^UTILITY(U,$J,"OPT",1381,10,7,"^")
 ;;=DIAX PURGE
 ;;^UTILITY(U,$J,"OPT",1381,10,8,0)
 ;;=1389^^7
 ;;^UTILITY(U,$J,"OPT",1381,10,8,"^")
 ;;=DIAX CANCEL
 ;;^UTILITY(U,$J,"OPT",1381,10,9,0)
 ;;=1390^^8
 ;;^UTILITY(U,$J,"OPT",1381,10,9,"^")
 ;;=DIAX VALIDATE
 ;;^UTILITY(U,$J,"OPT",1381,15)
 ;;=K DIAX
 ;;^UTILITY(U,$J,"OPT",1381,99)
 ;;=62819,35305
 ;;^UTILITY(U,$J,"OPT",1381,"U")
 ;;=EXTRACT DATA TO FILEMAN FILE
 ;;^UTILITY(U,$J,"OPT",1382,0)
 ;;=DIAX SELECT^Select Entries to Extract^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1382,1,0)
 ;;=^^5^5^2921222^
 ;;^UTILITY(U,$J,"OPT",1382,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1382,1,2,0)
 ;;=Use this option to specify the criteria that would select Fileman entries
 ;;^UTILITY(U,$J,"OPT",1382,1,3,0)
 ;;=to extract.  This is the first step in developing an extract activity and
 ;;^UTILITY(U,$J,"OPT",1382,1,4,0)
 ;;=is important since there cannot be any extract process without the search
 ;;^UTILITY(U,$J,"OPT",1382,1,5,0)
 ;;=template created in this option.
 ;;^UTILITY(U,$J,"OPT",1382,20)
 ;;=S DI=1 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1382,"U")
 ;;=SELECT ENTRIES TO EXTRACT
 ;;^UTILITY(U,$J,"OPT",1383,0)
 ;;=DIAX ADD/DELETE^Add/Delete Selected Entries^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1383,1,0)
 ;;=^^3^3^2921222^
 ;;^UTILITY(U,$J,"OPT",1383,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1383,1,2,0)
 ;;=Use this option to edit the list of selected entries to extract by adding
 ;;^UTILITY(U,$J,"OPT",1383,1,3,0)
 ;;=needed entries or by deleting undesired ones.
 ;;^UTILITY(U,$J,"OPT",1383,20)
 ;;=S DI=2 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1383,"U")
 ;;=ADD/DELETE SELECTED ENTRIES
 ;;^UTILITY(U,$J,"OPT",1384,0)
 ;;=DIAX PRINT^Print Selected Entries^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1384,1,0)
 ;;=^^3^3^2921222^
 ;;^UTILITY(U,$J,"OPT",1384,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1384,1,2,0)
 ;;=Use this option to display the list of entries selected for extract.  This
 ;;^UTILITY(U,$J,"OPT",1384,1,3,0)
 ;;=option uses the standard VA Fileman interface for printing.
 ;;^UTILITY(U,$J,"OPT",1384,20)
 ;;=S DI=3 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1384,"U")
 ;;=PRINT SELECTED ENTRIES
 ;;^UTILITY(U,$J,"OPT",1385,0)
 ;;=DIAX MODIFY^Modify Destination File^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1385,1,0)
 ;;=^^3^3^2921222^
 ;;^UTILITY(U,$J,"OPT",1385,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1385,1,2,0)
 ;;=Use this option to create a destination file that will hold the data
 ;;^UTILITY(U,$J,"OPT",1385,1,3,0)
 ;;=extracted from the source entries.
 ;;^UTILITY(U,$J,"OPT",1385,20)
 ;;=S DI=4 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1385,"U")
 ;;=MODIFY DESTINATION FILE
 ;;^UTILITY(U,$J,"OPT",1386,0)
 ;;=DIAX CREATE^Create Extract Template^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1386,1,0)
 ;;=^^4^4^2930104^
 ;;^UTILITY(U,$J,"OPT",1386,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1386,1,2,0)
 ;;=Use this option to identify the fields to be extracted from the source
 ;;^UTILITY(U,$J,"OPT",1386,1,3,0)
 ;;=file and the fields in the destination file where the extracted data will
 ;;^UTILITY(U,$J,"OPT",1386,1,4,0)
 ;;=be stored.
 ;;^UTILITY(U,$J,"OPT",1386,20)
 ;;=S DI=5 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1386,"U")
 ;;=CREATE EXTRACT TEMPLATE
 ;;^UTILITY(U,$J,"OPT",1387,0)
 ;;=DIAX UPDATE^Update Destination File^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1387,1,0)
 ;;=^^3^3^2921222^
 ;;^UTILITY(U,$J,"OPT",1387,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1387,1,2,0)
 ;;=Use this option to extract data from the source file and move it to the
 ;;^UTILITY(U,$J,"OPT",1387,1,3,0)
 ;;=destination file.
 ;;^UTILITY(U,$J,"OPT",1387,20)
 ;;=S DI=6 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1387,"U")
 ;;=UPDATE DESTINATION FILE
 ;;^UTILITY(U,$J,"OPT",1388,0)
 ;;=DIAX PURGE^Purge Extracted Entries^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1388,1,0)
 ;;=^^2^2^2921222^
 ;;^UTILITY(U,$J,"OPT",1388,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1388,1,2,0)
 ;;=Use this option to delete the extracted data from the primary file.
 ;;^UTILITY(U,$J,"OPT",1388,20)
 ;;=S DI=7 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1388,"U")
 ;;=PURGE EXTRACTED ENTRIES
 ;;^UTILITY(U,$J,"OPT",1389,0)
 ;;=DIAX CANCEL^Cancel Extract Selection^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1389,1,0)
 ;;=^^3^3^2921222^
 ;;^UTILITY(U,$J,"OPT",1389,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1389,1,2,0)
 ;;=Use this option to cancel an extract activity any time before the selected
 ;;^UTILITY(U,$J,"OPT",1389,1,3,0)
 ;;=entries in the primary file are purged.
 ;;^UTILITY(U,$J,"OPT",1389,20)
 ;;=S DI=8 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1389,"U")
 ;;=CANCEL EXTRACT SELECTION
 ;;^UTILITY(U,$J,"OPT",1390,0)
 ;;=DIAX VALIDATE^Validate Extract Template^^A^^DIEXTRACT^^^^^^^^1^^^
 ;;^UTILITY(U,$J,"OPT",1390,1,0)
 ;;=^^3^3^2930104^
 ;;^UTILITY(U,$J,"OPT",1390,1,1,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",1390,1,2,0)
 ;;=Use this option to verify the compatibility between fields to be extracted
 ;;^UTILITY(U,$J,"OPT",1390,1,3,0)
 ;;=and their corresponding destination fields in the destination file.
 ;;^UTILITY(U,$J,"OPT",1390,20)
 ;;=S DI=9 D EN^DIAX
 ;;^UTILITY(U,$J,"OPT",1390,"U")
 ;;=VALIDATE EXTRACT TEMPLATE
 ;;^UTILITY(U,$J,"OPT",1391,0)
 ;;=DDXP FORMAT DOCUMENTATION^Print Format Documentation^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",1391,1,0)
 ;;=^^2^2^2921207^^
 ;;^UTILITY(U,$J,"OPT",1391,1,1,0)
 ;;=Use this option ot print documentation for existing entries in the Foreign
 ;;^UTILITY(U,$J,"OPT",1391,1,2,0)
 ;;=Format file.
 ;;^UTILITY(U,$J,"OPT",1391,20)
 ;;=D 5^DDXP
 ;;^UTILITY(U,$J,"OPT",1391,"U")
 ;;=PRINT FORMAT DOCUMENTATION
 ;;^UTILITY(U,$J,"OPT",1392,0)
 ;;=DI SORT COMPILE^Sort Template Compile/Uncompile^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1392,1,0)
 ;;=^^3^3^2930715^^
 ;;^UTILITY(U,$J,"OPT",1392,1,1,0)
 ;;=This option allows the user to mark a Sort Template compiled or uncompiled.
 ;;^UTILITY(U,$J,"OPT",1392,1,2,0)
 ;;=The actual routine compilation occurs when the template is used during
 ;;^UTILITY(U,$J,"OPT",1392,1,3,0)
 ;;=FileMan Sort/Print.
 ;;^UTILITY(U,$J,"OPT",1392,25)
 ;;=EN1^DIOZ
 ;;^UTILITY(U,$J,"OPT",1392,"U")
 ;;=SORT TEMPLATE COMPILE/UNCOMPIL
 ;;^UTILITY(U,$J,"OPT",1393,0)
 ;;=DDBROWSER^Browser^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1393,1,0)
 ;;=^^3^3^2940519^
 ;;^UTILITY(U,$J,"OPT",1393,1,1,0)
 ;;=Prompts user to select file, word processing field and entry.
 ;;^UTILITY(U,$J,"OPT",1393,1,2,0)
 ;;=The text is then displayed to the screen, allowing the user to
 ;;^UTILITY(U,$J,"OPT",1393,1,3,0)
 ;;=navigate through the document.
 ;;^UTILITY(U,$J,"OPT",1393,25)
 ;;=DDBR
 ;;^UTILITY(U,$J,"OPT",1393,99.1)
 ;;=56123,39787
 ;;^UTILITY(U,$J,"OPT",1393,"U")
 ;;=BROWSER
 ;;^UTILITY(U,$J,"OPT",1394,0)
 ;;=DDS DELETE A FORM^Delete a Form^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1394,1,0)
 ;;=^^1^1^2940630^^
 ;;^UTILITY(U,$J,"OPT",1394,1,1,0)
 ;;=An option to delete a form.
 ;;^UTILITY(U,$J,"OPT",1394,25)
 ;;=DDSDFRM
 ;;^UTILITY(U,$J,"OPT",1394,99.1)
 ;;=56123,39787

DIINI004
DIINI004 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"OPT",1394,"U")
 ;;=DELETE A FORM
 ;;^UTILITY(U,$J,"OPT",1395,0)
 ;;=DDS PURGE UNUSED BLOCKS^Purge Unused Blocks^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",1395,1,0)
 ;;=^^3^3^2940630^
 ;;^UTILITY(U,$J,"OPT",1395,1,1,0)
 ;;=An option to delete blocks that aren't used on any forms.  This option
 ;;^UTILITY(U,$J,"OPT",1395,1,2,0)
 ;;=prompts for file, and searches the Block File for all blocks that are
 ;;^UTILITY(U,$J,"OPT",1395,1,3,0)
 ;;=associated with that file and that aren't used on any forms.
 ;;^UTILITY(U,$J,"OPT",1395,25)
 ;;=DDSDBLK
 ;;^UTILITY(U,$J,"OPT",1395,99.1)
 ;;=56123,39787
 ;;^UTILITY(U,$J,"OPT",1395,"U")
 ;;=PURGE UNUSED BLOCKS
 ;;^UTILITY(U,$J,"OPT",7716,0)
 ;;=DDMP IMPORT^Import Data^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",7716,1,0)
 ;;=^^2^2^2960724^^^^
 ;;^UTILITY(U,$J,"OPT",7716,1,1,0)
 ;;=This option gathers specification from the user for the import of data from 
 ;;^UTILITY(U,$J,"OPT",7716,1,2,0)
 ;;=a host ascii file.  The import is done and a report generated.
 ;;^UTILITY(U,$J,"OPT",7716,25)
 ;;=EN^DDMPU
 ;;^UTILITY(U,$J,"OPT",7716,"U")
 ;;=IMPORT DATA
 ;;^UTILITY(U,$J,"OPT",8012,0)
 ;;=DMSQ PROJECT^Regenerate SQLI Projection^^R^^XUPROGMODE^^^^^^VA FILEMAN^^1^1
 ;;^UTILITY(U,$J,"OPT",8012,1,0)
 ;;=^^17^17^2971026^^^^
 ;;^UTILITY(U,$J,"OPT",8012,1,1,0)
 ;;=Regenerates the SQLI projection of VA FileMan data dictionaries. The
 ;;^UTILITY(U,$J,"OPT",8012,1,2,0)
 ;;=regeneration process:
 ;;^UTILITY(U,$J,"OPT",8012,1,3,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8012,1,4,0)
 ;;=  1. Purges existing information in SQLI data files.
 ;;^UTILITY(U,$J,"OPT",8012,1,5,0)
 ;;=  2. Projects the data dictionaries for all VA FileMan files.
 ;;^UTILITY(U,$J,"OPT",8012,1,6,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8012,1,7,0)
 ;;=Before running this option, the SQLI_KEY_WORD file should be populated
 ;;^UTILITY(U,$J,"OPT",8012,1,8,0)
 ;;=with all SQL, ODBC, and vendor-specific keywords that should not be used
 ;;^UTILITY(U,$J,"OPT",8012,1,9,0)
 ;;=in SQLI entity naming.
 ;;^UTILITY(U,$J,"OPT",8012,1,10,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8012,1,11,0)
 ;;=This option requires programmer mode as well as the progmode key.
 ;;^UTILITY(U,$J,"OPT",8012,1,12,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8012,1,13,0)
 ;;=This option may also be used as a skeleton for one that you may want
 ;;^UTILITY(U,$J,"OPT",8012,1,14,0)
 ;;=to create locally.  Your local option could include the vendor's
 ;;^UTILITY(U,$J,"OPT",8012,1,15,0)
 ;;=keyword call in the Entry Action and the vendor's mapping call in the
 ;;^UTILITY(U,$J,"OPT",8012,1,16,0)
 ;;=Exit Action.  A status variable could be used to confirm that the
 ;;^UTILITY(U,$J,"OPT",8012,1,17,0)
 ;;=SQLI projection completes before the vendor mapping is initiated.
 ;;^UTILITY(U,$J,"OPT",8012,15)
 ;;=;vendor's mapper call could go here
 ;;^UTILITY(U,$J,"OPT",8012,20)
 ;;=;vendor's keyword call could go here
 ;;^UTILITY(U,$J,"OPT",8012,25)
 ;;=SETUP^DMSQ
 ;;^UTILITY(U,$J,"OPT",8012,200.9)
 ;;=y
 ;;^UTILITY(U,$J,"OPT",8012,"U")
 ;;=REGENERATE SQLI PROJECTION
 ;;^UTILITY(U,$J,"OPT",8013,0)
 ;;=DMSQ MENU^SQLI (VA FileMan)^^M^^^^^^^^VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",8013,1,0)
 ;;=^^1^1^2970806^^^^
 ;;^UTILITY(U,$J,"OPT",8013,1,1,0)
 ;;=This is the main menu for all VA FileMan SQLI (SQL Interface) options.
 ;;^UTILITY(U,$J,"OPT",8013,10,0)
 ;;=^19.01PI^8^7
 ;;^UTILITY(U,$J,"OPT",8013,10,1,0)
 ;;=8012^RUN^10
 ;;^UTILITY(U,$J,"OPT",8013,10,1,"^")
 ;;=DMSQ PROJECT
 ;;^UTILITY(U,$J,"OPT",8013,10,2,0)
 ;;=8014^X^30
 ;;^UTILITY(U,$J,"OPT",8013,10,2,"^")
 ;;=DMSQ PURGE
 ;;^UTILITY(U,$J,"OPT",8013,10,4,0)
 ;;=8015^ERR^20
 ;;^UTILITY(U,$J,"OPT",8013,10,4,"^")
 ;;=DMSQ PRINT ERRORS
 ;;^UTILITY(U,$J,"OPT",8013,10,5,0)
 ;;=8016^CNTS^50
 ;;^UTILITY(U,$J,"OPT",8013,10,5,"^")
 ;;=DMSQ PS MENU
 ;;^UTILITY(U,$J,"OPT",8013,10,6,0)
 ;;=8034^DD^40
 ;;^UTILITY(U,$J,"OPT",8013,10,6,"^")
 ;;=DMSQ TS MENU
 ;;^UTILITY(U,$J,"OPT",8013,10,7,0)
 ;;=8035^GRP^60
 ;;^UTILITY(U,$J,"OPT",8013,10,7,"^")
 ;;=DMSQ SUGGEST TABLE GROUPINGS
 ;;^UTILITY(U,$J,"OPT",8013,10,8,0)
 ;;=8037^WHY^15
 ;;^UTILITY(U,$J,"OPT",8013,10,8,"^")
 ;;=DMSQ DIAGNOSTICS
 ;;^UTILITY(U,$J,"OPT",8013,99)
 ;;=62819,35307
 ;;^UTILITY(U,$J,"OPT",8013,99.1)
 ;;=57215,42037
 ;;^UTILITY(U,$J,"OPT",8013,"U")
 ;;=SQLI (VA FILEMAN)
 ;;^UTILITY(U,$J,"OPT",8014,0)
 ;;=DMSQ PURGE^Purge SQLI Data^^R^^XUPROGMODE^^^^^^VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",8014,1,0)
 ;;=^^23^23^2970806^^^^
 ;;^UTILITY(U,$J,"OPT",8014,1,1,0)
 ;;=This option purges the SQLI projection of VA FileMan data dictionaries.
 ;;^UTILITY(U,$J,"OPT",8014,1,2,0)
 ;;=Use this option if you have previously projected your VA FileMan data
 ;;^UTILITY(U,$J,"OPT",8014,1,3,0)
 ;;=dictionaries for use by an M-to-SQL product, but no longer wish to. All
 ;;^UTILITY(U,$J,"OPT",8014,1,4,0)
 ;;=data in the following files are purged:
 ;;^UTILITY(U,$J,"OPT",8014,1,5,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8014,1,6,0)
 ;;=  SQLI_COLUMN
 ;;^UTILITY(U,$J,"OPT",8014,1,7,0)
 ;;=  SQLI_DATA_TYPE
 ;;^UTILITY(U,$J,"OPT",8014,1,8,0)
 ;;=  SQLI_DOMAIN
 ;;^UTILITY(U,$J,"OPT",8014,1,9,0)
 ;;=  SQLI_ERROR_LOG
 ;;^UTILITY(U,$J,"OPT",8014,1,10,0)
 ;;=  SQLI_ERROR_TEXT
 ;;^UTILITY(U,$J,"OPT",8014,1,11,0)
 ;;=  SQLI_FOREIGN_KEY
 ;;^UTILITY(U,$J,"OPT",8014,1,12,0)
 ;;=  SQLI_KEY_FORMAT
 ;;^UTILITY(U,$J,"OPT",8014,1,13,0)
 ;;=  SQLI_OUTPUT_FORMAT
 ;;^UTILITY(U,$J,"OPT",8014,1,14,0)
 ;;=  SQLI_PRIMARY_KEY
 ;;^UTILITY(U,$J,"OPT",8014,1,15,0)
 ;;=  SQLI_SCHEMA
 ;;^UTILITY(U,$J,"OPT",8014,1,16,0)
 ;;=  SQLI_TABLE
 ;;^UTILITY(U,$J,"OPT",8014,1,17,0)
 ;;=  SQLI_TABLE_ELEMENT
 ;;^UTILITY(U,$J,"OPT",8014,1,18,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8014,1,19,0)
 ;;=Data is not purged from the following SQLI file, however:
 ;;^UTILITY(U,$J,"OPT",8014,1,20,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8014,1,21,0)
 ;;=  SQLI_KEY_WORD
 ;;^UTILITY(U,$J,"OPT",8014,1,22,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8014,1,23,0)
 ;;=This option requires programmer mode as well as the progmode key.
 ;;^UTILITY(U,$J,"OPT",8014,25)
 ;;=PURGE^DMSQ
 ;;^UTILITY(U,$J,"OPT",8014,99)
 ;;=57167,30963
 ;;^UTILITY(U,$J,"OPT",8014,"U")
 ;;=PURGE SQLI DATA
 ;;^UTILITY(U,$J,"OPT",8015,0)
 ;;=DMSQ PRINT ERRORS^Print Errors from Last Projection^^R^^^^^^^^VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",8015,1,0)
 ;;=^^2^2^2970718^^
 ;;^UTILITY(U,$J,"OPT",8015,1,1,0)
 ;;=Lists errors, sorted by category, generated by the most recent SQLI
 ;;^UTILITY(U,$J,"OPT",8015,1,2,0)
 ;;=projection run.
 ;;^UTILITY(U,$J,"OPT",8015,25)
 ;;=MAIN^DMSQE
 ;;^UTILITY(U,$J,"OPT",8015,"U")
 ;;=PRINT ERRORS FROM LAST PROJECT
 ;;^UTILITY(U,$J,"OPT",8016,0)
 ;;=DMSQ PS MENU^Site Statistics Reports^^M^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8016,1,0)
 ;;=^^2^2^2970805^
 ;;^UTILITY(U,$J,"OPT",8016,1,1,0)
 ;;=This is a menu of reports that show counts of tables and columns for
 ;;^UTILITY(U,$J,"OPT",8016,1,2,0)
 ;;=this site (where SQLI is installed).
 ;;^UTILITY(U,$J,"OPT",8016,10,0)
 ;;=^19.01PI^9^9
 ;;^UTILITY(U,$J,"OPT",8016,10,1,0)
 ;;=8017^TBL^10
 ;;^UTILITY(U,$J,"OPT",8016,10,1,"^")
 ;;=DMSQ PS TOTAL TABLES
 ;;^UTILITY(U,$J,"OPT",8016,10,2,0)
 ;;=8018^1C^20
 ;;^UTILITY(U,$J,"OPT",8016,10,2,"^")
 ;;=DMSQ PS TOTAL COLUMNS
 ;;^UTILITY(U,$J,"OPT",8016,10,3,0)
 ;;=8019^INDX^30
 ;;^UTILITY(U,$J,"OPT",8016,10,3,"^")
 ;;=DMSQ PS TOTAL INDEXES
 ;;^UTILITY(U,$J,"OPT",8016,10,4,0)
 ;;=8020^ELEM^40
 ;;^UTILITY(U,$J,"OPT",8016,10,4,"^")
 ;;=DMSQ PS TOTAL TABLE ELEMENTS
 ;;^UTILITY(U,$J,"OPT",8016,10,5,0)
 ;;=8021^2C^50
 ;;^UTILITY(U,$J,"OPT",8016,10,5,"^")
 ;;=DMSQ PS TOTAL TABLE COLS
 ;;^UTILITY(U,$J,"OPT",8016,10,6,0)
 ;;=8022^3C^60
 ;;^UTILITY(U,$J,"OPT",8016,10,6,"^")
 ;;=DMSQ PS TOTAL TABLE COLS A
 ;;^UTILITY(U,$J,"OPT",8016,10,7,0)
 ;;=8024^FLDS^80
 ;;^UTILITY(U,$J,"OPT",8016,10,7,"^")
 ;;=DMSQ PS COLUMNS REG NOID
 ;;^UTILITY(U,$J,"OPT",8016,10,8,0)
 ;;=8023^4C^70
 ;;^UTILITY(U,$J,"OPT",8016,10,8,"^")
 ;;=DMSQ PS TOTAL COLUMNS REG
 ;;^UTILITY(U,$J,"OPT",8016,10,9,0)
 ;;=8036^DOM^90
 ;;^UTILITY(U,$J,"OPT",8016,10,9,"^")
 ;;=DMSQ PS COLUMNS BY DOMAIN
 ;;^UTILITY(U,$J,"OPT",8016,99)
 ;;=62819,35307
 ;;^UTILITY(U,$J,"OPT",8016,"U")
 ;;=SITE STATISTICS REPORTS
 ;;^UTILITY(U,$J,"OPT",8017,0)
 ;;=DMSQ PS TOTAL TABLES^Table Total (Excluding Index Tables)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8017,1,0)
 ;;=^^4^4^2970805^^
 ;;^UTILITY(U,$J,"OPT",8017,1,1,0)
 ;;=This report comes back with one number, the total number of tables, not
 ;;^UTILITY(U,$J,"OPT",8017,1,2,0)
 ;;=counting ones based on indexes.  This corresponds with the number of
 ;;^UTILITY(U,$J,"OPT",8017,1,3,0)
 ;;=files and subfiles, with word-processing fields also projected as separate
 ;;^UTILITY(U,$J,"OPT",8017,1,4,0)
 ;;=tables (just as subfiles).
 ;;^UTILITY(U,$J,"OPT",8017,25)
 ;;=EN1^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8017,"U")
 ;;=TABLE TOTAL (EXCLUDING INDEX T
 ;;^UTILITY(U,$J,"OPT",8018,0)
 ;;=DMSQ PS TOTAL COLUMNS^Column Total (All Tables)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8018,1,0)
 ;;=^^3^3^2970805^^
 ;;^UTILITY(U,$J,"OPT",8018,1,1,0)
 ;;=This report calculates one number, the total number of columns in the
 ;;^UTILITY(U,$J,"OPT",8018,1,2,0)
 ;;=SQLI Column file.  This includes columns from tables based on indexes
 ;;^UTILITY(U,$J,"OPT",8018,1,3,0)
 ;;=as well as columns automatically created internal record numbers.
 ;;^UTILITY(U,$J,"OPT",8018,25)
 ;;=EN2^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8018,"U")
 ;;=COLUMN TOTAL (ALL TABLES)
 ;;^UTILITY(U,$J,"OPT",8019,0)
 ;;=DMSQ PS TOTAL INDEXES^Index Table Total^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8019,1,0)
 ;;=^^3^3^2970805^^
 ;;^UTILITY(U,$J,"OPT",8019,1,1,0)
 ;;=This report shows one number, the total number of tables that are
 ;;^UTILITY(U,$J,"OPT",8019,1,2,0)
 ;;=built from indexes.  (All regular cross-references, either for files
 ;;^UTILITY(U,$J,"OPT",8019,1,3,0)
 ;;=or subfiles, are projected as tables.)
 ;;^UTILITY(U,$J,"OPT",8019,25)
 ;;=EN3^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8019,"U")
 ;;=INDEX TABLE TOTAL
 ;;^UTILITY(U,$J,"OPT",8020,0)
 ;;=DMSQ PS TOTAL TABLE ELEMENTS^Table Element Totals, By Type^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8020,1,0)
 ;;=^^3^3^2970805^^
 ;;^UTILITY(U,$J,"OPT",8020,1,1,0)
 ;;=This report shows the total number of table elements along with
 ;;^UTILITY(U,$J,"OPT",8020,1,2,0)
 ;;=subtotals for the three types:  columns, foreign keys, and primary
 ;;^UTILITY(U,$J,"OPT",8020,1,3,0)
 ;;=keys.  
 ;;^UTILITY(U,$J,"OPT",8020,25)
 ;;=EN4^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8020,"U")
 ;;=TABLE ELEMENT TOTALS, BY TYPE
 ;;^UTILITY(U,$J,"OPT",8021,0)
 ;;=DMSQ PS TOTAL TABLE COLS^Column Totals, by Table^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8021,1,0)
 ;;=^^3^3^2970805^^
 ;;^UTILITY(U,$J,"OPT",8021,1,1,0)
 ;;=This is a long listing of all tables along with a count of the number
 ;;^UTILITY(U,$J,"OPT",8021,1,2,0)
 ;;=of columns in each one.  It is sorted by the file/subfile number
 ;;^UTILITY(U,$J,"OPT",8021,1,3,0)
 ;;=associated with the table.
 ;;^UTILITY(U,$J,"OPT",8021,25)
 ;;=EN5^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8021,"U")
 ;;=COLUMN TOTALS, BY TABLE
 ;;^UTILITY(U,$J,"OPT",8022,0)
 ;;=DMSQ PS TOTAL TABLE COLS A^Column Totals, by Table (Ordered by # of Columns)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8022,1,0)
 ;;=^^3^3^2970805^^
 ;;^UTILITY(U,$J,"OPT",8022,1,1,0)
 ;;=This is a listing of tables by column count.  It shows the table with
 ;;^UTILITY(U,$J,"OPT",8022,1,2,0)
 ;;=the most columns first, so you can easily see which tables have the
 ;;^UTILITY(U,$J,"OPT",8022,1,3,0)
 ;;=most columns.
 ;;^UTILITY(U,$J,"OPT",8022,25)
 ;;=EN6^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8022,"U")
 ;;=COLUMN TOTALS, BY TABLE (ORDER
 ;;^UTILITY(U,$J,"OPT",8023,0)
 ;;=DMSQ PS TOTAL COLUMNS REG^Columns in Regular Tables Total^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8023,1,0)
 ;;=^^2^2^2970805^^
 ;;^UTILITY(U,$J,"OPT",8023,1,1,0)
 ;;=This report shows one number, the number of columns based on regular
 ;;^UTILITY(U,$J,"OPT",8023,1,2,0)
 ;;=tables.  It excludes columns based on tables created from indexes.
 ;;^UTILITY(U,$J,"OPT",8023,25)
 ;;=EN7^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8023,"U")
 ;;=COLUMNS IN REGULAR TABLES TOTA
 ;;^UTILITY(U,$J,"OPT",8024,0)
 ;;=DMSQ PS COLUMNS REG NOID^Columns in Regular Tables, Excluding ID Columns^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8024,1,0)
 ;;=^^7^7^2970805^^
 ;;^UTILITY(U,$J,"OPT",8024,1,1,0)
 ;;=This report shows one number, the number of columns that correspond
 ;;^UTILITY(U,$J,"OPT",8024,1,2,0)
 ;;=with regular fields in files.  It excludes columns based on tables
 ;;^UTILITY(U,$J,"OPT",8024,1,3,0)
 ;;=created from indexes.  It also excludes the automatically created
 ;;^UTILITY(U,$J,"OPT",8024,1,4,0)
 ;;=columns based on the internal entry numbers of files and subfiles.
 ;;^UTILITY(U,$J,"OPT",8024,1,5,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8024,1,6,0)
 ;;=It is the number of fields in the FileMan database, assuming all files
 ;;^UTILITY(U,$J,"OPT",8024,1,7,0)
 ;;=have been projected as tables.
 ;;^UTILITY(U,$J,"OPT",8024,25)
 ;;=EN8^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8024,"U")
 ;;=COLUMNS IN REGULAR TABLES, EXC
 ;;^UTILITY(U,$J,"OPT",8025,0)
 ;;=DMSQ TS PTR PARENT BRIEF^List Pointer and Parent Links (Brief)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8025,1,0)
 ;;=^^4^4^2970805^^
 ;;^UTILITY(U,$J,"OPT",8025,1,1,0)
 ;;=This lists pointed-to files given a file number.  The pointed-to files
 ;;^UTILITY(U,$J,"OPT",8025,1,2,0)
 ;;=may either be connected via a regular pointer or via a subfile link to
 ;;^UTILITY(U,$J,"OPT",8025,1,3,0)
 ;;=a parent file.  The list of file numbers may then be used in other
 ;;^UTILITY(U,$J,"OPT",8025,1,4,0)
 ;;=options to find out more about the table build from that number.
 ;;^UTILITY(U,$J,"OPT",8025,25)
 ;;=EN2^DMSQP2
 ;;^UTILITY(U,$J,"OPT",8025,"U")
 ;;=LIST POINTER AND PARENT LINKS 
 ;;^UTILITY(U,$J,"OPT",8026,0)
 ;;=DMSQ TS PTR PARENT FULL^List Pointer and Parent Links (Full)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8026,1,0)
 ;;=^^4^4^2970805^^
 ;;^UTILITY(U,$J,"OPT",8026,1,1,0)
 ;;=This option shows the pointer and subfile links that reach outward from
 ;;^UTILITY(U,$J,"OPT",8026,1,2,0)
 ;;=a selected table.  Regular pointers (foreign keys or FKs) as well as
 ;;^UTILITY(U,$J,"OPT",8026,1,3,0)
 ;;=subfile links out and up to parent files (parent foreign keys or PFKs)
 ;;^UTILITY(U,$J,"OPT",8026,1,4,0)
 ;;=are shown.
 ;;^UTILITY(U,$J,"OPT",8026,25)
 ;;=EN2^DMSQP

DIINI005
DIINI005 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"OPT",8026,"U")
 ;;=LIST POINTER AND PARENT LINKS 
 ;;^UTILITY(U,$J,"OPT",8027,0)
 ;;=DMSQ TS SUBFILE BRIEF^List Subfile Links (Brief)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8027,1,0)
 ;;=^^3^3^2970805^^
 ;;^UTILITY(U,$J,"OPT",8027,1,1,0)
 ;;=This lists subfiles of a selected file number.  The subfile numbers are
 ;;^UTILITY(U,$J,"OPT",8027,1,2,0)
 ;;=also shown.  These number can then be used in other options to find out
 ;;^UTILITY(U,$J,"OPT",8027,1,3,0)
 ;;=what foreign keys are in the tables built from these subfiles.
 ;;^UTILITY(U,$J,"OPT",8027,25)
 ;;=EN1^DMSQP2
 ;;^UTILITY(U,$J,"OPT",8027,"U")
 ;;=LIST SUBFILE LINKS (BRIEF)
 ;;^UTILITY(U,$J,"OPT",8028,0)
 ;;=DMSQ TS PTR SUBFILE FULL^List Incoming Pointer/Subfile Links (Full)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8028,1,0)
 ;;=^^4^4^2970805^^
 ;;^UTILITY(U,$J,"OPT",8028,1,1,0)
 ;;=This option shows the foreign key names of incoming links, either from
 ;;^UTILITY(U,$J,"OPT",8028,1,2,0)
 ;;=pointers or subfile links.  It also shows the table that has the link.
 ;;^UTILITY(U,$J,"OPT",8028,1,3,0)
 ;;=So, for the selected table, a list of links that exist in other tables
 ;;^UTILITY(U,$J,"OPT",8028,1,4,0)
 ;;=can be determined.
 ;;^UTILITY(U,$J,"OPT",8028,25)
 ;;=EN1^DMSQP
 ;;^UTILITY(U,$J,"OPT",8028,"U")
 ;;=LIST INCOMING POINTER/SUBFILE 
 ;;^UTILITY(U,$J,"OPT",8029,0)
 ;;=DMSQ TS FIELDS FULL^Field Listing by File (Full)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8029,1,0)
 ;;=^^14^14^2970805^^
 ;;^UTILITY(U,$J,"OPT",8029,1,1,0)
 ;;=This can be used to see how the fields of a file or subfile were
 ;;^UTILITY(U,$J,"OPT",8029,1,2,0)
 ;;=projected as columns in a table.  It only shows regular columns.  It
 ;;^UTILITY(U,$J,"OPT",8029,1,3,0)
 ;;=doesn't include any Table_ID columns, ones automatically created
 ;;^UTILITY(U,$J,"OPT",8029,1,4,0)
 ;;=based on the internal entry numbers of the files and subfiles.  It also
 ;;^UTILITY(U,$J,"OPT",8029,1,5,0)
 ;;=doesn't show foreign keys, links that are automatically created when
 ;;^UTILITY(U,$J,"OPT",8029,1,6,0)
 ;;=there's a pointer or subfile connection.  (Other options can be used to
 ;;^UTILITY(U,$J,"OPT",8029,1,7,0)
 ;;=discover the names of foreign keys.)
 ;;^UTILITY(U,$J,"OPT",8029,1,8,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8029,1,9,0)
 ;;=Don't be surprised when the list of fields seems short.  Remember that
 ;;^UTILITY(U,$J,"OPT",8029,1,10,0)
 ;;=if there are any subfiles associated with the file name that you entered,
 ;;^UTILITY(U,$J,"OPT",8029,1,11,0)
 ;;=there will be separate tables for them.  Use the option that shows
 ;;^UTILITY(U,$J,"OPT",8029,1,12,0)
 ;;=subfiles to get the numbers to use with this option.  That will let you
 ;;^UTILITY(U,$J,"OPT",8029,1,13,0)
 ;;=find all the columns associated with the files in a given file and its
 ;;^UTILITY(U,$J,"OPT",8029,1,14,0)
 ;;=subfiles.
 ;;^UTILITY(U,$J,"OPT",8029,25)
 ;;=EN^DMSQP2
 ;;^UTILITY(U,$J,"OPT",8029,"U")
 ;;=FIELD LISTING BY FILE (FULL)
 ;;^UTILITY(U,$J,"OPT",8030,0)
 ;;=DMSQ TS FIELDS BRIEF^Field Listing by File (Brief)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8030,1,0)
 ;;=^^17^17^2970805^^
 ;;^UTILITY(U,$J,"OPT",8030,1,1,0)
 ;;=This option is like a brief data dictionary listing.  Along with the
 ;;^UTILITY(U,$J,"OPT",8030,1,2,0)
 ;;=file and field names are the corresponding table and column names.  It
 ;;^UTILITY(U,$J,"OPT",8030,1,3,0)
 ;;=also shows the field's type, like word-processing or set-of-codes.  If
 ;;^UTILITY(U,$J,"OPT",8030,1,4,0)
 ;;=the field is a pointer, the pointed-to file/subfile number is shown.  If
 ;;^UTILITY(U,$J,"OPT",8030,1,5,0)
 ;;=the field is within a subfile, the number of the parent file is shown.
 ;;^UTILITY(U,$J,"OPT",8030,1,6,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8030,1,7,0)
 ;;=In this way, all files and fields can be displayed at one level, without
 ;;^UTILITY(U,$J,"OPT",8030,1,8,0)
 ;;=the indentation needed with the usual hierarchical display format.  But
 ;;^UTILITY(U,$J,"OPT",8030,1,9,0)
 ;;=to find out how files are linked, you may need to follow a long chain
 ;;^UTILITY(U,$J,"OPT",8030,1,10,0)
 ;;=from one link to the next.
 ;;^UTILITY(U,$J,"OPT",8030,1,11,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8030,1,12,0)
 ;;=The fields global location is also listed.  The $PIECE syntax is used
 ;;^UTILITY(U,$J,"OPT",8030,1,13,0)
 ;;=when the field is from a particular piece of a global node.  The $EXTRACT
 ;;^UTILITY(U,$J,"OPT",8030,1,14,0)
 ;;=format is used when, like for MUMPS-type fields, the location is an
 ;;^UTILITY(U,$J,"OPT",8030,1,15,0)
 ;;=extracted portion of the entire node, say from character 1 to 245.  For
 ;;^UTILITY(U,$J,"OPT",8030,1,16,0)
 ;;=computed fields, of course, there isn't a global location since these are
 ;;^UTILITY(U,$J,"OPT",8030,1,17,0)
 ;;=virtual fields that only perform calculations.
 ;;^UTILITY(U,$J,"OPT",8030,25)
 ;;=EN^DMSQP5
 ;;^UTILITY(U,$J,"OPT",8030,"U")
 ;;=FIELD LISTING BY FILE (BRIEF)
 ;;^UTILITY(U,$J,"OPT",8031,0)
 ;;=DMSQ TS NAMES^Table Name Listing (VA FileMan vs. SQLI)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8031,1,0)
 ;;=^^4^4^2970805^^
 ;;^UTILITY(U,$J,"OPT",8031,1,1,0)
 ;;=This option lists file/subfile names along with their corresponding
 ;;^UTILITY(U,$J,"OPT",8031,1,2,0)
 ;;=table names.  The list is sorted by file number and prompts for a
 ;;^UTILITY(U,$J,"OPT",8031,1,3,0)
 ;;=range.  To see the table names for the files and subfiles of 9.4, the
 ;;^UTILITY(U,$J,"OPT",8031,1,4,0)
 ;;=Package file, for example, you could start from 9.4 and go to 9.5.
 ;;^UTILITY(U,$J,"OPT",8031,25)
 ;;=EN3^DMSQP2
 ;;^UTILITY(U,$J,"OPT",8031,"U")
 ;;=TABLE NAME LISTING (VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",8032,0)
 ;;=DMSQ TS PTR STATS^Pointer Statistics by Individual Table^^R^^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",8032,1,0)
 ;;=^^6^6^2971019^^^^
 ;;^UTILITY(U,$J,"OPT",8032,1,1,0)
 ;;=This option can be used just to see the total number of various kinds
 ;;^UTILITY(U,$J,"OPT",8032,1,2,0)
 ;;=of links for a given table.  You can then use these totals to confirm
 ;;^UTILITY(U,$J,"OPT",8032,1,3,0)
 ;;=that you have found all the actual foreign key links (FKs and PFKs)
 ;;^UTILITY(U,$J,"OPT",8032,1,4,0)
 ;;=by using other options.  (The FKs are regular pointers, or foreign
 ;;^UTILITY(U,$J,"OPT",8032,1,5,0)
 ;;=keys.  The PFKs are subfile links to parent files, or parent foreign
 ;;^UTILITY(U,$J,"OPT",8032,1,6,0)
 ;;=keys.)
 ;;^UTILITY(U,$J,"OPT",8032,15)
 ;;=S XQMM("N")=""
 ;;^UTILITY(U,$J,"OPT",8032,25)
 ;;=EN^DMSQP3
 ;;^UTILITY(U,$J,"OPT",8032,"U")
 ;;=POINTER STATISTICS BY INDIVIDU
 ;;^UTILITY(U,$J,"OPT",8033,0)
 ;;=DMSQ TS PTR STATS SUMMARY^Pointer Statistics (Summary)^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8033,1,0)
 ;;=^^13^13^2970805^^
 ;;^UTILITY(U,$J,"OPT",8033,1,1,0)
 ;;=This report is about all tables and can take a little while to run.  If
 ;;^UTILITY(U,$J,"OPT",8033,1,2,0)
 ;;=you are interested in finding out how many table links there are among
 ;;^UTILITY(U,$J,"OPT",8033,1,3,0)
 ;;=all tables on your system, this option will tell you.  It divides up
 ;;^UTILITY(U,$J,"OPT",8033,1,4,0)
 ;;=the different types of links with a separate report for each.  
 ;;^UTILITY(U,$J,"OPT",8033,1,5,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8033,1,6,0)
 ;;=The five reports that are joined with this option show the number of
 ;;^UTILITY(U,$J,"OPT",8033,1,7,0)
 ;;=tables with self-referential pointers, upward links from subfiles,
 ;;^UTILITY(U,$J,"OPT",8033,1,8,0)
 ;;=links coming in from subfiles below, pointers going outward, and
 ;;^UTILITY(U,$J,"OPT",8033,1,9,0)
 ;;=pointers coming inward.
 ;;^UTILITY(U,$J,"OPT",8033,1,10,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8033,1,11,0)
 ;;=You have a choice of seeing just the total counts or details.  Details
 ;;^UTILITY(U,$J,"OPT",8033,1,12,0)
 ;;=include table names, so you can find out which ones have the most
 ;;^UTILITY(U,$J,"OPT",8033,1,13,0)
 ;;=pointers of a certain type, etc.
 ;;^UTILITY(U,$J,"OPT",8033,25)
 ;;=EN1^DMSQP3
 ;;^UTILITY(U,$J,"OPT",8033,"U")
 ;;=POINTER STATISTICS (SUMMARY)
 ;;^UTILITY(U,$J,"OPT",8034,0)
 ;;=DMSQ TS MENU^Table Statistics Reports^^M^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8034,1,0)
 ;;=^^5^5^2970805^^^^
 ;;^UTILITY(U,$J,"OPT",8034,1,1,0)
 ;;=For a given file number, this shows column names in the current table
 ;;^UTILITY(U,$J,"OPT",8034,1,2,0)
 ;;=that point to other tables.  The column may be based on a regular
 ;;^UTILITY(U,$J,"OPT",8034,1,3,0)
 ;;=pointer or on a subfile link to a parent table.  (Regular pointers are
 ;;^UTILITY(U,$J,"OPT",8034,1,4,0)
 ;;=indicated as FK, foreign keys.  Subfile links to parents are identified
 ;;^UTILITY(U,$J,"OPT",8034,1,5,0)
 ;;=with PFK, parent foreign keys.)
 ;;^UTILITY(U,$J,"OPT",8034,10,0)
 ;;=^19.01PI^9^9
 ;;^UTILITY(U,$J,"OPT",8034,10,1,0)
 ;;=8030^DD1^10
 ;;^UTILITY(U,$J,"OPT",8034,10,1,"^")
 ;;=DMSQ TS FIELDS BRIEF
 ;;^UTILITY(U,$J,"OPT",8034,10,2,0)
 ;;=8029^DD2^11
 ;;^UTILITY(U,$J,"OPT",8034,10,2,"^")
 ;;=DMSQ TS FIELDS FULL
 ;;^UTILITY(U,$J,"OPT",8034,10,3,0)
 ;;=8031^NAME^50
 ;;^UTILITY(U,$J,"OPT",8034,10,3,"^")
 ;;=DMSQ TS NAMES
 ;;^UTILITY(U,$J,"OPT",8034,10,4,0)
 ;;=8025^OUT1^30
 ;;^UTILITY(U,$J,"OPT",8034,10,4,"^")
 ;;=DMSQ TS PTR PARENT BRIEF
 ;;^UTILITY(U,$J,"OPT",8034,10,5,0)
 ;;=8026^OUT2^31
 ;;^UTILITY(U,$J,"OPT",8034,10,5,"^")
 ;;=DMSQ TS PTR PARENT FULL
 ;;^UTILITY(U,$J,"OPT",8034,10,6,0)
 ;;=8032^CNT1^40
 ;;^UTILITY(U,$J,"OPT",8034,10,6,"^")
 ;;=DMSQ TS PTR STATS
 ;;^UTILITY(U,$J,"OPT",8034,10,7,0)
 ;;=8033^CNT2^41
 ;;^UTILITY(U,$J,"OPT",8034,10,7,"^")
 ;;=DMSQ TS PTR STATS SUMMARY
 ;;^UTILITY(U,$J,"OPT",8034,10,8,0)
 ;;=8027^IN1^20
 ;;^UTILITY(U,$J,"OPT",8034,10,8,"^")
 ;;=DMSQ TS SUBFILE BRIEF
 ;;^UTILITY(U,$J,"OPT",8034,10,9,0)
 ;;=8028^IN2^21
 ;;^UTILITY(U,$J,"OPT",8034,10,9,"^")
 ;;=DMSQ TS PTR SUBFILE FULL
 ;;^UTILITY(U,$J,"OPT",8034,99)
 ;;=62819,35308
 ;;^UTILITY(U,$J,"OPT",8034,"U")
 ;;=TABLE STATISTICS REPORTS
 ;;^UTILITY(U,$J,"OPT",8035,0)
 ;;=DMSQ SUGGEST TABLE GROUPINGS^Suggest Table Groupings^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8035,1,0)
 ;;=^^40^40^2971021^^^^
 ;;^UTILITY(U,$J,"OPT",8035,1,1,0)
 ;;=This option can take a few minutes to run.  Use it when you have some
 ;;^UTILITY(U,$J,"OPT",8035,1,2,0)
 ;;=extra time to explore the sharing relationships among files.  With it,
 ;;^UTILITY(U,$J,"OPT",8035,1,3,0)
 ;;=though, you can find out which tables are often referenced by others.
 ;;^UTILITY(U,$J,"OPT",8035,1,4,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,5,0)
 ;;=You will be prompted for a cutoff point.  This is used to subset the
 ;;^UTILITY(U,$J,"OPT",8035,1,6,0)
 ;;=resulting groups.  If you use a high cutoff, like 150, you will get back
 ;;^UTILITY(U,$J,"OPT",8035,1,7,0)
 ;;=a fairly short shared table list, including only those files that have
 ;;^UTILITY(U,$J,"OPT",8035,1,8,0)
 ;;=more interconnections that the cutoff, like New Person and Patient.
 ;;^UTILITY(U,$J,"OPT",8035,1,9,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,10,0)
 ;;=A cutoff around five might give the most useful subdivisions.  That
 ;;^UTILITY(U,$J,"OPT",8035,1,11,0)
 ;;=might put 200-300 tables in the shared group, leaving all the other
 ;;^UTILITY(U,$J,"OPT",8035,1,12,0)
 ;;=tables in fairly small mutually exclusive groups of 30 or so.  This
 ;;^UTILITY(U,$J,"OPT",8035,1,13,0)
 ;;=approach ends up with a large number of small tables, though, like around
 ;;^UTILITY(U,$J,"OPT",8035,1,14,0)
 ;;=700 or more.
 ;;^UTILITY(U,$J,"OPT",8035,1,15,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,16,0)
 ;;=The purpose of this utility is to give you an idea about how to group
 ;;^UTILITY(U,$J,"OPT",8035,1,17,0)
 ;;=tables when assigning access to users by profile.  If you already had a
 ;;^UTILITY(U,$J,"OPT",8035,1,18,0)
 ;;=user profile with access to a set of interrelated tables, you could use
 ;;^UTILITY(U,$J,"OPT",8035,1,19,0)
 ;;=the profile for other users who were interested in the same tables.
 ;;^UTILITY(U,$J,"OPT",8035,1,20,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,21,0)
 ;;=Note that this utility doesn't list tables without any connection to
 ;;^UTILITY(U,$J,"OPT",8035,1,22,0)
 ;;=others (a relatively small set, however!).  Also note that the table that
 ;;^UTILITY(U,$J,"OPT",8035,1,23,0)
 ;;=has the most sharing activity compared with other members of the group
 ;;^UTILITY(U,$J,"OPT",8035,1,24,0)
 ;;=is used to identify the group in this option's printout.
 ;;^UTILITY(U,$J,"OPT",8035,1,25,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,26,0)
 ;;=After entering a cutoff, you are prompted for a table of special
 ;;^UTILITY(U,$J,"OPT",8035,1,27,0)
 ;;=interest.  If you want to see where a particular table ends up in the
 ;;^UTILITY(U,$J,"OPT",8035,1,28,0)
 ;;=final analysis, enter it here.  As a result, after the shared tables
 ;;^UTILITY(U,$J,"OPT",8035,1,29,0)
 ;;=are listed, you will get a special report showing your table and its
 ;;^UTILITY(U,$J,"OPT",8035,1,30,0)
 ;;=group.  After that, all the groups are listed.
 ;;^UTILITY(U,$J,"OPT",8035,1,31,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,32,0)
 ;;=Running this option with several cutoff points might show the following:
 ;;^UTILITY(U,$J,"OPT",8035,1,33,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,34,0)
 ;;= Cutoff   Total Shared   Number of other Groups   Member totals
 ;;^UTILITY(U,$J,"OPT",8035,1,35,0)
 ;;= -----------------------------------------------------------------
 ;;^UTILITY(U,$J,"OPT",8035,1,36,0)
 ;;= 50        11            227                      3391,32...
 ;;^UTILITY(U,$J,"OPT",8035,1,37,0)
 ;;= 10       122            534                      275,140,112...
 ;;^UTILITY(U,$J,"OPT",8035,1,38,0)
 ;;= 5        284            718                      34,33,32,32,26...
 ;;^UTILITY(U,$J,"OPT",8035,1,39,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8035,1,40,0)
 ;;=There isn't any right way; just experiment as you wish!
 ;;^UTILITY(U,$J,"OPT",8035,25)
 ;;=EN^DMSQP6
 ;;^UTILITY(U,$J,"OPT",8035,"U")
 ;;=SUGGEST TABLE GROUPINGS
 ;;^UTILITY(U,$J,"OPT",8036,0)
 ;;=DMSQ PS COLUMNS BY DOMAIN^Columns by Domain^^R^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",8036,1,0)
 ;;=^^19^19^2970806^^
 ;;^UTILITY(U,$J,"OPT",8036,1,1,0)
 ;;=This report counts the number of columns in each domain category, so
 ;;^UTILITY(U,$J,"OPT",8036,1,2,0)
 ;;=you can see how many are pointers, dates, or numbers.  It only looks at
 ;;^UTILITY(U,$J,"OPT",8036,1,3,0)
 ;;=columns from regular (non-index) tables and excludes the automatically

DIINI006
DIINI006 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"OPT",8036,1,4,0)
 ;;=generated Table_ID columns built from internal entry numbers.
 ;;^UTILITY(U,$J,"OPT",8036,1,5,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8036,1,6,0)
 ;;=Here is an example of percentages from a sample account:
 ;;^UTILITY(U,$J,"OPT",8036,1,7,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8036,1,8,0)
 ;;= Ingeger           7499     22.2%
 ;;^UTILITY(U,$J,"OPT",8036,1,9,0)
 ;;= Character        10972     32.5%
 ;;^UTILITY(U,$J,"OPT",8036,1,10,0)
 ;;= Pointer           4730     14.0%
 ;;^UTILITY(U,$J,"OPT",8036,1,11,0)
 ;;= Set-of-Codes      4575     13.5%
 ;;^UTILITY(U,$J,"OPT",8036,1,12,0)
 ;;= Number            2429      7.2%
 ;;^UTILITY(U,$J,"OPT",8036,1,13,0)
 ;;= Moment            1272      3.8%
 ;;^UTILITY(U,$J,"OPT",8036,1,14,0)
 ;;= Date              1393      4.1%
 ;;^UTILITY(U,$J,"OPT",8036,1,15,0)
 ;;= Word-processing    687      2.0%
 ;;^UTILITY(U,$J,"OPT",8036,1,16,0)
 ;;= MUMPS              180       .5%
 ;;^UTILITY(U,$J,"OPT",8036,1,17,0)
 ;;= Variable pointer    58       .2%
 ;;^UTILITY(U,$J,"OPT",8036,1,18,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8036,1,19,0)
 ;;= TOTAL            33795
 ;;^UTILITY(U,$J,"OPT",8036,25)
 ;;=EN9^DMSQP1
 ;;^UTILITY(U,$J,"OPT",8036,"U")
 ;;=COLUMNS BY DOMAIN
 ;;^UTILITY(U,$J,"OPT",8037,0)
 ;;=DMSQ DIAGNOSTICS^Find Out SQLI Status^^R^^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",8037,1,0)
 ;;=^^10^10^2971026^
 ;;^UTILITY(U,$J,"OPT",8037,1,1,0)
 ;;=This option prints a current status report of the SQLI projection
 ;;^UTILITY(U,$J,"OPT",8037,1,2,0)
 ;;=process.  It indicates when the projection was last run and whether
 ;;^UTILITY(U,$J,"OPT",8037,1,3,0)
 ;;=it successfully ran to completion.  If problems were encountered and
 ;;^UTILITY(U,$J,"OPT",8037,1,4,0)
 ;;=the process stopped, it tries to identify where and list the file
 ;;^UTILITY(U,$J,"OPT",8037,1,5,0)
 ;;=or field that might have caused the problem.
 ;;^UTILITY(U,$J,"OPT",8037,1,6,0)
 ;;= 
 ;;^UTILITY(U,$J,"OPT",8037,1,7,0)
 ;;=It is intended as the first step in diagnosing problems (hard errors)
 ;;^UTILITY(U,$J,"OPT",8037,1,8,0)
 ;;=that may occur when running the SQLI projection.  The SQLI Site Manual
 ;;^UTILITY(U,$J,"OPT",8037,1,9,0)
 ;;=outlines additional steps (see the Trouble-Shooting section) including
 ;;^UTILITY(U,$J,"OPT",8037,1,10,0)
 ;;=using the RUNONE^DMSQ utility with potential problem files.
 ;;^UTILITY(U,$J,"OPT",8037,15)
 ;;=S XQMM("N")=""
 ;;^UTILITY(U,$J,"OPT",8037,25)
 ;;=EN^DMSQT
 ;;^UTILITY(U,$J,"OPT",8037,"U")
 ;;=FIND OUT SQLI STATUS
 ;;^UTILITY(U,$J,"OPT",8767,0)
 ;;=DIKEY^Key Definition^^A^^^^^^^^^^1
 ;;^UTILITY(U,$J,"OPT",8767,1,0)
 ;;=^^3^3^2981020^^
 ;;^UTILITY(U,$J,"OPT",8767,1,1,0)
 ;;=The Key Definition sub-option of the Utility Functions option allows you
 ;;^UTILITY(U,$J,"OPT",8767,1,2,0)
 ;;=to create, edit, or delete a Key on a file or subfile. A Key is a group of
 ;;^UTILITY(U,$J,"OPT",8767,1,3,0)
 ;;=one or more fields that uniquely identifies a record in a file or subfile.
 ;;^UTILITY(U,$J,"OPT",8767,20)
 ;;=S DI=11 D EN^DIU
 ;;^UTILITY(U,$J,"OPT",8767,"U")
 ;;=KEY DEFINITION
 ;;^UTILITY(U,$J,"OPT",11388,0)
 ;;=DIAUDIT MONITOR USER^Monitor a User^^R^^^^^^^y^VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",11388,1,0)
 ;;=^^2^2^3130126^
 ;;^UTILITY(U,$J,"OPT",11388,1,1,0)
 ;;=This option allows tracking of a given user's access to entries in a given
 ;;^UTILITY(U,$J,"OPT",11388,1,2,0)
 ;;=(audited) file. Display starts with a selected access date.
 ;;^UTILITY(U,$J,"OPT",11388,25)
 ;;=6^DIAU
 ;;^UTILITY(U,$J,"OPT",11388,"U")
 ;;=MONITOR A USER
 ;;^UTILITY(U,$J,"OPT",11392,0)
 ;;=DMU PRINT FROM 1009.7^DMU PRINT FROM 1009.7^^P^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",11392,60)
 ;;=DMU(1009.7,
 ;;^UTILITY(U,$J,"OPT",11392,62)
 ;;=0
 ;;^UTILITY(U,$J,"OPT",11392,63)
 ;;=[DMU PRINT TEMPLATE 1009.7]
 ;;^UTILITY(U,$J,"OPT",11392,64)
 ;;=
 ;;^UTILITY(U,$J,"OPT",11392,65)
 ;;=
 ;;^UTILITY(U,$J,"OPT",11392,66)
 ;;=
 ;;^UTILITY(U,$J,"OPT",11392,"U")
 ;;=DMU PRINT FROM 1009.7
 ;;^UTILITY(U,$J,"OPT",11393,0)
 ;;=DMU SORT/PRINT FROM 1009.7^DMU SORT/PRINT FROM 1009.7^^P^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",11393,60)
 ;;=DMU(1009.7,
 ;;^UTILITY(U,$J,"OPT",11393,62)
 ;;=0
 ;;^UTILITY(U,$J,"OPT",11393,63)
 ;;=[DMU PRINT TEMPLATE 1009.7]
 ;;^UTILITY(U,$J,"OPT",11393,64)
 ;;=[DMU SORT TEMPLATE 1009.7]
 ;;^UTILITY(U,$J,"OPT",11393,65)
 ;;=
 ;;^UTILITY(U,$J,"OPT",11393,66)
 ;;=
 ;;^UTILITY(U,$J,"OPT",11393,"U")
 ;;=DMU SORT/PRINT FROM 1009.7
 ;;^UTILITY(U,$J,"OPT",11394,0)
 ;;=DMU EDIT 1009.7 BOTH FIELDS^DMU EDIT 1009.7 BOTH FIELDS^^E^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",11394,30)
 ;;=DMU(1009.7,
 ;;^UTILITY(U,$J,"OPT",11394,31)
 ;;=AEMQL
 ;;^UTILITY(U,$J,"OPT",11394,50)
 ;;=DMU(1009.7,
 ;;^UTILITY(U,$J,"OPT",11394,51)
 ;;=[DMU EDIT 1009.7]
 ;;^UTILITY(U,$J,"OPT",11394,"U")
 ;;=DMU EDIT 1009.7 BOTH FIELDS
 ;;^UTILITY(U,$J,"OPT",11395,0)
 ;;=DMU EDIT 1009.7 WITHOUT LAYGO^DMU EDIT 1009.7 WITHOUT LAYGO^^E^^^^^^^^
 ;;^UTILITY(U,$J,"OPT",11395,30)
 ;;=DMU(1009.7,
 ;;^UTILITY(U,$J,"OPT",11395,31)
 ;;=AEMQ
 ;;^UTILITY(U,$J,"OPT",11395,50)
 ;;=DMU(1009.7,
 ;;^UTILITY(U,$J,"OPT",11395,51)
 ;;=[DMU EDIT 1009.7]
 ;;^UTILITY(U,$J,"OPT",11395,"U")
 ;;=DMU EDIT 1009.7 WITHOUT LAYGO
 ;;^UTILITY(U,$J,"OPT",11396,0)
 ;;=DIAUDIT SHOW DD AUDIT TRAIL^Show DD Audit Trail^^R^^^^^^^^VA FILEMAN
 ;;^UTILITY(U,$J,"OPT",11396,1,0)
 ;;=^^1^1^3130126^
 ;;^UTILITY(U,$J,"OPT",11396,1,1,0)
 ;;=This option shows all Data Dictionary changes since a certain date.
 ;;^UTILITY(U,$J,"OPT",11396,25)
 ;;=4^DIAU
 ;;^UTILITY(U,$J,"OPT",11396,"U")
 ;;=SHOW DD AUDIT TRAIL
 ;;^UTILITY(U,$J,"REM",139,0)
 ;;=DDR GETS ENTRY DATA^GETSC^DDR2^2^R
 ;;^UTILITY(U,$J,"REM",139,1,0)
 ;;=^^1^1^2951024^^^^
 ;;^UTILITY(U,$J,"REM",139,1,1,0)
 ;;=Calls database server at GETS^DIQ.
 ;;^UTILITY(U,$J,"REM",139,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",139,2,1,0)
 ;;=GETS ATTRIBUTES^2^512^1
 ;;^UTILITY(U,$J,"REM",139,2,"B","GETS ATTRIBUTES",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",140,0)
 ;;=DDR LISTER^LISTC^DDR^4^R^^^1
 ;;^UTILITY(U,$J,"REM",140,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",140,2,1,0)
 ;;=LIST ATTRIBUTES^2^512^1
 ;;^UTILITY(U,$J,"REM",140,2,"B","LIST ATTRIBUTES",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",141,0)
 ;;=DDR FILER^FILEC^DDR3^2^R
 ;;^UTILITY(U,$J,"REM",141,1,0)
 ;;=^^1^1^2950508^^
 ;;^UTILITY(U,$J,"REM",141,1,1,0)
 ;;=Generic call to file edits into FM file.
 ;;^UTILITY(U,$J,"REM",141,2,0)
 ;;=^8994.02A^2^2
 ;;^UTILITY(U,$J,"REM",141,2,1,0)
 ;;=EDIT RESULTS^2^512^1
 ;;^UTILITY(U,$J,"REM",141,2,1,1,0)
 ;;=^^1^1^2950124^
 ;;^UTILITY(U,$J,"REM",141,2,1,1,1,0)
 ;;=Results of editing to be placed in FDA array by broker.
 ;;^UTILITY(U,$J,"REM",141,2,2,0)
 ;;=EDIT MODE^1^3^1
 ;;^UTILITY(U,$J,"REM",141,2,2,1,0)
 ;;=^^1^1^2950508^^
 ;;^UTILITY(U,$J,"REM",141,2,2,1,1,0)
 ;;=Is processing in edit or add data mode.
 ;;^UTILITY(U,$J,"REM",141,2,"B","EDIT MODE",2)
 ;;=
 ;;^UTILITY(U,$J,"REM",141,2,"B","EDIT RESULTS",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",141,3,0)
 ;;=^^2^2^2950508^^
 ;;^UTILITY(U,$J,"REM",141,3,1,0)
 ;;=If file update is successful, then a 1 is returned. A 0 is returned if
 ;;^UTILITY(U,$J,"REM",141,3,2,0)
 ;;=unsuccessful.
 ;;^UTILITY(U,$J,"REM",142,0)
 ;;=DDR VALIDATOR^VALC^DDR3^2^R
 ;;^UTILITY(U,$J,"REM",142,1,0)
 ;;=^^3^3^2970121^^^
 ;;^UTILITY(U,$J,"REM",142,1,1,0)
 ;;=This function allows the application to validate user input to
 ;;^UTILITY(U,$J,"REM",142,1,2,0)
 ;;=a field before filing data. The call uses the database server VAL^DIE
 ;;^UTILITY(U,$J,"REM",142,1,3,0)
 ;;=call.
 ;;^UTILITY(U,$J,"REM",142,2,0)
 ;;=^8994.02A^2^1
 ;;^UTILITY(U,$J,"REM",142,2,2,0)
 ;;=PARAMETERS^2^512^1
 ;;^UTILITY(U,$J,"REM",142,2,2,1,0)
 ;;=^^4^4^2970121^^^
 ;;^UTILITY(U,$J,"REM",142,2,2,1,1,0)
 ;;=This array contains the following parameters necessary to call VAL^DIE:
 ;;^UTILITY(U,$J,"REM",142,2,2,1,2,0)
 ;;=    - "FILE"  - file number
 ;;^UTILITY(U,$J,"REM",142,2,2,1,3,0)
 ;;=    - "IENS"  - internal entry numbers
 ;;^UTILITY(U,$J,"REM",142,2,2,1,4,0)
 ;;=    - "VALUE" - user input value
 ;;^UTILITY(U,$J,"REM",142,2,2,1,5,0)
 ;;=    - "VALUE" - user input value
 ;;^UTILITY(U,$J,"REM",142,2,"B","PARAMETERS",2)
 ;;=
 ;;^UTILITY(U,$J,"REM",142,3,0)
 ;;=^^2^2^2970121^^^
 ;;^UTILITY(U,$J,"REM",142,3,1,0)
 ;;=This call passes back information in the [data] section and
 ;;^UTILITY(U,$J,"REM",142,3,2,0)
 ;;=the [errors] section.
 ;;^UTILITY(U,$J,"REM",143,0)
 ;;=DDR DELETE ENTRY^DIKC^DDR1^1^R
 ;;^UTILITY(U,$J,"REM",143,1,0)
 ;;=^^1^1^2970912^^^^
 ;;^UTILITY(U,$J,"REM",143,1,1,0)
 ;;=This function deletes an entry in a FileMan file using ^DIK.
 ;;^UTILITY(U,$J,"REM",143,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",143,2,1,0)
 ;;=PARAMETERS^2^512^1
 ;;^UTILITY(U,$J,"REM",143,2,1,1,0)
 ;;=^^3^3^2970814^^
 ;;^UTILITY(U,$J,"REM",143,2,1,1,1,0)
 ;;=This array contains the following parameters necessary to call ^DIK.
 ;;^UTILITY(U,$J,"REM",143,2,1,1,2,0)
 ;;=   "ROOT" global root of file or subfile
 ;;^UTILITY(U,$J,"REM",143,2,1,1,3,0)
 ;;=   "IEN"  internal entry number of record to be deleted in IENS format
 ;;^UTILITY(U,$J,"REM",143,2,"B","PARAMETERS",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",143,3,0)
 ;;=^^1^1^2970108^
 ;;^UTILITY(U,$J,"REM",143,3,1,0)
 ;;=This parameter returns 1 if record was deleted else it returns 0.
 ;;^UTILITY(U,$J,"REM",144,0)
 ;;=DDR LOCK/UNLOCK NODE^LOCKC^DDR1^1^R
 ;;^UTILITY(U,$J,"REM",144,1,0)
 ;;=^^3^3^2970110^^^
 ;;^UTILITY(U,$J,"REM",144,1,1,0)
 ;;=This function will lock or unlock an M global node.  Also,
 ;;^UTILITY(U,$J,"REM",144,1,2,0)
 ;;=this function allows the calling application to specify the
 ;;^UTILITY(U,$J,"REM",144,1,3,0)
 ;;=timeout (in seconds) for a 'lock' command.
 ;;^UTILITY(U,$J,"REM",144,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",144,2,1,0)
 ;;=PARAMETERS^2^512
 ;;^UTILITY(U,$J,"REM",144,2,1,1,0)
 ;;=^^7^7^2970110^
 ;;^UTILITY(U,$J,"REM",144,2,1,1,1,0)
 ;;=This array contains the following parameter necessary for
 ;;^UTILITY(U,$J,"REM",144,2,1,1,2,0)
 ;;=a Lock command:
 ;;^UTILITY(U,$J,"REM",144,2,1,1,3,0)
 ;;=|TAB|- NODE - the global node that needs to be locked/unlocked
 ;;^UTILITY(U,$J,"REM",144,2,1,1,4,0)
 ;;=|TAB|- LOCKMODE - the operation to be done, Lock or Unlock
 ;;^UTILITY(U,$J,"REM",144,2,1,1,5,0)
 ;;=|TAB|- TIMEOUT - integer representing the number of seconds during which
 ;;^UTILITY(U,$J,"REM",144,2,1,1,6,0)
 ;;=the system attempts to lock or unlock a node before returning control to
 ;;^UTILITY(U,$J,"REM",144,2,1,1,7,0)
 ;;=the program .
 ;;^UTILITY(U,$J,"REM",144,2,"B","PARAMETERS",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",144,3,0)
 ;;=^^2^2^2970110^^
 ;;^UTILITY(U,$J,"REM",144,3,1,0)
 ;;=This parameter returns 1 if the lock or unlock command is successful,
 ;;^UTILITY(U,$J,"REM",144,3,2,0)
 ;;=otherwise a 0 is returned.
 ;;^UTILITY(U,$J,"REM",145,0)
 ;;=DDR FIND1^FIND1C^DDR2^2^R^
 ;;^UTILITY(U,$J,"REM",145,1,0)
 ;;=^^2^2^2970121^
 ;;^UTILITY(U,$J,"REM",145,1,1,0)
 ;;=This function returns the internal entry number of a record using
 ;;^UTILITY(U,$J,"REM",145,1,2,0)
 ;;=$$FIND1^DIC.
 ;;^UTILITY(U,$J,"REM",145,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",145,2,1,0)
 ;;=PARAMETERS^2^512^1
 ;;^UTILITY(U,$J,"REM",145,2,1,1,0)
 ;;=^^15^15^2970121^
 ;;^UTILITY(U,$J,"REM",145,2,1,1,1,0)
 ;;=This array contains the following parameters necessary to call
 ;;^UTILITY(U,$J,"REM",145,2,1,1,2,0)
 ;;=$$FIND1^DIC.
 ;;^UTILITY(U,$J,"REM",145,2,1,1,3,0)
 ;;= 
 ;;^UTILITY(U,$J,"REM",145,2,1,1,4,0)
 ;;=   "FILE" the file or subfile number to search
 ;;^UTILITY(U,$J,"REM",145,2,1,1,5,0)
 ;;=   "IENS" the IENS that identifies the subfile if FILE is a subfile number
 ;;^UTILITY(U,$J,"REM",145,2,1,1,6,0)
 ;;=   "FLAGS" possible values include:
 ;;^UTILITY(U,$J,"REM",145,2,1,1,7,0)
 ;;=        A  allow pure numeric input to always be tried as an IEN
 ;;^UTILITY(U,$J,"REM",145,2,1,1,8,0)
 ;;=        M  multiple index allowed
 ;;^UTILITY(U,$J,"REM",145,2,1,1,9,0)
 ;;=        O  only find an exact match if possible
 ;;^UTILITY(U,$J,"REM",145,2,1,1,10,0)
 ;;=        Q  quick lookup
 ;;^UTILITY(U,$J,"REM",145,2,1,1,11,0)
 ;;=        X  exact match only
 ;;^UTILITY(U,$J,"REM",145,2,1,1,12,0)
 ;;=        R  record the ien in ^DISV via RECALL^DILFD
 ;;^UTILITY(U,$J,"REM",145,2,1,1,13,0)
 ;;=   "VALUE" the lookup value
 ;;^UTILITY(U,$J,"REM",145,2,1,1,14,0)
 ;;=   "XREF" the indexes that would be searched for a match
 ;;^UTILITY(U,$J,"REM",145,2,1,1,15,0)
 ;;=   "SCREEN" screen to apply to the record found
 ;;^UTILITY(U,$J,"REM",145,2,"B","PARAMETERS",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",145,3,0)
 ;;=^^5^5^2970121^
 ;;^UTILITY(U,$J,"REM",145,3,1,0)
 ;;=This parameter returns a valid internal record number if a match
 ;;^UTILITY(U,$J,"REM",145,3,2,0)
 ;;=is found, a 0 if no match was found or a -1 if an error occurred.
 ;;^UTILITY(U,$J,"REM",145,3,3,0)
 ;;= 
 ;;^UTILITY(U,$J,"REM",145,3,4,0)
 ;;=(For now, this is 'single value'.  It will return the error array
 ;;^UTILITY(U,$J,"REM",145,3,5,0)
 ;;=later.)
 ;;^UTILITY(U,$J,"REM",146,0)
 ;;=DDR GET DD HELP^GETHLPC^DDR2^2^R
 ;;^UTILITY(U,$J,"REM",147,0)
 ;;=DDR FINDER^FINDC^DDR0^4^R^^^1
 ;;^UTILITY(U,$J,"REM",147,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",147,2,1,0)
 ;;=FIND ATTRIBUTES^2^512
 ;;^UTILITY(U,$J,"REM",147,2,"B","FIND ATTRIBUTES",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",353,0)
 ;;=DDR KEY VALIDATOR^KEYVAL^DDR3^2^P
 ;;^UTILITY(U,$J,"REM",353,1,0)
 ;;=^^2^2^2960221^
 ;;^UTILITY(U,$J,"REM",353,1,1,0)
 ;;=Validates that values passed in do not violate key integrity.  Underlying
 ;;^UTILITY(U,$J,"REM",353,1,2,0)
 ;;=DBS call is KEYVAL^DIE.
 ;;^UTILITY(U,$J,"REM",353,2,0)
 ;;=^8994.02A^1^1
 ;;^UTILITY(U,$J,"REM",353,2,1,0)
 ;;=VALUES TO VALIDATE^2^512^1
 ;;^UTILITY(U,$J,"REM",353,2,1,1,0)
 ;;=^^3^3^2960221^
 ;;^UTILITY(U,$J,"REM",353,2,1,1,1,0)
 ;;=Array of data used to create FDA for KEYVAL^DIE call.  Alternating lines
 ;;^UTILITY(U,$J,"REM",353,2,1,1,2,0)
 ;;=contain file#^IENS^field# and value associated with preceding file, record,
 ;;^UTILITY(U,$J,"REM",353,2,1,1,3,0)
 ;;=and field.
 ;;^UTILITY(U,$J,"REM",353,2,"B","VALUES TO VALIDATE",1)
 ;;=
 ;;^UTILITY(U,$J,"REM",353,3,0)
 ;;=^^3^3^2960430^^
 ;;^UTILITY(U,$J,"REM",353,3,1,0)
 ;;=If values pass validation, 1 is returned in first node of array.  If

DIINI007
DIINI007 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"REM",353,3,2,0)
 ;;=validation fails, 0 is returned in first node followed by error
 ;;^UTILITY(U,$J,"REM",353,3,3,0)
 ;;=information.

DIINIS
DIINIS ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PAC(PKG,VER) ; called from package init (DIFROM7 created this routine)
 ; PKG = $T(IXF) of the INIT routine.
 ; VER is an array that is contained in DIFROM from the INIT routine
 ;
 N %,%I,%H,DATE,DIFROM,NOW,PACKAGE,RUN,SERVER,SITE,START,X,XMDUZ,XMSUB,XMTEXT,XMY,Y K ^TMP("DIINIS",$J)
 ;
 ; Site tracking updates only occur if run in a VA production primary domain
 ; account.
 I $G(^XMB("NETNAME"))'[".VA.GOV" Q
 Q:'$D(^%ZOSF("UCI"))  Q:'$D(^%ZOSF("PROD"))
 X ^%ZOSF("UCI") I Y'=^%ZOSF("PROD") Q
 ;
 S SERVER="S.A5CSTS@FORUM.VA.GOV"
 S PACKAGE=$P($P(PKG,";",3),U)
 S SITE=$G(^XMB("NETNAME"))
 S START=$P($G(^DIC(9.4,VER(0),"PRE")),U,2) I '$L(START) S START="Unknown"
 D  ; check if ok to use kernel functions
 .S X="XLFDT" X ^%ZOSF("TEST") I $T D  Q
 ..S NOW=$$HTFM^XLFDT($H)
 ..S RUN="Unknown" I START S RUN=$$FMDIFF^XLFDT(NOW,START,3)
 ..S START=$$FMTE^XLFDT(START)
 ..S DATE=NOW\1
 ..S NOW=$$FMTE^XLFDT(NOW)
 .D NOW^%DTC S NOW=%,DATE=X
 .S RUN="" ; don't bother to compute
 .S Y=START D DD^%DT S START=Y
 .S Y=NOW D DD^%DT S NOW=Y
 ;
 ; Message for server
 S ^TMP("DIINIS",$J,1,0)="PACKAGE INSTALL"
 S ^TMP("DIINIS",$J,2,0)="SITE: "_SITE
 S ^TMP("DIINIS",$J,3,0)="PACKAGE: "_PACKAGE
 S ^TMP("DIINIS",$J,4,0)="VERSION: "_VER
 S ^TMP("DIINIS",$J,5,0)="Start time: "_START
 S ^TMP("DIINIS",$J,6,0)="Completion time: "_NOW
 S ^TMP("DIINIS",$J,7,0)="Run time: "_RUN
 S ^TMP("DIINIS",$J,8,0)="DATE: "_DATE
 ;
 ; Data is sent to server on FORUM - S.A5CSTS
 S XMY(SERVER)="",XMDUZ=.5,XMTEXT="^TMP(""DIINIS"",$J,",XMSUB=PACKAGE_" VERSION "_VER_" INSTALLATION"
 D ^XMD
 K ^TMP("DIINIS",$J)
 Q

DIINIT
DIINIT ; ; 28-MAR-2013 ; 3/28/13 10:58am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K DIF,DIFQ,DIFQR,DIFQN,DIK,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DIFROM,DFR,DTN,DIX,DZ,DIRUT,DTOUT,DUOUT
 S DIOVRD=1,U="^",DIFQ=0,DIFROM="22.2" W !,"This version (#22.2) of 'DIINIT' was created on 28-MAR-2013"
 W !?9,"(at V22P2.FILEMAN.MUMPS.ORG, by VA FILEMAN 22.2V2)",!
 I $D(^DD("VERSION")),^("VERSION")'<22.2 G GO
 ;W !,"FIRST, I'LL FRESHEN UP YOUR VA FILEMAN...." D N^DINIT
 I ^DD("VERSION")<22.2 W !,"but I need version 22.2 of the VA FileMan!" G Q
GO ;
EN ; ENTER HERE TO BYPASS THE PRE-INIT PROGRAM
 S DIFQ=0 K DIRUT,DTOUT,DUOUT
 F DIFRIR=1:1:1 S DIFRRTN="^DIINIT"_$E("5",DIFRIR) D @DIFRRTN
 W:0 !,"I AM GOING TO SET UP THE FOLLOWING FILE:" F I=1:2:0 S DIF(I)=^UTILITY("DIF",$J,I) D 1 G Q:DIFQ!$D(DIRUT) K DIF(I)
 S DIFROM="22.2" D PKG:'$D(DIFROM(0)),^DIINIT1 G Q:'$D(DIFQ) S DIK(0)="AB"
 F DIF=1:2:0 S %=^UTILITY("DIF",$J,DIF),DIK=$P(%,";",5),N=$P(%,";",3),D=$P(%,";",4)_U_N D D K DIFQ(N)
 K DIFQR D ^DIINIT2,^DIINIT3
 L  S DUZ=DIDUZ W:0 !,$C(7),"OK, I'M DONE.",!,"NO"_$P("TE THAT FILE",U,DSEC)_" SECURITY-CODE PROTECTION HAS BEEN MADE"
 I DIFROM F DIF=1:2:0 S %=^UTILITY("DIF",$J,DIF),N=+$P(%,";",3) I N,$P(%,";",8)="y" S ^DD(N,0,"VR")=DIFROM
 I DIFROM(0)>0 F %="PRE","INI","INIT" S:$D(DIFROM(%)) $P(^DIC(9.4,DIFROM(0),%),U,2)=DIFROM(%)
 I $G(DIFQN) S $P(^(0),U,3,4)=$P(DIFQN,U,2)_U_($P(^DIC(0),U,4)+DIFQN) K DIFQN
 I DIFROM,$D(^%ZTSK) S X="DIINIS" X ^%ZOSF("TEST") D:$T PAC^DIINIS($T(IXF),.DIFROM)
 S:DIFROM(0)>0 ^DIC(9.4,DIFROM(0),"VERSION")=DIFROM G Q^DIFROM0
D S:$D(^DIC(+N,0))[0 ^(0)=D S X=$D(@(DIK_"0)")),^(0)=D_U_$S(X#2:$P(^(0),U,3,9),1:U)
 S DIFQR=DIFQR(+N) I ^DD("VERSION")>17.5,$D(^DD(+N,0,"DIK"))#2 S X=^("DIK"),Y=+N,DMAX=^DD("ROU") D EN^DIKZ
 I DIFQR D IXALL^DIK:$O(@(DIK_"0)")) W "."
 Q
R G REP^DIINIT2
 ;
1 S N=+$P(DIF(I),";",3),DIF=$P(DIF(I),";",4),S=$P(DIF(I),";",5)
 W !!?3,N,?13,DIF,$P("  (Partial Definition)",U,$P(DIF(I),";",6)),$P("  (including data)",U,$P(DIF(I),";",13)="y") S Z=$S($D(^DIC(N,0))#2:^(0),1:"")
 I Z="" S DIFQ(N)=1,DIFQN=$G(DIFQN)+1_U_N G S
 I $L($P(Z,DIF)) W $C(7),!,"*BUT YOU ALREADY HAVE '",$P(Z,U),"' AS FILE #",N,"!" D R Q:DIFQ  G S:$D(DIFKEP(N)),1
 S DIFQ(N)=$P(DIF(I),";",7)'="n"
 I $L(Z) W $C(7),!,"Note:  You already have the '",$P(Z,U),"' File." S DIFQ(0)=1
 S %=$E(^UTILITY("DIF",$J,I+1),4,245) I %]"" X % S DIFQ(N)=$T W:'$T !,"Screen on this Data Dictionary did not pass--DD will not be installed!" G S
 I $L(Z),$P(DIF(I),";",10)="y" S DIR("A")="Shall I write over the existing Data Definition",DIR("??")="^D DD^DIFROMH1",DIR("B")="YES",DIR(0)="Y" D ^DIR S DIFQ(N)=Y
S S DIFQR(N)=0 Q:$P(DIF(I),";",13)'="y"!$D(DIRUT)
 I $P(DIF(I),";",15)="y",$O(@(S_"0)"))>0 S DIF=$P(DIF(I),";",14)="o",DIR("A")="Want my data "_$P("merged with^to overwrite",U,DIF+1)_" yours",DIR("??")="^D DTA^DIFROMH1",DIR(0)="Y" D ^DIR S DIFQR(N)=$S('Y:Y,1:Y+DIF) Q
 S %=$P(DIF(I),";",14)="o" W !,$C(7),"I will ",$P("MERGE^OVERWRITE",U,%+1)," your data with mine." S DIFQR(N)=%+1
 Q
Q W $C(7),!!,"NO UPDATING HAS OCCURRED!" G Q^DIFROM0
 ;
PKG S X=$P($T(IXF),";",3),DIC="^DIC(9.4,",DIC(0)="",DIC("S")="I $P(^(0),U,2)="""_$P(X,U,2)_"""",X=$P(X,U) D ^DIC S DIFROM(0)=+Y K DIC
 Q
 ;
IXF ;;VA FILEMAN^DI;1

DIINIT1
DIINIT1 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; LOADS AND INDEXES DD'S
 ;
 K DIF,DIK,D,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DFR,DTN,DIX,DZ D DT^DICRW S %=1,U="^",DSEC=1
 S NO=$P("I 0^I $D(@X)#2,X[U",U,%) I %<1 K DIFQ Q
ASK I %=1,$D(DIFQ(0)) W !,"SHALL I WRITE OVER FILE SECURITY CODES" S %=2 D YN^DICN S DSEC=%=1 I %<1 K DIFQ Q
 F X="KEY","OPT","REM" D W Q:'$D(DIFQ)
 Q:'$D(DIFQ)  S %=2 W !!,"ARE YOU SURE EVERYTHING'S OK" D YN^DICN I %-1 K DIFQ Q
 D ^DIINITPR D NOW^%DTC S DIFROM("INI")=%
 I $D(DIFKEP) F DIDIU=0:0 S DIDIU=$O(DIFKEP(DIDIU)) Q:DIDIU'>0  S DIU=DIDIU,DIU(0)=DIFKEP(DIDIU) D EN^DIU2
 D DT^DICRW K ^UTILITY(U,$J),^UTILITY("DIK",$J) D WAIT^DICD
 S DN="^DIINI" F R=1:1:7 D @(DN_$$B36(R)) W "."
 F  S D=$O(^UTILITY(U,$J,"SBF","")) Q:D'>0  K:'DIFQ(D) ^(D) S D=$O(^(D,"")) I D>0  K ^(D) D IX
KEYSNIX ; Keys and new style indexes installer ; new in FM V22.2
 N DIFRSA S DIFRSA=$NA(^UTILITY("KX",$J)) ; Tran global for Keys and Indexes
 N DIFRFILE S DIFRFILE=0 ; Loop through files
 F  S DIFRFILE=$O(@DIFRSA@("IX",DIFRFILE)) Q:'DIFRFILE  D
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . N DIFRD S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA) ; install New Style Indexes
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA) ; install keys
 K @DIFRSA ; kill off tran global
 ; VEN/SMH v22.2: Below I added a K D1 because it leaks from the call causing the key matching algo to fail.
DATA W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0
 I DIFQR(D) S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=DIFQR(D)'=2 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 K D1 Q:'$D(^(D0,0))  S Z=^(0) D I^DITR
 K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA
 ;
W S Y=$P($T(@X),";",2) W !,"NOTE: This package also contains "_Y_"S",! Q:'$D(DIFQ(0))
 S %=1 W ?6,"SHALL I WRITE OVER EXISTING "_Y_"S OF THE SAME NAME" D YN^DICN I '% W !?6,"Answer YES to replace the current "_Y_"S with the incoming ones." G W
 S:%=2 DIFQ(X)=0 K:%<0 DIFQ
 Q
 ;
OPT ;OPTION
RTN ;ROUTINE DOCUMENTATION NOTE
FUN ;FUNCTION
BUL ;BULLETIN
KEY ;SECURITY KEY
HEL ;HELP FRAME
DIP ;PRINT TEMPLATE
DIE ;INPUT TEMPLATE
DIB ;SORT TEMPLATE
DIS ;FORM
REM ;REMOTE PROCEDURE
 ;
SBF ;FILE AND SUB FILE NUMBERS
IX W "." S DIK="A" F %=0:0 S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," G IXALL^DIK
 Q
B36(X) Q $$N(X\(36*36)#36+1)_$$N(X\36#36+1)_$$N(X#36+1)
N(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

DIINIT2
DIINIT2 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J),DIC S DIDUZ=0 S:$D(DUZ)#2 DIDUZ=DUZ S DUZ=.5
 I $D(^DIC(9.2,0))#2,^(0)?1"HEL".E S (DIC,DLAYGO)=9.2,N="HEL",DIC(0)="LX" G ADD
 Q
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R'>0  S X=$P(^(R,0),U,1) W "." K DA D ^DIC I Y>0,'$D(DIFQ(N))!$P(Y,U,3) S ^UTILITY("DIFROM",$J,N,X)=+Y K ^DIC(9.2,+Y,1),^(2),^(3),^(10) S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y D %XY^%RCR
 S DIK=DIC
HELP S R=$O(^UTILITY("DIFROM",$J,N,R)) Q:R=""  W !,"'"_R_"' Help Frame filed." S DA=^(R)
 F X=0:0 S X=$O(^DIC(9.2,DA,2,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$P(I,U,2) S:Y]"" Y=$O(^DIC(9.2,"B",Y,0)) S ^(0)=$P(^DIC(9.2,DA,2,X,0),U,1)_U_$S(Y>0:Y,1:"")_U_$P(^(0),U,3,99)
 S I=0 F X=0:0 S X=$O(^DIC(9.2,DA,10,X)) Q:'X  I $D(^(X,0)) S Y=$P(^(0),U),Y=$S(Y]"":$O(^MAG("B",Y,0)),1:0) S:Y $P(^DIC(9.2,DA,10,X,0),U)=Y,I=I+1,%=X I 'Y K ^DIC(9.2,DA,10,X,0)
 I I S $P(^DIC(9.2,DA,10,0),U,3,4)=%_U_I
IX D IX1^DIK G HELP
 ;
U I $D(DIRUT) S DIFQ=1
 W ! Q
REP S DIR(0)="Y",DIR("A")="Shall I change the NAME of the file to "_DIF
 S DIR("??")="^D REP^DIFROMH1",DIR("B")="NO" D ^DIR G U:$D(DIRUT)
 I Y S DIE=1,DIFQ=0,DA=N,DR=".01////"_DIF D ^DIE Q
 S DIR("A")="Shall I replace your file with mine"
 S DIR("??")="^D AG^DIFROMH1" D ^DIR G U:$D(DIRUT)!'Y
 S DIU(0)="E",DIR("A")="Do you want to keep the Data"
 S DIR("??")="^D CHG^DIFROMH1" D ^DIR G U:$D(DIRUT)
 S:'Y DIU(0)=DIU(0)_"D"
 S DIR("A")="Do you want to keep the Templates"
 S DIR("??")="^D TEMP^DIFROMH1" D ^DIR G U:$D(DIRUT) S:'Y DIU(0)=DIU(0)_"T"
 S DIFQ(N)=1,DIFKEP(N)=DIU(0) W !?15," (",DIF,") " Q

DIINIT3
DIINIT3 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J) S DIC(0)="LX",(DIC,DLAYGO)=3.6,N="BUL" D ADD:$D(^XMB(3.6,0))
 S X=0 F R=0:0 S X=$O(^UTILITY("DIFROM",$J,N,X)) Q:X=""  W !,"'",X,"' BULLETIN FILED -- Remember to add mail groups for new bulletins."
 I $D(^DIC(9.4,0))#2,^(0)?1"PACK".E S N="PKG",(DIC,DLAYGO)=9.4 D ADD
 G NP:'$D(DA) S %=+$O(^DIC(9.4,DA,22,"B",DIFROM,0)) I $D(^DIC(9.4,DA,22,%,0)) S $P(^(0),U,3)=DT
 I $D(^DIC(9.4,DA,0))#2 S %=$P(^(0),U,4) I %]"" S %=$O(^DIC(9.2,"B",%,0)) S:%]"" $P(^DIC(9.4,DA,0),U,4)=%
OR I $D(^ORD(100.99))&$O(^UTILITY(U,$J,"OR","")) D EN^DIINIT4
NP K DIC,^UTILITY("DIFROM",$J) S DIC(0)="LX" I $D(^DIC(19,0))#2,^(0)?1"OPTION".E S (DIC,DLAYGO)=19,N="OPT" D ADD,OP
 I $D(^DIC(19.1,0))#2,($P(^(0),U)?1"SECUR".E)!($P(^(0),U)="KEY") S (DIC,DLAYGO)=19.1,N="KEY" D ADD K ^UTILITY("DIFROM",$J)
 I $D(^DIC(9.8,0))#2,^(0)?1"ROUTINE^".E S (DIC,DLAYGO)=9.8,N="RTN" D ADD
 S DIC=.5,DLAYGO=0,N="FUN" D ADD
 I $P($G(^DIC(8994,0)),U)="REMOTE PROCEDURE" S (DIC,DLAYGO)=8994,N="REM" D ADD
 S DIC("S")="I $P(^(0),U,4)=DIFL" F N="DIPT","DIBT","DIE" S DIC=U_N_"(" D ADD
 K DIC("S") S N="DIST(.404,",DIC=U_N,DLAYGO=.404 D ADD
 S DIC("S")="I $P(^(0),U,8)=DIFL",N="DIST(.403,",DIC=U_N,DLAYGO=.403 D ADD
 K ^UTILITY(U,$J),DIC,DLAYGO F DIFR="DIE","DIPT" D DIEZ
 K ^UTILITY("DIFROM",$J) Q
DIEZ I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 E  S DISYS=^DD("OS")
 Q:'$D(^DD("OS",DISYS,"ZS"))
 S DIFR1=""
DZ1 S DIFR1=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1)) Q:DIFR1=""
 F DIFR2=0:0 S DIFR2=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  S Y=DIFR2 I $D(@(U_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD"),DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 G DZ1
 ;
OP S R=$O(^UTILITY("DIFROM",$J,N,R)) I R="" K ^UTILITY("DIFROM",$J) G Q
 W !,"'"_R_"' Option Filed" S DA=+^UTILITY("DIFROM",$J,N,R) G:$P(^(R),U,2,3)="XUCORE^"!($P(^(R),U,2,3)="XUCOMMAND^") OP
 I $D(^DIC(19,DA,220)) S %=$P(^(220),U) S:%]"" %=$O(^XMB(3.6,"B",%,0)) S $P(^DIC(19,DA,220),U)=%,%=$P(^(220),U,3) S:%]"" %=$O(^XMB(3.8,"B",%,0)) S $P(^DIC(19,DA,220),U,3)=%
 S %=$P(^DIC(19,DA,0),U,12) S:%]"" %=$O(^DIC(9.4,"B",%,0))
 S $P(^DIC(19,DA,0),U,12)=%,%=$P(^(0),U,7),(DZ,DIX)=0
 D:$D(^DIC(19,DA,10,"B")) KAD(DA) S:%]"" %=$O(^DIC(9.2,"B",%,0)) S $P(^DIC(19,DA,0),U,7)=%,%=$P(^(0),U,4),%="MOQXL"[% K ^(10,"B"),^("C")
 F X=0:0 S X=$O(^DIC(19,DA,10,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$S($D(^(U)):^(U),1:"") K ^DIC(19,DA,10,X) I Y]"",% S D=$O(^DIC(19,"B",Y,0)) I D S ^DIC(19,DA,10,X,0)=D_U_$P(I,U,2,9),DZ=DZ+1,DIX=X
 S:% ^DIC(19,DA,10,0)="^19.01PI^"_DIX_U_DZ D IX1^DIK G OP
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R=""  S X=$P(^(R,0),U),DIFL=$S(N="DIST(.403,":$P(^(0),U,8),N="DIST(.404,":$P(^(0),U,2),1:$P(^(0),U,4)) W "." K DA D ^DIC I Y>0,'$D(DIFQ($E(N,1,3)))!$P(Y,U,3) S Y=Y_U D A
Q Q
A I N="BUL" K % S %(0)=$G(@(DIC_"+Y,2,0)")) F %=0:0 S %=$O(@(DIC_"+Y,2,%)")) Q:'%  S %(%)=$G(^(%,0))
 K:N'="KEY"&(N'="OPT") @(DIC_"+Y)") S ^UTILITY("DIFROM",$J,N,X)=Y S:$E(N,1,2)="DI" ^(X,+Y)="" S:N="PKG" DIFROM(0)=+Y Q:$P(Y,U,2,3)="XUCORE^"!($P(Y,U,2,3)="XUCOMMAND^")
 I N="BUL",%(0)]"" S @(DIC_"+Y,2,0)")=%(0) F %=0:0 S %=$O(%(%)) Q:'%  S @(DIC_"+Y,2,%,0)")=%(%)
 I $E(N,1,2)="DI",('DIFL)!('$D(^DD(+DIFL))) D
 .W !,"**WARNING--"_$S(N="DIE":"INPUT",N="DIPT":"PRINT",N="DIBT":"SORT",1:"FORM or BLOCK")_$S(N'["DIST":" template ",1:" ")_$P(Y,U,2)_" has been installed,",!,"but associated file "_DIFL_" is not on your system!"
 .Q
 I N="OPT" S:$P(^DIC(19,+Y,0),U,6)]"" DIOPT=$P(^(0),U,6) I $O(^UTILITY(U,$J,N,R,1,0)) K ^DIC(19,+Y,1)
 I N="DIST(.403," D BLK
 S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y,DIK=DIC D %XY^%RCR
 D IX1^DIK:N'="OPT" I N="OPT",$D(DIOPT) S:$P(^DIC(19,DA,0),U,6)="" $P(^(0),U,6)=DIOPT K DIOPT
 I N="DIST(.403," D
 .N DIFRVAL S DIFRVAL=$$VAL^DIFROMSS(.403,DA)
 .I DIFRVAL W !,"Compiling form: ",$P(^DIST(.403,DA,0),U) D EN^DDSZ(DA) Q
 .W !,"ERROR: Form: ",$P(^DIST(.403,DA,0),U)," cannot be compiled"
 .Q
 Q
BLK F J=0:0 S J=$O(^UTILITY(U,$J,N,R,40,J)) Q:'J  I $D(^(J,0)) S %=$P(^(0),U,2) S:%]"" %=$O(^DIST(.404,"B",%,0)) S:% $P(^UTILITY(U,$J,N,R,40,J,0),U,2)=% D B1
 K A0,A1,A2,J,L Q
B1 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,40,L)) Q:'L  S A0=$G(^(L,0)),%=$P(A0,U) I %]"" S %=$O(^DIST(.404,"B",%,0)) I % S $P(A0,U)=%,^UTILITY(U,$J,N,R,40,J,"BLK",%,0)=A0 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,40,L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,"BLK",%,X)=^(X)
 .Q
 S A0=$G(^UTILITY(U,$J,N,R,40,J,40,0)) Q:A0=""  K ^UTILITY(U,$J,N,R,40,J,40) S (A1,A2)=0
 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L)) Q:'L  S ^UTILITY(U,$J,N,R,40,J,40,L,0)=^(L,0),A1=L,A2=A2+1 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,40,L,X)=^(X)
 .Q
 S $P(A0,U,3,4)=A1_U_A2,^UTILITY(U,$J,N,R,40,J,40,0)=A0 K ^UTILITY(U,$J,N,R,40,J,"BLK")
 Q
KAD(D0) N D1,X
 S X=0 F  S X=$O(^DIC(19,D0,10,"B",X)) Q:X'>0  S D1=0 F  S D1=$O(^DIC(19,D0,10,"B",X,D1)) Q:D1'>0  K ^DIC(19,"AD",X,D0,D1)
 Q

DIINIT4
DIINIT4 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
EN S DA(1)=1,DIK="^ORD(100.99,1,5," I $D(^ORD(100.99,1,5,DA)) D ^DIK
 S %X="^UTILITY(U,$J,""OR"","_$O(^UTILITY(U,$J,"OR",""))_",",%Y=DIK_DA_","
 S:'$D(^ORD(100.99,1,5,0)) ^(0)="^100.995P^^" S $P(^(0),U,3,4)=DA_U_($P(^(0),U,4)+1)
 D %XY^%RCR S $P(^ORD(100.99,1,5,DA,0),U)=DA,%=$P(^(0),U,4)
 I %]"" S %=$O(^ORD(100.98,"B",%,0)) I %>0 S $P(^ORD(100.99,1,5,DA,0),U,4)=%
 D OR
 S DA(1)=1 D IX1^DIK
 Q
OR S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,1,N)) Q:'N  S X=$P(^(N,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,0)=% S X=N,I=I+1,(R,J)=0,Y="" D OR1
 S:I $P(^ORD(100.99,1,5,DA,1,0),U,3,4)=X_U_I S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,5,N)) Q:'N  S X=$P(^(N,0),U,3) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% $P(^ORD(100.99,1,5,DA,5,N,0),U,3)=% S X=N,I=I+1
 S:I $P(^ORD(100.99,1,5,DA,5,0),U,3,4)=X_U_I K N,R,X,Y,I,J
 Q
OR1 N X F  S R=$O(^ORD(100.99,1,5,DA,1,N,1,R)) Q:'R  S X=$P(^(R,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,1,R,0)=% S Y=R,J=J+1
 S:J $P(^ORD(100.99,1,5,DA,1,N,1,0),U,3,4)=Y_U_J
 Q
ADDP N I,J,N,R,DA,DLAYGO,DO S %=""
 S DIC="^ORD(101,",DIC(0)="LX",DLAYGO=101 D FILE^DICN K DIC Q:Y=-1  S %=+Y Q

DIINIT5
DIINIT5 ; ; 28-MAR-2013 ; 3/28/13 10:57am
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DIF",$J) S DIFRDIFI=1 F I=1:1:0 S ^UTILITY("DIF",$J,DIFRDIFI)=$T(IXF+I),DIFRDIFI=DIFRDIFI+1
 Q
IXF ;;VA FILEMAN^DI

DIINITPR
DIINITPR ; VEN/SMH - Fileman 22.2 Post-Init; 31-JAN-2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 W !!,"Executing the Pre-Init for Fileman 22.2",!!
 ;
 ; We will postpone this to 22.3 and move it over to DINIT.
 ; Kill data dictionary audit nodes as they are no longer used in FM 22.2
 ; W "Deleting the now no longer used ^DD(FN,0,""DDA"") nodes",!
 ; N I F I=-1:0 S I=$O(^DD(I)) Q:+I'=I  K ^DD(I,0,"DDA")
 ;
 ; Remove old now not used DIAUDIT DD menu option
 ; Unfortunately, Fileman doesn't have an API to do this. We have to 
 ; sneak into KIDS.
 W "Deleting the DIAUDIT DD menu option, no longer used in FM 22.2",!
 N OPTIEN S OPTIEN=$O(^DIC(19,"B","DIAUDIT DD","")) ; Get Option IEN
 QUIT:OPTIEN=""
 K ^TMP($J,"XPDEL") ; Kill data container
 S ^TMP($J,"XPDEL",OPTIEN)="" ; Put the options to delete
 D OPTDEL^XPDIA ; KIDS private API.
 QUIT

DIIS
DIIS ;SFISC/GFT-DELETE THIS LINE AND SAVE AS '%ZIS' IF YOU DON'T HAVE A '%ZIS' ROUTINE ;27OCT2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
%ZIS ;
 I $D(IOP)#2 S IO=$I G PARAMS
 S IO=$I ;READ "DEVICE: ",IO ;INSERT DEVICE SELECTION HERE
PARAMS S IOM=80,IOSL=24,IOF="#",IOPAR="",POP=0,ION=$P(IO,";"),IOT="TRM"
 S IO(0)=$P,IOBS="$C(8)"
 ;
 ; DIISS uses the variable IOST to determine what to set the screen
 ; handling variables to.  (See routine DIISS.)  DIISS currently
 ; looks for values of IOST equal to C-VT220 and C-VT320.  If it
 ; equals anything else, the IO variables default to the codes for
 ; C-VT100 terminals.
 ;
 ; The variable IOXY contains the code to position the cursor at
 ; column position DX and row position DY.  Unmodified, this
 ; routine sets IOXY to the code for VT100, VT220, and VT320
 ; terminals.
 ;
 S IOST="C-VT100"
 S IOXY="W $C(27,91)_(DY+1)_$C(59)_(DX+1)_$C(72)"
 Q
 ;
 ;
 ;
REWIND(IO2,IOT,IOPAR) ;Rewind Device
 Q 0
 ;
HOME ;called from DDFIX,DDMP2,DDSCLONE,DIAR,DIARR,DIARR5,DIARX,DIFGO
 S IO=$I G PARAMS

DIISC
DIISC ;GFT/GFT - SAVE AS '%ZISC' IF YOU DON'T HAVE A '%ZISC' ROUTINE;27OCT2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;;
%ZISC ;
 I IO'=$P D
 .C IO

DIISS
DIISS ;SFISC/MKO-SAVE AS %ZISS IF STANDALONE FILEMAN ;01:39 PM  21 Dec 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
%ZISS ;SFISC/MKO-RETURN SCREEN HANDLING IO VARIABLES ;
 ;
 ; This routine is for standalone FileMan sites that want to use
 ; FileMan's screen-oriented utilities.  It must be saved as %ZISS
 ; in the manager account.  There are four entry points:
 ;
 ;   ENDR  - returns the IO variables required for screen handling
 ;   KILL  - kills the IO variables set by ENDR
 ;   GSET  - returns the IO variables required to draw lines
 ;   GKILL - kills the IO variables set by GSET
 ;
 ; The input variable to all of these entry points is
 ;
 ;   IOST  - the terminal type name (e.g., C-VT100)
 ;
 ; The terminal types supported by this routine are C-VT100,
 ; C-VT220, and C-VT320.  To support another terminal
 ; type, modify the highlighted line in subroutine GETT, and create
 ; new subroutines that sets the IO variables appropriately.
 ;
 ; Also note that %ZIS must return in IOXY the code to position the
 ; cursor at column DX and row DY.
 ;
GETT ;Based on value of IOST, returns DITT with values:
 ;  1 = C-VT100 (default)
 ;  2 = C-VT220 or C-VT320
 ;  3 = C-DATATREE
 S U="^",DIIOST=$TR(IOST," ","")
 ;
 ;******
 ;**  To recognize other terminal types, modify the following line of
 ;**  code and add new subroutines (e.g., 4 and G4 for C-QUME) that
 ;**  set the IO variables equal to the codes for that terminal type.
 ;******
 ;
 S DITT=$S("^C-VT220^C-VT320^"[(U_DIIOST_U):2,DIIOST="C-DATATREE":3,1:1)
 ;*****
 K DIIOST
 Q
ENDR ;Set screen handler IO variables
 N DITT
 D GETT,@DITT
 Q
GSET ;Set graphics variables
 N DITT
 D GETT,@("G"_DITT)
 Q
KILL ;Kill screen handler IO variables
 K IOCUU,IOCUD,IOCUF,IOCUB,IOPF1,IOPF2,IOPF3,IOPF4
 K IOFIND,IOINSERT,IOREMOVE,IOSELECT,IOPREVSC,IONEXTSC,IOHELP,IODO
 K IOKPAM,IOKPNM
 K IOKP0,IOKP1,IOKP2,IOKP3,IOKP4,IOKP5,IOKP6,IOKP7,IOKP8,IOKP9
 K IOMINUS,IOCOMMA,IOPERIOD,IOENTER
 K IOEDALL,IOEDEOP,IOELEOL,IOELALL
 K IOINHI,IOINLOW,IOINORM,IORVON,IORVOFF,IOUON,IOUOFF,IOSGR0
 K IORI,IOSTBM,IOIL,IODL,IOICH,IODCH
 K IOIRM1,IOIRM0,IOAWM0,IOAWM1
 Q
GKILL ;Kill graphics variables
 K IOG0,IOG1,IOBLC,IOBRC,IOTLC,IOTRC,IOHL,IOVL,IOLT,IOTT,IORT,IOBT,IOMT
 Q
1 ;VT100 codes
 S IOCUU=$C(27)_"[A"
 S IOCUD=$C(27)_"[B"
 S IOCUF=$C(27)_"[C"
 S IOCUB=$C(27)_"[D"
 S IOPF1=$C(27)_"OP"
 S IOPF2=$C(27)_"OQ"
 S IOPF3=$C(27)_"OR"
 S IOPF4=$C(27)_"OS"
 S IOFIND=$C(27)_"[1~"
 S IOINSERT=$C(27)_"[2~"
 S IOREMOVE=$C(27)_"[3~"
 S IOSELECT=$C(27)_"[4~"
 S IOPREVSC=$C(27)_"[5~"
 S IONEXTSC=$C(27)_"[6~"
 S IOHELP=$C(27)_"[28~"
 S IODO=$C(27)_"[29~"
 S IOKP0=$C(27)_"Op"
 S IOKP1=$C(27)_"Oq"
 S IOKP2=$C(27)_"Or"
 S IOKP3=$C(27)_"Os"
 S IOKP4=$C(27)_"Ot"
 S IOKP5=$C(27)_"Ou"
 S IOKP6=$C(27)_"Ov"
 S IOKP7=$C(27)_"Ow"
 S IOKP8=$C(27)_"Ox"
 S IOKP9=$C(27)_"Oy"
 S IOMINUS=$C(27)_"Om"
 S IOCOMMA=$C(27)_"Ol"
 S IOPERIOD=$C(27)_"On"
 S IOENTER=$C(27)_"OM"
 S IOEDEOP=$C(27)_"[J"
 S IOEDALL=$C(27)_"[2J"
 S IOELEOL=$C(27)_"[K"
 S IOELALL=$C(27)_"[2K"
 S IOAWM0=$C(27)_"[?7l"
 S IOAWM1=$C(27)_"[?7h"
 S IOINHI=$C(27)_"[1m"
 S IOINLOW=$C(27)_"[m"
 S IOINORM=$C(27)_"[m"
 S IOUON=$C(27)_"[4m"
 S IOUOFF=$C(27)_"[m"
 S IORVON=$C(27)_"[7m"
 S IORVOFF=$C(27)_"[m"
 S IOSGR0=$C(27)_"[m"
 S IORI=$C(27)_"M"
 S IOSTBM="$C(27,91)_+IOTM_"";""_+IOBM_""r"""
 S IOIL=$C(27)_"[L"
 S IODL=$C(27)_"[M"
 S IOICH=$C(27)_"[@"
 S IODCH=$C(27)_"[P"
 S IOIRM1=$C(27)_"[4h"
 S IOIRM0=$C(27)_"[4l"
 S IOKPAM=$C(27)_"="
 S IOKPNM=$C(27)_">"
 Q
G1 ;VT100 line drawing codes
 S IOG0=$C(27)_"(B"
 S IOG1=$C(27)_"(0"
 S IOBLC="m"
 S IOBRC="j"
 S IOTLC="l"
 S IOTRC="k"
 S IOHL="q"
 S IOVL="x"
 S IOLT="t"
 S IOTT="w"
 S IORT="u"
 S IOBT="v"
 S IOMT="n"
 Q
2 ;VT220 and VT320 codes
 ;The codes are the same as VT100 except for a few
 D 1
 S IOINLOW=$C(27)_"[22m"
 S IOUOFF=$C(27)_"[24m"
 S IORVOFF=$C(27)_"[27m"
 Q
G2 ;VT220 and VT320 line drawing codes
 ;The codes are the same as those for VT100s
 D G1
 Q
3 ;C-DATATREE codes
 S IOXY="W /C(DX,DY)"
 S IOCUU=$C(1)
 S IOCUD=$C(11)
 S IOCUF=$C(18)
 S IOCUB=$C(14)
 S IOPF1=$C(21)
 S IOPF2=$C(22)
 S IOPF3=$C(23)
 S IOPF4=$C(24)
 S IOEDALL=$C(12)
 S IOEDEOP=$C(255)_"EF"
 S IOELEOL=$C(255)_"EL"
 S IOELALL=""
 S IOAWM0=""
 S IOAWM1=""
 S IOINHI=$C(255)_"AB"
 S IOINLOW=$C(255)_"AA"
 S IOUON=$C(255)_"AC"
 S IOUOFF=$C(255)_"AA"
 S IORVON=$C(255)_"AE"
 S IORVOFF=$C(255)_"AA"
 S IOINORM=$C(255)_"AA"
 S IOSGR0=$C(255)_"AA"
 S IORI=""
 S IOSTBM=""
 S IOIL=""
 S IODL=""
 S IOICH=""
 S IODCH=""
 S IOIRM1=""
 S IOIRM0=""
 Q
G3 ;C-DATATREE line drawing codes
 S IOG0=""
 S IOG1=""
 S IOBLC=$C(192)
 S IOBRC=$C(217)
 S IOTLC=$C(218)
 S IOTRC=$C(191)
 S IOHL=$C(196)
 S IOVL=$C(179)
 S IOLT=$C(195)
 S IOTT=$C(194)
 S IORT=$C(180)
 S IOBT=$C(193)
 S IOMT=$C(197)
 Q

DIK
DIK ;SFISC/GFT,YJK,XAK-GATHER A FILE'S XREFS TO EXECUTE ;1NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:"(,"'[$E($RE(DIK))  Q:'$G(DA)  Q:'$D(@(DIK_"DA)"))  Q:$P($G(^DD($$GLO^DILIBF(DIK),0,"DI")),U,2)["Y"&'$D(DIOVRD)&'$G(DIFROM)  Q:DA'>0
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIAU,DIKALLR
 D CHKS I $D(DIKZ1) N DIKIL S DIKIL=1 G @DIKGP
 S X=2 D DD G ^DIK1
 ;
DD1 N DISKIPIN D D,A Q
 ;
 ;
DISKIPIN(DISKIPIN) ;ALSO CALLED FROM DIU1
 K DISKIPIN S DISKIPIN=1 D DDGO
 F DV=0:0 S DV=$O(^DD("IX","B",+$P($G(@(DIK_"0)")),U,2),DV)) Q:'DV  I $G(^DD("IX",DV,"NOREINDEX")) S DISKIPIN=DISKIPIN+1
 S DISKIPIN=DISKIPIN-1 Q  ;RETURN THE NUMBER OF SKIPPED INDEXES
 ;
DD ;CALLED FROM DIKZ0
 N DISKIPIN
DDGO D DIKJ N DIKCHK S DIKCHK=1,DV=0 D D,A
 I $G(DIK(0))["s" S DU=1 Q
E S DV=$O(^DD(DH,"SB",DV))
 I DV>0 S DU=$O(^(DV,0)) G E:'$D(^DD(DV,.01,0)),E:$P(^(0),U,2)["W" S DW=$P($P(^DD(DH,DU,0),U,4),";") S:+DW'=DW DW=""""_DW_"""" S DV(DH,DU)=DW,DV(DH,DU,0)=DV,DU(DV)=DH D:$D(DIK0) CRT^DIKZ2 G E
 Q:$D(DIK0)
DH S DH=$O(DU(DH)) G:DH>0 DH:$D(DV(DH)),E
 F DH=DH(1):0 S DH=$O(DU(DH)) Q:DH'>0  D D,A
DV S DH=0 F  S DH=$O(DV(DH)) Q:'DH  S DU=0 F  S DU=$O(DV(DH,DU)) Q:'DU  I $G(DIKCHK),'$G(DIKCHK(DV(DH,DU,0))) S DV(DH,DU,"NOLOOP")=""
 S DU=1
 Q
 ;
DW I $O(^UTILITY("DIK",DIKJ,DH,DV,0))="" K ^UTILITY("DIK",DIKJ,DH,DV)
D S DV=$O(^DD(DH,"IX",DV)) Q:DV'>0  I '$D(^DD(DH,DV,0)) K ^DD(DH,"IX",DV) G D
 D 0
I F DW=0:0 S DW=$O(^DD(DH,DV,1,DW)) G DW:DW'>0  I $D(^(DW,X)),"Q"'[^(X),$D(^(0)) S %=^(0) D
 .I $G(^("NOREINDEX")),$G(DISKIPIN) S DISKIPIN(DISKIPIN)=%,DISKIPIN=DISKIPIN+1 Q
 .D INX
 ;
INX I %["TRIGGER" S %=^(X),^UTILITY("DIK",DIKJ,DH,DV,DW)="D RCR",^(DW,0)=% Q
 I %["BULLETIN MESSAGE",$G(DIK(0))["B" S %=$P("CREA^DELE",U,X)_"TE VALUE" W:$D(^(%)) !,"...('"_^(%)_"' BULLETIN WILL NOT BE TRIGGERED)..." Q
 I '$D(DIK0),X=2,$P(%,U),$P(%,U,2)]"",$P(%,U,3)="",+%=DH(1)&$G(DIKALLR)!$D(DU(+%)) D
 . S ^UTILITY("DIK",DIKJ,"KW",+%,$P(%,U,2))=DH_U_DV_U_DW
 . D CHK($G(DU(+%)),.DU,.DIKCHK)
 E  D
 . S ^UTILITY("DIK",DIKJ,DH,DV,DW)=^DD(DH,DV,1,DW,X)
 . D CHK(DH,.DU,.DIKCHK)
 Q
CHK(F,DU,DIKCHK) ;Set CHK(f) for file F and its parents
 Q:$D(DIK0)!'$G(DIKCHK)
 F  Q:'F  Q:$D(DIKCHK(F))  S DIKCHK(F)=1,F=$G(DU(F))
 Q
 ;
A F DV=0:0 S DV=$O(^DD(DH,"AUDIT",DV)) Q:DV'>0  D A1 ;FIND AUDITED FIELDS
 Q
A1 D 0 S ^UTILITY("DIK",DIKJ,DH,DV,99)="S DIIX="_(4-X)_" D:$G(DIK(0))'[""A"" AUDIT" D CHK(DH,.DU,.DIKCHK) Q
 ;
0 ;REMEMBER HOW TO GRAB THE FIELD'S VALUE
 S DW=$P(^DD(DH,DV,0),U,4),^UTILITY("DIK",DIKJ,DH,DV)=$P(DW,";",1),DW=$P(DW,";",2)
 S ^UTILITY("DIK",DIKJ,DH,DV,0)=$S(DW:"S X=$P($G(^(X)),U,"_DW_")",1:"S X=$E($G(^(X)),"_+$E(DW,2,9)_","_$P(DW,",",2)_")"),DW=0 Q
 ;
IX ;
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
 D CHKS I $D(DIKZ1) N DIKKS S DIKKS=1 G @DIKGP
 S X=2,DIKNM=1 D DD,1^DIK1
IX1 ;
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKSET,DIKALLR
 I '$D(DIKNM) D CHKS I $D(DIKZ1) N DIKST S DIKST=1 G @DIKGP
 S X=1,DIKSET=1 D DD,1^DIK1
 ;
 D INDEX^DIKC(DIK,.DA,"","",$E("K",$D(DIKNM)#2)_"S"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
 G Q
 ;
IX2 ;
 Q:$D(@(DIK_"0)"))[0
 N DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
 S X=2 D DD,1^DIK1
 D INDEX^DIKC(DIK,.DA,"","","K"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
 G Q
 ;
IXALL ;
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKSET,DIKALLR
 N DINO S X=1 D DISKIPIN(.DINO)
 D CHKS I $D(DIKZ1),'$G(DINO) N DIKSAT S DIKSAT=1,DA=0 G @DIKGP ;CAN'T DO COMPILED ROUTINE IF THERE ARE SOME WE MUST SKIP
 ;
 N DIKDASV,DIKSAVE
 M DIKDASV=DA S DIKDASV=0,DIKSAVE=DIK
 S (DA,DCNT)=0,X=1,DIKSET=1 D CNT^DIK1
 ;NOW FIRE NEW-STYLE SETS
 D INDEX^DIKC(DIKSAVE,.DIKDASV,"","","Sx"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
 G Q
 ;
IXALL2 ;
 Q:$D(@(DIK_"0)"))[0
 N DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKDA,DIKDASV,DIKSAVE,DIKALLR
 N DINO S X=2 D DISKIPIN(.DINO)
 M DIKDASV=DA S DIKDASV=0,DIKSAVE=DIK
 S DIKALLR=1,(DA,DCNT)=0,X=2 D CNT^DIK1
 ;NOW FIRE NEW-STYLE KILLS
 D INDEX^DIKC(DIKSAVE,.DIKDASV,"","","Kx"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
 G Q
 ;
EN ;
 N DIKCRFIL,DIKCDIK,DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
 D N(1) G:'$D(DH)!'$D(DA) Q
 S DIKCRFIL=DH M DIKCDIK=DIK
 S DIKNM=1,X=2 D:$D(DIKNX) PR,1^DIK1
 ;
EN1 ;
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
 D @$S('$D(DIKNM):"N(1)",1:"DIKJ") G:'$D(DH)!'$D(DA) Q
 I '$D(DIKNM) N DIKCRFIL,DIKCDIK S DIKCRFIL=DH M DIKCDIK=DIK
 S X=1 D:$D(DIKNX) PR,1^DIK1
 I $D(^DD("IX","AC",DIKCRFIL)) M DIK=DIKCDIK D INDEX^DIKC(DIKCRFIL,.DA,$P(DIK(1),U),$P(DIK(1),U,2,999),$E("K",$D(DIKNM))_"S"_$E("RI",$D(DIFROM)#2+1))
 G Q
 ;
EN2 ;
 N DIKCRFIL,DIKCDIK,DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
 D N(1) G:'$D(DH)!'$D(DA) Q
 S DIKCRFIL=DH M DIKCDIK=DIK
 S X=2 D:$D(DIKNX) PR,1^DIK1
 I $D(^DD("IX","AC",DIKCRFIL)) M DIK=DIKCDIK D INDEX^DIKC(DIKCRFIL,.DA,$P(DIK(1),U),$P(DIK(1),U,2,999),"K"_$E("RI",$D(DIFROM)#2+1))
 G Q
 ;
ENALL ;
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKXREF,DIKDASV,DIKSAVE,DHSAVE,DIKALLR
 D N(0) G:'$D(DH) Q
 M DIKDASV=DA,DIKSAVE=DIK,DHSAVE=DH S DIKDASV=0
 S (DA,DCNT)=0,X=1 D PR,CNT^DIK1
 D:$D(^DD("IX","AC",DHSAVE)) INDEX^DIKC(DHSAVE,.DIKDASV,$P(DIKSAVE(1),U),$P(DIKSAVE(1),U,2,999),"Sx"_$E("RI",$D(DIFROM)#2+1))
 G Q
 ;
ENALL2 ;
 N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKXREF,DIKDASV,DIKSAVE,DHSAVE,DIKALLR
 D N(0) G:'$D(DH) Q
 M DIKDASV=DA,DIKSAVE=DIK,DHSAVE=DH S DIKDASV=0
 S DIKALLR=1,(DA,DCNT)=0,X=2 D PR,CNT^DIK1
 D:$D(^DD("IX","AC",DHSAVE)) INDEX^DIKC(DHSAVE,.DIKDASV,$P(DIKSAVE(1),U),$P(DIKSAVE(1),U,2,999),"Kx"_$E("RI",$D(DIFROM)#2+1))
 G Q
 ;
 ;
N(REINDOK) Q:'$D(DIK)!'$D(DIK(1))!'$D(@(DIK_"0)"))  D DIKJ S DIKND=$P(DIK(1),U)
 I '$D(^DD(DH,"IX",DIKND)) K:'$D(^DD("IX","F",DH,DIKND)) DH Q
 I $P(DIK(1),U,2)="" D
 . S %=0 F A1=1:1 S %=$O(^DD(DH,DIKND,1,%)) Q:'%  I '$G(^(%,"NOREINDEX"))!REINDOK S DIKNX(A1)=% ;SKIP NON-RERUNNABLE INDEX IF NOT SPECIFIED PRECISELY AND IF THIS IS A MASS REINDEX
 E  F A1=1:1 Q:$P(DIK(1),U,A1+1)=""  S DIKNX(A1)=$P(DIK(1),U,A1+1)
 K A1,% Q
 ;
PR S DV=DIKND I '$D(^DD(DH,"IX",DV)),'$D(^DD(DH,"AUDIT",DV)) Q
 D 0 S DIKZ1=1 D CK K DIKZ1
 D:$D(^DD(DH,"AUDIT",DV)) A1 S DU=1 Q
 ;
CK Q:'$D(DIKNX(DIKZ1))
 F DW=0:0 S DW=$O(^DD(DH,DV,1,DW)) Q:DW'>0  I $D(^(DW,0)),(DW=DIKNX(DIKZ1))!($P(^(0),U,2)=DIKNX(DIKZ1)),$D(^(X)),"Q"'[^(X) S %=^(0) D INX
 S DIKZ1=DIKZ1+1 G CK
 ;
FREE(X) N V S V=$G(^UTILITY("DIK",X)) I 'V Q 1
 Q $H-1>V
 ;
DIKJ F DIKJ=$J:.01 I $$FREE(DIKJ) K ^UTILITY("DIK",DIKJ) S ^UTILITY("DIK",DIKJ)=$H Q  ;TO ENABLE RECURSIVE CALL, FIND A "$J" THAT'S UNUSED
INT K DIKS,DIN,DH,DU,DV,DW S U="^",DH=+$P(@(DIK_"0)"),U,2),DH(1)=DH Q
 ;
CHKS ;
 I $D(@(DIK_"0)"))[0 S DIKZ1=1,DIKGP="Q^DIK1" Q
 S DIKZ1=+$P(^(0),"^",2) I DIKZ1,$D(^DD(DIKZ1,0,"DIK")),$$ROUEXIST^DILIBF(^("DIK")) S DIKGP="^"_^DD(DIKZ1,0,"DIK") Q
 K DIKZ1 Q
 ;
Q K DIKND,DIKNX,DIKZ1,DIKNM,DIAU,DIG,DIH,DIV,DIW,%,DH Q

DIK1
DIK1 ;SFISC/GFT-ACTUAL INDEXER ;7SEP2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN N DIC D DI
 D
 . N DIKSV S DIKSV=DIK N DIK,DIKJ,DIFKEP
 . D INDEX^DIKC(DIKSV,.DA,"","","KT")
 D K G Q:'$D(@(DIK_"0)")) ;IF ZERO NODE IS THERE, RE-SET IT
 S Y=^(0),DH=$S($O(^(0))'>0:0,1:$P(Y,U,4)-1),X=$P($P(Y,U,3),U,DH>0) D 3:X=DA
 S ^(0)=$P(Y,U,1,2)_U_X_U_DH
IDENTF I DIK?1"^DD(".NP1",",$G(DA(1)),DIK[DA(1) K ^DD(DA(1),0,"ID",DA),^("W"_DA)
Q K:$G(DIKJ) ^UTILITY("DIK",DIKJ)
 K DB(0),DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKGP Q
 ;
K S X="",Y=1 I $D(DIFKEP(DA))#2,DIK="^DIC(",$D(@(DIK_DA_",0,""GL"")")) S X=^("GL"),Y="^DIC("_DA_","
 I X'=Y K @(DIK_"DA)"),X,Y Q
 S X=DIK_"DA,",DH=@(X_"0)") K ^(0),^("%") S Y="""%""" F  S Y=$O(@(X_Y_")")) Q:$E(Y)'="%"  S Y=""""_Y_"""" K @(X_Y_")")
 S @(X_"0)")=DH K X,Y
 Q
 ;
3 N X1
 S X1=X,X=+$O(^(X1),-1)
 S:X'>0 X=+$O(^(X1))
 Q
 ;
DI S (DIC,DIN)=DIK,DH=DH(DU),DV=1 F  S DV=$O(DA(DV)) Q:DV'>0  S DU=DU+1
DIN S DV=0 F  S DV=$O(^UTILITY("DIK",DIKJ,DH,DV)) Q:DV=""  D R:$G(DIKSET)!(DV-.01)
DVA S DV=$O(DV(DH,DV)) I DV="" Q:$G(DIKSET)  S DV=.01 D R:$D(^UTILITY("DIK",DIKJ,DH,DV)) Q
 S X=DIN_DA_","_DV(DH,DV) I @("'$D("_X_"))") G DVA
 S DU(DU)=DIN,DIN=X_",",DH(DU)=DH,DH=DV(DH,DV,0),DV(DU)=DV,DU=DU+1 F X=DU:-1:1 I $D(DA(X)) S DA(X+1)=DA(X)
 S DA(1)=DA,DA=0
DA I '$D(DV(DH(DU-1),DV,"NOLOOP")) F  S @("DA=$O("_DIN_"DA))") Q:DA'>0  D DIN
 D:$D(^UTILITY("DIK",DIKJ,"KW",DH)) KW(DH,DIN)
 S DU=DU-1,DIN=DU(DU),DH=DH(DU),DV=DV(DU),DA=DA(1) K DA(1) F X=2:1 G DVA:'$D(DA(X)) S DA(X-1)=DA(X) K DA(X)
 ;EXECUTE CROSS-REFERENCES
R S X=^UTILITY("DIK",DIKJ,DH,DV),%=^(DV,0) I @("$D("_DIN_DA_",X))[0") Q
 X % Q:X']""  S DIKS=X,DW=0
XEC S DW=$O(^UTILITY("DIK",DIKJ,DH,DV,DW)) Q:DW=""  D NXEC(^(DW)) S X=DIKS G XEC
 ;
NXEC(DICODE) ;New variables and execute programming hook
 I DICODE="D RCR"
 E  I $G(DW)=99,DICODE?.E1" AUDIT"
 E  N DH,DIFKEP,DIK,DIKJ,DIKS,DIKSET,DIN,DU,DV,DW,KW
 X DICODE
 Q
RCR K Y,%RCR F %="DIKS","DIK","DW","DH","DIN","DU","DV","X","KW","DIKSET" S %RCR(%)=""
 S %RCR="RR^DIK1",Y=^UTILITY("DIK",DIKJ,DH,DV,DW,0) G STORLIST^%RCR
 ;
RR X Y Q
 ;
AUDIT N %,%F,%T,%D,DIKF,DIKDA Q:DIIX=3&($D(DIKNM)!$D(DIKKS))  S %=DV N DV S DV=%
 S %F=DH F %=1:1 Q:'$D(^DD(%F,0,"UP"))  S %D=%F,%F=^("UP"),DV(%)=$O(^DD(%F,"SB",%D,0)) S:DV(%)="" DV(%)=-1
 S DIKDA="",DIKF="" F %=%-1:-1:1 S DIKDA=DIKDA_DA(%)_",",DIKF=DIKF_DV(%)_","
 I $G(^DD(DH,DV,"AX"))]"" D NXEC(^("AX")) I '$T Q
 D ADD^DIET S DIAU(DH,DV,DIKDA_DA)="^DIA("_%F_","_+Y_",",^DIA(%F,%D,0)=DIKDA_DA_U_%T_U_DIKF_DV_U_DUZ,^DIA(%F,"B",DIKDA_DA,%D)=""
SET N C S (%F,C)=$P(^DD(DH,DV,0),U,2),Y=X D:Y]"" S^DIQ S @(DIAU(DH,DV,DIKDA_DA)_"DIIX)")=Y S:DIIX=2&($D(DIKNM)!$D(DIKKS)) ^(3)=Y
 K DIAU I %F["P"!(%F["V")!(%F["S") S ^(DIIX+.1)=X_U_%F
 Q
 ;
1 ;
 N DIKLK
 S DIKLK=DIK_DA_")" L +@DIKLK:10 K:'$T DIKLK D DI L:$D(DIKLK) -@DIKLK G Q
 ;
CNT ;
 N DIKLK,DIKLAST S DIKLAST=$S(DA:DA,1:"")
 S DU=$E(DIK,1,$L(DIK)-1),DIKLK=$S(DIK[",":DU_")",1:DU) L +@DIKLK:10 K:'$T DIKLK
C I @("$O("_DIK_"DA))'>0") S $P(@(DIK_"0)"),U,4)=DCNT D:'$P(^(0),U,3)  D:$D(^UTILITY("DIK",DIKJ,"KW",DH(1))) KW(DH(1),DIK) K DCNT L:$D(DIKLK) -@DIKLK G Q ;**DI*22*146
 .S DCNT=$O(^(" "),-1) I DCNT S $P(^(0),U,3)=DCNT
 S DA=$O(^(DA)) G C:$P($G(^(DA,0)),U)']"" S DIKLAST=DA,DU=1,DCNT=DCNT+1 S:DA="" DA=-1 D:(DCNT#100=0)  D DI K DB(0) G C
 .I $D(IO)#2,$D(IO(0))#2,IO=IO(0),IO="" Q
 .I '$D(ZTQUEUED) W "."
 ;
KW(FIL,DIN) ;Kill entire regular indexes
 N NAM
 S NAM="" F  S NAM=$O(^UTILITY("DIK",DIKJ,"KW",FIL,NAM)) Q:NAM=""  K @(DIN_""""_NAM_""")")
 Q

DIKC
DIKC ;SFISC/MKO-FIRE INDEX FILE CROSS REFERENCES ;24OCT2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
INDEX(DIFILE,DIREC,DIFLD,DIXREF,DICTRL) ;Fire Index file xrefs
 N DA,DIF,DIKACT,DIKCT,DIKERR,DIKLOCK,DIKLOG,DIKON,DIKRFIL
 N DIKTMP,DIKVAL,DIMF,DIROOT
 ;
 ;Initialization
 S DIF=$E("D",$G(DICTRL)["D")
 I DIF["D",'$D(DIQUIET) N DIQUIET S DIQUIET=1
 I DIF["D",'$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 ;Check (and convert) input parameters
 D CHK^DIKC2 G:$G(DIKERR)]"" EXIT
 ;
 ;Setup variables
 S DIKCT=$E("C",$G(DICTRL)["C")_$E("T",$G(DICTRL)["T")
 S DIKLOG=$E("K",$G(DICTRL)["K")_$E("S",$G(DICTRL)["S")
 S:DIKLOG="" DIKLOG=$E("K",DIKCT'["C")_$E("S",DIKCT'["T")
 S DIKACT=$E("R",$G(DICTRL)["R")_$E("I",$G(DICTRL)["I")
 S DIKRFIL=$S($G(DICTRL)["W":+$P(DICTRL,"W",2),1:DIFILE)
 I $G(DICTRL)["k" D
 . S DIKLOCK=+$P(DICTRL,"k",2)\1
 . S:DIKLOCK<0 DIKLOCK=-DIKLOCK
 . S:$E($P(DICTRL,"k",2))="-" DIKLOCK("STOP")=1
 E  S DIKLOCK=1
 ;
LOAD ;Load xref information into @DIKTMP
 S DIKTMP=$G(DICTRL("LOGIC"))
 I $G(DIKTMP)="" D
 . S DIKTMP=$$GETTMP^DIKC1("DIKC")
 . I $G(DIXREF)?."^" D
 .. I $G(DIFLD) D
 ...D LOADFLD^DIKC1(DIKRFIL,DIFLD,DIKLOG_"W",DIKACT,DIKVAL,DIKTMP,DIKTMP,$E("i",$G(DICTRL)["i"),,$E("x",$G(DICTRL)["x"))
 .. E  D LOADALL^DIKC1(DIKRFIL,DIKLOG,DIKACT,DIKVAL,DIKTMP,$E("s",$G(DICTRL)["s")_$E("i",$G(DICTRL)["i")_$E("x",$G(DICTRL)["x"),.DIMF)
 . E  D LOADXREF^DIKC1(DIKRFIL,$G(DIFLD),DIKLOG,.DIXREF,DIKVAL,DIKTMP)
 ;
 D:DIKRFIL'=DIFILE SBINFO^DIKCU(DIKRFIL,.DIMF)
 ;
 ;Fire the xrefs for all records or the record specified in DA
 I 'DA D
 . L +@DIROOT:DIKLOCK E  D  Q:$G(DIKLOCK("STOP"))
 .. S DIKLOCK=""
 .. D:DIF["D" ERR^DIKCU2(112,DIFILE)
 . D FIREALL(DIFILE,.DA,DIROOT,DIKLOG,.DIMF,DIKTMP,DIKON,"",DIKCT)
 . L:DIKLOCK]"" -@DIROOT
 E  D
 . L +@DIROOT@(DA):DIKLOCK E  D  Q:$G(DIKLOCK("STOP"))
 .. S DIKLOCK=""
 .. D:DIF["D" ERR^DIKCU2(110,DIFILE,$$IENS^DIKCU(DIFILE,.DA))
 . D:$D(@DIKTMP@(DIFILE)) FIRE(DIFILE,.DA,DIKLOG,DIKTMP,DIKON,"",DIKCT)
 . D:$D(DIMF(DIFILE)) FIRESUB(DIFILE,.DA,DIROOT,DIKLOG,.DIMF,DIKTMP,DIKON,"",DIKCT)
 . L:DIKLOCK]"" -@DIROOT@(DA)
 ;
 ;Cleanup ^TMP
 K @DIKTMP
 ;
EXIT ;Move error messages if necessary
 I DIF["D",$G(DIERR),$G(DICTRL("MSG"))]"" D CALLOUT^DIEFU(DICTRL("MSG"))
 Q
 ;
FIREALL(DIFILE,DA,DIROOT,DILOG,DIMF,DIKTMP,DIKON,DIKEY,DIKCT) ;Fire xrefs, all recs
 N DICNT,DIIENS,DILAST,DIXR
 S DILOG=$G(DILOG),DIKON=$G(DIKON)
 S DIIENS=$$IENS^DIKCU(DIFILE,.DA)
 ;
 ;Kill entire indexes
 I DILOG["K",$D(@DIKTMP@("KW",DIFILE)) D XECKW(DIFILE,.DA,$D(DIMF(DIFILE))>0)
 I '$D(@DIKTMP@(DIFILE)),'$D(DIMF(DIFILE)) Q
 ;
 ;Loop through all records in the file
 S (DICNT,DA)=0 F  S DA=$O(@DIROOT@(DA)) Q:DA'=+DA  D
 . S $P(DIIENS,",")=DA
 . S DICNT=DICNT+1
 . D:$D(@DIKTMP@(DIFILE)) FIRE(DIFILE,.DA,DILOG,DIKTMP,DIKON,.DIKEY,DIKCT,DIIENS)
 . D:$D(DIMF(DIFILE)) FIRESUB(DIFILE,.DA,DIROOT,DILOG,.DIMF,DIKTMP,DIKON,.DIKEY,DIKCT)
 ;
 ;Update header node
 I $D(@DIROOT@(0))#2 D
 . S DILAST=$O(@DIROOT@(" "),-1) S:'DILAST DILAST=""
 . S:'DICNT DICNT=""
 . S $P(@DIROOT@(0),U,4)=DICNT ;**DI*22*146
 Q
 ;
FIRE(DIFILE,DA,DILOG,DIKTMP,DIKON,DIKEY,DIKCT,DIIENS) ;Fire xrefs, one record
 N DI01,DIKCLOG,DINULL,DION,DIXR,I,J,X,X2,XN
 S DILOG=$G(DILOG),DIKON=$G(DIKON)
 S:$G(DIIENS)="" DIIENS=$$IENS^DIKCU(DIFILE,.DA)
 ;
 I DIKON="" S DIXR=0 F  S DIXR=$O(@DIKTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR  D
 . D SETXARR(DIFILE,DIXR,DIKTMP,.DINULL) Q:DINULL
 . I $G(DIKCT)="" D XECUTE(DIFILE,DIXR,DILOG,.X,.X,DIKTMP) Q
 . ;
 . K XN S XN="",I=0 F  S I=$O(X(I)) Q:'I  S XN(I)=""
 . I $G(DIKCT)="C" D XECUTE(DIFILE,DIXR,"S",.XN,.X,DIKTMP) Q
 . I $G(DIKCT)="T" D XECUTE(DIFILE,DIXR,"K",.X,.XN,DIKTMP) Q
 ;
 E  S DIXR=0 F  S DIXR=$O(@DIKTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR  D
 . K DINFLD
 . S DIKCLOG=""
 . ;
 . ;Set X2 array to new values
 . S DION=$P(DIKON,U,2)
 . D SETXARR(DIFILE,DIXR,DIKTMP,.DINULL,DION) M X2=X
 . ;
 . ;If SET requested, make sure no new values are null
 . I DILOG["S" D
 .. I 'DINULL S DIKCLOG="S"
 .. E  I $P(DIKON,U,4)="N" S I=0 F  S I=$O(^DD("KEY","AU",DIXR,I)) Q:'I  D
 ... S DIKEY(DIFILE,I,DIIENS)="n"
 ... S J=0 F  S J=$O(DINULL(J)) Q:'J  S DIKEY(DIFILE,I,DIIENS,$P(DINULL(J),U),$P(DINULL(J),U,2))=$P(DINULL(J),U,3)
 . ;
 . ;Set X array to old values
 . S DION=$P(DIKON,U)
 . D SETXARR(DIFILE,DIXR,DIKTMP,.DINULL,DION,.DI01)
 . ;
 . ;If KILL requested, make sure no old values are null
 . I DILOG["K",'DINULL S DIKCLOG="K"_DIKCLOG
 . ;
 . ;If "C" flag, set old .01 value to null
 . I $G(DIKCT)="C",$D(DI01) D
 .. S I=0 F  S I=$O(DI01(I)) Q:'I  S X(I)=""
 .. S:$O(DI01(0))=$O(X(0)) X=""
 .. S DIKCLOG=$TR(DIKCLOG,"K")
 . ;
 . ;If "T" flag, set all new values to null
 . I $G(DIKCT)="T" S X2="",I=0 F  S I=$O(X2(I)) Q:'I  S X2(I)=""
 . ;
 . ;Execute the kill and set logic
 . D XECUTE(DIFILE,DIXR,DIKCLOG,.X,.X2,DIKTMP)
 . ;
 . I DIKCLOG["S",$P(DIKON,U,3)="K",$D(^DD("KEY","AU",DIXR)) D
 .. Q:$$UNIQUE^DIKK2(DIFILE,DIXR,.X2,.DA,DIKTMP)
 .. S I=0 F  S I=$O(^DD("KEY","AU",DIXR,I)) Q:'I  S DIKEY(DIFILE,I,DIIENS)=""
 Q
 ;
FIRESUB(DIFILE,DA,DIROOT,DILOG,DIMF,DIKTMP,DIKON,DIKEY,DIKCT) ;Fire xrefs for
 ;all subfiles under DIFILE, for all subrecords under DA
 Q:'$D(DIMF(DIFILE))
 N DIMULTF,DISBFILE,DISBROOT,X
 S DILOG=$G(DILOG),DIKON=$G(DIKON)
 ;
 ;Push down the DA array
 D PUSHDA^DIKCU(.DA)
 ;
 ;Loop through DIMF array and fire xrefs for subfiles
 S DIMULTF=0 F  S DIMULTF=$O(DIMF(DIFILE,DIMULTF)) Q:'DIMULTF  D
 . S DISBROOT=$NA(@DIROOT@(DA(1),DIMF(DIFILE,DIMULTF))) Q:'$D(@DISBROOT)
 . S DISBFILE=DIMF(DIFILE,DIMULTF,0)
 . D FIREALL(DISBFILE,.DA,DISBROOT,DILOG,.DIMF,DIKTMP,DIKON,.DIKEY,DIKCT)
 ;
 ;Pop the DA array
 D POPDA^DIKCU(.DA)
 Q
 ;
XECUTE(DIFILE,DIXR,DILOG,DIKCX1,DIKCX2,DIKTMP) ;Xecute the logic in ^TMP
 Q:$G(DILOG)=""
 N DIKCOD,DIKCON,X,X1,X2
 ;
 ;Execute kill logic
 I DILOG["K" D
 . S DIKCOD=$G(@DIKTMP@(DIFILE,DIXR,"K")) Q:DIKCOD?."^"
 . S DIKCON=$G(@DIKTMP@(DIFILE,DIXR,"KC"))
 . I DIKCON'?."^" M X=DIKCX1,X1=DIKCX1,X2=DIKCX2 X DIKCON Q:'$G(X)  K X,X1,X2
 . M X=DIKCX1,X1=DIKCX1,X2=DIKCX2
 . X DIKCOD K X,X1,X2
 ;
 ;Execute set logic
 I DILOG["S" D
 . S DIKCOD=$G(@DIKTMP@(DIFILE,DIXR,"S")) Q:DIKCOD?."^"
 . S DIKCON=$G(@DIKTMP@(DIFILE,DIXR,"SC"))
 . I DIKCON'?."^" M X=DIKCX2,X1=DIKCX1,X2=DIKCX2 X DIKCON Q:'$G(X)  K X,X1,X2
 . M X=DIKCX2,X1=DIKCX1,X2=DIKCX2
 . X DIKCOD
 Q
 ;
XECKW(DIFILE,DA,DIKSUB) ;Execute the logic to kill the entire index
 N DIKFIL,DIKKW,DIKKW0,DIKLDIF,DIXR
 ;
 S DIXR=0 F  S DIXR=$O(@DIKTMP@("KW",DIFILE,DIXR)) Q:DIXR'=+DIXR  D
 . S DIKKW=$G(@DIKTMP@("KW",DIFILE,DIXR)) Q:DIKKW?."^"
 . S DIKKW0=$G(@DIKTMP@("KW",DIFILE,DIXR,0))
 . ;
 . ;If not a whole file xref, kill the entire index and quit
 . I DIKKW0="" X DIKKW D  Q
 .. I '$D(@DIKTMP@(DIFILE,DIXR,"S")) K @DIKTMP@(DIFILE,DIXR)
 .. E  K @DIKTMP@(DIFILE,DIXR,"K"),@DIKTMP@(DIFILE,DIXR,"KC")
 . ;
 . ;Quit if this isn't a whole file xref or we're not doing subfiles
 . Q:$P(DIKKW0,U)'="W"!'$G(DIKSUB)
 . ;
 . ;Kill the whole index after pushing DA the appropriate amount
 . S DIKFIL=$P(DIKKW0,U,2),DIKLDIF=$P(DIKKW0,U,3)
 . D PUSHDA^DIKCU(.DA,DIKLDIF)
 . X DIKKW
 . I '$D(@DIKTMP@(DIKFIL,DIXR,"S")) K @DIKTMP@(DIKFIL,DIXR)
 . E  K @DIKTMP@(DIKFIL,DIXR,"K"),@DIKTMP@(DIKFIL,DIXR,"KC")
 . D POPDA^DIKCU(.DA,DIKLDIF)
 Q
 ;
SETXARR(DIFILE,DIXR,DIKTMP,DINULL,DION,DI01) ;Loop through DIKTMP and set X array.
 ;If any values used as subscripts are null, return
 ; DINULL=1
 ; DINULL(order#) = ""
 ;                  or file^field^levDiff (for field type subscripts)
 ; DI01(order#) = "" if order # is .01 field
 ;
 N DIKCX,DIKF,DIKO,X1,X2
 K X,DI01,DINULL
 S DINULL=0,(DIKF,DIKO)=$O(@DIKTMP@(DIFILE,DIXR,0)) Q:'DIKF
 ;
 S:$G(DION)="" DION=U
 F  D  S DIKO=$O(@DIKTMP@(DIFILE,DIXR,DIKO)) Q:'DIKO
 . K DIKCX M DIKCX=X
 . X $G(@DIKTMP@(DIFILE,DIXR,DIKO))
 . I $G(X)]"",$D(@DIKTMP@(DIFILE,DIXR,DIKO,"T")) X @DIKTMP@(DIFILE,DIXR,DIKO,"T")
 . S:$D(X)#2 (DIKCX,DIKCX(DIKO))=X K X M X=DIKCX
 . S:$P($G(@DIKTMP@(DIFILE,DIXR,DIKO,"F")),U,2)=.01 DI01(DIKO)=""
 . I $G(X(DIKO))="",$G(@DIKTMP@(DIFILE,DIXR,DIKO,"SS")) S DINULL=1 S:$G(@DIKTMP@(DIFILE,DIXR,DIKO,"F")) DINULL(DIKO)=@DIKTMP@(DIFILE,DIXR,DIKO,"F")
 ;
 S:$D(X(DIKF))#2 X=$G(X(DIKF))
 Q
 ;
 ;#110  The record is currently locked.
 ;#112  The file is currently locked.

DIKC1
DIKC1 ;SFISC/MKO-LOAD XREF INFO ;19DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;============================================
 ; LOADALL(File,Log,Activ,ValRt,Tmp,Flag,.MF)
 ;============================================
 ;Load all xrefs for a file. Uses the "AC" index on Root File.
 ;In:
 ; RFIL  = Root File #
 ; LOG   [ K : load kill logic
 ;       [ S : load set logic
 ; ACT   = Codes: IR
 ;          If ACT '= null, a xref is picked up only if ACT
 ;          and the Activity field (#.41) have codes in common.
 ; VALRT = Array Ref where old/new values are located
 ; TMP   = Root to store xref info
 ; FLAG  [ s : don't include subfiles under file
 ;       [ i : don't load index-type xrefs (only load whole file xrefs)
 ;       [ f : don't load field-type xrefs
 ;       [ r : don't load record-type xrefs
 ;       [ x : don't load "NOREINDEX" xrefs
 ;
 ;Out:
 ; MF(file#,mField#)   = multiple node
 ; MF(file#,mField#,0) = subfile#
 ;   Set only for those files/multiples that have xrefs
 ;   and only if FLAG '[ "s"
 ;
LOADALL(RFIL,LOG,ACT,VALRT,TMP,FLAG,MF) ;
 N XR
 ;
 ;Loop through "AC" index
 S XR=0 F  S XR=$O(^DD("IX","AC",RFIL,XR)) Q:'XR  D
 . ;Skip if no .01, wrong Activity, wrong Type, or wrong Execution
 . I $P($G(^DD("IX",XR,0)),U)="" K ^DD("IX","AC",RFIL,XR) Q
 . I $G(ACT)]"",$TR(ACT,$P(^DD("IX",XR,0),U,7),$TR($J("",$L($P(^(0),U,7)))," ","*"))'["*" Q
 . I $G(FLAG)["i",$P(^DD("IX",XR,0),U,8)="I" Q
 . I $G(FLAG)["f",$P(^DD("IX",XR,0),U,6)="F" Q
 . I $G(FLAG)["r",$P(^DD("IX",XR,0),U,6)="R" Q
NOREIN .I $G(FLAG)["x",$G(^DD("IX",XR,"NOREINDEX")) Q  ;PATCH 167
 . ;
 . ;Load xref
 . D CRV^DIKC2(XR,$G(VALRT),TMP)
 . D:$G(LOG)]"" LOG^DIKC2(XR,LOG,TMP)
 . D:$G(LOG)["K" KW^DIKC2(XR,TMP)
 Q:$G(FLAG)["s"
 ;
 ;Build info for all subfiles under FILE into arrays SB and MF
 N CHK,FIL,MFLD,PAR,SB
 D SUBFILES^DIKCU(RFIL,.SB,.MF)
 ;
 ;Load xref for each subfile
 S:$G(FLAG)'["s" FLAG=$G(FLAG)_"s"
 S SB=0 F  S SB=$O(SB(SB)) Q:'SB  D
 . D LOADALL(SB,$G(LOG),$G(ACT),$G(VALRT),TMP,FLAG)
 . Q:'$D(@TMP@(SB))
 . ;
 . ;Set CHK(f)="" flag for subfile and its antecedents
 . S PAR=SB F  Q:$D(CHK(PAR))  S CHK(PAR)=1,PAR=$G(SB(PAR)) Q:PAR=""
 ;
 ;Use the CHK array to get rid of unneeded elements in MF
 S FIL=0 F  S FIL=$O(MF(FIL)) Q:'FIL  D
 . S MFLD=0 F  S MFLD=$O(MF(FIL,MFLD)) Q:'MFLD  D
 .. K:'$D(CHK(MF(FIL,MFLD,0))) MF(FIL,MFLD)
 Q
 ;
 ;========================================
 ; LOADXREF(File,Fld,Log,.XRef,ValRt,Tmp)
 ;========================================
 ;Load specified xrefs. Uses the "AC" index on Root file if Index
 ;Names are passed in. Also, uses the "F" index, if Field is passed in.
 ;In:
 ;  RFIL  = if FLD is not passed in : Root File or subfile#
 ;                                    (required if XREF contains names)
 ;          if FLD is passed in : The file of the field
 ;                                (defaults to Root file of XREF)
 ;  FLD   = Field # (optional) (if passed in, a specified index is
 ;          loaded only if FLD is one of the cross-reference values.
 ;  LOG   [ K : load kill logic (incl. whole kill)
 ;        [ S : load set logic
 ; .XREF  = ^-delimited list of xref names or numbers;
 ;          (overflow in XREF(n) where n=1,2,...)
 ;  VALRT = Array Ref where old/new values are located
 ;  TMP   = Root to store info
 ;
LOADXREF(RFIL,FLD,LOG,XREF,VALRT,TMP) ;
 N I,N,PC,RF,XR,XRLIST
 ;
 ;Loop through XREF array
 S N=0,XRLIST=$G(XREF) F  Q:XRLIST=""  D
 . ;
 . ;Loop through each xref in XRLIST
 . F PC=1:1:$L(XRLIST,U) K XR S XR=$P(XRLIST,U,PC) D:XR]""
 .. ;
 .. ;Convert xref name to number, if necessary
 .. I XR'=+$P(XR,"E") D  Q:$D(XR)<2
 ... S I=0 F  S I=$O(^DD("IX","AC",RFIL,I)) Q:'I  D
 .... S:$P($G(^DD("IX",I,0)),U,2)=XR XR(I)=""
 .. E  Q:$P($G(^DD("IX",XR,0)),U)=""  S XR(XR)=""
 .. ;
 .. ;Load code from Cross-Reference Values multiple
 .. S XR=0 F  S XR=$O(XR(XR)) Q:'XR  D
 ... S RF=$P(^DD("IX",XR,0),U,9)
 ... I $G(FLD) Q:'$D(^DD("IX","F",$S($G(RFIL):RFIL,1:RF),FLD,XR))
 ... E  I $G(RFIL) Q:RFIL'=RF
 ... D CRV^DIKC2(XR,$G(VALRT),TMP)
 ... D:$G(LOG)]"" LOG^DIKC2(XR,LOG,TMP)
 ... D:$G(LOG)["K" KW^DIKC2(XR,TMP)
 . ;
 . ;Process next overflow
 . S N=$O(XREF(N)),XRLIST=$S(N:$G(XREF(N)),1:"")
 Q
 ;
 ;================================================================
 ; LOADFLD(File,Field,Log,Activ,ValRt,TmpF,TmpR,FList,RList,Flag)
 ;================================================================
 ;Get all xrefs for a field. Uses the "F" index on file/field.
 ;In:
 ; FIL   = File #
 ; FLD   = Field #
 ; LOG   [ K : load kill logic
 ;       [ S : load set logic
 ;       [ W : load entire kill logic (if LOG also [ "K")
 ; ACT   = codes: IR
 ;          If ACT is not null, a xref is picked up only if ACT
 ;          and the Activity field (#.41) have codes in common.
 ; VALRT = Array Ref where old/new values are located
 ; TMPF  = Root to store field-level xref info
 ; TMPR  = Root to store record-level xref info
 ; FLAG  [ i : don't load index-type xrefs (only load whole file xrefs)
 ;       [ f : don't load field-type xrefs
 ;       [ r : don't load record-type xrefs
 ;Out:
 ; .FLIST = ^-delimited list of field xrefs (overflow in FLIST(n))
 ; .RLIST = ^-delimited list of record xrefs (overflow in RLIST(n))
 ;
LOADFLD(FIL,FLD,LOG,ACT,VALRT,TMPF,TMPR,FLIST,RLIST,FLAG) ;
 N EXECFLD,TMP,XR
 K FLIST,RLIST S (FLIST,RLIST)=0,(FLIST(0),RLIST(0))=""
 S:$G(TMPR)="" TMPR=TMPF
 ;
 ;Loop through "F" index and pick up xrefs
 S XR=0 F  S XR=$O(^DD("IX","F",FIL,FLD,XR)) Q:'XR  D
 . I $P($G(^DD("IX",XR,0)),U)="" K ^DD("IX","F",FIL,FLD,XR) Q
 . S EXECFLD=$P(^DD("IX",XR,0),U,6)
 . I $G(ACT)]"",$TR(ACT,$P(^DD("IX",XR,0),U,7),$TR($J("",$L($P(^(0),U,7)))," ","*"))'["*" Q
 . I $G(FLAG)["i",$P(^DD("IX",XR,0),U,8)="I" Q
 . I $G(FLAG)["f",$P(^DD("IX",XR,0),U,6)="F" Q
 . I $G(FLAG)["r",$P(^DD("IX",XR,0),U,6)="R" Q
 . I $G(FLAG)["x",$G(^DD("IX",XR,"NOREINDEX")) Q
 . ;
 . ;Set TMP, RLIST, and FLIST
 . K TMP
 . I EXECFLD="R" D
 .. S TMP=$G(TMPR)
 .. I $L(RLIST(RLIST))+$L(XR)+1>255 S RLIST=RLIST+1,RLIST(RLIST)=""
 .. S RLIST(RLIST)=RLIST(RLIST)_$E(U,RLIST(RLIST)]"")_XR
 . E  D
 .. S TMP=$G(TMPF)
 .. I $L(FLIST(FLIST))+$L(XR)+1>255 S FLIST=FLIST+1,FLIST(FLIST)=""
 .. S FLIST(FLIST)=FLIST(FLIST)_$E(U,FLIST(FLIST)]"")_XR
 . ;
 . ;Load xref
 . Q:$G(TMP)=""  Q:$D(@TMP@(FIL,XR))
 . D CRV^DIKC2(XR,$G(VALRT),TMP)
 . D:$G(LOG)]"" LOG^DIKC2(XR,LOG,TMP)
 . I $G(LOG)["K",$G(LOG)["W" D KW^DIKC2(XR,TMP)
 ;
 I FLIST(0)]"" S FLIST=FLIST(0) K FLIST(0)
 E  K FLIST S FLIST=""
 I RLIST(0)]"" S RLIST=RLIST(0) K RLIST(0)
 E  K RLIST S RLIST=""
 Q
 ;
GETTMP(DIKC) ;Find next available root in ^TMP(DIKC)
 ;Time stamp ^TMP(DIKC,J)
 ;Out:
 ; Name of available ^TMP root; e.g. ^TMP("DIKC",$J+.01)
 ;
 N DAY,FREE,J
 S FREE=0 F J=$J:.01 D  Q:FREE
 . S DAY=$G(^TMP(DIKC,J))
 . I DAY<($H-1) K ^TMP(DIKC,J) S ^TMP(DIKC,J)=$H,FREE=1
 Q $NA(^TMP(DIKC,J))

DIKC2
DIKC2 ;SFISC/MKO-CHECK INPUT PARAMETERS TO INDEX^DIKC ;19DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;CHK:  Check input parameters to INDEX^DIKC
 ;Also set:
 ; DA     = DA array
 ; DIROOT = Closed root of file
 ; DIFILE = File #
 ; DIKERR = "X" : if there's a problem
 ;
CHK ;File is a required input param
 I $G(DIFILE)="" D:DIF["D" ERR^DIKCU2(202,"","","","FILE") D ERR Q
 ;
 ;Check DIREC and set DA array
 I $G(DIREC)'["," M DA=DIREC
 E  S:DIREC'?.E1"," DIREC=DIREC_"," D DA^DILF(DIREC,.DA)
 S:'$G(DA) DA=""
 I '$$VDA^DIKCU1(.DA,DIF) D ERR Q
 ;
DICTRL ;Check DICTRL parameter
 I $G(DICTRL)]"",'$$VFLAG^DIKCU1(DICTRL,"KSsDWiRIkCTrfx",DIF) D ERR
 I $G(DICTRL)["W",'$$VFNUM^DIKCU1(+$P(DICTRL,"W",2),DIF) D ERR
 I $G(DICTRL)["C",$G(DICTRL)["T" D
 . D:DIF["D" ERR^DIKCU2(301,"","","","C and T")
 . D ERR
 E  I $G(DICTRL)["C",$G(DICTRL)["K" D
 . D:DIF["D" ERR^DIKCU2(301,"","","","C and K")
 . D ERR
 E  I $G(DICTRL)["T",$G(DICTRL)["S" D
 . D:DIF["D" ERR^DIKCU2(301,"","","","T and S")
 . D ERR
 Q:$G(DIKERR)="X"
 ;
 ;Set DIFILE and DIROOT
 N DILEV
 I DIFILE=+$P(DIFILE,"E") D
 . S DIROOT=$$FROOTDA^DIKCU(DIFILE,DIF,.DILEV) I DIROOT="" D ERR Q
 . I DILEV,$D(DA(DILEV))[0 D  Q
 .. D:DIF["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR
 . S:DILEV DIROOT=$NA(@DIROOT)
 . S DIFILE=$$FNUM^DIKCU(DIROOT,DIF) I DIFILE="" D ERR
 E  D
 . S DIROOT=DIFILE
 . S:"(,"[$E(DIROOT,$L(DIROOT)) DIROOT=$$CREF^DILF(DIFILE)
 . S DIFILE=$$FNUM^DIKCU(DIROOT,DIF) I DIFILE="" D ERR Q
 . S DILEV=$$FLEV^DIKCU(DIFILE,DIF) I DILEV="" D ERR Q
 . I DILEV,$D(DA(DILEV))[0 D  Q
 .. D:DIF["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR
 ;
 ;Set DIKVAL,DIKON
 S DIKVAL=$G(DICTRL("VAL"))
 I DIKVAL]"" D
 . S:"(,_"'[$E(DIKVAL,$L(DIKVAL)) DIKVAL=$$OREF^DILF(DIKVAL)
 . S DIKON="O^N"
 E  S DIKON=""
 Q
 ;
ERR ;Set error flag
 S DIKERR="X"
 Q
 ;
 ;==========================
 ; CRV(Index,ValueRoot,TMP)
 ;==========================
 ;Load values from Cross Reference Values multiple into @TMP
 ;In:
 ;  XR    = Index #
 ;  VALRT = Array Ref where old/new values are located
 ;  TMP   = Root of array to store data
 ;Returns:
 ;  @TMP@(RootFile,Index#)             = Name^File^RootType^Type
 ;                 Index#,Order#)      = Code that sets X to the data
 ;                        Order#,"SS") = Subscript^MaxLength
 ;                               "T")  = Transform (for 'Field'-type)
 ;                               "F")  = file^field^levdiff(file,rFile)
CRV(XR,VALRT,TMP) ;
 Q:'$G(XR)!($G(TMP)="")
 N CRV,CRV0,DEC,FIL,FLD,MAXL,ND,ORD,OROOT,RFIL,SBSC,TYPE
 ;
 S RFIL=$P($G(^DD("IX",XR,0)),U,9) Q:RFIL=""  Q:$D(@TMP@(RFIL,XR))
 S @TMP@(RFIL,XR)=$P(^DD("IX",XR,0),U,2)_U_$P(^(0),U)_U_$P(^(0),U,8)_U_$P(^(0),U,4)
 S OROOT=$$FROOTDA^DIKCU(RFIL,"O")_"DA," Q:OROOT="DA,"
 ;
 S CRV=0 F  S CRV=$O(^DD("IX",XR,11.1,CRV)) Q:'CRV  D
 . S CRV0=$G(^DD("IX",XR,11.1,CRV,0))
 . S ORD=$P(CRV0,U),TYPE=$P(CRV0,U,2),MAXL=$P(CRV0,U,5),SBSC=$P(CRV0,U,6)
 . Q:ORD=""!(TYPE="")
 . ;
 . I TYPE="F" D
 .. S FIL=$P(CRV0,U,3),FLD=$P(CRV0,U,4) Q:(FIL="")!'FLD
 .. I FIL'=RFIL N OROOT,LDIF D  Q:$G(OROOT)=""
 ... S LDIF=$$FLEVDIFF^DIKCU(FIL,RFIL) Q:'LDIF
 ... S OROOT=$$FROOTDA^DIKCU(FIL,LDIF_"O") Q:OROOT=""
 ... S OROOT=OROOT_"DA("_LDIF_"),"
 .. S DEC=$$DEC(FIL,FLD,$G(VALRT),OROOT) Q:DEC=""
 .. S @TMP@(RFIL,XR,ORD)=DEC
 .. S @TMP@(RFIL,XR,ORD,"F")=FIL_U_FLD_$S($G(LDIF):U_LDIF,1:"")
 .. S:$G(^DD("IX",XR,11.1,CRV,2))'?."^" @TMP@(RFIL,XR,ORD,"T")=^(2)
 . ;
 . E  I TYPE="C" S @TMP@(RFIL,XR,ORD)=$G(^DD("IX",XR,11.1,CRV,1.5))
 . ;
 . S:SBSC @TMP@(RFIL,XR,ORD,"SS")=SBSC_$S(MAXL:U_MAXL,1:"")
 Q
 ;
 ;======================================
 ; $$DEC(File,Field,ValueRoot,OpenRoot)
 ;======================================
 ;Return Data Extraction Code -- M code that sets X equal to the data.
 ;In:
 ;  FIL   = File #
 ;  FLD   = Field #
 ;  VALRT = Array Ref where old/new values are located
 ;           if ends in "_", FILE subscript is concatenated to the last
 ;           subscript (used by DDS02)
 ;  OROOT = Open root of record w/ DA subscripts
 ;Returns:  M code
 ;  For example:
 ;    S X=$P(^DIZ(1000,DA(1),100,0),U,2)   or
 ;    S X=$E(^DIZ(1000,DA(1),100,1),1,245) or
 ;    S X=$G(array(file,DIIENS,field,DION),$P(^root(DA,nd),U,pc))
 ;
DEC(FIL,FLD,VALRT,OROOT) ;
 Q:$P($G(^DD(FIL,FLD,0)),U)="" ""
 ;
 N ND,PC,DEC
 S PC=$P($G(^DD(FIL,FLD,0)),U,4)
 S ND=$P(PC,";"),PC=$P(PC,";",2) Q:ND?." "!("0 "[PC) ""
 S:ND'=+$P(ND,"E") ND=""""_ND_""""
 ;
 I $G(OROOT)="" S OROOT=$$FROOTDA^DIKCU(FIL,"O")_"DA," Q:OROOT="DA," ""
 I PC S DEC="$P($G("_OROOT_ND_")),U,"_PC_")"
 E  S DEC="$E($G("_OROOT_ND_")),"_+$E(PC,2,999)_","_$P(PC,",",2)_")"
 ;
 I $G(VALRT)]"" D
 . I $E(VALRT,$L(VALRT))="_" D  Q
 .. S VALRT=$E(VALRT,1,$L(VALRT)-3)
 .. S DEC="$G("_VALRT_FIL_""",DIIENS,"_FLD_",DION),"_DEC_")"
 . S:"(,"'[$E(VALRT,$L(VALRT)) VALRT=$$OREF^DILF(VALRT)
 . S DEC="$G("_VALRT_FIL_",DIIENS,"_FLD_",DION),"_DEC_")"
 S DEC="S X="_DEC
 Q DEC
 ;
 ;======================
 ; LOG(Index,Logic,TMP)
 ;======================
 ;Load Set and/or Kill logic into into @TMP
 ;In:
 ;  XR  = Index #
 ;  LOG [ K : load kill logic
 ;      [ S : load set logic
 ;  TMP = Root of array to store data
 ;Returns:
 ;  @TMP@(RootFile,Index#,"S")  = Set logic
 ;                        "SC") = Set condition
 ;                        "K")  = Kill logic
 ;                        "KC") = Kill condtion
LOG(XR,LOG,TMP) ;
 Q:'$G(XR)  Q:$G(LOG)=""  Q:$G(TMP)=""
 N SL,KL,SC,KC,RFIL
 ;
 S RFIL=$P(^DD("IX",XR,0),U,9) Q:RFIL=""
 I LOG["S" D
 . S SL=$G(^DD("IX",XR,1)),SC=$G(^(1.4))
 . I "Q"'[SL,SL'?."^" S @TMP@(RFIL,XR,"S")=SL
 . I "Q"'[SC,SC'?."^" S @TMP@(RFIL,XR,"SC")=SC
 I LOG["K" D
 . S KL=$G(^DD("IX",XR,2)),KC=$G(^(2.4))
 . I "Q"'[KL,KL'?."^" S @TMP@(RFIL,XR,"K")=KL
 . I "Q"'[KC,KC'?."^" S @TMP@(RFIL,XR,"KC")=KC
 Q
 ;
 ;===============
 ; KW(Index,TMP)
 ;===============
 ;Load Kill Entire Index logic into @TMP
 ;In:
 ;  XR  = Index #
 ;  TMP = Root of array to store data
 ;Returns:
 ;  @TMP@("KW",File#[.01],Index#) =   Kill Entire Index logic
 ;                        Index#,0) = Type ("W" for whole-file index)
 ;                                    ^RootFile
 ;                                    ^Level difference between top file
 ;                                      and root file
KW(XR,TMP) ;Get Kill Entire Index logic
 Q:'$G(XR)!($G(TMP)="")
 N FILE,KW,RFIL,TYPE
 S KW=$G(^DD("IX",XR,2.5)) Q:KW="Q"!(KW?."^")
 S FILE=$P($G(^DD("IX",XR,0)),U),TYPE=$P(^(0),U,8),RFIL=$P(^(0),U,9)
 Q:FILE=""!(RFIL="")
 ;
 S @TMP@("KW",FILE,XR)=KW
 S:RFIL'=FILE @TMP@("KW",FILE,XR,0)=TYPE_U_RFIL_U_$$FLEVDIFF^DIKCU(FILE,RFIL)
 Q
 ;
 ;#202  The input parameter that identifies the |1| is missing or invalid.
 ;#205  File# |1| and IEN string |IENS| represent different subfile levels.
 ;

DIKCBLD
DIKCBLD ;SFISC/MKO-AUTOBUILD A ROUTINE THAT CALLS CREIXN^DDMOD ; 15NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
MAIN ;Main process
 N DIKCRTN,DIKCNMSP,DIKCITL,DIKCXR,%
 ;
 ;Check save code
 D:'$D(DISYS) OS^DII
 I '$D(^DD("OS",DISYS,"ZS")) W $C(7),$$EZBLD^DIALOG(820) Q
 ;
 ;Gather information from user
Q1 S DIKCRTN=$$ASKRTN Q:U[DIKCRTN
Q2 S DIKCITL=$$ASKITL Q:DIKCITL[U  I DIKCITL="" W ! G Q1
Q3 S DIKCNMSP=$$ASKNMSP Q:DIKCNMSP[U  I DIKCNMSP="" W ! G Q2
Q4 S DIKCXR=$$ASKXR() I 'DIKCXR W ! G Q3
 ;
 ;Build and save routine
 D BUILD(DIKCRTN,DIKCITL,DIKCNMSP,DIKCXR)
 D SAVE(DIKCRTN)
 ;
 ;Final message and clean up
 W !!,"  Done!"
 W !!,"  Be sure to edit the routine to fill in the missing details,"
 W !,"  and to customize the call to CREIXN^DDMOD."
 W !
 K ^UTILITY($J)
 Q
 ;
BUILD(DIKCRTN,DIKCITL,NS,XR) ;Build routine DIKCRTN
 N CV
 K ^UTILITY($J)
 D AD(DIKCRTN_" ;xxxx/"_DIKCITL_"-CREATE NEW-STYLE XREF ;")
 D AD(" ;;1.0")
 D AD(" ;")
 D AD(" N "_NS_"XR,"_NS_"RES,"_NS_"OUT")
 D BC(NS,XR,"FILE",0,1)
 D:$P($G(^DD("IX",XR,0)),U,8)="W" BC(NS,XR,"ROOT FILE",0,9)
 D BC(NS,XR,"NAME",0,2)
 D BC(NS,XR,"TYPE",0,4)
 D BC(NS,XR,"USE",0,14)
 D BC(NS,XR,"EXECUTION",0,6)
 D BC(NS,XR,"ACTIVITY",0,7)
 D BC(NS,XR,"SHORT DESCR",0,3)
 D BCW(NS,XR,"DESCR",.1)
 D:$P($G(^DD("IX",XR,0)),U,4)="MU"
 . D BC(NS,XR,"SET",1)
 . D BC(NS,XR,"KILL",2)
 . D BC(NS,XR,"WHOLE KILL",2.5)
 D BC(NS,XR,"SET CONDITION",1.4)
 D BC(NS,XR,"KILL CONDITION",2.4)
 ;
 S CV=0 F  S CV=$O(^DD("IX",XR,11.1,CV)) Q:'CV  D
 . N ON,TP,VAL
 . S ON=$P($G(^DD("IX",XR,11.1,CV,0)),U) Q:'ON
 . S TP=$P($G(^DD("IX",XR,11.1,CV,0)),U,2)
 . I TP="F" D
 .. S VAL=$P($G(^DD("IX",XR,11.1,CV,0)),U,4) Q:'VAL
 .. D AD(" S "_NS_"XR(""VAL"","_ON_")="_VAL)
 . E  D
 .. S VAL=$G(^DD("IX",XR,11.1,CV,1.5)) Q:VAL=""
 .. D AD(" S "_NS_"XR(""VAL"","_ON_")="_$$QT(VAL))
 . D BCC(NS,XR,CV,ON,"SUBSCRIPT",0,6)
 . D BCC(NS,XR,CV,ON,"LENGTH",0,5)
 . D BCC(NS,XR,CV,ON,"COLLATION",0,7)
 . D BCC(NS,XR,CV,ON,"LOOKUP PROMPT",0,8)
 . D:TP="F"
 .. D BCC(NS,XR,CV,ON,"XFORM FOR STORAGE",2)
 .. D BCC(NS,XR,CV,ON,"XFORM FOR LOOKUP",4)
 .. D BCC(NS,XR,CV,ON,"XFORM FOR DISPLAY",3)
 ;
 D AD(" D CREIXN^DDMOD(."_NS_"XR,""SW"",."_NS_"RES,"""_NS_"OUT"")")
 D AD(" Q")
 ;
 Q
BC(NS,XR,SUB,ND,PC) ;Build code that sets an array element
 N VAL
 I $G(PC)="" S VAL=$G(^DD("IX",XR,ND))
 E  S VAL=$P($G(^DD("IX",XR,ND)),U,PC)
 Q:VAL=""
 D AD(" S "_NS_"XR("""_SUB_""")="_$$QT(VAL))
 Q
 ;
BCW(NS,XR,SUB,ND) ;Build code that sets array for wp field
 N I,VAL
 S I=0 F  S I=$O(^DD("IX",XR,ND,I)) Q:'I  D
 . S VAL=$G(^DD("IX",XR,ND,I,0)) S:VAL="" VAL=" "
 . D AD(" S "_NS_"XR("""_SUB_""","_I_")="_$$QT(VAL))
 Q
 ;
BCC(NS,XR,CV,ON,SUB,ND,PC) ;Build code that sets an array element
 N VAL
 I $G(PC)="" S VAL=$G(^DD("IX",XR,11.1,CV,ND))
 E  S VAL=$P($G(^DD("IX",XR,11.1,CV,ND)),U,PC)
 Q:VAL=""
 D AD(" S "_NS_"XR(""VAL"","_ON_","""_SUB_""")="_$$QT(VAL))
 Q
 ;
QT(X) ;Return string X quoted, if noncanonic
 Q:$G(X)="" """"""
 Q:X=+$E($P(X,"E"),1,15) X
 S X(X)="",X=$Q(X(""))
 Q $E(X,3,$L(X)-1)
 ;
AD(X) ;Add a routine line to ^UTILITY
 N LN
 S LN=$O(^UTILITY($J,0," "),-1)+1
 S ^UTILITY($J,0,LN)=X
 Q
 ;
SAVE(DIKCRTN) ;Save routine DIKCRTN
 N X,%Y
 S ^UTILITY($J,0,1)=^UTILITY($J,0,1)_$$NOW
 S X=DIKCRTN X ^DD("OS",DISYS,"ZS")
 W !!,$$EZBLD^DIALOG(8025,DIKCRTN)
 Q
 ;
ASKRTN() ;Prompt for routine name; return ^ if timeout, null, or ^
 N DIR,X,Y,DIROUT,DIRUT,DTOUT,DUOUT
 S DIR(0)="FO^1:8^K:X?.E1.C.E!'(X?1""%""1.7AN!(X?1A1.7AN)) X"
 S DIR("A")="Routine name"
 S DIR("?",1)="  Enter the name of the routine, without the leading up-arrow, that"
 S DIR("?",2)="  should be built."
 S DIR("?",3)=""
 S DIR("?",4)="  Answer must be 1-8 characters in length. It must begin with % or a"
 S DIR("?")="  letter, followed by a combination of letters and numbers."
 F  D  Q:$G(DIKCRTN)]""
 . D ^DIR I $D(DIRUT) S DIKCRTN=U Q
 . S DIKCRTN=X
 . Q:$T(^@X)=""  ; routine doesn't exist; overwrite okay. VEN/SMH
 . Q:$$ASKREPL(DIKCRTN)
 . S DIKCRTN=""
 Q $G(DIKCRTN)
 ;
ASKREPL(DIKCRTN) ;Ask whether to replace the existing routine
 N DIR,X,Y,DIROUT,DIRUT,DTOUT,DUOUT
 S DIR(0)="YO"
 S DIR("A")="  Do you wish to replace routine "_DIKCRTN
 S DIR("B")="NO"
 S DIR("?")="    Answer yes if you wish to replace routine "_DIKCRTN_" with a new version."
 W !!,"  Routine "_DIKCRTN_" already exists."
 D ^DIR W !
 Q Y
 ;
ASKITL() ;Ask for programmer initials
 N DIR,X,Y,DIROUT,DIRUT,DTOUT,DUOUT
 S DIR(0)="FO^1:15"
 S DIR("A")="Programmer initials"
 S DIR("?",1)="  Enter your initials, which will appear on the first line of the"
 S DIR("?")="  routine."
 D ^DIR
 Q Y
 ;
ASKNMSP() ;Prompt for a namespace
 N DIR,X,Y,DIROUT,DIRUT,DTOUT,DUOUT
 S DIR(0)="FO^1:4^K:X?.E1.C.E!'(X?1""%""1.3AN!(X?1A1.3AN)) X"
 S DIR("A")="Namespace to use for local variables"
 S DIR("?",1)="  All variables used in the generated routine will start with the namespace"
 S DIR("?",2)="  you choose."
 S DIR("?",3)=""
 S DIR("?",4)="  Answer must be 1-4 characters in length. It must begin with % or a"
 S DIR("?")="  letter, followed by a combination of letters and numbers."
 D ^DIR
 Q Y
 ;
ASKXR() ;Prompt for file/xref
 N DIKCCNT,DIKCROOT,DIKCTOP,DIKCFILE,DDS1,D,DIC,X,Y
 S DDS1="CROSS-REFERENCE FROM: " D W^DICRW Q:Y<0 ""
 S DIKCTOP=+$P($G(@(DIC_"0)")),U,2) Q:'DIKCTOP ""
 S DIKCFILE=$$SUB^DIKCU(DIKCTOP)
 ;
 D GETXR^DIKCUTL2(DIKCFILE,.DIKCCNT)
 W ! D LIST^DIKCUTL2(.DIKCCNT)
 Q $$CHOOSE^DIKCUTL2(.DIKCCNT,"to build a routine for")
 ;
NOW() ;Return current time in external form
 N %,%I,%H,AP,HR,MIN,MON,TIM,X
 D NOW^%DTC
 S TIM=$P(%,".",2)
 S HR=$E(TIM,1,2)
 S AP=$S(HR<12:"AM",1:"PM")
 S HR=$S(HR<13:+HR,1:HR#12)
 S MIN=$E(TIM_"0000",3,4)
 ;
 S MON=$P("Jan^Feb^Mar^Apr^May^Jun^Jul^Aug^Sep^Oct^Nov^Dec",U,%I(1))
 Q HR_":"_MIN_" "_AP_"  "_%I(2)_" "_MON_" "_(%I(3)+1700)

DIKCDD
DIKCDD ;SFISC/MKO-DATA DICTIONARY CODE FOR INDEX AND KEY FILES ;3:02 PM  5 Dec 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ITFLD ;Input transform for field
 Q:'$D(DA)!'$D(DA(1))!'$D(DDS)
 N DIKCFILE
 S DIKCFILE=$$GETFILE(.DA) I 'DIKCFILE K X Q
 ;
 N %,D,D0,DA,DDD,DIC,DICR,DIX,DO,DP,DZ,Y
 S DIC="^DD("_DIKCFILE_",",DIC(0)="EN"
 S DIC("S")="I '$P(^(0),U,2)&($P(^(0),U,2)'[""C"")"
 D ^DIC
 I Y'>0 K X
 E  S X=+$P(Y,"E")
 Q
 ;
EHFLD ;Executable help for field
 Q:'$D(DA)!'$D(DA(1))!'$D(DDS)
 N DIKCFILE
 S DIKCFILE=$$GETFILE(.DA) Q:'DIKCFILE
 ;
 N %,D,D0,DA,DDD,DIC,DICR,DIX,DO,DP,Y
 S DIC="^DD("_DIKCFILE_",",DIC(0)="",D="B"
 S DIC("S")="I '$P(^(0),U,2)&($P(^(0),U,2)'[""C"")"
 S:$G(X)="??" DZ=X
 D DQ^DICQ
 Q
 ;
GETFILE(DA) ;
 Q:'$D(DA)!'$D(DA(1))!'$D(DDS)
 N DIKCFILE
 S DIKCFILE=$$GET^DDSVAL(.114,.DA,2)
 Q DIKCFILE

DIKCFORM
DIKCFORM ;SFISC/MKO-ENTRY POINTS FOR THE 'DIKC EDIT' FORM ;2:57 PM  25 Apr 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;==========================
 ; [DIKC EDIT] entry points
 ;==========================
 ;
TYPEVAL ;Validation on Type (#.2)
 Q:DDSOLD=""
 I X'="MU"!($G(DUZ(0))'="@") D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"You can only change the Type of cross reference to MUMPS, and only if you're a programmer.")
 ;
 I X="MU",$P($G(^DD(+$$FNO^DILIBF($$GET^DDSVAL(.11,DA,.01)),0,"DI")),U)="Y" D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Cannot create MUMPS cross references on archived files.")
 Q
TYPECHG ;Post action on change for Type (#.2)
 N NAME,USE
 S USE=$$GET^DDSVAL(.11,DA,.42) Q:USE]""
 S NAME=$$GET^DDSVAL(.11,DA,.02)
 I NAME]"",$E(NAME)'="A" D PUT^DDSVAL(.11,DA,.42,"LS","","I")
 Q
 ;
NAMEVAL ;Validation for Name (#.02)
 Q:$P(^DD("IX",DA,0),U,2)=X
 I X="" D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Index Name is a required field.")
 ;
 N F01,TYPE
 ;
 S F01=$$GET^DDSVAL(.11,DA,.01)
 I $D(^DD("IX","BB",F01,X)) D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"A"_$E("n","AEIOUaeiou"[$E(X))_" '"_X_"' Index already exists.")
 ;
 I $D(^DD(F01,0,"IX",X)) D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"A"_$E("n","AEIOUaeiou"[$E(X))_" '"_X_"' cross-reference already exists.")
 ;
 I $E(X)="A",$D(^DD("KEY","AU",DA)) D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Uniqueness Index Name cannot start with 'A'.")
 Q
 ;
NAMECHG ;Post action on change for Name (#.02)
 N SORT1,SORT2,USE
 S USE=$$GET^DDSVAL(.11,DA,.42)
 S SORT1=$E(DDSOLD)="A",SORT2=$E(X)="A"
 D:SORT1'=SORT2!(USE="") PUT^DDSVAL(.11,DA,.42,$S(SORT2:"S",1:"LS"),"","I")
 D BLDLOG^DIKCFORM(DA)
 Q
 ;
USEVAL ;Validation for Use (#.42)
 N NAME,TYPE
 S NAME=$$GET^DDSVAL(.11,DA,.02)
 S TYPE=$$GET^DDSVAL(.11,DA,.2)
 I NAME=""!(TYPE="") D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Please enter a NAME and TYPE for this Index.")
 ;
 I X="S" D:$E(NAME)'="A"
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Indexes used for Sorting Only must start with 'A'.")
 E  I X="LS" D:$E(NAME)="A"
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Indexes used for Lookup & Sorting cannot start with 'A'.")
 E  I TYPE="R" D
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Only MUMPS Indexes can be Action-type Indexes.")
 E  I $E(NAME)'="A" D
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Action-type Indexes must start with 'A'.")
 Q
 ;
VALLOG ;Called from data validation of logic fields
 I $G(DUZ(0))'="@" D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit index logic.")
 ;
 I $$GET^DDSVAL(DIE,.DA,.2,"","I")'="MU" D  Q
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"You can modify the logic of only 'MUMPS' indexes.")
 Q
 ;
BLDLOG(DIXR) ;Build the logic of the cross reference
 ;Called from post actions of fields on form [DIKC EDIT]
 N TYPE
 S TYPE=$$GET^DDSVAL(.11,DIXR,.2)
 I TYPE="MU" D UPDEXEC(DIXR) Q
 ;
 N FILE,NAME,RTYPE,RFILE
 S FILE=$$GET^DDSVAL(.11,DIXR,.01)
 S NAME=$$GET^DDSVAL(.11,DIXR,.02)
 S RTYPE=$$GET^DDSVAL(.11,DIXR,.5)
 S RFILE=$$GET^DDSVAL(.11,DIXR,.51)
 ;
 N LDIF,LEV,ROOT,WKILL
 I FILE'=RFILE Q:RTYPE'="W"  S LDIF=$$FLEVDIFF^DIKCU(FILE,RFILE)
 E  S LDIF=0
 S ROOT=$$FROOTDA^DIKCU(FILE,LDIF_"O",.LEV)_""""_NAME_""""
 S WKILL="K "_ROOT_")"
 ;
 N CNT,CRV,FCNT,MAXL,ORD,SBSC,VAL
 S CRV(1)=DIXR
 S CRV=0 F  S CRV=$O(^DD("IX",DIXR,11.1,CRV)) Q:'CRV  D:$G(^(CRV,0))'?."^"
 . S ORD=$$GET^DDSVAL(.114,.CRV,.01) Q:'ORD
 . S:$$GET^DDSVAL(.114,.CRV,1)="F" FCNT=$G(FCNT)+1
 . S CNT=$G(CNT)+1
 . S SBSC=$$GET^DDSVAL(.114,.CRV,.5) Q:'SBSC
 . S MAXL=$$GET^DDSVAL(.114,.CRV,6)
 . S SBSC(SBSC)=ORD_U_MAXL
 ;
 S SBSC=0 F  S SBSC=$O(SBSC(SBSC)) Q:'SBSC  D
 . S ORD=$P(SBSC(SBSC),U),MAXL=$P(SBSC(SBSC),U,2)
 . I $G(CNT)=1 S VAL=$S(MAXL:"$E(X,1,"_MAXL_")",1:"X")
 . E  S VAL=$S(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
 . S ROOT=ROOT_","_VAL
 ;
 N L
 F L=LDIF:-1:1 S ROOT=ROOT_",DA("_L_")"
 S ROOT=ROOT_",DA)"
 ;
 N SET,KILL
 I '$O(SBSC(0)) S (SET,KILL)="Q",WKILL=""
 E  S SET="S "_ROOT_"=""""",KILL="K "_ROOT
 D PUT^DDSVAL(.11,DIXR,1.1,SET)
 D PUT^DDSVAL(.11,DIXR,2.1,KILL)
 D PUT^DDSVAL(.11,DIXR,2.5,WKILL)
 D PUT^DDSVAL(.11,DIXR,.4,$S($G(FCNT)>1:"R",1:"F"),"","I")
 Q
 ;
CRVTYPE ;Post-Action on change for Cross-Reference Value -> Type of Value
 N DIKCIENS
 S DIKCIENS=DA_","_DA(1)_","
 ;
 I X="F" D
 . D REQ^DDSUTL("FILE",1,2.1,1,DIKCIENS)
 . D REQ^DDSUTL("FIELD",1,2.1,1,DIKCIENS)
 . D REQ^DDSUTL("COMPUTED CODE",1,2.2,0,DIKCIENS)
 . D PUT^DDSVAL(DIE,.DA,4,"")
 . D PUT^DDSVAL(DIE,.DA,4.5,"")
 E  D
 . D REQ^DDSUTL("FILE",1,2.1,0,DIKCIENS)
 . D REQ^DDSUTL("FIELD",1,2.1,0,DIKCIENS)
 . D REQ^DDSUTL("COMPUTED CODE",1,2.2,1,DIKCIENS)
 . D PUT^DDSVAL(DIE,.DA,2,"")
 . D PUT^DDSVAL(DIE,.DA,3,"")
 ;
 D UPDEXEC(DA(1))
 Q
 ;
UPDEXEC(DIXR) ;Update Execution based on number of field-type xref values
 N CRV,FCNT
 S CRV(1)=DIXR,CRV=0
 F  S CRV=$O(^DD("IX",DIXR,11.1,CRV)) Q:'CRV  D
 . Q:'$$GET^DDSVAL(.114,.CRV,.01)
 . S:$$GET^DDSVAL(.114,.CRV,1)="F" FCNT=$G(FCNT)+1
 D PUT^DDSVAL(.11,DIXR,.4,$S($G(FCNT)>1:"R",1:"F"),"","I")
 Q
 ;
BKPRE21 ;Pre-Action for block 'DIKC EDIT FIELD CRV'
 N X
 S X=$$GET^DDSVAL(DIE,.DA,5) D TRANS
 Q
 ;
TRANS ;Post-Action on Change for Transform for Storage
 N DIKCIENS
 S DIKCIENS=DA_","_DA(1)_","
 I X]"" D
 . D UNED^DDSUTL("TRANSFORM FOR DISPLAY",1,2.1,0,DIKCIENS)
 E  D
 . D PUT^DDSVAL(DIE,.DA,5.5,"")
 . D UNED^DDSUTL("TRANSFORM FOR DISPLAY",1,2.1,1,DIKCIENS)
 Q
 ;
VALFILE ;Data Validation for File
 Q:X=""  Q:X=DDSOLD
 N LDIF,RFILE
 S RFILE=$$GET^DDSVAL(.11,DA,.51)
 ;
 I X'=RFILE D
 . S LDIF=$$FLEVDIFF^DIKCU(X,RFILE)
 . I LDIF="" D  Q
 .. D HLP^DDSUTL($C(7)_"File must be a parent (ancestor) of Root File.")
 .. S DDSERROR=1
 . D:DDSOLD=RFILE PUT^DDSVAL(.11,DA,.5,"W","","I")
 E  D:DDSOLD'=RFILE PUT^DDSVAL(.11,DA,.5,"I","","I")
 Q
 ;
FORMDV ;Form-Level Data Validation
 ;Check that Subscript Numbers are unique and consecutive from 1.
 N DIKCDA,DIKCI,DIKCLIST,DIKCSS,DIKCSQ
 ;
 ;Build list DIKCLIST(ss#,ien) while checking for duplicates.
 ;Also check that a file# is assigned for Field-type CRVs and that
 ;they it is equal to root file.
 S DIKCDA(1)=DA
 S DIKCDA=0 F  S DIKCDA=$O(^DD("IX",DA,11.1,DIKCDA)) Q:'DIKCDA  D
 . I $$GET^DDSVAL(.114,.DIKCDA,1)="F" D
 .. N DIKCFIL,DIKCMSG,DIKCRF
 .. S DIKCFIL=$$GET^DDSVAL(.114,.DIKCDA,2)
 .. I DIKCFIL="" D
 ... D:'$D(DDSERROR) MSG^DDSUTL($C(7)_"UNABLE TO SAVE CHANGES")
 ... S DDSERROR=1
 ... S DIKCMSG(1)="FILE for Order #"_$$GET^DDSVAL(.114,.DIKCDA,.01)_" is missing."
 ... S DIKCMSG(2)="  To correct the problem, press <RET> at the Order # on Page 2."
 ... S DIKCMSG(3)="  In the resulting pop-up page, FILE will be filled in automatically."
 ... S DIKCMSG(4)="  Try saving again."
 ... D MSG^DDSUTL(.DIKCMSG)
 .. E  S DIKCRF=$$GET^DDSVAL(.11,DA,.51) I DIKCFIL'=DIKCRF D
 ... D:'$D(DDSERROR) MSG
 ... S DDSERROR=1
 ... D MSG^DDSUTL("FILE for Order #"_$$GET^DDSVAL(.114,.DIKCDA,.01)_" is not equal to the Root File: "_DIKCRF_".")
 . S DIKCSS=$$GET^DDSVAL(.114,.DIKCDA,.5) Q:'DIKCSS
 . I $D(DIKCLIST(DIKCSS)) D
 .. D:'$D(DDSERROR) MSG
 .. S DDSERROR=1
 .. D MSG^DDSUTL("The subscript number "_DIKCSS_" is used more than once.")
 . E  S DIKCLIST(DIKCSS,DIKCDA)=""
 ;
 ;If no duplicates, check that subscript numbers are consecutive from 1
 I '$D(DDSERROR) D
 . S DIKCSS=0
 . F DIKCI=1:1 S DIKCSS=$O(DIKCLIST(DIKCSS)) Q:'DIKCSS!$G(DDSERROR)  D:DIKCSS'=DIKCI
 .. S DDSERROR=1
 .. D MSG
 .. D MSG^DDSUTL("Subscript numbers must be consecutive numbers starting with 1.")
 Q
 ;
MSG ;Print message
 D MSG^DDSUTL($C(7)_"UNABLE TO SAVE CHANGES")
 Q
 ;
POSTSV ;Post Save
 ;Clean-up global (get rid of null nodes)
 ;Kill DIKCREB, the flag that indicates that a crv was deleted, but
 ;the logic wasn't yet saved.
 N CRV,ND
 S CRV=0 F  S CRV=$O(^DD("IX",DA,11.1,CRV)) Q:'CRV  D
 . F ND=1.5,2,3 I $D(^DD("IX",DA,11.1,CRV,ND))#2,^(ND)="" K ^(ND)
 K DIKCREB
 Q

DIKCP
DIKCP ;SFISC/MKO-PRINT INDEX(ES) ;11:33 AM  1 Nov 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;==============================
 ; PRINT(File,Field,Flag,.Page)
 ;==============================
 ;In:
 ; FIL   = File #
 ; FLD   = Field # (optional) (ignored if FLAG [ M)
 ; FLAG    [ Cn : column tab stop from left margin (def=18)
 ;         [ F  : print field-level indexes
 ;         [ Ln : left margin (def=0)
 ;         [ M  : include subfiles (multiples) under File
 ;         [ N  : don't print any mumps code
 ;         [ O  : print traditional 1-node cross references
 ;         [ R  : print record-level indexes
 ;         [ S  : single space (no blank lines)
 ;         [ Tn : type (style) of 1st lines of each xref
 ; PAGE("H") = header text or M code that begins with a write statement
 ;             If text   : eop read issued; and @IOF, PAGE("H")
 ;                         is written automatically
 ;             If M code : code must issue eop read, write @IOF, and
 ;                         write the header.
 ;             undefined : no paging
 ;
 ; PAGE("B") = bottom margin
 ;Out:
 ; PAGE(U)   = returns as 1, if timeout or ^ at eop
 ;Notes:
 ; Type 0 : Used for the listings at the beg and end of report.
 ;          First line looks like:
 ;           AC (#30)    REGULAR    FIELD    IR    SORTING ONLY
 ;
 ; Type 1 : Used for the listing with each field.
 ;          First line looks like:
 ;           FIELD INDEX:     AC (#30)    REGULAR    IR    SORTING ONLY
 ;
PRINT(FIL,FLD,FLAG,PAGE) ;Print all indexes on one file(/field)
 Q:'$G(FIL)
 N HSTR,LM,SB,TOP,TS,TYP,WID
 ;
 ;Initialize variables
 D INIT
 ;
 ;M flag, print file and subfile indexes
 I FLAG["M" D
 . D SUBFILES^DIKCU(FIL,.SB)
 . S TOP=1 F  D  Q:PAGE(U)  S FIL=$O(SB(FIL)) Q:'FIL
 .. I FLAG["R"!(FLAG["F"),$D(^DD("IX","AC",FIL)) D
 ... D PRFILE(FIL,"",FLAG,.PAGE)
 .. E  I FLAG["O",$D(^DD(FIL,"IX")) D
 ... D PRFILE(FIL,"",FLAG,.PAGE)
 .. I $G(TOP) S FIL=0 K TOP
 ;
 E  D PRFILE(FIL,$G(FLD),FLAG,.PAGE)
 Q
 ;
PRFILE(FIL,FLD,FLAG,PAGE) ;Print indexes for 1 file
 Q:'$G(FIL)
 N FHDR,HDR,NAM,NO,XR,XRL
 I $G(FLAG)'["i" N LM,TS,TYP,WID D INIT
 ;
 ;Print traditional xrefs
 I FLAG["O" D PRFILE^DIKCP3(FIL,$G(FLD),FLAG,.PAGE,.FHDR) Q:PAGE(U)
 I FLAG'["F",FLAG'["R" Q
 ;
 ;Print indexes
 I $G(FLD)="" D
 . ;Build list of xrefs sorted by name
 . S XR=0 F  S XR=$O(^DD("IX","AC",FIL,XR)) Q:'XR  D
 .. Q:$G(^DD("IX",XR,0))?."^"  Q:FLAG'[$P(^(0),U,6)  S NAM=$P(^(0),U,2)
 .. S:NAM="" NAM=" <no name"_$G(NO)_">",NO=$G(NO)+1
 .. S XRL(NAM,XR)=""
 . ;
 . ;Loop through sorted list
 . S NAM="" F  S NAM=$O(XRL(NAM)) Q:NAM=""  D  Q:PAGE(U)
 .. S XR=0 F  S XR=$O(XRL(NAM,XR)) Q:'XR  D  Q:PAGE(U)
 ... I '$G(FHDR) D FHDR(FIL,FLAG,.PAGE,.FHDR) Q:PAGE(U)
 ... I '$G(HDR) D HDR(FIL,FLAG,LM,.PAGE,.HDR) Q:PAGE(U)
 ... D PRINDEX(XR,FLAG,.PAGE) Q:PAGE(U)
 ... D WRLN("",0,.PAGE) Q:PAGE(U)
 ... I FLAG'["S" D WRLN("",0,.PAGE)
 ;
 E  S XR=0 F  S XR=$O(^DD("IX","F",FIL,FLD,XR)) Q:'XR  D  Q:PAGE(U)
 . Q:$D(^DD("IX",XR,0))?."^"  Q:FLAG'[$P(^(0),U,6)
 . I '$G(FHDR) D FHDR(FIL,FLAG,.PAGE,.FHDR) Q:PAGE(U)
 . I '$G(HDR) D HDR(FIL,FLAG,LM,.PAGE,.HDR) Q:PAGE(U)
 . D PRINDEX(XR,FLAG,.PAGE) Q:PAGE(U)
 . D WRLN("",0,.PAGE) Q:PAGE(U)
 . I FLAG'["S" D WRLN("",0,.PAGE)
 Q
 ;
PRINDEX(XR,FLAG,PAGE) ;Print one index
 G PRINDEX^DIKCP1
 ;
HDR(FIL,FLAG,LM,PAGE,HDR) ;Print header for indexes
 S HDR=1
 I FLAG'["M",FLAG'["O" Q
 D WRLN($S(FLAG["R"&(FLAG["F"):"New-Style",FLAG["R":"Record",1:"Field")_" Indexes:",LM,.PAGE,2) Q:PAGE(U)
 D WRLN("",0,.PAGE)
 Q
 ;
FHDR(FIL,FLAG,PAGE,FHDR) ;Print header for file
 S FHDR=1
 Q:FLAG'["M"
 D WRLN($P("F^Subf",U,$D(^DD(FIL,0,"UP"))#2+1)_"ile #"_FIL,0,.PAGE,2) Q:PAGE(U)
 D WRLN("",0,.PAGE)
 Q
 ;
 ;=============================
 ; LIST(File,Field,Flag,.Page)
 ;=============================
 ;List Indexes that reside on a given file.
 ;In:
 ; Same as PRINT above (except that N and O flag don't apply)
 ;Out:
 ; PAGE(U)   = Returns as 1, if timeout or ^ at eop
 ;Notes:
 ; Type 0 : Used for the listing of Indexes on a file or subfile
 ;           INDEXED BY:    ANOTHER FIELD (AC), SET & FREE (C),
 ;                          ANOTHER FIELD & EXTRACT (D)
 ;
 ; Type 1 : Used for the listing of Record Indexes with each field.
 ;           RECORD INDEXES:  WF (#22) [WHOLE FILE on #9999)],
 ;                            WF (#24), AC (#52)
 ;
LIST(FIL,FLD,FLAG,PAGE) ;
 Q:'$G(FIL)
 N LAB,LM,SB,SUB,TS,TYP,WID
 ;
 ;Initialize variables
 D INIT
 ;
 ;Set label
 I TYP=1 D
 . I FLAG["R",FLAG["F" S LAB="INDEXES: "
 . E  I FLAG["R" S LAB="RECORD INDEXES: "
 . E  S LAB="FIELD INDEXES: "
 E  S LAB="INDEXED BY: "
 S LAB=LAB_$J("",TS-$L(LAB))
 ;
 ;M flag, get and list for file and subfiles
 I FLAG["M" D
 . D SUBFILES^DIKCU(FIL,.SB)
 . S SUB=""
 . F  D  Q:PAGE(U)  S:SUB="" SUB="SUB",FIL=0 S FIL=$O(SB(FIL)) Q:'FIL
 .. Q:'$D(^DD("IX","B",FIL))
 .. I SUB]""!(FLAG'["S") D WRLN("",0,.PAGE) Q:PAGE(U)
 .. D WRLN(SUB_"FILE #"_FIL,LM,.PAGE,1) Q:PAGE(U)
 .. D LFILE(FIL,"",FLAG,LAB,.PAGE) Q:PAGE(U)
 ;
 ;Otherwise, just list for one file
 E  D
 . I FLAG'["S" D WRLN("",0,.PAGE) Q:PAGE(U)
 . D LFILE(FIL,$G(FLD),FLAG,LAB,.PAGE)
 Q
 ;
LFILE(FIL,FLD,FLAG,LAB,PAGE) ;Format list of indexes and print
 G LFILE^DIKCP2
 ;
INIT ;Initialize module-wide variables
 Q:$G(FLAG)["i"
 S FLAG=$G(FLAG)_"i"
 I FLAG'["F",FLAG'["R",FLAG'["O" S FLAG="OFR"_FLAG
 S LM=+$P(FLAG,"L",2)\1
 S TS=+$P(FLAG,"C",2) S:'TS TS=18
 S TYP=+$P(FLAG,"T",2)\1
 S WID=$G(IOM,80)-1-LM-TS S:WID<1 WID=1
 S PAGE(U)=""
 Q
 ;
 ;===================================
 ; WRLN(Text,Tab,.Page,KeepWithNext)
 ;===================================
 ;Write a single line of text, precede with a !, do paging if necessary
 ;In:
 ; TXT       = Text to write; $C(0) replaced with spaces.
 ; TAB       = ?Tab before writing text (def=0)
 ; PAGE("H") = Header text or M code that begins with a write statement
 ;             If not passed in, no paging.
 ; PAGE("B") = Bottom margin
 ; KWN       = Additional padding on bottom margin ("keep with next")
 ;Out:
 ; PAGE(U)   = Returns as 1, if timeout or ^ at eop
 ;
WRLN(TXT,TAB,PAGE,KWN) ;Write a line of text
 N X
 S PAGE(U)=""
 ;
 ;Do paging, if necessary
 I $D(PAGE("H"))#2,$G(IOSL,24)-2-$G(PAGE("B"))-$G(KWN)'>$Y D  Q:PAGE(U)
 . I PAGE("H")?1"W ".E X PAGE("H") Q
 . I $E($G(IOST,"C"))="C" D  Q:PAGE(U)
 .. W $C(7) R X:$G(DTIME,300) I X=U!'$T S PAGE(U)=1
 . W @$G(IOF,"#"),PAGE("H")
 ;
 ;Write text
 W !?$G(TAB),$TR($G(TXT),$C(0)," ")
 Q

DIKCP1
DIKCP1 ;SFISC/MKO-PRINT INDEX(ES) ;20DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PRINDEX ;Come here from PRINDEX^DIKCP
 Q:'$G(XR)
 N XR0
 I $G(FLAG)'["i" N LM,TYP,TS,WID D INIT^DIKCP
 S XR0=$G(^DD("IX",XR,0)) Q:XR0?."^"
 ;
 ;Print first line of information
 D FL(XR0,WID,LM,TS,TYP,.PAGE) Q:PAGE(U)
 I FLAG'["S" D WRLN("",0,.PAGE) Q:PAGE(U)
 ;
 ;Print Keys with this Uniqueness Index
 D KEY(XR,WID,LM,TS,.PAGE) Q:PAGE(U)
 ;
 ;Print short description
 I $P(XR0,U,3)]"" D  Q:PAGE(U)
 . D WLP("Short Descr:  ",$P(XR0,U,3),WID,LM+TS,0,.PAGE)
 ;
 ;Print description
 I $O(^DD("IX",XR,.1,0)) D  Q:PAGE(U)
 . D WRWP($NA(^DD("IX",XR,.1)),LM,WID,"Description:  ",TS,.PAGE)
 I FLAG'["S" D WRLN("",0,.PAGE) Q:PAGE(U)
 ;
 ;Print logic
 I FLAG'["N" D  Q:PAGE(U)
 . D LOGIC(XR,WID,LM,TS,FLAG,.PAGE) Q:PAGE(U)
 . I FLAG'["S" D WRLN("",0,.PAGE)
 ;
 ;Print Cross Reference Values
 D CRV(XR,WID,LM,TS,FLAG,.PAGE)
NOREIN I $G(^DD("IX",XR,"NOREINDEX")) W !?9,"NO RE-INDEXING ALLOWED!"
 Q
 ;
FL(XR0,WID,LM,TS,TYP,PAGE) ;Print first line
 N ACT,EXEC,NAME,RTYP,SP,TYPE,TXT,USE
 ;
 S SP=$J("",4)
 S EXEC=$$EXTERNAL^DILFD(.11,.4,"",$P(XR0,U,6))
 S NAME=$P(XR0,U,2)_" (#"_XR_")"
 S TYPE=$$EXTERNAL^DILFD(.11,.2,"",$P(XR0,U,4))
 S ACT=$P(XR0,U,7)
 S USE=$TR($$EXTERNAL^DILFD(.11,.42,"",$P(XR0,U,14))," ",$C(0))
 S RTYP=$P(XR0,U,8) S:"I"[RTYP RTYP=""
 S:RTYP]"" RTYP=$TR($$EXTERNAL^DILFD(.11,.5,"",RTYP)," ",$C(0))
 S:RTYP]"" RTYP=SP_RTYP_$C(0)_"(#"_$P(XR0,U)_")"
 ;
 ;Print first line
 I TYP=1 D
 . S TXT=EXEC_" INDEX: ",TXT=TXT_$J("",TS-$L(TXT))
 . S TXT=TXT_NAME_SP_TYPE_SP_ACT_SP_USE_RTYP
 E  S TXT=NAME_SP_EXEC_SP_TYPE_SP_ACT_SP_USE_RTYP
 ;
 D WRPHI(TXT,WID,LM,TS,0,.PAGE)
 Q
 ;
KEY(XR,WID,LM,TS,PAGE) ;Print keys that have XR as Uniqueness Index
 Q:'$D(^DD("KEY","AU",XR))
 N KEY,KEY0,KEYLN,TXT
 ;
 S TXT=0,TXT(0)=""
 S KEY=0 F  S KEY=$O(^DD("KEY","AU",XR,KEY)) Q:'KEY  D
 . S KEY0=$G(^DD("KEY",KEY,0)) Q:KEY0?."^"
 . S KEYLN="Key "_$P(KEY0,U,2)_" (#"_KEY_"), File #"_$P(KEY0,U)
 . S:$G(TXT(TXT))]"" TXT(TXT)=TXT(TXT)_"; "
 . D ADDSTR($TR(KEYLN," ",$C(0)),.TXT)
 Q:$G(TXT(0))=""
 D WLP("Unique for:  ",.TXT,WID,LM+TS,0,.PAGE)
 Q
 ;
LOGIC(XR,WID,LM,TS,FLAG,PAGE) ;Print set and kill logic
 N CD,LN
 S CD=$G(^DD("IX",XR,1))
 I CD'?."^" D  Q:PAGE(U)
 . D WLP("Set Logic:  ",CD,WID,LM+TS,1,.PAGE) Q:PAGE(U)
 . S LN=0 F  S LN=$O(^DD("IX",XR,1.2,LN)) Q:LN'=+LN  D  Q:PAGE(U)
 .. S CD=$G(^DD("IX",XR,1.2,LN,1))
 .. I CD'?."^" D WLP(LN_") ",CD,WID,LM+TS,1,.PAGE)
 S CD=$G(^DD("IX",XR,1.4))
 I CD'?."^" D WLP("Set Cond:  ",CD,WID,LM+TS,1,.PAGE) Q:PAGE(U)
 ;
 S CD=$G(^DD("IX",XR,2))
 I CD'?."^" D  Q:PAGE(U)
 . D WLP("Kill Logic:  ",CD,WID,LM+TS,1,.PAGE) Q:PAGE(U)
 . S LN=0 F  S LN=$O(^DD("IX",XR,2.2,LN)) Q:LN'=+LN  D  Q:PAGE(U)
 .. S CD=$G(^DD("IX",XR,2.2,LN,2))
 .. I CD'?."^" D WLP(LN_") ",CD,WID,LM+TS,1,.PAGE)
 S CD=$G(^DD("IX",XR,2.4))
 I CD'?."^" D WLP("Kill Cond:  ",CD,WID,LM+TS,1,.PAGE) Q:PAGE(U)
 S CD=$G(^DD("IX",XR,2.5))
 I CD'?."^" D WLP("Whole Kill:  ",CD,WID,LM+TS,1,.PAGE) Q:PAGE(U)
 Q
 ;
CRV(XR,WID,LM,TS,FLAG,PAGE) ;Print cross reference values
 N CD,CV,CV0,FL,FD,LAB,ORD,TXT
 S ORD="" F  S ORD=$O(^DD("IX",XR,11.1,"B",ORD)) Q:ORD=""  D  Q:PAGE(U)
 . S CV=$O(^DD("IX",XR,11.1,"B",ORD,0)) Q:'CV
 . Q:$G(^DD("IX",XR,11.1,CV,0))?."^"  S CV0=^(0)
 . S LAB=$S(FLAG'["N":"X("_ORD_"):  ",1:ORD_":  ")
 . ;
 . ;Field-type values
 . I $P(CV0,U,2)="F" D  Q:PAGE(U)
 .. S FL=$P(CV0,U,3),FD=$P(CV0,U,4)
 .. I FL,FD S TXT=$P($G(^DD(FL,FD,0)),U)_"  ("_FL_","_FD_")"
 .. E  S TXT="<undefined file/field>"
 .. D CRVOTH(CV0,.TXT)
 .. D WLP(LAB,TXT,WID,LM+TS,"",.PAGE)
 . ;
 . ;Computed-type values
 . E  D  Q:PAGE(U)
 .. S CD=$G(^DD("IX",XR,11.1,CV,1.5))
 .. I CD'?."^" D
 ... S TXT=$S(FLAG["N":"<computed>",1:"Computed Code: "_CD)
 .. E  S TXT="<undefined computed code>"
 .. D WLP(LAB,TXT,WID,LM+TS,1,.PAGE) Q:PAGE(U)
 .. S TXT=""
 .. D CRVOTH(CV0,.TXT)
 .. D WLP("",TXT,WID,LM+TS,"",.PAGE)
 . ;
 . ;Lookup prompt
 . I $P(CV0,U,8)]"" D  Q:PAGE(U)
 .. D WLP("Lookup Prompt:  ",$P(CV0,U,8),WID-18,LM+TS+18,"",.PAGE)
 . ;
 . ;Transform
 . I FLAG'["N" D
 .. S CD=$G(^DD("IX",XR,11.1,CV,2))
 .. I CD'?."^" D WLP("Transform (Storage):  ",CD,WID-24,LM+TS+24,1,.PAGE)
 .. S CD=$G(^DD("IX",XR,11.1,CV,4))
 .. I CD'?."^" D WLP(" Transform (Lookup):  ",CD,WID-24,LM+TS+24,1,.PAGE)
 .. S CD=$G(^DD("IX",XR,11.1,CV,3))
 .. I CD'?."^" D WLP("Transform (Display):  ",CD,WID-24,LM+TS+24,1,.PAGE)
 Q
 ;
CRVOTH(CV0,TXT) ;Get other attributes of Cross Reference Value
 S:$P(CV0,U,6) TXT=TXT_"  (Subscr"_$C(0)_$P(CV0,U,6)_")"
 S:$P(CV0,U,5) TXT=TXT_"  (Len"_$C(0)_$P(CV0,U,5)_")"
 I $P(CV0,U,7)]"" D
 . S TXT=TXT_"  ("_$$EXTERNAL^DILFD(.114,7,"",$P(CV0,U,7))_")"
 Q
 ;
ADDSTR(X,TXT) ;Add string X to the TXT array
 I $L(TXT(TXT))+$L(X)>200 S TXT=TXT+1,TXT(TXT)=""
 S TXT(TXT)=TXT(TXT)_X
 Q
 ;
WRPHI(TXT,WID,LM,TS,COD,PAGE) ;Write a paragraph with a hanging indent
 N LAB,LN,TAB
 S:$D(TXT(0))[0 TXT(0)=$G(TXT)
 S LAB=$E(TXT(0),1,$G(TS)),TXT(0)=$E(TXT(0),$G(TS)+1,999)
 D WRAP^DIKCU2(.TXT,WID,"",$G(COD))
 D WRLN($G(LAB)_TXT(0),$G(LM),.PAGE) Q:PAGE(U)
 F LN=1:1 Q:'$D(TXT(LN))  D WRLN(TXT(LN),$G(LM)+$G(TS),.PAGE) Q:PAGE(U)
 Q
 ;
WLP(LAB,TXT,WID,TAB,COD,PAGE,WFLAG) ;Write a labeled paragraph
 N LN
 S:$D(TXT(0))[0 TXT(0)=$G(TXT)
 D WRAP^DIKCU2(.TXT,WID,"",$G(COD))
 D WRLN($G(LAB)_TXT(0),TAB-$L(LAB),.PAGE) Q:PAGE(U)
 F LN=1:1 Q:'$D(TXT(LN))  D WRLN(TXT(LN),TAB,.PAGE) Q:PAGE(U)
 S WFLAG=LN>1
 Q
 ;
WRLN(TXT,TAB,PAGE,KWN) ;Write a line of text
 ;See ^DIKCP for documentation
 N X
 S PAGE(U)=""
 ;
 ;Do paging, if necessary
 I $D(PAGE("H"))#2,$G(IOSL,24)-2-$G(PAGE("B"))-$G(KWN)'>$Y D  Q:PAGE(U)
 . I PAGE("H")?1"W ".E X PAGE("H") Q
 . I $E($G(IOST,"C"))="C" D  Q:PAGE(U)
 .. W $C(7) R X:$G(DTIME,300) I X=U!'$T S PAGE(U)=1
 . W @$G(IOF,"#"),PAGE("H")
 ;
 ;Write text
 W !?$G(TAB),$TR($G(TXT),$C(0)," ")
 Q
 ;
WRWP(ROOT,LM,WID,LAB,TS,PAGE) ;Call DIWP/DIWW to format a wp field.
 ;Then write the formatted lines.
 Q:$G(ROOT)=""  Q:'$D(@ROOT)
 N DIWF,DIWL,DIWR,LN,X
 N DIW,DIWI,DIWT,DIWTC,DIWX,DN,I,Z
 K ^UTILITY($J,"W")
 ;
 S LM=$G(LM)\1,WID=$G(WID)\1,TS=$G(TS)\1,LAB=$G(LAB)
 I 'WID S WID=$G(IOM,80)-1-LM-TS S:WID<1 WID=1
 S DIWL=0,DIWR=WID,DIWF="|"
 S LN=0 F  S LN=$O(@ROOT@(LN)) Q:'LN  S X=$G(@ROOT@(LN,0)) D ^DIWP
 ;
 D WRLN($G(LAB)_$G(^UTILITY($J,"W",DIWL,1,0)),LM+TS-$L(LAB),.PAGE)
 G:$G(PAGE(U)) WRWPQ
 ;
 S LN=1 F  S LN=$O(^UTILITY($J,"W",DIWL,LN)) Q:'LN  D  Q:$G(PAGE(U))
 . D WRLN(^UTILITY($J,"W",DIWL,LN,0),LM+TS,.PAGE)
 ;
WRWPQ ;Cleanup and quit
 K ^UTILITY($J,"W")
 Q

DIKCP2
DIKCP2 ;SFISC/MKO-PRINT INDEX(ES) ;9:39 AM  5 Aug 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LFILE ;Format list of indexes and print; Come here from LFILE^DIKCP
 N LN,NAM,NO,TXT,XR,XRL
 S TXT=0,TXT(0)=""
 ;
 I $G(FLD)="" S NAM="" F  S NAM=$O(^DD("IX","BB",FIL,NAM)) Q:NAM=""  D
 . S XR=0
 . F  S XR=$O(^DD("IX","BB",FIL,NAM,XR)) Q:'XR  D ADDXR(XR,.TXT,FLAG)
 E  D
 . S XR=0
 . F  S XR=$O(^DD("IX","F",FIL,FLD,XR)) Q:'XR  D
 .. Q:$G(^DD("IX",XR,0))?."^"  S NAM=$P(^(0),U,2)
 .. S:NAM="" NAM=" <no name"_$G(NO)_">",NO=$G(NO)+1
 .. S XRL(NAM,XR)=""
 . S NAM="" F  S NAM=$O(XRL(NAM)) Q:NAM=""  D
 .. S XR=0 F  S XR=$O(XRL(NAM,XR)) Q:'XR  D ADDXR(XR,.TXT,FLAG)
 Q:TXT(0)=""
 ;
 D WRAP^DIKCU2(.TXT,WID)
 D WRLN($G(LAB)_TXT(0),LM,.PAGE) Q:PAGE(U)
 F LN=1:1 Q:'$D(TXT(LN))  D WRLN(TXT(LN),LM+$L(LAB),.PAGE) Q:PAGE(U)
 Q
 ;
ADDXR(XR,TXT,FLAG) ;Add field list and xref name to TXT array
 N CRV,FIL,FLD,FLDNAM,FND,NAM,RTYP,STR,XR0
 S XR0=$G(^DD("IX",XR,0))
 Q:XR0?."^"  Q:FLAG'[$P(XR0,U,6)
 ;
 S:$G(TXT(TXT))]"" TXT(TXT)=TXT(TXT)_", "
 S NAM=$P(XR0,U,2)
 ;
 I TYP=1 D
 . S STR=NAM_$C(0)_"(#"_XR_")"
 . S RTYP=$P(XR0,U,8)
 . I "I"'[RTYP D
 .. S STR=STR_" ("_$TR($$EXTERNAL^DILFD(.11,.5,"",RTYP)," ",$C(0))
 .. S STR=STR_" #"_$P(XR0,U)_")"
 ;
 E  D
 . S CRV=0 F  S CRV=$O(^DD("IX",XR,11.1,CRV)) Q:'CRV  D
 .. Q:$P($G(^DD("IX",XR,11.1,CRV,0)),U,2)'="F"
 .. S FIL=$P(^DD("IX",XR,11.1,CRV,0),U,3),FLD=$P(^(0),U,4)
 .. Q:'FIL  Q:'FLD
 .. S FLDNAM=$P($G(^DD(FIL,FLD,0)),U)  Q:FLDNAM=""
 .. D:$G(FND) ADDSTR("& ",.TXT) D ADDSTR(FLDNAM_" ",.TXT)
 .. S FND=1
 . S STR="("_NAM_")"
 . ;
 D ADDSTR(STR,.TXT)
 Q
 ;
ADDSTR(X,TXT) ;Add string X to the TXT array
 I $L(TXT(TXT))+$L(X)>250 S TXT=TXT+1,TXT(TXT)=""
 S TXT(TXT)=TXT(TXT)_X
 Q
 ;
WRLN(TXT,TAB,PAGE,KWN) ;Write a line of text
 ;See ^DIKCP for documentation
 N X
 S PAGE(U)=""
 ;
 ;Do paging, if necessary
 I $D(PAGE("H"))#2,$G(IOSL,24)-2-$G(PAGE("B"))-$G(KWN)'>$Y D  Q:PAGE(U)
 . I PAGE("H")?1"W ".E X PAGE("H") Q
 . I $E($G(IOST,"C"))="C" D  Q:PAGE(U)
 .. W $C(7) R X:$G(DTIME,300) I X=U!'$T S PAGE(U)=1
 . W @$G(IOF,"#"),PAGE("H")
 ;
 ;Write text
 W !?$G(TAB),$TR($G(TXT),$C(0)," ")
 Q

DIKCP3
DIKCP3 ;SFISC/MKO-PRINT INDEX(ES) ;9:21 PM  7 Dec 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
PRFILE(FIL,FLD,FLAG,PAGE,FHDR) ;Print Traditional cross-references on a file
 Q:'$G(FIL)
 N HDR,NAM,NO,XR
 I $G(FLAG)'["i" N LM,TS,TYP,WID D INIT^DIKCP
 ;
 ;If field is not specified, print all xrefs on field
 I $G(FLD)="" D
 . ;Build list of xrefs sorted by name
 . K ^TMP("DIKCP3",$J)
 . S FLD=0 F  S FLD=$O(^DD(FIL,"IX",FLD)) Q:'FLD  D
 .. S XR=0 F  S XR=$O(^DD(FIL,FLD,1,XR)) Q:'XR  D
 ... Q:$D(^DD(FIL,FLD,1,XR))<9  S NAM=$P($G(^(XR,0)),U,2)
 ... S:NAM="" NAM="~~"_$G(NO),NO=$G(NO)+1
 ... S ^TMP("DIKCP3",$J,NAM,FLD,XR)=""
 . ;
 . ;Loop through sorted list and print
 . S NAM="" F  S NAM=$O(^TMP("DIKCP3",$J,NAM)) Q:NAM=""  D  Q:PAGE(U)
 .. S FLD=0 F  S FLD=$O(^TMP("DIKCP3",$J,NAM,FLD)) Q:'FLD  D  Q:PAGE(U)
 ... S XR=0 F  S XR=$O(^TMP("DIKCP3",$J,NAM,FLD,XR)) Q:'XR  D  Q:PAGE(U)
 .... I '$G(FHDR) D FHDR^DIKCP(FIL,FLAG,.PAGE,.FHDR) Q:PAGE(U)
 .... I '$G(HDR) D HDR(FIL,FLAG,LM,.PAGE,.HDR) Q:PAGE(U)
 .... D PRINDEX(FIL,FLD,XR,FLAG,.PAGE) Q:PAGE(U)
 .... D WRLN("",0,.PAGE) Q:PAGE(U)
 .... I FLAG'["S" D WRLN("",0,.PAGE)
 . K ^TMP("DIKCP3",$J)
 ;
 ;Else print cross-references on specific field
 E  S XR=0 F  S XR=$O(^DD(FIL,FLD,1,XR)) Q:'XR  D  Q:PAGE(U)
 . I '$G(FHDR) D FHDR^DIKCP(FIL,FLAG,.PAGE,.FHDR) Q:PAGE(U)
 . I '$G(HDR) D HDR(FIL,FLAG,LM,.PAGE,.HDR) Q:PAGE(U)
 . D PRINDEX(FIL,FLD,XR,FLAG,.PAGE) Q:PAGE(U)
 . D WRLN("",0,.PAGE) Q:PAGE(U)
 . I FLAG'["S" D WRLN("",0,.PAGE)
 Q
 ;
PRINDEX(FIL,FLD,XR,FLAG,PAGE) ;Print a specific index
 Q:'$G(FIL)!'$G(FLD)!'$G(XR)
 N ND,WFLAG
 I $G(FLAG)'["i" N LM,TYP,TS,WID D INIT^DIKCP
 ;
 ;Print first line of information
 D FL(FIL,FLD,XR,WID,LM,TS,TYP,.PAGE) Q:PAGE(U)
 ;
 ;Print Field
 D WLP^DIKCP1("Field:  ",$P($G(^DD(FIL,FLD,0)),U)_"  ("_FIL_","_FLD_")",WID,LM+TS,0,.PAGE)
 Q:PAGE(U)
 ;
 ;For Triggers, print triggered field
 I $P($G(^DD(FIL,FLD,1,XR,0)),U,3)["TRIG" D  Q:PAGE(U)
 . N LAB,TFIL,TFLD
 . S TFIL=$P(^DD(FIL,FLD,1,XR,0),U,4),TFLD=$P(^(0),U,5)
 . S LAB="Triggered Field:  "
 . D WLP^DIKCP1(LAB,$P($G(^DD(TFIL,TFLD,0)),U)_"  ("_TFIL_","_TFLD_")",WID-$L(LAB),LM+TS+$L(LAB),"",.PAGE)
 ;
 ;Print Description
 I $O(^DD(FIL,FLD,1,XR,"%D",0)) D  Q:PAGE(U)
 . D WRWP^DIKCP1($NA(^DD(FIL,FLD,1,XR,"%D")),LM,WID,"Description:  ",TS,.PAGE)
 I FLAG'["S" D WRLN("",0,.PAGE) Q:PAGE(U)
 ;
 ;Print xref nodes
 K WFLAG
 S ND=0 F  S ND=$O(^DD(FIL,FLD,1,XR,ND)) Q:ND=""  D  Q:PAGE(U)
 . Q:ND="%D"!(ND="DT")
 . N TXT
 . S TXT(0)=ND_")= "
 . S TXT(1)=^DD(FIL,FLD,1,XR,ND)
 . I FLAG'["S",ND,$G(WFLAG) D WRLN("",0,.PAGE) Q:PAGE(U)
 . D WLP^DIKCP1("",.TXT,WID,LM+TS,1,.PAGE,.WFLAG)
 Q
 ;
FL(FIL,FLD,XR,WID,LM,TS,TYP,PAGE) ;Print first line
 N NAME,SP,TYPE,TXT,WF,XR0
 ;
 S SP=$J("",4)
 S XR0=$G(^DD(FIL,FLD,1,XR,0)) Q:XR0?."^"
 S NAME=$P(XR0,U,2)
 S TYPE=$P(XR0,U,3) S:TYPE="" TYPE="REGULAR"
 S TXT=NAME_SP_TYPE
 ;
 I $P(XR0,U),$P(XR0,U)'=FIL D
 . S TXT=TXT_SP_"WHOLE"_$C(0)_"FILE"_$C(0)_"(#"_$P(XR0,U)_")"
 ;
 ;Print first line
 D WRPHI^DIKCP1(TXT,WID,LM,TS,0,.PAGE)
 Q
 ;
HDR(FIL,FLAG,LM,PAGE,HDR) ;Print header
 I FLAG'["M",FLAG'["R",FLAG'["F" Q
 D WRLN("Traditional Cross-References:",LM,.PAGE,2) Q:PAGE(U)
 D WRLN("",0,.PAGE)
 S HDR=1
 Q
 ;
 ;
WRLN(TXT,TAB,PAGE,KWN) ;Write a line of text
 ;See ^DIKCP for documentation
 N X
 S PAGE(U)=""
 ;
 ;Do paging, if necessary
 I $D(PAGE("H"))#2,$G(IOSL,24)-2-$G(PAGE("B"))-$G(KWN)'>$Y D  Q:PAGE(U)
 . I PAGE("H")?1"W ".E X PAGE("H") Q
 . I $E($G(IOST,"C"))="C" D  Q:PAGE(U)
 .. W $C(7) R X:$G(DTIME,300) I X=U!'$T S PAGE(U)=1
 . W @$G(IOF,"#"),PAGE("H")
 ;
 ;Write text
 W !?$G(TAB),$TR($G(TXT),$C(0)," ")
 Q

DIKCR
DIKCR ;SFISC/MKO-API TO CREATE A NEW-STYLE XREF ;9:55 AM  1 Nov 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CREIXN(DIKCXREF,DIFLG,DIXR,DIKCOUT,DIKCMSG) ;Create a new-style index
 ;DIFLG:
 ; e : Throw away Dialog errors
 ; r : Don't recompile templates, xrefs
 ; W : Write messages to the current device
 ; S : Execute set logic of new xref
 ;
CREIXNX ;Entry point from DDMOD
 N DIKCDEL,DIKCXR,DIKCDMSG,DIKCERR,X,Y
 ;
 ;Init
 S DIFLG=$G(DIFLG)
 I DIFLG["e" S DIKCMSG="DIKCDMSG" N DIERR
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIKCDEL=$G(DIKCXREF("NAME"))]""
 M DIKCXR=DIKCXREF
 ;
 ;Check input, set defaults
 D CHK(.DIKCXR,.DIKCERR) G:DIKCERR EXIT
 D CHKVAL(.DIKCXR,.DIKCERR) G:DIKCERR EXIT
 ;
 ;Delete the old index of the same name
 D:DIKCDEL
 . N DIKCFLAG,DIERR,DIKCDMSG
 . S DIKCFLAG="d"_$E("W",DIFLG["W")_$E("K",DIFLG'["k")
 . D DELIXN^DDMOD(DIKCXR("FILE"),DIKCXR("NAME"),DIKCFLAG,"","DIKCDMSG")
 ;
 ;Create the index
 D UPDATE(.DIKCXR,.DIXR,DIFLG) I DIXR="" S DIKCERR=1 G EXIT
 ;
 ;Execute set logic
 D:DIFLG["S" SET(DIXR,DIFLG)
 ;
 ;Recompile templates and xrefs
 D:DIFLG'["r" RECOMP(DIXR,DIFLG)
 ;
EXIT ;Write and move error messages if necessary
 I $G(DIERR) D
 . D:DIFLG["W" MSG^DIALOG("WES")
 . D:$G(DIKCMSG)]"" CALLOUT^DIEFU(DIKCMSG)
 I $G(DIKCERR) S DIXR=""
 E  S DIXR=DIXR_U_DIKCXR("NAME")
 Q
 ;
UPDATE(DIKCXR,DIXR,DIFLG) ;Call Updater to create index, return DIXR=ien
 N DIKCFDA,DIKCIEN,IENS,ORD,R,SEQ,X
 W:$G(DIFLG)["W" !,"Creating index definition ..."
 ;
 ;Set FDA for top level Index file fields
 S DIKCFDA(.11,"+1,",.01)=DIKCXR("FILE")
 S DIKCFDA(.11,"+1,",.02)=DIKCXR("NAME")
 S DIKCFDA(.11,"+1,",.11)=DIKCXR("SHORT DESCR")
 S DIKCFDA(.11,"+1,",.2)=DIKCXR("TYPE")
 S DIKCFDA(.11,"+1,",.4)=DIKCXR("EXECUTION")
 S DIKCFDA(.11,"+1,",.41)=DIKCXR("ACTIVITY")
 S DIKCFDA(.11,"+1,",.42)=DIKCXR("USE")
 S DIKCFDA(.11,"+1,",.5)=DIKCXR("ROOT TYPE")
 S DIKCFDA(.11,"+1,",.51)=DIKCXR("ROOT FILE")
 S DIKCFDA(.11,"+1,",1.1)=$S($G(DIKCXR("SET"))]"":DIKCXR("SET"),1:"Q")
 S DIKCFDA(.11,"+1,",2.1)=$S($G(DIKCXR("KILL"))]"":DIKCXR("KILL"),1:"Q")
 S:$G(DIKCXR("SET CONDITION"))]"" DIKCFDA(.11,"+1,",1.4)=DIKCXR("SET CONDITION")
 S:$G(DIKCXR("KILL CONDITION"))]"" DIKCFDA(.11,"+1,",2.4)=DIKCXR("KILL CONDITION")
 S:$G(DIKCXR("WHOLE KILL"))]"" DIKCFDA(.11,"+1,",2.5)=DIKCXR("WHOLE KILL")
 ;
 ;Set FDA for Values multiple
 S ORD=0 F SEQ=2:1 S ORD=$O(DIKCXR("VAL",ORD)) Q:'ORD  D
 . S IENS="+"_SEQ_",+1,"
 . S R=$NA(DIKCXR("VAL",ORD))
 . S DIKCFDA(.114,IENS,.01)=ORD
 . S DIKCFDA(.114,IENS,1)=@R@("TYPE")
 . ;
 . I @R@("TYPE")="C" S DIKCFDA(.114,IENS,4.5)=@R
 . E  D
 .. S DIKCFDA(.114,IENS,2)=DIKCXR("ROOT FILE")
 .. S DIKCFDA(.114,IENS,3)=@R
 .. S X=$G(@R@("XFORM FOR STORAGE")) S:X]"" DIKCFDA(.114,IENS,5)=X
 .. S X=$G(@R@("XFORM FOR LOOKUP")) S:X]"" DIKCFDA(.114,IENS,5.3)=X
 .. S X=$G(@R@("XFORM FOR DISPLAY")) S:X]"" DIKCFDA(.114,IENS,5.5)=X
 . ;
 . S X=$G(@R@("SUBSCRIPT")) S:X]"" DIKCFDA(.114,IENS,.5)=X
 . S X=$G(@R@("LENGTH")) S:X]"" DIKCFDA(.114,IENS,6)=X
 . S X=$G(@R@("COLLATION")) S:X]"" DIKCFDA(.114,IENS,7)=X
 . S X=$G(@R@("LOOKUP PROMPT")) S:X]"" DIKCFDA(.114,IENS,8)=X
 ;
 ;Call Updater
 D UPDATE^DIE("E","DIKCFDA","DIKCIEN")
 K DIXR I $G(DIERR) S DIXR="" Q
 S DIXR=DIKCIEN(1)
 ;
 ;Add Description
 D:$O(DIKCXR("DESCR",0)) WP^DIE(.11,DIXR_",",.1,"",$NA(DIKCXR("DESCR")))
 Q
 ;
RECOMP(DIXR,DIFLG) ;Recompile templates and xrefs, update triggering fields
 N DIKCFLIS,DIKCI,DIKCTLIS,DIKCTOP,DIKTEML
 ;
 ;Get top level file number
 S DIKCTOP=$$FNO^DILIBF($P($G(^DD("IX",DIXR,0)),U)) Q:'DIKCTOP
 ;
 ;Get list of fields in xref
 D GETFLIST^DIKCUTL(DIXR,.DIKCFLIS) Q:'$D(DIKCFLIS)
 ;
 ;Recompile input templates and xrefs
 D DIEZ^DIKD2(.DIKCFLIS,DIFLG,$G(DIKCOUT))
 D DIKZ^DIKD(DIKCTOP,DIFLG,$G(DIKCOUT)) S DIKCTOP(DIKCTOP)=""
 ;
 ;Also update triggering fields, and their compiled templates and xrefs
 D TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
 I $D(DIKCTLIS) D
 . D DIEZ^DIKD2(.DIKCTLIS,DIFLG,$G(DIKCOUT))
 . S DIKCI=0 F  S DIKCI=$O(DIKCTLIS(DIKCI)) Q:'DIKCI  D
 .. S DIKCTOP=+$$FNO^DILIBF(DIKCI) Q:$D(DIKCTOP(DIKCTOP))#2!'DIKCTOP
 .. S DIKCTOP(DIKCTOP)=""
 .. D DIKZ^DIKD(DIKCTOP,DIFLG,$G(DIKCOUT))
 Q
 ;
CHK(DIKCXR,DIKCERR) ;Check/default input array
 N FIL,NAM,RFIL,TYP,USE
 S DIKCERR=0
 ;
 ;Check FILE
 S FIL=$G(DIKCXR("FILE")) I 'FIL D ER202("FILE") Q
 I '$$VFNUM^DIKCU1(FIL,"D") S DIKCERR=1 Q
 ;
 ;Check Type, get internal form
 S TYP=$G(DIKCXR("TYPE")) I TYP="" D ER202("TYPE") Q
 D CHK^DIE(.11,.2,"",TYP,.TYP) I TYP=U S DIKCERR=1 Q
 S DIKCXR("TYPE")=TYP
 ;
 ;Check USE, get internal form.
 S USE=$G(DIKCXR("USE"))
 I USE]"" D CHK^DIE(.11,.42,"",USE,.USE) I USE=U S DIKCERR=1 Q
 S DIKCXR("USE")=USE
 ;
 S NAM=$G(DIKCXR("NAME"))
 S RFIL=$G(DIKCXR("ROOT FILE"))
 ;
 ;Check Root File, set Root Type
 S:'RFIL (RFIL,DIKCXR("ROOT FILE"))=FIL
 I FIL=RFIL S DIKCXR("ROOT TYPE")="I"
 E  D  Q:DIKCERR
 . I $$FLEVDIFF^DIKCU(FIL,RFIL)="" D ER202("ROOT FILE") Q
 . I '$$VFNUM^DIKCU1(RFIL,"D") S DIKCERR=1 Q
 . S DIKCXR("ROOT TYPE")="W"
 ;
 ;Check USE, NAME, TYPE
 I NAM="",USE="" D ER202("NAME/USE") Q
 I $E(NAM)="A",USE="LS" D ER202("NAME/USE") Q
 I USE="A",TYP'="MU" D ER202("TYPE/USE") Q
 ;
 ;Default NAM based on USE and FILE
 ; or USE based on NAME and TYPE
 I NAM="" S DIKCXR("NAME")=$$GETNAM(FIL,USE)
 E  I USE="" S DIKCXR("USE")=$S($E(NAM)="A":$S(TYP="MU":"A",1:"S"),1:"LS")
 ;
 ;Check SHORT DESCRIPTION'=null', if null set default Activity
 I $G(DIKCXR("SHORT DESCR"))="" D ER202("SHORT DESCR") Q
 S:$D(DIKCXR("ACTIVITY"))[0 DIKCXR("ACTIVITY")="IR"
 Q
 ;
CHKVAL(DIKCXR,DIKCERR) ;Check values, build logic for regular indexes
 N CNT,FCNT,FIL,KILL,L,LEV,LDIF,MAXL,NAM,ORD,RFIL,ROOT,SBSC,SEQ,SET,TYP,VAL,WKIL
 ;
 S FIL=DIKCXR("FILE")
 S NAM=DIKCXR("NAME")
 S RFIL=DIKCXR("ROOT FILE")
 S TYP=DIKCXR("TYPE")
 S DIKCERR=0
 ;
 ;Begin building logic for regular indexes
 I TYP="R" D  Q:DIKCERR
 . I FIL'=RFIL S LDIF=$$FLEVDIFF^DIKCU(FIL,RFIL)
 . E  S LDIF=0
 . S ROOT=$$FROOTDA^DIKCU(FIL,LDIF_"O",.LEV)_""""_NAM_""""
 . I $D(DIERR) S DIKCERR=1 Q
 . S WKIL="K "_ROOT_")"
 ;
 ;Build list of subscripts, count #values and #fields
 S ORD=0 F  S ORD=$O(DIKCXR("VAL",ORD)) Q:'ORD  D  Q:DIKCERR
 . I $G(DIKCXR("VAL",ORD))="" K DIKCXR("VAL",ORD) Q
 . S CNT=$G(CNT)+1
 . ;
 . ;Get type of value; if field, increment field count
 . I DIKCXR("VAL",ORD) S DIKCXR("VAL",ORD,"TYPE")="F",FCNT=$G(FCNT)+1
 . E  S DIKCXR("VAL",ORD,"TYPE")="C"
 . ;
 . ;Set subscript array; error if duplicate subscript #
 . S SBSC=$G(DIKCXR("VAL",ORD,"SUBSCRIPT")) Q:'SBSC
 . I $D(SBSC(SBSC))#2 D ER202("SUBSCRIPT") Q
 . S SBSC(SBSC)=ORD_U_$G(DIKCXR("VAL",ORD,"LENGTH"))
 . ;
 . ;Set default collation
 . S:$G(DIKCXR("VAL",ORD,"COLLATION"))="" DIKCXR("VAL",ORD,"COLLATION")="F"
 Q:DIKCERR
 ;
 S SBSC=0 F SEQ=1:1 S SBSC=$O(SBSC(SBSC)) Q:'SBSC  D  Q:DIKCERR
 . ;Check that subscripts are consecutive from 1
 . I SEQ'=SBSC D ER202("SUBSCRIPTS") Q
 . Q:TYP="MU"
 . ;
 . ;Continue building logic for regular indexes
 . S ORD=$P(SBSC(SBSC),U),MAXL=$P(SBSC(SBSC),U,2)
 . I $G(CNT)=1 S VAL=$S(MAXL:"$E(X,1,"_MAXL_")",1:"X")
 . E  S VAL=$S(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
 . S ROOT=ROOT_","_VAL
 ;
 ;If null, default Execution based on #fields
 S:$G(DIKCXR("EXECUTION"))="" DIKCXR("EXECUTION")=$S($G(FCNT)>1:"R",1:"F")
 ;
 ;We're done for MUMPS xrefs
 Q:TYP="MU"
 ;
 ;Continue building logic for regular indexes
 F L=LDIF:-1:1 S ROOT=ROOT_",DA("_L_")"
 S ROOT=ROOT_",DA)"
 ;
 I '$O(SBSC(0)) S (SET,KILL)="Q",WKIL=""
 E  S SET="S "_ROOT_"=""""",KILL="K "_ROOT
 S DIKCXR("SET")=SET
 S DIKCXR("KILL")=KILL
 S DIKCXR("WHOLE KILL")=WKIL
 Q
 ;
GETNAM(F01,USE) ;Get next available index name
 N ASC,STRT,NAME,I
 S STRT=$S(USE="LS":"",1:"A")
 F ASC=67:1:89 D  Q:NAME]""
 . S NAME=STRT_$C(ASC)
 . I $D(^DD("IX","BB",F01,NAME)) S NAME="" Q
 . I $D(^DD(F01,0,"IX",NAME)) S NAME="" Q
 Q:NAME]"" NAME
 ;
 F I=1:1 D  Q:NAME]""
 . S NAME=STRT_"C"_I
 . I $D(^DD("IX","BB",F01,NAME)) S NAME="" Q
 . I $D(^DD(F01,0,"IX",NAME)) S NAME="" Q
 Q NAME
 ;
SET(DIXR,DIFLG) ;Execute set logic
 N DIKCRFIL,DIKCTOP,DIKCTRL,DIKCTYP
 ;
 S DIKCTOP=$$FNO^DILIBF($P($G(^DD("IX",DIXR,0)),U)) Q:'DIKCTOP
 S DIKCRFIL=$P($G(^DD("IX",DIXR,0)),U,9) Q:'DIKCRFIL
 S DIKCTYP=$P($G(^DD("IX",DIXR,0)),U,4)
 ;
 I $G(DIFLG)["W" D
 . I DIKCTYP="R" W !,"Building index ..."
 . E  W !,"Executing set logic ..."
 ;
 ;Call INDEX^DIKC to execute the set logic
 S DIKCTRL="S"_$S(DIKCTOP'=DIKCRFIL:"W"_DIKCRFIL,1:"")
 D INDEX^DIKC(DIKCTOP,"","",DIXR,.DIKCTRL)
 Q
 ;
ER202(DIKCP1) ;;The input variable or parameter that identifies the |1| is missing or invalid.
 D ERR^DIKCU2(202,"","","",DIKCP1)
 S DIKCERR=1
 Q

DIKCU
DIKCU ;SFISC/MKO-LIBRARY OF GENERIC MODULES ;9:29 AM  22 Oct 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;===============
 ; PUSHDA(.DA,N)
 ;===============
 ;Push down the DA array, N times
 ;
PUSHDA(DA,N) ;
 N I
 S:'$G(N) N=1
 F I=+$O(DA(""),-1):-1:1 S DA(I+N)=$G(DA(I))
 S DA(N)=$G(DA)
 S DA=0 F I=N-1:-1:1 S DA(I)=0
 Q
 ;
 ;==============
 ; POPDA(.DA,N)
 ;==============
 ;Pop the DA array
 ;
POPDA(DA,N) ;
 N I,L
 S:'$G(N) N=1
 S L=+$O(DA(""),-1)
 S DA=$G(DA(N))
 F I=N+1:1:L S DA(I-N)=$G(DA(I))
 F I=L-N+1:1:L K DA(I)
 Q
 ;
 ;=================
 ; $$IENS(File,DA)
 ;=================
 ;Return IENS given file# and DA array
 ;In:
 ; FIL = File or subfile #
 ; DA  = DA array (any unneeded elements in the DA array are ignored)
 ;
IENS(FIL,DA) ;
 N LEV,I,IENS,ERR
 Q:$G(FIL)="" ""
 S LEV=$$FLEV(FIL) Q:LEV="" ""
 ;
 ;Build IENS
 S IENS=$G(DA)_","
 F I=1:1:LEV S IENS=IENS_$G(DA(I))_","
 Q IENS
 ;
 ;=========================
 ; $$FNUM(Root,Flag)
 ;=========================
 ;Given file root, return File # from 2nd piece of header node.
 ;Also check that that file has a DD entry and a non-wp .01 field.
 ;Return null if error.
 ;In:
 ;  ROOT = file root
 ;  F    [ D : generate dialog
 ;
FNUM(ROOT,F) ;
 Q:$G(ROOT)="" ""
 N FIL
 S ROOT=$$CREF(ROOT)
 I $D(@ROOT@(0))[0 D:$G(F)["D" ERR^DIKCU2(404,"","","",ROOT) Q ""
 S FIL=+$P(@ROOT@(0),U,2)
 I '$$VFNUM^DIKCU1(FIL,$G(F)) Q ""
 Q FIL
 ;
 ;===============================
 ; $$FROOTDA(File,Flag,.L,.TRoot
 ;===============================
 ;Return global root of File; may include DA(1), DA(2), ... for subfiles
 ;Examples: ^DIZ(9999) and ^DIZ(9999,DA(1),"MULT1")
 ;In:
 ;  FIL  = file #
 ;  FLAG [ O : return open root
 ;       [ D : generate dialog
 ;       starts with number : indicates offset to use for DA array
 ;Out:
 ; .L     = level of file
 ; .TROOT = top level root
 ;
FROOTDA(FIL,F,L,TROOT) ;
 I $G(FIL)="" S (L,TROOT)="" Q ""
 S F=$G(F)
 ;
 ;If top level, return "GL"
 I $D(^DIC(FIL,0,"GL"))#2 D  Q TROOT
 . S L=0,TROOT=$S(F["O":^("GL"),1:$$CREF(^("GL")))
 ;
 ;Must be a subfile level, get mult nodes, and level
 N ERR,I,MFLD,ND,PAR,ROOT,SUB
 S SUB=FIL
 F L=0:1 S PAR=$G(^DD(SUB,0,"UP")) Q:'PAR  D  Q:$G(ERR)
 . S MFLD=$O(^DD(PAR,"SB",SUB,""))
 . S ND=$P($P($G(^DD(PAR,MFLD,0)),U,4),";")
 . I ND?." " S ERR=1 D:F["D" ERR^DIKCU2(502,PAR,"",MFLD) Q
 . S:ND'=+$P(ND,"E") ND=""""_ND_""""
 . S ND(L+1)=ND
 . S SUB=PAR
 I $G(ERR) S (L,TROOT)="" Q ""
 ;
 ;Build global root for subfile
 S (ROOT,TROOT)=$G(^DIC(SUB,0,"GL"))
 I ROOT="" D:F["D" ERR^DIKCU2(402,SUB) S L="" Q ""
 ;
 F I=L:-1:1 S ROOT=ROOT_"DA("_(I+F)_"),"_ND(I)_","
 S:F'["O" TROOT=$$CREF(TROOT)
 Q $S(F["O":ROOT,1:$$CREF(ROOT))
 ;
CREF(X) ;Return closed root of X
 N F,L
 S L=$E(X,$L(X)),F=$E(X,1,$L(X)-1)
 Q $S(L="(":F,L=",":F_")",1:X)
 ;
 ;================
 ; $$FLEV(File,F)
 ;================
 ;Return the level of File
 ;In:
 ; FIL = file#
 ; F   [ "D" : generate Dialog
 ;
FLEV(FIL,F) ;
 Q:$G(FIL)="" ""
 ;
 N LEV
 F LEV=0:1 Q:$G(^DD(FIL,0,"UP"))=""  S FIL=^("UP")
 I '$D(^DD(FIL)) D:$G(F)["D" ERR^DIKCU2(402,FIL) Q ""
 Q LEV
 ;
 ;=========================
 ; $$FLEVDIFF(File1,File2)
 ;=========================
 ;Find the difference in levels between File1 and File2.
 ;File1 is an ancestor of File2.
 ;In:
 ; FIL1 = File or subfile # of ancestor
 ; FIL2 = File or subfile #
 ;Returns: level difference; null if invalid input
 ;
FLEVDIFF(FIL1,FIL2) ;
 Q:$G(FIL1)=""!($G(FIL2)="") ""
 ;
 N DIFF,FIL
 S FIL=FIL2
 F DIFF=0:1 Q:FIL=FIL1  S FIL=$G(^DD(FIL,0,"UP")) Q:FIL=""
 Q $S(FIL=FIL1:DIFF,1:"")
 ;
 ;===============================================
 ; SUBFILES(File,.Subfile#Array,.NodeArray,Flag)
 ;===============================================
 ;Build list of subfiles
 ;In:
 ;  FIL = file #
 ;  FLG = 1 (if wp subfiles should be returned)
 ;Out:
 ; .SB(subfile#)           = parentFile#
 ; .MF(file#,multField#)   = node
 ; .MF(file#,multField#,0) = subfile#
 ;
SUBFILES(FIL,SB,MF,FLG) ;
 Q:$G(FIL)=""
 N SUB,MUL,ND
 ;
 ;Loop through "SB" nodes
 S SUB="" F  S SUB=$O(^DD(FIL,"SB",SUB)) Q:'SUB  D
 . S MUL=$O(^DD(FIL,"SB",SUB,0)) Q:'MUL
 . Q:$D(^DD(SUB,.01,0))[0  Q:$P(^(0),U,2)["W"&'$G(FLG)
 . ;
 . S ND=$P($P(^DD(FIL,MUL,0),U,4),";") Q:ND=""
 . S SB(SUB)=FIL,MF(FIL,MUL)=ND,MF(FIL,MUL,0)=SUB
 . ;
 . ;Make a recursive call to get all subfiles under file SUB
 . D SUBFILES(SUB,.SB,.MF,$G(FLG))
 Q
 ;
 ;============================
 ; SBINFO(Subfile,.NodeArray)
 ;============================
 ;Get info for Subfile
 ;In:
 ;  SUB = subfile #
 ;Out:
 ; .MF(file#,multField#)   = node
 ; .MF(file#,multField#,0) = subfile#
 ;
SBINFO(SUB,MF) ;
 N ERR,MUL,ND,PAR
 F  S PAR=$G(^DD(SUB,0,"UP")) Q:'PAR  D  Q:$G(ERR)
 . S MUL=$O(^DD(PAR,"SB",SUB,0)) I 'MUL S ERR=1 Q
 . S ND=$P($P(^DD(PAR,MUL,0),U,4),";") I ND="" S ERR=1 Q
 . S MF(PAR,MUL)=ND,MF(PAR,MUL,0)=SUB,SUB=PAR
 Q
 ;
 ;============================
 ; SELFILE(Root,TopFile,File)
 ;============================
 ;Prompt for file/subfile
 ;Out:
 ; .ROOT = open root of top level file
 ; .TOP  = top level file #
 ; .FILE = (sub)file #
 ;
SELFILE(ROOT,TOP,FILE) ;
 N %,C,D,DA,DDA,DI,DIAC,DIC,DICS,DIFILE,X,Y
 S (ROOT,TOP,FILE)=""
 D D^DICRW Q:Y<0
 ;
 ;Check if this is a new file
 I '$D(DIC) D  Q:'$D(DIC)
 . N DG,DIE,DIK,DLAYGO,F,Z
 . D DIE^DIB
 . S:$D(DG) DIC=DG
 ;
 ;Check that file exists
 S DI=+$P($G(@(DIC_"0)")),U,2)
 I 'DI W $C(7),!,$$EZBLD^DIALOG(410,DIC_"0)"),! Q
 ;
 ;Get subfile, root, and top
 S FILE=$$SUB^DIKCU(DI) Q:FILE=""
 S ROOT=DIC,TOP=DI
 Q
 ;
 ;==============
 ; $$SUB(File#)
 ;==============
 ;Prompt for subfiles under file
 ;Returns: file or subfile #
 ;         null : if user ^-out
 ;
SUB(FIL) ;
 N D,DIC,DTOUT,DUOUT,QUIT,X,Y
 ;
 S DIC(0)="QEAI"
 S DIC("A")="Select Subfile: "
 S DIC("S")="N % S %=+$P(^(0),U,2) I %,$P($G(^DD(%,.01,0)),U,2)'[""W"""
 ;
 F  Q:$O(^DD(+$G(FIL),"SB",0))'>0!$D(QUIT)  D
 . S DIC="^DD("_FIL_","
 . D ^DIC
 . I X="" S QUIT=1 Q
 . I Y=-1 S QUIT=1 S FIL="" Q
 . S FIL=+$P(^DD(FIL,+Y,0),U,2)
 . W "  (Subfile #"_FIL_")"
 Q FIL
 ;
 ;#401  File #|FILE| does not exist.
 ;#402  The global root of file #|FILE| is missing or not valid.
 ;#404  The File Header node of the file stored at |1| lacks a file number.
 ;#410  Missing or incomplete global node |1|.
 ;#502  Field# |FIELD| in file# |FILE| has a corrupted definition.

DIKCU1
DIKCU1 ;SFISC/MKO-FILE/RECORD INFO ;11:21 AM  20 Aug 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;===================
 ; $$VDA([.]DA,Flag)
 ;===================
 ;Make sure elements DA array are positive canonic numbers.
 ;In:
 ; [.]DA = DA array
 ; F   [ R : DA can't be 0 or null
 ;     [ D : generate Dialog
 ;Returns: 1 if valid; 0 if invalid
 ;
VDA(DA,F) ;
 N I,ERR
 Q:$D(DA)[0 0
 I $G(F)["R" D:0[DA
 . S ERR=1 D:$G(F)["D" ERR^DIKCU2(202,"","","","RECORD")
 I DA]"",DA<0!(DA'=+$P(DA,"E")) D
 . S ERR=1 D:$G(F)["D" ERR^DIKCU2(202,"","","","RECORD")
 E  F I=1:1 Q:'$D(DA(I))  I DA(I)'>0!(DA(I)'=+$P(DA(I),"E")) D  Q
 . S ERR=1 D:$G(F)["D" ERR^DIKCU2(202,"","","","RECORD")
 Q '$G(ERR)
 ;
 ;====================================
 ; $$VFLAG(InputFlags,GoodFlags,Flag)
 ;====================================
 ;Makes sure Flags contain only Good Flags.
 ;In:
 ; FLAG   = flags
 ; GDFLAG = good flags
 ; F      [ D : generate Dialog
 ;Returns: 1 if valid; 0 if invalid
 ;
VFLAG(FLAG,GDFLAG,F) ;
 S FLAG=$G(FLAG)
 I $TR($G(FLAG),$G(GDFLAG),"")'?.NP D  Q 0
 . D:$G(F)["D" ERR^DIKCU2(301,"","","",FLAG)
 Q 1
 ;
 ;=====================
 ; $$VFNUM(File#,Flag)
 ;=====================
 ;Check that File# exists and has a non-wp .01 field
 ;In:
 ; FIL = File or subfile #
 ; F   [ D : generate Dialog
 ;Returns: 1 if valid; 0 if invalid
 ;
VFNUM(FIL,F) ;
 Q:$G(FIL)="" 0
 I '$D(^DD(FIL)) D:$G(F)["D" ERR^DIKCU2(401,FIL) Q 0
 I $P($G(^DD(FIL,.01,0)),U,2)="" D:$G(F)["D" ERR^DIKCU2(406,FIL) Q 0
 I $P(^DD(FIL,.01,0),U,2)["W" D:$G(F)["D" ERR^DIKCU2(407,FIL) Q 0
 Q 1
 ;
 ;===========================
 ; $$VFLD(File#,Field#,Flag)
 ;===========================
 ;Check that the Fil/Fld exists in the ^DD
 ;In:
 ; FIL = File or subfile #
 ; FLD = Field #
 ; F   [ D : generate Dialog
 ;Returns: 1 if valid; 0 if invalid
 ;
VFLD(FIL,FLD,F) ;
 Q:$G(FIL)="" 0  Q:$G(FLD)="" 0
 I '$D(^DD(FIL,FLD)) D:$G(F)["D" ERR^DIKCU2(501,FIL,"",FLD,FLD) Q 0
 Q 1
 ;
 ;================================================
 ; FRNAME(File#,[.]Rec,FileText,RecordTxt,.Level)
 ;================================================
 ;Return string that identifies (sub)file and (sub)record.
 ;In:
 ;  FIL  = File or subfile #
 ; .REC  = DA array
 ;Out:
 ; .FTXT = Text that identifies file
 ; .RTXT = Text that identifies record
 ; .LEV  = Level
 ;
FRNAME(FIL,REC,FTXT,RTXT,LEV) ;
 K FTXT,RTXT,LEV
 Q:'$G(FIL)  Q:'$D(REC)
 N FINFO
 D FINFO(FIL,.FINFO) Q:'$D(FINFO)
 D FILENAME("",.FTXT,.FINFO)
 D RECNAME("",REC,.RTXT,.FINFO)
 S LEV=FINFO
 Q
 ;
 ;=================================
 ; FILENAME(File#,.NameArr,.FINFO)
 ;=================================
 ;Get text that identifies the (sub)file
 ;In:
 ;  FIL   = File or subfile #
 ;In/Out:
 ; .FINFO = File info array (optional) (see FINFO below)
 ;Out:
 ;  N     = Text (undefined if error)
 ;  N(n)  = Overflow text
 ;
FILENAME(FIL,N,FINFO) ;
 K N
 I '$D(FINFO) Q:'$G(FIL)  D FINFO(FIL,.FINFO) Q:'$D(FINFO)
 N I,L,T
 ;
 S L=FINFO,N=0,N(0)=""
 F I=L:-1:0 D
 . I I S T=$P(FINFO(I),U,3)_" (#"_$P(FINFO(I),U)_"), subfield #"_$P(FINFO(I),U,2)_" of "
 . E  S T=$S(L:"the ",1:"")_$P(FINFO(I),U,3)_" File (#"_$P(FINFO(I),U)_")"
 . I $L(N(N))+$L(T)>240 S N=N+1,N(N)=""
 . S N(N)=N(N)_T
 S N=N(0) K N(0)
 Q
 ;
 ;========================================
 ; RECNAME(File#,.Record,.NameArr,.FINFO)
 ;========================================
 ;Get text that identifies the (sub)recird
 ;In:
 ;    FIL = File or subfile #
 ; [.]REC = DA array or IENS
 ;In/Out:
 ; .FINFO = File info array (optional) (see FINFO below)
 ;Out:
 ;  NA    = Text (undefined if error)
 ;  NA(n) = Overflow text
 ;
RECNAME(FIL,REC,NA,FINFO) ;Return string that identifies the (sub)record
 K NA
 Q:'$G(REC)
 I '$D(FINFO) Q:'$G(FIL)  D FINFO(FIL,.FINFO) Q:'$D(FINFO)
 ;
 N DA,DIERR,ERR,J,LV,LVI,MSG,NDA,ROOT,TX,V01
 ;
 ;Set DA array
 I REC'["," M DA=REC
 E  D DA^DILF(REC,.DA)
 ;
 S LV=FINFO,NA=0,NA(0)=""
 F LVI=LV:-1:0 D  Q:$G(ERR)
 . I LVI,$G(DA(LVI))'>0 S ERR=1 Q
 . I 'LVI,$G(DA)'>0 S ERR=1 Q
 . ;
 . I '$D(DDS) D  Q:$G(ERR)
 .. S ROOT=$P(FINFO(LVI),U,4,999)
 .. S V01=$P($G(@ROOT@(0)),U) I V01="" S ERR=1 Q
 .. S TX=$$EXTERNAL^DILFD($P(FINFO(LVI),U),.01,"",V01,"MSG")
 .. I $G(DIERR) S TX=V01 K MSG,DIERR
 . ;
 . E  D
 .. F J=LVI:-1:1 S NDA(J)=DA(J+LV-LVI)
 .. S NDA=$S(LVI=LV:DA,1:DA(LV-LVI))
 .. S TX=$$GET^DDSVAL($P(FINFO(LVI),U),.NDA,.01,"","E") K NDA
 . ;
 . I LV-LVI S TX="'"_TX_"' (#"_DA(LV-LVI)_")"
 . E  S TX="'"_TX_"' (#"_DA_")"
 . I LVI S TX=TX_" of "
 . I $L(NA(NA))+$L(TX)>240 S NA=NA+1,NA(NA)=""
 . S NA(NA)=NA(NA)_TX
 ;
 I $G(ERR) K NA Q
 S NA=NA(0) K NA(0)
 Q
 ;
 ;========================
 ; FINFO(File#,.FileInfo)
 ;========================
 ;Get (sub)file info
 ;In:
 ; FIL = File or subfile #
 ;Out:
 ; FINFO    = n (level)
 ; FINFO(0) = file#^^fileName^fileRootw/DA
 ; FINFO(n) = subfile#^mfield#^mfieldName^^subfileRootw/DA
 ;Example:
 ; FINFO    = 3
 ; FINFO(0) = 1000^^My File^^DIZ(1000,DA(3))
 ; FINFO(1) = 1000.01^100^Mult1^^DIZ(1000,DA(3),10,DA(2))
 ; FINFO(2) = 1000.02^200^Mult2^^DIZ(1000,DA(3),10,DA(2),20,DA(1))
 ; FINFO(3) = 1000.03^300^Mult3^^DIZ(1000,DA(3),10,DA(2),20,DA(1),30,DA)
 ;
FINFO(FIL,FINFO) ;
 Q:'$G(FIL)
 K FINFO
 ;
 ;If top level, set FINFO and quit
 I $D(^DIC(FIL,0,"GL"))#2 D  Q
 . S FINFO=0,FINFO(0)=FIL_U_U_$P(^DIC(FIL,0),U)_U_^DIC(FIL,0,"GL")_"DA)"
 ;
 ;Must be a subfile level, get mult nodes, and level
 N A,ERR,I,L,MFLD,ND,PAR,ROOT,SUB
 S SUB=FIL
 F L=0:1 S PAR=$G(^DD(SUB,0,"UP")) Q:'PAR  D  Q:$G(ERR)
 . S MFLD=$O(^DD(PAR,"SB",SUB,"")) I 'MFLD S ERR=1 Q
 . I $D(^DD(PAR,MFLD,0))[0 S ERR=1 Q
 . S FINFO(L)=SUB_U_MFLD_U_$P(^DD(PAR,MFLD,0),U)
 . ;
 . S ND=$P($P(^DD(PAR,MFLD,0),U,4),";")
 . S:ND'=+$P(ND,"E") ND=""""_ND_""""
 . S ND(L+1)=ND
 . S SUB=PAR
 I $G(ERR) K FINFO,L Q
 S FIL=SUB
 I $D(^DIC(FIL,0))[0 K FINFO,L Q
 S FINFO(L)=FIL_U_U_$P(^DIC(FIL,0),U)
 ;
 ;Build global roots
 S ROOT=$G(^DIC(FIL,0,"GL")) I ROOT="" K FINFO,L Q
 F I=L:-1:1 D
 . S ROOT=ROOT_"DA("_I_")"
 . S FINFO(I)=FINFO(I)_U_ROOT_")"
 . S ROOT=ROOT_","_ND(I)_","
 S FINFO(0)=FINFO(0)_U_ROOT_"DA)"
 S FINFO=L
 ;
 ;Invert the FINFO array
 K A M A=FINFO K FINFO S FINFO=A F A=0:1:FINFO S FINFO(A)=A(FINFO-A)
 Q
 ;
 ;#202  The input parameter that identifies the |1| is missing or invalid.
 ;#301  The passed flag(s) '|1|' are unknown or inconsistent.
 ;#401  File #|FILE| does not exist.
 ;#406  File #|FILE| has no .01 field definition.
 ;#407  A word-processing field is not a file.
 ;#501  File #|FILE| does not contain a field |1|.

DIKCU2
DIKCU2 ;SFISC/MKO-ARRAY COMPARE, TEXT MANIPULATION ;2:40 PM  28 Jan 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;===============================
 ; $$GCMP(ArrayName1,ArrayName2)
 ;===============================
 ;Compare the contents of two arrays
 ;In:
 ; DIKCU2A0 = Name of array 1
 ; DIKCU2B0 = Name of array 2
 ;Returns: 1 if equal, 0 if unequal
 ;
GCMP(DIKCU2A0,DIKCU2B0) ;
 N DIKCU2A,DIKCU2B,DIKCU2DA,DIKCU2DB,DIKCU2E
 S DIKCU2A=$G(DIKCU2A0),DIKCU2B=$G(DIKCU2B0)
 Q:DIKCU2A=""!(DIKCU2B="") 0
 ;
 S DIKCU2DA=$D(@DIKCU2A),DIKCU2DB=$D(@DIKCU2B)
 Q:DIKCU2DA'=DIKCU2DB 0
 I DIKCU2DA=0,DIKCU2DB=0 Q 1
 I DIKCU2DA#2,DIKCU2DB#2,@DIKCU2A'=@DIKCU2B Q 0
 ;
 S DIKCU2E=1
 S DIKCU2A0=$$OREF^DILF(DIKCU2A0),DIKCU2B0=$$OREF^DILF(DIKCU2B0)
 F  S DIKCU2A=$Q(@DIKCU2A),DIKCU2B=$Q(@DIKCU2B) D  Q:'DIKCU2E!(DIKCU2A="")!(DIKCU2B="")
 . I DIKCU2A=""!($P(DIKCU2A,DIKCU2A0)]""),DIKCU2B=""!($P(DIKCU2B,DIKCU2B0)]"") Q
 . I DIKCU2A=""!(DIKCU2B="") S DIKCU2E=0 Q
 . I $P(DIKCU2A,DIKCU2A0,2,999)'=$P(DIKCU2B,DIKCU2B0,2,999) S DIKCU2E=0 Q
 . I @DIKCU2A'=@DIKCU2B S DIKCU2E=0 Q
 Q DIKCU2E
 ;
 ;==================================================
 ; XRINFO(Xref#,.UIR,.LDif,.MaxL,.RFile,.IRoot,.SS)
 ;==================================================
 ;Get info about an index
 ;In:
 ;  XR         = ien of entry in Index file
 ;Out:
 ; .UIR        = Closed root of index w/ X(n)
 ; .LDIF       = Level difference between file and root file
 ; .MAXL(ord#) = maximum length of subscript with this order #
 ; .IROOT      = Closed root of index (up to name)
 ; .RFILE      = Root file #
 ; .SS         = # of field-type subscripts
 ; .SS(ss#)    = file#^field#^maxLen
 ;Example: a whole file xref defined 3 levels down; the xref resides
 ;         on the subfile 2 levels down.
 ;  UIR    = ^DIZ(1000,DA(3),10,DA(2),20,"WF",$E(X(1),1,30),X(2))
 ;  RFILE  = 1000.03
 ;  IROOT  = ^DIZ(1000,DA(3),10,DA(2),20,"WF")
 ;
XRINFO(XR,UIR,LDIF,MAXL,RFILE,IROOT,SS) ;
 K UIR,LDIF,MAXL,SS
 Q:$D(^DD("IX",XR,0))[0
 N CRV,FIL,FILE,FLD,ML,NAME,ORD,TYPE,S
 ;
 S FILE=$P(^DD("IX",XR,0),U),NAME=$P(^(0),U,2),TYPE=$P(^(0),U,8),RFILE=$P(^(0),U,9)
 Q:NAME=""!'FILE!'RFILE
 ;
 I FILE'=RFILE D
 . S LDIF=$$FLEVDIFF^DIKCU(FILE,RFILE) Q:LDIF=""
 . S UIR=$$FROOTDA^DIKCU(FILE,LDIF_"O") Q:UIR=""
 E  D
 . S LDIF=0
 . S UIR=$$FROOTDA^DIKCU(FILE,"O") Q:UIR=""
 Q:$G(UIR)=""
 S UIR=UIR_""""_NAME_"""",IROOT=UIR_")"
 ;
 S S=0 F  S S=$O(^DD("IX",XR,11.1,"AC",S)) Q:'S  S CRV=$O(^(S,0)) D:CRV
 . Q:$D(^DD("IX",XR,11.1,CRV,0))[0  S ORD=$P(^(0),U),FIL=$P(^(0),U,3),FLD=$P(^(0),U,4),ML=$P(^(0),U,5)
 . Q:'ORD
 . I ML S UIR=UIR_",$E(X("_ORD_"),1,"_ML_")",MAXL(ORD)=ML
 . E  S UIR=UIR_",X("_ORD_")"
 . I FIL,FLD S SS=$G(SS)+1,SS(S)=FIL_U_FLD_$S(ML:U_ML,1:"")
 ;
 S UIR=UIR_")"
 Q
 ;
 ;===============================
 ; WRAP(.Text,Width,Width1,Code)
 ;===============================
 ;Wrap the lines in array T
 ;In:
 ; .T    = array of text; 1st line can be in T or T(0)
 ;           subsequent lines are in T(1),...,T(n)
 ;  WID  = maximum length of each line (default = IOM[or 80]-1)
 ;         if < 0 : IOM-1+WID
 ;  WID1 = maximum length of line 1 (optional)
 ;         if ""  : WID
 ;         if < 0 : IOM-1+WID1
 ;  COD  = 1, if lines should NOT wrap on word boundaries
 ;
WRAP(T,WID,WID1,COD) ;Wrap the lines in the T array
 Q:'$D(T)
 N E,J,P,T0,W
 ;
 S WID=$G(WID)\1
 S:WID<1 WID=$G(IOM,80)-1+WID
 S:WID<1 WID=79
 ;
 S W=$S($G(WID1):WID1\1,$G(WID1)=0:$G(IOM,80)-1,1:WID)
 S:W<1 W=$G(IOM,80)-1+W
 S:W<1 W=79
 ;
 I $D(T(0))[0 S T0=1,T(0)=T
 ;
 ;Wrap at word boundaries
 I '$G(COD) F J=0:1 Q:'$D(T(J))  D
 . S:J=1 W=WID
 . S:J T(J)=$$LD(T(J))
 . ;
 . ;Line must be split
 . I $L(T(J))>W D
 .. D DOWNT
 .. F P=$L(T(J)," "):-1:0 Q:$L($P(T(J)," ",1,P))'>W
 .. I 'P S T(J+1)=$E(T(J),W+1,999),T(J)=$E(T(J),1,W)
 .. E  S T(J+1)=$$LD($P(T(J)," ",P+1,999)),T(J)=$$TR($P(T(J)," ",1,P))
 . ;
 . ;Or line must be joined with next
 . E  I $L(T(J))<W D
 .. Q:'$D(T(J+1))
 .. I T(J)]"",T(J)'?.E1" " S T(J)=T(J)_" "
 .. S T(J+1)=$$LD(T(J+1))
 .. ;
 .. F P=1:1:$L(T(J+1)," ")+1 Q:$L(T(J))+$L($P(T(J+1)," ",1,P))>W
 .. S T(J)=$$TR(T(J)_$P(T(J+1)," ",1,P-1))
 .. S T(J+1)=$$LD($P(T(J+1)," ",P,999))
 .. I T(J+1)="" D UPT S J=J-1
 ;
 ;Or wrap to width
 E  F J=0:1 Q:'$D(T(J))  D
 . S:J=1 W=WID
 . ;
 . ;Line must be split
 . I $L(T(J))>W D
 .. D DOWNT
 .. S T(J+1)=$E(T(J),W+1,999)
 .. S T(J)=$E(T(J),1,W)
 . ;
 . ;Or joined with next
 . E  I $L(T(J))<W D
 .. Q:'$D(T(J+1))
 .. S E=W-$L(T(J))
 .. S T(J)=T(J)_$E(T(J+1),1,E)
 .. S T(J+1)=$E(T(J+1),E+1,999)
 .. I T(J+1)="" D UPT S J=J-1
 ;
 I $G(T0) S T=T(0) K T(0)
 Q
 ;
DOWNT ;Push the T array from element J+1 down
 N K
 F K=$O(T(""),-1):-1:J+1 S T(K+1)=T(K)
 S T(J+1)=""
 Q
 ;
UPT ;Pop the T array from element J+1 down
 N K
 F K=J+1:1:$O(T(""),-1)-1 S T(K)=T(K+1)
 K T($O(T(""),-1))
 Q
 ;
TR(X) ;Strip trailing spaces
 Q:$G(X)="" X
 N I
 F I=$L(X):-1:0 Q:$E(X,I)'=" "
 Q $E(X,1,I)
 ;
LD(X) ;Strip leading spaces
 Q:$G(X)="" X
 N I
 F I=1:1:$L(X)+1 Q:$E(X,I)'=" "
 Q $E(X,I,999)
 ;
ERR(ERR,DIFILE,DIIENS,DIFIELD,DI1,DI2,DI3) ;Build an error message
 N P,I,V
 F I="FILE","IENS","FIELD",1,2,3 S V=$G(@("DI"_I)) S:V]"" P(I)=V
 D BLD^DIALOG(ERR,.P,.P)
 Q

DIKCUTL
DIKCUTL ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;26MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
MOD ;Utility option to modify an index
 N DIKCCNT,DIKCFILE,DIKCQUIT,DIKCROOT,DIKCTOP,DIXR
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 ;Prompt for file
 D SELFILE^DIKCU(.DIKCROOT,.DIKCTOP,.DIKCFILE)
 Q:$G(DIKCROOT)=""  Q:'$G(DIKCTOP)
 S:'$G(DIKCFILE) DIKCFILE=DIKCTOP
 ;
REMOD ;Get and list indexes
 I $G(DIKCQUIT) W ! Q
 D GETXR^DIKCUTL2(DIKCFILE,.DIKCCNT)
 W ! D LIST^DIKCUTL2(.DIKCCNT)
 ;
 ;Prompt for action
 I 'DIKCCNT S Y="C"
 E  D RD^DICD I $D(DIRUT) W ! Q
 ;
 ;Delete
 I Y="D" D  G REMOD
 . S DIXR=$$CHOOSE^DIKCUTL2(.DIKCCNT,"delete") Q:'DIXR
NODELETE . I $D(^DD("IX",DIXR,666)) W !?5,$C(7),"This Index cannot be deleted.",! S DIXR=0 Q  ;**GFT
 . I $D(^DD("KEY","AU",DIXR)) W ! D PRTMSG^DIKCUTL2(DIXR) Q
 . S DIR(0)="Y"
 . S DIR("A")="Are you sure you want to delete the index definition"
 . S DIR("B")="NO"
 . D ^DIR K DIR Q:$D(DIRUT)!'Y
 . D DELETE(DIXR,DIKCTOP,DIKCFILE)
 ;
 ;Edit
 I Y="E" D  G REMOD
 . S DIXR=$$CHOOSE^DIKCUTL2(.DIKCCNT,"edit") Q:'DIXR
 . D EDIT(DIXR,DIKCTOP,DIKCFILE)
 ;
 ;Create
 I Y="C" D  G REMOD
 . S DIR(0)="Y",DIR("B")="No"
 . S DIR("A")="Want to create a new index for this file"
 . D ^DIR K DIR I $D(DIRUT)!'Y S:'DIKCCNT DIKCQUIT=1 Q
 . D CREATE^DIKCUTL1(DIKCTOP,DIKCFILE)
 Q
 ;
DELETE(DIXR,DIKCTOP,DIKCFILE) ;Delete an index
 N DA,DIK,DIKCFLIS,DIKCOLD
 D GETFLIST(DIXR,.DIKCFLIS)
 D LOADXREF^DIKC1(DIKCFILE,"","K",DIXR,"","DIKCOLD")
 ;
 ;Delete the index
 S DIK="^DD(""IX"",",DA=DIXR D ^DIK K DIK,DA
 W !!,"  Index definition deleted."
 ;
 ;Run kill logic, recompile
 D KSC^DIKCUTL3(DIKCTOP,.DIKCOLD,"",.DIKCFLIS)
 Q
 ;
EDIT(DIXR,DIKCTOP,DIKCFILE) ;Edit an index
 N DA,DDSCHANG,DDSFILE,DDSPARM,DR
 N DIKCFLIS,DIKCNEW,DIKCOLD,DIKCREB
 ;
 ;Save original fields list and logic
 D GETFLIST(DIXR,.DIKCFLIS)
 D LOADXREF^DIKC1(DIKCFILE,"","KS",DIXR,"","DIKCOLD")
 ;
 ;Invoke form to edit, quit if there were no changes
 S DDSFILE=.11,DA=DIXR,DDSPARM="C"
 S DR="[DIKC EDIT"_$S($D(^DD("KEY","AU",DIXR)):" UI]",1:"]")
 D ^DDS Q:'$G(DDSCHANG)  K DDSFILE,DA,DDSPARM,DR
 ;
 ;If index was deleted, run kill logic, recompile and quit
 I $D(^DD("IX",DIXR,0))[0 D  Q
 . K DIKCOLD(DIKCFILE,DIXR,"S"),DIKCOLD(DIKCFILE,DIXR,"SC")
 . D KSC^DIKCUTL3(DIKCTOP,.DIKCOLD,"",.DIKCFLIS)
 ;
 ;Rebuild the set/kill logic if a crv was deleted,
 ;but form was not saved.
 ;Deleting a crv sets DIKCREB; saving the form, kills it.
 D:$G(DIKCREB) BLDLOG^DIKCUTL2(DIXR)
 ;
 ;Load new logic; quit if equal to old logic
 D LOADXREF^DIKC1(DIKCFILE,"","KS",DIXR,"","DIKCNEW")
 Q:$$GCMP^DIKCU2("DIKCOLD","DIKCNEW")
 ;
 ;Run old kill logic and new set logic.
 ;Add new fields to list, and recompile input templates and xrefs.
 D GETFLIST(DIXR,.DIKCFLIS)
 K DIKCOLD(DIKCFILE,DIXR,"S"),DIKCOLD(DIKCFILE,DIXR,"SC")
 D KSC^DIKCUTL3(DIKCTOP,.DIKCOLD,.DIKCNEW,.DIKCFLIS)
 Q
 ;
 ;============================
 ;GETFLIST(index#,.fieldList)
 ;============================
 ;Loop through Cross Reference Values multiple and
 ;build list of fields used in Index XR. (Existing items in fieldList
 ;array are NOT deleted.)
 ;In:
 ; XR = Index ien
 ;Out:
 ; FLIST(file#,field#) = ""
 ;
GETFLIST(XR,FLIST) ;
 N FIL,FLD,I
 S I=0 F  S I=$O(^DD("IX",XR,11.1,I)) Q:'I  D
 . Q:$P($G(^DD("IX",XR,11.1,I,0)),U,2)'="F"
 . S FIL=$P(^DD("IX",XR,11.1,I,0),U,3),FLD=$P(^(0),U,4) Q:'FIL  Q:'FLD
 . S FLIST(FIL,FLD)=""
 Q

DIKCUTL1
DIKCUTL1 ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;9:10 AM  7 Aug 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CREATE(DIKCTOP,DIKCFILE) ;Create a new index
 N DIKCF01,DIKCFLIS,DIKCNAME,DIKCNEW,DIKCTLIS,DIKCTYPE,DIKCUSE,DIXR
 N DA,DDSFILE,DR
 ;
 ;Get Type, File, Use, and Name
 S DIKCTYPE=$$TYPE Q:DIKCTYPE=-1
 S DIKCF01=$$FILE01(DIKCTOP,DIKCFILE) Q:DIKCF01=-1
 S DIKCUSE=$$USE(DIKCTYPE) Q:DIKCUSE=-1
 S DIKCNAME=$$NAME(DIKCF01,DIKCUSE) Q:DIKCNAME=-1
 ;
 ;Create the new index in the Index file
 D ADD(DIKCF01,DIKCFILE,DIKCNAME,DIKCTYPE,DIKCUSE,.DIXR) Q:DIXR=-1
 ;
 ;Invoke form to edit index, quit if deleted,
 ;delete if no short description
 S DDSFILE=.11,DA=DIXR,DR="[DIKC EDIT]" D ^DDS K DDSFILE,DA,DR
 Q:$D(^DD("IX",DIXR,0))[0
 I $P($G(^DD("IX",DIXR,0)),U,3)="" D  Q
 . N DIK,DA
 . S DIK="^DD(""IX"",",DA=DIXR D ^DIK
 . W !!,"  Index definition deleted."
 ;
 ;Get new fields list and set logic.
 ;Modify the trigger logic of fields that trigger fields in the index
 ;Set new index, recompile input templates and xrefs.
 D GETFLIST^DIKCUTL(DIXR,.DIKCFLIS)
 K DIKCTLIS D TRIG^DICR(.DIKCFLIS,.DIKCTLIS)
 D:$D(DIKCTLIS) DIEZ^DIKCUTL3(" ",.DIKCTLIS)
 D LOADXREF^DIKC1(DIKCFILE,"","S",DIXR,"","DIKCNEW")
 D KSC^DIKCUTL3(DIKCTOP,"",.DIKCNEW,.DIKCFLIS)
 Q
 ;
TYPE() ;Prompt for index type (regular or MUMPS)
 N DIKCTYPE,DIR,DIROUT,DIRUT,DTOUT,X,Y
 ;
 S DIR(0)=".11,.2",DIR("A")="Type of index",DIR("B")="REGULAR"
 F  D  Q:$D(DIRUT)!$D(DIKCTYPE)
 . W ! D ^DIR Q:$D(DIRUT)
 . I Y="MU",$G(DUZ(0))'="@" D
 .. W !,$C(7)_"Only programmers can create MUMPS cross references."
 . E  I Y="MU",$P($G(^DD(DIKCTOP,0,"DI")),U)="Y" D
 .. W !,$C(7)_"Cannot create MUMPS cross references on archived files."
 . E  S DIKCTYPE=Y
 ;
 Q $S($D(DIRUT):-1,1:DIKCTYPE)
 ;
FILE01(DIKCTOP,DIKCFILE) ;Return file on which to store xref
 ;If DIKCFILE is not a subfile, return that file #
 I DIKCTOP=DIKCFILE Q DIKCFILE
 ;
 ;Otherwise, prompt for file on which to store xref
 N FILE01,FINFO,LEV
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 ;Get info on subfile DICKFILE
 D FINFO^DIKCU1(DIKCFILE,.FINFO)
 ;
 ;Prompt for whether whole file indexes should be created
 W !
 S DIR(0)="Y",DIR("B")="Yes"
 S DIR("?")="  Enter 'Yes' if you want the index to reside at this level."
 F LEV=0:1:$O(FINFO(""),-1)-1 D  Q:$D(DIRUT)!$D(FILE01)
 . S DIR("A")="Want to index whole "_$S(LEV:"sub",1:"")_"file "_$P(FINFO(LEV),U,3)_" (#"_$P(FINFO(LEV),U)_")"
 . D ^DIR Q:$D(DIRUT)!'Y
 . S FILE01=$P(FINFO(LEV),U)
 ;
 Q $S($D(DIRUT):-1,'$D(FILE01):DIKCFILE,1:FILE01)
 ;
USE(DIKCTYPE) ;Prompt for Use (Lookup or Lookup & Sorting)
 ;DIKCTYPE = type of index
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)=".11,.42"
 I $G(DIKCTYPE)="MU" D
 . S DIR("A")="How is this MUMPS cross reference to be used"
 . S DIR("B")="ACTION"
 E  D
 . S DIR("A",1)="Want index to be used for Lookup & Sorting"
 . S DIR("A")="  or Sorting Only"
 . S DIR("B")="LOOKUP & SORTING"
 . S DIR(0)=DIR(0)_"^^I X=""A"" W !!,$C(7)_""** Only MUMPS cross references can be ACTION-type cross references. **"" K X"
 W ! D ^DIR K DIR
 Q $S($D(DTOUT)!$D(DUOUT):-1,1:Y)
 ;
NAME(DIKCF01,DIKCUSE) ;Get next available index name
 N DIKCASC,DIKCNAME,DIKCSTRT
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 ;Get next available index name
 S DIKCSTRT=$S(DIKCUSE="LS":"",1:"A")
 F DIKCASC=67:1 D  Q:DIKCNAME]""
 . S DIKCNAME=DIKCSTRT_$C(DIKCASC)
 . I $D(^DD("IX","BB",DIKCF01,DIKCNAME)) S DIKCNAME="" Q
 . I $D(^DD(DIKCF01,0,"IX",DIKCNAME)) S DIKCNAME="" Q
 ;
 ;If not a programmer, return next available index name
 Q:DUZ(0)'="@" DIKCNAME
 ;
 ;Otherwise, prompt for index name
 W !
 S DIR(0)=".11,.02"
 S DIR("A")="Index Name",DIR("B")=DIKCNAME
 F  D  Q:$D(X)!$D(DIRUT)
 . D ^DIR Q:$D(DIRUT)
 . ;
 . ;Check response; print message and kill X if invalid
 . I DIKCUSE="LS",$E(X)="A" D  Q
 .. D NAMERR("Indexes used for Lookup & Sorting cannot start with 'A'")
 . I DIKCUSE="S",$E(X)'="A" D  Q
 .. D NAMERR("Indexes used for Sorting Only must start with 'A'")
 . I DIKCUSE="A",$E(X)'="A" D  Q
 .. D NAMERR("Action-type indexes must start with 'A'")
 . I $D(^DD("IX","BB",DIKCF01,X)) D  Q
 .. D NAMERR("There is already an index defined with this name.")
 . I $D(^DD(DIKCF01,0,"IX",X)) D  Q
 .. D NAMERR("There is already a cross-reference defined with this name.") Q
 ;
 Q $S($D(DIRUT):-1,1:X)
 ;
NAMERR(MSG) ;Invalid index name error
 W !!,$C(7)_$G(MSG),!
 K X
 Q
 ;
ADD(DIKCF01,DIKCFILE,DIKCNAME,DIKCTYPE,DIKCUSE,DIXR) ;
 ;Add new entry to Index file
 ;Returns DIXR=-1 if error
 N DIKCFDA,DIKCIEN
 S DIKCFDA(.11,"+1,",.01)=DIKCF01
 S DIKCFDA(.11,"+1,",.02)=DIKCNAME
 S DIKCFDA(.11,"+1,",.2)=DIKCTYPE
 S DIKCFDA(.11,"+1,",.4)="F"
 S DIKCFDA(.11,"+1,",.41)="IR"
 S:$G(DIKCUSE)]"" DIKCFDA(.11,"+1,",.42)=DIKCUSE
 S DIKCFDA(.11,"+1,",.5)=$S(DIKCF01=DIKCFILE:"I",1:"W")
 S DIKCFDA(.11,"+1,",.51)=DIKCFILE
 S DIKCFDA(.11,"+1,",1.1)="Q"
 S DIKCFDA(.11,"+1,",2.1)="Q"
 D UPDATE^DIE("","DIKCFDA","DIKCIEN")
 I '$D(DIERR) S DIXR=DIKCIEN(1)
 E  D MSG^DIALOG() S DIXR=-1
 Q

DIKCUTL2
DIKCUTL2 ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;17DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;========
 ; $$TYPE
 ;========
 ;Prompt for type xref (to reindex or modify)
 ;Returns:
 ; '1' for Traditional; or
 ; '2' for New
 ;
TYPE() ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="SAM^1:TRADITIONAL;2:NEW"
 S DIR("A")="What type of cross-reference (Traditional or New)? "
 S DIR("B")="Traditional"
 S DIR("?",1)="Enter 'T' to select a Traditional cross-reference."
 S DIR("?",2)="  Traditional cross references are stored in the data"
 S DIR("?",3)="  dictionary under ^DD(file#,field#,1)."
 S DIR("?",4)=" "
 S DIR("?",5)="Enter 'N' to select a New-Style cross-reference."
 S DIR("?",6)="  New-Style cross references are stored in the Index file."
 S DIR("?",7)="  Compound indexes (indexes based on more than one field)"
 S DIR("?")="  are examples of New-Style cross-references."
 D ^DIR
 Q $S($D(DIRUT):"",1:Y)
 ;
 ;==========================
 ; GETXR(file#,.count,flag)
 ;==========================
 ;Loop through the "AC" index to get the list of Index file
 ;xrefs with root file FIL.
 ;In:
 ; FIL = Root file #
 ; FLG [ "M" : also get xrefs on subfiles of FIL
 ;Out:
 ; CNT = # xrefs^rootFile# (or null if FLG [ "M")
 ; CNT(xref#) = rootFile#^File#^xrefName^rootType^UI[if uniq index]
 ;
GETXR(FIL,CNT,FLG) ;
 N F,SB,XR
 K CNT
 D:$G(FLG)["M" SUBFILES^DIKCU(FIL,.SB)
 S SB(FIL)=""
 ;
 S (CNT,F)=0 F  S F=$O(SB(F)) Q:'F  D
 . S XR=0 F  S XR=$O(^DD("IX","AC",F,XR)) Q:'XR  D
 .. I $G(^DD("IX",XR,0))?."^" K ^DD("IX","AC",F,XR) Q
 ..I $G(FLG)["x",$G(^("NOREINDEX")) Q  ;167
 .. S CNT=CNT+1
 .. S CNT(XR)=F_U_$P($G(^DD("IX",XR,0)),U,1,2)_U_$P(^(0),U,8)
 .. S:$D(^DD("KEY","AU",XR)) $P(CNT(XR),U,5)="UI"
 ;
 S:$G(FLG)'["M" $P(CNT,U,2)=FIL
 Q
 ;
 ;============================
 ; LIST(.count,header,screen)
 ;============================
 ;List the xrefs in the CNT array
 ;In:
 ; CNT = Array of xrefs to print (obtained by GETXR call above)
 ; HDR = Text to print before listing
 ;        (default is 'Current Indexes[ on [sub]file #xxx]:')
 ; SCR = Sets $T to screen out indexes (Y = index#)
 ;
LIST(CNT,HDR,SCR) ;
 I '$G(CNT) W:$P(CNT,U,2) !,"There are no INDEX file cross-references defined on "_$$FSTR($P(CNT,U,2))_"." Q
 N FIL,I,ONEFIL,RFIL,TYP,TXT,UI,XR,Y
 ;
 S ONEFIL=$P(CNT,U,2)
 S:$G(HDR)="" HDR="Current Indexes"_$S(ONEFIL:" on "_$$FSTR(ONEFIL),1:"")_":"
 W !,HDR
 ;
 S XR=0 F  S XR=$O(CNT(XR)) Q:'XR  D
 . I $G(SCR)]"" K Y S Y=XR,Y(0)=CNT(XR) X SCR K Y E  Q
 . S FIL=$P(CNT(XR),U,2),RFIL=$P(CNT(XR),U),TYP=$P(CNT(XR),U,4)
 . S UI=$S($P(CNT(XR),U,5)="UI":"uniqueness ",1:"")
 . S RFIL=$S('ONEFIL:" on "_$$FSTR(RFIL),1:"")
 . ;
 . S TXT=XR_"  "_$J("",5-$L(XR))_"'"_$P(CNT(XR),U,3)_"' "_UI
 . I TYP'="W" S TXT=TXT_"index"_RFIL
 . E  S TXT=TXT_"whole file index"_RFIL_" (resides on "_$$FSTR(FIL)_")"
 . ;
 . D WRAP^DIKCU2(.TXT,-11,-2)
 . W !,"  "_TXT F I=1:1 Q:$D(TXT(I))[0  W !?10,TXT(I)
 . K TXT
 Q
 ;
 ;================================
 ; $$CHOOSE(.count,prompt,screen)
 ;================================
 ;Prompt for a xref from the DIKCCNT array
 ;In:
 ; DIKCCNT = Array contain xref data (obtained by GETXR call above)
 ; DIKCPR  = Action to include with the prompt
 ; DIKCSCR = Sets $T to screen out entries (Y=index#)
 ;Returns:
 ; Index ien (or 0, if none selected)
 ;
CHOOSE(DIKCCNT,DIKCPR,DIKCSCR) ;
 Q:'$G(DIKCCNT) 0
 N I,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 S DIR(0)="SAO^"
 S I=0 F  S I=$O(DIKCCNT(I)) Q:'I  S DIR("C",I)=I_":"_$P(DIKCCNT(I),U,3)
 S DIR("A")="Which Index do you wish to "_DIKCPR_"? "
 S:+DIKCCNT=1 DIR("B")=$O(DIKCCNT(0))
 S DIR("?")="",DIR("??")="^D LIST^DIKCUTL2(.DIKCCNT)"
 W ! D ^DIR I 'Y!$D(DIRUT) Q 0
 Q Y
 ;
 ;====================
 ; $$FSTR(file#,flag)
 ;====================
 ;Return string 'file #xxx' or 'subfile #xxx'
 ;In:
 ; FIL = File #
 ; FLG [ U : Capitalize 'File' or 'Subfile'
 ;
FSTR(FIL,FLG) ;
 ;Q $P($P("f;F^subf;Subf",U,$G(^DD(FIL,0,"UP"))>0+1),";",$G(FLG)["U"+1)_"ile #"_FIL
 Q $P($$EZBLD^DIALOG(8098),U,$G(^DD(FIL,0,"UP"))>0*2+1+($G(FLG)["U"))_" #"_FIL
 ;
 ;================
 ; PRTMSG(index#)
 ;================
 ;Print message that DIXR can't be deleted because it's the
 ;Uniqueness Index for a key.
 ;In:
 ; DIXR = index #
 ;
PRTMSG(DIXR) ;
 N KEYID,I,INDID,MSG
 ;
 S KEYID=$O(^DD("KEY","AU",DIXR,0)) Q:'KEYID
 S KEYID=$G(^DD("KEY",KEYID,0)) Q:KEYID?."^"
 S KEYID="Key '"_$P(KEYID,U,2)_"' on File #"_$P(KEYID,U)
 ;
 S INDID="Index '"_$P($G(^DD("IX",DIXR,0)),U,2)_"'"
 S MSG(0)=INDID_" cannot be deleted. It is the uniqueness index for "_KEYID_"."
 D WRAP^DIKCU2(.MSG)
 ;
 W $C(7) F I=0:1 Q:'$D(MSG(I))  W !,MSG(I)
 Q
 ;
 ;================
 ; BLDLOG(index#)
 ;================
 ;Build and file the logic of the cross reference.
 ;In:
 ; DIXR = index #
 ;
 ;Called from EDIT^DIKCUTL after an Index is edited.
 ;The reason for this call is if the user deletes some Cross-Reference
 ;Values, and then Quits the form, the Set/Kill logic may not reflect
 ;the deleted Values.
 ;
BLDLOG(DIXR) ;
 N CNT,CRV,CRV0,DIERR,FCNT,FDA,FILE,IX0,KILL,L,LDIF,MAXL,MSG
 N NAME,ORD,ROOT,RTYPE,RFILE,SBSC,SET,VAL,WKILL
 ;
 ;Get index data
 S IX0=$G(^DD("IX",DIXR,0)) Q:IX0?."^"
 I $P(IX0,U,4)="MU" D UPDEXEC(DIXR) Q
 S FILE=$P(IX0,U),NAME=$P(IX0,U,2),RTYPE=$P(IX0,U,8),RFILE=$P(IX0,U,9)
 ;
 ;Build root of index and the 'Kill Entire Index Code'
 I FILE'=RFILE Q:RTYPE'="W"  S LDIF=$$FLEVDIFF^DIKCU(FILE,RFILE)
 E  S LDIF=0
 S ROOT=$$FROOTDA^DIKCU(FILE,LDIF_"O")_""""_NAME_""""
 S WKILL="K "_ROOT_")"
 ;
 ;Loop through Cross-Reference Values multiple
 ;Build SBSC(subscript#)=order#^maxLength array
 S CRV=0 F  S CRV=$O(^DD("IX",DIXR,11.1,CRV)) Q:'CRV  D
 . S CRV0=$G(^DD("IX",DIXR,11.1,CRV,0)) Q:CRV0?."^"
 . S ORD=$P(CRV0,U) Q:'ORD
 . S:$P(CRV0,U,2)="F" FCNT=$G(FCNT)+1
 . S CNT=$G(CNT)+1
 . S SBSC=$P(CRV0,U,6) Q:'SBSC
 . S MAXL=$P(CRV0,U,5)
 . S SBSC(SBSC)=ORD_U_MAXL
 ;
 ;Loop through SBSC array and build the root w/ X(n) array
 S SBSC=0 F  S SBSC=$O(SBSC(SBSC)) Q:'SBSC  D
 . S ORD=$P(SBSC(SBSC),U),MAXL=$P(SBSC(SBSC),U,2)
 . I $G(CNT)=1 S VAL=$S(MAXL:"$E(X,1,"_MAXL_")",1:"X")
 . E  S VAL=$S(MAXL:"$E(X("_ORD_"),1,"_MAXL_")",1:"X("_ORD_")")
 . S ROOT=ROOT_","_VAL
 ;
 ;Append DA(n) to root
 F L=LDIF:-1:1 S ROOT=ROOT_",DA("_L_")"
 S ROOT=ROOT_",DA)"
 ;
 ;Build and file the Set and Kill Logic and the Execution
 I '$O(SBSC(0)) S (SET,KILL)="Q",WKILL=""
 E  S SET="S "_ROOT_"=""""",KILL="K "_ROOT
 K FDA
 S FDA(.11,DIXR_",",1.1)=SET
 S FDA(.11,DIXR_",",2.1)=KILL
 S FDA(.11,DIXR_",",2.5)=WKILL
 S FDA(.11,DIXR_",",.4)=$S($G(FCNT)>1:"R",1:"F")
 D FILE^DIE("","FDA","MSG")
 Q
 ;
UPDEXEC(DIXR) ;Update Execution based on number of field-type xref values
 N CRV,CRV0,DIERR,FCNT,FDA,MSG
 S CRV(1)=DIXR,CRV=0
 F  S CRV=$O(^DD("IX",DIXR,11.1,CRV)) Q:'CRV  D
 . S CRV0=$G(^DD("IX",DIXR,11.1,CRV,0)) Q:'CRV0
 . S:$P(CRV0,U,2)="F" FCNT=$G(FCNT)+1
 S FDA(.11,DIXR_",",.4)=$S($G(FCNT)>1:"R",1:"F")
 D FILE^DIE("","FDA","MSG")
 Q

DIKCUTL3
DIKCUTL3 ;SFISC/MKO-UTILITY OPTION TO MODIFY INDEX ;10:00 AM  12 Nov 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;==============================================
 ; KSC(topFile#,.oldLogic,.newLogic,.fieldList)
 ;==============================================
 ;Run old kill logic and/or new set logic.
 ;Recompile input templates and xrefs.
 ;In:
 ;  DIKCTOP  = top level file #
 ; .DIKCOLD  = old kill logic (as loaded by LOADXREF^DIKC1)
 ; .DIKCNEW  = new set logic (")
 ; .DIKCFLIS = list of fields for input template compilation
 ;
 ;Called from CREATE^DIKCUTL1 after a new Index is created and edited.
 ;Called from ^DIKKUTL1 if a Uniqueness Index is created or modified.
 ;
KSC(DIKCTOP,DIKCOLD,DIKCNEW,DIKCFLIS) ;
 D:$D(DIKCOLD)>1 KOLD(DIKCTOP,.DIKCOLD)
 D:$D(DIKCNEW)>1 SNEW(DIKCTOP,.DIKCNEW)
 D:$D(DIKCFLIS)>1 DIEZ(DIKCTOP,.DIKCFLIS)
 D DIKZ(DIKCTOP)
 Q
 ;
 ;===========================
 ; DIEZ(topFile#,.fieldList)
 ;===========================
 ;Loop through file/fields in DIKCFLIS input array.
 ;For each of those fields loop through the ^DIE("AF") index which
 ; contains the iens of the compiled input templates that use that
 ; field. Recompile those templates.
 ;In:
 ; DIKCTOP = top level file #
 ; DIKCFLIS(file#,field#) = ""
 ;
DIEZ(DIKCTOP,DIKCFLIS) ;
 N DA,DI,DIKCFD,DIKCFL,DIKCIT,DMAX,DNM,X,Y
 ;
 S DIKCFL=0 F  S DIKCFL=$O(DIKCFLIS(DIKCFL)) Q:'DIKCFL  D
 . S DIKCFD=0 F  S DIKCFD=$O(DIKCFLIS(DIKCFL,DIKCFD)) Q:'DIKCFD  D
 .. S DIKCIT=0 F  S DIKCIT=$O(^DIE("AF",DIKCFL,DIKCFD,DIKCIT)) Q:DIKCIT'>0  D
 ... Q:$D(DIKCIT(DIKCIT))#2  S DIKCIT(DIKCIT)=""
 ... S X=$G(^DIE(DIKCIT,"ROUOLD"))
 ... I X'?1(1A,1"%").7AN D  I X'?1(1A,1"%").7AN D UNC^DIEZ(DIKCIT) Q
 .... S X=$P($G(^DIE(DIKCIT,"ROU")),U,2)
 ... K ^DIE("AF",DIKCFL,DIKCFD,DIKCIT),^DIE(DIKCIT,"ROU")
 ... S DMAX=$G(^DD("ROU")),Y=DIKCIT
 ... D EN^DIEZ
 .. ;
 .. I $D(^DD(DIKCFL,DIKCFD)),$P($G(^DIC(DIKCTOP,"%A")),U,2)-DT D
 ... S ^DD(DIKCFL,DIKCFD,"DT")=DT
 Q
 ;
 ;================
 ; DIKZ(topFile#)
 ;================
 ;Recompile cross references on file Y.
 ;In:
 ; Y = top level file #
 ;
DIKZ(Y) ;
 Q:'$G(Y)
 N DMAX,X
 S X=$G(^DD(Y,0,"DIK")) Q:X=""
 S DMAX=^DD("ROU")
 D EN^DIKZ W !
 Q
 ;
 ;===========================
 ; KOLD(topFile#,.xrefLogic)
 ;===========================
 ;Determine whether to execute old kill logic; if yes, execute.
 ;In:
 ; DIKCTOP = top file #
 ; DIKCOLD(file#,xref#) = array as built by LOADXREF^DIKC1
 ;
KOLD(DIKCTOP,DIKCOLD) ;
 Q:'$D(DIKCOLD)
 N DIKCFILE,DIKCMSG,DIKCTYP,DIKCUC,DIXR
 N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
 ;
 S DIKCFILE=$O(DIKCOLD(0)) Q:'DIKCFILE
 S DIXR=$O(DIKCOLD(DIKCFILE,0)) Q:'DIXR
 S DIKCTYP=$P(DIKCOLD(DIKCFILE,DIXR),U,4)
 ;
 ;Ask before removing Regular index or running kill logic of MUMPS xref
 I DIKCTYP="R" D
 . S DIKCMSG="  Removing old index ..."
 . S DIR("A")="Do you want to delete the data in the old index now"
 . S DIR("B")="YES"
 . S DIR("?",1)="  Enter 'YES' to delete the data in the old index now."
 . S DIR("?",2)=""
 . S DIR("?",3)="  You might answer 'NO' if you know that there is no data in the index, or"
 . S DIR("?",4)="  in order to remove the index, FileMan must loop through a large number"
 . S DIR("?",5)="  of entries, and you would rather wait until a non-peak time to perform"
 . S DIR("?",6)="  deletion. Note, however, that FileMan will use the WHOLE KILL LOGIC to"
 . S DIR("?")="  remove the index, so the looping time may not be an issue."
 E  D
 . S DIKCMSG="  Executing old kill logic ..."
 . S DIR("A")="Do you want to execute the old kill logic now"
 . S DIR("?",1)="  Enter 'YES' to execute the original kill logic now."
 . S DIR("?")="  Otherwise, enter 'NO'."
 S DIR(0)="Y"
 F  W ! D ^DIR Q:'$D(DUOUT)  W $C(7),"  Up-arrow not allowed."
 K DIR Q:'Y!$D(DTOUT)
 ;
 ;Write message and call INDEX^DIKC to execute the kill logic
 W !,DIKCMSG
 S DIKCUC="K"_$S(DIKCTOP'=DIKCFILE:"W"_DIKCFILE,1:"")
 S DIKCUC("LOGIC")="DIKCOLD"
 D INDEX^DIKC(DIKCTOP,"","",DIXR,.DIKCUC)
 W "  DONE!"
 Q
 ;
 ;===========================
 ; SNEW(topFile#,.xrefLogic)
 ;===========================
 ;Determine whether to execute new set logic; if yes, execute.
 ;In:
 ; DIKCTOP = top file #
 ; DIKCNEW(file#,xref#) = array as built by LOADXREF^DIKC1
 ;
SNEW(DIKCTOP,DIKCNEW) ;
 Q:'$D(DIKCNEW)
 N DIKCFILE,DIKCMSG,DIKCTYP,DIKCUC,DIXR
 N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
 ;
 S DIKCFILE=$O(DIKCNEW(0)) Q:'DIKCFILE
 S DIXR=$O(DIKCNEW(DIKCFILE,0)) Q:'DIXR
 S DIKCTYP=$P(DIKCNEW(DIKCFILE,DIXR),U,4)
 ;
 ;Ask before building Regular index or running set logic of MUMPS xref
 I DIKCTYP="R" D
 . S DIKCMSG="  Building new index ..."
 . S DIR("A")="Do you want to build the index now"
 . S DIR("B")="YES"
 . S DIR("?",1)="  Enter 'YES' to loop through all entries in the file and build the index"
 . S DIR("?",2)="  now."
 . S DIR("?",3)=""
 . S DIR("?",4)="  You might answer 'NO' if you know that there is no data in any of the"
 . S DIR("?",5)="  fields being indexed, or if the file has a large number of entries, and"
 . S DIR("?",6)="  you would rather wait until a non-peak time to build the index on a"
 . S DIR("?")="  live system."
 E  D
 . S DIKCMSG="  Executing new set logic ..."
 . S DIR("A")="Do you want to cross reference existing data now"
 . S DIR("?",1)="  Enter 'YES' to execute the new set logic now."
 . S DIR("?")="  Otherwise, enter 'NO'."
 S DIR(0)="Y"
 F  W ! D ^DIR Q:'$D(DUOUT)  W $C(7),"  Up-arrow not allowed."
 K DIR Q:'Y!$D(DTOUT)
 ;
 W !,DIKCMSG
 S DIKCUC="S"_$S(DIKCTOP'=DIKCFILE:"W"_DIKCFILE,1:"")
 S DIKCUC("LOGIC")="DIKCNEW"
 D INDEX^DIKC(DIKCTOP,"","",DIXR,.DIKCUC)
 W "  DONE!"
 Q
 ;
EOP ;Issue Press Return to continue prompt
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="E",DIR("A")="Press RETURN to continue"
 S DIR("?")="Press the RETURN or ENTER key."
 W ! D ^DIR
 Q

DIKD
DIKD ;SFISC/MKO-DELETE A CROSS REFERENCE ;11JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
DELIX(DIFIL,DIFLD,DIXR,DIFLG,DIKDOUT,DIKDMSG) ;Delete traditional xref
DELIXX ;Come here from DELIX^DDMOD
 N %,DIC,X,Y,DIF,DIFINFO,DIQUIT
 ;
 ;Init
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIFLG=$G(DIFLG)
 S DIF=$E("D",DIFLG'["d")
 I DIFLG'["c" D CHK G:$G(DIQUIT) END
 D FINFO^DIKCU1(DIFIL,.DIFINFO)
 ;
 ;Delete data in index
 D:DIFLG["K" KILL^DIKD1(DIFIL,DIFLD,DIXR,$E("W",DIFLG["W")_DIF_"c")
 ;
 ;Audit, delete xref, recompile
 D AUDIT ;:$G(^DD(+DIFINFO(0),0,"DDA"))["Y" 
 D DELDEF(DIFIL,DIFLD,DIXR,DIFLG)
 D DIEZ(DIFIL,DIFLD,DIFLG,$G(DIKDOUT))
 D DIKZ(+DIFINFO(0),DIFLG,$G(DIKDOUT))
 ;
END ;Move error message if necessary and quit
 D:$G(DIKDMSG)]"" CALLOUT^DIEFU(DIKDMSG)
 Q
 ;
DELDEF(DIFIL,DIFLD,DIXR,DIFLG) ;Delete index definition
 N DIK,DA,DITYP
 S DITYP=$P($G(^DD(DIFIL,DIFLD,1,DIXR,0)),U,3)
 K:DITYP="SOUNDEX" ^DD(DIFIL,0,"LOOK"),^("QUES")
 ;
 W:$G(DIFLG)["W" !,"Deleting cross-reference definition ..."
 S ^DD(DIFIL,DIFLD,1,0)="^.1"
 S DIK="^DD("_DIFIL_","_DIFLD_",1,"
 S DA(2)=DIFIL,DA(1)=DIFLD,DA=DIXR
 D ^DIK
 Q
 ;
DIEZ(DIFIL,DIFLD,DIFLG,DIKDOUT,DIKTEML) ;Recompile input templates containing field
 N DIERR,DITEM,DIMAX,DIRNM
 S DIMAX=$$ROUSIZE^DILF
 S DITEM=0 F  S DITEM=$O(^DIE("AF",DIFIL,DIFLD,DITEM)) Q:'DITEM  D
 . N DIERR,DIEZMSG
 . Q:$D(DIKTEML(DITEM))#2  S DIKTEML(DITEM)=""
 . K ^DIE("AF",DIFIL,DIFLD,DITEM),^DIE(DITEM,"ROU")
 . S DIRNM=$G(^DIE(DITEM,"ROUOLD")) Q:DIRNM=""
 . D EN2^DIEZ(DITEM,$E("T",$G(DIFLG)["W"),DIRNM,"","DIEZMSG")
 . I '$G(DIERR),$G(DIKDOUT)]"" D
 .. S @DIKDOUT@("DIEZ",DITEM)=$P(^DIE(DITEM,0),U)_U_$P(^(0),U,4)_U_DIRNM
 Q
 ;
DIKZ(Y,DIFLG,DIKDOUT) ;Recompile xrefs
 Q:'$G(Y)
 N DIERR,DIKZMSG,DMAX,DIRNM
 S DIRNM=$G(^DD(Y,0,"DIK")) Q:DIRNM=""
 S DMAX=$$ROUSIZE^DILF
 D EN2^DIKZ(Y,$E("T",$G(DIFLG)["W"),DIRNM,"","DIKZMSG")
 I '$G(DIERR),$G(DIKDOUT)]"" S @DIKDOUT@("DIKZ")=DIRNM
 Q
 ;
AUDIT ;Audit DD change
 N %,%D,%T,A0,A1,A2,B0,B1,B2,B3,DA,DDA,DL,DQ,J,N
 S DDA="D",N=DIFINFO,J(0)=+DIFINFO(0),J(N)=DIFIL,DL=DIFLD,DQ=DIXR
 D XA^DICATTA
 S:$G(DIKDOUT)]"" @DIKDOUT@("DDAUD")=1
 Q
 ;
CHK ;Check input parameters
 I '$G(DIFIL) D:DIF["D" ERR^DIKCU2(202,"","","","FILE") D QUIT
 I '$G(DIFLD) D:DIF["D" ERR^DIKCU2(202,"","","","FIELD") D QUIT
 I '$G(DIQUIT),'$$VFNUM^DIKCU1(DIFIL,DIF) D QUIT
 I '$G(DIQUIT),'$$VFLD^DIKCU1($G(DIFIL),$G(DIFLD),DIF) D QUIT
 ;
 I $G(DIXR)="" D
 . D:DIF["D" ERR^DIKCU2(202,"","","","CROSS-REFERENCE") D QUIT
 E  I '$G(DIQUIT) D
 . I DIXR=+DIXR D
 .. I $D(^DD(DIFIL,DIFLD,1,DIXR,0))[0 D:DIF["D" ERR^DIKCU2(202,"","","","CROSS-REFERENCE") D QUIT
 . E  D
 .. N I,XR
 .. S I=0 F  S I=$O(^DD(DIFIL,DIFLD,1,I)) Q:'I  S:$P($G(^(I,0)),U,2)=DIXR XR=$G(XR)+1,XR(XR)=I
 .. I $G(XR)=1 S DIXR=XR(XR)
 .. E  D:DIF["D" ERR^DIKCU2(202,"","","","CROSS-REFERENCE") D QUIT
 ;
 D:'$$VFLAG^DIKCU1(DIFLG,"KWcd",DIF) QUIT
 Q
 ;
QUIT ;Set flag to quit
 S DIQUIT=1
 Q

DIKD1
DIKD1 ;SFISC/MKO-DELETE XREF DATA ;1:03 PM  20 Aug 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
KILL(DIFIL,DIFLD,DIXR,DIFLG,DIKDMSG) ;Delete xref data
 N DA,DIDEC,DIF,DIFILR,DIKILL,DIMF,DINAM,DIQUIT,DIROOT,DITOPF,DITYP
 ;
 ;Init
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIFLG=$G(DIFLG)
 S DIF=$E("D",DIFLG'["d")
 I DIFLG'["c" D CHK G:$G(DIQUIT) END
 D INIT G:$D(DIQUIT) END
 ;
 ;Fire the kill logic
 D:$G(DIFLG)["W"
 . I DITYP="BULLETIN"!(DITYP="MUMPS")!(DITYP="TRIGGER") D
 .. W !,"Executing kill logic ..."
 . E  W !,"Removing index ..."
 D FIRE(DITOPF,DIROOT)
 ;
END ;Move error message if necessary and quit
 D:$G(DIKDMSG)]"" CALLOUT^DIEFU(DIKDMSG)
 Q
 ;
FIRE(DIFILE,DIROOT) ;Fire the kill logic
 N DICNT,DILAST,DIMULTF,DISBROOT,X
 ;
 ;If we're at the level where the index resides,
 ;check whether we can delete the entire index with one kill
 I DIFILE=DIFILR,DINAM?1.E,DITYP'="MNEMONIC",DITYP'="MUMPS" D
 . K @DIROOT@(DINAM)
 ;
 ;Else, if we're at the level where the index is defined,
 ;execute the kill logic for each entry
 E  I DIFILE=DIFIL S (DICNT,DA)=0 F  S DA=$O(@DIROOT@(DA)) Q:DA'=+DA  D
 . N X
 . S DICNT=DICNT+1
 . X DIDEC X:X]"" DIKILL
 ;
 ;Else, for all entries, descend into multiple
 E  S DIMULTF=$O(DIMF(DIFILE,0)) I DIMULTF S (DICNT,DA)=0 F  S DA=$O(@DIROOT@(DA)) Q:DA'=+DA  D
 . S DICNT=DICNT+1
 . S DISBROOT=$NA(@DIROOT@(DA,DIMF(DIFILE,DIMULTF))) Q:'$D(@DISBROOT)
 . D PUSHDA^DIKCU(.DA)
 . D FIRE(DIMF(DIFILE,DIMULTF,0),DISBROOT)
 . D POPDA^DIKCU(.DA)
 ;
 I $D(DICNT),$D(@DIROOT@(0))#2 D
 . S DILAST=$O(@DIROOT@(" "),-1)
 . S:'DILAST DILAST="" S:'DICNT DICNT=""
 . S $P(@DIROOT@(0),U,3,4)=DILAST_U_DICNT
 Q
 ;
CHK ;Check input parameters
 I '$G(DIFIL) D:DIF["D" ERR^DIKCU2(202,"","","","FILE") D QUIT
 I '$G(DIFLD) D:DIF["D" ERR^DIKCU2(202,"","","","FIELD") D QUIT
 I '$G(DIQUIT),'$$VFLD^DIKCU1($G(DIFIL),$G(DIFLD),DIF) D QUIT
 I '$G(DIXR) D:DIF["D" ERR^DIKCU2(202,"","","","CROSS-REFERENCE") D QUIT
 D:'$$VFLAG^DIKCU1(DIFLG,"Wcd",DIF) QUIT
 Q
 ;
INIT ;Get xref info and subfile info
 N DIXR0
 S DIXR0=$G(^DD(DIFIL,DIFLD,1,DIXR,0)) G:DIXR0="" QUIT
 S DIFILR=$P(DIXR0,U),DINAM=$P(DIXR0,U,2),DITYP=$P(DIXR0,U,3)
 G:DITYP="BULLETIN" QUIT
 ;
 S DIKILL=$G(^DD(DIFIL,DIFLD,1,DIXR,2))
 G:DIKILL="Q"!(DIKILL?."^") QUIT
 ;
 D SBINFO^DIKCU(DIFIL,.DIMF)
 I '$D(DIMF) S DITOPF=DIFIL
 E  S DITOPF=0 F  S DITOPF=$O(DIMF(DITOPF)) Q:'$G(^DD(DITOPF,0,"UP"))
 ;
 S DIROOT=$$CREF^DILF($G(^DIC(DITOPF,0,"GL")))
 S DIDEC=$$DEC^DIKC2(DIFIL,DIFLD)
 G:DIROOT=""!(DIDEC="") QUIT
 Q
 ;
QUIT ;Set flag to quit
 S DIQUIT=1
 Q

DIKD2
DIKD2 ;SFISC/MKO-DELETE A NEW-STYLE INDEX ;4JAN2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DELIXN(DIFIL,DIXR,DIFLG,DIKDOUT,DIKDMSG) ;Delete new-style index
DELIXNX ;Come here from DELIXN^DDMOD
 N %,DIC,DIF,DIFLIST,DIINDEX,DIQUIT,DITOP,X,Y
 ;
 ;Init
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 S DIFLG=$G(DIFLG)
 S DIF=$E("D",DIFLG'["d")
 I DIFLG'["c" D CHK G:$G(DIQUIT) END
 S DITOP=DIFIL F  Q:'$D(^DD(DITOP,0,"UP"))  S DITOP=^("UP")
 D GETFLIST^DIKCUTL(DIXR,.DIFLIST)
 D LOADXREF^DIKC1("","","K",DIXR,"","DIINDEX")
 ;
 ;Delete data in index
 D:DIFLG["K" KILL(DITOP,.DIINDEX,DIFLG)
 ;
 ;Delete index, recompile
 D DELDEF(DIXR)
 D DIEZ(.DIFLIST,DIFLG,$G(DIKDOUT))
 D DIKZ^DIKD(DITOP,DIFLG,$G(DIKDOUT))
 ;
END ;Move error message if necessary and quit
 D:$G(DIKDMSG)]"" CALLOUT^DIEFU(DIKDMSG)
 Q
 ;
DELDEF(DIXR) ;Delete index definition
 N DIK,DA
 W:$G(DIFLG)["W" !,"Deleting index definition ..."
 S DIK="^DD(""IX"",",DA=DIXR D ^DIK
 Q
 ;
DIEZ(DIFLIST,DIFLG,DIKDOUT) ;Recompile input templates containing field
 N DIFIL,DIFLD,DIKTEML
 S DIFIL=0 F  S DIFIL=$O(DIFLIST(DIFIL)) Q:'DIFIL  D
 . S DIFLD=0 F  S DIFLD=$O(DIFLIST(DIFIL,DIFLD)) Q:'DIFLD  D
 .. D DIEZ^DIKD(DIFIL,DIFLD,DIFLG,$G(DIKDOUT),.DIKTEML)
 Q
 ;
CHK ;Check input parameters
 I '$G(DIFIL) D:DIF["D" ERR^DIKCU2(202,"","","","FILE") D QUIT
 I $G(DIXR)]"" D
 .N I F I=0:0 S I=$O(^DD("IX","IX",DIXR,I)) Q:'I  I +$G(^DD("IX",I,0))=$G(DIFIL) Q
 .I 'I K DIXR
 I $G(DIXR)="" D:DIF["D" ERR^DIKCU2(202,"","","","CROSS-REFERENCE") D QUIT
 D:'$$VFLAG^DIKCU1(DIFLG,"KWcd",DIF) QUIT
 Q:$G(DIQUIT)
 S DIXR=$O(^DD("IX","BB",DIFIL,DIXR,0))
 D:'DIXR QUIT
 Q
 ;
QUIT ;Set flag to quit
 S DIQUIT=1
 Q
 ;
KILL(DITOP,DIINDEX,DIFLG) ;Delete index data
 N DIFIL,DITYP,DICTRL,DIXR
 ;
 Q:'$D(DIINDEX)
 S DIFIL=$O(DIINDEX(0)) Q:'DIFIL
 S DIXR=$O(DIINDEX(DIFIL,0)) Q:'DIXR
 S DITYP=$P(DIINDEX(DIFIL,DIXR),U,4)
 ;
 I $G(DIFLG)["W" D
 . I DITYP="R" W !,"Removing index ..."
 . E  W !,"Executing kill logic ..."
 ;
 ;Call INDEX^DIKC to execute the kill logic
 S DICTRL="K"_$S(DITOP'=DIFIL:"W"_DIFIL,1:"")
 S DICTRL("LOGIC")="DIINDEX"
 D INDEX^DIKC(DITOP,"","",DIXR,.DICTRL)
 Q

DIKK
DIKK ;SFISC/MKO-CHECK KEY INTEGRITY ;9:14 AM  23 Feb 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
INTEG(DIFILE,DIREC,DIFLD,DIKKEY,DICTRL,DIKPROC) ;
 N DA,DIF,DIKERR,DIKFIL,DIKKQUIT,DIMF,DIROOT,DITAR
 ;
 ;If called as an extrinsic, manipulate DICTRL
 S DIKPROC=$G(DIKPROC)
 I 'DIKPROC N DICTRL1,DIKKTAR M DICTRL1=DICTRL S DICTRL("TAR")="DIKKTAR"
 ;
 S DIF=$E("D",$G(DICTRL)'["d")
 I DIF["D",'$D(DIQUIET) N DIQUIET S DIQUIET=1
 I DIF["D",'$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 ;Check input params, initialize variables, clean output array
 D INIT^DIKK2 G:$G(DIKERR)]"" MOVE
 I 'DIKPROC S:$G(DICTRL)'["Q" DICTRL=$G(DICTRL)_"Q"
 ;
 ;Load key info into ^TMP("DIKK",$J), and multiple info into DIMF
 K ^TMP("DIKK",$J)
 I $G(DIKKEY)?."^" D
 . I $G(DIFLD) D
 .. D LOADFLD^DIKK1(DIKFIL,DIFLD)
 . E  D LOADALL^DIKK1(DIKFIL,$E("s",$G(DICTRL)["s"),.DIMF)
 E  D LOADKEY^DIKK1(DIKKEY)
 G:'$O(^TMP("DIKK",$J,0)) EXIT
 D:DIKFIL'=DIFILE SBINFO^DIKCU(DIKFIL,.DIMF)
 ;
 ;Check one or all records in file DIFILE
 I DA D
 . D CHECK(DIFILE,.DA,DIROOT,.DIMF,DITAR,.DIKKQUIT)
 E  D CHECKALL(DIFILE,.DA,DIROOT,.DIMF,DITAR,.DIKKQUIT)
 ;
EXIT ;Cleanup ^TMP and quit
 K ^TMP("DIKK",$J)
 ;
MOVE ;Move error messages if necessary
 I DIF["D",$G(DIERR),$G(DICTRL("MSG"))]"" D CALLOUT^DIEFU(DICTRL("MSG"))
 I 'DIKPROC K DICTRL M DICTRL=DICTRL1 Q $D(DIKKTAR)=0&($G(DIKERR)="")
 Q
 ;
CHECK(DIFILE,DA,DIROOT,DIMF,DITAR,DIKKQUIT) ;Check one record
 I $D(^TMP("DIKK",$J,"UIR",DIFILE)) D CHECK^DIKK2(DIFILE,.DA,DITAR,.DIKKQUIT) Q:$G(DIKKQUIT)
 D:$D(DIMF(DIFILE)) CHECKSUB(DIFILE,.DA,DIROOT,.DIMF,DITAR,.DIKKQUIT)
 Q
 ;
CHECKALL(DIFILE,DA,DIROOT,DIMF,DITAR,DIKKQUIT) ;Check all records
 I $D(^TMP("DIKK",$J,"UI",DIFILE)) D UICHK(DIFILE,.DA,DITAR,.DIKKQUIT) Q:$G(DIKKQUIT)
 I '$D(^TMP("DIKK",$J,DIFILE)),'$D(DIMF(DIFILE)) Q
 ;
 ;Loop through all records in file, check for null key fields
 S DA=0 F  S DA=$O(@DIROOT@(DA)) Q:DA'=+DA  D  Q:$G(DIKKQUIT)
 . I $D(^TMP("DIKK",$J,DIFILE)) D NULLCHK(DIFILE,.DA,DITAR,.DIKKQUIT) Q:$G(DIKKQUIT)
 . D:$D(DIMF(DIFILE)) CHECKSUB(DIFILE,.DA,DIROOT,.DIMF,DITAR,.DIKKQUIT)
 Q
 ;
CHECKSUB(DIFILE,DA,DIROOT,DIMF,DITAR,DIKKQUIT) ;Process all records in subfiles
 N DIMULTF,DISBFILE,DISBROOT
 D PUSHDA^DIKCU(.DA)
 ;
 ;Loop through the DIMF array and make recursive call to check all
 ;subrecords
 S DIMULTF=0 F  S DIMULTF=$O(DIMF(DIFILE,DIMULTF)) Q:'DIMULTF  D  Q:$G(DIKKQUIT)
 . S DISBROOT=$NA(@DIROOT@(DA(1),DIMF(DIFILE,DIMULTF))) Q:'$D(@DISBROOT)
 . S DISBFILE=DIMF(DIFILE,DIMULTF,0)
 . D CHECKALL(DISBFILE,.DA,DISBROOT,.DIMF,DITAR,.DIKKQUIT)
 ;
 D POPDA^DIKCU(.DA)
 Q
 ;
NULLCHK(KFIL,DA,DITAR,DIKKQUIT) ;Check whether any of the key fields at
 ;KFIL file level are null for a given record.
 N FIL,FLD,IENS,LDIF,X
 ;
 S FIL=0 F  S FIL=$O(^TMP("DIKK",$J,KFIL,FIL)) Q:'FIL  D  Q:$G(DIKKQUIT)
 . S LDIF=+$G(^TMP("DIKK",$J,KFIL,FIL))
 . S FLD=0 F  S FLD=$O(^TMP("DIKK",$J,KFIL,FIL,FLD)) Q:'FLD  D  Q:$G(DIKKQUIT)
 .. X ^TMP("DIKK",$J,KFIL,FIL,FLD) Q:X]""
 .. S IENS=$$IENS(.DA)
 .. S:LDIF IENS=$P(IENS,",",LDIF+1,999)
 .. D SETN(FIL,IENS,FLD,DITAR,.DIKKQUIT)
 Q
 ;
UICHK(FILE,DA,OUT,DIKKQUIT) ;Walk through uniqueness index and check for duplicates
 N IX0,IX1,IX2,IXV1,IXV2,KEY,KFIL,LDIF,NS,S,SS,UI
 ;
 S UI=0 F  S UI=$O(^TMP("DIKK",$J,"UI",FILE,UI)) Q:'UI  D  Q:$G(DIKKQUIT)
 . ;Get info about uniqueness index
 . S KEY=$G(^TMP("DIKK",$J,"UI",FILE,UI))
 . I $P(KEY,U,2)]"" D
 .. S KFIL=$P(KEY,U,2),LDIF=$P(KEY,U,3),KEY=$P(KEY,U)
 .. S IX0=^TMP("DIKK",$J,"UI",FILE,UI,"UIR") M SS=^("SS")
 . E  D
 .. D XRINFO^DIKCU2(UI,"",.LDIF,"",.KFIL,.IX0,.SS)
 .. ;
 .. ;Remove elements from the SS array that have no max length.
 .. ;For those that have max length, set SS(S)=data extraction code
 .. S S=0 F  S S=$O(SS(S)) Q:'S  D
 ... I '$P(SS(S),U,3) K SS(S) Q
 ... S SS(S)=^TMP("DIKK",$J,KFIL,$P(SS(S),U),$P(SS(S),U,2))
 .. ;
 .. ;Remember info for next time
 . S KEY=+KEY
 . S ^TMP("DIKK",$J,"UI",FILE,UI)=KEY_U_KFIL_U_LDIF,^(UI,"UIR")=IX0
 . M ^TMP("DIKK",$J,"UI",FILE,UI,"SS")=SS
 . ;
 . ;If necessary, push the DA array
 . D:LDIF PUSHDA^DIKCU(.DA,LDIF)
 . ;
 . ;Walk down the uniqueness index and look for duplicates
 . S (IX0,IX1,IX2)=$NA(@IX0),NS=$QL(IX0)
 . F  S IX2=$Q(@IX2) Q:IX2=""  Q:$NA(@IX2,NS)'=IX0  D  Q:$G(DIKKQUIT)
 .. S IXV1=$NA(@IX1,NS+SS),IXV2=$NA(@IX2,NS+SS)
 .. I IXV1'=IXV2 S IX1=IX2 Q
 .. D DUPL(KEY,UI,FILE,KFIL,.DA,IX1,IX2,IXV1,NS,.SS,.DIKKQUIT)
 .. S (IX1,IX2)=$NA(@IXV1@("~"))
 . ;
 . ;Pop the DA array
 . D:LDIF POPDA^DIKCU(.DA,LDIF)
 Q
 ;
DUPL(KEY,UI,UIFIL,UIRFIL,DA,IX1,IX2,IXV,NS,SS,DIKKQUIT) ;Process duplicate
 ;indexes
 N DUPL,IENSDONE,I,IENS1,IENS2,L,ML,NEXTIX1,S,V1,X
 ;
 ;Set ML(subsc)=SS(subsc) for those subscripts that are >= maxlength
 S S=0
 F  S S=$O(SS(S)) Q:'S  S:$L($QS(IXV,NS+S))'<$P(SS(S),U,3) ML(S)=SS(S)
 ;
DLOOP ;Compare IX1 with IX2 and subsequent indexes
 K NEXTIX1
 ;
 ;Set iens and DA array for 1st index
 S IENS1=$E(IX1,$L(IXV)+1,$L(IX1)-1),L=$L(IENS1,",")
 S DA=$P(IENS1,",",L) F I=1:1:L-1 S DA(I)=$P(IENS1,",",L-I)
 S IENS1=$$IENS(.DA)
 ;
 ;If any subsc >= maxlen, set V1(subsc) = value array for 1st index
 I $D(ML) K V1 S S=0 F  S S=$O(ML(S)) Q:'S  X ML(S) S V1(S)=X
 ;
 F  D  S IX2=$Q(@IX2) Q:IX2=""  Q:$NA(@IX2,NS+SS)'=IXV!$G(DIKKQUIT)
 . ;Set iens and DA array for the 2nd index
 . S IENS2=$E(IX2,$L(IXV)+1,$L(IX2)-1),L=$L(IENS2,",")
 . S DA=$P(IENS2,",",L) F I=1:1:L-1 S DA(I)=$P(IENS2,",",L-I)
 . S IENS2=$$IENS(.DA)
 . ;
 . ;If no subsc >= maxlen, there's a duplicate
 . I '$D(ML) D SETK(UIRFIL,IENS2,KEY,DITAR,.DIKKQUIT) S DUPL=1 Q
 . ;
 . ;Otherwise, compare with actual data
 . Q:$D(IENSDONE(IENS2))
 . S S=0 F  S S=$O(ML(S)) Q:'S  X ML(S) I X'=V1(S) Q
 . I S S:'$D(NEXTIX1) NEXTIX1=IX2
 . E  D SETK(UIRFIL,IENS2,KEY,DITAR,.DIKKQUIT) S DUPL=1,IENSDONE(IENS2)=""
 ;
 D:$G(DUPL) SETK(UIRFIL,IENS1,KEY,DITAR,.DIKKQUIT)
 Q:'$D(NEXTIX1)
 ;
 S IX1=NEXTIX1,IX2=$Q(@IX1) Q:IX2=""
 G:$NA(@IX1,NS+SS)=$NA(@IX2,NS+SS) DLOOP
 Q
 ;
SETN(DIFIL,DIIENS,DIFLD,DITAR,DIKKQUIT) ;
 S @DITAR@(DIFIL,DIIENS,DIFLD)=""
 ;S @DITAR@("N",DIFIL,DIIENS,DIFLD)=""
 S:$G(DIKKQUIT)]"" DIKKQUIT=1
 Q
 ;
SETK(DIRFIL,DIIENS,DIKEY,DITAR,DIKKQUIT) ;
 S @DITAR@(DIRFIL,DIIENS,"K",DIKEY)=""
 ;S @DITAR@("K",DIRFIL,DIIENS,DIKEY)=""
 S:$G(DIKKQUIT)]"" DIKKQUIT=1
 Q
 ;
IENS(DA) ;Return IENS from DA array
 N I,IENS
 S IENS=$G(DA)_"," F I=1:1:$O(DA(" "),-1) S IENS=IENS_DA(I)_","
 Q IENS

DIKK1
DIKK1 ;SFISC/MKO-CHECK KEY INTEGRITY ;9:19 AM  5 Feb 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;========================
 ; LOADALL(File,Flag,.MF)
 ;========================
 ;Load info about all keys on a file. Use the "B" xref on the Key file.
 ;In:
 ; KFIL = File # [.31,.01]
 ; FLAG [ "s" : don't include subfile under file
 ;Out:
 ; ^TMP("DIKK",$J,keyFile#,file#) = levDif(keyfile,file) (if > 0)
 ;                                  ^openRootDA
 ;                ...      file#,field#) = S X=$P($G(...),U,n)
 ;                                         or S X=$E($G(...),m,n)
 ;
 ; ^TMP("DIKK",$J,"UI",file[.01],ui#)   = key#
 ; ^TMP("DIKK",$J,"UIR",rFile[.51],ui#) = key#
 ;
 ; MF(file#,mField#)   = multiple node
 ; MF(file#,mField#,0) = subfile#
 ;
LOADALL(KFIL,FLAG,MF) ;
 N FLD,KEY,ROOT
 ;
 ;Get info for all keys on this file
 S KEY=0
 F  S KEY=$O(^DD("KEY","B",KFIL,KEY)) Q:'KEY  D LOADKEY(KEY,.ROOT)
 Q:$G(FLAG)["s"
 ;
 ;Make a recursive call to get subfiles under KFIL
 N CHK,FIL,MFLD,PAR,SB
 D SUBFILES^DIKCU(KFIL,.SB,.MF)
 S SB=0 F  S SB=$O(SB(SB)) Q:'SB  D
 . D LOADALL(SB,"s") Q:'$D(^TMP("DIKK",$J,SB))
 . ;
 . ;Set CHK(subfile)="" for subfile and its antecedents
 . S PAR=SB F  Q:$D(CHK(PAR))  S CHK(PAR)=1,PAR=$G(SB(PAR)) Q:PAR=""
 ;
 ;Use the CHK array to get rid of unneeded elements in MF
 S FIL=0 F  S FIL=$O(MF(FIL)) Q:'FIL  D
 . S MFLD=0 F  S MFLD=$O(MF(FIL,MFLD)) Q:'MFLD  D
 .. K:'$D(CHK(MF(FIL,MFLD,0))) MF(FIL,MFLD)
 Q
 ;
 ;=====================
 ; LOADFLD(File,Field)
 ;=====================
 ;Load info for all keys of which a field is a part.
 ;
LOADFLD(FIL,FLD) ;
 N KEY
 S KEY=0 F  S KEY=$O(^DD("KEY","F",FIL,FLD,KEY)) Q:'KEY  D LOADKEY(KEY)
 Q
 ;
 ;===================
 ; LOADKEY(Key,Root)
 ;===================
 ;Load info about a key.
 ;In:
 ;  KEY   = Key #
 ; .OROOT = Open root of File of Key [.31,.01] (optional) (also output)
 ;Out:
 ; .OROOT = Open root of File of Key [.31,.01]
 ; ^TMP (see LOADALL above)
 ;
LOADKEY(KEY,OROOT) ;
 N DEC,FIL,FLD,FLDN,KFIL,LDIF,UI,UIFIL,UIRFIL
 ;
 ;Get key data
 S KFIL=$P($G(^DD("KEY",KEY,0)),U),UI=$P($G(^(0)),U,4) Q:'KFIL!'UI
 ;
 ;Get info about UI
 S UIFIL=$P($G(^DD("IX",UI,0)),U),UIRFIL=$P(^(0),U,9) Q:'UIFIL!'UIRFIL
 Q:$D(^TMP("DIKK",$J,"UI",UIFIL,UI))  S ^(UI)=KEY
 S ^TMP("DIKK",$J,"UIR",UIRFIL,UI)=KEY
 ;
 ;Get root of file [.31,.01]
 I $G(OROOT)="" S OROOT=$$FROOTDA^DIKCU(KFIL,"O")_"DA," Q:OROOT="DA,"
 ;
 ;Loop through fields in key; get data extraction code
 S FLDN=0 F  S FLDN=$O(^DD("KEY",KEY,2,FLDN)) Q:'FLDN  D
 . Q:'$D(^DD("KEY",KEY,2,FLDN,0))  S FLD=$P(^(0),U),FIL=$P(^(0),U,2)
 . Q:'FLD!'FIL  Q:$D(^TMP("DIKK",$J,KFIL,FIL,FLD))#2
 . ;
 . I FIL'=KFIL N OROOT D  Q:$G(OROOT)=""
 .. I $D(^TMP("DIKK",$J,KFIL,FIL))#2 S LDIF=+^(FIL),OROOT=U_$P(^(FIL),U,2,999)
 .. E  D
 ... S LDIF=$$FLEVDIFF^DIKCU(FIL,KFIL) Q:'LDIF
 ... S OROOT=$$FROOTDA^DIKCU(FIL,LDIF_"O") Q:OROOT=""
 ... S OROOT=OROOT_"DA("_LDIF_"),"
 ... S ^TMP("DIKK",$J,KFIL,FIL)=LDIF_OROOT
 . ;
 . S DEC=$$DEC(FIL,FLD,OROOT) Q:DEC=""
 . S ^TMP("DIKK",$J,KFIL,FIL,FLD)=DEC
 ;
 Q
 ;
 ;==============================
 ; $$DEC(File#,Field#,OpenRoot)
 ;==============================
 ;Return code that sets X=data from file; examples:
 ; S X=$P($G(^DIZ(1000,DA(2),"m1",DA(1),"m2",DA,0)),U,3)
 ; S X=$E($G(^DIZ(1000,DA(2),"m1",DA(1),"m2",DA,0)),1,245)
 ;In:
 ; FIL   = File #
 ; FLD   = Field #
 ; OROOT = Open root of record (with DA strings) (optional)
 ;
DEC(FIL,FLD,OROOT) ;Get data extraction code
 N ND,PC
 S PC=$P($G(^DD(FIL,FLD,0)),U,4)
 S ND=$P(PC,";"),PC=$P(PC,";",2) Q:ND?." " ""  Q:"0 "[PC ""
 S:ND'=+$P(ND,"E") ND=""""_ND_""""
 ;
 I $G(OROOT)="" S OROOT=$$FROOTDA^DIKCU(FIL,"O")_"DA," Q:OROOT="DA," ""
 I PC Q "S X=$P($G("_OROOT_ND_")),U,"_PC_")"
 E  Q "S X=$E($G("_OROOT_ND_")),"_+$E(PC,2,999)_","_$P(PC,",",2)_")"
 ;

DIKK2
DIKK2 ;SFISC/MKO-CHECK INPUT PARAMETERS TO INTEG^DIKK ;2:20 PM  15 Jul 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;======
 ; INIT
 ;======
 ;Check input parameters to INTEG^DIKK and initialize variables.
 ;Out:
 ; DA     = DA array
 ; DIFILE = File #
 ; DIKFIL = Root (Key) File # (passed in via the W# parameter in DICTRL)
 ;          or DIFILE
 ; DIROOT = Closed root of file DIFILE
 ; DITAR  = Closed root of ouptut array [default: ^TMP("DIKKTAR",$J)]
 ; DIKERR = 1 : if there's a problem
 ; DIKKQUIT = 0 : if DICTRL["Q" (indicates we should quit when the
 ;                first problem is encountered)
 ;
INIT ;Check and setup
 N DILEV,DIIENS
 ;
 ;Get and clean output array
 S DITAR=$G(DICTRL("TAR")) S:DITAR="" DITAR=$NA(^TMP("DIKKTAR",$J))
 K @DITAR
 ;
 ;File is required
 I $G(DIFILE)="" D:DIF["D" ERR^DIKCU2(202,"","","","FILE") G ERR
 ;
 ;Check DIREC and set DA array
 I $G(DIREC)'["," M DA=DIREC S DIIENS=$$IENS(.DA)
 E  S DIIENS=DIREC_$E(",",DIREC'?.E1",") D DA^DILF(DIIENS,.DA)
 S:'$G(DA) DA=""
 G:'$$VDA^DIKCU1(.DA,DIF) ERR
 ;
 ;Set DIFILE and DIROOT
 I DIFILE=+$P(DIFILE,"E") D
 . S DIROOT=$$FROOTDA^DIKCU(DIFILE,DIF,.DILEV) I DIROOT="" D ERR Q
 . I $L(DIIENS,",")-2'=DILEV D  Q
 .. D:DIF["D" ERR^DIKCU2(205,"",$$IENS(.DA),"",DIFILE) D ERR
 . S:DILEV DIROOT=$NA(@DIROOT)
 . S DIFILE=$$FNUM^DIKCU(DIROOT,DIF) I DIFILE="" D ERR Q
 E  D
 . S DIROOT=DIFILE
 . S:"(,"[$E(DIROOT,$L(DIROOT)) DIROOT=$$CREF^DILF(DIFILE)
 . S DIFILE=$$FNUM^DIKCU(DIROOT,DIF) I DIFILE="" D ERR Q
 . S DILEV=$$FLEV^DIKCU(DIFILE,DIF) I DILEV="" D ERR Q
 . I $L(DIIENS,",")-2'=DILEV D  Q
 .. D:DIF["D" ERR^DIKCU2(205,"",$$IENS(.DA),"",DIFILE) D ERR
 Q:$G(DIKERR)
 ;
 ;Check DICTRL parameter
 I $G(DICTRL)]"",'$$VFLAG^DIKCU1(DICTRL,"QWds",DIF) G ERR
 ;
 ;Set DIKFILE = key (root) file
 I $G(DIKKEY) D  Q:$G(DIKERR)
 . S DIKFIL=$P($G(^DD("KEY",DIKKEY,0)),U)
 . I 'DIKFIL D:DIF["D" ERR^DIKCU2(202,"","","","KEY") D ERR
 E  S DIKFIL=+$P($G(DICTRL),"W",2)
 I 'DIKFIL S DIKFIL=DIFILE
 E  G:'$$VFNUM^DIKCU1(DIKFIL,DIF) ERR
 ;
 K DIKKQUIT S:$G(DICTRL)["Q" DIKKQUIT=0
 Q
 ;
ERR ;Set error flag
 S DIKERR=1
 Q
 ;
CHECK(RFIL,DA,DITAR,DIKKQUIT) ;Check key integrity for one record
 N FIL,FLD,IENSC,KEY,ML,NULL,S,SS,UI,UIR,VAL,X
 S IENSC=$$IENS(.DA)
 ;
 S UI=0 F  S UI=$O(^TMP("DIKK",$J,"UIR",RFIL,UI)) Q:'UI  S KEY=^(UI) D  Q:$G(DIKKQUIT)
 . ;Get info about uniqueness index
 . D XRINFO^DIKCU2(UI,.UIR,"","","","",.SS)
 . ;
 . ;Set UIR=root incl X(n); VAL(n)=X(n) if >= maxlen; SS(n)=dec
 . K NULL,VAL,X
 . S S=0 F  S S=$O(SS(S)) Q:'S  D  Q:$G(DIKKQUIT)
 .. S FIL=$P(SS(S),U),FLD=$P(SS(S),U,2),ML=$P(SS(S),U,3)
 .. S SS(S)=^TMP("DIKK",$J,RFIL,FIL,FLD)
 .. X SS(S) I X="" D SETN^DIKK(FIL,IENSC,FLD,DITAR,.DIKKQUIT) S NULL=1
 .. Q:$G(NULL)
 .. I ML,$L(X)'<ML S VAL(S)=X
 .. S X(S)=X
 . Q:$G(NULL)
 . ;
 . ;Check matching indexes
 . S UIR=$NA(@UIR) Q:'$D(@UIR)
 . D:'$$UNIQIX(UIR,IENSC,.DA,.VAL,.SS) SETK^DIKK(RFIL,IENSC,KEY,DITAR,.DIKKQUIT)
 Q
 ;
UNIQUE(DIFILE,DIUINDEX,X,DA,DITMP) ;Check whether X values are unique
 N DIIENSC,DIMAXL,DIORD,DISS,DIUIR,DIVAL,S
 ;
 I $G(DITMP)="" N DIKKTMP D
 . S DITMP="DIKKTMP"
 . D LOADXREF^DIKC1("","","",DIUINDEX,"",DITMP)
 ;
 ;Get index reference
 D XRINFO^DIKCU2(DIUINDEX,.DIUIR,"",.DIMAXL)
 S DIUIR=$NA(@DIUIR)
 Q:'$D(@DIUIR) 1
 ;
 ;There's a matching index
 ;Set DIVAL(ss#) for those subscripts that may have been truncated
 S DIIENSC=$$IENS(.DA)
 S DIORD=0
 F  S DIORD=$O(DIMAXL(DIORD)) Q:'DIORD  D:$L(X(DIORD))'<DIMAXL(DIORD)
 . S S=+$G(@DITMP@(DIFILE,DIUINDEX,DIORD,"SS")) Q:'S
 . S DIVAL(S)=X(DIORD)
 . S DISS(S)=$G(@DITMP@(DIFILE,DIUINDEX,DIORD))
 Q $$UNIQIX(DIUIR,DIIENSC,.DA,.DIVAL,.DISS)
 ;
UNIQIX(DIUIR,DIIENSC,DA,DIVAL,DISS,DIEVK) ;
 ;Loop through the matching indexes; Return 1 if unique
 N DIDASV,DIIENS,DINDX,DINS,DION,DIS,DIUNIQ,I,L,X
 M DIDASV=DA
 S DION="N"
 ;
 S DIUNIQ=1,DINS=$QL(DIUIR),DINDX=DIUIR
 F  S DINDX=$Q(@DINDX) Q:DINDX=""  Q:$NA(@DINDX,DINS)'=DIUIR  D  Q:'DIUNIQ
 . ;Set DA array, quit if this is index for current record
 . S DIIENS=$E(DINDX,$L(DIUIR)+1,$L(DINDX)-1),L=$L(DIIENS,",")
 . S DA=$P(DIIENS,",",L) F I=1:1:L-1 S DA(I)=$P(DIIENS,",",L-I)
 . S DIIENS=$$IENS(.DA) Q:DIIENS=DIIENSC
 . ;
 . ;If values for this record are being updated via the FDA, don't
 . ;bother checking (used by DIEVK)
 . I $G(DIEVK) Q:$D(^TMP("DIKK",$J,"L",$P(DIEVK,U),$P(DIEVK,U,2),DIIENS))  Q:$D(^TMP("DIKK",$J,"F",$P(DIEVK,U),$P(DIEVK,U,2),DIIENS))
 . ;
 . ;If no values in index were truncated, values are not unique.
 . I '$D(DIVAL) S DIUNIQ=0 Q
 . ;
 . ;Set the X array for the indexed record and compare
 . S DIS=0 F  S DIS=$O(DIVAL(DIS)) Q:'DIS  X DISS(DIS) I X'=DIVAL(DIS) Q
 . S:'DIS DIUNIQ=0
 ;
 K DA M DA=DIDASV
 Q DIUNIQ
 ;
KEYCHK(DIFIL,DA,DIFLD,DIXREF,DIIENS,DITAR,DINEW) ;Check whether indexes
 ;in @DIXREF are unique
 N DIKEY,DIUINDEX,DIUNIQ,X
 I $G(DITAR)]"",$G(DIIENS)="" S DIIENS=$$IENS(.DA)
 ;
 S DIUNIQ=1,DIKEY=0
 F  S DIKEY=$O(^DD("KEY","F",DIFIL,DIFLD,DIKEY)) Q:'DIKEY  D  Q:'DIUNIQ
 . S DIUINDEX=$P(^DD("KEY",DIKEY,0),U,4)
 . Q:'DIUINDEX!'$D(@DIXREF@(DIFIL,DIUINDEX))
 . D SETXARR^DIKC(DIFIL,DIUINDEX,DIXREF,"",DINEW)
 . S DIUNIQ=$$UNIQUE(DIFIL,DIUINDEX,.X,.DA,DIXREF)
 . I 'DIUNIQ,$G(DITAR)]"" D SETK^DIKK(DIFIL,DIIENS,DIKEY,DITAR) S DIUNIQ=1
 I $G(DITAR)]"",$D(@DITAR) S DIUNIQ=0
 Q DIUNIQ
 ;
IENS(DA) ;Return IENS from DA array
 N I,IENS
 S IENS=$G(DA)_"," F I=1:1:$O(DA(" "),-1) S IENS=IENS_DA(I)_","
 Q IENS

DIKKDD
DIKKDD ;SFISC/MKO-DATA DICTIONARY CODE FOR KEY FILE ;1:49 PM  8 Sep 1997
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ITFLD ;Input transform for field
 Q:'$D(DA)  Q:'$D(DA(1))
 N DIKKFILE
 S DIKKFILE=$$GETFILE(.DA) I 'DIKKFILE K X Q
 ;
 N %,D,D0,DA,DDD,DIC,DICR,DIX,DO,DP,DZ,Y
 S DIC="^DD("_DIKKFILE_",",DIC(0)="EN",DIC("S")="I '$P(^(0),U,2)"
 D ^DIC
 I Y'>0 K X
 E  S X=+$P(Y,"E")
 Q
 ;
EHFLD ;Executable help for field
 Q:'$D(DA)  Q:'$D(DA(1))
 N DIKKFILE
 S DIKKFILE=$$GETFILE(.DA) Q:'DIKKFILE
 ;
 N %,D,D0,DA,DDD,DIC,DICR,DIX,DO,DP,Y
 S DIC="^DD("_DIKKFILE_",",DIC(0)="",D="B"
 S DIC("S")="I '$P(^(0),U,2)"
 S:$G(X)="??" DZ=X
 D DQ^DICQ
 Q
 ;
GETFILE(DA) ;
 Q:'$D(DA)  Q:'$D(DA(1))
 N DIKKFILE
 I $D(DDS) S DIKKFILE=$$GET^DDSVAL(.31,DA(1),.01)
 E  S DIKKFILE=$P($G(^DD("KEY",DA(1),0)),U)
 Q DIKKFILE

DIKKFORM
DIKKFORM ;SFISC/MKO-ENTRY POINTS FOR THE 'DIKC EDIT' FORM ;11:34 AM  16 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;==========================
 ; [DIKK EDIT] entry points
 ;==========================
 ;
PRIOVAL ;Validation on Priority (#1)
 Q:$P(^DD("KEY",DA,0),U,3)=X
 N PK
 I X="P" D
 . S PK=$O(^DD("KEY","AP",$$GET^DDSVAL(.31,DA,.01),"P",0)) Q:'PK
 . S DDSERROR=1
 . D HLP^DDSUTL($C(7)_"Primary Key '"_$P(^DD("KEY",PK,0),U,2)_"' is already defined on this file.")
 Q
 ;
UIVAL ;Validation on Uniqueness Index (#3)
 ;Index must be Regular, used for Lookup/Sorting, have no set/kill
 ;conditions, and consist only of field-type cross reference values
 ;with no transforms.
 Q:X=""
 N CRV,FIL,FLD,LN0,SS
 ;
 ;Check that Index is regular and has no set/kill condition
 I $P($G(^DD("IX",X,0)),U,4)'="R" D UIERR("Selected index is not a Regular index.") Q
 I $P($G(^DD("IX",X,0)),U,14)'="LS"!($E($P($G(^(0)),U,2))="A") D UIERR("Selected index is not used for Lookup.") Q
 D:$G(^DD("IX",X,1.4))'?."^" UIERR("Selected index has a Set Condition.")
 D:$G(^DD("IX",X,2.4))'?."^" UIERR("Selected index has a Kill Condition.")
 ;
 ;Check Cross Reference Values
 S CRV=0 F  S CRV=$O(^DD("IX",X,11.1,CRV)) Q:'CRV  D
 . S LN0=$G(^DD("IX",X,11.1,CRV,0))
 . I $P(LN0,U,2)'="F" D UIERR("Selected index has a computed value.") Q
 . I $G(^DD("IX",X,11.1,CRV,2))'?."^" D UIERR("Selected index has a value with a transform.") Q
 Q
 ;
UIERR(MSG) ;Set DDSERROR=1 and print MSG
 N X
 S DDSERROR=1
 D HLP^DDSUTL($C(7)_$G(MSG))
 Q
 ;
FORMDV ;Form-Level Data Validation
 ;In the Fields multiple, check that Sequence Numbers are unique and
 ;consecutive from 1.
 ;(Duplicate file/field combinations are checked automatically
 ;because they're key fields.)
 N DIKKDA,DIKKI,DIKKLIST,DIKKSQ
 ;
 ;Build list
 ;  DIKKLIST(seq#,ien)
 ;while checking for duplicates
 ;
 S DIKKDA(1)=DA
 S DIKKDA=0 F  S DIKKDA=$O(^DD("KEY",DA,2,DIKKDA)) Q:'DIKKDA  D
 . S DIKKSQ=$$GET^DDSVAL(.312,.DIKKDA,1)
 . I $D(DIKKLIST(DIKKSQ)) D
 .. D:'$D(DDSERROR) MSG^DDSUTL($C(7)_"UNABLE TO SAVE CHANGES")
 .. S DDSERROR=1
 .. D MSG^DDSUTL("The sequence number "_DIKKSQ_" is used more than once.")
 . E  S DIKKLIST(DIKKSQ,DIKKDA)=""
 ;
 ;If no duplicates, check that sequence numbers are consecutive from 1
 I '$D(DDSERROR) D
 . S DIKKSQ=0
 . F DIKKI=1:1 S DIKKSQ=$O(DIKKLIST(DIKKSQ)) Q:'DIKKSQ!$G(DDSERROR)  D:DIKKSQ'=DIKKI
 .. S DDSERROR=1
 .. D MSG^DDSUTL($C(7)_"UNABLE TO SAVE CHANGES")
 .. D MSG^DDSUTL("Sequence numbers must be consecutive numbers starting with 1.")
 Q
 ;
NAMEPAC ;Post-Action on Change for Name of Key
 N DIKKSD,DIKKUI
 ;
 S DIKKUI=$$GET^DDSVAL(.31,DA,3) Q:'DIKKUI
 S DIKKSD=$$GET^DDSVAL(.11,DIKKUI,.11)
 Q:DIKKSD'?1"Uniqueness Index for Key '"1A1"'".E
 ;
 S $E(DIKKSD,27)=X
 D PUT^DDSVAL(.11,DIKKUI,.11,DIKKSD)
 Q

DIKKP
DIKKP ;SFISC/MKO-PRINT KEYS ;9:52 AM  3 Mar 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;==============================
 ; PRINT(File,Field,Flag,.Page)
 ;==============================
 ;Print Keys defined a file
 ;In:
 ; FIL     = File #
 ; FLD     = Field # (optional) (ignored if FLAG [ M)
 ; FLAG    [ Cn : column tab stop from left margin
 ;         [ Ln : left margin (def=0)
 ;         [ M  : include subfiles (multiples) under File
 ;         [ S  : suppress line feed before listing
 ; PAGE("H") = Header text or M code that begins with a write statement
 ; PAGE("B") = Bottom margin
 ;Out:
 ; PAGE(U)   = Returns as 1, if timeout or ^ at eop
 ;
PRINT(FIL,FLD,FLAG,PAGE) ;Print keys
 Q:'$G(FIL)
 N FILETXT,LM,SB,SUB,TS,WID
 ;
 ;Initialize variables
 D INIT
 ;
 ;M flag, get and print keys for file and subfiles
 I FLAG["M" D
 . D SUBFILES^DIKCU(FIL,.SB)
 . S SUB=""
 . F  D  Q:PAGE(U)  S:SUB="" SUB="SUB",FIL=0 S FIL=$O(SB(FIL)) Q:'FIL
 .. Q:'$D(^DD("KEY","B",FIL))
 .. S FILETXT=SUB_"FILE #"_FIL
 .. I SUB]""!(FLAG'["S") D WRLN("",0,.PAGE) Q:PAGE(U)
 .. D WRLN(FILETXT,LM,.PAGE,2) Q:PAGE(U)
 .. D WRLN($TR($J("",$L(FILETXT))," ","-"),LM,.PAGE) Q:PAGE(U)
 .. D PRFILE(FIL,"",FLAG,.PAGE) Q:PAGE(U)
 ;
 ;Otherwise, print keys for one file
 E  D
 . I FLAG'["S" D WRLN("",0,.PAGE) Q:PAGE(U)
 . D PRFILE(FIL,$G(FLD),FLAG,.PAGE)
 Q
 ;
PRFILE(FIL,FLD,FLAG,PAGE) ;Print keys for a file
 Q:'$G(FIL)
 N KEY,NAM,SP
 I $G(FLAG)'["i" N LM,TS,WID D INIT
 ;
 I $G(FLD)="" D
 . S NAM="" F  S NAM=$O(^DD("KEY","BB",FIL,NAM)) Q:NAM=""  D  Q:PAGE(U)
 .. S KEY=0 F  S KEY=$O(^DD("KEY","BB",FIL,NAM,KEY)) Q:'KEY  D  Q:PAGE(U)
 ... I $G(SP) D WRLN("",0,.PAGE) Q:PAGE(U)
 ... D PRKEY(KEY,FLAG,.PAGE)
 ... S SP=1
 ;
 E  S KEY=0 F  S KEY=$O(^DD("KEY","F",FIL,FLD,KEY)) Q:'KEY  D  Q:PAGE(U)
 . I $G(SP) D WRLN("",0,.PAGE) Q:PAGE(U)
 . D PRKEY(KEY,FLAG,.PAGE)
 . S SP=1
 Q
 ;
PRKEY(KEY,FLAG,PAGE) ;Print one key
 Q:'$G(KEY)
 N FIL,FLD,FLDN,LN,LUI,LUIN,NAM,PRI,SEQ,TAB1,TXT,UI,UI0
 I $G(FLAG)'["i" N LM,TS,WID D INIT
 ;
 ;Print Priority, Key Name and Number
 Q:$G(^DD("KEY",KEY,0))?."^"
 S NAM=$P(^DD("KEY",KEY,0),U,2),PRI=$P(^(0),U,3),UI=$P(^(0),U,4)
 S:PRI]"" PRI=$$EXTERNAL^DILFD(.31,1,"",PRI)
 S TXT=PRI_" KEY: "
 S TXT=TXT_$J("",TS-$L(TXT))_NAM_" (#"_KEY_")"
 D WRLN(TXT,LM,.PAGE) Q:PAGE(U)
 ;
 ;Print Uniqueness Index
 I UI D
 . S UI0=$G(^DD("IX",UI,0))
 . K TXT S TXT=0,TXT(0)=$P(UI0,U,2)_" (#"_UI_")"
 . D:$P(UI0,U)'=$P(UI0,U,9) ADDSTR("  WHOLE FILE (#"_$P(UI0,U)_")",.TXT)
 . D WRAP^DIKCU2(.TXT,WID)
 . D WRLN("Uniqueness Index: "_TXT(0),LM+TS-18,.PAGE) Q:PAGE(U)
 . F LN=1:1 Q:'$D(TXT(LN))  D WRLN(TXT(LN),LM+TS,.PAGE) Q:PAGE(U)
 ;
 ;Print Lookup Indexes
 K TXT S TXT=0,TXT(0)=""
 S LUIN=0 F  S LUIN=$O(^DD("KEY",KEY,3.1,LUIN)) Q:'LUIN  D
 . S LUI=$P($G(^DD("KEY",KEY,3.1,LUIN,0)),U) Q:'LUI
 . S:TXT(TXT)]"" TXT(TXT)=TXT(TXT)_", "
 . D ADDSTR($P($G(^DD("IX",LUI,0)),U,2)_" (#"_LUI_")",.TXT)
 I TXT(0)]"" D  Q:PAGE(U)
 . D WRAP^DIKCU2(.TXT,WID)
 . D WRLN("Lookup Index(es): "_TXT(0),LM+TS-18,.PAGE) Q:PAGE(U)
 . F LN=1:1 Q:'$D(TXT(LN))  D WRLN(TXT(LN),LM+TS,.PAGE) Q:PAGE(U)
 ;
 ;Print Fields
 K TXT S TXT=0,TXT(0)=""
 S SEQ=0 F  S SEQ=$O(^DD("KEY",KEY,2,"S",SEQ)) Q:'SEQ  D  Q:PAGE(U)
 . S FLD=0 F  S FLD=$O(^DD("KEY",KEY,2,"S",SEQ,FLD)) Q:'FLD  D  Q:PAGE(U)
 .. S FIL=0 F  S FIL=$O(^DD("KEY",KEY,2,"S",SEQ,FLD,FIL)) Q:'FIL  D  Q:PAGE(U)
 ... S FLDN=0 F  S FLDN=$O(^DD("KEY",KEY,2,"S",SEQ,FLD,FIL,FLDN)) Q:'FLDN  D  Q:PAGE(U)
 .... Q:$G(^DD("KEY",KEY,2,FLDN,0))?."^"
 .... S:TXT(TXT)]"" TXT(TXT)=TXT(TXT)_"  "
 .... D ADDSTR(SEQ_")"_$C(0)_$P($G(^DD(FIL,FLD,0)),U)_" ("_FIL_","_FLD_")",.TXT)
 I TXT(0)]"" D  Q:PAGE(U)
 . D WRAP^DIKCU2(.TXT,WID)
 . D WRLN("File, Field: "_TXT(0),LM+TS-13,.PAGE) Q:PAGE(U)
 . F LN=1:1 Q:'$D(TXT(LN))  D WRLN(TXT(LN),LM+TS,.PAGE) Q:PAGE(U)
 Q
 ;
ADDSTR(X,TXT) ;Add string X to the TXT array
 I $L(TXT(TXT))+$L(X)>200 S TXT=TXT+1,TXT(TXT)=""
 S TXT(TXT)=TXT(TXT)_X
 Q
 ;
INIT ;Initialize module-wide variables
 Q:$G(FLAG)["i"
 S FLAG=$G(FLAG)_"i"
 S LM=$P(FLAG,"L",2)\1
 S TS=$P(FLAG,"C",2)\1 S:'TS TS=20
 S WID=$G(IOM,80)-1-LM-TS S:WID<1 WID=1
 S PAGE(U)=""
 Q
 ;
 ;===================================
 ; WRLN(Text,Tab,.Page,KeepWithNext)
 ;===================================
 ;Write a single line of text, precede with a !, do paging if necessary
 ;In:
 ; TXT       = Text to write; $C(0) replaced with spaces.
 ; TAB       = ?Tab before writing text (def=0)
 ; PAGE("H") = Header text or M code that begins with a write statement
 ;             If not passed in, no paging.
 ; PAGE("B") = Bottom margin
 ; KWN       = Additional padding on bottom margin ("keep with next")
 ;Out:
 ; PAGE(U)   = Returns as 1, if timeout or ^ at eop
 ;
WRLN(TXT,TAB,PAGE,KWN) ;Write a line of text
 N X
 S PAGE(U)=""
 ;
 ;Do paging, if necessary
 I $D(PAGE("H"))#2,$G(IOSL,24)-2-$G(PAGE("B"))-$G(KWN)'>$Y D  Q:PAGE(U)
 . I PAGE("H")?1"W ".E X PAGE("H") Q
 . I $E($G(IOST,"C"))="C" D  Q:PAGE(U)
 .. W $C(7) R X:$G(DTIME,300) I X=U!'$T S PAGE(U)=1
 . W @$G(IOF,"#"),PAGE("H")
 ;
 ;Write text
 W !?$G(TAB),$TR($G(TXT),$C(0)," ")
 Q

DIKKUTL
DIKKUTL ;SFISC/MKO-UTILITY OPTION TO DEFINE A KEY ;8:13 AM  7 Jun 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MOD ;Create/Modify/Edit a Key
 ;In:
 ; DI  = selected top level file#
 ; DIU = global root of file DI
 N DIKKCNT,DIKKFILE,DIKKEY,DIKKQUIT,DIKKROOT,DIKKTOP
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 ;Get subfile
 S DIKKROOT=DIU,DIKKTOP=DI,DIKKFILE=$$SUB^DIKCU(DI)
 S:'$G(DIKKFILE) DIKKFILE=DIKKTOP
 ;
REMOD ;Get and list keys on file DIKKFILE
 I $G(DIKKQUIT) W ! Q
 D GET^DIKKUTL2(DIKKFILE,.DIKKCNT)
 W ! D LIST^DIKKUTL2(.DIKKCNT)
 ;
 ;Prompt for action
 I 'DIKKCNT S Y="C"
 E  S Y=$$RD Q:Y=""
 ;
 ;Delete
 I Y="D" D  G REMOD
 . S DIKKEY=$$CHOOSE^DIKKUTL2(.DIKKCNT,"delete") Q:'DIKKEY
 . D DELETE(DIKKEY,DIKKTOP,DIKKFILE)
 ;
 ;Edit
 I Y="E" D  G REMOD
 . S DIKKEY=$$CHOOSE^DIKKUTL2(.DIKKCNT,"edit") Q:'DIKKEY
 . D EDIT(DIKKEY,DIKKTOP,DIKKFILE)
 ;
 ;Create
 I Y="C" D  G REMOD
 . S DIR(0)="Y",DIR("B")="No"
 . S DIR("A")="Want to create a new Key for this file"
 . D ^DIR K DIR I $D(DIRUT)!'Y S:'DIKKCNT DIKKQUIT=1 Q
 . D CREATE^DIKKUTL1(DIKKTOP,DIKKFILE)
 ;
 ;Verify
 I Y="V" D  G REMOD
 . S DIKKEY=$$CHOOSE^DIKKUTL2(.DIKKCNT,"verify") Q:'DIKKEY
 . D VERIFY^DIKKUTL3(DIKKEY,DIKKTOP,DIKKFILE)
 Q
 ;
DELETE(DIKKEY,DIKKTOP,DIKKFILE) ;Delete a Key
 N DIKKID,DIKKUI,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 ;Confirm deletion
 S DIR(0)="Y"
 S DIR("A")="Are you sure you want to delete the Key"
 S DIR("B")="No"
 D ^DIR K DIR Q:$D(DIRUT)!'Y
 ;
 ;Delete
 S DIKKUI=$P($G(^DD("KEY",DIKKEY,0)),U,4)
 S DIKKID=$$KEYID(DIKKEY,DIKKTOP,DIKKFILE)
 D DELKEY(DIKKEY,DIKKID)
 ;
 ;Ask/Delete Uniqueness Index
 I DIKKUI,'$D(^DD("KEY","AU",DIKKUI)) D
 . D DELUI(DIKKUI,DIKKTOP,DIKKFILE,DIKKID)
 Q
 ;
EDIT(DIKKEY,DIKKTOP,DIKKFILE) ;Edit a Key
 N DIKKCH,DIKKFLD,DIKKID,DIKKNO,DIKKOLD,DIKKUI0,DIKKUI1,DIKKUFLD
 N DA,DDSFILE,DR
 ;
REEDIT ;Come back here, if user chooses to re-edit the key
 S DIKKID=$$KEYID(DIKKEY,DIKKTOP,DIKKFILE)
 ;
 ;Save original UI, and set and kill logic of original UI
 ;Invoke form to edit key
 ;Set new UI
 S DIKKUI0=$P($G(^DD("KEY",DIKKEY,0)),U,4)
 K DIKKOLD
 D:DIKKUI0 LOADXREF^DIKC1(DIKKFILE,"","K",DIKKUI0,"","DIKKOLD")
 S DDSFILE=.31,DA=DIKKEY,DR="[DIKK EDIT]"
 D ^DDS K DDSFILE,DA,DR
 S DIKKUI1=$P($G(^DD("KEY",DIKKEY,0)),U,4)
 ;
 ;If UI was edited, rebuild it
 I DIKKUI0,DIKKUI0=DIKKUI1 D
 . N DIKKNEW,DIKKFLIS
 . Q:$G(DIKKOLD(DIKKFILE,DIKKUI0,"K"))=$G(^DD("IX",DIKKUI1,2))
 . W !,$C(7)_"The definition of the Uniqueness Index was modified."
 . D LOADXREF^DIKC1(DIKKFILE,"","S",DIKKUI0,"","DIKKNEW")
 . D GETFLIST^DIKCUTL(DIKKUI0,.DIKKFLIS)
 . D KSC^DIKCUTL3(DIKKTOP,.DIKKOLD,.DIKKNEW,.DIKKFLIS)
 K DIKKOLD
 ;
 ;If there was an old UI, and it's '= to new UI, ask/delete old UI
 I DIKKUI0,DIKKUI0'=DIKKUI1 D
 . D DELUI(DIKKUI0,DIKKTOP,DIKKFILE,DIKKID,DIKKEY)
 ;
 ;Quit if key was deleted.
 Q:$D(^DD("KEY",DIKKEY,0))[0
 ;
 ;Get fields in key and new UI
 D GETFLD^DIKKUTL2(DIKKEY,DIKKUI1,.DIKKFLD,.DIKKUFLD)
 ;
 ;If key has no fields and no UI, ask reedit/delete key
 I 'DIKKFLD,'DIKKUI1 D  G:DIKKCH<2 REEDIT Q
 . S DIKKCH=$$EORD^DIKKUTL4(DIKKID) Q:DIKKCH'=2
 . D DELKEY(DIKKEY,DIKKID)
 ;
 ;If key has fields but no UI, create one.
 I DIKKFLD,'DIKKUI1 D  G:DIKKCH=1 REEDIT Q:DIKKCH=2  G EDITEND
 . F  D  Q:DIKKCH'=3
 .. S DIKKCH=0
 .. D UICREATE^DIKKUTL1(DIKKEY,DIKKTOP,DIKKFILE,.DIKKNO)
 .. Q:'$G(DIKKNO)
 .. ;
 .. ;User aborted Uniqueness Index creation;
 .. ;Ask edit key/delete key/create UI
 .. W ! S DIKKCH=$$EDORC^DIKKUTL4 Q:DIKKCH'=2
 .. D DELKEY(DIKKEY,DIKKID)
 ;
 ;If neither key nor UI has fields, ask reedit/delete key
 I 'DIKKFLD,'DIKKUFLD D  G:DIKKCH<2 REEDIT Q
 . S DIKKCH=$$EORD^DIKKUTL4(DIKKID,1) Q:DIKKCH'=2
 . D DELKEY(DIKKEY,DIKKID)
 ;
 ;Compare fields in Key with fields in Uniqueness Index; quit if same
 G:$$GCMP^DIKCU2("DIKKFLD","DIKKUFLD") EDITEND
 ;
 ;Key has a UI but no fields; or fields and UI don't match.
 ;Prompt re-edit/make key fields match UI/or make UI match key fields
 S DIKKCH=$$RORM^DIKKUTL4(DIKKUFLD,DIKKFLD)
 ;
 ;Re-edit
 I DIKKCH=1 G REEDIT
 ;
 ;Make key fields match UI
 E  I DIKKCH=2 D
 . ;Delete all fields in Key
 . W !!,"  Modifying fields in Key ..."
 . N DA,DIK
 . S DIK="^DD(""KEY"","_DIKKEY_",2,",DA(1)=DIKKEY
 . S DA=0 F  S DA=$O(^DD("KEY",DIKKEY,2,DA)) Q:'DA  D ^DIK
 . K DA,DIK
 . ;
 . ;Add fields to Key
 . N DIKKFDA,DIKKIENS,DIKKSEQ
 . S DIKKSEQ=0 F  S DIKKSEQ=$O(DIKKUFLD(DIKKSEQ)) Q:'DIKKSEQ  D
 .. S DIKKIENS="+"_DIKKSEQ_","_DIKKEY_","
 .. S DIKKFDA(.312,DIKKIENS,.01)=$P(DIKKUFLD(DIKKSEQ),U,2)
 .. S DIKKFDA(.312,DIKKIENS,.02)=$P(DIKKUFLD(DIKKSEQ),U)
 .. S DIKKFDA(.312,DIKKIENS,1)=DIKKSEQ
 . D UPDATE^DIE("","DIKKFDA")
 . I '$D(DIERR) W "  DONE!"
 . E  D MSG^DIALOG(),EOP
 ;
 ;Make UI match key fields
 E  I DIKKCH=3 D UIMOD^DIKKUTL1(DIKKUI1,DIKKEY,DIKKTOP,DIKKFILE)
 ;
EDITEND ;
 S DIKKCH=$$CHECK Q:'DIKKCH
 ;
 W !!,"Checking key integrity ..."
 I $$INTEG^DIKK(DIKKTOP,"","",DIKKEY) W "  NO PROBLEMS" D EOP Q
 ;
 S DIKKCH=$$EDORI^DIKKUTL4
 I DIKKCH=2 G REEDIT
 I DIKKCH=1 D DELETE(DIKKEY,DIKKTOP,DIKKFILE)
 Q
 ;
DELUI(DIKKUI,DIKKTOP,DIKKFILE,DIKKID,DIKKEY) ;Delete the Uniqueness Index
 N I,MSG
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 ;If DIKKEY is passed in, quit if any key other than DIKKEY uses
 ;this index as a Uniqueness Index. (Index can't be deleted.)
 I $G(DIKKEY) D  Q:I
 . S I=0 F  S I=$O(^DD("KEY","AU",DIKKUI,I)) Q:'I  Q:I'=DIKKEY
 ;
 S MSG(0)="Do you want to delete the "_$$UIID(DIKKUI,DIKKTOP,DIKKFILE)_" previously used by "_$S($G(DIKKID)]"":DIKKID,1:"the Key")
 D WRAP^DIKCU2(.MSG)
 S DIR(0)="Y"
 F I=0:1 Q:'$D(MSG(I+1))  S DIR("A",I+1)=MSG(I)
 S DIR("A")=MSG(I)
 W ! D ^DIR K DIR S:$D(DTOUT) Y=1 Q:$D(DUOUT)!'Y
 D DELETE^DIKCUTL(DIKKUI,DIKKTOP,DIKKFILE)
 Q
 ;
DELKEY(DA,DIKKID) ;Call DIK to delete the key
 N DIK
 S DIK="^DD(""KEY""," D ^DIK
 W !!?2,$G(DIKKID)_" deleted."
 Q
 ;
UIID(UI,TOP,FILE) ;Return text that identifies uniqueness index
 Q:$D(^DD("IX",UI,0))[0 ""
 Q "'"_$P(^DD("IX",UI,0),U,2)_"' Uniqueness Index (#"_UI_") on "_$S(TOP'=FILE:"Subf",1:"F")_"ile #"_$P(^(0),U)
 ;
KEYID(KEY,TOP,FILE) ;Return string of text that identifies the key
 Q "Key '"_$P(^DD("KEY",KEY,0),U,2)_"' of "_$S(TOP'=FILE:"Subf",1:"F")_"ile #"_$P(^(0),U)
 ;
RD() ;Prompt for action
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="SAO^V:VERIFY;E:EDIT;D:DELETE;C:CREATE"
 S DIR("A")="Choose V (Verify)/E (Edit)/D (Delete)/C (Create): "
 S DIR("?",1)="Enter 'V' to verify the integrity of a Key."
 S DIR("?",2)="      'E' to edit an existing Key"
 S DIR("?",3)="      'D' to delete an existing Key"
 S DIR("?",4)="      'C' to create a new Key."
 W ! D ^DIR S:$D(DIRUT) Y=""
 Q Y
 ;
EOP ;Issue Press Return to continue prompt
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="E",DIR("A")="Press RETURN to continue"
 S DIR("?")="Press the RETURN or ENTER key."
 W ! D ^DIR
 Q
 ;
CHECK() ;Prompt whether to check key integrity
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR("A")="Do want to check the integrity of this key now"
 S DIR("?")="Enter 'Y' to run the key integrity checker."
 S DIR(0)="Y"
 W ! D ^DIR
 Q $S($D(DIRUT):0,1:Y)

DIKKUTL1
DIKKUTL1 ;SFISC/MKO-KEY CREATION ;10:08 AM  12 Jan 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
CREATE(DIKKTOP,DIKKFILE) ;Create a new key
 N DIKKEY,DIKKFDA,DIKKNAME,DIKKIEN
 ;
 ;Prompt for name
 S DIKKNAME=$$NAME(DIKKFILE) Q:DIKKNAME=-1
 ;
 ;Add new entry to Key file
 W !,"  Creating new Key '"_DIKKNAME_"' ..."
 S DIKKFDA(.31,"+1,",.01)=DIKKFILE
 S DIKKFDA(.31,"+1,",.02)=DIKKNAME
 S DIKKFDA(.31,"+1,",1)=$S($D(^DD("KEY","AP",DIKKFILE,"P")):"S",1:"P")
 D UPDATE^DIE("","DIKKFDA","DIKKIEN") I $D(DIERR) D MSG^DIALOG() Q
 ;
 S DIKKEY=DIKKIEN(1) K DIKKIEN
 D EDIT^DIKKUTL(DIKKEY,DIKKTOP,DIKKFILE)
 Q
 ;
UIMOD(DIXR,DIKKEY,DIKKTOP,DIKKFILE) ;Modify the UI to match the Key
 N DIKKERR,DIKKFLD,DIKKFLIS,DIKKID,DIKKMSG,DIKKNEW,DIKKOLD
 S DIKKID=$$KEYID(DIKKEY,DIKKTOP,DIKKFILE)
 ;
 ;Write message
 W !!,"  Modifying Uniqueness Index ..."
 ;
 ;Get list of fields and original kill logic
 D GETFLIST^DIKCUTL(DIXR,.DIKKFLIS)
 D LOADXREF^DIKC1(DIKKFILE,"","K",DIXR,"","DIKKOLD")
 ;
 ;Get list of fields in key
 D GETFLD(DIKKEY,.DIKKFLD)
 ;
 ;Stuff values into Uniqueness Index and fields into CRV multiple
 D STUFF(DIXR,$P(^DD("IX",DIXR,0),U),DIKKFILE,$P(^(0),U,2),.DIKKFLD,DIKKID)
 D DELCRV(DIXR)
 D ADDCRV(DIXR,.DIKKFLD)
 W "  DONE!"
 ;
 ;Get list of fields and new set logic.
 ;Kill old and set new index, and recompile input templates and xrefs.
 D GETFLIST^DIKCUTL(DIXR,.DIKKFLIS)
 D LOADXREF^DIKC1(DIKKFILE,"","S",DIXR,"","DIKKNEW")
 D KSC^DIKCUTL3(DIKKTOP,.DIKKOLD,.DIKKNEW,.DIKKFLIS)
 Q
 ;
UICREATE(DIKKEY,DIKKTOP,DIKKFILE,DIKKNO) ;Create a new UI for key
 ;Returns DIKKNO=1 if the Index could not be created.
 N DIERR,DIKKERR,DIKKFDA,DIKKFLIS,DIKKID,DIKKMSG,DIKKNAM,DIKKNEW,DIXR,I
 ;
 K DIKKNO
 S DIKKID=$$KEYID(DIKKEY,DIKKTOP,DIKKFILE)
 ;
 ;Write message
 K DIKKMSG
 S DIKKMSG(0)="I'm going to create a new Uniqueness Index to support "_DIKKID_"."
 D WRAP^DIKCU2(.DIKKMSG)
 W ! F I=0:1 Q:'$D(DIKKMSG(I))  W !,DIKKMSG(I)
 K I,DIKKMSG
 ;
 ;Get Index Name and list of fields
 S DIKKNAM=$$NAME^DIKCUTL1(DIKKFILE,"LS") I DIKKNAM=-1 S DIKKNO=1 Q
 D GETFLD(DIKKEY,.DIKKFLD)
 ;
 ;Add uniqueness index to Index file, and fields into CRV multiple
 D ADDUI(DIKKFILE,DIKKNAM,.DIXR) I DIXR=-1 S DIKKNO=1 Q
 D STUFF(DIXR,DIKKFILE,DIKKFILE,DIKKNAM,.DIKKFLD,DIKKID)
 D ADDCRV(DIXR,.DIKKFLD,.DIKKERR) I $G(DIKKERR) S DIKKNO=1 Q
 ;
 ;Set Uniqueness Index pointer in Key file
 S DIKKFDA(.31,DIKKEY_",",3)=DIXR
 D FILE^DIE("","DIKKFDA") I $D(DIERR) D MSG^DIALOG() S DIKKNO=1 Q
 K DIKKFDA
 ;
 ;Get new field list and set logic.
 ;Set new index and recompile input templates and xrefs.
 D GETFLIST^DIKCUTL(DIXR,.DIKKFLIS)
 D LOADXREF^DIKC1(DIKKFILE,"","S",DIXR,"","DIKKNEW")
 D KSC^DIKCUTL3(DIKKTOP,"",.DIKKNEW,.DIKKFLIS)
 Q
 ;
ADDUI(DIKKFILE,DIKKNAM,DIXR) ;Add new entry to Index file
 N DIKKFDA,DIKKIEN
 W !!,"  One moment please ..."
 S DIKKFDA(.11,"+1,",.01)=DIKKFILE
 S DIKKFDA(.11,"+1,",.02)=DIKKNAM
 D UPDATE^DIE("","DIKKFDA","DIKKIEN") I $D(DIERR) D MSG^DIALOG() Q
 S DIXR=DIKKIEN(1)
 Q
 ;
STUFF(DIXR,DIKKF01,DIKKFILE,DIKKNAM,DIKKFLD,DIKKID) ;Stuff other values into
 ;index
 N DIERR,DIKKFDA,DIKKILL,DIKKSET,DIKKWKIL
 ;
 ;Build logic
 D BLDLOG(DIKKF01,DIKKFILE,DIKKNAM,.DIKKFLD,.DIKKSET,.DIKKILL,.DIKKWKIL)
 ;
 ;Stuff values into other fields in Index file entry
 S DIKKFDA(.11,DIXR_",",.11)="Uniqueness Index for "_DIKKID
 S DIKKFDA(.11,DIXR_",",.2)="R"
 S DIKKFDA(.11,DIXR_",",.4)=$S(DIKKFLD>1:"R",1:"F")
 S DIKKFDA(.11,DIXR_",",.41)="IR"
 S DIKKFDA(.11,DIXR_",",.42)="LS"
 S DIKKFDA(.11,DIXR_",",.5)=$S(DIKKF01=DIKKFILE:"I",1:"W")
 S DIKKFDA(.11,DIXR_",",.51)=DIKKFILE
 S DIKKFDA(.11,DIXR_",",1.1)=DIKKSET
 S DIKKFDA(.11,DIXR_",",2.1)=DIKKILL
 S DIKKFDA(.11,DIXR_",",2.5)=DIKKWKIL
 D FILE^DIE("","DIKKFDA")
 I $D(DIERR) D MSG^DIALOG()
 Q
 ;
ADDCRV(DIXR,DIKKFLD,DIKKERR) ;Add fields to Cross-Reference Values multiple
 N DA,DD,DIC,DIERR,DIKKFDA,DIKKSS,DINUM,DO,X,Y
 ;
 S DIC("P")=$P(^DD(.11,11.1,0),U,2)
 F DIKKSS=1:1 Q:$D(DIKKFLD(DIKKSS))[0  D  Q:$G(DIKKERR)
 . ;Add subentry
 . S DIC="^DD(""IX"","_DIXR_",11.1,",DIC(0)="QL",DA(1)=DIXR
 . S (X,DINUM)=DIKKSS
 . K DD,DO D FILE^DICN K DA,DIC,DINUM
 . I Y=-1 S DIKKERR=1 Q
 . ;
 . ;Stuff other values
 . S DIKKFDA(.114,DIKKSS_","_DIXR_",",.5)=DIKKSS
 . S DIKKFDA(.114,DIKKSS_","_DIXR_",",1)="F"
 . S DIKKFDA(.114,DIKKSS_","_DIXR_",",2)=$P(DIKKFLD(DIKKSS),U,2)
 . S DIKKFDA(.114,DIKKSS_","_DIXR_",",3)=$P(DIKKFLD(DIKKSS),U)
 . D FILE^DIE("","DIKKFDA")
 . I $D(DIERR) D MSG^DIALOG() S DIKKERR=1
 Q
 ;
DELCRV(DIXR) ;Delete all entries in CRV multiple
 N DA,DIK
 S DIK="^DD(""IX"","_DIXR_",11.1,",DA(1)=DIXR
 S DA=0 F  S DA=$O(^DD("IX",DIXR,11.1,DA)) Q:'DA  D ^DIK
 Q
 ;
GETFLD(KEY,FLD) ;Get list fields in key
 ;In:
 ; KEY = key #
 ;Out:
 ; FLD = # subscripts
 ; FLD(subscript#) = field^file
 ;
 N DA,FD,FI,SQ
 K FLD S (FLD,SQ)=0
 F  S SQ=$O(^DD("KEY",KEY,2,"S",SQ)) Q:'SQ  D
 . S FD=$O(^DD("KEY",KEY,2,"S",SQ,0)) Q:'FD
 . S FI=$O(^DD("KEY",KEY,2,"S",SQ,FD,0)) Q:'FI
 . S DA=$O(^DD("KEY",KEY,2,"S",SQ,FD,FI,0)) Q:'DA
 . Q:$D(^DD("KEY",KEY,2,DA,0))[0
 . S FLD=FLD+1,FLD(FLD)=FD_U_FI
 Q
 ;
BLDLOG(DIKKF01,DIKKFILE,DIKKNAM,DIKKFLD,DIKKSET,DIKKILL,DIKKWKIL) ;
 ;Build the logic of the xref
 N DIKKLDIF,DIKKROOT,DIKKSS,L
 I 'DIKKFLD S (DIKKSET,DIKKILL)="Q",DIKKWKIL="" Q
 ;
 ;Build index root and entire kill logic
 I DIKKF01'=DIKKFILE S DIKKLDIF=$$FLEVDIFF^DIKCU(DIKKF01,DIKKFILE)
 E  S DIKKLDIF=0
 S DIKKROOT=$$FROOTDA^DIKCU(DIKKF01,DIKKLDIF_"O")_""""_DIKKNAM_""""
 S DIKKWKIL="K "_DIKKROOT_")"
 ;
 ;Build root for set/kill logic
 F DIKKSS=1:1 Q:$D(DIKKFLD(DIKKSS))[0  D
 . S DIKKROOT=DIKKROOT_","_$S($G(DIKKFLD)=1:"X",1:"X("_DIKKSS_")")
 ;
 ;Append DA(n) to root
 F L=DIKKLDIF:-1:1 S DIKKROOT=DIKKROOT_",DA("_L_")"
 S DIKKROOT=DIKKROOT_",DA)"
 ;
 ;Build set/kill logic
 S DIKKSET="S "_DIKKROOT_"=""""",DIKKILL="K "_DIKKROOT
 Q
 ;
NAME(DIKKFILE) ;Get next available Key name
 N DIKKNAME
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 S DIKKNAME=$O(^DD("KEY","BB",DIKKFILE,""),-1)
 S DIKKNAME=$S(DIKKNAME="":"A",1:$C($A(DIKKNAME)+1))
 ;
 S DIR(0)=".31,.02"
 S DIR("A")="Enter a Name for the new Key"
 S DIR("B")=DIKKNAME
 W ! F  D  Q:$D(X)!$D(DIRUT)
 . D ^DIR Q:$D(DIRUT)
 . Q:'$D(^DD("KEY","BB",DIKKFILE,X))
 . D NAMERR("A key already exists with this name.")
 Q $S($D(DIRUT):-1,1:X)
 ;
NAMERR(MSG) ;Invalid Index Name error
 W !!,$C(7)_$G(MSG),!
 K X
 Q
 ;
KEYID(KEY,TOP,FILE) ;Return string of text that identifies the key
 Q "Key '"_$P(^DD("KEY",KEY,0),U,2)_"' of "_$S(TOP'=FILE:"Subf",1:"F")_"ile #"_$P(^(0),U)
 ;

DIKKUTL2
DIKKUTL2 ;SFISC/MKO-KEY DEFINITION, SOME UTILITIES ;1:25 PM  17 Jul 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;==================
 ; GET(file,.count)
 ;==================
 ;Returns:
 ; CNT = # keys^file#
 ; CNT(keyName) = key#
 ; CNT(keyName,0) = file#^Name^Priority^UniqIndex
 ; CNT(keyName,seq#) = field#^file#^seq#
 ;
GET(FIL,CNT) ;Get information about keys on file FIL
 N FLD,KEY,NAM
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 K CNT S CNT=0
 S NAM="" F  S NAM=$O(^DD("KEY","BB",FIL,NAM)) Q:NAM=""  S KEY=$O(^(NAM,0)) Q:'KEY  D
 . I $G(^DD("KEY",KEY,0))?."^" D  Q
 .. K ^DD("KEY","B",FIL,KEY),^DD("KEY","BB",FIL,NAM,KEY)
 . S CNT=CNT+1
 . S CNT(NAM)=KEY
 . S CNT(NAM,0)=^DD("KEY",KEY,0)
 . S FLD=0 F  S FLD=$O(^DD("KEY",KEY,2,FLD)) Q:'FLD  D
 .. I $D(^DD("KEY",KEY,2,FLD,0))#2,+$P(^(0),U,3) S CNT(NAM,$P(^(0),U,3))=^(0)
 S $P(CNT,U,2)=FIL
 Q
 ;
 ;=====================
 ; LIST(.count,header)
 ;=====================
 ;List the keys in the CNT array
 ;In:
 ; CNT = Array of keys to print (obtained by GET call above)
 ; HDR = Text to print before listing
 ;        (default is 'Current Indexes[ on [sub]file #xxx]:')
 ;
LIST(CNT,HDR) ;
 I '$G(CNT) D  Q
 . W !,"There are no Keys defined on "_$$FSTR^DIKCUTL2($P(CNT,U,2))_"."
 ;
 N DIERR,FIL,FILE01,FLD,KEY,MSG,NAM,PRIO,SN,TAG,UI,UITXT
 ;
 ;Write header
 S:$G(HDR)="" HDR="Keys defined on "_$$FSTR^DIKCUTL2($P(CNT,U,2))_":"
 W !,HDR
 ;
 ;Loop through keys in CNT array
 S NAM="" F  S NAM=$O(CNT(NAM)) Q:NAM=""  D
 . S KEY=CNT(NAM)
 . S FILE01=$P(CNT(NAM,0),U),PRIO=$P(CNT(NAM,0),U,3)
 . S UI=$P(CNT(NAM,0),U,4)
 . I UI]"" D
 .. S UI=$G(^DD("IX",UI,0))
 .. S UITXT=$P(UI,U,2)
 .. S:$P(UI,U)'=$P(UI,U,9) UITXT=UITXT_";  Whole File (#"_$P(UI,U)_")"
 . W !!?2,NAM,?5,$$EXTERNAL^DILFD(.31,1,"",PRIO,"MSG")_" KEY"
 . W:UI]"" ?20,"Uniqueness Index: "_UITXT
 . ;
 . ;Loop through fields in key
 . S TAG="Field(s):  "
 . I $O(CNT(NAM,0)) S SN=0 F  S SN=$O(CNT(NAM,SN)) Q:'SN  D
 .. S FLD=$P(CNT(NAM,SN),U),FIL=$P(CNT(NAM,SN),U,2)
 .. W !?9,TAG_SN_") "_$P($G(^DD(FIL,FLD,0)),U)_" (#"_FLD_$S(FIL=FILE01:")",1:", from File #"_FIL)
 .. S TAG=$J("",11)
 Q
 ;
 ;=========================
 ; $$CHOOSE(.count,prompt)
 ;=========================
 ;Prompt for a key from the DIKKCNT array
 ;In:
 ; .DIKKCNT = Array contain key data (obtained by GET call above)
 ;  DIKCPR  = Action to include with the prompt
 ;Returns:
 ; Key ien (or 0, if none selected)
 ;
CHOOSE(DIKKCNT,DIKKPR) ;Choose a key
 Q:'$G(DIKKCNT) 0
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="FAO^1:30^K:$D(DIKKCNT(X))[0 X"
 S DIR("A")="Which Key do you wish to "_DIKKPR_"? "
 S:+DIKKCNT=1 DIR("B")=$O(DIKKCNT(0))
 S DIR("?")="^D LIST^DIKKUTL2(.DIKKCNT)"
 W ! D ^DIR I $D(DIRUT) Q 0
 Q DIKKCNT(Y)
 ;
 ;===================================================
 ; GETFLD(key#,uniqIndex#,.keyField,.uniqIndexField)
 ;===================================================
 ;Get the fields in key and uniqueness index
 ;In:
 ; KEY    = key ien
 ; UI     = uniqueness index ien
 ;Out:
 ; KEYFLD    = # items in array
 ; KEYFLD(I) = file^field
 ;  UIFLD    = # items in array
 ;  UIFLD(I) = file^field
 ;
GETFLD(KEY,UI,KEYFLD,UIFLD) ;
 N I,FIL,FLD,ORD,S
 ;
 ;Loop through "S" index on Sequence Number of the Field multiple
 ;of the Key and set the KEYFLD array
 S I=0 K KEYFLD
 I $G(KEY),$D(^DD("KEY",KEY,0))#2 D
 . S S=0 F  S S=$O(^DD("KEY",KEY,2,"S",S)) Q:'S  D
 .. S FLD=$O(^DD("KEY",KEY,2,"S",S,0)) Q:'FLD  S FIL=$O(^(FLD,0)) Q:'FIL
 .. S I=I+1,KEYFLD(I)=FIL_U_FLD
 S KEYFLD=I
 ;
 ;Loop through the "AC" index on Subscript Number of the Cross-
 ;Reference Values multiple of the Index file and set the UIFLD
 ;array
 S I=0 K UIFLD
 I $G(UI),$D(^DD("IX",UI,0))#2 D
 . S S=0 F  S S=$O(^DD("IX",UI,11.1,"AC",S)) Q:'S  D
 .. S ORD=$O(^DD("IX",UI,11.1,"AC",S,0)) Q:'ORD
 .. S FIL=$P($G(^DD("IX",UI,11.1,ORD,0)),U,3),FLD=$P($G(^(0)),U,4)
 .. Q:'FIL  Q:'FLD
 .. S I=I+1,UIFLD(I)=FIL_U_FLD
 S UIFLD=I
 Q

DIKKUTL3
DIKKUTL3 ;SFISC/MKO-VERIFY KEY INTEGRITY ;3:10 PM  27 Oct 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
VERIFY(DIKKEY,DIKKTOP,DIKKFILE) ;Verify key integrity
 N DIKKTEMP,POP,%ZIS
 ;
 ;Ask whether to save records in a template
 S DIKKTEMP=$$ASKTEMP(DIKKTOP)
 ;
 ;Select Device
 S %ZIS=$S($D(^%ZTSK):"Q",1:"")
 W ! D ^%ZIS Q:$G(POP)
 K %ZIS,POP
 ;
 ;Queue report
 I $D(IO("Q")) D  Q
 . N I,ZTSK
 . S ZTRTN="MAIN^DIKKUTL3"
 . S ZTDESC="KEY INTEGRITY CHECK"
 . F I="DIKKEY","DIKKTOP","DIKKFILE","DIKKTEMP" S ZTSAVE(I)=""
 . D ^%ZTLOAD
 . I $D(ZTSK)#2 W !,"Report queued!",!,"Task number: "_$G(ZTSK),!
 . E  W !,"Report canceled!",!
 . S IOP="HOME" D ^%ZIS
 ;
 U IO
 ;
MAIN ;Queued tasks enter here
 N DIKKHLIN,DIKKFIL,DIKKNAME,DIKKPAGE,DIKKTAB,DIKKUI,DIKKUIFL,DIKKUINM
 N DIKKIENS,DIKKFLD,DIKKFNAM,DIKKROOT,DIKKSUPP
 K ^TMP("DIKKUTL",$J)
 ;
 ;Check key integrity
 D INTEG^DIKK(DIKKTOP,"","",DIKKEY,"",1)
 I $D(DIERR) D MSG^DIALOG() Q
 ;
 ;Initialize "global" variables for report
 S DIKKPAGE=0
 S %H=$H D YX^%DTC
 S DIKKHLIN=$P(Y,"@")_"  "_$P($P(Y,"@",2),":",1,2)_"    PAGE "
 S DIKKTAB(1)=9,DIKKTAB(2)=41
 S DIKKNAME=$P($G(^DD("KEY",DIKKEY,0)),U,2)
 S DIKKUI=$P($G(^DD("KEY",DIKKEY,0)),U,4)
 S DIKKUINM=$P($G(^DD("IX",+DIKKUI,0)),U,2),DIKKUIFL=$P($G(^(0)),U)
 ;
 ;Print first header
 W:$E(IOST,1,2)="C-" @IOF
 D HDR
 I '$D(^TMP("DIKKTAR",$J)) W !!," ** NO PROBLEMS **" G END
 ;
 ;Loop through target error and list problems
 S DIKKFIL=0
 F  S DIKKFIL=$O(^TMP("DIKKTAR",$J,DIKKFIL)) Q:'DIKKFIL!$D(DIRUT)  D
 . D COLHDR
 . S DIKKROOT=$$FROOTDA^DIKCU(DIKKFIL)
 . S DIKKIENS=" "
 . F  S DIKKIENS=$O(^TMP("DIKKTAR",$J,DIKKFIL,DIKKIENS)) Q:DIKKIENS=""!$D(DIRUT)  D
 .. D:$D(^TMP("DIKKTAR",$J,DIKKFIL,DIKKIENS,"K",DIKKEY)) KEYERR(DIKKFIL,DIKKIENS,DIKKEY,DIKKROOT)
 .. S (DIKKSUPP,DIKKFLD)=0
 .. F  S DIKKFLD=$O(^TMP("DIKKTAR",$J,DIKKFIL,DIKKIENS,DIKKFLD)) Q:'DIKKFLD!$D(DIRUT)  D FLDERR(DIKKFIL,DIKKIENS,DIKKFLD,DIKKROOT,.DIKKSUPP)
 .. Q:$D(DIRUT)
 .. D W()
 ;
END D:'$D(DIRUT) EOPREAD
 ;
 ;Save in template, cleanup, and quit
 D:$G(DIKKTEMP) SAVETEMP(DIKKTEMP)
 K ^TMP("DIKKTAR",$J)
 I $D(ZTQUEUED) S ZTREQ="@"
 E  X $G(^%ZIS("C"))
 Q
 ;
KEYERR(RFIL,IENS,KEY,ROOT) ;
 D WRREC(RFIL,IENS,DIKKTAB(1),.ROOT) Q:$D(DIRUT)
 W ?DIKKTAB(2),"Duplicate Key "_$P($G(^DD("KEY",KEY,0)),U,2)_" (#"_KEY_")"
 Q
 ;
FLDERR(FIL,IENS,FLD,ROOT,SUPP) ;
 I '$G(SUPP) D  Q:$D(DIRUT)
 . D WRREC(FIL,IENS,DIKKTAB(1),.ROOT) Q:$D(DIRUT)
 . W ?DIKKTAB(2),"Missing Key Field(s):"
 D W($P($G(^DD(FIL,FLD,0)),U)_" ["_FIL_","_FLD_"]",DIKKTAB(2)+1)
 S SUPP=1
 Q
 ;
WRREC(FILE,IENS,TAB,ROOT) ;Write the record info
 N DA,DIERR,ENAM,MSG
 S:$G(ROOT)="" ROOT=$$FROOTDA^DIKCU(FILE)
 D DA(IENS,.DA) Q:$D(DIRUT)
 S ENAM=$P($G(@ROOT@(DA,0)),U)
 S:ENAM]"" ENAM=$$EXTERNAL^DILFD(FILE,.01,"",ENAM,"MSG")
 W ?TAB,$S(ENAM]"":ENAM,1:"Unknown record name")
 Q
 ;
W(STR,TAB,KWN) ;Write STR
 I $Y+3+$G(KWN)'<IOSL D  Q:$D(DIRUT)
 . D EOP Q:$D(DIRUT)
 . D HDR,COLHDR
 W !?+$G(TAB),$G(STR)
 Q
 ;
EOP ;Check whether task should be stopped
 I $D(ZTQUEUED),$$S^%ZTLOAD S (ZTSTOP,DIRUT)=1 Q
 D EOPREAD Q:$D(DIRUT)
 W @IOF
 Q
 ;
EOPREAD ;
 Q:$E(IOST,1,2)'="C-"!$D(ZTQUEUED)
 N DIR,DIROUT,DTOUT,DUOUT,X,Y
 S DIR(0)="E" W ! D ^DIR
 Q
 ;
HDR ;Write page header
 S DIKKPAGE=$G(DIKKPAGE)+1
 S $X=0 W "KEY INTEGRITY CHECK"
 W ?(IOM-$L(DIKKHLIN)-$L(DIKKPAGE)-1),DIKKHLIN_DIKKPAGE
 W !,$TR($J("",IOM-1)," ","-")
 W !,"             Key: "_DIKKNAME_" (#"_DIKKEY_"), File #"_DIKKFILE
 W !,"Uniqueness Index: "_DIKKUINM_" (#"_DIKKUI_")"
 W:DIKKFILE'=DIKKUIFL ", Whole File #"_DIKKUIFL
 Q
 ;
COLHDR ;Write column headers
 N FNAM
 S FNAM=$P($G(^DD(DIKKFIL,.01,0)),U)
 D W() Q:$D(DIRUT)
 D W("ENTRY #","",2) Q:$D(DIRUT)  W ?DIKKTAB(1),FNAM,?DIKKTAB(2),"ERROR"
 W !,"-------",?DIKKTAB(1),$TR($J("",$L(FNAM))," ","-"),?DIKKTAB(2),"-----"
 Q
 ;
ASKTEMP(DIKKTOP) ;Ask for a template name
 N DDA,DIC,DICKL,DIR,DIROUT,DIRUT,DIU0,DK,DQ,DTOUT,DUOUT
 N C,D,D1,D1,D2,D3,D4,I,J,L,O,X,Y
 ;
 S DK=DIKKTOP
 D S2^DIBT1 Q:Y<0!$D(DIRUT) ""
 Q +Y
 ;
SAVETEMP(Y) ;Save records in template Y
 N CNT,DK,FILE,FLD,IENS,REC
 S (CNT,FILE)=0 F  S FILE=$O(^TMP("DIKKTAR",$J,FILE)) Q:'FILE  D
 . S IENS="" F  S IENS=$O(^TMP("DIKKTAR",$J,FILE,IENS)) Q:IENS=""  D
 .. S REC=$P(IENS,",",$L(IENS,",")-1)
 .. S:$D(^DIBT(+Y,1,REC))[0 CNT=CNT+1,^DIBT(+Y,1,REC)=""
 S:CNT>0 ^DIBT(+Y,"QR")=DT_U_CNT
 Q
 ;
DA(IENS,DA) ;Given IENS, write ien's and setup DA array
 N I
 D W("","",$L(IENS,",")-2) Q:$D(DIRUT)
 K DA
 F I=$L(IENS,",")-1:-1:2 S DA(I-1)=$P(IENS,",",I) W DA(I-1),!
 S DA=$P(IENS,",") W DA
 Q
 ;

DIKKUTL4
DIKKUTL4 ;SFISC/MKO-KEY DEFINITION, READER PROMPTS ;10:01 AM  15 Jul 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;==================
 ; $$RORM(ufld,fld)
 ;==================
 ;Prompt for method to resolve difference between fields in key
 ;and fields in uniqueness index.
 ; Called from EDIT when key fields and UI fields don't match.
 ;In:
 ; $G(DIKKUFLD) : include option 2 (there are UI fields)
 ; $G(DIKKFLD)  : include option 3 (there are key fields)
 ;Returns:
 ; 1 : Re-edit the key
 ; 2 : Make key match UI (default on ^, timeout when UI fields exist)
 ; 3 : Make UI match key (default on ^, timeout when no UI fields)
 ;
RORM(DIKKUFLD,DIKKFLD) ;
 N DIKKOPT,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 W !!,"The Key fields and the fields in the Uniqueness Index don't match."
 S DIR(0)="S^1:Re-Edit the Key",DIKKOPT=1
 S:$G(DIKKUFLD) DIKKOPT=2,DIR(0)=DIR(0)_";2:Make Key match Uniqueness Index (also selected on up-arrow)"
 S:$G(DIKKFLD) DIKKOPT=DIKKOPT+1,DIR(0)=DIR(0)_";"_DIKKOPT_":Make Uniqueness Index match Key"_$S(DIKKOPT=2:" (also selected on up-arrow)",1:"")
 D ^DIR
 I '$G(DIKKUFLD) Q $S($D(DIRUT):3,Y=2:3,1:Y)
 Q $S($D(DIRUT):2,1:Y)
 ;
 ;===========================
 ; $$EDORD(KeyIdString,flag)
 ;===========================
 ;Prompt edit or delete the key.
 ; Called from EDIT^DIKKUTL when there are no key fields and
 ; either no Uniqueness Index or no UI fields.
 ;In:
 ; DIKKID = string that identifies the key -- used in message
 ; DIKKFL = controls message (there are neither key nor UI fields)
 ;Returns:
 ; 1 : Re-edit the key
 ; 2 : Delete the key (default on ^, timeout)
 ;
EORD(DIKKID,DIKKFL) ;Choose to edit or delete the key.
 N DIKKMSG,DIR,DIROUT,DIRUT,DTOUT,DUOUT,I,X,Y
 ;
 ;Write message that key definition is incomplete
 I '$G(DIKKFL) S DIKKMSG(0)=$C(7)_"NOTE: "_DIKKID_" has neither fields nor a Uniqueness Index defined."
 E  S DIKKMSG(0)=$C(7)_"NOTE: "_DIKKID_" and its Uniqueness Index have no fields defined."
 D WRAP^DIKCU2(.DIKKMSG,-7,0)
 W ! F I=0:1 Q:'$D(DIKKMSG(I))  W !,@$S(I:"?6",1:"?0"),DIKKMSG(I)
 ;
 ;Prompt 'Re-edit' or 'Delete'
 S DIR(0)="S^1:Re-edit the Key;2:Delete the Key (also selected on up-arrow)"
 D ^DIR
 Q $S($D(DIRUT):2,1:Y)
 ;
 ;==========
 ; $$EDORC
 ;==========
 ;Prompt whether edit key, delete key, or create a Uniqueness Index.
 ;  Called from EDIT^DIKKUTL when the user chose to create a new UI
 ;  but failed to provide a name for that Index.
 ;Returns:
 ; 1 : Re-edit the key
 ; 2 : Delete the key (default on ^, timeout)
 ; 3 : Create a new Uniqueness Index
 ;
EDORC() ;Choose to edit key, delete key, or create a Uniqueness Index
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 W !,$C(7)_"NOTE: All Keys must have a Uniqueness Index defined."
 S DIR(0)="S^1:Re-edit the Key;2:Delete the Key (also selected on up-arrow);3:Create a Uniqueness Index"
 S DIR("?")="All Keys must have a Uniqueness index defined."
 D ^DIR
 Q $S($D(DIRUT):2,1:Y)
 ;
 ;==========
 ; $$EDORI
 ;==========
 ;Prompt whether to delete, re-edit, or ignore
 ; Called from EDIT^DIKKUTL when the key fails integrity check.
 ;Returns:
 ; 1 : Delete the Key
 ; 2 : Re-Edit the Key
 ; 3 : Ignore problem
 ;
EDORI() ;Choose to edit key, delete key, or create a Uniqueness Index
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 ;
 W !!,$C(7)_"ERROR: The key is not unique and/or some records have key field values missing."
 S DIR(0)="S^1:Delete the Key (also selected on up-arrow);2:Re-Edit the Key;3:Ignore problem (Be sure to fix later)"
 S DIR("?")="The Key is invalid because it is not unique and/or some records have missing key field values."
 D ^DIR
 Q $S($D(DIRUT):1,1:Y)

DIKZ
DIKZ ;SFISC/XAK-XREF COMPILER ;1JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I $G(DUZ(0))'="@" W:$D(^DI(.84,0)) $C(7),$$EZBLD^DIALOG(101) Q
EN1 N DIKJ,%X D:'$D(DISYS) OS^DII
 I '$D(^DD("OS",DISYS,"ZS")) W $C(7),$$EZBLD^DIALOG(820) Q
 S U="^" S:'$G(DTIME) DTIME=300
 D SIZ^DIPZ0(8036) G:$D(DTOUT)!($D(DUOUT))!('X) Q1 S DMAX=X
FILE K DIC S DMAX=X,DIC="^DIC(",DIC(0)="AEQ" D ^DIC G Q1:Y'>0 N DIPZ S DIPZ=+Y
 D RNM^DIPZ0(8036) G:$D(DTOUT)!($D(DUOUT))!(X="") Q1 S DNM=X
 W ! S DIR(0)="Y",DIR("A")=$$EZBLD^DIALOG(8020) D ^DIR K DIR G:'Y!($D(DIRUT)) Q1
 S X=DNM,Y=DIPZ K DIPZ
EN ;
 S Y(1)=$$EZBLD^DIALOG(8036),Y(3)=Y D BLD^DIALOG(8024,.Y,"","DIR") W:'$G(DIKZS) !!,DIR,! K Y(1),Y(3)
 K ^UTILITY($J),^UTILITY("DIK",$J) N DIK,DIFILENO
 S DNM=X,(DH,DIFILENO)=+Y I $D(^DIC(+Y,0,"GL")) S DIK2=^("GL")
 I '$D(DIK2)!(DMAX<2400) G Q
 S X=DH D DELETROU^DIEZ(DNM),A^DIU21,WAIT^DICD:'$G(DIKZS),DT^DICRW ;DELETE OLD ROUTINES, DELETE "DIK" NODES
 S (DRN,DIKZQ,T)=0,DMAX=DMAX-100
 ;
 ;Load indexes defined in Index file
 N DIXRLIST,DIKMF
 K ^TMP("DIKC",$J)
 D LOADALL^DIKC1(DIFILENO,"KS","R","",$NA(^TMP("DIKC",$J)),"",.DIKMF)
 ;
 ; compile kill logic
 S (DIKA,A)=1,X=2,DIKVR="DIKILL",DIK=DIK2
 D Q2,NEWR S ^UTILITY($J,0,3)=" S DIKZK="_X
 S DIKGO="^"_DNM_1 ;starting ROUTINE name
 D ^DIKZ0 G:DIKZQ Q D RTE
 ;
 ; compile set logic
 S (DIKA,A)=1,X=1,DIKVR="DISET",DIK=DIK2
 D Q2,NEWR S ^UTILITY($J,0,3)=" S DIKZK="_X
 S DIKGO=DIKGO_",^"_DNM_DRN
 D ^DIKZ0 G:DIKZQ Q D RTE
 ;
 ; compile driver code
 D Q2,^DIKZ1
 ;
 ; finish up
 S:'DIKZQ ^DD(DIFILENO,0,"DIKOLD")=DNM
Q I DIKZQ S X=DH(1) D A^DIU21
Q1 K DH,X,Y,DIK4,DIKQ,DIKC,T,DV,DIK8,DU,DW,DW1,DIKGO,DRN,DNM,DTOUT,DIRUT,DIROUT,DUOUT,DIC,A,%,%H,%Y
 K DIKVR,DIK6,DIKA,DIKR,DMAX,DIK2,DIKCT,DIK1,DIK0,^UTILITY($J),^("DIK"),DIK,DIKZQ,DIKZZ,DIKZZ1,DIKZOVFL
 K ^TMP("DIKC",$J)
Q2 K DIKRT,DIKLW,DIKL2
 Q
SV ; transfer the accumulated code in ^UTILITY($J,#) to ^UTILITY($J,0,#)
 ; (the routine buffer) and call SAVE to flush the buffer into a routine
 ; whenever it's full. Flush the buffer one more time when done.
 S DNM(1)=DNM_DRN
 F DIKR=0:0 S DIKR=$O(^UTILITY($J,DIKR)) Q:DIKR'>0  S %=^(DIKR) K ^(DIKR) D:T+$L(%)>DMAX  S ^UTILITY($J,0,DIKR)=%,T=T+$L(%)+2
 . N DIKZMORE S DIKZMORE=1 D SAVE
 D SAVE
 Q
SAVE ; save the accumulated code in ^UTILITY($J,0,#) as a routine
 I DIKR,$E($P(%," ",2))="." F  D  Q:$E($P(%," ",2))'="."
 . S ^UTILITY($J,DIKR)=%
 . S DIKR=$O(^UTILITY($J,0,DIKR),-1),%=^(DIKR) K ^(DIKR)
 I $D(DIKLW),'DIKR S ^UTILITY($J,0,997)=" G:'$D(DIKLM) "_$C(64+DIKCT)_$S(DNM_DRN'=DNM(1):"^"_DNM(1),1:"")_" Q:$D("_DIKVR_")"
 I $D(DIKLW),DIKR S ^UTILITY($J,0,998)=" G ^"_DNM_(DRN+1)
 S ^UTILITY($J,0,999)="END "_$S($D(DIKRT)&'DIKR:"Q",1:"G "_$S(DIKR&($D(DIKLW)):"END",1:"")_U_DNM_(DRN+1))
 N X,DIR S X=DNM_DRN X ^DD("OS",DISYS,"ZS") S X(1)=X D BLD^DIALOG(8025,.X,"","DIR") W:'$G(DIKZS) !,DIR S:$G(DIKZRLA)]"" @DIKZRLA@(DNM_DRN)="",DIKZRLAF=1
 D NEWR:'$D(DIKRT)!$G(DIKZMORE) Q:DIKZQ  S ^DD(DH,0,"DIK")=DNM K DIKL2
 Q
NEWR ;
 I '$D(DIKRT),T,$D(%),T+$L(%)>DMAX S DIKZDH=+$P(^UTILITY($J,0,1),"#",2)
 K ^UTILITY($J,0) S DIKR=4,T=0,DRN=DRN+1 I $L(DNM_DRN)>8 W:'$G(DIKZS) $C(7),!,DNM_DRN_$$EZBLD^DIALOG(1503) S:$G(DIKZRLA)]"" DIKZRLAF=0 S DIKZQ=1 Q
 S ^UTILITY($J,0,1)=DNM_DRN_" ; COMPILED XREF FOR FILE #"_$S($D(DIKZDH):DIKZDH,1:DH)_" ; "_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3),^(2)=" ; "
 K DIKZDH Q
RTE ;
 N DIKFIL,DIKSUB,DIKLIST,DIKP
 ;Build DIKSUB(file)=subfile1,subfile2,... list
 S DIKFIL=0 F  S DIKFIL=$O(DIK(X,DIKFIL)) Q:'DIKFIL  D
 . S DIKSUB=0 F  S DIKSUB=$O(^DD(DIKFIL,"SB",DIKSUB)) Q:'DIKSUB  D
 .. S:$D(DIK(X,DIKSUB))#2 DIKSUB(DIKFIL)=$G(DIKSUB(DIKFIL))_DIKSUB_","
 ;
 ;Build DIKLIST(file)=subfile1,subfile2,...
 M DIKLIST=DIKSUB
 S DIKFIL=0 F  S DIKFIL=$O(DIKSUB(DIKFIL)) Q:'DIKFIL  D
 . S DIKP=0
 . F  D  Q:DIKP'<($L(DIKLIST(DIKFIL),",")-1)
 .. F DIKP=DIKP+1:1:$L(DIKLIST(DIKFIL),",")-1 D
 ... S DIKSUB=$P(DIKLIST(DIKFIL),",",DIKP)
 ... S DIKLIST(DIKFIL)=DIKLIST(DIKFIL)_$G(DIKSUB(DIKSUB))
 K DIKSUB
 ;
 ;Convert file numbers in DIKLIST to routine list
 S DIKFIL=0 F  S DIKFIL=$O(DIKLIST(DIKFIL)) Q:'DIKFIL  D
 . S $E(DIKLIST(DIKFIL),$L(DIKLIST(DIKFIL)))=""
 . S DIKLIST(DIKFIL)=DIKFIL_","_DIKLIST(DIKFIL)
 . F DIKP=1:1:$L(DIKLIST(DIKFIL),",") D
 .. S DIKSUB=$P(DIKLIST(DIKFIL),",",DIKP)
 .. S $P(DIKLIST(DIKFIL),",",DIKP)=DIK(X,DIKSUB)
 ;
 ;Move list to DIK
 M DIK(X)=DIKLIST
 K DIKFIL,DIKLIST,DIKP
 S DIKRT=1,A=A-1,DH=DH(1) G SV
 ;
EN2(Y,DIKZFLGS,X,DMAX,DIKZRLA,DIKZZMSG) ;Silent or Talking with parameter passing
 ;and optionally return list of routines built and if successful
 ;FILE#,FLAGS,ROUTINE,RTNMAXSIZE,RTNLISTARRAY,MSGARRAY
 ;Y=FILE NUMBER (required)
 ;FLAGS="T"alk (optional)
 ;X=ROUTINE NAME (required)
 ;DMAX=ROUTINE SIZE (optional)
 ;DIKZRLA=ROUTINE LIST ARRAY, by value (optional)
 ;DIKZZMSG=MESSAGE ARRAY (optional) (default ^TMP)
 ;*
 ;DIKZS will be used to indicate "silent" if set to 1
 ;Write statements are made conditional, if not "silent"
 ;*
 N DIKZS,DNM,DIQUIET,DIKZRIEN,DIKZRLAZ,%X,DIKJ,DIR,DIKZRLAF,DK1
 N DIK,DIC,%I,DICS
 S DIKZS=$G(DIKZFLGS)'["T"
 S:DIKZS DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D
 .N Y,DIKZFLGS,X,DMAX,DIKZRLA,DIKZS
 .D INIZE^DIEFU
 I $G(Y)'>0 D BLD^DIALOG(1700,"File Number missing or invalid") G EN2E
 I '$D(^DD(Y,0)) D BLD^DIALOG(1700,"File Number: "_Y_" Invalid") G EN2E
 I $G(X)']"" D BLD^DIALOG(1700,"Routine name missing") G EN2E
 I X'?1U.NU&(X'?1"%"1U.NU) D BLD^DIALOG(1700,"Routine name invalid") G EN2E
 I $L(X)>7 D BLD^DIALOG(1700,"Routine name too long") G EN2E
 S DIKZRLA=$G(DIKZRLA,"DIKZRLAZ"),DIKZRIEN=Y
 S:DIKZRLA="" DIKZRLA="DIKZRLAZ" S:$G(DMAX)<2500!($G(DMAX)>^DD("ROU")) DMAX=^DD("ROU")
 S DIKZRLAF=""
 K @DIKZRLA
 D EN
 G:'DIKZS!(DIKZRLAF) EN2E
 D BLD^DIALOG(1700,"Compiling Cross-references (FILE#:"_DIKZRIEN_")"_$S(DIKZRLAF=0:", routine name too long",1:""))
EN2E I 'DIKZS D MSG^DIALOG() Q
 I $G(DIKZZMSG)]"" D CALLOUT^DIEFU(DIKZZMSG)
 Q
 ;
 ;DIALOG #101    'only those with programmer's access'
 ;       #820    'no way to save routines on the system'
 ;       #8020   'Should the compilation run now?'
 ;       #8024   'Compiling template name Input template of file n'
 ;       #8036   'Cross-References'
 ;       #8025   'Routine filed'
 ;       #1503   'routine name is too long...'

DIKZ0
DIKZ0 ;SFISC/XAK-XREF COMPILER ;23AUG2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIK0=" I X'=""""" D DD^DIK,A,SD Q:DIKZQ
RET I $D(DK1) S A=A+1,DIKA=1,DH=0 F  S DH=$O(DK1(DH)) Q:DH'>0  D E^DIK
 S:DH="" DH=-1 I $D(DK1) K DK1 D SD Q:DIKZQ  G RET
 Q
SD F DH=DH(1):0 S DH=$O(DU(DH)) Q:DH'>0  S:$D(^DD(DH,"SB")) DK1(DH)="" D DD1^DIK,0 Q:DIKZQ  S:$D(^DD(DH,"IX"))!$D(^TMP("DIKC",$J,DH)) DIK(X,DH)="A1^"_DNM_DRN K:'$D(^DD(DH,"IX"))&'$D(^TMP("DIKC",$J,DH)) DIK(X,DH) K DU(DH)
 Q
0 ;
 D SV^DIKZ Q:DIKZQ  S DIK1=""
 I $D(DIKA) S DIK1=" S DA("_A_")=DA"_$S(A=1:"",1:"("_(A-1)_")")
 F DIKL2=A-1:-1:1 S DIK1=DIK1_" S DA("_DIKL2_")=0"
 S ^UTILITY($J,DIKR+1)=DIK1_" S DA=0",DIKR=DIKR+2,^(DIKR)="A1 ;"
 D ^DIKZ2 K DIKA S DIKLW=1
 S DIKR=DIKR+1,DIK=DIK2_DIK8(DH),^UTILITY($J,DIKR)=A_" ;",DIKR=DIKR+1
A ;
 K DIK6 F DIKQ=0:0 S DIKQ=$O(^UTILITY("DIK",$J,DH,DIKQ)) Q:DIKQ'>0  I $G(DIKVR)="DISET"!(DIKQ'=.01) S %=^(DIKQ) S:+%'=% %=""""_%_"""" D PUT
 I $G(DIKVR)="DIKILL",$D(^UTILITY("DIK",$J,DH,.01)) S DIKQ=.01,%=^(.01) S:+%'=% %=""""_%_"""" D PUT
 D INDEX
 K ^UTILITY("DIK",$J),DIK6
 Q
PUT N DIKSET I '$D(DIK6(%)) S ^UTILITY($J,DIKR)=" S DIKZ("_%_")=$G("_DIK_"DA,"_%_"))",DIK6(%)=""
 S DIKR=DIKR+1,(DIKSET,^UTILITY($J,DIKR))=" "_$P(^UTILITY("DIK",$J,DH,DIKQ,0),"^(X)")_"DIKZ("_%_")"_$P(^(0),"^(X)",2,9)
 F DIKC=0:0 S DIKC=$O(^UTILITY("DIK",$J,DH,DIKQ,DIKC)) S DIKR=DIKR+1 Q:DIKC'>0  D
 .S %=^(DIKC) S:$O(^(0))'=DIKC ^UTILITY($J,DIKR)=DIKSET,DIKR=DIKR+1
 .I %["Q:"!(%[" Q") K DIK6 S ^UTILITY($J,DIKR)=DIK0_" X ^DD("_DH_","_DIKQ_",1,"_DIKC_","_X_")" Q
 .I %["D RCR" K DIK6 S ^UTILITY($J,DIKR)=DIK0_" D",DIKR=DIKR+2,^(DIKR-1)=" .N DIK,DIV,DIU,DIN",^UTILITY($J,DIKR)=" ."_^UTILITY("DIK",$J,DH,DIKQ,DIKC,0) Q
 .I %["S XMB=" S ^UTILITY($J,DIKR)=DIK0_",$D(DIK(0)),DIK(0)[""B"" S DIKZR="_DIKC_",DIKZZ="_DIKQ_" D BUL^"_DNM,DIKR=DIKR+1,^UTILITY($J,DIKR)=DIK0_",'$D(DIKOZ) "_$S($L(%)<225:%,1:"X ^DD("_DH_","_DIKQ_",1,"_DIKC_","_X_")") Q
 .S ^UTILITY($J,DIKR)=DIK0_" "_$S(%[" AUDIT":"S DH="_DH_",DV="_DIKQ_",DU="_A_" ",1:"")_%_$S(%[" AUDIT":"^DIK1",1:"")
 Q
 ;
 ;
INDEX ;Loop through ^TMP and pick up cross references for file DH
 N DIKO,DIKCTAG
 S DIKCTAG=0
 ;
 ;Build code for each xref
 S DIKC=0 F  S DIKC=$O(^TMP("DIKC",$J,DH,DIKC)) Q:'DIKC  D GETINDEX
 D:DIKCTAG LINE("CR"_(DIKCTAG+1)_" K X")
 Q
 ;
GETINDEX ;Get code for one index DIKC in file DH
 I DIKVR="DIKILL",$G(^TMP("DIKC",$J,DH,DIKC,"K"))?."^" Q
 I DIKVR="DISET",$G(^TMP("DIKC",$J,DH,DIKC,"S"))?."^" Q
 ;
 N DIKF,DIKCOD,DIKO,DIK01
 S DIKCTAG=DIKCTAG+1
 D LINE("CR"_DIKCTAG_" S DIXR="_DIKC)
 ;
 ;Build code to set X array
 S DIKF=$O(^TMP("DIKC",$J,DH,DIKC,0)) Q:'DIKF
 D LINE(" K X")
 S DIKO=0 F  S DIKO=$O(^TMP("DIKC",$J,DH,DIKC,DIKO)) Q:'DIKO  D XARR
 D LINE(" S X=$G(X("_DIKF_"))")
 ;
 ;Build code to check for null subscripts
 S DIKCOD="",DIKO=0
 F  S DIKO=$O(^TMP("DIKC",$J,DH,DIKC,DIKO)) Q:'DIKO  D:$G(^(DIKO,"SS"))
 . S DIKCOD=DIKCOD_$E(",",DIKCOD]"")_"$G(X("_DIKO_"))]"""""
 D LINE($S(DIKCOD]"":" I "_DIKCOD_" D",1:" D")) ;**GFT -- NOIS ISL-0604-50146 **
 D LINE(" . K X1,X2 M X1=X,X2=X")
 ;
 I DIKVR="DIKILL" D
 . ;Adjust .01 values X2 array if we're deleting a record
 . I $D(DIK01) D
 ..S DIKCOD="",DIKO=0 F  S DIKO=$O(DIK01(DIKO)) Q:'DIKO  D  ;**GFT -- NOIS ISL-0604-50146 **
 ... S DIKCOD=DIKCOD_$E(",",DIKCOD]"")_"X2("_DIKO_")"
 .. Q:DIKCOD=""
 .. S:DIKF=$O(DIK01(0)) DIKCOD="X2,"_DIKCOD
 .. S:DIKCOD["," DIKCOD="("_DIKCOD_")"
 .. D LINE(" . S:$D(DIKIL) "_DIKCOD_"=""""")
 . ;
 . ;Get kill condition code
 . S DIKCOD=$G(^TMP("DIKC",$J,DH,DIKC,"KC"))
 . I DIKCOD'?."^" D
 .. D LINE(" . N DIKXARR M DIKXARR=X S DIKCOND=1")
 .. D LINE(" . "_DIKCOD)
 .. D LINE(" . S DIKCOND=$G(X) K X M X=DIKXARR")
 .. D LINE(" . Q:'DIKCOND")
 . ;Get kill logic
 . D LINE(" . "_$G(^TMP("DIKC",$J,DH,DIKC,"K")))
 ;
 I DIKVR="DISET" D
 . ;Get set condition code
 . S DIKCOD=$G(^TMP("DIKC",$J,DH,DIKC,"SC"))
 . I DIKCOD'?."^" D
 .. D LINE(" . N DIKXARR M DIKXARR=X S DIKCOND=1")
 .. D LINE(" . "_DIKCOD)
 .. D LINE(" . S DIKCOND=$G(X) K X M X=DIKXARR")
 .. D LINE(" . Q:'DIKCOND")
 . ;Get set logic
 . D LINE(" . "_$G(^TMP("DIKC",$J,DH,DIKC,"S")))
 K DIK6 Q
 ;
XARR ;Build code to set X array
 ;Also return DIK01(order#)="" if crv is .01 field
 N CODE,NODE,REF,LINE,TRANS
 ;K DIK01
 ;
 ;Build data extraction code
 S CODE=$G(^TMP("DIKC",$J,DH,DIKC,DIKO)) Q:CODE?."^"
 I $D(^TMP("DIKC",$J,DH,DIKC,DIKO,"F"))#2 D
 . S DIK01(DIKO)=""
 . S REF=$P($P(CODE,",",1,$L(CODE,",")-2),"(",2,999)
 . S NODE=$P($P(REF,",",$L(REF,",")),"))")
 . I '$D(DIK6(NODE)) D
 .. D LINE(" S DIKZ("_NODE_")="_REF)
 .. S DIK6(NODE)=""
 . S LINE=" "_$P(CODE,REF)_"DIKZ("_NODE_")"_$P(CODE,REF,2,999)
 E  S LINE=" "_CODE
 ;
 S TRANS=$G(^TMP("DIKC",$J,DH,DIKC,DIKO,"T"))
 I TRANS'?."^" D
 . D LINE(LINE)
 . D DOTLINE(" I $G(X)]"""" "_TRANS)
 . D LINE(" S:$D(X)#2 X("_DIKO_")=X")
 E  I $G(NODE)]"",LINE?1" S X=".E D
 . D LINE(" S X("_DIKO_")"_$E(LINE,5,999))
 E  D
 . D LINE(LINE)
 . D LINE(" S:$D(X)#2 X("_DIKO_")=X")
 Q
 ;
DOTLINE(CODE) ;Add code to ^UTILITY. If the code looks like it contains
 ;a Quit command, put the code under a do-dot structure.
 I CODE[" Q"!(CODE["Q:") D
 . D LINE(" D")
 . D LINE(" . "_CODE)
 E  D LINE(CODE)
 Q
 ;
LINE(CODE) ;Add line of code to ^UTILITY, increment DIKR
 S ^UTILITY($J,DIKR)=CODE
 S DIKR=DIKR+1
 Q

DIKZ1
DIKZ1 ;SFISC/XAK-XREF COMPILER ;1:52 PM  7 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NEWR ;
 K ^UTILITY($J) S DRN=""
 S ^UTILITY($J,0,1)=DNM_" ; DRIVER FOR COMPILED XREFS FOR FILE #"_DH(1)_" ; "_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3),^(2)=" ; "
 S ^UTILITY($J,0,3)=" N DH,DU,DIKILL,DISET,DIKJ,DIKZ,DIKYR,DIKZA,DIK0Z,DIKZK,DIKDP,DIKM1,DIKUP,DIKUM,DV,DIIX,DIKF,DIAU,DIKNM,DIKDA,DIKLK,DIKLM,DIKY,DIXR,DIKCOND,DIKSVDA,DIKPUSH,X1,X2"
 S ^UTILITY($J,0,4)=" I '$D(DIKSAT) S DIKLK=DIK_DA_"")"" L +@DIKLK:10 K:'$T DIKLK"
 S ^UTILITY($J,0,5)=" D DI I '$D(DIKSAT),$D(DIKLK) L -@DIKLK"
 S ^UTILITY($J,0,6)=" G Q"
 S ^(7)="DI S DIKM1=0,DIKUM=0,DA(0)="""",DV=0 F  S DV=$O(DA(DV)) Q:DV'>0  S DIKUM=DIKUM+1,DIKUP(DV)=DA(DV)"
 S ^(8)=" S:DV="""" DV=-1 S DH(1)="_DH(1)_",DIKUP=DA"
 S ^(9)=" I $D(DIKKS) D:DIKZ1=DH(1) "_$P(DIKGO,",")_" S DA=DIKUP D:DIKZ1=DH(1) "_$P(DIKGO,",",2)_" D:DIKZ1'=DH(1) KILL D:DIKZ1'=DH(1) DA D:DIKZ1'=DH(1) SET D DA Q"
 S ^(10)=" I $D(DIKIL) D:DIKZ1=DH(1) "_$P(DIKGO,",")_" S:DIKZ1=DH(1) DIKM1=1 D:DIKZ1'=DH(1) KILL S DA=DIKUP D:DIKM1>0 KIL1 D DA Q"
 S ^(11)=" I $D(DIKST) D:DIKZ1=DH(1) "_$P(DIKGO,",",2)_" D:DIKZ1'=DH(1) SET D DA Q"
 S ^(12)=" I $D(DIKSAT) D SET1 D DA Q"
 S ^(13)=" Q"
 S ^(14)="DA K DA F DV=1:1 Q:'$D(DIKUP(DV))  S DA(DV)=DIKUP(DV)"
 S ^(15)=" S DA=DIKUP Q"
 S ^(16)="SET1 S (DA,DCNT)=0"
 S ^(17)=" S DU=$E(DIK,1,$L(DIK)-1),DIKLK=$S(DIK["","":DU_"")"",1:DU) L +@DIKLK:10 K:'$T DIKLK"
 S ^(18)="C I @(""$O(""_DIK_""DA))'>0"") S DA=$$C1(DA),^(0)=$P(@(DIK_""0)""),U,1,2)_U_DA_U_DCNT K DCNT L:$D(DIKLK) -@DIKLK Q"
 S ^(19)=" S (DIKY,DA)=$O(^(DA)) G C:$P($G(^(DA,0)),U)']"""" S DU=1,DCNT=DCNT+1 S:DA="""" (DIKY,DA)=-1 D:DIKZ1=DH(1) "_$P(DIKGO,",",2)_" D:DIKZ1'=DH(1) SET D:DIKZ1'=DH(1) DA K DB(0) S DA=DIKY G C"
 S ^(20)=" Q"
 S ^(21)="C1(A) Q:$P($G(@(DIK_""A,0)"")),U)]"""" A"
 S ^(22)=" F  S @(""A=+$O(""_DIK_""A),-1)"") Q:$P($G(@(DIK_""A,0)"")),U)]""""!(A'>0)"
 S ^(23)=" Q A"
 S ^(24)="KILL S DIKILL=1,DIKZK=2",DIKR=24,X=2 D SUB
 S DIKR=DIKR+1,^(DIKR)=" Q"
 S DIKR=DIKR+1,^(DIKR)="SET S DISET=1,DIKZK=1 K DIKPUSH",X=1 D SUB
 F DIK8=1:1 S DIKRT=$T(TEXT+DIK8) Q:DIKRT=""  S ^(DIKR+DIK8)=$E(DIKRT,4,999)
 S (DRN,DIKR)="",T=0
 F DIKZZ=0:0 S DIKZZ=$O(^UTILITY($J,0,DIKZZ)) Q:DIKZZ'>0  S %=^(DIKZZ),T=T+$L(%) I T>DMAX S DIKZOVFL=1 D OVFL^DIKZ11 Q
 S T=0 I $D(DIKZOVFL) D SAVE^DIKZ K ^UTILITY($J,0) F DIKZZ=0:0 S DIKZZ=$O(^UTILITY($J,"OVFL",DIKZZ)) Q:DIKZZ'>0  S %=^(DIKZZ) S ^UTILITY($J,0,DIKZZ)=%
 I $D(DIKZOVFL) S DRN=0 K ^UTILITY($J,"OVFL")
 G SAVE^DIKZ
 ;
SUB F DIK8=0:0 S DIK8=$O(DIK(X,DIK8)) Q:DIK8'>0  S DIKR=DIKR+1,^(DIKR)=" I DIKZ1="_DIK8_","_$P(DIK2(DIK8),",",4)_" S "_$P(DIK2(DIK8),",",3)_" D "_DIK(X,DIK8)_" Q"
 Q
TEXT ;;
 ;; Q
 ;;KIL1 K @(DIK_"DA)") Q:'$D(^(0))
 ;; S Y=^(0),DH=$S($O(^(0))'>0:0,1:$P(Y,U,4)-1),X=$P($P(Y,U,3),U,DH>0) D 3:X=DA
 ;; S ^(0)=$P(Y,U,1,2)_U_X_U_DH
 ;; Q
 ;;Q K DIKGP,DIKZ1 Q
 ;; ;
 ;;3 I X>1,$D(^(X-1)) S X=X-1 Q
 ;; S DV=1 F X=X:1 S X=X+DV,DV=DV+1 I $O(^(X))'>0 S DU=X-2,DV=1 Q
 ;;L S X=$O(^(DU)) Q:X>0  S DU=DU-DV,DV=DV+1 S:DU<0 DU=0 G L
 ;; Q
 ;;BUL S DIKOZ=1,DIKZA=$P("CREA^DELE",U,DIKZK)_"TE VALUE"
 ;; I $D(^DD(DIKZ1,DIKZZ,1,DIKZR,DIKZA)) W "...(`",^(DIKZA),"` BULLETIN WILL NOT BE TRIGGERED) " Q

DIKZ11
DIKZ11 ;SFISC/DCM-XREF COMPILER ;9/3/93  13:44
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
OVFL ;
 S ^UTILITY($J,"OVFL",1)=DNM_0_" ; DRIVER FOR COMPILED XREFS FOR FILE !"_DH(1)_" (cont); "_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3),^(2)=" ; "
 S ^UTILITY($J,0,7)=" I $D(DIKKS) D:DIKZ1=DH(1) "_$P(DIKGO,",")_" S DA=DIKUP D:DIKZ1=DH(1) "_$P(DIKGO,",",2)_" D:DIKZ1'=DH(1) KILL D:DIKZ1'=DH(1) DA D:DIKZ1'=DH(1) SET"_U_DNM_0_" D DA Q"
 S ^UTILITY($J,0,9)=" I $D(DIKST) D:DIKZ1=DH(1) "_$P(DIKGO,",",2)_" D:DIKZ1'=DH(1) SET"_U_DNM_0_" D DA Q"
 S ^UTILITY($J,0,17)=" S (DIKY,DA)=$O(^(DA)) G C:$P($G(^(DA,0)),U)']"""" S DU=1,DCNT=DCNT+1 S:DA="""" (DIKY,DA)=-1 D:DIKZ1=DH(1) "_$P(DIKGO,",",2)_" D:DIKZ1'=DH(1) SET"_U_DNM_0_" D:DIKZ1'=DH(1) DA K DB(0) S DA=DIKY G C"
 F DIKZZ=0:0 S DIKZZ=$O(^UTILITY($J,0,DIKZZ)) Q:DIKZZ=""  S %=^(DIKZZ) I $E(%,1,4)="SET " D OVFL1 Q
 Q
OVFL1 S DIKZZ1=4,^UTILITY($J,"OVFL",DIKZZ1)=% K ^UTILITY($J,0,DIKZZ)
 F  S DIKZZ=$O(^UTILITY($J,0,DIKZZ)) Q:DIKZZ=""  S %=^(DIKZZ) Q:$E(%,1,5)="KIL1 "  S DIKZZ1=DIKZZ1+1,^UTILITY($J,"OVFL",DIKZZ1)=% K ^UTILITY($J,0,DIKZZ)
 Q

DIKZ2
DIKZ2 ;SFISC/XAK-XREF COMPILER ;1:52 PM  7 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIKR=DIKR+1
 S DIK1=" I $D("_DIKVR_") K DIKLM S:DIKM1="_A_" DIKLM=1"
 I A>1 D
 . S DIK1=DIK1_" S:DIKM1'="_A_"&'$G(DIKPUSH("_A_")) DIKPUSH("_A_")=1,"
 . F DIK4=A:-1:2 S DIK8=DIK4-1,DIK1=DIK1_"DA("_DIK4_")=DA("_DIK8_"),"
 . S DIK1=DIK1_"DA(1)=DA,DA=0"
 . F DIK4=2:1:A-1 S DIK1=DIK1_" S:DIKM1<"_DIK4_" DA("_(A-DIK4)_")=0"
 S ^UTILITY($J,DIKR)=DIK1_" G @DIKM1"
 S DIKR=DIKR+1,DIKCT=0 I A>1 D DAR
 S ^UTILITY($J,DIKR)=A-1_" ;",DIKR=DIKR+1
 D:DIKVR="DIKILL" WFK
 S DIKCT=DIKCT+1,DIKL2=A-1,DIK1=$C(64+DIKCT)_" S DA=$O("_DIK2_DIK8(DH)_"DA))"
 S ^UTILITY($J,DIKR)=DIK1_" I DA'>0 S DA=0 "_$S(DIKL2=0:"",1:"Q:DIKM1="_DIKL2_"  ")_"G "_$S(A'<2:$C(64+A-1),1:"END"),DIKR=DIKR+1
 K DIK6
 Q
CRT ;
 I '$D(^DD(DV,"IX")),'$D(^TMP("DIKC",$J,DV)) K DU(DV) Q
 S DIK(X,DV)="",DIK4(DV)=DW,DIK2(DV)="DA("_A_"),,DIKM1="_A_",DIKUM'<"_A
 I A=1 S DIK8(DV)=$P(DIK2(DV),",",1,2)_DIK4(DV)_","
 E  I $D(DIK2(DH)) S DIKC=DV,DIK8(DV)="" F DIK8=1:1:A D
 . S DIK8(DV)="DA("_DIK8_"),"_DIK4(DIKC)_","_DIK8(DV)
 . S DIKC=^DD(DIKC,0,"UP")
 Q
DAR ;
 S (DIKC,DIK1,%,DIKL2)=1,DIKQ=0
 F DIK8=A-1:-1:1 S DIKC=DIKC+2,DIKCT=DIKCT+1,DIK4=" S DA("_DIK8_")=$O("_DIK2_$P(DIK8(DH),",",1,DIKC)_"))" S:'$D(%) ^UTILITY($J,DIKR)=DIKL2_" ;",DIKR=DIKR+1,DIKL2=DIKL2+1 K % D DAR2 K DIK1
 Q
DAR2 ;
 S ^UTILITY($J,DIKR)=$C(64+DIKCT)_DIK4_" I DA("_DIK8_")'>0 S DA("_DIK8_")=0 "_$S($D(DIK6)&('$D(DIK1)):"Q:DIKM1="_DIKQ_"  ",1:"")_"G "_$S($D(DIK1):"END",1:$C(64+DIKCT-1)),DIKR=DIKR+1,DIKQ=DIKQ+1,DIK6=1
 Q
 ;
WFK ;Get whole file kill xrefs
 N DIKXR,DIKKW,DIKKW0,DIKCODE
 S DIKXR=0 F  S DIKXR=$O(^TMP("DIKC",$J,"KW",DH,DIKXR)) Q:'DIKXR  D
 . S DIKKW=$G(^TMP("DIKC",$J,"KW",DH,DIKXR))
 . Q:DIKKW?."^"!(DIKKW="Q")
 . S DIKKW0=$G(^TMP("DIKC",$J,"KW",DH,DIKXR,0))
 . I DIKKW0="" D DOTLINE^DIKZ0(" "_DIKKW) Q
 . Q:$P(DIKKW0,U)'="W"
 . ;
 . ;Build code to push down DA array
 . S DIKCODE=$$BCPDA(A,$P(DIKKW0,U,2))
 . I DIKCODE]"" D LINE^DIKZ0(" "_DIKCODE)
 . D DOTLINE^DIKZ0(" "_DIKKW)
 . I DIKCODE]"" D LINE^DIKZ0(" K DA M DA=DIKSVDA")
 Q
 ;
BCPDA(LEV,RFILE) ;Build code to push down DA array
 N DIFF,COD,I,RLEV
 S RLEV=$$FLEV^DIKCU(RFILE)
 S DIFF=RLEV-LEV
 Q:DIFF<1 ""
 ;
 S COD=""
 F I=RLEV:-1:DIFF S COD=COD_"DA("_I_")=DA("_(I-DIFF)_"),"
 F I=DIFF-1:-1:0 S COD=COD_"DA("_I_")=0,"
 I COD]"" D
 . S COD=$E(COD,1,$L(COD)-1)
 . F  Q:COD'["DA(0)"  S COD=$P(COD,"DA(0)")_"DA"_$P(COD,"DA(0)",2,999)
 . S COD="K DIKSVDA M DIKSVDA=DA S "_COD
 Q COD

DIL
DIL ;SFISC/GFT/XAK-TURN PRINT FLDS INTO CODE ;31DEC2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LOOP F DD=1:1 S W=$P(R,$C(126),DD) G Q:W="" S:DIWL DIWL=9 D DM I DIO D  S DIO=0
 .S DN=-8 Q:DIO=1
 .I DIO=3 D UN
 .S DIWR(DM)=DX,Y=" D 0^DIWW" D PX
 ;
DM I DM G UP:$P(W,F)]"" S W=$P(W,F,2,999)
 I W[";Y" S DE="" D W:DG S I=+$P(W,";Y",2),DG=0,Y=DE_" F Y=0:0 Q:$Y>"_$S(I>0:I-2,1:"(IOSL"_(I-2)_")")_"  W !" S:I>0 M(DP)=I D PX S O=999
 G ^DIL1:'W,^DIL11:W?.NP1",".E,^DIL1:$P(W,";",1)'=+W K DPQ(DP,+W)
 D DE,^DIL0 G T:DU=DN I $P(X,U,2)["C" S DN=-2 G PX
 S DN=DU,Y=" S X=$G("_DI_C_DN_"))"_Y
PX ;
 I DHT G PX^DIPZ1:DHT<0 S ^UTILITY($J,DV)=$E(Y,2,999),Y="",DV=DV+1 Q
 S DX=DX+1 G PX:$D(^UTILITY($J,99,DX)) S ^(DX)=$E(Y,2,999)
 D DX(DX)
 S O=0
Q Q
 ;
DE S DE="" I W[";S" D W:DG S I=+$P(W,";S",2),DG=0 S:'I I=1 S M(DP)=M(DP)+I,DE=DE_" D T Q:'DN " F I=I:-1:1 S DE=DE_" D N"
 I $P(W,";C",2) S DIC=$P(W,";C",2) S:DIC<0 DIC=IOM+DIC+1 D W:DIC<DG S DG=DIC-1 I 1
 I DN=-4!$T S DE=DE_" D N:$X>"_DG_" Q:'DN "
 S DE=DE_" W ?"_DG Q
W ;
 D DIWR^DIL0:$D(DIWR)
A ;FROM DIP5 AND DIPZ & above
 S M(DP)=M(DP)+1 I DHD D COLHEADS(.DHD)
 I $D(DIOSUBHD) S:DIOSUBHD<2 DIOSUBHD=2 D COLHEADS(.DIOSUBHD)
 Q
 ;
 ;
COLHEADS(DHD) ;TAKE COLUMN HEADERS AND STORE THEM AS WRITE STATEMENTS, STARTING AT ^UTILITY($J,DHD)
 N V,I,Z,%
 S I=99,V="" F  S V=$O(^UTILITY("DIL",$J,V)) Q:V=""  S Z=$O(^(V,0)) I I>Z S I=Z
 F I=I:1:99 S Z="W !" D  I Z'="W !" D U
 .S V="" F  S V=$O(^UTILITY("DIL",$J,V)) Q:V=""  I $D(^(V,I)) S %=$G(^($O(^(0))-I+99)) D
 ..F  Q:%'?1" ".E  S V=V+1,%=$E(%,2,999)
 ..I $L(Z)+$L(%)>245 D U
 ..S Z=Z_",?"_V_","""_%_""""
 K ^UTILITY("DIL",$J)
 Q
U S ^UTILITY($J,DHD)=Z,DHD=DHD+1,Z="W """"" Q
 ;
 ;
SUBHEADS ;
 N X
 S X=$$EZBLD^DIALOG(7095) ;"PAGE"
 W:$X+30>IOM !
 W ?IOM-30,$$NOW^DIUTL,"  "
 I $G(DC) W ?IOM-$L(X)-4,X," ",DC
 F X=1.5:0 S X=$O(^UTILITY($J,X)) Q:X>50!'X  X ^(X)
 Q
 ;
D ;
 D PX:DHT<1 S F(DM)=DX,R(DX)=DP(DM),R(DX,1)=M(DP(DM)),F=F_W_",",DM=DM+1,DIL=DIL+1,DD=DD-1 I DHT+1 S DX=$S('DHT:900,1:DX) D:DHT PX Q
 G DE^DIPZ1
 ;
UP D UN G DM
 ;
UNSTACK ;
 D UN Q:'DM  G UNSTACK
 ;
UN ;
 D DIWR^DIL0:$D(DIWR(DM))
 D:DHT<0 UP^DIPZ1 S O=999,DN=-8,DM=DM-1,DIL=DIL-1,DP=DP(DM),DX=+$S(DM:F(DM),1:0),F=$P(F,",",1,DM)_$E(",",DM>0),DY=DY(DM),DI=DI(DM)
 I $D(DIL(DM)) S Y=" K J("_DIL0_"),I("_DIL0_")",DIL=DIL(DM),DIL0=DIL(DM,0) K DIL(DM) F X=DIL0:1 S %=X#100,V="I("_X_",0)",Y=Y_" S:$D("_V_") D"_%_"="_V I X=DIL G PX
 Q
 ;
O ;
 D DE,DN^DIL0
T ;
 G PX:'$D(^UTILITY($J,99,DX))!DIO,PX:$L(^(DX))+$L(Y)+O>240 S ^(DX)=^(DX)_Y Q
 ;
DX(DX) ;If we're in sub-fields, another UTILITY node needs to invoke node DX
 Q:'DM
 N Y
 S Y=F(DM-1) D IF S ^(Y)=^UTILITY($J,99,Y)_$S($T:",^UTILITY($J,99,",1:" X ^UTILITY($J,99,")_DX_")"
 I $T,$L(^UTILITY($J,99,Y))>99 F O=500:1 I '$D(^(O)) S ^(Y)=$E(^(Y),1,$L(^(Y))-1-$L(DX))_O_")",F(DM-1)=O,^(O)="X ^UTILITY($J,99,"_DX_")" Q
 Q
IF I ^UTILITY($J,99,Y)?.E1"^UTILITY($J,99,".N1")"
 Q

DIL0
DIL0 ;SFISC/GFT-TURN PRINT FLDS INTO CODE ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D XDUY S %=$P(X,U,2) S:%["Cm"&(W[";W") %="w"_% G WP:%["W",M:%["m",STATS^DIL1:$D(DCL(DP_U_+W)),N:W[";N"
 I W[";W" D  S D1=$S(%["C":Y,1:$P(" S Y=",U,Y'?1" ".E)_Y_" S X=Y") D W S Y=Y_D1_" D ^DIWP" Q
 .N %,DNP S DNP=1 D EN^DILL(DP,+W,1)
 D EN^DILL(DP,+W,1)
DN ;
 I W[";X" D  Q
 .S DE=$S(W[";C"!(W[";S"):DE,$A(Y)-32:" W ?0",1:"")
 .I $L(DE)+$L(Y)>250 D
 ..S %=Y,Y=DE,DE=% D PX^DIL S Y=DE
 .E  S Y=DE_Y
 .I $D(DIWR(DM)) D DIWR
DNW D H:DHD!$G(DIOSUBHD) I DG+DLN>IOM,DG K ^UTILITY("DIL",$J,DG) S DG='%*DM*2+2,DE=$P(W,";C",2),DG=$S(DE>0:DE-1,DE<0:IOM+DE,DG+DLN'>IOM!(W[";W"):DG,DLN>IOM:0,1:IOM-DLN),DE=" D T Q:'DN  W ?"_DG D W^DIL,H:DHD!$G(DIOSUBHD)
 S DG=2+DLN+DG Q:$D(DNP)  I $L(DE)+$L(Y)>250 S %=Y,Y=DE,DE=% D PX^DIL S Y=DE Q
 S Y=DE_Y Q
 ;
H S V=$P(X,U),Z=99,I=$P(W,";""",2) I I]"" S V=$$CONVQQ^DILIBF($P(I,"""",1,$L(I,"""")-1))
HEAD Q:V=""  S I=$P(V," ") I $L(I)>DLN S DLN=$L(I) ;Column width may have to be increased for a long word
XD S V=$P(V," ",2,99),D=$P(V," ") I D]"",$L(I)+$L(D)<DLN S I=I_" "_D G XD
 S ^UTILITY("DIL",$J,DG,Z)=$J(I,DRJ*DLN),V(Z)="",Z=Z-1 G HEAD
 ;
XDUY ;
 I '$D(^DD(DP,+W,0)) S X="",DU=0,Y=0 Q
 S X=^(0),DU=$P(X,U,4),Y=$P(DU,";",2),DU=$P(DU,";") I W[";T",$D(^(.1)) S X=^(.1)_U_$P(X,U,2,99)
EGP E  S $P(X,U)=$$LABEL^DIALOGZ(DP,+W) ;**FIELD LABEL FOR OUTPUT HEADING
 S:+DU'=DU DU=""""_DU_""""
 I Y S Y="$P(X,U,"_Y_")" Q
 I Y="" S Y="D"_DM Q
 S Y=$E(Y,2,9) S:$P(Y,",",2)=+Y Y=+Y S Y="$E(X,"_Y_")" Q
 ;
WR ;
 K DLN D W^DILL
W S DRJ=0,DIWL=DIWL+1 I '$D(DLN) S %=IOM-DG,DLN=$S(%>20:%,1:IOM)-2
 S:W[";X" $P(X,U)="" D DNW S %=$P(DE,"W ?",2)+1,Y=DLN+%-1,DIO=2,%=" S DIWL="_%_",DIWR="_$S(IOM<Y:IOM,1:Y),Y=$P(DE," W ?")_% Q
 ;
WP S DN=%["L"_U D WR ;COME HERE FOR A W-P TYPE FIELD
 S DIO=3,Y=%_" D ^DIWP",X=F(DM-1) I DHT<0 S I=$E(^UTILITY("DIPZ",$J,X),2,999) D WPX S ^UTILITY("DIPZ",$J,X)=" "_I Q
 I $D(^UTILITY($J,99,X)) S I=^(X) D WPX S ^UTILITY($J,99,X)=I Q
WPX ;from DIPZ1
 S:DN I=^DD("FUNC",38,1)_" "_I ;'NOWRAP' FUNCTION
 I DE]"" S I=DE_" "_I ;GFT
 Q
 ;
M S D1=" S DICMX=""D "_$E("L",%'["w")_"^DIWP"" "_$P(X,U,5,99) D WR S Y=Y_D1 Q
 ;
N ;
 S DCL=DCL+1,DXS="Y",D=",Y=$$DITTO^DIO2("_DCL_",Y)",DITTO(DCL)="",I=""
 I %["C" S X=X_" S Y=X"_D_" S X=Y" G Z
 S Y=" S Y="_Y_D
Z D EN^DILL(DP,+W) G DN
 ;
DIWR ;
 G DIWR^DIPZ1:DHT I $D(DIWR(DM)),DX=DIWR(DM) S ^UTILITY($J,99,DX)="D A^DIWW" G K
 I $D(DIWR(DM)) F DX=DX+1:1 I '$D(^UTILITY($J,99,DX)) S ^(DX)="D ^DIWW" D DX^DIL(DX) G K
 D  S ^(I)="D ^DIWW "_^UTILITY($J,99,I)
 .F I=DM-1:-1:0 I $D(DIWR(I)) K DIWR(I) Q
 .I I S I=F(I)
 .E  F I=1:1 Q:'$D(^UTILITY($J,99,I+1))
K K DIWR(DM) Q

DIL1
DIL1 ;SFISC/GFT-STATS, NUMBER FIELD, ON-THE-FLY ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $A(W)=34 D  Q
 .N A9
 .S Y="" F A9=0:0 S Y=Y_""""_$P(W,"""",2)_"""",W=$P(W,"""",3,99) Q:$A(W)'=34&($A(W)'=95)  S:$A(W)=95 Y=Y_$C(95),W=$P(W,"_",2,99)
 .S Y=" W "_Y,DLN=0,X="",DRJ=0 D DE^DIL,W^DILL:W[";" I W[";W" D WR Q
 .S %=$L(Y)-5 S:'DLN DLN=% S:DRJ Y=" W ?"_(DG+DLN-%)_Y D DN^DIL0,T^DIL
NUMB S:DN<0 O=999 S X="",DRJ=0 I W?1"0".E D  D T^DIL Q
 .K DPQ(DP,0)
 .S Y="D"_(DIL-DIL0),X=$$LABEL^DIALOGZ(DP,.001)_U_$P($G(^DD(DP,.001,0)),U,2,99) S:X?.P X=$$EZBLD^DIALOG(7099)_"^^^^$L(X)>12" ;**CCO/NI
 .I $D(DCL(DP_U_0)) D DE^DIL,STATS Q
 .D EN^DILL(DP,.001,1),DE^DIL,DN^DIL0
 S DN=$E(W,$L(W)),X=$P(W,";") K DLN I DM,$A(X)=94 S W=F_W G UP^DIL
COMP D  D T^DIL Q
 .N V,DILDATE,DILCUT
 .S DILCUT=0
 .I W[";d" S DILDATE="D"
 .I X?.E1" W X K Y" S DILCUT=8
 .I X?.E1" W X K DIP" S DILCUT=10
 .I X?.E1" D DT K DIP" S DILCUT=11,DILDATE="D"
 .I X?.E1" D DT K Y" S DILCUT=9,DILDATE="D"
 .S X=$E(X,1,$L(X)-DILCUT)_" K DIP K:DN Y"
DITTO .I W[";N" S DCL=DCL+1,X=X_" S X=$$DITTO^DIO2("_DCL_",X)",DITTO(DCL)=""
 .S Y=" "_X,X="^^^^"_X,%=DN,DN=-3
 .I W[";m" D W D  Q
 ..S X="D "_$E("L",W'[";w"&(W'[";W"))_"^DIWP",V=$F(Y,"D ^DIWP")
 ..I V S Y=$E(Y,1,V-8)_X_$E(Y,V,999)
 ..E  S Y=" S DICMX="""_X_""""_Y
 .I DILCUT S V=$G(DILDATE) D CLC^DILL
 .I 'DILCUT D W^DILL
 .S:'$D(DLN) DLN=9
 .I W[";W" D W S Y=Y_" D ^DIWP" Q
 .I "+#&!*"'[% D DE^DIL,DN^DIL0 Q
 .S X="^C"_$G(DILDATE)_"^^^"_$E(Y,2,999),W=-1_";"_$P(W,";",2,9),DCL(DP_U_-1)=%
 .D DE^DIL,STATS
 ;
W D DE^DIL,WR^DIL0 S Y=Y_" "_$E(X,5,999) Q
 ;
WR S D1=" S Y="_$P(Y,"W ",2,999),Y="" D W^DIL0
 F D1=D1," S X=Y D ^DIWP" S:$L(Y)+$L(D1)'>250 Y=Y_D1 I $F(Y,D1)-1'=$L(Y) D PX^DIL S Y=D1
 D T^DIL Q
 ;
STATS ;
 N TYPE
 I DG<10!(DG>900),'$G(DIONOSUB) S DG=10 D DE^DIL I DE'["!" S DE=" W:$X>8 !"_DE ;LEAVE FIRST 8 CHARS ON OUTPUT LINE FOR "SUBTOTAL"
 S TYPE=$P(X,U,2),V=DP_U_+W,I=DCL(V),D=+I I D S DSUM="" G E
 S (D,DCL)=DCL+1,DCL(V)=D_I
 S DXS=$S(I["*":"C",I["#":"S",I["&":"A",I["+":"P",1:1),V=TYPE,%=":Y"_$S(TYPE["C":"'?.""*""",Y["$E":"'?."" """,1:"]""""")
 I DXS S DSUM=" S"_%_" N("_D_")=N("_D_")+1",N(D)=0 G E
 G @DXS
 ;
C S CP(D)=""
S S Q(D)=0,L(D)=9999999999,H(D)=-L(D) I $P(TYPE,"I",2) S DLN=+$P(TYPE,"I",2)
P S N(D)=0
A S (S(D),DRJ)=0
 S DSUM=",C="_D_" D "_DXS_%
E I TYPE["C" D
 .D EN^DILL(DP,+W) S Y=Y_" S Y=X"_DSUM,DXS=$S($D(^DD(DP,+W,9.02)):^(9.02),1:0)
 E  S DXS=DSUM,Y=" S Y="_Y_DXS,I="",DXS="Y" D EN^DILL(DP,+W)
UTIL K DSUM S ^UTILITY($J,"T",DG)=DLN_U_D_U_DRJ_U_$P(X,U,2)_U_I
 D  D DN^DIL0 Q
 .I DXS?1E Q
 .S ^(DG)=^UTILITY($J,"T",DG)_U_DXS,DN=^DD(DP,+W,9.01)
 .I '$D(DNP) S V=$L(Y)+$L(DE) S:V<250 Y=DE_Y I V>249 S V=Y,Y=DE D PX^DIL S Y=V
 .S DE=X,V=DLN N X,DLN,DNP S X=DE,DLN=V,DNP="" ;'Do Not Print' hidden fields
LOOP .F  S DE="",V=$P(DN,";"),W=$P(V,U,2),DN=$P(DN,";",2,99) Q:V=""  D:'$D(DCL(V))
 ..D PX^DIL,XDUY^DIL0,EN^DILL(DP,W,1)
 ..I $P(X,U,2)'["C" S Y=",X=$G("_DI_C_DU_"))"_$P(",Y=",U,Y'[" S Y=")_Y
 ..E  S Y=Y_" S Y=X"
 ..S (D,DCL)=DCL+1,S(D)=0,DCL(DP_U_+W)=D,Y=" S C="_D_Y_" D A"

DIL11
DIL11 ;SFISC/GFT-TURN PRINT FLDS INTO CODE ;16OCT2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DOWN ;INTO A MULTIPLE
 I W>0,'$D(^DD(DP,+W,0)) Q  ;IN CASE FIELD IS NOW GONE FOR SOME REASON!
 S DN=-6,DY(DM)=DY,DP(DM)=DP,DI(DM)=DI I W>0 D M G D^DIL
F ;
 S DP=-W,X=$P(W,U,2),DD=DD+1,M(DP)=1,DIL(DM)=DIL,DIL(DM,0)=DIL0,Y=0,DIL0=DIL0+100,%=X["(" I % S (X,DI)=U_X,DIL=DIL0
 E  S DI=DI(DM)_","""_X_""",",DIL=DIL+101
QT S Y=$F(X,"""",Y) I Y S X=$E(X,1,Y-1)_$E(X,Y-1,999),Y=Y+1 G QT
 S Y=" S I("_DIL_")="""_X_""",J("_DIL_")="_DP
 S X=" "_$P($P(W,U,4,99),";")
 S DY="D"_(DIL-DIL0),DI=DI_DY,DIL=DIL-1 I $P(W,U,3)="" S W=+W,Y=Y_X_" S D0=D(0) I D0>0" G D^DIL
 S %="I("_(DIL0-100)_",0)=D0" I X'[% S X=","_%_X
 I DHT=-1 D DREL^DIPZ1 G END ;WE'RE COMPILING A PRINT TEMPLATE
 F %=900:1 I '$D(^UTILITY($J,99,%)) S ^(%)="I 1 X:$D(DSC("_DP_")) DSC("_DP_") I  D T:$X>"_DG_" Q:'DN "_Y,Y=" S (DIXX,DIXX("_(DM+1)_"))="_%_X,W=+W D D^DIL K R(DX) Q
END S (F(DM-1),DX)=%,R(%)=DP(DM-1),R(%,1)=M(DP(DM-1))
 Q
 ;
 ;
M N %,DILEVEL,DIB1,DIBO,D,DY,X ;BUILD A "Y" STRING
 S DILEVEL=DIL-DIL0+1
 S X=^DD(DP,+W,0),DU=$P($P(X,U,4),";") S:+DU'=DU DU=""""_DU_""""
 S DI=DI_","_DU_",",DY="D"_DILEVEL
B I W'[";B" S %=":0 Q:$O("_DI_DY_"))'>0 ",DIB1=""
 E  S DIB1="DIB"_DIL,DIBO="$O("_DI_"""B"","_DIB1,DIB1=" N "_DIB1_" S "_DIB1_"="""" F  S "_DIB1_"="_DIBO_")) Q:"_DIB1_"=""""  Q:'DN  ",%=":0 Q:"_DIBO_","_DY_"))'>0 "
 S DI=DI_DY
 S DP=+$P(X,U,2),M(DP)=1,D=$P("""""",U,+DU'=DU),D=" S I("_(DIL+1)_")="_D_DU_D_",J("_(DIL+1)_")="_DP_DIB1,Y=" S "_DY_"=$O(^("_DY_"))"
 ;
W S W=$P(W,",") I $P(^DD(DP,.01,0),U,2)["W" D:$P(^(0),U,2)["x"!($P(^(0),U,2)["X")  G P ;**DI*22*152**
 .S D=D_",D"_(DIL+1)_"=$G(DIWF) N DIWF S DIWF=D"_(DIL+1)_"_""X"""
 I DHT+1 F X=1:1 G P:X>DPP,DPP:+DPP(X)=DP!$D(DPP(X,DP))
DPP S Y=Y_" Q:"_DY_"'>0 "
 I DIB1="" S Y=" X $G(DSC("_DP_")) "_Y ;DSC will switch the naked reference, so we can get thru the subentries faster!
 I DIB1]"" S Y=Y_" I 1 X $G(DSC("_DP_")) I " ;DSC will do an IF
 I DHT+1,"@"[$P(DPP(X),U,4),$P(DPP(X),U,2)=0 S DPP(X,U)="" G R:$D(DPP(X,"F"))
 S Y=Y_" "
P S Y=D_" F "_DY_"=0"_%_Y_$S($D(DIARP(DP)):" X DIARP("_DP_") I $T",1:"")
 G S
R S V=$P(DPP(X,"T"),U),Y=D_" F "_DY_"="_$P(DPP(X,"F"),U)_%_Y_$S(V:"!("_DY_">"_V_") ",1:" ") ;RANGE FROM AND TO SORTING BY SUB-IEN
S S:($G(DDXP)'=4) %=" D:$X>"_DG,Y=Y_%_$S($D(DIWR):" NX^DIWW",1:" T Q:'DN ") ;ADD A LINE FEED UNLESS WE ARE 'EXPORTING'
 I DHT>0 S ^UTILITY($J,DV)="I "_DY_"'>0 S "_DY_"=0 "_$P(Y,"  ",2,99),DV=DV+1 ;HEADER TEMPLATE
 Q

DIL2
DIL2 ;SFISC/GFT,XAK,TKW-PROCESS HDRS AND TRAILERS ;11:39 AM  13 Feb 2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 D T:$D(^UTILITY($J,"T")) S:DIPT $P(^DIPT(DIPT,0),U,7)=DT S:$D(DIBT) $P(^DIBT(DIBT,0),U,7)=DT S:$G(DISV) $P(^DIBT(DISV,0),U,7)=DT
 F X=0:0 S X=$O(R(X)) Q:X=""  I X<500,$O(^UTILITY($J,99,X))>499 S DX=X
 S X=$S($D(DNP):"",$D(DIWR):" D ^DIWW",($G(DIAR)=4!($G(DIAR)=6)):" W "".""",1:" D T")_$S(DIWL:" K DIWF",1:"")_$S($D(CP):" D CP",1:"")_$P(" S DJ=DJ+1",U,$D(DIS)>9&(L!($D(DISTEMP))))_$S($D(DHIT):" X DHIT",1:"")
 I X'["D T" S X=X_" S DISTP=DISTP+1 D:'(DISTP#100) CSTP^DIO2"
 S:$D(DISV) X=X_" S ^DIBT("_DISV_",1,D0)="""""
 S:X]"" DX=DX+1,^UTILITY($J,99,DX)=$E(X,2,999)
HEAD K DIOT S DW=2,(DQI,DV)=DHD,M=M(DP(0)) I DV?.P1"[".E1"]" D HT(DV?1"-".E) G 0
 I 'DV G 0:DV?1"W ".E,0:$G(DIFIXPT)=1,0:$G(IOST)?1"C".E S ^UTILITY($J,99,0)="Q" G G
 I $D(DIPZ) S ^UTILITY($J,1)=^UTILITY($J,1)_" X ^UTILITY($J,2) D HEAD"_^DIPT(DIPZ,"ROU")_^("LAST") G 0
 S DHTDXS="",X="",$P(X,"-",$S(IOM<244:IOM,1:244))="-"
 D O S ^UTILITY($J,DV)="W !,"""_X_""",!!",^(1)=^(1)_O
0 S ^UTILITY($J,99,0)="I DC["","""_$S(DIPT=.01:"!($Y>"_(DIOSL-5)_")",1:"")_" X ^UTILITY($J,1)"
G S DX(0)=^UTILITY($J,99,0) K ^UTILITY($J,0),DXIX,DHTDXS
 I $D(DPP(0)) S DJ=DPP(0,"IX"),DPQ=$O(DPP(DPP(0)))]"",DJK=0 G ^DIO
 S DPQ=$P(DPP(1),U,4)["-"!($D(DPP(1,"CM"))&('$D(DPP(1,"PTRIX"))))
 F R=2:1:DPP S:'$D(DPP(R,U)) DPQ=1
 S:$P(DPP(1),U,5)[";L" DPQ=1
 S DJK=1 I DPQ S %=0 F R=1:1:DPP I +$G(DPP(R,"SER"))>% S %=+DPP(R,"SER"),DJK=R
 I $D(DPP(DJK,"IX")) S DJ=DPP(DJK,"IX") G ^DIO
 S DJ=DK_DK_U_1 I $O(DPP(DJK,-1))>0!$P(DPP(DJK),U,2) S DPQ=1
 S:'DPQ DPP(1,"IX")=""
 G ^DIO
 ;
O S O=DHTDXS_" F DE="_DW_":1:"_DHD_" X ^UTILITY($J,DE)" Q
 ;
T ;
 F DG=-1:0 S DG=$O(^UTILITY($J,"T",DG)) Q:DG=""  S Z="""",I=$P(^(DG),U,6,99) I I]"" F W=2:1 Q:$P(I,Z,W,99)=""  S V=$P(I,Z,W) I V]"",$D(DCL(V)) S I=$P(I,Z,1,W-1)_+DCL(V)_$P(I,Z,W+1,99),W=W-1,^(DG)=$P(^(DG),U,1,5)_U_I
 Q
 ;
HT(DILTRAIL) S DLP=DX,DCC=M,DV=DW D
 . N DISMIN D INIT^DIP5
 F %=0:0 S %=$O(^DIPT("B",$P($P(DHD,"[",2),"]",1),%)) G TT:%="" I $D(^DIPT(%,0)),$P(^(0),U,4)=""!($P(^(0),U,4)=DP) S $P(^(0),U,7)=DT Q
 S DHTDXS=$S($D(^("DXS")):" N DXS M DXS=^DIPT("_%_",""DXS"") ",1:"")
 S DHT=$G(^DIPT(%,"ROU")) I DHT[U,$D(^("IOM")),^("IOM")'>IOM S ^UTILITY($J,DV)=DHTDXS_"D "_DHT,DV=DV+1 G EHT
 S DX=-1,DHD="^DIPT("_%_",""F"",DHT)" F DHT=0:0 S DHT=$O(@DHD) Q:DHT'>0  S R=^(DHT) D  D UNSTACK^DIL:DM
 . N DNP D ^DIL
 I $L(Y)>1 D PX^DIL
EHT S DX=DLP,DHD=DV-1,M=M(DP(0)) D O S DW=DV,O=" N X,DIP"_O
 I DILTRAIL S M=M+1,DILIOSL=IOSL-M,^(1)="X DIOT "_^UTILITY($J,1)_" K DIOT(2)",DIOT="I DC?.N,$Y N DA S DA=D0 N D0 S D0=+$G(DIOT(""D0""),DA) X DIOT(1)"_O,DIOT(1)="S DIOT(2)=1 F  W ! Q:$Y>"_DILIOSL_"!($G(DDBRZIS))",M=M+DCC Q
 S M=DCC,^(1)=^UTILITY($J,1)_O
TT S DHD=$P(DQI,"]",2) I DHD]"" D HT(1)
 Q

DILF
DILF ;SFISC/STAFF-LIBRARY OF FUNCTIONS ;7:08 AM  25 Apr 2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;
 ;
LOCK(REF) ;
 ; LOCK the REFerence.  $T must be checked upon return  **147
 I '$D(DILOCKTM) S DILOCKTM=$G(^DD("DILOCKTM"),1) I $D(@REF) ;TO GET NAKED BACK
 LOCK @("+"_REF_":DILOCKTM")
 Q
 ;
 ;
 ;
CREF(X) G ENCREF^DIQGU
 ;
OREF(X) G ENOREF^DIQGU
 ;
FDA(DIEFF,DIEFDAS,DIEFFLD,DIEFFLG,DIEFVAL,DIEFAR,DIEFOUT) ;
 G LOADX^DIEF1
 ;
CLEAN ;
 G CLEAN^DIEFU
 ;
IENS(DIEFDA) ;
 G IENX^DIEFU
 ;
DA(DAIEN,DATARG) ;
 G DAX^DIEFU
 ;
DT(DIEFDT,DIEFX,DIEFY,DIEFDT0,DIOUTAR) ;
 G DTX^DIEFU
 ;
VALUES(DILFILE,DILFLD,DILFDA,DILOUT) ;
 I $G(DILFILE)=""!($G(DILFLD)="")!($G(DILFDA)="") S DILOUT=0 Q
 K DILOUT
 N DILCNT,DILIEN
 S DILIEN=""
 D VALLOOP
 S DILOUT=DILCNT
 Q
 ;
VALLOOP ;
 S DILCNT=0
 F  S DILIEN=$O(@DILFDA@(DILFILE,DILIEN)) Q:DILIEN=""  D
 . I $D(@DILFDA@(DILFILE,DILIEN,DILFLD)) D
 . . S DILCNT=DILCNT+1
 . . S DILOUT(DILCNT)=@DILFDA@(DILFILE,DILIEN,DILFLD)
 . . S DILOUT(DILCNT,"IENS")=DILIEN
 Q
 ;
VALUE1(DILFILE,DILFLD,DILFDA) ;
 I $G(DILFILE)=""!($G(DILFLD)="")!($G(DILFDA)="") Q "^"
 N DILIEN
 S DILIEN=$O(@DILFDA@(DILFILE,""))
 I DILIEN="" Q "^"
 I $D(@DILFDA@(DILFILE,DILIEN,DILFLD)) Q @DILFDA@(DILFILE,DILIEN,DILFLD)
 N DILCNT,DILOUT
 D VALLOOP
 I DILCNT Q DILOUT(1)
 Q "^"
 ;
ROUSIZE() ;
 Q $G(^DD("ROU"))
 ;
HTML(DISTRING,DIRECTN) ;
 ;
 ; entry point: use HTML to encode or decode ^ and & characters ; TOAD
 ; extrinsic function: return encoded or decoded value
 ;
H1 N DILONG,DIRULE I $G(DIRECTN,1)=1 D  Q:$G(DILONG) ""
 . S DIRULE(1,"&")="&amp;",DIRULE(2,"^")="&#94;"
 . N DIL S DIL=$L(DISTRING,"^")+$L(DISTRING,"&")-2
 . I $L(DISTRING)-DIL+(DIL*5)>255 D ERR^DICU1(207,,,,DISTRING) S DILONG=1 Q
 E  S DIRULE(1,"&#94;")="^",DIRULE(2,"&amp;")="&"
 Q $$TRANSL8(DISTRING,.DIRULE)
 ;
TRANSL8(DISTRING,DIRULES) ;
 ;
 ; HTML: $TRANSLATE for substrings instead of characters ; TOAD
 ; extrinsic function: return translated value
 ;
T1 N DIFRENCE,DIFROM,DILENGTH,DITO
 N DI S DI="" F  S DI=$O(DIRULES(DI)) Q:DI=""  D
 . S DIFROM=$O(DIRULES(DI,"")) Q:DISTRING'[DIFROM
 . S DITO=DIRULES(DI,DIFROM)
 . S DILENGTH=$L(DIFROM)
 . S DIFRENCE=$L(DITO)-DILENGTH
 . S DIAT=0 F  D  Q:'DIAT
 . . S DIAT=$F(DISTRING,DIFROM,DIAT) Q:'DIAT
 . . S $E(DISTRING,DIAT-DILENGTH,DIAT-1)=DITO
 . . S DIAT=DIAT+DIFRENCE
 Q DISTRING

DILFD
DILFD ;SFISC/STAFF-LIBRARY OF FUNCTIONS ;11/18/94  11:05
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
ROOT(DIC,DA,CP,ERR) ;
 G ENROOT^DIQGU
 ;
FLDNUM(DIEFF,DIEFFDNM) ;
 G FLDNUMX^DIEF1
 ;
VFILE(F,FLAG) ;
 G VFILEX^DIEFU
 ;
VFIELD(F,FLD,FLAG) ;
 G VFIELDX^DIEFU
 ;
RECALL(DIFILE,DIEN,DIUSER) ;SEA/TOAD
 G RECALLX^DICU
 ;
EXTERNAL(DIFILE,DIFIELD,DIFLAGS,DINTERNL,DIMSGA) ;SEA/TOAD
 G XTRNLX^DIDU
 ;
PRD(DIFRFILE,DIFRPRD) ;DCL
 G EN^DIFROMSV
 ;

DILIBF
DILIBF ;SFISC/STAFF-LIBRARY OF FUNCTIONS ;15NOV2012 ; 12/1/12 3:12pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
HTFM(%H,%F) ;$H to FM
 N X,%,%Y,%M,%D S:'$D(%F) %F=0
 S:%H[",0" %H=%H-1_",86400"
 S %=(%H>21608)+(%H>94657)+%H-.1,%Y=%\365.25+141,%=%#365.25\1
 S %D=%+306#(%Y#4=0+365)#153#61#31+1,%M=%-%D\29+1
 S X=%Y_"00"+%M_"00"+%D,%=$P(%H,",",2)
 S %=%#60/100+(%#3600\60)/100+(%\3600)/100
 S:%&('%F) X=X_% Q X
 ;
FMTH(X,%F) ;FM to $H
 N %Y,%H S:'$D(%F) %F=0 D H S:%F %H=+%H Q %H
H ;
 N %,%M,%D,%T I X<1410000 S %H=0,%Y=-1 Q
 S %Y=$E(X,1,3),%M=$E(X,4,5),%D=$E(X,6,7)
 S %T=$E(X_0,9,10)*60+$E(X_"000",11,12)*60+$E(X_"00000",13,14)
 N DILEAP D
 . N Y S Y=%Y+1700 S:%M<3 Y=Y-1
 . S DILEAP=(Y\4)-(Y\100)+(Y\400)-446 Q
 S %H=$P("^31^59^90^120^151^181^212^243^273^304^334","^",%M)+%D
 S %='%M!'%D,%Y=%Y-141
 S %H=%H+(%Y*365)+DILEAP+%
 S:%T=86400 %H=%H+1,%T=0
 S %H=%H_","_%T
 S %Y=$S(%:-1,1:%H+4#7)
 Q
 ;
HTE(%H,%F) ;$H to external
 Q:%H'>0 %H N Y,%T,%R S %F=$G(%F) S Y=$$HTFM(%H,0) G T2
FMTE(Y,%F) ;FM to external
 Q:'$G(Y) $G(Y) S %F=$G(%F) Q:($G(DUZ("LANG"))>1) $$OUT^DIALOGU(Y,"FMTE",%F)
 N %T,%R
T2 S %T="."_$E($P(Y,".",2)_"000000",1,7) D @("F"_$S(%F<1:1,%F>7:1,1:+%F\1)) Q %R
DOW(X,Y) ;Day of Week
 N %Y,%M,%D,%H,%T D H I $G(Y) Q %Y
 Q $P("Sun^Mon^Tues^Wednes^Thurs^Fri^Satur","^",%Y+1)_"day"
 ;
FMDIFF(X1,X2,X3) ;FM diff in two dates in days if x3=1 seconds if x3=2.
 N %H,%Y,X S:'$D(X3) X3=1 S X=X1 D H S X1=+%H,X1(1)=$P(%H,",",2),X=X2 D H
D2 S X=(X1-%H) S:X3>1 X=X*86400+(X1(1)-$P(%H,",",2))
 I X3=3 D
 . S %=X,X=""
 . I %'<86400 S X=(%\86400)
 . I %<0 S:(-%)'<86400 X=(%\86400) S %=-%
 . S:%#86400 X=X_" "_(%#86400\3600)_":"_$E(%#3600\60+100,2,3)_":"_$E(%#60+100,2,3)
 . Q
 Q X
 ;
HDIFF(X1,X2,X3) ;$H diff in two dates, X3 same as FMDIFF.
 N X,%H,%T S:'$D(X3) X3=1 S X1(1)=$P(X1,",",2),X1=+X1,%H=X2
 G D2
HADD(X,D,H,M,S) ;Add to $H date
 N %H,%T S %H=+X,%T=$P(X,",",2) D A2 Q %H_","_%T
A2 S %H=%H+$G(D),%T=%T+($G(H)*3600)+($G(M)*60)+$G(S)
 S:%T'<86400 %H=%H+(%T\86400),%T=%T#86400 S:%T<0 %H=%H+(%T\86400)-1,%T=%T#86400
 Q
 ;
FMADD(X,D,H,M,S) ;Add to FM date
 N %H,%T S %H=$$FMTH(X,0),%T=$P(%H,",",2) D A2 Q $$HTFM(%H_","_%T)
 ;
CONVQQ(X) ; CONVERT SINGLE TO DOUBLE QUOTES IN STRING X
 N Q,F S Q=""""
 F F=0:0 S F=$F(X,Q,F) Q:F=0  S X=$E(X,1,F-2)_Q_Q_$E(X,F,256),F=F+1
 Q X
 ;
CONVQ(X) ; CONVERT DOUBLE TO SINGLE QUOTES IN STRING X
 N Q,F,D S Q="""",D=""""""
 F F=0:0 S F=$F(X,D,F) Q:F=0  S X=$E(X,1,F-3)_Q_$E(X,F,256),F=F-1
 Q X
 ;
QUOTE(X) ; PUT QUOTES AROUND STRING
 S X=""""_$G(X)_"""" Q X
 ;
FNO(X) ; gets a subfile's top level file number
 N Y S X=+X
 I $G(^DIC(X,0))]"" Q X
 F  S Y=+$G(^DD(X,0,"UP")) D  Q:'$D(X)!(Y'>0)
 . I $G(^DIC(Y,0))]"" K X Q
 . S X=Y
 . Q
 Q Y
 ;
GLO(Z) ; gets the file number from a global root
 I '$D(@(Z_"0)"))#2 Q 0
 N Y
 S Y=+$P($G(@(Z_"0)")),U,2)
 Q $$FNO(+Y)
 ;
UP(X) ; convert string X to uppercase
 I $G(DUZ("LANG")) Q $$OUT^DIALOGU(X,"UC")
 E  Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 ;
ROUEXIST(X) ; Execute routine existence test
 G:X="" QRER I '$D(DISYS) N DISYS D OS^DII
 I $G(^%ZOSF("TEST"))]"" X ^("TEST") Q $T
 I $G(^DD("OS",DISYS,18))]"" X ^(18) Q $T
QRER Q 0
 ;
 ;
F5 ;
F1 S %R=$P($S(%F'["U":$T(M),1:$T(MU))," ",$S($E(Y,4,5):$E(Y,4,5)+2,1:0))_$S($E(Y,4,5):" ",1:"")_$S($E(Y,6,7):$S((%F\1'=5):$E(Y,6,7),1:+$E(Y,6,7))_$E(", ",1,1+(%F\1'=5)),1:"")_($E(Y,1,3)+1700)
TM Q:%T'>0!(%F["D")
 I %F'["P" S %R=%R_$S(%F\1'=6:"@",1:" @ ")_$E(%T,2,3)_":"_$E(%T,4,5)_$S($E(%T,6,7)!(%F["S"):":"_$E(%T,6,7),1:$S(%F\1'=6:"",1:"   "))
 I %F["P" S %R=%R_" "_$S($E(%T,2,3)>12:$E(%T,2,3)-12,1:+$E(%T,2,3))_":"_$E(%T,4,5)_$S($E(%T,6,7)!(%F["S"):":"_$E(%T,6,7),1:"")_$S($E(%T,2,5)\1200=1:" pm",1:" am")
 Q
M ;; Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
MU ;; JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
F2 S %R=+$E(Y,4,5)_"/"_(+$E(Y,6,7))_"/"_$E(Y,2,3)
 G TM
F3 S %R=+$E(Y,6,7)_"/"_(+$E(Y,4,5))_"/"_$E(Y,2,3)
 G TM
F4 S %R=$E(Y,2,3)_"/"_$E(Y,4,5)_"/"_$E(Y,6,7)
 G TM
F6 S %R=$S($E(Y,4,5):$E(Y,4,5)_"-",1:"")_$S($E(Y,6,7):$E(Y,6,7)_"-",1:"")_(1700+$E(Y,1,3))
 G TM
F7 S %R=$S($E(Y,4,5):+$E(Y,4,5)_"-",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_"-",1:"")_(1700+$E(Y,1,3))
 G TM
 ;
HKERR(DIFILE,DIIENS,DIFLD,DIHOOK) ;
 N DIEXT
 S DIEXT("FILE")=$G(DIFILE)
 S DIEXT("FIELD")=$G(DIFLD)
 S DIEXT("IENS")=$G(DIIENS)
 S DIEXT(1)=$G(DIHOOK)
 D BLD^DIALOG(120,DIHOOK,.DIEXT)
 Q
 ;
FILENUM(DIGREF) ;Return file/subfile number from open global reference
 Q:$G(DIGREF)'?1"^".1"%"1U.UN1"(".E ""
 I $E(DIGREF,1,8)="^DIC(.2," Q .2
 N F,X,DIFILE,S
 S DIFILE=+$P($G(@(DIGREF_"0)")),U,2) I DIFILE Q DIFILE
 S DIGREF=$$CREF^DILF(DIGREF)
 F X=$QL($NA(@DIGREF)):-2:0 S X(X)=$QS(DIGREF,X),X(X,0)=$$CREF^DILF($NA(@DIGREF,X))
 S X=$O(X("")) I X="" Q ""
 I X(X)="^DIC" S F=1
 E  I X(X)="^DD" S F=0
 E  S S=$P($G(@X(X,0)@(0)),U,2),F=+S I S="" Q ""
 F X=X:0 S X=$O(X(X)) Q:X=""  S DIFILE=$O(^DD(F,"GL",X(X),0,"")) Q:DIFILE=""  S (F,DIFILE)=+$P($G(^DD(F,DIFILE,0)),U,2) Q:'F
 Q DIFILE
 ;
 ;

DILL
DILL ;SFISC/GFT-TURN PRINT FLDS INTO CODE ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DILLFILE,DILLFLD,DXSET) ; Entry Point
 S:$G(DXSET) DXS=1
V ;
 S V=$P(X,U,2),DRJ=$F(V,"P") I V["O",$D(^DD(DILLFILE,DILLFLD,2)) S Y=Y_" "_^(2),DIO=1,D1="",DLN=30,DRJ=0 D SY G J
 G CLC:V["C",D:'DRJ S V=+$E(V,DRJ,99),D1=$P(X,U,3) I 'V S DRJ=0,@("V=$D(^"_D1_"0))") G D:'V S V=+$P(^(0),U,2)
POINTR D Y S Y=Y_" S Y=$S(Y="""":Y,$D(^"_D1_"Y,0))#2:$P(^(0),U),1:Y)" I $D(^DD(V,.01,0)) S X=$P(X,U)_U_$P(^(0),U,2,9) G V
D I V["V" D Y S Y=$P(Y," S Y=$S(Y="""":Y,$D(^")_" S C=$P(^DD("_DP_","_+W_",0),U,2) D Y^DIQ:Y S C="","""
 I V["D" S DLN=$P($P(X,"%DT=""",2),"""",1),DLN=$S(DLN["S":21,DLN["T":18,1:11) D W S D1=" D DT" S:DLN>11&DRJ D1=" W ?("_DLN_"-$S(Y#1:18,1:11)+$X)"_D1 S:W[";W" Y=Y_" X ^DD(""DD"") S:Y[""@"" Y=$P(Y,""@"")_""  ""_$P(Y,""@"",2)" G SY
 I $P(X,"X>",2) S DLN=$L(+$P(X,"X>",2))+3,DRJ=1 G J
 S DLN=+$P(X,"$L(X)>",2) I 'DLN S D1=$P($P(X,U,4),";",2) I D1?1"E"1N.N1","1N.N S DLN=$P(D1,",",2)-D1+1
FJ I V'["S" S I=+$P(V,"J",2) S:V["F"&I DLN=I S:'DLN DLN=30 G J
 D W N D1,D2,D3 S D1=$P(X,U,3)
S I D1]"",W[";W"!'$D(DNP) S D2=$P(D1,";"),D1=$P(D1,";",2,99),D3=$P(D2,":"),D2=$P(D2,":",2) S:$L(D2)>DLN&'$P(W,";L",2)&'$P(W,";R",2) DLN=$L(D2) G S
SET S D1="$$SET^DIQ("_DILLFILE_","_DILLFLD_",Y)" S D1=$S(DRJ:"$J("_D1_","_DLN_")",DLN:"$E("_D1_",1,"_DLN_")",1:D1) S:W[";W" Y=Y_" S:Y]"""" Y="_D1 S:W'[";W" D1=" W:Y]"""" "_D1
SY D Y S Y=Y_$S($D(DNP):"",1:D1) K D1 Q
 ;
Y I DXS S Y=" S Y="_Y,DXS="Y"
Q Q
 ;
W ;
 F I=";W",";L" I W[I S DRJ=0 S:$P(W,I,2)?1N.E DLN=+$P(W,I,2),I="" G Q
 I $P(X,U,2)["J",$P(X,U,2)'["F" S I=$P($P(X,U,2),"J",2),W=W_";R"_$P(I+1,U,I>0) I $P(X,U,2)'["O",I["," S W=W_";D"_+$P(I,",",2)
 I W[";R" S DRJ=1 S:$P(W,";R",2) DLN=+$P(W,";R",2)
 S I=$P($P(W,";D",2),";",1) S:I]"" DRJ=1,I=","_+I Q
 ;
CLC ;
 S Y=" "_$P(X,U,5,99),DXS="X" I V["D" S Y=Y_" S Y=X" G D
 I V["p" S V=$P(V,"p",2),D1=$P($G(^DIC(+V,0,"GL")),U,2) I D1]"" S Y=Y_" S Y=X",DXS="Y" G POINTR ;computed pointer
 I V?.E1"J"1N.E,W'[";X",W'[";R",V'["," S W=W_";L"_+$P(V,"J",2)
J D W Q:V["m"!$D(DNP)  I '$D(DLN) S Y=Y_" W X" Q
 I 'DLN S DLN=$S(V["B":1,W[";L0":0,1:8)
 S D2="" I 'DRJ S V="E(",D3="1,"_DLN
 E  S V="J(",D3=DLN_I I I]"" D Y S D2=":Y]""""" I DXS="X" S D2=":X'?.""*"""
 S Y=$S(DXS:",$"_V_Y,1:Y_" W"_D2_" $"_V_DXS)_","_D3_")" I $P(X,U,2)["C",$L(Y)<225 S Y=Y_" K Y("_DP_","_+W_")"
 I $G(DDXP)=4 S Y=$$DJTOPY^DDXP4(Y)
K K D2,D3 Q

DIM
DIM ;SFISC/JFW,GFT,TOAD-FileMan: M Syntax Checker, Main ;22APR2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S %X=X,%END="",%ERR=0,%LAST="" G ER:X'?.ANP
 ;
GC ; get next command on line (*)
 G ER:%ERR,LAST:";"[$E(%X) F  Q:$E(%X)'=" "  S %X=$E(%X,2,999)
 G ER:"BCDEFGHIKLMNOQRSUWXZ"'[$E(%X)
 S %LAST=%X D SEP G ER:%ERR S %COM=$P(%ARG,":") ; command word
 I $L(%COM)>1 D  G ER:%ERR
 . I $T(COMMAND)'[(";"_%COM_";"),%COM'?1"Z"1.U S %ERR=1
 . E  S %COM=$E(%COM)
 S %=$P(%ARG,":",2,99),%COM(1)=% I %ARG[":",%="" G ER ; command postcond
 I %]"" D ^DIM1 G ER:%ERR
 D SEP G ER:%ERR I %ARG="","CDGMORSUWXZ"[%COM G ER ; argument list
 S %END=%ARG G @%COM
 ;
B G GC:%ARG=""&(%COM(1)=""),BK^DIM4
C G CL^DIM4
D G DG^DIM3
E G GC:%ARG=""&(%COM(1)=""),ER
F G ER:%COM(1)]""!(";"[$E(%X)),GC:%ARG="",FR^DIM3 ;GFT-DON'T END WITH 'F'
G G DG^DIM3
H G GC:%ARG=""&(%COM(1)="")&(%X]""),HN^DIM3:%ARG]"",ER Q
I G ER:%COM(1)]"",IX^DIM4
K G GC:%ARG=""&(%COM(1)="")&(%X]""),KL^DIM3:%ARG]"",ER
L G LK^DIM3
M G S
N G ER:%ARG=""&(%X=""),K
O G OP^DIM3
Q G ER:%ARG]"",GC:%ARG=""&(%COM(1)=""),BK^DIM4
R G RD^DIM4
S G ST^DIM4
U G OP^DIM3
W G WR^DIM4
X G IX^DIM4
Z G GC
 ;
SEP ; remove first " "-piece of %X into %ARG: parse commands (GC)
 F %I=1:1 S %C=$E(%X,%I) D:%C=""""  Q:" "[%C
 . N %OUT S %OUT=0 F  D  Q:%OUT!%ERR
 . . S %I=%I+1,%C=$E(%X,%I) I %C="" S %ERR=1 Q
 . . Q:%C'=""""  S %I=%I+1,%C=$E(%X,%I) Q:%C=""""  S %OUT=1
 S %ARG=$E(%X,1,%I-1),%I=%I+1,%X=$E(%X,%I,999)
 Q
 ;
COMMAND ;;BREAK;CLOSE;DO;ELSE;FOR;GOTO;HALT;HANG;IF;KILL;LOCK;MERGE;NEW;OPEN;QUIT;READ;SET;USE;WRITE;XECUTE;
 ;
LAST ; check to ensure no trailing "," or " " at end of command (GC)
 S %L=$L(%LAST),$E(%LAST,%L+1-$L(%X),%L)=""
 I $E(%END,$L(%END))="," G ER
 I $E(%X)="",$E(%LAST,%L)=" " G ER
 G END
 ;
ER K X
END K %,%A,%A1,%A2,%ARG,%C1,%C,%COM,%END,%ERR,%H,%I,%L,%LAST,%P,%X,%Z Q

DIM1
DIM1 ;SFISC/JFW,GFT,TOAD-FileMan: M Syntax Checker, Exprs ;13DEC2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q:%ERR  N %A,%A1 S (%I,%N,%ERR,%(-1,2),%(-1,3))=0
 ;
GG ; expr, expratom, expritem, subscript, parameter (called everywhere)
 D %INC G:%C="" FINISH^DIM2
 G E:%C=";"!($A(%C)>95)!($A(%C)<33)
 G QUOTE:%C="""",FUNC:%C="$",SUB^DIM2:%C="(",UP^DIM2:%C=")"
 G AR^DIM2:%C=",",SEL^DIM2:%C=":",GLO^DIM2:%C="^"
EXP I %C="E",$E(%,%I-1)?1N D  G E:%ERR S %I=%I-1 G GG
 . S %L1=$E(%,%I+1)
 . I %L1'?1(1N,1"+",1"-") S %ERR=1 Q
 . N %OUT S %OUT=0 F %I=%I+2:1 D  Q:%ERR!%OUT
 . . S %C=$E(%,%I)
 . . I "<>=!&'[]+-*/\#_?,:)"[%C S %OUT=1 Q
 . . I %C'?1N S %ERR=1 Q
 I %C?1(1U,1"%") D VAR^DIM2
 G E:%ERR,GG:%C=""
 G PAT^DIM2:%C="?",BINOP^DIM2:"=[]<>&!"[%C,MTHOP^DIM2:"/\*#_"[%C
 G UNOP^DIM2:"'+-"[%C,IND^DIM2:%C="@"
PERIOD I %C="." D  G E:%ERR
 . I $P($G(%(%N-1,0)),"^")="P" D  Q
 . . N %C S %C=$E(%,%I+1) I %C?1N Q  ; decimal pass by value
 . . I %C'="@",%C'?1U,%C'="%" S %ERR=1 ; bad pass by reference
 . D %INC N %L1,%P S %L1=$E(%,%I-2),%P="':=+-\/<>[](,*&!_#"
 . I %L1?1N,%C?1N Q  ; 4.2
 . I %P[%L1,%C?1N Q  ; +.2
 . S %ERR=1 ; illegal period
 I %C?1N,$E(%,%I+1)]"" G E:$E(%,%I+1)'?1(1NP,1"E")
GG1 ;
 I %C]"","$(),:"""[%C S %I=%I-1
 G GG
 ;
QUOTE ; strlit (GG)
 F %J=0:0 D %INC Q:%C=""!(%C="""")
 G E:%C=""!("[]()><\/+-=&!_#*,;:'"""'[$E(%,%I+1)) D:$D(%(%N-1,"F")) FN:%(%N-1,"F")["FN" G E:%ERR,GG
 ;
FUNC ; intrinsics & extrinsics, mainly intrinsic functions (GG)
 D %INC G EXT:%C="$",E:%C'?1U,SPV:$E(%,%I,999)'?.U1"(".E,FUNC1:%C="Z"!($E(%,%I+1)="(")
 S %T=$E(%,%I,$F(%,"(",%I)-2)
 I %T="ST"!(%T="STACK") G E ; SAC
 F %F1="FNUMBER^2;3","TRANSLATE^2;3","NAME^1;2","QLENGTH^1;1","QSUBSCRIPT^2;2","REVERSE^1;1" G FUNC2:$E(%F1,1,2)=%T,FUNC2:$P(%F1,"^")=%T
FNC ;;,ASCII^1;2,CHAR^1;999,DATA^1;1,EXTRACT^1;3,FIND^2;3,GET^1;2,JUSTIFY^2;3,LENGTH^1;2,ORDER^1;2,PIECE^2;4,QUERY^1;1,RANDOM^1;1,SELECT^1;999,TEXT^1;1,VIEW^1;999,ZFUNC^1;999
 G E:$T(FNC)'[(","_%T_"^")
FUNC1 S %F1=$P($T(FNC),",",$F("ACDEFGJLOPQRSTVZ",%C)) G E:%F1=""
FUNC2 S %I=$F(%,"(",%I)-1,%(%N,0)="1^"_$P(%F1,"^",2),%(%N,1)=0,%(%N,2)=0,%(%N,3)=0,%(%N,"F")=%F1,%N=%N+1 S:$E(%F1)="S" %(%N-1,2)=1
 I ",DATA,NAME,ORDER,QUERY,GET,"[(","_$P(%F1,"^")_",") G DATA^DIM2
 I $E(%F1)="T",$E(%F1,2)'="R" D  I %ERR G ERR^DIM2
 . S %A=%I,%I=$F(%,")",%A)-1,%N=%N-1,%A=$P($E(%,%A,%I-1),"(",2,99)
 . I %A?1"+"1N.E S %A=$E(%A,2,999)
 . N %,%I,%N S %=%A D LABEL^DIM3(1)
 G GG
 ;
SPV ; intrinsic special variables (FUNC)
 I $E(%,%I+1)?1U S %I=%I+1,%C=%C_$E(%,%I) G SPV
 I ",D,EC,ES,ET,K,P,Q,ST,SY,TL,TR,"[(","_%C_",") G E ; SAC
 I "HIJSTXYZ"[%C&(%C?1U)!(%C?1"Z".U) G GG
 I "[],)><=_&#!'+-*\/?"'[$E(%,%I+1) G E
 I ",DEVICE,ECODE,ESTACK,ETRAP,KEY,PRINCIPAL,QUIT,STACK,SYSTEM,TLEVEL,TRESTART,"[(","_%C_",") G E ; SAC
 I ",HOROLOG,IO,JOB,STORAGE,TEST,"[(","_%C_",") G GG
E G ERR^DIM2
 ;
%INC S %I=%I+1,%C=$E(%,%I) Q
 ;
FN ; literal string argument 2 of $FNUMBER (QUOTE)
 Q:%(%N-1,1)'=1  F %FZ=%I-1:-1 S %FN=$E(%,%FZ) Q:%FN=""""
 S %FN=$TR($E(%,%FZ+1,%I-1),"pt","PT")
 F %FZ=1:1 Q:$E(%FN,%FZ)=""  I "+-,TP"'[$E(%FN,%FZ) S %ERR=1 Q
 Q:%ERR  I %FN["P" F %FZ=1:1 Q:$E(%FN,%FZ)=""  I "+-T"[$E(%FN,%FZ) S %ERR=1 Q
 Q
 ;
EXT ; extrinsic functions and variables (FUNC)
 D %INC
 F %I=%I+1:1 S %C1=$E(%,%I) Q:%C1?1PC&("^%"'[%C1)!(%C1="")  S %C=%C_%C1
 G:%C="" E G:%C?.E1"^" E G:%C["^^" E
 S %C1=$P(%C,"^",2) I %C1]"",%C1'?1U.15AN,%C1'?1"%".15AN G E
 S %C=$P(%C,"^") I %C]"",%C'?1U.7AN,%C'?1"%".7AN,%C'?1.8N G E
 I $E(%,%I)="(",$E(%,%I+1)'=")" S %(%N,0)="P^",(%(%N,1),%(%N,2),%(%N,3))=0,%N=%N+1 G GG
 S %I=%I+$S($E(%,%I,%I+1)="()":1,1:-1)
 G GG:"[],)><=_&#!'+-*/\?:"[$E(%,%I+1),E

DIM2
DIM2 ;SFISC/XAK,GFT,TOAD-FileMan: M Syntax Checker, Exprs ;20NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;12277;4186487;4104;
 ;
SUB ; "(": open paren situations (GG^DIM1)
 F %J=%I-1:-1 S %C1=$E(%,%J) Q:%C1'?1(1UN,1"%")
 S %C1=$E(%,%J+1,%I-1)
 I %C1]"",%C1'?1(1U,1"%").UN G ERR
 ;I %C1]"",%[("."_%C1) G ERR ;DID NOT ALLOW "W A(6)-$$X(.A)"
 S %(%N,0)=$S(%C1]""!($E(%,%J)="^"):"V^",$E(%,%J)="@":"@^",1:"0^")
 S %(%N,1)=0,%(%N,2)=0,%(%N,3)=0,%N=%N+1 G 1
 ;
UP ; ")": close paren situations (GG^DIM1)
 I %N=0 G ERR
 I "(,"[$E(%,%I-1),$P($G(%(%N-1,0)),"^")'["P" G ERR
 I $E(%,%I+1)]"","<>_[]:/\?'+-=!&#*),"""'[$E(%,%I+1) G ERR
 S %N=%N-1,%(%N,1)=%(%N,1)+1,%F=$P(%(%N,0),"^") I %F D  G ERR:%ERR
 . S %F=$P(%(%N,0),"^",2),%F1=%(%N,1)
 . I %F1<+%F S %ERR=1 Q  ; not enough commas for this function
 . I %F1>$P(%F,";",2) S %ERR=1 Q  ; too many commas for this function
 . I %(%N,2),'%(%N,3) S %ERR=1 ; we're in $S and haven't yet hit a :
 K %(%N+1)
 I '%F,%F'["V",%F'["@",%F'["P",%(%N,1)>1 G ERR
 G 1
 ;
AR ; ",": comma situations -- "P" below means "parameters" (GG^DIM1)
 I %N<1 G ERR
 I "(,"[$E(%,%I-1),$P($G(%(%N-1,0)),"^")'["P" G ERR
 I '%(%N-1,3),%(%N-1,2) G ERR
 I "@("[$E(%,1,2) G ERR
 S %(%N-1,1)=%(%N-1,1)+1,%(%N-1,3)=0 G 1
 ;
SEL ; ":": $SELECT delimiter (GG^DIM1)
 S %(%N-1,3)=%(%N-1,3)+1 G ERR:'%(%N-1,2)!(%(%N-1,3)>1),1
 ;
GLO ; "^": global reference (GG^DIM1)
 D %INC G ERR:$E(%,%I,999)'?1U.UN.P.E&("%("'[%C)
 G ERR:"=+-\/<>(,#!&*':@[]_"'[$E(%,%I-2)
 S %I=%I-1 G 1
 ;
PAT ; "?": pattern match (GG^DIM1)
 G ERR:%I=1,1:$E(%,%I+1)="@" D %INC,PATTERN G ERR:%ERR S %I=%I-1 G 1
 ;
PATTERN F  D PATATOM Q:%C'?1N&(%C'=".")!%ERR
 Q
PATATOM D REPCOUNT Q:%ERR
 I %C="""" D STRLIT,%INC:'%ERR Q
 I %C="(" D ALTRN8 Q
 D PATCODE
 Q
REPCOUNT ;
 I %C'?1N,%C'="." S %ERR=1 Q
 N FROM S FROM=+$E(%,%I,999) I %C?1N D INTLIT Q:%ERR
 I %C="." D %INC
 Q:%C'?1N  I +$E(%,%I,999)<FROM S %ERR=1 Q
 D INTLIT Q
INTLIT I %C'?1N S %ERR=1 Q
 F  D %INC Q:%C'?1N
 Q
STRLIT F  D %INC Q:%C=""  I %C="""" Q:$E(%,%I+1)'=""""  S %I=%I+1
 I %C="" S %ERR=1
 Q
PATCODE I "ACELNPU"'[%C!(%C="") S %ERR=1 Q
 F  D %INC Q:%C=""  Q:"ACELNPU"'[%C
 Q
ALTRN8 I %C'="(" S %ERR=1 Q
 D %INC,PATATOM Q:%ERR
 F  Q:","'[%C  D %INC,PATATOM Q:%ERR
 I %C'=")" S %ERR=1 Q
 D %INC
 Q
 ;
BINOP ; binary operator (GG^DIM1)
 S %Z1=""")%'",%Z2="""($+-^%@'." G OPCHK
 ;
MTHOP ; math or relational operator (GG^DIM1)
 S %Z1=""")%",%Z2="""($+-^%@'." G OPCHK
 ;
UNOP ; unary operator (GG^DIM1)
 S %Z1=""":<>+-'\/()%@#&!*=_][,"
 S %Z2="""($+-=&!^%.@'" I %C="'" S %Z2=%Z2_"<>?[]"
 G OPCHK
 ;
IND ; "@": indirection (GG^DIM1)
 I $E(%COM)="F" G ERR
 S %Z1="^?@(%+-=\/#*!&'_<>[]:,.",%Z2="""(+^-'$@%" G OPCHK
 ;
OPCHK ; ensure that the characters before and after the operator are OK
 S %L1=$E(%,%I-1),%L2=$E(%,%I+1) I %L1="'","[]&!<>="[%C S %L1=$E(%,%I-2)
 I %L1="","+-'@"'[%C G ERR ;              binary: require before
 I %L1'?1UN,%Z1'[%L1 G ERR ;              all: screen before
 F %F="*","]" I %C=%F,%L2=%F S %I=%I+1,%L2=$E(%,%I+1) Q
 I %L2="" G ERR ;                         all: require after
 I %L2'?1UN,%Z2'[%L2 G ERR ;              all: screen after
 I %C="'","!&[]?=<>"'[%L2,%L1?1(1")",1UN) G ERR ;GFT: unary "'" may precede an operator, can't follow a variable name
 G 1
 ;
1 ; common exit point for all of ^DIM2
 G GG^DIM1
 ;
DATA ; glvn arguments of $D,$G,$NA,$O, & $Q functions (FUNC^DIM1)
 D %INC G ERR:%C="",ERR:%C=")",DATA:"^@"[%C D VAR
 G ERR:"@(,)"'[%C!%ERR,GG1^DIM1
 ;
VAR ; variables encountered while parsing exprs (DATA, GG^DIM1)
 N %START S %START=%I-1 I $E(%,%START)="^" S %START=%START-1
 I %C="%" D %INC
 N OUT S OUT=0 F %J=%I:1 S %C=$E(%,%J) D  Q:OUT
 . I ",<>?/\[]+-=_()*&#!':"[%C S OUT=1 Q
 . I %C="@",$E(%,%J+1)="(",$E(%,%START)="@" S OUT=1 Q
 . I %C'?1UN S %ERR=1
 . I %C="^",$D(%(%N-1,"F")),%(%N-1,"F")["TEXT" S %ERR=0,OUT=1
 Q:%ERR
 I %C="@" S %I=%J Q
 S %F=$E(%,%I,%J-1)
 I %F="^",$E(%,%J)'="(" S %ERR=1
 I %F]"",%F'?1U.UN,$E(%,%I-1,%J-1)'?1"%".UN S %ERR=1
 S %I=%J Q
 ;
%INC S %I=%I+1,%C=$E(%,%I)
 Q
 ;
ERR S %ERR=1,%N=0
FINISH G ERR:%N'=0 K %C,%,%F,%F1,%I,%J,%L1,%L2,%N,%T,%Z1,%Z2,%FN,%FZ
Q Q

DIM3
DIM3 ;SFISC/JFW,GFT,TOAD-FileMan: M Syntax Checker, Commands ;25MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
DG ; DO and GET (D^DIM and G^DIM)
 G GC^DIM:%ARG=""!%ERR D PARS G ER:%ERR
 S %L=":" D PARS1 G ER:%ERR I %C=%L G ER:%A1="" S %=%A1 D ^DIM1
 I %A["@^" S %=%A D ^DIM1 G DG
 I %A["(",$E(%A)'="@",$E($P(%A,"^",2))'="@" D  G ER:%ERR
 . I %COM'="D" S %ERR=1 Q
 . S %=%A
 . I %'?.E1"(".E1")" S %ERR=1 Q
 . S %C=$P(%,"("),%C1=$P(%C,"^",2,999),%I=$F(%,"(")-1
 . I %C=""!(%C?.E1"^") S %ERR=1 Q
 . I %C1]"",%C1'?1U.15AN,%C1'?1"%".15AN S %ERR=1 Q
 . S %C=$P(%C,"^") I %C]"",%C'?1U.15AN,%C'?1"%".15AN,%C'?1.15N S %ERR=1 Q
 . Q:$E(%,%I,%I+1)="()"
 . S (%(-1,2),%(-1,3))=0,%N=1,%(0,0)="P^",(%(0,1),%(0,2),%(0,3))=0
 . D GG^DIM1
 E  D LABEL(0)
 G DG
 ;
LABEL(OFFSET) ; labelref, entryref, and $TEXT argument (DG and TEXT^DIM1)
 S %L="^" D PARS1 Q:%ERR
 I %C=%L S:%A1=""!($E(%A1)="^") %ERR=1 S %=%A1 D VV,^DIM1 Q:%ERR
 S %=%A D VV:%'=+%&'OFFSET,^DIM1 Q
 ;
KL ; KILL, LOCK, and NEW (K^DIM and LK)
 D PARS G ER:%ERR
 I %A="",%C="," G ER
 I %A?1"^"1UP.UN,%COM'="L" G ER
 I %A?1"(".E1")" D  G KL
 . S %ARG("E")=$L(%ARG)
 . S %A=$E(%A,2,$L(%A)-1) S %ARG=%A_$S(%ARG]"":","_%ARG,1:"")
 S %=%A I %COM="L","+-"[$E(%A) S $E(%A)=""
 I %COM="N",'$$LNAME(%) G ER
 I %COM="K",$D(%ARG("E")),'$$LNAME(%) G ER
 I $D(%ARG("E")),$L(%ARG)'>%ARG("E") K %ARG("E")
 D VV,^DIM1 G GC^DIM:%ARG=""!%ERR
 G KL
 ;
LK ; LOCK (L^DIM)
 S %A=%ARG,%L=":" S:"+-"[$E(%A) %A=$E(%A,2,999) D PARS1
 I %C=%L G ER:%A1="" S %=%A1 D ^DIM1
 S %ARG=%A G GC^DIM:%A="",KL
 ;
HN ; HANG (H^DIM)
 S %=%ARG D ^DIM1 G GC^DIM
 ;
OP ; OPEN and USE (O^DIM and U^DIM)
 G GC^DIM:%ARG=""!%ERR D PARS G ER:%ERR!(%C=","&(%A=""))
 G US:%COM="U" S %L=":" D PARS1 S %A2=%A,%A=%A1 S:%C=%L&(%A="") %ERR=1 D PARS1 G ER:%ERR!(%C=%L&(%A1=""))
 F %L="%A1","%A2" S %=@%L D ^DIM1 G OP:%ERR
 G OP
US S %L=":" D PARS1 G ER:%C=%L&(%A1="") S %=%A D ^DIM1
 S %A=%A1 D PARS1 G ER:%C]"",OP
 ;
FR ; FOR (F^DIM)
 S %L="=",%A=%ARG D PARS1 G ER:%ERR!(%A1="")!(%A="") S %ARG=%A1
 S %=%A G ER:%A?1"^".E D VV,^DIM1 G ER:%ERR
FR1 G GC^DIM:%ARG=""!%ERR D PARS
 S %L=":" F %A=%A,%A1 D PARS1 G ER:%ERR!(%A=""&(%C=%L)) S %=%A D ^DIM1
 I %A1]"" S %=%A1 D ^DIM1
 G FR1
 ;
PARS S (%A,%C)="" Q:%ERR  S (%ERR,%I)=0
INC D %INC D QT:%C="""",PARAN:%C="(" Q:%ERR  G OUT:","[%C,INC
QT D %INC Q:%C=""""  G QT:%C]"" S %ERR=1 Q
PARAN S %P=1 F %J=0:0 D %INC D QT:%C="""" S %P=%P+$S(%C="(":1,%C=")":-1,1:0) Q:'%P  I %C="" S %ERR=1 Q
 Q
OUT S %A=$E(%ARG,1,%I-1),%ARG=$E(%ARG,%I+1,999) Q
%INC S %I=%I+1,%C=$E(%ARG,%I) Q
 ;
PARS1 S (%A1,%C)="" Q:%ERR  S (%ERR,%I)=0
INCR D %INC1 D QT1:%C="""",PARAN1:%C="(" Q:%ERR=1  G OUT1:%L[%C,INCR
OUT1 S %A1=$E(%A,%I+1,999),%A=$E(%A,1,%I-1) Q
QT1 D %INC1 Q:%C=""""  G QT1:%C]"" S %ERR=1 Q
PARAN1 S %P=1 F %J=0:0 D %INC1 D QT1:%C="""" S %P=%P+$S(%C="(":1,%C=")":-1,1:0) Q:'%P  I %C="" S %ERR=1 Q
 Q
%INC1 S %I=%I+1,%C=$E(%A,%I) Q
 ;
VV ; variable, label, or routine name (LABEL, KL, and FR)
 I '%ERR,%]"",%'["@",%'?1U.15UN,%'?1U.15UN1"(".E1")",%'?1"%".15UN1"(".E1")",%'?1"%".15UN,%'?1"^"1U.15UN1"(".E1")",%'?1"^%".15UN1"(".E1")",%'?1"^(".E1")",%'?1"^"1U.15UN S %ERR=1
 S:%["?@" %ERR=1 Q
 ;
LNAME(%) ; lname (KL)
 I %?1(1A,1"%").7UN Q 1
 I %?1"@".E Q 1
 Q 0
 ;
ER G ER^DIM

DIM4
DIM4 ;SFISC/JFW,GFT,TOAD-FileMan: M Syntax Checker, Commands ;5/6/97  09:10
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;12279;3292224;3060;
 ;
BK ; BREAK and QUIT (B^DIM and Q^DIM)
 I %ARG]"" S %=%ARG D ^DIM1 G ER:%ERR
 G GC^DIM
 ;
CL ; CLOSE (C^DIM)
 G ER:%ERR I %ARG]"" F %Z=0:0 D S S %=%A D ^DIM1 G:%ARG=""!%ERR GC^DIM
 G GC^DIM
 ;
IX ; IF and XECUTE (I^DIM and X^DIM)
 G GC^DIM:%ARG=""!%ERR D S S %L=":" D S1 I %C=%L S %=%A1 D ^DIM1 G ER:%A1=""!%ERR
 S %=%A D ^DIM1 G IX
 ;
ST ; SET and MERGE (S^DIM and M^DIM)
 G GC^DIM:%ARG=""!%ERR D S G ER:%ERR!(%A=""&(%C=","))
 I %A?1"@".E S %=%A D ^DIM1 G ST
 S %L="=" D S1 G ER:(%A="")!(%A1="") S %=%A1 G ER:%COM="M"&'$$GLVN(%) D ^DIM1 G ER:%ERR
 I %A?1"(".E1")" S %A=$E(%A,2,$L(%A)-1) G ER:%COM="M",STM
 D VV G ST
 ;
STM ; SET (x,y)=... (ST)
 G ST:%ERR!(%A=""),ER:%A?1",".E S %L="," D S1 G ER:%ERR!(%C=%L&(%A1=""))
 D VV S %A=%A1 G STM
 ;
RD ; READ (R^DIM)
 G GC^DIM:%ARG=""!%ERR D S G ER:%ERR!(%C=","&(%A=""))
 I "!#?"[$E(%A,1) S %I=0 D FRM G RD
 I %A?1"""".E G ER:$P(%A,"""",3)'="" S %=%A D ^DIM1 G RD
 I %A?1"*".E S %A=$E(%A,2,999)
 I $E(%A)="^","^TMP^XTMP^"'[$P(%A,"(") G ER
 F %L=":","#" D  G ER:%ERR
 . D S1 Q:%ERR
 . I %A="" S %ERR=1 Q
 . I %A1="",%C=%L S %ERR=1 Q
 . S %=%A1 D ^DIM1
 D VV G ER:%ERR,RD
 ;
WR ; WRITE (W^DIM)
 G GC^DIM:%ARG=""!%ERR D S G ER:%ERR!(%A=""&(%C=","))
 I "!#?/"[$E(%A) S %I=0 D FRM G WR
 S:%A?1"*".E %A=$E(%A,2,999) S %=%A D ^DIM1 G WR
 ;
FRM ; format (RD and WR)
 S %I=%I+1,%C=$E(%A,%I) Q:%C=""  G FRM:"!#"[%C
 S %=$E(%A,%I+1,999) I %]"",%C="?" D ^DIM1 Q
 I %C="/",%COM="W" S:%?1"?".E %="A"_$E(%,2,999) I %?1AN.E D ^DIM1 Q
 S %ERR=1 Q
 ;
S ; split at first comma: end of first argument (*)
 S (%A,%C)="" Q:%ERR  S (%ERR,%I)=0
INC D %INC D QT:%C="""",P:%C="(" Q:%ERR  G OUT:","[%C,INC
QT D %INC Q:%C=""""  G QT:%C]"" S %ERR=1 Q
P S %P=1 F %J=0:0 D %INC D QT:%C="""" S %P=%P+$S(%C="(":1,%C=")":-1,1:0) Q:'%P  I %C="" S %ERR=1 Q
 Q
OUT S %A=$E(%ARG,1,%I-1),%ARG=$E(%ARG,%I+1,999) Q
%INC S %I=%I+1,%C=$E(%ARG,%I) Q
 ;
S1 ; split at first instance of %L (*)
 S (%A1,%C)="" Q:%ERR  S (%ERR,%I)=0
INCR D %INC1 D QT1:%C="""",P1:%C="(" Q:%ERR  G OUT1:%L[%C,INCR
OUT1 S %A1=$E(%A,%I+1,999),%A=$E(%A,1,%I-1) Q
QT1 D %INC1 Q:%C=""""  G QT1:%C]"" S %ERR=1 Q
P1 S %P=1 F %J=0:0 D %INC1 D QT1:%C="""" S %P=%P+$S(%C="(":1,%C=")":-1,1:0) Q:'%P  I %C="" S %ERR=1 Q
 Q
%INC1 S %I=%I+1,%C=$E(%A,%I) Q
 ;
VV ; glvn or setleft (ST, STM, and RD)
 S %=%A Q:%ERR
 I %]"",$$GLVN(%)=0 D
 .I %COM'="S" S %ERR=1 Q
 .I %["(",(%?1"$P".E)!(%?1"$E".E) Q
 .I %="$X"!(%="$Y") Q
 .I %="$D"!(%="$DEVICE")!(%="$K")!(%="$KEY")!(%="$EC")!(%="$ECODE")!(%="$ET")!(%="$ETRAP") S %ERR=1 Q  ; SAC
 .S %ERR=1
 D ^DIM1:'%ERR Q
 ;
GLVN(%) ; glvn (not counting subscript syntax)
 I %?.1"^"1U.UN Q 1
 I %?.1"^"1U.UN1"("1.E1")" Q 1
 I %?.1"^"1"%".UN Q 1
 I %?.1"^"1"%".UN1"("1.E1")" Q 1
 I %?1"^("1.E1")" Q 1
 I %?1"^$"1.U1"("1.E1")" Q 1
 I %?1"@"1.E Q 1
 Q 0
 ;
ER G ER^DIM

DINIT
DINIT ;SFISC/GFT,XAK-INITIALIZE VA FILEMAN ; 14NOV2012
V ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D KL^DINIT6
N ;
 D VERSION N DIFROM S DIFROM=VERSION W !!,X D DT^DICRW
 I $G(^DD("VERSION"))]"",^DD("VERSION")_"z"]](VERSION_"z") D
 . W $C(7),!!,"*** WARNING!!  VA FileMan version "_^DD("VERSION")_" is currently loaded on this system.",!,"This Initialization will bring in VA FileMan version "_VERSION_", an earlier version!!",!!
 S Y=$G(^DD("OS")) I Y,"1,2,3,4,5,6,10,11,12,13,15,"[(Y_",") W $C(7),!!,"Your defined operating system entry "_$P($G(^DD("OS",Y,0)),U)_" does not support the",!,"1995 M Standards.",!!,"You may not initialize VA FileMan V"_VERSION G KL^DINIT6
DO W !!,"Initialize VA FileMan now?  NO//" R Y:60 G:Y["^"!("Nn"[$E(Y))!('$T) KL^DINIT6
 I "Yy"'[$E(Y) W !,"Answer YES to begin Initializing VA FileMan" G DO
NA W !!,"SITE NAME: " I $D(^DD("SITE")) W ^("SITE"),"// "
 R X:60 G KL^DINIT6:X="^"!'$T I X="",$D(^("SITE"))#2 S X=^("SITE")
 I X'?1AN.ANP W "  ENTER THE NAME OF THIS INSTALLATION SITE",!! G NA
 S %X=X
NO W !!,"SITE NUMBER: " W:$D(^DD("SITE",1)) ^(1),"// "
 R X:60 G KL^DINIT6:X="^"!'$T I $D(^(1)),X="" S X=^(1)
 S:X>0 ^DD("SITE")=%X,^DD("SITE",1)=X
 I X'>0 W "  ENTER A NUMBER, CORRESPONDING TO YOUR INSTITUTION" G NO
 ;***** REMOVE AFTER V21 INIT *****
 ;D
 ;. N DIREC F DIREC=0:0 S DIREC=$O(^DI(.84,DIREC)) Q:'DIREC  Q:DIREC>10000  K ^DI(.84,DIREC,5)
 ;. Q
 ;*********************************
 K ^DD(0) D ^DINIT0,^DINIT11B
 D OSETC
 W ! S Y=1 D OS G KL^DINIT6:Y<0
 W !!,"Now loading other FileMan files--please wait." G GO
 ;
 ;
OS W ! S DIC="^DD(""OS"",",DIC(0)="IAQE",DIC("A")="TYPE OF MUMPS SYSTEM YOU ARE USING: " I $D(^DD("OS"))#2 S (DITZS,DIC("B"))=^("OS") S:DITZS=7 (DITZS,DIC("B"))=18
 E  S (DITZS,^DD("OS"))=100
 D ^DIC K DIC G Q:Y<0 S (DITZS,^DD("OS"))=+Y
 I $D(^%ZTSK),$D(^%ZOSF("OS"))#2,$D(^("MGR"))#2 D
 . S ZTRTN="OS^%RCR",ZTUCI=^%ZOSF("MGR"),ZTDTH=$H,ZTIO="",ZTSAVE("DITZS")=""
 . S ZTDESC="Set Operating System" D ^%ZTLOAD Q
Q K DITZS,ZTSK Q
VERSION ;
 S VERSION=$P($T(V),";",3),X="VA FileMan V."_VERSION Q
 ;
GO S I=$C(126),DIT=$P($H,",",2)
 S $P(^DIBT(0),U,1,2)="TEMPLATE^.4I",$P(^DIE(0),U,1,2)="TEMPLATE^.4I",$P(^DIPT(0),U,1,2)="TEMPLATE^.4I",^(.01,0)="CAPTIONED^",^("F",1)="S DIC=DCC,DA=D0 D EN^DIQ"
 S ^DIPT(.02,0)="FILE SECURITY CODES^^^1",^("F",1)=".01;L20"_I_"0;R13"_I_31_I_33_I_35_I_34_I_32_I_21_I_20
 S ^DIA(0)="AUDIT^1.1I"
 K ^DD(.4),^(.41),^("^"),^(.403),^(.4031),^(.40315),^(.403115),^(.4032),^(.404),^(.40415),^(.4044),^(.404421),^(1.2),^(1,"B")
 K ^DIC(.403),^(.404),^(1.2)
 K ^DD(.44),^(.441),^(.4411),^(.447),^(.448),^(.411),^(.42),^(.81),^DIC(.44),^(.81)
 F I=.2,.4,.401,.402,.5,.6,.83,1.1,1.11,1.12,1.13 K ^DIC(I,"%D")
 K ^DIC(.46),^DD(.46),^(.461),^(.463)
 K ^DIC(.11),^(.31) F I=.11,.111,.112,.114,.31,.312 K ^DD(I)
 F I=1.521,1.52101,1.5211,1.5212,1.5213,1.5214,1.5215,1.5216,1.5217,1.5218,1.5219,1.52191,1.52192 K ^DIC(I),^DD(I)
 G ^DINIT0F0
 ;
OSETC ;BRING IN MUMPS OS, DIALOG & LANGUAGE DD AND DATA FOR FILEMAN
 N DN,R,D,DDF,DDT,DTO,DFR,DFN,DTN,DMRG,I,Z,D0
 W !!,"Now loading MUMPS Operating System File"
 D ^DINIT21,OSDD^DINIT24
 S ^DIC(.7,0)="MUMPS OPERATING SYSTEM^.7",^(0,"GL")="^DD(""OS""," D A^DINIT3
 S ^DIC(.7,"%D",0)="^^5^5^2940908^"
 S ^DIC(.7,"%D",1,0)="This file stores operating system-specific code.  Since the code to invoke"
 S ^DIC(.7,"%D",2,0)="some operating system utilities that FileMan uses varies among operating"
 S ^DIC(.7,"%D",3,0)="systems, code to perform these utilities is stored in and executed from"
 S ^DIC(.7,"%D",4,0)="this file.  During the FileMan INIT process an operating system is"
 S ^DIC(.7,"%D",5,0)="selected so that FileMan knows which entry to use from this file."
 K ^DD("OS","B"),DA,DIK S DA(1)=.7 S DIK="^DD(.7," D X^DINIT3
 K DA,DIK S DIK="^DD(""OS""," D X^DINIT3
 D
 . N I,DA,DIK F I=1,2,3,4,5,6,7,10,11,12,13,14,15 S DA=I,DIK="^DD(""OS""," D ^DIK
 . Q
 ;
 K ^UTILITY(U,$J),^UTILITY("DIK",$J),^UTILITY("KX",$J) W !!,"Now loading DIALOG and LANGUAGE Files"
 K:$G(^DIC(.85,"%MSC"))'=3121114.111954 ^DI(.85) ; VEN/SMH If lang file dd isn't the latest one, kill data off.
 K ^DIC(.85),^DD(.85),^DD(.8501),^DD(.8502) ; VEN/SMH - Kill the language file old DD, DIC and data. (22.2)
 S DN="^DINIT" F R=1:1:39 D @(DN_$$B36(R)) W "."
EGP F R=901:1:911 D @(DN_R) ;**CCO/NI  BRING IN EXTRA DIALOG ENTRIES
 S $P(^DIC(.84,0),U,1,2)="DIALOG^.84",$P(^DI(.84,0),U,1,2)="DIALOG^.84I" I $D(^DIC(.84,0,"GL")) D A1^DINIT3
 S $P(^DIC(.85,0),U,1,2)="LANGUAGE^.85",$P(^DI(.85,0),U,1,2)="LANGUAGE^.85I" I $D(^DIC(.85,0,"GL")) D A1^DINIT3
 F I=.84,.841,.842,.844,.845,.847,.8471,.85,.8501,.8502 D XX^DINIT3 ; VEN/SMH - added .8501 and .8502 for new lang file
 ; Keys and new style indexes installer ; new in FM V22.2
 N DIFRSA S DIFRSA=$NA(^UTILITY("KX",$J)) ; Tran global for Keys and Indexes
 N DIFRFILE S DIFRFILE=0 ; Loop through files
 F  S DIFRFILE=$O(@DIFRSA@("IX",DIFRFILE)) Q:'DIFRFILE  D
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . N DIFRD S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA) ; install New Style Indexes
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA) ; install keys
 K @DIFRSA ; kill off tran global
 ;
 D DATA
 Q
 ;
 ; VEN/SMH - added kill D1 since that causes a problem with Transfer/Merge
 ; for keyed fields if it leaks from the symbol table.
DATA W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0
 S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=0 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 K D1 Q:'$D(^(D0,0))  S Z=^(0) D I^DITR
 K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA
 ;
B36(X) Q $$N1(X\(36*36)#36+1)_$$N1(X\36#36+1)_$$N1(X#36+1)
N1(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

DINIT0
DINIT0 ;SFISC/GFT,XAK-INITIALIZE VA FILEMAN ;2JUL2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I '$D(^DD("SETPTCNODE")) S ^("SETPTCNODE")=$H W !! F I=0:0 S I=$O(^DD(I)) Q:'I  F J=0:0 S J=$O(^DD(I,J)) Q:'J  S %=+$P($P($G(^(J,0)),U,2),"p",2) I %,$D(^DD(%,0)) S ^(0,"PTC",I,J)="" ;COMPUTED POINTER
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT1:X?.P S @("^DD(0,"_$E($P(X," ",2),3,99)_")=Y")
 ;;0 ATTRIBUTE^N
 ;;"SB",.1,1
 ;;.001,0 NUMBER^N^^ ^K:$L(X)>12 X
 ;;.01,0 LABEL^RF^^0;1^K:$L(X)>30!(X?1E)!(X["""")!(X["=") X
 ;;.01,1,0 ^.1^1^1
 ;;.01,1,1,0 DA(2)^B
 ;;.01,1,1,1 S @(DIC_"""B"",X,DA)=""""")
 ;;.01,1,1,2 K @(DIC_"""B"",X,DA)")
 ;;.01,"DEL",.2,0 I DUZ(0)'="@",$P(^DD(DA(1),DA,0),"^",2)["X" W !,$C(7),"ONLY A PROGRAMMER CAN DELETE THIS FIELD!"
 ;;.01,"DEL",.3,0 W:$D(^DD("ACOMP",DA(1),DA)) !,$C(7),"WARNING-- A COMPUTED FIELD USES THIS FIELD!" I 0
 ;;.01,"DEL",1,0 I DA=.01 W $C(7),"??"
 ;;.01,"DEL","TRB",0 S %=+$P(^DD(DA(1),DA,0),U,2) I %,$D(^DD(%,"TRB")) S DA(0)=DA,DA=% D TRIG^DIDH S DA=DA(0)
 ;;.01,"DEL","T",0 I $O(^DD(DA(1),DA,5,0))>0 W $C(7),!,"CAN'T DELETE A FIELD THAT HAS A 'TRIGGER' POINTING TO IT!"
 ;;.01,"DEL","ID",0 I $D(^DD(DA(1),0,"ID",DA)) W !,"CAN'T DELETE IDENTIFIER!"
 ;;.1,0 TITLE^F^^.1;E1,999^K:$L(X)>100!(+X=X) X I $D(X),$L(X)<32,@("$D("_DIC_"""B"",X,DA))") K X
 ;;.1,1,0 ^.1^1^1
 ;;.1,1,1,0 DA(2)^B
 ;;.1,1,1,1 S:$L(X)<31 @(DIC_"""B"",X,DA)=1")
 ;;.1,1,1,2 K:$L(X)<31 @(DIC_"""B"",X,DA)")
 ;;.1,3 (OPTIONAL) FULL FIELD NAME  (MUST BE DIFFERENT FROM LABEL)
 ;;.12,0 VARIABLE POINTER^.12^^V;0
 ;;.2,0 SPECIFIER^F^^0;2
 ;;.2,1,0 ^.1^4^4
 ;;.2,1,1,0 DA(2)^SB^ (SUBFILE USED)
 ;;.2,1,1,1 S:X @(DIC_"""SB"",+X,DA)=""""")
 ;;.2,1,1,2 K:X @(DIC_"""SB"",+X,DA)")
 ;;.2,1,2,0 DA(2)^RQ^
 ;;.2,1,2,1 S:X["R" @(DIC_"""RQ"",DA)=""""")
 ;;.2,1,2,2 K:X["R" @(DIC_"""RQ"",DA)")
 ;;.2,1,3,0 ^
 ;;.2,1,3,1 S %=$P(X,"P",2) S:$A(%)=48!%&$D(^DD(+%,0)) ^(0,"PT",DA(1),DA)=""
 ;;.2,1,3,2 S %=$P(X,"P",2) K:$A(%)=48!% ^DD(+%,0,"PT",DA(1),DA)
 ;;.2,1,666,0 ^
 ;;.2,1,666,1 N % S %=+$P(X,"p",2) I %,$D(^DD(%,0)) S ^(0,"PTC",DA(1),DA)="" ;COMPUTED POINTER
 ;;.2,1,666,2 N % S %=+$P(X,"p",2) I %,$D(^DD(%,0)) K ^(0,"PTC",DA(1),DA)
 ;;.2,9 ^
 ;;.23,0 LENGTH^CJ3^^ ; ^S X=$S($D(@(DCC_"D0,0)")):$P(^(0),U,2),1:""),X=$P(X,"J",2),X=$S(X:+X,1:"")
 ;;.23,9 ^
 ;;.24,0 DECIMAL DEFAULT^CJ1^^ ; ^S @("X=$P($G("_DCC_"D0,0)),U,2)"),X=$P($P(X,"J",2),",",2)
 ;;.25,0 TYPE^CJ15^^ ; ^S X=$P($G(@(DCC_"D0,0)")),U,2),X=$S(X["C":6,X["N":2,X["P":7,X["S":3,X["D":1,X["V":8,X["K":9,X["W"!$S('X:0,'$D(^DD(+X,.01,0)):0,1:$P(^(0),U,2)["W"):5,1:0),X=$S($D(^DOPT("DICATT",X,0)):$P(^(0)," "),1:"FREE TEXT")
 ;;.25,9 ^

DINIT001
DINIT001 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;22AUG2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DIC(.84,0,"GL")
 ;;=^DI(.84,
 ;;^DIC("B","DIALOG",.84)
 ;;=
 ;;^DIC(.84,"%D",0)
 ;;=^^8^8^2941121^^^^
 ;;^DIC(.84,"%D",1,0)
 ;;=This file stores the dialog used to 'talk' to a user (error messages,
 ;;^DIC(.84,"%D",2,0)
 ;;=help text, and other prompts.) Entry points in the ^DIALOG routine
 ;;^DIC(.84,"%D",3,0)
 ;;=retrieve text from this file.  Variable parameters can be passed to these
 ;;^DIC(.84,"%D",4,0)
 ;;=calls.  The parameters are inserted into windows within the text as it is
 ;;^DIC(.84,"%D",5,0)
 ;;=built.  The text is returned in an array.  This file and associated calls
 ;;^DIC(.84,"%D",6,0)
 ;;=can be used by any package to pass information in arrays rather than
 ;;^DIC(.84,"%D",7,0)
 ;;=writing to the current device.  Record numbers 1 through 10000 are
 ;;^DIC(.84,"%D",8,0)
 ;;=reserved for VA FileMan.
 ;;^DD(.84,0)
 ;;=FIELD^^8^11
 ;;^DD(.84,0,"DT")
 ;;=2960426
 ;;^DD(.84,0,"ID","WRITE")
 ;;=N DIALID S DIALID(1)=$P($G(^(0)),U,5) S:DIALID(1)="" DIALID=+$O(^(2,0)),DIALID(1)=$E($G(^(DIALID,0)),1,42) S DIALID(1,"F")="?10" D EN^DDIOL(.DIALID)
 ;;^DD(.84,0,"IX","B",.84,.01)
 ;;=
 ;;^DD(.84,0,"IX","C",.84,1.2)
 ;;=
 ;;^DD(.84,0,"IX","D",.84,1.3)
 ;;=
 ;;^DD(.84,0,"NM","DIALOG")
 ;;=
 ;;^DD(.84,0,"PT",1.52192,4)
 ;;=
 ;;^DD(.84,.01,0)
 ;;=DIALOG NUMBER^RNJ14,3X^^0;1^K:+X'=X!(X>9999999999.999)!(('$G(DIFROM))&(X<10000.001))!(X?.E1"."4N.N) X S:$G(X) DINUM=X
 ;;^DD(.84,.01,1,0)
 ;;=^.1
 ;;^DD(.84,.01,1,1,0)
 ;;=.84^B
 ;;^DD(.84,.01,1,1,1)
 ;;=S ^DI(.84,"B",$E(X,1,30),DA)=""
 ;;^DD(.84,.01,1,1,2)
 ;;=K ^DI(.84,"B",$E(X,1,30),DA)
 ;;^DD(.84,.01,3)
 ;;=Type a Number between 10000.001 and 9999999999.999, up to 3 Decimal Digits
 ;;^DD(.84,.01,21,0)
 ;;=^^1^1^2940523^
 ;;^DD(.84,.01,21,1,0)
 ;;=The dialogue number is used to uniquely identify a message.
 ;;^DD(.84,.01,"DT")
 ;;=2940623
 ;;^DD(.84,1,0)
 ;;=TYPE^RS^1:ERROR;2:GENERAL MESSAGE;3:HELP;^0;2^Q
 ;;^DD(.84,1,3)
 ;;=Enter code that reflects how this dialogue is used when talking to the users.
 ;;^DD(.84,1,21,0)
 ;;=^^2^2^2940523^
 ;;^DD(.84,1,21,1,0)
 ;;=This code is used to group the entries in the FileMan DIALOG file,
 ;;^DD(.84,1,21,2,0)
 ;;=according to how they are used when interacting with the user.
 ;;^DD(.84,1,23,0)
 ;;=^^3^3^2940523^
 ;;^DD(.84,1,23,1,0)
 ;;=This field is used to tell the DIALOG routines what array to use in
 ;;^DD(.84,1,23,2,0)
 ;;=returning the dialogue.  It is also used for grouping the dialogue for
 ;;^DD(.84,1,23,3,0)
 ;;=reporting purposes.
 ;;^DD(.84,1,"DT")
 ;;=2940523
 ;;^DD(.84,1.2,0)
 ;;=PACKAGE^P9.4'^DIC(9.4,^0;4^Q
 ;;^DD(.84,1.2,1,0)
 ;;=^.1
 ;;^DD(.84,1.2,1,1,0)
 ;;=.84^C
 ;;^DD(.84,1.2,1,1,1)
 ;;=S ^DI(.84,"C",$E(X,1,30),DA)=""
 ;;^DD(.84,1.2,1,1,2)
 ;;=K ^DI(.84,"C",$E(X,1,30),DA)
 ;;^DD(.84,1.2,1,1,"%D",0)
 ;;=^^3^3^2940623^
 ;;^DD(.84,1.2,1,1,"%D",1,0)
 ;;=Cross-reference on Package file.  Used for identifying DIALOG entries by
 ;;^DD(.84,1.2,1,1,"%D",2,0)
 ;;=the package that owns the entry, and for populating the BUILD file during
 ;;^DD(.84,1.2,1,1,"%D",3,0)
 ;;=package distribution.
 ;;^DD(.84,1.2,1,1,"DT")
 ;;=2940623
 ;;^DD(.84,1.2,3)
 ;;=Enter the name of the Package that owns and distributes this entry.
 ;;^DD(.84,1.2,21,0)
 ;;=^^3^3^2940526^
 ;;^DD(.84,1.2,21,1,0)
 ;;=This is a pointer to the Package file.  Each entry in this file belongs
 ;;^DD(.84,1.2,21,2,0)
 ;;=to, and is distributed by, a certain package.  The Package field should be
 ;;^DD(.84,1.2,21,3,0)
 ;;=filled in for each entry on this file.
 ;;^DD(.84,1.2,"DT")
 ;;=2940623
 ;;^DD(.84,1.3,0)
 ;;=SHORT DESCRIPTION^F^^0;5^K:$L(X)>42!($L(X)<1) X
 ;;^DD(.84,1.3,1,0)
 ;;=^.1
 ;;^DD(.84,1.3,1,1,0)
 ;;=.84^D
 ;;^DD(.84,1.3,1,1,1)
 ;;=S ^DI(.84,"D",$E(X,1,30),DA)=""
 ;;^DD(.84,1.3,1,1,2)
 ;;=K ^DI(.84,"D",$E(X,1,30),DA)
 ;;^DD(.84,1.3,1,1,"DT")
 ;;=2960426
 ;;^DD(.84,1.3,3)
 ;;=Description used to identify entry on lookup.  Answer must be 1-42 characters in length.
 ;;^DD(.84,1.3,21,0)
 ;;=^^2^2^2960426^
 ;;^DD(.84,1.3,21,1,0)
 ;;=Short description is used to identify an entry on lookup.  The "WRITE"
 ;;^DD(.84,1.3,21,2,0)
 ;;=identifier will display this description if it is not null.
 ;;^DD(.84,1.3,"DT")
 ;;=2960426
 ;;^DD(.84,2,0)
 ;;=DESCRIPTION^.842^^1;0
 ;;^DD(.84,2,21,0)
 ;;=^^1^1^2930824^^
 ;;^DD(.84,2,21,1,0)
 ;;=  Used for internal documentation purposes.
 ;;^DD(.84,3,0)
 ;;=INTERNAL PARAMETERS NEEDED^S^y:YES;^0;3^Q
 ;;^DD(.84,3,3)
 ;;=
 ;;^DD(.84,3,21,0)
 ;;=^^6^6^2931105^
 ;;^DD(.84,3,21,1,0)
 ;;=  Some dialogue is built by inserting variable text (internal parameters)
 ;;^DD(.84,3,21,2,0)
 ;;=into windows in the word-processing TEXT field.  The insertable text might
 ;;^DD(.84,3,21,3,0)
 ;;=be, for example, File or Field names.  This field should be set to YES if
 ;;^DD(.84,3,21,4,0)
 ;;=any internal parameters need to be inserted into the TEXT.  If the field
 ;;^DD(.84,3,21,5,0)
 ;;=is not set to YES, the DIALOG routine will not go through the part of the
 ;;^DD(.84,3,21,6,0)
 ;;=code that stuffs the internal parameters into the text.
 ;;^DD(.84,3,"DT")
 ;;=2931105
 ;;^DD(.84,4,0)
 ;;=TEXT^.844^^2;0
 ;;^DD(.84,4,21,0)
 ;;=^^7^7^2941122^
 ;;^DD(.84,4,21,1,0)
 ;;=Actual text of the message.  If parameters (variable pieces of text) are
 ;;^DD(.84,4,21,2,0)
 ;;=to be inserted into the dialogue when the message is built, the parameter
 ;;^DD(.84,4,21,3,0)
 ;;=will appear as a 'window' in this TEXT field, surrounded by vertical bars.
 ;;^DD(.84,4,21,4,0)
 ;;=The data within the 'window' will represent a subscript of the input
 ;;^DD(.84,4,21,5,0)
 ;;=parameter list that is passed to BLD^DIALOG or $$EZBLD^DIALOG when
 ;;^DD(.84,4,21,6,0)
 ;;=building the message. This same subscript should be used as the .01 of the
 ;;^DD(.84,4,21,7,0)
 ;;=PARAMETER field in this file to document the parameter.
 ;;^DD(.84,5,0)
 ;;=PARAMETER^.845A^^3;0
 ;;^DD(.84,6,0)
 ;;=POST MESSAGE ACTION^K^^6;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.84,6,3)
 ;;=This is Standard MUMPS code.  This code will be executed whenever this message is retrieved through a call to BLD^DIALOG or $$EZBLD^DIALOG.
 ;;^DD(.84,6,9)
 ;;=@
 ;;^DD(.84,6,21,0)
 ;;=^^6^6^2941122^
 ;;^DD(.84,6,21,1,0)
 ;;=If some special action should be taken whenever this message is built,
 ;;^DD(.84,6,21,2,0)
 ;;=MUMPS code can be entered here.  This code will be executed by the
 ;;^DD(.84,6,21,3,0)
 ;;=BLD^DIALOG or $$EZBLD^DIALOG routines, immediately after the message text
 ;;^DD(.84,6,21,4,0)
 ;;=has been built in the output array.  For example, the code could set a

DINIT002
DINIT002 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;7APR2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DD(.84,6,21,5,0)
 ;;=special flag into a global or local variable to notify the calling routine
 ;;^DD(.84,6,21,6,0)
 ;;=that some extra action needed to be taken.
 ;;^DD(.84,6,23,0)
 ;;=^^7^7^2941122^
 ;;^DD(.84,6,23,1,0)
 ;;=At the time of executing this code
 ;;^DD(.84,6,23,2,0)
 ;;= D0 = IEN for the entry in the DIALOG file
 ;;^DD(.84,6,23,3,0)
 ;;= DIPI(n) = (for sequential number n) parameters incorporated in the text.
 ;;^DD(.84,6,23,4,0)
 ;;= DIPE(n) = parameters output back to the user
 ;;^DD(.84,6,23,5,0)
 ;;= 
 ;;^DD(.84,6,23,6,0)
 ;;=All other variables used in this code should use your packages namespace,
 ;;^DD(.84,6,23,7,0)
 ;;=and should be NEWed.
 ;;^DD(.84,6,"DT")
 ;;=2940520
 ;;^DD(.84,7,0)
 ;;=TRANSLATION^.847PA^^4;0
 ;;^DD(.84,8,0)
 ;;=CALLED FROM ENTRY POINTS^.841A^^5;0
 ;;^DD(.841,0)
 ;;=CALLED FROM ENTRY POINTS SUB-FIELD^^.05^2
 ;;^DD(.841,0,"DT")
 ;;=2940411
 ;;^DD(.841,0,"IX","B",.841,.01)
 ;;=
 ;;^DD(.841,0,"NM","CALLED FROM ENTRY POINTS")
 ;;=
 ;;^DD(.841,0,"UP")
 ;;=.84
 ;;^DD(.841,.01,0)
 ;;=ROUTINE NAME^MF^^0;1^K:$L(X)>8!($L(X)<1) X
 ;;^DD(.841,.01,1,0)
 ;;=^.1
 ;;^DD(.841,.01,1,1,0)
 ;;=.841^B
 ;;^DD(.841,.01,1,1,1)
 ;;=S ^DI(.84,DA(1),5,"B",$E(X,1,30),DA)=""
 ;;^DD(.841,.01,1,1,2)
 ;;=K ^DI(.84,DA(1),5,"B",$E(X,1,30),DA)
 ;;^DD(.841,.01,3)
 ;;=Answer must be 1-8 characters in length.
 ;;^DD(.841,.01,21,0)
 ;;=^^6^6^2940411^
 ;;^DD(.841,.01,21,1,0)
 ;;=This multiple is used for documentation only.  Entries are made to this
 ;;^DD(.841,.01,21,2,0)
 ;;=subfile ONLY for ERROR type text.  Enter the routine name of an entry
 ;;^DD(.841,.01,21,3,0)
 ;;=point that may generate this error message.  You only need to enter the
 ;;^DD(.841,.01,21,4,0)
 ;;=names of routines that directly generate the error through a call to
 ;;^DD(.841,.01,21,5,0)
 ;;=^DIALOG, and not when the error is generated by some other utility called
 ;;^DD(.841,.01,21,6,0)
 ;;=from your routine.
 ;;^DD(.841,.01,"DT")
 ;;=2940411
 ;;^DD(.841,.05,0)
 ;;=LINE TAG^F^^0;2^K:$L(X)>10!($L(X)<1) X
 ;;^DD(.841,.05,3)
 ;;=Answer must be 1-10 characters in length.
 ;;^DD(.841,.05,21,0)
 ;;=^^6^6^2940411^
 ;;^DD(.841,.05,21,1,0)
 ;;=This multiple is used for documentation only.  Entries are made to this
 ;;^DD(.841,.05,21,2,0)
 ;;=subfile ONLY for ERROR type text.  Enter the line tag of an entry point
 ;;^DD(.841,.05,21,3,0)
 ;;=that may generate this error message.  You only need to enter the names of
 ;;^DD(.841,.05,21,4,0)
 ;;=routines that directly generate the error through a call to ^DIALOG, and
 ;;^DD(.841,.05,21,5,0)
 ;;=not when the error is generated by some other utility called from your
 ;;^DD(.841,.05,21,6,0)
 ;;=routine.
 ;;^DD(.841,.05,"DT")
 ;;=2940411
 ;;^DD(.842,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.842,0,"DT")
 ;;=2930614
 ;;^DD(.842,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.842,0,"UP")
 ;;=.84
 ;;^DD(.842,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.842,.01,3)
 ;;=Describe the use of this dialogue.
 ;;^DD(.842,.01,"DT")
 ;;=2930614
 ;;^DD(.844,0)
 ;;=TEXT SUB-FIELD^^.01^1
 ;;^DD(.844,0,"DT")
 ;;=2930811
 ;;^DD(.844,0,"NM","TEXT")
 ;;=
 ;;^DD(.844,0,"UP")
 ;;=.84
 ;;^DD(.844,.01,0)
 ;;=TEXT^WL^^0;1^Q
 ;;^DD(.844,.01,3)
 ;;=Enter the actual text of the dialogue, with optional parameter windows.
 ;;^DD(.844,.01,"DT")
 ;;=2930811
 ;;^DD(.845,0)
 ;;=PARAMETER SUB-FIELD^^1^2
 ;;^DD(.845,0,"DT")
 ;;=2931105
 ;;^DD(.845,0,"IX","B",.845,.01)
 ;;=
 ;;^DD(.845,0,"NM","PARAMETER")
 ;;=
 ;;^DD(.845,0,"UP")
 ;;=.84
 ;;^DD(.845,.01,0)
 ;;=PARAMETER SUBSCRIPT^MF^^0;1^K:$L(X)>20!($L(X)<1) X
 ;;^DD(.845,.01,1,0)
 ;;=^.1
 ;;^DD(.845,.01,1,1,0)
 ;;=.845^B
 ;;^DD(.845,.01,1,1,1)
 ;;=S ^DI(.84,DA(1),3,"B",$E(X,1,30),DA)=""
 ;;^DD(.845,.01,1,1,2)
 ;;=K ^DI(.84,DA(1),3,"B",$E(X,1,30),DA)
 ;;^DD(.845,.01,3)
 ;;=This entry corresponds to the subscript of an entry in either the text or output parameter list to the BLD^DIALOG and $$EZBLD^DIALOG routine.  Answer must be 1-20 characters in length.
 ;;^DD(.845,.01,21,0)
 ;;=^^7^7^2941122^
 ;;^DD(.845,.01,21,1,0)
 ;;=This multiple is used for documentation purposes only.  The entry in the
 ;;^DD(.845,.01,21,2,0)
 ;;=.01 field of this multiple will correspond to a subscript in either the
 ;;^DD(.845,.01,21,3,0)
 ;;=text or output parameter list, that are passed to the routines that build
 ;;^DD(.845,.01,21,4,0)
 ;;=dialogue messages, BLD^DIALOG and $$EZBLD^DIALOG. This routine will insert
 ;;^DD(.845,.01,21,5,0)
 ;;=into each 'window' from the TEXT field, the corresponding entry out of the
 ;;^DD(.845,.01,21,6,0)
 ;;=text parameter list.  For errors only, it passes any entries from the
 ;;^DD(.845,.01,21,7,0)
 ;;=output parameter list back to the user as entries in its output array.
 ;;^DD(.845,.01,"DT")
 ;;=2931105
 ;;^DD(.845,1,0)
 ;;=PARAMETER DESCRIPTION^F^^0;2^K:$L(X)>230!($L(X)<1) X
 ;;^DD(.845,1,3)
 ;;=Describe the Parameter for documentation purposes.  Answer must be 1-230 characters in length.
 ;;^DD(.845,1,21,0)
 ;;=^^5^5^2941122^
 ;;^DD(.845,1,21,1,0)
 ;;=This field is used for documentation purposes only.  It describes the text
 ;;^DD(.845,1,21,2,0)
 ;;=and/or output parameter(s) that are passed to BLD^DIALOG and
 ;;^DD(.845,1,21,3,0)
 ;;=$$EZBLD^DIALOG. The same parameter can be used both as a text parameter
 ;;^DD(.845,1,21,4,0)
 ;;=(i.e., inserted into the text when it is built), and as an output
 ;;^DD(.845,1,21,5,0)
 ;;=parameter (i.e., a parameter passed back in a list to the user)
 ;;^DD(.845,1,"DT")
 ;;=2930614
 ;;^DD(.847,0)
 ;;=TRANSLATION SUB-FIELD^^1^2
 ;;^DD(.847,0,"DT")
 ;;=2940524
 ;;^DD(.847,0,"IX","B",.847,.01)
 ;;=
 ;;^DD(.847,0,"NM","TRANSLATION")
 ;;=
 ;;^DD(.847,0,"UP")
 ;;=.84
 ;;^DD(.847,.01,0)
 ;;=LANGUAGE^*P.85'X^DI(.85,^0;1^S DIC("S")="I Y>1" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X S:$G(X) DINUM=X
 ;;^DD(.847,.01,1,0)
 ;;=^.1
 ;;^DD(.847,.01,1,1,0)
 ;;=.847^B
 ;;^DD(.847,.01,1,1,1)
 ;;=S ^DI(.84,DA(1),4,"B",$E(X,1,30),DA)=""
 ;;^DD(.847,.01,1,1,2)
 ;;=K ^DI(.84,DA(1),4,"B",$E(X,1,30),DA)
 ;;^DD(.847,.01,3)
 ;;=Enter the number or name for a non-English language.
 ;;^DD(.847,.01,12)
 ;;=English language cannot be selected.
 ;;^DD(.847,.01,12.1)
 ;;=S DIC("S")="I Y>1"
 ;;^DD(.847,.01,21,0)
 ;;=^^3^3^2941118^^
 ;;^DD(.847,.01,21,1,0)
 ;;=Pointer to the LANGUAGE file. If FileMan system variable DUZ("LANG") is
 ;;^DD(.847,.01,21,2,0)
 ;;=set to an integer greater than 1, we use that number to extract dialogue
 ;;^DD(.847,.01,21,3,0)
 ;;=text for the specified language from this multiple.

DINIT003
DINIT003 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DD(.847,.01,"DT")
 ;;=2940524
 ;;^DD(.847,1,0)
 ;;=FOREIGN TEXT^.8471^^1;0
 ;;^DD(.847,1,21,0)
 ;;=^^3^3^2941118^
 ;;^DD(.847,1,21,1,0)
 ;;=Insert here the non-English equivalent for this language to the text in
 ;;^DD(.847,1,21,2,0)
 ;;=the TEXT field for this entry.  This field may contain windows for
 ;;^DD(.847,1,21,3,0)
 ;;=variable parameters the same as the TEXT field.
 ;;^DD(.8471,0)
 ;;=FOREIGN TEXT SUB-FIELD^^.01^1
 ;;^DD(.8471,0,"DT")
 ;;=2930811
 ;;^DD(.8471,0,"NM","FOREIGN TEXT")
 ;;=
 ;;^DD(.8471,0,"UP")
 ;;=.847
 ;;^DD(.8471,.01,0)
 ;;=FOREIGN TEXT^WL^^0;1^Q
 ;;^DD(.8471,.01,3)
 ;;=Enter the non-English dialog text
 ;;^DD(.8471,.01,"DT")
 ;;=2930811

DINIT004
DINIT004 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;10:12 AM  10 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84)
 ;;=^DI(.84,
 ;;^UTILITY(U,$J,.84,0)
 ;;=DIALOG^.84I^9549^322
 ;;^UTILITY(U,$J,.84,101,0)
 ;;=101^1^^5
 ;;^UTILITY(U,$J,.84,101,1,0)
 ;;=^^2^2^2931110^
 ;;^UTILITY(U,$J,.84,101,1,1,0)
 ;;=The option or function can only be done if DUZ(0)="@", designating 
 ;;^UTILITY(U,$J,.84,101,1,2,0)
 ;;=the user as having programmer access.
 ;;^UTILITY(U,$J,.84,101,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,101,2,1,0)
 ;;=Only those with programmer's access can perform this function.
 ;;^UTILITY(U,$J,.84,110,0)
 ;;=110^1^^5
 ;;^UTILITY(U,$J,.84,110,1,0)
 ;;=^^2^2^2931110^
 ;;^UTILITY(U,$J,.84,110,1,1,0)
 ;;=An attempt to get a lock timed out.  The record is locked and the desired
 ;;^UTILITY(U,$J,.84,110,1,2,0)
 ;;=action cannot be taken until the lock is released.
 ;;^UTILITY(U,$J,.84,110,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,110,2,1,0)
 ;;=The record is currently locked.
 ;;^UTILITY(U,$J,.84,110,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,110,3,1,0)
 ;;=FILE^File or subfile #.
 ;;^UTILITY(U,$J,.84,110,3,2,0)
 ;;=IENS^IEN string of entry numbers.
 ;;^UTILITY(U,$J,.84,110,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,110,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,111,0)
 ;;=111^1^y^5
 ;;^UTILITY(U,$J,.84,111,1,0)
 ;;=^^2^2^2970205^^
 ;;^UTILITY(U,$J,.84,111,1,1,0)
 ;;=An attempt to get a lock timed out. The File Header Node is locked, and
 ;;^UTILITY(U,$J,.84,111,1,2,0)
 ;;=the desired action cannot be taken until the lock is released.
 ;;^UTILITY(U,$J,.84,111,2,0)
 ;;=^^1^1^2970205^^
 ;;^UTILITY(U,$J,.84,111,2,1,0)
 ;;=The File Header Node is currently locked.
 ;;^UTILITY(U,$J,.84,111,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,111,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,111,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,112,0)
 ;;=112^1^y^5
 ;;^UTILITY(U,$J,.84,112,1,0)
 ;;=^^2^2^2970205^^
 ;;^UTILITY(U,$J,.84,112,1,1,0)
 ;;=An attempt to get a lock timed out. The File is locked, and the desired
 ;;^UTILITY(U,$J,.84,112,1,2,0)
 ;;=action cannot be taken until the lock is released.
 ;;^UTILITY(U,$J,.84,112,2,0)
 ;;=^^1^1^2970205^
 ;;^UTILITY(U,$J,.84,112,2,1,0)
 ;;=The file is currently locked.
 ;;^UTILITY(U,$J,.84,112,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,112,3,1,0)
 ;;=FILE^FILE #
 ;;^UTILITY(U,$J,.84,120,0)
 ;;=120^1^y^5
 ;;^UTILITY(U,$J,.84,120,1,0)
 ;;=^^7^7^2941006^^
 ;;^UTILITY(U,$J,.84,120,1,1,0)
 ;;=An error occurred during the Xecution of a FileMan hook (e.g., an input
 ;;^UTILITY(U,$J,.84,120,1,2,0)
 ;;=transform, DIC screen).  The type of hook in which the error occurred is
 ;;^UTILITY(U,$J,.84,120,1,3,0)
 ;;=identified in the text.  When relevant, the file, field, and IENS for
 ;;^UTILITY(U,$J,.84,120,1,4,0)
 ;;=which the hook was being Xecuted are identified in the PARAM nodes.  The
 ;;^UTILITY(U,$J,.84,120,1,5,0)
 ;;=substance of the error will usually be identified by a separate error
 ;;^UTILITY(U,$J,.84,120,1,6,0)
 ;;=message generated during the Xecution of the hook itself. That error will
 ;;^UTILITY(U,$J,.84,120,1,7,0)
 ;;=usually be the one preceding this one in the DIERR array.
 ;;^UTILITY(U,$J,.84,120,2,0)
 ;;=^^1^1^2941006^^
 ;;^UTILITY(U,$J,.84,120,2,1,0)
 ;;=The previous error occurred when performing an action specified in a |1|.
 ;;^UTILITY(U,$J,.84,120,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,120,3,1,0)
 ;;=1^Type of FileMan Xecutable code.
 ;;^UTILITY(U,$J,.84,120,3,2,0)
 ;;=FILE^File#
 ;;^UTILITY(U,$J,.84,120,3,3,0)
 ;;=FIELD^Field#.
 ;;^UTILITY(U,$J,.84,120,3,4,0)
 ;;=IENS^Internal Entry Number String.
 ;;^UTILITY(U,$J,.84,200,0)
 ;;=200^1^^5
 ;;^UTILITY(U,$J,.84,200,1,0)
 ;;=^^2^2^2931109^
 ;;^UTILITY(U,$J,.84,200,1,1,0)
 ;;=There is an error in one of the variables passed to a FileMan call or
 ;;^UTILITY(U,$J,.84,200,1,2,0)
 ;;=in one of the parameters passed in the actual parameter list.
 ;;^UTILITY(U,$J,.84,200,2,0)
 ;;=^^1^1^2931110^^^
 ;;^UTILITY(U,$J,.84,200,2,1,0)
 ;;=An input variable or parameter is missing or invalid.
 ;;^UTILITY(U,$J,.84,201,0)
 ;;=201^1^y^5
 ;;^UTILITY(U,$J,.84,201,1,0)
 ;;=^^2^2^2931110^^
 ;;^UTILITY(U,$J,.84,201,1,1,0)
 ;;=The specified input variable is either 1) required but not defined or
 ;;^UTILITY(U,$J,.84,201,1,2,0)
 ;;=2) not valid.
 ;;^UTILITY(U,$J,.84,201,2,0)
 ;;=^^1^1^2931110^^^
 ;;^UTILITY(U,$J,.84,201,2,1,0)
 ;;=The input variable |1| is missing or invalid.
 ;;^UTILITY(U,$J,.84,201,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,201,3,1,0)
 ;;=1^Variable name.
 ;;^UTILITY(U,$J,.84,202,0)
 ;;=202^1^y^5
 ;;^UTILITY(U,$J,.84,202,1,0)
 ;;=^^1^1^2931110^^^^
 ;;^UTILITY(U,$J,.84,202,1,1,0)
 ;;=The specified parameter is either required but missing or invalid.
 ;;^UTILITY(U,$J,.84,202,2,0)
 ;;=^^1^1^2950317^^^^
 ;;^UTILITY(U,$J,.84,202,2,1,0)
 ;;=The input parameter that identifies the |1| is missing or invalid.
 ;;^UTILITY(U,$J,.84,202,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,202,3,1,0)
 ;;=1^Parameter as identified in the FM documentation.
 ;;^UTILITY(U,$J,.84,202,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,202,5,1,0)
 ;;=DIT^TRNMRG
 ;;^UTILITY(U,$J,.84,203,0)
 ;;=203^1^y^5
 ;;^UTILITY(U,$J,.84,203,1,0)
 ;;=^^3^3^2940426^
 ;;^UTILITY(U,$J,.84,203,1,1,0)
 ;;=An incorrect subscript is present in an array that is passed to FileMan.
 ;;^UTILITY(U,$J,.84,203,1,2,0)
 ;;=For example, one of the subscripts in the FDA which identifies FILE, IENS,
 ;;^UTILITY(U,$J,.84,203,1,3,0)
 ;;=or FIELD is incorrectly formatted.
 ;;^UTILITY(U,$J,.84,203,2,0)
 ;;=^^1^1^2940426^^^
 ;;^UTILITY(U,$J,.84,203,2,1,0)
 ;;=The subscript that identifies the |1| is missing or invalid.
 ;;^UTILITY(U,$J,.84,203,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,203,3,1,0)
 ;;=1^The data element incorrectly specified by a subscript.
 ;;^UTILITY(U,$J,.84,203,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,203,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,204,0)
 ;;=204^1^^5
 ;;^UTILITY(U,$J,.84,204,1,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,204,1,1,0)
 ;;=Control characters are not permitted in the database.
 ;;^UTILITY(U,$J,.84,204,2,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,204,2,1,0)
 ;;=The input value contains control characters.
 ;;^UTILITY(U,$J,.84,204,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,204,3,1,0)
 ;;=1^INPUT VALUE
 ;;^UTILITY(U,$J,.84,205,0)
 ;;=205^1^y^5
 ;;^UTILITY(U,$J,.84,205,1,0)
 ;;=^^4^4^2960827^
 ;;^UTILITY(U,$J,.84,205,1,1,0)
 ;;=Error message output when a file or subfile number, and its associated IEN
 ;;^UTILITY(U,$J,.84,205,1,2,0)
 ;;=string are not in sync (i.e, the number of comma pieces represented by

DINIT005
DINIT005 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,205,1,3,0)
 ;;=the IEN string do not match the file/subfile level according to the "UP"
 ;;^UTILITY(U,$J,.84,205,1,4,0)
 ;;=nodes).
 ;;^UTILITY(U,$J,.84,205,2,0)
 ;;=^^1^1^2960827^^^
 ;;^UTILITY(U,$J,.84,205,2,1,0)
 ;;=File# |1| and IEN string |IENS| represent different subfile levels.
 ;;^UTILITY(U,$J,.84,205,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,205,3,1,0)
 ;;=1^File or subfile number
 ;;^UTILITY(U,$J,.84,205,3,2,0)
 ;;=IENS^IEN string
 ;;^UTILITY(U,$J,.84,205,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,205,5,1,0)
 ;;=DIT3^IENCHK
 ;;^UTILITY(U,$J,.84,205,5,2,0)
 ;;=DICA3^ERR
 ;;^UTILITY(U,$J,.84,206,0)
 ;;=206^1^y^5
 ;;^UTILITY(U,$J,.84,206,1,0)
 ;;=^^3^3^2960124^
 ;;^UTILITY(U,$J,.84,206,1,1,0)
 ;;=FileMan is trying to pack fields onto a single node for a record, and the
 ;;^UTILITY(U,$J,.84,206,1,2,0)
 ;;=data will not fit. The application has asked for too many fields back for
 ;;^UTILITY(U,$J,.84,206,1,3,0)
 ;;=this record.
 ;;^UTILITY(U,$J,.84,206,2,0)
 ;;=^^1^1^2960124^
 ;;^UTILITY(U,$J,.84,206,2,1,0)
 ;;=The data requested for record |1| is too long to pack together.
 ;;^UTILITY(U,$J,.84,206,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,206,3,1,0)
 ;;=1^Record Number.
 ;;^UTILITY(U,$J,.84,207,0)
 ;;=207^1^y^5
 ;;^UTILITY(U,$J,.84,207,1,0)
 ;;=^^5^5^2960318^
 ;;^UTILITY(U,$J,.84,207,1,1,0)
 ;;=The library function $$HTML^DILF can encode or decode a string to and from
 ;;^UTILITY(U,$J,.84,207,1,2,0)
 ;;=HTML, used within FileMan to pack a value containing embedded ^s into a
 ;;^UTILITY(U,$J,.84,207,1,3,0)
 ;;=^-delimited string. Encoding increases the length of the string. If
 ;;^UTILITY(U,$J,.84,207,1,4,0)
 ;;=encoding would cause the length to exceed the portable string length
 ;;^UTILITY(U,$J,.84,207,1,5,0)
 ;;=limit, $$HTML^DILF instead returns this error.
 ;;^UTILITY(U,$J,.84,207,2,0)
 ;;=^^1^1^2960318^
 ;;^UTILITY(U,$J,.84,207,2,1,0)
 ;;=The value |1| is too long to encode into HTML.
 ;;^UTILITY(U,$J,.84,207,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,207,3,1,0)
 ;;=1^Value.
 ;;^UTILITY(U,$J,.84,208,0)
 ;;=208^1^^5^Illegal number error
 ;;^UTILITY(U,$J,.84,208,2,0)
 ;;=^^1^1^2970829^
 ;;^UTILITY(U,$J,.84,208,2,1,0)
 ;;=Input value is an illegal number.
 ;;^UTILITY(U,$J,.84,209,0)
 ;;=209^1^^5
 ;;^UTILITY(U,$J,.84,209,2,0)
 ;;=^^1^1^2980709^
 ;;^UTILITY(U,$J,.84,209,2,1,0)
 ;;=Input value is too long.
 ;;^UTILITY(U,$J,.84,209,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,209,5,1,0)
 ;;=DIC0^CHKVAL2
 ;;^UTILITY(U,$J,.84,209,5,2,0)
 ;;=DIC11^PR1
 ;;^UTILITY(U,$J,.84,299,0)
 ;;=299^1^y^5
 ;;^UTILITY(U,$J,.84,299,1,0)
 ;;=^^2^2^2970423^^^^
 ;;^UTILITY(U,$J,.84,299,1,1,0)
 ;;=A lookup that was restricted to finding a single entry found more than
 ;;^UTILITY(U,$J,.84,299,1,2,0)
 ;;=one.
 ;;^UTILITY(U,$J,.84,299,2,0)
 ;;=^^1^1^2970423^
 ;;^UTILITY(U,$J,.84,299,2,1,0)
 ;;=More than one entry matches the value(s) '|1|'.
 ;;^UTILITY(U,$J,.84,299,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,299,3,1,0)
 ;;=1^Lookup Value.
 ;;^UTILITY(U,$J,.84,299,3,2,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,299,3,3,0)
 ;;=IENS^IEN String.
 ;;^UTILITY(U,$J,.84,301,0)
 ;;=301^1^y^5
 ;;^UTILITY(U,$J,.84,301,1,0)
 ;;=^^1^1^2931110^^
 ;;^UTILITY(U,$J,.84,301,1,1,0)
 ;;=Flags passed in a variable (like DIC(0)) or in a parameter are incorrect.
 ;;^UTILITY(U,$J,.84,301,2,0)
 ;;=^^1^1^2931110^^
 ;;^UTILITY(U,$J,.84,301,2,1,0)
 ;;=The passed flag(s) '|1|' are unknown or inconsistent.
 ;;^UTILITY(U,$J,.84,301,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,301,3,1,0)
 ;;=1^Letter(s) from flag.
 ;;^UTILITY(U,$J,.84,302,0)
 ;;=302^1^y^5
 ;;^UTILITY(U,$J,.84,302,1,0)
 ;;=^^2^2^2940215^
 ;;^UTILITY(U,$J,.84,302,1,1,0)
 ;;=The calling application has asked us to add a new record, and has supplied
 ;;^UTILITY(U,$J,.84,302,1,2,0)
 ;;=a record number, but a record already exists at that number.
 ;;^UTILITY(U,$J,.84,302,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,302,2,1,0)
 ;;=Entry '|IENS|' already exists.
 ;;^UTILITY(U,$J,.84,302,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,302,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,302,3,2,0)
 ;;=IENS^IEN String.
 ;;^UTILITY(U,$J,.84,304,0)
 ;;=304^1^y^5
 ;;^UTILITY(U,$J,.84,304,1,0)
 ;;=^^2^2^2940628^^^^
 ;;^UTILITY(U,$J,.84,304,1,1,0)
 ;;=The problem with this IEN string is that it lacks the final ','. This is a
 ;;^UTILITY(U,$J,.84,304,1,2,0)
 ;;=common mistake for beginners.
 ;;^UTILITY(U,$J,.84,304,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,304,2,1,0)
 ;;=The IENS '|IENS|' lacks a final comma.
 ;;^UTILITY(U,$J,.84,304,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,304,3,1,0)
 ;;=IENS^IENS.
 ;;^UTILITY(U,$J,.84,305,0)
 ;;=305^1^y^5
 ;;^UTILITY(U,$J,.84,305,1,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,305,1,1,0)
 ;;=A root is used to identify an input array.  But the array is empty.
 ;;^UTILITY(U,$J,.84,305,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,305,2,1,0)
 ;;=The array with a root of '|1|' has no data associated with it.
 ;;^UTILITY(U,$J,.84,305,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,305,3,1,0)
 ;;=1^Passed root.
 ;;^UTILITY(U,$J,.84,305,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,305,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,306,0)
 ;;=306^1^y^5
 ;;^UTILITY(U,$J,.84,306,1,0)
 ;;=^^2^2^2940628^
 ;;^UTILITY(U,$J,.84,306,1,1,0)
 ;;=When an IENS is used to explicitly identify a subfile, not a subfile
 ;;^UTILITY(U,$J,.84,306,1,2,0)
 ;;=entry, then the first comma-piece should be empty. This one wasn't.
 ;;^UTILITY(U,$J,.84,306,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,306,2,1,0)
 ;;=The first comma-piece of IENS '|IENS|' should be empty.
 ;;^UTILITY(U,$J,.84,306,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,306,3,1,0)
 ;;=IENS^IENS.
 ;;^UTILITY(U,$J,.84,307,0)
 ;;=307^1^y^5
 ;;^UTILITY(U,$J,.84,307,1,0)
 ;;=^^2^2^2940629^
 ;;^UTILITY(U,$J,.84,307,1,1,0)
 ;;=One of the IENs in the IENS has been left out, leaving an empty
 ;;^UTILITY(U,$J,.84,307,1,2,0)
 ;;=comma-piece. 
 ;;^UTILITY(U,$J,.84,307,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,307,2,1,0)
 ;;=The IENS '|IENS|' has an empty comma-piece.
 ;;^UTILITY(U,$J,.84,307,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,307,3,1,0)
 ;;=IENS^IENS.
 ;;^UTILITY(U,$J,.84,308,0)
 ;;=308^1^y^5
 ;;^UTILITY(U,$J,.84,308,1,0)
 ;;=^^3^3^2940629^
 ;;^UTILITY(U,$J,.84,308,1,1,0)
 ;;=The syntax of this IENS is incorrect. For example, a record number may be
 ;;^UTILITY(U,$J,.84,308,1,2,0)
 ;;=illegal; or a subfile may be specified as already existing, but have a
 ;;^UTILITY(U,$J,.84,308,1,3,0)
 ;;=parent that is just now being added.

DINIT006
DINIT006 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,308,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,308,2,1,0)
 ;;=The IENS '|IENS|' is syntactically incorrect.
 ;;^UTILITY(U,$J,.84,308,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,308,3,1,0)
 ;;=IENS^IENS.
 ;;^UTILITY(U,$J,.84,309,0)
 ;;=309^1^^5
 ;;^UTILITY(U,$J,.84,309,1,0)
 ;;=^^2^2^2931109^
 ;;^UTILITY(U,$J,.84,309,1,1,0)
 ;;=A multiple field is involved.  Either the root of the multiple or the 
 ;;^UTILITY(U,$J,.84,309,1,2,0)
 ;;=necessary entry numbers are missing.
 ;;^UTILITY(U,$J,.84,309,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,309,2,1,0)
 ;;=There is insufficient information to identify an entry in a subfile.
 ;;^UTILITY(U,$J,.84,310,0)
 ;;=310^1^y^5
 ;;^UTILITY(U,$J,.84,310,1,0)
 ;;=^^6^6^2940629^
 ;;^UTILITY(U,$J,.84,310,1,1,0)
 ;;=Some of the IENS subscripts in this FDA conflict with each other. For
 ;;^UTILITY(U,$J,.84,310,1,2,0)
 ;;=example, one IENS may use the sequence number ?1 while another uses +1.
 ;;^UTILITY(U,$J,.84,310,1,3,0)
 ;;=This would be illegal because the sequence number 1 is being used to
 ;;^UTILITY(U,$J,.84,310,1,4,0)
 ;;=represent two different operations. Consult your documentation for an
 ;;^UTILITY(U,$J,.84,310,1,5,0)
 ;;=explanation of the various conflicts possible. The IENS returned with this
 ;;^UTILITY(U,$J,.84,310,1,6,0)
 ;;=error happens to be one of the IENS values in conflict.
 ;;^UTILITY(U,$J,.84,310,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,310,2,1,0)
 ;;=The IENS '|IENS|' conflicts with the rest of the FDA.
 ;;^UTILITY(U,$J,.84,310,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,310,3,1,0)
 ;;=IENS^IENS.
 ;;^UTILITY(U,$J,.84,311,0)
 ;;=311^1^y^5
 ;;^UTILITY(U,$J,.84,311,1,0)
 ;;=^^3^3^2940629^
 ;;^UTILITY(U,$J,.84,311,1,1,0)
 ;;=Adding an entry to a file without including all required identifiers
 ;;^UTILITY(U,$J,.84,311,1,2,0)
 ;;=violates database integrity. The entry identified by this IENS lacks some
 ;;^UTILITY(U,$J,.84,311,1,3,0)
 ;;=of its required identifiers in the passed FDA.
 ;;^UTILITY(U,$J,.84,311,2,0)
 ;;=^^1^1^2941018^
 ;;^UTILITY(U,$J,.84,311,2,1,0)
 ;;=The new record '|IENS|' lacks some required identifiers.
 ;;^UTILITY(U,$J,.84,311,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,311,3,1,0)
 ;;=IENS^IENS.
 ;;^UTILITY(U,$J,.84,312,0)
 ;;=312^1^y
 ;;^UTILITY(U,$J,.84,312,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,312,1,1,0)
 ;;=All required identifiers must be present for a new entry to be filed.
 ;;^UTILITY(U,$J,.84,312,1,2,0)
 ;;=One or more of those fields is missing for the (sub)file.
 ;;^UTILITY(U,$J,.84,312,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,312,2,1,0)
 ;;=The list of fields is missing a required identifier for File #|FILE|.
 ;;^UTILITY(U,$J,.84,312,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,312,3,1,0)
 ;;=FILE^File or subfile #.
 ;;^UTILITY(U,$J,.84,313,0)
 ;;=313^1^^5
 ;;^UTILITY(U,$J,.84,313,1,0)
 ;;=^^2^2^2960306^
 ;;^UTILITY(U,$J,.84,313,1,1,0)
 ;;=The arrays that hold internal and external values must have different roots,
 ;;^UTILITY(U,$J,.84,313,1,2,0)
 ;;=but both FDAs have the same root.
 ;;^UTILITY(U,$J,.84,313,2,0)
 ;;=^^1^1^2960306^
 ;;^UTILITY(U,$J,.84,313,2,1,0)
 ;;=The FDA root for external values is the same as the one for internal values.
 ;;^UTILITY(U,$J,.84,330,0)
 ;;=330^1^y^5
 ;;^UTILITY(U,$J,.84,330,1,0)
 ;;=^^2^2^2941123^
 ;;^UTILITY(U,$J,.84,330,1,1,0)
 ;;=The value passed by the calling application should be a certain data type,
 ;;^UTILITY(U,$J,.84,330,1,2,0)
 ;;=but according to our checks it is not.
 ;;^UTILITY(U,$J,.84,330,2,0)
 ;;=^^1^1^2941123^
 ;;^UTILITY(U,$J,.84,330,2,1,0)
 ;;=The value '|1|' is not a valid |2|.
 ;;^UTILITY(U,$J,.84,330,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,330,3,1,0)
 ;;=1^Passed Value.
 ;;^UTILITY(U,$J,.84,330,3,2,0)
 ;;=2^Data Type.
 ;;^UTILITY(U,$J,.84,348,0)
 ;;=348^1^y^5
 ;;^UTILITY(U,$J,.84,348,1,0)
 ;;=^^2^2^2940214^
 ;;^UTILITY(U,$J,.84,348,1,1,0)
 ;;=The calling application passed us a variable pointer value. That value
 ;;^UTILITY(U,$J,.84,348,1,2,0)
 ;;=points to a file that does not exist, or that lacks a Header Node.
 ;;^UTILITY(U,$J,.84,348,2,0)
 ;;=^^2^2^2940214^
 ;;^UTILITY(U,$J,.84,348,2,1,0)
 ;;=The passed value '|1|' points to a file that does not exist or lacks a
 ;;^UTILITY(U,$J,.84,348,2,2,0)
 ;;=Header Node.
 ;;^UTILITY(U,$J,.84,348,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,348,3,1,0)
 ;;=1^Passed Value.
 ;;^UTILITY(U,$J,.84,349,0)
 ;;=349^2^y^5
 ;;^UTILITY(U,$J,.84,349,1,0)
 ;;=^^2^2^2940310^^^
 ;;^UTILITY(U,$J,.84,349,1,1,0)
 ;;=Text used by the Replace...With editor
 ;;^UTILITY(U,$J,.84,349,1,2,0)
 ;;=Note: Dialog will be used with $$EZBLD^DIALOG call, only one text line!!
 ;;^UTILITY(U,$J,.84,349,2,0)
 ;;=^^1^1^2940310^^
 ;;^UTILITY(U,$J,.84,349,2,1,0)
 ;;= String too long by |1| character(s)!
 ;;^UTILITY(U,$J,.84,349,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,349,3,1,0)
 ;;=1^Number of characters over the limit.
 ;;^UTILITY(U,$J,.84,350,0)
 ;;=350^2^^5
 ;;^UTILITY(U,$J,.84,350,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,350,1,1,0)
 ;;=Message from the Replace...With editor.
 ;;^UTILITY(U,$J,.84,350,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,350,2,1,0)
 ;;= String too long! '^' to quit.
 ;;^UTILITY(U,$J,.84,351,0)
 ;;=351^1^y^5
 ;;^UTILITY(U,$J,.84,351,1,0)
 ;;=^^4^4^2941021^
 ;;^UTILITY(U,$J,.84,351,1,1,0)
 ;;=When passing an FDA to the Updater, any entries intended as Finding or
 ;;^UTILITY(U,$J,.84,351,1,2,0)
 ;;=LAYGO Finding nodes must include a .01 node that has the lookup value.
 ;;^UTILITY(U,$J,.84,351,1,3,0)
 ;;=This value need not be a legitimate .01 field value, but it must be a
 ;;^UTILITY(U,$J,.84,351,1,4,0)
 ;;=valid and unambiguous lookup value for the file.
 ;;^UTILITY(U,$J,.84,351,2,0)
 ;;=^^1^1^2941021^
 ;;^UTILITY(U,$J,.84,351,2,1,0)
 ;;=FDA nodes for lookup '|IENS|' omit a .01 node with a lookup value.
 ;;^UTILITY(U,$J,.84,351,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,351,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,351,3,2,0)
 ;;=IENS^IENS Subscript for Finding or LAYGO Finding node.
 ;;^UTILITY(U,$J,.84,352,0)
 ;;=352^1^y^5
 ;;^UTILITY(U,$J,.84,352,1,0)
 ;;=^^3^3^2980415^
 ;;^UTILITY(U,$J,.84,352,1,1,0)
 ;;=When passing an FDA to the Updater, any entries intended as LAYGO or LAYGO
 ;;^UTILITY(U,$J,.84,352,1,2,0)
 ;;=Findings nodes must include a .01 node. Every new entry must have a value
 ;;^UTILITY(U,$J,.84,352,1,3,0)
 ;;=for the .01 field.
 ;;^UTILITY(U,$J,.84,352,2,0)
 ;;=^^1^1^2980415^
 ;;^UTILITY(U,$J,.84,352,2,1,0)
 ;;=The new record '|IENS|' for file #|FILE| lacks a .01 field.

DINIT007
DINIT007 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,352,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,352,3,1,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,352,3,2,0)
 ;;=IENS^IENS subscript for LAYGO or LAYGO Finding node.
 ;;^UTILITY(U,$J,.84,401,0)
 ;;=401^1^y^5
 ;;^UTILITY(U,$J,.84,401,1,0)
 ;;=^^2^2^2990218^^^^
 ;;^UTILITY(U,$J,.84,401,1,1,0)
 ;;=The specified file or subfile does not exist; it is not present in the 
 ;;^UTILITY(U,$J,.84,401,1,2,0)
 ;;=data dictionary.
 ;;^UTILITY(U,$J,.84,401,2,0)
 ;;=^^1^1^2990218^^^^
 ;;^UTILITY(U,$J,.84,401,2,1,0)
 ;;=File #|FILE| does not exist.
 ;;^UTILITY(U,$J,.84,401,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,401,3,1,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,402,0)
 ;;=402^1^y^5
 ;;^UTILITY(U,$J,.84,402,1,0)
 ;;=^^2^2^2940316^^^^
 ;;^UTILITY(U,$J,.84,402,1,1,0)
 ;;=The specified file or subfile lacks a valid global root; the global root
 ;;^UTILITY(U,$J,.84,402,1,2,0)
 ;;=is missing or is syntactically not valid.
 ;;^UTILITY(U,$J,.84,402,2,0)
 ;;=^^1^1^2940316^^^^
 ;;^UTILITY(U,$J,.84,402,2,1,0)
 ;;=The global root of file #|FILE| is missing or not valid.
 ;;^UTILITY(U,$J,.84,402,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,402,3,1,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,402,3,2,0)
 ;;=ROOT^File root.
 ;;^UTILITY(U,$J,.84,402,3,3,0)
 ;;=IENS^IEN String.
 ;;^UTILITY(U,$J,.84,403,0)
 ;;=403^1^y^5
 ;;^UTILITY(U,$J,.84,403,1,0)
 ;;=^^3^3^2940213^
 ;;^UTILITY(U,$J,.84,403,1,1,0)
 ;;=The File Header Node, the top level of the data file as described in the
 ;;^UTILITY(U,$J,.84,403,1,2,0)
 ;;=Programmer Manual, must be present for FileMan to determine certain kinds
 ;;^UTILITY(U,$J,.84,403,1,3,0)
 ;;=of information about a file.
 ;;^UTILITY(U,$J,.84,403,2,0)
 ;;=^^1^1^2940213^
 ;;^UTILITY(U,$J,.84,403,2,1,0)
 ;;=File #|FILE| lacks a Header Node.
 ;;^UTILITY(U,$J,.84,403,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,403,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,404,0)
 ;;=404^1^y^5
 ;;^UTILITY(U,$J,.84,404,1,0)
 ;;=^^4^4^2940214^
 ;;^UTILITY(U,$J,.84,404,1,1,0)
 ;;=We have identified a file by the global node of its data file, and found
 ;;^UTILITY(U,$J,.84,404,1,2,0)
 ;;=its Header Node. We needed to use the Header Node to identify the number
 ;;^UTILITY(U,$J,.84,404,1,3,0)
 ;;=of the file, but that piece of information is missing from the Header
 ;;^UTILITY(U,$J,.84,404,1,4,0)
 ;;=Node.
 ;;^UTILITY(U,$J,.84,404,2,0)
 ;;=^^1^1^2940214^
 ;;^UTILITY(U,$J,.84,404,2,1,0)
 ;;=The File Header node of the file stored at |1| lacks a file number.
 ;;^UTILITY(U,$J,.84,404,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,404,3,1,0)
 ;;=1^File Root.
 ;;^UTILITY(U,$J,.84,405,0)
 ;;=405^1^y^5
 ;;^UTILITY(U,$J,.84,405,1,0)
 ;;=^^2^2^2931110^^
 ;;^UTILITY(U,$J,.84,405,1,1,0)
 ;;=The NO EDIT flag is set for the file.  No instruction to override
 ;;^UTILITY(U,$J,.84,405,1,2,0)
 ;;=that flag is present.
 ;;^UTILITY(U,$J,.84,405,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,405,2,1,0)
 ;;=Entries in file |1| cannot be edited.
 ;;^UTILITY(U,$J,.84,405,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,405,3,1,0)
 ;;=1^File Name.
 ;;^UTILITY(U,$J,.84,405,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,406,0)
 ;;=406^1^y^5
 ;;^UTILITY(U,$J,.84,406,1,0)
 ;;=^^2^2^2940317^
 ;;^UTILITY(U,$J,.84,406,1,1,0)
 ;;=The data definition for a .01 field for the specified file is missing.
 ;;^UTILITY(U,$J,.84,406,1,2,0)
 ;;=This file is therefore not valid for most database operations.
 ;;^UTILITY(U,$J,.84,406,2,0)
 ;;=^^1^1^2940317^
 ;;^UTILITY(U,$J,.84,406,2,1,0)
 ;;=File #|FILE| has no .01 field definition.
 ;;^UTILITY(U,$J,.84,406,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,406,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,407,0)
 ;;=407^1^^5
 ;;^UTILITY(U,$J,.84,407,1,0)
 ;;=^^4^4^2940317^
 ;;^UTILITY(U,$J,.84,407,1,1,0)
 ;;=The subfile number of a word processing field has been passed in the place
 ;;^UTILITY(U,$J,.84,407,1,2,0)
 ;;=of a file parameter. This is not acceptable. Although we implement word
 ;;^UTILITY(U,$J,.84,407,1,3,0)
 ;;=processing fields as independent files, we do not allow them to be treated
 ;;^UTILITY(U,$J,.84,407,1,4,0)
 ;;=as files for purposes of most database activities.
 ;;^UTILITY(U,$J,.84,407,2,0)
 ;;=^^1^1^2940317^
 ;;^UTILITY(U,$J,.84,407,2,1,0)
 ;;=A word-processing field is not a file.
 ;;^UTILITY(U,$J,.84,407,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,407,3,1,0)
 ;;=FILE^Subfile # of word-processing field.
 ;;^UTILITY(U,$J,.84,408,0)
 ;;=408^1^y^5
 ;;^UTILITY(U,$J,.84,408,1,0)
 ;;=^^2^2^2940715^
 ;;^UTILITY(U,$J,.84,408,1,1,0)
 ;;=The file lacks a name. For subfiles, $P(^DD(file#,0),U) is null. For root
 ;;^UTILITY(U,$J,.84,408,1,2,0)
 ;;=files, $O(^DD(file#,0,"NM",""))="". 
 ;;^UTILITY(U,$J,.84,408,2,0)
 ;;=^^1^1^2940715^
 ;;^UTILITY(U,$J,.84,408,2,1,0)
 ;;=File# |FILE| lacks a name.
 ;;^UTILITY(U,$J,.84,408,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,408,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,409,0)
 ;;=409^1^y
 ;;^UTILITY(U,$J,.84,409,1,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,409,1,1,0)
 ;;=The indicated file does not exist in the FileMan database.
 ;;^UTILITY(U,$J,.84,409,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,409,2,1,0)
 ;;=File '|1|' could not be found.
 ;;^UTILITY(U,$J,.84,409,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,409,3,1,0)
 ;;=1^File name or number.
 ;;^UTILITY(U,$J,.84,410,0)
 ;;=410^1^y^5
 ;;^UTILITY(U,$J,.84,410,1,0)
 ;;=^^1^1^2980602^^^
 ;;^UTILITY(U,$J,.84,410,1,1,0)
 ;;=The global node is either missing or incomplete.
 ;;^UTILITY(U,$J,.84,410,2,0)
 ;;=^^1^1^2980602^
 ;;^UTILITY(U,$J,.84,410,2,1,0)
 ;;=Missing or incomplete global node |1|.
 ;;^UTILITY(U,$J,.84,410,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,410,3,1,0)
 ;;=1^GLOBAL NODE
 ;;^UTILITY(U,$J,.84,420,0)
 ;;=420^1^y^5
 ;;^UTILITY(U,$J,.84,420,1,0)
 ;;=^^4^4^2940628^
 ;;^UTILITY(U,$J,.84,420,1,1,0)
 ;;=A cross reference was specified for look-up, but that cross reference 
 ;;^UTILITY(U,$J,.84,420,1,2,0)
 ;;=does not exist on the file. The file has entries, but the index does not.
 ;;^UTILITY(U,$J,.84,420,1,3,0)
 ;;=This error implies nothing about whether the index is defined in the
 ;;^UTILITY(U,$J,.84,420,1,4,0)
 ;;=file's DD.
 ;;^UTILITY(U,$J,.84,420,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,420,2,1,0)
 ;;=There is no |1| index for File #|FILE|.
 ;;^UTILITY(U,$J,.84,420,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,420,3,1,0)
 ;;=1^Cross reference name.
 ;;^UTILITY(U,$J,.84,420,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,501,0)
 ;;=501^1^y^5
 ;;^UTILITY(U,$J,.84,501,1,0)
 ;;=^^2^2^2940214^^^

DINIT008
DINIT008 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,501,1,1,0)
 ;;=A search of the data dictionary reveals that the field name or number
 ;;^UTILITY(U,$J,.84,501,1,2,0)
 ;;=passed does not exist in the specified file.
 ;;^UTILITY(U,$J,.84,501,2,0)
 ;;=^^1^1^2940214^^
 ;;^UTILITY(U,$J,.84,501,2,1,0)
 ;;=File #|FILE| does not contain a field |1|.
 ;;^UTILITY(U,$J,.84,501,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,501,3,1,0)
 ;;=1^Field name or number.
 ;;^UTILITY(U,$J,.84,501,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,501,3,3,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,502,0)
 ;;=502^1^y^5
 ;;^UTILITY(U,$J,.84,502,1,0)
 ;;=^^3^3^2940715^
 ;;^UTILITY(U,$J,.84,502,1,1,0)
 ;;=The field has been identified, but some key part of its definition is
 ;;^UTILITY(U,$J,.84,502,1,2,0)
 ;;=missing or corrupted. ^DD(file#,field#,0) may not be defined. Some key
 ;;^UTILITY(U,$J,.84,502,1,3,0)
 ;;=piece of that node may be missing.
 ;;^UTILITY(U,$J,.84,502,2,0)
 ;;=^^1^1^2940715^
 ;;^UTILITY(U,$J,.84,502,2,1,0)
 ;;=Field# |FIELD| in file# |FILE| has a corrupted definition.
 ;;^UTILITY(U,$J,.84,502,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,502,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,502,3,2,0)
 ;;=FIELD^Field #.
 ;;^UTILITY(U,$J,.84,505,0)
 ;;=505^1^y^5
 ;;^UTILITY(U,$J,.84,505,1,0)
 ;;=^^2^2^2931110^^
 ;;^UTILITY(U,$J,.84,505,1,1,0)
 ;;=The field name passed is ambiguous.  It cannot be determined to which field
 ;;^UTILITY(U,$J,.84,505,1,2,0)
 ;;=in the file it refers.
 ;;^UTILITY(U,$J,.84,505,2,0)
 ;;=^^1^1^2931116^^
 ;;^UTILITY(U,$J,.84,505,2,1,0)
 ;;=There is more than one field named '|1|' in File #|FILE|.
 ;;^UTILITY(U,$J,.84,505,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,505,3,1,0)
 ;;=1^Field name.
 ;;^UTILITY(U,$J,.84,505,3,2,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,510,0)
 ;;=510^1^y^5
 ;;^UTILITY(U,$J,.84,510,1,0)
 ;;=^^2^2^2940214^^^^
 ;;^UTILITY(U,$J,.84,510,1,1,0)
 ;;=For some reason, the data type for the specified field cannot be determined.
 ;;^UTILITY(U,$J,.84,510,1,2,0)
 ;;=This may mean that the data dictionary is corrupted.
 ;;^UTILITY(U,$J,.84,510,2,0)
 ;;=^^1^1^2940214^^
 ;;^UTILITY(U,$J,.84,510,2,1,0)
 ;;=The data type for Field #|FIELD| in File #|FILE| cannot be determined.
 ;;^UTILITY(U,$J,.84,510,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,510,3,1,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,510,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,520,0)
 ;;=520^1^y^5
 ;;^UTILITY(U,$J,.84,520,1,0)
 ;;=^^3^3^2931110^^
 ;;^UTILITY(U,$J,.84,520,1,1,0)
 ;;=An incorrect kind of field is being processed.  For example, filing is 
 ;;^UTILITY(U,$J,.84,520,1,2,0)
 ;;=being attempted for a computed field or validation for a word
 ;;^UTILITY(U,$J,.84,520,1,3,0)
 ;;=processing field.
 ;;^UTILITY(U,$J,.84,520,2,0)
 ;;=^^1^1^2931110^^
 ;;^UTILITY(U,$J,.84,520,2,1,0)
 ;;=A |1| field cannot be processed by this utility.
 ;;^UTILITY(U,$J,.84,520,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,520,3,1,0)
 ;;=1^Data type or other field characteristic (e.g., .001, DINUMed).
 ;;^UTILITY(U,$J,.84,520,3,2,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,520,3,3,0)
 ;;=FIELD^Field #.
 ;;^UTILITY(U,$J,.84,520,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,520,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,525,0)
 ;;=525^1^y
 ;;^UTILITY(U,$J,.84,525,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,525,1,1,0)
 ;;=It is indicated that a subfile is involved (for example, by choosing a
 ;;^UTILITY(U,$J,.84,525,1,2,0)
 ;;=multiple field's field number), but no fields from the subfile are chosen.
 ;;^UTILITY(U,$J,.84,525,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,525,2,1,0)
 ;;=No fields are specified for subfile #|FILE|.
 ;;^UTILITY(U,$J,.84,525,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,525,3,1,0)
 ;;=FILE^Subfile #.
 ;;^UTILITY(U,$J,.84,537,0)
 ;;=537^1^y^5
 ;;^UTILITY(U,$J,.84,537,1,0)
 ;;=^^7^7^2940213^
 ;;^UTILITY(U,$J,.84,537,1,1,0)
 ;;=This error means that a certain field in a certain file has a data type of
 ;;^UTILITY(U,$J,.84,537,1,2,0)
 ;;=pointer, but something is wrong with the rest of the DD info needed to
 ;;^UTILITY(U,$J,.84,537,1,3,0)
 ;;=make that pointer work. For example, perhaps the number of the pointed to
 ;;^UTILITY(U,$J,.84,537,1,4,0)
 ;;=file, which should follow the P in the second ^-piece of the field
 ;;^UTILITY(U,$J,.84,537,1,5,0)
 ;;=descriptor node, is missing. Another problem would be if the global root
 ;;^UTILITY(U,$J,.84,537,1,6,0)
 ;;=of the pointed to file were missing from the field's definition; that
 ;;^UTILITY(U,$J,.84,537,1,7,0)
 ;;=should be found in the third ^-piece of the field descriptor.
 ;;^UTILITY(U,$J,.84,537,2,0)
 ;;=^^1^1^2940213^
 ;;^UTILITY(U,$J,.84,537,2,1,0)
 ;;=Field #|FIELD| in File #|FILE| has a corrupted pointer definition.
 ;;^UTILITY(U,$J,.84,537,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,537,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,537,3,2,0)
 ;;=FIELD^Field #.
 ;;^UTILITY(U,$J,.84,601,0)
 ;;=601^1^^5
 ;;^UTILITY(U,$J,.84,601,1,0)
 ;;=^^1^1^2940426^
 ;;^UTILITY(U,$J,.84,601,1,1,0)
 ;;=The entry identified by FILE and IENS does not exist in the database.
 ;;^UTILITY(U,$J,.84,601,2,0)
 ;;=^^1^1^2940426^^
 ;;^UTILITY(U,$J,.84,601,2,1,0)
 ;;=The entry does not exist.
 ;;^UTILITY(U,$J,.84,601,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,601,3,1,0)
 ;;=FILE^File or subfile #. (external only)
 ;;^UTILITY(U,$J,.84,601,3,2,0)
 ;;=IENS^IEN string (external only)
 ;;^UTILITY(U,$J,.84,602,0)
 ;;=602^1^^5
 ;;^UTILITY(U,$J,.84,602,1,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,602,1,1,0)
 ;;=There is a -9 node for the entry; therefore, the entry cannot be accessed.
 ;;^UTILITY(U,$J,.84,602,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,602,2,1,0)
 ;;=The entry is not available for editing.
 ;;^UTILITY(U,$J,.84,602,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,602,3,1,0)
 ;;=FILE^File or subfile #. (external only)
 ;;^UTILITY(U,$J,.84,602,3,2,0)
 ;;=IENS^IEN string. (external only)
 ;;^UTILITY(U,$J,.84,603,0)
 ;;=603^1^y^5
 ;;^UTILITY(U,$J,.84,603,1,0)
 ;;=^^2^2^2940214^
 ;;^UTILITY(U,$J,.84,603,1,1,0)
 ;;=A specific entry in a specific file lacks a value for a required field.
 ;;^UTILITY(U,$J,.84,603,1,2,0)
 ;;=This error message returns which field is missing.
 ;;^UTILITY(U,$J,.84,603,2,0)
 ;;=^^1^1^2940214^
 ;;^UTILITY(U,$J,.84,603,2,1,0)
 ;;=Entry #|1| in File #|FILE| lacks the required Field #|FIELD|.
 ;;^UTILITY(U,$J,.84,603,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,603,3,1,0)
 ;;=1^Entry #.
 ;;^UTILITY(U,$J,.84,603,3,2,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,603,3,3,0)
 ;;=FIELD^Field #.

DINIT009
DINIT009 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,630,0)
 ;;=630^1^y^5
 ;;^UTILITY(U,$J,.84,630,1,0)
 ;;=^^2^2^2941128^
 ;;^UTILITY(U,$J,.84,630,1,1,0)
 ;;=The database is corrupted. The value for a specific field in one entry
 ;;^UTILITY(U,$J,.84,630,1,2,0)
 ;;=should be a certain data type, but it is not.
 ;;^UTILITY(U,$J,.84,630,2,0)
 ;;=^^2^2^2941128^
 ;;^UTILITY(U,$J,.84,630,2,1,0)
 ;;=In Entry #|1| of File #|FILE|, the value '|2|' for Field #|FIELD| is not a
 ;;^UTILITY(U,$J,.84,630,2,2,0)
 ;;=valid |3|.
 ;;^UTILITY(U,$J,.84,630,3,0)
 ;;=^.845^5^5
 ;;^UTILITY(U,$J,.84,630,3,1,0)
 ;;=1^Entry #.
 ;;^UTILITY(U,$J,.84,630,3,2,0)
 ;;=2^Field Value.
 ;;^UTILITY(U,$J,.84,630,3,3,0)
 ;;=3^Data Type.
 ;;^UTILITY(U,$J,.84,630,3,4,0)
 ;;=FIELD^Field #.
 ;;^UTILITY(U,$J,.84,630,3,5,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,648,0)
 ;;=648^1^y^5
 ;;^UTILITY(U,$J,.84,648,1,0)
 ;;=^^3^3^2940214^
 ;;^UTILITY(U,$J,.84,648,1,1,0)
 ;;=The database is corrupted. In a specific variable pointer field of a
 ;;^UTILITY(U,$J,.84,648,1,2,0)
 ;;=certain entry, the field's value points to a file that either does not
 ;;^UTILITY(U,$J,.84,648,1,3,0)
 ;;=exist or that lacks a Header Node.
 ;;^UTILITY(U,$J,.84,648,2,0)
 ;;=^^2^2^2940214^
 ;;^UTILITY(U,$J,.84,648,2,1,0)
 ;;=In Entry #|1| of File #|FILE|, the value '|2|' for Field #|FIELD| points
 ;;^UTILITY(U,$J,.84,648,2,2,0)
 ;;=to a file that does not exist or lacks a Header Node.
 ;;^UTILITY(U,$J,.84,648,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,648,3,1,0)
 ;;=1^Entry #.
 ;;^UTILITY(U,$J,.84,648,3,2,0)
 ;;=2^Field Value.
 ;;^UTILITY(U,$J,.84,648,3,3,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,648,3,4,0)
 ;;=FIELD^Field #.
 ;;^UTILITY(U,$J,.84,701,0)
 ;;=701^1^y^5
 ;;^UTILITY(U,$J,.84,701,1,0)
 ;;=^^3^3^2931109^
 ;;^UTILITY(U,$J,.84,701,1,1,0)
 ;;=The value is invalid.  Possible causes include:  value did not pass input 
 ;;^UTILITY(U,$J,.84,701,1,2,0)
 ;;=transform, value for a pointer or variable pointer field cannot be found in 
 ;;^UTILITY(U,$J,.84,701,1,3,0)
 ;;=the pointed-to file, a screen was not passed.
 ;;^UTILITY(U,$J,.84,701,2,0)
 ;;=^^1^1^2931110^^
 ;;^UTILITY(U,$J,.84,701,2,1,0)
 ;;=The value '|3|' for field |1| in file |2| is not valid.
 ;;^UTILITY(U,$J,.84,701,3,0)
 ;;=^.845^6^6
 ;;^UTILITY(U,$J,.84,701,3,1,0)
 ;;=1^Field name.
 ;;^UTILITY(U,$J,.84,701,3,2,0)
 ;;=2^File name.
 ;;^UTILITY(U,$J,.84,701,3,3,0)
 ;;=3^Value that was found to be invalid.
 ;;^UTILITY(U,$J,.84,701,3,4,0)
 ;;=FIELD^Field number. (external only)
 ;;^UTILITY(U,$J,.84,701,3,5,0)
 ;;=FILE^File number.  (external only)
 ;;^UTILITY(U,$J,.84,701,3,6,0)
 ;;=IENS^IEN string identifying entry with invalid value. (external only, sometimes returned)
 ;;^UTILITY(U,$J,.84,701,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,701,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,703,0)
 ;;=703^1^y^5
 ;;^UTILITY(U,$J,.84,703,1,0)
 ;;=^^1^1^2940317^
 ;;^UTILITY(U,$J,.84,703,1,1,0)
 ;;=The value passed cannot be found in the indicated file using $$FIND1^DIC.
 ;;^UTILITY(U,$J,.84,703,2,0)
 ;;=^^1^1^2940317^
 ;;^UTILITY(U,$J,.84,703,2,1,0)
 ;;=The value '|1|' cannot be found in file #|FILE|.
 ;;^UTILITY(U,$J,.84,703,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,703,3,1,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,703,3,2,0)
 ;;=IENS^IEN String.
 ;;^UTILITY(U,$J,.84,703,3,3,0)
 ;;=1^Lookup Value.
 ;;^UTILITY(U,$J,.84,710,0)
 ;;=710^1^y^5
 ;;^UTILITY(U,$J,.84,710,1,0)
 ;;=^^2^2^2931123^^^^
 ;;^UTILITY(U,$J,.84,710,1,1,0)
 ;;=The data dictionary specifies that the field is uneditable.  Data already
 ;;^UTILITY(U,$J,.84,710,1,2,0)
 ;;=exists in the field.  It cannot be changed.
 ;;^UTILITY(U,$J,.84,710,2,0)
 ;;=^^1^1^2931110^^^
 ;;^UTILITY(U,$J,.84,710,2,1,0)
 ;;=Data in Field #|FIELD| in File #|FILE| cannot be edited.
 ;;^UTILITY(U,$J,.84,710,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,710,3,1,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,710,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,712,0)
 ;;=712^1^y^5
 ;;^UTILITY(U,$J,.84,712,1,0)
 ;;=^^3^3^2931109^
 ;;^UTILITY(U,$J,.84,712,1,1,0)
 ;;=The value of a field cannot be deleted either because it is a required 
 ;;^UTILITY(U,$J,.84,712,1,2,0)
 ;;=field, because it is the .01 of a file, or because the test in the "DEL"
 ;;^UTILITY(U,$J,.84,712,1,3,0)
 ;;=node was not passed.
 ;;^UTILITY(U,$J,.84,712,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,712,2,1,0)
 ;;=The value of field |1| in file |2| cannot be deleted.
 ;;^UTILITY(U,$J,.84,712,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,712,3,1,0)
 ;;=1^Field name.
 ;;^UTILITY(U,$J,.84,712,3,2,0)
 ;;=2^File name.
 ;;^UTILITY(U,$J,.84,712,3,3,0)
 ;;=FIELD^Field number.  (external only)
 ;;^UTILITY(U,$J,.84,712,3,4,0)
 ;;=FILE^File number.  (external only)
 ;;^UTILITY(U,$J,.84,712,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,712,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,714,0)
 ;;=714^1^y^5
 ;;^UTILITY(U,$J,.84,714,1,0)
 ;;=^^2^2^2931109^^
 ;;^UTILITY(U,$J,.84,714,1,1,0)
 ;;=The field uses $Piece storage and the data contains an '^'.  The data
 ;;^UTILITY(U,$J,.84,714,1,2,0)
 ;;=cannot be filed.
 ;;^UTILITY(U,$J,.84,714,2,0)
 ;;=^^1^1^2931109^^
 ;;^UTILITY(U,$J,.84,714,2,1,0)
 ;;=Data for Field |1| in File |2| contains an '^'.
 ;;^UTILITY(U,$J,.84,714,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,714,3,1,0)
 ;;=1^Field name.
 ;;^UTILITY(U,$J,.84,714,3,2,0)
 ;;=2^File name.
 ;;^UTILITY(U,$J,.84,714,3,3,0)
 ;;=FILE^File number.  (external only)
 ;;^UTILITY(U,$J,.84,714,3,4,0)
 ;;=FIELD^Field number. (external only)
 ;;^UTILITY(U,$J,.84,714,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,714,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,716,0)
 ;;=716^1^y^5
 ;;^UTILITY(U,$J,.84,716,1,0)
 ;;=^^2^2^2931109^
 ;;^UTILITY(U,$J,.84,716,1,1,0)
 ;;=Data being filed is too long for the field.  Specifically, this occurs 
 ;;^UTILITY(U,$J,.84,716,1,2,0)
 ;;=when data of the wrong length is being filed in a $Extract (Em,n) field.
 ;;^UTILITY(U,$J,.84,716,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,716,2,1,0)
 ;;=Data for field |1| in file |2| is too long.
 ;;^UTILITY(U,$J,.84,716,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,716,3,1,0)
 ;;=1^Field name.
 ;;^UTILITY(U,$J,.84,716,3,2,0)
 ;;=2^File name.
 ;;^UTILITY(U,$J,.84,716,3,3,0)
 ;;=FIELD^Field number. (external only)
 ;;^UTILITY(U,$J,.84,716,3,4,0)
 ;;=FILE^File number.  (external only)
 ;;^UTILITY(U,$J,.84,716,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,716,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,720,0)
 ;;=720^1^^5
 ;;^UTILITY(U,$J,.84,720,1,0)
 ;;=^^2^2^2931110^^
 ;;^UTILITY(U,$J,.84,720,1,1,0)
 ;;=The lookup for a pointer fails.  This is an error only when

DINIT00A
DINIT00A ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,720,1,2,0)
 ;;=LAYGO is not allowed.
 ;;^UTILITY(U,$J,.84,720,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,720,2,1,0)
 ;;=The value cannot be found in the pointed-to file.
 ;;^UTILITY(U,$J,.84,720,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,720,3,1,0)
 ;;=FILE^File number -- the number of the file in which the pointer field exists.
 ;;^UTILITY(U,$J,.84,720,3,2,0)
 ;;=FIELD^Field number of the pointer field.
 ;;^UTILITY(U,$J,.84,726,0)
 ;;=726^1^y^5
 ;;^UTILITY(U,$J,.84,726,1,0)
 ;;=^^2^2^2931110^
 ;;^UTILITY(U,$J,.84,726,1,1,0)
 ;;=There is an attempt to take an action with word processing data, but
 ;;^UTILITY(U,$J,.84,726,1,2,0)
 ;;=the specified field is not a word processing field.
 ;;^UTILITY(U,$J,.84,726,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,726,2,1,0)
 ;;=Field #|FIELD| in File #|FILE| is not a word processing field.
 ;;^UTILITY(U,$J,.84,726,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,726,3,1,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,726,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,730,0)
 ;;=730^1^y^5
 ;;^UTILITY(U,$J,.84,730,1,0)
 ;;=^^2^2^2941128^
 ;;^UTILITY(U,$J,.84,730,1,1,0)
 ;;=Based on how the data type is defined by a specific field in a specific
 ;;^UTILITY(U,$J,.84,730,1,2,0)
 ;;=file, the passed value is not valid.
 ;;^UTILITY(U,$J,.84,730,2,0)
 ;;=^^2^2^2941128^
 ;;^UTILITY(U,$J,.84,730,2,1,0)
 ;;=The value '|1|' is not a valid |2| according to the definition in Field
 ;;^UTILITY(U,$J,.84,730,2,2,0)
 ;;=#|FIELD| of File #|FILE|.
 ;;^UTILITY(U,$J,.84,730,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,730,3,1,0)
 ;;=1^Passed Value.
 ;;^UTILITY(U,$J,.84,730,3,2,0)
 ;;=2^Data Type.
 ;;^UTILITY(U,$J,.84,730,3,3,0)
 ;;=FIELD^Field #.
 ;;^UTILITY(U,$J,.84,730,3,4,0)
 ;;=FILE^File #.
 ;;^UTILITY(U,$J,.84,740,0)
 ;;=740^1^y^5
 ;;^UTILITY(U,$J,.84,740,1,0)
 ;;=^^5^5^2980407^^^^
 ;;^UTILITY(U,$J,.84,740,1,1,0)
 ;;=When one or more fields are declared as a key for a file, there cannot be 
 ;;^UTILITY(U,$J,.84,740,1,2,0)
 ;;=duplicate values in those field(s) for entries in the file.  The values
 ;;^UTILITY(U,$J,.84,740,1,3,0)
 ;;=being passed for validation, when combined with values for unchanging 
 ;;^UTILITY(U,$J,.84,740,1,4,0)
 ;;=fields in the entry if necessary, create a duplicate key.  The changes 
 ;;^UTILITY(U,$J,.84,740,1,5,0)
 ;;=destroy the integrity of the key.  Therefore, they are invalid.
 ;;^UTILITY(U,$J,.84,740,2,0)
 ;;=^^1^1^2980407^
 ;;^UTILITY(U,$J,.84,740,2,1,0)
 ;;=New values are invalid because they create a duplicate Key '|1|' for the |2| file.
 ;;^UTILITY(U,$J,.84,740,3,0)
 ;;=^.845^5^5
 ;;^UTILITY(U,$J,.84,740,3,1,0)
 ;;=1^Name of Key.
 ;;^UTILITY(U,$J,.84,740,3,2,0)
 ;;=2^Name of affected file.
 ;;^UTILITY(U,$J,.84,740,3,3,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,740,3,4,0)
 ;;=KEY^IEN of the invalid key.
 ;;^UTILITY(U,$J,.84,740,3,5,0)
 ;;=IENS^IENS of record with invalid key.
 ;;^UTILITY(U,$J,.84,741,0)
 ;;=741^1^^5
 ;;^UTILITY(U,$J,.84,741,1,0)
 ;;=^^3^3^2981208^
 ;;^UTILITY(U,$J,.84,741,1,1,0)
 ;;=Error message generated when user is adding a new entry using classic
 ;;^UTILITY(U,$J,.84,741,1,2,0)
 ;;=FileMan lookup ^DIC routines, and either key values are not entered, or
 ;;^UTILITY(U,$J,.84,741,1,3,0)
 ;;=they create a duplicate key.
 ;;^UTILITY(U,$J,.84,741,2,0)
 ;;=^^1^1^2981208^
 ;;^UTILITY(U,$J,.84,741,2,1,0)
 ;;=Either key values are null, or they create a duplicate key.
 ;;^UTILITY(U,$J,.84,741,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,741,5,1,0)
 ;;=DICN1^A
 ;;^UTILITY(U,$J,.84,742,0)
 ;;=742^1^y^5
 ;;^UTILITY(U,$J,.84,742,1,0)
 ;;=^^2^2^2980407^^^^
 ;;^UTILITY(U,$J,.84,742,1,1,0)
 ;;=Every field in a key must have a value.  The incoming data cannot delete
 ;;^UTILITY(U,$J,.84,742,1,2,0)
 ;;=the value for any field in a key.
 ;;^UTILITY(U,$J,.84,742,2,0)
 ;;=^^1^1^2980407^^
 ;;^UTILITY(U,$J,.84,742,2,1,0)
 ;;=The value of field |1| in the |2| file cannot be deleted because that field is part of the '|3|' key.
 ;;^UTILITY(U,$J,.84,742,3,0)
 ;;=^.845^6^6
 ;;^UTILITY(U,$J,.84,742,3,1,0)
 ;;=1^Field name
 ;;^UTILITY(U,$J,.84,742,3,2,0)
 ;;=2^File name
 ;;^UTILITY(U,$J,.84,742,3,3,0)
 ;;=3^Key name
 ;;^UTILITY(U,$J,.84,742,3,4,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,742,3,5,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,742,3,6,0)
 ;;=IENS^IENS
 ;;^UTILITY(U,$J,.84,744,0)
 ;;=744^1^y^5
 ;;^UTILITY(U,$J,.84,744,1,0)
 ;;=^^2^2^2980413^^^^
 ;;^UTILITY(U,$J,.84,744,1,1,0)
 ;;=Every field that is in a key must have a value.  No value for this field 
 ;;^UTILITY(U,$J,.84,744,1,2,0)
 ;;=exists.
 ;;^UTILITY(U,$J,.84,744,2,0)
 ;;=^^1^1^2980407^^^^
 ;;^UTILITY(U,$J,.84,744,2,1,0)
 ;;=Field |1| is part of Key '|2|', but the field has not been assigned a value.
 ;;^UTILITY(U,$J,.84,744,3,0)
 ;;=^.845^5^5
 ;;^UTILITY(U,$J,.84,744,3,1,0)
 ;;=1^Field name.
 ;;^UTILITY(U,$J,.84,744,3,2,0)
 ;;=2^Key name.
 ;;^UTILITY(U,$J,.84,744,3,3,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,744,3,4,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,744,3,5,0)
 ;;=IENS^IENS of record with incomplete key.
 ;;^UTILITY(U,$J,.84,746,0)
 ;;=746^1^y^5
 ;;^UTILITY(U,$J,.84,746,1,0)
 ;;=^^2^2^2980415^^^^
 ;;^UTILITY(U,$J,.84,746,1,1,0)
 ;;=A lookup node is present in the FDA, but no Primary Key fields are
 ;;^UTILITY(U,$J,.84,746,1,2,0)
 ;;=provided.
 ;;^UTILITY(U,$J,.84,746,2,0)
 ;;=^^1^1^2980415^
 ;;^UTILITY(U,$J,.84,746,2,1,0)
 ;;=No fields in Primary Key '|1|' have been provided in the FDA to look up '|IENS|' in the |2| file.
 ;;^UTILITY(U,$J,.84,746,3,0)
 ;;=^.845^5^5
 ;;^UTILITY(U,$J,.84,746,3,1,0)
 ;;=1^Key name.
 ;;^UTILITY(U,$J,.84,746,3,2,0)
 ;;=2^File name.
 ;;^UTILITY(U,$J,.84,746,3,3,0)
 ;;=IENS^IENS of lookup node.
 ;;^UTILITY(U,$J,.84,746,3,4,0)
 ;;=KEY^Key number.
 ;;^UTILITY(U,$J,.84,746,3,5,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,810,0)
 ;;=810^1^^5
 ;;^UTILITY(U,$J,.84,810,1,0)
 ;;=^^3^3^2931109^
 ;;^UTILITY(U,$J,.84,810,1,1,0)
 ;;=A %ZOSF node required to perform a function does not exist.  The
 ;;^UTILITY(U,$J,.84,810,1,2,0)
 ;;=VA FileMan Programmer's Manual contains a complete list of %ZOSF
 ;;^UTILITY(U,$J,.84,810,1,3,0)
 ;;=nodes.
 ;;^UTILITY(U,$J,.84,810,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,810,2,1,0)
 ;;=A necessary %ZOSF node does not exist on your system.
 ;;^UTILITY(U,$J,.84,820,0)
 ;;=820^1^^5
 ;;^UTILITY(U,$J,.84,820,1,0)
 ;;=^^3^3^2931109^
 ;;^UTILITY(U,$J,.84,820,1,1,0)
 ;;=The ZSAVE CODE field (#2619) in the MUMPS Operating System file (#.7)

DINIT00B
DINIT00B ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,820,1,2,0)
 ;;=is empty for the operating system being used.  It is impossible to perform
 ;;^UTILITY(U,$J,.84,820,1,3,0)
 ;;=functions such as compiling templates or cross references.
 ;;^UTILITY(U,$J,.84,820,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,820,2,1,0)
 ;;=There is no way to save routines on the system.
 ;;^UTILITY(U,$J,.84,840,0)
 ;;=840^1^y^5
 ;;^UTILITY(U,$J,.84,840,1,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,840,1,1,0)
 ;;=The Terminal Type file does not have an entry that matches IOST(0).
 ;;^UTILITY(U,$J,.84,840,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,840,2,1,0)
 ;;=Terminal type '|1|' cannot be found in the Terminal Type file.
 ;;^UTILITY(U,$J,.84,840,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,840,3,1,0)
 ;;=1^Terminal type as identified by IOST(0).
 ;;^UTILITY(U,$J,.84,842,0)
 ;;=842^1^y^5
 ;;^UTILITY(U,$J,.84,842,1,0)
 ;;=^^2^2^2931110^^
 ;;^UTILITY(U,$J,.84,842,1,1,0)
 ;;=The field in the Terminal Type field that contains the specified
 ;;^UTILITY(U,$J,.84,842,1,2,0)
 ;;=characteristic of the terminal is null.
 ;;^UTILITY(U,$J,.84,842,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,842,2,1,0)
 ;;=|1| cannot be found for Terminal Type |2|.
 ;;^UTILITY(U,$J,.84,842,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,842,3,1,0)
 ;;=1^Terminal Type characteristic.
 ;;^UTILITY(U,$J,.84,842,3,2,0)
 ;;=2^Terminal type.
 ;;^UTILITY(U,$J,.84,845,0)
 ;;=845^1^^5
 ;;^UTILITY(U,$J,.84,845,1,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,845,1,1,0)
 ;;=A %ZIS call with IOP set to "HOME" returns POP.
 ;;^UTILITY(U,$J,.84,845,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,845,2,1,0)
 ;;=The characteristics for the HOME device cannot be obtained.
 ;;^UTILITY(U,$J,.84,1300,0)
 ;;=1300^1^y^5
 ;;^UTILITY(U,$J,.84,1300,1,0)
 ;;=^^1^1^2970210^^
 ;;^UTILITY(U,$J,.84,1300,1,1,0)
 ;;=The entry encountered an error during subfile filing.
 ;;^UTILITY(U,$J,.84,1300,2,0)
 ;;=^^1^1^2970210^
 ;;^UTILITY(U,$J,.84,1300,2,1,0)
 ;;=The entry encountered an error during subfile filing.
 ;;^UTILITY(U,$J,.84,1300,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1300,3,1,0)
 ;;=IEN^Entry Number
 ;;^UTILITY(U,$J,.84,1500,0)
 ;;=1500^1^y^5
 ;;^UTILITY(U,$J,.84,1500,1,0)
 ;;=^^2^2^2931112^
 ;;^UTILITY(U,$J,.84,1500,1,1,0)
 ;;=Error given for unsuccessful lookup of search template in BY(0) input
 ;;^UTILITY(U,$J,.84,1500,1,2,0)
 ;;=variable.
 ;;^UTILITY(U,$J,.84,1500,2,0)
 ;;=^^2^2^2931112^
 ;;^UTILITY(U,$J,.84,1500,2,1,0)
 ;;=Search template |1| in BY(0) variable cannot be found,
 ;;^UTILITY(U,$J,.84,1500,2,2,0)
 ;;=is for the wrong file, or has no list of search results.
 ;;^UTILITY(U,$J,.84,1500,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1500,3,1,0)
 ;;=1^Name of search template in input variable BY(0).
 ;;^UTILITY(U,$J,.84,1500,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,1500,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,1500,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,1501,0)
 ;;=1501^1^^5
 ;;^UTILITY(U,$J,.84,1501,1,0)
 ;;=^^2^2^2931116^^^
 ;;^UTILITY(U,$J,.84,1501,1,1,0)
 ;;=Error message shown to user when no code was generated during compilation
 ;;^UTILITY(U,$J,.84,1501,1,2,0)
 ;;=of SORT TEMPLATES.
 ;;^UTILITY(U,$J,.84,1501,2,0)
 ;;=^^1^1^2931116^
 ;;^UTILITY(U,$J,.84,1501,2,1,0)
 ;;=There is no code to save for this compiled Sort Template routine.
 ;;^UTILITY(U,$J,.84,1501,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1501,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,1502,0)
 ;;=1502^1^^5
 ;;^UTILITY(U,$J,.84,1502,1,0)
 ;;=^^3^3^2931116^^^
 ;;^UTILITY(U,$J,.84,1502,1,1,0)
 ;;=Error message notifying the user that there are no more available
 ;;^UTILITY(U,$J,.84,1502,1,2,0)
 ;;=routine numbers for compiled sort template routines.  This should
 ;;^UTILITY(U,$J,.84,1502,1,3,0)
 ;;=never happen, since routine numbers are re-used.
 ;;^UTILITY(U,$J,.84,1502,2,0)
 ;;=^^2^2^2940909^
 ;;^UTILITY(U,$J,.84,1502,2,1,0)
 ;;=All available routine numbers for compilation are in use.
 ;;^UTILITY(U,$J,.84,1502,2,2,0)
 ;;=IRM needs to run ENRLS^DIOZ() to release the routine numbers.
 ;;^UTILITY(U,$J,.84,1502,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1502,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,1503,0)
 ;;=1503^1^y^5
 ;;^UTILITY(U,$J,.84,1503,1,0)
 ;;=^^1^1^2931116^^^^
 ;;^UTILITY(U,$J,.84,1503,1,1,0)
 ;;=Warn user to shorten compiled cross-reference routine name.
 ;;^UTILITY(U,$J,.84,1503,2,0)
 ;;=^^1^1^2931116^^
 ;;^UTILITY(U,$J,.84,1503,2,1,0)
 ;;= routine name is too long.  Compilation has been aborted.
 ;;^UTILITY(U,$J,.84,1503,5,0)
 ;;=^.841^6^6
 ;;^UTILITY(U,$J,.84,1503,5,1,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,1503,5,2,0)
 ;;=DIEZ^EN
 ;;^UTILITY(U,$J,.84,1503,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,1503,5,4,0)
 ;;=DIKZ^EN
 ;;^UTILITY(U,$J,.84,1503,5,5,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,1503,5,6,0)
 ;;=DIPZ^EN
 ;;^UTILITY(U,$J,.84,1504,0)
 ;;=1504^1^^5
 ;;^UTILITY(U,$J,.84,1504,1,0)
 ;;=^^2^2^2940316^
 ;;^UTILITY(U,$J,.84,1504,1,1,0)
 ;;=If doing Transfer/Merge of a single record from one file to another, and
 ;;^UTILITY(U,$J,.84,1504,1,2,0)
 ;;=the .01 field names do not match, we cannot do the transfer/merge.
 ;;^UTILITY(U,$J,.84,1504,2,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,1504,2,1,0)
 ;;=No matching .01 field names found.  Transfer/Merge cannot be done.
 ;;^UTILITY(U,$J,.84,1504,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1504,5,1,0)
 ;;=DIT^TRNMRG
 ;;^UTILITY(U,$J,.84,1610,0)
 ;;=1610^1^^5
 ;;^UTILITY(U,$J,.84,1610,1,0)
 ;;=^^2^2^2940223^^
 ;;^UTILITY(U,$J,.84,1610,1,1,0)
 ;;=A question mark or, in the case of a variable pointer field, a <something>.?
 ;;^UTILITY(U,$J,.84,1610,1,2,0)
 ;;=was passed to the Validator.  The Validator does not process help requests.
 ;;^UTILITY(U,$J,.84,1610,2,0)
 ;;=^^1^1^2940223^^^
 ;;^UTILITY(U,$J,.84,1610,2,1,0)
 ;;=Help is being requested from the Validator utility.
 ;;^UTILITY(U,$J,.84,1610,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,1610,3,1,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,1610,3,2,0)
 ;;=FIELD^Field number.
 ;;^UTILITY(U,$J,.84,1610,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1610,5,1,0)
 ;;=DIE^FILE
 ;;^UTILITY(U,$J,.84,1700,0)
 ;;=1700^1^y^5
 ;;^UTILITY(U,$J,.84,1700,1,0)
 ;;=^^1^1^2940310^^
 ;;^UTILITY(U,$J,.84,1700,1,1,0)
 ;;=Generic message for Silent DIFROM
 ;;^UTILITY(U,$J,.84,1700,2,0)
 ;;=^^1^1^2940310^^
 ;;^UTILITY(U,$J,.84,1700,2,1,0)
 ;;=Error: |1|.
 ;;^UTILITY(U,$J,.84,1700,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1700,3,1,0)
 ;;=1^Generic message
 ;;^UTILITY(U,$J,.84,1701,0)
 ;;=1701^1^y^5
 ;;^UTILITY(U,$J,.84,1701,1,0)
 ;;=^^1^1^2940912^^^

DINIT00C
DINIT00C ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,1701,1,1,0)
 ;;=Transport structure does not contain SPECIFIC ELEMENT.
 ;;^UTILITY(U,$J,.84,1701,2,0)
 ;;=^^1^1^2940912^^^
 ;;^UTILITY(U,$J,.84,1701,2,1,0)
 ;;=Transport structure does not contain |1|.
 ;;^UTILITY(U,$J,.84,1701,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1701,3,1,0)
 ;;=1^Describes missing element in transport structure.
 ;;^UTILITY(U,$J,.84,1805,0)
 ;;=1805^1^
 ;;^UTILITY(U,$J,.84,1805,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,1805,1,1,0)
 ;;=For some reason a record or a field in a record could not be filed.  The cause
 ;;^UTILITY(U,$J,.84,1805,1,2,0)
 ;;=of the error should be present in another message.
 ;;^UTILITY(U,$J,.84,1805,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1805,2,1,0)
 ;;=An error occurred during the actual filing of data into the FileMan database.
 ;;^UTILITY(U,$J,.84,1810,0)
 ;;=1810^1^y
 ;;^UTILITY(U,$J,.84,1810,1,0)
 ;;=^^3^3^2950317^
 ;;^UTILITY(U,$J,.84,1810,1,1,0)
 ;;=The attempt to move data from a host file into the MUMPS environment
 ;;^UTILITY(U,$J,.84,1810,1,2,0)
 ;;=failed.  A possible cause is that the host file does not exist in the 
 ;;^UTILITY(U,$J,.84,1810,1,3,0)
 ;;=path specified.
 ;;^UTILITY(U,$J,.84,1810,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1810,2,1,0)
 ;;=The data from host file '|1|' could not be moved into a FileMan file.
 ;;^UTILITY(U,$J,.84,1810,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1810,3,1,0)
 ;;=1^Host file name.
 ;;^UTILITY(U,$J,.84,1812,0)
 ;;=1812^1^y
 ;;^UTILITY(U,$J,.84,1812,1,0)
 ;;=^^3^3^2950317^
 ;;^UTILITY(U,$J,.84,1812,1,1,0)
 ;;=A host file was located; however, no data was present in it.  This error
 ;;^UTILITY(U,$J,.84,1812,1,2,0)
 ;;=will also occur if the only "data" is the designation of file and fields
 ;;^UTILITY(U,$J,.84,1812,1,3,0)
 ;;=with no actual data present to file.
 ;;^UTILITY(U,$J,.84,1812,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1812,2,1,0)
 ;;=The host file, |1|, contains no data to import.
 ;;^UTILITY(U,$J,.84,1812,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1812,3,1,0)
 ;;=1^Host file name.
 ;;^UTILITY(U,$J,.84,1820,0)
 ;;=1820^1^y^5
 ;;^UTILITY(U,$J,.84,1820,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,1820,1,1,0)
 ;;=The foreign format name that was passed could not be found in the Foreign Format 
 ;;^UTILITY(U,$J,.84,1820,1,2,0)
 ;;=file.
 ;;^UTILITY(U,$J,.84,1820,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1820,2,1,0)
 ;;=There is no Foreign Format named '|1|'.
 ;;^UTILITY(U,$J,.84,1820,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1820,3,1,0)
 ;;=1^Foreign format.
 ;;^UTILITY(U,$J,.84,1821,0)
 ;;=1821^1^
 ;;^UTILITY(U,$J,.84,1821,1,0)
 ;;=^^3^3^2960913^^^^
 ;;^UTILITY(U,$J,.84,1821,1,1,0)
 ;;=The format of the imported data must either be delimited by a specified 
 ;;^UTILITY(U,$J,.84,1821,1,2,0)
 ;;=character or be fixed length.  Either no format is specified
 ;;^UTILITY(U,$J,.84,1821,1,3,0)
 ;;=or it is both fixed length and delimited or it is neither.
 ;;^UTILITY(U,$J,.84,1821,2,0)
 ;;=^^2^2^2960913^^^^
 ;;^UTILITY(U,$J,.84,1821,2,1,0)
 ;;=The format of imported data must be fixed length or have a delimiter.
 ;;^UTILITY(U,$J,.84,1821,2,2,0)
 ;;=You may also specify a Foreign Format.
 ;;^UTILITY(U,$J,.84,1822,0)
 ;;=1822^1^
 ;;^UTILITY(U,$J,.84,1822,1,0)
 ;;=^^2^2^2960719^^
 ;;^UTILITY(U,$J,.84,1822,1,1,0)
 ;;=For a fixed length import, the length data for a field is impossible.  For
 ;;^UTILITY(U,$J,.84,1822,1,2,0)
 ;;=example, the length is zero or no length is given.
 ;;^UTILITY(U,$J,.84,1822,2,0)
 ;;=^^1^1^2960719^^
 ;;^UTILITY(U,$J,.84,1822,2,1,0)
 ;;=The length of a field is missing or incorrect.
 ;;^UTILITY(U,$J,.84,1831,0)
 ;;=1831^1^^5
 ;;^UTILITY(U,$J,.84,1831,1,0)
 ;;=^^6^6^2960919^
 ;;^UTILITY(U,$J,.84,1831,1,1,0)
 ;;=The Import Tool was expecting to find File and Field specifications
 ;;^UTILITY(U,$J,.84,1831,1,2,0)
 ;;=in the host file containing import data.  However, either the File
 ;;^UTILITY(U,$J,.84,1831,1,3,0)
 ;;=is not specified or the format of the specification is incorrect.
 ;;^UTILITY(U,$J,.84,1831,1,4,0)
 ;;=The first line of the host file should look exactly like this:
 ;;^UTILITY(U,$J,.84,1831,1,5,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,1831,1,6,0)
 ;;=FILE=filename
 ;;^UTILITY(U,$J,.84,1831,2,0)
 ;;=^^1^1^2960919^
 ;;^UTILITY(U,$J,.84,1831,2,1,0)
 ;;=The file name is either missing from the host file or incorrectly specified.
 ;;^UTILITY(U,$J,.84,1833,0)
 ;;=1833^1^
 ;;^UTILITY(U,$J,.84,1833,1,0)
 ;;=^^3^3^2950317^
 ;;^UTILITY(U,$J,.84,1833,1,1,0)
 ;;=The 'F' flag for the Import call means that the file and field information
 ;;^UTILITY(U,$J,.84,1833,1,2,0)
 ;;=is in the host file.  However, the file and/or fields parameter contained
 ;;^UTILITY(U,$J,.84,1833,1,3,0)
 ;;=data.  This conflicts with the 'F' flag.
 ;;^UTILITY(U,$J,.84,1833,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1833,2,1,0)
 ;;=The 'F' flag conflicts with the File or Fields parameter.
 ;;^UTILITY(U,$J,.84,1841,0)
 ;;=1841^1^
 ;;^UTILITY(U,$J,.84,1841,1,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1841,1,1,0)
 ;;=Only multiple fields can be in the path to a field.
 ;;^UTILITY(U,$J,.84,1841,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1841,2,1,0)
 ;;=A field other than a multiple is in the 'path'.
 ;;^UTILITY(U,$J,.84,1842,0)
 ;;=1842^1^
 ;;^UTILITY(U,$J,.84,1842,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,1842,1,1,0)
 ;;=The last field in a string of colon-delimited fields must be a field
 ;;^UTILITY(U,$J,.84,1842,1,2,0)
 ;;=containing data, not a multiple field.
 ;;^UTILITY(U,$J,.84,1842,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1842,2,1,0)
 ;;=A multiple field is shown as the last field is a string of fields.
 ;;^UTILITY(U,$J,.84,1844,0)
 ;;=1844^1^
 ;;^UTILITY(U,$J,.84,1844,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,1844,1,1,0)
 ;;=There must be at least one field in every subfile before moving down
 ;;^UTILITY(U,$J,.84,1844,1,2,0)
 ;;=into a lower level subfile.
 ;;^UTILITY(U,$J,.84,1844,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1844,2,1,0)
 ;;=A subfile level was skipped without specifying any fields in it.
 ;;^UTILITY(U,$J,.84,1845,0)
 ;;=1845^1^
 ;;^UTILITY(U,$J,.84,1845,1,0)
 ;;=^^2^2^2950317^
 ;;^UTILITY(U,$J,.84,1845,1,1,0)
 ;;=A field may only appear once in the designated fields for a particular 
 ;;^UTILITY(U,$J,.84,1845,1,2,0)
 ;;=file or subfile.
 ;;^UTILITY(U,$J,.84,1845,2,0)
 ;;=^^1^1^2950317^
 ;;^UTILITY(U,$J,.84,1845,2,1,0)
 ;;=The same field appears twice in the list of fields for a (sub)file.

DINIT00D
DINIT00D ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,1846,0)
 ;;=1846^1^y
 ;;^UTILITY(U,$J,.84,1846,1,0)
 ;;=^^1^1^2950317^^
 ;;^UTILITY(U,$J,.84,1846,1,1,0)
 ;;=A file or subfile must have only one string of fields associated with it.
 ;;^UTILITY(U,$J,.84,1846,2,0)
 ;;=^^1^1^2950317^^
 ;;^UTILITY(U,$J,.84,1846,2,1,0)
 ;;=File #|FILE| appears more than once in the import with different fields.
 ;;^UTILITY(U,$J,.84,1846,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1846,3,1,0)
 ;;=FILE^File or subfile number.
 ;;^UTILITY(U,$J,.84,1850,0)
 ;;=1850^1^^5
 ;;^UTILITY(U,$J,.84,1850,1,0)
 ;;=^^4^4^2960718^^
 ;;^UTILITY(U,$J,.84,1850,1,1,0)
 ;;=The device for printing the Import report was not properly specified.
 ;;^UTILITY(U,$J,.84,1850,1,2,0)
 ;;=This could be caused either by a user's response or by the  
 ;;^UTILITY(U,$J,.84,1850,1,3,0)
 ;;=device specifications passed to the FILE^DDMP call.  The problem
 ;;^UTILITY(U,$J,.84,1850,1,4,0)
 ;;=could involve either device or queuing instructions.
 ;;^UTILITY(U,$J,.84,1850,2,0)
 ;;=^^1^1^2960718^^
 ;;^UTILITY(U,$J,.84,1850,2,1,0)
 ;;=There is an error in device selection or queuing setup.
 ;;^UTILITY(U,$J,.84,1860,0)
 ;;=1860^1^^5
 ;;^UTILITY(U,$J,.84,1860,1,0)
 ;;=^^1^1^2960906^
 ;;^UTILITY(U,$J,.84,1860,1,1,0)
 ;;=The record being imported has no data.
 ;;^UTILITY(U,$J,.84,1860,2,0)
 ;;=^^1^1^2960906^
 ;;^UTILITY(U,$J,.84,1860,2,1,0)
 ;;=The record being imported has no data.
 ;;^UTILITY(U,$J,.84,1862,0)
 ;;=1862^1^^5
 ;;^UTILITY(U,$J,.84,1862,1,0)
 ;;=^^4^4^2960906^^
 ;;^UTILITY(U,$J,.84,1862,1,1,0)
 ;;=When parsing the imported record, more fields were found than expected.
 ;;^UTILITY(U,$J,.84,1862,1,2,0)
 ;;=There were either more delimiter-pieces than expected or the length of a
 ;;^UTILITY(U,$J,.84,1862,1,3,0)
 ;;=fixed length import was too long.  This probably means that the incoming
 ;;^UTILITY(U,$J,.84,1862,1,4,0)
 ;;=file is corrupted.
 ;;^UTILITY(U,$J,.84,1862,2,0)
 ;;=^^1^1^2960906^^
 ;;^UTILITY(U,$J,.84,1862,2,1,0)
 ;;=There are more fields in the incoming record than expected.
 ;;^UTILITY(U,$J,.84,1870,0)
 ;;=1870^1^y^5
 ;;^UTILITY(U,$J,.84,1870,1,0)
 ;;=^^2^2^2960913^
 ;;^UTILITY(U,$J,.84,1870,1,1,0)
 ;;=A requested import template does not exist in the Import Template file
 ;;^UTILITY(U,$J,.84,1870,1,2,0)
 ;;=for the file being imported into.
 ;;^UTILITY(U,$J,.84,1870,2,0)
 ;;=^^1^1^2961002^^^
 ;;^UTILITY(U,$J,.84,1870,2,1,0)
 ;;=Import template |1| does not exist for File #|FILE|.
 ;;^UTILITY(U,$J,.84,1870,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,1870,3,1,0)
 ;;=1^Template name.
 ;;^UTILITY(U,$J,.84,1870,3,2,0)
 ;;=FILE^File number.
 ;;^UTILITY(U,$J,.84,3000,0)
 ;;=3000^1^^5
 ;;^UTILITY(U,$J,.84,3000,1,0)
 ;;=^^1^1^2930721^
 ;;^UTILITY(U,$J,.84,3000,1,1,0)
 ;;=Initial call to ^DDS failed.
 ;;^UTILITY(U,$J,.84,3000,2,0)
 ;;=^^1^1^2931202^
 ;;^UTILITY(U,$J,.84,3000,2,1,0)
 ;;=THE FORM COULD NOT BE INVOKED.
 ;;^UTILITY(U,$J,.84,3002,0)
 ;;=3002^1^y^5
 ;;^UTILITY(U,$J,.84,3002,1,0)
 ;;=^^1^1^2931202^
 ;;^UTILITY(U,$J,.84,3002,1,1,0)
 ;;=An error was encountered during Form compilation.
 ;;^UTILITY(U,$J,.84,3002,2,0)
 ;;=^^1^1^2931202^^
 ;;^UTILITY(U,$J,.84,3002,2,1,0)
 ;;=THE FORM "|1|" COULD NOT BE COMPILED.
 ;;^UTILITY(U,$J,.84,3002,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3002,3,1,0)
 ;;=1^Form name
 ;;^UTILITY(U,$J,.84,3011,0)
 ;;=3011^1^y^5
 ;;^UTILITY(U,$J,.84,3011,1,0)
 ;;=^^1^1^2931201^
 ;;^UTILITY(U,$J,.84,3011,1,1,0)
 ;;=The specified field is missing or invalid.
 ;;^UTILITY(U,$J,.84,3011,2,0)
 ;;=^^1^1^2931201^
 ;;^UTILITY(U,$J,.84,3011,2,1,0)
 ;;=The |1| field of the |2| file is missing or invalid.
 ;;^UTILITY(U,$J,.84,3011,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,3011,3,1,0)
 ;;=1^Field or subfield name
 ;;^UTILITY(U,$J,.84,3011,3,2,0)
 ;;=2^File name
 ;;^UTILITY(U,$J,.84,3012,0)
 ;;=3012^1^y^5
 ;;^UTILITY(U,$J,.84,3012,1,0)
 ;;=^^2^2^2931201^
 ;;^UTILITY(U,$J,.84,3012,1,1,0)
 ;;=The specified file or subfile does not exist; it is not present in the
 ;;^UTILITY(U,$J,.84,3012,1,2,0)
 ;;=data dictionary.
 ;;^UTILITY(U,$J,.84,3012,2,0)
 ;;=^^1^1^2931201^
 ;;^UTILITY(U,$J,.84,3012,2,1,0)
 ;;=File |1| does not exist.
 ;;^UTILITY(U,$J,.84,3012,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3012,3,1,0)
 ;;=1^File number or name
 ;;^UTILITY(U,$J,.84,3021,0)
 ;;=3021^1^y^5
 ;;^UTILITY(U,$J,.84,3021,1,0)
 ;;=^^1^1^2940811^^^
 ;;^UTILITY(U,$J,.84,3021,1,1,0)
 ;;=A lookup in to the Form file for the given form failed.
 ;;^UTILITY(U,$J,.84,3021,2,0)
 ;;=^^2^2^2940811^
 ;;^UTILITY(U,$J,.84,3021,2,1,0)
 ;;=Form |1| does not exist in the Form file, or DDSFILE is not the Primary
 ;;^UTILITY(U,$J,.84,3021,2,2,0)
 ;;=File of the form.
 ;;^UTILITY(U,$J,.84,3021,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3021,3,1,0)
 ;;=1^Form name
 ;;^UTILITY(U,$J,.84,3022,0)
 ;;=3022^1^y^5
 ;;^UTILITY(U,$J,.84,3022,1,0)
 ;;=^^1^1^2931130^^
 ;;^UTILITY(U,$J,.84,3022,1,1,0)
 ;;=There are no pages defined in the Page multiple of the given form.
 ;;^UTILITY(U,$J,.84,3022,2,0)
 ;;=^^1^1^2931130^^
 ;;^UTILITY(U,$J,.84,3022,2,1,0)
 ;;=Form |1| contains no pages.
 ;;^UTILITY(U,$J,.84,3022,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3022,3,1,0)
 ;;=1^Form name
 ;;^UTILITY(U,$J,.84,3023,0)
 ;;=3023^1^y^5
 ;;^UTILITY(U,$J,.84,3023,1,0)
 ;;=^^1^1^2931129^^
 ;;^UTILITY(U,$J,.84,3023,1,1,0)
 ;;=The given page was not found on the form.
 ;;^UTILITY(U,$J,.84,3023,2,0)
 ;;=^^1^1^2931129^^^
 ;;^UTILITY(U,$J,.84,3023,2,1,0)
 ;;=The form does not contain a page |1|.
 ;;^UTILITY(U,$J,.84,3023,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3023,3,1,0)
 ;;=1^Page name or number
 ;;^UTILITY(U,$J,.84,3031,0)
 ;;=3031^1^y^5
 ;;^UTILITY(U,$J,.84,3031,1,0)
 ;;=^^1^1^2931124^
 ;;^UTILITY(U,$J,.84,3031,1,1,0)
 ;;=The call to the specified ScreenMan utility failed.
 ;;^UTILITY(U,$J,.84,3031,2,0)
 ;;=^^1^1^2931124^
 ;;^UTILITY(U,$J,.84,3031,2,1,0)
 ;;=NOTE: The programmer call to the |1| ScreenMan utility failed.
 ;;^UTILITY(U,$J,.84,3031,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3031,3,1,0)
 ;;=1^ScreenMan utility entry point.
 ;;^UTILITY(U,$J,.84,3041,0)
 ;;=3041^1^y^5
 ;;^UTILITY(U,$J,.84,3041,1,0)
 ;;=^^1^1^2931130^^
 ;;^UTILITY(U,$J,.84,3041,1,1,0)
 ;;=Errors were encountered while attempting to load the page.
 ;;^UTILITY(U,$J,.84,3041,2,0)
 ;;=^^1^1^2931130^
 ;;^UTILITY(U,$J,.84,3041,2,1,0)
 ;;=Page |1| (|2|) could not be loaded.
 ;;^UTILITY(U,$J,.84,3041,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,3041,3,1,0)
 ;;=1^Page number
 ;;^UTILITY(U,$J,.84,3041,3,2,0)
 ;;=2^Page name
 ;;^UTILITY(U,$J,.84,3051,0)
 ;;=3051^1^y^5

DINIT00E
DINIT00E ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;29JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,3051,1,0)
 ;;=^^2^2^2931129^^^^
 ;;^UTILITY(U,$J,.84,3051,1,1,0)
 ;;=The block has no 0 node in the Block file or was not found in the "B"
 ;;^UTILITY(U,$J,.84,3051,1,2,0)
 ;;=index.
 ;;^UTILITY(U,$J,.84,3051,2,0)
 ;;=^^1^1^2931129^^^
 ;;^UTILITY(U,$J,.84,3051,2,1,0)
 ;;=Block |1| does not exist in the Block file.
 ;;^UTILITY(U,$J,.84,3051,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3051,3,1,0)
 ;;=1^Block number or name
 ;;^UTILITY(U,$J,.84,3053,0)
 ;;=3053^1^y^5
 ;;^UTILITY(U,$J,.84,3053,1,0)
 ;;=^^4^4^2931129^
 ;;^UTILITY(U,$J,.84,3053,1,1,0)
 ;;=The specified block was not found on the page.  For example, it was not
 ;;^UTILITY(U,$J,.84,3053,1,2,0)
 ;;=found in the "AC" or "B" index in the block multiple of the page multiple
 ;;^UTILITY(U,$J,.84,3053,1,3,0)
 ;;=of the Form file, or the 0 node of the block in the block multiple is
 ;;^UTILITY(U,$J,.84,3053,1,4,0)
 ;;=missing.
 ;;^UTILITY(U,$J,.84,3053,2,0)
 ;;=^^1^1^2931129^^
 ;;^UTILITY(U,$J,.84,3053,2,1,0)
 ;;=Block |1| was not found on page |2|.
 ;;^UTILITY(U,$J,.84,3053,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,3053,3,1,0)
 ;;=1^Block order, name, or number
 ;;^UTILITY(U,$J,.84,3053,3,2,0)
 ;;=2^Page number and/or name
 ;;^UTILITY(U,$J,.84,3055,0)
 ;;=3055^1^y^5
 ;;^UTILITY(U,$J,.84,3055,1,0)
 ;;=^^1^1^2931129^^^
 ;;^UTILITY(U,$J,.84,3055,1,1,0)
 ;;=There are no blocks defined on the page.
 ;;^UTILITY(U,$J,.84,3055,2,0)
 ;;=^^1^1^2931129^^^
 ;;^UTILITY(U,$J,.84,3055,2,1,0)
 ;;=There are no blocks defined on page |1|.
 ;;^UTILITY(U,$J,.84,3055,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3055,3,1,0)
 ;;=1^Page name and/or number
 ;;^UTILITY(U,$J,.84,3071,0)
 ;;=3071^1^y^5
 ;;^UTILITY(U,$J,.84,3071,1,0)
 ;;=^^1^1^2931129^^^
 ;;^UTILITY(U,$J,.84,3071,1,1,0)
 ;;=The specified block has no fields on it.
 ;;^UTILITY(U,$J,.84,3071,2,0)
 ;;=^^1^1^2931129^^
 ;;^UTILITY(U,$J,.84,3071,2,1,0)
 ;;=There are no fields defined on block |1|.
 ;;^UTILITY(U,$J,.84,3071,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3071,3,1,0)
 ;;=1^Block name
 ;;^UTILITY(U,$J,.84,3072,0)
 ;;=3072^1^y^5
 ;;^UTILITY(U,$J,.84,3072,1,0)
 ;;=^^1^1^2931129^
 ;;^UTILITY(U,$J,.84,3072,1,1,0)
 ;;=The specified field was not found on the block.
 ;;^UTILITY(U,$J,.84,3072,2,0)
 ;;=^^1^1^2931129^
 ;;^UTILITY(U,$J,.84,3072,2,1,0)
 ;;=Field |1| was not found on block |2|.
 ;;^UTILITY(U,$J,.84,3072,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,3072,3,1,0)
 ;;=1^Field order, number, caption, or unique name
 ;;^UTILITY(U,$J,.84,3072,3,2,0)
 ;;=2^Block name
 ;;^UTILITY(U,$J,.84,3081,0)
 ;;=3081^1^^5
 ;;^UTILITY(U,$J,.84,3081,1,0)
 ;;=^^2^2^2931201^^
 ;;^UTILITY(U,$J,.84,3081,1,1,0)
 ;;=The field specified by FO(field) in the pointer link or computed expression
 ;;^UTILITY(U,$J,.84,3081,1,2,0)
 ;;=is not a form only field.
 ;;^UTILITY(U,$J,.84,3081,2,0)
 ;;=^^1^1^2931201^^
 ;;^UTILITY(U,$J,.84,3081,2,1,0)
 ;;=The specified field is not a form-only field.
 ;;^UTILITY(U,$J,.84,3082,0)
 ;;=3082^1^^5
 ;;^UTILITY(U,$J,.84,3082,1,0)
 ;;=^^3^3^2931203^
 ;;^UTILITY(U,$J,.84,3082,1,1,0)
 ;;=The field, block, and/or page is missing or invalid in the expression
 ;;^UTILITY(U,$J,.84,3082,1,2,0)
 ;;=FO(field,block,page), used in the pointer link, parent field, or computed
 ;;^UTILITY(U,$J,.84,3082,1,3,0)
 ;;=expression.
 ;;^UTILITY(U,$J,.84,3082,2,0)
 ;;=^^1^1^2931203^
 ;;^UTILITY(U,$J,.84,3082,2,1,0)
 ;;=Parameters are missing or invalid in an FO() expression.
 ;;^UTILITY(U,$J,.84,3083,0)
 ;;=3083^1^^5
 ;;^UTILITY(U,$J,.84,3083,1,0)
 ;;=^^1^1^2931203^^
 ;;^UTILITY(U,$J,.84,3083,1,1,0)
 ;;=The relational expression is incomplete.
 ;;^UTILITY(U,$J,.84,3083,2,0)
 ;;=^^1^1^2931203^^
 ;;^UTILITY(U,$J,.84,3083,2,1,0)
 ;;=The relational expression is incomplete.
 ;;^UTILITY(U,$J,.84,3084,0)
 ;;=3084^1^^5
 ;;^UTILITY(U,$J,.84,3084,1,0)
 ;;=^^3^3^2931203^^
 ;;^UTILITY(U,$J,.84,3084,1,1,0)
 ;;=In a computed expression, a form-only field should be referenced as
 ;;^UTILITY(U,$J,.84,3084,1,2,0)
 ;;={FO(field,block)} or {FO(field)}.  The page parameter should not be
 ;;^UTILITY(U,$J,.84,3084,1,3,0)
 ;;=included.
 ;;^UTILITY(U,$J,.84,3084,2,0)
 ;;=^^1^1^2931203^^
 ;;^UTILITY(U,$J,.84,3084,2,1,0)
 ;;=The FO() expression should not contain a page parameter.
 ;;^UTILITY(U,$J,.84,3085,0)
 ;;=3085^1^^5
 ;;^UTILITY(U,$J,.84,3085,1,0)
 ;;=^^3^3^2931203^
 ;;^UTILITY(U,$J,.84,3085,1,1,0)
 ;;=In a computed expression, a form-only field should be referenced as
 ;;^UTILITY(U,$J,.84,3085,1,2,0)
 ;;={FO(field,block)} or {FO(field)}.  The block parameter should be
 ;;^UTILITY(U,$J,.84,3085,1,3,0)
 ;;=either the block name or `block number.  It should not be a block order.
 ;;^UTILITY(U,$J,.84,3085,2,0)
 ;;=^^1^1^2931203^^
 ;;^UTILITY(U,$J,.84,3085,2,1,0)
 ;;=The FO() expression should not use block order to specify a block.
 ;;^UTILITY(U,$J,.84,3086,0)
 ;;=3086^1^^5
 ;;^UTILITY(U,$J,.84,3086,1,0)
 ;;=^^2^2^2940708^^
 ;;^UTILITY(U,$J,.84,3086,1,1,0)
 ;;=Reject calls to PUT^DDSVAL which attempt to set the .01 field of a file to
 ;;^UTILITY(U,$J,.84,3086,1,2,0)
 ;;="" or "@".
 ;;^UTILITY(U,$J,.84,3086,2,0)
 ;;=^^1^1^2940708^^^
 ;;^UTILITY(U,$J,.84,3086,2,1,0)
 ;;=PUT^DDSVAL cannot be used to delete an entry.
 ;;^UTILITY(U,$J,.84,3091,0)
 ;;=3091^1^^5
 ;;^UTILITY(U,$J,.84,3091,1,0)
 ;;=^^1^1^2930722^
 ;;^UTILITY(U,$J,.84,3091,1,1,0)
 ;;=The data could not be filed.
 ;;^UTILITY(U,$J,.84,3091,2,0)
 ;;=^^1^1^2931202^^
 ;;^UTILITY(U,$J,.84,3091,2,1,0)
 ;;=THE DATA COULD NOT BE FILED.
 ;;^UTILITY(U,$J,.84,3092,0)
 ;;=3092^1^y^5
 ;;^UTILITY(U,$J,.84,3092,1,0)
 ;;=^^1^1^2940713^^^^
 ;;^UTILITY(U,$J,.84,3092,1,1,0)
 ;;=The given field is required and its current value is null.
 ;;^UTILITY(U,$J,.84,3092,2,0)
 ;;=^^1^1^2940713^^^
 ;;^UTILITY(U,$J,.84,3092,2,1,0)
 ;;=On |1|, |2| is a required field |3|
 ;;^UTILITY(U,$J,.84,3092,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,3092,3,1,0)
 ;;=1^Page name
 ;;^UTILITY(U,$J,.84,3092,3,2,0)
 ;;=2^Caption
 ;;^UTILITY(U,$J,.84,3092,3,3,0)
 ;;=3^Subrecord name in parentheses
 ;;^UTILITY(U,$J,.84,7001,0)
 ;;=7001^2^^5
 ;;^UTILITY(U,$J,.84,7001,1,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,7001,1,1,0)
 ;;=This is the general Yes/No Prompt
 ;;^UTILITY(U,$J,.84,7001,2,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,7001,2,1,0)
 ;;=Yes^No
 ;;^UTILITY(U,$J,.84,7002,0)
 ;;=7002^2^^5
 ;;^UTILITY(U,$J,.84,7002,1,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,7002,1,1,0)
 ;;=Insert/Replace Switch
 ;;^UTILITY(U,$J,.84,7002,2,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,7002,2,1,0)
 ;;=Insert ^Replace

DINIT00F
DINIT00F ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;31JAN2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,7003,0)
 ;;=7003^2^^5
 ;;^UTILITY(U,$J,.84,7003,1,0)
 ;;=^^1^1^2960321^^
 ;;^UTILITY(U,$J,.84,7003,1,1,0)
 ;;=Yes/No prompt for Reader
 ;;^UTILITY(U,$J,.84,7003,2,0)
 ;;=^^1^1^2960321^^^
 ;;^UTILITY(U,$J,.84,7003,2,1,0)
 ;;=y:YES;n:NO
 ;;^UTILITY(U,$J,.84,7003,4,0)
 ;;=^.847P^2^1
 ;;^UTILITY(U,$J,.84,7003,4,2,0)
 ;;=2
 ;;^UTILITY(U,$J,.84,7003,4,2,1,0)
 ;;=^^1^1^2960321^
 ;;^UTILITY(U,$J,.84,7003,4,2,1,1,0)
 ;;=j:JA;n:NEIN
 ;;^UTILITY(U,$J,.84,7004,0)
 ;;=7004^2^^5
 ;;^UTILITY(U,$J,.84,7004,1,0)
 ;;=^^2^2^2940909^^^^
 ;;^UTILITY(U,$J,.84,7004,1,1,0)
 ;;=Set of codes for reader call when asking user whether they want to include
 ;;^UTILITY(U,$J,.84,7004,1,2,0)
 ;;=computed fields and/or IEN in CAPTIONED output.
 ;;^UTILITY(U,$J,.84,7004,2,0)
 ;;=^^4^4^2940914^^
 ;;^UTILITY(U,$J,.84,7004,2,1,0)
 ;;=N:NO - No record number (IEN), no Computed Fields;
 ;;^UTILITY(U,$J,.84,7004,2,2,0)
 ;;=Y:Computed Fields;
 ;;^UTILITY(U,$J,.84,7004,2,3,0)
 ;;=R:Record Number (IEN);
 ;;^UTILITY(U,$J,.84,7004,2,4,0)
 ;;=B:BOTH Computed Fields and Record Number (IEN)
 ;;^UTILITY(U,$J,.84,7005,0)
 ;;=7005^1^^13^You must have a valid DUZ
 ;;^UTILITY(U,$J,.84,7005,2,0)
 ;;=^^1^1^3050128^^^
 ;;^UTILITY(U,$J,.84,7005,2,1,0)
 ;;=You must have a valid DUZ!
 ;;^UTILITY(U,$J,.84,7005,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7005,5,1,0)
 ;;=DII
 ;;^UTILITY(U,$J,.84,8001,0)
 ;;=8001^2^^5
 ;;^UTILITY(U,$J,.84,8001,1,0)
 ;;=^^1^1^2941118^^^^
 ;;^UTILITY(U,$J,.84,8001,1,1,0)
 ;;=Prompt for name of compiled template or cross-reference routine.
 ;;^UTILITY(U,$J,.84,8001,2,0)
 ;;=^^1^1^2941118^^
 ;;^UTILITY(U,$J,.84,8001,2,1,0)
 ;;=Routine Name
 ;;^UTILITY(U,$J,.84,8001,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,8001,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8001,5,2,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8001,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8002,0)
 ;;=8002^2^^5
 ;;^UTILITY(U,$J,.84,8002,1,0)
 ;;=^^1^1^2940426^^^^
 ;;^UTILITY(U,$J,.84,8002,1,1,0)
 ;;=Prompt for including computed fields and/or IEN in CAPTIONED output.
 ;;^UTILITY(U,$J,.84,8002,2,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,8002,2,1,0)
 ;;=Include COMPUTED fields
 ;;^UTILITY(U,$J,.84,8003,0)
 ;;=8003^2^y^5
 ;;^UTILITY(U,$J,.84,8003,1,0)
 ;;=^^2^2^2931101^^^^
 ;;^UTILITY(U,$J,.84,8003,1,1,0)
 ;;=Used in Print to display sort criteria in heading--when BY(0) contains
 ;;^UTILITY(U,$J,.84,8003,1,2,0)
 ;;=a search template name.
 ;;^UTILITY(U,$J,.84,8003,2,0)
 ;;=^^1^1^2931102^
 ;;^UTILITY(U,$J,.84,8003,2,1,0)
 ;;=Records from list on |1| search template
 ;;^UTILITY(U,$J,.84,8003,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8003,3,1,0)
 ;;=1^Name of search template.
 ;;^UTILITY(U,$J,.84,8003,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8003,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8003,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8004,0)
 ;;=8004^2^y^5
 ;;^UTILITY(U,$J,.84,8004,1,0)
 ;;=^^3^3^2931101^
 ;;^UTILITY(U,$J,.84,8004,1,1,0)
 ;;=Used in Print to display sort criteria in heading--when BY(0) contains
 ;;^UTILITY(U,$J,.84,8004,1,2,0)
 ;;=the global reference for a cross-reference or for another global
 ;;^UTILITY(U,$J,.84,8004,1,3,0)
 ;;=containing a list of record numbers.
 ;;^UTILITY(U,$J,.84,8004,2,0)
 ;;=^^1^1^2931101^^
 ;;^UTILITY(U,$J,.84,8004,2,1,0)
 ;;=Sort using |1|
 ;;^UTILITY(U,$J,.84,8004,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8004,3,1,0)
 ;;=1^Global reference passed in BY(0)
 ;;^UTILITY(U,$J,.84,8004,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8004,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8004,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8005,0)
 ;;=8005^2^y^5
 ;;^UTILITY(U,$J,.84,8005,1,0)
 ;;=^^4^4^2940908^^
 ;;^UTILITY(U,$J,.84,8005,1,1,0)
 ;;=At the heading prompt during the FileMan print, the user can enter flags
 ;;^UTILITY(U,$J,.84,8005,1,2,0)
 ;;=to either suppress printing of the header if there are no records to
 ;;^UTILITY(U,$J,.84,8005,1,3,0)
 ;;=print, or to cause the search/sort criteria to print in the header.  This
 ;;^UTILITY(U,$J,.84,8005,1,4,0)
 ;;=is the help prompt.
 ;;^UTILITY(U,$J,.84,8005,2,0)
 ;;=^^11^11^2940908^^^^
 ;;^UTILITY(U,$J,.84,8005,2,1,0)
 ;;=There are two different options:
 ;;^UTILITY(U,$J,.84,8005,2,2,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8005,2,3,0)
 ;;=1) Accept the default heading or enter a custom heading.
 ;;^UTILITY(U,$J,.84,8005,2,4,0)
 ;;= For no heading at all, type @.
 ;;^UTILITY(U,$J,.84,8005,2,5,0)
 ;;= To use a Print Template for the heading, type [TEMPLATE NAME].
 ;;^UTILITY(U,$J,.84,8005,2,6,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8005,2,7,0)
 ;;=2) Replace the default heading with:
 ;;^UTILITY(U,$J,.84,8005,2,8,0)
 ;;= S  to Suppress the |1|, and/or
 ;;^UTILITY(U,$J,.84,8005,2,9,0)
 ;;= C  to print |2| Criteria in the heading.
 ;;^UTILITY(U,$J,.84,8005,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8005,2,11,0)
 ;;=If S and/or C is entered, the heading prompt will re-appear.
 ;;^UTILITY(U,$J,.84,8005,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,8005,3,1,0)
 ;;=1^Text from either entry #8006 or #8007, depending on whether we're coming from the search or print.
 ;;^UTILITY(U,$J,.84,8005,3,2,0)
 ;;=2^Text from either entry #8038 or #8037, depending on whether we're coming from the search or print.
 ;;^UTILITY(U,$J,.84,8005,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8005,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8005,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8006,0)
 ;;=8006^2^^5
 ;;^UTILITY(U,$J,.84,8006,1,0)
 ;;=^^1^1^2940526^^^^
 ;;^UTILITY(U,$J,.84,8006,1,1,0)
 ;;=Inserted as a parameter to #8005 when called from the SEARCH Option.
 ;;^UTILITY(U,$J,.84,8006,2,0)
 ;;=^^1^1^2940526^^
 ;;^UTILITY(U,$J,.84,8006,2,1,0)
 ;;=Number of Matches from the search
 ;;^UTILITY(U,$J,.84,8006,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8006,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8006,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8007,0)
 ;;=8007^2^^5
 ;;^UTILITY(U,$J,.84,8007,1,0)
 ;;=^^1^1^2940526^^^^
 ;;^UTILITY(U,$J,.84,8007,1,1,0)
 ;;=Inserted as a parameter to #8005 when called from the PRINT Option.
 ;;^UTILITY(U,$J,.84,8007,2,0)
 ;;=^^1^1^2940526^
 ;;^UTILITY(U,$J,.84,8007,2,1,0)
 ;;=heading when there are no records to print
 ;;^UTILITY(U,$J,.84,8007,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8007,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8007,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8008,0)
 ;;=8008^2^^5
 ;;^UTILITY(U,$J,.84,8008,1,0)
 ;;=^^4^4^2940908^
 ;;^UTILITY(U,$J,.84,8008,1,1,0)
 ;;=At the HEADING prompt during the FileMan print, the user can enter flags
 ;;^UTILITY(U,$J,.84,8008,1,2,0)
 ;;=to either suppress printing of the header if there are no records to
 ;;^UTILITY(U,$J,.84,8008,1,3,0)
 ;;=print, or to cause the sort criteria to print in the header.  This is the
 ;;^UTILITY(U,$J,.84,8008,1,4,0)
 ;;=prompt for the reader call.
 ;;^UTILITY(U,$J,.84,8008,2,0)
 ;;=^^1^1^2940909^

DINIT00G
DINIT00G ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;21FEB2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8008,2,1,0)
 ;;=Heading (S/C)
 ;;^UTILITY(U,$J,.84,8008,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8008,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8008,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8004.1,0)
 ;;=8004.1^3^^13^HELP FOR ONE SEARCH CRITERION ('A')
 ;;^UTILITY(U,$J,.84,8004.1,2,0)
 ;;=^.844^3^3^3050131^^
 ;;^UTILITY(U,$J,.84,8004.1,2,1,0)
 ;;=To search on the condition you have just typed, hit 'Enter'.
 ;;^UTILITY(U,$J,.84,8004.1,2,2,0)
 ;;=To search for the NEGATIVE of the condition,
 ;;^UTILITY(U,$J,.84,8004.1,2,3,0)
 ;;=type "'A".  The "'" character means "negation".
 ;;^UTILITY(U,$J,.84,8004.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8004.1,5,1,0)
 ;;=DIS0^BAD+1
 ;;^UTILITY(U,$J,.84,8004.2,0)
 ;;=8004.2^3^^13^HELP AFTER 'IF: ' FOR MULTIPLE CONDITIONS
 ;;^UTILITY(U,$J,.84,8004.2,2,0)
 ;;=^^3^3^3050131^
 ;;^UTILITY(U,$J,.84,8004.2,2,1,0)
 ;;=To 'AND' Condition 'A' with Condition 'B', type 'A&B'.
 ;;^UTILITY(U,$J,.84,8004.2,2,2,0)
 ;;=To 'OR' Condition 'A' with Condition 'B', type 'A',
 ;;^UTILITY(U,$J,.84,8004.2,2,3,0)
 ;;=and then type 'B' at the next "OR:" prompt.
 ;;^UTILITY(U,$J,.84,8004.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8004.2,5,1,0)
 ;;=DIS0^BAD+1
 ;;^UTILITY(U,$J,.84,8009,0)
 ;;=8009^2^^5
 ;;^UTILITY(U,$J,.84,8009,1,0)
 ;;=^^2^2^2940908^^^^
 ;;^UTILITY(U,$J,.84,8009,1,1,0)
 ;;=This is the normal help message given if user enters a question mark when
 ;;^UTILITY(U,$J,.84,8009,1,2,0)
 ;;=being prompted for the HEADER during a FileMan print.
 ;;^UTILITY(U,$J,.84,8009,2,0)
 ;;=^^3^3^2940908^
 ;;^UTILITY(U,$J,.84,8009,2,1,0)
 ;;=Accept default heading or enter a custom heading.
 ;;^UTILITY(U,$J,.84,8009,2,2,0)
 ;;=For no heading at all, type @.
 ;;^UTILITY(U,$J,.84,8009,2,3,0)
 ;;=To use a Print Template for the heading, type [TEMPLATE NAME].
 ;;^UTILITY(U,$J,.84,8009,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8009,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8009,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8010,0)
 ;;=8010^2^y^5
 ;;^UTILITY(U,$J,.84,8010,1,0)
 ;;=^^1^1^2931102^^^^
 ;;^UTILITY(U,$J,.84,8010,1,1,0)
 ;;=Print dialog coming from routine ^DIP31.
 ;;^UTILITY(U,$J,.84,8010,2,0)
 ;;=^^1^1^2931102^
 ;;^UTILITY(U,$J,.84,8010,2,1,0)
 ;;=** Suppress the |1|.
 ;;^UTILITY(U,$J,.84,8010,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8010,3,1,0)
 ;;=1^Text from either entry #8006 or #8007, depending on whether it's called from the SEARCH or PRINT Options.
 ;;^UTILITY(U,$J,.84,8010,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8010,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8010,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8011,0)
 ;;=8011^2^y^5
 ;;^UTILITY(U,$J,.84,8011,1,0)
 ;;=^^1^1^2940526^^^^
 ;;^UTILITY(U,$J,.84,8011,1,1,0)
 ;;=Dialog coming from routine ^DIP31
 ;;^UTILITY(U,$J,.84,8011,2,0)
 ;;=^^1^1^2940526^
 ;;^UTILITY(U,$J,.84,8011,2,1,0)
 ;;=** print |1| Criteria in heading.
 ;;^UTILITY(U,$J,.84,8011,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8011,3,1,0)
 ;;=1^The word SORT or SEARCH, depending on which option we're coming from.
 ;;^UTILITY(U,$J,.84,8011,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8011,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8011,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8012,0)
 ;;=8012^2^^5
 ;;^UTILITY(U,$J,.84,8012,1,0)
 ;;=^^2^2^2931102^^^
 ;;^UTILITY(U,$J,.84,8012,1,1,0)
 ;;=The word HEADING to be used in the prompt for the heading from the FileMan
 ;;^UTILITY(U,$J,.84,8012,1,2,0)
 ;;=PRINT option.
 ;;^UTILITY(U,$J,.84,8012,2,0)
 ;;=^^1^1^2931102^
 ;;^UTILITY(U,$J,.84,8012,2,1,0)
 ;;=Heading
 ;;^UTILITY(U,$J,.84,8012,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8012,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8012,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8013,0)
 ;;=8013^2^^5
 ;;^UTILITY(U,$J,.84,8013,1,0)
 ;;=^^3^3^2931105^^
 ;;^UTILITY(U,$J,.84,8013,1,1,0)
 ;;=The DD for the file of files is not completely FileMan compatible.  This
 ;;^UTILITY(U,$J,.84,8013,1,2,0)
 ;;=is the field name prompt for the POST-SELECTION ACTION field on the file
 ;;^UTILITY(U,$J,.84,8013,1,3,0)
 ;;=of files.  Prompt appears when file attributes.
 ;;^UTILITY(U,$J,.84,8013,2,0)
 ;;=^^1^1^2931105^^
 ;;^UTILITY(U,$J,.84,8013,2,1,0)
 ;;=POST-SELECTION ACTION
 ;;^UTILITY(U,$J,.84,8013,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8013,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8014,0)
 ;;=8014^2^^5
 ;;^UTILITY(U,$J,.84,8014,1,0)
 ;;=^^3^3^2931105^
 ;;^UTILITY(U,$J,.84,8014,1,1,0)
 ;;=The DD for the file of files is not completely FileMan compatible.  This
 ;;^UTILITY(U,$J,.84,8014,1,2,0)
 ;;=is the field name prompt for the LOOK-UP PROGRAM field on the file
 ;;^UTILITY(U,$J,.84,8014,1,3,0)
 ;;=of files.  Prompt appears when file attributes are edited.
 ;;^UTILITY(U,$J,.84,8014,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,8014,2,1,0)
 ;;=LOOK-UP PROGRAM
 ;;^UTILITY(U,$J,.84,8014,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8014,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8015,0)
 ;;=8015^2^^5
 ;;^UTILITY(U,$J,.84,8015,1,0)
 ;;=^^2^2^2931105^
 ;;^UTILITY(U,$J,.84,8015,1,1,0)
 ;;=Standard prompt to verify to the user that they just deleted something
 ;;^UTILITY(U,$J,.84,8015,1,2,0)
 ;;=with the "@".
 ;;^UTILITY(U,$J,.84,8015,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,8015,2,1,0)
 ;;=Deleted.
 ;;^UTILITY(U,$J,.84,8015,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8015,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8016,0)
 ;;=8016^2^y^5
 ;;^UTILITY(U,$J,.84,8016,1,0)
 ;;=^^2^2^2931105^^^^
 ;;^UTILITY(U,$J,.84,8016,1,1,0)
 ;;=Called after performing routine existence test to tell user that routine
 ;;^UTILITY(U,$J,.84,8016,1,2,0)
 ;;=is already in their directory.
 ;;^UTILITY(U,$J,.84,8016,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,8016,2,1,0)
 ;;=Note that |1| is already in the routine directory.
 ;;^UTILITY(U,$J,.84,8016,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8016,3,1,0)
 ;;=1^Name of the routine.
 ;;^UTILITY(U,$J,.84,8016,5,0)
 ;;=^.841^4^4
 ;;^UTILITY(U,$J,.84,8016,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8016,5,2,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8016,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8016,5,4,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8017,0)
 ;;=8017^2^^5
 ;;^UTILITY(U,$J,.84,8017,1,0)
 ;;=^^2^2^2931105^
 ;;^UTILITY(U,$J,.84,8017,1,1,0)
 ;;=Message warning user that a routine does not exist in their routine
 ;;^UTILITY(U,$J,.84,8017,1,2,0)
 ;;=directory.
 ;;^UTILITY(U,$J,.84,8017,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,8017,2,1,0)
 ;;=This routine does not exist in the routine directory.
 ;;^UTILITY(U,$J,.84,8017,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8017,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8018,0)
 ;;=8018^2^y^5
 ;;^UTILITY(U,$J,.84,8018,1,0)
 ;;=^^2^2^2931105^
 ;;^UTILITY(U,$J,.84,8018,1,1,0)
 ;;=Prompt showing the user a routine name previously used for compiled
 ;;^UTILITY(U,$J,.84,8018,1,2,0)
 ;;=routines (input templates, print templates, cross-references).
 ;;^UTILITY(U,$J,.84,8018,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,8018,2,1,0)
 ;;=Previously compiled under routine name |1|.
 ;;^UTILITY(U,$J,.84,8018,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8018,3,1,0)
 ;;=1^Routine name from "DIKOLD" or "ROUOLD" nodes in templates or DD for cross-references.
 ;;^UTILITY(U,$J,.84,8018,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8018,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8019,0)
 ;;=8019^2^^5
 ;;^UTILITY(U,$J,.84,8019,1,0)
 ;;=^^3^3^2931105^^
 ;;^UTILITY(U,$J,.84,8019,1,1,0)
 ;;=The DD for the file of files is not completely FileMan compatible.  This
 ;;^UTILITY(U,$J,.84,8019,1,2,0)
 ;;=is the field name prompt for the CROSS-REFERENCE ROUTINE field on the file
 ;;^UTILITY(U,$J,.84,8019,1,3,0)
 ;;=of files.  Prompt appears when file attributes are edited.

DINIT00H
DINIT00H ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8019,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,8019,2,1,0)
 ;;=CROSS-REFERENCE ROUTINE
 ;;^UTILITY(U,$J,.84,8019,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8019,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8020,0)
 ;;=8020^2^^5
 ;;^UTILITY(U,$J,.84,8020,1,0)
 ;;=^^2^2^2931110^^^^
 ;;^UTILITY(U,$J,.84,8020,1,1,0)
 ;;=This prompt asks the user whether they are ready to compile, when
 ;;^UTILITY(U,$J,.84,8020,1,2,0)
 ;;=compiling TEMPLATES or CROSS-REFERENCES.
 ;;^UTILITY(U,$J,.84,8020,2,0)
 ;;=^^1^1^2931110^^
 ;;^UTILITY(U,$J,.84,8020,2,1,0)
 ;;=Should the compilation run now
 ;;^UTILITY(U,$J,.84,8020,5,0)
 ;;=^.841^4^4
 ;;^UTILITY(U,$J,.84,8020,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8020,5,2,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8020,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8020,5,4,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8021,0)
 ;;=8021^2^^5
 ;;^UTILITY(U,$J,.84,8021,1,0)
 ;;=^^3^3^2931109^
 ;;^UTILITY(U,$J,.84,8021,1,1,0)
 ;;=Message from editing the CROSS-REFERENCE ROUTINE.  If this field is
 ;;^UTILITY(U,$J,.84,8021,1,2,0)
 ;;=deleted, the message notifies the user that the compiled routines will no
 ;;^UTILITY(U,$J,.84,8021,1,3,0)
 ;;=longer be used for re-indexing.
 ;;^UTILITY(U,$J,.84,8021,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,8021,2,1,0)
 ;;=The compiled routines will no longer be used for re-indexing.
 ;;^UTILITY(U,$J,.84,8021,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8021,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,8022,0)
 ;;=8022^2^^5
 ;;^UTILITY(U,$J,.84,8022,1,0)
 ;;=^^2^2^2931110^^^
 ;;^UTILITY(U,$J,.84,8022,1,1,0)
 ;;=Used when compiling PRINT templates, this is the prompt for the margin
 ;;^UTILITY(U,$J,.84,8022,1,2,0)
 ;;=width to be used for the printed report.
 ;;^UTILITY(U,$J,.84,8022,2,0)
 ;;=^^1^1^2931112^
 ;;^UTILITY(U,$J,.84,8022,2,1,0)
 ;;=Margin Width for output
 ;;^UTILITY(U,$J,.84,8022,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8022,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8023,0)
 ;;=8023^2^^5
 ;;^UTILITY(U,$J,.84,8023,1,0)
 ;;=^^2^2^2931110^^^^
 ;;^UTILITY(U,$J,.84,8023,1,1,0)
 ;;=This is the help prompt for MARGIN WIDTH FOR OUTPUT, used when compiling
 ;;^UTILITY(U,$J,.84,8023,1,2,0)
 ;;=PRINT templates.
 ;;^UTILITY(U,$J,.84,8023,2,0)
 ;;=^^2^2^2931110^^^^
 ;;^UTILITY(U,$J,.84,8023,2,1,0)
 ;;=Type a number from 19 to 255.  This is the number of columns
 ;;^UTILITY(U,$J,.84,8023,2,2,0)
 ;;=on the report
 ;;^UTILITY(U,$J,.84,8023,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8023,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8024,0)
 ;;=8024^2^y^5
 ;;^UTILITY(U,$J,.84,8024,1,0)
 ;;=^^1^1^2931110^^^^
 ;;^UTILITY(U,$J,.84,8024,1,1,0)
 ;;=This is the text that tells the user they are now compiling routines.
 ;;^UTILITY(U,$J,.84,8024,2,0)
 ;;=^^1^1^2931110^^^^
 ;;^UTILITY(U,$J,.84,8024,2,1,0)
 ;;=Compiling |1| |2| of File |3|.
 ;;^UTILITY(U,$J,.84,8024,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,8024,3,1,0)
 ;;=1^Name of template, if compiling templates.
 ;;^UTILITY(U,$J,.84,8024,3,2,0)
 ;;=2^The words "print template", "cross-references", etc. (i.e., what is being compiled).
 ;;^UTILITY(U,$J,.84,8024,3,3,0)
 ;;=3^File name
 ;;^UTILITY(U,$J,.84,8024,5,0)
 ;;=^.841^6^6
 ;;^UTILITY(U,$J,.84,8024,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8024,5,2,0)
 ;;=DIPZ^EN
 ;;^UTILITY(U,$J,.84,8024,5,3,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8024,5,4,0)
 ;;=DIEZ^EN
 ;;^UTILITY(U,$J,.84,8024,5,5,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8024,5,6,0)
 ;;=DIKZ^EN
 ;;^UTILITY(U,$J,.84,8025,0)
 ;;=8025^2^y^5
 ;;^UTILITY(U,$J,.84,8025,1,0)
 ;;=^^2^2^2931110^^
 ;;^UTILITY(U,$J,.84,8025,1,1,0)
 ;;=Notify user that a routine has been filed.  Used during compilation of
 ;;^UTILITY(U,$J,.84,8025,1,2,0)
 ;;=TEMPLATES and CROSS-REFERENCES.
 ;;^UTILITY(U,$J,.84,8025,2,0)
 ;;=^^1^1^2931110^^^
 ;;^UTILITY(U,$J,.84,8025,2,1,0)
 ;;='|1|' ROUTINE FILED.
 ;;^UTILITY(U,$J,.84,8025,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8025,3,1,0)
 ;;=1^Routine name
 ;;^UTILITY(U,$J,.84,8025,5,0)
 ;;=^.841^8^7
 ;;^UTILITY(U,$J,.84,8025,5,1,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8025,5,2,0)
 ;;=DIKZ^EN
 ;;^UTILITY(U,$J,.84,8025,5,3,0)
 ;;=DIOZ^ENCU
 ;;^UTILITY(U,$J,.84,8025,5,5,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8025,5,6,0)
 ;;=DIPZ^EN
 ;;^UTILITY(U,$J,.84,8025,5,7,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8025,5,8,0)
 ;;=DIEZ^EN
 ;;^UTILITY(U,$J,.84,8026,0)
 ;;=8026^2^y^5
 ;;^UTILITY(U,$J,.84,8026,1,0)
 ;;=^^2^2^2931110^^^
 ;;^UTILITY(U,$J,.84,8026,1,1,0)
 ;;=Used to notify the user that templates or cross-references have been
 ;;^UTILITY(U,$J,.84,8026,1,2,0)
 ;;=UNCOMPILED.
 ;;^UTILITY(U,$J,.84,8026,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8026,2,1,0)
 ;;=|1| now uncompiled.
 ;;^UTILITY(U,$J,.84,8026,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8026,3,1,0)
 ;;=1^Contains the word 'TEMPLATE' or 'CROSS-REFERENCES'
 ;;^UTILITY(U,$J,.84,8026,5,0)
 ;;=^.841^6^6
 ;;^UTILITY(U,$J,.84,8026,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8026,5,2,0)
 ;;=DIPZ^EN
 ;;^UTILITY(U,$J,.84,8026,5,3,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8026,5,4,0)
 ;;=DIEZ^EN
 ;;^UTILITY(U,$J,.84,8026,5,5,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8026,5,6,0)
 ;;=DIKZ^EN
 ;;^UTILITY(U,$J,.84,8027,0)
 ;;=8027^2^^5
 ;;^UTILITY(U,$J,.84,8027,1,0)
 ;;=^^2^2^2931110^^^
 ;;^UTILITY(U,$J,.84,8027,1,1,0)
 ;;=Prompt for maximum routine size, used when compiling templates or
 ;;^UTILITY(U,$J,.84,8027,1,2,0)
 ;;=cross-references.
 ;;^UTILITY(U,$J,.84,8027,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8027,2,1,0)
 ;;=Maximum routine size on this computer (in bytes).
 ;;^UTILITY(U,$J,.84,8027,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,8027,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8027,5,2,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8027,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8028,0)
 ;;=8028^2^y^5
 ;;^UTILITY(U,$J,.84,8028,1,0)
 ;;=^^2^2^2931110^^^^
 ;;^UTILITY(U,$J,.84,8028,1,1,0)
 ;;=Extended dialogue for asking user whether they wish to UNCOMPILE
 ;;^UTILITY(U,$J,.84,8028,1,2,0)
 ;;=a previously compiled template or cross-references.
 ;;^UTILITY(U,$J,.84,8028,2,0)
 ;;=^^2^2^2931110^
 ;;^UTILITY(U,$J,.84,8028,2,1,0)
 ;;= |1| currently compiled under namespace |2|.
 ;;^UTILITY(U,$J,.84,8028,2,2,0)
 ;;=UNCOMPILE the |1|
 ;;^UTILITY(U,$J,.84,8028,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,8028,3,1,0)
 ;;=1^Contains the word 'TEMPLATE' or 'CROSS-REFERENCES'
 ;;^UTILITY(U,$J,.84,8028,3,2,0)
 ;;=2^Routine name under which templates were previously compiled.
 ;;^UTILITY(U,$J,.84,8028,5,0)
 ;;=^.841^4^4
 ;;^UTILITY(U,$J,.84,8028,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8028,5,2,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8028,5,3,0)
 ;;=DIKZ^ 

DINIT00I
DINIT00I ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8028,5,4,0)
 ;;=DIOZ^ENCU
 ;;^UTILITY(U,$J,.84,8029,0)
 ;;=8029^2^y^5
 ;;^UTILITY(U,$J,.84,8029,1,0)
 ;;=^^2^2^2931110^
 ;;^UTILITY(U,$J,.84,8029,1,1,0)
 ;;=Extended dialogue for asking user whether they wish to COMPILE a
 ;;^UTILITY(U,$J,.84,8029,1,2,0)
 ;;=template or cross-references.
 ;;^UTILITY(U,$J,.84,8029,2,0)
 ;;=^^2^2^2931110^
 ;;^UTILITY(U,$J,.84,8029,2,1,0)
 ;;= |1| not currently compiled.
 ;;^UTILITY(U,$J,.84,8029,2,2,0)
 ;;=COMPILE the |1|
 ;;^UTILITY(U,$J,.84,8029,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8029,3,1,0)
 ;;=1^Contains the word 'TEMPLATE' or 'CROSS-REFERENCES'
 ;;^UTILITY(U,$J,.84,8029,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8029,5,1,0)
 ;;=DIOZ^ENCU
 ;;^UTILITY(U,$J,.84,8030,0)
 ;;=8030^2^y^5
 ;;^UTILITY(U,$J,.84,8030,1,0)
 ;;=^^2^2^2931110^^^^
 ;;^UTILITY(U,$J,.84,8030,1,1,0)
 ;;=Warning to user that SORT/PRINT templates are uneditable because the PRINT
 ;;^UTILITY(U,$J,.84,8030,1,2,0)
 ;;=TEMPLATE field on the SORT TEMPLATE has linked it with a print template.
 ;;^UTILITY(U,$J,.84,8030,2,0)
 ;;=^^7^7^2931112^
 ;;^UTILITY(U,$J,.84,8030,2,1,0)
 ;;=Because this Sort Template has been linked with the Print Template
 ;;^UTILITY(U,$J,.84,8030,2,2,0)
 ;;=|1|, neither template can be edited from this option.
 ;;^UTILITY(U,$J,.84,8030,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8030,2,4,0)
 ;;=To edit the templates, first use the FileMan TEMPLATE EDIT
 ;;^UTILITY(U,$J,.84,8030,2,5,0)
 ;;=option to edit the Sort Template, and delete the field called
 ;;^UTILITY(U,$J,.84,8030,2,6,0)
 ;;='PRINT TEMPLATE'.  Then, the templates can be edited from
 ;;^UTILITY(U,$J,.84,8030,2,7,0)
 ;;=the PRINT option.
 ;;^UTILITY(U,$J,.84,8030,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8030,3,1,0)
 ;;=1^Name of associated PRINT TEMPLATE.
 ;;^UTILITY(U,$J,.84,8030,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8030,5,1,0)
 ;;=DIP^EN
 ;;^UTILITY(U,$J,.84,8031,0)
 ;;=8031^2^^5
 ;;^UTILITY(U,$J,.84,8031,1,0)
 ;;=^^1^1^2931110^^
 ;;^UTILITY(U,$J,.84,8031,1,1,0)
 ;;=Warning that compiled routine names may get too long.
 ;;^UTILITY(U,$J,.84,8031,2,0)
 ;;=^^3^3^2931110^
 ;;^UTILITY(U,$J,.84,8031,2,1,0)
 ;;=WARNING!!  Since the namespace for this routine is so long, use the
 ;;^UTILITY(U,$J,.84,8031,2,2,0)
 ;;=largest possible size to compile these routines.  Otherwise, FileMan may
 ;;^UTILITY(U,$J,.84,8031,2,3,0)
 ;;=run out of routine names.
 ;;^UTILITY(U,$J,.84,8031,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,8031,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8031,5,2,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8031,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8032,0)
 ;;=8032^2^^5
 ;;^UTILITY(U,$J,.84,8032,1,0)
 ;;=^^1^1^2930702^
 ;;^UTILITY(U,$J,.84,8032,1,1,0)
 ;;=Words SEARCH TEMPLATE
 ;;^UTILITY(U,$J,.84,8032,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8032,2,1,0)
 ;;=Search Template
 ;;^UTILITY(U,$J,.84,8033,0)
 ;;=8033^2^^5
 ;;^UTILITY(U,$J,.84,8033,1,0)
 ;;=^^1^1^2930701^^
 ;;^UTILITY(U,$J,.84,8033,1,1,0)
 ;;=the words INPUT TEMPLATE to use in any FileMan dialog.
 ;;^UTILITY(U,$J,.84,8033,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8033,2,1,0)
 ;;=Input Template
 ;;^UTILITY(U,$J,.84,8033,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8033,5,1,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,8033,5,2,0)
 ;;=DIEZ^EN
 ;;^UTILITY(U,$J,.84,8034,0)
 ;;=8034^2^^5
 ;;^UTILITY(U,$J,.84,8034,1,0)
 ;;=^^1^1^2930701^^
 ;;^UTILITY(U,$J,.84,8034,1,1,0)
 ;;=The words PRINT TEMPLATE to use in any FileMan dialog.
 ;;^UTILITY(U,$J,.84,8034,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8034,2,1,0)
 ;;=Print Template
 ;;^UTILITY(U,$J,.84,8034,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8034,5,1,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,8034,5,2,0)
 ;;=DIPZ^EN
 ;;^UTILITY(U,$J,.84,8035,0)
 ;;=8035^2^^5
 ;;^UTILITY(U,$J,.84,8035,1,0)
 ;;=^^1^1^2930701^
 ;;^UTILITY(U,$J,.84,8035,1,1,0)
 ;;=The words SORT TEMPLATE to use in any FileMan dialog.
 ;;^UTILITY(U,$J,.84,8035,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8035,2,1,0)
 ;;=Sort Template
 ;;^UTILITY(U,$J,.84,8035,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8035,5,1,0)
 ;;=DIOZ^ENCU
 ;;^UTILITY(U,$J,.84,8036,0)
 ;;=8036^2^^5
 ;;^UTILITY(U,$J,.84,8036,1,0)
 ;;=^^1^1^2930702^^
 ;;^UTILITY(U,$J,.84,8036,1,1,0)
 ;;=The words CROSS-REFERENCE(S) to use in any FileMan Dialog.
 ;;^UTILITY(U,$J,.84,8036,2,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8036,2,1,0)
 ;;=Cross-Reference(s)
 ;;^UTILITY(U,$J,.84,8036,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8036,5,1,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,8036,5,2,0)
 ;;=DIKZ^EN
 ;;^UTILITY(U,$J,.84,8037,0)
 ;;=8037^2^^5
 ;;^UTILITY(U,$J,.84,8037,1,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8037,1,1,0)
 ;;=The word SORT to use in any FileMan dialog.
 ;;^UTILITY(U,$J,.84,8037,2,0)
 ;;=^^1^1^2940526^
 ;;^UTILITY(U,$J,.84,8037,2,1,0)
 ;;=sort
 ;;^UTILITY(U,$J,.84,8037,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8037,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8038,0)
 ;;=8038^2^^5
 ;;^UTILITY(U,$J,.84,8038,1,0)
 ;;=^^1^1^2931110^
 ;;^UTILITY(U,$J,.84,8038,1,1,0)
 ;;=The word SEARCH to use in any FileMan dialog.
 ;;^UTILITY(U,$J,.84,8038,2,0)
 ;;=^^1^1^2940526^
 ;;^UTILITY(U,$J,.84,8038,2,1,0)
 ;;=search
 ;;^UTILITY(U,$J,.84,8038,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8038,5,1,0)
 ;;=DIP^EN1
 ;;^UTILITY(U,$J,.84,8038,5,2,0)
 ;;=DIS^ENS
 ;;^UTILITY(U,$J,.84,8040,0)
 ;;=8040^2^^5
 ;;^UTILITY(U,$J,.84,8040,1,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,8040,1,1,0)
 ;;=Advice for the Yes/No question
 ;;^UTILITY(U,$J,.84,8040,2,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,8040,2,1,0)
 ;;=Answer with 'Yes' or 'No'
 ;;^UTILITY(U,$J,.84,8041,0)
 ;;=8041^2^^5
 ;;^UTILITY(U,$J,.84,8041,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8041,2,1,0)
 ;;=This is a required response. Enter '^' to exit
 ;;^UTILITY(U,$J,.84,8042,0)
 ;;=8042^2^y^5
 ;;^UTILITY(U,$J,.84,8042,1,0)
 ;;=^^2^2^2940315^^^^
 ;;^UTILITY(U,$J,.84,8042,1,1,0)
 ;;=This 'Select' prompt may be used for dialogs with filenames.
 ;;^UTILITY(U,$J,.84,8042,1,2,0)
 ;;=Note: Dialog will be used with $$EZBLD^DIALOG call, only one text line!!
 ;;^UTILITY(U,$J,.84,8042,2,0)
 ;;=1
 ;;^UTILITY(U,$J,.84,8042,2,1,0)
 ;;=Select |1|: 
 ;;^UTILITY(U,$J,.84,8042,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8042,3,1,0)
 ;;=1^Name of the file
 ;;^UTILITY(U,$J,.84,8043,0)
 ;;=8043^2^^5
 ;;^UTILITY(U,$J,.84,8043,1,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8043,1,1,0)
 ;;=Used for date time input to the reader.
 ;;^UTILITY(U,$J,.84,8043,2,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8043,2,1,0)
 ;;= and time
 ;;^UTILITY(U,$J,.84,8044,0)
 ;;=8044^2^^5

DINIT00J
DINIT00J ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;12:15 PM  6 Nov 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8044,1,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8044,1,1,0)
 ;;=Used for time input to the reader.
 ;;^UTILITY(U,$J,.84,8044,2,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8044,2,1,0)
 ;;= and optional time
 ;;^UTILITY(U,$J,.84,8045,0)
 ;;=8045^2^y^5
 ;;^UTILITY(U,$J,.84,8045,1,0)
 ;;=^^3^3^2940310^^^^
 ;;^UTILITY(U,$J,.84,8045,1,1,0)
 ;;=This prompt is used by the reader when he is building prompts for
 ;;^UTILITY(U,$J,.84,8045,1,2,0)
 ;;=Set-of-codes type data.
 ;;^UTILITY(U,$J,.84,8045,1,3,0)
 ;;=Note: Dialog will be used with $$EZBLD^DIALOG call, only one text line!!
 ;;^UTILITY(U,$J,.84,8045,2,0)
 ;;=^^1^1^2940310^^^
 ;;^UTILITY(U,$J,.84,8045,2,1,0)
 ;;=Enter |1|: 
 ;;^UTILITY(U,$J,.84,8045,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8045,3,1,0)
 ;;=1^Default Prompt from DIR("A")
 ;;^UTILITY(U,$J,.84,8046,0)
 ;;=8046^2^^5
 ;;^UTILITY(U,$J,.84,8046,1,0)
 ;;=^^1^1^2960124^^
 ;;^UTILITY(U,$J,.84,8046,1,1,0)
 ;;=Reader prompt for choices from a list
 ;;^UTILITY(U,$J,.84,8046,2,0)
 ;;=^^1^1^2960124^^^
 ;;^UTILITY(U,$J,.84,8046,2,1,0)
 ;;=Select one of the following:
 ;;^UTILITY(U,$J,.84,8047,0)
 ;;=8047^2^^5
 ;;^UTILITY(U,$J,.84,8047,1,0)
 ;;=^^1^1^2940315^^^^
 ;;^UTILITY(U,$J,.84,8047,1,1,0)
 ;;=Part one of the Replace with prompt (including spaces).
 ;;^UTILITY(U,$J,.84,8047,2,0)
 ;;=^^1^1^2940315^^^^
 ;;^UTILITY(U,$J,.84,8047,2,1,0)
 ;;=  Replace 
 ;;^UTILITY(U,$J,.84,8048,0)
 ;;=8048^2^^5
 ;;^UTILITY(U,$J,.84,8048,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8048,1,1,0)
 ;;=Part two of the Replace With editor (including spaces).
 ;;^UTILITY(U,$J,.84,8048,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8048,2,1,0)
 ;;= With 
 ;;^UTILITY(U,$J,.84,8050,0)
 ;;=8050^2^^5
 ;;^UTILITY(U,$J,.84,8050,1,0)
 ;;=^^2^2^2971125^
 ;;^UTILITY(U,$J,.84,8050,1,1,0)
 ;;=Print the word 'Another' when prompting user to select another entry in
 ;;^UTILITY(U,$J,.84,8050,1,2,0)
 ;;=Inquire mode.
 ;;^UTILITY(U,$J,.84,8050,2,0)
 ;;=^^1^1^2971125^
 ;;^UTILITY(U,$J,.84,8050,2,1,0)
 ;;=Another 
 ;;^UTILITY(U,$J,.84,8050,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8050,5,1,0)
 ;;=DIC11^GETPRMT
 ;;^UTILITY(U,$J,.84,8051,0)
 ;;=8051^2^^5
 ;;^UTILITY(U,$J,.84,8051,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8051,1,1,0)
 ;;=Reader prompt
 ;;^UTILITY(U,$J,.84,8051,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8051,2,1,0)
 ;;=Enter response: 
 ;;^UTILITY(U,$J,.84,8052,0)
 ;;=8052^2^^5
 ;;^UTILITY(U,$J,.84,8052,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8052,1,1,0)
 ;;=Prompt for the reader
 ;;^UTILITY(U,$J,.84,8052,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8052,2,1,0)
 ;;=Enter Yes or No: 
 ;;^UTILITY(U,$J,.84,8053,0)
 ;;=8053^2^^5
 ;;^UTILITY(U,$J,.84,8053,1,0)
 ;;=^^1^1^2940316^^
 ;;^UTILITY(U,$J,.84,8053,1,1,0)
 ;;=Prompt for the reader: End of page
 ;;^UTILITY(U,$J,.84,8053,2,0)
 ;;=^^1^1^2940316^^
 ;;^UTILITY(U,$J,.84,8053,2,1,0)
 ;;=Type <Enter> to continue or '^' to exit: 
 ;;^UTILITY(U,$J,.84,8054,0)
 ;;=8054^2^^5
 ;;^UTILITY(U,$J,.84,8054,1,0)
 ;;=^^1^1^2940310^^
 ;;^UTILITY(U,$J,.84,8054,1,1,0)
 ;;=Prompt for the reader: numbers
 ;;^UTILITY(U,$J,.84,8054,2,0)
 ;;=^^1^1^2940310^^
 ;;^UTILITY(U,$J,.84,8054,2,1,0)
 ;;=Enter a number
 ;;^UTILITY(U,$J,.84,8055,0)
 ;;=8055^2^^5
 ;;^UTILITY(U,$J,.84,8055,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8055,1,1,0)
 ;;=Prompt for the reader: date
 ;;^UTILITY(U,$J,.84,8055,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8055,2,1,0)
 ;;=Enter a date
 ;;^UTILITY(U,$J,.84,8056,0)
 ;;=8056^2^^5
 ;;^UTILITY(U,$J,.84,8056,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8056,1,1,0)
 ;;=Prompt for the reader: List
 ;;^UTILITY(U,$J,.84,8056,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8056,2,1,0)
 ;;=Enter a list or range of numbers
 ;;^UTILITY(U,$J,.84,8057,0)
 ;;=8057^2^^5
 ;;^UTILITY(U,$J,.84,8057,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8057,1,1,0)
 ;;=Prompt for the Reader: Pointers
 ;;^UTILITY(U,$J,.84,8057,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,8057,2,1,0)
 ;;=Select: 
 ;;^UTILITY(U,$J,.84,8058,0)
 ;;=8058^2^y^5
 ;;^UTILITY(U,$J,.84,8058,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8058,1,1,0)
 ;;=Part II of the 'Are you adding a new...' question
 ;;^UTILITY(U,$J,.84,8058,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8058,2,1,0)
 ;;= (the |1|
 ;;^UTILITY(U,$J,.84,8058,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8058,3,1,0)
 ;;=1^Ordinal number of new entry
 ;;^UTILITY(U,$J,.84,8059,0)
 ;;=8059^2^y^5
 ;;^UTILITY(U,$J,.84,8059,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8059,1,1,0)
 ;;=Part III of the 'Are you adding a new...' question
 ;;^UTILITY(U,$J,.84,8059,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8059,2,1,0)
 ;;= for this |1|
 ;;^UTILITY(U,$J,.84,8059,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8059,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8060,0)
 ;;=8060^2^^5
 ;;^UTILITY(U,$J,.84,8060,1,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8060,1,1,0)
 ;;=Part Ia of the 'Are you adding...' message
 ;;^UTILITY(U,$J,.84,8060,2,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8060,2,1,0)
 ;;=  Are you adding 
 ;;^UTILITY(U,$J,.84,8061,0)
 ;;=8061^2^y^5
 ;;^UTILITY(U,$J,.84,8061,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8061,1,1,0)
 ;;=Part Ib of the 'Are you adding...' question
 ;;^UTILITY(U,$J,.84,8061,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8061,2,1,0)
 ;;='|1|' as 
 ;;^UTILITY(U,$J,.84,8061,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8061,3,1,0)
 ;;=1^Input value for .01 field
 ;;^UTILITY(U,$J,.84,8062,0)
 ;;=8062^2^y^5
 ;;^UTILITY(U,$J,.84,8062,1,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,8062,1,1,0)
 ;;=Part Ic of the "Are you adding..." message
 ;;^UTILITY(U,$J,.84,8062,2,0)
 ;;=^^1^1^2940314^^^^
 ;;^UTILITY(U,$J,.84,8062,2,1,0)
 ;;=a new |1|
 ;;^UTILITY(U,$J,.84,8062,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8062,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8063,0)
 ;;=8063^2^y^5
 ;;^UTILITY(U,$J,.84,8063,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8063,1,1,0)
 ;;=Lookup Part I
 ;;^UTILITY(U,$J,.84,8063,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8063,2,1,0)
 ;;= Answer with |1|
 ;;^UTILITY(U,$J,.84,8063,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8063,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8064,0)
 ;;=8064^2^^5
 ;;^UTILITY(U,$J,.84,8064,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8064,1,1,0)
 ;;=Lookup Part II
 ;;^UTILITY(U,$J,.84,8064,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8064,2,1,0)
 ;;= Do you want the entire 
 ;;^UTILITY(U,$J,.84,8065,0)
 ;;=8065^2^y^5
 ;;^UTILITY(U,$J,.84,8065,1,0)
 ;;=^^1^1^2940314^^
 ;;^UTILITY(U,$J,.84,8065,1,1,0)
 ;;=Lookup Part III

DINIT00K
DINIT00K ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;22MAY2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8065,2,0)
 ;;=^^1^1^2940314^^^
 ;;^UTILITY(U,$J,.84,8065,2,1,0)
 ;;=|1|-Entry 
 ;;^UTILITY(U,$J,.84,8065,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8065,3,1,0)
 ;;=1^Number of entries in list
 ;;^UTILITY(U,$J,.84,8066,0)
 ;;=8066^2^y^5
 ;;^UTILITY(U,$J,.84,8066,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8066,1,1,0)
 ;;=Lookup Part IV
 ;;^UTILITY(U,$J,.84,8066,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8066,2,1,0)
 ;;=|1| List
 ;;^UTILITY(U,$J,.84,8066,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8066,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8067,0)
 ;;=8067^2^^5
 ;;^UTILITY(U,$J,.84,8067,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8067,1,1,0)
 ;;=For list of Fields on Lookup
 ;;^UTILITY(U,$J,.84,8067,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8067,2,1,0)
 ;;=, or
 ;;^UTILITY(U,$J,.84,8068,0)
 ;;=8068^2^^5
 ;;^UTILITY(U,$J,.84,8068,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8068,1,1,0)
 ;;=The Chooser
 ;;^UTILITY(U,$J,.84,8068,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8068,2,1,0)
 ;;=Choose from:
 ;;^UTILITY(U,$J,.84,8069,0)
 ;;=8069^2^y^5
 ;;^UTILITY(U,$J,.84,8069,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8069,1,1,0)
 ;;=New entry allowed message
 ;;^UTILITY(U,$J,.84,8069,2,0)
 ;;=^^1^1^2940315^^
 ;;^UTILITY(U,$J,.84,8069,2,1,0)
 ;;=You may enter a new |1|, if you wish
 ;;^UTILITY(U,$J,.84,8069,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8069,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8070,0)
 ;;=8070^2^y^5
 ;;^UTILITY(U,$J,.84,8070,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8070,1,1,0)
 ;;=Variable Pointer Lookup
 ;;^UTILITY(U,$J,.84,8070,2,0)
 ;;=^^1^1^2980304^
 ;;^UTILITY(U,$J,.84,8070,2,1,0)
 ;;=     Searching for a |1|
 ;;^UTILITY(U,$J,.84,8070,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8070,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8071,0)
 ;;=8071^2^^5
 ;;^UTILITY(U,$J,.84,8071,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8071,1,1,0)
 ;;=Variable Pointer lookup
 ;;^UTILITY(U,$J,.84,8071,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8071,2,1,0)
 ;;=Enter one of the following:
 ;;^UTILITY(U,$J,.84,8072,0)
 ;;=8072^2^y^5
 ;;^UTILITY(U,$J,.84,8072,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8072,1,1,0)
 ;;=Variable Pointer Lookup
 ;;^UTILITY(U,$J,.84,8072,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8072,2,1,0)
 ;;=  |1|.EntryName to select a |2|
 ;;^UTILITY(U,$J,.84,8072,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,8072,3,1,0)
 ;;=1^Prefix
 ;;^UTILITY(U,$J,.84,8072,3,2,0)
 ;;=2^Filename
 ;;^UTILITY(U,$J,.84,8073,0)
 ;;=8073^2^^5
 ;;^UTILITY(U,$J,.84,8073,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8073,1,1,0)
 ;;=Variable Pointer Lookup
 ;;^UTILITY(U,$J,.84,8073,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8073,2,1,0)
 ;;=To see the entries in any particular file type <Prefix.?>
 ;;^UTILITY(U,$J,.84,8074,0)
 ;;=8074^2^^5
 ;;^UTILITY(U,$J,.84,8074,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8074,1,1,0)
 ;;=How to call for help
 ;;^UTILITY(U,$J,.84,8074,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,8074,2,1,0)
 ;;=Press <F1>H for help
 ;;^UTILITY(U,$J,.84,8074.1,0)
 ;;=8074.1^2^^5
 ;;^UTILITY(U,$J,.84,8074.1,1,0)
 ;;=^^1^1^3040430
 ;;^UTILITY(U,$J,.84,8074.1,1,1,0)
 ;;=How to click for help
 ;;^UTILITY(U,$J,.84,8074.1,2,0)
 ;;=^^1^1^3040430
 ;;^UTILITY(U,$J,.84,8074.1,2,1,0)
 ;;=HELP
 ;;^UTILITY(U,$J,.84,8075,0)
 ;;=8075^2^^5
 ;;^UTILITY(U,$J,.84,8075,1,0)
 ;;=^^1^1^2940524^^
 ;;^UTILITY(U,$J,.84,8075,1,1,0)
 ;;=Save changes question on form exit
 ;;^UTILITY(U,$J,.84,8075,2,0)
 ;;=^^1^1^2940524^^
 ;;^UTILITY(U,$J,.84,8075,2,1,0)
 ;;=Save changes before leaving form (Y/N)?
 ;;^UTILITY(U,$J,.84,8076,0)
 ;;=8076^2^^5
 ;;^UTILITY(U,$J,.84,8076,1,0)
 ;;=^^1^1^2940315^
 ;;^UTILITY(U,$J,.84,8076,1,1,0)
 ;;=Timeout
 ;;^UTILITY(U,$J,.84,8076,2,0)
 ;;=^^1^1^2940315^
 ;;^UTILITY(U,$J,.84,8076,2,1,0)
 ;;=Timed out.  
 ;;^UTILITY(U,$J,.84,8077,0)
 ;;=8077^2^^5
 ;;^UTILITY(U,$J,.84,8077,1,0)
 ;;=^^1^1^2940315^
 ;;^UTILITY(U,$J,.84,8077,1,1,0)
 ;;=Changes not saved on leaving form
 ;;^UTILITY(U,$J,.84,8077,2,0)
 ;;=^^1^1^2940315^
 ;;^UTILITY(U,$J,.84,8077,2,1,0)
 ;;=Changes not saved!
 ;;^UTILITY(U,$J,.84,8078,0)
 ;;=8078^2^^5
 ;;^UTILITY(U,$J,.84,8078,1,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,8078,1,1,0)
 ;;=Wording for record
 ;;^UTILITY(U,$J,.84,8078,2,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,8078,2,1,0)
 ;;=record
 ;;^UTILITY(U,$J,.84,8079,0)
 ;;=8079^2^^5
 ;;^UTILITY(U,$J,.84,8079,1,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,8079,1,1,0)
 ;;=Wording for Subrecord
 ;;^UTILITY(U,$J,.84,8079,2,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,8079,2,1,0)
 ;;=Subrecord
 ;;^UTILITY(U,$J,.84,8080,0)
 ;;=8080^2^y^5
 ;;^UTILITY(U,$J,.84,8080,1,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,8080,1,1,0)
 ;;=Warning for immediate deletion of entries.
 ;;^UTILITY(U,$J,.84,8080,2,0)
 ;;=^^3^3^2940316^
 ;;^UTILITY(U,$J,.84,8080,2,1,0)
 ;;=  WARNING: DELETIONS ARE DONE IMMEDIATELY!
 ;;^UTILITY(U,$J,.84,8080,2,2,0)
 ;;=           (EXITING WITHOUT SAVING WILL NOT RESTORE DELETED RECORDS.)
 ;;^UTILITY(U,$J,.84,8080,2,3,0)
 ;;=Are you sure you want to delete this entire |1| (Y/N)?
 ;;^UTILITY(U,$J,.84,8080,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8080,3,1,0)
 ;;=1^Record or Subrecord
 ;;^UTILITY(U,$J,.84,8081,0)
 ;;=8081^2^y^5
 ;;^UTILITY(U,$J,.84,8081,1,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,8081,1,1,0)
 ;;=Choose from-to dialog
 ;;^UTILITY(U,$J,.84,8081,2,0)
 ;;=^^1^1^2940316^^
 ;;^UTILITY(U,$J,.84,8081,2,1,0)
 ;;=Choose |1| or '^' to quit: 
 ;;^UTILITY(U,$J,.84,8081,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8081,3,1,0)
 ;;=1^Number range for selection
 ;;^UTILITY(U,$J,.84,8082,0)
 ;;=8082^2^^5
 ;;^UTILITY(U,$J,.84,8082,1,0)
 ;;=^^2^2^2940318^^^^
 ;;^UTILITY(U,$J,.84,8082,1,1,0)
 ;;=Used to build error prompts in the TRANSFER/MERGE routine ^DIT3.  Could be
 ;;^UTILITY(U,$J,.84,8082,1,2,0)
 ;;=used elsewhere, however, so I didn't put it into the ERROR category.
 ;;^UTILITY(U,$J,.84,8082,2,0)
 ;;=^^1^1^2940318^
 ;;^UTILITY(U,$J,.84,8082,2,1,0)
 ;;=Transfer FROM
 ;;^UTILITY(U,$J,.84,8082,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8082,5,1,0)
 ;;=DIT^TRNMRG
 ;;^UTILITY(U,$J,.84,8083,0)
 ;;=8083^2^^5
 ;;^UTILITY(U,$J,.84,8083,1,0)
 ;;=^^2^2^2940318^^^^
 ;;^UTILITY(U,$J,.84,8083,1,1,0)
 ;;=Used to build error prompts in the TRANSFER/MERGE routine ^DIT3.  Could be
 ;;^UTILITY(U,$J,.84,8083,1,2,0)
 ;;=used elsewhere, however, so I didn't put it into the ERROR category.
 ;;^UTILITY(U,$J,.84,8083,2,0)
 ;;=^^1^1^2940318^
 ;;^UTILITY(U,$J,.84,8083,2,1,0)
 ;;=Transfer TO
 ;;^UTILITY(U,$J,.84,8083,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8083,5,1,0)
 ;;=DIT^TRNMRG
 ;;^UTILITY(U,$J,.84,8084,0)
 ;;=8084^2^^5
 ;;^UTILITY(U,$J,.84,8084,1,0)
 ;;=^^1^1^2940318^
 ;;^UTILITY(U,$J,.84,8084,1,1,0)
 ;;=The words 'file number' to be used in any dialog.

DINIT00L
DINIT00L ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;29AUG2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8084,2,0)
 ;;=^^1^1^2940318^
 ;;^UTILITY(U,$J,.84,8084,2,1,0)
 ;;=file number
 ;;^UTILITY(U,$J,.84,8084,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8084,5,1,0)
 ;;=DIT^TRNMRG
 ;;^UTILITY(U,$J,.84,8085,0)
 ;;=8085^2^^5
 ;;^UTILITY(U,$J,.84,8085,1,0)
 ;;=^^1^1^2940426^^
 ;;^UTILITY(U,$J,.84,8085,1,1,0)
 ;;=The words 'IEN string' to be used in any dialog.
 ;;^UTILITY(U,$J,.84,8085,2,0)
 ;;=^^1^1^2940426^^
 ;;^UTILITY(U,$J,.84,8085,2,1,0)
 ;;=IEN string
 ;;^UTILITY(U,$J,.84,8085,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8085,5,1,0)
 ;;=DIT^TRNMRG
 ;;^UTILITY(U,$J,.84,8086,0)
 ;;=8086^2^^5
 ;;^UTILITY(U,$J,.84,8086,1,0)
 ;;=^^1^1^2940608^^^^
 ;;^UTILITY(U,$J,.84,8086,1,1,0)
 ;;=Warning to use the merge only during non-peak times.
 ;;^UTILITY(U,$J,.84,8086,2,0)
 ;;=^^5^5^2940608^
 ;;^UTILITY(U,$J,.84,8086,2,1,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8086,2,2,0)
 ;;=NOTE: Use this option ONLY DURING NON-PEAK HOURS if merging entries in a
 ;;^UTILITY(U,$J,.84,8086,2,3,0)
 ;;=file that is pointed-to either by many files, or by large files.
 ;;^UTILITY(U,$J,.84,8086,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8086,2,5,0)
 ;;=MERGE ENTRIES AFTER COMPARING THEM 
 ;;^UTILITY(U,$J,.84,8087,0)
 ;;=8087^2^y^5^End of Page message for Lookup (DIC)
 ;;^UTILITY(U,$J,.84,8087,1,0)
 ;;=^^2^2^2970529^
 ;;^UTILITY(U,$J,.84,8087,1,1,0)
 ;;=Displays the end of page message displayed at the bottom of a screen after
 ;;^UTILITY(U,$J,.84,8087,1,2,0)
 ;;=a list of selectable entries is displayed during lookup (^DIC).
 ;;^UTILITY(U,$J,.84,8087,2,0)
 ;;=^^1^1^2970529^
 ;;^UTILITY(U,$J,.84,8087,2,1,0)
 ;;=Press <Enter> to see more, '^' to exit this list, |T| OR
 ;;^UTILITY(U,$J,.84,8087,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8087,3,1,0)
 ;;=T^TO EXIT ALL LISTS
 ;;^UTILITY(U,$J,.84,8087,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8087,5,1,0)
 ;;=DIC1^DSP
 ;;^UTILITY(U,$J,.84,8088,0)
 ;;=8088^2^y^5
 ;;^UTILITY(U,$J,.84,8088,1,0)
 ;;=^^2^2^2970529^^
 ;;^UTILITY(U,$J,.84,8088,1,1,0)
 ;;=Message directing the user to Choose one of the displayed selections
 ;;^UTILITY(U,$J,.84,8088,1,2,0)
 ;;=during lookup (^DIC).
 ;;^UTILITY(U,$J,.84,8088,2,0)
 ;;=^^1^1^2970529^
 ;;^UTILITY(U,$J,.84,8088,2,1,0)
 ;;=CHOOSE |1|-|2|: 
 ;;^UTILITY(U,$J,.84,8088,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,8088,3,1,0)
 ;;=1^Starting number in displayed list
 ;;^UTILITY(U,$J,.84,8088,3,2,0)
 ;;=2^Ending number in displayed list
 ;;^UTILITY(U,$J,.84,8088,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8088,5,1,0)
 ;;=DIC1^DSP
 ;;^UTILITY(U,$J,.84,8089,0)
 ;;=8089^2^y^5
 ;;^UTILITY(U,$J,.84,8089,1,0)
 ;;=^^2^2^2970609^^
 ;;^UTILITY(U,$J,.84,8089,1,1,0)
 ;;=Message used during interactive ^DIC to display the file and index name
 ;;^UTILITY(U,$J,.84,8089,1,2,0)
 ;;=on which the displayed entries were found.
 ;;^UTILITY(U,$J,.84,8089,2,0)
 ;;=^^1^1^2970609^^
 ;;^UTILITY(U,$J,.84,8089,2,1,0)
 ;;=Matches to: |1| |2|.
 ;;^UTILITY(U,$J,.84,8089,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,8089,3,1,0)
 ;;=1^File name
 ;;^UTILITY(U,$J,.84,8089,3,2,0)
 ;;=2^Indexed field name
 ;;^UTILITY(U,$J,.84,8089,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8089,5,1,0)
 ;;=DIC1^DSP
 ;;^UTILITY(U,$J,.84,8090,0)
 ;;=8090^2^^5
 ;;^UTILITY(U,$J,.84,8090,1,0)
 ;;=^^3^3^2970626^
 ;;^UTILITY(U,$J,.84,8090,1,1,0)
 ;;=Used in displaying an error message when the lookup value X does not pass
 ;;^UTILITY(U,$J,.84,8090,1,2,0)
 ;;=the Pre-lookup transform code (^DD(File#,.01,7.5) node) during ^DIC or
 ;;^UTILITY(U,$J,.84,8090,1,3,0)
 ;;=Finder lookups.
 ;;^UTILITY(U,$J,.84,8090,2,0)
 ;;=^^1^1^2970626^
 ;;^UTILITY(U,$J,.84,8090,2,1,0)
 ;;=Pre-lookup transform (7.5 node)
 ;;^UTILITY(U,$J,.84,8090,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8090,5,1,0)
 ;;=DIC
 ;;^UTILITY(U,$J,.84,8090,5,2,0)
 ;;=DICF
 ;;^UTILITY(U,$J,.84,8091,0)
 ;;=8091^1^^5^
 ;;^UTILITY(U,$J,.84,8091,1,0)
 ;;=^^1^1^2970715^
 ;;^UTILITY(U,$J,.84,8091,1,1,0)
 ;;=Error set when user times out.
 ;;^UTILITY(U,$J,.84,8091,2,0)
 ;;=^^1^1^2970715^
 ;;^UTILITY(U,$J,.84,8091,2,1,0)
 ;;=User timed out.
 ;;^UTILITY(U,$J,.84,8091,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8091,5,1,0)
 ;;=DIC1^Y
 ;;^UTILITY(U,$J,.84,8092,0)
 ;;=8092^1^^5
 ;;^UTILITY(U,$J,.84,8092,1,0)
 ;;=^^1^1^2970715^
 ;;^UTILITY(U,$J,.84,8092,1,1,0)
 ;;=Error when user up-arrows out.
 ;;^UTILITY(U,$J,.84,8092,2,0)
 ;;=^^1^1^2970715^
 ;;^UTILITY(U,$J,.84,8092,2,1,0)
 ;;=User up-arrowed out.
 ;;^UTILITY(U,$J,.84,8092,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8092,5,1,0)
 ;;=DIC1^Y
 ;;^UTILITY(U,$J,.84,8093,0)
 ;;=8093^1^^5
 ;;^UTILITY(U,$J,.84,8093,1,0)
 ;;=^^4^4^2970722^
 ;;^UTILITY(U,$J,.84,8093,1,1,0)
 ;;=Error that occurs when user passes too many lookup values to either the
 ;;^UTILITY(U,$J,.84,8093,1,2,0)
 ;;=Finder call ^DICF or the FileMan lookup ^DIC.  When the number of lookup
 ;;^UTILITY(U,$J,.84,8093,1,3,0)
 ;;=values exceeds the number of subscripts in the index passed (or the
 ;;^UTILITY(U,$J,.84,8093,1,4,0)
 ;;=default index if no index is passed).
 ;;^UTILITY(U,$J,.84,8093,2,0)
 ;;=^^1^1^2970722^
 ;;^UTILITY(U,$J,.84,8093,2,1,0)
 ;;=Too many lookup values for this index.
 ;;^UTILITY(U,$J,.84,8093,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8093,5,1,0)
 ;;=DIC3^ASK
 ;;^UTILITY(U,$J,.84,8094,0)
 ;;=8094^1^^5
 ;;^UTILITY(U,$J,.84,8094,1,0)
 ;;=^^3^3^2970820^
 ;;^UTILITY(U,$J,.84,8094,1,1,0)
 ;;=Error message returned from ^DICF or ^DIC when flags parameter or
 ;;^UTILITY(U,$J,.84,8094,1,2,0)
 ;;=DIC(0) contains an "X", but not enough lookup values passed for the number
 ;;^UTILITY(U,$J,.84,8094,1,3,0)
 ;;=of subscripts in the lookup index.
 ;;^UTILITY(U,$J,.84,8094,2,0)
 ;;=^^1^1^2970820^
 ;;^UTILITY(U,$J,.84,8094,2,1,0)
 ;;=Not enough lookup values provided for an exact match on this index.
 ;;^UTILITY(U,$J,.84,8094,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8094,5,1,0)
 ;;=DIC31^CHKVAL1
 ;;^UTILITY(U,$J,.84,8095,0)
 ;;=8095^1^^5
 ;;^UTILITY(U,$J,.84,8095,1,0)
 ;;=^^3^3^2990104^^
 ;;^UTILITY(U,$J,.84,8095,1,1,0)
 ;;=In calls to the Finder, IX^DIC or MIX^DIC, if the first index passed (or
 ;;^UTILITY(U,$J,.84,8095,1,2,0)
 ;;=the default index) is a compound index, then only one index can be passed,
 ;;^UTILITY(U,$J,.84,8095,1,3,0)
 ;;=so DIC(0) (or flags) cannot contain "M".
 ;;^UTILITY(U,$J,.84,8095,2,0)
 ;;=^^1^1^2990104^
 ;;^UTILITY(U,$J,.84,8095,2,1,0)
 ;;=First lookup index is compound, so "M"ultiple index lookups not allowed.
 ;;^UTILITY(U,$J,.84,8095,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8095,5,1,0)
 ;;=DIC31^CHKVAL1
 ;;^UTILITY(U,$J,.84,8096,0)
 ;;=8096^1^^5
 ;;^UTILITY(U,$J,.84,8096,1,0)
 ;;=^^2^2^2971001^
 ;;^UTILITY(U,$J,.84,8096,1,1,0)
 ;;=Error message from ^DIC or ^DICQ when DIC contains a subfile number

DINIT00M
DINIT00M ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8096,1,2,0)
 ;;=instead of an open global root, and the DA array is not defined.
 ;;^UTILITY(U,$J,.84,8096,2,0)
 ;;=^^1^1^2971001^
 ;;^UTILITY(U,$J,.84,8096,2,1,0)
 ;;=If DIC contains a subfile number, DA array must be defined.
 ;;^UTILITY(U,$J,.84,8096,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8096,5,1,0)
 ;;=DIC0^GETFILE
 ;;^UTILITY(U,$J,.84,8097,0)
 ;;=8097^2^y^5
 ;;^UTILITY(U,$J,.84,8097,1,0)
 ;;=^^1^1^2980304^^^
 ;;^UTILITY(U,$J,.84,8097,1,1,0)
 ;;=Variable Pointer Lookup
 ;;^UTILITY(U,$J,.84,8097,2,0)
 ;;=^^1^1^2980304^
 ;;^UTILITY(U,$J,.84,8097,2,1,0)
 ;;=     Searching for a |1|, (pointed-to by |2|)
 ;;^UTILITY(U,$J,.84,8097,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,8097,3,1,0)
 ;;=1^Pointed-to Filename
 ;;^UTILITY(U,$J,.84,8097,3,2,0)
 ;;=2^Pointing field name
 ;;^UTILITY(U,$J,.84,8098,0)
 ;;=8098^2^^5
 ;;^UTILITY(U,$J,.84,8098,2,0)
 ;;=^^1^1^2980603^^^^
 ;;^UTILITY(U,$J,.84,8098,2,1,0)
 ;;=file^File^subfile^Subfile
 ;;^UTILITY(U,$J,.84,9002,0)
 ;;=9002^3^y^5
 ;;^UTILITY(U,$J,.84,9002,1,0)
 ;;=^^1^1^2930617^^
 ;;^UTILITY(U,$J,.84,9002,1,1,0)
 ;;=Help for entering maximum routine size for compiled routines.
 ;;^UTILITY(U,$J,.84,9002,2,0)
 ;;=^^4^4^2930629^^^^
 ;;^UTILITY(U,$J,.84,9002,2,1,0)
 ;;=This number will be used to determine how large to make the generated
 ;;^UTILITY(U,$J,.84,9002,2,2,0)
 ;;=compiled |1| routines.  The size must be a number greater
 ;;^UTILITY(U,$J,.84,9002,2,3,0)
 ;;=than 2400, the larger the better, up to the maximum routine size for
 ;;^UTILITY(U,$J,.84,9002,2,4,0)
 ;;=your operating system.
 ;;^UTILITY(U,$J,.84,9002,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9002,3,1,0)
 ;;=1^Will be the word 'TEMPLATE' when compiling templates, or 'cross-reference' when compiling CROSS-REFERENCES.
 ;;^UTILITY(U,$J,.84,9002,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,9002,5,1,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,9002,5,2,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,9002,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,9004,0)
 ;;=9004^3^y^5
 ;;^UTILITY(U,$J,.84,9004,1,0)
 ;;=^^2^2^2931110^^^^
 ;;^UTILITY(U,$J,.84,9004,1,1,0)
 ;;=Help asking the user whether they wish to UNCOMPILE previously compiled
 ;;^UTILITY(U,$J,.84,9004,1,2,0)
 ;;=templates or cross-references.
 ;;^UTILITY(U,$J,.84,9004,2,0)
 ;;=^^4^4^2931110^^
 ;;^UTILITY(U,$J,.84,9004,2,1,0)
 ;;=  Answer YES to UNCOMPILE the |1|.
 ;;^UTILITY(U,$J,.84,9004,2,2,0)
 ;;=The compiled routine will no longer be used.
 ;;^UTILITY(U,$J,.84,9004,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9004,2,4,0)
 ;;=  Answer NO to recompile the |1| at this time.
 ;;^UTILITY(U,$J,.84,9004,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9004,3,1,0)
 ;;=1^Will contain either the word 'TEMPLATE' or 'CROSS-REFERENCES.
 ;;^UTILITY(U,$J,.84,9004,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,9004,5,1,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,9004,5,2,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,9004,5,3,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,9006,0)
 ;;=9006^3^y^5
 ;;^UTILITY(U,$J,.84,9006,1,0)
 ;;=^^2^2^2931105^^^^
 ;;^UTILITY(U,$J,.84,9006,1,1,0)
 ;;=Help for prompting for compiled routine name, when compiling templates
 ;;^UTILITY(U,$J,.84,9006,1,2,0)
 ;;=or cross-references.
 ;;^UTILITY(U,$J,.84,9006,2,0)
 ;;=^^2^2^2931109^
 ;;^UTILITY(U,$J,.84,9006,2,1,0)
 ;;=Enter a valid MUMPS routine name of from 3 to |1| characters.  This must
 ;;^UTILITY(U,$J,.84,9006,2,2,0)
 ;;=be entered without a leading up-arrow, and cannot begin with "DI".
 ;;^UTILITY(U,$J,.84,9006,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9006,3,1,0)
 ;;=1^Internal parameter indicating the maximum number of characters allowed for routine namespace.
 ;;^UTILITY(U,$J,.84,9006,5,0)
 ;;=^.841^4^4
 ;;^UTILITY(U,$J,.84,9006,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9006,5,2,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,9006,5,3,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,9006,5,4,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,9014,0)
 ;;=9014^3^^5
 ;;^UTILITY(U,$J,.84,9014,1,0)
 ;;=^^1^1^2930706^^^^
 ;;^UTILITY(U,$J,.84,9014,1,1,0)
 ;;=Help prompt for compiling sort templates.
 ;;^UTILITY(U,$J,.84,9014,2,0)
 ;;=^^3^3^2931110^
 ;;^UTILITY(U,$J,.84,9014,2,1,0)
 ;;=If YES is entered,
 ;;^UTILITY(U,$J,.84,9014,2,2,0)
 ;;=the Sort logic will be compiled into a routine at the
 ;;^UTILITY(U,$J,.84,9014,2,3,0)
 ;;=time the template is used in a FileMan Sort/Print.
 ;;^UTILITY(U,$J,.84,9014,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9014,5,1,0)
 ;;=DIOZ^ENCU
 ;;^UTILITY(U,$J,.84,9019,0)
 ;;=9019^3^^5
 ;;^UTILITY(U,$J,.84,9019,1,0)
 ;;=^^1^1^2931110^^^^
 ;;^UTILITY(U,$J,.84,9019,1,1,0)
 ;;=Help prompt for Uncompiling sort templates.
 ;;^UTILITY(U,$J,.84,9019,2,0)
 ;;=^^3^3^2931110^
 ;;^UTILITY(U,$J,.84,9019,2,1,0)
 ;;=If YES is entered,
 ;;^UTILITY(U,$J,.84,9019,2,2,0)
 ;;=the Sort logic for this template will NOT be compiled into a
 ;;^UTILITY(U,$J,.84,9019,2,3,0)
 ;;=routine during the time it is used by a FileMan sort/print.
 ;;^UTILITY(U,$J,.84,9019,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9019,5,1,0)
 ;;=DIOZ^ENCU
 ;;^UTILITY(U,$J,.84,9024,0)
 ;;=9024^3^^5
 ;;^UTILITY(U,$J,.84,9024,1,0)
 ;;=^^2^2^2931105^
 ;;^UTILITY(U,$J,.84,9024,1,1,0)
 ;;=Help for the POST-SELECTION ACTION field for a file.  This entry is put
 ;;^UTILITY(U,$J,.84,9024,1,2,0)
 ;;=in from the Utility option to edit a file.
 ;;^UTILITY(U,$J,.84,9024,2,0)
 ;;=^^1^1^2931105^^^
 ;;^UTILITY(U,$J,.84,9024,2,1,0)
 ;;=This code will be executed whenever an entry is selected from the file.
 ;;^UTILITY(U,$J,.84,9024,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9024,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9025,0)
 ;;=9025^3^^5
 ;;^UTILITY(U,$J,.84,9025,1,0)
 ;;=^^1^1^2931105^^
 ;;^UTILITY(U,$J,.84,9025,1,1,0)
 ;;=General help for MUMPS type fields.
 ;;^UTILITY(U,$J,.84,9025,2,0)
 ;;=^^1^1^2931105^
 ;;^UTILITY(U,$J,.84,9025,2,1,0)
 ;;=Enter a line of standard MUMPS code.
 ;;^UTILITY(U,$J,.84,9025,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9025,5,1,0)
 ;;=DIOU^6
 ;;^UTILITY(U,$J,.84,9026,0)
 ;;=9026^3^^5
 ;;^UTILITY(U,$J,.84,9026,1,0)
 ;;=^^3^3^2931105^^
 ;;^UTILITY(U,$J,.84,9026,1,1,0)
 ;;=The DD for the file of files is not completely FileMan compatible.  This
 ;;^UTILITY(U,$J,.84,9026,1,2,0)
 ;;=is the standard help prompt for the LOOK-UP PROGRAM field on the file of
 ;;^UTILITY(U,$J,.84,9026,1,3,0)
 ;;=files.  Prompt appears when file attributes are being edited.
 ;;^UTILITY(U,$J,.84,9026,2,0)
 ;;=^^2^2^2931105^^
 ;;^UTILITY(U,$J,.84,9026,2,1,0)
 ;;=This special lookup routine will be executed instead of the standard
 ;;^UTILITY(U,$J,.84,9026,2,2,0)
 ;;=FileMan lookup logic, whenever a call is made to ^DIC.

DINIT00N
DINIT00N ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;06:19 PM  21 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9026,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9026,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9027,0)
 ;;=9027^3^^5
 ;;^UTILITY(U,$J,.84,9027,1,0)
 ;;=^^3^3^2931105^
 ;;^UTILITY(U,$J,.84,9027,1,1,0)
 ;;=The DD for the file of files is not completely FileMan compatible.  This
 ;;^UTILITY(U,$J,.84,9027,1,2,0)
 ;;=is the standard help prompt for the CROSS-REFERENCE ROUTINE field on the
 ;;^UTILITY(U,$J,.84,9027,1,3,0)
 ;;=file of files.  Prompt appears when file attributes are being edited.
 ;;^UTILITY(U,$J,.84,9027,2,0)
 ;;=^^5^5^2931109^
 ;;^UTILITY(U,$J,.84,9027,2,1,0)
 ;;=If a NEW routine name is entered, but the cross-references are not
 ;;^UTILITY(U,$J,.84,9027,2,2,0)
 ;;=compiled at this time, the routine name will be automatically deleted.
 ;;^UTILITY(U,$J,.84,9027,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9027,2,4,0)
 ;;=If the routine name is deleted, the cross-references are considered
 ;;^UTILITY(U,$J,.84,9027,2,5,0)
 ;;=uncompiled, and FileMan will not use the routine for re-indexing.
 ;;^UTILITY(U,$J,.84,9027,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9027,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9028,0)
 ;;=9028^3^^5
 ;;^UTILITY(U,$J,.84,9028,1,0)
 ;;=^^3^3^2931109^
 ;;^UTILITY(U,$J,.84,9028,1,1,0)
 ;;=Help prompt for CROSS-REFERENCE ROUTINE name when editing file attributes.
 ;;^UTILITY(U,$J,.84,9028,1,2,0)
 ;;= If the user does not changes the name of the CROSS-REFERENCE ROUTINE,
 ;;^UTILITY(U,$J,.84,9028,1,3,0)
 ;;=then recompilation is not required, and they will see this help prompt.
 ;;^UTILITY(U,$J,.84,9028,2,0)
 ;;=^^2^2^2931109^
 ;;^UTILITY(U,$J,.84,9028,2,1,0)
 ;;=It is not necessary to recompile the cross-references, since the name of
 ;;^UTILITY(U,$J,.84,9028,2,2,0)
 ;;=the CROSS-REFERENCE ROUTINE was not changed.
 ;;^UTILITY(U,$J,.84,9028,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9028,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9029,0)
 ;;=9029^3^^5
 ;;^UTILITY(U,$J,.84,9029,1,0)
 ;;=^^5^5^2931109^
 ;;^UTILITY(U,$J,.84,9029,1,1,0)
 ;;=Help prompt for CROSS-REFERENCE ROUTINE name when editing file attributes.
 ;;^UTILITY(U,$J,.84,9029,1,2,0)
 ;;= If the user changes the name of the CROSS-REFERENCE ROUTINE, or enters a
 ;;^UTILITY(U,$J,.84,9029,1,3,0)
 ;;=name for the first time, they must also compile the routines at this time.
 ;;^UTILITY(U,$J,.84,9029,1,4,0)
 ;;= If they don't the routine name they just entered will be deleted from the
 ;;^UTILITY(U,$J,.84,9029,1,5,0)
 ;;=DD.
 ;;^UTILITY(U,$J,.84,9029,2,0)
 ;;=^^2^2^2931109^
 ;;^UTILITY(U,$J,.84,9029,2,1,0)
 ;;=If the cross-references are not recompiled at this time, the
 ;;^UTILITY(U,$J,.84,9029,2,2,0)
 ;;=CROSS-REFERENCE ROUTINE name will NOT be saved in the data dictionary.
 ;;^UTILITY(U,$J,.84,9029,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9029,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9030,0)
 ;;=9030^3^^5
 ;;^UTILITY(U,$J,.84,9030,1,0)
 ;;=^^2^2^2931109^^^^
 ;;^UTILITY(U,$J,.84,9030,1,1,0)
 ;;=Help for prompting for compiled routine name, when compiling templates
 ;;^UTILITY(U,$J,.84,9030,1,2,0)
 ;;=or cross-references.
 ;;^UTILITY(U,$J,.84,9030,2,0)
 ;;=^^1^1^2931109^
 ;;^UTILITY(U,$J,.84,9030,2,1,0)
 ;;=This will become the namespace of the compiled routine(s).
 ;;^UTILITY(U,$J,.84,9030,5,0)
 ;;=^.841^4^4
 ;;^UTILITY(U,$J,.84,9030,5,1,0)
 ;;=DIU0^6
 ;;^UTILITY(U,$J,.84,9030,5,2,0)
 ;;=DIKZ^ 
 ;;^UTILITY(U,$J,.84,9030,5,3,0)
 ;;=DIPZ^ 
 ;;^UTILITY(U,$J,.84,9030,5,4,0)
 ;;=DIEZ^ 
 ;;^UTILITY(U,$J,.84,9031,0)
 ;;=9031^2^^5
 ;;^UTILITY(U,$J,.84,9031,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9031,1,1,0)
 ;;=Help for the reader: Freetext
 ;;^UTILITY(U,$J,.84,9031,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9031,2,1,0)
 ;;=This response can be free text
 ;;^UTILITY(U,$J,.84,9032,0)
 ;;=9032^2^^5
 ;;^UTILITY(U,$J,.84,9032,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9032,1,1,0)
 ;;=Help for the reader: Set of codes
 ;;^UTILITY(U,$J,.84,9032,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9032,2,1,0)
 ;;=Enter a code from the list.
 ;;^UTILITY(U,$J,.84,9033,0)
 ;;=9033^2^^5
 ;;^UTILITY(U,$J,.84,9033,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9033,1,1,0)
 ;;=Help for the reader: End of page
 ;;^UTILITY(U,$J,.84,9033,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9033,2,1,0)
 ;;=Enter either <Enter> or '^'
 ;;^UTILITY(U,$J,.84,9034,0)
 ;;=9034^2^^5
 ;;^UTILITY(U,$J,.84,9034,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9034,1,1,0)
 ;;=Help for the reader: Numbers
 ;;^UTILITY(U,$J,.84,9034,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9034,2,1,0)
 ;;=This response must be a number
 ;;^UTILITY(U,$J,.84,9035,0)
 ;;=9035^2^^5
 ;;^UTILITY(U,$J,.84,9035,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9035,1,1,0)
 ;;=Help for the reader: dates
 ;;^UTILITY(U,$J,.84,9035,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9035,2,1,0)
 ;;=This response must be a date
 ;;^UTILITY(U,$J,.84,9036,0)
 ;;=9036^2^^5
 ;;^UTILITY(U,$J,.84,9036,1,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9036,1,1,0)
 ;;=Help for the reader: List
 ;;^UTILITY(U,$J,.84,9036,2,0)
 ;;=^^1^1^2940310^
 ;;^UTILITY(U,$J,.84,9036,2,1,0)
 ;;=This response must be a list or range, e.g., 1,3,5 or 2-4,8
 ;;^UTILITY(U,$J,.84,9037,0)
 ;;=9037^3^^5
 ;;^UTILITY(U,$J,.84,9037,1,0)
 ;;=^^1^1^2940316^^
 ;;^UTILITY(U,$J,.84,9037,1,1,0)
 ;;=Help for leaving form
 ;;^UTILITY(U,$J,.84,9037,2,0)
 ;;=^^3^3^2940316^^
 ;;^UTILITY(U,$J,.84,9037,2,1,0)
 ;;=Enter 'Y' to save before exiting.
 ;;^UTILITY(U,$J,.84,9037,2,2,0)
 ;;=Enter 'N' or '^' to exit without saving.
 ;;^UTILITY(U,$J,.84,9037,2,3,0)
 ;;=Press <Enter> to return to form
 ;;^UTILITY(U,$J,.84,9038,0)
 ;;=9038^3^^5
 ;;^UTILITY(U,$J,.84,9038,1,0)
 ;;=^^1^1^2940316^
 ;;^UTILITY(U,$J,.84,9038,1,1,0)
 ;;=Help for (Sub)record delete in forms
 ;;^UTILITY(U,$J,.84,9038,2,0)
 ;;=^^2^2^2940316^
 ;;^UTILITY(U,$J,.84,9038,2,1,0)
 ;;=Enter 'Y' to delete.
 ;;^UTILITY(U,$J,.84,9038,2,2,0)
 ;;=Enter 'N' or <Enter> to return to form.
 ;;^UTILITY(U,$J,.84,9040,0)
 ;;=9040^2^^5
 ;;^UTILITY(U,$J,.84,9040,1,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,9040,1,1,0)
 ;;=Reader Help for Yes/No question
 ;;^UTILITY(U,$J,.84,9040,2,0)
 ;;=^^1^1^2940314^
 ;;^UTILITY(U,$J,.84,9040,2,1,0)
 ;;=Enter either 'Y' or 'N'.
 ;;^UTILITY(U,$J,.84,9041,0)
 ;;=9041^3^^5
 ;;^UTILITY(U,$J,.84,9041,1,0)
 ;;=^^2^2^2940608^^^^
 ;;^UTILITY(U,$J,.84,9041,1,1,0)
 ;;=Help message for why the Compare/Merge options should be run during
 ;;^UTILITY(U,$J,.84,9041,1,2,0)
 ;;=non-peak hours.
 ;;^UTILITY(U,$J,.84,9041,2,0)
 ;;=^^8^8^2940608^

DINIT00O
DINIT00O ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;3:18 PM  25 May 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9041,2,1,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9041,2,2,0)
 ;;=Enter 'NO' to compare and display the two entries.
 ;;^UTILITY(U,$J,.84,9041,2,3,0)
 ;;=Enter 'YES' to choose valid fields from each entry then merge into the
 ;;^UTILITY(U,$J,.84,9041,2,4,0)
 ;;=record selected as the default.
 ;;^UTILITY(U,$J,.84,9041,2,5,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9041,2,6,0)
 ;;=If you merge two entries within a file that is pointed-to by many other
 ;;^UTILITY(U,$J,.84,9041,2,7,0)
 ;;=files (such as the PATIENT file), then the re-pointing process can be time
 ;;^UTILITY(U,$J,.84,9041,2,8,0)
 ;;=consuming and can create many tasked jobs.
 ;;^UTILITY(U,$J,.84,9101,0)
 ;;=9101^3^^5
 ;;^UTILITY(U,$J,.84,9101,1,0)
 ;;=^^1^1^2930810^
 ;;^UTILITY(U,$J,.84,9101,1,1,0)
 ;;=The "CHOOSE FROM:" prompt.
 ;;^UTILITY(U,$J,.84,9101,2,0)
 ;;=^^1^1^2930908^^
 ;;^UTILITY(U,$J,.84,9101,2,1,0)
 ;;=Choose from:
 ;;^UTILITY(U,$J,.84,9103,0)
 ;;=9103^3^^5
 ;;^UTILITY(U,$J,.84,9103,1,0)
 ;;=^^2^2^2930810^^
 ;;^UTILITY(U,$J,.84,9103,1,1,0)
 ;;=First line of Variable Pointer help that shows the Prefixes and Messages
 ;;^UTILITY(U,$J,.84,9103,1,2,0)
 ;;=for a field.
 ;;^UTILITY(U,$J,.84,9103,2,0)
 ;;=^^1^1^2930810^
 ;;^UTILITY(U,$J,.84,9103,2,1,0)
 ;;=Enter one of the following:
 ;;^UTILITY(U,$J,.84,9105,0)
 ;;=9105^3^y^5
 ;;^UTILITY(U,$J,.84,9105,1,0)
 ;;=^^2^2^2931229^
 ;;^UTILITY(U,$J,.84,9105,1,1,0)
 ;;=The beginning of the help text used to give list of fields that can
 ;;^UTILITY(U,$J,.84,9105,1,2,0)
 ;;=be used for a look-up.
 ;;^UTILITY(U,$J,.84,9105,2,0)
 ;;=^^1^1^2931229^
 ;;^UTILITY(U,$J,.84,9105,2,1,0)
 ;;=Answer with |1|.
 ;;^UTILITY(U,$J,.84,9105,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9105,3,1,0)
 ;;=1^File name and list of fields that can be used for look-up.
 ;;^UTILITY(U,$J,.84,9105,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9105,5,1,0)
 ;;=DIE^HELP
 ;;^UTILITY(U,$J,.84,9107,0)
 ;;=9107^3^y^5
 ;;^UTILITY(U,$J,.84,9107,1,0)
 ;;=^^1^1^2940513^
 ;;^UTILITY(U,$J,.84,9107,1,1,0)
 ;;=LAYGO allowed.
 ;;^UTILITY(U,$J,.84,9107,2,0)
 ;;=^^1^1^2940513^
 ;;^UTILITY(U,$J,.84,9107,2,1,0)
 ;;=You may enter a new |1| if you wish.
 ;;^UTILITY(U,$J,.84,9107,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9107,3,1,0)
 ;;=1^File Name.
 ;;^UTILITY(U,$J,.84,9110,0)
 ;;=9110^3^y^5
 ;;^UTILITY(U,$J,.84,9110,1,0)
 ;;=^^1^1^2990323^^^^
 ;;^UTILITY(U,$J,.84,9110,1,1,0)
 ;;=Instructions for entering date data.
 ;;^UTILITY(U,$J,.84,9110,2,0)
 ;;=^^7^7^2990323^^^
 ;;^UTILITY(U,$J,.84,9110,2,1,0)
 ;;=Examples of Valid Dates:
 ;;^UTILITY(U,$J,.84,9110,2,2,0)
 ;;=   JAN 20 1957 or 20 JAN 57 or 1/20/57 |1|
 ;;^UTILITY(U,$J,.84,9110,2,3,0)
 ;;=   T   (for TODAY),  T+1 (for TOMORROW),  T+2,  T+7, etc.
 ;;^UTILITY(U,$J,.84,9110,2,4,0)
 ;;=   T-1 (for YESTERDAY),  T-3W (for 3 WEEKS AGO), etc.
 ;;^UTILITY(U,$J,.84,9110,2,5,0)
 ;;=If the year is omitted, the computer |2|
 ;;^UTILITY(U,$J,.84,9110,2,6,0)
 ;;=|3|
 ;;^UTILITY(U,$J,.84,9110,2,7,0)
 ;;=|4|
 ;;^UTILITY(U,$J,.84,9110,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,9110,3,1,0)
 ;;=1^If numeric dates are allowed, " or 012057" is written.
 ;;^UTILITY(U,$J,.84,9110,3,2,0)
 ;;=2^Conditionally, indicates if past, future, or current year is assumed.
 ;;^UTILITY(U,$J,.84,9110,3,3,0)
 ;;=3^Conditionally indicates the way FileMan determines century to use if 2 digit year is provided, or indicates that day is not needed if past or future year assumed.
 ;;^UTILITY(U,$J,.84,9110,3,4,0)
 ;;=4^Conditionally, indicates that day is not needed (unless past or future date is assumed, in which case this information goes into parameter 3).
 ;;^UTILITY(U,$J,.84,9110,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110,5,1,0)
 ;;=DIEH1^DT
 ;;^UTILITY(U,$J,.84,9110.7,0)
 ;;=9110.7^3^y^5^Instructions for entering date data.
 ;;^UTILITY(U,$J,.84,9110.7,1,0)
 ;;=^.842^1^1^3010525^^^^
 ;;^UTILITY(U,$J,.84,9110.7,1,1,0)
 ;;=Instructions for entering date data, when the "M" flag is used.
 ;;^UTILITY(U,$J,.84,9110.7,2,0)
 ;;=^.844^8^8^3010525^^^
 ;;^UTILITY(U,$J,.84,9110.7,2,1,0)
 ;;=Examples of Valid Dates:
 ;;^UTILITY(U,$J,.84,9110.7,2,2,0)
 ;;=  JAN 1957 or JAN 57 |1|
 ;;^UTILITY(U,$J,.84,9110.7,2,3,0)
 ;;=  T    (for this month)
 ;;^UTILITY(U,$J,.84,9110.7,2,4,0)
 ;;=  T+3M (for 3 months in the future)
 ;;^UTILITY(U,$J,.84,9110.7,2,5,0)
 ;;=  T-3M (for 3 months ago)
 ;;^UTILITY(U,$J,.84,9110.7,2,6,0)
 ;;=Only month and year are accepted. You must omit the precise day.
 ;;^UTILITY(U,$J,.84,9110.7,2,7,0)
 ;;=If the year is omitted, the computer |2|
 ;;^UTILITY(U,$J,.84,9110.7,2,8,0)
 ;;=|3|
 ;;^UTILITY(U,$J,.84,9110.7,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9110.7,3,1,0)
 ;;=1^If numeric dates are allowed, " or 0157" is written.
 ;;^UTILITY(U,$J,.84,9110.7,3,2,0)
 ;;=2^Conditionally, indicates if past, future, or current year is assumed.
 ;;^UTILITY(U,$J,.84,9110.7,3,3,0)
 ;;=3^Conditionally indicates the way FileMan determines century to use if 2 digit year is provided.
 ;;^UTILITY(U,$J,.84,9110.7,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.7,5,1,0)
 ;;=DIEH1^DT
 ;;^UTILITY(U,$J,.84,9111,0)
 ;;=9111^3^y^5
 ;;^UTILITY(U,$J,.84,9111,1,0)
 ;;=^^1^1^2930806^
 ;;^UTILITY(U,$J,.84,9111,1,1,0)
 ;;=Instructions for entering time data.
 ;;^UTILITY(U,$J,.84,9111,2,0)
 ;;=^^5^5^2931104^^
 ;;^UTILITY(U,$J,.84,9111,2,1,0)
 ;;=If the date is omitted, the current date is assumed.
 ;;^UTILITY(U,$J,.84,9111,2,2,0)
 ;;=Follow the date with a time, such as JAN 20@10, T@10AM, 10:30, etc.
 ;;^UTILITY(U,$J,.84,9111,2,3,0)
 ;;=You may enter NOON, MIDNIGHT, or NOW to indicate the time.
 ;;^UTILITY(U,$J,.84,9111,2,4,0)
 ;;=|1|
 ;;^UTILITY(U,$J,.84,9111,2,5,0)
 ;;=|2|
 ;;^UTILITY(U,$J,.84,9111,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9111,3,1,0)
 ;;=1^Conditionally, give instructions for entering seconds.
 ;;^UTILITY(U,$J,.84,9111,3,2,0)
 ;;=2^Conditionally, state that time is required.
 ;;^UTILITY(U,$J,.84,9115,0)
 ;;=9115^3^^5
 ;;^UTILITY(U,$J,.84,9115,1,0)
 ;;=^^1^1^2930810^
 ;;^UTILITY(U,$J,.84,9115,1,1,0)
 ;;=The short help for variable pointers.
 ;;^UTILITY(U,$J,.84,9115,2,0)
 ;;=^^1^1^2930810^
 ;;^UTILITY(U,$J,.84,9115,2,1,0)
 ;;=To see the entries in any particular file, type <Prefix.?>.
 ;;^UTILITY(U,$J,.84,9116,0)
 ;;=9116^3^^5
 ;;^UTILITY(U,$J,.84,9116,1,0)
 ;;=^^1^1^2930810^
 ;;^UTILITY(U,$J,.84,9116,1,1,0)
 ;;=Long help for variable pointers.
 ;;^UTILITY(U,$J,.84,9116,2,0)
 ;;=^^15^15^2930810^
 ;;^UTILITY(U,$J,.84,9116,2,1,0)
 ;;=If you enter just a name, the system will search each of the 
 ;;^UTILITY(U,$J,.84,9116,2,2,0)
 ;;=above files for the name you have entered.  If a match is found,
 ;;^UTILITY(U,$J,.84,9116,2,3,0)
 ;;=the system will ask you if it is the entry you desire.
 ;;^UTILITY(U,$J,.84,9116,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9116,2,5,0)
 ;;=However, if you know the file the entry should be in, you can
 ;;^UTILITY(U,$J,.84,9116,2,6,0)
 ;;=speed processing by using the following syntax to select an entry:
 ;;^UTILITY(U,$J,.84,9116,2,7,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9116,2,8,0)
 ;;=     <Prefix>.<entry name>
 ;;^UTILITY(U,$J,.84,9116,2,9,0)
 ;;=             or
 ;;^UTILITY(U,$J,.84,9116,2,10,0)
 ;;=     <Message>.<entry name>
 ;;^UTILITY(U,$J,.84,9116,2,11,0)
 ;;=             or
 ;;^UTILITY(U,$J,.84,9116,2,12,0)
 ;;=     <File Name>.<entry name>
 ;;^UTILITY(U,$J,.84,9116,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9116,2,14,0)
 ;;=You do not need to enter the entire file name or message.
 ;;^UTILITY(U,$J,.84,9116,2,15,0)
 ;;=The first few characters will suffice.
 ;;^UTILITY(U,$J,.84,9117,0)
 ;;=9117^3^y^5
 ;;^UTILITY(U,$J,.84,9117,1,0)
 ;;=^^1^1^2930810^^
 ;;^UTILITY(U,$J,.84,9117,1,1,0)
 ;;=Variable pointer help - prefix and message.
 ;;^UTILITY(U,$J,.84,9117,2,0)
 ;;=^^1^1^2930810^^^
 ;;^UTILITY(U,$J,.84,9117,2,1,0)
 ;;=|1|.EntryName to select a |2|.
 ;;^UTILITY(U,$J,.84,9117,3,0)
 ;;=^.845^2^2

DINIT00P
DINIT00P ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 11DEC2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9117,3,1,0)
 ;;=1^The prefix for a variable pointer file.
 ;;^UTILITY(U,$J,.84,9117,3,2,0)
 ;;=2^The message for a variable pointer file.
 ;;^UTILITY(U,$J,.84,9201,0)
 ;;=9201^3^^5
 ;;^UTILITY(U,$J,.84,9201,1,0)
 ;;=^^1^1^2950511^^
 ;;^UTILITY(U,$J,.84,9201,1,1,0)
 ;;=Browser help
 ;;^UTILITY(U,$J,.84,9201,2,-1,"DATE")
 ;;=62796,32024
 ;;^UTILITY(U,$J,.84,9201,2,-1,"TITLE")
 ;;=9201
 ;;^UTILITY(U,$J,.84,9201,2,0)
 ;;=^^221^221^3121205^
 ;;^UTILITY(U,$J,.84,9201,2,1,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9201,2,2,0)
 ;;=                                 HELP SUMMARY
 ;;^UTILITY(U,$J,.84,9201,2,3,0)
 ;;=                                 ============
 ;;^UTILITY(U,$J,.84,9201,2,4,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9201,2,5,0)
 ;;=NAVIGATION:
 ;;^UTILITY(U,$J,.84,9201,2,6,0)
 ;;============
 ;;^UTILITY(U,$J,.84,9201,2,7,0)
 ;;=     Scroll Down (one line)                  ARROW DOWN
 ;;^UTILITY(U,$J,.84,9201,2,8,0)
 ;;=     Scroll Up (one line)                    ARROW UP
 ;;^UTILITY(U,$J,.84,9201,2,9,0)
 ;;=     Page Down                               <F1>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9201,2,10,0)
 ;;=     Page Up                                 <F1>ARROW UP
 ;;^UTILITY(U,$J,.84,9201,2,11,0)
 ;;=     Scroll Right (default 22 columns)       ARROW RIGHT
 ;;^UTILITY(U,$J,.84,9201,2,12,0)
 ;;=     Scroll Left (default 22 columns)        ARROW LEFT
 ;;^UTILITY(U,$J,.84,9201,2,13,0)
 ;;=     Scroll Horizontally to the end          <F1>ARROW RIGHT
 ;;^UTILITY(U,$J,.84,9201,2,14,0)
 ;;=     Scroll Horizontally to the end          <F1>ARROW LEFT
 ;;^UTILITY(U,$J,.84,9201,2,15,0)
 ;;=     Jump to the Top                         <F1>T
 ;;^UTILITY(U,$J,.84,9201,2,16,0)
 ;;=     Jump to the Bottom                      <F1>B
 ;;^UTILITY(U,$J,.84,9201,2,17,0)
 ;;=     Goto                                    <F1>G
 ;;^UTILITY(U,$J,.84,9201,2,18,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9201,2,19,0)
 ;;=SEARCH:
 ;;^UTILITY(U,$J,.84,9201,2,20,0)
 ;;========
 ;;^UTILITY(U,$J,.84,9201,2,21,0)
 ;;=     Find text                               <F1>F
 ;;^UTILITY(U,$J,.84,9201,2,22,0)
 ;;=     Next (occurrence)                       <F1>N
 ;;^UTILITY(U,$J,.84,9201,2,23,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9201,2,24,0)
 ;;=     Direction-terminate find text with:
 ;;^UTILITY(U,$J,.84,9201,2,25,0)
 ;;=     -----------------------------------
 ;;^UTILITY(U,$J,.84,9201,2,26,0)
 ;;=     Down                                    ARROW DOWN
 ;;^UTILITY(U,$J,.84,9201,2,27,0)
 ;;=     Up                                      ARROW UP
 ;;^UTILITY(U,$J,.84,9201,2,28,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9201,2,29,0)
 ;;=BRANCH:
 ;;^UTILITY(U,$J,.84,9201,2,30,0)
 ;;========
 ;;^UTILITY(U,$J,.84,9201,2,31,0)
 ;;=     Switch to another document              <F1>S
 ;;^UTILITY(U,$J,.84,9201,2,32,0)
 ;;=     Return to previous document(s)          R
 ;;^UTILITY(U,$J,.84,9201,2,33,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9201,2,34,0)
 ;;=SCREEN:
 ;;^UTILITY(U,$J,.84,9201,2,35,0)
 ;;========
 ;;^UTILITY(U,$J,.84,9201,2,36,0)
 ;;=     Repaint screen                          <F1>P
 ;;^UTILITY(U,$J,.84,9201,2,37,0)
 ;;=     Print document                          <F1><F1>P
 ;;^UTILITY(U,$J,.84,9201,2,38,0)
 ;;=     Split screen                            <F2>S
 ;;^UTILITY(U,$J,.84,9201,2,39,0)
 ;;=     restore Full screen                     <F2>F
 ;;^UTILITY(U,$J,.84,9201,2,40,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,41,0)
 ;;=     Split Screen Mode Navigation:
 ;;^UTILITY(U,$J,.84,9201,2,42,0)
 ;;=     -----------------------------
 ;;^UTILITY(U,$J,.84,9201,2,43,0)
 ;;=     Navigate to bottom screen              <F2>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9201,2,44,0)
 ;;=     Navigate to top screen                 <F2>ARROW UP
 ;;^UTILITY(U,$J,.84,9201,2,45,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,46,0)
 ;;=     Resize Split Screen:
 ;;^UTILITY(U,$J,.84,9201,2,47,0)
 ;;=     --------------------
 ;;^UTILITY(U,$J,.84,9201,2,48,0)
 ;;=     Top/Bottom screen larger/smaller       <F2><F2>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9201,2,49,0)
 ;;=     Bottom/Top screen larger/smaller       <F2><F2>ARROW UP
 ;;^UTILITY(U,$J,.84,9201,2,50,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,51,0)
 ;;=CLIPBOARD:
 ;;^UTILITY(U,$J,.84,9201,2,52,0)
 ;;===========
 ;;^UTILITY(U,$J,.84,9201,2,53,0)
 ;;=     Copy to VA FileMan's Clipboard         <F1>C
 ;;^UTILITY(U,$J,.84,9201,2,54,0)
 ;;=     View VA FileMan's Clipboard            <F1>V
 ;;^UTILITY(U,$J,.84,9201,2,55,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,56,0)
 ;;=TITLE BAR:
 ;;^UTILITY(U,$J,.84,9201,2,57,0)
 ;;===========
 ;;^UTILITY(U,$J,.84,9201,2,58,0)
 ;;=     Change content of title bar,           <F1><F1>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9201,2,59,0)
 ;;=     Or                                     <F1><F1>ARROW UP
 ;;^UTILITY(U,$J,.84,9201,2,60,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,61,0)
 ;;=HELP:
 ;;^UTILITY(U,$J,.84,9201,2,62,0)
 ;;======
 ;;^UTILITY(U,$J,.84,9201,2,63,0)
 ;;=     Browse Key Summary                     <F1>H
 ;;^UTILITY(U,$J,.84,9201,2,64,0)
 ;;=     More Help                              <F1><F1>H
 ;;^UTILITY(U,$J,.84,9201,2,65,0)
 ;;=     Print this help text                   <F1><F1><F1>H
 ;;^UTILITY(U,$J,.84,9201,2,66,0)
 ;;=     To Return to document from this help   R
 ;;^UTILITY(U,$J,.84,9201,2,67,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,68,0)
 ;;=EXIT:
 ;;^UTILITY(U,$J,.84,9201,2,69,0)
 ;;======
 ;;^UTILITY(U,$J,.84,9201,2,70,0)
 ;;=     Exit Browser or help text              <F1>E or "EXIT"
 ;;^UTILITY(U,$J,.84,9201,2,71,0)
 ;;=     Quit                                   <F1>Q or <Ctrl-E>
 ;;^UTILITY(U,$J,.84,9201,2,72,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,73,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,74,0)
 ;;=                                  MORE HELP
 ;;^UTILITY(U,$J,.84,9201,2,75,0)
 ;;=                                  =========
 ;;^UTILITY(U,$J,.84,9201,2,76,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,77,0)
 ;;=     To EXIT the VA FileMan Browser, press <F1> followed by the letter
 ;;^UTILITY(U,$J,.84,9201,2,78,0)
 ;;=     'E'.  This is also true for this HELP document which is being
 ;;^UTILITY(U,$J,.84,9201,2,79,0)
 ;;=     presented by the Browser.
 ;;^UTILITY(U,$J,.84,9201,2,80,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,81,0)
 ;;=     To SCROLL DOWN one line at a time, press the ARROW DOWN key.
 ;;^UTILITY(U,$J,.84,9201,2,82,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,83,0)
 ;;=     To SCROLL UP one line at a time, press the ARROW UP key.
 ;;^UTILITY(U,$J,.84,9201,2,84,0)
 ;;=

DINIT00Q
DINIT00Q ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;11:33 AM  5 Dec 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 19
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9201,2,85,0)
 ;;=     To SCROLL RIGHT, press the ARROW RIGHT key.
 ;;^UTILITY(U,$J,.84,9201,2,86,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,87,0)
 ;;=     To SCROLL LEFT, press the ARROW LEFT key.
 ;;^UTILITY(U,$J,.84,9201,2,88,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,89,0)
 ;;=     Try pressing these keys at this time and observe the behavior. Get a
 ;;^UTILITY(U,$J,.84,9201,2,90,0)
 ;;=     feel for 'browsing' through a document.  Press the arrow down key a
 ;;^UTILITY(U,$J,.84,9201,2,91,0)
 ;;=     few times, then press the arrow up key.  Also notice that the 'Line>'
 ;;^UTILITY(U,$J,.84,9201,2,92,0)
 ;;=     and 'Screen>' indicator numbers are changing. To see more of this
 ;;^UTILITY(U,$J,.84,9201,2,93,0)
 ;;=     text keep pressing the ARROW DOWN key.  Now try the arrow right key,
 ;;^UTILITY(U,$J,.84,9201,2,94,0)
 ;;=     then the arrow left key.  Notice that the 'Col>' indicator number is
 ;;^UTILITY(U,$J,.84,9201,2,95,0)
 ;;=     also changing.  This shows what column the left most edge of the
 ;;^UTILITY(U,$J,.84,9201,2,96,0)
 ;;=     document is on.  As you can see, the VA FileMan Browser is like a
 ;;^UTILITY(U,$J,.84,9201,2,97,0)
 ;;=     window placed over a document. You are in control of this window
 ;;^UTILITY(U,$J,.84,9201,2,98,0)
 ;;=     which moves over the document by pressing the functional key
 ;;^UTILITY(U,$J,.84,9201,2,99,0)
 ;;=     sequences.  Here are a few more functions.
 ;;^UTILITY(U,$J,.84,9201,2,100,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,101,0)
 ;;=     To PAGE DOWN one screen at one time, press the NEXT SCREEN key, PAGE
 ;;^UTILITY(U,$J,.84,9201,2,102,0)
 ;;=     DOWN or F1 followed by the ARROW DOWN key, depending on what kind of
 ;;^UTILITY(U,$J,.84,9201,2,103,0)
 ;;=     CRT or workstation that is being used.
 ;;^UTILITY(U,$J,.84,9201,2,104,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,105,0)
 ;;=     To PAGE UP one screen at one time, press the PREV SCREEN key, PAGE UP
 ;;^UTILITY(U,$J,.84,9201,2,106,0)
 ;;=     or F1 followed by the ARROW UP key, depending on what kind of CRT or
 ;;^UTILITY(U,$J,.84,9201,2,107,0)
 ;;=     workstation that is being used.
 ;;^UTILITY(U,$J,.84,9201,2,108,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,109,0)
 ;;=     To return to the TOP, back to the beginning of the document, press
 ;;^UTILITY(U,$J,.84,9201,2,110,0)
 ;;=     the <F1> key followed by the letter 'T'.
 ;;^UTILITY(U,$J,.84,9201,2,111,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,112,0)
 ;;=     To go to the BOTTOM, end of the document, press the <F1> key
 ;;^UTILITY(U,$J,.84,9201,2,113,0)
 ;;=     followed by the letter 'B'.
 ;;^UTILITY(U,$J,.84,9201,2,114,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,115,0)
 ;;=     To GOTO a specific screen, line or column press the <F1> key
 ;;^UTILITY(U,$J,.84,9201,2,116,0)
 ;;=     followed by the letter 'G'.  This will cause a prompt to be displayed
 ;;^UTILITY(U,$J,.84,9201,2,117,0)
 ;;=     where a screen, line or column number can be entered preceded by a
 ;;^UTILITY(U,$J,.84,9201,2,118,0)
 ;;=     'S' , 'L' or 'C'.  The default is screen, meaning that the 'S' is
 ;;^UTILITY(U,$J,.84,9201,2,119,0)
 ;;=     optional when entering a screen number.  10 or S10 will go to screen
 ;;^UTILITY(U,$J,.84,9201,2,120,0)
 ;;=     10, if screen 10 is a valid screen.  L99 will go to line 99 and C33
 ;;^UTILITY(U,$J,.84,9201,2,121,0)
 ;;=     will go to column 33.
 ;;^UTILITY(U,$J,.84,9201,2,122,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,123,0)
 ;;=     To FIND a string of characters, on a line, press the <F1> key
 ;;^UTILITY(U,$J,.84,9201,2,124,0)
 ;;=     followed by the letter 'F' or 'FIND' key.  A prompt will appear where
 ;;^UTILITY(U,$J,.84,9201,2,125,0)
 ;;=     a search string of characters can be entered.  The Find facility will
 ;;^UTILITY(U,$J,.84,9201,2,126,0)
 ;;=     search the document and immediately stop when it finds a match and
 ;;^UTILITY(U,$J,.84,9201,2,127,0)
 ;;=     'Goto' the line/screen.  The matched text will be highlighted in
 ;;^UTILITY(U,$J,.84,9201,2,128,0)
 ;;=     reverse video, if available, so it can be found easily.  However, if
 ;;^UTILITY(U,$J,.84,9201,2,129,0)
 ;;=     a string contains two or more words, matching will only be done if
 ;;^UTILITY(U,$J,.84,9201,2,130,0)
 ;;=     the words are found on the same line.  The default direction of the
 ;;^UTILITY(U,$J,.84,9201,2,131,0)
 ;;=     search is down.  This can be controlled by using the ARROW UP or
 ;;^UTILITY(U,$J,.84,9201,2,132,0)
 ;;=     ARROW DOWN keys instead of the <Enter> key to terminate the search
 ;;^UTILITY(U,$J,.84,9201,2,133,0)
 ;;=     string.
 ;;^UTILITY(U,$J,.84,9201,2,134,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,135,0)
 ;;=     To, NEXT FIND, find the next occurrence of the same search string,
 ;;^UTILITY(U,$J,.84,9201,2,136,0)
 ;;=     press the letter 'N' or <F1> followed by the letter 'N'. The FIND
 ;;^UTILITY(U,$J,.84,9201,2,137,0)
 ;;=     facility keeps track of the last find string including the direction
 ;;^UTILITY(U,$J,.84,9201,2,138,0)
 ;;=     and continues searching through the document and brings up the next
 ;;^UTILITY(U,$J,.84,9201,2,139,0)
 ;;=     screen.  If no match is found a message appears indicating this and
 ;;^UTILITY(U,$J,.84,9201,2,140,0)
 ;;=     the screen is repainted at it's original location.
 ;;^UTILITY(U,$J,.84,9201,2,141,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,142,0)
 ;;=     To rePAINT the screen, press the <F1> key followed by the letter
 ;;^UTILITY(U,$J,.84,9201,2,143,0)
 ;;=     'P'.
 ;;^UTILITY(U,$J,.84,9201,2,144,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,145,0)
 ;;=     To PRINT the document on the screen, press the <F1><F1> followed by
 ;;^UTILITY(U,$J,.84,9201,2,146,0)
 ;;=     the letter 'P'. You will be prompted whether to print a header on
 ;;^UTILITY(U,$J,.84,9201,2,147,0)
 ;;=     each page, whether to wrap the text and interpret wp windows (|), 
 ;;^UTILITY(U,$J,.84,9201,2,148,0)
 ;;=     and for a DEVICE to print to.
 ;;^UTILITY(U,$J,.84,9201,2,149,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,150,0)
 ;;=     To SWITCH to another document press the <F1> key followed by the
 ;;^UTILITY(U,$J,.84,9201,2,151,0)
 ;;=     letter 'S'.  This will allow the selection of another file, (wp)field
 ;;^UTILITY(U,$J,.84,9201,2,152,0)
 ;;=     and entry.  The document is put on an active list and Browse
 ;;^UTILITY(U,$J,.84,9201,2,153,0)
 ;;=     switches to the newly selected document.  Subsequent use of Switch
 ;;^UTILITY(U,$J,.84,9201,2,154,0)
 ;;=     will allow choosing from the active list if desired or branch to
 ;;^UTILITY(U,$J,.84,9201,2,155,0)
 ;;=     select file, (wp)field and entry prompts. This function CAN BE
 ;;^UTILITY(U,$J,.84,9201,2,156,0)
 ;;=     RESTRICTED depending on how the running application calls the Browser
 ;;^UTILITY(U,$J,.84,9201,2,157,0)
 ;;=     utility.
 ;;^UTILITY(U,$J,.84,9201,2,158,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,159,0)
 ;;=     To RETURN to the previous document after using Switch or Help, press

DINIT00R
DINIT00R ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;11:34 AM  5 Dec 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 19
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9201,2,160,0)
 ;;=     'R'.  A separate list keeps track of the documents chosen during the
 ;;^UTILITY(U,$J,.84,9201,2,161,0)
 ;;=     current Browse session.  R will return all the way back to the very
 ;;^UTILITY(U,$J,.84,9201,2,162,0)
 ;;=     first document when used repeatedly.
 ;;^UTILITY(U,$J,.84,9201,2,163,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,164,0)
 ;;=     To COPY text to VA FileMan's Clipboard, press <F1> followed by the
 ;;^UTILITY(U,$J,.84,9201,2,165,0)
 ;;=     letter C.  A prompt will appear where a range of lines can be entered
 ;;^UTILITY(U,$J,.84,9201,2,166,0)
 ;;=     separated with a colon (:), or wild card such as (*), to copy the
 ;;^UTILITY(U,$J,.84,9201,2,167,0)
 ;;=     entire text.  If the letter 'A' is appended, the text will be
 ;;^UTILITY(U,$J,.84,9201,2,168,0)
 ;;=     appended to the existing content of the VA FileMan Clipboard, when
 ;;^UTILITY(U,$J,.84,9201,2,169,0)
 ;;=     applicable.  The text in the clipboard may then be retrieved by VA
 ;;^UTILITY(U,$J,.84,9201,2,170,0)
 ;;=     FileMan's Screen Editor.
 ;;^UTILITY(U,$J,.84,9201,2,171,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,172,0)
 ;;=     To VIEW the content of the VA FileMan's Clipboard, press <F1>
 ;;^UTILITY(U,$J,.84,9201,2,173,0)
 ;;=     followed by the letter V.  A new Browser screen appears, which
 ;;^UTILITY(U,$J,.84,9201,2,174,0)
 ;;=     displays the text.  Many functions are restricted, when in the 'View
 ;;^UTILITY(U,$J,.84,9201,2,175,0)
 ;;=     Clipboard' mode.
 ;;^UTILITY(U,$J,.84,9201,2,176,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,177,0)
 ;;=     To SPLIT SCREEN, while in Full (Browse Region) Screen mode, press
 ;;^UTILITY(U,$J,.84,9201,2,178,0)
 ;;=     <F2> followed by the letter 'S'.  This causes the screen to split
 ;;^UTILITY(U,$J,.84,9201,2,179,0)
 ;;=     into two separate scroll regions.
 ;;^UTILITY(U,$J,.84,9201,2,180,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,181,0)
 ;;=     To navigate to the bottom screen, while in Split Screen mode, press
 ;;^UTILITY(U,$J,.84,9201,2,182,0)
 ;;=     <F2> followed by pressing the ARROW DOWN key.
 ;;^UTILITY(U,$J,.84,9201,2,183,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,184,0)
 ;;=     To navigate to the top screen, while in Split Screen mode, press
 ;;^UTILITY(U,$J,.84,9201,2,185,0)
 ;;=     <F2> followed by pressing the ARROW UP key.
 ;;^UTILITY(U,$J,.84,9201,2,186,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,187,0)
 ;;=     To return to FULL SCREEN mode, while in Split Screen mode, press
 ;;^UTILITY(U,$J,.84,9201,2,188,0)
 ;;=     <F2> followed by the letter 'F'.  This causes the entire browse
 ;;^UTILITY(U,$J,.84,9201,2,189,0)
 ;;=     region to return to one Full (Browse) Screen scroll region.
 ;;^UTILITY(U,$J,.84,9201,2,190,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,191,0)
 ;;=     To RESIZE screens, while in Split Screen mode, press <F2><F2>
 ;;^UTILITY(U,$J,.84,9201,2,192,0)
 ;;=     followed by the ARROW UP key.  This makes the top window smaller and
 ;;^UTILITY(U,$J,.84,9201,2,193,0)
 ;;=     the bottom window larger.  <F2><F2> followed by the ARROW DOWN key
 ;;^UTILITY(U,$J,.84,9201,2,194,0)
 ;;=     makes the top window larger and the bottom window smaller.
 ;;^UTILITY(U,$J,.84,9201,2,195,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,196,0)
 ;;=     The TITLE BAR, at the top, is a non scrolling region which contains
 ;;^UTILITY(U,$J,.84,9201,2,197,0)
 ;;=     static information, while browsing in the selected document.  The
 ;;^UTILITY(U,$J,.84,9201,2,198,0)
 ;;=     title bar information only changes when switching documents or
 ;;^UTILITY(U,$J,.84,9201,2,199,0)
 ;;=     requesting help.  To move text header into the Title Bar, one line at
 ;;^UTILITY(U,$J,.84,9201,2,200,0)
 ;;=     a time, press <F1><F1>ARROW DOWN or <F1><F1>ARROW UP.  This
 ;;^UTILITY(U,$J,.84,9201,2,201,0)
 ;;=     replaces the text in the Title Bar with the content of the text in
 ;;^UTILITY(U,$J,.84,9201,2,202,0)
 ;;=     the scroll region, one line at a time.  This can be usefull, when
 ;;^UTILITY(U,$J,.84,9201,2,203,0)
 ;;=     Browser is called via the Device Handler (Browser Device), for
 ;;^UTILITY(U,$J,.84,9201,2,204,0)
 ;;=     Browsing through standard VA FileMan Prints.  This allows a user to
 ;;^UTILITY(U,$J,.84,9201,2,205,0)
 ;;=     move the field headers into the Title Bar.
 ;;^UTILITY(U,$J,.84,9201,2,206,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,207,0)
 ;;=     The STATUS BAR, at the bottom, is also a non scroll region.  It shows
 ;;^UTILITY(U,$J,.84,9201,2,208,0)
 ;;=     the column indicator, how to get help, how to exit, line information
 ;;^UTILITY(U,$J,.84,9201,2,209,0)
 ;;=     and screen information.  The "Col>" indicates the column number the
 ;;^UTILITY(U,$J,.84,9201,2,210,0)
 ;;=     left edge of the browse window is over in the document.  The "Line>"
 ;;^UTILITY(U,$J,.84,9201,2,211,0)
 ;;=     shows the current line at the bottom of the scroll region and the
 ;;^UTILITY(U,$J,.84,9201,2,212,0)
 ;;=     total number of lines in the document.  The "Screen>" shows the
 ;;^UTILITY(U,$J,.84,9201,2,213,0)
 ;;=     current screen and the total number of screens in the document.
 ;;^UTILITY(U,$J,.84,9201,2,214,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,215,0)
 ;;=     The SCROLLING REGION, between the TITLE BAR and the STATUS BAR, is
 ;;^UTILITY(U,$J,.84,9201,2,216,0)
 ;;=     where the Browser displays the text being viewed.
 ;;^UTILITY(U,$J,.84,9201,2,217,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,218,0)
 ;;=     To print the help text, press <F1><F1><F1>H.  This will prompt for
 ;;^UTILITY(U,$J,.84,9201,2,219,0)
 ;;=     a Device.  Only valid print devices can be selected.
 ;;^UTILITY(U,$J,.84,9201,2,220,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9201,2,221,0)
 ;;=     <<<Press 'R' or <F1>'E' to exit this help document>>>
 ;;^UTILITY(U,$J,.84,9202,0)
 ;;=9202^3^^5
 ;;^UTILITY(U,$J,.84,9202,1,0)
 ;;=^^1^1^2950511^^^
 ;;^UTILITY(U,$J,.84,9202,1,1,0)
 ;;=Browser help text, for hypertext mode.
 ;;^UTILITY(U,$J,.84,9202,2,-1,"DATE")
 ;;=62796,32034
 ;;^UTILITY(U,$J,.84,9202,2,-1,"TITLE")
 ;;=9202
 ;;^UTILITY(U,$J,.84,9202,2,0)
 ;;=^^127^127^3121205^^
 ;;^UTILITY(U,$J,.84,9202,2,1,0)
 ;;=VA FileMan Browser Help for Hypertext Mode
 ;;^UTILITY(U,$J,.84,9202,2,2,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9202,2,3,0)
 ;;=Hypertext jumps are represented in 'bold' text. Press the Tab or 'Q' keys to
 ;;^UTILITY(U,$J,.84,9202,2,4,0)
 ;;=navigate forward and backward, in order to select a jump. Once a jump is

DINIT00S
DINIT00S ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;7:41 AM  6 Dec 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 19
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9202,2,5,0)
 ;;=selected, pressing the arrow right key causes the jump to occur. To return to
 ;;^UTILITY(U,$J,.84,9202,2,6,0)
 ;;=the previous jump location from the jump, press the arrow left key. On the
 ;;^UTILITY(U,$J,.84,9202,2,7,0)
 ;;=return, the selected hypertext represent the previous jump made.
 ;;^UTILITY(U,$J,.84,9202,2,8,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,9,0)
 ;;=To EXIT the VA FileMan Browser, in hypertext mode, press <F1> followed by the
 ;;^UTILITY(U,$J,.84,9202,2,10,0)
 ;;=letter 'E'. This is also true for this HELP document which is being presented
 ;;^UTILITY(U,$J,.84,9202,2,11,0)
 ;;=by the Browser, in hypertext mode. Pressing the letter 'R', returns the Browser
 ;;^UTILITY(U,$J,.84,9202,2,12,0)
 ;;=to the hypertext document.
 ;;^UTILITY(U,$J,.84,9202,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,14,0)
 ;;=For help, select, using TAB and press ARROW RIGHT to jump:
 ;;^UTILITY(U,$J,.84,9202,2,15,0)
 ;;=     * $.%#NAVIGATION^Navigation$.%
 ;;^UTILITY(U,$J,.84,9202,2,16,0)
 ;;=     * $.%#SEARCH^Search$.%
 ;;^UTILITY(U,$J,.84,9202,2,17,0)
 ;;=     * $.%#SCREEN^Screen$.%
 ;;^UTILITY(U,$J,.84,9202,2,18,0)
 ;;=     * $.%#CLIPBOARD^Clipboard$.%
 ;;^UTILITY(U,$J,.84,9202,2,19,0)
 ;;=     * $.%#HELP^Help$.%
 ;;^UTILITY(U,$J,.84,9202,2,20,0)
 ;;=     * $.%#EXIT^Exit$.%
 ;;^UTILITY(U,$J,.84,9202,2,21,0)
 ;;=     * $.%#MORE_HELP^More Help$.%
 ;;^UTILITY(U,$J,.84,9202,2,22,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,23,0)
 ;;=  ---------------------------------------------------------------------------
 ;;^UTILITY(U,$J,.84,9202,2,24,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,25,0)
 ;;=$.$NAVIGATION$.$NAVIGATION:
 ;;^UTILITY(U,$J,.84,9202,2,26,0)
 ;;============
 ;;^UTILITY(U,$J,.84,9202,2,27,0)
 ;;=Select hypertext, left to right and down     TAB
 ;;^UTILITY(U,$J,.84,9202,2,28,0)
 ;;=Select hypertext right to left and up        Q
 ;;^UTILITY(U,$J,.84,9202,2,29,0)
 ;;=Invoke hypertext jump, selected              ARROW RIGHT
 ;;^UTILITY(U,$J,.84,9202,2,30,0)
 ;;=Return from hypertext jump                   ARROW LEFT
 ;;^UTILITY(U,$J,.84,9202,2,31,0)
 ;;=Scroll Down (one line)                       ARROW DOWN
 ;;^UTILITY(U,$J,.84,9202,2,32,0)
 ;;=Scroll Up (one line)                         ARROW UP
 ;;^UTILITY(U,$J,.84,9202,2,33,0)
 ;;=Page Down                                    <F1>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9202,2,34,0)
 ;;=Page Up                                      <F1>ARROW UP
 ;;^UTILITY(U,$J,.84,9202,2,35,0)
 ;;=Jump to the Top                              <F1>T
 ;;^UTILITY(U,$J,.84,9202,2,36,0)
 ;;=Jump to the Bottom                           <F1>B
 ;;^UTILITY(U,$J,.84,9202,2,37,0)
 ;;=Goto                                         <F1>G
 ;;^UTILITY(U,$J,.84,9202,2,38,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,39,0)
 ;;=$.$SEARCH$.$SEARCH:
 ;;^UTILITY(U,$J,.84,9202,2,40,0)
 ;;========
 ;;^UTILITY(U,$J,.84,9202,2,41,0)
 ;;=Find text                                    <F1>F
 ;;^UTILITY(U,$J,.84,9202,2,42,0)
 ;;=Next (occurrence)                            <F1>N
 ;;^UTILITY(U,$J,.84,9202,2,43,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,44,0)
 ;;=Direction-terminate find text with:
 ;;^UTILITY(U,$J,.84,9202,2,45,0)
 ;;=-----------------------------------
 ;;^UTILITY(U,$J,.84,9202,2,46,0)
 ;;=Down                                         ARROW DOWN
 ;;^UTILITY(U,$J,.84,9202,2,47,0)
 ;;=Up                                           ARROW UP
 ;;^UTILITY(U,$J,.84,9202,2,48,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,49,0)
 ;;=$.$SCREEN$.$SCREEN:
 ;;^UTILITY(U,$J,.84,9202,2,50,0)
 ;;========
 ;;^UTILITY(U,$J,.84,9202,2,51,0)
 ;;=Repaint screen                               <F1>P
 ;;^UTILITY(U,$J,.84,9202,2,52,0)
 ;;=Split screen                                 <F2>S
 ;;^UTILITY(U,$J,.84,9202,2,53,0)
 ;;=Restore Full screen                          <F2>F
 ;;^UTILITY(U,$J,.84,9202,2,54,0)
 ;;=Print document                               <F1><F1>P
 ;;^UTILITY(U,$J,.84,9202,2,55,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,56,0)
 ;;=Split Screen Mode Navigation:
 ;;^UTILITY(U,$J,.84,9202,2,57,0)
 ;;=-----------------------------
 ;;^UTILITY(U,$J,.84,9202,2,58,0)
 ;;=Navigate to bottom screen                    <F2>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9202,2,59,0)
 ;;=Navigate to top screen                       <F2>ARROW UP
 ;;^UTILITY(U,$J,.84,9202,2,60,0)
 ;;=Resize Split Screen:
 ;;^UTILITY(U,$J,.84,9202,2,61,0)
 ;;=--------------------
 ;;^UTILITY(U,$J,.84,9202,2,62,0)
 ;;=Top/Bottom screen larger/smaller             <F2><F2>ARROW DOWN
 ;;^UTILITY(U,$J,.84,9202,2,63,0)
 ;;=Bottom/Top screen larger/smaller             <F2><F2>ARROW UP
 ;;^UTILITY(U,$J,.84,9202,2,64,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,65,0)
 ;;=$.$HELP$.$HELP:
 ;;^UTILITY(U,$J,.84,9202,2,66,0)
 ;;======
 ;;^UTILITY(U,$J,.84,9202,2,67,0)
 ;;=Browse Key Summary                           <F1>H
 ;;^UTILITY(U,$J,.84,9202,2,68,0)
 ;;=More Help                                    <F1><F1>H
 ;;^UTILITY(U,$J,.84,9202,2,69,0)
 ;;=Print Help                                   <F1><F1><F1>H
 ;;^UTILITY(U,$J,.84,9202,2,70,0)
 ;;=Return to hypertext document, from HELP      R
 ;;^UTILITY(U,$J,.84,9202,2,71,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,72,0)
 ;;=$.$CLIPBOARD$.$CLIPBOARD:
 ;;^UTILITY(U,$J,.84,9202,2,73,0)
 ;;===========
 ;;^UTILITY(U,$J,.84,9202,2,74,0)
 ;;=Copy to FileMan's Clipboard                  <F1>C
 ;;^UTILITY(U,$J,.84,9202,2,75,0)
 ;;=View FileMan's Clipboard                     <F1>V
 ;;^UTILITY(U,$J,.84,9202,2,76,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,77,0)
 ;;=$.$EXIT$.$EXIT:
 ;;^UTILITY(U,$J,.84,9202,2,78,0)
 ;;======
 ;;^UTILITY(U,$J,.84,9202,2,79,0)
 ;;=Exit Browser or help text                    <F1>E or "EXIT"
 ;;^UTILITY(U,$J,.84,9202,2,80,0)
 ;;=Quit                                         <F1>Q or <Ctrl-E>
 ;;^UTILITY(U,$J,.84,9202,2,81,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,82,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,83,0)
 ;;=  ---------------------------------------------------------------------------
 ;;^UTILITY(U,$J,.84,9202,2,84,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,85,0)
 ;;=$.$MORE_HELP$.$MORE HELP
 ;;^UTILITY(U,$J,.84,9202,2,86,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,87,0)
 ;;=To GOTO a specific screen or line press the <F1> key followed by the letter
 ;;^UTILITY(U,$J,.84,9202,2,88,0)
 ;;='G'. This will cause a prompt to be displayed where a screen or line number can
 ;;^UTILITY(U,$J,.84,9202,2,89,0)
 ;;=be entered preceded by an 'S' or 'L'. The default is screen, meaning that the

DINIT00T
DINIT00T ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;7:42 AM  6 Dec 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 19
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9202,2,90,0)
 ;;='S' is optional when entering a screen number. 10 or S10 will Goto screen 10,
 ;;^UTILITY(U,$J,.84,9202,2,91,0)
 ;;=if screen 10 is a valid screen. L99 will go to line 99.
 ;;^UTILITY(U,$J,.84,9202,2,92,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,93,0)
 ;;=To change the content of the Title Bar, press <F1> <F1> ARROW DOWN or ARROW
 ;;^UTILITY(U,$J,.84,9202,2,94,0)
 ;;=UP. This function replaces the content of the Title Bar with the text in the
 ;;^UTILITY(U,$J,.84,9202,2,95,0)
 ;;=body of the document. Users with programmer access can also use <F4> 'T', to
 ;;^UTILITY(U,$J,.84,9202,2,96,0)
 ;;=permanently change the title of a hypertext document.
 ;;^UTILITY(U,$J,.84,9202,2,97,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,98,0)
 ;;=To copy text to VA FileMan's Clipboard, press <F1><F1>C. This open up a
 ;;^UTILITY(U,$J,.84,9202,2,99,0)
 ;;=dialog screen and prompts for a line or range of lines to copy or append to the
 ;;^UTILITY(U,$J,.84,9202,2,100,0)
 ;;=clipboard. A range of lines are represented by two numeric values separated by
 ;;^UTILITY(U,$J,.84,9202,2,101,0)
 ;;=a colon (:), the wild card (*) may also be used if the entire text is
 ;;^UTILITY(U,$J,.84,9202,2,102,0)
 ;;=desired.  To append to the existing clipboard text, enter the letter 'A'
 ;;^UTILITY(U,$J,.84,9202,2,103,0)
 ;;=as the last character, when entering the range of lines to copy.  This
 ;;^UTILITY(U,$J,.84,9202,2,104,0)
 ;;=text is then retrieved for word-processing fields, when using VA FileMan's
 ;;^UTILITY(U,$J,.84,9202,2,105,0)
 ;;=Screen Editor.
 ;;^UTILITY(U,$J,.84,9202,2,106,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,107,0)
 ;;=To SPLIT SCREEN, while in Full (Browse Region) Screen mode, press <F2>
 ;;^UTILITY(U,$J,.84,9202,2,108,0)
 ;;=followed by the letter 'S'. This causes the screen to split into two separate
 ;;^UTILITY(U,$J,.84,9202,2,109,0)
 ;;=scroll regions.
 ;;^UTILITY(U,$J,.84,9202,2,110,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,111,0)
 ;;=To navigate to the bottom screen, while in Split Screen mode, press <F2>
 ;;^UTILITY(U,$J,.84,9202,2,112,0)
 ;;=followed by pressing the DOWN ARROW key.
 ;;^UTILITY(U,$J,.84,9202,2,113,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,114,0)
 ;;=To navigate to the top screen, while in Split Screen mode, press <F2> followed
 ;;^UTILITY(U,$J,.84,9202,2,115,0)
 ;;=by pressing the UP ARRAY key.
 ;;^UTILITY(U,$J,.84,9202,2,116,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,117,0)
 ;;=To return to FULL SCREEN mode, while in Split Screen mode, press <F2> followed
 ;;^UTILITY(U,$J,.84,9202,2,118,0)
 ;;=by the letter 'F'. This causes the entire browse region to return to one Full
 ;;^UTILITY(U,$J,.84,9202,2,119,0)
 ;;=(Browse) Screen scroll region.
 ;;^UTILITY(U,$J,.84,9202,2,120,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,121,0)
 ;;=The BOTTOM STATUS LINE shows that the Browser is in hypertext mode. It
 ;;^UTILITY(U,$J,.84,9202,2,122,0)
 ;;=indicates the line numbers that correspond to the bottom text line on the
 ;;^UTILITY(U,$J,.84,9202,2,123,0)
 ;;=screen, in the display text section, and provides the total line count. The
 ;;^UTILITY(U,$J,.84,9202,2,124,0)
 ;;=screen indicator shows what screen the last line is on and also provides the
 ;;^UTILITY(U,$J,.84,9202,2,125,0)
 ;;=total number of screens.
 ;;^UTILITY(U,$J,.84,9202,2,126,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9202,2,127,0)
 ;;=<<<Press 'R' or <F1>'E' to exit this help document>>>
 ;;^UTILITY(U,$J,.84,9211,0)
 ;;=9211^3^^5
 ;;^UTILITY(U,$J,.84,9211,1,0)
 ;;=^^1^1^2960423^^^^
 ;;^UTILITY(U,$J,.84,9211,1,1,0)
 ;;=Screen 1 of Screen Editor help.
 ;;^UTILITY(U,$J,.84,9211,2,0)
 ;;=^^18^18^2961212^
 ;;^UTILITY(U,$J,.84,9211,2,1,0)
 ;;=                                                           \BHelp Screen 1 of 4\n
 ;;^UTILITY(U,$J,.84,9211,2,2,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9211,2,3,0)
 ;;=\BSUMMARY OF KEY SEQUENCES\n
 ;;^UTILITY(U,$J,.84,9211,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9211,2,5,0)
 ;;=\BNavigation\n
 ;;^UTILITY(U,$J,.84,9211,2,6,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9211,2,7,0)
 ;;=   Incremental movement            Arrow keys
 ;;^UTILITY(U,$J,.84,9211,2,8,0)
 ;;=   One word left and right         <Ctrl-J> and <Ctrl-L>
 ;;^UTILITY(U,$J,.84,9211,2,9,0)
 ;;=   Next tab stop to the right      <Tab>
 ;;^UTILITY(U,$J,.84,9211,2,10,0)
 ;;=   Jump left and right             <F1><Left> and <F1><Right>
 ;;^UTILITY(U,$J,.84,9211,2,11,0)
 ;;=   Beginning and end of line       <F1><F1><Left> and <F1><F1><Right>
 ;;^UTILITY(U,$J,.84,9211,2,12,0)
 ;;=                                      or:  <Find> and <Select>
 ;;^UTILITY(U,$J,.84,9211,2,13,0)
 ;;=                                      or:  <Home> and <End>
 ;;^UTILITY(U,$J,.84,9211,2,14,0)
 ;;=   Screen up or down               <F1><Up> and <F1><Down>
 ;;^UTILITY(U,$J,.84,9211,2,15,0)
 ;;=                                      or:  <Prev Scr> and <Next Scr>
 ;;^UTILITY(U,$J,.84,9211,2,16,0)
 ;;=                                      or:  <Page Up>  and <Page Down>
 ;;^UTILITY(U,$J,.84,9211,2,17,0)
 ;;=   Top or bottom of document       <F1>T and <F1>B
 ;;^UTILITY(U,$J,.84,9211,2,18,0)
 ;;=   Go to a specific location       <F1>G
 ;;^UTILITY(U,$J,.84,9212,0)
 ;;=9212^3^^5
 ;;^UTILITY(U,$J,.84,9212,1,0)
 ;;=^^1^1^3000816^^^^
 ;;^UTILITY(U,$J,.84,9212,1,1,0)
 ;;=Screen 2 of Screen Editor help.
 ;;^UTILITY(U,$J,.84,9212,2,0)
 ;;=^^18^18^3000816^
 ;;^UTILITY(U,$J,.84,9212,2,1,0)
 ;;=                                                           \BHelp Screen 2 of 4\n
 ;;^UTILITY(U,$J,.84,9212,2,2,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9212,2,3,0)
 ;;=\BExiting/Saving\n
 ;;^UTILITY(U,$J,.84,9212,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9212,2,5,0)
 ;;=   Exit and save text              <F1>E
 ;;^UTILITY(U,$J,.84,9212,2,6,0)
 ;;=   Quit with optional save         <F1>Q  or  <Ctrl-E>
 ;;^UTILITY(U,$J,.84,9212,2,7,0)
 ;;=   Exit, save, and switch editors  <F1>A
 ;;^UTILITY(U,$J,.84,9212,2,8,0)
 ;;=   Save without exiting            <F1>S
 ;;^UTILITY(U,$J,.84,9212,2,9,0)
 ;;=   Enter minutes for AutoSave      <F1><F1>S
 ;;^UTILITY(U,$J,.84,9212,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9212,2,11,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9212,2,12,0)
 ;;=\BDeleting\n
 ;;^UTILITY(U,$J,.84,9212,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9212,2,14,0)
 ;;=   Character before cursor         <Backspace>
 ;;^UTILITY(U,$J,.84,9212,2,15,0)
 ;;=   Character at cursor             <F4>  or  <Remove>  or  <Delete>
 ;;^UTILITY(U,$J,.84,9212,2,16,0)
 ;;=   From cursor to end of word      <Ctrl-W>
 ;;^UTILITY(U,$J,.84,9212,2,17,0)
 ;;=   From cursor to end of line      <F1><F2>
 ;;^UTILITY(U,$J,.84,9212,2,18,0)
 ;;=   Entire line                     <F1>D
 ;;^UTILITY(U,$J,.84,9213,0)
 ;;=9213^3^^5
 ;;^UTILITY(U,$J,.84,9213,1,0)
 ;;=^.842^1^1^3000825^^^^
 ;;^UTILITY(U,$J,.84,9213,1,1,0)
 ;;=Screen 3 of Screen Editor help.
 ;;^UTILITY(U,$J,.84,9213,2,0)
 ;;=^^16^16^3000825^

DINIT00U
DINIT00U ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;06:10 PM  5 Dec 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9213,2,1,0)
 ;;=                                                           \BHelp Screen 3 of 4\n
 ;;^UTILITY(U,$J,.84,9213,2,2,0)
 ;;=\BSettings/Modes\n
 ;;^UTILITY(U,$J,.84,9213,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9213,2,4,0)
 ;;=   Wrap/nowrap mode toggle         <F2>
 ;;^UTILITY(U,$J,.84,9213,2,5,0)
 ;;=   Insert/replace mode toggle      <F3>  or  <Insert Here>  or  <Insert>
 ;;^UTILITY(U,$J,.84,9213,2,6,0)
 ;;=   Set/clear tab stop              <F1><Tab>
 ;;^UTILITY(U,$J,.84,9213,2,6.5,0)
 ;;=   Enter columns for tab stops     <F1><F1><Tab>
 ;;^UTILITY(U,$J,.84,9213,2,7,0)
 ;;=   Set left margin                 <F1>,
 ;;^UTILITY(U,$J,.84,9213,2,8,0)
 ;;=   Set right margin                <F1>.
 ;;^UTILITY(U,$J,.84,9213,2,9,0)
 ;;=   Status line toggle              <F1>?
 ;;^UTILITY(U,$J,.84,9213,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9213,2,11,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9213,2,12,0)
 ;;=\BFormatting\n
 ;;^UTILITY(U,$J,.84,9213,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9213,2,14,0)
 ;;=   Join current line to next line  <F1>J
 ;;^UTILITY(U,$J,.84,9213,2,15,0)
 ;;=   Reformat paragraph              <F1>R
 ;;^UTILITY(U,$J,.84,9214,0)
 ;;=9214^3^^5
 ;;^UTILITY(U,$J,.84,9214,1,0)
 ;;=^^1^1^2940624^^^^
 ;;^UTILITY(U,$J,.84,9214,1,1,0)
 ;;=Screen 4 of Screen Editor help.
 ;;^UTILITY(U,$J,.84,9214,2,0)
 ;;=^^19^19^2961212^^
 ;;^UTILITY(U,$J,.84,9214,2,1,0)
 ;;=                                                           \BHelp Screen 4 of 4\n
 ;;^UTILITY(U,$J,.84,9214,2,2,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9214,2,3,0)
 ;;=\BFinding\n
 ;;^UTILITY(U,$J,.84,9214,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9214,2,5,0)
 ;;=   Find text                       <F1>F
 ;;^UTILITY(U,$J,.84,9214,2,6,0)
 ;;=   Find next occurence of text     <F1>N
 ;;^UTILITY(U,$J,.84,9214,2,7,0)
 ;;=   Find/RePlace text               <F1>P
 ;;^UTILITY(U,$J,.84,9214,2,8,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9214,2,9,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9214,2,10,0)
 ;;=\BCutting/Copying/Pasting\n
 ;;^UTILITY(U,$J,.84,9214,2,11,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9214,2,12,0)
 ;;=   Select (Mark) text              <F1>M at beginning and end of text
 ;;^UTILITY(U,$J,.84,9214,2,13,0)
 ;;=   Unselect (Unmark) text          <F1><F1>M
 ;;^UTILITY(U,$J,.84,9214,2,14,0)
 ;;=   Delete selected text            <Delete>  or  <Backspace> on selected text
 ;;^UTILITY(U,$J,.84,9214,2,15,0)
 ;;=   Cut and save to buffer          <F1>X on selected text
 ;;^UTILITY(U,$J,.84,9214,2,16,0)
 ;;=   Copy and save to buffer         <F1>C on selected text
 ;;^UTILITY(U,$J,.84,9214,2,17,0)
 ;;=   Paste from buffer               <F1>V
 ;;^UTILITY(U,$J,.84,9214,2,18,0)
 ;;=   Move text to another location   <F1>X at new location
 ;;^UTILITY(U,$J,.84,9214,2,19,0)
 ;;=   Copy text to another location   <F1>C at new location
 ;;^UTILITY(U,$J,.84,9231,0)
 ;;=9231^3^^5
 ;;^UTILITY(U,$J,.84,9231,1,0)
 ;;=^^1^1^2940706^^
 ;;^UTILITY(U,$J,.84,9231,1,1,0)
 ;;=Screen 1 of ScreenMan help.
 ;;^UTILITY(U,$J,.84,9231,2,0)
 ;;=^^18^18^2940831^
 ;;^UTILITY(U,$J,.84,9231,2,1,0)
 ;;=                                                                \BScreen 1 of 3\n
 ;;^UTILITY(U,$J,.84,9231,2,2,0)
 ;;=                               \BSCREENMAN HELP\n
 ;;^UTILITY(U,$J,.84,9231,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9231,2,4,0)
 ;;=\BCursor Movement\n
 ;;^UTILITY(U,$J,.84,9231,2,5,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9231,2,6,0)
 ;;=Move right one character            <Right>
 ;;^UTILITY(U,$J,.84,9231,2,7,0)
 ;;=Move left one character             <Left>
 ;;^UTILITY(U,$J,.84,9231,2,8,0)
 ;;=Move right one word                 <Ctrl-L> or <F1><Space>
 ;;^UTILITY(U,$J,.84,9231,2,9,0)
 ;;=Move left one word                  <Ctrl-J>
 ;;^UTILITY(U,$J,.84,9231,2,10,0)
 ;;=Move to right of window             <F1><Right>
 ;;^UTILITY(U,$J,.84,9231,2,11,0)
 ;;=Move to left of window              <F1><Left>
 ;;^UTILITY(U,$J,.84,9231,2,12,0)
 ;;=Move to end of field                <F1><F1><Right>
 ;;^UTILITY(U,$J,.84,9231,2,13,0)
 ;;=Move to beginning of field          <F1><F1><Left>
 ;;^UTILITY(U,$J,.84,9231,2,14,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9231,2,15,0)
 ;;=\BModes\n
 ;;^UTILITY(U,$J,.84,9231,2,16,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9231,2,17,0)
 ;;=Insert/Replace toggle               <F3>
 ;;^UTILITY(U,$J,.84,9231,2,18,0)
 ;;=Zoom (invoke multiline editor)      <F1>Z
 ;;^UTILITY(U,$J,.84,9232,0)
 ;;=9232^3^^5
 ;;^UTILITY(U,$J,.84,9232,1,0)
 ;;=^^1^1^2940706^
 ;;^UTILITY(U,$J,.84,9232,1,1,0)
 ;;=Screen 2 of ScreenMan help.
 ;;^UTILITY(U,$J,.84,9232,2,0)
 ;;=^^20^20^2940831^
 ;;^UTILITY(U,$J,.84,9232,2,1,0)
 ;;=                                                                \BScreen 2 of 3\n
 ;;^UTILITY(U,$J,.84,9232,2,2,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9232,2,3,0)
 ;;=\BDeletions\n
 ;;^UTILITY(U,$J,.84,9232,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9232,2,5,0)
 ;;=Character under cursor           <F2> or <Delete>
 ;;^UTILITY(U,$J,.84,9232,2,6,0)
 ;;=Character left of cursor         <Backspace>
 ;;^UTILITY(U,$J,.84,9232,2,7,0)
 ;;=From cursor to end of word       <Ctrl-W>
 ;;^UTILITY(U,$J,.84,9232,2,8,0)
 ;;=From cursor to end of field      <F1><F2>
 ;;^UTILITY(U,$J,.84,9232,2,9,0)
 ;;=Toggle null/last edit/default    <F1>D or <Ctrl-U>
 ;;^UTILITY(U,$J,.84,9232,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9232,2,11,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9232,2,12,0)
 ;;=\BMacro Movement\n
 ;;^UTILITY(U,$J,.84,9232,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9232,2,14,0)
 ;;=Field below         <Down>    |   Next page           <F1><Down> or <PageDown>
 ;;^UTILITY(U,$J,.84,9232,2,15,0)
 ;;=Field above         <Up>      |   Previous page       <F1><Up> or <PageUp>
 ;;^UTILITY(U,$J,.84,9232,2,16,0)
 ;;=Field to right      <Tab>     |   Next block          <F1><F4>
 ;;^UTILITY(U,$J,.84,9232,2,17,0)
 ;;=Field to left       <F4>     |   Jump to a field     ^caption
 ;;^UTILITY(U,$J,.84,9232,2,18,0)
 ;;=Pre-defined order   <Return>  |   Go to Command Line  ^
 ;;^UTILITY(U,$J,.84,9232,2,19,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9232,2,20,0)
 ;;=Go into multiple or word processing field             <Return>
 ;;^UTILITY(U,$J,.84,9233,0)
 ;;=9233^3^^5
 ;;^UTILITY(U,$J,.84,9233,1,0)
 ;;=^^1^1^2941116^^
 ;;^UTILITY(U,$J,.84,9233,1,1,0)
 ;;=Screen 3 of ScreenMan help.
 ;;^UTILITY(U,$J,.84,9233,2,0)
 ;;=^^18^18^2941116^
 ;;^UTILITY(U,$J,.84,9233,2,1,0)
 ;;=                                                                \BScreen 3 of 3\n
 ;;^UTILITY(U,$J,.84,9233,2,2,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9233,2,3,0)
 ;;=\BCommand Line Options\n (Enter '^' at any field to jump to the command line.)

DINIT00V
DINIT00V ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;8MAY2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9233,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9233,2,5,0)
 ;;=Command      Shortcut      Description
 ;;^UTILITY(U,$J,.84,9233,2,6,0)
 ;;=-------      --------      -----------
 ;;^UTILITY(U,$J,.84,9233,2,7,0)
 ;;=EXIT         see below    Exit form
 ;;^UTILITY(U,$J,.84,9233,2,8,0)
 ;;=CLOSE        <F1>C        Close window and return to previous level
 ;;^UTILITY(U,$J,.84,9233,2,9,0)
 ;;=SAVE         <F1>S        Save changes
 ;;^UTILITY(U,$J,.84,9233,2,10,0)
 ;;=NEXT PAGE    <F1><Down>   Go to next page
 ;;^UTILITY(U,$J,.84,9233,2,11,0)
 ;;=REFRESH      <F1>R        Repaint screen
 ;;^UTILITY(U,$J,.84,9233,2,12,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9233,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9233,2,14,0)
 ;;=\BOther Shortcut Keys\n
 ;;^UTILITY(U,$J,.84,9233,2,15,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9233,2,16,0)
 ;;=Exit form and save changes             <F1>E
 ;;^UTILITY(U,$J,.84,9233,2,17,0)
 ;;=Quit form without saving changes       <F1>Q
 ;;^UTILITY(U,$J,.84,9233,2,18,0)
 ;;=Invoke Record Selection Page           <F1>L
 ;;^UTILITY(U,$J,.84,9233,2,19,0)
 ;;=Print screen (including all multiples) <F1>P
 ;;^UTILITY(U,$J,.84,9234,0)
 ;;=9234^3^^5
 ;;^UTILITY(U,$J,.84,9234,1,0)
 ;;=^^1^1^3040504
 ;;^UTILITY(U,$J,.84,9234,1,1,0)
 ;;=ScreenMan help for MOUSE
 ;;^UTILITY(U,$J,.84,9234,2,0)
 ;;=^^20^20^3040504
 ;;^UTILITY(U,$J,.84,9234,2,1,0)
 ;;=
 ;;^UTILITY(U,$J,.84,9234,2,2,0)
 ;;=Click on: - Field CAPTION, or data window, to JUMP to that Field 
 ;;^UTILITY(U,$J,.84,9234,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9234,2,4,0)
 ;;=          - BOTTOM line (left), to EXIT, SAVE, or QUIT
 ;;^UTILITY(U,$J,.84,9234,2,5,0)
 ;;=          
 ;;^UTILITY(U,$J,.84,9234,2,6,0)
 ;;=          - CURSOR to get Help for this field
 ;;^UTILITY(U,$J,.84,9234,2,7,0)
 ;;=                   
 ;;^UTILITY(U,$J,.84,9234,2,8,0)
 ;;=          - "+" signs at left top or bottom of scrolling region
 ;;^UTILITY(U,$J,.84,9234,2,9,0)
 ;;=          
 ;;^UTILITY(U,$J,.84,9234,2,10,0)
 ;;=          - INSERT (bottom right), to change typing mode to character-replace
 ;;^UTILITY(U,$J,.84,9234,2,11,0)
 ;;=          
 ;;^UTILITY(U,$J,.84,9234,2,12,0)
 ;;=          
 ;;^UTILITY(U,$J,.84,9251,0)
 ;;=9251^3^^5
 ;;^UTILITY(U,$J,.84,9251,1,0)
 ;;=^^1^1^2940707^^
 ;;^UTILITY(U,$J,.84,9251,1,1,0)
 ;;=Help Screen 1 of Form Editor help.
 ;;^UTILITY(U,$J,.84,9251,2,0)
 ;;=^^22^22^2940707^
 ;;^UTILITY(U,$J,.84,9251,2,1,0)
 ;;=                                                          \BHelp Screen 1 of 9\n
 ;;^UTILITY(U,$J,.84,9251,2,2,0)
 ;;=\BNAVIGATIONAL KEYS\n
 ;;^UTILITY(U,$J,.84,9251,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9251,2,4,0)
 ;;=Press    To move              |  Press         To move
 ;;^UTILITY(U,$J,.84,9251,2,5,0)
 ;;=-------------------------------------------------------------------
 ;;^UTILITY(U,$J,.84,9251,2,6,0)
 ;;=<Up>     Up one line          |  <F1><Up>     To top of screen
 ;;^UTILITY(U,$J,.84,9251,2,7,0)
 ;;=<Down>   Down one line        |  <F1><Down>   To bottom of screen
 ;;^UTILITY(U,$J,.84,9251,2,8,0)
 ;;=<Right>  Right one character  |  <F1><Right>  To right edge of screen
 ;;^UTILITY(U,$J,.84,9251,2,9,0)
 ;;=<Left>   Left one character   |  <F1><Left>   To left edge of screen
 ;;^UTILITY(U,$J,.84,9251,2,10,0)
 ;;=<Tab>    To next element
 ;;^UTILITY(U,$J,.84,9251,2,11,0)
 ;;=Q        To previous element
 ;;^UTILITY(U,$J,.84,9251,2,12,0)
 ;;=S        Right 5 characters
 ;;^UTILITY(U,$J,.84,9251,2,13,0)
 ;;=A        Left 5 characters
 ;;^UTILITY(U,$J,.84,9251,2,14,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9251,2,15,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9251,2,16,0)
 ;;=\BSAVING AND EXITING\n
 ;;^UTILITY(U,$J,.84,9251,2,17,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9251,2,18,0)
 ;;=Press    To
 ;;^UTILITY(U,$J,.84,9251,2,19,0)
 ;;=----------------------------------------------------
 ;;^UTILITY(U,$J,.84,9251,2,20,0)
 ;;=<F1>S   Save changes
 ;;^UTILITY(U,$J,.84,9251,2,21,0)
 ;;=<F1>E   Save changes and exit the Form Editor
 ;;^UTILITY(U,$J,.84,9251,2,22,0)
 ;;=<F1>Q   Quit the Form Editor without saving changes
 ;;^UTILITY(U,$J,.84,9252,0)
 ;;=9252^3^^5
 ;;^UTILITY(U,$J,.84,9252,1,0)
 ;;=^^1^1^2941116^^^
 ;;^UTILITY(U,$J,.84,9252,1,1,0)
 ;;=Help Screen 2 of Form Editor.
 ;;^UTILITY(U,$J,.84,9252,2,0)
 ;;=^^19^19^2941116^
 ;;^UTILITY(U,$J,.84,9252,2,1,0)
 ;;=                                                          \BHelp Screen 2 of 9\n
 ;;^UTILITY(U,$J,.84,9252,2,2,0)
 ;;=\BSELECTING SCREEN ELEMENTS\n
 ;;^UTILITY(U,$J,.84,9252,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9252,2,4,0)
 ;;=To "select" a screen element, position the cursor over the element and
 ;;^UTILITY(U,$J,.84,9252,2,5,0)
 ;;=press <SpaceBar> or <Enter>.  This process is abbreviated <SelectElement>.
 ;;^UTILITY(U,$J,.84,9252,2,6,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9252,2,7,0)
 ;;=Press            To
 ;;^UTILITY(U,$J,.84,9252,2,8,0)
 ;;=----------------------------------------
 ;;^UTILITY(U,$J,.84,9252,2,9,0)
 ;;=<SelectElement>  Select a screen element
 ;;^UTILITY(U,$J,.84,9252,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9252,2,11,0)
 ;;=Once an element is selected, you can drag it around the screen by using
 ;;^UTILITY(U,$J,.84,9252,2,12,0)
 ;;=the navigational keys.  You cannot drag an element beyond the boundaries
 ;;^UTILITY(U,$J,.84,9252,2,13,0)
 ;;=of the block on which it is defined.
 ;;^UTILITY(U,$J,.84,9252,2,14,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9252,2,15,0)
 ;;=If you press <SpaceBar> or <Enter> over the caption of an element, both
 ;;^UTILITY(U,$J,.84,9252,2,16,0)
 ;;=the caption and data portion of the element, if one exists, are selected.
 ;;^UTILITY(U,$J,.84,9252,2,17,0)
 ;;=If you press <SpaceBar> or <Enter> over the data portion of an element,
 ;;^UTILITY(U,$J,.84,9252,2,18,0)
 ;;=only the data portion is selected and can be dragged independently of the
 ;;^UTILITY(U,$J,.84,9252,2,19,0)
 ;;=caption.  Press <SpaceBar> or <Enter> again to deselect the element.
 ;;^UTILITY(U,$J,.84,9253,0)
 ;;=9253^3^^5
 ;;^UTILITY(U,$J,.84,9253,1,0)
 ;;=^^1^1^2940707^
 ;;^UTILITY(U,$J,.84,9253,1,1,0)
 ;;=Help Screen 3 of Form Editor.
 ;;^UTILITY(U,$J,.84,9253,2,0)
 ;;=^^15^15^2940707^
 ;;^UTILITY(U,$J,.84,9253,2,1,0)
 ;;=                                                          \BHelp Screen 3 of 9\n
 ;;^UTILITY(U,$J,.84,9253,2,2,0)
 ;;=\BEDITING ELEMENT PROPERTIES\n
 ;;^UTILITY(U,$J,.84,9253,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9253,2,4,0)
 ;;=Press                 To
 ;;^UTILITY(U,$J,.84,9253,2,5,0)
 ;;=---------------------------------------------
 ;;^UTILITY(U,$J,.84,9253,2,6,0)
 ;;=<SelectElement><F4>  Edit element properties
 ;;^UTILITY(U,$J,.84,9253,2,7,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9253,2,8,0)
 ;;=You will then be taken into a ScreenMan form where the properties of the
 ;;^UTILITY(U,$J,.84,9253,2,9,0)
 ;;=element can be edited.
 ;;^UTILITY(U,$J,.84,9253,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9253,2,11,0)
 ;;=The Form Editor uses ScreenMan forms as a kind of modal dialog box.  The
 ;;^UTILITY(U,$J,.84,9253,2,12,0)
 ;;=changes you make within the forms are permanent; that is, if from a
 ;;^UTILITY(U,$J,.84,9253,2,13,0)
 ;;=ScreenMan form you edit the properties of an element, use <F1>E to save
 ;;^UTILITY(U,$J,.84,9253,2,14,0)
 ;;=and exit the form, and then use <F1>Q to quit the Form Editor, the
 ;;^UTILITY(U,$J,.84,9253,2,15,0)
 ;;=changes you made to the properties of the element will remain.
 ;;^UTILITY(U,$J,.84,9254,0)
 ;;=9254^3^^5
 ;;^UTILITY(U,$J,.84,9254,1,0)
 ;;=^^1^1^2940707^
 ;;^UTILITY(U,$J,.84,9254,1,1,0)
 ;;=Help Screen 4 of Form Editor.
 ;;^UTILITY(U,$J,.84,9254,2,0)
 ;;=^^18^18^2940707^

DINIT00W
DINIT00W ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;05:40 PM  21 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9254,2,1,0)
 ;;=                                                          \BHelp Screen 4 of 9\n
 ;;^UTILITY(U,$J,.84,9254,2,2,0)
 ;;=\BEDITING A CAPTION OR DATA LENGTH\n
 ;;^UTILITY(U,$J,.84,9254,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9254,2,4,0)
 ;;=To edit the caption or data length of an element from the Form Editor's
 ;;^UTILITY(U,$J,.84,9254,2,5,0)
 ;;=Main screen, you can position the cursor over the caption or data portion
 ;;^UTILITY(U,$J,.84,9254,2,6,0)
 ;;=of the element and press:
 ;;^UTILITY(U,$J,.84,9254,2,7,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9254,2,8,0)
 ;;=     <F3>     Edit caption or data length
 ;;^UTILITY(U,$J,.84,9254,2,9,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9254,2,10,0)
 ;;=If you press <F3> while the cursor is over a caption, you'll be taken
 ;;^UTILITY(U,$J,.84,9254,2,11,0)
 ;;=into a caption editor.  The editing keys available to you are identical
 ;;^UTILITY(U,$J,.84,9254,2,12,0)
 ;;=to those in ScreenMan's field editor.
 ;;^UTILITY(U,$J,.84,9254,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9254,2,14,0)
 ;;=If you press <F3> while the cursor is over the data portion of an element,
 ;;^UTILITY(U,$J,.84,9254,2,15,0)
 ;;=you can then use the <Right> and <Left> arrow keys to increase and
 ;;^UTILITY(U,$J,.84,9254,2,16,0)
 ;;=decrease the data length.  An indicator at the lower right edge of the
 ;;^UTILITY(U,$J,.84,9254,2,17,0)
 ;;=screen indicates the current length of the data.  Press <Enter> to exit
 ;;^UTILITY(U,$J,.84,9254,2,18,0)
 ;;=the caption or data length editor.
 ;;^UTILITY(U,$J,.84,9255,0)
 ;;=9255^3^^5
 ;;^UTILITY(U,$J,.84,9255,1,0)
 ;;=^^1^1^2940707^
 ;;^UTILITY(U,$J,.84,9255,1,1,0)
 ;;=Help Screen 5 of Form Editor.
 ;;^UTILITY(U,$J,.84,9255,2,0)
 ;;=^^18^18^2940707^
 ;;^UTILITY(U,$J,.84,9255,2,1,0)
 ;;=                                                          \BHelp Screen 5 of 9\n
 ;;^UTILITY(U,$J,.84,9255,2,2,0)
 ;;=\BVIEWING THE BLOCKS ON A PAGE\n
 ;;^UTILITY(U,$J,.84,9255,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9255,2,4,0)
 ;;=The Form Editor's main screen displays the field elements on a page, but
 ;;^UTILITY(U,$J,.84,9255,2,5,0)
 ;;=does not display any information about the blocks on that page.  A Block
 ;;^UTILITY(U,$J,.84,9255,2,6,0)
 ;;=Viewer screen shows the blocks on a page.  From the Block Viewer screen
 ;;^UTILITY(U,$J,.84,9255,2,7,0)
 ;;=you can move entire blocks, and edit block properties.
 ;;^UTILITY(U,$J,.84,9255,2,8,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9255,2,9,0)
 ;;=Press    To
 ;;^UTILITY(U,$J,.84,9255,2,10,0)
 ;;=-----------------------------------------------------------
 ;;^UTILITY(U,$J,.84,9255,2,11,0)
 ;;=<F1>V   Toggle between Block Viewer screen and Main screen
 ;;^UTILITY(U,$J,.84,9255,2,12,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9255,2,13,0)
 ;;=The Block Viewer screen displays the names of the blocks on the current
 ;;^UTILITY(U,$J,.84,9255,2,14,0)
 ;;=page.  From this screen, you can select blocks and edit their properties.
 ;;^UTILITY(U,$J,.84,9255,2,15,0)
 ;;=To return to the Form Editor's main screen, press <F1>V, <F1>E, or <F1>Q.
 ;;^UTILITY(U,$J,.84,9255,2,16,0)
 ;;=If two blocks have the some coordinates, the block names will overlap on
 ;;^UTILITY(U,$J,.84,9255,2,17,0)
 ;;=the Block Viewer screen.  Also, since header blocks have a fixed position
 ;;^UTILITY(U,$J,.84,9255,2,18,0)
 ;;=of (1,1) relative to the page, they cannot be moved.
 ;;^UTILITY(U,$J,.84,9256,0)
 ;;=9256^3^^5
 ;;^UTILITY(U,$J,.84,9256,1,0)
 ;;=^^1^1^2940707^
 ;;^UTILITY(U,$J,.84,9256,1,1,0)
 ;;=Help Screen 6 of Form Editor.
 ;;^UTILITY(U,$J,.84,9256,2,0)
 ;;=^^10^10^2940707^
 ;;^UTILITY(U,$J,.84,9256,2,1,0)
 ;;=                                                          \BHelp Screen 6 of 9\n
 ;;^UTILITY(U,$J,.84,9256,2,2,0)
 ;;=\BPAGE NAVIGATION\n
 ;;^UTILITY(U,$J,.84,9256,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9256,2,4,0)
 ;;=Press             To move to
 ;;^UTILITY(U,$J,.84,9256,2,5,0)
 ;;=----------------------------------------------------------
 ;;^UTILITY(U,$J,.84,9256,2,6,0)
 ;;=<F1><F1><Up>    Previous page
 ;;^UTILITY(U,$J,.84,9256,2,7,0)
 ;;=<F1><F1><Down>  Next page
 ;;^UTILITY(U,$J,.84,9256,2,8,0)
 ;;=<SelectElement>D  Subpage associated with selected element
 ;;^UTILITY(U,$J,.84,9256,2,9,0)
 ;;=<F1>C            Parent page (Close current pop-up page)
 ;;^UTILITY(U,$J,.84,9256,2,10,0)
 ;;=<F1>P            A specific page (you are prompted for the page)
 ;;^UTILITY(U,$J,.84,9257,0)
 ;;=9257^3^^5
 ;;^UTILITY(U,$J,.84,9257,1,0)
 ;;=^^1^1^2940725^^
 ;;^UTILITY(U,$J,.84,9257,1,1,0)
 ;;=Help Screen 7 of Form Editor.
 ;;^UTILITY(U,$J,.84,9257,2,0)
 ;;=^^15^15^2940725^
 ;;^UTILITY(U,$J,.84,9257,2,1,0)
 ;;=                                                          \BHelp Screen 7 of 9\n
 ;;^UTILITY(U,$J,.84,9257,2,2,0)
 ;;=\BSELECTING, ADDING, AND EDITING FORM ELEMENTS\n
 ;;^UTILITY(U,$J,.84,9257,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9257,2,4,0)
 ;;=Press   To
 ;;^UTILITY(U,$J,.84,9257,2,5,0)
 ;;=----------------------------------------
 ;;^UTILITY(U,$J,.84,9257,2,6,0)
 ;;=<F1>M  Select another form
 ;;^UTILITY(U,$J,.84,9257,2,7,0)
 ;;=<F1>P  Select another page
 ;;^UTILITY(U,$J,.84,9257,2,8,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9257,2,9,0)
 ;;=<F2>M  Add a new form
 ;;^UTILITY(U,$J,.84,9257,2,10,0)
 ;;=<F2>P  Add a new page
 ;;^UTILITY(U,$J,.84,9257,2,11,0)
 ;;=<F2>B  Add a new block
 ;;^UTILITY(U,$J,.84,9257,2,12,0)
 ;;=<F2>F  Add a new field element
 ;;^UTILITY(U,$J,.84,9257,2,13,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9257,2,14,0)
 ;;=<F4>M  Edit properties of current form
 ;;^UTILITY(U,$J,.84,9257,2,15,0)
 ;;=<F4>P  Edit properties of current page
 ;;^UTILITY(U,$J,.84,9258,0)
 ;;=9258^3^^5
 ;;^UTILITY(U,$J,.84,9258,1,0)
 ;;=^^1^1^2940707^
 ;;^UTILITY(U,$J,.84,9258,1,1,0)
 ;;=Help Screen 8 of Form Editor.
 ;;^UTILITY(U,$J,.84,9258,2,0)
 ;;=^^11^11^2940707^
 ;;^UTILITY(U,$J,.84,9258,2,1,0)
 ;;=                                                          \BHelp Screen 8 of 9\n
 ;;^UTILITY(U,$J,.84,9258,2,2,0)
 ;;=\BDELETING ELEMENTS\n
 ;;^UTILITY(U,$J,.84,9258,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9258,2,4,0)
 ;;=To delete an element, edit the properties of the element, and enter an
 ;;^UTILITY(U,$J,.84,9258,2,5,0)
 ;;=at-sign (@) at the first field of the ScreenMan form.  For example, to
 ;;^UTILITY(U,$J,.84,9258,2,6,0)
 ;;=delete a field from a block, select the field with <SpaceBar>, press <F4>
 ;;^UTILITY(U,$J,.84,9258,2,7,0)
 ;;=to invoke the "edit properties" form, and enter @ at the "Field Order:"

DINIT00X
DINIT00X ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;21APR2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9258,2,8,0)
 ;;=prompt.
 ;;^UTILITY(U,$J,.84,9258,2,9,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9258,2,10,0)
 ;;=You cannot use the Form Editor to delete entire forms or blocks.  A separate
 ;;^UTILITY(U,$J,.84,9258,2,11,0)
 ;;=utility provides that functionality.
 ;;^UTILITY(U,$J,.84,9259,0)
 ;;=9259^3^^5
 ;;^UTILITY(U,$J,.84,9259,1,0)
 ;;=^^1^1^2940707^^
 ;;^UTILITY(U,$J,.84,9259,1,1,0)
 ;;=Help Screen 9 of Form Editor.
 ;;^UTILITY(U,$J,.84,9259,2,0)
 ;;=^^16^16^2940707^
 ;;^UTILITY(U,$J,.84,9259,2,1,0)
 ;;=                                                          \BHelp Screen 9 of 9\n
 ;;^UTILITY(U,$J,.84,9259,2,2,0)
 ;;=\BREORDERING FIELDS ON A BLOCK\n
 ;;^UTILITY(U,$J,.84,9259,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9259,2,4,0)
 ;;=After creating and arranging all the elements on a block, you can quickly
 ;;^UTILITY(U,$J,.84,9259,2,5,0)
 ;;=make the field orders of all the elements equivalent to the tab order
 ;;^UTILITY(U,$J,.84,9259,2,6,0)
 ;;=by doing the following:
 ;;^UTILITY(U,$J,.84,9259,2,7,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9259,2,8,0)
 ;;=     1.  Go to the Block Viewer page (<F1>V)
 ;;^UTILITY(U,$J,.84,9259,2,9,0)
 ;;=     2.  Select the block (<SpaceBar> over the block name)
 ;;^UTILITY(U,$J,.84,9259,2,10,0)
 ;;=     3.  Press <F1>O
 ;;^UTILITY(U,$J,.84,9259,2,11,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9259,2,12,0)
 ;;=The field order is the order in which the elements on the block are
 ;;^UTILITY(U,$J,.84,9259,2,13,0)
 ;;=traversed when the user presses the <Enter> key.  The <F1>O key
 ;;^UTILITY(U,$J,.84,9259,2,14,0)
 ;;=sequence reassigns field order numbers to all the elements on the
 ;;^UTILITY(U,$J,.84,9259,2,15,0)
 ;;=block, so that the <Enter> key takes the user from element to element
 ;;^UTILITY(U,$J,.84,9259,2,16,0)
 ;;=in the same order as the <Tab> key (left to right, top to bottom).
 ;;^UTILITY(U,$J,.84,9501,0)
 ;;=9501^1^^5
 ;;^UTILITY(U,$J,.84,9501,1,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,9501,1,1,0)
 ;;=DIFROM Server, FIA array does not exist or invalid.
 ;;^UTILITY(U,$J,.84,9501,2,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,9501,2,1,0)
 ;;=FIA array does not exist or invalid.
 ;;^UTILITY(U,$J,.84,9502,0)
 ;;=9502^1^^5
 ;;^UTILITY(U,$J,.84,9502,1,0)
 ;;=^^1^1^2940908^
 ;;^UTILITY(U,$J,.84,9502,1,1,0)
 ;;=FIA file number invalid.
 ;;^UTILITY(U,$J,.84,9502,2,0)
 ;;=^^1^1^2940908^
 ;;^UTILITY(U,$J,.84,9502,2,1,0)
 ;;=FIA file number invalid.
 ;;^UTILITY(U,$J,.84,9503,0)
 ;;=9503^1^^5
 ;;^UTILITY(U,$J,.84,9503,1,0)
 ;;=^^1^1^2940908^^^^
 ;;^UTILITY(U,$J,.84,9503,1,1,0)
 ;;=DIFROM Server; FIA node is set to "NO DD UPDATE"
 ;;^UTILITY(U,$J,.84,9503,2,0)
 ;;=^^1^1^2940908^^^^
 ;;^UTILITY(U,$J,.84,9503,2,1,0)
 ;;=File will not be installed!  Installation parameter specifies: "No DD Update"
 ;;^UTILITY(U,$J,.84,9504,0)
 ;;=9504^1^^5
 ;;^UTILITY(U,$J,.84,9504,1,0)
 ;;=^^1^1^2940908^^
 ;;^UTILITY(U,$J,.84,9504,1,1,0)
 ;;=DIFROM Server; Installing DD only if file is new on target system.
 ;;^UTILITY(U,$J,.84,9504,2,0)
 ;;=^^1^1^2940908^^
 ;;^UTILITY(U,$J,.84,9504,2,1,0)
 ;;=Data Dictionary not installed; DD already exist on target system.
 ;;^UTILITY(U,$J,.84,9505,0)
 ;;=9505^1^^5
 ;;^UTILITY(U,$J,.84,9505,1,0)
 ;;=^^1^1^2940915^^^
 ;;^UTILITY(U,$J,.84,9505,1,1,0)
 ;;=DIFROM Server; Did not pass DD screen.
 ;;^UTILITY(U,$J,.84,9505,2,0)
 ;;=^^1^1^2940915^^^
 ;;^UTILITY(U,$J,.84,9505,2,1,0)
 ;;=Data Dictionary not updated; Did not pass DD Screen.
 ;;^UTILITY(U,$J,.84,9506,0)
 ;;=9506^1^^5
 ;;^UTILITY(U,$J,.84,9506,1,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,9506,1,1,0)
 ;;=DIFROM Server;  Transport structure does not exist or invalid.
 ;;^UTILITY(U,$J,.84,9506,2,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,9506,2,1,0)
 ;;=Transport array does not exist or invalid.
 ;;^UTILITY(U,$J,.84,9507,0)
 ;;=9507^1^^5
 ;;^UTILITY(U,$J,.84,9507,1,0)
 ;;=^^1^1^2940908^^
 ;;^UTILITY(U,$J,.84,9507,1,1,0)
 ;;=DIFROM Server;  FIA file number invalid.
 ;;^UTILITY(U,$J,.84,9507,2,0)
 ;;=^^1^1^2940908^^
 ;;^UTILITY(U,$J,.84,9507,2,1,0)
 ;;=Data Dictionary not installed; FIA file number invalid.
 ;;^UTILITY(U,$J,.84,9508,0)
 ;;=9508^1^^5
 ;;^UTILITY(U,$J,.84,9508,1,0)
 ;;=^^1^1^2940908^^^
 ;;^UTILITY(U,$J,.84,9508,1,1,0)
 ;;=DIFROM Server;  File does not exist on target system (Partial DD).
 ;;^UTILITY(U,$J,.84,9508,2,0)
 ;;=^^1^1^2940908^^^
 ;;^UTILITY(U,$J,.84,9508,2,1,0)
 ;;=Data Dictionary not installed; Partial DD/File does not exist.
 ;;^UTILITY(U,$J,.84,9509,0)
 ;;=9509^1^^5
 ;;^UTILITY(U,$J,.84,9509,1,0)
 ;;=^^1^1^2940908^^^
 ;;^UTILITY(U,$J,.84,9509,1,1,0)
 ;;=DIFROMS Server;  FIA node is set to send "No Data"
 ;;^UTILITY(U,$J,.84,9509,2,0)
 ;;=^^1^1^2940908^^^
 ;;^UTILITY(U,$J,.84,9509,2,1,0)
 ;;=FIA array is set to "No data"
 ;;^UTILITY(U,$J,.84,9510,0)
 ;;=9510^1^^5
 ;;^UTILITY(U,$J,.84,9510,1,0)
 ;;=^^1^1^2940908^
 ;;^UTILITY(U,$J,.84,9510,1,1,0)
 ;;=DIFROM Server;  Records to transport do not exist.
 ;;^UTILITY(U,$J,.84,9510,2,0)
 ;;=^^1^1^2940908^
 ;;^UTILITY(U,$J,.84,9510,2,1,0)
 ;;=Records do not exist.
 ;;^UTILITY(U,$J,.84,9511,0)
 ;;=9511^1^^5
 ;;^UTILITY(U,$J,.84,9511,1,0)
 ;;=^^1^1^2940908^
 ;;^UTILITY(U,$J,.84,9511,1,1,0)
 ;;=DIFROM Server; DD not installed because FIA array does not exist.
 ;;^UTILITY(U,$J,.84,9511,2,0)
 ;;=^^1^1^2940908^
 ;;^UTILITY(U,$J,.84,9511,2,1,0)
 ;;=Data Dictionary not installed; FIA array does not exist.
 ;;^UTILITY(U,$J,.84,9512,0)
 ;;=9512^1^y^5
 ;;^UTILITY(U,$J,.84,9512,1,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,9512,1,1,0)
 ;;=Parent DD missing on Partial DD.
 ;;^UTILITY(U,$J,.84,9512,2,0)
 ;;=^^1^1^2940909^^^^
 ;;^UTILITY(U,$J,.84,9512,2,1,0)
 ;;=DD: |1| not installed, parent DD(s) missing.
 ;;^UTILITY(U,$J,.84,9513,0)
 ;;=9513^1^y^5
 ;;^UTILITY(U,$J,.84,9513,1,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9513,1,1,0)
 ;;=Invalid record in file.
 ;;^UTILITY(U,$J,.84,9513,2,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9513,2,1,0)
 ;;=IEN: |1| in file |2| is invalid.
 ;;^UTILITY(U,$J,.84,9513.1,0)
 ;;=9513.1^1^y^5
 ;;^UTILITY(U,$J,.84,9513.1,1,0)
 ;;=^^4^4^3000524^
 ;;^UTILITY(U,$J,.84,9513.1,1,1,0)
 ;;=Incoming data record has a .001 field or is DINUMed. There is already a
 ;;^UTILITY(U,$J,.84,9513.1,1,2,0)
 ;;=record at that IEN on the target site. The .01 field, required
 ;;^UTILITY(U,$J,.84,9513.1,1,3,0)
 ;;=Identifiers or Primary KEY don't match incoming record. Therefore record is
 ;;^UTILITY(U,$J,.84,9513.1,1,4,0)
 ;;=not added at target site.
 ;;^UTILITY(U,$J,.84,9513.1,2,0)
 ;;=^^2^2^3000524^
 ;;^UTILITY(U,$J,.84,9513.1,2,1,0)
 ;;=Record with .01 value |.01| and internal entry #|IEN|
 ;;^UTILITY(U,$J,.84,9513.1,2,2,0)
 ;;=could not be added to file |FILE|.
 ;;^UTILITY(U,$J,.84,9513.1,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9513.1,3,1,0)
 ;;=.01^.01 value from incoming record
 ;;^UTILITY(U,$J,.84,9513.1,3,2,0)
 ;;=IEN^IEN of incoming record
 ;;^UTILITY(U,$J,.84,9513.1,3,3,0)
 ;;=FILE^File Number
 ;;^UTILITY(U,$J,.84,9513.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9513.1,5,1,0)
 ;;=DITR^I
 ;;^UTILITY(U,$J,.84,9514,0)
 ;;=9514^1^y^5
 ;;^UTILITY(U,$J,.84,9514,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9514,1,1,0)
 ;;=Dangling pointer.  File, IEN and field.
 ;;^UTILITY(U,$J,.84,9514,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9514,2,1,0)
 ;;=Dangling pointer.  FILE: |1|, IEN: |2| FIELD: |3|
 ;;^UTILITY(U,$J,.84,9515,0)
 ;;=9515^1^y^5
 ;;^UTILITY(U,$J,.84,9515,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9515,1,1,0)
 ;;=No sending data on partial DDs.
 ;;^UTILITY(U,$J,.84,9515,2,0)
 ;;=^^1^1^2940909^

DINIT00Y
DINIT00Y ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9515,2,1,0)
 ;;=Partial DD.  No sending of data allowed for file |1|.
 ;;^UTILITY(U,$J,.84,9516,0)
 ;;=9516^1^y^5
 ;;^UTILITY(U,$J,.84,9516,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9516,1,1,0)
 ;;=Invalid entry in trasnport structure.
 ;;^UTILITY(U,$J,.84,9516,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9516,2,1,0)
 ;;=Transport structure does not contain |1| with IEN: |2|.
 ;;^UTILITY(U,$J,.84,9517,0)
 ;;=9517^1^y^5
 ;;^UTILITY(U,$J,.84,9517,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9517,1,1,0)
 ;;=DIFROM Server unable to install block.
 ;;^UTILITY(U,$J,.84,9517,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9517,2,1,0)
 ;;=DIFROM Server unable to install |1| block.
 ;;^UTILITY(U,$J,.84,9518,0)
 ;;=9518^1^y^5
 ;;^UTILITY(U,$J,.84,9518,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9518,1,1,0)
 ;;=DIFROM Server installed block but associated file not present.
 ;;^UTILITY(U,$J,.84,9518,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9518,2,1,0)
 ;;=|1| block installed but associated file #|2| is not on your system.
 ;;^UTILITY(U,$J,.84,9519,0)
 ;;=9519^1^^5
 ;;^UTILITY(U,$J,.84,9519,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9519,1,1,0)
 ;;=File number missing for "FILE-PRE" in KIDS process.
 ;;^UTILITY(U,$J,.84,9519,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9519,2,1,0)
 ;;=File number missing in "FILE-PRE".
 ;;^UTILITY(U,$J,.84,9520,0)
 ;;=9520^1^^5
 ;;^UTILITY(U,$J,.84,9520,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9520,1,1,0)
 ;;=Package name missing for "FILE-PRE" in KIDS process.
 ;;^UTILITY(U,$J,.84,9520,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9520,2,1,0)
 ;;=Package name missing for "FILE-PRE".
 ;;^UTILITY(U,$J,.84,9521,0)
 ;;=9521^1^^5
 ;;^UTILITY(U,$J,.84,9521,1,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9521,1,1,0)
 ;;=Invalid file number in KIDS "ENTRY-PRE"
 ;;^UTILITY(U,$J,.84,9521,2,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9521,2,1,0)
 ;;=File number invalid in "ENTRY-PRE".
 ;;^UTILITY(U,$J,.84,9522,0)
 ;;=9522^1^^5
 ;;^UTILITY(U,$J,.84,9522,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9522,1,1,0)
 ;;=Invalid entry number in KIDS "ENTRY-PRE"
 ;;^UTILITY(U,$J,.84,9522,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9522,2,1,0)
 ;;=Entry number invalid for "ENTRY-PRE"
 ;;^UTILITY(U,$J,.84,9523,0)
 ;;=9523^1^^5
 ;;^UTILITY(U,$J,.84,9523,1,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9523,1,1,0)
 ;;=Invalid entry in transport array.
 ;;^UTILITY(U,$J,.84,9523,2,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9523,2,1,0)
 ;;=Entry number invalid in transport array (source site DA).
 ;;^UTILITY(U,$J,.84,9524,0)
 ;;=9524^1^^5
 ;;^UTILITY(U,$J,.84,9524,1,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9524,1,1,0)
 ;;=Package name invalid in "ENTRY-PRE".
 ;;^UTILITY(U,$J,.84,9524,2,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9524,2,1,0)
 ;;=Invalid package name in "ENTRY-PRE".
 ;;^UTILITY(U,$J,.84,9525,0)
 ;;=9525^1^y^5
 ;;^UTILITY(U,$J,.84,9525,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9525,1,1,0)
 ;;=Package name ambigious.  Pointer not resolved.
 ;;^UTILITY(U,$J,.84,9525,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9525,2,1,0)
 ;;=|1| package name is ambigious.  Pointer |2| not resolved.
 ;;^UTILITY(U,$J,.84,9526,0)
 ;;=9526^1^^5
 ;;^UTILITY(U,$J,.84,9526,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9526,1,1,0)
 ;;=ZSave not defined in MUMPS Operating file.  Can not compile templates.
 ;;^UTILITY(U,$J,.84,9526,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9526,2,1,0)
 ;;=Unable to compile templates.  ZSave undefined in OS file.
 ;;^UTILITY(U,$J,.84,9527,0)
 ;;=9527^1^y^5
 ;;^UTILITY(U,$J,.84,9527,1,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9527,1,1,0)
 ;;=Invalid form.  DIFROM Server is unable to compile.
 ;;^UTILITY(U,$J,.84,9527,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9527,2,1,0)
 ;;=|1| form invalid.  Can not be compiled by KIDS process.
 ;;^UTILITY(U,$J,.84,9528,0)
 ;;=9528^1^y^5
 ;;^UTILITY(U,$J,.84,9528,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9528,1,1,0)
 ;;=Template can not be compiled.
 ;;^UTILITY(U,$J,.84,9528,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9528,2,1,0)
 ;;=|1| template |2| is invalid.  KIDS process can not compile.
 ;;^UTILITY(U,$J,.84,9529,0)
 ;;=9529^1^^5
 ;;^UTILITY(U,$J,.84,9529,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9529,1,1,0)
 ;;=Template or form file number is invalid.  DIFROM Server/KIDS
 ;;^UTILITY(U,$J,.84,9529,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9529,2,1,0)
 ;;=Template or form file number is invalid.
 ;;^UTILITY(U,$J,.84,9530,0)
 ;;=9530^1^^5
 ;;^UTILITY(U,$J,.84,9530,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9530,1,1,0)
 ;;=Transport package name is invalid.  (KIDS)
 ;;^UTILITY(U,$J,.84,9530,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9530,2,1,0)
 ;;=Transport package name is invalid.  (DIFROM Server/KIDS)
 ;;^UTILITY(U,$J,.84,9531,0)
 ;;=9531^1^^5
 ;;^UTILITY(U,$J,.84,9531,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9531,1,1,0)
 ;;=Invalid EDE(s).
 ;;^UTILITY(U,$J,.84,9531,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9531,2,1,0)
 ;;=Invalid EDE(s).  (DIFROM Server/KIDS)
 ;;^UTILITY(U,$J,.84,9532,0)
 ;;=9532^1^^5
 ;;^UTILITY(U,$J,.84,9532,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9532,1,1,0)
 ;;=No IEN(s) in array.  (KIDS)
 ;;^UTILITY(U,$J,.84,9532,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9532,2,1,0)
 ;;=No IEN(s) in list.
 ;;^UTILITY(U,$J,.84,9533,0)
 ;;=9533^1^^5
 ;;^UTILITY(U,$J,.84,9533,1,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9533,1,1,0)
 ;;=Source array root missing.
 ;;^UTILITY(U,$J,.84,9533,2,0)
 ;;=^^1^1^2940909^
 ;;^UTILITY(U,$J,.84,9533,2,1,0)
 ;;=Source array root missing.
 ;;^UTILITY(U,$J,.84,9534,0)
 ;;=9534^1^y^5
 ;;^UTILITY(U,$J,.84,9534,1,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9534,1,1,0)
 ;;=Resolved value data link missing.
 ;;^UTILITY(U,$J,.84,9534,2,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9534,2,1,0)
 ;;=Resolved Value Data Link missing |1|.
 ;;^UTILITY(U,$J,.84,9535,0)
 ;;=9535^1^y^5
 ;;^UTILITY(U,$J,.84,9535,1,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9535,1,1,0)
 ;;=Pointer file missing.
 ;;^UTILITY(U,$J,.84,9535,2,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9535,2,1,0)
 ;;=Pointer file missing |1|.
 ;;^UTILITY(U,$J,.84,9536,0)
 ;;=9536^1^y^5
 ;;^UTILITY(U,$J,.84,9536,1,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9536,1,1,0)
 ;;=Pointed too file not on target system.
 ;;^UTILITY(U,$J,.84,9536,2,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9536,2,1,0)
 ;;=Pointed too file not on target system |1|.

DINIT00Z
DINIT00Z ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9537,0)
 ;;=9537^1^y^5
 ;;^UTILITY(U,$J,.84,9537,1,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9537,1,1,0)
 ;;=Unable to find exact match and resolve pointer.
 ;;^UTILITY(U,$J,.84,9537,2,0)
 ;;=^^1^1^2940909^^^
 ;;^UTILITY(U,$J,.84,9537,2,1,0)
 ;;=Unable to find exact match and resolve pointer |1|.
 ;;^UTILITY(U,$J,.84,9538,0)
 ;;=9538^1^y^5
 ;;^UTILITY(U,$J,.84,9538,1,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9538,1,1,0)
 ;;=Pointer resolved value is missing.
 ;;^UTILITY(U,$J,.84,9538,2,0)
 ;;=^^1^1^2940909^^
 ;;^UTILITY(U,$J,.84,9538,2,1,0)
 ;;=Pointer resolved value is missing |1|.
 ;;^UTILITY(U,$J,.84,9539,0)
 ;;=9539^1^y^5
 ;;^UTILITY(U,$J,.84,9539,1,0)
 ;;=^^1^1^2940914^
 ;;^UTILITY(U,$J,.84,9539,1,1,0)
 ;;=File not on this system.
 ;;^UTILITY(U,$J,.84,9539,2,0)
 ;;=^^1^1^2940914^
 ;;^UTILITY(U,$J,.84,9539,2,1,0)
 ;;=File #|1| not on this system.
 ;;^UTILITY(U,$J,.84,9540,0)
 ;;=9540^1^y^5
 ;;^UTILITY(U,$J,.84,9540,1,0)
 ;;=^^1^1^2940914^^
 ;;^UTILITY(U,$J,.84,9540,1,1,0)
 ;;=DD not on this system.
 ;;^UTILITY(U,$J,.84,9540,2,0)
 ;;=^^1^1^2940914^^
 ;;^UTILITY(U,$J,.84,9540,2,1,0)
 ;;=DD #|1| not on this system.
 ;;^UTILITY(U,$J,.84,9541,0)
 ;;=9541^1^y^5
 ;;^UTILITY(U,$J,.84,9541,1,0)
 ;;=^^1^1^2940914^^
 ;;^UTILITY(U,$J,.84,9541,1,1,0)
 ;;=Field not on this system.
 ;;^UTILITY(U,$J,.84,9541,2,0)
 ;;=^^1^1^2940914^^
 ;;^UTILITY(U,$J,.84,9541,2,1,0)
 ;;=Field #|1|, DD #|2|, not on this system.
 ;;^UTILITY(U,$J,.84,9542,0)
 ;;=9542^1^^5
 ;;^UTILITY(U,$J,.84,9542,1,0)
 ;;=^^1^1^2940914^
 ;;^UTILITY(U,$J,.84,9542,1,1,0)
 ;;=File number missing or invalid for FIA structure.
 ;;^UTILITY(U,$J,.84,9542,2,0)
 ;;=^^1^1^2940914^
 ;;^UTILITY(U,$J,.84,9542,2,1,0)
 ;;=File number missing or invalid to build FIA structure.
 ;;^UTILITY(U,$J,.84,9543,0)
 ;;=9543^1^y^5
 ;;^UTILITY(U,$J,.84,9543,1,0)
 ;;=^^4^4^2980505^
 ;;^UTILITY(U,$J,.84,9543,1,1,0)
 ;;=Each field involved in an INDEX or KEY entry should be included in the
 ;;^UTILITY(U,$J,.84,9543,1,2,0)
 ;;=KIDS' transport global.  If a field participating in an INDEX or KEY entry
 ;;^UTILITY(U,$J,.84,9543,1,3,0)
 ;;=is missing from the transport global, the INDEX or KEY entry is not
 ;;^UTILITY(U,$J,.84,9543,1,4,0)
 ;;=exported.
 ;;^UTILITY(U,$J,.84,9543,2,0)
 ;;=^^2^2^2980505^^
 ;;^UTILITY(U,$J,.84,9543,2,1,0)
 ;;=Field |1| of file |2|, part of '|3|' |4| entry, is missing from the
 ;;^UTILITY(U,$J,.84,9543,2,2,0)
 ;;=transport global.
 ;;^UTILITY(U,$J,.84,9543,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,9543,3,1,0)
 ;;=1^Field name
 ;;^UTILITY(U,$J,.84,9543,3,2,0)
 ;;=2^File name
 ;;^UTILITY(U,$J,.84,9543,3,3,0)
 ;;=3^Index or Key name
 ;;^UTILITY(U,$J,.84,9543,3,4,0)
 ;;=4^KEY or INDEX
 ;;^UTILITY(U,$J,.84,9543,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,9543,5,1,0)
 ;;=DIFROMSX^DDIXOUT
 ;;^UTILITY(U,$J,.84,9543,5,2,0)
 ;;=DIFROMSY^DDKEYOUT
 ;;^UTILITY(U,$J,.84,9544,0)
 ;;=9544^1^y^5
 ;;^UTILITY(U,$J,.84,9544,1,0)
 ;;=^^4^4^2980505^^
 ;;^UTILITY(U,$J,.84,9544,1,1,0)
 ;;=Each field involved in an INDEX or KEY entry should be included in the
 ;;^UTILITY(U,$J,.84,9544,1,2,0)
 ;;=KIDS' transport global. If any fields participating in an INDEX or KEY
 ;;^UTILITY(U,$J,.84,9544,1,3,0)
 ;;=entry are missing from the transport global, the INDEX or KEY entry is not
 ;;^UTILITY(U,$J,.84,9544,1,4,0)
 ;;=exported.
 ;;^UTILITY(U,$J,.84,9544,2,0)
 ;;=^^2^2^2980507^
 ;;^UTILITY(U,$J,.84,9544,2,1,0)
 ;;=Field(s) that are part of '|1|' |2| entry for file |3| are missing from
 ;;^UTILITY(U,$J,.84,9544,2,2,0)
 ;;=the transport global.
 ;;^UTILITY(U,$J,.84,9544,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9544,3,1,0)
 ;;=1^Key or Index Name
 ;;^UTILITY(U,$J,.84,9544,3,2,0)
 ;;=2^KEY or INDEX
 ;;^UTILITY(U,$J,.84,9544,3,3,0)
 ;;=3^File Name
 ;;^UTILITY(U,$J,.84,9544,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9544,5,1,0)
 ;;=DIFROMSX^DDIXOUT
 ;;^UTILITY(U,$J,.84,9545,0)
 ;;=9545^1^y^5
 ;;^UTILITY(U,$J,.84,9545,1,0)
 ;;=^^2^2^2980505^^
 ;;^UTILITY(U,$J,.84,9545,1,1,0)
 ;;=INDEX entry not installed.  This entry references a field that does not
 ;;^UTILITY(U,$J,.84,9545,1,2,0)
 ;;=exist on the target system.
 ;;^UTILITY(U,$J,.84,9545,2,0)
 ;;=^^2^2^2980507^
 ;;^UTILITY(U,$J,.84,9545,2,1,0)
 ;;=|1| '|2|' not installed.  Field |3| in file |4|
 ;;^UTILITY(U,$J,.84,9545,2,2,0)
 ;;=does not exist on the system.
 ;;^UTILITY(U,$J,.84,9545,3,0)
 ;;=^.845^4^4
 ;;^UTILITY(U,$J,.84,9545,3,1,0)
 ;;=2^This is name of the Index file entry.
 ;;^UTILITY(U,$J,.84,9545,3,2,0)
 ;;=3^This is the field that is being referenced by the Index entry.
 ;;^UTILITY(U,$J,.84,9545,3,3,0)
 ;;=4^This is the file that is being referenced by the Index entry.
 ;;^UTILITY(U,$J,.84,9545,3,4,0)
 ;;=1^KEY or INDEX
 ;;^UTILITY(U,$J,.84,9545,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,9545,5,1,0)
 ;;=DDFROMSX^DDIXIN
 ;;^UTILITY(U,$J,.84,9545,5,2,0)
 ;;=DDFROMSY^DDKEYIN
 ;;^UTILITY(U,$J,.84,9546,0)
 ;;=9546^1^y^5
 ;;^UTILITY(U,$J,.84,9546,1,0)
 ;;=^^2^2^2980505^
 ;;^UTILITY(U,$J,.84,9546,1,1,0)
 ;;=Uniqueness index pointer either missing from KEY file entry or invalid,
 ;;^UTILITY(U,$J,.84,9546,1,2,0)
 ;;=when trying to transport the KEY.
 ;;^UTILITY(U,$J,.84,9546,2,0)
 ;;=^^2^2^2980505^
 ;;^UTILITY(U,$J,.84,9546,2,1,0)
 ;;=KEY '|1|' for file |2| cannot be transported, problem with Uniqueness
 ;;^UTILITY(U,$J,.84,9546,2,2,0)
 ;;=Index for the KEY.
 ;;^UTILITY(U,$J,.84,9546,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9546,3,1,0)
 ;;=1^This is the name of the KEY file entry.
 ;;^UTILITY(U,$J,.84,9546,3,2,0)
 ;;=2^This is the file number that owns the KEY file entry.
 ;;^UTILITY(U,$J,.84,9547,0)
 ;;=9547^1^y^5
 ;;^UTILITY(U,$J,.84,9547,1,0)
 ;;=^^2^2^2980505^^
 ;;^UTILITY(U,$J,.84,9547,1,1,0)
 ;;=KEY file entry cannot be installed because Uniqueness Index pointer can't
 ;;^UTILITY(U,$J,.84,9547,1,2,0)
 ;;=be resolved.
 ;;^UTILITY(U,$J,.84,9547,2,0)
 ;;=^^2^2^2980507^
 ;;^UTILITY(U,$J,.84,9547,2,1,0)
 ;;=KEY entry '|1|' for file |2| not installed.  Pointer to Uniqueness Index
 ;;^UTILITY(U,$J,.84,9547,2,2,0)
 ;;=cannot be resolved.
 ;;^UTILITY(U,$J,.84,9547,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9547,3,1,0)
 ;;=1^This is the name of the KEY file entry
 ;;^UTILITY(U,$J,.84,9547,3,2,0)
 ;;=2^This is the number of the file that owns the KEY.
 ;;^UTILITY(U,$J,.84,9547,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9547,5,1,0)
 ;;=DIFROMSY^DDKEYIN
 ;;^UTILITY(U,$J,.84,9548,0)
 ;;=9548^1^y^5
 ;;^UTILITY(U,$J,.84,9548,1,0)
 ;;=^^2^2^2980610^
 ;;^UTILITY(U,$J,.84,9548,1,1,0)
 ;;=Error from TRANSFER mode, when DD is being cloned from the transfer FROM

DINIT010
DINIT010 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ; 3/30/99  10:41:48
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9548,1,2,0)
 ;;=DD, and KEY or INDEX entry for the new DD is already on file.
 ;;^UTILITY(U,$J,.84,9548,2,0)
 ;;=^^2^2^2980610^
 ;;^UTILITY(U,$J,.84,9548,2,1,0)
 ;;=|1| '|2|' for file |3| already exists.
 ;;^UTILITY(U,$J,.84,9548,2,2,0)
 ;;=Check this after the TRANSFER is complete.
 ;;^UTILITY(U,$J,.84,9548,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9548,3,1,0)
 ;;=1^The word 'KEY' or 'INDEX'
 ;;^UTILITY(U,$J,.84,9548,3,2,0)
 ;;=2^Name of INDEX or KEY
 ;;^UTILITY(U,$J,.84,9548,3,3,0)
 ;;=3^File/subfile number
 ;;^UTILITY(U,$J,.84,9548,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9548,5,1,0)
 ;;=DIT1^IXKEY

DINIT011
DINIT011 ; SFISC/TKW,VEN/SMH-DIALOG & LANGUAGE FILE INITS ; 6 DEC 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X'["^"  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DIC(.85,0,"GL")
 ;;=^DI(.85,
 ;;^DIC("B","LANGUAGE",.85)
 ;;=
 ;;^DIC(.85,"%",0)
 ;;=^1.005
 ;;^DIC(.85,"%D",0)
 ;;=^^27^27^3121101^
 ;;^DIC(.85,"%D",1,0)
 ;;=The LANGUAGE file is used both to officially identify a language, and to
 ;;^DIC(.85,"%D",2,0)
 ;;=store MUMPS code needed to do language-specific conversions of data such
 ;;^DIC(.85,"%D",3,0)
 ;;=as dates and numbers.
 ;;^DIC(.85,"%D",4,0)
 ;;= 
 ;;^DIC(.85,"%D",5,0)
 ;;=Fileman distributes entries for the following languages:
 ;;^DIC(.85,"%D",6,0)
 ;;= ID Number (.001)       Name (.01)
 ;;^DIC(.85,"%D",7,0)
 ;;=                1       English
 ;;^DIC(.85,"%D",8,0)
 ;;=                2       German
 ;;^DIC(.85,"%D",9,0)
 ;;=                3       Spanish
 ;;^DIC(.85,"%D",10,0)
 ;;=                4       French
 ;;^DIC(.85,"%D",11,0)
 ;;=                5       Finnish
 ;;^DIC(.85,"%D",12,0)
 ;;=                6       Italian
 ;;^DIC(.85,"%D",13,0)
 ;;=                7       Portuguese
 ;;^DIC(.85,"%D",14,0)
 ;;=               10       Arabic
 ;;^DIC(.85,"%D",15,0)
 ;;=               11       Russian
 ;;^DIC(.85,"%D",16,0)
 ;;=               12       Greek
 ;;^DIC(.85,"%D",17,0)
 ;;=               18       Hebrew
 ;;^DIC(.85,"%D",18,0)
 ;;= 
 ;;^DIC(.85,"%D",19,0)
 ;;=The ISO-639-1 and ISO-639-2 compatible language file is distributed in the
 ;;^DIC(.85,"%D",20,0)
 ;;=DMLAINIT routines, shipped with Fileman 22.2.
 ;;^DIC(.85,"%D",21,0)
 ;;= 
 ;;^DIC(.85,"%D",22,0)
 ;;=A pointer to this file from the TRANSLATION multiple on the DIALOG file
 ;;^DIC(.85,"%D",23,0)
 ;;=also allows non-English text to be returned via FileMan calls.
 ;;^DIC(.85,"%D",24,0)
 ;;= 
 ;;^DIC(.85,"%D",25,0)
 ;;=A note to VISTA developers: Although users can select entries by name, 
 ;;^DIC(.85,"%D",26,0)
 ;;=software should use the official two or three letter codes to eliminiate 
 ;;^DIC(.85,"%D",27,0)
 ;;=mistakes resulting from languages that have similar spelling.
 ;;^DIC(.85,"%MSC")
 ;;=3121114.111954
 ;;^DD(.85,0)
 ;;=FIELD^^10^20
 ;;^DD(.85,0,"DDA")
 ;;=N
 ;;^DD(.85,0,"DT")
 ;;=3121101
 ;;^DD(.85,0,"ID",.02)
 ;;=W "   ",$P(^(0),U,2)
 ;;^DD(.85,0,"ID",.03)
 ;;=W "   ",$P(^(0),U,3)
 ;;^DD(.85,0,"IX","F",.8501,.01)
 ;;=
 ;;^DD(.85,0,"NM","LANGUAGE")
 ;;=
 ;;^DD(.85,0,"PT",.007,.001)
 ;;=
 ;;^DD(.85,0,"PT",.008,.001)
 ;;=
 ;;^DD(.85,0,"PT",.009,.001)
 ;;=
 ;;^DD(.85,0,"PT",.4,709.1)
 ;;=
 ;;^DD(.85,0,"PT",.4,1819.1)
 ;;=
 ;;^DD(.85,0,"PT",.847,.01)
 ;;=
 ;;^DD(.85,0,"PT",.85,.08)
 ;;=
 ;;^DD(.85,0,"PT",.85,.09)
 ;;=
 ;;^DD(.85,0,"PT",1.008,.001)
 ;;=
 ;;^DD(.85,0,"PT",200,200.07)
 ;;=
 ;;^DD(.85,0,"PT",8989.3,207)
 ;;=
 ;;^DD(.85,.001,0)
 ;;=ID NUMBER^NJ10,0^^ ^K:+X'=X!(X>9999999999)!(X<1)!(X?.E1"."1.N) X
 ;;^DD(.85,.001,3)
 ;;=Type a number between 1 and 9999999999, 0 decimal digits.
 ;;^DD(.85,.001,21,0)
 ;;=^^3^3^3121031^^
 ;;^DD(.85,.001,21,1,0)
 ;;=A number that is used to uniquely identify a language.  This number
 ;;^DD(.85,.001,21,2,0)
 ;;=corresponds to the Kernel system variable DUZ("LANG"), which is set
 ;;^DD(.85,.001,21,3,0)
 ;;=during Kernel signon to signify which language Fileman should use.
 ;;^DD(.85,.001,23,0)
 ;;=^^31^31^3121031^
 ;;^DD(.85,.001,23,1,0)
 ;;=Entries in this file are standardized, with the contents controlled by 
 ;;^DD(.85,.001,23,2,0)
 ;;=the Fileman Primary Development Team. The ID Number field is used to help 
 ;;^DD(.85,.001,23,3,0)
 ;;=protect referential integrity in VISTA databases during upgrades to the 
 ;;^DD(.85,.001,23,4,0)
 ;;=file. ID Number assignment corresponds to the order in which languages 
 ;;^DD(.85,.001,23,5,0)
 ;;=were added to the file. They were added in segments.
 ;;^DD(.85,.001,23,6,0)
 ;;= 
 ;;^DD(.85,.001,23,7,0)
 ;;=The first segment consists of language numbers 1-7, 10-12, and 18, which 
 ;;^DD(.85,.001,23,8,0)
 ;;=were the first eleven languages added, in order. English is first because 
 ;;^DD(.85,.001,23,9,0)
 ;;=Fileman was originally written in English. German is second because 
 ;;^DD(.85,.001,23,10,0)
 ;;=Marcus Werners of Germany led the effort to create Fileman's dialog 
 ;;^DD(.85,.001,23,11,0)
 ;;=framework, to make translating VISTA into other languages easier. 
 ;;^DD(.85,.001,23,12,0)
 ;;=Spanish, French, Finnish, Italian, and Portuguese follow in the order in 
 ;;^DD(.85,.001,23,13,0)
 ;;=which the Fileman team was approached by potential translators about 
 ;;^DD(.85,.001,23,14,0)
 ;;=adding those languages to the file (though Finnish actually predates all 
 ;;^DD(.85,.001,23,15,0)
 ;;=other translation efforts except English). Arabic was assigned ID Number 
 ;;^DD(.85,.001,23,16,0)
 ;;=10 instead of 8 in recognition of the debt English owes Arabic for 
 ;;^DD(.85,.001,23,17,0)
 ;;=introducing the decimal numbering system to Europe. Russian and Greek 
 ;;^DD(.85,.001,23,18,0)
 ;;=were the next two translations the Fileman team was approached about. I 
 ;;^DD(.85,.001,23,19,0)
 ;;=do not recall why for Hebrew we skipped ahead to ID Number 18, but I'm 
 ;;^DD(.85,.001,23,20,0)
 ;;=sure there was a reason.
 ;;^DD(.85,.001,23,21,0)
 ;;= 
 ;;^DD(.85,.001,23,22,0)
 ;;=Thereafter, languages are added in segments, in order by Name, starting 
 ;;^DD(.85,.001,23,23,0)
 ;;=with ID Number 8. The segments correspond to the ISO 639 language 
 ;;^DD(.85,.001,23,24,0)
 ;;=standards, in order (639-1 languages in segment two, 639-2 in three, and 
 ;;^DD(.85,.001,23,25,0)
 ;;=so on). Each language has one unique record in this file, so wherever a 
 ;;^DD(.85,.001,23,26,0)
 ;;=language in one segment has already been included in an earlier segment, 
 ;;^DD(.85,.001,23,27,0)
 ;;=it is not included in the later segment (e.g., Greek was in segment one, 
 ;;^DD(.85,.001,23,28,0)
 ;;=so it is not also added as a duplicate in segment two).
 ;;^DD(.85,.001,23,29,0)
 ;;= 
 ;;^DD(.85,.001,23,30,0)
 ;;=This segmented approach makes it comparatively easy to upgrade the file 
 ;;^DD(.85,.001,23,31,0)
 ;;=in discrete batches, to keep the update projects manageable.
 ;;^DD(.85,.001,"DT")
 ;;=3121031
 ;;^DD(.85,.01,0)
 ;;=NAME^RFJ60^^0;1^K:$L(X)>60!($L(X)<1) X
 ;;^DD(.85,.01,.1)
 ;;=Language-Name
 ;;^DD(.85,.01,3)
 ;;=Answer must be 1-60 characters in length.
 ;;^DD(.85,.01,21,0)
 ;;=^^10^10^3121031^
 ;;^DD(.85,.01,21,1,0)
 ;;=Enter the English name of the language, not the native name. 
 ;;^DD(.85,.01,21,2,0)
 ;;= 
 ;;^DD(.85,.01,21,3,0)
 ;;=The default is the English name from ISO 639, converted where necessary to
 ;;^DD(.85,.01,21,4,0)
 ;;=ASCII. Where the ISO 639 standards disagree (cf. "Central Khmer" in ISO
 ;;^DD(.85,.01,21,5,0)
 ;;=639-1 to "Khmer" in ISO 639-3), the most recent standard's spelling is
 ;;^DD(.85,.01,21,6,0)
 ;;=used.
 ;;^DD(.85,.01,21,7,0)
 ;;= 
 ;;^DD(.85,.01,21,8,0)
 ;;=However, this use of ISO 639's spelling as a default is overridden in 
 ;;^DD(.85,.01,21,9,0)
 ;;=several different ways to improve consistency across entries and to 
 ;;^DD(.85,.01,21,10,0)
 ;;=reduce selection error.
 ;;^DD(.85,.01,23,0)
 ;;=^^63^63^3121031^
 ;;^DD(.85,.01,23,1,0)
 ;;=This is the English name of the language, not the native name. It 
 ;;^DD(.85,.01,23,2,0)
 ;;=defaults to the English name from ISO 639, mixed case, converted where 
 ;;^DD(.85,.01,23,3,0)
 ;;=necessary to ASCII. Where the ISO 639 standards disagree (cf. "Central 
 ;;^DD(.85,.01,23,4,0)
 ;;=Khmer" in ISO 639-1 to "Khmer" in ISO 639-3), the most recent standard's 
 ;;^DD(.85,.01,23,5,0)
 ;;=spelling is used.
 ;;^DD(.85,.01,23,6,0)
 ;;= 
 ;;^DD(.85,.01,23,7,0)
 ;;=However, this use of ISO 639's spelling as a default is overridden in 
 ;;^DD(.85,.01,23,8,0)
 ;;=several different ways to improve consistency across entries and to 
 ;;^DD(.85,.01,23,9,0)
 ;;=reduce selection error.
 ;;^DD(.85,.01,23,10,0)
 ;;= 
 ;;^DD(.85,.01,23,11,0)
 ;;=For example, for most modern languages, the form of the name that 
 ;;^DD(.85,.01,23,12,0)
 ;;=includes the word "Modern" and the parenthesized dates is an alternate 
 ;;^DD(.85,.01,23,13,0)
 ;;=name, but ISO 639 reverses that with Modern Greek. In this file, we 
 ;;^DD(.85,.01,23,14,0)
 ;;=reassert the pattern by making the ISO 639 name "Greek, Modern (1453-)" 
 ;;^DD(.85,.01,23,15,0)
 ;;=an alternate name and making the name "Greek" instead.
 ;;^DD(.85,.01,23,16,0)
 ;;= 
 ;;^DD(.85,.01,23,17,0)
 ;;=Since most users of these systems are medical professionals rather than 
 ;;^DD(.85,.01,23,18,0)
 ;;=linguists or historians, we emphasize modern languages and group 
 ;;^DD(.85,.01,23,19,0)
 ;;=historical ones away from the modern names to reduce accidents. For 
 ;;^DD(.85,.01,23,20,0)
 ;;=example, "French, Old (842-ca.1400)" as so named in ISO 639-2 is used as 
 ;;^DD(.85,.01,23,21,0)
 ;;=an alternate name for "Old French" in this file, to move the obsolete 
 ;;^DD(.85,.01,23,22,0)
 ;;=form of the language away from the modern one. Thus, "Old" languages, 
 ;;^DD(.85,.01,23,23,0)
 ;;="Ancient" ones, and "Middle" ones will tend to sort together. However, 
 ;;^DD(.85,.01,23,24,0)
 ;;=languages whose names look like historical ones, such as "Old Church 
 ;;^DD(.85,.01,23,25,0)
 ;;=Slavonic", that are still living languages or in active liturgical use 
 ;;^DD(.85,.01,23,26,0)
 ;;=are kept in this form if that is how they are best known.
 ;;^DD(.85,.01,23,27,0)
 ;;= 
 ;;^DD(.85,.01,23,28,0)
 ;;=Also, such forms that include parenthetical dates are changed to remove 
 ;;^DD(.85,.01,23,29,0)
 ;;=the dates and parentheses from the Name field; the original forms and 
 ;;^DD(.85,.01,23,30,0)
 ;;=variants are preserved in the Alternate Name field.
 ;;^DD(.85,.01,23,31,0)
 ;;= 
 ;;^DD(.85,.01,23,32,0)
 ;;=For similar reasons, language collections like "Banda languages" are 
 ;;^DD(.85,.01,23,33,0)
 ;;=renamed as "Languages, Banda" to move them away from individual language 
 ;;^DD(.85,.01,23,34,0)
 ;;=a patient might speak, like "Banda-Banda". The same was preserved from 
 ;;^DD(.85,.01,23,35,0)
 ;;=ISO 639 with creoles and pidgins (such as "Creoles and Pidgins, 
 ;;^DD(.85,.01,23,36,0)
 ;;=Portuguese-Based"), which are collective languages, to kepp them separate 
 ;;^DD(.85,.01,23,37,0)
 ;;=from the individual languages they might be confused with (such as 
 ;;^DD(.85,.01,23,38,0)
 ;;="Portuguese"). However, individual languages like "Haitian Creole" and 
 ;;^DD(.85,.01,23,39,0)
 ;;="Chinook Jargon" whose ISO 639 names makes them sound like language 
 ;;^DD(.85,.01,23,40,0)
 ;;=collections are nevertheless left as is, since these are the names they 
 ;;^DD(.85,.01,23,41,0)
 ;;=are known by and since the distinguishing part of the name does come 
 ;;^DD(.85,.01,23,42,0)
 ;;=first, allowing for unambiguous selection.
 ;;^DD(.85,.01,23,43,0)
 ;;= 
 ;;^DD(.85,.01,23,44,0)
 ;;=Where the language name from ISO 639 is a list of alternative names, as 
 ;;^DD(.85,.01,23,45,0)
 ;;=in "Catalan, Valencian", the dominant name (based on other code sets, 
 ;;^DD(.85,.01,23,46,0)
 ;;=Ethnologue, Wikipedia, e.g. "Catalan") is used as the Name, with the 
 ;;^DD(.85,.01,23,47,0)
 ;;=other name(s) (e.g., "Valencian") added to the Alternate Name field.
 ;;^DD(.85,.01,23,48,0)
 ;;= 
 ;;^DD(.85,.01,23,49,0)
 ;;=As a general rule (except in the case of language collections), ISO 639 
 ;;^DD(.85,.01,23,50,0)
 ;;=names that use commas to invert a language name (like "Sorbian, Upper") 
 ;;^DD(.85,.01,23,51,0)
 ;;=are corrected (like "Upper Sorbian"), and the ISO 639 name is made an 
 ;;^DD(.85,.01,23,52,0)
 ;;=Alternate Name. We do not try to use commas in the Name field to group 
 ;;^DD(.85,.01,23,53,0)
 ;;=together all related languages or dialects, though we do in the Alternate 
 ;;^DD(.85,.01,23,54,0)
 ;;=Name field.
 ;;^DD(.85,.01,23,55,0)
 ;;= 
 ;;^DD(.85,.01,23,56,0)
 ;;=In the Name field, parenthetical comments are generally restricted to 
 ;;^DD(.85,.01,23,57,0)
 ;;=distinguishing between unrelated languages that have the same name, like 
 ;;^DD(.85,.01,23,58,0)
 ;;="Lele (Democratic Republic of Congo)" and "Lele (Papua New Guinea)". The 
 ;;^DD(.85,.01,23,59,0)
 ;;=parenthetical words will be (in order of preference) a country, a people, 
 ;;^DD(.85,.01,23,60,0)
 ;;=or an alternate name of the language, so long as it distinguishes it from 
 ;;^DD(.85,.01,23,61,0)
 ;;=the other identically named languages. To date, we have not had to change 
 ;;^DD(.85,.01,23,62,0)
 ;;=any of the ISO 639 names we've imported to make or correct these 
 ;;^DD(.85,.01,23,63,0)
 ;;=distinctions, but we stand ready to do so to enforce this pattern.
 ;;^DD(.85,.01,"DT")
 ;;=3121031
 ;;^DD(.85,.02,0)
 ;;=TWO LETTER CODE^FJ2^^0;2^K:$L(X)>2!($L(X)<2) X
 ;;^DD(.85,.02,3)
 ;;=Answer must be 2 characters in length.
 ;;^DD(.85,.02,21,0)
 ;;=^^3^3^3121101^^
 ;;^DD(.85,.02,21,1,0)
 ;;=Enter the two-letter code defined for this language in the ISO 639-1
 ;;^DD(.85,.02,21,2,0)
 ;;=standard. Not every language has a two-letter code; for those that do not
 ;;^DD(.85,.02,21,3,0)
 ;;=leave this field blank.
 ;;^DD(.85,.02,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.02,23,1,0)
 ;;=Future versions of this file wil include an optional key on this field.
 ;;^DD(.85,.02,"DT")
 ;;=3121101
 ;;^DD(.85,.03,0)
 ;;=THREE LETTER CODE^FJ3^^0;3^K:$L(X)>3!($L(X)<3) X
 ;;^DD(.85,.03,3)
 ;;=Answer must be 3 characters in length.
 ;;^DD(.85,.03,21,0)
 ;;=^^2^2^3121101^^^^
 ;;^DD(.85,.03,21,1,0)
 ;;=Enter the three-letter code defined for this language in the ISO 639-2/B
 ;;^DD(.85,.03,21,2,0)
 ;;=standard.
 ;;^DD(.85,.03,23,0)
 ;;=^^2^2^3121101^
 ;;^DD(.85,.03,23,1,0)
 ;;=When this file is upgraded to ISO-639-6, an optional key will be added to 
 ;;^DD(.85,.03,23,2,0)
 ;;=this field.
 ;;^DD(.85,.03,"DT")
 ;;=3121101
 ;;^DD(.85,.04,0)
 ;;=FOUR LETTER CODE^FJ4^^0;4^K:$L(X)>4!($L(X)<4) X
 ;;^DD(.85,.04,3)
 ;;=Answer must be 4 characters in length.
 ;;^DD(.85,.04,21,0)
 ;;=^^1^1^3121101^^^
 ;;^DD(.85,.04,21,1,0)
 ;;=Enter the four letter code associated with the language in ISO-639-6. 
 ;;^DD(.85,.04,23,0)
 ;;=^^3^3^3121101^
 ;;^DD(.85,.04,23,1,0)
 ;;=This field is currently not used in this version of the release (as of
 ;;^DD(.85,.04,23,2,0)
 ;;=Fileman V22.2). In a future version when this file is upgraded to 
 ;;^DD(.85,.04,23,3,0)
 ;;=ISO-639-6, a key will be added to this field.
 ;;^DD(.85,.04,"DT")
 ;;=3121101

DINIT012
DINIT012 ; SFISC/TKW,VEN/SMH-DIALOG & LANGUAGE FILE INITS ; 6 DEC 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DD(.85,.05,0)
 ;;=ALTERNATE THREE LETTER CODE^FJ3^^0;5^K:$L(X)>3!($L(X)<3) X
 ;;^DD(.85,.05,3)
 ;;=Answer must be 3 characters in length.
 ;;^DD(.85,.05,21,0)
 ;;=^^4^4^3121101^
 ;;^DD(.85,.05,21,1,0)
 ;;=This is the alternate three letter code for a language. This will only be 
 ;;^DD(.85,.05,21,2,0)
 ;;=used in cases where the language abbreviation is different in English 
 ;;^DD(.85,.05,21,3,0)
 ;;=than in the native language. E.g. GER instead of DEU; for German instead 
 ;;^DD(.85,.05,21,4,0)
 ;;=of Deutsch. This alternate abbreviation can be found in ISO 639-2/B.
 ;;^DD(.85,.05,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.05,23,1,0)
 ;;=In a future version of Fileman, this field will have an optional key.
 ;;^DD(.85,.05,"DT")
 ;;=3121101
 ;;^DD(.85,.06,0)
 ;;=SCOPE^S^I:Individual;M:Macrolanguage;C:Collective;S:Special;L:Local;^0;6^Q
 ;;^DD(.85,.06,3)
 ;;=Select a language's scope
 ;;^DD(.85,.06,21,0)
 ;;=^^12^12^3121031^
 ;;^DD(.85,.06,21,1,0)
 ;;=Enter the Scope of a Language.
 ;;^DD(.85,.06,21,2,0)
 ;;= 
 ;;^DD(.85,.06,21,3,0)
 ;;=Individual if the language is an individually identifiable language 
 ;;^DD(.85,.06,21,4,0)
 ;;=(e.g. 'Cantonese').
 ;;^DD(.85,.06,21,5,0)
 ;;= 
 ;;^DD(.85,.06,21,6,0)
 ;;=Macrolanguage if the language encopasses several other languages (e.g. 
 ;;^DD(.85,.06,21,7,0)
 ;;='Chinese')
 ;;^DD(.85,.06,21,8,0)
 ;;= 
 ;;^DD(.85,.06,21,9,0)
 ;;=Collective if the language is a language group (e.g. 'Languages, 
 ;;^DD(.85,.06,21,10,0)
 ;;=Sino-Tibetan')
 ;;^DD(.85,.06,21,11,0)
 ;;= 
 ;;^DD(.85,.06,21,12,0)
 ;;=Special and Local are reserved for specific entries.
 ;;^DD(.85,.06,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.06,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.06,"DT")
 ;;=3121101
 ;;^DD(.85,.07,0)
 ;;=TYPE^S^L:Living;C:Constructed;A:Ancient;H:Historical;E:Extinct;^0;7^Q
 ;;^DD(.85,.07,.1)
 ;;=Historical Status
 ;;^DD(.85,.07,3)
 ;;=Select a choice.
 ;;^DD(.85,.07,21,0)
 ;;=^^12^12^3121101^^
 ;;^DD(.85,.07,21,1,0)
 ;;=Living means that the language is spoken today (e.g. English).
 ;;^DD(.85,.07,21,2,0)
 ;;= 
 ;;^DD(.85,.07,21,3,0)
 ;;=Constructed means that the language is artificial (e.g. Esperanto).
 ;;^DD(.85,.07,21,4,0)
 ;;= 
 ;;^DD(.85,.07,21,5,0)
 ;;=Ancient means that the language is very old and not spoken any more (e.g.
 ;;^DD(.85,.07,21,6,0)
 ;;=Ancient Egyptian).
 ;;^DD(.85,.07,21,7,0)
 ;;= 
 ;;^DD(.85,.07,21,8,0)
 ;;=Historical means that the language was being used in the Medieval times 
 ;;^DD(.85,.07,21,9,0)
 ;;=and is not spoken any more (e.g. Old High German).
 ;;^DD(.85,.07,21,10,0)
 ;;= 
 ;;^DD(.85,.07,21,11,0)
 ;;=Extinct means that the language was being used recently but has died out 
 ;;^DD(.85,.07,21,12,0)
 ;;=(e.g. Cornish).
 ;;^DD(.85,.07,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.07,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.07,"DT")
 ;;=3121101
 ;;^DD(.85,.08,0)
 ;;=LINGUISTIC CATEGORY^*P.85'^DI(.85,^0;8^S DIC("S")="I $P(^(0),U,6)=""C""" D ^DIC K DIC S DIC=$G(DIE),X=+Y K:Y<0 X
 ;;^DD(.85,.08,3)
 ;;=Select a choice.
 ;;^DD(.85,.08,12)
 ;;=Only collective languages are selectable
 ;;^DD(.85,.08,12.1)
 ;;=S DIC("S")="I $P(^(0),U,6)=""C"""
 ;;^DD(.85,.08,21,0)
 ;;=^^1^1^3121101^^
 ;;^DD(.85,.08,21,1,0)
 ;;=Enter a language collection to which this language belongs.
 ;;^DD(.85,.08,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.08,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.08,"DT")
 ;;=3121101
 ;;^DD(.85,.09,0)
 ;;=MEMBER OF LANGUAGE SET^*P.85'^DI(.85,^0;9^S DIC("S")="I $P(^(0),U,6)=""M""" D ^DIC K DIC S DIC=$G(DIE),X=+Y K:Y<0 X
 ;;^DD(.85,.09,3)
 ;;=Enter a choice.
 ;;^DD(.85,.09,12)
 ;;=You may only select Macrolanguages
 ;;^DD(.85,.09,12.1)
 ;;=S DIC("S")="I $P(^(0),U,6)=""M"""
 ;;^DD(.85,.09,21,0)
 ;;=^^3^3^3121101^
 ;;^DD(.85,.09,21,1,0)
 ;;=If this language is a dialect of a macrolanguage, select the 
 ;;^DD(.85,.09,21,2,0)
 ;;=macrolanguage to which it belongs. (E.g. Cantonese is a dialect of 
 ;;^DD(.85,.09,21,3,0)
 ;;=Chinese; thus Chinese is Cantonese's macrolanguage.)
 ;;^DD(.85,.09,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.09,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.09,"DT")
 ;;=3121101
 ;;^DD(.85,1,0)
 ;;=ALTERNATE NAME^.8501^^1;0
 ;;^DD(.85,10,0)
 ;;=DESCRIPTION^.8502^^10;0
 ;;^DD(.85,10,"DT")
 ;;=3121031
 ;;^DD(.85,10.1,0)
 ;;=ORDINAL NUMBER FORMAT^K^^ORD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.1,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.1,9)
 ;;=@
 ;;^DD(.85,10.1,21,0)
 ;;=^^6^6^2941121^^^^
 ;;^DD(.85,10.1,21,1,0)
 ;;=MUMPS code used to transfer a number in Y to its ordinal equivalent in
 ;;^DD(.85,10.1,21,2,0)
 ;;=this language. The code should set Y to the ordinal equivalent without
 ;;^DD(.85,10.1,21,3,0)
 ;;=altering any other variables in the environment.  Ex. in English:
 ;;^DD(.85,10.1,21,4,0)
 ;;=       Y=1     becomes         Y=1ST
 ;;^DD(.85,10.1,21,5,0)
 ;;=       Y=2     becomes         Y=2ND
 ;;^DD(.85,10.1,21,6,0)
 ;;=       Y=3     becomes         Y=3RD  etc.
 ;;^DD(.85,10.1,"DT")
 ;;=2940307
 ;;^DD(.85,10.2,0)
 ;;=DATE/TIME FORMAT^K^^DD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.2,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.2,9)
 ;;=@
 ;;^DD(.85,10.2,21,0)
 ;;=^^6^6^2941121^^^
 ;;^DD(.85,10.2,21,1,0)
 ;;=MUMPS code used to transfer a date or date/time in Y from FileMan internal
 ;;^DD(.85,10.2,21,2,0)
 ;;=format, to printable format equivalent to English MMM DD,YYYY@HH.MM.SS.
 ;;^DD(.85,10.2,21,3,0)
 ;;=The code should set Y to the output, without altering any other variables
 ;;^DD(.85,10.2,21,4,0)
 ;;=in the environment.  Ex. in English:
 ;;^DD(.85,10.2,21,5,0)
 ;;= 
 ;;^DD(.85,10.2,21,6,0)
 ;;=       Y=2940612.031245        becomes         Y=JUN 12,1994@03:12:45
 ;;^DD(.85,10.2,"DT")
 ;;=2940307
 ;;^DD(.85,10.21,0)
 ;;=DATE/TIME FORMAT (FMTE)^K^^FMTE;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.21,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.21,9)
 ;;=@
 ;;^DD(.85,10.21,21,0)
 ;;=^^22^22^2941122^
 ;;^DD(.85,10.21,21,1,0)
 ;;=MUMPS code used to transfer a date or date/time in Y from FileMan internal
 ;;^DD(.85,10.21,21,2,0)
 ;;=format, to printable format based on the various outputs from routine
 ;;^DD(.85,10.21,21,3,0)
 ;;=FMTE^DILIBF.  This is an extrinsic function.  Coming in to this MUMPS
 ;;^DD(.85,10.21,21,4,0)
 ;;=code, in addition to the internal date in Y, a third parameter will be
 ;;^DD(.85,10.21,21,5,0)
 ;;=defined to contain flags equivalent to the flag passed as the second input
 ;;^DD(.85,10.21,21,6,0)
 ;;=parameter to FMTE^DILIBF. The code should set Y to the output, without
 ;;^DD(.85,10.21,21,7,0)
 ;;=altering any other variables in the environment.  The output should be
 ;;^DD(.85,10.21,21,8,0)
 ;;=formatted based on these flags:
 ;;^DD(.85,10.21,21,9,0)
 ;;= 
 ;;^DD(.85,10.21,21,10,0)
 ;;= 1    MMM DD, YYYY@HH:MM:SS
 ;;^DD(.85,10.21,21,11,0)
 ;;= 2    MM/DD/YY@HH:MM:SS     no leading zeroes on month,day
 ;;^DD(.85,10.21,21,12,0)
 ;;= 3    DD/MM/YY@HH:MM:SS     no leading zeroes on month,day
 ;;^DD(.85,10.21,21,13,0)
 ;;= 4    YY/MM/DD@HH:MM:SS
 ;;^DD(.85,10.21,21,14,0)
 ;;= 5    MMM DD,YYYY@HH:MM:SS  no space before year,no leading zero on day
 ;;^DD(.85,10.21,21,15,0)
 ;;= 6    MM-DD-YYYY @ HH:MM:SS spaces separate time 
 ;;^DD(.85,10.21,21,16,0)
 ;;= 7    MM-DD-YYYY@HH:MM:SS   no leading zeroes on month,day
 ;;^DD(.85,10.21,21,17,0)
 ;;= 
 ;;^DD(.85,10.21,21,18,0)
 ;;=letters in the flag
 ;;^DD(.85,10.21,21,19,0)
 ;;= S    return always seconds
 ;;^DD(.85,10.21,21,20,0)
 ;;= U    return uppercase month names
 ;;^DD(.85,10.21,21,21,0)
 ;;= P    return time as am,pm
 ;;^DD(.85,10.21,21,22,0)
 ;;= D    return only date part
 ;;^DD(.85,10.21,"DT")
 ;;=2940624
 ;;^DD(.85,10.22,0)
 ;;=TIME^K^^TIME;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.22,3)
 ;;=This is Standard MUMPS code for the output of time only.
 ;;^DD(.85,10.22,9)
 ;;=@
 ;;^DD(.85,10.22,21,0)
 ;;=^^2^2^2960318^
 ;;^DD(.85,10.22,21,1,0)
 ;;=The code stored here will be used to get formatted output of the time
 ;;^DD(.85,10.22,21,2,0)
 ;;=part belonging to a FileMan Date/Time value.
 ;;^DD(.85,10.22,"DT")
 ;;=2960318
 ;;^DD(.85,10.3,0)
 ;;=CARDINAL NUMBER FORMAT^K^^CRD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.3,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.3,9)
 ;;=@
 ;;^DD(.85,10.3,21,0)
 ;;=^^5^5^2941121^^
 ;;^DD(.85,10.3,21,1,0)
 ;;=MUMPS code used to transfer a number in Y to its cardinal equivalent in
 ;;^DD(.85,10.3,21,2,0)
 ;;=this language. The code should set Y to the cardinal equivalent without
 ;;^DD(.85,10.3,21,3,0)
 ;;=altering any other variables in the environment.  Ex. in English:
 ;;^DD(.85,10.3,21,4,0)
 ;;=       Y=2000     becomes         Y=2,000
 ;;^DD(.85,10.3,21,5,0)
 ;;=       Y=1234567  becomes         Y=1,234,567
 ;;^DD(.85,10.3,"DT")
 ;;=2940308
 ;;^DD(.85,10.4,0)
 ;;=UPPERCASE CONVERSION^K^^UC;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.4,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.4,9)
 ;;=@
 ;;^DD(.85,10.4,21,0)
 ;;=^^4^4^2941121^
 ;;^DD(.85,10.4,21,1,0)
 ;;=MUMPS code used to convert text in Y to its upper-case equivalent in
 ;;^DD(.85,10.4,21,2,0)
 ;;=this language. The code should set Y to the external format without
 ;;^DD(.85,10.4,21,3,0)
 ;;=altering any other variables in the environment.  In English, changes
 ;;^DD(.85,10.4,21,4,0)
 ;;=   abCdeF      to: ABCDEF
 ;;^DD(.85,10.4,"DT")
 ;;=2940308
 ;;^DD(.85,10.5,0)
 ;;=LOWERCASE CONVERSION^K^^LC;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.5,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.5,9)
 ;;=@
 ;;^DD(.85,10.5,21,0)
 ;;=^^4^4^2941121^
 ;;^DD(.85,10.5,21,1,0)
 ;;=MUMPS code used to convert text in Y to its lower-case equivalent in  
 ;;^DD(.85,10.5,21,2,0)
 ;;=this language. The code should set Y to the external format without
 ;;^DD(.85,10.5,21,3,0)
 ;;=altering any other variables in the environment.  In English, changes:
 ;;^DD(.85,10.5,21,4,0)
 ;;=    ABcdEFgHij         to:  abcdefghij
 ;;^DD(.85,10.5,"DT")
 ;;=2940308
 ;;^DD(.85,20.2,0)
 ;;=DATE INPUT^K^^20.2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,20.2,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,20.2,9)
 ;;=@
 ;;^DD(.85,20.2,"DT")
 ;;=2940714
 ;;^DD(.8501,0)
 ;;=ALTERNATE NAME SUB-FIELD^^.01^1
 ;;^DD(.8501,0,"DT")
 ;;=3121101
 ;;^DD(.8501,0,"IX","B",.8501,.01)
 ;;=
 ;;^DD(.8501,0,"NM","ALTERNATE NAME")
 ;;=
 ;;^DD(.8501,0,"UP")
 ;;=.85
 ;;^DD(.8501,.01,0)
 ;;=ALTERNATE NAME^MFJ60^^0;1^K:$L(X)>60!($L(X)<1) X
 ;;^DD(.8501,.01,1,0)
 ;;=^.1
 ;;^DD(.8501,.01,1,1,0)
 ;;=.8501^B
 ;;^DD(.8501,.01,1,1,1)
 ;;=S ^DI(.85,DA(1),1,"B",$E(X,1,30),DA)=""
 ;;^DD(.8501,.01,1,1,2)
 ;;=K ^DI(.85,DA(1),1,"B",$E(X,1,30),DA)
 ;;^DD(.8501,.01,1,2,0)
 ;;=.85^F
 ;;^DD(.8501,.01,1,2,1)
 ;;=S ^DI(.85,"F",$E(X,1,30),DA(1),DA)=""
 ;;^DD(.8501,.01,1,2,2)
 ;;=K ^DI(.85,"F",$E(X,1,30),DA(1),DA)
 ;;^DD(.8501,.01,1,2,3)
 ;;=WHOLE FILE CROSS REFERENCE FOR ALTERNATE NAME
 ;;^DD(.8501,.01,1,2,"%D",0)
 ;;=^^1^1^3121101^
 ;;^DD(.8501,.01,1,2,"%D",1,0)
 ;;=Whole file cross-reference for ALTERNATE NAME multiple.
 ;;^DD(.8501,.01,1,2,"DT")
 ;;=3121101
 ;;^DD(.8501,.01,3)
 ;;=Answer must be 1-60 characters in length.
 ;;^DD(.8501,.01,21,0)
 ;;=^^2^2^3121101^^
 ;;^DD(.8501,.01,21,1,0)
 ;;=This field contains other synonyms for a language.
 ;;^DD(.8501,.01,21,2,0)
 ;;=E.g. for Greek, synonyms include Ellinika and Romaic.
 ;;^DD(.8501,.01,"DT")
 ;;=3121101
 ;;^DD(.8502,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.8502,0,"DT")
 ;;=3121031
 ;;^DD(.8502,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.8502,0,"UP")
 ;;=.85
 ;;^DD(.8502,.01,0)
 ;;=DESCRIPTION^Wx^^0;1
 ;;^DD(.8502,.01,3)
 ;;=Enter an optional language description
 ;;^DD(.8502,.01,"DT")
 ;;=3121031
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",0)
 ;;=.85^B^Regular new-style B Index^R^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",1)
 ;;=S ^DI(.85,"B",X,DA)=""
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",2)
 ;;=K ^DI(.85,"B",X,DA)
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",2.5)
 ;;=K ^DI(.85,"B")
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",11.1,1,0)
 ;;=1^F^.85^.01^^1^F
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",11.1,1,3)
 ;;=
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",0)
 ;;=.85^C^Regular new style index on two letter language codes^R^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",1)
 ;;=S ^DI(.85,"C",X,DA)=""
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",2)
 ;;=K ^DI(.85,"C",X,DA)
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",2.5)
 ;;=K ^DI(.85,"C")
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",11.1,1,0)
 ;;=1^F^.85^.02^^1^F
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",0)
 ;;=.85^D^Regular new-style index for three letter abbreviations for languages^R^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",1)
 ;;=S ^DI(.85,"D",$E(X,1,30),DA)=""
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",2)
 ;;=K ^DI(.85,"D",$E(X,1,30),DA)
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",2.5)
 ;;=K ^DI(.85,"D")
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",11.1,1,0)
 ;;=1^F^.85^.03^30^1^F
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",0)
 ;;=.85^E^(Pseudo-)Mnemonic index for the Alternate three letter code^MU^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,0)
 ;;=^^6^6^3121031^
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,1,0)
 ;;=This will add entries to the D index for the three letter code a la the 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,2,0)
 ;;=mnemonic style.
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,3,0)
 ;;= 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,4,0)
 ;;=If you need re-cross-reference this field, you need to kill of the 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,5,0)
 ;;=entries in the regular D index, set the D index, and then set this index 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,6,0)
 ;;=to update the D with the mnemonic xrefs.
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",1)
 ;;=S ^DI(.85,"D",X,DA)=1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",2)
 ;;=K ^DI(.85,"D",X,DA)

DINIT013
DINIT013 ; SFISC/TKW,VEN/SMH-DIALOG & LANGUAGE FILE INITS ; 6DEC2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",11.1,1,0)
 ;;=1^F^.85^.05^^1^F
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"A",0)
 ;;=.85^A^P^1046
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"A",2,0)
 ;;=^.312IA^1^1
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"A",2,1,0)
 ;;=.01^.85^1
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"B",0)
 ;;=.85^B^S^1048
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"B",2,0)
 ;;=^.312IA^1^1
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"B",2,1,0)
 ;;=.03^.85^1
 ;;^UTILITY("KX",$J,"KEYPTR",.85,.85,"A")
 ;;=.85^B
 ;;^UTILITY("KX",$J,"KEYPTR",.85,.85,"B")
 ;;=.85^D
 ;;^UTILITY(U,$J,.85)
 ;;=^DI(.85,
 ;;^UTILITY(U,$J,.85,0)
 ;;=LANGUAGE^.85I^18^11
 ;;^UTILITY(U,$J,.85,1,0)
 ;;=ENGLISH^EN^ENG
 ;;^UTILITY(U,$J,.85,1,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,1,1,1,0)
 ;;=MODERN ENGLISH (1500-)
 ;;^UTILITY(U,$J,.85,1,1,2,0)
 ;;=ENGLISH,MODERN (1500-)
 ;;^UTILITY(U,$J,.85,1,"CRD")
 ;;=I Y S Y=$FN(Y,",")
 ;;^UTILITY(U,$J,.85,1,"DD")
 ;;=S:Y Y=$S($E(Y,4,5):$P("JAN^FEB^MAR^APR^MAY^JUN^JUL^AUG^SEP^OCT^NOV^DEC","^",+$E(Y,4,5))_" ",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_",",1:"")_($E(Y,1,3)+1700)_$P("@"_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),"^",Y[".")
 ;;^UTILITY(U,$J,.85,1,"FMTE")
 ;;=N RTN,%T S %T="."_$E($P(Y,".",2)_"000000",1,7),%F=$G(%F),RTN="F"_$S(%F<1:1,%F>7:1,1:+%F\1)_"^DILIBF" D @RTN S Y=%R
 ;;^UTILITY(U,$J,.85,1,"LC")
 ;;=S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
 ;;^UTILITY(U,$J,.85,1,"ORD")
 ;;=I $G(Y) S Y=Y_$S(Y#10=1&(Y#100-11):"ST",Y#10=2&(Y#100-12):"ND",Y#10=3&(Y#100-13):"RD",1:"TH")
 ;;^UTILITY(U,$J,.85,1,"TIME")
 ;;=S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),1:"")
 ;;^UTILITY(U,$J,.85,1,"UC")
 ;;=S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 ;;^UTILITY(U,$J,.85,2,0)
 ;;=GERMAN^DE^DEU^^GER
 ;;^UTILITY(U,$J,.85,2,1,0)
 ;;=^.8501^7^7
 ;;^UTILITY(U,$J,.85,2,1,1,0)
 ;;=GERMAN, STANDARD
 ;;^UTILITY(U,$J,.85,2,1,2,0)
 ;;=STANDARD GERMAN
 ;;^UTILITY(U,$J,.85,2,1,3,0)
 ;;=DEUTSCH
 ;;^UTILITY(U,$J,.85,2,1,4,0)
 ;;=DEUTSCH SPRACHE
 ;;^UTILITY(U,$J,.85,2,1,5,0)
 ;;=TEDESCO
 ;;^UTILITY(U,$J,.85,2,1,6,0)
 ;;=MODERN GERMAN (1500-)
 ;;^UTILITY(U,$J,.85,2,1,7,0)
 ;;=GERMAN,MODERN (1500-)
 ;;^UTILITY(U,$J,.85,2,"CRD")
 ;;=S:$G(Y) Y=$TR($FN(Y,","),",",".")
 ;;^UTILITY(U,$J,.85,2,"DD")
 ;;=S:Y Y=$S($E(Y,6,7):$E(Y,6,7)_".",1:"")_$S($E(Y,4,5):$E(Y,4,5)_".",1:"")_($E(Y,1,3)+1700)_$P(" "_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),"^",Y[".")
 ;;^UTILITY(U,$J,.85,2,"LC")
 ;;=S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\","abcdefghijklmnopqrstuvwxyz{}|")
 ;;^UTILITY(U,$J,.85,2,"ORD")
 ;;=S:$G(Y) Y=Y_"."
 ;;^UTILITY(U,$J,.85,2,"TIME")
 ;;=S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),1:"")
 ;;^UTILITY(U,$J,.85,2,"UC")
 ;;=S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz{}|","ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\")
 ;;^UTILITY(U,$J,.85,3,0)
 ;;=SPANISH^ES^SPA
 ;;^UTILITY(U,$J,.85,3,1,0)
 ;;=^.8501^5^5
 ;;^UTILITY(U,$J,.85,3,1,1,0)
 ;;=CASTILIAN
 ;;^UTILITY(U,$J,.85,3,1,2,0)
 ;;=CASTELLANO
 ;;^UTILITY(U,$J,.85,3,1,3,0)
 ;;=ESPANOL
 ;;^UTILITY(U,$J,.85,3,1,4,0)
 ;;=MODERN SPANISH (1500-)
 ;;^UTILITY(U,$J,.85,3,1,5,0)
 ;;=SPANISH, MODERN (1500-)
 ;;^UTILITY(U,$J,.85,4,0)
 ;;=FRENCH^FR^FRA^^FRE
 ;;^UTILITY(U,$J,.85,4,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,4,1,1,0)
 ;;=FRANCAIS
 ;;^UTILITY(U,$J,.85,4,1,2,0)
 ;;=MODERN FRENCH (1600-)
 ;;^UTILITY(U,$J,.85,4,1,3,0)
 ;;=FRENCH, MODERN (1600-)
 ;;^UTILITY(U,$J,.85,5,0)
 ;;=FINNISH^FI^FIN
 ;;^UTILITY(U,$J,.85,5,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,5,1,1,0)
 ;;=SUOMEA
 ;;^UTILITY(U,$J,.85,5,1,2,0)
 ;;=SUOMI
 ;;^UTILITY(U,$J,.85,5,1,3,0)
 ;;=SUOMEN KIELI
 ;;^UTILITY(U,$J,.85,5,"DD")
 ;;=X:$G(Y) ^DD("DD")
 ;;^UTILITY(U,$J,.85,5,"ORD")
 ;;=I $G(Y) S Y=Y_"."
 ;;^UTILITY(U,$J,.85,6,0)
 ;;=ITALIAN^IT^ITA
 ;;^UTILITY(U,$J,.85,6,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,6,1,1,0)
 ;;=ITALIANO
 ;;^UTILITY(U,$J,.85,6,1,2,0)
 ;;=LINGUA ITALIANA
 ;;^UTILITY(U,$J,.85,7,0)
 ;;=PORTUGUESE^PT^POR
 ;;^UTILITY(U,$J,.85,7,1,0)
 ;;=^.8501^4^4
 ;;^UTILITY(U,$J,.85,7,1,1,0)
 ;;=PORTUGUES
 ;;^UTILITY(U,$J,.85,7,1,2,0)
 ;;=LINGUA PORTUGUESA
 ;;^UTILITY(U,$J,.85,7,1,3,0)
 ;;=MODERN PORTUGUESE (1516-)
 ;;^UTILITY(U,$J,.85,7,1,4,0)
 ;;=PORTUGUESE, MODERN (1516-)
 ;;^UTILITY(U,$J,.85,10,0)
 ;;=ARABIC^AR^ARA
 ;;^UTILITY(U,$J,.85,10,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,10,1,1,0)
 ;;=AL-'ARABIYYAH
 ;;^UTILITY(U,$J,.85,10,1,2,0)
 ;;='ARABI
 ;;^UTILITY(U,$J,.85,11,0)
 ;;=RUSSIAN^RU^RUS
 ;;^UTILITY(U,$J,.85,11,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,11,1,1,0)
 ;;=RUSSKI
 ;;^UTILITY(U,$J,.85,11,1,2,0)
 ;;=RUSSKIY YAZYK
 ;;^UTILITY(U,$J,.85,12,0)
 ;;=GREEK^EL^ELL^^GRE
 ;;^UTILITY(U,$J,.85,12,1,0)
 ;;=^.8501^9^9
 ;;^UTILITY(U,$J,.85,12,1,1,0)
 ;;=ELLINIKA
 ;;^UTILITY(U,$J,.85,12,1,2,0)
 ;;=ELLINIKI GLOSSA
 ;;^UTILITY(U,$J,.85,12,1,3,0)
 ;;=GRAECAE
 ;;^UTILITY(U,$J,.85,12,1,4,0)
 ;;=GREC
 ;;^UTILITY(U,$J,.85,12,1,5,0)
 ;;=GRECO
 ;;^UTILITY(U,$J,.85,12,1,6,0)
 ;;=NEO-HELLENIC
 ;;^UTILITY(U,$J,.85,12,1,7,0)
 ;;=ROMAIC
 ;;^UTILITY(U,$J,.85,12,1,8,0)
 ;;=MODERN GREEK (1453-)
 ;;^UTILITY(U,$J,.85,12,1,9,0)
 ;;=GREEK, MODERN (1453-)
 ;;^UTILITY(U,$J,.85,18,0)
 ;;=HEBREW^HE^HEB
 ;;^UTILITY(U,$J,.85,18,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,18,1,1,0)
 ;;=IVRIT
 ;;^UTILITY(U,$J,.85,18,1,2,0)
 ;;=MODERN HEBREW (1881-)
 ;;^UTILITY(U,$J,.85,18,1,3,0)
 ;;=HEBREW, MODERN (1881-)

DINIT02
DINIT02 ;SFISC/DPC-EXPORT TOOL PRINT TEMPLATES ;10:05 AM  17 Sep 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT07 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIPT(.441,0)
 ;;=DDXP FORMAT DOC^2921023.1533^@^.44^^@^2921130
 ;;^DIPT(.441,"F",2)
 ;;="DESCRIPTION:";S~30,.01~"USAGE NOTE:";C2;S~31,.01~50,"OTHER NAME:";C5;S~50,.01~50,"DESCRIPTION:";C8;S~50,1,.01~
 ;;^DIPT(.441,"H")
 ;;=AVAILABLE FORMATS
 ;;^DIPT(.442,0)
 ;;=DDXP FORMAT DOC HDR^2921112.1536^@^.44^^@^2921130
 ;;^DIPT(.442,"F",1)
 ;;="AVAILABLE FOREIGN FORMATS"~S %=$P($H,",",2),X=DT_(%\60#60/100+(%\3600)+(%#60/10000)/100) S Y=X D DT K DIP;C45;L18;Z;"NOW"~
 ;;^DIPT(.442,"F",2)
 ;;=S X="Page ",DIP(1)=X,X=$S($D(DC)#2:DC,1:"") S Y=X,X=DIP(1),X=X S X=X_Y W X K DIP;C67;Z;""Page "_PAGE"~
 ;;^DIPT(.442,"F",3)
 ;;=S X="_",DIP(1)=X,DIP(2)=X,X=$S($D(IOM):IOM,1:80) S X=X,X1=DIP(1) S %=X,X="" Q:X1=""  S $P(X,X1,%\$L(X1)+1)=X1,X=$E(X,1,%) W X K DIP;C1;Z;"DUP("_",IOM)"~
 ;;^DIPT(.442,"H")
 ;;=@

DINIT07
DINIT07 ;ISCSF/DPC - PACKAGE AND DATA-DICTIONARY-AUDIT FILE PRINT TEMPLATES;9OCT2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT08 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIPT(.941,0)
 ;;=DI-PKG-DEFAULT-DEFINITION^2930111.1405^@^9.4^^@^2930111
 ;;^DIPT(.941,"DXS",1,9.2)
 ;;=S DIP(1)=$S($D(^DIC(9.4,D0,4,D1,223)):^(223),1:"") S X=$E(DIP(1),1,245)]"",DIP(2)=X S X="Update screen: "_$E(DIP(1),1,245),DIP(3)=X S X=1,DIP(4)=X S X=""
 ;;^DIPT(.941,"F",1)
 ;;=6,S DIP(1)=$S($D(^DIC(9.4,D0,4,D1,0)):^(0),1:"") S X=$P(DIP(1),U,1),X=X W X K DIP;"FILE #";L10;Z;"INTERNAL(FILE)"~6,.01;L27~6,222.1;"UP DATE THE DD"~
 ;;^DIPT(.941,"F",2)
 ;;=6,222.2;"VER SION #"~6,222.4;"USER OVER RIDE DD"~6,222.7~6,222.8;"MERGE OR OVER WRITE";L4~6,222.9;"USER OVER RIDE DATA"~
 ;;^DIPT(.941,"F",3)
 ;;=6,X DXS(1,9.2) S X=$S(DIP(2):DIP(3),DIP(4):X) K DIP;C13;W66;"";Z;"$S(#223]"":"Update screen: "_#223,1:"")"~
 ;;^DIPT(.941,"F",4)
 ;;="Environment Check Routine          :";S1;C6~913;"";C42~"Pre-Init After User Commit Routine :";C6~916;C42;""~"Post-Initialization Routine        :";C6~
 ;;^DIPT(.941,"F",5)
 ;;=914;"";C42~
 ;;^DIPT(.941,"H")
 ;;=PACKAGE DEFAULT DEFINITION
 ;;^DIPT(.61,0)
 ;;=DIAUTL^3030321.1238^@^.6^1^@^3051008
 ;;^DIPT(.61,"DXS",1,9.2)
 ;;=S DIP(1)=$S($D(^DDA(DIA,D0,1)):^(1),1:"") S X=$E(DIP(1),1,245)]"",DIP(2)=$G(X) S X="FROM: "_$E(DIP(1),1,245),DIP(3)=$G(X) S X=1,DIP(4)=$G(X) S X=""
 ;;^DIPT(.61,"F",1)
 ;;=W $S($G(DIA):$S($D(^DD(DIA,+^DDA(DIA,D0,0),0)):$P(^(0),U),1:"DELETED FIELD "_+^DDA(DIA,D0,0)),1:"XX") S X="";L23;Z;"W $S($G(DIA):$P(^DD(DIA,+^DDA(DIA,D0,0),0),U),1:"XX") S X="""~.05;L20~.03~
 ;;^DIPT(.61,"F",2)
 ;;=S DIP(1)=$S($D(^DDA(DIA,D0,0)):^(0),1:"") S X=$P(DIP(1),U,4),X=X W X K DIP;"";R4;Z;"INTERNAL(USER)"~
 ;;^DIPT(.61,"F",3)
 ;;=X DXS(1,9.2) S X=$S(DIP(2):DIP(3),DIP(4):X) W X K DIP;C2;Z;"$S(#1]"":"FROM: "_#1,1:"")"~
 ;;^DIPT(.61,"F",4)
 ;;=S DIP(1)=$S($D(^DDA(DIA,D0,2)):^(2),1:"") S X="TO: "_$E(DIP(1),1,245) W X K DIP;C4;Z;""TO: "_#2"~

DINIT08
DINIT08 ;SFISC/TKW - BRING DD FOR FILE .83, COMPILED ROUTINE ;9/9/94  13:33
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G:X="" ^DINIT12 S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DIC(.83,0,"GL")
 ;;=^DI(.83,
 ;;^DIC("B","COMPILED ROUTINE",.83)
 ;;=
 ;;^DIC(.83,"%D",0)
 ;;=^^5^5^2940908^
 ;;^DIC(.83,"%D",1,0)
 ;;=This file stores information used for creating compiled SORT routines.
 ;;^DIC(.83,"%D",2,0)
 ;;=During the FileMan SORT/PRINT option, if the user has specified that a
 ;;^DIC(.83,"%D",3,0)
 ;;=sort template is compiled, a routine name is generated by concatenating
 ;;^DIC(.83,"%D",4,0)
 ;;="DIZS" with the next available number from this list.  A flag indicates
 ;;^DIC(.83,"%D",5,0)
 ;;=whether or not a number is currently in use.
 ;;^DD(.83,0)
 ;;=FIELD^^1^2
 ;;^DD(.83,0,"DDA")
 ;;=N
 ;;^DD(.83,0,"DT")
 ;;=2930331
 ;;^DD(.83,0,"IX","B",.83,.01)
 ;;=
 ;;^DD(.83,0,"IX","C",.83,1)
 ;;=
 ;;^DD(.83,0,"NM","COMPILED ROUTINE")
 ;;=
 ;;^DD(.83,.01,0)
 ;;=ROUTINE NUMBER^RNJ4,0X^^0;1^K:+X'=X!(X>9999)!(X<1)!(X?.E1"."1N.N) X S:$D(X) DINUM=X
 ;;^DD(.83,.01,1,0)
 ;;=^.1
 ;;^DD(.83,.01,1,1,0)
 ;;=.83^B
 ;;^DD(.83,.01,1,1,1)
 ;;=S ^DI(.83,"B",$E(X,1,30),DA)=""
 ;;^DD(.83,.01,1,1,2)
 ;;=K ^DI(.83,"B",$E(X,1,30),DA)
 ;;^DD(.83,.01,3)
 ;;=Type a Number between 1 and 9999, 0 Decimal Digits
 ;;^DD(.83,.01,21,0)
 ;;=^^5^5^2930331^^^
 ;;^DD(.83,.01,21,1,0)
 ;;=This is a number that can be used to generate the name of a compiled
 ;;^DD(.83,.01,21,2,0)
 ;;=SORT routine.  The literal 'DIZS' is concatenated with the number to form
 ;;^DD(.83,.01,21,3,0)
 ;;=a compiled sort routine name.  The routine will be in use only during
 ;;^DD(.83,.01,21,4,0)
 ;;=the running of a sort/print.  After the print completes, the number
 ;;^DD(.83,.01,21,5,0)
 ;;=is again made available for use.
 ;;^DD(.83,.01,23,0)
 ;;=^^4^4^2930331^^
 ;;^DD(.83,.01,23,1,0)
 ;;=Generated and used during the FileMan sort/print option.  Manipulated
 ;;^DD(.83,.01,23,2,0)
 ;;=in routine DIOZ, that is called from DIO1.  DIOZ checks a
 ;;^DD(.83,.01,23,3,0)
 ;;=cross-reference on the 'IN USE' flag to find the next available number.
 ;;^DD(.83,.01,23,4,0)
 ;;=If none are available, a new one is added to the file.
 ;;^DD(.83,.01,"DT")
 ;;=2930719
 ;;^DD(.83,1,0)
 ;;=IN USE^S^y:YES, NUMBER IS IN USE;n:NOT IN USE;^0;2^Q
 ;;^DD(.83,1,1,0)
 ;;=^.1
 ;;^DD(.83,1,1,1,0)
 ;;=.83^C
 ;;^DD(.83,1,1,1,1)
 ;;=S ^DI(.83,"C",$E(X,1,30),DA)=""
 ;;^DD(.83,1,1,1,2)
 ;;=K ^DI(.83,"C",$E(X,1,30),DA)
 ;;^DD(.83,1,1,1,"%D",0)
 ;;=^^3^3^2930331^
 ;;^DD(.83,1,1,1,"%D",1,0)
 ;;=This cross-reference is used to control when a routine number is available
 ;;^DD(.83,1,1,1,"%D",2,0)
 ;;=for use in creating a compiled sort routine, during the FileMan sort/print
 ;;^DD(.83,1,1,1,"%D",3,0)
 ;;=option.
 ;;^DD(.83,1,1,1,"DT")
 ;;=2930331
 ;;^DD(.83,1,21,0)
 ;;=^^6^6^2930331^^
 ;;^DD(.83,1,21,1,0)
 ;;=During the running of the FileMan sort/print, if the sort is compiled,
 ;;^DD(.83,1,21,2,0)
 ;;=a cross-reference on this flag is checked to find the first available
 ;;^DD(.83,1,21,3,0)
 ;;=number that is not in use.  The number is then marked in use and is
 ;;^DD(.83,1,21,4,0)
 ;;=concatenated on the end of literal 'DIZS' to create the routine name
 ;;^DD(.83,1,21,5,0)
 ;;=of the compiled routine.  After the sort/print completes, the flag is
 ;;^DD(.83,1,21,6,0)
 ;;=then reset to 'NOT IN USE'.
 ;;^DD(.83,1,23,0)
 ;;=^^5^5^2930331^^
 ;;^DD(.83,1,23,1,0)
 ;;=Manipulated in routine DIOZ that is called from the FileMan sort routine
 ;;^DD(.83,1,23,2,0)
 ;;=DIO1.  The cross-reference on this field is used to control when a number
 ;;^DD(.83,1,23,3,0)
 ;;=is available for use to create a compiled sort routine name.  After
 ;;^DD(.83,1,23,4,0)
 ;;=the sort/print runs, the flag is set back to NOT IN USE so that the
 ;;^DD(.83,1,23,5,0)
 ;;=number is again available.
 ;;^DD(.83,1,"DT")
 ;;=2930331

DINIT0F0
DINIT0F0 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;4APR2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D PRE^DINIT29P
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F1 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.403,.001,0)
 ;;=DICATT^@^@^^2981031.1257^2990319.1306^^1^0^1^1
 ;;^DIST(.403,.001,1)
 ;;=2000000
 ;;^DIST(.403,.001,3)
 ;;=3000000
 ;;^DIST(.403,.001,4)
 ;;=N
 ;;^DIST(.403,.001,5)
 ;;=Y
 ;;^DIST(.403,.001,6)
 ;;=N
 ;;^DIST(.403,.001,7)
 ;;=N
 ;;^DIST(.403,.001,15,0)
 ;;=^^36^36^2981214
 ;;^DIST(.403,.001,15,1,0)
 ;;=Pages: 1          Main form
 ;;^DIST(.403,.001,15,2,0)
 ;;=       1.1, 1.2   DESCRIPTION and TECHNICAL DESCRIPTION  text
 ;;^DIST(.403,.001,15,3,0)
 ;;=       2.1-2.8    TYPE-specific   (2.1=DATE, etc)
 ;;^DIST(.403,.001,15,4,0)
 ;;=       3          SUBSCRIPT & PIECE-position
 ;;^DIST(.403,.001,15,5,0)
 ;;=       4          SUBSCRIPT & SUB-DICTIONARY NUMBER
 ;;^DIST(.403,.001,15,6,0)
 ;;=       5          Multiples
 ;;^DIST(.403,.001,15,7,0)
 ;;=       6          SCREEN for Pointers & Sets
 ;;^DIST(.403,.001,15,8,0)
 ;;=       8          VARIABLE-POINTER extra fields for each pointer
 ;;^DIST(.403,.001,15,9,0)
 ;;=       9          "ARE YOU SURE YOU WANT TO DELETE THE ENTIRE FIELD?"
 ;;^DIST(.403,.001,15,10,0)
 ;;=      10          Multiple-field
 ;;^DIST(.403,.001,15,11,0)
 ;;=                                                 
 ;;^DIST(.403,.001,15,12,0)
 ;;= 
 ;;^DIST(.403,.001,15,13,0)
 ;;= 
 ;;^DIST(.403,.001,15,14,0)
 ;;=Branching logic:
 ;;^DIST(.403,.001,15,15,0)
 ;;=              From Field 20.5 ("MULTIPLE?")
 ;;^DIST(.403,.001,15,16,0)
 ;;=       IS THIS FIELD NEW AND IS THE USER A PROGRAMMER?
 ;;^DIST(.403,.001,15,17,0)
 ;;=          |                                      |
 ;;^DIST(.403,.001,15,18,0)
 ;;=         NO                                     YES
 ;;^DIST(.403,.001,15,19,0)
 ;;=          |                                      |
 ;;^DIST(.403,.001,15,20,0)
 ;;=          |                               IS FIELD MULTIPLE?
 ;;^DIST(.403,.001,15,21,0)
 ;;=          |                                |              |
 ;;^DIST(.403,.001,15,22,0)
 ;;=          |                               YES            NO
 ;;^DIST(.403,.001,15,23,0)
 ;;=          |                                |              |
 ;;^DIST(.403,.001,15,24,0)
 ;;=IS FIELD EDITABLE & MULTIPLE?              |              |
 ;;^DIST(.403,.001,15,25,0)
 ;;=   |                    |                  |              |
 ;;^DIST(.403,.001,15,26,0)
 ;;=   |                   YES  --------->  Page 5         Page 3
 ;;^DIST(.403,.001,15,27,0)
 ;;=   |                                       |              |
 ;;^DIST(.403,.001,15,28,0)
 ;;=   |                                 PROGRAMMER?          |
 ;;^DIST(.403,.001,15,29,0)
 ;;=   |                                  |        |          |
 ;;^DIST(.403,.001,15,30,0)
 ;;=   |                                 YES      NO          |
 ;;^DIST(.403,.001,15,31,0)
 ;;=   |                                  |        |          |
 ;;^DIST(.403,.001,15,32,0)
 ;;=   |                                Page 4     |          | 
 ;;^DIST(.403,.001,15,33,0)
 ;;=   |                                  |        |          |
 ;;^DIST(.403,.001,15,34,0)
 ;;=    --------------------------------->|<------------------
 ;;^DIST(.403,.001,15,35,0)
 ;;=                                      |
 ;;^DIST(.403,.001,15,36,0)
 ;;=                           Field 98 (HELP-PROMPT)
 ;;^DIST(.403,.001,20)
 ;;=D POST^DICATTDE
 ;;^DIST(.403,.001,40,0)
 ;;=^.4031I^21^18
 ;;^DIST(.403,.001,40,1,0)
 ;;=1^^1,1
 ;;^DIST(.403,.001,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.001,40,1,40,0)
 ;;=^.4032IP^.00101^1
 ;;^DIST(.403,.001,40,1,40,.00101,0)
 ;;=.00101^1^1,1^e
 ;;^DIST(.403,.001,40,1,40,.00101,11)
 ;;=D PRE^DICATTD
 ;;^DIST(.403,.001,40,2,0)
 ;;=2.1^^4,3^^^1^12,70
 ;;^DIST(.403,.001,40,2,1)
 ;;=Page 2.1
 ;;^DIST(.403,.001,40,2,12)
 ;;=D POST1^DICATTD1
 ;;^DIST(.403,.001,40,2,40,0)
 ;;=^.4032IP^.00102^1
 ;;^DIST(.403,.001,40,2,40,.00102,0)
 ;;=.00102^1^2,3^e
 ;;^DIST(.403,.001,40,3,0)
 ;;=2.2^^4,3^^^1^9,70
 ;;^DIST(.403,.001,40,3,1)
 ;;=Page 2.2
 ;;^DIST(.403,.001,40,3,12)
 ;;=D POST2^DICATTD2
 ;;^DIST(.403,.001,40,3,40,0)
 ;;=^.4032IP^.00103^1
 ;;^DIST(.403,.001,40,3,40,.00103,0)
 ;;=.00103^1^2,3^e
 ;;^DIST(.403,.001,40,6,0)
 ;;=2.4^^3,8^^^1^7,67
 ;;^DIST(.403,.001,40,6,1)
 ;;=Page 2.4
 ;;^DIST(.403,.001,40,6,12)
 ;;=D POST4^DICATTD4
 ;;^DIST(.403,.001,40,6,40,0)
 ;;=^.4032IP^.00104^1
 ;;^DIST(.403,.001,40,6,40,.00104,0)
 ;;=.00104^1^1,1^e
 ;;^DIST(.403,.001,40,7,0)
 ;;=2.5^^4,2^^^1^8,78
 ;;^DIST(.403,.001,40,7,1)
 ;;=Page 2.5
 ;;^DIST(.403,.001,40,7,40,0)
 ;;=^.4032IP^.00105^1
 ;;^DIST(.403,.001,40,7,40,.00105,0)
 ;;=.00105^1^1,1^e
 ;;^DIST(.403,.001,40,8,0)
 ;;=2.6^^3,2^^^1^11,77
 ;;^DIST(.403,.001,40,8,1)
 ;;=Page 2.6
 ;;^DIST(.403,.001,40,8,12)
 ;;=D POST6^DICATTD6
 ;;^DIST(.403,.001,40,8,40,0)
 ;;=^.4032IP^.00106^1
 ;;^DIST(.403,.001,40,8,40,.00106,0)
 ;;=.00106^1^1,1^e
 ;;^DIST(.403,.001,40,9,0)
 ;;=2.7^^3,2^^^1^8,75
 ;;^DIST(.403,.001,40,9,1)
 ;;=Page 2.7
 ;;^DIST(.403,.001,40,9,12)
 ;;=D POST7^DICATTD7
 ;;^DIST(.403,.001,40,9,40,0)
 ;;=^.4032IP^.00107^1
 ;;^DIST(.403,.001,40,9,40,.00107,0)
 ;;=.00107^1^1,1^e
 ;;^DIST(.403,.001,40,10,0)
 ;;=2.8^^3,3^^^1^11,77
 ;;^DIST(.403,.001,40,10,1)
 ;;=Page 2.8
 ;;^DIST(.403,.001,40,10,40,0)
 ;;=^.4032IP^.00108^1
 ;;^DIST(.403,.001,40,10,40,.00108,0)
 ;;=.00108^1^1,1^e
 ;;^DIST(.403,.001,40,11,0)
 ;;=2.3^^3,6^^^1^17,70
 ;;^DIST(.403,.001,40,11,1)
 ;;=Page 2.3
 ;;^DIST(.403,.001,40,11,12)
 ;;=D POST3^DICATTD3
 ;;^DIST(.403,.001,40,11,40,0)
 ;;=^.4032IP^.00109^1
 ;;^DIST(.403,.001,40,11,40,.00109,0)
 ;;=.00109^1^1,1^e
 ;;^DIST(.403,.001,40,12,0)
 ;;=1.1^^1,1^^1
 ;;^DIST(.403,.001,40,12,1)
 ;;=Page 1.1
 ;;^DIST(.403,.001,40,12,40,0)
 ;;=^.4032IP^.0011^1
 ;;^DIST(.403,.001,40,12,40,.0011,0)
 ;;=.0011^1^1,1^e
 ;;^DIST(.403,.001,40,12,40,.0011,11)
 ;;=D WORD^DICATTD0(21)
 ;;^DIST(.403,.001,40,13,0)
 ;;=1.2^^1,1
 ;;^DIST(.403,.001,40,13,1)
 ;;=Page 1.2
 ;;^DIST(.403,.001,40,13,40,0)
 ;;=^.4032IP^.00111^1
 ;;^DIST(.403,.001,40,13,40,.00111,0)
 ;;=.00111^1^1,1^e
 ;;^DIST(.403,.001,40,15,0)
 ;;=3^^4,8^^^1^7,64
 ;;^DIST(.403,.001,40,15,1)
 ;;=Page 3
 ;;^DIST(.403,.001,40,15,12)
 ;;=D POST^DICATTDM
 ;;^DIST(.403,.001,40,15,40,0)
 ;;=^.4032IP^.00112^1
 ;;^DIST(.403,.001,40,15,40,.00112,0)
 ;;=.00112^1^2,2^e
 ;;^DIST(.403,.001,40,16,0)
 ;;=9^^3,10^^^1^7,70
 ;;^DIST(.403,.001,40,16,1)
 ;;=Page 9
 ;;^DIST(.403,.001,40,16,40,0)
 ;;=^.4032IP^.00113^1
 ;;^DIST(.403,.001,40,16,40,.00113,0)
 ;;=.00113^1^1,1^e
 ;;^DIST(.403,.001,40,17,0)
 ;;=4^^9,5^^^1^12,75
 ;;^DIST(.403,.001,40,17,1)
 ;;=Page 4
 ;;^DIST(.403,.001,40,17,40,0)
 ;;=^.4032IP^.00114^1
 ;;^DIST(.403,.001,40,17,40,.00114,0)
 ;;=.00114^1^1,1^e

DINIT0F1
DINIT0F1 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;2:11 PM  11 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F2 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.403,.001,40,18,0)
 ;;=8^^10,3^^^1^17,77
 ;;^DIST(.403,.001,40,18,1)
 ;;=Page 8
 ;;^DIST(.403,.001,40,18,11)
 ;;=D PRE8^DICATTD8
 ;;^DIST(.403,.001,40,18,12)
 ;;=D POST8^DICATTD8
 ;;^DIST(.403,.001,40,18,40,0)
 ;;=^.4032IP^.00115^1
 ;;^DIST(.403,.001,40,18,40,.00115,0)
 ;;=.00115^1^2,3^e
 ;;^DIST(.403,.001,40,19,0)
 ;;=10^^1,1
 ;;^DIST(.403,.001,40,19,1)
 ;;=Page 10
 ;;^DIST(.403,.001,40,19,40,0)
 ;;=^.4032IP^.00116^1
 ;;^DIST(.403,.001,40,19,40,.00116,0)
 ;;=.00116^1^1,1^e
 ;;^DIST(.403,.001,40,20,0)
 ;;=5^^14,1^^^1^17,78
 ;;^DIST(.403,.001,40,20,1)
 ;;=Page 5
 ;;^DIST(.403,.001,40,20,12)
 ;;=I DICATT4="",DUZ(0)="@" S DDSSTACK=4
 ;;^DIST(.403,.001,40,20,40,0)
 ;;=^.4032IP^.00117^1
 ;;^DIST(.403,.001,40,20,40,.00117,0)
 ;;=.00117^1^1,1^e
 ;;^DIST(.403,.001,40,21,0)
 ;;=6^^7,3^^^1^13,77
 ;;^DIST(.403,.001,40,21,1)
 ;;=Page 6
 ;;^DIST(.403,.001,40,21,40,0)
 ;;=^.4032IP^.00118^1
 ;;^DIST(.403,.001,40,21,40,.00118,0)
 ;;=.00118^1^1,1^e
 ;;^DIST(.403,.1001,0)
 ;;=DIPTED^@^^^2980611.1708^2990303.0831^^.4^0^0^1
 ;;^DIST(.403,.1001,14)
 ;;=D SAVEFLDS^DIPTED(DA)
 ;;^DIST(.403,.1001,40,0)
 ;;=^.4031I^2^2
 ;;^DIST(.403,.1001,40,1,0)
 ;;=1^^1,1^2
 ;;^DIST(.403,.1001,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.1001,40,1,40,0)
 ;;=^.4032IP^.10011^1
 ;;^DIST(.403,.1001,40,1,40,.10011,0)
 ;;=.10011^1^1,1^e
 ;;^DIST(.403,.1001,40,2,0)
 ;;=2^^1,1^^1
 ;;^DIST(.403,.1001,40,2,1)
 ;;=Page 2
 ;;^DIST(.403,.1001,40,2,40,0)
 ;;=^.4032IP^.10012^1
 ;;^DIST(.403,.1001,40,2,40,.10012,0)
 ;;=.10012^1^1,1^e
 ;;^DIST(.403,.1101,0)
 ;;=DIKC EDIT^^^^2970612.1058^3000110.1335^^.11^0^0^1
 ;;^DIST(.403,.1101,14)
 ;;=D POSTSV^DIKCFORM
 ;;^DIST(.403,.1101,20)
 ;;=D FORMDV^DIKCFORM
 ;;^DIST(.403,.1101,40,0)
 ;;=^.4031I^2^4
 ;;^DIST(.403,.1101,40,1,0)
 ;;=1^^1,1^2^2
 ;;^DIST(.403,.1101,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.1101,40,1,40,0)
 ;;=^.4032IP^.110101^2
 ;;^DIST(.403,.1101,40,1,40,.110101,0)
 ;;=.110101^2^4,1^e
 ;;^DIST(.403,.1101,40,1,40,.110102,0)
 ;;=.110102^1^1,1^d
 ;;^DIST(.403,.1101,40,2,0)
 ;;=2^^1,1^1^1
 ;;^DIST(.403,.1101,40,2,1)
 ;;=Page 2
 ;;^DIST(.403,.1101,40,2,40,0)
 ;;=^.4032IP^.110103^4
 ;;^DIST(.403,.1101,40,2,40,.110103,0)
 ;;=.110103^4^10,1^e
 ;;^DIST(.403,.1101,40,2,40,.110104,0)
 ;;=.110104^3^6,2^e
 ;;^DIST(.403,.1101,40,2,40,.110104,2)
 ;;=5^^f
 ;;^DIST(.403,.1101,40,2,40,.110105,0)
 ;;=.110105^2^3,1^d
 ;;^DIST(.403,.1101,40,2,40,.110106,0)
 ;;=.110106^1^1,1^d
 ;;^DIST(.403,.1101,40,3,0)
 ;;=2.1^^6,1^^^1^17,79
 ;;^DIST(.403,.1101,40,3,1)
 ;;=Page 2.1
 ;;^DIST(.403,.1101,40,3,11)
 ;;=S DIKCPG21=1
 ;;^DIST(.403,.1101,40,3,12)
 ;;=K DIKCPG21
 ;;^DIST(.403,.1101,40,3,40,0)
 ;;=^.4032IP^.110107^1
 ;;^DIST(.403,.1101,40,3,40,.110107,0)
 ;;=.110107^1^1,1^e
 ;;^DIST(.403,.1101,40,3,40,.110107,11)
 ;;=K DIKCCRV D BKPRE21^DIKCFORM
 ;;^DIST(.403,.1101,40,3,40,.110107,12)
 ;;=I $D(DIKCCRV)#2 D BLDLOG^DIKCFORM(DA(1)) K DIKCCRV
 ;;^DIST(.403,.1101,40,4,0)
 ;;=2.2^^10,1^^^1^17,79
 ;;^DIST(.403,.1101,40,4,1)
 ;;=Page 2.2
 ;;^DIST(.403,.1101,40,4,40,0)
 ;;=^.4032IP^.110108^1
 ;;^DIST(.403,.1101,40,4,40,.110108,0)
 ;;=.110108^1^1,1^e
 ;;^DIST(.403,.1101,40,4,40,.110108,11)
 ;;=K DIKCCRV
 ;;^DIST(.403,.1101,40,4,40,.110108,12)
 ;;=I $D(DIKCCRV)#2 D BLDLOG^DIKCFORM(DA(1)) K DIKCCRV
 ;;^DIST(.403,.1102,0)
 ;;=DIKC EDIT UI^^^^2970612.1058^2981229.1134^^.11^0^0^1
 ;;^DIST(.403,.1102,14)
 ;;=D POSTSV^DIKCFORM
 ;;^DIST(.403,.1102,40,0)
 ;;=^.4031I^2^2
 ;;^DIST(.403,.1102,40,1,0)
 ;;=1^^1,1
 ;;^DIST(.403,.1102,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.1102,40,1,40,0)
 ;;=^.4032IP^.11021^2
 ;;^DIST(.403,.1102,40,1,40,.11021,0)
 ;;=.11021^2^3,1^e
 ;;^DIST(.403,.1102,40,1,40,.11022,0)
 ;;=.11022^1^1,1^d
 ;;^DIST(.403,.1102,40,1,40,.11023,0)
 ;;=.11023^4^11,3^e
 ;;^DIST(.403,.1102,40,1,40,.11023,2)
 ;;=4^^f^1
 ;;^DIST(.403,.1102,40,1,40,.11024,0)
 ;;=.11024^3^9,2^e
 ;;^DIST(.403,.1102,40,2,0)
 ;;=1.1^^7,1^^^1^15,79
 ;;^DIST(.403,.1102,40,2,1)
 ;;=Page 1.1^ORDER,4,1
 ;;^DIST(.403,.1102,40,2,40,0)
 ;;=^.4032IP^.11025^1
 ;;^DIST(.403,.1102,40,2,40,.11025,0)
 ;;=.11025^1^1,1^e
 ;;^DIST(.403,.3101,0)
 ;;=DIKK EDIT^^^^2970721.144^2990311.1203^^.31^0^0^1
 ;;^DIST(.403,.3101,20)
 ;;=D FORMDV^DIKKFORM
 ;;^DIST(.403,.3101,40,0)
 ;;=^.4031I^3^3
 ;;^DIST(.403,.3101,40,1,0)
 ;;=1^^1,1^2
 ;;^DIST(.403,.3101,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.3101,40,1,40,0)
 ;;=^.4032IP^.310101^6
 ;;^DIST(.403,.3101,40,1,40,.310101,0)
 ;;=.310101^1^1,1^d
 ;;^DIST(.403,.3101,40,1,40,.310102,0)
 ;;=.310102^2^3,1^e
 ;;^DIST(.403,.3101,40,1,40,.310103,0)
 ;;=.310103^3^5,3^d
 ;;^DIST(.403,.3101,40,1,40,.310104,0)
 ;;=.310104^4^9,3^e
 ;;^DIST(.403,.3101,40,1,40,.310104,2)
 ;;=5
 ;;^DIST(.403,.3101,40,1,40,.310105,0)
 ;;=.310105^5^15,1^d
 ;;^DIST(.403,.3101,40,1,40,.310105,1)
 ;;=UNIQUENESS INDEX
 ;;^DIST(.403,.3101,40,1,40,.310106,0)
 ;;=.310106^6^15,1^e
 ;;^DIST(.403,.3101,40,2,0)
 ;;=1.1^^1,1^^^1^17,79
 ;;^DIST(.403,.3101,40,2,1)
 ;;=Page 1.1^DETAILS,DIKK EDIT UNIQUENESS INDEX,1
 ;;^DIST(.403,.3101,40,2,40,0)
 ;;=^.4032IP^.310107^4
 ;;^DIST(.403,.3101,40,2,40,.310107,0)
 ;;=.310107^1^1,1^d
 ;;^DIST(.403,.3101,40,2,40,.310107,1)
 ;;=UNIQUENESS INDEX
 ;;^DIST(.403,.3101,40,2,40,.310108,0)
 ;;=.310108^2^2,3^e
 ;;^DIST(.403,.3101,40,2,40,.310108,1)
 ;;=UNIQUENESS INDEX
 ;;^DIST(.403,.3101,40,2,40,.310109,0)
 ;;=.310109^3^8,3^d
 ;;^DIST(.403,.3101,40,2,40,.31011,0)
 ;;=.31011^4^10,3^e
 ;;^DIST(.403,.3101,40,2,40,.31011,1)
 ;;=UNIQUENESS INDEX
 ;;^DIST(.403,.3101,40,2,40,.31011,2)
 ;;=4^^f^1
 ;;^DIST(.403,.3101,40,3,0)
 ;;=1.2^^8,2^^^1^16,78
 ;;^DIST(.403,.3101,40,3,1)
 ;;=Page 1.2^ORDER,DIKK EDIT UI FIELD REP,1.1
 ;;^DIST(.403,.3101,40,3,40,0)
 ;;=^.4032IP^.310111^1
 ;;^DIST(.403,.3101,40,3,40,.310111,0)
 ;;=.310111^1^1,1^e
 ;;^DIST(.403,.3101,40,3,40,.310111,11)
 ;;=K DIKKCRV
 ;;^DIST(.403,.3101,40,3,40,.310111,12)
 ;;=I $D(DIKKCRV) D BLDLOG^DIKCFORM(DA(1)) K DIKKCRV
 ;;^DIST(.403,.40001,0)
 ;;=DIBTED^@^^^2980904.1357^2990130.0900^^.401^0^0^1
 ;;^DIST(.403,.40001,12)
 ;;=D SAVEFLDS^DIBTED(DA)
 ;;^DIST(.403,.40001,40,0)
 ;;=^.4031I^2^2
 ;;^DIST(.403,.40001,40,1,0)
 ;;=1^^1,1^2
 ;;^DIST(.403,.40001,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.40001,40,1,40,0)
 ;;=^.4032IP^.400011^1
 ;;^DIST(.403,.40001,40,1,40,.400011,0)
 ;;=.400011^1^1,1^e
 ;;^DIST(.403,.40001,40,2,0)
 ;;=2^^1,1^^1
 ;;^DIST(.403,.40001,40,2,1)
 ;;=Page 2
 ;;^DIST(.403,.40001,40,2,40,0)
 ;;=^.4032IP^.400012^1
 ;;^DIST(.403,.40001,40,2,40,.400012,0)
 ;;=.400012^1^1,1^e
 ;;^DIST(.403,.40101,0)
 ;;=DIETED^@^^^2980801.074^2990303.0830^^.402^0^0^1
 ;;^DIST(.403,.40101,14)
 ;;=D SAVEFLDS^DIETED(DA)
 ;;^DIST(.403,.40101,40,0)
 ;;=^.4031I^2^2

DINIT0F2
DINIT0F2 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;12DEC2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F3 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.403,.40101,40,1,0)
 ;;=1^^1,1^2
 ;;^DIST(.403,.40101,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.40101,40,1,40,0)
 ;;=^.4032IP^.401011^1
 ;;^DIST(.403,.40101,40,1,40,.401011,0)
 ;;=.401011^1^1,1^e
 ;;^DIST(.403,.40101,40,2,0)
 ;;=2^^1,1^^1
 ;;^DIST(.403,.40101,40,2,1)
 ;;=Page 2
 ;;^DIST(.403,.40101,40,2,40,0)
 ;;=^.4032IP^.401012^1
 ;;^DIST(.403,.40101,40,2,40,.401012,0)
 ;;=.401012^1^1,1^e
 ;;^DIST(.403,.40101,40,2,40,.401012,11)
 ;;=D EDIT^DIETED(DA)
 ;;^DIST(.403,.40201,0)
 ;;=DIEDIT^@^^^2981016.103^2990317.0933^^1^0^0^1
 ;;^DIST(.403,.40201,20)
 ;;=D POST^DIU20
 ;;^DIST(.403,.40201,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40201,40,1,0)
 ;;=1^^1,1
 ;;^DIST(.403,.40201,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.40201,40,1,40,0)
 ;;=^.4032IP^.402011^1
 ;;^DIST(.403,.40201,40,1,40,.402011,0)
 ;;=.402011^1^1,3^e
 ;;^DIST(.403,.40301,0)
 ;;=DDGF BLOCK EDIT^^^0^2930413^2990916.1055^^.403^0^0^1
 ;;^DIST(.403,.40301,40,0)
 ;;=^.4031I^2^2
 ;;^DIST(.403,.40301,40,1,0)
 ;;=1^^1,2^^^1^17,77
 ;;^DIST(.403,.40301,40,1,1)
 ;;=Edit Block Parameters
 ;;^DIST(.403,.40301,40,1,40,0)
 ;;=^.4032PI^.403012^2
 ;;^DIST(.403,.40301,40,1,40,.403011,0)
 ;;=.403011^1^1,1^e
 ;;^DIST(.403,.40301,40,1,40,.403012,0)
 ;;=.403012^2^10,1^e
 ;;^DIST(.403,.40301,40,1,40,.403012,1)
 ;;=PAGE:BLOCK:.01
 ;;^DIST(.403,.40301,40,2,0)
 ;;=11^^4,11^^^1^18,65
 ;;^DIST(.403,.40301,40,2,1)
 ;;=Page 11
 ;;^DIST(.403,.40301,40,2,40,0)
 ;;=^.4032PI^.403013^1
 ;;^DIST(.403,.40301,40,2,40,.403013,0)
 ;;=.403013^1^1,1^e
 ;;^DIST(.403,.40302,0)
 ;;=DDGF PAGE ADD^^^0^2930419^2990205.1327^^.403^0^1^1
 ;;^DIST(.403,.40302,40,0)
 ;;=^.4031I^2^2
 ;;^DIST(.403,.40302,40,1,0)
 ;;=1^^4,18^^^1^8,43
 ;;^DIST(.403,.40302,40,1,1)
 ;;=Add a New Page
 ;;^DIST(.403,.40302,40,1,40,0)
 ;;=^.4032PI^.403021^1
 ;;^DIST(.403,.40302,40,1,40,.403021,0)
 ;;=.403021^1^1,1^e
 ;;^DIST(.403,.40302,40,2,0)
 ;;=11^^4,15^^^1^9,49
 ;;^DIST(.403,.40302,40,2,1)
 ;;=Select New Page Number
 ;;^DIST(.403,.40302,40,2,40,0)
 ;;=^.4032PI^.403022^1
 ;;^DIST(.403,.40302,40,2,40,.403022,0)
 ;;=.403022^1^1,1^e
 ;;^DIST(.403,.40303,0)
 ;;=DDGF PAGE EDIT^^^0^2930419^2990205.1328^^.403^0^0^1
 ;;^DIST(.403,.40303,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40303,40,1,0)
 ;;=1^^1,3^^^1^17,77
 ;;^DIST(.403,.40303,40,1,1)
 ;;=Edit a Page
 ;;^DIST(.403,.40303,40,1,40,0)
 ;;=^.4032PI^.403031^1
 ;;^DIST(.403,.40303,40,1,40,.403031,0)
 ;;=.403031^1^1,1^e
 ;;^DIST(.403,.40303,40,1,40,.403031,11)
 ;;=I $$GET^DDSVALF("IS THIS A POP UP PAGE?") N DDGFI F DDGFI="PREVIOUS","NEXT" D UNED^DDSUTL(DDGFI_" PAGE","","",1)
 ;;^DIST(.403,.40304,0)
 ;;=DDGF PAGE SELECT^^^0^2930419^2990916.1055^^.403^0^1^1
 ;;^DIST(.403,.40304,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40304,40,1,0)
 ;;=1^^4,10^^^1^8,56
 ;;^DIST(.403,.40304,40,1,1)
 ;;=Select a Page
 ;;^DIST(.403,.40304,40,1,40,0)
 ;;=^.4032PI^.403041^1
 ;;^DIST(.403,.40304,40,1,40,.403041,0)
 ;;=.403041^1^3,3^e
 ;;^DIST(.403,.40305,0)
 ;;=DDGF FORM EDIT^^^0^2930427^2990302.0754^^.403^0^0^1
 ;;^DIST(.403,.40305,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40305,40,1,0)
 ;;=1^^1,2^^^1^16,76
 ;;^DIST(.403,.40305,40,1,1)
 ;;=Form Edit
 ;;^DIST(.403,.40305,40,1,40,0)
 ;;=^.4032PI^.403051^1
 ;;^DIST(.403,.40305,40,1,40,.403051,0)
 ;;=.403051^1^1,1^e
 ;;^DIST(.403,.40306,0)
 ;;=DDGF HEADER BLOCK EDIT^^^0^2930504^2941115.0924^^.403^0^0^1
 ;;^DIST(.403,.40306,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40306,40,1,0)
 ;;=1^^2,1^^^1^14,76
 ;;^DIST(.403,.40306,40,1,1)
 ;;=Edit/Delete the Header Block
 ;;^DIST(.403,.40306,40,1,40,0)
 ;;=^.4032PI^.403061^2
 ;;^DIST(.403,.40306,40,1,40,.403012,0)
 ;;=.403012^2^5,1^e
 ;;^DIST(.403,.40306,40,1,40,.403012,1)
 ;;=PAGE:1
 ;;^DIST(.403,.40306,40,1,40,.403061,0)
 ;;=.403061^1^1,1^e
 ;;^DIST(.403,.40401,0)
 ;;=DDGF FIELD ADD^^^0^2930331^2990916.1050^^.404^0^1^1
 ;;^DIST(.403,.40401,20)
 ;;=D VAL1^DDGFU
 ;;^DIST(.403,.40401,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40401,40,1,0)
 ;;=1^^4,12^^^1^10,59
 ;;^DIST(.403,.40401,40,1,1)
 ;;=New field
 ;;^DIST(.403,.40401,40,1,40,0)
 ;;=^.4032PI^.404011^1
 ;;^DIST(.403,.40401,40,1,40,.404011,0)
 ;;=.404011^1^3,3^e
 ;;^DIST(.403,.40402,0)
 ;;=DDGF FIELD CAPTION ONLY^^^0^2930409^2990916.1050^^.404^0^0^1
 ;;^DIST(.403,.40402,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40402,40,1,0)
 ;;=1^^1,2^^^1^9,75
 ;;^DIST(.403,.40402,40,1,1)
 ;;=Caption only field
 ;;^DIST(.403,.40402,40,1,40,0)
 ;;=^.4032PI^.404021^1
 ;;^DIST(.403,.40402,40,1,40,.404021,0)
 ;;=.404021^1^1,3^e
 ;;^DIST(.403,.40403,0)
 ;;=DDGF FIELD DD^^^0^2930510^2990916.1048^^.404^0^0^1
 ;;^DIST(.403,.40403,40,0)
 ;;=^.4031I^4^4
 ;;^DIST(.403,.40403,40,1,0)
 ;;=1^^1,1^^^1^16,77
 ;;^DIST(.403,.40403,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.40403,40,1,40,0)
 ;;=^.4032PI^.404031^1
 ;;^DIST(.403,.40403,40,1,40,.404031,0)
 ;;=.404031^1^1,1^e
 ;;^DIST(.403,.40403,40,2,0)
 ;;=11^^3,3^^^1^15,75
 ;;^DIST(.403,.40403,40,2,1)
 ;;=Single-Valued Field (Other)
 ;;^DIST(.403,.40403,40,2,40,0)
 ;;=^.4032PI^.404032^1
 ;;^DIST(.403,.40403,40,2,40,.404032,0)
 ;;=.404032^1^1,1^e
 ;;^DIST(.403,.40403,40,3,0)
 ;;=21^^3,17^^^1^15,60
 ;;^DIST(.403,.40403,40,3,1)
 ;;=Multiple-Valued Field (Other)
 ;;^DIST(.403,.40403,40,3,40,0)
 ;;=^.4032PI^.404033^1
 ;;^DIST(.403,.40403,40,3,40,.404033,0)
 ;;=.404033^1^1,1^e
 ;;^DIST(.403,.40403,40,4,0)
 ;;=31^^3,17^^^1^13,60
 ;;^DIST(.403,.40403,40,4,1)
 ;;=Word Processing Field (Other)
 ;;^DIST(.403,.40403,40,4,40,0)
 ;;=^.4032PI^.404034^1
 ;;^DIST(.403,.40403,40,4,40,.404034,0)
 ;;=.404034^1^1,1^e
 ;;^DIST(.403,.40404,0)
 ;;=DDGF FIELD FORM ONLY^^^0^2930510^2990310.0915^^.404^0^0^1
 ;;^DIST(.403,.40404,40,0)
 ;;=^.4031I^3^3
 ;;^DIST(.403,.40404,40,1,0)
 ;;=1^^1,1^^^1^16,77
 ;;^DIST(.403,.40404,40,1,1)
 ;;=Form Only Field
 ;;^DIST(.403,.40404,40,1,40,0)
 ;;=^.4032PI^.404041^1
 ;;^DIST(.403,.40404,40,1,40,.404041,0)
 ;;=.404041^1^1,1^e
 ;;^DIST(.403,.40404,40,2,0)
 ;;=11^^3,3^^^1^15,75
 ;;^DIST(.403,.40404,40,2,1)
 ;;=Other Form Only Field Params
 ;;^DIST(.403,.40404,40,2,40,0)
 ;;=^.4032PI^.404042^1
 ;;^DIST(.403,.40404,40,2,40,.404042,0)
 ;;=.404042^1^1,1^e
 ;;^DIST(.403,.40404,40,3,0)
 ;;=21^^3,3^^^1^15,75
 ;;^DIST(.403,.40404,40,3,1)
 ;;=Other Parameters
 ;;^DIST(.403,.40404,40,3,40,0)
 ;;=^.4032PI^.404032^1
 ;;^DIST(.403,.40404,40,3,40,.404032,0)
 ;;=.404032^1^1,1^e
 ;;^DIST(.403,.40405,0)
 ;;=DDGF FIELD COMPUTED^^^0^2930916^2990211.0855^^.404^0^0^1
 ;;^DIST(.403,.40405,40,0)
 ;;=^.4031I^2^2
 ;;^DIST(.403,.40405,40,1,0)
 ;;=1^^1,2^^^1^12,76
 ;;^DIST(.403,.40405,40,1,1)
 ;;=Computed Field
 ;;^DIST(.403,.40405,40,1,40,0)
 ;;=^.4032PI^.404051^1
 ;;^DIST(.403,.40405,40,1,40,.404051,0)
 ;;=.404051^1^1,1^e

DINIT0F3
DINIT0F3 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F4 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.403,.40405,40,2,0)
 ;;=11^^3,16^^^1^11,63
 ;;^DIST(.403,.40405,40,2,1)
 ;;=Other Parameters
 ;;^DIST(.403,.40405,40,2,40,0)
 ;;=^.4032PI^.404052^1
 ;;^DIST(.403,.40405,40,2,40,.404052,0)
 ;;=.404052^1^1,3^e
 ;;^DIST(.403,.40406,0)
 ;;=DDGF BLOCK ADD^^^0^2930413^2990316.0924^^.404^0^1^1
 ;;^DIST(.403,.40406,40,0)
 ;;=^.4031I^3^3
 ;;^DIST(.403,.40406,40,1,0)
 ;;=1^^3,9^^^1^7,65
 ;;^DIST(.403,.40406,40,1,1)
 ;;=Add a New Block
 ;;^DIST(.403,.40406,40,1,40,0)
 ;;=^.4032PI^.404061^1
 ;;^DIST(.403,.40406,40,1,40,.404061,0)
 ;;=.404061^1^1,1^e
 ;;^DIST(.403,.40406,40,2,0)
 ;;=11^^6,12^^^1^11,61
 ;;^DIST(.403,.40406,40,2,1)
 ;;=Add a New Block to Page
 ;;^DIST(.403,.40406,40,2,40,0)
 ;;=^.4032PI^.404062^1
 ;;^DIST(.403,.40406,40,2,40,.404062,0)
 ;;=.404062^1^1,1^e
 ;;^DIST(.403,.40406,40,3,0)
 ;;=21^^6,17^^^1^13,57
 ;;^DIST(.403,.40406,40,3,1)
 ;;=Duplicate Block Message
 ;;^DIST(.403,.40406,40,3,40,0)
 ;;=^.4032PI^.404063^1
 ;;^DIST(.403,.40406,40,3,40,.404063,0)
 ;;=.404063^1^1,1^e
 ;;^DIST(.403,.40407,0)
 ;;=DDGF BLOCK DELETE^^^0^2930809^2981117.0720^^.404^0^1^1
 ;;^DIST(.403,.40407,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40407,40,1,0)
 ;;=1^^5,9^^^1^11,62
 ;;^DIST(.403,.40407,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.40407,40,1,40,0)
 ;;=^.4032PI^.404071^1
 ;;^DIST(.403,.40407,40,1,40,.404071,0)
 ;;=.404071^1^3,3^e
 ;;^DIST(.403,.40408,0)
 ;;=DDGF HEADER BLOCK SELECT^^^0^2930504^2940928.1204^^.404^0^1^1
 ;;^DIST(.403,.40408,40,0)
 ;;=^.4031I^1^1
 ;;^DIST(.403,.40408,40,1,0)
 ;;=1^^4,5^^^1^8,68
 ;;^DIST(.403,.40408,40,1,1)
 ;;=Add a New Header Block
 ;;^DIST(.403,.40408,40,1,40,0)
 ;;=^.4032PI^.404081^1
 ;;^DIST(.403,.40408,40,1,40,.404081,0)
 ;;=.404081^1^1,1^e
 ;;^DIST(.403,.441,0)
 ;;=DDXP FF FORM1^^^^2920925^2990324.0806^^.44^0^0^1
 ;;^DIST(.403,.441,20)
 ;;=D FORMVAL^DDXP1
 ;;^DIST(.403,.441,40,0)
 ;;=^.4031I^3^3
 ;;^DIST(.403,.441,40,1,0)
 ;;=1^^1,1^2^2^0
 ;;^DIST(.403,.441,40,1,1)
 ;;=PAGE 1
 ;;^DIST(.403,.441,40,1,15,0)
 ;;=^^1^1^2920925
 ;;^DIST(.403,.441,40,1,15,1,0)
 ;;=First page for Foreign Format definition.  It contains block DDXP FF BLK1.
 ;;^DIST(.403,.441,40,1,40,0)
 ;;=^.4032PI^.441^1
 ;;^DIST(.403,.441,40,1,40,.441,0)
 ;;=.441^1^1,1^e
 ;;^DIST(.403,.441,40,2,0)
 ;;=2^^1,1^1^1^0
 ;;^DIST(.403,.441,40,2,1)
 ;;=PAGE 2
 ;;^DIST(.403,.441,40,2,15,0)
 ;;=^^2^2^2920925
 ;;^DIST(.403,.441,40,2,15,1,0)
 ;;=Page 2 of the form used to define a Foreign Format.  It contains block
 ;;^DIST(.403,.441,40,2,15,2,0)
 ;;=DDXP FF BLK2 and subpage containing DDXP FF BLK3.
 ;;^DIST(.403,.441,40,2,40,0)
 ;;=^.4032PI^.442^1
 ;;^DIST(.403,.441,40,2,40,.442,0)
 ;;=.442^1^1,1^e
 ;;^DIST(.403,.441,40,3,0)
 ;;=3^^12,23^^^1^16,59
 ;;^DIST(.403,.441,40,3,1)
 ;;=POP-UP PAGE 1
 ;;^DIST(.403,.441,40,3,15,0)
 ;;=^^2^2^2920925
 ;;^DIST(.403,.441,40,3,15,1,0)
 ;;=This pop-up page is called from page 2 of DDXP FF FORM1.  It contains
 ;;^DIST(.403,.441,40,3,15,2,0)
 ;;=block DDXP FF BLK3, which has the OTHER NAME FOR FORMAT multiple.
 ;;^DIST(.403,.441,40,3,40,0)
 ;;=^.4032PI^.443^1
 ;;^DIST(.403,.441,40,3,40,.443,0)
 ;;=.443^1^1,1^e
 ;;^DIST(.403,.461,0)
 ;;=DDMP SPECIFY IMPORT^^^^2950216.1102^2990224.0835^^.46^0^1^1
 ;;^DIST(.403,.461,11)
 ;;=S (DDMPFDCT,DDMPOSET)=0
 ;;^DIST(.403,.461,20)
 ;;=D VAL^DDMPSM
 ;;^DIST(.403,.461,40,0)
 ;;=^.4031I^4^4
 ;;^DIST(.403,.461,40,1,0)
 ;;=1^^1,1^2^2
 ;;^DIST(.403,.461,40,1,1)
 ;;=Page 1
 ;;^DIST(.403,.461,40,1,40,0)
 ;;=^.4032IP^.4611^1
 ;;^DIST(.403,.461,40,1,40,.4611,0)
 ;;=.4611^1^1,1^e
 ;;^DIST(.403,.461,40,2,0)
 ;;=2^^1,1^1^1
 ;;^DIST(.403,.461,40,2,1)
 ;;=Page 2
 ;;^DIST(.403,.461,40,2,11)
 ;;=D PAGE2^DDMPSM1
 ;;^DIST(.403,.461,40,2,40,0)
 ;;=^.4032IP^.4612^1
 ;;^DIST(.403,.461,40,2,40,.4612,0)
 ;;=.4612^1^1,1^e
 ;;^DIST(.403,.461,40,3,0)
 ;;=3^^5,33^^^1^11,79
 ;;^DIST(.403,.461,40,3,1)
 ;;=Page 3
 ;;^DIST(.403,.461,40,3,40,0)
 ;;=^.4032IP^.4613^1
 ;;^DIST(.403,.461,40,3,40,.4613,0)
 ;;=.4613^1^2,2^e
 ;;^DIST(.403,.461,40,4,0)
 ;;=4^^6,18^^^1^12,64
 ;;^DIST(.403,.461,40,4,1)
 ;;=Page 4
 ;;^DIST(.403,.461,40,4,11)
 ;;=S DDMPFRP4=1
 ;;^DIST(.403,.461,40,4,15,0)
 ;;=^^3^3^2950301
 ;;^DIST(.403,.461,40,4,15,1,0)
 ;;=This page explains that all fields need a length for a fixed length
 ;;^DIST(.403,.461,40,4,15,2,0)
 ;;=import.  It gives user the option of deleting the last field entered or
 ;;^DIST(.403,.461,40,4,15,3,0)
 ;;=returning to length prompt.
 ;;^DIST(.403,.461,40,4,40,0)
 ;;=^.4032IP^.4614^1
 ;;^DIST(.403,.461,40,4,40,.4614,0)
 ;;=.4614^1^2,2^e

DINIT0F4
DINIT0F4 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;12:26 PM  14 Aug 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F5 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.00101,0)
 ;;=DICATT^1
 ;;^DIST(.404,.00101,40,0)
 ;;=^.4044I^17^16
 ;;^DIST(.404,.00101,40,1,0)
 ;;=1^FIELD LABEL^2^^LABEL
 ;;^DIST(.404,.00101,40,1,2)
 ;;=2,14^30^2,1
 ;;^DIST(.404,.00101,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,1,3.1)
 ;;=S Y=$P($G(^DD(DICATTA,DICATTF,0)),U)
 ;;^DIST(.404,.00101,40,1,10)
 ;;=S DDSBR=20 I X="" S DDSSTACK=9
 ;;^DIST(.404,.00101,40,1,20)
 ;;=DD^^0,.01
 ;;^DIST(.404,.00101,40,2,0)
 ;;=2^TITLE^2^^TITLE
 ;;^DIST(.404,.00101,40,2,2)
 ;;=4,18^60^4,11
 ;;^DIST(.404,.00101,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,2,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,.1))
 ;;^DIST(.404,.00101,40,2,11)
 ;;=I $$GET^DDSVALF(1)="" S DDACT="EX"
 ;;^DIST(.404,.00101,40,2,20)
 ;;=F^^1:99
 ;;^DIST(.404,.00101,40,2,22)
 ;;=I +X=X K X
 ;;^DIST(.404,.00101,40,3,0)
 ;;=11^DESCRIPTION...^2^^DESCRIPTION
 ;;^DIST(.404,.00101,40,3,2)
 ;;=11,17^1^11,2^1
 ;;^DIST(.404,.00101,40,3,10)
 ;;=S DDSSTACK=1.1
 ;;^DIST(.404,.00101,40,3,20)
 ;;=F^^1:1
 ;;^DIST(.404,.00101,40,4,0)
 ;;=3^AUDIT^2^^AUDIT
 ;;^DIST(.404,.00101,40,4,2)
 ;;=5,18^16^5,11
 ;;^DIST(.404,.00101,40,4,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,4,3.1)
 ;;=S Y=$P($G(^DD(DICATTA,DICATTF,"AUDIT")),U)
 ;;^DIST(.404,.00101,40,4,20)
 ;;=DD^^0,1.1
 ;;^DIST(.404,.00101,40,5,0)
 ;;=4^AUDIT CONDITION^2^^AUDIT CONDITION
 ;;^DIST(.404,.00101,40,5,2)
 ;;=6,18^60^6,1
 ;;^DIST(.404,.00101,40,5,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,5,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,"AX"))
 ;;^DIST(.404,.00101,40,5,20)
 ;;=DD^^0,1.2
 ;;^DIST(.404,.00101,40,6,0)
 ;;=5^READ ACCESS^2^^READ ACCESS
 ;;^DIST(.404,.00101,40,6,2)
 ;;=7,18^13^7,5
 ;;^DIST(.404,.00101,40,6,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,6,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,8))
 ;;^DIST(.404,.00101,40,6,20)
 ;;=DD^^0,8
 ;;^DIST(.404,.00101,40,7,0)
 ;;=6^DELETE ACCESS^2^^DELETE ACCESS
 ;;^DIST(.404,.00101,40,7,2)
 ;;=8,18^13^8,3
 ;;^DIST(.404,.00101,40,7,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,7,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,8.5))
 ;;^DIST(.404,.00101,40,7,20)
 ;;=DD^^0,8.5
 ;;^DIST(.404,.00101,40,8,0)
 ;;=7^WRITE ACCESS^2^^WRITE ACCESS
 ;;^DIST(.404,.00101,40,8,2)
 ;;=9,18^13^9,4
 ;;^DIST(.404,.00101,40,8,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,8,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,9))
 ;;^DIST(.404,.00101,40,8,20)
 ;;=DD^^0,9
 ;;^DIST(.404,.00101,40,9,0)
 ;;=12^TECHNICAL DESCRIPTION...^2
 ;;^DIST(.404,.00101,40,9,2)
 ;;=11,49^1^11,24^1
 ;;^DIST(.404,.00101,40,9,10)
 ;;=S DDSSTACK=1.2
 ;;^DIST(.404,.00101,40,9,20)
 ;;=F^^1:1
 ;;^DIST(.404,.00101,40,10,0)
 ;;=18^MANDATORY^2^^MANDATORY
 ;;^DIST(.404,.00101,40,10,2)
 ;;=15,17^3^15,6
 ;;^DIST(.404,.00101,40,10,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,10,3.1)
 ;;=S Y=$S(DICATT2["R":"YES",DICATT2'["C"&'DICATT2:"NO",1:"")
 ;;^DIST(.404,.00101,40,10,10)
 ;;=S DDSBR=98
 ;;^DIST(.404,.00101,40,10,20)
 ;;=Y
 ;;^DIST(.404,.00101,40,12,0)
 ;;=98^HELP-PROMPT^2^^HELP-PROMPT
 ;;^DIST(.404,.00101,40,12,2)
 ;;=16,17^61^16,4
 ;;^DIST(.404,.00101,40,12,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,12,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,3))
 ;;^DIST(.404,.00101,40,12,20)
 ;;=DD^^0,3
 ;;^DIST(.404,.00101,40,13,0)
 ;;=99^XECUTABLE HELP^2^^XECUTABLE HELP
 ;;^DIST(.404,.00101,40,13,2)
 ;;=17,17^61^17,1
 ;;^DIST(.404,.00101,40,13,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,13,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,4))
 ;;^DIST(.404,.00101,40,13,20)
 ;;=DD^^0,4
 ;;^DIST(.404,.00101,40,14,0)
 ;;=20^DATA TYPE...^2^^TYPE
 ;;^DIST(.404,.00101,40,14,2)
 ;;=2,60^20^2,47^1
 ;;^DIST(.404,.00101,40,14,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,14,3.1)
 ;;=S Y=$$TYPE^DICATTD
 ;;^DIST(.404,.00101,40,14,4)
 ;;=1
 ;;^DIST(.404,.00101,40,14,10)
 ;;=S DDSBR=18 D BRANCH^DICATTD
 ;;^DIST(.404,.00101,40,14,11)
 ;;=I $G(DICATTDK) S DDACT="EX"
 ;;^DIST(.404,.00101,40,14,20)
 ;;=S^M^1:DATE;2:NUMERIC;3:SET;4:FREE TEXT;5:WORD-PROCESSING;6:COMPUTED;7:POINTER;8:VARIABLE-POINTER;9:MUMPS
 ;;^DIST(.404,.00101,40,14,24)
 ;;=D SCREEN^DICATTD
 ;;^DIST(.404,.00101,40,15,0)
 ;;=.5^^4^^FIELD NUMBER
 ;;^DIST(.404,.00101,40,15,2)
 ;;=1,1^77
 ;;^DIST(.404,.00101,40,15,30)
 ;;=D NUMBER^DICATTD
 ;;^DIST(.404,.00101,40,16,0)
 ;;=8^SOURCE^2^^SOURCE
 ;;^DIST(.404,.00101,40,16,2)
 ;;=10,18^61^10,10
 ;;^DIST(.404,.00101,40,16,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,16,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,10))
 ;;^DIST(.404,.00101,40,16,20)
 ;;=DD^^0,10
 ;;^DIST(.404,.00101,40,17,0)
 ;;=20.5^IS THIS FIELD MULTIPLE...^2^^MULTIPLE
 ;;^DIST(.404,.00101,40,17,2)
 ;;=13,49^3^13,23^1
 ;;^DIST(.404,.00101,40,17,3)
 ;;=!M
 ;;^DIST(.404,.00101,40,17,3.1)
 ;;=S Y="N"
 ;;^DIST(.404,.00101,40,17,4)
 ;;=^^^0
 ;;^DIST(.404,.00101,40,17,10)
 ;;=S:DICATT2'["X"&X DDSSTACK=5 I DICATT4="",DUZ(0)="@" S DDSSTACK=$S(X:5,1:3)
 ;;^DIST(.404,.00101,40,17,11)
 ;;=I DICATT4="",'$G(DICATTLN) S DDSBR=98
 ;;^DIST(.404,.00101,40,17,20)
 ;;=Y
 ;;^DIST(.404,.00102,0)
 ;;=DICATT1^1
 ;;^DIST(.404,.00102,40,0)
 ;;=^.4044I^6^6
 ;;^DIST(.404,.00102,40,1,0)
 ;;=21^EARLIEST DATE^2^^EARLIEST DATE
 ;;^DIST(.404,.00102,40,1,2)
 ;;=1,29^18^1,14
 ;;^DIST(.404,.00102,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00102,40,1,3.1)
 ;;=D EARLY^DICATTD1
 ;;^DIST(.404,.00102,40,1,10)
 ;;=S:'Y DDSBR=23
 ;;^DIST(.404,.00102,40,1,20)
 ;;=F
 ;;^DIST(.404,.00102,40,1,21,0)
 ;;=^^1^1^2981103
 ;;^DIST(.404,.00102,40,1,21,1,0)
 ;;=Enter a date, or "DT" to mean the current date at time of data entry
 ;;^DIST(.404,.00102,40,1,22)
 ;;=N Y,%DT I X'="DT" S %DT="" D ^%DT K:Y<0 X
 ;;^DIST(.404,.00102,40,2,0)
 ;;=22^LATEST DATE^2^^LATEST DATE
 ;;^DIST(.404,.00102,40,2,2)
 ;;=2,29^20^2,16
 ;;^DIST(.404,.00102,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00102,40,2,3.1)
 ;;=D LATEST^DICATTD1
 ;;^DIST(.404,.00102,40,2,20)
 ;;=F
 ;;^DIST(.404,.00102,40,2,21,0)
 ;;=^^1^1^2981103
 ;;^DIST(.404,.00102,40,2,21,1,0)
 ;;=Enter a date, or "DT" to mean the current date at time of data entry
 ;;^DIST(.404,.00102,40,2,22)
 ;;=N Y,%DT I X'="DT" S %DT="" D ^%DT K:Y<0 X
 ;;^DIST(.404,.00102,40,3,0)
 ;;=23^CAN DATE BE IMPRECISE^2^^CAN DATE BE IMPRECISE
 ;;^DIST(.404,.00102,40,3,2)
 ;;=3,29^3^3,6
 ;;^DIST(.404,.00102,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00102,40,3,3.1)
 ;;=S Y=$E("YN",$P(DICATT5,"""",2)["X"+1)
 ;;^DIST(.404,.00102,40,3,20)
 ;;=Y
 ;;^DIST(.404,.00102,40,3,21,0)
 ;;=^^1^1^2981031
 ;;^DIST(.404,.00102,40,3,21,1,0)
 ;;=E.G., Would 'FEB, 1999' be allowed?
 ;;^DIST(.404,.00102,40,4,0)
 ;;=24^CAN TIME OF DAY BE ENTERED^2^^CAN TIME OF DAY BE ENTERED
 ;;^DIST(.404,.00102,40,4,2)
 ;;=4,29^3^4,1
 ;;^DIST(.404,.00102,40,4,3)
 ;;=!M
 ;;^DIST(.404,.00102,40,4,3.1)
 ;;=S Y=$E("NY",$P(DICATT5,"""",2)["T"+1)
 ;;^DIST(.404,.00102,40,4,10)
 ;;=S:X=2 DDSBR="COM"

DINIT0F5
DINIT0F5 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;20JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F6 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.00102,40,4,20)
 ;;=Y
 ;;^DIST(.404,.00102,40,4,21,0)
 ;;=^^1^1^2981102
 ;;^DIST(.404,.00102,40,4,21,1,0)
 ;;=Can user enter time along with date, as in 'FEB23, 1999@7:30'
 ;;^DIST(.404,.00102,40,5,0)
 ;;=25^CAN SECONDS BE ENTERED^2^^SECONDS
 ;;^DIST(.404,.00102,40,5,2)
 ;;=5,29^3^5,5
 ;;^DIST(.404,.00102,40,5,3)
 ;;=!M
 ;;^DIST(.404,.00102,40,5,3.1)
 ;;=S Y=$E("NY",$P(DICATT5,"""",2)["S"+1)
 ;;^DIST(.404,.00102,40,5,20)
 ;;=Y
 ;;^DIST(.404,.00102,40,6,0)
 ;;=26^IS TIME REQUIRED^2^^IS TIME REQUIRED
 ;;^DIST(.404,.00102,40,6,2)
 ;;=6,29^3^6,11
 ;;^DIST(.404,.00102,40,6,3)
 ;;=!M
 ;;^DIST(.404,.00102,40,6,3.1)
 ;;=S Y=$E("NY",$P(DICATT5,"""",2)["R"+1)
 ;;^DIST(.404,.00102,40,6,20)
 ;;=Y
 ;;^DIST(.404,.00102,40,6,21,0)
 ;;=^^1^1^2981102
 ;;^DIST(.404,.00102,40,6,21,1,0)
 ;;=Must user enter TIME along with DATE?
 ;;^DIST(.404,.00103,0)
 ;;=DICATT2^1
 ;;^DIST(.404,.00103,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.00103,40,1,0)
 ;;=31^INCLUSIVE LOWER BOUND^2^^LOWER BOUND
 ;;^DIST(.404,.00103,40,1,2)
 ;;=1,38^20^1,15
 ;;^DIST(.404,.00103,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00103,40,1,3.1)
 ;;=I DICATT5["X<" S Y=+$P(DICATT5,"X<",2)
 ;;^DIST(.404,.00103,40,1,4)
 ;;=1
 ;;^DIST(.404,.00103,40,1,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00103,40,1,21,0)
 ;;=^^1^1^2990219
 ;;^DIST(.404,.00103,40,1,21,1,0)
 ;;=Enter the lowest allowable number
 ;;^DIST(.404,.00103,40,1,22)
 ;;=K:+X'=X!(X'["."&($L(X)>15))!(X["."&($L($P(+X,"."))+$L($P(+X,".",2))>15)) X
 ;;^DIST(.404,.00103,40,2,0)
 ;;=32^INCLUSIVE UPPER BOUND^2^^UPPER BOUND
 ;;^DIST(.404,.00103,40,2,2)
 ;;=2,38^20^2,15
 ;;^DIST(.404,.00103,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00103,40,2,3.1)
 ;;=I DICATT5["X>" S Y=+$P(DICATT5,"X>",2)
 ;;^DIST(.404,.00103,40,2,4)
 ;;=1
 ;;^DIST(.404,.00103,40,2,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00103,40,2,21,0)
 ;;=^^1^1^2990219
 ;;^DIST(.404,.00103,40,2,21,1,0)
 ;;=Enter the highest allowable number
 ;;^DIST(.404,.00103,40,2,22)
 ;;=K:+X'=X!(X'["."&($L(X)>15))!(X["."&($L($P(+X,"."))+$L($P(+X,"."))>15)) X
 ;;^DIST(.404,.00103,40,3,0)
 ;;=33^IS THIS A DOLLAR AMOUNT^2^^DOLLAR AMOUNT
 ;;^DIST(.404,.00103,40,3,2)
 ;;=3,38^3^3,13
 ;;^DIST(.404,.00103,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00103,40,3,3.1)
 ;;=S Y=$E("NY",DICATT5["""$"""+1)
 ;;^DIST(.404,.00103,40,3,12)
 ;;=I X=1 D PUT^DDSVALF(34,,,2,"") S DDSBR="COM"
 ;;^DIST(.404,.00103,40,3,20)
 ;;=Y
 ;;^DIST(.404,.00103,40,4,0)
 ;;=34^MAXIMUM NUMBER OF FRACTIONAL DIGITS^2^^FRACTIONAL DIGITS
 ;;^DIST(.404,.00103,40,4,2)
 ;;=4,38^1^4,1
 ;;^DIST(.404,.00103,40,4,3)
 ;;=!M
 ;;^DIST(.404,.00103,40,4,3.1)
 ;;=S Y=$S(DICATT5["""$""":2,1:$P(DICATT5,"1"".""",2)-1) S:Y<0 Y=0
 ;;^DIST(.404,.00103,40,4,4)
 ;;=0
 ;;^DIST(.404,.00103,40,4,20)
 ;;=N^^0:9
 ;;^DIST(.404,.00104,0)
 ;;=DICATT4^1
 ;;^DIST(.404,.00104,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.00104,40,1,0)
 ;;=68^MINIMUM LENGTH^2^^MINIMUM LENGTH
 ;;^DIST(.404,.00104,40,1,2)
 ;;=2,27^7^2,11
 ;;^DIST(.404,.00104,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00104,40,1,3.1)
 ;;=S Y=+$P(DICATT5,"$L(X)<",2) S:'Y Y=""
 ;;^DIST(.404,.00104,40,1,4)
 ;;=1
 ;;^DIST(.404,.00104,40,1,20)
 ;;=F^^1:7
 ;;^DIST(.404,.00104,40,1,22)
 ;;=K:X'?1.N!'X X
 ;;^DIST(.404,.00104,40,2,0)
 ;;=69^MAXIMUM LENGTH^2^^MAXIMUM LENGTH
 ;;^DIST(.404,.00104,40,2,2)
 ;;=3,27^7^3,11
 ;;^DIST(.404,.00104,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00104,40,2,3.1)
 ;;=S Y=+$P(DICATT5,"$L(X)>",2) S:'Y Y=""
 ;;^DIST(.404,.00104,40,2,4)
 ;;=1
 ;;^DIST(.404,.00104,40,2,20)
 ;;=F^^1:7
 ;;^DIST(.404,.00104,40,2,22)
 ;;=K:X'?1.N!(X<1) X I $D(X) K:X>($G(^DD("STRING_LIMIT"),255)-5) X
 ;;^DIST(.404,.00104,40,3,0)
 ;;=70^PATTERN MATCH (IN 'X')^2^^PATTERN MATCH
 ;;^DIST(.404,.00104,40,3,2)
 ;;=4,27^30^4,3
 ;;^DIST(.404,.00104,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00104,40,3,3.1)
 ;;=D PRE4^DICATTD4
 ;;^DIST(.404,.00104,40,3,20)
 ;;=F^U^3:80
 ;;^DIST(.404,.00104,40,3,21,0)
 ;;=^^1^1^2981104
 ;;^DIST(.404,.00104,40,3,21,1,0)
 ;;=Example: "X?1.A"  or  "X'?.P"
 ;;^DIST(.404,.00104,40,3,22)
 ;;=S X="I "_X D ^DIM S:$D(X) X=$E(X,3,999)
 ;;^DIST(.404,.00105,0)
 ;;=DICATT5^1
 ;;^DIST(.404,.00105,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.00105,40,1,0)
 ;;=75^SHALL THIS TEXT NORMALLY APPEAR IN WORD-WRAP MODE^2^^WORD-WRAP
 ;;^DIST(.404,.00105,40,1,2)
 ;;=2,53^3^2,2
 ;;^DIST(.404,.00105,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00105,40,1,3.1)
 ;;=S Y=$E("YN",DICATT2["L"+1)
 ;;^DIST(.404,.00105,40,1,12)
 ;;=S DICATTMN="",DICATT2N="W"_$TR($G(DICATT2N),"WL")_$E("L",'X)
 ;;^DIST(.404,.00105,40,1,20)
 ;;=Y
 ;;^DIST(.404,.00105,40,1,21,0)
 ;;=^^4^4^2981120
 ;;^DIST(.404,.00105,40,1,21,1,0)
 ;;=Answer 'YES' if the text should normally be printed out in full lines,
 ;;^DIST(.404,.00105,40,1,21,2,0)
 ;;=breaking at word boundaries.
 ;;^DIST(.404,.00105,40,1,21,3,0)
 ;;=Answer 'NO' if the text should normally be printed out line-for-line as
 ;;^DIST(.404,.00105,40,1,21,4,0)
 ;;=it was entered.
 ;;^DIST(.404,.00105,40,2,0)
 ;;=76^SHALL "|" CHARACTERS IN THIS TEXT BE TREATED LIKE ANY OTHER CHARACTERS^2^^"|"
 ;;^DIST(.404,.00105,40,2,2)
 ;;=3,74^3^3,2
 ;;^DIST(.404,.00105,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00105,40,2,3.1)
 ;;=S Y=$S(DICATT2["X"!(DICATT2["x")!(DICATT2=""):"Y",1:"N")
 ;;^DIST(.404,.00105,40,2,12)
 ;;=S DICATTMN="",DICATT2N="W"_$TR($G(DICATT2N),"WxX")_$E("x",X>0) I DUZ(0)="@",DICATT4="" S DDSSTACK=4
 ;;^DIST(.404,.00105,40,2,20)
 ;;=Y
 ;;^DIST(.404,.00105,40,2,21,0)
 ;;=^^4^4^2981120
 ;;^DIST(.404,.00105,40,2,21,1,0)
 ;;=Answer 'YES' if the internally-stored text may have "|" characters in it 
 ;;^DIST(.404,.00105,40,2,21,2,0)
 ;;=(such as HL7 messages) that need to display exactly as they are stored.
 ;;^DIST(.404,.00105,40,2,21,3,0)
 ;;=Answer 'NO' if the internal text should normally be printed out with
 ;;^DIST(.404,.00105,40,2,21,4,0)
 ;;=anything that is delimited by "|" characters interpreted as variable. 
 ;;^DIST(.404,.00106,0)
 ;;=DICATT6^1
 ;;^DIST(.404,.00106,40,0)
 ;;=^.4044I^8^8
 ;;^DIST(.404,.00106,40,1,0)
 ;;=78^^2^^COMPUTED EXPRESSION
 ;;^DIST(.404,.00106,40,1,2)
 ;;=3,2^73
 ;;^DIST(.404,.00106,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00106,40,1,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,9.1))
 ;;^DIST(.404,.00106,40,1,4)
 ;;=1
 ;;^DIST(.404,.00106,40,1,13)
 ;;=D VAL6^DICATTD6
 ;;^DIST(.404,.00106,40,1,20)
 ;;=F^U^1:250
 ;;^DIST(.404,.00106,40,1,21,0)
 ;;=^^3^3^2981118
 ;;^DIST(.404,.00106,40,1,21,1,0)
 ;;=A Computed Expression consists of Field Names, Operators (including "_"
 ;;^DIST(.404,.00106,40,1,21,2,0)
 ;;=for concatenation), Functions, and literal strings (e.g., "Name: ") and
 ;;^DIST(.404,.00106,40,1,21,3,0)
 ;;=digits.
 ;;^DIST(.404,.00106,40,2,0)
 ;;=77^COMPUTED-FIELD EXPRESSION:^1^^COMP
 ;;^DIST(.404,.00106,40,2,2)
 ;;=^^2,2
 ;;^DIST(.404,.00106,40,3,0)
 ;;=80^NUMBER OF FRACTIONAL DIGITS TO OUTPUT^2^^FRACTIONAL DIGITS
 ;;^DIST(.404,.00106,40,3,2)
 ;;=5,65^1^5,26
 ;;^DIST(.404,.00106,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00106,40,3,3.1)
 ;;=S Y=$P($P(DICATT2,"J",2),",",2),Y=$S(Y?1N.E:+Y,1:"")
 ;;^DIST(.404,.00106,40,3,20)
 ;;=N^^0:9:0
 ;;^DIST(.404,.00106,40,3,21,0)
 ;;=^^2^2^2981118
 ;;^DIST(.404,.00106,40,3,21,1,0)
 ;;=Enter the number of digits that should normally appear to the
 ;;^DIST(.404,.00106,40,3,21,2,0)
 ;;=right of the decimal point when this Field's value is displayed.
 ;;^DIST(.404,.00106,40,4,0)
 ;;=79^TYPE OF RESULT^2^^COMPTYPE
 ;;^DIST(.404,.00106,40,4,2)
 ;;=4,29^17^4,13
 ;;^DIST(.404,.00106,40,4,10)
 ;;=D BR79^DICATTD6
 ;;^DIST(.404,.00106,40,4,20)
 ;;=S^M^D:DATE;N:NUMERIC;B:BOOLEAN;S:STRING;m:MULTIPLE-VALUED;mp:MULTIPLE POINTER;p:POINTER
 ;;^DIST(.404,.00106,40,4,21,0)
 ;;=^^4^4^2981118
 ;;^DIST(.404,.00106,40,4,21,1,0)
 ;;=The typical Computed Field is STRING-valued, i.e., alphanumeric.
 ;;^DIST(.404,.00106,40,4,21,2,0)
 ;;=If NUMERIC, the indented questions will be asked.
 ;;^DIST(.404,.00106,40,4,21,3,0)
 ;;=BOOLEAN values are "true-false".
 ;;^DIST(.404,.00106,40,4,21,4,0)
 ;;=If the computation returns a number that is actually an Entry number in a File, call it a POINTER.
 ;;^DIST(.404,.00106,40,8,0)
 ;;=83.1^POINT TO FILE^2
 ;;^DIST(.404,.00106,40,8,2)
 ;;=8,46^27^8,30
 ;;^DIST(.404,.00106,40,8,3)
 ;;=!M
 ;;^DIST(.404,.00106,40,8,3.1)
 ;;=S Y=+$P(DICATT2,"p",2),Y=$S(Y:$P($G(^DIC(Y,0)),U),1:"")
 ;;^DIST(.404,.00106,40,8,20)
 ;;=P^^1:EOFIZ
 ;;^DIST(.404,.00106,40,8,24)
 ;;=S DIR("S")="I $$OKFILE^DICOMPX(Y,""W"")"

DINIT0F6
DINIT0F6 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;28JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F7 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.00106,40,5,0)
 ;;=83^LENGTH OF FIELD^2^^LENGTH
 ;;^DIST(.404,.00106,40,5,2)
 ;;=8,19^3^8,2
 ;;^DIST(.404,.00106,40,5,3)
 ;;=!M
 ;;^DIST(.404,.00106,40,5,3.1)
 ;;=I DICATT2["J" S Y=+$P(DICATT2,"J",2)
 ;;^DIST(.404,.00106,40,5,20)
 ;;=N^^1:250:0
 ;;^DIST(.404,.00106,40,5,21,0)
 ;;=^^2^2^2981106
 ;;^DIST(.404,.00106,40,5,21,1,0)
 ;;=MAXIMUM NUMBER OF CHARACTERS
 ;;^DIST(.404,.00106,40,5,21,2,0)
 ;;=  (not more than 250)
 ;;^DIST(.404,.00106,40,6,0)
 ;;=81^SHOULD VALUE ALWAYS BE ROUNDED^2^^ROUNDED
 ;;^DIST(.404,.00106,40,6,2)
 ;;=6,65^3^6,33
 ;;^DIST(.404,.00106,40,6,3)
 ;;=!M
 ;;^DIST(.404,.00106,40,6,3.1)
 ;;=I DICATT2[";" S Y=$E("NY",DICATT5[" S X=$J(X,0,"+1)
 ;;^DIST(.404,.00106,40,6,20)
 ;;=Y
 ;;^DIST(.404,.00106,40,7,0)
 ;;=82^WHEN TOTALLING, SHOULD SUMS BE SUMS OF COMPONENT FIELDS^2^^TOTALLING
 ;;^DIST(.404,.00106,40,7,2)
 ;;=7,65^3^7,8
 ;;^DIST(.404,.00106,40,7,3)
 ;;=!M
 ;;^DIST(.404,.00106,40,7,3.1)
 ;;=I $D(^DD(DICATTA,DICATTF,9.02)) S Y="Y"
 ;;^DIST(.404,.00106,40,7,20)
 ;;=Y
 ;;^DIST(.404,.00107,0)
 ;;=DICATT7^1
 ;;^DIST(.404,.00107,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.00107,40,1,0)
 ;;=84^POINT TO WHICH FILE^2^^FILE
 ;;^DIST(.404,.00107,40,1,2)
 ;;=2,27^39^2,6
 ;;^DIST(.404,.00107,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00107,40,1,3.1)
 ;;=S Y=$P($G(^DIC(+$P(DICATT2,"P",2),0)),U)
 ;;^DIST(.404,.00107,40,1,4)
 ;;=1
 ;;^DIST(.404,.00107,40,1,11)
 ;;=S:$G(DICATTSC)=7 DDACT="CL"
 ;;^DIST(.404,.00107,40,1,20)
 ;;=P^^1:EOFIZ
 ;;^DIST(.404,.00107,40,1,24)
 ;;=S DIR("S")="I Y-1.1 N DIFILE,DIAC S DIFILE=+Y,DIAC=""RD"" D ^DIAC I %"
 ;;^DIST(.404,.00107,40,2,0)
 ;;=85^SHALL 'ADDING A NEW FILE ENTRY ("LAYGO") BE ALLOWED^2^^LAYGO
 ;;^DIST(.404,.00107,40,2,2)
 ;;=4,59^3^4,6
 ;;^DIST(.404,.00107,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00107,40,2,3.1)
 ;;=S Y="N" I DICATT2["P" S Y=$E("YN",DICATT2["'"+1)
 ;;^DIST(.404,.00107,40,2,14)
 ;;=N DIFILE,DIAC S DIAC="LAYGO",DIFILE=$$GET^DDSVALF(84,,,"I","") D ^DIAC I $P($G(^DD(DIFILE,0,"DI")),U,2)["Y"!'DIAC S DDSERROR=1 D HLP^DDSUTL("NO LAYGO-ING TO THIS FILE!")
 ;;^DIST(.404,.00107,40,2,20)
 ;;=Y
 ;;^DIST(.404,.00108,0)
 ;;=DICATT8^1
 ;;^DIST(.404,.00108,40,0)
 ;;=^.4044I^14^14
 ;;^DIST(.404,.00108,40,1,0)
 ;;=91^VARIABLE-POINTER FILE #1^2^^VP 1
 ;;^DIST(.404,.00108,40,1,2)
 ;;=2,29^30^2,3
 ;;^DIST(.404,.00108,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,1,3.1)
 ;;=D Y^DICATTD8(1,1)
 ;;^DIST(.404,.00108,40,1,4)
 ;;=1
 ;;^DIST(.404,.00108,40,1,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,1,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00108,40,2,0)
 ;;=92^VARIABLE-POINTER FILE #2^2^^VP 2
 ;;^DIST(.404,.00108,40,2,2)
 ;;=3,29^30^3,3
 ;;^DIST(.404,.00108,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,2,3.1)
 ;;=D Y^DICATTD8(2,1)
 ;;^DIST(.404,.00108,40,2,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,2,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00108,40,3,0)
 ;;=91.1^ORDER...^2^^ORDER1
 ;;^DIST(.404,.00108,40,3,2)
 ;;=2,70^4^2,61^1
 ;;^DIST(.404,.00108,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,3,3.1)
 ;;=D Y^DICATTD8(1,3)
 ;;^DIST(.404,.00108,40,3,10)
 ;;=S:X DICATTVP=1,DDSSTACK=8
 ;;^DIST(.404,.00108,40,3,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,4,0)
 ;;=92.1^ORDER...^2^^ORDER2
 ;;^DIST(.404,.00108,40,4,2)
 ;;=3,70^4^3,61^1
 ;;^DIST(.404,.00108,40,4,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,4,3.1)
 ;;=D Y^DICATTD8(2,3)
 ;;^DIST(.404,.00108,40,4,10)
 ;;=S:X DICATTVP=2,DDSSTACK=8
 ;;^DIST(.404,.00108,40,4,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,5,0)
 ;;=93^VARIABLE-POINTER FILE #3^2
 ;;^DIST(.404,.00108,40,5,2)
 ;;=4,29^30^4,3
 ;;^DIST(.404,.00108,40,5,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,5,3.1)
 ;;=D Y^DICATTD8(3,1)
 ;;^DIST(.404,.00108,40,5,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,5,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00108,40,6,0)
 ;;=93.1^ORDER...^2^^ORDER3
 ;;^DIST(.404,.00108,40,6,2)
 ;;=4,70^4^4,61^1
 ;;^DIST(.404,.00108,40,6,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,6,3.1)
 ;;=D Y^DICATTD8(3,3)
 ;;^DIST(.404,.00108,40,6,10)
 ;;=S:X DICATTVP=3,DDSSTACK=8
 ;;^DIST(.404,.00108,40,6,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,7,0)
 ;;=94.1^ORDER...^2^^ORDER4
 ;;^DIST(.404,.00108,40,7,2)
 ;;=5,70^4^5,61^1
 ;;^DIST(.404,.00108,40,7,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,7,3.1)
 ;;=D Y^DICATTD8(4,3)
 ;;^DIST(.404,.00108,40,7,10)
 ;;=S:X DICATTVP=4,DDSSTACK=8
 ;;^DIST(.404,.00108,40,7,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,8,0)
 ;;=95.1^ORDER...^2^^ORDER5
 ;;^DIST(.404,.00108,40,8,2)
 ;;=6,70^4^6,61^1
 ;;^DIST(.404,.00108,40,8,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,8,3.1)
 ;;=D Y^DICATTD8(5,3)
 ;;^DIST(.404,.00108,40,8,10)
 ;;=S:X DICATTVP=5,DDSSTACK=8
 ;;^DIST(.404,.00108,40,8,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,9,0)
 ;;=96.1^ORDER...^2^^ORDER6
 ;;^DIST(.404,.00108,40,9,2)
 ;;=7,70^4^7,61^1
 ;;^DIST(.404,.00108,40,9,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,9,3.1)
 ;;=D Y^DICATTD8(6,3)
 ;;^DIST(.404,.00108,40,9,10)
 ;;=S:X DICATTVP=6,DDSSTACK=8
 ;;^DIST(.404,.00108,40,9,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,10,0)
 ;;=97.1^ORDER...^2^^ORDER7
 ;;^DIST(.404,.00108,40,10,2)
 ;;=8,70^4^8,61^1
 ;;^DIST(.404,.00108,40,10,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,10,3.1)
 ;;=D Y^DICATTD8(7,3)
 ;;^DIST(.404,.00108,40,10,10)
 ;;=S:X DICATTVP=7,DDSSTACK=8
 ;;^DIST(.404,.00108,40,10,20)
 ;;=N^^1:99:1
 ;;^DIST(.404,.00108,40,11,0)
 ;;=94^VARIABLE-POINTER FILE #4^2^^VP4
 ;;^DIST(.404,.00108,40,11,2)
 ;;=5,29^30^5,3
 ;;^DIST(.404,.00108,40,11,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,11,3.1)
 ;;=D Y^DICATTD8(4,1)
 ;;^DIST(.404,.00108,40,11,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,11,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00108,40,12,0)
 ;;=95^VARIABLE-POINTER FILE #5^2^^VP 5
 ;;^DIST(.404,.00108,40,12,2)
 ;;=6,29^30^6,3
 ;;^DIST(.404,.00108,40,12,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,12,3.1)
 ;;=D Y^DICATTD8(5,1)
 ;;^DIST(.404,.00108,40,12,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,12,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00108,40,13,0)
 ;;=96^VARIABLE-POINTER FILE #6^2^^VP 6
 ;;^DIST(.404,.00108,40,13,2)
 ;;=7,29^30^7,3
 ;;^DIST(.404,.00108,40,13,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,13,3.1)
 ;;=D Y^DICATTD8(6,1)
 ;;^DIST(.404,.00108,40,13,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,13,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00108,40,14,0)
 ;;=97^VARIABLE-POINTER FILE #7^2^^VP 7
 ;;^DIST(.404,.00108,40,14,2)
 ;;=8,29^30^8,3
 ;;^DIST(.404,.00108,40,14,3)
 ;;=!M
 ;;^DIST(.404,.00108,40,14,3.1)
 ;;=D Y^DICATTD8(7,1)
 ;;^DIST(.404,.00108,40,14,20)
 ;;=P^^1:EOFIZM
 ;;^DIST(.404,.00108,40,14,24)
 ;;=D DICS^DICATTD8
 ;;^DIST(.404,.00109,0)
 ;;=DICATT3^1
 ;;^DIST(.404,.00109,40,0)
 ;;=^.4044I^26^26
 ;;^DIST(.404,.00109,40,1,0)
 ;;=35^CODE^2^^CODE1
 ;;^DIST(.404,.00109,40,1,2)
 ;;=2,8^4^2,2
 ;;^DIST(.404,.00109,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,1,3.1)
 ;;=D Y^DICATTD3(1,1)

DINIT0F7
DINIT0F7 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;11:00 AM  4 Oct 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F8 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.00109,40,1,4)
 ;;=1
 ;;^DIST(.404,.00109,40,1,11)
 ;;=S:$G(DICATTSC)=3 DDACT="CL"
 ;;^DIST(.404,.00109,40,1,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,1,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,2,0)
 ;;=36^WILL STAND FOR^2^^MEANS1
 ;;^DIST(.404,.00109,40,2,2)
 ;;=2,30^30^2,14
 ;;^DIST(.404,.00109,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,2,3.1)
 ;;=D Y^DICATTD3(1,2)
 ;;^DIST(.404,.00109,40,2,4)
 ;;=1
 ;;^DIST(.404,.00109,40,2,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,2,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,3,0)
 ;;=37^CODE^2^^CODE2
 ;;^DIST(.404,.00109,40,3,2)
 ;;=3,8^4^3,2
 ;;^DIST(.404,.00109,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,3,3.1)
 ;;=D Y^DICATTD3(2,1)
 ;;^DIST(.404,.00109,40,3,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,3,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,4,0)
 ;;=38^WILL STAND FOR^2^^MEANS2
 ;;^DIST(.404,.00109,40,4,2)
 ;;=3,30^30^3,14
 ;;^DIST(.404,.00109,40,4,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,4,3.1)
 ;;=D Y^DICATTD3(2,2)
 ;;^DIST(.404,.00109,40,4,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,4,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,5,0)
 ;;=39^CODE^2^^CODE3
 ;;^DIST(.404,.00109,40,5,2)
 ;;=4,8^4^4,2
 ;;^DIST(.404,.00109,40,5,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,5,3.1)
 ;;=D Y^DICATTD3(3,1)
 ;;^DIST(.404,.00109,40,5,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,5,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,6,0)
 ;;=40^WILL STAND FOR^2^^MEANS3
 ;;^DIST(.404,.00109,40,6,2)
 ;;=4,30^30^4,14
 ;;^DIST(.404,.00109,40,6,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,6,3.1)
 ;;=D Y^DICATTD3(3,2)
 ;;^DIST(.404,.00109,40,6,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,6,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,7,0)
 ;;=41^CODE^2^^CODE4
 ;;^DIST(.404,.00109,40,7,2)
 ;;=5,8^4^5,2
 ;;^DIST(.404,.00109,40,7,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,7,3.1)
 ;;=D Y^DICATTD3(4,1)
 ;;^DIST(.404,.00109,40,7,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,7,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,8,0)
 ;;=42^WILL STAND FOR^2^^MEANS4
 ;;^DIST(.404,.00109,40,8,2)
 ;;=5,30^30^5,14
 ;;^DIST(.404,.00109,40,8,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,8,3.1)
 ;;=D Y^DICATTD3(4,2)
 ;;^DIST(.404,.00109,40,8,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,8,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,9,0)
 ;;=43^CODE^2^^CODE5
 ;;^DIST(.404,.00109,40,9,2)
 ;;=6,8^4^6,2
 ;;^DIST(.404,.00109,40,9,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,9,3.1)
 ;;=D Y^DICATTD3(5,1)
 ;;^DIST(.404,.00109,40,9,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,9,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,10,0)
 ;;=44^WILL STAND FOR^2^^MEANS5
 ;;^DIST(.404,.00109,40,10,2)
 ;;=6,30^30^6,14
 ;;^DIST(.404,.00109,40,10,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,10,3.1)
 ;;=D Y^DICATTD3(5,2)
 ;;^DIST(.404,.00109,40,10,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,10,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,11,0)
 ;;=45^CODE^2^^CODE6
 ;;^DIST(.404,.00109,40,11,2)
 ;;=7,8^4^7,2
 ;;^DIST(.404,.00109,40,11,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,11,3.1)
 ;;=D Y^DICATTD3(6,1)
 ;;^DIST(.404,.00109,40,11,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,11,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,12,0)
 ;;=46^WILL STAND FOR^2^^MEANS6
 ;;^DIST(.404,.00109,40,12,2)
 ;;=7,30^30^7,14
 ;;^DIST(.404,.00109,40,12,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,12,3.1)
 ;;=D Y^DICATTD3(6,2)
 ;;^DIST(.404,.00109,40,12,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,12,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,13,0)
 ;;=47^CODE^2^^CODE7
 ;;^DIST(.404,.00109,40,13,2)
 ;;=8,8^4^8,2
 ;;^DIST(.404,.00109,40,13,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,13,3.1)
 ;;=D Y^DICATTD3(7,1)
 ;;^DIST(.404,.00109,40,13,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,13,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,14,0)
 ;;=48^WILL STAND FOR^2^^MEANS7
 ;;^DIST(.404,.00109,40,14,2)
 ;;=8,30^30^8,14
 ;;^DIST(.404,.00109,40,14,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,14,3.1)
 ;;=D Y^DICATTD3(7,2)
 ;;^DIST(.404,.00109,40,14,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,14,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,15,0)
 ;;=49^CODE^2^^CODE8
 ;;^DIST(.404,.00109,40,15,2)
 ;;=9,8^4^9,2
 ;;^DIST(.404,.00109,40,15,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,15,3.1)
 ;;=D Y^DICATTD3(8,1)
 ;;^DIST(.404,.00109,40,15,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,15,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,16,0)
 ;;=50^WILL STAND FOR^2^^MEANS8
 ;;^DIST(.404,.00109,40,16,2)
 ;;=9,30^30^9,14
 ;;^DIST(.404,.00109,40,16,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,16,3.1)
 ;;=D Y^DICATTD3(8,2)
 ;;^DIST(.404,.00109,40,16,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,16,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,17,0)
 ;;=51^CODE^2^^CODE9
 ;;^DIST(.404,.00109,40,17,2)
 ;;=10,8^4^10,2
 ;;^DIST(.404,.00109,40,17,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,17,3.1)
 ;;=D Y^DICATTD3(9,1)
 ;;^DIST(.404,.00109,40,17,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,17,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,18,0)
 ;;=52^WILL STAND FOR^2^^MEANS9
 ;;^DIST(.404,.00109,40,18,2)
 ;;=10,30^30^10,14
 ;;^DIST(.404,.00109,40,18,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,18,3.1)
 ;;=D Y^DICATTD3(9,2)
 ;;^DIST(.404,.00109,40,18,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,18,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,19,0)
 ;;=53^CODE^2^^CODE10
 ;;^DIST(.404,.00109,40,19,2)
 ;;=11,8^4^11,2
 ;;^DIST(.404,.00109,40,19,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,19,3.1)
 ;;=D Y^DICATTD3(10,1)
 ;;^DIST(.404,.00109,40,19,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,19,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,20,0)
 ;;=54^WILL STAND FOR^2^^MEANS10
 ;;^DIST(.404,.00109,40,20,2)
 ;;=11,30^30^11,14
 ;;^DIST(.404,.00109,40,20,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,20,3.1)
 ;;=D Y^DICATTD3(10,2)
 ;;^DIST(.404,.00109,40,20,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,20,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,21,0)
 ;;=55^CODE^2^^CODE11
 ;;^DIST(.404,.00109,40,21,2)
 ;;=12,8^4^12,2
 ;;^DIST(.404,.00109,40,21,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,21,3.1)
 ;;=D Y^DICATTD3(11,1)
 ;;^DIST(.404,.00109,40,21,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,21,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,22,0)
 ;;=56^WILL STAND FOR^2^^MEANS11
 ;;^DIST(.404,.00109,40,22,2)
 ;;=12,30^30^12,14
 ;;^DIST(.404,.00109,40,22,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,22,3.1)
 ;;=D Y^DICATTD3(11,2)
 ;;^DIST(.404,.00109,40,22,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,22,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,23,0)
 ;;=57^CODE^2^^CODE12
 ;;^DIST(.404,.00109,40,23,2)
 ;;=13,8^4^13,2
 ;;^DIST(.404,.00109,40,23,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,23,3.1)
 ;;=D Y^DICATTD3(12,1)
 ;;^DIST(.404,.00109,40,23,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,23,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,24,0)
 ;;=58^WILL STAND FOR^2^^MEANS12
 ;;^DIST(.404,.00109,40,24,2)
 ;;=13,30^30^13,14

DINIT0F8
DINIT0F8 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;18AUG2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0F9 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.00109,40,24,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,24,3.1)
 ;;=D Y^DICATTD3(12,2)
 ;;^DIST(.404,.00109,40,24,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,24,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,25,0)
 ;;=59^CODE^2^^CODE13
 ;;^DIST(.404,.00109,40,25,2)
 ;;=14,8^4^14,2
 ;;^DIST(.404,.00109,40,25,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,25,3.1)
 ;;=D Y^DICATTD3(13,1)
 ;;^DIST(.404,.00109,40,25,20)
 ;;=F^^1:20
 ;;^DIST(.404,.00109,40,25,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.00109,40,26,0)
 ;;=60^WILL STAND FOR^2^^MEANS13
 ;;^DIST(.404,.00109,40,26,2)
 ;;=14,30^30^14,14
 ;;^DIST(.404,.00109,40,26,3)
 ;;=!M
 ;;^DIST(.404,.00109,40,26,3.1)
 ;;=D Y^DICATTD3(13,2)
 ;;^DIST(.404,.00109,40,26,20)
 ;;=F^^1:70
 ;;^DIST(.404,.00109,40,26,22)
 ;;=D C^DICATTD3
 ;;^DIST(.404,.0011,0)
 ;;=DICATTW1^1
 ;;^DIST(.404,.0011,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.0011,40,1,0)
 ;;=1^ ^2
 ;;^DIST(.404,.0011,40,1,2)
 ;;=1,4^1^1,1^1
 ;;^DIST(.404,.0011,40,1,11)
 ;;=S DDACT="CL"
 ;;^DIST(.404,.0011,40,1,20)
 ;;=F
 ;;^DIST(.404,.00111,0)
 ;;=DICATTW2^1
 ;;^DIST(.404,.00111,11)
 ;;=D WORD^DICATTD0(23)
 ;;^DIST(.404,.00111,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.00111,40,1,0)
 ;;=1^ ^1
 ;;^DIST(.404,.00111,40,1,2)
 ;;=1,4^1^1,1^1
 ;;^DIST(.404,.00111,40,1,11)
 ;;=S DDACT="CL"
 ;;^DIST(.404,.00111,40,1,20)
 ;;=F
 ;;^DIST(.404,.00112,0)
 ;;=DICATTM^1
 ;;^DIST(.404,.00112,40,0)
 ;;=^.4044I^3^2
 ;;^DIST(.404,.00112,40,2,0)
 ;;=16^SUBSCRIPT^2^^SUBSCRIPT
 ;;^DIST(.404,.00112,40,2,2)
 ;;=1,18^33^1,7
 ;;^DIST(.404,.00112,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00112,40,2,3.1)
 ;;=D SUBDEF^DICATTDM
 ;;^DIST(.404,.00112,40,2,4)
 ;;=1
 ;;^DIST(.404,.00112,40,2,11)
 ;;=D SUBHELP^DICATTDM
 ;;^DIST(.404,.00112,40,2,20)
 ;;=F^^1:33
 ;;^DIST(.404,.00112,40,2,22)
 ;;=K:X?1P.E!(X[" ")!(X[",")!(X[":")!(X[";")!(X["""")!(X["=")&(+X'=X) X I $D(X) N % S %=$$CHKSUB^DICATTDM(X) I '% K X D HLP^DDSUTL(%)
 ;;^DIST(.404,.00112,40,3,0)
 ;;=17^PIECE-POSITION^2^^PIECE
 ;;^DIST(.404,.00112,40,3,2)
 ;;=2,18^8^2,2
 ;;^DIST(.404,.00112,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00112,40,3,3.1)
 ;;=D PIECDEF^DICATTDM
 ;;^DIST(.404,.00112,40,3,4)
 ;;=1
 ;;^DIST(.404,.00112,40,3,11)
 ;;=D PIECHELP^DICATTDM
 ;;^DIST(.404,.00112,40,3,20)
 ;;=F^^1:8
 ;;^DIST(.404,.00112,40,3,22)
 ;;=N % S %=$$CHKPIEC^DICATTDM(X) I '% K X D HLP^DDSUTL(%)
 ;;^DIST(.404,.00113,0)
 ;;=DICATT9^1
 ;;^DIST(.404,.00113,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.00113,40,1,0)
 ;;=99^ARE YOU SURE YOU WANT TO DELETE THE ENTIRE FIELD^2^^DELETING
 ;;^DIST(.404,.00113,40,1,2)
 ;;=3,53^3^3,3
 ;;^DIST(.404,.00113,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00113,40,1,3.1)
 ;;=S Y="N"
 ;;^DIST(.404,.00113,40,1,12)
 ;;=D POST9^DICATTDK
 ;;^DIST(.404,.00113,40,1,20)
 ;;=Y
 ;;^DIST(.404,.00113,40,2,0)
 ;;=99.1^*****************************************************^1
 ;;^DIST(.404,.00113,40,2,2)
 ;;=^^2,3
 ;;^DIST(.404,.00113,40,3,0)
 ;;=99.2^*****************************************************^1
 ;;^DIST(.404,.00113,40,3,2)
 ;;=^^4,3
 ;;^DIST(.404,.00114,0)
 ;;=DICATTS^1
 ;;^DIST(.404,.00114,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.00114,40,1,0)
 ;;=76^SUBSCRIPT^2^^MUL SUBSCRIPT
 ;;^DIST(.404,.00114,40,1,2)
 ;;=2,26^33^2,15
 ;;^DIST(.404,.00114,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00114,40,1,3.1)
 ;;=S Y="" I DICATT4="" F Y=+$O(^DD(DICATTA,"GL","A"),-1):1 Q:'$D(^(Y))
 ;;^DIST(.404,.00114,40,1,4)
 ;;=1
 ;;^DIST(.404,.00114,40,1,11)
 ;;=D SUBHELP^DICATTDM
 ;;^DIST(.404,.00114,40,1,20)
 ;;=F^^1:33
 ;;^DIST(.404,.00114,40,1,22)
 ;;=K:X?1P.E!(X[",")!(X[":")!(X["""")!(X["=")&(+X'=X) X I $D(X) N % S %=$$CHKSUB^DICATTDM(X) I '% K X D HLP^DDSUTL(%)
 ;;^DIST(.404,.00114,40,1,24)
 ;;=D SUBHELP^DICATTDM
 ;;^DIST(.404,.00114,40,2,0)
 ;;=76.1^SUB-DICTIONARY NUMBER^2
 ;;^DIST(.404,.00114,40,2,2)
 ;;=3,26^22^3,3
 ;;^DIST(.404,.00114,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00114,40,2,3.1)
 ;;=S Y="" I DICATT4=Y D SUBDIC^DICATTD5
 ;;^DIST(.404,.00114,40,2,4)
 ;;=1
 ;;^DIST(.404,.00114,40,2,11)
 ;;=D HLP^DDSUTL("^DD number must be between "_DICATTA_" and "_(DICATTA\1+1)_" and not already used")
 ;;^DIST(.404,.00114,40,2,20)
 ;;=N^^0:9999999999999:9
 ;;^DIST(.404,.00114,40,2,22)
 ;;=D CHKDIC^DICATTD5
 ;;^DIST(.404,.00115,0)
 ;;=DICATTVP^1
 ;;^DIST(.404,.00115,40,0)
 ;;=^.4044I^6^6
 ;;^DIST(.404,.00115,40,1,0)
 ;;=1^MESSAGE^2
 ;;^DIST(.404,.00115,40,1,2)
 ;;=2,10^28^2,1
 ;;^DIST(.404,.00115,40,1,4)
 ;;=0
 ;;^DIST(.404,.00115,40,1,20)
 ;;=F^^1:30
 ;;^DIST(.404,.00115,40,2,0)
 ;;=4^SCREEN^2
 ;;^DIST(.404,.00115,40,2,2)
 ;;=5,9^60^5,1
 ;;^DIST(.404,.00115,40,2,10)
 ;;=D UNED^DDSUTL(5,,,X="","")
 ;;^DIST(.404,.00115,40,2,20)
 ;;=DD^^.12,1
 ;;^DIST(.404,.00115,40,2,21,0)
 ;;=^^3^3^2981127
 ;;^DIST(.404,.00115,40,2,21,1,0)
 ;;=Enter (optionally) a MUMPS statement which begins with 'S DIC("S")=' and
 ;;^DIST(.404,.00115,40,2,21,2,0)
 ;;=contains code which sets $T to "1" for selectable Entries.  Entry numbers
 ;;^DIST(.404,.00115,40,2,21,3,0)
 ;;=will be in the variable 'Y' when evaluation by DIC("S") takes place.
 ;;^DIST(.404,.00115,40,3,0)
 ;;=3^SHOULD USER BE ALLOWED TO ADD A NEW ENTRY^2
 ;;^DIST(.404,.00115,40,3,2)
 ;;=4,44^3^4,1
 ;;^DIST(.404,.00115,40,3,20)
 ;;=S^^y:YES;n:NO
 ;;^DIST(.404,.00115,40,4,0)
 ;;=5^EXPLANATION OF SCREEN^2
 ;;^DIST(.404,.00115,40,4,2)
 ;;=6,24^45^6,1
 ;;^DIST(.404,.00115,40,4,20)
 ;;=F^^1:240
 ;;^DIST(.404,.00115,40,5,0)
 ;;=2^PREFIX^2
 ;;^DIST(.404,.00115,40,5,2)
 ;;=3,9^10^3,1
 ;;^DIST(.404,.00115,40,5,4)
 ;;=0
 ;;^DIST(.404,.00115,40,5,20)
 ;;=F^^1:10
 ;;^DIST(.404,.00115,40,5,22)
 ;;=I X["." K X
 ;;^DIST(.404,.00115,40,6,0)
 ;;=.5^^4
 ;;^DIST(.404,.00115,40,6,2)
 ;;=1,20^30
 ;;^DIST(.404,.00115,40,6,30)
 ;;=S Y="VARIABLE-POINTER #"_$G(DICATTVP)
 ;;^DIST(.404,.00116,0)
 ;;=DICATT MUL^1
 ;;^DIST(.404,.00116,40,0)
 ;;=^.4044I^7^7
 ;;^DIST(.404,.00116,40,1,0)
 ;;=1^MULTIPLE-FIELD LABEL^2^^MULTIPLE LABEL
 ;;^DIST(.404,.00116,40,1,2)
 ;;=3,23^30^3,1
 ;;^DIST(.404,.00116,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00116,40,1,3.1)
 ;;=S Y=$P($G(^DD(DICATTA,DICATTF,0)),U)
 ;;^DIST(.404,.00116,40,1,10)
 ;;=I X="" S DDSSTACK=9
 ;;^DIST(.404,.00116,40,1,20)
 ;;=DD^^0,.01
 ;;^DIST(.404,.00116,40,2,0)
 ;;=5^READ ACCESS^2^^MULTIPLE READ ACCESS
 ;;^DIST(.404,.00116,40,2,2)
 ;;=4,23^13^4,10
 ;;^DIST(.404,.00116,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00116,40,2,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,8))
 ;;^DIST(.404,.00116,40,2,11)
 ;;=I $G(DICATTDK) S DDACT="EX"
 ;;^DIST(.404,.00116,40,2,20)
 ;;=DD^^0,8
 ;;^DIST(.404,.00116,40,3,0)
 ;;=7^WRITE ACCESS^2^^MULTIPLE WRITE ACCESS
 ;;^DIST(.404,.00116,40,3,2)
 ;;=5,23^13^5,9
 ;;^DIST(.404,.00116,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00116,40,3,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,9))
 ;;^DIST(.404,.00116,40,3,20)
 ;;=DD^^0,9
 ;;^DIST(.404,.00116,40,4,0)
 ;;=8^SOURCE^2^^MULTIPLE SOURCE
 ;;^DIST(.404,.00116,40,6,0)
 ;;=11^DESCRIPTION...^2
 ;;^DIST(.404,.00116,40,6,2)
 ;;=7,17^1^7,2^1
 ;;^DIST(.404,.00116,40,6,10)
 ;;=S DDSSTACK=1.1
 ;;^DIST(.404,.00116,40,6,20)
 ;;=F^^1:1
 ;;^DIST(.404,.00116,40,7,0)
 ;;=12^TECHNICAL DESCRIPTION...^2
 ;;^DIST(.404,.00116,40,7,2)
 ;;=7,49^1^7,24^1
 ;;^DIST(.404,.00116,40,7,10)
 ;;=S DDSSTACK=1.2
 ;;^DIST(.404,.00116,40,7,20)
 ;;=F^^1:1

DINIT0F9
DINIT0F9 ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;17DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013; TAG 'ENTRY+172' CHANGED TO REMEMBER LANGUAGE OF PRINT TEMPLATE HEADER
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FA S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.00116,40,4,2)
 ;;=6,23^54^6,15
 ;;^DIST(.404,.00116,40,4,3)
 ;;=!M
 ;;^DIST(.404,.00116,40,4,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,10))
 ;;^DIST(.404,.00116,40,4,20)
 ;;=DD^^0,10
 ;;^DIST(.404,.00116,40,5,0)
 ;;=.5^ ^4^^MULTIPLE FIELD NUMBER
 ;;^DIST(.404,.00116,40,5,2)
 ;;=1,2^77^1,1^1
 ;;^DIST(.404,.00116,40,5,30)
 ;;=D NUMBER^DICATTD
 ;;^DIST(.404,.00117,0)
 ;;=DICATTMUL^1
 ;;^DIST(.404,.00117,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.00117,40,1,0)
 ;;=1^SHOULD USER SEE AN "ADDING A NEW ENTRY" MESSAGE^2
 ;;^DIST(.404,.00117,40,1,2)
 ;;=2,52^3^2,3
 ;;^DIST(.404,.00117,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00117,40,1,3.1)
 ;;=D LAYGODEF^DICATTDE
 ;;^DIST(.404,.00117,40,1,20)
 ;;=Y
 ;;^DIST(.404,.00117,40,2,0)
 ;;=2^HAVING ENTERED OR EDITED ONE MULTIPLE, SHOULD USER BE ASKED ANOTHER^2
 ;;^DIST(.404,.00117,40,2,2)
 ;;=3,72^3^3,3
 ;;^DIST(.404,.00117,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00117,40,2,3.1)
 ;;=S Y=$E("NY",$G(DICATT2)["M"+1)
 ;;^DIST(.404,.00117,40,2,20)
 ;;=Y
 ;;^DIST(.404,.00118,0)
 ;;=DICATT SCREEN^1
 ;;^DIST(.404,.00118,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.00118,40,1,0)
 ;;=65^SHOULD ENTRIES BE SCREENED^2
 ;;^DIST(.404,.00118,40,1,2)
 ;;=2,31^3^2,3
 ;;^DIST(.404,.00118,40,1,3)
 ;;=!M
 ;;^DIST(.404,.00118,40,1,3.1)
 ;;=S Y=$E("NY",$G(^DD(DICATTA,DICATTF,12.1))]""+1)
 ;;^DIST(.404,.00118,40,1,12)
 ;;=D UNED^DDSUTL(66,,,'X),UNED^DDSUTL(67,,,'X) I 'X D PUT^DDSVALF(66,,,""),PUT^DDSVALF(67,,,"")
 ;;^DIST(.404,.00118,40,1,20)
 ;;=Y
 ;;^DIST(.404,.00118,40,1,21,0)
 ;;=^^2^2^2981215
 ;;^DIST(.404,.00118,40,1,21,1,0)
 ;;=Answer YES if there is a condition which should prohibit
 ;;^DIST(.404,.00118,40,1,21,2,0)
 ;;=the selection of all choices at all times.
 ;;^DIST(.404,.00118,40,2,0)
 ;;=66^MUMPS CODE THAT WILL SET DIC("S")^2
 ;;^DIST(.404,.00118,40,2,2)
 ;;=4,3^72^3,3
 ;;^DIST(.404,.00118,40,2,3)
 ;;=!M
 ;;^DIST(.404,.00118,40,2,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,12.1))
 ;;^DIST(.404,.00118,40,2,10)
 ;;=D REQ^DDSUTL(67,,,X]"")
 ;;^DIST(.404,.00118,40,2,20)
 ;;=F^U
 ;;^DIST(.404,.00118,40,2,21,0)
 ;;=^^3^3^2981215
 ;;^DIST(.404,.00118,40,2,21,1,0)
 ;;=Enter a MUMPS statement which begins with 'S DIC("S")=' and contains code
 ;;^DIST(.404,.00118,40,2,21,2,0)
 ;;=to set $T.  When the DIC("S") is executed, the variable 'Y' holds internal
 ;;^DIST(.404,.00118,40,2,21,3,0)
 ;;=code being screened.
 ;;^DIST(.404,.00118,40,2,22)
 ;;=D ^DIM
 ;;^DIST(.404,.00118,40,3,0)
 ;;=67^EXPLANATION OF SCREEN^2
 ;;^DIST(.404,.00118,40,3,2)
 ;;=6,3^72^5,3
 ;;^DIST(.404,.00118,40,3,3)
 ;;=!M
 ;;^DIST(.404,.00118,40,3,3.1)
 ;;=S Y=$G(^DD(DICATTA,DICATTF,12))
 ;;^DIST(.404,.00118,40,3,20)
 ;;=F^^1:245
 ;;^DIST(.404,.00118,40,3,22)
 ;;=K:X?.P X
 ;;^DIST(.404,.10011,0)
 ;;=DIPTED^.4
 ;;^DIST(.404,.10011,40,0)
 ;;=^.4044I^14^12
 ;;^DIST(.404,.10011,40,1,0)
 ;;=1^TEMPLATE NAME^3
 ;;^DIST(.404,.10011,40,1,1)
 ;;=.01
 ;;^DIST(.404,.10011,40,1,2)
 ;;=1,16^30^1,1
 ;;^DIST(.404,.10011,40,2,0)
 ;;=3^DATE LAST MODIFIED^3
 ;;^DIST(.404,.10011,40,2,1)
 ;;=2
 ;;^DIST(.404,.10011,40,2,2)
 ;;=4,28^17^4,8
 ;;^DIST(.404,.10011,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.10011,40,3,0)
 ;;=4^DATE LAST USED^3
 ;;^DIST(.404,.10011,40,3,1)
 ;;=7
 ;;^DIST(.404,.10011,40,3,2)
 ;;=5,28^11^5,12
 ;;^DIST(.404,.10011,40,3,4)
 ;;=^^^1
 ;;^DIST(.404,.10011,40,4,0)
 ;;=6^READ ACCESS^3
 ;;^DIST(.404,.10011,40,4,1)
 ;;=3
 ;;^DIST(.404,.10011,40,4,2)
 ;;=6,28^13^6,15
 ;;^DIST(.404,.10011,40,5,0)
 ;;=7^WRITE ACCESS^3
 ;;^DIST(.404,.10011,40,5,1)
 ;;=6
 ;;^DIST(.404,.10011,40,5,2)
 ;;=7,28^13^7,14
 ;;^DIST(.404,.10011,40,6,0)
 ;;=8^USER #^3
 ;;^DIST(.404,.10011,40,6,1)
 ;;=5
 ;;^DIST(.404,.10011,40,6,2)
 ;;=8,28^9^8,20
 ;;^DIST(.404,.10011,40,7,0)
 ;;=9^DESCRIPTION...^3
 ;;^DIST(.404,.10011,40,7,1)
 ;;=10
 ;;^DIST(.404,.10011,40,7,2)
 ;;=10,28^1^10,13^1
 ;;^DIST(.404,.10011,40,8,0)
 ;;=11^SUB-HEADER SUPPRESSED^3
 ;;^DIST(.404,.10011,40,8,1)
 ;;=707
 ;;^DIST(.404,.10011,40,8,2)
 ;;=14,28^3^14,5
 ;;^DIST(.404,.10011,40,10,0)
 ;;=2^TEMPLATE TYPE^3
 ;;^DIST(.404,.10011,40,10,1)
 ;;=8
 ;;^DIST(.404,.10011,40,10,2)
 ;;=1,71^9^1,56
 ;;^DIST(.404,.10011,40,10,4)
 ;;=^^^1
 ;;^DIST(.404,.10011,40,12,0)
 ;;=10^HEADER^2
 ;;^DIST(.404,.10011,40,12,2)
 ;;=13,4^76^12,4
 ;;^DIST(.404,.10011,40,12,3)
 ;;=!M
 ;;^DIST(.404,.10011,40,12,3.1)
 ;;=S Y=$G(^DIPT(DA,"H"))
 ;;^DIST(.404,.10011,40,12,20)
 ;;=F^^F
 ;;^DIST(.404,.10011,40,12,22)
 ;;=I '$$DHD^DIP3(X,+$P($G(^DIPT(DA,0)),U,4),0) K X
 ;;^DIST(.404,.10011,40,12,23)
 ;;=S ^DIPT(DA,"H")=$S(DDSEXT="":"@",1:DDSEXT) I $G(DUZ("LANG")) S ^("HLANG")=DUZ("LANG")
 ;;^DIST(.404,.10011,40,13,0)
 ;;=5^^4
 ;;^DIST(.404,.10011,40,13,2)
 ;;=2,20^44
 ;;^DIST(.404,.10011,40,13,30)
 ;;=S Y=$G(^DIPT(DA,"ROU")),Y=$S(Y]"":"(Compiled as '"_Y_"' routine)",1:"(Not Compiled)")
 ;;^DIST(.404,.10011,40,14,0)
 ;;=12^(Print Fields on Next Page...)^1^^EDIT FIELD
 ;;^DIST(.404,.10011,40,14,2)
 ;;=^^16,20
 ;;^DIST(.404,.10012,0)
 ;;=DIPTED2^.4
 ;;^DIST(.404,.10012,11)
 ;;=D EDIT^DIPTED(DA)
 ;;^DIST(.404,.10012,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.10012,40,1,0)
 ;;=1^ ^1
 ;;^DIST(.404,.10012,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.110101,0)
 ;;=DIKC EDIT MAIN^.11
 ;;^DIST(.404,.110101,40,0)
 ;;=^.4044I^14^11
 ;;^DIST(.404,.110101,40,1,0)
 ;;=1^File^3
 ;;^DIST(.404,.110101,40,1,1)
 ;;=.01
 ;;^DIST(.404,.110101,40,1,2)
 ;;=1,15^20^1,9
 ;;^DIST(.404,.110101,40,1,13)
 ;;=D BLDLOG^DIKCFORM(DA)
 ;;^DIST(.404,.110101,40,1,14)
 ;;=D VALFILE^DIKCFORM
 ;;^DIST(.404,.110101,40,2,0)
 ;;=3^Index Name^3
 ;;^DIST(.404,.110101,40,2,1)
 ;;=.02
 ;;^DIST(.404,.110101,40,2,2)
 ;;=2,15^30^2,3
 ;;^DIST(.404,.110101,40,2,13)
 ;;=D NAMECHG^DIKCFORM
 ;;^DIST(.404,.110101,40,2,14)
 ;;=D NAMEVAL^DIKCFORM
 ;;^DIST(.404,.110101,40,3,0)
 ;;=5^Short Description^3
 ;;^DIST(.404,.110101,40,3,1)
 ;;=.11
 ;;^DIST(.404,.110101,40,3,2)
 ;;=4,20^60^4,1
 ;;^DIST(.404,.110101,40,4,0)
 ;;=6^Description (wp)^3
 ;;^DIST(.404,.110101,40,4,1)
 ;;=.1
 ;;^DIST(.404,.110101,40,4,2)
 ;;=5,20^1^5,2
 ;;^DIST(.404,.110101,40,5,0)
 ;;=8^Type^3
 ;;^DIST(.404,.110101,40,5,1)
 ;;=.2
 ;;^DIST(.404,.110101,40,5,2)
 ;;=7,15^8^7,9
 ;;^DIST(.404,.110101,40,5,13)
 ;;=D TYPECHG^DIKCFORM
 ;;^DIST(.404,.110101,40,5,14)
 ;;=D TYPEVAL^DIKCFORM
 ;;^DIST(.404,.110101,40,7,0)
 ;;=10^Execution^3
 ;;^DIST(.404,.110101,40,7,1)
 ;;=.4
 ;;^DIST(.404,.110101,40,7,2)
 ;;=10,15^6^10,4
 ;;^DIST(.404,.110101,40,8,0)
 ;;=9^Activity^3
 ;;^DIST(.404,.110101,40,8,1)
 ;;=.41
 ;;^DIST(.404,.110101,40,8,2)
 ;;=9,15^5^9,5
 ;;^DIST(.404,.110101,40,9,0)
 ;;=11^Use^3
 ;;^DIST(.404,.110101,40,9,1)
 ;;=.42
 ;;^DIST(.404,.110101,40,9,2)
 ;;=12,15^16^12,10
 ;;^DIST(.404,.110101,40,9,14)
 ;;=D USEVAL^DIKCFORM
 ;;^DIST(.404,.110101,40,666,0)
 ;;=666^Do Not ReIndex^3
 ;;^DIST(.404,.110101,40,666,1)
 ;;=666
 ;;^DIST(.404,.110101,40,666,2)
 ;;=14,26^22^14,10

DINIT0FA
DINIT0FA ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;8:28 AM  18 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FB S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.110101,40,10,0)
 ;;=2^Root File^3
 ;;^DIST(.404,.110101,40,10,1)
 ;;=.51
 ;;^DIST(.404,.110101,40,10,2)
 ;;=1,60^20^1,49
 ;;^DIST(.404,.110101,40,10,4)
 ;;=^^^1
 ;;^DIST(.404,.110101,40,11,0)
 ;;=4^Root Type^3
 ;;^DIST(.404,.110101,40,11,1)
 ;;=.5
 ;;^DIST(.404,.110101,40,11,2)
 ;;=2,60^16^2,49
 ;;^DIST(.404,.110101,40,11,4)
 ;;=^^^1
 ;;^DIST(.404,.110101,40,14,0)
 ;;=7^!M^1
 ;;^DIST(.404,.110101,40,14,.1)
 ;;=N WPROOT S WPROOT=$$GET^DDSVAL(.11,.DA,.1),Y=$S(WPROOT]"":$G(@WPROOT@(1,0)),1:""),Y=$S(Y]"":"["_$E(Y,1,56)_"]",1:"(empty)")
 ;;^DIST(.404,.110101,40,14,2)
 ;;=^^5,23
 ;;^DIST(.404,.110102,0)
 ;;=DIKC EDIT HDR 1^.11
 ;;^DIST(.404,.110102,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.110102,40,1,0)
 ;;=1^EDIT AN INDEX^1
 ;;^DIST(.404,.110102,40,1,2)
 ;;=^^1,34
 ;;^DIST(.404,.110102,40,2,0)
 ;;=2^Number^4
 ;;^DIST(.404,.110102,40,2,2)
 ;;=1,9^15^1,1
 ;;^DIST(.404,.110102,40,2,30)
 ;;=S Y=DA
 ;;^DIST(.404,.110102,40,3,0)
 ;;=3^Page 1 of 2^1
 ;;^DIST(.404,.110102,40,3,2)
 ;;=^^1,69
 ;;^DIST(.404,.110102,40,4,0)
 ;;=4^-------------------------------------------------------------------------------^1
 ;;^DIST(.404,.110102,40,4,2)
 ;;=^^2,1
 ;;^DIST(.404,.110103,0)
 ;;=DIKC EDIT LOGIC^.11
 ;;^DIST(.404,.110103,40,0)
 ;;=^.4044I^28^5
 ;;^DIST(.404,.110103,40,1,0)
 ;;=1^Set Logic^3
 ;;^DIST(.404,.110103,40,1,1)
 ;;=1.1
 ;;^DIST(.404,.110103,40,1,2)
 ;;=3,13^67^3,2
 ;;^DIST(.404,.110103,40,1,14)
 ;;=D VALLOG^DIKCFORM
 ;;^DIST(.404,.110103,40,2,0)
 ;;=2^Kill Logic^3
 ;;^DIST(.404,.110103,40,2,1)
 ;;=2.1
 ;;^DIST(.404,.110103,40,2,2)
 ;;=4,13^67^4,1
 ;;^DIST(.404,.110103,40,2,14)
 ;;=D VALLOG^DIKCFORM
 ;;^DIST(.404,.110103,40,18,0)
 ;;=3^Whole Kill^3
 ;;^DIST(.404,.110103,40,18,1)
 ;;=2.5
 ;;^DIST(.404,.110103,40,18,2)
 ;;=5,13^67^5,1
 ;;^DIST(.404,.110103,40,18,14)
 ;;=D VALLOG^DIKCFORM
 ;;^DIST(.404,.110103,40,27,0)
 ;;=8^Set Condition^3
 ;;^DIST(.404,.110103,40,27,1)
 ;;=1.4
 ;;^DIST(.404,.110103,40,27,2)
 ;;=7,17^63^7,2
 ;;^DIST(.404,.110103,40,27,14)
 ;;=I $G(DUZ(0))'="@" S DDSERROR=1 D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit the Set Condition.")
 ;;^DIST(.404,.110103,40,28,0)
 ;;=9^Kill Condition^3
 ;;^DIST(.404,.110103,40,28,1)
 ;;=2.4
 ;;^DIST(.404,.110103,40,28,2)
 ;;=8,17^63^8,1
 ;;^DIST(.404,.110103,40,28,14)
 ;;=I $G(DUZ(0))'="@" S DDSERROR=1 D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit the Kill Condition.")
 ;;^DIST(.404,.110104,0)
 ;;=DIKC EDIT CRV^.114
 ;;^DIST(.404,.110104,40,0)
 ;;=^.4044I^5^5
 ;;^DIST(.404,.110104,40,1,0)
 ;;=1^^3^^ORDER
 ;;^DIST(.404,.110104,40,1,1)
 ;;=.01
 ;;^DIST(.404,.110104,40,1,2)
 ;;=1,3^3
 ;;^DIST(.404,.110104,40,1,10)
 ;;=S DDSSTACK=$S($$GET^DDSVAL(.114,.DA,1)="F":2.1,1:2.2)
 ;;^DIST(.404,.110104,40,1,13)
 ;;=D:DDSOLD'="" BLDLOG^DIKCFORM(DA(1))
 ;;^DIST(.404,.110104,40,2,0)
 ;;=2^^3
 ;;^DIST(.404,.110104,40,2,1)
 ;;=.5
 ;;^DIST(.404,.110104,40,2,2)
 ;;=1,12^3
 ;;^DIST(.404,.110104,40,2,13)
 ;;=D BLDLOG^DIKCFORM(DA(1))
 ;;^DIST(.404,.110104,40,3,0)
 ;;=3^^3
 ;;^DIST(.404,.110104,40,3,1)
 ;;=1
 ;;^DIST(.404,.110104,40,3,2)
 ;;=1,19^8
 ;;^DIST(.404,.110104,40,3,10)
 ;;=S:X'=DDSOLD DDSSTACK=$S(X="F":2.1,1:2.2)
 ;;^DIST(.404,.110104,40,3,13)
 ;;=D CRVTYPE^DIKCFORM
 ;;^DIST(.404,.110104,40,4,0)
 ;;=5^^4
 ;;^DIST(.404,.110104,40,4,2)
 ;;=1,36^43
 ;;^DIST(.404,.110104,40,4,30)
 ;;=N FIL,FLD,TYP S TYP={TYPE OF VALUE;I} S:TYP="F" FIL=+{FILE},FLD=+{FIELD},Y=$S('FIL!'FLD:"",$P($G(^DD(FIL,FLD,0)),U)="":"",1:$P(^(0),U)_" (#"_FLD_")") S:TYP="C" Y={COMPUTED CODE} S:$L($G(Y))>43 Y=$E(Y,1,40)_"..."
 ;;^DIST(.404,.110104,40,5,0)
 ;;=4^^3
 ;;^DIST(.404,.110104,40,5,1)
 ;;=6
 ;;^DIST(.404,.110104,40,5,2)
 ;;=1,29^3
 ;;^DIST(.404,.110104,40,5,13)
 ;;=D:$$GET^DDSVAL(.114,.DA,.5) BLDLOG^DIKCFORM(DA(1))
 ;;^DIST(.404,.110105,0)
 ;;=DIKC EDIT CRV HDR^.11
 ;;^DIST(.404,.110105,40,0)
 ;;=^.4044I^12^11
 ;;^DIST(.404,.110105,40,1,0)
 ;;=1^CROSS-REFERENCE VALUES:^1
 ;;^DIST(.404,.110105,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.110105,40,3,0)
 ;;=2^Order...^1
 ;;^DIST(.404,.110105,40,3,2)
 ;;=^^2,2
 ;;^DIST(.404,.110105,40,4,0)
 ;;=7^--------^1
 ;;^DIST(.404,.110105,40,4,2)
 ;;=^^3,2
 ;;^DIST(.404,.110105,40,5,0)
 ;;=3^Subscr^1
 ;;^DIST(.404,.110105,40,5,2)
 ;;=^^2,12
 ;;^DIST(.404,.110105,40,6,0)
 ;;=8^------^1
 ;;^DIST(.404,.110105,40,6,2)
 ;;=^^3,12
 ;;^DIST(.404,.110105,40,7,0)
 ;;=4^Type^1
 ;;^DIST(.404,.110105,40,7,2)
 ;;=^^2,20
 ;;^DIST(.404,.110105,40,8,0)
 ;;=9^----^1
 ;;^DIST(.404,.110105,40,8,2)
 ;;=^^3,20
 ;;^DIST(.404,.110105,40,9,0)
 ;;=6^Field or Computed Expression^1
 ;;^DIST(.404,.110105,40,9,2)
 ;;=^^2,37
 ;;^DIST(.404,.110105,40,10,0)
 ;;=11^-------------------------------------^1
 ;;^DIST(.404,.110105,40,10,2)
 ;;=^^3,37
 ;;^DIST(.404,.110105,40,11,0)
 ;;=5^Length^1
 ;;^DIST(.404,.110105,40,11,2)
 ;;=^^2,29
 ;;^DIST(.404,.110105,40,12,0)
 ;;=10^------^1
 ;;^DIST(.404,.110105,40,12,2)
 ;;=^^3,29
 ;;^DIST(.404,.110106,0)
 ;;=DIKC EDIT HDR 2^.11
 ;;^DIST(.404,.110106,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.110106,40,1,0)
 ;;=1^Number^4
 ;;^DIST(.404,.110106,40,1,2)
 ;;=1,9^15^1,1
 ;;^DIST(.404,.110106,40,1,30)
 ;;=S Y=DA
 ;;^DIST(.404,.110106,40,2,0)
 ;;=2^EDIT AN INDEX^1
 ;;^DIST(.404,.110106,40,2,2)
 ;;=^^1,34
 ;;^DIST(.404,.110106,40,3,0)
 ;;=3^Page 2 of 2^1
 ;;^DIST(.404,.110106,40,3,2)
 ;;=^^1,69
 ;;^DIST(.404,.110106,40,4,0)
 ;;=4^-------------------------------------------------------------------------------^1
 ;;^DIST(.404,.110106,40,4,2)
 ;;=^^2,1
 ;;^DIST(.404,.110107,0)
 ;;=DIKC EDIT FIELD CRV^.114
 ;;^DIST(.404,.110107,40,0)
 ;;=^.4044I^12^12
 ;;^DIST(.404,.110107,40,1,0)
 ;;=1^ Field-Type Cross Reference Value ^1
 ;;^DIST(.404,.110107,40,1,2)
 ;;=^^1,23
 ;;^DIST(.404,.110107,40,2,0)
 ;;=2^Order Number^3
 ;;^DIST(.404,.110107,40,2,1)
 ;;=.01
 ;;^DIST(.404,.110107,40,2,2)
 ;;=3,18^3^3,4
 ;;^DIST(.404,.110107,40,2,11)
 ;;=I $G(DIKCPG21),$$GET^DDSVAL(DIE,.DA,3)="" S DDSBR="FIELD" K DIKCPG21
 ;;^DIST(.404,.110107,40,2,13)
 ;;=S:$$GET^DDSVAL(.114,.DA,.5) DIKCCRV=1
 ;;^DIST(.404,.110107,40,3,0)
 ;;=3^Subscript Number^3
 ;;^DIST(.404,.110107,40,3,1)
 ;;=.5
 ;;^DIST(.404,.110107,40,3,2)
 ;;=3,58^3^3,40
 ;;^DIST(.404,.110107,40,3,3)
 ;;=!M
 ;;^DIST(.404,.110107,40,3,3.1)
 ;;=S Y=$S($$GET^DDSVAL(.11,DA(1),.2)="R":$$GET^DDSVAL(.114,.DA,.01),1:"")
 ;;^DIST(.404,.110107,40,3,13)
 ;;=I X=""!(DDSOLD="") S DIKCCRV=1 D:X="" PUT^DDSVAL(.114,.DA,6) I DDSOLD="" N DIKCTYPE S DIKCTYPE=$P($G(^DD(+$$GET^DDSVAL(.114,.DA,2),+$$GET^DDSVAL(.114,.DA,3),0)),U,2) D:DIKCTYPE["F"!(DIKCTYPE["K") PUT^DDSVAL(.114,.DA,6,30)
 ;;^DIST(.404,.110107,40,4,0)
 ;;=10^Transform for Storage^3
 ;;^DIST(.404,.110107,40,4,1)
 ;;=5
 ;;^DIST(.404,.110107,40,4,2)
 ;;=9,25^53^9,2
 ;;^DIST(.404,.110107,40,4,13)
 ;;=D TRANS^DIKCFORM

DINIT0FB
DINIT0FB ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;8:34 AM  18 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FC S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.110107,40,4,14)
 ;;=I $G(DUZ(0))'="@" S DDSERROR=1 D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit the Transform for Storage.")
 ;;^DIST(.404,.110107,40,5,0)
 ;;=7^Maximum Length^3
 ;;^DIST(.404,.110107,40,5,1)
 ;;=6
 ;;^DIST(.404,.110107,40,5,2)
 ;;=7,18^3^7,2
 ;;^DIST(.404,.110107,40,5,13)
 ;;=S:$$GET^DDSVAL(.114,.DA,.5) DIKCCRV=1
 ;;^DIST(.404,.110107,40,6,0)
 ;;=8^Collation^3
 ;;^DIST(.404,.110107,40,6,1)
 ;;=7
 ;;^DIST(.404,.110107,40,6,2)
 ;;=7,58^9^7,47
 ;;^DIST(.404,.110107,40,6,3)
 ;;=forwards
 ;;^DIST(.404,.110107,40,7,0)
 ;;=9^Lookup Prompt^3
 ;;^DIST(.404,.110107,40,7,1)
 ;;=8
 ;;^DIST(.404,.110107,40,7,2)
 ;;=8,18^30^8,3
 ;;^DIST(.404,.110107,40,8,0)
 ;;=5^File^3
 ;;^DIST(.404,.110107,40,8,1)
 ;;=2
 ;;^DIST(.404,.110107,40,8,2)
 ;;=4,58^20^4,52
 ;;^DIST(.404,.110107,40,8,3)
 ;;=!M
 ;;^DIST(.404,.110107,40,8,3.1)
 ;;=S Y=$$GET^DDSVAL(.11,DA(1),.51)
 ;;^DIST(.404,.110107,40,8,4)
 ;;=1^^^1
 ;;^DIST(.404,.110107,40,8,14)
 ;;=N RF S RF=$$GET^DDSVAL(.11,DA(1),.51) I X'=RF S DDSERROR=1 D HLP^DDSUTL("This File number must equal the Root File number: "_RF_".")
 ;;^DIST(.404,.110107,40,9,0)
 ;;=4^Field^3^^FIELD
 ;;^DIST(.404,.110107,40,9,1)
 ;;=3
 ;;^DIST(.404,.110107,40,9,2)
 ;;=4,18^20^4,11
 ;;^DIST(.404,.110107,40,9,4)
 ;;=1
 ;;^DIST(.404,.110107,40,9,13)
 ;;=S:X=""!(DDSOLD="") DIKCCRV=1 I $$GET^DDSVAL(.114,.DA,.5) N DIKCTYPE S DIKCTYPE=$P($G(^DD($$GET^DDSVAL(.114,.DA,2),+X,0)),U,2) D PUT^DDSVAL(.114,.DA,6,$S(DIKCTYPE["F"!(DIKCTYPE["K"):30,1:""),"","I")
 ;;^DIST(.404,.110107,40,10,0)
 ;;=6^Field Name^4
 ;;^DIST(.404,.110107,40,10,2)
 ;;=5,18^60^5,6
 ;;^DIST(.404,.110107,40,10,30)
 ;;=N DIKCFIL,DIKCFLD S Y="",DIKCFIL=+{FILE},DIKCFLD=+{FIELD} I DIKCFIL,DIKCFLD S Y=$P($G(^DD(DIKCFIL,DIKCFLD,0)),U) S:$L(Y)>60 Y=$E(Y,1,57)_"..."
 ;;^DIST(.404,.110107,40,11,0)
 ;;=12^Transform for Display^3^^TRANSFORM FOR DISPLAY
 ;;^DIST(.404,.110107,40,11,1)
 ;;=5.5
 ;;^DIST(.404,.110107,40,11,2)
 ;;=11,25^53^11,2
 ;;^DIST(.404,.110107,40,11,14)
 ;;=I $G(DUZ(0))'="@" S DDSERROR=1 D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit the Transform for Display.")
 ;;^DIST(.404,.110107,40,12,0)
 ;;=11^Transform for Lookup^3
 ;;^DIST(.404,.110107,40,12,1)
 ;;=5.3
 ;;^DIST(.404,.110107,40,12,2)
 ;;=10,25^53^10,3
 ;;^DIST(.404,.110107,40,12,14)
 ;;=I $G(DUZ(0))'="@" S DDSERROR=1 D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit the Transform for Lookup.")
 ;;^DIST(.404,.110108,0)
 ;;=DIKC EDIT COMPUTED CRV^.114
 ;;^DIST(.404,.110108,40,0)
 ;;=^.4044I^8^7
 ;;^DIST(.404,.110108,40,1,0)
 ;;=1^ Computed-Type Cross Reference Value ^1
 ;;^DIST(.404,.110108,40,1,2)
 ;;=^^1,21
 ;;^DIST(.404,.110108,40,2,0)
 ;;=2^Order Number^3
 ;;^DIST(.404,.110108,40,2,1)
 ;;=.01
 ;;^DIST(.404,.110108,40,2,2)
 ;;=3,21^3^3,7
 ;;^DIST(.404,.110108,40,2,13)
 ;;=S:$$GET^DDSVAL(.114,.DA,.5) DIKCCRV=1
 ;;^DIST(.404,.110108,40,3,0)
 ;;=3^Subscript Number^3
 ;;^DIST(.404,.110108,40,3,1)
 ;;=.5
 ;;^DIST(.404,.110108,40,3,2)
 ;;=4,21^3^4,3
 ;;^DIST(.404,.110108,40,3,13)
 ;;=S:X=""!(DDSOLD="") DIKCCRV=1
 ;;^DIST(.404,.110108,40,4,0)
 ;;=5^Maximum Length^3
 ;;^DIST(.404,.110108,40,4,1)
 ;;=6
 ;;^DIST(.404,.110108,40,4,2)
 ;;=5,21^3^5,5
 ;;^DIST(.404,.110108,40,4,13)
 ;;=S:$$GET^DDSVAL(.114,.DA,.5) DIKCCRV=1
 ;;^DIST(.404,.110108,40,5,0)
 ;;=4^Lookup Prompt^3
 ;;^DIST(.404,.110108,40,5,1)
 ;;=8
 ;;^DIST(.404,.110108,40,5,2)
 ;;=4,48^30^4,33
 ;;^DIST(.404,.110108,40,6,0)
 ;;=6^Collation^3
 ;;^DIST(.404,.110108,40,6,1)
 ;;=7
 ;;^DIST(.404,.110108,40,6,2)
 ;;=5,48^9^5,37
 ;;^DIST(.404,.110108,40,8,0)
 ;;=7^Computed Code^3
 ;;^DIST(.404,.110108,40,8,1)
 ;;=4.5
 ;;^DIST(.404,.110108,40,8,2)
 ;;=7,18^60^7,3
 ;;^DIST(.404,.110108,40,8,4)
 ;;=1
 ;;^DIST(.404,.110108,40,8,14)
 ;;=I $G(DUZ(0))'="@" S DDSERROR=1 D HLP^DDSUTL($C(7)_"Only programmers are allowed to edit the Computed Code.")
 ;;^DIST(.404,.11021,0)
 ;;=DIKC EDIT UI MAIN^.11
 ;;^DIST(.404,.11021,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.11021,40,1,0)
 ;;=1^File^3
 ;;^DIST(.404,.11021,40,1,1)
 ;;=.01
 ;;^DIST(.404,.11021,40,1,2)
 ;;=1,15^20^1,9
 ;;^DIST(.404,.11021,40,1,13)
 ;;=D BLDLOG^DIKCFORM(DA)
 ;;^DIST(.404,.11021,40,1,14)
 ;;=D VALFILE^DIKCFORM
 ;;^DIST(.404,.11021,40,2,0)
 ;;=2^Root File^3
 ;;^DIST(.404,.11021,40,2,1)
 ;;=.51
 ;;^DIST(.404,.11021,40,2,2)
 ;;=1,60^20^1,49
 ;;^DIST(.404,.11021,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.11021,40,3,0)
 ;;=3^Index Name^3
 ;;^DIST(.404,.11021,40,3,1)
 ;;=.02
 ;;^DIST(.404,.11021,40,3,2)
 ;;=2,15^30^2,3
 ;;^DIST(.404,.11021,40,3,13)
 ;;=D NAMECHG^DIKCFORM
 ;;^DIST(.404,.11021,40,3,14)
 ;;=D NAMEVAL^DIKCFORM
 ;;^DIST(.404,.11021,40,4,0)
 ;;=4^Root Type^3
 ;;^DIST(.404,.11021,40,4,1)
 ;;=.5
 ;;^DIST(.404,.11021,40,4,2)
 ;;=2,60^16^2,49
 ;;^DIST(.404,.11021,40,4,4)
 ;;=^^^1
 ;;^DIST(.404,.11021,40,5,0)
 ;;=5^Short Description^3
 ;;^DIST(.404,.11021,40,5,1)
 ;;=.11
 ;;^DIST(.404,.11021,40,5,2)
 ;;=4,20^60^4,1
 ;;^DIST(.404,.11021,40,5,11)
 ;;=D HLP^DDSUTL(X)
 ;;^DIST(.404,.11021,40,6,0)
 ;;=6^Description (wp)^3
 ;;^DIST(.404,.11021,40,6,1)
 ;;=.1
 ;;^DIST(.404,.11021,40,6,2)
 ;;=5,20^1^5,2
 ;;^DIST(.404,.11021,40,7,0)
 ;;=7^!M^1
 ;;^DIST(.404,.11021,40,7,.1)
 ;;=N WPROOT S WPROOT=$$GET^DDSVAL(.11,.DA,.1),Y=$S(WPROOT]"":$G(@WPROOT@(1,0)),1:""),Y=$S(Y]"":"["_$E(Y,1,56)_"]",1:"(empty)")
 ;;^DIST(.404,.11021,40,7,2)
 ;;=^^5,23
 ;;^DIST(.404,.11021,40,8,0)
 ;;=8^Set Logic^3
 ;;^DIST(.404,.11021,40,8,1)
 ;;=1.1
 ;;^DIST(.404,.11021,40,8,2)
 ;;=14,13^67^14,2
 ;;^DIST(.404,.11021,40,8,4)
 ;;=^^^2
 ;;^DIST(.404,.11021,40,8,11)
 ;;=D HLP^DDSUTL(X)
 ;;^DIST(.404,.11021,40,9,0)
 ;;=9^Kill Logic^3
 ;;^DIST(.404,.11021,40,9,1)
 ;;=2.1
 ;;^DIST(.404,.11021,40,9,2)
 ;;=15,13^67^15,1
 ;;^DIST(.404,.11021,40,9,4)
 ;;=^^^2
 ;;^DIST(.404,.11021,40,9,11)
 ;;=D HLP^DDSUTL(X)
 ;;^DIST(.404,.11022,0)
 ;;=DIKC EDIT UI HDR^.11
 ;;^DIST(.404,.11022,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.11022,40,1,0)
 ;;=1^Number^4
 ;;^DIST(.404,.11022,40,1,2)
 ;;=1,9^15^1,1
 ;;^DIST(.404,.11022,40,1,30)
 ;;=S Y=DA
 ;;^DIST(.404,.11022,40,2,0)
 ;;=2^EDIT A UNIQUENESS INDEX^1
 ;;^DIST(.404,.11022,40,2,2)
 ;;=^^1,30
 ;;^DIST(.404,.11022,40,3,0)
 ;;=3^Page 1 of 1^1
 ;;^DIST(.404,.11022,40,3,2)
 ;;=^^1,69
 ;;^DIST(.404,.11022,40,4,0)
 ;;=4^-------------------------------------------------------------------------------^1
 ;;^DIST(.404,.11022,40,4,2)
 ;;=^^2,1
 ;;^DIST(.404,.11023,0)
 ;;=DIKC EDIT UI CRV^.114
 ;;^DIST(.404,.11023,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.11023,40,1,0)
 ;;=1^^3^^ORDER
 ;;^DIST(.404,.11023,40,1,1)
 ;;=.01
 ;;^DIST(.404,.11023,40,1,2)
 ;;=1,3^3
 ;;^DIST(.404,.11023,40,1,4)
 ;;=^^^2
 ;;^DIST(.404,.11023,40,1,14)
 ;;=I X="" D HLP^DDSUTL($C(7)_"Deletion not allowed.") S DDSERROR=1
 ;;^DIST(.404,.11023,40,2,0)
 ;;=2^^3^^SUBSCRIPT
 ;;^DIST(.404,.11023,40,2,1)
 ;;=.5
 ;;^DIST(.404,.11023,40,2,2)
 ;;=1,12^3
 ;;^DIST(.404,.11023,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.11023,40,3,0)
 ;;=3^^3^^LENGTH

DINIT0FC
DINIT0FC ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FD S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.11023,40,3,1)
 ;;=6
 ;;^DIST(.404,.11023,40,3,2)
 ;;=1,20^3
 ;;^DIST(.404,.11023,40,3,13)
 ;;=D BLDLOG^DIKCFORM(DA(1))
 ;;^DIST(.404,.11023,40,4,0)
 ;;=4^^4^^FIELD DISPLAY
 ;;^DIST(.404,.11023,40,4,2)
 ;;=1,27^43
 ;;^DIST(.404,.11023,40,4,30)
 ;;=N DIKCFIL,DIKCFLD S DIKCFIL={FILE},DIKCFLD={FIELD} S Y="["_DIKCFIL_","_DIKCFLD_"] "_$P($G(^DD(+DIKCFIL,+DIKCFLD,0)),U)
 ;;^DIST(.404,.11024,0)
 ;;=DIKC EDIT UI CRV HDR^.11
 ;;^DIST(.404,.11024,40,0)
 ;;=^.4044I^8^8
 ;;^DIST(.404,.11024,40,1,0)
 ;;=1^Order...^1
 ;;^DIST(.404,.11024,40,1,2)
 ;;=^^1,2
 ;;^DIST(.404,.11024,40,2,0)
 ;;=2^Subscr^1
 ;;^DIST(.404,.11024,40,2,2)
 ;;=^^1,12
 ;;^DIST(.404,.11024,40,3,0)
 ;;=3^Length^1
 ;;^DIST(.404,.11024,40,3,2)
 ;;=^^1,20
 ;;^DIST(.404,.11024,40,4,0)
 ;;=4^[File,Field] Field Name^1
 ;;^DIST(.404,.11024,40,4,2)
 ;;=^^1,28
 ;;^DIST(.404,.11024,40,5,0)
 ;;=5^--------^1
 ;;^DIST(.404,.11024,40,5,2)
 ;;=^^2,2
 ;;^DIST(.404,.11024,40,6,0)
 ;;=6^------^1
 ;;^DIST(.404,.11024,40,6,2)
 ;;=^^2,12
 ;;^DIST(.404,.11024,40,7,0)
 ;;=7^------^1
 ;;^DIST(.404,.11024,40,7,2)
 ;;=^^2,20
 ;;^DIST(.404,.11024,40,8,0)
 ;;=8^-----------------------^1
 ;;^DIST(.404,.11024,40,8,2)
 ;;=^^2,28
 ;;^DIST(.404,.11025,0)
 ;;=DIKC EDIT UI FIELD CRV^.114
 ;;^DIST(.404,.11025,11)
 ;;=K DIKCCRV
 ;;^DIST(.404,.11025,12)
 ;;=I $D(DIKCCRV) D BLDLOG^DIKCFORM(DA(1)) K DIKCCRV
 ;;^DIST(.404,.11025,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.11025,40,1,0)
 ;;=1^ Field-Type Cross Reference Value ^1
 ;;^DIST(.404,.11025,40,1,2)
 ;;=^^1,23
 ;;^DIST(.404,.11025,40,2,0)
 ;;=2^Order Number^3
 ;;^DIST(.404,.11025,40,2,1)
 ;;=.01
 ;;^DIST(.404,.11025,40,2,2)
 ;;=3,18^3^3,4
 ;;^DIST(.404,.11025,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.11025,40,3,0)
 ;;=3^Subscript Number^3
 ;;^DIST(.404,.11025,40,3,1)
 ;;=.5
 ;;^DIST(.404,.11025,40,3,2)
 ;;=3,58^3^3,40
 ;;^DIST(.404,.11025,40,3,4)
 ;;=^^^1
 ;;^DIST(.404,.11025,40,4,0)
 ;;=4^Field^3^^FIELD
 ;;^DIST(.404,.11025,40,4,1)
 ;;=3
 ;;^DIST(.404,.11025,40,4,2)
 ;;=4,18^20^4,11
 ;;^DIST(.404,.11025,40,4,4)
 ;;=^^^1
 ;;^DIST(.404,.11025,40,5,0)
 ;;=5^File^3
 ;;^DIST(.404,.11025,40,5,1)
 ;;=2
 ;;^DIST(.404,.11025,40,5,2)
 ;;=4,58^20^4,52
 ;;^DIST(.404,.11025,40,5,4)
 ;;=^^^1
 ;;^DIST(.404,.11025,40,6,0)
 ;;=6^Field Name^4
 ;;^DIST(.404,.11025,40,6,2)
 ;;=5,18^60^5,6
 ;;^DIST(.404,.11025,40,6,30)
 ;;=N DIKCFIL,DIKCFLD S Y="",DIKCFIL=+{FILE},DIKCFLD=+{FIELD} I DIKCFIL,DIKCFLD S Y=$P($G(^DD(DIKCFIL,DIKCFLD,0)),U) S:$L(Y)>60 Y=$E(Y,1,57)_"..."
 ;;^DIST(.404,.11025,40,7,0)
 ;;=7^Maximum Length^3
 ;;^DIST(.404,.11025,40,7,1)
 ;;=6
 ;;^DIST(.404,.11025,40,7,2)
 ;;=7,18^3^7,2
 ;;^DIST(.404,.11025,40,7,13)
 ;;=S DIKCCRV=1
 ;;^DIST(.404,.11025,40,8,0)
 ;;=8^Collation^3
 ;;^DIST(.404,.11025,40,8,1)
 ;;=7
 ;;^DIST(.404,.11025,40,8,2)
 ;;=7,58^9^7,47
 ;;^DIST(.404,.11025,40,9,0)
 ;;=9^Lookup Prompt^3
 ;;^DIST(.404,.11025,40,9,1)
 ;;=8
 ;;^DIST(.404,.11025,40,9,2)
 ;;=8,18^30^8,3
 ;;^DIST(.404,.310101,0)
 ;;=DIKK EDIT HDR^.31
 ;;^DIST(.404,.310101,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.310101,40,1,0)
 ;;=1^Number^4
 ;;^DIST(.404,.310101,40,1,2)
 ;;=1,9^16^1,1
 ;;^DIST(.404,.310101,40,1,30)
 ;;=S Y=DA
 ;;^DIST(.404,.310101,40,2,0)
 ;;=2^EDIT A KEY^1
 ;;^DIST(.404,.310101,40,2,2)
 ;;=^^1,36
 ;;^DIST(.404,.310101,40,3,0)
 ;;=3^Page 1 of 1^1
 ;;^DIST(.404,.310101,40,3,2)
 ;;=^^1,69
 ;;^DIST(.404,.310101,40,4,0)
 ;;=4^-------------------------------------------------------------------------------^1
 ;;^DIST(.404,.310101,40,4,2)
 ;;=^^2,1
 ;;^DIST(.404,.310102,0)
 ;;=DIKK EDIT MAIN^.31
 ;;^DIST(.404,.310102,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.310102,40,1,0)
 ;;=1^File^3
 ;;^DIST(.404,.310102,40,1,1)
 ;;=.01
 ;;^DIST(.404,.310102,40,1,2)
 ;;=1,9^20^1,3
 ;;^DIST(.404,.310102,40,1,4)
 ;;=^^^2
 ;;^DIST(.404,.310102,40,2,0)
 ;;=2^Name^3
 ;;^DIST(.404,.310102,40,2,1)
 ;;=.02
 ;;^DIST(.404,.310102,40,2,2)
 ;;=1,39^1^1,33
 ;;^DIST(.404,.310102,40,2,13)
 ;;=D NAMEPAC^DIKKFORM
 ;;^DIST(.404,.310102,40,3,0)
 ;;=3^Priority^3
 ;;^DIST(.404,.310102,40,3,1)
 ;;=1
 ;;^DIST(.404,.310102,40,3,2)
 ;;=1,71^9^1,61
 ;;^DIST(.404,.310102,40,3,14)
 ;;=D PRIOVAL^DIKKFORM
 ;;^DIST(.404,.310103,0)
 ;;=DIKK EDIT FIELD HDR^.31
 ;;^DIST(.404,.310103,40,0)
 ;;=^.4044I^10^10
 ;;^DIST(.404,.310103,40,1,0)
 ;;=1^KEY FIELDS:^1
 ;;^DIST(.404,.310103,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.310103,40,2,0)
 ;;=2^==========^1
 ;;^DIST(.404,.310103,40,2,2)
 ;;=^^2,1
 ;;^DIST(.404,.310103,40,3,0)
 ;;=3^Field^1
 ;;^DIST(.404,.310103,40,3,2)
 ;;=^^3,1
 ;;^DIST(.404,.310103,40,4,0)
 ;;=4^Seq No.^1
 ;;^DIST(.404,.310103,40,4,2)
 ;;=^^3,22
 ;;^DIST(.404,.310103,40,5,0)
 ;;=5^File^1
 ;;^DIST(.404,.310103,40,5,2)
 ;;=^^3,31
 ;;^DIST(.404,.310103,40,6,0)
 ;;=6^Field Name^1
 ;;^DIST(.404,.310103,40,6,2)
 ;;=^^3,53
 ;;^DIST(.404,.310103,40,7,0)
 ;;=7^-----^1
 ;;^DIST(.404,.310103,40,7,2)
 ;;=^^4,1
 ;;^DIST(.404,.310103,40,8,0)
 ;;=8^-------^1
 ;;^DIST(.404,.310103,40,8,2)
 ;;=^^4,22
 ;;^DIST(.404,.310103,40,9,0)
 ;;=9^----^1
 ;;^DIST(.404,.310103,40,9,2)
 ;;=^^4,31
 ;;^DIST(.404,.310103,40,10,0)
 ;;=10^----------^1
 ;;^DIST(.404,.310103,40,10,2)
 ;;=^^4,53
 ;;^DIST(.404,.310104,0)
 ;;=DIKK EDIT FIELD^.312
 ;;^DIST(.404,.310104,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.310104,40,1,0)
 ;;=1^^3
 ;;^DIST(.404,.310104,40,1,1)
 ;;=.01
 ;;^DIST(.404,.310104,40,1,2)
 ;;=1,1^20
 ;;^DIST(.404,.310104,40,2,0)
 ;;=2^^3
 ;;^DIST(.404,.310104,40,2,1)
 ;;=1
 ;;^DIST(.404,.310104,40,2,2)
 ;;=1,24^3
 ;;^DIST(.404,.310104,40,3,0)
 ;;=3^^3
 ;;^DIST(.404,.310104,40,3,1)
 ;;=.02
 ;;^DIST(.404,.310104,40,3,2)
 ;;=1,31^20
 ;;^DIST(.404,.310104,40,3,3)
 ;;=!M
 ;;^DIST(.404,.310104,40,3,3.1)
 ;;=S Y=$$GET^DDSVAL(.31,DA(1),.01)
 ;;^DIST(.404,.310104,40,3,4)
 ;;=^^^1
 ;;^DIST(.404,.310104,40,4,0)
 ;;=4^^4
 ;;^DIST(.404,.310104,40,4,2)
 ;;=1,53^25
 ;;^DIST(.404,.310104,40,4,30)
 ;;==$P($G(^DD({FILE},{FIELD},0)),U)
 ;;^DIST(.404,.310105,0)
 ;;=DIKK EDIT UI IDENTIFIER^.11
 ;;^DIST(.404,.310105,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.310105,40,1,0)
 ;;=1^^3
 ;;^DIST(.404,.310105,40,1,1)
 ;;=.02
 ;;^DIST(.404,.310105,40,1,2)
 ;;=1,44^30
 ;;^DIST(.404,.310105,40,2,0)
 ;;=2^^3
 ;;^DIST(.404,.310105,40,2,1)
 ;;=.11
 ;;^DIST(.404,.310105,40,2,2)
 ;;=2,19^61
 ;;^DIST(.404,.310106,0)
 ;;=DIKK EDIT UNIQUENESS INDEX^.31
 ;;^DIST(.404,.310106,11)
 ;;=D:$$GET^DDSVAL(.31,DA,3)="" UNED^DDSUTL("DETAILS","","",1)
 ;;^DIST(.404,.310106,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.310106,40,1,0)
 ;;=1^Uniqueness Index^3
 ;;^DIST(.404,.310106,40,1,1)
 ;;=3
 ;;^DIST(.404,.310106,40,1,2)
 ;;=1,19^20^1,1

DINIT0FD
DINIT0FD ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FE S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.310106,40,1,13)
 ;;=D:X=""!(DDSOLD="") UNED^DDSUTL("DETAILS","","",$S(X="":1,1:0))
 ;;^DIST(.404,.310106,40,1,14)
 ;;=D UIVAL^DIKKFORM
 ;;^DIST(.404,.310106,40,2,0)
 ;;=2^Index Details...^2^^DETAILS
 ;;^DIST(.404,.310106,40,2,2)
 ;;=3,19^1^3,2^1
 ;;^DIST(.404,.310106,40,2,20)
 ;;=F^^0:0
 ;;^DIST(.404,.310106,40,2,21,0)
 ;;=^^1^1^2970722
 ;;^DIST(.404,.310106,40,2,21,1,0)
 ;;=Press <Return> to view the properties of the Uniqueness Index.
 ;;^DIST(.404,.310107,0)
 ;;=DIKK EDIT UI HDR^.11
 ;;^DIST(.404,.310107,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.310107,40,1,0)
 ;;=1^ Uniqueness Index ^1
 ;;^DIST(.404,.310107,40,1,2)
 ;;=^^1,31
 ;;^DIST(.404,.310108,0)
 ;;=DIKK EDIT UI^.11
 ;;^DIST(.404,.310108,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.310108,40,1,0)
 ;;=1^File^3
 ;;^DIST(.404,.310108,40,1,1)
 ;;=.01
 ;;^DIST(.404,.310108,40,1,2)
 ;;=1,13^20^1,7
 ;;^DIST(.404,.310108,40,1,4)
 ;;=^^^1
 ;;^DIST(.404,.310108,40,1,13)
 ;;=D BLDLOG^DIKCFORM(DA)
 ;;^DIST(.404,.310108,40,1,14)
 ;;=D VALFILE^DIKCFORM
 ;;^DIST(.404,.310108,40,2,0)
 ;;=2^Root File^3
 ;;^DIST(.404,.310108,40,2,1)
 ;;=.51
 ;;^DIST(.404,.310108,40,2,2)
 ;;=1,56^20^1,45
 ;;^DIST(.404,.310108,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.310108,40,3,0)
 ;;=3^Index Name^3^^NAME
 ;;^DIST(.404,.310108,40,3,1)
 ;;=.02
 ;;^DIST(.404,.310108,40,3,2)
 ;;=2,13^30^2,1
 ;;^DIST(.404,.310108,40,3,13)
 ;;=D BLDLOG^DIKCFORM(DA)
 ;;^DIST(.404,.310108,40,3,14)
 ;;=D NAMEVAL^DIKCFORM
 ;;^DIST(.404,.310108,40,4,0)
 ;;=4^Root Type^3
 ;;^DIST(.404,.310108,40,4,1)
 ;;=.5
 ;;^DIST(.404,.310108,40,4,2)
 ;;=2,56^16^2,45
 ;;^DIST(.404,.310108,40,4,4)
 ;;=^^^1
 ;;^DIST(.404,.310108,40,5,0)
 ;;=5^Short Description^3
 ;;^DIST(.404,.310108,40,5,1)
 ;;=.11
 ;;^DIST(.404,.310108,40,5,2)
 ;;=4,20^56^4,1
 ;;^DIST(.404,.310108,40,5,11)
 ;;=D HLP^DDSUTL(X)
 ;;^DIST(.404,.310108,40,6,0)
 ;;=6^Description (wp)^3
 ;;^DIST(.404,.310108,40,6,1)
 ;;=.1
 ;;^DIST(.404,.310108,40,6,2)
 ;;=5,20^1^5,2
 ;;^DIST(.404,.310108,40,7,0)
 ;;=7^!M^1
 ;;^DIST(.404,.310108,40,7,.1)
 ;;=N WPROOT S WPROOT=$$GET^DDSVAL(.11,DA,.1),Y=$S(WPROOT]"":$G(@WPROOT@(1,0)),1:""),Y=$S(Y]"":"["_$E(Y,1,51)_"]",1:"(empty)")
 ;;^DIST(.404,.310108,40,7,2)
 ;;=^^5,23
 ;;^DIST(.404,.310108,40,8,0)
 ;;=8^Set Logic^3
 ;;^DIST(.404,.310108,40,8,1)
 ;;=1.1
 ;;^DIST(.404,.310108,40,8,2)
 ;;=14,13^63^14,2
 ;;^DIST(.404,.310108,40,8,4)
 ;;=^^^2
 ;;^DIST(.404,.310108,40,8,11)
 ;;=D HLP^DDSUTL(X)
 ;;^DIST(.404,.310108,40,9,0)
 ;;=9^Kill Logic^3
 ;;^DIST(.404,.310108,40,9,1)
 ;;=2.1
 ;;^DIST(.404,.310108,40,9,2)
 ;;=15,13^63^15,1
 ;;^DIST(.404,.310108,40,9,4)
 ;;=^^^2
 ;;^DIST(.404,.310108,40,9,11)
 ;;=D HLP^DDSUTL(X)
 ;;^DIST(.404,.310109,0)
 ;;=DIKK EDIT UI FIELD COLUMN HDR^.31
 ;;^DIST(.404,.310109,40,0)
 ;;=^.4044I^8^8
 ;;^DIST(.404,.310109,40,1,0)
 ;;=1^Order...^1
 ;;^DIST(.404,.310109,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.310109,40,2,0)
 ;;=2^Subscr^1
 ;;^DIST(.404,.310109,40,2,2)
 ;;=^^1,11
 ;;^DIST(.404,.310109,40,3,0)
 ;;=3^Length^1
 ;;^DIST(.404,.310109,40,3,2)
 ;;=^^1,19
 ;;^DIST(.404,.310109,40,4,0)
 ;;=4^[File,Field] Field Name^1
 ;;^DIST(.404,.310109,40,4,2)
 ;;=^^1,27
 ;;^DIST(.404,.310109,40,5,0)
 ;;=5^--------^1
 ;;^DIST(.404,.310109,40,5,2)
 ;;=^^2,1
 ;;^DIST(.404,.310109,40,6,0)
 ;;=6^------^1
 ;;^DIST(.404,.310109,40,6,2)
 ;;=^^2,11
 ;;^DIST(.404,.310109,40,7,0)
 ;;=7^------^1
 ;;^DIST(.404,.310109,40,7,2)
 ;;=^^2,19
 ;;^DIST(.404,.310109,40,8,0)
 ;;=8^-----------------------^1
 ;;^DIST(.404,.310109,40,8,2)
 ;;=^^2,27
 ;;^DIST(.404,.31011,0)
 ;;=DIKK EDIT UI FIELD REP^.114
 ;;^DIST(.404,.31011,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.31011,40,1,0)
 ;;=1^^3^^ORDER
 ;;^DIST(.404,.31011,40,1,1)
 ;;=.01
 ;;^DIST(.404,.31011,40,1,2)
 ;;=1,3^3
 ;;^DIST(.404,.31011,40,1,4)
 ;;=^^^2
 ;;^DIST(.404,.31011,40,1,14)
 ;;=I X="" D HLP^DDSUTL($C(7)_"Deletions not allowed.") S DDSERROR=1
 ;;^DIST(.404,.31011,40,2,0)
 ;;=2^^3^^SUBSCRIPT
 ;;^DIST(.404,.31011,40,2,1)
 ;;=.5
 ;;^DIST(.404,.31011,40,2,2)
 ;;=1,12^3
 ;;^DIST(.404,.31011,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.31011,40,3,0)
 ;;=3^^3
 ;;^DIST(.404,.31011,40,3,1)
 ;;=6
 ;;^DIST(.404,.31011,40,3,2)
 ;;=1,20^3
 ;;^DIST(.404,.31011,40,3,13)
 ;;=D BLDLOG^DIKCFORM(DA(1))
 ;;^DIST(.404,.31011,40,4,0)
 ;;=4^^4
 ;;^DIST(.404,.31011,40,4,2)
 ;;=1,27^49
 ;;^DIST(.404,.31011,40,4,30)
 ;;=N DIKKFIL,DIKKFLD S DIKKFIL={FILE},DIKKFLD={FIELD} S Y="["_DIKKFIL_","_DIKKFLD_"] "_$P($G(^DD(DIKKFIL,DIKKFLD,0)),U)
 ;;^DIST(.404,.310111,0)
 ;;=DIKK EDIT UI FIELD CRV^.114
 ;;^DIST(.404,.310111,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.310111,40,1,0)
 ;;=1^ Field-Type Cross Reference Value ^1
 ;;^DIST(.404,.310111,40,1,2)
 ;;=^^1,23
 ;;^DIST(.404,.310111,40,2,0)
 ;;=2^Order Number^3
 ;;^DIST(.404,.310111,40,2,1)
 ;;=.01
 ;;^DIST(.404,.310111,40,2,2)
 ;;=3,18^3^3,4
 ;;^DIST(.404,.310111,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.310111,40,3,0)
 ;;=3^Subscript Number^3
 ;;^DIST(.404,.310111,40,3,1)
 ;;=.5
 ;;^DIST(.404,.310111,40,3,2)
 ;;=3,56^3^3,38
 ;;^DIST(.404,.310111,40,3,4)
 ;;=^^^1
 ;;^DIST(.404,.310111,40,4,0)
 ;;=4^Field^3^^FIELD
 ;;^DIST(.404,.310111,40,4,1)
 ;;=3
 ;;^DIST(.404,.310111,40,4,2)
 ;;=4,18^20^4,11
 ;;^DIST(.404,.310111,40,4,4)
 ;;=^^^1
 ;;^DIST(.404,.310111,40,5,0)
 ;;=5^File^3
 ;;^DIST(.404,.310111,40,5,1)
 ;;=2
 ;;^DIST(.404,.310111,40,5,2)
 ;;=4,56^20^4,50
 ;;^DIST(.404,.310111,40,5,4)
 ;;=^^^1
 ;;^DIST(.404,.310111,40,6,0)
 ;;=6^Field Name^4
 ;;^DIST(.404,.310111,40,6,2)
 ;;=5,18^58^5,6
 ;;^DIST(.404,.310111,40,6,30)
 ;;=N DIKCFIL,DIKCFLD S Y="",DIKCFIL=+{FILE},DIKCFLD=+{FIELD} I DIKCFIL,DIKCFLD S Y=$P($G(^DD(DIKCFIL,DIKCFLD,0)),U) S:$L(Y)>60 Y=$E(Y,1,57)_"..."
 ;;^DIST(.404,.310111,40,7,0)
 ;;=7^Maximum Length^3
 ;;^DIST(.404,.310111,40,7,1)
 ;;=6
 ;;^DIST(.404,.310111,40,7,2)
 ;;=7,18^3^7,2
 ;;^DIST(.404,.310111,40,7,13)
 ;;=S DIKCCRV=1
 ;;^DIST(.404,.310111,40,8,0)
 ;;=8^Collation^3
 ;;^DIST(.404,.310111,40,8,1)
 ;;=7
 ;;^DIST(.404,.310111,40,8,2)
 ;;=7,58^9^7,47
 ;;^DIST(.404,.310111,40,9,0)
 ;;=9^Lookup Prompt^3
 ;;^DIST(.404,.310111,40,9,1)
 ;;=8
 ;;^DIST(.404,.310111,40,9,2)
 ;;=8,18^30^8,3
 ;;^DIST(.404,.400011,0)
 ;;=DIBTED^.401
 ;;^DIST(.404,.400011,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.400011,40,1,0)
 ;;=1^TEMPLATE NAME^3
 ;;^DIST(.404,.400011,40,1,1)
 ;;=.01
 ;;^DIST(.404,.400011,40,1,2)
 ;;=1,16^30^1,1
 ;;^DIST(.404,.400011,40,2,0)
 ;;=3^DATE LAST MODIFIED^3
 ;;^DIST(.404,.400011,40,2,1)
 ;;=2
 ;;^DIST(.404,.400011,40,2,2)
 ;;=4,28^17^4,8
 ;;^DIST(.404,.400011,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.400011,40,3,0)
 ;;=4^DATE LAST USED^3
 ;;^DIST(.404,.400011,40,3,1)
 ;;=7

DINIT0FE
DINIT0FE ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;11JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FF S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.400011,40,3,2)
 ;;=5,28^11^5,12
 ;;^DIST(.404,.400011,40,3,4)
 ;;=^^^1
 ;;^DIST(.404,.400011,40,4,0)
 ;;=6^READ ACCESS^3
 ;;^DIST(.404,.400011,40,4,1)
 ;;=3
 ;;^DIST(.404,.400011,40,4,2)
 ;;=6,28^13^6,15
 ;;^DIST(.404,.400011,40,5,0)
 ;;=7^WRITE ACCESS^3
 ;;^DIST(.404,.400011,40,5,1)
 ;;=6
 ;;^DIST(.404,.400011,40,5,2)
 ;;=7,28^13^7,14
 ;;^DIST(.404,.400011,40,6,0)
 ;;=8^USER #^3
 ;;^DIST(.404,.400011,40,6,1)
 ;;=5
 ;;^DIST(.404,.400011,40,6,2)
 ;;=8,28^9^8,20
 ;;^DIST(.404,.400011,40,7,0)
 ;;=9^DESCRIPTION...^3
 ;;^DIST(.404,.400011,40,7,1)
 ;;=10
 ;;^DIST(.404,.400011,40,7,2)
 ;;=10,28^1^10,13^1
 ;;^DIST(.404,.400011,40,8,0)
 ;;=12^(Sort Fields on Next Page...)^1
 ;;^DIST(.404,.400011,40,8,2)
 ;;=^^16,20
 ;;^DIST(.404,.400011,40,9,0)
 ;;=13^PRINT TEMPLATE^3
 ;;^DIST(.404,.400011,40,9,1)
 ;;=491620
 ;;^DIST(.404,.400011,40,9,2)
 ;;=12,28^35^12,12
 ;;^DIST(.404,.400012,0)
 ;;=DIBTED2^.401
 ;;^DIST(.404,.400012,11)
 ;;=D EDIT^DIBTED(DA)
 ;;^DIST(.404,.400012,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.400012,40,1,0)
 ;;=1^ ^1
 ;;^DIST(.404,.400012,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.401011,0)
 ;;=DIETED^.402
 ;;^DIST(.404,.401011,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.401011,40,1,0)
 ;;=1^TEMPLATE NAME^3
 ;;^DIST(.404,.401011,40,1,1)
 ;;=.01
 ;;^DIST(.404,.401011,40,1,2)
 ;;=1,16^30^1,1
 ;;^DIST(.404,.401011,40,2,0)
 ;;=3^DATE LAST MODIFIED^3
 ;;^DIST(.404,.401011,40,2,1)
 ;;=2
 ;;^DIST(.404,.401011,40,2,2)
 ;;=4,28^17^4,8
 ;;^DIST(.404,.401011,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.401011,40,3,0)
 ;;=4^DATE LAST USED^3
 ;;^DIST(.404,.401011,40,3,1)
 ;;=7
 ;;^DIST(.404,.401011,40,3,2)
 ;;=5,28^11^5,12
 ;;^DIST(.404,.401011,40,3,4)
 ;;=^^^1
 ;;^DIST(.404,.401011,40,4,0)
 ;;=5^^4
 ;;^DIST(.404,.401011,40,4,2)
 ;;=2,20^44
 ;;^DIST(.404,.401011,40,4,30)
 ;;=S Y=$G(^DIE(DA,"ROU")),S=$S(Y]"":"(Compiled as '"_Y_"' routine)",1:"(Not Compiled)")
 ;;^DIST(.404,.401011,40,5,0)
 ;;=6^READ ACCESS^3
 ;;^DIST(.404,.401011,40,5,1)
 ;;=3
 ;;^DIST(.404,.401011,40,5,2)
 ;;=6,28^13^6,15
 ;;^DIST(.404,.401011,40,6,0)
 ;;=7^WRITE ACCESS^3
 ;;^DIST(.404,.401011,40,6,1)
 ;;=6
 ;;^DIST(.404,.401011,40,6,2)
 ;;=7,28^13^7,14
 ;;^DIST(.404,.401011,40,7,0)
 ;;=8^USER #^3
 ;;^DIST(.404,.401011,40,7,1)
 ;;=5
 ;;^DIST(.404,.401011,40,7,2)
 ;;=8,28^9^8,20
 ;;^DIST(.404,.401011,40,8,0)
 ;;=9^DESCRIPTION...^3
 ;;^DIST(.404,.401011,40,8,1)
 ;;=10
 ;;^DIST(.404,.401011,40,8,2)
 ;;=10,28^1^10,13^1
 ;;^DIST(.404,.401011,40,9,0)
 ;;=12^(Edit Fields on Next Page...)^1^^EDIT FIELD
 ;;^DIST(.404,.401011,40,9,2)
 ;;=^^16,20
 ;;^DIST(.404,.401012,0)
 ;;=DIETED2^.402
 ;;^DIST(.404,.401012,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.401012,40,1,0)
 ;;=1^ ^1
 ;;^DIST(.404,.401012,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.402011,0)
 ;;=DIEDIT^1
 ;;^DIST(.404,.402011,11)
 ;;=D PRE^DIU20
 ;;^DIST(.404,.402011,40,0)
 ;;=^.4044I^18^17
 ;;^DIST(.404,.402011,40,1,0)
 ;;=1^DESCRIPTION...^3
 ;;^DIST(.404,.402011,40,1,1)
 ;;=4
 ;;^DIST(.404,.402011,40,1,2)
 ;;=3,36^1^3,21^1
 ;;^DIST(.404,.402011,40,2,0)
 ;;=2^DATA DICTIONARY ACCESS^2^^DATA DICTIONARY ACCESS
 ;;^DIST(.404,.402011,40,2,2)
 ;;=6,36^13^6,12
 ;;^DIST(.404,.402011,40,2,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,2,3.1)
 ;;=S Y=$G(^DIC(DA,0,"DD"))
 ;;^DIST(.404,.402011,40,2,14)
 ;;=D ACCVAL^DIU20(X)
 ;;^DIST(.404,.402011,40,2,20)
 ;;=F
 ;;^DIST(.404,.402011,40,3,0)
 ;;=3^READ ACCESS^2^^READ ACCESS
 ;;^DIST(.404,.402011,40,3,2)
 ;;=7,36^13^7,23
 ;;^DIST(.404,.402011,40,3,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,3,3.1)
 ;;=S Y=$G(^DIC(DA,0,"RD"))
 ;;^DIST(.404,.402011,40,3,14)
 ;;=D ACCVAL^DIU20(X)
 ;;^DIST(.404,.402011,40,3,20)
 ;;=F
 ;;^DIST(.404,.402011,40,4,0)
 ;;=4^WRITE ACCESS^2^^WRITE ACCESS
 ;;^DIST(.404,.402011,40,4,2)
 ;;=8,36^13^8,22
 ;;^DIST(.404,.402011,40,4,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,4,3.1)
 ;;=S Y=$G(^DIC(DA,0,"WR"))
 ;;^DIST(.404,.402011,40,4,14)
 ;;=D ACCVAL^DIU20(X)
 ;;^DIST(.404,.402011,40,4,20)
 ;;=F
 ;;^DIST(.404,.402011,40,5,0)
 ;;=5^DELETE ACCESS^2^^DELETE ACCESS
 ;;^DIST(.404,.402011,40,5,2)
 ;;=9,36^13^9,21
 ;;^DIST(.404,.402011,40,5,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,5,3.1)
 ;;=S Y=$G(^DIC(DA,0,"DEL"))
 ;;^DIST(.404,.402011,40,5,14)
 ;;=D ACCVAL^DIU20(X)
 ;;^DIST(.404,.402011,40,5,20)
 ;;=F
 ;;^DIST(.404,.402011,40,6,0)
 ;;=6^LAYGO ACCESS^2^^LAYGO ACCESS
 ;;^DIST(.404,.402011,40,6,2)
 ;;=10,36^13^10,22
 ;;^DIST(.404,.402011,40,6,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,6,3.1)
 ;;=S Y=$G(^DIC(DA,0,"LAYGO"))
 ;;^DIST(.404,.402011,40,6,14)
 ;;=D ACCVAL^DIU20(X)
 ;;^DIST(.404,.402011,40,6,20)
 ;;=F
 ;;^DIST(.404,.402011,40,7,0)
 ;;=7^AUDIT ACCESS^2^^AUDIT ACCESS
 ;;^DIST(.404,.402011,40,7,2)
 ;;=11,36^13^11,22
 ;;^DIST(.404,.402011,40,7,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,7,3.1)
 ;;=S Y=$G(^DIC(DA,0,"AUDIT"))
 ;;^DIST(.404,.402011,40,7,14)
 ;;=D ACCVAL^DIU20(X)
 ;;^DIST(.404,.402011,40,7,20)
 ;;=F
 ;;^DIST(.404,.402011,40,9,0)
 ;;=9^ASK 'OK' WHEN LOOKING UP AN ENTRY^2^^ASK OK
 ;;^DIST(.404,.402011,40,9,2)
 ;;=13,36^3^13,1
 ;;^DIST(.404,.402011,40,9,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,9,3.1)
 ;;=S Y=$G(^DIC(DA,0,"GL")) I Y["(" S Y=$G(@(Y_"0)")),Y=$P("YES^NO",U,$P(Y,U,2)'["O"+1)
 ;;^DIST(.404,.402011,40,9,20)
 ;;=Y
 ;;^DIST(.404,.402011,40,9,21,0)
 ;;=^^3^3^2981023
 ;;^DIST(.404,.402011,40,9,21,1,0)
 ;;=Answer YES to cause a lookup into this file to verify the
 ;;^DIST(.404,.402011,40,9,21,2,0)
 ;;=selection by prompting with 
 ;;^DIST(.404,.402011,40,9,21,3,0)
 ;;=   '...OK?  YES//  '
 ;;^DIST(.404,.402011,40,9.5,0)
 ;;=9.5^FILE SCREEN^2^^FILE SCREEN
 ;;^DIST(.404,.402011,40,9.5,2)
 ;;=14,26^40^14,13
 ;;^DIST(.404,.402011,40,9.5,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,9.5,3.1)
 ;;=S Y=$G(^DD(DA,0,"SCR"))
 ;;^DIST(.404,.402011,40,9.5,14)
 ;;=D ^DIM I '$D(X) S DDSERROR=1
 ;;^DIST(.404,.402011,40,9.5,20)
 ;;=F^UF^3:200
 ;;^DIST(.404,.402011,40,9.5,21,0)
 ;;=^^3^3^3010402
 ;;^DIST(.404,.402011,40,9.5,21,1,0)
 ;;=A line of MUMPS code can be entered here.  It should set the $T switch TRUE
 ;;^DIST(.404,.402011,40,9.5,21,2,0)
 ;;=or FALSE.  At the time of execution, 'Y' is the number of a File  entry
 ;;^DIST(.404,.402011,40,9.5,21,3,0)
 ;;=which we want to FILTER for lookup.  Thus this code is a 'permanent DIC("S")' for the File.  MISUSE OF THIS CAN DISENABLE THE FILE!
 ;;^DIST(.404,.402011,40,10,0)
 ;;=10^POST-SELECTION ACTION^2^^POST-SELECTION ACTION
 ;;^DIST(.404,.402011,40,10,2)
 ;;=15,26^52^15,3
 ;;^DIST(.404,.402011,40,10,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,10,3.1)
 ;;=S Y=$G(^DD(DA,0,"ACT"))
 ;;^DIST(.404,.402011,40,10,14)
 ;;=D ^DIM I '$D(X) S DDSERROR=1
 ;;^DIST(.404,.402011,40,10,20)
 ;;=F^UF^3:250
 ;;^DIST(.404,.402011,40,10,21,0)
 ;;=^^3^3^3010402
 ;;^DIST(.404,.402011,40,10,21,1,0)
 ;;=If a line of MUMPS code is entered here, it will be executed
 ;;^DIST(.404,.402011,40,10,21,2,0)
 ;;=every time after a selection from the File is made.
 ;;^DIST(.404,.402011,40,10,21,3,0)
 ;;=At the time of execution, 'Y' is the return value from the "DIC" lookup.
 ;;^DIST(.404,.402011,40,11,0)
 ;;=11^LOOK-UP PROGRAM^2^^LOOK-UP PROGRAM
 ;;^DIST(.404,.402011,40,11,2)
 ;;=16,26^8^16,9
 ;;^DIST(.404,.402011,40,11,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,11,3.1)
 ;;=S Y=$G(^DD(DA,0,"DIC"))
 ;;^DIST(.404,.402011,40,11,14)
 ;;=I X]"",'$$ROUEXIST^DILIBF(X)!(X?1"DI".E)!(X'?3U.5UN) S DDSERROR=1
 ;;^DIST(.404,.402011,40,11,20)
 ;;=F^FO

DINIT0FF
DINIT0FF ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;12DEC2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FG S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.402011,40,11,21,0)
 ;;=^^5^5^3010402
 ;;^DIST(.404,.402011,40,11,21,1,0)
 ;;=Enter a valid MUMPS routine name of from 3 to 8 characters.  This must
 ;;^DIST(.404,.402011,40,11,21,2,0)
 ;;=be entered without a leading up-arrow, and cannot begin with "DI".
 ;;^DIST(.404,.402011,40,11,21,3,0)
 ;;=It must name a routine currently on the system.
 ;;^DIST(.404,.402011,40,11,21,4,0)
 ;;=This special lookup routine will be executed instead of the standard
 ;;^DIST(.404,.402011,40,11,21,5,0)
 ;;=FileMan lookup logic, whenever a call is made to ^DIC.
 ;;^DIST(.404,.402011,40,12,0)
 ;;=12^CROSS-REFERENCE ROUTINE^2^^CROSS-REFERENCE ROUTINE
 ;;^DIST(.404,.402011,40,12,2)
 ;;=17,26^6^17,1
 ;;^DIST(.404,.402011,40,12,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,12,3.1)
 ;;=S Y=$G(^DD(DA,0,"DIK"))
 ;;^DIST(.404,.402011,40,12,14)
 ;;=I X?1"DI".E!(X'?3U.3NU),X]"" S DDSERROR=1
 ;;^DIST(.404,.402011,40,12,20)
 ;;=F
 ;;^DIST(.404,.402011,40,12,21,0)
 ;;=^^11^11^2981029
 ;;^DIST(.404,.402011,40,12,21,1,0)
 ;;=
 ;;^DIST(.404,.402011,40,12,21,2,0)
 ;;=Enter a valid MUMPS routine name of from 3 to 6 characters.  This must
 ;;^DIST(.404,.402011,40,12,21,3,0)
 ;;=be entered without a leading up-arrow, and cannot begin with "DI".
 ;;^DIST(.404,.402011,40,12,21,4,0)
 ;;=
 ;;^DIST(.404,.402011,40,12,21,5,0)
 ;;=This will become the namespace of the compiled routine(s).
 ;;^DIST(.404,.402011,40,12,21,6,0)
 ;;=
 ;;^DIST(.404,.402011,40,12,21,7,0)
 ;;=If a NEW routine name is entered, but the cross-references are not
 ;;^DIST(.404,.402011,40,12,21,8,0)
 ;;=compiled at this time, the routine name will be automatically deleted.
 ;;^DIST(.404,.402011,40,12,21,9,0)
 ;;=
 ;;^DIST(.404,.402011,40,12,21,10,0)
 ;;=If the routine name is deleted, the cross-references are considered
 ;;^DIST(.404,.402011,40,12,21,11,0)
 ;;=un-compiled, and FileMan will not use the routine for re-indexing.
 ;;^DIST(.404,.402011,40,13,0)
 ;;=1.8^DEVELOPER^3
 ;;^DIST(.404,.402011,40,13,1)
 ;;=20
 ;;^DIST(.404,.402011,40,13,2)
 ;;=5,36^35^5,25
 ;;^DIST(.404,.402011,40,15,0)
 ;;=1.2^Select APPLICATION GROUP^3
 ;;^DIST(.404,.402011,40,15,1)
 ;;=10
 ;;^DIST(.404,.402011,40,15,2)
 ;;=4,36^5^4,10
 ;;^DIST(.404,.402011,40,16,0)
 ;;=.1^^4^^NUMBER
 ;;^DIST(.404,.402011,40,16,2)
 ;;=3,49^18
 ;;^DIST(.404,.402011,40,16,30)
 ;;=S Y="(File # "_DA_")"
 ;;^DIST(.404,.402011,40,17,0)
 ;;=.2^FILE NAME^2^^NAME
 ;;^DIST(.404,.402011,40,17,2)
 ;;=2,12^45^2,1
 ;;^DIST(.404,.402011,40,17,3)
 ;;=!M
 ;;^DIST(.404,.402011,40,17,3.1)
 ;;=S Y=$P($G(^DIC(DA,0)),U)
 ;;^DIST(.404,.402011,40,17,13)
 ;;=I X="" S DDACT="EX"
 ;;^DIST(.404,.402011,40,17,20)
 ;;=F^^3:45
 ;;^DIST(.404,.402011,40,18,0)
 ;;=13^^4^^FORMERLY COMPILED AS
 ;;^DIST(.404,.402011,40,18,2)
 ;;=17,37^31
 ;;^DIST(.404,.402011,40,18,30)
 ;;=S Y="" I '$D(^DD(DA,0,"DIK")) S Y=$G(^("DIKOLD")) S:Y]"" Y="(formerly compiled as '"_Y_"')"
 ;;^DIST(.404,.403011,0)
 ;;=DDGF BLOCK EDIT 1^.4032
 ;;^DIST(.404,.403011,11)
 ;;=I $$GET^DDSVAL(DIE,.DA,3)="d" D UNED^DDSUTL("DISABLE NAVIGATION","DDGF BLOCK EDIT 2","",1)
 ;;^DIST(.404,.403011,40,0)
 ;;=^.4044I^10^8
 ;;^DIST(.404,.403011,40,1,0)
 ;;=1^ Block Properties Stored in FORM File ^1
 ;;^DIST(.404,.403011,40,1,2)
 ;;=^^1,20^1
 ;;^DIST(.404,.403011,40,2,0)
 ;;=3^BLOCK ORDER^3
 ;;^DIST(.404,.403011,40,2,1)
 ;;=1
 ;;^DIST(.404,.403011,40,2,2)
 ;;=3,69^4^3,56
 ;;^DIST(.404,.403011,40,2,4)
 ;;=1
 ;;^DIST(.404,.403011,40,3,0)
 ;;=4^TYPE OF BLOCK^3
 ;;^DIST(.404,.403011,40,3,1)
 ;;=3
 ;;^DIST(.404,.403011,40,3,2)
 ;;=4,18^7^4,3
 ;;^DIST(.404,.403011,40,3,4)
 ;;=1
 ;;^DIST(.404,.403011,40,3,13)
 ;;=D:X="d" PUT^DDSVAL(.404,$$GET^DDSVAL(DIE,.DA,.01),2,"") D UNED^DDSUTL("DISABLE NAVIGATION","DDGF BLOCK EDIT 2","",$E(1,X="d"))
 ;;^DIST(.404,.403011,40,5,0)
 ;;=6^POINTER LINK^3
 ;;^DIST(.404,.403011,40,5,1)
 ;;=4
 ;;^DIST(.404,.403011,40,5,2)
 ;;=6,18^57^6,4
 ;;^DIST(.404,.403011,40,6,0)
 ;;=2^BLOCK NAME^3
 ;;^DIST(.404,.403011,40,6,1)
 ;;=.01
 ;;^DIST(.404,.403011,40,6,2)
 ;;=3,18^30^3,6
 ;;^DIST(.404,.403011,40,8,0)
 ;;=7^PRE ACTION^3
 ;;^DIST(.404,.403011,40,8,1)
 ;;=11
 ;;^DIST(.404,.403011,40,8,2)
 ;;=7,18^57^7,6
 ;;^DIST(.404,.403011,40,9,0)
 ;;=9^POST ACTION^3
 ;;^DIST(.404,.403011,40,9,1)
 ;;=12
 ;;^DIST(.404,.403011,40,9,2)
 ;;=8,18^57^8,5
 ;;^DIST(.404,.403011,40,10,0)
 ;;=5^OTHER PARAMETERS...^2
 ;;^DIST(.404,.403011,40,10,2)
 ;;=4,69^1^4,49^1
 ;;^DIST(.404,.403011,40,10,7)
 ;;=^11
 ;;^DIST(.404,.403011,40,10,20)
 ;;=F^^0:0
 ;;^DIST(.404,.403011,40,10,21,0)
 ;;=^^1^1^2940928
 ;;^DIST(.404,.403011,40,10,21,1,0)
 ;;=Press <RET> to edit additional properties of the block
 ;;^DIST(.404,.403012,0)
 ;;=DDGF BLOCK EDIT 2^.404
 ;;^DIST(.404,.403012,40,0)
 ;;=^.4044I^7^7
 ;;^DIST(.404,.403012,40,1,0)
 ;;=1^----------------- Block Properties Stored in BLOCK File ------------------^1
 ;;^DIST(.404,.403012,40,1,2)
 ;;=^^1,2^1
 ;;^DIST(.404,.403012,40,2,0)
 ;;=2^NAME^2
 ;;^DIST(.404,.403012,40,2,2)
 ;;=3,16^30^3,10
 ;;^DIST(.404,.403012,40,2,3)
 ;;=!M
 ;;^DIST(.404,.403012,40,2,3.1)
 ;;=S Y=DDGFBKNO
 ;;^DIST(.404,.403012,40,2,20)
 ;;=DD^^.404,.01
 ;;^DIST(.404,.403012,40,2,23)
 ;;=S DDGFBKNN=X
 ;;^DIST(.404,.403012,40,3,0)
 ;;=3^DESCRIPTION (WP)^3
 ;;^DIST(.404,.403012,40,3,1)
 ;;=15
 ;;^DIST(.404,.403012,40,3,2)
 ;;=3,69^1^3,51
 ;;^DIST(.404,.403012,40,4,0)
 ;;=4^DD NUMBER^3
 ;;^DIST(.404,.403012,40,4,1)
 ;;=1
 ;;^DIST(.404,.403012,40,4,2)
 ;;=4,16^16^4,5
 ;;^DIST(.404,.403012,40,5,0)
 ;;=5^DISABLE NAVIGATION^3
 ;;^DIST(.404,.403012,40,5,1)
 ;;=2
 ;;^DIST(.404,.403012,40,5,2)
 ;;=4,69^5^4,49
 ;;^DIST(.404,.403012,40,6,0)
 ;;=6^PRE ACTION^3
 ;;^DIST(.404,.403012,40,6,1)
 ;;=11
 ;;^DIST(.404,.403012,40,6,2)
 ;;=6,16^59^6,4
 ;;^DIST(.404,.403012,40,7,0)
 ;;=7^POST ACTION^3
 ;;^DIST(.404,.403012,40,7,1)
 ;;=12
 ;;^DIST(.404,.403012,40,7,2)
 ;;=7,16^59^7,3
 ;;^DIST(.404,.403013,0)
 ;;=DDGF BLOCK EDIT OTHER^.4032
 ;;^DIST(.404,.403013,11)
 ;;=I $$GET^DDSVAL(DIE,.DA,"REPLICATION")<2 N DDGFZ F DDGFZ="INDEX","INITIAL POSITION","DISALLOW LAYGO","FIELD FOR SELECTION","ASK 'OK'","COMPUTED MULTIPLE","COMPUTED MUL PTR" D UNED^DDSUTL(DDGFZ,"","",1)
 ;;^DIST(.404,.403013,40,0)
 ;;=^.4044I^9^9
 ;;^DIST(.404,.403013,40,1,0)
 ;;=1^ Other Block Parameters ^1
 ;;^DIST(.404,.403013,40,1,2)
 ;;=^^1,16
 ;;^DIST(.404,.403013,40,2,0)
 ;;=2^BLOCK COORDINATE^2
 ;;^DIST(.404,.403013,40,2,2)
 ;;=3,24^7^3,6
 ;;^DIST(.404,.403013,40,2,3)
 ;;=!M
 ;;^DIST(.404,.403013,40,2,3.1)
 ;;=S Y=DDGFBKCO
 ;;^DIST(.404,.403013,40,2,4)
 ;;=1
 ;;^DIST(.404,.403013,40,2,20)
 ;;=DD^^.4032,2
 ;;^DIST(.404,.403013,40,2,23)
 ;;=S DDGFBKCN=X

DINIT0FG
DINIT0FG ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;1NOV2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FH S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.403013,40,3,0)
 ;;=3^Parameters for Repeating Blocks^1
 ;;^DIST(.404,.403013,40,3,2)
 ;;=^^5,3
 ;;^DIST(.404,.403013,40,4,0)
 ;;=4^REPLICATION^3
 ;;^DIST(.404,.403013,40,4,1)
 ;;=5
 ;;^DIST(.404,.403013,40,4,2)
 ;;=6,24^3^6,11
 ;;^DIST(.404,.403013,40,4,13)
 ;;=Q:DDSOLD>1&(X>1)  N DDGFZ F DDGFZ="INDEX","INITIAL POSITION","DISALLOW LAYGO","FIELD FOR SELECTION","ASK 'OK'","COMPUTED MULTIPLE","COMPUTED MUL PTR" D UNED^DDSUTL(DDGFZ,"","",X<2) D:X<2 PUT^DDSVAL(DIE,.DA,DDGFZ)
 ;;^DIST(.404,.403013,40,5,0)
 ;;=5^INDEX^3
 ;;^DIST(.404,.403013,40,5,1)
 ;;=6
 ;;^DIST(.404,.403013,40,5,2)
 ;;=7,24^30^7,17
 ;;^DIST(.404,.403013,40,5,13)
 ;;=Q:X=""  N DDGFZ F DDGFZ="COMPUTED MULTIPLE","COMPUTED MUL PTR" D UNED^DDSUTL(DDGFZ,"","",X<2) D:X<2 PUT^DDSVAL(DIE,.DA,DDGFZ) ;IF THERE'S AN INDEX, COMPUTED MULTIPLE NOT ENTERABLE
 ;;^DIST(.404,.403013,40,6,0)
 ;;=6^INITIAL POSITION^3
 ;;^DIST(.404,.403013,40,6,1)
 ;;=7
 ;;^DIST(.404,.403013,40,6,2)
 ;;=8,24^15^8,6
 ;;^DIST(.404,.403013,40,7,0)
 ;;=7^DISALLOW LAYGO^3
 ;;^DIST(.404,.403013,40,7,1)
 ;;=8
 ;;^DIST(.404,.403013,40,7,2)
 ;;=9,24^3^9,8
 ;;^DIST(.404,.403013,40,8,0)
 ;;=8^FIELD FOR SELECTION^3
 ;;^DIST(.404,.403013,40,8,1)
 ;;=9
 ;;^DIST(.404,.403013,40,8,2)
 ;;=10,24^30^10,3
 ;;^DIST(.404,.403013,40,9,0)
 ;;=9^ASK 'OK'^3
 ;;^DIST(.404,.403013,40,9,1)
 ;;=10
 ;;^DIST(.404,.403013,40,9,2)
 ;;=11,24^3^11,14
 ;;^DIST(.404,.403013,40,98,0)
 ;;=98^COMPUTED MULTIPLE^3
 ;;^DIST(.404,.403013,40,98,1)
 ;;=98
 ;;^DIST(.404,.403013,40,98,2)
 ;;=12,24^30^12,5
 ;;^DIST(.404,.403013,40,98,13)
 ;;=D PUT^DDSVAL(DIE,.DA,"INDEX")
 ;;^DIST(.404,.403013,40,98.1,0)
 ;;=98.1^COMPUTED MUL PTR^3
 ;;^DIST(.404,.403013,40,98.1,1)
 ;;=98.1
 ;;^DIST(.404,.403013,40,98.1,2)
 ;;=13,24^18^13,6
 ;;^DIST(.404,.403021,0)
 ;;=DDGF PAGE ADD^.4031
 ;;^DIST(.404,.403021,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.403021,40,1,0)
 ;;=1^NEW PAGE NUMBER^2
 ;;^DIST(.404,.403021,40,1,2)
 ;;=3,20^5^3,3
 ;;^DIST(.404,.403021,40,1,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.403021,40,1,20)
 ;;=DD^^.4031,.01
 ;;^DIST(.404,.403021,40,1,23)
 ;;=S DDGFPNUM=X
 ;;^DIST(.404,.403022,0)
 ;;=DDGF PAGE ADD ARE YOU SURE^.4031
 ;;^DIST(.404,.403022,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.403022,40,1,0)
 ;;=1^!M^1
 ;;^DIST(.404,.403022,40,1,.1)
 ;;=S Y="Are you adding Page "_DDGFPNUM
 ;;^DIST(.404,.403022,40,1,2)
 ;;=^^3,3
 ;;^DIST(.404,.403022,40,2,0)
 ;;=2^as a new page on this form?^2
 ;;^DIST(.404,.403022,40,2,2)
 ;;=4,31^3^4,3^1
 ;;^DIST(.404,.403022,40,2,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.403022,40,2,20)
 ;;=Y
 ;;^DIST(.404,.403022,40,2,23)
 ;;=S DDGFANS=X
 ;;^DIST(.404,.403031,0)
 ;;=DDGF PAGE EDIT^.4031
 ;;^DIST(.404,.403031,40,0)
 ;;=^.4044I^16^13
 ;;^DIST(.404,.403031,40,1,0)
 ;;=1^ Page Properties ^1
 ;;^DIST(.404,.403031,40,1,2)
 ;;=^^1,27
 ;;^DIST(.404,.403031,40,2,0)
 ;;=2^PAGE NUMBER^3
 ;;^DIST(.404,.403031,40,2,1)
 ;;=.01
 ;;^DIST(.404,.403031,40,2,2)
 ;;=3,21^5^3,8
 ;;^DIST(.404,.403031,40,4,0)
 ;;=4^HEADER BLOCK^3
 ;;^DIST(.404,.403031,40,4,1)
 ;;=1
 ;;^DIST(.404,.403031,40,4,2)
 ;;=5,21^30^5,7
 ;;^DIST(.404,.403031,40,5,0)
 ;;=8^NEXT PAGE^3
 ;;^DIST(.404,.403031,40,5,1)
 ;;=3
 ;;^DIST(.404,.403031,40,5,2)
 ;;=9,21^5^9,10
 ;;^DIST(.404,.403031,40,6,0)
 ;;=9^PREVIOUS PAGE^3
 ;;^DIST(.404,.403031,40,6,1)
 ;;=4
 ;;^DIST(.404,.403031,40,6,2)
 ;;=10,21^5^10,6
 ;;^DIST(.404,.403031,40,7,0)
 ;;=12^PRE ACTION^3
 ;;^DIST(.404,.403031,40,7,1)
 ;;=11
 ;;^DIST(.404,.403031,40,7,2)
 ;;=14,21^53^14,9
 ;;^DIST(.404,.403031,40,8,0)
 ;;=13^POST ACTION^3
 ;;^DIST(.404,.403031,40,8,1)
 ;;=12
 ;;^DIST(.404,.403031,40,8,2)
 ;;=15,21^53^15,8
 ;;^DIST(.404,.403031,40,9,0)
 ;;=11^DESCRIPTION (WP)^3
 ;;^DIST(.404,.403031,40,9,1)
 ;;=15
 ;;^DIST(.404,.403031,40,9,2)
 ;;=13,21^1^13,3
 ;;^DIST(.404,.403031,40,12,0)
 ;;=10^PARENT FIELD^3
 ;;^DIST(.404,.403031,40,12,1)
 ;;=8
 ;;^DIST(.404,.403031,40,12,2)
 ;;=11,21^53^11,7
 ;;^DIST(.404,.403031,40,13,0)
 ;;=6^IS THIS A POP UP PAGE?^2
 ;;^DIST(.404,.403031,40,13,2)
 ;;=7,67^3^7,44^1
 ;;^DIST(.404,.403031,40,13,3)
 ;;=!M
 ;;^DIST(.404,.403031,40,13,3.1)
 ;;=S:$G(DDGFLRC)]"" Y=1
 ;;^DIST(.404,.403031,40,13,13)
 ;;=N LRC,PP,NP S LRC="LOWER RIGHT COORDINATE",PP="PREVIOUS PAGE",NP="NEXT PAGE" D:X PUT^DDSVALF(LRC,"","","15,75"):$$GET^DDSVALF(LRC)="" D:'X PUT^DDSVALF(LRC) N PG F PG=NP,PP D UNED^DDSUTL(PG,"","",$E(1,X)) D:X PUT^DDSVAL(DIE,.DA,PG)
 ;;^DIST(.404,.403031,40,13,20)
 ;;=DD^^.4031,5
 ;;^DIST(.404,.403031,40,14,0)
 ;;=5^PAGE COORDINATE^2
 ;;^DIST(.404,.403031,40,14,2)
 ;;=7,21^7^7,4
 ;;^DIST(.404,.403031,40,14,3)
 ;;=!M
 ;;^DIST(.404,.403031,40,14,3.1)
 ;;=S Y=$G(DDGFTLC0)
 ;;^DIST(.404,.403031,40,14,4)
 ;;=1
 ;;^DIST(.404,.403031,40,14,20)
 ;;=DD^^.4031,2
 ;;^DIST(.404,.403031,40,14,23)
 ;;=S DDGFTLC=X
 ;;^DIST(.404,.403031,40,15,0)
 ;;=7^LOWER RIGHT COORDINATE^2
 ;;^DIST(.404,.403031,40,15,2)
 ;;=8,67^7^8,43
 ;;^DIST(.404,.403031,40,15,3)
 ;;=!M
 ;;^DIST(.404,.403031,40,15,3.1)
 ;;=S Y=$G(DDGFLRC0)
 ;;^DIST(.404,.403031,40,15,13)
 ;;=I DDSOLD=""!(X="") D PUT^DDSVALF("IS THIS A POP UP PAGE?","","",$S(X="":"",1:1),"I") N PG,NP,PP S NP="NEXT PAGE",PP="PREVIOUS PAGE" F PG=NP,PP D UNED^DDSUTL(PG,"","",$E(1,X]"")) D:X]"" PUT^DDSVAL(DIE,.DA,PG)
 ;;^DIST(.404,.403031,40,15,20)
 ;;=DD^^.4031,6
 ;;^DIST(.404,.403031,40,15,23)
 ;;=S DDGFLRC=X
 ;;^DIST(.404,.403031,40,16,0)
 ;;=3^PAGE NAME^2
 ;;^DIST(.404,.403031,40,16,2)
 ;;=4,21^30^4,10
 ;;^DIST(.404,.403031,40,16,3)
 ;;=!M
 ;;^DIST(.404,.403031,40,16,3.1)
 ;;=S Y=$G(DDGFPNM0)
 ;;^DIST(.404,.403031,40,16,4)
 ;;=1
 ;;^DIST(.404,.403031,40,16,20)
 ;;=DD^^.4031,7
 ;;^DIST(.404,.403031,40,16,23)
 ;;=S DDGFPNM=X
 ;;^DIST(.404,.403041,0)
 ;;=DDGF PAGE SELECT^.4031
 ;;^DIST(.404,.403041,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.403041,40,1,0)
 ;;=1^Select PAGE^2
 ;;^DIST(.404,.403041,40,1,2)
 ;;=1,14^30^1,1
 ;;^DIST(.404,.403041,40,1,3)
 ;;=!M
 ;;^DIST(.404,.403041,40,1,3.1)
 ;;=S Y=$P(^DIST(.403,+DDGFFM,40,DDGFPAGE,0),U)
 ;;^DIST(.404,.403041,40,1,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.403041,40,1,20)
 ;;=P^^DIST(.403,+DDGFFM,40,:QEAMZF
 ;;^DIST(.404,.403041,40,1,23)
 ;;=S DDGFPAGE=X
 ;;^DIST(.404,.403051,0)
 ;;=DDGF FORM EDIT^.403
 ;;^DIST(.404,.403051,40,0)
 ;;=^.4044I^11^11
 ;;^DIST(.404,.403051,40,1,0)
 ;;=1^ Form Properties ^1
 ;;^DIST(.404,.403051,40,1,2)
 ;;=^^1,29
 ;;^DIST(.404,.403051,40,2,0)
 ;;=2^NAME^3
 ;;^DIST(.404,.403051,40,2,1)
 ;;=.01
 ;;^DIST(.404,.403051,40,2,2)
 ;;=3,20^30^3,14
 ;;^DIST(.404,.403051,40,2,4)
 ;;=1
 ;;^DIST(.404,.403051,40,3,0)
 ;;=4^PRE ACTION^3
 ;;^DIST(.404,.403051,40,3,1)
 ;;=11
 ;;^DIST(.404,.403051,40,3,2)
 ;;=6,20^54^6,8
 ;;^DIST(.404,.403051,40,4,0)
 ;;=5^POST ACTION^3
 ;;^DIST(.404,.403051,40,4,1)
 ;;=12
 ;;^DIST(.404,.403051,40,4,2)
 ;;=7,20^54^7,7
 ;;^DIST(.404,.403051,40,5,0)
 ;;=8^DESCRIPTION^3
 ;;^DIST(.404,.403051,40,5,1)
 ;;=15
 ;;^DIST(.404,.403051,40,5,2)
 ;;=11,20^1^11,7
 ;;^DIST(.404,.403051,40,6,0)
 ;;=6^DATA VALIDATION^3
 ;;^DIST(.404,.403051,40,6,1)
 ;;=20
 ;;^DIST(.404,.403051,40,6,2)
 ;;=8,20^54^8,3
 ;;^DIST(.404,.403051,40,7,0)
 ;;=9^RECORD SELECTION PAGE^3
 ;;^DIST(.404,.403051,40,7,1)
 ;;=21
 ;;^DIST(.404,.403051,40,7,2)
 ;;=11,69^5^11,46
 ;;^DIST(.404,.403051,40,8,0)
 ;;=7^POST SAVE^3
 ;;^DIST(.404,.403051,40,8,1)
 ;;=14
 ;;^DIST(.404,.403051,40,8,2)
 ;;=9,20^54^9,9
 ;;^DIST(.404,.403051,40,9,0)
 ;;=3^TITLE^3
 ;;^DIST(.404,.403051,40,9,1)
 ;;=6

DINIT0FH
DINIT0FH ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FI S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.403051,40,9,2)
 ;;=4,20^50^4,13
 ;;^DIST(.404,.403051,40,10,0)
 ;;=10^READ ACCESS^3
 ;;^DIST(.404,.403051,40,10,1)
 ;;=1
 ;;^DIST(.404,.403051,40,10,2)
 ;;=13,20^15^13,7
 ;;^DIST(.404,.403051,40,11,0)
 ;;=11^WRITE ACCESS^3
 ;;^DIST(.404,.403051,40,11,1)
 ;;=2
 ;;^DIST(.404,.403051,40,11,2)
 ;;=14,20^15^14,6
 ;;^DIST(.404,.403061,0)
 ;;=DDGF HEADER BLOCK EDIT^.4031
 ;;^DIST(.404,.403061,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.403061,40,1,0)
 ;;=2^HEADER BLOCK^3
 ;;^DIST(.404,.403061,40,1,1)
 ;;=1
 ;;^DIST(.404,.403061,40,1,2)
 ;;=3,17^30^3,3
 ;;^DIST(.404,.403061,40,1,13)
 ;;=D:X]"" PUT^DDSVALF("NAME","DDGF BLOCK EDIT 2","",DDSEXT,"I")
 ;;^DIST(.404,.403061,40,1,14)
 ;;=D HBVAL^DDGFU
 ;;^DIST(.404,.403061,40,2,0)
 ;;=1^ Edit Header Block Parameters ^1
 ;;^DIST(.404,.403061,40,2,2)
 ;;=^^1,24
 ;;^DIST(.404,.404011,0)
 ;;=DDGF FIELD ADD
 ;;^DIST(.404,.404011,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.404011,40,1,0)
 ;;=1^Select BLOCK^2
 ;;^DIST(.404,.404011,40,1,2)
 ;;=1,15^30^1,1
 ;;^DIST(.404,.404011,40,1,3)
 ;;=!M
 ;;^DIST(.404,.404011,40,1,3.1)
 ;;=N X,DA,DIC S DA(2)=+DDGFFM,DA(1)=+DDGFPG,X=" ",DIC="^DIST(.403,"_DA(2)_",""40"","_DA(1)_",""40"",",DIC(0)="M" D ^DIC S Y=$S(Y=-1:"",1:"`"_+Y) I Y="",$P($G(^DIST(.403,+DDGFFM,40,+DDGFPG,40,0)),U,4)=1 S Y=+$O(^(0)),Y=$S(Y:"`"_Y,1:"")
 ;;^DIST(.404,.404011,40,1,13)
 ;;=I X]"" D PUT^DDSVALF("FIELD ORDER","","",$O(^DIST(.404,X,40,"B",""),-1)+1\1) D:$D(DUZ)#2 RECALL^DILFD(.4032,X_","_+DDGFPG_","_+DDGFFM_",",DUZ),RECALL^DILFD(.404,X_",",DUZ)
 ;;^DIST(.404,.404011,40,1,20)
 ;;=P^^DIST(.403,+DDGFFM,40,+DDGFPG,40,:QEAFMZ
 ;;^DIST(.404,.404011,40,1,23)
 ;;=S DDGFBLCK=X
 ;;^DIST(.404,.404011,40,2,0)
 ;;=2^FIELD ORDER^2
 ;;^DIST(.404,.404011,40,2,2)
 ;;=2,15^4^2,2
 ;;^DIST(.404,.404011,40,2,3)
 ;;=!M
 ;;^DIST(.404,.404011,40,2,3.1)
 ;;=N V S V=$$GET^DDSVALF("BLOCK") I V]"" S Y=$O(^DIST(.404,V,40,"B",""),-1)+1\1
 ;;^DIST(.404,.404011,40,2,20)
 ;;=N^^0:99.9:1
 ;;^DIST(.404,.404011,40,2,21,0)
 ;;=^^1^1^2940630
 ;;^DIST(.404,.404011,40,2,21,1,0)
 ;;=This must be a number not already used
 ;;^DIST(.404,.404011,40,2,22)
 ;;=N V S V=$$GET^DDSVALF("BLOCK") I V]"",$O(^DIST(.404,V,40,"B",X,""))]"" K X
 ;;^DIST(.404,.404011,40,2,23)
 ;;=S DDGFFORD=X
 ;;^DIST(.404,.404011,40,3,0)
 ;;=3^FIELD TYPE^2
 ;;^DIST(.404,.404011,40,3,2)
 ;;=3,15^30^3,3
 ;;^DIST(.404,.404011,40,3,3)
 ;;=DATA DICTIONARY
 ;;^DIST(.404,.404011,40,3,20)
 ;;=DD^^.4044,2
 ;;^DIST(.404,.404011,40,3,23)
 ;;=S DDGFTYPE=X
 ;;^DIST(.404,.404021,0)
 ;;=DDGF FIELD CAPTION ONLY^.4044
 ;;^DIST(.404,.404021,40,0)
 ;;=^.4044I^9^6
 ;;^DIST(.404,.404021,40,1,0)
 ;;=1^ Caption-Only Field Properties ^1
 ;;^DIST(.404,.404021,40,1,2)
 ;;=^^1,22
 ;;^DIST(.404,.404021,40,2,0)
 ;;=2^FIELD ORDER^3
 ;;^DIST(.404,.404021,40,2,1)
 ;;=.01
 ;;^DIST(.404,.404021,40,2,2)
 ;;=3,21^4^3,8
 ;;^DIST(.404,.404021,40,6,0)
 ;;=3^CAPTION^2
 ;;^DIST(.404,.404021,40,6,2)
 ;;=4,21^50^4,12
 ;;^DIST(.404,.404021,40,6,3)
 ;;=!M
 ;;^DIST(.404,.404021,40,6,3.1)
 ;;=S Y=DDGFCAP0
 ;;^DIST(.404,.404021,40,6,4)
 ;;=1
 ;;^DIST(.404,.404021,40,6,13)
 ;;=D:DDSOLD="!M" PUT^DDSVAL(.4044,.DA,1.1,"")
 ;;^DIST(.404,.404021,40,6,20)
 ;;=DD^^.4044,1
 ;;^DIST(.404,.404021,40,6,23)
 ;;=S DDGFCAP=X
 ;;^DIST(.404,.404021,40,7,0)
 ;;=5^EXECUTABLE CAPTION^3
 ;;^DIST(.404,.404021,40,7,1)
 ;;=1.1
 ;;^DIST(.404,.404021,40,7,2)
 ;;=7,21^50^7,1
 ;;^DIST(.404,.404021,40,7,13)
 ;;=D PUT^DDSVALF("CAPTION","","",$S(X="":"",1:"!M"))
 ;;^DIST(.404,.404021,40,8,0)
 ;;=6^CAPTION COORDINATE^2
 ;;^DIST(.404,.404021,40,8,2)
 ;;=8,21^7^8,1
 ;;^DIST(.404,.404021,40,8,3)
 ;;=!M
 ;;^DIST(.404,.404021,40,8,3.1)
 ;;=S Y=DDGFCC0
 ;;^DIST(.404,.404021,40,8,4)
 ;;=1
 ;;^DIST(.404,.404021,40,8,20)
 ;;=DD^^.4044,5.1
 ;;^DIST(.404,.404021,40,8,23)
 ;;=S DDGFCC=X
 ;;^DIST(.404,.404021,40,9,0)
 ;;=4^UNIQUE NAME^3
 ;;^DIST(.404,.404021,40,9,1)
 ;;=3.1
 ;;^DIST(.404,.404021,40,9,2)
 ;;=5,21^50^5,8
 ;;^DIST(.404,.404031,0)
 ;;=DDGF FIELD DD^.4044
 ;;^DIST(.404,.404031,40,0)
 ;;=^.4044I^17^14
 ;;^DIST(.404,.404031,40,1,0)
 ;;=1^ Data Dictionary Field Properties ^1
 ;;^DIST(.404,.404031,40,1,2)
 ;;=^^1,22
 ;;^DIST(.404,.404031,40,2,0)
 ;;=2^FIELD ORDER^3
 ;;^DIST(.404,.404031,40,2,1)
 ;;=.01
 ;;^DIST(.404,.404031,40,2,2)
 ;;=3,26^4^3,13
 ;;^DIST(.404,.404031,40,3,0)
 ;;=3^FIELD^3
 ;;^DIST(.404,.404031,40,3,1)
 ;;=4
 ;;^DIST(.404,.404031,40,3,2)
 ;;=3,66^10^3,59
 ;;^DIST(.404,.404031,40,3,4)
 ;;=1
 ;;^DIST(.404,.404031,40,3,13)
 ;;=D POSTCH1^DDGFU
 ;;^DIST(.404,.404031,40,5,0)
 ;;=8^DEFAULT^3
 ;;^DIST(.404,.404031,40,5,1)
 ;;=6
 ;;^DIST(.404,.404031,40,5,2)
 ;;=8,26^50^8,17
 ;;^DIST(.404,.404031,40,5,13)
 ;;=D:DDSOLD="!M" PUT^DDSVAL(.4044,.DA,6.01,"")
 ;;^DIST(.404,.404031,40,7,0)
 ;;=11^BRANCHING LOGIC^3
 ;;^DIST(.404,.404031,40,7,1)
 ;;=10
 ;;^DIST(.404,.404031,40,7,2)
 ;;=12,26^50^12,9
 ;;^DIST(.404,.404031,40,8,0)
 ;;=12^PRE ACTION^3
 ;;^DIST(.404,.404031,40,8,1)
 ;;=11
 ;;^DIST(.404,.404031,40,8,2)
 ;;=13,26^50^13,14
 ;;^DIST(.404,.404031,40,9,0)
 ;;=13^POST ACTION^3
 ;;^DIST(.404,.404031,40,9,1)
 ;;=12
 ;;^DIST(.404,.404031,40,9,2)
 ;;=14,26^50^14,13
 ;;^DIST(.404,.404031,40,10,0)
 ;;=14^POST ACTION ON CHANGE^3
 ;;^DIST(.404,.404031,40,10,1)
 ;;=13
 ;;^DIST(.404,.404031,40,10,2)
 ;;=15,26^50^15,3
 ;;^DIST(.404,.404031,40,12,0)
 ;;=10^EXECUTABLE DEFAULT^3
 ;;^DIST(.404,.404031,40,12,1)
 ;;=6.01
 ;;^DIST(.404,.404031,40,12,2)
 ;;=10,26^50^10,6
 ;;^DIST(.404,.404031,40,12,13)
 ;;=D PUT^DDSVAL(.4044,.DA,6,$S(X="":"",1:"!M"))
 ;;^DIST(.404,.404031,40,13,0)
 ;;=4^OTHER PARAMETERS...^2
 ;;^DIST(.404,.404031,40,13,2)
 ;;=4,26^1^4,6^1
 ;;^DIST(.404,.404031,40,13,10)
 ;;=N DDGFFLD,DDGFSUB S DDSSTACK=11,DDGFFLD=$$GET^DDSVAL(.4044,.DA,4) I DDGFFLD S DDGFSUB=+$P($G(^DD(DDGFDD,DDGFFLD,0)),U,2) S:DDGFSUB DDSSTACK=$S(DDGFSUB_$P($G(^DD(DDGFSUB,.01,0)),U,2)'["W":21,1:31)
 ;;^DIST(.404,.404031,40,13,20)
 ;;=F^^0:0
 ;;^DIST(.404,.404031,40,13,21,0)
 ;;=^^1^1^2940928
 ;;^DIST(.404,.404031,40,13,21,1,0)
 ;;=Press <RET> to edit additional properties of this Data Dictionary field
 ;;^DIST(.404,.404031,40,14,0)
 ;;=7^CAPTION^2
 ;;^DIST(.404,.404031,40,14,2)
 ;;=7,26^50^7,17
 ;;^DIST(.404,.404031,40,14,3)
 ;;=!M
 ;;^DIST(.404,.404031,40,14,3.1)
 ;;=S Y=DDGFCAP0
 ;;^DIST(.404,.404031,40,14,13)
 ;;=D DDCAP^DDGFU
 ;;^DIST(.404,.404031,40,14,20)
 ;;=DD^^.4044,1
 ;;^DIST(.404,.404031,40,14,23)
 ;;=S DDGFCAP=X
 ;;^DIST(.404,.404031,40,15,0)
 ;;=5^SUPPRESS COLON AFTER CAPTION?^2
 ;;^DIST(.404,.404031,40,15,2)
 ;;=4,66^3^4,36^1
 ;;^DIST(.404,.404031,40,15,3)
 ;;=!M
 ;;^DIST(.404,.404031,40,15,3.1)
 ;;=S Y=DDGFSUP0

DINIT0FI
DINIT0FI ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;3:27 PM  20 Apr 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FJ S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.404031,40,15,20)
 ;;=DD^^.4044,5.2
 ;;^DIST(.404,.404031,40,15,23)
 ;;=S DDGFSUP=X
 ;;^DIST(.404,.404031,40,16,0)
 ;;=6^UNIQUE NAME^3
 ;;^DIST(.404,.404031,40,16,1)
 ;;=3.1
 ;;^DIST(.404,.404031,40,16,2)
 ;;=5,26^50^5,13
 ;;^DIST(.404,.404031,40,17,0)
 ;;=9^EXECUTABLE CAPTION^3
 ;;^DIST(.404,.404031,40,17,1)
 ;;=1.1
 ;;^DIST(.404,.404031,40,17,2)
 ;;=9,26^50^9,6
 ;;^DIST(.404,.404031,40,17,13)
 ;;=D PUT^DDSVALF("CAPTION","","",$S(X="":"",1:"!M"),"I")
 ;;^DIST(.404,.404032,0)
 ;;=DDGF FIELD DD OTHER SINGLE^.4044
 ;;^DIST(.404,.404032,40,0)
 ;;=^.4044I^13^10
 ;;^DIST(.404,.404032,40,1,0)
 ;;=1^ Other Parameters ^1
 ;;^DIST(.404,.404032,40,1,2)
 ;;=^^1,27
 ;;^DIST(.404,.404032,40,2,0)
 ;;=2^REQUIRED^3
 ;;^DIST(.404,.404032,40,2,1)
 ;;=6.1
 ;;^DIST(.404,.404032,40,2,2)
 ;;=3,23^3^3,13
 ;;^DIST(.404,.404032,40,3,0)
 ;;=4^DISABLE EDITING^3
 ;;^DIST(.404,.404032,40,3,1)
 ;;=6.4
 ;;^DIST(.404,.404032,40,3,2)
 ;;=4,23^9^4,6
 ;;^DIST(.404,.404032,40,7,0)
 ;;=7^DATA LENGTH^2
 ;;^DIST(.404,.404032,40,7,2)
 ;;=7,23^3^7,10
 ;;^DIST(.404,.404032,40,7,3)
 ;;=!M
 ;;^DIST(.404,.404032,40,7,3.1)
 ;;=S Y=$G(DDGFDL0)
 ;;^DIST(.404,.404032,40,7,4)
 ;;=1
 ;;^DIST(.404,.404032,40,7,20)
 ;;=DD^^.4044,4.2
 ;;^DIST(.404,.404032,40,7,23)
 ;;=S DDGFDL=X
 ;;^DIST(.404,.404032,40,8,0)
 ;;=8^CAPTION COORDINATE^2
 ;;^DIST(.404,.404032,40,8,2)
 ;;=8,23^7^8,3
 ;;^DIST(.404,.404032,40,8,3)
 ;;=!M
 ;;^DIST(.404,.404032,40,8,3.1)
 ;;=S Y=$G(DDGFCC0)
 ;;^DIST(.404,.404032,40,8,20)
 ;;=DD^^.4044,5.1
 ;;^DIST(.404,.404032,40,8,23)
 ;;=S DDGFCC=X
 ;;^DIST(.404,.404032,40,9,0)
 ;;=9^DATA COORDINATE^2
 ;;^DIST(.404,.404032,40,9,2)
 ;;=9,23^7^9,6
 ;;^DIST(.404,.404032,40,9,3)
 ;;=!M
 ;;^DIST(.404,.404032,40,9,3.1)
 ;;=S Y=$G(DDGFDC0)
 ;;^DIST(.404,.404032,40,9,4)
 ;;=1
 ;;^DIST(.404,.404032,40,9,20)
 ;;=DD^^.4044,4.1
 ;;^DIST(.404,.404032,40,9,23)
 ;;=S DDGFDC=X
 ;;^DIST(.404,.404032,40,10,0)
 ;;=10^DATA VALIDATION^3
 ;;^DIST(.404,.404032,40,10,1)
 ;;=14
 ;;^DIST(.404,.404032,40,10,2)
 ;;=11,23^49^11,6
 ;;^DIST(.404,.404032,40,11,0)
 ;;=5^RIGHT JUSTIFY^3
 ;;^DIST(.404,.404032,40,11,1)
 ;;=6.3
 ;;^DIST(.404,.404032,40,11,2)
 ;;=4,52^3^4,37
 ;;^DIST(.404,.404032,40,12,0)
 ;;=6^SUB PAGE LINK^3
 ;;^DIST(.404,.404032,40,12,1)
 ;;=8
 ;;^DIST(.404,.404032,40,12,2)
 ;;=5,23^5^5,8
 ;;^DIST(.404,.404032,40,13,0)
 ;;=3^DISPLAY GROUP^3
 ;;^DIST(.404,.404032,40,13,1)
 ;;=3
 ;;^DIST(.404,.404032,40,13,2)
 ;;=3,52^20^3,37
 ;;^DIST(.404,.404033,0)
 ;;=DDGF FIELD DD OTHER MULTIPLE^.4044
 ;;^DIST(.404,.404033,40,0)
 ;;=^.4044I^12^9
 ;;^DIST(.404,.404033,40,1,0)
 ;;=1^ Other Parameters ^1
 ;;^DIST(.404,.404033,40,1,2)
 ;;=^^1,14^1
 ;;^DIST(.404,.404033,40,2,0)
 ;;=2^SUB PAGE LINK^3
 ;;^DIST(.404,.404033,40,2,1)
 ;;=8
 ;;^DIST(.404,.404033,40,2,2)
 ;;=3,23^3^3,8
 ;;^DIST(.404,.404033,40,3,0)
 ;;=3^DISALLOW LAYGO^3
 ;;^DIST(.404,.404033,40,3,1)
 ;;=6.5
 ;;^DIST(.404,.404033,40,3,2)
 ;;=4,23^3^4,7
 ;;^DIST(.404,.404033,40,7,0)
 ;;=7^CAPTION COORDINATE^2
 ;;^DIST(.404,.404033,40,7,2)
 ;;=10,23^7^10,3
 ;;^DIST(.404,.404033,40,7,3)
 ;;=!M
 ;;^DIST(.404,.404033,40,7,3.1)
 ;;=S Y=$G(DDGFCC0)
 ;;^DIST(.404,.404033,40,7,20)
 ;;=DD^^.4044,5.1
 ;;^DIST(.404,.404033,40,7,23)
 ;;=S DDGFCC=X
 ;;^DIST(.404,.404033,40,8,0)
 ;;=8^DATA COORDINATE^2
 ;;^DIST(.404,.404033,40,8,2)
 ;;=11,23^7^11,6
 ;;^DIST(.404,.404033,40,8,3)
 ;;=!M
 ;;^DIST(.404,.404033,40,8,3.1)
 ;;=S Y=$G(DDGFDC0)
 ;;^DIST(.404,.404033,40,8,4)
 ;;=1
 ;;^DIST(.404,.404033,40,8,20)
 ;;=DD^^.4044,4.1
 ;;^DIST(.404,.404033,40,8,23)
 ;;=S DDGFDC=X
 ;;^DIST(.404,.404033,40,9,0)
 ;;=6^DATA LENGTH^2
 ;;^DIST(.404,.404033,40,9,2)
 ;;=9,23^3^9,10
 ;;^DIST(.404,.404033,40,9,3)
 ;;=!M
 ;;^DIST(.404,.404033,40,9,3.1)
 ;;=S Y=$G(DDGFDL0)
 ;;^DIST(.404,.404033,40,9,4)
 ;;=1
 ;;^DIST(.404,.404033,40,9,20)
 ;;=DD^^.4044,4.2
 ;;^DIST(.404,.404033,40,9,23)
 ;;=S DDGFDL=X
 ;;^DIST(.404,.404033,40,10,0)
 ;;=4^RIGHT JUSTIFY^3
 ;;^DIST(.404,.404033,40,10,1)
 ;;=6.3
 ;;^DIST(.404,.404033,40,10,2)
 ;;=6,23^3^6,8
 ;;^DIST(.404,.404033,40,11,0)
 ;;=5^DISPLAY GROUP^3
 ;;^DIST(.404,.404033,40,11,1)
 ;;=3
 ;;^DIST(.404,.404033,40,11,2)
 ;;=7,23^20^7,8
 ;;^DIST(.404,.404033,40,12,0)
 ;;=4^ASK 'OK'^3
 ;;^DIST(.404,.404033,40,12,1)
 ;;=6.6
 ;;^DIST(.404,.404033,40,12,2)
 ;;=5,23^3^5,13
 ;;^DIST(.404,.404034,0)
 ;;=DDGF FIELD DD OTHER WP^.4044
 ;;^DIST(.404,.404034,40,0)
 ;;=^.4044I^10^7
 ;;^DIST(.404,.404034,40,1,0)
 ;;=1^ Other Parameters ^1
 ;;^DIST(.404,.404034,40,1,2)
 ;;=^^1,14^1
 ;;^DIST(.404,.404034,40,2,0)
 ;;=2^REQUIRED^3
 ;;^DIST(.404,.404034,40,2,1)
 ;;=6.1
 ;;^DIST(.404,.404034,40,2,2)
 ;;=3,23^3^3,13
 ;;^DIST(.404,.404034,40,3,0)
 ;;=3^DISABLE EDITING^3
 ;;^DIST(.404,.404034,40,3,1)
 ;;=6.4
 ;;^DIST(.404,.404034,40,3,2)
 ;;=4,23^3^4,6
 ;;^DIST(.404,.404034,40,3,14)
 ;;=I X=2 D HLP^DDSUTL("Word processing fields are always reachable.  To make the field uneditable, enter 'YES'.") S DDSERROR=1
 ;;^DIST(.404,.404034,40,7,0)
 ;;=4^DISPLAY GROUP^3
 ;;^DIST(.404,.404034,40,7,1)
 ;;=3
 ;;^DIST(.404,.404034,40,7,2)
 ;;=5,23^20^5,8
 ;;^DIST(.404,.404034,40,8,0)
 ;;=5^DATA LENGTH^2
 ;;^DIST(.404,.404034,40,8,2)
 ;;=7,23^3^7,10
 ;;^DIST(.404,.404034,40,8,3)
 ;;=!M
 ;;^DIST(.404,.404034,40,8,3.1)
 ;;=S Y=$G(DDGFDL0)
 ;;^DIST(.404,.404034,40,8,4)
 ;;=1
 ;;^DIST(.404,.404034,40,8,20)
 ;;=DD^^.4044,4.2
 ;;^DIST(.404,.404034,40,8,23)
 ;;=S DDGFDL=X
 ;;^DIST(.404,.404034,40,9,0)
 ;;=6^CAPTION COORDINATE^2
 ;;^DIST(.404,.404034,40,9,2)
 ;;=8,23^7^8,3
 ;;^DIST(.404,.404034,40,9,3)
 ;;=!M
 ;;^DIST(.404,.404034,40,9,3.1)
 ;;=S Y=$G(DDGFCC0)
 ;;^DIST(.404,.404034,40,9,20)
 ;;=DD^^.4044,5.1
 ;;^DIST(.404,.404034,40,9,23)
 ;;=S DDGFCC=X
 ;;^DIST(.404,.404034,40,10,0)
 ;;=7^DATA COORDINATE^2
 ;;^DIST(.404,.404034,40,10,2)
 ;;=9,23^7^9,6
 ;;^DIST(.404,.404034,40,10,3)
 ;;=!M
 ;;^DIST(.404,.404034,40,10,3.1)
 ;;=S Y=$G(DDGFDC0)
 ;;^DIST(.404,.404034,40,10,4)
 ;;=1
 ;;^DIST(.404,.404034,40,10,20)
 ;;=DD^^.4044,4.1
 ;;^DIST(.404,.404034,40,10,23)
 ;;=S DDGFDC=X
 ;;^DIST(.404,.404041,0)
 ;;=DDGF FIELD FORM ONLY^.4044
 ;;^DIST(.404,.404041,40,0)
 ;;=^.4044I^17^14
 ;;^DIST(.404,.404041,40,1,0)
 ;;=1^ Form Only Field Properties ^1
 ;;^DIST(.404,.404041,40,1,2)
 ;;=^^1,25
 ;;^DIST(.404,.404041,40,2,0)
 ;;=2^FIELD ORDER^3
 ;;^DIST(.404,.404041,40,2,1)
 ;;=.01
 ;;^DIST(.404,.404041,40,2,2)
 ;;=3,26^4^3,13
 ;;^DIST(.404,.404041,40,5,0)
 ;;=8^DEFAULT^3
 ;;^DIST(.404,.404041,40,5,1)
 ;;=6
 ;;^DIST(.404,.404041,40,5,2)
 ;;=8,26^50^8,17
 ;;^DIST(.404,.404041,40,5,13)
 ;;=D:X'="!M" PUT^DDSVAL(.4044,.DA,6.01,"")
 ;;^DIST(.404,.404041,40,7,0)
 ;;=11^BRANCHING LOGIC^3
 ;;^DIST(.404,.404041,40,7,1)
 ;;=10
 ;;^DIST(.404,.404041,40,7,2)
 ;;=12,26^50^12,9

DINIT0FJ
DINIT0FJ ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FK S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.404041,40,8,0)
 ;;=12^PRE ACTION^3
 ;;^DIST(.404,.404041,40,8,1)
 ;;=11
 ;;^DIST(.404,.404041,40,8,2)
 ;;=13,26^50^13,14
 ;;^DIST(.404,.404041,40,9,0)
 ;;=13^POST ACTION^3
 ;;^DIST(.404,.404041,40,9,1)
 ;;=12
 ;;^DIST(.404,.404041,40,9,2)
 ;;=14,26^50^14,13
 ;;^DIST(.404,.404041,40,10,0)
 ;;=14^POST ACTION ON CHANGE^3
 ;;^DIST(.404,.404041,40,10,1)
 ;;=13
 ;;^DIST(.404,.404041,40,10,2)
 ;;=15,26^50^15,3
 ;;^DIST(.404,.404041,40,11,0)
 ;;=9^EXECUTABLE CAPTION^3
 ;;^DIST(.404,.404041,40,11,1)
 ;;=1.1
 ;;^DIST(.404,.404041,40,11,2)
 ;;=9,26^50^9,6
 ;;^DIST(.404,.404041,40,11,13)
 ;;=D PUT^DDSVALF("CAPTION","","",$S(X="":"",1:"!M"))
 ;;^DIST(.404,.404041,40,12,0)
 ;;=10^EXECUTABLE DEFAULT^3
 ;;^DIST(.404,.404041,40,12,1)
 ;;=6.01
 ;;^DIST(.404,.404041,40,12,2)
 ;;=10,26^50^10,6
 ;;^DIST(.404,.404041,40,12,13)
 ;;=D PUT^DDSVAL(.4044,.DA,6,$S(X="":"",1:"!M"))
 ;;^DIST(.404,.404041,40,13,0)
 ;;=3^FORM ONLY FIELD PARAMETERS...^2
 ;;^DIST(.404,.404041,40,13,2)
 ;;=3,73^1^3,43^1
 ;;^DIST(.404,.404041,40,13,7)
 ;;=^11
 ;;^DIST(.404,.404041,40,13,20)
 ;;=F^^0:0
 ;;^DIST(.404,.404041,40,13,21,0)
 ;;=^^1^1^2940928
 ;;^DIST(.404,.404041,40,13,21,1,0)
 ;;=Press <RET> to edit the properties of this form-only field
 ;;^DIST(.404,.404041,40,14,0)
 ;;=4^OTHER PARAMETERS...^2
 ;;^DIST(.404,.404041,40,14,2)
 ;;=4,26^1^4,6^1
 ;;^DIST(.404,.404041,40,14,7)
 ;;=^21
 ;;^DIST(.404,.404041,40,14,20)
 ;;=F^^0:0
 ;;^DIST(.404,.404041,40,14,21,0)
 ;;=^^1^1^2940928
 ;;^DIST(.404,.404041,40,14,21,1,0)
 ;;=Press <RET> to edit additional properties of this form-only field
 ;;^DIST(.404,.404041,40,15,0)
 ;;=7^CAPTION^2
 ;;^DIST(.404,.404041,40,15,2)
 ;;=7,26^50^7,17
 ;;^DIST(.404,.404041,40,15,3)
 ;;=!M
 ;;^DIST(.404,.404041,40,15,3.1)
 ;;=S Y=$G(DDGFCAP0)
 ;;^DIST(.404,.404041,40,15,13)
 ;;=D FOCAP^DDGFU
 ;;^DIST(.404,.404041,40,15,20)
 ;;=DD^^.4044,1
 ;;^DIST(.404,.404041,40,15,23)
 ;;=S DDGFCAP=X
 ;;^DIST(.404,.404041,40,16,0)
 ;;=5^SUPPRESS COLON AFTER CAPTION?^2
 ;;^DIST(.404,.404041,40,16,2)
 ;;=4,73^3^4,43^1
 ;;^DIST(.404,.404041,40,16,3)
 ;;=!M
 ;;^DIST(.404,.404041,40,16,3.1)
 ;;=S Y=$G(DDGFSUP0)
 ;;^DIST(.404,.404041,40,16,20)
 ;;=DD^^.4044,5.2
 ;;^DIST(.404,.404041,40,16,23)
 ;;=S DDGFSUP=X
 ;;^DIST(.404,.404041,40,17,0)
 ;;=6^UNIQUE NAME^3
 ;;^DIST(.404,.404041,40,17,1)
 ;;=3.1
 ;;^DIST(.404,.404041,40,17,2)
 ;;=5,26^50^5,13
 ;;^DIST(.404,.404042,0)
 ;;=DDGF FIELD FORM ONLY PARAMS^.4044
 ;;^DIST(.404,.404042,40,0)
 ;;=^.4044I^9^8
 ;;^DIST(.404,.404042,40,1,0)
 ;;=1^ Other Form Only Field Parameters ^1
 ;;^DIST(.404,.404042,40,1,2)
 ;;=^^1,22
 ;;^DIST(.404,.404042,40,2,0)
 ;;=2^READ TYPE^3
 ;;^DIST(.404,.404042,40,2,1)
 ;;=20.1
 ;;^DIST(.404,.404042,40,2,2)
 ;;=3,20^15^3,9
 ;;^DIST(.404,.404042,40,2,4)
 ;;=1
 ;;^DIST(.404,.404042,40,3,0)
 ;;=3^PARAMETERS^3
 ;;^DIST(.404,.404042,40,3,1)
 ;;=20.2
 ;;^DIST(.404,.404042,40,3,2)
 ;;=4,20^2^4,8
 ;;^DIST(.404,.404042,40,4,0)
 ;;=4^QUALIFIERS^3
 ;;^DIST(.404,.404042,40,4,1)
 ;;=20.3
 ;;^DIST(.404,.404042,40,4,2)
 ;;=5,20^52^5,8
 ;;^DIST(.404,.404042,40,5,0)
 ;;=6^INPUT TRANSFORM^3
 ;;^DIST(.404,.404042,40,5,1)
 ;;=22
 ;;^DIST(.404,.404042,40,5,2)
 ;;=9,20^52^9,3
 ;;^DIST(.404,.404042,40,6,0)
 ;;=5^HELP (WP)^3
 ;;^DIST(.404,.404042,40,6,1)
 ;;=21
 ;;^DIST(.404,.404042,40,6,2)
 ;;=7,20^1^7,9
 ;;^DIST(.404,.404042,40,8,0)
 ;;=7^SCREEN^3
 ;;^DIST(.404,.404042,40,8,1)
 ;;=24
 ;;^DIST(.404,.404042,40,8,2)
 ;;=10,20^52^10,12
 ;;^DIST(.404,.404042,40,9,0)
 ;;=8^SAVE CODE^3
 ;;^DIST(.404,.404042,40,9,1)
 ;;=23
 ;;^DIST(.404,.404042,40,9,2)
 ;;=11,20^52^11,9
 ;;^DIST(.404,.404051,0)
 ;;=DDGF FIELD COMPUTED^.4044
 ;;^DIST(.404,.404051,40,0)
 ;;=^.4044I^8^8
 ;;^DIST(.404,.404051,40,1,0)
 ;;=1^ Computed Field Properties ^1
 ;;^DIST(.404,.404051,40,1,2)
 ;;=^^1,26
 ;;^DIST(.404,.404051,40,2,0)
 ;;=2^FIELD ORDER^3
 ;;^DIST(.404,.404051,40,2,1)
 ;;=.01
 ;;^DIST(.404,.404051,40,2,2)
 ;;=3,24^4^3,11
 ;;^DIST(.404,.404051,40,3,0)
 ;;=3^OTHER PARAMETERS...^2
 ;;^DIST(.404,.404051,40,3,2)
 ;;=4,24^1^4,4^1
 ;;^DIST(.404,.404051,40,3,7)
 ;;=^11
 ;;^DIST(.404,.404051,40,3,20)
 ;;=F^^1:1
 ;;^DIST(.404,.404051,40,3,21,0)
 ;;=^^1^1^2930916
 ;;^DIST(.404,.404051,40,3,21,1,0)
 ;;=Press 'RETURN' to edit additional properties of this Data Dictionary field
 ;;^DIST(.404,.404051,40,4,0)
 ;;=4^SUPPRESS COLON AFTER CAPTION?^2
 ;;^DIST(.404,.404051,40,4,2)
 ;;=4,71^3^4,41^1
 ;;^DIST(.404,.404051,40,4,3)
 ;;=!M
 ;;^DIST(.404,.404051,40,4,3.1)
 ;;=S Y=DDGFSUP0
 ;;^DIST(.404,.404051,40,4,20)
 ;;=DD^^.4044,5.2
 ;;^DIST(.404,.404051,40,4,23)
 ;;=S DDGFSUP=X
 ;;^DIST(.404,.404051,40,5,0)
 ;;=5^UNIQUE NAME^3
 ;;^DIST(.404,.404051,40,5,1)
 ;;=3.1
 ;;^DIST(.404,.404051,40,5,2)
 ;;=5,24^50^5,11
 ;;^DIST(.404,.404051,40,6,0)
 ;;=6^CAPTION^2
 ;;^DIST(.404,.404051,40,6,2)
 ;;=7,24^50^7,15
 ;;^DIST(.404,.404051,40,6,3)
 ;;=!M
 ;;^DIST(.404,.404051,40,6,3.1)
 ;;=S Y=DDGFCAP0
 ;;^DIST(.404,.404051,40,6,13)
 ;;=D COMPCAP^DDGFU
 ;;^DIST(.404,.404051,40,6,20)
 ;;=DD^^.4044,1
 ;;^DIST(.404,.404051,40,6,23)
 ;;=S DDGFCAP=X
 ;;^DIST(.404,.404051,40,7,0)
 ;;=7^EXECUTABLE CAPTION^3
 ;;^DIST(.404,.404051,40,7,1)
 ;;=1.1
 ;;^DIST(.404,.404051,40,7,2)
 ;;=8,24^50^8,4
 ;;^DIST(.404,.404051,40,7,13)
 ;;=D PUT^DDSVALF("CAPTION","","",$S(X="":"",1:"!M"))
 ;;^DIST(.404,.404051,40,8,0)
 ;;=8^COMPUTED EXPRESSION^3
 ;;^DIST(.404,.404051,40,8,1)
 ;;=30
 ;;^DIST(.404,.404051,40,8,2)
 ;;=10,24^50^10,3
 ;;^DIST(.404,.404051,40,8,4)
 ;;=1
 ;;^DIST(.404,.404052,0)
 ;;=DDGF FIELD COMPUTED OTHER^.4044
 ;;^DIST(.404,.404052,40,0)
 ;;=^.4044I^8^5
 ;;^DIST(.404,.404052,40,1,0)
 ;;=1^ Other Computed Field Properties ^1
 ;;^DIST(.404,.404052,40,1,2)
 ;;=^^1,6
 ;;^DIST(.404,.404052,40,5,0)
 ;;=3^DATA LENGTH^2
 ;;^DIST(.404,.404052,40,5,2)
 ;;=5,25^3^5,12
 ;;^DIST(.404,.404052,40,5,3)
 ;;=!M
 ;;^DIST(.404,.404052,40,5,3.1)
 ;;=S Y=$G(DDGFDL0)
 ;;^DIST(.404,.404052,40,5,20)
 ;;=DD^^.4044,4.2
 ;;^DIST(.404,.404052,40,5,23)
 ;;=S DDGFDL=X
 ;;^DIST(.404,.404052,40,6,0)
 ;;=4^CAPTION COORDINATE^2
 ;;^DIST(.404,.404052,40,6,2)
 ;;=6,25^7^6,5
 ;;^DIST(.404,.404052,40,6,3)
 ;;=!M
 ;;^DIST(.404,.404052,40,6,3.1)
 ;;=S Y=$G(DDGFCC0)
 ;;^DIST(.404,.404052,40,6,20)
 ;;=DD^^.4044,5.1
 ;;^DIST(.404,.404052,40,6,23)
 ;;=S DDGFCC=X
 ;;^DIST(.404,.404052,40,7,0)
 ;;=5^DATA COORDINATE^2
 ;;^DIST(.404,.404052,40,7,2)
 ;;=7,25^7^7,8
 ;;^DIST(.404,.404052,40,7,3)
 ;;=!M
 ;;^DIST(.404,.404052,40,7,3.1)
 ;;=S Y=$G(DDGFDC0)
 ;;^DIST(.404,.404052,40,7,20)
 ;;=DD^^.4044,4.1
 ;;^DIST(.404,.404052,40,7,23)
 ;;=S DDGFDC=X
 ;;^DIST(.404,.404052,40,8,0)
 ;;=2^RIGHT JUSTIFY^3

DINIT0FK
DINIT0FK ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FL S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.404052,40,8,1)
 ;;=6.3
 ;;^DIST(.404,.404052,40,8,2)
 ;;=3,25^3^3,10
 ;;^DIST(.404,.404061,0)
 ;;=DDGF BLOCK ADD
 ;;^DIST(.404,.404061,40,0)
 ;;=^.4044I^1^1
 ;;^DIST(.404,.404061,40,1,0)
 ;;=1^Select NEW BLOCK NAME^2
 ;;^DIST(.404,.404061,40,1,2)
 ;;=3,26^30^3,3
 ;;^DIST(.404,.404061,40,1,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.404061,40,1,20)
 ;;=P^^DIST(.404,:QEALMZF
 ;;^DIST(.404,.404061,40,1,23)
 ;;=S DDGFBNUM=X,DDGFBNAM=DDSEXT
 ;;^DIST(.404,.404061,40,1,24)
 ;;=S DIR("S")="I Y'<1"
 ;;^DIST(.404,.404062,0)
 ;;=DDGF BLOCK ADD NEW
 ;;^DIST(.404,.404062,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.404062,40,1,0)
 ;;=1^!M^1
 ;;^DIST(.404,.404062,40,1,.1)
 ;;=S Y="Are you adding "_DDGFBNAM
 ;;^DIST(.404,.404062,40,1,2)
 ;;=^^3,3
 ;;^DIST(.404,.404062,40,2,0)
 ;;=2^as a new block on this page?^2
 ;;^DIST(.404,.404062,40,2,2)
 ;;=4,32^3^4,3^1
 ;;^DIST(.404,.404062,40,2,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.404062,40,2,20)
 ;;=Y
 ;;^DIST(.404,.404062,40,2,23)
 ;;=S DDGFANS=X
 ;;^DIST(.404,.404063,0)
 ;;=DDGF BLOCK ADD DUPLICATE
 ;;^DIST(.404,.404063,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.404063,40,1,0)
 ;;=1^!M^1
 ;;^DIST(.404,.404063,40,1,.1)
 ;;=S Y="Block "_DDGFBNAM
 ;;^DIST(.404,.404063,40,1,2)
 ;;=^^3,3
 ;;^DIST(.404,.404063,40,2,0)
 ;;=2^already exists on this page!^1
 ;;^DIST(.404,.404063,40,2,2)
 ;;=^^4,3
 ;;^DIST(.404,.404063,40,3,0)
 ;;=3^OK^2
 ;;^DIST(.404,.404063,40,3,2)
 ;;=6,18^1^6,15^1
 ;;^DIST(.404,.404063,40,3,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.404063,40,3,20)
 ;;=F^^0:0
 ;;^DIST(.404,.404063,40,3,21,0)
 ;;=^^1^1^2940928
 ;;^DIST(.404,.404063,40,3,21,1,0)
 ;;=Press <RET> to close this page
 ;;^DIST(.404,.404071,0)
 ;;=DDGF BLOCK DELETE
 ;;^DIST(.404,.404071,40,0)
 ;;=^.4044I^4^4
 ;;^DIST(.404,.404071,40,1,0)
 ;;=1^Block^1
 ;;^DIST(.404,.404071,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.404071,40,2,0)
 ;;=4^Do you want to delete it from the BLOCK file?^2
 ;;^DIST(.404,.404071,40,2,2)
 ;;=3,47^3^3,1^1
 ;;^DIST(.404,.404071,40,2,12)
 ;;=S:X]"" DDACT="EX" I X="" D HLP^DDSUTL($C(7)_"A response is required.  Enter either YES or NO.") S DDSBR=2
 ;;^DIST(.404,.404071,40,2,20)
 ;;=Y
 ;;^DIST(.404,.404071,40,2,23)
 ;;=S DDGFANS=X
 ;;^DIST(.404,.404071,40,3,0)
 ;;=2^!M^1
 ;;^DIST(.404,.404071,40,3,.1)
 ;;=S Y=DDGFBK
 ;;^DIST(.404,.404071,40,3,2)
 ;;=^^1,7
 ;;^DIST(.404,.404071,40,4,0)
 ;;=3^is not used on any other forms.^1
 ;;^DIST(.404,.404071,40,4,2)
 ;;=^^2,1
 ;;^DIST(.404,.404081,0)
 ;;=DDGF HEADER BLOCK SELECT
 ;;^DIST(.404,.404081,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.404081,40,1,0)
 ;;=1^ Add a New Header Block ^1
 ;;^DIST(.404,.404081,40,1,2)
 ;;=^^1,20
 ;;^DIST(.404,.404081,40,2,0)
 ;;=2^Select New Header Block Name^2
 ;;^DIST(.404,.404081,40,2,2)
 ;;=3,33^30^3,3
 ;;^DIST(.404,.404081,40,2,12)
 ;;=S DDACT="EX"
 ;;^DIST(.404,.404081,40,2,20)
 ;;=P^^DIST(.404,:QEALMZF
 ;;^DIST(.404,.404081,40,2,23)
 ;;=S DDGFBNUM=X,DDGFBNAM=DDSEXT
 ;;^DIST(.404,.441,0)
 ;;=DDXP FF BLK1^.44
 ;;^DIST(.404,.441,15,0)
 ;;=^^2^2^2930107
 ;;^DIST(.404,.441,15,1,0)
 ;;=Block makes up page 1 of DDXP FF FORM.  It is used to define a foreign
 ;;^DIST(.404,.441,15,2,0)
 ;;=format.
 ;;^DIST(.404,.441,40,0)
 ;;=^.4044I^21^16
 ;;^DIST(.404,.441,40,1,0)
 ;;=1^FOREIGN FILE FORMAT^3
 ;;^DIST(.404,.441,40,1,1)
 ;;=.01
 ;;^DIST(.404,.441,40,1,2)
 ;;=1,42^30^1,21^0
 ;;^DIST(.404,.441,40,3,0)
 ;;=3^!M^1
 ;;^DIST(.404,.441,40,3,.1)
 ;;=N I S Y="" F I=1:1:21+$L($G(DDXPFMNM)) S Y=Y_"="
 ;;^DIST(.404,.441,40,3,2)
 ;;=^^2,21
 ;;^DIST(.404,.441,40,4,0)
 ;;=4^FIELD DELIMITER^3
 ;;^DIST(.404,.441,40,4,1)
 ;;=1
 ;;^DIST(.404,.441,40,4,2)
 ;;=4,23^15^4,6^0
 ;;^DIST(.404,.441,40,5,0)
 ;;=5^RECORD LENGTH FIXED?^3
 ;;^DIST(.404,.441,40,5,1)
 ;;=5
 ;;^DIST(.404,.441,40,5,2)
 ;;=4,69^3^4,48^1
 ;;^DIST(.404,.441,40,6,0)
 ;;=4.7^RECORD DELIMITER^3
 ;;^DIST(.404,.441,40,6,1)
 ;;=2
 ;;^DIST(.404,.441,40,6,2)
 ;;=6,23^15^6,5^0
 ;;^DIST(.404,.441,40,7,0)
 ;;=7^MAXIMUM OUTPUT LENGTH^3
 ;;^DIST(.404,.441,40,7,1)
 ;;=7
 ;;^DIST(.404,.441,40,7,2)
 ;;=5,69^5^5,46^0
 ;;^DIST(.404,.441,40,7,3)
 ;;=80
 ;;^DIST(.404,.441,40,8,0)
 ;;=8^NEED FOREIGN FIELD NAMES?^3
 ;;^DIST(.404,.441,40,8,1)
 ;;=6
 ;;^DIST(.404,.441,40,8,2)
 ;;=6,69^3^6,43^1
 ;;^DIST(.404,.441,40,9,0)
 ;;=9^FILE HEADER^3
 ;;^DIST(.404,.441,40,9,1)
 ;;=20
 ;;^DIST(.404,.441,40,9,2)
 ;;=8,23^40^8,10^0
 ;;^DIST(.404,.441,40,10,0)
 ;;=10^FILE TRAILER^3
 ;;^DIST(.404,.441,40,10,1)
 ;;=25
 ;;^DIST(.404,.441,40,10,2)
 ;;=9,23^40^9,9^0
 ;;^DIST(.404,.441,40,11,0)
 ;;=11^DATE FORMAT^3
 ;;^DIST(.404,.441,40,11,1)
 ;;=27
 ;;^DIST(.404,.441,40,11,2)
 ;;=10,23^40^10,10^0
 ;;^DIST(.404,.441,40,16,0)
 ;;=16^Go to next page to document format.^1
 ;;^DIST(.404,.441,40,16,2)
 ;;=^^17,45
 ;;^DIST(.404,.441,40,17,0)
 ;;=2^PAGE 1^1
 ;;^DIST(.404,.441,40,17,2)
 ;;=^^1,74
 ;;^DIST(.404,.441,40,18,0)
 ;;=12^QUOTE NON-NUMERIC?^3
 ;;^DIST(.404,.441,40,18,1)
 ;;=8
 ;;^DIST(.404,.441,40,18,2)
 ;;=13,23^3^13,4^1
 ;;^DIST(.404,.441,40,19,0)
 ;;=13^PROMPT FOR DATA TYPE?^3
 ;;^DIST(.404,.441,40,19,1)
 ;;=9
 ;;^DIST(.404,.441,40,19,2)
 ;;=14,23^3^14,1^1
 ;;^DIST(.404,.441,40,20,0)
 ;;=4.5^SEND LAST DELIMITER?^3
 ;;^DIST(.404,.441,40,20,1)
 ;;=10
 ;;^DIST(.404,.441,40,20,2)
 ;;=5,23^3^5,2^1
 ;;^DIST(.404,.441,40,20,3)
 ;;=YES
 ;;^DIST(.404,.441,40,21,0)
 ;;=11.5^SUBSTITUTE FOR NULL^3
 ;;^DIST(.404,.441,40,21,1)
 ;;=11
 ;;^DIST(.404,.441,40,21,2)
 ;;=12,23^15^12,2^0
 ;;^DIST(.404,.442,0)
 ;;=DDXP FF BLK2^.44^0
 ;;^DIST(.404,.442,15,0)
 ;;=^^2^2^2920925
 ;;^DIST(.404,.442,15,1,0)
 ;;=Contains fields for page 2 of form used to define Foreign Formats.
 ;;^DIST(.404,.442,15,2,0)
 ;;=Primarily used to document the format.
 ;;^DIST(.404,.442,40,0)
 ;;=^.4044I^7^7
 ;;^DIST(.404,.442,40,1,0)
 ;;=1^FOREIGN FILE FORMAT: ^1
 ;;^DIST(.404,.442,40,1,2)
 ;;=^^1,21
 ;;^DIST(.404,.442,40,2,0)
 ;;=2^^3
 ;;^DIST(.404,.442,40,2,1)
 ;;=.01
 ;;^DIST(.404,.442,40,2,2)
 ;;=1,42^30
 ;;^DIST(.404,.442,40,2,4)
 ;;=^^^1
 ;;^DIST(.404,.442,40,3,0)
 ;;=2.5^PAGE 2^1
 ;;^DIST(.404,.442,40,3,2)
 ;;=^^1,74
 ;;^DIST(.404,.442,40,4,0)
 ;;=3^!M^1
 ;;^DIST(.404,.442,40,4,.1)
 ;;=N I S Y="" F I=1:1:21+$L($G(DDXPFMNM)) S Y=Y_"="
 ;;^DIST(.404,.442,40,4,2)
 ;;=^^2,21
 ;;^DIST(.404,.442,40,5,0)
 ;;=4^DESCRIPTION (WP)^3
 ;;^DIST(.404,.442,40,5,1)
 ;;=30
 ;;^DIST(.404,.442,40,5,2)
 ;;=4,44^1^4,26^0
 ;;^DIST(.404,.442,40,6,0)
 ;;=5^USAGE NOTES (WP)^3
 ;;^DIST(.404,.442,40,6,1)
 ;;=31
 ;;^DIST(.404,.442,40,6,2)
 ;;=6,44^1^6,26^0
 ;;^DIST(.404,.442,40,7,0)
 ;;=6^Select OTHER NAME FOR FORMAT^3
 ;;^DIST(.404,.442,40,7,1)
 ;;=50
 ;;^DIST(.404,.442,40,7,2)
 ;;=10,44^22^10,14^0

DINIT0FL
DINIT0FL ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FM S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.442,40,7,4)
 ;;=^^^^0
 ;;^DIST(.404,.442,40,7,7)
 ;;=^3
 ;;^DIST(.404,.443,0)
 ;;=DDXP FF BLK3^.441^0
 ;;^DIST(.404,.443,15,0)
 ;;=^^2^2^2920925
 ;;^DIST(.404,.443,15,1,0)
 ;;=Block for subpage containing fields from the OTHER NAME FOR FORMAT
 ;;^DIST(.404,.443,15,2,0)
 ;;=multiple.  Used in defining a foreign file format.
 ;;^DIST(.404,.443,40,0)
 ;;=^.4044I^2^2
 ;;^DIST(.404,.443,40,1,0)
 ;;=1^OTHER NAME^3
 ;;^DIST(.404,.443,40,1,1)
 ;;=.01
 ;;^DIST(.404,.443,40,1,2)
 ;;=2,20^15^2,8^0
 ;;^DIST(.404,.443,40,2,0)
 ;;=2^DESCRIPTION (WP)^3
 ;;^DIST(.404,.443,40,2,1)
 ;;=1
 ;;^DIST(.404,.443,40,2,2)
 ;;=4,20^1^4,2^0
 ;;^DIST(.404,.4611,0)
 ;;=DDMP SPECS 1^.44
 ;;^DIST(.404,.4611,15,0)
 ;;=^^2^2^2950216
 ;;^DIST(.404,.4611,15,1,0)
 ;;=Block contains specifications of data import including source file, VA
 ;;^DIST(.404,.4611,15,2,0)
 ;;=FileMan target file, and format of the incoming data.
 ;;^DIST(.404,.4611,40,0)
 ;;=^.4044I^23^21
 ;;^DIST(.404,.4611,40,1,0)
 ;;=1^DATA IMPORT^1
 ;;^DIST(.404,.4611,40,1,2)
 ;;=^^1,35
 ;;^DIST(.404,.4611,40,2,0)
 ;;=2^Page 1^1
 ;;^DIST(.404,.4611,40,2,2)
 ;;=^^1,72
 ;;^DIST(.404,.4611,40,3,0)
 ;;=1.1^===========^1
 ;;^DIST(.404,.4611,40,3,2)
 ;;=^^2,35^1
 ;;^DIST(.404,.4611,40,4,0)
 ;;=6^SOURCE FILE^1
 ;;^DIST(.404,.4611,40,4,2)
 ;;=^^4,53^1
 ;;^DIST(.404,.4611,40,5,0)
 ;;=6.1^-----------^1
 ;;^DIST(.404,.4611,40,5,2)
 ;;=^^5,53^1
 ;;^DIST(.404,.4611,40,6,0)
 ;;=6.2^Full path^2^^PTH
 ;;^DIST(.404,.4611,40,6,2)
 ;;=6,61^19^6,50
 ;;^DIST(.404,.4611,40,6,3)
 ;;=!M
 ;;^DIST(.404,.4611,40,6,3.1)
 ;;=S Y=$$PWD^%ZISH
 ;;^DIST(.404,.4611,40,6,4)
 ;;=1
 ;;^DIST(.404,.4611,40,6,20)
 ;;=F^^1:245
 ;;^DIST(.404,.4611,40,6,21,0)
 ;;=^^2^2^2950216
 ;;^DIST(.404,.4611,40,6,21,1,0)
 ;;=Enter the full path to the host file that contains the data you want to
 ;;^DIST(.404,.4611,40,6,21,2,0)
 ;;=import.  Do not include the name of the file itself.
 ;;^DIST(.404,.4611,40,6,23)
 ;;=S DDMPHOST("PATH")=X
 ;;^DIST(.404,.4611,40,7,0)
 ;;=6.3^Host file name^2^^HST_FL
 ;;^DIST(.404,.4611,40,7,2)
 ;;=7,61^19^7,45
 ;;^DIST(.404,.4611,40,7,4)
 ;;=1
 ;;^DIST(.404,.4611,40,7,20)
 ;;=F^^1:100
 ;;^DIST(.404,.4611,40,7,21,0)
 ;;=^^1^1^2960611
 ;;^DIST(.404,.4611,40,7,21,1,0)
 ;;=^D HOSTHELP^DDMPSM1
 ;;^DIST(.404,.4611,40,7,23)
 ;;=S DDMPHOST("FILE")=X
 ;;^DIST(.404,.4611,40,8,0)
 ;;=7^VA FILEMAN FILE^1
 ;;^DIST(.404,.4611,40,8,2)
 ;;=^^10,51^1
 ;;^DIST(.404,.4611,40,9,0)
 ;;=7.1^---------------^1
 ;;^DIST(.404,.4611,40,9,2)
 ;;=^^11,51^1
 ;;^DIST(.404,.4611,40,10,0)
 ;;=7.2^Primary file^2^^F_SEL
 ;;^DIST(.404,.4611,40,10,2)
 ;;=12,61^18^12,47
 ;;^DIST(.404,.4611,40,10,13)
 ;;=D FILESEL^DDMPSM
 ;;^DIST(.404,.4611,40,10,20)
 ;;=P^^1:ANEF
 ;;^DIST(.404,.4611,40,10,21,0)
 ;;=^^3^3^2960918
 ;;^DIST(.404,.4611,40,10,21,1,0)
 ;;=Enter the name or number of the VA FileMan file into which the data will
 ;;^DIST(.404,.4611,40,10,21,2,0)
 ;;=be imported.  If the FileMan file is specified in the source file, enter
 ;;^DIST(.404,.4611,40,10,21,3,0)
 ;;=nothing here.
 ;;^DIST(.404,.4611,40,10,23)
 ;;=S DDMPSELF=X
 ;;^DIST(.404,.4611,40,10,24)
 ;;=S DIR("S")="N DIFILE,DIAC S DIFILE=Y,DIAC=""WR"" D ^DIAC I DIAC"
 ;;^DIST(.404,.4611,40,11,0)
 ;;=5^DATA FORMAT^1
 ;;^DIST(.404,.4611,40,11,2)
 ;;=^^4,16
 ;;^DIST(.404,.4611,40,12,0)
 ;;=5.1^-----------^1
 ;;^DIST(.404,.4611,40,12,2)
 ;;=^^5,16^1
 ;;^DIST(.404,.4611,40,13,0)
 ;;=5.2^Internal or external^2^^INT_EXT
 ;;^DIST(.404,.4611,40,13,2)
 ;;=6,23^8^6,1
 ;;^DIST(.404,.4611,40,13,3)
 ;;=External
 ;;^DIST(.404,.4611,40,13,20)
 ;;=S^OM^E:EXTERNAL;I:INTERNAL
 ;;^DIST(.404,.4611,40,13,21,0)
 ;;=^^3^3^2950216
 ;;^DIST(.404,.4611,40,13,21,1,0)
 ;;=Specify whether the imported data is in internal or external format.
 ;;^DIST(.404,.4611,40,13,21,2,0)
 ;;=Internal format means the way the data is stored inside of VA FileMan
 ;;^DIST(.404,.4611,40,13,21,3,0)
 ;;=files.  External means the format that a user enter.
 ;;^DIST(.404,.4611,40,13,23)
 ;;=S DDMPIORE=X
 ;;^DIST(.404,.4611,40,14,0)
 ;;=5.3^Foreign format^2^^FOR_FMT
 ;;^DIST(.404,.4611,40,14,2)
 ;;=8,23^17^8,7
 ;;^DIST(.404,.4611,40,14,13)
 ;;=D FF^DDMPSM
 ;;^DIST(.404,.4611,40,14,20)
 ;;=P^^.44:EAM
 ;;^DIST(.404,.4611,40,14,21,0)
 ;;=^^6^6^2950228
 ;;^DIST(.404,.4611,40,14,21,1,0)
 ;;=Enter the foreign format that corresponds to the structure of the data
 ;;^DIST(.404,.4611,40,14,21,2,0)
 ;;=being imported.  These formats are stored in the Foreign Format file.  If
 ;;^DIST(.404,.4611,40,14,21,3,0)
 ;;=you do not choose a format here, you must specify whether the incoming
 ;;^DIST(.404,.4611,40,14,21,4,0)
 ;;=data is fixed length, what the field delimiter is (if any), and whether
 ;;^DIST(.404,.4611,40,14,21,5,0)
 ;;=some field values are quoted.  If you enter a format here, any attributes
 ;;^DIST(.404,.4611,40,14,21,6,0)
 ;;=of the format that you specified below will be deleted.
 ;;^DIST(.404,.4611,40,16,0)
 ;;=5.5^Data fixed length?^2^^FIX
 ;;^DIST(.404,.4611,40,16,2)
 ;;=10,23^3^10,4^1
 ;;^DIST(.404,.4611,40,16,13)
 ;;=S DDMPSMFF("FIXED")=DDSEXT
 ;;^DIST(.404,.4611,40,16,20)
 ;;=Y
 ;;^DIST(.404,.4611,40,16,21,0)
 ;;=^^4^4^2950216
 ;;^DIST(.404,.4611,40,16,21,1,0)
 ;;=Enter YES or NO.
 ;;^DIST(.404,.4611,40,16,21,2,0)
 ;;=If the incoming data is in fixed length fields, enter YES.
 ;;^DIST(.404,.4611,40,16,21,3,0)
 ;;=If the fields are delimited by a special character, enter NO and enter the
 ;;^DIST(.404,.4611,40,16,21,4,0)
 ;;=field delimiter at the prompt below.
 ;;^DIST(.404,.4611,40,17,0)
 ;;=5.6^Field delimiter^2^^FLD_DLM
 ;;^DIST(.404,.4611,40,17,2)
 ;;=11,23^3^11,6
 ;;^DIST(.404,.4611,40,17,13)
 ;;=S DDMPSMFF("FDELIM")=DDSEXT
 ;;^DIST(.404,.4611,40,17,20)
 ;;=F^^1:15
 ;;^DIST(.404,.4611,40,17,21,0)
 ;;=^^8^8^2960823
 ;;^DIST(.404,.4611,40,17,21,1,0)
 ;;=If the incoming data is not in fixed length fields, enter the character or
 ;;^DIST(.404,.4611,40,17,21,2,0)
 ;;=characters that separate fields.  
 ;;^DIST(.404,.4611,40,17,21,3,0)
 ;;= 
 ;;^DIST(.404,.4611,40,17,21,4,0)
 ;;=Identify the delimiter either by 1-15 characters or by the delimiter's 3
 ;;^DIST(.404,.4611,40,17,21,5,0)
 ;;=digit ascii value.  Up to 4 ascii-character values can be specified,
 ;;^DIST(.404,.4611,40,17,21,6,0)
 ;;=separated by commas.  Use the ascii value when the delimiter is a
 ;;^DIST(.404,.4611,40,17,21,7,0)
 ;;=non-printing character (e.g., <TAB>, ascii=009) or a character that has a
 ;;^DIST(.404,.4611,40,17,21,8,0)
 ;;=special meaning at a ScreenMan prompt (e.g., ^, ascii=094).

DINIT0FM
DINIT0FM ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT0FN S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.4611,40,17,22)
 ;;=K:$L(X)>15!($L(X)<1)!'((X?1AP.E)!(X?3N)!(X?3N1","3N)!(X?3N1","3N1","3N)!(X?3N1","3N1","3N1","3N)) X
 ;;^DIST(.404,.4611,40,18,0)
 ;;=5.7^Fields quoted?^2^^QUOTE
 ;;^DIST(.404,.4611,40,18,2)
 ;;=12,23^3^12,8^1
 ;;^DIST(.404,.4611,40,18,13)
 ;;=S DDMPSMFF("QUOTED")=DDSEXT
 ;;^DIST(.404,.4611,40,18,20)
 ;;=Y
 ;;^DIST(.404,.4611,40,18,21,0)
 ;;=^^4^4^2950216
 ;;^DIST(.404,.4611,40,18,21,1,0)
 ;;=If the values of some fields are surrounded by quotation marks ("), enter
 ;;^DIST(.404,.4611,40,18,21,2,0)
 ;;=YES.  Field delimiters that occur within the quotation marks are ignored.
 ;;^DIST(.404,.4611,40,18,21,3,0)
 ;;=This special treatment of quotation marks is not done for fixed length
 ;;^DIST(.404,.4611,40,18,21,4,0)
 ;;=data.
 ;;^DIST(.404,.4611,40,20,0)
 ;;=7.4^!M^2^^FLD_JUMP
 ;;^DIST(.404,.4611,40,20,.1)
 ;;=S Y=$S($$GET^DDSVALF("F_SEL",1,1)]"":"Field selection page...",1:"")
 ;;^DIST(.404,.4611,40,20,2)
 ;;=14,69^1^14,44^1
 ;;^DIST(.404,.4611,40,20,4)
 ;;=^^^1
 ;;^DIST(.404,.4611,40,20,10)
 ;;=S DDSBR="FLD^1^2"
 ;;^DIST(.404,.4611,40,20,11)
 ;;=I $$GET^DDSVALF("TMP_NM",1,1)]"" N DDMPMSG S DDMPMSG(1)="You cannot select fields because you have specified an Import Template for this import.",DDMPMSG(2)="$$EOP" D HLP^DDSUTL(.DDMPMSG) S DDSBR="TMP_NM"
 ;;^DIST(.404,.4611,40,20,20)
 ;;=F
 ;;^DIST(.404,.4611,40,20,21,0)
 ;;=^^1^1^2960918
 ;;^DIST(.404,.4611,40,20,21,1,0)
 ;;=Press <RET> to advance to the Field Selection Page.
 ;;^DIST(.404,.4611,40,21,0)
 ;;=5.4^OR^1
 ;;^DIST(.404,.4611,40,21,2)
 ;;=^^9,14^1
 ;;^DIST(.404,.4611,40,22,0)
 ;;=7.6^!M^1^^OR
 ;;^DIST(.404,.4611,40,22,.1)
 ;;=S Y=$S($$GET^DDSVALF("F_SEL",1,1)]"":"OR",1:"")
 ;;^DIST(.404,.4611,40,22,2)
 ;;=^^15,54
 ;;^DIST(.404,.4611,40,23,0)
 ;;=7.8^!M^2^^TMP_NM
 ;;^DIST(.404,.4611,40,23,.1)
 ;;=S Y=$S($$GET^DDSVALF("F_SEL",1,1)]"":"Import Template",1:"")
 ;;^DIST(.404,.4611,40,23,2)
 ;;=16,61^18^16,44
 ;;^DIST(.404,.4611,40,23,4)
 ;;=^^^1
 ;;^DIST(.404,.4611,40,23,11)
 ;;=I $D(DDMPFDSL) N DDMPMSG S DDMPMSG(1)="You have already chosen fields for this import. You may not select an Import Template unless you delete all the chosen fields.",DDMPMSG(2)="$$EOP" D HLP^DDSUTL(.DDMPMSG) S DDSBR="FLD_JUMP"
 ;;^DIST(.404,.4611,40,23,20)
 ;;=P^^.46:AE
 ;;^DIST(.404,.4611,40,23,21,0)
 ;;=^^3^3^2960605
 ;;^DIST(.404,.4611,40,23,21,1,0)
 ;;=Enter the name of an Import Template to use for data import.  If you do
 ;;^DIST(.404,.4611,40,23,21,2,0)
 ;;=not specify a template, you must specify the fields on the Field Selection
 ;;^DIST(.404,.4611,40,23,21,3,0)
 ;;=page.
 ;;^DIST(.404,.4611,40,23,22)
 ;;=S X=$TR(X,"[]")
 ;;^DIST(.404,.4611,40,23,23)
 ;;=S DDMPTMPL=X
 ;;^DIST(.404,.4611,40,23,24)
 ;;=S DIR("S")="I $$TMPLSCR^DDMPSM(DDMPF,DDSEXT,.DUZ)"
 ;;^DIST(.404,.4612,0)
 ;;=DDMP FIELD SELECTION
 ;;^DIST(.404,.4612,40,0)
 ;;=^.4044I^19^18
 ;;^DIST(.404,.4612,40,1,0)
 ;;=1^FIELD SELECTION FOR IMPORT^1
 ;;^DIST(.404,.4612,40,1,2)
 ;;=^^1,27
 ;;^DIST(.404,.4612,40,2,0)
 ;;=1.2^Page 2^1
 ;;^DIST(.404,.4612,40,2,2)
 ;;=^^1,73
 ;;^DIST(.404,.4612,40,3,0)
 ;;=1.1^==========================^1
 ;;^DIST(.404,.4612,40,3,2)
 ;;=^^2,27^1
 ;;^DIST(.404,.4612,40,4,0)
 ;;=2^Choose a field from^1
 ;;^DIST(.404,.4612,40,4,2)
 ;;=^^3,2^1
 ;;^DIST(.404,.4612,40,5,0)
 ;;=2.1^!M^1
 ;;^DIST(.404,.4612,40,5,.1)
 ;;=S Y=$S($D(DDMPFCAP):DDMPFCAP,1:DDMPFLNM)
 ;;^DIST(.404,.4612,40,5,2)
 ;;=^^4,2^1
 ;;^DIST(.404,.4612,40,6,0)
 ;;=2.2^Field^2^^FLD
 ;;^DIST(.404,.4612,40,6,2)
 ;;=5,12^19^5,5
 ;;^DIST(.404,.4612,40,6,10)
 ;;=I X=DDSOLD,$L($G(DDMPCPTH)) S DDSBR=2.2 D UP1^DDMPSM,REFRESH^DDSUTL
 ;;^DIST(.404,.4612,40,6,13)
 ;;=D FDPROC^DDMPSM,PUT^DDSVALF(2.2,1,2,""):$G(DDSBR)="FLD",REFRESH^DDSUTL
 ;;^DIST(.404,.4612,40,6,20)
 ;;=F^^1:30
 ;;^DIST(.404,.4612,40,6,21,0)
 ;;=^^1^1^2950217
 ;;^DIST(.404,.4612,40,6,21,1,0)
 ;;=^N D0,DA,DIC,D,DZ S DIC="^DD("_DDMPCF_",",DIC(0)="",D="B",DIC("S")="I '($P($G(^DD(+$P(^DD(DDMPCF,Y,0),U,2),.01,0)),U,2)[""W"")" S:$G(X)="?" DZ=X D DQ^DICQ
 ;;^DIST(.404,.4612,40,6,22)
 ;;=D IXF^DDMPSM
 ;;^DIST(.404,.4612,40,8,0)
 ;;=3.1^Delete last field selected?^2^^FLD_DEL
 ;;^DIST(.404,.4612,40,8,2)
 ;;=5,68^3^5,40^1
 ;;^DIST(.404,.4612,40,8,11)
 ;;=S DDMPMRK($G(DDMPFDCT))=1 D REFRESH^DDSUTL
 ;;^DIST(.404,.4612,40,8,12)
 ;;=K DDMPMRK D REFRESH^DDSUTL ;S DDSBR="COM"
 ;;^DIST(.404,.4612,40,8,13)
 ;;=I X D DELFLD^DDMPSM,PUT^DDSVALF(3.1,"","","") S DDSBR=3.1
 ;;^DIST(.404,.4612,40,8,20)
 ;;=Y
 ;;^DIST(.404,.4612,40,8,21,0)
 ;;=^^2^2^2960716
 ;;^DIST(.404,.4612,40,8,21,1,0)
 ;;=Enter YES if you want to delete the most recent field that you selected
 ;;^DIST(.404,.4612,40,8,21,2,0)
 ;;=for import.  This is the last field on the list to the left
 ;;^DIST(.404,.4612,40,9,0)
 ;;=4^These are the fields selected so far:^1
 ;;^DIST(.404,.4612,40,9,2)
 ;;=^^8,2
 ;;^DIST(.404,.4612,40,10,0)
 ;;=5.1^!M^1
 ;;^DIST(.404,.4612,40,10,.1)
 ;;=I $D(DDMPFDSL("CAP",1+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=1+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,10,2)
 ;;=^^9,4^1
 ;;^DIST(.404,.4612,40,11,0)
 ;;=5.2^!M^1
 ;;^DIST(.404,.4612,40,11,.1)
 ;;=I $D(DDMPFDSL("CAP",2+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=2+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,11,2)
 ;;=^^10,4^1
 ;;^DIST(.404,.4612,40,12,0)
 ;;=5.3^!M^1
 ;;^DIST(.404,.4612,40,12,.1)
 ;;=I $D(DDMPFDSL("CAP",3+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=3+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,12,2)
 ;;=^^11,4^1
 ;;^DIST(.404,.4612,40,13,0)
 ;;=5.4^!M^1
 ;;^DIST(.404,.4612,40,13,.1)
 ;;=I $D(DDMPFDSL("CAP",4+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=4+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,13,2)
 ;;=^^12,4^1
 ;;^DIST(.404,.4612,40,14,0)
 ;;=5.5^!M^1
 ;;^DIST(.404,.4612,40,14,.1)
 ;;=I $D(DDMPFDSL("CAP",5+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=5+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,14,2)
 ;;=^^13,4^1
 ;;^DIST(.404,.4612,40,15,0)
 ;;=5.6^!M^1

DINIT0FN
DINIT0FN ;SFISC/MKO-DATA FOR FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT02 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.404,.4612,40,15,.1)
 ;;=I $D(DDMPFDSL("CAP",6+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=6+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,15,2)
 ;;=^^14,4^1
 ;;^DIST(.404,.4612,40,16,0)
 ;;=5.7^!M^1
 ;;^DIST(.404,.4612,40,16,.1)
 ;;=I $D(DDMPFDSL("CAP",7+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=7+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,16,2)
 ;;=^^15,4^1
 ;;^DIST(.404,.4612,40,17,0)
 ;;=5.8^!M^1
 ;;^DIST(.404,.4612,40,17,.1)
 ;;=I $D(DDMPFDSL("CAP",8+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=8+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,17,2)
 ;;=^^16,4^1
 ;;^DIST(.404,.4612,40,18,0)
 ;;=5.9^!M^1
 ;;^DIST(.404,.4612,40,18,.1)
 ;;=I $D(DDMPFDSL("CAP",9+DDMPOSET)) N DDMPNUM,DDMPLEN S DDMPNUM=9+DDMPOSET,DDMPLEN=$L(DDMPFDSL("CAP",DDMPNUM)),Y=$S($G(DDMPMRK(DDMPNUM)):"*",1:" ")_$S(DDMPNUM<10:" ",1:"")_DDMPNUM_" - "_$E(DDMPFDSL("CAP",DDMPNUM),DDMPLEN-70,DDMPLEN)
 ;;^DIST(.404,.4612,40,18,2)
 ;;=^^17,4^1
 ;;^DIST(.404,.4612,40,19,0)
 ;;=2.3^!M^2^^LEN
 ;;^DIST(.404,.4612,40,19,.1)
 ;;=S Y=$S($G(DDMPSMFF("FIXED"))="YES":"Length",1:"")
 ;;^DIST(.404,.4612,40,19,2)
 ;;=6,12^3^6,4
 ;;^DIST(.404,.4612,40,19,11)
 ;;=I $$GET^DDSVALF("FLD")']"" S DDSBR=$S($L($G(DDMPCPTH)):"FLD",1:"FLD_DEL")
 ;;^DIST(.404,.4612,40,19,12)
 ;;=I X="" S DDSBR="2^1^4"
 ;;^DIST(.404,.4612,40,19,13)
 ;;=S DDMPFDSL("LN",DDMPFDCT)=X,DDMPFDSL("CAP",DDMPFDCT)=DDMPFDSL("CAP",DDMPFDCT)_"["_X_"]",DDSBR="FLD" D PUT^DDSVALF("LEN","","",""),PUT^DDSVALF("FLD","","",""),REFRESH^DDSUTL
 ;;^DIST(.404,.4612,40,19,20)
 ;;=N^^1:255
 ;;^DIST(.404,.4612,40,19,21,0)
 ;;=^^2^2^2950228
 ;;^DIST(.404,.4612,40,19,21,1,0)
 ;;=Enter the length of the imported data associated with this field.  (This
 ;;^DIST(.404,.4612,40,19,21,2,0)
 ;;=applies only to fixed length imports.)
 ;;^DIST(.404,.4613,0)
 ;;=DDMP FILE CHANGE^.44
 ;;^DIST(.404,.4613,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.4613,40,1,0)
 ;;=1^If you delete or change the primary file,^1
 ;;^DIST(.404,.4613,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.4613,40,2,0)
 ;;=2^the fields you have chosen will be deleted.^1
 ;;^DIST(.404,.4613,40,2,2)
 ;;=^^2,1^1
 ;;^DIST(.404,.4613,40,3,0)
 ;;=3^Do you want to change the Primary file?^2
 ;;^DIST(.404,.4613,40,3,2)
 ;;=4,42^3^4,1
 ;;^DIST(.404,.4613,40,3,3)
 ;;=Yes
 ;;^DIST(.404,.4613,40,3,4)
 ;;=1
 ;;^DIST(.404,.4613,40,3,12)
 ;;=D CHNGFILE^DDMPSM S DDACT="CL"
 ;;^DIST(.404,.4613,40,3,20)
 ;;=Y
 ;;^DIST(.404,.4614,0)
 ;;=DDMP REQUIRED LENGTH
 ;;^DIST(.404,.4614,40,0)
 ;;=^.4044I^3^3
 ;;^DIST(.404,.4614,40,1,0)
 ;;=1^Since this is a fixed length import,^1
 ;;^DIST(.404,.4614,40,1,2)
 ;;=^^1,1
 ;;^DIST(.404,.4614,40,2,0)
 ;;=1.2^you must enter a data length for every field.^1
 ;;^DIST(.404,.4614,40,2,2)
 ;;=^^2,1
 ;;^DIST(.404,.4614,40,3,0)
 ;;=2^Delete field or enter its Length (D/L)?^2
 ;;^DIST(.404,.4614,40,3,2)
 ;;=4,41^1^4,1^1
 ;;^DIST(.404,.4614,40,3,13)
 ;;=D LENCHK^DDMPSM1
 ;;^DIST(.404,.4614,40,3,20)
 ;;=S^M^D:Delete the field;L:Length will be entered
 ;;^DIST(.404,.4614,40,3,21,0)
 ;;=^^4^4^2950301
 ;;^DIST(.404,.4614,40,3,21,1,0)
 ;;=You left the length prompt without entering a data length for the last
 ;;^DIST(.404,.4614,40,3,21,2,0)
 ;;=field you specified.  Since you have chosen a fixed length import, you
 ;;^DIST(.404,.4614,40,3,21,3,0)
 ;;=must give a length for every field.  You can choose to either delete the
 ;;^DIST(.404,.4614,40,3,21,4,0)
 ;;=field you just entered or return to the Length prompt to enter a Length.

DINIT1
DINIT1 ;SFISC/GFT,XAK-INITIALIZE VA FILEMAN ;6NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT11:X?.P S @("^DD(0,"_$E($P(X," ",2),3,99)_")=Y")
 ;;.26,0 COMPUTE ALGORITHM^FJ30^^9.1;E1,245^K:$L(X)>50 X
 ;;.27,0 SUB-FIELDS^CJ1^^ ; ^Q:$D(DIQ(0))  X ^DD(0,.27,9.2) S X="" I $D(Y)#2,Y=U S DN=0
 ;;.27,9.2 S %=$S($D(^DD(DFF,D0,0)):+$P(^(0),U,2),1:0) I %,$D(^DD(%,.01,0)),$P(^(0),U,2)'["W" S DR="DFF=%,DN=1 D ^DIO2 S X="""",DFF="_DFF_",DN="_DN,X="D0" X "F Z=1:1 S DR=X_""=0,""_DR_"",""_X_""=""""""_@X_"""""""",X=""D""_X Q:$D(@X)[0","S "_DR
 ;;.28,0 MULTIPLE-VALUED^CB^^ ; ^S X=$P(^DD(DFF,D0,0),U,2)>0
 ;;.29,0 DEPTH OF SUB-FIELD^CJ1^^ ; ^S %=DFF X "F X=0:1 Q:'$D(^DD(%,0,""UP""))  S %=^(""UP"")"
 ;;.3,0 POINTER^F^^0;3
 ;;.3,9 ^
 ;;.4,0 GLOBAL SUBSCRIPT LOCATION^RF^^0;4^K:X'?1.E1";"1.E X I $D(X),@("$D("_DIC_"""GL"",$P(X,"";""),$P(X,"";"",2)))") K X
 ;;.4,1,0 ^.1^1^1
 ;;.4,1,1,0 DA(2)^GL
 ;;.4,1,1,1 S:X'?.P @(DIC_"""GL"",$P(X,"";""),$P(X,"";"",2),DA)=""""")
 ;;.4,1,1,2 K:X'?.P @(DIC_"""GL"",$P(X,"";""),$P(X,"";"",2),DA)")
 ;;.4,9 ^
 ;;.5,0 INPUT TRANSFORM^CJ44^^ ; ^S @("X=$P("_DCC_"D0,0),U,5,99)")
 ;;.5,9 ^
 ;;1,0 CROSS-REFERENCE^.1^^1;0
 ;;1.1,0 AUDIT^S^y:YES, ALWAYS;n:NO;e:EDITED OR DELETED;^AUDIT;1^Q
 ;;1.1,1,0 ^.1
 ;;1.1,1,1,0 0^AUD^MUMPS
 ;;1.1,1,1,1 I "ye"[X,$P(^DD(DA(1),DA,0),U,2)'["a" S $P(^(0),U,2)=$P(^(0),U,2)_"a"
 ;;1.1,1,1,2 S $P(^(0),U,2)=$P($P(^DD(DA(1),DA,0),U,2),"a")_$P($P(^(0),U,2),"a",2,9)
 ;;1.1,1,2,0 0^AUDIT^MUMPS
 ;;1.1,1,2,1 S:"ye"[X ^DD(DA(1),"AUDIT",DA)=""
 ;;1.1,1,2,2 K ^DD(DA(1),"AUDIT",DA)
 ;;1.2,0 AUDIT CONDITION^K^^AX;E1,245^D ^DIM
 ;;1.2,3 Enter Mumps Code that will set $T to 1 for Audit to take place.
 ;;2,0 OUTPUT TRANSFORM^F^^2;E1,245^D ^DIM
 ;;3,0 'HELP'-PROMPT^F^^3;E1,245^K:X'?3.E!($L(X)>200) X
 ;;4,0 XECUTABLE 'HELP'^F^^4;E1,245^D ^DIM
 ;;7.5,0 PRE-LOOKUP TRANSFORM^F^^7.5;E1,245^D ^DIM
 ;;8,0 READ ACCESS (OPTIONAL)^F^^8;E1,245^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;8,3 ENTER A STRING OF CHARACTERS WHICH ARE IN YOUR OWN ACCESS CODE ('DUZ(0)')
 ;;8.5,0 DELETE ACCESS (OPTIONAL)^F^^8.5;E1,245^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;9,0 WRITE ACCESS (OPTIONAL)^F^^9;E1,245^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;9.01,0 COMPUTED FIELDS USED^F^^9.01;E1,250^Q
 ;;9.01,1,0 ^.1^1^1
 ;;9.01,1,1,0 DA(2)^ACOMP^MUMPS
 ;;9.01,1,1,1 F %=1:1 S I=$P(X,";",%) Q:I=""  S ^DD("ACOMP",+I,+$P(I,U,2),DA(1),DA)=""
 ;;9.01,1,1,2 F %=1:1 S I=$P(X,";",%) Q:I=""  K ^DD("ACOMP",+I,+$P(I,U,2),DA(1),DA)
 ;;10,0 SOURCE^F^^10;E1,99^K:$L(X)>99 X
 ;;10,3 WHERE THIS DATA ELEMENT COMES FROM (UP TO 99 CHARACTERS)
 ;;11,0 DESTINATION^.2LAP^^11;0
 ;;12,0 POINTER SCREEN^^^12;E1,250
 ;;12.1,0 CODE TO SET POINTER SCREEN^^^12.1;E1,250^D ^DIM
 ;;12.2,0 EXPRESSION FOR POINTER SCREEN^^^12.2;E1,250
 ;;20,0 GROUP^.3LA^^20;0
 ;;21,0 DESCRIPTION^.001^^21;0

DINIT11
DINIT11 ;SFISC/GFT,XAK-INITIALIZE VA FILEMAN ;20DEC2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT11A:X?.P S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;0,23,0 TECHNICAL DESCRIPTION^.001^^23;0
 ;;0,50,0 DATE FIELD LAST EDITED^D^^DT;1^Q
 ;;0,50,9 ^
 ;;0,999,0 TRIGGERED-BY POINTER^.15^^5;0
 ;;0,999,9 ^
 ;;.1,0,"NM","CROSS-REFERENCE"
 ;;.1,0 CROSS-REFERENCE^
 ;;.1,.01,0 INDEX^F^^0;E1,245^Q
 ;;.1,.01,1,0 ^.1^3^3
 ;;.1,.01,1,1,0 0^IX
 ;;.1,.01,1,1,1 S:$P(X,U,2)]"" @("^DD("_$P(X,"^",1)_",0,""IX"",$P(X,""^"",2),DA(2),DA(1))=""""")
 ;;.1,.01,1,1,2 K:$P(X,U,2)]"" @("^DD("_$P(X,"^",1)_",0,""IX"",$P(X,""^"",2),DA(2),DA(1))")
 ;;.1,.01,1,2,0 DA(2)^IX
 ;;.1,.01,1,2,1 S ^DD(DA(2),"IX",DA(1))=""
 ;;.1,.01,1,2,2 I $O(^DD(DA(2),DA(1),1,0))=DA,$O(^(DA))="" K ^DD(DA(2),"IX",DA(1))
 ;;.1,.01,1,3,0 ^^TRIGGER
 ;;.1,.01,1,3,1 S Y=$P(X,U,5),X=$P(X,U,4),Z=DA(2)_U_DA(1)_U_DA I Y F %=1:1 Q:'%  S %1=$S($D(^DD(X,Y,5,%,0)):^(0),1:0) Q:%1=Z  I '%1 S ^(0)=Z F %=-1:0 S ^DD(X,"TRB",DA(2),DA(1),DA,Y)="",Y=X Q:'$D(^DD(X,0,"UP"))  S X=^("UP"),Y=$O(^DD(X,"SB",Y,0))
 ;;.1,.01,1,3,2 S Y=$P(X,"^",5),X=$P(X,"^",4) I Y S %=0 F  S %=$O(^DD(X,Y,5,%)) Q:%=""  Q:'$D(^(%,0))  I DA(2)_"^"_DA(1)_"^"_DA=^(0) K ^DD(X,Y,5,%) F  K ^DD(X,"TRB",DA(2),DA(1),DA,Y) Q:'$D(^DD(X,0,"UP"))  S Y=X,X=^("UP"),Y=$O(^DD(X,"SB",Y,0))
 ;;.1,1,0 SET STATEMENT^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;.1,1,3 This is Standard MUMPS code.
 ;;.1,1,21,0 ^^3^3^2890802^
 ;;.1,1,21,1,0 Enter Standard MUMPS code which will set this cross-reference.
 ;;.1,1,21,2,0 You may use X to reference the data in this field and DA-array
 ;;.1,1,21,3,0 to reference the internal entry numbers in the file.
 ;;.1,1,"DEL",1,0 I 1 W $C(7),!,"CAN'T DELETE THIS NODE."
 ;;.1,2,0 KILL STATEMENT^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;.1,2,3 This is Standard MUMPS code.
 ;;.1,2,21,0 ^^3^3^2890802^
 ;;.1,2,21,1,0 Enter Standard MUMPS code which will kill this cross-reference.
 ;;.1,2,21,2,0 You may use X to reference the data in this field and the DA-array
 ;;.1,2,21,3,0 to reference the internal entry numbers in the file.
 ;;.1,2,"DEL",1,0 I 1 W $C(7),!,"CAN'T DELETE THIS NODE."
 ;;.1,3,0 NO-DELETION MESSAGE^F^^3;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>245!($L(X)<3) X
 ;;.1,3,1,0 ^.1
 ;;.1,3,1,1,0 .1^AC^MUMPS
 ;;.1,3,1,1,1 Q
 ;;.1,3,1,1,2 K:^DD(DA(2),DA(1),1,DA,3)']"" ^(3)
 ;;.1,3,3 Answer must be 3-245 characters in length.
 ;;.1,3,21,0 ^^2^2^2890803^^
 ;;.1,3,21,1,0 Enter a message if you want to prevent this cross-reference from being
 ;;.1,3,21,2,0 deleted.
 ;;.1,4,0 DATE UPDATED^D^^DT;1^S %DT="ET" D ^%DT S X=Y K:Y<1 X
 ;;.1,10,0 DESCRIPTION^.101^^%D;0
 ;;.1,"IX",.01
 ;;.1,666,0 RE-INDEXING^SI^1:NO RE-INDEXING ALLOWED;0:ALLOW REINDEXING^NOREINDEX;1
 ;;.1,666,3 Should the re-indexing of this cross reference be prohibited?
 ;;.1,666,21,0 ^^5^5
 ;;.1,666,21,1,0 If you answer '1', this cross reference will not be re-indexed during a
 ;;.1,666,21,2,0 general re-indexing of this file, whether it's done via API or
 ;;.1,666,21,3,0 interactively. If you answer '0', which is the default, it will. A cross
 ;;.1,666,21,4,0 reference will be re-indexed if it is specifically named in an API call.
 ;;.1,666,21,5,0 For those APIs which re-index a single record, this restriction is ignored.
 ;;.101,0 DESCRIPTION SUB-FIELD^^.01^1
 ;;.101,0,"UP" .1
 ;;.101,.01,0 DESCRIPTION^W^^0;1^Q

DINIT11A
DINIT11A ;SFISC/XAK-INITIALIZE VA FILEMAN ;06:30 PM  5 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EGP I '$D(^DD("DD")) S ^("DD")="S Y=$$FMTE^DILIBF(Y,""5U"")" ;**CCO/NI DO NOT WRITE OVER DATE-OUTPUT CODE
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) Q:X?.P  S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;.001,0 DESCRIPTION^
 ;;.001,.01,0 DESCRIPTION^W^^0;1
 ;;.12,0 FIELD^
 ;;.12,0,"NM","VARIABLE-POINTER"
 ;;.12,.01,0 VARIABLE-POINTER^R*P1'^DIC(^0;1^S:DUZ(0)'="@" DIC("S")="I 1 Q:'$D(^(0,""RD""))  F %=1:1:$L(^(""RD"")) I DUZ(0)[$E(^(""RD""),%) Q" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;.12,.01,1,0 ^.1
 ;;.12,.01,1,1,0 .12^B
 ;;.12,.01,1,1,1 S ^DD(DA(2),DA(1),"V","B",X,DA)=""
 ;;.12,.01,1,1,2 K ^DD(DA(2),DA(1),"V","B",X,DA)
 ;;.12,.01,1,2,0 .12^PT^MUMPS
 ;;.12,.01,1,2,1 S ^DD(+X,0,"PT",DA(2),DA(1))=""
 ;;.12,.01,1,2,2 K ^DD(+X,0,"PT",DA(2),DA(1))
 ;;.12,.01,4
 ;;.12,.01,12.1 S:DUZ(0)'="@" DIC("S")="I 1 Q:'$D(^(0,""RD""))  F %=1:1:$L(^(""RD"")) I DUZ(0)[$E(^(""RD""),%) Q"
 ;;.12,.02,0 MESSAGE^RF^^0;2^K:$L(X)>30!($L(X)<1) X
 ;;.12,.02,1,1,0 .12^M^MUMPS
 ;;.12,.02,1,1,1 S ^DD(DA(2),DA(1),"V","M",X,DA)=""
 ;;.12,.02,1,1,2 K ^DD(DA(2),DA(1),"V","M",X,DA)
 ;;.12,.02,3 ANSWER MUST BE 1-30 CHARACTERS IN LENGTH
 ;;.12,.03,0 ORDER^RNJ4,1X^^0;3^K:+X'=X!(X>99)!(X<1)!(X?.E1"."2N.N) X I $D(X),$D(^DD(DA(2),DA(1),"V","O",X)),$O(^(X,0))'=DA K X I $D(^DD(DA(2),DA(1),"V",$O(^(0)),0)) S %=+^(0) W:% "  Used by "_$S($D(^DIC(%,0)):$P(^(0),U,1),1:%)_" FILE "
 ;;.12,.03,1,0 ^.1
 ;;.12,.03,1,1,0 .12^O^MUMPS
 ;;.12,.03,1,1,1 S ^DD(DA(2),DA(1),"V","O",X,DA)=""
 ;;.12,.03,1,1,2 K ^DD(DA(2),DA(1),"V","O",X,DA)
 ;;.12,.03,3 Type a unique number between 1 and 99, one decimal point allowed.
 ;;.12,.04,0 PREFIX^RFX^^0;4^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>10 X I $D(X),$D(^DD(DA(2),DA(1),"V","P",X)),$O(^(X,0))'=DA K X I $D(^DD(DA(2),DA(1),"V",$O(^(0)),0)) S %=+^(0) W:% "  Used by "_$S($D(^DIC(%,0)):$P(^(0),U,1),1:%)_" FILE "
 ;;.12,.04,1,0 ^.1
 ;;.12,.04,1,1,0 .12^P^MUMPS
 ;;.12,.04,1,1,1 S ^DD(DA(2),DA(1),"V","P",X,DA)=""
 ;;.12,.04,1,1,2 K ^DD(DA(2),DA(1),"V","P",X,DA)
 ;;.12,.04,3 Answer must be a unique prefix, 1-10 characters in length
 ;;.12,.05,0 SHOULD ENTRIES BE SCREENED^S^y:YES;n:NO;^0;5^Q
 ;;.12,.06,0 LAYGO^S^y:YES;n:NO;^0;6^Q
 ;;.12,.06,.1 SHOULD USER BE ALLOWED TO ADD A NEW ENTRY
 ;;.12,1,0 SCREEN^RFX^^1;E1,240^K:$L(X)>240!($L(X)<1)!(X'["DIC(""S"")") X D:$D(X) ^DIM
 ;;.12,1,.1 MUMPS CODE THAT WILL SET DIC('S')
 ;;.12,1,3 ANSWER MUST BE 1-240 CHARACTERS IN LENGTH AND VALID MUMPS CODE
 ;;.12,1,4 I X?1"??".E D HELP^DICATT4
 ;;.12,1,"DEL",1,0 I $P(^DD(DA(2),DA(1),"V",DA,0),U,5)="y" W !?3,"Answer 'NO' to the 'SHOULD ENTRIES BE SCREENED' prompt to delete the screen"
 ;;.12,2,0 EXPLANATION OF SCREEN^FR^^2;1^K:$L(X)>240!($L(X)<1) X
 ;;.12,2,3 ANSWER MUST BE 1-240 CHARACTERS IN LENGTH
 ;;.15,0 TRIGGERED-BY^
 ;;.15,0,"NM","TRIGGERED-BY"
 ;;.15,.01,0 DD NUMBER^N^^0;1^K:'$D(^DD(X)) X
 ;;.15,2,0 FIELD NUMBER^N^^0;2
 ;;.15,3,0 CROSS-REFERENCE NUMBER^N^^0;3
 ;;.3,0 GROUP^
 ;;.3,0,"NM","GROUP"
 ;;.3,.01,0 GROUP^F^^0;1^K:$L(X)>30!(X'?.ANP)!($A(X)<32) X
 ;;.3,.01,3 UP TO 30 CHARACTERS, ALPHANUMERIC
 ;;.3,.01,1,0 ^.1^1^1
 ;;.3,.01,1,1,0 0^GR
 ;;.3,.01,1,1,1 S ^DD(DA(2),"GR",X,DA(1),DA)=""
 ;;.3,.01,1,1,2 K ^DD(DA(2),"GR",X,DA(1),DA)
 ;;"$O" S Y="%" F %=0:0 S Y=$O(@Y) Q:Y=""  S %=$D(@Y) S:%#2 @(X_"Y)="_Y) I %>9 S %X=Y_"(",%Y=X_"Y," D %XY^%RCR
 ;;"KWIC" ^AND^THE^THEN^FOR^FROM^OTHER^THAN^WITH^THEIR^SOME^THIS^and^the^then^for^from^other^than^with^their^some^this

DINIT11B
DINIT11B ;SFISC/GFT,DCM,TKW-INITIALIZE VA FILEMAN ;15SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT11C:X?.P S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;1,0 ATTRIBUTE^N
 ;;1,0,"NM","FILE"
 ;;1,.01,0 NAME^RF^^0;1^K:$L(X)>45!($L(X)<3) X
 ;;1,.01,1,0 ^.1^1^1
 ;;1,.01,1,1,0 1^B
 ;;1,.01,1,1,1 S @(DIC_"""B"",$E(X,1,30),DA)=""""")
 ;;1,.01,1,1,2 K @(DIC_"""B"",$E(X,1,30),DA)")
 ;;1,.01,1,2,0 1^AD^MUMPS
 ;;1,.01,1,2,1 I DIC'?1"^DOPT(".E,$D(^DIC(DA,0,"GL"))  S $P(@(^DIC(DA,0,"GL")_"0)"),U,1)=X
 ;;1,.01,1,2,2 Q
 ;;1,.01,1,3,0 1^AE^MUMPS
 ;;1,.01,1,3,1 S:DIC'?1"^DOPT(".E ^DD(DA,0,"NM",X)=""
 ;;1,.01,1,3,2 K ^DD(DA,0,"NM")
 ;;1,.01,3 3-45 CHARACTERS
 ;;1,.01,"DEL",1,0 I DIC="^DIC(" D K^DIU2
 ;;1,.01,"DEL",.5,0 I DIC="^DIC(" D CHECKPT^DIU2
 ;;1,.01,"DEL","TRB",0 I $D(^DD(DA,"TRB")) D TRIG^DIDH
 ;;1,1,0 GLOBAL NAME^CJ14^^ ; ^S X=$S($D(^DIC(D0,0,"GL")):^("GL"),1:"")
 ;;1,1.1,0 ENTRIES^CJ7,0^^ ; ^S @("X=+$P("_$S($D(^DIC(D0,0,"GL")):"$S($D("_^("GL")_"0)):^(0),1:0)",1:0)_",""^"",4)")
 ;;1,4,0 DESCRIPTION^1.001^^%D;0
 ;;1.001,0 DESCRIPTION
 ;;1.001,.01,0 DESCRIPTION^W^^0;1
 ;;1.001,0,"UP" 1
 ;;1,10,0 APPLICATION GROUP^1.005^^%;0
 ;;1,20,0 DEVELOPER^P200'^VA(200,^%A;1^Q
 ;;1,21,0 DATE^D^^%A;2^S %DT="" D ^%DT S X=Y K:X<9 X
 ;;1,21.214,0 LAST DD MODIFICATION^D^^%MSC;1^S %DT="TSX" D ^%DT S X=Y K:X<9 X
 ;;1.005,0 APPLICATION GROUP^
 ;;1.005,0,"NM","APPLICATION-GROUP"
 ;;1.005,0,"UP" 1
 ;;1.005,.01,0 APPLICATION GROUP^MF^^0;1^K:X'?.U!($L(X)+1\3-1) X
 ;;1.005,.01,3 A 'NAMESPACE' (2-4 BYTES) INDICATING A PACKAGE ACCESSING THIS FILE
 ;;1.005,.01,1,0 ^.1^2^2
 ;;1.005,.01,1,1,0 1.005^B
 ;;1.005,.01,1,1,1 S ^DIC(DA(1),"%","B",X,DA)=""
 ;;1.005,.01,1,1,2 K ^DIC(DA(1),"%","B",X,DA)
 ;;1.005,.01,1,2,0 1^AC
 ;;1.005,.01,1,2,1 S ^DIC("AC",X,DA(1),DA)=""
 ;;1.005,.01,1,2,2 K ^DIC("AC",X,DA(1),DA)
 ;;1.005,1,0 PACKAGE NAME^CJ30^^ ; ^S X=$S($D(^DIC(9.4,+$O(^DIC(9.4,"C",$P(^DIC(D0,"%",D1,0),U),0)),0)):$P(^(0),U,1),1:"")
 ;;1.01,0 ATTRIBUTE
 ;;1.01,0,"NM","OPTION"
 ;;1.01,.001,0 NUMBER^N^^ ^K:X\1'=X X
 ;;1.01,.01,0 NAME^RF^^0;1^K:$L(X)>70 X
 ;;1.01,.01,1,0 ^.1
 ;;1.01,.01,1,1,0 1.01^B
 ;;1.01,.01,1,1,1 S @(DIC_"""B"",$E(X,1,30),DA)=""""")
 ;;1.01,.01,1,1,2 K @(DIC_"""B"",$E(X,1,30),DA)")

DINIT11C
DINIT11C ;SFISC/GFT,DCM-INITIALIZE VA FILEMAN ;16NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F I=1:1:6 S D=$P("DD^RD^WR^DEL^LAYGO^AUDIT",U,I),^DD(1,30+I,0)=D_" ACCESS^C^^ ; ^S X=$S($D(^DIC(D0,0,"""_D_""")):^("""_D_"""),1:"""")"
 S ^DD(1,50,0)="LOOKUP PROGRAM^C^^ ; ^S X=$S($D(^DD(D0,0,""DIC"")):^(""DIC""),1:"""")"
 S ^DD(1,51,0)="VERSION^CJ8^^ ; ^S X=$P($G(^DD(D0,0,""VR"")),U)"
 S ^DD(1,51.1,0)="DISTRIBUTION PACKAGE^CJ30^^ ; ^S X=$G(^DD(D0,0,""VRPK""))"
 S ^DD(1,51.2,0)="PACKAGE REVISION DATA^CJ240^^ ; ^S X=$G(^DD(D0,0,""VRRV""))"
 ;S ^DD(1,53,0)="RESTRICT EDITING OF FILE^C^^ ; ^S X=$S($D(^DD(D0,0,""DI"")):$P(^(""DI""),U,2),1:"""")"
 S ^DD(1,54,0)="ARCHIVE FILE^C^^ ; ^S X=$S($D(^DD(D0,0,""DI"")):$P(^(""DI""),U),1:"""")"
 S ^DD(1,1815,0)="COMPILED X-REF ROUTINE^CJ9^^ ; ^S X=$G(^DD(D0,0,""DIK""))"
 S ^DD(1,1816,0)="OLD COMPILED X-REF ROUTINE^CJ8^^ ; ^S X=$G(^DD(D0,0,""DIKOLD""))"
 S ^DD(1,1819,0)="COMPILED CROSS-REFERENCES^CJ3^^ ; ^S X=$S($G(^DD(D0,0,""DIK""))]"""":""YES"",1:""NO"")"
 S ^DD(1,1819,21,0)="^^3^3^2930709^",^(1,0)="Computed field that indicates whether or not cross-references are",^DD(1,1819,21,2,0)="compiled.  This field can be seen when doing an INQUIRE to the FILE "
 S ^DD(1,1819,21,3,0)="file (file #1, sometimes referred to as the file of files.)"
 F I=1815,1816,1819 S ^DD(1,I,9)="^",^(9.01)="",^(9.1)=$P(^(0),U,5,99)
BUILD S ^DD(1,21400,0)="BUILD^Cmp9.6^^ ; ^N D,DIF S DIF=D0 F D=0:0 S D=$O(^XPD(9.6,D)) Q:'D  I $D(^(D,4,DIF)) N D0 S D0=D,X=$P(^XPD(9.6,D,0),U) X DICMX Q:'$D(D)",^(9)=U
 S $P(^DIC(0),U,1,2)="FILE^1",^DIC(1,0)="FILE^1",^(0,"GL")="^DIC(" D A
 S ^DIC(1,"%D",0)="^^2^2^2940908^"
 S ^DIC(1,"%D",1,0)="This file stores the descriptive information for all files in the FileMan"
 S ^DIC(1,"%D",2,0)="managed database."
 S ^DD(1,.001,0)="NUMBER^N^^ ^K:X<2!$D(^DD(X)) X I $D(X),$D(^VA(200,DUZ,1))#2,$P(^(1),U)]"""" I X<$P(^(1),""-"")!(X>$P($P(^(1),U),""-"",2)) K X"
 S ^(4)="W !?5,""Enter an unused number"" I $D(^VA(200,DUZ,1)),$P(^(1),U)]"""" W "" within the range, "",$P(^(1),U)"
 ;
EGP K ^DD(1,"GL",1.008),^DD(1.008),^DD(.008),^DD(.009),^DD(.007)
 S ^DD(1,1.008,0)="TRANSLATION^1.008^^ALANG;0" ;NEXT 20 LINES BUILD DD DEFINITIONS OF FILE, FIELD AND HELP TRANSLATIONS INTO FOREIGN LANGUAGES
 S ^DD(1.008,0)="TRANSLATION^^"
 S ^DD(1.008,0,"UP")=1
 S ^DD(1.008,.001,0)="LANGUAGE^P.85^DI(.85,^ ^Q"
 S ^DD(1.008,.01,0)="TRANSLATION^F^^0;1^K:$L(X)>30 X"
 S ^DD(1.008,.01,1,0)="^.1^1^1"
 S ^DD(1.008,.01,1,1,0)="1^ALANG^MUMPS"
 S ^DD(1.008,.01,1,1,1)="S ^DIC(""ALANG""_DA,X,DA(1))="""""
 S ^DD(1.008,.01,1,1,2)="K ^DIC(""ALANG""_DA,X,DA(1))"
DD S ^DD(0,1.008,0)="TRANSLATION^.008^^.008;0"
 S ^DD(.008,0)="TRANSLATION^^"
 S ^DD(.008,0,"UP")=0
 S ^DD(.008,.001,0)="LANGUAGE^P.85^DI(.85,^ ^Q"
 S ^DD(.008,.01,0)="TRANSLATION^F^^0;1^K:$L(X)>30 X"
HELP S ^DD(0,1.009,0)="HELP TRANSLATION^.009^^.009;0"
 S ^DD(.009,0)="TRANSLATION^^"
 S ^DD(.009,0,"UP")=0
 S ^DD(.009,.001,0)="LANGUAGE^P.85^DI(.85,^ ^Q"
 S ^DD(.009,.01,0)="HELP MESSAGE^F^^0;1^K:$L(X)>240 X"
SET S ^DD(0,1.007,0)="SET TRANSLATION^.007^^.007;0"
 S ^DD(.007,0)="TRANSLATION^^"
 S ^DD(.007,0,"UP")=0
 S ^DD(.007,.001,0)="LANGUAGE^P.85^DI(.85,^ ^Q"
 S ^DD(.007,.01,0)="SET VALUES^F^^0;1^K:$L(X)>240 X"
 ;
 F I=.1,0 D XX,XX
DIK F I=.001,.007,.008,.009,.1,.12,.15,.101,.3,1,1.005,1.01,1.008 D XX ;DON'T DO .1101!
 ;
 Q
 ;
XX S DA(1)=I,DIK="^DD("_I_","
X W ".." D IXALL^DIK
 Q
 ;
A S (^("RD"),^("LAYGO"),^("WR"),^("DD"))=U Q
A1 S (^("DEL"),^("LAYGO"),^("WR"),^("DD"))=U Q
 ;

DINIT12
DINIT12 ;SFISC/GFT,XAK-INITIALIZE VA FILEMAN ;23FEB2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;**CCO/NI TAGS 'EGP'& 'EGP+1' ADDED TO CREATE NEW FIELDS IN PRINT TEMPLATES, TO REMEMBER THE DEVELOPER'S LANGUAGE, T+1 FOR DATE FORMAT
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G T:X?.P S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;.4,0 FIELD^^1819^21
 ;;.4,0,"DT" 2950909
 ;;.4,.01,0 NAME^F^^0;1^K:$L(X)<2!($L(X)>30) X
 ;;.4,.01,1,0 ^.1^2^2
 ;;.4,.01,1,1,0 .4^B
 ;;.4,.01,1,1,1 S @(DIC_"""B"",X,DA)=""""")
 ;;.4,.01,1,1,2 K @(DIC_"""B"",X,DA)")
 ;;.4,.01,1,2,0 ^^MUMPS
 ;;.4,.01,1,2,1 X "S %=$P("_DIC_"DA,0),U,4) S:$L(%) "_DIC_"""F""_+%,X,DA)=1"
 ;;.4,.01,1,2,2 X "S %=$P("_DIC_"DA,0),U,4) K:$L(%) "_DIC_"""F""_+%,X,DA)"
 ;;.4,.01,1,3,0 ^^MUMPS
 ;;.4,.01,1,3,1 Q
 ;;.4,.01,1,3,2 S X=-1 X "F  S X=$O("_DIC_"""AF"",X)) Q:X=""""  K:'X ^(X,DA) S Y=0 F  S Y=$O("_DIC_"""AF"",X,Y)) Q:Y'>0  K:$D(^(Y,DA)) ^(DA)" S X=-1 S:$G(Y)="" Y=-1
 ;;.4,.01,3 2-30 CHARACTERS
 ;;.4,2,0 DATE CREATED^D^^0;2^S %DT="ET" D ^%DT S X=Y K:Y<1 X
 ;;.4,3,0 READ ACCESS^F^^0;3^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;.4,4,0 FILE^P1'I^DIC(^0;4^Q
 ;;.4,4,1,0 ^.1^1^1
 ;;.4,4,1,1,0 ^^^MUMPS
 ;;.4,4,1,1,1 X "S %=$P("_DIC_"DA,0),U,1),"_DIC_"""F""_+X,%,DA)=1"
 ;;.4,4,1,1,2 Q
 ;;.4,5,0 USER #^N^^0;5^Q
 ;;.4,6,0 WRITE ACCESS^F^^0;6^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;.4,7,0 DATE LAST USED^D^^0;7^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;.4,1815,0 ROUTINE INVOKED^F^^ROU;E1,13^Q
 ;;.4,1815,9 @
 ;;.4,1815,1,0 ^.1^1^1
 ;;.4,1815,1,1,0 ^^^MUMPS
 ;;.4,1815,1,1,1 Q
 ;;.4,1815,1,1,2 D DELETROU^DIEZ($TR(X,U))
 ;;.4,1816,0 PREVIOUS ROUTINE INVOKED^F^^ROUOLD;E1,13^Q
 ;;.4,1816,9 @
 ;;.4,10,0 DESCRIPTION^.4001^^%D;0
 ;;.4001,0 DESCRIPTION SUB-FIELD^^.01^1
 ;;.4001,0,"NM","DESCRIPTION"
 ;;.4001,0,"UP" .4
 ;;.4001,.01,0 DESCRIPTION^W^^0;1^Q
 ;
T ;
 ;;N D,D1,D2 S D2=^(0) S:$X>30 D1(1,"F")="!" S D=$P(D2,U,2) S:D D1(2)="("_$$DATE^DIUTL(D)_")",D1(2,"F")="?30" S D=$P(D2,U,5) S:D D1(3)=" User #"_D,D1(3,"F")="?50" S D=$P(D2,U,4) S:D D1(4)=" File #"_D,D1(4,"F")="?59" D EN^DDIOL(.D1)
 S ^DD(.4,0,"ID","WRITE")=$P($T(T+1),";",3,99)
 S %X="^DD(.4," S %Y="^DD(.402," D %XY^%RCR
 S %X="^DD(.4001," S %Y="^DD(.4021," D %XY^%RCR
 K ^DD(.402,1804),^("SB",.404),^DD(.402,"GL","RD",0,1804)
 S ^DIC(.4,"%D",0)="^^3^3^2940908^"
 S ^DIC(.4,"%D",1,0)="This file stores the PRINT FIELDS data and other information about print"
 S ^DIC(.4,"%D",2,0)="templates.  These templates are used in the Print, Filegram, Extract, and"
 S ^DIC(.4,"%D",3,0)="Export options."
 S ^DIC(.402,"%D",0)="^^1^1^2940908^^"
 S ^DIC(.402,"%D",1,0)="This file stores the EDIT FIELDS data from an input template."
DD1 F I=1:1 S X=$T(DD1+I),Y=$P(X," ",3,99) G DD2:X?.P S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;.4,0,"ID","WRIT" I $P(^(0),U,8) N D1 S @("D1=$P($P($C(59)_$S($D(^DD(.4,8,0)):$P(^(0),U,3),1:0)_$E("_DIC_"Y,0),0),$C(59)_$P(^(0),U,8)_"":"",2),$C(59),1)") D EN^DDIOL("**"_D1_"**","","?0")
 ;;.4,0,"ID","WRITED" I $G(DZ)?1"???".E N % S %=0 F  S %=$O(^DIPT(Y,"%D",%)) Q:%'>0  I $D(^(%,0))#2 D EN^DDIOL(^(0),"","!?5")
 ;;.402,0,"ID","WRITED" I $G(DZ)?1"???".E N % S %=0 F  S %=$O(^DIE(Y,"%D",%)) Q:%'>0  I $D(^(%,0))#2 D EN^DDIOL(^(0),"","!?5")
 ;;.4,1620,9 ^
 ;;.4,1620,9.01
 ;;.4,1620,9.1 
 ;;.402,1620,0 EDIT FIELDS^Cm^^ ; ^D EN^DIET
 ;;.402,1620,21,0 ^
 ;;.402,1620,21,1,0 This multi-line field displays all the "EDIT" prompts of this Input Template
 ;;.402,1620,23,0 ^
 ;;.402,1620,23,1,0 This Computed Multiple uses code in ^DIETED to build the entire displayable Input Template.  Then it is output node-by-node.
 ;;.402,1819,9.1 S X=$S('$D(^DIE(D0,"ROU"))#2:"NO",^("ROU")="":"NO",1:"YES")
 ;;.4,1819,0 COMPILED^CJ3^^ ; ^S X=$S('$D(^DIPT(D0,"ROU"))#2:"NO",^("ROU")="":"NO",1:"YES")
 ;;.4,1819,9 ^
 ;;.4,1819,9.01
 ;;.4,1819,9.1 S X=$S('$D(^DIPT(D0,"ROU"))#2:"NO",^("ROU")="":"NO",1:"YES")
EGP ;;.4,1819.1,0 LANGUAGE IN WHICH COMPILED^P.85^DI(.85,^ROULANG;1
 ;;.4,709.1,0 LANGUAGE OF HEADING^P.85^DI(.85,^HLANG;1
 ;;.402,1819,0 COMPILED^CJ3^^ ; ^S X=$S('$D(^DIE(D0,"ROU"))#2:"NO",^("ROU")="":"NO",1:"YES")
 ;;.402,1819,9.1 S X=$S('$D(^DIE(D0,"ROU"))#2:"NO",^("ROU")="":"NO",1:"YES")
 ;;.402,1819,9 ^
 ;;.402,1819,9.01
 ;;.402,21400,0 BUILD(S)^Cmp9.6^^ ; ^N DIENAME,D S DIENAME=$P($G(^DIE(D0,0)),U)_"    FILE #"_$P($G(^(0)),U,4) F D=0:0 S D=$O(^XPD(9.6,D)) Q:'D  I $D(^(D,"KRN",.402,"NM","B",DIENAME)) N D0 S D0=D,X=$P(^XPD(9.6,D,0),U) X DICMX Q:'$D(D)
 ;;
DD2 N DICNT F DICNT=0:1:7 D @("^DINIT12"_DICNT)
 K DICNT G ^DINIT13

DINIT120
DINIT120 ;SFISC/MKO-SORT TEMPLATE FILE ;06:18 PM  16 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;**CCO/NI  TAG Q+24 CHANGED FOR DATE FORMAT
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT121
Q Q
 ;;^DIC(.401,0,"GL")
 ;;=^DIBT(
 ;;^DIC("B","SORT TEMPLATE",.401)
 ;;=
 ;;^DIC(.401,"%D",0)
 ;;=^^4^4^2940908^^
 ;;^DIC(.401,"%D",1,0)
 ;;=This file stores either SORT or SEARCH criteria. For SORT criteria, the
 ;;^DIC(.401,"%D",2,0)
 ;;=SORT DATA multiple contains the sort parameters. For SEARCH criteria, the
 ;;^DIC(.401,"%D",3,0)
 ;;=template also contains a list of record numbers selected as the result of
 ;;^DIC(.401,"%D",4,0)
 ;;=running the search.
 ;;^DD(.401,0)
 ;;=FIELD^^491620^21
 ;;^DD(.401,0,"DDA")
 ;;=N
 ;;^DD(.401,0,"DI")
 ;;=^
 ;;^DD(.401,0,"DT")
 ;;=2960910
 ;;^DD(.401,0,"ID","WRITE")
 ;;=N D,D1,D2 S D2=^(0) S:$X>30 D1(1,"F")="!" S D=$P(D2,U,2) S:D D1(2)="("_$$DATE^DIUTL(D)_")",D1(2,"F")="?30" S D=$P(D2,U,5) S:D D1(3)=" User #"_D,D1(3,"F")="?50" S D=$P(D2,U,4) S:D D1(4)=" File #"_D,D1(4,"F")="?59" D EN^DDIOL(.D1)
 ;;^DD(.401,0,"ID","WRITE1")
 ;;=N D1 S D1=$S($D(^DIBT(+Y,2)):"SORT",$D(^("DIS")):"SEARCH",$D(^(1)):"INQ",1:"") D EN^DDIOL(D1,"","?73")
 ;;^DD(.401,0,"ID","WRITED")
 ;;=I $G(DZ)?1"???".E N % S %=0 F  S %=$O(^DIBT(Y,"%D",%)) Q:%'>0  I $D(^(%,0))#2 D EN^DDIOL(^(0),"","!?5")
 ;;^DD(.401,0,"IX","B",.401,.01)
 ;;=
 ;;^DD(.401,0,"NM","SORT TEMPLATE")
 ;;=
 ;;^DD(.401,0,"PT",1.11,2)
 ;;=
 ;;^DD(.401,.01,0)
 ;;=NAME^F^^0;1^K:$L(X)<2!($L(X)>30) X
 ;;^DD(.401,.01,1,0)
 ;;=^.1^2^2
 ;;^DD(.401,.01,1,1,0)
 ;;=.401^B
 ;;^DD(.401,.01,1,1,1)
 ;;=S @(DIC_"""B"",X,DA)=""""")
 ;;^DD(.401,.01,1,1,2)
 ;;=K @(DIC_"""B"",X,DA)")
 ;;^DD(.401,.01,1,2,0)
 ;;=^^MUMPS
 ;;^DD(.401,.01,1,2,1)
 ;;=X "S %=$P("_DIC_"DA,0),U,4) S:$L(%) "_DIC_"""F""_+%,X,DA)=1"
 ;;^DD(.401,.01,1,2,2)
 ;;=X "S %=$P("_DIC_"DA,0),U,4) K:$L(%) "_DIC_"""F""_+%,X,DA)"
 ;;^DD(.401,.01,3)
 ;;=2-30 CHARACTERS
 ;;^DD(.401,2,0)
 ;;=DATE CREATED^D^^0;2^S %DT="ET" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.401,3,0)
 ;;=READ ACCESS^F^^0;3^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;^DD(.401,4,0)
 ;;=FILE^P1'I^DIC(^0;4^Q
 ;;^DD(.401,4,1,0)
 ;;=^.1^1^1
 ;;^DD(.401,4,1,1,0)
 ;;=^^^MUMPS
 ;;^DD(.401,4,1,1,1)
 ;;=X "S %=$P("_DIC_"DA,0),U,1),"_DIC_"""F""_+X,%,DA)=1"
 ;;^DD(.401,4,1,1,2)
 ;;=Q
 ;;^DD(.401,5,0)
 ;;=USER #^N^^0;5^Q
 ;;^DD(.401,6,0)
 ;;=WRITE ACCESS^F^^0;6^I DUZ(0)'="@" F I=1:1:$L(X) I DUZ(0)'[$E(X,I) K X Q
 ;;^DD(.401,7,0)
 ;;=DATE LAST USED^D^^0;7^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.401,8,0)
 ;;=TEMPLATE TYPE^S^1:ARCHIVING SEARCH;^0;8^Q
 ;;^DD(.401,8,3)
 ;;=Enter a 1 if this is an ARCHIVING SEARCH template (i.e., used to store lists of records to be archived) as opposed to a normal SEARCH or SORT template
 ;;^DD(.401,9,0)
 ;;=SEARCH COMPLETE DATE^D^^QR;1^S %DT="ESTXR" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.401,9,3)
 ;;=Enter the date/time that this search was run to completion.
 ;;^DD(.401,9,21,0)
 ;;=^^4^4^2921124^
 ;;^DD(.401,9,21,1,0)
 ;;=  This field will be filled in automatically by the search option, but
 ;;^DD(.401,9,21,2,0)
 ;;=only if the search runs to completion.  It will contain the date/time
 ;;^DD(.401,9,21,3,0)
 ;;=that the search last ran.  If it was not allowed to run to completion,
 ;;^DD(.401,9,21,4,0)
 ;;=this field will be empty.
 ;;^DD(.401,9,23,0)
 ;;=^^1^1^2921124^^
 ;;^DD(.401,9,23,1,0)
 ;;=Filled in automatically by the FileMan search option.
 ;;^DD(.401,9,"DT")
 ;;=2921124
 ;;^DD(.401,10,0)
 ;;=DESCRIPTION^.4012^^%D;0
 ;;^DD(.401,11,0)
 ;;=TOTAL RECORDS SELECTED^NJ10,0^^QR;2^K:+X'=X!(X>9999999999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.401,11,3)
 ;;=Type a Number between 1 and 9999999999, 0 Decimal Digits
 ;;^DD(.401,11,21,0)
 ;;=^^5^5^2921125^^
 ;;^DD(.401,11,21,1,0)
 ;;=  This field is filled in automatically by the FileMan search option.
 ;;^DD(.401,11,21,2,0)
 ;;=If the search is allowed to run to completion, the total number of
 ;;^DD(.401,11,21,3,0)
 ;;=records that met the search criteria is stored in this field.  If the
 ;;^DD(.401,11,21,4,0)
 ;;=last search was not allowed to run to completion, this field will be
 ;;^DD(.401,11,21,5,0)
 ;;=null.
 ;;^DD(.401,11,23,0)
 ;;=^^1^1^2921124^
 ;;^DD(.401,11,23,1,0)
 ;;=Filled in automatically by the FileMan search option.
 ;;^DD(.401,11,"DT")
 ;;=2921125
 ;;^DD(.401,15,0)
 ;;=SEARCH SPECIFICATIONS^.4011^^O;0
 ;;^DD(.401,1620,0)
 ;;=SORT FIELDS^CmJ50^^ ; ^N DPP D DIBT^DIPT
 ;;^DD(.401,1621,0)
 ;;=SORT FIELD DATA^.4014^^2;0
 ;;^DD(.401,1622,0)
 ;;=BY(0)^FX^^BY0;1^K:$L(X)>30!($L(X)<3)!'(X?1.ANP1"(".ANP) X
 ;;^DD(.401,1622,3)
 ;;=Enter the static part of a global.  The leading up-arrow can be omitted.
 ;;^DD(.401,1622,21,0)
 ;;=^^4^4^2960911^^
 ;;^DD(.401,1622,21,1,0)
 ;;=Enter the static, unchanging part of an open global reference for either a
 ;;^DD(.401,1622,21,2,0)
 ;;=global or a cross-reference that contains the list of record numbers to
 ;;^DD(.401,1622,21,3,0)
 ;;=sort through on the first pass.  The leading up-arrow can be omitted.  
 ;;^DD(.401,1622,21,4,0)
 ;;=For example:  DIZ(662001,"A", or TMP("NMSP",$J,
 ;;^DD(.401,1622,23,0)
 ;;=^^1^1^2960911^^^^
 ;;^DD(.401,1622,23,1,0)
 ;;=Equivalent to the BY(0) input variable to programmer call EN1^DIP.
 ;;^DD(.401,1622,"DT")
 ;;=2960924
 ;;^DD(.401,1623,0)
 ;;=L(0)^NJ1,0^^BY0;2^K:+X'=X!(X>8)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.401,1623,3)
 ;;=Type a Number between 1 and 8, 0 Decimal Digits
 ;;^DD(.401,1623,21,0)
 ;;=^^4^4^2960911^^^
 ;;^DD(.401,1623,21,1,0)
 ;;=Enter the total number of subscripts that must be sorted through on the
 ;;^DD(.401,1623,21,2,0)
 ;;=global referenced by BY(0), including 1 for the record number.  Ex., to
 ;;^DD(.401,1623,21,3,0)
 ;;=sort through the "B" x-ref, we sort through the cross-referenced value
 ;;^DD(.401,1623,21,4,0)
 ;;=itself, then the record number, so L(0)=2.
 ;;^DD(.401,1623,23,0)
 ;;=^^1^1^2960911^^^
 ;;^DD(.401,1623,23,1,0)
 ;;=Equivalent to the L(0) input variable to programmer call EN1^DIP.
 ;;^DD(.401,1623,"DT")
 ;;=2960828
 ;;^DD(.401,1624,0)
 ;;=SORT RANGE DATA FOR BY(0)^.4011624^^BY0D;0
 ;;^DD(.401,1815,0)
 ;;=ROUTINE INVOKED^F^^ROU;E1,13^K:$L(X)>5!($L(X)<5) X
 ;;^DD(.401,1815,3)
 ;;=Answer must be 5 characters in length.Must contain '^DISZ'.
 ;;^DD(.401,1815,21,0)
 ;;=^^7^7^2930331^^^
 ;;^DD(.401,1815,21,1,0)
 ;;=  If this sort template is compiled, the first characters of the name
 ;;^DD(.401,1815,21,2,0)
 ;;=of that compiled routine will appear on this node.  Compiled sort
 ;;^DD(.401,1815,21,3,0)
 ;;=routines are re-created each time the sort/print runs.  These characters
 ;;^DD(.401,1815,21,4,0)
 ;;=are concatenated with the next available number from the COMPILED ROUTINE

DINIT121
DINIT121 ;SFISC/MKO-SORT TEMPLATE FILE ;29MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT122
Q Q
 ;;^DD(.401,1815,21,5,0)
 ;;=file to create the routine name.
 ;;^DD(.401,1815,21,6,0)
 ;;=  If this node is present, a new compiled sort routine will be created
 ;;^DD(.401,1815,21,7,0)
 ;;=during the FileMan sort/print.
 ;;^DD(.401,1815,23,0)
 ;;=^^3^3^2930331^^^
 ;;^DD(.401,1815,23,1,0)
 ;;=A routine beginning with these characters is created during the FileMan
 ;;^DD(.401,1815,23,2,0)
 ;;=sort/print.  The routine is then called from DIO2 to do the sort, rather
 ;;^DD(.401,1815,23,3,0)
 ;;=than executing code from the local DY, DZ and P arrays.
 ;;^DD(.401,1815,"DT")
 ;;=2930416
 ;;^DD(.401,1816,0)
 ;;=PREVIOUS ROUTINE INVOKED^F^^ROUOLD;E1,13^K:$L(X)>4!($L(X)<4)!'(X?1"DISZ") X
 ;;^DD(.401,1816,3)
 ;;=Entry must be 'DISZ'.
 ;;^DD(.401,1816,21,0)
 ;;=^^4^4^2930331^^
 ;;^DD(.401,1816,21,1,0)
 ;;=This node is present only to be consistant with other sort templates.
 ;;^DD(.401,1816,21,2,0)
 ;;=It's presence will indicate that at some time the SORT template was
 ;;^DD(.401,1816,21,3,0)
 ;;=compiled and will contain the beginning characters used to create the
 ;;^DD(.401,1816,21,4,0)
 ;;=name of the compiled routine.
 ;;^DD(.401,1816,"DT")
 ;;=2930416
 ;;^DD(.401,1819,0)
 ;;=COMPILED^CJ3^^ ; ^S X=$S($G(^DIBT(D0,"ROU"))]"":"YES",1:"NO")
 ;;^DD(.401,1819,9)
 ;;=^
 ;;^DD(.401,1819,9.01)
 ;;=
 ;;^DD(.401,1819,9.1)
 ;;=S X=$S($G(^DIBT(D0,"ROU"))]"":"YES",1:"NO")
 ;;^DD(.401,6666,0)
 ;;=ENTRIES^Cm^^ ; ^N FILE,DINAME,D S FILE=$P($G(^DIBT(D0,0)),U,4) I $D(^(1)) S DINAME=$G(^DIC(FILE,0,"GL"))_"D,0)" I DINAME[U F D=0:0 S D=$O(^DIBT(D0,1,D)) Q:'D  I $D(@DINAME) S X=$$GET1^DIQ(FILE,D,.01) X DICMX Q:'$D(D)
 ;;^DD(.401,21400,0)
 ;;=BUILD(S)^Cmp9.6^^ ; ^N DIBTNAME,D S DIBTNAME=$P($G(^DIBT(D0,0)),U)_"    FILE #"_$P($G(^(0)),U,4) F D=0:0 S D=$O(^XPD(9.6,D)) Q:'D  I $D(^(D,"KRN",.401,"NM","B",DIBTNAME)) N D0 S D0=D,X=$P(^XPD(9.6,D,0),U) X DICMX Q:'$D(D)
 ;;^DD(.401,491620,0)
 ;;=PRINT TEMPLATE^F^^DIPT;1^K:'$D(^DIPT("B",X)) X
 ;;^DD(.401,491620,4)
 ;;=N D1 S D1(1)="If this Sort Template should always be used with a particular",D1(2)="Print Template, enter the name of that Print Template.",D1(3)="" D EN^DDIOL(.D1)
 ;;^DD(.4011,0)
 ;;=SEARCH SPECIFICATIONS SUB-FIELD^^.01^1
 ;;^DD(.4011,0,"NM","SEARCH SPECIFICATIONS SUB-FIELD")
 ;;=
 ;;^DD(.4011,0,"UP")
 ;;=.401
 ;;^DD(.4011,.01,0)
 ;;=SEARCH SPECIFICATIONS^WL^^0;1
 ;;^DD(.4011624,0)
 ;;=SORT RANGE DATA FOR BY(0) SUB-FIELD^^3.2^6
 ;;^DD(.4011624,0,"DT")
 ;;=2960910
 ;;^DD(.4011624,0,"IX","B",.4011624,.01)
 ;;=
 ;;^DD(.4011624,0,"NM","SORT RANGE DATA FOR BY(0)")
 ;;=
 ;;^DD(.4011624,0,"UP")
 ;;=.401
 ;;^DD(.4011624,.01,0)
 ;;=SUBSCRIPT LEVEL^MNJ1,0^^0;1^K:+X'=X!(X>7)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.4011624,.01,1,0)
 ;;=^.1
 ;;^DD(.4011624,.01,1,1,0)
 ;;=.4011624^B
 ;;^DD(.4011624,.01,1,1,1)
 ;;=S ^DIBT(DA(1),"BY0D","B",$E(X,1,30),DA)=""
 ;;^DD(.4011624,.01,1,1,2)
 ;;=K ^DIBT(DA(1),"BY0D","B",$E(X,1,30),DA)
 ;;^DD(.4011624,.01,3)
 ;;=Enter a number, 1 or more.  L(0)-1 is the upper limit.
 ;;^DD(.4011624,.01,21,0)
 ;;=^^4^4^2960911^^^^
 ;;^DD(.4011624,.01,21,1,0)
 ;;=This field corresponds to a subscript in, and contains sort from/to ranges
 ;;^DD(.4011624,.01,21,2,0)
 ;;=and/or subheader information for, any of the variable subscripts in the
 ;;^DD(.4011624,.01,21,3,0)
 ;;=BY(0) global.  Any number here should never be greater than L(0)-1.  This
 ;;^DD(.4011624,.01,21,4,0)
 ;;=can represent a sparse array.
 ;;^DD(.4011624,.01,23,0)
 ;;=^^3^3^2960911^^^^
 ;;^DD(.4011624,.01,23,1,0)
 ;;=Corresponds to subscript levels in the BY(0) global, and will be used to
 ;;^DD(.4011624,.01,23,2,0)
 ;;=put sort from/to and subheader information into the DPP array when the
 ;;^DD(.4011624,.01,23,3,0)
 ;;=sort data is being built.
 ;;^DD(.4011624,.01,"DT")
 ;;=2960828
 ;;^DD(.4011624,1,0)
 ;;=FR(0,n)^F^^0;2^K:$L(X)>62!($L(X)<1) X
 ;;^DD(.4011624,1,3)
 ;;=Starting value for the sort on this subscript.  Answer must be 1-62 characters in length.
 ;;^DD(.4011624,1,21,0)
 ;;=^^16^16^2960911^^^^
 ;;^DD(.4011624,1,21,1,0)
 ;;=Use this field to define the FR(0,n) variable as you would in a
 ;;^DD(.4011624,1,21,2,0)
 ;;=call to EN1^DIP that included BY(0).  If defined, the value will be
 ;;^DD(.4011624,1,21,3,0)
 ;;=used as the starting point as FileMan sequences through the global
 ;;^DD(.4011624,1,21,4,0)
 ;;=array referenced by BY(0) at this subscript level (n).
 ;;^DD(.4011624,1,21,5,0)
 ;;= 
 ;;^DD(.4011624,1,21,6,0)
 ;;=Values are not transformed, so enter the internal form just as it
 ;;^DD(.4011624,1,21,7,0)
 ;;=is stored in the global array.  A date, for example, would be 2960829,
 ;;^DD(.4011624,1,21,8,0)
 ;;=not Aug 29, 1996.
 ;;^DD(.4011624,1,21,9,0)
 ;;= 
 ;;^DD(.4011624,1,21,10,0)
 ;;=Don't attempt to use the at-sign (@) to include records with null
 ;;^DD(.4011624,1,21,11,0)
 ;;=values (as can be done in ordinary sorts).  Only use values that can
 ;;^DD(.4011624,1,21,12,0)
 ;;=be compared with actual data in this subscript of the global array
 ;;^DD(.4011624,1,21,13,0)
 ;;=referenced by BY(0).  (The only records that can be selected are ones
 ;;^DD(.4011624,1,21,14,0)
 ;;=that exist in this global array.  A record with a null value for this
 ;;^DD(.4011624,1,21,15,0)
 ;;=subscript would exist in the data file but not in this array and thus
 ;;^DD(.4011624,1,21,16,0)
 ;;=can't be selected.)
 ;;^DD(.4011624,1,23,0)
 ;;=^^1^1^2960911^^^^
 ;;^DD(.4011624,1,23,1,0)
 ;;=Equivalent to the FR(0,n) input variable to the programmer call EN1^DIP.
 ;;^DD(.4011624,1,"DT")
 ;;=2960828
 ;;^DD(.4011624,2,0)
 ;;=TO(0,n)^F^^0;3^K:$L(X)>62!($L(X)<1) X
 ;;^DD(.4011624,2,3)
 ;;=Ending value for sort on this subscript.  Answer must be 1-62 characters in length.
 ;;^DD(.4011624,2,21,0)
 ;;=^^9^9^2960911^^^^
 ;;^DD(.4011624,2,21,1,0)
 ;;=Use this field to define the TO(0,n) variable as you would in a
 ;;^DD(.4011624,2,21,2,0)
 ;;=call to EN1^DIP that included BY(0).  If defined, the value will be
 ;;^DD(.4011624,2,21,3,0)
 ;;=used as the ending point as FileMan sequences through the global
 ;;^DD(.4011624,2,21,4,0)
 ;;=array referenced by BY(0) at this subscript level (n).
 ;;^DD(.4011624,2,21,5,0)
 ;;= 
 ;;^DD(.4011624,2,21,6,0)
 ;;=Values are not transformed, so enter the internal form just as it
 ;;^DD(.4011624,2,21,7,0)
 ;;=is stored in the global array.  An inverse date, for example,
 ;;^DD(.4011624,2,21,8,0)
 ;;=would be 7039268, not 7/31/96.  Do not attempt to use @ to select
 ;;^DD(.4011624,2,21,9,0)
 ;;=records with null values for this subscript.
 ;;^DD(.4011624,2,23,0)
 ;;=^^1^1^2960911^^^^
 ;;^DD(.4011624,2,23,1,0)
 ;;=Equivalent to the TO(0,n) input variable to the programmer call EN1^DIP.
 ;;^DD(.4011624,2,"DT")
 ;;=2960828
 ;;^DD(.4011624,3.1,0)
 ;;=DISPAR(0,n) PIECE ONE^FX^^1;1^K:$L(X)>10!($L(X)<1)!("#!#"'[X) X
 ;;^DD(.4011624,3.1,3)
 ;;=Answer with #, !, #!, or null.
 ;;^DD(.4011624,3.1,21,0)
 ;;=^^6^6^2960910^^
 ;;^DD(.4011624,3.1,21,1,0)
 ;;=Just as when setting the first piece of DISPAR(0,n) in a programmer
 ;;^DD(.4011624,3.1,21,2,0)
 ;;=call that includes BY(0) when calling EN1^DIP, this field can hold

DINIT122
DINIT122 ;SFISC/MKO-SORT TEMPLATE FILE ;1:13 PM  13 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT123
Q Q
 ;;^DD(.4011624,3.1,21,3,0)
 ;;=the sort qualifiers for page breaks (#) or rankings (!).  
 ;;^DD(.4011624,3.1,21,4,0)
 ;;= 
 ;;^DD(.4011624,3.1,21,5,0)
 ;;=The # and/or ! are the only qualifiers that can be used.  Others,
 ;;^DD(.4011624,3.1,21,6,0)
 ;;=such as + for subtotals, cannot be used.
 ;;^DD(.4011624,3.1,23,0)
 ;;=^^1^1^2960910^^
 ;;^DD(.4011624,3.1,23,1,0)
 ;;=Equivalent to the 1st piece of DISPAR(0,n) in the EN1^DIP call.
 ;;^DD(.4011624,3.1,"DT")
 ;;=2960910
 ;;^DD(.4011624,3.2,0)
 ;;=DISPAR(0,n) PIECE TWO^FX^^1;2^K:$L(X)>50!($L(X)<1)!'((X[";""")!(X[";L")!(X[";C")!(X[";S")) X
 ;;^DD(.4011624,3.2,3)
 ;;=Answer with qualifiers like ;"" or ;S2;C10;L30;"VALUE: "
 ;;^DD(.4011624,3.2,21,0)
 ;;=^^12^12^2960910^^^
 ;;^DD(.4011624,3.2,21,1,0)
 ;;=As when defining the second piece of DISPAR(0,n) in a programmer
 ;;^DD(.4011624,3.2,21,2,0)
 ;;=call that includes BY(0) when calling EN1^DIP, this field can hold
 ;;^DD(.4011624,3.2,21,3,0)
 ;;=the sort qualifiers that normally appear after a sort-by field in
 ;;^DD(.4011624,3.2,21,4,0)
 ;;=interactive mode.  The ones that can be used are as follows:
 ;;^DD(.4011624,3.2,21,5,0)
 ;;= 
 ;;^DD(.4011624,3.2,21,6,0)
 ;;= ;""         to have the subheader appear
 ;;^DD(.4011624,3.2,21,7,0)
 ;;= ;"caption"  to give the subheader a caption
 ;;^DD(.4011624,3.2,21,8,0)
 ;;= ;Ln         to left-justify the subheader to n characters
 ;;^DD(.4011624,3.2,21,9,0)
 ;;= ;Cn         to start the display in the nth column
 ;;^DD(.4011624,3.2,21,10,0)
 ;;= ;Sn         to skip n lines before each subheader
 ;;^DD(.4011624,3.2,21,11,0)
 ;;= 
 ;;^DD(.4011624,3.2,21,12,0)
 ;;=If this field is null, subheaders are supressed (@ is assumed).
 ;;^DD(.4011624,3.2,23,0)
 ;;=^^3^3^2960910^^^
 ;;^DD(.4011624,3.2,23,1,0)
 ;;=Equivalent to the 2nd piece of DISPAR(0,n) in the EN1^DIP call.
 ;;^DD(.4011624,3.2,23,2,0)
 ;;=Note that if DISPAR(0,n) is defined, subheaders will appear even if
 ;;^DD(.4011624,3.2,23,3,0)
 ;;=used with a print template that normally suppresses subheaders.
 ;;^DD(.4011624,3.2,"DT")
 ;;=2960911
 ;;^DD(.4011624,4,0)
 ;;=DISPAR(0,n,OUT)^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4011624,4,3)
 ;;=Enter code to transform subscript.  This is Standard M code.
 ;;^DD(.4011624,4,9)
 ;;=@
 ;;^DD(.4011624,4,21,0)
 ;;=^^7^7^2960829^^^^
 ;;^DD(.4011624,4,21,1,0)
 ;;=As when defining DISPAR(0,n,"OUT") for a call to EN1^DIP that includes
 ;;^DD(.4011624,4,21,2,0)
 ;;=BY(0), enter M code that will transform the sort-by value for this 
 ;;^DD(.4011624,4,21,3,0)
 ;;=subscript (n) when it is output (e.g. printed).  At the time
 ;;^DD(.4011624,4,21,4,0)
 ;;=the code is executed the untransformed value of the subscript will be in
 ;;^DD(.4011624,4,21,5,0)
 ;;=Y.  The code should put the transformed value back into Y.
 ;;^DD(.4011624,4,21,6,0)
 ;;= 
 ;;^DD(.4011624,4,21,7,0)
 ;;=For example, for an inverse date, S:Y Y=99999999-Y S Y=$$FMTE^XLFDT(Y)"
 ;;^DD(.4011624,4,23,0)
 ;;=^^2^2^2960829^^^^
 ;;^DD(.4011624,4,23,1,0)
 ;;=Equivalent to the DISPAR(0,n,"OUT") input variable to the programmer call
 ;;^DD(.4011624,4,23,2,0)
 ;;=EN1^DIP.
 ;;^DD(.4011624,4,"DT")
 ;;=2960829
 ;;^DD(.4012,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.4012,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.4012,0,"UP")
 ;;=.401
 ;;^DD(.4012,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.4014,0)
 ;;=SORT FIELD DATA SUB-FIELD^^21^27
 ;;^DD(.4014,0,"DT")
 ;;=2931221
 ;;^DD(.4014,0,"IX","B",.4014,.01)
 ;;=
 ;;^DD(.4014,0,"NM","SORT FIELD DATA")
 ;;=
 ;;^DD(.4014,0,"UP")
 ;;=.401
 ;;^DD(.4014,.01,0)
 ;;=FILE OR SUBFILE NO.^MRNJ13,5^^0;1^K:+X'=X!(X>9999999.99999)!(X<0)!(X?.E1"."6N.N) X
 ;;^DD(.4014,.01,1,0)
 ;;=^.1
 ;;^DD(.4014,.01,1,1,0)
 ;;=.4014^B
 ;;^DD(.4014,.01,1,1,1)
 ;;=S ^DIBT(DA(1),2,"B",$E(X,1,30),DA)=""
 ;;^DD(.4014,.01,1,1,2)
 ;;=K ^DIBT(DA(1),2,"B",$E(X,1,30),DA)
 ;;^DD(.4014,.01,3)
 ;;=Type a Number between 0 and 9999999.99999, 5 Decimal Digits.  File or subfile number on which sort field resides.
 ;;^DD(.4014,.01,21,0)
 ;;=^^3^3^2930125^^
 ;;^DD(.4014,.01,21,1,0)
 ;;=This is the number of the file or subfile on which the sort field
 ;;^DD(.4014,.01,21,2,0)
 ;;=resides.  It is created automatically during the SORT FIELDS dialogue
 ;;^DD(.4014,.01,21,3,0)
 ;;=with the user in the sort/print option.
 ;;^DD(.4014,.01,23,0)
 ;;=^^1^1^2930125^^
 ;;^DD(.4014,.01,23,1,0)
 ;;=This number is automatically assigned by the print routine DIP.
 ;;^DD(.4014,.01,"DT")
 ;;=2930125
 ;;^DD(.4014,2,0)
 ;;=FIELD NO.^NJ13,5^^0;2^K:+X'=X!(X>9999999.99999)!(X<0)!(X?.E1"."6N.N) X
 ;;^DD(.4014,2,3)
 ;;=Type a Number between 0 and 9999999.99999, 5 Decimal Digits.  Sort field number, except for pointers, variable pointers and computed fields.
 ;;^DD(.4014,2,21,0)
 ;;=^^4^4^2930125^
 ;;^DD(.4014,2,21,1,0)
 ;;=On most sort fields, this piece will contain the field number.  If sorting
 ;;^DD(.4014,2,21,2,0)
 ;;=on a pointer, variable pointer or computed field, the piece will be null.
 ;;^DD(.4014,2,21,3,0)
 ;;=If sorting on the record number (NUMBER or .001), the piece will contain
 ;;^DD(.4014,2,21,4,0)
 ;;=a 0.
 ;;^DD(.4014,2,23,0)
 ;;=^^1^1^2930125^
 ;;^DD(.4014,2,23,1,0)
 ;;=Created by FileMan during the print option (in the DIP* routines).
 ;;^DD(.4014,2,"DT")
 ;;=2930125
 ;;^DD(.4014,3,0)
 ;;=FIELD NAME^F^^0;3^K:$L(X)>100!($L(X)<1) X
 ;;^DD(.4014,3,3)
 ;;=Answer must be 1-100 characters in length.
 ;;^DD(.4014,3,21,0)
 ;;=^^2^2^2930125^
 ;;^DD(.4014,3,21,1,0)
 ;;=This piece contains the sort field name, or the user entry if sorting by
 ;;^DD(.4014,3,21,2,0)
 ;;=an on-the-fly computed field.
 ;;^DD(.4014,3,23,0)
 ;;=^^1^1^2930125^
 ;;^DD(.4014,3,23,1,0)
 ;;=Created by FileMan during the print option (DIP* routines).
 ;;^DD(.4014,3,"DT")
 ;;=2930125
 ;;^DD(.4014,4,0)
 ;;=SORT QUALIFIERS BEFORE FIELD^F^^0;4^K:$L(X)>20!($L(X)<1) X
 ;;^DD(.4014,4,3)
 ;;=Answer must be 1-20 characters in length.  Sort qualifiers that normally precede the field number in the user dialogue (like !,@,#,+)
 ;;^DD(.4014,4,21,0)
 ;;=^^5^5^2930125^^^
 ;;^DD(.4014,4,21,1,0)
 ;;=This contains all of the sort qualifiers that normally precede the field
 ;;^DD(.4014,4,21,2,0)
 ;;=number in the user dialogue during the sort option.  It includes things
 ;;^DD(.4014,4,21,3,0)
 ;;=like # (Page break when sort value changes), @ (suppress printing of
 ;;^DD(.4014,4,21,4,0)
 ;;=subheader).  These qualifiers are listed out with no delimiters, as they
 ;;^DD(.4014,4,21,5,0)
 ;;=are found during the user dialogue.  (So you might see something like #@).

DINIT123
DINIT123 ;SFISC/MKO-SORT TEMPLATE FILE ;1:13 PM  13 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT124
Q Q
 ;;^DD(.4014,4,23,0)
 ;;=^^2^2^2930125^^
 ;;^DD(.4014,4,23,1,0)
 ;;=This information is parsed from the user dialogue or from the BY
 ;;^DD(.4014,4,23,2,0)
 ;;=input variable, by the FileMan print routines DIP*.
 ;;^DD(.4014,4,"DT")
 ;;=2930125
 ;;^DD(.4014,4.1,0)
 ;;=SORT QUALIFIERS AFTER FIELD^F^^0;5^K:$L(X)>70!($L(X)<1) X
 ;;^DD(.4014,4.1,3)
 ;;=Answer must be 1-70 characters in length.  Sort qualifiers that normally come after the field in the user dialogue (such as ;Cn, ;Ln, ;"Literal Subheader")
 ;;^DD(.4014,4.1,21,0)
 ;;=^^6^6^2930125^
 ;;^DD(.4014,4.1,21,1,0)
 ;;=This contains all of the sort qualifiers that normally come after the
 ;;^DD(.4014,4.1,21,2,0)
 ;;=field number in the user dialogue for the sort options.  It includes
 ;;^DD(.4014,4.1,21,3,0)
 ;;=things like ;Cn (specify position of subheader) and ;"literal" to
 ;;^DD(.4014,4.1,21,4,0)
 ;;=replace the caption of the subheader.  These qualifiers are listed with
 ;;^DD(.4014,4.1,21,5,0)
 ;;=no delimiters, as they are found in the user dialogue.  (So you might see
 ;;^DD(.4014,4.1,21,6,0)
 ;;=something like ;C10;"My Subheader").
 ;;^DD(.4014,4.1,23,0)
 ;;=^^2^2^2930125^
 ;;^DD(.4014,4.1,23,1,0)
 ;;=This information is parsed from the user dialogue or from the BY
 ;;^DD(.4014,4.1,23,2,0)
 ;;=input variable, by the FileMan print routines DIP*.
 ;;^DD(.4014,4.1,"DT")
 ;;=2930125
 ;;^DD(.4014,4.2,0)
 ;;=COMPUTED FIELD TYPE^F^^0;7^K:$L(X)>10!($L(X)<1) X
 ;;^DD(.4014,4.2,3)
 ;;=Answer must be 1-10 characters in length.  Set by the print routine to something that looks like second piece of 0 node of DD (data type information) for on-the-fly computed fields or .001 field.
 ;;^DD(.4014,4.2,21,0)
 ;;=^^4^4^2931022^
 ;;^DD(.4014,4.2,21,1,0)
 ;;=This piece will contain a "D" if on-the-fly computed field results in a
 ;;^DD(.4014,4.2,21,2,0)
 ;;=date.  It will be set to something like NJ6,0 if sorting by the .001
 ;;^DD(.4014,4.2,21,3,0)
 ;;=field. (These are the only values I have been able to find for this
 ;;^DD(.4014,4.2,21,4,0)
 ;;=field.)
 ;;^DD(.4014,4.2,23,0)
 ;;=^^3^3^2931022^
 ;;^DD(.4014,4.2,23,1,0)
 ;;=Set in C^DIP0 if DICOMP tells us that an on-the-fly computed field will
 ;;^DD(.4014,4.2,23,2,0)
 ;;=result in a date, and in ^DIP is sorting by the .001 field on a file that
 ;;^DD(.4014,4.2,23,3,0)
 ;;=has one.
 ;;^DD(.4014,4.2,"DT")
 ;;=2931022
 ;;^DD(.4014,4.3,0)
 ;;=ASK FOR FROM AND TO^S^1:YES;^ASK;1^Q
 ;;^DD(.4014,4.3,3)
 ;;=Enter 1 (YES) if user is to be prompted for FROM/TO values for this SORT FIELD.
 ;;^DD(.4014,4.3,21,0)
 ;;=^^3^3^2930201^
 ;;^DD(.4014,4.3,21,1,0)
 ;;=If this node is defined: then when the PRINT Option is run, or during
 ;;^DD(.4014,4.3,21,2,0)
 ;;=a call to the programmer print EN1^DIP, the user will be prompted
 ;;^DD(.4014,4.3,21,3,0)
 ;;=for FROM and TO VALUES for this sort field.
 ;;^DD(.4014,4.3,23,0)
 ;;=^^4^4^2930201^
 ;;^DD(.4014,4.3,23,1,0)
 ;;=This field is created automatically when a template is being created or
 ;;^DD(.4014,4.3,23,2,0)
 ;;=edited, if the developer enters FROM/TO values, AND if the developer
 ;;^DD(.4014,4.3,23,3,0)
 ;;=then answers YES to the question "SHOULD TEMPLATE USER BE ASKED
 ;;^DD(.4014,4.3,23,4,0)
 ;;='FROM'-'TO' RANGE FOR field?"
 ;;^DD(.4014,4.3,"DT")
 ;;=2930201
 ;;^DD(.4014,5,0)
 ;;=FROM VALUE INTERNAL^F^^F;1^K:$L(X)>63!($L(X)<1) X
 ;;^DD(.4014,5,3)
 ;;=Answer must be 1-63 characters in length.  The starting point for the sort, derived by FileMan.
 ;;^DD(.4014,5,21,0)
 ;;=^^3^3^2930119^^
 ;;^DD(.4014,5,21,1,0)
 ;;=FileMan takes the FROM value entered by the user, and finds the first
 ;;^DD(.4014,5,21,2,0)
 ;;=value that will sort just before this value in order to derive the
 ;;^DD(.4014,5,21,3,0)
 ;;=starting point for the sort.
 ;;^DD(.4014,5,23,0)
 ;;=^^1^1^2930119^^
 ;;^DD(.4014,5,23,1,0)
 ;;=Calculated by the sort routine FRV^DIP1.
 ;;^DD(.4014,5,"DT")
 ;;=2930119
 ;;^DD(.4014,6,0)
 ;;=FROM VALUE EXTERNAL^F^^F;2^K:$L(X)>63!($L(X)<1) X
 ;;^DD(.4014,6,3)
 ;;=Answer must be 1-63 characters in length.  The starting point for the sort, as entered by the user.
 ;;^DD(.4014,6,21,0)
 ;;=^^1^1^2930115^
 ;;^DD(.4014,6,21,1,0)
 ;;=The FROM value for the sort, as it was entered by the user.
 ;;^DD(.4014,6,"DT")
 ;;=2930119
 ;;^DD(.4014,6.5,0)
 ;;=FROM VALUE PRINTABLE^F^^F;3^K:$L(X)>40!($L(X)<1) X
 ;;^DD(.4014,6.5,3)
 ;;=Answer must be 1-40 characters in length.  Used for storing printable form of date or set values.
 ;;^DD(.4014,6.5,21,0)
 ;;=^^3^3^2930216^^
 ;;^DD(.4014,6.5,21,1,0)
 ;;=This field is used to store a printable representation of the FROM value
 ;;^DD(.4014,6.5,21,2,0)
 ;;=entered by the user during the sort/print dialogue.  Used for date and
 ;;^DD(.4014,6.5,21,3,0)
 ;;=set-of-code data types.
 ;;^DD(.4014,6.5,23,0)
 ;;=^^1^1^2930216^
 ;;^DD(.4014,6.5,23,1,0)
 ;;=Built in CK^DIP12.
 ;;^DD(.4014,6.5,"DT")
 ;;=2930216
 ;;^DD(.4014,7,0)
 ;;=TO VALUE INTERNAL^F^^T;1^K:$L(X)>63!($L(X)<1) X
 ;;^DD(.4014,7,3)
 ;;=Answer must be 1-63 characters in length.  The ending point for the sort, derived by FileMan.
 ;;^DD(.4014,7,21,0)
 ;;=^^3^3^2930115^
 ;;^DD(.4014,7,21,1,0)
 ;;=FileMan usually uses the TO value as entered by the user, but in the
 ;;^DD(.4014,7,21,2,0)
 ;;=case of dates and sets of codes, the internal value is used.  This field
 ;;^DD(.4014,7,21,3,0)
 ;;=tells FileMan the ending point for the sort.
 ;;^DD(.4014,7,"DT")
 ;;=2930119
 ;;^DD(.4014,8,0)
 ;;=TO VALUE EXTERNAL^F^^T;2^K:$L(X)>63!($L(X)<1) X
 ;;^DD(.4014,8,3)
 ;;=Answer must be 1-63 characters in length.  The ending point for the sort, as entered by the user.
 ;;^DD(.4014,8,21,0)
 ;;=^^1^1^2930115^
 ;;^DD(.4014,8,21,1,0)
 ;;=The ending value for the sort, as entered by the user.
 ;;^DD(.4014,8,"DT")
 ;;=2930119
 ;;^DD(.4014,8.5,0)
 ;;=TO VALUE PRINTABLE^F^^T;3^K:$L(X)>40!($L(X)<1) X
 ;;^DD(.4014,8.5,3)
 ;;=Answer must be 1-40 characters in length.  Used for storing printable form of date and set values.
 ;;^DD(.4014,8.5,21,0)
 ;;=^^3^3^2930216^
 ;;^DD(.4014,8.5,21,1,0)
 ;;=This field is used to store a printable representation of the TO value
 ;;^DD(.4014,8.5,21,2,0)
 ;;=entered by the user during the sort/print dialogue.  Used for date and
 ;;^DD(.4014,8.5,21,3,0)
 ;;=set-of-code data types.
 ;;^DD(.4014,8.5,23,0)
 ;;=^^1^1^2930216^
 ;;^DD(.4014,8.5,23,1,0)
 ;;=Created in CK^DIP12.
 ;;^DD(.4014,8.5,"DT")
 ;;=2930216
 ;;^DD(.4014,9,0)
 ;;=CROSS REFERENCE DATA^F^^IX;E1,245^K:$L(X)>245!($L(X)<1) X

DINIT124
DINIT124 ;SFISC/MKO-SORT TEMPLATE FILE ;1:13 PM  13 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT125
Q Q
 ;;^DD(.4014,9,3)
 ;;=First ^ piece null, second piece=static part of cross-reference, third piece=global reference, 4th piece=number of variable subscripts to get to (and including) record number.
 ;;^DD(.4014,9,21,0)
 ;;=^^8^8^2930115^
 ;;^DD(.4014,9,21,1,0)
 ;;= Piece 1 is always null
 ;;^DD(.4014,9,21,2,0)
 ;;= Piece 2 is the static part of the cross-reference: ex. DIZ(662001,"B",
 ;;^DD(.4014,9,21,3,0)
 ;;= Piece 3 is the global reference: ex. DIZ(662001,
 ;;^DD(.4014,9,21,4,0)
 ;;= Piece 4 tells FileMan how many variable subscripts must be sorted
 ;;^DD(.4014,9,21,5,0)
 ;;=through to get to the record number, plus 1 for the record number
 ;;^DD(.4014,9,21,6,0)
 ;;=itself.  ex. for a regular cross-reference, ^DIZ(662001,"B",X,DA),
 ;;^DD(.4014,9,21,7,0)
 ;;=the number is 2.  One for the value of the X subscript, and one for the
 ;;^DD(.4014,9,21,8,0)
 ;;=record number itself (DA).
 ;;^DD(.4014,9,23,0)
 ;;=^^6^6^2930115^
 ;;^DD(.4014,9,23,1,0)
 ;;=The IX nodes are normally derived by FileMan during the entry of sort
 ;;^DD(.4014,9,23,2,0)
 ;;=fields (in routine XR^DIP).  However, they can also be passed to the
 ;;^DD(.4014,9,23,3,0)
 ;;=print (^DIP) in the BY(0) variable to cause FileMan to either use a MUMPS
 ;;^DD(.4014,9,23,4,0)
 ;;=type cross-reference, or a previously sorted list of record numbers.
 ;;^DD(.4014,9,23,5,0)
 ;;=Fileman sometimes builds the IX node prior to calling the print, as in
 ;;^DD(.4014,9,23,6,0)
 ;;=the INQUIRE option, where the user then goes on to print the records.
 ;;^DD(.4014,9,"DT")
 ;;=2930115
 ;;^DD(.4014,9.5,0)
 ;;=POINT TO CROSS REFERENCE^F^^PTRIX;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.4014,9.5,3)
 ;;=Enter global reference for "B" index of .01 field on pointed-to file.  Answer must be 1-245 characters in length.
 ;;^DD(.4014,9.5,21,0)
 ;;=^^7^7^2931221^
 ;;^DD(.4014,9.5,21,1,0)
 ;;=This node will exist only if the sort field is a pointer, if the sort
 ;;^DD(.4014,9.5,21,2,0)
 ;;=field has a regular cross-reference, if the .01 field on the pointed-to
 ;;^DD(.4014,9.5,21,3,0)
 ;;=file has a "B" index, and if the .01 field on the pointed-to file is
 ;;^DD(.4014,9.5,21,4,0)
 ;;=either a numeric, date, set-of-codes or free-text field, and does not have
 ;;^DD(.4014,9.5,21,5,0)
 ;;=an output transform.  If this node exists, it will be set to the static
 ;;^DD(.4014,9.5,21,6,0)
 ;;=part of the global reference of the "B" index on the pointed-to file. (ex.
 ;;^DD(.4014,9.5,21,7,0)
 ;;=^DIZ(662001,"B",).
 ;;^DD(.4014,9.5,"DT")
 ;;=2931221
 ;;^DD(.4014,10,0)
 ;;=GET CODE^K^^GET;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4014,10,3)
 ;;=This is Standard MUMPS code used to extract the sort field from a record.
 ;;^DD(.4014,10,9)
 ;;=@
 ;;^DD(.4014,10,21,0)
 ;;=^^3^3^2930115^
 ;;^DD(.4014,10,21,1,0)
 ;;=The GET CODE is MUMPS code that is executed after a record (or sub-record)
 ;;^DD(.4014,10,21,2,0)
 ;;=has been selected.  The code extracts the SORT field from that record
 ;;^DD(.4014,10,21,3,0)
 ;;=into a local variable.
 ;;^DD(.4014,10,23,0)
 ;;=^^1^1^2930115^
 ;;^DD(.4014,10,23,1,0)
 ;;=GET CODE can be generated by a call to FileMan routine GET^DIOU.
 ;;^DD(.4014,10,"DT")
 ;;=2930115
 ;;^DD(.4014,11,0)
 ;;=QUERY CONDITION^K^^QCON;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4014,11,3)
 ;;=This is Standard MUMPS code used to test the field to see whether it meets the query condition (ex., whether it's within the from/to range specified by the user).
 ;;^DD(.4014,11,9)
 ;;=@
 ;;^DD(.4014,11,21,0)
 ;;=^^5^5^2930115^
 ;;^DD(.4014,11,21,1,0)
 ;;=The QUERY CONDITION is MUMPS code that takes a field in a local variable,
 ;;^DD(.4014,11,21,2,0)
 ;;=and executes some query condition.  The results of executing the code
 ;;^DD(.4014,11,21,3,0)
 ;;=will return a truth value of TRUE if the field met the condition, or
 ;;^DD(.4014,11,21,4,0)
 ;;=FALSE if not.  It is used, for example, to see whether a SORT FIELD falls
 ;;^DD(.4014,11,21,5,0)
 ;;=within the FROM/TO range requested by the user.
 ;;^DD(.4014,11,23,0)
 ;;=^^2^2^2930115^
 ;;^DD(.4014,11,23,1,0)
 ;;=The QUERY CONDITION code is generated by various calls to FileMan
 ;;^DD(.4014,11,23,2,0)
 ;;=routines DIOC*.
 ;;^DD(.4014,11,"DT")
 ;;=2930115
 ;;^DD(.4014,12,0)
 ;;=DESCRIPTION OF SORT^F^^TXT;E1,200^K:$L(X)>200!($L(X)<1) X
 ;;^DD(.4014,12,3)
 ;;=Answer must be 1-200 characters in length.  Text explaining the query condition (field name and what conditions must be met in order for the record to be selected).
 ;;^DD(.4014,12,21,0)
 ;;=^^4^4^2930115^
 ;;^DD(.4014,12,21,1,0)
 ;;=This field contains a brief textual description of the SORT FIELD and
 ;;^DD(.4014,12,21,2,0)
 ;;=the SORT CRITERIA used on it (i.e., the from/to values).  This
 ;;^DD(.4014,12,21,3,0)
 ;;=description can be printed in the heading of a report, at the users
 ;;^DD(.4014,12,21,4,0)
 ;;=request.
 ;;^DD(.4014,12,23,0)
 ;;=^^2^2^2930115^
 ;;^DD(.4014,12,23,1,0)
 ;;=This text is build as the developer answers the FROM/TO questions
 ;;^DD(.4014,12,23,2,0)
 ;;=during the SORT sequence.
 ;;^DD(.4014,12,"DT")
 ;;=2930115
 ;;^DD(.4014,13,0)
 ;;=SEARCH EFFICIENCY RATING^NJ9,4^^SER;1^K:+X'=X!(X>9999.9999)!(X<0)!(X?.E1"."5N.N) X
 ;;^DD(.4014,13,3)
 ;;=Type a Number between 0 and 9999.9999, 4 Decimal Digits.  Search efficiency number returned by Query Optimizer Routine.
 ;;^DD(.4014,13,21,0)
 ;;=^^7^7^2930125^
 ;;^DD(.4014,13,21,1,0)
 ;;=Fields are assigned a search efficiency rating based on the number of
 ;;^DD(.4014,13,21,2,0)
 ;;=hits found for the query (or sort) condition.  The fewer the hits, the
 ;;^DD(.4014,13,21,3,0)
 ;;=higher the rating.  A high rating indicates the criteria will more quickly
 ;;^DD(.4014,13,21,4,0)
 ;;=cut down the number of records to be processed.  The rating will be
 ;;^DD(.4014,13,21,5,0)
 ;;=higher if the field has a cross-reference.  The field with the highest
 ;;^DD(.4014,13,21,6,0)
 ;;=rating is used to do the initial loop through the file during the sort
 ;;^DD(.4014,13,21,7,0)
 ;;=phase.
 ;;^DD(.4014,13,23,0)
 ;;=^^1^1^2930125^
 ;;^DD(.4014,13,23,1,0)
 ;;=Calculated in the Query Optimizer routine ^DIOQ.
 ;;^DD(.4014,13,"DT")
 ;;=2930125
 ;;^DD(.4014,14,0)
 ;;=PROBABILITY RATING^NJ9,4^^SER;2^K:+X'=X!(X>9999.9999)!(X<0)!(X?.E1"."5N.N) X
 ;;^DD(.4014,14,3)
 ;;=Type a Number between 0 and 9999.9999, 4 Decimal Digits.  Probability of field meeting the sort criteria--returned by Query Optimizer routine.
 ;;^DD(.4014,14,21,0)
 ;;=^^6^6^2930125^^

DINIT125
DINIT125 ;SFISC/MKO-SORT TEMPLATE FILE ;1:13 PM  13 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT126
Q Q
 ;;^DD(.4014,14,21,1,0)
 ;;=Fields are assigned a probability rating based on the number of hits
 ;;^DD(.4014,14,21,2,0)
 ;;=found for the query (or sort) condition.  The probability rating is used
 ;;^DD(.4014,14,21,3,0)
 ;;=to determine the order in which query conditions should be executed
 ;;^DD(.4014,14,21,4,0)
 ;;=during the sort phase.  Fields with a higher probability rating are
 ;;^DD(.4014,14,21,5,0)
 ;;=executed first to most quickly cut down the number of records that have
 ;;^DD(.4014,14,21,6,0)
 ;;=to be processed.
 ;;^DD(.4014,14,23,0)
 ;;=^^1^1^2930125^
 ;;^DD(.4014,14,23,1,0)
 ;;=Calculated by a call to the FileMan Query Optimizer routine ^DIOQ.
 ;;^DD(.4014,14,"DT")
 ;;=2930125
 ;;^DD(.4014,15,0)
 ;;=DATA TYPE FOR SORTING^P.81'^DI(.81,^0;10^Q
 ;;^DD(.4014,15,21,0)
 ;;=^^5^5^2930514^
 ;;^DD(.4014,15,21,1,0)
 ;;=This pointer to the FileMan DATA TYPE file is entered automatically by
 ;;^DD(.4014,15,21,2,0)
 ;;=FileMan during the sort/print.  Note that if sorting by a pointer or a
 ;;^DD(.4014,15,21,3,0)
 ;;=variable pointer, FileMan will follow the pointer chain until it gets to
 ;;^DD(.4014,15,21,4,0)
 ;;=one of the other data types, in order to determine how to correctly set up
 ;;^DD(.4014,15,21,5,0)
 ;;=the sort logic.
 ;;^DD(.4014,15,23,0)
 ;;=^^1^1^2930514^
 ;;^DD(.4014,15,23,1,0)
 ;;=Pointer to DATA TYPE file, derived by FileMan in routine DTYP^DIP1.
 ;;^DD(.4014,15,"DT")
 ;;=2930514
 ;;^DD(.4014,16,0)
 ;;=COMPUTED FIELD CODE^K^^CM;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4014,16,3)
 ;;=This is Standard MUMPS code, generated for sorting by computed fields or pointer fields.
 ;;^DD(.4014,16,9)
 ;;=@
 ;;^DD(.4014,16,21,0)
 ;;=^^3^3^2930201^
 ;;^DD(.4014,16,21,1,0)
 ;;=This field contains MUMPS code used to find the actual value of a field
 ;;^DD(.4014,16,21,2,0)
 ;;=that is computed or a pointer.  The code is generated by DICOMP.  This
 ;;^DD(.4014,16,21,3,0)
 ;;=code may execute code in OVERFLOW nodes as well.
 ;;^DD(.4014,16,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.4014,16,23,1,0)
 ;;=Generated by DICOMP.  Put into the DPP array in C^DIP0.
 ;;^DD(.4014,16,"DT")
 ;;=2930201
 ;;^DD(.4014,17,0)
 ;;=MULTIPLE FIELD DATA^.40141^^1;0
 ;;^DD(.4014,18,0)
 ;;=RELATIONAL JUMP FIELD DATA^.401418^^2;0
 ;;^DD(.4014,19,0)
 ;;=OVERFLOW DATA^.401419^^3;0
 ;;^DD(.4014,19,21,0)
 ;;=^^5^5^2930201^
 ;;^DD(.4014,19,21,1,0)
 ;;=This field contains the first subscript from the part of the DPP array
 ;;^DD(.4014,19,21,2,0)
 ;;=that contains overflow code executed when sorting by a field that is
 ;;^DD(.4014,19,21,3,0)
 ;;=gotten to relationally or a computed field.  Overflow code is generated
 ;;^DD(.4014,19,21,4,0)
 ;;=when needed by DICOMP.  This field will typically look something like
 ;;^DD(.4014,19,21,5,0)
 ;;="OVF0".
 ;;^DD(.4014,19,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.4014,19,23,1,0)
 ;;=Generated by DICOMP from DIP0 during the sort/print option.
 ;;^DD(.4014,19,"DT")
 ;;=2930201
 ;;^DD(.4014,20,0)
 ;;=SUBHEADER OUTPUT TRANSFORM^K^^OUT;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4014,20,3)
 ;;=This is Standard MUMPS code.  This is used only when sorting by a user-specified cross-reference in input variable BY(0).
 ;;^DD(.4014,20,9)
 ;;=@
 ;;^DD(.4014,20,21,0)
 ;;=^^6^6^2930204^
 ;;^DD(.4014,20,21,1,0)
 ;;=Defined only when using the BY(0) input variable to the FileMan print,
 ;;^DD(.4014,20,21,2,0)
 ;;=EN1^DIP, which allows the user to specify a cross-reference to sort on.
 ;;^DD(.4014,20,21,3,0)
 ;;=The user is allowed to specify MUMPS code that can be used as an output
 ;;^DD(.4014,20,21,4,0)
 ;;=transform for any of the subheaders (i.e., subscripts in the
 ;;^DD(.4014,20,21,5,0)
 ;;=cross-reference) in the S input array.  This output transform code is
 ;;^DD(.4014,20,21,6,0)
 ;;=stored in this field.
 ;;^DD(.4014,20,23,0)
 ;;=^^4^4^2930204^
 ;;^DD(.4014,20,23,1,0)
 ;;=Stores output transform code from the third piece of S(0,N) where N is
 ;;^DD(.4014,20,23,2,0)
 ;;=the sort level.  This is an input array used in conjunction with BY(0)
 ;;^DD(.4014,20,23,3,0)
 ;;=when user specifies a specific cross-reference to use for the sort, in
 ;;^DD(.4014,20,23,4,0)
 ;;=in the FileMan print routine EN1^DIP.
 ;;^DD(.4014,20,"DT")
 ;;=2930204
 ;;^DD(.4014,21,0)
 ;;=TEXT SORT FLAG^S^SORT:SORT LIKE TEXT;RANGE:TREAT RANGE LIKE TEXT;^SRTTXT;1^Q
 ;;^DD(.4014,21,21,0)
 ;;=^^12^12^2931221^
 ;;^DD(.4014,21,21,1,0)
 ;;=This flag will be set in one of two cases.
 ;;^DD(.4014,21,21,2,0)
 ;;= 1) If the user entered the ;TXT qualifier, the flag will be set to
 ;;^DD(.4014,21,21,3,0)
 ;;="SORT", and will cause a space to be inserted at the beginning of each
 ;;^DD(.4014,21,21,4,0)
 ;;=sort value, causing even numeric fields to be sorted as if they were text.
 ;;^DD(.4014,21,21,5,0)
 ;;= 2) If the user entered a FROM or TO value that is a non-canonic number,
 ;;^DD(.4014,21,21,6,0)
 ;;=the flag will be set to RANGE, and will cause sort values that are numeric
 ;;^DD(.4014,21,21,7,0)
 ;;=to be treated as if they were text, when seeing whether they fall within
 ;;^DD(.4014,21,21,8,0)
 ;;=the from/to range.  However, they will still sort like numbers (MUMPS sort
 ;;^DD(.4014,21,21,9,0)
 ;;=sequence).
 ;;^DD(.4014,21,21,10,0)
 ;;= 
 ;;^DD(.4014,21,21,11,0)
 ;;=The flag is set automatically when the user is entering the sort fields in
 ;;^DD(.4014,21,21,12,0)
 ;;=^DIP, and the from/to values in ^DIP1.
 ;;^DD(.4014,21,"DT")
 ;;=2931221
 ;;^DD(.40141,0)
 ;;=MULTIPLE FIELD DATA SUB-FIELD^^1^2
 ;;^DD(.40141,0,"DT")
 ;;=2930201
 ;;^DD(.40141,0,"IX","B",.40141,.01)
 ;;=
 ;;^DD(.40141,0,"NM","MULTIPLE FIELD DATA")
 ;;=
 ;;^DD(.40141,0,"UP")
 ;;=.4014
 ;;^DD(.40141,.01,0)
 ;;=MULT.FILE OR SUBFILE NO.^MNJ13,5^^0;1^K:+X'=X!(X>9999999.99999)!(X<0)!(X?.E1"."6N.N) X
 ;;^DD(.40141,.01,1,0)
 ;;=^.1
 ;;^DD(.40141,.01,1,1,0)
 ;;=.40141^B
 ;;^DD(.40141,.01,1,1,1)
 ;;=S ^DIBT(DA(2),2,DA(1),1,"B",$E(X,1,30),DA)=""
 ;;^DD(.40141,.01,1,1,2)
 ;;=K ^DIBT(DA(2),2,DA(1),1,"B",$E(X,1,30),DA)
 ;;^DD(.40141,.01,3)
 ;;=Type a Number between 0 and 9999999.99999, 5 Decimal Digits.  This is the file/subfile number when sorting by a multiple field.
 ;;^DD(.40141,.01,21,0)
 ;;=^^4^4^2930201^
 ;;^DD(.40141,.01,21,1,0)
 ;;=All files or subfiles needed to get back up to the top level from a
 ;;^DD(.40141,.01,21,2,0)
 ;;=multiple field will be represented by an entry in this field.  The
 ;;^DD(.40141,.01,21,3,0)
 ;;=file or subfile number will be used as a subscript in the DPP array

DINIT126
DINIT126 ;SFISC/MKO-SORT TEMPLATE FILE ;1:13 PM  13 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT127
Q Q
 ;;^DD(.40141,.01,21,4,0)
 ;;=during the sort/print processing.
 ;;^DD(.40141,.01,"DT")
 ;;=2930201
 ;;^DD(.40141,1,0)
 ;;=NODE^F^^0;2^K:$L(X)>50!($L(X)<1) X
 ;;^DD(.40141,1,3)
 ;;=Answer must be 1-50 characters in length.  This is the node from which the data is descendant.
 ;;^DD(.40141,1,21,0)
 ;;=^^1^1^2930201^
 ;;^DD(.40141,1,21,1,0)
 ;;=This field contains the node from which the multiple data is descendant.
 ;;^DD(.40141,1,"DT")
 ;;=2930201
 ;;^DD(.401418,0)
 ;;=RELATIONAL JUMP FIELD DATA SUB-FIELD^^5^6
 ;;^DD(.401418,0,"DT")
 ;;=2930201
 ;;^DD(.401418,0,"IX","B",.401418,.01)
 ;;=
 ;;^DD(.401418,0,"NM","RELATIONAL JUMP FIELD DATA")
 ;;=
 ;;^DD(.401418,0,"UP")
 ;;=.4014
 ;;^DD(.401418,.01,0)
 ;;=RELATIONAL START FILE NO.^MNJ13,5^^0;1^K:+X'=X!(X>9999999.99999)!(X<0)!(X?.E1"."6N.N) X
 ;;^DD(.401418,.01,1,0)
 ;;=^.1
 ;;^DD(.401418,.01,1,1,0)
 ;;=.401418^B
 ;;^DD(.401418,.01,1,1,1)
 ;;=S ^DIBT(DA(2),2,DA(1),2,"B",$E(X,1,30),DA)=""
 ;;^DD(.401418,.01,1,1,2)
 ;;=K ^DIBT(DA(2),2,DA(1),2,"B",$E(X,1,30),DA)
 ;;^DD(.401418,.01,3)
 ;;=Type a Number between 0 and 9999999.99999, 5 Decimal Digits
 ;;^DD(.401418,.01,21,0)
 ;;=^^3^3^2930201^^^^
 ;;^DD(.401418,.01,21,1,0)
 ;;=Data will appear here if sorting by a field that must be gotten to using
 ;;^DD(.401418,.01,21,2,0)
 ;;=a relational jump.  This will be the file or subfile number from which
 ;;^DD(.401418,.01,21,3,0)
 ;;=the user is jumping (i.e., the starting point).
 ;;^DD(.401418,.01,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401418,.01,23,1,0)
 ;;=Built in COLON^DIP0 during the sort/print.
 ;;^DD(.401418,.01,"DT")
 ;;=2930201
 ;;^DD(.401418,1,0)
 ;;=NEXT SUBSCRIPT^RNJ7,0^^0;2^K:+X'=X!(X>9999999)!(X<0)!(X?.E1"."1N.N) X
 ;;^DD(.401418,1,3)
 ;;=Type a Number between 0 and 9999999, 0 Decimal Digits.  Subscript used in the DPP array during the sort/print option.
 ;;^DD(.401418,1,21,0)
 ;;=^^4^4^2930201^
 ;;^DD(.401418,1,21,1,0)
 ;;=This field contains a subscript used n the DPP array during the
 ;;^DD(.401418,1,21,2,0)
 ;;=sort/print.  The subscript is generated by DICOMP (using the level
 ;;^DD(.401418,1,21,3,0)
 ;;=number multiplied by 100 I think).  It results in building a node
 ;;^DD(.401418,1,21,4,0)
 ;;=like DPP(DJ,file/subfile no.,subscript)=data.
 ;;^DD(.401418,1,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401418,1,23,1,0)
 ;;=Built by COLON^DIP0 routine.
 ;;^DD(.401418,1,"DT")
 ;;=2930201
 ;;^DD(.401418,2,0)
 ;;=TO FILE OR SUBFILE^NJ13,5^^0;3^K:+X'=X!(X>9999999.99999)!(X<0)!(X?.E1"."6N.N) X
 ;;^DD(.401418,2,3)
 ;;=Type a Number between 0 and 9999999.99999, 5 Decimal Digits.  The file or subfile number to which we are jumping using a relational jump.
 ;;^DD(.401418,2,21,0)
 ;;=^^2^2^2930201^
 ;;^DD(.401418,2,21,1,0)
 ;;=This field contains the file or subfile number to which we are making
 ;;^DD(.401418,2,21,2,0)
 ;;=the relational jump (i.e., the destination file).
 ;;^DD(.401418,2,23,0)
 ;;=^^1^1^2930201^^
 ;;^DD(.401418,2,23,1,0)
 ;;=Built in COLON^DIP0 during the sort/print.
 ;;^DD(.401418,2,"DT")
 ;;=2930201
 ;;^DD(.401418,3,0)
 ;;=GLOBAL REFERENCE^F^^0;4^K:$L(X)>50!($L(X)<1) X
 ;;^DD(.401418,3,3)
 ;;=Answer must be 1-50 characters in length.  Contains the global reference of the file to which we are jumping relationally.
 ;;^DD(.401418,3,21,0)
 ;;=^^2^2^2930201^
 ;;^DD(.401418,3,21,1,0)
 ;;=This field contains the global reference of the file to which we are
 ;;^DD(.401418,3,21,2,0)
 ;;=jumping relationally (i.e., the destination file).
 ;;^DD(.401418,3,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401418,3,23,1,0)
 ;;=Built by COLON^DIP0 during the sort/print option.
 ;;^DD(.401418,3,"DT")
 ;;=2930201
 ;;^DD(.401418,4,0)
 ;;=MULTIVALUED FLAG^S^0:NOT MULTI-VALUED;1:YES, MULTI-VALUED;^0;5^Q
 ;;^DD(.401418,4,21,0)
 ;;=^^6^6^2930201^
 ;;^DD(.401418,4,21,1,0)
 ;;=This flag indicates whether the relational jump will result in going to
 ;;^DD(.401418,4,21,2,0)
 ;;=a file that has a many-to-one relationship to the starting (home) file
 ;;^DD(.401418,4,21,3,0)
 ;;=(i.e., a jump to a backwards pointer) or a one-to-one relationship (i.e.,
 ;;^DD(.401418,4,21,4,0)
 ;;=a forwards pointer jump).  The flag will be set to 1 to indicate that
 ;;^DD(.401418,4,21,5,0)
 ;;=that there is a many-to-one or multi-valued relationship to the home
 ;;^DD(.401418,4,21,6,0)
 ;;=file, or to 0 if not.
 ;;^DD(.401418,4,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401418,4,23,1,0)
 ;;=Set in COLON^DIP0 during the sort/print option.
 ;;^DD(.401418,4,"DT")
 ;;=2930201
 ;;^DD(.401418,5,0)
 ;;=RELATIONAL CODE^K^^RCOD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.401418,5,3)
 ;;=This is Standard MUMPS code, used to make a relational jump.
 ;;^DD(.401418,5,9)
 ;;=@
 ;;^DD(.401418,5,21,0)
 ;;=^^2^2^2930201^
 ;;^DD(.401418,5,21,1,0)
 ;;=This is the MUMPS code needed to perform the relational jump during the
 ;;^DD(.401418,5,21,2,0)
 ;;=sort part of the sort/print option.
 ;;^DD(.401418,5,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401418,5,23,1,0)
 ;;=Generated from COLON^DIP0 during the sort/print option.
 ;;^DD(.401418,5,"DT")
 ;;=2930201
 ;;^DD(.401419,0)
 ;;=OVERFLOW DATA SUB-FIELD^^2^3
 ;;^DD(.401419,0,"DT")
 ;;=2930201
 ;;^DD(.401419,0,"IX","B",.401419,.01)
 ;;=
 ;;^DD(.401419,0,"NM","OVERFLOW DATA")
 ;;=
 ;;^DD(.401419,0,"UP")
 ;;=.4014
 ;;^DD(.401419,.01,0)
 ;;=FIRST SUBSCRIPT FOR OVERFLOW^MF^^0;1^K:$L(X)>20!($L(X)<1) X
 ;;^DD(.401419,.01,1,0)
 ;;=^.1
 ;;^DD(.401419,.01,1,1,0)
 ;;=.401419^B
 ;;^DD(.401419,.01,1,1,1)
 ;;=S ^DIBT(DA(2),2,DA(1),3,"B",$E(X,1,30),DA)=""
 ;;^DD(.401419,.01,1,1,2)
 ;;=K ^DIBT(DA(2),2,DA(1),3,"B",$E(X,1,30),DA)
 ;;^DD(.401419,.01,3)
 ;;=Answer must be 1-20 characters in length.  This multiple contains overflow code needed for sorting by relational or computed fields.
 ;;^DD(.401419,.01,"DT")
 ;;=2930201
 ;;^DD(.401419,1,0)
 ;;=SECOND SUBSCRIPT FOR OVERFLOW^NJ10,4^^0;2^K:+X'=X!(X>99999.9999)!(X<0)!(X?.E1"."5N.N) X
 ;;^DD(.401419,1,3)
 ;;=Type a Number between 0 and 99999.9999, 4 Decimal Digits
 ;;^DD(.401419,1,21,0)
 ;;=^^4^4^2930201^
 ;;^DD(.401419,1,21,1,0)
 ;;=This field contains the second subscript from the part of the DPP array
 ;;^DD(.401419,1,21,2,0)
 ;;=that contains overflow code executed when sorting by a field that is
 ;;^DD(.401419,1,21,3,0)
 ;;=gotten to relationally or a computed field.  Overflow code is generated
 ;;^DD(.401419,1,21,4,0)
 ;;=when needed by DICOMP.  This field will typically look something like 9.2.
 ;;^DD(.401419,1,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401419,1,23,1,0)
 ;;=Generated by DICOMP from ^DIP0 during the sort/print option.

DINIT127
DINIT127 ;SFISC/MKO-SORT TEMPLATE FILE ;1:13 PM  13 Nov 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DD(.401419,1,"DT")
 ;;=2930201
 ;;^DD(.401419,2,0)
 ;;=OVERFLOW CODE^K^^OVF0;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.401419,2,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.401419,2,9)
 ;;=@
 ;;^DD(.401419,2,21,0)
 ;;=^^3^3^2930201^
 ;;^DD(.401419,2,21,1,0)
 ;;=This is MUMPS code generated when needed by DICOMP, when sorting by a
 ;;^DD(.401419,2,21,2,0)
 ;;=field that must be gotten to relationally, or a computed field.  This
 ;;^DD(.401419,2,21,3,0)
 ;;=will only be used if DICOMP generates overflow code in the X array.
 ;;^DD(.401419,2,23,0)
 ;;=^^1^1^2930201^
 ;;^DD(.401419,2,23,1,0)
 ;;=Generated by DICOMP from ^DIP0 during the sort/print option.
 ;;^DD(.401419,2,"DT")
 ;;=2930201

DINIT13
DINIT13 ;SFISC-INITIALIZE VA FILEMAN ;6APR2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT14:X?.P S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;.402,10,0 DESCRIPTION^.4021^^%D;0
 ;;.4021,0,"UP" .402
 ;;.4,8,0 TEMPLATE TYPE^S^1:FILEGRAM;2:EXTRACT;3:EXPORT;7:SELECTED EXPORT FIELDS;^0;8^Q
 ;;.4,8,1,0 ^.1^^-1
 ;;.4,8,1,1,0 .4^FG^MUMPS
 ;;.4,8,1,1,1 S %=$S(X=1:"""FG""",1:"") I %]"" S A1=$P(@(DIC_"DA,0)"),U,1),@(DIC_%_",A1,DA)=""""") K %,A1
 ;;.4,8,1,1,2 S %=$S(X=1:"""FG""",1:"") I %]"" S A1=$P(@(DIC_"DA,0)"),U,1) K @(DIC_%_",A1,DA)"),%,A1
 ;;.4,8,1,1,"%D",0 ^^1^1^2921002^^^^
 ;;.4,8,1,1,"%D",0,"LE" 1
 ;;.4,8,1,1,"%D",1,0 Used to do a quick lookup of FILEGRAM type of print templates.
 ;;.4,8,1,1,"DT" 2901106
 ;;.4,8,3 Enter a 1 if this is a FILEGRAM template, 2 if this is an EXTRACT template, 3 if an EXPORT template, 7 if a SELECTED FIELDS template, as opposed to a normal PRINT template.
 ;;.4,8,"DT" 2960523
 ;;.4,20,0 DESTINATION FILE^*P1'^DIC(^0;9^S DIC("S")="I Y>1.99 S DIAC=""RD"" D ^DIAC I %" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;.4,20,3
 ;;.4,20,12 Allow files to which user has READ access.
 ;;.4,20,12.1 S DIC("S")="I Y>1.99 S DIAC=""RD"" D ^DIAC I %"
 ;;.4,20,21,0 ^^2^2^2921002^
 ;;.4,20,21,1,0 This field holds the number of the file that is designed to receive
 ;;.4,20,21,2,0 data from other files by using the Extract Tool.
 ;;.4,20,"DT" 2950909
 ;;.4,50,0 FILEGRAM/EXTR FILE^.41A^^1;0
 ;;.4,50,"DT" 2920514
 ;;.4,100,0 EXPORT FIELD^.42A^^100;0
 ;;.4,100,21,0 ^^1^1^2921123^^
 ;;.4,100,21,1,0 This multiple holds information about each field being exported.
 ;;.4,105,0 EXPORT FORMAT^P.44'^DIST(.44,^105;1^Q
 ;;.4,105,21,0 ^^1^1^2921123^
 ;;.4,105,21,1,0 This field contains the foreign format used to make the export template.
 ;;.4,105,"DT" 2920904
 ;;.4,110,0 EXPORT TEMPLATE CREATED?^S^1:YES;0:NO;^105;3^Q
 ;;.4,110,21,0 ^^2^2^2921119^
 ;;.4,110,21,1,0 If YES, this Selected Fields for Export template has been used to create
 ;;.4,110,21,2,0 an Export template.
 ;;.4,110,"DT" 2920904
 ;;.4,115,0 MULTIPLE PATH^F^^105;4^K:$L(X)>30!($L(X)<1) X
 ;;.4,115,3 Answer must be 1-30 characters in length.
 ;;.4,115,21,0 ^^2^2^2921119^
 ;;.4,115,21,1,0 This field holds a list of field numbers representing the deepest multiple
 ;;.4,115,21,2,0 contained in this Export template.
 ;;.4,115,"DT" 2921119
 ;;.4,704,0 HEADER^CJ60^^ ; ^S X=$S($D(^DIPT(D0,"H")):^("H"),1:"")
 ;;.4,707,0 SUB-HEADER SUPPRESSED^S^1:YES^SUB;1^Q
 ;;.4,1620,0 PRINT FIELDS^XCmJ50^^ ; ^N DIR,DIPT,DRK,D,C,J,L,DHD,DA S DIPT=D0  D GET^DIPTED("DIR") F D=0:0 S D=$O(DIR(D)) Q:'D  S X=DIR(D) X DICMX Q:'$D(D)
 ;;.4,21400,0 BUILD(S)^Cmp9.6^^ ; ^N DIPTNAME,D S DIPTNAME=$P($G(^DIPT(D0,0)),U)_"    FILE #"_$P($G(^(0)),U,4) F D=0:0 S D=$O(^XPD(9.6,D)) Q:'D  I $D(^(D,"KRN",.4,"NM","B",DIPTNAME)) N D0 S D0=D,X=$P(^XPD(9.6,D,0),U) X DICMX Q:'$D(D)

DINIT14
DINIT14 ;SFISC/YJK-INITIALIZE VA FILEMAN ;08:33 AM  13 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G:X="" ^DINIT2 S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DIC(.6,0)
 ;;=DD AUDIT^.6
 ;;^DIC(.6,0,"GL")
 ;;=^DDA(
 ;;^DIC("B","DD AUDIT",.6)
 ;;=
 ;;^DIC(.6,"%D",0)
 ;;=^^1^1^2940908^
 ;;^DIC(.6,"%D",1,0)
 ;;=This file stores an audit trail of changes made to data dictionaries.
 ;;^DD(.6,0)
 ;;=FIELD^^.07^12
 ;;^DD(.6,0,"ID",.03)
 ;;=W "   ",$$NAKED^DIUTL("$$DATE^DIUTL($P(^(0),U,3))")
 ;;^DD(.6,0,"ID",.04)
 ;;=S %I=Y,Y=$S('$D(^(0)):"",$D(^VA(200,+$P(^(0),U,4),0))#2:$P(^(0),U,1),1:""),C=$P($G(^DD(200,.01,0)),U,2) D:C]"" Y^DIQ:Y]"" W "   ",Y,@("$E("_DIC_"%I,0),0)") S Y=%I K %I
 ;;^DD(.6,0,"NM","DD AUDIT")
 ;;=
 ;;^DD(.6,.001,0)
 ;;=NUMBER^NJ7,0^^ ^K:+X'=X!(X>9999999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.6,.001,3)
 ;;=A whole number greater than 1.
 ;;^DD(.6,.01,0)
 ;;=FIELD NUMBER^RF^^0;1^K:$L(X)>10!($L(X)<1)!'(X'?1P.E) X
 ;;^DD(.6,.01,1,0)
 ;;=^.1
 ;;^DD(.6,.01,1,1,0)
 ;;=.6^B
 ;;^DD(.6,.01,1,1,1)
 ;;=S ^DDA(DDA,"B",$E(X,1,30),DA)=""
 ;;^DD(.6,.01,1,1,2)
 ;;=K ^DDA(DDA,"B",$E(X,1,30),DA)
 ;;^DD(.6,.01,3)
 ;;=Answer must be 1-10 characters in length.
 ;;^DD(.6,.02,0)
 ;;=TYPE^RS^E:EDIT;N:NEW;D:DELETE;^0;2^Q
 ;;^DD(.6,.03,0)
 ;;=DATE UPDATED^RD^^0;3^S %DT="ETR" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.6,.03,1,0)
 ;;=^.1
 ;;^DD(.6,.03,1,1,0)
 ;;=.6^D
 ;;^DD(.6,.03,1,1,1)
 ;;=S ^DDA(DDA,"D",$E(X,1,30),DA)=""
 ;;^DD(.6,.03,1,1,2)
 ;;=K ^DDA(DDA,"D",$E(X,1,30),DA)
 ;;^DD(.6,.04,0)
 ;;=USER^RP200'^VA(200,^0;4^Q
 ;;^DD(.6,.04,1,0)
 ;;=^.1
 ;;^DD(.6,.04,1,1,0)
 ;;=.6^E
 ;;^DD(.6,.04,1,1,1)
 ;;=S ^DDA(DDA,"E",$E(X,1,30),DA)=""
 ;;^DD(.6,.04,1,1,2)
 ;;=K ^DDA(DDA,"E",$E(X,1,30),DA)
 ;;^DD(.6,.05,0)
 ;;=ATTRIBUTE NAME^F^^0;5^K:$L(X)>75!($L(X)<1) X
 ;;^DD(.6,.05,3)
 ;;=Answer must be 1-75 characters in length.
 ;;^DD(.6,.06,0)
 ;;=ATTRIBUTE NUMBER^F^^0;6^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.6,.06,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(.6,.07,0)
 ;;=FILE NUMBER^F^^0;7^K:$L(X)>15!($L(X)<1) X
 ;;^DD(.6,.07,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.6,1,0)
 ;;=OLD VALUE^F^^1;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.6,1.1,0)
 ;;=OLD VALUE(S)^.601^^1.1;0
 ;;^DD(.6,2,0)
 ;;=NEW VALUE^F^^2;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.6,2.1,0)
 ;;=NEW VALUE(S)^.602^^2.1;0
 ;;^DD(.601,0)
 ;;=OLD VALUE(S) SUB-FIELD^^.01^1
 ;;^DD(.601,0,"NM","OLD VALUE(S)")
 ;;=
 ;;^DD(.601,0,"UP")
 ;;=.6
 ;;^DD(.601,.01,0)
 ;;=OLD VALUE(S)^WL^^0;1^Q
 ;;^DD(.602,0)
 ;;=NEW VALUE(S) SUB-FIELD^^.01^1
 ;;^DD(.602,0,"NM","NEW VALUE(S)")
 ;;=
 ;;^DD(.602,0,"UP")
 ;;=.6
 ;;^DD(.602,.01,0)
 ;;=NEW VALUE(S)^WL^^0;1^Q

DINIT2
DINIT2 ;SFISC/GFT-INITIALIZE VA FILEMAN ;7/22/94  10:41
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT20:X?.P S @("^DD("_$E($P(X," ",2),3,99)_")=Y")
 ;;.2,0 DESTINATION^
 ;;.2,0,"NM","DESTINATION"
 ;;.2,.01,0 DESTINATION^P^DIC(.2,^0;1^Q
 ;;.2,.01,3 WHERE THIS DATA GOES (TO WHAT FORM, SYSTEM, ETC.)
 ;;.21,0 DATA DESTINATION
 ;;.21,0,"NM","DATA-DESTINATION"
 ;;.21,.01,0 DATA DESTINATION^F^^0;1^K:$L(X)<2!($L(X)>80) X
 ;;.21,.01,1,0 ^.1^1^1
 ;;.21,.01,1,1,0 .21^B
 ;;.21,.01,1,1,1 S ^DIC(.2,"B",X,DA)=""
 ;;.21,.01,1,1,2 K ^DIC(.2,"B",X,DA)

DINIT20
DINIT20 ;SFISC/XAK-INITIALIZE VA FILEMAN ;18FEB2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT22:X?.P S @("^DD(1.1,"_$E($P(X," ",2),3,99)_")=Y")
 ;;0 FIELD^^4.2^16
 ;;0,"ID","WRITE" N % S %=$P(^(0),U,2) D EN^DDIOL("   "_$$NAKED^DIUTL("$$DATE^DIUTL(%)"),"","?0")
 ;;0,"NM","AUDIT"
 ;;.001,0 NUMBER^NJ7,0^^ ^K:+X'=X!(X<1)!(X?.E1"."1N.N) X
 ;;.001,3 A whole number greater than 1.
 ;;.01,0 INTERNAL ENTRY NUMBER^RF^^0;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>16!($L(X)<1)!'(X'?1P.E) X
 ;;.01,.1 The Internal Number of the Entry that has been audited.
 ;;.01,1,0 ^.1
 ;;.01,1,1,0 1.1^B
 ;;.01,1,1,1 S ^DIA(DIA,"B",$E(X,1,30),DA)=""
 ;;.01,1,1,2 K ^DIA(DIA,"B",$E(X,1,30),DA)
 ;;.02,0 DATE/TIME RECORDED^RD^^0;2^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
 ;;.02,1,0 ^.1
 ;;.02,1,1,0 1.1^C
 ;;.02,1,1,1 S ^DIA(DIA,"C",$E(X,1,30),DA)=""
 ;;.02,1,1,2 K ^DIA(DIA,"C",$E(X,1,30),DA)
 ;;.03,0 FIELD NUMBER^RF^^0;3^K:$L(X)>10!$L(X)<1) X
 ;;.03,3 The number of the field that was audited.
 ;;.04,0 USER^RP200'^VA(200,^0;4^Q
 ;;.04,1,0 ^.1
 ;;.04,1,1,0 1.1^D
 ;;.04,1,1,1 S ^DIA(DIA,"D",$E(X,1,30),DA)=""
 ;;.04,1,1,2 K ^DIA(DIA,"D",$E(X,1,30),DA)
 ;;.05,0 RECORD ADDED^S^A:Added Record;^0;5^Q
 ;;.05,21,0 ^^2^2^2981028^
 ;;.05,21,1,0 When a new recorded is added to a file (sub-file) and the .01 field is
 ;;.05,21,2,0 being audited, then this field will be set to an 'A'.
 ;;.06,0 ACCESSED^S^i:INQUIRED TO ENTRY^0;6
 ;;.06,21,0 ^^2^2
 ;;.06,21,1,0 This flag (settable by ACCESSED^DIET) is designed to record that a user LOOKED UP the Entry, without necessarily
 ;;.06,21,2,0 changing it.  Such an audit might be set by the POST-SELECTION ACTION of a File, e.g. for HIPAA.
 ;;1,0 ENTRY NAME^CJ30^^ ; ^N C,Y S Y=^DIC(DIA,0,"GL"),X=^DIA(DIA,D0,0),Y=$P($G(@(Y_+X_",0)")),U),C=$P($G(^DD(DIA,.01,0)),U,2) D Y^DIQ:C]"" S X=Y
 ;;1,9 ^
 ;;1.1,0 FIELD NAME^CJ50X^^ ; ^S Y(1.1,1.1)=$S($D(^DIA(DIA,D0,0)):$P(^(0),U,3),1:"") X ^DD(1.1,1.1,9.2) K Y(1.1) S X=$E(X,1,$L(X)-1)
 ;;1.1,9 ^
 ;;1.1,9.2 X ^DD(1.1,1.1,9.3) S X="" F %=1:1:%-1 S X=X_Y(1.1,%)_","
 ;;1.1,9.3 S X1=DIA F %=1:1 S X=$P(Y(1.1,1.1),",",%) Q:X=""  S Y(1.1,%)=$S($D(^DD(X1,X,0)):$P(^(0),U,1,2),1:"????"),X1=+$P(Y(1.1,%),U,2),Y(1.1,%)=$P(Y(1.1,%),U,1)
 ;;2,0 OLD VALUE^CJ80^^ ; ^S X=$S($D(^DIA(DIA,D0,2)):^(2),1:"<no previous value>")
 ;;2,9 ^
 ;;2.1,0 OLD INTERNAL VALUE^F^^2.1;1^K:$L(X)>30 X
 ;;2.2,0 DATATYPE OF OLD VALUE^S^S:SET;P:POINTER;V:VARIABLE POINTER;^2.1;2^Q
 ;;2.14,0 OLD W-P TEXT^Cm^^ ; ^X "N I,X F I=0:0 S I=$O(^DIA(DIA,D0,2.14,I)) Q:'I  S X=$G(^(I,0)) X DICMX"
 ;;2.9,0 PATIENT^Cp2^^ ; ^N A,% S %=$G(^DIC(DIA,0,"GL")),A=+$G(^DIA(DIA,D0,0)) X ^DD(1.1,2.9,9.2)
 ;;2.9,9 ^
 ;;2.9,9.1 N A,% S %=$G(^DIC(DIA,0,"GL")),A=+$G(^DIA(DIA,D0,0)) X ^DD(1.1,2.9,9.2)
 ;;2.9,9.2 S X="",X=$S(DIA=2:A,DIA=9000001:A,1:"") X ^DD(1.1,2.9,9.3):'X
 ;;2.9,9.3 N I,GL S I=$S($O(^DD(2,0,"PT",DIA,0)):+$O(^(0)),1:$O(^DD(9000001,0,"PT",DIA,0))) I I S GL=$P($G(^DD(DIA,I,0)),U,4) I GL'="" S X=$S($D(@(%_+A_","_$P(GL,";")_")")):$P(^(0),U,+$P(GL,";",2)),1:"") X:X[";" ^DD(1.1,2.9,9.4)
 ;;2.9,9.4 S X=$S(X[";DPT(":+X,X[";AUPNPAT(":+X,1:"")
 ;;3,0 NEW VALUE^CJ80^^ ; ^S X=$S($D(^DIA(DIA,D0,3)):^(3),1:"<deleted>")
 ;;3,9 ^
 ;;3.1,0 NEW INTERNAL VALUE^F^^3.1;1^K:$L(X)>30 X
 ;;3.2,0 DATATYPE OF NEW VALUE^S^S:SET;P:POINTER;V:VARIABLE POINTER;^3.1;2^Q
 ;;4.1,0 MENU OPTION USED^P19'^DIC(19,^4.1;1^Q
 ;;4.1,21,0 ^^2^2^2981021^^
 ;;4.1,21,1,0 This is the Option that the Kernel menu system used to change the audited
 ;;4.1,21,2,0 data.
 ;;4.1,23,0 ^^2^2^2981021^
 ;;4.1,23,1,0 This field contains the value of +XQY and is a direct pointer to the
 ;;4.1,23,2,0 OPTION FILE (#19).
 ;;4.2,0 PROTOCOL or OPTION USED^V^^4.1;2^Q
 ;;4.2,3 Answer must be 1-63 characters in length.
 ;;4.2,21,0 ^^2^2^2981021^
 ;;4.2,21,1,0 This is the Protocol or Option (type Protocol) that was used when the
 ;;4.2,21,2,0 audit took place.
 ;;4.2,23,0 ^^3^3^2981021^^
 ;;4.2,23,1,0 This is a Variable Pointer field whose value is obtained from the local
 ;;4.2,23,2,0 variable XQORNOD, which is in the form ien;global root.  It can either
 ;;4.2,23,3,0 point to the Option file or to the Protocol file.
 ;;4.2,"V",0 ^.12P^2^2
 ;;4.2,"V",1,0 19^What Option was used?^1^O^^n
 ;;4.2,"V",2,0 101^What Protocol was used?^2^P^^n

DINIT21
DINIT21 ;SFISC/GFT-INITIALIZE VA FILEMAN ; 08MAR2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DINITOSX G DD:'$O(^DD("OS",0)),DD:'$D(^DD("OS",19,"RM")) ; RM node introduced in 22.2; must re-install file if not there.
 W !!,"Do you want to change the MUMPS OPERATING SYSTEM File? NO//" R Y:60 Q:Y["^"!("Nn"[$E(Y))!('$T)
 I "Yy"'[$E(Y) W !,"Answer YES to overwrite MAXIMUM ROUTINE SIZE" G DINITOSX
 ; Variable DINITOSX used in Routine DINIT6. TODO: See if we can move that logic here. VEN/SMH 3121128
DD S DINITOSX=1 F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) Q:X?.P  S D="^DD(""OS"","_$E($P(X," ",2),3,99)_")" S @D=Y
 ;;0 MUMPS OPERATING SYSTEM^.7
 ;;8,0 MSM^^127^5000^^1^63
 ;;8,1 B X
 ;;8,8 X ^DD("$O")
 ;;8,18 I $D(^ (X))
 ;;8,"DEL" X "ZR  ZS @X" K ^UTILITY("%RD",X)
 ;;8,"EOFF" U $I:(::::1)
 ;;8,"EON" U $I:(:::::1)
 ;;8,"LOAD" S %N=0 X "ZL @X F XCNP=XCNP+1:1 S %N=%N+1,%=$T(+%N) Q:$L(%)=0  S @(DIF_XCNP_"",0)"")=%"
 ;;8,"NO-TYPE-AHEAD" U $I:(::::100663296)
 ;;8,"RM" U:IOT["TRM" $I:X
 ;;8,"RSEL" K ^UTILITY($J) G ^%RSEL
 ;;8,"SDP" O @("DIO:"_DLP) F %=0:0 U DIO R % Q:$ZA=X&($ZB>Y)!($ZA>X)  U IO W:$A(%)'=12 ! W %
 ;;8,"SDPEND" S X=$ZA,Y=$ZB
 ;;8,"TRMOFF" U $I:(::::::::$C(13,27))
 ;;8,"TRMON" U $I:(::::::::$C(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127))
 ;;8,"TRMRD" S Y=$ZB
 ;;8,"TYPE-AHEAD" U $I:(::::67108864:33554432)
 ;;8,"UCICHECK" S Y=$$UCICHECK^DINVMSM(X)
 ;;8,"XY" S $X=IOX,$Y=IOY
 ;;8,"ZS" ZR  X "S %Y=0 F  S %Y=$O(^UTILITY($J,0,%Y)) Q:%Y=""""  Q:'$D(^(%Y))  ZI ^(%Y)" ZS @X
 ;;9,0 DTM-PC^^127^5000^^1^115
 ;;9,1 B X
 ;;9,8 D:$P($ZVER,"/",2)<4 ^%VARLOG X:$P($ZVER,"/",2)'<4 ^DD("$O")
 ;;9,18 I $ZRSTATUS(X)'=""
 ;;9,"SDP" O @("DIO:"_"(""R"":"_$P(DLP,":",2,9)) F %=0:0 U DIO R % Q:$ZIOS=3  U IO W:$A(%)'=12 ! W %
 ;;9,"SDPEND" Q
 ;;9,"XY" S $X=IOX,$Y=IOY
 ;;9,"ZS" S %X="" X "S %Y=0 F  S %Y=$O(^UTILITY($J,0,%Y)) Q:%Y=""""  Q:'$D(^(%Y))  S %X=%X_$C(10)_^(%Y)" ZS @X:$E(%X,2,999999)
 ;;16,0 DSM for OpenVMS^^108^5000^^1^63
 ;;16,1 U @("$I:"_$P("NO",1,'X)_"CENABLE")
 ;;16,8 D DOLRO^%ZOSV
 ;;16,18 I $T(^@X)]""
 ;;16,"SDP" O DIO U DIO:DISCONNECT F %=0:0 U DIO R % Q:%="#$#"  U IO W:$A(%)'=12 ! W %
 ;;16,"SDPEND" W !,"#$#",! C IO
 ;;16,"XY" S $X=IOX,$Y=IOY
 ;;16,"ZS" ZR  X "S %Y=0 F  S %Y=$O(^UTILITY($J,0,%Y)) Q:%Y=""""  Q:'$D(^(%Y))  ZI ^(%Y)" ZS @X
 ;;17,0 GT.M(VAX)^^250^15000^^1^250
 ;;17,1 U @("$I:"_$P("NO",1,'X)_"CENABLE")
 ;;17,8 X ^DD("$O") ;D DOLRO^%ZOSV
 ;;17,18 I $L($T(^@X))
 ;;17,"DEL" D DEL^DINVGTM(X)
 ;;17,"EOFF" U $I:(NOECHO)
 ;;17,"EON" U $I:(ECHO)
 ;;17,"LOAD" N %,%N S %N=0 F XCNP=XCNP+1:1 S %N=%N+1,%=$T(+%N^@X) Q:$L(%)=0  S @(DIF_XCNP_",0)")=%
 ;;17,"NO-TYPE-AHEAD" U $I:(NOTYPEAHEAD)
 ;;17,"RM" U $I:(WIDTH=$S(X<256:X,1:0):FILTER="ESCAPE")
 ;;17,"RSEL" N %ZR,X K ^UTILITY($J) D ^%RSEL S X="" X "F  S X=$O(%ZR(X)) Q:X=""""  S ^UTILITY($J,X)="""""
 ;;17,"SDP" O DIO F  U DIO R % Q:%="#$#"  U IO W:$A(%)'=12 ! W %
 ;;17,"SDPEND" W !,"#$#",! C IO
 ;;17,"TRMOFF" U $I:(TERMINATOR="")
 ;;17,"TRMON" U $I:(TERMINATOR=$C(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127))
 ;;17,"TRMRD" S Y=$A($ZB)
 ;;17,"TYPE-AHEAD" U $I:(TYPEAHEAD)
 ;;17,"UCICHECK" S Y=1
 ;;17,"XY" S $X=IOX,$Y=IOY
 ;;17,"ZS" N %,%I,%F,%S S %I=$I,%F=$P($ZRO,",")_X_".m" O %F:(NEWVERSION) U %F X "S %S=0 F  S %S=$O(^UTILITY($J,0,%S)) Q:%S=""""  Q:'$D(^(%S))  S %=^UTILITY($J,0,%S) I $E(%)'="";"" W %,!" C %F U %I
 ;;18,0 CACHE/OpenM^^250^15000^^1^250
 ;;18,1 B X
 ;;18,8 X ^DD("$O")
 ;;18,18 I $T(^@X)]""
 ;;18,"DEL" X "ZR  ZS @X"
 ;;18,"EOFF" U $I:("":"+S")
 ;;18,"EON" U $I:("":"-S")
 ;;18,"HIGHESTCHAR" N DIUTF8 S DIUTF8=$L($C(256))>0 S Y=$C($S(DIUTF8:65533,1:255))
 ;;18,"LOAD" N %,%N S %N=0 X "ZL @X F XCNP=XCNP+1:1 S %N=%N+1,%=$T(+%N) Q:$L(%)=0  S @(DIF_XCNP_"",0)"")=%"
 ;;18,"NO-TYPE-AHEAD" U $I:("":"+F":$C(13,27))
 ;;18,"RM" I $G(IOT)["TRM" U $I:X
 ;;18,"RSEL" K ^UTILITY($J) D KERNEL^%RSET K %ST
 ;;18,"SDP" C DIO O DIO F %=0:0 U DIO R % Q:%="#$#"  U IO W %
 ;;18,"SDPEND" W !,"#$#",! C IO
 ;;18,"TRMOFF" U $I:("":"-I-T":$C(13,27))
 ;;18,"TRMON" U $I:("":"+I+T")
 ;;18,"TRMRD" S Y=$A($ZB),Y=$S(Y<32:Y,Y=127:Y,1:0)
 ;;18,"TYPE-AHEAD" U $I:("":"-F":$C(13,27))
 ;;18,"UCICHECK" X "N % S %=$P(X,"","",1),Y=0 I $ZU(90,10,%) S Y=%"
 ;;18,"XY" S $Y=IOY,$X=IOX
 ;;18,"ZS" ZR  X "S %Y=0 F  S %Y=$O(^UTILITY($J,0,%Y)) Q:%Y=""""  Q:'$D(^(%Y))  ZI ^(%Y)" ZS @X
 ;;19,0 GT.M(UNIX)^^250^15000^^1^250
 ;;19,1 U @("$I:"_$P("NO",1,'X)_"CENABLE")
 ;;19,8 X ^DD("$O") ;D DOLRO^%ZOSV
 ;;19,18 I $L($T(^@X))
 ;;19,"DEL" D DEL^DINVGUX(X)
 ;;19,"EOFF" U $I:(NOECHO)
 ;;19,"EON" U $I:(ECHO)
 ;;19,"HIGHESTCHAR" N DIUTF8 S DIUTF8=$L($C(256))>0 S Y=$C($S(DIUTF8:983037,1:255))
 ;;19,"LOAD" N %,%N S %N=0 F XCNP=XCNP+1:1 S %N=%N+1,%=$T(+%N^@X) Q:$L(%)=0  S @(DIF_XCNP_",0)")=%
 ;;19,"NO-TYPE-AHEAD" U $I:(NOTYPEAHEAD)
 ;;19,"RM" U $I:(WIDTH=$S(X<256:X,1:0):FILTER="ESCAPE")
 ;;19,"RSEL" K ^UTILITY($J) D ^%RSEL S X="" X "F  S X=$O(%ZR(X)) Q:X=""""  S ^UTILITY($J,X)=""""" K %ZR
 ;;19,"SDP" O DIO F  U DIO R % Q:%="#$#"  U IO W:$A(%)'=12 ! W %
 ;;19,"SDPEND" W !,"#$#",! C IO
 ;;19,"TRMOFF" U $I:(TERMINATOR="")
 ;;19,"TRMON" U $I:(TERMINATOR=$C(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127))
 ;;19,"TRMRD" S Y=$A($ZB)
 ;;19,"TYPE-AHEAD" U $I:(TYPEAHEAD)
 ;;19,"UCICHECK" S Y=1
 ;;19,"XY" S $X=IOX,$Y=IOY
 ;;19,"ZS" N %,%I,%F,%S S %I=$I,%F=$P($P($P($ZRO,")"),"(",2)," ")_"/"_X_".m" O %F:(NEWVERSION) U %F X "S %S=0 F  S %S=$O(^UTILITY($J,0,%S)) Q:%S=""""  Q:'$D(^(%S))  S %=^UTILITY($J,0,%S) I $E(%)'="";"" W %,!" C %F U %I ZLINK X
 ;;100,0 OTHER^^40^5000
 ;;100,1 Q

DINIT22
DINIT22 ;SFISC/DPC-LOAD DATA TYPE FILE DD ;9/9/94  13:22
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT220:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DIC(.81,0,"GL")
 ;;=^DI(.81,
 ;;^DIC("B","DATA TYPE",.81)
 ;;=
 ;;^DIC(.81,"%D",0)
 ;;=^^2^2^2940908^
 ;;^DIC(.81,"%D",1,0)
 ;;=This file stores all of the data types that VA FileMan allows in the
 ;;^DIC(.81,"%D",2,0)
 ;;=MODIFY FILE ATTRIBUTES option.
 ;;^DD(.81,0)
 ;;=FIELD^^1^2
 ;;^DD(.81,0,"DDA")
 ;;=N
 ;;^DD(.81,0,"DT")
 ;;=2921009
 ;;^DD(.81,0,"IX","B",.81,.01)
 ;;=
 ;;^DD(.81,0,"IX","C",.81,1)
 ;;=
 ;;^DD(.81,0,"NM","DATA TYPE")
 ;;=
 ;;^DD(.81,0,"PT",.42,1)
 ;;=
 ;;^DD(.81,.01,0)
 ;;=NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X K X
 ;;^DD(.81,.01,1,0)
 ;;=^.1
 ;;^DD(.81,.01,1,1,0)
 ;;=.81^B
 ;;^DD(.81,.01,1,1,1)
 ;;=S ^DI(.81,"B",$E(X,1,30),DA)=""
 ;;^DD(.81,.01,1,1,2)
 ;;=K ^DI(.81,"B",$E(X,1,30),DA)
 ;;^DD(.81,.01,3)
 ;;=NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION
 ;;^DD(.81,.01,"DEL",1,0)
 ;;=I DA<100
 ;;^DD(.81,1,0)
 ;;=INTERNAL REPRESENTATION^F^^0;2^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>1!($L(X)<1) X
 ;;^DD(.81,1,1,0)
 ;;=^.1
 ;;^DD(.81,1,1,1,0)
 ;;=.81^C
 ;;^DD(.81,1,1,1,1)
 ;;=S ^DI(.81,"C",$E(X,1,30),DA)=""
 ;;^DD(.81,1,1,1,2)
 ;;=K ^DI(.81,"C",$E(X,1,30),DA)
 ;;^DD(.81,1,1,1,"DT")
 ;;=2921009
 ;;^DD(.81,1,3)
 ;;=Answer must be 1 character in length.
 ;;^DD(.81,1,"DT")
 ;;=2921009

DINIT220
DINIT220 ;SFISC/DPC-LOAD DATA FOR DATA TYPE FILE ;7/22/94  10:50
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT24 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DI(.81,0)
 ;;=DATA TYPE^.81^99^10
 ;;^DI(.81,1,0)
 ;;=DATE/TIME^D
 ;;^DI(.81,2,0)
 ;;=NUMERIC^N
 ;;^DI(.81,3,0)
 ;;=SET OF CODES^S
 ;;^DI(.81,1,0)
 ;;=DATE/TIME^D
 ;;^DI(.81,2,0)
 ;;=NUMERIC^N
 ;;^DI(.81,3,0)
 ;;=SET OF CODES^S
 ;;^DI(.81,4,0)
 ;;=FREE TEXT^F
 ;;^DI(.81,5,0)
 ;;=WORD-PROCESSING^W
 ;;^DI(.81,6,0)
 ;;=COMPUTED^C
 ;;^DI(.81,7,0)
 ;;=POINTER TO A FILE^P
 ;;^DI(.81,8,0)
 ;;=VARIABLE-POINTER^V
 ;;^DI(.81,9,0)
 ;;=MUMPS^K
 ;;^DI(.81,99,0)
 ;;=RESERVED FOR FILEMAN

DINIT24
DINIT24 ;SFISC/GFT-INITIALIZE VA FILEMAN ; 13NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K ^DD(.5)
 ;BRING IN DD FOR FUNCTION FILE .5
 S ^DIC(.5,"%D",0)="^^4^4^2940908^"
 S ^DIC(.5,"%D",1,0)="This file stores information about FUNCTIONS used by FileMan.  The first"
 S ^DIC(.5,"%D",2,0)="100 records in this file are reserved for functions brought in during the"
 S ^DIC(.5,"%D",3,0)="FileMan INIT process.  The rest of the file is available for other"
 S ^DIC(.5,"%D",4,0)="developers to enter their own functions."
DD F I=1:1 S X=$T(DD+I),Y=$P(X," ",3,99) G ^DINIT25:X?.P S @("^DD(.5,"_$E($P(X," ",2),3,99)_")=Y")
 ;;0 ATTRIBUTE^
 ;;0,"NM","FUNCTION"
 ;;.01,0 NAME^RF^^0;1^K:$L(X)<2!($L(X)>30)!(X'?1U.ANP)!(X["$") X
 ;;.01,1,0 ^.1^1^1
 ;;.01,1,1,0 .5^B
 ;;.01,1,1,1 S @(DIC_"""B"",X,DA)=""""")
 ;;.01,1,1,2 K @(DIC_"""B"",X,DA)")
 ;;.01,3 Function Name must be 2-30 characters long, beginning with Alpha.
 ;;.01,"DEL",1,0 I DA<100
 ;;.02,0 MUMPS CODE^FR^^1;E1,255^D ^DIM I $D(X),'$D(DIQUIET),'$D(DDS) W "  ..OK"
 ;;.02,3 Enter MUMPS code that sets a value into 'X'.
 ;;.02,4 N D1 S D1(1)="For a 1-argument function, use 'X' as the argument.",D1(2)="For a 2-argument function, use 'X1' and 'X'.",D1(3)="Avoid FORs, IFs, and single-character scratch variables.",D1(4)="" D EN^DDIOL(.D1)
 ;;.02,9 @
 ;;1,0 EXPLANATION^F^^9;E1,245^K:$L(X)>245 X
 ;;2,0 DATE-VALUED^S^D:YES;X:NO;O:OPTIONAL (DEPENDS ON VALUE OF ARGUMENT);^2;1^Q
 ;;9,0 NUMBER OF ARGUMENTS^N^^3;1^K:X\1'=X!(X>8) X
 ;;10,0 WORD-PROCESSING^S^W:MEANINGFUL ONLY FOR W-P;^10;1
 ;;
OSDD ; BRING IN DD FOR MUMPS OS FILE .7 (CALLED FROM ^DINIT)
 F I=2:1 S X=$T(OSDD+I),Y=$P(X," ",3,99) Q:X?.P  S @("^DD(.7,"_$E($P(X," ",2),3,99)_")=Y")
 ;;0 FIELD^
 ;;.01,0 NAME^F^^0;1^Q
 ;;.01,1,0 ^.1^1^1
 ;;.01,1,1,0 .7^B
 ;;.01,1,1,1 S ^DD("OS","B",X,DA)=""
 ;;.01,1,1,2 K ^DD("OS","B",X,DA)
 ;;.01,21,0 ^^1^1^2940909^^
 ;;.01,21,1,0 Name of a MUMPS operating system that is supported by VA FileMan.
 ;;1,0 BREAK LOGIC^RF^^1;E1,250^D ^DIM
 ;;1,9 @
 ;;1,21,0 ^^2^2^2940909^^
 ;;1,21,1,0 MUMPS code to enable terminal break, i.e., to allow the user to interrupt
 ;;1,21,2,0 processing with <CTRL-C>.
 ;;419,0 MINIMUM SAFE $S^N^^0;2^K:+X'=X X
 ;;419,21,0 ^^1^1^2940909^
 ;;419,21,1,0 The minimum value for $S that will allow routines to process successfully.
 ;;2,0 GLOBAL LENGTH (MAX)^RN^^0;3^K:+X'=X!(X<30) X
 ;;2,21,0 ^^1^1^2940909^^
 ;;2,21,1,0 Maximum allowable length of a global.
 ;;3,0 ROUTINE SIZE (MAX)^RN^^0;4^K:+X'=X!(X<2048) X
 ;;3,21,0 ^^1^1^2940909^
 ;;3,21,1,0 Maximum allowable size of a routine.
 ;;4,0 CLOSING PRINCIPAL DEVICE^S^1:ALLOWED;^0;5^Q
 ;;4,21,0 ^^1^1^2940909^
 ;;4,21,1,0 Is closing a job's principal device allowed?
 ;;5,0 NEW COMMAND^S^1:SUPPORTED;^0;6^Q
 ;;5,21,0 ^^1^1^2940909^
 ;;5,21,1,0 Is the NEW command supported?
 ;;7,0 INDIVIDUAL SUBSCRIPT LENGTH^N^^0;7^K:X\1'=X!(X<9) X
 ;;7,21,0 ^^1^1^2940909^
 ;;7,21,1,0 Maximum length of an individual subscript.
 ;;8,0 SAVE SYMBOL TABLE^F^^8;E1,250^D ^DIM
 ;;8,9 @
 ;;8,21,0 ^^1^1^2940909^
 ;;8,21,1,0 MUMPS code that saves the contents of the local symbol table.
 ;;9,0 RIGHT MARGIN^K^^RM;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;9,3 This is Standard MUMPS code.
 ;;9,9 @
 ;;9,21,0 ^.001^1^1^3121113^^
 ;;9,21,1,0 Sets the $I width to X characters. If X=0, then the line in set to no wrap.
 ;;9,"DT" 3121113
 ;;10,0 CHECK EXISTENCE OF UCI^K^^UCICHECK;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;10,3 This is Standard MUMPS code.
 ;;10,9 @
 ;;10,21,0 ^^1^1^3121113^
 ;;10,21,1,0 Returns Y'="" if X is a valid UCI name.
 ;;10,"DT" 3121113
 ;;11,0 ECHO OFF^K^^EOFF;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;11,3 This is Standard MUMPS code.
 ;;11,9 @
 ;;11,21,0 ^^1^1^3121113^
 ;;11,21,1,0 Turn off echo to the $I device.
 ;;11,"DT" 3121113
 ;;12,0 ECHO ON^K^^EON;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;12,3 This is Standard MUMPS code.
 ;;12,9 @
 ;;12,21,0 ^^1^1^3121113^
 ;;12,21,1,0 Turn on echo to the $I device.
 ;;12,"DT" 3121113
 ;;21,0 TURN OFF READ TERMINATORS^K^^TRMOFF;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;21,3 This is Standard MUMPS code.
 ;;21,9 @
 ;;21,"DT" 3121113
 ;;22,0 TURN ON READ TERMINATORS^K^^TRMON;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;22,3 This is Standard MUMPS code.
 ;;22,9 @
 ;;22,21,0 ^^1^1^3121113^
 ;;22,21,1,0 Turns on all controls as terminators.
 ;;22,"DT" 3121113
 ;;23,0 GET READ TERMINATOR^K^^TRMRD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;23,3 This is Standard MUMPS code.
 ;;23,9 @
 ;;23,21,0 ^^1^1^3121113^
 ;;23,21,1,0 Returns in Y what terminated the last READ.
 ;;23,"DT" 3121113
 ;;31,0 DISABLE TYPE AHEAD BUFFERING^K^^NO-TYPE-AHEAD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;31,3 This is Standard MUMPS code.
 ;;31,9 @
 ;;31,21,0 ^^1^1^3121113^
 ;;31,21,1,0 Turn off the TYPE-AHEAD for the device $I.
 ;;31,"DT" 3121113
 ;;32,0 ENABLE TYPE AHEAD BUFFERING^K^^TYPE-AHEAD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;32,3 This is Standard MUMPS code.
 ;;32,9 @
 ;;32,21,0 ^^1^1^3121113^
 ;;32,21,1,0 Allow TYPE-AHEAD for the device $I.
 ;;32,"DT" 3121113
 ;;1820,0 ROUTINE EXISTENCE TEST^F^^18;E1,250^D ^DIM
 ;;1820,9 @
 ;;1820,21,0 ^^1^1^2940909^
 ;;1820,21,1,0 MUMPS code that tests for the existence of a routine.
 ;;2425,0 SET $X & $Y FROM 'IOX' & 'IOY'^F^^XY;E1,250^D ^DIM
 ;;2425,9 @
 ;;2425,21,0 ^^2^2^2940909^^
 ;;2425,21,1,0 MUMPS code to XECUTE to move the position of the cursor to the position
 ;;2425,21,2,0 specified by the variables IOX and IOY.
 ;;2619,0 ZSAVE CODE^F^^ZS;E1,250^D ^DIM
 ;;2619,9 @
 ;;2619,21,0 ^^4^4^2940909^
 ;;2619,21,1,0 MUMPS code that will save a routine to disk.  The name of the routine
 ;;2619,21,2,0 must be in variable X.  The source code of the routine should be stored
 ;;2619,21,3,0 in ^UTLITY($J,0,%Y).  Each node of the array will become a line of the
 ;;2619,21,4,0 routine.
 ;;2620,0 DELETE ROUTINE^K^^DEL;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;2620,3 This is Standard MUMPS code.
 ;;2620,9 @
 ;;2620,21,0 ^^1^1^3121113^
 ;;2620,21,1,0 Delete the routine named in X from the UCI.
 ;;2620,"DT" 3121113
 ;;2621,0 LOAD ROUTINE INTO ARRAY^K^^LOAD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;2621,3 This is Standard MUMPS code.
 ;;2621,9 @
 ;;2621,21,0 ^^1^1^3121113^
 ;;2621,21,1,0 Load routine X into @(DIE_"XCNP,0)".
 ;;2621,"DT" 3121113
 ;;2622,0 SELECT ROUTINES^K^^RSEL;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;2622,3 This is Standard MUMPS code.
 ;;2622,9 @
 ;;2622,21,0 ^^1^1^3121113^
 ;;2622,21,1,0 Returns the user's selection of routines in ^UTILITY($J,"routine name").
 ;;2622,"DT" 3121113
 ;;21400,0 HIGHEST CHARACTER VALUE^F^^HIGHESTCHAR;E1,250^D ^DIM
 ;;21400,9 @
 ;;21400,21,0 ^^1^1^3110515
 ;;21400,21,1,0 MUMPS code that sets into the "Y" variable the highest ('stop') character for the current MUMPS environment
 ;;190416,0 WRITE FROM SDP^F^^SDP;E1,250^D ^DIM
 ;;190416,9 @
 ;;190416,21,0 ^^4^4^2940909^
 ;;190416,21,1,0 MUMPS code that READs data from SDP and WRITEs it to a device.  The $I
 ;;190416,21,2,0 value of the SDP device should be in variable DIO and the $I value
 ;;190416,21,3,0 for the output device in IO.  The DLP variable should contain the open
 ;;190416,21,4,0 parameters of the SDP device.
 ;;190416.1,0 FIND SDP END^F^^SDPEND;E1,250^D ^DIM
 ;;190416.1,9 @
 ;;190416.1,21,0 ^^1^1^2940909^
 ;;190416.1,21,1,0 MUMPS code that tests for the end of SDP.

DINIT25
DINIT25 ;SFISC/XAK-INITIALIZE VA FILEMAN ;3/16/94  11:26 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT250:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DD(.41,0)
 ;;=FILEGRAM/EXTR FILE SUB-FIELD^^13^13
 ;;^DD(.41,0,"NM","FILEGRAM/EXTR FILE")
 ;;=
 ;;^DD(.41,0,"UP")
 ;;=.4
 ;;^DD(.41,.001,0)
 ;;=ORDER^NJ4,0^^ ^K:+X'=X!(X>9999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.41,.001,3)
 ;;=Type a Number between 1 and 9999, 0 Decimal Digits
 ;;^DD(.41,.01,0)
 ;;=FILEGRAM/EXTR FILE^NJ16,4^^0;1^K:+X'=X!(X>99999999999)!(X<2)!(X?.E1"."5N.N) X
 ;;^DD(.41,.01,1,0)
 ;;=^.1
 ;;^DD(.41,.01,1,1,0)
 ;;=.41^B
 ;;^DD(.41,.01,1,1,1)
 ;;=S ^DIPT(DA(1),1,"B",$E(X,1,30),DA)=""
 ;;^DD(.41,.01,1,1,2)
 ;;=K ^DIPT(DA(1),1,"B",$E(X,1,30),DA)
 ;;^DD(.41,.01,3)
 ;;=Type a Number between 2 and 99999999999, 4 Decimal Digits
 ;;^DD(.41,.02,0)
 ;;=LEVEL^RNJ2,0^^0;2^K:+X'=X!(X>99)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.41,.02,3)
 ;;=Type a Number between 1 and 99, 0 Decimal Digits
 ;;^DD(.41,.03,0)
 ;;=PARENT^NJ14,4^^0;3^K:+X'=X!(X>999999999)!(X<2)!(X?.E1"."5N.N) X
 ;;^DD(.41,.03,3)
 ;;=Type a Number between 2 and 999999999, 4 Decimal Digits
 ;;^DD(.41,.04,0)
 ;;=LINK TYPE^S^1:DINUM;2:DIRECT POINTER;3:MULTIPLE;4:BACKPOINTER^0;4^Q
 ;;^DD(.41,.05,0)
 ;;=USER RESPONSE TO GET HERE^F^^0;5^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.41,.05,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(.41,.06,0)
 ;;=DATE LAST STORED^D^^0;6^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.41,.07,0)
 ;;=CROSS-REFERENCE^F^^0;7^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.41,.07,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(.41,.07,21,0)
 ;;=^^1^1^2900405^
 ;;^DD(.41,.07,21,1,0)
 ;;=This field holds the X-ref to use in a backpointer.
 ;;^DD(.41,.08,0)
 ;;=ALL FIELDS IN FILE^S^1:YES;^0;8^Q
 ;;^DD(.41,10,0)
 ;;=FIELD NUMBER^.411A^^F;0
 ;;^DD(.41,11,0)
 ;;=DESTINATION FILE^NJ16,6^^0;9^K:+X'=X!(X>999999999)!(X<2)!(X?.E1"."7N.N) X
 ;;^DD(.41,11,3)
 ;;=Type a Number between 2 and 999999999, 6 Decimal Digits
 ;;^DD(.41,11,21,0)
 ;;=^^1^1^2921002^
 ;;^DD(.41,11,21,1,0)
 ;;=This field holds the number of the destination file or the destination subfile.
 ;;^DD(.41,12,0)
 ;;=DESTINATION FILE PARENT^NJ16,6^^0;10^K:+X'=X!(X>999999999)!(X<2)!(X?.E1"."7N.N) X
 ;;^DD(.41,12,3)
 ;;=Type a Number between 2 and 999999999, 6 Decimal Digits
 ;;^DD(.41,12,21,0)
 ;;=^^2^2^2921002^
 ;;^DD(.41,12,21,1,0)
 ;;=This field holds the number of the parent file or subfile of the
 ;;^DD(.41,12,21,2,0)
 ;;=DESTINATION FILE.
 ;;^DD(.41,13,0)
 ;;=DESTINATION FILE LOCATION^F^^0;11^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.41,13,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(.41,13,21,0)
 ;;=^^1^1^2921002^
 ;;^DD(.41,13,21,1,0)
 ;;=This field holds the node and piece location of the DESTINATION FILE.
 ;;^DD(.411,0)
 ;;=FIELD NUMBER SUB-FIELD^^4^5
 ;;^DD(.411,0,"NM","FIELD NUMBER")
 ;;=
 ;;^DD(.411,0,"UP")
 ;;=.41
 ;;^DD(.411,.001,0)
 ;;=FIELD ORDER^NJ8,0^^ ^K:+X'=X!(X>99999999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.411,.001,3)
 ;;=Type a Number between 1 and 99999999, 0 Decimal Digits
 ;;^DD(.411,.01,0)
 ;;=FIELD NUMBER^NJ14,4^^0;1^K:+X'=X!(X>999999999)!(X<.001)!(X?.E1"."5N.N) X
 ;;^DD(.411,.01,1,0)
 ;;=^.1^^0
 ;;^DD(.411,.01,3)
 ;;=Type a Number between .001 and 999999999, 4 Decimal Digits
 ;;^DD(.411,1,0)
 ;;=CAPTION^CJ30^^ ; ^S %=+^DIPT(D0,1,D1,0),X=$S('%:"",$D(^DD(%,+^DIPT(D0,1,D1,"F",D2,0),0)):$P(^(0),U),1:"")
 ;;^DD(.411,1,9)
 ;;=^
 ;;^DD(.411,1,9.01)
 ;;=
 ;;^DD(.411,1,9.1)
 ;;=S %=+^DIPT(D0,1,D1,0),X=$S('%:"",$D(^DD(%,+^DIPT(D0,1,D1,"F",D2,0),0)):$P(^(0),U),1:"")
 ;;^DD(.411,3,0)
 ;;=DESTINATION FIELD NUMBER^NJ14,4^^0;3^K:+X'=X!(X>999999999)!(X<.001)!(X?.E1"."5N.N) X
 ;;^DD(.411,3,3)
 ;;=Type a Number between .001 and 999999999, 4 Decimal Digits
 ;;^DD(.411,3,21,0)
 ;;=^^2^2^2921002^
 ;;^DD(.411,3,21,1,0)
 ;;=This field holds the number of the field in the destination file
 ;;^DD(.411,3,21,2,0)
 ;;=that will contain the extracted data from FIELD NUMBER in the source file.
 ;;^DD(.411,4,0)
 ;;=DESTINATION FIELD LOCATION^F^^0;4^K:$L(X)>30!($L(X)<3) X
 ;;^DD(.411,4,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(.411,4,21,0)
 ;;=^^3^3^2921002^
 ;;^DD(.411,4,21,1,0)
 ;;=This field holds the node and piece location of the DESTINATION FIELD
 ;;^DD(.411,4,21,2,0)
 ;;=NUMBER. This is used at the time extract data is moved to the destination
 ;;^DD(.411,4,21,3,0)
 ;;=file.
 ;;^DD(.411,5,0)
 ;;= EXTERNAL FORMAT^S^1:MOVE EXTERNAL FORMAT TO DESTINATION FILE;^0;5^Q
 ;;^DD(.411,5,3)
 ;;=Enter 1 if external format of data should be moved to destination file.
 ;;^DD(.411,5,21,0)
 ;;=^^3^3^2921208^
 ;;^DD(.411,5,21,1,0)
 ;;=This code is used to determine if the external form of the data in the
 ;;^DD(.411,5,21,2,0)
 ;;=source file should be moved to the destination file.  If null, the
 ;;^DD(.411,5,21,3,0)
 ;;=internal format of the data is moved.

DINIT250
DINIT250 ;SFISC/DPC-LOAD PRINT TEMPLATE FILE DD (CONT) ;10/14/94  14:56
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT255:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DD(.42,0)
 ;;=EXPORT FIELD SUB-FIELD^^3^4
 ;;^DD(.42,0,"DT")
 ;;=2921013
 ;;^DD(.42,0,"IX","B",.42,.01)
 ;;=
 ;;^DD(.42,0,"NM","EXPORT FIELD")
 ;;=
 ;;^DD(.42,0,"UP")
 ;;=.4
 ;;^DD(.42,.01,0)
 ;;=FIELD ORDER^RNJ2,0^^0;1^K:+X'=X!(X>99)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.42,.01,1,0)
 ;;=^.1
 ;;^DD(.42,.01,1,1,0)
 ;;=.42^B
 ;;^DD(.42,.01,1,1,1)
 ;;=S ^DIPT(DA(1),100,"B",$E(X,1,30),DA)=""
 ;;^DD(.42,.01,1,1,2)
 ;;=K ^DIPT(DA(1),100,"B",$E(X,1,30),DA)
 ;;^DD(.42,.01,3)
 ;;=Type a Number between 1 and 99, 0 Decimal Digits
 ;;^DD(.42,.01,21,0)
 ;;=^^3^3^2941014^^
 ;;^DD(.42,.01,21,1,0)
 ;;=The integer in this field represents the order in which fields are
 ;;^DD(.42,.01,21,2,0)
 ;;=exported.  The field order numbers are not always consecutive,
 ;;^DD(.42,.01,21,3,0)
 ;;=but they do represent the sequence in which fields are sent.
 ;;^DD(.42,.01,"DT")
 ;;=2920903
 ;;^DD(.42,1,0)
 ;;=DATA TYPE^*P.81'^DI(.81,^0;2^S DIC("S")="N %IR S %IR=$P($G(^(0)),U,2) I (%IR=""D"")!(%IR=""N"")!(%IR=""F"")" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;^DD(.42,1,3)
 ;;=
 ;;^DD(.42,1,12)
 ;;=Only data types of free text, date, and numeric are recognized for exported fields.
 ;;^DD(.42,1,12.1)
 ;;=S DIC("S")="N %IR S %IR=$P($G(^(0)),U,2) I (%IR=""D"")!(%IR=""N"")!(%IR=""F"")"
 ;;^DD(.42,1,21,0)
 ;;=^^3^3^2921119^
 ;;^DD(.42,1,21,1,0)
 ;;=The data type of the field as derived by the export tool or as input by the
 ;;^DD(.42,1,21,2,0)
 ;;=user is held in this field.  This data type may not correspond to the data
 ;;^DD(.42,1,21,3,0)
 ;;=type found in the data dictionary.
 ;;^DD(.42,1,"DT")
 ;;=2921013
 ;;^DD(.42,2,0)
 ;;=LENGTH FOR OUTPUT^NJ5,0^^0;3^K:+X'=X!(X>10000)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.42,2,3)
 ;;=Type a Number between 1 and 10000, 0 Decimal Digits
 ;;^DD(.42,2,21,0)
 ;;=^^2^2^2921119^
 ;;^DD(.42,2,21,1,0)
 ;;=The number of characters allotted to the field for fixed length export is
 ;;^DD(.42,2,21,2,0)
 ;;=stored here.
 ;;^DD(.42,2,"DT")
 ;;=2920903
 ;;^DD(.42,3,0)
 ;;=NAME OF FOREIGN FIELD^F^^0;4^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.42,3,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(.42,3,21,0)
 ;;=^^2^2^2921119^
 ;;^DD(.42,3,21,1,0)
 ;;=The name of the field as it is known in the importing application is
 ;;^DD(.42,3,21,2,0)
 ;;=stored here.  The user supplies this information.
 ;;^DD(.42,3,"DT")
 ;;=2921123

DINIT255
DINIT255 ;SFISC/MLH-FILEGRAM ERROR LOG ;9/9/94  14:26
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT26:X="" S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DIC(1.13,"%D",0)
 ;;=^^2^2^2930712^
 ;;^DIC(1.13,"%D",1,0)
 ;;=This file stores information about Filegram errors and the text
 ;;^DIC(1.13,"%D",2,0)
 ;;=of the affected Filegrams.
 ;;^DD(1.13,0,"IX","B",1.13,.01)
 ;;=
 ;;^DIC("B","FILEGRAM ERROR LOG",1.13)
 ;;=
 ;;^DD(1.13,0)
 ;;=FIELD^^2100^4
 ;;^DD(1.13,0,"DDA")
 ;;=N
 ;;^DD(1.13,0,"DT")
 ;;=2900904
 ;;^DD(1.13,0,"NM","FILEGRAM ERROR LOG")
 ;;=
 ;;^DD(1.13,.001,0)
 ;;=FILEGRAM NUMBER^NJ6,0^^ ^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.13,.001,3)
 ;;=Type a Number between 1 and 999999, 0 Decimal Digits
 ;;^DD(1.13,.001,23,0)
 ;;=^^1^1^2900904^
 ;;^DD(1.13,.001,23,1,0)
 ;;=Filegram number
 ;;^DD(1.13,.001,"DT")
 ;;=2900904
 ;;^DD(1.13,.01,0)
 ;;=LINE OF ERROR^RNJ5,0^^0;1^K:+X'=X!(X>99999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.13,.01,1,0)
 ;;=^.1
 ;;^DD(1.13,.01,1,1,0)
 ;;=1.13^B
 ;;^DD(1.13,.01,1,1,1)
 ;;=S ^DIAR(1.13,"B",$E(X,1,30),DA)=""
 ;;^DD(1.13,.01,1,1,2)
 ;;=K ^DIAR(1.13,"B",$E(X,1,30),DA)
 ;;^DD(1.13,.01,3)
 ;;=Type a Number between 1 and 99999, 0 Decimal Digits
 ;;^DD(1.13,.01,23,0)
 ;;=^^2^2^2900904^
 ;;^DD(1.13,.01,23,1,0)
 ;;=Line number returned in second piece of DIFGER indicating filegram line
 ;;^DD(1.13,.01,23,2,0)
 ;;=where error occurred
 ;;^DD(1.13,.01,"DT")
 ;;=2900904
 ;;^DD(1.13,.02,0)
 ;;=ERROR CODE^NJ2,0^^0;2^K:+X'=X!(X>99)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.13,.02,3)
 ;;=Type a Number between 1 and 99, 0 Decimal Digits
 ;;^DD(1.13,.02,23,0)
 ;;=^^2^2^2900904^
 ;;^DD(1.13,.02,23,1,0)
 ;;=Error code returned in first piece of DIFGER indicating type of
 ;;^DD(1.13,.02,23,2,0)
 ;;=installation error
 ;;^DD(1.13,.02,"DT")
 ;;=2900904
 ;;^DD(1.13,2100,0)
 ;;=FILEGRAM^1.1321^^21;0
 ;;^DD(1.13,2100,23,0)
 ;;=^^1^1^2900904^
 ;;^DD(1.13,2100,23,1,0)
 ;;=Text of the filegram
 ;;^DD(1.1321,0)
 ;;=FILEGRAM SUB-FIELD^^.01^1
 ;;^DD(1.1321,0,"DT")
 ;;=2900904
 ;;^DD(1.1321,0,"NM","FILEGRAM")
 ;;=
 ;;^DD(1.1321,0,"UP")
 ;;=1.13
 ;;^DD(1.1321,.01,0)
 ;;=FILEGRAM^WL^^0;1^Q
 ;;^DD(1.1321,.01,"DT")
 ;;=2900904

DINIT26
DINIT26 ;SFISC/XAK-INITIALIZE VA FILEMAN ;10:47 AM  13 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT260:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DIC(1.11,0,"GL")
 ;;=^DIAR(1.11,
 ;;^DIC("B","ARCHIVAL ACTIVITY",1.11)
 ;;=
 ;;^DIC(1.11,"%D",0)
 ;;=^^1^1^2930712^
 ;;^DIC(1.11,"%D",1,0)
 ;;=This file stores information and status of data archiving activities.
 ;;^DD(1.11,0)
 ;;=FIELD^^16^23
 ;;^DD(1.11,0,"DT")
 ;;=2920514
 ;;^DD(1.11,0,"ID",1)
 ;;=W "   ",$O(^DD(+$P(^(0),U,2),0,"NM",0)),$E(^DIAR(1.11,Y,0),0)
 ;;^DD(1.11,0,"ID",4)
 ;;=W ?40,$$NAKED^DIUTL("$$DATE^DIUTL($P(^(0),U,5))")
 ;;^DD(1.11,0,"ID",7)
 ;;=W "   ",$P($P($C(59)_$S($D(^DD(1.11,7,0)):$P(^(0),U,3),1:0),$C(59)_$P(^DIAR(1.11,Y,0),U,8)_":",2),$C(59),1)
 ;;^DD(1.11,0,"ID",8)
 ;;=S %I=Y,Y=$S('$D(^(0)):"",$D(^VA(200,+$P(^(0),U,9),0))#2:$P(^(0),U,1),1:""),C=$P($G(^DD(200,.01,0)),U,2) D:C]"" Y^DIQ:Y]"" W "   SELECTOR:",Y,@("$E("_DIC_"%I,0),0)") S Y=%I K %I
 ;;^DD(1.11,0,"ID",16)
 ;;=W "   ",@("$P($P($C(59)_$S($D(^DD(1.11,16,0)):$P(^(0),U,3),1:0)_$E("_DIC_"Y,0),0),$C(59)_$P(^(0),U,17)_"":"",2),$C(59),1)")
 ;;^DD(1.11,0,"NM","ARCHIVAL ACTIVITY")
 ;;=
 ;;^DD(1.11,.01,0)
 ;;=ARCHIVE NUMBER^RNJ7,0^^0;1^K:+X'=X!(X>9999999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.11,.01,1,0)
 ;;=^.1
 ;;^DD(1.11,.01,1,1,0)
 ;;=1.11^B
 ;;^DD(1.11,.01,1,1,1)
 ;;=S ^DIAR(1.11,"B",$E(X,1,30),DA)=""
 ;;^DD(1.11,.01,1,1,2)
 ;;=K ^DIAR(1.11,"B",$E(X,1,30),DA)
 ;;^DD(1.11,.01,3)
 ;;=Type a Number between 1 and 9999999, 0 Decimal Digits
 ;;^DD(1.11,1,0)
 ;;=FILE^RP1'^DIC(^0;2^Q
 ;;^DD(1.11,1,1,0)
 ;;=^.1
 ;;^DD(1.11,1,1,1,0)
 ;;=1.11^C
 ;;^DD(1.11,1,1,1,1)
 ;;=S ^DIAR(1.11,"C",$E(X,1,30),DA)=""
 ;;^DD(1.11,1,1,1,2)
 ;;=K ^DIAR(1.11,"C",$E(X,1,30),DA)
 ;;^DD(1.11,1,3)
 ;;=Enter the file that this archival activity will effect.
 ;;^DD(1.11,2,0)
 ;;=SEARCH TEMPLATE^RP.401^DIBT(^0;3^Q
 ;;^DD(1.11,2,3)
 ;;=Enter the name of the sort/search template that you wish to use.
 ;;^DD(1.11,3,0)
 ;;=PRINT TEMPLATE^R*P.4'X^DIPT(^0;4^S DIC("S")="I $P(^(0),U,8)="_$S($D(DIAX):2,1:1)_",$P(^(0),U,4)=$P(^DIAR(1.11,DA,0),U,2)",DIC(0)="QE",D="F"_+$P(^DIAR(1.11,DA,0),U,2) D IX^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;^DD(1.11,3,3)
 ;;=Enter the name of the FILEGRAM OR EXTRACT print template that you wish to use.
 ;;^DD(1.11,3,12)
 ;;=Select a print template in Filegram or Extract Format.
 ;;^DD(1.11,3,12.1)
 ;;=S DIC("S")="I $P(^(0),U,8)="_$S($D(DIAX):2,1:1)_",$P(^(0),U,4)=$P(^DIAR(1.11,DA,0),U,2)"
 ;;^DD(1.11,3,"DT")
 ;;=2920514
 ;;^DD(1.11,4,0)
 ;;=SELECT DATE^RD^^0;5^S %DT="ET" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.11,4,3)
 ;;=Enter the select date of this archival activity.
 ;;^DD(1.11,5,0)
 ;;=ARCHIVER^P200'^VA(200,^0;6^Q
 ;;^DD(1.11,5,3)
 ;;=Enter the name of the user that is doing the archiving.
 ;;^DD(1.11,6,0)
 ;;=NUMBER OF ITEMS TO ARCHIVE^RNJ7,0^^0;7^K:+X'=X!(X>9999999)!(X<0)!(X?.E1"."1N.N) X
 ;;^DD(1.11,6,3)
 ;;=Type a Number between 0 and 9999999, 0 Decimal Digits
 ;;^DD(1.11,7,0)
 ;;=ARCHIVAL STATUS^S^1:SELECTED;2:EDITED;4:ARCHIVED (TEMPORARY);5:ARCHIVED (PERMANENT);6:UPDATED DESTINATION FILE;90:PURGED;^0;8^Q
 ;;^DD(1.11,7,"DT")
 ;;=2920511
 ;;^DD(1.11,8,0)
 ;;=SELECTOR^P200'^VA(200,^0;9^Q
 ;;^DD(1.11,9,0)
 ;;=PURGER^P200'^VA(200,^0;10^Q
 ;;^DD(1.11,10,0)
 ;;=ARCHIVE DATE^D^^0;11^S %DT="E" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.11,11,0)
 ;;=PURGE DATE^D^^0;12^S %DT="E" D ^%DT S X=Y K:Y<1 X

DINIT260
DINIT260 ;SFISC/XAK-INITIALIZE VA FILEMAN ;12/14/92  2:48 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT27:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DD(1.11,12,0)
 ;;=DATE LAST PRINTED^D^^0;13^S %DT="ETX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.11,12,3)
 ;;=Enter the date that the listing of items to be archived was last printed.
 ;;^DD(1.11,13,0)
 ;;=ARCHIVING ACTION IN PROGRESS^S^1:SELECTION;2:EDITING;4:ARCHIVING (TEMPORARY);5:ARCHIVING (PERMANENT);6:UPDATING DESTINATION FILE;90:PURGING;99:CANCELLING;^0;14^Q
 ;;^DD(1.11,13,3)
 ;;=Entry will be made here by system when user begins performing some action to this ARCHIVAL ACTIVITY and will be deleted when action is complete, to lock out other users.
 ;;^DD(1.11,14,0)
 ;;=DATE/TIME ACTIVITY BEGAN^D^^0;15^S %DT="ESTXR" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.11,14,3)
 ;;=Date/time user began archiving action currently in progress.
 ;;^DD(1.11,15,0)
 ;;=USER PERFORMING ACTION^P200'^VA(200,^0;16^Q
 ;;^DD(1.11,15,3)
 ;;=User that initiated the archiving action.
 ;;^DD(1.11,16,0)
 ;;=TYPE OF ARCHIVE^S^0:ARCHIVING;1:EXTRACT;^0;17^Q
 ;;^DD(1.11,16,21,0)
 ;;=^^4^4^2921002^
 ;;^DD(1.11,16,21,1,0)
 ;;=This field indicates the archiving type for this particular archival
 ;;^DD(1.11,16,21,2,0)
 ;;=activity entry.  This should be 0 if the archival process is being done
 ;;^DD(1.11,16,21,3,0)
 ;;=under the Archiving options; or should be 1 if the archival process is
 ;;^DD(1.11,16,21,4,0)
 ;;=being done under the Extract Tool options.
 ;;^DD(1.11,17,0)
 ;;=DESTINATION FILE^P1'^DIC(^0;18^Q
 ;;^DD(1.11,17,21,0)
 ;;=^^2^2^2921002^
 ;;^DD(1.11,17,21,1,0)
 ;;=This field holds the number of the destination file for this archival
 ;;^DD(1.11,17,21,2,0)
 ;;=activity.
 ;;^DD(1.11,18,0)
 ;;=ARCHIVE DEVICE LABEL^F^^0;19^K:$L(X)>45!($L(X)<2) X
 ;;^DD(1.11,18,3)
 ;;=Answer must be 2-45 characters in length.
 ;;^DD(1.11,18,21,0)
 ;;=^^2^2^2921002^
 ;;^DD(1.11,18,21,1,0)
 ;;=This field holds the label information that identifies your archival
 ;;^DD(1.11,18,21,2,0)
 ;;=medium.
 ;;^DD(1.11,30,0)
 ;;=SUBFILE NUMBER^F^^1;1^K:+X'=X X
 ;;^DD(1.11,30,3)
 ;;=Type the number of a sub-file data dictionary.
 ;;^DD(1.11,31,0)
 ;;=SUBFILE SUBSCRIPTS^F^^1;2^K:$L(X)>50!($L(X)<3) X
 ;;^DD(1.11,31,3)
 ;;=Answer must be 3-50 characters in length.
 ;;^DD(1.11,32,0)
 ;;=SUBFILE SCREEN^1.1132A^^S;0
 ;;^DD(1.11,100,0)
 ;;=DATA^1.113^^D;0
 ;;^DD(1.113,0)
 ;;=DATA SUB-FIELD^^.01^1
 ;;^DD(1.113,0,"NM","DATA")
 ;;=
 ;;^DD(1.113,0,"UP")
 ;;=1.11
 ;;^DD(1.113,.01,0)
 ;;=DATA^WL^^0;1^Q
 ;;^DD(1.1132,0)
 ;;=SUBFILE SCREEN SUB-FIELD^^1^2
 ;;^DD(1.1132,0,"NM","SUBFILE SCREEN")
 ;;=
 ;;^DD(1.1132,0,"UP")
 ;;=1.11
 ;;^DD(1.1132,.01,0)
 ;;=SUBSCRIPT^F^^0;1^K:$L(X)>10!($L(X)<1) X
 ;;^DD(1.1132,.01,3)
 ;;=Answer must be 1-10 characters in length.
 ;;^DD(1.1132,1,0)
 ;;=CODE^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.1132,1,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.1132,1,9)
 ;;=@
 ;;^DD(1.11,200,0)
 ;;=DESTINATION FILE ENTRIES^1.14^^EX;0
 ;;^DD(1.14,0)
 ;;=DESTINATION FILE ENTRIES SUB-FIELD^^.01^1
 ;;^DD(1.14,0,"NM","DESTINATION FILE ENTRIES")
 ;;=
 ;;^DD(1.14,0,"UP")
 ;;=1.11
 ;;^DD(1.14,.01,0)
 ;;=DESTINATION FILE ENTRIES^MNJ9,0X^^0;1^K:+X'=X!(X>999999999)!(X<0)!(X?.E1"."1N.N) X I $D(X) S DINUM=X
 ;;^DD(1.14,.01,1,0)
 ;;=^.1
 ;;^DD(1.14,.01,1,1,0)
 ;;=1.14^B
 ;;^DD(1.14,.01,1,1,1)
 ;;=S ^DIAR(1.11,DA(1),"EX","B",$E(X,1,30),DA)=""
 ;;^DD(1.14,.01,1,1,2)
 ;;=K ^DIAR(1.11,DA(1),"EX","B",$E(X,1,30),DA)
 ;;^DD(1.14,.01,3)
 ;;=Type a Number between 0 and 999999999, 0 Decimal Digits
 ;;^DD(1.14,.01,21,0)
 ;;=^^2^2^2921208^
 ;;^DD(1.14,.01,21,1,0)
 ;;=This field holds the internal entry number of the record created in the
 ;;^DD(1.14,.01,21,3,0)
 ;;=destination file.

DINIT27
DINIT27 ;SFISC/DPC-LOADS DD OF FOREIGN FORMAT FILE ;01:40 PM  13 Sep 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT270:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DIC(.44,0,"GL")
 ;;=^DIST(.44,
 ;;^DIC("B","FOREIGN FORMAT",.44)
 ;;=
 ;;^DD(.44,0)
 ;;=FIELD^^11^19
 ;;^DD(.44,0,"DDA")
 ;;=N
 ;;^DD(.44,0,"DT")
 ;;=2930107
 ;;^DD(.44,0,"ID","WRITE")
 ;;=D:Y<1 EN^DDIOL("** DISTRIBUTED BY VA FILEMAN **","","?35")
 ;;^DD(.44,0,"IX","B",.44,.01)
 ;;=
 ;;^DD(.44,0,"IX","C",.441,.01)
 ;;=
 ;;^DD(.44,0,"NM","FOREIGN FORMAT")
 ;;=
 ;;^DD(.44,0,"PT",.4,105)
 ;;=
 ;;^DD(.44,.01,0)
 ;;=NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
 ;;^DD(.44,.01,1,0)
 ;;=^.1
 ;;^DD(.44,.01,1,1,0)
 ;;=.44^B
 ;;^DD(.44,.01,1,1,1)
 ;;=S ^DIST(.44,"B",$E(X,1,30),DA)=""
 ;;^DD(.44,.01,1,1,2)
 ;;=K ^DIST(.44,"B",$E(X,1,30),DA)
 ;;^DD(.44,.01,3)
 ;;=Name must be 3-30 characters in length, not starting with punctuation.
 ;;^DD(.44,.01,21,0)
 ;;=^^1^1^2920914^
 ;;^DD(.44,.01,21,1,0)
 ;;=This field identifies the format used by the non-VA FileMan application.
 ;;^DD(.44,.01,"DEL",1,0)
 ;;=I DA<1
 ;;^DD(.44,.01,"DT")
 ;;=2920914
 ;;^DD(.44,1,0)
 ;;=FIELD DELIMITER^FX^^0;2^K:$L(X)>15!($L(X)<1)!'((X?1AP.E)!(X?3N)!(X?3N1","3N)!(X?3N1","3N1","3N)!(X?3N1","3N1","3N1","3N)) X
 ;;^DD(.44,1,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.44,1,21,0)
 ;;=^^10^10^2921028^
 ;;^DD(.44,1,21,1,0)
 ;;=Contents of the field delimiter is output between each field.  Depending
 ;;^DD(.44,1,21,2,0)
 ;;=on the contents of the SEND LAST FIELD DELIMITER? field, the delimiter may
 ;;^DD(.44,1,21,3,0)
 ;;=be output after the last field, too. Identify the delimiter either by 1-15
 ;;^DD(.44,1,21,4,0)
 ;;=characters not beginning with a number or by the ASCII value of the
 ;;^DD(.44,1,21,5,0)
 ;;=delimiter.  When specifying the ASCII value, use 3 numbers (e.g., '009'
 ;;^DD(.44,1,21,6,0)
 ;;=for ASCII 9).  Up to four ASCII-character values can be specified,
 ;;^DD(.44,1,21,7,0)
 ;;=separated by commas.
 ;;^DD(.44,1,21,8,0)
 ;;= 
 ;;^DD(.44,1,21,9,0)
 ;;=If 'Ask' is entered, the user will be prompted for the field delimiter
 ;;^DD(.44,1,21,10,0)
 ;;=when creating the EXPORT template.
 ;;^DD(.44,1,"DT")
 ;;=2920914
 ;;^DD(.44,2,0)
 ;;=RECORD DELIMITER^F^^0;3^K:$L(X)>15!($L(X)<1)!'((X?1AP.E)!(X?3N)!(X?3N1","3N)!(X?3N1","3N1","3N)!(X?3N1","3N1","3N1","3N)) X
 ;;^DD(.44,2,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.44,2,21,0)
 ;;=^^8^8^2921026^
 ;;^DD(.44,2,21,1,0)
 ;;=Contents of the record delimiter is output after each record.  Identify
 ;;^DD(.44,2,21,2,0)
 ;;=the delimiter either by 1-15 characters not beginning with a number or by
 ;;^DD(.44,2,21,3,0)
 ;;=the ASCII value of the delimiter.  When specifying the ASCII value, use 3
 ;;^DD(.44,2,21,4,0)
 ;;=numbers (e.g., '009' for ASCII 9).  Up to four ASCII-character values can
 ;;^DD(.44,2,21,5,0)
 ;;=be specified, separated by commas.
 ;;^DD(.44,2,21,6,0)
 ;;= 
 ;;^DD(.44,2,21,7,0)
 ;;=If 'Ask' is entered, the user is prompted for the record delimiter when
 ;;^DD(.44,2,21,8,0)
 ;;=creating the EXPORT template.
 ;;^DD(.44,2,"DT")
 ;;=2920914
 ;;^DD(.44,3,0)
 ;;=LINE CONTINUATION CHARACTER^F^^0;4^K:$L(X)>15!($L(X)<1) X
 ;;^DD(.44,3,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.44,3,21,0)
 ;;=^^1^1^2921028^
 ;;^DD(.44,3,21,1,0)
 ;;=Not used yet.
 ;;^DD(.44,3,"DT")
 ;;=2920828
 ;;^DD(.44,4,0)
 ;;=LINE CONTINUATION LOCATION^S^e:END OF LINE;b:BEGINNING OF LINE;^0;5^Q
 ;;^DD(.44,4,21,0)
 ;;=^^1^1^2920917^
 ;;^DD(.44,4,21,1,0)
 ;;=Not used yet.
 ;;^DD(.44,4,"DT")
 ;;=2920828
 ;;^DD(.44,5,0)
 ;;=RECORD LENGTH FIXED?^S^1:YES;0:NO;^0;6^Q
 ;;^DD(.44,5,21,0)
 ;;=^^3^3^2920917^
 ;;^DD(.44,5,21,1,0)
 ;;=Enter YES if the fields will be fixed length causing a fixed length record
 ;;^DD(.44,5,21,2,0)
 ;;=to be created.  When the EXPORT template is created, the user is prompted
 ;;^DD(.44,5,21,3,0)
 ;;=for the length of each field in the TARGET file.
 ;;^DD(.44,5,"DT")
 ;;=2920828
 ;;^DD(.44,6,0)
 ;;=NEED FOREIGN FIELD NAMES?^S^1:YES;0:NO;^0;7^Q
 ;;^DD(.44,6,21,0)
 ;;=^^3^3^2921013^
 ;;^DD(.44,6,21,1,0)
 ;;=Answer YES if it is necessary to save the field names from the foreign
 ;;^DD(.44,6,21,2,0)
 ;;=file in the export file.  The user will be prompted for the names when the
 ;;^DD(.44,6,21,3,0)
 ;;=EXPORT template is created.
 ;;^DD(.44,6,"DT")
 ;;=2920828
 ;;^DD(.44,7,0)
 ;;=MAXIMUM OUTPUT LENGTH^NJ4,0^^0;8^K:+X'=X!(X>9999)!(X<0)!(X?.E1"."1N.N) X
 ;;^DD(.44,7,3)
 ;;=Type a Number between 0 and 9999, 0 Decimal Digits
 ;;^DD(.44,7,21,0)
 ;;=^^7^7^2921026^
 ;;^DD(.44,7,21,1,0)
 ;;=The maximum length of a "line" of output; maximum number of characters
 ;;^DD(.44,7,21,2,0)
 ;;=before a LINE FEED is issued.  For most exports, this will be the maximum
 ;;^DD(.44,7,21,3,0)
 ;;=record length.
 ;;^DD(.44,7,21,4,0)
 ;;= 

DINIT270
DINIT270 ;SFISC/DPC-LOAD OF FOREIGN FORMAT DD (CONT) ;1/4/94  13:37
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT271:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DD(.44,7,21,5,0)
 ;;=If 0 is entered, the user will be prompted for maximum length when
 ;;^DD(.44,7,21,6,0)
 ;;=creating the EXPORT template.  If nothing is entered, the default will be
 ;;^DD(.44,7,21,7,0)
 ;;=80.
 ;;^DD(.44,7,"DT")
 ;;=2921026
 ;;^DD(.44,8,0)
 ;;=QUOTE NON-NUMERIC FIELDS?^S^1:YES;0:NO;^0;10^Q
 ;;^DD(.44,8,3)
 ;;=Enter '1' for YES or '0' for NO.
 ;;^DD(.44,8,21,0)
 ;;=^^7^7^2921013^
 ;;^DD(.44,8,21,1,0)
 ;;=If you want the values of fields that have a data type other than numeric
 ;;^DD(.44,8,21,2,0)
 ;;=to be surrounded by quotation marks ("), set this field to YES.
 ;;^DD(.44,8,21,3,0)
 ;;= 
 ;;^DD(.44,8,21,4,0)
 ;;=NOTE:  Only numeric fields in the home file (including multiples) are
 ;;^DD(.44,8,21,5,0)
 ;;=automatically considered to have a numeric data type.  If you want the
 ;;^DD(.44,8,21,6,0)
 ;;=user to indicate which fields should be numeric, answer YES to the PROMPT
 ;;^DD(.44,8,21,7,0)
 ;;=FOR DATA TYPE? field.
 ;;^DD(.44,8,"DT")
 ;;=2921013
 ;;^DD(.44,9,0)
 ;;=PROMPT FOR DATA TYPE?^S^1:YES;0:NO;^0;11^Q
 ;;^DD(.44,9,3)
 ;;=Enter '1' for YES, '0' for NO.
 ;;^DD(.44,9,21,0)
 ;;=^^3^3^2921013^
 ;;^DD(.44,9,21,1,0)
 ;;=Answer YES if you want the user to be prompted for the data type of the
 ;;^DD(.44,9,21,2,0)
 ;;=various fields at the time that an export template is being created.
 ;;^DD(.44,9,21,3,0)
 ;;=Otherwise, the data types will be automatically  derived.
 ;;^DD(.44,9,"DT")
 ;;=2921013
 ;;^DD(.44,10,0)
 ;;=SEND LAST FIELD DELIMITER?^S^0:NO;1:YES;^0;12^Q
 ;;^DD(.44,10,3)
 ;;=Enter '1' for YES, '0' for NO.
 ;;^DD(.44,10,21,0)
 ;;=^^3^3^2921028^
 ;;^DD(.44,10,21,1,0)
 ;;=Enter NO if you do not want a field delimiter to be output after the last
 ;;^DD(.44,10,21,2,0)
 ;;=field in a record.  Enter YES if you do want a final field delimiter
 ;;^DD(.44,10,21,3,0)
 ;;=output.
 ;;^DD(.44,10,"DT")
 ;;=2921028
 ;;^DD(.44,20,0)
 ;;=FILE HEADER^FX^^1;E1,245^K:$L(X)>245!($L(X)<1) X I $E($G(X))'="""" K:DUZ(0)'="@" X D:$D(X) ^DIM
 ;;^DD(.44,20,3)
 ;;=Answer must be standard MUMPS code or a literal string in quotes.
 ;;^DD(.44,20,21,0)
 ;;=^^7^7^2921001^
 ;;^DD(.44,20,21,1,0)
 ;;=Use this field to produce output preceding the exported records.  This
 ;;^DD(.44,20,21,2,0)
 ;;=will become part of your exported data.
 ;;^DD(.44,20,21,3,0)
 ;;= 
 ;;^DD(.44,20,21,4,0)
 ;;=Enter either a literal string enclosed in quotation marks ("like this") or
 ;;^DD(.44,20,21,5,0)
 ;;=MUMPS code that will WRITE the desired output when XECUTED.  For example:
 ;;^DD(.44,20,21,6,0)
 ;;= 
 ;;^DD(.44,20,21,7,0)
 ;;=       W "EXPORT CREATED BY USER NUMBER: "_$G(DUZ)
 ;;^DD(.44,20,"DT")
 ;;=2921028
 ;;^DD(.44,25,0)
 ;;=FILE TRAILER^FX^^2;E1,245^K:$L(X)>245!($L(X)<1) X I $E($G(X))'="""" K:DUZ(0)'="@" X D:$D(X) ^DIM
 ;;^DD(.44,25,3)
 ;;=Answer must be standard MUMPS code or a literal string in quotes.
 ;;^DD(.44,25,21,0)
 ;;=^^7^7^2921001^
 ;;^DD(.44,25,21,1,0)
 ;;=Use this field to produce output following the the exported records.  This
 ;;^DD(.44,25,21,2,0)
 ;;=will become part of your exported data.
 ;;^DD(.44,25,21,3,0)
 ;;= 
 ;;^DD(.44,25,21,4,0)
 ;;=Enter either a literal string enclosed in quotation marks ("like this") or
 ;;^DD(.44,25,21,5,0)
 ;;=MUMPS code that will WRITE the desired output when XECUTED.  For example:
 ;;^DD(.44,25,21,6,0)
 ;;= 
 ;;^DD(.44,25,21,7,0)
 ;;=       W "EXPORT CREATED BY USER NUMBER: "_$G(DUZ)
 ;;^DD(.44,25,"DT")
 ;;=2921028
 ;;^DD(.44,27,0)
 ;;=DATE FORMAT^K^^6;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.44,27,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.44,27,9)
 ;;=@
 ;;^DD(.44,27,21,0)
 ;;=^^6^6^2920923^
 ;;^DD(.44,27,21,1,0)
 ;;=If you want dates output in VA FileMan's standard external date/time
 ;;^DD(.44,27,21,2,0)
 ;;=format, make NO entry in this field.
 ;;^DD(.44,27,21,3,0)
 ;;= 
 ;;^DD(.44,27,21,4,0)
 ;;=If you want another format, enter MUMPS code here. The variable X will
 ;;^DD(.44,27,21,5,0)
 ;;=contain the date/time in VA FileMan's internal format.  The MUMPS code
 ;;^DD(.44,27,21,6,0)
 ;;=should SET Y to the date/time in the format you desire.
 ;;^DD(.44,27,"DT")
 ;;=2920923
 ;;^DD(.44,30,0)
 ;;=DESCRIPTION^.447^^3;0
 ;;^DD(.44,30,21,0)
 ;;=^^1^1^2920917^
 ;;^DD(.44,30,21,1,0)
 ;;=A description of the foreign format.
 ;;^DD(.44,31,0)
 ;;=USAGE NOTES^.448^^4;0
 ;;^DD(.44,31,21,0)
 ;;=^^2^2^2920917^
 ;;^DD(.44,31,21,1,0)
 ;;=Information about the use of the format; for example, which commands on
 ;;^DD(.44,31,21,2,0)
 ;;=the foreign system should be used to load the file.

DINIT271
DINIT271 ;SFISC/DPC-LOAD OF FOREIGN FORMAT DD (END) ;9/9/94  12:56
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT27A:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DIC(.44,"%D",0)
 ;;=^^3^3^2940908^
 ;;^DIC(.44,"%D",1,0)
 ;;=This file stores the characteristics of various file export formats,
 ;;^DIC(.44,"%D",2,0)
 ;;=which are used by the Export tool in building Export Templates to send
 ;;^DIC(.44,"%D",3,0)
 ;;=data to non-M systems.
 ;;^DD(.44,11,0)
 ;;=SUBSTITUTE FOR NULL^F^^0;13^K:$L(X)>15!($L(X)<1) X
 ;;^DD(.44,11,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.44,11,21,0)
 ;;=^^5^5^2930107^
 ;;^DD(.44,11,21,1,0)
 ;;=This field only affects numeric values exported in a delimited format.
 ;;^DD(.44,11,21,2,0)
 ;;=If nothing is entered in this field, data values of null will cause
 ;;^DD(.44,11,21,3,0)
 ;;=nothing to be exported for that field in the particular record.  If you
 ;;^DD(.44,11,21,4,0)
 ;;=want something to be exported when the data value is null, enter the
 ;;^DD(.44,11,21,5,0)
 ;;=character or characters in this field.
 ;;^DD(.44,11,"DT")
 ;;=2930107
 ;;^DD(.44,40,0)
 ;;=FORMAT USED?^S^0:NO;1:YES;^0;9^Q
 ;;^DD(.44,40,21,0)
 ;;=^^2^2^2920925^
 ;;^DD(.44,40,21,1,0)
 ;;=When set to YES, this field means that this Foriegn Format entry has been
 ;;^DD(.44,40,21,2,0)
 ;;=used to create an Export Template.
 ;;^DD(.44,40,"DT")
 ;;=2920925
 ;;^DD(.44,50,0)
 ;;=OTHER NAME FOR FORMAT^.441^^5;0
 ;;^DD(.441,0)
 ;;=OTHER NAME FOR FORMAT SUB-FIELD^^1^2
 ;;^DD(.441,0,"DT")
 ;;=2920914
 ;;^DD(.441,0,"IX","B",.441,.01)
 ;;=
 ;;^DD(.441,0,"NM","OTHER NAME FOR FORMAT")
 ;;=
 ;;^DD(.441,0,"UP")
 ;;=.44
 ;;^DD(.441,.01,0)
 ;;=OTHER NAME FOR FORMAT^MF^^0;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>30!($L(X)<3) X
 ;;^DD(.441,.01,1,0)
 ;;=^.1
 ;;^DD(.441,.01,1,1,0)
 ;;=.441^B
 ;;^DD(.441,.01,1,1,1)
 ;;=S ^DIST(.44,DA(1),5,"B",$E(X,1,30),DA)=""
 ;;^DD(.441,.01,1,1,2)
 ;;=K ^DIST(.44,DA(1),5,"B",$E(X,1,30),DA)
 ;;^DD(.441,.01,1,2,0)
 ;;=.44^C
 ;;^DD(.441,.01,1,2,1)
 ;;=S ^DIST(.44,"C",$E(X,1,30),DA(1),DA)=""
 ;;^DD(.441,.01,1,2,2)
 ;;=K ^DIST(.44,"C",$E(X,1,30),DA(1),DA)
 ;;^DD(.441,.01,1,2,"%D",0)
 ;;=^^1^1^2920917^
 ;;^DD(.441,.01,1,2,"%D",1,0)
 ;;=This cross reference allows look-up of formats based on OTHER NAMES.
 ;;^DD(.441,.01,1,2,"DT")
 ;;=2920917
 ;;^DD(.441,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(.441,.01,21,0)
 ;;=^^2^2^2920917^
 ;;^DD(.441,.01,21,1,0)
 ;;=Another name by which the foreign format might be known.  This name can be
 ;;^DD(.441,.01,21,2,0)
 ;;=used to access the format.
 ;;^DD(.441,.01,"DT")
 ;;=2920917
 ;;^DD(.441,1,0)
 ;;=DESCRIPTION FOR OTHER NAME^.4411^^1;0
 ;;^DD(.441,1,21,0)
 ;;=^^1^1^2920917^
 ;;^DD(.441,1,21,1,0)
 ;;=Description and information about the format's other name.
 ;;^DD(.4411,0)
 ;;=DESCRIPTION FOR OTHER NAME SUB-FIELD^^.01^1
 ;;^DD(.4411,0,"DT")
 ;;=2920914
 ;;^DD(.4411,0,"NM","DESCRIPTION FOR OTHER NAME")
 ;;=
 ;;^DD(.4411,0,"UP")
 ;;=.441
 ;;^DD(.4411,.01,0)
 ;;=DESCRIPTION FOR OTHER NAME^W^^0;1^Q
 ;;^DD(.4411,.01,"DT")
 ;;=2920914
 ;;^DD(.447,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.447,0,"DT")
 ;;=2920914
 ;;^DD(.447,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.447,0,"UP")
 ;;=.44
 ;;^DD(.447,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.447,.01,"DT")
 ;;=2920914
 ;;^DD(.448,0)
 ;;=USAGE NOTES SUB-FIELD^^.01^1
 ;;^DD(.448,0,"DT")
 ;;=2920914
 ;;^DD(.448,0,"NM","USAGE NOTES")
 ;;=
 ;;^DD(.448,0,"UP")
 ;;=.44
 ;;^DD(.448,.01,0)
 ;;=USAGE NOTES^W^^0;1^Q
 ;;^DD(.448,.01,"DT")
 ;;=2920914

DINIT27A
DINIT27A ;ISCSF/DPC-FOREIGN FORMAT 1-2-3 DATA PARSE ;1/11/93  2:27 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27B S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.001,0)
 ;;=1-2-3 DATA PARSE^^^^^1^^240^1^^1^1
 ;;^DIST(.44,.001,1)
 ;;=W $$DP123^DDXPLIB(DDXPXTNO)
 ;;^DIST(.44,.001,3,0)
 ;;=^^4^4^2921106^
 ;;^DIST(.44,.001,3,1,0)
 ;;=This format produces fixed length records designed for import into Lotus
 ;;^DIST(.44,.001,3,2,0)
 ;;=1-2-3.  The user is prompted for data types.  A special header is created
 ;;^DIST(.44,.001,3,3,0)
 ;;=that is used by 1-2-3's Data Parser.  The maximum record length is 240
 ;;^DIST(.44,.001,3,4,0)
 ;;=characters.
 ;;^DIST(.44,.001,4,0)
 ;;=^^10^10^2921120^
 ;;^DIST(.44,.001,4,1,0)
 ;;=To import data into 1-2-3 from a file created with this format: 1) Use
 ;;^DIST(.44,.001,4,2,0)
 ;;=File->Import->Text and select the file.  2) The first line of the file
 ;;^DIST(.44,.001,4,3,0)
 ;;=contains the information for the data parser.  You must change this from a
 ;;^DIST(.44,.001,4,4,0)
 ;;=label, preceded by ', to a format, preceded by ||.  Edit the line to make
 ;;^DIST(.44,.001,4,5,0)
 ;;=this change.  3) Use Data->Parse.  The Input Column range should include
 ;;^DIST(.44,.001,4,6,0)
 ;;=all the imported data, including the format line.  Select a desired Output
 ;;^DIST(.44,.001,4,7,0)
 ;;=Range. Finally, select Go to format the data in the output range. Be sure
 ;;^DIST(.44,.001,4,8,0)
 ;;=your columns are wide enough to hold the data.  NOTE: dates will be
 ;;^DIST(.44,.001,4,9,0)
 ;;=changed into numbers, 1-2-3's internal representation of a date. You can
 ;;^DIST(.44,.001,4,10,0)
 ;;=make the date readable by using Range->Format->Date.
 ;;^DIST(.44,.001,5,0)
 ;;=^.441^1^1
 ;;^DIST(.44,.001,5,1,0)
 ;;=Lotus 1-2-3 Data Parse
 ;;^DIST(.44,.001,5,"B","Lotus 1-2-3 Data Parse",1)
 ;;=
 ;;^DIST(.44,.001,6)
 ;;=S Y=$E(X,6,7)_"-"_$P("JAN^FEB^MAR^APR^MAY^JUN^JUL^AUG^SEP^OCT^NOV^DEC",U,+$E(X,4,5))_"-"_$E(X,2,3) S:$E(X)'=2 Y="NOT 1900s"

DINIT27B
DINIT27B ;ISCSF/DPC-FOREIGN FORMAT 1-2-3 IMPORT NUMBERS ;1/11/93  2:34 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27C S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.002,0)
 ;;=1-2-3 IMPORT NUMBERS^032^^^^^^0^1^1^1^1^0
 ;;^DIST(.44,.002,3,0)
 ;;=^^9^9^2930107^
 ;;^DIST(.44,.002,3,1,0)
 ;;=This format exports data for use with LOTUS 1-2-3 spreadsheets.
 ;;^DIST(.44,.002,3,2,0)
 ;;=Non-numeric fields will be in quotes.  Each field will be separated by
 ;;^DIST(.44,.002,3,3,0)
 ;;=a space.  Null-valued numeric fields in the primary file will be converted
 ;;^DIST(.44,.002,3,4,0)
 ;;=to a zero ('0'). WARNING: If the value of a field that is not in the
 ;;^DIST(.44,.002,3,5,0)
 ;;=primary file or that is not defined in the VA FILEMAN data dictionary as
 ;;^DIST(.44,.002,3,6,0)
 ;;=numeric is null or zero, nothing is output. That is, a zero (0) is NOT
 ;;^DIST(.44,.002,3,7,0)
 ;;=output.  This will destroy the positional results of the data and will
 ;;^DIST(.44,.002,3,8,0)
 ;;=install data in incorrect columns!!  If this situation is possible, do NOT
 ;;^DIST(.44,.002,3,9,0)
 ;;=use this format; consider the 123 DATA PARSE format.
 ;;^DIST(.44,.002,4,0)
 ;;=^^4^4^2930107^
 ;;^DIST(.44,.002,4,1,0)
 ;;=To import into 1-2-3, choose FILE->IMPORT->NUMBERS.
 ;;^DIST(.44,.002,4,2,0)
 ;;=Field values will automatically be placed into columns.
 ;;^DIST(.44,.002,4,3,0)
 ;;=Lotus 1-2-3 will automatically recognize your file for import if it has an
 ;;^DIST(.44,.002,4,4,0)
 ;;=extension of '.PRN'.
 ;;^DIST(.44,.002,5,0)
 ;;=^.441^1^1
 ;;^DIST(.44,.002,5,1,0)
 ;;=LOTUS 123 (NUMBERS)
 ;;^DIST(.44,.002,5,"B","LOTUS 123 (NUMBERS)",1)
 ;;=

DINIT27C
DINIT27C ;SFISC/DPC-FOREIGN FORMAT EXCEL(COMMA) ;11/30/92  3:39 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27D S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.003,0)
 ;;=EXCEL (COMMA)^,^^^^^^1000^1^1^1^1
 ;;^DIST(.44,.003,3,0)
 ;;=^^6^6^2921120^
 ;;^DIST(.44,.003,3,1,0)
 ;;=Use this format to export data to the EXCEL spreadsheet running
 ;;^DIST(.44,.003,3,2,0)
 ;;=on the Macintosh or under Windows.  The exported data will have a comma
 ;;^DIST(.44,.003,3,3,0)
 ;;=between each field's value.  The user will be asked to specify the data
 ;;^DIST(.44,.003,3,4,0)
 ;;=type of each exported field.  Those fields that are not numeric will be
 ;;^DIST(.44,.003,3,5,0)
 ;;=surrounded by quotes (").  Commas are allowed in the non-numeric data, but
 ;;^DIST(.44,.003,3,6,0)
 ;;=quotes (") are not.
 ;;^DIST(.44,.003,4,0)
 ;;=^^3^3^2921120^^^^
 ;;^DIST(.44,.003,4,1,0)
 ;;=Select the Open command on Excel's File menu.  Press the TEXT button and
 ;;^DIST(.44,.003,4,2,0)
 ;;=make sure that the Column Delimiter is set to "comma."  Select the file.
 ;;^DIST(.44,.003,4,3,0)
 ;;=Each field's values will be imported into columns.
 ;;^DIST(.44,.003,5,0)
 ;;=^.441^2^2
 ;;^DIST(.44,.003,5,1,0)
 ;;=COMMA DELIMITED
 ;;^DIST(.44,.003,5,1,1,0)
 ;;=^^2^2^2921015^
 ;;^DIST(.44,.003,5,1,1,1,0)
 ;;=Exported data is delimited by commas.  Non-numeric data is surrounded by
 ;;^DIST(.44,.003,5,1,1,2,0)
 ;;=quotes.
 ;;^DIST(.44,.003,5,2,0)
 ;;=CSV
 ;;^DIST(.44,.003,5,2,1,0)
 ;;=^^1^1^2921120^^
 ;;^DIST(.44,.003,5,2,1,1,0)
 ;;=Comma Separated Values.
 ;;^DIST(.44,.003,5,"B","COMMA DELIMITED",1)
 ;;=
 ;;^DIST(.44,.003,5,"B","CSV",2)
 ;;=

DINIT27D
DINIT27D ;SFISC/DPC-FOREIGN FORMAT EXCEL(DATA PARSE) ;11/30/92  3:42 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27E S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.004,0)
 ;;=EXCEL (DATA PARSE)^^^^^1^^255^1^^^1
 ;;^DIST(.44,.004,1)
 ;;=W $$DPXCEL^DDXPLIB(DDXPXTNO)
 ;;^DIST(.44,.004,3,0)
 ;;=^^4^4^2921120^
 ;;^DIST(.44,.004,3,1,0)
 ;;=Use the EXCEL-DATA PARSE format to export data to the EXCEL spreadsheet
 ;;^DIST(.44,.004,3,2,0)
 ;;=program running on the Macintosh or under windows.  Exported data is fixed
 ;;^DIST(.44,.004,3,3,0)
 ;;=length.  The first line output is a guide for use by EXCEL's Data Parser
 ;;^DIST(.44,.004,3,4,0)
 ;;=to place data into columns.  Maximum record length is 255 characters.
 ;;^DIST(.44,.004,4,0)
 ;;=^^7^7^2921120^
 ;;^DIST(.44,.004,4,1,0)
 ;;=To import a file created in this format into Excel, choose the Open
 ;;^DIST(.44,.004,4,2,0)
 ;;=command on the File menu and select the file.  Each record will be put
 ;;^DIST(.44,.004,4,3,0)
 ;;=into a single cell.  Select the column that has the data, including the
 ;;^DIST(.44,.004,4,4,0)
 ;;=first record which will contain the guide for data parsing.  Then, choose
 ;;^DIST(.44,.004,4,5,0)
 ;;=Parse from the Data menu.  Press the GUESS button and then press OK.  The
 ;;^DIST(.44,.004,4,6,0)
 ;;=data will be put into correct columns.  You may need to adjust column
 ;;^DIST(.44,.004,4,7,0)
 ;;=widths.

DINIT27E
DINIT27E ;SFISC/DPC-FOREIGN FORMAT EXCEL(TAB) ;11/30/92  3:44 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27F S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.005,0)
 ;;=EXCEL (TAB)^009^^^^^^^1^^^1
 ;;^DIST(.44,.005,3,0)
 ;;=^^2^2^2921120^
 ;;^DIST(.44,.005,3,1,0)
 ;;=Format used to export data to EXCEL spreadsheet running on the Macintosh
 ;;^DIST(.44,.005,3,2,0)
 ;;=or under Windows.  A <TAB> is placed between each field's value.
 ;;^DIST(.44,.005,4,0)
 ;;=^^6^6^2921120^^^
 ;;^DIST(.44,.005,4,1,0)
 ;;=Select the Open command on Excel's File menu.  Press the TEXT button and
 ;;^DIST(.44,.005,4,2,0)
 ;;=make sure that the Column Delimiter is set to "TAB."  Select the file.
 ;;^DIST(.44,.005,4,3,0)
 ;;=Each field's values will be imported into columns.
 ;;^DIST(.44,.005,4,4,0)
 ;;=If you are capturing data to make your export file, be sure that the <TAB>
 ;;^DIST(.44,.005,4,5,0)
 ;;=(ASCII value 009) is not converted to spaces by your communications
 ;;^DIST(.44,.005,4,6,0)
 ;;=software.
 ;;^DIST(.44,.005,5,0)
 ;;=^.441^1^1
 ;;^DIST(.44,.005,5,1,0)
 ;;=Tab Delimited
 ;;^DIST(.44,.005,5,1,1,0)
 ;;=^^1^1^2921120^^
 ;;^DIST(.44,.005,5,1,1,1,0)
 ;;=A <TAB> is placed between each field's value.
 ;;^DIST(.44,.005,5,"B","Tab Delimited",1)
 ;;=

DINIT27F
DINIT27F ;SFISC/DPC-EIGN FORMAT WORD (COMMA) ;11/30/92  3:46 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27G S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.006,0)
 ;;=WORD DATA FILE (COMMA)^,^^^^^1^250^1^1^^0
 ;;^DIST(.44,.006,1)
 ;;=W $$FLDNM^DDXPLIB(DDXPXTNO)
 ;;^DIST(.44,.006,3,0)
 ;;=^^5^5^2921106^
 ;;^DIST(.44,.006,3,1,0)
 ;;=The format creates records with comma delimited fields.  Non-numeric
 ;;^DIST(.44,.006,3,2,0)
 ;;=fields are in quotes.  The user is prompted for field names that are
 ;;^DIST(.44,.006,3,3,0)
 ;;=output as the first line of the exported file.
 ;;^DIST(.44,.006,3,4,0)
 ;;=This format was designed to be used to create a Data File for use with
 ;;^DIST(.44,.006,3,5,0)
 ;;=Microsoft Word's Print Merge utility.
 ;;^DIST(.44,.006,4,0)
 ;;=^^6^6^2921106^
 ;;^DIST(.44,.006,4,1,0)
 ;;=Use the exported file as the Data File for Microsoft Word's Print Merge
 ;;^DIST(.44,.006,4,2,0)
 ;;=utility.  The Merge Field names are contained in the first line of exported
 ;;^DIST(.44,.006,4,3,0)
 ;;=data.  See the Word documentation and Descriptions of Other Names for
 ;;^DIST(.44,.006,4,4,0)
 ;;=instructions for importing into various versions of Word.
 ;;^DIST(.44,.006,4,5,0)
 ;;=(Note: Word does not allow spaces and some other punctuation in the Merge
 ;;^DIST(.44,.006,4,6,0)
 ;;=Field names.)
 ;;^DIST(.44,.006,5,0)
 ;;=^.441^3^3
 ;;^DIST(.44,.006,5,1,0)
 ;;=WORD 5.0 (MACINTOSH)
 ;;^DIST(.44,.006,5,1,1,0)
 ;;=^^7^7^2921106^
 ;;^DIST(.44,.006,5,1,1,1,0)
 ;;=To use the exported file as a Data File:
 ;;^DIST(.44,.006,5,1,1,2,0)
 ;;=1) With Main Document open, select Print Merge Helper on the View menu and
 ;;^DIST(.44,.006,5,1,1,3,0)
 ;;=choose the exported file as the Data File.
 ;;^DIST(.44,.006,5,1,1,4,0)
 ;;=2)From the Insert Field Names box on the Print Merge Helper bar, insert
 ;;^DIST(.44,.006,5,1,1,5,0)
 ;;=the field names into the Main Document.
 ;;^DIST(.44,.006,5,1,1,6,0)
 ;;=3)Select Print Merge from the File menu to merge the exported data into
 ;;^DIST(.44,.006,5,1,1,7,0)
 ;;=the Main Document.
 ;;^DIST(.44,.006,5,2,0)
 ;;=WORD 4.0 (MACINTOSH)
 ;;^DIST(.44,.006,5,2,1,0)
 ;;=^^8^8^2921106^
 ;;^DIST(.44,.006,5,2,1,1,0)
 ;;=To use the exported file as a Data file:
 ;;^DIST(.44,.006,5,2,1,2,0)
 ;;=1)Into the main document enter the Merge Instruction 'DATA' followed by
 ;;^DIST(.44,.006,5,2,1,3,0)
 ;;=the file name of your exported file surrounded by Merge Quotes.
 ;;^DIST(.44,.006,5,2,1,4,0)
 ;;=2)Enter your field names in the Main Document.  The names must match
 ;;^DIST(.44,.006,5,2,1,5,0)
 ;;=exactly those on the first line of the Data (exported) file and be
 ;;^DIST(.44,.006,5,2,1,6,0)
 ;;=surrounded by Merge Quotes (<OPTION-\> AND <OPTION-SHIFT-\>).
 ;;^DIST(.44,.006,5,2,1,7,0)
 ;;=3)Select Print Merge from the File menu to merge the data into the Main
 ;;^DIST(.44,.006,5,2,1,8,0)
 ;;=Document.
 ;;^DIST(.44,.006,5,3,0)
 ;;=WINWORD 2.0
 ;;^DIST(.44,.006,5,3,1,0)
 ;;=^^7^7^2921106^
 ;;^DIST(.44,.006,5,3,1,1,0)
 ;;=To use the exported file as the Data file:
 ;;^DIST(.44,.006,5,3,1,2,0)
 ;;=1) With the Main Document open, select Print Merge from the File menu and
 ;;^DIST(.44,.006,5,3,1,3,0)
 ;;=press Attach Data File button.  Select your exported file as the Data
 ;;^DIST(.44,.006,5,3,1,4,0)
 ;;=file.
 ;;^DIST(.44,.006,5,3,1,5,0)
 ;;=2) Use the Insert Merge Fields box to place Merge Fields in the Main
 ;;^DIST(.44,.006,5,3,1,6,0)
 ;;=Document.
 ;;^DIST(.44,.006,5,3,1,7,0)
 ;;=3) Again select Print Merge from the File menu and press the Merge button.
 ;;^DIST(.44,.006,5,"B","WINWORD 2.0",3)
 ;;=
 ;;^DIST(.44,.006,5,"B","WORD 4.0 (MACINTOSH)",2)
 ;;=
 ;;^DIST(.44,.006,5,"B","WORD 5.0 (MACINTOSH)",1)
 ;;=

DINIT27G
DINIT27G ;SFISC/DPC-FOREIGN FORMAT WORD(TAB) ;11/30/92  3:50 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27H S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.007,0)
 ;;=WORD DATA FILE (TAB)^009^^^^^1^250^1^1^^0
 ;;^DIST(.44,.007,1)
 ;;=W $$FLDNM^DDXPLIB(DDXPXTNO)
 ;;^DIST(.44,.007,3,0)
 ;;=^^5^5^2921106^
 ;;^DIST(.44,.007,3,1,0)
 ;;=The format creates records with <TAB> delimited fields.  Non-numeric
 ;;^DIST(.44,.007,3,2,0)
 ;;=fields are in quotes.  The user is prompted for field names that are
 ;;^DIST(.44,.007,3,3,0)
 ;;=output as the first line of the exported file.
 ;;^DIST(.44,.007,3,4,0)
 ;;=This format was designed to be used to create a Data File for use with
 ;;^DIST(.44,.007,3,5,0)
 ;;=Microsoft Word's Print Merge utility.
 ;;^DIST(.44,.007,4,0)
 ;;=^^6^6^2921106^
 ;;^DIST(.44,.007,4,1,0)
 ;;=Use the exported file as the Data File for Microsoft Word's Print Merge
 ;;^DIST(.44,.007,4,2,0)
 ;;=utility.  The Merge Field names are contained in the first line of exported
 ;;^DIST(.44,.007,4,3,0)
 ;;=data.  See the Word documentation and Descriptions of Other Names for
 ;;^DIST(.44,.007,4,4,0)
 ;;=instructions for importing into various versions of Word.
 ;;^DIST(.44,.007,4,5,0)
 ;;=(Note: Word does not allow spaces and some other punctuation in the Merge
 ;;^DIST(.44,.007,4,6,0)
 ;;=Field names.)
 ;;^DIST(.44,.007,5,0)
 ;;=^.441^3^3
 ;;^DIST(.44,.007,5,1,0)
 ;;=WORD 5.0 (MACINTOSH)
 ;;^DIST(.44,.007,5,1,1,0)
 ;;=^^7^7^2921106^
 ;;^DIST(.44,.007,5,1,1,1,0)
 ;;=To use the exported file as a Data File:
 ;;^DIST(.44,.007,5,1,1,2,0)
 ;;=1) With Main Document open, select Print Merge Helper on the View menu and
 ;;^DIST(.44,.007,5,1,1,3,0)
 ;;=choose the exported file as the Data File.
 ;;^DIST(.44,.007,5,1,1,4,0)
 ;;=2)From the Insert Field Names box on the Print Merge Helper bar, insert
 ;;^DIST(.44,.007,5,1,1,5,0)
 ;;=the field names into the Main Document.
 ;;^DIST(.44,.007,5,1,1,6,0)
 ;;=3)Select Print Merge from the File menu to merge the exported data into
 ;;^DIST(.44,.007,5,1,1,7,0)
 ;;=the Main Document.
 ;;^DIST(.44,.007,5,2,0)
 ;;=WORD 4.0 (MACINTOSH)
 ;;^DIST(.44,.007,5,2,1,0)
 ;;=^^8^8^2921106^
 ;;^DIST(.44,.007,5,2,1,1,0)
 ;;=To use the exported file as a Data file:
 ;;^DIST(.44,.007,5,2,1,2,0)
 ;;=1)Into the main document enter the Merge Instruction 'DATA' followed by
 ;;^DIST(.44,.007,5,2,1,3,0)
 ;;=the file name of your exported file surrounded by Merge Quotes.
 ;;^DIST(.44,.007,5,2,1,4,0)
 ;;=2)Enter your field names in the Main Document.  The names must match
 ;;^DIST(.44,.007,5,2,1,5,0)
 ;;=exactly those on the first line of the Data (exported) file and be
 ;;^DIST(.44,.007,5,2,1,6,0)
 ;;=surrounded by Merge Quotes (<OPTION-\> AND <OPTION-SHIFT-\>).
 ;;^DIST(.44,.007,5,2,1,7,0)
 ;;=3)Select Print Merge from the File menu to merge the data into the Main
 ;;^DIST(.44,.007,5,2,1,8,0)
 ;;=Document.
 ;;^DIST(.44,.007,5,3,0)
 ;;=WINWORD 2.0
 ;;^DIST(.44,.007,5,3,1,0)
 ;;=^^7^7^2921106^
 ;;^DIST(.44,.007,5,3,1,1,0)
 ;;=To use the exported file as the Data file:
 ;;^DIST(.44,.007,5,3,1,2,0)
 ;;=1) With the Main Document open, select Print Merge from the File menu and
 ;;^DIST(.44,.007,5,3,1,3,0)
 ;;=press Attach Data File button.  Select your exported file as the Data
 ;;^DIST(.44,.007,5,3,1,4,0)
 ;;=file.
 ;;^DIST(.44,.007,5,3,1,5,0)
 ;;=2) Use the Insert Merge Fields box to place Merge Fields in the Main
 ;;^DIST(.44,.007,5,3,1,6,0)
 ;;=Document.
 ;;^DIST(.44,.007,5,3,1,7,0)
 ;;=3) Again select Print Merge from the File menu and press the Merge button.
 ;;^DIST(.44,.007,5,"B","WINWORD 2.0",3)
 ;;=
 ;;^DIST(.44,.007,5,"B","WORD 4.0 (MACINTOSH)",2)
 ;;=
 ;;^DIST(.44,.007,5,"B","WORD 5.0 (MACINTOSH)",1)
 ;;=

DINIT27H
DINIT27H ;SFISC/DPC -FOREIGN FORMAT DELIMITED ;11/30/92  3:51 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27I S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.998,0)
 ;;=USER DEFINED (DELIMITED)^ASK^ask^^^^^0^1^^^1
 ;;^DIST(.44,.998,3,0)
 ;;=^^3^3^2921120^
 ;;^DIST(.44,.998,3,1,0)
 ;;=User will be prompted for field and record delimiters and for the maximum
 ;;^DIST(.44,.998,3,2,0)
 ;;=length of an exported record.  A field delimiter is mandatory; a record
 ;;^DIST(.44,.998,3,3,0)
 ;;=delimiter is optional.

DINIT27I
DINIT27I ;SFISC/DPC-FOREIGN FORMAT USER FIXED ;2/26/93  10:57 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27J S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.999,0)
 ;;=USER DEFINED (FIXED LENGTH)^^^^^1^^0^1^^^1
 ;;^DIST(.44,.999,3,0)
 ;;=^^2^2^2921120^
 ;;^DIST(.44,.999,3,1,0)
 ;;=The export will consist of fixed length records.  User will be prompted
 ;;^DIST(.44,.999,3,2,0)
 ;;=for the length of each field and for the maximum record length.
 ;;^DIST(.44,.999,4,0)
 ;;=^^4^4^2921120^
 ;;^DIST(.44,.999,4,1,0)
 ;;=The user-supplied maximum record length must be greater than the sum of
 ;;^DIST(.44,.999,4,2,0)
 ;;=the lengths of all the exported fields.  Date values will not be
 ;;^DIST(.44,.999,4,3,0)
 ;;=truncated; the record length must be at least 11 characters to hold the VA
 ;;^DIST(.44,.999,4,4,0)
 ;;=FileMan external form of the date.
 ;;^DIST(.44,.999,5,0)
 ;;=^.441^^

DINIT27J
DINIT27J ;SFISC/DPC-ORACLE (FIXED FORMAT) FOREIGN FORMAT ;2/26/93  10:59 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT27K S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.008,0)
 ;;=ORACLE (FIXED FORMAT)^^^^^1^1^255^1^^^1
 ;;^DIST(.44,.008,1)
 ;;=D ORACTL^DDXPLIB
 ;;^DIST(.44,.008,3,0)
 ;;=^^5^5^2930125^
 ;;^DIST(.44,.008,3,1,0)
 ;;=Use this format to export data to an Oracle table.  Data will be exported
 ;;^DIST(.44,.008,3,2,0)
 ;;=in fixed format.  The user will be prompted for the length of each field
 ;;^DIST(.44,.008,3,3,0)
 ;;=and the field name.  By default, the data will be imported into an Oracle
 ;;^DIST(.44,.008,3,4,0)
 ;;=table with the same name as the export template used to export the data.
 ;;^DIST(.44,.008,3,5,0)
 ;;=The field names should be the column_names in the Oracle table.
 ;;^DIST(.44,.008,4,0)
 ;;=^^14^14^2930125^
 ;;^DIST(.44,.008,4,1,0)
 ;;=This format produces a control file to be used with Oracle's SQL*LOADER
 ;;^DIST(.44,.008,4,2,0)
 ;;=utility to load data into a preexisting Oracle table.  The control file is
 ;;^DIST(.44,.008,4,3,0)
 ;;=complete as created, but you may edit the file to modify the import.  By
 ;;^DIST(.44,.008,4,4,0)
 ;;=default, the data will be imported into a table with the same name as that
 ;;^DIST(.44,.008,4,5,0)
 ;;=of the export template.  Spaces in the export template name will be
 ;;^DIST(.44,.008,4,6,0)
 ;;=converted to underscores (_). So, either that table must exist in your
 ;;^DIST(.44,.008,4,7,0)
 ;;=Oracle table_space with the columns specified when the export template was
 ;;^DIST(.44,.008,4,8,0)
 ;;=built or the exported file will need to be modified to show the correct
 ;;^DIST(.44,.008,4,9,0)
 ;;=table_name.  A minimum syntax for loading an export file named
 ;;^DIST(.44,.008,4,10,0)
 ;;=INTO_ORACLE.CTL would be:
 ;;^DIST(.44,.008,4,11,0)
 ;;=|TAB|
 ;;^DIST(.44,.008,4,12,0)
 ;;=       SQLLOAD USERID=username/password, CONTROL=INTO_ORACLE.CTL|TAB|
 ;;^DIST(.44,.008,4,13,0)
 ;;= 
 ;;^DIST(.44,.008,4,14,0)
 ;;=Of course, other options are available.  Consult your Oracle documentation.
 ;;^DIST(.44,.008,5,0)
 ;;=^.441^^

DINIT27K
DINIT27K ;SFISC/DPC-ORACLE (DELIMITED) FOREIGN FORMAT ;6/10/93  13:35
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT28 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DIST(.44,.009,0)
 ;;=ORACLE (DELIMITED)^,^^^^0^1^0^1^1^^1
 ;;^DIST(.44,.009,1)
 ;;=D ORACTL^DDXPLIB
 ;;^DIST(.44,.009,3,0)
 ;;=^^7^7^2930125^
 ;;^DIST(.44,.009,3,1,0)
 ;;=Use this format to export data to an Oracle table.  Data will be exported
 ;;^DIST(.44,.009,3,2,0)
 ;;=in comma-delimited format and non-numeric fields will be surrounded by
 ;;^DIST(.44,.009,3,3,0)
 ;;=quotes.  The user will be prompted for field names.  The field names
 ;;^DIST(.44,.009,3,4,0)
 ;;=should be the column_names in the Oracle table.  Also, the user will need
 ;;^DIST(.44,.009,3,5,0)
 ;;=to supply the maximum length of a record to be exported.  By default, data
 ;;^DIST(.44,.009,3,6,0)
 ;;=will be imported into a table with the same name as that of the export
 ;;^DIST(.44,.009,3,7,0)
 ;;=template.
 ;;^DIST(.44,.009,4,0)
 ;;=^^13^13^2930125^
 ;;^DIST(.44,.009,4,1,0)
 ;;=This format produces a control file to be used with Oracle's SQL*LOADER
 ;;^DIST(.44,.009,4,2,0)
 ;;=utility to load data into a preexisting Oracle table.  The control file is
 ;;^DIST(.44,.009,4,3,0)
 ;;=complete as created, but you may edit the file to modify the import.  By
 ;;^DIST(.44,.009,4,4,0)
 ;;=default, the data will be imported into a table with the same name as that
 ;;^DIST(.44,.009,4,5,0)
 ;;=of the export template.  So, either that table must exist in your Oracle
 ;;^DIST(.44,.009,4,6,0)
 ;;=table_space with the columns specified when the export template was built
 ;;^DIST(.44,.009,4,7,0)
 ;;=or the exported file will need to be modified to show the correct
 ;;^DIST(.44,.009,4,8,0)
 ;;=table_name.  A minimum syntax for loading an export file named
 ;;^DIST(.44,.009,4,9,0)
 ;;=INTO_ORACLE.CTL would be:
 ;;^DIST(.44,.009,4,10,0)
 ;;= |TAB|
 ;;^DIST(.44,.009,4,11,0)
 ;;=       SQLLOAD USERID=username/password, CONTROL=INTO_ORACLE.CTL|TAB|
 ;;^DIST(.44,.009,4,12,0)
 ;;= 
 ;;^DIST(.44,.009,4,13,0)
 ;;=Of course, other options are available.  Consult your Oracle documentation.
 ;;^DIST(.44,.009,5,0)
 ;;=^.441^^

DINIT28
DINIT28 ;SFISC/XAK-INITIALIZE VA FILEMAN ;9/9/94  14:19
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G ^DINIT285:X="" S Y=$E($T(Q+I+1),5,999),X=$E(X,4,999),@X=Y
Q Q
 ;;^DIC(1.12,0,"GL")
 ;;=^DIAR(1.12,
 ;;^DIC("B","FILEGRAM HISTORY",1.12)
 ;;=
 ;;^DIC(1.12,"%D",0)
 ;;=^^1^1^2930712^
 ;;^DIC(1.12,"%D",1,0)
 ;;=This file stores information and status of filegram activities.
 ;;^DD(1.12,0)
 ;;=FIELD^^.07^7
 ;;^DD(1.12,0,"ID",.03)
 ;;=W "   ",$P(^(0),U,3)
 ;;^DD(1.12,0,"ID",.04)
 ;;=S %I=Y,Y=$S('$D(^(0)):"",$D(^DIC(+$P(^(0),U,4),0))#2:$P(^(0),U,1),1:""),C=$P(^DD(1,.01,0),U,2) D Y^DIQ:Y]"" W "   ",Y,@("$E("_DIC_"%I,0),0)") S Y=%I K %I
 ;;^DD(1.12,0,"IX","B",1.12,.01)
 ;;=
 ;;^DD(1.12,.01,0)
 ;;=DATE/TIME^RDX^^0;1^S %DT="ETX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.12,.01,1,0)
 ;;=^.1
 ;;^DD(1.12,.01,1,1,0)
 ;;=1.12^B
 ;;^DD(1.12,.01,1,1,1)
 ;;=S ^DIAR(1.12,"B",$E(X,1,30),DA)=""
 ;;^DD(1.12,.01,1,1,2)
 ;;=K ^DIAR(1.12,"B",$E(X,1,30),DA)
 ;;^DD(1.12,.01,3)
 ;;=
 ;;^DD(1.12,.02,0)
 ;;=SENT/INSTALLED^RS^s:SENT;i:INSTALLED;u:UNSUCCESSFUL;^0;2^Q
 ;;^DD(1.12,.03,0)
 ;;=USER^RF^^0;3^K:$L(X)>30!($L(X)<1) X
 ;;^DD(1.12,.03,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(1.12,.04,0)
 ;;=FILE^P1'^DIC(^0;4^Q
 ;;^DD(1.12,.05,0)
 ;;=ENTRY NUMBER^RNJ8,0^^0;5^K:+X'=X!(X>99999999)!(X<.001)!(X?.E1"."1N.N) X
 ;;^DD(1.12,.05,3)
 ;;=Type a Number between .001 and 99999999, 0 Decimal Digits
 ;;^DD(1.12,.06,0)
 ;;=MESSAGE^P3.9'^XMB(3.9,^0;6^Q
 ;;^DD(1.12,.07,0)
 ;;=FILEGRAM^P.4'^DIPT(^0;7^Q

DINIT285
DINIT285 ;SFISC/TKW-ALTERNATE EDITOR FILE ;9/9/94  14:33
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G:X="" ^DINIT286 S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DIC("B","ALTERNATE EDITOR",1.2)
 ;;=
 ;;^DIC(1.2,"%D",0)
 ;;=^^6^6^2940908^
 ;;^DIC(1.2,"%D",1,0)
 ;;=This file stores information about the editors that can be used to edit VA
 ;;^DIC(1.2,"%D",2,0)
 ;;=FileMan WP fields. The LINE EDITOR and SCREEN EDITOR are exported with VA
 ;;^DIC(1.2,"%D",3,0)
 ;;=FileMan, but instructions are given to allow site managers to enter local
 ;;^DIC(1.2,"%D",4,0)
 ;;=editors of their choice.  There is a pointer in the NEW PERSON File to
 ;;^DIC(1.2,"%D",5,0)
 ;;=this file.  The pointed-to editor for that person is then used whenever
 ;;^DIC(1.2,"%D",6,0)
 ;;=the person edits a WP field.
 ;;^DD(1.2,0)
 ;;=FIELD^NL^7^5
 ;;^DD(1.2,0,"IX","B",1.2,.01)
 ;;=
 ;;^DD(1.2,0,"NM","ALTERNATE EDITOR")
 ;;=
 ;;^DD(1.2,0,"PT",200,31.3)
 ;;=
 ;;^DD(1.2,.01,0)
 ;;=NAME^RFX^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X I $D(X) S %=$O(^DIST(1.2,"B",$E(X))) I $E(%)=$E(X) K X
 ;;^DD(1.2,.01,1,0)
 ;;=^.1
 ;;^DD(1.2,.01,1,1,0)
 ;;=1.2^B
 ;;^DD(1.2,.01,1,1,1)
 ;;=S ^DIST(1.2,"B",$E(X,1,30),DA)=""
 ;;^DD(1.2,.01,1,1,2)
 ;;=K ^DIST(1.2,"B",$E(X,1,30),DA)
 ;;^DD(1.2,.01,3)
 ;;=NAME MUST BE 3-30 CHAR., and start with a unique alpha char.
 ;;^DD(1.2,.01,21,0)
 ;;=2^^2^2^2920506^^^
 ;;^DD(1.2,.01,21,1,0)
 ;;=This is the name of the alternate editor. It must start with a unique
 ;;^DD(1.2,.01,21,2,0)
 ;;=character.
 ;;^DD(1.2,.01,"DT")
 ;;=2901212
 ;;^DD(1.2,1,0)
 ;;=ACTIVATION CODE FROM DIWE^RK^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.2,1,3)
 ;;=This is Standard MUMPS code, used to set up the environment for editing a Standard FileMan word-processing field using this editor.
 ;;^DD(1.2,1,9)
 ;;=@
 ;;^DD(1.2,1,21,0)
 ;;=^^17^17^2920513^^^^
 ;;^DD(1.2,1,21,1,0)
 ;;=This field holds the MUMPS code to properly establish the environment
 ;;^DD(1.2,1,21,2,0)
 ;;=that will allow use of this editor to edit any VA FileMan word-processing
 ;;^DD(1.2,1,21,3,0)
 ;;=type field.  Typically this code might move the text into another
 ;;^DD(1.2,1,21,4,0)
 ;;=MUMPS global (like ^UTILITY) or to some other file format for editing.
 ;;^DD(1.2,1,21,5,0)
 ;;=If the editor is written in MUMPS, it should either use variables that
 ;;^DD(1.2,1,21,6,0)
 ;;=do not begin with the letter "D", or should NEW all its local variables
 ;;^DD(1.2,1,21,7,0)
 ;;=to avoid problems on return to the FileMan editor.
 ;;^DD(1.2,1,21,8,0)
 ;;=
 ;;^DD(1.2,1,21,9,0)
 ;;=If the variable DIWE(1) is defined, it indicated that the user
 ;;^DD(1.2,1,21,10,0)
 ;;=has switched to this editor from the standard FileMan Line Editor, and
 ;;^DD(1.2,1,21,11,0)
 ;;=upon return, the control will be returned to the line editor.
 ;;^DD(1.2,1,21,12,0)
 ;;=
 ;;^DD(1.2,1,21,13,0)
 ;;=This editor may set the variable DIWESW to 1, if they wish to allow
 ;;^DD(1.2,1,21,14,0)
 ;;=the user to switch to an alternate editor from this one.
 ;;^DD(1.2,1,21,15,0)
 ;;=
 ;;^DD(1.2,1,21,16,0)
 ;;=This editor is required to restore the edited text to standard FileMan
 ;;^DD(1.2,1,21,17,0)
 ;;=word-processing format before exiting.
 ;;^DD(1.2,1,"DT")
 ;;=2900202
 ;;^DD(1.2,2,0)
 ;;=OK TO RUN TEST^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.2,2,3)
 ;;=This is Standard MUMPS code that sets $T to true if it is OK to use this editor.
 ;;^DD(1.2,2,9)
 ;;=@
 ;;^DD(1.2,2,21,0)
 ;;=^^9^9^2920513^^^^
 ;;^DD(1.2,2,21,1,0)
 ;;=This field holds MUMPS code used to pre-check the environment before
 ;;^DD(1.2,2,21,2,0)
 ;;=allowing the user to enter this editor.  This field should set the
 ;;^DD(1.2,2,21,3,0)
 ;;=$TEST indicator.  If $TEST is true then it is OK for this editor to
 ;;^DD(1.2,2,21,4,0)
 ;;=run at this time.  If $T is false, the user will be returned to the
 ;;^DD(1.2,2,21,5,0)
 ;;=FileMan line editor.
 ;;^DD(1.2,2,21,6,0)
 ;;=
 ;;^DD(1.2,2,21,7,0)
 ;;=If the field is null, it will be the same as $T=true

DINIT286
DINIT286 ;SFISC/TKW-ALTERNATE EDITOR FILE ;5/27/92  1:56 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) G:X="" ^DINIT287 S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^DD(1.2,2,21,8,0)
 ;;=
 ;;^DD(1.2,2,21,9,0)
 ;;=An example would be a mixed VAX-PDP site using a VMS editor.
 ;;^DD(1.2,2,"DT")
 ;;=2900202
 ;;^DD(1.2,3,0)
 ;;=RETURN TO CALLING EDITOR^K^^3;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.2,3,3)
 ;;=This is Standard MUMPS code used to restore the environment needed by the VA FileMan line editor.
 ;;^DD(1.2,3,9)
 ;;=@
 ;;^DD(1.2,3,21,0)
 ;;=^^3^3^2920513^^^^
 ;;^DD(1.2,3,21,1,0)
 ;;=If the user switched to this editor from the FileMan line editor, then
 ;;^DD(1.2,3,21,2,0)
 ;;=DIWE(1) exists.  This field should contain MUMPS code used to reset
 ;;^DD(1.2,3,21,3,0)
 ;;=the environment needed by the Line Editor.
 ;;^DD(1.2,3,"DT")
 ;;=2900202
 ;;^DD(1.2,7,0)
 ;;=DESCRIPTION^1.207^^7;0
 ;;^DD(1.2,7,21,0)
 ;;=^^3^3^2920506^^^^
 ;;^DD(1.2,7,21,1,0)
 ;;=This is a description of the editor that will be shown to the user
 ;;^DD(1.2,7,21,2,0)
 ;;=if they enter ??? at the Select prompt.
 ;;^DD(1.2,7,21,3,0)
 ;;=Not in use yet.
 ;;^DD(1.207,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(1.207,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(1.207,0,"UP")
 ;;=1.2
 ;;^DD(1.207,.01,0)
 ;;=DESCRIPTION^WL^^0;1^Q
 ;;^DD(1.207,.01,"DT")
 ;;=2900202

DINIT287
DINIT287 ;SFISC/MLH-ALTERNATE EDITOR FILE ;5/27/92  2:27 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT290
Q Q
 ;;^DIST(1.2,0)
 ;;=ALTERNATE EDITOR^1.2^9^8
 ;;^DIST(1.2,1,0)
 ;;=LINE EDITOR - VA FILEMAN
 ;;^DIST(1.2,1,1)
 ;;=G GO^DIWE
 ;;^DIST(1.2,2,0)
 ;;=SCREEN EDITOR - VA FILEMAN
 ;;^DIST(1.2,2,1)
 ;;=D ^DDW
 ;;^DIST(1.2,2,7,0)
 ;;=^^2^2^2901212^^^
 ;;^DIST(1.2,2,7,1,0)
 ;;=
 ;;^DIST(1.2,2,7,2,0)
 ;;=The standard VA FileMan full-screen text editor.

DINIT290
DINIT290 ;SFISC/MKO-FORM AND BLOCK FILES ;07:10 PM  5 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT291
Q Q
 ;;^DIC(.403,0,"GL")
 ;;=^DIST(.403,
 ;;^DIC("B","FORM",.403)
 ;;=
 ;;^DIC(.403,"%D",0)
 ;;=^^3^3^2940914^
 ;;^DIC(.403,"%D",1,0)
 ;;=This file stores ScreenMan forms, which are composed of blocks.  The
 ;;^DIC(.403,"%D",2,0)
 ;;=form's attributes that describe how information is presented on the screen
 ;;^DIC(.403,"%D",3,0)
 ;;=are contained in this file.
 ;;^DD(.403,0)
 ;;=FIELD^^40^18
 ;;^DD(.403,0,"DT")
 ;;=2941018
 ;;^DD(.403,0,"ID","WRITE")
 ;;=N D,D1,D2 S D2=^(0) S:$X>30 D1(1,"F")="!" S D=$P(D2,U,5) S:D D1(2)="("_$$DATE^DIUTL(D)_")",D1(2,"F")="?30" S D=$P(D2,U,4) S:D D1(3)="User #"_D,D1(3,"F")="?50" S D=$P(D2,U,8) S:D D1(4)=" File #"_D,D1(4,"F")="?59" D EN^DDIOL(.D1)
 ;;^DD(.403,0,"ID","WRITED")
 ;;=I $G(DZ)?1"???".E N D S D=0 F  S D=$O(^DIST(.403,Y,15,D)) Q:D'>0  I $D(^(D,0))#2 D EN^DDIOL(^(0),"","!?5")
 ;;^DD(.403,0,"IX","AB",.4032,.01)
 ;;=
 ;;^DD(.403,0,"IX","AC",.4031,1)
 ;;=
 ;;^DD(.403,0,"IX","AY",.403,.01)
 ;;=
 ;;^DD(.403,0,"IX","B",.403,.01)
 ;;=
 ;;^DD(.403,0,"IX","C",.403,6)
 ;;=
 ;;^DD(.403,0,"IX","F",.403,7)
 ;;=
 ;;^DD(.403,0,"IX","F1",.403,.01)
 ;;=
 ;;^DD(.403,0,"NM","FORM")
 ;;=
 ;;^DD(.403,.01,0)
 ;;=NAME^RFX^^0;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>30!($L(X)<3)!'(X'?1P.E)!(X=+$P(X,"E")) X
 ;;^DD(.403,.01,1,0)
 ;;=^.1
 ;;^DD(.403,.01,1,1,0)
 ;;=.403^B
 ;;^DD(.403,.01,1,1,1)
 ;;=S ^DIST(.403,"B",$E(X,1,30),DA)=""
 ;;^DD(.403,.01,1,1,2)
 ;;=K ^DIST(.403,"B",$E(X,1,30),DA)
 ;;^DD(.403,.01,1,2,0)
 ;;=.403^F1^MUMPS
 ;;^DD(.403,.01,1,2,1)
 ;;=X "S %=$P("_DIC_"DA,0),U,8) S:$L(%) "_DIC_"""F""_%,X,DA)=1"
 ;;^DD(.403,.01,1,2,2)
 ;;=X "S %=$P("_DIC_"DA,0),U,8) K:$L(%) "_DIC_"""F""_%,X,DA)"
 ;;^DD(.403,.01,1,2,3)
 ;;=Programmer only
 ;;^DD(.403,.01,1,2,"%D",0)
 ;;=^^6^6^2910812^
 ;;^DD(.403,.01,1,2,"%D",1,0)
 ;;=This cross-reference is used to quickly find all ScreenMan templates
 ;;^DD(.403,.01,1,2,"%D",2,0)
 ;;=associated with a file.  It has the form:
 ;;^DD(.403,.01,1,2,"%D",3,0)
 ;;=
 ;;^DD(.403,.01,1,2,"%D",4,0)
 ;;=  ^DIST(.403,"F"_file#,"formname",DA)=1
 ;;^DD(.403,.01,1,2,"%D",5,0)
 ;;=
 ;;^DD(.403,.01,1,2,"%D",6,0)
 ;;=A comparable cross-reference also exists on the PRIMARY FILE field.
 ;;^DD(.403,.01,1,2,"DT")
 ;;=2910812
 ;;^DD(.403,.01,1,3,0)
 ;;=.403^AY^MUMPS
 ;;^DD(.403,.01,1,3,1)
 ;;=Q
 ;;^DD(.403,.01,1,3,2)
 ;;=Q
 ;;^DD(.403,.01,1,3,3)
 ;;=Programmer only
 ;;^DD(.403,.01,1,3,"%D",0)
 ;;=^^7^7^2980924^
 ;;^DD(.403,.01,1,3,"%D",1,0)
 ;;=This is a no-op cross reference defined merely to document the data stored
 ;;^DD(.403,.01,1,3,"%D",2,0)
 ;;=under ^DIST(.403,form IEN,"AY").
 ;;^DD(.403,.01,1,3,"%D",3,0)
 ;;= 
 ;;^DD(.403,.01,1,3,"%D",4,0)
 ;;=This global stores the compiled data for a Form. Form compilation occurs
 ;;^DD(.403,.01,1,3,"%D",5,0)
 ;;=automatically whenever a Form is edited through the FileMan supplied
 ;;^DD(.403,.01,1,3,"%D",6,0)
 ;;=options. The compiled data stored in this global is static information
 ;;^DD(.403,.01,1,3,"%D",7,0)
 ;;=that is used whenever a Form is run.
 ;;^DD(.403,.01,1,3,"DT")
 ;;=2980904
 ;;^DD(.403,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(.403,.01,21,0)
 ;;=^^3^3^2940906^
 ;;^DD(.403,.01,21,1,0)
 ;;=Enter the name of the form, 3-30 characters in length.  The form name
 ;;^DD(.403,.01,21,2,0)
 ;;=must be unique and cannot be numeric or start with a punctuation
 ;;^DD(.403,.01,21,3,0)
 ;;=character.  It should also be namespaced.
 ;;^DD(.403,.01,"DEL",1,0)
 ;;=D EN^DDIOL($C(7)_"You must use the FileMan option to delete forms.") I 1
 ;;^DD(.403,.01,"DT")
 ;;=2980904
 ;;^DD(.403,1,0)
 ;;=READ ACCESS^FX^^0;2^I DUZ(0)'="@" N DDZ F DDZ=1:1:$L(X) K:DUZ(0)'[$E(X,DDZ) X
 ;;^DD(.403,1,3)
 ;;=Enter VA FileMan access code(s) which control access to the form.
 ;;^DD(.403,1,21,0)
 ;;=^^1^1^2931020^^
 ;;^DD(.403,1,21,1,0)
 ;;=Non-programmers can enter only their own VA FileMan access code(s).
 ;;^DD(.403,1,"DT")
 ;;=2931020
 ;;^DD(.403,2,0)
 ;;=WRITE ACCESS^FX^^0;3^I DUZ(0)'="@" N DDZ F DDZ=1:1:$L(X) K:DUZ(0)'[$E(X,DDZ) X
 ;;^DD(.403,2,3)
 ;;=Enter VA FileMan access code(s) which control access to the form.
 ;;^DD(.403,2,21,0)
 ;;=^^1^1^2931020^
 ;;^DD(.403,2,21,1,0)
 ;;=Non-programmers can enter only their own VA FileMan access code(s).
 ;;^DD(.403,2,"DT")
 ;;=2931020
 ;;^DD(.403,3,0)
 ;;=CREATOR^NJ3,0X^^0;4^K:X'?.N X
 ;;^DD(.403,3,3)
 ;;=Enter the VA FileMan User Number of the form creator.
 ;;^DD(.403,3,21,0)
 ;;=^^2^2^2931020^^
 ;;^DD(.403,3,21,1,0)
 ;;=This is the DUZ of the person who created the form.  The ScreenMan
 ;;^DD(.403,3,21,2,0)
 ;;=options to create the form automatically put a value into this field.
 ;;^DD(.403,4,0)
 ;;=DATE CREATED^D^^0;5^S %DT="ETX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.403,4,3)
 ;;=Enter the date the form was created.
 ;;^DD(.403,4,21,0)
 ;;=^^2^2^2941018^^
 ;;^DD(.403,4,21,1,0)
 ;;=This is the date the form was created.  The ScreenMan options to create
 ;;^DD(.403,4,21,2,0)
 ;;=the form automatically put a value into this field.
 ;;^DD(.403,4,"DT")
 ;;=2941018
 ;;^DD(.403,5,0)
 ;;=DATE LAST USED^D^^0;6^S %DT="ETX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.403,5,3)
 ;;=Enter the date and time the form was last used.
 ;;^DD(.403,5,21,0)
 ;;=^^2^2^2941018^^
 ;;^DD(.403,5,21,1,0)
 ;;=This is the date the form was last used.  ScreenMan automatically
 ;;^DD(.403,5,21,2,0)
 ;;=puts a value into this field when the form is invoked.
 ;;^DD(.403,5,"DT")
 ;;=2941018
 ;;^DD(.403,6,0)
 ;;=TITLE^F^^0;7^K:$L(X)>50!($L(X)<1) X
 ;;^DD(.403,6,1,0)
 ;;=^.1
 ;;^DD(.403,6,1,1,0)
 ;;=.403^C
 ;;^DD(.403,6,1,1,1)
 ;;=S ^DIST(.403,"C",$E(X,1,30),DA)=""
 ;;^DD(.403,6,1,1,2)
 ;;=K ^DIST(.403,"C",$E(X,1,30),DA)
 ;;^DD(.403,6,1,1,"DT")
 ;;=2940908
 ;;^DD(.403,6,3)
 ;;=Answer must be 1-50 characters in length.
 ;;^DD(.403,6,21,0)
 ;;=^^4^4^2940908^
 ;;^DD(.403,6,21,1,0)
 ;;=The TITLE property can be used by the form designer to help identify a
 ;;^DD(.403,6,21,2,0)
 ;;=form.  It is cross referenced and need not be unique.  ScreenMan does not
 ;;^DD(.403,6,21,3,0)
 ;;=automatically display the TITLE to the user, but the form designer can
 ;;^DD(.403,6,21,4,0)
 ;;=choose to define a caption-only field that displays the title to the user.
 ;;^DD(.403,6,22)
 ;;=
 ;;^DD(.403,6,"DT")
 ;;=2940908
 ;;^DD(.403,7,0)
 ;;=PRIMARY FILE^RFX^^0;8^K:X'=+$P(X,"E")!(X<2)!($L(X)>16)!'$D(^DIC(X)) X
 ;;^DD(.403,7,1,0)
 ;;=^.1
 ;;^DD(.403,7,1,1,0)
 ;;=.403^F^MUMPS
 ;;^DD(.403,7,1,1,1)
 ;;=X "S %=$P("_DIC_"DA,0),U) S "_DIC_"""F""_X,%,DA)=1"
 ;;^DD(.403,7,1,1,2)
 ;;=X "S %=$P("_DIC_"DA,0),U) K "_DIC_"""F""_X,%,DA)"

DINIT291
DINIT291 ;SFISC/MKO-FORM AND BLOCK FILES ;7APR2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT292
Q Q
 ;;^DD(.403,7,1,1,3)
 ;;=Programmer only
 ;;^DD(.403,7,1,1,"%D",0)
 ;;=^^2^2^2900911^
 ;;^DD(.403,7,1,1,"%D",0,"LE")
 ;;=1
 ;;^DD(.403,7,1,1,"%D",1,0)
 ;;=This cross-reference is used to quickly find all ScreenMan templates
 ;;^DD(.403,7,1,1,"%D",2,0)
 ;;=associated with a file.
 ;;^DD(.403,7,1,1,"DT")
 ;;=2900911
 ;;^DD(.403,7,3)
 ;;=Answer must be 1-16 characters in length.
 ;;^DD(.403,7,21,0)
 ;;=^^2^2^2920407^
 ;;^DD(.403,7,21,1,0)
 ;;=Enter a file number, greater than or equal to 2, which represents the data
 ;;^DD(.403,7,21,2,0)
 ;;=dictionary number of the primary file for this form.
 ;;^DD(.403,7,"DT")
 ;;=2920407
 ;;^DD(.403,8,0)
 ;;=DISPLAY ONLY^SI^0:NO;1:YES;^0;9^Q
 ;;^DD(.403,8,21,0)
 ;;=^^2^2^2931027^^^^
 ;;^DD(.403,8,21,1,0)
 ;;=This is a flag that indicates none of the blocks on the form are edit
 ;;^DD(.403,8,21,2,0)
 ;;=blocks.  This flag is set during form compilation.
 ;;^DD(.403,8,"DT")
 ;;=2931028
 ;;^DD(.403,9,0)
 ;;=FORM ONLY^SI^0:NO;1:YES;^0;10^Q
 ;;^DD(.403,9,21,0)
 ;;=^^2^2^2931027^
 ;;^DD(.403,9,21,1,0)
 ;;=This is a flag that indicates none of the fields on the form are data
 ;;^DD(.403,9,21,2,0)
 ;;=dictionary fields.  This flag is set during form compilation.
 ;;^DD(.403,9,"DT")
 ;;=2931028
 ;;^DD(.403,10,0)
 ;;=COMPILED^SI^0:NO;1:YES;^0;11^Q
 ;;^DD(.403,10,1,0)
 ;;=^.1^^0
 ;;^DD(.403,10,21,0)
 ;;=^^2^2^2940908^
 ;;^DD(.403,10,21,1,0)
 ;;=This is a flag that indicates that the form is compiled.  This flag is
 ;;^DD(.403,10,21,2,0)
 ;;=set during form compilation.
 ;;^DD(.403,10,"DT")
 ;;=2940701
 ;;^DD(.403,11,0)
 ;;=PRE ACTION^K^^11;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.403,11,3)
 ;;=Enter standard MUMPS code which will be executed at the beginning of the form.
 ;;^DD(.403,11,9)
 ;;=@
 ;;^DD(.403,11,21,0)
 ;;=^^2^2^2940906^
 ;;^DD(.403,11,21,1,0)
 ;;=This is MUMPS code that is executed when the form is first invoked,
 ;;^DD(.403,11,21,2,0)
 ;;=before any of the pages are loaded and displayed.
 ;;^DD(.403,12,0)
 ;;=POST ACTION^K^^12;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.403,12,3)
 ;;=Enter standard MUMPS code which will be executed at the end of the form.
 ;;^DD(.403,12,9)
 ;;=@
 ;;^DD(.403,12,21,0)
 ;;=^^2^2^2940906^^
 ;;^DD(.403,12,21,1,0)
 ;;=This is MUMPS code that is executed before ScreenMan returns to the
 ;;^DD(.403,12,21,2,0)
 ;;=calling application.
 ;;^DD(.403,14,0)
 ;;=POST SAVE^K^^14;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.403,14,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.403,14,9)
 ;;=@
 ;;^DD(.403,14,21,0)
 ;;=^^2^2^2940906^
 ;;^DD(.403,14,21,1,0)
 ;;=This is MUMPS code that is executed when the user saves changes.  It is 
 ;;^DD(.403,14,21,2,0)
 ;;=executed only if all data is valid, and after all data has been filed.
 ;;^DD(.403,14,"DT")
 ;;=2930813
 ;;^DD(.403,15,0)
 ;;=DESCRIPTION^.40315^^15;0
 ;;^DD(.403,20,0)
 ;;=DATA VALIDATION^K^^20;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.403,20,3)
 ;;=Enter standard MUMPS code.
 ;;^DD(.403,20,9)
 ;;=@
 ;;^DD(.403,20,21,0)
 ;;=^^8^8^2940906^
 ;;^DD(.403,20,21,1,0)
 ;;=This is MUMPS code that is executed when the user attempts to save changes
 ;;^DD(.403,20,21,2,0)
 ;;=to the form.  If the code sets DDSERROR, the user is unable to save
 ;;^DD(.403,20,21,3,0)
 ;;=changes.  If the code sets DDSBR, the user is taken to the specified
 ;;^DD(.403,20,21,4,0)
 ;;=field.
 ;;^DD(.403,20,21,5,0)
 ;;= 
 ;;^DD(.403,20,21,6,0)
 ;;=In addition to $$GET^DDSVAL, PUT^DDSVAL, and HLP^DDSUTL, you 
 ;;^DD(.403,20,21,7,0)
 ;;=can use MSG^DDSUTL to print on a separate screen messages to the user 
 ;;^DD(.403,20,21,8,0)
 ;;=about the validity of the data.
 ;;^DD(.403,21,0)
 ;;=RECORD SELECTION PAGE^NJ5,1^^21;1^K:+X'=X!(X>999.9)!(X<1)!(X?.E1"."2N.N) X
 ;;^DD(.403,21,3)
 ;;=Type a Number between 1 and 999.9, 1 Decimal Digit
 ;;^DD(.403,21,21,0)
 ;;=^^12^12^2940906^
 ;;^DD(.403,21,21,1,0)
 ;;=Enter the page number of the page that is used for record selection.
 ;;^DD(.403,21,21,2,0)
 ;;= 
 ;;^DD(.403,21,21,3,0)
 ;;=If you define a Record Selection Page, the user can select another entry
 ;;^DD(.403,21,21,4,0)
 ;;=in the file, and, if LAYGO is allowed, add another entry into the file
 ;;^DD(.403,21,21,5,0)
 ;;=without exiting the form.  The Record Selection Page should be a pop-up
 ;;^DD(.403,21,21,6,0)
 ;;=page that contains one form-only field that performs a pointer-type read
 ;;^DD(.403,21,21,7,0)
 ;;=into the Primary File of the form.  The Record Selection Page property
 ;;^DD(.403,21,21,8,0)
 ;;=should be set equal to the Page Number of the Record Selection Page.
 ;;^DD(.403,21,21,9,0)
 ;;=
 ;;^DD(.403,21,21,10,0)
 ;;=The user can open the Record Selection Page by pressing <F1>L.  After the
 ;;^DD(.403,21,21,11,0)
 ;;=user selects a record and closes the Record Selection Page, the data for
 ;;^DD(.403,21,21,12,0)
 ;;=the selected record is displayed.
 ;;^DD(.403,40,0)
 ;;=PAGE^.4031I^^40;0
 ;;^DD(.403,21400,0)
 ;;=BUILD(S)^Cmp9.6^^ ; ^N DISNAME,D S DISNAME=$P($G(^DIST(.403,D0,0)),U)_"    FILE #"_$P($G(^(0)),U,8) F D=0:0 S D=$O(^XPD(9.6,D)) Q:'D  I $D(^(D,"KRN",.403,"NM","B",DISNAME)) N D0 S D0=D,X=$P(^XPD(9.6,D,0),U) X DICMX Q:'$D(D)
 ;;^DD(.4031,0)
 ;;=PAGE SUB-FIELD^^40^13
 ;;^DD(.4031,0,"DT")
 ;;=2940506
 ;;^DD(.4031,0,"ID","WRITE")
 ;;=D:$D(^(1))#2 EN^DDIOL($P(^(1),U),"","?12")
 ;;^DD(.4031,0,"IX","AC",.4031,5)
 ;;=
 ;;^DD(.4031,0,"IX","B",.4031,.01)
 ;;=
 ;;^DD(.4031,0,"IX","C",.4031,7)
 ;;=
 ;;^DD(.4031,0,"NM","PAGE")
 ;;=
 ;;^DD(.4031,0,"UP")
 ;;=.403
 ;;^DD(.4031,.01,0)
 ;;=PAGE NUMBER^MNJ5,1X^^0;1^K:+X'=X!(X>999.9)!(X<1)!(X?.E1"."2N.N)!$D(^DIST(.403,DA(1),40,"B",X)) X
 ;;^DD(.4031,.01,1,0)
 ;;=^.1
 ;;^DD(.4031,.01,1,1,0)
 ;;=.4031^B
 ;;^DD(.4031,.01,1,1,1)
 ;;=S ^DIST(.403,DA(1),40,"B",$E(X,1,30),DA)=""
 ;;^DD(.4031,.01,1,1,2)
 ;;=K ^DIST(.403,DA(1),40,"B",$E(X,1,30),DA)
 ;;^DD(.4031,.01,3)
 ;;=Enter a number between 1 and 999.9, up to 1 Decimal Digit, that identifies the page.
 ;;^DD(.4031,.01,21,0)
 ;;=^^2^2^2940907^^^
 ;;^DD(.4031,.01,21,1,0)
 ;;=This is the unique page number of the page.  You can use this number to
 ;;^DD(.4031,.01,21,2,0)
 ;;=refer to the page in ScreenMan functions and utilities.
 ;;^DD(.4031,1,0)
 ;;=HEADER BLOCK^P.404^DIST(.404,^0;2^Q
 ;;^DD(.4031,1,1,0)
 ;;=^.1
 ;;^DD(.4031,1,1,1,0)
 ;;=.403^AC
 ;;^DD(.4031,1,1,1,1)
 ;;=S ^DIST(.403,"AC",$E(X,1,30),DA(1),DA)=""
 ;;^DD(.4031,1,1,1,2)
 ;;=K ^DIST(.403,"AC",$E(X,1,30),DA(1),DA)
 ;;^DD(.4031,1,1,1,"DT")
 ;;=2930702
 ;;^DD(.4031,1,3)
 ;;=Enter the block which will be used as a header for this page.
 ;;^DD(.4031,1,21,0)
 ;;=^^7^7^2940907^^^
 ;;^DD(.4031,1,21,1,0)
 ;;=The header block always appears at row 1, column 1 relative to the page
 ;;^DD(.4031,1,21,2,0)
 ;;=on which it is defined.  It is for display purposes only -- the user

DINIT292
DINIT292 ;SFISC/MKO-FORM AND BLOCK FILES ;11:00 AM  13 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT293
Q Q
 ;;^DD(.4031,1,21,3,0)
 ;;=is unable to navigate to any of the fields on the header block.
 ;;^DD(.4031,1,21,4,0)
 ;;= 
 ;;^DD(.4031,1,21,5,0)
 ;;=Starting with Version 21 of FileMan, there is no need to use header
 ;;^DD(.4031,1,21,6,0)
 ;;=blocks.  Display-type blocks, with a coordinate of '1,1' relative to the
 ;;^DD(.4031,1,21,7,0)
 ;;=page, provide the same functionality as header blocks.
 ;;^DD(.4031,1,"DT")
 ;;=2930702
 ;;^DD(.4031,2,0)
 ;;=PAGE COORDINATE^F^^0;3^K:$L(X)>7!($L(X)<1)!'(X?.N1",".N) X
 ;;^DD(.4031,2,3)
 ;;=Enter the coordinate of the upper left corner of the page.  Answer must be two positive integers separated by a comma (,), as follows:  'Upper left row,Upper left column'.
 ;;^DD(.4031,2,21,0)
 ;;=^^13^13^2940908^
 ;;^DD(.4031,2,21,1,0)
 ;;=The Page Coordinate property defines the location of the top left corner
 ;;^DD(.4031,2,21,2,0)
 ;;=of the page on the screen.  The format of a coordinate is:  Row,Column.
 ;;^DD(.4031,2,21,3,0)
 ;;=Regular pages normally have a Page Coordinate of  "1,1".  They do not have
 ;;^DD(.4031,2,21,4,0)
 ;;=a Lower Right Coordinate.
 ;;^DD(.4031,2,21,5,0)
 ;;= 
 ;;^DD(.4031,2,21,6,0)
 ;;=The Page Coordinate of pop-up pages defines the position of the top left
 ;;^DD(.4031,2,21,7,0)
 ;;=corner of the border of the pop-up page.  Pop-up pages must have a Lower
 ;;^DD(.4031,2,21,8,0)
 ;;=Right Coordinate, which defines the position of the bottom right corner of
 ;;^DD(.4031,2,21,9,0)
 ;;=the border of the pop-up page.
 ;;^DD(.4031,2,21,10,0)
 ;;= 
 ;;^DD(.4031,2,21,11,0)
 ;;=All blocks on the page are positioned relative to the page on which they
 ;;^DD(.4031,2,21,12,0)
 ;;=are defined.  If a page is moved -- that is, if the Page Coordinate is
 ;;^DD(.4031,2,21,13,0)
 ;;=changed -- all blocks and all fields on that page move with it.
 ;;^DD(.4031,2,"DT")
 ;;=2940908
 ;;^DD(.4031,3,0)
 ;;=NEXT PAGE^NJ5,1^^0;4^K:+X'=X!(X>999.9)!(X<1)!(X?.E1"."2N.N) X
 ;;^DD(.4031,3,3)
 ;;=Answer must be a Number between 1 and 999.9, 1 Decimal Digit.
 ;;^DD(.4031,3,21,0)
 ;;=^^9^9^2940908^
 ;;^DD(.4031,3,21,1,0)
 ;;=Enter the page to go to when the user presses <F1><Down> or selects the
 ;;^DD(.4031,3,21,2,0)
 ;;=NEXT PAGE command from the Command Line.
 ;;^DD(.4031,3,21,3,0)
 ;;= 
 ;;^DD(.4031,3,21,4,0)
 ;;=When the user attempts a Save, ScreenMan follows the Next Page links
 ;;^DD(.4031,3,21,5,0)
 ;;=starting with the first page displayed to the user.  ScreenMan loads all
 ;;^DD(.4031,3,21,6,0)
 ;;=those pages, including any defaults, and checks that all required fields
 ;;^DD(.4031,3,21,7,0)
 ;;=have values.  If any of the required fields have null values, no Save
 ;;^DD(.4031,3,21,8,0)
 ;;=occurs.  If all required field have values, Screenman Saves the data,
 ;;^DD(.4031,3,21,9,0)
 ;;=including all defaults.
 ;;^DD(.4031,4,0)
 ;;=PREVIOUS PAGE^NJ5,1^^0;5^K:+X'=X!(X>999.9)!(X<1)!(X?.E1"."2N.N) X
 ;;^DD(.4031,4,3)
 ;;=Answer must be a Number between 1 and 999.9, 1 Decimal Digit.
 ;;^DD(.4031,4,21,0)
 ;;=^^1^1^2940907^
 ;;^DD(.4031,4,21,1,0)
 ;;=Enter the page to go to when the user presses <F1><Up>.
 ;;^DD(.4031,5,0)
 ;;=IS THIS A POP UP PAGE?^S^0:NO;1:YES;^0;6^Q
 ;;^DD(.4031,5,1,0)
 ;;=^.1
 ;;^DD(.4031,5,1,1,0)
 ;;=.4031^AC^MUMPS
 ;;^DD(.4031,5,1,1,1)
 ;;=S:X $P(^DIST(.403,DA(1),40,DA,0),U,2)=""
 ;;^DD(.4031,5,1,1,2)
 ;;=Q
 ;;^DD(.4031,5,1,1,3)
 ;;=Programmer only
 ;;^DD(.4031,5,1,1,"%D",0)
 ;;=^^1^1^2940627^
 ;;^DD(.4031,5,1,1,"%D",1,0)
 ;;=If this is a pop up page, there can be no header block.
 ;;^DD(.4031,5,1,1,"DT")
 ;;=2940627
 ;;^DD(.4031,5,3)
 ;;=
 ;;^DD(.4031,5,21,0)
 ;;=^^8^8^2940908^
 ;;^DD(.4031,5,21,1,0)
 ;;=If the page is a pop-up page rather than a regular page, set this property
 ;;^DD(.4031,5,21,2,0)
 ;;=to 'YES'.
 ;;^DD(.4031,5,21,3,0)
 ;;= 
 ;;^DD(.4031,5,21,4,0)
 ;;=ScreenMan displays pop-up pages with a border, on top of what is
 ;;^DD(.4031,5,21,5,0)
 ;;=already on the screen.  The top left coordinate of the pop-up page
 ;;^DD(.4031,5,21,6,0)
 ;;=defines the location of the top left corner of the border.  Pop-up
 ;;^DD(.4031,5,21,7,0)
 ;;=pages must also have a lower right coordinate, which defines the location
 ;;^DD(.4031,5,21,8,0)
 ;;=of the bottom left corner of the border.
 ;;^DD(.4031,5,"DT")
 ;;=2940627
 ;;^DD(.4031,6,0)
 ;;=LOWER RIGHT COORDINATE^F^^0;7^K:$L(X)>7!($L(X)<1)!'(X?.N1",".N) X
 ;;^DD(.4031,6,3)
 ;;=Enter the coordinate of the bottom right corner of the pop up page.  Answer must be two positive integers separated by a comma (,), as follows:  'Lower right row,Lower right column'.
 ;;^DD(.4031,6,21,0)
 ;;=^^4^4^2940908^
 ;;^DD(.4031,6,21,1,0)
 ;;=The existence of a lower right coordinate implies that the page is a
 ;;^DD(.4031,6,21,2,0)
 ;;=pop-up page.  The lower right coordinate and the page coordinate define
 ;;^DD(.4031,6,21,3,0)
 ;;=the position of the border ScreenMan displays when it paints a pop-up
 ;;^DD(.4031,6,21,4,0)
 ;;=page.
 ;;^DD(.4031,6,"DT")
 ;;=2940908
 ;;^DD(.4031,7,0)
 ;;=PAGE NAME^FX^^1;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>30!($L(X)<3)!(X=+$P(X,"E")) X
 ;;^DD(.4031,7,1,0)
 ;;=^.1
 ;;^DD(.4031,7,1,1,0)
 ;;=.4031^C^MUMPS
 ;;^DD(.4031,7,1,1,1)
 ;;=S ^DIST(.403,DA(1),40,"C",$$UP^DILIBF(X),DA)=""
 ;;^DD(.4031,7,1,1,2)
 ;;=K ^DIST(.403,DA(1),40,"C",$$UP^DILIBF(X),DA)
 ;;^DD(.4031,7,1,1,3)
 ;;=Programmer only
 ;;^DD(.4031,7,1,1,"%D",0)
 ;;=^^2^2^2930816^
 ;;^DD(.4031,7,1,1,"%D",1,0)
 ;;=This cross reference is a regular index of the page name converted to all
 ;;^DD(.4031,7,1,1,"%D",2,0)
 ;;=upper case characters.
 ;;^DD(.4031,7,1,1,"DT")
 ;;=2930816
 ;;^DD(.4031,7,3)
 ;;=Enter the name of the page, 3-30 characters in length.
 ;;^DD(.4031,7,21,0)
 ;;=^^5^5^2940907^^
 ;;^DD(.4031,7,21,1,0)
 ;;=Like the Page Number, you can use the Page Name to refer to a page in
 ;;^DD(.4031,7,21,2,0)
 ;;=ScreenMan functions and utilities.  ScreenMan displays the Page Name to
 ;;^DD(.4031,7,21,3,0)
 ;;=the user if, during an attempt to file data, ScreenMan finds required
 ;;^DD(.4031,7,21,4,0)
 ;;=fields with null values.  ScreenMan uses the Caption of the field and the
 ;;^DD(.4031,7,21,5,0)
 ;;=Page Name to inform the user of the location of the required field.
 ;;^DD(.4031,7,"DT")
 ;;=2931020
 ;;^DD(.4031,8,0)
 ;;=PARENT FIELD^FX^^1;2^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>92!($L(X)<5)!'(X?1.E1","1.E1","1.E) X I $D(X) D PFIELD^DDSIT

DINIT293
DINIT293 ;SFISC/MKO-FORM AND BLOCK FILES ;05:35 PM  21 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT294
Q Q
 ;;^DD(.4031,8,1,0)
 ;;=^.1^^0
 ;;^DD(.4031,8,3)
 ;;=Answer must be 5-92 characters in length.
 ;;^DD(.4031,8,21,0)
 ;;=^^25^25^2940907^
 ;;^DD(.4031,8,21,1,0)
 ;;=This property can be used instead of Subpage Link to link a subpage to a
 ;;^DD(.4031,8,21,2,0)
 ;;=field.
 ;;^DD(.4031,8,21,3,0)
 ;;= 
 ;;^DD(.4031,8,21,4,0)
 ;;=Parent Field has the following format:
 ;;^DD(.4031,8,21,5,0)
 ;;= 
 ;;^DD(.4031,8,21,6,0)
 ;;=       Field id,Block id,Page id
 ;;^DD(.4031,8,21,7,0)
 ;;= 
 ;;^DD(.4031,8,21,8,0)
 ;;=where,
 ;;^DD(.4031,8,21,9,0)
 ;;= 
 ;;^DD(.4031,8,21,10,0)
 ;;=       Field id  =  Field Order number; or
 ;;^DD(.4031,8,21,11,0)
 ;;=                    Caption of the field; or
 ;;^DD(.4031,8,21,12,0)
 ;;=                    Unique Name of the field
 ;;^DD(.4031,8,21,13,0)
 ;;= 
 ;;^DD(.4031,8,21,14,0)
 ;;=       Block id  =  Block Order number; or
 ;;^DD(.4031,8,21,15,0)
 ;;=                    Block Name
 ;;^DD(.4031,8,21,16,0)
 ;;= 
 ;;^DD(.4031,8,21,17,0)
 ;;=       Page id   =  Page Number; or
 ;;^DD(.4031,8,21,18,0)
 ;;=                    Page Name
 ;;^DD(.4031,8,21,19,0)
 ;;= 
 ;;^DD(.4031,8,21,20,0)
 ;;=For example:
 ;;^DD(.4031,8,21,21,0)
 ;;= 
 ;;^DD(.4031,8,21,22,0)
 ;;=       ZZFIELD 1,ZZBLOCK 1,ZZPAGE 1
 ;;^DD(.4031,8,21,23,0)
 ;;= 
 ;;^DD(.4031,8,21,24,0)
 ;;=identifies the field with Caption or Unique Name "ZZFIELD 1," on the block
 ;;^DD(.4031,8,21,25,0)
 ;;=named "ZZBLOCK 1," on the page named "ZZPAGE 1".
 ;;^DD(.4031,8,"DT")
 ;;=2931201
 ;;^DD(.4031,11,0)
 ;;=PRE ACTION^K^^11;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4031,11,3)
 ;;=Enter Standard MUMPS code that will be executed before the user reaches a page.
 ;;^DD(.4031,11,9)
 ;;=@
 ;;^DD(.4031,11,21,0)
 ;;=^^1^1^2940907^^^^
 ;;^DD(.4031,11,21,1,0)
 ;;=This MUMPS code is executed when the user reaches a page.
 ;;^DD(.4031,11,22)
 ;;=
 ;;^DD(.4031,12,0)
 ;;=POST ACTION^K^^12;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4031,12,3)
 ;;=Enter Standard MUMPS code that will be executed after the user leaves a page.
 ;;^DD(.4031,12,9)
 ;;=@
 ;;^DD(.4031,12,21,0)
 ;;=^^1^1^2940907^^^
 ;;^DD(.4031,12,21,1,0)
 ;;=This MUMPS code is executed when the user leaves the page.
 ;;^DD(.4031,15,0)
 ;;=DESCRIPTION^.403115^^15;0
 ;;^DD(.4031,40,0)
 ;;=BLOCK^.4032IP^^40;0
 ;;^DD(.403115,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.403115,0,"DT")
 ;;=2910204
 ;;^DD(.403115,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.403115,0,"UP")
 ;;=.4031
 ;;^DD(.403115,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.403115,.01,3)
 ;;=Enter text which describes the page.
 ;;^DD(.403115,.01,21,0)
 ;;=^^1^1^2940908^^
 ;;^DD(.403115,.01,21,1,0)
 ;;=Enter text that describes this page.
 ;;^DD(.40315,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.40315,0,"DT")
 ;;=2910204
 ;;^DD(.40315,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.40315,0,"UP")
 ;;=.403
 ;;^DD(.40315,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.40315,.01,3)
 ;;=
 ;;^DD(.40315,.01,21,0)
 ;;=^^1^1^2940908^^^^
 ;;^DD(.40315,.01,21,1,0)
 ;;=Enter text that describes this form.
 ;;^DD(.4032,0)
 ;;=BLOCK SUB-FIELD^^12^13
 ;;^DD(.4032,0,"DT")
 ;;=2940506
 ;;^DD(.4032,0,"ID","WRITE")
 ;;=D EN^DDIOL("(Block Order "_$P(^(0),U,2)_")","","?35")
 ;;^DD(.4032,0,"IX","AC",.4032,1)
 ;;=
 ;;^DD(.4032,0,"IX","B",.4032,.01)
 ;;=
 ;;^DD(.4032,0,"NM","BLOCK")
 ;;=
 ;;^DD(.4032,0,"UP")
 ;;=.4031
 ;;^DD(.4032,.01,0)
 ;;=BLOCK NAME^MP.404'X^DIST(.404,^0;1^S:$D(X) DINUM=X
 ;;^DD(.4032,.01,1,0)
 ;;=^.1
 ;;^DD(.4032,.01,1,1,0)
 ;;=.4032^B
 ;;^DD(.4032,.01,1,1,1)
 ;;=S ^DIST(.403,DA(2),40,DA(1),40,"B",$E(X,1,30),DA)=""
 ;;^DD(.4032,.01,1,1,2)
 ;;=K ^DIST(.403,DA(2),40,DA(1),40,"B",$E(X,1,30),DA)
 ;;^DD(.4032,.01,1,2,0)
 ;;=.403^AB
 ;;^DD(.4032,.01,1,2,1)
 ;;=S ^DIST(.403,"AB",$E(X,1,30),DA(2),DA(1),DA)=""
 ;;^DD(.4032,.01,1,2,2)
 ;;=K ^DIST(.403,"AB",$E(X,1,30),DA(2),DA(1),DA)
 ;;^DD(.4032,.01,1,2,"%D",0)
 ;;=^^2^2^2930521^
 ;;^DD(.4032,.01,1,2,"%D",1,0)
 ;;=This cross reference provides an index that can be used to determine
 ;;^DD(.4032,.01,1,2,"%D",2,0)
 ;;=the forms on which a block is used.
 ;;^DD(.4032,.01,1,2,"DT")
 ;;=2930521
 ;;^DD(.4032,.01,21,0)
 ;;=^^1^1^2940908^^^^
 ;;^DD(.4032,.01,21,1,0)
 ;;=Enter the name of the block to be placed on this page of the form.
 ;;^DD(.4032,.01,"DT")
 ;;=2930521
 ;;^DD(.4032,1,0)
 ;;=BLOCK ORDER^RNJ4,1X^^0;2^K:+X'=X!(X>99.9)!(X<1)!(X?.E1"."2N.N)!$D(^DIST(.403,DA(2),40,DA(1),40,"AC",X)) X
 ;;^DD(.4032,1,1,0)
 ;;=^.1
 ;;^DD(.4032,1,1,1,0)
 ;;=.4032^AC
 ;;^DD(.4032,1,1,1,1)
 ;;=S ^DIST(.403,DA(2),40,DA(1),40,"AC",$E(X,1,30),DA)=""
 ;;^DD(.4032,1,1,1,2)
 ;;=K ^DIST(.403,DA(2),40,DA(1),40,"AC",$E(X,1,30),DA)
 ;;^DD(.4032,1,1,1,"%D",0)
 ;;=^^2^2^2910118^^
 ;;^DD(.4032,1,1,1,"%D",1,0)
 ;;=This cross-reference is used to ensure that order numbers are unique for
 ;;^DD(.4032,1,1,1,"%D",2,0)
 ;;=the page.
 ;;^DD(.4032,1,1,1,"DT")
 ;;=2910118
 ;;^DD(.4032,1,3)
 ;;=Enter a number between 1 and 99.9, 1 Decimal Digit, which represents the order in which the block will be processed within the page.  This number must be unique for the page.
 ;;^DD(.4032,1,21,0)
 ;;=^^5^5^2940907^^
 ;;^DD(.4032,1,21,1,0)
 ;;=The Block Order determines the order users traverse fields on a page when
 ;;^DD(.4032,1,21,2,0)
 ;;=they press <F1><F4> to go to the next block, or press <RET> to move from
 ;;^DD(.4032,1,21,3,0)
 ;;=the last field on one block to the first field on the next.  When the user
 ;;^DD(.4032,1,21,4,0)
 ;;=first reaches a page, ScreenMan places the user on the block with the
 ;;^DD(.4032,1,21,5,0)
 ;;=lowest Block Order number.
 ;;^DD(.4032,2,0)
 ;;=BLOCK COORDINATE^F^^0;3^K:$L(X)>7!($L(X)<1)!'(X?.N1",".N) X
 ;;^DD(.4032,2,3)
 ;;=Enter the block coordinate relative to the page coordinate.  Answer must be two positive integers separated by a comma (,), as follows:  'Upper left row,Upper left column.'
 ;;^DD(.4032,2,21,0)
 ;;=^^2^2^2940907^^
 ;;^DD(.4032,2,21,1,0)
 ;;=The block coordinate is relative to the page coordinate.  The first row
 ;;^DD(.4032,2,21,2,0)
 ;;=and column on the block have a coordinate of 1,1.
 ;;^DD(.4032,2,"DT")
 ;;=2940908
 ;;^DD(.4032,3,0)
 ;;=TYPE OF BLOCK^S^e:EDIT;d:DISPLAY;^0;4^Q
 ;;^DD(.4032,3,3)
 ;;=
 ;;^DD(.4032,3,21,0)
 ;;=^^7^7^2940907^
 ;;^DD(.4032,3,21,1,0)
 ;;=Enter 'EDIT' if users can navigate to as well as edit fields in this
 ;;^DD(.4032,3,21,2,0)
 ;;=block.  Enter 'DISPLAY' if users cannot edit any of the fields in this
 ;;^DD(.4032,3,21,3,0)
 ;;=block.  User's can navigate to a DISPLAY block only if it contains
 ;;^DD(.4032,3,21,4,0)
 ;;=multiple or word processing fields, in which case, the cursor stops at any

DINIT294
DINIT294 ;SFISC/MKO-FORM AND BLOCK FILES ;1NOV2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT295
Q Q
 ;;^DD(.4032,3,21,5,0)
 ;;=of those two kinds of fields so that the user can press <RET> to view or
 ;;^DD(.4032,3,21,6,0)
 ;;=edit the subfields in the multiple or invoke an editor to view the
 ;;^DD(.4032,3,21,7,0)
 ;;=contents of the word processing field.
 ;;^DD(.4032,3,"DT")
 ;;=2940413
 ;;^DD(.4032,4,0)
 ;;=POINTER LINK^FX^^1;1^K:$L(X)>245!($L(X)<1) X I $D(X) D PLINK^DDSIT
 ;;^DD(.4032,4,3)
 ;;=Answer must be 1-245 characters in length.
 ;;^DD(.4032,4,21,0)
 ;;=^^9^9^2940907^^
 ;;^DD(.4032,4,21,1,0)
 ;;=If the fields displayed in this block are reached through a relational
 ;;^DD(.4032,4,21,2,0)
 ;;=jump from the primary file of the form, enter the relational expression
 ;;^DD(.4032,4,21,3,0)
 ;;=that describes this jump.  Your frame of reference is the primary file of
 ;;^DD(.4032,4,21,4,0)
 ;;=the form.
 ;;^DD(.4032,4,21,5,0)
 ;;= 
 ;;^DD(.4032,4,21,6,0)
 ;;=For example, if the primary file has a field #999 called TEST that points
 ;;^DD(.4032,4,21,7,0)
 ;;=to the file associated with this block, enter
 ;;^DD(.4032,4,21,8,0)
 ;;= 
 ;;^DD(.4032,4,21,9,0)
 ;;=     999 or TEST
 ;;^DD(.4032,4,"DT")
 ;;=2931201
 ;;^DD(.4032,5,0)
 ;;=REPLICATION^NJ3,0^^2;1^K:+X'=X!(X>999)!(X<2)!(X?.E1"."1N.N) X
 ;;^DD(.4032,5,3)
 ;;=Type a Number between 2 and 999, 0 Decimal Digits
 ;;^DD(.4032,5,21,0)
 ;;=^^3^3^2940907^^
 ;;^DD(.4032,5,21,1,0)
 ;;=If this is a repeating block, enter the number of times the fields
 ;;^DD(.4032,5,21,2,0)
 ;;=defined in this block should be replicated.  If used, this number must
 ;;^DD(.4032,5,21,3,0)
 ;;=be greater than 1.
 ;;^DD(.4032,5,"DT")
 ;;=2940503
 ;;^DD(.4032,6,0)
 ;;=INDEX^F^^2;2^K:$L(X)>63!($L(X)<1) X
 ;;^DD(.4032,6,3)
 ;;=Answer must be 1-63 characters in length.
 ;;^DD(.4032,6,21,0)
 ;;=^^7^7^2941020^
 ;;^DD(.4032,6,21,1,0)
 ;;=Enter the name of the cross reference that should be used to pick up the
 ;;^DD(.4032,6,21,2,0)
 ;;=subentries in the multiple.  ScreenMan will initially display the
 ;;^DD(.4032,6,21,3,0)
 ;;=subentries to the user sorted in the order defined by this index.  The
 ;;^DD(.4032,6,21,4,0)
 ;;=default INDEX is B.
 ;;^DD(.4032,6,21,5,0)
 ;;= 
 ;;^DD(.4032,6,21,6,0)
 ;;=If the multiple has no index, or you wish to display the subentries
 ;;^DD(.4032,6,21,7,0)
 ;;=in record number order, enter !IEN.
 ;;^DD(.4032,6,21,8,0)
 ;;=  LEAVE THIS VALUE EMPTY IF YOU WANT TO ENTER 'COMPUTED MULTIPLE' CODE TO DO THE SELECTION
 ;;^DD(.4032,7,0)
 ;;=INITIAL POSITION^S^f:FIRST;l:LAST;n:NEW;u:USER'S LAST^2;3^Q
 ;;^DD(.4032,7,21,0)
 ;;=^^5^5^2940908^
 ;;^DD(.4032,7,21,1,0)
 ;;=This is the position in the list where the cursor should initially rest
 ;;^DD(.4032,7,21,2,0)
 ;;=when the user first navigates to the repeating block.  NEW indicates that
 ;;^DD(.4032,7,21,3,0)
 ;;=the cursor should initially rest on the blank line at the end of the list.  
 ;;^DD(.4032,7,21,4,0)
 ;;=USER'S LAST is the last choice that the User has made for this file -- what  
 ;;^DD(.4032,7,21,5,0)
 ;;=would be retrieved by the SPACE-BAR.  The default INITIAL POSITION is FIRST.
 ;;^DD(.4032,7,"DT")
 ;;=2940503
 ;;^DD(.4032,8,0)
 ;;=DISALLOW LAYGO^S^0:NO;1:YES;^2;4^Q
 ;;^DD(.4032,8,21,0)
 ;;=^^3^3^2940907^^
 ;;^DD(.4032,8,21,1,0)
 ;;=If set to YES, this prohibits the user from entering new subentries into
 ;;^DD(.4032,8,21,2,0)
 ;;=the multiple.  If null or set to NO, the setting in the data dictionary
 ;;^DD(.4032,8,21,3,0)
 ;;=determines whether LAYGO is allowed.
 ;;^DD(.4032,8,"DT")
 ;;=2940505
 ;;^DD(.4032,9,0)
 ;;=FIELD FOR SELECTION^F^^2;5^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.4032,9,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(.4032,9,21,0)
 ;;=^^5^5^2940907^^
 ;;^DD(.4032,9,21,1,0)
 ;;=This is the field order of the field that defines the column position of
 ;;^DD(.4032,9,21,2,0)
 ;;=the blank line at the end of the list.  The default is the first editable
 ;;^DD(.4032,9,21,3,0)
 ;;=field in the block.  This is also the field before which ScreenMan prints
 ;;^DD(.4032,9,21,4,0)
 ;;=the plus sign (+) to indicate there are more entries above or below the
 ;;^DD(.4032,9,21,5,0)
 ;;=displayed list.
 ;;^DD(.4032,9,"DT")
 ;;=2940506
 ;;^DD(.4032,10,0)
 ;;=ASK 'OK'^S^0:NO;1:YES;^2;6^Q
 ;;^DD(.4032,10,21,0)
 ;;=^^5^5^2990420^
 ;;^DD(.4032,10,21,1,0)
 ;;=Answer 'YES' to ask the user whether the looked-up entry is 'OK'. If only
 ;;^DD(.4032,10,21,2,0)
 ;;=one match is made to the user's lookup value, then ScreenMan will ask
 ;;^DD(.4032,10,21,3,0)
 ;;="OK?" instead of automatically selecting the found entry. This property
 ;;^DD(.4032,10,21,4,0)
 ;;=corresponds to the "V" flag in the DIC(0) input variable to ^DIC and only
 ;;^DD(.4032,10,21,5,0)
 ;;=pertains to multiple-valued fields.
 ;;^DD(.4032,10,"DT")
 ;;=2990420
 ;;^DD(.4032,11,0)
 ;;=PRE ACTION^K^^11;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4032,11,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.4032,11,9)
 ;;=@
 ;;^DD(.4032,11,21,0)
 ;;=^^5^5^2940907^
 ;;^DD(.4032,11,21,1,0)
 ;;=Enter MUMPS code that is executed whenever the user reaches this block.
 ;;^DD(.4032,11,21,2,0)
 ;;= 
 ;;^DD(.4032,11,21,3,0)
 ;;=This pre-action is a characteristic of the block only as it is used on
 ;;^DD(.4032,11,21,4,0)
 ;;=this form.  If you place this block on another form, you can define a
 ;;^DD(.4032,11,21,5,0)
 ;;=different pre-action.
 ;;^DD(.4032,11,"DT")
 ;;=2930610
 ;;^DD(.4032,12,0)
 ;;=POST ACTION^K^^12;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4032,12,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.4032,12,9)
 ;;=@
 ;;^DD(.4032,12,21,0)
 ;;=^^5^5^2940907^
 ;;^DD(.4032,12,21,1,0)
 ;;=Enter MUMPS code that is executed whenever the user leaves this block.
 ;;^DD(.4032,12,21,2,0)
 ;;= 
 ;;^DD(.4032,12,21,3,0)
 ;;=This post-action is a characteristic of the block only as it is used on
 ;;^DD(.4032,12,21,4,0)
 ;;=this form.  If you place this block on another form, you can define a
 ;;^DD(.4032,12,21,5,0)
 ;;=different post-action.
 ;;^DD(.4032,12,"DT")
 ;;=2930610
 ;;^DD(.4032,98,0)
 ;;=COMPUTED MULTIPLE^K^^COMP MUL;E1,999^D ^DIM
 ;;^DD(.4032,98,3)
 ;;=THIS IS MUMPS CODE THAT XECUTES 'DICMX' WITH DIFFERENT VALUES OF 'D0' AS INTERNAL ENTRY NUMBERS
 ;;^DD(.4032,98.1,0)
 ;;=COMPUTED MUL PTR^NJ13,9^^COMP MUL PTR;E1,999^K:+$P(X,"E")'=X X
 ;;^DD(.4032,98.1,3)
 ;;=FILE POINTER (USUALLY THE SAME FILE)

DINIT295
DINIT295 ;SFISC/MKO-FORM AND BLOCK FILES ;11:18 AM  20 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT296
Q Q
 ;;^DIC(.404,0,"GL")
 ;;=^DIST(.404,
 ;;^DIC("B","BLOCK",.404)
 ;;=
 ;;^DIC(.404,"%D",0)
 ;;=^^2^2^2940914^
 ;;^DIC(.404,"%D",1,0)
 ;;=This file stores ScreenMan blocks, which are used to build forms in the
 ;;^DIC(.404,"%D",2,0)
 ;;=Form file.
 ;;^DD(.404,0)
 ;;=FIELD^^40^7
 ;;^DD(.404,0,"DT")
 ;;=2940625
 ;;^DD(.404,0,"IX","B",.404,.01)
 ;;=
 ;;^DD(.404,0,"NM","BLOCK")
 ;;=
 ;;^DD(.404,0,"PT",.4031,1)
 ;;=
 ;;^DD(.404,0,"PT",.4032,.01)
 ;;=
 ;;^DD(.404,.01,0)
 ;;=NAME^RFX^^0;1^K:$L(X)>30!($L(X)<3)!(X?1P.E)!(X=+$P(X,"E")) X I $D(X),$S($D(DDS)&$G(DA):$P($G(^DIST(.404,DA,0)),U)'=X,1:1),$D(^DIST(.404,"B",X)) K X
 ;;^DD(.404,.01,1,0)
 ;;=^.1
 ;;^DD(.404,.01,1,1,0)
 ;;=.404^B
 ;;^DD(.404,.01,1,1,1)
 ;;=S ^DIST(.404,"B",$E(X,1,30),DA)=""
 ;;^DD(.404,.01,1,1,2)
 ;;=K ^DIST(.404,"B",$E(X,1,30),DA)
 ;;^DD(.404,.01,1,1,"DT")
 ;;=2900912
 ;;^DD(.404,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(.404,.01,21,0)
 ;;=^^2^2^2940907^^
 ;;^DD(.404,.01,21,1,0)
 ;;=Enter the name of the block, 3-30 characters in length.  The block name
 ;;^DD(.404,.01,21,2,0)
 ;;=must be unique and cannot be numeric or start with punctuation.
 ;;^DD(.404,.01,"DEL",1,0)
 ;;=I '$D(DDSDEL) D EN^DDIOL($C(7)_"You must use the FileMan options to delete blocks.") I 1
 ;;^DD(.404,.01,"DT")
 ;;=2931020
 ;;^DD(.404,1,0)
 ;;=DATA DICTIONARY NUMBER^FX^^0;2^K:X'=+$P(X,"E")!(X<2)!($L(X)>16)!'$D(^DD(X)) X
 ;;^DD(.404,1,3)
 ;;=Answer must be 1-16 characters in length.
 ;;^DD(.404,1,21,0)
 ;;=^^3^3^2940907^
 ;;^DD(.404,1,21,1,0)
 ;;=Enter the data dictionary number of the file or subfile that contains the
 ;;^DD(.404,1,21,2,0)
 ;;=fields that are placed on this block.  A block can contain fields from
 ;;^DD(.404,1,21,3,0)
 ;;=only one file or subfile.
 ;;^DD(.404,1,"DT")
 ;;=2930406
 ;;^DD(.404,2,0)
 ;;=DISABLE NAVIGATION^S^0:NO;1:YES;2:OUTOK;^0;3^Q
 ;;^DD(.404,2,3)
 ;;=
 ;;^DD(.404,2,21,0)
 ;;=^^8^8^2940907^^
 ;;^DD(.404,2,21,1,0)
 ;;=Enter 'YES' if navigation within the block should be disabled.  When
 ;;^DD(.404,2,21,2,0)
 ;;=navigation is disabled, user cannot ^-jump to other fields, they cannot
 ;;^DD(.404,2,21,3,0)
 ;;=^-jump to the Command Line, and the <Up>, <Down>, <Tab>, and <F4> keys
 ;;^DD(.404,2,21,4,0)
 ;;=traverse the fields in the same order as the <RET> key -- that is, in the
 ;;^DD(.404,2,21,5,0)
 ;;=order established by the Field Order property of the fields.
 ;;^DD(.404,2,21,6,0)
 ;;= 
 ;;^DD(.404,2,21,7,0)
 ;;=Enter 'OUTOK' to disable navigation, but allow the user to ^-jump to the
 ;;^DD(.404,2,21,8,0)
 ;;=Command Line.
 ;;^DD(.404,11,0)
 ;;=PRE ACTION^K^^11;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.404,11,3)
 ;;=Enter standard MUMPS code that will be executed when the user navigates to the block.
 ;;^DD(.404,11,9)
 ;;=@
 ;;^DD(.404,11,21,0)
 ;;=^^6^6^2940907^^
 ;;^DD(.404,11,21,1,0)
 ;;=This is MUMPS code that is executed when the user navigates to the
 ;;^DD(.404,11,21,2,0)
 ;;=block.
 ;;^DD(.404,11,21,3,0)
 ;;= 
 ;;^DD(.404,11,21,4,0)
 ;;=This pre-action is part of the block definition itself, so if this
 ;;^DD(.404,11,21,5,0)
 ;;=block is used on another page or another form, the pre-action still
 ;;^DD(.404,11,21,6,0)
 ;;=applies.
 ;;^DD(.404,12,0)
 ;;=POST ACTION^K^^12;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.404,12,3)
 ;;=Enter standard MUMPS that will be executed when the user leaves the block.
 ;;^DD(.404,12,9)
 ;;=@
 ;;^DD(.404,12,21,0)
 ;;=^^5^5^2940907^^
 ;;^DD(.404,12,21,1,0)
 ;;=This is MUMPS code that is executed when the user leaves the block.
 ;;^DD(.404,12,21,2,0)
 ;;= 
 ;;^DD(.404,12,21,3,0)
 ;;=This post-action is part of the block definition itself, so if the
 ;;^DD(.404,12,21,4,0)
 ;;=block is used on another page or on another form, the post-action still
 ;;^DD(.404,12,21,5,0)
 ;;=applies.
 ;;^DD(.404,15,0)
 ;;=DESCRIPTION^.40415^^15;0
 ;;^DD(.404,40,0)
 ;;=FIELD^.4044I^^40;0
 ;;^DD(.404,40,"DT")
 ;;=2931029
 ;;^DD(.40415,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.40415,0,"DT")
 ;;=2910204
 ;;^DD(.40415,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.40415,0,"UP")
 ;;=.404
 ;;^DD(.40415,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.40415,.01,3)
 ;;=
 ;;^DD(.40415,.01,21,0)
 ;;=^^1^1^2940908^^^
 ;;^DD(.40415,.01,21,1,0)
 ;;=Enter text that describes this block.
 ;;^DD(.4044,0)
 ;;=FIELD SUB-FIELD^^30^33
 ;;^DD(.4044,0,"DT")
 ;;=2940625
 ;;^DD(.4044,0,"ID","WRITE")
 ;;=D EN^DDIOL($S($P(^(0),U,2)?1"Select "1.E:$E($P(^(0),U,2),8,999),1:$S($P(^(0),U,2)="!M":$G(^(.1)),1:$P(^(0),U,2)))_$S($P(^(0),U,4)]"":"  ("_$P(^(0),U,4)_")",1:""),"","?9")
 ;;^DD(.4044,0,"ID","WRITE1")
 ;;=D EN^DDIOL($S($P($G(^(7)),U,2):"  (Sub Page Link defined)",1:"")_$S($G(^(1)):"   (Field #"_^(1)_")",1:"")_$S($P(^(0),U,5)]"":"  ("_$P(^(0),U,5)_")",1:""),"","?0")
 ;;^DD(.4044,0,"IX","B",.4044,.01)
 ;;=
 ;;^DD(.4044,0,"IX","C",.4044,1)
 ;;=
 ;;^DD(.4044,0,"IX","D",.4044,3.1)
 ;;=
 ;;^DD(.4044,0,"NM","FIELD")
 ;;=
 ;;^DD(.4044,0,"UP")
 ;;=.404
 ;;^DD(.4044,.01,0)
 ;;=FIELD ORDER^MNJ4,1X^^0;1^K:X'=+$P(X,"E")!(X>99.9)!(X<0)!(X?.E1"."2N.N) X I $D(X),$D(^DIST(.404,DA(1),40,"B",X)) K X
 ;;^DD(.4044,.01,1,0)
 ;;=^.1
 ;;^DD(.4044,.01,1,1,0)
 ;;=.4044^B
 ;;^DD(.4044,.01,1,1,1)
 ;;=S ^DIST(.404,DA(1),40,"B",$E(X,1,30),DA)=""
 ;;^DD(.4044,.01,1,1,2)
 ;;=K ^DIST(.404,DA(1),40,"B",$E(X,1,30),DA)
 ;;^DD(.4044,.01,3)
 ;;=Enter a unique number between 0 and 99.9, inclusive, which represents the order in which the fields will be edited.
 ;;^DD(.4044,.01,21,0)
 ;;=^^2^2^2940907^
 ;;^DD(.4044,.01,21,1,0)
 ;;=The Field Order number determines the order in which users traverse the
 ;;^DD(.4044,.01,21,2,0)
 ;;=fields in the block as they press <RET>.
 ;;^DD(.4044,1,0)
 ;;=CAPTION^FX^^0;2^K:$L(X)>80!($L(X)<1) X S:$E($G(X))="!"&($G(X)'="!M") X=$$FUNC^DDSCAP(X)
 ;;^DD(.4044,1,1,0)
 ;;=^.1^^-1
 ;;^DD(.4044,1,1,2,0)
 ;;=.4044^C^MUMPS
 ;;^DD(.4044,1,1,2,1)
 ;;=S:X'="!M" ^DIST(.404,DA(1),40,"C",$$UP^DILIBF($E($S(X?1"Select "1.E:$P(X,"Select ",2,99),1:X),1,63)),DA)=""
 ;;^DD(.4044,1,1,2,2)
 ;;=K:X'="!M" ^DIST(.404,DA(1),40,"C",$$UP^DILIBF($E($S(X?1"Select "1.E:$P(X,"Select ",2,99),1:X),1,63)),DA)
 ;;^DD(.4044,1,1,2,3)
 ;;=Programmer only
 ;;^DD(.4044,1,1,2,"%D",0)
 ;;=^^2^2^2931029^^^^
 ;;^DD(.4044,1,1,2,"%D",1,0)
 ;;=This cross referenced is used to allow selection of fields by caption name
 ;;^DD(.4044,1,1,2,"%D",2,0)
 ;;=as well as by order number when entering new fields in the block.
 ;;^DD(.4044,1,1,2,"DT")
 ;;=2920214

DINIT296
DINIT296 ;SFISC/MKO-FORM AND BLOCK FILES ;05:32 PM  14 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT297
Q Q
 ;;^DD(.4044,1,3)
 ;;=Answer must be 1-80 characters in length.
 ;;^DD(.4044,1,21,0)
 ;;=^^6^6^2940907^
 ;;^DD(.4044,1,21,1,0)
 ;;=A caption is uneditable text that appears on the screen.  Captions of
 ;;^DD(.4044,1,21,2,0)
 ;;=data dictionary, form-only, and computed fields serve to identify for
 ;;^DD(.4044,1,21,3,0)
 ;;=the user the data portion of the fields.  Captions for these types of
 ;;^DD(.4044,1,21,4,0)
 ;;=fields are automatically followed by a colon, unless the Suppress Colon
 ;;^DD(.4044,1,21,5,0)
 ;;=After Caption property is set to 'YES.'  A field with an Executable
 ;;^DD(.4044,1,21,6,0)
 ;;=Caption must have '!M' as a Caption.
 ;;^DD(.4044,1,"DT")
 ;;=2940629
 ;;^DD(.4044,1.1,0)
 ;;=EXECUTABLE CAPTION^K^^.1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,1.1,3)
 ;;=Enter standard MUMPS code that sets the variable Y.
 ;;^DD(.4044,1.1,9)
 ;;=@
 ;;^DD(.4044,1.1,21,0)
 ;;=^^3^3^2940907^^
 ;;^DD(.4044,1.1,21,1,0)
 ;;=Enter MUMPS code that sets the variable Y equal to the caption you
 ;;^DD(.4044,1.1,21,2,0)
 ;;=want displayed.  This code is executed and the caption evaluated whenever
 ;;^DD(.4044,1.1,21,3,0)
 ;;=the page on which this caption is located is painted.
 ;;^DD(.4044,1.1,"DT")
 ;;=2920218
 ;;^DD(.4044,2,0)
 ;;=FIELD TYPE^*S^0:UNKNOWN;1:CAPTION ONLY;2:FORM ONLY;3:DATA DICTIONARY FIELD;4:COMPUTED;^0;3^Q
 ;;^DD(.4044,2,1,0)
 ;;=^.1^^0
 ;;^DD(.4044,2,3)
 ;;=
 ;;^DD(.4044,2,12)
 ;;=Enter the field type.
 ;;^DD(.4044,2,12.1)
 ;;=S DIC("S")="I Y"
 ;;^DD(.4044,2,21,0)
 ;;=^^11^11^2940907^
 ;;^DD(.4044,2,21,1,0)
 ;;=Enter the field type.
 ;;^DD(.4044,2,21,2,0)
 ;;= 
 ;;^DD(.4044,2,21,3,0)
 ;;=CAPTION ONLY fields are for displaying text on the screen.
 ;;^DD(.4044,2,21,4,0)
 ;;= 
 ;;^DD(.4044,2,21,5,0)
 ;;=FORM ONLY fields are fields defined only on the form and are not tied to a
 ;;^DD(.4044,2,21,6,0)
 ;;=field in a FileMan file.
 ;;^DD(.4044,2,21,7,0)
 ;;= 
 ;;^DD(.4044,2,21,8,0)
 ;;=DATA DICTIONARY fields are fields from a FileMan file.
 ;;^DD(.4044,2,21,9,0)
 ;;= 
 ;;^DD(.4044,2,21,10,0)
 ;;=COMPUTED fields, like form-only fields, are fields that are defined only
 ;;^DD(.4044,2,21,11,0)
 ;;=on the form.  Associated with a COMPUTED field is a computed expression.
 ;;^DD(.4044,2,"DT")
 ;;=2940907
 ;;^DD(.4044,3,0)
 ;;=DISPLAY GROUP^F^^0;4^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>20!($L(X)<1) X
 ;;^DD(.4044,3,3)
 ;;=Enter text, 1-20 characters in length, which represents the group to which this field belongs.
 ;;^DD(.4044,3,21,0)
 ;;=^^10^10^2940907^
 ;;^DD(.4044,3,21,1,0)
 ;;=Display group helps users resolve ambiguity when they attempt to ^-jump to
 ;;^DD(.4044,3,21,2,0)
 ;;=a field that has a caption that is not unique.  If more than one field has
 ;;^DD(.4044,3,21,3,0)
 ;;=the same caption, when users try to ^-jump to a field with that caption,
 ;;^DD(.4044,3,21,4,0)
 ;;=they are presented with a list of fields to choose from.  The text in the
 ;;^DD(.4044,3,21,5,0)
 ;;=Display Group property is displayed in parentheses after the caption to
 ;;^DD(.4044,3,21,6,0)
 ;;=help the user identify the correct field.
 ;;^DD(.4044,3,21,7,0)
 ;;= 
 ;;^DD(.4044,3,21,8,0)
 ;;=For example, if two fields have the caption 'NAME:', but one of those
 ;;^DD(.4044,3,21,9,0)
 ;;=fields has a Display Group 'Next of Kin', when users enter ^NAME, they
 ;;^DD(.4044,3,21,10,0)
 ;;=will be asked to choose between 'NAME' and 'NAME (Next of Kin)'.
 ;;^DD(.4044,3.1,0)
 ;;=UNIQUE NAME^FX^^0;5^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>50!($L(X)<1)!$D(^DIST(.404,DA(1),40,"D",X)) X
 ;;^DD(.4044,3.1,1,0)
 ;;=^.1
 ;;^DD(.4044,3.1,1,1,0)
 ;;=.4044^D^MUMPS
 ;;^DD(.4044,3.1,1,1,1)
 ;;=S ^DIST(.404,DA(1),40,"D",$$UP^DILIBF(X),DA)=""
 ;;^DD(.4044,3.1,1,1,2)
 ;;=K ^DIST(.404,DA(1),40,"D",$$UP^DILIBF(X),DA)
 ;;^DD(.4044,3.1,1,1,3)
 ;;=Programmer only
 ;;^DD(.4044,3.1,1,1,"%D",0)
 ;;=^^1^1^2930816^
 ;;^DD(.4044,3.1,1,1,"%D",1,0)
 ;;=This is a regular index of the Unique Name converted to uppercase.
 ;;^DD(.4044,3.1,1,1,"DT")
 ;;=2930816
 ;;^DD(.4044,3.1,3)
 ;;=Answer must be 1-50 characters in length.
 ;;^DD(.4044,3.1,21,0)
 ;;=^^5^5^2940907^
 ;;^DD(.4044,3.1,21,1,0)
 ;;=This is the unique name of the element on the block.  No two elements on
 ;;^DD(.4044,3.1,21,2,0)
 ;;=the block can have the same Unique Name.  Unique Names are never seen by
 ;;^DD(.4044,3.1,21,3,0)
 ;;=the user.  You can refer to an element on a block by its Unique Name in
 ;;^DD(.4044,3.1,21,4,0)
 ;;=some of the ScreenMan utilities such as PUT^DDSVAL and $$GET^DDSVAL, and
 ;;^DD(.4044,3.1,21,5,0)
 ;;=in the computed expressions of computed fields.
 ;;^DD(.4044,3.1,"DT")
 ;;=2930816
 ;;^DD(.4044,4,0)
 ;;=FIELD^FX^^1;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>245!($L(X)<1) X I $D(X),$D(DDGFDD) D IXF^DDS0
 ;;^DD(.4044,4,1,0)
 ;;=^.1^^0
 ;;^DD(.4044,4,3)
 ;;=Answer must be 1-245 characters in length.
 ;;^DD(.4044,4,4)
 ;;=I $D(DDGFDD) N D0,DA,DIC,D,DZ S DIC="^DD("_DDGFDD_",",DIC(0)="",D="B" S:$G(X)="??" DZ=X D DQ^DICQ
 ;;^DD(.4044,4,21,0)
 ;;=^^2^2^2940907^
 ;;^DD(.4044,4,21,1,0)
 ;;=Enter the number or name of a field in the file defined by the data
 ;;^DD(.4044,4,21,2,0)
 ;;=dictionary number for this block.
 ;;^DD(.4044,4,"DT")
 ;;=2940823
 ;;^DD(.4044,4.1,0)
 ;;=DATA COORDINATE^F^^2;1^K:$L(X)>7!($L(X)<1)!'(X?.N1",".N) X
 ;;^DD(.4044,4.1,3)
 ;;=Enter the field coordinate relative to the block.  Answer must be two positive integers separated by a comma (,), as follows:  'Row,Column'.
 ;;^DD(.4044,4.1,21,0)
 ;;=^^2^2^2940907^
 ;;^DD(.4044,4.1,21,1,0)
 ;;=Data coordinate is relative to the position of the block.  The top left
 ;;^DD(.4044,4.1,21,2,0)
 ;;=corner of the block has a coordinate of 1,1.
 ;;^DD(.4044,4.1,"DT")
 ;;=2940908
 ;;^DD(.4044,4.2,0)
 ;;=DATA LENGTH^NJ3,0^^2;2^K:+X'=X!(X>245)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.4044,4.2,3)
 ;;=Enter a Number between 1 and 245, inclusive, which represents the maximum length of the data to be displayed on the screen.
 ;;^DD(.4044,4.2,21,0)
 ;;=^^4^4^2940907^^
 ;;^DD(.4044,4.2,21,1,0)
 ;;=The data length defines the size of the editing window.  The editing
 ;;^DD(.4044,4.2,21,2,0)
 ;;=window is a single line and must not extend into or beyond the rightmost
 ;;^DD(.4044,4.2,21,3,0)
 ;;=column on the screen.  On an 80 column screen, the editing window
 ;;^DD(.4044,4.2,21,4,0)
 ;;=must not extend beyond column 79.
 ;;^DD(.4044,5.1,0)
 ;;=CAPTION COORDINATE^F^^2;3^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>7!($L(X)<1)!'(X?.N1",".N) X

DINIT297
DINIT297 ;SFISC/MKO-FORM AND BLOCK FILES ;3:30 PM  20 Apr 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT298
Q Q
 ;;^DD(.4044,5.1,1,0)
 ;;=^.1^^0
 ;;^DD(.4044,5.1,3)
 ;;=Enter the caption coordinate relative to the block.  Answer must be two positive integers separated by a comma (,), as follows:  'Row,Column'.
 ;;^DD(.4044,5.1,21,0)
 ;;=^^2^2^2940907^^
 ;;^DD(.4044,5.1,21,1,0)
 ;;=Caption coordinate is relative to the position of the block.  The
 ;;^DD(.4044,5.1,21,2,0)
 ;;=top left corner of the block has coordinate 1,1.
 ;;^DD(.4044,5.1,"DT")
 ;;=2940908
 ;;^DD(.4044,5.2,0)
 ;;=SUPPRESS COLON AFTER CAPTION?^S^0:NO;1:YES;^2;4^Q
 ;;^DD(.4044,5.2,1,0)
 ;;=^.1^^0
 ;;^DD(.4044,5.2,3)
 ;;=
 ;;^DD(.4044,5.2,21,0)
 ;;=^^2^2^2940907^^
 ;;^DD(.4044,5.2,21,1,0)
 ;;=Enter 'YES' to suppress the display of a colon and space after the
 ;;^DD(.4044,5.2,21,2,0)
 ;;=caption.
 ;;^DD(.4044,5.2,"DT")
 ;;=2940629
 ;;^DD(.4044,6,0)
 ;;=DEFAULT^F^^3;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>245!($L(X)<1) X
 ;;^DD(.4044,6,3)
 ;;=Answer must be 1-245 characters in length.
 ;;^DD(.4044,6,21,0)
 ;;=^^8^8^2940907^
 ;;^DD(.4044,6,21,1,0)
 ;;=Enter the default you want displayed when the user first loads the page
 ;;^DD(.4044,6,21,2,0)
 ;;=on which this field is located, and the field's value is originally null.
 ;;^DD(.4044,6,21,3,0)
 ;;=Since ScreenMan validates the default, it must be valid, unambiguous, and
 ;;^DD(.4044,6,21,4,0)
 ;;=in external form; otherwise, it is not used.
 ;;^DD(.4044,6,21,5,0)
 ;;= 
 ;;^DD(.4044,6,21,6,0)
 ;;=If you want to create an executable default, i.e., a default whose value
 ;;^DD(.4044,6,21,7,0)
 ;;=is determined at run time when the page is first loaded, the value of
 ;;^DD(.4044,6,21,8,0)
 ;;=this field must be "!M".
 ;;^DD(.4044,6,"DT")
 ;;=2920218
 ;;^DD(.4044,6.01,0)
 ;;=EXECUTABLE DEFAULT^K^^3.1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,6.01,3)
 ;;=Enter standard MUMPS code that sets the variable Y.
 ;;^DD(.4044,6.01,9)
 ;;=@
 ;;^DD(.4044,6.01,21,0)
 ;;=^^4^4^2940907^
 ;;^DD(.4044,6.01,21,1,0)
 ;;=Enter MUMPS code that sets the variable Y equal to the default you want
 ;;^DD(.4044,6.01,21,2,0)
 ;;=displayed when the page is first loaded and the data value on file is
 ;;^DD(.4044,6.01,21,3,0)
 ;;=null.  Y must be set to a valid, unambiguous user response; otherwise, it
 ;;^DD(.4044,6.01,21,4,0)
 ;;=is ignored.
 ;;^DD(.4044,6.01,"DT")
 ;;=2920218
 ;;^DD(.4044,6.1,0)
 ;;=REQUIRED^S^0:NO;1:YES;^4;1^Q
 ;;^DD(.4044,6.1,3)
 ;;=
 ;;^DD(.4044,6.1,21,0)
 ;;=^^5^5^2940907^
 ;;^DD(.4044,6.1,21,1,0)
 ;;=Whenever the user attempts a Save, ScreenMan checks all required fields
 ;;^DD(.4044,6.1,21,2,0)
 ;;=on all pages accessed during the editing session, as well as all pages
 ;;^DD(.4044,6.1,21,3,0)
 ;;=linked to the first page via the Next and Previous Page links.  If any of
 ;;^DD(.4044,6.1,21,4,0)
 ;;=the required fields have null values, no Save occurs.  You need not make a
 ;;^DD(.4044,6.1,21,5,0)
 ;;=field required that is already required by its data definition.
 ;;^DD(.4044,6.2,0)
 ;;=DUPLICATE^S^0:NO;1:YES;^4;2^Q
 ;;^DD(.4044,6.2,3)
 ;;=Enter 'YES' if the field value from the previous record can be duplicated with the 'spacebar-return' feature.
 ;;^DD(.4044,6.2,21,0)
 ;;=^^1^1^2940629^
 ;;^DD(.4044,6.2,21,1,0)
 ;;=This field is not currently being used.
 ;;^DD(.4044,6.3,0)
 ;;=RIGHT JUSTIFY^S^0:NO;1:YES;^4;3^Q
 ;;^DD(.4044,6.3,21,0)
 ;;=^^2^2^2940907^
 ;;^DD(.4044,6.3,21,1,0)
 ;;=Enter 'YES' if the data for this field should be displayed right-justified
 ;;^DD(.4044,6.3,21,2,0)
 ;;=in the editing window.
 ;;^DD(.4044,6.3,"DT")
 ;;=2940625
 ;;^DD(.4044,6.4,0)
 ;;=DISABLE EDITING^S^0:NO;1:YES;2:REACHABLE;^4;4^Q
 ;;^DD(.4044,6.4,3)
 ;;=
 ;;^DD(.4044,6.4,21,0)
 ;;=^^3^3^2940907^^^
 ;;^DD(.4044,6.4,21,1,0)
 ;;=Enter 'YES' to disable editing and to prevent the user from navigating
 ;;^DD(.4044,6.4,21,2,0)
 ;;=to the field.  Enter 'REACHABLE' to disable editing, but allow the user to
 ;;^DD(.4044,6.4,21,3,0)
 ;;=navigate to the field.
 ;;^DD(.4044,6.4,"DT")
 ;;=2940625
 ;;^DD(.4044,6.5,0)
 ;;=DISALLOW LAYGO^S^0:NO;1:YES;^4;5^Q
 ;;^DD(.4044,6.5,3)
 ;;=
 ;;^DD(.4044,6.5,21,0)
 ;;=^^2^2^2931020^
 ;;^DD(.4044,6.5,21,1,0)
 ;;=Enter 'YES' to prohibit the user from adding new subentries into this
 ;;^DD(.4044,6.5,21,2,0)
 ;;=multiple.  This question only pertains to multiple-valued fields.
 ;;^DD(.4044,6.6,0)
 ;;=ASK 'OK'^S^0:NO;1:YES;^4;6^Q
 ;;^DD(.4044,6.6,21,0)
 ;;=^^5^5^2990420^
 ;;^DD(.4044,6.6,21,1,0)
 ;;=Answer 'YES' to ask the user whether the looked-up entry is 'OK'. If only
 ;;^DD(.4044,6.6,21,2,0)
 ;;=one match is made to the user's lookup value, then ScreenMan will ask
 ;;^DD(.4044,6.6,21,3,0)
 ;;="OK?" instead of automatically selecting the found entry. This property
 ;;^DD(.4044,6.6,21,4,0)
 ;;=corresponds to the "V" flag in the DIC(0) input variable to ^DIC and only
 ;;^DD(.4044,6.6,21,5,0)
 ;;=pertains to multiple-valued fields.
 ;;^DD(.4044,8,0)
 ;;=SUB PAGE LINK^NJ5,1^^7;2^K:+X'=X!(X>999.9)!(X<1)!(X?.E1"."2N.N) X
 ;;^DD(.4044,8,3)
 ;;=Enter the Page Number of the page to open up when the user presses <Return> at this field.  Type a Number between 1 and 999.9, 1 Decimal Digit.
 ;;^DD(.4044,8,21,0)
 ;;=^^7^7^2940907^
 ;;^DD(.4044,8,21,1,0)
 ;;=If you wish to take users to a pop-up page when they press <RET> at
 ;;^DD(.4044,8,21,2,0)
 ;;=this field, enter the Page Number of that page.  When users exit that
 ;;^DD(.4044,8,21,3,0)
 ;;=pop-up page, ScreenMan will automatically take them to the field following
 ;;^DD(.4044,8,21,4,0)
 ;;=this field.
 ;;^DD(.4044,8,21,5,0)
 ;;= 
 ;;^DD(.4044,8,21,6,0)
 ;;=You can also use the Parent Field property of the pop-up page to link a
 ;;^DD(.4044,8,21,7,0)
 ;;=field to the pop-up page.
 ;;^DD(.4044,10,0)
 ;;=BRANCHING LOGIC^K^^10;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,10,3)
 ;;=Enter Standard MUMPS code, 1-245 characters in length.
 ;;^DD(.4044,10,9)
 ;;=@
 ;;^DD(.4044,10,21,0)
 ;;=^^18^18^2940907^
 ;;^DD(.4044,10,21,1,0)
 ;;=This MUMPS code is executed whenever the user presses <RET> at the
 ;;^DD(.4044,10,21,2,0)
 ;;=field.  Here you can set DDSBR equal to the field, block, and page,
 ;;^DD(.4044,10,21,3,0)
 ;;=separated by up-arrow delimiters, of the field to which you wish to take
 ;;^DD(.4044,10,21,4,0)
 ;;=users when they press <RET>.  For example,
 ;;^DD(.4044,10,21,5,0)
 ;;= 
 ;;^DD(.4044,10,21,6,0)
 ;;=     S:X="Y" DDSBR="TEST FIELD 1^TEST BLOCK 1^TEST PAGE 2"
 ;;^DD(.4044,10,21,7,0)
 ;;= 
 ;;^DD(.4044,10,21,8,0)
 ;;=would take the user to the field with unique name or caption "TEST FIELD
 ;;^DD(.4044,10,21,9,0)
 ;;=1" on the block named "TEST BLOCK 1" on a page named "TEST PAGE 2".
 ;;^DD(.4044,10,21,10,0)
 ;;= 
 ;;^DD(.4044,10,21,11,0)
 ;;=Alternatively, if you wish to take users to another page when they press
 ;;^DD(.4044,10,21,12,0)
 ;;=<RET> at this field, and then when they close that page, automatically
 ;;^DD(.4044,10,21,13,0)
 ;;=take them to the field immediately following this field, you can set
 ;;^DD(.4044,10,21,14,0)
 ;;=DDSSTACK equal to the page name or number of that page.
 ;;^DD(.4044,10,21,15,0)
 ;;= 

DINIT298
DINIT298 ;SFISC/MKO-FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT299
Q Q
 ;;^DD(.4044,10,21,16,0)
 ;;=The variable X contains the current internal value of the field, DDSEXT
 ;;^DD(.4044,10,21,17,0)
 ;;=contains the current external value of the field, and DDSOLD contains the
 ;;^DD(.4044,10,21,18,0)
 ;;=previous internal value of the field.
 ;;^DD(.4044,11,0)
 ;;=PRE ACTION^K^^11;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,11,3)
 ;;=Enter standard MUMPS code that will be executed when the user navigates to this field.
 ;;^DD(.4044,11,9)
 ;;=@
 ;;^DD(.4044,11,21,0)
 ;;=^^2^2^2940629^
 ;;^DD(.4044,11,21,1,0)
 ;;=This MUMPS code is executed when the user reaches the field.  The variable
 ;;^DD(.4044,11,21,2,0)
 ;;=X contains the current value of the field.
 ;;^DD(.4044,12,0)
 ;;=POST ACTION^K^^12;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,12,3)
 ;;=Enter standard MUMPS code that will be executed when the user leaves this field.
 ;;^DD(.4044,12,9)
 ;;=@
 ;;^DD(.4044,12,21,0)
 ;;=^^6^6^2950306^
 ;;^DD(.4044,12,21,1,0)
 ;;=This MUMPS code is executed when the user leaves the field, except on
 ;;^DD(.4044,12,21,2,0)
 ;;=time-out.
 ;;^DD(.4044,12,21,3,0)
 ;;= 
 ;;^DD(.4044,12,21,4,0)
 ;;=The variable X contains the current internal value of the field, DDSEXT
 ;;^DD(.4044,12,21,5,0)
 ;;=contains the current external value of the field, and DDSOLD contains
 ;;^DD(.4044,12,21,6,0)
 ;;=the previous internal value of the field.
 ;;^DD(.4044,12,"DT")
 ;;=2950306
 ;;^DD(.4044,13,0)
 ;;=POST ACTION ON CHANGE^K^^13;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,13,3)
 ;;=Enter standard MUMPS code that will be executed when the user changes the value of this field.
 ;;^DD(.4044,13,9)
 ;;=@
 ;;^DD(.4044,13,21,0)
 ;;=^^4^4^2940629^
 ;;^DD(.4044,13,21,1,0)
 ;;=This MUMPS code is executed only if the user changed the value of the
 ;;^DD(.4044,13,21,2,0)
 ;;=field.  The variables X and DDSEXT contain the new internal and external
 ;;^DD(.4044,13,21,3,0)
 ;;=values of the field, and DDSOLD contains the original internal value of
 ;;^DD(.4044,13,21,4,0)
 ;;=the field.
 ;;^DD(.4044,13,"DT")
 ;;=2931029
 ;;^DD(.4044,14,0)
 ;;=DATA VALIDATION^K^^14;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,14,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.4044,14,9)
 ;;=@
 ;;^DD(.4044,14,21,0)
 ;;=^^5^5^2940907^
 ;;^DD(.4044,14,21,1,0)
 ;;=Enter MUMPS code that will be executed after the user enters a new
 ;;^DD(.4044,14,21,2,0)
 ;;=value for this field.  If the code sets DDSERROR, the value will
 ;;^DD(.4044,14,21,3,0)
 ;;=be rejected.  You might also want to ring the bell and make a call to
 ;;^DD(.4044,14,21,4,0)
 ;;=HLP^DDSUTL to display a message to the user that indicates the reason the
 ;;^DD(.4044,14,21,5,0)
 ;;=value was rejected.
 ;;^DD(.4044,14,"DT")
 ;;=2930820
 ;;^DD(.4044,20.1,0)
 ;;=READ TYPE^S^D:DATE;F:FREE TEXT;L:LIST OR RANGE;N:NUMERIC;P:POINTER;S:SET OF CODES;Y:YES OR NO;DD:DATA DICTIONARY;^20;1^Q
 ;;^DD(.4044,20.1,21,0)
 ;;=^^1^1^2930812^^
 ;;^DD(.4044,20.1,21,1,0)
 ;;=Enter the data type of this form-only field.
 ;;^DD(.4044,20.1,"DT")
 ;;=2930812
 ;;^DD(.4044,20.2,0)
 ;;=PARAMETERS^F^^20;2^K:$L(X)>2!($L(X)<1) X
 ;;^DD(.4044,20.2,3)
 ;;=Answer must be 1-2 characters in length.
 ;;^DD(.4044,20.2,21,0)
 ;;=^^8^8^2940907^
 ;;^DD(.4044,20.2,21,1,0)
 ;;=This property coressponds to the parameters that can be used in the first
 ;;^DD(.4044,20.2,21,2,0)
 ;;=^-piece of the DIR(0) input variable to ^DIR.  The "O" parameter has no
 ;;^DD(.4044,20.2,21,3,0)
 ;;=effect, since the Required property can be used to make a field required.
 ;;^DD(.4044,20.2,21,4,0)
 ;;=The "A" and "B" parameters also have no effect.
 ;;^DD(.4044,20.2,21,5,0)
 ;;= 
 ;;^DD(.4044,20.2,21,6,0)
 ;;=Free text fields can use the "U" parameter.
 ;;^DD(.4044,20.2,21,7,0)
 ;;=List or Range fields can use the "C" parameter.
 ;;^DD(.4044,20.2,21,8,0)
 ;;=Set of Codes fields can use the "X" and "M" parameters.
 ;;^DD(.4044,20.2,"DT")
 ;;=2930812
 ;;^DD(.4044,20.3,0)
 ;;=QUALIFIERS^F^^20;3^K:$L(X)>100!($L(X)<1) X
 ;;^DD(.4044,20.3,3)
 ;;=Answer must be 1-100 characters in length.
 ;;^DD(.4044,20.3,21,0)
 ;;=^^14^14^2940908^^
 ;;^DD(.4044,20.3,21,1,0)
 ;;=This property corresponds to the second ^-piece of the DIR(0) input
 ;;^DD(.4044,20.3,21,2,0)
 ;;=variable to ^DIR.  For Data Dictionary type form only fields, it
 ;;^DD(.4044,20.3,21,3,0)
 ;;=identifies the file and field.
 ;;^DD(.4044,20.3,21,4,0)
 ;;= 
 ;;^DD(.4044,20.3,21,5,0)
 ;;=Valid qualifiers are:
 ;;^DD(.4044,20.3,21,6,0)
 ;;= 
 ;;^DD(.4044,20.3,21,7,0)
 ;;=  Date             Minimum date:Maximum date:%DT
 ;;^DD(.4044,20.3,21,8,0)
 ;;=  Free Text        Minimum length:Maximum length
 ;;^DD(.4044,20.3,21,9,0)
 ;;=  List or Range    Minimum:Maximum:Maximum decimals
 ;;^DD(.4044,20.3,21,10,0)
 ;;=  Numeric          Minimum:Maximum:Maximum decimals
 ;;^DD(.4044,20.3,21,11,0)
 ;;=  Pointer          Global root or #:DIC(0)
 ;;^DD(.4044,20.3,21,12,0)
 ;;=  Set of Codes     Code:Stands for;Code:Stands for;
 ;;^DD(.4044,20.3,21,13,0)
 ;;=  Yes or No
 ;;^DD(.4044,20.3,21,14,0)
 ;;=  Data Dictionary  file#,field#
 ;;^DD(.4044,20.3,"DT")
 ;;=2930812
 ;;^DD(.4044,21,0)
 ;;=HELP^.404421^^21;0
 ;;^DD(.4044,21,"DT")
 ;;=2930812
 ;;^DD(.4044,22,0)
 ;;=INPUT TRANSFORM^K^^22;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,22,3)
 ;;=Enter standard MUMPS code.
 ;;^DD(.4044,22,9)
 ;;=@
 ;;^DD(.4044,22,21,0)
 ;;=^^3^3^2940908^
 ;;^DD(.4044,22,21,1,0)
 ;;=This is MUMPS code that can examine X, the value entered by the user, and
 ;;^DD(.4044,22,21,2,0)
 ;;=kill X if it is invalid.  It corresponds to the third ^-piece of the
 ;;^DD(.4044,22,21,3,0)
 ;;=DIR(0) input variable to ^DIR.
 ;;^DD(.4044,22,"DT")
 ;;=2930812
 ;;^DD(.4044,23,0)
 ;;=SAVE CODE^K^^23;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,23,3)
 ;;=Enter Standard MUMPS code.
 ;;^DD(.4044,23,9)
 ;;=@
 ;;^DD(.4044,23,21,0)
 ;;=^^8^8^2930920^^
 ;;^DD(.4044,23,21,1,0)
 ;;=This is MUMPS code that is executed when the user issues a Save command
 ;;^DD(.4044,23,21,2,0)
 ;;=and the value of this field changed since the last Save.  You can use this
 ;;^DD(.4044,23,21,3,0)
 ;;=field to save in global or local variables the value the user enters into
 ;;^DD(.4044,23,21,4,0)
 ;;=this field.  The following variables are available:
 ;;^DD(.4044,23,21,5,0)
 ;;= 
 ;;^DD(.4044,23,21,6,0)
 ;;=     X      = The new value of the field in internal form
 ;;^DD(.4044,23,21,7,0)
 ;;=     DDSEXT = The new value of the field in external form
 ;;^DD(.4044,23,21,8,0)
 ;;=     DDSOLD = The original (pre-save) value of the field in internal form

DINIT299
DINIT299 ;SFISC/MKO-FORM AND BLOCK FILES ;10:49 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT29P
Q Q
 ;;^DD(.4044,23,"DT")
 ;;=2930812
 ;;^DD(.4044,24,0)
 ;;=SCREEN^K^^24;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.4044,24,3)
 ;;=Enter standard MUMPS code that sets the variable DIR("S").
 ;;^DD(.4044,24,9)
 ;;=@
 ;;^DD(.4044,24,21,0)
 ;;=^^4^4^2940908^
 ;;^DD(.4044,24,21,1,0)
 ;;=This screen is valid only for pointer and set-type form-only fields.
 ;;^DD(.4044,24,21,2,0)
 ;;= 
 ;;^DD(.4044,24,21,3,0)
 ;;=You can enter MUMPS code that sets the variable DIR("S"), to screen the
 ;;^DD(.4044,24,21,4,0)
 ;;=the values that can be selected.
 ;;^DD(.4044,24,"DT")
 ;;=2930812
 ;;^DD(.4044,30,0)
 ;;=COMPUTED EXPRESSION^FX^^30;E1,245^K:$L(X)>245!($L(X)<1) X I $D(X) D CEXPR^DDSIT
 ;;^DD(.4044,30,3)
 ;;=Answer must be 1-245 characters in length.
 ;;^DD(.4044,30,21,0)
 ;;=^^13^13^2940908^
 ;;^DD(.4044,30,21,1,0)
 ;;=You can enter MUMPS code that sets the variable Y equal to the value of
 ;;^DD(.4044,30,21,2,0)
 ;;=the computed field.  Alternatively, you can precede the computed
 ;;^DD(.4044,30,21,3,0)
 ;;=expression with an equal sign (=).
 ;;^DD(.4044,30,21,4,0)
 ;;= 
 ;;^DD(.4044,30,21,5,0)
 ;;=For example,
 ;;^DD(.4044,30,21,6,0)
 ;;= 
 ;;^DD(.4044,30,21,7,0)
 ;;=       S:$D(var)#2 Y="The value is: "_{NUMERIC}
 ;;^DD(.4044,30,21,8,0)
 ;;=       ={FIRST NAME}_" "_{LAST NAME}
 ;;^DD(.4044,30,21,9,0)
 ;;=       ={FO(PRICE)}*1.085
 ;;^DD(.4044,30,21,10,0)
 ;;= 
 ;;^DD(.4044,30,21,11,0)
 ;;=NUMERIC, FIRST NAME, and LAST NAME are the name of FileMan fields used on
 ;;^DD(.4044,30,21,12,0)
 ;;=the form, and PRICE is the caption of a form-only field found on the
 ;;^DD(.4044,30,21,13,0)
 ;;=current page and block of the form.
 ;;^DD(.4044,30,"DT")
 ;;=2931201
 ;;^DD(.404421,0)
 ;;=HELP SUB-FIELD^^.01^1
 ;;^DD(.404421,0,"DT")
 ;;=2930218
 ;;^DD(.404421,0,"NM","HELP")
 ;;=
 ;;^DD(.404421,0,"UP")
 ;;=.4044
 ;;^DD(.404421,.01,0)
 ;;=HELP^W^^0;1^Q
 ;;^DD(.404421,.01,21,0)
 ;;=^^3^3^2940908^
 ;;^DD(.404421,.01,21,1,0)
 ;;=This text is displayed when the user enters ? at this form-only field.
 ;;^DD(.404421,.01,21,2,0)
 ;;=The lines in this word processing field correspond to the nodes in the
 ;;^DD(.404421,.01,21,3,0)
 ;;=DIR("?",#) input array to ^DIR.
 ;;^DD(.404421,.01,"DT")
 ;;=2930812

DINIT29P
DINIT29P ;SFISC/MKO-SCREENMAN POSTINIT ;27NOV2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N B,F
 ;
 ;Delete the "AZ" global for each form. Starting in Version 22.0
 ;compiled data will be stored in ^DIST(.403,form#,"AY") instead of
 ;^DIST(.403,form#,"AZ")
 S F=0 F  S F=$O(^DIST(.403,F)) Q:F'=+$P(F,"E")  K ^DIST(.403,F,"AZ")
 ;
 ;Update Field Type field of fields on old blocks.
 ;Convert 0 or null to 3 (data dictionary field)
 S B=0 F  S B=$O(^DIST(.404,B)) Q:B'=+B  D
 . Q:$P($G(^DIST(.404,B,0)),U)?1"DDGF".E
 . S F=0 F  S F=$O(^DIST(.404,B,40,F)) Q:F'=+F  D
 .. Q:$D(^DIST(.404,B,40,F,0))[0
 .. S:'$P(^DIST(.404,B,40,F,0),U,3) $P(^(0),U,3)=3
 ;
 ;Rename two version 19 options
 I $P($G(^DIC(19,0)),U)="OPTION" D
 . D:$D(^DIC(19,"B","DDS CREATE FORM")) RENAME("DDS CREATE FORM","DDS EDIT/CREATE A FORM")
 . D:$D(^DIC(19,"B","DDS CREATE BLOCK")) RENAME("DDS CREATE BLOCK","DDS RUN A FORM")
AUD .;ADD ONE NEW AUDIT OPTION, REMOVE ANOTHER
 . D:'$D(^DIC(19,"B","DIAUDIT MONITOR USER"))
 ..N DIC,X,Y,DLAYGO
 ..S DIC="^DIC(19,",DLAYGO=19,X="DIAUDIT MONITOR USER",DIC(0)="L",DIC("DR")="1///Monitor a User;4///R;11///y;25///2^DIAU"
 ..D ^DIC Q:Y<0
 ..S ^DIC(19,+Y,1,0)="^19.06^2^2",^(1,0)="This Option allows tracking of a given user's access to entries in a",^DIC(19,+Y,1,2,0)="given (audited) File.  Display starts with a selected access date."
 .D:$D(^DIC(19,"B","DIAUDIT DD"))
 ..N DA,DIE,DR S DA=$O(^("DIAUDIT DD",0)),DIE=19,DR="2////NO LONGER FUNCTIONAL -- ALL DATA DICTIONARIES ARE NOW AUDITED" D ^DIE
 ;
 G ^DINIT2A0
 ;
RENAME(DDSOLD,DDSNEW) ;Rename options
 N DIC,X,Y
 S DIC="^DIC(19,",DIC(0)="Z",X=DDSOLD
 D ^DIC Q:Y<0
 ;
 N DIE,DA,DR
 S DIE=DIC,DA=+Y,DR=".01///"_DDSNEW
 D ^DIE
 Q
 ;
PRE ;ScreenMan pre-init
 ;Delete old forms and blocks used by FileMan
 N I
 S I=0 F  S I=$O(^DIST(.403,I)) Q:'I!(I'<1)  K ^DIST(.403,I)
 S I=0 F  S I=$O(^DIST(.404,I)) Q:'I!(I'<1)  K ^DIST(.404,I)
 Q

DINIT2A0
DINIT2A0 ;SFISC/MKO-KEY AND INDEX FILES ;10:50 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2A1
Q Q
 ;;^DIC(.11,0,"GL")
 ;;=^DD("IX",
 ;;^DIC("B","INDEX",.11)
 ;;=
 ;;^DIC(.11,"%D",0)
 ;;=^^5^5^2980911^
 ;;^DIC(.11,"%D",1,0)
 ;;=This file stores information about new-style cross-references defined on a
 ;;^DIC(.11,"%D",2,0)
 ;;=file. Whereas traditional cross-references are stored under the 1 nodes of
 ;;^DIC(.11,"%D",3,0)
 ;;=the ^DD for a particular field, new-style cross-references are stored in
 ;;^DIC(.11,"%D",4,0)
 ;;=this file and can consist of one field (simple cross-references), as well
 ;;^DIC(.11,"%D",5,0)
 ;;=as more than one field (compound cross-references).
 ;;^DD(.11,0)
 ;;=FIELD^^11.1^20
 ;;^DD(.11,0,"DDA")
 ;;=N
 ;;^DD(.11,0,"DT")
 ;;=2980908
 ;;^DD(.11,0,"ID","DI SHORT DESCRIPTION 50")
 ;;=D EN^DDIOL($E($P(^(0),U,3),1,50),"","?0")
 ;;^DD(.11,0,"IX","AC",.11,.51)
 ;;=
 ;;^DD(.11,0,"IX","B",.11,.01)
 ;;=
 ;;^DD(.11,0,"NM","INDEX")
 ;;=
 ;;^DD(.11,0,"PT",.31,3)
 ;;=
 ;;^DD(.11,.01,0)
 ;;=FILE^RNJ20,7^^0;1^K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."8N.N) X
 ;;^DD(.11,.01,1,0)
 ;;=^.1^^-1
 ;;^DD(.11,.01,1,1,0)
 ;;=.11^B
 ;;^DD(.11,.01,1,1,1)
 ;;=S ^DD("IX","B",$E(X,1,30),DA)=""
 ;;^DD(.11,.01,1,1,2)
 ;;=K ^DD("IX","B",$E(X,1,30),DA)
 ;;^DD(.11,.01,1,1,3)
 ;;=Lets developers pick indexes by file number
 ;;^DD(.11,.01,1,1,"%D",0)
 ;;=^^2^2^2980911^
 ;;^DD(.11,.01,1,1,"%D",1,0)
 ;;=The B index, on the .01 (File) of the Index file, lets developers pick
 ;;^DD(.11,.01,1,1,"%D",2,0)
 ;;=indexes by the numbers of the files they cross-reference.
 ;;^DD(.11,.01,3)
 ;;=Answer must be between 0 and 999999999999, with up to 7 decimal digits. Answer '??' for more help.
 ;;^DD(.11,.01,21,0)
 ;;=^^3^3^2980910^^
 ;;^DD(.11,.01,21,1,0)
 ;;=Answer should be the number of the file cross-referenced by this index.
 ;;^DD(.11,.01,21,2,0)
 ;;=For whole file cross-references on subfiles, answer with the number of
 ;;^DD(.11,.01,21,3,0)
 ;;=the file where the index physically resides, not the subfile number.
 ;;^DD(.11,.01,"DT")
 ;;=2980611
 ;;^DD(.11,.02,0)
 ;;=NAME^RF^^0;2^K:$L(X)>30!($L(X)<1)!'(X?1A.AN) X
 ;;^DD(.11,.02,1,0)
 ;;=^.1^^0
 ;;^DD(.11,.02,3)
 ;;=Answer must be 1-30 characters in length. Answer '??' for more help.
 ;;^DD(.11,.02,21,0)
 ;;=^^4^4^2980911^
 ;;^DD(.11,.02,21,1,0)
 ;;=Answer must be the name of the index. For example, the name of the default
 ;;^DD(.11,.02,21,2,0)
 ;;=lookup index on a file's .01 field is B, the name of the uniqueness index
 ;;^DD(.11,.02,21,3,0)
 ;;=of a compound key is BB, and the name of an index not used for lookup must
 ;;^DD(.11,.02,21,4,0)
 ;;=start with A.
 ;;^DD(.11,.02,"DT")
 ;;=2990303
 ;;^DD(.11,.1,0)
 ;;=DESCRIPTION^.1101^^.1;0
 ;;^DD(.11,.11,0)
 ;;=SHORT DESCRIPTION^RF^^0;3^K:$L(X)>79!($L(X)<1) X
 ;;^DD(.11,.11,3)
 ;;=Answer must be 1-79 characters in length. Answer '??' for more help.
 ;;^DD(.11,.11,21,0)
 ;;=^^2^2^2980910^
 ;;^DD(.11,.11,21,1,0)
 ;;=Answer should be text briefly explaining the function of this
 ;;^DD(.11,.11,21,2,0)
 ;;=cross-reference.
 ;;^DD(.11,.11,"DT")
 ;;=2960216
 ;;^DD(.11,.2,0)
 ;;=TYPE^RS^R:REGULAR;MU:MUMPS;^0;4^Q
 ;;^DD(.11,.2,3)
 ;;=Answer '??' for more help.
 ;;^DD(.11,.2,21,0)
 ;;=^^5^5^2980911^
 ;;^DD(.11,.2,21,1,0)
 ;;=REGULAR - One or more field values are stored in an index on the file. The
 ;;^DD(.11,.2,21,2,0)
 ;;=index can be used for sorting, or optionally, looking up entries.
 ;;^DD(.11,.2,21,3,0)
 ;;= 
 ;;^DD(.11,.2,21,4,0)
 ;;=MUMPS - Customizable M code executes whenever a field that makes up the
 ;;^DD(.11,.2,21,5,0)
 ;;=cross-references changes.
 ;;^DD(.11,.2,"DT")
 ;;=2970718
 ;;^DD(.11,.4,0)
 ;;=EXECUTION^RS^F:FIELD;R:RECORD;^0;6^Q
 ;;^DD(.11,.4,1,0)
 ;;=^.1^^0
 ;;^DD(.11,.4,3)
 ;;=Answer '??' for more help.
 ;;^DD(.11,.4,21,0)
 ;;=^^7^7^2980911^^
 ;;^DD(.11,.4,21,1,0)
 ;;=Answer with the code that indicates whether the cross reference logic
 ;;^DD(.11,.4,21,2,0)
 ;;=should be executed after a field in the index changes, or only after all
 ;;^DD(.11,.4,21,3,0)
 ;;=fields in a record are updated. The logic for most simple (single-field)
 ;;^DD(.11,.4,21,4,0)
 ;;=indexes should be executed immediately after the field changes, and so
 ;;^DD(.11,.4,21,5,0)
 ;;=should get the code 'F'. The logic for most compound indexes should be
 ;;^DD(.11,.4,21,6,0)
 ;;=executed only once after a transaction on the entire record is complete,
 ;;^DD(.11,.4,21,7,0)
 ;;=and so should get the code 'R'. Exceptions to this rule are rare.
 ;;^DD(.11,.4,"DT")
 ;;=2980611
 ;;^DD(.11,.41,0)
 ;;=ACTIVITY^FX^^0;7^K:$L(X)>2!($L(X)<1)!($TR(X,"IR")]"") X
 ;;^DD(.11,.41,3)
 ;;=Answer must be 2 characters in length. Answer '??' for more help.
 ;;^DD(.11,.41,21,0)
 ;;=^^15^15^2990225^
 ;;^DD(.11,.41,21,1,0)
 ;;=Answer with the flags that control whether FileMan fires this
 ;;^DD(.11,.41,21,2,0)
 ;;=cross-reference during an installation and a re-cross-referencing
 ;;^DD(.11,.41,21,3,0)
 ;;=operation. The possible flags are:
 ;;^DD(.11,.41,21,4,0)
 ;;= 
 ;;^DD(.11,.41,21,5,0)
 ;;=  I = Installing an entry at a site
 ;;^DD(.11,.41,21,6,0)
 ;;=  R = Re-cross-referencing this index
 ;;^DD(.11,.41,21,7,0)
 ;;= 
 ;;^DD(.11,.41,21,8,0)
 ;;=FileMan automatically fires cross-references during an edit, regardless of
 ;;^DD(.11,.41,21,9,0)
 ;;=Activity, though you can control whether a cross-reference is fired by
 ;;^DD(.11,.41,21,10,0)
 ;;=entering Set and Kill Conditions.
 ;;^DD(.11,.41,21,11,0)
 ;;= 
 ;;^DD(.11,.41,21,12,0)
 ;;=Also, if you explicity select a cross-reference in an EN^DIK, EN1^DIK, or
 ;;^DD(.11,.41,21,13,0)
 ;;=ENALL^DIK call, or in the UTILITY FUNCTIONS/RE-INDEX FILE option on the VA
 ;;^DD(.11,.41,21,14,0)
 ;;=FileMan menu, that cross-reference will be fired whether or not its
 ;;^DD(.11,.41,21,15,0)
 ;;=Activity contains an "R".
 ;;^DD(.11,.41,"DT")
 ;;=2980611
 ;;^DD(.11,.42,0)
 ;;=USE^S^LS:LOOKUP & SORTING;S:SORTING ONLY;A:ACTION;^0;14^Q
 ;;^DD(.11,.42,3)
 ;;=Controls how the index will be used by Classic FileMan Lookup (^DIC), Finder (FIND^DIC and $$FIND1^DIC) and Sort/Print (EN1^DIP). Answer '??' for more help.
 ;;^DD(.11,.42,21,0)
 ;;=^^15^15^2980911^^
 ;;^DD(.11,.42,21,1,0)
 ;;=LOOKUP & SORTING - The index name starts with "B" or a letter that
 ;;^DD(.11,.42,21,2,0)
 ;;=alphabetically follows "B".  Calls to Classic FileMan lookup (^DIC) or the
 ;;^DD(.11,.42,21,3,0)
 ;;=Finder (FIND^DIC or $$FIND1^DIC) where the index is not specified will
 ;;^DD(.11,.42,21,4,0)
 ;;=include this index in the search. The index will be available for use by

DINIT2A1
DINIT2A1 ;SFISC/MKO-KEY AND INDEX FILES ;8:42 AM  4 Jun 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2A2
Q Q
 ;;^DD(.11,.42,21,5,0)
 ;;=the FileMan Sort and Print (EN1^DIP).
 ;;^DD(.11,.42,21,6,0)
 ;;= 
 ;;^DD(.11,.42,21,7,0)
 ;;=SORTING ONLY - The index name starts with "A". Calls to Classic FileMan
 ;;^DD(.11,.42,21,8,0)
 ;;=lookup (^DIC) or the Finder (FIND^DIC or $$FIND1^DIC) will not use this
 ;;^DD(.11,.42,21,9,0)
 ;;=index unless it is specified in the input parameters. The index will be
 ;;^DD(.11,.42,21,10,0)
 ;;=available for use by the FileMan Sort and Print (EN1^DIP).
 ;;^DD(.11,.42,21,11,0)
 ;;= 
 ;;^DD(.11,.42,21,12,0)
 ;;=ACTION - The index name starts with "A". This is used for M code that
 ;;^DD(.11,.42,21,13,0)
 ;;=performs some actions and does NOT build an index. Therefore, it is not
 ;;^DD(.11,.42,21,14,0)
 ;;=available for use by either the Classic FileMan lookup (^DIC), the Finder
 ;;^DD(.11,.42,21,15,0)
 ;;=(FIND^DIC or $$FIND1^DIC) or the Sort and Print (EN1^DIP).
 ;;^DD(.11,.42,"DT")
 ;;=2980416
 ;;^DD(.11,.5,0)
 ;;=ROOT TYPE^S^I:INDEX FILE;W:WHOLE FILE;^0;8^Q
 ;;^DD(.11,.5,3)
 ;;=Answer '??' for more help.
 ;;^DD(.11,.5,21,0)
 ;;=^^6^6^2980911^
 ;;^DD(.11,.5,21,1,0)
 ;;=Answer 'I' if the fields that make up the file are defined at the same
 ;;^DD(.11,.5,21,2,0)
 ;;=level at which the index is located.
 ;;^DD(.11,.5,21,3,0)
 ;;= 
 ;;^DD(.11,.5,21,4,0)
 ;;=Answer 'W' if this is a whole file cross-reference in which the fields
 ;;^DD(.11,.5,21,5,0)
 ;;=that make up the index are defined in a subfile, but the index is
 ;;^DD(.11,.5,21,6,0)
 ;;=physically located at a parent file level.
 ;;^DD(.11,.5,"DT")
 ;;=2980908
 ;;^DD(.11,.51,0)
 ;;=ROOT FILE^RNJ20,7^^0;9^K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."8N.N) X
 ;;^DD(.11,.51,1,0)
 ;;=^.1
 ;;^DD(.11,.51,1,1,0)
 ;;=.11^AC
 ;;^DD(.11,.51,1,1,1)
 ;;=S ^DD("IX","AC",$E(X,1,30),DA)=""
 ;;^DD(.11,.51,1,1,2)
 ;;=K ^DD("IX","AC",$E(X,1,30),DA)
 ;;^DD(.11,.51,1,1,3)
 ;;=Lets FileMan find indexes defined on fields from a particular file
 ;;^DD(.11,.51,1,1,"DT")
 ;;=2980929
 ;;^DD(.11,.51,3)
 ;;=Type a Number between 0 and 999999999999, 7 Decimal Digits. Answer '??' for more help.
 ;;^DD(.11,.51,21,0)
 ;;=^^3^3^2980910^
 ;;^DD(.11,.51,21,1,0)
 ;;=Answer with the number of the file or subfile where this index is defined.
 ;;^DD(.11,.51,21,2,0)
 ;;=For whole file indexes, answer with the subfile number, not the number of
 ;;^DD(.11,.51,21,3,0)
 ;;=the file where the index physically resides.
 ;;^DD(.11,.51,"DT")
 ;;=2980929
 ;;^DD(.11,1.1,0)
 ;;=SET LOGIC^RK^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.11,1.1,3)
 ;;=Answer must be Standard M code. Answer '??' for more help.
 ;;^DD(.11,1.1,9)
 ;;=@
 ;;^DD(.11,1.1,21,0)
 ;;=^^16^16^2990430^^
 ;;^DD(.11,1.1,21,1,0)
 ;;=Answer with the M code that FileMan should execute when the values of
 ;;^DD(.11,1.1,21,2,0)
 ;;=fields that make up the cross-reference are set or changed. When field
 ;;^DD(.11,1.1,21,3,0)
 ;;=values are changed, FileMan executes first the KILL LOGIC, then the SET
 ;;^DD(.11,1.1,21,4,0)
 ;;=LOGIC.
 ;;^DD(.11,1.1,21,5,0)
 ;;= 
 ;;^DD(.11,1.1,21,6,0)
 ;;=Assume the DA array describes the record to be cross-referenced, and that
 ;;^DD(.11,1.1,21,7,0)
 ;;=the X(order#) array contains values after the transform for storage is
 ;;^DD(.11,1.1,21,8,0)
 ;;=applied, but before the truncation to the maximum length.  The variable X
 ;;^DD(.11,1.1,21,9,0)
 ;;=also equals X(order#) of the lowest order number.
 ;;^DD(.11,1.1,21,10,0)
 ;;= 
 ;;^DD(.11,1.1,21,11,0)
 ;;=When fields that make up a cross-reference are edited and the kill and set
 ;;^DD(.11,1.1,21,12,0)
 ;;=logic are executed, the X1(order#) array contains the old field values,
 ;;^DD(.11,1.1,21,13,0)
 ;;=and the X2(order#) array contains the new field values. If a record is
 ;;^DD(.11,1.1,21,14,0)
 ;;=being added, and there is an X1(order#) array element that corresponds to
 ;;^DD(.11,1.1,21,15,0)
 ;;=the .01 field, it is set to null. When a record is deleted, all X2(order#)
 ;;^DD(.11,1.1,21,16,0)
 ;;=array elements are null.
 ;;^DD(.11,1.1,"DT")
 ;;=2960116
 ;;^DD(.11,1.2,0)
 ;;=OVERFLOW SET LOGIC^.111^^1.2;0
 ;;^DD(.11,1.2,"DT")
 ;;=2960124
 ;;^DD(.11,1.3,0)
 ;;=SET CONDITION^F^^1.3;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.11,1.3,3)
 ;;=Answer must be a valid FileMan computed expression. Answer '??' for more help.
 ;;^DD(.11,1.3,21,0)
 ;;=^^5^5^2960124^
 ;;^DD(.11,1.3,21,1,0)
 ;;=Answer with a FileMan computed expression that will evaluate to Boolean
 ;;^DD(.11,1.3,21,2,0)
 ;;=true (according to the M rules for Boolean interpretation). FileMan will
 ;;^DD(.11,1.3,21,3,0)
 ;;=evaluate this expression whenever it would normally execute the
 ;;^DD(.11,1.3,21,4,0)
 ;;=cross-reference's Set Logic, and will not execute the Set Logic unless
 ;;^DD(.11,1.3,21,5,0)
 ;;=this condition evaluates to true.
 ;;^DD(.11,1.3,"DT")
 ;;=2960116
 ;;^DD(.11,1.4,0)
 ;;=SET CONDITION CODE^K^^1.4;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.11,1.4,3)
 ;;=This is Standard MUMPS code. Answer '??' for more help.
 ;;^DD(.11,1.4,9)
 ;;=@
 ;;^DD(.11,1.4,21,0)
 ;;=^^15^15^2990430^
 ;;^DD(.11,1.4,21,1,0)
 ;;=This is MUMPS code that sets the variable X. The SET LOGIC is executed
 ;;^DD(.11,1.4,21,2,0)
 ;;=only if the SET CONDTION, if present, sets X to Boolean true (according to
 ;;^DD(.11,1.4,21,3,0)
 ;;=M rules for Boolean interpretation).
 ;;^DD(.11,1.4,21,4,0)
 ;;= 
 ;;^DD(.11,1.4,21,5,0)
 ;;=Assume the DA array describes the record to be cross-referenced, and that
 ;;^DD(.11,1.4,21,6,0)
 ;;=the X(order#) array contains values after the transform for storage is
 ;;^DD(.11,1.4,21,7,0)
 ;;=applied, but before the truncation to the maximum length.  The variable X
 ;;^DD(.11,1.4,21,8,0)
 ;;=also equals X(order#) of the lowest order number.
 ;;^DD(.11,1.4,21,9,0)
 ;;= 
 ;;^DD(.11,1.4,21,10,0)
 ;;=When fields that make up a cross-reference are edited and the kill and set
 ;;^DD(.11,1.4,21,11,0)
 ;;=conditions are executed, the X1(order#) array contains the old field
 ;;^DD(.11,1.4,21,12,0)
 ;;=values, and the X2(order#) array contains the new field values. If a
 ;;^DD(.11,1.4,21,13,0)
 ;;=record is being added, and there is an X1(order#) array element that
 ;;^DD(.11,1.4,21,14,0)
 ;;=corresponds to the .01 field, it is set to null. When a record is deleted,
 ;;^DD(.11,1.4,21,15,0)
 ;;=all X2(order#) array elements are null.
 ;;^DD(.11,1.4,"DT")
 ;;=2970117
 ;;^DD(.11,2.1,0)
 ;;=KILL LOGIC^RK^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.11,2.1,3)
 ;;=Answer must be Standard M code. Answer '??' for more help.

DINIT2A2
DINIT2A2 ;SFISC/MKO-KEY AND INDEX FILES ;11:29 AM  19 Nov 2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2A3
Q Q
 ;;^DD(.11,2.1,9)
 ;;=@
 ;;^DD(.11,2.1,21,0)
 ;;=^^16^16^2990430^
 ;;^DD(.11,2.1,21,1,0)
 ;;=Answer with the M code that FileMan should execute when the values of
 ;;^DD(.11,2.1,21,2,0)
 ;;=fields that make up the cross-reference are changed or deleted. When field
 ;;^DD(.11,2.1,21,3,0)
 ;;=values are changed, FileMan executes first the KILL LOGIC, then the SET
 ;;^DD(.11,2.1,21,4,0)
 ;;=LOGIC.
 ;;^DD(.11,2.1,21,5,0)
 ;;=
 ;;^DD(.11,2.1,21,6,0)
 ;;=Assume the DA array describes the record to be cross-referenced, and that
 ;;^DD(.11,2.1,21,7,0)
 ;;=the X(order#) array contains values after the transform for storage is
 ;;^DD(.11,2.1,21,8,0)
 ;;=applied, but before the truncation to the maximum length.  The variable X
 ;;^DD(.11,2.1,21,9,0)
 ;;=also equals X(order#) of the lowest order number.
 ;;^DD(.11,2.1,21,10,0)
 ;;=
 ;;^DD(.11,2.1,21,11,0)
 ;;=When fields that make up a cross-reference are edited and the kill and set
 ;;^DD(.11,2.1,21,12,0)
 ;;=logic are executed, the X1(order#) array contains the old field values,
 ;;^DD(.11,2.1,21,13,0)
 ;;=and the X2(order#) array contains the new field values. If a record is
 ;;^DD(.11,2.1,21,14,0)
 ;;=being added, and there is an X1(order#) array element that corresponds to
 ;;^DD(.11,2.1,21,15,0)
 ;;=the .01 field, it is set to null. When a record is deleted, all X2(order#)
 ;;^DD(.11,2.1,21,16,0)
 ;;=array elements are null.
 ;;^DD(.11,2.1,"DT")
 ;;=2960116
 ;;^DD(.11,2.2,0)
 ;;=OVERFLOW KILL LOGIC^.112^^2.2;0
 ;;^DD(.11,2.2,"DT")
 ;;=2960124
 ;;^DD(.11,2.3,0)
 ;;=KILL CONDITION^F^^2.3;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.11,2.3,3)
 ;;=Answer must be a valid FileMan computed expression. Answer '??' for more help.
 ;;^DD(.11,2.3,21,0)
 ;;=^^5^5^2960124^
 ;;^DD(.11,2.3,21,1,0)
 ;;=Answer with a FileMan computed expression that will evaluate to Boolean
 ;;^DD(.11,2.3,21,2,0)
 ;;=true (according to the M rules for Boolean interpretation). FileMan will
 ;;^DD(.11,2.3,21,3,0)
 ;;=evaluate this expression whenever it would normally execute the
 ;;^DD(.11,2.3,21,4,0)
 ;;=cross-reference's Kill Logic, and will not execute the Kill Logic unless
 ;;^DD(.11,2.3,21,5,0)
 ;;=this condition evaluates to true.
 ;;^DD(.11,2.3,"DT")
 ;;=2960116
 ;;^DD(.11,2.4,0)
 ;;=KILL CONDITION CODE^K^^2.4;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.11,2.4,3)
 ;;=This is Standard MUMPS code. Answer '??' for more help.
 ;;^DD(.11,2.4,9)
 ;;=@
 ;;^DD(.11,2.4,21,0)
 ;;=^^15^15^2990430^
 ;;^DD(.11,2.4,21,1,0)
 ;;=This is MUMPS code, that sets the variable X. The KILL LOGIC is executed
 ;;^DD(.11,2.4,21,2,0)
 ;;=only if the KILL CONDITION, if present, sets X such the X evaluates to
 ;;^DD(.11,2.4,21,3,0)
 ;;=true,  (according to M rules for Boolean interpretation)
 ;;^DD(.11,2.4,21,4,0)
 ;;= 
 ;;^DD(.11,2.4,21,5,0)
 ;;=Assume the DA array describes the record to be cross-referenced, and that
 ;;^DD(.11,2.4,21,6,0)
 ;;=the X(order#) array contains values after the transform for storage is
 ;;^DD(.11,2.4,21,7,0)
 ;;=applied, but before the truncation to the maximum length.  The variable X
 ;;^DD(.11,2.4,21,8,0)
 ;;=also equals X(order#) of the lowest order number.
 ;;^DD(.11,2.4,21,9,0)
 ;;=
 ;;^DD(.11,2.4,21,10,0)
 ;;=When fields that make up a cross-reference are edited and the kill and set
 ;;^DD(.11,2.4,21,11,0)
 ;;=conditions are executed, the X1(order#) array contains the old field
 ;;^DD(.11,2.4,21,12,0)
 ;;=values, and the X2(order#) array contains the new field values. If a
 ;;^DD(.11,2.4,21,13,0)
 ;;=record is being added, and there is an X1(order#) array element that
 ;;^DD(.11,2.4,21,14,0)
 ;;=corresponds to the .01 field, it is set to null. When a record is deleted,
 ;;^DD(.11,2.4,21,15,0)
 ;;=all X2(order#) array elements are null.
 ;;^DD(.11,2.4,"DT")
 ;;=2970117
 ;;^DD(.11,2.5,0)
 ;;=KILL ENTIRE INDEX CODE^K^^2.5;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.11,2.5,3)
 ;;=This is Standard MUMPS code. Answer '??' for more help.
 ;;^DD(.11,2.5,9)
 ;;=@
 ;;^DD(.11,2.5,21,0)
 ;;=^^4^4^2980911^
 ;;^DD(.11,2.5,21,1,0)
 ;;=This is a kill statement that can be executed to remove an entire index for
 ;;^DD(.11,2.5,21,2,0)
 ;;=all records in a file. When an entire file is reindexed, FileMan executes
 ;;^DD(.11,2.5,21,3,0)
 ;;=this code instead of looping through all the entries in a file and
 ;;^DD(.11,2.5,21,4,0)
 ;;=executing the kill logic once for each entry.
 ;;^DD(.11,666,0)
 ;;=RE-INDEXING^SI^1:NO RE-INDEXING ALLOWED;0:ALLOW REINDEXING^NOREINDEX;1
 ;;^DD(.11,666,3)
 ;;=Should the re-indexing of this cross reference be prohibited?
 ;;^DD(.11,666,21,0)
 ;;=^^5^5
 ;;^DD(.11,666,21,1,0)
 ;;=If you answer '1', this cross reference will not be re-indexed during a
 ;;^DD(.11,666,21,2,0)
 ;;=general re-indexing of this file, whether it's done via API or
 ;;^DD(.11,666,21,3,0)
 ;;=interactively. If you answer '0', which is the default, it will.
 ;;^DD(.11,666,21,4,0)
 ;;=A 'NO RE-INDEXING' cross-reference will ONLY be re-indexed
 ;;^DD(.11,666,21,5,0)
 ;;=if it is specifically named in an API call
 ;;^DD(.11,11.1,0)
 ;;=CROSS-REFERENCE VALUES^.114IA^^11.1;0
 ;;^DD(.11,11.1,"DT")
 ;;=2960221
 ;;^DD(.1101,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.1101,0,"DT")
 ;;=2960116
 ;;^DD(.1101,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.1101,0,"UP")
 ;;=.11
 ;;^DD(.1101,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.1101,.01,3)
 ;;=Answer '??' for more help.
 ;;^DD(.1101,.01,21,0)
 ;;=^^3^3^2960123^
 ;;^DD(.1101,.01,21,1,0)
 ;;=Answer should describe the purpose of this index, along with any technical
 ;;^DD(.1101,.01,21,2,0)
 ;;=information that might be useful to advanced users, developers,
 ;;^DD(.1101,.01,21,3,0)
 ;;=troubleshooters, or system managers.
 ;;^DD(.1101,.01,"DT")
 ;;=2960116
 ;;^DD(.111,0)
 ;;=OVERFLOW SET LOGIC SUB-FIELD^^1^2
 ;;^DD(.111,0,"DT")
 ;;=2960124
 ;;^DD(.111,0,"NM","OVERFLOW SET LOGIC")
 ;;=
 ;;^DD(.111,0,"UP")
 ;;=.11
 ;;^DD(.111,.01,0)
 ;;=OVERFLOW SET LOGIC NODE^MNJ6,0X^^0;1^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X S:$D(X) DINUM=X
 ;;^DD(.111,.01,3)
 ;;=Type a Number between 1 and 999999, 0 Decimal Digits. Answer '??' for more help.
 ;;^DD(.111,.01,21,0)
 ;;=^^3^3^2980911^
 ;;^DD(.111,.01,21,1,0)
 ;;=Answer must be the number of the node under which the additional line of
 ;;^DD(.111,.01,21,2,0)
 ;;=set logic will be filed. Use the overflow nodes if the set logic is too
 ;;^DD(.111,.01,21,3,0)
 ;;=long to fit in the SET LOGIC field.
 ;;^DD(.111,.01,"DT")
 ;;=2980910
 ;;^DD(.111,1,0)
 ;;=OVERFLOW SET LOGIC^RK^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.111,1,3)
 ;;=Answer must be Standard M code. Answer '??' for more help.
 ;;^DD(.111,1,9)
 ;;=@
 ;;^DD(.111,1,21,0)
 ;;=^^6^6^2980911^
 ;;^DD(.111,1,21,1,0)
 ;;=Answer with the M code of the additional set logic stored at this node.
 ;;^DD(.111,1,21,2,0)
 ;;=FileMan will not automatically execute this additional code, so the set
 ;;^DD(.111,1,21,3,0)
 ;;=logic must invoke the additional code stored in this overflow node.
 ;;^DD(.111,1,21,4,0)
 ;;=
 ;;^DD(.111,1,21,5,0)
 ;;=The M code can assume that DIXR contains the internal entry number of the

DINIT2A3
DINIT2A3 ;SFISC/MKO-KEY AND INDEX FILES ;3:21 PM  25 Apr 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2A4
Q Q
 ;;^DD(.111,1,21,6,0)
 ;;=Index file entry.
 ;;^DD(.111,1,"DT")
 ;;=2960124
 ;;^DD(.112,0)
 ;;=OVERFLOW KILL LOGIC SUB-FIELD^^2^2
 ;;^DD(.112,0,"DT")
 ;;=2960124
 ;;^DD(.112,0,"NM","OVERFLOW KILL LOGIC")
 ;;=
 ;;^DD(.112,0,"UP")
 ;;=.11
 ;;^DD(.112,.01,0)
 ;;=OVERFLOW KILL LOGIC NODE^MNJ6,0X^^0;1^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X S:$D(X) DINUM=X
 ;;^DD(.112,.01,3)
 ;;=Type a Number between 1 and 999999, 0 Decimal Digits. Answer '??' for more help.
 ;;^DD(.112,.01,21,0)
 ;;=^^3^3^2980911^
 ;;^DD(.112,.01,21,1,0)
 ;;=Answer must be the number of the node under which the additional line of
 ;;^DD(.112,.01,21,2,0)
 ;;=Set Logic will be filed. Use the overflow nodes if the kill logic is too
 ;;^DD(.112,.01,21,3,0)
 ;;=long to fit in the KILL LOGIC field.
 ;;^DD(.112,.01,"DT")
 ;;=2980910
 ;;^DD(.112,2,0)
 ;;=OVERFLOW KILL LOGIC^RK^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.112,2,3)
 ;;=Answer must be Standard M code. Answer '??' for more help.
 ;;^DD(.112,2,9)
 ;;=@
 ;;^DD(.112,2,21,0)
 ;;=^^6^6^2980911^
 ;;^DD(.112,2,21,1,0)
 ;;=Answer with the M code of the additional kill logic stored at this node.
 ;;^DD(.112,2,21,2,0)
 ;;=FileMan will not automatically execute this additional code, so the kill
 ;;^DD(.112,2,21,3,0)
 ;;=logic must invoke the additional code stored in this overflow node.
 ;;^DD(.112,2,21,4,0)
 ;;= 
 ;;^DD(.112,2,21,5,0)
 ;;=The M code can assume that DIXR contains the internal entry number of the
 ;;^DD(.112,2,21,6,0)
 ;;=Index file entry.
 ;;^DD(.112,2,"DT")
 ;;=2960124
 ;;^DD(.114,0)
 ;;=CROSS-REFERENCE VALUES SUB-FIELD^^8^12
 ;;^DD(.114,0,"DT")
 ;;=2980723
 ;;^DD(.114,0,"ID",1)
 ;;=W ""
 ;;^DD(.114,0,"IX","B",.114,.01)
 ;;=
 ;;^DD(.114,0,"NM","CROSS-REFERENCE VALUES")
 ;;=
 ;;^DD(.114,0,"UP")
 ;;=.11
 ;;^DD(.114,.01,0)
 ;;=ORDER NUMBER^MNJ3,0^^0;1^K:+X'=X!(X>125)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.114,.01,1,0)
 ;;=^.1
 ;;^DD(.114,.01,1,1,0)
 ;;=.114^B
 ;;^DD(.114,.01,1,1,1)
 ;;=S ^DD("IX",DA(1),11.1,"B",$E(X,1,30),DA)=""
 ;;^DD(.114,.01,1,1,2)
 ;;=K ^DD("IX",DA(1),11.1,"B",$E(X,1,30),DA)
 ;;^DD(.114,.01,1,1,"DT")
 ;;=2970320
 ;;^DD(.114,.01,3)
 ;;=Type a Number between 1 and 125, 0 Decimal Digits. Answer '??' for more help.
 ;;^DD(.114,.01,21,0)
 ;;=^^6^6^2980911^
 ;;^DD(.114,.01,21,1,0)
 ;;=Answer must be the order number of this cross-reference value.
 ;;^DD(.114,.01,21,2,0)
 ;;= 
 ;;^DD(.114,.01,21,3,0)
 ;;=FileMan evaluates cross-reference values by order of "Order Number" and
 ;;^DD(.114,.01,21,4,0)
 ;;=places each value in the X(order#) array. The set and kill logic, for
 ;;^DD(.114,.01,21,5,0)
 ;;=example, can use X(2) to refer to the cross-reference value with order
 ;;^DD(.114,.01,21,6,0)
 ;;=number 2.
 ;;^DD(.114,.01,"DEL",1,0)
 ;;=I $P($G(DDS),U,2)="DIKC EDIT" D BLDLOG^DIKCFORM(DA(1)) S DIKCREB=1 I 0
 ;;^DD(.114,.01,"DT")
 ;;=3020425
 ;;^DD(.114,.5,0)
 ;;=SUBSCRIPT NUMBER^NJ3,0^^0;6^K:+X'=X!(X>125)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.114,.5,1,0)
 ;;=^.1^^0
 ;;^DD(.114,.5,3)
 ;;=Type a Number between 1 and 125, 0 Decimal Digits. Answer '??' for more help.
 ;;^DD(.114,.5,21,0)
 ;;=^^3^3^2980911^
 ;;^DD(.114,.5,21,1,0)
 ;;=If this cross-reference value is used as a subscript in an index, enter
 ;;^DD(.114,.5,21,2,0)
 ;;=the subscript position number. The first subscript to the right of the
 ;;^DD(.114,.5,21,3,0)
 ;;=index name is subscript number 1.
 ;;^DD(.114,.5,"DT")
 ;;=2980611
 ;;^DD(.114,1,0)
 ;;=TYPE OF VALUE^RS^F:FIELD;C:COMPUTED VALUE;^0;2^Q
 ;;^DD(.114,1,3)
 ;;=Answer '??' for more help.
 ;;^DD(.114,1,21,0)
 ;;=^^4^4^2980911^
 ;;^DD(.114,1,21,1,0)
 ;;=Answer 'F' if this cross-reference value is based on the value of a field.
 ;;^DD(.114,1,21,2,0)
 ;;= 
 ;;^DD(.114,1,21,3,0)
 ;;=Answer 'C' if this cross-reference value should be determined by executing
 ;;^DD(.114,1,21,4,0)
 ;;=the COMPUTED CODE.
 ;;^DD(.114,1,"DT")
 ;;=2960116
 ;;^DD(.114,2,0)
 ;;=FILE^NJ20,7^^0;3^K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."8N.N) X
 ;;^DD(.114,2,3)
 ;;=Answer must be between 0 and 999999999999, with up to 7 decimal digits. Answer '??' for more help.
 ;;^DD(.114,2,21,0)
 ;;=^^2^2^2980910^
 ;;^DD(.114,2,21,1,0)
 ;;=If this cross-reference value is a field value, answer with the number of
 ;;^DD(.114,2,21,2,0)
 ;;=the file or subfile in which this field is defined.
 ;;^DD(.114,2,"DT")
 ;;=2960116
 ;;^DD(.114,3,0)
 ;;=FIELD^NJ20,7X^^0;4^D ITFLD^DIKCDD I $D(X) K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."8N.N) X
 ;;^DD(.114,3,3)
 ;;=Type a Number between 0 and 999999999999, 7 Decimal Digits. Answer '??' for more help.
 ;;^DD(.114,3,4)
 ;;=D EHFLD^DIKCDD
 ;;^DD(.114,3,21,0)
 ;;=^^1^1^2980910^^
 ;;^DD(.114,3,21,1,0)
 ;;=If this cross-reference value is a field, answer with the field number.
 ;;^DD(.114,3,"DT")
 ;;=2970902
 ;;^DD(.114,4,0)
 ;;=COMPUTED VALUE^F^^1;1^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.114,4,3)
 ;;=Answer must be a valid FileMan computed expression. Answer '??' for more help.
 ;;^DD(.114,4,21,0)
 ;;=^^2^2^2960221^
 ;;^DD(.114,4,21,1,0)
 ;;=If this cross-reference value is computed, answer with the computed
 ;;^DD(.114,4,21,2,0)
 ;;=expression that evaluates to it.
 ;;^DD(.114,4,"DT")
 ;;=2960219
 ;;^DD(.114,4.5,0)
 ;;=COMPUTED CODE^K^^1.5;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.114,4.5,3)
 ;;=This is Standard MUMPS code. Answer '??' for more help.
 ;;^DD(.114,4.5,9)
 ;;=@
 ;;^DD(.114,4.5,21,0)
 ;;=^^3^3^2990401^
 ;;^DD(.114,4.5,21,1,0)
 ;;=Answer with M code that sets X equal to the cross-reference value. The
 ;;^DD(.114,4.5,21,2,0)
 ;;=X(order#) array is available for those cross-reference values with lower
 ;;^DD(.114,4.5,21,3,0)
 ;;=Order Numbers, and the DA array describes the IEN of the current record.
 ;;^DD(.114,4.5,"DT")
 ;;=2960221
 ;;^DD(.114,5,0)
 ;;=TRANSFORM FOR STORAGE^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.114,5,3)
 ;;=This is Standard M code. Answer '??' for more help.
 ;;^DD(.114,5,9)
 ;;=@
 ;;^DD(.114,5,21,0)
 ;;=^^14^14^3000106^
 ;;^DD(.114,5,21,1,0)
 ;;=Used only when setting or killing an entry in the index.
 ;;^DD(.114,5,21,2,0)
 ;;= 
 ;;^DD(.114,5,21,3,0)
 ;;=Answer should be M code that sets the variable X to a new value. X is the
 ;;^DD(.114,5,21,4,0)
 ;;=only input variable that is guaranteed to be defined and is equal to the
 ;;^DD(.114,5,21,5,0)
 ;;=internal value of the field.
 ;;^DD(.114,5,21,6,0)
 ;;= 
 ;;^DD(.114,5,21,7,0)
 ;;=TRANSFORM FOR STORAGE can be used on field-type cross-reference values to
 ;;^DD(.114,5,21,8,0)
 ;;=transform the internal value of the field before it is stored as a
 ;;^DD(.114,5,21,9,0)
 ;;=subscript in the index.
 ;;^DD(.114,5,21,10,0)
 ;;= 
 ;;^DD(.114,5,21,11,0)
 ;;=If a match is made on this index during a lookup, then in order to
 ;;^DD(.114,5,21,12,0)
 ;;=properly display the resulting index value to the user, the developer may
 ;;^DD(.114,5,21,13,0)
 ;;=need to enter code into the TRANSFORM FOR DISPLAY field to transform the
 ;;^DD(.114,5,21,14,0)
 ;;=index value back to a displayable format.
 ;;^DD(.114,5,"DT")
 ;;=2980731

DINIT2A4
DINIT2A4 ;SFISC/MKO-KEY AND INDEX FILES ;3:01 PM  10 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2A5
Q Q
 ;;^DD(.114,5.3,0)
 ;;=TRANSFORM FOR LOOKUP^K^^4;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.114,5.3,3)
 ;;=This is Standard MUMPS code. Answer '??' for more help.
 ;;^DD(.114,5.3,9)
 ;;=@
 ;;^DD(.114,5.3,21,0)
 ;;=^^10^10^3000106^
 ;;^DD(.114,5.3,21,1,0)
 ;;=Used only during lookup.
 ;;^DD(.114,5.3,21,2,0)
 ;;= 
 ;;^DD(.114,5.3,21,3,0)
 ;;=Answer should be M code that sets the variable X to a new value. X is the
 ;;^DD(.114,5.3,21,4,0)
 ;;=only input variable that is guaranteed to be defined and is equal to the
 ;;^DD(.114,5.3,21,5,0)
 ;;=lookup value entered by the user.
 ;;^DD(.114,5.3,21,6,0)
 ;;= 
 ;;^DD(.114,5.3,21,7,0)
 ;;=During lookup, if the lookup value is not found in the index, FileMan will
 ;;^DD(.114,5.3,21,8,0)
 ;;=execute the TRANSFORM FOR LOOKUP code to transform the lookup value X. It
 ;;^DD(.114,5.3,21,9,0)
 ;;=will then search this index looking for a match to the transformed lookup
 ;;^DD(.114,5.3,21,10,0)
 ;;=value.
 ;;^DD(.114,5.3,"DT")
 ;;=3000105
 ;;^DD(.114,5.5,0)
 ;;=TRANSFORM FOR DISPLAY^K^^3;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.114,5.5,3)
 ;;=This is Standard MUMPS code. Answer '??' for more help.
 ;;^DD(.114,5.5,9)
 ;;=@
 ;;^DD(.114,5.5,21,0)
 ;;=^^16^16^3000106^
 ;;^DD(.114,5.5,21,1,0)
 ;;=Used only during lookup.
 ;;^DD(.114,5.5,21,2,0)
 ;;= 
 ;;^DD(.114,5.5,21,3,0)
 ;;=Answer should be M code that sets the variable X to a new value. X is the
 ;;^DD(.114,5.5,21,4,0)
 ;;=only variable that is guaranteed to be defined and is equal to the value
 ;;^DD(.114,5.5,21,5,0)
 ;;=of the subscript from the index.
 ;;^DD(.114,5.5,21,6,0)
 ;;= 
 ;;^DD(.114,5.5,21,7,0)
 ;;=TRANSFORM FOR DISPLAY should be set only for an index value that has been
 ;;^DD(.114,5.5,21,8,0)
 ;;=transformed using the code in the TRANSFORM FOR STORAGE prior to storing
 ;;^DD(.114,5.5,21,9,0)
 ;;=the value in the index.
 ;;^DD(.114,5.5,21,10,0)
 ;;= 
 ;;^DD(.114,5.5,21,11,0)
 ;;=The code should take the internal value from the index subscript X, and
 ;;^DD(.114,5.5,21,12,0)
 ;;=convert it back to a format that can be displayed to an end user.  During
 ;;^DD(.114,5.5,21,13,0)
 ;;=lookup, if a match or matches are made to a lookup value that was
 ;;^DD(.114,5.5,21,14,0)
 ;;=transformed using the TRANSFORM FOR LOOKUP code on this index, then
 ;;^DD(.114,5.5,21,15,0)
 ;;=FileMan will execute the TRANSFORM FOR DISPLAY code before displaying the
 ;;^DD(.114,5.5,21,16,0)
 ;;=index value(s) to the end user.
 ;;^DD(.114,5.5,"DT")
 ;;=2980731
 ;;^DD(.114,6,0)
 ;;=MAXIMUM LENGTH^NJ3,0^^0;5^K:+X'=X!(X>240)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.114,6,3)
 ;;=Answer must be between 1 and 240, with no decimal digits. Answer '??' for more help.
 ;;^DD(.114,6,21,0)
 ;;=^^7^7^2980911^
 ;;^DD(.114,6,21,1,0)
 ;;=Answer must be the maximum length this cross-reference value should have
 ;;^DD(.114,6,21,2,0)
 ;;=when stored as a subscript in the index. FileMan's lookup utilties
 ;;^DD(.114,6,21,3,0)
 ;;=account for lookup values longer than the maximum length.
 ;;^DD(.114,6,21,4,0)
 ;;= 
 ;;^DD(.114,6,21,5,0)
 ;;=Specify a MAXIMUM LENGTH when an untruncated subscript may cause the
 ;;^DD(.114,6,21,6,0)
 ;;=length of a global reference in the index to exceed the M Portability
 ;;^DD(.114,6,21,7,0)
 ;;=Requirements.
 ;;^DD(.114,6,"DT")
 ;;=2960219
 ;;^DD(.114,7,0)
 ;;=COLLATION^S^F:forwards;B:backwards;^0;7^Q
 ;;^DD(.114,7,3)
 ;;=Answer '??' for more help.
 ;;^DD(.114,7,21,0)
 ;;=^^7^7^2980911^
 ;;^DD(.114,7,21,1,0)
 ;;=Answer with the direction FileMan's lookup utilities should $ORDER through
 ;;^DD(.114,7,21,2,0)
 ;;=this subscript when entries are returned or displayed to the user. If for
 ;;^DD(.114,7,21,3,0)
 ;;=example, you have a compound index on a Date of Birth field and a Name
 ;;^DD(.114,7,21,4,0)
 ;;=field, and you specify a COLLATION of 'backwards' on the Date of Birth
 ;;^DD(.114,7,21,5,0)
 ;;=value, the Lister and the Finder will return entries in reverse-date
 ;;^DD(.114,7,21,6,0)
 ;;=order. Likewise, question mark (?) help and partial matches in interactive
 ;;^DD(.114,7,21,7,0)
 ;;=^DIC lookups will display entries in reverse-date order.
 ;;^DD(.114,7,"DT")
 ;;=2970213
 ;;^DD(.114,8,0)
 ;;=LOOKUP PROMPT^F^^0;8^K:$L(X)>30!($L(X)<1) X
 ;;^DD(.114,8,3)
 ;;=Answer must be 1-30 characters in length. Answer '??' for more help.
 ;;^DD(.114,8,21,0)
 ;;=^^3^3^2980911^
 ;;^DD(.114,8,21,1,0)
 ;;=The text entered here will become a prompt for the user when this index is
 ;;^DD(.114,8,21,2,0)
 ;;=used for lookup (i.e., in the Classic FileMan calls to ^DIC.)  If the text
 ;;^DD(.114,8,21,3,0)
 ;;=is missing, then the FIELD LABEL will be used as a default.
 ;;^DD(.114,8,"DT")
 ;;=2970506

DINIT2A5
DINIT2A5 ;SFISC/MKO-KEY AND INDEX FILES ;10:50 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2A6
Q Q
 ;;^DIC(.31,0,"GL")
 ;;=^DD("KEY",
 ;;^DIC("B","KEY",.31)
 ;;=
 ;;^DIC(.31,"%D",0)
 ;;=^^12^12^2980911^
 ;;^DIC(.31,"%D",1,0)
 ;;=This file stores information about keys on a file or subfile. A key is a
 ;;^DIC(.31,"%D",2,0)
 ;;=set of one or more fields that uniquely identifies a record in a file. If
 ;;^DIC(.31,"%D",3,0)
 ;;=more than one set of fields can uniquely identify a record, one of those
 ;;^DIC(.31,"%D",4,0)
 ;;=sets should be designated the primary key; all others should be designated
 ;;^DIC(.31,"%D",5,0)
 ;;=secondary keys. The primary key is the principal means of identifying
 ;;^DIC(.31,"%D",6,0)
 ;;=records in the file.
 ;;^DIC(.31,"%D",7,0)
 ;;= 
 ;;^DIC(.31,"%D",8,0)
 ;;=To allow FileMan to enforce key uniqueness, the database designer must
 ;;^DIC(.31,"%D",9,0)
 ;;=define a regular index that consists of all the fields that make up the
 ;;^DIC(.31,"%D",10,0)
 ;;=key. This index is called the uniqueness index.
 ;;^DIC(.31,"%D",11,0)
 ;;= 
 ;;^DIC(.31,"%D",12,0)
 ;;=All key fields must have values. They cannot be null.
 ;;^DD(.31,0)
 ;;=FIELD^^3^5
 ;;^DD(.31,0,"DDA")
 ;;=N
 ;;^DD(.31,0,"DT")
 ;;=2980611
 ;;^DD(.31,0,"IX","B",.31,.01)
 ;;=
 ;;^DD(.31,0,"NM","KEY")
 ;;=
 ;;^DD(.31,.01,0)
 ;;=FILE^RNJ20,7^^0;1^K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."8N.N) X
 ;;^DD(.31,.01,1,0)
 ;;=^.1^^-1
 ;;^DD(.31,.01,1,1,0)
 ;;=.31^B
 ;;^DD(.31,.01,1,1,1)
 ;;=S ^DD("KEY","B",$E(X,1,30),DA)=""
 ;;^DD(.31,.01,1,1,2)
 ;;=K ^DD("KEY","B",$E(X,1,30),DA)
 ;;^DD(.31,.01,1,1,3)
 ;;=Lets developers pick keys by their file number
 ;;^DD(.31,.01,1,1,"%D",0)
 ;;=^^2^2^2980911^^
 ;;^DD(.31,.01,1,1,"%D",1,0)
 ;;=The B index on the .01 (File) of the Key file lets developers pick keys by
 ;;^DD(.31,.01,1,1,"%D",2,0)
 ;;=the file whose records they uniquely distinguish.
 ;;^DD(.31,.01,3)
 ;;=Type a Number between 0 and 999999999999, 7 Decimal Digits. Answer '??' for more help.
 ;;^DD(.31,.01,4)
 ;;=
 ;;^DD(.31,.01,21,0)
 ;;=^^2^2^2980908^
 ;;^DD(.31,.01,21,1,0)
 ;;=Answer should be the number of the file or subfile identified by this key.
 ;;^DD(.31,.01,21,2,0)
 ;;=A file may have more than one key, but only one primary key.
 ;;^DD(.31,.01,"DT")
 ;;=2980611
 ;;^DD(.31,.02,0)
 ;;=NAME^RF^^0;2^K:$L(X)>1!($L(X)<1)!'(X?1U) X
 ;;^DD(.31,.02,3)
 ;;=Answer must be 1 upper case letter. Answer '??' for more help.
 ;;^DD(.31,.02,4)
 ;;=
 ;;^DD(.31,.02,21,0)
 ;;=^^3^3^2980908^^
 ;;^DD(.31,.02,21,1,0)
 ;;=Answer must be the name of this key. The name of a file's primary key
 ;;^DD(.31,.02,21,2,0)
 ;;=should be A, with subsequent keys for the same file named B, C, and so
 ;;^DD(.31,.02,21,3,0)
 ;;=on.
 ;;^DD(.31,.02,"DT")
 ;;=2960122
 ;;^DD(.31,1,0)
 ;;=PRIORITY^RS^P:PRIMARY;S:SECONDARY;^0;3^Q
 ;;^DD(.31,1,3)
 ;;=Answer '??' for more help.
 ;;^DD(.31,1,21,0)
 ;;=^^2^2^2980911^
 ;;^DD(.31,1,21,1,0)
 ;;=Answer 'PRIMARY' if this is the primary key of the file, the key that will
 ;;^DD(.31,1,21,2,0)
 ;;=usually be used for identifying entries. Otherwise, answer 'SECONDARY'.
 ;;^DD(.31,1,"DT")
 ;;=2970725
 ;;^DD(.31,2,0)
 ;;=FIELD^.312IA^^2;0
 ;;^DD(.31,2,"DT")
 ;;=2980310
 ;;^DD(.31,3,0)
 ;;=UNIQUENESS INDEX^*P.11'^DD("IX",^0;4^S DIC("S")="I 1 Q:'$D(DDS)!'$D(DIKKEY)  I $P(^(0),U,9)=$P(^DD(""KEY"",DIKKEY,0),U)" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;^DD(.31,3,3)
 ;;=Answer '??' for more help.
 ;;^DD(.31,3,12)
 ;;=Root File of Index must equal File of Key.
 ;;^DD(.31,3,12.1)
 ;;=S DIC("S")="I 1 Q:'$D(DDS)!'$D(DIKKEY)  I $P(^(0),U,9)=$P(^DD(""KEY"",DIKKEY,0),U)"
 ;;^DD(.31,3,21,0)
 ;;=^^3^3^2981120^
 ;;^DD(.31,3,21,1,0)
 ;;=Answer with the index that FileMan should use to ensure that new key
 ;;^DD(.31,3,21,2,0)
 ;;=values are unique. It must be a new-style index that resides in the
 ;;^DD(.31,3,21,3,0)
 ;;=Index file, and must cross-reference the key fields in proper sequence.
 ;;^DD(.31,3,"DT")
 ;;=2980611
 ;;^DD(.312,0)
 ;;=FIELD SUB-FIELD^^1^3
 ;;^DD(.312,0,"DT")
 ;;=2960219
 ;;^DD(.312,0,"ID","WRITE")
 ;;=D EN^DDIOL("   "_$P(^(0),U,2),"","?0")
 ;;^DD(.312,0,"IX","B",.312,.01)
 ;;=
 ;;^DD(.312,0,"NM","FIELD")
 ;;=
 ;;^DD(.312,0,"UP")
 ;;=.31
 ;;^DD(.312,.01,0)
 ;;=FIELD^MRFX^^0;1^D ITFLD^DIKKDD I $D(X) K:$L(X)>20!($L(X)<1) X
 ;;^DD(.312,.01,1,0)
 ;;=^.1
 ;;^DD(.312,.01,1,1,0)
 ;;=.312^B
 ;;^DD(.312,.01,1,1,1)
 ;;=S ^DD("KEY",DA(1),2,"B",$E(X,1,30),DA)=""
 ;;^DD(.312,.01,1,1,2)
 ;;=K ^DD("KEY",DA(1),2,"B",$E(X,1,30),DA)
 ;;^DD(.312,.01,1,1,3)
 ;;=LETS DEVELOPER PICK KEY FIELDS BY NUMBER
 ;;^DD(.312,.01,1,1,"%D",0)
 ;;=^^2^2^2980908^
 ;;^DD(.312,.01,1,1,"%D",1,0)
 ;;=The B index, on the .01 (Field) of the Fields multiple, lets the developer
 ;;^DD(.312,.01,1,1,"%D",2,0)
 ;;=pick key fields by field number.
 ;;^DD(.312,.01,1,2,0)
 ;;=^^TRIGGER^.312^.02
 ;;^DD(.312,.01,1,2,1)
 ;;=K DIV S DIV=X,D0=DA(1),DIV(0)=D0,D1=DA,DIV(1)=D1 S Y(1)=$S($D(^DD("KEY",D0,2,D1,0)):^(0),1:"") S X=$P(Y(1),U,2),X=X S DIU=X K Y X ^DD(.312,.01,1,2,1.1) X ^DD(.312,.01,1,2,1.4)
 ;;^DD(.312,.01,1,2,1.1)
 ;;=S X=DIV S X=$P(^DD("KEY",DA(1),0),U)
 ;;^DD(.312,.01,1,2,1.4)
 ;;=S DIH=$S($D(^DD("KEY",DIV(0),2,DIV(1),0)):^(0),1:""),DIV=X S $P(^(0),U,2)=DIV,DIH=.312,DIG=.02 D ^DICR:$O(^DD(DIH,DIG,1,0))>0
 ;;^DD(.312,.01,1,2,2)
 ;;=Q
 ;;^DD(.312,.01,1,2,"CREATE VALUE")
 ;;=S X=$P(^DD("KEY",DA(1),0),U)
 ;;^DD(.312,.01,1,2,"DELETE VALUE")
 ;;=NO EFFECT
 ;;^DD(.312,.01,1,2,"DT")
 ;;=2980310
 ;;^DD(.312,.01,1,2,"FIELD")
 ;;=FILE
 ;;^DD(.312,.01,3)
 ;;=Answer must be 1-20 characters in length. Answer '??' for more help.
 ;;^DD(.312,.01,4)
 ;;=D EHFLD^DIKKDD
 ;;^DD(.312,.01,21,0)
 ;;=^^1^1^2980908^
 ;;^DD(.312,.01,21,1,0)
 ;;=Answer must be the number of one of this key's fields.
 ;;^DD(.312,.01,"DT")
 ;;=2980611
 ;;^DD(.312,.02,0)
 ;;=FILE^RNJ20,7I^^0;2^K:+X'=X!(X>999999999999)!(X<0)!(X?.E1"."8N.N) X
 ;;^DD(.312,.02,.1)
 ;;=
 ;;^DD(.312,.02,1,0)
 ;;=^.1^^0
 ;;^DD(.312,.02,3)
 ;;=Type a Number between 0 and 999999999999, 7 Decimal Digits. Answer '??' for more help.
 ;;^DD(.312,.02,5,1,0)
 ;;=.312^.01^2
 ;;^DD(.312,.02,21,0)
 ;;=^^3^3^2980908^
 ;;^DD(.312,.02,21,1,0)
 ;;=Answer must be the number of the file that holds this key field. It must
 ;;^DD(.312,.02,21,2,0)
 ;;=equal the number of the file whose records are uniquiely identified by
 ;;^DD(.312,.02,21,3,0)
 ;;=this key.
 ;;^DD(.312,.02,"DT")
 ;;=2980908
 ;;^DD(.312,1,0)
 ;;=SEQUENCE NUMBER^RNJ3,0^^0;3^K:+X'=X!(X>125)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(.312,1,3)
 ;;=Answer must be between 1 and 125, with no decimal digits. Answer '??' for more help.

DINIT2A6
DINIT2A6 ;SFISC/MKO-KEY AND INDEX FILES ;10:50 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2AA
Q Q
 ;;^DD(.312,1,21,0)
 ;;=^^4^4^2980911^
 ;;^DD(.312,1,21,1,0)
 ;;=Answer will determine the order in which this field appears within the
 ;;^DD(.312,1,21,2,0)
 ;;=key. This affects the order of prompts, subscripts, and returned values
 ;;^DD(.312,1,21,3,0)
 ;;=throughout FileMan. The first field of every key should receive sequence
 ;;^DD(.312,1,21,4,0)
 ;;=number 1, the second 2, and so on.
 ;;^DD(.312,1,"DT")
 ;;=2980611

DINIT2AA
DINIT2AA ;SFISC/MKO-DATA FOR KEY AND INDEX FILES ;10:50 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT2AB S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DD("IX",.001,0)
 ;;=0^ADEL^Delete Keys and Indexes associated with a deleted field.^MU^^F^R^I^0^^^^^A
 ;;^DD("IX",.001,1)
 ;;=Q
 ;;^DD("IX",.001,2)
 ;;=D:'$D(DICATTED)&'$D(DIU) DELXRF^DICATT4(DA(1),DA)
 ;;^DD("IX",.1101,0)
 ;;=.11^BB^The uniqueness index for the primary key of the Index file^R^^R^IR^I^.11^^^^^LS
 ;;^DD("IX",.1101,.1,0)
 ;;=^^3^3^2980611^
 ;;^DD("IX",.1101,.1,1,0)
 ;;=The BB index, on the key of the Index file, lets FileMan test potential
 ;;^DD("IX",.1101,.1,2,0)
 ;;=key values for uniqueness. It is a regular compound index with two fields,
 ;;^DD("IX",.1101,.1,3,0)
 ;;=the .01 (File) and .02 (Index Name).
 ;;^DD("IX",.1101,1)
 ;;=S ^DD("IX","BB",X(1),X(2),DA)=""
 ;;^DD("IX",.1101,2)
 ;;=K ^DD("IX","BB",X(1),X(2),DA)
 ;;^DD("IX",.1101,2.5)
 ;;=K ^DD("IX","BB")
 ;;^DD("IX",.1101,11.1,0)
 ;;=^.114^2^2
 ;;^DD("IX",.1101,11.1,1,0)
 ;;=1^F^.11^.01^^1
 ;;^DD("IX",.1101,11.1,2,0)
 ;;=2^F^.11^.02^^2
 ;;^DD("IX",.1102,0)
 ;;=.11^IX^Allows user to look up Indexes by Name.^R^^F^IR^I^.11^^^^^LS
 ;;^DD("IX",.1102,.1,0)
 ;;=^^2^2^2990303^
 ;;^DD("IX",.1102,.1,1,0)
 ;;=This 'Regular' index on the Name field (#.02) allows users to select an
 ;;^DD("IX",.1102,.1,2,0)
 ;;=index by its name.
 ;;^DD("IX",.1102,1)
 ;;=S ^DD("IX","IX",$E(X,1,30),DA)=""
 ;;^DD("IX",.1102,2)
 ;;=K ^DD("IX","IX",$E(X,1,30),DA)
 ;;^DD("IX",.1102,2.5)
 ;;=K ^DD("IX","IX")
 ;;^DD("IX",.1102,11.1,0)
 ;;=^.114IA^1^1
 ;;^DD("IX",.1102,11.1,1,0)
 ;;=1^F^.11^.02^30^1^F
 ;;^DD("IX",.11401,0)
 ;;=.114^BB^The uniqueness index of the Cross-Reference Values multiple of the Index file^R^^F^IR^I^.114^^^^^LS
 ;;^DD("IX",.11401,1)
 ;;=S ^DD("IX",DA(1),11.1,"BB",X,DA)=""
 ;;^DD("IX",.11401,2)
 ;;=K ^DD("IX",DA(1),11.1,"BB",X,DA)
 ;;^DD("IX",.11401,2.5)
 ;;=K ^DD("IX",DA(1),11.1,"BB")
 ;;^DD("IX",.11401,11.1,0)
 ;;=^.114IA^1^1
 ;;^DD("IX",.11401,11.1,1,0)
 ;;=1^F^.114^.01^^1
 ;;^DD("IX",.11402,0)
 ;;=.114^AC^Lets FileMan find cross reference values by subscript^R^^F^IR^I^.114^^^^^S
 ;;^DD("IX",.11402,1)
 ;;=S ^DD("IX",DA(1),11.1,"AC",X,DA)=""
 ;;^DD("IX",.11402,2)
 ;;=K ^DD("IX",DA(1),11.1,"AC",X,DA)
 ;;^DD("IX",.11402,2.5)
 ;;=K ^DD("IX",DA(1),11.1,"AC")
 ;;^DD("IX",.11402,11.1,0)
 ;;=^.114IA^1^1
 ;;^DD("IX",.11402,11.1,1,0)
 ;;=1^F^.114^.5^^1^F
 ;;^DD("IX",.11403,0)
 ;;=.11^F^Lets FileMan find the indexes affected when a field changes^R^^R^IR^W^.114^^^^^LS
 ;;^DD("IX",.11403,.1,0)
 ;;=^^6^6^2970303^^
 ;;^DD("IX",.11403,.1,1,0)
 ;;=The F index, is a whole file compound cross-reference on two fields in the
 ;;^DD("IX",.11403,.1,2,0)
 ;;=Cross-Reference Values multiple: File (#2) and Field (#3). It lets FileMan
 ;;^DD("IX",.11403,.1,3,0)
 ;;=identify the indexes that might be affected when a field value changes.
 ;;^DD("IX",.11403,.1,4,0)
 ;;=The checking of this index is an essential step during field level
 ;;^DD("IX",.11403,.1,5,0)
 ;;=transactions in building the list of record level cross-references that
 ;;^DD("IX",.11403,.1,6,0)
 ;;=must be fired after user-driven changes to the record are finished.
 ;;^DD("IX",.11403,1)
 ;;=S ^DD("IX","F",X(1),X(2),DA(1),DA)=""
 ;;^DD("IX",.11403,2)
 ;;=K ^DD("IX","F",X(1),X(2),DA(1),DA)
 ;;^DD("IX",.11403,2.5)
 ;;=K ^DD("IX","F")
 ;;^DD("IX",.11403,11.1,0)
 ;;=^.114^2^2
 ;;^DD("IX",.11403,11.1,1,0)
 ;;=1^F^.114^2^^1
 ;;^DD("IX",.11403,11.1,2,0)
 ;;=2^F^.114^3^^2
 ;;^DD("IX",.3101,0)
 ;;=.31^BB^The uniqueness index for the Key file^R^^R^IR^I^.31^^^^^LS
 ;;^DD("IX",.3101,.1,0)
 ;;=^^3^3^2970314^^^^
 ;;^DD("IX",.3101,.1,1,0)
 ;;=The BB index, the uniqueness index for the Key file's key, lets FileMan
 ;;^DD("IX",.3101,.1,2,0)
 ;;=test potential key values for uniqueness. It is a regular compound index
 ;;^DD("IX",.3101,.1,3,0)
 ;;=with two fields, the .01 (File) and .02 (Key Name).
 ;;^DD("IX",.3101,1)
 ;;=S ^DD("KEY","BB",X(1),X(2),DA)=""
 ;;^DD("IX",.3101,2)
 ;;=K ^DD("KEY","BB",X(1),X(2),DA)
 ;;^DD("IX",.3101,2.5)
 ;;=K ^DD("KEY","BB")
 ;;^DD("IX",.3101,11.1,0)
 ;;=^.114^2^2
 ;;^DD("IX",.3101,11.1,1,0)
 ;;=1^F^.31^.01^^1
 ;;^DD("IX",.3101,11.1,2,0)
 ;;=2^F^.31^.02^^2
 ;;^DD("IX",.3102,0)
 ;;=.31^AP^Lets FileMan determine the primary key of a file^R^^R^IR^I^.31^^^^^S
 ;;^DD("IX",.3102,1)
 ;;=S ^DD("KEY","AP",X(1),X(2),DA)=""
 ;;^DD("IX",.3102,1.4)
 ;;=S X=X(2)="P"
 ;;^DD("IX",.3102,2)
 ;;=K ^DD("KEY","AP",X(1),X(2),DA)
 ;;^DD("IX",.3102,2.4)
 ;;=S X=X(2)="P"
 ;;^DD("IX",.3102,2.5)
 ;;=K ^DD("KEY","AP")
 ;;^DD("IX",.3102,11.1,0)
 ;;=^.114I^2^2
 ;;^DD("IX",.3102,11.1,1,0)
 ;;=1^F^.31^.01^^1
 ;;^DD("IX",.3102,11.1,2,0)
 ;;=2^F^.31^1^^2
 ;;^DD("IX",.3103,0)
 ;;=.31^AU^Lets FileMan determine whether an index is a uniqueness index for a key^R^^F^IR^I^.31^^^^^S
 ;;^DD("IX",.3103,1)
 ;;=S ^DD("KEY","AU",X,DA)=""
 ;;^DD("IX",.3103,2)
 ;;=K ^DD("KEY","AU",X,DA)
 ;;^DD("IX",.3103,2.5)
 ;;=K ^DD("KEY","AU")
 ;;^DD("IX",.3103,11.1,0)
 ;;=^.114IA^1^1
 ;;^DD("IX",.3103,11.1,1,0)
 ;;=1^F^.31^3^^1^F
 ;;^DD("IX",.31201,0)
 ;;=.312^BB^The uniqueness index for Field multiple of the Key file.^R^^R^IR^I^.312^^^^^LS
 ;;^DD("IX",.31201,.1,0)
 ;;=^^3^3^2970203^^
 ;;^DD("IX",.31201,.1,1,0)
 ;;=The BB index, on the key of the Field multiple of the Key file, lets
 ;;^DD("IX",.31201,.1,2,0)
 ;;=FileMan test potential key values for uniqueness. It is a regular compound
 ;;^DD("IX",.31201,.1,3,0)
 ;;=index with two fields, the .01 (Field) and .02 (File).
 ;;^DD("IX",.31201,1)
 ;;=S ^DD("KEY",DA(1),2,"BB",X(1),X(2),DA)=""
 ;;^DD("IX",.31201,2)
 ;;=K ^DD("KEY",DA(1),2,"BB",X(1),X(2),DA)
 ;;^DD("IX",.31201,2.5)
 ;;=K ^DD("KEY",DA(1),2,"BB")
 ;;^DD("IX",.31201,11.1,0)
 ;;=^.114^2^2
 ;;^DD("IX",.31201,11.1,1,0)
 ;;=1^F^.312^.01^^1
 ;;^DD("IX",.31201,11.1,2,0)
 ;;=2^F^.312^.02^^2
 ;;^DD("IX",.31202,0)
 ;;=.31^F^Lets FileMan find the Keys that include each field^R^^R^IR^W^.312^^^^^LS
 ;;^DD("IX",.31202,.1,0)
 ;;=^^4^4^2980911^
 ;;^DD("IX",.31202,.1,1,0)
 ;;=The F index, a whole file compound cross-reference on the key of the
 ;;^DD("IX",.31202,.1,2,0)
 ;;=Fields multiple of the Key file, lets FileMan determine the keys a field
 ;;^DD("IX",.31202,.1,3,0)
 ;;=is part of. This is essential for identifying the key value uniqueness
 ;;^DD("IX",.31202,.1,4,0)
 ;;=tests that must be done when a field value changes.
 ;;^DD("IX",.31202,1)
 ;;=S ^DD("KEY","F",X(1),X(2),DA(1),DA)=""
 ;;^DD("IX",.31202,2)
 ;;=K ^DD("KEY","F",X(1),X(2),DA(1),DA)
 ;;^DD("IX",.31202,2.5)
 ;;=K ^DD("KEY","F")
 ;;^DD("IX",.31202,11.1,0)
 ;;=^.114^2^2
 ;;^DD("IX",.31202,11.1,1,0)
 ;;=1^F^.312^.02^^1
 ;;^DD("IX",.31202,11.1,2,0)
 ;;=2^F^.312^.01^^2

DINIT2AB
DINIT2AB ;SFISC/MKO-DATA FOR KEY AND INDEX FILES ;10:50 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT2AC S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DD("IX",.31203,0)
 ;;=.312^S^Lets FileMan step through Key fields in sequence^R^^R^IR^I^.312^^^^^LS
 ;;^DD("IX",.31203,.1,0)
 ;;=^^4^4^2980911^
 ;;^DD("IX",.31203,.1,1,0)
 ;;=The S index, a compound index on all fields of the Fields multiple of the
 ;;^DD("IX",.31203,.1,2,0)
 ;;=Key file, lets FileMan step through the key fields in sequence. This is
 ;;^DD("IX",.31203,.1,3,0)
 ;;=essential for prompting, returning values, as well as for the generation
 ;;^DD("IX",.31203,.1,4,0)
 ;;=of each key's uniqueness index.
 ;;^DD("IX",.31203,1)
 ;;=S ^DD("KEY",DA(1),2,"S",X(1),X(2),X(3),DA)=""
 ;;^DD("IX",.31203,2)
 ;;=K ^DD("KEY",DA(1),2,"S",X(1),X(2),X(3),DA)
 ;;^DD("IX",.31203,2.5)
 ;;=K ^DD("KEY",DA(1),2,"S")
 ;;^DD("IX",.31203,11.1,0)
 ;;=^.114^3^3
 ;;^DD("IX",.31203,11.1,1,0)
 ;;=1^F^.312^1^^1
 ;;^DD("IX",.31203,11.1,2,0)
 ;;=2^F^.312^.01^^2
 ;;^DD("IX",.31203,11.1,3,0)
 ;;=3^F^.312^.02^^3

DINIT2AC
DINIT2AC ;SFISC/MKO-DATA FOR KEY AND INDEX FILES ;10:50 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(ENTRY+I) G:X="" ^DINIT2B0 S Y=$E($T(ENTRY+I+1),5,999),X=$E(X,4,999),@X=Y
 Q
ENTRY ;
 ;;^DD("KEY",.1101,0)
 ;;=.11^A^P^.1101^^
 ;;^DD("KEY",.1101,2,0)
 ;;=^.312I^2^2
 ;;^DD("KEY",.1101,2,1,0)
 ;;=.01^.11^1
 ;;^DD("KEY",.1101,2,2,0)
 ;;=.02^.11^2
 ;;^DD("KEY",.11401,0)
 ;;=.114^A^P^.11401^^
 ;;^DD("KEY",.11401,2,0)
 ;;=^.312I^1^1
 ;;^DD("KEY",.11401,2,1,0)
 ;;=.01^.114^1
 ;;^DD("KEY",.3101,0)
 ;;=.31^A^P^.3101^^
 ;;^DD("KEY",.3101,2,0)
 ;;=^.312I^2^2
 ;;^DD("KEY",.3101,2,1,0)
 ;;=.01^.31^1
 ;;^DD("KEY",.3101,2,2,0)
 ;;=.02^.31^2
 ;;^DD("KEY",.31201,0)
 ;;=.312^A^P^.31201^^
 ;;^DD("KEY",.31201,2,0)
 ;;=^.312I^2^2
 ;;^DD("KEY",.31201,2,1,0)
 ;;=.01^.312^1
 ;;^DD("KEY",.31201,2,2,0)
 ;;=.02^.312^2

DINIT2B0
DINIT2B0 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B1
Q Q
 ;;^DIC(1.521,0,"GL")
 ;;=^DMSQ("S",
 ;;^DIC("B","SQLI_SCHEMA",1.521)
 ;;=
 ;;^DIC(1.521,"%D",0)
 ;;=^^1^1^2970806^^^
 ;;^DIC(1.521,"%D",1,0)
 ;;=A set of tables and domains. A subset of catalog and environment
 ;;^DD(1.521,0)
 ;;=FIELD^^2^3
 ;;^DD(1.521,0,"DDA")
 ;;=N
 ;;^DD(1.521,0,"DT")
 ;;=2960820
 ;;^DD(1.521,0,"IX","B",1.521,.01)
 ;;=
 ;;^DD(1.521,0,"NM","SQLI_SCHEMA")
 ;;=
 ;;^DD(1.521,0,"PT",1.5215,1)
 ;;=
 ;;^DD(1.521,0,"VRPK")
 ;;=DI
 ;;^DD(1.521,.01,0)
 ;;=S_NAME^RF^^0;1^K:$L(X)>30!($L(X)<1)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.521,.01,.1)
 ;;=Schema
 ;;^DD(1.521,.01,1,0)
 ;;=^.1
 ;;^DD(1.521,.01,1,1,0)
 ;;=1.521^B
 ;;^DD(1.521,.01,1,1,1)
 ;;=S ^DMSQ("S","B",$E(X,1,30),DA)=""
 ;;^DD(1.521,.01,1,1,2)
 ;;=K ^DMSQ("S","B",$E(X,1,30),DA)
 ;;^DD(1.521,.01,3)
 ;;=SQL identifier start with upper case letter, only letters, numbers and _.
 ;;^DD(1.521,.01,9)
 ;;=^
 ;;^DD(1.521,.01,21,0)
 ;;=^^2^2^2960926^^
 ;;^DD(1.521,.01,21,1,0)
 ;;=In FileMan, application groups are assigned SQL schema names
 ;;^DD(1.521,.01,21,2,0)
 ;;=Names are valid SQL identifiers, and are unique by site
 ;;^DD(1.521,.01,"DT")
 ;;=2960820
 ;;^DD(1.521,1,0)
 ;;=S_SECURITY^F^^1;1^K:$L(X)>12!($L(X)<4) X
 ;;^DD(1.521,1,.1)
 ;;=Security
 ;;^DD(1.521,1,3)
 ;;=Answer must be 4-12 characters in length.
 ;;^DD(1.521,1,4)
 ;;=W ?5,"Routine to check access to schema"
 ;;^DD(1.521,1,9)
 ;;=^
 ;;^DD(1.521,1,21,0)
 ;;=^^1^1^2970311^^^^
 ;;^DD(1.521,1,21,1,0)
 ;;=A routine to check security by application group.
 ;;^DD(1.521,1,"DT")
 ;;=2960926
 ;;^DD(1.521,2,0)
 ;;=S_DESCRIPTION^F^^0;2^K:$L(X)>60!($L(X)<3) X
 ;;^DD(1.521,2,.1)
 ;;=Description
 ;;^DD(1.521,2,3)
 ;;=Describe schema. Answer must be 3-60 characters in length.
 ;;^DD(1.521,2,9)
 ;;=^
 ;;^DD(1.521,2,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.521,2,21,1,0)
 ;;=A short description of the schema
 ;;^DD(1.521,2,"DT")
 ;;=2960820

DINIT2B1
DINIT2B1 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B2
Q Q
 ;;^DIC(1.52101,0,"GL")
 ;;=^DMSQ("K",
 ;;^DIC("B","SQLI_KEY_WORD",1.52101)
 ;;=
 ;;^DIC(1.52101,"%D",0)
 ;;=^^3^3^2970806^^^
 ;;^DIC(1.52101,"%D",1,0)
 ;;=SQL identifiers that may not be used for column and table names.
 ;;^DIC(1.52101,"%D",2,0)
 ;;= SQL, ODBC and vendors all have lists of restricted words, which
 ;;^DIC(1.52101,"%D",3,0)
 ;;=should be put in this table before SQLI table generation.
 ;;^DD(1.52101,0)
 ;;=FIELD^^.01^1
 ;;^DD(1.52101,0,"DDA")
 ;;=N
 ;;^DD(1.52101,0,"DT")
 ;;=2970311
 ;;^DD(1.52101,0,"IX","B",1.52101,.01)
 ;;=
 ;;^DD(1.52101,0,"NM","SQLI_KEY_WORD")
 ;;=
 ;;^DD(1.52101,0,"VRPK")
 ;;=DI
 ;;^DD(1.52101,.01,0)
 ;;=KEY_WORD^RF^^0;1^K:$L(X)>30!($L(X)<2)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.52101,.01,.1)
 ;;=Keyword
 ;;^DD(1.52101,.01,1,0)
 ;;=^.1
 ;;^DD(1.52101,.01,1,1,0)
 ;;=1.52101^B
 ;;^DD(1.52101,.01,1,1,1)
 ;;=S ^DMSQ("K","B",$E(X,1,30),DA)=""
 ;;^DD(1.52101,.01,1,1,2)
 ;;=K ^DMSQ("K","B",$E(X,1,30),DA)
 ;;^DD(1.52101,.01,3)
 ;;=Answer must be 2-30 characters in length.
 ;;^DD(1.52101,.01,9)
 ;;=^
 ;;^DD(1.52101,.01,"DT")
 ;;=2970311

DINIT2B2
DINIT2B2 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B3
Q Q
 ;;^DIC(1.5211,0,"GL")
 ;;=^DMSQ("DT",
 ;;^DIC("B","SQLI_DATA_TYPE",1.5211)
 ;;=
 ;;^DIC(1.5211,"%D",0)
 ;;=^^10^10^2970806^^^
 ;;^DIC(1.5211,"%D",1,0)
 ;;=A set of values from which all domains of that type may be drawn.
 ;;^DIC(1.5211,"%D",2,0)
 ;;=PRIMARY_KEY - the set of all primary keys (in SQLI_TABLE_ELEMENT, type P)
 ;;^DIC(1.5211,"%D",3,0)
 ;;=CHARACTER - the set of all character strings of length less than 256
 ;;^DIC(1.5211,"%D",4,0)
 ;;=INTEGER - the set of all cardinal numbers
 ;;^DIC(1.5211,"%D",5,0)
 ;;=NUMERIC - the set of all real numbers
 ;;^DIC(1.5211,"%D",6,0)
 ;;=DATE - the set of all date valued tokens
 ;;^DIC(1.5211,"%D",7,0)
 ;;=TIME - the set of all time valued tokens
 ;;^DIC(1.5211,"%D",8,0)
 ;;=MOMENT - the set of all tokens which have both a date and a time value
 ;;^DIC(1.5211,"%D",9,0)
 ;;=BOOLEAN - the set of all tokens which evaluate to true or false only
 ;;^DIC(1.5211,"%D",10,0)
 ;;=MEMO - the set of all character strings of length > 255
 ;;^DD(1.5211,0)
 ;;=FIELD^^3^4
 ;;^DD(1.5211,0,"DDA")
 ;;=N
 ;;^DD(1.5211,0,"DT")
 ;;=2960917
 ;;^DD(1.5211,0,"IX","B",1.5211,.01)
 ;;=
 ;;^DD(1.5211,0,"NM","SQLI_DATA_TYPE")
 ;;=
 ;;^DD(1.5211,0,"PT",1.5212,1)
 ;;=
 ;;^DD(1.5211,0,"PT",1.5213,1)
 ;;=
 ;;^DD(1.5211,0,"PT",1.5214,1)
 ;;=
 ;;^DD(1.5211,0,"VRPK")
 ;;=DI
 ;;^DD(1.5211,.01,0)
 ;;=D_NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.5211,.01,.1)
 ;;=Data Type
 ;;^DD(1.5211,.01,1,0)
 ;;=^.1
 ;;^DD(1.5211,.01,1,1,0)
 ;;=1.5211^B
 ;;^DD(1.5211,.01,1,1,1)
 ;;=S ^DMSQ("DT","B",$E(X,1,30),DA)=""
 ;;^DD(1.5211,.01,1,1,2)
 ;;=K ^DMSQ("DT","B",$E(X,1,30),DA)
 ;;^DD(1.5211,.01,3)
 ;;=Answer must be an SQL identifier 3-30 characters in length.
 ;;^DD(1.5211,.01,4)
 ;;=W ?5,"Must be a valid SQL identifier"
 ;;^DD(1.5211,.01,9)
 ;;=^
 ;;^DD(1.5211,.01,21,0)
 ;;=^^1^1^2970311^^^^
 ;;^DD(1.5211,.01,21,1,0)
 ;;=ODBC Standard data type corresponding to FileMan domains
 ;;^DD(1.5211,.01,"DT")
 ;;=2960820
 ;;^DD(1.5211,1,0)
 ;;=D_COMMENT^F^^0;2^K:$L(X)>60!($L(X)<3) X
 ;;^DD(1.5211,1,.1)
 ;;=Comment
 ;;^DD(1.5211,1,3)
 ;;=Answer must be 3-60 characters in length.
 ;;^DD(1.5211,1,9)
 ;;=^
 ;;^DD(1.5211,1,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5211,1,21,1,0)
 ;;=Short description of the data type
 ;;^DD(1.5211,1,"DT")
 ;;=2960926
 ;;^DD(1.5211,2,0)
 ;;=D_OUTPUT_STRATEGY^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5211,2,.1)
 ;;=Output Strategy
 ;;^DD(1.5211,2,3)
 ;;=This is Standard MUMPS code to format output.
 ;;^DD(1.5211,2,9)
 ;;=^
 ;;^DD(1.5211,2,21,0)
 ;;=^^1^1^2960926^^^^
 ;;^DD(1.5211,2,21,1,0)
 ;;=M code which returns external value, {E} of base value, {B}.
 ;;^DD(1.5211,2,"DT")
 ;;=2960926
 ;;^DD(1.5211,3,0)
 ;;=D_OUTPUT_FORMAT^P1.5214'^DMSQ("OF",^0;3^Q
 ;;^DD(1.5211,3,.1)
 ;;=Output Format
 ;;^DD(1.5211,3,9)
 ;;=^
 ;;^DD(1.5211,3,21,0)
 ;;=^^1^1^2960926^^^^
 ;;^DD(1.5211,3,21,1,0)
 ;;=IEN of default output format in SQLI_OUTPUT_FORMAT
 ;;^DD(1.5211,3,"DT")
 ;;=2960926

DINIT2B3
DINIT2B3 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B4
Q Q
 ;;^DIC(1.5212,0,"GL")
 ;;=^DMSQ("DM",
 ;;^DIC("B","SQLI_DOMAIN",1.5212)
 ;;=
 ;;^DIC(1.5212,"%D",0)
 ;;=^^11^11^2970806^^
 ;;^DIC(1.5212,"%D",1,0)
 ;;=The set from which all objects of that domain must be drawn.
 ;;^DIC(1.5212,"%D",2,0)
 ;;=In SQLI, all table elements (SQLI_TABLE_ELEMENT) have a domain which
 ;;^DIC(1.5212,"%D",3,0)
 ;;=restricts them to their domain set. For each data type there is a domain
 ;;^DIC(1.5212,"%D",4,0)
 ;;=of the same name, representing the same set. Other domains have different
 ;;^DIC(1.5212,"%D",5,0)
 ;;=set membership restrictions. 
 ;;^DIC(1.5212,"%D",6,0)
 ;;= 
 ;;^DIC(1.5212,"%D",7,0)
 ;;=Each domain has a data type, which determines the rules for comparing
 ;;^DIC(1.5212,"%D",8,0)
 ;;=values from different domains, and the operators which may be used on them.
 ;;^DIC(1.5212,"%D",9,0)
 ;;= 
 ;;^DIC(1.5212,"%D",10,0)
 ;;=The PRIMARY_KEY data type and domain is unique to SQLI. It is used to
 ;;^DIC(1.5212,"%D",11,0)
 ;;=relate primary keys to foreign keys unambiguously (see SQLI_TABLE_ELEMENT)
 ;;^DD(1.5212,0)
 ;;=FIELD^^11^12
 ;;^DD(1.5212,0,"DDA")
 ;;=N
 ;;^DD(1.5212,0,"DT")
 ;;=2970225
 ;;^DD(1.5212,0,"IX","B",1.5212,.01)
 ;;=
 ;;^DD(1.5212,0,"IX","C",1.5212,3)
 ;;=
 ;;^DD(1.5212,0,"IX","D",1.5212,11)
 ;;=
 ;;^DD(1.5212,0,"IX","E",1.5212,1)
 ;;=
 ;;^DD(1.5212,0,"NM","SQLI_DOMAIN")
 ;;=
 ;;^DD(1.5212,0,"PT",1.5216,1)
 ;;=
 ;;^DD(1.5212,0,"VRPK")
 ;;=DI
 ;;^DD(1.5212,.01,0)
 ;;=DM_NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.5212,.01,.1)
 ;;=Domain
 ;;^DD(1.5212,.01,1,0)
 ;;=^.1
 ;;^DD(1.5212,.01,1,1,0)
 ;;=1.5212^B
 ;;^DD(1.5212,.01,1,1,1)
 ;;=S ^DMSQ("DM","B",$E(X,1,30),DA)=""
 ;;^DD(1.5212,.01,1,1,2)
 ;;=K ^DMSQ("DM","B",$E(X,1,30),DA)
 ;;^DD(1.5212,.01,3)
 ;;=Answer must be an SQL identifier 3-30 characters in length.
 ;;^DD(1.5212,.01,4)
 ;;=W ?5,"Must be a valid SQL identifier"
 ;;^DD(1.5212,.01,9)
 ;;=^
 ;;^DD(1.5212,.01,21,0)
 ;;=^^2^2^2970311^^^^
 ;;^DD(1.5212,.01,21,1,0)
 ;;=Name of FileMan domain
 ;;^DD(1.5212,.01,21,2,0)
 ;;=Includes names of standard SQL data types. Must not be a keyword.
 ;;^DD(1.5212,.01,"DT")
 ;;=2960820
 ;;^DD(1.5212,1,0)
 ;;=DM_DATA_TYPE^RP1.5211'^DMSQ("DT",^0;2^Q
 ;;^DD(1.5212,1,.1)
 ;;=Data Type
 ;;^DD(1.5212,1,1,0)
 ;;=^.1
 ;;^DD(1.5212,1,1,1,0)
 ;;=1.5212^E
 ;;^DD(1.5212,1,1,1,1)
 ;;=S ^DMSQ("DM","E",$E(X,1,30),DA)=""
 ;;^DD(1.5212,1,1,1,2)
 ;;=K ^DMSQ("DM","E",$E(X,1,30),DA)
 ;;^DD(1.5212,1,1,1,"%D",0)
 ;;=^^1^1^2960909^
 ;;^DD(1.5212,1,1,1,"%D",1,0)
 ;;=Domain by data type. 
 ;;^DD(1.5212,1,1,1,"DT")
 ;;=2960909
 ;;^DD(1.5212,1,3)
 ;;=
 ;;^DD(1.5212,1,9)
 ;;=^
 ;;^DD(1.5212,1,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5212,1,21,1,0)
 ;;=IEN of a standard data type in SQLI_DATA_TYPE. Required.
 ;;^DD(1.5212,1,"DT")
 ;;=2960909
 ;;^DD(1.5212,2,0)
 ;;=DM_COMMENT^F^^0;3^K:$L(X)>60!($L(X)<3) X
 ;;^DD(1.5212,2,.1)
 ;;=Comment
 ;;^DD(1.5212,2,3)
 ;;=Answer must be 3-60 characters in length.
 ;;^DD(1.5212,2,9)
 ;;=^
 ;;^DD(1.5212,2,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5212,2,21,1,0)
 ;;=A short comment which describes the data type set
 ;;^DD(1.5212,2,"DT")
 ;;=2960926
 ;;^DD(1.5212,3,0)
 ;;=DM_TABLE^P1.5215'^DMSQ("T",^0;4^Q
 ;;^DD(1.5212,3,.1)
 ;;=Table
 ;;^DD(1.5212,3,1,0)
 ;;=^.1
 ;;^DD(1.5212,3,1,1,0)
 ;;=1.5212^C
 ;;^DD(1.5212,3,1,1,1)
 ;;=S ^DMSQ("DM","C",$E(X,1,30),DA)=""
 ;;^DD(1.5212,3,1,1,2)
 ;;=K ^DMSQ("DM","C",$E(X,1,30),DA)
 ;;^DD(1.5212,3,1,1,"%D",0)
 ;;=^^1^1^2960823^
 ;;^DD(1.5212,3,1,1,"%D",1,0)
 ;;=Domain by table id
 ;;^DD(1.5212,3,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5212,3,3)
 ;;=Enter only if domain is a table-id
 ;;^DD(1.5212,3,9)
 ;;=^
 ;;^DD(1.5212,3,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5212,3,21,1,0)
 ;;=IEN of table in SQLI_TABLE if domain is of type PRIMARY_KEY
 ;;^DD(1.5212,3,21,2,0)
 ;;=Only primary and foreign keys have such domains.
 ;;^DD(1.5212,3,"DT")
 ;;=2960926
 ;;^DD(1.5212,4,0)
 ;;=DM_WIDTH^NJ3,0^^0;5^K:+X'=X!(X>255)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5212,4,.1)
 ;;=Width
 ;;^DD(1.5212,4,3)
 ;;=Type a Number between 1 and 255, 0 Decimal Digits
 ;;^DD(1.5212,4,9)
 ;;=^
 ;;^DD(1.5212,4,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5212,4,21,1,0)
 ;;=Default display width. Overrides data type display width.
 ;;^DD(1.5212,4,"DT")
 ;;=2960926
 ;;^DD(1.5212,5,0)
 ;;=DM_SCALE^NJ1,0^^0;6^K:+X'=X!(X>9)!(X<0)!(X?.E1"."1N.N) X
 ;;^DD(1.5212,5,.1)
 ;;=Scale
 ;;^DD(1.5212,5,3)
 ;;=Type a Number between 0 and 9, 0 Decimal Digits
 ;;^DD(1.5212,5,9)
 ;;=^
 ;;^DD(1.5212,5,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5212,5,21,1,0)
 ;;=Default number of decimal places displayed for numbers.
 ;;^DD(1.5212,5,"DT")
 ;;=2960926
 ;;^DD(1.5212,6,0)
 ;;=DM_OUTPUT_FORMAT^P1.5214'^DMSQ("OF",^0;7^Q
 ;;^DD(1.5212,6,.1)
 ;;=Output Format
 ;;^DD(1.5212,6,3)
 ;;=
 ;;^DD(1.5212,6,9)
 ;;=^
 ;;^DD(1.5212,6,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5212,6,21,1,0)
 ;;=Default output format for elements of this domain.
 ;;^DD(1.5212,6,21,2,0)
 ;;=Used to provide text value of pointer chains, etc.
 ;;^DD(1.5212,6,"DT")
 ;;=2960820
 ;;^DD(1.5212,7,0)
 ;;=DM_INT_EXPR^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5212,7,.1)
 ;;=Base to Internal Expression
 ;;^DD(1.5212,7,3)
 ;;=This is a Standard M expression to format X for output
 ;;^DD(1.5212,7,9)
 ;;=^
 ;;^DD(1.5212,7,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5212,7,21,1,0)
 ;;=An M expression which returns the internal value of a base value.
 ;;^DD(1.5212,7,21,2,0)
 ;;=Expression uses placeholder {B} to represent the base value
 ;;^DD(1.5212,7,"DT")
 ;;=2960926
 ;;^DD(1.5212,8,0)
 ;;=DM_INT_EXEC^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5212,8,.1)
 ;;=Base to Internal Execute
 ;;^DD(1.5212,8,3)
 ;;=This is Standard MUMPS code to format X for input
 ;;^DD(1.5212,8,9)
 ;;=^
 ;;^DD(1.5212,8,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5212,8,21,1,0)
 ;;=M code line which sets internal value, {I}, to some function of base
 ;;^DD(1.5212,8,21,2,0)
 ;;=value, {B}.
 ;;^DD(1.5212,8,"DT")
 ;;=2960926
 ;;^DD(1.5212,9,0)
 ;;=DM_BASE_EXPR^K^^3;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5212,9,.1)
 ;;=Internal to Base Expression
 ;;^DD(1.5212,9,3)
 ;;=This is a Standard M expression to format X in internal form.
 ;;^DD(1.5212,9,9)
 ;;=^
 ;;^DD(1.5212,9,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5212,9,21,1,0)
 ;;=An M expression which returns the internal value of base value, {B}.
 ;;^DD(1.5212,9,"DT")
 ;;=2960926
 ;;^DD(1.5212,10,0)
 ;;=DM_BASE_EXEC^K^^4;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5212,10,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5212,10,9)
 ;;=^
 ;;^DD(1.5212,10,21,0)
 ;;=^^1^1^2960820^

DINIT2B4
DINIT2B4 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B5
Q Q
 ;;^DD(1.5212,10,21,1,0)
 ;;=Code which when executed returns the base value of X
 ;;^DD(1.5212,10,"DT")
 ;;=2960820
 ;;^DD(1.5212,11,0)
 ;;=DM_FILEMAN_FIELD_TYPE^S^F:FREE TEXT;N:NUMERIC;P:POINTER;D:DATE;W:WORD-PROCESSING;K:MUMPS;B:BOOLEAN;S:SET-OF-CODES;V:VARIABLE POINTER;^0;8^Q
 ;;^DD(1.5212,11,.1)
 ;;=FT
 ;;^DD(1.5212,11,1,0)
 ;;=^.1
 ;;^DD(1.5212,11,1,1,0)
 ;;=1.5212^D
 ;;^DD(1.5212,11,1,1,1)
 ;;=S ^DMSQ("DM","D",$E(X,1,30),DA)=""
 ;;^DD(1.5212,11,1,1,2)
 ;;=K ^DMSQ("DM","D",$E(X,1,30),DA)
 ;;^DD(1.5212,11,1,1,"%D",0)
 ;;=^^1^1^2960828^
 ;;^DD(1.5212,11,1,1,"%D",1,0)
 ;;=Domain by FileMan type
 ;;^DD(1.5212,11,1,1,"DT")
 ;;=2960828
 ;;^DD(1.5212,11,9)
 ;;=^
 ;;^DD(1.5212,11,21,0)
 ;;=^^1^1^2970225^^^^
 ;;^DD(1.5212,11,21,1,0)
 ;;=FileMan field type (F, N, D, DT, K, ...)
 ;;^DD(1.5212,11,23,0)
 ;;=^^3^3^2970225^^^^
 ;;^DD(1.5212,11,23,1,0)
 ;;=A value in this field indicates that the domain is derived from a
 ;;^DD(1.5212,11,23,2,0)
 ;;=FileMan-specific field type. It is intended to signal vendors that a
 ;;^DD(1.5212,11,23,3,0)
 ;;=proprietary function may be required to implement the domain.
 ;;^DD(1.5212,11,"DT")
 ;;=2970225

DINIT2B5
DINIT2B5 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B6
Q Q
 ;;^DIC(1.5213,0,"GL")
 ;;=^DMSQ("KF",
 ;;^DIC("B","SQLI_KEY_FORMAT",1.5213)
 ;;=
 ;;^DIC(1.5213,"%D",0)
 ;;=^^5^5^2970806^^^
 ;;^DIC(1.5213,"%D",1,0)
 ;;=Strategies for converting base values into key values.
 ;;^DIC(1.5213,"%D",2,0)
 ;;=Soundex and upper case conversion are common examples. This implies that
 ;;^DIC(1.5213,"%D",3,0)
 ;;=comparisons of key values with base values must be preceded by conversion
 ;;^DIC(1.5213,"%D",4,0)
 ;;=of the base value to key value. Key formats are frequently lossy; they
 ;;^DIC(1.5213,"%D",5,0)
 ;;=can't be converted uniquely back to base format.
 ;;^DD(1.5213,0)
 ;;=FIELD^^4^5
 ;;^DD(1.5213,0,"DDA")
 ;;=N
 ;;^DD(1.5213,0,"DT")
 ;;=2960820
 ;;^DD(1.5213,0,"IX","B",1.5213,.01)
 ;;=
 ;;^DD(1.5213,0,"IX","C",1.5213,1)
 ;;=
 ;;^DD(1.5213,0,"NM","SQLI_KEY_FORMAT")
 ;;=
 ;;^DD(1.5213,0,"PT",1.5218,7)
 ;;=
 ;;^DD(1.5213,0,"VRPK")
 ;;=DI
 ;;^DD(1.5213,.01,0)
 ;;=KF_NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.5213,.01,.1)
 ;;=Key Format
 ;;^DD(1.5213,.01,1,0)
 ;;=^.1
 ;;^DD(1.5213,.01,1,1,0)
 ;;=1.5213^B
 ;;^DD(1.5213,.01,1,1,1)
 ;;=S ^DMSQ("KF","B",$E(X,1,30),DA)=""
 ;;^DD(1.5213,.01,1,1,2)
 ;;=K ^DMSQ("KF","B",$E(X,1,30),DA)
 ;;^DD(1.5213,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(1.5213,.01,9)
 ;;=^
 ;;^DD(1.5213,.01,"DT")
 ;;=2960820
 ;;^DD(1.5213,1,0)
 ;;=KF_DATA_TYPE^RP1.5211'^DMSQ("DT",^0;2^Q
 ;;^DD(1.5213,1,1,0)
 ;;=^.1
 ;;^DD(1.5213,1,1,1,0)
 ;;=1.5213^C
 ;;^DD(1.5213,1,1,1,1)
 ;;=S ^DMSQ("KF","C",$E(X,1,30),DA)=""
 ;;^DD(1.5213,1,1,1,2)
 ;;=K ^DMSQ("KF","C",$E(X,1,30),DA)
 ;;^DD(1.5213,1,1,1,"%D",0)
 ;;=^^1^1^2960823^
 ;;^DD(1.5213,1,1,1,"%D",1,0)
 ;;=KEY FORMAT BY DATA TYPE
 ;;^DD(1.5213,1,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5213,1,3)
 ;;=Enter the ODBC data type of this key
 ;;^DD(1.5213,1,9)
 ;;=^
 ;;^DD(1.5213,1,"DT")
 ;;=2960823
 ;;^DD(1.5213,2,0)
 ;;=KF_COMMENT^F^^0;3^K:$L(X)>60!($L(X)<3) X
 ;;^DD(1.5213,2,3)
 ;;=Answer must be 3-60 characters in length.
 ;;^DD(1.5213,2,9)
 ;;=^
 ;;^DD(1.5213,2,"DT")
 ;;=2960820
 ;;^DD(1.5213,3,0)
 ;;=KF_INT_EXPR^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5213,3,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5213,3,9)
 ;;=^
 ;;^DD(1.5213,3,21,0)
 ;;=^^1^1^2960820^
 ;;^DD(1.5213,3,21,1,0)
 ;;=An M expression which converts X to it's key format
 ;;^DD(1.5213,3,"DT")
 ;;=2960820
 ;;^DD(1.5213,4,0)
 ;;=KF_INT_EXEC^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5213,4,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5213,4,9)
 ;;=^
 ;;^DD(1.5213,4,21,0)
 ;;=^^1^1^2960820^
 ;;^DD(1.5213,4,21,1,0)
 ;;=A line of M code which converts X to its key format
 ;;^DD(1.5213,4,"DT")
 ;;=2960820

DINIT2B6
DINIT2B6 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B7
Q Q
 ;;^DIC(1.5214,0,"GL")
 ;;=^DMSQ("OF",
 ;;^DIC("B","SQLI_OUTPUT_FORMAT",1.5214)
 ;;=
 ;;^DIC(1.5214,"%D",0)
 ;;=^^9^9^2970806^^^
 ;;^DIC(1.5214,"%D",1,0)
 ;;=Strategies for converting base values to external values.
 ;;^DIC(1.5214,"%D",2,0)
 ;;=In FileMan they are used to convert references to pointers to
 ;;^DIC(1.5214,"%D",3,0)
 ;;=their text values. They are also used for the SET OF CODES type.
 ;;^DIC(1.5214,"%D",4,0)
 ;;= 
 ;;^DIC(1.5214,"%D",5,0)
 ;;=SQLI projects pointer and set of codes as calls to $$GET1^DIQ, 
 ;;^DIC(1.5214,"%D",6,0)
 ;;=variable pointer into calls to $$EXTERNAL^DILFD.
 ;;^DIC(1.5214,"%D",7,0)
 ;;= 
 ;;^DIC(1.5214,"%D",8,0)
 ;;=Vendors and other users of SQLI may choose to implement their own 
 ;;^DIC(1.5214,"%D",9,0)
 ;;=conversions to improve performance.
 ;;^DD(1.5214,0)
 ;;=FIELD^^4^5
 ;;^DD(1.5214,0,"DDA")
 ;;=N
 ;;^DD(1.5214,0,"DT")
 ;;=2960820
 ;;^DD(1.5214,0,"IX","B",1.5214,.01)
 ;;=
 ;;^DD(1.5214,0,"NM","SQLI_OUTPUT_FORMAT")
 ;;=
 ;;^DD(1.5214,0,"PT",1.5211,3)
 ;;=
 ;;^DD(1.5214,0,"PT",1.5212,6)
 ;;=
 ;;^DD(1.5214,0,"PT",1.5217,16)
 ;;=
 ;;^DD(1.5214,0,"VRPK")
 ;;=DI
 ;;^DD(1.5214,.01,0)
 ;;=OF_NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.5214,.01,.1)
 ;;=Output Format
 ;;^DD(1.5214,.01,1,0)
 ;;=^.1
 ;;^DD(1.5214,.01,1,1,0)
 ;;=1.5214^B
 ;;^DD(1.5214,.01,1,1,1)
 ;;=S ^DMSQ("OF","B",$E(X,1,30),DA)=""
 ;;^DD(1.5214,.01,1,1,2)
 ;;=K ^DMSQ("OF","B",$E(X,1,30),DA)
 ;;^DD(1.5214,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(1.5214,.01,9)
 ;;=^
 ;;^DD(1.5214,.01,"DT")
 ;;=2960820
 ;;^DD(1.5214,1,0)
 ;;=OF_DATA_TYPE^RP1.5211'^DMSQ("DT",^0;2^Q
 ;;^DD(1.5214,1,3)
 ;;=Enter the ODBC data type
 ;;^DD(1.5214,1,9)
 ;;=^
 ;;^DD(1.5214,1,"DT")
 ;;=2960820
 ;;^DD(1.5214,2,0)
 ;;=OF_COMMENT^F^^0;3^K:$L(X)>60!($L(X)<3) X
 ;;^DD(1.5214,2,3)
 ;;=Answer must be 3-60 characters in length.
 ;;^DD(1.5214,2,9)
 ;;=^
 ;;^DD(1.5214,2,"DT")
 ;;=2960820
 ;;^DD(1.5214,3,0)
 ;;=OF_EXT_EXPR^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5214,3,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5214,3,9)
 ;;=^
 ;;^DD(1.5214,3,21,0)
 ;;=^^1^1^2960820^
 ;;^DD(1.5214,3,21,1,0)
 ;;=An M expression which converts the base value of X to its external value
 ;;^DD(1.5214,3,"DT")
 ;;=2960820
 ;;^DD(1.5214,4,0)
 ;;=OF_EXT_EXEC^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5214,4,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5214,4,9)
 ;;=^
 ;;^DD(1.5214,4,21,0)
 ;;=^^1^1^2960820^
 ;;^DD(1.5214,4,21,1,0)
 ;;=A line of M code which converts the base value of X to external
 ;;^DD(1.5214,4,"DT")
 ;;=2960820

DINIT2B7
DINIT2B7 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B8
Q Q
 ;;^DIC(1.5215,0,"GL")
 ;;=^DMSQ("T",
 ;;^DIC("B","SQLI_TABLE",1.5215)
 ;;=
 ;;^DIC(1.5215,"%D",0)
 ;;=^^6^6^2970806^^^
 ;;^DIC(1.5215,"%D",1,0)
 ;;=Descriptor of a set of table elements: Includes name and file no.
 ;;^DIC(1.5215,"%D",2,0)
 ;;=(See SQLI_TABLE_ELEMENTS). Each ^DD(DA) represents a table in a relational
 ;;^DIC(1.5215,"%D",3,0)
 ;;=model of FileMan. Further, each index represents a table. 
 ;;^DIC(1.5215,"%D",4,0)
 ;;= 
 ;;^DIC(1.5215,"%D",5,0)
 ;;=Each schema contains multiple tables. Each table contains just one primary
 ;;^DIC(1.5215,"%D",6,0)
 ;;=key, but multiple columns, foreign keys and indicies.
 ;;^DD(1.5215,0)
 ;;=FIELD^^8^9
 ;;^DD(1.5215,0,"DDA")
 ;;=N
 ;;^DD(1.5215,0,"DT")
 ;;=2960913
 ;;^DD(1.5215,0,"IX","B",1.5215,.01)
 ;;=
 ;;^DD(1.5215,0,"IX","C",1.5215,6)
 ;;=
 ;;^DD(1.5215,0,"IX","D",1.5215,8)
 ;;=
 ;;^DD(1.5215,0,"IX","E",1.5215,3)
 ;;=
 ;;^DD(1.5215,0,"NM","SQLI_TABLE")
 ;;=
 ;;^DD(1.5215,0,"PT",1.5212,3)
 ;;=
 ;;^DD(1.5215,0,"PT",1.5215,3)
 ;;=
 ;;^DD(1.5215,0,"PT",1.5216,2)
 ;;=
 ;;^DD(1.5215,0,"VRPK")
 ;;=DI
 ;;^DD(1.5215,.01,0)
 ;;=T_NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.5215,.01,.1)
 ;;=Table
 ;;^DD(1.5215,.01,1,0)
 ;;=^.1
 ;;^DD(1.5215,.01,1,1,0)
 ;;=1.5215^B
 ;;^DD(1.5215,.01,1,1,1)
 ;;=S ^DMSQ("T","B",$E(X,1,30),DA)=""
 ;;^DD(1.5215,.01,1,1,2)
 ;;=K ^DMSQ("T","B",$E(X,1,30),DA)
 ;;^DD(1.5215,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(1.5215,.01,9)
 ;;=^
 ;;^DD(1.5215,.01,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5215,.01,21,1,0)
 ;;=Table name must be a valid SQL identifier, unique by schema
 ;;^DD(1.5215,.01,"DT")
 ;;=2960820
 ;;^DD(1.5215,1,0)
 ;;=T_SCHEMA^RP1.521^DMSQ("S",^0;2^Q
 ;;^DD(1.5215,1,.1)
 ;;=Schema
 ;;^DD(1.5215,1,9)
 ;;=^
 ;;^DD(1.5215,1,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5215,1,21,1,0)
 ;;=IEN in SQLI_SCHEMA of the schema to which this table belongs.
 ;;^DD(1.5215,1,"DT")
 ;;=2960913
 ;;^DD(1.5215,2,0)
 ;;=T_COMMENT^F^^0;3^K:$L(X)>70!($L(X)<3) X
 ;;^DD(1.5215,2,.1)
 ;;=Description
 ;;^DD(1.5215,2,3)
 ;;=Answer must be 3-70 characters in length.
 ;;^DD(1.5215,2,9)
 ;;=^
 ;;^DD(1.5215,2,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5215,2,21,1,0)
 ;;=A short description of the table
 ;;^DD(1.5215,2,"DT")
 ;;=2960913
 ;;^DD(1.5215,3,0)
 ;;=T_MASTER_TABLE^P1.5215'^DMSQ("T",^0;4^Q
 ;;^DD(1.5215,3,.1)
 ;;=Master Table
 ;;^DD(1.5215,3,1,0)
 ;;=^.1
 ;;^DD(1.5215,3,1,1,0)
 ;;=1.5215^E
 ;;^DD(1.5215,3,1,1,1)
 ;;=S ^DMSQ("T","E",$E(X,1,30),DA)=""
 ;;^DD(1.5215,3,1,1,2)
 ;;=K ^DMSQ("T","E",$E(X,1,30),DA)
 ;;^DD(1.5215,3,1,1,"%D",0)
 ;;=^^1^1^2960904^
 ;;^DD(1.5215,3,1,1,"%D",1,0)
 ;;=Table by master table
 ;;^DD(1.5215,3,1,1,"DT")
 ;;=2960904
 ;;^DD(1.5215,3,3)
 ;;=Enter only if this table is an index
 ;;^DD(1.5215,3,9)
 ;;=^
 ;;^DD(1.5215,3,21,0)
 ;;=^^1^1^2960926^^^
 ;;^DD(1.5215,3,21,1,0)
 ;;=The table of which this table is an index. (Only index tables)
 ;;^DD(1.5215,3,23,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5215,3,23,1,0)
 ;;=In SQL, and in the relational model, an index is just a table.
 ;;^DD(1.5215,3,"DT")
 ;;=2960913
 ;;^DD(1.5215,4,0)
 ;;=T_VERSION_FM^NJ9,0^^0;5^K:+X'=X!(X>999999999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5215,4,.1)
 ;;=Version
 ;;^DD(1.5215,4,3)
 ;;=Type a Number between 1 and 999999999, 0 Decimal Digits
 ;;^DD(1.5215,4,9)
 ;;=^
 ;;^DD(1.5215,4,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5215,4,21,1,0)
 ;;=The version number is updated by FileMan when ^DD or ^DIC changes.
 ;;^DD(1.5215,4,"DT")
 ;;=2960926
 ;;^DD(1.5215,5,0)
 ;;=T_ROW_COUNT^NJ9,0^^0;6^K:+X'=X!(X>999999999)!(X<0)!(X?.E1"."1N.N) X
 ;;^DD(1.5215,5,.1)
 ;;=Row Count
 ;;^DD(1.5215,5,3)
 ;;=Type a Number between 0 and 999999999, 0 Decimal Digits
 ;;^DD(1.5215,5,9)
 ;;=^
 ;;^DD(1.5215,5,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5215,5,21,1,0)
 ;;=This field should contain an estimate of the number of rows in the table
 ;;^DD(1.5215,5,"DT")
 ;;=2960926
 ;;^DD(1.5215,6,0)
 ;;=T_FILE^RNJ19,9O^^0;7^K:+X'=X!(X>999999999)!(X<0)!(X?.E1"."10N.N) X
 ;;^DD(1.5215,6,.1)
 ;;=Source File
 ;;^DD(1.5215,6,1,0)
 ;;=^.1
 ;;^DD(1.5215,6,1,1,0)
 ;;=1.5215^C
 ;;^DD(1.5215,6,1,1,1)
 ;;=S ^DMSQ("T","C",$E(X,1,30),DA)=""
 ;;^DD(1.5215,6,1,1,2)
 ;;=K ^DMSQ("T","C",$E(X,1,30),DA)
 ;;^DD(1.5215,6,1,1,"%D",0)
 ;;=^^1^1^2960902^^
 ;;^DD(1.5215,6,1,1,"%D",1,0)
 ;;=Table by source file index
 ;;^DD(1.5215,6,1,1,"DT")
 ;;=2960822
 ;;^DD(1.5215,6,2)
 ;;=S Y(0)=Y S Y=$S('Y:"",$D(^DIC(+Y)):$P(^(+Y,0),U),1:$O(^DD(+Y,0,"NM","")))
 ;;^DD(1.5215,6,2.1)
 ;;=S Y=$S('Y:"",$D(^DIC(+Y)):$P(^(+Y,0),U),1:$O(^DD(+Y,0,"NM","")))
 ;;^DD(1.5215,6,3)
 ;;=Type a Number between 0 and 999999999, 9 Decimal Digits
 ;;^DD(1.5215,6,9)
 ;;=^
 ;;^DD(1.5215,6,21,0)
 ;;=^^1^1^2960926^^^
 ;;^DD(1.5215,6,21,1,0)
 ;;=FileMan file number from which table is derived.
 ;;^DD(1.5215,6,23,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5215,6,23,1,0)
 ;;=This may be a subfile number
 ;;^DD(1.5215,6,"DT")
 ;;=2960908
 ;;^DD(1.5215,7,0)
 ;;=T_UPDATE^D^^0;8^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.5215,7,.1)
 ;;=Last Updated
 ;;^DD(1.5215,7,9)
 ;;=^
 ;;^DD(1.5215,7,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5215,7,21,1,0)
 ;;=Date last updated.
 ;;^DD(1.5215,7,"DT")
 ;;=2960821
 ;;^DD(1.5215,8,0)
 ;;=T_GLOBAL^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5215,8,.1)
 ;;=Global Root
 ;;^DD(1.5215,8,1,0)
 ;;=^.1
 ;;^DD(1.5215,8,1,1,0)
 ;;=1.5215^D
 ;;^DD(1.5215,8,1,1,1)
 ;;=S ^DMSQ("T","D",$E(X,1,30),DA)=""
 ;;^DD(1.5215,8,1,1,2)
 ;;=K ^DMSQ("T","D",$E(X,1,30),DA)
 ;;^DD(1.5215,8,1,1,"%D",0)
 ;;=^^1^1^2960822^
 ;;^DD(1.5215,8,1,1,"%D",1,0)
 ;;=Table by global name. Used for structural study.
 ;;^DD(1.5215,8,1,1,"DT")
 ;;=2960822
 ;;^DD(1.5215,8,3)
 ;;=A valid M global variable name using {K} for subscripts
 ;;^DD(1.5215,8,9)
 ;;=^
 ;;^DD(1.5215,8,21,0)
 ;;=^^2^2^2960926^^^^
 ;;^DD(1.5215,8,21,1,0)
 ;;=Global variable name. {K} stands for a subscript
 ;;^DD(1.5215,8,21,2,0)
 ;;=E.g.: ^DIC(9.4,{K},3,{K},4,{K})
 ;;^DD(1.5215,8,23,0)
 ;;=^^1^1^2960926^^^
 ;;^DD(1.5215,8,23,1,0)
 ;;=Used to piece out global fragments for columns
 ;;^DD(1.5215,8,"DT")
 ;;=2960926

DINIT2B8
DINIT2B8 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2B9
Q Q
 ;;^DIC(1.5216,0,"GL")
 ;;=^DMSQ("E",
 ;;^DIC("B","SQLI_TABLE_ELEMENT",1.5216)
 ;;=
 ;;^DIC(1.5216,"%D",0)
 ;;=^^5^5^2970806^^^
 ;;^DIC(1.5216,"%D",1,0)
 ;;=Names and domains of primary keys, columns and foreign keys.
 ;;^DIC(1.5216,"%D",2,0)
 ;;=Each represents the relational concept of an attribute, whose essential
 ;;^DIC(1.5216,"%D",3,0)
 ;;=charactaristics are a name (unique by relation) and a domain.
 ;;^DIC(1.5216,"%D",4,0)
 ;;= 
 ;;^DIC(1.5216,"%D",5,0)
 ;;=See SQLI_PRIMARY_KEY, SQLI_COLUMN and SQLI_FOREIGN key for more.
 ;;^DD(1.5216,0)
 ;;=FIELD^^4^5
 ;;^DD(1.5216,0,"DDA")
 ;;=N
 ;;^DD(1.5216,0,"DT")
 ;;=2960820
 ;;^DD(1.5216,0,"IX","B",1.5216,.01)
 ;;=
 ;;^DD(1.5216,0,"IX","C",1.5216,1)
 ;;=
 ;;^DD(1.5216,0,"IX","D",1.5216,2)
 ;;=
 ;;^DD(1.5216,0,"IX","E",1.5216,3)
 ;;=
 ;;^DD(1.5216,0,"IX","F",1.5216,3)
 ;;=
 ;;^DD(1.5216,0,"IX","G",1.5216,2)
 ;;=
 ;;^DD(1.5216,0,"NM","SQLI_TABLE_ELEMENT")
 ;;=
 ;;^DD(1.5216,0,"PT",1.5217,.01)
 ;;=
 ;;^DD(1.5216,0,"PT",1.5218,.01)
 ;;=
 ;;^DD(1.5216,0,"PT",1.5219,.01)
 ;;=
 ;;^DD(1.5216,0,"VRPK")
 ;;=DI
 ;;^DD(1.5216,.01,0)
 ;;=E_NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'($TR(X,"_")?1U.UN) X
 ;;^DD(1.5216,.01,.1)
 ;;=Table Element
 ;;^DD(1.5216,.01,1,0)
 ;;=^.1
 ;;^DD(1.5216,.01,1,1,0)
 ;;=1.5216^B
 ;;^DD(1.5216,.01,1,1,1)
 ;;=S ^DMSQ("E","B",$E(X,1,30),DA)=""
 ;;^DD(1.5216,.01,1,1,2)
 ;;=K ^DMSQ("E","B",$E(X,1,30),DA)
 ;;^DD(1.5216,.01,3)
 ;;=Answer must be 3-30 characters in length.
 ;;^DD(1.5216,.01,9)
 ;;=^
 ;;^DD(1.5216,.01,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5216,.01,21,1,0)
 ;;=Name of table element.
 ;;^DD(1.5216,.01,21,2,0)
 ;;=Foreign keys are suffixed _FK or PFK. Primary keys are suffixed _PK.
 ;;^DD(1.5216,.01,"DT")
 ;;=2960820
 ;;^DD(1.5216,1,0)
 ;;=E_DOMAIN^RP1.5212'^DMSQ("DM",^0;2^Q
 ;;^DD(1.5216,1,.1)
 ;;=Domain
 ;;^DD(1.5216,1,1,0)
 ;;=^.1
 ;;^DD(1.5216,1,1,1,0)
 ;;=1.5216^C
 ;;^DD(1.5216,1,1,1,1)
 ;;=S ^DMSQ("E","C",$E(X,1,30),DA)=""
 ;;^DD(1.5216,1,1,1,2)
 ;;=K ^DMSQ("E","C",$E(X,1,30),DA)
 ;;^DD(1.5216,1,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5216,1,9)
 ;;=^
 ;;^DD(1.5216,1,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5216,1,21,1,0)
 ;;=IEN of domain in SQLI_DOMAIN
 ;;^DD(1.5216,1,"DT")
 ;;=2960926
 ;;^DD(1.5216,2,0)
 ;;=E_TABLE^RP1.5215'^DMSQ("T",^0;3^Q
 ;;^DD(1.5216,2,.1)
 ;;=Table
 ;;^DD(1.5216,2,1,0)
 ;;=^.1
 ;;^DD(1.5216,2,1,1,0)
 ;;=1.5216^D
 ;;^DD(1.5216,2,1,1,1)
 ;;=S ^DMSQ("E","D",$E(X,1,30),DA)=""
 ;;^DD(1.5216,2,1,1,2)
 ;;=K ^DMSQ("E","D",$E(X,1,30),DA)
 ;;^DD(1.5216,2,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5216,2,1,2,0)
 ;;=1.5216^G^MUMPS
 ;;^DD(1.5216,2,1,2,1)
 ;;=S ^DMSQ("E","G",X,$P(^DMSQ("E",DA,0),U),DA)=""
 ;;^DD(1.5216,2,1,2,2)
 ;;=K ^DMSQ("E","G",X,$P(^DMSQ("E",DA,0),U),DA)
 ;;^DD(1.5216,2,1,2,"%D",0)
 ;;=^^1^1^2960903^
 ;;^DD(1.5216,2,1,2,"%D",1,0)
 ;;=Table element by table by name
 ;;^DD(1.5216,2,1,2,"DT")
 ;;=2960903
 ;;^DD(1.5216,2,9)
 ;;=^
 ;;^DD(1.5216,2,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5216,2,21,1,0)
 ;;=IEN of table in SQLI_TABLE. Required.
 ;;^DD(1.5216,2,"DT")
 ;;=2960926
 ;;^DD(1.5216,3,0)
 ;;=E_TYPE^RS^C:Column;P:Primary key;F:Foreign key;^0;4^Q
 ;;^DD(1.5216,3,.1)
 ;;=Type
 ;;^DD(1.5216,3,1,0)
 ;;=^.1
 ;;^DD(1.5216,3,1,1,0)
 ;;=1.5216^E
 ;;^DD(1.5216,3,1,1,1)
 ;;=S ^DMSQ("E","E",$E(X,1,30),DA)=""
 ;;^DD(1.5216,3,1,1,2)
 ;;=K ^DMSQ("E","E",$E(X,1,30),DA)
 ;;^DD(1.5216,3,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5216,3,1,2,0)
 ;;=1.5216^F^MUMPS
 ;;^DD(1.5216,3,1,2,1)
 ;;=S ^DMSQ("E","F",$P(^DMSQ("E",DA,0),U,3),X,DA)=""
 ;;^DD(1.5216,3,1,2,2)
 ;;=K ^DMSQ("E","F",$P(^DMSQ("E",DA,0),U,3),X,DA)
 ;;^DD(1.5216,3,1,2,"%D",0)
 ;;=^^1^1^2960827^^^^
 ;;^DD(1.5216,3,1,2,"%D",1,0)
 ;;=Table element by table by type
 ;;^DD(1.5216,3,1,2,"DT")
 ;;=2960827
 ;;^DD(1.5216,3,9)
 ;;=^
 ;;^DD(1.5216,3,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5216,3,21,1,0)
 ;;=C for column, P for primary key, or F for foreign key
 ;;^DD(1.5216,3,"DT")
 ;;=2960926
 ;;^DD(1.5216,4,0)
 ;;=E_COMMENT^F^^0;5^K:$L(X)>60!($L(X)<3) X
 ;;^DD(1.5216,4,.1)
 ;;=Comment
 ;;^DD(1.5216,4,3)
 ;;=Answer must be 3-60 characters in length.
 ;;^DD(1.5216,4,9)
 ;;=^
 ;;^DD(1.5216,4,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5216,4,21,1,0)
 ;;=A short description of the element
 ;;^DD(1.5216,4,"DT")
 ;;=2960926

DINIT2B9
DINIT2B9 ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2BA
Q Q
 ;;^DIC(1.5217,0,"GL")
 ;;=^DMSQ("C",
 ;;^DIC("B","SQLI_COLUMN",1.5217)
 ;;=
 ;;^DIC(1.5217,"%D",0)
 ;;=^^6^6^2970806^^
 ;;^DIC(1.5217,"%D",1,0)
 ;;=A set of formatting and physical structure specifications.
 ;;^DIC(1.5217,"%D",2,0)
 ;;=Each column specification has a column type table element
 ;;^DIC(1.5217,"%D",3,0)
 ;;=(SQLI_TABLE_ELEMENT) which contains the relational specifications, name
 ;;^DIC(1.5217,"%D",4,0)
 ;;=and domain. The column specification contains those attributes required
 ;;^DIC(1.5217,"%D",5,0)
 ;;=to locate the value in the global structure, and to project the value to
 ;;^DIC(1.5217,"%D",6,0)
 ;;=the user.
 ;;^DD(1.5217,0)
 ;;=FIELD^^16^17
 ;;^DD(1.5217,0,"DT")
 ;;=2970311
 ;;^DD(1.5217,0,"IX","B",1.5217,.01)
 ;;=
 ;;^DD(1.5217,0,"IX","C",1.5217,8)
 ;;=
 ;;^DD(1.5217,0,"IX","D",1.5217,4)
 ;;=
 ;;^DD(1.5217,0,"IX","E",1.5217,16)
 ;;=
 ;;^DD(1.5217,0,"NM","SQLI_COLUMN")
 ;;=
 ;;^DD(1.5217,0,"PT",1.5217,8)
 ;;=
 ;;^DD(1.5217,0,"PT",1.5218,1)
 ;;=
 ;;^DD(1.5217,0,"PT",1.5219,2)
 ;;=
 ;;^DD(1.5217,0,"VRPK")
 ;;=DI
 ;;^DD(1.5217,.01,0)
 ;;=C_TABLE_ELEMENT^RP1.5216'^DMSQ("E",^0;1^Q
 ;;^DD(1.5217,.01,.1)
 ;;=Table Element
 ;;^DD(1.5217,.01,1,0)
 ;;=^.1
 ;;^DD(1.5217,.01,1,1,0)
 ;;=1.5217^B
 ;;^DD(1.5217,.01,1,1,1)
 ;;=S ^DMSQ("C","B",$E(X,1,30),DA)=""
 ;;^DD(1.5217,.01,1,1,2)
 ;;=K ^DMSQ("C","B",$E(X,1,30),DA)
 ;;^DD(1.5217,.01,3)
 ;;=
 ;;^DD(1.5217,.01,9)
 ;;=^
 ;;^DD(1.5217,.01,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5217,.01,21,1,0)
 ;;=IEN of table element.
 ;;^DD(1.5217,.01,"DT")
 ;;=2960820
 ;;^DD(1.5217,1,0)
 ;;=C_FILE^NJ16,6^^0;5^K:+X'=X!(X>999999999.999999)!(X<1)!(X?.E1"."7N.N) X
 ;;^DD(1.5217,1,.1)
 ;;=File ID
 ;;^DD(1.5217,1,3)
 ;;=Type a Number between 1 and 999999999.999999, 6 Decimal Digits
 ;;^DD(1.5217,1,9)
 ;;=^
 ;;^DD(1.5217,1,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,1,21,1,0)
 ;;=FileMan file (or subfile) ID, if column was derived from ^DD.
 ;;^DD(1.5217,1,21,2,0)
 ;;= NULL if column is generated by SQLI.
 ;;^DD(1.5217,1,"DT")
 ;;=2960926
 ;;^DD(1.5217,2,0)
 ;;=C_WIDTH^NJ2,0^^0;2^K:+X'=X!(X>22)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5217,2,.1)
 ;;=Width
 ;;^DD(1.5217,2,3)
 ;;=Type an integer between 1 and 999999999999999
 ;;^DD(1.5217,2,9)
 ;;=^
 ;;^DD(1.5217,2,21,0)
 ;;=^^3^3^2960926^
 ;;^DD(1.5217,2,21,1,0)
 ;;=Field width for display
 ;;^DD(1.5217,2,21,2,0)
 ;;=This field is estimated by SQLI from evidence in ^DD unless it's specified
 ;;^DD(1.5217,2,21,3,0)
 ;;=with J modifier.
 ;;^DD(1.5217,2,"DT")
 ;;=2960820
 ;;^DD(1.5217,3,0)
 ;;=C_SCALE^NJ1,0^^0;3^K:+X'=X!(X>9)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5217,3,.1)
 ;;=Dec. Pt.
 ;;^DD(1.5217,3,3)
 ;;=Type a Number between 1 and 9, 0 Decimal Digits
 ;;^DD(1.5217,3,9)
 ;;=^
 ;;^DD(1.5217,3,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,3,21,1,0)
 ;;=Number of decimal points to display on output (numeric only).
 ;;^DD(1.5217,3,21,2,0)
 ;;=If scale is specified as 0, SQLI projects column as integer.
 ;;^DD(1.5217,3,"DT")
 ;;=2960926
 ;;^DD(1.5217,4,0)
 ;;=C_FIELD^NJ15,7^^0;6^K:+X'=X!(X>9999999.9999999)!(X<.001)!(X?.E1"."8N.N) X
 ;;^DD(1.5217,4,1,0)
 ;;=^.1
 ;;^DD(1.5217,4,1,1,0)
 ;;=1.5217^D^MUMPS
 ;;^DD(1.5217,4,1,1,1)
 ;;=S ^DMSQ("C","D",$P(^DMSQ("C",DA,0),U,5),X,DA)=""
 ;;^DD(1.5217,4,1,1,2)
 ;;=K ^DMSQ("C","D",$P(^DMSQ("C",DA,0),U,5),X,DA)
 ;;^DD(1.5217,4,1,1,"%D",0)
 ;;=^^1^1^2960827^
 ;;^DD(1.5217,4,1,1,"%D",1,0)
 ;;=Column by FileMan File number, by field number
 ;;^DD(1.5217,4,1,1,"DT")
 ;;=2960827
 ;;^DD(1.5217,4,3)
 ;;=Type a Number between .001 and 9999999.9999999, 7 Decimal Digits
 ;;^DD(1.5217,4,9)
 ;;=^
 ;;^DD(1.5217,4,21,0)
 ;;=^^2^2^2970311^^^
 ;;^DD(1.5217,4,21,1,0)
 ;;=FileMan field ID from ^DD
 ;;^DD(1.5217,4,21,2,0)
 ;;=NULL unless column is derived directly from the data dictionary.
 ;;^DD(1.5217,4,"DT")
 ;;=2970311
 ;;^DD(1.5217,5,0)
 ;;=C_NOT_NULL^S^0:Not required;1:Required;^0;7^Q
 ;;^DD(1.5217,5,.1)
 ;;=Req.
 ;;^DD(1.5217,5,9)
 ;;=^
 ;;^DD(1.5217,5,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5217,5,21,1,0)
 ;;=When true (1) value is required, when false (0) not required.
 ;;^DD(1.5217,5,"DT")
 ;;=2960926
 ;;^DD(1.5217,6,0)
 ;;=C_SECURE^S^0:Not secure;1:Secure;^0;8^Q
 ;;^DD(1.5217,6,.1)
 ;;=Secure
 ;;^DD(1.5217,6,9)
 ;;=^
 ;;^DD(1.5217,6,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,6,21,1,0)
 ;;=If true, there is a security screen, else not.
 ;;^DD(1.5217,6,21,2,0)
 ;;=When this flag is set, vendors should use DBS to retrieve data.
 ;;^DD(1.5217,6,"DT")
 ;;=2960926
 ;;^DD(1.5217,7,0)
 ;;=C_VIRTUAL^S^0:Base column;1:Calculated value column;^0;9^Q
 ;;^DD(1.5217,7,.1)
 ;;=Virtual
 ;;^DD(1.5217,7,9)
 ;;=^
 ;;^DD(1.5217,7,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,7,21,1,0)
 ;;=If true, the value is computed.
 ;;^DD(1.5217,7,21,2,0)
 ;;=Vendors should use DBS to get value.
 ;;^DD(1.5217,7,"DT")
 ;;=2960926
 ;;^DD(1.5217,8,0)
 ;;=C_PARENT^P1.5217'^DMSQ("C",^0;10^Q
 ;;^DD(1.5217,8,.1)
 ;;=Parent Column
 ;;^DD(1.5217,8,1,0)
 ;;=^.1
 ;;^DD(1.5217,8,1,1,0)
 ;;=1.5217^C
 ;;^DD(1.5217,8,1,1,1)
 ;;=S ^DMSQ("C","C",$E(X,1,30),DA)=""
 ;;^DD(1.5217,8,1,1,2)
 ;;=K ^DMSQ("C","C",$E(X,1,30),DA)
 ;;^DD(1.5217,8,1,1,"%D",0)
 ;;=^^1^1^2960823^
 ;;^DD(1.5217,8,1,1,"%D",1,0)
 ;;=Column by parent column
 ;;^DD(1.5217,8,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5217,8,9)
 ;;=^
 ;;^DD(1.5217,8,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,8,21,1,0)
 ;;=Column whose physical global structure precedes this column.
 ;;^DD(1.5217,8,21,2,0)
 ;;=Used to construct global root. Chain goes back to ^DIC.
 ;;^DD(1.5217,8,"DT")
 ;;=2960926
 ;;^DD(1.5217,9,0)
 ;;=C_GLOBAL^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5217,9,.1)
 ;;=Global
 ;;^DD(1.5217,9,3)
 ;;=M global fragment which precedes this element
 ;;^DD(1.5217,9,9)
 ;;=^
 ;;^DD(1.5217,9,21,0)
 ;;=^^3^3^2960926^
 ;;^DD(1.5217,9,21,1,0)
 ;;=M global fragment between this column and parent column.
 ;;^DD(1.5217,9,21,2,0)
 ;;=Contains node specifier for non-key columns. Key columns are constructed
 ;;^DD(1.5217,9,21,3,0)
 ;;=by SQLI and contain the multiple node specifier or ^DIC root.
 ;;^DD(1.5217,9,"DT")
 ;;=2960926
 ;;^DD(1.5217,10,0)
 ;;=C_PIECE^NJ2,0^^0;11^K:+X'=X!(X>99)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5217,10,.1)
 ;;=Piece
 ;;^DD(1.5217,10,3)
 ;;=Type a Number between 1 and 99, 0 Decimal Digits
 ;;^DD(1.5217,10,9)
 ;;=^
 ;;^DD(1.5217,10,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,10,21,1,0)
 ;;=The piece address of the column in a data string.
 ;;^DD(1.5217,10,21,2,0)
 ;;=If the piece address was of form E1,30, this value is null.
 ;;^DD(1.5217,10,"DT")
 ;;=2960926
 ;;^DD(1.5217,11,0)
 ;;=C_EXTRACT_FROM^NJ3,0^^0;12^K:+X'=X!(X>511)!(X<1)!(X?.E1"."1N.N) X

DINIT2BA
DINIT2BA ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2BB
Q Q
 ;;^DD(1.5217,11,.1)
 ;;=Ext. Frm.
 ;;^DD(1.5217,11,3)
 ;;=Type a Number between 1 and 511, 0 Decimal Digits
 ;;^DD(1.5217,11,9)
 ;;=^
 ;;^DD(1.5217,11,21,0)
 ;;=^^2^2^2960926^^^
 ;;^DD(1.5217,11,21,1,0)
 ;;=First character to be extracted with $EXTRACT
 ;;^DD(1.5217,11,21,2,0)
 ;;=NULL unless specified by form E1,30.
 ;;^DD(1.5217,11,"DT")
 ;;=2960926
 ;;^DD(1.5217,12,0)
 ;;=C_EXTRACT_THRU^NJ3,0^^0;13^K:+X'=X!(X>511)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5217,12,.1)
 ;;=Ext. Thru
 ;;^DD(1.5217,12,3)
 ;;=Type a Number between 1 and 511, 0 Decimal Digits
 ;;^DD(1.5217,12,9)
 ;;=^
 ;;^DD(1.5217,12,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5217,12,21,1,0)
 ;;=Last character to extract with $E
 ;;^DD(1.5217,12,"DT")
 ;;=2960926
 ;;^DD(1.5217,13,0)
 ;;=C_COMPUTE_EXEC^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5217,13,.1)
 ;;=Computation
 ;;^DD(1.5217,13,3)
 ;;=M code to return value in {V}: machine generated
 ;;^DD(1.5217,13,4)
 ;;=W ?5,"Enter code to return value in {V}"
 ;;^DD(1.5217,13,9)
 ;;=^
 ;;^DD(1.5217,13,21,0)
 ;;=^^1^1^2970311^^^^
 ;;^DD(1.5217,13,21,1,0)
 ;;=Computation execute uses $$GET1^DIQ to return code by default
 ;;^DD(1.5217,13,"DT")
 ;;=2960926
 ;;^DD(1.5217,14,0)
 ;;=C_FM_EXEC^K^^3;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5217,14,.1)
 ;;=FileMan Retrieval Strategy
 ;;^DD(1.5217,14,3)
 ;;=Don't enter manually: machine generated.
 ;;^DD(1.5217,14,4)
 ;;=W ?5,"Don't enter this. It should be auto-generated."
 ;;^DD(1.5217,14,9)
 ;;=^
 ;;^DD(1.5217,14,21,0)
 ;;=^^2^2^2970311^^^^
 ;;^DD(1.5217,14,21,1,0)
 ;;=Standard $$GET1^DIQ code to return value of pointer, variable pointer
 ;;^DD(1.5217,14,21,2,0)
 ;;=and computed values, or when security flag is set
 ;;^DD(1.5217,14,"DT")
 ;;=2960926
 ;;^DD(1.5217,15,0)
 ;;=C_POINTER^K^^4;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5217,15,.1)
 ;;=Pointer or Set Param
 ;;^DD(1.5217,15,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5217,15,9)
 ;;=^
 ;;^DD(1.5217,15,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5217,15,21,1,0)
 ;;=Set translation string for SET, or global root for POINTER
 ;;^DD(1.5217,15,"DT")
 ;;=2960906
 ;;^DD(1.5217,16,0)
 ;;=C_OUTPUT_FORMAT^P1.5214'^DMSQ("OF",^0;4^Q
 ;;^DD(1.5217,16,.1)
 ;;=Output Format
 ;;^DD(1.5217,16,1,0)
 ;;=^.1
 ;;^DD(1.5217,16,1,1,0)
 ;;=1.5217^E
 ;;^DD(1.5217,16,1,1,1)
 ;;=S ^DMSQ("C","E",$E(X,1,30),DA)=""
 ;;^DD(1.5217,16,1,1,2)
 ;;=K ^DMSQ("C","E",$E(X,1,30),DA)
 ;;^DD(1.5217,16,1,1,"%D",0)
 ;;=^^1^1^2960909^
 ;;^DD(1.5217,16,1,1,"%D",1,0)
 ;;=Column by output format
 ;;^DD(1.5217,16,1,1,"DT")
 ;;=2960909
 ;;^DD(1.5217,16,9)
 ;;=^
 ;;^DD(1.5217,16,21,0)
 ;;=^^2^2^2960926^
 ;;^DD(1.5217,16,21,1,0)
 ;;=IEN of default output format in SQLI_OUTPUT_FORMAT for this column
 ;;^DD(1.5217,16,21,2,0)
 ;;=Always present for SET, POINTER and VARIABLE-POINTER data types
 ;;^DD(1.5217,16,"DT")
 ;;=2960926

DINIT2BB
DINIT2BB ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2BC
Q Q
 ;;^DIC(1.5218,0,"GL")
 ;;=^DMSQ("P",
 ;;^DIC("B","SQLI_PRIMARY_KEY",1.5218)
 ;;=
 ;;^DIC(1.5218,"%D",0)
 ;;=^^9^9^2970806^^^
 ;;^DIC(1.5218,"%D",1,0)
 ;;=A chosen set of columns which uniquely identify a table.
 ;;^DIC(1.5218,"%D",2,0)
 ;;=In the relational model (as in set theory) the columns of a primary key
 ;;^DIC(1.5218,"%D",3,0)
 ;;=are not ordered. In SQLI they must be, in order to map to the quasi-
 ;;^DIC(1.5218,"%D",4,0)
 ;;=hierarchical model of M globals.
 ;;^DIC(1.5218,"%D",5,0)
 ;;= 
 ;;^DIC(1.5218,"%D",6,0)
 ;;=FileMan subfiles (multiples) have a primary key element for each parent
 ;;^DIC(1.5218,"%D",7,0)
 ;;=plus one for the subfile. Each contains a pointer to its primary key table
 ;;^DIC(1.5218,"%D",8,0)
 ;;=element (SQLI_TABLE-ELEMENT), a sequence and a column in the local base
 ;;^DIC(1.5218,"%D",9,0)
 ;;= table (SQL_COLUMN).
 ;;^DD(1.5218,0)
 ;;=FIELD^^7^8
 ;;^DD(1.5218,0,"DDA")
 ;;=N
 ;;^DD(1.5218,0,"DT")
 ;;=2961014
 ;;^DD(1.5218,0,"IX","B",1.5218,.01)
 ;;=
 ;;^DD(1.5218,0,"IX","C",1.5218,2)
 ;;=
 ;;^DD(1.5218,0,"IX","D",1.5218,1)
 ;;=
 ;;^DD(1.5218,0,"NM","SQLI_PRIMARY_KEY")
 ;;=
 ;;^DD(1.5218,0,"PT",1.5219,1)
 ;;=
 ;;^DD(1.5218,0,"VRPK")
 ;;=DI
 ;;^DD(1.5218,.01,0)
 ;;=P_TBL_ELEMENT^RP1.5216'^DMSQ("E",^0;1^Q
 ;;^DD(1.5218,.01,.1)
 ;;=Key Element
 ;;^DD(1.5218,.01,1,0)
 ;;=^.1
 ;;^DD(1.5218,.01,1,1,0)
 ;;=1.5218^B
 ;;^DD(1.5218,.01,1,1,1)
 ;;=S ^DMSQ("P","B",$E(X,1,30),DA)=""
 ;;^DD(1.5218,.01,1,1,2)
 ;;=K ^DMSQ("P","B",$E(X,1,30),DA)
 ;;^DD(1.5218,.01,3)
 ;;=
 ;;^DD(1.5218,.01,9)
 ;;=^
 ;;^DD(1.5218,.01,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5218,.01,21,1,0)
 ;;=IEN of table element in SQLI_TABLE_ELEMENT
 ;;^DD(1.5218,.01,"DT")
 ;;=2960823
 ;;^DD(1.5218,1,0)
 ;;=P_COLUMN^RP1.5217'^DMSQ("C",^0;2^Q
 ;;^DD(1.5218,1,.1)
 ;;=Column
 ;;^DD(1.5218,1,1,0)
 ;;=^.1
 ;;^DD(1.5218,1,1,1,0)
 ;;=1.5218^D
 ;;^DD(1.5218,1,1,1,1)
 ;;=S ^DMSQ("P","D",$E(X,1,30),DA)=""
 ;;^DD(1.5218,1,1,1,2)
 ;;=K ^DMSQ("P","D",$E(X,1,30),DA)
 ;;^DD(1.5218,1,1,1,"DT")
 ;;=2960830
 ;;^DD(1.5218,1,9)
 ;;=^
 ;;^DD(1.5218,1,21,0)
 ;;=^^1^1^2960926^^^
 ;;^DD(1.5218,1,21,1,0)
 ;;=IEN of column in SQLI_COLUMN corresponding to this primary key
 ;;^DD(1.5218,1,"DT")
 ;;=2960830
 ;;^DD(1.5218,2,0)
 ;;=P_SEQUENCE^RNJ1,0^^0;3^K:+X'=X!(X>9)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1.5218,2,.1)
 ;;=Seq
 ;;^DD(1.5218,2,1,0)
 ;;=^.1
 ;;^DD(1.5218,2,1,1,0)
 ;;=1.5218^C^MUMPS
 ;;^DD(1.5218,2,1,1,1)
 ;;=S ^DMSQ("P","C",$P(^DMSQ("P",DA,0),U),X,DA)=""
 ;;^DD(1.5218,2,1,1,2)
 ;;=K ^DMSQ("P","C",$P(^DMSQ("P",DA,0),U),X,DA)
 ;;^DD(1.5218,2,1,1,"%D",0)
 ;;=^^1^1^2960827^^
 ;;^DD(1.5218,2,1,1,"%D",1,0)
 ;;=Primary key by table by sequence
 ;;^DD(1.5218,2,1,1,"DT")
 ;;=2960823
 ;;^DD(1.5218,2,3)
 ;;=Type a Number between 1 and 9, 0 Decimal Digits
 ;;^DD(1.5218,2,9)
 ;;=^
 ;;^DD(1.5218,2,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5218,2,21,1,0)
 ;;=Sequence number of primary key
 ;;^DD(1.5218,2,23,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5218,2,23,1,0)
 ;;=Sequence is automatically generated and must not be changed.
 ;;^DD(1.5218,2,"DT")
 ;;=2960926
 ;;^DD(1.5218,3,0)
 ;;=P_START_AT^F^^0;4^K:$L(X)>30!($L(X)<1) X
 ;;^DD(1.5218,3,.1)
 ;;=Start
 ;;^DD(1.5218,3,3)
 ;;=Answer must be 1-30 characters in length.
 ;;^DD(1.5218,3,9)
 ;;=^
 ;;^DD(1.5218,3,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5218,3,21,1,0)
 ;;=Initial value of key before a $ORDER loop
 ;;^DD(1.5218,3,"DT")
 ;;=2960820
 ;;^DD(1.5218,4,0)
 ;;=P_END_IF^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5218,4,.1)
 ;;=End If
 ;;^DD(1.5218,4,3)
 ;;=This is a Standard M expression returning False at end
 ;;^DD(1.5218,4,9)
 ;;=^
 ;;^DD(1.5218,4,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5218,4,21,1,0)
 ;;=M expression in key value, {K}, which, if false, ends the $ORDER loop
 ;;^DD(1.5218,4,"DT")
 ;;=2960926
 ;;^DD(1.5218,5,0)
 ;;=P_ROW_COUNT^NJ10,2^^0;5^K:+X'=X!(X>9999999)!(X<1)!(X?.E1"."3N.N) X
 ;;^DD(1.5218,5,.1)
 ;;=Rows
 ;;^DD(1.5218,5,3)
 ;;=Type a Number between 1 and 9999999, 2 Decimal Digits
 ;;^DD(1.5218,5,9)
 ;;=^
 ;;^DD(1.5218,5,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5218,5,21,1,0)
 ;;=Estimated number of rows per record set at this level
 ;;^DD(1.5218,5,"DT")
 ;;=2960926
 ;;^DD(1.5218,6,0)
 ;;=P_PRESELECT^K^^2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(1.5218,6,.1)
 ;;=Preselect M Code
 ;;^DD(1.5218,6,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(1.5218,6,9)
 ;;=^
 ;;^DD(1.5218,6,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.5218,6,21,1,0)
 ;;=Code to be executed before selecting this key, before optimization.
 ;;^DD(1.5218,6,"DT")
 ;;=2960926
 ;;^DD(1.5218,7,0)
 ;;=P_KEY_FORMAT^P1.5213'^DMSQ("KF",^0;6^Q
 ;;^DD(1.5218,7,9)
 ;;=^
 ;;^DD(1.5218,7,21,0)
 ;;=^^4^4^2961014^
 ;;^DD(1.5218,7,21,1,0)
 ;;=Key formats map internal storage values to their value when used as keys.
 ;;^DD(1.5218,7,21,2,0)
 ;;=In general, information is lost in the process; they can't be converted
 ;;^DD(1.5218,7,21,3,0)
 ;;=back. This means data must be converted to key format before it can be
 ;;^DD(1.5218,7,21,4,0)
 ;;=compared to such a key.
 ;;^DD(1.5218,7,"DT")
 ;;=2961014

DINIT2BC
DINIT2BC ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2BD
Q Q
 ;;^DIC(1.5219,0,"GL")
 ;;=^DMSQ("F",
 ;;^DIC("B","SQLI_FOREIGN_KEY",1.5219)
 ;;=
 ;;^DIC(1.5219,"%D",0)
 ;;=^^6^6^2970806^^^^
 ;;^DIC(1.5219,"%D",1,0)
 ;;=A set of columns in a table that match the primary key of another table.
 ;;^DIC(1.5219,"%D",2,0)
 ;;= They represent an explicit join of the two tables. Each foreign key
 ;;^DIC(1.5219,"%D",3,0)
 ;;= element points to it's table element (SQLI_TABLE_ELEMENT),
 ;;^DIC(1.5219,"%D",4,0)
 ;;=a column in the local table (SQLI_COLUMN) and a primary key element of a
 ;;^DIC(1.5219,"%D",5,0)
 ;;= foreign table (SQLI_PRIMARY_KEY). The primary key table element of the
 ;;^DIC(1.5219,"%D",6,0)
 ;;=foreign table has the domain of that table, which makes the connection.
 ;;^DD(1.5219,0)
 ;;=FIELD^^2^3
 ;;^DD(1.5219,0,"DDA")
 ;;=N
 ;;^DD(1.5219,0,"DT")
 ;;=2960820
 ;;^DD(1.5219,0,"IX","B",1.5219,.01)
 ;;=
 ;;^DD(1.5219,0,"NM","SQLI_FOREIGN_KEY")
 ;;=
 ;;^DD(1.5219,0,"VRPK")
 ;;=DI
 ;;^DD(1.5219,.01,0)
 ;;=F_TBL_ELEMENT^RP1.5216'^DMSQ("E",^0;1^Q
 ;;^DD(1.5219,.01,.1)
 ;;=Foreign Key
 ;;^DD(1.5219,.01,1,0)
 ;;=^.1
 ;;^DD(1.5219,.01,1,1,0)
 ;;=1.5219^B
 ;;^DD(1.5219,.01,1,1,1)
 ;;=S ^DMSQ("F","B",$E(X,1,30),DA)=""
 ;;^DD(1.5219,.01,1,1,2)
 ;;=K ^DMSQ("F","B",$E(X,1,30),DA)
 ;;^DD(1.5219,.01,3)
 ;;=
 ;;^DD(1.5219,.01,9)
 ;;=^
 ;;^DD(1.5219,.01,21,0)
 ;;=^^1^1^2960926^^^^
 ;;^DD(1.5219,.01,21,1,0)
 ;;=IEN of foreign key table element in SQLI_TABLE_ELEMENT
 ;;^DD(1.5219,.01,"DT")
 ;;=2960828
 ;;^DD(1.5219,1,0)
 ;;=F_PK_ELEMENT^RP1.5218'^DMSQ("P",^0;2^Q
 ;;^DD(1.5219,1,.1)
 ;;=Primary Key
 ;;^DD(1.5219,1,9)
 ;;=^
 ;;^DD(1.5219,1,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5219,1,21,1,0)
 ;;=IEN of primary key element in SQLI_PRIMARY_KEY of foreign table
 ;;^DD(1.5219,1,"DT")
 ;;=2960926
 ;;^DD(1.5219,2,0)
 ;;=F_CLM_ELEMENT^RP1.5217'^DMSQ("C",^0;3^Q
 ;;^DD(1.5219,2,.1)
 ;;=Column
 ;;^DD(1.5219,2,9)
 ;;=^
 ;;^DD(1.5219,2,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.5219,2,21,1,0)
 ;;=IEN of column of this table in SQLI_COLUMN which matches foreign PK
 ;;^DD(1.5219,2,"DT")
 ;;=2960926

DINIT2BD
DINIT2BD ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2BE
Q Q
 ;;^DIC(1.52191,0,"GL")
 ;;=^DMSQ("ET",
 ;;^DIC("B","SQLI_ERROR_TEXT",1.52191)
 ;;=
 ;;^DIC(1.52191,"%D",0)
 ;;=^^1^1^2970806^^^^
 ;;^DIC(1.52191,"%D",1,0)
 ;;=A numbered list of error messages, auto-generated by ERR^DMSQU.
 ;;^DD(1.52191,0)
 ;;=FIELD^^.01^1
 ;;^DD(1.52191,0,"DDA")
 ;;=N
 ;;^DD(1.52191,0,"DT")
 ;;=2960828
 ;;^DD(1.52191,0,"IX","B",1.52191,.01)
 ;;=
 ;;^DD(1.52191,0,"NM","SQLI_ERROR_TEXT")
 ;;=
 ;;^DD(1.52191,0,"PT",1.52192,2)
 ;;=
 ;;^DD(1.52191,0,"VRPK")
 ;;=DI
 ;;^DD(1.52191,.01,0)
 ;;=ERROR_TEXT^RF^^0;1^K:$L(X)>50!($L(X)<3)!'(X'?1P.E) X
 ;;^DD(1.52191,.01,.1)
 ;;=Error Text
 ;;^DD(1.52191,.01,1,0)
 ;;=^.1
 ;;^DD(1.52191,.01,1,1,0)
 ;;=1.52191^B
 ;;^DD(1.52191,.01,1,1,1)
 ;;=S ^DMSQ("ET","B",$E(X,1,30),DA)=""
 ;;^DD(1.52191,.01,1,1,2)
 ;;=K ^DMSQ("ET","B",$E(X,1,30),DA)
 ;;^DD(1.52191,.01,3)
 ;;=Answer must be 3-50 characters in length.
 ;;^DD(1.52191,.01,9)
 ;;=^
 ;;^DD(1.52191,.01,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.52191,.01,21,1,0)
 ;;=Description of error
 ;;^DD(1.52191,.01,23,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.52191,.01,23,1,0)
 ;;=This is loaded by laygo from DMSQ routines
 ;;^DD(1.52191,.01,"DT")
 ;;=2960828

DINIT2BE
DINIT2BE ;SFISC/MKO-SQLI FILES ;10:51 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT2C0
Q Q
 ;;^DIC(1.52192,0,"GL")
 ;;=^DMSQ("EX",
 ;;^DIC("B","SQLI_ERROR_LOG",1.52192)
 ;;=
 ;;^DIC(1.52192,"%D",0)
 ;;=^^4^4^2970806^^^^
 ;;^DIC(1.52192,"%D",1,0)
 ;;=Log of all errors encountered while compiling SQLI.
 ;;^DIC(1.52192,"%D",2,0)
 ;;=It generates the error text table (SQLI_ERROR_TEXT) on a laygo basis;
 ;;^DIC(1.52192,"%D",3,0)
 ;;=errors are added only when they occur. If DBS errors triggered the
 ;;^DIC(1.52192,"%D",4,0)
 ;;=error, the DIALOG file reference is also saved.
 ;;^DD(1.52192,0)
 ;;=FIELD^^4^5
 ;;^DD(1.52192,0,"DDA")
 ;;=N
 ;;^DD(1.52192,0,"DT")
 ;;=2960829
 ;;^DD(1.52192,0,"IX","B",1.52192,.01)
 ;;=
 ;;^DD(1.52192,0,"IX","C",1.52192,2)
 ;;=
 ;;^DD(1.52192,0,"IX","D",1.52192,3)
 ;;=
 ;;^DD(1.52192,0,"IX","E",1.52192,4)
 ;;=
 ;;^DD(1.52192,0,"NM","SQLI_ERROR_LOG")
 ;;=
 ;;^DD(1.52192,0,"VRPK")
 ;;=DI
 ;;^DD(1.52192,.01,0)
 ;;=FILEMAN_FILE^RNJ15,6^^0;1^K:+X'=X!(X>99999999.999999)!(X<1)!(X?.E1"."7N.N) X
 ;;^DD(1.52192,.01,.1)
 ;;=File
 ;;^DD(1.52192,.01,1,0)
 ;;=^.1
 ;;^DD(1.52192,.01,1,1,0)
 ;;=1.52192^B
 ;;^DD(1.52192,.01,1,1,1)
 ;;=S ^DMSQ("EX","B",$E(X,1,30),DA)=""
 ;;^DD(1.52192,.01,1,1,2)
 ;;=K ^DMSQ("EX","B",$E(X,1,30),DA)
 ;;^DD(1.52192,.01,3)
 ;;=Type a Number between 1 and 99999999.999999, 6 Decimal Digits
 ;;^DD(1.52192,.01,9)
 ;;=^
 ;;^DD(1.52192,.01,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.52192,.01,21,1,0)
 ;;=FileMan source file of error in table build
 ;;^DD(1.52192,.01,"DT")
 ;;=2960828
 ;;^DD(1.52192,1,0)
 ;;=FILEMAN_FIELD^NJ15,6^^0;2^K:+X'=X!(X>99999999.999999)!(X<.001)!(X?.E1"."7N.N) X
 ;;^DD(1.52192,1,3)
 ;;=Type a Number between .001 and 99999999.999999, 6 Decimal Digits
 ;;^DD(1.52192,1,9)
 ;;=^
 ;;^DD(1.52192,1,21,0)
 ;;=^^1^1^2960926^^
 ;;^DD(1.52192,1,21,1,0)
 ;;=FileMan field number of error source
 ;;^DD(1.52192,1,23,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.52192,1,23,1,0)
 ;;=May be other information. This is a bit loose.
 ;;^DD(1.52192,1,"DT")
 ;;=2960828
 ;;^DD(1.52192,2,0)
 ;;=ERROR^RP1.52191^DMSQ("ET",^0;3^Q
 ;;^DD(1.52192,2,.1)
 ;;=Error
 ;;^DD(1.52192,2,1,0)
 ;;=^.1
 ;;^DD(1.52192,2,1,1,0)
 ;;=1.52192^C
 ;;^DD(1.52192,2,1,1,1)
 ;;=S ^DMSQ("EX","C",$E(X,1,30),DA)=""
 ;;^DD(1.52192,2,1,1,2)
 ;;=K ^DMSQ("EX","C",$E(X,1,30),DA)
 ;;^DD(1.52192,2,1,1,"%D",0)
 ;;=^^1^1^2960829^
 ;;^DD(1.52192,2,1,1,"%D",1,0)
 ;;=Error by error number
 ;;^DD(1.52192,2,1,1,"DT")
 ;;=2960829
 ;;^DD(1.52192,2,9)
 ;;=^
 ;;^DD(1.52192,2,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.52192,2,21,1,0)
 ;;=IEN of error text from SQLI_ERROR_TEXT
 ;;^DD(1.52192,2,"DT")
 ;;=2960926
 ;;^DD(1.52192,3,0)
 ;;=ERROR_DATE^RD^^0;4^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1.52192,3,.1)
 ;;=Run Date
 ;;^DD(1.52192,3,1,0)
 ;;=^.1
 ;;^DD(1.52192,3,1,1,0)
 ;;=1.52192^D
 ;;^DD(1.52192,3,1,1,1)
 ;;=S ^DMSQ("EX","D",$E(X,1,30),DA)=""
 ;;^DD(1.52192,3,1,1,2)
 ;;=K ^DMSQ("EX","D",$E(X,1,30),DA)
 ;;^DD(1.52192,3,1,1,"%D",0)
 ;;=^^1^1^2960829^
 ;;^DD(1.52192,3,1,1,"%D",1,0)
 ;;=Error by date
 ;;^DD(1.52192,3,1,1,"DT")
 ;;=2960829
 ;;^DD(1.52192,3,9)
 ;;=^
 ;;^DD(1.52192,3,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.52192,3,21,1,0)
 ;;=Date of run
 ;;^DD(1.52192,3,"DT")
 ;;=2960926
 ;;^DD(1.52192,4,0)
 ;;=FILEMAN_ERROR^P.84'^DI(.84,^0;5^Q
 ;;^DD(1.52192,4,.1)
 ;;=FileMan Error
 ;;^DD(1.52192,4,1,0)
 ;;=^.1
 ;;^DD(1.52192,4,1,1,0)
 ;;=1.52192^E
 ;;^DD(1.52192,4,1,1,1)
 ;;=S ^DMSQ("EX","E",$E(X,1,30),DA)=""
 ;;^DD(1.52192,4,1,1,2)
 ;;=K ^DMSQ("EX","E",$E(X,1,30),DA)
 ;;^DD(1.52192,4,1,1,"%D",0)
 ;;=^^1^1^2960829^
 ;;^DD(1.52192,4,1,1,"%D",1,0)
 ;;=Error by FileMan Dialog error number
 ;;^DD(1.52192,4,1,1,"DT")
 ;;=2960829
 ;;^DD(1.52192,4,9)
 ;;=^
 ;;^DD(1.52192,4,21,0)
 ;;=^^1^1^2960926^
 ;;^DD(1.52192,4,21,1,0)
 ;;=IEN of FileMan error in DIALOG file
 ;;^DD(1.52192,4,"DT")
 ;;=2960926

DINIT2C0
DINIT2C0 ;SFISC/MKO-IMPORT TEMPLATE FILE ;06:12 PM  16 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;**CCO/NI TAG 'Q+12' CHANGED FOR DATE FORMAT
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
 G ^DINIT3
Q Q
 ;;^DIC(.46,0,"GL")
 ;;=^DIST(.46,
 ;;^DIC("B","IMPORT TEMPLATE",.46)
 ;;=
 ;;^DD(.46,0)
 ;;=FIELD^^2^9
 ;;^DD(.46,0,"DDA")
 ;;=N
 ;;^DD(.46,0,"DT")
 ;;=2960531
 ;;^DD(.46,0,"ID","WRITE")
 ;;=N D,D1,D2 S D2=^(0) S:$X>30 D1(1,"F")="!" S D=$P(D2,U,2) S:D D1(2)="("_$$DATE^DIUTL(D)_")",D1(2,"F")="?30" S D=$P(D2,U,5) S:D D1(3)="User #"_D,D1(3,"F")="?47" S D=$P(D2,U,4) S:D D1(4)=" File #"_D,D1(4,"F")="?59" D EN^DDIOL(.D1)
 ;;^DD(.46,0,"IX","B",.46,.01)
 ;;=
 ;;^DD(.46,0,"IX","F",.46,4)
 ;;=
 ;;^DD(.46,0,"IX","F1",.46,.01)
 ;;=
 ;;^DD(.46,0,"NM","IMPORT TEMPLATE")
 ;;=
 ;;^DD(.46,.01,0)
 ;;=NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X
 ;;^DD(.46,.01,1,0)
 ;;=^.1^^-1
 ;;^DD(.46,.01,1,1,0)
 ;;=.46^B
 ;;^DD(.46,.01,1,1,1)
 ;;=S ^DIST(.46,"B",$E(X,1,30),DA)=""
 ;;^DD(.46,.01,1,1,2)
 ;;=K ^DIST(.46,"B",$E(X,1,30),DA)
 ;;^DD(.46,.01,1,3,0)
 ;;=.46^F1^MUMPS
 ;;^DD(.46,.01,1,3,1)
 ;;=N DDMPX S DDMPX=$P($G(^DIST(.46,DA,0)),U,4) I DDMPX]"" S ^DIST(.46,"F"_DDMPX,X,DA)=""
 ;;^DD(.46,.01,1,3,2)
 ;;=N DDMPX S DDMPX=$P($G(^DIST(.46,DA,0)),U,4) I DDMPX]"" K ^DIST(.46,"F"_DDMPX,X,DA)
 ;;^DD(.46,.01,1,3,3)
 ;;=Along with F cross-reference manages F_file# index.
 ;;^DD(.46,.01,1,3,"%D",0)
 ;;=^^2^2^2960531^^
 ;;^DD(.46,.01,1,3,"%D",1,0)
 ;;=Creates a cross-reference based on F_file# that is used as a lookup
 ;;^DD(.46,.01,1,3,"%D",2,0)
 ;;=cross-reference.  Allows quick lookups by file number.
 ;;^DD(.46,.01,1,3,"DT")
 ;;=2960531
 ;;^DD(.46,.01,3)
 ;;=NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION
 ;;^DD(.46,.01,"DT")
 ;;=2960531
 ;;^DD(.46,2,0)
 ;;=DATE CREATED^D^^0;2^S %DT="E" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.46,2,21,0)
 ;;=^^1^1^2960531^
 ;;^DD(.46,2,21,1,0)
 ;;=Date that the import template was created.
 ;;^DD(.46,2,"DT")
 ;;=2960531
 ;;^DD(.46,3,0)
 ;;=READ ACCESS^F^^0;3^K:$L(X)>15!($L(X)<1) X
 ;;^DD(.46,3,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.46,3,21,0)
 ;;=^^2^2^2960531^
 ;;^DD(.46,3,21,1,0)
 ;;=Access codes necessary to use the Import Template.
 ;;^DD(.46,3,21,2,0)
 ;;=If null, anyone can use the template.
 ;;^DD(.46,3,"DT")
 ;;=2960531
 ;;^DD(.46,4,0)
 ;;=PRIMARY FILE^RP1'^DIC(^0;4^Q
 ;;^DD(.46,4,1,0)
 ;;=^.1
 ;;^DD(.46,4,1,1,0)
 ;;=.46^F^MUMPS
 ;;^DD(.46,4,1,1,1)
 ;;=N DDMPX S DDMPX=$P($G(^DIST(.46,DA,0)),U,1) I DDMPX]"" S ^DIST(.46,"F"_X,DDMPX,DA)=""
 ;;^DD(.46,4,1,1,2)
 ;;=N DDMPX S DDMPX=$P($G(^DIST(.46,DA,0)),U,1) I DDMPX]"" K ^DIST(.46,"F"_X,DDMPX,DA)
 ;;^DD(.46,4,1,1,3)
 ;;=With F1 cross-reference manages the F_file# index.
 ;;^DD(.46,4,1,1,"%D",0)
 ;;=^^2^2^2960531^
 ;;^DD(.46,4,1,1,"%D",1,0)
 ;;=Creates an index under F_file# that is used as a compound index for
 ;;^DD(.46,4,1,1,"%D",2,0)
 ;;=lookups when the file# is known.
 ;;^DD(.46,4,1,1,"DT")
 ;;=2960531
 ;;^DD(.46,4,21,0)
 ;;=^^1^1^2960531^^^
 ;;^DD(.46,4,21,1,0)
 ;;=File that is the starting point for data import.
 ;;^DD(.46,4,"DT")
 ;;=2960531
 ;;^DD(.46,5,0)
 ;;=CREATOR^P200'^VA(200,^0;5^Q
 ;;^DD(.46,5,21,0)
 ;;=^^1^1^2960531^
 ;;^DD(.46,5,21,1,0)
 ;;=Person who created the import template.
 ;;^DD(.46,5,"DT")
 ;;=2960531
 ;;^DD(.46,6,0)
 ;;=WRITE ACCESS^F^^0;6^K:$L(X)>15!($L(X)<1) X
 ;;^DD(.46,6,3)
 ;;=Answer must be 1-15 characters in length.
 ;;^DD(.46,6,21,0)
 ;;=^^2^2^2960531^
 ;;^DD(.46,6,21,1,0)
 ;;=Access codes needed to change or delete the import template.  If null,
 ;;^DD(.46,6,21,2,0)
 ;;=anyone can change or delete the template.
 ;;^DD(.46,6,"DT")
 ;;=2960531
 ;;^DD(.46,7,0)
 ;;=DATE LAST USED^D^^0;7^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(.46,7,21,0)
 ;;=^^1^1^2960531^
 ;;^DD(.46,7,21,1,0)
 ;;=Date template was last used.
 ;;^DD(.46,7,"DT")
 ;;=2960531
 ;;^DD(.46,10,0)
 ;;=DESCRIPTION^.461^^10;0
 ;;^DD(.46,30,0)
 ;;=IMPORT FIELDS^.463^^30;0
 ;;^DD(.461,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.461,0,"DT")
 ;;=2960531
 ;;^DD(.461,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.461,0,"UP")
 ;;=.46
 ;;^DD(.461,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(.461,.01,"DT")
 ;;=2960531
 ;;^DD(.463,0)
 ;;=IMPORT FIELDS SUB-FIELD^^20^6
 ;;^DD(.463,0,"DT")
 ;;=2960530
 ;;^DD(.463,0,"IX","B",.463,.01)
 ;;=
 ;;^DD(.463,0,"NM","IMPORT FIELDS")
 ;;=
 ;;^DD(.463,0,"UP")
 ;;=.46
 ;;^DD(.463,.01,0)
 ;;=IMPORT SEQUENCE^MRNJ3,0X^^0;1^K:+X'=X!(X>999)!(X<1)!(X?.E1"."1N.N) X S:$D(X) DINUM=X
 ;;^DD(.463,.01,1,0)
 ;;=^.1
 ;;^DD(.463,.01,1,1,0)
 ;;=.463^B
 ;;^DD(.463,.01,1,1,1)
 ;;=S ^DIST(.46,DA(1),30,"B",$E(X,1,30),DA)=""
 ;;^DD(.463,.01,1,1,2)
 ;;=K ^DIST(.46,DA(1),30,"B",$E(X,1,30),DA)
 ;;^DD(.463,.01,3)
 ;;=Type a Number between 1 and 999, 0 Decimal Digits
 ;;^DD(.463,.01,21,0)
 ;;=^^1^1^2960530^^
 ;;^DD(.463,.01,21,1,0)
 ;;=Sequence of fields being imported.
 ;;^DD(.463,.01,"DT")
 ;;=2960530
 ;;^DD(.463,1,0)
 ;;=FILE^RP1'^DIC(^0;2^Q
 ;;^DD(.463,1,21,0)
 ;;=^^2^2^2960530^
 ;;^DD(.463,1,21,1,0)
 ;;=The file or subfile number in which the imported data for a field will
 ;;^DD(.463,1,21,2,0)
 ;;=be filed.
 ;;^DD(.463,1,"DT")
 ;;=2960530
 ;;^DD(.463,2,0)
 ;;=FIELD^RF^^0;3^K:$L(X)>12!($L(X)<1) X
 ;;^DD(.463,2,3)
 ;;=Answer must be 1-12 characters in length.
 ;;^DD(.463,2,21,0)
 ;;=^^1^1^2960530^
 ;;^DD(.463,2,21,1,0)
 ;;=Field into which imported data will be filed.
 ;;^DD(.463,2,"DT")
 ;;=2960530
 ;;^DD(.463,3,0)
 ;;=LENGTH^NJ4,0^^0;4^K:+X'=X!(X>9999)!(X<0)!(X?.E1"."1N.N) X
 ;;^DD(.463,3,3)
 ;;=Type a Number between 0 and 9999, 0 Decimal Digits
 ;;^DD(.463,3,21,0)
 ;;=^^2^2^2960530^
 ;;^DD(.463,3,21,1,0)
 ;;=Length of data for an imported field.  Relevant only for fixed length
 ;;^DD(.463,3,21,2,0)
 ;;=imports.
 ;;^DD(.463,3,"DT")
 ;;=2960530
 ;;^DD(.463,10,0)
 ;;=PATH^F^^10;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.463,10,3)
 ;;=Answer must be 1-245 characters in length.
 ;;^DD(.463,10,21,0)
 ;;=^^3^3^2960530^
 ;;^DD(.463,10,21,1,0)
 ;;=The path from the Primary File to the field being imported.  Format
 ;;^DD(.463,10,21,2,0)
 ;;=is field#^file#[:field#^file#]... where field# is a multiple indicating
 ;;^DD(.463,10,21,3,0)
 ;;=subfile at next lower level.
 ;;^DD(.463,10,"DT")
 ;;=2960530
 ;;^DD(.463,20,0)
 ;;=CAPTION^F^^20;E1,245^K:$L(X)>245!($L(X)<1) X
 ;;^DD(.463,20,3)
 ;;=Answer must be 1-245 characters in length.
 ;;^DD(.463,20,21,0)
 ;;=^^2^2^2960530^
 ;;^DD(.463,20,21,1,0)
 ;;=The readable description of the field being imported, including any
 ;;^DD(.463,20,21,2,0)
 ;;=higher level files and subfiles.
 ;;^DD(.463,20,"DT")
 ;;=2960530

DINIT3
DINIT3 ;SFISC/GFT-INITIALIZE VA FILEMAN ;28AUG2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S ^DIC(.2,0)="DESTINATION^.21^",^(0,"GL")="^DIC(.2,"  S ^DIC(.5,0)="FUNCTION^.5I",^(0,"GL")="^DD(""FUNC"",",(^("LAYGO"),^("WR"))="@",^("DD")=U
 S ^DIC(.2,"%D",0)="^^2^2^2940908^"
 S ^DIC(.2,"%D",1,0)="This file stores destinations of data (e.g., a specific form or"
 S ^DIC(.2,"%D",2,0)="system).  A field can be associated with a destination of its data."
 S $P(^DIC(1.1,0),U,1,2)="AUDIT^1.1",^(0,"GL")="^DIA(" D A1
 S ^DIC(1.1,"%D",0)="^^1^1^2940908^"
 S ^DIC(1.1,"%D",1,0)="This file stores an audit trail of changes made to data fields."
 S $P(^DIAR(1.11,0),U,1,2)="ARCHIVAL ACTIVITY^1.11I",$P(^DIC(1.11,0),U,1,2)="ARCHIVAL ACTIVITY^1.11I",^(0,"GL")="^DIAR(1.11," D A1
 S $P(^DIAR(1.12,0),U,1,2)="FILEGRAM HISTORY^1.12DI",$P(^DIC(1.12,0),U,1,2)="FILEGRAM HISTORY^1.12DI",^(0,"GL")="^DIAR(1.12," D A1
 S $P(^DIAR(1.13,0),U,1,2)="FILEGRAM ERROR LOG^1.13",$P(^DIC(1.13,0),U,1,2)="FILEGRAM ERROR LOG^1.13",^(0,"GL")="^DIAR(1.13," D A1
 S $P(^DDA(0),U,1,2)="DD AUDIT^.6I",^DIC(.6,0,"GL")="^DDA(" D A1
 D A2("FORM",.403,"I")
 D A2("BLOCK",.404)
 S $P(^DIST(1.2,0),U,1,2)="ALTERNATE EDITOR^1.2",^DIC(1.2,0)="ALTERNATE EDITOR^1.2",^(0,"GL")="^DIST(1.2," D A1
 S $P(^DI(.81,0),U,1,2)="DATA TYPE^.81",^DIC(.81,0)="DATA TYPE^.81",^(0,"GL")="^DI(.81," D A1
 S $P(^DIST(.44,0),U,1,2)="FOREIGN FORMAT^.44I",^DIC(.44,0)="FOREIGN FORMAT^.44",^(0,"GL")="^DIST(.44," D A1
 S $P(^DI(.83,0),U,1,2)="COMPILED ROUTINE^.83",$P(^DIC(.83,0),U,1,2)="COMPILED ROUTINE^.83",^(0,"GL")="^DI(.83," D A1
 D A2("INDEX",.11,"I")
 D A2("KEY",.31)
 D A2("IMPORT TEMPLATE",.46,"IA")
 D A2("SQLI_SCHEMA",1.521,"A")
 D A2("SQLI_KEY_WORD",1.52101,"O")
 D A2("SQLI_DATA_TYPE",1.5211,"A")
 D A2("SQLI_DOMAIN",1.5212,"AO")
 D A2("SQLI_KEY_FORMAT",1.5213,"AO")
 D A2("SQLI_OUTPUT_FORMAT",1.5214,"AO")
 D A2("SQLI_TABLE",1.5215,"A")
 D A2("SQLI_TABLE_ELEMENT",1.5216,"A")
 D A2("SQLI_COLUMN",1.5217,"PO")
 D A2("SQLI_PRIMARY_KEY",1.5218,"PA")
 D A2("SQLI_FOREIGN_KEY",1.5219,"PO")
 D A2("SQLI_ERROR_TEXT",1.52191)
 D A2("SQLI_ERROR_LOG",1.52192)
 S D=0 F I="^DIPT(","^DIBT(","^DIE(" S X=$P("PRINT^SORT^INPUT",U,D+1)_" TEMPLATE",Y=D/1000+.4,^DD(Y,0,"NM",X)="",^DD(Y,.01,1,1,0)=Y_"^B",@("$P("_I_"0),U,1,2)=X_U_Y_""I"""),^DIC(Y,0)=X_"^"_Y,^(0,"GL")=I,D=D+1,^("WR")=U,^("DD")=U,^DIC("B",X,Y)=""
 ;
DIK F I=.2,.4,.5,.6,.7,.601,.602,.401,.4001,.4011,.4012,.402,.4021,.4011624,.41,.411,.21,1,1.005,1.01,1.1,1.11,1.113,1.1132,1.12,1.13,1.1321,1.14,.403,.4031,.403115,.40315,.4032,.404,.40415,.4044,1.2,1.207,.44,.441,.4411,.447,.448,.42,.81 D XX
 F I=.4014,.40141,.401418,.401419,.83,.404421 D XX
 F I=.11,.111,.112,.114,.31,.312 D XX
 F I=.46,.461,.463 D XX
 F I=1.521,1.52101,1.5211,1.5212,1.5213,1.5214,1.5215,1.5216,1.5217,1.5218,1.5219,1.52191,1.52192 D XX
 F DIK="^DIC(.2,","^DIPT(","^DIST(1.2,","^DIST(.44,","^DI(.81,","^DIST(.403,","^DIST(.404,","^DIST(.46,","^DI(.85,","^DD(""IX"",","^DD(""KEY""," D X
 I $D(^DD("VERSION"))#2 K ^DIC("B") S DIK="^DIC(",DIK(1)=".01^B" D ENALL^DIK
 I '$D(^DD("VERSION"))#2 F DIK="^DIC(","^DIBT(","^DIE(" D X
 S ^DD("FUNC",0)="FUNCTION^.5^"
 I $D(^DD("FUNC",7,1)),$D(^DD("VERSION")),^("VERSION")>15.4
 E  S ^DD("FUNC",7,1)="C X S X="""""
 G ^DINIT4
 ;
XX S DA(1)=I,DIK="^DD("_I_","
X W ".." G IXALL^DIK
 ;
A S (^("RD"),^("LAYGO"),^("WR"),^("DD"))=U Q
A1 S (^("DEL"),^("LAYGO"),^("WR"),^("DD"))=U Q
A2(NAM,NUM,SP) ;
 S $P(@(^DIC(NUM,0,"GL")_"0)"),U,1,2)=NAM_U_NUM_$G(SP)
 S ^DIC(NUM,0)=NAM_U_NUM,(^(0,"DEL"),^("LAYGO"),^("WR"),^("DD"))=U
 Q
 ;

DINIT4
DINIT4 ;SFISC/GFT-INITIALIZE VA FILEMAN ;24SEP2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$E($T(DD+I),4,999) G ^DINIT41:X?.P S ^DD("FUNC",I,0)=$P(X,";",1),Y=1 F DU=1,2,3,9,10 S Y=Y+1 I $P(X,";",Y)]"" S ^(DU)=$P(X,";",Y)
 ;;SQUAREROOT;D SQR^DIXC S X=$S(X'>0:"",1:Y);;;
 ;;TIME;S X=$E($P(X,".",2)_"0000",1,4),%=X>1159 S:X>1259 X=X-1200 S X=X\100_":"_$E(X#100+100,2,3)_" "_$E("AP",%+1)_"M";;;
 ;;MONTH;S X=$E(X,1,5)_0_0 S:'X X="";D^D;;
 ;;YEAR;S X=$E(X,1,3)_"0000" S:'X X="";D^D;;
 ;;DATE;S X=$P(X,".",1);D^D;;
 ;;DAYOFWEEK;D DW^%DTC;^D;;
 ;;CLOSE
 ;;ABS;S:X<0 X=-X;;;
 ;;INTERNAL;S X=X;;;
 ;;MAX;S:X1>X X=X1;O;2;MAXIMUM OF 2 VALUES
 ;;MIN;S:X1<X X=X1;O;2;MINIMUM OF TWO VALUES
 ;;REVERSE;S X=$RE(X);;;DATA CHARACTERS IN RIGHT-TO-LEFT ORDER
 ;;UPPERCASE;S X=$$UP^DILIBF(X);;;
 ;;LOWERCASE;X "F %=2:1:$L(X) I $E(X,%)?1U,$E(X,%-1)?1A S X=$E(X,0,%-1)_$C($A(X,%)+32)_$E(X,%+1,999)";;;
 ;;CENTER;S X=$J("",$S($D(DIWR)+$D(DIWL)=2:DIWR-DIWL+1,$D(IOM):IOM,1:80)-$L(X)\2-$X)_X;;;;W
 ;;UNDERLINE;S %="",Y=$S($D(IOST)[0:-1,$A(IOST)-80:-1,1:$L(X)<83) X:Y+1 "F Y=1:1:$L(X) "_$S(Y:"S %=$C(8)_%",1:"W $E(X,Y),$C(8)")_"_""_""" S:Y+1 X=$S(%]"":X_%,1:%);;;UNDERLINE (ARG) IF OUTPUTTING TO A PRINTER DEVICE;W
 ;;PAGEFEED;S %Y=1,%=$S($D(DIWF):$F(DIWF,"B"),1:0) X:% "F %Y=%:1 Q:$E(DIWF,%Y)'?1N" S:$D(DIWF) DIWF=$E(DIWF,1,%-2)_$E(DIWF,%Y,999)_"B"_(X\1) X:X>(IOSL-$Y)&$D(^UTILITY($J,1))&'$D(^("W"))&'$D(DIWF) ^(1) S X="";;;START NEW PAGE IF <ARG LINES LEFT;W
 ;;BREAKABLE;D:'$D(DISYS) OS^DII X ^DD("OS",DISYS,1);;;OUTPUT DEVICE CAN BE INTERRUPTED IF ARGUMENT IS NON-ZERO
 ;;NUMMONTH;S X=+$E(X,4,5);^D;;MONTH NUMBER (0-12) FOR A DATE
 ;;NUMDAY;S X=+$E(X,6,7);^D;;DAY NUMBER (0-31) FOR A DATE
 ;;NUMYEAR;S:X X=$E(X,2,3);^D;;YEAR NUMBER (00-99) FOR A DATE
 ;;NUMDATE;S:X X=$$OUT^DIALOGU(X,"FMTE",2);^D;;DATE IN 'NN/NN/NN' FORMAT
 ;;REPLACE;X "F %=0:0 S %=$F(X2,X1,%) Q:%<2  S X2=$E(X2,1,%-$L(X1)-1)_X_$E(X2,%,999),%=%-$L(X1)+$L(X)" S X=X2;;3;THE 1ST ARGUMENT, WITH ALL OCCURRENCES OF THE 2ND ARGUMENT REPLACED BY THE 3RD
 ;;NOW;N %I,%H,% D NOW^%DTC S X=%;D;0;CURRENT DATE/TIME
 ;;TODAY;N %I,%H,% D NOW^%DTC;D;0;CURRENT DATE
 ;;PAGE;S X=$G(DC);;0;PAGE NUMBER (OF OUTPUT)
 ;;SETTAB;S DIWT=X,X="" F %=1:1 S Y="X"_% Q:'$D(@Y)  S DIWT=@Y_","_DIWT;;VARIABLE;SET TAB STOPS;W
 ;;RIGHT-JUSTIFY;S X="" S:'$D(DIWF) DIWF="" S:DIWF'["R" DIWF=DIWF_"R";;0;;W
 ;;DOUBLE-SPACE;S X="" S:'$D(DIWF) DIWF="" S:DIWF'["D" DIWF=DIWF_"D";;0;;W
 ;;SINGLE-SPACE;S:'$D(DIWF) DIWF="" S X="",DIWF=$P(DIWF,"D",1)_$P(DIWF,"D",2);;0;;W

DINIT41
DINIT41 ;SFISC/GFT-INITIALIZE VA FILEMAN ;4/14/93  1:15 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DD F I=1:1 S X=$E($T(DD+I),4,999) G ^DINIT42:X?.P S ^DD("FUNC",I+30,0)=$P(X,";",1),Y=1 F DU=1,2,3,9,10 S Y=Y+1 I $P(X,";",Y)]"" S ^(DU)=$P(X,";",Y)
 ;;BLANK;X "F I=1:1:X "_$S($D(^UTILITY($J,"W")):"S X="" |TAB|"" D L^DIWP",1:"W !") S X="";;;SKIP (ARG) NUMBER OF LINES;W
 ;;MONTHNAME;S X=$P("JANUARY^FEBRUARY^MARCH^APRIL^MAY^JUNE^JULY^AUGUST^SEPTEMBER^OCTOBER^NOVEMBER^DECEMBER","^",+X);;;TURNS "1" INTO "JANUARY", "2" INTO "FEBRUARY", ETC.
 ;;SETPAGE;S DC=X,X="";;;PAGE NUMBER ON NEXT PAGE WILL BE (ARG)+1;W
 ;;INDENT;S:'$D(DIWF) DIWF="" S %Y=1,%=$F(DIWF,"I") X:% "F %Y=%:1 Q:$E(DIWF,%Y)'?1N" S DIWF=$E(DIWF,1,%-2)_$E(DIWF,%Y,999)_"I"_(X\1),X="";;;INDENT FOLLOWING TEXT (ARG) SPACES;W
 ;;SITENUMBER;S X=^DD("SITE",1);;0;NUMBER IDENTIFYING YOUR SITE (FROM INITIALIZATION)
 ;;WIDTH;S:'$D(DIWF) DIWF="" S %Y=1,%=$F(DIWF,"C") X:% "F %Y=%:1 Q:$E(DIWF,%Y)'?1N" S DIWF=$E(DIWF,1,%-2)_$E(DIWF,%Y,999)_"C"_(X\1),X="";;;DISPLAY FOLLOWING TEXT (ARG) COLUMNS ACROSS;W
 ;;PAGESTART;S:'$D(DIWF) DIWF="" S %Y=1,%=$F(DIWF,"T") X:% "F %Y=%:1 Q:$E(DIWF,%Y)'?1N" S DIWF=$E(DIWF,1,%-2)_$E(DIWF,%Y,999)_"T"_(X\1),X="";;;START NEW OUTPUT TEXT ON LINE (ARG) OF PAGE;W
 ;;NOWRAP;S:'$D(DIWF) DIWF="" S:DIWF'["N" DIWF=DIWF_"N" S X="";;0;DISPLAY LINE-FOR-LINE AS INPUT;W
 ;;WRAP;S DIWF=$P(DIWF,"N",1)_$P(DIWF,"N",2),X="";;0;RETURN TO 'WRAP-AROUND' OUTPUT;W
 ;;MINUTES;S Y=$E(X1_"000",9,10)-$E(X_"000",9,10)*60+$E(X1_"00000",11,12)-$E(X_"00000",11,12),X2=X,X=$P(X,".",1)'=$P(X1,".",1) D ^%DTC:X S X=X*1440+Y;;2;DIFFERENCE BETWEEN 2 DATE/TIMES IN MINUTES
 ;;MODULO;S X=X1#X;;2;FIRST ARGUMENT MOD SECOND ARGUMENT (MUMPS '#' OPERATOR)
 ;;SET;S:X]""&(X'[U)&(X'["$C(94)") @X=X1,X=X1;;2;TAKES THE VALUE OF 1ST ARGUMENT, BUT ALSO PUTS IT INTO THE VARIABLE NAMED BY THE 2ND ARGUMENT
 ;;BETWEEN;S:X<X1 %=X1,X1=X,X=% S X=X2'>X&(X2'<X1);;3;EQUALS '1' IF 1ST ARGUMENT LIES BETWEEN 2ND AND 3RD, '0' OTHERWISE
 ;;TOP;S DIFF=1 X:$D(^UTILITY($J,1)) ^(1) S X="";;0;TOP-OF-FORM;W
 ;;NOBLANKLINE;S X="",DIWF=$S($D(DIWF):DIWF_" ",1:" ");;0;SUPPRESSES PRINTING OF A SINGLE ALL-BLANK LINE;W
 ;;RANGEDATE;S %Y=X3,Y=X2,X2=X S:X>X1 X2=X1,X1=X S:Y>%Y %Y=Y,Y=X3 S:Y>X2 X2=Y S:%Y<X1 X1=%Y D ^%DTC S X=$S(%Y=0:0,X<0:0,1:X+1) K %Y,X3;;4;TAKES 2 DATE RANGES, RETURNS THE NUMBER OF DAYS BY WHICH THEY OVERLAP, OR 0 IF OVERLAP IS INDEFINITE
 ;;SETPARAM;S:X]""&(X?.ANP)&(X1'[U)&(X1'["$C(94)") DIPA($E(X,1,30))=X1 S X="";;2;RETURNS NOTHING, BUT SETS PARAMETER NAMED BY 2ND ARGUMENT TO 1ST ARGUMENT

DINIT42
DINIT42 ;SFISC-INITIALIZE VA FILEMAN ;10MAR2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $G(^DD("FUNC",89,0))="DUPLICATED" S DA=89,DIK="^DD(""FUNC""," D ^DIK
 S %=47
DD F I=1:5 S X=$E($T(DD+I),4,999),%=%+1 G FUNC:X?.P S ^DD("FUNC",%,0)=$P(X,";"),Y=I F DU=1,2,3,9 S Y=Y+1,X=$E($T(DD+Y),4,999) I X]"" S ^(DU)=X
 ;;PARAM
 ;;S X=$S(X=""!(X'?.ANP):"",$D(DIPA($E(X,1,30))):DIPA($E(X,1,30)),1:"")
 ;;
 ;;
 ;;RETURNS VALUE OF PARAMETER NAMED BY ARGUMENT
 ;;IOM
 ;;S X=$G(IOM,80)
 ;;
 ;;0
 ;;RETURNS THE NUMBER OF COLUMN POSITIONS ON THE PAGE OR SCREEN (E.G., 80)
 ;;DUP
 ;;S %=X,X="" S:X1]"" $P(X,X1,%\$L(X1)+1)=X1,X=$E(X,1,%)
 ;;
 ;;2
 ;;DUPLICATES THE 1ST ARGUMENT INTO AN 'N'-BYTE STRING, WHERE 'N' IS 2ND ARGUMENT
 ;;STRIPBLANKS
 ;;X:X[" " "F %=0:0 Q:$A(X)-32  S X=$E(X,2,999)","F %=0:0 S %=$L(X) Q:$A(X,%)-32  S X=$E(X,1,%-1)"
 ;;
 ;;
 ;;DELETES LEADING AND TRAILING SPACES FROM THE ARGUMENT STRING
 ;;TRANSLATE
 ;;S X=$TR(X2,X1,X)
 ;;
 ;;3
 ;;REPLACES, IN ARG1, EACH OCCURRENCE OF EACH CHAR IN ARG2 WITH THE CORRESPONDING CHAR IN ARG3
 ;;PADRIGHT
 ;;S:$L(X1)<X X1=X1_$J("",X-$L(X1)) S X=X1
 ;;
 ;;2
 ;;RETURNS 'ARG1', WITH SPACES ADDED TO GENERATE A STRING 'ARG2' BYTES LONG
 ;;FILE
 ;;S X=$S('X:X,X'["(":X,'$D(@(U_$E($P(X,+X,2,99),2,99)_"0)")):X,1:$P(^(0),U))
 ;;
 ;;1
 ;;Names file for variable pointer type fields.
 ;;USER
 ;;S %=$S($D(^VA(200,+DUZ,0)):^(0),1:""),X=$S('DUZ:"??",X="#":DUZ,X="N":$P(%,U,1),X="I":$P(%,U,2),X="T":$S($D(^DIC(3.1,+$P(%,U,9),0)):$P(^(0),U,1),1:""),X="NN":$S($D(^VA(200,+DUZ,.1)):$P(^(.1),U,4),1:""),1:"??") K %
 ;;
 ;;1
 ;;RETURNS USER ATTRIBUTES: #=NUMBER,N=NAME,I=INITIAL,T=TITLE,NN=NICKNAME
 ;;VAR
 ;;Q:X  Q:$NA(@X)[U  S X=$G(@X)
 ;;
 ;;1
 ;;RETURNS VALUE OF A LOCAL VARIABLE IF IT'S THERE
 ;;DUPLICATED
 ;;S X=X
 ;;
 ;;1
 ;;Takes as argument the name of a CROSS-REFERENCED field.  Returns BOOLEAN value, 1=field value is duplicated in another entry, ""=field value is unique
 ;;NOON
 ;;N %DT,Y S %DT="XR",X="T@NOON" D ^%DT S X=+Y
 ;;D
 ;;0
 ;;RETURNS THE CURRENT DATE AND THE TIME VALUE OF 12:OO.
 ;;MID
 ;;N %DT,Y S %DT="XR",X="T@MID" D ^%DT S X=+Y
 ;;D
 ;;0
 ;;RETURNS THE CURRENT DATE AND THE TIME VALUE OF 24:00.
 ;;NUMDATE4
 ;;S:X X=$E(X,4,5)_"/"_$E(X,6,7)_"/"_(1700+$E(X,1,3))
 ;;X
 ;;
 ;;DATE IN 'MM/DD/YYYY' FORMAT
 ;;NUMYEAR4
 ;;S:X X=1700+$E(X,1,3)
 ;;X
 ;;
 ;;YEAR NUMBER (YYYY) FOR A DATE
 ;
FUNC F I=3:1:12 S X=$T(FUNC+I),^DD("FUNC",I+87,0)=$P(X,";",3),^(9)=$P(X,";",4)
 F I=91,92 S ^DD("FUNC",I,3)="VARIABLE"
 G ^DINIT5
 ;;PRIORVALUE;Takes name of an Audited Field.  Returns as a multiple all prior values of the field, most recent first.
 ;;PRIORDATE;When it has an argument (Fieldname), returns as a multiple all prior Date/Times of auditing, most recent first.  Without an argument, it is most recent audited Date/Time for the Entry
 ;;PRIORUSER;When it has an argument (Fieldname), returns as a multiple all prior audited Users, most recent first.  Without an argument, it is most recent audited User for the Entry
 ;;MAXIMUM;Takes multiple-valued field or expression as argument.  Returns the maximum value of all the multiples.
 ;;MINIMUM;Takes multiple-valued field or expression as argument.  Returns the minimum value of all the multiples.
 ;;NEXT;Takes name of a Field. Returns the value that that field has in the next entry or sub-entry.
 ;;PREVIOUS;Takes name of a Field. Returns the value that that field has in the previous entry or sub-entry.
 ;;TOTAL;Takes multiple-valued field or expression as argument.  Returns the total of all the multiple values.
 ;;COUNT;Takes multiple-valued field or expression as argument.  Returns the number of multiples currently existing.
 ;;LAST;Takes multiple-valued field or expression as argument.  Returns the value of the last multiple.

DINIT5
DINIT5 ;SFISC/GFT-INITIALIZE VA FILEMAN ;25SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DOPT K ^DOPT("DDS"),^("DICR"),^("DDU"),^("DIAR"),^("DIAU"),^("DIBT"),^("DICATT"),^("DICR"),^("DID"),^("DIFG"),^("DII"),^("DII1"),^("DIS"),^("DIT"),^("DIU"),^("DIX"),^("DIAX"),^("DDXP")
 S ^DOPT("DICATT",0)="DATA TYPE^1.01"
 F I=1:1:9 S ^DOPT("DICATT",I,0)=$P("DATE/TIME^NUMERIC^SET OF CODES^FREE TEXT^WORD-PROCESSING^COMPUTED^POINTER TO A FILE^VARIABLE-POINTER^MUMPS",U,I)
 S ^DOPT("DIS",0)="CONDITION^1.01",^DOPT("DID",0)="LISTING FORMAT^1.01",^DOPT("DICR",0)="TYPE OF INDEXING^1.01"
 F I=1:1:6 S ^DOPT("DIS",I,0)=$P("NULL^^1;CONTAINS^[^1;MATCHES^^1;LESS THAN^<^;EQUALS^=^1;GREATER THAN^>^",";",I) S:I-1&(I-3) ^DOPT("DIS","B",$P(^(0),U,2),I)=1
 F I=1:1:9 S ^DOPT("DID",I,0)=$P("STANDARD^BRIEF^CUSTOM-TAILORED^MODIFIED STANDARD^TEMPLATES ONLY^GLOBAL MAP^CONDENSED^INDEXES ONLY^KEYS ONLY",U,I)
 F I=1:1:7 S ^DOPT("DICR",I,0)=$P("REGULAR^KWIC^MNEMONIC^MUMPS^SOUNDEX^TRIGGER^BULLETIN",U,I)
 F I="DID","DIS","DICATT","DICR" S DIK="^DOPT("""_I_"""," D IXALL^DIK
 S DIK="^DD(""FUNC""," D IXALL^DIK
 D DT^DICRW I '$D(^DD("VERSION")) D FIX S %="" F I=0:0 S %=$O(^DISV(%)) G V:%="" K ^DISV(%)
 F I=2:1:6 W ".." I ^("VERSION")<$P("^14.3^14.7^16^16.07^16.39",U,I) D @("FIX"_I) Q
V K ^DD(0,"B","HELP FRAME") G ^DINIT6
 ;
FIX ;
 N DIDUZ
 S U="^",DH="DIC("
 F D=0:1 Q:$O(^DIBT(D))'>0
 S DIDUZ=0 F  S DIDUZ=+$O(^DISV(DIDUZ)) Q:'DIDUZ  S I=0 F  S I=$O(^DISV(DIDUZ,I)) Q:I'>0  I $O(^(I,0))>0 D PUT
 S DIK="^DIBT(" D IXALL^DIK G FIX2
 ;
PUT S X=^(0),Y=U_$P(X,U,2) I Y]U,@("$D("_Y_"0))") S DIC=+$P(^(0),U,2) I $D(^DIC(DIC,0,"GL")),^("GL")=Y G GOT
 Q
GOT S D=D+1,^DIBT(D,0)=$P(X,U,1)_U_$P(X,U,3)_U_U_+DIC_U_DIDUZ
 S X=0 F  S X=$O(^DISV(DIDUZ,I,X)) Q:X'>0  S ^DIBT(D,1,X)=""
 S Y="",X=0 F  S Y=$O(^DISV(DIDUZ,I,0,Y)) Q:Y=""  S ^DIBT(D,"DIS",Y)=^(Y)
 S Y=-1 Q
 ;
UP S D=0 F  S D=$O(^DD(J,D)) Q:D'>0  I $D(^(D,0)),$P(^(0),U,2)>J S J(+$P(^(0),U,2))=J
 S:D="" D=-1 S J=$O(J(0)) S:J="" J=-1 Q:J<0  S ^DD(J,0,"UP")=J(J) K J(J) G UP
 ;
FIX2 S I=1 F  S I=$O(^DIC(I)) Q:I'>0  I $D(^(I,0,"GL")),@("$D("_^("GL")_"0))"),$P(^(0),U,2)["N",'$D(^DD(I,.001)) S ^(.001,0)="NUMBER^N^^ ^K:$L(X)>9 X I $D(X) K:+X'=X!(X'>0) X",^DD(I,"B","NUMBER",.001)=""
 S I=0 F  S I=$O(^DD(I)) Q:I'>0  S J=0 F  S J=$O(^DD(I,J)) Q:J'>0  S X=$P(^(J,0),U,2),F=$F(X,"P") I 'X,F,'$E(X,F,99),@("$D(^"_$P(^(0),U,3)_"0))") S P=+$P(^(0),U,2),^(0)=$P(^DD(I,J,0),U,1)_U_$E(X,1,F-1)_P_$E(X,F,99)_U_$P(^(0),U,3,99)
 ;
FIX3 S I=.9 F  S I=$O(^DIPT(I)) Q:I'>0  I $D(^(I,0)) S X=$P(^(0),U,3) I $P(^(0),U,6)="" S ^(0)=$P(^(0)_"^^^^",U,1,5)_U_X
 S:I="" I=-1 S DD=1 F  S DD=$O(^DD(DD)) Q:DD'>0  S %=0 F  S %=$O(^DD(DD,"SB",%)) Q:%=""  S ^DD(%,0,"UP")=DD
 S:DD="" DD=-1 S %=-1
 ;
FIX4 S F=1 F  S F=$O(^DD(F)) Q:F'>0  I $D(^(F,"GR")) K ^("GR") S DIK="^DD("_F_",",DA(1)=F D IXALL^DIK
 ;
FIX5 S F=1 F  S F=$O(^DIC(F)) Q:F'>0  S I=$S($D(^(F,0,"DT")):^("DT"),1:0),J=$S($D(^("U")):^("U"),1:0) S:I!J ^DIC(F,"%A")=J_U_I
 ;
FIX6 K J S F=1 F  S (J,F)=$O(^DIC(F)) Q:F'>0  D UP
 S:F="" (F,J)=-1

DINIT6
DINIT6 ;SFISC/XAK-INITIALIZE VA FILEMAN ;20SEP2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I $D(^DD("OS"))[0 D OS^DINIT
 W !!,"The following files have been installed:",!
 F X=0:0 S X=$O(^DIC(X)) Q:X>1.9999  Q:'X  W $E("   ",1,(3-$L($P(X,"."))))_X,?11,$P($G(^DIC(X,0)),U),! S ^DD(X,0,"VR")=VERSION
 S ^DD("VERSION")=VERSION,X=^DD("OS",^DD("OS"),0)
DINITOSX S:$G(DINITOSX) ^DD("ROU")=$P(X,U,4) K ^DD("SUB")
 D 1
 D ^DINITPST
E W !,"INITIALIZATION COMPLETED IN "_($P($H,",",2)-DIT)_" SECONDS."
 D KL Q
 ;
1 N DIT
 D KL,PKG,DIINIT
 D PARAM
 Q
 ;
KL K %,%H,%X,%Y,DD,DH,DIC,DIK,DIT,DITZS,D,DA,VERSION,DU,F,I,J,P,X,Y,DIRUT,DTOUT,DUOUT
 Q
 ;
 ;
 ;
 ;
PKG ;
 I $D(^DIC(9.4,0))#2,($P(^DIC(9.4,0),U,1)'="PACKAGE") D  Q
 . W !!,"You have a file #9.4 that is not the 'Package' file."
 . W !,"Therefore, the Package file will not be initialized on your system."
 . W !,"You cannot use VA FileMan's package export utility, DIFROM."
 . Q
 I $$ROUEXIST^DILIBF("XPDUTL"),$$VERSION^XPDUTL("XU")'<8 Q
 K ^DD(9.4,913.5,2),^DD(9.4,914.5,2),^DD(9.4,916.5,2),^DD(9.44,222.7,2),^DD(9.44,222.9,2),^DD(9.44,1909)
 W !!,"Your Package file will now be updated.",!!
 D EN^DIPKINIT
 Q
 ;
 ;
 ;
DIINIT ;Update VA FileMan package entry
 N DIDATE,DIERR,DINIEN,DINFDA,DINMSG,DIVERS,X,Y,%DT
 S DIVERS=$P($T(V^DINIT),";",3)
 S X=$P($T(V^DINIT),";",6),%DT="" D ^%DT S DIDATE=Y
 S DINFDA(9.4,"?+1,",.01)="VA FILEMAN"
 S DINFDA(9.4,"?+1,",1)="DI"
 S DINFDA(9.4,"?+1,",2)="FM INIT"
 S DINFDA(9.4,"?+1,",13)=DIVERS
 S DINFDA(9.49,"?+2,?+1,",.01)=DIVERS
 S:DIDATE>0 DINFDA(9.49,"?+2,?+1,",1)=DIDATE
 S DINFDA(9.49,"?+2,?+1,",2)=DT
 S:$G(DUZ) DINFDA(9.49,"?+2,?+1,",3)=DUZ
 D UPDATE^DIE("","DINFDA","DINIEN","DINMSG")
 I $G(DIERR),$D(DINMSG("DIERR","E",299)) D
 . W !!,$C(7),"WARNING: There is more than one 'VA FILEMAN' entry in the Package file (#9.4)."
 . W !,"         I am unable to determine which is the correct entry to update with"
 . W !,"         current installation data."
 . W !!,"         You can delete or edit erroneous entries and run DINIT again."
 . N DIR,DTOUT,DUOUT,DIRUT,DIROUT
 . S DIR(0)="E"
 . W ! D ^DIR
 ;
 ;Put PACKAGE pointer into FM DIALOG entries, re-index file
 N DIPKG,DIREC S DIPKG=$G(DINIEN(1))
 W !!,"Re-indexing entries in the DIALOG file."
 F DIREC=0:0 S DIREC=$O(^DI(.84,DIREC)) Q:'DIREC!(DIREC>10000)  D
 . S $P(^DI(.84,DIREC,0),U,4)=DIPKG
 K DA S DIK="^DI(.84," D IXALL^DIK
 Q
 ;
 ;
PARAM ;
 N DINFDA,DINDES
 Q:$G(^XTV(8989.51,0))'?1"PARAMETER DEFINITION".E
 S DINFDA(8989.51,"?+1,",.01)="DI SCREENMAN COLORS"
 S DINFDA(8989.51,"?+1,",1.2)="30:BLACK;31:RED;32:GREEN;33:YELLOW;34:BLUE;35:MAGENTA;36:CYAN;37:WHITE"
 S DINFDA(8989.51,"?+1,",1.3)="Enter the Screen Color"
 S DINFDA(8989.51,"?+1,",6.2)="1:REQUIRED CAPTION FG;2:DATA FG;3:CLICKABLE AREA FG;4:REQUIRED CAPTION BG;5:DATA BG;6:CLICK AREA BG"
 S DINFDA(8989.51,"?+1,",6.3)="PICK ONE OF THE 6 KINDS OF COLORS"
 S DINFDA(8989.51,"?+1,",.03)=1
 S DINFDA(8989.51,"?+1,",.02)="COLORS FOR SCREENMAN PRESENTATION"
 S DINFDA(8989.51,"?+1,",.04)="FUNCTIONALITY"
 S DINFDA(8989.51,"?+1,",.05)="COLOR"
 S DINFDA(8989.51,"?+1,",20)="DINDES"
 S DINFDA(8989.513,"?+2,?+1,",.01)=1
 S DINFDA(8989.513,"?+2,?+1,",.02)=200
 S DINFDA(8989.513,"?+3,?+1,",.01)=2
 S DINFDA(8989.513,"?+3,?+1,",.02)=4.2
 F I=1.1,6.1 S DINFDA(8989.51,"?+1,",I)="S"
 S DINDES(1)="Colors for Foreground (FG) or Background (BG) of Screen"
 S DINDES(2)=""
 D UPDATE^DIE("","DINFDA")
 ;
 S DINFDA(8989.51,"?+1,",.01)="DI SCREENMAN NO MOUSE"
 S DINFDA(8989.51,"?+1,",.03)=0
 S DINFDA(8989.51,"?+1,",1.3)="Enter 'YES' to disenable the Mouse for ScreenMan"
 S DINFDA(8989.51,"?+1,",.02)="DISENABLE MOUSE WITHIN SCREENMAN"
 S DINFDA(8989.51,"?+1,",1.1)="Y"
 S DINFDA(8989.51,"?+1,",20)="DINDES"
 S DINFDA(8989.513,"?+2,?+1,",.01)=1
 S DINFDA(8989.513,"?+2,?+1,",.02)=200
 S DINFDA(8989.513,"?+3,?+1,",.01)=2
 S DINFDA(8989.513,"?+3,?+1,",.02)=4.2
 S DINDES(1)="Use this Parameter to DISENABLE use of the mouse in ScreenMan"
 S DINDES(2)="system-wide, or for an individual user."
 D UPDATE^DIE("","DINFDA")
 Q

DINIT901
DINIT901 ;GFT
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,210,0)
 ;;=210^1^^2
 ;;^UTILITY(U,$J,.84,210,2,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,210,2,1,0)
 ;;=Response must be a positive number
 ;;^UTILITY(U,$J,.84,210,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,210,5,1,0)
 ;;=DIR3
 ;;^UTILITY(U,$J,.84,211,0)
 ;;=211^1^y^2
 ;;^UTILITY(U,$J,.84,211,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,211,2,1,0)
 ;;=Response must contain no more than |1| decimal digit(s)
 ;;^UTILITY(U,$J,.84,211,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,211,3,1,0)
 ;;=1^Number of decimal digits
 ;;^UTILITY(U,$J,.84,211,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,211,5,1,0)
 ;;=DIR3
 ;;^UTILITY(U,$J,.84,211,5,2,0)
 ;;=DIR1
 ;;^UTILITY(U,$J,.84,212,0)
 ;;=212^1^y^2
 ;;^UTILITY(U,$J,.84,212,2,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,212,2,1,0)
 ;;=Response must be no less than |1| and no greater than |2|
 ;;^UTILITY(U,$J,.84,212,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,212,3,1,0)
 ;;=1^LOW VALUE
 ;;^UTILITY(U,$J,.84,212,3,2,0)
 ;;=2^HIGH VALUE
 ;;^UTILITY(U,$J,.84,212,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,212,5,1,0)
 ;;=DIR3
 ;;^UTILITY(U,$J,.84,213,0)
 ;;=213^1^y^2
 ;;^UTILITY(U,$J,.84,213,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,213,2,1,0)
 ;;=Response must contain from |1| to |2| characters.
 ;;^UTILITY(U,$J,.84,213,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,213,3,1,0)
 ;;=1^SMALLEST NUMBER OF CHARACTERS
 ;;^UTILITY(U,$J,.84,213,3,2,0)
 ;;=2^LARGEST NUMBER OF CHARACTERS
 ;;^UTILITY(U,$J,.84,213,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,213,5,1,0)
 ;;=DIR1^F+2
 ;;^UTILITY(U,$J,.84,214,0)
 ;;=214^1^^2
 ;;^UTILITY(U,$J,.84,214,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,214,2,1,0)
 ;;=Response must not contain embedded uparrows(^).
 ;;^UTILITY(U,$J,.84,214,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,214,5,1,0)
 ;;=DIR1^F+2
 ;;^UTILITY(U,$J,.84,504,0)
 ;;=504^1^y^2
 ;;^UTILITY(U,$J,.84,504,2,0)
 ;;=^^1^1^2991026^
 ;;^UTILITY(U,$J,.84,504,2,1,0)
 ;;='|1|' IS NOT A WORD-PROCESSING FIELD!
 ;;^UTILITY(U,$J,.84,504,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,504,3,1,0)
 ;;=1^NAME OF FIELD
 ;;^UTILITY(U,$J,.84,504,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,504,5,1,0)
 ;;=DIWE3^ACC+3
 ;;^UTILITY(U,$J,.84,1401,0)
 ;;=1401^1^^2
 ;;^UTILITY(U,$J,.84,1401,2,0)
 ;;=^^1^1^2991025^^
 ;;^UTILITY(U,$J,.84,1401,2,1,0)
 ;;=That is not a valid Response.
 ;;^UTILITY(U,$J,.84,1401,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1401,5,1,0)
 ;;=DIWE3^%+6
 ;;^UTILITY(U,$J,.84,1402,0)
 ;;=1402^1^^2
 ;;^UTILITY(U,$J,.84,1402,2,0)
 ;;=^^1^1^2991025^
 ;;^UTILITY(U,$J,.84,1402,2,1,0)
 ;;=No Record Found.
 ;;^UTILITY(U,$J,.84,1402,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1402,5,1,0)
 ;;=DIWE3^DIC+2
 ;;^UTILITY(U,$J,.84,1403,0)
 ;;=1403^1^^2
 ;;^UTILITY(U,$J,.84,1403,2,0)
 ;;=^^1^1^2991025^
 ;;^UTILITY(U,$J,.84,1403,2,1,0)
 ;;=There is no text to Transfer.
 ;;^UTILITY(U,$J,.84,1403,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1403,5,1,0)
 ;;=DIWE3^GET1+3
 ;;^UTILITY(U,$J,.84,1410,0)
 ;;=1410^1^^2
 ;;^UTILITY(U,$J,.84,1410,2,0)
 ;;=^^1^1^2991025^
 ;;^UTILITY(U,$J,.84,1410,2,1,0)
 ;;=You have no READ ACCESS to the File.
 ;;^UTILITY(U,$J,.84,1410,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1410,5,1,0)
 ;;=DIWE3^ACC
 ;;^UTILITY(U,$J,.84,1509,0)
 ;;=1509^1^^2
 ;;^UTILITY(U,$J,.84,1509,1,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,1509,1,1,0)
 ;;=This Search Template has no search results!
 ;;^UTILITY(U,$J,.84,1509,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,1509,2,1,0)
 ;;=This Search Template has no search results!
 ;;^UTILITY(U,$J,.84,1509,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1509,5,1,0)
 ;;=DIP11^EMPTY
 ;;^UTILITY(U,$J,.84,1510,0)
 ;;=1510^1^^2
 ;;^UTILITY(U,$J,.84,1510,2,0)
 ;;=^^1^1^2991012^
 ;;^UTILITY(U,$J,.84,1510,2,1,0)
 ;;=The START WITH File Number must be less than the GO TO File Number.
 ;;^UTILITY(U,$J,.84,1510,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1510,5,1,0)
 ;;=DICRW1
 ;;^UTILITY(U,$J,.84,1511,0)
 ;;=1511^1^^2
 ;;^UTILITY(U,$J,.84,1511,2,0)
 ;;=^^1^1^2991012^
 ;;^UTILITY(U,$J,.84,1511,2,1,0)
 ;;=   The START WITH value follows the GO TO value.
 ;;^UTILITY(U,$J,.84,1511,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1511,5,1,0)
 ;;=DIP100
 ;;^UTILITY(U,$J,.84,1519,0)
 ;;=1519^1^y^2
 ;;^UTILITY(U,$J,.84,1519,2,0)
 ;;=^^1^1^2991002^^
 ;;^UTILITY(U,$J,.84,1519,2,1,0)
 ;;=*** Job stopped because maximum number of SPOOL lines (|1|) has been exceeded ***
 ;;^UTILITY(U,$J,.84,1519,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1519,3,1,0)
 ;;=1^Maximum number of spool lines
 ;;^UTILITY(U,$J,.84,1519,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1519,5,1,0)
 ;;=DIO2
 ;;^UTILITY(U,$J,.84,1520,0)
 ;;=1520^1^^2
 ;;^UTILITY(U,$J,.84,1520,2,0)
 ;;=^^2^2^2991028^
 ;;^UTILITY(U,$J,.84,1520,2,1,0)
 ;;=A histogram cannot be displayed.  No SUB-COUNTs were calculated on the last
 ;;^UTILITY(U,$J,.84,1520,2,2,0)
 ;;=Fileman print job from this device.
 ;;^UTILITY(U,$J,.84,1520,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1520,5,1,0)
 ;;=DIH
 ;;^UTILITY(U,$J,.84,1521,0)
 ;;=1521^1^^2
 ;;^UTILITY(U,$J,.84,1521,2,0)
 ;;=^^2^2^2991028^^
 ;;^UTILITY(U,$J,.84,1521,2,1,0)
 ;;=A scattergram cannot be displayed.  No SUB-SUB-COUNTs were calculated on the last
 ;;^UTILITY(U,$J,.84,1521,2,2,0)
 ;;=Fileman print job from this device.
 ;;^UTILITY(U,$J,.84,1521,5,0)
 ;;=^.841^^0
 ;;^UTILITY(U,$J,.84,1528,0)
 ;;=1528^1^y^2
 ;;^UTILITY(U,$J,.84,1528,2,0)
 ;;=^^1^1^2991002^
 ;;^UTILITY(U,$J,.84,1528,2,1,0)
 ;;=*** TASK |1| stopped by user during Print Execution ***
 ;;^UTILITY(U,$J,.84,1528,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1528,3,1,0)
 ;;=1^Task Number
 ;;^UTILITY(U,$J,.84,1528,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1528,5,1,0)
 ;;=DIO2^TASKSTOP
 ;;^UTILITY(U,$J,.84,1529,0)
 ;;=1529^1^y^2
 ;;^UTILITY(U,$J,.84,1529,2,0)
 ;;=^^1^1^2991002^^
 ;;^UTILITY(U,$J,.84,1529,2,1,0)
 ;;=*** TASK |1| stopped by user during Sort Execution ***
 ;;^UTILITY(U,$J,.84,1529,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1529,3,1,0)
 ;;=1^Task Number
 ;;^UTILITY(U,$J,.84,1529,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1529,5,1,0)
 ;;=DIO2^TASKSTOP
 ;;^UTILITY(U,$J,.84,7050,0)
 ;;=7050^2^^2
 ;;^UTILITY(U,$J,.84,7050,1,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,7050,1,1,0)
 ;;=ARE YOU SURE?
 ;;^UTILITY(U,$J,.84,7050,2,0)
 ;;=^^1^1^2990710^^
 ;;^UTILITY(U,$J,.84,7050,2,1,0)
 ;;=ARE YOU SURE
 ;;^UTILITY(U,$J,.84,7050,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7050,5,1,0)
 ;;=DIWE3^YN
 ;;^UTILITY(U,$J,.84,7060,0)
 ;;=7060^2^y^2
 ;;^UTILITY(U,$J,.84,7060,2,0)
 ;;=2
 ;;^UTILITY(U,$J,.84,7060,2,1,0)
 ;;=Within |1|, |2| by
 ;;^UTILITY(U,$J,.84,7060,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,7060,3,1,0)
 ;;=1^NAME OF PREVIOUS SORT FIELD
 ;;^UTILITY(U,$J,.84,7060,3,2,0)
 ;;=2^AN IMPERATIVE PHRASE LIKE 'SORT BY'
 ;;^UTILITY(U,$J,.84,7060,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7060,5,1,0)
 ;;=DIP^EGP
 ;;^UTILITY(U,$J,.84,7061,0)
 ;;=7061^2^y^2
 ;;^UTILITY(U,$J,.84,7061,2,0)
 ;;=^^1^1^2991013^^^
 ;;^UTILITY(U,$J,.84,7061,2,1,0)
 ;;=|1| by
 ;;^UTILITY(U,$J,.84,7061,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7061,3,1,0)
 ;;=1^THE WORD 'SORT' OR SIMILAR
 ;;^UTILITY(U,$J,.84,7061,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7061,5,1,0)
 ;;=DIP^BY
 ;;^UTILITY(U,$J,.84,7062,0)
 ;;=7062^2^^2
 ;;^UTILITY(U,$J,.84,7062,2,0)
 ;;=^^1^1^2991013^
 ;;^UTILITY(U,$J,.84,7062,2,1,0)
 ;;=Sort
 ;;^UTILITY(U,$J,.84,7062,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7062,5,1,0)
 ;;=DIP^SORT
 ;;^UTILITY(U,$J,.84,7063,0)
 ;;=7063^2^y^2
 ;;^UTILITY(U,$J,.84,7063,2,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,7063,2,1,0)
 ;;=|1| Print |2|: 
 ;;^UTILITY(U,$J,.84,7063,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,7063,3,1,0)
 ;;=1^'FIRST' OR 'THEN'
 ;;^UTILITY(U,$J,.84,7063,3,2,0)
 ;;=2^'FIELD' or similar
 ;;^UTILITY(U,$J,.84,7063,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7063,5,1,0)
 ;;=DIP2^2
 ;;^UTILITY(U,$J,.84,7064,0)
 ;;=7064^2^y^2
 ;;^UTILITY(U,$J,.84,7064,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,7064,2,1,0)
 ;;=|1| Export |2|: 
 ;;^UTILITY(U,$J,.84,7064,3,0)
 ;;=^.845^2^2

DINIT902
DINIT902 ;GFT
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,7064,3,1,0)
 ;;=1^'FIRST' OR 'THEN'
 ;;^UTILITY(U,$J,.84,7064,3,2,0)
 ;;=2^'FIELD' or similar
 ;;^UTILITY(U,$J,.84,7064,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7064,5,1,0)
 ;;=DIP2^2
 ;;^UTILITY(U,$J,.84,7065,0)
 ;;=7065^2^^2^THIS IS THE ADVERB 'FIRST'
 ;;^UTILITY(U,$J,.84,7065,2,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,7065,2,1,0)
 ;;=First
 ;;^UTILITY(U,$J,.84,7065,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7065,5,1,0)
 ;;=DIP2^2
 ;;^UTILITY(U,$J,.84,7066,0)
 ;;=7066^2^^2
 ;;^UTILITY(U,$J,.84,7066,1,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,7066,1,1,0)
 ;;=THIS IS THE ADVERB 'THEN'
 ;;^UTILITY(U,$J,.84,7066,2,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,7066,2,1,0)
 ;;=Then
 ;;^UTILITY(U,$J,.84,7066,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7066,5,1,0)
 ;;=DIP2^2
 ;;^UTILITY(U,$J,.84,7068,0)
 ;;=7068^2^y^2
 ;;^UTILITY(U,$J,.84,7068,2,0)
 ;;=^^1^1^2991013^
 ;;^UTILITY(U,$J,.84,7068,2,1,0)
 ;;=Start with |1|
 ;;^UTILITY(U,$J,.84,7068,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7068,3,1,0)
 ;;=1^NAME OF FIELD WHOSE INITAL VALUE WE ARE ASKING FOR
 ;;^UTILITY(U,$J,.84,7068,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7068,5,1,0)
 ;;=DIP1
 ;;^UTILITY(U,$J,.84,7069,0)
 ;;=7069^2^y^2
 ;;^UTILITY(U,$J,.84,7069,2,0)
 ;;=^^1^1^2991013^
 ;;^UTILITY(U,$J,.84,7069,2,1,0)
 ;;=Go to |1|
 ;;^UTILITY(U,$J,.84,7069,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7069,3,1,0)
 ;;=1^NAME OF FIELD WHOSE LAST VALUE WE ARE ASKING FOR
 ;;^UTILITY(U,$J,.84,7069,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7069,5,1,0)
 ;;=DIP1
 ;;^UTILITY(U,$J,.84,7070,0)
 ;;=7070^2^^2
 ;;^UTILITY(U,$J,.84,7070,1,0)
 ;;=^^1^1^2991012^
 ;;^UTILITY(U,$J,.84,7070,1,1,0)
 ;;=As in START WITH: FIRST
 ;;^UTILITY(U,$J,.84,7070,2,0)
 ;;=^^1^1^2991012^^
 ;;^UTILITY(U,$J,.84,7070,2,1,0)
 ;;=FIRST
 ;;^UTILITY(U,$J,.84,7070,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7070,5,1,0)
 ;;=DIP1
 ;;^UTILITY(U,$J,.84,7071,0)
 ;;=7071^2^^2
 ;;^UTILITY(U,$J,.84,7071,1,0)
 ;;=^^1^1^2991012^
 ;;^UTILITY(U,$J,.84,7071,1,1,0)
 ;;=As in GO TO: LAST
 ;;^UTILITY(U,$J,.84,7071,2,0)
 ;;=^^1^1^2991012^
 ;;^UTILITY(U,$J,.84,7071,2,1,0)
 ;;=LAST
 ;;^UTILITY(U,$J,.84,7071,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7071,5,1,0)
 ;;=DIP1
 ;;^UTILITY(U,$J,.84,7080,0)
 ;;=7080^2^^2
 ;;^UTILITY(U,$J,.84,7080,2,0)
 ;;=^^1^1^2991008^
 ;;^UTILITY(U,$J,.84,7080,2,1,0)
 ;;=NULL-STRING
 ;;^UTILITY(U,$J,.84,7080,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7080,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,7081,0)
 ;;=7081^2^y^2
 ;;^UTILITY(U,$J,.84,7081,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,7081,2,1,0)
 ;;=|1| by |2|
 ;;^UTILITY(U,$J,.84,7081,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,7081,3,1,0)
 ;;=1^NAME OF FIELD BEING COUNTED IN HISTOGRAM
 ;;^UTILITY(U,$J,.84,7081,3,2,0)
 ;;=2^NEW OF FIELD SUBTOTALLED IN HISTOGRAM
 ;;^UTILITY(U,$J,.84,7081,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7081,5,1,0)
 ;;=DIH
 ;;^UTILITY(U,$J,.84,7085,0)
 ;;=7085^2^^2
 ;;^UTILITY(U,$J,.84,7085,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,7085,2,1,0)
 ;;=Deviation
 ;;^UTILITY(U,$J,.84,7085,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7085,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7086,0)
 ;;=7086^2^^2
 ;;^UTILITY(U,$J,.84,7086,2,0)
 ;;=^^1^1^2990903^^
 ;;^UTILITY(U,$J,.84,7086,2,1,0)
 ;;=Maximum
 ;;^UTILITY(U,$J,.84,7086,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7086,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7087,0)
 ;;=7087^2^^2
 ;;^UTILITY(U,$J,.84,7087,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,7087,2,1,0)
 ;;=Minimum
 ;;^UTILITY(U,$J,.84,7087,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7087,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7088,0)
 ;;=7088^2^^2
 ;;^UTILITY(U,$J,.84,7088,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,7088,2,1,0)
 ;;=Mean
 ;;^UTILITY(U,$J,.84,7088,3,0)
 ;;=^.845
 ;;^UTILITY(U,$J,.84,7088,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,7088,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7088,5,2,0)
 ;;=DIH
 ;;^UTILITY(U,$J,.84,7089,0)
 ;;=7089^2^^2
 ;;^UTILITY(U,$J,.84,7089,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,7089,2,1,0)
 ;;=Count
 ;;^UTILITY(U,$J,.84,7089,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,7089,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7089,5,2,0)
 ;;=DIH
 ;;^UTILITY(U,$J,.84,7090,0)
 ;;=7090^2^^2
 ;;^UTILITY(U,$J,.84,7090,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,7090,2,1,0)
 ;;=Total
 ;;^UTILITY(U,$J,.84,7090,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,7090,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7090,5,2,0)
 ;;=DIH
 ;;^UTILITY(U,$J,.84,7091,0)
 ;;=7091^2^y^2
 ;;^UTILITY(U,$J,.84,7091,2,0)
 ;;=^^1^1^2990902^^
 ;;^UTILITY(U,$J,.84,7091,2,1,0)
 ;;=Previous specification: '|1|'
 ;;^UTILITY(U,$J,.84,7091,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7091,3,1,0)
 ;;=1^PHRASE DESCRIBING SORT SPECIFICATION , LIKE "DATE null"
 ;;^UTILITY(U,$J,.84,7091,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7091,5,1,0)
 ;;=DIP1
 ;;^UTILITY(U,$J,.84,7092,0)
 ;;=7092^2^y^2
 ;;^UTILITY(U,$J,.84,7092,2,0)
 ;;=^^1^1^2990902^
 ;;^UTILITY(U,$J,.84,7092,2,1,0)
 ;;=|1| is null
 ;;^UTILITY(U,$J,.84,7092,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7092,3,1,0)
 ;;=1^FIELD NAME
 ;;^UTILITY(U,$J,.84,7092,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7092,5,1,0)
 ;;=DIP12
 ;;^UTILITY(U,$J,.84,7093,0)
 ;;=7093^2^y^2
 ;;^UTILITY(U,$J,.84,7093,2,0)
 ;;=^^1^1^2990902^^
 ;;^UTILITY(U,$J,.84,7093,2,1,0)
 ;;= |1| not null
 ;;^UTILITY(U,$J,.84,7093,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7093,3,1,0)
 ;;=1^FIELD NAME
 ;;^UTILITY(U,$J,.84,7093,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7093,5,1,0)
 ;;=DIP12
 ;;^UTILITY(U,$J,.84,7094,0)
 ;;=7094^2^^2
 ;;^UTILITY(U,$J,.84,7094,2,0)
 ;;=^^1^1^2990902^^^
 ;;^UTILITY(U,$J,.84,7094,2,1,0)
 ;;= (includes null values)
 ;;^UTILITY(U,$J,.84,7094,3,0)
 ;;=^.845^^0
 ;;^UTILITY(U,$J,.84,7094,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7094,5,1,0)
 ;;=DIP12^ALL
 ;;^UTILITY(U,$J,.84,7095,0)
 ;;=7095^2^y^2
 ;;^UTILITY(U,$J,.84,7095,1,0)
 ;;=^^1^1^2990823^^
 ;;^UTILITY(U,$J,.84,7095,1,1,0)
 ;;="Page 1" or whatever, at the top of each output page
 ;;^UTILITY(U,$J,.84,7095,2,0)
 ;;=^^1^1^2990823^^^
 ;;^UTILITY(U,$J,.84,7095,2,1,0)
 ;;=PAGE |1|
 ;;^UTILITY(U,$J,.84,7095,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7095,3,1,0)
 ;;=1^PAGE NUMBER
 ;;^UTILITY(U,$J,.84,7095,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7095,5,1,0)
 ;;=DIP5^EGP
 ;;^UTILITY(U,$J,.84,7096,0)
 ;;=7096^2^^2
 ;;^UTILITY(U,$J,.84,7096,2,0)
 ;;=^^1^1^2990531^
 ;;^UTILITY(U,$J,.84,7096,2,1,0)
 ;;=START at PAGE: 
 ;;^UTILITY(U,$J,.84,7096,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7096,5,1,0)
 ;;=DIP3
 ;;^UTILITY(U,$J,.84,7097,0)
 ;;=7097^2^^2
 ;;^UTILITY(U,$J,.84,7097,1,0)
 ;;=^^1^1^2991024^^^
 ;;^UTILITY(U,$J,.84,7097,1,1,0)
 ;;=AS IN 'REPLACE : END'
 ;;^UTILITY(U,$J,.84,7097,2,0)
 ;;=^^1^1^2991024^^
 ;;^UTILITY(U,$J,.84,7097,2,1,0)
 ;;=END
 ;;^UTILITY(U,$J,.84,7097,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7097,5,1,0)
 ;;=DIR2
 ;;^UTILITY(U,$J,.84,7098,0)
 ;;=7098^2^y^2^SUB
 ;;^UTILITY(U,$J,.84,7098,1,0)
 ;;=^^1^1^2991008^^
 ;;^UTILITY(U,$J,.84,7098,1,1,0)
 ;;=TAKES THE WORD 'TOTAL' AND TURNS IT INTO 'SUBTOTAL', 'COUNT' INTO 'SUBCOUNT', ETC
 ;;^UTILITY(U,$J,.84,7098,2,0)
 ;;=^^1^1^2991008^^
 ;;^UTILITY(U,$J,.84,7098,2,1,0)
 ;;=Sub-|1|
 ;;^UTILITY(U,$J,.84,7098,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7098,3,1,0)
 ;;=1^WORD LIKE 'TOTAL'
 ;;^UTILITY(U,$J,.84,7098,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7098,5,1,0)
 ;;=DIO3
 ;;^UTILITY(U,$J,.84,7099,0)
 ;;=7099^2^^2
 ;;^UTILITY(U,$J,.84,7099,1,0)
 ;;=^^1^1^2991218^^^^
 ;;^UTILITY(U,$J,.84,7099,1,1,0)
 ;;=The term for INTERNAL ENTRY NUMBER.
 ;;^UTILITY(U,$J,.84,7099,2,0)
 ;;=^^1^1^2991218^^^^
 ;;^UTILITY(U,$J,.84,7099,2,1,0)
 ;;=NUMBER
 ;;^UTILITY(U,$J,.84,7099,5,0)
 ;;=^.841^5^5
 ;;^UTILITY(U,$J,.84,7099,5,1,0)
 ;;=DICQ
 ;;^UTILITY(U,$J,.84,7099,5,2,0)
 ;;=DIP^NUM
 ;;^UTILITY(U,$J,.84,7099,5,3,0)
 ;;=DIP22^0
 ;;^UTILITY(U,$J,.84,7099,5,4,0)
 ;;=DICOMP0^N+1
 ;;^UTILITY(U,$J,.84,7099,5,5,0)
 ;;=DIQ
 ;;^UTILITY(U,$J,.84,8000,0)
 ;;=8000^2^^2
 ;;^UTILITY(U,$J,.84,8000,2,0)
 ;;=^^1^1^2991028^

DINIT903
DINIT903 ;GFT;3MAY2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8000,2,1,0)
 ;;=COMMAND:
 ;;^UTILITY(U,$J,.84,8000,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,8000,5,1,0)
 ;;=DIR0H
 ;;^UTILITY(U,$J,.84,8000,5,2,0)
 ;;=DIR02
 ;;^UTILITY(U,$J,.84,8000,5,3,0)
 ;;=DDSCOM^EGP
 ;;^UTILITY(U,$J,.84,8000.1,0)
 ;;=8000.1^3^^2
 ;;^UTILITY(U,$J,.84,8000.1,2,0)
 ;;=^^1^1^2991028^
 ;;^UTILITY(U,$J,.84,8000.1,2,1,0)
 ;;=Enter a COMMAND, or "^" followed by the CAPTION of a FIELD to jump to.
 ;;^UTILITY(U,$J,.84,8000.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.1,5,1,0)
 ;;=DDSCOM^EGP
 ;;^UTILITY(U,$J,.84,8000.101,0)
 ;;=8000.101^3^^2
 ;;^UTILITY(U,$J,.84,8000.101,2,0)
 ;;=^^1^1^3040501
 ;;^UTILITY(U,$J,.84,8000.101,2,1,0)
 ;;=Click on one of the above COMMANDs, or on a FIELD
 ;;^UTILITY(U,$J,.84,8000.101,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.101,5,1,0)
 ;;=DDSCOM^EGP
 ;;^UTILITY(U,$J,.84,8000.11,0)
 ;;=8000.11^3^^2
 ;;^UTILITY(U,$J,.84,8000.11,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.11,2,1,0)
 ;;=Exit the Form
 ;;^UTILITY(U,$J,.84,8000.11,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.11,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.01,0)
 ;;=8000.01^3^^2
 ;;^UTILITY(U,$J,.84,8000.01,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.01,2,1,0)
 ;;=Exit
 ;;^UTILITY(U,$J,.84,8000.01,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.01,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.02,0)
 ;;=8000.02^3^^2
 ;;^UTILITY(U,$J,.84,8000.02,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.02,2,1,0)
 ;;=Close
 ;;^UTILITY(U,$J,.84,8000.02,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.02,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.03,0)
 ;;=8000.03^3^^2
 ;;^UTILITY(U,$J,.84,8000.03,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.03,2,1,0)
 ;;=Save
 ;;^UTILITY(U,$J,.84,8000.03,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.03,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.04,0)
 ;;=8000.04^3^^2
 ;;^UTILITY(U,$J,.84,8000.04,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.04,2,1,0)
 ;;=Next Page
 ;;^UTILITY(U,$J,.84,8000.04,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.04,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.05,0)
 ;;=8000.05^3^^2
 ;;^UTILITY(U,$J,.84,8000.05,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.05,2,1,0)
 ;;=Refresh
 ;;^UTILITY(U,$J,.84,8000.05,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.05,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.06,0)
 ;;=8000.06^3^^2
 ;;^UTILITY(U,$J,.84,8000.06,2,0)
 ;;=^^1^1^3040503
 ;;^UTILITY(U,$J,.84,8000.06,2,1,0)
 ;;=Previous Page
 ;;^UTILITY(U,$J,.84,8000.06,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.06,5,1,0)
 ;;=DDSCOM;
 ;;^UTILITY(U,$J,.84,8000.07,0)
 ;;=8000.07^3^^2
 ;;^UTILITY(U,$J,.84,8000.07,2,0)
 ;;=^^1^1^3040503
 ;;^UTILITY(U,$J,.84,8000.07,2,1,0)
 ;;=Quit
 ;;^UTILITY(U,$J,.84,8000.07,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.07,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.11,0)
 ;;=8000.11^3^^2
 ;;^UTILITY(U,$J,.84,8000.11,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,8000.11,2,1,0)
 ;;=Exit the Form
 ;;^UTILITY(U,$J,.84,8000.11,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.11,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.12,0)
 ;;=8000.12^3^^2
 ;;^UTILITY(U,$J,.84,8000.12,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,8000.12,2,1,0)
 ;;=Close the window and return to previous level
 ;;^UTILITY(U,$J,.84,8000.12,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.12,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.13,0)
 ;;=8000.13^3^^2
 ;;^UTILITY(U,$J,.84,8000.13,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,8000.13,2,1,0)
 ;;=Save all changes but continue editing
 ;;^UTILITY(U,$J,.84,8000.13,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.13,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.14,0)
 ;;=8000.14^3^^2
 ;;^UTILITY(U,$J,.84,8000.14,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,8000.14,2,1,0)
 ;;=Go to next page
 ;;^UTILITY(U,$J,.84,8000.14,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.14,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.15,0)
 ;;=8000.15^3^^2
 ;;^UTILITY(U,$J,.84,8000.15,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,8000.15,2,1,0)
 ;;=Repaint the screen
 ;;^UTILITY(U,$J,.84,8000.15,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.15,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.16,0)
 ;;=8000.16^3^^2
 ;;^UTILITY(U,$J,.84,8000.15,2,0)
 ;;=^^1^1^3040503
 ;;^UTILITY(U,$J,.84,8000.16,2,1,0)
 ;;=Go to previous page
 ;;^UTILITY(U,$J,.84,8000.16,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.16,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8000.17,0)
 ;;=8000.17^3^^2
 ;;^UTILITY(U,$J,.84,8000.17,2,0)
 ;;=^^1^1^3040503
 ;;^UTILITY(U,$J,.84,8000.17,2,1,0)
 ;;=Quit without filing
 ;;^UTILITY(U,$J,.84,8000.17,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8000.17,5,1,0)
 ;;=DDSCOM
 ;;^UTILITY(U,$J,.84,8100,0)
 ;;=8100^2^^2
 ;;^UTILITY(U,$J,.84,8100,2,0)
 ;;=^^1^1^2990908^^
 ;;^UTILITY(U,$J,.84,8100,2,1,0)
 ;;=Input to what File: 
 ;;^UTILITY(U,$J,.84,8100,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8100,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8101,0)
 ;;=8101^2^^2
 ;;^UTILITY(U,$J,.84,8101,2,0)
 ;;=^^1^1^2991012^^^^
 ;;^UTILITY(U,$J,.84,8101,2,1,0)
 ;;=Output from what File: 
 ;;^UTILITY(U,$J,.84,8101,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8101,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8101.1,0)
 ;;=8101.1^2^^2
 ;;^UTILITY(U,$J,.84,8101.1,2,0)
 ;;=^^1^1^2991012^^
 ;;^UTILITY(U,$J,.84,8101.1,2,1,0)
 ;;= START WITH What File: 
 ;;^UTILITY(U,$J,.84,8101.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8101.1,5,1,0)
 ;;=DICRW1^L+1
 ;;^UTILITY(U,$J,.84,8101.2,0)
 ;;=8101.2^2^^2
 ;;^UTILITY(U,$J,.84,8101.2,2,0)
 ;;=^^1^1^2991012^^
 ;;^UTILITY(U,$J,.84,8101.2,2,1,0)
 ;;=      GO TO What File: 
 ;;^UTILITY(U,$J,.84,8101.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8101.2,5,1,0)
 ;;=DICRW1^C3
 ;;^UTILITY(U,$J,.84,8102,0)
 ;;=8102^2^^2
 ;;^UTILITY(U,$J,.84,8102,2,0)
 ;;=^^1^1^2990908^
 ;;^UTILITY(U,$J,.84,8102,2,1,0)
 ;;=Modify what File: 
 ;;^UTILITY(U,$J,.84,8102,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8102,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8103,0)
 ;;=8103^2^^2
 ;;^UTILITY(U,$J,.84,8103,2,0)
 ;;=^^1^1^2990908^
 ;;^UTILITY(U,$J,.84,8103,2,1,0)
 ;;=Extract from what File: 
 ;;^UTILITY(U,$J,.84,8103,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8103,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8104,0)
 ;;=8104^2^^2
 ;;^UTILITY(U,$J,.84,8104,2,0)
 ;;=^^1^1^2990908^
 ;;^UTILITY(U,$J,.84,8104,2,1,0)
 ;;=Archive from what File: 
 ;;^UTILITY(U,$J,.84,8104,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8104,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8105,0)
 ;;=8105^2^^2
 ;;^UTILITY(U,$J,.84,8105,2,0)
 ;;=^^1^1^2990908^
 ;;^UTILITY(U,$J,.84,8105,2,1,0)
 ;;=Audit from what File: 
 ;;^UTILITY(U,$J,.84,8105,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8105,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8106,0)
 ;;=8106^2^^2
 ;;^UTILITY(U,$J,.84,8106,2,0)
 ;;=^^1^1^2991011^^
 ;;^UTILITY(U,$J,.84,8106,2,1,0)
 ;;=Compare Entries in what File: 
 ;;^UTILITY(U,$J,.84,8106,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8106,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8107,0)
 ;;=8107^2^^2
 ;;^UTILITY(U,$J,.84,8107,2,0)
 ;;=^^1^1^2991011^^^
 ;;^UTILITY(U,$J,.84,8107,2,1,0)
 ;;=Edit/Create Form for what File: 
 ;;^UTILITY(U,$J,.84,8107,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8107,5,1,0)
 ;;=DDGFFM
 ;;^UTILITY(U,$J,.84,8108,0)
 ;;=8108^2^^2
 ;;^UTILITY(U,$J,.84,8108,2,0)
 ;;=^^1^1^2991011^^
 ;;^UTILITY(U,$J,.84,8108,2,1,0)
 ;;=Clone Form from what File: 
 ;;^UTILITY(U,$J,.84,8108,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8108,5,1,0)
 ;;=DDSCLONE^EGP
 ;;^UTILITY(U,$J,.84,8108.1,0)
 ;;=8108.1^2^^2
 ;;^UTILITY(U,$J,.84,8108.1,2,0)
 ;;=^^1^1^2991011^^^
 ;;^UTILITY(U,$J,.84,8108.1,2,1,0)
 ;;=Purge Unused Blocks from what File: 
 ;;^UTILITY(U,$J,.84,8108.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8108.1,5,1,0)
 ;;=DDSDBLK^EGP
 ;;^UTILITY(U,$J,.84,8108.2,0)
 ;;=8108.2^2^^2
 ;;^UTILITY(U,$J,.84,8108.2,2,0)
 ;;=^^1^1^2991011^
 ;;^UTILITY(U,$J,.84,8108.2,2,1,0)
 ;;=Delete Form for what File: 
 ;;^UTILITY(U,$J,.84,8108.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8108.2,5,1,0)
 ;;=DDSDFRM^EGP
 ;;^UTILITY(U,$J,.84,8108.3,0)
 ;;=8108.3^2^^2
 ;;^UTILITY(U,$J,.84,8108.3,2,0)
 ;;=^^1^1^2991011^
 ;;^UTILITY(U,$J,.84,8108.3,2,1,0)
 ;;=Run Form from what File: 
 ;;^UTILITY(U,$J,.84,8108.3,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8108.3,5,1,0)
 ;;=DDSRUN^EGP
 ;;^UTILITY(U,$J,.84,8109,0)
 ;;=8109^2^y^2
 ;;^UTILITY(U,$J,.84,8109,2,0)
 ;;=^^1^1^2990531^^
 ;;^UTILITY(U,$J,.84,8109,2,1,0)
 ;;=|1| Search
 ;;^UTILITY(U,$J,.84,8109,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8109,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8109,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8109,5,1,0)
 ;;=DIP3^HD
 ;;^UTILITY(U,$J,.84,8110,0)
 ;;=8110^2^y^2
 ;;^UTILITY(U,$J,.84,8110,2,0)
 ;;=^^1^1^2990531^^
 ;;^UTILITY(U,$J,.84,8110,2,1,0)
 ;;=|1| Statistics
 ;;^UTILITY(U,$J,.84,8110,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8110,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8110,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8110,5,1,0)
 ;;=DIP3^HD
 ;;^UTILITY(U,$J,.84,8111,0)
 ;;=8111^2^y^2
 ;;^UTILITY(U,$J,.84,8111,2,0)
 ;;=^^1^1^2990531^^^
 ;;^UTILITY(U,$J,.84,8111,2,1,0)
 ;;=|1| Extract Search
 ;;^UTILITY(U,$J,.84,8111,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8111,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8111,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8111,5,1,0)
 ;;=DIP3^HD
 ;;^UTILITY(U,$J,.84,8112,0)
 ;;=8112^2^y^2
 ;;^UTILITY(U,$J,.84,8112,2,0)
 ;;=^^1^1^2990706^^^^
 ;;^UTILITY(U,$J,.84,8112,2,1,0)
 ;;=|1| Archive Search
 ;;^UTILITY(U,$J,.84,8112,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8112,3,1,0)
 ;;=1^Filename
 ;;^UTILITY(U,$J,.84,8112,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8112,5,1,0)
 ;;=DIP3^HD
 ;;^UTILITY(U,$J,.84,8113,0)
 ;;=8113^2^y^2
 ;;^UTILITY(U,$J,.84,8113,2,0)
 ;;=^^1^1^2990710^^^^
 ;;^UTILITY(U,$J,.84,8113,2,1,0)
 ;;=ARE YOU SURE YOU WANT TO DELETE THE ENTIRE |1|
 ;;^UTILITY(U,$J,.84,8113,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8113,3,1,0)
 ;;=1^Name of File or Sub-File
 ;;^UTILITY(U,$J,.84,8113,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8113,5,1,0)
 ;;=DIE2^D+1
 ;;^UTILITY(U,$J,.84,8114,0)
 ;;=8114^2^^2
 ;;^UTILITY(U,$J,.84,8114,2,0)
 ;;=^^1^1^2990710^^^^
 ;;^UTILITY(U,$J,.84,8114,2,1,0)
 ;;=<NOTHING DELETED>
 ;;^UTILITY(U,$J,.84,8114,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8114,5,1,0)
 ;;=DIE2^N
 ;;^UTILITY(U,$J,.84,8114,5,2,0)
 ;;=DIWE3^D+5
 ;;^UTILITY(U,$J,.84,8115,0)
 ;;=8115^2^^2
 ;;^UTILITY(U,$J,.84,8115,2,0)
 ;;=^^1^1^2990710^^^
 ;;^UTILITY(U,$J,.84,8115,2,1,0)
 ;;=ARE YOU SURE YOU WANT TO DELETE THE ENTIRE TEXT
 ;;^UTILITY(U,$J,.84,8115,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8115,5,1,0)
 ;;=DIWE3^D+4
 ;;^UTILITY(U,$J,.84,8116,0)
 ;;=8116^2^y^2
 ;;^UTILITY(U,$J,.84,8116,2,0)
 ;;=1
 ;;^UTILITY(U,$J,.84,8116,2,1,0)
 ;;=OK TO REMOVE |1| LINE(S)
 ;;^UTILITY(U,$J,.84,8116,3,0)
 ;;=^.845^1^1

DINIT904
DINIT904 ;GFT
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8116,3,1,0)
 ;;=1^NUMBER OF LINES IN W-P TEXT THAT THE USER IS ABOUT TO DELETE
 ;;^UTILITY(U,$J,.84,8116,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8116,5,1,0)
 ;;=DIWE3^D+4
 ;;^UTILITY(U,$J,.84,8117,0)
 ;;=8117^2^^2
 ;;^UTILITY(U,$J,.84,8117,2,0)
 ;;=1^^1^1^2991008^^
 ;;^UTILITY(U,$J,.84,8117,2,1,0)
 ;;=thru: 
 ;;^UTILITY(U,$J,.84,8117,5,0)
 ;;=^.841^3^3
 ;;^UTILITY(U,$J,.84,8117,5,1,0)
 ;;=DIWE3^D+1
 ;;^UTILITY(U,$J,.84,8117,5,2,0)
 ;;=DIWE1^LIST
 ;;^UTILITY(U,$J,.84,8117,5,3,0)
 ;;=DIWE4^PRINT
 ;;^UTILITY(U,$J,.84,8118,0)
 ;;=8118^2^^2
 ;;^UTILITY(U,$J,.84,8118,2,0)
 ;;=1^^1^1^2991022^
 ;;^UTILITY(U,$J,.84,8118,2,1,0)
 ;;=From line: 
 ;;^UTILITY(U,$J,.84,8118,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8118,5,1,0)
 ;;=DIWE3^F
 ;;^UTILITY(U,$J,.84,8119,0)
 ;;=8119^2^^2
 ;;^UTILITY(U,$J,.84,8119,1,0)
 ;;=^^1^1^2991024^^^
 ;;^UTILITY(U,$J,.84,8119,1,1,0)
 ;;=After line
 ;;^UTILITY(U,$J,.84,8119,2,0)
 ;;=^^1^1^2991024^^
 ;;^UTILITY(U,$J,.84,8119,2,1,0)
 ;;=after line: 
 ;;^UTILITY(U,$J,.84,8119,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8119,5,1,0)
 ;;=DIWE3^MOVE+3
 ;;^UTILITY(U,$J,.84,8120,0)
 ;;=8120^2^^2
 ;;^UTILITY(U,$J,.84,8120,2,0)
 ;;=^^1^1^2990711^
 ;;^UTILITY(U,$J,.84,8120,2,1,0)
 ;;=after character(s):
 ;;^UTILITY(U,$J,.84,8120,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8120,5,1,0)
 ;;=DIWE4^BA
 ;;^UTILITY(U,$J,.84,8121,0)
 ;;=8121^2^^2
 ;;^UTILITY(U,$J,.84,8121,2,0)
 ;;=^^1^1^2991011^^
 ;;^UTILITY(U,$J,.84,8121,2,1,0)
 ;;=<NO CHANGE>
 ;;^UTILITY(U,$J,.84,8121,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8121,5,1,0)
 ;;=DIWE3
 ;;^UTILITY(U,$J,.84,8122,0)
 ;;=8122^2^^2
 ;;^UTILITY(U,$J,.84,8122,2,0)
 ;;=1
 ;;^UTILITY(U,$J,.84,8122,2,1,0)
 ;;=  to: 
 ;;^UTILITY(U,$J,.84,8122,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8122,5,1,0)
 ;;=DIWE2^C+1
 ;;^UTILITY(U,$J,.84,8123,0)
 ;;=8123^2^y^2
 ;;^UTILITY(U,$J,.84,8123,2,0)
 ;;=^^1^1^2991024^^^
 ;;^UTILITY(U,$J,.84,8123,2,1,0)
 ;;=|1| line(s) inserted..
 ;;^UTILITY(U,$J,.84,8123,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8123,3,1,0)
 ;;=1^NUMBER OF LINES INSERTED
 ;;^UTILITY(U,$J,.84,8123,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8123,5,1,0)
 ;;=DIWE2^I+2
 ;;^UTILITY(U,$J,.84,8124,0)
 ;;=8124^2^^2
 ;;^UTILITY(U,$J,.84,8124,1,0)
 ;;=^^4^4^2991022^
 ;;^UTILITY(U,$J,.84,8124,1,1,0)
 ;;=ABDBD
 ;;^UTILITY(U,$J,.84,8124,1,2,0)
 ;;=ASJASJ
 ;;^UTILITY(U,$J,.84,8124,1,3,0)
 ;;=SAS
 ;;^UTILITY(U,$J,.84,8124,1,4,0)
 ;;=AS
 ;;^UTILITY(U,$J,.84,8124,2,0)
 ;;=^^1^1^2991022^^
 ;;^UTILITY(U,$J,.84,8124,2,1,0)
 ;;=OK to change? 
 ;;^UTILITY(U,$J,.84,8124,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8124,5,1,0)
 ;;=DIWE2^C1
 ;;^UTILITY(U,$J,.84,8125,0)
 ;;=8125^2^^2
 ;;^UTILITY(U,$J,.84,8125,2,0)
 ;;=^^1^1^2991022^
 ;;^UTILITY(U,$J,.84,8125,2,1,0)
 ;;=Ask 'OK' for each line found
 ;;^UTILITY(U,$J,.84,8125,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8125,5,1,0)
 ;;=DIWE2^C+2
 ;;^UTILITY(U,$J,.84,8129,0)
 ;;=8129^2^^2
 ;;^UTILITY(U,$J,.84,8129,2,0)
 ;;=^^1^1^2991022^
 ;;^UTILITY(U,$J,.84,8129,2,1,0)
 ;;=CONTROL CHARACTERS REMOVED!!
 ;;^UTILITY(U,$J,.84,8129,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8129,5,1,0)
 ;;=DIWE2^TAB+1
 ;;^UTILITY(U,$J,.84,8130,0)
 ;;=8130^2^^2
 ;;^UTILITY(U,$J,.84,8130,2,0)
 ;;=^^5^5^2991011^
 ;;^UTILITY(U,$J,.84,8130,2,1,0)
 ;;=WARNING!
 ;;^UTILITY(U,$J,.84,8130,2,2,0)
 ;;=The Field you are transferring text from displays text without wrapping.
 ;;^UTILITY(U,$J,.84,8130,2,3,0)
 ;;=The field you are transferring text into may display text differently.
 ;;^UTILITY(U,$J,.84,8130,2,4,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8130,2,5,0)
 ;;=Do you want to continue?
 ;;^UTILITY(U,$J,.84,8131,0)
 ;;=8131^2^^2
 ;;^UTILITY(U,$J,.84,8131,2,0)
 ;;=^^1^1^2991026^
 ;;^UTILITY(U,$J,.84,8131,2,1,0)
 ;;=From what text: 
 ;;^UTILITY(U,$J,.84,8131,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8131,5,1,0)
 ;;=DIWE3
 ;;^UTILITY(U,$J,.84,8132,0)
 ;;=8132^3^^2^
 ;;^UTILITY(U,$J,.84,8132,1,0)
 ;;=^^1^1^2991026^^
 ;;^UTILITY(U,$J,.84,8132,1,1,0)
 ;;=^S
 ;;^UTILITY(U,$J,.84,8132,2,0)
 ;;=^^1^1^2991026^^^
 ;;^UTILITY(U,$J,.84,8132,2,1,0)
 ;;=Enter the message NUMBER or SUBJECT of another MailMan message, OR
 ;;^UTILITY(U,$J,.84,8132,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8132,5,1,0)
 ;;=DIWE3^Z0+4
 ;;^UTILITY(U,$J,.84,8133,0)
 ;;=8133^3^^2
 ;;^UTILITY(U,$J,.84,8133,2,0)
 ;;=^^1^1^2991026^^
 ;;^UTILITY(U,$J,.84,8133,2,1,0)
 ;;=     Select another entry in this file, or
 ;;^UTILITY(U,$J,.84,8133,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8133,5,1,0)
 ;;=DIWE3
 ;;^UTILITY(U,$J,.84,8134,0)
 ;;=8134^3^^2
 ;;^UTILITY(U,$J,.84,8134,2,0)
 ;;=^^3^3^2991026^^^^
 ;;^UTILITY(U,$J,.84,8134,2,1,0)
 ;;=     Use relational syntax to pick up information from a Word-Processing
 ;;^UTILITY(U,$J,.84,8134,2,2,0)
 ;;=     field in another file.
 ;;^UTILITY(U,$J,.84,8134,2,3,0)
 ;;=     Example: "VALUE":FILE:WORD-PROCESSING FIELD NUMBER
 ;;^UTILITY(U,$J,.84,8134,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8134,5,1,0)
 ;;=DIWE3
 ;;^UTILITY(U,$J,.84,8135,0)
 ;;=8135^2^^2
 ;;^UTILITY(U,$J,.84,8135,2,0)
 ;;=^^1^1^2991026^
 ;;^UTILITY(U,$J,.84,8135,2,1,0)
 ;;=The TEXT TRANSFER has been CANCELLED.
 ;;^UTILITY(U,$J,.84,8135,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8135,5,1,0)
 ;;=DIWE3
 ;;^UTILITY(U,$J,.84,8145,0)
 ;;=8145^1^^2
 ;;^UTILITY(U,$J,.84,8145,2,0)
 ;;=^^2^2^2990710^
 ;;^UTILITY(U,$J,.84,8145,2,1,0)
 ;;=You have asked to sort on the same field twice!
 ;;^UTILITY(U,$J,.84,8145,2,2,0)
 ;;=Please re-enter your SORT criteria.
 ;;^UTILITY(U,$J,.84,8145,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8145,5,1,0)
 ;;=DIQQQ^DIP1
 ;;^UTILITY(U,$J,.84,8146,0)
 ;;=8146^2^y^2
 ;;^UTILITY(U,$J,.84,8146,2,0)
 ;;=^^1^1^2991013^
 ;;^UTILITY(U,$J,.84,8146,2,1,0)
 ;;=uses internal code '|1|'
 ;;^UTILITY(U,$J,.84,8146,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8146,3,1,0)
 ;;=1^INTERNAL VALUE OF A SET-TYPE FIELD
 ;;^UTILITY(U,$J,.84,8146,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8146,5,1,0)
 ;;=DIP12^CK+8
 ;;^UTILITY(U,$J,.84,8147,0)
 ;;=8147^1^^2
 ;;^UTILITY(U,$J,.84,8147,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,8147,2,1,0)
 ;;=Captions cannot contain ':' or ';', or begin with a digit or a period.
 ;;^UTILITY(U,$J,.84,8147,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8147,5,1,0)
 ;;=DIQQQ^DIA3
 ;;^UTILITY(U,$J,.84,8148,0)
 ;;=8148^2^^2
 ;;^UTILITY(U,$J,.84,8148,1,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,8148,1,1,0)
 ;;=THERE ARE NO LINES
 ;;^UTILITY(U,$J,.84,8148,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,8148,2,1,0)
 ;;=THERE ARE NO LINES!
 ;;^UTILITY(U,$J,.84,8148,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8148,5,1,0)
 ;;=DIWE1^LN+1
 ;;^UTILITY(U,$J,.84,8149,0)
 ;;=8149^2^^2
 ;;^UTILITY(U,$J,.84,8149,1,0)
 ;;=^^1^1^2991027^^^
 ;;^UTILITY(U,$J,.84,8149,1,1,0)
 ;;=EDIT option
 ;;^UTILITY(U,$J,.84,8149,2,0)
 ;;=^^1^1^2991004^^^^
 ;;^UTILITY(U,$J,.84,8149,2,1,0)
 ;;=EDIT Option
 ;;^UTILITY(U,$J,.84,8149,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8149,5,1,0)
 ;;=DIWE1^1
 ;;^UTILITY(U,$J,.84,8150,0)
 ;;=8150^2^^2
 ;;^UTILITY(U,$J,.84,8150,2,0)
 ;;=^^1^1^2990711^^
 ;;^UTILITY(U,$J,.84,8150,2,1,0)
 ;;=Answer with a line number
 ;;^UTILITY(U,$J,.84,8150,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8150,5,1,0)
 ;;=DIWE5^LNQ+1
 ;;^UTILITY(U,$J,.84,8151,0)
 ;;=8151^2^y^2
 ;;^UTILITY(U,$J,.84,8151,2,0)
 ;;=^^1^1^2990711^^
 ;;^UTILITY(U,$J,.84,8151,2,1,0)
 ;;=   or a space to mean the current line (|1|)
 ;;^UTILITY(U,$J,.84,8151,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8151,3,1,0)
 ;;=1^CURRENT LINE NUMBER
 ;;^UTILITY(U,$J,.84,8151,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8151,5,1,0)
 ;;=DIWE5^LNQ+2
 ;;^UTILITY(U,$J,.84,8152,0)
 ;;=8152^2^y^2
 ;;^UTILITY(U,$J,.84,8152,2,0)
 ;;=^^1^1^2990711^^
 ;;^UTILITY(U,$J,.84,8152,2,1,0)
 ;;=   or '-' to mean line |1|
 ;;^UTILITY(U,$J,.84,8152,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8152,3,1,0)
 ;;=1^PREVIOUS LINE NUMBER
 ;;^UTILITY(U,$J,.84,8152,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8152,5,1,0)
 ;;=DIWE5^LNQ+2
 ;;^UTILITY(U,$J,.84,8153,0)
 ;;=8153^2^y^2

DINIT905
DINIT905 ;GFT;06:24 PM  21 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8153,2,0)
 ;;=^^1^1^2990711^^^^
 ;;^UTILITY(U,$J,.84,8153,2,1,0)
 ;;=  '+' to mean |1|, etc.
 ;;^UTILITY(U,$J,.84,8153,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8153,3,1,0)
 ;;=1^NEXT LINE NUMBER
 ;;^UTILITY(U,$J,.84,8153,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8153,5,1,0)
 ;;=DIWE5^LNQ+2
 ;;^UTILITY(U,$J,.84,8155,0)
 ;;=8155^2^^2
 ;;^UTILITY(U,$J,.84,8155,2,0)
 ;;=^^8^8^2991008^^
 ;;^UTILITY(U,$J,.84,8155,2,1,0)
 ;;=You have 30 seconds to start sending text.
 ;;^UTILITY(U,$J,.84,8155,2,2,0)
 ;;=An End-of-File is assumed on 30-second timeout.
 ;;^UTILITY(U,$J,.84,8155,2,3,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8155,2,4,0)
 ;;=TABs are converted to 1 thru 9 spaces to start the next character
 ;;^UTILITY(U,$J,.84,8155,2,5,0)
 ;;=at a column evenly divisible by 9, plus 1.  (10,19,28,37,...)
 ;;^UTILITY(U,$J,.84,8155,2,6,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,8155,2,7,0)
 ;;=End-of-line = Carriage Return/$C(13)  or Escape/$C(27).
 ;;^UTILITY(U,$J,.84,8155,2,8,0)
 ;;=All other control characters will be stripped from the text.
 ;;^UTILITY(U,$J,.84,8155,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8155,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,8156,0)
 ;;=8156^2^^2
 ;;^UTILITY(U,$J,.84,8156,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8156,2,1,0)
 ;;=Maximum STRING LENGTH
 ;;^UTILITY(U,$J,.84,8156,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8156,5,1,0)
 ;;=DIWE5
 ;;^UTILITY(U,$J,.84,8157,0)
 ;;=8157^2^^2
 ;;^UTILITY(U,$J,.84,8157,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8157,2,1,0)
 ;;=FILE TRANSFER COMPLETED.
 ;;^UTILITY(U,$J,.84,8157,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8157,5,1,0)
 ;;=DIWE5
 ;;^UTILITY(U,$J,.84,8160,0)
 ;;=8160^2^^2
 ;;^UTILITY(U,$J,.84,8160,2,0)
 ;;=^^1^1^2991027^^
 ;;^UTILITY(U,$J,.84,8160,2,1,0)
 ;;=REQUESTED TIME TO PRINT
 ;;^UTILITY(U,$J,.84,8160,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8160,5,1,0)
 ;;=DIP4^W
 ;;^UTILITY(U,$J,.84,8160,5,2,0)
 ;;=DIWE4^QUE+1
 ;;^UTILITY(U,$J,.84,8161,0)
 ;;=8161^2^y^2
 ;;^UTILITY(U,$J,.84,8161,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8161,2,1,0)
 ;;=REQUEST QUEUED...  Task |1|.
 ;;^UTILITY(U,$J,.84,8161,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8161,3,1,0)
 ;;=1^TASK NUMBER
 ;;^UTILITY(U,$J,.84,8161,5,0)
 ;;=^.841^2^2
 ;;^UTILITY(U,$J,.84,8161,5,1,0)
 ;;=DIP4^ZTM+2
 ;;^UTILITY(U,$J,.84,8161,5,2,0)
 ;;=DIWE4^QUE+4
 ;;^UTILITY(U,$J,.84,8162,0)
 ;;=8162^2^^2
 ;;^UTILITY(U,$J,.84,8162,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8162,2,1,0)
 ;;=Do you want Line Numbers
 ;;^UTILITY(U,$J,.84,8162,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8162,5,1,0)
 ;;=DIWE4^LINNUMS
 ;;^UTILITY(U,$J,.84,8163,0)
 ;;=8163^2^^2
 ;;^UTILITY(U,$J,.84,8163,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8163,2,1,0)
 ;;=Rough Draft
 ;;^UTILITY(U,$J,.84,8163,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8163,5,1,0)
 ;;=DIWE4^RD
 ;;^UTILITY(U,$J,.84,8164,0)
 ;;=8164^3^^2
 ;;^UTILITY(U,$J,.84,8164,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8164,2,1,0)
 ;;=A rough draft is printed line-for-line, showing windows.
 ;;^UTILITY(U,$J,.84,8164,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8164,5,1,0)
 ;;=DIWE4^RD
 ;;^UTILITY(U,$J,.84,8165,0)
 ;;=8165^2^^2
 ;;^UTILITY(U,$J,.84,8165,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8165,2,1,0)
 ;;=Line Editor Print
 ;;^UTILITY(U,$J,.84,8165,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8165,5,1,0)
 ;;=DIWE4^HD
 ;;^UTILITY(U,$J,.84,8170,0)
 ;;=8170^2^^2
 ;;^UTILITY(U,$J,.84,8170,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8170,2,1,0)
 ;;=Select ALTERNATE EDITOR: 
 ;;^UTILITY(U,$J,.84,8170,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8170,5,1,0)
 ;;=DIWE12^ASK
 ;;^UTILITY(U,$J,.84,8171,0)
 ;;=8171^3^^2
 ;;^UTILITY(U,$J,.84,8171,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8171,2,1,0)
 ;;=Choose an Alternate Editor
 ;;^UTILITY(U,$J,.84,8171,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8171,5,1,0)
 ;;=DIWE12^ASK+5
 ;;^UTILITY(U,$J,.84,8172,0)
 ;;=8172^3^^2
 ;;^UTILITY(U,$J,.84,8172,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8172,2,1,0)
 ;;=  from the following:
 ;;^UTILITY(U,$J,.84,8172,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8172,5,1,0)
 ;;=DIWE12^ASK+6
 ;;^UTILITY(U,$J,.84,8175,0)
 ;;=8175^2^^2
 ;;^UTILITY(U,$J,.84,8175,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8175,2,1,0)
 ;;=Edit
 ;;^UTILITY(U,$J,.84,8175,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8175,5,1,0)
 ;;=DIWE12^E
 ;;^UTILITY(U,$J,.84,8176,0)
 ;;=8176^3^^2
 ;;^UTILITY(U,$J,.84,8176,2,0)
 ;;=^^2^2^2991027^
 ;;^UTILITY(U,$J,.84,8176,2,1,0)
 ;;=    Enter 'YES' if you wish to go into the editor.
 ;;^UTILITY(U,$J,.84,8176,2,2,0)
 ;;=    Enter 'NO' if you do not wish to edit at this time.
 ;;^UTILITY(U,$J,.84,8176,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8176,5,1,0)
 ;;=DIWE12^E
 ;;^UTILITY(U,$J,.84,8179,0)
 ;;=8179^3^^2
 ;;^UTILITY(U,$J,.84,8179,2,0)
 ;;=^^1^1^2991121^
 ;;^UTILITY(U,$J,.84,8179,2,1,0)
 ;;=PRESS <Enter> to edit the WORD-PROCESSING field
 ;;^UTILITY(U,$J,.84,8179,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8179,5,1,0)
 ;;=DDSWP^EGP
 ;;^UTILITY(U,$J,.84,8180,0)
 ;;=8180^2^^2
 ;;^UTILITY(U,$J,.84,8180,2,0)
 ;;=^^1^1^2991027^^^
 ;;^UTILITY(U,$J,.84,8180,2,1,0)
 ;;=NUMBER OF COPIES: 
 ;;^UTILITY(U,$J,.84,8180,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8180,5,1,0)
 ;;=DIP3^SDP+1
 ;;^UTILITY(U,$J,.84,8181,0)
 ;;=8181^2^^2
 ;;^UTILITY(U,$J,.84,8181,2,0)
 ;;=^^1^1^2991027^^
 ;;^UTILITY(U,$J,.84,8181,2,1,0)
 ;;=OUTPUT COPIES TO WHAT DEVICE: 
 ;;^UTILITY(U,$J,.84,8181,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8181,5,1,0)
 ;;=DIP3^O
 ;;^UTILITY(U,$J,.84,8190,0)
 ;;=8190^2^y^2
 ;;^UTILITY(U,$J,.84,8190,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8190,2,1,0)
 ;;=MARGIN WIDTH IS NORMALLY AT LEAST |1|...    ARE YOU SURE
 ;;^UTILITY(U,$J,.84,8190,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8190,3,1,0)
 ;;=1^MARGIN WIDTH KNOWN BY THE PRINT TEMPLATE
 ;;^UTILITY(U,$J,.84,8190,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8190,5,1,0)
 ;;=DIP3^FREE+1
 ;;^UTILITY(U,$J,.84,8191,0)
 ;;=8191^2^^2
 ;;^UTILITY(U,$J,.84,8191,2,0)
 ;;=^^1^1^2991027^^
 ;;^UTILITY(U,$J,.84,8191,2,1,0)
 ;;=Do you want to free up this Terminal
 ;;^UTILITY(U,$J,.84,8191,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8191,5,1,0)
 ;;=DIP3^FREE+2
 ;;^UTILITY(U,$J,.84,8192,0)
 ;;=8192^2^^2
 ;;^UTILITY(U,$J,.84,8192,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,8192,2,1,0)
 ;;=THIS TERMINAL IS NOW FREE!
 ;;^UTILITY(U,$J,.84,8192,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8192,5,1,0)
 ;;=DIP3^FREE+3
 ;;^UTILITY(U,$J,.84,8195,0)
 ;;=8195^2^^2
 ;;^UTILITY(U,$J,.84,8195,1,0)
 ;;=^^1^1^2990902^
 ;;^UTILITY(U,$J,.84,8195,1,1,0)
 ;;=one line only!
 ;;^UTILITY(U,$J,.84,8195,2,0)
 ;;=^^1^1^2990902^^
 ;;^UTILITY(U,$J,.84,8195,2,1,0)
 ;;=Do you always want to suppress subheaders when printing template
 ;;^UTILITY(U,$J,.84,8195,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8195,5,1,0)
 ;;=DIP21^SUB
 ;;^UTILITY(U,$J,.84,8196,0)
 ;;=8196^2^y^2
 ;;^UTILITY(U,$J,.84,8196,2,0)
 ;;=^^1^1^2990903^
 ;;^UTILITY(U,$J,.84,8196,2,1,0)
 ;;=Do you want to edit the '|1|' Template
 ;;^UTILITY(U,$J,.84,8196,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8196,3,1,0)
 ;;=1^NAME OF TEMPLATE
 ;;^UTILITY(U,$J,.84,8196,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8196,5,1,0)
 ;;=DIP21^EDIT
 ;;^UTILITY(U,$J,.84,8197,0)
 ;;=8197^2^^2
 ;;^UTILITY(U,$J,.84,8197,2,0)
 ;;=^^1^1^2990828^
 ;;^UTILITY(U,$J,.84,8197,2,1,0)
 ;;=Display Audit Trail
 ;;^UTILITY(U,$J,.84,8197,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8197,5,1,0)
 ;;=DII
 ;;^UTILITY(U,$J,.84,8197.1,0)
 ;;=8197.1^2^y^2
 ;;^UTILITY(U,$J,.84,8197.1,2,0)
 ;;=^^1^1^2991218^^
 ;;^UTILITY(U,$J,.84,8197.1,2,1,0)
 ;;=Deleted "|1|"
 ;;^UTILITY(U,$J,.84,8197.1,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8197.1,3,1,0)
 ;;=1^The deleted value of the field being displayed in CAPTIONED OUTPUT, according to the audit trail
 ;;^UTILITY(U,$J,.84,8197.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8197.1,5,1,0)
 ;;=DIQ^PRINTAUD+5
 ;;^UTILITY(U,$J,.84,8197.2,0)
 ;;=8197.2^2^y^2
 ;;^UTILITY(U,$J,.84,8197.2,2,0)
 ;;=^^1^1^2991218^

DINIT906
DINIT906 ;GFT;6JUNE2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,8197.2,2,1,0)
 ;;=Changed from "|1|"
 ;;^UTILITY(U,$J,.84,8197.2,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8197.2,3,1,0)
 ;;=1^The former audit-trail value of the field being displayed in CAPTIONED OUTPUT
 ;;^UTILITY(U,$J,.84,8197.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8197.2,5,1,0)
 ;;=DIQ^PRINTAUD+6
 ;;^UTILITY(U,$J,.84,8197.3,0)
 ;;=8197.3^2^^2
 ;;^UTILITY(U,$J,.84,8197.3,2,0)
 ;;=^^1^1^2991218^
 ;;^UTILITY(U,$J,.84,8197.3,2,1,0)
 ;;=Created
 ;;^UTILITY(U,$J,.84,8197.3,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8197.3,5,1,0)
 ;;=DIQ^PRINTAUD+6
 ;;^UTILITY(U,$J,.84,8197.4,0)
 ;;=8197.4^2^y^2
 ;;^UTILITY(U,$J,.84,8197.4,2,0)
 ;;=^^1^1^2991218^
 ;;^UTILITY(U,$J,.84,8197.4,2,1,0)
 ;;=|1| on |2| by User #|3|
 ;;^UTILITY(U,$J,.84,8197.4,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,8197.4,3,1,0)
 ;;=1^What happened
 ;;^UTILITY(U,$J,.84,8197.4,3,2,0)
 ;;=2^DATE/TIME
 ;;^UTILITY(U,$J,.84,8197.4,3,3,0)
 ;;=3^USER NUMBER
 ;;^UTILITY(U,$J,.84,8197.4,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8197.4,5,1,0)
 ;;=DIQ^PRINTAUD+6
 ;;^UTILITY(U,$J,.84,8197.5,0)
 ;;=8197.5^2^^2
 ;;^UTILITY(U,$J,.84,8197.5,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,8197.5,2,1,0)
 ;;=Accessed
 ;;^UTILITY(U,$J,.84,8197.5,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8197.5,5,1,0)
 ;;=DIQ^PRINTAUD+7
 ;;^UTILITY(U,$J,.84,8198,0)
 ;;=8198^2^^2
 ;;^UTILITY(U,$J,.84,8198,2,0)
 ;;=^^1^1^2990828^^
 ;;^UTILITY(U,$J,.84,8198,2,1,0)
 ;;=Standard Captioned Output
 ;;^UTILITY(U,$J,.84,8198,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8198,5,1,0)
 ;;=DII^R
 ;;^UTILITY(U,$J,.84,8199,0)
 ;;=8199^2^^2
 ;;^UTILITY(U,$J,.84,8199,1,0)
 ;;=^^1^1^2990824^
 ;;^UTILITY(U,$J,.84,8199,1,1,0)
 ;;=ANOTHER ONE: in inquiry
 ;;^UTILITY(U,$J,.84,8199,2,0)
 ;;=^^1^1^2990824^
 ;;^UTILITY(U,$J,.84,8199,2,1,0)
 ;;=Another one:
 ;;^UTILITY(U,$J,.84,8201,0)
 ;;=8201^2^y^2
 ;;^UTILITY(U,$J,.84,8201,2,0)
 ;;=^^1^1^2990831^^^
 ;;^UTILITY(U,$J,.84,8201,2,1,0)
 ;;=By '|1|', do you mean |2| '|3|'
 ;;^UTILITY(U,$J,.84,8201,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,8201,3,1,0)
 ;;=1^What user input as a COMPUTED EXPRESSION element
 ;;^UTILITY(U,$J,.84,8201,3,2,0)
 ;;=2^File
 ;;^UTILITY(U,$J,.84,8201,3,3,0)
 ;;=3^Field
 ;;^UTILITY(U,$J,.84,8201,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8201,5,1,0)
 ;;=DICOMP0^A+1
 ;;^UTILITY(U,$J,.84,8202,0)
 ;;=8202^2^y^2
 ;;^UTILITY(U,$J,.84,8202,2,0)
 ;;=^^1^1^2990831^^^^
 ;;^UTILITY(U,$J,.84,8202,2,1,0)
 ;;=By '|1|', do you mean the |2| File, pointing via its '|3|' field
 ;;^UTILITY(U,$J,.84,8202,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,8202,3,1,0)
 ;;=1^What user entered as BACKWARDS POINTER
 ;;^UTILITY(U,$J,.84,8202,3,2,0)
 ;;=2^File name
 ;;^UTILITY(U,$J,.84,8202,3,3,0)
 ;;=3^Name of POINTER field
 ;;^UTILITY(U,$J,.84,8202,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8202,5,1,0)
 ;;=DICOMPV
 ;;^UTILITY(U,$J,.84,8203,0)
 ;;=8203^2^y^2
 ;;^UTILITY(U,$J,.84,8203,2,0)
 ;;=^^1^1^2990831^^
 ;;^UTILITY(U,$J,.84,8203,2,1,0)
 ;;=Will terminal user be allowed to select proper entry in |1| File
 ;;^UTILITY(U,$J,.84,8203,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8203,3,1,0)
 ;;=1^Name of File that computed expression is navigating to.
 ;;^UTILITY(U,$J,.84,8203,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8203,5,1,0)
 ;;=DICOMPW^ASKE+1
 ;;^UTILITY(U,$J,.84,8204,0)
 ;;=8204^2^y^2
 ;;^UTILITY(U,$J,.84,8204,2,0)
 ;;=^^1^1^2990831^
 ;;^UTILITY(U,$J,.84,8204,2,1,0)
 ;;=Do you want to permit adding a new '|1|' entry
 ;;^UTILITY(U,$J,.84,8204,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8204,3,1,0)
 ;;=1^Name of File
 ;;^UTILITY(U,$J,.84,8204,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8204,5,1,0)
 ;;=DICOMPW^ASK1
 ;;^UTILITY(U,$J,.84,8205,0)
 ;;=8205^2^^2
 ;;^UTILITY(U,$J,.84,8205,2,0)
 ;;=^^1^1^2990831^
 ;;^UTILITY(U,$J,.84,8205,2,1,0)
 ;;=Well then, do you want to FORCE adding a new entry every time
 ;;^UTILITY(U,$J,.84,8205,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8205,5,1,0)
 ;;=DICOMPW^ASK2
 ;;^UTILITY(U,$J,.84,8206,0)
 ;;=8206^2^y^2
 ;;^UTILITY(U,$J,.84,8206,2,0)
 ;;=^^1^1^2990831^
 ;;^UTILITY(U,$J,.84,8206,2,1,0)
 ;;=Do you want an 'ADDING A NEW |1|' message
 ;;^UTILITY(U,$J,.84,8206,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8206,3,1,0)
 ;;=1^Name of File
 ;;^UTILITY(U,$J,.84,8206,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8206,5,1,0)
 ;;=DICOMPW^ASK3
 ;;^UTILITY(U,$J,.84,8300,0)
 ;;=8300^2^y^2
 ;;^UTILITY(U,$J,.84,8300,2,0)
 ;;=^^1^1^2991011^^
 ;;^UTILITY(U,$J,.84,8300,2,1,0)
 ;;=  (|1| entries)
 ;;^UTILITY(U,$J,.84,8300,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8300,3,1,0)
 ;;=1^NUMBER OF ENTRIES
 ;;^UTILITY(U,$J,.84,8300,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8300,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,8301,0)
 ;;=8301^2^^2
 ;;^UTILITY(U,$J,.84,8301,2,0)
 ;;=^^1^1^2991011^^
 ;;^UTILITY(U,$J,.84,8301,2,1,0)
 ;;=  (1 entry)
 ;;^UTILITY(U,$J,.84,8301,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8301,5,1,0)
 ;;=DICRW
 ;;^UTILITY(U,$J,.84,9070,0)
 ;;=9070^3^^2
 ;;^UTILITY(U,$J,.84,9070,1,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9070,1,1,0)
 ;;=Type '-' in front of numeric-valued field name to sort from high to low.
 ;;^UTILITY(U,$J,.84,9070,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9070,2,1,0)
 ;;=Type '-' in front of numeric-valued field name to sort from high to low.
 ;;^UTILITY(U,$J,.84,9070,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9070,5,1,0)
 ;;=DIQQ^DIP+1
 ;;^UTILITY(U,$J,.84,9071,0)
 ;;=9071^3^^2
 ;;^UTILITY(U,$J,.84,9071,2,0)
 ;;=^^4^4^2991026^^^^
 ;;^UTILITY(U,$J,.84,9071,2,1,0)
 ;;=Type '+' in front of field name to get SUBTOTALS by that field's values.
 ;;^UTILITY(U,$J,.84,9071,2,2,0)
 ;;=     '#' to PAGE-FEED on each field value,  '!' to get RANKING NUMBER
 ;;^UTILITY(U,$J,.84,9071,2,3,0)
 ;;=     '@' to SUPPRESS SUB-HEADER,            ']' to force SAVING TEMPLATE
 ;;^UTILITY(U,$J,.84,9071,2,4,0)
 ;;=Type ';TXT' after free-text fields to SORT NUMBERS AS TEXT
 ;;^UTILITY(U,$J,.84,9071,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9071,5,1,0)
 ;;=DIQQ^DIP
 ;;^UTILITY(U,$J,.84,9072,0)
 ;;=9072^3^^2
 ;;^UTILITY(U,$J,.84,9072,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9072,2,1,0)
 ;;=Type [TEMPLATE NAME] in brackets to SORT BY PREVIOUS SEARCH RESULTS
 ;;^UTILITY(U,$J,.84,9072,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9072,5,1,0)
 ;;=DIQQ^DIP+7
 ;;^UTILITY(U,$J,.84,9073,0)
 ;;=9073^3^^2
 ;;^UTILITY(U,$J,.84,9073,2,0)
 ;;=^^1^1^2990720^
 ;;^UTILITY(U,$J,.84,9073,2,1,0)
 ;;=Type 'BY(0)' to define record selection and sort order
 ;;^UTILITY(U,$J,.84,9075,0)
 ;;=9075^3^^2
 ;;^UTILITY(U,$J,.84,9075,2,0)
 ;;=^^2^2^2990710^^
 ;;^UTILITY(U,$J,.84,9075,2,1,0)
 ;;=You can NEGATE any of these conditions by preceding them with "'" or "-".
 ;;^UTILITY(U,$J,.84,9075,2,2,0)
 ;;=Thus,  "'NULL"  means  "NOT NULL".
 ;;^UTILITY(U,$J,.84,9075,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9075,5,1,0)
 ;;=DIQQQ^DISC
 ;;^UTILITY(U,$J,.84,9076,0)
 ;;=9076^3^^2
 ;;^UTILITY(U,$J,.84,9076,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9076,2,1,0)
 ;;=Enter "ALL" to print every field.
 ;;^UTILITY(U,$J,.84,9076,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9076,5,1,0)
 ;;=DIQQ^DIP2+6
 ;;^UTILITY(U,$J,.84,9077,0)
 ;;=9077^3^^2
 ;;^UTILITY(U,$J,.84,9077,2,0)
 ;;=^^4^4^2990711^^
 ;;^UTILITY(U,$J,.84,9077,2,1,0)
 ;;=Type '&' in front of field name to get TOTAL for that field.
 ;;^UTILITY(U,$J,.84,9077,2,2,0)
 ;;=     '!' to get COUNT.   '+' to get TOTAL & COUNT.    '#' to get MAX & MIN.
 ;;^UTILITY(U,$J,.84,9077,2,3,0)
 ;;=     ']' to force SAVING PRINT TEMPLATE
 ;;^UTILITY(U,$J,.84,9077,2,4,0)
 ;;=You can follow field name with ';' and FORMAT SPECIFICATION.
 ;;^UTILITY(U,$J,.84,9077,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9077,5,1,0)
 ;;=DIQQ^DIP2
 ;;^UTILITY(U,$J,.84,9078,0)
 ;;=9078^3^^2
 ;;^UTILITY(U,$J,.84,9078,2,0)
 ;;=^^1^1^2990710^^
 ;;^UTILITY(U,$J,.84,9078,2,1,0)
 ;;=Type '[TEMPLATE NAME]' in brackets to use an existing PRINT TEMPLATE.
 ;;^UTILITY(U,$J,.84,9078,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9078,5,1,0)
 ;;=DIQQ^DIP2
 ;;^UTILITY(U,$J,.84,9079,0)
 ;;=9079^3^y^2
 ;;^UTILITY(U,$J,.84,9079,2,0)
 ;;=^^3^3^2990710^
 ;;^UTILITY(U,$J,.84,9079,2,1,0)
 ;;=Enter a value which '|1|'
 ;;^UTILITY(U,$J,.84,9079,2,2,0)
 ;;=must |2|, in order for truth condition

DINIT907
DINIT907 ;GFT
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9079,2,3,0)
 ;;=-|3|- to be evaluated as "true".
 ;;^UTILITY(U,$J,.84,9079,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9079,3,1,0)
 ;;=1^TRUTH CONDITION IN WORDS
 ;;^UTILITY(U,$J,.84,9079,3,2,0)
 ;;=2^OPERATOR
 ;;^UTILITY(U,$J,.84,9079,3,3,0)
 ;;=3^TRUTH CONDITION LETTER
 ;;^UTILITY(U,$J,.84,9079,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9079,5,1,0)
 ;;=DIQQQ^DIS
 ;;^UTILITY(U,$J,.84,9080,0)
 ;;=9080^3^^2
 ;;^UTILITY(U,$J,.84,9080,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9080,2,1,0)
 ;;=Use EXTERNAL VALUE (from the list on the RIGHT)
 ;;^UTILITY(U,$J,.84,9080,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9080,5,1,0)
 ;;=DIQQQ^DIS
 ;;^UTILITY(U,$J,.84,9081,0)
 ;;=9081^3^y^2
 ;;^UTILITY(U,$J,.84,9081,2,0)
 ;;=^^4^4^2991015^^^^
 ;;^UTILITY(U,$J,.84,9081,2,1,0)
 ;;=To |1| in sequence, starting from a certain |2|,
 ;;^UTILITY(U,$J,.84,9081,2,2,0)
 ;;=type that |2|.  
 ;;^UTILITY(U,$J,.84,9081,2,3,0)
 ;;=   'FIRST' means 'START FROM THE BEGINNING OF THE RANGE OF VALUES'
 ;;^UTILITY(U,$J,.84,9081,2,4,0)
 ;;=   '@' means 'INCLUDE NULL |2| FIELDS'
 ;;^UTILITY(U,$J,.84,9081,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9081,3,1,0)
 ;;=1^LIST
 ;;^UTILITY(U,$J,.84,9081,3,2,0)
 ;;=2^ENTRY
 ;;^UTILITY(U,$J,.84,9081,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9081,5,1,0)
 ;;=DIQQ^DIP1F
 ;;^UTILITY(U,$J,.84,9082,0)
 ;;=9082^3^y^2
 ;;^UTILITY(U,$J,.84,9082,2,0)
 ;;=^^4^4^2991015^^^^
 ;;^UTILITY(U,$J,.84,9082,2,1,0)
 ;;=To |1| only up to a certain |2|,
 ;;^UTILITY(U,$J,.84,9082,2,2,0)
 ;;=type that |2|.  
 ;;^UTILITY(U,$J,.84,9082,2,3,0)
 ;;=   'LAST' means 'GO TO THE END OF THE RANGE OF VALUES'
 ;;^UTILITY(U,$J,.84,9082,2,4,0)
 ;;=   '@' means 'INCLUDE NULL |2| FIELDS'
 ;;^UTILITY(U,$J,.84,9082,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9082,3,1,0)
 ;;=1^LIST
 ;;^UTILITY(U,$J,.84,9082,3,2,0)
 ;;=2^ENTRY
 ;;^UTILITY(U,$J,.84,9082,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9082,5,1,0)
 ;;=DIQQ^DIP1T
 ;;^UTILITY(U,$J,.84,9083,0)
 ;;=9083^3^^2
 ;;^UTILITY(U,$J,.84,9083,1,0)
 ;;=^^3^3^2990710^^
 ;;^UTILITY(U,$J,.84,9083,1,1,0)
 ;;=This template may eventually be used with a different 'SORT-BY' sequence.
 ;;^UTILITY(U,$J,.84,9083,1,2,0)
 ;;=Answering 'Y' here insures that, in that case, the user won't have  to
 ;;^UTILITY(U,$J,.84,9083,1,3,0)
 ;;=remember...
 ;;^UTILITY(U,$J,.84,9083,2,0)
 ;;=^^3^3^2990710^^
 ;;^UTILITY(U,$J,.84,9083,2,1,0)
 ;;=This template may eventually be used with a different 'SORT-BY' sequence.
 ;;^UTILITY(U,$J,.84,9083,2,2,0)
 ;;=Answering 'Y' here insures that, in that case, the user won't have
 ;;^UTILITY(U,$J,.84,9083,2,3,0)
 ;;=to remember to type the '@' in order to keep sub-headers from appearing.
 ;;^UTILITY(U,$J,.84,9083,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9083,5,1,0)
 ;;=DIQQQ^DIP21
 ;;^UTILITY(U,$J,.84,9085,0)
 ;;=9085^3^y^2
 ;;^UTILITY(U,$J,.84,9085,2,0)
 ;;=^^3^3^2990710^
 ;;^UTILITY(U,$J,.84,9085,2,1,0)
 ;;=Since you are calling for output on device '|1|',
 ;;^UTILITY(U,$J,.84,9085,2,2,0)
 ;;=you may use the terminal you are now typing on for something else,
 ;;^UTILITY(U,$J,.84,9085,2,3,0)
 ;;=by answering 'Y'.
 ;;^UTILITY(U,$J,.84,9085,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9085,3,1,0)
 ;;=1^IO DEVICE
 ;;^UTILITY(U,$J,.84,9085,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9085,5,1,0)
 ;;=DIQQ^DIP3
 ;;^UTILITY(U,$J,.84,9086,0)
 ;;=9086^3^^2
 ;;^UTILITY(U,$J,.84,9086,2,0)
 ;;=^^1^1^2990710^^
 ;;^UTILITY(U,$J,.84,9086,2,1,0)
 ;;=If you want page numbering to start at a number higher than 1, type that number.
 ;;^UTILITY(U,$J,.84,9086,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9086,5,1,0)
 ;;=DIQQQ^DIP3
 ;;^UTILITY(U,$J,.84,9108,0)
 ;;=9108^3^^2
 ;;^UTILITY(U,$J,.84,9108,2,0)
 ;;=^^2^2^2990828^
 ;;^UTILITY(U,$J,.84,9108,2,1,0)
 ;;=   If you answer 'N', you"ll be asked to create a formatted display,
 ;;^UTILITY(U,$J,.84,9108,2,2,0)
 ;;=   as in the PRINT Option.
 ;;^UTILITY(U,$J,.84,9108,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9108,5,1,0)
 ;;=DII^O+1
 ;;^UTILITY(U,$J,.84,9109,0)
 ;;=9109^3^^2
 ;;^UTILITY(U,$J,.84,9109,2,0)
 ;;=^^1^1^2990828^
 ;;^UTILITY(U,$J,.84,9109,2,1,0)
 ;;=Answer 'Y' to display the audit trail for each entry.
 ;;^UTILITY(U,$J,.84,9109,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9109,5,1,0)
 ;;=DII
 ;;^UTILITY(U,$J,.84,9110.1,0)
 ;;=9110.1^3^^2
 ;;^UTILITY(U,$J,.84,9110.1,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9110.1,2,1,0)
 ;;=or 012057  (omitting punctuation)
 ;;^UTILITY(U,$J,.84,9110.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.1,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9110.2,0)
 ;;=9110.2^3^^2
 ;;^UTILITY(U,$J,.84,9110.2,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9110.2,2,1,0)
 ;;=assumes a date in the PAST.
 ;;^UTILITY(U,$J,.84,9110.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.2,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9110.3,0)
 ;;=9110.3^3^^2
 ;;^UTILITY(U,$J,.84,9110.3,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9110.3,2,1,0)
 ;;=assumes a date in the FUTURE.
 ;;^UTILITY(U,$J,.84,9110.3,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.3,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9110.4,0)
 ;;=9110.4^3^^2
 ;;^UTILITY(U,$J,.84,9110.4,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9110.4,2,1,0)
 ;;=uses CURRENT YEAR.
 ;;^UTILITY(U,$J,.84,9110.4,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.4,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9110.5,0)
 ;;=9110.5^3^^2
 ;;^UTILITY(U,$J,.84,9110.5,2,0)
 ;;=^^1^1^2990906^^
 ;;^UTILITY(U,$J,.84,9110.5,2,1,0)
 ;;=A 2-digit year means no more than 20 years in the future, or 80 years in the past.
 ;;^UTILITY(U,$J,.84,9110.5,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.5,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9110.6,0)
 ;;=9110.6^3^^2
 ;;^UTILITY(U,$J,.84,9110.6,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9110.6,2,1,0)
 ;;=You may omit the precise day of the month, e.g.: Jan, 1957
 ;;^UTILITY(U,$J,.84,9110.6,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.6,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9112,0)
 ;;=9112^3^^2
 ;;^UTILITY(U,$J,.84,9112,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9112,2,1,0)
 ;;=Seconds may be entered, as e.g.: 10:30:30  or 103030AM
 ;;^UTILITY(U,$J,.84,9112,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9112,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9113,0)
 ;;=9113^3^^2
 ;;^UTILITY(U,$J,.84,9113,2,0)
 ;;=^^1^1^2990906^
 ;;^UTILITY(U,$J,.84,9113,2,1,0)
 ;;=Time is REQUIRED to be entered.
 ;;^UTILITY(U,$J,.84,9113,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9113,5,1,0)
 ;;=DIEH1
 ;;^UTILITY(U,$J,.84,9114,0)
 ;;=9114^3^y^2
 ;;^UTILITY(U,$J,.84,9114,2,0)
 ;;=^^1^1^2991122^
 ;;^UTILITY(U,$J,.84,9114,2,1,0)
 ;;=ENTER A DATE BETWEEN |1| AND |2|
 ;;^UTILITY(U,$J,.84,9114,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9114,3,1,0)
 ;;=1^EARLIEST DATE
 ;;^UTILITY(U,$J,.84,9114,3,2,0)
 ;;=2^LATEST DATE
 ;;^UTILITY(U,$J,.84,9114,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9114,5,1,0)
 ;;=DIALOGZ
 ;;^UTILITY(U,$J,.84,9114.01,0)
 ;;=9114.01^3^y^2
 ;;^UTILITY(U,$J,.84,9114.01,2,0)
 ;;=^^1^1^2991122^
 ;;^UTILITY(U,$J,.84,9114.01,2,1,0)
 ;;=ENTER A DATE NOT EARLIER THAN |1|
 ;;^UTILITY(U,$J,.84,9114.01,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9114.01,3,1,0)
 ;;=1^EARLIEST DATE
 ;;^UTILITY(U,$J,.84,9114.01,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9114.01,5,1,0)
 ;;=DIALOGZ
 ;;^UTILITY(U,$J,.84,9114.1,0)
 ;;=9114.1^3^y^2
 ;;^UTILITY(U,$J,.84,9114.1,2,0)
 ;;=^^1^1^2991028^^^
 ;;^UTILITY(U,$J,.84,9114.1,2,1,0)
 ;;=Response must not be previous to |1|
 ;;^UTILITY(U,$J,.84,9114.1,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9114.1,3,1,0)
 ;;=1^EARLIEST DATE
 ;;^UTILITY(U,$J,.84,9114.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9114.1,5,1,0)
 ;;=DIR1^D+3
 ;;^UTILITY(U,$J,.84,9114.2,0)
 ;;=9114.2^3^y^2
 ;;^UTILITY(U,$J,.84,9114.2,2,0)
 ;;=^^1^1^2991028^^
 ;;^UTILITY(U,$J,.84,9114.2,2,1,0)
 ;;=Response must not be later than |1|
 ;;^UTILITY(U,$J,.84,9114.2,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9114.2,3,1,0)
 ;;=1^LATEST DATE
 ;;^UTILITY(U,$J,.84,9114.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9114.2,5,1,0)
 ;;=DIR1^D+4

DINIT908
DINIT908 ;GFT
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9118,0)
 ;;=9118^3^y^2
 ;;^UTILITY(U,$J,.84,9118,2,0)
 ;;=^^1^1^2991122^
 ;;^UTILITY(U,$J,.84,9118,2,1,0)
 ;;=ENTER A NUMBER BETWEEN |1| AND |2|, |3| DECIMAL DIGIT(S)
 ;;^UTILITY(U,$J,.84,9118,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9118,3,1,0)
 ;;=1^LOWEST NUMBER ALLOWED
 ;;^UTILITY(U,$J,.84,9118,3,2,0)
 ;;=2^HIGHEST NUMBER ALLOWED
 ;;^UTILITY(U,$J,.84,9118,3,3,0)
 ;;=3^NUMBER OF DECIMAL PLACES ALLOWED
 ;;^UTILITY(U,$J,.84,9118,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9118,5,1,0)
 ;;=DIALOGZ
 ;;^UTILITY(U,$J,.84,9118.1,0)
 ;;=9118.1^3^y^2
 ;;^UTILITY(U,$J,.84,9118.1,2,0)
 ;;=^^1^1^2991122^^
 ;;^UTILITY(U,$J,.84,9118.1,2,1,0)
 ;;=ENTER A DOLLAR AMOUNT BETWEEN |1| AND |2|, |3| DECIMAL DIGIT(S)
 ;;^UTILITY(U,$J,.84,9118.1,3,0)
 ;;=^.845^3^3
 ;;^UTILITY(U,$J,.84,9118.1,3,1,0)
 ;;=1^LOWEST NUMBER ALLOWED
 ;;^UTILITY(U,$J,.84,9118.1,3,2,0)
 ;;=2^HIGHEST NUMBER ALLOWED
 ;;^UTILITY(U,$J,.84,9118.1,3,3,0)
 ;;=3^NUMBER OF DECIMAL PLACES ALLOWED
 ;;^UTILITY(U,$J,.84,9118.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9118.1,5,1,0)
 ;;=DIALOGZ
 ;;^UTILITY(U,$J,.84,9119,0)
 ;;=9119^3^y^2
 ;;^UTILITY(U,$J,.84,9119,2,0)
 ;;=^^1^1^2991122^
 ;;^UTILITY(U,$J,.84,9119,2,1,0)
 ;;=ENTER FROM |1| TO |2| CHARACTERS OF FREE TEXT
 ;;^UTILITY(U,$J,.84,9119,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9119,3,1,0)
 ;;=1^SHORTEST LENGTH
 ;;^UTILITY(U,$J,.84,9119,3,2,0)
 ;;=2^LONGEST LENGTH
 ;;^UTILITY(U,$J,.84,9119,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9119,5,1,0)
 ;;=DIALOGZ
 ;;^UTILITY(U,$J,.84,9119.1,0)
 ;;=9119.1^3^y^2
 ;;^UTILITY(U,$J,.84,9119.1,2,0)
 ;;=^^1^1^2991122^
 ;;^UTILITY(U,$J,.84,9119.1,2,1,0)
 ;;=ENTER A FREE-TEXT ANSWER CONTAINING EXACTLY |1| CHARACTER(S)
 ;;^UTILITY(U,$J,.84,9119.1,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9119.1,3,1,0)
 ;;=1^LENGTH OF ANSWER
 ;;^UTILITY(U,$J,.84,9119.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9119.1,5,1,0)
 ;;=DIALOGZ
 ;;^UTILITY(U,$J,.84,9121,0)
 ;;=9121^3^y^2
 ;;^UTILITY(U,$J,.84,9121,2,0)
 ;;=^^2^2^2990710^
 ;;^UTILITY(U,$J,.84,9121,2,1,0)
 ;;=At the time the lookup occurs in File |1|, there may be more than 1 entry found.
 ;;^UTILITY(U,$J,.84,9121,2,2,0)
 ;;=Answering 'Y' here means that the user then will be allowed to choose among several entries.
 ;;^UTILITY(U,$J,.84,9121,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,9121,3,1,0)
 ;;=1^file name
 ;;^UTILITY(U,$J,.84,9121,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9121,5,1,0)
 ;;=DIQQQ^DICOMPW
 ;;^UTILITY(U,$J,.84,9131,0)
 ;;=9131^3^^2
 ;;^UTILITY(U,$J,.84,9131,2,0)
 ;;=^^3^3^2990720^^^
 ;;^UTILITY(U,$J,.84,9131,2,1,0)
 ;;=Follow a field name with ';"CAPTION"'
 ;;^UTILITY(U,$J,.84,9131,2,2,0)
 ;;= to have the field asked as 'CAPTION: '
 ;;^UTILITY(U,$J,.84,9131,2,3,0)
 ;;=   or with ';T' to use the field TITLE as caption.
 ;;^UTILITY(U,$J,.84,9131,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9131,5,1,0)
 ;;=DIQQQ^DIA
 ;;^UTILITY(U,$J,.84,9148,0)
 ;;=9148^3^y^2
 ;;^UTILITY(U,$J,.84,9148,1,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9148,1,1,0)
 ;;=Enter line number
 ;;^UTILITY(U,$J,.84,9148,2,0)
 ;;=^^1^1^2991005^^
 ;;^UTILITY(U,$J,.84,9148,2,1,0)
 ;;=Enter a line number between |1| and |2|.
 ;;^UTILITY(U,$J,.84,9148,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9148,3,1,0)
 ;;=1^1
 ;;^UTILITY(U,$J,.84,9148,3,2,0)
 ;;=2^Highest line number
 ;;^UTILITY(U,$J,.84,9148,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9148,5,1,0)
 ;;=DIWE1^RD
 ;;^UTILITY(U,$J,.84,9149,0)
 ;;=9149^3^^2
 ;;^UTILITY(U,$J,.84,9149,2,0)
 ;;=1^^1^1^2991004^
 ;;^UTILITY(U,$J,.84,9149,2,1,0)
 ;;=Choose, by first letter, a Word Processing command
 ;;^UTILITY(U,$J,.84,9149,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9149,5,1,0)
 ;;=DIWE1^1+5
 ;;^UTILITY(U,$J,.84,9150,0)
 ;;=9150^3^^2
 ;;^UTILITY(U,$J,.84,9150,1,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9150,1,1,0)
 ;;=Type line number
 ;;^UTILITY(U,$J,.84,9150,2,0)
 ;;=^^1^1^2990710^
 ;;^UTILITY(U,$J,.84,9150,2,1,0)
 ;;=or type a Line Number to edit that line.
 ;;^UTILITY(U,$J,.84,9150,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9150,5,1,0)
 ;;=DIWE1^LC+6
 ;;^UTILITY(U,$J,.84,9151,0)
 ;;=9151^3^^2
 ;;^UTILITY(U,$J,.84,9151,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9151,1,1,0)
 ;;=Add Lines to End of Text
 ;;^UTILITY(U,$J,.84,9151,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9151,2,1,0)
 ;;=Add Lines to End of Text
 ;;^UTILITY(U,$J,.84,9151,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9151,5,1,0)
 ;;=DIWE1^A
 ;;^UTILITY(U,$J,.84,9151.1,0)
 ;;=9151.1^^^2
 ;;^UTILITY(U,$J,.84,9151.1,2,1,0)
 ;;=Add lines
 ;;^UTILITY(U,$J,.84,9152,0)
 ;;=9152^3^^2
 ;;^UTILITY(U,$J,.84,9152,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9152,1,1,0)
 ;;=Break a Line into Two
 ;;^UTILITY(U,$J,.84,9152,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9152,2,1,0)
 ;;=Break a Line into Two
 ;;^UTILITY(U,$J,.84,9152,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9152,5,1,0)
 ;;=DIWE1^B
 ;;^UTILITY(U,$J,.84,9152.1,0)
 ;;=9152.1^^^2
 ;;^UTILITY(U,$J,.84,9152.1,2,1,0)
 ;;=Break line: 
 ;;^UTILITY(U,$J,.84,9153,0)
 ;;=9153^3^^2
 ;;^UTILITY(U,$J,.84,9153,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9153,1,1,0)
 ;;=Change Every String to Another in a Range of Lines
 ;;^UTILITY(U,$J,.84,9153,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9153,2,1,0)
 ;;=Change Every String to Another in a Range of Lines
 ;;^UTILITY(U,$J,.84,9153,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9153,5,1,0)
 ;;=DIWE1^C
 ;;^UTILITY(U,$J,.84,9153.1,0)
 ;;=9153.1^^^2
 ;;^UTILITY(U,$J,.84,9153.1,2,1,0)
 ;;=Change every: 
 ;;^UTILITY(U,$J,.84,9154,0)
 ;;=9154^3^^2
 ;;^UTILITY(U,$J,.84,9154,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9154,1,1,0)
 ;;=Delete Line(s)
 ;;^UTILITY(U,$J,.84,9154,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9154,2,1,0)
 ;;=Delete Line(s)
 ;;^UTILITY(U,$J,.84,9154,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9154,5,1,0)
 ;;=DIWE1^D
 ;;^UTILITY(U,$J,.84,9154.1,0)
 ;;=9154.1^^^2
 ;;^UTILITY(U,$J,.84,9154.1,2,1,0)
 ;;=Delete from line: 
 ;;^UTILITY(U,$J,.84,9155,0)
 ;;=9155^3^^2
 ;;^UTILITY(U,$J,.84,9155,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9155,1,1,0)
 ;;=Edit a Line (Replace __  With __)
 ;;^UTILITY(U,$J,.84,9155,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9155,2,1,0)
 ;;=Edit a Line (Replace __  With __)
 ;;^UTILITY(U,$J,.84,9155,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9155,5,1,0)
 ;;=DIWE1^E
 ;;^UTILITY(U,$J,.84,9155.1,0)
 ;;=9155.1^^^2
 ;;^UTILITY(U,$J,.84,9155.1,2,1,0)
 ;;=Edit line: 
 ;;^UTILITY(U,$J,.84,9157,0)
 ;;=9157^3^^2
 ;;^UTILITY(U,$J,.84,9157,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9157,1,1,0)
 ;;=Get Data from Another Source
 ;;^UTILITY(U,$J,.84,9157,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9157,2,1,0)
 ;;=Get Data from Another Source
 ;;^UTILITY(U,$J,.84,9157,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9157,5,1,0)
 ;;=DIWE1^G
 ;;^UTILITY(U,$J,.84,9157.1,0)
 ;;=9157.1^^^2
 ;;^UTILITY(U,$J,.84,9157.1,2,1,0)
 ;;=Get Data from Another Source 
 ;;^UTILITY(U,$J,.84,9159,0)
 ;;=9159^3^^2
 ;;^UTILITY(U,$J,.84,9159,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9159,1,1,0)
 ;;=Insert Line(s) after an Existing Line
 ;;^UTILITY(U,$J,.84,9159,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9159,2,1,0)
 ;;=Insert Line(s) after an Existing Line
 ;;^UTILITY(U,$J,.84,9159,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9159,5,1,0)
 ;;=DIWE1^I
 ;;^UTILITY(U,$J,.84,9159.1,0)
 ;;=9159.1^^^2
 ;;^UTILITY(U,$J,.84,9159.1,2,1,0)
 ;;=Insert after line: 
 ;;^UTILITY(U,$J,.84,9160,0)
 ;;=9160^3^^2
 ;;^UTILITY(U,$J,.84,9160,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9160,1,1,0)
 ;;=Join Line to the One Following
 ;;^UTILITY(U,$J,.84,9160,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9160,2,1,0)
 ;;=Join Line to the One Following
 ;;^UTILITY(U,$J,.84,9160,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9160,5,1,0)
 ;;=DIWE1^J
 ;;^UTILITY(U,$J,.84,9160.1,0)
 ;;=9160.1^^^2
 ;;^UTILITY(U,$J,.84,9160.1,2,1,0)
 ;;=Join line: 
 ;;^UTILITY(U,$J,.84,9162,0)
 ;;=9162^3^^2
 ;;^UTILITY(U,$J,.84,9162,1,0)
 ;;=^^1^1^2990706^

DINIT909
DINIT909 ;GFT
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,9162,1,1,0)
 ;;=List a Range of Lines
 ;;^UTILITY(U,$J,.84,9162,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9162,2,1,0)
 ;;=List a Range of Lines
 ;;^UTILITY(U,$J,.84,9162,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9162,5,1,0)
 ;;=DIWE1^L
 ;;^UTILITY(U,$J,.84,9162.1,0)
 ;;=9162.1^^^2
 ;;^UTILITY(U,$J,.84,9162.1,2,1,0)
 ;;=List line: 
 ;;^UTILITY(U,$J,.84,9163,0)
 ;;=9163^3^^2
 ;;^UTILITY(U,$J,.84,9163,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9163,1,1,0)
 ;;=Move Lines to New Location within Text
 ;;^UTILITY(U,$J,.84,9163,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9163,2,1,0)
 ;;=Move Lines to New Location within Text
 ;;^UTILITY(U,$J,.84,9163,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9163,5,1,0)
 ;;=DIWE1^M
 ;;^UTILITY(U,$J,.84,9163.1,0)
 ;;=9163.1^^^2
 ;;^UTILITY(U,$J,.84,9163.1,2,1,0)
 ;;=Move line: 
 ;;^UTILITY(U,$J,.84,9166,0)
 ;;=9166^3^^2
 ;;^UTILITY(U,$J,.84,9166,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9166,1,1,0)
 ;;=Print Lines as Formatted Output
 ;;^UTILITY(U,$J,.84,9166,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9166,2,1,0)
 ;;=Print Lines as Formatted Output
 ;;^UTILITY(U,$J,.84,9166,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9166,5,1,0)
 ;;=DIWE1^P
 ;;^UTILITY(U,$J,.84,9166.1,0)
 ;;=9166.1^^^2
 ;;^UTILITY(U,$J,.84,9166.1,2,1,0)
 ;;=Print from Line: 1//
 ;;^UTILITY(U,$J,.84,9168,0)
 ;;=9168^3^^2
 ;;^UTILITY(U,$J,.84,9168,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9168,1,1,0)
 ;;=Repeat Lines at a New Location
 ;;^UTILITY(U,$J,.84,9168,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9168,2,1,0)
 ;;=Repeat Lines at a New Location
 ;;^UTILITY(U,$J,.84,9168,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9168,5,1,0)
 ;;=DIWE1^R
 ;;^UTILITY(U,$J,.84,9168.1,0)
 ;;=9168.1^^^2
 ;;^UTILITY(U,$J,.84,9168.1,2,1,0)
 ;;=Repeat line: 
 ;;^UTILITY(U,$J,.84,9169,0)
 ;;=9169^3^^2
 ;;^UTILITY(U,$J,.84,9169,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9169,1,1,0)
 ;;=Search for a String
 ;;^UTILITY(U,$J,.84,9169,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9169,2,1,0)
 ;;=Search for a String
 ;;^UTILITY(U,$J,.84,9169,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9169,5,1,0)
 ;;=DIWE1^S
 ;;^UTILITY(U,$J,.84,9169.1,0)
 ;;=9169.1^^^2
 ;;^UTILITY(U,$J,.84,9169.1,2,1,0)
 ;;=Search for: 
 ;;^UTILITY(U,$J,.84,9170,0)
 ;;=9170^3^^2
 ;;^UTILITY(U,$J,.84,9170,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9170,1,1,0)
 ;;=Transfer Lines From Another Document
 ;;^UTILITY(U,$J,.84,9170,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9170,2,1,0)
 ;;=Transfer Lines From Another Document
 ;;^UTILITY(U,$J,.84,9170,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9170,5,1,0)
 ;;=DIWE1^T
 ;;^UTILITY(U,$J,.84,9170.1,0)
 ;;=9170.1^^^2
 ;;^UTILITY(U,$J,.84,9170.1,2,1,0)
 ;;=Transfer incoming text after line: 
 ;;^UTILITY(U,$J,.84,9171,0)
 ;;=9171^3^^2
 ;;^UTILITY(U,$J,.84,9171,1,0)
 ;;=^^1^1^2991026^^
 ;;^UTILITY(U,$J,.84,9171,1,1,0)
 ;;=Utility Sub-Menu
 ;;^UTILITY(U,$J,.84,9171,2,0)
 ;;=^^1^1^2991026^^^^
 ;;^UTILITY(U,$J,.84,9171,2,1,0)
 ;;=Utilities for Word-Processing
 ;;^UTILITY(U,$J,.84,9171,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9171,5,1,0)
 ;;=DIWE1^U
 ;;^UTILITY(U,$J,.84,9171.1,0)
 ;;=9171.1^2^^2
 ;;^UTILITY(U,$J,.84,9171.1,2,0)
 ;;=^^1^1^2991026^
 ;;^UTILITY(U,$J,.84,9171.1,2,1,0)
 ;;=Miscellaneous UTILITIES
 ;;^UTILITY(U,$J,.84,9175,0)
 ;;=9175^3^^2
 ;;^UTILITY(U,$J,.84,9175,1,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9175,1,1,0)
 ;;=Y-Programmer Edit
 ;;^UTILITY(U,$J,.84,9175,2,0)
 ;;=^^1^1^2990706^
 ;;^UTILITY(U,$J,.84,9175,2,1,0)
 ;;=Y-Programmer Edit
 ;;^UTILITY(U,$J,.84,9175,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9175,5,1,0)
 ;;=DIWE1^Y
 ;;^UTILITY(U,$J,.84,9175.1,0)
 ;;=9175.1^^^2
 ;;^UTILITY(U,$J,.84,9175.1,2,1,0)
 ;;=Y
 ;;^UTILITY(U,$J,.84,9180,0)
 ;;=9180^3^^2
 ;;^UTILITY(U,$J,.84,9180,2,0)
 ;;=^^10^10^2990720^^^^
 ;;^UTILITY(U,$J,.84,9180,2,1,0)
 ;;=You are ready to enter a line of text.
 ;;^UTILITY(U,$J,.84,9180,2,2,0)
 ;;=Type 'CONTROL-I' (or the TAB key) to insert tabs.
 ;;^UTILITY(U,$J,.84,9180,2,3,0)
 ;;=When the text is output, these formatting rules will apply:
 ;;^UTILITY(U,$J,.84,9180,2,4,0)
 ;;= A)  Lines containing only punctuation characters, or lines containing TABs
 ;;^UTILITY(U,$J,.84,9180,2,5,0)
 ;;=     will stand by themselves, i.e., no wrap-around.
 ;;^UTILITY(U,$J,.84,9180,2,6,0)
 ;;= B)  Lines beginning with spaces will start on a new line.
 ;;^UTILITY(U,$J,.84,9180,2,7,0)
 ;;= C)  Expressions between '|' characters will be evaluated as
 ;;^UTILITY(U,$J,.84,9180,2,8,0)
 ;;=     'computed-field' expressions, and then printed as evaluated.
 ;;^UTILITY(U,$J,.84,9180,2,9,0)
 ;;=     Thus, '|NAME|' would cause the current NAME to be inserted in the text.
 ;;^UTILITY(U,$J,.84,9180,2,10,0)
 ;;= 
 ;;^UTILITY(U,$J,.84,9180,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9180,5,1,0)
 ;;=DIWE5^IQ
 ;;^UTILITY(U,$J,.84,9181,0)
 ;;=9181^3^^2
 ;;^UTILITY(U,$J,.84,9181,2,0)
 ;;=^^1^1^2990720^^^
 ;;^UTILITY(U,$J,.84,9181,2,1,0)
 ;;=Do you want to see a list of allowable formatting 'WINDOWS'
 ;;^UTILITY(U,$J,.84,9181,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9181,5,1,0)
 ;;=DIWE5^IQ
 ;;^UTILITY(U,$J,.84,9182,0)
 ;;=9182^3^^2
 ;;^UTILITY(U,$J,.84,9182,2,0)
 ;;=^^1^1^2990711^
 ;;^UTILITY(U,$J,.84,9182,2,1,0)
 ;;=SPECIAL FORMATTING INCLUDES:
 ;;^UTILITY(U,$J,.84,9182,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9182,5,1,0)
 ;;=DIWE5^IQ
 ;;^UTILITY(U,$J,.84,9183,0)
 ;;=9183^3^y^2
 ;;^UTILITY(U,$J,.84,9183,2,0)
 ;;=^^4^4^2990906^^
 ;;^UTILITY(U,$J,.84,9183,2,1,0)
 ;;=If you want to use the text from the '|1|' field of another
 ;;^UTILITY(U,$J,.84,9183,2,2,0)
 ;;='|2|' entry< type the name of that entry.
 ;;^UTILITY(U,$J,.84,9183,2,3,0)
 ;;=Otherwise, use a computed expression to designate some 
 ;;^UTILITY(U,$J,.84,9183,2,4,0)
 ;;=Word-Processing text.
 ;;^UTILITY(U,$J,.84,9183,3,0)
 ;;=^.845^2^2
 ;;^UTILITY(U,$J,.84,9183,3,1,0)
 ;;=1^NAME OF W-P FIELD WE ARE EDITING
 ;;^UTILITY(U,$J,.84,9183,3,2,0)
 ;;=2^NAME OF FILE WE ARE EDITING
 ;;^UTILITY(U,$J,.84,9183,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9183,5,1,0)
 ;;=DIWE5^TQ
 ;;^UTILITY(U,$J,.84,9184,0)
 ;;=9184^2^^2
 ;;^UTILITY(U,$J,.84,9184,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,9184,2,1,0)
 ;;=Text-Terminator
 ;;^UTILITY(U,$J,.84,9184,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9184,5,1,0)
 ;;=DIWE11^TT+2
 ;;^UTILITY(U,$J,.84,9185,0)
 ;;=9185^3^^2
 ;;^UTILITY(U,$J,.84,9185,2,0)
 ;;=^^2^2^2991008^
 ;;^UTILITY(U,$J,.84,9185,2,1,0)
 ;;=Answer must be 1 to 5 characters, containing no question-marks or up-arrows.
 ;;^UTILITY(U,$J,.84,9185,2,2,0)
 ;;=To go back to the Null-String, just type "@".
 ;;^UTILITY(U,$J,.84,9185,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9185,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,9186,0)
 ;;=9186^2^^2
 ;;^UTILITY(U,$J,.84,9186,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,9186,2,1,0)
 ;;=The NULL-STRING is now the TEXT-TERMINATOR!
 ;;^UTILITY(U,$J,.84,9186,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9186,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,9189,0)
 ;;=9189^2^^2
 ;;^UTILITY(U,$J,.84,9189,2,0)
 ;;=^^1^1^2991027^^
 ;;^UTILITY(U,$J,.84,9189,2,1,0)
 ;;=UTILITY Option
 ;;^UTILITY(U,$J,.84,9189,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9189,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,9190,0)
 ;;=9190^2^^2
 ;;^UTILITY(U,$J,.84,9190,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,9190,2,1,0)
 ;;=Editor Change
 ;;^UTILITY(U,$J,.84,9190,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9190,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,9191,0)
 ;;=9191^2^^2
 ;;^UTILITY(U,$J,.84,9191,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,9191,2,1,0)
 ;;=File Transfer from Foreign CPU
 ;;^UTILITY(U,$J,.84,9191,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9191,5,1,0)
 ;;=DIWE11
 ;;^UTILITY(U,$J,.84,9192,0)
 ;;=9192^2^^2
 ;;^UTILITY(U,$J,.84,9192,2,0)
 ;;=^^1^1^2991027^
 ;;^UTILITY(U,$J,.84,9192,2,1,0)
 ;;=Text-Terminator-String change
 ;;^UTILITY(U,$J,.84,9192,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9192,5,1,0)
 ;;=DIWE11

DINIT910
DINIT910 ;GFT;07:09 PM  31 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,347,0)
 ;;=347^1^^2
 ;;^UTILITY(U,$J,.84,347,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,347,2,1,0)
 ;;=Unable to change text.  Resultant line is too long.
 ;;^UTILITY(U,$J,.84,347,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,347,5,1,0)
 ;;=DDWC^RS+5
 ;;^UTILITY(U,$J,.84,830,0)
 ;;=830^1^^2
 ;;^UTILITY(U,$J,.84,830,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,830,2,1,0)
 ;;=This terminal does not support scroll region or reverse index
 ;;^UTILITY(U,$J,.84,830,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,830,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,831,0)
 ;;=831^1^^2
 ;;^UTILITY(U,$J,.84,831,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,831,2,1,0)
 ;;=TOP & BOTTOM MARGINS
 ;;^UTILITY(U,$J,.84,831,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,831,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,832,0)
 ;;=832^1^^2
 ;;^UTILITY(U,$J,.84,832,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,832,2,1,0)
 ;;=TOP MARGIN
 ;;^UTILITY(U,$J,.84,832,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,832,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,833,0)
 ;;=833^1^^2
 ;;^UTILITY(U,$J,.84,833,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,833,2,1,0)
 ;;=BOTTOM MARGIN
 ;;^UTILITY(U,$J,.84,833,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,833,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,834,0)
 ;;=834^1^^2
 ;;^UTILITY(U,$J,.84,834,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,834,2,1,0)
 ;;=SCROLL REGION TOO SMALL
 ;;^UTILITY(U,$J,.84,834,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,834,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,835,0)
 ;;=835^1^^2
 ;;^UTILITY(U,$J,.84,835,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,835,2,1,0)
 ;;=REVERSE INDEX
 ;;^UTILITY(U,$J,.84,835,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,835,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,836,0)
 ;;=836^2^^2
 ;;^UTILITY(U,$J,.84,836,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,836,2,1,0)
 ;;=Enter a column number between 1 and 255
 ;;^UTILITY(U,$J,.84,836,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,836,5,1,0)
 ;;=DDBR0
 ;;^UTILITY(U,$J,.84,1404,0)
 ;;=1404^1^^2
 ;;^UTILITY(U,$J,.84,1404,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1404,2,1,0)
 ;;=NO TEXT!
 ;;^UTILITY(U,$J,.84,1404,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1404,5,1,0)
 ;;=DDBR
 ;;^UTILITY(U,$J,.84,1405,0)
 ;;=1405^2^y^2
 ;;^UTILITY(U,$J,.84,1405,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1405,2,1,0)
 ;;=...Searching for '|1|' ...
 ;;^UTILITY(U,$J,.84,1405,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,1405,3,1,0)
 ;;=1^String being searched for
 ;;^UTILITY(U,$J,.84,1405,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1405,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,1406,0)
 ;;=1406^1^^2
 ;;^UTILITY(U,$J,.84,1406,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1406,2,1,0)
 ;;=NO PREVIOUS FIND STRING AVAILABLE
 ;;^UTILITY(U,$J,.84,1406,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1406,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,1407,0)
 ;;=1407^2^^2
 ;;^UTILITY(U,$J,.84,1407,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1407,2,1,0)
 ;;=Please enter a string of characters to search for  (or '^')
 ;;^UTILITY(U,$J,.84,1407,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1407,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,1408,0)
 ;;=1408^2^^2
 ;;^UTILITY(U,$J,.84,1408,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1408,2,1,0)
 ;;=GoTo
 ;;^UTILITY(U,$J,.84,1408,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1408,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,1409,0)
 ;;=1409^2^^2
 ;;^UTILITY(U,$J,.84,1409,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1409,2,1,0)
 ;;=Screen (default), or line number preceeded by 'S' or 'L'
 ;;^UTILITY(U,$J,.84,1409,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1409,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,1409.1,0)
 ;;=1409.1^2^^2
 ;;^UTILITY(U,$J,.84,1409.1,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1409.1,2,1,0)
 ;;=Screen (default), column, or line number preceeded by 'S, 'C' or 'L'
 ;;^UTILITY(U,$J,.84,1409.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1409.1,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,1901,0)
 ;;=1901^2^^2
 ;;^UTILITY(U,$J,.84,1901,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,1901,2,1,0)
 ;;=REPORT CANCELLED!
 ;;^UTILITY(U,$J,.84,1901,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,1901,5,1,0)
 ;;=DDBRP
 ;;^UTILITY(U,$J,.84,3090,0)
 ;;=3090^1^y^2
 ;;^UTILITY(U,$J,.84,3090,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3090,2,1,0)
 ;;='|1|' is UNEDITABLE
 ;;^UTILITY(U,$J,.84,3090,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3090,3,1,0)
 ;;=1^Field name
 ;;^UTILITY(U,$J,.84,3090,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3090,5,1,0)
 ;;=DIED^O+2
 ;;^UTILITY(U,$J,.84,3092.1,0)
 ;;=3092.1^1^^2
 ;;^UTILITY(U,$J,.84,3092.1,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3092.1,2,1,0)
 ;;=This is a required field
 ;;^UTILITY(U,$J,.84,3092.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3092.1,5,1,0)
 ;;=DDS02^EXT+22
 ;;^UTILITY(U,$J,.84,3092.2,0)
 ;;=3092.2^1^^2
 ;;^UTILITY(U,$J,.84,3092.2,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3092.2,2,1,0)
 ;;=This is a required KEY field
 ;;^UTILITY(U,$J,.84,3092.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3092.2,5,1,0)
 ;;=DIED^NKEY+1
 ;;^UTILITY(U,$J,.84,3093,0)
 ;;=3093^1^^2
 ;;^UTILITY(U,$J,.84,3093,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3093,2,1,0)
 ;;=You cannot save changes here.  To close the current page, press <F1>C.
 ;;^UTILITY(U,$J,.84,3093,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3093,5,1,0)
 ;;=DDS02^SV+5
 ;;^UTILITY(U,$J,.84,3094,0)
 ;;=3094^1^^2
 ;;^UTILITY(U,$J,.84,3094,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3094,2,1,0)
 ;;=Another Entry already exists with this KEY value.
 ;;^UTILITY(U,$J,.84,3094,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3094,5,1,0)
 ;;=DDS02^
 ;;^UTILITY(U,$J,.84,3095,0)
 ;;=3095^1^^2
 ;;^UTILITY(U,$J,.84,3095,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3095,2,1,0)
 ;;=Exit not allowed
 ;;^UTILITY(U,$J,.84,3095,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3095,5,1,0)
 ;;=DIE0
 ;;^UTILITY(U,$J,.84,3096,0)
 ;;=3096^1^^2
 ;;^UTILITY(U,$J,.84,3096,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3096,2,1,0)
 ;;=No Jumping allowed
 ;;^UTILITY(U,$J,.84,3096,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3096,5,1,0)
 ;;=DIE0^
 ;;^UTILITY(U,$J,.84,3097,0)
 ;;=3097^1^^2
 ;;^UTILITY(U,$J,.84,3097,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3097,2,1,0)
 ;;=Jumping forward not allowed
 ;;^UTILITY(U,$J,.84,3097,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3097,5,1,0)
 ;;=DIE0^
 ;;^UTILITY(U,$J,.84,3098,0)
 ;;=3098^1^y^2
 ;;^UTILITY(U,$J,.84,3098,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,3098,2,1,0)
 ;;='|1|' matches no Field or Caption on this screen
 ;;^UTILITY(U,$J,.84,3098,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,3098,3,1,0)
 ;;=1^Incorrect input after the "^"
 ;;^UTILITY(U,$J,.84,3098,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,3098,5,1,0)
 ;;=DDS2^NO
 ;;^UTILITY(U,$J,.84,7067,0)
 ;;=7067^2^^2
 ;;^UTILITY(U,$J,.84,7067,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,7067,2,1,0)
 ;;=  Do you mean ALL the fields in the file? 
 ;;^UTILITY(U,$J,.84,7067,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7067,5,1,0)
 ;;=DIP2^2+5
 ;;^UTILITY(U,$J,.84,7067.1,0)
 ;;=7067.1^2^^2
 ;;^UTILITY(U,$J,.84,7067.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7067.1,2,1,0)
 ;;= Answer YES only if you want every field in the file.
 ;;^UTILITY(U,$J,.84,7067.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7067.1,5,1,0)
 ;;=DIP2^2+5
 ;;^UTILITY(U,$J,.84,7075,0)
 ;;=7075^3^^2
 ;;^UTILITY(U,$J,.84,7075,2,0)
 ;;=^^1^1^
 ;;^UTILITY(U,$J,.84,7075,2,1,0)
 ;;=(Note that this value, starting with a quote ("), precedes all alphanumerics)
 ;;^UTILITY(U,$J,.84,7075,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7075,5,1,0)
 ;;=DIP1^QUOTE

DINIT911
DINIT911 ;GFT;07:13 PM  5 Dec 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY(U,$J,.84,7076,0)
 ;;=7076^1^^2
 ;;^UTILITY(U,$J,.84,7076,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7076,2,1,0)
 ;;=SWITCH Function Restricted
 ;;^UTILITY(U,$J,.84,7076,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7076,5,1,0)
 ;;=DDBR2
 ;;^UTILITY(U,$J,.84,7076.1,0)
 ;;=7076.1^2^^2
 ;;^UTILITY(U,$J,.84,7076.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7076.1,2,1,0)
 ;;=SWITCH Function Restricted to Current List
 ;;^UTILITY(U,$J,.84,7076.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7076.1,5,1,0)
 ;;=DDBR2
 ;;^UTILITY(U,$J,.84,7076.3,0)
 ;;=7076.3^1^^2
 ;;^UTILITY(U,$J,.84,7076.3,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7076.3,2,1,0)
 ;;=YOU CANNOT PRINT THE BROWSER HELP ON A CRT.
 ;;^UTILITY(U,$J,.84,7076.3,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7076.3,5,1,0)
 ;;=DDBRP
 ;;^UTILITY(U,$J,.84,7076.4,0)
 ;;=7076.4^2^^2
 ;;^UTILITY(U,$J,.84,7076.4,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7076.4,2,1,0)
 ;;=PRINT BROWSER HELP
 ;;^UTILITY(U,$J,.84,7076.4,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7076.4,5,1,0)
 ;;=DDBRP
 ;;^UTILITY(U,$J,.84,7077,0)
 ;;=7077^2^^2
 ;;^UTILITY(U,$J,.84,7077,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7077,2,1,0)
 ;;=HYPERTEXT JUMP IS NOT AVAILABLE
 ;;^UTILITY(U,$J,.84,7077,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7077,5,1,0)
 ;;=DDBRAHTJ
 ;;^UTILITY(U,$J,.84,7078,0)
 ;;=7078^2^^2
 ;;^UTILITY(U,$J,.84,7078,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078,2,1,0)
 ;;=Copy Text Line(s) to Paste Buffer
 ;;^UTILITY(U,$J,.84,7078,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,7078.1,0)
 ;;=7078.1^2^^2
 ;;^UTILITY(U,$J,.84,7078.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078.1,2,1,0)
 ;;=* Enter line, or range of lines separated by ":" *
 ;;^UTILITY(U,$J,.84,7078.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078.1,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,7078.2,0)
 ;;=7078.2^1^y^2
 ;;^UTILITY(U,$J,.84,7078.2,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078.2,2,1,0)
 ;;=Must be a valid line or range of lines, from 1 to |1|
 ;;^UTILITY(U,$J,.84,7078.2,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,7078.2,3,1,0)
 ;;=1^Number of lines
 ;;^UTILITY(U,$J,.84,7078.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078.2,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,7078.3,0)
 ;;=7078.3^1^^2
 ;;^UTILITY(U,$J,.84,7078.3,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078.3,2,1,0)
 ;;=<< Copy to Paste Buffer RESTRICTED when Viewing Buffer >>
 ;;^UTILITY(U,$J,.84,7078.3,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078.3,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,7078.4,0)
 ;;=7078.4^1^^2
 ;;^UTILITY(U,$J,.84,7078.4,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078.4,2,1,0)
 ;;=<< RESTRICTED  Must exit HELP to Copy to Paste Buffer  >>
 ;;^UTILITY(U,$J,.84,7078.4,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078.4,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,7078.5,0)
 ;;=7078.5^1^^2
 ;;^UTILITY(U,$J,.84,7078.5,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078.5,2,1,0)
 ;;=<< RESTRICTED  Must Exit HELP to View Buffer >>
 ;;^UTILITY(U,$J,.84,7078.5,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078.5,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,7078.6,0)
 ;;=7078.6^2^^2
 ;;^UTILITY(U,$J,.84,7078.6,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,7078.6,2,1,0)
 ;;=<< RESTRICTED  Must Exit View Buffer to SWITCH >>
 ;;^UTILITY(U,$J,.84,7078.6,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,7078.6,5,1,0)
 ;;=DDBRWB
 ;;^UTILITY(U,$J,.84,8006.1,0)
 ;;=8006.1^2^^2
 ;;^UTILITY(U,$J,.84,8006.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8006.1,2,1,0)
 ;;=NO MATCHES FOUND
 ;;^UTILITY(U,$J,.84,8006.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8006.1,5,1,0)
 ;;=DIO4
 ;;^UTILITY(U,$J,.84,8006.11,0)
 ;;=8006.11^2^^2
 ;;^UTILITY(U,$J,.84,8006.11,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8006.11,2,1,0)
 ;;=NO OTHER MATCH FOUND
 ;;^UTILITY(U,$J,.84,8006.11,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8006.11,5,1,0)
 ;;=DDBR1
 ;;^UTILITY(U,$J,.84,8006.2,0)
 ;;=8006.2^2^y^2
 ;;^UTILITY(U,$J,.84,8006.2,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8006.2,2,1,0)
 ;;=MATCHES FOUND: |1|
 ;;^UTILITY(U,$J,.84,8006.2,3,0)
 ;;=^.845^1^1
 ;;^UTILITY(U,$J,.84,8006.2,3,1,0)
 ;;=1^Number of matches
 ;;^UTILITY(U,$J,.84,8006.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8006.2,5,1,0)
 ;;=DIO4
 ;;^UTILITY(U,$J,.84,8007.1,0)
 ;;=8007.1^2^^2
 ;;^UTILITY(U,$J,.84,8007.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8007.1,2,1,0)
 ;;=*** NO RECORDS TO PRINT ***
 ;;^UTILITY(U,$J,.84,8007.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8007.1,5,1,0)
 ;;=DIO4
 ;;^UTILITY(U,$J,.84,8075.1,0)
 ;;=8075.1^2^^2
 ;;^UTILITY(U,$J,.84,8075.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8075.1,2,1,0)
 ;;=Do you want to save changes? 
 ;;^UTILITY(U,$J,.84,8075.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8075.1,5,1,0)
 ;;=DDW1
 ;;^UTILITY(U,$J,.84,8075.5,0)
 ;;=8075.5^2^^2
 ;;^UTILITY(U,$J,.84,8075.5,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8075.5,2,1,0)
 ;;=Saving text ...
 ;;^UTILITY(U,$J,.84,8075.5,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8075.5,5,1,0)
 ;;=DDW1
 ;;^UTILITY(U,$J,.84,8126,0)
 ;;=8126^2^^2
 ;;^UTILITY(U,$J,.84,8126,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8126,2,1,0)
 ;;=Find What: 
 ;;^UTILITY(U,$J,.84,8126,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8126,5,1,0)
 ;;=DDWF^FIND+2
 ;;^UTILITY(U,$J,.84,8126.1,0)
 ;;=8126.1^2^^2
 ;;^UTILITY(U,$J,.84,8126.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8126.1,2,1,0)
 ;;=Replace With: 
 ;;^UTILITY(U,$J,.84,8126.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8126.1,5,1,0)
 ;;=DDWC1^FIND+1
 ;;^UTILITY(U,$J,.84,8127,0)
 ;;=8127^1^^2
 ;;^UTILITY(U,$J,.84,8127,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8127,2,1,0)
 ;;=TEXT NOT FOUND
 ;;^UTILITY(U,$J,.84,8127,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8127,5,1,0)
 ;;=DDWF
 ;;^UTILITY(U,$J,.84,8128,0)
 ;;=8128^2^^2
 ;;^UTILITY(U,$J,.84,8128,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8128,2,1,0)
 ;;=WARNING: Control characters in text have been replaced by spaces.
 ;;^UTILITY(U,$J,.84,8128,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8128,5,1,0)
 ;;=DDW1
 ;;^UTILITY(U,$J,.84,8140,0)
 ;;=8140^3^^2
 ;;^UTILITY(U,$J,.84,8140,2,0)
 ;;=^^3^3
 ;;^UTILITY(U,$J,.84,8140,2,1,0)
 ;;=Examples, to go to a screen:  S21  or  S+3  or  +3  or -3
 ;;^UTILITY(U,$J,.84,8140,2,2,0)
 ;;=          to go to a line:    L53  or  L+4  or  L-5
 ;;^UTILITY(U,$J,.84,8140,2,3,0)
 ;;=          to go to a column:  C40  or  C+10 or  C-20
 ;;^UTILITY(U,$J,.84,8140,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8140,5,1,0)
 ;;=DDWG
 ;;^UTILITY(U,$J,.84,8142,0)
 ;;=8142^2^^2
 ;;^UTILITY(U,$J,.84,8142,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8142,2,1,0)
 ;;=Do you wish to select from current list? 
 ;;^UTILITY(U,$J,.84,8142,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8142,5,1,0)
 ;;=DDBR2
 ;;^UTILITY(U,$J,.84,8178,0)
 ;;=8178^2^^2
 ;;^UTILITY(U,$J,.84,8178,2,0)
 ;;=^^2^2
 ;;^UTILITY(U,$J,.84,8178,2,1,0)
 ;;=WARNING: This field is uneditable.
 ;;^UTILITY(U,$J,.84,8178,2,2,0)
 ;;=         Any changes made in the editor will not be saved.
 ;;^UTILITY(U,$J,.84,8178,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8178,5,1,0)
 ;;=DDSWP
 ;;^UTILITY(U,$J,.84,9110.8,0)
 ;;=9110.8^3^^2
 ;;^UTILITY(U,$J,.84,9110.8,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,9110.8,2,1,0)
 ;;=or 0157
 ;;^UTILITY(U,$J,.84,9110.8,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,9110.8,5,1,0)
 ;;=DIEH1^DT+2
 ;;^UTILITY(U,$J,.84,8136,0)
 ;;=8136^3^^2
 ;;^UTILITY(U,$J,.84,8136,2,0)
 ;;=^^4^4
 ;;^UTILITY(U,$J,.84,8136,2,1,0)
 ;;  Specify in which column(s) you want to set tab stops. To set individual
 ;;^UTILITY(U,$J,.84,8136,2,2,0)
 ;;  tab stops, type a series of numbers separated by commas, for example:
 ;;^UTILITY(U,$J,.84,8136,2,3,0)
 ;;  4,7,15,20. To set tab stops at repeated intervals after the last stop,
 ;;^UTILITY(U,$J,.84,8136,2,4,0)
 ;;  or column 1, type the interval as +n, for example: 10,20,+5.
 ;;^UTILITY(U,$J,.84,8136,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8136,5,1,0)
 ;;=DDW2^TSALL
 ;;^UTILITY(U,$J,.84,8136.1,0)
 ;;=8136.1^2^^2
 ;;^UTILITY(U,$J,.84,8136.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8136.1,2,1,0)
 ;;=Columns in which to set tab stops: 
 ;;^UTILITY(U,$J,.84,8136.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8136.1,5,1,0)
 ;;=DDW2
 ;;^UTILITY(U,$J,.84,8136.2,0)
 ;;=8136.2^1^^2
 ;;^UTILITY(U,$J,.84,8136.2,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8136.2,2,1,0)
 ;;=Response can contain only commas (,), plus signs (+), and numbers.
 ;;^UTILITY(U,$J,.84,8136.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8136.2,5,1,0)
 ;;=DDW2
 ;;^UTILITY(U,$J,.84,8138.1,0)
 ;;=8138.1^1^^2
 ;;^UTILITY(U,$J,.84,8138.1,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8138.1,2,1,0)
 ;;Margins cannot be set when wrap is off
 ;;^UTILITY(U,$J,.84,8138.1,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8138.1,5,1,0)
 ;;=DDW2
 ;;^UTILITY(U,$J,.84,8138.2,0)
 ;;=8138.2^1^^2
 ;;^UTILITY(U,$J,.84,8138.2,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8138.2,2,1,0)
 ;;=Left margin cannot be set beyond column 231
 ;;^UTILITY(U,$J,.84,8138.2,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8138.2,5,1,0)
 ;;=DDW2
 ;;^UTILITY(U,$J,.84,8138.3,0)
 ;;=8138.3^1^^2
 ;;^UTILITY(U,$J,.84,8138.3,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8138.3,2,1,0)
 ;;=Left margin must be left of right margin
 ;;^UTILITY(U,$J,.84,8138.3,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8138.3,5,1,0)
 ;;=DDW2
 ;;^UTILITY(U,$J,.84,8138.4,0)
 ;;=8138.4^1^^2
 ;;^UTILITY(U,$J,.84,8138.4,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8138.4,2,1,0)
 ;;=Right margin cannot be set beyond column 245
 ;;^UTILITY(U,$J,.84,8138.4,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8138.4,5,1,0)
 ;;=DDW2
 ;;^UTILITY(U,$J,.84,8138.5,0)
 ;;=8138.5^1^^2
 ;;^UTILITY(U,$J,.84,8138.5,2,0)
 ;;=^^1^1
 ;;^UTILITY(U,$J,.84,8138.5,2,1,0)
 ;;=Right margin must be right of left margin
 ;;^UTILITY(U,$J,.84,8138.5,5,0)
 ;;=^.841^1^1
 ;;^UTILITY(U,$J,.84,8138.5,5,1,0)
 ;;=DDW2

DINITPST
DINITPST ;SFISC/MKO-POST INIT FOR DINIT ;9:31 AM  23 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N %,%Y,C,D,D0,DI,DIV,DQ
 ;
 ;Delete ^DIPT("EX") index (also done in patch DI*21*8 in DIPOST)
 K ^DIPT("EX")
 ;
 ;Delete test Dialog entries 10001,99000,99001,99002
 N DIALOG
 F DIALOG=10001,99000,99001,99002 D
 . N DIK,DA
 . Q:$D(^DI(.84,DIALOG,0))[0
 . S DIK="^DI(.84,",DA=DIALOG D ^DIK
 ;
 ;Delete templates .001 and .002
 I $D(^DIE(.001)) D
 . N DIK,DA
 . S DIK="^DIE("
 . F DA=.001,.002 D ^DIK
 ;
 ;Recompile all forms
 W !
 S DDSQUIET=1 D DELALL^DDSZ K DDSQUIET
 D ALL^DDSZ
 W !!
 Q

DINTEG
DINTEG ;ISC/XTSUMBLD KERNEL - Package checksum checker ;3130328.105856
 ;;0.0;
 ;;7.3;3130328.105856
 S XT4="I 1",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
CONT F XT1=1:1 S XT2=$T(ROU+XT1) Q:XT2=""  S X=$P(XT2," ",1),XT3=$P(XT2,";",3) X XT4 I $T W !,X X ^%ZOSF("TEST") S:'$T XT3=0 X:XT3 ^%ZOSF("RSUM") W ?10,$S('XT3:"Routine not in UCI",XT3'=Y:"Calculated "_$C(7)_Y_", off by "_(Y-XT3),1:"ok")
 G CONT^DINTEG0
 K %1,%2,%3,X,Y,XT1,XT2,XT3,XT4 Q
ONE S XT4="I $D(^UTILITY($J,X))",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
 W !,"Check a subset of routines:" K ^UTILITY($J) X ^%ZOSF("RSEL")
 W ! G CONT
ROU ;;
DDBR ;;7360464
DDBR0 ;;6221715
DDBR1 ;;8160715
DDBR2 ;;6760743
DDBR3 ;;3667049
DDBR4 ;;3289215
DDBRAHT ;;2626328
DDBRAHTE ;;3952577
DDBRAHTJ ;;7585148
DDBRAHTR ;;3022903
DDBRAP ;;5866471
DDBRGE ;;6606433
DDBRP ;;2560102
DDBRS ;;2734141
DDBRT ;;545522
DDBRU ;;5018904
DDBRU2 ;;6456077
DDBRWB ;;3189057
DDBRZIS ;;2239925
DDD ;;4417296
DDDIN001 ;;4094852
DDDINIT ;;8932393
DDDINIT1 ;;2844034
DDDINIT2 ;;5232603
DDDINIT3 ;;16875027
DDFIX ;;8711878
DDGF ;;1862022
DDGF0 ;;4477302
DDGF1 ;;3080012
DDGF2 ;;4585362
DDGF3 ;;5347663
DDGF4 ;;2607874
DDGFADL ;;1121232
DDGFAPC ;;2980494
DDGFASUB ;;1476759
DDGFBK ;;4441116
DDGFBSEL ;;3244989
DDGFEL ;;5668227
DDGFFLD ;;3054325
DDGFFLDA ;;4448977
DDGFFM ;;12990392
DDGFH ;;240939
DDGFHBK ;;2815103
DDGFLOAD ;;5494739
DDGFORD ;;1345365
DDGFPG ;;6147639
DDGFSV ;;3377368
DDGFU ;;5495160
DDGFUPDB ;;1575190
DDGFUPDP ;;4297868
DDGLBXA ;;6113990
DDGLBXA1 ;;5124092
DDGLCBOX ;;2605527
DDGLIB0 ;;12294257
DDGLIBH ;;5454192
DDGLIBP ;;6402057
DDGLIBW ;;4337005
DDGLIBW1 ;;2290469
DDIOL ;;1621841
DDMAP ;;9789930
DDMAP1 ;;10230831
DDMAP2 ;;7579160
DDMOD ;;697591
DDMP ;;12193196
DDMP1 ;;9723042
DDMP2 ;;9295425
DDMPSM ;;7179788
DDMPSM1 ;;3485759
DDMPU ;;8199841
DDPA1 ;;5331054
DDPA2 ;;4730783
DDR ;;8899777
DDR0 ;;5407990
DDR1 ;;1043214
DDR2 ;;7680688
DDR3 ;;3479219
DDR4 ;;550304
DDS ;;8920384
DDS0 ;;5015680
DDS01 ;;13065948
DDS02 ;;6843297
DDS1 ;;9287355
DDS10 ;;3393190
DDS11 ;;7910962
DDS2 ;;17638840
DDS3 ;;2638182
DDS4 ;;7648831
DDS41 ;;9837696
DDS5 ;;4037357
DDS6 ;;4449656
DDS7 ;;3559395
DDSBOX ;;1558787
DDSCAP ;;687151
DDSCLONE ;;8004920
DDSCLONF ;;3170972
DDSCOM ;;7631784
DDSCOMP ;;3213158
DDSDBLK ;;3802275
DDSDEL ;;3334746
DDSDFRM ;;6917252
DDSFO ;;807544
DDSIT ;;758636
DDSLIB ;;3398587
DDSM ;;7943256
DDSM1 ;;2889332
DDSMSG ;;2906482
DDSOPT ;;715262
DDSPRNT ;;5807476
DDSPRNT1 ;;6143957
DDSPRNT2 ;;6635920
DDSPTR ;;5615254
DDSR ;;11762224
DDSR1 ;;4368246
DDSRP ;;10909159
DDSRSEL ;;2891520
DDSRUN ;;2394396
DDSSTK ;;1339825
DDSU ;;6973319
DDSUTL ;;4198294
DDSVAL ;;6615562
DDSVALF ;;9378772
DDSVALM ;;2353363
DDSWP ;;4338025
DDSZ ;;12484472
DDSZ1 ;;8142794
DDSZ2 ;;5812032
DDSZ3 ;;1057668
DDU ;;507794
DDUCHK ;;11025820
DDUCHK1 ;;11082295
DDUCHK2 ;;14342401
DDUCHK3 ;;9674732
DDUCHK4 ;;8534482
DDUCHK5 ;;8811566
DDW ;;4525625
DDW1 ;;8085869
DDW2 ;;3003704
DDW3 ;;7169857
DDW4 ;;3466960
DDW5 ;;4768415
DDW6 ;;5565080
DDW7 ;;1987446
DDW8 ;;4623408
DDW9 ;;4724146
DDWC ;;4820991
DDWC1 ;;3199081
DDWF ;;2390870
DDWG ;;3372171
DDWH ;;2072618
DDWK ;;1046984
DDWT1 ;;7269456
DDXP ;;2531919
DDXP1 ;;8242677
DDXP2 ;;4539899
DDXP3 ;;6242061
DDXP31 ;;9598765
DDXP32 ;;4281540
DDXP33 ;;1831695
DDXP4 ;;13336427
DDXP41 ;;1471391
DDXP5 ;;883390
DDXPLIB ;;2740156
DI ;;384542
DIA ;;8551784
DIA1 ;;7309917
DIA2 ;;4443865
DIA3 ;;11065110
DIAC ;;960436
DIALOG ;;10887636
DIALOGU ;;1565705
DIALOGZ ;;7748039
DIAR ;;12160588
DIARA ;;13974071

DINTEG0
DINTEG0 ;ISC/XTSUMBLD KERNEL - Package checksum checker ;3130328.105856
 ;;0.0;
 ;;7.3;3130328.105856
 S XT4="I 1",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
CONT F XT1=1:1 S XT2=$T(ROU+XT1) Q:XT2=""  S X=$P(XT2," ",1),XT3=$P(XT2,";",3) X XT4 I $T W !,X X ^%ZOSF("TEST") S:'$T XT3=0 X:XT3 ^%ZOSF("RSUM") W ?10,$S('XT3:"Routine not in UCI",XT3'=Y:"Calculated "_$C(7)_Y_", off by "_(Y-XT3),1:"ok")
 G CONT^DINTEG01
 K %1,%2,%3,X,Y,XT1,XT2,XT3,XT4 Q
ONE S XT4="I $D(^UTILITY($J,X))",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
 W !,"Check a subset of routines:" K ^UTILITY($J) X ^%ZOSF("RSEL")
 W ! G CONT
ROU ;;
DIARB ;;6210401
DIARCALC ;;2572036
DIARR ;;10469571
DIARR1 ;;10326725
DIARR2 ;;4740869
DIARR3 ;;10772756
DIARR4 ;;4010759
DIARR5 ;;5439123
DIARR6 ;;5070511
DIARU ;;14044819
DIARX ;;8629637
DIAU ;;13580804
DIAUTL ;;12954017
DIAX ;;11303014
DIAXD ;;11580617
DIAXERR ;;600222
DIAXF ;;373535
DIAXG ;;1267519
DIAXG1 ;;7996370
DIAXG2 ;;3197219
DIAXGI ;;5956398
DIAXGU ;;2267957
DIAXM ;;9420934
DIAXM1 ;;4416751
DIAXM2 ;;8396635
DIAXM3 ;;5623823
DIAXMS ;;7778891
DIAXP ;;2094474
DIAXT ;;1965631
DIAXU ;;7159038
DIAXU1 ;;4154353
DIAXU2 ;;1494240
DIAXU3 ;;2533149
DIB ;;7420654
DIBT ;;13160438
DIBT1 ;;7178879
DIBTED ;;13770863
DIC ;;11568675
DIC0 ;;5309406
DIC1 ;;9102575
DIC11 ;;3603783
DIC2 ;;5409316
DIC3 ;;9981859
DIC4 ;;5939960
DIC5 ;;3570038
DICA ;;9728788
DICA1 ;;7228097
DICA2 ;;3685096
DICA3 ;;3728796
DICATT ;;8640678
DICATT0 ;;8008014
DICATT1 ;;6502567
DICATT2 ;;12404819
DICATT22 ;;6444175
DICATT3 ;;6386365
DICATT4 ;;11666091
DICATT5 ;;7007019
DICATT6 ;;5983581
DICATTA ;;7552001
DICATTD ;;12282976
DICATTD0 ;;1008871
DICATTD1 ;;3590571
DICATTD2 ;;2182668
DICATTD3 ;;2948456
DICATTD4 ;;2855134
DICATTD5 ;;429848
DICATTD6 ;;6072378
DICATTD7 ;;788242
DICATTD8 ;;6193536
DICATTD9 ;;506183
DICATTDD ;;1871734
DICATTDE ;;15027311
DICATTDK ;;3635015
DICATTDM ;;5350925
DICD ;;10002605
DICE ;;11949200
DICE0 ;;7809447
DICE1 ;;5892532
DICE2 ;;9062932
DICE3 ;;1063202
DICE4 ;;7544388
DICE7 ;;6858722
DICF ;;10584186
DICF0 ;;5111824
DICF1 ;;8801349
DICF2 ;;9016160
DICF3 ;;4045793
DICF4 ;;8445455
DICF5 ;;3414721
DICFIX ;;6906289
DICFIX1 ;;1467774
DICL ;;5164365
DICL1 ;;4176424
DICL10 ;;3112263
DICL2 ;;5022387
DICL3 ;;5035356
DICLGFT ;;7533082
DICLIB ;;770990
DICLIX ;;6715505
DICLIX0 ;;2323129
DICLIX1 ;;3152916
DICM ;;11996655
DICM0 ;;9049443
DICM1 ;;6091917
DICM2 ;;5964035
DICM3 ;;5385904
DICN ;;7388856
DICN0 ;;4314530
DICN1 ;;9179091
DICOMP ;;11541848
DICOMP0 ;;13214351
DICOMP1 ;;6217175
DICOMPU ;;11997281
DICOMPV ;;10057322
DICOMPW ;;10752261
DICOMPX ;;3958079
DICOMPY ;;3789933
DICOMPZ ;;14754942
DICQ ;;7546473
DICQ1 ;;10374468
DICR ;;7789469
DICRW ;;7352883
DICRW1 ;;997104
DICU ;;3375146
DICU1 ;;9241559
DICU11 ;;3663044
DICU2 ;;9632393
DICUF ;;2317073
DICUIX ;;7627920
DICUIX1 ;;4411553
DICUIX2 ;;9731797
DID ;;15350034
DID1 ;;14692864
DID2 ;;13085140
DIDC ;;9043416
DIDG ;;5776200
DIDGFTPT ;;9162011
DIDH ;;7714192
DIDH1 ;;11226423
DIDT ;;8743843
DIDTC ;;8971022
DIDU ;;8575577
DIDU1 ;;1818550
DIDU2 ;;3871422
DIDX ;;9195035
DIE ;;13040433
DIE0 ;;5301533
DIE1 ;;10712389
DIE17 ;;10844007
DIE2 ;;9316515
DIE3 ;;5425928
DIE9 ;;5169923
DIED ;;12205846
DIEF ;;12430358
DIEF1 ;;9297659
DIEFU ;;4773462
DIEFW ;;3208043
DIEH ;;6387130
DIEH1 ;;1748849
DIEKMSG ;;4110527
DIENV ;;1166929
DIENVSTP ;;1202956
DIENVWRN ;;3205436
DIEQ ;;7179543
DIEQ1 ;;1766980
DIET ;;4891056
DIETED ;;14308083
DIEV ;;11177734
DIEV1 ;;4603516
DIEVK ;;6784329
DIEVK1 ;;5322030
DIEVS ;;2361740

DINTEG01
DINTEG01 ;ISC/XTSUMBLD KERNEL - Package checksum checker ;3130328.105856
 ;;0.0;
 ;;7.3;3130328.105856
 S XT4="I 1",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
CONT F XT1=1:1 S XT2=$T(ROU+XT1) Q:XT2=""  S X=$P(XT2," ",1),XT3=$P(XT2,";",3) X XT4 I $T W !,X X ^%ZOSF("TEST") S:'$T XT3=0 X:XT3 ^%ZOSF("RSUM") W ?10,$S('XT3:"Routine not in UCI",XT3'=Y:"Calculated "_$C(7)_Y_", off by "_(Y-XT3),1:"ok")
 G CONT^DINTEG02
 K %1,%2,%3,X,Y,XT1,XT2,XT3,XT4 Q
ONE S XT4="I $D(^UTILITY($J,X))",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
 W !,"Check a subset of routines:" K ^UTILITY($J) X ^%ZOSF("RSEL")
 W ! G CONT
ROU ;;
DIEZ ;;10335535
DIEZ0 ;;11969014
DIEZ1 ;;9399279
DIEZ2 ;;15888961
DIEZ3 ;;1411089
DIEZ4 ;;4949942
DIFG ;;9620802
DIFG0 ;;9271581
DIFG0A ;;4953135
DIFG0B ;;3277889
DIFG1 ;;6466432
DIFG2 ;;6268614
DIFG3 ;;11191749
DIFG3A ;;5426591
DIFG4 ;;11076453
DIFG4A ;;4158452
DIFG5 ;;11716060
DIFG6 ;;12531183
DIFG7 ;;3502068
DIFGA ;;10149588
DIFGA1 ;;1674663
DIFGB ;;7602021
DIFGG ;;5089070
DIFGG2 ;;9806486
DIFGG4 ;;5207113
DIFGGI ;;5710645
DIFGGSB ;;483886
DIFGGSB1 ;;8206690
DIFGGSB2 ;;5150555
DIFGGU ;;5525512
DIFGO ;;3226616
DIFGSRV ;;1145738
DIFROM ;;11032661
DIFROM0 ;;9499981
DIFROM1 ;;12432103
DIFROM11 ;;9004800
DIFROM12 ;;6412655
DIFROM2 ;;9418009
DIFROM3 ;;7738215
DIFROM4 ;;4141771
DIFROM41 ;;14320255
DIFROM42 ;;3818444
DIFROM5 ;;13318228
DIFROM6 ;;8014990
DIFROM7 ;;5885905
DIFROMH ;;8930417
DIFROMH1 ;;7701962
DIFROMS ;;1767005
DIFROMS1 ;;7099006
DIFROMS2 ;;9830153
DIFROMS3 ;;8999406
DIFROMS4 ;;4164646
DIFROMS5 ;;4436363
DIFROMS6 ;;868273
DIFROMSB ;;1316407
DIFROMSC ;;1542160
DIFROMSD ;;3813216
DIFROMSE ;;5059847
DIFROMSF ;;8096661
DIFROMSI ;;8209247
DIFROMSK ;;1707783
DIFROMSO ;;1615788
DIFROMSP ;;7375587
DIFROMSR ;;4932510
DIFROMSS ;;3490849
DIFROMSU ;;5222720
DIFROMSV ;;89285
DIFROMSX ;;4398560
DIFROMSY ;;4367849
DIG ;;15662043
DIH ;;5673692
DII ;;7517633
DII1 ;;468832
DIINI001 ;;24494289
DIINI002 ;;22279889
DIINI003 ;;24020302
DIINI004 ;;24945297
DIINI005 ;;29784001
DIINI006 ;;22664857
DIINI007 ;;988738
DIINIS ;;2127703
DIINIT ;;10258048
DIINIT1 ;;6645556
DIINIT2 ;;5232051
DIINIT3 ;;16989229
DIINIT4 ;;3363161
DIINIT5 ;;364747
DIINITPR ;;706960
DIIS ;;417740
DIISC ;;7520
DIISS ;;2408793
DIK ;;15947474
DIK1 ;;7678804
DIKC ;;12762190
DIKC1 ;;4996781
DIKC2 ;;5734020
DIKCBLD ;;7934562
DIKCDD ;;598101
DIKCFORM ;;11173576
DIKCP ;;4146288
DIKCP1 ;;7824170
DIKCP2 ;;2304021
DIKCP3 ;;4532184
DIKCR ;;10409315
DIKCU ;;3210281
DIKCU1 ;;3896028
DIKCU2 ;;4020096
DIKCUTL ;;3445028
DIKCUTL1 ;;6521169
DIKCUTL2 ;;7148124
DIKCUTL3 ;;7743356
DIKD ;;3791818
DIKD1 ;;2907868
DIKD2 ;;2209576
DIKK ;;8668460
DIKK1 ;;2999261
DIKK2 ;;7020127
DIKKDD ;;619322
DIKKFORM ;;4020610
DIKKP ;;4960174
DIKKUTL ;;8683522
DIKKUTL1 ;;7444359
DIKKUTL2 ;;3321012
DIKKUTL3 ;;5832605
DIKKUTL4 ;;5542445
DIKZ ;;10440605
DIKZ0 ;;10502041
DIKZ1 ;;9595553
DIKZ11 ;;4558086
DIKZ2 ;;5244243
DIL ;;5906383
DIL0 ;;6326835
DIL1 ;;5814538
DIL11 ;;6690394
DIL2 ;;8492299
DILF ;;2353909
DILFD ;;231253
DILIBF ;;7332737
DILL ;;6976480
DIM ;;2383633
DIM1 ;;6143520
DIM2 ;;4719801
DIM3 ;;4402867
DIM4 ;;3292224
DINIT ;;17645149
DINIT0 ;;6843141
DINIT001 ;;14519921
DINIT002 ;;13586309
DINIT003 ;;1581370
DINIT004 ;;11018014
DINIT005 ;;10186263
DINIT006 ;;11577960
DINIT007 ;;10157790
DINIT008 ;;10934076
DINIT009 ;;10025795
DINIT00A ;;10964723
DINIT00B ;;10114739
DINIT00C ;;11848580
DINIT00D ;;9602595
DINIT00E ;;9691716
DINIT00F ;;10461606
DINIT00G ;;11627134
DINIT00H ;;8865487
DINIT00I ;;8471256
DINIT00J ;;7135523

DINTEG02
DINTEG02 ;ISC/XTSUMBLD KERNEL - Package checksum checker ;3130328.105856
 ;;0.0;
 ;;7.3;3130328.105856
 S XT4="I 1",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
CONT F XT1=1:1 S XT2=$T(ROU+XT1) Q:XT2=""  S X=$P(XT2," ",1),XT3=$P(XT2,";",3) X XT4 I $T W !,X X ^%ZOSF("TEST") S:'$T XT3=0 X:XT3 ^%ZOSF("RSUM") W ?10,$S('XT3:"Routine not in UCI",XT3'=Y:"Calculated "_$C(7)_Y_", off by "_(Y-XT3),1:"ok")
 G CONT^DINTEG03
 K %1,%2,%3,X,Y,XT1,XT2,XT3,XT4 Q
ONE S XT4="I $D(^UTILITY($J,X))",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
 W !,"Check a subset of routines:" K ^UTILITY($J) X ^%ZOSF("RSEL")
 W ! G CONT
ROU ;;
DINIT00K ;;7441398
DINIT00L ;;9975842
DINIT00M ;;10643142
DINIT00N ;;10074314
DINIT00O ;;13862238
DINIT00P ;;8603615
DINIT00Q ;;16237923
DINIT00R ;;14540702
DINIT00S ;;9827241
DINIT00T ;;12898955
DINIT00U ;;9632337
DINIT00V ;;12446419
DINIT00W ;;11766023
DINIT00X ;;11526317
DINIT00Y ;;8368445
DINIT00Z ;;9947320
DINIT010 ;;1380027
DINIT011 ;;30656895
DINIT012 ;;24741193
DINIT013 ;;8627021
DINIT02 ;;2462843
DINIT07 ;;6455482
DINIT08 ;;7989773
DINIT0F0 ;;6213047
DINIT0F1 ;;5526766
DINIT0F2 ;;6166378
DINIT0F3 ;;4903781
DINIT0F4 ;;6295373
DINIT0F5 ;;10926226
DINIT0F6 ;;6406624
DINIT0F7 ;;4763304
DINIT0F8 ;;7268905
DINIT0F9 ;;6468133
DINIT0FA ;;9430600
DINIT0FB ;;10086109
DINIT0FC ;;5772591
DINIT0FD ;;6456159
DINIT0FE ;;7693306
DINIT0FF ;;9380530
DINIT0FG ;;10533197
DINIT0FH ;;8855011
DINIT0FI ;;5459391
DINIT0FJ ;;5577122
DINIT0FK ;;5843271
DINIT0FL ;;9505191
DINIT0FM ;;19265777
DINIT0FN ;;11731152
DINIT1 ;;6696730
DINIT11 ;;10021781
DINIT11A ;;9722995
DINIT11B ;;3438340
DINIT11C ;;9059795
DINIT12 ;;12142422
DINIT120 ;;13965698
DINIT121 ;;16775435
DINIT122 ;;14151880
DINIT123 ;;15919572
DINIT124 ;;18245323
DINIT125 ;;14791473
DINIT126 ;;14076027
DINIT127 ;;1844442
DINIT13 ;;8945084
DINIT14 ;;3334388
DINIT2 ;;729944
DINIT20 ;;11490219
DINIT21 ;;11982360
DINIT22 ;;1548661
DINIT220 ;;487349
DINIT24 ;;16605343
DINIT25 ;;8381842
DINIT250 ;;4565635
DINIT255 ;;3074177
DINIT26 ;;7234739
DINIT260 ;;7558780
DINIT27 ;;8893587
DINIT270 ;;8954842
DINIT271 ;;4962636
DINIT27A ;;4535134
DINIT27B ;;3392667
DINIT27C ;;3010708
DINIT27D ;;3129310
DINIT27E ;;2362322
DINIT27F ;;7294806
DINIT27G ;;7287275
DINIT27H ;;991763
DINIT27I ;;1784973
DINIT27J ;;4891073
DINIT27K ;;4910854
DINIT28 ;;2224020
DINIT285 ;;9217149
DINIT286 ;;2757795
DINIT287 ;;939077
DINIT290 ;;12614928
DINIT291 ;;13776210
DINIT292 ;;15577854
DINIT293 ;;12536275
DINIT294 ;;13200285
DINIT295 ;;13386768
DINIT296 ;;14721519
DINIT297 ;;15885974
DINIT298 ;;13172471
DINIT299 ;;4171222
DINIT29P ;;4073783
DINIT2A0 ;;14158575
DINIT2A1 ;;14321834
DINIT2A2 ;;15620797
DINIT2A3 ;;14102819
DINIT2A4 ;;10531062
DINIT2A5 ;;13007561
DINIT2A6 ;;1584040
DINIT2AA ;;11408392
DINIT2AB ;;1806296
DINIT2AC ;;584349
DINIT2B0 ;;2944946
DINIT2B1 ;;1938633
DINIT2B2 ;;4698975
DINIT2B3 ;;9453897
DINIT2B4 ;;2674007
DINIT2B5 ;;3829788
DINIT2B6 ;;3933969
DINIT2B7 ;;7974587
DINIT2B8 ;;4876657
DINIT2B9 ;;9536397
DINIT2BA ;;4224327
DINIT2BB ;;7365189
DINIT2BC ;;3580721
DINIT2BD ;;1744928
DINIT2BE ;;4515155
DINIT2C0 ;;10300535
DINIT3 ;;10297485
DINIT4 ;;8484409
DINIT41 ;;11669306
DINIT42 ;;13893894
DINIT5 ;;10531980
DINIT6 ;;7574890
DINIT901 ;;8486584
DINIT902 ;;7020645
DINIT903 ;;9342905
DINIT904 ;;8025816
DINIT905 ;;8365057
DINIT906 ;;9983555
DINIT907 ;;9488620
DINIT908 ;;8420237
DINIT909 ;;9157496
DINIT910 ;;7428899
DINIT911 ;;10305702
DINITPST ;;230107
DINVGTM ;;1185055
DINVGUX ;;1174924
DINVONT ;;5190925
DINZONT ;;4158081
DIO ;;7253177

DINTEG03
DINTEG03 ;ISC/XTSUMBLD KERNEL - Package checksum checker ;3130328.105856
 ;;0.0;
 ;;7.3;3130328.105856
 S XT4="I 1",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
CONT F XT1=1:1 S XT2=$T(ROU+XT1) Q:XT2=""  S X=$P(XT2," ",1),XT3=$P(XT2,";",3) X XT4 I $T W !,X X ^%ZOSF("TEST") S:'$T XT3=0 X:XT3 ^%ZOSF("RSUM") W ?10,$S('XT3:"Routine not in UCI",XT3'=Y:"Calculated "_$C(7)_Y_", off by "_(Y-XT3),1:"ok")
 G CONT^DINTEG04
 K %1,%2,%3,X,Y,XT1,XT2,XT3,XT4 Q
ONE S XT4="I $D(^UTILITY($J,X))",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
 W !,"Check a subset of routines:" K ^UTILITY($J) X ^%ZOSF("RSEL")
 W ! G CONT
ROU ;;
DIO0 ;;11335680
DIO1 ;;6768991
DIO2 ;;3530897
DIO3 ;;4274570
DIO4 ;;7594889
DIOC ;;774422
DIOQ ;;935142
DIOS ;;7277161
DIOS1 ;;1071375
DIOU ;;6021642
DIOZ ;;5495029
DIP ;;15108081
DIP0 ;;10462766
DIP1 ;;11072955
DIP10 ;;5158897
DIP100 ;;9523097
DIP11 ;;10556175
DIP12 ;;7519827
DIP2 ;;8117702
DIP21 ;;13316150
DIP22 ;;8523676
DIP23 ;;467210
DIP3 ;;12962678
DIP31 ;;1478503
DIP4 ;;3522182
DIP5 ;;13466182
DIPKI001 ;;11994951
DIPKI002 ;;13583361
DIPKI003 ;;16344686
DIPKI004 ;;9299430
DIPKI005 ;;12415096
DIPKI006 ;;12648954
DIPKI007 ;;11376629
DIPKI008 ;;9312880
DIPKI009 ;;1334837
DIPKI00A ;;802153
DIPKI00B ;;1691482
DIPKI00C ;;4378943
DIPKI00D ;;802177
DIPKI00E ;;3841062
DIPKINI1 ;;4282951
DIPKINI2 ;;5232585
DIPKINI3 ;;16994134
DIPKINI4 ;;3363697
DIPKINI5 ;;446749
DIPKINIS ;;2210516
DIPKINIT ;;10363975
DIPT ;;9448229
DIPTED ;;14510920
DIPZ ;;8638736
DIPZ0 ;;2772942
DIPZ1 ;;3249021
DIPZ2 ;;7811969
DIQ ;;19927579
DIQ1 ;;4784161
DIQG ;;16641148
DIQGDD ;;6628788
DIQGDD0 ;;1846736
DIQGDDF ;;1999058
DIQGDDT ;;7439520
DIQGDDU ;;1578963
DIQGQ ;;18473550
DIQGU ;;3402405
DIQGU0 ;;3019674
DIQQ ;;8231726
DIQQ1 ;;1279104
DIQQQ ;;3645701
DIR ;;13664238
DIR0 ;;5679087
DIR01 ;;7848406
DIR02 ;;1846607
DIR03 ;;4474708
DIR0H ;;2381743
DIR0K ;;2374603
DIR0W ;;3089175
DIR1 ;;12518642
DIR2 ;;10212868
DIR3 ;;3309472
DIRCR ;;1484684
DIRQ ;;968045
DIS ;;12609000
DIS0 ;;7905684
DIS1 ;;6497480
DIS2 ;;5801147
DIS3 ;;1548747
DIT ;;9272157
DIT0 ;;2880511
DIT1 ;;10637476
DIT2 ;;2621259
DIT3 ;;5880904
DITC ;;8730630
DITC0 ;;3191582
DITC1 ;;5739425
DITC2 ;;9411545
DITC3 ;;4586809
DITCP ;;29077235
DITCP0 ;;4067433
DITCPL ;;5158524
DITM ;;3764313
DITM1 ;;3291696
DITM2 ;;4300014
DITMGM1 ;;3241730
DITMGM2 ;;3998925
DITMGM2A ;;7046732
DITMGM2B ;;3795853
DITMGM2C ;;3474737
DITMGMRG ;;4301374
DITMGMRI ;;3560391
DITMU1 ;;267174
DITMU2 ;;1127015
DITMU3 ;;422892
DITMU4 ;;7174363
DITP ;;7337465
DITR ;;6433335
DITR1 ;;9113636
DIU ;;4891927
DIU0 ;;5560691
DIU1 ;;11600398
DIU2 ;;8039666
DIU20 ;;3218765
DIU21 ;;7344605
DIU3 ;;6485308
DIU31 ;;10000710
DIU4 ;;5389344
DIU5 ;;251900
DIUTL ;;2304103
DIV ;;5837986
DIVC ;;4408241
DIVR ;;13335922
DIVR1 ;;10953209
DIVRE ;;7310913
DIVRE1 ;;634136
DIVRPTR ;;5610174
DIVU ;;3100544
DIWE ;;8079462
DIWE1 ;;6026184
DIWE11 ;;1773090
DIWE12 ;;5390718
DIWE2 ;;6980282
DIWE3 ;;11678817
DIWE4 ;;11274075
DIWE5 ;;4562047
DIWF ;;5546305
DIWP ;;5722064
DIWW ;;5101199
DIX ;;2389547
DIXC ;;5479059
DMLAC000 ;;5985105
DMLAC001 ;;7594398
DMLAC002 ;;7765846
DMLAC003 ;;9245658
DMLAC004 ;;9254955
DMLAC005 ;;6624300
DMLAI001 ;;30832793
DMLAI002 ;;24945891
DMLAI003 ;;1381350
DMLAI004 ;;14787880
DMLAI005 ;;12237061
DMLAI006 ;;11161857
DMLAI007 ;;1838797
DMLAI008 ;;838242
DMLAI009 ;;790299
DMLAINI1 ;;6757344
DMLAINI2 ;;5232541
DMLAINI3 ;;16993506
DMLAINI4 ;;3363653
DMLAINI5 ;;419539
DMLAINIT ;;10072774
DMSQ ;;10102863
DMSQD ;;8773197
DMSQE ;;843826
DMSQF ;;9792265

DINTEG04
DINTEG04 ;ISC/XTSUMBLD KERNEL - Package checksum checker ;3130328.105856
 ;;0.0;
 ;;7.3;3130328.105856
 S XT4="I 1",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
CONT F XT1=1:1 S XT2=$T(ROU+XT1) Q:XT2=""  S X=$P(XT2," ",1),XT3=$P(XT2,";",3) X XT4 I $T W !,X X ^%ZOSF("TEST") S:'$T XT3=0 X:XT3 ^%ZOSF("RSUM") W ?10,$S('XT3:"Routine not in UCI",XT3'=Y:"Calculated "_$C(7)_Y_", off by "_(Y-XT3),1:"ok")
 ;
 K %1,%2,%3,X,Y,XT1,XT2,XT3,XT4 Q
ONE S XT4="I $D(^UTILITY($J,X))",X=$T(+3) W !!,"Checksum routine created on ",$P(X,";",4)," by KERNEL V",$P(X,";",3),!
 W !,"Check a subset of routines:" K ^UTILITY($J) X ^%ZOSF("RSEL")
 W ! G CONT
ROU ;;
DMSQF1 ;;8518725
DMSQF2 ;;8370804
DMSQP ;;2371815
DMSQP1 ;;3565656
DMSQP2 ;;6721470
DMSQP3 ;;11874271
DMSQP4 ;;2151271
DMSQP5 ;;5423594
DMSQP6 ;;10074783
DMSQS ;;3197279
DMSQT ;;11672859
DMSQT1 ;;1181888
DMSQU ;;10591593
DMUDIC00 ;;10701809
DMUDIQ00 ;;9988005
DMUDT000 ;;12746369
DMUDTC00 ;;18033717
DMUFI001 ;;3467869
DMUFI002 ;;1562200
DMUFI003 ;;23923394
DMUFI004 ;;12332775
DMUFI005 ;;12250471
DMUFI006 ;;12318335
DMUFI007 ;;12429701
DMUFI008 ;;12409676
DMUFI009 ;;12367037
DMUFI00A ;;12356350
DMUFI00B ;;12385288
DMUFI00C ;;12357393
DMUFI00D ;;12364681
DMUFI00E ;;12637287
DMUFI00F ;;12855849
DMUFI00G ;;12403335
DMUFI00H ;;10649028
DMUFI00I ;;2264562
DMUFINI1 ;;6637877
DMUFINI2 ;;5232588
DMUFINI3 ;;16994356
DMUFINI4 ;;3363700
DMUFINI5 ;;617975
DMUFINIS ;;2211412
DMUFINIT ;;10131528

DINVGTM
DINVGTM ; VEN/SMH - GT.M (VMS) Specific Functions; 30NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DEL(RN) ; Delete Routine; Fileman Entry Point.
 ; Input: Routine Name by Value
 ; Output: None
 ; Routine is NOT SAC Compliant due to use of GT.M specific IO parameters
LOOP ; Loop entry point
 N %ZR ; Output from GT.M %RSEL
 N %S,%O ; Source directory, object directory 
 ; 
 ; NB: For future works, %RSEL support * syntax to get a bunch of routines
 D SILENT^%RSEL(RN,"SRC") S %S=$G(%ZR(RN)) ; Source Directory
 D SILENT^%RSEL(RN,"OBJ") S %O=$G(%ZR(RN)) ; Object Directory
 ;
 I '$L(%S)&('$L(%O)) QUIT
 ;
 S RN=$TR(RN,"%","_") ; change % to _ in routine name
 ;
 N $ET,$ES S $ET="Q:$ES  S $EC="""" Q" ; In case somebody else deletes this; we don't crash
 ;
 I $L(%S) D  ; If source routine present?
 . O %S_RN_".m":(readonly):0
 . E  Q
 . C %S_RN_".m":(delete)
 ;
 I $L(%O) D  ; If object code present?
 . O %O_RN_".obj":(readonly):0
 . E  Q
 . C %O_RN_".obj":(delete)
 G LOOP

DINVGUX
DINVGUX ; VEN/SMH - GT.M (Unix) Specific Functions; 30NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DEL(RN) ; Delete Routine; Fileman Entry Point.
 ; Input: Routine Name by Value
 ; Output: None
 ; Routine is NOT SAC Compliant due to use of GT.M specific IO parameters
LOOP ; Loop entry point
 N %ZR ; Output from GT.M %RSEL
 N %S,%O ; Source directory, object directory 
 ; 
 ; NB: For future works, %RSEL support * syntax to get a bunch of routines
 D SILENT^%RSEL(RN,"SRC") S %S=$G(%ZR(RN)) ; Source Directory
 D SILENT^%RSEL(RN,"OBJ") S %O=$G(%ZR(RN)) ; Object Directory
 ;
 I '$L(%S)&('$L(%O)) QUIT
 ;
 S RN=$TR(RN,"%","_") ; change % to _ in routine name
 ;
 N $ET,$ES S $ET="Q:$ES  S $EC="""" Q" ; In case somebody else deletes this; we don't crash
 ;
 I $L(%S) D  ; If source routine present?
 . O %S_RN_".m":(readonly):0
 . E  Q
 . C %S_RN_".m":(delete)
 ;
 I $L(%O) D  ; If object code present?
 . O %O_RN_".o":(readonly):0
 . E  Q
 . C %O_RN_".o":(delete)
 G LOOP

DINVONT
%ZOSV ;SFISC/AC - $View commands for Open M for NT.  ;2:42 PM  1 Oct 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ACTJ() ;# Active jobs
 N Y,% S %=0 F Y=0:1 S %=$ZJ(%) Q:%=""
 Q Y
AVJ() ;# available jobs
 ;Return fixed value if version < 2.1.6 (e.i. not Cache)
 N v S v=$$VERSION($ZV) I 216>$TR(v,".") Q 15 ;
 N maxpid s maxpid=$v($zu(40,2,118),-2,4) ;from %SS
 Q maxpid-$$ACTJ() ;need ISM to provide maxpid in ^%MACHINE
PRIINQ() ;
 Q 8
UCI ;Current UCI
 S Y=$ZU(5)_","_^%ZOSF("VOL") Q
 ;
UCICHECK(X) ;Check if valid UCI
 N Y,%
 S %=$P(X,",",1),Y=0 I $ZU(90,10,%) S Y=%
 Q Y
JOBPAR ;See if X points to a valid Job. Return its UCI.
 N ZJ S Y="",$ZT="JOBX"
 Q:'$D(^$JOB(X))  S Y=$V(-1,X),Y=$P(Y,"^",14)_","_^%ZOSF("VOL")
JOBX Q
 ;
T0 ; start RT clock
 S XRT0=$H Q
T1 ; store RT datum
 S ^%ZRTL(3,XRTL,+$H,XRTN,$P($H,",",2))=XRT0 K XRT0 Q
NOLOG ;
 S Y="$V(0,-2,4)\4096#2" Q
 ;
PROGMODE() ;Check if in PROG mode
 Q $ZJ#2
 ;
PRGMODE ;
 W ! S ZTPAC=$S('$D(^VA(200,+DUZ,.1)):"",1:$P(^(.1),U,5)),XUVOL=^%ZOSF("VOL")
 S X="" X ^%ZOSF("EOFF") R:ZTPAC]"" !,"PAC: ",X:60 D LC^XUS X ^%ZOSF("EON") I X'=ZTPAC W "??",*7 Q
 S XMB="XUPROGMODE",XMB(1)=DUZ,XMB(2)=$I D ^XMB:$L($T(^XMB)) D BYE^XUSCLEAN K ZTPAC,X,XMB
 D UCI S XUCI=Y,XQZ="PRGM^ZUA[MGR]",XUSLNT=1 D DO^%XUCI D ^%PMODE U $I:("":"+B+C+R") S $ZT="" Q
 Q
LGR() S $ZT="LGRX^%ZOSV"
 Q $ZR ;Last Global ref.
LGRX Q ""
 ;
EC() Q $ZE ;Error code
 ;
DOLRO ;SAVE ENTIRE SYMBOL TABLE IN LOCATION SPECIFIED BY X
 S Y="%" F %=0:0 S Y=$O(@Y) Q:Y=""  S %=$D(@Y) S:%#2 @(X_"Y)="_Y) I %>9 S %X=Y_"(",%Y=X_"Y," D %XY^%RCR
 Q
 ;
ORDER ;SAVE PART OF SYMBOL TABLE IN LOCATION SPECIFIED BY X
 S (Y,Y1)=$P(Y,"*",1) I $D(@Y)=0 F %=0:0 S Y=$O(@Y) Q:Y=""!(Y[Y1)
 Q:Y=""  S %=$D(@Y) S:%#2 @(X_"Y)="_Y) I %>9 S %X=Y_"(",%Y=X_"Y," D %XY^%RCR
 F %=0:0 S Y=$O(@Y) Q:Y=""!(Y'[Y1)  S %=$D(@Y) S:%#2 @(X_"Y)="_Y) I %>9 S %X=Y_"(",%Y=X_"Y," D %XY^%RCR
 K %,X,Y,Y1 Q
 ;
PARSIZ ;
 S X=3 Q
 ;
DEVOPN ;List of Devices opened
 ;Returns variable Y. Y=Devices owned separated by a comma
 S X=$J
 N % S Y=$P($V(-1,$J),"^",3) F %=1:1:$L(Y,",") S $P(Y,",",%)=$P($P(Y,",",%),"*",1)
 Q
DEVOK ;
 S Y=0,X1=$G(X1) Q:X=2  Q:(X1="HFS")!(X1="MT")  G:X1="RES" RES ;Quit w/ OK for HFS, Spool, MT
 S $ZT="OPNERR"
 O X::$S($D(%ZISTO):%ZISTO,1:0) E  S Y=999 Q  ;G NOPN
 S Y=0 I '$D(%ZISCHK)!$S($D(%ZIS)#2:(%ZIS["T"),1:0) C X Q
 S:X]"" IO(1,X)="" Q
 Q
NOPN ;
 N ZJ S $ZT="NJ"
 S ZJ="" F %=0:0 S ZJ=$ZJ(ZJ) Q:'ZJ  D NOPN1 Q:'ZJ
 Q
NOPN1 S Y=$V(-1,ZJ) I $P(Y,"^",3)[X_","!($P(Y,"^",3)[X_"*,") S Y=ZJ,ZJ="" Q
 Q
NJ Q  ;NOJOB ERROR
OPNERR S Y=-1 Q
 ;
RES S Y=0,%ZISD0=$O(^%ZISL(3.54,"B",X,0))
 I '%ZISD0 S Y=-1,%ZISD0=%O(^%ZIS(1,"C",X)) Q:'%ZISD0  Q:'$D(^%ZIS(1,+%ZISD0,0))  Q:$P(^(0),"^")'=X  Q:'$D(^("TYPE"))  Q:^("TYPE")'="RES"  S Y=0 Q
 S X1=$S($D(^%ZISL(3.54,+%ZISD0,0)):^(0),1:"")
 I $P(X1,"^",2)&(X=$P(X1,"^")) S Y=0 Q
 S Y=999 F %ZISD1=0:0 S %ZISD1=$O(^%ZISL(3.54,%ZISD0,1,%ZISD1)) Q:%ZISD1'>0  I $D(^(%ZISD1,0)) S Y=$P(^(0),"^",3) Q
 K %ZISD0,%ZISD1
 Q
GETENV ;Get environment  (UCI^VOL^NODE)
 X ^%ZOSF("UCI") S Y=$P(Y,",")_"^"_^%ZOSF("VOL")_"^"_$ZU(110)_"^"_^%ZOSF("VOL")
 Q
VERSION(X) ;return OS version, X=1 - return OS
 Q $S($G(X):$P($ZV,")")_")",1:$P($P($ZV,") ",2),"("))
 ;
SETNM(X) ;Set name, Fall into SETENV
SETENV ;Set environment
 Q
 ;
HFSREW(IO,IOPAR) ;Rewind Host File.
 S $ZT="HFSRWERR"
 C IO O @(""""_IO_""""_$S(IOPAR]"":":"_IOPAR_":1",1:":1")) I '$T Q 0
 Q 1
HFSRWERR ;Error encountered
 Q 0
LOGRSRC(OPT) ;record resource usage in ^XTMP("KMPR"
 D RO^%ZOSVKR(OPT)
 Q
SETTRM(X) ;Turn on specified terminators.
 U $I:(::X)
 Q 1

DINZONT
DINZONT ;SFISC/AC - SETS UP ^%ZOSF FOR Open M for NT ;2:45 PM  1 Oct 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^%ZOSF("MASTER"),^%ZOSF("SIGNOFF")
 F I=1:2 S Z=$P($T(Z+I),";;",2) Q:Z=""  S X=$P($T(Z+1+I),";;",2,99) S ^%ZOSF(Z)=X
 S ^%ZOSF("OS")="CACHE/OpenM^18"
 K I,X,Z
 Q
Z ;;
 ;;ACTJ
 ;;S Y=$$ACTJ^%ZOSV()
 ;;AVJ
 ;;S Y=$$AVJ^%ZOSV()
 ;;BRK
 ;;U $I:("":"+B")
 ;;DEL
 ;;X "ZR  ZS @X" K ^UTILITY("ROU",X)
 ;;EOFF
 ;;U $I:("":"+S")
 ;;EON
 ;;U $I:("":"-S")
 ;;EOT
 ;;S Y=$ZA\1024#2
 ;;ERRTN
 ;;^%ZTER
 ;;ETRP
 ;;Q
 ;;GD
 ;;D ^%GD
 ;;JOBPARAM
 ;;D JOBPAR^%ZOSV
 ;;LABOFF
 ;;U IO:("":"+S+I-T":$C(13,27))
 ;;LOAD
 ;;S %N=0 X "ZL @X F XCNP=XCNP+1:1 S %N=%N+1,%=$T(+%N) Q:$L(%)=0  S @(DIF_XCNP_"",0)"")=%"
 ;;LPC
 ;;S Y=$ZC(X)
 ;;MAXSIZ
 ;;S $ZS=X+X
 ;;MAGTAPE
 ;;S %MT("BS")="*-1",%MT("FS")="*-2",%MT("WTM")="*-3",%MT("WB")="*-4",%MT("REW")="*-5",%MT("RB")="*-6",%MT("REL")="*-7",%MT("WHL")="*-8",%MT("WEL")="*-9"
 ;;MTBOT
 ;;S Y=$ZA\32#2
 ;;MTONLINE
 ;;S Y=$ZA\64#2
 ;;MTWPROT
 ;;S Y=$ZA\4#2
 ;;MTERR;;MAGTAPE ERROR
 ;;S Y=$ZA\32768#2
 ;;NBRK
 ;;U $I:("":"-B")
 ;;NO-PASSALL
 ;;U $I:("":"-I+T")
 ;;NO-TYPE-AHEAD
 ;;U $I:("":"+F":$C(13,27))
 ;;PASSALL
 ;;U $I:("":"+I-T")
 ;;PRIINQ;; Priority in current queue
 ;;N %PRIO D ^%PRIO S Y=$S('%PRIO:5,%PRIO>0:8,1:3)
 ;;PRIORITY;;set priority to X (1=low, 10=high)
 ;;D @($S(X>7:"NORMAL",X>3:"NORMAL",1:"LOW")_"^%PRIO") ;Don't do HIGH
 ;;PROGMODE
 ;;S Y=$ZJ#2
 ;;RD
 ;;D ^%RD
 ;;RESJOB
 ;;Q:'$D(DUZ)  Q:'$D(^XUSEC("XUMGR",+DUZ))  N XQZ S XQZ="^RESJOB[MGR]" D DO^%XUCI
 ;;RM
 ;;U $I:X
 ;;RSEL;;ROUTINE SELECT
 ;;K ^UTILITY($J) D KERNEL^%RSET K %ST ;Special entry point for VA
 ;;RSUM
 ;;ZL @X S Y=0 F %=1,3:1 S %1=$T(+%),%3=$F(%1," ") Q:'%3  S %3=$S($E(%1,%3)'=";":$L(%1),$E(%1,%3+1)=";":$L(%1),1:%3-2) F %2=1:1:%3 S Y=$A(%1,%2)*%2+Y
 ;;SS
 ;;D ^%SS
 ;;SAVE
 ;;S XCS="F XCM=1:1 S XCN=$O(@(DIE_XCN_"")"")) Q:+XCN'=XCN  S %=^(XCN,0) Q:$E(%,1)=""$""  I $E(%,1)'="";"" ZI %" X "ZR  X XCS ZS @X" S ^UTILITY("ROU",X)="" K XCS
 ;;SIZE
 ;;S Y=0 F I=1:1 S %=$T(+I) Q:%=""  S Y=Y+$L(%)+2
 ;;TEST
 ;;I X?1(1"%",1A).7AN,$D(^$ROUTINE(X))
 ;;TMK;;MAGTAPE MARK
 ;;S Y=$ZA\4#2
 ;;TRAP;;S X="^%ET",@^%ZOSF("TRAP") TO SET ERROR TRAP
 ;;$ZT=X
 ;;TRMOFF
 ;;U $I:("":"-I-T":$C(13,27))
 ;;TRMON
 ;;U $I:("":"+I+T")
 ;;TRMRD
 ;;S Y=$A($ZB),Y=$S(Y<32:Y,Y=127:Y,1:0)
 ;;TYPE-AHEAD
 ;;U $I:("":"-F":$C(13,27))
 ;;UCI
 ;;D UCI^%ZOSV
 ;;UCICHECK
 ;;S Y=$$UCICHECK^%ZOSV(X)
 ;;UPPERCASE
 ;;S Y=$TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 ;;XY
 ;;S $X=DX,$Y=DY
 ;;ZD
 ;;S Y=$ZD(X)

DIO
DIO ;SFISC/GFT,TKW-CALL SORT, ACTUAL OUTPUT ;7:15 AM  27 May 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S Y=-1 K:$D(DCL)>9 ^DOSV(0,IO(0)) F Z=0:1 S Y=$O(DCL(Y)) Q:Y=""  S V=DCL(Y),^DOSV(0,IO(0),"F",+V)=Y_U_$P($G(^DD(+Y,+$P(Y,U,2),0)),U,1,2)
 I $G(DIOEND)["M^DIAU"!($G(DIOEND)["L^DIDC") S %X="DPP(",%Y="DIPP(" D %XY^%RCR S DIJS=DJ,DIPQ=DPQ,DIMS=M,DIPP=DPP
GO ;
 K DCL,DIASKHD,DIPT,DIPZ,DIL,DIL0,R,DOP,DHD,DD,DE,DG,DI,DIC,DK,DL,DN,DM,DU,DV,DW,DP,DY,POP,D,O,X,Y,V,DICS,TO,%X,%Y,DQ,%
 S DCC=U_$P(DJ,U,3),@("DD=$P("_DCC_"0),U,2)"),DP=+DD
 I '$D(DIBTPGM),+$G(DIBT1),$G(^DIBT(DIBT1,"ROU"))]"",DPQ S DIBTPGM=^("ROU") D
 . N DRN,DIERR D NXTNO^DIOZ(.DRN) I $G(DIERR) D QSV^DIOZ Q
 . S DIBTPGM=DIBTPGM_$E("000",1,(4-$L(DRN)))_DRN
 . Q
 K:$G(DIBTPGM)="" DIBTPGM
 I '$D(DSC),'$G(DIO("SCR"))=1,DD["s",$D(^DD(DP,0,"SCR")) D SCR
 S DD=$P(DJ,U,4),DL="D0",DN=DL,DI=$S('$D(BY(0)):U,$E(BY(0))=U:U,1:"")_$P(DJ,U,2),A=1
 I $G(ZTSTOP)=1!($G(DIFMSTOP)) G IXK
 I $D(DIBTPGM) D
 .S (DICNT,DICP,DICDX,DICOV)=1 K DISAVX,DISETP,DISETQ,^TMP("DIBTC",$J)
 .I '$D(DSC),'$G(DIO("SCR")),$D(DIS)>9 D SVSCR
DIOO1 F Z=1:1:DD-1 S @DL="",DL="DIOO"_Z,DN=DL_","_DN N @DL
 S @DL=$S($D(DPP(DJK,"F"))&$D(DPP(DJK,"IX")):$P(DPP(DJK,"F"),U),DD>1:"",1:0),Z=0 D ^DIO0
 I DPQ G ^DIOS
IX I $D(DPP(DJK,"IX")),$O(^UTILITY($J,99,99))>99,DPP(DJK)-DP,'$D(DSC),DD>1 S X="I $D("_$P(DPP(DJK,"IX"),U,1,2)_DN F %=1:1 S X=X_",D"_% I %+1=DD S DSC(+DPP(DJK))=X_"))" Q
 I $D(CP) S C="",CP=0 F X=0:0 S C=$O(CP(C)),A="" Q:C=""  K CP(C) S CP(C,C)=0 F Y=0:0 S A=$O(CP(A)) Q:A=C  S CP(C,A)=0
 I $D(DIWL),DIWL=1 S ^(1)="S DIWF=""W"" "_^UTILITY($J,99,1)
IXK K DPP,DPQ,DJ,M,DISMIN,DISH
 I $G(ZTSTOP)=1!($G(DIFMSTOP)) I $G(DIBTPGM)]"" D
 .N % S %=+$P(DIBTPGM,"^DISZ",2) D:% ENRLS^DIOZ(%) K DIBTPGM Q
 D 2 S:'$D(Y) Y=1 G ^DIO4
 ;
2 ;
 I $D(DIBTPGM) D
 .I '$D(DPQ),$D(DX(0)) N %,X S %="D O^DIO2",(%(1),%(2))="DX",X=0 D SETU^DIOS
 .D ENC^DIOZ K ^UTILITY($J,0) Q
 K DLN,DL,F,I,J,V,W,X,Y,Z,DE,DRJ,DICP,DICDX,DICOV,DICNT,DISAVX,DISETP,DISETQ,^TMP("DIBTC",$J) D:'$D(DISYS) OS^DII
 I $G(ZTSTOP)=1!($G(DIFMSTOP))!($G(DIERR)) S (DJ,DIO)=0 Q
 S X=1 X ^DD("FUNC",18,1)
 I $D(DIOBEG) X DIOBEG K DIOBEG
 S I(0)=DCC,J(0)=DP,DI=99,(DN,X)=1,(DJ,DE,DIO,IOX,IOY)=0
 G ^DIO2
 ;
SCR S DD="S Y=D0 I $D("_DCC_"Y,0)) "_^("SCR") I '$D(DIS(0)) S:'$D(DIS) DIS=1 S DIS(0)=DD Q
 S DIS("SCR")=DD,DIS(0)=$S($D(DIBTPGM):"D DISCR",1:"X DIS(""SCR"")")_" I  "_DIS(0)
 Q
SVSCR ;SAVE DIS ARRAY INTO ^TMP FOR LATER COMPILATION
 N %,I,J,K S %=.0000001
 I $D(DIS)'=11 S ^TMP("DIBTC",$J,%,DICNT)="SEARCH S DIO=1",DICNT=DICNT+1
 S ^TMP("DIBTC",$J,%,DICNT)="SCR S DIO(""SCR"")=1",DICNT=DICNT+1
 S I="" I $D(DIS(0)) S ^(DICNT)=" "_DIS(0),I=" Q:'$T ",DICNT=DICNT+1
 S:$O(DIS(0)) I=I_" D S1 Q:'$T " I I]"" S ^(DICNT)=I,DICNT=DICNT+1
 S ^(DICNT)="PASS S:'$D(DPQ) DIPASS=1",^(DICNT+1)=" G O",DICNT=DICNT+2
 I $O(DIS(0)) S K=0 D
 .F J=1:1 Q:'$D(DIS(J))  S:K ^TMP("DIBTC",$J,%,DICNT)=" Q:$T",DICNT=DICNT+1 S ^(DICNT)=$P("S1 ^ ",U,K+1)_DIS(J),DICNT=DICNT+1,K=1
 .S ^(DICNT)=" Q",DICNT=DICNT+1 Q
 I $G(DIS("SCR"))]"" S ^TMP("DIBTC",$J,%,DICNT)="DISCR "_DIS("SCR"),^(DICNT+1)=" Q",DICNT=DICNT+2
 Q

DIO0
DIO0 ;SFISC/GFT,TKW-BUILD SORT AND SUB-HDR ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S Z=Z+1,DE=$P(DN,",",Z)_"=$O("_DI_$P(DN,",",1,Z)_")),DN="_(Z+1)
 I Z=1,$G(DPP(DJK,"PTRIX"))]"" D
DIOO1 . S DE="DIOO1=$O("_DPP(DJK,"PTRIX")_"DIOO1)),DN=1.5,DD00=0"
 . S DY(1.5)="S DD00=$O("_DPP(DJK,"PTRIX")_"DIOO1,DD00)),DN=2 S:'DD00 DN=1"
 . I DPP(DJK,"PTRIX")?.E1"""B""," S DY(1.5)=DY(1.5)_" S:DD00&($G(^(+DD00))!('($D(^(+DD00))=1))) DN=1"
 . Q
 I DPQ,Z=1,$D(DPP(DJK,"IX")),$O(DPP(DJK,0)) D
 .S DXIX=$P(DPP(DJK),U) Q:'DXIX  S DXIX(DXIX)=U_$P(DPP(DJK,"IX"),U,2)_$S($D(DPP(DJK,"PTRIX")):"DD00,D0",1:DN)
 .S W=0,%(1)="" F %=0:0 S W=$O(DPP(DJK,W)) Q:'W  S %=%+1,%(1)=%(1)_",D"_%
 .S DXIX(DXIX)=DXIX(DXIX)_%(1)
 .K %,W Q
 I Z<$G(DPP(0)) S Y=$P($G(DPP(Z+1,"F")),U) I Y]""!($G(DPP(Z+1,"T"))]"") S:+$P(Y,"E")'=Y Y=""""_Y_"""" S DE=DE_","_$P(DN,",",Z+1)_"="_Y
 I 'DPQ,$D(DPP(Z)) D H
 I DPQ,Z=DD S DE=DE_" S:D0 DISTP=DISTP+1 D:'(DISTP#100) CSTP"_$P("^DIO2",1,$D(DIBTPGM))_" Q:'DN "
 S X=DE_" I "_$P(DN,",",Z)_$S(DD=Z:"'>0",1:"=""""")
 S Y="" D
 .I Z=1,$D(DPP(DJK,"T")),$D(DPP(DJK,"IX")) S Y=$P(DPP(DJK,"T"),U)
 .I $G(DPP(0)),Z<(DPP(0)+1) S Y=$P($G(DPP(Z,"T")),U)
 .I Y]"",Y'="@",Y'="z" S X=X_"!("_$$AFT^DIOC($P(DN,",",Z),Y)_")"
 .Q
D0 S X=X_" S DN="_$S(Z=DD&($D(DPP(DJK,"PTRIX"))):1.5,1:(Z-1)),Y=Z-1 I Z=1 S X=X_",D0=-1" I $D(DPP(DJK,"PTRIX")) S X=X_" K DD00",$P(DN,",")="DD00"
 I 'DPQ,$D(DPP(Y)) S:$P(DPP(Y),U,4)["!" X="DRK=DRK+1,"_X_",DRK=0",DRK=0 D SUB
 S DY(Z)="S "_X
 I $D(DIBTPGM) D
 . S DY(Z)=$S(Z'=1:"DY"_Z,1:"EN")_" Q:'DN  "_DY(Z)_$S(Z=1:" Q",Z=2&($D(DPP(DJK,"PTRIX"))):" G DYP",Z=2:" G EN",1:" G DY"_(Z-1))
 . I $D(DPP(DJK,"PTRIX")),Z=1 S DY(1.5)="DYP Q:'DN  "_DY(1.5)_" G:DN=1 EN"
 . Q
 G DIO0:Z<DD
 F %=1:1 Q:'$D(DPP(%))  K DPP(%,"PTRIX")
 S %=$S($G(DIO("SCR"))=1:"O",$D(DIS)<9:"O",$D(DIS)=11:"SCR",1:"SEARCH")
 S DY(Z+1)="S DN="_Z_" " I DJ["""B"",^" S DY(Z+1)=DY(Z+1)_"I $D("_DI_$P(DN,",",1,Z)_"))'[0,'^(D0) "
 S DY(Z+1)=DY(Z+1)_"D "_%,Y=Z,X=""
 I 'DPQ,$D(DPP(Y)),$P(DPP(Y),U,2)=0 D SUB I  S DY(Z+1)=DY(Z+1)_" S "_$E(X,2,99)
 I A=1 D:$D(DIBTPGM) SETU Q
 S X="," F W=1:1:A-1 S ^DOSV(0,IO(0),"BY",W)=DPP(A(W)),X=X_$P(DN,",",A(W))_",",A(W)="Q"
 S A(W)="S ^DOSV(0,IO(0),"_W_X_"V,DE)=Y"
HD I $G(DIOSTAHD),$G(^UTILITY($J,2))?1"W ".E S ^DOSV(0,IO(0),"HD")=^(2)
 F W=1:1:DPP S X=$$CONVQ^DILIBF($G(DPP(W,"TXT"))) I X]"",$P(DPP(W),U,4)'["+" D  S:X]"" ^("SHD")=$S($D(^DOSV(0,IO(0),"SHD")):^("SHD")_"  BY ",1:"")_X
 .N F,C S C=$F($P(DPP(W),U,5),";""") I C S Y=$P(DPP(W),U,3),F=$F(X,Y) I Y]"",F S C=$E(X,0,F-$L(Y)-1)_$P($E($P(DPP(W),U,5),C,99),"""") S X=$S(C]"":C_$E(X,F,999),1:"")
 D:$D(DIBTPGM) SETU Q
 ;
SUB I $P($G(DPP(Y)),U,4)["+" S A(A)=Y,X=X_",A="_A_" D"_$S($D(DIS)<9:"",1:":$D(DIPASS)")_" ^DIO3"_$S($D(DIS)<9:"",1:" K DIPASS"),A=A+1
 Q
 ;
H S DOP=0 I $D(DNP) F W=1:1 G Q:'$D(DPP(W)) I DPP(W)["+" K DNP S DOP=1 Q
 S Y=$P(DN,",",Z),F=$P(DPP(Z),U,5),W=$P(DPP(Z),U,4),X=$P(W,"""",2),V=+$P(DPP(Z),U,2) S:W["-" Y="(-"_Y_")" I F'[""""&'$D(DPQ(+DPP(Z),V+X))&'DOP!(W["@")!(W["'")!$D(DISH) S (Y,V)="" G F:F]"",U
 I F[";TXT" S Y="$E("_Y_",2,$L("_Y_"))"
EGP I '$D(^DD(+DPP(Z),V,0)) S X=$P(DPP(Z),U,6,9)
 E  D
 .N N,T
 .S X=^(0),N=$P(X,U)
 .S T=$$LABEL^DIALOGZ(+DPP(Z),V),$P(X,U)=T
 .I N=$P(DPP(Z),U,3) S $P(DPP(Z),U,3)=T
DT I $P(X,U,2)["D" S Y=" S Y="_Y_" D:Y<9999999 DT"
 E  I $G(DPP(Z,"OUT"))]"" S DPP(Z,"OUT")=" S Y="_Y_" "_DPP(Z,"OUT"),Y=",Y"
 E  I $P(X,U,2)["O"!($P(X,U,4)?.P) S Y=","_Y
DILL E  D EN^DILL(+DPP(Z),V,1)
 S V=$P(F,";C",2),V="?"_$S(V:V-1,1:Z*3+5)
F I F[";S" S %=$P(F,";S",2) S:'% %=1 S V=$E("!!!!!!!!!!!!!!!!!!!!!!!!!!!!",1,%)_V,M=M+%
 S F=$P(F,";""",2),%=$S(W["@":"",W["'":"",F]"":$P(F,"""",1,$L(F,"""")-1),Y]"":$P($P(DPP(Z),U,3),"""",1)_": ",1:""),Y=V_$S(%_Y]"":$E(",",V]"")_""""_%_"""",1:"")_Y I Y]"" S Y=" I DN D T"_$G(DPP(Z,"OUT"))_" W "_Y ;STOP IF ^
U S W=W'["#" I W,Y="",$D(DPP(Z+1)) G E
 S ^UTILITY($J,"H",Z)="X ^UTILITY($J,1)"_$P(":$Y>"_(DIOSL-M-2-DD+Z)_"!(DC["","")",U,W)_Y,Y="D H:DI<DN ",DE=DE_$S(Z=1:",DI=0",1:" S:DI>"_Z_" DI="_Z)
 S:^UTILITY($J,99,0)'[Y ^(0)=Y_^(0)
E I DOP S DNP=""
Q K DOP Q
 ;
SETU ;PUT DY ARRAY INTO ^UTILITY FOR LATER COMPILATION
 N DN
 F DN=0:0 S DN=$O(DY(DN)) Q:'DN  D
 .S ^TMP("DIBTC",$J,0,DICNT)=$E(" ",'$O(DY(DN)))_DY(DN),DICNT=DICNT+1
 .I '$O(DY(DN)) S ^TMP("DIBTC",$J,0,DICNT)=$S(DN>2:" G DY"_(DN-1),1:" G EN"),DICNT=DICNT+1
 .Q
 Q

DIO1
DIO1 ;SFISC/GFT,TKW-BUILD P-ARRAY (OR LINES IN COMPILED SORT) WHICH CREATES SORTED DATA ;20MAR2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 F DJ=0:1:7 F DX=-1:0 S DX=$O(Y(DJ,DX)) Q:DX=""  F DPR=-1:0 S DPR=$O(Y(DJ,DX,DPR)) D  Q:DPR=""
 .I DPR="" D:$D(DIBTPGM) SETU("Q") Q
 .S X=0
A .F  S X=$O(Y(DJ,DX,DPR,X)) Q:X=""  D
B ..N DL,DIF,W,DICOND,Z,%,BACKWARD
 ..S DL=Y(DJ,DX,DPR,X),W="DISX("_DL_")",DICOND="=""""",D2="" I $P(DPP(DL),U,4)["-" S BACKWARD="-"
 ..I 'X,DL>$G(DPP(0)) S:'$D(DPP(DL,"CM")) W=$G(BACKWARD)_"D"_V(DX),DICOND="<0"
 ..I X S Z=$P($P(^DD(DX,+X,0),U,4),";",2) S:$E(Z)="E" DICOND="?."" """
 ..S Z="" S:$C(63,122)=$P($G(DPP(DL,"F")),U) Z=1 S:$P($G(DPP(DL,"T")),U)="@" Z=Z+2 ;From NULL:Z=1  To NULL:Z=2   Both:Z=3
 ..S DIF=$S($D(BACKWARD):BACKWARD,$P(DPP(DL),U,10)=2:"+",1:"")_$S($D(DE(DL)):"$E("_W_",1,"_DE(DL)_")",1:W) ;DE array was set in ^DIOS
 ..I Z S DIF="$S("_W_"'"_DICOND_":"_DIF_",1:""  EMPTY"")"
 ..S J(DL)=W
 ..I Z=3 S J(DL)=""" """ K DIF ;if just looking for NULLs
 ..I $P(DPP(DL),U,4)["'" S J(DL)=1 K DIF ;if Sort Value doesn't matter
 ..S P(DX)=$S($D(P(DX)):P(DX)_" ",1:"")
 ..S Y=$S(W?1"DISX(".E:"S "_W_"="""" ",1:"")_DPP(DL,"GET")
 ..S DICOND=$G(DPP(DL,"QCON")) I DL=DJK&$D(DPP(DL,"IX"))!(DICOND="") S DICOND="I "_W_"]"""""
SORTVAL ..I $D(DIF),DIF'=W S DICOND=DICOND_" S DISX("_DL_")="_DIF
 ..S Y=Y_" ",DIF="" D  S Y=DICOND,DIF="I  " D
 ...I $D(DIBTPGM) D SETU(Y) D:DIF]"" SETU("Q:'$T") Q
 ...I DPP>2!($L(P(DX))+$L(Y)>125) S Z=$O(P(DX,""),-1)+1,P(DX,Z)=Y,P(DX)=P(DX)_"X P("_DX_","_Z_") "_DIF Q
 ...S P(DX)=P(DX)_Y
BX ..S Y=DX Q
UTILITY K W S W="",Z=" S:$T ^UTILITY($J,0" F X=1:1:DPP S Z=Z_","_$G(J(X),1)
SUB F V=1:1:DPP I V=DPP&(W="")!(DPP(V)-DP) S F=",",Y=DP,%=1,X=0 D  S W=W_Z_F_")="""""
U .S:$D(D(Y)) X=X_D(Y) S %=%+1,Y=$P(Z(V),",",%),D=Y="",F=$S(F'=",":F_",D"_X,D:",D"_X,1:",D"_X_","_V) I 'D S X=V(Y) G U
 .I $L(W)+$L(Z)+$L(F)+$L(DX(DPQ))+$S(V(DPQ):38,1:0)>237 D
 ..I '$D(DIBTPGM) S DIOVFL(V)=$E(W,2,999),W=" X DIOVFL("_V_")" Q
 ..S %=W,(%(1),%(2))="OV",W=" D OV"_DICOV D SETU^DIOS
DX F X=-1:0 S X=$O(DX(X)),DX=X Q:X=""  D
 .N A,B S A=""
 .I $D(DIBTPGM) S B=+$O(^TMP("DIBTC",$J,X,0)),A=$G(^(B))
 .S:A="" A=DX(X)
 .S:X=DPQ A=A_W_$P(",DJ=DJ+1",U,$D(DIS)>9)
 .I V(X) S F="",%(0)=DX,%=DCC S:$D(DXIX(DX)) F=DXIX(DX) D:F="" GREF^DIOU(.V,.%,.F) S A=A_" "_"S D"_V(X)_"=$O("_F_")) Q:D"_V(X)_"'>0"
 .S DX(X)=A Q:'$D(DIBTPGM)
 .S:B ^TMP("DIBTC",$J,X,B)=A S DX(X)="D "_$P(A," ")
0 S DX(0)=DX(DP),DX=0,DPQ=0 K:DP DX(DP)
 ;
2 K D,%,I D 2^DIO D  I $G(DIERR) G IXK^DIO
 .I $G(DIERR),$D(^UTILITY($J,0))>0 D CLEAN^DILF
 K DIOVFL,P,V,Y,D0,D1,D2,D3 K:'$D(DIB) DIS S:$D(DIBTPGM) DIBTPGM=""
DIOO1 S V="I $D(^UTILITY($J,0" K DPP(0,"F"),DPP(0,"T") F X=1:1:DPP K DPP(X,"F"),DPP(X,"T") S V=V_",DIOO"_(DPP-X+1)
 F X=-1:0 S X=$O(DX(X)) Q:X=""  I $D(DX(X,U)) S DSC(X)=V_DX(X,U)_$S($D(DSC(X)):" "_DSC(X),1:"")
 K DX S DX=^UTILITY($J,"DX"),DJ=^("F"),%=$O(^("DX",-1)) S:%="" %=-1 F %=%:0 S DX(%)=^(%),%=$O(^(%)) I %="" G GO^DIO
 ;
SETU(%) Q:%=""  N A
 S A=$G(DICP(DX)) I A S A="P"_A
 S ^TMP("DIBTC",$J,"P",DICNT)=A_" "_%
 K DICP(DX) S DICNT=DICNT+1
 Q

DIO2
DIO2 ;SFISC/GFT,TKW-PRINT ;15JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S (DISTP,DILCT)=0
 I '$D(DICMX) S DICMX="D M^DIO2"
XDY I $D(DIBTPGM) D @("EN"_DIBTPGM),ENRLS^DIOZ(+$P(DIBTPGM,"^DISZ",2)) Q
 X DY(DN) G XDY:DN
 Q
 ;
SEARCH S DISEARCH=1 ; Protect switch SO-2/24/2000
SCR S DIO("SCR")=1,DE=0 I '$D(DIS(0)) G OR
 X DIS(0) Q:'$T  G PASS:'$D(DIS(1))
OR S DE=DE+1 I '$D(DIS(DE)) Q
 X DIS(DE) E  G OR
PASS S:'$D(DPQ) DIPASS=1
O F DLP=0:1:DX Q:'DN  X $S($D(DPQ):DX(DLP),1:^UTILITY($J,99,DLP))
TRAIL S:$D(DIOT) DIOT("D0")=$G(D0)
 Q
 ;
N W !
T I $X,IOT'="MT" W !
 I '$D(DIOT(2)),DN,$D(IOSL),$S('$D(DIWF):1,$P(DIWF,"B",2):$P(DIWF,"B",2),1:1)+$Y'<IOSL,$D(^UTILITY($J,1))#2,^(1)?1U1P1E.E X ^(1)
 S DISTP=DISTP+1,DILCT=DILCT+1 D:'(DISTP#100) CSTP
 Q
 ;
CSTP I $G(IOT)="SPL"!($G(IOT)="HFS") I '$D(DPQ),$$ROUEXIST^DILIBF("XUPARAM"),DILCT>$$KSP^XUPARAM("SPOOL LINES") D  Q
 . S DIFMSTOP=1,DN=0 S:$D(ZTQUEUED) ZTSTOP=1
 . W !,$$EZBLD^DIALOG(1519,$$KSP^XUPARAM("SPOOL LINES")),!! ;**CCO/NI SPOOL LINE MESSAGE ON OUTPUT
 I '$D(ZTQUEUED) K DISTOP Q
 Q:$G(DISTOP)=0  S:$G(DISTOP)="" DISTOP=1
 I DISTOP'=1 X DISTOP K:'$T DISTOP S DISTOP=$T Q:'$T
 Q:'$$S^%ZTLOAD
TASKSTOP W:$G(IO)]"" !,$$EZBLD^DIALOG($D(DPQ)>0+1528,ZTSK),!! S ZTSTOP=1,DN=0 Q  ;**CCO/NI  'TASK HAS BEEN STOPPED'
 ;
DT I $G(DDXPDATE) D DT^DDXP4 W DDXPY K DDXPY Q
 I $G(DUZ("LANG"))>1,Y W $$OUT^DIALOGU(Y,"DD") Q
 X ^DD("DD") ;**CCO/NI
 W Y Q
 ;
C S DQ(C)=Y
S S Q(C)=Y*Y+Q(C) S:L(C)>Y L(C)=Y S:H(C)<Y H(C)=Y
P S N(C)=N(C)+1
A S S(C)=S(C)+Y Q
 ;
DITTO(C,Y) D D Q Y
D I Y=$G(DITTO(C)) S Y="" Q
 S DITTO(C)=Y Q
 ;
CP S C="" F  S C=$O(CP(C)) Q:C=""  G DQ:'$D(DQ(C))
 S CP=CP+1 F  S C=$O(CP(C)),A="" Q:C=""  F  S A=$O(CP(A)) S CP(C,A)=DQ(C)*DQ(A)+CP(C,A) Q:A=C
DQ K DQ Q
 ;
H F DI=DI:1:DN I $D(^UTILITY($J,"H",DI)) X ^UTILITY($J,"H",DI) W:$X&($G(DIAR)'=4)&($G(DIAR)'=6) !
 Q
 ;
M X $S($D(DPQ):DX(DIXX),1:^UTILITY($J,99,DIXX))

DIO3
DIO3 ;SFISC/GFT-TTLS, SUBTTLS ;22DEC2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SUB ;
 N TYPE,V ;**CCO/NI This whole subroutine re-written for 'TOTAL', 'SUBTOTAL', 'COUNT', SUBCOUNT', ETC.
 I '$D(DNP) W:$X !
 I 'A F X=1:1:$G(DIONOSUB) W !
 K X
 I $D(^UTILITY($J,"SV",A+1)) F Y="S","N","Q","H","L" S C=Y_"(V)" F V=0:0 S V=$O(@C) Q:V=""  I $D(^UTILITY($J,"SV",A+1,V,Y)) S @C=^(Y),^(Y)=$S(Y="H":-99999999,Y="L":99999999,1:0)
 S %X="" F  S %X=$O(^UTILITY($J,"T",%X)) Q:%X=""  D
 .S Z=^(%X),V=$P(Z,U,2) Q:$D(V(V))
 .S V(V)="",TYPE=$P(Z,U,4)
U .F I=1:1:6 S DE=$P($T(@I),";",4),Y=DE_"(V)" I $D(@Y)#2 S Y=@Y,C=$P(Z,U,5) D @I
 .I '$D(DNP),$D(X)>9 W ?%X F I=1:1:Z W "-"
 S Z=A I $D(A(A)) F DE="S","N" S I=DE_"(V)" F V=0:0 S V=$O(@I) Q:V=""  S Y=@I I '$D(DNP)!Y S:'$D(V(V)) ^(DE)=$G(^UTILITY($J,"SV",A,V,DE))+Y S @I=0,Z=0 X A(A)
 S X=-1 G K:$D(X)<9!Z F I=0:0 S I=$O(X(I)),X=X+1 Q:I=""
 I X+$Y>IOSL X ^UTILITY($J,1)
EGP F I=0:0 S I=$O(X(I)) Q:I=""  W:$X ! D
 .N TITLE
 .S TITLE=$$EZBLD^DIALOG($P($T(@I),";",6))
 .I A>0 S TITLE=$$EZBLD^DIALOG(7098,TITLE)
 .W:'$G(DIONOSUB) TITLE," " S X="" F  S X=$O(X(I,X)) Q:X=""  W ?X,X(I,X)
 W !
K K Z,X,V,C Q
 ;
1 ;;TOTAL;S;;7090
 I $P(Z,U,6)]"" X $P(Z,U,6,99) S S(V)=Y
 S ^(DE)=$S($S(A:$D(^UTILITY($J,"SV",A,V,DE)),1:$D(^DOSV(0,IO(0),0,V,DE))):^(DE),1:0)+Y
 Q:TYPE["D"  Q:TYPE["F"&(Y=0)
O I C]""!$P(Z,U,3) S @("Y=$J(Y,+Z"_C_")")
 S X(I,%X)=Y Q
2 ;;COUNT;N;;7089
 S ^(DE)=$S($S(A:$D(^UTILITY($J,"SV",A,V,DE)),1:$D(^DOSV(0,IO(0),0,V,DE))):^(DE),1:0)+Y
 S C=$P(",0",U,C]"") G O
3 ;;MEAN;N;;7088
 Q:TYPE["D"!'Y!$L($P(Z,U,6))!'$D(S(V))  Q:TYPE["F"!A&(S(V)=0)  S Y=$J(S(V)/Y,0,2) G O
4 ;;MINIMUM;L;;7087
 S ^(DE)=$S('$D(^(DE)):Y,^(DE)>Y:Y,1:^(DE)),L(V)=99999999 G M
5 ;;MAXIMUM;H;;7086
 S ^(DE)=$S('$D(^(DE)):Y,^(DE)<Y:Y,1:^(DE)),H(V)=-99999999
M Q:Y[9999999!(N(V)<2)  D D:TYPE["D" G O
6 ;;DEV.;Q;;7085
 Q:TYPE["D"  S ^(DE)=$G(^(DE))+Y,Q(V)=0 Q:N(V)<2  S DE=Y-((S(V)*S(V))/N(V))/(N(V)-1),Y=1+DE/2 Q:DE'>0
L S %=Y,Y=DE/%+%/2 G L:Y<%,O
 ;
DT D D:Y W Y Q
D X ^DD("DD") Q  ;**CCO/NI  DATE FORMAT
N W !
T Q

DIO4
DIO4 ;SFISC/GFT,XAK,TKW-FINISH OUTPUT, CLOSE DEVICE ;9JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DIXX,DIWT,DIW,DIP,DSC,DRK,DIO("SCR") D:'$D(DISYS) OS^DII
 G:$G(DIFIXPT)=1 K1
 I $G(DIBTPGM)]"" D
 .N % S %=+$P(DIBTPGM,"^DISZ",2) D:% ENRLS^DIOZ(%) K DIBTPGM Q
 I ($G(ZTSTOP)=1!($G(DIFMSTOP))!($G(DIERR)))&'$D(DIAR) K:$G(ZTQUEUED) DIERR,^TMP("DIERR",$J) D FF G STOP
 I $G(S)'=0!(IO'=$P),$G(DISTP)'<1,$D(^UTILITY($J,"T")) S A=0 D ^DIO3 ;DO TOTALS UNLESS USER HAS ABORTED MIDWAY
MATCHES I L!($D(DISTEMP)),DISEARCH,'DISUPNO D:'DJ&('DC)&($D(^UTILITY($J,2))) HDR W !!!?25,$S('DJ:$$EZBLD^DIALOG(8006.1),$G(DUZ("LANG"))>1:$$EZBLD^DIALOG(8006.2,DJ),1:DJ_" MATCH"_$P("ES",U,DJ'=1)_" FOUND.") W:IOST?1"C".E $C(7) ;**
 I DISEARCH,$G(DISV),$D(^DIBT(DISV)) D NOW^%DTC S ^DIBT(DISV,"QR")=%_U_+DJ
NO I $G(DISTP)<1,'DIO,'DISUPNO,'DC D:$D(^UTILITY($J,2)) HDR W !!!!,?10,$$EZBLD^DIALOG(8007.1) ;**NO RECORDS TO PRINT
 I $D(DIAR) D UPDATE^DIARU
 I $D(CP) S X=-1,^DOSV(0,IO(0),"CP")=CP F  S X=$O(CP(X)),Z=-1 Q:X=""  F  S Z=$O(CP(X,Z)) Q:Z=""  S ^DOSV(0,IO(0),"CP",X,Z)=CP(X,Z) Q:X=Z
 I $D(DIOT),$D(Y),Y'=U S DY(1)="X DIOT S DN=0",DN=1 D ^DIO2
 D FF
 I $D(DCOPIES),$D(DOUT),$D(^DD("OS",DISYS,"SDPEND")) D SDP
 G:$G(DIOEND)="G M^DIAU" M^DIAU G:$G(DIOEND)="G L^DIDC" L^DIDC
 X:$D(DIOEND) DIOEND K DIOEND
STOP I $G(ZTSTOP)=1,$G(DISTOP("C"))]"" X DISTOP("C")
 D CLOSE I DUZ(0)'="@" S X=0 X ^DD("FUNC",18,1)
K ;S:$D(ZTSK) ZTREQ="@"
 I $D(ZTQUEUED) D
 . S ZTREQ="@"
 . I $G(DDXPTMDL),$D(DDXPXTNO) N DA,DIK S DIK="^DIPT(",DA=DDXPXTNO D ^DIK
K1 K ^UTILITY($J),^(U,$J),^UTILITY("DIP2",$J),FLDS,DIOT,DQI,A,B,C,D,E,H,I,J,M,N,L,P,Q,S,V,W,X,Y,Z,DITTO,DIP,DIPA,BY
 K %,%H,%I,%A,%B,%DT,%Q,%X,%Y,%Z,FR,CP,DA,DD,DIO,DL,DM,DN,DI,DE,D9,D5,D4,D3,D2,D1,DCOPIES,DIFF,DIASKHD,DISTOP,DISTP,DILCT,DISV,DISX,DIAC,DIFILE
 K DIS,SF,DIPDT,DIPR,DICMX,DHT,DIWL,DIWR,DIPASS,DICSS,DIONOSUB,DIOSUBHD
 K DIRUT,DIROUT,DUOUT,DTOUT,DIHELP,DIMSG,^TMP("DIHELP",$J),^TMP("DIMSG",$J)
 I '$G(DIQUIET) K ^TMP("DIERR",$J),DIERR
 K DIBT,DIBT1,DIBT2,DX,DY,DNP,DC,DXS,DINS,DIPT,IOP,DCC,DQ,DJ,DJK,DIOP,DIOSL,DLP,DILIOSL,DHIT,DIJ,DPR,DP,DISUPNO,DIPCRIT,DIBTOLD,DITYP,DISTXT,DISEARCH Q
 ;
FF W:IOST?1"P".E&$Y&L @IOF
 Q
 ;
SDP Q:'DCOPIES  W ! X ^DD("OS",DISYS,"SDPEND")
 S DIO=IO,DLP=IOPAR,IOP=DOUT,A=IO(0) D ^%ZIS S IO(0)=A Q:POP
 F A=1:1:DCOPIES W:IOST?1"P".E&$Y @IOF X ^DD("OS",DISYS,"SDP") U IO
 I IO'=IO(0) S X=IO X ^DD("FUNC",7,1) K IO(1,IO)
 S IO=DIO Q
 ;
CLOSE ;
 S DIOP=IO X $G(^%ZIS("C"))
 O $P::2 E  H  ;I $P(IO(0),DIOP)]"" S IOP=IO(0) D ^%ZIS H:POP  S X=DIOP X ^DD("FUNC",7,1) K IO(1,IO) U IO(0)
 K DIOP Q
HDR N DN S DN=1 X ^UTILITY($J,1) Q
N G N^DIO2
T G T^DIO2
CSTP G CSTP^DIO2
DT G DT^DIO2 Q
C G C^DIO2
S G S^DIO2
P G P^DIO2
A G A^DIO2
D G D^DIO2
CP G CP^DIO2
H G H^DIO2
M G M^DIO2

DIOC
DIOC ;SFISC/TKW-GENERATE CODE TO CHECK QUERY CONDITIONS ;04:18 PM  13 Feb 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BEF(X,Y,N,M) ; BEFORE  (X before Y)
 N Z D Q(.Y)
 I $G(N)="'" S Z=Y_"']]"_X Q Z
 S Z="" S:$G(M)]"" Z=X_"]"""","
 S Z=Z_Y_"]]"_X Q Z
AFT(X,Y,N,M) ; AFTER (X after Y)
 N Z D Q(.Y)
 I $G(N)="'" S Z="" S:$G(M)]"" Z=X_"]""""," S Z=Z_X_"']]"_Y Q Z
 S Z=X_"]]"_Y Q Z
BTWI(X,F,T,N,S) ;BETWEEN INCLUSIVE  (NOTE: Param.'S' defined only if called from sort.
 S S=$G(S) N Z
 I $G(N)="'" S Z="("_$$BEF(X,F)_")!("_$$AFT(X,T)_")" Q Z
 S:S]"" Z=$$AFT(X,F)
 I S="" D Q(.F) S Z=F_"']]"_X
 S Z="("_Z_")&("_$$AFT(X,T,"'")_")" Q Z
BTWE(X,F,T,N) ;BETWEEN EXCLUSIVE
 N Z D Q(.T)
 I $G(N)="'" S Z="("_$$AFT(X,F,"'")_")!("_T_"']]"_X_")" Q Z
 S Z="("_$$AFT(X,F)_")&("_T_"]]"_X_")" Q Z
EQ(X,Y,N) ;EQUALS
 N Z S:$G(N)'="'" N="" D Q(.Y) S Z=X_N_"="_Y Q Z
NULL(X,N) ;NULL
 N Z S:$G(N)'="'" N="" S Z=X_N_"=""""" Q Z
 ;
Q(X) ;
 I +$P(X,"E")'=X S X=""""_$$CONVQQ^DILIBF(X)_""""
 Q

DIOQ
DIOQ ;SFISC/GS,TKW-QUERY OPTIMIZER ;4/5/95  14:02
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SER(F,DIOQGET,DIOQCHEK,C,X,%,W) ; COMPUTE SEARCH EFFICIENCY RATING
 ; F=FILE#, DIOQGET=GET CODE, DIOQCHEK=EVALUATION CODE,
 ; C=USEABLE INDEX? (1=YES, 0=NO)
 ; X=EFFICIENCY RATING, %=PREVALANCE OF HITS (PROBABILITY)
 ; W=WRITE PROGRESS MSG.TO USER
 N Z S (X,%)=0,W=$G(W),Z=$G(^DIC(+$G(F),0,"GL")) Q:Z=""
 N I,N,T,D0,DA,DITRUE,DIFIRST S DIFIRST=1
 I W S W=$P($H,",",2)+.1
 S (T,N)=0,I=$P(@(Z_"0)"),U,4)\100
 F D0=0:I S D0=$O(@(Z_D0_")")) Q:'D0  Q:N>100  S DA=D0,N=N+1 D TEST I DITRUE S T=T+1
 S %=$S(N=0:1,T=0:0,1:T/N),(X,%)=1-% I C S:%=1 X=100 S:%'=1 X=%/(1-%)
 S X=$J(X,1,4),%=$J(%,1,4) Q
 ;
TEST ; GET VALUE AND EVALUATE IT
 N I,L,N,T,Z,DIOQSVD0 S DIOQSVD0=D0 D  S D0=DIOQSVD0
 . N F,C,W,DIFIRST
 . X DIOQGET,DIOQCHEK S DITRUE=$T Q
 Q:'W  Q:($P($H,",",2)-W)'>3  S W=$P($H,",",2)+.1
 I DIFIRST S DIFIRST=0 W !,"Computing search efficiency..." Q
 W "." Q

DIOS
DIOS ;SFISC/GFT,TKW-BUILD SORT LOGIC ;4SEP2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 D INIT S ^UTILITY($J,"DX")=DX,^("F")="^UTILITY($J,0,"_DCC_U_(DPP+1)
 F X=-1:0 S X=$O(DX(X)) Q:X=""  S ^UTILITY($J,"DX",X)=DX(X)
C K DX F DL=1:1:DPP S DX=+DPP(DL),V(DX,2)=DL,X=DP,(DPQ,DJ)=0,Z(DL)="" D A S X=999-$P($G(DPP(DL,"SER")),U,2),Y(DPQ,DX,X,$E($P(DPP(DL),U,2,3),1,30))=DL
 F DL=1:1:DPP D  I D5,DE>0,$D(DE(DL))=1 S DE(DL)=DE(DL)-(DE\D5) S:DE(DL)<4 DE(DL)=4
 .K % S Z=Z(DL)
U .F %=1:1 S D="",Y=$P(Z,",",%) Q:Y=""  D
 ..S %(%)="D"_V(Y) I $D(V(Y,9)) F I=1:1:%-1 S DIOS=$P(Z,",",I),%(I)="$$SUB^DIOS("_DIOS_")"
 ..F I=1:1:% S D=D_","_%(I) I I=1 S D=D_","_DL
 ..S DX(Y,U)=D_"))"
 K DIOS S I=DP G GO
 ;
SUB(F) ;
 N S,L
 S L="",S=-1
 F  S L=$O(J(L)) Q:L=""  I J(L)=F,$D(I(L,0)) S S=I(L,0) Q
 Q S
 ;
A S W=$D(DPP(DL,X)),V(X)=DJ,Z(DL)=Z(DL)_X_"," G ^DIOS1:'W
 I W=1 S Z=X,V=DPP(DL,X),DJ=DJ+1,DPQ=DPQ+1,X=$O(DPP(DL,X)) S:X="" X=-1 S:+V'=V V=Q_V_Q S:$S($D(^DD(X,0,"UP")):^("UP")-Z,1:1) X=DX K J(DJ,X) S:J'<DJ&$D(J(DJ)) J=DJ-1 S J(DJ,X)=DL,V(X,1)=V,V(X,0)=Z,I(Z,X)=DL G A
 S W=-1
O S W=$O(DPP(DL,X,W)) I W="" S X=+V G A
 S V=DPP(DL,X,W),DJ=W#100,V(+V,9,DL)=W,V(+V,8)=U_$P(V,U,2),DPQ=DPQ+1+DJ,I(X,+V)=DL,J=-1,J(DJ,X)=DL G O
 ;
GO K DISETP,DISAVX S X=I,I="" I $D(V(X,2)) S I=" X P("_X_")" I $D(DIBTPGM) S I=" D P"_DICP,DISETP=1
 I V(X) S W="D"_V(X),I="F "_W_"="_W_":0"_I
 S DX(X)=I,DPQ=X
 S DX=X,I=$O(I(X,X)),F=-1 I I="" D  I I="" G DIO1
 . I $D(I)<9 Q:'$D(DIBTPGM)  Q:$D(DISAVX(X))  S %=DX(X),%(1)=X,%(2)="DX" D SETU Q
 . S I=$O(I(X,-1)) Q:I]""
 . S I=$O(I(DP,-1)) I I]"" S DX=DP Q
 . S DX=+$O(I(-1)),I=+$O(I(DX,-1))
 . Q
 S P=I(DX,I) K I(DX,I) G COLON:$D(V(I,9)) D MULPATH
 S F="",(DX,%(0))=I,W="D"_V(I),%=DCC S:$D(DXIX(I)) F=DXIX(I) D:F="" GREF^DIOU(.V,.%,.F)
 S DX(X)=DX(X)_" S "_D2_W_"=$O("_$E(F,1,$L(F)-2)_"0))"_DN_$P(")",U,'$D(DIBTPGM))_D1
 I $D(DIBTPGM) S %=DX(X),%(1)=X,%(2)="DX" D SETU
 G GO
COLON S F=$O(V(I,9,F)) I F="" G GO
 D MULPATH S DX(X)=DX(X)_$E(" S "_D2,1,$S(D2]"":$L(D2)+2,1:0))_DN I '$D(DIBTPGM) S DX(X)=DX(X)_","_F_")"
 S DX(X)=DX(X)_D1
 I $D(DIBTPGM) S %=DX(X),%(1)=X,%(2)="DX" D SETU
 S DN=DPP(F,DX,V(I,9,F)),V=$P(DN,U,4,99)
 I $P(DN,U,3) S V="S DIXX="_I_" "_V
 E  S V=V_" S D0=D(0) " D
 .I '$D(DIBTPGM) S V=V_"X DX("_I_")" Q
 .S V=V_"D DX"_DICDX
 .Q
 S DX(I,F)=V I $D(DIBTPGM) S %=V,%(1)=I_","_F,%(2)="DX" D SETU
 G COLON
 ;
MULPATH S DN=" "_$E("XD",$D(DIBTPGM)+1)_$P(":$T",1,$D(V(X,2)))_" DX" D
 .I $D(DIBTPGM) S DN=DN_DICDX Q
 .S DN=DN_"("_I Q
 S (D1,D2)="" F Z=J+1:1:V(X) S W="D"_Z,D(X)="("_X_","_P_")",%=W_D(X),D2=%_"="_W_","_D2,D1=$S(D1]"":D1_",",1:" S ")_W_"="_%
 F V=0:1 S Y=$S($D(J(V,X)):X,$O(J(V,-1)):$O(J(V,-1)),1:-1) D:$D(D(Y))  Q:V'<V(X)
 . I V<V(X) S DN=" S D"_V_"=D"_V_D(Y)_DN
 . Q:'$D(V(X,9))
 . S:V=0 DN=" N I,DIXX"_DN
 . Q:V<V(X)
 . I $D(V(X,2)) S DN=" S D"_V_"=D"_V_D(Y)_DN
 . Q
 Q
 ;
SETU ;FILE A LINE TO ^TMP FOR LATER INCLUSION IN ROUTINE
 Q:%=""  N A
 I %(2)="DX" S A=$S(DICDX=1:"O",1:"DX"_(DICDX-1)),DISAVX(X)=""
 I %(2)'="DX" S A=%(2)_DICOV,DICOV=DICOV+1
 S %=A_$E(" ",$E(%)'=" ")_%
 S ^TMP("DIBTC",$J,%(1),DICNT)=%,^((DICNT+.001))=" Q"
 S A="DIC"_%(2) S @(A)=@(A)+1,DICNT=DICNT+1
 I %(2)="DX",$D(DISETP) S DICP(X)=DICP,DICP=DICP+1 K DISETP
 Q
 ;
INIT S:'$D(L) L=1 I $G(IO)=IO(0),L'=0,($G(IOST)=""!($G(IOST)?1"C".E)) D WAIT^DICD
 S I=^DD("OS",DISYS,0),J=$P(I,U,7),DIOS=$S(J:J,1:63),J=$P(I,U,3),DE=$S(J:J,$G(^DD("SUB")):^("SUB"),1:255)
 K I,J,Z S J=99,Q="""",DE=DPP*8-DE+23,D5=0
 Q
 ;
DIO1 K %,I,J,P G ^DIO1

DIOS1
DIOS1 ;SFISC/GFT-BUILD SORT LOGIC ;04:33 PM  10 Nov 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
L S X=$P(DPP(DL),U,2) S:X=0 X=.001
 S W=+$P($P(DPP(DL),U,5),";L",2) I W D  G SL
 . I $P(DPP(DL),U,5)[";TXT" S W=W+1
 . S W=$S(W<DIOS:W,1:DIOS),DE(DL)=W,DE(DL,"SIC")=1 Q
 I '$D(^DD(DX,+X,0)) D
 . N I,Z,L S W=0
 . S Z=$P(DPP(DL),U,4),L=$L(Z,Q)
 . F I=2:1:L S X=+$P(Z,Q,I)
 . Q
 I '$D(^DD(DX,+X,0)) S W=30 G DJ:$P(DPP(DL),U,7)["D",LL
X S DN=$P(^(0),U,2),W=+$P(DN,"J",2) G LL:W>8,DJ:W I $P(DN,"P",2) G X:$D(^DD(+$P(DN,"P",2),.01,0)),LL
SHORTEN I DN["C"!(DN["K"),DN'["J" S W=30 G LL
 I DN'["F" S DE=DE+5,W=13 S:$P(DPP(DL),U,5)[";TXT" W=14 G DJ
 S W=+$P(^(0),"$L(X)>",2) S:'W W=30 S:W>DIOS W=DIOS
LL I $P(DPP(DL),U,5)[";TXT" S W=W+1
 S:W>8 DE(DL)=W,D5=D5+1
SL S DE=DE+W-8
DJ I $O(DPP(DL,-1)) D  I X=.001 S DE=DE+W
 . N I,J S I=0
 . F J=0:0 S J=$O(DPP(DL,J)) Q:'J  S I=I+1
 . S DE=(I*4)+DE Q
 Q

DIOU
DIOU ;SFISC/TKW-GENERIC FILEMAN CODE GENERATION UTILITIES ;03:57 PM  5 Dec 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BIJ(S,F,I,J) ;BUILD I & J ARRAY.  S=(SUB)FILE#, F=FIELD#
 N X,Y,% S X=0,(Y,J(0))=S F  Q:'$D(^DD(Y,0,"UP"))  S X=X+1,Y=^("UP")
 I X=0 G X
 F %=X:-1:1 S Y=$G(^DD(S,0,"UP")) Q:'Y  S I(S)=%,I(S,0)=Y,F=$O(^DD(Y,"SB",S,0)) Q:'F  S I(S,1)=$P($P($G(^DD(Y,F,0)),U,4),";"),S=Y
X S J=$G(^DIC(S,0,"GL")),I(S)=0
 I $G(DCC)?1"^"1.A1"(".E,((J="")!($P(DCC,J,2)]"")) S J=DCC
 Q
 ;
GREF(I,J,F) ;BUILD GLOBAL REFERENCE (I & J ARRAY FROM BIJ, CODE RETURNED IN F)
 N %,Y S F="",%=J(0) F Y=I(%):-1 S F="D"_Y_F Q:'Y  S F=","_$G(I(%,1))_","_F,%=$G(I(%,0)) Q:%=""!('$D(^DD(+%)))
 S F=$S($D(I(%,8)):I(%,8),1:J)_F Q
 ;
GLRF(S,F,X,%) ;BUILD GLOBAL REFERENCE (S=(SUB)FILE#,F=FIELD NO.,%=CLOSE PARENTHESIS, RETURN PIECE IN %, X=OUTPUT VARIABLE.)
 Q:'$D(^DD($G(S),$G(F),0))  N I,J,K,L,Y D BIJ(S,F,.I,.J)
 S X="",K=J(0) F Y=I(K):-1 S X="D"_Y_X Q:'Y  S L=$G(I(K,1)) S:L]""&(+$P(L,"E")'=L) L=$$QUOTE^DILIBF(L) S:L]"" X=","_L_","_X S K=+$G(I(K,0)) Q:'K
 S X=J_X_"," Q:$G(%)=""
 S %=$P($P(^DD(S,F,0),U,4),";") I %]"",+$P(%,"E")'=% S %=$$QUOTE^DILIBF(%)
 S X=X_%_")"
 S %=$P($P(^DD(S,F,0),U,4),";",2) S:$P(^(0),U,2)["W" %="W" S:F=.001 %(1)=I(J(0))
 Q
 ;
GET(S,F,X,Y,DIFLAG) ;BUILD CODE TO EXTRACT FIELD.  S=FILE/SUBFILE#, F=FIELD#, X=LOCAL VARIABLE NAME WHERE FIELD WILL BE STORED.  CODE RETURNED IN Y
 ; DIFLAG["I" if internal value of field (no output transform)
 N % K Y Q:'$D(^DD(+$G(S),+$G(F),0))  S %=^(0),%(2)=$G(^(2))
 N P,DN,I,J,E
 S P=1 D GLRF(S,F,.Y,.P)
 I F=.001,P="" S Y="S "_X_"=D"_P(1) Q
 I P=" " G CAL
 S (DN,E)=""
 I P S DN="$P(",E="),U"_$S(P=1:")",1:","_P_")")
 I $E(P)="E" S DN="$E(",E="),"_$E(P,2,9)_")"
 I P="W" S E=")"
 I E="" K Y Q
 S Y="S "_X_"="_DN_"$G("_Y_E
 Q:$G(DIFLAG)["I"
 I %(2)]"",$P(%,U,2)["O",$P(%,U,2)'["D" S Y=Y_",Y="_X_" "_%(2)_" S "_X_"=Y"
 Q
 ;
CAL S Y=$P(%,U,5,99),E=$P($P(%,U,2),"p",2)
 I E,$D(^DIC(+E,0,"GL")) S E=" S "_X_"=$S(X="""":X,$D("_^("GL")_"X,0))#2:$P(^(0),U),1:X)" S:$L(Y)+$L(E)>225 Y="X $P(^DD("_S_","_F_",0),U,5,99)" S Y=Y_E Q  ;computed pointer
 S Y=Y_" S "_X_"=X" Q
 ;
DTYP(S,F,Y) ;RETURN DATA TYPES(S) FOR A FIELD
 K Y S Y=""
 I $G(F)=.001,$G(^DD(+$G(S),F,0))="" S Y=2 Q
D2 Q:$G(^DD(+$G(S),+$G(F),0))=""  N %,%X,%Y,X,I,J,DITYP
 S %=$P(^(0),U,2),%(1)=$P(^(0),U,3),%(4)=$P(^(0),U,5,99),DITYP=""
 I '% S I="" F  S I=$O(^DI(.81,"C",I)) Q:I=""  I %[I S DITYP=$O(^(I,0)) Q
 I DITYP="",% D  Q
 . I $P($G(^DD(+%,.01,0)),U,2)["W" S Y=5 Q
 . S Y=10,Y(+%)="" Q
 S:DITYP="" DITYP=4
 S:Y="" Y=DITYP
 I DITYP=1 S Y("D")="",%(4)=$P($P(%(4),"%DT=",2),"""",2) S:%(4)["T"!(%(4)["R")!(%(4)="") Y("D")=Y("D")_"T" S:%(4)["S" Y("D")=Y("D")_"S" G QD
 I DITYP,"2,4,5,9"[DITYP G QD
 Q:Y=""
 I DITYP=6 S Y("T")=$S(%["D":1,%["B":2,%?.E1"J".N1","1N.E:2,%["p":7,1:4) Q
P I DITYP=7 S I=+$P(%,"P",2),%(2)="Y(" D Y S S=I,F=.01 K % G D2
V I DITYP=8 S X=0 D V2 Q
S I DITYP=3 F I=1:1 S X=$P(%(1),";",I),X(1)=$P(X,":"),X=$P(X,":",2) Q:X=""!(X(1)="")  S Y("S","I",X(1))=X,Y("S","E",X)=X(1)
QD I $O(Y(-1)) S Y("T")=DITYP
 Q
Y S %(3)=$O(@(%(2)_"0)")) I %(3)]"",%(3)'="T" S %(2)=%(2)_%(3)_"," G Y
 S %(2)=%(2)_I,@(%(2)_")")="" Q
V2 S X=$O(^DD(S,F,"V",X)) Q:'X  S I=$P($G(^DD(S,F,"V",X,0)),U) G:'I V2
 S:'$D(Y("V"_X)) Y("V"_X)="" S %(2)="Y("_"""V"_X_"""," D Y
 D DTYP(.I,.01,.J)
 I J>0 S (Y("T"),Y("V"_X,"T"))=$S($G(J("T"))]"":J("T"),1:J) K J("T") S %X="J(",%Y=%(2)_"," D %XY^%RCR
 K %,J G V2

DIOZ
DIOZ ;SFISC/TKW - COMPILED SORT TEMPLATE ; 30NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ENCU ;MARK A SORT TEMPLATE FOR ROUTINE COMPILATION
 I $G(DUZ(0))'="@" W !,$C(7),$$EZBLD^DIALOG(101) Q
EN1 N DDH,DIC,DIR,DIROUT,DIRUT,DUOUT,DTOUT,X,Y,DIOZ
 ; NB: next 2 lines same in ENC. Need to make shared.
 D OS^DII:'$D(DISYS)
 I $G(^DD("OS",DISYS,"ZS"))="" D BLD^DIALOG(820) G QSV
 D DIC Q:Y<0  S DIOZ=+Y
 S DIR(0)="Y"
 I $G(^DIBT(+Y,"ROU"))="" D  Q
 .D BLD^DIALOG(8029,$$EZBLD^DIALOG(8035),"","DIR(""A"")")
 .S DIR("B")="YES" D BLD^DIALOG(9014,"","","DIR(""?"")"),^DIR Q:'Y
 .S ^DIBT(DIOZ,"ROU")="^DISZ",^("ROUOLD")="DISZ"
 .W !!,$C(7),DIR("?",2),!,DIR("?")
 .Q
 S X(1)=$$EZBLD^DIALOG(8035),X(2)="DISZ" D BLD^DIALOG(8028,.X,"","DIR(""A"")")
 S DIR("B")="NO" D BLD^DIALOG(9019,"","","DIR(""?"")"),^DIR Q:'Y
 K ^DIBT(DIOZ,"ROU")
 W !!,$C(7),DIR("?",2),!,DIR("?")
 Q
 ;
DIC S DIC="^DIBT(",DIC(0)="AEIQ",DIC("W")="W ?40,""FILE #"",$P(^(0),U,4) W:$D(^(""ROU"")) ?60,""Compiled"""
 S DIC("S")="I '$P(^(0),U,8),Y'<1,$O(^DIBT(+Y,2,0))"
 D ^DIC Q
 ;
ENC ;CREATE COMPILED SORT ROUTINE
 ; NB: next 2 lines same in EN. Need to make shared.
 D OS^DII:'$D(DISYS)
 I $G(^DD("OS",DISYS,"ZS"))="" D BLD^DIALOG(820) G QSV
 I $O(^TMP("DIBTC",$J,""))="" D BLD^DIALOG(1501) G QSV
 N %,%H,%I,DIROUT,DIRUT,DTOUT,DUOUT,DRN,I,J,K,X,Y,DIR
 D NEW G:$D(DIERR) QSV
 S K=2,I="" F  S I=$O(^TMP("DIBTC",$J,I)) Q:I=""  F J=0:0 S J=$O(^TMP("DIBTC",$J,I,J)) Q:'J  S X=^(J) I X]"" S K=K+1,^UTILITY($J,0,K)=X
 F I=1:1 S X=$P($T(TXT+I),";",3) Q:X=""  S K=K+1,^UTILITY($J,0,K)=X
 S X=$P(DIBTPGM,U,2) X ^DD("OS",DISYS,"ZS")
 K ^TMP("DIBTC",$J)
 Q
 ;
NEW I DIBTPGM'?1"^"1.7U1.4N D NXTNO(.DRN) Q:$D(DIERR)  S DIBTPGM=DIBTPGM_$E("000",1,(4-$L(DRN)))_DRN
 D NOW^%DTC,YX^%DTC
 K ^UTILITY($J,0)
 S ^UTILITY($J,0,1)=$P(DIBTPGM,U,2)_" ; GENERATED FROM '"_$P(^DIBT(DIBT1,0),U,1)_"' SORT TEMPLATE (#"_DIBT1_"), FILE:"_DP_",  USER:"_$S($G(^VA(200,+DUZ,0))]"":$P(^(0),U),1:$P($G(^DIC(3,+DUZ,0)),U))_" ; "_Y
 S ^UTILITY($J,0,2)=$T(DIOZ+1)
 Q
 ;
NXTNO(DRN) ; GET NEXT AVAILABLE ROUTINE NUMBER
 N DILOCK S DRN=0 D  Q:DRN
N1 . S DILOCK=0,DRN=$O(^DI(.83,"C","n",DRN)) Q:'DRN  D N3 G:DILOCK N1
N2 S DILOCK=0,DRN=$$NXTNO^DICLIB("^DI(.83,","","U") I DRN>9999 D BLD^DIALOG(1502) Q
 D N3 G:DILOCK N2
 Q
N3 L +^DI(.83,DRN,0):10 I '$T S DILOCK=1 Q
 S ^DI(.83,DRN,0)=DRN_"^y",^DI(.83,"B",DRN,DRN)="",^DI(.83,"C","y",DRN)="" K ^DI(.83,"C","n",DRN) L -^DI(.83,DRN,0) Q
 Q
 ;
ENRLS(DRN) ; MAKE ROUTINE NUMBER AVAILABLE FOR REUSE & DELETE ROUTINE
 N DICLEAN,X S DRN=+$G(DRN),DICLEAN='DRN G:DRN R1
R S DRN=$O(^DI(.83,DRN)) Q:'DRN
R1 I $G(^DI(.83,DRN,0))]"" S $P(^(0),U,2)="n",^DI(.83,"C","n",DRN)="" K ^DI(.83,"C","y",DRN)
 S X="DISZ"_$E("000",1,(4-$L(DRN)))_DRN X $G(^DD("OS",DISYS,"DEL"))
 G:DICLEAN R
 Q
 ;
QSV D:$G(DRN) ENRLS(DRN) K DIBTPGM
QER Q:$G(DIQUIET)
 D MSG^DIALOG("W") S DIERR=1 Q
 ;
 ;DIALOG #101    'only those with programmer's access'                 
 ;       #820    'no way to save routines on the system'               
 ;       #1501   'There is no code to save for this compiled...'
 ;       #1502   'All available routine numbers...are in use...'
 ;       #8028   '...currently compiled under namespace...'
 ;       #8029   '...not currently compiled.'
 ;       #8035   'Sort template'
 ;       #9014   (help) 'if YES...Sort logic will be compiled...'
 ;       #9019   (help) 'if YES...Sort logic...will NOT be compiled...' 
 ;
TXT ;;
 ;;M X $S($D(DPQ):DX(DIXX),1:^UTILITY($J,99,DIXX))

DIP
DIP ;SFISC/XAK,TKW-GET SORT SPECS ;12:42 PM  9 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K %ZIS,BY,FLDS,DX,DIS,DISV,DHIT,DTOUT,DIFF D ^DICRW G Q:$D(DTOUT),EN:$D(DIC)
Q K DIJ,DIOEND,DIOBEG,DISTOP,DISTXT,DI,DICS,DJ,BY,A,DICSS,ZTSK,FR,TO,FLDS,DHD,DHIT,DIS,PG,DCOPIES,L,DISUPNO,DIPCRIT,DCC,DNP
 K %,%H,%I,%X,%Y,%DT,B,D0,DD,DIAC,DIFILE,DM,DP,DQ S I=$G(X) K X S:I]"" X=I
 D CLEAN^DIEFU
QQ K DIPR,DIBT,DIBT1,DIBT2,DIBTOLD,DIEDT,DIQ,DIWF,DIPZ,DIL,DXS,DALL,DSC,DCL,DPP,DPQ,DIC,DU,DQI,DY,DITYP,DINS,DIPT,DISX
 K S,DC,DL,DV,DE,DA,DK,DIFF,Y,R,C,D,I,J,Q,M,P,N,Q S:$D(DID) M=U Q
 ;
INIT S DIQUIET=1 Q:$D(ZTQUEUED)  I L!('$D(FLDS)#2)!($D(DIASKHD))!($G(IOP)="") K DIQUIET Q
 I $G(BY)="" K:$G(BY(0))="" DIQUIET Q
 N I,X F I=1:1 Q:'$G(DIQUIET)  S X=$P(BY,",",I) Q:X=""  K:X="@" DIQUIET D:$G(DIQUIET)
 . I $D(FR)#2 K:$P(FR,",",I)="?" DIQUIET I '$D(TO)#2 K DIQUIET Q
 . I $D(TO)#2 K:$P(TO,",",I)="?"!('$D(FR)#2) DIQUIET Q
 . I '$D(FR(I))#2!($G(FR(I))="?") K DIQUIET Q
 . I '$D(TO(I))#2!($G(TO(I))="?") K DIQUIET
 . Q
 Q
 ;
EN S L=1 N DIERR
EN1 ;
 S:DIC DIC=$G(^DIC(DIC,0,"GL")) G Q:DIC=""
 I "^DIA(^DDA("[$E(DIC,1,5),'$G(DIA) S DIA=+$P(DIC,"(",2) G Q:'DIA
 S:$D(L)[0 L=0 N DIFM S DIFM=+L N DIFMSTOP D CLEAN^DIEFU I '$D(DIQUIET) N DIQUIET D INIT
 S DJ=1,U="^",(DCC,DI)=DIC,DNP="" D QQ I '$D(DISYS) N DISYS D OS^DII
 I $G(BY)="@" S %=$G(BY(0)),DNP=BY K BY S:%]"" BY(0)=% K %
 S:'$D(DTIME) DTIME=300
I ;
 G Q:'$D(@(DI_"0)")) S S=+$P(^(0),U,2)
SORT S Q="""",C=",",DC=0,DIJ=0,DE=$S(L=0!L!(L="]"):$$EZBLD^DIALOG(7062),1:L),DIL(S)=U ;**CCO/NI  'SORT'
 I $D(BY(0)) D EN^DIP10 G Q:'$D(BY(0)) I $G(BY)="" S DPP=DPP(0) G N^DIP1
LEVELS F DJ=DJ:1:7 D DJ Q:$G(X)=""!($D(DTOUT))!($D(DUOUT))!'$D(DJ)  G FTEM^DIP1:X?1"[".E
 I $D(DUOUT)!($D(DTOUT))!('$D(DJ)) G Q
 G DUP^DIP1
DJ K DPP(DJ),DL,DV,I,J S I(0)=DI,(DL,J(0))=S,(N,DU)=0,Y=.01
 I DJ>1!($G(DPP(0))=0) D  G Q:$D(DTOUT)!($D(DUOUT)) Q:X="@"  G:$D(DIPP) ADD:X?1"^"1.E G D:X]"" Q
 . S DIPR=$S($D(DIPR):DIPR,$G(DPP(0))]"":"BY(0)",1:$P(DPP(DJ-1),U,3))
EGP .D  D L^DIP0 K DIPR Q  ;**CCO/NI
 ..N X S X(1)=DIPR,X(2)=DE,DV=$J("",DJ*2-2)_$$EZBLD^DIALOG(7060,.X) ;**CCO/NI  'WITHIN --- SORT BY: '
 ;I DJ>1 G:$D(DIPP) ADD:X?1"^"1.E G D:X]"" Q
SN S P=$P(^DD(DL,.01,0),U,1,2)  D:'$D(DIPP) XR:$P(P,U,2)'["P"&($P(P,U,2)'["V") I 'DU S Y=S,DV(1)=$S($D(^DD(DL,.001,0)):$$LABEL^DIALOGZ(DL,.001),1:$$EZBLD^DIALOG(7099)) ;*CCO/NI "NUMBER" FIELD
D1 S DPP(DJ)=$S($D(DIPP(DIJ)):DIPP(DIJ),1:Y_U_DU_U_DV(1)_U)
BY S DV=$$EZBLD^DIALOG(7061,DE) D L^DIP0 G Q:$D(DTOUT)!($D(DUOUT)) I X="" D DJ^DIP1 Q  ;**CCO/NI 'BY'
 G:$D(DIPP) ADD:X?1"^"1.E Q:X="@"
D K DPP(DJ,"IX"),DPP(DJ,"PTRIX") S R=U,P=DNP I X="]" S DXS=1,DJ=DJ-1 Q
Y I X'=$$EZBLD^DIALOG(7099) D ^DIC K DUOUT G Q:$D(DTOUT)!(X=U) G G:Y>0,TEM^DIP11:X?1"[".E&'$D(DIPP)&($G(DIEDT)'=1),B:X="" ;**CCO/NI IF INPUT ISN'T 'NUMBER'
 I $G(DUZ(0))="@",X="BY(0)",DJ=1,'$D(DIPP),DL=S D  G:$G(DTOUT)!($G(DIROUT)) Q  G:Y=1 DJ S X="",DPP=DPP(0) Q 
 . N X D ENBY0^DIP100 I $G(BY(0))="" S Y=1 Q
 . S DIR(0)="Y",DIR("A")="Enter additional sort fields",DIR("B")="NO",DIR("?")="Enter YES if you wish to sort by fields in addition to BY(0)." D ^DIR K DIR
 . W ! Q
STRIP D  G:'$D(D) Y S X=$RE(X) D  S X=$RE(X) G:'$D(D) Y  ;from front, then from back
 .F D="]","-","#","+","!","@","'" I $E(X)=D S P=P_D,X=$E(X,2,999) S:D="]" DXS=1 K D Q
 I X[";" S R=X,X=$P(X,";"),R=U_$P(R,X,2,9) G Y
NUM S D=$$EZBLD^DIALOG(7099),Y=0_U_D I $P(D,X)="" W $P(D,X,2) G S ;**CCO/NI  IF IT'S 'NUMBER'
 G ^DIP0
 ;
BB S DPP(DJ,"F")=0,DPP(DJ,"T")=1,P=P_$S(P["@":"B",1:"@B"),R=R_$S(R'[";L1":";L1",1:"") K DATE Q
G S X=$P(Y(0),U,2),D=$P($P(Y(0),U,4),";") G NM:'X
 S N=N+1,DPP(DJ,DL)=D,DIL(+X)=DL,I(N)=$S(+D=D:D,1:Q_D_Q),(DL,J(N))=+X,Y=.01_U_$P(^DD(DL,.01,0),U) I $D(DIPP(DIJ))#2 S %=$P(DIPP(DIJ),U,3),$P(DIPP(DIJ),U,3)=$S($D(DIPP(DIJ,DL)):DIPP(DIJ,DL),1:%)
 I $O(^DD(DL,0))>0!$S($D(BY):BY?1U.E1" ".E,1:0) S DV=$J("",DJ*2-2)_$P(^(0),U) D L^DIP0 G Q:$D(DTOUT)!($D(DUOUT)) Q:X="@"  G Y
NM D BB:X["B" I X["P"!(X["V") S P=P_Q_+Y,I=$P(Y,U,2),DPP(DJ)=DL_U_Y_U_P D DPQ^DIP1 S X="#"_$P(P,Q,$L(P,Q)),DPP=I G C^DIP0
 I +Y=.001 S Y=0_U_$P(Y,U,2),R=R_U_U_X
S ;from DIP0
 S X=DL_U_+Y,DPP(DJ)=DL_U_Y_U_P_R I P'["-",R'[";TXT",$P(Y,U,3)="" D XR
 D DJ^DIP1 S:X'=U X=1 Q
B W $C(7),"??" Q:$D(DIJS)  G DJ
 ;
XR I $P($G(DPP(DJ)),U,3)=$$EZBLD^DIALOG(7099),+DPP(DJ)=S,$P(DPP(DJ),U,2)=0 S DPP(DJ,"IX")=DI_DI_U_1 Q  ;**CCO/NI 'NUMBER'
 I 'Y S Y=+$P($P(DPP(DJ),U,4),"""",2) Q:'Y  D
 . N P,X,Z S Z=+$P($P(^DD(+DPP(DJ),Y,0),U,2),"P",2) G:'Z XER
 . D DTYP^DIOU(Z,.01,.P) G:P>4 XER S P=$P($G(^DD(Z,.01,0)),U,2) I P["O",P'[D G XER
 . F P=0:0 S P=$O(^DD(Z,.01,1,P)) Q:'P  I +^(P,0)=Z,$P(^(0),U,2,9)="B" Q
 . I 'P S P=$O(^DD("IX","BB",Z,"B",0)) I P S P=$$IDXOK(P,Z,Z,.01)
 . G:'P XER S P=$G(^DIC(Z,0,"GL")) G:P="" XER
 . S DPP(DJ,"PTRIX")=P_Q_"B"_Q_C Q
XER . S Y="" Q
 S P=$P($G(^DD(DL,+Y,0)),U,2) D
 . I P["O",P'["D" Q
 . I P?.E1"NJ"1.N1",2".E,$P($G(^DD(DL,+Y,0)),U,5,99)["""$""" Q
 . F P=0:0 S P=$O(^DD(DL,+Y,1,P)) Q:P'>0  I +^(P,0)=S S X=$P(^(0),U,2,9) I X?1A.AN S DPP(DJ,"IX")=DI_Q_X_Q_C_DI_U_2,Y=+$O(^DD(S,0,"IX",X,-1)),DU=+$O(^(Y,-1)),DV(1)=$P(^DD(Y,DU,0),U) Q
 . Q:P
 . N DIOUT S DIOUT=0
 . F  S P=$O(^DD("IX","F",DL,+Y,P)) Q:'P  S X=$P($G(^DD("IX",P,0)),U,2) I X]"" D  Q:DIOUT
 . . Q:'$$IDXOK(P,S,DL,+Y)
 . . S DPP(DJ,"IX")=DI_Q_X_Q_C_DI_U_2
 . . S DU=+Y,Y=DL,DV(1)=$P(^DD(DL,DU,0),U),DIOUT=1 Q 
 . Q
 I $D(DPP(DJ,"PTRIX")),'$D(DPP(DJ,"IX")) K DPP(DJ,"PTRIX")
 Q
 ;
IDXOK(DIEN,DIFILE,DISUB,DIFIELD) ;
 N X S X=$G(^DD("IX",DIEN,0))
 Q:$P(X,U,14)'["S" 0
 Q:+X'=DIFILE 0
 N J S J=$O(^DD("IX",DIEN,11.1,0)) Q:'J 0
 I $O(^DD("IX",DIEN,11.1,J)) Q 0
 S X=$G(^DD("IX",DIEN,11.1,J,0))
 I ('$P(X,U,6))!($P(X,U,3)'=DISUB)!($P(X,U,4)'=DIFIELD) Q 0
 I $D(^DD("IX",DIEN,11.1,J,1.5))!($D(^(2))) Q 0
 Q 1
 ;
ADD S X=$E(X,2,99),DIJS=DIJ,DIJ=0 D D I $G(X)=U!($D(DTOUT)) K DIJS Q
 S:$D(X) DJ=DJ+1 S DIJ=DIJS K DIJS G DJ

DIP0
DIP0 ;SFISC/XAK-COMPUTED FIELD ON A SORT, EDITING A SORT TEMPLATE ;9DEC2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S P=P_Q,DPP=$P(X,U,1)
C ;
 S DICOMP=N_$E("?",''L),DM=X,DQI="Y(",DA="DPP("_DJ_",""OVF"_N_""",",DICMX="D M^DIO2" G COLON:X?.E1":" D EN^DICOMP K DUOUT G X:'$D(X),X:Y["m"
 D XA,BB^DIP:Y["B" S:Y["D" R=R_"^^D" S Y=U_DPP,DPP(DJ,"CM")=X_" I D"_(N#100)_">0 S DISX("_DJ_")=X" G S^DIP
 ;
XA F %=0:0 S %=$O(X(%)) Q:%=""  S @(DA_"%)=X(%)")
 Q
 ;
 ;
COLON D ^DICOMPW K DUOUT
 I $D(X),$S($D(DIL(+DP)):DIL(+DP)=DL,1:1) S DPP(DJ,DL,+Y)=DP_U_(Y["m")_U_X,DIL(+DP)=DL,N=+Y,DL=+DP,DV=$J("",DJ*2-2)_$O(^DD(DL,0,"NM",0))_" FIELD" S:$D(DIPP(DIJ,+DP))#2 $P(DIPP(DIJ),U,3)=DIPP(DIJ,+DP) D XA,L G Y^DIP
X I $G(BY)]"" S X=DM_","_BY,BY="" G C ;TRY TACKING ON THE REST OF THE "BY", AFTER THE FIRST COMMA!
 I $G(DIQUIET) G Q^DIP
 G B^DIP
 ;
EDT ;
 S DIE="^DIBT(",DR=".01;3;6",DA=X,DIPP=DI,DIOVRD=1 D ^DIE S DI=DIPP,DE=$S(L=0!L:"SORT",1:L) K DR,DIE,DIPP,DIOVRD I '$D(DA)!($D(Y)) S (X,DJ)=+$G(DPP(0)) Q
 S %=$G(DPP(0,"IX")) I $P(%,U,2)]"",$P(%,U,4) D  I $G(DPP(0))']"" S (X,DJ)=0 Q
 . N X,I,Y,F,T,O,Q,DIEDITBY S DIEDITBY=1 K FR(0),TO(0),DISPAR(0),DIPP
 . S BY(0)="^"_$P(%,U,2),L(0)=$P(%,U,4)
 . F I=L(0):1 Q:'$D(DPP(I))  M DIPP(I)=DPP(I) K DPP(I)
 . F I=1:1:(L(0)-1) D  Q:'$G(L(0))
 .. S F=$P($G(DPP(I,"F")),U,2),T=$P($G(DPP(I,"T")),U,2) S:F]"" FR(0,I)=F S:T]"" TO(0,I)=T
 .. S O=$P($G(DPP(I)),U,4),Q="" S:O["!" Q=Q_"!" S:O["#" Q=Q_"#" S:$P($G(DPP(I)),U,5)]"" Q=Q_"^"_$P(DPP(I),U,5) S:Q]"" DISPAR(0,I)=Q
 .. I $G(DISPAR(0,I))]"",$G(DPP(I,"OUT"))]"" S DISPAR(0,I,"OUT")=DPP(I,"OUT")
 .. K DPP(I) Q
 . D BYOK^DIP100
 . I $G(DPP(0))]"" S X=DPP(0) F I=0:0 S I=$O(DIPP(I)) Q:'I  S X=X+1 M DPP(X)=DIPP(I)
 . K DIPP Q
 S DIPP="",DIJ=0 F DJ=$G(DPP(0)):0 S DJ=$O(DPP(DJ)) Q:'DJ  S DIJ=DIJ+1,%X="DPP(DJ,",%Y="DIPP(DIJ," D %XY^%RCR
 S DIJ=0 F DJ=$G(DPP(0)):0 S DJ=$O(DPP(DJ)) Q:DJ=""  D
 . S DIJ=DIJ+1 N X S X=$P(DPP(DJ),U,4),X=$TR(X,"B",""),X=$S(X[Q:$P(X,Q,($L(X,Q)-1)),1:X)
 . S $P(DIPP(DIJ),U,3)=X_$P(DPP(DJ),U,3)_$P(DPP(DJ),U,5)
 . S %=+DPP(DJ) D E1 S %X=0 D E2 K DPP(DJ)
 . Q
 S DJ=$G(DPP(0)),DIJ=0 F  S DIJ=+$O(DIPP(DIJ)) Q:'DIJ  S DJ=DJ+1 D DJ^DIP Q:$D(DTOUT)!($D(DIRUT))!('$D(DJ))  W:X="@" "  Deleted."
 K DIPP,DIJJ S:X'=U X=1 S:'$D(DXS) DXS=1 S DIEDT=1 Q
E1 ;
 F DIJJ=0:1 Q:'$D(^DD(%,0,"UP"))  S DIPP(DIJ,%)=$P(DIPP(DIJ),U,3),%=+^("UP"),$P(DIPP(DIJ),U,3)=$O(^("NM",0)),$P(DIPP(DIJ),U,1)=%
 Q
E2 S %X=$O(DPP(DJ,%X)) I %X'>0 K %X Q
 G E2:'$D(DPP(DJ,%X,100)) S %=%X D E1 S %=DPP(DJ,%X,100)
 I $P(%,U,3) S DIPP(DIJ,+%)=$P(DIPP(DIJ),U,3),$P(DIPP(DIJ),U,3)=$P(^DIC(+%,0),U)_":",$P(DIPP(DIJ),U)=+% G E2
 I %'["Y(1)" S %=$F(%,"OVF0") Q:'%  S %=+$E(DPP(DJ,%X,100),%+2,99),%=$P(DPP(DJ,%X,100),U)_U_DPP(DJ,"OVF0",%) Q:%'["Y(1)"
WHO S G=$TR($P($P($P(%,"Y(1)",2),")):^(",2),")"),""""),P=$P(%,"Y(1)",3),P=$P($P(P,"U,",2),")") I G]"",P]"" S P=+$O(^DD(%X,"GL",G,P,0))
 I P,$D(^DD(%X,P,0)) S:DIJJ DIPP(DIJ,+%)=DIPP(DIJ,%X),DIPP(DIJ,%X)=$P(^(0),U)_":" S:'DIJJ DIPP(DIJ,+%)=$P(DIPP(DIJ),U,3),$P(DIPP(DIJ),U,3)=$P(^(0),U)_":"
 G E2
 ;
 ;
 ;
L ;FROM DIP: READ SORT-BY VALUE
 I $D(BY)#2 K DIC S DIC="^DD(DL,",DIC(0)="Z",X=$P(BY,","),BY=$P(BY,",",2,99) I X'="@" K DV Q
 K DIR D
 . N X S DIR(0)="FOU",DIR("A")=DV
 . S X=$P($G(DIPP(DIJ)),U,3) I X]"" S DIR("B")=X
 . I X="" S X=$G(DV(1)) I X]"" S DIR(0)="FOAU",DIR("A")=DV_": "_X_"// "
 . S DIR(0)=DIR(0)_"^1:255",DIR("?")="^D DIC^DIP0"
 D ^DIR K DIR,DV,DIRUT,DIROUT S:$D(DTOUT) X="^"
 K:X?1"^"1.E DUOUT
 I X="@" K DPP(DJ) S DJ=DJ-1
 D SETDIC Q
 ;
SETDIC K DIC S DIC="^DD(DL,"
 S DIC("S")="S %=$P(^(0),U,2) I %'[""m"",$S('%:1,1:$P(^DD(+%,.01,0),U,2)'[""W""&$S($D(DIL(+%)):DIL(+%)=DL,1:1))"_$S($D(DICS):" "_DICS,1:"")
 S DIC("W")="W:$P(^(0),U,2) ""  multiple)""" I $T(DICW^DIALOGZ)]"" D DICW^DIALOGZ(DL)
 S DIC(0)="ZE"_$E("O",$D(DIPP)#10) Q
 ;
DIC D SETDIC,^DIC,DIP^DIQQ Q

DIP1
DIP1 ;SFISC/GFT,TKW-PROCESS FROM-TO ;11:38 AM  9 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D DJ Q
DUP D DPQ G DIP1^DIQQQ:$D(A(1))
 I '($D(BY)#2),$D(DPP((+$G(DPP(0))+2),"T"))!$D(DPP((+$G(DPP(0))+3)))!$D(DPP(0))!$D(DXS) S DK=S G S^DIBT
DIP2 S DC=0 D:'$D(DISYS) OS^DII G ^DIP2
 ;
FTEM I $G(DIBT1) I $O(^DIBT(DIBT1,2,0))!$G(^DIBT(DIBT1,"BY0"))]"" D
 .I $D(DIBTOLD) D SNEW^DIBT Q
 .D US^DIBT Q
N ;
 S DCC=DI,C="," G DIP2
 ;
DPQ K A S DPP=$G(DPP(0)) F X=DPP+1:1 Q:$D(DPP(X))#2=0  S A=$E($P(DPP(X),U,1,3),1,60),Y=$P(DPP(X),U,4),DPP=X S:Y'["'" (A($D(A(A))),A(A))=0 I Y'["@",Y'["'" S DPQ(+DPP(X),$P(Y,"""",2)+$P(DPP(X),U,2))=""
 K DPP(X) Q
 ;
DIP11 ;FROM DIP11
 N F1,F2,F3,T1,T2,T3 D FT^DIP12
 K DPP(DJ,"F"),DPP(DJ,"T"),DIARS,DIARE G J
 ;
DJ ;CALLED FROM DIP ROUTINE AT 2 PLACES
 N F1,F2,F3,T1,T2,T3,DIFLD,DIFLDREG
 D DTYP I $D(DPP(DJ,"F")) D OPT^DIP12 Q
 D FT^DIP12
J ;
 N DIFRO,DIPR
 S A=+DPP(DJ),R=$P(DPP(DJ),U,3)
 I $P(DPP(DJ),U,10)=3 S T3=$G(T2),F3=$G(F2)
 I $P(DPP(DJ),U,10)=1,T3?.E1"@24:00" S T3=$P(T3,"@")
 I DIFLD,$D(^DD(A,DIFLD,0)) S DC=$P(^(0),U,2,3),DIPR=$P(^(0),U)
 E  I DIFLDREG]"",$D(^DD(A,.001,0)) S DC=$P(^(0),U,2,3),DIPR=$P(^(0),U)
 E  S DC=$P(DPP(DJ),U,7,8),DIPR=$P(DPP(DJ),";""",2,99),DIPR=$P(DIPR,"""",1,$L(DIPR,"""")-1),DIPR=$S(DIPR'="":DIPR,1:R),%=$E(DIPR,$L(DIPR)-1,$L(DIPR)),%=$S(%=": ":2,$E(%,2)=":":1,1:0) I % S DIPR=$E(DIPR,1,$L(DIPR)-%)
 K DIC,DIARE,DIARS N DIFRTO
S K DIERR,DPP(DJ,"SRTTXT")
 S A=$$EZBLD^DIALOG(7070),DIFRTO="?" I 'L I $D(FR)#2!($O(FR(0))) D Z("FR") I DIFRTO'="?" G S0 ;**CCO/NI 'FIRST'
 I $D(DISV) D FROM^DIARCALC
PREV K DIR I $G(F3)]"" S A=F3,X=$G(DPP(DJ,"TXT")) S:X="" X=$G(DIPP(DIJ,"TXT")) I X]"" ;S DIR("A",1)=$J("",DJ-1*2)_"* Previous selection: "_X
 S DIR(0)="FO^1:245",DIR("A")=$J("",DJ-1*2)_$$EZBLD^DIALOG(7068,DIPR),DIR("?")="^D DIP1^DIQQ(1)" S:A]"" DIR("B")=A ;**CCO/NI 'START WITH'
 D ^DIR W:$D(DTOUT) $C(7) G Q:$D(DTOUT)!$D(DUOUT)
 I X=$$EZBLD^DIALOG(7070) S A=X,X="" ;**CCO/NI
 K DIR,DIRUT,DIROUT,DIERR
S0 I X="",A=$$EZBLD^DIALOG(7070) D:$P(DPP(DJ),U,5)[";TXT" STXT(DJ,"","",DITYP) D OPT^DIP12 Q  ;**CCO/NI
 S Y(0)="" D CK^DIP12:X'="" I X'="" I X'?.ANP!($D(DIERR)) G:DIFRTO="?" S G Q
QUOTE I $A(X)=34,'$G(DIQUIET),DIFRTO="?" D BLD^DIALOG(7075),MSG^DIALOG("WH")
 D PAR(1)
 D FRV
 S Y=Y_U_X S:Y(0)]"" Y=Y_U_Y(0) S (B,DPP(DJ,"F"))=Y
T K DIERR S Y="z",A=$$EZBLD^DIALOG(7071),DIFRTO="?" I 'L I $D(TO)#2!($O(TO(0))) D Z("TO") I DIFRTO'="?" G T0 ;**CCO/NI
 I $D(DISV) D TO^DIARCALC
 G T0:$G(DIAR)=4
TOPR K DIR S DIR(0)="FO^1:245",DIR("A")=$J("",DJ-1*2)_$$EZBLD^DIALOG(7069,DIPR),DIR("?")="^D DIP1^DIQQ(2)" D  S:A]"" DIR("B")=A
 .I $G(T3)]"" S A=T3 I $G(T1)]"",$$BEF^DIU5(T1,$P(B,U)) S A=$$EZBLD^DIALOG(7071) ;*CCO/NI 'LAST'
 D ^DIR W:$D(DTOUT) $C(7) G Q:$D(DUOUT)!($D(DTOUT))
LAST I X=$$EZBLD^DIALOG(7071) S X="",Y="z" ;**CCO/NI
 K DIR,DIRUT,DIROUT,DIERR
T0 S Y(0)=""
 D STXT(DJ,B,"^"_X,DITYP)
 I $D(DPP(DJ,"SRTTXT")) S:$G(DPP(DJ,"F"))]"" B=DPP(DJ,"F")
 D:X]"" CK^DIP12 I $D(DIERR) G:DIFRTO="?" T G Q
2400 I DITYP=1,Y,Y'["." S Y=Y_".24",X=X_"@2400",Y(0)=Y(0)_"@24:00"
 I Y'="z" D PAR(2)
 S:$D(DPP(DJ,"SRTTXT")) Y=$P(" ",U,(X'="@"))_Y S Y=Y_U_X S:Y(0)]"" Y=Y_U_Y(0) S DPP(DJ,"T")=Y
 I B["?z"!($P(Y,U)="@") D OPT^DIP12 Q
 I $$BEF^DIU5($P(Y,U),$P(B,U)) D:'$G(DIQUIET) FER1^DIQQ G:DIFRTO="?" T G Q
 D OPT^DIP12 Q
 ;
FRV N M I +$P(Y,"E")=Y S Y=Y-$S(Y:.000001,$P(DPP(DJ),U,2)'=0&$L(DC):1,1:0) Q
 F %=$L($E(Y,1,30)):-1:1 S M=$A(Y,%) I M>32 S Y=$E(Y,1,%-1)_$C(M-1)_$C(122) Q
 Q
 ;
DTYP N S S DIFLDREG=$P(DPP(DJ),U,2),DIFLD=DIFLDREG+$P($P(DPP(DJ),U,4),"""",2) I 'DIFLD,DIFLDREG'="" S DIFLD=.001
 S S=$P(DPP(DJ),U)
D1 K DITYP S DITYP=""
 I DIFLD D DTYP^DIOU(+S,DIFLD,.DITYP) I $G(^DD(S,DIFLD,2))]"",DITYP'=1 S DITYP=4 ;GFT
 I DITYP=6,$G(DITYP("T"))=1 S DITYP("D")="TS"
 S:$G(DITYP("T")) DITYP=DITYP("T")
 I DITYP="",'DIFLD,$P(DPP(DJ),U,7)]"" D
 . N I,X S X=$P(DPP(DJ),U,7),I=""
 . F  S I=$O(^DI(.81,"C",I)) Q:I=""  I X[I S DITYP=$O(^(I,0)) Q
 . S:DITYP=1 DITYP("D")="TS"
 . Q
 S:'DITYP DITYP=4
DTYPQ S $P(DPP(DJ),U,10)=DITYP Q
 ;
Q K DITYP,DIERR,DIR S:$D(DTOUT) X="^" G Q^DIP
 ;
PAR(M) S M=$P($P($P($P(DPP(DJ),U,5),";P",2),";",1),"-",M)
 I M?1.ANP S DIPA($E(M,1,30))=Y
 Q
 ;
Z(%) I %="FR" S X=$S($D(FR)#2:$P(FR,",",DJ),$D(FR(DJ))#2:FR(DJ),1:"?")
 I %="TO" S X=$S($D(TO)#2:$P(TO,",",DJ),$D(TO(DJ))#2:TO(DJ),1:"?")
 I X'="?" S DIFRTO=""
 Q
 ;
STXT(DJ,F,T,DITYP) ;DETERMINE IF USER WANTS TO SORT FREE-TEXT FIELDS CONTAINING NUMBERS AS TEXT.
 K DPP(DJ,"SRTTXT") Q:"3,4"'[DITYP
 N F2,T2 S F2=$P(F,U,2),T2=$P(T,U,2)
 I F2]"" Q:F2=T2  Q:($E(F2,1)?1A)&($E(T2,1)?1A)  I F2?1.N.1".".N,T2?1.N.1".".N Q:+F2'=F2&(+T2'=T2)
 I $P($G(DPP(DJ)),U,5)[";TXT" S DPP(DJ,"SRTTXT")="SORT" G N2
 Q:+$E(F2,"E")=F2&(+$E(T2,"E")=T2)
 I F2?1.N.1".".N,+F2'=F2 S DPP(DJ,"SRTTXT")="RANGE"
 I T2?1.N.1".".N,+T2'=T2 S DPP(DJ,"SRTTXT")="RANGE"
N2 Q:'$D(DPP(DJ,"SRTTXT"))
 K DPP(DJ,"IX"),DPP(DJ,"PTRIX")
 I F]"",$P(F,U)'="?z",$G(DPP(DJ,"F"))]"" N Y D  S DPP(DJ,"F")=Y_U_$P(F,U,2,3)
 . S Y=$P(F,U) I F2]"" S Y=" "_F2 D FRV
 . Q
 Q:$G(DPP(DJ,"T"))=""!("@"[$P(T,U))
 S DPP(DJ,"T")=$S($P(T,U,2)]"":" "_$P(T,U,2)_U_$P(T,U,2,3),1:T) Q

DIP10
DIP10 ;SFISC/TKW - PROCESS BY(0) INPUT VARIABLES ;12:59 PM  6 Aug 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 N I,J,K,X,Y,DIR K DPP(0),DPP(1) I $G(BY(0))="" D BLD^DIALOG(201,"BY(0)")
 I $G(BY(0))]"",$E($G(BY))="[" D BLD^DIALOG(201,"BY")
 I $E(BY(0))'="[" D  I Y=-1 D BLD^DIALOG(201,"BY(0)")
 . N %,X S X=BY(0),Y="" I X'["(" S:X[")"!(X[",") Y=-1 Q:Y=-1  S X=X_"("
 . S:$E(X)'=U X=U_X
 . S %=$E(X,$L(X)) S:%=")" $E(X,$L(X))=",",%="," I ",("'[% S X=X_","
 . S BY(0)=X Q
 I $E(BY(0))="[" D  I Y'<0 S BY(0)="^DIBT("_+Y_",1,",L(0)=1
 .N DIC,DIBTFILE,DJ,DCC,DI,DNP,L S DIBTFILE=S N S
 .S X=$P($E(BY(0),2,99),"]"),DIC="^DIBT(",DIC(0)="Q",DIC("S")="I '$P(^(0),U,8),$P(^(0),U,4)=DIBTFILE,$P(^(0),U,5)=DUZ!'$P(^(0),U,5),$O(^(1,0))"
 .D ^DIC
 .I Y<0 S I(1)=BY(0) D BLD^DIALOG(1500,.I)
 .Q
 I '$G(L(0))!($G(L(0))>8) D BLD^DIALOG(201,"L(0)")
 G:$D(DIERR) EX
 S DPP(0)=L(0)-1 K DISTXT
 S J=8004 I BY(0)?1"^DIBT("1.N1",1," S J=+$P(BY(0),"^DIBT(",2) D ENT(0,J) S J=8003
 I '$D(DISTXT) S I(1)=$S($E(BY(0),$L(BY(0)))=",":$E(BY(0),1,($L(BY(0))-1))_")",1:BY(0)) D BLD^DIALOG(J,.I,"","DIR") S DPP(0,"TXT")=DIR
DPP F I=1:1:L(0)-1 S DPP(I)=S_"^^SORT FIELD "_I_"^""@^^^^^^4",DPP(I,"SER")="999^999",(DPP(I,"GET"),DPP(I,"CM"))="S DISX("_I_")=DIOO"_(L(0)-I)
 S DPP(0,"IX")=$E(U,$E(BY(0))'=U)_BY(0)_DCC_U_$S($D(L(0)):L(0),1:1)
 F I=0:0 S I=$O(FR(0,I)) Q:'I  I FR(0,I)]"",$D(DPP(I)) S (Y,K)=FR(0,I) D FRV^DIP1 S DPP(I,"F")=Y_U_K S:I=1 DPP(0,"F")=Y_U_K
 F I=0:0 S I=$O(TO(0,I)) Q:'I  I TO(0,I)]"",$D(DPP(I)) S DPP(I,"T")=TO(0,I)_U_TO(0,I)
 F I=0:0 S I=$O(DISPAR(0,I)) Q:'I  I DISPAR(0,I)]"" D
 .S X="""",J=$P(DISPAR(0,I),U) F K="!","#","+","@" I J[K S X=X_K
 .I X'["@",$P(DISPAR(0,I),U,2)'[";""" S X=X_"@"
 .S $P(DPP(I),U,4)=X S $P(DPP(I),U,5)=$P(DISPAR(0,I),U,2)
 .I $G(DISPAR(0,I,"OUT"))]"" S DPP(I,"OUT")=DISPAR(0,I,"OUT")
 .Q
 I $D(FR)#2!($D(TO)#2) S J="",$P(J,",",L(0))="" S:$D(FR)#2 FR=J_FR S:$D(TO)#2 TO=J_TO G ENX
 S J=$O(FR(8),-1) I J F J=J:-1:0 I $D(FR(J))#2 S FR(J+DPP(0))=FR(J) K FR(J)
 S J=$O(TO(8),-1) I J F J=J:-1:0 I $D(TO(J))#2 S TO(J+DPP(0))=TO(J) K TO(J)
ENX S DJ=L(0) K L(0),FR(0),TO(0),DISPAR(0)
 Q
 ;
ENT(I,J) ;MOVE TEXT OF SEARCH AND GET CODE FROM SEARCH TEMPLATE TO DPP ARRAY
 ;I=Entry no.in DPP array, J=record number for search template
 Q:$G(I)=""  Q:'$G(J)  N DIR,%X,%Y
 D BLD^DIALOG(8003,$P($G(^DIBT(J,0)),U),"","DIR") D:$O(^DIBT(J,"O",0))  S DISTXT(99,0)=DIR
 . S %X="^DIBT("_J_",""O"",",%Y="DISTXT(" D %XY^%RCR
 . S DIR="("_DIR_")" Q
 S:I DPP(I,"GET")="S DISX("_I_")=D0"
 Q
 ;
EX K BY(0),L(0) I $G(DIQUIET) D CLEAN^DIEFU Q
 D MSG^DIALOG("W") Q
 ;
 ;DIALOG #201    'The input variable...is missing or invalid.'
 ;       #1500   'Search template...in BY(0) variable cannot be found...'
 ;       #8003   'Records from list on...search template.
 ;       #8004   'Sort using...'
 ;

DIP100
DIP100 ;SFISC/TKW - PROCESS BY(0) INPUT VARIABLES (CONT.OF DIP10) ;12:27 PM  13 Oct 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ENBY0 ; Interactive dialogue to prompt for BY(0) data
 Q:DUZ(0)'["@"  K DPP,BY(0),L(0),FR(0),TO(0),DISPAR(0) N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
EDBY W ! S DIR(0)=".401,1622O",DIR("B")=$G(BY(0)) D ^DIR K DIR G:$G(DTOUT)!("^^@"[X) EXBY0 S:$E(Y)="^" Y=$E(Y,2,9999) S BY(0)="^"_$P(Y,U)
 S DIR(0)=".401,1623",DIR("B")=$G(L(0)) D ^DIR K DIR G:X="@" EDBY G:$G(DIRUT) EXBY0 S L(0)=$P(Y,U)
 F X=L(0):1:8 K FR(0,X),TO(0,X),DISPAR(0,X)
 G:L(0)'>1 BYOK N DISUB D  G:$G(DTOUT)!($G(DIROUT)) EXBY0 G BYOK
E2 . S DIR("?")="Enter 'YES' to experiment with these settings",DIR("?",1)="This will let you define sort ranges for any of the variable subscripts"
 . S DIR("?",2)="in the global referenced by BY(0).  It will also let you define sort",DIR("?",3)="qualifiers including page breaks and customized subheaders.",DIR("?",4)=""
 . W ! S DIR(0)="Y",DIR("A")="Edit ranges or subheaders",DIR("B")="NO" D ^DIR K DIR Q:'Y!$D(DIRUT)
 . W ! S DIR(0)=".4011624,.01^^K:X>(L(0)-1) X",DIR("B")=1 D ^DIR K DIR,DINUM Q:$G(DIRUT)  S DISUB=$P(Y,U)
E3 . S DIR(0)=".4011624,1",DIR("B")=$G(FR(0,DISUB)) D ^DIR K DIR Q:$G(DTOUT)  Q:$G(DIROUT)  G:X="^" E2 K FR(0,DISUB) I X'="@",Y]"" S FR(0,DISUB)=$P(Y,U)
 . S DIR(0)=".4011624,2",DIR("B")=$G(TO(0,DISUB)) D ^DIR K DIR Q:$G(DTOUT)  Q:$G(DIROUT)  G:X="^" E2 K TO(0,DISUB) I X'="@",Y]"" S TO(0,DISUB)=$P(Y,U) I $G(FR(0,DISUB))]$P(Y,U) D  G E3
EGP .. W !,$$EZBLD^DIALOG(1511) Q  ;**CCO/NI 'START WITH IS GREATER THAN GO TO!'
 . S DIR(0)=".4011624,3.1",DIR("B")=$P($G(DISPAR(0,DISUB)),U,1) D ^DIR K DIR D:X="@"  G:$D(DUOUT)!$D(DTOUT) E2 S:Y]"" $P(DISPAR(0,DISUB),U,1)=Y
 .. I $P($G(DISPAR(0,DISUB)),U,2)]"" S $P(DISPAR(0,DISUB),U,1)="" Q
 .. K DISPAR(0,DISUB) Q
 . S DIR(0)=".4011624,3.2",DIR("B")=$P($G(DISPAR(0,DISUB)),U,2) D ^DIR K DIR D:X="@"  G:$D(DIRUT) E2 S $P(DISPAR(0,DISUB),U,2)=Y
 .. I $P($G(DISPAR(0,DISUB)),U,1)]"" S $P(DISPAR(0,DISUB),U,2)="" Q
 .. K DISPAR(0,DISUB) Q
 . S DIR(0)=".4011624,4",DIR("B")=$G(DISPAR(0,DISUB,"OUT")) D ^DIR K DIR Q:$G(DTOUT)  Q:$G(DIROUT)  K DISPAR(0,DISUB,"OUT") I "^@"'[X,Y]"" S DISPAR(0,DISUB,"OUT")=Y
 . G E2
BYOK I $G(DIEDITBY) Q:DUZ(0)'["@"  N DIR,DTOUT,DUOUT,DIRUT,DIROUT,X,Y
 W !!,"  BY(0)="_BY(0)_"     L(0)="_L(0),!
 I L(0)>1,$O(FR(0,0))!$O(TO(0,0))!$O(DISPAR(0,0)) D
 . F X=1:1:(L(0)-1) W !,"  SUB: "_X D
 .. W ?10,"FR(0,"_X_"): ",$G(FR(0,X)),!,?10,"TO(0,"_X_"): ",$G(TO(0,X)),!
 .. W ?10,"DISPAR(0,"_X_") PIECE ONE: ",$P($G(DISPAR(0,X)),U,1),!
 .. W ?10,"DISPAR(0,"_X_") PIECE TWO: ",$P($G(DISPAR(0,X)),U,2),!
 .. W:$D(DISPAR(0,X,"OUT")) ?10,"DISPAR(0,"_X_",OUT): ",$G(DISPAR(0,X,"OUT")),!
 .. Q
 .Q
 S DIR(0)="Y",DIR("A")="  OK",DIR("B")="YES" D ^DIR K DIR G:$G(DIRUT) EXBY0 G:'Y EDBY
 D EN^DIP10 G:$G(BY(0))="" EDBY Q
EXBY0 W ! K BY(0),L(0),FR(0),TO(0),DISPAR(0),DPP(0) Q

DIP11
DIP11 ;SFISC/XAK,TKW-GET SORT TEMPLATE ;29MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
SCREENTM(Z,D2) ;Z=ZERO NODE OF SORT TEMPLATE;  D2 = THERE IS SORT-BY LOGIC
 I $P(Z,U,4)-DL Q 0 ;TEMPLATE MUST BE FOR THIS FILE
 I 'D2&'L D  Q $D(Z) ;IN SILENT MODE, DON'T PICK SEARCH OR INQUIRY TYPE IF THERE'S A SORT TYPE OF SAME NAME
 .N NAME,I S NAME=$P(Z,U) F I=0:0 S I=$O(^DIBT("B",NAME,I)) Q:'I  I I-Y,$P($G(^DIBT(I,0)),U,4)=DL,$D(^(2)) K Z Q
 I DUZ(0)="@" Q 1
 I D2 Q:'L 1 Q:$P(Z,U,3)="" 1 Q $TR($P(Z,U,3),DUZ(0))'=$P(Z,U,3) ;IF A SORT TEMPLATE, ACCESS CODES MUST MATCH
 I '$P(Z,U,5) Q 1
 I $P(Z,U,5)=DUZ Q 1 ;If a SEARCH or INQUIRY TEMPLATE, USER MUST MATCH
 Q 0
 ;
TEM ;
 G B^DIP:DJ-1 K DPP,DIC
 S X=$P($E(X,2,99),"]",1),DIC(0)="ZQS"_$E("E",'($D(BY)#2)!''L),DIC="^DIBT(",D="F"_DL
 S DIC("S")="I $$SCREENTM^DIP11(^(0),$D(^(2)))"
 I X?."?" S:X'?1"???" X="??" D IX^DIC S DJ=0 Q
 D ^DIC I Y<0 S DJ=0 Q
EMPTY I '$D(^DIBT(+Y,2)),'$D(^(1)) W:'$G(DIQUIET) !,$$EZBLD^DIALOG(1509) S DJ=0 Q  ;**CCO/NI  SORT TEMPLATE HAS NO VALUES
 S DPP(DJ)=DL_"^^'"_$P(Y,U,2)_"' "_$$EZBLD^DIALOG(7099)_"^@'"_P,(DIBT1,X)=+Y,DIBT2=$P(Y(0),U),D=DIC_X_"," K DIC ;*CCO/NI   SORT TEMPLATE 'NUMBER'
 I '$D(FLDS),$G(^DIBT(X,"DIPT"))]"" S FLDS="["_^("DIPT")_"]" I L D
 . ;N %,A S %(1)=^("DIPT") D BLD^DIALOG(8030,.%,"","A") W ! F %=0:0 S %=$O(A(%)) Q:'%  W A(%),!
 . S L=0 Q
 I $D(^DIBT(X,1)) S DIC=D_1_C,DPP(DJ,"SER")="998^998" D ENT^DIP10(DJ,DIBT1) I $D(^DIBT(X,1)) S Y=1 D
 .F DY=1:1 S Y=$O(^(Y,-1)) S:Y="" Y=-1 S:$O(^(Y)) Y=$O(^(Y)) I $D(^(Y))<9 S DPP(DJ,"IX")=DIC_DI_U_DY,DIBT=X Q
 .Q
ENDIPT I $G(^DIBT(X,"BY0"))="",'$D(^DIBT(X,2)) Q
 I $G(^DIBT(X,"BY0"))="",$G(^DIBT(X,2,0))="" S %Y="DPP(",%X=D_2_C D %XY^%RCR S DIBTOLD="" D CNVCM G T0
 S D=$G(^DIBT(X,"BY0")) I $P(D,U)]"",$P(D,U,2) D
 . N Y K DISPAR(0) S BY(0)="^"_$P(D,U),L(0)=$P(D,U,2)
 . F D=1:1:(L(0)-1) D
 .. S Y=$G(^DIBT(X,"BY0D",D,0))
 .. I '$D(FR(0,D))#2,$P(Y,U,2)]"" S FR(0,D)=$P(Y,U,2)
 .. I '$D(TO(0,D))#2,$P(Y,U,3)]"" S TO(0,D)=$P(Y,U,3)
 .. I $G(^DIBT(X,"BY0D",D,1))]"" S DISPAR(0,D)=^(1) S:$G(^DIBT(X,"BY0D",D,2))]"" DISPAR(0,D,"OUT")=^(2)
 .. Q
 . N X D EN^DIP10 Q
 ;S DJ=$O(DPP(999),-1)+1
 F D=0:0 S D=$O(^DIBT(X,2,D)) Q:'D  D
 .N A,B,C S DPP(DJ)=$G(^DIBT(X,2,D,0))
 .S A="A" F  S A=$O(^DIBT(X,2,D,A)) Q:A=""  I A'="SER" S DPP(DJ,A)=^(A)
 .F B=1,2,3 F A=0:0 S A=$O(^DIBT(X,2,D,B,A)) Q:'A  S C=$G(^(A,0)) D
 ..I B=1 S:$P(C,U)=+C DPP(DJ,+C)=$P(C,U,2) Q
 ..I B=2 S:($P(C,U)=+C)&($P(C,U,2)=+$P(C,U,2)) DPP(DJ,+C,$P(C,U,2))=$P(C,U,3,7)_U_$G(^DIBT(X,2,D,2,A,"RCOD")) Q
 ..I $P(C,U,1)]"",$P(C,U,2)]"" S DPP(DJ,$P(C,U,1),$P(C,U,2))=$G(^DIBT(X,2,D,3,A,"OVF0"))
 ..Q
 .S DJ=DJ+1 Q
T0 Q:$D(DIBTRPT)
 I $D(DIAR) S DIARU=X ;I '$P(DIARB,U,2) S $P(DIARB,U,2)=DIARU
 F D=0:0 S D=$O(^DIBT(X,3,D)) Q:D=""  S DSC(D)=^(D)
 I 'L!($D(DPP(0))&(DUZ(0)'="@")) G T1
 S %=$P(^DIBT(X,0),U,6)
 I %]"" F D=1:1:$L(%) I DUZ(0)[$E(%,D)!(DUZ(0)="@") S %="" Q
 I %="",X'<1 S %=$P(Y(0),U,1) D  G Q:$D(DIRUT) I %=1 K DIBTOLD G EDT^DIP0
 . N X,Y K DIR S DIR(0)="Y",DIR("B")="NO",DIR("A")="WANT TO EDIT '"_%_"' TEMPLATE" D ^DIR K DIR
 . S %=Y Q
T1 F DJ=$G(DPP(0))+1:1 Q:'$D(DPP(DJ))  D  I '$D(DJ)!($D(DTOUT))!($D(DIRUT)) G Q
 . N DL,DU,DV,X,Y,Z,DIFLD,DIFLDREG K DPP(DJ,"PTRIX") S DL=$P(DPP(DJ),U),Y=$P(DPP(DJ),U,2,3)
 . D DTYP^DIP1,STXT^DIP1(DJ,$G(DPP(DJ,"F")),$G(DPP(DJ,"T")),DITYP)
 .; Save off old "IX" node to preserve it if template is hand-edited.
 . I DJ=1 N DISAVIX,DIRECSRT S DISAVIX=$G(DPP(DJ,"IX")),DIRECSRT=0
 . K DPP(DJ,"IX")
 . I $P(DPP(DJ),U,4)'["-",'$D(DPP(DJ,"SRTTXT")),$P($G(DPP(DJ,"F")),U)'="?z",$P($G(DPP(DJ,"T")),U)'="@" D XR^DIP I DJ=1,DISAVIX]"",DISAVIX'=$G(DPP(DJ,"IX")) D
 .. N I,X,Y,Z S X=$P(DISAVIX,U,3),Z=$P(DISAVIX,U,2) I $E(Z,1,$L(X))'=X S DIRECSRT=1 G T12
 .. S Z=$E(Z,($L(X)+1),99),Z=$P(Z,"""",2) Q:Z=""  I '$D(^DD(S,0,"IX",Z)) D  Q:Z=""
 ... Q:S=405&(Z="ATT3")  S Z="" Q
T12 .. S DPP(DJ,"IX")=DISAVIX,DPP(DJ,"SER")="998^998"
 .. I DIRECSRT=1,$P(DPP(DJ),U,2)="",'($P($P(DPP(DJ),U,4),"""",2)),'$D(DPP(DJ,"CM")) S $P(DPP(DJ),U,2)=0
PROMPT . I $D(DPP(DJ,"ASK")) S DPP(DJ,"ASK")=1 I $G(DICNVDPP)'=1 D DIP11^DIP1 Q  ;GFT PATCH 97
 . I DJ=1,DISAVIX=1 Q
 . D OPT^DIP12 Q
 Q:$G(DICNVDPP)=1
 D DPQ^DIP1 S X="["_DIBT2 K DIARE,DIARS,DIARB Q
 ;
CNVCM ;Convert V20 DPP array to V21 DPP array (for prints queued in V20 to run in V21)
 N D,I,J,X,Y,Z,N
 F D=0:0 S D=$O(DPP(D)) Q:'D  S X=$G(DPP(D,"CM")) I X["S X(" D
 . S (I,Z)=0 F  S Y=$F(X,"S X(",Z) Q:'Y  S Z=Y,I=I+1
 . Q:'Z  S N=+$E(X,Z) Q:'N
 . I $L(X)+16>248 D  Q
 .. S Z="OVF",I=-1 F  S Z=$O(DPP(D,Z)) Q:$E(Z,1,3)'="OVF"  S I=$E(Z,4,99)
 .. S Z="OVF"_(I+1),Y=$P(X," S X=",1) S:Y]"" Y=Y_" "
 .. S DPP(D,"CM")=Y_"X DPP("_D_","""_Z_""",9.2) I $G(X("_N_"))]"""" S DISX("_N_")=X("_N_")"
 .. S Y=$P(X," S X=",2,99),DPP(D,Z,9.2)=$P("S X=",U,(Y]""))_Y Q
 . S DPP(D,"CM")=$P(X,"S X(",1,I)_"S DISX("_$P(X,"S X(",I+1,99)
 . Q
 Q
 ;
Q S:$D(DUOUT)!($D(DTOUT)) X="^" G Q^DIP
 ;DIALOG #8030  'Because...sort template...linked w/Print template...

DIP12
DIP12 ;SFISC/TKW-PROCESS FROM-TO (CONT.) ;08:02 PM  9 Dec 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
OPT ;Build code to extract field & test sort criteria, build sort description.
 N S,F,X,%,F1,F2,F3,T1,T2,T3,N,DIRANGE
 S S=$P(DPP(DJ),U),F=$P(DPP(DJ),U,2),N=$P(DPP(DJ),U,3) S:N["""" N=$$CONVQQ^DILIBF(N),DIRANGE=""
 S X="DISX("_DJ_")",DPP(DJ,"GET")=""
EGP I +$P(S,"E")=S,F D GET^DIOU(S,F,X,.%) S DPP(DJ,"GET")=% I N=$P($G(^DD(S,F,0)),U) S %=$$LABEL^DIALOGZ(S,F) I %]"" S DPP(DJ,"LANG")=N,(DPP(DJ,"LANG",+$G(DUZ("LANG"))),N)=%,$P(DPP(DJ),U,3)=N ;**CCO/NI FIELD LABEL
 I $D(DPP(DJ,"CM")) S DPP(DJ,"GET")=DPP(DJ,"CM")
 I $G(DPP(DJ,"SRTTXT"))="SORT" S DPP(DJ,"GET")=DPP(DJ,"GET")_" S:"_X_"]"""" "_X_"="_""" ""_"_X
 I +$P(S,"E")=S,F,$P(DPP(DJ),U,10)=2 D
 . N % S %=$P($G(^DD(S,F,0)),U,2) I %'["C",%'["N" Q
 . S DPP(DJ,"GET")=DPP(DJ,"GET")_" S:"_X_"]"""" "_X_"=+"_X
 . Q
 I $P(DPP(DJ),U,4)["@B" S %=X,DPP(DJ,"TXT")=N G O2
 I S,F=0 D BIJ^DIOU(S,.01,.%,.F) S X="D"_$G(%(S)) K %,F
NOTNULL I '$D(DPP(DJ,"F")) S %=$$NULL^DIOC(X,"'"),DPP(DJ,"TXT")=$$EZBLD^DIALOG(7093,N) G O2 ;**CCO/NI 'NOT NULL'
RANGE D FT S DIRANGE="" S:$G(DPP(DJ,"SRTTXT"))="RANGE" DIRANGE=""" ""_"
 S %=""
 I F1="?z" D  G O2
ALL . I T1="z" S %="1",DPP(DJ,"TXT")="All "_N_$$EZBLD^DIALOG(7094) Q  ;**CCO/NI  'INCLUDES NULLS'
NULL . I T1="@" S %=$$NULL^DIOC(X),DPP(DJ,"TXT")=$$EZBLD^DIALOG(7092,N) Q  ;**CCO/NI 'IS NULL'
 . S %=$$AFT^DIOC(DIRANGE_X,T1,"'")
NULLPLUS . S DPP(DJ,"TXT")=N_$S(T3]"":" to "_T3,1:"")_$$EZBLD^DIALOG(7094) ;**CCO/NI 'INCLUDES NULLS'
 . Q
 S DPP(DJ,"TXT")=N_$S(F3]"":" from "_F3,1:"")
 I T1="@"!(T1="z") D  G O2
 . S %="" I T1="@" S DPP(DJ,"TXT")=DPP(DJ,"TXT")_$$EZBLD^DIALOG(7094),%=$$NULL^DIOC(X)_"!("
 . S %=%_$$AFT^DIOC(DIRANGE_X,F1) S:T1="@" %=%_")"
 . Q
 I F3]"",F3=T3 S %=$$EQ^DIOC(X,T1),DPP(DJ,"TXT")=N_" equals "_F3 G O2
 S %=$$BTWI^DIOC(DIRANGE_X,F1,T1,"","SORT")
 I T3]"" S DPP(DJ,"TXT")=DPP(DJ,"TXT")_" to "_T3
O2 S DPP(DJ,"QCON")="I "_%
 K DITYP Q
 ;
FT ;ALSO CALLED BY DIP1
 S %=$G(DPP(DJ,"F")) I %="" S %=$G(DIPP(+$G(DIJ),"F"))
 S F1=$P(%,U),F2=$P(%,U,2),F3=$P(%,U,3) S:F3="" F3=F2 S:$E(F1)="""" F1=""""_F1
 S %=$G(DPP(DJ,"T")) I %="" S %=$G(DIPP(+$G(DIJ),"T"))
 S T1=$P(%,U),T2=$P(%,U,2),T3=$P(%,U,3) S:T3="" T3=T2
 Q 
 ;
CK ;VALIDATE FIELDS/DATA
 G QQ:X[U I X="@" S Y=X K DPP(DJ,"IX"),DPP(DJ,"PTRIX") Q
 I DITYP=1 D  G:Y=-1 QQ Q  ;**CCO/NI   ASK FOR A DATE
 .N %DT S %DT=""
 .S:$G(DITYP("D"))["T" %DT="T"
 .S:$G(DITYP("D"))["S" %DT=%DT_"S"
 .S %DT=%DT_$E("E",(DIFRTO="?"))
 .D ^%DT I Y>0 D  S Y(0)=%DT
 ..S %DT=Y N Y S Y=%DT X ^DD("DD") S %DT=Y
 I DITYP=3 D  G:Y=-1 QQ Q  ;**CCO/NI  ASK FOR A 'SET' VALUE
 . S Y=$G(DITYP("S","E",X)) I Y]"" S Y(0)=Y_" ("_X_")" W:DIFRTO="?" "    ",$$EZBLD^DIALOG(8146,Y) Q  ;**CCO/NI
 . I $D(DITYP("S","I",X)) S Y=X,Y(0)=X_" ("_DITYP("S","I",X)_")" W:DIFRTO="?" "  "_DITYP("S","I",X) Q
 . S D=$O(DITYP("S","E",X)) I D]"",$P(D,X)="" S Y=DITYP("S","E",D),Y(0)=Y_" ("_D_")" W:DIFRTO="?" $P(D,X,2,9)_"    ",$$EZBLD^DIALOG(8146,Y) Q  ;**CCO/NI 'USES INTERNAL CODE SUCH&SUCH'
 . I DIFRTO'="?" S Y=X Q
 . S Y=-1 Q
 I +$P(X,"E")=X!(DITYP'=2) S Y=X Q
QQ S Y=-1 D  Q:$G(DIQUIET)
 .N I S I(1)=X,I(2)=$P($G(^DI(.81,DITYP,0)),U),DIERR=$$EZBLD^DIALOG(330,.I) ;*CCO/NI 'INVALID ENTRY'
 W $C(7),"??",!?8,DIERR Q

DIP2
DIP2 ;SFISC/GFT-PRINT FLDS OR TEMPLATES ;12:44 PM  16 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DIP2",$J),DG,K,DISH,DIL,DXS,A,P,I,J S I(0)=DI,(DE,DINS,DV,DNP)="",(DXS,DL,R)=1,(DIPT,DJ,DCL,DIL)=0,DK=+$P(@(DI_"0)"),U,2),J(0)=DK
EN ;
F S (P,S)=""
1 ;
B S DU=$P(^DD(DK,0),U) I DL>1 S:DU="FIELD" DU=$O(^(0,"NM",0))_" "_DU I $O(^($O(^DD(DK,0))))'>0,$P(^(.01,0),U,2)["W" S:'DINS&DC DC=DC-2 S Y=.01 D P G N
 K DIC,Y K:$D(DALL)<9 DALL I ('L!($G(DDXP)=4)),$D(FLDS) S X=$P(FLDS,",",R),R=R+1 G LIT ;**CCO/NI
 I DC D ^DIP22:'$D(DC(DC))
2 W !?DL+DL-2 K X S X(1)=$$EZBLD^DIALOG($S(DE]""!($D(DJ)>9):7066,1:7065)),X(2)=DU W $$EZBLD^DIALOG($S($G(DDXP)=2:7064,1:7063),.X) K X ;**CCO/NI 'FIRST/THEN PRINT/EXPORT'
 I DC W DC(DC) D RW G Q^DIP:X=U!($D(DTOUT)) S DINS=X?1"^"1E.E,X=$S(DINS:$E(X,2,999),X="":DC(DC),1:X) S:DC(DC)=""&$L(X) DINS=1 G XPCK
 I $D(DIRPIPE) X DIRPIPE G LIT
 R X:DTIME S:'$T X=U G Q^DIP:X=U
 I X="ALL",DE="",$D(DJ)<2 D  G:$D(DIRUT) Q^DIP D:Y&($G(DDXP)=2) VALALL^DDXP2 G N:Y,F:'$D(X) W !?10,X
 . S DIR(0)="YA",DIR("A")=$$EZBLD^DIALOG(7067),DIR("B")="NO",DIR("?")=$$EZBLD^DIALOG(7067.1),%XX=X
 . D ^DIR S X=%XX K DIR,%XX S:$D(DIRUT) X=U Q
XPCK I $G(DDXP)=2 D VAL1^DDXP2 G:'$D(X) F
LIT I $E(X)="""",$L(X,"""")#2 F A9=3:2:$L(X,Q) Q:$P(X,Q,A9)]""&($E($P(X,Q,A9)'=$C(95)))
 I  I $P($P(X,Q,A9),";")="" K A9 S S=X G S:DINS,S:'$D(DIAR),S:DIAR'=4,S:'$D(DC(DC)),S:DC=0,Z^DIP22
 S DIC="^DD(DK,",DIC(0)=$E("ZE",1,'$D(FLDS)!''L+1)_$E("O",1,DC>0),DIC("W")="S %=$P(^(0),U,2) I % W $S($P(^DD(+%,.01,0),U,2)[""W"":""  (word-processing)"",1:""  (multiple)"")" S:$D(DICS) DIC("S")=DICS
DIC G DIC^DIP22
RTN I DC,X="@" D DC G F
NUMBER G DIP2^DIQQ:X?."?",Q^DIP:X=U I $P($$EZBLD^DIALOG(7099),X)="" W $P($$EZBLD^DIALOG(7099),X,2) S S=0_S G S ;**CCO/NI THE WORD 'NUMBER'
 S DIC(0)="EYZ",D="GR" I $D(^DD(DK,D)) D IX^DIC G GF:Y>0 I 'Y F Y=0:0 S Y=$O(Y(Y)) G F:Y="" S X=^DD(DK,Y,0) D Y
 G HARD^DIP22
 ;
GF I $G(DDXP)=2 D VAL2^DDXP2 G:'$D(Y(0)) F
 I $P(Y(0),U,2) D D,DC:DC S X=$P($P(Y(0),U,4),";",1),I(DIL)=$S(+X=X:X,1:Q_X_Q),J(DIL)=DK G 1
 I +Y=.001 S Y=0
 S S=+Y_S I P]"",$D(DCL(DK_U_+Y)) G QQ^DIP22
S I $G(DDXP)=2 D VAL3^DDXP2 G:'$D(S) F
 D DJ G F
 ;
D S DIL(DL)=DIL,DV(DL)=DV,DL(DL)=DK,DK=+$P(^DD(DK,+Y,0),U,2),DL=DL+1,DIL=DIL+1,DV=DV_+Y_C,Y=0 Q
 ;
U S DL=DL-1,DV=DV(DL),DK=DL(DL),DIL=DIL(DL) F %=DIL:0 S %=$O(I(%)) Q:%=""  K I(%),J(%)
 Q
 ;
DC I 'DINS K:DC>1 DC(DC) S DC=DC+1
 Q
 ;
Y S S=Y_S
DJ I $L(DE)+$L(S)>150 S DJ=DJ+1,^UTILITY("DIP2",$J,DJ)=DE,DE=""
 S DE=DE_DV_S_$C(126),S="" D DC:DC
P Q:'$D(P)  I P="" K DNP Q
 I P="*" S DCL=DCL+1
 S DCL(DK_U_+Y)=$S($T:DCL_P,1:P) Q
 ;
N S I=DL S:I=1 DALL=1
NN S Y=.001 I $D(^DD(DK,Y)) S Y=0 D Y S Y=.001
A S Y=$O(^DD(DK,Y)) I Y,$D(^(Y,8)),$D(DICS) X DICS E  G A
 I Y'>0 G UP:I'<DL S Y=$P(DV,C,DL-1) D U G A
 I $P(^(0),U,2) D D G NN
 D Y G A
 ;
UP K DIC I DL>1 D U,DC:DC G F
 I DE="",'DJ,'$D(DHIT),'$D(DIS) G F
 I $D(FLDS)>9 S X=$O(FLDS("")) I X]"" S FLDS=FLDS(X),R=1 K FLDS(X) G F
 G ^DIP3
 ;
RW I $L(DC(DC))>19 S Y=DC(DC) D RW^DIR2 Q
 W "// " R X:DTIME S:'$T X=U,DTOUT=1 Q
 ;
ER S (X,DU)="[CAPTIONED]" G ^DIP21
 ;7063= PRINT:
 ;7064= EXPORT:
 ;7065= FIRST
 ;7066= THEN

DIP21
DIP21 ;SFISC/XAK-PRINT TEMPLATE ;01:59 PM  7 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D D S DIC(0)=$E("E",'$D(FLDS)!''L)_"QZSI"
 S DIC("S")="I $D(^(""F""))"_$S($G(DIAR)=4:",$D(^(1))",$G(DDXP)=2:",$P(^(0),U,8)=7",$G(DDXP)=4:",$P(^(0),U,8)=3",1:"")_" "_DIC("S") S:$G(DDXP)=4 DIC("W")=""
 D IX^DIC K DIC S:(+Y=.01&(DUZ(0)'="@")) DICSS=$$ACC(8) I Y<0 G Q^DIP:$D(DTOUT),^DIP2:L,^DIP2:'$D(FLDS),Q^DIP
 I L,+Y=.01 K DPQ(DK) S DIQ(0)="" D C^DII G:$D(DIRUT) Q^DIP
EDITQ I L,Y'<1,(('$P(^DIPT(+Y,0),U,8))!($G(DDXP)=2&($P(^DIPT(+Y,0),U,8)=7))) D W:DUZ(0)'="@" I  S %=2 W !,$$EZBLD^DIALOG(8196,$P(Y,U,2)) D YN^DICN G ED^DIP23:%=1 ;**CCO/NI 'WANT TO EDIT'? (+ next line)
 K:'$D(^DIPT(+Y,"DNP")) DNP S DIPT=+Y,DALL=1,DHD=$S($D(DHD)#2:DHD,$D(^("H")):^("H"),1:""),DC(0)=+Y I $D(^("SUB")),^("SUB") S:'$G(DPP(0)) DISH=1
 D F I $G(^DIPT(+Y,"ROU"))[U,$$ROUEXIST^DILIBF($P(^("ROU"),U,2)) S DIPZ=+Y G PAGE^DIP3:DHD="@"
 Q:$D(DTOUT)  G H^DIP3
F ;
 S DE="",R=0
 F X=0:0 S R=$O(^DIPT(+Y,"DCL",R)) Q:R=""  F D=1:1 Q:D>$L(^(R))  S Z=$E(^(R),D) I Z?1P S DCL(R)=$G(DCL(R))_Z
 F X=0:0 S X=$O(^DIPT(+Y,"DXS",X)),%=-1 Q:X=""  Q:$O(^(X,%))=""  I '$D(DIPZ)!$D(^(9.2))!$D(^(9)) F X=X:0 S %=$O(^(%)) Q:%=""  S DXS(X,%)=^(%)
 Q
XPUT ;
 D XPDIP21^DIQQQ
PUT ;
 D NOW^%DTC S DIPDT=+$J(%,0,4) W !,"STORE "_$S($G(DDXP)=2:"EXPORT",1:"PRINT")_" LOGIC IN TEMPLATE: " R X:DTIME G Q^DIP:X=U!'$T,XPUT:($D(DDXP)&(X="")),OUT:X=""
 D D S DIC(0)="ELZSQ",DIC("S")="I Y'<1,$P(^(0),U,8)'=1,$P(^(0),U,8)'=3 "_DIC("S"),Y=-1,DLAYGO=0 D IX^DIC:X]"" K DIC,DLAYGO G:Y<0 PUT:X'[U,Q^DIP
 S S=$O(^DIPT(+Y,0)),DA=$S('$D(^("ROU")):1,^("ROU")'[U:1,'$D(^("IOM")):1,'$D(^("ROUOLD")):1,1:^("ROUOLD")) S:'DA IOM=^("IOM")
 I S]"" W $C(7),!,"TEMPLATE ALREADY STORED THERE...." D W:DUZ(0)'="@" G PUT:'$T W " OK TO REPLACE" S %=0 D YN^DICN W ! G PUT:%-1 L +^DIPT S %Y="" F %X=0:0 S %Y=$O(^DIPT(+Y,%Y)) Q:%Y=""  K:",%D,ROUOLD,W,"'[(","_%Y_",") ^DIPT(+Y,%Y)
EGP S ^DIPT("F"_J(0),$P(Y,U,2),+Y)=1,^DIPT(+Y,0)=$P(Y,U,2)_U_DIPDT_U_$S(S!(S=""):DUZ(0),1:$P(Y(0),U,3))_U_J(0)_U_DUZ_U_$S(S!(S=""):DUZ(0),1:$P(Y(0),U,6))_U_DT S:$D(DNP) ^("DNP")=1 ;*CCO/NI PLUS NEXT 3 LINES REMEMBER HEADING LANGUAGE
 I DHD]"" S ^("H")=DHD I $G(DUZ("LANG")) S ^("HLANG")=DUZ("LANG")
 S X=$D(^("DCL",0))
 L -^DIPT K DIPDT,%I
 F S=0:0 S X=$O(DCL(X)) Q:X=""  S ^(X)=DCL(X)
 F S=0:0 S S=$O(DXS(S)) Q:S=""  F %=0:0 S %=$O(DXS(S,%)) Q:%=""  S ^DIPT(+Y,"DXS",S,%)=DXS(S,%)
 F S=1:1:DJ S ^DIPT(+Y,"F",S)=^UTILITY("DIP2",$J,S)
 I DE]"" S ^DIPT(+Y,"F",S+1)=DE
 I $G(DDXP)=2 S DDXPFDTM=+Y G Q^DIP
 I $D(DIAR) S DIARP=+Y
SUB I DHD="@" W !,$$EZBLD^DIALOG(8195) S %=1 D YN^DICN G DIP21^DIQQQ:'%,Q^DIP:%<0 I %=1 S ^DIPT(+Y,"SUB")=1 S:'$G(DPP(0)) DISH=1 ;**CCO/NI  SUBHEADERS QUESTION
 I 'DA,$D(^DD("OS",DISYS,"ZS")) S X=DA,DMAX=^DD("ROU") D ENDIP^DIPZ I $D(^DIPT(DIPZ,"H")) S DHD=^("H")
OUT G PAGE^DIP3
 ;
W S %=$P(^(0),U,6) F X=1:1:$L(%) I DUZ(0)[$E(%,X) Q
 Q
D ;
 S X=$P(X,"]"),X=$P(X,"[")_$P(X,"[",2),D="F"_DK S:'$D(^DIPT(D,"CAPTIONED",.01)) ^(.01)=1 I $D(^DIPT("B","WPDI",.001)),'$D(^DIPT(D,"WPDI",.001)) S ^(.001)=1
 K DIC S DIC="^DIPT("
 S DIC("S")="S %=^(0) I $P(%,U,8)'=2!($G(DIAR)=6),$P(%,U,8)'=3!($G(DDXP)=4),$P(%,U,8)'=7!($G(DDXP)=2),$P(%,U,4)=DK!'$L($P(%,U,4))"_$P(" F DW=1:1:$L($P(%,U,3)) I DUZ(0)[$E($P(%,U,3),DW) Q",U,DUZ(0)'="@"&(L!($D(DIASKHD))))
 Q
ACC(ND) ;set xcutable code to check FIELD access (in ND) against DUZ(0)
 N A
 S A="N % I 1 Q:'$D(^("_ND_"))  F %=1:1:$L(^("_ND_")) I DUZ(0)[$E(^("_ND_"),%) Q"
 Q A

DIP22
DIP22 ;SFISC/GFT-EDIT PRINT TEMPLATE ;16MAR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DC(1)=$O(^DIPT(DC(0),"F",DC(1))),DC=0 Q:DC(1)=""   S DC=2,DY=^(DC(1)),Y=2
Y S X=$P(DY,$C(126)),DY=$P(DY,$C(126),2,99) I X="" G DIP22:'$D(DC(2)) Q
 I D9]"" G UP:$P(X,D9)]"" S X=$P(X,D9,2,99)
R I X'>0 G 0:$E(X,2)'=","&'X S:+X D9=D9_+X_",",DRK=-X G M
 I X["," S DA=$P(X,",") I +DA=DA S:DA<0 DA=-DA G Y:'$D(^DD(DRK,DA,0)) S X=$P(X,",",2,99),DC(Y)=$P(^(0),U),%=+X,D=+$P(^(0),U,2) G Y:'$D(^DD(D,.01,0)),W:$P(^(0),U,2)["W" S DRK=D,Y=Y+1,D9=D9_DA_"," G R
 S %=+X,D=DRK_U_% D DCL
 G Y:'$D(^DD(DRK,%,0))
W S X=$P(^(0),U)_$E(X,$L(%)+1,999)
P D  S DC(Y)=X,Y=Y+1 G Y
 .N % F  S %=$F(X,";;") Q:'%  S X=$E(X,1,%-2)_$E(X,%,9999)
0 S:X?1"0".E X=$S($D(^DD(DRK,.001,0)):$$LABEL^DIALOGZ(DRK,.001),1:$$EZBLD^DIALOG(7099))_$E(X,2,999) I P]"" S D=DRK_"^0" D DCL ;**CCO/NI COLUMN HEADING FOR NUMBER FIELD
M S %=$F(X,";Z;""") G P:'% S %=%-$L($P(X,";",1)),X=";"_$P(X,";",2,99) F D=%:0 S D=$F(X,"""",D) I ";"[$E(X,D) S X=$E(X,%,D-2)_$E(X,1,%-5)_$E(X,D,999) G P
 ;
UP S DRK=J(0),%=D9,DA=""
DOWN I X[",",+X=$P(X,","),$P(D9,DA_+X_",")="" S DA=DA_+X_",",%=$P(%,",",2,99),DRK=$S(X'>0:-X,1:+$P(^DD(DRK,+X,0),U,2)),X=$P(X,",",2,99) G DOWN
NUL S D9=DA,DC(Y)="",Y=Y+1,%=$P(%,",",2,99) G NUL:%]"",R
 ;
X ;who comes here??
 S DC(1)=DD D Y F D=2:1 Q:'$D(DC(D))  S X=DC(D) X DICMX I '$D(D) K DD Q
 Q
 ;
HARD ;
 S DM=X,DQI="DIP(",DA="DXS("_DXS_",",S=S_";Z;"""_X_"""",DICOMP=DIL_$E("?",''L)_"TI"
 S DICOMPX="" G JUMP:X?.E1":"
 S DICMX="X DICMX" D EN^DICOMP I '$D(X) G QQ:'$D(FLDS) S X=DM D ^DIM G QQ:'$D(X) S Y="X"
 D FLY G S^DIP2
 ;
JUMP S DICMX="S DIXX=DIXX("_DL_") D M^DIO2" D ^DICOMPW ;DICMX COULD BE INVOKED INSIDE SOME ROUTINE
 I $D(X) S %=Y D OVFL,F S S=U_$P(DP,U,2)_U_$E(1,%["m")_U_S,X=1,P="",DIL(DL)=DIL,DV(DL)=DV,DL(DL)=DK,DK=+DP,DV=DV_-DP_",",Y=0,DL=DL+1,DIL=+% K P G S^DIP2
QQ ;
 W $C(7),"??" G F^DIP2
 ;
FLY ;
 S:'$D(X) X=DM S %=Y["D"
 I % S:S'[";d" S=S_";d" I S'[";R",S'[";L",$G(DDXP)'=2 S S=S_";L18"
 I Y["W",S'[";X" S S=S_";X"
 I Y["m" S:S'[";m" S=S_";m" I Y["w",S'[";w" S S=S_";w"
 D OVFL I P="",Y'["X" S X=X_$S(S[";W":"",%:" S Y=X D DT",1:" W X")_" K DIP"
F S S=X_S S:P]"" S=S_";"_P
DXS F Y=0:0 S Y=$O(X(Y)) Q:Y=""  S DXS(DXS,Y)=X(Y)
 S DXS=$D(X)>1+DXS K DATE,X Q
 ;
OVFL I $L(X)+$L(S)>180!(X[";") S X(9)=X,X="X DXS("_DXS_",9)"
 Q
 ;
DIC I X=$$EZBLD^DIALOG(7099) S Y=X G B:'$D(DIAR),B:DIAR'=4,B:'$D(DC(DC)) ;**CCO/NI 'NUMBER'
 E  D DICW^DIALOGZ(DK),^DIC G E:'$D(DIAR),E:DIAR'=4,E:'$D(DC(DC)),RTN^DIP2:$E(X)="?"
 G E:'DC,E:$P(X,";")=$P(DC(DC),";"),E:$P($P(Y,U,2),";")=$P(DC(DC),";")
Z W !,$C(7),"Because this is an ARCHIVING process:"
 W !!,"You may ADD fields to output or CHANGE PREDEFINED FIELD formats"
 W !,"but NOT change, delete or do calculations on predefined fields.",!
 G 2^DIP2
E I $G(Y)>0 D:$G(S)[";B"  G GF^DIP2
 .N I S I=+$P(Y(0),U,2) I I,$D(^DD(I,0,"IX","B")) Q  ;B is good if multiple has B x-ref
 .I +Y=.01,'$D(^DIC(DK)),$D(^DD(DK,0,"IX","B")) Q
 .S I=$F(S,";B"),S=$E(S,1,I-3)_$E(S,I,999) ;otherwise strip it out
 G UP^DIP2:X="",^DIP21:X?1"[".E&(DE="")
B D  G:'$D(D) DIC S X=$RE(X) D  S X=$RE(X) G:'$D(D) DIC ;from beginning, then end
 .F D="+","#","*","&","!" I $E(X)=D S P=D,X=$E(X,2,999) K D Q
 I X[";" S S=";"_$P(X,";",2,99)_S,X=$P(X,";") G DIC
 I $E(X)="]" S X=$E(X,2,999),DALL(1)=1 G DIC
 G RTN^DIP2
 ;
DCL I $D(^DIPT(DC(0),"DCL",D)) S X=X_$E(^(D),$L(^(D)))
 Q

DIP23
DIP23 ;SFISC/XAK-PRINT TEMPLATE ;5/10/90  1:36 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
ED S DA=+Y,DRK=DK K Y
 S DRK=DK,DIE="^DIPT(",DR=".01;3;6" D ^DIE K DR G Q^DIP:$D(Y)
 S DC=0,DI=I(0) I $D(DA),'$D(^DIPT(DA,1)) S D9="",DC(0)=DA,DC(1)=-1 D ^DIP22 S DA=DC(0)
 I $D(DA),$D(^DIPT(DA,1)) D ^DIFGA G Q^DIP:$D(DTOUT),H^DIP3
 S DALL(1)=1 G ^DIP2

DIP3
DIP3 ;SFISC/GFT,TKW-PRINT HEADING, PAGE, COPIES ; 15NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I DJ,DE]"" S DJ=DJ+1,^UTILITY("DIP2",$J,DJ)=DE,DE=""
H G G:((L?1"]".E)!($G(DDXP)=2)!($G(DDXP)=4)) I '$D(DIASKHD),'L G:$D(DALL)>9 G G PAGE
 D HD
 S DA=X D HQ^DIP31 G Q^DIP:$D(DTOUT)!($D(DUOUT)) K DIRUT,DIROUT
 S DHD=X G G:X=DA,G:$$DHD(.DHD,DK,L),H
 ;
DHD(DHD,DK,L) ;VALIDATE HEADER 'DHD' FOR FILE 'DK'
 ;   'L'=0 MEANS SILENT
 ;   CALLED BY SCREENMAN TEMPLATE EDIT
 N DC,X,Y,DIC,DD,%,DW
 I DHD?.P1"["1.E F DC=1,2 S X=$P($P(DHD,"[",DC+1),"]",1) D D^DIP21 S DIC(0)=$E("E",L)_"SF",DIC("S")="I '$D(^(""DCL"")) "_DIC("S") D IX^DIC K DIC G DHDBAD:Y<0&$L(X) I Y>0 S DHD=$P(DHD,"[",1,DC)_"["_$P(Y,U,2)_"]"_$P(DHD,"]",DC+1,9) W:L !
 I DHD'?1"W ".E Q DHD'[""""
 I DUZ(0)'="@" F %=1:2 Q:$P(DHD,"""",%,999)=""  I $P($E(DHD,3,999),"""",%)[" " G DHDBAD
 Q 1
DHDBAD Q 0
 ;
G S DHD=$G(DHD) G PUT^DIP21:$S(L?1"]".E:1,$D(DALL)>9:1,$D(DALL):0,1:$L(DE)>13!DJ),PAGE
X W $C(7),!,$$EZBLD^DIALOG(1850) S X="^" G Q^DIP ;**CCO/NI 'BAD DEVICE'
 ;
PAGE ;
 K DICOMPX,DA,IO("C") S DISUPNO=$G(DISUPNO),DIPCRIT=$G(DIPCRIT),DC=$S($G(DDXP)'=4:",",1:"") S:$D(DOUT)#2 DA=DOUT I 'L,$D(PG) S DC=C_(PG-1) K PG
EGP E  I L,DHD'="@" F X=1:1:DPP I $D(DPP(X,"F")) W !,$$EZBLD^DIALOG(7096),"1// " R X:DTIME S:'$T X=U Q:X=""  G DIP3^DIQQQ:X["?",X:X[U,DIP3:X\1'=X S DC=C_(X-1) Q  ;*CCO/NI 'START AT PAGE:'
 I $G(DIFIXPT)=1 G F2 ;AVOID DEVICE SELECTION!!!
 I $D(%ZIS)[0,$D(^%ZTSK),$D(^%ZTSCH("RUN")),$D(^%ZOSF("UCI")),$D(^DD("OS",DISYS,8)) S %ZIS="QM",%ZIS("B")=""
ZIS S:$D(IOP) DIOP=IOP D:$G(DDXP)=4 ZIS^DDXP4 D ^%ZIS S:$D(DIOP) IOP=DIOP K DIOP G X:POP
 I $G(DDXP)=4 S IOM=DDXPIOM,IOSL=$S(IOSL<DDXPIOSL:DDXPIOSL,1:IOSL),X=$S(IOM<255:IOM,1:0) X ^DD("OS",DISYS,"RM")
 I $D(IOT),IOT="SDP",$D(^DD("OS",DISYS,"SDP")) G SDP
 G FREE
 ;
SDP S O=IO,DIPION=ION
 I '$D(DCOPIES) W !,$$EZBLD^DIALOG(8180) R F:DTIME G SDPCLO:F[U!'$T,SDP:F\1'=F S DCOPIES=F ;**CCO/NI NUMBER OF COPIES
O K IOP,%ZIS S:$D(IO("Q")) %ZIS="NM",IOP="Q",%ZIS("B")="",DIOQ=1 S %ZIS("A")=$$EZBLD^DIALOG(8181) ;**CCO/NI 'OUTPUT COPIES TO:'
 D ^%ZIS G SDPCLO:POP,O:IO=O
 S DOUT=$S($D(ION):ION_";"_IOM_";"_IOST,1:IO),DA=IO,IOP=DIPION_";"_IOM_";"_IOST S:$D(DIOQ) %ZIS="QN",IOP="Q;"_IOP K DIOQ D ^%ZIS
FREE S %=2,F=IOST["K",W=IOST["SINGLE"
 I $D(DIPZ),'$D(IOP),IO(0)=$I,$D(^DIPT(DIPZ,"IOM")),^("IOM")>IOM W $C(7),$$EZBLD^DIALOG(8190,^("IOM")) D YN^DICN G X:%<0,ZIS:%-1 ;**CCO/NI  'MARGIN WIDTH IS NORMALLY...'
 I IO(0)'=IO,'$D(IO("Q")),'$D(IOP)!$D(IOFREE),'W!F,IO(0)=$I,$S($D(DA):DA'=$I,1:1),$S($D(%ZIS)[0:1,1:%ZIS'["F"),$P(^DD("OS",DISYS,0),U,5) S %=2 W !,$$EZBLD^DIALOG(8191) D YN^DICN G CLO:%<0,DIP3^DIQQ:'% I %=1 ;**CCO/NI 'WANT TO FREE ..?'
 I $T!$D(IO("C")) W !,$$EZBLD^DIALOG(8192),! S IO("C")=1,X=$I,DM="" X ^DD("FUNC",7,1) K IO(1,IO) S:$D(DIOEND)#2 DIOEND(9)=DIOEND,DM="X DIOEND(9) " S DIOEND=DM_$S($D(^%ZIS("C")):"G H^XUS",1:"H") ;**CCO/NI 'TERMINAL IS FREE'
F2 S X=$G(DHD) D HD:X="" S DHD=X,X=DC
 K DC,S,N,Q,H,DA,FR,TO,DM,J,T,V,CP,DIC,DIE,DRK,DINS,DALL S O=0,DK=DI,DC=X,C=","
 G ^DIP4:$D(IO("Q")) D CLEAN^DIEFU G ^DIP5
 ;
SDPCLO S X=O G CLO1
CLO S X=IO
CLO1 X ^DD("FUNC",7,1) K:$D(IO)#2&(IO]"") IO(1,IO) G X
 ;
HD S X=$$EZBLD^DIALOG($S($D(DCL)>9:8110,$D(DIAX):8111,$D(DIAR):8112,$D(DIS)>9:8109,1:8066),$$FILENAME^DIALOGZ(+DK)) ;**CCO/NI MAKE THE HEADER
 I $D(DC(0)),$D(^DIPT(DC(0),"H")),$S('$G(^("HLANG")):1,1:^("HLANG")=$G(DUZ("LANG"))) S X=^("H") ;**CCO/NI USE TEMPLATE HEADER UNLESS IT'S WRONG LANGUAGE
 I $D(DIASKHD),$D(DHD)#2 S:DHD'["?" (DIASKHD,X)=DHD S:DIASKHD'="" (X,DHD)=DIASKHD
 Q

DIP31
DIP31 ;SFISC/TKW-ASK USER QUESTIONS ABOUT HEADING ;7:19 AM  27 May 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
HQ N DISAVX,Y,DA,DIZ S DISAVX=X K DIR,DTOUT,DUOUT,DIRUT
 G:$D(DISUPNO)!($D(DIPCRIT)) HQ1 S DISUPNO=0,DIPCRIT=0
 I $D(DIS)>9 S DIZ(1)=$$EZBLD^DIALOG(8006),DIZ(2)=$$EZBLD^DIALOG(8038)
 E  S DIZ(1)=$$EZBLD^DIALOG(8007),DIZ(2)=$$EZBLD^DIALOG(8037)
 S DIR("A")=$$EZBLD^DIALOG(8008) D BLD^DIALOG(8005,.DIZ,"","DIR(""?"")")
 S DIR("B")=X,DIR(0)="FOU" D ^DIR K DIR G Q:$D(DIRUT)
 Q:X=""  I "SC"'[X,"CS"'[X Q
 W ! I X["S" S DISUPNO=1 D BLD^DIALOG(8010,.DIZ,"","DIR") W !,"  ",DIR
 I X["C" S DIPCRIT=1,DIZ=DIZ(2) D BLD^DIALOG(8011,DIZ,"","DIR") W !,"  ",DIR
 W !!
HQ1 D BLD^DIALOG(8009,"","","DIR(""?"")")
 S DIR("A")=$$EZBLD^DIALOG(8012),DIR("B")=DISAVX,DIR(0)="FOU^^K:X]""""&(""SC""[X!(""CS""[X)) X" D ^DIR K DIR G Q
 ;
Q S:$D(DUOUT)!($D(DTOUT)) X="^" Q
 ;DIALOG #8005  'There are two different options:'
 ;       #8006  'Number of Matches from the search'
 ;       #8007  'heading when there are no records to print'
 ;       #8008  'Heading/S/C'
 ;       #8009  'Accept default heading or enter a custom heading...'
 ;       #8010  '** Suppress the...'
 ;       #8011  '** Print...criteria in heading.'
 ;       #8012  'Heading'
 ;       #8037 'sort'
 ;       #8038  'search'

DIP4
DIP4 ;SFISC/XAK-QUEUE & DEQUEUE ;19AUG2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S:$D(DQTIME)[0&$D(ZTQUEUED) DQTIME="NOW"
 S:$G(DDXP)=4&$D(IO("Q")) DDXPQ=1 K IO("Q") S %DT="TEX",X="" I $D(DQTIME)#2 S X=DQTIME,%DT="XT"
W I '$D(DQTIME) S %DT("A")=$$EZBLD^DIALOG(8160)_": ",%DT("B")="NOW" ;**CCO/NI 'REQUESTED TIME TO PRINT:'
 S:$D(DQTIME) X=DQTIME
 S %DT="FRX" S:'$D(DQTIME) %DT=%DT_"AE" S %DT(0)="NOW" D ^%DT K %DT G:Y<1 X^DIP3:$D(DQTIME),X^DIP3:X[U,X^DIP3:$D(DTOUT),W S X=+Y D H^%DTC S Y=%H_","_%T
 W:'$D(ZTQUEUED) ! S ZTDTH=Y X ^%ZOSF("UCI") S ZTUCI=Y,ZTRTN="ZTSK^DIP4",ZTDESC=DHD
 S ZTSAVE("^UTILITY(""DIP2"",$J,")=""
 I $P($G(DPP(0,"IX")),U,2)["$J" S ZTSAVE("^"_$P(DPP(0,"IX"),U,2))=""
 I $G(DPP(1,"IX"))["^UTILITY(" S ZTSAVE("^UTILITY(U,$J,")=""
 S ZTIO=$S($D(ION)#2:ION,1:IO) I $G(IOST)]"" S ZTIO=ZTIO_";"_IOST
 I $G(IO("DOC"))]"" S ZTIO=ZTIO_";"_IO("DOC") G ZTM
 I $G(IOM) S ZTIO=ZTIO_";"_IOM I $G(IOSL) S ZTIO=ZTIO_";"_IOSL
ZTM S ZTSAVE("*")="" D ^%ZTLOAD
 K ^UTILITY("DIP2",$J),^UTILITY(U,$J),DIS,DXS,DX,DHD,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTUCI,FLDS,DCC,DIPT,X
 W:'$D(ZTQUEUED) $$EZBLD^DIALOG(8161,$G(ZTSK)),! X $G(^%ZIS("C")) G Q^DIP ;**CCO/NI 'REQUEST QUEUED'
 ;
ZTSK ;
 K DISYS D CLEAN^DIEFU
 I $G(DPP(1))]"",'$D(DPP(1,"GET")) Q:$G(DK)=""  D
 . S DIPCRIT=+$G(DIPCRIT),DISUPNO=$S($D(DISUPNO)#2:DISUPNO,1:1)
 . N S,Q S DIFM=+$G(L),S=+$P($G(@(DK_"0)")),U,2),Q="""" N DIBTRPT,DICNVDPP,DITYP,DJ,DU,DV
 . S DICNVDPP=1 D CNVCM^DIP11,T1^DIP11
 . Q
 D 0^DICRW G DQ^DITC1:$D(DIT),^DIP5

DIP5
DIP5 ;SFISC/GFT-INITIALIZE TO PROCESS THE PRINT ;16NOV2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S %H=$H D YMD^%DTC S DT=X K %H,^UTILITY($J),^("DIL",$J)
 I $G(DIFIXPT)=1 D  G GO
 . S ^UTILITY($J,1)="S DIFIXPTH="""_$$CONVQQ^DILIBF(DHD)_""",DC=1"
 . Q
 U IO
 S Z=IOM-33,DIOSL=IOSL,M=$P("I 1 S Y=1,DIFF=1 W:DC?.N $C(7) R:DC?.N Y:DTIME S:'$T Y=U S:Y=U (DN,S)=0 I Y'=U ",U,IOST?1"C".E)
 I M]"",DHD="@@" S M=M_"S $Y=0 "
 S ^UTILITY($J,1)=M_"S DC=$P(DC,"","",2)+DC+1",M=DHD?1"W ".E
 I DHD'="@@" S ^UTILITY($J,1)=^(1)_" W:$D(DIFF)&($Y) "_IOF_$P(",#",U,IOF'["#"),A1="S DIFF=1,$X=0,$Y=0" S:$L(^UTILITY($J,1))+$L(A1)>200 ^(1.3)=A1,A1="X ^(1.3)" S ^(1)=^(1)_" "_A1 K A1
 I W S ^(1)=^(1)_" W $C(7)"_$S(F:"",1:" U """_IO(0)_"""")_" R Y"_$S(F:"",1:" U IO")_" W """""
DIOSUBHD I M S ^(1)=^(1)_" X ^(1.5)",^(1.5)=DHD D:$D(DIOSUBHD)  G GO
 .S ^(1)=^(1)_" D SUBHEADS^DIL" ;IF THERE ARE SUBHEADERS WITH SPECIAL HEADING
 .I $G(DIPZ) N R S R=$G(^DIPT(DIPZ,"ROU")) I R?1"^"1.E S ^(1)=^UTILITY($J,1)_" D HEAD"_R Q
 .S ^(1)=^UTILITY($J,1)_" W !,$TR($J("""","_IOM_"),"" "",""-"")"
 I DHD'?.P1"[".E1"]",DHD'?1"@".E D
EGP .N D,X,% S M=$P($H,C,2)\60,^UTILITY($J,2)=" N Y S Y=""    ""_$$DATE^DIUTL("_(M#60/100+(M\60)/100+DT)_")_""   ""_$$EZBLD^DIALOG(7095,DC) W:$X+$L(Y)>IOM ! W ?IOM-$L(Y),Y",D=3 ;**CCO/NI WRITE PAGE NUMBER
 .I DIPCRIT S X="",%=0 D
 ..N A,B,S S (B,S)=1
 ..F  S %=$O(DISTXT(%)) D:'% AS Q:'%  S A=$G(DISTXT(%,0)) I A]"" S A=$$CONVQQ^DILIBF(A) D:$L(X)+$L(A)+20>IOM AS S X=X_$P(",  ^",U,(X]""))_A
 ..S S=1,B=2
 ..F  S %=$O(DPP(%)) D:%="" AS Q:%=""  S A=$G(DPP(%,"TXT")) I A]"" S A=$$CONVQQ^DILIBF(A) D:$L(X)+$L(A)+20>IOM AS S X=X_$P(",  ^",U,(X]""))_A
 ..I $G(DIPZ) F S=3:1:D S A=$G(^UTILITY($J,S)) I A]"",$D(^(S+1)) S ^(S)=A_" X ^UTILITY($J,"_(S+1)_")"
 ..I DIPCRIT=1,D>3 S:$G(DIPZ) ^(D-1)=^UTILITY($J,D-1)_" X ^UTILITY($J,"_D_")" S ^UTILITY($J,D)="S DIPCRIT=0",D=D+1
 ..Q
 .S %=$S($D(^UTILITY($J,3)):28,1:0),M="W """_DHD_"""" S:$L(M)+$L(^(2))+%>252 ^(2.5)=DHD,M="W ^(2.5)" S ^(2)=M_^(2)
 .I $G(DIPZ),%>0 S ^(2)=^(2)_" X"_$P(":DIPCRIT^",U,(DIPCRIT=1))_" ^UTILITY($J,3)"
 .S DHD=D Q
GO S X=0 F Y=$G(DPP(0))+1:1 Q:'$D(DPP(Y))  S X=X+1 D
 . Q:$D(DPP(Y,"SER"))#2
 . I X=1,'$O(DPP(Y)) Q:'$D(DPP(Y,"PTRIX"))  Q:$O(DPP(Y,0))
 . I $O(DPP(Y,0)) K:$D(DPP(Y,"PTRIX")) DPP(Y,"PTRIX"),DPP(Y,"IX") Q
 . I $D(DPP(Y,"CM")),'$D(DPP(Y,"PTRIX")) Q
 . N N,%,X,S S N=0,(%,X)="",S=$P(DPP(Y),U) Q:S<2
 . I $P(DPP(Y),U,2)=.01!($P(DPP(Y),U,2)=0) I '$D(DPP(Y,"F")),'$D(DPP(Y,"T")) S (%,X)=0 G CAL
 . D
 .. N I S I=Y N Y,DIBT1
 .. D SER^DIOQ(S,DPP(I,"GET"),DPP(I,"QCON"),$D(DPP(I,"IX"))#2,.X,.%,N)
 .. Q
CAL .I $D(DPP(Y,"PTRIX")) D
 .. N F,T,N S F=+$P($G(@(^DIC(+S,0,"GL")_"0)")),U,4)
 .. S T=$P($G(^DD(+S,+$P($P(DPP(Y),U,4),"""",2),0)),U,3) Q:T=""  S T=$P($G(@("^"_T_"0)")),U,4)
 .. S N=$S(Y>($G(DPP(0))+1):2,$O(DPP(Y)):2,1:1)
 .. I (T*(1-%)*N)>F S X=% K DPP(Y,"IX"),DPP(Y,"PTRIX")
 .. Q
 . Q:%=""  Q:X=""  S X=X_U_%,DPP(Y,"SER")=X
 . I $G(DIBT1),$D(^DIBT(DIBT1,2,Y)) S ^DIBT(DIBT1,2,Y,"SER")=X
 . Q
 S X=0 F Y=1:1:DPP I $P(DPP(Y),U,4)["!" S X=1,DRK=1 Q
FIELDS K R G DIPZ:$D(DIPZ) D INIT S R=DE,DJ=-1 I X S (X,W)="",Y=",DRK",DRJ=0,DLN=3 K DNP D O^DIL
DIL D ^DIL:R]"" S DJ=$S(DIPT:+$O(^DIPT(DIPT,"F",DJ)),1:+$O(^UTILITY("DIP2",$J,DJ))) I DJ S R=^(DJ) G DIL
 D UNSTACK^DIL:DM,A^DIL G ^DIL2
 ;
AS S:X]"" ^UTILITY($J,D)="W"_$P(":DIPCRIT^",U,DIPCRIT)_" !,?"_$S(S=1:"0,"_""""_$P("Search^Sort",U,B)_" Criteria: ",1:"15,"_"""")_X_"""",D=D+1,S=S+1
 S X="" Q
 ;
INIT ;
 D:'$D(DISYS) OS^DII K DIL,DIWR S DN=-2,(DIL,DIL0,DIWL,DIO,DIO("SCR"),DM,DG,DX,DHT,DLN)=0,DY="D0",DI=DK_DY,@("DP=+$P("_DK_"0),U,2)"),M(DP)=1,DP(0)=DP,F="",Y=$S($D(^DD("OS"))[0!'$D(^DD("OS",DISYS,0)):0,1:$P(^(0),U,2)),DISMIN=99999
 S DISEARCH=0 ; Initialize SEARCH Switch SO-2/24/2000
 Q
 ;
DIPZ I $S('$D(^DIPT(DIPZ,"ROU")):1,^("ROU")'[U:1,'$D(^("IOM")):1,1:^("IOM")>IOM)!X!$S($G(^("ROULANG")):^("ROULANG")-$G(DUZ("LANG")),1:0) S Y=DIPZ D F^DIP21 K DIPZ G GO ;**CCO/NI DON'T USE PRINT TEMPLATE COMPILED IN WRONG LANGUAGE
 S Y=DIPZ D F^DIP21 S DK=DCC D INIT S ^UTILITY($J,99,1)="D "_^DIPT(DIPZ,"ROU"),DX=1
 S X="" F DG=0:0 S X=$O(^DIPT(DIPZ,"STATS",X)) Q:X=""  M @X=^(X)
 F X=-1:0 S X=$O(^DIPT(DIPZ,"T",X)) Q:'X  S ^UTILITY($J,"T",X)=^(X)
 F X=-1:0 S X=$O(DPQ(X)) Q:X=""  F %=-1:0 S %=$O(DPQ(X,%)) Q:%=""  K:$D(^DIPT("AF",X,$S(%:%,1:.001),DIPZ)) DPQ(X,%)
 G ^DIL2

DIPKI001
DIPKI001 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(9.4,0,"GL")
 ;;=^DIC(9.4,
 ;;^DIC("B","PACKAGE",9.4)
 ;;=
 ;;^DIC(9.4,"%",0)
 ;;=^1.005^1^1
 ;;^DIC(9.4,"%",1,0)
 ;;=XU
 ;;^DIC(9.4,"%","B","XU",1)
 ;;=
 ;;^DIC(9.4,"%D",0)
 ;;=^^15^15^2940705^^^^
 ;;^DIC(9.4,"%D",1,0)
 ;;=This file identifies the elements of a package that will be transported
 ;;^DIC(9.4,"%D",2,0)
 ;;=by the initialization routines created by DIFROM.  The prefix determines
 ;;^DIC(9.4,"%D",3,0)
 ;;=which namespaced entries will be retrieved from the Option, Bulletin,
 ;;^DIC(9.4,"%D",4,0)
 ;;=Help Frame, Function, and Security Key Files as well as the namespace
 ;;^DIC(9.4,"%D",5,0)
 ;;=that will be used to name the INIT routines built by running DIFROM.
 ;;^DIC(9.4,"%D",6,0)
 ;;=The Excluded Namespace field may be used to leave out some of these items.
 ;;^DIC(9.4,"%D",7,0)
 ;;=The File Multiple determines which files are sent with the package and
 ;;^DIC(9.4,"%D",8,0)
 ;;=whether data is included.  Print, Input, Sort and Screen (FORM)
 ;;^DIC(9.4,"%D",9,0)
 ;;=templates are brought in by namespace, for the files listed in the File
 ;;^DIC(9.4,"%D",10,0)
 ;;=multiple.  In addition, there are multiples for each type of template,
 ;;^DIC(9.4,"%D",11,0)
 ;;=that allow the user to specify individual templates outside the
 ;;^DIC(9.4,"%D",12,0)
 ;;=namespace to retrieve.  Routines to be run before and after the
 ;;^DIC(9.4,"%D",13,0)
 ;;=INIT are specified in the Environment Check Routine, Pre-init after
 ;;^DIC(9.4,"%D",14,0)
 ;;=User Commit, and Post-Initialization Routine fields. The remaining
 ;;^DIC(9.4,"%D",15,0)
 ;;=fields are simply for documentation.
 ;;^DD(9.4,0)
 ;;=FIELD^NL^15007^41
 ;;^DD(9.4,0,"DDA")
 ;;=N
 ;;^DD(9.4,0,"DT")
 ;;=2941020
 ;;^DD(9.4,0,"ID",1)
 ;;=W:$D(^("0")) "   ",$P(^("0"),U,2)
 ;;^DD(9.4,0,"IX","AMRG",9.402,.01)
 ;;=
 ;;^DD(9.4,0,"IX","AR",9.44,.01)
 ;;=
 ;;^DD(9.4,0,"IX","B",9.4,.01)
 ;;=
 ;;^DD(9.4,0,"IX","C",9.4,1)
 ;;=
 ;;^DD(9.4,0,"IX","D",9.42,.01)
 ;;=
 ;;^DD(9.4,0,"IX","E",9.415007,.01)
 ;;=
 ;;^DD(9.4,0,"NM","PACKAGE")
 ;;=
 ;;^DD(9.4,0,"PT",.84,1.2)
 ;;=
 ;;^DD(9.4,0,"PT",4.01,.01)
 ;;=
 ;;^DD(9.4,0,"PT",4.332,.01)
 ;;=
 ;;^DD(9.4,0,"PT",9.6,1)
 ;;=
 ;;^DD(9.4,0,"PT",9.7,1)
 ;;=
 ;;^DD(9.4,0,"PT",19,12)
 ;;=
 ;;^DD(9.4,0,"PT",101,12)
 ;;=
 ;;^DD(9.4,0,"PT",8989.332,.01)
 ;;=
 ;;^DD(9.4,0,"VRPK")
 ;;=KERNEL
 ;;^DD(9.4,.01,0)
 ;;=NAME^RF^^0;1^K:$L(X)>30!($L(X)<4)!'(X'?1P.E) X
 ;;^DD(9.4,.01,1,0)
 ;;=^.1
 ;;^DD(9.4,.01,1,1,0)
 ;;=9.4^B
 ;;^DD(9.4,.01,1,1,1)
 ;;=S ^DIC(9.4,"B",X,DA)=""
 ;;^DD(9.4,.01,1,1,2)
 ;;=K ^DIC(9.4,"B",X,DA)
 ;;^DD(9.4,.01,3)
 ;;=Please enter the name of this PACKAGE (4-30 characters).
 ;;^DD(9.4,.01,21,0)
 ;;=^^1^1^2940627^^^^
 ;;^DD(9.4,.01,21,1,0)
 ;;=The name of this Package.
 ;;^DD(9.4,1,0)
 ;;=PREFIX^RFX^^0;2^K:$L(X)>4!(X'?1U1.3NU) X I $D(X) S %=$O(^DIC(9.4,"C",X,0)) K:(%>0)&(%-DA) X
 ;;^DD(9.4,1,.1)
 ;;=NAMESPACE
 ;;^DD(9.4,1,1,0)
 ;;=^.1
 ;;^DD(9.4,1,1,1,0)
 ;;=9.4^C
 ;;^DD(9.4,1,1,1,1)
 ;;=S ^DIC(9.4,"C",X,DA)=""
 ;;^DD(9.4,1,1,1,2)
 ;;=K ^DIC(9.4,"C",X,DA)
 ;;^DD(9.4,1,3)
 ;;=Please enter the unique namespace prefix (2-4 characters, starting with an alpha).
 ;;^DD(9.4,1,21,0)
 ;;=^^4^4^2940627^^^^
 ;;^DD(9.4,1,21,1,0)
 ;;=This is the unique namespace prefix assigned to the Package, e.g. XM for
 ;;^DD(9.4,1,21,2,0)
 ;;=the MailMan routines and globals, DI for the FileMan routines, etc.
 ;;^DD(9.4,1,21,3,0)
 ;;=This field is appended to letters (like "INIT") to be used as the
 ;;^DD(9.4,1,21,4,0)
 ;;=names of INIT routines.
 ;;^DD(9.4,1,"DT")
 ;;=2890223
 ;;^DD(9.4,2,0)
 ;;=SHORT DESCRIPTION^RF^^0;3^K:$L(X)>60!($L(X)<2) X
 ;;^DD(9.4,2,3)
 ;;=Answer must be 2-60 characters in length.
 ;;^DD(9.4,2,21,0)
 ;;=1
 ;;^DD(9.4,2,21,1,0)
 ;;=This is a brief description of this Package's functions.
 ;;^DD(9.4,2,"DT")
 ;;=2890627
 ;;^DD(9.4,3,0)
 ;;=DESCRIPTION^9.41A^^1;0
 ;;^DD(9.4,3,21,0)
 ;;=^^2^2^2920513^^^
 ;;^DD(9.4,3,21,1,0)
 ;;=This is a complete and detailed description of the Package's functions
 ;;^DD(9.4,3,21,2,0)
 ;;=and capabilities.
 ;;^DD(9.4,4,0)
 ;;=*ROUTINE^9.42A^^2;0
 ;;^DD(9.4,4,21,0)
 ;;=^^3^3^2920513^^^^
 ;;^DD(9.4,4,21,1,0)
 ;;=These are the routines which make up this Package.  This multiple
 ;;^DD(9.4,4,21,2,0)
 ;;=is used for documentation only, and is not used during the INIT
 ;;^DD(9.4,4,21,3,0)
 ;;=process.
 ;;^DD(9.4,4,"DT")
 ;;=2940603
 ;;^DD(9.4,5,0)
 ;;=*GLOBAL^9.43^^3;0
 ;;^DD(9.4,5,21,0)
 ;;=^^2^2^2920513^^^^
 ;;^DD(9.4,5,21,1,0)
 ;;=These are the globals which make up this Package.  This multiple is used
 ;;^DD(9.4,5,21,2,0)
 ;;=for documentation purposes only.
 ;;^DD(9.4,5,"DT")
 ;;=2940603
 ;;^DD(9.4,6,0)
 ;;=*FILE^9.44PA^^4;0
 ;;^DD(9.4,6,21,0)
 ;;=^^3^3^2920513^^^^
 ;;^DD(9.4,6,21,1,0)
 ;;=Any FileMan files which are part of this Package are documented
 ;;^DD(9.4,6,21,2,0)
 ;;=here.  This multiple controls what files (Data Dictionaries and
 ;;^DD(9.4,6,21,3,0)
 ;;=Data) are sent in an INIT built from this Package entry.
 ;;^DD(9.4,6,"DT")
 ;;=2940603
 ;;^DD(9.4,7,0)
 ;;=*PRINT TEMPLATE^9.46^^DIPT;0
 ;;^DD(9.4,7,21,0)
 ;;=^^4^4^2921202^^^^
 ;;^DD(9.4,7,21,1,0)
 ;;=The names of Print Templates being sent with this Package.
 ;;^DD(9.4,7,21,2,0)
 ;;=This multiple is used to send non-namespaced templates in an INIT.
 ;;^DD(9.4,7,21,3,0)
 ;;=Namespaced templates are sent automatically and need not be listed
 ;;^DD(9.4,7,21,4,0)
 ;;=separately.
 ;;^DD(9.4,7,"DT")
 ;;=2940603
 ;;^DD(9.4,8,0)
 ;;=*INPUT TEMPLATE^9.47^^DIE;0
 ;;^DD(9.4,8,21,0)
 ;;=^^4^4^2920513^^^
 ;;^DD(9.4,8,21,1,0)
 ;;=The names of the Input Templates being sent with this Package
 ;;^DD(9.4,8,21,2,0)
 ;;=This multiple is used to send non-namespaced templates in an INIT.
 ;;^DD(9.4,8,21,3,0)
 ;;=Namespaced templates are sent automatically and need not be listed
 ;;^DD(9.4,8,21,4,0)
 ;;=separately.
 ;;^DD(9.4,8,"DT")
 ;;=2940603
 ;;^DD(9.4,9,0)
 ;;=*SORT TEMPLATE^9.48^^DIBT;0
 ;;^DD(9.4,9,21,0)
 ;;=^^4^4^2920513^^^
 ;;^DD(9.4,9,21,1,0)
 ;;=The names of the Sort Templates being sent with this Package.
 ;;^DD(9.4,9,21,2,0)
 ;;=This multiple is used to send non-namespaced templates in an INIT.
 ;;^DD(9.4,9,21,3,0)
 ;;=Namespaced templates are sent automatically and need not be listed
 ;;^DD(9.4,9,21,4,0)
 ;;=separately.
 ;;^DD(9.4,9,"DT")
 ;;=2940603
 ;;^DD(9.4,9.1,0)
 ;;=*SCREEN TEMPLATE (FORM)^9.485^^DIST;0
 ;;^DD(9.4,9.1,21,0)
 ;;=^^2^2^2920513^^^
 ;;^DD(9.4,9.1,21,1,0)
 ;;=The names of Screen Templates (from the FORM file) associated with
 ;;^DD(9.4,9.1,21,2,0)
 ;;=this package.

DIPKI002
DIPKI002 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.4,9.1,"DT")
 ;;=2940603
 ;;^DD(9.4,9.5,0)
 ;;=*MENU^9.495^^M;0
 ;;^DD(9.4,9.5,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,9.5,21,1,0)
 ;;=This is the name of a menu-type option in another namespace.
 ;;^DD(9.4,9.5,"DT")
 ;;=2940603
 ;;^DD(9.4,10,0)
 ;;=DEVELOPER (PERSON/SITE)^F^^DEV;1^K:$L(X)>50!($L(X)<2) X
 ;;^DD(9.4,10,3)
 ;;=Please enter the name of the principal Developer and Site (2-50 characters).
 ;;^DD(9.4,10,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.4,10,21,1,0)
 ;;=The name of the principal Developer and Site for this Package.
 ;;^DD(9.4,10.6,0)
 ;;=*LOWEST FILE NUMBER^NJ12,2^^11;1^K:+X'=X!(X>999999999)!(X<0)!(X?.E1"."3N.N) X
 ;;^DD(9.4,10.6,3)
 ;;=Type a Number between 0 and 999999999, 2 Decimal Digits
 ;;^DD(9.4,10.6,21,0)
 ;;=^^1^1^2920513^^^^
 ;;^DD(9.4,10.6,21,1,0)
 ;;=Inclusive lower bound of the range of file numbers allocated to this package.
 ;;^DD(9.4,10.6,"DT")
 ;;=2940603
 ;;^DD(9.4,11,0)
 ;;=*HIGHEST FILE NUMBER^NJ12,2^^11;2^K:+X'=X!(X>999999999)!(X<0)!(X?.E1"."3N.N) X
 ;;^DD(9.4,11,3)
 ;;=Type a Number between 0 and 999999999, 2 Decimal Digits
 ;;^DD(9.4,11,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,11,21,1,0)
 ;;=Inclusive upper bound of the range of file numbers assigned to this package.
 ;;^DD(9.4,11,"DT")
 ;;=2940603
 ;;^DD(9.4,11.01,0)
 ;;=DEVELOPMENT ISC^F^^5;1^K:$L(X)>20!($L(X)<3) X
 ;;^DD(9.4,11.01,3)
 ;;=Please enter the name of the ISC (3-20 characters).
 ;;^DD(9.4,11.01,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,11.01,21,1,0)
 ;;=The ISC responsible for the development and management of this Package.
 ;;^DD(9.4,11.01,"DT")
 ;;=2840815
 ;;^DD(9.4,11.1,0)
 ;;=*MAINTENANCE ISC^F^^7;1^K:$L(X)>20!($L(X)<3) X
 ;;^DD(9.4,11.1,3)
 ;;=Please enter the name of the ISC (3-20 characters).
 ;;^DD(9.4,11.1,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,11.1,21,1,0)
 ;;=The ISC responsible for the support and maintenance of this Package.
 ;;^DD(9.4,11.1,"DT")
 ;;=2940603
 ;;^DD(9.4,11.3,0)
 ;;=CLASS^S^I:National;II:Inactive;III:Local;^7;3^Q
 ;;^DD(9.4,11.3,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.4,11.3,21,1,0)
 ;;=The ranking Class of this software Package.
 ;;^DD(9.4,11.3,"DT")
 ;;=2940325
 ;;^DD(9.4,11.4,0)
 ;;=*VERIFICATION^9.404ID^^8;0
 ;;^DD(9.4,11.4,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,11.4,21,1,0)
 ;;=Information about the verification(s) of this Package.
 ;;^DD(9.4,11.4,"DT")
 ;;=2940603
 ;;^DD(9.4,11.5,0)
 ;;=*ALPHA^P4'^DIC(4,^9;1^Q
 ;;^DD(9.4,11.5,3)
 ;;=Please enter the name of the Alpha Test site.
 ;;^DD(9.4,11.5,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,11.5,21,1,0)
 ;;=The name of this Package's Alpha Test site.
 ;;^DD(9.4,11.5,"DT")
 ;;=2940603
 ;;^DD(9.4,11.6,0)
 ;;=*BETA^P4'^DIC(4,^9;2^Q
 ;;^DD(9.4,11.6,3)
 ;;=Please enter the name of the Beta Test site.
 ;;^DD(9.4,11.6,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.4,11.6,21,1,0)
 ;;=The name of this Package's Beta Test site.
 ;;^DD(9.4,11.6,"DT")
 ;;=2940603
 ;;^DD(9.4,11.7,0)
 ;;=*DELTA^9.409P^^10;0
 ;;^DD(9.4,11.7,21,0)
 ;;=^^1^1^2920706^^
 ;;^DD(9.4,11.7,21,1,0)
 ;;=The names of the Delta Test sites for this Package.
 ;;^DD(9.4,11.7,"DT")
 ;;=2940603
 ;;^DD(9.4,12,0)
 ;;=*PRIMARY HELP FRAME^P9.2'^DIC(9.2,^0;4^Q
 ;;^DD(9.4,12,3)
 ;;=
 ;;^DD(9.4,12,21,0)
 ;;=^^1^1^2920416^^^
 ;;^DD(9.4,12,21,1,0)
 ;;=This is the primary Help Frame for this Package.
 ;;^DD(9.4,12,"DT")
 ;;=2940603
 ;;^DD(9.4,13,0)
 ;;=CURRENT VERSION^F^^VERSION;1^K:$L(X)>8!($L(X)<1)!'(X?1N.ANP) X
 ;;^DD(9.4,13,3)
 ;;=Enter the version of this package currently running, (1-8 characters).
 ;;^DD(9.4,13,21,0)
 ;;=^^5^5^2920702^
 ;;^DD(9.4,13,21,1,0)
 ;;=This field holds the version number of the package currently running
 ;;^DD(9.4,13,21,2,0)
 ;;=at this site.  When a package initialization has been run, this field
 ;;^DD(9.4,13,21,3,0)
 ;;=will be updated with the version number most recently installed.
 ;;^DD(9.4,13,21,4,0)
 ;;=This can be either using the old format (1.0, 16.04, etc.) or the new
 ;;^DD(9.4,13,21,5,0)
 ;;=format (18.0T4, 19.1V2, etc.)
 ;;^DD(9.4,13,"DT")
 ;;=2860221
 ;;^DD(9.4,20,0)
 ;;=AFFECTS RECORD MERGE^9.402P^^20;0
 ;;^DD(9.4,20,21,0)
 ;;=^^2^2^2940627^
 ;;^DD(9.4,20,21,1,0)
 ;;=This Multipule lists the files that will impact this package if a Record
 ;;^DD(9.4,20,21,2,0)
 ;;=Merge is done on any of the files in the list.
 ;;^DD(9.4,22,0)
 ;;=VERSION^9.49I^^22;0
 ;;^DD(9.4,22,21,0)
 ;;=^^1^1^2930415^^^^
 ;;^DD(9.4,22,21,1,0)
 ;;=The version numbers of this Package.
 ;;^DD(9.4,200.1,0)
 ;;=*USER TERMINATE TAG^F^^200;1^K:$L(X)>8!($L(X)<1)!'((X?1U.UN)!(X?1N.N)) X
 ;;^DD(9.4,200.1,3)
 ;;=Enter the entry TAG for the routine in field 200.2
 ;;^DD(9.4,200.1,21,0)
 ;;=^^3^3^2920306^^^
 ;;^DD(9.4,200.1,21,1,0)
 ;;=This field holds the entry point into the routine that will be called at
 ;;^DD(9.4,200.1,21,2,0)
 ;;=the time that a USER (File 200 entry with access/verify codes) is
 ;;^DD(9.4,200.1,21,3,0)
 ;;=terminated. See field 200.2
 ;;^DD(9.4,200.1,"DT")
 ;;=2940603
 ;;^DD(9.4,200.2,0)
 ;;=*USER TERMINATE ROUTINE^F^^200;2^K:$L(X)>8!($L(X)<2)!'(X?2U.UN) X
 ;;^DD(9.4,200.2,3)
 ;;=Enter a 2-8 character routine name.
 ;;^DD(9.4,200.2,21,0)
 ;;=^^7^7^2920306^^^
 ;;^DD(9.4,200.2,21,1,0)
 ;;=This field holds the name of a routine that will be called at the time
 ;;^DD(9.4,200.2,21,2,0)
 ;;=that a USER (File 200 entry with access/verify codes) is terminated.
 ;;^DD(9.4,200.2,21,3,0)
 ;;=ie. has their access/verify codes removed.
 ;;^DD(9.4,200.2,21,4,0)
 ;;=This is to allow each package to do their own clean-up.
 ;;^DD(9.4,200.2,21,5,0)
 ;;= 
 ;;^DD(9.4,200.2,21,6,0)
 ;;=At the time the call is made DA will hold the IFN of the user being
 ;;^DD(9.4,200.2,21,7,0)
 ;;=terminated. This normally runs in the background without an IO device.
 ;;^DD(9.4,200.2,"DT")
 ;;=2940603
 ;;^DD(9.4,913,0)
 ;;=*ENVIRONMENT CHECK ROUTINE^F^^PRE;1^K:$L(X)>8!($L(X)<3) X
 ;;^DD(9.4,913,.1)
 ;;=DEVELOPERS ROUTINE RUN BEFORE 'INIT' QUESTIONS ASKED
 ;;^DD(9.4,913,3)
 ;;=Enter name of developer's environment check routine (3-8 characters) that runs before any user questions are asked.  This routine should be used for environment check only and should not alter data.
 ;;^DD(9.4,913,21,0)
 ;;=^^4^4^2921202^
 ;;^DD(9.4,913,21,1,0)
 ;;=The name of the developer's routine which is run at the beginning of
 ;;^DD(9.4,913,21,2,0)
 ;;=the NAMESPACE_INIT routine.  This should just check the environment
 ;;^DD(9.4,913,21,3,0)
 ;;=and should not alter any data, since the user has no way to exit out of
 ;;^DD(9.4,913,21,4,0)
 ;;=the INIT process until this program runs to completion.

DIPKI003
DIPKI003 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.4,913,23,0)
 ;;=^^2^2^2921202^^^^
 ;;^DD(9.4,913,23,1,0)
 ;;=  A call to this routine gets inserted, by DIFROM at the beginning of the
 ;;^DD(9.4,913,23,2,0)
 ;;=NAMESPACE_INIT routine, before the EN entry point.
 ;;^DD(9.4,913,"DT")
 ;;=2940606
 ;;^DD(9.4,913.5,0)
 ;;=*ENVIRONMENT CHECK DONE DATE^D^^PRE;2^S %DT="ESTXR" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.4,913.5,3)
 ;;=
 ;;^DD(9.4,913.5,21,0)
 ;;=^^3^3^2921202^
 ;;^DD(9.4,913.5,21,1,0)
 ;;=This is the date/time that the ENVIRONMENT CHECK routine last ran. When an
 ;;^DD(9.4,913.5,21,2,0)
 ;;=INIT is run at a target site, and it contains an ENVIRONMENT CHECK
 ;;^DD(9.4,913.5,21,3,0)
 ;;=routine, this field is updated automatically.
 ;;^DD(9.4,913.5,"DT")
 ;;=2940603
 ;;^DD(9.4,914,0)
 ;;=*POST-INITIALIZATION ROUTINE^F^^INIT;1^K:$L(X)>8!($L(X)<3)!'(X?1UP.UN) X
 ;;^DD(9.4,914,.1)
 ;;=DEVELOPERS ROUTINE TO BRANCH TO AT END OF 'INIT' ROUTINE
 ;;^DD(9.4,914,3)
 ;;=Enter the name of the developer's post-initialization routine (3-8 characters).
 ;;^DD(9.4,914,21,0)
 ;;=^^2^2^2900730^^^^
 ;;^DD(9.4,914,21,1,0)
 ;;=The name of the developer's routine which is run immediately after the
 ;;^DD(9.4,914,21,2,0)
 ;;=installation of the package.
 ;;^DD(9.4,914,23,0)
 ;;=^^3^3^2900730^^^
 ;;^DD(9.4,914,23,1,0)
 ;;=  This routine gets inserted by DIFROM at the end of the
 ;;^DD(9.4,914,23,2,0)
 ;;=NAMESPACE_INIT routine, after the INIT has filed all the information,
 ;;^DD(9.4,914,23,3,0)
 ;;=but before the quit statement.
 ;;^DD(9.4,914,"DT")
 ;;=2940606
 ;;^DD(9.4,914.5,0)
 ;;=*POST-INIT COMPLETION DATE^D^^INIT;2^S %DT="ESTXR" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.4,914.5,3)
 ;;=
 ;;^DD(9.4,914.5,21,0)
 ;;=^^3^3^2911209^^
 ;;^DD(9.4,914.5,21,1,0)
 ;;=This is the date/time that the POST-INIT last ran.  When an
 ;;^DD(9.4,914.5,21,2,0)
 ;;=INIT is run at a target site, and it contains a POST-INIT
 ;;^DD(9.4,914.5,21,3,0)
 ;;=routine, this field is updated automatically.
 ;;^DD(9.4,914.5,"DT")
 ;;=2940603
 ;;^DD(9.4,916,0)
 ;;=*PRE-INIT AFTER USER COMMIT^F^^INI;1^K:$L(X)>8!($L(X)<3) X
 ;;^DD(9.4,916,.1)
 ;;=DEVELOPERS ROUTINE RUN AFTER 'INIT' QUESTIONS ANSWERED
 ;;^DD(9.4,916,3)
 ;;=Enter name of developer's pre-init routine (3-8 characters) that runs after user has answered all INIT questions.  Can be used for data conversions needed before INIT files new data.
 ;;^DD(9.4,916,21,0)
 ;;=^^4^4^2930303^^^^
 ;;^DD(9.4,916,21,1,0)
 ;;=Name of the developer's routine that runs after the user has answered all
 ;;^DD(9.4,916,21,2,0)
 ;;=of the questions in NAMESPACE_INIT but before the INIT files any new data.
 ;;^DD(9.4,916,21,3,0)
 ;;=Used for data conversions, etc. that the developer needs to do before
 ;;^DD(9.4,916,21,4,0)
 ;;=bringing in new data.
 ;;^DD(9.4,916,23,0)
 ;;=^^3^3^2930303^^^^
 ;;^DD(9.4,916,23,1,0)
 ;;=  A call to this routine gets inserted, by DIFROM, into the
 ;;^DD(9.4,916,23,2,0)
 ;;=NAMESPACE_INIT1 routine, after the user has answered the last
 ;;^DD(9.4,916,23,3,0)
 ;;=question 'ARE YOU SURE EVERYTHING'S OK?', but before filing any data.
 ;;^DD(9.4,916,"DT")
 ;;=2940606
 ;;^DD(9.4,916.5,0)
 ;;=*PRE-INIT COMPLETION DATE^D^^INI;2^S %DT="ESTXR" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.4,916.5,21,0)
 ;;=^^3^3^2911209^^
 ;;^DD(9.4,916.5,21,1,0)
 ;;=This is the date/time that the PRE-INIT AFTER USER COMMIT last ran.
 ;;^DD(9.4,916.5,21,2,0)
 ;;=When an INIT is run at a target site, and it contains a PRE-INIT
 ;;^DD(9.4,916.5,21,3,0)
 ;;=AFTER USER COMMIT routine, this field is updated automatically.
 ;;^DD(9.4,916.5,"DT")
 ;;=2940603
 ;;^DD(9.4,919,0)
 ;;=*EXCLUDED NAME SPACE^9.432^^EX;0
 ;;^DD(9.4,919,21,0)
 ;;=^^5^5^2930303^^^
 ;;^DD(9.4,919,21,1,0)
 ;;=By specifying an "excluded name space", the developer will be telling
 ;;^DD(9.4,919,21,2,0)
 ;;=the DIFROM routine not to take OPTIONS, BULLETINS, etc. which begin
 ;;^DD(9.4,919,21,3,0)
 ;;=with these characters.  For example, if "PSZ" is an excluded name space
 ;;^DD(9.4,919,21,4,0)
 ;;=in the "PS" package, DIFROM will not send along OPTIONS, SECURITY KEYS,
 ;;^DD(9.4,919,21,5,0)
 ;;=BULLETINS, or FUNCTIONS that begin with "PSZ".
 ;;^DD(9.4,919,"DT")
 ;;=2940603
 ;;^DD(9.4,1920,0)
 ;;=*STATUS^9.444D^^ST;0
 ;;^DD(9.4,1920,21,0)
 ;;=^^1^1^2851008^^^
 ;;^DD(9.4,1920,21,1,0)
 ;;=Information about the Namespace assignment status of this package.
 ;;^DD(9.4,1920,"DT")
 ;;=2940606
 ;;^DD(9.4,1933,0)
 ;;=*KEY VARIABLE^9.455^^1933;0
 ;;^DD(9.4,1933,21,0)
 ;;=^^2^2^2851009^^^
 ;;^DD(9.4,1933,21,1,0)
 ;;=These are the MUMPS variables which the Package would like defined
 ;;^DD(9.4,1933,21,2,0)
 ;;=prior to entry into the routines.
 ;;^DD(9.4,1933,"DT")
 ;;=2940603
 ;;^DD(9.4,1944,0)
 ;;=*BULLETINS^XCmJ30^^ ; ^S (XU,X)=$P(^DIC(9.4,D0,0),U,2) I X?1A.E F D=0:0 S D=$O(^XMB(3.6,"B",X,0)) S:D="" D=-1 X:$D(^XMB(3.6,D,0)) DICMX S X=$O(^XMB(3.6,"B",X)) I $P(X,XU,1)]""!(X="") S X="" Q
 ;;^DD(9.4,1944,9)
 ;;=^
 ;;^DD(9.4,1944,9.01)
 ;;=
 ;;^DD(9.4,1944,9.1)
 ;;=S (XU,X)=$P(^DIC(9.4,D0,0),U,2) I X?1A.E F D=0:0 Q:$P(X,XU,1)]""!(X="")  S D=$O(^XMB(3.6,X,0)) S:D="" D=-1 X:$D(^XMB(3.6,D,0)) DICMX S X=$O(^XMB(3.6,"B",X))
 ;;^DD(9.4,1944,21,0)
 ;;=^^2^2^2851008^
 ;;^DD(9.4,1944,21,1,0)
 ;;=This presents information about any BULLETINs which are distributed
 ;;^DD(9.4,1944,21,2,0)
 ;;=along with the Package.
 ;;^DD(9.4,1944,"DT")
 ;;=2940606
 ;;^DD(9.4,1945,0)
 ;;=*SECURITY KEYS^XCmJ30^^ ; ^S (XU,X)=$P(^DIC(9.4,D0,0),U,2) I X?1A.E F D=0:0 X:$D(^XUSEC(X)) DICMX S X=$O(^XUSEC(X)) I $P(X,XU,1)]""!(X="") S X="" Q
 ;;^DD(9.4,1945,9)
 ;;=^
 ;;^DD(9.4,1945,9.01)
 ;;=
 ;;^DD(9.4,1945,9.1)
 ;;=S (XU,X)=$P(^DIC(9.4,D0,0),U,2) I X?1A.E F D=0:0 X:$D(^XUSEC(X)) DICMX S X=$O(^XUSEC(X)) I $P(X,XU,1)]""!(X="") S X="" Q
 ;;^DD(9.4,1945,21,0)
 ;;=^^2^2^2851008^
 ;;^DD(9.4,1945,21,1,0)
 ;;=This describes the SECURITY KEYs which are distributed along with
 ;;^DD(9.4,1945,21,2,0)
 ;;=the Package.
 ;;^DD(9.4,1945,"DT")
 ;;=2940606
 ;;^DD(9.4,1946,0)
 ;;=*OPTIONS^XCmJ30^^ ; ^S (XU,X)=$P(^DIC(9.4,D0,0),U,2) I X?1A.E F D=0:0 S D=$O(^DIC(19,"B",X,0)) S:D="" D=-1 X:$D(^DIC(19,D,0)) DICMX S X=$O(^DIC(19,"B",X)) I $P(X,XU,1)]""!(X="") S X="" Q
 ;;^DD(9.4,1946,9)
 ;;=^
 ;;^DD(9.4,1946,9.01)
 ;;=
 ;;^DD(9.4,1946,9.1)
 ;;=S (XU,X)=$P(^DIC(9.4,D0,0),U,2) I X?1A.E F D=0:0 Q:$P(X,XU,1)]""!(X="")  S D=$O(^DIC(19,"B",X,0)) S:D="" D=-1 X:$D(^DIC(19,D,0)) DICMX S X=$O(^DIC(19,"B",X))
 ;;^DD(9.4,1946,21,0)
 ;;=^^2^2^2851008^
 ;;^DD(9.4,1946,21,1,0)
 ;;=This lists information concerning the OPTIONs which are distributed

DIPKI004
DIPKI004 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.4,1946,21,2,0)
 ;;=along with the Package.
 ;;^DD(9.4,1946,"DT")
 ;;=2940606
 ;;^DD(9.4,15007,0)
 ;;=SYNONYM^9.415007^^15007;0
 ;;^DD(9.402,0)
 ;;=AFFECTS RECORD MERGE SUB-FIELD^^4^3
 ;;^DD(9.402,0,"DT")
 ;;=2900906
 ;;^DD(9.402,0,"IX","B",9.402,.01)
 ;;=
 ;;^DD(9.402,0,"NM","AFFECTS RECORD MERGE")
 ;;=
 ;;^DD(9.402,0,"UP")
 ;;=9.4
 ;;^DD(9.402,.01,0)
 ;;=FILE AFFECTED^*P1'X^DIC(^0;1^S DIC("S")="I $D(^DD(15,.01,""V"",""B"",Y))" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X S:$D(X) DINUM=X
 ;;^DD(9.402,.01,1,0)
 ;;=^.1
 ;;^DD(9.402,.01,1,1,0)
 ;;=9.402^B
 ;;^DD(9.402,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),20,"B",$E(X,1,30),DA)=""
 ;;^DD(9.402,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),20,"B",$E(X,1,30),DA)
 ;;^DD(9.402,.01,1,2,0)
 ;;=9.4^AMRG
 ;;^DD(9.402,.01,1,2,1)
 ;;=S ^DIC(9.4,"AMRG",$E(X,1,30),DA(1),DA)=""
 ;;^DD(9.402,.01,1,2,2)
 ;;=K ^DIC(9.4,"AMRG",$E(X,1,30),DA(1),DA)
 ;;^DD(9.402,.01,1,2,"%D",0)
 ;;=^^2^2^2900906^
 ;;^DD(9.402,.01,1,2,"%D",1,0)
 ;;=This xref is used by the merge process to determine if any package
 ;;^DD(9.402,.01,1,2,"%D",2,0)
 ;;=file entry affects the file being merged.
 ;;^DD(9.402,.01,1,2,"DT")
 ;;=2900906
 ;;^DD(9.402,.01,3)
 ;;=Pointer to a file that has been added to FILE 15's variable pointer.
 ;;^DD(9.402,.01,12)
 ;;=MUST BE VARIABLE POINTER FILE IN FIELD .01 OF FILE 15
 ;;^DD(9.402,.01,12.1)
 ;;=S DIC("S")="I $D(^DD(15,.01,""V"",""B"",Y))"
 ;;^DD(9.402,.01,21,0)
 ;;=^^1^1^2940627^^
 ;;^DD(9.402,.01,21,1,0)
 ;;=A file that if merged will affect this package.
 ;;^DD(9.402,.01,"DT")
 ;;=2900910
 ;;^DD(9.402,3,0)
 ;;=NAME OF MERGE ROUTINE^F^^0;3^K:$L(X)>8!($L(X)<2)!'(X?1U1.7UN) X
 ;;^DD(9.402,3,3)
 ;;=Answer with a routine name (1U.1.7UN).
 ;;^DD(9.402,3,21,0)
 ;;=^^4^4^2930330^
 ;;^DD(9.402,3,21,1,0)
 ;;=This field holds the routine name to call when two records in
 ;;^DD(9.402,3,21,2,0)
 ;;=an affected file are to be merged. This allows the package to
 ;;^DD(9.402,3,21,3,0)
 ;;=do any repointing or other clean-up needed before the records
 ;;^DD(9.402,3,21,4,0)
 ;;=are merged.
 ;;^DD(9.402,3,"DT")
 ;;=2900816
 ;;^DD(9.402,4,0)
 ;;=RECORD HAS PACKAGE DATA^K^^1;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(9.402,4,3)
 ;;=This is Standard MUMPS code. To tell if this record has data in this package.
 ;;^DD(9.402,4,9)
 ;;=@
 ;;^DD(9.402,4,"DT")
 ;;=2900816
 ;;^DD(9.404,0)
 ;;=*VERIFICATION SUB-FIELD^NL^3^4
 ;;^DD(9.404,0,"ID",1)
 ;;=W:$D(^(0)) "   ",$P(^(0),U,2)
 ;;^DD(9.404,0,"NM","*VERIFICATION")
 ;;=
 ;;^DD(9.404,0,"UP")
 ;;=9.4
 ;;^DD(9.404,.01,0)
 ;;=VERIFICATION^DX^^0;1^S %DT="E" D ^%DT S (DINUM,X)=Y K:Y<1 DINUM,X
 ;;^DD(9.404,.01,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.404,.01,21,1,0)
 ;;=Date of notification that this software has been verified.
 ;;^DD(9.404,.01,"DT")
 ;;=2840815
 ;;^DD(9.404,1,0)
 ;;=ISC^F^^0;2^K:$L(X)>20!($L(X)<2) X
 ;;^DD(9.404,1,3)
 ;;=The name of the ISC responsible for verification (3-20 characters).
 ;;^DD(9.404,1,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.404,1,21,1,0)
 ;;=The name of the ISC where this verification was done.
 ;;^DD(9.404,1,"DT")
 ;;=2840815
 ;;^DD(9.404,2,0)
 ;;=VERSION^NJ6,2^^0;3^K:+X'=X!(X>999)!(X<0)!(X?.E1"."3N.N) X
 ;;^DD(9.404,2,3)
 ;;=Please enter the version number of this verified Package (0.00-999.99).
 ;;^DD(9.404,2,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.404,2,21,1,0)
 ;;=The version number of this verified Package.
 ;;^DD(9.404,2,"DT")
 ;;=2840815
 ;;^DD(9.404,3,0)
 ;;=COMMENTS^9.414^^1;0
 ;;^DD(9.404,3,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.404,3,21,1,0)
 ;;=Comments regarding this verified version of the Package.
 ;;^DD(9.409,0)
 ;;=*DELTA SUB-FIELD^NL^.01^1
 ;;^DD(9.409,0,"NM","*DELTA")
 ;;=
 ;;^DD(9.409,0,"UP")
 ;;=9.4
 ;;^DD(9.409,.01,0)
 ;;=DELTA^MP4'X^DIC(4,^0;1^S:$D(X) DINUM=X
 ;;^DD(9.409,.01,3)
 ;;=Please enter the name of the Delta Test site.
 ;;^DD(9.409,.01,21,0)
 ;;=^^1^1^2851007^
 ;;^DD(9.409,.01,21,1,0)
 ;;=The name of a Delta Test site for this Package.
 ;;^DD(9.409,.01,"DT")
 ;;=2840815
 ;;^DD(9.41,0)
 ;;=DESCRIPTION SUB-FIELD^NL^.01^1
 ;;^DD(9.41,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(9.41,0,"UP")
 ;;=9.4
 ;;^DD(9.41,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(9.41,.01,3)
 ;;=Please enter a complete and detailed description of the Package.
 ;;^DD(9.41,.01,21,0)
 ;;=^^2^2^2920513^^^^
 ;;^DD(9.41,.01,21,1,0)
 ;;=This is a complete and detailed description of the Package's functions
 ;;^DD(9.41,.01,21,2,0)
 ;;=and capabilities.
 ;;^DD(9.41,.01,"DT")
 ;;=2851007
 ;;^DD(9.414,0)
 ;;=COMMENTS SUB-FIELD^NL^.01^1
 ;;^DD(9.414,0,"NM","COMMENTS")
 ;;=
 ;;^DD(9.414,0,"UP")
 ;;=9.404
 ;;^DD(9.414,.01,0)
 ;;=COMMENTS^W^^0;1^Q
 ;;^DD(9.414,.01,3)
 ;;=Comments relating to verification
 ;;^DD(9.414,.01,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.414,.01,21,1,0)
 ;;=Comments regarding this verified version of the Package.
 ;;^DD(9.414,.01,"DT")
 ;;=2840815
 ;;^DD(9.415007,0)
 ;;=SYNONYM SUB-FIELD^^.01^1
 ;;^DD(9.415007,0,"DT")
 ;;=2941020
 ;;^DD(9.415007,0,"IX","B",9.415007,.01)
 ;;=
 ;;^DD(9.415007,0,"NM","SYNONYM")
 ;;=
 ;;^DD(9.415007,0,"UP")
 ;;=9.4
 ;;^DD(9.415007,.01,0)
 ;;=SYNONYM^F^^0;1^K:$L(X)>30!($L(X)<2) X
 ;;^DD(9.415007,.01,1,0)
 ;;=^.1
 ;;^DD(9.415007,.01,1,1,0)
 ;;=9.415007^B
 ;;^DD(9.415007,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),15007,"B",$E(X,1,30),DA)=""
 ;;^DD(9.415007,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),15007,"B",$E(X,1,30),DA)
 ;;^DD(9.415007,.01,1,2,0)
 ;;=9.4^E
 ;;^DD(9.415007,.01,1,2,1)
 ;;=S ^DIC(9.4,"E",$E(X,1,30),DA(1),DA)=""
 ;;^DD(9.415007,.01,1,2,2)
 ;;=K ^DIC(9.4,"E",$E(X,1,30),DA(1),DA)
 ;;^DD(9.415007,.01,1,2,"%D",0)
 ;;=^^2^2^2941020^
 ;;^DD(9.415007,.01,1,2,"%D",1,0)
 ;;=This allow the lookup of a package other than it's official name.
 ;;^DD(9.415007,.01,1,2,"%D",2,0)
 ;;=It is'nt used by the Kernel VERSION function.
 ;;^DD(9.415007,.01,1,2,"DT")
 ;;=2941020
 ;;^DD(9.415007,.01,3)
 ;;=Answer must be 2-30 characters in length.
 ;;^DD(9.415007,.01,"DT")
 ;;=2941020
 ;;^DD(9.42,0)
 ;;=*ROUTINE SUB-FIELD^NL^.01^1
 ;;^DD(9.42,0,"IX","B",9.42,.01)
 ;;=
 ;;^DD(9.42,0,"NM","*ROUTINE")
 ;;=
 ;;^DD(9.42,0,"UP")
 ;;=9.4
 ;;^DD(9.42,.01,0)
 ;;=ROUTINE^MFX^^0;1^K:$L(X)>8!($L(X)<1)!'(X?.UN!(X?1"%".UN)) X
 ;;^DD(9.42,.01,1,0)
 ;;=^.1^^-1
 ;;^DD(9.42,.01,1,1,0)
 ;;=9.4^D
 ;;^DD(9.42,.01,1,1,1)
 ;;=S ^DIC(9.4,"D",X,DA(1))=""
 ;;^DD(9.42,.01,1,1,2)
 ;;=K ^DIC(9.4,"D",X,DA(1))
 ;;^DD(9.42,.01,1,2,0)
 ;;=9.42^B
 ;;^DD(9.42,.01,1,2,1)
 ;;=S ^DIC(9.4,DA(1),2,"B",X,DA)=""
 ;;^DD(9.42,.01,1,2,2)
 ;;=K ^DIC(9.4,DA(1),2,"B",X,DA)
 ;;^DD(9.42,.01,3)
 ;;=Please enter a routine name (1-8 characters).
 ;;^DD(9.42,.01,21,0)
 ;;=^^3^3^2920513^^^^

DIPKI005
DIPKI005 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.42,.01,21,1,0)
 ;;=This multiple is used for documentation purposes only and does
 ;;^DD(9.42,.01,21,2,0)
 ;;=not control anything during the INIT process.  It is used to document
 ;;^DD(9.42,.01,21,3,0)
 ;;=the routines that are included in this Package.
 ;;^DD(9.42,.01,22)
 ;;=
 ;;^DD(9.42,.01,"DT")
 ;;=2850211
 ;;^DD(9.43,0)
 ;;=*GLOBAL SUB-FIELD^NL^5^3
 ;;^DD(9.43,0,"DT")
 ;;=2910827
 ;;^DD(9.43,0,"IX","B",9.43,.01)
 ;;=
 ;;^DD(9.43,0,"NM","*GLOBAL")
 ;;=
 ;;^DD(9.43,0,"UP")
 ;;=9.4
 ;;^DD(9.43,.01,0)
 ;;=GLOBAL^MF^^0;1^K:X[""""!(X'?.ANP)!(X<0) X I $D(X) K:$L(X)>15!($L(X)<1) X
 ;;^DD(9.43,.01,1,0)
 ;;=^.1
 ;;^DD(9.43,.01,1,1,0)
 ;;=9.43^B
 ;;^DD(9.43,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),3,"B",X,DA)=""
 ;;^DD(9.43,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),3,"B",X,DA)
 ;;^DD(9.43,.01,3)
 ;;=Enter name of global used in this package.  Answer must be 1-15 characters in length.  (Used for documentation only.)
 ;;^DD(9.43,.01,21,0)
 ;;=^^2^2^2920513^^^
 ;;^DD(9.43,.01,21,1,0)
 ;;=The name of a global which is part of this Package.  Used for documentation
 ;;^DD(9.43,.01,21,2,0)
 ;;=only.
 ;;^DD(9.43,.01,"DT")
 ;;=2910827
 ;;^DD(9.43,4,0)
 ;;=DESCRIPTION^9.431^^4;0
 ;;^DD(9.43,4,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.43,4,21,1,0)
 ;;=This is a description of the global and how it is used by the Package.
 ;;^DD(9.43,5,0)
 ;;=JOURNALLING^S^M:mandatory!;O:optional--not required;N:not recommended;^5;1^Q
 ;;^DD(9.43,5,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.43,5,21,1,0)
 ;;=Advises whether or not to Journal this global.
 ;;^DD(9.43,5,"DT")
 ;;=2850228
 ;;^DD(9.431,0)
 ;;=DESCRIPTION SUB-FIELD^NL^.01^1
 ;;^DD(9.431,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(9.431,0,"UP")
 ;;=9.43
 ;;^DD(9.431,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(9.431,.01,21,0)
 ;;=^^1^1^2920513^^^
 ;;^DD(9.431,.01,21,1,0)
 ;;=This is a description of the global and how it is used by the Package.
 ;;^DD(9.431,.01,"DT")
 ;;=2850228
 ;;^DD(9.432,0)
 ;;=*EXCLUDED NAME SPACE SUB-FIELD^NL^.01^1
 ;;^DD(9.432,0,"NM","*EXCLUDED NAME SPACE")
 ;;=
 ;;^DD(9.432,0,"UP")
 ;;=9.4
 ;;^DD(9.432,.01,0)
 ;;=EXCLUDED NAME SPACE^MFX^^0;1^K:$L(X)>7!($L(X)<2)!'(X?1U1UN.UN) X
 ;;^DD(9.432,.01,3)
 ;;=Please enter the prefix of the excluded name space (2-7 characters).
 ;;^DD(9.432,.01,4)
 ;;=W !,?5,"When DIFROM builds '",$P(^DIC(9.4,D0,0),"^",2),"INIT',",!?5,"OPTIONS, FUNCTIONS, SECURITY KEYS, and BULLETINS beginning with",!?5,"these characters WON'T be included.",!
 ;;^DD(9.432,.01,21,0)
 ;;=^^2^2^2851008^
 ;;^DD(9.432,.01,21,1,0)
 ;;=This specifies a sub-set of the Package's namespace which is not to
 ;;^DD(9.432,.01,21,2,0)
 ;;=be exported by the DIFROM routines.
 ;;^DD(9.432,.01,"DT")
 ;;=2841128
 ;;^DD(9.44,0)
 ;;=*FILE SUB-FIELD^NL^223^9
 ;;^DD(9.44,0,"DT")
 ;;=2890928
 ;;^DD(9.44,0,"IX","B",9.44,.01)
 ;;=
 ;;^DD(9.44,0,"NM","*FILE")
 ;;=
 ;;^DD(9.44,0,"UP")
 ;;=9.4
 ;;^DD(9.44,.01,0)
 ;;=FILE^M*P1'^DIC(^0;1^S DIC("S")="I Y>1.9999" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;^DD(9.44,.01,.1)
 ;;=REQUIRED FILES FOR THIS PACKAGE
 ;;^DD(9.44,.01,1,0)
 ;;=^.1
 ;;^DD(9.44,.01,1,1,0)
 ;;=9.44^B
 ;;^DD(9.44,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),4,"B",X,DA)=""
 ;;^DD(9.44,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),4,"B",X,DA)
 ;;^DD(9.44,.01,1,2,0)
 ;;=9.4^AR
 ;;^DD(9.44,.01,1,2,1)
 ;;=S ^DIC(9.4,"AR",$E(X,1,30),DA(1),DA)=""
 ;;^DD(9.44,.01,1,2,2)
 ;;=K ^DIC(9.4,"AR",$E(X,1,30),DA(1),DA)
 ;;^DD(9.44,.01,3)
 ;;=Please enter the name of a FILE that is known to VA FileMan.
 ;;^DD(9.44,.01,12)
 ;;=Select a file which is used by this package.
 ;;^DD(9.44,.01,12.1)
 ;;=S DIC("S")="I Y>1.9999"
 ;;^DD(9.44,.01,21,0)
 ;;=^^2^2^2920513^^^^
 ;;^DD(9.44,.01,21,1,0)
 ;;=The name of a VA FileMan file which you wish to transport with
 ;;^DD(9.44,.01,21,2,0)
 ;;=this package.  This may be any file whose number is 2 or greater.
 ;;^DD(9.44,.01,"DT")
 ;;=2890928
 ;;^DD(9.44,2,0)
 ;;=FIELD^9.45A^^1;0
 ;;^DD(9.44,2,21,0)
 ;;=^^3^3^2920513^^^
 ;;^DD(9.44,2,21,1,0)
 ;;=The names of the FileMan Fields required by this Package.  Enter data
 ;;^DD(9.44,2,21,2,0)
 ;;=here ONLY if you wish to send just selected fields from a Data Dictionary
 ;;^DD(9.44,2,21,3,0)
 ;;=instead of the entire DD (i.e., a partial DD).
 ;;^DD(9.44,222.1,0)
 ;;=UPDATE THE DATA DICTIONARY^S^y:YES;n:NO;^222;1^Q
 ;;^DD(9.44,222.1,21,0)
 ;;=^^8^8^2920513^^^^
 ;;^DD(9.44,222.1,21,1,0)
 ;;=YES means that the Data Dictionary for this file should be updated when
 ;;^DD(9.44,222.1,21,2,0)
 ;;=this version of the package is installed.
 ;;^DD(9.44,222.1,21,3,0)
 ;;= 
 ;;^DD(9.44,222.1,21,4,0)
 ;;=NO means that this Data Dictionary has not changed since the last version,
 ;;^DD(9.44,222.1,21,5,0)
 ;;=and therefore, need not be updated.
 ;;^DD(9.44,222.1,21,6,0)
 ;;= 
 ;;^DD(9.44,222.1,21,7,0)
 ;;=If the Data Dictionary does not exist on the recipient system, then this
 ;;^DD(9.44,222.1,21,8,0)
 ;;=field does not apply.  The DD will be put in place.
 ;;^DD(9.44,222.1,"DT")
 ;;=2890627
 ;;^DD(9.44,222.2,0)
 ;;=ASSIGN A VERSION NUMBER^S^y:YES;n:NO;^222;2^Q
 ;;^DD(9.44,222.2,3)
 ;;=
 ;;^DD(9.44,222.2,21,0)
 ;;=^^5^5^2920513^^^^
 ;;^DD(9.44,222.2,21,1,0)
 ;;=YES means that you want to set ^DD(file#,0,"VR") to the version
 ;;^DD(9.44,222.2,21,2,0)
 ;;=number of this package when the init is finished.
 ;;^DD(9.44,222.2,21,3,0)
 ;;= 
 ;;^DD(9.44,222.2,21,4,0)
 ;;=NO means that you intend for the version number to remain as it is.
 ;;^DD(9.44,222.2,21,5,0)
 ;;=This may mean that this DD has no version number at all.
 ;;^DD(9.44,222.4,0)
 ;;=MAY USER OVERRIDE DD UPDATE^S^y:YES;n:NO;^222;4^Q
 ;;^DD(9.44,222.4,3)
 ;;=
 ;;^DD(9.44,222.4,21,0)
 ;;=^^5^5^2920513^^^^
 ;;^DD(9.44,222.4,21,1,0)
 ;;=YES means that the user may decide at installation time whether or not
 ;;^DD(9.44,222.4,21,2,0)
 ;;=to update the data dictionary for this file.
 ;;^DD(9.44,222.4,21,3,0)
 ;;= 
 ;;^DD(9.44,222.4,21,4,0)
 ;;=NO means that the developer building the INIT is determining if the
 ;;^DD(9.44,222.4,21,5,0)
 ;;=data dictionary is to be updated.
 ;;^DD(9.44,222.7,0)
 ;;=DATA COMES WITH FILE^S^y:YES;n:NO;^222;7^Q
 ;;^DD(9.44,222.7,2)
 ;;=DATA COMES WITH FILE
 ;;^DD(9.44,222.7,21,0)
 ;;=^^4^4^2920513^^^^
 ;;^DD(9.44,222.7,21,1,0)
 ;;=YES means that the data should be included in the initialization
 ;;^DD(9.44,222.7,21,2,0)
 ;;=routines.
 ;;^DD(9.44,222.7,21,3,0)
 ;;= 
 ;;^DD(9.44,222.7,21,4,0)
 ;;=NO means that the data should be left out.
 ;;^DD(9.44,222.7,"DT")
 ;;=2940502
 ;;^DD(9.44,222.8,0)
 ;;=MERGE OR OVERWRITE SITE'S DATA^S^m:MERGE;o:OVERWRITE;^222;8^Q

DIPKI006
DIPKI006 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.44,222.8,3)
 ;;=
 ;;^DD(9.44,222.8,21,0)
 ;;=^^7^7^2920513^^^^
 ;;^DD(9.44,222.8,21,1,0)
 ;;= 
 ;;^DD(9.44,222.8,21,2,0)
 ;;=If the data being sent is to be MERGED, then only data which is not
 ;;^DD(9.44,222.8,21,3,0)
 ;;=already on file at the recipient site will be put in place.
 ;;^DD(9.44,222.8,21,4,0)
 ;;= 
 ;;^DD(9.44,222.8,21,5,0)
 ;;=If the data being sent is to OVERWRITE, then the data included in
 ;;^DD(9.44,222.8,21,6,0)
 ;;=the initialization routines will be put in place regardless of what
 ;;^DD(9.44,222.8,21,7,0)
 ;;=is on file at the recipient site.
 ;;^DD(9.44,222.8,"DT")
 ;;=2890627
 ;;^DD(9.44,222.9,0)
 ;;=MAY USER OVERRIDE DATA UPDATE^S^y:YES;n:NO;^222;9^Q
 ;;^DD(9.44,222.9,2)
 ;;=MAY USER OVERRIDE DATA UPDATE
 ;;^DD(9.44,222.9,3)
 ;;=
 ;;^DD(9.44,222.9,21,0)
 ;;=^^7^7^2920513^^^^
 ;;^DD(9.44,222.9,21,1,0)
 ;;=YES means that the user has the option to determine whether or not
 ;;^DD(9.44,222.9,21,2,0)
 ;;=to bring in the data that has been sent with the package.  However,
 ;;^DD(9.44,222.9,21,3,0)
 ;;=he does not get the ability to change from merge to overwrite or
 ;;^DD(9.44,222.9,21,4,0)
 ;;=from overwrite to merge.
 ;;^DD(9.44,222.9,21,5,0)
 ;;= 
 ;;^DD(9.44,222.9,21,6,0)
 ;;=No means that the developer of the INIT will control whether the data
 ;;^DD(9.44,222.9,21,7,0)
 ;;=will be installed at the target site.
 ;;^DD(9.44,222.9,"DT")
 ;;=2940502
 ;;^DD(9.44,223,0)
 ;;=SCREEN TO DETERMINE DD UPDATE^KX^^223;E1,245^K:$L(X)>240 X I $D(X) D ^DIM
 ;;^DD(9.44,223,3)
 ;;=This is Standard MUMPS code from 1 to 240 characters in length.
 ;;^DD(9.44,223,9)
 ;;=@
 ;;^DD(9.44,223,21,0)
 ;;=^^7^7^2920513^^
 ;;^DD(9.44,223,21,1,0)
 ;;=This field contains standard MUMPS code which is used to determine
 ;;^DD(9.44,223,21,2,0)
 ;;=whether or not a data dictionary should be updated.  This code must
 ;;^DD(9.44,223,21,3,0)
 ;;=set $T.  If $T=1, the DD will be updated.  If $T=0, it will not.
 ;;^DD(9.44,223,21,4,0)
 ;;= 
 ;;^DD(9.44,223,21,5,0)
 ;;=This code will be executed within VA FileMan which may be being called
 ;;^DD(9.44,223,21,6,0)
 ;;=from within MailMan which is being called from within MenuMan.
 ;;^DD(9.44,223,21,7,0)
 ;;=Namespace your variables.
 ;;^DD(9.44,223,"DT")
 ;;=2890927
 ;;^DD(9.444,0)
 ;;=*STATUS SUB-FIELD^NL^2^4
 ;;^DD(9.444,0,"NM","*STATUS")
 ;;=
 ;;^DD(9.444,0,"UP")
 ;;=9.4
 ;;^DD(9.444,.01,0)
 ;;=DATE^DX^^0;1^S %DT="E" D ^%DT S (DINUM,X)=Y K:Y<1 X,DINUM
 ;;^DD(9.444,.01,3)
 ;;=Please enter the date at which the current status took effect.
 ;;^DD(9.444,.01,21,0)
 ;;=^^1^1^2851008^^
 ;;^DD(9.444,.01,21,1,0)
 ;;=This is the date at which the current status took effect.
 ;;^DD(9.444,.01,"DT")
 ;;=2840814
 ;;^DD(9.444,1,0)
 ;;=STATUS^S^A:ASSIGNED;P:PENDING;T:TEMPORARY;X:NO LONGER USED;^0;2^Q
 ;;^DD(9.444,1,21,0)
 ;;=^^2^2^2851008^
 ;;^DD(9.444,1,21,1,0)
 ;;=This specifies the current status of the namespace, i.e. Temporary,
 ;;^DD(9.444,1,21,2,0)
 ;;=Pending, Assigned, etc.
 ;;^DD(9.444,1,"DT")
 ;;=2840814
 ;;^DD(9.444,1.5,0)
 ;;=EXPIRATION DATE^D^^2;1^S %DT="E" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.444,1.5,3)
 ;;=Please enter the date at which the namespace was de-assigned.
 ;;^DD(9.444,1.5,21,0)
 ;;=^^2^2^2851008^^
 ;;^DD(9.444,1.5,21,1,0)
 ;;=This is the date at which the assignment of the namespace to
 ;;^DD(9.444,1.5,21,2,0)
 ;;=this Package expired.
 ;;^DD(9.444,1.5,"DT")
 ;;=2840815
 ;;^DD(9.444,2,0)
 ;;=COMMENTS^9.454^^1;0
 ;;^DD(9.444,2,21,0)
 ;;=^^1^1^2851008^
 ;;^DD(9.444,2,21,1,0)
 ;;=These are any comments about the status of this Package's namespace.
 ;;^DD(9.45,0)
 ;;=FIELD SUB-FIELD^NL^.01^1
 ;;^DD(9.45,0,"IX","B",9.45,.01)
 ;;=
 ;;^DD(9.45,0,"NM","FIELD")
 ;;=
 ;;^DD(9.45,0,"UP")
 ;;=9.44
 ;;^DD(9.45,.01,0)
 ;;=FIELD^MFX^^0;1^S %=+^DIC(9.4,DA(2),4,DA(1),0),X=$S($L(X)>30:X,$D(^DD(%,"B",X)):X,X'?.NP:0,'$D(^DD(%,X,0)):0,1:$P(^(0),U,1)) K:X=0 X
 ;;^DD(9.45,.01,.1)
 ;;=FIELDS REQUIRED FOR THE PACKAGE
 ;;^DD(9.45,.01,1,0)
 ;;=^.1
 ;;^DD(9.45,.01,1,1,0)
 ;;=9.45^B
 ;;^DD(9.45,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(2),4,DA(1),1,"B",X,DA)=""
 ;;^DD(9.45,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(2),4,DA(1),1,"B",X,DA)
 ;;^DD(9.45,.01,3)
 ;;=Please enter the name of a field.
 ;;^DD(9.45,.01,21,0)
 ;;=^^4^4^2920513^^^^
 ;;^DD(9.45,.01,21,1,0)
 ;;=The name of a FileMan field required by this Package.  This field is
 ;;^DD(9.45,.01,21,2,0)
 ;;=only to be filled in if you wish to send only selected fields in
 ;;^DD(9.45,.01,21,3,0)
 ;;=an INIT of this file, instead of the full data dictionary. (i.e.,
 ;;^DD(9.45,.01,21,4,0)
 ;;=a partial DD).
 ;;^DD(9.45,.01,"DT")
 ;;=2840302
 ;;^DD(9.454,0)
 ;;=COMMENTS SUB-FIELD^NL^.01^1
 ;;^DD(9.454,0,"NM","COMMENTS")
 ;;=
 ;;^DD(9.454,0,"UP")
 ;;=9.444
 ;;^DD(9.454,.01,0)
 ;;=COMMENTS^W^^0;1^Q
 ;;^DD(9.454,.01,21,0)
 ;;=^^1^1^2851008^
 ;;^DD(9.454,.01,21,1,0)
 ;;=These are comments about the status of this Package's namespace.
 ;;^DD(9.454,.01,"DT")
 ;;=2840815
 ;;^DD(9.455,0)
 ;;=*KEY VARIABLE SUB-FIELD^NL^1^3
 ;;^DD(9.455,0,"DT")
 ;;=2920928
 ;;^DD(9.455,0,"IX","AB",9.455,.01)
 ;;=
 ;;^DD(9.455,0,"NM","*KEY VARIABLE")
 ;;=
 ;;^DD(9.455,0,"UP")
 ;;=9.4
 ;;^DD(9.455,.01,0)
 ;;=KEY VARIABLE^MF^^0;1^K:X[""""!($A(X)=45) X I $D(X) K:$L(X)>17!($L(X)<1) X
 ;;^DD(9.455,.01,1,0)
 ;;=^.1
 ;;^DD(9.455,.01,1,1,0)
 ;;=9.455^AB
 ;;^DD(9.455,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),1933,"AB",$E(X,1,30),DA)=""
 ;;^DD(9.455,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),1933,"AB",$E(X,1,30),DA)
 ;;^DD(9.455,.01,3)
 ;;=Please enter the name of a MUMPS Variable needed by this Package (1-17 characters).
 ;;^DD(9.455,.01,21,0)
 ;;=^^2^2^2851009^^
 ;;^DD(9.455,.01,21,1,0)
 ;;=The name of a MUMPS variable which the Package would like defined
 ;;^DD(9.455,.01,21,2,0)
 ;;=prior to entry into the routines.
 ;;^DD(9.455,.01,"DT")
 ;;=2850228
 ;;^DD(9.455,.02,0)
 ;;=PURPOSE FOR ERR REPORTS^F^^0;2^K:$L(X)>40!($L(X)<3) X
 ;;^DD(9.455,.02,3)
 ;;=Answer must be 3-40 characters in length.  This will be displayed to indicate the purpose of this variable on error reports
 ;;^DD(9.455,.02,21,0)
 ;;=^^8^8^2920928^
 ;;^DD(9.455,.02,21,1,0)
 ;;=This field is meant to contain a brief description of the purpose or role
 ;;^DD(9.455,.02,21,2,0)
 ;;=of this KEY VARIABLE.  If this variable is present in an error which has
 ;;^DD(9.455,.02,21,3,0)
 ;;=been trapped, and a user selects display of key variables, then this
 ;;^DD(9.455,.02,21,4,0)
 ;;=description will be displayed to aid the user in interpeting the variable
 ;;^DD(9.455,.02,21,5,0)
 ;;=and its value at the time the error occurred.  If this description is not

DIPKI007
DIPKI007 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.455,.02,21,6,0)
 ;;=available, then the variable would not be displayed along with other
 ;;^DD(9.455,.02,21,7,0)
 ;;=annotated key variables.
 ;;^DD(9.455,.02,21,8,0)
 ;;= 
 ;;^DD(9.455,.02,"DT")
 ;;=2920928
 ;;^DD(9.455,1,0)
 ;;=DESCRIPTION^9.456^^1;0
 ;;^DD(9.455,1,21,0)
 ;;=^^2^2^2851008^^
 ;;^DD(9.455,1,21,1,0)
 ;;=This lists information about the MUMPS variable required by this
 ;;^DD(9.455,1,21,2,0)
 ;;=Package.
 ;;^DD(9.456,0)
 ;;=DESCRIPTION SUB-FIELD^NL^.01^1
 ;;^DD(9.456,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(9.456,0,"UP")
 ;;=9.455
 ;;^DD(9.456,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(9.456,.01,21,0)
 ;;=^^2^2^2851008^^
 ;;^DD(9.456,.01,21,1,0)
 ;;=This describes the MUMPS variable which this Package would like
 ;;^DD(9.456,.01,21,2,0)
 ;;=defined prior to entry into the routines.
 ;;^DD(9.456,.01,"DT")
 ;;=2850228
 ;;^DD(9.46,0)
 ;;=*PRINT TEMPLATE SUB-FIELD^NL^2^2
 ;;^DD(9.46,0,"NM","*PRINT TEMPLATE")
 ;;=
 ;;^DD(9.46,0,"UP")
 ;;=9.4
 ;;^DD(9.46,.01,0)
 ;;=PRINT TEMPLATE^MF^^0;1^K:$L(X)>50!($L(X)<2) X
 ;;^DD(9.46,.01,1,0)
 ;;=^.1^^0
 ;;^DD(9.46,.01,3)
 ;;=Please enter the name of a Print Template (2-50 characters).
 ;;^DD(9.46,.01,21,0)
 ;;=^^5^5^2921202^
 ;;^DD(9.46,.01,21,1,0)
 ;;=The name of a Print Template being sent with this Package.
 ;;^DD(9.46,.01,21,2,0)
 ;;=This multiple is used to send non-namespaced templates in an INIT.
 ;;^DD(9.46,.01,21,3,0)
 ;;=Namespaced templates are sent automatically and need not be listed
 ;;^DD(9.46,.01,21,4,0)
 ;;=separately.  Selected Fields for Export and Export templates cannot be
 ;;^DD(9.46,.01,21,5,0)
 ;;=sent; entering their names here will have no effect.
 ;;^DD(9.46,.01,"DT")
 ;;=2821117
 ;;^DD(9.46,2,0)
 ;;=FILE^RP1'^DIC(^0;2^Q
 ;;^DD(9.46,2,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.46,2,21,1,0)
 ;;=The FileMan file for this Print Template.
 ;;^DD(9.46,2,"DT")
 ;;=2821126
 ;;^DD(9.47,0)
 ;;=*INPUT TEMPLATE SUB-FIELD^NL^2^2
 ;;^DD(9.47,0,"ID",2)
 ;;=W "   FILE #"_$P(^(0),U,2)
 ;;^DD(9.47,0,"NM","*INPUT TEMPLATE")
 ;;=
 ;;^DD(9.47,0,"UP")
 ;;=9.4
 ;;^DD(9.47,.01,0)
 ;;=INPUT TEMPLATE^MF^^0;1^K:$L(X)>50!($L(X)<2) X
 ;;^DD(9.47,.01,1,0)
 ;;=^.1^^0
 ;;^DD(9.47,.01,3)
 ;;=Please enter the name of an Input Template (2-50 characters).
 ;;^DD(9.47,.01,21,0)
 ;;=^^4^4^2920513^^^
 ;;^DD(9.47,.01,21,1,0)
 ;;=The name of an Input Template being sent with this Package.
 ;;^DD(9.47,.01,21,2,0)
 ;;=This multiple is used to send non-namespaced templates in an INIT.
 ;;^DD(9.47,.01,21,3,0)
 ;;=Namespaced templates are sent automatically and need not be listed
 ;;^DD(9.47,.01,21,4,0)
 ;;=separately.
 ;;^DD(9.47,.01,"DT")
 ;;=2821117
 ;;^DD(9.47,2,0)
 ;;=FILE^RP1'^DIC(^0;2^Q
 ;;^DD(9.47,2,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.47,2,21,1,0)
 ;;=The name of the FileMan file for this Input Template.
 ;;^DD(9.47,2,"DT")
 ;;=2821126
 ;;^DD(9.48,0)
 ;;=*SORT TEMPLATE SUB-FIELD^NL^2^2
 ;;^DD(9.48,0,"NM","*SORT TEMPLATE")
 ;;=
 ;;^DD(9.48,0,"UP")
 ;;=9.4
 ;;^DD(9.48,.01,0)
 ;;=SORT TEMPLATE^MF^^0;1^K:$L(X)>50!($L(X)<2) X
 ;;^DD(9.48,.01,1,0)
 ;;=^.1^^0
 ;;^DD(9.48,.01,3)
 ;;=Please enter the name of a Sort Template (2-50 characters).
 ;;^DD(9.48,.01,21,0)
 ;;=^^4^4^2920513^^^
 ;;^DD(9.48,.01,21,1,0)
 ;;=The name of a Sort Template being sent with this Package.
 ;;^DD(9.48,.01,21,2,0)
 ;;=This multiple is used to send non-namespaced templates in an INIT.
 ;;^DD(9.48,.01,21,3,0)
 ;;=Namespaced templates are sent automatically and need not be listed
 ;;^DD(9.48,.01,21,4,0)
 ;;=separately.
 ;;^DD(9.48,.01,"DT")
 ;;=2821117
 ;;^DD(9.48,2,0)
 ;;=FILE^RP1'^DIC(^0;2^Q
 ;;^DD(9.48,2,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.48,2,21,1,0)
 ;;=The FileMan file for this Sort Template.
 ;;^DD(9.485,0)
 ;;=*SCREEN TEMPLATE (FORM) SUB-FIELD^^2^2
 ;;^DD(9.485,0,"DT")
 ;;=2910320
 ;;^DD(9.485,0,"NM","*SCREEN TEMPLATE (FORM)")
 ;;=
 ;;^DD(9.485,0,"UP")
 ;;=9.4
 ;;^DD(9.485,.01,0)
 ;;=SCREEN TEMPLATE (FORM)^MF^^0;1^K:$L(X)>50!($L(X)<2) X
 ;;^DD(9.485,.01,1,0)
 ;;=^.1^^0
 ;;^DD(9.485,.01,3)
 ;;=Please enter the name of a Screen Template (Form), (2-50 characters).
 ;;^DD(9.485,.01,21,0)
 ;;=^^2^2^2920513^^^^
 ;;^DD(9.485,.01,21,1,0)
 ;;=The name of a Screen Template (from the FORM file) associated with
 ;;^DD(9.485,.01,21,2,0)
 ;;=this Package.
 ;;^DD(9.485,.01,23,0)
 ;;=^^3^3^2910320^^^^
 ;;^DD(9.485,.01,23,1,0)
 ;;=This list is originally created by the user for building an INIT, and allows
 ;;^DD(9.485,.01,23,2,0)
 ;;=the user to send FORMS on an INIT that are outside the Package namespace.
 ;;^DD(9.485,.01,23,3,0)
 ;;=All BLOCKS associated with the FORMS are also sent automatically.
 ;;^DD(9.485,.01,"DT")
 ;;=2910320
 ;;^DD(9.485,2,0)
 ;;=FILE^RP1'^DIC(^0;2^Q
 ;;^DD(9.485,2,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.485,2,21,1,0)
 ;;=The name of the FileMan file for this Screen Template (FORM).
 ;;^DD(9.485,2,23,0)
 ;;=^^1^1^2910320^
 ;;^DD(9.485,2,23,1,0)
 ;;=This field must match the PRIMARY FILE field on the FORM file.
 ;;^DD(9.485,2,"DT")
 ;;=2910320
 ;;^DD(9.49,0)
 ;;=VERSION SUB-FIELD^NL^1105^10
 ;;^DD(9.49,0,"DT")
 ;;=2940607
 ;;^DD(9.49,0,"ID",1)
 ;;=W:$D(^("0")) "   ",$E($P(^("0"),U,2),4,5)_"-"_$E($P(^("0"),U,2),6,7)_"-"_$E($P(^("0"),U,2),2,3)
 ;;^DD(9.49,0,"IX","B",9.49,.01)
 ;;=
 ;;^DD(9.49,0,"NM","VERSION")
 ;;=
 ;;^DD(9.49,0,"UP")
 ;;=9.4
 ;;^DD(9.49,.01,0)
 ;;=VERSION^FX^^0;1^K:'(X?1.3N.1".".2N.1A.2N)!(X>999)!(X'>0) X
 ;;^DD(9.49,.01,1,0)
 ;;=^.1
 ;;^DD(9.49,.01,1,1,0)
 ;;=9.49^B
 ;;^DD(9.49,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),22,"B",$E(X,1,30),DA)=""
 ;;^DD(9.49,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),22,"B",$E(X,1,30),DA)
 ;;^DD(9.49,.01,3)
 ;;=Please enter the Version Number of this release.  This can be either the old method (1.0, 16.04, etc.) or the new (17T1, 6.0V2, etc.).
 ;;^DD(9.49,.01,21,0)
 ;;=^^2^2^2930415^^^^
 ;;^DD(9.49,.01,21,1,0)
 ;;=The version number of this Package.  This number is updated automatically
 ;;^DD(9.49,.01,21,2,0)
 ;;=when an INIT is built for this package.
 ;;^DD(9.49,.01,"DT")
 ;;=2910322
 ;;^DD(9.49,1,0)
 ;;=DATE DISTRIBUTED^D^^0;2^S %DT="E" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.49,1,21,0)
 ;;=^^2^2^2911209^^^
 ;;^DD(9.49,1,21,1,0)
 ;;=The date this release was distributed.  This field is updated automatically
 ;;^DD(9.49,1,21,2,0)
 ;;=when an INIT is built for this package.
 ;;^DD(9.49,1,"DT")
 ;;=2840227
 ;;^DD(9.49,2,0)
 ;;=DATE INSTALLED AT THIS SITE^D^^0;3^S %DT="ET" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.49,2,21,0)
 ;;=^^2^2^2911209^^^
 ;;^DD(9.49,2,21,1,0)
 ;;=The date this release was installed at this site.  This field is updated

DIPKI008
DIPKI008 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.49,2,21,2,0)
 ;;=automatically when an INIT is installed for this package.
 ;;^DD(9.49,2,"DT")
 ;;=2840302
 ;;^DD(9.49,3,0)
 ;;=INSTALLED BY^P200'^VA(200,^0;4^Q
 ;;^DD(9.49,3,21,0)
 ;;=^^1^1^2940607^
 ;;^DD(9.49,3,21,1,0)
 ;;=This is the person who installed this version at this site.
 ;;^DD(9.49,3,"DT")
 ;;=2940607
 ;;^DD(9.49,41,0)
 ;;=DESCRIPTION OF ENHANCEMENTS^9.54^^1;0
 ;;^DD(9.49,41,21,0)
 ;;=^^2^2^2851008^^
 ;;^DD(9.49,41,21,1,0)
 ;;=This is a description of the enhancements being distributed with this
 ;;^DD(9.49,41,21,2,0)
 ;;=release.
 ;;^DD(9.49,51,0)
 ;;=*RELEASE NOTE^9.491^^R;0
 ;;^DD(9.49,51,21,0)
 ;;=^^2^2^2851009^^^^
 ;;^DD(9.49,51,21,1,0)
 ;;=These are the release notes which go along with this release of the
 ;;^DD(9.49,51,21,2,0)
 ;;=Package.
 ;;^DD(9.49,51,"DT")
 ;;=2940603
 ;;^DD(9.49,61,0)
 ;;=*INSTALLATION NOTES^9.4961^^I;0
 ;;^DD(9.49,61,"DT")
 ;;=2940603
 ;;^DD(9.49,62,0)
 ;;=*SYSTEM REQUIREMENTS^9.4962^^S;0
 ;;^DD(9.49,62,"DT")
 ;;=2940603
 ;;^DD(9.49,63,0)
 ;;=*PROGRAMMER NOTES^9.4963^^P;0
 ;;^DD(9.49,63,"DT")
 ;;=2940603
 ;;^DD(9.49,1105,0)
 ;;=PATCH APPLICATION HISTORY^9.4901^^PAH;0
 ;;^DD(9.4901,0)
 ;;=PATCH APPLICATION HISTORY SUB-FIELD^^1^4
 ;;^DD(9.4901,0,"DT")
 ;;=2940603
 ;;^DD(9.4901,0,"IX","B",9.4901,.01)
 ;;=
 ;;^DD(9.4901,0,"NM","PATCH APPLICATION HISTORY")
 ;;=
 ;;^DD(9.4901,0,"UP")
 ;;=9.49
 ;;^DD(9.4901,.01,0)
 ;;=PATCH APPLICATION HISTORY^MF^^0;1^K:$L(X)>15!($L(X)<8) X
 ;;^DD(9.4901,.01,1,0)
 ;;=^.1
 ;;^DD(9.4901,.01,1,1,0)
 ;;=9.4901^B
 ;;^DD(9.4901,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(2),22,DA(1),"PAH","B",$E(X,1,30),DA)=""
 ;;^DD(9.4901,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(2),22,DA(1),"PAH","B",$E(X,1,30),DA)
 ;;^DD(9.4901,.01,3)
 ;;=Answer must be 8-15 characters in length.
 ;;^DD(9.4901,.01,"DT")
 ;;=2890426
 ;;^DD(9.4901,.02,0)
 ;;=DATE APPLIED^D^^0;2^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(9.4901,.02,"DT")
 ;;=2890426
 ;;^DD(9.4901,.03,0)
 ;;=APPLIED BY^P200'^VA(200,^0;3^Q
 ;;^DD(9.4901,.03,"DT")
 ;;=2890426
 ;;^DD(9.4901,1,0)
 ;;=DESCRIPTION^9.49011^^1;0
 ;;^DD(9.4901,1,21,0)
 ;;=^^1^1^2940603^
 ;;^DD(9.4901,1,21,1,0)
 ;;=This is a description of the patch being distributed with this release.
 ;;^DD(9.49011,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(9.49011,0,"DT")
 ;;=2940603
 ;;^DD(9.49011,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(9.49011,0,"UP")
 ;;=9.4901
 ;;^DD(9.49011,.01,0)
 ;;=DESCRIPTION^W^^0;1^Q
 ;;^DD(9.49011,.01,"DT")
 ;;=2940603
 ;;^DD(9.491,0)
 ;;=*RELEASE NOTE SUB-FIELD^NL^2^4
 ;;^DD(9.491,0,"NM","*RELEASE NOTE")
 ;;=
 ;;^DD(9.491,0,"UP")
 ;;=9.49
 ;;^DD(9.491,.01,0)
 ;;=RELEASE NOTE^MF^^0;1^K:$L(X)>80!($L(X)<3) X
 ;;^DD(9.491,.01,3)
 ;;=Please enter a description (3-80 characters).
 ;;^DD(9.491,.01,21,0)
 ;;=^^1^1^2851008^^
 ;;^DD(9.491,.01,21,1,0)
 ;;=This is a description of a particular enhancement.
 ;;^DD(9.491,.01,"DT")
 ;;=2850123
 ;;^DD(9.491,.02,0)
 ;;=WHERE CHANGE OCCURRED^F^^0;2^K:$L(X)>80!($L(X)<3) X
 ;;^DD(9.491,.02,3)
 ;;=Routine(s), Field Name(s), and/or Data that has been changed (3-80 characters).
 ;;^DD(9.491,.02,21,0)
 ;;=^^1^1^2851009^^^^
 ;;^DD(9.491,.02,21,1,0)
 ;;=Routine, Field Name, or Data that has been changed.
 ;;^DD(9.491,.02,"DT")
 ;;=2850123
 ;;^DD(9.491,1,0)
 ;;=DESCRIPTION OF CHANGE^9.492^^1;0
 ;;^DD(9.491,1,21,0)
 ;;=^^1^1^2851008^^
 ;;^DD(9.491,1,21,1,0)
 ;;=This is a description of the improvements.
 ;;^DD(9.491,2,0)
 ;;=UPDATE^9.493^^2;0
 ;;^DD(9.491,2,21,0)
 ;;=^^2^2^2851009^^
 ;;^DD(9.491,2,21,1,0)
 ;;=Comments on the updates which have been made to this release of the
 ;;^DD(9.491,2,21,2,0)
 ;;=Package.
 ;;^DD(9.492,0)
 ;;=DESCRIPTION OF CHANGE SUB-FIELD^NL^.01^1
 ;;^DD(9.492,0,"NM","DESCRIPTION OF CHANGE")
 ;;=
 ;;^DD(9.492,0,"UP")
 ;;=9.491
 ;;^DD(9.492,.01,0)
 ;;=DESCRIPTION OF CHANGE^W^^0;1^Q
 ;;^DD(9.492,.01,21,0)
 ;;=^^1^1^2851008^^^^
 ;;^DD(9.492,.01,21,1,0)
 ;;=This is a description of the improvement.
 ;;^DD(9.492,.01,"DT")
 ;;=2850123
 ;;^DD(9.493,0)
 ;;=UPDATE SUB-FIELD^NL^.01^1
 ;;^DD(9.493,0,"NM","UPDATE")
 ;;=
 ;;^DD(9.493,0,"UP")
 ;;=9.491
 ;;^DD(9.493,.01,0)
 ;;=UPDATE^W^^0;1^Q
 ;;^DD(9.493,.01,21,0)
 ;;=^^1^1^2851008^
 ;;^DD(9.493,.01,21,1,0)
 ;;=This is a description of the update to the Package.
 ;;^DD(9.493,.01,"DT")
 ;;=2850123
 ;;^DD(9.495,0)
 ;;=*MENU SUB-FIELD^^.02^2
 ;;^DD(9.495,0,"DT")
 ;;=2890928
 ;;^DD(9.495,0,"IX","B",9.495,.01)
 ;;=
 ;;^DD(9.495,0,"NM","*MENU")
 ;;=
 ;;^DD(9.495,0,"UP")
 ;;=9.4
 ;;^DD(9.495,.01,0)
 ;;=MENU^MF^^0;1^K:$L(X)>30!($L(X)<1) X
 ;;^DD(9.495,.01,1,0)
 ;;=^.1
 ;;^DD(9.495,.01,1,1,0)
 ;;=9.495^B
 ;;^DD(9.495,.01,1,1,1)
 ;;=S ^DIC(9.4,DA(1),"M","B",$E(X,1,30),DA)=""
 ;;^DD(9.495,.01,1,1,2)
 ;;=K ^DIC(9.4,DA(1),"M","B",$E(X,1,30),DA)
 ;;^DD(9.495,.01,3)
 ;;=This is the name of a menu-type option outside this namespace.
 ;;^DD(9.495,.01,4)
 ;;=N DO,DIC S DIC="^DIC(19,",DIC(0)="QE",D="B",DIC("S")="I $P(^(0),U,4)=""M""" D DQ^DICQ
 ;;^DD(9.495,.01,21,0)
 ;;=^^4^4^2920513^^^^
 ;;^DD(9.495,.01,21,1,0)
 ;;=This is the name of an option NOT in this namespace.  This option
 ;;^DD(9.495,.01,21,2,0)
 ;;=must be a menu, but it may not exist on this system.  You are
 ;;^DD(9.495,.01,21,3,0)
 ;;=entering this menu name because you want to add an option in this
 ;;^DD(9.495,.01,21,4,0)
 ;;=package to a menu that is in another.
 ;;^DD(9.495,.01,"DT")
 ;;=2890928
 ;;^DD(9.495,.02,0)
 ;;=OPTION^R*P19'^DIC(19,^0;2^S DIC("S")="I $P($P(^DIC(19,Y,0),U),$P(^DIC(9.4,DA(1),0),U,2))=""""" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;^DD(9.495,.02,12)
 ;;=Select an option in this namespace.
 ;;^DD(9.495,.02,12.1)
 ;;=S DIC("S")="I $P($P(^DIC(19,Y,0),U),$P(^DIC(9.4,DA(1),0),U,2))="""""
 ;;^DD(9.495,.02,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.495,.02,21,1,0)
 ;;=This is an option which you wish to add to a menu in another namespace.
 ;;^DD(9.495,.02,"DT")
 ;;=2890928
 ;;^DD(9.4961,0)
 ;;=*INSTALLATION NOTES SUB-FIELD^^.01^1
 ;;^DD(9.4961,0,"NM","*INSTALLATION NOTES")
 ;;=
 ;;^DD(9.4961,0,"UP")
 ;;=9.49
 ;;^DD(9.4961,.01,0)
 ;;=INSTALLATION NOTES^W^^0;1^Q
 ;;^DD(9.4961,.01,"DT")
 ;;=2890426
 ;;^DD(9.4962,0)
 ;;=*SYSTEM REQUIREMENTS SUB-FIELD^^.01^1
 ;;^DD(9.4962,0,"NM","*SYSTEM REQUIREMENTS")
 ;;=
 ;;^DD(9.4962,0,"UP")
 ;;=9.49
 ;;^DD(9.4962,.01,0)
 ;;=SYSTEM REQUIREMENTS^W^^0;1^Q
 ;;^DD(9.4962,.01,"DT")
 ;;=2890426
 ;;^DD(9.4963,0)
 ;;=*PROGRAMMER NOTES SUB-FIELD^^.01^1
 ;;^DD(9.4963,0,"NM","*PROGRAMMER NOTES")
 ;;=
 ;;^DD(9.4963,0,"UP")
 ;;=9.49
 ;;^DD(9.4963,.01,0)
 ;;=PROGRAMMER NOTES^W^^0;1^Q
 ;;^DD(9.4963,.01,"DT")
 ;;=2890426
 ;;^DD(9.54,0)
 ;;=DESCRIPTION OF ENHANCEMENTS SUB-FIELD^NL^.01^1

DIPKI009
DIPKI009 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.54,0,"NM","DESCRIPTION OF ENHANCEMENTS")
 ;;=
 ;;^DD(9.54,0,"UP")
 ;;=9.49
 ;;^DD(9.54,.01,0)
 ;;=DESCRIPTION OF ENHANCEMENTS^W^^0;1^Q
 ;;^DD(9.54,.01,21,0)
 ;;=^^2^2^2851008^^^^
 ;;^DD(9.54,.01,21,1,0)
 ;;=This is a description of the enhancements which are being distributed
 ;;^DD(9.54,.01,21,2,0)
 ;;=with this release.
 ;;^DD(9.54,.01,"DT")
 ;;=2840404

DIPKI00A
DIPKI00A ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I DSEC F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(9.4,0,"DD")
 ;;=#
 ;;^DIC(9.4,0,"DEL")
 ;;=#
 ;;^DIC(9.4,0,"LAYGO")
 ;;=#
 ;;^DIC(9.4,0,"WR")
 ;;=#

DIPKI00B
DIPKI00B ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"SBF",9.4,9.4)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.402)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.404)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.409)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.41)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.414)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.415007)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.42)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.43)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.431)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.432)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.44)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.444)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.45)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.454)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.455)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.456)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.46)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.47)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.48)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.485)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.49)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4901)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.49011)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.491)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.492)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.493)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.495)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4961)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4962)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4963)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.54)
 ;;=

DIPKI00C
DIPKI00C ; ; 22-DEC-1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(9.4)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(9.495,.01,3)
 ;;=This is the name of a menu-type option outside this namespace.
 ;;^DD(9.495,.01,4)
 ;;=N DO,DIC S DIC="^DIC(19,",DIC(0)="QE",D="B",DIC("S")="I $P(^(0),U,4)=""M""" D DQ^DICQ
 ;;^DD(9.495,.01,21,0)
 ;;=^^4^4^2920513^^^^
 ;;^DD(9.495,.01,21,1,0)
 ;;=This is the name of an option NOT in this namespace.  This option
 ;;^DD(9.495,.01,21,2,0)
 ;;=must be a menu, but it may not exist on this system.  You are
 ;;^DD(9.495,.01,21,3,0)
 ;;=entering this menu name because you want to add an option in this
 ;;^DD(9.495,.01,21,4,0)
 ;;=package to a menu that is in another.
 ;;^DD(9.495,.01,"DT")
 ;;=2890928
 ;;^DD(9.495,.02,0)
 ;;=OPTION^R*P19'^DIC(19,^0;2^S DIC("S")="I $P($P(^DIC(19,Y,0),U),$P(^DIC(9.4,DA(1),0),U,2))=""""" D ^DIC K DIC S DIC=DIE,X=+Y K:Y<0 X
 ;;^DD(9.495,.02,12)
 ;;=Select an option in this namespace.
 ;;^DD(9.495,.02,12.1)
 ;;=S DIC("S")="I $P($P(^DIC(19,Y,0),U),$P(^DIC(9.4,DA(1),0),U,2))="""""
 ;;^DD(9.495,.02,21,0)
 ;;=^^1^1^2920513^^
 ;;^DD(9.495,.02,21,1,0)
 ;;=This is an option which you wish to add to a menu in another namespace.
 ;;^DD(9.495,.02,"DT")
 ;;=2890928
 ;;^DD(9.4961,0)
 ;;=*INSTALLATION NOTES SUB-FIELD^^.01^1
 ;;^DD(9.4961,0,"NM","*INSTALLATION NOTES")
 ;;=
 ;;^DD(9.4961,0,"UP")
 ;;=9.49
 ;;^DD(9.4961,.01,0)
 ;;=INSTALLATION NOTES^W^^0;1^Q
 ;;^DD(9.4961,.01,"DT")
 ;;=2890426
 ;;^DD(9.4962,0)
 ;;=*SYSTEM REQUIREMENTS SUB-FIELD^^.01^1
 ;;^DD(9.4962,0,"NM","*SYSTEM REQUIREMENTS")
 ;;=
 ;;^DD(9.4962,0,"UP")
 ;;=9.49
 ;;^DD(9.4962,.01,0)
 ;;=SYSTEM REQUIREMENTS^W^^0;1^Q
 ;;^DD(9.4962,.01,"DT")
 ;;=2890426
 ;;^DD(9.4963,0)
 ;;=*PROGRAMMER NOTES SUB-FIELD^^.01^1
 ;;^DD(9.4963,0,"NM","*PROGRAMMER NOTES")
 ;;=
 ;;^DD(9.4963,0,"UP")
 ;;=9.49
 ;;^DD(9.4963,.01,0)
 ;;=PROGRAMMER NOTES^W^^0;1^Q
 ;;^DD(9.4963,.01,"DT")
 ;;=2890426
 ;;^DD(9.54,0)
 ;;=DESCRIPTION OF ENHANCEMENTS SUB-FIELD^NL^.01^1
 ;;^DD(9.54,0,"NM","DESCRIPTION OF ENHANCEMENTS")
 ;;=
 ;;^DD(9.54,0,"UP")
 ;;=9.49
 ;;^DD(9.54,.01,0)
 ;;=DESCRIPTION OF ENHANCEMENTS^W^^0;1^Q
 ;;^DD(9.54,.01,21,0)
 ;;=^^2^2^2851008^^^^
 ;;^DD(9.54,.01,21,1,0)
 ;;=This is a description of the enhancements which are being distributed
 ;;^DD(9.54,.01,21,2,0)
 ;;=with this release.
 ;;^DD(9.54,.01,"DT")
 ;;=2840404

DIPKI00D
DIPKI00D ; ; 22-DEC-1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I DSEC F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(9.4,0,"DD")
 ;;=#
 ;;^DIC(9.4,0,"DEL")
 ;;=#
 ;;^DIC(9.4,0,"LAYGO")
 ;;=#
 ;;^DIC(9.4,0,"WR")
 ;;=#

DIPKI00E
DIPKI00E ; ; 22-DEC-1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,99) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"PKG",1,0)
 ;;=DIPK (PACKAGE FILE INIT)^DIPK^FileMan Init of Package File
 ;;^UTILITY(U,$J,"PKG",1,1,0)
 ;;=^^2^2^2930702^^^
 ;;^UTILITY(U,$J,"PKG",1,1,1,0)
 ;;=Init of Package file to be used by VA FileMan Site that wish to export
 ;;^UTILITY(U,$J,"PKG",1,1,2,0)
 ;;=software using DIFROM.
 ;;^UTILITY(U,$J,"PKG",1,4,0)
 ;;=^9.44PA^1^1
 ;;^UTILITY(U,$J,"PKG",1,4,1,0)
 ;;=9.4
 ;;^UTILITY(U,$J,"PKG",1,4,1,222)
 ;;=y^y^^n^^^n
 ;;^UTILITY(U,$J,"PKG",1,4,"B",9.4,1)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,5)
 ;;=SAN FRANCISCO
 ;;^UTILITY(U,$J,"PKG",1,7)
 ;;=SAN FRANCISCO^^I
 ;;^UTILITY(U,$J,"PKG",1,11)
 ;;=9.4^9.4
 ;;^UTILITY(U,$J,"PKG",1,22,0)
 ;;=^9.49I^21^12
 ;;^UTILITY(U,$J,"PKG",1,22,6.5,0)
 ;;=6.5^2900607
 ;;^UTILITY(U,$J,"PKG",1,22,17.78,0)
 ;;=17.78^2900731^2901105
 ;;^UTILITY(U,$J,"PKG",1,22,18.3,0)
 ;;=18.30^2901205
 ;;^UTILITY(U,$J,"PKG",1,22,18.4,0)
 ;;=18.33^2910324^2910801
 ;;^UTILITY(U,$J,"PKG",1,22,18.5,0)
 ;;=19.0T6^2910827^2911210
 ;;^UTILITY(U,$J,"PKG",1,22,18.6,0)
 ;;=19.0V9^2911212^2911217
 ;;^UTILITY(U,$J,"PKG",1,22,18.7,0)
 ;;=19.0V10^2920420^2920420
 ;;^UTILITY(U,$J,"PKG",1,22,18.8,0)
 ;;=19.0^2920714^2920824
 ;;^UTILITY(U,$J,"PKG",1,22,18.9,0)
 ;;=20.0^2930702^2940912
 ;;^UTILITY(U,$J,"PKG",1,22,19,0)
 ;;=21.0V01^2940920
 ;;^UTILITY(U,$J,"PKG",1,22,20,0)
 ;;=21.0V02^2941025
 ;;^UTILITY(U,$J,"PKG",1,22,21,0)
 ;;=21.0^2941222
 ;;^UTILITY(U,$J,"PKG",1,22,"B",6.5,6.5)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B",17.78,17.78)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B",18.33,18.4)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","18.30",18.3)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","19.0",18.8)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","19.0T6",18.5)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","19.0V10",18.7)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","19.0V9",18.6)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","20.0",18.9)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","21.0",21)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","21.0V01",19)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,22,"B","21.0V02",20)
 ;;=
 ;;^UTILITY(U,$J,"PKG",1,"DEV")
 ;;=TKW/SF
 ;;^UTILITY(U,$J,"PKG",1,"DIBT",0)
 ;;=^9.48^^0
 ;;^UTILITY(U,$J,"PKG",1,"DIPT",0)
 ;;=^9.46^^0
 ;;^UTILITY(U,$J,"PKG",1,"INI")
 ;;=^
 ;;^UTILITY(U,$J,"PKG",1,"INIT")
 ;;=^
 ;;^UTILITY(U,$J,"SBF",9.4,9.4)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.402)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.404)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.409)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.41)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.414)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.42)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.43)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.431)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.432)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.44)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.444)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.45)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.454)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.455)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.456)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.46)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.47)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.48)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.485)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.49)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4901)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.49011)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.491)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.492)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.493)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.495)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4961)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4962)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.4963)
 ;;=
 ;;^UTILITY(U,$J,"SBF",9.4,9.54)
 ;;=

DIPKINI1
DIPKINI1 ; ;10:28 AM  30 Mar 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; LOADS AND INDEXES DD'S
 ;
 K DIF,DIK,D,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DFR,DTN,DIX,DZ D DT^DICRW S %=1,U="^",DSEC=1
 S NO=$P("I 0^I $D(@X)#2,X[U",U,%) I %<1 K DIFQ Q
ASK ;I %=1,$D(DIFQ(0)) W !,"SHALL I WRITE OVER FILE SECURITY CODES" S %=2 D YN^DICN S DSEC=%=1 I %<1 K DIFQ Q
 ;Q:'$D(DIFQ)  S %=2 W !!,"ARE YOU SURE EVERYTHING'S OK" D YN^DICN I %-1 K DIFQ Q
 I $D(DIFKEP) F DIDIU=0:0 S DIDIU=$O(DIFKEP(DIDIU)) Q:DIDIU'>0  S DIU=DIDIU,DIU(0)=DIFKEP(DIDIU) D EN^DIU2
 D DT^DICRW K ^UTILITY(U,$J),^UTILITY("DIK",$J) D WAIT^DICD
 S DN="^DIPKI" F R=1:1:11 D @(DN_$$B36(R)) W "."
 F  S D=$O(^UTILITY(U,$J,"SBF","")) Q:D'>0  K:'DIFQ(D) ^(D) S D=$O(^(D,"")) I D>0  K ^(D) D IX
DATA W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0
 I DIFQR(D) S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=DIFQR(D)'=2 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 Q:'$D(^(D0,0))  S Z=^(0) D I^DITR
 K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA
 ;
W S Y=$P($T(@X),";",2) W !,"NOTE: This package also contains "_Y_"S",! Q:'$D(DIFQ(0))
 S %=1 Q
 S %=1 W ?6,"SHALL I WRITE OVER EXISTING "_Y_"S OF THE SAME NAME" D YN^DICN I '% W !?6,"Answer YES to replace the current "_Y_"S with the incoming ones." G W
 S:%=2 DIFQ(X)=0 K:%<0 DIFQ
 Q
 ;
OPT ;OPTION
RTN ;ROUTINE DOCUMENTATION NOTE
FUN ;FUNCTION
BUL ;BULLETIN
KEY ;SECURITY KEY
HEL ;HELP FRAME
DIP ;PRINT TEMPLATE
DIE ;INPUT TEMPLATE
DIB ;SORT TEMPLATE
DIS ;FORM
REM ;REMOTE PROCEDURE
 ;
SBF ;FILE AND SUB FILE NUMBERS
IX W "." S DIK="A" F %=0:0 S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," G IXALL^DIK
 Q
B36(X) Q $$N(X\(36*36)#36+1)_$$N(X\36#36+1)_$$N(X#36+1)
N(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

DIPKINI2
DIPKINI2 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J),DIC S DIDUZ=0 S:$D(DUZ)#2 DIDUZ=DUZ S DUZ=.5
 I $D(^DIC(9.2,0))#2,^(0)?1"HEL".E S (DIC,DLAYGO)=9.2,N="HEL",DIC(0)="LX" G ADD
 Q
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R'>0  S X=$P(^(R,0),U,1) W "." K DA D ^DIC I Y>0,'$D(DIFQ(N))!$P(Y,U,3) S ^UTILITY("DIFROM",$J,N,X)=+Y K ^DIC(9.2,+Y,1),^(2),^(3),^(10) S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y D %XY^%RCR
 S DIK=DIC
HELP S R=$O(^UTILITY("DIFROM",$J,N,R)) Q:R=""  W !,"'"_R_"' Help Frame filed." S DA=^(R)
 F X=0:0 S X=$O(^DIC(9.2,DA,2,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$P(I,U,2) S:Y]"" Y=$O(^DIC(9.2,"B",Y,0)) S ^(0)=$P(^DIC(9.2,DA,2,X,0),U,1)_U_$S(Y>0:Y,1:"")_U_$P(^(0),U,3,99)
 S I=0 F X=0:0 S X=$O(^DIC(9.2,DA,10,X)) Q:'X  I $D(^(X,0)) S Y=$P(^(0),U),Y=$S(Y]"":$O(^MAG("B",Y,0)),1:0) S:Y $P(^DIC(9.2,DA,10,X,0),U)=Y,I=I+1,%=X I 'Y K ^DIC(9.2,DA,10,X,0)
 I I S $P(^DIC(9.2,DA,10,0),U,3,4)=%_U_I
IX D IX1^DIK G HELP
 ;
U I $D(DIRUT) S DIFQ=1
 W ! Q
REP S DIR(0)="Y",DIR("A")="Shall I change the NAME of the file to "_DIF
 S DIR("??")="^D REP^DIFROMH1",DIR("B")="NO" D ^DIR G U:$D(DIRUT)
 I Y S DIE=1,DIFQ=0,DA=N,DR=".01////"_DIF D ^DIE Q
 S DIR("A")="Shall I replace your file with mine"
 S DIR("??")="^D AG^DIFROMH1" D ^DIR G U:$D(DIRUT)!'Y
 S DIU(0)="E",DIR("A")="Do you want to keep the Data"
 S DIR("??")="^D CHG^DIFROMH1" D ^DIR G U:$D(DIRUT)
 S:'Y DIU(0)=DIU(0)_"D"
 S DIR("A")="Do you want to keep the Templates"
 S DIR("??")="^D TEMP^DIFROMH1" D ^DIR G U:$D(DIRUT) S:'Y DIU(0)=DIU(0)_"T"
 S DIFQ(N)=1,DIFKEP(N)=DIU(0) W !?15," (",DIF,") " Q

DIPKINI3
DIPKINI3 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J) S DIC(0)="LX",(DIC,DLAYGO)=3.6,N="BUL" D ADD:$D(^XMB(3.6,0))
 S X=0 F R=0:0 S X=$O(^UTILITY("DIFROM",$J,N,X)) Q:X=""  W !,"'",X,"' BULLETIN FILED -- Remember to add mail groups for new bulletins."
 I $D(^DIC(9.4,0))#2,^(0)?1"PACK".E S N="PKG",(DIC,DLAYGO)=9.4 D ADD
 G NP:'$D(DA) S %=+$O(^DIC(9.4,DA,22,"B",DIFROM,0)) I $D(^DIC(9.4,DA,22,%,0)) S $P(^(0),U,3)=DT
 I $D(^DIC(9.4,DA,0))#2 S %=$P(^(0),U,4) I %]"" S %=$O(^DIC(9.2,"B",%,0)) S:%]"" $P(^DIC(9.4,DA,0),U,4)=%
OR I $D(^ORD(100.99))&$O(^UTILITY(U,$J,"OR","")) D EN^DIPKINI4
NP K DIC,^UTILITY("DIFROM",$J) S DIC(0)="LX" I $D(^DIC(19,0))#2,^(0)?1"OPTION".E S (DIC,DLAYGO)=19,N="OPT" D ADD,OP
 I $D(^DIC(19.1,0))#2,($P(^(0),U)?1"SECUR".E)!($P(^(0),U)="KEY") S (DIC,DLAYGO)=19.1,N="KEY" D ADD K ^UTILITY("DIFROM",$J)
 I $D(^DIC(9.8,0))#2,^(0)?1"ROUTINE^".E S (DIC,DLAYGO)=9.8,N="RTN" D ADD
 S DIC=.5,DLAYGO=0,N="FUN" D ADD
 I $P($G(^DIC(8994,0)),U)="REMOTE PROCEDURE" S (DIC,DLAYGO)=8994,N="REM" D ADD
 S DIC("S")="I $P(^(0),U,4)=DIFL" F N="DIPT","DIBT","DIE" S DIC=U_N_"(" D ADD
 K DIC("S") S N="DIST(.404,",DIC=U_N,DLAYGO=.404 D ADD
 S DIC("S")="I $P(^(0),U,8)=DIFL",N="DIST(.403,",DIC=U_N,DLAYGO=.403 D ADD
 K ^UTILITY(U,$J),DIC,DLAYGO F DIFR="DIE","DIPT" D DIEZ
 K ^UTILITY("DIFROM",$J) Q
DIEZ I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 E  S DISYS=^DD("OS")
 Q:'$D(^DD("OS",DISYS,"ZS"))
 S DIFR1=""
DZ1 S DIFR1=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1)) Q:DIFR1=""
 F DIFR2=0:0 S DIFR2=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  S Y=DIFR2 I $D(@(U_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD"),DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 G DZ1
 ;
OP S R=$O(^UTILITY("DIFROM",$J,N,R)) I R="" K ^UTILITY("DIFROM",$J) G Q
 W !,"'"_R_"' Option Filed" S DA=+^UTILITY("DIFROM",$J,N,R) G:$P(^(R),U,2,3)="XUCORE^"!($P(^(R),U,2,3)="XUCOMMAND^") OP
 I $D(^DIC(19,DA,220)) S %=$P(^(220),U) S:%]"" %=$O(^XMB(3.6,"B",%,0)) S $P(^DIC(19,DA,220),U)=%,%=$P(^(220),U,3) S:%]"" %=$O(^XMB(3.8,"B",%,0)) S $P(^DIC(19,DA,220),U,3)=%
 S %=$P(^DIC(19,DA,0),U,12) S:%]"" %=$O(^DIC(9.4,"B",%,0))
 S $P(^DIC(19,DA,0),U,12)=%,%=$P(^(0),U,7),(DZ,DIX)=0
 D:$D(^DIC(19,DA,10,"B")) KAD(DA) S:%]"" %=$O(^DIC(9.2,"B",%,0)) S $P(^DIC(19,DA,0),U,7)=%,%=$P(^(0),U,4),%="MOQXL"[% K ^(10,"B"),^("C")
 F X=0:0 S X=$O(^DIC(19,DA,10,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$S($D(^(U)):^(U),1:"") K ^DIC(19,DA,10,X) I Y]"",% S D=$O(^DIC(19,"B",Y,0)) I D S ^DIC(19,DA,10,X,0)=D_U_$P(I,U,2,9),DZ=DZ+1,DIX=X
 S:% ^DIC(19,DA,10,0)="^19.01PI^"_DIX_U_DZ D IX1^DIK G OP
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R=""  S X=$P(^(R,0),U),DIFL=$S(N="DIST(.403,":$P(^(0),U,8),N="DIST(.404,":$P(^(0),U,2),1:$P(^(0),U,4)) W "." K DA D ^DIC I Y>0,'$D(DIFQ($E(N,1,3)))!$P(Y,U,3) S Y=Y_U D A
Q Q
A I N="BUL" K % S %(0)=$G(@(DIC_"+Y,2,0)")) F %=0:0 S %=$O(@(DIC_"+Y,2,%)")) Q:'%  S %(%)=$G(^(%,0))
 K:N'="KEY"&(N'="OPT") @(DIC_"+Y)") S ^UTILITY("DIFROM",$J,N,X)=Y S:$E(N,1,2)="DI" ^(X,+Y)="" S:N="PKG" DIFROM(0)=+Y Q:$P(Y,U,2,3)="XUCORE^"!($P(Y,U,2,3)="XUCOMMAND^")
 I N="BUL",%(0)]"" S @(DIC_"+Y,2,0)")=%(0) F %=0:0 S %=$O(%(%)) Q:'%  S @(DIC_"+Y,2,%,0)")=%(%)
 I $E(N,1,2)="DI",('DIFL)!('$D(^DD(+DIFL))) D
 .W !,"**WARNING--"_$S(N="DIE":"INPUT",N="DIPT":"PRINT",N="DIBT":"SORT",1:"FORM or BLOCK")_$S(N'["DIST":" template ",1:" ")_$P(Y,U,2)_" has been installed,",!,"but associated file "_DIFL_" is not on your system!"
 .Q
 I N="OPT" S:$P(^DIC(19,+Y,0),U,6)]"" DIOPT=$P(^(0),U,6) I $O(^UTILITY(U,$J,N,R,1,0)) K ^DIC(19,+Y,1)
 I N="DIST(.403," D BLK
 S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y,DIK=DIC D %XY^%RCR
 D IX1^DIK:N'="OPT" I N="OPT",$D(DIOPT) S:$P(^DIC(19,DA,0),U,6)="" $P(^(0),U,6)=DIOPT K DIOPT
 I N="DIST(.403," D
 .N DIFRVAL S DIFRVAL=$$VAL^DIFROMSS(.403,DA)
 .I DIFRVAL W !,"Compiling form: ",$P(^DIST(.403,DA,0),U) D EN^DDSZ(DA) Q
 .W !,"ERROR: Form: ",$P(^DIST(.403,DA,0),U)," cannot be compiled"
 .Q
 Q
BLK F J=0:0 S J=$O(^UTILITY(U,$J,N,R,40,J)) Q:'J  I $D(^(J,0)) S %=$P(^(0),U,2) S:%]"" %=$O(^DIST(.404,"B",%,0)) S:% $P(^UTILITY(U,$J,N,R,40,J,0),U,2)=% D B1
 K A0,A1,A2,J,L Q
B1 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,40,L)) Q:'L  S A0=$G(^(L,0)),%=$P(A0,U) I %]"" S %=$O(^DIST(.404,"B",%,0)) I % S $P(A0,U)=%,^UTILITY(U,$J,N,R,40,J,"BLK",%,0)=A0 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,40,L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,"BLK",%,X)=^(X)
 .Q
 S A0=$G(^UTILITY(U,$J,N,R,40,J,40,0)) Q:A0=""  K ^UTILITY(U,$J,N,R,40,J,40) S (A1,A2)=0
 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L)) Q:'L  S ^UTILITY(U,$J,N,R,40,J,40,L,0)=^(L,0),A1=L,A2=A2+1 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,40,L,X)=^(X)
 .Q
 S $P(A0,U,3,4)=A1_U_A2,^UTILITY(U,$J,N,R,40,J,40,0)=A0 K ^UTILITY(U,$J,N,R,40,J,"BLK")
 Q
KAD(D0) N D1,X
 S X=0 F  S X=$O(^DIC(19,D0,10,"B",X)) Q:X'>0  S D1=0 F  S D1=$O(^DIC(19,D0,10,"B",X,D1)) Q:D1'>0  K ^DIC(19,"AD",X,D0,D1)
 Q

DIPKINI4
DIPKINI4 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
EN S DA(1)=1,DIK="^ORD(100.99,1,5," I $D(^ORD(100.99,1,5,DA)) D ^DIK
 S %X="^UTILITY(U,$J,""OR"","_$O(^UTILITY(U,$J,"OR",""))_",",%Y=DIK_DA_","
 S:'$D(^ORD(100.99,1,5,0)) ^(0)="^100.995P^^" S $P(^(0),U,3,4)=DA_U_($P(^(0),U,4)+1)
 D %XY^%RCR S $P(^ORD(100.99,1,5,DA,0),U)=DA,%=$P(^(0),U,4)
 I %]"" S %=$O(^ORD(100.98,"B",%,0)) I %>0 S $P(^ORD(100.99,1,5,DA,0),U,4)=%
 D OR
 S DA(1)=1 D IX1^DIK
 Q
OR S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,1,N)) Q:'N  S X=$P(^(N,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,0)=% S X=N,I=I+1,(R,J)=0,Y="" D OR1
 S:I $P(^ORD(100.99,1,5,DA,1,0),U,3,4)=X_U_I S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,5,N)) Q:'N  S X=$P(^(N,0),U,3) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% $P(^ORD(100.99,1,5,DA,5,N,0),U,3)=% S X=N,I=I+1
 S:I $P(^ORD(100.99,1,5,DA,5,0),U,3,4)=X_U_I K N,R,X,Y,I,J
 Q
OR1 N X F  S R=$O(^ORD(100.99,1,5,DA,1,N,1,R)) Q:'R  S X=$P(^(R,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,1,R,0)=% S Y=R,J=J+1
 S:J $P(^ORD(100.99,1,5,DA,1,N,1,0),U,3,4)=Y_U_J
 Q
ADDP N I,J,N,R,DA,DLAYGO,DO S %=""
 S DIC="^ORD(101,",DIC(0)="LX",DLAYGO=101 D FILE^DICN K DIC Q:Y=-1  S %=+Y Q

DIPKINI5
DIPKINI5 ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DIF",$J) S DIFRDIFI=1 F I=1:1:2 S ^UTILITY("DIF",$J,DIFRDIFI)=$T(IXF+I),DIFRDIFI=DIFRDIFI+1
 Q
IXF ;;DIPK (PACKAGE FILE INIT)^DIPK
 ;;9.4I;PACKAGE;^DIC(9.4,;0;y;y;;n;;;n
 ;;

DIPKINIS
DIPKINIS ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PAC(PKG,VER) ; called from package init (DIFROM7 created this routine)
 ; PKG = $T(IXF) of the INIT routine.
 ; VER is an array that is contained in DIFROM from the INIT routine
 ;
 N %,%I,%H,DATE,DIFROM,NOW,PACKAGE,RUN,SERVER,SITE,START,X,XMDUZ,XMSUB,XMTEXT,XMY,Y K ^TMP("DIPKINIS",$J)
 ;
 ; Site tracking updates only occur if run in a VA production primary domain
 ; account.
 I $G(^XMB("NETNAME"))'[".VA.GOV" Q
 Q:'$D(^%ZOSF("UCI"))  Q:'$D(^%ZOSF("PROD"))
 X ^%ZOSF("UCI") I Y'=^%ZOSF("PROD") Q
 ;
 S SERVER="S.A5CSTS@FORUM.VA.GOV"
 S PACKAGE=$P($P(PKG,";",3),U)
 S SITE=$G(^XMB("NETNAME"))
 S START=$P($G(^DIC(9.4,VER(0),"PRE")),U,2) I '$L(START) S START="Unknown"
 D  ; check if ok to use kernel functions
 .S X="XLFDT" X ^%ZOSF("TEST") I $T D  Q
 ..S NOW=$$HTFM^XLFDT($H)
 ..S RUN="Unknown" I START S RUN=$$FMDIFF^XLFDT(NOW,START,3)
 ..S START=$$FMTE^XLFDT(START)
 ..S DATE=NOW\1
 ..S NOW=$$FMTE^XLFDT(NOW)
 .D NOW^%DTC S NOW=%,DATE=X
 .S RUN="" ; don't bother to compute
 .S Y=START D DD^%DT S START=Y
 .S Y=NOW D DD^%DT S NOW=Y
 ;
 ; Message for server
 S ^TMP("DIPKINIS",$J,1,0)="PACKAGE INSTALL"
 S ^TMP("DIPKINIS",$J,2,0)="SITE: "_SITE
 S ^TMP("DIPKINIS",$J,3,0)="PACKAGE: "_PACKAGE
 S ^TMP("DIPKINIS",$J,4,0)="VERSION: "_VER
 S ^TMP("DIPKINIS",$J,5,0)="Start time: "_START
 S ^TMP("DIPKINIS",$J,6,0)="Completion time: "_NOW
 S ^TMP("DIPKINIS",$J,7,0)="Run time: "_RUN
 S ^TMP("DIPKINIS",$J,8,0)="DATE: "_DATE
 ;
 ; Data is sent to server on FORUM - S.A5CSTS
 S XMY(SERVER)="",XMDUZ=.5,XMTEXT="^TMP(""DIPKINIS"",$J,",XMSUB=PACKAGE_" VERSION "_VER_" INSTALLATION"
 D ^XMD
 K ^TMP("DIPKINIS",$J)
 Q

DIPKINIT
DIPKINIT ; ; 30-MAR-1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K DIF,DIFQ,DIFQR,DIFQN,DIK,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DIFROM,DFR,DTN,DIX,DZ,DIRUT,DTOUT,DUOUT
 S DIOVRD=1,U="^",DIFQ=0,DIFROM="22.0" W !,"This version (#22.0) of 'DIPKINIT' was created on 30-MAR-1999"
 W !?9,"(at FILEMAN 22 DEVELOPMENT AREA, by VA FileMan V.22.0T4)",!
 I $D(^DD("VERSION")),^("VERSION")'<22 G GO
 ;W !,"FIRST, I'LL FRESHEN UP YOUR VA FILEMAN...." D N^DINIT
 I ^DD("VERSION")<22 W !,"but I need version 22 of the VA FileMan!" G Q
GO ;
EN ; ENTER HERE TO BYPASS THE PRE-INIT PROGRAM
 S DIFQ=0 K DIRUT,DTOUT,DUOUT
 F DIFRIR=1:1:1 S DIFRRTN="^DIPKINI"_$E("5",DIFRIR) D @DIFRRTN
 W:1 !,"I AM GOING TO SET UP THE FOLLOWING FILES:" F I=1:2:2 S DIF(I)=^UTILITY("DIF",$J,I) D 1 G Q:DIFQ!$D(DIRUT) K DIF(I)
 S DIFROM="22.0" D PKG:'$D(DIFROM(0)),^DIPKINI1 G Q:'$D(DIFQ) S DIK(0)="AB"
 F DIF=1:2:2 S %=^UTILITY("DIF",$J,DIF),DIK=$P(%,";",5),N=$P(%,";",3),D=$P(%,";",4)_U_N D D K DIFQ(N)
 K DIFQR D ^DIPKINI2,^DIPKINI3
 L  S DUZ=DIDUZ W:1 !,$C(7),"OK, I'M DONE.",!,"NO"_$P("TE THAT FILE",U,DSEC)_" SECURITY-CODE PROTECTION HAS BEEN MADE"
 I DIFROM F DIF=1:2:2 S %=^UTILITY("DIF",$J,DIF),N=+$P(%,";",3) I N,$P(%,";",8)="y" S ^DD(N,0,"VR")=DIFROM
 I DIFROM(0)>0 F %="PRE","INI","INIT" S:$D(DIFROM(%)) $P(^DIC(9.4,DIFROM(0),%),U,2)=DIFROM(%)
 I $G(DIFQN) S $P(^(0),U,3,4)=$P(DIFQN,U,2)_U_($P(^DIC(0),U,4)+DIFQN) K DIFQN
 I DIFROM,$D(^%ZTSK) S X="DIPKINIS" X ^%ZOSF("TEST") D:$T PAC^DIPKINIS($T(IXF),.DIFROM)
 S:DIFROM(0)>0 ^DIC(9.4,DIFROM(0),"VERSION")=DIFROM G Q^DIFROM0
D S:$D(^DIC(+N,0))[0 ^(0)=D S X=$D(@(DIK_"0)")),^(0)=D_U_$S(X#2:$P(^(0),U,3,9),1:U)
 S DIFQR=DIFQR(+N) I ^DD("VERSION")>17.5,$D(^DD(+N,0,"DIK"))#2 S X=^("DIK"),Y=+N,DMAX=^DD("ROU") D EN^DIKZ
 I DIFQR D IXALL^DIK:$O(@(DIK_"0)")) W "."
 Q
R G REP^DIPKINI2
 ;
1 S N=+$P(DIF(I),";",3),DIF=$P(DIF(I),";",4),S=$P(DIF(I),";",5)
 W !!?3,N,?13,DIF,$P("  (Partial Definition)",U,$P(DIF(I),";",6)),$P("  (including data)",U,$P(DIF(I),";",13)="y") S Z=$S($D(^DIC(N,0))#2:^(0),1:"")
 I Z="" S DIFQ(N)=1,DIFQN=$G(DIFQN)+1_U_N G S
 I $L($P(Z,DIF)) W $C(7),!,"*BUT YOU ALREADY HAVE '",$P(Z,U),"' AS FILE #",N,"!" D R Q:DIFQ  G S:$D(DIFKEP(N)),1
 S DIFQ(N)=$P(DIF(I),";",7)'="n"
 I $L(Z) W $C(7),!,"Note:  You already have the '",$P(Z,U),"' File." S DIFQ(0)=1
 S %=$E(^UTILITY("DIF",$J,I+1),4,245) I %]"" X % S DIFQ(N)=$T W:'$T !,"Screen on this Data Dictionary did not pass--DD will not be installed!" G S
 I $L(Z),$P(DIF(I),";",10)="y" S DIR("A")="Shall I write over the existing Data Definition",DIR("??")="^D DD^DIFROMH1",DIR("B")="YES",DIR(0)="Y" D ^DIR S DIFQ(N)=Y
S S DIFQR(N)=0 Q:$P(DIF(I),";",13)'="y"!$D(DIRUT)
 I $P(DIF(I),";",15)="y",$O(@(S_"0)"))>0 S DIF=$P(DIF(I),";",14)="o",DIR("A")="Want my data "_$P("merged with^to overwrite",U,DIF+1)_" yours",DIR("??")="^D DTA^DIFROMH1",DIR(0)="Y" D ^DIR S DIFQR(N)=$S('Y:Y,1:Y+DIF) Q
 S %=$P(DIF(I),";",14)="o" W !,$C(7),"I will ",$P("MERGE^OVERWRITE",U,%+1)," your data with mine." S DIFQR(N)=%+1
 Q
Q W $C(7),!!,"NO UPDATING HAS OCCURRED!" G Q^DIFROM0
 ;
PKG S X=$P($T(IXF),";",3),DIC="^DIC(9.4,",DIC(0)="",DIC("S")="I $P(^(0),U,2)="""_$P(X,U,2)_"""",X=$P(X,U) D ^DIC S DIFROM(0)=+Y K DIC
 Q
 ;
IXF ;;DIPK (PACKAGE FILE INIT)^DIPK;3

DIPT
DIPT ;SFISC/XAK,TKW-DISPLAY PRINT OR SORT TEMPLATE ;3DEC2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 4
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DS,DIWD,D,DRK,J,D9,Y,L,DA
 Q:'$D(^DIPT(D0,0))  S (DRK,J(0))=$P(^(0),U,4),L=0,DS(1)=0,D(L)="0FIELD",D9="",Y=2
 F DS(1)=0:0 S DS(1)=$O(^DIPT(D0,"F",DS(1))) Q:DS(1)=""  S DY=^(DS(1)) D Y
WRITE D:D9]"" UP F D=2:1 Q:'$D(DS(D))  S X=DS(D) W !?DIWD(D)*2,$S(D=2:"FIRST",1:"THEN")_$S($G(DDXP)=3:" EXPORT ",1:" PRINT ")_$P(DIWD(D),+DIWD(D),2)_": "_X_"//" I '$D(D) K DD
 W ! S X="" Q
 ;
 ;
Y ;from DIPTED, too
 S X=$P(DY,$C(126)),DY=$P(DY,$C(126),2,99) Q:X=""
 I D9]"" G UP:$P(X,D9)]"" S X=$P(X,D9,2,99)
R I X'>0 G 0:$E(X,2)'=","&'X S:+X D9=D9_+X_",",DRK=-X S:X<0 L=L+1,D(L)=L_$P($G(^DIC(DRK,0)),U)_" FIELD" D CAPTION S DS(Y)=X,DIWD(Y)=D(L-1),Y=Y+1 G Y
 G NC:X'["," S DA=$P(X,",") G NC:+DA'=DA
 S:DA<0 DA=-DA G Y:'$D(^DD(DRK,DA,0)) S X=$P(X,",",2,99),DS(Y)=$P(^(0),U),%=+X,D=+$P(^(0),U,2),DIWD(Y)=L_$P(^DD(DRK,0),U)
MUL G Y:'$D(^DD(D,.01,0)) I $P(^(0),U,2)["W",$D(^DD(DRK,DA,0)) G W ;to get naked reference back to Label of WP field at top level
 S DRK=D,D9=D9_DA_",",Y=Y+1,L=L+1,(DIWD(Y),D(L))=L_$P(^DD(D,0),U) G R
NC S %=+X,D=DRK_U_% I $D(^DIPT(D0,"DCL",D)) S X=X_$E(^(D),$L(^(D)))
 G Y:'$D(^DD(DRK,%,0))
W S X=$P(^(0),U)_$E(X,$L(%)+1,999)
P S DS(Y)=X,DIWD(Y)=D(L),Y=Y+1 G Y
 ;
0 S:X?1"0".E X="NUMBER"_$E(X,2,999)
 D CAPTION G P
 ;
CAPTION S %=$F(X,";Z;""") I '% S D=X Q
 S %=%-$L($P(X,";")),X=";"_$P(X,";",2,99) F D=%:0 S D=$F(X,"""",D) I ";"[$E(X,D) S X=$E(X,%,D-2)_$E(X,1,%-5)_$E(X,D,999) Q
 Q
 ;
 ;
UP ;from DIPTED, too
 S DRK=J(0),%=D9,DA=""
DOWN I X[",",+X=$P(X,","),$P(D9,DA_+X_",")="" S DA=DA_+X_",",%=$P(%,",",2,99),DRK=$S(X'>0:-X,1:+$P(^DD(DRK,+X,0),U,2)),X=$P(X,",",2,99) G DOWN
NUL S D9=DA,DS(Y)="",DIWD(Y)=D(L),L=L-1,Y=Y+1,%=$P(%,",",2,99) G NUL:%]"",R
 ;
 ;
 ;
 ;
 ;
DIBT ; DISPLAY SORT FIELDS --Field 1620 of File .401
 I '$D(^DIBT(D0,0))!'$D(^(2)) S X="" Q
 K DIPP,DPP N DIBTRPT,DIBTOLD,C,D,DCC
 S X=D0,(DJ,DIBTRPT)=1,C=",",D="^DIBT("_D0_",",DCC=$G(^DIC(+$P(^DIBT(D0,0),U,4),0,"GL")) D ENDIPT^DIP11 S X="" K DIBTRPT,DCC
 F DIJ=0:0 S DIJ=$O(DPP(DIJ)) Q:DIJ=""  S DIPP(DIJ)=DPP(DIJ),%=+DPP(DIJ),DJ=DIJ D E1^DIP0 S %X=0 D E2^DIP0
 K DPP,DIJJ F DIJ=0:0 S DIJ=$O(DIPP(DIJ)) Q:DIJ=""  D DJ
 K DIPP,DIJ,DPP,DJ,%X,%Y,C S X="" Q
 ;
DJ W !?DIJ*2-2,$S(DIJ>1:"WITHIN "_DPP(DIJ-1)_", ",1:"")_"SORT BY: "_$P($P(DIPP(DIJ),U,4),"""",1)_$P(DIPP(DIJ),U,3)_$P(DIPP(DIJ),U,5)_"//" S DPP(DIJ)=$P(DIPP(DIJ),U,3)
 I $D(^DD(+DIPP(DIJ),+$P(DIPP(DIJ),U,2),0)) S X=+$P(^(0),U,2) I X,$D(DIPP(DIJ,X)),$D(^DD(X,0)) W !?DIJ*2-2,$P(^(0),U,1)_": "_DIPP(DIJ,X)_"//" K DIPP(DIJ,X)
 F %=0:0 S %=$O(DIPP(DIJ,%)) Q:'%  I $D(DIPP(DIJ,%))#2 W !?DIJ*2-2,$S('$D(^DD(%,0,"UP")):$O(^("NM",0))_" ",1:""),$P(^DD(%,0),U,1)_": "_DIPP(DIJ,%)_"//" S DPP(DIJ)=DIPP(DIJ,%)
 I $D(^DIBT(D0,2,DIJ,"ASK")) W "    (User is asked range)" Q
 Q:'$D(^DIBT(D0,2,DIJ,"F"))&('$D(^("TXT")))
 I $D(^DIBT(D0,2,DIJ,"TXT")) W " ("_^("TXT")_")" Q
 S Y=^("F"),%Y=$S('$D(^("T")):"",^("T")="z":"",1:^("T")) S:Y[".9999" Y=$P(Y,".",1)+1 X:Y?1"2"6N.NP ^DD("DD") S %=$F(Y,"z"),X="     From '"_$S(%:$E(Y,1,%-3)_$C($A(Y,%-2)+1),1:Y)_"'",Y=%Y
 I Y]"" S:Y[".9999" Y=Y\1 X:Y?1"2"6N.NP ^DD("DD") S X=X_"  To '"_Y_"'"
 W X

DIPTED
DIPTED ;SFISC/GFT-EDIT PRINT TEMPLATE ; 18NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 11
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DIC,DIPT,DIPTED,DRK,DIPTEDTY,I,J
 S DIC=.4,DIC(0)="AEQ",DIC("S")="I $P(^(0),U,8)=7!'$P(^(0),U,8)" D ^DIC Q:Y<1
 K DIC
 S DIPT=+Y D E
 D PUT
K K ^TMP("DIPTED",$J),^UTILITY("DIP2",$J)
 Q
 ;
EDIT(DIPT) ; EDIT PRINT TEMPLATE 'DIPT' VIA VA FILEMAN SCREEN EDITOR
 N DIPTED,DRK,DIPTEDTY,I,J
E N DA,D0,DUOUT,DTOUT,DIPTEDER,DIPTH,L,DY,Y,DIPTX,D,C,Q,DIPTROW,DCL,DXS,DNP,DHD,DISH,DV,DJ,DL,DK,DIL
 D:'$D(DISYS) OS^DII X ^DD("OS",DISYS,"EON")
 I '$D(^DIPT(DIPT,0)) W !,"NO TEMPLATE SELECTED",! Q
 S DIPTED="Print",DIPTEDTY=$P(^(0),U,8) I DIPTEDTY=7 S DIPTED="EXPORT FIELDS"
 S DIPTED=DIPTED_" Template """_$P(^(0),U)_""""
 D GET("^TMP(""DIPTED"",$J)")
 S DIPTH="Editing "_DIPTED,DIPTROW=1
DDW D EDIT^DDW("^TMP(""DIPTED"",$J)","M",DIPTH,"(File "_DRK_")",DIPTROW)
 K ^UTILITY($J,0),^UTILITY("DIP2",$J),I,J
 I $D(DTOUT)!$D(DUOUT) K ^TMP("DIPTED",$J) W $C(7),$$EZBLD^DIALOG(8077) Q
 S (DV,DNP)="",(DIL,DJ)=0,(DL,DXS)=1,DK=DRK,J(0)=DK,I(0)=^DIC(DK,0,"GL")
 D PROCESS("^TMP(""DIPTED"",$J)")
 X ^DD("OS",DISYS,"EON")
 S DIPTROW=$O(DIPTEDER(0)) I DIPTROW W " ",DIPTEDER(DIPTROW) H 2 S DIPTH="ERROR!  Re-editing "_DIPTED K DIPTEDER G DDW
 I '$D(^UTILITY("DIP2",$J)) W "<NOTHING TO SAVE>",$C(7) G K
 S DDSCHG=1
 I $D(DXS)>9 M ^UTILITY("DIP2",$J,U,"DXS")=DXS
 M ^UTILITY("DIP2",$J,U,"DCL")=DCL
 I $D(DNP) S ^UTILITY("DIP2",$J,U,"DNP")=1
 I $G(DISH) S ^("SUB")=1
 I $G(DHD)]"" S ^("H")=DHD
 Q
 ;
GET(DIPTA,DIT) ;put displayable template into @DIPTA
 N DS,DIWD,D9,D0
 K @DIPTA
 I '$D(DIT) S DIT=$NA(^DIPT(DIPT)),D0=DIPT
 E  S D0=-1
 S (DRK,J(0))=$P(@DIT@(0),U,4),L=0,D(L)="0FIELD",C=",",D9="",Y=2,Q="""",DHD=$G(^("H")),DISH=$D(^("SUB"))
 F DS(1)=0:0 S DS(1)=$O(@DIT@("F",DS(1))) Q:DS(1)=""  S DY=^(DS(1)) D Y^DIPT
 D:D9]"" UP^DIPT
 F D=2:1 Q:'$D(DS(D))  S @DIPTA@(D-1)=$J("",D>2*$G(DIWD(D))*3)_DS(D) ;indentation showing level of subfiles
 Q
 ;
PROCESS(DIPTA) ;puts nodes into ^UTILITY("DIP2")
 N D0,DM,DQI,DA,ERR,P,S,LINE,X,DIETAB
 S DIETAB=0
 F LINE=1:1 Q:'$D(@DIPTA@(LINE))  K ERR S X=^(LINE) D
 .I X?1"^".E S LINE=999999999 K ^UTILITY("DIP2",$J) Q
 .S X=$$LINE(X) I X]"" S ^($O(^UTILITY("DIP2",$J,""),-1)+1)=X Q
 .I $D(ERR) W "LINE ",LINE S DIPTEDER(LINE)=ERR,LINE=-LINE Q  ;stop if we find one error
 I LINE<0 W " ERROR!" Q
 Q
 ;
LINE(X) ;returns X as component of Template.  DD number is currently 'DK'
 N DIC,DICMX,DATE,Y,DICOMPX,DICOMP,DP,DJ
 I X?." " Q ""
 F P=$L(X):-1:1 Q:$A(X,P)>32  S X=$E(X,1,P-1) ;strip off trailing spaces
 F P=0:1  Q:$A(X)-32  S X=$E(X,2,999) ;strip off 'P' leading spaces
 I P<DIETAB,DL>1 F  D U I DL-1*3'>P Q  ;pop Up (MAYBE SEVERAL LEVELS) if we find outdentation
 S DIETAB=P
F S (P,S)=""
LIT I $E(X)="""",$L(X,"""")#2 F I=3:2:$L(X,"""") Q:$P(X,"""",I)]""&($E($P(X,"""",I)'=$C(95)))
 I  I $P($P(X,"""",I),";")="" G DJ
 S DIC="^DD(DK,",DIC(0)="ZO"
DIC I X="NUMBER" S Y=0 G S
 D ^DIC G GF:Y>0
 I X="" D U:DL>2 Q X
STRIP I DIPTEDTY-7 D  G:'$D(D) DIC S X=$RE(X) D  S X=$RE(X) G:'$D(D) DIC ;from beginning, then end
 .F D="+","#","*","&","!" I $E(X)=D S P=D,X=$E(X,2,999) K D Q
 I X[";" G EXP:DIPTEDTY=7 S S=";"_$P(X,";",2,99)_S,X=$P(X,";") G DIC
HARD S DM=X,DQI="DIP(",DA="DXS("_DXS_C,S=S_";Z;"""_X_"""",DICOMP=DIL_$E("?",''L)_"TI",DICOMPX=""
 I X'?.E1":" S DICMX="X DICMX" D EN^DICOMP G QQ:'$D(X) D FLY^DIP22 S X=S G DJ
 G EXP:DIPTEDTY=7 S DICMX="S DIXX=DIXX("_DL_") D M" D ^DICOMPW
 I $D(X) D  S S=U_$P(DP,U,2)_U_$E(1,Y["m")_U_S,DIL(DL)=DIL,DV(DL)=DV,DL(DL)=DK,DK=+DP,DV=DV_-DP_C,DL=DL+1,DIL=+Y,Y=0,X=DV_S K P G VAL3 ;relational jump
 .N Y D OVFL^DIP22,F^DIP22
QQ S ERR="" Q ""
 ;
GF I $P(Y(0),U,2) D D S X=$P($P(Y(0),U,4),";"),I(DIL)=$S(+X=X:X,1:Q_X_Q),J(DIL)=DK G WORD:$P($G(^DD(DK,.01,0)),U,2)["W" Q "" ;down to a multiple
 I +Y=.001 S Y=0
S S X=+Y_S
DJ S X=DV_X
VAL3 I DIPTEDTY'=7!(S'[";W"&(S'[";m")) S S="" D P Q X
EXP S ERR="NOT ALLOWED WHEN SELECTING EXPORT FIELDS" Q ""
 ;
P D:$D(P)  Q
 .I P="" K DNP Q
 .I P="*" S DCL=$G(DCL)+1
 .S DCL(DK_U_+Y)=$S($T:DCL_P,1:P)
 ;
D S DIL(DL)=DIL,DV(DL)=DV,DL(DL)=DK,DK=+$P(^DD(DK,+Y,0),U,2),DL=DL+1,DIL=DIL+1,DV=DV_+Y_C,Y=0 Q  ;go Down a level
 ;
WORD I DIPTEDTY=7 G EXP
 S Y=.01 D P S X=DV_Y_S D U Q X
 ;
U S DL=DL-1,DV=DV(DL),DK=DL(DL),DIL=DIL(DL) F %=DIL:0 S %=$O(I(%)) Q:%=""  K I(%),J(%)
 Q
 ;
SAVEFLDS(Y) ;POST-SAVE OF 'DIPTED' SCREENMAN FORM
 N DMAX,J,X
 Q:'$D(^UTILITY("DIP2",$J))!'$G(Y)
CLEAR S $X=0,$Y=0 I $G(IOXY)]"" N DX,DY S (DY,DX)=0 X IOXY W $C(27,91,74)
 S Y=$$CLONE(Y) Q:'Y  ;ASK 'SAVE AS'
 D NOW^%DTC S $P(^DIPT(Y,0),U,2)=+$J(%,0,4)
 S $P(^DIPT(Y,0),U,5)=$G(DUZ)
 K ^DIPT(Y,"F") S J="" D  D J
 .F %=1:1 Q:'$D(^UTILITY("DIP2",$J,%))  S X=^(%) I X]"" D
 ..I $L(J)+$L(X)>150 D J S J=""
 ..S J=J_X_$C(126)
 K ^DIPT(Y,"DXS"),^("DCL"),^("DNP")
 M ^DIPT(Y)=^UTILITY("DIP2",$J,U)
 I $D(^DIPT(Y,"ROU")) K ^("ROU") I $D(^("IOM")) S IOM=^("IOM") K ^("IOM") I $D(^("ROUOLD")) S X=^("ROUOLD") I X]"",$G(DISYS),$D(^DD("OS",DISYS,"ZS")) S DMAX=^DD("ROU") D ENZ^DIPZ I $D(^DIPT(DIPZ,"H")) S DHD=^("H")
 D K
 Q
 ;
J S ^($O(^DIPT(+Y,"F",""),-1)+1)=J Q
 ;
CLONE(DA) ;
 N DIC,DIPTEDTY,DIPTEDFI,X,Y,DIPTEDNM,DDS
 I '$D(^DIPT(DA,0)) Q 0
 S (DIPTEDNM,DIC("B"))=$P(^(0),U)
ASK S DIPTEDFI=$P(^DIPT(DA,0),U,4),DIPTEDTY=$P(^(0),U,8) I 'DIPTEDFI Q 0
 S DIC=.4,DIC("A")="Save revised Print Template "_DIPTEDNM_" as: ",DIC(0)="AEQL",DIC("S")="I $P(^(0),U,4)=DIPTEDFI,$P(^(0),U,8)=DIPTEDTY"
 D ^DIC I Y<0 Q 0
 I +Y=DA Q DA
 I $O(^DIPT(+Y,0))]"" W !,$C(7),"Are you sure you want to overwrite this '",$P(Y,U,2),"' Template" S %=1 D YN^DICN I %-1 K DIC G ASK:%=2 Q 0
 L +^DIPT(+Y):5 E  W !,$C(7),"Sorry. Another user is editing this template." Q 0
 S ^DIPT("F"_DIPTEDFI,$P(Y,U,2),+Y)=1
 S $P(^DIPT(+Y,0),U,4)=DIPTEDFI,$P(^(0),U,8)=DIPTEDTY
 L -^DIPT(+Y)
 Q +Y
 ;
 ;
PUT ;save template from ^UTILITY
 I '$D(^UTILITY("DIP2",$J)) Q
 N DIC,DIPZ
 S DIC("B")=DIPT
SAVEAS S DIC=.4,DIC("A")="Save revised "_DIPTED_" as: ",DIC(0)="AEQL",DIC("S")="I $P(^(0),U,4)=DRK,$P(^(0),U,8)=DIPTEDTY"
 D ^DIC
 Q:Y<0  I $O(^DIPT(+Y,0))]"" W !,$C(7),"Are you sure you want to overwrite this '",$P(Y,U,2),"' Template" S %=1 D YN^DICN I %-1 Q:%<2  K DIC("B") G SAVEAS
 L +^DIPT(+Y):5 E  W !,$C(7),"Sorry. Another user is editing this template." Q
 S ^DIPT("F"_J(0),$P(Y,U,2),+Y)=1
 S $P(^DIPT(+Y,0),U,4)=J(0),$P(^(0),U,8)=DIPTEDTY
 L -^DIPT(+Y)
 D SAVEFLDS(+Y)
 Q

DIPZ
DIPZ ;SFISC/XAK,TKW-COMPILE PRINT TEMPLATES ;3FEB2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 I $G(DUZ(0))'="@" W:$D(^DI(.84,0)) $C(7),$$EZBLD^DIALOG(101) Q
EN1 N DNM,X,Y,Z D K I '$D(DISYS) N DISYS D OS^DII
 I '$D(^DD("OS",DISYS,"ZS")) W $C(7),$$EZBLD^DIALOG(820) Q
 S DTIME=$S('$D(DTIME):300,1:DTIME)
 D SIZ^DIPZ0(8034) G:$D(DTOUT)!$D(DUOUT)!'X K S DMAX=X
TEM K DIC S DIC="^DIPT(",DIC(0)="AIEQ"
 S DIC("W")="W ?40,""FILE #"",$P(^(0),U,4) W:$D(^(""ROU"")) ?60,^(""ROU"")"
 S DIC("S")="I $D(^(""F""))>9,'$P(^(0),U,8),Y'<1" D ^DIC G K:Y<0
 S DIPZ=+Y
 D RNM^DIPZ0(8034) G:$D(DTOUT)!($D(DUOUT))!(X="") K S DNM=X K DIC
IOM K DIR S DIR("B")=$G(^DIPT(DIPZ,"IOM")) K:'DIR("B") DIR
 S DIR(0)="N^19:255",DIR("A")=$$EZBLD^DIALOG(8022) D BLD^DIALOG(8023,"","","DIR(""?"")")
 D ^DIR K DIR G:$D(DTOUT)!($D(DUOUT))!'X K S IOM=X
 W ! S DIR(0)="Y",DIR("A")=$$EZBLD^DIALOG(8020) D ^DIR K DIR G K:'Y!($D(DIRUT))
 S X=DNM,Y=DIPZ D ENZ
K K DMAX,DIC,DCL,R,M,DE,DI,DPP,DIPZ,DHD,DIWL,DIWR,DK,DP,DNP,DCL,DITTO,DUOUT,DIRUT,DIROUT,DTOUT
 K %,%H,I,O,C,D,DD,DHT,DIL0,DIP,DN,DU,F,H,L,N,S,Q,CP,DINC Q
 ;
EN ;
 Q:'$D(^DIPT(Y,"IOM"))!($P($G(^DIPT(Y,0)),U,8))  S IOM=^("IOM") D ENZ G K
 ;
ENZ S (R,DCL,DPP)=0 F %=0:0 S R=$O(^DIPT(+Y,"DCL",R)) Q:R=""  F %=1:1 Q:%>$L(^(R))  S Z=$E(^(R),%) I Z?1P S DCL(R)=$G(DCL(R))_Z
ENDIP ;
 W:'$G(DIPZS) ! K ^UTILITY($J),^("DIL",$J),^UTILITY("DIPZ",$J),DIPZ,DNP,DIPZLR,DRN,DIPZL,DX,DXS,R N DIPZQ S DIPZQ=0 D DELETROU^DIEZ(X)
 S DNM=X,DIPZ=+Y,DRD=0,DP=$P(^DIPT(DIPZ,0),U,4),DHD=$S(^("H")="@":"@",1:3) S:$D(^("DNP")) DNP=1
 S DK=^DIC(DP,0,"GL"),DMAX=DMAX-$S($D(DCL)>9:1600,1:1300),DRN=0,R="",L=0,DINC=1
 I '$D(@(DK_"0)")) Q  ;THE DATA FILE MAY BE GONE
 I '$D(IOM) Q:$D(^DIPT(DIPZ,"IOM"))[0  S IOM=^("IOM")
AF D DT^DICRW,INIT^DIP5 S X=-1
 S T(1)=$P(^DIPT(DIPZ,0),U),T(2)=$$EZBLD^DIALOG(8034),T(3)=DP D BLD^DIALOG(8024,.T,"","DIR")
 W:'$G(DIPZS) !,DIR K DIR
 F T=0:0 S X=$O(^DIPT("AF",X)) Q:X=""  F %=0:0 S %=$O(^DIPT("AF",X,%)) Q:'%  K:$D(^(%,DIPZ)) ^(DIPZ)
 F C=1:1 Q:'$D(^DIPT(DIPZ,"DXS",C,9.2))&'$D(^(9))  D DXS S:DIDXS DXS(C)=""
 S DL=1,DIPZL=0,DHT=-1,C=",",Q="""",^UTILITY($J,1)=""
 F DIP=-1:0 S DIP=$O(^DIPT(DIPZ,"F",DIP)) Q:DIP=""  S R=^(DIP) D ^DIL
 D UNSTACK^DIL:DM,A^DIL,T^DIL2 K ^DIPT(DIPZ,"T") F R=-1:0 S R=$O(^UTILITY($J,"T",R)) Q:R=""  S ^DIPT(DIPZ,"T",R)=^(R)
 S DX=DX+999,Y=$P(" D ^DIWW",1,''$D(DIWR))_" K Y" I DIWL S Y=Y_" K DIWF" S:DIWL=1 ^UTILITY("DIPZ",$J,.5)=" S DIWF=""W"""
 D PX^DIPZ1 G ^DIPZ2
DXS S DIDXS=1
 I $D(^DIPT(DIPZ,"DXS",C,9)) S X=^(9) D ^DIM I '$D(X) S DIDXS=0
 Q
 ;
EN2(Y,DIPZFLGS,X,DMAX,DIPZRLA,DIPZZMSG) ;Silent or Talking with parameter passing
 ;and optionally return list of routines built and if successful
 ;IEN,FLAGS,ROUTINE,RTNMAXSIZE,RTNLISTARRAY,MSGARRAY
 ;Y=TEMPLATE IEN (required)
 ;FLAGS="T"alk (optional)
 ;X=ROUTINE NAME (required)
 ;DMAX=ROUTINE SIZE (optional)
 ;DIPZRLA=ROUTINE LIST ARRAY, by value (optional)
 ;DIPZZMSG=MESSAGE ARRAY (optional) (default ^TMP)
 ;*
 ;DIPZS will be used to indicate "silent" if set to 1
 ;Write statements are made conditional, if not "silent"
 ;*
 N DIPZS,DNM,DIQUIET,DIPZRIEN,DIPZRLAZ,Z,DIPZRLAF
 N DIK,DIC,%I,DICS
 S DIPZS=$G(DIPZFLGS)'["T"
 S:DIPZS DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D
 .N Y,DIPZFLGS,X,DMAX,DIPZRLA,DIPZS
 .D INIZE^DIEFU
 I $G(Y)'>0 D BLD^DIALOG(1700,"IEN for Print Template missing or invalid") G EN2E
 I '$D(^DIPT(Y,0)) D BLD^DIALOG(1700,"No Print Template on file with IEN="_Y) G EN2E
 I $G(^DIPT(Y,"IOM"))'>0 D BLD^DIALOG(1700,"No Margin Width for Print Template, IEN="_Y) G EN2E
 I $P($G(^DIPT(Y,0)),"^",8) D BLD^DIALOG(1700,"Print Template Invalid, IEN="_Y) G EN2E
 I $G(X)']"" D BLD^DIALOG(1700,"Routine name missing this Print Template, IEN="_Y) G EN2E
 I X'?1U.NU&(X'?1"%"1U.NU) D BLD^DIALOG(1700,"Routine name invalid") G EN2E
 I $L(X)>7 D BLD^DIALOG(1700,"Routine name too long") G EN2E
 S DIPZRLA=$G(DIPZRLA,"DIPZRLAZ"),DIPZRIEN=Y
 S:DIPZRLA="" DIPZRLA="DIPZRLAZ" S:$G(DMAX)'>0!($G(DMAX)>^DD("ROU")) DMAX=^DD("ROU")
 S DIPZRLAF=""
 K @DIPZRLA
 D EN
 G:'DIPZS!(DIPZRLAF) EN2E
 D BLD^DIALOG(1700,"Compiling Print Template (IEN="_DIPZRIEN_")"_$S(DIPZRLAF=0:", routine name too long",1:""))
EN2E I 'DIPZS D MSG^DIALOG() Q
 I $G(DIPZZMSG)]"" D CALLOUT^DIEFU(DIPZZMSG)
 Q
 ;
 ;DIALOG #101    'only those with programmer's access'
 ;       #820    'no way to save routines on the system'
 ;       #8020   'Should the compilation run now?'
 ;       #8022   'Margin Width for output.'
 ;       #8023   'Type a number from 19 to 255.  This is the number...'
 ;       #8024   'Compiling template name Print template of file n'
 ;       #8034   'Print template'

DIPZ0
DIPZ0 ;SFISC/TKW-COMPILE PRINT TEMPLATES ;19JAN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
SIZ(DITYP) ;PROMPT FOR SIZE OF COMPILED ROUTINE
 ;PARAMETER DITYP CONTAINS A NUMBER IN DIALOG FILE POINTING TO EITHER
 ;TEXT FOR A TEMPLATE TYPE, OR TO THE TEXT 'CROSS-REFERENCES'.
 N %,DIR
 S %=$G(^DD("ROU")) S:'% %=$P($G(^DD("OS",DISYS,0)),U,4) S:'% %=5000
 S DIR(0)="N^2400:"_%_":0",DIR("B")=%,DIR("A")=$$EZBLD^DIALOG(8027)
 K % S %(1)=$$EZBLD^DIALOG(DITYP) D BLD^DIALOG(9002,.%,"","DIR(""?"")")
 D ^DIR Q
 ;
RNM(DITYP) ;PROMPT FOR COMPILED ROUTINE NAME
 ;PARAMETER SAME AS FOR SIZ.
 N %,DIR,DIRNM
 S DIRNM="" D
 .I DITYP<8036 S DIRNM=$G(@(DIC_DIPZ_",""ROUOLD"")")),DIRNM(1)=$G(@(DIC_DIPZ_",""ROU"")"))
 .E  S DIRNM=$G(@("^DD("_DIPZ_",0,""DIKOLD"")")),DIRNM(1)=$G(@("^DD("_DIPZ_",0,""DIK"")")) S:DIRNM="" DIRNM=DIRNM(1)
 .Q
 I DIRNM(1)]"" S DIR(0)="Y",DIR("B")="NO" D  D ^DIR K DIR Q:$D(DIRUT)  I Y D UNC Q
 .K % S %(1)=$$EZBLD^DIALOG(DITYP),%(2)=DIRNM(1)
 .D BLD^DIALOG(8028,.%,"","DIR(""A"")")
 .K %(2) D BLD^DIALOG(9004,.%,"","DIR(""?"")")
 .Q
 S %=7 ;S:DITYP=8036 %=6
 S DIR(0)="F^3:"_%_"^K:X'?1U.NU&(X'?1""%""1U.NU)!(X?1""DI"".E) X" S:DIRNM]"" DIR("B")=DIRNM
 D BLD^DIALOG(8001,"","","DIR(""A"")"),BLD^DIALOG(9006,%,"","DIR(""?"")")
 D ^DIR K DIR Q:$D(DIRUT)!(X="")
 I $L(X)>6 D
 .N A,% D BLD^DIALOG(8031,"","","A") W $C(7),! F %=0:0 S %=$O(A(%)) Q:'%  W A(%),!
 .W ! Q
 I $$ROUEXIST^DILIBF(X) K % S %(1)=U_X D BLD^DIALOG(8016,.%,"","DIR") W $C(7),!?5,DIR K DIR
 Q
UNC ;UNCOMPILE TEMPLATES/CROSS-REFS
 N %,DIR,DIPZ0 I DITYP<8036 K @(DIC_DIPZ_",""ROU"")") S DIPZ0=$G(^("ROUOLD")) D
 . I DITYP=8033 D UNCAF^DIEZ(DIPZ)
 .D DELETROU^DIEZ(DIPZ0)
 E  S X=DIPZ D A^DIU21
 S %(1)=$$EZBLD^DIALOG(DITYP) D BLD^DIALOG(8026,.%,"","DIR(""A"")") ;'IS NOW UNCOMPILED'
 W $C(7),!!,DIR("A")
 S X="" Q
 ;
 ;DIALOG #8001  'Routine Name'
 ;       #8016  'Note that...is already in the routine directory'
 ;       #8027  'Maximum routine size on this computer...'
 ;       #8028  '...currently compiled under namespace...UNCOMPILE...'
 ;       #8031  'WARNING!!  Since the namespace...routine...so long...'
 ;       #8033  'Input template'
 ;       #8034  'Print Template'
 ;       #8036  'Cross-Reference(s)'
 ;       #9002  'This number will be used to determine how large...'
 ;       #9004  'Answer YES to UNCOMPILE the ...'
 ;       #9006  'Enter a valid MUMPS routine name...'

DIPZ1
DIPZ1 ;SFISC/GFT,XAK-COMPILE PRINT TEMPLATES ;30JAN2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PX ;
 F DX=DX+1:1 I '$D(^UTILITY("DIPZ",$J,DX)) S ^(DX)=" "_$E(Y,2,999) Q
 W:'$G(DIPZS) "." S O=0,DIPZL=$L(Y)+DIPZL+2 I DIPZL>DMAX S DRN(DRN)=DX,^(DX+1)=^(DX),DIPZL=$L(Y)+2,DRN=DRN+1,^(DX)=" G ^"_DNM_DRN,DX=DX+1
 Q
 ;
DE ;
 D SUBNAME S DX=F(DM-1),^(DX)=^(DX)_" D "_X
D S DIPZL(DM)=DX+1,DIPZLR(DM)=DRN,^(DX+1)=" G "_X_"R",^(DX+2)=X_" ;",DX=DX+2 Q
 ;
DIWR ;
 S I=$D(^UTILITY("DIPZ",$J,1)) I $D(DIWR(DM)),DX=DIWR(DM) S ^(DX)=" D A^DIWW"
 E  I $D(DIWR(DM)) S DX=DX+1,^(DX)=" D ^DIWW"
 E  F I=DM-1:-1:0 I $D(DIWR(I)) K DIWR(I) S I=F(I),^(I-.1)=" D ^DIWW" Q
 K DIWR(DM) Q
 ;
WP ;
 S I=$E(^UTILITY("DIPZ",$J,X),2,999) D WPX^DIL0 S ^UTILITY("DIPZ",$J,X)=" "_I Q
 ;
DREL ;
 S %=X,DHT=Y,DM=DM+1 D SUBNAME F DX=DX+1:1 I '$D(^UTILITY("DIPZ",$J,DX)) S ^(DX)=" S DICMX=""D "_X_U_DNM_""",DIXX("_DM_")="""_X_""""_% Q
 D D S DX=DX+2,^(DX-1)=" I $D(DSC("_DP_")) X DSC("_DP_") E  Q",^(DX)=" W:$X>"_DG_" !"_DHT,DHT=-1,F=F_+W_C,DIL=DIL+1,DD=DD-1,%=DX Q
 ;
UP ;
 S ^UTILITY("DIPZ",$J,DX+1)=" Q",X=DIPZ(DM) D X
 S (F(DM-1),DX)=DX+2,^UTILITY("DIPZ",$J,DX)=X_"R ;" S:DIPZLR(DM)'=DRN ^(DIPZL(DM))=^(DIPZL(DM))_"^"_DNM_DRN Q
 ;
SUBNAME S (DIPZ(DM),X)=$G(DIPZ(DM))+1
X S X=$S(X<27:$C(64+X),1:$C(X\26+64,X#26+65))_DM Q

DIPZ2
DIPZ2 ;SFISC/GFT,XAK-COMPILE PRINT TEMPLATES ;07:33 PM  16 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F R=0:0 S R=$O(DXS(R)),W="" Q:'R  K:$D(DXS(R))>9 ^DIPT(DIPZ,"DXS",R) F R=R:0 S W=$O(DXS(R,W)) Q:W=""  S ^DIPT(DIPZ,"DXS",R,W)=DXS(R,W)
 S DIPZLR=DRN,DRN="",DIL=0 D NEW
DXS I $D(^DIPT(DIPZ,"DXS")) S X=" I $D(DXS)<9 M DXS=^DIPT("_DIPZ_",""DXS"")" D L
 S X=" S I(0)="""_$$CONVQQ^DILIBF(DK)_""",J(0)="_DP D L
DIL S DIL=$O(^UTILITY("DIPZ",$J,DIL)) G DHD:'DIL
 S DHT=^(DIL) I DRN<DIPZLR,DIL>DRN(+DRN) D SAVE G:DIPZQ K
 S X=DHT D L G DIL
 ;
DHD F F=2.9:0 S F=$O(^UTILITY($J,F)) Q:'F  S DIL=$L(^(F))+DIL
 I DIL+DIPZL>DMAX D SAVE G:DIPZQ K
 S X=" Q" D L S X="HEAD ;" D L F F=2.9:0 S F=$O(^UTILITY($J,F)) Q:'F  S X=" "_^(F) D L
 S X=" W !,""" F %=1:1 S X=X_"-" I %=IOM!(%>239) S X=X_""",!!" D L Q
END D SAVE G:DIPZQ K
EGP S ^DIPT(DIPZ,"ROUOLD")=DNM,^("IOM")=IOM,^("ROU")=U_DNM,^("LAST")=$S(DRN>1:DRN-1,1:""),DM=0,F="" I $G(DUZ("LANG")) S ^("ROULANG")=DUZ("LANG") ;**CCO/NI REMEMBER LANGUAGE
 K ^("STATS"),DXS F DIP="L","H","DITTO","CP","Q","N","S" I $D(@DIP)>9 S %X=DIP_"(",%Y="^DIPT(DIPZ,""STATS"",DIP," D %XY^%RCR
 F DIP=-1:0 S DIP=$O(^DIPT(DIPZ,"F",DIP)) Q:DIP=""  S R=^(DIP) W:'$G(DIPZS) "." D R
K K ^UTILITY($J),^("DIPZ",$J),DIPZL,DISMIN,%X,%Y,DG,DIL,DLN,DL,DM,DMAX,DNM,DRD,DRJ,DIO,DX,DY,DRN,DIPZLR,V,R,W,Y,T,DIDXS,DINC
 Q
 ;
R Q:R=""  S W=$P(R,$C(126),1),R=$P(R,$C(126),2,999)
DM I DM G UP:$P(W,F,1)]"" S W=$P(W,F,2,999)
 I 'W S:W?1"0".E ^DIPT("AF",DP,.001,DIPZ)="" G R
 I $P(W,";",1)=+W S ^DIPT("AF",DP,+W,DIPZ)="" G R
 G R:W'?.NP1",".E I W<0 S X=-W G DOWN
 G R:'$D(^DD(DP,+W,0)) S X=+$P(^(0),U,2) G R:'X
DOWN S DM=DM+1,DP(DM)=DP,DP=X,F=F_+W_C G DM
UP S DP=DP(DM),DM=DM-1,F=$P(F,C,1,DM)_$E(C,DM>0) G DM
 ;
SAVE ;
 S L=1.001,DINC=.001 S X=" G BEGIN" D L,OS^DII:'$D(DISYS) F %=$S($D(DCL)>9:1,0'[DCL:7,1:10):1 S X=$E($T(TEXT+%),4,999) Q:X=""  D L
 I $L(DNM_DRN)>8 S DIPZQ=1 W:'$G(DIPZS) $C(7),!,DNM_DRN_$$EZBLD^DIALOG(1503) S:$G(DIPZRLA)]"" DIPZRLAF=0 Q
 S X=DNM_DRN X ^DD("OS",DISYS,"ZS") S %(1)=X D BLD^DIALOG(8025,.%,"","DIR") W:'$G(DIPZS) !,DIR K %,DIR S:$G(DIPZRLA)]"" @DIPZRLA@(DNM_DRN)="",DIPZRLAF=1
 S DRN=DRN+1
NEW K ^UTILITY($J,0) S X=DNM_DRN_" ; GENERATED FROM '"_$P(^DIPT(DIPZ,0),U,1)_"' PRINT TEMPLATE (#"_DIPZ_") ; "_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3)
 S X=X_" ; ("_$S(DRN="":"FILE "_DP_", MARGIN="_IOM_")",1:"continued)"),L=1,DINC=1,^UTILITY($J,0,L)=X
 S X=" S:'$D(DN) DN=1 S DISTP=$G(DISTP),DILCT=$G(DILCT)"
L S L=L+DINC,^UTILITY($J,0,L)=X Q
 ;
 ;DIALOG #1503  'routine name is too long.  Compilation...aborted'
 ;       #8025  '...routine filed.'
 ;**CCO/NI TAG 'TEXT+15' CHANGED FOR DATE OUTPUT
TEXT ;
 ;;CP G CP^DIO2
 ;;C S DQ(C)=Y
 ;;S S Q(C)=Y*Y+Q(C) S:L(C)>Y L(C)=Y S:H(C)<Y H(C)=Y
 ;;P S N(C)=N(C)+1
 ;;A S S(C)=S(C)+Y
 ;; Q
 ;;D I Y=DITTO(C) S Y="" Q
 ;; S DITTO(C)=Y
 ;; Q
 ;;N W !
 ;;T W:$X ! I '$D(DIOT(2)),DN,$D(IOSL),$S('$D(DIWF):1,$P(DIWF,"B",2):$P(DIWF,"B",2),1:1)+$Y'<IOSL,$D(^UTILITY($J,1))#2,^(1)?1U1P1E.E X ^(1)
 ;; S DISTP=DISTP+1,DILCT=DILCT+1 D:'(DISTP#100) CSTP^DIO2
 ;; Q
 ;;DT I $G(DUZ("LANG"))>1,Y W $$OUT^DIALOGU(Y,"DD") Q
 ;; X ^DD("DD")
 ;; W Y Q
 ;;M D @DIXX
 ;; Q
 ;;BEGIN ;

DIQ
DIQ ;SFISC/GFT-CAPTIONED TEMPLATE ;1DEC2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 G INQ^DII
 ;
GET1(DIQGR,DA,DR,DIQGPARM,DIQGETA,DIQGERRA,DIQGIPAR) ;Extrinsic Function
 ; file,record,field,parm,targetarray,errortargetarray,internal
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 G DDENTRY^DIQG
 ;
GETS(DIQGR,DA,DR,DIQGPARM,DIQGTA,DIQGERRA,DIQGIPAR) ;Procedure Call
 ; file,record,field,parm,targetarray,errortargetarray,internal
 I '$D(DIQUIET) N DIQUIET S DIQUIET=1
 I '$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 N DIQGQERR
 D DDENTRY^DIQGQ
 I $G(DIQGQERR)]"" S DIERR=DIQGQERR
 D:$G(DIQGERRA)]"" CALLOUT^DIEFU(DIQGERRA)
 Q
 ;
 ;
CAPTION(DD,DA,A,N,E) ;
 ; Newing of Line Counter 'S' needs to be before call
 N D0,DIQ,DIC,DIQS
 S DIQ(0)=$G(A),DIC=^DIC(DD,0,"GL") I $G(DIA),DD=.6!(DD=1.1) S DIC=DIC_DIA_"," ;In DIQ(0), 'A' means AUDIT, 'R' means SHOW RECORD NUMBER
 S E=$S($G(E)="":"N<0",1:"N]]"""_E_"""")
 S N=$S($G(N)="":-1,1:$O(@(DIC_"DA,N)"),-1))
 D R
 S X=""
 Q
 ;
GUY ;from DII
 N N S N=-1
R S:'$G(IOM) IOM=80 S:'$G(IOSL) IOSL=24,IOST="C-OTHER"
 S:'$D(DTIME) DTIME=300 K DTOUT,DUOUT,DIRUT,DIR
 N DIQDD,DIQAUDE,DIQAUDD,DIQZ,D,DL,D1,D2,D3,D4,D5,D6,D7,D8,D9,DIQE
 S D0=DA,D=DIC_DA_",",DL=1,DIQDD=DD S:'$G(S) S=3
 I '$D(DIQS) W !
 E  D
 .S DIQZ=0,A=0 F  S @("DIQZ=$O("_DIQS_"DIQZ))") Q:DIQZ=""  S @(DIQS_"DIQZ)=""""")
 D 1(DA)
 G Q
 ;
1(DA) ;recursive, for 1 entry or subentry
 N DIQAUD
 I $D(DIQS) D  ;old parameter -- undocumented
 .S DIQZ=0,A=0 F  S @("DIQZ=$O("_DIQS_"DIQZ))") Q:DIQZ=""  D
 ..S A=$O(^DD(DD,"B",DIQZ,0)) Q:'A
 ..I $D(^DD(DD,A,0)) S C=$P(^(0),U,2) I C["C" D COM S @(DIQS_"DIQZ)=X")
 I N<0,$D(^DD(DD,.001,0)) S W=.001,A=-1,Y=@("D"_(DL\2)) D W Q:'S  G A
NUMBER I $G(DIQ(0))["R",DL=1 S W=.001,A=-1,O=$$EZBLD^DIALOG(7099),Y=D0 D W2 Q:'S  ;**CCO/NI THE WORD 'NUMBER'
A I DIQ(0)["A" D  ;Get AUDIT TRAIL data
 .N Z,D,SUB
 .I DL=1 S DIQAUDD="",(DIQAUDE(0),DIQAUDE)=D0 F Z=2:2 Q:'$D(^DD(DIQDD,0,"UP"))  D
 ..S A=DIQDD,DIQDD=^("UP"),(DIQAUDE,DIQAUDE(0))=$P(DIC,",",$L(DIC,",")-Z)_","_DIQAUDE,(DIQAUDD(0),DIQAUDD)=$O(^DD(DIQDD,"SB",A,0))_","_DIQAUDD
 .E  S DIQAUDD=$G(DIQAUDD(0)),DIQAUDE=DIQAUDE(0) F A=3:2:DL S DIQAUDE=DIQAUDE_","_(@("D"_(A\2))),DIQAUDD=DIQAUDD_DIQAUDD(A-1)_","
 .F Z=0:0 S Z=$O(^DIA(DIQDD,"B",DIQAUDE,Z)) Q:'Z  D
 ..S D=$P($G(^DIA(DIQDD,Z,0)),U,3) Q:'D  ;get field number
 ..I DIQAUDD]"" S D=$P(D,DIQAUDD,2,9)
 ..E  I E["]]"!(N]]0) S SUB=$P($P($G(^DD(DIQDD,+D,0)),U,4),";") D
 ...I N]]SUB S D=0 Q
 ...N N S N=SUB I @E S D=0 Q
 ..I D,D'["," S DIQAUD(D,Z)="" Q
N S @("N=$O("_D_"N))") I N="" S N=-1 G END:DL#2,MISSAUD
 I DL=1,@E G END
 S DIQZ=$G(^(N)) I DIQZ]"" S A="" F  S A=$O(^DD(DD,"GL",N,A)) G N:A="" D  G Q:'S ;write out what's on one data node
 .S W=$O(^(A,0)) Q:'W  I A S Y=$P(DIQZ,U,A) Q:Y=""
 .E  S Y=$E(DIQZ,+$E(A,2,9),$P(A,",",2)) Q:Y?." "
 .D W
 I DL#2 S DIQZ=$O(^DD(DD,"GL",N,0,0)) G N:DIQZ="" S O=0,X=+$P(^DD(DD,DIQZ,0),U,2) X:$D(DICS) DICS E  G N
 E  G MISSAUD:N'>0 S X=DD,O=-1,@("D"_(DL\2)_"=N") Q:$$STOP  I $D(DSC(X)) X DSC(X) E  G N ;we've found a new sub-entry
 S DD(DL)=DD,D(DL)=D,N(DL)=N,DL=DL+1,DIQAUDD(DL)=DIQZ S:+N'=N N=""""_N_"""" S D=D_N_",",N=O,DD=X ;down a level
FIND1 I DL#2=0 S N=0 N DIQAUDR K:$G(DIQAUDE) @("DIQE("_DIQAUDE_")") G N ;let's look for the 1st multiple
WP I '$D(DIQS),$P(^DD(DD,.01,0),U,2)["W" S O=$$LABEL^DIALOGZ(DD,.01),C=$P(^DD(DD,.01,0),U,2) D  S DL=DL-1 D WPAUD($G(DIQAUDD(DL)),1) G UP:S Q
 .N DIWF,DIWL,DIWR,DN,N,DD ;Word-processing field
 .D DIQ^DIWW I $D(DN),'DN S S=0
 S N=-1 D 1(DA) Q:'S
UP S DL=DL-1,D=D(DL),DD=DD(DL),N=N(DL) Q:$$STOP  G N ;go back UP a level
 ;
MISSAUD I $G(DIQAUDE) S DIQE=DIQAUDE(0)_"," F  S DIQE=$O(^DIA(DIQDD,"B",DIQE)) Q:'DIQE  Q:DIQE-DIQAUDE  Q:$$STOP  I '$D(@("DIQE("_DIQE_")")) D  ;SHOW MISSING ENTRIES THAT WERE CAPTURED BY AUDIT TRAIL
 .N E,DIQEMISS
 .S E="" F  S E=$O(^DIA(DIQDD,"B",DIQE,E),-1) Q:'E  Q:$$STOP  I $P($G(^DIA(DIQDD,E,0)),U,3)=(DIQAUDD(DL)_",.01") D:'$G(DIQEMISS)  D WRITEAUD
 ..D WRITE($$LABEL^DIALOGZ(DD,.01)_":") W ! S DIQEMISS=1 ;Write the label of the missing multiple
 G UP
 ;
 ;
WPAUD(FLD,CHNGD) N DIWF,DIWL,DIWR,E,O,Z,W,N
 Q:'$G(FLD)
 S E="",DIWF=$E("N",C["L")_"W|",DIWL=7,DIWR=IOM
 F  S E=$O(DIQAUD(FLD,E),-1) Q:'E  Q:$$STOP  D
 .S W=""
 .I $D(^DIA(DIQDD,E,0)) S Z=$P(^(0),U,4),W=W_" on "_$$FMTE^DILIBF($P(^(0),U,2),"IL") I Z]"" S W=W_" by User #"_Z
 .S Z=$G(^(4.1)),O=$P(Z,U),Z=$P(Z,U,2) I O,$D(^DIC(19,O,0)) S W=W_"  ("_$P(^(0),U)_" Option)"
 .I Z S O=+Z,Z=$P(Z,";",2) I Z]"",$D(@(U_Z_O_",0)")) S W=W_"  ("_$P(^(0),U)_" Protocol)"
 .I 'CHNGD S W=$TR($$EZBLD^DIALOG(8197.1),"""")_W_":" ;'DELETED'
 .E  I $O(^DIA(DIQDD,E,2.14,0)) S W="Changed"_W_" from:"
 .E  S W=$$EZBLD^DIALOG(8197.3)_W ;'CREATED'
 .W ?4 D WRITE(W)
 .S W=0,X="" F  D  S W=$O(^DIA(DIQDD,E,2.14,W)) Q:W'>0!(S=0)  S X=^(W,0) D ^DIWP D
 ..N W D LF
 .D ^DIWW
 K DIQAUD(FLD)
 D LF Q
  ;
END Q:$$STOP
 F DIQZ=0:0 S DIQZ=$O(DIQAUD(DIQZ)) Q:'DIQZ  I $D(^DD(DD,DIQZ,0)) D  ;write out audited DELETED fields
 .N D W ?2,$P(^(0),U),":" I $P(^(0),U,2) D WPAUD(DIQZ,0) Q
 .D PRINTAUD(DIQZ) Q:$$STOP
 I S,$G(DIQ(0))["C",$D(@(D_"0)")) D ^DIQ1 ;Computed fields at this level -- ONLY IF ENTRY EXISTS
 Q
 ;
W S O=$$LABEL^DIALOGZ(DD,W),C=$P(^DD(DD,W,0),U,2) I $D(DICS) X DICS E  Q
VP I C["V" D  I $D(^DD(DD,W,0)) ;get naked back
 .N F S F=$P(Y,";",2) I F["(",$D(@("^"_F_"0)"))#2 S F=+$P(^(0),U,2) I F S F=$O(^DD(DD,W,"V","B",F,0)) I F,$D(^DD(DD,W,"V",F,0)) S O=O_" ("_$P(^(0),U,4)_")"
 D Y
 I $D(DIQS) S:$D(@(DIQS_"O)")) @(DIQS_"O)=Y") S:$D(^(W)) @(DIQS_"W)=Y") Q
W2 ;from DIQ1
 N DIQX
 S O=$E(O,1,253-$L(Y))_": "_Y
 D  I $L(O)+DIQX>IOM!$D(DIQAUD(W)) Q:$$STOP  D
 .S DIQX=$S($X:$X+1\40+1*40,W=.01!(W=.001):0,1:2)
 W ?DIQX
 D WRITE(O) D:$D(DIQAUD(W)) PRINTAUD(W) Q
 ;
PRINTAUD(FLD) N E
 S E="" F  S E=$O(DIQAUD(FLD,E),-1) Q:'E  Q:$$STOP  D WRITEAUD
 K DIQAUD(FLD) S @("DIQE("_DIQAUDE_")")=""
 D LF Q
 ;
WRITEAUD N O,Z,W,N ;WRITE AN ENTRY FROM THE AUDIT TRAIL
 S O=$G(^DIA(DIQDD,E,2)),N=$G(^(3))
 I N="" S W=$$EZBLD^DIALOG(8197.1,O) ;**CCO/NI 'DELETED'
 E  S W=$S(O]"":$$EZBLD^DIALOG(8197.2,O),1:$$EZBLD^DIALOG(8197.3)) ;**CCO/NI 'CHANGED FROM' OR 'CREATED'
 I $D(^DIA(DIQDD,E,0)) S:$P(^(0),U,6)="i" W=$$EZBLD^DIALOG(8197.5) K Z S Z(3)=$P(^(0),U,4),Z(2)=$$DATE^DIUTL($P(^(0),U,2)),Z(1)=W,W=$$EZBLD^DIALOG(8197.4,.Z) ;**'ACCESSED'; CCO/NI  WHEN, WHO
 W ?4 D WRITE(W)
 K W S Z=$G(^DIA(DIQDD,E,4.1)),O=$P(Z,U),Z=$P(Z,U,2) I O,$D(^DIC(19,O,0)) S W="  ("_$P(^(0),U)_" Option)"
 I Z S O=+Z,Z=$P(Z,";",2) I Z]"",$D(@(U_Z_O_",0)")) S W="  ("_$P(^(0),U)_" Protocol)"
 I $D(W) D:$X+$L(W)>79 LF Q:'S  W ?(79-$L(W)),W
 Q
 ;
WRITE(DIQW) N DIQWL
 F  S DIQWL=IOM-$X W $E(DIQW,1,DIQWL) S DIQW=$E(DIQW,DIQWL+1,999) Q:DIQW=""  Q:$$STOP
 Q
 ;
Y ;PRINT TEMPLATES CALL HERE    NAKED REFERENCE IS TO ^DD(FILE#,FIELD#,0)
 I $G(Y)="" S Y="" Q
 I C["O",$D(^(2)) X ^(2) Q
S I C["S" D PARSET($$LANGSET,.Y) Q
 I C["P",$D(@("^"_$P(^(0),U,3)_"0)")) S C=$P(^(0),U,2) Q:'$D(^(+Y,0))  S Y=$P(^(0),U) I $D(^DD(+C,.01,0)) S C=$P(^(0),U,2) G S
 I C["V",+Y,Y["(",$D(@("^"_$P(Y,";",2)_"0)")) S C=$P(^(0),U,2) Q:'$D(^(+Y,0))  S Y=$P(^(0),U) I $D(^DD(+C,.01,0)) S C=$P(^(0),U,2) G S
 Q:C'["D"  Q:'Y
D S Y=$$NAKED^DIUTL("$$DATE^DIUTL(Y)") Q  ;GENERAL DATE OUTPUT --NEEDS TO PRESERVE THE NAKED INDICATOR
 ;
 ;
 ;
SET(FILE,FIELD,Y) ;GET EXTERNAL VERSION OF 'Y' FOR A SET FIELD
 I $D(^DD(FILE,FIELD,0)) D PARSET($$LANGSET,.Y)
 Q Y
 ;
PARSET(C,Y) ;FOR SPECIFIER C, CHANGE Y TO ITS EXTERNAL VALUE  called from DIDU & DDS11
 N DIN,%
 S DIN=Y,C=";"_C,%=$F(C,";"_Y_":") I % S Y=$P($E(C,%,999),";")
 Q
 ;
LANGSET() ;USES NAKED REFERENCE TO ^DD(FILE,FIELD,0)
 N C S C=$P(^(0),U,3)
 I $G(DUZ("LANG"))>1 Q $$NAKED^DIUTL("$$SETOUT^DIALOGZ")
 Q C
 ;
 ;
DT D D:Y W Y Q
H G H^DIO2
 ;
STOP() D LF Q 'S
LF I '$D(DIQS),$X W ! S S=S+1
 I '$D(DIOT(2)),$G(IOSL),$S('$D(DIWF):1,$P(DIWF,"B",2):$P(DIWF,"B",2),1:1)+$Y'<IOSL D
 .I '$D(DX(0)),$G(IOST)?1"C".E D:S>(IOSL-3)  Q
 ..N X,Y,DIR S DIR(0)="E" D ^DIR W ! S S='$D(DIRUT)
 .I $G(^UTILITY($J,1))?1U1P1E.E D  S:Y=U!($D(DTOUT))!($D(DUOUT)) S=0
 ..N S X ^(1)
 .S $Y=0
 Q
 ;
EN1 S DRX=DR
EN2 S DR=$P(DRX,";",1),DRX=$P(DRX,";",2,999) D EN W ! G EN2:DRX]""&S
 K DRX Q
EN ;
 N C,O,W,N,E,Z,D,DD S S=0 S:$D(DICSS) DICS=DICSS
 I '$D(IOST)!'$D(IOSL)!'$D(IOM) S IOP="HOME" D ^%ZIS Q:POP  S:'$G(IOM) IOM=80
 G Q:'$D(@(DIC_"0)")) S U="^",DD=+$P(^(0),U,2),DK=DD
 I '$D(DR) S N=-1,O=""
 E  S N=$P(DR,":"),N=$S(0[N:-1,+N=N:N-.000001,1:$E(N,1,$L(N)-1)_$C($A(N,$L(N))-1)),O=$P(DR,":",DR[":"+1) G EN1:DR[";"
 S E="N<0" I O]"" S E=E_"!(N]"""_$S(+O=O:"?"")!(N>"_O_")",1:O_""")")
 I '$D(DIQ(0)) N DIQ S DIQ(0)=""
 D R S DA=D0
Q K C,O,W,N,E,Z,D,DD,IOP Q
 ;
COM X $P(^(0),U,5,99) S C=$P($P(C,"J",2),",",2) I C?1N.E,X S X=$J(X,0,C)

DIQ1
DIQ1 ;SFISC/XAK-INQUIRY WITH COMPUTED FIELDS ;26JAN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
A N DIDQ,DICMX,DIQ1W,D,Z,DIQX
 S DIDQ=DD,DICMX="D LF^DIQ K:'S D I S W O,"": "",X S X="""",O=$J(X,$L(O))"
 N DD
 F DIQ1W=0:0 S DIQ1W=$O(^DD(DIDQ,DIQ1W)) Q:DIQ1W'>0  I $D(^(DIQ1W,0))#2 S Z=^(0),C=$P(Z,U,2) I C["C" S X="",O=$$LABEL^DIALOGZ(DIDQ,DIQ1W)_" (c)" X $P(Z,U,5,99) D:X]""&(C'["m")  Q:'S  ;**CCO/NI  LOOP THRU ALL FIELDS TO FIND COMPUTED
 .N Y,W S Y=X,W=DIQ1W
 .I C["p",Y S Y=$$CP(C,Y)
 .E  I C["D" X ^DD("DD")
 .D W2^DIQ
 Q
 ;
CP(C,X) ;
 S:C["p" C=+$P(C,"p",2) I C,$D(^DIC(C,0,"GL")),$D(@(^("GL")_"0)")),$D(^(X,0)) S X=$$EXTERNAL^DIDU(C,.01,"",$P(^(0),U))
 Q X
 ;
EN ;
 Q:'$D(DIC)!($D(DA)[0)!($D(DR)[0)  S DIL=0,(DA(0),D0)=DA,DIQ0=""
 I $D(DIQ)#2 G Q:DIQ["^"!($E(DIQ,1,2)="DI") S:DIQ'["(" DIQ=DIQ_"("
 S:'$D(DIQ(0)) DIQ(0)="",DIQ0="DIQ(0),"
 I $D(DIQ)[0 S DIQ="^UTILITY(""DIQ1"",$J,",DIQ0="DIQ,"
 S DIQ0=DIQ0_"DIQ0"
 I DIC S DIC=$S($D(^DIC(DIC,0,"GL")):^("GL"),1:"") G:DIC="" Q
L G Q:'$D(@(DIC_"0)")) S DI=+$P(^(0),U,2) G Q:'$D(^(DA,0))
 N DII F DII=1:1 S DIQ1=$P(DR,";",DII) Q:DIQ1=""  D C:DIQ1[":",F:DIQ1>0
Q Q:DIL  K %,I,J,X,Y,C,DA(0),DRS,DIL,DI,DIQ1 K:DIQ0]"" @DIQ0 K:$D(DIQ0) DIQ0
 Q
 ;
C S DIQ2=$P(DIQ1,":",2)
 F DIQ1=DIQ1:0 D F S DIQ1=$O(^DD(DI,DIQ1)) I DIQ1'>0!(DIQ1'<DIQ2) S:DIQ1'=DIQ2 DIQ1=0 Q
 Q
F Q:'$D(^DD(DI,DIQ1,0))
 S Y=^(0),C=$P(Y,U,4),X=$P(C,";",2),C=$P(C,";"),J=$P(Y,U,2) G P:J["C"
 I +C'=C S C=""""_C_""""
 I X=0,$D(^DD(+J,.01,0)) G WD:$P(^(0),U,2)["W",S
 S C=$G(@(DIC_DA_","_C_")")),Y=$S(X["E":$E(C,+$P(X,"E",2),+$P(X,",",2)),1:$P(C,U,X))
 I DIQ(0)["I",(DIQ(0)["N"&(Y]"")!(DIQ(0)'["N")) S @(DIQ_"DI,DA,DIQ1,""I"")")=Y
P Q:DIQ(0)'["E"&(DIQ(0)["I")
 I J["C" X $P(Y,U,5,999) K Y S Y=X D:J["D" D^DIQ
 I J'["C" S C=$P(^DD(DI,DIQ1,0),U,2) D:Y]"" Y^DIQ
 Q:Y=""&(DIQ(0)["N")
 S @(DIQ_"DI,DA,DIQ1"_$S(DIQ(0)'["E":"",1:",""E""")_")")=Y
 Q
WD F X=0:0 S X=$O(@(DIC_"DA,"_C_",X)")) Q:X'>0  S @(DIQ_"DI,DA,DIQ1,X)")=^(X,0)
 Q
S ;
 Q:'$D(DR(+J))  Q:'$D(DA(+J))  N DIQ1,I,DI S DIL=DIL+1
 S DRS(DIL)=DR,DIC(DIL)=DIC,DR=DR(+J),DA(DIL)=DA
 S DI=+J,DIC=DIC_DA_","_C_",",DA=DA(+J),@("D"_DIL)=DA
 D L S DR=DRS(DIL),DA=DA(DIL),DIC=DIC(DIL)
 K DRS(DIL),DIC(DIL),DA(DIL),@("D"_DIL)
 S DIL=DIL-1 Q

DIQG
DIQG ;SFISC/DCL-DATA RETRIEVAL PRIMITIVE ;3MAY2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GET(DIQGR,DA,DR,DIQGPARM,DIQGETA,DIQGERRA,DIQGIPAR) ; file,rec,fld,parm,targetarray,errarray,int
DDENTRY I $G(U)'="^" N U S U="^"
 I '$G(DA) N X S X(1)="RECORD" Q $$F(.X,2)
 S DIQGIPAR=$G(DIQGIPAR),DIQGPARM=$G(DIQGPARM)
 I 'DIQGIPAR N DIQGAUDR,DIQGAUDD S DIQGAUDD=+$P(DIQGPARM,"A",2) I DIQGAUDD D GET^DIAUTL(DIQGR,DA,DIQGAUDD,"DIQGAUDR")
 N DFF,DIQGSI,DIQGDD,DIQGWPB,DIQGWPO S DIQGDD=DIQGPARM["D",DIQGWPB=DIQGPARM["B"
 S DIQGWPO=1
 N DIQGEY S DIQGEY("FILE")=$G(DIQGR),DIQGEY("RECORD")=$G(DA),DIQGEY("FIELD")=$G(DR)
 I '$D(DIQGR) N X S X(1)="FILE" Q $$F(.X,1)
 I 'DIQGR,'DIQGIPAR N X S X(1)="FILE" Q $$F(.X,12)
DA D:$G(DA)["," IEN(DA,.DA)
 I $G(DR)="" N X S X(1)="FIELD" Q $$F(.X,10)
 I 'DIQGIPAR,'DIQGDD Q:$$N9^DIQGU(DIQGR,.DA) $$F(.DIQGEY,16) I '$D(^DD(DIQGR)) N X S X(1)="FILE" Q $$F(.X,18)
 S DIQGETA=$G(DIQGETA) I DIQGETA["("&(DIQGETA'[")") N X S X(1)="TARGET ARRAY" Q $$F(.X,14)
 I DIQGR S DFF=DIQGR,DIQGR=$S(DIQGDD:$$DDROOT(DIQGR),1:$$ROOT^DIQGU(DIQGR,.DA)) I DIQGR="" N X S X(1)="FILE and/or IEN" Q $$F(.X,4)
DFF S DIQGSI=$$CREF(DIQGR) I '$D(DFF) S DFF=+$P($G(@DIQGSI@(0)),U,2) I 'DFF,DIQGPARM'["D" N X S X("FILE")=DIQGSI Q $$F(.X,6)  ;does the file exist?
 I '$D(@DIQGSI@(DA)),'DIQGIPAR,DIQGPARM'["A" Q $$F(.DIQGEY,19)  ;Entry may have existed audited in the past
 I '$G(DT) N DT S DT=$$DT^DIQGU($H)
 N DIQGPI,DIQGZN S DIQGPI=DIQGPARM["I",DIQGZN=DIQGPARM["Z"
 N %,%H,%T,I,J,N,X
D0 S X=0,N="D0" F  S X=$O(DA(X)) Q:X'>0  S I=X,N=N_",D"_X
 N @N
 S @("D"_+$G(I)_"=DA") I $G(I) F J=I-1:-1:0 S @("D"_J_"=DA(I-J)")
 N C,P,Y,DIQGDN,DIQGD4,DIQGDRN
 S (X,Y)="",DIQGDRN=DR
DD S DIQGDN="^DD("_$S(DIQGPARM["D":0,1:DFF)_")" ;name of ^DD
FIELD I DR'?.N,$D(@DIQGDN@("B",DR)) S DIQGDRN=$O(^(DR,"")) I $O(^(DIQGDRN)) N X S X("FILE")=DIQGDN,X(1)=DR Q $$F(.X,15)
 I DIQGDD,DIQGDRN'>0 D  I $E(DIQGDRN,1,6)="$$$ NO" N X S X(1)="ATTRIBUTE" Q $$F(.X,17)
 .S DIQGDRN=$$DDN^DIQGU0(DR) Q:$E(DIQGDRN,1,6)="$$$ NO"
 .S DIQGDN="^DD("_$P(DIQGDRN,"^")_")",DIQGDRN=$P(DIQGDRN,"^",2)
 I DIQGDRN>0,$D(@DIQGDN@(DIQGDRN,0)) S DIQGD4=$P(^(0),"^",4),C=$P(^(0),"^",2),P=$P(DIQGD4,";") G:$P(DIQGD4,";",2)'>0 DIQ S Y=$P($G(@DIQGSI@(DA,P)),"^",$P(DIQGD4,";",2)) G DIQ
TRYCOMP N X,DIQGS I 'DIQGIPAR D EXPR(DFF,DR) ;DON'T ALLOW COMPUTED EXPRESSIONS EXCEPT FROM $$GET1^DIQ
 I $D(X) S C=Y G C:C["m" D CMPAUD(DR,$G(X("USED"))) I $D(X) X X Q X
GIVEUP Q $$F(.DIQGEY,7)
 ;
DIQ I DIQGDRN=.001 S Y=DA
 G BMW:C,REAL:C'["C"
C I C["m" N X D  G:'$D(X) FE Q:DIQGWPO $NA(@DIQGETA) Q "" ;S X(1)="MULTILINE COMPUTED" Q $$F(.X,3)
 .N D,DICMX
 .I DIQGETA="" S X(1)="TARGET ARRAY for the MULTI-LINE COMPUTED FIELD" D BLD^DIALOG(202,.X) K X Q
 .S DICMX="S @DIQGETA@(D"_$S(DIQGZN:",0",1:"")_")=X" ;"Z" PARAMETER SAYS TO PUT ZERO NODES IN MULTIPLE
 .X $P(@DIQGDN@(DIQGDRN,0),U,5,999) ;XECUTE COMPUTED MULTIPLE
 I DIQGDN="^DD(1.005)",DIQGDRN=1 S X=@DIQGSI@(DA,0)
 N DCC,DIQGH,X,DFF S DIQGH=$G(DIERR),DCC=DIQGR,DFF=+$P(DCC,"(",2)
 I $D(@DIQGDN@(DIQGDRN,9.01)),$D(^(9.1)) D CMPAUD(^(9.1),^(9.01)) I $D(X) X X I 1
 E  S X="" X $P(@DIQGDN@(DIQGDRN,0),"^",5,999) ;HELLEVI
 D:DIQGH'=$G(DIERR)
 .N X
 .D BLD^DIALOG(120,"FIELD")
 I $G(X)=""!DIQGPI Q $G(X)
CP I C["p",X S C=+$P(C,"p",2) I C,$D(^DIC(C,0,"GL")),$D(@(^("GL")_"0)")),$D(^(X,0)) Q $$EXTERNAL^DIDU(C,.01,"",$P(^(0),U))
 Q $S(C["D":$$DATE^DIUTL(X),1:X)  ;***
 ;
REAL I $E($P(DIQGD4,";",2))="E" S Y=$E($G(@DIQGSI@(DA,P)),$E($P($P(DIQGD4,";",2),","),2,99),$P($P(DIQGD4,";",2),",",2)) S:Y?." " Y="" ;SPACES ARE NULL
AUDIT I $G(DIQGAUDD) D  ;Is there an AUDIT TRAIL for the field?
 .I $G(DIQGAUDR(DFF,$$DA^DIQGQ(.DA))) S Y="" Q  ;If entry was created after DIQGAUDD, we know there were no FIELD values!
 .S P=$G(DIQGAUDR(DFF,$$DA^DIQGQ(.DA),DIQGDRN))
 .I P S Y=$$DIA^DIAUTL(DIQGAUDD,DIQGAUDR,P)
 .Q:C'["P"!'Y  N F S F=+$P(C,"P",2) Q:F=DIQGEY("FILE")&(Y=DA)
 .S Y=$$GET1^DIQ(F,Y_",",.01,"A"_DIQGAUDD),C=$TR(C,"PO") ;Recurse to get old POINTER value (as long as recursion isn't infinite!)
 I 'DIQGPI&(C["O"!(C["S")!(C["P")!(C["V")!(C["D"))&($D(@DIQGDN@(DIQGDRN,0))) S C=$P(^(0),"^",2) Q $$EXTERNAL^DIDU(+$P(DIQGDN,"(",2),DIQGDRN,"A",Y)  ;"ALLOW" bad data
 Q $G(Y)
 ;
BMW ;PUT WORD-PROCESSING FIELD INTO @DIQGETA
 I C,$P(^DD(+C,.01,0),"^",2)["W" Q:DIQGWPB "$CREF$"_DIQGR_DA_","_$$Q^DIQGU(P)_")" D  G:X="" FE Q:DIQGWPO $NA(@DIQGETA) Q:DIQGIPAR "$WP$" Q ""
 .I DIQGETA']"" K X S X(1)="TARGET ARRAY" D BLD^DIALOG(202,.X) S X="" Q
 .S X=DIQGR_DA_","_$$Q^DIQGU(P)_")"
 .I '$O(@X@(0)) S X="" Q
 .I DIQGZN M @DIQGETA=@X K @DIQGETA@(0) Q
 .S Y=0 F  S Y=$O(@X@(Y)) Q:Y'>0  I $D(^(Y,0)) S @DIQGETA@(Y)=^(0)
 .Q
 I C,$P(^DD(+C,.01,0),"^",2)["M" Q $$F(.DIQGEY,11)
 I DIQGPI!(DIQGDD) Q $G(Y)
 Q $$F(.DIQGEY,8)
CREF(X) N L,X1,X2,X3 S X1=$P(X,"("),X2=$P(X,"(",2,99),L=$L(X2),X3=$TR($E(X2,L),",)"),X2=$E(X2,1,(L-1))_X3 Q X1_$S(X2]"":"("_X2_")",1:"")
WP(DIQGSA,DIQGTA,DIQGZN,DIQGP) N DIQG S DIQG=0 F  S DIQG=$O(@DIQGSA@(DIQG)) Q:DIQG'>0  I $D(^(DIQG,0)) S @$S(DIQGZN:"@DIQGTA@(DIQG,0)",1:"@DIQGTA@(DIQG)")=^(0)
 Q:DIQGP "$WP$" Q ""
DY(Y) Q $$DATE^DIUTL(Y)  ;***
IEN(IEN,DA) S DA=$P(IEN,",") N I F I=2:1 Q:$P(IEN,",",I)=""  S DA(I-1)=$P(IEN,",",I)
 Q
DDROOT(X) Q:'$D(^DD(X)) "" Q "^DD("_X_","
 ;
CMPAUD(DEXPR,DIQGS) ;DEXPR is Expression, DIQGS is string of Fields used
 Q:'$G(DIQGAUDD)
 N I,F,FD,A
 F I=1:1 S F=$P(DIQGS,";",I) Q:F=""  D
 .S A=$G(DIQGAUDR(+F,$$DA^DIQGQ(.DA),$P(F,U,2)))
 .I A S DIQGS(1,+F,$P(F,U,2))=""""_$$CONVQQ^DILIBF($$DIA^DIAUTL(DIQGAUDD,+F,A))_""""
 S DIQGS("TODAY")=DIQGAUDD\1,DIQGS("TODAY","DATE")=1,DIQGS("NOW")=DIQGAUDD,DIQGS("NOW","DATE")=1 ;'TODAY' is the old date!
 ;now we call DICOMP with old (audit) values plugged in to the field's Computed Expression --
 D EXPR(DIQGAUDR,DEXPR)
 Q
EXPR(DIFILE,DIEXPR) I DIQGPI K X Q:$TR(DIEXPR," 1234567890.?")=""  S DIEXPR="INTERNAL("_DIEXPR_")"
 D EXPR^DICOMP(DIFILE,"",DIEXPR,.DIQGS)
 I 'DIQGPI,$G(Y)["D",Y'["m",$D(X)#2 S X=X_" S X=$$DATE^DIUTL(X)"
 Q
 ;
F(DIQGEY,X) D BLD^DIALOG($P($T(TXT+X),";",4),.DIQGEY)
FE I $G(DIQGERRA)]"" D CALLOUT^DIEFU(DIQGERRA)
 Q ""
TXT ;;
 ;;file root/ref invalid;202;1
 ;;record invalid;202;2
 ;;multiline computed;520;3
 ;;file ref invalid;202;4
 ;;field name/number invalid;202;5
 ;;DD ref for file/field invalid;401;6
 ;;unable to find field name;200;7
 ;;unable to identify type of data in DD;510;8
 ;;unable to resolve extended ref;501;9
 ;;field ref missing;202;10
 ;;multiple field - invalid parameters;309;11
 ;;file number not passed or invalid;202;12
 ;;;;13
 ;;invalid target array;202;14
 ;;ambiguous field name;505;15
 ;;record unavailable;602;16
 ;;invalid attribute;202;17
 ;;file not found;202;18
 ;;record entry does not exist;601;19
 ;;;;20

DIQGDD
DIQGDD ;SFISC/DCL-DATA DICTIONARY ATTRIBUTE RETRIEVER ;10:55 AM  8 Nov 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
GET(DIQGR,DA,DR,DIQGPARM,DIQGETA,DIQGERRA,DIQGIPAR) ;
EN3 I $G(U)'="^" N U S U="^"
 I $G(DIQGIPAR)'["A" K DIERR,^TMP("DIERR",$J)
 I $G(DIQGR)'>0 N X S X(1)="FILE" Q $$F^DIQG(.X,1)
 I $G(DA)']"" S DA=DIQGR,DIQGR=1 I '$D(^DIC(DA,0)) S X(1)="FILE" Q $$F^DIQG(.X,1)
 S:DIQGR>1 DIQGPARM=$G(DIQGPARM)_"D"
 I DA'?.N,$D(^DD(DIQGR,"B",DA)) S DA=$O(^(DA,"")) I $O(^(DA)) D 200 Q ""
 I DA'>0 D 200 Q ""
 I DR="FIELD LENGTH" Q $$FL^DIQGDDU(DIQGR,DA)
 I DR="REQUIRED IDENTIFIERS" G RI^DIQGDDU
 N DRSV S DRSV=DR N DR
 S DR=$$ATRBT(DIQGR=1,$G(DRSV)) I 'DR D 202("ATTRIBUTE") Q ""
 G DDENTRY^DIQG
 ;
FIELD(DIQGR,DA,DR,DIQGPARM,DIQGTA,DIQGERRA,DIQGIPAR) ;
EN1 N DIQGERR,DIQGEY,DIQGSAL,DIQGFNUL,DIQGSALX,DIQGTAXX
 S DIQGEY(1)=$G(DIQGR)
 I $G(U)'="^" N U S U="^"
 I $G(DIQGIPAR)'["A" K DIERR,^TMP("DIERR",$J)
 I $G(DIQGR)'>0 D 202("FILE") Q
 I $G(DA)']"" D 202("FIELD") Q
 I $D(^DD(DIQGR,0))[0 D 202("FILE") Q
 I $G(DIQGTA)']"" D 202("TARGET ARRAY") Q
 S DIQGPARM=$G(DIQGPARM)_"D",DIQGFNUL=DIQGPARM["N"
 I DA'?.N,$D(^DD(DIQGR,"B",DA)) S DA=$O(^(DA,"")) I $O(^(DA)) N X S X(1)=DA,X("FILE")=DIQGR D BLD^DIALOG(505,.X),FE Q
 I DA'>0 S DIQGEY(3)=DA D 200 Q
 I $D(^DD(DIQGR,DA,0))[0 S DIQGEY(3)=DA D 200 Q
 D BLDSAL(0,.DR,.DIQGSAL)
 I '$D(DIQGSAL),'$D(DIERR) D 200 Q
 I '$D(DIQGSAL) Q
 S DIQGSAL="" F  S DIQGSAL=$O(DIQGSAL(DIQGSAL)) Q:DIQGSAL=""  D
 .S DIQGTAXX=$S('$D(DIQGSAL(DIQGSAL,"#(word-processing)")):DIQGTA,1:$$OREF(DIQGTA)_$$Q(DIQGSAL)_")")
 .I DIQGSAL="FIELD LENGTH" S DIQGSALX=$$FL^DIQGDDU(DIQGR,DA) G SET
 .S DIQGSALX=$$GET^DIQG("^DD("_DIQGR_",",DA,DIQGSAL(DIQGSAL),DIQGPARM,DIQGTAXX,"","1A")
SET .I DIQGSALX]"" S @DIQGTA@(DIQGSAL)=DIQGSALX Q
 .Q:DIQGFNUL
 .S @DIQGTA@(DIQGSAL)=DIQGSALX
 .Q
 Q
 ;
BLDSAL(DIQGTYPE,DIQGDR,DIQGVALA) ;DIQGTYPE=1 for FILE and 0 for FIELD, DIQGDR=string/array, DIQGVALA=valid attribute list array
 ; * If DIQGDR is an array pass by reference *
 I $G(DIQGDR)="*" D LIST^DIQGDDT($S(DIQGTYPE=1:"FILETXT",1:"FIELDTXT"),.DIQGVALA,"",3) Q
 N DIQGER,DIQGI,DIQGX,DIQGY D LIST^DIQGDDT($S(DIQGTYPE=1:"FILETXT",1:"FIELDTXT"),.DIQGX,"",3)
 I $G(DIQGDR)]"" F DIQGI=1:1 S DIQGY=$P(DIQGDR,";",DIQGI) Q:DIQGY=""  D
 .I '$D(DIQGX(DIQGY)) S DIQGER(4)=DIQGY D 200 Q
 .S DIQGVALA(DIQGY)=DIQGX(DIQGY) S:$D(DIQGX(DIQGY,"#(word-processing)")) DIQGVALA(DIQGY,"#(word-processing)")=DIQGX(DIQGY)
 Q:$D(DIQGVALA)
 S DIQGY="" F  S DIQGY=$O(DIQGDR(DIQGY)) Q:DIQGY=""  D
 .I '$D(DIQGX(DIQGY)) S DIQGER(4)=DIQGY D 200 Q
 .S DIQGVALA(DIQGY)=DIQGX(DIQGY) S:$D(DIQGX(DIQGY,"#(word-processing)")) DIQGVALA(DIQGY,"#(word-processing)")=DIQGX(DIQGY)
 .Q
 Q
 ;
XDR(DIQGR,DR,DIQGERR) ;DIQGR DD FILE NUMBER EITHER 1 OR 0
 ;DR IS DR STRING TO CONVERT TO NUMERIC DR STRING
 S DIQGR=+$G(DIQGR),DR=$G(DR)
 N I,X,XDR D LIST^DIQGDDT($S(DIQGR=1:"FILETXT",1:"FIELDTXT"),.X,4,3)
 I $G(DR)]"" S (X,XDR)="" F I=1:1 S X=$P(DR,";",I) Q:X=""  D
 .I '$D(X(X)) S DIQGERR(X)="" Q
 .S XDR=XDR_X(X)_";" Q
 I $D(DR)>1 S (X,XDR)="" F  S X=$O(DR(X)) Q:X=""  D:'$D(X(X))  S:X]"" XDR=XDR_X(X)_";"
 .I '$D(X(X)) S DIQGERR(X)="" Q
 .S XDR=XDR_X(X)_";" Q
 Q XDR
 ;
ATRBT(TYPE,ATRIB) ;EXTRINSIC FUNCTION $$TEST IF VALID ATTRIBUTE
 ;TYPE 0 OR 1 - FIELD=0, FILE=1 (^DD(0) OR ^DD(1))
 ;ATRIB=ATTRIBUTE BEING REQUESTED
 Q:ATRIB']"" 0
 N X D LIST^DIQGDDT($S(TYPE=1:"FILETXT",1:"FIELDTXT"),.X,,3)
 Q $G(X(ATRIB))
DR(TYPE) ;TYPE=1,FILE OR 0,FIELD AND RETURNS DR STRING FOR ALL ATTRIBUTES IN INTERNAL FORM (ATTRIBUTE FIELD NUMBERS 3RD ;-PIECE
 S TYPE=+$G(TYPE)
 N X,Y
 D LIST^DIQGDDT($S(TYPE=1:"FILETXT",1:"FIELDTXT"),.X,3)
 S (X,Y)=.01 F  S Y=$O(X(Y)) Q:Y'>0  S X=X_";"_Y
 Q X
 ;
FILELST(DIDARRAY) ;PASS TARGET ARRAY BY REFERENCE * * LIST FILE ATTRIBUTES * *
EN4 N EQL,TP,TYPE,DIQGDFLG
 S TYPE="FILETXT",DIQGDFLG="L"
 G ENLST^DIQGDDT
 ;
FIELDLST(DIDARRAY) ;PASS TARGET ARRAY BY REFERENCE * * LIST FIELD ATTRIBUTES * *
EN5 N EQL,TP,TYPE,DIQGDFLG
 S TYPE="FIELDTXT",DIQGDFLG="L"
 G ENLST^DIQGDDT
 ;
OREF(X) N X1,X2 S X1=$P(X,"(")_"(",X2=$$OR2($P(X,"(",2)) Q:X2="" X1 Q X1_X2_","
OR2(%) Q:%=")"!(%=",") "" Q:$L(%)=1 %  S:"),"[$E(%,$L(%)) %=$E(%,1,$L(%)-1) Q %
Q(%Z) S %Z(%Z)="",%Z=$Q(%Z("")) Q $E(%Z,4,$L(%Z)-1)
200 D BLD^DIALOG(200),FE Q
202(E) N X S X(1)=E
 D BLD^DIALOG(202,.X),FE
 Q
FE I $G(DIQGERRA)]"" D CALLOUT^DIEFU(DIQGERRA)
 Q

DIQGDD0
DIQGDD0 ;SFISC/DCL-NODE PIECE LOOKUP FOR DD ;09:26 AM  5 Jan 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
NPS(DIQGDDN,DIQGNP) ;(CLOSEREFERENCE,PIECE)
 ;NODE PIECE SEARCH - DIQGDDN IS DD NUMBER - DIQGNP IS PIECE
 ; * * RETURNS FIELD NUMBER * *
 Q:$G(DIQGDDN)'>0 "" Q:$G(DIQGNP)="" ""
 N DIQGDDRT,DIQGDDRO,DIQGDDRN,DIQGFLD
 S DIQGDDRT="^DD("_DIQGDDN_")"
 S DIQGDDRO=0,DIQGFLD=""
 F  S DIQGDDRO=$O(@DIQGDDRT@(DIQGDDRO)) Q:DIQGDDRO'>0  D  Q:DIQGFLD
 .Q:'$D(@DIQGDDRT@(DIQGDDRO,0))  S DIQGDDRN=$P(^(0),"^",4)
 .I DIQGNP=DIQGDDRN S DIQGFLD=DIQGDDRO Q
 .I $P(DIQGDDRN,";")'?.N S $P(DIQGDDRN,";")=$$Q($P(DIQGDDRN,";")) I DIQGNP=DIQGDDRN S DIQGFLD=DIQGDDRO Q
 .I $P(DIQGDDRN,";")=$P(DIQGNP,";"),$E($P(DIQGDDRN,";",2))="E" S DIQGFLD=DIQGDDRO Q
 .Q
 Q DIQGFLD
 ;
Q(%Z) ;(PLACE QUOATES AROUND %Z)
 S %Z(%Z)="",%Z=$Q(%Z("")) Q $E(%Z,4,$L(%Z)-1)
 ;
FN(DIQGROOT) ;(CLOSEDREFERENCE)
 ; * * RETURNS FILE NUMBER * *
 ;CONVERT ROOT TO FILE NUMBER
 Q:$L($G(DIQGROOT),",")'>1 ""
 Q:$E(DIQGROOT,$L(DIQGROOT))'=")" ""
 N I,L,T,X,Y
 S X=DIQGROOT,L=$L(X),T=""
 F I=L:-1 S Y=$E(X,I) S:Y=","!(Y="(") T=T=0 Q:Y=""  I T,((Y=",")!(Y="(")) Q
 I I,$D(@($E(X,1,I)_"0)")) Q +$P(^(0),"^",2)
 Q ""
 ;
NP(ROOT,PIECE) ;CONVERT ROOT AND PIECE TO NODE;PIECE
 ; * * RETURNS 'NODE;PIECE' * *
 Q:$G(ROOT)="" "" Q:$G(PIECE)="" ""
 Q $P($P(ROOT,",",$L(ROOT,",")),")")_";"_PIECE
 ;
PIECE(DIQGR,DA,DR,DIQGPARM,DIQGTA,DIQGERRA,DIQGIPAR) ;CLOSEDREF,PIECE,ATTRIBUTE,FLAG,TARGETARRAY,ERRORARRAY,INTERNAL
EN6 ;PROCEDURE CALL AND  * * RETURN RESULTS IN TARGET ARRAY * *
 I $G(U)'="^" N U S U="^"
 N DIQGNP S DIQGR=$G(DIQGR),DA=$G(DA)
 S DIQGNP=$$NP(DIQGR,DA) I DIQGNP="" G 200
 S DIQGR=$$FN(DIQGR) I DIQGR="" G 200
 S DA=$$NPS(DIQGR,DIQGNP) I DA'>0 G 200
 G EN1^DIQGDD
 ;
200 D BLD^DIALOG(200)
 I $G(DIQGERRA)]"" D CALLOUT^DIEFU(DIQGERRA)
 Q

DIQGDDF
DIQGDDF ;SFISC/DCL,MMW-DD ATTRIBUTE RETRIEVER (FILES) ;12:44 PM  26 Sep 1996
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q  ;not for interactive use
FILE(DIQGR,DR,DIQGPARM,DIQGTA,DIQGERRA,DIQGIPAR) ;
EN2 N DA
 I '$G(DIQGR),$G(DIQGR)]"",$D(^DIC("B",DIQGR)) S DIQGR=$O(^(DIQGR,""))
 N DIQGERR,DIQGEY,DIQGSAL,DIQGFNUL,DIQGSALX,DIQGTAXX
 S DIQGEY(1)=$G(DIQGR)
 I $G(U)'="^" N U S U="^"
 I $G(DIQGIPAR)'["A" K DIERR,^TMP("DIERR",$J)
 I $G(DIQGR)'>0 D 202^DIQGDD("FILE") Q
 I $D(^DD(DIQGR,0))[0 D 202^DIQGDD("FILE") Q
 S DA=DIQGR,DIQGR=1 I '$D(^DIC(DA,0)) D 202^DIQGDD("FILE") Q
 I $G(DIQGTA)']"" D 202^DIQGDD("TARGET ARRAY") Q
 S DIQGPARM=$G(DIQGPARM),DIQGFNUL=DIQGPARM["N"
 I DA'>0 S DIQGEY(3)=DA D 200^DIQGDD Q
 D BLDSAL^DIQGDD(1,.DR,.DIQGSAL)
 I '$D(DIQGSAL),'$D(DIERR) D 200^DIQGDD Q
 I '$D(DIQGSAL) Q
 S DIQGSAL="" F  S DIQGSAL=$O(DIQGSAL(DIQGSAL)) Q:DIQGSAL=""  D
 .I DIQGSAL="REQUIRED IDENTIFIERS" D  Q
 ..N X
 ..S X=$$RIF^DIQGDDU(DA,DIQGSAL,DIQGTA)
 ..S:X]"" @DIQGTA@(DIQGSAL)=X
 ..Q
 .S DIQGTAXX=$S('$D(DIQGSAL(DIQGSAL,"#(word-processing)")):DIQGTA,1:$$OREF^DIQGDD(DIQGTA)_$$Q^DIQGDD(DIQGSAL)_")")
 .S DIQGSALX=$$GET^DIQG("^DIC(",DA,DIQGSAL(DIQGSAL),DIQGPARM,DIQGTAXX,"","1A")
SETF .I DIQGSALX]"" S @DIQGTA@(DIQGSAL)=DIQGSALX Q
 .Q:DIQGFNUL
 .S @DIQGTA@(DIQGSAL)=DIQGSALX
 .Q
 Q

DIQGDDT
DIQGDDT ;SFISC/DCL-DATA DICTIONARY ATTRIBUTE TEXT ;8/15/96  13:29
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
LIST(TYPE,DIDARRAY,TP,EQL) ;DO CALL
 ;TYPE="FILETXT" OR "FIELDTXT"
 ;DIDARRAY=TARGET ARRAY - IS LOCAL ARRAY PASSED BY REFERENCE WHICH WILL BE SEEDED WITH FILE OR FIELD ATTRIBUTES
 ;TP=TEXT PIECE USING ; AS DELIMITER
 ;EQL=EQUAL TO - NULL IS DEFAUL OR PIECE OF TXT
ENLST S:$G(TP)'>0 TP=4 S:$G(EQL)'>0 EQL=99
 N DIQGI,DIQGX,DIQGY F DIQGI=1:1 S DIQGX=$T(@TYPE+DIQGI),DIQGY=$P(DIQGX,";",TP) Q:DIQGY=""  D
 .S DIDARRAY(DIQGY)=$P(DIQGX,";",EQL)
 .S:$P(DIQGX,";",5)]"" DIDARRAY(DIQGY,"#(word-processing)")=$S($G(DIQGDFLG)["L":"",1:$P(DIQGX,";",5))
 .I $P(DIQGX,";",6)]"" D
 ..N TYPE
 ..S TYPE=$P(DIQGX,";",7)
 ..N DIQGI,DIQGX,DIQGYS
 ..F DIQGI=1:1 S DIQGX=$T(@TYPE+DIQGI) Q:$P(DIQGX,";",4)=""  D
 ...S DIQGYS=$P(DIQGX,";",4),DIDARRAY(DIQGY,"#",DIQGYS)=""
 ...Q
 .Q
 ;DIQGI,DIQGY ARE SCRATCH VARIABLES USED TO BUILD ARRAY
 ;DIQGI INDEXES TEXT AND DIQGY CONTAINS THE ATTRIBUTE NAME
 Q
DD N %,%ZISOS,A,D0,D1,D2,DA,DIC,DIW,DIWF,DIWL,DIWR,DIWT,DK,DL,DN,DX,I,POP,S,X,Y,DIQGF,DIQGFN
 S DIC=1,DIC(0)="AEMQ" D ^DIC Q:Y'>0  ;Select file
 S DIC="^DD("_+Y_",",DIQGFN=+Y
 D F(DIQGFN,.DIQGF)
 D ^%ZIS Q:POP  U IO
 S DIC="^DIC(",DA=DIQGFN
 D EN^DIQ
 S X=""
 F  S X=$O(^DIC(DIQGFN,0,X)) Q:X=""  W !,X,"=",^(X)
 S DIQGF="" F  S DIQGF=$O(DIQGF(DIQGFN,DIQGF)) Q:DIQGF=""  D
 .W !,$$L("=",IOM),!,"DD NUMBER: ",DIQGF,!
 .S DA="" F  S DA=$O(DIQGF(DIQGFN,DIQGF,DA)) Q:DA=""  D
 ..W !,$$L("-",IOM),!
 ..S DIC="^DD("_DIQGF_"," D EN^DIQ
 ..Q
 .Q
 W !!,"End of Report",!!
 D ^%ZISC
 Q
 ;
L(X,RM) Q $TR($J("",RM)," ",X)
 ;
F(DIQGDICN,DIQGFSTA,DIQGSEL,DIQGDEL) ;
 ;  DIQGDICN file number
 ;  DIQGFSTA Field Selected Target Array(can be passed by reference or
 ;                                       as a reference)
 ;  DIQGSEL Selection Marker(optional)
 ;  DIQGDEL Deselection Marker (optional)
 N %,%Y,DA,DDC,DIC,DIQGDWN,DIQGTGA,X,Y
 I $D(@("^DIC("_DIQGDICN_",0)")) W !!?4,"'",$P(^(0),"^"),"' FILE",!
 S:'$D(DIQGSEL) DIQGSEL="+" S:'$D(DIQGDEL) DIQGDEL="-"
 S DIC="^DD("_DIQGDICN_",",DIC(0)="AEMQ",X=$E($G(DIQGFSTA)),DIQGTGA=(X="^"!(X=".")) S:X="." DIQGFSTA=$E(DIQGFSTA,2,99)
M S DIC("W")="W:$P(^(0),U,2) $S($P(^DD(+$P(^(0),U,2),.01,0),U,2)[""W"":""  (word-processing)"",1:""  (multiple)"") W:$D("_$S(DIQGTGA:"@DIQGFSTA@(DIQGDICN,+$E(DIC,5,99),+Y)",1:"DIQGFSTA(DIQGDICN,+$E(DIC,5,99),+Y)")_") DIQGSEL"
 D ^DIC I Y'>0,$D(@(DIC_"0,""UP"")")) S DIC="^DD("_+^("UP")_"," G M ;Select field/back out of multiples
 S DIQGDWN="" I Y>0,$P(@(DIC_+Y_",0)"),U,2) S DIQGDWN=+$P(^(0),U,2) I $P(^DD(+$P(^(0),U,2),.01,0),U,2)'["W" D T(DIQGDWN) S DIC="^DD("_DIQGDWN_"," G M
 I Y>0,DIQGDWN>0 D T(DIQGDWN) G M
 I Y>0 D T() G M
 Q
T(DWN) ;
 D @$S(DIQGTGA:"TAR(+$E(DIC,5,99),+Y,$G(DWN))",1:"TBR(+$E(DIC,5,99),+Y,$G(DWN))")
 Q
TAR(DDFN,FLD,DWNFN) ;Target array is in DIQGFSTA As a global/local Reference
 I DWNFN S @DIQGFSTA@(DIQGDICN,DWNFN)=DDFN_"^"_FLD
 I '$D(@DIQGFSTA@(DIQGDICN,DDFN,FLD)) S @DIQGFSTA@(DIQGDICN,DDFN,FLD)=$S(DWNFN:DWNFN,1:"") Q
 I DWNFN,$D(@DIQGFSTA@(DIQGDICN,DWNFN))>9 Q
 N X S X=$G(@DIQGFSTA@(DIQGDICN,DDFN,FLD)) I X K @DIQGFSTA@(DIQGDICN,$P(X,"^"))
 K @DIQGFSTA@(DIQGDICN,DDFN,FLD) W DIQGDEL Q
 Q
TBR(DDFN,FLD,DWNFN) ;Target array DIQGFSTA is a local array passed By Reference
 I DWNFN S DIQGFSTA(DIQGDICN,DWNFN)=DDFN_"^"_FLD
 I '$D(DIQGFSTA(DIQGDICN,DDFN,FLD)) S DIQGFSTA(DIQGDICN,DDFN,FLD)=$S(DWNFN:DWNFN,1:"") Q
 I DWNFN,$D(DIQGFSTA(DIQGDICN,DWNFN))>9 Q
 N X S X=$G(DIQGFSTA(DIQGDICN,DDFN,FLD)) I X K DIQGFSTA(DIQGDICN,$P(X,"^"))
 K DIQGFSTA(DIQGDICN,DDFN,FLD) W DIQGDEL Q
 Q
 ;
 ;ATRBUTE FLD #;ATRBUTE NAME;1=WORD PROCESSING
FILETXT ;
 ;;.01;NAME;
 ;;1;GLOBAL NAME;
 ;;1.1;ENTRIES;
 ;;4;DESCRIPTION;1
 ;;20;DEVELOPER;
 ;;21;DATE;
 ;;31;DD ACCESS;
 ;;32;RD ACCESS;
 ;;33;WR ACCESS;
 ;;34;DEL ACCESS;
 ;;35;LAYGO ACCESS;
 ;;36;AUDIT ACCESS;
 ;;50;LOOKUP PROGRAM;
 ;;51;VERSION;
 ;;51.1;DISTRIBUTION PACKAGE;
 ;;51.2;PACKAGE REVISION DATA;
 ;;54;ARCHIVE FILE;
 ;;100.6;REQUIRED IDENTIFIERS;;1;RI
 ;;
FIELDTXT ;
 ;;.01;LABEL;
 ;;.1;TITLE;
 ;;.2;SPECIFIER;
 ;;.24;DECIMAL DEFAULT;
 ;;.25;TYPE;
 ;;.26;COMPUTE ALGORITHM;
 ;;.28;MULTIPLE-VALUED;
 ;;.3;POINTER;
 ;;.4;GLOBAL SUBSCRIPT LOCATION;
 ;;.5;INPUT TRANSFORM;
 ;;1.1;AUDIT;
 ;;1.2;AUDIT CONDITION;
 ;;2;OUTPUT TRANSFORM;
 ;;3;HELP-PROMPT;
 ;;4;XECUTABLE HELP;
 ;;8;READ ACCESS;
 ;;8.5;DELETE ACCESS;
 ;;9;WRITE ACCESS;
 ;;9.01;COMPUTED FIELDS USED;
 ;;10;SOURCE;
 ;;21;DESCRIPTION;1
 ;;23;TECHNICAL DESCRIPTION;1
 ;;50;DATE FIELD LAST EDITED;
 ;;200;FIELD LENGTH;
 ;
RI ;REQUIRED IDENTIFIERS
 ;;1;FIELD;
 ;;

DIQGDDU
DIQGDDU ;SFISC/DCL-DATA DICTIONARY UTILITIES ;1:16 PM  26 Sep 1996
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
FL(DIQGFILE,DIQGFLD) ;Return field length
 ;Short version of DIOS1
 ;In:
 ;  DIQGFILE = file#
 ;  DIQGFLD  = field#
 ;
 I $G(DIQGFILE)'>0 D ERR202("FILE NUMBER") Q ""
 I $G(DIQGFLD)'>0 D ERR202("FIELD NUMBER") Q ""
 ;
 N DD,DIIT,DN,W
 S DD=$G(^DD(DIQGFILE,DIQGFLD,0))
 I DD?."^" D ERR1700("DD FOR FILE#"_DIQGFILE_", FIELD#"_DIQGFLD_" DOES NOT EXIST") Q ""
 ;
 S W=0,DN=$P(DD,"^",2),DIIT=$P(DD,"^",5,999)
 ;
 I DN S W=$$FL(+DN,.01)
 E  I DN["W" S W=""
 E  I DN["P" S W=$$FL(+$P(DN,"P",2),.01)
 E  I DN["J" S W=+$P(DN,"J",2)
 ;
 E  I DN["S" D
 . N C,C1,P
 . S C=$P(DD,U,3)
 . F P=1:1 S C1=$P(C,";",P) Q:C1=""  S W=$$MAX(W,$L($P(C1,":",2)))
 ;
 E  I DN["D" D
 . N D
 . S D=$P($P(DIIT,"S %DT=""",2,999),"""")
 . S W=$S(D["S"&(D["T"):21,D["T":18,1:12)
 ;
 E  I DN["V" D
 . N N
 . S N=0
 . F  S N=$O(^DD(DIQGFILE,DIQGFLD,"V",N)) Q:'N  S:$G(^(N,0)) W=$$MAX(W,$$FL(+^(0),.01))
 ;
 E  I DIIT["$L(X)>" S W=+$P(DIIT,"$L(X)>",2)
 E  S W=+$P($P($P($P(DD,"^",4),";",2),"E",2),",")
 ;
 S:W=0 W=30
 Q W
 ;
MAX(X,Y,Z) ;Return maximum of 2 or 3 numbers
 N M
 S M=$S(X>Y:+X,1:+Y),M=$S(M>$G(Z):M,1:+$G(Z))
 Q M
 ;
ERR202(DIQGERR) ;Error processing
 N P S P(1)=DIQGERR
 D BLD^DIALOG(202,.P)
 Q
ERR1700(DIQGERR) ;Error processing
 N P S P(1)=DIQGERR
 D BLD^DIALOG(1700,.P)
 Q
 ;
RIF(DA,DR,DIQGETA) ;FUNCTION CALL FOR RI
RI ;REQUIRED IDENTIFIERS - CALLED BY EN3^DIQGDD
 ;DA=FILENR,DR="REQUIRED IDENTIFIERS",DIQGETA=TARGET_ARRAY
 N DIQGRIA,DIQGRI,DIQGR
 D REQIDS^DICU(DA,"DIQGRIA")
 S DIQGRIA="",DIQGRI=0
 F  S DIQGRIA=$O(DIQGRIA(DR,DIQGRIA)) Q:DIQGRIA=""  D
 .S DIQGRI=DIQGRI+1,@DIQGETA@(DR,DIQGRI,"FIELD")=DIQGRIA
 .Q
 Q $S(DIQGRI:$NA(@DIQGETA@(DR)),1:"")

DIQGQ
DIQGQ ;SFISC/DCL-DATA RETRIEVAL ;03:48 PM  26 Mar 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DIQGR,DA,DR,DIQGPARM,DIQGTA,DIQGERRA,DIQGIPAR) ;RECURSIVELY CALLED FROM BELOW
DDENTRY N DIQGQE S DIQGQE=0
 I $G(U)'="^" N U S U="^"
 I '$G(DA) N X S X(1)="RECORD" G 202
 ;K DIERR,^TMP("DIERR",$J)
 ;N DIERR
 N DIQGCP,DIQGDD S DIQGPARM=$G(DIQGPARM),DIQGIPAR=$G(DIQGIPAR),DIQGDD=DIQGPARM["D",DIQGCP=$S(DIQGDD:"D",1:"") S:DIQGPARM["Z" DIQGCP=DIQGCP_"Z" S:DIQGPARM["F" DIQGCP=DIQGCP_"F"
 N DIQGFE,DIQGFEN S DIQGFE=DIQGPARM["R"
 N DIQGFET S DIQGFET=DIQGPARM["T"
 I '$D(DIQGR) N X S X(1)="FILE" G 202
 N DIQGI1 S DIQGI1=+DIQGIPAR=0
 I DIQGI1,'DIQGR N X S X(1)="FILE" G 202
 D:$G(DA)["," IEN(DA,.DA)
 I DIQGI1,'DIQGDD,$$N9^DIQGU(DIQGR,.DA) D BLD^DIALOG(602) G OUT
 I '$D(DR) N X S X(1)="FIELD" G 202
 I DIQGI1,$G(DIQGTA)']"" N X S X(1)="TARGET ARRAY" G 202
 I DIQGI1,("("[$G(DIQGTA)&(")"'[$G(DIQGTA))) N X S X(1)="TARGET ARRAY" G 202
 S:DIQGR DIQGR=$S(DIQGDD:$$DD(DIQGR),1:$$ROOT^DIQGU(DIQGR,.DA)) I DIQGR="" N X S X(1)="FILE AND IEN COMBINATION" G 202
 N DIQGMDD,DIQGE,DIQGI,DIQGXXE,DIQGXXI,DIQGSI,DIQGXAF,DIQGXPRI,DIQGXPRE,DIQGXPRN,DIQGXPRF,DIQGXDD,DIQGXDDN,DIQGXPRA,DIQGXTA,DIQGXDA,DIQGXPRS,DIQGPRSE S DIQGPRSE=1
 S DIQGSI=$$CREF(DIQGR),DIQGXAF=0,DIQGXPRI=DIQGPARM["I",DIQGXPRE=DIQGPARM["E",DIQGXPRN=DIQGPARM["N",DIQGXPRF=DIQGPARM["F",DIQGXPRS=DIQGPARM["S" S:DIQGXPRS DIQGXPRE=1,DIQGXPRI=1 S DIQGXPRA=DIQGXPRE!DIQGXPRI
 I '$D(@DIQGSI@(DA)),DIQGPARM'["A" D BLD^DIALOG(601) G OUT ;Entry may have existed in the past
 S:$D(@DIQGSI@(0)) DIQGXDDN=+$P(^(0),"^",2),DIQGXDD="^DD("_DIQGXDDN_")" I '$D(DIQGXDD) N X S X("FILE")=DIQGR D BLD^DIALOG(401,.X) G OUT
 S:'DIQGXDDN DIQGXDDN=+$P(DIQGR,"(",2)
 I $D(DIQGTA)=1,DIQGTA]"",DIQGTA'>0 S DIQGXAF=1,DIQGXTA=DIQGTA S DIQGXTA=$$CREF(DIQGXTA)
 N DIQGXDC,DIQGXDF,DIQGXDI,DIQGXDN,DIQGXDT S DIQGXDC=0
AUDIT I DIQGIPAR'["R" N DIQGAUDR,DIQGAUDD S DIQGAUDD=+$P(DIQGPARM,"A",2) I DIQGAUDD D GET^DIAUTL(DIQGXDDN,DA_",",DIQGAUDD,"DIQGAUDR") ;is there an AUDIT TRAIL??
 F DIQGXDI=1:1 S DIQGXDF=$P(DR,";",DIQGXDI),DIQGXDN=$P(DIQGXDF,":") Q:DIQGXDF=""  D  I $L(DIQGXDF,":")>1  S DIQGXDT=$P(DIQGXDF,":",2) F  S DIQGXDN=$O(@DIQGXDD@(+DIQGXDN)) Q:DIQGXDN'>0!(DIQGXDN>DIQGXDT)  S DIQGXDC=$P(^(DIQGXDN,0),"^",2) D  ;
 .I DIQGXDC,$P(^DD(+DIQGXDC,.01,0),"^",2)'["W" S:DR="**" DIQGXDN=DIQGXDN_"*" Q:$L(DIQGXDN,"*")'=2
 .I DIQGXDN'?.N,$L(DIQGXDN,"*")=2,$P(DIQGXDN,"*")]"",$D(@DIQGXDD@("B",$P(DIQGXDN,"*"))) S DIQGXDN=$O(^($P(DIQGXDN,"*"),""))_"*"
 .I $L(DIQGXDN,"*")=2,+DIQGXDN>0 S DIQGMDD=+$P($G(@DIQGXDD@(+DIQGXDN,0)),"^",2) I DIQGMDD,$P(^DD(DIQGMDD,.01,0),"^",2)'["W" D  Q
 ..N DIQGMDA,DIQGMGR
 ..D  F  S DIQGMDA=$O(@DIQGMGR@(DIQGMDA)) Q:DIQGMDA'>0  D EN($S('DIQGDD:DIQGMDD,1:$$OREF(DIQGMGR)),.DIQGMDA,"**",DIQGPARM,.DIQGTA,"",''DIQGDD_"R") ;recursion
 ...N I F I=1:1 Q:'$D(DA(I))  S DIQGMDA(I+1)=DA(I)
 ...S DIQGMDA(1)=DA,DIQGMGR=$S('DIQGDD:$$ROOT^DIQGU(DIQGMDD,.DIQGMDA,1),1:DIQGR_DA_","_$$Q($P($P(@DIQGXDD@(+DIQGXDN,0),"^",4),";"))_")"),DIQGMDA=0
 ...Q
 .I DIQGXDN="*"!(DIQGXDN="**") S DIQGXDN=0,DIQGXDF=":999999999" Q
 .S DIQGXDA=$$DA(.DA),DIQGFEN=$S((DIQGFE&(DIQGXDN))!(DIQGFET):$P(@DIQGXDD@(DIQGXDN,0),"^"),1:DIQGXDN) S:DIQGFET DIQGFEN=DIQGXDN_" "_DIQGFEN
 .I DIQGDD N DIQGXDDN S DIQGXDDN="DD"
INTERNAL .I DIQGXPRI D  Q:DIQGI="$WP$"  G:$G(DIERR) ERR
 ..I $G(DIQGAUDR(DIQGXDDN,DIQGXDA)) S DIQGI="" G XXI
 ..I $D(DIQGAUDR(DIQGXDDN,DIQGXDA,DIQGXDN)) S DIQGI=$$DIA^DIAUTL(DIQGAUDD,DIQGAUDR,DIQGAUDR(DIQGXDDN,DIQGXDA,DIQGXDN)) G XXI
 ..S DIQGI=$$GET^DIQG(DIQGR,.DA,DIQGXDN,"I"_DIQGCP,$S('DIQGXPRF:$$OREF(DIQGXTA)_$$Q(DIQGXDDN)_","_$$Q(DIQGXDA)_","_$$Q(DIQGFEN)_")",1:$$OREF(DIQGXTA)_$$Q(DIQGFEN)_")"),"","1A")
XXI ..S DIQGXXI='DIQGXPRN!(DIQGXPRN&(DIQGI]""))
 ..Q
EXTERNAL .I DIQGXPRE!'DIQGXPRA D  Q:DIQGE="$WP$"
 ..I $G(DIQGAUDR(DIQGXDDN,DIQGXDA)) S DIQGE="" G XXE
 ..I $D(DIQGAUDR(DIQGXDDN,DIQGXDA,DIQGXDN)) S DIQGE=$$DIA^DIAUTL(DIQGAUDD,DIQGAUDR,DIQGAUDR(DIQGXDDN,DIQGXDA,DIQGXDN),"E") G XXE
 ..S DIQGE=$$GET^DIQG(DIQGR,.DA,DIQGXDN,DIQGCP,$S('DIQGXPRF:$$OREF(DIQGXTA)_$$Q(DIQGXDDN)_","_$$Q(DIQGXDA)_","_$$Q(DIQGFEN)_")",1:$$OREF(DIQGXTA)_$$Q(DIQGFEN)_")"),"","1A")
XXE ..S DIQGXXE='DIQGXPRN!(DIQGXPRN&(DIQGE]""))
 ..Q
ERR .I $G(DIERR) S $P(DIQGQERR,U)=$P($G(DIQGQERR),U)+DIERR,$P(DIQGQERR,U,2)=$P($G(DIQGQERR),U,2)+$P(DIERR,U,2) K DIERR S DIQGQE=DIQGQE+1 Q
 .S:DIQGXPRS DIQGPRSE=DIQGI'=DIQGE
 .I DIQGXAF,DIQGXPRA D  Q
 ..G:DIQGXPRF XPRF1
 ..I DIQGXPRI,DIQGXXI S @DIQGXTA@(DIQGXDDN,DIQGXDA,DIQGFEN,"I")=DIQGI
 ..I DIQGXPRE,DIQGXXE,DIQGPRSE S @DIQGXTA@(DIQGXDDN,DIQGXDA,DIQGFEN,"E")=DIQGE
 ..Q
XPRF1 ..I DIQGXPRI,DIQGXXI S @DIQGXTA@(DIQGFEN,"I")=DIQGI
 ..I DIQGXPRE,DIQGXXE,DIQGPRSE S @DIQGXTA@(DIQGFEN,"E")=DIQGE
 ..Q
 .I DIQGXAF D  Q
 ..I DIQGXPRF,DIQGXXE S @DIQGXTA@(DIQGFEN)=DIQGE Q
 ..S:DIQGXXE @DIQGXTA@(DIQGXDDN,DIQGXDA,DIQGFEN)=DIQGE
 ..Q
 .Q
 Q
 ;
CREF(X) N L,X1,X2,X3 S X1=$P(X,"("),X2=$P(X,"(",2,99),L=$L(X2),X3=$TR($E(X2,L),",)"),X2=$E(X2,1,(L-1))_X3 Q X1_$S(X2]"":"("_X2_")",1:"")
OREF(X) N X1,X2 S X1=$P(X,"(")_"(",X2=$$OR2($P(X,"(",2)) Q:X2="" X1 Q X1_X2_","
OR2(%) Q:%=")"!(%=",") "" Q:$L(%)=1 %  S:"),"[$E(%,$L(%)) %=$E(%,1,$L(%)-1) Q %
DA(DA) N X,Y S X="",Y=$G(DA)_"," F  S X=$O(DA(X)) Q:X=""  S Y=Y_DA(X)_","
 Q Y
IEN(IEN,DA) S DA=$P(IEN,",") N I F I=2:1 Q:$P(IEN,",",I)=""  S DA(I-1)=$P(IEN,",",I)
 Q
Q(%Z) S %Z(%Z)="",%Z=$Q(%Z("")) Q $E(%Z,4,$L(%Z)-1)
DD(X) Q:'$D(^DD(X)) "" Q "^DD("_X_","
202 D BLD^DIALOG(202,.X)
OUT Q 

DIQGU
DIQGU ;SFISC/DCL-DATA RETRIEVAL INTERNAL FUNCTIONS ;8FEB2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013;
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DT(H) Q $$HTFM^DILIBF(H,1)
 ;
ROOT(DIC,DA,CP,ERR) ;
ENROOT S ERR=$G(ERR)=1
 N DIQGUFN,DIQGUIEN
 S DIQGUFN=$G(DIC),DIQGUIEN=$G(DA)
 I DIC="" D:ERR BLD^DIALOG(200) Q ""
 N RQ
 S RQ=$G(CP)'["Q"
 S CP=$G(CP)'[1
 G:$L($G(DA),",,")>1 ERR
 D:$G(DA)["," DAIEN(DA,.DA)
 I $G(^DIC(DIC,0,"GL"))]"" N DIQGUX S DIQGUX=^("GL") D:ERR  Q:CP DIQGUX Q $$CREF(DIQGUX)
 .Q:$G(DIQGUIEN)'[","
 .N X S X=$$IENCHK^DIT3(DIQGUFN,DIQGUIEN)
 .Q:X
 .S (CP,DIQGUX)=""
 .Q
 N A,A2
 I $D(DA)>9,$G(^DIC(+$$UP(DIC,.A),0,"GL"))]"" S DIC=^("GL"),A=$P($O(A("")),"-",2) I A>0,$D(DA(A))=1,'$O(DA(A)) D  Q:CP DIC Q $$CREF(DIC)
 .S A="" F  S A=$O(A(A)) Q:A'<0  D
 ..I RQ S A2=$P(A(A),"^",2),DIC=DIC_DA($P(A,"-",2))_","_$$Q(A2)_"," Q
 ..S A2=$P(A(A),"^",2),DIC=DIC_DA($P(A,"-",2))_","""_A2_"""," Q
ERR Q:'ERR ""
 S DIQGUIEN=$$IENS^DILF(.DA)
 S A=$$IENCHK^DIT3(DIQGUFN,DIQGUIEN) Q:'A ""
 D BLD^DIALOG(200) Q ""
 ;
N9(FN,DA) Q:$G(DA)="" 0 N N9 S N9=$$ROOT($$UP(FN),"",1) Q:N9="" 0 Q:$D(@N9@($$DA(.DA),-9)) 1 Q 0
 ;
DA(Y) Q:$D(Y)=1 Y Q Y($O(Y(""),-1))
 ;
UP(Y,A) N D,N,X
 S A(0)=Y F D=0:-1 Q:'$D(^DD(+A(D),0,"UP"))  D  Q:D=666
 .S X=^("UP"),N=$G(^DD($P(X,"^"),+$O(^DD($P(X,"^"),"SB",+A(D),"")),0)) I N="" S D=666 Q  ;"UP" NODE MAY BE BOGUS!
 .S A(D-1)=$P(X,"^")_"^"_$P($P(N,"^",4),";")
 I D=666 Q Y
 Q $P(A($O(A(""))),"^")
 ;
CREF(X) ;
ENCREF N L,X1,X2,X3 S X1=$P(X,"("),X2=$P(X,"(",2,99),L=$L(X2),X3=$TR($E(X2,L),",)"),X2=$E(X2,1,(L-1))_X3 Q X1_$S(X2]"":"("_X2_")",1:"")
OREF(X) ;
ENOREF N X1,X2 S X1=$P(X,"(")_"(",X2=$$OR2($P(X,"(",2,999)) Q:X2="" X1 Q X1_X2_","
 ;
OR2(%) Q:%=")"!(%=",") "" Q:$L(%)=1 %  S:"),"[$E(%,$L(%)) %=$E(%,1,$L(%)-1) Q %
 ;
RCP(%DIQGRCP) Q $$CREF($$R^DIQGU0(%DIQGRCP))
 ;
Q(%Z) S %Z(%Z)="",%Z=$Q(%Z("")) Q $E(%Z,4,$L(%Z)-1)
 ;
DY(Y) X ^DD("DD") Q Y ;*CCO/NI   DATE FORMAT
 ;
DAIEN(IEN,DA) ;
 K DA
 S DA=$P(IEN,",")
 N I F I=2:1 Q:$P(IEN,",",I)=""  S DA(I-1)=$P(IEN,",",I)
 Q
 ;
EXTERNAL(DIFILE,DIFIELD,DIFLAGS,DINTERNL,DIOUTPUT) ;SEA/TOAD
 G XTRNLX^DIDU
 ;

DIQGU0
DIQGU0 ;SFISC/DCL-DATA RETRIVIAL UTILITY PROGRAM ;02:42 PM  24 Aug 1993
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
R(%R) ;
 N %C,%F,%G,%I,%R1,%R2
 S %R1=$P(%R,"(")_"(" I $E(%R1)="^" S %R2=$P($Q(@(%R1_""""")")),"(")_"(" S:$P(%R2,"(")]"" %R1=%R2
 S %R2=$P($E(%R,1,($L(%R)-($E(%R,$L(%R))=")"))),"(",2,99)
 S %C=$L(%R2,","),%F=1 F %I=1:1:%C S %G=$P(%R2,",",%F,%I) Q:%G=""  I ($L(%G,"(")=$L(%G,")")&($L(%G,"""")#2))!(($L(%G,"""")#2)&($E(%G)="""")&($E(%G,$L(%G))="""")) S %G=$$S(%G),$P(%R2,",",%F,%I)=%G,%F=%F+$L(%G,","),%I=%F-1
 Q %R1_%R2
S(%Z) ;
 I $G(%Z)']"" Q ""
 I $E(%Z)'="""",$L(%Z,"E")=2,+$P(%Z,"E")=$P(%Z,"E"),+$P(%Z,"E",2)=$P(%Z,"E",2) Q +%Z
 I +%Z=%Z Q %Z
 I %Z="""""" Q ""
 I $E(%Z)'?1A,"%$+@"'[$E(%Z) Q %Z
 I "+$"[$E(%Z) X "S %Z="_%Z Q $$Q(%Z)
 I $D(@%Z) Q $$Q(@%Z)
 Q %Z
Q(%Z) ;
 S %Z(%Z)="",%Z=$Q(%Z("")) Q $E(%Z,4,$L(%Z)-1)
DDLST(DDN,ATRN,FL) ;
 N X,Y S:$D(^DD(DDN)) ATRN(DDN)="" S FL=+$G(FL)
 D  S X=0 F  S X=$O(^DD(DDN,"SB",X)) Q:X'>0  S ATRN(X)="" D  D DDLST(X,.ATRN,FL)
 .I 'FL S Y="" F  S Y=$O(^DD(DDN,"B",Y)) Q:Y=""  S ATRN(Y,DDN)=$O(^(Y,""))
 .Q
 Q
DDN(ATN,F) ;
 N DNA,DDN,X,Y S X="$$$ NO SUCH ATTRIBUTE $$$"
 Q:$G(ATN)']"" X
 D DDLST(+$G(F),.DNA,1)
 S DDN="" F  S DDN=$O(DNA(DDN)) Q:DDN=""  D  Q:X
 .S Y="" F  S Y=$O(^DD(DDN,"B",Y)) Q:Y=""  I Y=ATN S X=DDN_"^"_$O(^DD(DDN,"B",Y,"")) Q
 .Q
 I '$G(F),$E(X,1,6)="$$$ NO" Q $$DDN(ATN,1)
 Q X
DDLST2(DDN,ATRN,FL) ;
 N X,Y S:$D(^DD(DDN)) ATRN(DDN)="" S FL='$D(FL)
 S X=0 F  S X=$O(^DD(DDN,"SB",X)) Q:X'>0  D
 .I FL S ATRN(X)="",Y=0 F  S Y=$O(^DD(DDN,Y)) Q:Y'>0  S ATRN(Y,DDN)=$P($G(^(Y,0)),"^")
 .D DDLST2(X,.ATRN)
 .Q
 Q

DIQQ
DIQQ ;SFISC/GFT-VARIOUS HELPS ;11:05 AM  9 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
DIP ;**CCO/NI  EVERYTHING THRU TAG '11' CHANGED
 D BLD^DIALOG(9070),MSG^DIALOG("WH") ;*CCO/NI TYPE '-' ...
 I $G(DDXP)'=4 D BLD^DIALOG(9071),MSG^DIALOG("WH") ;*CCO/NI '=', '#', ETC
 I DJ=1 D BLD^DIALOG(9072),MSG^DIALOG("WH") ;**CCO/NI '[TEMPLATE NAME]'
 I DUZ(0)="@",DJ=1 D BLD^DIALOG(9073),MSG^DIALOG("WH") ;**CCO/NI 'BY(0)'
 Q
 ;
DIP3 ;
 D BLD^DIALOG(9085,IO),MSG^DIALOG("WH") ;**CCO/NI 'YOU CAN FREE THIS TERMINAL'
 G FREE^DIP3
 ;
DIP1(FT) ;from DIR reader -- FROM or TO help
 I X'["??" D
 .N DIP S DIP(1)=DE,DIP(2)=DIPR
 .D BLD^DIALOG(9080+FT,.DIP),MSG^DIALOG("WH") ;**CCO/NI
 .I $G(DIR("B"))]"" S %=$P("FIRST^LAST",U,FT) I %'=DIR("B") W !?5,"OR ENTER '",%,"' TO ",$P("START FROM THE FIRST^GO THRU THE LAST",U,FT)," VALUE"
11 I $P(DPP(DJ),U) S %=$P(DPP(DJ),U,2)+$P($P(DPP(DJ),U,4),"""",2) I % W ! D EN^DIQQ1($P(DPP(DJ),U),%,$S(X["??":"??",1:"?"))
 Q
 ;
DICATT3 W "TYPE FIELD NAMES, OPERATORS(+-\/*), DIGITS, OR FUNCTIONS",!,"FOR FUNCTIONS,"
 S D="B",DZ="??",DIC("W")="W:$D(^(9)) ""  ("",^(9),"")""",DIC="^DD(""FUNC"",",DIC(0)="" D DQ^DICQ G 6^DICATT3
 ;
DICATT31 W !,"ENTER THE NUMBER OF DIGITS THAT SHOULD NORMALLY APPEAR TO THE"
 W !,"RIGHT OF THE DECIMAL POINT WHEN '",F,"' IS DISPLAYED" G DEC^DICATT3
 ;
DIP2 ;
 I $G(DDXP)=2 D  G F^DIP2
 .W !!?5,"YOU CAN ALSO ENTER A COMPUTED EXPRESSION."
 .W:DE="" !?5,"ENTER '[TEMPLATE NAME]' TO USE AN EXISTING SELECTED EXPORT FIELDS TEMPLATE."
 .W !
 I $P(DU,U,4)>1 D BLD^DIALOG(9076,$P(DU,U)),MSG^DIALOG("WH") ;**CCO/NI  'TYPE 'ALL''
 D BLD^DIALOG(9077),MSG^DIALOG("WH") ;**CCO/NI 'TYPE '&' ETC'
 I DE="" D BLD^DIALOG(9078),MSG^DIALOG("WH") ;**CCO/NI 'TYPE [TEMPLATE NAME]'
 G F^DIP2
 ;
DICE2 ;
 W !!,"YOU MAY USE '@' TO INDICATE THAT '",DNEW,"' IS TO BE DELETED",!,"IF YOU SIMPLY WANT TO MOVE THE VALUE OF '",DOLD,"' OVER,",!,"   JUST ENTER '",DOLD,"'"
 G C^DICE2
DIARQ ;ARCHIVING ERROR MESSAGES
FER W !,$C(7),"Less than 'FROM SELECT CRITERIA VALUE'.",$P(DIARS,U,2) Q
FER1 W !,$C(7),$$EZBLD^DIALOG(1511) Q  ;**CCO/NI 'START WITH' > 'GO TO'
TER W !,$C(7),"Less than 'TO SELECT CRITERIA VALUE'.",$P(DIARE,U,2) Q
TER1 W !,$C(7),"Less than 'TO' value." Q
 ;
ENTT W !!,"_____________________________________________________________________________",!!,$C(7),"A field in the 'SELECT CRITERIA TEMPLATE being used does NOT MATCH."
 W !,"the field at the SAME LEVEL in the BASE SELECT CRITERIA SORT TEMPLATE"
 W !,"specified for this file.  There must be a one to one correspondence"
 W !,"between the fields in the template you want to use and the"
 W !,"BASIC SELECT CRITERIA SORT TEMPLATE, until all the fields in the"
 W !,"BASIC SELECT CRITERIA SORT TEMPLATE have been satisfied.  More"
 W !,"CRITERIA may exist after that.  See the development staff of the Package"
 W !,"or the ARCHIVING DOCUMENTATION where this process is explained further"
 W !,"for more information."
 W !,"_____________________________________________________________________________"
 Q

DIQQ1
DIQQ1 ;SFISC/TKW-NONDESTRUCTIVE ONLINE HELP FOR FIELDS ;4/4/95  09:16
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DP,D,X) ; DP=file no.,D=field no.,X="?" or "??"
 Q:'$G(DP)  Q:'$G(D)  Q:$G(X)'?1"?"."?"
 N %,%DT,A1,A2,DA,DC,DDH,DG,DIC,DIG,DIRUT,DISORT,DTOUT,DUOUT,DO,DQ,DST,DU,DV,DZ,Y
 S DISORT=1
1 S DQ="^DD("_DP_","_D_",0)",DQ(1)=$G(@(DQ)),DQ=1,DV=$TR($P(DQ(DQ),U,2),"V","F"),DU=$P(DQ(DQ),U,3),DZ=X Q:DQ(1)=""
 I DV S DP=+DV,D=.01 G 1
 I DV["P" N %Y,%W,%W1,%Z,C,DD,DDC,DDD,DF,DIAC,DIE,DICP,DICR,DICS,DICW,DICQ1Q,DIEQ,DIFILE,DILCV,DIPGM,DIW,DIX,DIY,DIZ,DS,IOX,IOY S DIE=""
 D EN1^DIEQ Q

DIQQQ
DIQQQ ;SFISC/GFT,XAK-MORE HELP ;21FEB2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
DICATT W !,"IF YOU WANT THE SAME ANSWER ALLOWED FOR ",F,!,"AS FOR " Q
 ;
DICATT1 W !,"ENTER GLOBAL SUBSCRIPT NAME AT WHICH ",F," WILL BE STORED"
 W !,"   ALREADY ASSIGNED: " S Y="",T=0 F  S Y=$O(^DD(A,"GL",Y)) Q:Y=""  W $J(Y,9) W:$X>66 !
 S Y=-1 G SUB^DICATT1
 ;
DIS ;
 D  W !! Q  ;**CCO/NI (next 8 lines) HELP FOR SEARCHING
 .N DIP
 .S DIP(1)=O(DC),DIP(2)=$P("NOT ",U,DN]"")_$P("^CONTAIN^MATCH^BE LESS THAN^EQUAL^EXCEED^FOLLOW",U,+DQ),DIP(3)=$C(DC+64)
 .D BLD^DIALOG(9079,.DIP),MSG^DIALOG("WH")
 .W:+DQ=3 !?8,"(I.E., ENTER WHAT WOULD FOLLOW THE MUMPS '?' OPERATOR)",!
 .I E["S" W !! D EN^DIQQ1(DK,DU,"?")
 ;
DISC ;
 D BLD^DIALOG(9075),MSG^DIALOG("WH") G C^DIS
 ;
DIP1 ;
 W $C(7) D BLD^DIALOG(8145),MSG^DIALOG("WE") G Q^DIP ;**CCO/NI 'YOU'VE ASKED FOR THE SAME SORT FIELD TWICE!'
 ;
DIP3 W !,$$EZBLD^DIALOG(9086) G ^DIP3
 ;
DIA ;
 W ! D BLD^DIALOG(9131),MSG^DIALOG("WH") ;**CCO/NI HELP FOR 'EDIT WHICH FIELD:'
 G 2^DIA
 ;
DIA3 ;
 W ! D BLD^DIALOG(8147),MSG^DIALOG("WE") W ! G 2^DIA ;**CCO/NI 'CAPTIONS CANNOT CONTAIN...'
 ;
DIP21 ;
 D BLD^DIALOG(9083),MSG^DIALOG("WH") ;**CCO/NI HELP FOR THE 'SUPPRESS SUBHEADERS?' QUERY
 G SUB^DIP21
 ;
DICOMPW W ! D BLD^DIALOG(9121,Y),MSG^DIALOG("WH") Q  ;**CCO/NI HELP FOR RELATIONAL-JUMP QUERY IN CREATING A COMPUTED EXPRESSION
 ;
XPDIP21 ;from XPUT^DIP21
 W !!,$C(7),"You must choose a template to store the fields selected for export."
 W !,"If you do not want to save the selections, use the '^'.",! Q

DIR
DIR ;SFISC/XAK-READER, HELP ;18NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N %,%A,%B,%B1,%B2,%B3,%BA,%C,%E,%G,%H,%I,%J,%N,%P,%S,%T,%W,%X,%Y,A0,C,D,DD,DDH,DDQ,DDSV,DG,DH,DIC,DIFLD,DIRO,DO,DP,DQ,DU,DZ,X1,XQH,DIX,DIY,DISYS,%BU,%J1,%A0,%W0,%D1,%D2,%DT,%K,%M
 S:$D(DDH)[0 DDH=0 Q:'$D(DIR(0))  D ^DIR2 G Q:%T=""
 I $D(DIR("V"))#2 D ^DIR1 S DDER=%E G Q
A I $D(DDM) K:DDM DDQ S:'DDM DDQ=$G(DDSHBX,IOSL-7) ;**
 I $G(DDH) D LIST^DDSU
 D W:%A'["V" I $D(DDS),$D(DIR0) S DDACT=Y I DDO=.5 S DDM=1 G Q
 I %A'["V",%E D QUES S A0="" D MSG D:$G(DDH) LIST^DDSU G A
 I $D(DTOUT) K Y S DIRUT=1,Y="" G Q
 I %T'="E",X?1."^".E K Y S (DUOUT,DIRUT)=1,Y=X S:X="^^" DIROUT=1 S:%T="Y" %=-1 G Q
 I %T'="E","@"[X,%A["O" S Y="",DIRUT=1 S:%T="P" Y=-1 G Q
 I %A'["O","@"[X,%T'="E" S A0=$C(7)_%A0 D MSG G A
 I $D(DDS),$D(DIR0),DIR0N G Q
 I $D(%G),$D(DIR("B")),X=DIR("B") S Y=%G G Q
X I X'?1."?" K DDQ D ^DIR1 D
 .I $D(DICQRETA) S DIR0N=1,%E=0,X="",DDACT=DICQRETA K DICQRETA Q
 .I '%E,$P(DIR(0),U,3)]"" S %X=X D  S:'$D(X) %E=1 S X=%X ;^DIR1 will evaluate input
 ..N %A,%B,%B1,%B2,%B3,%E,%N,%P,%T,%X,%W,%W0
 ..X $P(DIR(0),U,3,99) ;INPUT TRANSFORM if any
 I %A["V" K:%E Y G Q
 I X'?1."?",'%E G Q ;If no error or "?", quit
 D QUES:%E'<0 S A0="" D MSG D:$G(DDH) LIST^DDSU
 I $D(DICQRETV) S (X,DIR0A)=DICQRETV,DDSREPNT=1,DDACT="" K DICQRETV,DICQRETA G X ;RETURN VALUE from drop-down list is sent back for evaluation (and echoing)
 I $D(DICQRETA) S DIR0N=1,DDACT=DICQRETA K DICQRETA G Q
 G A
 ;
 ;
 ;
W ; write the prompt and read the user's response
 S %W=%W0,%N=$E(%W)=U
SCREEN K DTOUT,DUOUT,DIRUT,DIROUT S %E=0 I $D(DDS),$D(DIR0) D ^DIR0 Q:'$D(DIR("PRE"))  X DIR("PRE") S:'$D(X) %E=1,X="" Q  ;READ in DIR01 via DIR0
 I %T="S",%A'["A",%A'["B" D S
 I $D(DIR("A"))=11 F %=0:0 S %=$O(DIR("A",%)) Q:%'>0  W !,DIR("A",%)
 W ! W:$L(%P) %P
 I $L($G(DIR("B")))>19,%A'["r",%T'="D",%T'="S",(%B'["D"&%T)!'%T,%B'["P"!'$P(%A,",",2) W DIR("B") S Y=DIR("B") D RW^DIR2 S:X="" X=DIR("B") Q
DIRB N DIRB I $D(DIR("B")) S DIRB=DIR("B") D  W DIRB_"// " ;**
 .I %T="Y",$G(DUZ("LANG"))>1,$G(%B)]"" N X S X=$F("YN",$$UP^DILIBF($E(DIRB))) S:X DIRB=$P($P(%B,";",X-1),":",2) ;YES/NO in FOREIGN LANGUAGE
 R X:$S($D(DIR("T")):DIR("T"),'$D(DTIME):300,1:DTIME) I '$T S DTOUT=1
 I $D(DIR("PRE")) X DIR("PRE") I '$D(X) S %E=1,X="" Q
 I X="",$D(DIRB) S X=DIRB I %T'="D",%B'["D"&%T W X
 I X'?.ANP S X="?"
 Q
 ;
QU I %E!(X="?")!($O(^DD(%B1,%B2,21,0))'>0) K %Y S A0="" D MSG S X1=$$HELP^DIALOGZ(%B1,%B2) D   I $D(^DD(%B1,%B2,12)) S X1=^(12) D  ;** FIELD HELP FOR A FIELD-TYPE QUESTION
 .S %J=75,%Y=1 D W1
 I $D(^DD(%B1,%B2,4)) S A0=^(4),A0(0)=1 D MSG
 I X?1"??".E D
 . I $D(DDS) N DDC,DDSQ S DDC=7
 . S A0="" D MSG S %C=0
 . F  S %C=$O(^DD(%B1,%B2,21,%C)) Q:'%C!$D(DDSQ)  S A0=^(%C,0) D
 .. I $D(DDS),$G(DDH),'(DDH#DDC) D LIST^DDSU Q:$D(DDSQ)
 .. D MSG
 I %B["P" K DO S DIC=U_$P(%B3,U,3),DIC(0)="M"_$E("L",%B'["'") D AST:%B["*",DQ
 I %B["D" S %DT=$P($P($P(%B3,U,5,99),"%DT=""",2),"""",1) D HELP^%DTC
FLDSET I %B["S" D
 .D SETSCR(%B1,%B2) S A0=$$EZBLD^DIALOG(8068)_" " D MSG
 .I $D(^DD(%B1,%B2,0)),$G(DUZ("LANG"))>1 N %B3 S $P(%B3,U,3)=$$SETIN^DIALOGZ
 .F %C=1:1 S Y=$P($P(%B3,U,3),";",%C) Q:Y=""  D
 ..S %I=$P(Y,":",2),Y=$P(Y,":") I 1 X:$D(DIC("S")) DIC("S") E  Q
 ..I $G(DDS),$G(DDSMOUSY) S DDH=$G(DDH)+1,DDH(DDH,"XT")="W ! D WRITMOUS("""_Y_""") W ""    "" D WRITMOUS("""_%I_""")" Q  ;MOUSE REMEMBERS SET VALUES
 ..S A0=Y_$E("         ",$L(Y)+1,999)_%I D MSG
 I %B["V" S A0="" D MSG S X1=X,DU=%B1,D=%B2,DZ=X D V^DIEQ S X=X1
 Q
 ;
AST F %=" D ^DIC"," D IX^DIC"," D MIX^DIC1" S Y=$F(%B3,%),%=$L(%)+1 Q:Y
 Q:'Y
 I $D(DDS) S A0=" " D MSG
 X $P($E(%B3,1,Y-%),U,5,99)
 Q
 ;
SETSCR(DIRFIL,DIRFLD) ;SET UP DIC("S")
 Q:'$D(^DD(DIRFIL,DIRFLD,12.1))
 X ^(12.1)
 Q:$G(DUZ("LANG"))'>1!'$D(DIC("S"))
 S DIC("S",1.007)=$P(^DD(DIRFIL,DIRFLD,0),U,3),DIC("S",0)=";"_$$SETIN^DIALOGZ,DIC("S",2.007)=DIC("S")
 S DIC("S")="N S,I S S=DIC(""S"",0),I=$L($E(S,1,$F(S,"";""_Y_"":"")),"";"")-1,S=$P($P(DIC(""S"",1.007),"";"",I),"":"") N Y S Y=S X DIC(""S"",2.007)"
 Q
 ;
 ;
DQ N %W K DICQRETV
 S:$D(D)[0 D="B" S (X1,DZ)=X D DQ^DICQ S DDSV=DIC K DD,% S:$D(X1) X=X1
 Q
 ;
QUES ;
 I %T D QU I $D(DICQRETV)!$D(DICQRETA) Q
 I X="??",$D(DIR("??")) D:$P(DIR("??"),U)]"" HF S:$P(DIR("??"),U,2)]"" A0(0)=1,A0=$P(DIR("??"),U,2,99) D:$P(DIR("??"),U,2)]"" MSG Q
 I X="??",%T="D" D  Q
 . N DIHELP,DIJUNK,DILINE,DIROOT
 . D DT^DILF(%DT,"?",.DIJUNK,"","DIROOT")
 . S A0="" D MSG
 . F DILINE=1:1:DIHELP S A0=DIROOT("DIHELP",DILINE) D MSG
 I %T="P" S DIC=%B1,DIC(0)=%B2 S:$D(DIR("S"))#2 DIC("S")=DIR("S") D DQ K DIC("S")
 I '%N S A0="" D MSG
 I X'["?" W $C(7)
 I %N S A0(0)=1,A0=$E(%W,2,999) D MSG
 D:'%N WRAP:%W]"" I %T["S",(%A["A"!(%A["B")) D S
 Q
 ;
WRAP I $D(DIR("?"))=11 F %I=1:1 Q:'$D(DIR("?",%I))  S A0=DIR("?",%I) D MSG
 K %Y S %J=$S($G(IOM,80)>6:$G(IOM,80)-6,IOM>1:IOM,1:2),%Y=1 S X1=$S(($D(DIR("?"))&'%N):DIR("?"),1:%W)
 I '%N,$D(DIR("?"))'=11,$E(X1,$L(X1))'="." S X1=X1_"."
W1 I $L(X1)<%J S %Y(%Y)=X1
 E  D  G W1
 . I $E(X1,1,%J-1)'?.E1P.E S %I=%J-1
 . E  F %I=%J-1:-1:1 Q:$E(X1,%I)?1P
 . S %Y(%Y)=$E(X1,1,%I),X1=$E(X1,%I+1,999),%Y=%Y+1
 F %I=1:1:%Y S A0=%Y(%I) D MSG
 I $D(DDS),%T="S" D
SET . S A0=$$EZBLD^DIALOG(8068) D MSG
 . F %I=1:1 Q:$P(%B,";",%I,999)=""  D
 .. S %Y=$P(%B,";",%I),Y=$P(%Y,":") Q:Y=""
 .. I $D(DIR("S"))#2 X DIR("S") E  Q
 ..I $G(DDS),$G(DDSMOUSY) S DDH=$G(DDH)+1,DDH(DDH,"XT")="D WRITMOUS("""_Y_""") W ""   "" D WRITMOUS("""_$P(%Y,":",2)_""")" Q  ;MOUSE REMEMBERS FORM-ONLY SET VALUE!
 .. S A0=Y_$J("",9-$L(Y))_$P(%Y,":",2) D MSG
 K %Y,%,X1
 Q
HF S XQH=$P(DIR("??"),U) N %A,%B,%E,DIR D EN1^XQH
 Q
MSG ;
 I $D(DDS),A0]"" D
 . S DDH=$G(DDH)+1
 . I $D(A0)>9 S DDH(DDH,"T")="",DDH=DDH+1,DDH(DDH,"X")=A0
 . E  S DDH(DDH,"T")=A0
 I '$D(DDS),$D(A0)>9 W:$X ! X A0
 I '$D(DDS),$D(A0)=1 W !,A0
 K A0
 Q
S W:$G(X)'?1."?"!(%A["A") !
 I $D(DIR("L"))#2 D
 . I $D(DIR("L"))=11 F %=0:0 S %=$O(DIR("L",%)) Q:%'>0  W !,DIR("L",%)
 . W !,DIR("L")
 E  I %B'[":",$O(DIR("C",""))]"" D
 . W !?5,$$EZBLD^DIALOG(8046),! ;**
 . S %I="" F  S %I=$O(DIR("C",%I)) Q:%I=""  D
 .. S Y=$P(DIR("C",%I),":")
 .. I $D(DIR("S"))#2 X DIR("S") E  Q
 .. W !?10,Y,?20,$P(DIR("C",%I),":",2)
 E  D
 . W !?5,$$EZBLD^DIALOG(8046),! ;**
 . F %I=1:1 Q:$P(%B,";",%I,999)=""  D
 .. S Y=$P($P(%B,";",%I),":") Q:'$L($P(%B,";",%I,999))
 .. I $D(DIR("S"))#2 X DIR("S") E  Q
 .. W !?10,Y,?20,$P($P(%B,";",%I),":",2)
 W:%A'["A" !
 Q
Q G ^DIRQ
 ;
 ;#8068  Choose from

DIR0
DIR0 ;SFISC/MKO-FIELD EDITOR ;2JUN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
SM ;
 N DIR0A,DIR0C,DIR0CH,DIR0CHG,DIR0D,DIR0F,DIR0L,DIR0M
 N DIR0P,DIR0QT,DIR0QU,DIR0R,DIR0RJ,DIR0S,DIR0SP,DIR0ST,DIR0SV,DX,DY
 S DIR0P="" D:$D(DIR0("IN"))[0 GETKEY^DIR0K
 S:$P(DIR0,U,6) DIR0RJ=1
 ;
 I $G(DDSH) K DDSH D BOT^DDSCOM ;BEFORE THE READ, WRITE THE COMMAND LINE!
 S (DIR0A,DIR0D)=$G(DIR("B"))
 S DIR0R=$P(DIR0,U),DIR0S=$P(DIR0,U,2),DIR0L=$P(DIR0,U,3),DIR0M=245
 ;
 W $P(DDGLVID,DDGLDEL,10)
 S DY=$P(DIR0,U,4),DX=$P(DIR0,U,5)
 I $D(DIR("A"))=11 D
 . N DIX
 . S DIX="" F  S DIX=$O(DIR("A",DIX)) Q:DIX=""  D
 .. X IOXY W DIR("A",DIX)
 .. S DY=DY+1
 ;
 I $D(DIR("A"))#2 D
 . X IOXY W DIR("A")
 . I DDO,DY=IOSL-1 W $P(DDGLCLR,DDGLDEL)
 ;
 D INIT,^DIR01 ;Go do the READ
 ;
A I $D(DTOUT) W $C(7) S DIR0A=DIR0D
 I DIR0A="@",DIR0D'="@" S DIR0A=""
 S:DIR0CH="QT" DIR0A=DIR0D
 S X=DIR0A
 S:X?1"^".E!(X?1"?".E) DIR0A=DIR0D
 S DIR0N=X=DIR0D S:DIR0A'=DIR0D DIR0("L")=DIR0A
 ;
 D END,PAINT
 X DDGLZOSF("EON"),DDGLZOSF("TRMOFF")
 Q
 ;
 ;
 ;
EN(DIR0R,DIR0S,DIR0L,DIR0NL,DIR0A,DIR0M,DIR0C,DIR0MAP,DIR0FLG,X,Y) ;
 ;$Y   $X   length       default
 ;Field editor
 N DIR0CH,DIR0CHG,DIR0D,DIR0F,DIR0KD,DIR0P,DIR0QT,DIR0QU
 N DIR0RJ,DIR0SP,DIR0ST,DIR0SV,DIR0TO,DX,DY
 ;
 D INIT^DDGLIB0() ;BEFORE, $Y=4   AFTER $Y=0
 ;
 I $D(DIR0MAP)<2 D
 . S DIR0P="D"
 . D:$D(DIR0("DIN"))[0 GETKEY^DIR0K
 E  D
 . S DIR0P="C"
 . I $O(DIR0MAP(""))!($D(DIR0MAP("IN"))[0) D
 .. D GETKEY^DIR0K
 .. K DIR0MAP S DIR0MAP("IN")=DIR0("CIN"),DIR0MAP("OUT")=DIR0("COUT")
 . E  D
 .. S DIR0("CIN")=$G(DIR0MAP("IN")),DIR0("COUT")=$G(DIR0MAP("OUT"))
 .. S:DIR0("CIN")[(U_"KD"_U) DIR0KD=$P(DIR0("COUT"),";",$L($P(DIR0("CIN"),U_"KD"_U),U))
 .. S:DIR0("CIN")[(U_"TO"_U) DIR0TO=$P(DIR0("COUT"),";",$L($P(DIR0("CIN"),U_"TO"_U),U))
 ;
 S (DIR0A,DIR0D)=$G(DIR0A)
 S:'$G(DIR0R) DIR0R=0
 S:'$G(DIR0S) DIR0S=0
 S:'$G(DIR0L) DIR0L=IOM-1-DIR0S
 S:'$G(DIR0M) DIR0M=245
 S:'$G(DIR0FLG)["r" DIR0RJ=1
 ;
 I $G(DIR0NL)>1 D
 . D EN^DIR02,END
 E  D INIT,^DIR01,END,PAINT
 ;
 S X=DIR0A
 I $D(DTOUT) K DTOUT S:Y="" Y="TO"
 S $P(Y,U,2)=+$G(DIR0CHG)
 D KILL^DDGLIB0($G(DIR0FLG))
 K DIR0("CIN"),DIR0("COUT")
 Q
 ;
INIT ;
 K DTOUT
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMON")
 S DIR0SV=$G(DIR0("L"))
 S DIR0C=$S($G(DIR0C)<1:0,1:DIR0C)+1
 S:DIR0C-1>$L(DIR0A) DIR0C=$L(DIR0A)+1
 S (DIR0QT,DIR0QU)=0,DY=DIR0R,DX=DIR0S,DIR0F=DIR0S+DIR0L
 ;
 X IOXY
 S DIR0SP=$J("",DIR0L) S:$G(DDGLVAN) DIR0SP=$TR(DIR0SP," ","_")
 I DIR0C-1>DIR0L D
 . W $S('$D(DDGLVAN):$P(DDGLVID,DDGLDEL,6),1:"")_$E(DIR0A,DIR0C-DIR0L,DIR0C-1)
 . S DX=DIR0F
 E  D
 . W $S('$D(DDGLVAN):$P(DDGLVID,DDGLDEL,6),1:"")_$E(DIR0A,1,DIR0L)_$E(DIR0SP,$L(DIR0A)+1,999)
 . S DX=DIR0S+DIR0C-1
 . X IOXY
 Q
 ;
END ;
 S Y=$P("U^D^R^L^N^NB^NP^PP^SEL^EX^QT^CL^SV^RF^PRNT^MOUSE",U,$L($P("^UP^DOWN^TAB^FDL^CR^NB^NP^PP^SEL^EX^QT^CL^SV^RF^PRNT^MOUSE^",U_DIR0CH_U),U)) ;RETURN Y FROM READER
 S:Y="" Y=$P($G(DIR0QT),U,2)
 N X,Y S DIR0SP=$TR(DIR0SP,"_"," ")
 S DIR0C=DIR0C-1
 Q
 ;
PAINT ;
 N DIR0X
 I $G(DIR0FLG)["P" W $P(DDGLVID,DDGLDEL,10) Q
 I '$G(DIR0RJ) S DIR0X=$E(DIR0A,1,DIR0L)_$E(DIR0SP,$L(DIR0A)+1,999)
 E  S DIR0X=$E(DIR0SP,$L(DIR0A)+1,999)_$E(DIR0A,1,DIR0L)
 S DX=DIR0S X IOXY
 W $P(DDGLVID,DDGLDEL,10)_$P(DDGLVID,DDGLDEL)_DIR0X_$P(DDGLVID,DDGLDEL,10)
 Q
 ;
UPDATE(DIR0NA,DIR0NC) ;Update ans/curs pos
 N DIR0STR,DIR0X
 S:$D(DIR0NA)[0 DIR0NA=DIR0A
 S DIR0NC=$S($D(DIR0NC)[0:DIR0C-1,1:DIR0NC)+1
 S:DIR0NC<1 DIR0NC=1
 S:DIR0NC-1>$L(DIR0NA) DIR0NC=$L(DIR0NA)+1
 S DIR0X=DX+DIR0NC-DIR0C
 ;
 I DIR0A=DIR0NA,DIR0X'<DIR0S,DIR0X'>DIR0F D
 . S DX=DIR0X X IOXY
 E  D
 . S DIR0X=DIR0NC-DIR0L S:DIR0X<1 DIR0X=1
 . S DX=DIR0S X IOXY
 . S DIR0STR=$E(DIR0NA,DIR0X,DIR0X+DIR0L-1)
 . W DIR0STR_$E(DIR0SP,$L(DIR0STR)+1,999)
 . S DX=DIR0S+DIR0NC-DIR0X X IOXY
 ;
 S DIR0A=DIR0NA,DIR0C=DIR0NC
 Q
 ;
KILL ;
 D KILL^DDGLIB0()
 Q
 ;
 ;#8074  Press <F1>H for help
 ;#7002  Insert^Replace

DIR01
DIR01 ;SFISC/MKO-FIELD EDITOR ;12DEC2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I DIR0A]"",DIR0C=1 D F X IOXY Q:DIR0QT  ;There's a default answer; single-char READ
 F  D E X IOXY Q:DIR0QT
 Q
 ;
F D READ(.DIR0CH)
 I "?^"'[DIR0CH=$L(DIR0CH) S DIR0A="" D REP,DEOF Q
 D:DIR0CH]"" E1
 Q
 ;
E I $G(DIR0("REP"))&DIR0C>1!(DIR0C>$L(DIR0A)),DIR0F>DX,DIR0M>$L(DIR0A),'$D(DIR0KD) D
 . D PREAD($$MIN(DIR0F-DX,DIR0M-DIR0C+1),.DIR0ST,.DIR0CH)
 . Q:DIR0ST=""
 . S DIR0CHG=1
 . I '$G(DIR0("REP")) S DIR0A=DIR0A_DIR0ST
 . E  S $E(DIR0A,DIR0C,DIR0C+$L(DIR0ST)-1)=DIR0ST
 . S DX=DX+$L(DIR0ST),DIR0C=DIR0C+$L(DIR0ST)
 E  D READ(.DIR0CH)
 Q:DIR0CH=""
 ;
E1 I "?^"[DIR0CH,DIR0C=1,'DIR0QU S DIR0A="",DIR0QU=1 D REP,DEOF Q
 D @$S($L(DIR0CH)>1:DIR0CH,$G(DIR0("REP")):"REP",1:"INS")
 I DIR0QU,"?^"'[$E(DIR0A)!'$L(DIR0A) S DIR0QU=0,DIR0A="" D CLR
 Q
 ;
REP I DIR0C>DIR0M W $C(7) Q
 S DIR0CHG=1
 S $E(DIR0A,DIR0C)=DIR0CH,DIR0C=DIR0C+1
 I DIR0F>DX S DX=DX+1 W DIR0CH Q
 N DIX
 S DIX=DIR0C-(DIR0L\2)
 S:$L(DIR0A)-DIX+1<DIR0L DIX=$L(DIR0A)-DIR0L+1
 S DX=DIR0S X IOXY
 W $E(DIR0A,DIX,DIX+DIR0L-1) S DX=DIR0S+DIR0C-DIX
 Q
 ;
INS I $L(DIR0A)'<DIR0M W $C(7) Q
 S DIR0CHG=1
 S DIR0A=$E(DIR0A,1,DIR0C-1)_DIR0CH_$E(DIR0A,DIR0C,999),DIR0C=DIR0C+1
 I DIR0F>DX S DX=DX+1 W $E(DIR0A,DIR0C-1,DIR0C+DIR0F-DX-1) Q
 S DX=DIR0S X IOXY W $E(DIR0A,DIR0C-DIR0L,DIR0C-1) S DX=DIR0F
 Q
 ;
RIGHT Q:DIR0C>$L(DIR0A)
 I DX<DIR0F S DX=DX+1,DIR0C=DIR0C+1 Q
 S DIR0C=DIR0C+1,DX=DIR0S X IOXY
 W $E(DIR0A,DIR0C-DIR0L,DIR0C-1)
 S DX=DIR0F
 Q
 ;
LEFT Q:DIR0C'>1
 I DX>DIR0S S DX=DX-1,DIR0C=DIR0C-1 Q
 S DIR0C=DIR0C-1 W $E(DIR0A,DIR0C,DIR0C+DIR0L-1)
 Q
 ;
JRT Q:DIR0C>$L(DIR0A)
 I DIR0F=DX D  Q
 . S DIR0C=DIR0C+DIR0L S:DIR0C+1>$L(DIR0A) DIR0C=$L(DIR0A)+1
 . S DX=DIR0S X IOXY W $E(DIR0A,DIR0C-DIR0L,DIR0C-1)
 . S DX=DIR0F
 N DIX
 S DIX=$L(DIR0A)-DIR0C+1
 I DIR0F-DX>DIX S DX=DX+DIX,DIR0C=DIR0C+DIX Q
 S DIR0C=DIR0C+DIR0F-DX,DX=DIR0F
 Q
 ;
JLT Q:DIR0C'>1
 I DX=DIR0S D  Q
 . S DIR0C=DIR0C-DIR0L S:DIR0C<1 DIR0C=1
 . W $E(DIR0A,DIR0C,DIR0C+DIR0L-1)
 S DIR0C=DIR0C-DX+DIR0S,DX=DIR0S
 Q
 ;
FDE Q:DIR0C>$L(DIR0A)
 I DX+$L(DIR0A)-DIR0C-DIR0L<DIR0S D  Q
 . S DX=DX+$L(DIR0A)-DIR0C+1,DIR0C=$L(DIR0A)+1
 S DIR0C=$L(DIR0A)+1,DX=DIR0S X IOXY
 W $E(DIR0A,DIR0C-DIR0L,DIR0C)
 S DX=DIR0F
 Q
 ;
FDB Q:DIR0C'>1
 I DX-DIR0C+1<DIR0S S DX=DIR0S X IOXY W $E(DIR0A,1,DIR0L)
 S DX=DIR0S,DIR0C=1
 Q
 ;
BS Q:DIR0C'>1
 S DIR0CHG=1
 S DIR0C=DIR0C-1,DIR0A=$E(DIR0A,1,DIR0C-1)_$E(DIR0A,DIR0C+1,999)
 I DX>DIR0S D  Q
 . S DX=DX-1 X IOXY
 . W $E(DIR0A_$E(DIR0SP),DIR0C,DIR0C+DIR0F-DX-1)
 N DIX
 S DIX=DIR0C-(DIR0L\2)
 S:$L(DIR0A)-DIX+1<DIR0L DIX=$L(DIR0A)-DIR0L+1
 S:DIX<1 DIX=1
 W $E(DIR0A,DIX,DIX+DIR0L-1) S DX=DIR0S+DIR0C-DIX
 Q
 ;
DEL Q:DIR0C>$L(DIR0A)!(DIR0F'>DX)
 S DIR0CHG=1
 S DIR0A=$E(DIR0A,1,DIR0C-1)_$E(DIR0A,DIR0C+1,999)
 W $E(DIR0A_$E(DIR0SP),DIR0C,DIR0C+DIR0F-DX-1)
 Q
 ;
CLR S DIR0CHG=1
 S DIR0C=1,DX=DIR0S X IOXY
 I DIR0A]"",DIR0A'=DIR0D S DIR0SV=DIR0A
 S DIR0A=$S(DIR0A=DIR0D:DIR0SV,DIR0A="":DIR0D,1:"")
 W $E(DIR0A,1,DIR0L)_$E(DIR0SP,$L(DIR0A)+1,999)
 Q
 ;
DEOF S DIR0CHG=1
 W $E(DIR0SP,DX-DIR0S+1,999)
 S DIR0A=$E(DIR0A,1,DIR0C-1)
 Q
 ;
RPM N DX,DY
 I $D(DDS) S DX=IOM-8,DY=IOSL-1 X IOXY
 I $G(DIR0("REP")) W:$D(DDS) "Insert " K DIR0("REP")
 E  W:$D(DDS) "Replace" S DIR0("REP")=1
 Q
 ;
KPM I $G(DDGLKPNM) K DDGLKPNM W $P(DDGLED,DDGLDEL,9)
 E  S DDGLKPNM=1 W $P(DDGLED,DDGLDEL,10)
 Q
 ;
WRT G WRT^DIR0W
WLT G WLT^DIR0W
DLW G DLW^DIR0W
HLP G ^DIR0H
ZM G SM^DIR02
 ;
TO I $D(DIR0TO)#2 D @DIR0TO Q
 S DTOUT=1
UP ;
DOWN ;
TAB ;
FDL ;
CR ;
NB ;
NP ;
PP ;
SEL ;
EX ;
QT ;
CL ;
SV ;
RF ;
PRNT ;
 S DIR0QT=1
 Q
 ;
MOUSERT ;not used(?)
 Q
MOUSEDN N % R *%,*%
 Q
 ;
MOUSE ;
 X DDGLZOSF("EOFF") R *DDSMX,*DDSMY X DDGLZOSF("EON") S DDSMX=DDSMX-33,DDSMY=DDSMY-33,DDSMOUSY=1 ;Get $X,$Y from mouse
 S X="" F  S X=$O(DDSMOUSE(DDSMY,X)) Q:X=""!(X>DDSMX)  S P=$O(DDSMOUSE(DDSMY,X,"")) I P'<DDSMX S X=$G(DDSMOUSE(DDSMY,X,P,1)) S:X]"" DIR0A=X Q  ;MOUSE clicked on CHOICE
 I +DIR0=DDSMY,DDSMX'<$P(DIR0,U,2),$P(DIR0,U,2)+$P(DIR0,U,3)-1'<DDSMX D  ;MOUSE CLICK is where we already are
 .S DIR0CH="CR" ;SELECT if this is "CLOSE" Command, or if field is filled in, & has BRANCHING LOGIC or is just REACHABLE
 .I $G(DIR0A)]"",$G(DDS) Q:DDSMY+1=IOSL  I $G(DDSBK),$G(DDO) Q:$G(^DIST(.404,DDSBK,40,DDO,10))]""!($P($G(^(4)),U,4)=2)
 .S DIR0A="??" ;Otherwise, give HELP
 G EX
 ;
NOP W $C(7)
 Q
 ;
READ(Y) ;Out: Y=char or mnemonic
 F  D  Q:Y'=-1
 . R *Y:DTIME
 . I Y>31,Y<127 S Y=$C(Y) Q
 . I Y<0 S Y="TO" Q
 . D MNE(.Y)
 I Y'="TO",$D(DIR0KD) D @DIR0KD
 Q
 ;
PREAD(DIR0LEN,DIR0ST,Y) ;CALLED BY DIR03.  Y is really DIR0CH
 ; Y = Mnem, Null if DIR0LEN chars read or invalid
 X DDGLZOSF("EON")
 R DIR0ST#DIR0LEN:DTIME E  S Y="TO" Q
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMRD")
 I $C(Y)?1C,Y D
 . D MNE(.Y) S:Y=-1 Y=""
 E  S Y=""
 Q
 ;
MNE(Y) ;Out: Y=mnemonic, or -1 if invalid
 N S,F
 S S="",F=0
 F  D MNELOOP Q:F
 Q
 ;
MNELOOP ;translate IN to OUT
 S S=S_$C(Y)
 I DIR0(DIR0P_"IN")'[(U_S) D  I Y=-1 D FLUSH Q
 . I $C(Y)'?1L S Y=-1 Q
 . S S=$E(S,1,$L(S)-1)_$C(Y-32)
 . S:DIR0(DIR0P_"IN")'[(U_S_U) Y=-1
 ;
 I DIR0(DIR0P_"IN")[(U_S_U),S'=$C(27) D
 . S Y=$P(DIR0(DIR0P_"OUT"),";",$L($P(DIR0(DIR0P_"IN"),U_S_U),U)),F=1
 E  R *Y:5 D:Y=-1 FLUSH
 Q
 ;
FLUSH N X
 S F=1 W $C(7) F  R *X:0 E  Q
 Q
 ;
MIN(X,Y) ;
 Q $S(X<Y:X,1:Y)

DIR02
DIR02 ;SFISC/MKO-MULTILINE FIELD EDITOR ;25MAY2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 N DIR0FL,DIR0LN,DIR0NC,DIR0QU
 X DDGLZOSF("EOFF"),DDGLZOSF("TRMON")
 W $S('$D(DDGLVAN):$P(DDGLVID,DDGLDEL,6),1:"")
 S DIR0QU=0
 ;
 S:$D(DIR0C)#2 DIR0C=DIR0C+1
 D INIT,^DIR03
 W $P(DDGLVID,DDGLDEL,7)
 Q
 ;
SM ;ScreenMan's entry point, called from ^DIR01
 N DIR0DN,DIR0FL,DIR0LN,DIR0NC,DIR0NL
 S DIR0R=IOSL-6,DIR0S=0,DIR0L=IOM-1,DIR0NL=4
 ;
 D INIT,^DIR03
 ;
 S:$D(DTOUT) DIR0A=DIR0D
 ;
 ;Restore command area
 S DY=DIR0R,DX=DIR0S X IOXY
 W $P(DDGLVID,DDGLDEL,10)_$P(DDGLCLR,DDGLDEL,3) F DY=DY:1:IOSL-1 K DDSMOUSE(DY)
 ;
BOT D BOT^DDSCOM
 ;Restore variables
 S (DY,DIR0R)=$P(DIR0,U),(DX,DIR0S)=$P(DIR0,U,2),DIR0L=$P(DIR0,U,3)
 S DIR0F=DIR0S+DIR0L
 S DIR0SP=$J("",DIR0L) S:$G(DDGLVAN) DIR0SP=$TR(DIR0SP," ","_")
 I DIR0A]"","^?"[$E(DIR0A) S DIR0QT=1
 ;
 ;Repaint answer
 X IOXY
 W:'$D(DDGLVAN) $P(DDGLVID,DDGLDEL,6)
 I DIR0C>DIR0L D
 . W $E(DIR0A,DIR0C-DIR0L+1,DIR0C)_$E(DIR0SP,DIR0C>$L(DIR0A))
 . S DX=DIR0F-1
 E  D
 . W $E(DIR0A,1,DIR0L)_$E(DIR0SP,$L(DIR0A)+1,999)
 . S DX=DIR0S+DIR0C-1
 X IOXY
 K DTOUT
 Q
 ;
 ;
 ;
INIT ;Setup
 K DTOUT
 S:DIR0M<$L(DIR0A) DIR0M=$L(DIR0A)
 S DIR0SP=$J("",DIR0L) S:$G(DDSVAN) DIR0SP=$TR(DIR0SP," ","_")
 ;
 F DIR0LN=1:1:DIR0NL D
 . S DY=DIR0R+DIR0LN-1,DX=DIR0S X IOXY
 . S X=$E(DIR0A,DIR0LN-1*DIR0L+1,DIR0LN*DIR0L)
 . W X_$E(DIR0SP,$L(X)+1,999)
 ;
 S:DIR0NL*DIR0L-1<DIR0M DIR0M=DIR0NL*DIR0L-1
 S DIR0NL=DIR0M\DIR0L+1,DIR0NC=DIR0M#DIR0L
 S DIR0F=DIR0S+DIR0L-1,DIR0FL=DIR0S+DIR0NC-1
 S DIR0SV=$G(DIR0("L")),DIR0DN=0
 ;
 S DIR0C=$S($G(DIR0C)<1:1,1:DIR0C)
 S:DIR0C-1>DIR0M DIR0C=DIR0M+1
 S DIR0LN=DIR0C\DIR0L+1
 S DY=DIR0R+DIR0LN-1,DX=DIR0S+(DIR0C#DIR0L)-1
 X IOXY
 Q
 ;
KILL ;Cleanup all variables
 D KILL^DDGLIB0()
 Q

DIR03
DIR03 ;SFISC/MKO-MULTILINE FIELD EDITOR ;11OCT2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F  D E X IOXY Q:DIR0DN!$G(DIR0QT)
 Q
 ;
E I $G(DIR0("REP"))&DIR0C>1!(DIR0C>$L(DIR0A)),$S(DIR0LN<DIR0NL:DIR0F,1:DIR0FL)>DX,'$D(DIR0KD) D
 . D PREAD^DIR01($S(DIR0LN<DIR0NL:DIR0F,1:DIR0FL)-DX,.DIR0ST,.DIR0CH)
 . Q:'$L(DIR0ST)
 . I '$G(DIR0("REP")) S DIR0A=DIR0A_DIR0ST
 . E  S $E(DIR0A,DIR0C,DIR0C+$L(DIR0ST)-1)=DIR0ST
 . S DX=DX+$L(DIR0ST),DIR0C=DIR0C+$L(DIR0ST)
 E  D READ^DIR01(.DIR0CH)
 Q:DIR0CH=""
 ;
 I "?^"[DIR0CH,DIR0C=1,'DIR0QU D  Q
 . D DEOF X IOXY
 . S DIR0A="",DIR0QU=1 D REP
 D @$S($L(DIR0CH)>1:DIR0CH,$G(DIR0("REP")):"REP",1:"INS")
 I DIR0QU,"?^"'[$E(DIR0A)!'$L(DIR0A) S DIR0QU=0,DIR0A="" D CLR
 Q
 ;
REP I DIR0C>DIR0M W $C(7) Q
 S DIR0CHG=1
 S DIR0A=$E(DIR0A,1,DIR0C-1)_DIR0CH_$E(DIR0A,DIR0C+1,999)
 S DIR0C=DIR0C+1
 W DIR0CH
 I DX<DIR0F S DX=DX+1 Q
 S DIR0LN=DIR0LN+1,DY=DY+1,DX=DIR0S Q
 Q
 ;
INS I $L(DIR0A)'<DIR0M W $C(7) Q
 S DIR0CHG=1
 S DIR0A=$E(DIR0A,1,DIR0C-1)_DIR0CH_$E(DIR0A,DIR0C,999)
 W $E(DIR0A,DIR0C,DIR0C+DIR0F-DX)
 D
 . N DIR0LN,DY,DX
 . S DX=DIR0S
 . F DIR0LN=DIR0C-1\DIR0L+2:1:$L(DIR0A)\DIR0L+1 D
 .. S DY=DIR0R+DIR0LN-1 X IOXY
 .. W $E(DIR0A,DIR0LN-1*DIR0L+1,DIR0LN*DIR0L)
 S DIR0C=DIR0C+1
 I DX<DIR0F S DX=DX+1 Q
 S DIR0LN=DIR0LN+1,DY=DY+1,DX=DIR0S
 Q
 ;
RIGHT Q:DIR0C>$L(DIR0A)
 S DIR0C=DIR0C+1
 I DX<DIR0F!(DIR0LN=DIR0NL) S DX=DX+1 Q
 S DIR0LN=DIR0LN+1,DY=DY+1,DX=DIR0S
 Q
 ;
LEFT Q:DIR0C'>1
 S DIR0C=DIR0C-1
 I DX>DIR0S S DX=DX-1 Q
 S DIR0LN=DIR0LN-1,DY=DY-1,DX=DIR0F
 Q
 ;
JRT Q:DIR0C>$L(DIR0A)
 Q:DX=DIR0F
 S DIR0C=DIR0LN*DIR0L S:DIR0C>$L(DIR0A) DIR0C=$L(DIR0A)+1
 S DX=DIR0C#DIR0L-1+DIR0S S:DX<DIR0S DX=DIR0F
 Q
 ;
JLT Q:DIR0C'>1
 Q:DX=DIR0S
 S DIR0C=DIR0C-DX+DIR0S,DX=DIR0S
 Q
 ;
UP Q:DIR0LN=1
 S DIR0C=DIR0C-DIR0L,DIR0LN=DIR0LN-1,DY=DY-1
 Q
 ;
DOWN Q:DIR0LN=DIR0NL
 Q:$L(DIR0A)\DIR0L<DIR0LN
 S DIR0C=DIR0C+DIR0L,DIR0LN=DIR0LN+1,DY=DY+1
 S:DIR0C>($L(DIR0A)+1) DIR0C=$L(DIR0A)+1,DX=DIR0C#DIR0L+DIR0S-1
 Q
 ;
FDE ;
NP Q:DIR0C>$L(DIR0A)
 S DIR0C=$L(DIR0A)+1,DIR0LN=DIR0C-1\DIR0L+1,DX=DIR0C-1#DIR0L+DIR0S
 S:DIR0LN>DIR0NL DIR0LN=DIR0NL,DX=DIR0S+DIR0NC
 S DY=DIR0R+DIR0LN-1
 Q
 ;
FDB ;
PP Q:DIR0C'>1
 S DIR0LN=1,DY=DIR0R,DX=DIR0S,DIR0C=1
 Q
 ;
BS Q:DIR0C'>1
 S DIR0CHG=1
 S DX=DX-1,DIR0C=DIR0C-1
 S DIR0A=$E(DIR0A,1,DIR0C-1)_$E(DIR0A,DIR0C+1,999)_" "
 I DX<DIR0S S DIR0LN=DIR0LN-1,DY=DY-1,DX=DIR0F
 X IOXY W $E(DIR0A,DIR0C,DIR0C+DIR0F-DX)
 D
 . N DIR0LN,DY,DX
 . S DX=DIR0S
 . F DIR0LN=DIR0C-1\DIR0L+2:1:$L(DIR0A)\DIR0L+1 D
 .. S DY=DIR0R+DIR0LN-1 X IOXY
 .. W $E(DIR0A,DIR0LN-1*DIR0L+1,DIR0LN*DIR0L)
 S DIR0A=$E(DIR0A,1,$L(DIR0A)-1)
 Q
 ;
DEL Q:DIR0C>$L(DIR0A)
 S DIR0CHG=1
 S DIR0A=$E(DIR0A,1,DIR0C-1)_$E(DIR0A,DIR0C+1,999)_" "
 W $E(DIR0A,DIR0C,DIR0C+DIR0F-DX)
 D
 . N DIR0LN,DY,DX
 . S DX=DIR0S
 . F DIR0LN=DIR0C-1\DIR0L+2:1:$L(DIR0A)\DIR0L+1 D
 .. S DY=DIR0R+DIR0LN-1 X IOXY
 .. W $E(DIR0A,DIR0LN-1*DIR0L+1,DIR0LN*DIR0L)
 S DIR0A=$E(DIR0A,1,$L(DIR0A)-1)
 Q
 ;
CLR N %X
 S DIR0CHG=1
 S %X=DIR0A
 I DIR0A]"",DIR0A'=DIR0D S DIR0SV=DIR0A
 S DIR0A=$S(DIR0A=DIR0D:DIR0SV,DIR0A="":DIR0D,1:"")
 S %X=DIR0A_$J("",$L(%X)-$L(DIR0A))
 S DX=DIR0S
 F DIR0LN=1:1:$L(%X)\DIR0L+1 D
 . S DY=DIR0R+DIR0LN-1 X IOXY
 . W $E(%X,DIR0LN-1*DIR0L+1,DIR0LN*DIR0L)
 S (DIR0C,DIR0LN)=1,DY=DIR0R
 Q
 ;
DEOF N %X
 Q:DIR0C>$L(DIR0A)
 S DIR0CHG=1
 S %X=DIR0A,DIR0A=$E(DIR0A,1,DIR0C-1),%X=DIR0A_$J("",$L(%X)-$L(DIR0A))
 W $E(%X,DIR0C,DIR0C+DIR0F-DX)
 D
 . N DIR0LN,DY,DX
 . S DX=DIR0S
 . F DIR0LN=DIR0C-1\DIR0L+2:1:$L(%X)\DIR0L+1 D
 .. S DY=DIR0R+DIR0LN-1 X IOXY
 .. W $E(%X,DIR0LN-1*DIR0L+1,DIR0LN*DIR0L)
 Q
 ;
RPM N DX,DY
 I $D(DDS) S DX=IOM-8,DY=IOSL-1 X IOXY
 I $G(DIR0("REP")) W "Insert " K DIR0("REP")
 E  W "Replace" S DIR0("REP")=1
 Q
 ;
KPM I $G(DDGLKPNM) K DDGLKPNM W $P(DDGLED,DDGLDEL,9)
 E  S DDGLKPNM=1 W $P(DDGLED,DDGLDEL,10)
 Q
 ;
WRT G WRT2^DIR0W
WLT ;
FDL G WLT2^DIR0W
DLW G DLW2^DIR0W
 ;
HLP ;
NB ;
SEL ;
SV ;
RF ;
NOP W $C(7)
 Q
TO I $D(DIR0TO)#2 D @DIR0TO Q
 S DTOUT=1
ZM ;
QT ;
EX ;
CL ;
TAB ;
CR S DIR0DN=1
 Q
 ;
MOUSEDN N % R *%,*%
 Q
MOUSE G MOUSE^DIR01

DIR0H
DIR0H ;SFISC/MKO-HELP FOR SCREENS ;27JUN2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIR0DX,DIR0DY,DIR0X,DIREPLIN
 S DIR0DX=DX,DIR0DY=DY
 S DIREPLIN=$P($$EZBLD^DIALOG(7002),U,$S($G(DIR0("REP")):2,1:1)) ;INSERT/REPLACE
 W $P(DDGLVID,DDGLDEL,10)_$P(DDGLCLR,DDGLDEL,2)_$P(DDGLVID,DDGLDEL)
 D HLP^DDGLIBH(9231,9233,"DDSH",IOSL-1)
 I $D(DDS)#2 D
 .D R^DDS3 I $D(DDO)#2 D
 .. I 'DDO D CMD
 .. E  D
 ... K DDSH
EGP ... S DX=0,DY=IOSL-1 X DDXY W $$EZBLD^DIALOG(8000) ;**CCO/NI 'COMMAND:'
 ... S DX=IOM-35 X IOXY W $P(DDGLVID,DDGLDEL,10)_$$EZBLD^DIALOG(8074) ;** 'PF1-H'
 E  W $P(DDGLCLR,DDGLDEL,2)
 ;
 S DX=IOM-$L(DIREPLIN)-1,DY=IOSL-1 X IOXY
 W $P(DDGLVID,DDGLDEL,10)_$S('$D(DDGLVAN):$P(DDGLVID,DDGLDEL,6),1:"")_DIREPLIN_$P(DDGLVID,DDGLDEL,10)
 ;
 S DY=$P(DIR0,U,4),DX=$P(DIR0,U,5)
 I $D(DIR("A"))=11 D
 . S DIR0X=""
 . F  S DIR0X=$O(DIR("A",DIR0X)) Q:DIR0X=""  D
 .. X IOXY
 .. W DIR("A",DIR0X)
 .. S DY=DY+1
 ;
 I $D(DIR("A"))#2 D
 . X IOXY W DIR("A")
 . I $D(DDS),DDO,DY=IOSL-1 W $P(DDGLCLR,DDGLDEL)
 ;
 S DIR0X=$E(DIR0A,DIR0C-DIR0DX+DIR0S,DIR0C+DIR0F-DIR0DX-1)
 S DX=DIR0S,DY=DIR0DY X IOXY W $S('$D(DDGLVAN):$P(DDGLVID,DDGLDEL,6),1:"")_DIR0X,$E(DIR0SP,$L(DIR0X)+1,999)
 S DX=DIR0DX X IOXY
 Q
 ;
 ;
 ;
H ;MOUSE COMES HERE
 N HELP,I
 F I=0:0 S I=$O(^DI(.84,9234,2,I)) Q:'I  I $G(^(I,0))'?." " S HELP($O(HELP(""),-1)+1)=^(0)
 D HLP^DDSUTL(.HELP) Q
 D:$D(DDS)#2 R^DDS3 ;REFRESH
 Q
 ;
 ;
 ;
CMD ;
 K DDH,DDQ
 F DDH=1:1 Q:$D(DIR("?",DDH))[0  S DDH(DDH,"T")=DIR("?",DDH)
 S:$D(DIR("?"))#2 DDH(DDH,"T")=DIR("?")
 D LIST^DDSU
 Q

DIR0K
DIR0K ;SFISC/MKO-GET KEYS FOR FIELD EDITOR ;29APR2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
GETKEY ;Get key sequences
 N AU,AD,AR,AL,F1,F2,F3,F4,I,K,T
 N REMOVE,PREVSC,NEXTSC
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S AR=$P(DDGLKEY,U,4)
 S AL=$P(DDGLKEY,U,5)
 S F1=$P(DDGLKEY,U,6)
 S F2=$P(DDGLKEY,U,7)
 S F3=$P(DDGLKEY,U,8)
 S F4=$P(DDGLKEY,U,9)
 S REMOVE=$P(DDGLKEY,U,13)
 S PREVSC=$P(DDGLKEY,U,14)
 S NEXTSC=$P(DDGLKEY,U,15)
 ;
 S DIR0(DIR0P_"IN")="",DIR0(DIR0P_"OUT")=""
 ;
NOMOUSE N NOMOUSE I $G(^XTV(8989.5,0))?1"PARAM".E,$$GET^XPAR("ALL","DI SCREENMAN NO MOUSE") S NOMOUSE=1 ;DISABLE MOUSE CLICKS
 I DIR0P="C" S I="" F  S I=$O(DIR0MAP(I)) Q:I'=+$P(I,"E")  S T=DIR0MAP(I) D INOUT
 F I=1:1 S T=$P($T(GENMAP+I),";;",2,999) Q:T=""  D INOUT
 I DIR0P="" F I=1:1 S T=$P($T(SMMAP+I),";;",2,999) Q:T=""  D INOUT
 ;
 S DIR0(DIR0P_"IN")=DIR0(DIR0P_"IN")_U
 S DIR0(DIR0P_"OUT")=$E(DIR0(DIR0P_"OUT"),1,$L(DIR0(DIR0P_"OUT"))-1)
 Q
 ;
INOUT ;Set DIR0("IN") and DIR0("OUT")
 I $P(T,";",2)="KEYDOWN" Q:$P(T,";")=""  S DIR0KD=$P(T,";"),K="KD"
 E  I $P(T,";",2)="TIMEOUT" Q:$P(T,";")=""  S DIR0TO=$P(T,";"),K="TO"
 E  S @("K="_$P(T,";",2)) I $G(NOMOUSE),T?1"MOUSE".E Q  ;WE MAY NOT ALLOW THE THREE MOUSECLICKS
 I DIR0(DIR0P_"IN")'[(U_K) D
 . S DIR0(DIR0P_"IN")=DIR0(DIR0P_"IN")_U_K
 . S DIR0(DIR0P_"OUT")=DIR0(DIR0P_"OUT")_$P(T,";")_";"
 ;
 Q
GENMAP ;General field editor key sequences
 ;;RIGHT;AR
 ;;LEFT;AL
 ;;JRT;F1_AR
 ;;JLT;F1_AL
 ;;FDE;F1_F1_AR
 ;;FDB;F1_F1_AL
 ;;WRT;F1_" "
 ;;WRT;$C(12)
 ;;WLT;$C(10)
 ;;DEL;REMOVE
 ;;DEL;F2
 ;;CLR;F1_"D"
 ;;CLR;$C(21)
 ;;DEOF;F1_F2
 ;;DLW;$C(23)
 ;;CR;$C(13)
 ;;UP;AU
 ;;DOWN;AD
 ;;TAB;$C(9)
 ;;RPM;F3
 ;;BS;$C(127)
 ;;BS;$C(8)
 ;;MOUSE;$C(27,91,77,35)
 ;;MOUSEDN;$C(27,91,77,32)
 ;;MOUSERT;$C(27,91,77,33)
 ;;
SMMAP ;ScreenMan specific key sequences
 ;;FDL;F4
 ;;NB;F1_F4
 ;;NP;F1_AD
 ;;NP;NEXTSC
 ;;PP;F1_AU
 ;;PP;PREVSC
 ;;HLP;F1_"H"
 ;;SEL;F1_"L"
 ;;EX;F1_"E"
 ;;QT;F1_"Q"
 ;;CL;F1_"C"
 ;;SV;F1_"S"
 ;;RF;F1_"R"
 ;;ZM;F1_"Z"
 ;;PRNT;F1_"P"
 ;;

DIR0W
DIR0W ;SFISC/MKO-WORD FUNCTIONS FOR FIELD EDITOR ;09:45 AM  12 Dec 1994
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
WRT N DIR0I
 Q:DIR0C>$L(DIR0A)
 S DIR0I=$$WRPOS(DIR0A)
 ;
 I DIR0C-DX+DIR0S+DIR0L>DIR0I S DX=DX+DIR0I-DIR0C,DIR0C=DIR0I Q
 S DIR0C=DIR0I,DX=DIR0S X IOXY
 I $L(DIR0A)-DIR0L<DIR0C D
 . W $E(DIR0A,$L(DIR0A)-DIR0L+1,$L(DIR0A))
 . S DX=DIR0S+DIR0C-$L(DIR0A)+DIR0L-1
 E  W $E(DIR0A,DIR0C,DIR0C+DIR0L-1)
 Q
 ;
WLT N DIR0D,DIR0I,DIR0T
 Q:DIR0C=1
 S DIR0T=$$PUNC(DIR0A)
 ;
 S DIR0I=DIR0C-1
 I $E(DIR0T,DIR0I)=" " F DIR0I=DIR0I-1:-1:0 Q:$E(DIR0T,DIR0I)'=" "
 I $E(DIR0T,DIR0I)="!" D
 . F DIR0I=DIR0I-1:-1:0 Q:$E(DIR0T,DIR0I)'="!"
 E  I DIR0I D
 . F DIR0I=DIR0I-1:-1:0 Q:" !"[$E(DIR0T,DIR0I)
 S DIR0I=DIR0I+1
 ;
 I DIR0C-DX+DIR0S'>DIR0I S DX=DX-DIR0C+DIR0I,DIR0C=DIR0I Q
 S DIR0C=DIR0I,DX=DIR0S X IOXY
 I DIR0L'<DIR0C W $E(DIR0A,1,DIR0L) S DX=DIR0S+DIR0C-1 Q
 S DX=DIR0L*2\3+DIR0S W $E(DIR0A,DIR0C-DX+DIR0S,DIR0C+DIR0F-DX-1)
 Q
 ;
DLW N DIR0I,DIR0X
 Q:DIR0C>$L(DIR0A)
 S DIR0CHG=1
 ;
 S DIR0I=$$WRPOS(DIR0A)
 S $E(DIR0A,DIR0C,DIR0I-1)=""
 ;
 S DIR0X=DIR0L\3+DIR0S
 I DX>DIR0X,$L($E(DIR0A,DIR0C,$L(DIR0A)))+DIR0X>DIR0F D
 . S DX=DIR0S X IOXY
 . W $E(DIR0A,DIR0C-DIR0X+DIR0S,DIR0C+DIR0F-DIR0X-1)
 . S DX=DIR0X
 E  D
 . S DIR0X=$E(DIR0A,DIR0C,DIR0C+DIR0F-DX-1)
 . S DIR0X=DIR0X_$J("",DIR0F-DX-$L(DIR0X))
 . W DIR0X
 Q
 ;
WRT2 Q:DIR0C>$L(DIR0A)
 S DIR0C=$$WRPOS(DIR0A)
 ;
 I DIR0C>$L(DIR0A) S DIR0C=0 D FDE^DIR03 Q
 S DIR0LN=DIR0C-1\DIR0L+1,DX=DIR0C-1#DIR0L+DIR0S
 S:DIR0LN>DIR0NL DIR0LN=DIR0NL,DX=DIR0S+DIR0NC
 S DY=DIR0R+DIR0LN-1
 Q
 ;
WLT2 N DIR0D,DIR0I,DIR0T
 Q:DIR0C=1
 S DIR0T=$$PUNC(DIR0A)
 ;
 S DIR0I=DIR0C-1
 I $E(DIR0T,DIR0I)=" " F DIR0I=DIR0I-1:-1:0 Q:$E(DIR0T,DIR0I)'=" "
 I $E(DIR0T,DIR0I)="!" D
 . F DIR0I=DIR0I-1:-1:0 Q:$E(DIR0T,DIR0I)'="!"
 E  I DIR0I D
 . F DIR0I=DIR0I-1:-1:0 Q:" !"[$E(DIR0T,DIR0I)
 S DIR0I=DIR0I+1
 ;
 I DIR0I=1 D FDB^DIR03 Q
 S DIR0C=DIR0I,DIR0LN=DIR0C-1\DIR0L+1,DX=DIR0C-1#DIR0L+DIR0S
 S:DIR0LN>DIR0NL DIR0LN=DIR0NL,DX=DIR0S+DIR0NC
 S DY=DIR0R+DIR0LN-1
 Q
 ;
DLW2 N DIR0I,DIR0X
 Q:DIR0C>$L(DIR0A)
 S DIR0CHG=1
 ;
 S DIR0I=$$WRPOS(DIR0A)
 S $E(DIR0A,DIR0C,DIR0I-1)=""
 ;
 S DIR0X=DIR0A_$J("",DIR0I-DIR0C)
 W $E(DIR0X,DIR0C,DIR0C+DIR0F-DX)
 D
 . N DY,DX
 . S DX=DIR0S
 . F DIR0I=DIR0C\DIR0L+2:1:$L(DIR0X)\DIR0L+1 D
 .. S DY=DIR0R+DIR0I-1 X IOXY
 .. W $E(DIR0X,DIR0I-1*DIR0L+1,DIR0I*DIR0L)
 Q
 ;
WRPOS(DIR0T) ;
 N DIR0I,DIR0P,DIR0S
 S DIR0T=$$PUNC(DIR0T)
 S DIR0S=$F(DIR0T," ",DIR0C+1),DIR0P=$F(DIR0T,"!",DIR0C+1)
 S:'DIR0S DIR0S=999 S:'DIR0P DIR0P=999
 ;
 I DIR0S=999,DIR0P=999 D
 . S DIR0I=$L(DIR0T)+1
 E  I $E(DIR0T,DIR0C)="!" D
 . F DIR0I=DIR0C+1:1 Q:$E(DIR0T,DIR0I)'="!"
 . F DIR0I=DIR0I:1 Q:$E(DIR0T,DIR0I)'=" "
 E  I DIR0S<DIR0P D
 . F DIR0I=DIR0S:1 Q:$E(DIR0T,DIR0I)'=" "
 E  S DIR0I=DIR0P-1
 Q DIR0I
 ;
PUNC(X) ;
 Q $TR(X,"`~!@#$%^&*()-_=+\|[{]};:'"",<.>/?",$TR($J("",32)," ","!"))

DIR1
DIR1 ;SFISC/XAK(PROCESS DATATYPE) ;4DEC2009
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S %E=0 D @%T S:X?.E1C.E %E=1 Q:'%E!(X'?.E1L.E)!(%A["S")!(%A["Y")!((%T=1)&(%B["P"))!(%A["P")
 S X=$$UP^DILIBF(X) ;**CCO/NI UPPERCASE TRANSLATION
 G DIR1
0 Q
Y ; YES/NO
 I $G(DUZ("LANG"))>1,$G(%B)]"" S %J=$F("YN",$$UP^DILIBF($E(X))) I %J S X=$P($P(%B,";",%J-1),":",2) ;YES/NO in FOREIGN LANGUAGE
S ; SET
 N %BU,%K,%M,%J,DDH
 I $L(X)>245 S %E=1,Y="" Q  ;DI*156
 I %T="S",$D(DIR("S"))#2 S DIC("S")=DIR("S")
 S %BA=$S($D(DIC("S")):DIC("S"),1:"I 1")
 S (%J,%K,DDH)=0
 I %B'[":",$O(DIR("C",""))]"" D
 . ;Look for match on internal code
 . S %I="" F  S %I=$O(DIR("C",%I)) Q:%I=""  S %J=DIR("C",%I) I X=$P(%J,":") S Y=X,Y(0)=$P(%J,":",2) X %BA S:'$T %I="" Q
 . ;If not found, look for match on external code
 . I %I="" F  S %I=$O(DIR("C",%I)) Q:%I=""  S %J=DIR("C",%I) I $F(%J,":"_X) S Y=$P(%J,":") X %BA I  S %K=%K+1,%K(%K)=%J Q:%A["o"  I $D(DIQUIET),X=$P(%J,":",2) Q
 . ;If still no match, convert X and choices to uppercase, search again
 . I %I="",%A'["X",'%K D
 .. S %M=X N X S X=$$UP^DILIBF(%M)
 .. F  S %I=$O(DIR("C",%I)) Q:%I=""  S %J1=DIR("C",%I),%J=$$UP^DILIBF(%J1) I X=$P(%J,":") S Y=$P(%J1,":"),Y(0)=$P(%J1,":",2) X %BA S:'$T %I="" Q
 .. I %I="" F  S %I=$O(DIR("C",%I)) Q:%I=""  S %J1=DIR("C",%I),%J=$$UP^DILIBF(%J1) I $F(%J,":"_X) S Y=$P(%J1,":") X %BA I  S %K=%K+1,%K(%K)=%J1 Q:%A["o"  I $D(DIQUIET),X=$P(%J,":",2) Q
 . S %J=%I
 E  D
 . S Y(0)=$P($P(";"_%B,";"_X_":",2),";") I Y(0)]"" S Y=X X %BA I  S %J=1
 . I '%J F %I=1:1 S %J=$P(%B,";",%I) Q:%J=""  S Y=$F(%J,":"_X) I Y S Y=$P(%J,":") X %BA I  S %K=%K+1,%K(%K)=%J Q:%A["o"  I $D(DIQUIET),X=$P(%J,":",2) Q
 . I %J="",%A'["X",'%K D
 .. S %BU=$$UP^DILIBF(%B),%M=X N X S X=$$UP^DILIBF(%M)
 .. S Y=$F(";"_%BU,";"_X_":") I Y D  X %BA I  S %J=1 Q
 ... S Y(0)=$P($E(";"_%B,Y,999),";")
 ... S Y=$L($E(";"_%B,1,Y-1),";"),Y=$P($P(";"_%B,";",Y),":")
 .. F %I=1:1 S %J=$P(%BU,";",%I),%J1=$P(%B,";",%I) Q:%J=""  S Y=$F(%J,":"_X) I Y S Y=$P(%J1,":") X %BA I  S %K=%K+1,%K(%K)=%J1 Q:%A["o"  I $D(DIQUIET),X=$P(%J,":",2) Q
 I %K=1 S Y=$P(%K(1),":"),Y(0)=$P(%K(1),":",2)
 I %K>1,$G(DIQUIET) S %E=1 Q
 I %K>1 D CH Q:%E=1  I '$D(%K(%I)) S X=%I G S
 I %J="",'%K S %E=1 Q
 I %A'["V",$D(DDS)[0 W $S((%K=1!('%K))&($P(Y(0),X)=""):$E(Y(0),$L(X)+1,99),1:"  "_Y(0))
 I %T="Y" S (%,Y)=+$$PRS^DIALOGU(7001,$E(X)) S:%<0 (%,Y)="" S:%=2 Y=0
 Q
 ;
CH ;
 N DIY,DDD,DDC,DS,DD
 F %I=1:1:%K S A0="     "_%I_"   "_$P(%K(%I),":",2) D MSG
 I '$D(DDS) S DIY(1)=1,DIY(2)=%K,A0=$$EZBLD^DIALOG(8088,.DIY) K DIY D MSG R %I:$S($D(DIR("T")):DIR("T"),'$D(DTIME):300,1:DTIME) ;**CCO/NI 'CHOOSE 1-N'
 I $D(DDS) S DDD=2,DDC=5,(DS,DD)=%K D LIST^DDSU S %I=DIY
 I U[%I!(%I?1."?") S X="?",%E=1 Q
 I $D(%K(%I)) S Y=$P(%K(%I),":"),Y(0)=$P(%K(%I),":",2) Q
 I %I?.N S %E=1
 Q
 ;
MSG ;
 I $D(DDS),A0]"" S DDH=$G(DDH)+1,DS(DDH)=$P(%K(%I),":"),DDH(DDH,DDH)=$P(%K(%I),":",2)
 I '$D(DDS) W !,A0
 K A0
 Q
 ;
L ; LIST OR RANGE
 D L^DIR3
 Q
D ; DATE
 D ^%DT I Y<0 S %E=1 Q
 I %D1["NOW"!(%D2["NOW")&($P("NOW",$$UP^DILIBF(X))="") S:%D1["NOW" %B1=Y S:%D2["NOW" %B2=Y
 I %B1,Y<%B1 S %E=1 S:'%N %W=$$EZBLD^DIALOG(9114.1,$$DATE^DIUTL(%B1)) Q  ;**CCO/NI 'RESPONSE MUST NOT PRECEDE (DATE)'
 I Y>%B2 S %E=1 S:'%N %W=$$EZBLD^DIALOG(9114.2,$$DATE^DIUTL(%B2)) ;**CCO/NI 'RESPONSE MUST NOT FOLLOW (DATE)'
 S Y(1)=Y X ^DD("DD") S Y(0)=Y,Y=Y(1) K Y(1)
 Q
 ;
N ; NUMERIC
 I $L($P(X,"."))>24 S %E=1 Q
 I X'?.1"-".N.1".".N S %E=1 Q
GL I X>%B2!(X<%B1) S %E=1 D:'%N  Q  ;**CCO/NI 'RESPONSE MUST NOT BE BIGGER/SMALLER'
 .N I S I(1)=+%B1,I(2)=+%B2,%W=$$EZBLD^DIALOG(212,.I) ;**CCO/NI 'DECIMAL DIGITS' (plus next line)
DEC I '%E,($L($P(+X,".",2))>%B3) S %E=1 S:'%N %W=$$EZBLD^DIALOG(211,+%B3) Q
 S Y=+X
 Q
 ;
F ; FREETEXT
 S Y=X I X[U,%A'["U" S %E=1
 I '%N N I S I(1)=+%B1,I(2)=+%B2,%W=$$EZBLD^DIALOG(213,.I) S:%A'["U" %W=%W_"   "_$$EZBLD^DIALOG(214) ;**CCO/NI  EMBEDDED UPARROW
 I $L(X)<%B1!($L(X)>%B2) S %E=1
 Q
 ;
E ; END-OF-PAGE
 S Y=X="" S:X=U (DUOUT,DIRUT)=1 I $L(X),X'=U S %E=1
 Q
 ;
P ; POINTER
 S:'$D(DDS) %B2=$P(%B2,"L")_$P(%B2,"L",2)
 I %B2["A" S %B2=$P(%B2,"A")_$P(%B2,"A",2)
 S:$D(DIR("S"))#2 DIC("S")=DIR("S")
 S DIC=%B1,DIC(0)=%B2,%C=X D P1
 I $D(X)#2,X="",Y<0 S %E=-1
 E  S %E=Y<0
 S X=%C
 Q
P1 N %A,%B,%C,%N,%P,%T,%W
 F  K DICQRETV,DICQRETA D ^DIC Q:Y>0!'$D(DICQRETV)  S X=DICQRETV,DIC(0)=DIC(0)_"O" ;MOUSE MIGHT CLICK ON AN PARTIAL MATCH
 Q
 ;
1 ; DATA-DICTIONARY TYPE OF READ
 S %C=X N %W I %B["P"!(%B["V") N DIE
 I %B["F" S Y=X I X[U,$P($P(%B3,U,4),";",2)'?1"E"1.N1","1.N S %E=1 Q
 I %B["S" S %B=$P(%B3,U,3) D  S X=Y,%B=$P(%B3,U,2) G R
 .N DILANG
 .I $G(DUZ("LANG"))>1,$D(^DD(%B1,%B2,0)) S DILANG=$$SETIN^DIALOGZ D
 ..I DILANG'=%B S %B=DILANG Q
 ..K DILANG
 .S %BU=$$UP^DILIBF(%B) D SETSCR^DIR(%B1,%B2),S
 .I $D(DILANG) N % S %=$F(";"_DILANG,";"_Y) I % S Y=$P($P($P(^DD(%B1,%B2,0),U,3),";",Y),":") ;Return the 'REAL' internal value
 I %B["P" S DIC=U_$P(%B3,U,3),DIE=DIC,DIC(0)=$E("L",%B'["'"&$D(DDS))_$E("E",$D(DIR("V"))[0)_"MZ" I %B'["*" D P1 S X=+Y,%E=Y<0
 I %B["V" D
 . N %A,%B,%C,%N,%P,%T,%W
 . S (DIE,DP)=%B1,DIFLD=%B2,DQ=1
 . D ^DIE3
 . S %E=Y'>0 S:Y>0 Y(0)=$P(Y,U,2)
R D IT:'%E S X=%C
 Q
IT D
 . N %A,%B,%C,%N,%P,%T,%W N:'$G(DIRDINUM) DINUM
 . I $P(%B3,U,2)["N",$P(%B3,U,5,99)'["$",X?.1"-".N.1".".N,$P(%B3,U,5,99)["+X'=X" S X=+X
 . X $P(%B3,U,5,99)
 S %E='$D(X)
 I '%E,%B'["P" S Y=X
 I '%E,%B["D" X ^DD("DD") S Y(0)=Y,Y=X
 Q
 ;
 ;#7001  Yes/No question

DIR2
DIR2 ;SFISC/XAK-READER (SETUP VARS,REPLACE...WITH) ;20JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K Y,% S U="^"
 D DIR("A"),DIR("?"),DIR("L"),DIR("B") ;**
 S %T=$E(DIR(0)),%A=$P(DIR(0),U),%B=$P(DIR(0),U,2),%N=%A'["V"
 K:$D(DIR("A"))=10 DIR("A") K:$D(DIR("?"))=10 DIR("?")
 S %W0=$S($D(DIR("?")):DIR("?"),%T'?.AN:"",'$P($T(@(%T_1)),";",5):"",1:$$EZBLD^DIALOG($P($T(@(%T_1)),";",5)))
 S %A0=$$EZBLD^DIALOG(8041)
 ;I %T="t" D SETUP^DIRUD Q  ;if this a user-defined data type read
 ;**CCO/NI (next line) SPECIFICATION OF READ IS 'DATA DICTIONARY', SO GET FIELD LABEL AND PROPERTIES
 I %A?.NP1",".ANP S %B1=$P(%A,","),%B2=+$P(%A,",",2) G:'$D(^DD(%B1,%B2,0)) EO S %B3=^(0),%B=$P(%B3,U,2) G:%B EO D:'$D(DIR("B")) DA^DIRQ:$D(DA)#2 S:'$D(DIR("A")) %P=$$LABEL^DIALOGZ(%B1,%B2)_": " S:$P(%B3,U,2)'["R" %A=%A_"O" S %T=1 G NN
 I "FSYENDLP"'[%T G EO
 S %B1=$P(%B,":"),%B2=$P(%B,":",2),%B3=$P(%B,":",3)
 S:'$L(%B2) %B2=$S(%T="D":9991231,%T="F":245,1:999999999999)
 I %T="F",%B2>245 S %B2=245
 I %T="Y" S %B=$$EZBLD^DIALOG(7003)
 I %T="D" S %DT=$P(%B3,"A")_$P(%B3,"A",2)
 I %T="D",'$D(DIR("?")) S %W0=%W0_$S(%B3["R":$$EZBLD^DIALOG(8043),%B3["T":$$EZBLD^DIALOG(8044),1:"")
 I %T="D" S %D1=%B1,%D2=%B2 I %B["NOW"!(%B["DT") D NOW^%DTC K %I,%H S DT=X S:%B1["NOW" %B1=% S:%B1["DT" %B1=X S:%B2["NOW" %B2=% S:%B2["DT" %B2=X K %
 I %T="P" S %B1=$S('%B1:U_%B1,'$D(^DIC(+%B1,0,"GL")):U,1:^("GL")) G EO:%B1=U,EO:'$D(@(%B1_"0)")) I '$D(DIR("A")) S %P=$$EZBLD^DIALOG(8042,$O(^DD(+$P(^(0),U,2),0,"NM",0))) Q
NN D:%T="S" S0:%A'["A" Q:$D(%P)
 S %P="" I %A["A" S:$D(DIR("A")) %P=DIR("A") Q
 I '$D(DIR("A")) S %P=$$EZBLD^DIALOG($P($T(@%T),";",4)) I %T="D" S %P=%P_$S(%B3["R":$$EZBLD^DIALOG(8043),%B3["T":$$EZBLD^DIALOG(8044),1:"")
 S:$D(DIR("A")) %P=$S(%T="Y":DIR("A")_"? ",%T="S":$$EZBLD^DIALOG(8045,DIR("A")),1:DIR("A")_": ") I "LND"'[%T Q
 I $L(%B1) S %P=%P_" ("_$S(%T="D":$$DATE^DIUTL(%B1)_"-"_$$DATE^DIUTL(%B2),1:%B1_"-"_%B2)_")" ;**
 S %P=%P_$S("?: "[$E(%P,$L(%P)):"",1:":")_" "
 Q
S0 S %P=$S($D(DIR("A")):DIR("A")_": ",%A["B":$$EZBLD^DIALOG(8046),1:$$EZBLD^DIALOG($P($T(@%T),";",4)))
 Q:%A'["B"  S %P=%P_" ("
 I %B'[":",$O(DIR("C",""))]"" S %I="" F  S %I=$O(DIR("C",%I)) Q:%I=""  D
 . N Y S Y=$P(DIR("C",%I),":") Q:Y=""
 . I $D(DIR("S"))#2 X DIR("S") E  Q
 . S %P=%P_Y_"/"
 E  F %I=1:1 Q:$P(%B,";",%I,999)=""  D
 . N Y S Y=$P($P(%B,";",%I),":") Q:Y=""
 . I $D(DIR("S"))#2 X DIR("S") E  Q
 . S %P=%P_Y_"/"
 S %P=$E(%P,1,$L(%P)-(%P?.E1"/"))_"): "
 Q
EO S %T="",Y=-1 Q
 ;
DIR(DIALA) ;** INSERTS DIALOGS INTO DIR ARRAY
 N DIALN,DIALP
 S DIALN=$G(DIR("DIALOG",DIALA))
 Q:'$D(^DI(.84,0))  Q:+DIALN'=DIALN  Q:'$D(^(DIALN,2))  ;GIVES US A MAKED REFERENCE PRIOR TO CALLING $$EZBLD^DIALOG
 I $D(DIR("DIALOG",DIALA))>9 M DIALP=DIR("DIALOG",DIALA)
 K DIR(DIALA) D BLD^DIALOG(DIALN,.DIALP,,"DIR(DIALA)","F")
 Q
 ;
 ;
RW ; Replace...With...
 N %,L S DG=Y S:$D(DTIME)[0 DTIME=999
A W:$X>50 ! K DTOUT W $$EZBLD^DIALOG(8047) R X:DTIME E  S DTOUT=1,X=""
 G B:X="",Q:X?1."^",Q:$E(X)=U&($D(DIRWP)[0)&(Y'[X),Q:X?."?",Q:X="@"
 I X="END"!(X="end")!(X=$$UP^DILIBF($$EZBLD^DIALOG(7097))) S L=0 D H S:'%&'$D(DTOUT) Y=Y_X G A ;**CCO/NI 'END'
 I Y[X S D=X,L=$L(X) D H S:'%&'$D(DTOUT) Y=$P(Y,D,1)_X_$P(Y,D,2,999) G A
 S D=$P(X,"...",1),DH=$F(Y,D) I DH S X=$P(X,"...",2,99),X=$S(X="":$L(Y)+1,1:$F(Y,X,DH)) I X S DH=DH-$L(D)-1,D=X,L=D-DH-1 D H S:'%&'$D(DTOUT) Y=$E(Y,1,DH)_X_$E(Y,D,999) G A
 W $C(7)," ??" G A
 ;
H N DIMAX
WITH W $$EZBLD^DIALOG(8048) R X:DTIME E  S DTOUT=1,X="",%=0 W $C(7)," ??" Q
 S DIMAX=$G(^DD("STRING_LIMIT"),255)-10,%=$L(Y)-L+$L(X)>DIMAX
 I % W $C(7),$S($L(Y)-L'>DIMAX:$$EZBLD^DIALOG(349,($L(Y)-L+$L(X)-DIMAX)),X'=U:$$EZBLD^DIALOG(350),1:" ??") Q:$L(Y)-L>DIMAX&(X=U)  G WITH
 Q:X?.ANP  W $C(7)," ??" G WITH
 ;
B W:$D(DTOUT) $C(7) I DG'=Y S X=Y W !?3 W X I X="" S X="@"
Q Q
 ;
F ;;Enter response: ;8051
S ;;Enter response: ;8051
Y ;;Enter Yes or No: ;8052
E ;;Press RETURN to continue or '^' to exit: ;8053
N ;;Enter a number;8054
D ;;Enter a date;8055
L ;;Enter a list or range of numbers;8056
P ;;Select: ;8057
F1 ;;;This response can be free text;9031
S1 ;;;Enter a code from the list.;9032
Y1 ;;;Enter either 'Y' or 'N'.;9040
E1 ;;;Enter either RETURN or '^';9033
N1 ;;;This response must be a number;9034
D1 ;;;This response must be a date;9035
L1 ;;;This response must be a list or range, e.g., 1,3,5 or 2-4,8;9036
 ;
 ;#349   String too long by |nuber| character(s)!
 ;#350   String too long! '^' to quit.
 ;#8041  This is a required response...
 ;#8042  Select |1|
 ;#8043  and time
 ;#8044  and optional time
 ;#8045  Enter |1|
 ;#8046  Select one of the following
 ;#8047  Replace
 ;#8048  With

DIR3
DIR3 ;SFISC/DCM,RDS-READER-MAID (PROCESS RANGE/LIST) ;3MAY2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
L ; LIST OR RANGE
 N %I,%I1,%I2,%BA,%X,%C,%1,%2,%3,%4,%
 K ^TMP($J,"DIR")
 S Y(0)="",%C=0,%I1=1,%I2=2,%BA=$S($D(DIR("S")):DIR("S"),1:"I 1")
 F %I=1:1 S %X=$P(X,",",%I) Q:%E!'$L($P(X,",",%I,999))  D
 . I %X'?.".".N.".".N."-".N.".".N S %E=4 Q
 . I $E(%X)="-" S %E=3 Q
 . I $L($P(%X,"."))>24 S %E=1 Q
 . I '%B3,$L($P(+%X,".",2)) S %E=2
 I '%E D @$S(%A["C"&'$D(DIR("S")):"LC",%A["C"&$D(DIR("S")):"LL",1:"LL")
 I '%E,Y(%C)="" S %E=4
 I $G(%E),'%N D
EGP .N I S %W=$P($T(@(%E)),";;",3) ;**CCO/NI  thru next 3 lines GET ERROR MESSAGE
 .I %E=1 S I(1)=+%B1,I(2)=%B2
 .I %E=2 S I(1)=+%B3
 .S %W=$$EZBLD^DIALOG(%W,.I)
 I $G(%E) K Y S Y="" Q  ; Prevent Erroneous Data
 S Y=Y(0)
 Q
 ;
LL ; handle uncompressed lists & screened compressed lists
 I %B3 D LCD
 F %I=1:1 S %X=$P(X,",",%I) Q:%E!'$L($P(X,",",%I,999))  D L0
 Q:%E
 I %A["C" D LIST
 Q
L0 N %J
 D LCK
 Q:%E  I %X?.N!(%X?1N.".".N) S %J=+%X G L1
 I %B3 D  Q
 . S %J=+%X D L1 S $P(%X,"-")=%X+%I1
 . F %J=+%X:%I1:$P(%X,"-",2) D L1
 F %J=$P(%X,"-"):1:$P(%X,"-",2) D L1
 Q
L1 I %A["C" D  Q
 . S Y=%J X %BA Q:'$T
 . S (%1,%2)=%J
 . D LC1
 I $L(Y(%C)_%J)>220 S %C=%C+1,Y(%C)=""
 F %=0:1:%C I ","_Y(%)_","[(","_%J_",") S %=-1 Q
 I %'<0 S Y=%J X %BA S:$T Y(%C)=Y(%C)_%J_","
 Q
 ;
 ; check one list element
 ;%A = $P#1 "^" of DIR(0)
 ;%B = $P#2 "^" of DIR(0)
 ;%B1 = $P#1 ":" Low Value
 ;%B2 = $P#2 ":" High Value
 ;%B3 = $P#3 ":" Number of Decimals; Null If Undefined
 ;%X = Range Entered, i.e. 2-4
 ;% = End of Range Entered i.e. 4
LCK I %X["-" D  Q
 . N % S %=$P(%X,"-",2) I '% S %E=4 Q
 . I %A'["I",%<+%X S %E=4 Q
 . I %A["I",%<+%X N %3 S %3=%,%=+%X,$P(%X,"-",2)=%,$P(%X,"-")=%3
 . I %<%B1!(+%X>%B2) S %E=1 Q
 . I +%X<%B1 S %E=1 Q
 . I +%>%B2 S %E=1 Q
 . I $L($P(+%X,".",2))>%B3!($L($P(+%,".",2))>%B3) S %E=2 Q
 I +%X<%B1!(+%X>%B2) S %E=1 Q
 I %B3,$L($P(+%X,".",2))>%B3 S %E=2 Q
 Q
 ;
LCD ; determine increment size for ranges (handle decimals)
 S %1="." I %B3>1 F %=1:1:%B3-1 S %1=%1_"0"
 S %I2=%1_2,%I1=%1_1
 Q
 ;
LC ; handle unscreened compressed lists (no DIR("S"))
 ; LC to LIST checks the user's list in X, building ^TMP($J,"DIR")
 I %B3 D LCD
 F %=1:1:$L(X,",") S %1=$P(X,",",%) D LC0 Q:%E
 Q:'$D(^TMP($J,"DIR"))
LIST ; transfer output list from ^TMP($J,"DIR") to Y
 S %1="",Y(%C)="" D
 . F  S %1=$O(^TMP($J,"DIR",%1)) Q:%1=""  D
 . . S:$D(^(%1))=1 Y(%C)=Y(%C)_%1_","
 . . S:$L(Y(%C))>220 %C=%C+1,Y(%C)=""
 . . I $D(^(%1))=10 S Y(%C)=Y(%C)_$O(^TMP($J,"DIR",%1,""))_"-"_%1_","
 I Y(%C)="" D  Q:%E
 . I %C=0 S %E=4
 . E  K Y(%C) S %C=%C-1
 K ^TMP($J,"DIR")
 Q
LC0 ; check one list element, calls LC1 to put it in ^TMP($J,"DIR")
 S %E=0,%X=%1 D LCK Q:%E  S (%1,%2)=%X
 I %1["-" S %1=+%1,%2=+$P(%2,"-",2)
 S %1=+%1,%2=+%2
 D LC1
 Q
LC1 ; modify ^TMP($J,"DIR") to incorporate a list element, handle overlap
 S %3=$O(^TMP($J,"DIR",%1-%I2)) I %3]"",%3<%2 D
 . I $D(^(%3))=1,%1-%I1=%3 S %1=%3
 . I $D(^(%3))>9 S %4=$O(^(%3,"")) I %4<%1 S %1=%4
 S %3=$O(^TMP($J,"DIR",%2-$S(%B3:%I1,1:1))) I %3]"" D
 . I $D(^(%3))=1,%2+%I1=%3 S %2=%3
 . I $D(^(%3))>9 S %4=$O(^(%3,"")) S:%4'>(%2+%I1) %2=%3 S:%4<%1 %1=%4
 S %3=%1-%I1 F  S %3=$O(^TMP($J,"DIR",%3)) Q:%3=""!(%3>%2)  K ^(%3)
 I %1'=%2 S ^TMP($J,"DIR",%2,%1)=""
 E  S ^TMP($J,"DIR",%1)=""
 Q
 ;
1 ;;Response should be no less than ; and no greater than;;212;;**CCO/NI thru 4 ERROR MESSAGES
2 ;;Response must be no more than ; decimal digit;;211
3 ;;Response must be a positive number;;210
4 ;;Invalid number or range;;208

DIRCR
DIRCR ;SFISC/GFT-DELETE THIS LINE AND SAVE AS '%RCR'*** ;13DEC2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
%RCR ;GFT/SF
 ;
 ;
STORLIST ;
 D INIT
O S %D=$O(%RCR(%D)) G CALL:%D=""
 I $D(@%D)#2 S @(%E_")="_%D) G O:$D(@%D)=1
 S %X=%D_"(" D %XY G O
 ;
CALL S %E=%RCR K %RCR,%X,%Y D @%E
 S %E="^UTILITY(""%RCR"",$J,"_^UTILITY("%RCR",$J)_",%D",^($J)=^($J)-1,%D=0,%X=%E_","
G S %D=$O(@(%E_")")) I %D="" K %D,%E,%X,%Y,^($J,^UTILITY("%RCR",$J)+1) Q
 I $D(^(%D))#2 S @%D=^(%D) G G:$D(^(%D))=1
 S %Y=%D_"(" D %XY G G
 ;
INIT I $D(^UTILITY("%RCR",$J))[0 S ^UTILITY("%RCR",$J)=0
 S ^($J)=^($J)+1,%D="%Z",%E="^UTILITY(""%RCR"",$J,"_^($J)_",%D",%Y=%E_","
 K ^($J,^($J))
 Q
 ;
 ;
 ;
 ;
XY(%X,%Y) ;
%XY ;NOIS: UNY-0504-10264
 N %A,%B,%C
 S %A=%X I $P(%X,"(",2)]"",$E(%X,$L(%X))'="," S %A=%A_",",%C=1
 S %A=$$NA(%A),%B=$$NA(%Y)
 I $D(%C) S %C=$QS(%A,$QL(%A)),%A=$NA(@%A,$QL(%A)-1) D  G RE
 .N A,B S B=$NA(@%B@(%C)),A=$NA(@%A@(%C)) N %A,%B,%C S %A=A,%B=B D M ;a bit of recursion
M I $D(@%A)[0 M @%B=@%A Q
 S %C=""
RE F  S %C=$O(@%A@(%C)) Q:%C=""  D
 .I $D(@%A@(%C))=1 S @%B@(%C)=@%A@(%C) Q
 .M @%B@(%C)=@%A@(%C)
 Q
 ;
NA(%X) ;
 N L S L=$L(%X)
 I $E(%X,L)="," S %X=$E(%X,1,L-1)_")"
 E  S %X=$E(%X,1,L-1)
 Q $NA(@%X)
 ;
 ;
OS ;
 S $P(^%ZOSF("OS"),"^",2)=DITZS
 K DITZS S ZTREQ="@"
 Q

DIRQ
DIRQ ;SFISC/XAK-READER-MAID END ;7/11/94  14:34
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K:$D(%G) DIR("B")
 K DIR0("L")
 Q
DA I DA'=+$P(DA,"E") K DA Q
 S (X,Y)=%B1,DA(0)=DA
 F %=0:1 Q:'$D(^DD(X,0,"UP"))  S X=^("UP"),%P=$O(^DD(X,"SB",Y,0)),%(%)=""""_$P($P(^DD(X,%P,0),U,4),";")_""",",Y=X
 S %(%)=$S($D(^DIC(X,0,"GL")):^("GL"),1:"") G Q:%(%)=""
 S %G="" F %=%:-1:0 G GQ:'$D(DA(%)) S %G=%G_%(%)_DA(%)_","
 S %P=$P(%B3,U,4),%=$P(%P,";"),%G=%G_""""_%_""")" G GQ:'$D(@%G)
 S %G=$P(%P,";",2),Y=$S(%G:$P(^(%),U,%G),1:$E(^(%),+$P(%G,"E",2),$P(%G,",",2))) G GQ:Y=""
 S %G=Y,C=$P(^DD(%B1,%B2,0),U,2) D Y^DIQ S DIR("B")=Y G Q
GQ K %G
Q K %,%P,X,Y,DA(0) Q

DIS
DIS ;SFISC/GFT-GATHER SEARCH CRITERIA ;23JUN2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY($J),DC,DIS,%ZIS,O,N,R D ^DICRW
 G Q:'$D(DIC)!$D(DTOUT)
EN ;
 S:DIC DIC=$G(^DIC(DIC,0,"GL")) Q:DIC=""
 K DI,DX,DY,I,J,DL,DC,DA,DTOUT,^UTILITY($J) G Q:'$D(@(DIC_"0)"))
 S (R,DI,I(0))=DIC,(DL,DC)=1,DY=999,N=0,Q="""",DV=""
R ;
 I +R=R S (J(N),DK)=R,R=""
 E  S @("(J(N),DK)=+$P("_R_"0),U,2)"),R=$P(^(0),U)
F ;
 G UP:DC>58
 W ! K X,DIC,DISPOINT,DE D W
 S DIC(0)="EZ",C=",",DIC="^DD("_DK_",",DIC("W")="S %=$P(^(0),U,2) W:% $S($P(^DD(+%,.01,0),U,2)[""W"":""   (word-processing)"",1:""   (multiple)"")",DIC("S")="I $P(^(0),U,2)'[""m"""_$S($D(DICS):" "_DICS,1:""),DU=""
 W "SEARCH FOR "_R_" "_$P(^DD(DK,0),U)_": "
 R X:DTIME S:'$T DTOUT=1 G Q:X=U!'$T,TEM^DIS2:X?1"[".E D  I Y>0 K DISPOINT S DE=Y(0),O(DC)=$P(DE,U),DU=+Y,Z=$P(DE,U,3),E=$P(DE,U,2) G G
 .N DISVX S DISVX=X D ^DIC S:Y=-1 X=DISVX Q
HARD G UP:X="",F:X?."?",Q:X=U!($D(DTOUT)),COMP^DIS2
 Q
G ;^DOPT("DIS",1,0)=NULL
 ;^DOPT("DIS",2,0)=CONTAINS
 ;^DOPT("DIS",3,0)=MATCHES
 ;^DOPT("DIS",4,0)=LESS THAN
 ;^DOPT("DIS",5,0)=EQUALS
 ;^DOPT("DIS",6,0)=GREATER THAN
 K X,DIC S DIC="^DOPT(""DIS"",",DIC(0)="QEZ" I E["B" S X="" G OK
 I E S N(DL)=N,N=N+1,DV(DL)=DV,DL(DL)=DK,DK=+E,J(N)=DK,X=$P($P(DE,U,4),";"),I(N)=$S(+X=X:X,1:""""_X_""""),Y(0)=^DD(DK,.01,0),DL=DL+1 G WP:$P(Y(0),U,2)["W" S DV=DV_+Y_"," G F
 S X=$P(E,"p",2) I X,$D(^DIC(+X,0,"GL")) S DISPOINT=$S(Y:+Y,1:-DC)_U_U_^("GL") ;Y will be FIELD lookup, unless it's COMPUTED EXPRESSION from ^DIS2
 I E["P" S DISPOINT=+Y_U_Y(0) S X=+$P(E,"P",2) F  Q:'X  D
 .S DA=$P($G(^DD(X,.01,0)),U,2) I DA["D" S E="D"_E,X="" Q
 .S X=+$P(DA,"P",2)
 I $D(DISPOINT),Y>0 S X="(#"_+Y_")",DA="DIS("""_$C(DC+64)_DL_""",",DICOMP=N S:$D(O(DC))[0 O(DC)=X D EN^DICOMP G X:'$D(X) S DA(DC)=X,DU=-DC F %=0:0 S %=$O(X(%)) Q:'%  S @(DA_%_")")=X(%)
C K X D W R "CONDITION: ",X:DTIME S:'$T DTOUT=1 G Q:X[U!'$T
 S DN=$S("'-"[$E(X):"'",1:""),X=$E(X,DN]""+1,99)
 S:E["S" DIC("S")="I Y<3!(Y=5)" D ^DIC K DIC("S")
 G:Y<0 Q:X[U,B:X="",DISC^DIQQQ:X["?",C
 S O=$P("NOT ",U,DN]"")_$P(Y,U,2)
 I +Y=1 S X=DN_"?."" """,O(DC)=O(DC)_" "_O G OK
 S DQ=Y
VALUE D W W O I E["D",Y-3 R " DATE: ",X:DTIME S:'$T DTOUT=1 G F:X=U,Q:'$T S %DT="TE" D ^%DT S X=Y_U_X G X:Y<0 X ^DD("DD") S Y=X_U_Y G GOT
 ;POINTERS
PT I $D(DISPOINT),+DQ=5 K DIC,DIS($C(DC+64)_DL) S DIC=U_$P(DISPOINT,U,4),DIC(0)="EMQ",DU=+DISPOINT W " "_$P(@(DIC_"0)"),U)_": " R X:DTIME S:'$T DTOUT=1 G F:U[X,Q:'$T D ^DIC G GOT:Y>0,PT
 R ": ",Y:DTIME E  S DTOUT=1 G Q
 G X:Y="" I Y[U,$P($G(DE),U,4)'[";E",'$P($G(DE),U,2),E'["C" G F ;We can look for "^" in WP or $E-stored actual data
 I +DQ=3 S X="I X?"_Y D ^DIM G GOT:$D(X) S Y="?" ;Is it a good PATTERN-MATCH?
 I DQ=4!(DQ=6),+Y'=Y G X ;> or < have to be numeric
 I Y?."?" D DIS^DIQQQ G VALUE
 W:Y[""""&($L(Y)>1) "    (Your answer includes quotes)"
SET I E["S" D  K DIS("XFORM",DC) G GOT:$D(X) K DIS(U,DC) D DIS^DIQQQ G VALUE
 .N D S X=1 I +DQ=5!(Y["""") D  K:D="" X Q
 ..N DIR,DDER S X=Y,DIR(0)="S^"_Z,DIR("V")=1 D ^DIR I $G(DDER) S D="" Q
 ..F X=1:1 S D=$P(Z,";",X) Q:D=""  I Y=$P(D,":") S Y=""""_$$CONVQQ^DILIBF($P(D,":"))_"""^"_$P(D,":",2) Q
 .N N,%,C W !?7 S Y=""""_Y_"""",N="DE"_DN_$E(" [?<=>",DQ)_Y
 .F X=1:1 S D=$P(Z,";",X),DE=$P(D,":",2) Q:D=""  S DIS(U,DC,$P(D,":"))=DE I @N S:'$D(%) %="[ Will match" W % S C=$G(C)+1,%="'"_DE_"'" W:C>1 "," W " " W:$X+$L(%)>73 !?7
 .I '$D(%) K X Q
 .W:C>1 "and " W %_" ]"
 I Y?.E2A.E S DIS("XFORM",DC)="$$UP^DILIBF(;)",Y=$$UP^DILIBF(Y)
 D
 .N P,YY,C S C="""",YY=C_$$CONVQQ^DILIBF($P(Y,U)) F P=2:1:$L(Y,U)  S YY="("_YY_"""_$C(94)_"""_$$CONVQQ^DILIBF($P(Y,U,P)),C=C_")"
 .S Y=YY_C
GOT S X=DN_$E(" [?<=>",DQ)_$P(Y,U) I E["D" D
 .I $P(Y,U)'[".",$E(Y,6,7) S %=$P("^^^^ any time during^ the entire day",U,DQ) I %]"" S DIS("XFORM",DC)="$P(;,""."")",O=O_%
 .S Y=$P(Y,U,3)_U_$P(Y,U,2)
 I $G(DIS("XFORM",DC))="$$UP^DILIBF(;)" S O=O_" (case-insensitive)"
 S O(DC)=O(DC)_" "_O_" "_Y
OK S DC(DC)=DV_DU_U_X,%=DL-1_U_(N#100)
 I DL>1,O(DC)'[R S O(DC)=R_" "_O(DC)
 S:DU["W" %=DL-2_U_(N#100-1) S DX(DC)=%,DC=DC+1 S:DC=27 DC=33 ;go from "Z" to "a"
B G F:(DU'["W"&(DC<59))
UP I DC>1 G ^DIS0:DL<$S('$D(DIARF0):2,1:2) S DL=DL-1,DV=DV(DL),DK=DL(DL),N=N(DL),R=$S($D(R(DL)):R(DL),1:R) K R(DL) S %=N F  S %=$O(I(%)) S:%="" %=-1 G F:%<0 K I(%),J(%)
Q G Q^DIS2:'$D(DIARU),^DIS2
 ;
WP S DIC("S")="I Y<3",DU=+Y_"W" G C
 ;
X ;
 W $C(7),"??",!! K O(DC) G B
 ;
W W !?DL*2,"-"_$C(DC+64)_"- " Q
 ;
 ;
 ;
 ;
 ;
 ;
 ;
ENS ; ENTRY POINT FOR RE-DOING THE SORT USING AN EXISTING SORT TEMPLATE
 G EN^DIS3

DIS0
DIS0 ;SFISC/GFT-SEARCH, IF STATEMENT AND MULTIPLE COMBO'S ;30JAN2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 W ! K R,N,DL,DE,DJ
 S O=0,E=$D(DC(2)),N="IF: A// ",DE=$S(E:"IF: ",1:N),DL=0
 S C=","
R W !,DE K DV R X:DTIME S:'$T DTOUT=1 G Q:X[U!'$T
 I X="" S DV=1,DU=X G 1:DL S DQ="TYPE '^' TO EXIT",Y="^1^",DL=1 G BAD:E D ASKQ G L
 S Y=U,P=0,DU="",D="",DL=DL+1
P S P=P+1,DQ=$E(X,P) I DQ="" G BAD:Y=U,L
 I DQ?.A S DV=$A(DQ)-64 I $D(DC(DV)) D ASKQ G CHK
 G P:"&+ "[DQ I DU="","'-"[DQ S DU="'" G P
BAD D  W !! K DJ(DL),DE(DL) S DL=DL-1 G R
 .I DQ?."?" D BLD^DIALOG($S($D(DC(2)):8004.2,1:8004.1)),MSG^DIALOG("WH") Q  ;HELP depending on whether there is a CONDITION B
 .W "   <",DQ,">??"
 ;
ASKQ S J=DC(DV),%=J["?."" """,I=J["^'"+(DU["'")#2 I J["W^" S DV(DV)=$S(I:2-%,1:%+%+1) S:% DC(DV)=$E(J,1,$L(J)-5)_"=""""" Q
 S:$P(J,U)[C DV(DV)=J?.E1",.01^".E&%+(I+%#2) Q
 ;
CHK S %=$F(Y,U_DV) I % S %=$P($E(Y,%),U,1)'=DU,DQ=""""_DQ_""" AND """_$E("'",%)_DQ_""" IS "_$P("REDUNDANT^CONTRADICTORY",U,%+1) G BAD
 S %=1,Y=Y_DV_DU_U,DU="",J=$P(DC(DV),U,1) G P:J'[C F Z=2:1 I $P(J,C,Z,99)'[C S J=$P(J,C,1,Z-1)_C Q
 I J=D D SAMEQ S:%=1 DJ(DL,DV)=DX(DV)
 S D=J,DJ=DV G P:%>0
Q G Q^DIS2
 ;
SAMEQ I J<0,$P(DY(-J),U,3)="" Q
 W !?8,"CONDITION -"_$C(DV+64)_"- WILL APPLY TO THE SAME MULTIPLE AS CONDITION -"_$C(DJ+64)_"-",!?8,"...OK" G YN^DICN
 ;
L S P=O,DL(DL)=Y,DE="OR: " F %=2:1 S X=$P(Y,U,%) Q:X=""  S O=O+1,^UTILITY($J,O,0)=$S(%>2:$S($D(DJ(DL,+X)):"  together with ",1:"   and "),O=1:"",1:" Or ")_$P("not ",U,X["'")_O(+X)
 W:$X>18 ! W "   " F %=P+1:1 Q:'$D(^UTILITY($J,%,0))  S X=^(0) W:$L(X)+$X>77 !?13 W " "_$P(X,U) I $P(X,U,2)'="" W " ("_$P(X,U,2)_")"
 S DV=0
DV S DV=$O(DV(DV)) S:DV="" DV=-1 G:DV'>0 R:E,1 G DV:$D(DJ(DL,DV)) S I=$P(DC(DV),U,1),D=DK,DN=0,Y="DO YOU WANT THIS SEARCH SPECIFICATION TO BE CONSIDERED TRUE FOR CONDITION -"_$C(DV+64)_"-"
G S DN=DN+1,P=$P(I,C,1),I=$P(I,C,2,99) G W:P["W",DV:I="" I P<0 S J=DY(-P),D=+J,R=" '"_$P(^DIC(D,0),U,1)_"' ENTRIES " G G:'$P(J,U,3)
 E  S D=+$P(^DD(D,P,0),U,2),R=" '"_$O(^DD(D,0,"NM",0))_"' MULTIPLES "
HOW W !!,Y,!?8,"1) WHEN AT LEAST ONE OF THE"_R_"SATISFIES IT"
 W !?8,"2) WHEN ALL OF THE"_R_"SATISFY IT" S X=2
 I DV(DV) W !?8,"3) WHEN ALL OF THE"_R_"SATISFY IT,",!?16,"OR WHEN THERE ARE NO"_R S X=3
 W !?4,"CHOOSE 1-"_X_": " I DV(DV)>1 W 3 S %1=3
 E  W 1 S %1=1
 R "// ",%:DTIME,! S:'$T DTOUT=1 S:%="" %=%1 K %1 G Q:%=U!'$T,HOW:%>X!'% I %>1 S DE(DL,DV,DN)=%,O=O+1,^UTILITY($J,O,0)="   for all"_R_$P(", or when no"_R_"exist",U,%>2)
 G G
 ;
W I DV(DV)-2 S DE(DL,DV,DN)=DV(DV) G DV
 W !!,Y,!?7,"WHEN THERE IS NO '"_$P(^DD(D,+P,0),U,1)_"' TEXT AT ALL"
 S %=1 D YN^DICN G Q:%<0,W:'% S DE(DL,DV,DN)=4-% G DV
 ;
1 K O,DX,Y G ^DIS1

DIS1
DIS1 ;SFISC/GFT-BUILD DIS-ARRAY ;20MAR2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DIS0 I $D(DL)#2 S DIS0=DL
 S DL(0)="" W ! G 1:$D(DE)>1!$D(DJ) I DL=1 S DL(0)=DL(1),DL=0 K DL(1)
 E  F P=2:1 S Y=$P(DL(1),U,P) Q:Y=""  S Y=U_Y_U,X=2 D 2
 F X=1:1 Q:'$D(DL(X))  F Y=X+1:1 Q:'$D(DL(Y))  I DL(X)=DL(Y)!(DL(Y)?.P) S DL=DL-1 K DL(Y) F P=Y:1:DL S DL(P)=DL(P+1) K DL(P+1)
1 D ENT G ^DIS2:'$D(DIAR),DIS^DIS2
 ;
ENT S DK(0)=DK,Z="D0," F DQ=0:1:DL K R,M D  S X=0,DQ(0)=DQ,R=-1 D MAKE S %=0 F  S R=$O(R(R)) Q:R=""  I R(R)<2 S DIS(R)=DIS(R)_" K D"
 . N I S I="" F  S I=$O(DI(I)) Q:'I  K DI(I)
 . Q
 S R=-1 Q
 ;
2 I X'>DL Q:DL(X)'[Y  S X=X+1 G 2
 S DL(0)=U_$P(Y,U,2)_DL(0),P=P-1
22 S X=X-1,DQ=$F(DL(X),Y),DL(X)=$E(DL(X),1,DQ-$L(Y))_$E(DL(X),DQ,999) G 22:X>1 Q
 ;
C S Y=Y_$S(DV="'":" I 'X",1:" I "_$$XFORM("X")_DV) D SD
MAKE S DC=DI,DQ=+DQ,X=X+1,Y=$P(DL(DQ),U,X+1) Q:Y=""
 S S=+Y,DN=$E("'",Y["'"),Y=DC(S),D=0,DL=0 I $D(DJ(DQ,S)) S D=$P(DJ(DQ,S),U,2),DL=+DJ(DQ,S) I $D(DI(DL)) S DC=DI(DL)
 S DQ=DQ(DL),Z=$P(Z,",",1,D+D+1)_",",DU=$P($P(Y,U),",",DL+1,99),O=DK(DL),DV=DN_$P(Y,U,2) I DV?1"''".E S DV=$E(DV,3,999)
LEV S DL=DL+1,DN=$S($D(DE(+DQ,X,DL)):DE(+DQ,X,DL),1:1)
 S:$G(DI(DL-1))]"" DI(DL)=DI(DL-1)
 I DU<0 G X:$D(DY(-DU)) S Y=DA(-DU) G C
 S N=$P(^DD(O,+DU,0),U,4),DE=$P(N,";",1),Y=$P(N,";",2) I Y="" S Y="D"_D G M
 I $P(^(0),U,2)["C" S Y=$P(^(0),U,5,99) G C
 S:+DE'=DE DE=""""_DE_""""
 S Z=Z_DE,E="$G("_DC_Z_"))" I Y S Y="$P("_E_",U,"_Y_")" G M
 I Y'=0 S Y=$E(Y,2,99) S:$P(Y,",",2)=+Y Y=+Y S Y="$E("_E_","_Y_")" G M
 F Y=65:1 S M=DQ_$C(Y) Q:'$D(DIS(M))
 S D=D+1,Y="S D"_D_"=+$O("_DC_Z_",0)) X DIS("""_M_""") I $T" D SD
 I $D(DIAR) S DIAR(DIARF,DQ)="X DIS("""_M_"A"")"
 S DQ=M,DIS(DQ)="F  X DIS("""_DQ_"A"") X:D"_D_"'>0 ""IF "_(DN=3)_""" Q:"_$E("'",DN>1)_"$T  S D"_D_"=$O("_DC_Z_",D"_D_")) Q:D"_D_"'>0"
WP S DQ=DQ_"A",DQ(DL)=DQ I DU'["," S DIS(DQ)="I "_$$XFORM("$G(^(D"_D_",0))")_DV G MAKE
 S O=+$P(^(0),U,2),DK(DL)=O,Z=Z_",D"_D_","
N S DU=$P(DU,",",2,99) G LEV
 ;
M D  S Y=Y_DV D SD G MAKE
VARPOINT .I $P(^DD(O,+DU,0),U,2)["V" S Y="I "_$$XFORM("$$EXTERNAL^DIDU("_O_","_+DU_","""","_Y_")") Q
OUTX .I $D(^(2)),$P(^(0),U,2)'["D",DV'["=" S M=0,Y="S Y="_Y_" "_$$OVFL(^(2))_" I "_$$XFORM("Y") Q  ;**GFT 144
SET .I $D(DIS(U,S)) S Y="S Y="_Y_" I $S(Y="""":"""",$D(DIS(U,"_S_",Y)):DIS(U,"_S_",Y),1:"""")" Q
 .S M=Y,Y="I "_$$XFORM(Y)
 ;
XFORM(Y) I '$D(DIS("XFORM",S)) Q Y
 Q $P(DIS("XFORM",S),";")_Y_$P(DIS("XFORM",S),";",2)
 ;
SD I $D(R(DQ)),R(DQ)>1 S Y="K D "_Y_" S:$T D=1"
 I '$D(DIS(DQ)) S DIS(DQ)=Y Q
 I $L($G(DL(DQ)))*8+$L(DIS(DQ))+$L(Y)>180 S Y=$$OVFL(Y)_" I $T" I $L(Y)+$L(DIS(DQ))>235 S DIS(DQ)=$$OVFL(DIS(DQ))_" I "
 S DIS(DQ)=DIS(DQ)_" "_Y Q
 ;
OVFL(Y) N I,%
 F I=1:1 S %=DQ_"@"_I Q:'$D(DIS(%))
 S DIS(%)=Y Q "X DIS("""_%_""")"
 ;
X S D=DY(-DU),O=+D,DC=U_$P(D,U,2) F %=66:1 S M=DQ_$C(%) Q:'$D(DIS(M))
 I $P(D,U,3) S M=DQ_U_$P(D,U,3),Y="S DIXX="""_M_""" "_$P("X ""I 0"" ^I 1 ",U,DN=3+1)_$P(D,U,4,99)_" I $T",R(M)=DN
 E  S Y=$P(D,U,4,99)_" S D0=D(0) X DIS("""_M_""") S D0=I(0,0) I $T"
 D SD S DQ=M,DI(DL)=DC,DK(DL)=+D,DQ(DL)=DQ,D=0,Z="D0," G N

DIS2
DIS2 ;SFISC/GFT-SEARCH, TEMPLATES & COMPUTED FIELDS;4JUN2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DISV G G:'DUZ
0 D  K DIRUT,DIROUT I $D(DTOUT)!($D(DUOUT)) G Q
 . N DIS,DIS0,DA,DC,DE,DJ,DL D S3^DIBT1 Q
 I X="" G G:'$D(DIAR)
 I Y<0 G Q:X=U,0
 I $D(DIARU),DIARU-Y=0 W $C(7),!,"Archivers must not store results in the default template" G 0
 S (DIARI,DISV)=+Y,A=$D(^DIBT(DISV,"DL")) S:$D(DIS0)#2 ^("DL")=DIS0 S:$D(DA)#2 ^("DA")=DA S:$D(DJ)#2 ^("DJ")=DJ
 I $D(DIAR),'$D(DIARU) S $P(^DIAR(1.11,DIARC,0),U,3)=DISV
 S Z=-1,DIS0="^DIBT(+Y," F P="DIS","DA","DC","DE","DJ","DL" S %Y=DIS0_""""_P_""",",%X=P_"(" D %XY^%RCR
 S %X="^UTILITY($J,",%Y="^DIBT(DISV,""O"",",@(%X_"0)=U") D %XY^%RCR
G N DISTXT S %X="^UTILITY($J,",%Y="DISTXT(" D %XY^%RCR
 W ! S Y=DI D Q S DIC=Y G EN1^DIP:$D(SF)!$D(L)&'$D(DIAR),EN^DIP
 ;
TEM ;
 K DIC S X=$P($E(X,2,99),"]",1),DIC="^DIBT(",DIC(0)="EQ",DIC("S")="I "_$S($D(DIAR):"$P(^(0),U,8)",1:"'$P(^(0),U,8)")_",$P(^(0),U,4)=DK,$P(^(0),U,5)=DUZ!'$P(^(0),U,5),$D(^(""DIS""))"
 S DIC("W")="X ""F %=1:1 Q:'$D(^DIBT(Y,""""O"""",%,0))  W !?9 S I=^(0) W:$L(I)+$X>79 !?9 W I"""
 D ^DIC K DIC G F^DIS:Y<0
 S P="DIS",Z=-1,%X="^DIBT(+Y,P,",%Y="DIS(" D %XY^%RCR
 S %Y="^UTILITY($J,",P="O" D %XY^%RCR
 G DIS2
 ;
COMP ;
 S E=X,DICMX="X DIS(DIXX)",DICOMP=N_"?",DQI="Y(",DA="DIS("""_$C(DC+64)_DL_"""," I $D(O(DC))[0 S O(DC)=X
 G COLON:X?.E1":"
 I X?.E1":.01",$D(O(DC))[0 S O(DC)=$E(X,1,$L(X)-4)
 D EN^DICOMP,XA G X:'$D(X),X:Y["m" ;I Y["m" S X=E_":" G COMP
 S DA(DC)=X,DU=-DC,E=$E("B",Y["B")_$E("D",Y["D") I Y["p" S E="p"_+$P(Y,"p",2)
 G G^DIS
 ;
XA S %=0 F  S %=$O(X(%)) Q:%=""  S @(DA_%_")")=X(%)
 S %=-1 Q
 ;
COLON D ^DICOMPW,XA G X:'$D(X)
 S R(DL)=R,N(DL)=N,N=+Y,DY=DY+1,DV(DL)=DV,DL(DL)=DK,DL=DL+1,DV=DV_-DY_C,DY(DY)=DP_U_$S(Y["m":DC_"."_DL,1:"")_U_X,R=U_$P(DP,U,2)
 K X G R^DIS
 ;
Q ;
 K DIC,DA,DX,O,D,DC,DI,DK,DL,DQ,DU,DV,E,DE,DJ,N,P,Z,R,DY,DTOUT,DIRUT,DUOUT,DIROUT,^UTILITY($J)
 Q
 ;
X K O(DC) G X^DIS
 ;
DIS ;PUT SET LOGIC INTO DIS FOR SUBFILE
 S %X="" F %Y=1:1 S %X=$O(DIS(%X)) Q:'%X  S %=$S($D(DIAR(DIARF,%X)):DIAR(DIARF,%X),1:DIS(%X)) S:%["X DIS(" %=$P(%,"X DIS(")_"X DIFG("_DIARF_","_$P(%,"X DIS(",2) S ^DIAR(1.11,DIARC,"S",%Y,0)=%X,^(1)=%
 S:%Y>1 %Y=%Y-1,^DIAR(1.11,DIARC,"S",0)="^1.1132^"_%Y_U_%Y G DIS2

DIS3
DIS3 ;SFISC/SEARCH - PROGRAMMER ENTRY POINT ;12/16/93  13:16
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 N DIQUIET,DIFM S L=$G(L),DIFM=+L D CLEAN^DIEFU,INIT^DIP
 S:$G(DIC) DIC=$G(^DIC(DIC,0,"GL")) G QER1:$G(DIC)="" N DK S DK=+$P($G(@(DIC_"0)")),U,2) G QER1:'DK
 N DISV,Y D  S DISV=+Y I Y<0 S DIC="DISTEMP" G QER
 .N DIC,X,DIS S Y=-1,DIS=$G(DISTEMP) Q:DIS=""
 .S X=$S($E(DIS)="[":$P($E(DIS,2,99),"]"),1:DIS),DIC="^DIBT(",DIC(0)="Q",DIC("S")="I '$P(^(0),U,8),$P(^(0),U,4)=DK,$P(^(0),U,5)=DUZ!'$P(^(0),U,5),$D(^(""DIS""))"
 .D ^DIC Q
 N DISTXT S %X="^DIBT(DISV,""DIS"",",%Y="DIS(" D %XY^%RCR
 S %X="^DIBT(DISV,""O"",",%Y="DISTXT(" D %XY^%RCR
 K ^DIBT(DISV,1)
 D EN1^DIP G EXIT
 ;
QER1 S DIC="DIC"
QER D BLD^DIALOG(201,DIC) D:'$G(DIQUIET) MSG^DIALOG()
 D Q^DIP
EXIT K DIC,DISTEMP Q
 ;DIALOG #201  'The input variable...is missing or invalid.'

DIT
DIT ;SFISC/GFT-GET XFR ANSWERS ;14FEB2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;;
0 S DIC="^DOPT(""DIT""," G OPT:$D(^DOPT("DIT",3)) S ^(0)="TRANSFER OPTION^1.01" K ^("B")
 F X=1,2,3 S ^DOPT("DIT",X,0)=$P("TRANSFER FILE ENTRIES^COMPARE/MERGE FILE ENTRIES^NAMESPACE COMPARE",U,X)
 S DIK=DIC D IXALL^DIK
OPT W !! S DIC(0)="AEQZI" D ^DIC G Q:Y<0,UCI^DITCP:+Y=3 I +Y=2 D ^DITM K DIC G 0
 D Q S DLAYGO=1 D W^DICRW G Q:$D(DTOUT) Q:Y<0  S DFL=$P(Y,U,2)_": " I '$D(DIC) D DIE^DIB Q:'$D(DG)  S L=DG,Y=DLAYGO K DG,DIE,DQ G FROM
 S DIC("B")=+Y,L=DIC
FROM S DMRG=1,DKP=1,(DDF(1),DDT(0))=+Y,DIC=1,DIC(0)="EQAZ",DIC("A")="TRANSFER FROM FILE: "
 S DIC("S")="S DIFILE=+Y,DIAC=""RD"" D ^DIAC I %"
 D ^DIC K DIC G Q:Y<0,Q:'$D(^(0,"GL")) S DTO=^("GL") I DUZ(0)'="@",$S($D(^VA(200,DUZ,"FOF",+Y,0)):1,1:$D(^DIC(3,DUZ,"FOF",+Y,0))) G DTR:+$P(^(0),U,3),Q
 I DUZ(0)'="@",$D(^DIC(+Y,0,"DEL")) F X=1:1 G Q:X>$L(^("DEL")) Q:DUZ(0)[$E(^("DEL"),X)
DTR D PTS I +Y=DDF(1) G ^DIT0
TWO S (DTO(0),F)=L,L(+Y)=DDT(0),L=0,DDF(1)=+Y,DFR(1)=DTO_"D0,",DHIT=DLAYGO-(Y#1),%=0
 W !! K ^UTILITY("DITR",$J),A I DLAYGO-1 W "DO YOU WANT TO TRANSFER THE '",$P(Y,U,2),"'",!,"DATA DICTIONARY INTO YOUR NEW FILE" D YN^DICN G Q:%<1 D ^DIT1:%=1
 K DITF,Y,B W ! G Q:'$D(L)
 D MAP I '$D(DITF) W $C(7),"FILES DON'T MATCH!" G Q
 W:$X>40 ! W:'$D(A) "  WILL BE TRANSFERRED",!!
 S %=2,DMRG=0 I @("$O("_DTO(0)_"0))>0") W !,"WANT TO MERGE TRANSFERRED ENTRIES WITH ONES ALREADY THERE" D YN^DICN G Q:%<1 I %=1 S DMRG=1
 S (DIK,DIC)=DTO,DTO=1,L="TRANSFER ENTRIES",FLDS="",DHD="@",%ZIS="F"
D S %=0 W !,"WANT EACH ENTRY TO BE DELETED AS IT'S TRANSFERRED" D YN^DICN S DHIT="S DI=99 D F^DITR"_$P(",^DIK",%,%=1) G Q:%<0 I '% D F G D
 S DISTOP=0,DIOEND="S DIK=DTO(0),DIK(0)=""B"" D KL^DIT,IXALL^DIK,Q^DIT" D EN1^DIP
Q ;
 K ^UTILITY("DITR",$J),^UTILITY("DIT",$J),DIT,DIC,DA,DB1,DFR,DIK,L,FLDS,DHIT,DISTOP,DIOEND,%ZIS
KL K DIU,DIV,DIG,DIH,DLAYGO,DITF,DFN,DMRG,DTO,DTN,DDF,DTL,DFL,DDT,A,B,DKP,W,X,FLDS,Y,Z Q
 ;
MAP ;BUILD MAP OF FIELDS FROM 'FROM' TO 'TO' FILE
 N DFL S DFL=1
MAP2 ;ENTRY POINT FROM ^DIT3
 K:L]"" L(L) S L=$O(L(0)) Q:L']""
 F Y=0:0 S Y=$O(^DD(L,Y)) G MAP2:Y="",MAP2:'$D(^(Y,0)) S %=^(0) I $P(%,U,2)'["C" S DIC=$P(%,U,1),X=$O(^DD(L(L),"B",DIC,0)) I X>0,'^(X),$P(^DD(L(L),X,0),U,2)'["C" D T
 Q
T S Z=$P(^(0),U,4),V=$P($P(^(0),U,2),U,Z[";0"),^UTILITY("DITR",$J,L,Y)=$P(Z,";",2)_U_$P(Z,";",1) S:V ^(Y)=^(Y)_U_V,L(+$P(%,U,2))=+V I Z="0;1",DDF(DFL)=L S DITF=$P(%,U,4)
 Q:$D(A)  W:$X ", " W:$L(DIC)+$X>66 ! W "'"_DIC_"' FIELDS" Q
 ;
PTS ;Find re-pointable fields (not containing "I"!)
 S DL=0 F X=0:0 S X=$O(^DD(+Y,0,"PT",X)) Q:X'>0  F Z=.001:0 S Z=$O(^DD(+Y,0,"PT",X,Z)) Q:Z'>0  I $D(^DD(X,Z,0))#2 S %=^(0) I (U_$P(%,U,3)=DTO!($D(^DD(X,Z,"V","B",+Y)))),$P(%,U,2)'["I" S DL=DL+1,^UTILITY("DIT",$J,0,DL)=X_U_Z_U_$P(%,U,2)
 Q
 ;
F W !?7,"(TYPE '^' TO FORGET THE WHOLE THING!)",!
 Q
 ;
TRNMRG(DIFLG,DIFFNO,DITFNO,DIFIEN,DITIEN) ; SILENT TRANSFER/MERGE OF SINGLE RECORDS IN FILE OR SUBFILE
 ;DIFLG  = FLAGS
 ;DIFFNO = TRANSFER 'FROM' FILE/SUBFILE NO. OR ROOT
 ;DITFNO = TRANSFER 'TO' FILE/SUBFILE NO.
 ;DIFIEN = TRANSFER 'FROM' IEN STRING
 ;DITIEN = TRANSFER 'TO' IEN STRING (PASS BY REFERENCE)
 G TRNMRG^DIT3

DIT0
DIT0 ;SFISC/GFT,XAK-PREPARE TO XFR ;15FEB2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N Y,DIC,DIT0KILL S DIT=DDF(1),DIC=L,DIC(0)="EQLAM",X="DATA INTO WHICH " D LK
 G Q:Y<0 S DFR=+Y,DTO(1)=DIC_+Y_",",DIC(0)="EQAM",X="FROM ",DIC("S")="I Y-"_+Y D LK G Q:Y<0
S S (D0,DA)=+Y W ! D  G Q:%<0 S (DH,DIT0KILL)=2-% I '% D F^DIT G S
 .I $D(^DD(DIT,.01,"DEL",1,0)) X ^(0) I  S %=2 Q
 .S %=2 W "   WANT TO DELETE THIS ENTRY AFTER IT'S TRANSFERRED" D YN^DICN
 S ^UTILITY("DIT",$J,+Y)=DFR_";"_$E(DIC,2,999)
 S DTO=0,DIK=DIC,DFR(1)=DIC_DA_"," K DIC D WAIT^DICD
GO D GO^DITR
 S DIT=DH D KL^DIT,^DIK:$G(DIT0KILL) S DA=DFR K DFR D IX1^DIK ;DELETE OLD ENTRY, CONDITIONALLY
 S DH=DIT D ASK^DITP,PTS^DITP:%=1
Q G Q^DIT
 ;
LK S DIC("A")="TRANSFER "_X_DFL G ^DIC
 ;
EN ; PROGRAMMER CALL
 ; DIT("F") = GLOBAL ROOT OR FILE # OF FILE TO TRANSFER FROM
 ; DIT("T") = GLOBAL ROOT OR FILE # OF FILE TO TRANSFER TO
 ; DA("F")  = ENTRY # IN FILE TO TRANSFER FROM
 ; DA("T")  = ENTRY # IN FILE TO TRANSFER TO
 ;
 N DIT0KILL
 I '$D(DIT("F"))!'$D(DIT("T"))!'$D(DA("F"))!'$D(DA("T")) G FIN
 S DDF(1)=DIT("F"),DDT(0)=DIT("T")
 I 'DDF(1) S DDF(1)=$S($D(@(DDF(1)_"0)"))#2:+$P(^(0),U,2),1:0) G FIN:'DDF(1) S DFR(1)=DIT("F")
 I 'DDT(0) S DDT(0)=$S($D(@(DDT(0)_"0)"))#2:+$P(^(0),U,2),1:0) G FIN:'DDT(0) S DTO(1)=DIT("T") G C
 G FIN:'$D(^DIC(+DDF(1),0,"GL")) S DFR(1)=^("GL")
 G FIN:'$D(^DIC(+DDT(0),0,"GL")) S DTO(1)=^("GL")
C S DB=DA("F"),(DB1,DFR)=DA("T"),DIK=DTO(1)
 I $D(DA(1)) F I=1:1 G:'$D(DA(I)) SET S DRF(I)=$P(DA(I),",",1)_",1,",DOT(I)=$P(DA(I),",",2)_",1,"
DON K DRF,DOT S DFR(1)=DFR(1)_DB_",",DTO(1)=DTO(1)_DB1_",",DKP=1,DMRG=1,DTO=0,DH=0,DIT0KILL=0 G GO
SET F I=I-1:-1 G:I'>0 DON S DFR(1)=DFR(1)_DRF(I),DTO(1)=DTO(1)_DOT(I)
FIN ;
 K DDF,DFR,DDT,DTO
 Q

DIT1
DIT1 ;SFISC/GFT,TKW-TRANSFER DD'S ;30JAN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K A W !! S A=+Y,E=A
CHK F V=0:0 S V=$O(^DD(A,"SB",V)) Q:'V  S A(V)=0,L(V)=V#1+DHIT
 S A=$O(A(0)),B=A#1+DHIT I A'="" K A(A) G P:$P(DHIT,".")+1'>B,CHK:'$D(^DD(B)),P:DHIT["." S X=$P(^(B,0),U) S:$D(^DIC(B,0)) X=$P(^(0),U)_" FILE" W $P(^DD(A,0),U)_" WOULD COLLIDE WITH "_X,$C(7),! K L,A Q
 S A=$O(L(0)) I A S %X="^DIC("_A_",""%D"",",%Y="^DIC("_L(A)_",""%D""," D %XY^%RCR
 D WAIT^DICD F A="^DIE(","^DIPT(","^DIBT(" F V=0:0 S V=$O(@(A_"V)")) Q:'V  I $D(^(V,0)),$P(^(0),U,4)-Y=0 S ^UTILITY("DITR",$J,A,V)=$P(^(0),U)
 S A="F B=0:0 Q:F=DTO!'$F(W,DTO)  S W=$P(W,DTO)_F_$P(W,DTO,2,9)"
 I $O(^UTILITY("DITR",$J,""))]"" W !,"DO YOU WANT TO COPY '",$P(Y,U,2),"'S TEMPLATES INTO YOUR NEW FILE" D YN^DICN W ! D:%=1
 .S E="I DIK=""^DIBT("",%Z=1,$D(L(+W)) S $P(W,U)=L(+W)"
 .F DIK="^DIE(","^DIPT(","^DIBT(" S V=$P(@(DIK_"0)"),U,3),%X=DIK_"Z,",%Y=DIK_"V," D ^DIT2,IXALL^DIK
GO S Y=DLAYGO K ^UTILITY("DITR",$J),^DD(Y,"B"),^(.01),^("IX"),^("RQ"),^(0,"IX"),E
 S @("V=$P("_DTO_"0),U,2)"),@("^(0)=$P("_DTO(0)_"0),U,1,2)_$P(V,DDF(1),2)_U_U")
DD W ! S L=$O(L(L)) Q:L=""  S Y=L(L),B=0,V=$O(^DD(L,0,"NM",0)),^DD(Y,0)=^DD(L,0) I V]"",$O(^(0,"NM",0))="" S ^(V)=""
 S V=-1 I $D(^DD(L,0,"UP")) S ^DD(Y,0,"UP")=^("UP")#1+DHIT
ID S V=$O(^DD(L,0,"ID",V)) I V]"",$D(^(V))#2 S W=^(V) X A S ^DD(Y,0,"ID",V)=W G ID
 F V=0:0 S V=$O(^DD(L,V)) Q:'V  W "." D MOVEFLD
 D IXKEY(.L,DTO,Y,F)
 S DA(1)=Y,DIK="^DD("_Y_"," D IXALL^DIK K %A,%B,%C,%Z
 G DD
 ;
MOVEFLD S W=$G(^DD(L,V,0)),D=$P(W,U,2),%Z=0,%A="" Q:W=""
 I D["C" D  Q  ;copy COMPUTED FIELD, replacing Y variable with DIT
 .N DITN
 .S D=$P(W,U,5,99),^DD(Y,V,0)=$P(W,U,1,4)_"^N DIT "_$$DITRPL(D)
 .S ^DD(Y,V,9)="^",^DD(Y,V,9.1)=$G(^DD(L,V,9.1))
 .F DITN=9.01,9.02 S W=$G(^DD(L,V,DITN)) I W]"" D Y S ^DD(Y,V,DITN)=W
 .S DITN=9.15 F  S DITN=$O(^DD(L,V,DITN)) Q:DITN=""  I $D(^(DITN))#2 S ^DD(Y,V,DITN)=$$DITRPL(^(DITN))
MULFLD I D S L(+D)=D#1+DHIT,W=$P(W,U)_U_L(+D)_$P(D,+D,2,9)_U_$P(W,U,3,99)
 E  X A ;D Y ;DO NOT REPLACE NUMBERS IN THE '0' NODE --GFT 1/30/2010
 S ^DD(Y,V,0)=W,%B=0
N S %B=$O(@("^DD(L,V,"_%A_"%B)")) G:((%B=5)&(%A="")) N I %B="" Q:'%Z  S @("%B="_$P(%A,",",%Z)),%Z=%Z-1,%A=$P(%A,",",1,%Z)_$E(",",%Z>0) G N
 I @("$D(^DD(L,V,"_%A_"%B))#2") S W=^(%B) D D S @("^DD(Y,V,"_%A_"%B)=W")
 I @("$D(^DD(L,V,"_%A_"%B))<9") G N
 S:+%B'=%B %B=""""_%B_"""" S %A=%A_%B_",",%Z=%Z+1,%B="" G N
 ;
DITRPL(W) S W=$$REPLACE(W,"Y("_L_","_V_",","DIT(") D D Q W
 ;
D X A
Y ;REPLACE THE NUMBERS; CALLED FROM DIT2
 N O
 F O=0:0 S O=$O(L(O)) Q:'O  S W=$$REPLACE(W,O,L(O))
 Q
 ;
REPLACE(X,OLD,NEW) ;
 N %,C
 S C=$L(NEW)-$L(OLD)
 F %=0:0 S %=$F(X,OLD,%) Q:%<1  I C+$L(X)<256,$E(X,%)'=".",$E(X,%-$L(OLD)-1)'?1N S X=$E(X,1,%-$L(OLD)-1)_NEW_$E(X,%,9999),%=%+C
 Q X
 ;
IXKEY(DIFRN,DIFRGBL,DITON,DITOGBL) ; transfer KEY and INDEX file entries
 ; DIFRN=from file#, DIFRN(DIFRN)=from file list, DIFRGBL=from file global, DITON=to file#, DITOGBL=to file global
 N A,B,E,F,V,Y
 N DIFRNAME,DIFRD0,DIG,DITOD0,DIL1,DIL2,DIL3,DIFRPRT,I,X S DIFRNAME=""
 S DIL1=$L(DIFRGBL)
 S DIL3=$O(DIFRN("")) S:DIL3 DIL3=$F(DIFRGBL,DIL3) S:DIL3 DIL3=DIL3-1,DIFRPRT=$E(DIFRGBL,1,DIL3)
 ; INDEX file entries
 F  S DIFRNAME=$O(^DD("IX","BB",DIFRN,DIFRNAME)) Q:DIFRNAME=""  D
 . S DIFRD0=$O(^DD("IX","BB",DIFRN,DIFRNAME,0)) Q:'DIFRD0
 . S DITOD0=$O(^DD("IX","BB",DITON,DIFRNAME,0)) I DITOD0 D ERR("IX",DITON,DIFRNAME) Q
 . S DITOD0=$$NXTNO^DICLIB("^DD(""IX"",","","U")
 . M ^DD("IX",DITOD0)=^DD("IX",DIFRD0)
 . K ^DD("IX",DITOD0,11.1,"AC"),^("B"),^("BB")
 . I DIFRGBL'=DITOGBL!(DIFRN'=DITON) S DIG="^DD(""IX"","_DITOD0_")" D ADJ
 . S DIK="^DD(""IX"",",DA=DITOD0 D IX1^DIK
 . Q
 ; KEY file entries
 S DIFRNAME=""
 F  S DIFRNAME=$O(^DD("KEY","BB",DIFRN,DIFRNAME)) Q:DIFRNAME=""  D
 . S DIFRD0=$O(^DD("KEY","BB",DIFRN,DIFRNAME,0)) Q:'DIFRD0
 . S DITOD0=$O(^DD("KEY","BB",DITON,DIFRNAME,0)) I DITOD0 D ERR("KEY",DITON,DIFRNAME) Q
 . S DITOD0=$$NXTNO^DICLIB("^DD(""KEY"",","","U")
 . M ^DD("KEY",DITOD0)=^DD("KEY",DIFRD0)
 . K ^DD("KEY",DITOD0,2,"B"),^("BB"),^("S")
 . I DIFRGBL'=DITOGBL!(DIFRN'=DITON) S DIG="^DD(""KEY"","_DITOD0_")" D ADJ
 . S DIK="^DD(""KEY"",",DA=DITOD0 D IX1^DIK
 . Q
 Q
ADJ ; Change data to contain new file number and global reference.
 F  S DIG=$Q(@DIG),X=$QS(DIG,2) Q:X'=DITOD0  D
 . S X=@DIG,I=0
 . I DIFRGBL'=DITOGBL F  S I=$F(X,DIFRGBL,I) Q:'I  D
 . . S $E(X,I-DIL1,I-1)=DITOGBL,I=I+$L(DITOGBL)-DIL1
 . Q:DIFRN=DITON  N DIF,DIT
 . F DIF=0:0 S DIF=$O(DIFRN(DIF)) Q:'DIF  S DIT=DIFRN(DIF),DIL2=$L(DIF),I=0 F  D  Q:'I
 . . S I=$F(X,DIF,I) Q:'I  Q:$E(X,I,999)
 . . I DIL3,$E(X,(I-DIL3+1),(I-DIL1+DIL3-1))=DIFRPRT Q
 . . S $E(X,I-DIL2,I-1)=DIT,I=I+$L(DIT)-DIL2
 . S @DIG=X Q
 Q
 ;
ERR(DITYPE,DITON,DIFRNAME) ;
 ;DITYPE=IX or KEY, DITON=file/subfile#, DIFRNAME=Index/Key name
 N DIPAR,DIER S DIPAR(1)=$S(DITYPE="IX":"INDEX",1:"KEY")
 S DIPAR(2)=DIFRNAME,DIPAR(3)=DITON
 D BLD^DIALOG(9548,.DIPAR),MSG^DIALOG("WE")
 Q
 ;
 ; Error list
 ;9548 - |1| '|2|' for file |3| already exists.
 ;
 Q
 ;
P W $C(7),"FILE #"_+Y_" SHOULD ONLY BE TRANSFERRED TO A FILE WHOSE NUMBER",!?8,"ALSO "_$S(Y#1:"ENDS WITH '"_(Y#1)_"'",1:"IS INTEGER") K L,A Q
 ;

DIT2
DIT2 ;SFISC/GFT-TRANSFER TEMPLATES ;10/16/90  9:37 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
TEM F Z=0:0 W "." S Z=$O(^UTILITY("DITR",$J,DIK,Z)) Q:Z=""  F V=V:1 I $O(@(%Y_"0)"))="" D %XY S ^(0)=$P(@(%Y_"0)"),U,1,3)_U_DDT(0)_U_$P(^(0),U,5,99) K ^("ROU"),^("ROUOLD") K:DIK="^DIBT(" ^DIBT(V,1) Q
 Q
%XY ;
 S %Z=0,%A="",%C(-1)=0,%E=""
S S %B=-1
N S @("%B=$O("_%X_%A_"%B))") S:%B="" %B=-1 S %C(%Z)=%C(%Z-1),%D=$S($D(L(%B)):L(%B),1:%B)
 I %B=-1 Q:'%Z  S @("%B="_$P(%A,",",%Z+%C(%Z-2),%Z+%C(%Z-1))),%Z=%Z-1,%A=$P(%A,",",1,%Z+%C(%Z-1))_$E(",",%Z>0),%E=$P(%E,",",1,%Z+%C(%Z-1))_$E(",",%Z>0) G N
 I $D(@(%X_%A_"%B)"))#2 S W=^(%B) X A D Y^DIT1 X E S @(%Y_%E_"%D)=W") I %A="""DCL""," S ^(%B#1+DHIT_U_$P(%B,U,2))=^(%B) K ^(%B) G N
 I @("$D("_%X_%A_"%B))<9") G N
 S:+%B'=%B %B=""""_%B_"""" S:+%D'=%D %D=""""_%D_""""
 S %A=%A_%B_",",%Z=%Z+1,%E=%E_%D_"," G S
 ;
DCL ;S ^(%B#1+DHIT_U_$P(%B,U,2))=^(%B) K ^(%B) G N
 ;

DIT3
DIT3 ;SFISC/TKW - SILENT TRANSFER/MERGE ROUTINE ;10/14/94  13:50
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
TRNMRG ; TRANSFER OR MERGE RECORDS SILENTLY (CALLED FROM TRNMRG^DIT)
 N I,J,Z,DITYPM,DDF,DDT,DFR,DMRG,DKP,DTO,DFL,DTL,DA,DIZZ,DIERRMSG,DIK,DITF D CLEAN^DIEFU
 F I=1:1 S DITYPM=$E(DIFLG,I) Q:DITYPM=""  Q:"MOAR"[DITYPM
 I DITYPM="" G ERR0
 I '$G(DIFFNO),$G(DITFNO) S DFR=DIFFNO,DIFFNO=+DITFNO I $E(DFR,$L(DFR))=")" S DFR=$$OREF^DIQGU(DFR)
 I '$G(DIFFNO)!('$D(^DD(+$G(DIFFNO),.01,0))) S DIERRMSG=$$EZBLD^DIALOG(8082)_" "_$$EZBLD^DIALOG(8084) G ERR3
 S DITFNO=+$G(DITFNO) S:'DITFNO DITFNO=DIFFNO I DITFNO'=DIFFNO,'$D(^DD(DITFNO,.01,0)) S DIERRMSG=$$EZBLD^DIALOG(8083)_" "_$$EZBLD^DIALOG(8084) G ERR3
 I '$G(DIFIEN) S DIERRMSG=$$EZBLD^DIALOG(8082)_" "_$$EZBLD^DIALOG(8085) G ERR3
 F I=0:1 S J=$P(DIFIEN,",",I+1) Q:'J  S DA(I)=J,DFL=I*2+1
 S (I,J)=I-1 D  G:I'=J ERR5
 . I I=0,$D(^DD(DIFFNO,0,"UP")) S J=-1 Q
 . N Z S Z=DIFFNO,J=0 F  Q:'$D(^DD(Z,0,"UP"))  S J=J+1,Z=^("UP")
 . Q
 S J=0
SD0 N @("D"_J) S @("D"_J)=DA(I),I=I-1,J=J+1 I I>-1 G SD0
 S DA=DA(0) K DA(0)
 S DDF(DFL)=DIFFNO,DDT(DFL-1)=DITFNO S:DIFFNO=DITFNO DDT(DFL)=DITFNO
 S DFR(DFL)=$S($G(DFR)]"":DFR,1:$$ROOT^DIQGU(DIFFNO,DIFIEN,"",1))_+DIFIEN_"," Q:$D(DIERR)  G:'$D(@(DFR(DFL)_"0)")) ERR1 S DIZZ=^(0)
 S:$G(DITIEN)="" DITIEN="+?1,"_$P(DIFIEN,",",2,99)
 Q:'$$IENCHK(DITFNO,DITIEN)
 S (DTO(DFL-1),DIK)=$$ROOT^DIQGU(DITFNO,DITIEN,"",1) Q:$D(DIERR)
 I DITIEN S DTO(DFL)=DTO(DFL-1)_+DITIEN_"," I '$D(@(DTO(DFL)_"0)")) G ERR2
 I 'DITIEN,$D(^DD(DITFNO,0,"UP")) D  I '$D(DITIEN) G ERR2
 . N X,Y,Z S X=^DD(DITFNO,0,"UP"),Y=$P(DITIEN,",",2,99),Z=$$ROOT^DIQGU(X,Y) I $D(DIERR) K DITIEN Q
 . I '$D(@(Z_$P(Y,",")_",0)")) K DITIEN Q
 . I $P($G(^DD(DITFNO,.01,0)),U,2)["W" K DITIEN Q
 . I '$D(@(DTO(DFL-1)_"0)")) S Z=$O(^DD(X,"SB",DITFNO,0)) I Z S Z=$P($G(^DD(X,Z,0)),U,2) I Z S @(DTO(DFL-1)_"0)")="^"_Z_"^^"
 . Q
 I DIFFNO'=DITFNO D  I '$D(DITF) G ERR4
 . N %,A,L,V,X,Y,Z,DIC K ^UTILITY("DITR",$J)
 . S A=1,L=0,L(DDF(DFL))=DDT(DFL-1)
 . D MAP2^DIT Q
 S DMRG=$S(DIFLG["A":0,1:1),DKP=$S(DIFLG["M":1,1:0),DTO=$S(DIFFNO=DITFNO:0,1:1)
 N %,A,B,V,W,X,Y,DFN,DTN,DINUM,DIC,DIIX
 I 'DITIEN D  Q:A
 . S (DFL,DTL)=DFL-1,Z=DIZZ D ^DITR1 Q:A
 . S DFL=DFL+1,DITIEN=+Y_","_$P(DITIEN,",",2,99)
 . Q
 S DTL=DFL,DFN(DFL)=-1 D N^DITR
 I DIFLG'["X" Q
 K DA F I=1:1 S J=$P(DITIEN,",",I) Q:'J  S:I=1 DA=J I I>1 S DA(I-1)=J
 D IXALL^DIK
 Q
 ;
IENCHK(DIFILE,DIIEN) ;EXTRINSIC FUNCTIO TO CHECK THAT IEN STRING AND FILE/SUBFILE NO. ARE IN SYNC
 ;DIFILE=file/subfile#, DIIEN=IEN string
 N I,J
 S I=$L($G(DIIEN),",") I I=1 G ERX
 S I=I-1,J=0 D  I I'=J G ERX
 . I I=1,$D(^DD(DIFILE,0,"UP")) Q
 . S J=1 F  Q:'$D(^DD(DIFILE,0,"UP"))  S J=J+1,DIFILE=^("UP")
 . Q
 Q 1
ERX K I S I(1)=DIFILE,I("IENS")=DIIEN D BLD^DIALOG(205,.I) Q 0
 ;
ERR0 D BLD^DIALOG(301,DIFLG) Q
ERR1 S DIERRMSG=$$EZBLD^DIALOG(8082)_" "_$$EZBLD^DIALOG(8078) G ERR3
ERR2 S DIERRMSG=$$EZBLD^DIALOG(8083)_" "_$$EZBLD^DIALOG(8078)
ERR3 D BLD^DIALOG(202,DIERRMSG) Q
ERR4 D BLD^DIALOG(1504) Q
ERR5 K I S I(1)=DIFFNO,I("IENS")=DIFIEN D BLD^DIALOG(205,.I) Q
 ;202  The input param...that identifies...|1| is missing or invalid.
 ;205  File...number and IEN string represent different...levels.       
 ;301  The passed flag(s) '|1|' are unknown or inconsistent.
 ;1504  No matching .01 field names...Transfer/Merge cannot be done
 ;8082  Transfer FROM
 ;8083  Transfer TO
 ;8084  file number
 ;8085  IEN string
 ;

DITC
DITC ;SFISC/XAK-MERGE OR COMPARE ENTRIES ;9/17/91  10:36 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
START ;
 K DFF,DIT,DIMERGE,DDSP,DDIF,DDEF,DITC,DMSG
 D K2,K1,T^DICRW G:Y<0 END S (DSUB,DIT,L)=0,DSUB(L)=DIC,DITC=1
SUB S %=$P(Y,U,2),Y=+Y D SUB^DICRW K DIA
ENTR G:X["^"!($D(DTOUT)) END K DIC S DIC(0)="AEQMZ",DIC=DSUB(0),DFL=1,DIT=DIT+1,DIT(DIT)="" W:DIT=1 !
E1 S DIC("A")=$E("        ",1,DFL-1*3)_$S(DIT=2:" WITH ",1:"COMPARE ")_DFL(DFL)_": " I (DIT=2),(DFL=L),($P(DIT(1),",",1,L-1)=$P(DIT(2),",",1,L-1)) S DIC("S")="I Y-"_$P(DIT(1),",",L)
 D ^DIC K DIC("S"),DIC("A") I Y>0,$D(DSUB(DFL)),$D(DFL(DFL+1)) S DIC=DIC_+Y_","_DSUB(DFL),DIT(DIT)=DIT(DIT)_+Y_",",DFL=DFL+1 S %=$O(@(DIC_"-1)")) G:'% E1 S:%>0 ^(0)=U_DFF_U I %<0 W !,"NO "_DFL(DFL) S Y=-1
 G:X=U END G:Y=-1 START S DTO(DIT)=DIC_+Y_",",DTO(DIT,"X")=Y(0,0),DIT(DIT)=DIT(DIT)_+Y G:DIT=1 ENTR S DDSP=1
Q1 S %=2 W !!,"WILL YOU WANT TO MERGE THESE ENTRIES AFTER COMPARING THEM" D YN^DICN I '% W ! S DMSG=1 D HELP^DITC0 G Q1
 S:%=1 DIMERGE=1 G:%<0 END G:'$D(DIMERGE) Q2 W ! F I=1,2 W !?5,I,?10,DTO(I,"X")
Q15 R !!,"WHICH ENTRY SHOULD BE USED FOR DEFAULT VALUES (1 OR 2)? ",X:DTIME S:X[U DUOUT=1 S:'$T X=U,DTOUT=1 G:X["^" END I X="?" S DMSG=3 D HELP^DITC0 G Q15
 I X'=1,X'=2 W $C(7),!,"Enter '1' or '2'" G Q15
 S DDEF=X
Q2 S %=2 W !!,"DO YOU WANT TO DISPLAY ONLY THE DISCREPANT FIELDS" D YN^DICN I '% S DMSG=2 D HELP^DITC0 G Q2
 S:%=1 DDIF=1 G:%<0 END G PRNT^DITC1
EN ;
 D K2
EN2 ;
 D K1 S DMSG=0 F I="DFF","DIT(1)","DIT(2)" Q:DMSG  I '$D(@I) S DMSG=1,DMSG(1)=I
 G:DMSG ERREND^DITC0 F I="DFF","DIT(1)","DIT(2)" Q:DMSG  I '$L(@I) S DMSG=2,DMSG(1)=I
 G:DMSG ERREND^DITC0 I '$D(^DD(DFF)) S DMSG=3,DMSG(1)=DFF G ERREND^DITC0
 S:'$D(DFL) N=$O(^DD(DFF,0,"NM",-1))_U,X1=1,M=DFF_U
 S DITC=1,K=DFF,DSUB=0
 F I=0:0 Q:'$D(^DD(K,0,"UP"))  S J=^("UP"),I=$O(^DD(J,"SB",K,-1)),DSUB=DSUB+1,DSUB(DSUB)=""""_$P($P(^DD(J,I,0),U,4),";",1)_""",",K=J S:'$D(DFL) N=N_$O(^DD(K,0,"NM",-1))_U,M=M_K_U,X1=X1+1
 S DSUB=DSUB+1,DSUB(DSUB)=^DIC(K,0,"GL") I '$D(DFL) F DFL=1:1:X1 S DFL(DFL)=$P(N,U,X1-DFL+1),DFF(DFL)=$P(M,U,X1-DFL+1)
 S DMSG="" F I=1:1:2 S DTO(I)="" I DIT(I)'=0 F K=DSUB:-1:1 S DTO(I)=DTO(I)_DSUB(K)_$P(DIT(I),",",DSUB-K+1)_"," I '$L($P(DIT(I),",",DSUB-K+1)) S DMSG=4,DMSG(1)="DIT("_I_")"
 F I=1,2 I $L($P(DIT(I),",",DSUB+1,99)) S DMSG=4,DMSG(1)="DIT("_I_")"
 G:$L(DMSG) ERREND^DITC0 K DMSG G PRNT^DITC1
K1 ;
 K %H,DSUB,DTO,DFL,DNUM
 Q
K2 ;
 K D001,DHD,DUOUT,DTOUT,DIRUT,^UTILITY($J,"DIT"),^("DITI"),^("DITDINUM")
 Q
END ;
 I $D(DTOUT)!($D(DUOUT)) S DIRUT=1
 D K1 K DIMERGE,DDSP,DDIF,DDEF,DIT,DFF,DDSH,DDSPC,DEQ,DIACT,X,X2,POP,DHD,D,Y,X1,^UTILITY($J,"DIT"),^("DITI"),^("DITDINUM")
 K DITC
 Q

DITC0
DITC0 ;SFISC/XAK-COMPARE FILE ENTRIES ;12/3/90  12:38
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Mandatory INPUT VARIABLES using entry point EN:
 ; DFF ...... File or subfile number
 ; DIT(1) ... Internal number of first entry
 ; DIT(2) ... Internal number of second entry
 ;
 ; Optional INPUT VARIABLES using entry point EN:
 ; DIMERGE ..... If defined, allows for merge; if not, does compare only
 ; DDSP ..... If defined, writes 'wait messages and dots' to the screen
 ; DDIF ..... If undefined displays all fields
 ; DDIF=1: displays discrepant only
 ; DDIF=2: displays discrepant and missing as well
 ; DDEF ..... Entry # (1 or 2) from which to take default values.
ERREND ;
 S DMSG=$P($T(ERRTXT+DMSG),";; ",2)_": "_DMSG(1) W !,DMSG
 G END^DITC
 Q
ERRTXT ;;
 ;; Undefined INPUT VARIABLE
 ;; Null INPUT VARIABLE
 ;; Nonexistent FILE
 ;; Incorrect INPUT VARIABLE specification
HELP ;;
 W ! F I=1:1 S J=$P($T(@("HTXT"_DMSG)+I),";; ",2) Q:'$L(J)  W !,J
 Q
HTXT1 ;;
 ;; Enter a 'N' if you wish only to compare and display the two
 ;; entries.  Enter a 'Y' if you wish to choose valid fields from each
 ;; entry and eventually do a merge into record selected for default.
HTXT2 ;;
 ;; Enter a 'N' if you wish to display all of the fields in each entry.
 ;; Enter a 'Y' if you wish to display only those fields which differ.
HTXT3 ;;
 ;; On merging, the default field value can be taken from entry #1 or #2.
 ;; You will later have the opportunity to modify this default selection
 ;; on a field by field basis.  Please note that the two records will
 ;; always be merged into the record selected as the default selection.
HTXT4 ;;
 ;; When the two entries are compared, all top level fields are displayed
 ;; and a summary for multiple level fields are displayed. If you also wish to
 ;; see a detailed comparison on the multiple level fields, enter 'Y'.
 ;;
 ;;

DITC1
DITC1 ;SFISC/XAK-COMPARE FILE ENTRIES PRINT ;7/1/93  4:31 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PRNT S %ZIS("B")="",%ZIS=$S($D(DIMERGE):"M",1:"QM") D ^%ZIS G:POP END^DITC I $D(IO("Q")) G QUE
COMP W:$D(DDSP) !,"COMPARING THE TWO ENTRIES" F I=1:1:2 I $L(DTO(I)) S J=-1 F K=0:0 S @("J=$O("_DTO(I)_"J))") Q:J=""  W:$D(DDSP) "." D EACH
 D DISP
 Q
EACH ;
 I @("$D("_DTO(I)_"J))'<10") D MUL Q
 S X=^(J) F N=1:1 D:$L($P(X,U,N)) SETU Q:'$L($P(X,U,N,999))
 Q
SETU ;
 I '$D(^UTILITY($J,"DIT",J,N,0)) S @("Y=$O(^DD("_DFF_",""GL"",J,"_N_",-1))") Q:Y=""  S %=^DD(DFF,Y,0),^UTILITY($J,"DIT",J,N,0)=Y_U_$P(%,U,1)_U I Y=.01,$P(%,U,5,999)["DINUM" S ^UTILITY($J,"DITDINUM",J,N,0)=""
 S O=+^UTILITY($J,"DIT",J,N,0) S:$P(^DD(DFF,O,0),U,2)["O" ^UTILITY($J,"DITI",J,N,I)=$P(X,U,N)
 S C=^DD(DFF,O,0),O=$P(C,U,1),C=$P(C,U,2),D0=DIT(I),Y=$P(X,U,N) D Y^DIQ S ^UTILITY($J,"DIT",J,N,I)=Y
 Q
MUL ;
 I '$D(^UTILITY($J,"DIT",U,J,0)) S @("Y=$O(^DD("_DFF_",""GL"",J,0,-1))") Q:Y=""  S ^UTILITY($J,"DIT",U,J,0)=Y_U_$P(^DD(DFF,Y,0),U,1)_U
 S N=0 F L=0:1 S @("N=$O("_DTO(I)_"J,N))") Q:'N
 S $P(^UTILITY($J,"DIT",U,J,0),U,I+3)=L
 Q
DISP ;
 U IO
 I $D(DIMERGE) S J=-1 F  S J=$O(^UTILITY($J,"DIT",J)) Q:U[J  S N=-1 F  S N=$O(^UTILITY($J,"DIT",J,N)) Q:N=""  D D11^DITC2
 S DC=0,DDSH="",$P(DDSH,"-",IOM-1)="-",$P(DDSPC," ",30)=" ",DV=(IOM-1)\3
 S DHD(0)="COMPARISON OF "_DFL(1)_" FILE ENTRIES"
 S R=$S(DSUB(DSUB)[",":1,1:0),%H=$H D YX^%DTC S DHD(9)=$P(Y,":",1,2)
 F I=1:1:2 I $L(DTO(I)) F J=1:2 S K=$P(DTO(I),",",1,J+R) Q:($E(K,$L(K))=",")  D D0
 S DIFF=$S(IOST?1"C".E:1,1:0) D ^DITC2 K DUOUT
 I $D(DTOUT)!('$D(DIMERGE)) G EX
 I IOST'?1"C".E W !!!!,?3,"**** NOW PROCEEDING WITH THE MERGE ****" W @IOF S DIACT="P" D ACT^DITC3 G EX
 I X=U D ASK^DITC3 G EX
 W ! D @($P("ASK",U,'$O(^UTILITY($J,"DIT",U,0)))_"^DITC3")
EX X $G(^%ZIS("C")) G END^DITC
 Q
D0 ;
 I '$D(^DD(DFF(J+1\2),.001,0)) S K=K_",0)" Q:'$D(@K)  S Y=^(0),Y=$P(Y,U,1) Q:'$L(Y)  S C=^DD(DFF(J+1\2),.01,0) G D01
 S Y=$P($P(DTO(I),DIC,2),",",1),C=^DD(DFF(J+1\2),.001,0)
D01 S O=$P(C,U,1),C=$P(C,U,2) D Y^DIQ S $P(DHD(J\2+1),U,I)=Y
 Q
QUE ;
 K Y,K,L,M,N,I,X,X1,C,DDSP,DMSG
 S DJ=0,DHD="COMPARE OF "_DFL(1)_" FILE" D ^DIP4 G END^DITC
 Q
DQ ;
 D NOW^%DTC S DT=X K %,%I G COMP

DITC2
DITC2 ;SFISC/XAK-COMPARE FILE ENTRIES PRINT ;10/15/91  9:01 AM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S J=-1 D PG1 F K=0:0 S J=$O(^UTILITY($J,"DIT",J)) Q:X=U!(U[J)  S N=-1 F K=0:0 S N=$O(^UTILITY($J,"DIT",J,N)) Q:N=""!(X=U)  D D1 Q:X=U  D:+X(0) D2
 I X'=U D PG Q:X=U  D MUL:$D(^UTILITY($J,"DIT",U))
 Q
D1 ;
 I $Y+6>IOSL,'$D(DREDO) S DIJ=J,DIN=N D PG,PG1:X'=U S J=DIJ,N=DIN K DIJ,DIN
 Q:X=U
D11 F I=0:1:2 S X(I)=$S($D(^UTILITY($J,"DIT",J,N,I)):^(I),1:"") I X(I)["""" D D7
 S DEQ=X(1)=X(2) I $D(DDIF),DEQ I (DDIF=1)!(DDIF=2&$L(X(1))) S X(0)=0 K ^UTILITY($J,"DIT",J,N) Q
 Q:'$D(DIMERGE)  S X1=$P(X(0),U,3) I '$L(X1) S X1=$S(X(1)=X(2):0,'$L(X(DDEF)):'(DDEF-1)+1,1:DDEF),$P(^UTILITY($J,"DIT",J,N,0),U,3)=X1,$P(X(0),U,3)=X1
 Q
D2 ;
 K D S X2=$P(X(0),U,3),X(0)=$P(X(0),U,2)
D20 F I=0:1:2 S X=X(I),X1="" F D=1:1 Q:'$L(X)  D:($L(X)>(DV-6)) D5 S $P(D(D),U,I+1)=$S(I=X2&I:"["_X_"]",1:X) S X=X1,X1=""
D21 F I=1:1 Q:'$D(D(I))  D D3
 Q
D3 ;
 I $D(DREDO),I=1 X:$D(IOXY) IOXY W !,DREDO,".",?4 G D31
 W ! W:(I=1) ! I I=1,$D(DIMERGE) S DNUM=DNUM+1 W DNUM,"." S DNUM(DNUM)=J_U_N_U_$Y
 W:'DEQ&'$D(DIMERGE)&(I=1) "***" W ?4
D31 F X1=1:1:3 I $L($P(D(I),U,X1)) W ?(DV*(X1-1)) W $P(D(I),U,X1)
 I $D(DREDO) W $E(DDSPC,1,3)
 Q
D5 ;
 F K=DV-6:-1:1 Q:$E(X,K)?1P
 I $E(X,K)?1P S X1=$E(X,K+1,999),X=$E(X,1,K) Q
 S X1=$E(X,DV-1,999),X=$E(X,DV-2)
 Q
D7 S X(I)=$P(X(I),"""",1)_"'"_$P(X(I),"""",2,99) I X(I)["""" G D7
 Q
MUL ;
 S DIMUL=1 D PG1 S N=0
 F K=0:0 S N=$O(^UTILITY($J,"DIT",U,N)) Q:N=""!(X=U)  D EMUL
 K DIMUL Q
EMUL ;
 D:$Y+5>IOSL PG
 K D S X2="",J=^UTILITY($J,"DIT",U,N,0),X=$P(J,U,2),X1="",I=0 F D=1:1 Q:'$L(X)  D:($L(X)>(DV-6)) D5 S $P(D(D),U,I+1)=""""_X_"""" S X=X1,X1=""
 S X=J F I=1:1:2 S $P(D(1),U,I+1)=""""_$S('$P(X,U,I+3):"  ---",1:$J($P(X,U,I+3),2)_$S($P(X,U,I+3)>1:" entries",1:" entry"))_""""
 D D21
 Q
PG ;
 I '$D(DIMERGE)!$D(DIMUL) I IOST?1"C".E W $C(7) K DIR S DIR(0)="E" D ^DIR K DIR S:$D(DIRUT) X=U Q
 W:'$D(IOXY) !! Q:IOST'?1"C".E  I $D(IOXY) S DX=0,DY=IOSL-3 X IOXY W !
 W "Default is enclosed in brackets, e.g., [",$E($P(DHD(1),U,DDEF),1,(DV-6)),"]",! S %="Enter 1-"_DNUM_" to change default value, ^ to exit, RETURN to continue: " W %,$E(DDSPC,1,IOM-$L(%)-2)
 I $D(IOXY) S DX=$L(%),DY=IOSL-1 X IOXY
 I '$D(IOXY) F I=1:1:IOM-$L(%)-2 W $C(8)
 R X:DTIME S:'$T X=U,DTOUT=1 Q:X=U
 S X1="" I X=+X,X>0,X'>DNUM S J=$P(DNUM(X),U),N=$P(DNUM(X),U,2),X1=$P(^UTILITY($J,"DIT",J,N,0),U,3) G:'X1 PG I +^(0)=.01,$D(^UTILITY($J,"DITDINUM",J,N,0)) D ERD G PG
 I X1 S $P(^UTILITY($J,"DIT",J,N,0),U,3)='(X1-1)+1,DREDO=X,DX=5,DY=$P(DNUM(X),U,3)-1 D D1,D2 K DREDO G PG
 I $L(X) W $C(7) G PG
 Q
PG1 S DC=DC+1,DNUM=0 W:DIFF @IOF S DIFF=1 W DHD(0),?(IOM-29),DHD(9),"   PAGE ",DC
 S I=$S($D(DIMERGE):DDEF,1:0) F X1=1:1:DFL W ! W $E(DFL(X1),1,DV-1) W ?DV W:(I=1) "[" W $E($P(DHD(X1),U,1),1,DV-1) W:(I=1) "]" W ?(DV*2) W:(I=2) "[" W $E($P(DHD(X1),U,2),1,DV-1) W:(I=2) "]"
 W !,DDSH I $D(DIMUL) W !,?2,"NOTE: Multiples will be merged into the target record"
 Q
ERD W:'$D(IOXY) !! W $C(7) I $D(IOXY) S DX=0,DY=IOSL-1 X IOXY
 W "You must accept the default because this record is DINUMed!!",$E(DDSPC,1,IOM-62) I $D(IOXY) S DX=61,DY=IOSL-1 X IOXY
 R X:10 Q

DITC3
DITC3 ;SFISC/XAK-COMPARE FILE ENTRIES ;9/17/91  3:12 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:1:(IOSL-$Y-1) W !
 W "Enter RETURN to continue: " R X:DTIME S:'$T DTOUT=1
ASK Q:$D(DTOUT)  K DUOUT,DIRUT W @IOF,!,"OK.  I'M READY TO DO THE MERGE."
 S DIR(0)="S^P:PROCEED to merge the data;S:SUMMARIZE the modifications before proceeding;E:EDIT the data again before proceeding"
 S DIR("A")="ACTION" D ^DIR K DIR
 Q:$D(DIRUT)  I Y="E" D ^DITC2 Q:$D(DTOUT)  G ASK:X=U,DITC3:$D(^UTILITY($J,"DIT",U)),ASK
 S DIACT=Y,DNUM=0 D ACT Q:DIACT="P"  G:$D(DIRUT) ASK G DITC3
ACT ;
 I DIACT="S" D SUMHD
 S DIT1="" F K=0:0 Q:$D(DTOUT)  S DIT1=$O(^UTILITY($J,"DIT",DIT1)) Q:DIT1=""  S DIT2="" F K=0:0 Q:$D(DTOUT)  S DIT2=$O(^UTILITY($J,"DIT",DIT1,DIT2)) Q:DIT2=""  S X(0)=^(DIT2,0),%=$P(X(0),U,3) I %,DDEF'=% D EACH
 W !!,?2,"NOTE: Multiples will be merged into the target record"
 K DIT1,DIT2 Q
EACH ;
 I DIACT="S" G SUMEACH
 S DIE=DFF(1),DA=$P(DIT(DDEF),","),X2=$S($D(^UTILITY($J,"DITI",DIT1,DIT2,%)):^(%),'$D(^UTILITY($J,"DIT",DIT1,DIT2,%)):"@",1:^(%))
 S DR=+X(0)_"///"_X2 D ^DIE W "."
 K DR,DIE Q
SUMHD ;
 W @IOF,!,"SUMMARY OF MODIFICATIONS TO ",$P(DHD(DFL),U,DDEF),!,"FIELD",?DV,$S(DDEF=1:"OLD",1:"NEW")," VALUE",?(DV*2),$S(DDEF=1:"NEW",1:"OLD")," VALUE",!,DDSH
 Q
SUMEACH ;
 I $Y+5>IOSL K DIR S DIR(0)="E" D ^DIR K DIR Q:$D(DIRUT)  D SUMHD
 K D S X2="",X(0)=$P(X(0),U,2) F I=1:1:2 S X(I)=$S($D(^UTILITY($J,"DIT",DIT1,DIT2,I)):^(I),1:"")
 D D20^DITC2
 Q

DITCP
DITCP ;MSC/GFT - Namespace/UCI comparer run code ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(DI1,DI2,DIDD,DIFLAG,DITCPT) ; Main Entry Point
 ;DI1 & DI2 are left & right roots
 ;DIFLAG[1 -->compare files   [2-->compare entries   ["L" --> IGNORE EXTRA ENTRIES ON RIGHT SIDE
 ;DITCPT is array of TITLES, called by reference
N I '$D(@DI1),'$D(@DI2) Q
 N I,DIR,DID,W,DIL,DIN1,DIN2,DIV1,DIV2,DIGL,DIDDN,DIO,DIV,DIT,DIOX,DITM,DIN,D1,D2
 K DIRUT
 S DIL=+DIFLAG
 I '$D(DITCPT(1)),$G(DITCPT)'>DIL D
 .I DIDD S DITCPT(1)="ENTRIES IN FILE #"_DIDD_" ("_$P($G(^DIC(DIDD,0)),U)_")"
 .E  S X="" D  S DITCPT(1)="DATA DICTIONARY #"_$QS(DI2,1)_" ("_X_")"
 ..S I=$NA(@DI1,1) I '$D(@I@(0,"NM")) S I=$NA(@DI2,1)
 ..F  S X=X_$O(@I@(0,"NM",0)) Q:'$D(@I@(0,"UP"))  S X=X_" SUBFIELD" Q
 ;
KILL S DIV=$D(^DD(DIDD,.001)),(DIOX,U)="^",IOM=$G(IOM,80) F  S X=$O(^UTILITY("DITCP",$J,DIL)) Q:$D(DIRUT)!'X  K ^(X)
 I '$D(@DI1) D  Q
 .S D1="{Missing}" I '$D(@DI2) S D2="{Also Missing}" D WB Q
 .I DIL#2 S D2="" D WB Q
 .S DIN2=$QS(DI2,$QL(DI2)),DIGL=0,DIN=1 D RIGHT(DI2)
 I '$D(@DI2) D  Q
 .I DIL#2 S D1="",D2="{Missing}" D WB Q
 .S DIGL=0,DIN=1,^UTILITY("DITCP",$J,"X1",DIDD,$QS(DI1,$QL(DI1)))=$P(@DI1@(0),U) G END
 I 'DIDD,DIL=1 D
 .N P,DITCPL F X=1,2 S Y=@("DI"_X),P=1,%="" D  S P(X)=P-1
 ..F  S %=$O(@Y@(0,"ID",%)) Q:%=""  S A=$S(+%=%:%,1:+$P(%,"WDI",2)) S:$D(@Y@(A,0))=1 DITCPL(X,P)=$S(A:$P($G(@Y@(A,0)),U),1:%_" (Display only)"),P=P+1
 .I DIFLAG'["L"!$D(DITCPL(1)) D DITCPL("IDENTIFIERS")
 .F P="DIC","ACT" K DITCPL M DITCPL(1,1)=@DI1@(0,P),DITCPL(2,1)=@DI2@(0,P) I DIFLAG'["L"!$D(DITCPL(1)) D DITCPL($S(P="DIC":"SPECIAL LOOKUP",1:"POST-SELECTION ACTION"))
S I DIL#2 S DIN1=$O(@DI1@(0)) K ^UTILITY("DITCP",$J,DIL) G ENTRY  ;WE ARE AT ROOT OF A (SUB)-FILE  FIND 1ST ENTRY ON LEFT SIDE
 S (DIN1,DIN2)=-1
 I DIL'<DIFLAG D  ;Build a header for this Entry
 .N D,O S D=$G(DIDD(DIL),DIDD),O=$G(@DI2@(0)) I D-.1 S O=$P(O,U,1,D=.11+1) ;For INDEX, take FILE + NAME field
 .I 'D S O="FIELD: "_O
ENTRYNAM .E  S O=$O(^DD(D,0,"NM",0))_": "_$$EXT(O,.01,2) I D=.4!(D=.401)!(D=.402) S D=$P($G(@DI1@(0)),U,4) S:D O=O_" (File "_D_")"
 .I DIV S O=O_" (#"_$QS(DI2,$QL(DI2))_")"
 .S DITCPT(DIL)=O
 G INPUT:DIDD=.402,SORT:DIDD=.401,PRINT:DIDD=.4
GET2D S DIN1=$O(@DI1@(DIN1)),DIN2=$O(@DI2@(DIN2))
 ;NOW CHECK IF WE'RE AT THE SAME NODE ON BOTH SIDES
NEXTD G END:$D(DIRUT) I DIN1=DIN2 G UP:DIN1="",D2:$D(@DI2@(DIN2))>9 S DIV2=@DI2@(DIN2),DIV1=@DI1@(DIN1) G GET2D:DIV2=DIV1 S DIN="",DIGL=DIN1 D  G GET2D
 .F  S DIN=$O(^DD(DIDD,"GL",DIGL,DIN)) Q:DIN=""  D
 ..I 'DIN S %X=+$E(DIN,2,9),%Y=$P(DIN,",",2),D2=$E(DIV2,%X,%Y),D1=$E(DIV1,%X,%Y)
 ..E  S D1=$P(DIV1,U,DIN),D2=$P(DIV2,U,DIN) I DIN=2 S:DIDD=0 D1=$TR(D1,"a"),D2=$TR(D2,"a") I DIDD=.4031 D BLOCK(D1) ;SPECIFIER OR HEADER BLOCK
 ..I D1'=D2 D:D1]""!(DIFLAG'["L") DIO12($$TITLE) Q
 .I DIGL=0,'DIDD S D1=$P(DIV1,U,5,99),D2=$P(DIV2,U,5,99) Q:D1=D2  D DIO12($S($P(DIV1,U,2)["C":"COMPUTED EXPRESSION",1:"INPUT TRANSFORM")) Q
 D X G END:$D(DIRUT),NEXTD
 ;
D2 G ENTRY:DIL#2 S Y=$O(^DD(DIDD,"GL",DIN1,0,0)) ;DOWN TO A MULTIPLE FIELD
 I Y,$D(^DD(DIDD,+Y,0)) S Y=$P(^(0),U,2) I Y]"",Y-.15,$D(^DD(+Y,.01,0)) G WP:$P(^(0),U,2)["W" D DN S DIDD=+Y G S
 G GET2D
 ;
WP S X=$P(^(0),U),%Y=0
 F %X=0:0 S %X=$O(@DI1@(DIN1,%X)) Q:$D(^(+%X,0))[0  S I=^(0),%Y=$O(@DI2@(DIN2,%Y)) G WPD:$G(^(+%Y,0))'=I ;IS EVERY LINE IDENTICAL?
 G GET2D:'$O(@DI2@(DIN2,%Y))
WPD D SUBHD W !?IOM-$L(X)\2,X,"..."
 G GET2D
 ;
 ;
 ;
 ;
ENTRY S DIGL=0,DIN=1 G NEXTENT:'$D(@DI1@(+DIN1,0)) S X=$P(^(0),U) I DIDD=.11,$G(DITCPIF),DITCPIF-X G NEXTENT ;Skip INDEXes not for this DD
 I DIDD=.4032 D  D BLOCK(X) G NEXTENT
 .N V S V=$$EXT(X,.01,1) I V]"" S V=$O(@($$NS(2)_"DIST(.404,""B"",V,0)")) I V S X=V
 .S ^UTILITY("DITCP",$J,DIL,X)=""
 S DIV=$D(^DD(DIDD,.001)) G UP:DIDD=.4032!(DIDD=19.01) ;for now, give up matching BLOCKS or MENUS
 I DIDD=.1 S DIN2=+DIN1,X=@DI1@(DIN1,0) G NEW:'$D(@DI2@(DIN2,0)),NEW:^(0)'=X,OLD ;CROSS-REFERENCE matches on entire 0 node
BIX I $P($G(@DI2@(DIN1,0)),U)=X S DIN2=DIN1 G OLD:$$MATCH,NEW:DIV
 I $P(^DD(DIDD,.01,0),U,2)["P" S MSCP=$$EXT(X,.01,1) F DIN2=0:0 S DIN2=$O(@DI2@(DIN2)) G NEW:DIN2'>0  I $$EXT($P($G(^(DIN2,0)),U),2)=MSCP G OLD:$$MATCH
 S DIN2=0 I '$D(^DD(DIDD,0,"IX","B",DIDD,.01)) F  S DIN2=$O(@DI2@(DIN2)) G NEW:DIN2'>0 I $P($G(^(DIN2,0)),U)=X G OLD:$$MATCH
BI S DIN2=$O(@DI2@("B",X,DIN2)) G NMATCH:DIN2,NEW:$L(X)<31 F  S DIN2=$O(@DI2@("B",$E(X,1,30),DIN2)) G NEW:'DIN2 I $D(@DI2@(DIN2,0)),$P(^(0),X)="",$$MATCH G OLD
NMATCH I $D(@DI2@(DIN2,0)),$P(^(0),X)="" G OLD:$$MATCH ;COMPARE BY NAME
 G BI
 ;
NEW S ^UTILITY("DITCP",$J,"X1",DIDD,DIN1)=X ;WILL SHOW EXTRA ENTRY ON LEFT SIDE
NEXTENT S DIN1=$O(@DI1@(DIN1))
N2 I DIN1 G ENTRY
 I DIFLAG'["L" F DIN2=0:0 S DIN2=$O(@DI2@(DIN2)) Q:'DIN2  Q:+DIN2'=DIN2  D  Q:$D(DIRUT)  ;Print extras on right
 .I '$D(^UTILITY("DITCP",$J,DIL,DIN2)) D RIGHT($NA(@DI2@(DIN2)))
 G END:$D(DIRUT),UP
 ; 
RIGHT(X) Q:'$D(@X@(0))#2  I DIDD=.11,$G(DITCPIF),DITCPIF-^(0) Q
 D XTRAM($P(^(0),U,1,$S(DIDD=.1:99,1:1)),2) Q  ;If X-REF, compare entire node
 ;
XTRAM(DID,X) Q:DIDD=.15  ;FORGET TRIGGERED-BY
 F I=DIL+(DIL#2):1 K DITCPT(I) I $O(DITCPT(I))="" Q
 I DIDD=.11 S DID="@DI"_X_"@(DIN"_X_",0)",DID=$P(@DID,U,2,3)
 S DIDDN=$S(DIDD:$O(^DD(DIDD,0,"NM","")),1:"FIELD")_$S(DIV:" #"_@("DIN"_X),$D(^DIC(DIDD)):"",1:" Multiple")_": ",Y=^DD(DIDD,.01,0) D DIT,DIO
 Q
 ;
 ;
 ;
 ;
MATCH() I DIV,DIN1'=DIN2 Q 0 ;DO ENTRIES MATCH?  NOT IF NUMBERS DON'T AND IT'S NUMBER-MEANINGFUL
 I $D(^UTILITY("DITCP",$J,DIL,DIN2)) Q 0 ;We already matched this one
 I DIDD=.11 Q '$$MISMATCH(.02) ;INDEX must match on NAME
 I DIDD=.403 Q '$$MISMATCH(7) ;FORM must match on PRIMARY FILE
 I DIDD=.4!(DIDD=.401)!(DIDD=.402) Q '$$MISMATCH(4) ;TEMPLATES must match on FILE
 I DIDD=19 Q 1 ;OPTION matches on NAME alone
 S DITM=.01
ID S DITM=$O(^DD(DIDD,0,"ID",DITM)) I DITM="" Q 1
 S I=DITM S:I?1"W"1.NP I=$E(I,2,99) I $$MISMATCH(I) Q 0 ;MATCH EACH NON-NULL IDENTIFIER
 G ID
 ;
MISMATCH(I) K B S A=$P($G(^DD(DIDD,I,0)),U,2) I A=""!(A["V") Q 0 ;DON'T TRY TO MATCH POINTERS
 I A["P" S A=+$P(A,"P",2) I '$D(^DD(A,.001)) Q 0
 D  Q:W="" 0 S B=W Q:'$D(^DD(DIDD,I,0)) 0 D  Q:W="" 0 Q W'=B ;If two non-null values aren't equal it's a mismatch
 .S A=$P(^(0),U,4),%=$P(A,";",2),W=$P(A,";"),A=$S($D(B):DI2,1:DI1) I W?." " S W="" Q
 .I $D(@A@($S($D(B):DIN2,1:DIN1),W))[0 S W="" Q
 .I % S W=$P(^(W),U,%)
 .E  S W=$E(^(W),+$E(%,2,9),$P(%,",",2))
 .S:W?.E1L.E W=$$UP^DILIBF(W)
 ;
OLD S ^UTILITY("DITCP",$J,DIL,DIN2)="" ;Remember that we found DIN2 as a match
 D DN G S
 ;
 ;
DN S DIDD(DIL)=DIDD
 N X,%X F X=1,2 S %X=@("DIN"_X),(W,W(X,DIL))=@("DI"_X),W=$NA(@W@(%X)),@("DI"_X)=W  ;ADD A SUBSCRIPT
 S DIL=DIL+1 Q
 ;
UP ;
 G END:'$D(W(2,DIL-1))
 S DIN1=$O(@DI1) I DIL#2=0 S:$G(DITCPT)>DIL DITCPT=DIL D U G N2
 D LEFT Q:$D(DIRUT)  S DIN2=$O(@DI2),DIDD=DIDD(DIL-1)
 D U G NEXTD
U S (DIL,Y)=DIL-1,DI1=W(1,Y),DI2=W(2,Y)
 Q
 ;
 ;
2 ;
X G XTRA1:DIN2="",XTRA2:DIN1="" I +DIN1=DIN1 G XTRA1:+DIN2'=DIN2!(DIN2>DIN1),XTRA2
 G XTRA2:+DIN2=DIN2!(DIN1]DIN2)
XTRA1 S X=1,DIGL=DIN1
 D XTRA S DIN1=$O(@DI1@(DIN1)) Q
XTRA2 S X=2,DIGL=DIN2 D:DIFLAG'["L" XTRA S DIN2=$O(@DI2@(DIN2)) Q
 ;
XTRA S DIR="@DI"_X_"@(DIGL)" I $D(@DIR)<9 S DIN="",DIV=@DIR G GL
 S I=$O(^(DIGL,0)) Q:'I  S I=$O(^(I)),DIN=$O(^DD(DIDD,"GL",DIGL,0,0)) Q:$D(^DD(DIDD,+DIN,0))[0
 S DIDDN=$P(^(0),U)_$S($P(^DD(+$P(^(0),U,2),.01,0),U,2)["W":"...",1:" Multiple"_$E("s",I>0)),(DID,DIT)="" D DIO S DIOX=0 Q
 ;
GL S DIN=$O(^DD(DIDD,"GL",DIGL,DIN)) Q:DIN=""  S Y=$O(^(DIN,0)) G GL:'$D(^DD(DIDD,+Y,0)) S DIO=$P(^(0),U)_": "
 I DIN S DID=$P(DIV,U,DIN) G:DID="" GL:$P(DIV,U,DIN,999)]"",Q
 E  S DID=$E(DIV,+$E(DIN,2,9),$P(DIN,",",2)) Q:DID?." "
 S DIDDN=$$TITLE G GL:DIDDN="" S DIDDN=DIDDN_": "
 D DIO G GL:'$D(DIRUT)
END D LEFT Q:$D(DIRUT)
 I 'DIDD,DIFLAG#2 N DITCPIF,DIDD D  G ENTRY ;INDEXES for File #DITCPIF
 .S DITCPIF=$QS(DI1,1),DIDD=.11,DI1=$NA(@DI1,0)_"(""IX"")",DI2=$NA(@DI2,0)_"(""IX"")",(DIN1,DIN2)=0
Q Q
 ;
 ;
 ;
LEFT N DIN1 F DIN1=0:0 S DIN1=$O(^UTILITY("DITCP",$J,"X1",DIDD,DIN1)) Q:'DIN1  D XTRAM(^(DIN1),1) K ^UTILITY("DITCP",$J,"X1",DIDD,DIN1) Q:$D(DIRUT)
 Q
 ;
 ;
 ;
TITLE() S Y=$$FLDNUM I '$D(^DD(DIDD,+Y,0)) Q "" ;decide whether this FIELD is interesting
 I $O(^(5,0)) Q "" ;Forget TRIGGERED FIELDS! (INTERESTING!)
 I DIDD=.403,Y'>5 Q ""
 I DIDD=19,DIGL\1=99!(Y=3.6) Q ""
 I 'DIDD,Y=50!(DIGL="DT")!(DIGL=8)!(DIGL=8.5)!(DIGL=9)!(Y=1.1) Q ""
 I 'DIDD,Y=.3,$G(DIV1)[":" Q "SET OF CODES" ;INSTEAD OF "POINTER"
 S Y=^DD(DIDD,+Y,0) D DIT Q $P(Y,U)
 ;
FLDNUM() I DIN]"" Q $O(^DD(DIDD,"GL",DIGL,DIN,0))
 Q .01
 ;
DIT ;
 S DIT=$P(Y,U,2),I=$P(Y,U,3) Q
 ;
EXT(X,C,MSCSIDE) I X]"" N Y I C S C=$P($G(^DD(DIDD,C,0)),U,2),Y=X D:$G(MSCSIDE)  D S^DIQ I Y]"" Q Y ;101.41 BOMBED IN $$EXTERNAL^DIDU(DIDD,$$FLDNUM,,X)
 .F  Q:C'["P"  Q:'$D(@($$NS(MSCSIDE)_$P(^(0),U,3)_"0)"))  S C=$P(^(0),U,2) Q:'$D(^(+Y,0))  S Y=$P(^(0),U),C=$P($G(^DD(+C,.01,0)),U,2)
 Q X
 ;
NS(MSCSIDE) N N S N=@("DI"_MSCSIDE) I $E(N,2)="[" Q $E(N,1,$F(N,"]")-1) ;returns "^" OR "^[NS]"
 Q U
 ;
DIO ;X=1 MEANS LEFT SIDE, X=2 MEANS RIGHT SIDE
 ;DID=WHAT WE HAVE TO PRINT
 S DIOX=$Y D SUBHD Q:$D(DIRUT)  S DIO=DIDDN_$$EXT(DID,$$FLDNUM,X)
O ;DIO IS OUTPUT
 I X=1 S DIOX(1)=DIDDN D LF
 Q:$D(DIRUT)
 I X=2 D:$S(DIOX-1:1,'$D(DIOX(1)):1,1:$P(DIO,DIOX(1))]"") LF Q:$D(DIRUT)  W ?IOM\2 K DIOX(1)
 W $J("",DIL),$E(DIO,1,IOM\2-DIL-1) S DIO=$E(DIO,IOM\2-DIL,999) I $L(DIO)<$S(X=1:17,X=2:2) W DIO S DIOX=X Q  ;WRITE A LITTLE MORE THAN HALF A LINE
 S DIOX=0 G O
 ;
 ;
DIO12(T) ;WRITE D1 AND D2 SIDE BY SIDE
 N D,V
 Q:D1=D2!(T="") 
 F D=1,2 D
 .S V="D"_D Q:@V=""
 .S @V=T_": "_$$EXT(@V,$$FLDNUM,D)
 Q:D1=D2  ;EXTERNAL VERSIONS MAY BE SAME
WB D SUBHD
 F  Q:D1=""&(D2="")  D LF Q:$D(DIRUT)  F D=1,2 S X="D"_D W:D=2 ?IOM\2 W $J("",DIL),$E(@X,1,IOM\2-DIL-1) S @X=$E(@X,IOM\2-DIL,999)
 Q
 ;
 ;
SUBHD ;
 N Y,L S Y=$O(DITCPT("")) Q:Y=""
 I $G(DITCPT) S L=DITCPT
 E  S L=Y F Y=$G(DIL):-1:Y D LF G Q:$D(DIRUT)
 F  Q:L>$G(DIL)!$D(DIRUT)  D LF Q:$D(DIRUT)  W:$D(DITCPT(L)) ?IOM-$L(DITCPT(L))\2,DITCPT(L) S L=L+1
 K DITCPT S DITCPT=L-1 Q  ;REMEMBER HOW DEEP WE WERE AT LAST OUTPUT
 ;
 ;
LF W ! Q:$Y+3<IOSL!$D(DIRUT)
 D:$E($G(IOST),1,2)="C-"
 .N DIR,X,Y
 .S DIR(0)="E" W ! D ^DIR S $Y=0
 I '$D(DIRUT) W @IOF
 Q
 ;
INPUT I $T(GET^DIETED)="" Q
 N DITCPL F DITCPL=1,2 D GET^DIETED($NA(DITCPL(DITCPL)),@("DI"_DITCPL))
 D DITCPL("EDIT FIELDS") G UP
 ;
SORT  I $T(GET^DIBTED)="" Q
 N DITCPL,DHD,DIBTA,DIBT0,MSCS F DITCPL=1,2 D
 .S DIBTA=$NA(DITCPL(DITCPL))
 .S DIBT0=-(DITCPL/10+$J) K ^DIBT(DIBT0) M ^DIBT(DIBT0)=@("@DI"_DITCPL),MSCS(DITCPL)=^DIBT(DIBT0,"O") ;GRAB SORT TEMPLATES INTO NEGATIVELY-NUMBERED ^DIBT NODE!
 .D GET^DIBTED(DIBTA) K ^DIBT(DIBT0)
 D DITCPL("SORT FIELDS")
 K DITCPL M DITCPL=MSCS D DITCPL("SEARCH SPECIFICATIONS")
 G UP
 ;
PRINT I $T(GET^DIPTED)'["," Q
 N DITCPL,DISH,DHD F DITCPL=1,2 D GET^DIPTED($NA(DITCPL(DITCPL)),@("DI"_DITCPL))
 D DITCPL("PRINT FIELDS") G UP
 ;
DITCPL(H) D EN^DITCPL("DITCPL(1)","DITCPL(2)",H)
 Q
 ;
BLOCK(X) N D S D=DIL+(DIL#2=0)+1 N DIL S DIL=D,DIDD(DIL)=DIDD S:$G(DITCPT)>2 DITCPT=2 D E(.404,$P($G(^DIST(.404,+X,0)),U)) ;compare ScreenMan BLOCKs
 Q
E(XPDI,NAME,DIFL) N X,N,MSC,S Q:NAME=""!'XPDI
 S MSCF=$G(^DIC(XPDI,0,"GL")) Q:MSCF'?1"^".E  S MSCF=$E($$CREF^DILF(MSCF),2,99)
 F X=1,2 S N=$$NS(X)_MSCF D  S:'S S=-999 S MSC(X)=$NA(@N@(S))
 .F S=0:0 S S=$O(@N@("B",NAME,S)) Q:'S  Q:'$G(DIFL)  Q:XPDI<.4!(XPDI>.402)  Q:$P($G(@N@(S,0)),U,4)=DIFL  ;TEMPLATE FILE# MUST MATCH
 D EN(MSC(1),MSC(2),XPDI,$G(DIL,2),.DITCPT)
 Q
 ;
 ;
UCI ;
 G ^DITCP0

DITCP0
DITCP0 ; /GFT - COMPARE ACROSS UCI's, OR COMPARE TWO ENTRIES ; 24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ;
 ;
UCI ;Compare across UCI's  FILEMAN OPTION 9, SUBOPTION 3
 N DITCPI,DIC,DIR,DITCPUCI,DIRUT,DIB,DITCPT
 S Y=$$WUCI Q:Y=""  D DT^DICRW,L^DICRW1 Q:'$D(DIC)
 S DITCPI=+Y,DIR(0)="F^1:90",DIR("A")="Compare to what UCI",DIR("B")=$G(^DOPT("DITCPUCI",DUZ)) D ^DIR
 D:'$D(DISYS) OS^DII
 Q:U[X  X ^DD("OS",DISYS,"UCICHECK") Q:0[Y  S ^DOPT("DITCPUCI",DUZ)=X,DITCPUCI=X
 K DIR S DIR(0)="S^1:DATA DICTIONARY ONLY;2:FILE ENTRIES ONLY;3:DATA DICTIONARY AND FILE ENTRIES",DIR("B")=3 D ^DIR
 Q:U[X  S DIB=Y
 D START Q:IO=""
 S DIR=DITCPI
DD K DITCPT
 I DIB#2 D EN^DITCP("^DD("_DITCPI_")","^["""_DITCPUCI_"""]DD("_DITCPI_")",0,1,.DITCPT) F X=0:0 S X=$O(^DD(DITCPI,"SB",X)) Q:'X  S DITCPI(X)=""
 I '$D(DIRUT) S DITCPI=$O(DITCPI(0)) I DITCPI K DITCPI(DITCPI) G DD
FILES S X=$G(DITCPT) K DITCPT S DITCPT=X
 I '$D(DIRUT),DIB>1,$D(^DIC(DIR)) S X=$$CREF^DILF(^DIC(DIR,0,"GL")) D EN^DITCP(X,"^["""_DITCPUCI_"""]"_$P(X,U,2,9),DIR,1,.DITCPT)
 I '$D(DIRUT) S DIR=$O(^DIC(DIR)) I DIR,DIR'>DIB(1) K DITCPI S DITCPI=DIR G DD
C G CLOSE^DIO4
 ;
 ;
 ;
 ;
 ;
ENTRIES ;Compare entries in a File
 N D1,D2,DIRUT,DITCP
 I $D(DIU) S DIC=DIU
 E  D R^DICRW Q:'$D(DIC)
 S DIC(0)="AEQM" D ^DIC Q:Y<0  S DITCP=+Y,DIC("A")="Select a SECOND: ",DIC("S")="I Y-"_+Y D ^DIC K DIC("S"),DIC("A") Q:Y<0
 S D1=DIC_DITCP_")",D2=DIC_+Y_")",DIDD=+$P(@(DIC_"0)"),U,2)
 D START Q:IO=""
 D EN^DITCP(D1,D2,DIDD,"2N")
 G C
 ;
 ;
 ;
START ;
 W !,"DISPLAY COMPARISON ON" K %ZIS D ^%ZIS K POP Q:IO=""  U IO
 D DT^DICRW S Y=DT D DD^%DT W !,Y I $D(^DD("SITE")) W ?14,^("SITE") S Y=$$WUCI
 I $D(DITCPUCI) S %=$L(DITCPUCI) W ?$S(IOM\2>%:IOM\2,1:IOM-%),"UCI: "_DITCPUCI
 W ! F %=1:1:IOM W "-"
 Q
 ;
WUCI() ;
 N Y I ^DD("OS")=19!(^DD("OS")=17) X "S Y=$ZGD" ;GTM GLOBAL DIRECTORY
 E  I $D(^%ZOSF("UCI"))#2 X ^("UCI")
 I $D(Y) W !?2,"UCI: "_Y Q Y
 Q ""

DITCPL
DITCPL ;MSC/GFT;COMPARE TWO LISTS, LEFT/RIGHT;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;CALLED BY ^%, ^DITCP AND ^XPDCOM
EN(LEFT,RIGHT,HEADER) ; Main Entry Point
 N WINDOW S WINDOW=30 ;HOW FAR TO LOOK AHEAD
 N SHORT S SHORT=7 ;SHORTEST LINE LENGTH TO COMPARE
 N DI S DI(1)=LEFT,DI(2)=RIGHT
 N H S H=2
 N L1,L2,E1,E2,C,S,V1,V2,X,Z,Y,I,G,J,K,L,IFN,IFE,IFP
 S E1=$O(@DI(1)@(""),-1),E2=$O(@DI(2)@(""),-1) ;FIND BOTTOM OF ARRAYS TO BE COMPARED
 S S="",C=IOM-2/2\1,(L1,L2)=0
D S L1=L1+1,L2=L2+1 I L1>E1!(L2>E2) D  Q  ;Grab two new lines.  If we can't WE'RE AT END
 .F I=L2:1:E2 S X=$$GET(2,I),Z=1,G=I D W2(1)
 .F I=L1:1:E1 S X=$$GET(1,I),Z=1,G=I D W1
 G:$$GET(1,L1)=$$GET(2,L2) D  ;If lines are equal, go get two more
 S V1=$$GET(1,L1),(IFE,IFP,IFN)=""
 F I=L2:1:L2+WINDOW Q:I>E2  S V2=$$GET(2,I) D PARTIAL G D:IFE Q:IFN  ;MOVE DOWN RIGHT SIDE TO FIND MATCH FOR 'V1'
 I $$GET(1,L1+1)=$$GET(2,L2+1),$$GET(1,L1+2)=$$GET(2,L2+2)!($L($$GET(1,L1))>SHORT) D SBS(L1,L2) G D
 S Z=1,G=L1,X=V1 D W1 S L2=L2-1 G D
 ;
GET(RL,LINE) ;RETURNS RIGHT OR LEFT LINE
 I $D(@DI(RL)@(LINE))=1 Q $$STRIP(@DI(RL)@(LINE))
 I $D(@DI(RL)@(LINE,0)) Q $$STRIP(@DI(RL)@(LINE,0)_$G(@DI(RL)@(LINE,"OVF",1)))
 Q ""
STRIP(X) ;F  Q:X'?.E1" "  S X=$E(X,1,$L(X)-1) ;Take off trailing spaces
 Q X
 ;
PARTIAL F K=1:5:26 Q:$L($E(V2,K,K+10))<SHORT  I $F(V1,$E(V2,K,K+10)) S IFP=1 G E1
 Q
E1 ;Go down to line I on rt side
 D HEAD
 F J=L2:1:I S X=$$GET(2,J) I X'?.P,$L(X)'<SHORT F Y=L1+1:1:$S(L1+WINDOW<E1:L1+WINDOW,1:E1) I $$GET(1,Y)=X S IFN=1 G Q  ;Look down on the left side!
 F L2=L2:1 Q:L2=I  S X=$$GET(2,L2),Z=1,G=L2 D W2(1) ;Write out extras on RIGHT
 S:V1=V2 IFE=1 D:'IFE SBS(L1,L2)
Q Q
 ;
 ;
SBS(L1,L2) ;SIDE BY SIDE PRINT
 N S1,S2
 S S1=$$GET(1,L1),S2=$$GET(2,L2),Z=1,L=0
 F K=1:1 S X=$E(S1,1,C-5) S:K=1 G=L1 D W1 S Y=X,X=$E(S2,1,C-5) S:K=1 G=L2,Z=1 D W2(0) S S1=$E(S1,C-4,255),S2=$E(S2,C-4,255) D:X'=Y&$D(S)&(L=0)  I $L(S1)+$L(S2)=0 S IFE=1 Q
 .F L=1:1:$L(X) I $E(X,L)'=$E(Y,L) W !?L+3,"^",?L+C+4,"^" Q
 Q
 ;
 ;
W1 ;WRITE LEFT SIDE, line G
 D HEAD F  W ! Q:'$L(X)  W $S(Z:$J(G,3),1:"   "),"{",$E(X,1,C-5),$C(125) S Z=0 Q:$L(X)<(C-4)  S X=$E(X,C-4,999)
 Q
 ;
W2(DITCPLLF) ;WRITE RIGHT SIDE, line G
 D HEAD F  W:DITCPLLF ! Q:'$L(X)  W ?C+1 W $S(Z:$J(G,3),1:"   "),"{",$E(X,1,C-5),$C(125) S Z=0 Q:$L(X)<(C-4)  S X=$E(X,C-4,999)
 Q
 ;
HEAD ;If we haven't written subheader, do so
 S:H=2 H=0 Q:H'=0  D SUBHD^DITCP W !,?IOM-$L(HEADER)\2,HEADER S H=1
 Q

DITM
DITM ;SFISC/JCM(OHPRD)-FILE COMPARE AND MERGE DRIVER ;6/8/94  14:21
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
START ;
 D ASK ; Asks file, from, to, merge ,etc.
 G:$D(DITM("QFLG")) END
 D ^DITM2
END D EOJ ;----------->Cleanup
 Q  ;-------------->End of routine
 ;--------------------------------------------------------------------
 ;
ASK ;
 D ASKX
 K DITM,%H,DSUB,DMSG,DTO,DFL,DNUM,DDON
 K D001,DHD,^UTILITY($J,"DIT")
 K DITM("QFLG")
 D T^DICRW
 I Y<0 S DITM("QFLG")="" G ASKX
 S (DSUB,DIT,L)=0,DSUB(L)=DIC,DITC=1
 D ^DITM1
 G:$D(DITM("QFLG")) ASKX
 G:'$D(DITM("DFF")) ASK
Q1 ;
 W ! K DIR
 D BLD^DIALOG(8086,"","","DIR(""A"")"),BLD^DIALOG(9041,"","","DIR(""?"")")
 S DIR(0)="YO",DIR("B")=$P($$EZBLD^DIALOG(7001),U,2)
 D ^DIR K DIR
 I $D(DTOUT)!($D(DUOUT)) S DITM("QFLG")="" G ASKX
 S:Y=1 DITM("DIMERGE")=1
 G:'$D(DITM("DIMERGE")) Q6
 W ! F I=1,2 W !?4,I,?10,DTO(I,"X")
 K X,Y
Q2 ;
 W !
 S DIR(0)="N^1:2:0",DIR("?")="^S DMSG=3 D HELP^DITC0"
 S DIR("A",1)=" Note: Records will be merged into the entry selected for the default.",DIR("A")="WHICH ENTRY SHOULD BE USED FOR DEFAULT VALUES "
 D ^DIR K DIR
 I $D(DTOUT)!($D(DUOUT)) S DITM("QFLG")="" G ASKX
 I X'=2 S DITM("DIT(1)")=DIT(2),DITM("DIT(2)")=DIT(1)
 S DITM("DDEF")=2 W !,"   *** Records will be merged into "_DTO(X,"X"),!
 I X'=2
 K X,Y
Q3 ;
 W !
 S DIR(0)="Y"
 S DIR("A")="DO YOU WANT TO DELETE THE MERGED FROM ENTRY AFTER MERGING"
 S DIR("?")="If you enter NO the merged FROM entry will remain in this file"
 D ^DIR K DIR
 I $D(DTOUT)!($D(DUOUT)) S DITM("QFLG")="" G ASKX
 S:Y DITM("DELETE")=""
 K X,Y
 G:$D(DITM("SUB FILE")) Q6
Q4 ;
 W !
 S DIR(0)="Y"
 S DIR("A")="DO YOU WANT TO REPOINT ENTRIES POINTING TO THIS ENTRY"
 D ^DIR K DIR
 S:$D(DTOUT)!($D(DUOUT)) DITM("QFLG")=""
 G:$D(DTOUT)!($D(DUOUT)) ASKX
 S:Y DITM("REPOINT")=""
 G:'$D(DITM("REPOINT")) Q6
 K X,Y
Q5 ;
 W !
 S DIR(0)="PO^1:EMZ"
 S DIR("A")="ENTER FILE TO EXCLUDE FROM REPOINT/MERGE"
 S DIR("?")="Any file entered here will not be repointed or merged."
 F DITM=0:0 D ^DIR Q:$D(DIRUT)!(Y<1)  S DITM("EXCLUDE",+Y)=""
 K DIR
 I $D(DUOUT)!($D(DTOUT)) S DITM("QFLG")="" G ASKX
 K X,Y
Q6 ;
 W !
 S DIR(0)="YO",DIR("B")="NO"
 S DIR("A")="DO YOU WANT TO DISPLAY ONLY THE DISCREPANT FIELDS"
 S DIR("?")="^S DMSG=2 D HELP^DITC0"
 D ^DIR K DIR
 I $D(DTOUT)!($D(DUOUT)) S DITM("QFLG")="" G ASKX
 S:Y DITM("DDIF")=1
 K X,Y
ASKX ;
 K DFL,DIC,DISYS,DITC,DSUB,I,X,Y,DIPGM,DMSG,%,DIR,DIT,DFF,DTO,DDSP
 Q
EOJ ;
 K DITM,DMSG,DIRUT,L
 Q
 ;8086 NOTE: This option should be used only during non-peak hours...
 ;9041 If you merge two entries within a file that is pointed-to...
 ;7001 Yes^No

DITM1
DITM1 ;SFISC/JCM(OHPRD)-ASKS SUBFILE FOR COMPARE AND MERGE ;2/24/93  14:00
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; When subfiles work will need to delete SUB+0 and uncomment SUB+1
 ;--------------------------------------------------------------------
START ;
SUB S L=L+1,DFL(L)=$O(^DD(+Y,0,"NM","")),(DFF,DFF(L))=+Y
 ;S %=$P(Y,U,2),Y=+Y D SUB^DICRW K DIA S:Y>0 DITM("SUBFILE")=+Y
ENTR I $D(DTOUT)!(X["^") S DITM("QFLG")="" G END
 K DIC S DIC(0)="AEQMZ",DIC=DSUB(0),DFL=1,DIT=DIT+1,DIT(DIT)="" W:DIT=1 !
E1 S DIC("A")=$E("        ",1,DFL-1*3)_$S(DIT=2:"   WITH ",1:"COMPARE ")_DFL(DFL)_": " I (DIT=2),(DFL=L),($P(DIT(1),",",1,L-1)=$P(DIT(2),",",1,L-1)) S DIC("S")="I Y-"_$P(DIT(1),",",L)
 D ^DIC K DIC("S"),DIC("A") I Y>0,$D(DSUB(DFL)),$D(DFL(DFL+1)) S DIC=DIC_+Y_","_DSUB(DFL),DIT(DIT)=DIT(DIT)_+Y_",",DFL=DFL+1 S %=$O(@(DIC_""""")")) G:%'=""&'% E1 S:%>0 ^(0)=U_DFF_U I %="" W !,"NO "_DFL(DFL) S (%,Y)=-1
 S:X=U DITM("QFLG")="" G:X=U!(Y=-1) END S DTO(DIT)=DIC_+Y_",",DTO(DIT,"X")=Y(0,0),DIT(DIT)=DIT(DIT)_+Y G:DIT=1 ENTR S DDSP=1
 S DITM("DFF")=DFF,DITM("DIT(1)")=DIT(1),DITM("DIT(2)")=DIT(2)
 S DITM("DIC")=DSUB(0)
 I $D(DITM("SUB FILE")),$D(DSUB(1)) S DITM("DSUB1")=$P(DSUB(1),",",1)
END ;
 Q

DITM2
DITM2 ;SFISC/JCM(OHPRD)-DOES COMPARE AND MERGE ;11/18/94  15:42
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; See DITMDOC for documentation
 ; Subfiles are not currently supported by the call to EN^DITM2
 ; until DITC can handle them.
 ;-------------------------------------------------------------------
START ;
EN ; Entry point
 L +@(DITM("DIC")_$P(DITM("DIT(1)"),",",1)_")")
 L +@(DITM("DIC")_$P(DITM("DIT(2)"),",",1)_")")
 K DMSG,DIRUT
 D:'$D(DITM("NON-INTERACTIVE")) DITC ; --->Sets up and calls DITC
 I $D(DMSG)!($D(DIRUT)) S DITM("QFLG")="" G END
 G:'$D(DITM("DIMERGE")) END
 D:'$D(DITM("SUB FILE")) DIT0 ; --->Sets up and calls DIT0
 D:$D(DITM("REPOINT"))&('$D(DITM("SUB FILE"))) REPOINT ;---->Merges
 ;---------------->other files that affect patient merge
 G:$D(DITM("QFLG")) END
 D:$D(DITM("DELETE")) DELETE ;----->Deletes MERGED entry
END L -@(DITM("DIC")_$P(DITM("DIT(1)"),",",1)_")")
 L -@(DITM("DIC")_$P(DITM("DIT(2)"),",",1)_")")
 D EOJ ;----------->Cleanup
 Q  ;-------------->End of routine
 ;----------------------------------------------------------------------
DITC ;
 ;***Will need to add set up for subfiles when it works******
 ;
 K DFF,DIT,DIMERGE,DDIF,DDEF,DDSP
 S DFF=DITM("DFF"),DIT(1)=DITM("DIT(1)"),DIT(2)=DITM("DIT(2)"),DIC=DITM("DIC")
 S:$D(DITM("DIMERGE")) DIMERGE=1
 S:$D(DITM("DDIF")) DDIF=DITM("DDIF")
 S:$D(DITM("DDEF")) DDEF=DITM("DDEF")
 S:$D(DITM("DDSP")) DDSP=1
 D EN^DITC
 K DFF,DIT,DIMERGE,DDIF,DDEF,DDSP
 Q
DIT0 ;
 W:'$D(DITM("NOTALK")) !!,"I will now merge all subfiles in this file ...",!,"This may take some time, please be patient."
 K DA
 S (DIT("T"),DIT("F"))=DITM("DIC")
 S (D0,DA("T"))=DITM("DIT(2)"),DA("F")=DITM("DIT(1)")
 D EN^DIT0 K D0,DA,DIC,DIK,DIT
 Q
REPOINT ;
 S DITMGMQF=0
 S:$D(DITM("NON-INTERACTIVE")) DITMGMRG("NOTALK")=1
 S:$D(DITM("PACKAGE")) DITMGMRG("PACKAGE")=DITM("PACKAGE")
 W:'$D(DITM("NOTALK")) !!,"I will now repoint all files that point to this entry ...",!,"This may take some time, please be patient."
 S DITMGMRG("FILE")=DITM("DFF"),DITMGMRG("FR")=DITM("DIT(1)"),DITMGMRG("TO")=DITM("DIT(2)")
 S:$D(DITM("NOTALK")) DITMGMRG("NOTALK")=""
 I $D(DITM("EXCLUDE")) F DITMI=0:0 S DITMI=$O(DITM("EXCLUDE",DITMI)) Q:'DITMI  S DITMGMRG("EXCLUDE",DITMI)=""
 D EN^DITMGMRG
 K DITMGMRG,DITMGMQF,DITMI
 Q
DELETE ;
 W:'$D(DITM("NOTALK")) !,"Deleting From entry"
 I $D(DITM("SUB FILE")) D DELSUB G DELETEX
 S DIK=DITM("DIC"),DA=DITM("DIT(1)") D ^DIK K DA,DIK
DELETEX Q
 ;
DELSUB ;
 S DA(1)=$P(DITM("DIT(1)"),",",1),DA=$P(DITM("DIT(1)"),",",2)
 S DIK=DITM("DIC")_DA(1)_","_DITM("DSUB1")_"," D ^DIK K DA,DIK
 Q
EOJ ;
 K DITM2,APMMD,DIC,X,Y
 Q

DITMGM1
DITMGM1 ;SFISC/EDE(OHPRD)-INTERACTIVE MERGE ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
START ;
 K DITMGMRG
 S DITMGMRG("GO")=0
 S DIC=1,DIC(0)="AEMQ" D ^DIC K DIC
 Q:Y<0
 S DITMGMRG("FILE")=+Y
 S DIC=DITMGMRG("FILE"),DIC(0)="AEMQ",DIC("A")="From entry: " D ^DIC K DIC
 Q:Y<0
 S DITMGMRG("FR")=+Y
 S DIC=DITMGMRG("FILE"),DIC(0)="AEMQ",DIC("A")="To entry: " D ^DIC K DIC
 Q:Y<0
 S DITMGMRG("TO")=+Y
 I DITMGMRG("FR")=DITMGMRG("TO") W !!,"From entry same as to entry!",!,$C(7) Q
 S DIC=1,DIC(0)="AEMQ",DIC("A")="Enter file to exclude from merge: " F  D ^DIC Q:Y<1  S DITMGMRG("EXCLUDE",+Y)=""
 K DIC
 S DIR(0)="Y",DIR("A")="Exclude files in affected packages",DIR("B")="NO"
 S DIR("?",1)="This routine normally relinks/merges all files.  Do you want to exclude"
 S DIR("?")="files that are part of a package that has its own merge routine?"
 D ^DIR K DIR
 Q:$D(DIRUT)
 I Y S DITMGMRG("PACKAGE")="",DITMGMRG("GO")=1 Q
 S DIR(0)="Y",DIR("A")="Merge only files in a specific package?",DIR("B")="NO"
 S DIR("?",1)="If you say NO you will merge all files pointing to the primary file."
 S DIR("?",2)="If you say YES you will be asked for a package file entry and only"
 S DIR("?")="merge the files in that package that point to the primary file."
 D ^DIR K DIR
 Q:$D(DIRUT)
 I 'Y S DITMGMRG("GO")=1 Q
 S DIC=9.4,DIC(0)="AEMQ" D ^DIC K DIC
 Q:Y<0
 S DITMGMRG("PACKAGE")=+Y
 S DITMGMRG("GO")=1
 Q

DITMGM2
DITMGM2 ;SFISC/EDE(OHPRD)-GENERAL RELINK/MERGE ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
START ;
 D INIT^DITMGM2B
 I $D(DITMGMQF) D EOJ Q
 D FILES
 D EOJ
 Q
 ;
FILES ; PROCESS ALL FILES/SUBFILES
 W:'$D(DITMGM2("NOTALK")) !!,"Merging entries",!
 F DITMGMFL=0:0 S DITMGMFL=$O(^UTILITY("DITMGMRG",$J,DITMGMFL)) Q:DITMGMFL=""  D FILE
 Q
 ;
FILE ; PROCESS ONE FILE/SUBFILE
 K DITMGMGM
 I $D(^DD(DITMGMFL,0,"UP")) S DITMGMMU=1 D ^DITMU2(DITMGMFL,.DITMGMGM,1) S DITMGMG=$P(DITMGMGM,"DA(",1),DITMGMGM=$P(DITMGMGM,"DA,",1) I 1
 E  S DITMGMMU=0,DITMGMG=^DIC(DITMGMFL,0,"GL")
 F DITMGMFD=0:0 S DITMGMFD=$O(^UTILITY("DITMGMRG",$J,DITMGMFL,DITMGMFD)) Q:DITMGMFD'=+DITMGMFD  S DITMGMFS=DITMGMF,DITMGMTS=DITMGMT D FIELD^DITMGM2A S DITMGMF=DITMGMFS,DITMGMT=DITMGMTS
 Q
 ;
ZTM ; ENTRY POINT FOR TASKMAN
 S DITMGM2("NOTALK")=1
 D SEARCH^DITMGM2B
 D EOJ
 Q
 ;
EOJ ;
 K %K,D1,D2,DA,DIC,DI,DIPGM,DQ,I,V
 K DITMGDA,DITMGMDI,DITMGMDN,DITMGMEC,DITMGMFD,DITMGMFL,DITMGMFG,DITMGMFS,DITMGMG,DITMGMGG,DITMGMI,DITMGML,DITMGMGM,DITMGMN,DITMGMNO,DITMGMPC,DITMGMTS,DITMGMTY,DITMGMTZ,DITMGMMU,DITMGMPF,DITMGMV,DITMGMX,DITMGMXR
 I $D(ZTQUEUED) S ZTREQ="@"
 E  K:$D(ZTSK) ^%ZTSK(ZTSK),ZTSK ; old Kernel
 Q

DITMGM2A
DITMGM2A ;SFISC/EDE(OHPRD),TKW-CONTINUATION OF ^DITMGM2 ;8MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
FIELD ; PROCESS ONE FIELD IN ONE FILE/SUBFILE
 S DITMGMPF=^UTILITY("DITMGMRG",$J,DITMGMFL,DITMGMFD)
 S DITMGMX=$P(^DD(DITMGMFL,DITMGMFD,0),U,4),DITMGMNO=$P(DITMGMX,";",1),DITMGMPC=$P(DITMGMX,";",2),DITMGMDI=$S(DITMGMFD=.01&($P(^(0),U,5,99)["DINUM"):1,1:0)
 S DITMGMV=$S($P(^DD(DITMGMFL,DITMGMFD,0),U,2)["V":1,1:0)
 I DITMGMV D
 . N % S %=$P(^DIC(DITMGMPF,0,"GL"),U,2) I %["""" S %=$$CONVQQ^DILIBF(%)
 . S DITMGMF=DITMGMF_";"_%,DITMGMT=DITMGMT_";"_% Q
 S DITMGMXR="",DITMGMX=0 F DITMGML=0:0 S DITMGMX=$O(^DD(DITMGMFL,DITMGMFD,1,DITMGMX)) Q:DITMGMX'=+DITMGMX  D  Q:DITMGMXR'=""
 . S DITMGMXR=$P(^(DITMGMX,0),U,2),DITMGMTY=$P(^(0),U,3),DITMGMTZ=$P(^(0),U,1)
 . I DITMGMTY="",'DITMGMMU  Q
 . I DITMGMTY="",DITMGMMU,DITMGMFL'=DITMGMTZ,'$D(^DD(DITMGMTZ,0,"UP")) Q
 . S DITMGMXR=""
 . Q
 K DA I DITMGMXR="" D NOXREF Q
 Q:'$D(@(DITMGMG_""""_DITMGMXR_""","""_DITMGMF_""")"))
 S DITMGMN="" F DITMGML=0:0 S DITMGMN=$O(@(DITMGMG_""""_DITMGMXR_""","""_DITMGMF_""",DITMGMN)")) Q:DITMGMN=""  D ENTRY:'DITMGMMU,MULTIPLE:DITMGMMU
 Q
 ;
MULTIPLE ; MULTIPLE WITH XREF TO FILE
 N DIXR,DICNT,DIDA,DIEND,DITMGZZZ
 S DITMGZZZ=DITMGMN,(DICNT,DIEND)=+$P(DITMGMGM,"DA(",2),DIDA(DICNT)=DITMGMN
 S DIXR(DICNT)=DITMGMG_""""_DITMGMXR_""","""_DITMGMF_""","_DITMGMN_","
 S DICNT=DICNT-1
M2 I DICNT=DIEND S DITMGMN=DITMGZZZ Q
 S DIDA(DICNT)=$O(@(DIXR(DICNT+1)_+$G(DIDA(DICNT))_")"))
 I 'DIDA(DICNT) S DICNT=DICNT+1 G M2
 I DICNT=0 D  G M2
 . N DA F I=0:1:DIEND S DA(I)=DIDA(I)
 . S DA=DA(0) K DA(0)
 . N DIXR,DICNT,DIDA,DIEND D ENTRY
 . Q
 S DIXR(DICNT)=DIXR(DICNT+1)_DIDA(DICNT)_","
 S DICNT=DICNT-1 G M2
 ;
NOXREF ; FILES WITH NO REGULAR XREF ON POINTING FIELD
 I DITMGMDI,'DITMGMMU S DITMGMN=$S($D(@(DITMGMG_DITMGMF_")")):DITMGMF,1:"") D:DITMGMN ENTRY Q  ; If DINUM file xref not needed
 I '$D(@(DITMGMG_"0)")) W:'$D(DITMGM2("NOTALK")) !,"No Data Global:  ",DITMGMG Q
IHS D SEARCH Q  ;WON'T FALL THRU
 W:'$D(DITMGM2("NOTALK")) !,"No REGULAR xref on ",DITMGMFL,",",DITMGMFD," Merging entries for this file will",!,"now occur via Taskman in background!"
 ; SETUP CALL TO TASKMAN
 K DITMGMZT S:$D(ZTSK) DITMGMZT=ZTSK
 K ZTSAVE F %="DITMGMG","DITMGMGM","DITMGMNO","DITMGMPC","DITMGMF","DITMGMT","DITMGMFL","DITMGMFD","DITMGMDI","DITMGMXR","DITMGMMU","DITMGMV" S ZTSAVE(%)=""
 S ZTRTN="ZTM^DITMGM2",ZTDESC="PROCESS POINTER FIELD #"_DITMGMFD_" IN FILE #"_DITMGMFL_" FROM "_DITMGMF_" TO "_DITMGMT
 S ZTIO="",ZTDTH=DT D ^%ZTLOAD K ZTSK
 S:$D(DITMGMZT) ZTSK=DITMGMZT
 K DITMGMZT
 Q
 ;
SEARCH ; $O THRU DATA GBL
 D SEARCH^DITMGM2B
 Q
 ;
ENTRY ; PROCESS ONE FILE/SUBFILE ENTRY
 D ENTRY^DITMGM2B
 Q
QUOTES ;
 N %P,%Q S %W1="",%Q="""" F %P=1:1:$L(%W,%Q)-1 S %W1=%W1_$P(%W,%Q,%P)_%Q_%Q
 S %W1=%W1_$P(%W,%Q,$L(%W,%Q))
 Q

DITMGM2B
DITMGM2B ;SFISC/EDE(OHPRD),TKW-CONTINUATION OF DITMGM2 ;4/7/94  10:09
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
SEARCH ; $O THRU DATA GBL
 Q:'$O(@(DITMGMG_"0)"))
 W:'$D(DITMGM2("NOTALK")) !,"No REGULAR xref on ",DITMGMFL,",",DITMGMFD,".  ",+$P(^(0),U,4)," entries.  Searching data global."
 F DITMGMN=0:0 S DITMGMN=$O(@(DITMGMG_DITMGMN_")")) Q:DITMGMN'=+DITMGMN  D
 . I DITMGMMU D SEARCHM Q
 . I $D(^(DITMGMN,DITMGMNO)),$P(^(DITMGMNO),U,DITMGMPC)=DITMGMF D ENTRY
 . Q
 Q
 ;
SEARCHM ; $O THRU DATA GBL FOR MULTIPLES (TOP)
 S DITMGMDN=+$P(DITMGMGM,"DA(",2)
 S DA(DITMGMDN)=DITMGMN,DITMGDA(DITMGMDN)=DITMGMN
 S DITMGMGG=$P(DITMGMGM,"DA(",1)_"DA("_DITMGMDN_"),"
 S DITMGMDN=DITMGMDN-1
 NEW DITMGMN
 D SEARCHM2
 K DA,DITMGDA,DITMGMGG
 Q
 ;
SEARCHM2 ; MIDDLE (CALLED RECURSIVELY)
 I '$F(DITMGMGM,"DA("_DITMGMDN_"),") D SEARCHM3 Q
 S DITMGMGG=$P(DITMGMGM,",DA("_DITMGMDN_"),",1)_","
 F DITMGDA(DITMGMDN)=0:0 S DITMGDA(DITMGMDN)=$O(@(DITMGMGG_DITMGDA(DITMGMDN)_")")) Q:DITMGDA(DITMGMDN)'=+DITMGDA(DITMGMDN)  S DA(DITMGMDN)=DITMGDA(DITMGMDN) D SEARCHM4
 Q
 ;
SEARCHM3 ; BOTTOM
 D SETDA
 F DITMGMN=0:0 S DITMGMN=$O(@(DITMGMGM_DITMGMN_")")) Q:DITMGMN'=+DITMGMN  I $D(^(DITMGMN,DITMGMNO)),$P(^(DITMGMNO),U,DITMGMPC)=DITMGMF D ENTRY,SETDA
 Q
 ;
SETDA ; SET DA ARRAY
 K DA
 F I=1:1 Q:'$D(DITMGDA(I))  S DA(I)=DITMGDA(I)
 Q
 ;
SEARCHM4 ; RECURSE
 S DITMGMDN=DITMGMDN-1
 D SEARCHM2
 S DITMGMDN=DITMGMDN+1
 Q
 ;
ENTRY ; PROCESS ONE FILE/SUBFILE ENTRY
 D ENTRY^DITMGM2C
 Q
 ;
INIT ;
 K DITMGMQF
 K DITMGMRG("ERROR") S DITMGMEC=0
 S:$D(ZTQUEUED) DITMGM2("NOTALK")=1
 S:$D(ZTSK) DITMGM2("NOTALK")=1 ; old Kernel
 I '$D(DITMGMFL) S DITMGMQF=20 Q
 I 'DITMGMFL S DITMGMQF=20 Q
 I '$D(^DIC(DITMGMFL,0,"GL")) S DITMGMQF=20 Q
 S DITMGMFG=^("GL")
 I '$D(DITMGMF)!('$D(DITMGMT)) S DITMGMQF=21 Q
 I 'DITMGMF!('DITMGMT)!(DITMGMF=DITMGMT) S DITMGMQF=22 Q
 I '$D(@(DITMGMFG_DITMGMF_",0)")) S DITMGMQF=23 Q
 I '$D(@(DITMGMFG_DITMGMT_",0)")) S DITMGMQF=24 Q
 Q

DITMGM2C
DITMGM2C ;SFISC/EDE(OHPRD)TKW-CONTINUATION OF DITMGM2 ;10/7/98  10:38
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
ENTRY ; PROCESS ONE FILE/SUBFILE ENTRY
 ;
 W:'$D(DITMGM2("NOTALK")) "."
 I DITMGMDI D DINUM Q  ; merge dinum entries
 ;
 ; ----- Transform DITMGMT
 S DITMGM("DITMGMT")=DITMGMT
 I 'DITMGMV S DITMGMT=$S(DITMGMFD=.01:"`",1:"/")_DITMGMT I 1
 E  S X=$P(DITMGMT,";",2),DITMGMT=$P(DITMGMT,";",1),X=+$P(@("^"_X_"0)"),U,2) D  Q:X=""  S DITMGMT=X_".`"_DITMGMT
 . S X=$O(^DD(DITMGMFL,DITMGMFD,"V","B",X,0))
 . Q:X=""
 . S X=$P(^DD(DITMGMFL,DITMGMFD,"V",X,0),U,4)
 . Q
 ; -----
 ;
 I DITMGMMU D ENTRYM I 1
 E  D ENTRYS
 S DITMGMT=DITMGM("DITMGMT") K DITMGM("DITMGMT")
 Q
 ;
ENTRYS ;
 ;
 S DITC="",DA=DITMGMN,D0=DA,DIE=DITMGMG,DR=DITMGMFD_"///"_DITMGMT
 D ^DIE K DA,DIE,DITC,DR,D0
 I $D(Y) S DITMGMEC=DITMGMEC+1,DITMGMRG("ERROR",DITMGMEC)="DIE"_U_DITMGMFL_U_DITMGMFD_U_DITMGMN_U_DITMGMF_U_DITMGMT
 Q
 ;
ENTRYM ; PROCESS ONE SUBFILE ENTRY
 S DITC="",DIE=DITMGMGM,DA=DITMGMN,DR=DITMGMFD_"///"_DITMGMT
 D ^DITMU1 ; Set D0, D1, etc.
 D ^DIE K DA,DIE,DITC,DR
 D KILL^DITMU1 ; Kill D0, D1, etc.
 I $D(Y) S DITMGMEC=DITMGMEC+1,DITMGMRG("ERROR",DITMGMEC)="DIE"_U_DITMGMFL_U_DITMGMFD_U_DITMGMN_U_DITMGMF_U_DITMGMT
 Q
 ;
DINUM ; DINUM FILE
 ; Move the 'from' entry to it's new IEN location.  Do a merge
 ; if there is already a record at that location.
 ;
 N DIDA,DIK,DITMFROM S DITMFROM=$S(DITMGMMU:DITMGMGM,1:DITMGMG)
 S $P(@(DITMFROM_DITMGMF_",0)"),U)=DITMGMT
 I '$D(@(DITMFROM_DITMGMT_",0)")) D
 . S @(DITMFROM_DITMGMT_",0)")=DITMGMT
 . S $P(@(DITMFROM_"0)"),U,3,4)=DITMGMT_"^"_($P(@(DITMFROM_"0)"),U,4)+1)
 . Q
 S DIDA=$S('DITMGMMU:",",1:$$IEN^DIEFU(.DA)),DIDA("F")=DITMGMF_DIDA,DIDA("T")=DITMGMT_DIDA
 D TRNMRG^DIT("M",DITMGMFL,"",DIDA("F"),DIDA("T"))
 S $P(@(DITMFROM_DITMGMF_",0)"),U)=DITMGMF
 D
 . N DA D DA^DIEFU(DIDA("T"),.DA) Q:$D(DIERR)
 . K DIK S DIK=$$ROOT^DIQGU(DITMGMFL,DIDA("T")) Q:$D(DIERR)
 . N DIDA D IX1^DIK Q
 D
 . N DA D DA^DIEFU(DIDA("F"),.DA) Q:$D(DIERR)
 . K DIK S DIK=$$ROOT^DIQGU(DITMGMFL,DIDA("F")) Q:$D(DIERR)
 . N DIDA D ^DIK Q
 Q

DITMGMRG
DITMGMRG ;SFISC/EDE(OHPRD)-RELINK/MERGE TWO ENTRIES BELOW POINTED TO FILE ;8MAR2006
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Merge two entries below pointed to file.  See ^DITMDOC.
 ;
START ;
 D ^DITMGM1
 I 'DITMGMRG("GO") D EOJ K DITMGMRG Q
 D EN
 K DITMGMRG
 Q
 ;
EN ; EXTERNAL ENTRY POINT
 D INIT^DITMGMRI
 Q:$D(DITMGMQF)
 D STACK
 S:$D(DITMGMRG("NOTALK")) DITMGM2("NOTALK")=1
 D ^DITMGM2 K DITMGM2("NOTALK")
 K ^UTILITY("DITMGMRG",$J)
 W:'$D(DITMGMRG("NOTALK")) !!,"Merge complete",!!
 D EOJ
 Q
 ;
STACK ;STACK ALL FILES POINTING TO POINTED TO FILE AND IF .01 FIELD
 ;POINTING AND DINUM, FILES POINTING TO POINTING FILE, AND SO ON.
 ;
 W:'$D(DITMGMRG("NOTALK")) !!,"Gathering files and checking 'PT' nodes"
 NEW DITMGFLE,DITMGPFL,DITMGPFD,DITMSKP
 K ^UTILITY("DITMGMRG",$J)
 S DITMGFLE=DITMGMRG("FILE")
 D FILES
 Q
 ;
FILES ; CALLED RECURSIVELY
 D PTCHK
 F DITMGPFL=0:0 S DITMGPFL=$O(^DD(DITMGFLE,0,"PT",DITMGPFL)) Q:DITMGPFL'=+DITMGPFL  D  I 'DITMSKP D FIELDS
 . S DITMSKP=0
 . I $D(DITMGMRG("EXCLUDE",DITMGPFL)) S DITMSKP=1 Q
 . ;I DITMGFLE=DITMGPFL S DITMSKP=1 Q
 . Q:'$D(DITMGMRG("PACKAGE"))
 . I DITMGMRG("PACKAGE") S:'$D(DITMGMRG("PACKAGE",DITMGPFL)) DITMSKP=1 Q
 . Q
 Q
 ;
FIELDS ;
 ;W:'$D(DITMGMRG("NOTALK")) "f"
 F DITMGPFD=0:0 S DITMGPFD=$O(^DD(DITMGFLE,0,"PT",DITMGPFL,DITMGPFD)) Q:DITMGPFD'=+DITMGPFD  D
IHS . I DITMGPFL=2,DITMGPFD=.082 Q   ;NEW LINE
 . S ^UTILITY("DITMGMRG",$J,DITMGPFL,DITMGPFD)=DITMGFLE
 . ;W:'$D(DITMGMRG("NOTALK")) $S($D(^DD(DITMGPFL,0,"UP")):"s",1:".")
 . I DITMGPFD=.01,'$D(^DD(DITMGPFL,0,"UP")),$P(^DD(DITMGPFL,.01,0),U,5,99)["DINUM" D RECURSE
 Q
 ;
RECURSE ;
 ;W:'$D(DITMGMRG("NOTALK")) "d"
 NEW DITMGFLE
 S DITMGFLE=DITMGPFL
 NEW DITMGPFL,DITMGPFD
 D FILES
 Q
 ;
PTCHK ; MAKE SURE "PT" CORRECT
 I '$D(DITMGMRG("NOTALK")) ;W $S(DITMGMRG("FILE")=DITMGFLE:"",1:"[")
 E  S DITMU4("NOTALK")=1
 S DITMU4FI=DITMGFLE
 F DITMU4PF=0:0 S DITMU4PF=$O(^DD(DITMU4FI,0,"PT",DITMU4PF)) Q:DITMU4PF=""  F DITMU4PD=0:0 S DITMU4PD=$O(^DD(DITMU4FI,0,"PT",DITMU4PF,DITMU4PD)) Q:DITMU4PD=""  D CHKIT^DITMU4
 K DITMU4FI,DITMU4L,DITMU4PF,DITMU4PD,DITMU4X,DITMU4("NOTALK")
 ;I DITMGMRG("FILE")'=DITMGFLE,'$D(DITMGMRG("NOTALK")) W "]"
 Q
 ;
EOJ ;
 K X,Y
 K %,DIPGM
 I $D(DITMGMQF) S DITMGMRG("QFLG")=DITMGMQF
 K DITMGMF,DITMGMFG,DITMGMFL,DITMGMQF,DITMGMT
 K AUPNDAYS,AUPNDOB,AUPNDOD,AUPNPAT,AUPNSEX
 I $D(ZTQUEUED) S ZTREQ="@" Q
 I $D(ZTSK) K ^%ZTSK(ZTSK),ZTSK Q  ; old Kernel
 I '$D(DITMGMRG("NOTALK")),$D(DITMGMRG("ERROR")) D EOJ2 K DITMGMRG("ERROR")
 Q
 ;
EOJ2 ; List errors
 W !!,"The following errors occurred during the merge: ",!
 F %=0:0 S %=$O(DITMGMRG("ERROR",%)) Q:%'=+%  W !,DITMGMRG("ERROR",%)
 W !
 K %
 Q

DITMGMRI
DITMGMRI ;SFISC/EDE(OHPRD)-INITIALIZTION FOR ^DITMGMRG ;11/18/94  15:45
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
INIT ;
 K DITMGMQF,DITMGMRG("QFLG")
 S:$D(ZTQUEUED) DITMGMRG("NOTALK")=1
 S:$D(ZTSK) DITMGMRG("NOTALK")=1 ; old Kernel
 I '$D(DITMGMRG("FILE")) S DITMGMQF=20 Q
 I 'DITMGMRG("FILE") S DITMGMQF=20 Q
 I '$D(^DIC(DITMGMRG("FILE"),0,"GL")) S DITMGMQF=20 Q
 S DITMGMFG=^("GL")
 S DITMGMFL=DITMGMRG("FILE")
 I '$D(DITMGMRG("FR"))!('$D(DITMGMRG("TO"))) S DITMGMQF=21 Q
 I 'DITMGMRG("FR")!('DITMGMRG("TO"))!(DITMGMRG("FR")=DITMGMRG("TO")) S DITMGMQF=22 Q
 I '$D(@(DITMGMFG_DITMGMRG("FR")_",0)")) S DITMGMQF=23 Q
 I '$D(@(DITMGMFG_DITMGMRG("TO")_",0)")) S DITMGMQF=24 Q
 S DITMGMF=DITMGMRG("FR")
 S DITMGMT=DITMGMRG("TO")
 I $D(DITMGMRG("EXCLUDE")) D EXCLFL
 I $D(DITMGMRG("PACKAGE")),'DITMGMRG("PACKAGE") D EXCLPK
 I $D(DITMGMRG("PACKAGE")),DITMGMRG("PACKAGE") D INCLPK
 Q
 ;
EXCLFL ; EXCLUDE SUBFILES FOR EXCLUDED FILES
 NEW F,S,X,V
 S V="EXCLUDE"
 F DITMGEFL=0:0 S DITMGEFL=$O(DITMGMRG("EXCLUDE",DITMGEFL)) Q:'DITMGEFL  S F=DITMGEFL D EXCSF
 K DITMGEFL
 Q
 ;
EXCLPK ; EXCLUDE FILES/SUBFILES FROM PACKAGES
 NEW F,S,X,V
 S V="EXCLUDE"
 F DITMGEPK=0:0 S DITMGEPK=$O(^DIC(9.4,"AMRG",$S('$G(DITMGMRG("TOP FILE")):DITMGMRG("FILE"),1:DITMGMRG("TOP FILE")),DITMGEPK)) Q:'DITMGEPK  F F=0:0 S F=$O(^DIC(9.4,DITMGEPK,4,"B",F)) Q:'F  S DITMGMRG("EXCLUDE",F)="" D EXCSF
 K DITMGEPK
 Q
 ;
INCLPK ; INCLUDE FILES/SUBFILES FOR PACKAGE
 NEW F,S,X,V
 S V="PACKAGE"
 S DITMGEPK=DITMGMRG("PACKAGE") F F=0:0 S F=$O(^DIC(9.4,DITMGEPK,4,"B",F)) Q:'F  S DITMGMRG("PACKAGE",F)="" D EXCSF
 K DITMGEPK
 Q
 ;
EXCSF ; EXCLUDE/INCLUDE SUBFILES FOR ONE FILE/SUBFILE (CALLED RECURSIVELY)
 F S=0:0 S S=$O(^DD(F,"SB",S)) Q:'S  S DITMGMRG(V,S)="" D EXCSF2
 Q
 ;
EXCSF2 ; RECURSION FOR SUBFILES WITHIN SUBFILES
 S X=S
 NEW F,S
 S F=X
 D EXCSF
 Q

DITMU1
DITMU1 ;SFISC/EDE(OHPRD)-SETS DA ARRAY FROM D0,D1 ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; This routine sets the DA array from D0,D1 etc. or D0,D1
 ; etc. from the DA array.  If the variable DITMU1=2 it sets
 ; the DA array, otherwise it sets D0,D1 etc.
 ;
 ; The variable DITMU1 will be killed upon exiting this routine.
 ;
 ; The entry point KILL kills D0, D1, etc.
 ;
START ;
 NEW I,J
 I $G(DITMU1)=2 D D0DA
 E  D DAD0
 K DITMU1
 Q
 ;
DAD0 ;
 F I=1:1 Q:'$D(DA(I))  S I(99-I)=DA(I)
 S J=0 F I=0:1 S J=$O(I(J)) Q:J'=+J  S @("D"_I)=I(J)
 S @("D"_I)=DA
 Q
 ;
D0DA ;
 F I=0:1 Q:'$D(@("D"_I))  S J=I
 F I=0:1 S DA(J)=@("D"_I) S J=J-1 Q:J<1
 S DA=@("D"_(I+1))
 Q
 ;
KILL ; EXTERNAL ENTRY POINT - KILL D0, D1, ETC.
 NEW I
 F I=0:1 Q:'$D(@("D"_I))  K @("D"_I)
 Q

DITMU2
DITMU2(SUBFILE,GBL,FORM) ;SFISC/EDE(OHPRD)-RETURN SUBFILE GLOBAL REFERENCE ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Given a subfile number and global reference form, this routine
 ; will return the global reference for a subfile in the form
 ; specified.
 ;
 ; FORM is optional but if passed should equal 1 or 2.  If FORM is
 ; not passed the default form will be 1.
 ;
 ;     FORM = 1 will be in the form ^GBL(DA(2),11,DA(1),11,DA,
 ;     FORM = 2 will be in the form ^GBL(D0,11,D1,11,D2,
 ;
 ; Formal list:
 ;
 ; 1) SUBFILE = subfile number (call by value)
 ; 2) GBL     = global reference (call by reference)
 ; 3) FORM    = global reference form (call by value)
 ;
 ; *** NO ERROR CHECKING DONE ***
 ;
START ;
 NEW FIELD,I,LVL,NODE,PARENT
 S GBL="",LVL=1
 D BACKUP
 S GBL=^DIC(PARENT,0,"GL")
 I $G(FORM)=2 D  S GBL=GBL_"D"_(I+1)_"," I 1
 . F I=0:1 S GBL=GBL_"D"_I_","_NODE(99-LVL)_",",LVL=LVL-1 Q:LVL=0
 . Q
 E  D  S GBL=GBL_"DA,"
 . F LVL=LVL:-1:0 Q:LVL=0  S GBL=GBL_"DA("_LVL_"),"_NODE(99-LVL)_","
 . Q
 Q
 ;
BACKUP ; BACKUP TREE (CALLED RECURSIVELY)
 S PARENT=^DD(SUBFILE,0,"UP")
 S FIELD=$O(^DD(PARENT,"SB",SUBFILE,""))
 S NODE(99-LVL)=$P($P(^DD(PARENT,FIELD,0),"^",4),";",1) S:NODE(99-LVL)'=+NODE(99-LVL) NODE(99-LVL)=""""_NODE(99-LVL)_""""
 I $D(^DD(PARENT,0,"UP")) S SUBFILE=PARENT,LVL=LVL+1 D BACKUP ; Recurse
 Q

DITMU3
DITMU3(FILE,FIELD,ROOT) ;SFISC/EDE(OHPRD)-GET XREFS FOR ONE FIELD IN ONE FILE/SUBFILE ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; Given a file/subfile number, a field number, and a variable
 ; from which to assign subscripted values, this routine will
 ; return the xrefs for the specified field.
 ;
 ; The returned xrefs will be subscripted from the ROOT as follows:
 ;
 ;  ROOT(FIELD,n)     = file/subfile^xref (e.g. 9000010^AC)
 ;  ROOT(FIELD,n,"K") = executable kill logic
 ;  ROOT(FIELD,n,"S") = executable set logic
 ;
 ; Formal list:
 ;
 ; 1)  FILE   = file or subfile number (call by value)
 ; 2)  FIELD  = field number (call by value)
 ; 3)  ROOT   = array root (call by reference)
 ;
START ;
 NEW Y
 F Y=0:0 S Y=$O(^DD(FILE,FIELD,1,Y)) Q:Y'=+Y  S ROOT(FIELD,Y)=^(Y,0),ROOT(FIELD,Y,"S")=^(1),ROOT(FIELD,Y,"K")=^(2)
 Q

DITMU4
DITMU4 ;SFISC/EDE(OHPRD)-FIX ALL "PT" NODES ;
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ; This routine fixes all "PT" nodes for files 1 through the
 ; highest file number in the current UCI.
 ;
START ;
 W:'$D(DITMU4("NOTALK")) !!,"This routine insures the ""PT"" node of each FileMan file is correct.",!
 W:'$D(DITMU4("NOTALK")) !!,"Now checking false positives.",!
 S U="^"
 S DITMU4FI=.99999999 F DITMU4L=0:0 S DITMU4FI=$O(^DD(DITMU4FI)) Q:DITMU4FI'=+DITMU4FI  I $D(^DD(DITMU4FI,0,"PT")) W:'$D(DITMU4("NOTALK")) !,DITMU4FI D FPOS
 W:'$D(DITMU4("NOTALK")) !!,"Now checking false negatives.",!
 D FNEG
 K DITMU4FI,DITMU4L
 W:'$D(DITMU4("NOTALK")) !!,"DONE",!
 Q
 ;
FPOS ; CHECK FOR FALSE POSITIVES
 S DITMU4PF="" F DITMU4L=0:0 S DITMU4PF=$O(^DD(DITMU4FI,0,"PT",DITMU4PF)) Q:DITMU4PF=""  S DITMU4PD="" F DITMU4L=0:0 S DITMU4PD=$O(^DD(DITMU4FI,0,"PT",DITMU4PF,DITMU4PD)) Q:DITMU4PD=""  D CHKIT
 K DITMU4PF,DITMU4PD,DITMU4X
 Q
 ;
CHKIT ;
 W:'$D(DITMU4("NOTALK")) "."
 I '$D(^DD(DITMU4PF)) W:'$D(DITMU4("NOTALK")) "|" K ^DD(DITMU4FI,0,"PT",DITMU4PF) Q
 I '$D(^DD(DITMU4PF,DITMU4PD,0)) W:'$D(DITMU4("NOTALK")) "|" K ^DD(DITMU4FI,0,"PT",DITMU4PF,DITMU4PD) Q
 S DITMU4X=$P(^DD(DITMU4PF,DITMU4PD,0),U,2)
 I DITMU4X["P",DITMU4X[DITMU4FI Q
 I DITMU4X["V",$D(^DD(DITMU4PF,DITMU4PD,"V","B",DITMU4FI)) Q
 W:'$D(DITMU4("NOTALK")) "|" K ^DD(DITMU4FI,0,"PT",DITMU4PF,DITMU4PD)
 Q
 ;
FNEG ; CHECK FOR FALSE NEGATIVES
 S DITMU4FI=.99999999 F DITMU4L=0:0 S DITMU4FI=$O(^DD(DITMU4FI)) Q:DITMU4FI'=+DITMU4FI  W:'$D(DITMU4("NOTALK")) !,DITMU4FI S DITMU4FD=0 F DITMU4L=0:0 S DITMU4FD=$O(^DD(DITMU4FI,DITMU4FD)) Q:DITMU4FD'=+DITMU4FD  D:$D(^(DITMU4FD,0))#2 PTRCHK
 K DITMU4FI,DITMU4FD,DITMU4X,DITMU4I
 Q
 ;
PTRCHK ;
 S DITMU4X=$P(^(0),U,2)
 I DITMU4X["V" D PTRCHK2 Q
 Q:DITMU4X'["P"
 F DITMU4I=1:1:$L(DITMU4X)+1 Q:$E(DITMU4X,DITMU4I)?1N
 Q:DITMU4I>$L(DITMU4X)
 S DITMU4X=$E(DITMU4X,DITMU4I,999),DITMU4X=+DITMU4X
 Q:'DITMU4X
 Q:DITMU4X<1  ;*** DOES NOT MESS WITH FILE NUMBERS < 1 ***
 W:'$D(DITMU4("NOTALK")) "."
 Q:'$D(^DIC(DITMU4X))
 Q:'$D(^DD(DITMU4X,0))
 I '$D(^DD(DITMU4X,0,"PT",DITMU4FI,DITMU4FD)) W "|" S ^(DITMU4FD)=""
 Q
 ;
PTRCHK2 ; VARIABLE POINTER CHECK
 S DITMU4X="" F DITMU4L=0:0 S DITMU4X=$O(^DD(DITMU4FI,DITMU4FD,"V","B",DITMU4X)) Q:DITMU4X=""  I '$D(^DD(DITMU4X,0,"PT",DITMU4FI,DITMU4FD)) W:'$D(DITMU4("NOTALK")) "|" S ^(DITMU4FD)=""
 Q

DITP
DITP ;SFISC/GFT-TRANSFER POINTERS ;17MAY2005
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 D ASK Q:%-1  G PTS
 ;
ASK ;
 I '$D(^UTILITY("DIT",$J,0,1)) S %=2 Q
 S %=$O(^(1)),%Y=+^(1) S:%="" %=-1
U I $D(^DD(%Y,0,"UP")) S %Y=^("UP") G U
 W !,"SINCE THE "_$P("TRANSFERRED^DELETED",U,DH+1)_" ENTRY MAY HAVE BEEN 'POINTED TO'"
 W !,"BY ENTRIES IN THE '"_$P(^DIC(+%Y,0),U,1)_"' FILE," W:%>1 " ETC.,"
Q W !,"DO YOU WANT THOSE POINTERS UPDATED (WHICH COULD TAKE QUITE A WHILE)"
 S %=2 D YN^DICN Q:%  W !?4,"ANSWER 'YES' IF YOU THINK THAT THE ENTRY WHICH YOU HAVE JUST "_$P("MOVED^DELETED",U,DH+1),!?4,"MAY BE 'POINTED TO' BY SOME POINTER-TYPE FIELD VALUE SOMEWHERE",! G Q
 ;
PTS ;
 D WAIT^DICD K IOP
P K DR,D,DL,X S (BY,FR,TO)="",X=$O(^UTILITY("DIT",$J,0,0))
 I X="" K ^UTILITY("DIT",$J),DIA,DHD,DR,DISTOP,BY,TO,FR,FLDS,L,DIOBEG Q
 S Y=^UTILITY("DIT",$J,0,X),L=$P(Y,U,2),DL=1 K ^(X)
 S DL(1)=L_"////^D STUFF^DITP("_($P(Y,U,3)["V")_")" ;S X=$S($D(DE(DQ))[0:"""",$D(^UTILITY(""DIT"",$J,DE(DQ)))-1:"""",^(DE(DQ)):"_$S($P(Y,U,3)'["V":"+",1:"")_"^(DE(DQ)),1:""@"") I X]"""",$G(DIFIXPT)=1 D PTRPT^DITP" K ^(X)
 S L=$P(^DD(+Y,L,0),U,4),%=$P(L,";",2),L=""""_$P(L,";",1)_"""",DHD=$P(^(0),U) I % S %="$P(^("_L_"),U,"_%
 E  S %="$E(^("_L_"),"_+$E(%,2,9)_","_$P(%,",",2)
 S L=L_")):"""","_%_")?."" "":"""",1:D"
UP S (D(DL),%)=+Y I $D(^DD(%,0,"UP")) S DL=DL+1,Y=^("UP"),(DL(DL),%)=$O(^DD(Y,"SB",%,0))_"///",X(DL)=""""_$P($P(^DD(Y,+%,0),U,4),";")_"""",BY=+%_","_BY G UP
 S DHD=$O(^("NM",0))_" entries whose '"_DHD_"' pointers have been changed" G P:'$D(^DIC(%,0,"GL")) S DIC=^("GL"),Y="S X=$S('$D("_DIC_"D0,"
 F X=0:1:DL-1 S DR(X+1,D(DL-X))=DL(DL-X) S:X Y=Y_X(DL+1-X)_",D"_X_","
 S DIA("P")=%,%=$L(BY,",") I %>2 S BY=$P(BY,",",%-2)_",.01,"_BY
 S BY=BY_Y_L_X_")",L=0,FLDS="",DISTOP=0,DHIT="G LOOP^DIA2",%ZIS="",DIOBEG="W !!!!" ;It will happen in DIA2
 D EN1^DIP
IOP S IOP=$S($G(IOS):"`"_IOS,1:$G(IO)) G P
 ;
STUFF(VP) ;VP=BOOLEAN
 S X="" Q:$G(DE(DQ))=""
 N % S %=DE(DQ) Q:'$D(^UTILITY("DIT",$J,+%))
 S X=^(+%) I 'VP S X=+X
 E  S X=$S($P(X,";",2)'=$P(%,";",2):"",'X:"@",1:X) W:X="" "    (no change)" Q
 S:'X X="@"
 Q
 ;
PTRPT Q:'$G(DIFIXPTC)  N I,J,X
 F I=1:1:DL S J="" F  S J=$O(DR(I,J)) Q:J=""  I DR(I,J)["///" S X=$P($G(DR(I,J)),"///",1) I X]"" D
 . S ^TMP("DIFIXPT",$J,DIFIXPTC)=^TMP("DIFIXPT",$J,DIFIXPTC)_$S(I>1:" entry:"_$S(I=DL:$G(DA),1:$G(DA(DL-I))),1:"")_$S(I=DL:"   field:",1:"   mult.fld:")_X
 . Q
 Q

DITR
DITR ;SFISC/GFT-FIND FLDS TO XRF ;8SEP2011
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DITRCNT
LOOP S (DFL,DTL)=DFL-1 Q:'$D(DFN(DFL))
N S @("DFN(DFL)=$O("_DFR(DFL)_"DFN(DFL)))")
 I DFN(DFL)]"",$D(^(DFN(DFL)))#2 S Z=^(DFN(DFL)),A="" D:$G(DIFRFRV) SFRV1 G NS
 G LOOP:DFN(DFL)="",1:DFL#2,LOOP:$D(^(DFN(DFL),0))-1 S Z=^(0),X="D"_(DFL\2),@X=DFN(DFL) I DTO,$D(DSC(DDF(DFL+1))) X DSC(DDF(DFL+1)) E  G N
 I $P(^DD(DDT(DTL),.01,0),U,2)["W" D ^DITR1 G N
 D ^DITR1 I A D:$G(DIFRSA)]"" ERR G N
 I $G(DIFRSA)]"",'DKP,@("$D("_DTO(DTL)_"Y))") D KILLIDX
 D D,SFRV1:$G(DIFRFRV)
NS S A=$O(^DD(DDF(DFL),"GL",DFN(DFL),A)) G N:A=""
 S W=$O(^(A,0)) S:W="" W=-1 G:$G(DIFRDKP) NS:$D(@DIFRSA@("^DD",DIFRFILE,DDF(DFL),W)) I A S Y=$P(Z,U,A) G NS:Y=""
 E  S Y=$E(Z,+$E(A,2,9),$P(A,",",2)) F %=$L(Y):-1 Q:" "'[$E(Y,%)  G NS:'% S Y=$E(Y,1,%-1)
 I DTO G NS:'$D(^UTILITY("DITR",$J,DDF(DFL),W)) S B=^(W),DTN(DTL)=$P(B,U,2)
 E  S B=A,DTN(DTL)=DFN(DFL)
 S X="" I @("$D("_DTO(DTL)_"DTN(DTL)))#2") S X=^(DTN(DTL))
 I 'B D  G NS
 .S W=$E(B,2,9),B=$P(B,",",2)
 .I $E(X,+W,B)'?." "&DKP D:$G(DIFRFRV) KFRV1 Q
 .S %=$E(X,B+1,999),V=W-$L(X)-1,^(DTN(DTL))=$E(X,0,W-1)_$J("",$S(V>0:V,1:0))_Y S:%'?." " ^(DTN(DTL))=^(DTN(DTL))_$J("",B+1-W-$L(Y))_%
 .I $G(DIFRFRV) D SFRVL
 .Q
 I DKP,$P(X,U,B)]"" D:$G(DIFRFRV) KFRV1 G NS
P S $P(^(DTN(DTL)),U,B)=Y D:$G(DIFRFRV) SFRVL G NS
 ;
1 G N:$O(^(DFN(DFL),0))'>0 S Z=$O(^DD(DDF(DFL),"GL",DFN(DFL),0,0)) G N:Z'>0 I DTO G N:'$D(^UTILITY("DITR",$J,DDF(DFL),Z)) S B=^(Z)
 D D S Y=$P(^DD(DDF(DFL-1),Z,0),U,2),DDF(DFL+1)=+Y I DTO S Y=$P(B,U,3),X=""""_$P(B,U,2)_""","
 S DDT(DTL)=+Y,DTO(DTL)=DTO(DTL-1)_X S:$G(DIFRDKP) DIFRX=$D(@DIFRSA@("^DD",DIFRFILE,+Y)) I @("'$D("_DTO(DTL)_"0))") G:$G(DIFRDKP) LOOP:DIFRX S ^(0)=U_Y
 G N
 ;
SFRV1 S DIFRFRV1=$P($NA(@("DIFRFRV(D0,"_$P(DFR(DFL),DFR(1),2,255)_""""_DFN(DFL)_""")")),"DIFRFRV(",2,255),$E(DIFRFRV1,$L(DIFRFRV1))=""
 Q
SFRVL Q:'$D(@DIFRSA@("FRV1",DIFRFILE,DIFRFRV1))
 S @DIFRSA@("FRVL",DIFRFILE,DIFRFRV1)=$NA(@(DTO(DTL)_""""_DFN(DFL)_""")"))
 Q
KFRV1 K @DIFRSA@("FRV1",DIFRFILE,DIFRFRV1,B)
 Q
 ;
D S DTL=DFL+1
 S X=""""_DFN(DFL)_""",",DFR(DFL+1)=DFR(DFL)_X,DFL=DFL+1,DFN(DFL)=0 Q
 ;
F ;
 S A=1,@("Z="_DIK_"D0,0)") W !,$P(^(0),U,1) G I:'DTO!'$D(DITF)
 S Z=$P(DITF,";",1) I Z=" " S Z=D0 G I
 Q:'$D(^(Z))  S X=$P(DITF,";",2) I X S Z=$P(^(Z),U,X) G I
 S Z=$E(^(Z),+$E(X,2,9),+$P(X,",",2))
I ;
 S DFL=0,DTL=0,DA=D0 D ^DITR1
 I A D:$G(DIFRSA)]"" ERR Q
 I $G(DIFRSA)]"" S DIFRND0=Y I 'DKP,@("$D("_DTO(DTL)_"Y))") D KILLIDX
GO ;
 S DFL=1,DTL=1,DFN(1)=-1 D N
 Q
 ;
KILLIDX ; Kill the old index for single entry (overwrite mode only).
 N DIK,DA,%,A,B S DA=Y,DIK=DTO(DTL),DIK(0)="ABs"
 S A=$$CREF^DILF(DIK),A=$NA(@A),B=$QL(A)-1 F %=1:1:DFL\2 S DA(%)=$QS(A,B),B=B-2 ;GET SUBSCRIPTED VALUES OF DA  --GFT
 N D0,DDF,DDT,DFL,DFR,DINUM,DTL,DTN,DTO,I,W,X,Y,Z
 D IX2^DIK Q
 ;
ERR N DIPAR S DIPAR(.01)=X,DIPAR("IEN")=Y,DIPAR("FILE")=DDT(DFL)
 D BLD^DIALOG(9513.1,.DIPAR) Q
 ;

DITR1
DITR1 ;SFISC/GFT-FIND ENTRY MATCHES ;04:12 PM  3 Dec 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S W=DMRG,X=$P(Z,U),%=DFL\2,Y=@("D"_%),A=1 S:$G(DIFRDKP) DIFRNOAD=$D(@DIFRSA@("^DD",DIFRFILE,DDT(DTL),.01,0))
 N DIMATCH S DIMATCH=0
 G WORD:$P(^DD(DDT(DTL),.01,0),U,2)["W",Q:X="",ON:'W
 S V="" N DIKEY S DIKEY=$O(^DD("KEY","AP",DDT(DTL),"P",0))
 I DIKEY S A=0 D MATCHKEY(DIKEY,.V,.A,.DIMATCH) Q:A
 K DINUM I ^DD(DDT(DTL),.01,0)["DINUM" D  Q
 . I $P(^DD(DDT(DTL),.01,0),U,2)["P" D DINUM Q
 . S V=X,DA=Y,Y=0,D0=$S($D(D0):D0,$D(DFR):DFR,1:"") D DA
 . X $P(^DD(DDT(DTL),.01,0),U,5,99)
 . S X=V,Y=DA I '$D(DINUM) S A=1 Q
 . S Y=DINUM K DINUM D DINUM Q
 I $D(^DD(DDT(DTL),.001,0)) D HAS001 Q
 I DIKEY D  Q
 . I V>0 S Y=V D OLD Q
 . D NEW Q
 S V=0 D:'$D(DISYS) OS^DII
 N DISUBLN,DISUBMX
 S DISUBLN=$$SUBLN(DDT(DTL))
 S DISUBMX=+$P(^DD("OS",DISYS,0),U,7) S:'DISUBMX DISUBMX=63
B I DISUBLN=0 F A=1:1 S V=$O(@(DTO(DTL)_V_")")) G NEW:V'>0 I $D(^(V,0)),$P(^(0),U)=X D MATCH G OLD:'$D(A) S A=1
 S V=$S($O(@(DTO(DTL)_"""B"",$E(X,1,DISUBMX),V)"))>0:$O(^(V)),1:$O(@(DTO(DTL)_"""B"",$E(X,1,DISUBLN),V)"))) G NEW:V'>0
 I $D(@(DTO(DTL)_V_",0)")),$P(^(0),X)="" D MATCH G OLD:'$D(A)
 G B
 ;
DA Q:'%  S DA(%)=@("D"_Y),Y=Y+1,%=%-1 G DA
 ;
DINUM I DIKEY,V>0,V'=Y S A=1 Q
 I @("'$D("_DTO(DTL)_"Y))") D ADD Q
 I DIKEY S:Y'=V A=1 D:'A OLD Q
 S V=Y D MATCH I $D(A) S A=1 Q
 D OLD Q
 ;
HAS001 ; If file has .001 field, .01 and Identifiers/Keys must match
 I DIKEY,V>0,V'=Y S A=1 Q
 I @("$G("_DTO(DTL)_"Y,0))']""""") D ADD Q
 I DIKEY S:Y'=V A=1 D:'A OLD Q
 S V=Y N DIZERO S DIZERO=@(DTO(DTL)_"Y,0)") I $P(DIZERO,U)'=X S A=1 Q
 D MATCH I $D(A) S A=1 Q
 D OLD Q
 ;
NEW S W=0
ON I @("$D("_DTO(DTL)_"Y))") G OLD:W S DITRCNT=$G(DITRCNT)+1,Y=DITRCNT G ON
ADD G:$G(DIFRDKP) Q:DIFRNOAD S @("V="_DTO(DTL)_"0)"),^(0)=$P(V,U,1,2)_U_Y_U_($P(V,U,4)+1),^(Y,0)=X
OLD I DIMATCH,$G(DIFRDKPR),$G(DIFRDKPD),'DTL D REPLACE
 S DTO(DTL+1)=DTO(DTL)_Y_",",DTN(DTL+1)=0,A=0
Q Q
 ;
WORD I $G(DIFRDKP) Q:$D(@DIFRSA@("^DD",DIFRFILE,DDT(DTL),.01))
 S @("V=$O("_DTO(DTL)_"0))") X:V'>0!'DKP "K "_$E(DTO(DTL),1,$L(DTO(DTL))-1)_") S:$D("_DFR(DFL)_"0)) "_DTO(DTL)_"0)=^(0)","F V=0:0 S V=$O("_DFR(DFL)_"V)) Q:V'>0  S:$D(^(V,0)) "_DTO(DTL)_"V,0)=^(0)" S (DFL,DTL)=DFL-1 Q
 ;
MATCH S A=1 I Y'=V,$D(^DD(DDT(DTL),.001,0)) Q
 S Y=V,I=.01 N DIOUT,DIFL,DIREC
I S DIOUT=0
 F  S I=$O(^DD(DDT(DTL),0,"ID",I)) Q:'I  D I2 Q:DIOUT
 Q:DIOUT
 S DIMATCH=1 K A Q
 ;
I2 S DIFL=DDT(DTL),DIREC=I I '$D(^DD(DIFL,DIREC,0))#2 Q:'DIKEY  S DIOUT=1 Q
 K B D P Q:W=""
 S B=W
I3 ; Entry point for initial matching on KEY values
 I DTO S A=$P(A,";",2)_U_$P(A,";",1) D  Q:%'>0
 . F %=0:0 S %=$O(^UTILITY("DITR",$J,DDF(DFL+1),%)) Q:%'>0  Q:^(%)=A
 E  S %=I
 S DIFL=DDF(DFL+1),DIREC=% I '$D(^DD(DIFL,DIREC,0)) Q:'DIKEY  S DIOUT=1 Q
 D P I W="" Q:'DIKEY  S DIOUT=1 Q
 I W=B!(DIKEY) Q
 S Y=@("D"_(DFL\2)),DIOUT=1 Q
 ;
P S A=$P(^DD(DIFL,DIREC,0),U,4)
 S %=$P(A,";",2),W=$P(A,";")
 I @("'$D("_$S('$D(B):DTO(DTL)_"Y,",DFL:DFR(DFL)_"DFN(DFL),",1:DFR(1))_"W))") S W="" Q
 I % S W=$P(^(W),U,%)
 E  S W=$E(^(W),+$E(W,2,9),$P(W,",",2))
 Q:DIKEY
UP I %["F" S W=$$UP^DILIBF(W)
 Q
 ;
MATCHKEY(DIKEY,V,A,DIMATCH) ; Match Primary Key fields
 ; DIKEY=IEN of Primary Key, V=IEN of matching record on target file, A set to 1 if errors are encountered.
 N %,B,S,W,Y,DIOUT,DIENS,DIFL,DIERR,DIREC,DIVAL
 S S="",DIOUT=0
 F  S S=$O(^DD("KEY",DIKEY,2,"S",S)) Q:'S!(DIOUT)  S DIREC="" F  S DIREC=$O(^DD("KEY",DIKEY,2,"S",S,DIREC)) Q:'DIREC!(DIOUT)  S DIFL="" F  S DIFL=$O(^DD("KEY",DIKEY,2,"S",S,DIREC,DIFL)) Q:'DIFL!(DIOUT)  D
 . I DIFL'=DDT(DTL)!('$D(^DD(DDT(DTL),DIREC,0))#2) S DIOUT=1 Q
 . S %=$P(^DD(DIFL,DIREC,0),U,4),I=DIREC,(B,W)=""
 . D  Q:DIOUT  I W="" S DIOUT=1 Q
 .. N A,DIFL,DIREC S A=% D I3 Q
 . S DIVAL(S)=W Q
 S A=0 I DIOUT S A=1 Q
 N KEYN,DA,DIENS,DIERR
 S KEYN=$P($G(^DD("IX",+$P(^DD("KEY",DIKEY,0),U,4),0)),U,2) I KEYN="" S A=1 Q
 S DIENS="," I $G(D1) S %=DFL\2,Y=0,D0=$S($G(D0):D0,$G(DFR):DFR,1:"") I D0 D DA S DIENS=$$IENS^DILF(.DA)
 S V=$$FIND1^DIC(DDT(DTL),DIENS,"QXK",.DIVAL,,,"DIERR")
 I $G(DIERR) S A=1 Q
 I V>0 S DIMATCH=1
 S A=0 Q
 ;
REPLACE ;
 N DA,DIK,DISAV0 S DISAV0=$P(@(DIFROOT_"0)"),U,3,4)
 K @DIFRSA@("TMP")
 I DIFRDKPS M @DIFRSA@("TMP",DIFRFILE,Y)=@(DTO(DTL)_Y_")")
 S DA=Y,DIK=DIFROOT
 N %,A,B,D0,DDF,DDT,DFL,DFR,DINUM,DTL,DTN,DTO,I,W,X,Y,Z
 D ^DIK
 S DIFRDKPD=0,$P(@(DIFROOT_"0)"),U,3,4)=DISAV0
 Q
 ;
SUBLN(DIFILE) ; Return maximum subscript length for "B" index.
 N I,DIWHEREB,DISUBLN S DIWHEREB=""
 S DIWHEREB=$O(^DD("IX","BB",DIFILE,"B",0))
 I 'DIWHEREB,$D(^DD(DIFILE,0,"IX","B",DIFILE,.01)) S DIWHEREB=0
 I DIWHEREB="" Q 0
 I DIWHEREB D
 . S I=$O(^DD("IX","F",DIFILE,.01,DIWHEREB,0)) Q:'I
 . S DISUBLN=+$P($G(^DD("IX",DIWHEREB,11.1,I,0)),U,5)
 . S:'DISUBLN DISUBLN=999
 I 'DIWHEREB F I=0:0 S I=$O(^DD(DIFILE,.01,1,I)) Q:'I  I $P($G(^(I,0)),U,2)="B" D  Q
 . S I=$G(^DD(DIFILE,.01,1,I,1)),DISUBLN=+$P(I,"$E(X,1,",2) Q
 Q:$G(DISUBLN) DISUBLN
 Q 30
 ;

DIU
DIU ;SFISC/GFT-UTILITY FUNCTIONS ;7NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K DIU
0 S DIC="^DOPT(""DIU"","
 G OPT:$D(^DOPT("DIU",11)) S ^(0)="UTILITY OPTION^1.01" K ^("B")
 F X=1:1:11 S ^DOPT("DIU",X,0)=$P($T(@X),";;",2)
 S DIK=DIC D IXALL^DIK S ^DOPT("DICR",0)="TYPE OF INDEXING^1.01"
 F X=1:1:7 S ^DOPT("DICR",X,0)=$P("REGULAR^KWIC^MNEMONIC^MUMPS^SOUNDEX^TRIGGER^BULLETIN",U,X)
 S DIK="^DOPT(""DICR""," D IXALL^DIK G 0
OPT ;
 S DIC(0)="AEQIZ" S:DUZ(0)'="@" DIC("S")="I Y-5"
 D ^DIC G Q:Y<0 S DI=Y D EN G 0
 ;
EN ;
 I +DI=2 D  G:'$D(DI) Q
 . W ! S Y=$$TYPE^DIKCUTL2 Q:Y=1
 . D:Y=2 MOD^DIKCUTL
 . K DI
 D D^DICRW G Q:Y<0 I '$D(DIC) D DIE^DIB G Q:'$D(DG) S DIC=DG
 S DIU=DIC,DIU(0)="EDT" K DICS
 K DIC,I,J S Y=DI,N=0,DI=+$P($G(@(DIU_"0)")),U,2),J(0)=DI,I(0)=DIU
 I 'DI W $C(7),!,"Missing or incomplete global node "_DIU_"0)",! G Q
DDA S DDA=""
 D @+Y W !!
Q K %,DIUF,DG,DGG,DIC,DIU,DJJ,DIK,DI,DA,I,J,X,Y,DICD,DICDF,DDA,DIFLD,DTOUT,DUOUT,DR Q
 ;
1 ;;VERIFY FIELDS
 G ^DIV
 ;
2 ;;CROSS-REFERENCE A FIELD OR FILE
 S X="CW" D DI Q:Y<.002  G ^DICD
 ;
3 ;;IDENTIFIER
 S X="CW.01" D DIAX Q:'$T  D DI Q:Y<0  G 3^DIU3
 ;
4 ;;RE-INDEX FILE
 G 4^DIU1
 ;
5 ;;INPUT TRANSFORM (SYNTAX)
 S X="W" D DIAX Q:'$T  D DI Q:Y<0  G 5^DIU31
 ;
6 ;;EDIT FILE
 G 6^DIU0
 ;
7 ;;OUTPUT TRANSFORM
 S X="CW" D DI Q:Y<0  G O^DIU31
 ;
8 ;;TEMPLATE EDIT
 G 0^DIBT
 ;
9 ;;UNEDITABLE DATA
 S X="C" D DIAX Q:'$T  D DI Q:Y<0  G 9^DIU31
 ;
10 ;;MANDATORY/REQUIRED FIELD CHECK
 G ^DIVRE
 ;
11 ;;KEY DEFINITION
 G MOD^DIKKUTL
 ;
99 ;;SPECIFIER
 S X="CW",N=0 D DI Q:Y<0  G ^DIU4 ;NOT USED??
 ;
DI ;
 S DIC(0)="ZQEAI"
D ;
 S DIC="^DD("_DI_",",DIC("W")="S %=$P(^(0),U,2) I % W $S($P(^DD(+%,.01,0),U,2)[""W"":""  (word-processing)"",1:""  (multiple)"")"
 S DIC("S")="S %=$P(^(0),U,2) I 1"_$P(",$O(^(1,0))!%","Z",X["R")_$P(",%'[""C""",U,X["C")_$P(",$P(^DD(+%,.01,0),U,2)'[""W""",9,X["W")_$P(",Y-.01",U,X[.01),DA=X
 D ^DIC K DIC("S") I Y>0,$P(Y(0),U,2) S N=N+1,X=$P($P(Y(0),U,4),";",1),DI=$E("""",+X'=X),I(N)=DI_X_DI,(DI,J(N))=+$P(Y(0),U,2),X=DA G DI:$P(^DD(DI,.01,0),U,2)'["W" S Y(0)=^(0),Y=.01_U_$P(Y(0),U)
 Q
DIAX I '$D(^DD(DI,0,"DI"))!($P($G(^("DI")),U)'["Y")!($P($G(^("DI")),U)["Y"&'$P(@(^DIC(DI,0,"GL")_"0)"),U,4))
 W:'$T !!,$C(7),"THIS DATA DICTIONARY CHANGE IS NOT ALLOWED ON AN ARCHIVE FILE!"
 Q

DIU0
DIU0 ;SFISC/XAK-EDIT/DELETE A FILE ;12NOV2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013;Build 11
 ;Per VHA Directive 2004-038, this routine should not be modified.
DIPZ ;
 D PZ,DIEZ Q
PZ ;Recompile PRINT Template routines
 S DIU2=$G(J(0)) N DIC,C,F,I,J,M,O,Q,S,T,V,W,Y
 F DIU0=0:0 S DIU0=$O(^DIPT("AF",DI,DA,DIU0)) Q:DIU0'>0  K ^(DIU0),^DIPT(DIU0,"ROU") S DMAX=^DD("ROU"),X=^DIPT(DIU0,"ROUOLD"),Y=DIU0,DIU1=DI D EN^DIPZ S DI=DIU1
 S J(0)=DIU2 D DT Q
 ;
IN(DI,DA) ;Recompile INput Templates containing Field DA, File DI
 N J,I D IJ^DIUTL(DI)
DIEZ N DL,DH,DQ,DIE,DIC,DNM,DR,M,T,F,Q,Y
 F DIU0=0:0 S DIU0=$O(^DIE("AF",DI,DA,DIU0)) Q:DIU0'>0  D
 . S X=$G(^DIE(DIU0,"ROUOLD"))
 . I X'?1(1A,1"%").7AN D  I X'?1(1A,1"%").7AN D UNC^DIEZ(DIU0) Q
 .. S X=$P($G(^DIE(DIU0,"ROU")),U,2)
 . K ^DIE("AF",DI,DA,DIU0),^DIE(DIU0,"ROU")
 . S DMAX=^DD("ROU"),Y=DIU0,DIU1=DI
 . D EN^DIEZ S DI=DIU1
DT I $D(^DD(DI,DA)) S:$P($G(^DIC(J(0),"%A")),U,2)-DT ^DD(DI,DA,"DT")=DT
 K DIU0,DIU1,DIU2 W ! Q
 ;
EN ;
 I DIU,DIU(0)["S" G SUB
 I DIU,$D(^DIC(DIU,0,"GL")) S DIU=^("GL")
 G Q:"(,"'[$E($RE(DIU))!DIU S DIK="^DIC(",DG=$G(@(DIU_"0)")),(A,DA)=+$P(DG,U,2) G Q:'A
 N DIKLGLBL I DIU(0)["D" S DIKLGLBL=$$CREF^DILF(DIU)
 D ^DIK G 61
6 ;
 N DIKLGLBL
 S DA=DI,%=$$SCREEN^DIBT("^D SCREENQ^DICATT") Q:%=U  G SCROLL:'%
 G ^DIU20
 ;
SCROLL S DR=".01:10;"_$P(20,U,$S($D(^DIC(200,0)):^(0)["NEW PERSON",$D(^DIC(3,0)):^(0)["USER"!(^(0)["EMPLOY"),1:0))
 S DIE=1,(A,DA)=DI,DIER=1 D  K DIER G N^DIU2:$D(DA)
 .N A D ^DIE
61 ; delete a FILE!
 S DQ(A)=0 K ^DIA(A) I $G(DIKLGLBL)]"" K @DIKLGLBL
63 W:DIU(0)["E" !?3,"Deleting the DATA DICTIONARY..." D KDD^DICATT4
 Q:DIU(0)["S"  G Q:DIU(0)'["T"
 F DIK="^DIE(","^DIPT(","^DIBT(" K @(DIK_"""F""_A)") W:DIU(0)["E" !?3,"Deleting the "_$P(^(0),U)_"S..." S DA=.9 F  S DA=$O(@(DIK_"DA)")) Q:DA'>0  I $D(^(DA,0)) S %=$P(^(0),U,4) I %=""!'$D(^DD(+%)) W:DIU(0)["E" "." D ^DIK
 D FORM^DDSDEL(A,DIU(0)["E")
Q K A,DA,DG,DIK,DQ Q
 ;
SUB G Q:'$D(^DD(DIU,0,"UP")) S DA(1)=^("UP"),DQ(DIU)=0
 I DIU(0)'["D" S A=DA(1) D 63 S A=DIU G SE
 S D0=DIU,S=";",Q=""""
 F I=1:1 Q:'$D(^DD(DIU,0,"UP"))  S A=^("UP"),%=$O(^DD(A,"SB",DIU,0)) Q:%=""  Q:'$D(^DD(A,%,0))#2  S %(I)=$P($P(^(0),U,4),S),DIU=A S:+%(I)'=%(I) %(I)=Q_%(I)_Q I I=1 S (O,M)=^(0)
 S DICL=I-2 F I=1:1:DICL+1 S I(I)=%(DICL-I+2)
 S I(0)=^DIC(DIU,0,"GL") K %
 D
 . N DIU0TOP,DIU0SFIL S DIU0TOP=A,DIU0SFIL=D0
 . N A,DA,D0,DICL,DIU,DQ,I,O,M,S,Q
 . D INDEX^DIKC(DIU0TOP,"","","","KiRW"_DIU0SFIL)
 D 63 S A=D0 D EN^DICATT4
SE S DIK="^DD("_DA(1)_",",DA=$O(^DD(DA(1),"SB",A,0)) D ^DIK:DA
 K D0,DICL,E,I,M,O,Q,S,T,X,Y G Q

DIU1
DIU1 ;SFISC/GFT-REINDEX A FILE ;6NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
4 ;RE-CROSS-REFERENCING -- UTILITY OPTION 4
 N DIUCNT,DIUTYPE,DV,DU,DW,DINO,DIKJ ;COME IN WITH I,J,N DEFINED
 W !! K ^UTILITY("DIK",$J),X S DIK=DIU,X=0 D DISKIPIN^DIK(.DINO) S DW=0,DIUF=DI ;USED TO CALL D DD^DIK
DW S DW=$O(^UTILITY("DIK",$J,DW)),DV=0 S:DW="" DW=-1
 I DW>0 S DU=0 F  S DV=$O(^UTILITY("DIK",$J,DW,DV)),DH=0 G DW:DV="" S Y=0 F  S DH=$O(^UTILITY("DIK",$J,DW,DV,DH)) Q:DH=""  D
 .S Y=^UTILITY("DIK",$J,DW,DV,DH),X=X+1,X(X)=Y,X(X,0)=DW_U_DV S:$P(Y,U,3)=""&'Y&$D(^(DH,0)) X(X)=^(0)
 D GETXR^DIKCUTL2(DI,.DIUCNT,"xM")
 F %=1:1:X I $G(X(%))="S DIIX=4 D:$G(DIK(0))'[""A"" AUDIT" K X(%) S X=X-1 F Y=%:1:X M X(Y)=X(Y+1) K X(Y+1) S %=%-1
 K ^UTILITY("DIK",$J) G DD:'(X+DIUCNT),ONE:(X+DIUCNT)>1
ALL W "OK, ARE YOU SURE YOU WANT TO KILL OFF THE EXISTING "
 I X=0,DIUCNT=1 W "'"_$P(DIUCNT($O(DIUCNT(""))),U,3)_"' INDEX"
 E  I X=1,DIUCNT=0 W $P(^DD(+X(1,0),$P(X(1,0),U,2),0),U,1)_" INDEX"
 E  W X+DIUCNT_" INDICES"
 S %=2 D YN^DICN G:%-1 NO:%,Q W !,"DO YOU THEN WANT TO 'RE-CROSS-REFERENCE'" D YN^DICN G NO:%<1 S N=%=1 D WAIT^DICD
 F X=X:-1:1 S %=$P(X(X),U,2) I %]"",+X(X)=DI K @(DIK_"%)") K:$P(X(X),U,3)'="MUMPS" X(X)
 ;THE REMAINING NODES OF 'X' SAY THAT WE HAVE TO KILL SOME INDIVIDUALLY.
 ;DIK(0)="AB" MEANS 'DON'T AUDIT & DON'T DO BULLETINS';X=2 MEANS DO KILLING.  THAT OCCURS IN CNT^DIK1
 S DIK(0)="ABX" I $O(X(0))]"" S X=2,(DA,DCNT)=0 D DISKIPIN^DIK(.DINO),CNT^DIK1
 D:DIUCNT INDEX^DIKC(DIUF,"","","","KR") ;NOW DELETE THE NEW-STYLES, IF ANY
 K X I N W !,$C(7),"FILE WILL NOW BE 'RE-CROSS-REFERENCED'..." H 5 D DD S DIK=^DIC(DIUF,0,"GL") D IXALL^DIK
 K DIK,DIC Q
 ;
DD S DIK="^DD(DI,",DA(1)=DI K ^DD(DI,"B"),^("GL"),^("IX"),^("RQ"),^("GR"),^("SB")
 W "." D IXALL^DIK:$D(^(0))#2 S DI=$O(^DD(DI)) S:DI="" DI=-1 I DI>0,DI<$O(^DIC(DIUF)) G DD ;RE-DOES THE DATA DICTIONARY, NOT THE DATA
 Q
 ;
ONE S %=2 W "THERE ARE "_(X+DIUCNT)_$P(" RE-RUNNABLE",U,DINO>0)_" INDICES WITHIN THIS FILE",!,"DO YOU WISH TO RE-CROSS-REFERENCE ONE PARTICULAR INDEX" D YN^DICN W ! I %-1 G ALL:%=2,NO:%,Q
 S DIUTYPE=$S('$G(DIUCNT):1,'$G(X):2,1:$$TYPE^DIKCUTL2)
 G NO:DIUTYPE=""
 I DIUTYPE=2 K DIUCNT D ONEXR(DI) Q
 K X S X="CRW" D DI^DIU G NO:Y<0 S (DA,DL)=+Y,DICD="RE-CROSS-REFERENCE" D CHIX^DICD G NO:'DICD
 S X=$P(I,U,2),%=$S(X]"":"THE '"_X_"' INDEX",1:"THIS TRIGGER") I $G(^DD(DI,DA,1,DICD,"NOREINDEX")) W !,"SORRY. ",%," IS LISTED AS NOT RE-RUNNABLE" G NO
 W !,"ARE YOU SURE YOU WANT TO DELETE AND RE-CROSS-REFERENCE "_% S %=2 D YN^DICN G NO:%-1
 G IND:X="" F %=0:0 S %=$O(^DD(+I,0,"IX",X,%)) Q:%=""  F %Y=0:0 S %Y=$O(^DD(+I,0,"IX",X,%,%Y)) Q:%Y=""  I %Y-DA!(%-DI) G IND
 I +I=DIUF,$P(I,U,3)="",X]"" K @(DIK_"X)") G REDO
IND I $P(I,U,3)="",X]"" D KWREG(DIU,0,.I,.J) G REDO
 S X=^DD(J(N),DA,1,DICD,2) D DD^DICD:"Q"'[X S DIU=^DIC(DIUF,0,"GL")
REDO S X=^DD(J(N),DL,1,DICD,1) D DD^DICD:"Q"'[X W $C(7),"    ...DONE!" Q
 ;
Q F I=1:1:X W !,"FIELD " S %=X(I,0),J=$P(%,U,2) W J_" ('"_$P(^DD(+%,J,0),U,1)_"'" W:%-DI ", "_$O(^DD(+%,0,"NM",0))_" SUBFILE" W ") IS ",$S(X(I):"'"_$P(X(I),U,2)_"' INDEX",1:$P(X(I),U,3)) D UP
 W !! D LIST^DIKCUTL2(.DIUCNT,"INDEX FILE CROSS-REFERENCES:")
 G 4
UP I X(I),X(I)-DI S %=$D(^DD(+X(I),0,"UP")) W " OF "_$O(^("NM",0))_" "_$P("SUB",U,%>0)_"FILE" Q
 S %=+$P(X(I),U,4),(%F,Y)=+$P(X(I),U,5) I %,$D(^DD(%,Y,0)) W:$X>44 ! W " OF " D WR^DIDH
 Q
 ;
NO W !?7,$C(7),"<NO ACTION TAKEN>" K DICD,X,DH
 Q
 ;
KWREG(ROOT,LEV,I,J) ;Kill entire regular index
 ;In:
 ; ROOT = open root of file or subfile
 ; LEV = level # of ROOT
 ; I = ^DD(file#,field#,1,xref#,0) [xref header node] = rfile#^name
 ; I(N) = node on which multiple at level n resides (for N>0)
 ; J(N) = level N subfile #
 ;
 N CROOT
 S CROOT=$$CREF^DILF(ROOT)
 Q:'$D(@CROOT)
 I J(LEV)=+I K @CROOT@($P(I,U,2)) Q
 ;
 N DA
 S DA=0
 F  S DA=$O(@CROOT@(DA)) Q:'DA  D:$D(@CROOT@(DA,0))#2 KWREG(ROOT_DA_","_I(LEV+1)_",",LEV+1,.I,.J)
 Q
 ;
 ;==============
 ; ONEXR(file#)
 ;==============
 ;Prompt for file/subfile and Index; run kill/set logic for that Index
 ;In:
 ; DI = top level file #
 ;
ONEXR(DI) ;Re-index one cross reference
 ;Prompt for subfile
 N DIUCNT,DIUCTRL,DIUFILE,DIULOG,DIUXR
 W !!?10,"File: "_$O(^DD(DI,0,"NM",""))_" (#"_DI_")"
 S DIUFILE=$$SUB^DIKCU(DI) G:DIUFILE="" NO
 ;
 ;Prompt for xref
 D GETXR^DIKCUTL2(DIUFILE,.DIUCNT,"x")
 W ! D LIST^DIKCUTL2(.DIUCNT)
 S DIUXR=$$CHOOSE^DIKCUTL2(.DIUCNT,"re-cross-reference")
 G:'DIUXR NO
 ;
 ;Run kill and/or set
 S DIUCTRL=$$LOGIC($P(DIUCNT(DIUXR),U,3))
 G:DIUCTRL="" NO
 ;
 S:DI'=DIUFILE DIUCTRL=DIUCTRL_"W"_DIUFILE
 D INDEX^DIKC(DI,"","",DIUXR,DIUCTRL_"R")
 W $C(7)_"  ...DONE!"
 Q
 ;
 ;====================
 ; $$LOGIC(indexName)
 ;====================
 ;Prompt for whether kill and/or set logic should be run.
 ;In:
 ; DIUNAME = name of xref (used in prompt)
 ;Return value:
 ; [ K : if kill logic should be run
 ; [ S : if set logic should be run
 ;
LOGIC(DIUNAME) ;
 N DIULOG,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIULOG=""
 ;
 ;Ask whether kill logic should be executed
 S DIR(0)="Y"
 S DIR("A")="Do you want to delete the existing '"_DIUNAME_"' cross-reference"
 S DIR("?")="  Enter 'YES' if you want to run the kill logic for this cross-reference."
 W ! D ^DIR K DIR Q:$D(DIRUT) ""
 S:Y DIULOG="K"
 ;
 ;Ask whether set logic should be executed
 S DIR(0)="Y"
 S DIR("A")="Do you want to re-build the '"_DIUNAME_"' cross reference"
 S DIR("?")="  Enter 'YES' if you want to run the set logic for this cross reference."
 D ^DIR K DIR Q:$D(DIRUT) ""
 S:Y DIULOG=DIULOG_"S"
 Q DIULOG

DIU2
DIU2 ;SFISC/XAK/GFT-EDIT FILE ;18SEP2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ;from DIU0
N S X=$P(^DIC(DA,0),U,1),D=@(DIU_"0)"),^(0)=X_U_$P(D,U,2,9) K ^DD(+$P(D,U,2),0,"NM") S ^("NM",X)="" Q:$D(Y)
 I DUZ(0)]"" F DR=1:1:6 S D=$P("DD^RD^WR^DEL^LAYGO^AUDIT",U,DR),Y=$S($D(^DIC(DA,0,D)):^(D),1:"") D RW G Q:X=U
 S X=$G(^("AUDIT"))
 I X]"",DUZ(0)'="@" G OK:$TR(X,DUZ(0))=X
DDA K DIR ;S DIR("A")="DD AUDIT",DIR(0)="YO"
 ;S:$D(^DD(DA,0,"DDA")) DIR("B")=$S(^("DDA")["Y":"YES",1:"NO")
 ;S DIR("??")="^W !!?5,""Enter 'Y' (YES) if you want to audit the Data Dictionary changes"",!?5,""for this file."""
 ;D ^DIR K DIR Q:$D(DTOUT)!$D(DUOUT)  S ^DD(DA,0,"DDA")=$S(Y=1:"Y",1:"N")
OK S DIU(0)=$P(@(DIU_"0)"),U,2) K DIR
 S %=DIU(0)'["O"+1
 W !,"ASK 'OK' WHEN LOOKING UP AN ENTRY" D YN^DICN
 I %>0 S $P(@(DIU_"0)"),U,2)=$P(DIU(0),"O")_$E("O",%)_$P(DIU(0),"O",2)
 I '% W !?5,"Answer YES to cause a lookup into this file to verify the",!?5,"selection by prompting with '...OK? YES//'." G OK
 I DUZ(0)="@",%'<0 D ^DIU21
Q K DIR,DIRUT,DTOUT,DUOUT,DIROUT Q
 ;
CHECKPT ;CALLED BY ^DD(1,.01,"DEL",.5,0)
 N M,S,P D POINT^DIDH S M=0,P="PT"
CM S M=$O(^DD(DA,0,P,M)) I M>0 Q:M<DA  G CM:M=DA S S=M F  S S=$G(^DD(M,0,"UP")) Q:'S  G CM:S=DA ;SET $T=0 SWITCH TO SAY THERE'S NO POINTER FILE TO THIS ONE
 Q:P="PTC"!$T  S P="PTC" G CM ;LOOK AT COMPUTED POINTERS AS WELL AS POINTERS
 ;
 ;
K ; CALLED BY ^DD(1,.01,"DEL",1,0)
 N DIKREF,DG,DIR
 S DIKREF=$$CREF^DILF(DIU),DG=@DIKREF@(0)
 I $P($G(^DD(+$P(DG,U,2),0,"DI")),U,2)["Y" W $C(7)," CANNOT DELETE A RESTRICTED"_$S($P($G(^("DI")),U)["Y":" (ARCHIVE)",1:"")_" FILE!" Q
 G G:'$O(@DIKREF@(0))
H W $C(7),!,"DO YOU WANT JUST TO DELETE THE "
 I $P(DG,U,4)>1 W $P(DG,U,4)," FILE ENTRIES,"
 E  W "FILE CONTENTS,"
 S %=2 W !?9,"& KEEP THE FILE DEFINITION" D YN^DICN
 I %=0 W !,"Answer YES if you are just looking for a fast way to get rid of Entries",!! G H
 I %<2 D:%=1  Q  ;$T left TRUE, so FILE will not be deleted
 .N S
 .M S=@DIKREF@(0) K @DIKREF
 .M @DIKREF@(0)=S ;save back the stuff hanging from zero node
 .S $P(@DIKREF@(0),U,3,99)="",^DIC(DA,0,"GL")=DIU
G Q:$G(DIU(0))'["D"
 S %=1 I $O(@DIKREF@(0)) W !?3,"IS IT OK TO DELETE THE '"_DIKREF_"' GLOBAL" D YN^DICN
 I %=0 W !,"You can abort the deletion process at this point by typing '^'",!,"Answer NO if you want to save ",DIKREF," for redefinition at a later time.",!! G G
 S:%=1 DIKLGLBL=DIKREF
 I %<1 ;$T true means forget it!
SURE I $D(DDS),$D(DDACT) D
 . F  D  Q:%Y'["?"
 .. S %=2 W !,"SURE YOU WANT TO DELETE THE ENTIRE FILE" D YN^DICN
 .. I %Y["?" D
 ... W !,"We are going to ",$S($D(DIKLGLBL):"Delete data associated with File #"_DA,1:"Leave the data associated with File #"_DA)
 ... W !,"Answer YES if want to continue with the DELETION of the DD, Templates, Forms,"
 ...  W !,"etc. for File #"_DA
 I %-1
 Q
 ;
RW W !,$P("DATA DICTIONARY^READ^WRITE^DELETE^LAYGO^AUDIT",U,DR)," ACCESS: " G R:Y="" W Y I DUZ(0)'="@" F X=1:1:$L(Y) Q:DUZ(0)[$E(Y,X)  G Q:X=$L(Y)
 W "// "
R R X:DTIME S:'$T X=U,DTOUT=1 Q:X=""
 I X["@" G V:Y="" W $C(7),"   PROTECTION ERASED!" K ^(D) Q
 Q:X[U
 I X["?" W !,"ENTER CODE(S) TO RESTRICT USER'S ACCESS TO THIS FILE" G RW
V I DUZ(0)'="@" F Z=1:1:$L(X) I DUZ(0)'[$E(X,Z) W $C(7),"??" G RW
 S ^(D)=X Q
EN ;
 Q:'$D(DIU)  G EN^DIU0

DIU20
DIU20 ;SFISC/GFT-SCREEN-EDIT FILE ;11JUN2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 ;from DIU0 -- DA=FILE NUMBER
 N DR
 S DDSFILE=1,DR="[DIEDIT]"
 D ^DDS
 Q
 ;
PRE ;
 I DUZ(0)'="@" D
 .F I=9.5,10,11,12 D UNED ;non-programmer cannot put in SCREEN, ACTION, LOOKUP, or CROSS-REF ROUTINE
 .F I=2:1:7 D
 ..S X=$G(^DIC(DA,0,$P("^DD^RD^WR^DEL^LAYGO^AUDIT",U,I)))
 ..I X]"",$TR(X,DUZ(0))=X D UNED
 D:'$D(DISYS) OS^DII I $G(^DD("OS",DISYS,18))="" F I=11,12 D UNED
 Q
 ;
UNED D UNED^DDSUTL(I,"DIEDIT",1,1)
 Q
 ;
ACCVAL(X) ;
 I DUZ(0)'="@",$TR(X,DUZ(0))]"" S DDSERROR=1 D HLP^DDSUTL("MUST MATCH YOUR OWN ACCESS CODE") Q
 I (X["?") S DDSERROR=1 D HLP^DDSUTL("CANNOT CONTAIN '?'") Q
 Q
 ;
POST ;
 N I,NAMENOW,ROOT,SP
MAYBGONE Q:'$G(DA)
 S NAMENOW=$P(^DIC(DA,0),U) ;has FILE NAME changed?
 S X=$$G(.2) I X="" G KILLFILE
 S ROOT=^DIC(DA,0,"GL")_"0)",SP=$P(@ROOT,U,2)
 I X'=NAMENOW K I D PUT^DDSVAL(1,DA,.01,X,.I) Q:$D(I)>1  D
 .S $P(@ROOT,U)=X
 .K ^DD(DA,0,"NM") S ^("NM",X)=""
 F I=2:1:7 D  ;handle the 6 ACCESS CODEs
 .S X=$$G(I)
 .S ^DIC(DA,0,$P("^DD^RD^WR^DEL^LAYGO^AUDIT",U,I))=X
 ;S X=$$G(8) S ^DD(D0,0,"DDA")=$E("NY",X+1)
 S X=$$G(9),SP=$TR(SP,"O")_$E("O",X) ;'ASK OK'?'
 S X=$$G(9.5),^DD(DA,0,"SCR")=X,SP=$TR(SP,"s") I X="" K ^("SCR")
 E  S SP=SP_"s"
 S $P(@ROOT,U,2)=SP
ACTION S X=$$G(10),^DD(DA,0,"ACT")=X I X="" K ^("ACT")
 S X=$$G(11),^DD(DA,0,"DIC")=X I X="" K ^("DIC")
 D:$G(^DD(DA,0,"DIK"))]"" QA^DIU21
 S X=$$G(12) I X]"" D
 .N DMAX,DIR,DICMP,DIKPGM,Y
 .S Y=DA,DMAX=^DD("ROU") D EN^DIKZ
 Q
 ;
G(I) Q $$GET^DDSVALF(I,"DIEDIT",1)
 ;
DIU S DIU=^DIC(DA,0,"GL"),DIU(0)="EDT" Q
 ;
KILLFILE ;
 N DIK,DIC,DQ,DIER,A,DIU
 S DIC="^DIC("
 D DIU F DIK=0:0 S DIK=$O(^DD(1,.01,"DEL",DIK)) Q:'DIK  I $D(^(DIK,0)) X ^(0) I  S DDSERROR=1,DDSBR=.2 D PUT^DDSVALF(.2,"DIEDIT",1,NAMENOW) H 3 G Q ;DELETE logic
 S A=DA,DIK="^DIC(" D
 .N A,DIU D ^DIK ;kill off the File 1 entry
 D 61^DIU0
Q Q
 ;
TEST ;
 S DIC=1,DIC(0)="AEQM" D ^DIC Q:Y<0  S DA=+Y G DIU20

DIU21
DIU21 ;SFISC/XAK-EDIT FILE (PGMR PART) ;06:21 PM  2 Apr 2001
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D:'$D(DISYS) OS^DII Q:$G(^DD("OS",DISYS,18))=""
SCR K DIR S DIR(0)="FOU^3:250",DIR("A")="FILE SCREEN" S:$D(^DD(DA,0,"SCR")) DIR("B")=^("SCR")
 S DIR("?")="IF MUMPS CODE IS ENTERED HERE, IT IS A PERMANENT 'DIC(""S"")' FOR FILE"
 D ^DIR G:$D(DTOUT)!($D(DUOUT)) Q K DIRUT,DIROUT G:X="" ACT
 I "@"'[X D ^DIM I $D(X) S ^DD(DA,0,"SCR")=X S:DIU(0)'["s" $P(@(DIU_"0)"),U,2)=DIU(0)_"s" G ACT
 I $G(X)="@" K ^DD(DA,0,"SCR") S $P(@(DIU_"0)"),U,2)=$TR(DIU(0),"s") W "   "_$$EZBLD^DIALOG(8015) G ACT
 W $C(7),"   ",$$EZBLD^DIALOG(9025) G SCR
ACT K DIR S DIR(0)="FOU^3:250",DIR("A")=$$EZBLD^DIALOG(8013) S:$D(^DD(DA,0,"ACT")) DIR("B")=^("ACT")
 S DIR("?",1)=$$EZBLD^DIALOG(9025),DIR("?")=$$EZBLD^DIALOG(9024)
 D ^DIR G:$D(DTOUT)!($D(DUOUT)) Q K DIRUT,DIROUT G:X="" DIC
 I "@"'[X D ^DIM I $D(X) S ^DD(DA,0,"ACT")=X G DIC
 I $G(X)="@" K ^DD(DA,0,"ACT") W "   "_$$EZBLD^DIALOG(8015) G DIC
 W $C(7),"   ",$$EZBLD^DIALOG(9025) G ACT
DIC K DIR N Y,DIPARAM S DIR(0)="FO^3:8^K:X?1""DI"".E X",DIR("A")=$$EZBLD^DIALOG(8014) S:$G(^DD(DA,0,"DIC"))]"" DIR("B")=^("DIC")
 S DIPARAM=9026,DIPARAM(1)=8 D H,H1
 D ^DIR K DIRUT,DIROUT
 G:$D(DTOUT)!($D(DUOUT)) Q G:X="" DIK
 I X="@" K ^DD(DA,0,"DIC") W "   "_$$EZBLD^DIALOG(8015) G DIK
 I '$$ROUEXIST^DILIBF(X) W $C(7),"   ",$$EZBLD^DIALOG(8017) G DIC
 S ^DD(DA,0,"DIC")=X
DIK S X=$G(^DD(DA,0,"DIKOLD")),Y=$G(^("DIK")) I X]"",X'=Y W !,"   " D BLD^DIALOG(8018,X,"","DIR") W DIR
 K DIR S DIR(0)="FO^3:6^K:X?1""DI"".E X",DIR("A")=$$EZBLD^DIALOG(8019) S:Y]"" DIR("B")=Y
 S DIPARAM=9027,DIPARAM(1)=6 D H,H1
 D ^DIR I X="@" G QA
 G:$D(DIRUT)!(X="") Q
 I $$ROUEXIST^DILIBF(X) W $C(7),! S DIPARAM(1)=X D BLD^DIALOG(8016,.DIPARAM,"","DIR") W DIR
 K DIR N DICMP S DICMP=0 I $G(^DD(DA,0,"DIK"))=""!($G(^("DIK"))'=X) S DICMP=1
 N DIKPGM S DIKPGM=X
 S DIR(0)="YO",DIR("A")=$$EZBLD^DIALOG(8020)
 I 'DICMP S DIR("B")="NO" D BLD^DIALOG(9028,"","","DIR(""?"")")
 I DICMP S DIR("B")="YES" D BLD^DIALOG(9029,"","","DIR(""?"")")
 D ^DIR G Q:$D(DIRUT)
 I 'Y G:'DICMP Q W $C(7) G QA
 S X=DIKPGM,Y=DA,DMAX=^DD("ROU") K DIR,DICMP,DIKPGM G EN^DIKZ
 ;
A N DA S DA=+X N X K ^DD(DA,0,"DIK")
 F X=0:0 S X=$O(^DD(DA,"SB",X)) Q:X'>0  D A
 Q
QA S X=DA D A W "   "_$$EZBLD^DIALOG(8015),!,"   ",$$EZBLD^DIALOG(8021)
Q Q
H ; Build help for entering routine name.
 D BLD^DIALOG(9006,.DIPARAM,"","DIR(""?"")") Q
H1 N I S I=$O(DIR("?",":"),-1) I I S DIR("?",I+1)=DIR("?")
 I DIPARAM=9027 S DIR("?",I+2)=$$EZBLD^DIALOG(9030)
 D BLD^DIALOG(DIPARAM,"","","DIR(""?"")") Q
 ;
DIE ;not in 20
 I $P($G(^DD(DA,0,"DI")),U)["Y" W !,$C(7),"RESTRICT EDITING OF FILE? YES//  (UNEDITABLE) THIS IS AN ARCHIVE FILE." Q
 N DIR,DIEYN S DIR(0)="YO",DIR("A")="RESTRICT EDITING OF FILE",DIR("B")=$S($P($G(^DD(DA,0,"DI")),U,2)["Y":"YES",1:"NO")
 S DIR("?",1)="YES will not allow editing or deleting existing file entries or adding new file     entries",DIR("?")="NO  will place no restrictions on the file"
 D ^DIR Q:$D(DTOUT)!$D(DUOUT)
 S DIEYN=$S(Y:"Y",1:"N")
 D DIE1 Q:$D(DTOUT)!($D(DUOUT))  G:'$D(DIEYN) DIE
 S $P(^DD(DA,0,"DI"),U,2)=DIEYN
 Q
DIE1 Q:Y&($E(DIR("B"))="Y")  Q:'Y&($E(DIR("B"))="N")
 I Y W !,$C(7),"WARNING- DATA IN THIS FILE IS NOW UNEDITABLE"
 I 'Y W !,$C(7),"WARNING- DATA IN THIS FILE IS NOW EDITABLE"
 K DIR S DIR(0)="Y",DIR("A")="ARE YOU SURE"
 D ^DIR Q:$D(DTOUT)!$D(DUOUT)  K:'Y DIEYN
 Q
 ;
 ;DIALOG #8013  'POST-SELECTION ACTION'
 ;       #8014  'LOOK-UP PROGRAM'
 ;       #8015  'Deleted.'
 ;       #8016  'Note that...is already in the routine directory.'
 ;       #8017  'This routine does not exist in the routine directory.'
 ;       #8018  'Previously compiled under routine name...'
 ;       #8019  'CROSS-REFERENCE ROUTINE'
 ;       #8020  'Should the compilation run now'
 ;       #8021  'The compiled routines will no longer be used...'
 ;       #9006  'Enter a valid MUMPS routine name of from 3 to...'
 ;       #9024  'This code will be executed whenever an entry is...'
 ;       #9025  'Enter a line of standard MUMPS code'
 ;       #9026  'This special lookup routine will be executed...'
 ;       #9027  'if a NEW routine name is entered, but the cross-ref...'
 ;       #9028  'It is not necessary to recompile the cross-ref...'
 ;       #9029  'If the cross-references are not recompiled...'
 ;       #9030  'This will become the namespace of the compiled routine'

DIU3
DIU3 ;SFISC/GFT-IDENTIFIERS ;05:46 PM  7 Aug 2002
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
3 ;
 S %=2,X="W """"",DA=+Y
 I $D(^DD(DI,0,"ID",+Y)) W !,"'",$P(Y,U,2),"' is already an Identifier; Want to delete it" D YN^DICN Q:%'=1  K ^DD(DI,0,"ID",+Y) D:$D(DDA) A Q
 S %=$O(^DD("KEY","AP",DI,"P",0)) I %,$O(^DD("KEY",%,2,"B",+Y,0)) D
 . W !!,$C(7),"  **NOTE:'"_$P(Y,U,2)_"' is part of the PRIMARY KEY for this file."
 . W !,"  Making it an Identifier is redundant.",! Q
 S %=2 W !,"Want to make '",$P(Y,U,2),"' an Identifier" D YN^DICN Q:%-1
 S %=$O(^DD(DI,0,"NM",0))
 W !,"Want to display "_$P(Y,U,2)_" whenever a lookup is done",!,"  on an entry in the '"_%_"' File" S %=1 D YN^DICN
 I %-1 G S:%=2&(Y-.001) W $C(7),"??" Q
 S V=$P(Y(0),U,2),X=$P(Y(0),U,4),D="W",%="(^(0)",%Y=$P(X,";")
 I %Y'=0 S D=$S(+%Y=%Y:"",V["S":"""""",1:""""),%="(^("_D_%Y_D_")",D="W"_$S(+Y'=.001:":$D(^("_$E(D)_%Y_$E(D)_"))",1:"")
 S %Y=$P(X,";",2),X=$S(+Y=.001:"Y",%Y:"$P"_%_",U,"_%Y_")",1:"$E"_%_","_+$E(%Y,2,9)_","_$P(%Y,",",2)_")")
EGP I V["D" S X="$$NAKED^DIUTL(""$$DATE^DIUTL("_X_")"")" ;**CCO/NI  DATE-TYPE IDENTIFIER USES ^DD("DD")!
 I V["P" S X="S %I=Y,Y=$S('$D"_%_"):"""",$D(^"_$P(Y(0),U,3)_"+"_X_",0))#2:$P(^(0),U,1),1:""""),C=$P(^DD("_+$P(V,"P",2)_",.01,0),U,2) D Y^DIQ:Y]"""" W ""   "",Y,@(""$E(""_DIC_""%I,0),0)"") S Y=%I K %I" G S
 I V["V" S X=$P(Y(0),U,4),X="S DIY=$S($D(@(DIC_(+Y)_"","""""_$P(X,";",1)_""""")"")):$P(^("""_$P(X,";",1)_"""),U,"_$P(X,";",2)_"),1:"""") D NAME^DICM2 W ""   "",DINAME,@(""$E(""_DIC_""Y,0),0)"")" G S
 I V["S" S X="@(""$P($P($C(59)_$S($D(^DD("_DI_","_+Y_",0)):$P(^(0),U,3),1:0)_$E(""_DIC_""Y,0),0),$C(59)_"_X_"_"""":"""",2),$C(59),1)"")"
 S X=D_" ""   "","_X
S S ^DD(DI,0,"ID",+Y)=X,X=DIU I $D(DDA) S A0="IDENTIFIER^",A1="",A2="ID" D IT^DICATTA
 I N S V=N,P=$O(^DD(J(N-1),"SB",DI,0)) S:P="" P=-1 S X="^DD(J(N-1),P,"
 S @("X="_X_"0)"),%=$P(X,U,2) I %'["I" S ^(0)=$P(X,U)_U_%_"I"_U_$P(X,U,3,99)
 I N S DIFLD=+Y D WAIT^DICD,0^DIVR S:DE?.E1"  " DE=$E(DE,1,$L(DE)-2) X DE K DE,DA,X,W,DIFLD
 Q
 ;
A S A0="IDENTIFIER^",A1="ID",A2="" D IT^DICATTA K A0,A1,A2 Q
 ;

DIU31
DIU31 ;SFISC/GFT-UNEDITABLE, INPUT TRANS., OUTPUT TRANS. ;10APR2003
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
9 ;
 S %=2,DA=+Y
 I $P(Y(0),U,2)["I" W !,$C(7),"FIELD IS ALREADY UNEDITABLE",!,"DO YOU WANT TO ALLOW EDITING AGAIN" D YN^DICN Q:%-1  S X=$P(^(0),U,2),^(0)=$P(^(0),U,1)_U_$P(X,"I",1)_$P(X,"I",2)_$P(X,"I",3)_U_$P(^(0),U,3,99) W "  ..OK" S %=1 G 2
 W !,"WANT TO PREVENT ALL USERS FROM CHANGING OR DELETING DATA VALUES",!
 W "THAT ARE ENTERED FOR THE '"_$P(Y,U,2)_"' FIELD" D YN^DICN Q:%-1  S ^(0)=$P(^(0),U,1,2)_"I^"_$P(^(0),U,3,99) W $C(7),!?9,"...FIELD IS NOW UNEDITABLE!" S %=2
2 I $D(DDA) S A0="UNEDITABLE^",(A1,A2)="",@("A"_%)="I" D IT^DICATTA
 G DIEZ^DIU0
 ;
5 W !,$P(Y,U,2) S DA=+Y,Y=$P(Y(0),U,5,99) S:$D(DDA) DDA=Y
 W " INPUT TRANSFORM: ",Y D RW^DIR2 G MORE:X="" S %=$L($P(Y(0),U,1,4))+$L(X) I %>244 W !!?5,$C(7),"Input Transform is TOO LONG by ",%-244," characters.",! K X S Y=DA_U_$P(Y(0),U) G 5
 I $P(Y(0),U,2)["K",X'[" ^DIM" K X S Y=DA_U_$P(Y(0),U) W $C(7),!?5,"Input Transform must contain D ^DIM",! G 5
 I $P(Y(0),U,2)["F",X["DINUM" W $C(7),!?5,"DINUM on a Freetext field can cause database",!?5,"problems unless you are sure DINUM is numeric."
 D ^DIM I '$D(X) W $C(7),"??" S Y=DA_U_$P(Y(0),U) G 5
 S ^DD(DI,DA,0)=$P(Y(0),U,1,2)_$E("X",$P(Y(0),U,2)'["X")_U_$P(Y(0),U,3,4)_U_X
 I $D(DDA),DDA'=X S A0="INPUT TRANSFORM^.5",A1=DDA,A2=X D IT^DICATTA
 I $P(Y(0),U,2)["C" D PZ^DIU0 G Q
MORE I $P(Y(0),U,2)["C" G Q
 S DIE=DIC,DR="3:4" I $P(Y(0),U,2)["P" S %=$F(X," D ^DIC") I % S X=$E(X,1,%-8),%=$F(X,"DIC(""S"")=") I % S X=$E(X,%-9,$L(X)),^(12.1)="S "_X,DR=DR_";12EXPLANATION OF SCREEN"
 F %=3,4,12.1 S:$D(^DD(DI,DA,%)) ^UTILITY("DDA",$J,DI,DA,%)=^(%)
 D  D IT1^DICATTA,DIEZ^DIU0,LENGTH^DICATT2(DI,DA) G Q
 .N DI D ^DIE
  ;
O S DIK=1,DJJ=+Y W !,$P(Y,U,2)_" OUTPUT TRANSFORM: "
 I '$D(^DD(DI,DJJ,2)) R X:DTIME I '$T S DTOUT=1 G Q
 I $D(^(2)) S (DIK,Y)=^(2) S:$D(DDA) DDA=Y S:$D(^(2.1)) Y=^(2.1) W Y D RW^DIR2 I X="@" W !?9,"DELETED!" K ^(2),^(2.1) S Y=$P(^(0),U,2),$P(^(0),U,2)=$P(Y,"O")_$P(Y,"O",2),%="" G EX
 G Q:X="" I X?."?" S Y=DJJ_U_$P(^(0),U) W !?4,"Enter a computed-field expression using '"_$P(Y,U,2)_"'",! W:DUZ(0)="@" ?4,"or MUMPS code that takes Y and transforms it to a different Y.",! G O
 K ^(2) S DICOMPX(1,DI,DJJ)="Y(0)",DA=DIC_DJJ_",2,",DGG=X,DQI="Y("
 D ^DICOMP K DQI,DICOMPX F %=9.2:.1 Q:'$D(X(%))  S @(DA_"%)=X(%)")
 I $D(X) S ^DD(DI,DJJ,2)="S Y(0)=Y "_X_$P(" S Y=X",U,Y'["X"),^(2.1)=DGG S:$P(^(0),U,2)'["O" $P(^(0),U,2)=$P(^(0),U,2)_"O" S %=^(2) G EX
 S:'DIK ^DD(DI,DJJ,2)=DIK
X W $C(7),"??" Q
 ;
EX S DA=DJJ I $D(DDA),DDA'=% S A1=DDA,A2=%,A0="OUTPUT TRANSFORM^2" D IT^DICATTA
 D PZ^DIU0
Q G Q^DIU

DIU4
DIU4 ;SFISC/XAK-SPECIFIER ;6/11/93  2:29 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 W ! S DIU=Y K DIR G S:'$D(^DD(DI,0,"SP",+Y))
 S DIR("A",1)=$P(DIU,U,2)_" is already a specifier."
 S DIR("A")="Do you want to delete it"
 S DIR("??")="^W !!?5,""Deleting a specifier means that this field will not be used"",!?5,""in trying to match entries going from one system to another."""
 S DIR("B")="NO",DIR(0)="Y" D ^DIR G Q:$D(DTOUT)!$D(DUOUT),E:'Y
 K:Y ^DD(DI,0,"SP",+DIU) G Q
S S DIR("A")="Want to make "_$P(Y,U,2)_" a specifier"
 S DIR("??")="^W !!?5,""Making this field a specifier means that it will be used in"",!?5,""finding a specific entry when it is sent from one system to another."""
 S DIR("B")="NO",DIR(0)="Y" D ^DIR G Q:$D(DIRUT)!'Y
E K DIR("A") S DIR("A")="Is the value of this field unique for each entry"
 S DIR("??")="^W !!?5,""If this field is unique, then each entry in the file"",!?5,""has a different "_$P(DIU,U,2)_"."""
 D ^DIR G Q:$D(DIRUT) S:Y!('Y&(+DIU'=.01)) ^DD(DI,0,"SP",+DIU)=$S(Y:Y,1:"") G Q:'Y
 K DIR S DIR(0)="SO^"
 F %=0:0 S %=$O(^DD(DI,+DIU,1,%)) Q:+%'=%  I $D(^(%,0)),+^(0) S DIR(0)=DIR(0)_%_":"_$P(^(0),U,2)_"  "_$S($P(^(0),U,3)]"":$P(^(0),U,3),1:"REGULAR")_";"
 I $P(DIR(0),U,2)="" K:+DIU=.01 ^DD(DI,0,"SP",+DIU) G Q
 S DIR("?")="Enter one of the cross-references in the list, or press return."
 S DIR("A",1)="If one of the above provides a direct lookup by "_$P(DIU,U,2)_","
 S DIR("A")="please enter its number or name"
 D ^DIR I '$D(DTOUT),'$D(DUOUT) S ^DD(DI,0,"SP",+DIU)="1^"_$S(Y:$P(Y(0)," "),1:"")
 I $D(DIRUT),(+DIU=.01) K ^DD(DI,0,"SP",+DIU)
Q K DUOUT,DTOUT,C,DIR,DIRUT,DIROUT
 Q

DIU5
DIU5 ;SFISC/TKW-QUERY CONDITION EXTRINSIC FUNCTIONS ;8/27/93  13:41
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
BEF(X,Y,N) ; X BEFORE Y
 I $G(N)="'" G:Y']]X Q1 Q 0
 G:Y]]X Q1 Q 0
Q1 Q 1
AFT(X,Y,N) ; X AFTER Y
 I $G(N)="'" G:X']]Y Q1 Q 0
 G:X]]Y Q1 Q 0
BTWI(X,Y,Z,N) ;X BETWEEN INCLUSIVE Y & Z
 I $G(N)="'" G:Y]]X Q1 G:X]]Z Q1 Q 0
 G:(Y']]X)&(X']]Z) Q1 Q 0
BTWE(X,Y,Z,N) ;X BETWEEN EXCLUSIVE Y & Z
 I $G(N)="'" G:X']]Y Q1 G:Z']]X Q1 Q 0
 G:(X]]Y)&(Z]]X) Q1 Q 0
EQ(X,Y,N) ;X EQUALS Y
 I $G(N)="'" G:X'=Y Q1 Q 0
 G:X=Y Q1 Q 0
NULL(X,N) ;X IS NULL
 I $G(N)="'" G:X'="" Q1 Q 0
 G:X="" Q1 Q 0

DIUTL
DIUTL ;GFT/GFT - TIMSON'S UTILITIES;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
NAKED(DIUTLREF) ;The argument is evaluated and returned, while keeping the naked reference as it was!
 N DIUTLNKD S DIUTLNKD=$NA(^(0))
 X "S DIUTLREF="_DIUTLREF
 D  Q DIUTLREF
 .I $D(@DIUTLNKD)
 ;
 ;
DATE(Y) ;**CCO/NI   RETURN A DATE
 I Y X ^DD("DD")
 Q Y
 ;
 ;
NOWINT() ;INTERNAL VERSION OF NOW
 N %,%I,%H,%M,%D,%Y,X
 D NOW^%DTC Q %
 ;
 ;
NOW() ;EXTERNAL NOW
 N X S X=$$NOWINT Q $$DATE(X-(X#.0001))
 ;
 ;
WP(DIRF,DIWL,DIWR,DIWPUT) ;Write out WP field (if any) stored at DIRF, or put it in DIWPUT array
 N DIWF,Z,A1,D,X,DIW,DIWT,DN,I,DIWI,DIWTC,DIWX
 K ^UTILITY($J,"W")
 S DIWF=$E("W",'$D(DIWPUT))_"|" S:'$G(IOM) IOM=80 S:'$G(DIWR) DIWR=IOM S:'$G(DIWL) DIWL=1
 S A1=$P($G(@DIRF@(0)),U,3) F D=0:0 S D=$O(@DIRF@(D)) Q:D>A1&A1!'D  S X=^(D,0) D ^DIWP G QWP:$G(DN)=0
 I $G(DIWPUT)]"" D  Q 1
 .K @DIWPUT M @DIWPUT=^UTILITY($J,"W")
 D ^DIWW
QWP I $G(DN)'=0 Q 1
 K DIOEND Q 0
 ;
IJ(N) ;build I & J arrays given subfile number N
 N A K I,J
 S J(0)=N,N=0
0 I $D(^DIC(J(0),0,"GL")) S I(0)=^("GL") Q
 S A=$G(^DD(J(0),0,"UP")) Q:A=""
 S I=$O(^DD(A,"SB",J(0),0)) Q:'I
 S I=$P($P($G(^DD(A,I,0)),U,4),";") Q:I=""
 I +I'=I S I=""""_I_""""
 F J=N:-1:0 S J(J+1)=J(J) S:J I(J+1)=I(J)
 S J(0)=A,I(1)=I,N=N+1 G 0
 ;
 ;
DIVR(DI,DIFLD) ;verify
 N DIVZ,S,A,DA,DICL,V,Z,DDC,DR,N,Y,I,J,Q,W,V,T,DQI
 K ^UTILITY("DIVR",$J),^DD(U,$J)
 D IJ(DI)
 I '$O(@(I(0)_"0)")) Q  ;File must have some entries!
 S S=";",Q="""",V=$O(J(""),-1),A=DI,DA=DIFLD
 S DR=$P(^DD(DI,DIFLD,0),U,2),Z=$P(^(0),U,3),$P(Y(0),U,4)=$P(^(0),U,4),DDC=$P(^(0),U,5,999)
 Q:DR["W"!(DR["C")
 F T="N","S","V","P","K","F" Q:DR[T
 W !!,"SINCE YOU HAVE CHANGED THE FIELD DEFINITION,",!,"EXISTING '",$P(^(0),U),"' DATA WILL NOW BE CHECKED FOR INCONSISTENCIES",!,"OK"
 S %=1 D YN^DICN Q:%-1
 ;D ^%ZIS Q:POP
 ;U IO   WON'T WORK BECAUSE Q+3^DIVR ASKS TO STORE IN TEMPLATE
 D EN^DIVR(DI,DIFLD)
 ;D ^%ZISC
 Q

DIV
DIV ;SFISC/GFT-VERIFY FLDS ;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIUTIL,DIVDAT,DIVFIL,DIVMODE,DIVPG,POP S DIUTIL="VERIFY FIELDS"
 K J
 S V=0,P=0,I(0)=DIU,@("(A,J(0))=+$P("_DIU_"0),U,2)")
 I $O(^(0))'>0 W $C(7),"  NO ENTRIES ON FILE!" Q
DIC S DIC="^DD("_A_",",DIC(0)="EZ",DIC("W")="W:$P(^(0),U,2) ""  (multiple)"""
 S DIC("S")="S %=$P(^(0),U,2) I %'[""C"",$S('%:1,1:$P(^DD(+%,.01,0),U,2)'[""W"")"
 W !,"VERIFY WHICH "_$P(^DD(A,0),U)_": " R X:DTIME Q:U[X
 I X="ALL" D ALL G Q:$D(DIRUT) I Y S DIVMODE="A" D DEVSEL G:$G(POP) Q D INIT,ALLFLDS(A) G Q^DIVR:DQI'>0!$D(DIRUT)
 D ^DIC K DQI,^UTILITY("DIVR",$J)
 I Y<0 W:X?1."?" !?3,"You may enter ALL to verify every field at this level of the file.",! G DIC
 S DR=$P(Y(0),U,2) I DR S J(V)=A,P=+Y,V=V+1,A=+DR,I(V)=$P($P(Y(0),U,4),";") S:+I(V)'=I(V) I(V)=""""_I(V)_"""" G DIC
 D DEVSEL G:$G(POP) Q D INIT
 D EN^DIVR(A,+Y)
Q K DIR,DIRUT,N,P
 Q
 ;
ALL S DIR(0)="Y",DIR("??")="^D H^DIV"
 S DIR("A")="DO YOU MEAN ALL THE FIELDS IN THE FILE"
 D ^DIR K DIR S X="ALL"
 Q
 ;
 ;
 ;
ALLPOINT ;
 N A,DIRUT D DEVSEL Q:$G(POP)
 F A=1.9:0 S A=$O(^DIC(A)) Q:'A  D INIT,ALLFLDS(A,"PV") Q:$D(DIRUT)
 Q
 ;
ALLFLDS(A,DIVRTYPE) S DQI=0 F  S DQI=$O(^DD(A,DQI)) Q:DQI'>0  S Y=DQI,Y(0)=^(Y,0),DR=$P(Y(0),U,2) D  Q:$D(DIRUT)
 .I DR Q:$P(^DD(+DR,.01,0),U,2)["W"  D NEXTLVL Q
 .I $G(DIVRTYPE)]"",$TR(DR,DIVRTYPE)=DR Q
 .I DR["C" Q
 .W !!!,"--",A,",",Y D EN^DIVR(A,Y,1) Q
 Q
NEXTLVL ;
 N A,P,DE,DA,DQI,I,J,V S DQI=0
 S A=+DR,P=+Y N Y,DR D IJ^DIVU(A)
 D ALLFLDS(A,$G(DIVRTYPE))
 Q
H W !!?5,"YES means that every field at this level in the file will"
 W !?5,"be checked to see if it conforms to the input transform."
 W !!?5,"NO means that ALL will be used to lookup a field in the"
 W !?5,"file which begins with the letters ALL, e.g., ALLERGIES."
 Q
VER(DIVRFILE,DIVRREC,DIVRDR,DIVROUT) ;
 ;DIVRFILE = (sub)file number
 ;DIVRREC = template, or ien-string of records to be verified
 ;DIVRDR = list of fields to be verified (defaults to ALL)
 ;DIVROUT = output array listing the records that had problems
 G ^DIVR1
DIVROUT I $G(DIVROUT)="" D X Q
 I $E(DIVROUT)="[" D  Q
 . N Y,COUNT,Z
 . D DIBT^DIVU(DIVROUT,.Y,DIVRFI0) Q:Y'>0
 . K ^DIBT(+Y,1)
 . S (COUNT,Z)=0
 . F  S Z=$O(^TMP("DIVR1",$J,Z)) Q:Z=""  S COUNT=COUNT+1,^DIBT(+Y,1,Z)=""
 . I COUNT S ^DIBT(+Y,"QR")=DT_U_COUNT
 . D X
 M @DIVROUT@(1)=^TMP("DIVR1",$J)
X K ^TMP("DIVR1",$J)
 Q
 ;
INIT ;Get header info and print first header
 N %,%H,X,Y
 K DIRUT
 ;
 S %H=$H D YX^%DTC
 S DIVDAT=$P(Y,"@")_"  "_$P($P(Y,"@",2),":",1,2)_"    PAGE "
 ;
 I $D(^DIC(A,0))#2 S DIVFIL=$P(^(0),U)_" FILE (#"_A_")"
 E  I $D(^DD(A,0,"NM")) S DIVFIL=$O(^("NM",""))_" SUB-FILE (#"_A_")"
 E  S DIVFIL=""
 ;
 U IO
 W:IOST?1"C-".E @IOF
 D HDR^DIVR
 Q
 ;
DEVSEL ;Prompt for device
 D  Q:$G(POP)
 . N %ZIS,A,I,J,T,V,X,Y,Z
 . S %ZIS=$E("Q",$D(^%ZTSK)>0)
 . W ! D ^%ZIS
 ;
 I $D(IO("Q")),$D(^%ZTSK) D  S POP=1
 . S ZTRTN="ENQUEUE^DIV"
 . S ZTDESC="Verify Fields Report for File #"_A
 . N %,DIVA,DIVI,DIVJ,DIVT,DIVV,DIVY,DIVZ
 . M DIVA=A,DIVI=I,DIVJ=J,DIVT=T,DIVV=V,DIVY=Y,DIVZ=Z
 . F %="DIU","DIUTIL","DIVMODE","DIVA","DIVI","DIVI(","DIVJ","DIVJ(","DIVV","DIVZ" S ZTSAVE(%)=""
 . I $G(DIVMODE)'="A" F %="DIVY","DIVY(","DR" S ZTSAVE(%)=""
 . I $G(DIVMODE)="C" F %="DA","DDC","DIFLD","DIVT" S ZTSAVE(%)=""
 . D ^%ZTLOAD
 . I $D(ZTSK)#2 W !,"Report queued!",!,"Task number: "_$G(ZTSK),!
 . E  W !,"Report canceled!",!
 . K ZTSK
 . S IOP="HOME" D ^%ZIS
 Q
 ;
ENQUEUE ;Entry point for queued reports
 M A=DIVA,I=DIVI,J=DIVJ,T=DIVT,V=DIVV,Y=DIVY,Z=DIVZ
 K DIVA,DIVI,DIVJ,DIVT,DIVV,DIVY,DIVZ
 S Q="""",S=";"
 ;
 D INIT
 I $G(DIVMODE)="A" D ALLFLDS(A),Q^DIVR Q
 I $G(DIVMODE)="C" D EN^DIVR(A,DA) Q
 D EN^DIVR(A,+Y)
 Q

DIVC
DIVC ;SFISC/MKO-VERIFY INDEXES/KEYS ;2:47 PM  23 Jan 1998
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;============================================
 ; VINDEX(file,record,field,flag,.index,.key)
 ;============================================
 ;Programmer entry point to check the existence of indexes and
 ;key integrity for a single file/field/record. (Currently not used)
 ;In:
 ; DIFILE = file or subfile # (required)
 ; DIREC  = DA array or IENS (required)
 ; DIFLD  = field # (required)
 ; DIFLAG [ D : generate dialog errors
 ;Out:
 ; For invalid indexes/keys:
 ; .DIINDEX(indexName,index#) = "" : if an index is not set
 ; .DIKEY(file#,keyName,uiNumber) = null : if a key field is null
 ;                                  uniq : if a key not unique
 ;
VINDEX(DIFILE,DIREC,DIFLD,DIFLAG,DIINDEX,DIKEY) ;
 N DA,DIROOT,DIVCTMP,DIVERR
 ;
 ;Initialization
 S DIFLAG=$G(DIFLAG),DIVERR=0
 I DIFLAG["D",'$D(DIQUIET) N DIQUIET S DIQUIET=1
 I DIFLAG["D",'$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
 ;
 ;Check and convert input paramaters
 D CHK Q:DIVERR
 ;
 ;Load xref info
 S DIVCTMP=$$GETTMP^DIKC1("DIVC")
 D LOADVER(DIFILE,DIFLD,DIVCTMP)
 ;
 D VER(DIFILE,DIROOT,.DA,DIVCTMP,.DIINDEX,.DIKEY)
 K @DIVCTMP
 Q
 ;
 ;=========================================
 ; VER(file#,fileRoot,.DA,tmp,.index,.key)
 ;=========================================
 ;Check that index is set. If index is a uniqueness index also
 ;check that key is unique, and that key fields are non-null.
 ;Called from INDEX^DIVR.
 ;In:
 ;  DIFILE  = [sub]file #
 ;  DIROOT  = closed [sub]file root
 ; .DA      = DA array
 ;  DIVCTMP = root where xref info and verification logic is stored
 ;Out:
 ; .DIINDEX = see VINDEX above
 ; .DIKEY   = see VINDEX above
 ;
VER(DIFILE,DIROOT,DA,DIVCTMP,DIINDEX,DIKEY) ;
 N DICHECK,DINULL,DIXR,DIXRNAM,X,X1,X2
 N KEY,KFIL,KNAM,UNIQ
 ;
 ;Loop through the xrefs loaded in @DIVCTMP
 S DIXR=0 F  S DIXR=$O(@DIVCTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR  D
 . S DIXRNAM=$P(@DIVCTMP@(DIFILE,DIXR),U)
 . D SETXARR^DIKC(DIFILE,DIXR,DIVCTMP,.DINULL) M X1=X,X2=X
 . ;
 . ;If no X values are null, but no index, set DIINDEX(name,xref#)
 . I 'DINULL D
 .. S DICHECK=$G(@DIVCTMP@(DIFILE,DIXR,"V"))
 .. I DICHECK]"" X DICHECK E  S DIINDEX(DIXRNAM,DIXR)=""
 . ;
 . ;If the xref is a uniqueness index for a key, set DIKEY() if
 . ;key is not unique, or a key field is null.
 . I $D(^DD("KEY","AU",DIXR)) D
 .. S UNIQ=$S(DINULL:0,1:$$UNIQUE^DIKK2(DIFILE,DIXR,.X,.DA,DIVCTMP))
 .. I 'UNIQ S KEY=0 F  S KEY=$O(^DD("KEY","AU",DIXR,KEY)) Q:'KEY  D
 ... Q:$D(^DD("KEY",KEY,0))[0  S KFIL=$P(^(0),U),KNAM=$P(^(0),U,2)
 ... S DIKEY(KFIL,KNAM,DIXRNAM)=$S(DINULL:"null",1:"uniq")
 Q
 ;
 ;=============================
 ; CHK: Check input parameters
 ;=============================
 ;Out:
 ; DA     = DA array
 ; DIFILE = File #
 ; DIROOT = Closed file root
 ; DIVERR = 1 : if there's a problem
 ;
CHK ;File is a required input parameter
 I $G(DIFILE)="" D:DIFLAG["D" ERR^DIKCU2(202,"","","","FILE") D ERR Q
 I $G(DIFLD)="" D:DIFLAG["D" ERR^DIKCU2(202,"","","","FIELD") D ERR Q
 ;
 ;Check DIREC and set DA array
 N DIIENS
 I $G(DIREC)'["," M DA=DIREC S DIIENS=$$IENS^DILF(.DA)
 E  S:DIREC'?.E1"," DIREC=DIREC_"," D DA^DILF(DIREC,.DA) S DIIENS=DIREC
 I '$$VDA^DIKCU1(.DA,DIFLAG_"R") D ERR Q
 ;
 ;Check DIFLD
 I '$$VFLD^DIKCU1(DIFILE,DIFLD,DIFLAG) D ERR Q
 ;
 ;Set DIFILE and DIROOT
 N DILEV
 I DIFILE=+$P(DIFILE,"E") D
 . S DIROOT=$$FROOTDA^DIKCU(DIFILE,DIFLAG,.DILEV) I DIROOT="" D ERR Q
 . I DILEV,$D(DA(DILEV))[0 D  Q
 .. D:DIFLAG["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR
 . S:DILEV DIROOT=$NA(@DIROOT)
 . S DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG) I DIFILE="" D ERR
 E  D
 . S DIROOT=DIFILE
 . S:"(,"[$E(DIROOT,$L(DIROOT)) DIROOT=$$CREF^DILF(DIFILE)
 . S DIFILE=$$FNUM^DIKCU(DIROOT,DIFLAG) I DIFILE="" D ERR Q
 . S DILEV=$$FLEV^DIKCU(DIFILE,DIFLAG) I DILEV="" D ERR Q
 . I DILEV,$D(DA(DILEV))[0 D  Q
 .. D:DIFLAG["D" ERR^DIKCU2(205,"",$$IENS^DILF(.DA),"",DIFILE) D ERR
 Q
 ;
ERR ;Set error flag
 S DIVERR=1
 Q
 ;
 ;============================
 ; LOADVER(file#,field#,tmp)
 ;============================
 ;Load xref info and verification logic for file/field into @TMP.
 ;Also, for each regular xref with no set condition, set
 ;  @TMP@(rootFile#,xref#,"V")=I $D(^index),^index=indexVal
 ; where,
 ;  index    = something like DIZ(9999,"BB",X(1),X(2),DA)
 ;  indexVal = value of index, usually ""
 ;
 ;In:
 ; FILE  = File #
 ; FIELD = Field #
 ; TMP   = Root to store logic
 ;
LOADVER(FILE,FIELD,TMP) ;Load indexes into TMP array
 N FIL,KL,SL,XR
 ;
 ;Load xref info for file/field into @TMP
 D LOADFLD^DIKC1(FILE,FIELD,"KS","","",TMP,TMP)
 ;
 ;Set the "V" nodes, kill the "S" and "K" nodes
 S FIL=0 F  S FIL=$O(@TMP@(FIL)) Q:'FIL  D
 . S XR=0 F  S XR=$O(@TMP@(FIL,XR)) Q:'XR  D
 .. I $P(@TMP@(FIL,XR),U,4)'="R"!$D(@TMP@(FIL,XR,"SC")) K @TMP@(FIL,XR) Q
 .. S SL=$G(@TMP@(FIL,XR,"S")),KL=$G(@TMP@(FIL,XR,"K"))
 .. I SL?1"S ^"1.E,KL?1"K ^"1.E D
 ... S @TMP@(FIL,XR,"V")="I $D("_$E(KL,3,999)_")#2,"_$E(SL,3,999)
 .. K @TMP@(FIL,XR,"S"),@TMP@(FIL,XR,"K")
 Q
 ;
 ;#202  The input parameter that identifies the |1| is missing or invalid.
 ;#601  The entry does not exist.

DIVR
DIVR ;GFT/GFT -- VERIFY FIELD DIFLD, DATA DICTIONARY A;24JAN2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN(A,DIFLD,DQI) ; Main Entry Point
 I $D(DIVFIL)[0 N DIVDAT,DIVFIL,DIVMODE,DIVPG,POP D  G:$G(POP) Q^DIV
 . S DIVMODE="C"
 . D DEVSEL^DIV Q:$G(POP)
 . D INIT^DIV
 N W,I,J,V,DIVREQK,DIVTYPE,DIVTMP,DG,DIVRIX,T,TYP,E,DDC,DIVZ,DE,DR,P4,M,DIDANGL,DIVROUTT
 S TYP=$P($G(^DD(A,DIFLD,0)),U,2) I TYP="" Q
 D IJ^DIUTL(A) S V=$O(J(""),-1)
 F T="N","D","P","S","V","F" Q:TYP[T
 F W="FREE TEXT","SET OF CODES","DATE","NUMERIC","POINTER","VARIABLE POINTER","K" I TYP[$E(W) S:W="K" T=W,W="MUMPS" Q
 I TYP["C" Q
 W "--FIELD #",DIFLD," ",$$LABEL^DIALOGZ(A,DIFLD),"--  (",W,")"
 S W="W !,""ENTRY#"_$S(V:"'S",1:"")_""",?10,"""_$$LABEL^DIALOGZ(A,.01)_""",?40,""ERROR"",!"
 D LF Q:$D(DIRUT)  S T=$E(T),DIVZ=$P(^DD(A,DIFLD,0),U,3),DDC=$P(^(0),U,5,999),DR=$P(^(0),U,2),P4=$P(^(0),U,4)
OUTT I $G(^(2))]"" S DIVROUTT=^(2)
 S DIVREQK=$D(^DD("KEY","F",A,DIFLD))>9
 I $D(^DD("IX","F",A,DIFLD)) D
 . S DIVTYPE=T,T="INDEX",DIVROOT=$$FROOTDA^DIKCU(A)
 . D LOADVER^DIVC(A,DIFLD,"DIVTMP")
 F %=0:0 S %=$O(^DD(A,DIFLD,1,%)) Q:%'>0  I $D(^(%,1)) D
 .N X S X=$P(^(0),U,2,9) Q:X'?1.A
 .I ^(2)?1"K ^".E1")",^(1)?1"S ^".E D
 ..S DG(%)="I $D("_$E(^(2),3,99)_"),"_$E(^(1),3,99) I 'V S DIVRIX(X)="" ;Only looks at top-level X-refs
UNIQ ..I DR["U",DIFLD=.01,X="B" S DDC="K % M %="_DIU_"""B"",X) K %(DA) K:$O(%(0)) X I $D(X) "_DDC
 I T'="INDEX",'$D(^(+$O(^DD(A,DIFLD,1,0)),1)) G E
 I T'="INDEX",'$D(DG) W $C(7)_"(CANNOT CHECK"
 E  W "(CHECKING"
 W " CROSS-REFERENCE)" D LF I $D(DIRUT) Q:$D(DQI)  G Q
 I $D(DG) D
 . I T="INDEX" S E=DIVTYPE,DIVTYPE="IX"
 . E  S E=T,T="IX"
E F Y=$F(DDC,"%DT="""):1 S X=$E(DDC,Y) Q:""""[X  I X="E" S $E(DDC,Y)="" Q  ;Take out "E"
 I DR["*" S DDC="Q" I $D(^DD(A,DIFLD,12.1)) X ^(12.1) I $D(DIC("S")) S DDC(1)=DIC("S"),DDC="X DDC(1) E  K X"
 D 0 S X=P4,Y=$P(X,";",2),X=$P(X,";")
 I +X'=X S X=""""_X_"""" I Y="" S DE=DE_"S X=DA D R" G XEC
 S DIDANGL="S X=$S($D(^(DA,"_X_")):$"_$S(Y:"P(^("_X_"),U,"_Y,1:"E(^("_X_"),"_$E(Y,2,9))_"),1:"""")",M=DIDANGL_" D R"
 I $L(M)+$L(DE)>250 S DE=DE_"X DE(1)",DE(1)=M
 E  S DE=DE_M
XEC K DIC,M,Y XECUTE DE_"  Q:$G(DIRUT)" Q:$G(DIRUT)
 ;
DANGL S DIVRIX="A" F  S DIVRIX=$O(DIVRIX(DIVRIX)) Q:DIVRIX=""  D  ;LOOK FOR BAD CROSS-REFERENCES
 .N IX,SN,SX,DA
 .S IX=I(0)_""""_DIVRIX_""")",SN=$QL(IX)
 .K ^UTILITY("DIVRIX",$J)
 .F  S IX=$Q(@IX) Q:IX=""  Q:$QS(IX,SN)'=DIVRIX  D
 ..I @IX]"" Q
 ..S DA=$QS(IX,SN+2),SX=" """_DIVRIX_""" CROSS-REF '"_$QS(IX,SN+1)_"'"
 ..I '$D(@(I(0)_DA_")")) S M="DANGLING"_SX D X Q
 ..X DIDANGL I $E($QS(IX,SN+1),1,30)'=$E(X,1,30) S M="WRONG"_SX D X Q
 ..I $D(^UTILITY("DIVRIX",$J,DA)) S M="DUPLICATE"_SX D X
 ..S ^(DA)=""
 Q:$D(DQI)
 W:'$D(M) $C(7),!,"NO PROBLEMS"
Q S M=$O(^UTILITY("DIVR",$J,0)),E=$O(^(M)),DK=J(0)
 I $D(ZTQUEUED) S ZTREQ="@"
 E  I $T(^%ZISC)]"" D
 . D ^%ZISC
 E  X $G(^%ZIS("C"))
 G:'E!$D(DIRUT)!$D(ZTQUEUED) QX K DIBT,DISV D
 . N C,D,I,J,L,O,Q,S,D0,DDA,DICL,DIFLD,DIU0
 . W ! D S2^DIBT1 Q  ;STORE ENTRIES IN TEMPLATE??
 S DDC=0 I '$D(DIRUT) G Q:Y<0 F E=0:0 S E=$O(^UTILITY("DIVR",$J,E)) Q:E=""  S DDC=DDC+1,^DIBT(+Y,1,E)=""
 S:DDC>0 ^DIBT(+Y,"QR")=DT_U_DDC
QX K DIVINDEX,DIVKEY,DIVREQK,DIVROOT,DIVTMP,DIVTYPE
 K ^UTILITY("DIVR",$J),^UTILITY("DIVRIX",$J),DIRUT,DIROUT,DTOUT,DUOUT,DK,DQ,P,DR Q
 ;
R Q:$D(DIRUT)
 I X?." " Q:DR'["R"&'DIVREQK  D  G X
 . I X="" S M="Missing"_$S(DIVREQK:" key value",1:"")
 . E  S M="Equals only 1 or more spaces"
 GOTO @T ;'T' = 'N' or 'F' or 'S', etc
 ;
P I @("$D(^"_DIVZ_"X,0))") S Y=X G F
 S M="No '"_X_"' in pointed-to File" G X
 ;
S S Y=X X DDC I '$D(X) S M=""""_Y_""" fails screen" G X
 Q:";"_DIVZ[(";"_X_":")  S M=""""_X_""" not in Set" G X
 ;
D S X=$$DATE^DIUTL(X) ;**
N ;
K ;
F S DQ=X I X'?.ANP S M="Non-printing character" G X
 X DDC Q:$D(X)  ;TRY INPUT TRANSFORM
 I $G(DIVROUTT)]"" D  Q:$D(X)
 .N Y S Y=DQ X DIVROUTT S X=Y X DDC ;TRY OUTPUT-TRANSFORMING, THEN INPUT TRANSFORM (AS WITH ^DD(2,.117), 'COUNTY'
 S M=""""_DQ_""" fails Input Transform"
X I $O(^UTILITY("DIVR",$J,0))="" X W
 S X=$S(V:DA(V),1:DA),^UTILITY("DIVR",$J,X)=""
 S X=V I @(I(0)_"0)")
DA I 'X D  Q
 . D LF Q:$D(DIRUT)
 . W DA,?10,$S($D(^(DA,0)):$E($P(^(0),U),1,30),1:DA),?40,$E(M,1,IOM-40)
 . D:V LF
 D LF Q:$D(DIRUT)  W DA(X),?10,$S($G(^(DA(X),0))]"":$P(^(0),U),1:"***NO ZERO NODE***") S X=X-1,@("Y=$D(^("_I(V-X)_",0))") G DA
 ;
0 ;
 S Y=I(0),DE="",X=V
L S DA="DA" S:X DA=DA_"("_X_")" S Y=Y_DA,DE=DE_"F "_DA_"=0:0 ",%="S "_DA_"=$O("_Y_"))" I V>2 S DE(X+X)=%,DE=DE_"X DE("_(X+X)_")"
 E  S DE=DE_%
 S DE=DE_" Q:"_DA_"'>0  S D"_(V-X)_"="_DA_" "
 ;I X=1,DIFLD=.01 S DE=DE_"X P:$D(^(DA(1),"_I(V)_",0)) ",P="S $P(^(0),U,2)="""_$P(^DD(J(V-1),P,0),U,2)_Q
 S X=X-1 Q:X<0  S Y=Y_","_I(V-X)_"," G L
 ;
IX F %=0:0 S %=$O(DG(%)) Q:+%'>0  X DG(%) I '$T S M=""""_X_""" not properly Cross-referenced" G X
 G @E
 ;
V I $P(X,";",2)'?1A.AN1"(".ANP,$P(X,";",2)'?1"%".AN1"(".ANP S M=""""_X_""""_" has the wrong format" G X
 S M=$S($D(@(U_$P(X,";",2)_"0)")):^(0),1:"")
 I '$D(^DD(A,DIFLD,"V","B",+$P(M,U,2))) S M=$P(M,U)_" FILE not in the DD" G X
 I '$D(@(U_$P(X,";",2)_+X_",0)")) S M=U_$P(X,";",2)_+X_",0) does not exist" G X
 G F
 ;
INDEX ;Check new indexes
 ;
 ;Set DIVINDEX(indexName,index#) = "" for indexes aren't set
 ;Set DIVKEY(file#,keyName,uiNumber) = "null" : if key field is null
 ;                                     "uniq" : if key is not unique
 K DIVKEY,DIINDEX
 D VER^DIVC(A,DIVROOT,.DA,"DIVTMP",.DIVINDEX,.DIVKEY)
 ;
 ;If some indexes aren't set properly, print index info
 I $D(DIVINDEX) D  K DIVINDEX Q:$D(DIRUT)
 . N DIVNAME,DIVNUM
 . S DIVNAME="" F  S DIVNAME=$O(DIVINDEX(DIVNAME)) Q:DIVNAME=""  D  Q:$D(DIRUT)
 .. S DIVNUM=0 F  S DIVNUM=$O(DIVINDEX(DIVNAME,DIVNUM)) Q:'DIVNUM  D  Q:$D(DIRUT)
 ... S M=""""_X_""": "_DIVNAME_" index (#"_DIVNUM_") not properly set"
 ... D IER
 ;
 ;If keys integrity is violated, print key info
 I $D(DIVKEY) D  K DIVKEY Q:$D(DIRUT)
 . N DIVFILE,DIVKNM,DIVPROB,DIVXRNM
 . S DIVFILE="" F  S DIVFILE=$O(DIVKEY(DIVFILE)) Q:DIVFILE=""  D  Q:$D(DIRUT)
 .. S DIVKNM="" F  S DIVKNM=$O(DIVKEY(DIVFILE,DIVKNM)) Q:DIVKNM=""  D  Q:$D(DIRUT)
 ... S DIVXRNM="" F  S DIVXRNM=$O(DIVKEY(DIVFILE,DIVKNM,DIVXRNM)) Q:DIVXRNM=""  D  Q:$D(DIRUT)
 .... S DIVPROB=DIVKEY(DIVFILE,DIVKNM,DIVXRNM)
 .... S M=""""_X_""": "_$S(DIVPROB="null":"Key values are missing.",1:"Key is not unique.")
 .... S M=M_" (File #"_DIVFILE_", Key "_DIVKNM_", Index "_DIVXRNM_")"
 .... D IER
 ;
 ;Continue with checking traditional xrefs (if any) and data type
 G @DIVTYPE
 ;
IER ;Print info about invalid indexes. (Modeled after DA subroutine above)
 N DIVTXT,DIVI,X
 ;
 ;Wrap message M to within 40 columns
 S DIVTXT(0)=M D WRAP^DIKCU2(.DIVTXT,40)
 ;
 ;If nothing was written yet, write column headers
 I $O(^UTILITY("DIVR",$J,0))="" X W
 ;
 ;Set ^UTILITY("DIVR",$J,topIen)="", X = level#, naked = top level root
 S X=$S(V:DA(V),1:DA),^UTILITY("DIVR",$J,X)=""
 S X=V I @(I(0)_"0)")
 ;
IER1 ;If top level, write record info and message
 I 'X D  Q
 . D LF Q:$D(DIRUT)  W DA,?10,$S($D(^(DA,0)):$P(^(0),U),1:DA)
 . F DIVI=0:1 Q:$D(DIVTXT(DIVI))[0  D  Q:$D(DIRUT)
 .. I DIVI D LF Q:$D(DIRUT)
 .. W ?40,DIVTXT(DIVI)
 . D:V LF
 ;
 ;Else write subrecord info, decrement level, set naked = ^naked(node,0)
 D LF Q:$D(DIRUT)
 W DA(X),?10,$P(^(DA(X),0),U) S X=X-1,@("Y=$D(^("_I(V-X)_",0))")
 G IER1
 ;
LF ;Issue a line feed or EOP read
 I $Y+3<IOSL W ! Q
 ;
 N DINAKED S DINAKED=$NA(^(0))
 I IOST?1"C-".E D
 . N DIR,X,Y
 . S DIR(0)="E" W ! D ^DIR
 ;
 I '$D(DIRUT) D
 . I $D(ZTQUEUED),$$S^%ZTLOAD S (ZTSTOP,DIRUT)=1
 . E  W @IOF D HDR
 S:DINAKED]"" DINAKED=$S(DINAKED["""""":$O(@DINAKED),1:$D(@DINAKED))
 Q
 ;
HDR ;Print header
 N DIVTAB
 S DIVPG=$G(DIVPG)+1
 W "VERIFY FIELDS REPORT"
 ;
 S DIVTAB=IOM-1-$L(DIVFIL)-$L(DIVDAT)-$L(DIVPG)
 I DIVTAB>1 W !,DIVFIL_$J("",DIVTAB)_DIVDAT_DIVPG
 E  W !,DIVFIL,!,$J("",IOM-1-$L(DIVDAT)-$L(DIVPG))_DIVDAT_DIVPG
 W !,$TR($J("",IOM-1)," ","-"),!
 Q

DIVR1
DIVR1 ;SFISC/DCM-VERIFY FIELDS API ;9:16 AM  1 Jul 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ;
 I '$D(DIVRREC) S DIVRREC=""
 N %ZIS,POP,ZTRTN,ZTSAVE,SUB
 S %ZIS="Q" D ^%ZIS  Q:POP
 I $D(IO("Q")) S ZTRTN="DQ^DIVR1",(ZTSAVE("DIVRFILE"),ZTSAVE("DIVRDR"),ZTSAVE("DIVROUT"))="" S SUB="DIVRREC"_$S($D(DIVRREC)=10:"(",1:"") S ZTSAVE(SUB)="" D ^%ZTLOAD Q
DQ N PG,TAB,REC,Y,DATE,I,J,K,DIVRFI0,DIVRFINM,DIVRFIIN,DA,V,DIRUT,R,DE,DIUTIL
 K ^TMP("DIVR1",$J),^TMP("DIERR",$J)
 I $D(ZTQUEUED) S ZTREQ="@"
 S PG=0,TAB=0,REC=0,DIUTIL="VERIFY FIELDS" U IO
 S Y=DT D DD^%DT S DATE=Y
 D DIVRFILE Q:$G(DIERR)
 D DIVRREC
 I '$D(^TMP("DIVR1",$J)),'$G(DIERR) W !!!,?20,"*** NO ERRORS FOUND ***" D Q
 D DIVROUT^DIV,Q
 Q
DIVRFILE S (DIVRFILE,DIVRFIIN)=+DIVRFILE
 Q:'$$VFILE^DILFD(DIVRFILE,"D")
 S DIVRFI0=$$FNO^DILIBF(DIVRFILE),DIVRFINM=$$GET1^DID(DIVRFI0,"","","NAME")
 Q
DIVRREC S R=$D(DIVRREC)
 I $D(DIVRREC)#2,(DIVRREC=""!(DIVRREC="ALL")) S R=0 D IJ^DIVU(DIVRFIIN),H1,DIVRDR Q
 I $D(DIVRREC)#2,$E(DIVRREC)="[" D  Q
 . N Y,D0,DS D DIBT^DIVU(DIVRREC,.Y,DIVRFI0) Q:Y'>0
 . S D0=0 D H2,IJ^DIVU(DIVRFI0) F  S D0=$O(^DIBT(+Y,1,D0)) Q:D0'>0  S DE="",DS=1 D:$$VENTRY^DIEFU(DIVRFI0,+D0,"D") DIVRDR Q:$D(DIRUT)
 I $D(DIVRREC)=10 D  Q
 . N I S I="" D H2,IJ^DIVU(DIVRFIIN)
 . F  S I=$O(DIVRREC(I)) Q:I'>0  S DIVRREC=I D ONE
 D H2,IJ^DIVU(DIVRFIIN)
ONE Q:'$$IENCHK^DIT3(DIVRFIIN,DIVRREC)
 Q:'$$VENTRY^DIEFU(DIVRFIIN,DIVRREC,"D")
 N %,DEPTH,D,DS
 S DEPTH=$L(DIVRREC,",")-1
 F %=1:1:DEPTH S D="D"_(DEPTH-%) N @D S @D=$P(DIVRREC,",",%)
 S DS=DEPTH D DIVRDR
 Q
DIVRDR N FLD,PC,Z,END,OUT,F,Y,Q,S
 S F=1,FLD=0,Q="""",S=";"
 S:$G(DIVRDR)="" DIVRDR="ALL"
 I DIVRDR="ALL" D  Q
 . F  S FLD=$O(^DD(DIVRFILE,FLD)) Q:FLD'>0  D SET Q:$D(DIRUT)
 F  S Z=$G(Z)+1 S PC=$P(DIVRDR,S,Z) Q:PC=""  D  Q:$D(DIRUT)
 . N Z
 . I PC[":" S FLD=$O(^DD(DIVRFILE,+PC),-1),END=+$P(PC,":",2) D  Q
 . . F  S FLD=$O(^DD(DIVRFILE,FLD)) Q:FLD'>0!(FLD>END)  D SET Q:$D(DIRUT)
 . S FLD=PC I $$VFIELD^DILFD(DIVRFILE,PC,"D") D SET  Q
 Q
SET N TYP,IT,T,W,PC3,M,Y,KEY
 S Y=FLD,Y(0)=^DD(DIVRFILE,FLD,0),TYP=$P(Y(0),U,2),IT=$P(Y(0),U,5,99),PC3=$P(Y(0),U,3)
 F T="N","D","P","S","V","F" Q:TYP[T
 F W="FREE TEXT","SET OF CODES","DATE","NUMERIC","POINTER","VARIABLE POINTER","K" I T[$E(W) S:W="K" W="MUMPS" Q
 I TYP["C" Q
 I TYP,$P(^DD(+TYP,.01,0),U,2)["W" Q
 I TYP D MULT Q
 I 'R D:$Y>(IOSL-4) FF Q:$D(DIRUT)  W !!?TAB,$P(^DD(DIVRFILE,FLD,0),U)_" (#"_FLD_")",?40,W
 I TYP["*",TYP'["X" S IT="Q" I $D(^DD(DIVRFILE,FLD,12.1)) X ^(12.1) I $D(DIC("S")) S IT(1)=DIC("S"),IT="X IT(1) E  K X"
 S KEY=$D(^DD("KEY","F",DIVRFILE,FLD))>9
 D XDE
 Q
XDE I F D
 .I R,DIVRFILE=DIVRFIIN S DE="D DA^DIVU(.DA) X DE(99) G Q:$G(DIRUT)" Q
 .D DE^DIVU(DIVRFILE,"","","DE",$G(DS)_U_$G(DS)) S F=0,DE=DE_" D DA^DIVU(.DA) X DE(99) G Q:$G(DIRUT)" Q
 D DE99(DIVRFILE,FLD)
 X DE
 Q
MULT D:$Y>(IOSL-4) FF Q:$D(DIRUT)
 W:'R !!?TAB,$P(^DD(DIVRFILE,FLD,0),U)_"(#"_FLD_") --multiple--"
 N DIVRFILE,FLD,DA,V,I,J,K,F,DE
 S DIVRFILE=+TYP,FLD=0,TAB=TAB+2,F=1 D IJ^DIVU(DIVRFILE)
 F  S FLD=$O(^DD(DIVRFILE,FLD)) Q:FLD'>0  D SET Q:$D(DIRUT)
 S TAB=TAB-2 K @("D"_V)
 Q
R I X?." " Q:TYP'["R"&'KEY  D  Q
 . I X="" S M="Missing"_$S(KEY:" key value",1:"")
 . E  S M="Equals only 1 or more spaces"
 . D X
 D @T Q
P I @("$D(^"_PC3_"X,0))") D F Q
 S M="No '"_X_"' in pointed-to File" D X Q
V I $P(X,S,2)'?1A.AN1"(".ANP,$P(X,S,2)'?1"%".AN1"(".ANP S M=Q_X_Q_" has the wrong format" D X Q
 S M=$S($D(@(U_$P(X,S,2)_"0)")):^(0),1:"")
 I '$D(^DD(DIVRFILE,FLD,"V","B",+$P(M,U,2))) S M=$P(M,U)_" FILE not in the DD" D X Q
 I '$D(@(U_$P(X,S,2)_+X_",0)")) S M=U_$P(X,S,2)_+X_",0) does not exist" D X Q
 D F Q
S S Y=X I TYP'["X" X IT I '$D(X) S M=Q_Y_Q_" fails screen" D X Q
 Q:S_PC3[(S_X_":")  S M=Q_X_Q_" not in Set" D X Q
D N Y,%DT S Y=$F(IT,"%DT=""E") S:Y IT=$E(IT,1,Y-2)_$E(IT,Y,999)
 I TYP["X" X $P(IT," D ^%DT") D ^%DT I Y<0 S M="Invalid date" D X Q
 D F Q
N I TYP["X",X'?.1"-".N.".".N S M="Invalid number" D X Q
 D F Q
K D ^DIM I '$D(X) S M="Invalid M code" D X
 Q
F N Y S Y=X I X'?.ANP S M="Non-printing character" D X
IT Q:TYP["X"  D  Q:$D(X)  S M=Q_Y_Q_" fails Input Transform"
 .N %Y S %Y=Y X IT S Y=%Y
 ;
X S X=$S(V:DA(V),1:DA),^TMP("DIVR1",$J,$S('R:X,$G(DIVRREC)["[":X,(R&($G(DIVROUT)["[")):X,1:DIVRREC))="",X=V,Z=0
 I @(I(0)_"0)")
IEN D FF:$Y>(IOSL-3) Q:$D(DIRUT)
 I 'R D  Q
 .F  Q:'X  W !?5,@("D"_Z),?15,$P(^(@("D"_Z),0),U) S X=X-1,Z=Z+1,@("Y=$D(^("_I(V-X)_",0))")
 .W !?5,@("D"_Z),?15,$S($D(^(@("D"_Z),0)):$P(^(0),U),1:@("D"_Z)),?50,$E(M,1,40) W:V !
 I R D  Q
 .F  Q:'X  W !,@("D"_Z),?10,$P(^(@("D"_Z),0),U) W:Z " (",K(Z),")" S X=X-1,Z=Z+1,@("Y=$D(^("_I(V-X)_",0))")
 .W !,@("D"_Z),?10,$S($D(^(@("D"_Z),0)):$P(^(0),U),1:@("D"_Z)) W:Z " (",K(Z),")" W !?5,$P(^DD(DIVRFILE,FLD,0),U)," (#",FLD,")",?35,W,?50,M W:V !
 Q
 ;
DE99(FI,FD,NP) ;
 N Y
 D GET^DIOU(FI,FD,"X",.Y,"I")
 S DE(99)=Y_" D R " Q
 Q
Q D ^%ZISC
 Q
FF I IOST["C-" N DIR,X,Y S DIR(0)="E" D ^DIR Q:$D(DIRUT)
 I R D H2 Q
H1 W:$Y @IOF W "Verify Fields     File: ",DIVRFI0_" "_DIVRFINM,?(IOM-25) W DATE W ?(IOM-9),"PAGE ",PG+1
 W !,"Field Name (Field #)",?40,"Type"
 W !?5,"Entry #",?15,"Name",?50,"ERROR"
 N L W ! F L=1:1:(IOM-2) W "-"
 S PG=PG+1
 Q
H2 W:$Y @IOF W "Verify Fields     File: ",DIVRFI0_" "_DIVRFINM,?(IOM-25) W DATE W ?(IOM-9),"PAGE ",PG+1
 W !,"Entry #",?10,"Name"
 W !?5,"Field Name (Field #)",?35,"Type",?50,"ERROR"
 N L W ! F L=1:1:(IOM-2) W "-"
 S PG=PG+1
 Q

DIVRE
DIVRE ;SFISC/MWE-REQ FLD(S) CHK ;06:27 PM  7 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
B K ^UTILITY($J),DIBT S (DK,DIC)=DI,DIC(0)="EQM",DIK=0
 W !,"CHECK WHICH ENTRY: " R X:DTIME G QQ:U[X!'$T
 I X="ALL" D ALL G QQ:$D(DIRUT) I Y S DIROOT=DIU G D
 D ^DIC I Y<0 W:X?1."?" !?3,"You may type 'ALL' to select every entry in the file.",! G B
R S DIK=DIK+1,^UTILITY($J,"DIN",+Y)=""
 S DIC(0)="AEQM",DIC("A")=$$EZBLD^DIALOG(8199)_" " D ^DIC I Y>0 G R ;**CCO/NI 'ANOTHER ONE:'
 Q:'DIK!(X=U)
D ;
 D S2^DIBT1 K DIRUT,DIROUT G QQ:$D(DTOUT)!($D(DUOUT))
 I X]"" G D:Y<0 S:Y>0 DIBT=+Y
 S DIC=DI
 S:$D(^%ZTSK) %ZIS="Q" D ^%ZIS G:POP QQ
 I $G(IO("Q"))=1 G TSK
L I $E(IOST)="C" S DIFF=1
 S (DC,DA,N)=0 S:'$D(DIROOT) DIROOT="^UTILITY($J,""DIN""," F I=0:0 S DA=$O(@(DIROOT_DA_")")) Q:'DA  W:IOST?1"C".E "." D START
 I N U IO S DC=0 D PH F N=1:1 Q:'$D(^UTILITY($J,"DIVRE",N))  S X=^(N) D P I IOST?1"C".E,$Y>(IOSL-4) W $C(7) R X:DTIME Q:X=U!'$T
 I 'N U IO D PH W !!,"NO REQUIRED FIELD IS MISSING"
Q W:$E(IOST)'="C"&($Y) @IOF X $G(^%ZIS("C"))
QQ K DIRUT,DTOUT,DUOUT,DIROUT,DK,C,D,I,J,N,F,S,G,P,L,X,Y,DI,DIK,DIC,DISD,DIREF,DIFLD,DC,DIROOT,DIFF,^UTILITY($J)
 Q
P ;
 D:$Y>(IOSL-3) PH
 S %=$P(X,U),Y=$P(@(^DIC($P(%,";",2),0,"GL")_+%_",0)"),U,1),C=$P(^DD($P(%,";",2),.01,0),U,2) D Y^DIQ
 W !,+$P(X,U),?10,$E(Y,1,20),?35,$P(X,U,2),?50,$P(^DD($P(X,U,2),$P(X,U,3),0),U)
 Q:DUZ(0)'="@"
 I IOM>80 W ?85,$P(X,U,4) Q
 W !?35,$P(X,U,4) Q
PH ;
 S DC=DC+1 W:$D(DIFF)&($Y) @IOF S DIFF=1 W "Required-Field-Check  File: ",DIC_" "_$O(^DD(DIC,0,"NM","")),?(IOM-25) S Y=DT D DD^%DT W ?(IOM-10),"PAGE ",DC
 W !,"Entry",?35,"DD-Number",$S((DUZ(0)="@")+(IOM'>80)=2:"/Path",1:""),?50,"Field" I DUZ(0)="@",IOM>80 W ?85,"Path"
 W ! F L=1:1:(IOM-2) W "-"
 Q
CHECK ;
 I $P(^DD(DIC,DIFLD,0),U,2)'["R",'$D(DIKEYCHK) Q
 S G=$P(^(0),U,4),P=$P(G,";",2),G=$P(G,";") S:'P P=1
 I $D(@(DIREF_","""_G_""")")),$P(^(G),U,P)]"" Q
 N % S %=0 S N=N+1,^UTILITY($J,"DIVRE",N)=D(1)_";"_I(1)_U_DIC_U_DIFLD_DIREF S:$D(DIBT) %=%+1,^DIBT(DIBT,1,D(1))=""
 I %,$G(DIBT) S ^DIBT(DIBT,"QR")=DT_U_%
 Q
START ;
 S L=1,DIC=$S('DIC:+$P(@(DIC_"0)"),U,2),1:DIC),DIREF=^DIC(DIC,0,"GL"),X="",U="^",DIREF=DIREF_DA
M S J(L)=DIREF,I(L)=DIC,D(L)=DA K DIFLIST,DIKEYCHK
 S DIFLD=0 F I=0:0 S DIFLD=$O(^DD(DIC,"RQ",DIFLD)) Q:'DIFLD  S F(L)=DIFLD,DIFLIST(DIFLD)="" D CHECK
 S DIKEYCHK=1,DIFLD=0 F  S DIFLD=$O(^DD("KEY","F",DIC,DIFLD)) Q:'DIFLD  I '$D(DIFLIST(DIFLD)) S F(L)=DIFLD D CHECK
 K DIFLIST,DIKEYCHK S F(L)=""
 S DISD=0 F I=0:0 S DISD=$O(^DD(DIC,"SB",DISD)) Q:'DISD  S S(L)=DISD D NEW
 Q
NEW ;
 S L=L+1
 S DINODE=$P($P(^DD(I(L-1),$O(^DD(I(L-1),"SB",DISD,"")),0),U,4),";")
 I DINODE="" S DINODE=0
 E  I DINODE'=+$P(DINODE,"E") S DINODE=""""_DINODE_""""
 S DIC=DISD,DIREF=DIREF_","_DINODE_"," K DINODE
 S DA=0 F I=0:0 S DA=$O(@(DIREF_DA_")")) Q:'DA  S DIREF(L)=DIREF,DIREF=DIREF_DA D M S DIREF=DIREF(L)
 S L=L-1,DIC=I(L),DIREF=J(L),DA=D(L),DIFLD=F(L),DISD=S(L)
 Q
TSK ;
 S ZTRTN="L^DIVRE",ZTDESC="REQUIRED FIELD CHECK",ZTIO=ION_";"_IOST_";"_IOM
 F N="DIC","^UTILITY($J,","DIROOT" S ZTSAVE(N)=""
 D ^%ZTLOAD X $G(^%ZIS("C")) G QQ
 ;
ALL S DIR(0)="Y",DIR("??")="^D H^DIVRE1"
 S DIR("A")="DO YOU MEAN ALL THE ENTRIES IN THE FILE"
 D ^DIR K DIR S X="ALL"
 Q

DIVRE1
DIVRE1 ;SFISC/MWE-HELP LOGIC FOR REQ FLD(S) CHK ;1/17/91  3:11 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
H W !!?5,"YES means that every entry in the file will be checked to see"
 W !?5,"that all the required fields have data."
 W !!?5,"NO means that ALL will be used to lookup an entry in the"
 W !?5,"file which begins with the letters ALL."
 Q

DIVRPTR
DIVRPTR ;GFT/GFT - CHECK POINTER FIELDS (PROGRAMMER CALL) ;28FEB2004
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 N DIB,DIC K DIRUT
 D DT^DICRW,L^DICRW1 Q:'$D(DIC)
 D ^%ZIS Q:POP  U IO D HDR
 F A=$O(^DD(+Y),-1):0 S A=$O(^DD(A)) Q:'A!$D(DIRUT)  D IJ^DIUTL(A) Q:J(0)>DIB(1)  F DIFLD=0:0 S DIFLD=$O(^DD(A,DIFLD)) Q:'DIFLD!$D(DIRUT)  S X=$P($G(^(DIFLD,0)),U,2) I 'X F T="P","V" I X[T D CK(A,DIFLD,T) S X=""
 D ^%ZISC Q
 ;
CK(A,DIFLD,T) ;CHECK FIELD DIFLD, DATA DICTIONARY A, TYPE T
 N W,I,J,V,DIVTMP,DG,E,DIVZ,DE,DR,P4,M
 K ^UTILITY("DIVR",$J)
 D IJ^DIUTL(A) S V=$O(J(""),-1)
 S DIVZ=$P(^DD(A,DIFLD,0),U,3),DR=$P(^(0),U,2),P4=$P(^(0),U,4)
 I T="P" S DIVZ=$$CREF^DILF(U_DIVZ) I '$D(@DIVZ@(0)) D SUBHD W !,"POINTED-TO FILE (#",+$P(DR,"P",2),") IS MISSING!!",! Q
 D 0 S X=P4,Y=$P(X,";",2),X=$P(X,";")
 I +X'=X S X=""""_X_"""" I Y="" S DE=DE_"S X=DA D "_T G XEC
 S M="S X=$S($D(^(DA,"_X_")):$"_$S(Y:"P(^("_X_"),U,"_Y,1:"E(^("_X_"),"_$E(Y,2,9))_"),1:"""") D "_T
 I $L(M)+$L(DE)>250 S DE=DE_"X DE(1)",DE(1)=M
 E  S DE=DE_M
XEC K DIC,M,Y X DE
Q S M=$O(^UTILITY("DIVR",$J,0)),E=$O(^(M)),DK=J(0)
 K ^UTILITY("DIVR",$J)
 Q
 ;
 ;
0 ;
 K DA
 S Y=I(0),DE="",X=V
L S DA="DA" S:X DA=DA_"("_X_")" S Y=Y_DA,DE=DE_"F "_DA_"=0:0 Q:$D(DIRUT)  ",%="S "_DA_"=$O("_Y_"))" I V>2 S DE(X+X)=%,DE=DE_"X DE("_(X+X)_")"
 E  S DE=DE_%
 S DE=DE_" Q:"_DA_"'>0  S D"_(V-X)_"="_DA_" "
 S X=X-1 Q:X<0  S Y=Y_","_I(V-X)_"," G L
 ;
 ;
 ;
 ;
V ;VARIABLE POINTER
 Q:'X  I $P(X,";",2)'?1A.AN1"(".ANP,$P(X,";",2)'?1"%".AN1"(".ANP S M=""""_X_""""_" has the wrong format" G X
 S M=$S($D(@(U_$P(X,";",2)_"0)")):^(0),1:"")
 I '$D(^DD(A,DIFLD,"V","B",+$P(M,U,2))) S M=$P(M,U)_" FILE not in the DD" G X
 I '$D(@(U_$P(X,";",2)_+X_",0)")) S M=U_$P(X,";",2)_+X_",0) does not exist" G X
 Q
 ;
P ;REGULAR POINTER
 Q:'X  I $D(@DIVZ@(X,0)) Q
 S M="No '"_X_"' in "_$P(@DIVZ@(0),U)_" File"
X I $O(^UTILITY("DIVR",$J,0))="" D SUBHD
 S ^UTILITY("DIVR",$J,X)="",M=">>"_M_"<<"
 S DG=$$IENS^DILF(.DA),J=V
 F J=V:-1:0 W !,?V-J*2,$O(^DD(J(V-J),0,"NM",0)),": `",+$P(DG,",",J+1),?V-J*2+10,"  " S W="E" D  I W="" S W="I" D  ;TRY EXTERNAL FORM FIRST, THEN INTERNAL
 .S W=$$GET1^DIQ(J(V-J),$P(DG,",",J+1,99),.01,W) W W
 W "  " W:$X+$L(M)>IOM !?30 W M
 D LF Q
 ;
 ;
LF ;Issue a line feed or EOP read
 I $Y+3<IOSL W ! Q
 I IOST?1"C-".E D
 . N DIR,X,Y
 . S DIR(0)="E" W ! D ^DIR
 I '$D(DIRUT) D HDR,SUBHD W "continued",!
 Q
 ;
HDR ;Print header
 W @IOF,"DANGLING POINTER REPORT",!
 Q
 ;
SUBHD N I,Y W !!!,"FILE ",J(0),"  '",$$LABEL^DIALOGZ(A,DIFLD),"' ("
 S Y=" File #"_J(0)
 F I=1:1 Q:'$D(J(I))  S Y=" Sub-File #"_J(I)_" of"_Y
 S Y="Field #"_DIFLD_" in"_Y
 I $P($G(^DD(A,DIFLD,0)),U,2) S Y="Multiple "_Y
 W Y,")"
 Q

DIVU
DIVU ;SFISC/DCM-VERIFY FIELDS UTILITIES ;8/1/95  1:02 PM
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
DE(FI,FD,N,G,S) ;
 Q:'$D(^DD($G(FI),0))  I $G(FD) Q:'$D(^(FD,0))
 I $G(G)']"" S G="DE"
 N Z,X,Y,%,H,D,I,J,V,K
 I $G(^DIC(FI,0))]"" S I(0)=^(0,"GL"),J(0)=+FI,V=0
 E  D IJ(FI)
 S Y=I(0),X=V,H="",Z=0
 I +$G(S),V S S=$S('$P(S,U,2):V,1:$P(S,U,2)) S Z=S,X=X-S F %=0:1 S Y=Y_"D"_%_","_I(%+1)_","  I %=(S-1) Q
L S D="D" S D=D_Z S Y=Y_D,H=H_"S "_D_"=0 F  ",%="S "_D_"=$O("_Y_"))" I V>1 S @G@(Z)=%,H=H_"X "_G_"("_(Z)_")"
 E  S H=H_%
 S H=H_" Q:"_D_"'>0  "
 S X=X-1,Z=Z+1
L1 I X<0 D  Q
 .I $G(N)]"",$G(FD)]"" D  S H=H_" X "_G_"(99)",@G=H,@G@(99)=Y Q
 . . N DN,%,%N,%P,%4,Q
 . . S Q=";",%=^DD(FI,FD,0),%(2)=$G(^(2)),%4=$P(%,U,4),%N=$P(%4,Q),%P=$P(%4,Q,2)
 . . I FD=.001,%P="" S Y="S "_N_"=D"_V Q
 . . I %P=" " D CAL Q
 . . I $G(%P)]"" S Y=Y_","_%N_")"
 . . I %P S DN="$P(",%P="),U,"_%P_")"
 . . I $E(%P)="E" S DN="$E(",%P="),"_$E(%P,2,9)_")"
 . . I $G(DN)="" Q
 . . S Y="S "_N_"="_DN_"$G("_Y_%P
 . . I %(2)]"",$P(%,U,2)["O",$P(%,U,2)'["D" S Y=Y_",Y="_N_" "_%(2)_" S "_N_"=Y"
 . . Q
 . S @G=H Q
 S Y=Y_","_I(V-X)_"," G L
 ;
CAL S Y=$P(%,U,5,99)_" S "_N_"=X" Q
 Q
IJ(FI) ;set I( and J( and V=level
 Q:'$D(^DD($G(FI),0))
 N X,Y,S,Q,F S X=0,(S,Y)=FI,Q="""" F  Q:'$D(^DD(Y,0,"UP"))  S X=X+1,Y=^("UP")
 S V=X I X'=0 F X=X:-1 S Y=$G(^DD(S,0,"UP")) Q:'Y  S F=$O(^DD(Y,"SB",S,0)) Q:'F  S I(X)=$P($P($G(^DD(Y,F,0)),U,4),";"),K(X)=$O(^DD(S,0,"NM","")),J(X)=S,S=Y S:I(X)'=+I(X) I(X)=Q_I(X)_Q
 S I(0)=$G(^DIC(S,0,"GL")),J(0)=S
 Q
DA(Z) ;convert D0,D1... to DA()
 N A,B,C,D K Z
 F A=0:1 S D="D"_A Q:'$D(@D)
 S C=0,A=A-1 F B=A:-1:0 S Z(B)=@("D"_C),C=C+1
 S Z=Z(0) K Z(0)
 Q
DIBT(X,%,S) ;lookup sort template, return template's IEN
 N DIC,Y
 S X=$E(X,2,$L(X)-1),DIC="^DIBT(",DIC("S")="I $P(^(0),U,4)="_S,DIC(0)="ZM" D ^DIC
 S %=+Y
 Q

DIWE
DIWE ;SFISC/GFT,XAK-START OF WP ;2013-01-24
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN K DTOUT,DUOUT,DIRUT ;G Q:'$D(@(DIC_"0)")) D A
 L @("+"_DIC_"0):1") E  W !,$$EZBLD^DIALOG(110) G Q ;**CCO/NI--'THE RECORD IS LOCKED'
 D A
OPT K:DIWE'=2 DDWC,DDWRW I DIWE>1 S DIWE(2)=1 G OPT^DIWE12
GO S:$D(DTIME)[0 DTIME=300
 S @(DIC_"0)")=DWLC G ^DIWE1:DWLC D ^DIWE2 S (DWL,DWLC)=DWI G GO:DWL,X
 ;
DIEN ;FROM ^DIE
 I '$D(DIA) N DIA S DIA=DIE,DIA("P")=DP
 S DH=$P(Y,U),DV=DG,DWPK="FM",(DIC,Y)=DIE_DA_",DV",DWO="ABCDE IJLMPRSTU"_$E("Y",DUZ(0)="@") S:'$D(DIWESUB) DIWESUB=DH D A G W:'$D(DE(1,0))
 S X=DE(1,0),DWI=X?1"/".E,@(DIC_"0)")=DWLC S:DWI X=$E(X,2,999) I X?1"+".E S X=$E(X,2,999)
 E  G W:'DWI&DWLC K:DWLC @(Y_")") S DWLC=0 Q:X="@"
 I X?1"^".E S DIW=DIC,DICMX="S DWLC=DWLC+1,"_DIC_",DWLC,0)=X",DIWL=DWLC X $E(X,2,999) S DIC=DIW S:DIWL-DWLC X="" K DICMX,DIWL,DIW
 S:X]"" DWLC=DWLC+1,@(DIC_"DWLC,0)=X") G X:DWI
W W !?DL+DL-2
 S Z=+$P($G(DC),U,2),Z=$S(Z:$P($G(^DD(Z,.01,0)),U,2),1:"") I Z["I",DWLC D EN^DIALOG(3090,DH) W ! S I=DWLC,J=1 D LL^DIWE1 G Q ;UNEDITABLE W-P
 W DH_":" N DIET I Z["a",$G(DV)]"",$G(DIC)["DV" M DIET=@$$CREF^DILF(DIC)
 G OPT
 ;
A S:$E(DIC,$L(DIC))'="," DIC=DIC_"," S:'$D(DWO) DWO="ABCDE IJLMPRSTU"_$E(" Y",$S($G(DUZ(0))="@":2,1:1))
 S:$G(DWDISABL)]"" DWO=$TR(DWO,DWDISABL,$J("",$L(DWDISABL)))
 I $D(^VA(200,0))#2,^(0)'["NEW PERSON",'$D(DDS) D
 . W !!?2,$C(7)_"WARNING: You appear to have a file #200 stored at ^VA(200),"
 . W !?11,"but it is not named 'NEW PERSON.' I will assume your"
 . W !?11,"preferred editor is the Line Editor.",!
 K DWL,DIWE S U="^",DIWPT=$S('$D(^VA(200,0)):"",^(0)'["NEW PERSON":"",'$D(^VA(200,+DUZ,1)):"",1:$P(^(1),U,4))
 S DIWE=$S('$D(^VA(200,0)):0,^(0)'["NEW PERSON":0,'$D(^VA(200,+DUZ,1)):0,1:+$P(^(1),U,5)),DIWE=$S($D(^DIST(1.2,DIWE,0)):DIWE,1:0) S:'DIWE DIWE=$S($D(DDS)#2:2,1:1)
 S @("J=$O("_DIC_"0))>0") I '$D(^(0))!'J S ^(0)=""
 S DWHD=^(0)_U,DWLC=+$P(DWHD,U,3),DWLW=$S($D(DWLW):DWLW,1:245) I J D REPACK:DWLC-$P(DWHD,U,4)!'DWLC!'$D(^(DWLC))
 S DWPK=$S($D(DWPK):DWPK,1:2),DWLR=245,DWLC=$S('DWLC:+DWHD,1:DWLC)
 Q
 ;
REPACK K ^UTILITY($J,"W") S J=0 F I=0:0 S @("J=$O("_DIC_"J))") Q:J'>0  S:$D(^(J,0)) I=I+1,^UTILITY($J,"W",I)=^(0) W:'$D(ZTQUEUED) "."
 K @($E(DIC,1,$L(DIC)-1)_")") F J=1:1:I S @(DIC_"J,0)=^UTILITY($J,""W"",J)") W:'$D(ZTQUEUED) "."
 K ^UTILITY($J,"W") S DWLC=I,$P(@(DIC_"0)"),U,3,4)=I_U_I Q
 ;
X Q:$D(DIWE(1))  I $D(DT)[0 D NOW^%DTC S DT=X K %I
 I $D(DIET)>9,$G(DP),$G(DIFLD(1)) D WP^DIET(DP,DIFLD(1),$$IENS^DILF(.DA),"DIET") ;AUDIT Word -Processing
 I @("$O("_DIC_"0))'>0") K @($E(DIC,1,$L(DIC)-1)_")") G Q
 I $D(@(DIC_"0)"))#2 G Q:$P(^(0),U,5)?7N.1P.6N ;Has already been updated.
 S ^(0)=$P(DWHD,U,1,2)_U_DWLC_U_DWLC_U_DT_U_$P(DWHD,U,6,9)
 D:$D(DDS) INIT^DDGLIB0()
Q L @("-"_DIC_"0)") K DW2,DW3,DIWPT,DWO,DWLR,DWHD,DWL,DWPK,DWI,DWJ,DWLC
 K Y,Z,DWAFT,DWLW,DIW,D,DIWE,DIWETXT,DIWESUB,DDWLMAR,DDWRMAR,DDWFLAGS,DWDISABL,DDWAUTO,DDWTAB,DC,DIWEX1 ;**CCO/NI   CLEAN UP VARIABLES

DIWE1
DIWE1 ;SFISC/GFT-WORD PROCESSING FUNCTION ;4JUN2008
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;**CCO/NI  THIS ROUTINE THOROUGHLY CHANGED  DIALOGS #9150-9175 ARE NOW USED AS THE OPTIONS
 G X:$D(DTOUT) I '$D(DWL) S I=DWLC,J=$S(I<11:1,1:I-8) W:J>1 ?7,". . .",!?7,". . ." D LL
1 G X:$D(DTOUT) D  G X:'$D(X)
 .N DIR,DIRUT,DDS
 .S DIR(0)="FO",DIR("A")=$$EZBLD^DIALOG(8149),DIR("?")="^D HELP^DIWE1" ;**CCO/NI READ 'EDIT OPTION:'
 .D ^DIR I X="."!$D(DIRUT) K X
LC I X?1L S X=$$UP^DILIBF(X)
 S J="^DOPT(""DIWE1""," I X?1U F I=1:1:26 S DIWEX1=$C(64+I) I DWO[DIWEX1,$F($$EZBLD^DIALOG(I+9150),X)=2 S ^DISV(DUZ,J)=I G OPT
 I X=" ",$D(^DISV(DUZ,J)) S DIWEX1=$C(64+^(J)) I DWO[DIWEX1 W ! G OPT
 I X?1N.N S DIWEX1="E" D LN G E2:X
 D HELP G 1
 ;
HELP ;CALLED FROM DIR READER
 W !?5,$$EZBLD^DIALOG(9149)
 I X?2"?".E F I=1:1:26 S J=$C(64+I) I DWO[J W !?10,$$EZBLD^DIALOG(I+9150)
 W !?5,$$EZBLD^DIALOG(9150) Q
 ;
OPT Q:$D(DTOUT)  S X=$$PROMPT I '$X W $E(X)
 E  I $F($$EZBLD^DIALOG($A(DIWEX1)-64+9150),X)'=2 W !,$E(X)
 W $E(X,2,99) G @DIWEX1
A ;;Add  -- DIALOG #9151
 D ^DIWE2 S (DWL,DWLC)=DWI,@(DIC_"0)=DWLC") G 1:DWLC,X
B ;;Break  #9152
 D RD G B^DIWE4
C ;;Change #9153
 G C^DIWE2
D ;;Delete #9154
 D RD G D^DIWE3
E ;;Edit #9155
 D RD G OPT:X="",1:X=U,LC:X?1A,E2
G ;;Get Data from Another Source #9157
 G X^DIWE5
I ;;Insert #9159
 D RD G I^DIWE2
J ;;Join #9160
 D RD G J^DIWE4
L ;;List #9162
 S DIWELAST=$S($G(DIWELAST):DIWELAST,1:1) W DIWELAST_"//" R X:DTIME S:'$T X=U,DTOUT=1 S:X="" X=DIWELAST D LN G LIST:X,1:X=U W !,$$EZBLD^DIALOG(9162) G L
M ;;Move #9163
 D RD G M^DIWE3
P ;;Print #9166
 R X:DTIME S:'$T X=U,DTOUT=1 S:X="" X=1 D LN,^DIWE4:X G 1
R ;;Repeat #9168
 D RD G R^DIWE3
S ;;Search #9169
 G S^DIWE2
T ;;Transfer #9170
 D RD,Z^DIWE3 G DIWE1
U ;;Utilities #9171
 D ^DIWE11 G 1
Y ;;Y;Y-Programmer Edit #9175
 G Y^DIWE4
 ;;
PROMPT() Q $$EZBLD^DIALOG($A(DIWEX1)-64+9150.1)
 ;
E2 S Y=^(0) S:Y="" Y=" " W !,$J(DWL,3)_">"_Y,! S DIRWP=1 D RW^DIR2 K DIRWP G E2:X?1."?",X:X?1."^"
TAB I X[$C(9) S X=$P(X,$C(9),1)_$C(124)_"TAB"_$C(124)_$P(X,$C(9),2,999) G TAB
 S:X]"" ^(0)=X
 ;check if line is greater than max, DWLW, break line up and treat as an insert
 I $L(X)>DWLW D
 . N I,J,DIC1
 . K ^UTILITY($J,"W") S DIC1=DIC,DIC="^UTILITY($J,""W"",",@(DIC_"0)")=""
 . F DWI=1:1 Q:$L(X)'>DWLW  S J=$F(X," ",DWLW-7),J=$S(J<1!(J>DWLW):DWLW,1:J),@(DIC_"DWI,0)")=$E(X,1,J-1),X=$E(X,J,256)
 . S @(DIC_"DWI,0)")=X
 . W !,$$EZBLD^DIALOG(8123,DWI-1)
 . X "F J=DWL+1:1:DWLC S DWI=DWI+1,"_DIC_"DWI,0)="_DIC1_"J,0) W ""."""
 . S I=DWL X "F J=1:1 Q:'$D("_DIC_"J,0))  S "_DIC1_"I,0)=^(0),I=I+1 W ""."""
 . S DWLC=I-1,DIC=DIC1 K ^UTILITY($J,"W")
 E  I X="@" S (DW1,DW2)=DWL W $$EZBLD^DIALOG(8015) D DEL^DIWE3 ;*CCO/NI   "DELETED"
 W ! S DIWEX1="E" G OPT
 ;
RD R X:DTIME S:'$T DTOUT=1 I X?1."?" D  G RD
 .N I S I(1)=1,I(2)=DWLC W !?5,$$EZBLD^DIALOG(9148,.I),!!,$$PROMPT ;**CCO/NI  "ENTER LINE 1-99"
LN I U[X!(X=".") S X=U Q
 Q:DIWEX1="E"&(X?1A)  I 'DWLC,I<27,I-13 S X=U W "  ",$$EZBLD^DIALOG(8148),! Q  ;**CCO/NI  'NO LINES!'
 I "+- "[$E(X),X?1P.N,$D(DWL) S:X?1P X=X_1 S X=X+DWL W "  "_X
 E  S X=+X
 I (DIWEX1="I"!(DIWEX1="R")&(X=0))!$D(@(DIC_"X,0)")) S DWL=X Q
 S X="" G LNQ^DIWE5
 ;
X K DIWELAST
 G X^DIWE
 ;
LIST W "  "_$$EZBLD^DIALOG(8117)_DWLC_"// " R I:DTIME S:'$T DTOUT=1 S I=$S(I="":DWLC,1:I) I I,I>DWLC!(I<1) S I=DWLC
 S J=X,DIWELAST=$S(DWLC=I:1,1:I) D LL G 1
LL X "F J=J:1:I W !,$J(J,3)_"">""_"_DIC_"J,0)"

DIWE11
DIWE11 ;SFISC/GFT,MWE-WORD PROCESSING UTILITY FUNCTION ;08:12 AM  16 Jan 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;**CCO/NI   ENTIRE ROUTINE CHANGED
 N DWOU
 S DWOU="ABC"
1 W ! D  Q:'$D(X)
 .N DIR,DIRUT
 .S DIR(0)="FO",DIR("A")=$$EZBLD^DIALOG(9189),DIR("?")="^D HELP^DIWE11"
 .D ^DIR I X="."!$D(DIRUT) K X
LC I X?1L S X=$$UP^DILIBF(X)
 S J="^DOPT(""DIWE11""," I X?1U F I=1:1:3 S DIWEX1=$C(64+I) I DWOU[DIWEX1,$F($$EZBLD^DIALOG(I+9189),X)=2 S ^DISV(DUZ,J)=I G OPT
 I X=" ",$D(^DISV(DUZ,J)) S DIWEX1=$C(64+^(J)) I DWO[DIWEX1 W ! G OPT
 D HELP G 1
 ;
HELP ;CALLED FROM DIR READER
 W !?5,$$EZBLD^DIALOG(8068)
 F I=1:1:3 S J=$C(64+I) I DWO[J W !?10,$$EZBLD^DIALOG(I+9189)
 Q
 ;
OPT Q:$D(DTOUT)  S X=$$EZBLD^DIALOG($A(DIWEX1)-64+9189) I '$X W $E(X)
 W $E(X,2,99) G @DIWEX1
A ;;Editor Change  9190
 D ^DIWE12 W !! Q
 ;
B ;;File Transfer from Foreign CPU  9191
 D X^DIWE5 Q
 ;
C ;;Text-Terminator-String Change  9192
 D  W !! Q
 .N DIR,DTOUT,DUOUT
 .S DIR("A")=$$EZBLD^DIALOG(9184)
 .S DIR("B")=$S(DIWPT="":$$EZBLD^DIALOG(7080),1:DIWPT)
 .S DIR(0)="FO^1:99^K:X[""?"" X"
 .S DIR("?")="^D BLD^DIALOG(9185),MSG^DIALOG(""WH"")"
 .D ^DIR Q:$D(DTOUT)!$D(DUOUT)
 .I "@"[X!(X=$$EZBLD^DIALOG(7080)) W !?5,$$EZBLD^DIALOG(9186) S X=""
 .S DIWPT=X

DIWE12
DIWE12 ;SFISC/XAK,RWF-WORD PROCESSING CHANGE EDITORS ;02:00 PM  8 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:$D(DIWE(1))  S DIWE(1)=DIWE D 1 K DIWE(1) Q
 ;
1 I '$D(DIWE(9)) D ASK G QX:U[X
2 S DIWE=DIWE(9) K DIWE(9) I $D(DIWE(1)),DIWE=DIWE(1) K DIWE(1) Q
OPT S DIWE(5)=$G(^DIST(1.2,DIWE,2)) I DIWE(5)]"" X DIWE(5) I '$T S:$D(DIWE(2)) DIWE(9)=1 G 1 ;Not valid
 Q:$D(DTOUT)  S @(DIC_"0)")=DWLC,DIWE(0)=$S($D(^DIST(1.2,DIWE,1)):^(1),1:"") I $G(DIWE)=1!$D(DDS)!$D(DIWE(1))!($G(DWPK)'="FM"&($D(DIWEPSE)[0)) X DIWE(0) G QQ
 K DIR I $G(DWPK)'="FM" S DIR(0)="E"
 E  D
 . N I,J
EGP . W:'DWLC !,$J("",$G(DL)*2)_$$EZBLD^DIALOG(8148) ;**CCO/NI "THERE ARE NO LINES"
 . I DWLC S I=DWLC,J=$S(I<11:1,1:I-8) W:J>1 ?7,". . .",!?7,". . ." X "F J=J:1:I W !,"_DIC_"J,0)" W !
E . S DIR(0)="Y",DIR("A")=$J("",$G(DL)*2)_$$EZBLD^DIALOG(8175),DIR("B")="NO",DIR("?")="^D BLD^DIALOG(8176),MSG^DIALOG(""WH"")" ;**CCO/NI 'YES' AND 'NO' HELP
 D ^DIR K DIR I '$D(DIRUT),Y=1 X DIWE(0)
QQ K DIWEPSE,DUOUT I $D(DIWE(1)) S DIWE=DIWE(1),DIWE(5)=$G(^DIST(1.2,DIWE,3)) X:DIWE(5)]"" DIWE(5)
QX K DWOU I $D(DIWESW) K DIWESW G:'$D(DIWE(1)) 1
 D:$D(DIWE(2)) X^DIWE Q
 ;
ASK W !,$$EZBLD^DIALOG(8170) R X:DTIME S:'$T DTOUT=1,X=U G AQ:U[X!(X=".") ;**CCO/NI 'SELECT ALTERNATE EDITOR:'
 I X'?.UNP S X=$$UP^DILIBF(X) ;**CCO/NI  UPPERCASE TRANSLATION
 S Y=X I X?1U.ANP,'$D(^DIST(1.2,"B",X)) S X=$O(^(X)) S:$E(X,1,$L(Y))'=Y X="?"
 S J="^DIST(1.2," I X?1U.UNP S I=$O(^DIST(1.2,"B",X,0)) I I>0 S ^DISV(DUZ,J)=I,DIWE(9)=I W $P(X,Y,2) G AX
 I X=" ",$D(^DISV(DUZ,J)) S I=^(J) I $D(^DIST(1.2,I,0))#2 S DIWE(9)=I,X=$P(^(0),U,1) W X G AX
 W !,$$EZBLD^DIALOG(8171) ;**CCO/NI (plus next line)  HELP MESSAGE ABOUT CHOOSING AND ALTERNATE EDITOR
 I X?2"?".E W $$EZBLD^DIALOG(8172) S Y="" F I=0:0 S Y=$O(^DIST(1.2,"B",Y)) Q:Y']""  S DIWE=+$O(^(Y,0)),DIWE(5)=$G(^DIST(1.2,DIWE,2)) I 1 X:DIWE(5)]"" DIWE(5) I $T W !?10,Y
 G ASK
AQ S X=U
AX Q
 ;
 ;DIC is the root of the where the text is located.
 ;DWLC is the line count, must be updated by the editor.
 ;The @(DIC_"0)") node will be updated by DIWE on exit.
 ;Variables not to be changed:
 ;DWHD,DIWPT,DWO,DWLR,DWL,DWPK,DWAFT,DIWE
 ;DIWE = Pointer to current editor
 ;DIWE(0) = Calling code
 ;DIWE(1) = if $D Called from this editor, will return at end.
 ;DIWE(2) = if $D Flag to say prefered editor not R/W used in exit.
 ;DIWE(5) = if $D Other execute code for OK TO RUN, RETURN TO CALLING
 ;DIWE(9) = if $D then entry number of editor to switch to.

DIWE2
DIWE2 ;SFISC/GFT-WP SEARCH, CHANGE, INSERT ;09:56 AM  26 Oct 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DWI=DWLC,DWJ=0,DWLR=DWLW I DWLC W !,$J(DWLC,3),">",@(DIC_DWLC_",0)")
NEWL W !,$J(DWJ+DWI+1,3),">" R X#245:DTIME I '$T,X="" S DTOUT=1 Q
 I X="",DIWPT'="" S X=" "
 Q:U[X!(DIWPT=X)
 I X?."?" D IQ^DIWE5 G NEWL
TAB F  Q:X'[$C(9)  S X=$S($L(X)+4>245:$TR(X,$C(9)," "),1:$P(X,$C(9))_"|TAB|"_$P(X,$C(9),2,999))
 I X'?.ANP W $C(7),!?9,$$EZBLD^DIALOG(8129),! F Y=1:1 I $E(X,Y)?.C G:Y>$L(X) NEWL:X="",G S X=$E(X,1,Y-1)_$E(X,Y+1,999),Y=Y-1 ;**CCO/NI  CONTROL CHARACTERS REMOVED!!
G G NW:'DWPK,NW:X?." "!(X[($C(124)_"TAB"_$C(124)))!($A(X)=124),NL:DWPK=1 S:DWI Y=@(DIC_DWI_",0)") S J=$L(X) I J+DWLR<DWLW S @(DIC_"DWI,0)")=Y_$E(" ",$A(Y,DWLR)'=32)_X,DWLR=$L(@(DIC_"DWI,0)")) G NEWL
 I DWLR+7<DWLW F J=DWLW-DWLR:-1:1 IF $E(X,J)=" " S @(DIC_"DWI,0)")=Y_$E(" ",$A(Y,DWLR)'=32)_$E(X,1,J-1),X=$E(X,J+1,256),DWLR=$L(X) Q
NL I $L(X)>DWLW S J=$F(X," ",DWLW-7),J=$S(J<1!(J>DWLW):DWLW,1:J),DWI=DWI+1,@(DIC_"DWI,0)")=$E(X,1,J-1),X=$E(X,J,256),DWLR=J G NL
 S:$L(X) DWI=DWI+1,@(DIC_"DWI,0)")=X,DWLR=$L(X) G NEWL
NW S:$L(X) DWI=DWI+1,@(DIC_"DWI,0)")=X,DWLR=DWLW G NEWL
 ;
I ;INSERT
 G 1:X=U,OPT^DIWE1:X=DIWPT S DWJ=X W:X !,$J(DWJ,3),">",^(0) K ^UTILITY($J,"W") S DWI=0,DIC(1)=DIC,DIC="^UTILITY($J,""W"",",@(DIC_"0)")="",DWLR=DWLW D NEWL G D:'DWI
 W !,$$EZBLD^DIALOG(8123,DWI) ;**CCO/NI 'N LINES INSERTED..'
 X "F DWL=DWI+DWLC:-1:DWJ+DWI+1 S "_DIC(1)_"DWL,0)="_DIC(1)_"DWL-DWI,0) W ""."""
 X "F DWL=DWI:-1:1 S "_DIC(1)_"DWJ+DWL,0)="_DIC_"DWL,0) W ""."""
D S DWLC=DWLC+DWI,DIC=DIC(1) K ^UTILITY($J,"W"),DIC(1)
1 G ^DIWE1
 ;
S ;SEARCH
 R X:DTIME S:'$T DTOUT=1 I X]"" W " ...",! X "F I=1:1:DWLC I "_DIC_"I,0)[X W $J(I,3)_"">""_^(0),! S DWL=I"
 G 1^DIWE1
 ;
C ;CHANGE;  **CCO/NI  THIS WHOLE SUBROUTINE IS CHANGED
 R DWI:DTIME S:'$T DTOUT=1 G 1:DWI="" W $$EZBLD^DIALOG(8122) R DWJ:DTIME S:'$T DTOUT=1 G 1:'$T
 W !,$$EZBLD^DIALOG(8125) S %=2 D YN^DICN G 1:%<1 S DWL=%=1
FR D  G 1:'X S J=X
 .N DIR S DIR(0)="NAO^1:"_DWLC_":0",DIR("A")=$$EZBLD^DIALOG(8118),DIR("B")=1 D ^DIR
TO D  G 1:'X S I=X
 .N DIR,DTOUT S DIR(0)="NAO^"_+J_":"_DWLC_":0",DIR("A")=$$EZBLD^DIALOG(8117),DIR("B")=DWLC D ^DIR
 W " ...",! F J=J:1:I I @(DIC_"J,0)")[DWI D
 .N L,DIR,DTOUT
 .S DIR(0)="YOA",DIR("A")=$$EZBLD^DIALOG(8124),DIR("B")=$P($$EZBLD^DIALOG(7001),U)
 .S Y=0,L=^(0) I DWL W $J(J,3)_">"_L D ^DIR W ! I $G(Y)-1 S:$D(DTOUT) J=I Q
 .F  S Y=$F(L,DWI,Y) Q:'Y   S L=$E(L,1,Y-$L(DWI)-1)_DWJ_$E(L,Y,999),Y=Y-$L(DWI)+$L(DWJ)
 .W $J(J,3)_">"_L,! S ^(0)=L
 G 1
 ;8117 = 'to line'
 ;8118 = 'from line:'
 ;8122 = 'change to: '
 ;8124 = 'OK to change'
 ;8125 = 'Ask OK for each line found'

DIWE3
DIWE3 ;SFISC/GFT-WP - MOVE, DELETE, REPEAT, TRANSFER ;02:10 PM  8 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
M ;MOVE
 S DWAFT=1 G 1:X=U,OPT:'X S (DW1,DW3)=0 D MOVE Q:$D(DTOUT)  S:DW1>DW3 DW1=DW1+I,DW2=DW2+I D DEL:DW1
1 G ^DIWE1
 ;
OPT W ! G OPT^DIWE1
 ;
R ;REPEAT
 S DWAFT=1 G 1:X=U,OPT:'X D MOVE
 G 1
 ;
D ;DELETE; **CCO/NI  MOST LINES FROM HERE TO 'YN' HAVE BEEN CHANGED
 S DW1=X G 1:X=U,OPT:'X W "  "_$$EZBLD^DIALOG(8117)_DW1_"// " R DW2:DTIME S:'$T DTOUT=1
 G 1:DW2=U!'$T S:DW2="" DW2=DW1 I DW1>DW2 W $C(7),"??" G OPT
 I DW2>DWLC S DW2=DWLC W "  ("_DW2_")"
 S X=DW2-DW1+1,%=2 W !,$$EZBLD^DIALOG(8116,X)
 D YN^DICN I %-1 W "  ",$$EZBLD^DIALOG(8114) G 1
 S %=2 I DW1=1,DW2=DWLC W !,$C(7),$$EZBLD^DIALOG(8115) D YN^DICN G 1:%-1
 D DEL K DWL G 1
 ;
F W !,$$EZBLD^DIALOG(8118) R DWL:DTIME S:'$T DTOUT=1 G Q:DWL=U!'$T ;'FROM LINE:  '
 I DWL?."?" D H G F
 I +DWL'=DWL W $C(7)," ??  ",$$EZBLD^DIALOG(8054) G F
MOVE W "  ",$$EZBLD^DIALOG(8117) R DW2:DTIME S:'$T DTOUT=1 G Q:DW2=U!'$T S DW1=DWL ;**CCO/NI 'THRU:'
 I DW2=$$UP^DILIBF($$EZBLD^DIALOG(7097)) S DW2=DWLC ;*CCO/NI "END" FOR END
 I 'DW2 S DW2=DW1 W " (",DW1,")"
 S %=2 G YN:'DWAFT W "  ",$$EZBLD^DIALOG(8119) R DW3:DTIME S:'$T DTOUT=1 G Q:DW3=U!'$T ;**CCO/NI 'AFTER LINE:'
 I DW1-1<DW3,DW2>DW3 G Q
 I DW1<1!(DW2>DWLC)!(DW1>DW2)!(DW3<0)!(DW3>DWLC)!(+DW3'=DW3) G Q
YN W !,$$EZBLD^DIALOG(7050) D YN^DICN
 G Q:%-1 K ^UTILITY($J,"W") S I=0
 I DWAFT?.N X "S J=DW1-.1 F  S J=$O("_DIC_"J)) Q:J>DW2!(J'>0)  I $D(^(J,0)) S X=^(0) D O" S:J="" J=-1 G DN
 I DW1>DW2 G Q
 N % S %=DW1-1 F  S %=$O(^TMP($J,"DIWE3",%)) Q:%'>0!(%>DW2)  I $D(^(%,0))#2 S X=^(0) D O
DN G Q:'I X "F J=DWLC:-1:DW3+1 S "_DIC_"J+I,0)="_DIC_"J,0)","F J=1:1:I S "_DIC_"DW3+J,0)=^UTILITY($J,""W"",J,0) W ""."""
 K ^UTILITY($J,"W"),DWL,X,DICMX,^TMP($J,"DIWE3") S DWLC=DWLC+I,@(DIC_"0)")=DWLC Q
DEL S I=+DW1
 X "F J=DW2+1:1:DWLC S "_DIC_"I,0)="_DIC_"J,0),I=I+1 W ""."""
 S I=DW2-DW1
 X "F J=DWLC-I:1:DWLC K "_DIC_"J) W ""."""
 S DWLC=DWLC-I-1 Q
H N DIR,X,Y,DIRUT,%
 S DIR(0)="E"
 F %=1:1 Q:'$D(^TMP($J,"DIWE3",%))  S X=$G(^(%,0)) W !,$J(%,3),">",X I %#15=0 D ^DIR Q:X=U!$D(DIRUT)
 Q
Q W "  ",$$EZBLD^DIALOG(8121) S DW1=0 K DWL,X,DICMX,DWAFT Q  ;**CCO/NI  'NO CHANGE'
O S I=I+1,^UTILITY($J,"W",I,0)=X Q
 ;
Z ;TRANSFER
 Q:X=""!(X[U)!(X>DWLC)  S DW3=X
 N VAL,FILE,FLD,WPROOT,IENS,ARR,RT,FI,FD,WPRT,IEN S FI=0,RT=DIC
 D RT(RT,"ARR") I $G(ARR)=U G Z0
 S FI=ARR("FILE"),FD=ARR("FLDNO"),WPRT=ARR("ROOT"),IEN=ARR("IENS")
Z0 N MSG S MSG="",FILE=FI,FLD=$G(FD),WPROOT=$G(WPRT),IENS=$G(IEN)
 W !,$$EZBLD^DIALOG(8131) R VAL:DTIME I '$T!(U[VAL)!(VAL="") S DUOUT=1 Q  ;**CCO/NI 'FROM WHAT TEXT'
 I VAL?1."?" D  G Z0
 .N X,Y,D,DIC,DIR,DZ,DIX,DIY,DIZ,DO,DD
 .S X=8132 D:$G(FILE)=3.9  S X=8133 D:$G(FILE)-3.9&$G(FILE)  S X=8134 D
 ..D BLD^DIALOG(X),MSG^DIALOG("WH")
 .I FILE D
EGP ..W !,$$EZBLD^DIALOG(8064),$$EZBLD^DIALOG(8066,$O(^DD(FILE,0,"NM",0))),"?" ;**CCO/NI 'WANT THE ENTIRE LIST'
 ..S DZ="??" S DIR(0)="Y" D ^DIR Q:'Y
 ..S DIC=WPROOT,DIC(0)="QEM",D="B" D DQ^DICQ
 ..Q
 .Q
 I VAL'[":",'FILE S MSG="SELECT FILE TO TRANSFER FROM" D Q0 G Z0
 I VAL[":" D PRSREL I MSG]"" D Q0 G Z0
 D DIC I MSG]"" D Q0 G Z0
 I FILE=3.9 S Y=+IENS D XM(.Y) Q:'Y  S IENS=+Y_","
 D GET1 I MSG]"" D Q0 G Z0
 S DWAFT=U D F
 Q
RT(DIROOT,DIARR) ;
 N QL,CROOT,FILE,GL,OK,RT,TOPFILE
 Q:$G(DIROOT)=""
 S CROOT=$NA(@$$CREF^DILF(DIROOT))
 S:$G(DIARR)="" DIARR=$NA(^TMP($J,DIROOT))
 K @DIARR
 ;
 S QL=$QL(CROOT)
 I QL>1 D
 . S RT=$NA(@CROOT,QL-2),FILE=+$P($G(@RT@(0)),U,2),RT=$$OREF^DILF(RT)
 . I FILE,$D(^DD(FILE,0))#2 D
 .. S TOPFILE=$$FNO^DILIBF(FILE)
 .. I TOPFILE D
 ... S GL=$G(^DIC(TOPFILE,0,"GL"))
 ... I GL]"",RT[GL S OK=1 D RT1
 S:'$G(OK) @DIARR=U
 Q
RT1 ;
 N %,FLD,IENS,NOD,X,Y
 S @DIARR@("FILE")=FILE
 S @DIARR@("TOPFILE")=TOPFILE
 S @DIARR@("ROOT")=RT
 ;
 S NOD=$QS(CROOT,QL),FLD=$O(^DD(FILE,"GL",NOD,0,""))
 I FLD,$P($P($G(^DD(FILE,FLD,0)),U,4),";")=NOD S @DIARR@("FLDNO")=FLD
 ;
 S IENS="" F %=QL-3:-2:1 S IENS=IENS_$QS(CROOT,%)_","
 S @DIARR@("IENS")=IENS
 Q
 ;
PRSREL N DIFNM,FIELD,X,FTYPE,T,M,W,I,FI,FD,WPRT S X=VAL ;**CCO/NI
 S T=$F(X," IN ") I T S X=$E(X,1,T-5),W=":",M=T-4,I=X_W_$E(VAL,T,999),T=$F(I," FILE",M) S:T&$F(W,$E(I,T)) I=$E(I,1,T-6)_$E(I,T,999) S X=I
 S VAL=$P(X,":"),FI=$P(X,":",2),FD=$P(X,":",3)
 I 'VAL,VAL'?1"`".N,VAL'?1"""".E1"""" S MSG="INVALID SYNTAX" Q
 I $E(VAL)=$C(34) D
 . I VAL?3"""".E3"""" S @("VAL="_VAL) Q
 . S VAL=$E(VAL,2,$L(VAL)-1)
 S DIFNM=FI,FI=$S(FI="":0,FI&($G(^DIC(FI,0))]""):FI,FI'?.N:$O(^DIC("B",FI,"")),1:0) ;**CCO/NI  REMEMBER FILE NAME
 I 'FI S MSG=$$EZBLD^DIALOG(409,DIFNM) Q  ;**CCO/NI INVALID FILE
ACC D DIAC S FIELD=FD I 'FI S MSG=$$EZBLD^DIALOG(1410) Q  ;**CCO/NI " NO READ ACCESS TO FILE"
 S FD=$S(FD:FD,FD'?.N:$O(^DD(FI,"B",FD,"")),1:0)
 I 'FD!('$D(^DD(FI,+FD,0))) S DIFNM("FILE")=FI,DIFNM(1)=FIELD,MSG=$$EZBLD^DIALOG(501,.DIFNM) Q  ;**CCO/NI "INVALID FIELD"
 I FD S FTYPE=$P($G(^DD(+$P($G(^DD(FI,FD,0)),U,2),.01,0)),U,2) I FTYPE'["W" S MSG=$$EZBLD^DIALOG(504,FD) Q  ;**CCO/NI 'NOT W-P'
 I FTYPE["L" D
 .N DIR,X,Y
 .D BLD^DIALOG(8130),MSG^DIALOG("WM") S DIR(0)="Y" D ^DIR ;**CCO/NI   WARNING ABOUT NON-WRAP
 .W ! S:'Y MSG=$$EZBLD^DIALOG(8135) Q  ;**CCO/NI 'CANCELLED'
 S:MSG="" FILE=FI,FLD=FD,WPROOT=$G(^DIC(FI,0,"GL")) Q
DIC N X,DIC,Y
 S DIC=WPROOT,X=VAL,DIC(0)="QEM" D ^DIC
 I Y<0 S MSG=$$EZBLD^DIALOG(1402) Q  ;**CCO/NI "NO RECORD FOUND"
 I IENS]"" S IENS=+Y_","_IENS
 E  S IENS=+Y_","
 Q
GET1 N X K ^TMP($J,"DIWE3")
 S X=$$GET1^DIQ(FILE,IENS,FLD,"Z","^TMP($J,""DIWE3"")")
 I $D(^TMP($J,"DIWE3")) Q
 S MSG=$$EZBLD^DIALOG(1403) ;**CCO/NI "NO TEXT TO TRANSFER FROM"
 Q
 ;
Q0 W:$X ! W "  <"_MSG_">",$C(7) Q  ;**CCO/NI  DO LINE FEED
 ;
DIAC I FI=3.9 Q
 N DIAC,DIFILE
 S DIAC="RD",DIFILE=FI
 D ^DIAC S:'DIAC FI=0
 Q
XM(Z) N %,A9,XMZ,ARR,MSG,A1
 S A1=Z
% W !,"Transfer which Response: Original Message// " R A9:DTIME I A9[U S MSG=$$EZBLD^DIALOG(8135),Z=0 D Q0 Q  ;**CCO/NI 'CANCELLED'
 I A9?1."?" S XMZ=+Z D ENT8^XMAH S Z=A1 G %
 I A9=""!(A9=0)!(A9="O") Q
 I A9 D  Q:Z
 . N A0 S %=$$HDR^XMGAPI2(+Y,.ARR,9) S A0=$G(ARR("RSP",A9))
 . I A0 S Z=A0 Q
 . S MSG=$$EZBLD^DIALOG(1401),Z=0 D Q0 ;**CCO/NI 'INVALID RESPONSE'
 S Z=A1 G %

DIWE4
DIWE4 ;SFISC/GFT-WP - PRINT, BREAK, JOIN, PROGRAMMER-EDIT ;02:07 PM  8 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PRINT W " "_$$EZBLD^DIALOG(8117)_DWLC_"// " R DW2:DTIME S:'$T DW2=U,DTOUT=1 S:DW2="" DW2=DWLC Q:DW2>DWLC!(DW2<X)  S DW2=+DW2 ;**CCO/NI  'TO LINE:'
LINNUMS S:$D(DV)[0 DV=0 S %=2 W !,$$EZBLD^DIALOG(8162) D YN^DICN Q:%<1  S I=%,J=0 ;**CCO/NI 'WANT LINE NUMBERS?'
RD I I=1 S %=2 W !,$$EZBLD^DIALOG(8163) D YN^DICN Q:%<0  S:%=1 J=124 I %=0 W !,$$EZBLD^DIALOG(8164),! G RD ;**CCO/NI 'ROUGH DRAFT? AND HELP
D0 ;Entry point for screen editor.
 S DIWF="W"_$S(J:"N",DWPK="FM"&$D(DQ(1)):$E("N",$P(DQ(1),U,2)["L"),1:"")_$E("L",I)_$C(J)
 K DW1,IOP,I,J D:'$D(DISYS) OS^DII I $D(^%ZTSCH("RUN")),$D(^%ZOSF("UCI")),$D(^DD("OS",DISYS,8)) S %ZIS="QM"
 D ^%ZIS G K:POP
 S DIWR=IOM-(DIWF["L"*4),DIWL=1,DWI="F D=DWL:0 S X="_DIC_"D,0) D ^DIWP S D=$O("_DIC_"D)) Q:(D'>0)!(D>"_DW2_")  I '(D#60),$D(ZTQUEUED),$$S^%ZTLOAD S X=$$EZBLD^DIALOG(1528) D ^DIWP S ZTSTOP=1 Q",DWJ=0 ;**CCO/NI 'TASK STOPPED'
HD I DWPK'="FM" S DWH=$$EZBLD^DIALOG(8165) G QUE ;**CCO/NI HEADING FOR OUTPUT
 S:$G(DIEL)="" DIEL=DL-1 S DW1=DIE,DW2=DA,%=DIEL,I(%)=DIE,J(%)=DP,I(%,0)=DA,DWH=$S($D(DQ)<11:"",1:$P(DQ(DQ),U))
DWH S DWH=$O(^DD(J(%),0,"NM",0))_$P(" FILE",1,'%)_":"_DWH I @("$D("_I(%)_I(%,0)_",0))") S DWH=""""_$P(^(0),U,1)_""" IN "_DWH
 S %=%-1 I %+1,$D(DP(%+1)),$D(DIE(%+1)),$D(DA(DIEL-%)) S J(%)=DP(%+1),I(%)=DIE(%+1),I(%,0)=DA(DIEL-%) G DWH
QUE I '$D(IO("Q")) D PRNT G X
 S DIR(0)="D^::AEFR",DIR("A")=$$EZBLD^DIALOG(8160),DIR("B")="NOW" D ^DIR G:$D(DIRUT) X S ZTDTH=Y ;**CCO/NI 'ENTER A DATE/TIME'
 S ZTRTN="PRNT^DIWE4",ZTDESC=DWH
 F %="DIC","DIWF","DIWL","DIWR","DV","DWH","DWI","DWJ","DWL","DW2","D0","I","J","I(","J(" S ZTSAVE(%)=""
 D ^%ZTLOAD S IOP="HOME" D ^%ZIS W $$EZBLD^DIALOG(8161,$G(ZTSK)),! K ZTSK G X ;**CCO/NI  'REQUEST QUEUED'
 ;
PRNT S ^UTILITY($J,1)="S DWJ=DWJ+1 W:$D(DIFF)&($Y) @IOF S DIFF=1 W ?3,DWH,?IOM-22,"" "" S Y=DT X ^DD(""DD"") W Y,""   "",$$EZBLD^DIALOG(7095,DWJ),!!" ;**CCO/NI 'PAGE'
 I $E(IOST)="C" S DIFF=1
 U IO X ^(1),DWI D ^DIWW W:$E(IOST)'="C"&($Y) @IOF D CLOSE^DIO4
 I $D(ZTQUEUED) S ZTREQ="@"
 Q
 ;
X S:$D(DW1) DIE=DW1,DA=DW2
K K %,I,J,X1,DIWF,DIWL,DIWR,DIWT,DIWLL,DISYS,DW1,DW2,DWJ,DWH,DIFF,DIR,POP,^UTILITY($J,1) Q
 Q
 ;
Y ;
 Q:DUZ(0)'["@"
 R !!,"The text is in X and returned in Y",!,"Enter MUMPS xecute string to do transformation: ",X:DTIME S:'$T DTOUT=1 G 1:X'?1U.E D ^DIM G 1:'$D(X) S DW=X
 R !,"Edit from line: 1// ",DW1:DTIME S:'$T DTOUT=1 G 1:DW1=U!'$T S:DW1="" DW1=1 G 1:+DW1'=DW1 W "  thru: ",DWLC,"// " R DW2:DTIME S:'$T DTOUT=1 G 1:DW2=U!'$T S:DW2="" DW2=DWLC
 IF (DW1>DW2)!(DW2>DWLC)!(DW1<1) G 1
 F I=DW1:1:DW2 S X=@(DIC_"I,0)") K Y X DW I $D(Y)=1 S @(DIC_"I,0)")=Y W !,$J(I,3)_">"_Y S DWL=I
 G 1
 ;
B ;BREAK
 G 1:X=U,OPT:'X
BA W !,$$EZBLD^DIALOG(8120) R X:DTIME S:'$T DTOUT=1 G 1:U[X S DW=^(0) I DW'[X W $C(7),"??" G BA ;**CCO/NI 'AFTER CHARACTERS:'
 S DWLC=DWLC+1 X "F I=DWLC:-1:DWL+1 S "_DIC_"I,0)="_DIC_"I-1,0) W ""."""
 S @(DIC_"0)")=DWLC,Y=$F(DW,X)-1,@(DIC_"DWL,0)")=$E(DW,1,Y),@(DIC_"DWL+1,0)")=$E(DW,Y+1,999)
 W !,$J(DWL,3)_">",@(DIC_"DWL,0)"),!,$J(DWL+1,3)_">",@(DIC_"DWL+1,0)")
1 G ^DIWE1
 ;
OPT W ! G OPT^DIWE1
 ;
J ;JOIN
 G 1:X=U,OPT:'X I X=DWLC W $C(7),"??" G OPT
 S @("Y="_DIC_"X+1,0)"),@("J="_DIC_"X,0)"),I=$L(Y)+$L(J)-250 I I>0 W !,$$EZBLD^DIALOG(349,I) G 1 ;**CCO/NI  TOO LONG
 S ^(0)=J_" "_Y W !,$J(X,3)_">"_^(0),! F I=X+1:1:DWLC-1 S @(DIC_"I,0)="_DIC_"I+1,0)") W "."
 K @(DIC_"DWLC)") S DWLC=DWLC-1 G 1

DIWE5
DIWE5 ;SFISC/GFT-WP, AUX FUNCTIONS ; 15NOV2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;**CCO/NI   ENTIRE ROUTINE CHANGED
LNQ ;
 W !,$$EZBLD^DIALOG(8150),"("_(I'=6)_$P("-"_DWLC,U,DWLC>1)_")" ;**CCO/NI
 I $G(DWL) D
 .W !?9,$$EZBLD^DIALOG(8151,DWL) ;**CCI/NI
 .I DWL>2 W !?9,$$EZBLD^DIALOG(8152,DWL) ;**CCO/NI
 .I DWLC>DWL W !?9,$$EZBLD^DIALOG(8153,DWL+1) ;**CCI/NI
 W ! Q
 ;
WL W !,"INITIALS:",! S X=$P(DIC,"(",1) Q:$D(@X)<9  S X=$O(@(X_"(0)"))-1,I=0 F  S X=$O(^(X)) Q:X=""  W X,!
 S X=-1 Q
NL W !,"TEXT NAMES:",! S %T2="",I=0 F  S %T2=$O(@(DW_")")) Q:%T2=""  W %T2,?20,^(%T2,0),!
 K %T2 Q
 ;
F ;
 W !!,"Line WIDTH: "_DWLW_"//" R X:DTIME S DWLW=$S(X<10:DWLW,X>255:DWLW,1:X\1)
 W !,"PACK "_$S(DWPK:"ON",1:"OFF")_"//" R X:DTIME S DWPK=$S(X="ON":1,1:0)
 Q
X ;FILE TRANSFER
 D:'$D(DISYS) OS^DII
 D  Q:X=""  S DIWL=X,(%,%B)="" X ^DD("OS",DISYS,"EOFF")
 .N DIR,DIRUT,DIROUT,DTOUT,DUOUT
 .W ! S DIR("A")=$$EZBLD^DIALOG(8156) ;MAX STRING LENGTH
 .S DIR("B")=75,DIR(0)="N^3:245:0" D ^DIR K DIR I $D(DIRUT) S X="" Q
 .W !! D BLD^DIALOG(8155),MSG^DIALOG("WM") Q  ; Long messge about 30-sec timeout
ENT I '$D(DIWL) S DIWL=245
A R X#245:30 E  I '$L(X) D S:$L(%B) X ^DD("OS",DISYS,"EON") W !!,$$EZBLD^DIALOG(8157),! Q
 S:X="" X=" " I X?.ANP S Y=X G D
 S I=0,Y=""
C S I=I+1 I $E(X,I,999)?.ANP S Y=Y_$E(X,I,999) G D
 S %=$E(X,I),%0=$A(%)
 I %?1C S %="" I %0=9 S %=$E("         ",1,9-($L(Y)-($L(Y)\9*9)))
 S Y=Y_% D S:$L(Y)>DIWL I ":27:13:"[(":"_%0_":") D S
 G C
D D S G D:$L(Y)'<DIWL S %B=Y,Y="" G A
S S:$L(%B) %B=%B_$S($E(Y)=" ":"",1:" ") S %=%B_Y,%2=$L(%) Q:'%2  S Y=""
 I %2>DIWL F %1=DIWL:-1 I %1<$S(DIWL-12>0:DIWL-12,1:4)!(" -"[$E(%,%1)) S Y=$E(%,%1+1+$S($E(%,%1+1)=" ":1,1:0),999),%=$E(%,1,%1-$S($E(%,%1)=" ":1,1:0)) Q
 S %B="",DWLC=DWLC+1,@(DIC_"DWLC,0)")=%
 Q
TQ ;
 D  G Z^DIWE3
 .N DIP S DIP(1)=J,DIP(2)=I
 .D BLD^DIALOG(9183),MSG^DIALOG("WH") ;**CCO/NI
 ;
IQ ;
 I $D(DC) W:$D(^DD(+$P(DC,U,2),.01,3)) !?4,^(3),! X:$D(^(4)) ^(4) F %=0:0 S %=$O(^DD(+$P(DC,U,2),.01,21,%)) Q:%'>0  W !,^(%,0)
 W !! D BLD^DIALOG(9180),MSG^DIALOG("WH") ;**CCO/NI
 W !,$C(7),$$EZBLD^DIALOG(9181) S %=2 D YN^DICN Q:%-1  ;**CCO/NI
 W !?5,$$EZBLD^DIALOG(9182) ;**CCO/NI
FN S %=15 F  S %=$O(^DD("FUNC",%)) Q:%>97  I $D(^(%,10)) W !," |"_$P(^(0),U,1)_$P("(ARGUMENT)",U,$S('$D(^(3)):1,1:^(3)'=0))_"|",?25 W:$D(^(9)) ^(9)

DIWF
DIWF ;SFISC/GFT-FORMS PRINT ;01:52 PM  13 Nov 2000
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 D DT^DICRW,DICS,L S DIC("S")=DIC("S")_" I  "_L
 S DIC="^DIC(",DIC(0)="AEQMZ",DIC("A")="Select Document File: "
 D ^DIC K DIC Q:Y<0
FINDWORD X L I '$T S Y=-1 G Q
 S DJ=%,DIC=DIWF,D=$O(^DD(DIWFN,"SB",%,0)) S:D="" D=-1 Q:'$D(^DD(DIWFN,D,0))  S D=$P($P(^(0),U,4),";") S:+D'=D D=""""_D_"""" S DIWF=DIWF_"DIWFN,"_D_","
 S D=0 F  S D=$O(^DD(DIWFN,D)) Q:D'>0  I $D(^(D,0)),$P(^(0),U,3)="DIC(" S DIWF(0)=D Q
 S:D="" D=-1
DOC S DIC(0)="AEQM" D ^DIC G Q:Y<0
 I $D(DIWF(0)) S D=$P(^DD(DIWFN,DIWF(0),0),U,4),%=$P(D,";",1) I @("$D("_DIC_+Y_",%))") S D=$P(D,";",2),X=$S(D:$P(^(%),U,D),1:$E(^(%),+$E(D,2,9),+$P(D,",",2))) S:X DIWF(1)=X
 S DIWFN=+Y I @("$O("_DIWF_"0))'>0") W $C(7),!?7,"'"_$P(Y,U,2),"' HAS NO '"_$P(^DD(DJ,.01,0),U,1)_"' TEXT!",! G DOC
EN2 ;
 N DIC,DIA,DHIT,FLDS,DHD
 I $O(@(DIWF_"0)"))'>0 G Q
 S DIC(0)="AIQEMZ",DIC="^DIC(",DIC("A")="Print from what FILE: "
 I $D(DIWF(1)) S DIC(0)="ZIF",X=DIWF(1)
 D DICS:'$D(DIWF(1)),^DIC K DIC G Q:Y<0,Q:'$D(^DIC(+Y,0,"GL")) S DIC=^("GL")
 S %=1 I $D(BY)[0 W !,"WANT EACH ENTRY ON A SEPARATE PAGE" D YN^DICN G Q:%<1
 S L=0,DHD="@",FLDS="",DHIT="X "_$P("^UTILITY($J,1):$Y,",9,%)_"DIWFX D ^DIWW",DIWFX="S DIWF=""?W"",DIWL=1,DIWR=IOM,D=0 F  S D=$O("_DIWF_"D)) S:D="""" D=-1 Q:D'>0  I $D(^(D,0)) S X=^(0) D ^DIWP" K DIWF D EN1^DIP
Q K L,DIWF,DIWFN,DIWFX,DIFILE,DIAC Q
 ;
EN1 ;
 I DIC Q:'$D(^DIC(+DIC,0))  S Y=DIC D L G FINDWORD
 I @("$D("_DIC_"0))") S DIC=+$P(^(0),U,2) G EN1
 Q
 ;
DICS S DIC("S")="S DIFILE=+Y,DIAC=""RD"" D ^DIAC I %" Q
 ;
L S L="I $D(^DIC(+Y,0,""GL"")) S DIWF=^(""GL"") I $D(@(DIWF_""0)"")) S DIWFN=+$P(^(0),U,2) I $D(^DD(DIWFN,""SB"")) S %=0 F  S %=$O(^DD(DIWFN,""SB"",%)) S:%="""" %=-1 Q:%<0  I $P(^DD(%,.01,0),U,2)[""W"" Q"

DIWP
DIWP ;SFISC/GFT-ASSEMBLE WP LINE ;24APR2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;The DIWF variable contains a string of one-letter codes to control W-P output.
 ;"|" in DIWF means that "|"-windows are not to be evaluated, but are to be printed as
 ;     they stand.
 ;"X" means eXactly line-for-line, with "||" printed as "||"
 ;"W" in DIWF means that formatted text will be written out to
 ;     the current device as it is assembled.
 ;"N" means NOWRAP-- text is assembled line-for-line
 ;"R" means text will be assembled Right-justified
 ;"D" means text will be double-spaced
 ;"L" means internal line numbers appear at the left margin
 ;"C" followed by a number will cause formatting of text in a column
 ;     width specified by the number.
 ;"I" followed by a number will cause text to be indented that number
 ;     of columns.
 ;"?" means that, if user's terminal is available, "|"-windows that cannot
 ;     be evaluated will be asked from the user's terminal.
 ;"B" followed by number causes new page when output gets within that
 ;   number of lines from the bottom of the page (as defined by IOSL).
 ;   
 ;DIWTC is a Boolean -- Are we printing out in LINE MODE?
 S:'$L(X) X=" "
 S DIWTC=X[($C(124)_"TAB") S:'$D(DN) DN=1
LN S:'$D(DIWF) DIWF="" S:'DIWTC DIWTC=DIWF["N" S DIWX=X,DIW=$C(124),I=$P(DIWF,"C",2) I I S DIWR=DIWL+I-1
 I '$D(^UTILITY($J,"W",DIWL)) S ^(DIWL)=1 K DIWFU,DIWFWU,DIWLL D DIWI S:'$D(DIWT) DIWT="5,10,15,20,25" G DIW
 S I=^(DIWL),DIWI=^(DIWL,I,0) I DIWI="" D DIWI G Z
 D NEW:DIWTC
Z S Z=X?.P!DIWTC I X?1" ".E!Z S DIWTC=1 D NEW:DIWI]"" S DIWTC=Z
DIW ;from RCR+5^DIWW
 I DIWF["X" S DIWTC=1,X=DIWX,DIWX="" D C G D ;**DI*22*152**  Leave line unaltered
 S X=$P(DIWX,DIW,1) D C:X]"" S X=$P(DIWX,DIW,1),DIWX=$P(DIWX,DIW,2,999) G D:DIWX="" I $D(DIWP),X'?.E1" " D ST
 S X=$P(DIWX,DIW,1) I $P(X,"TAB",1)="" D TAB G N
 I X="TOP" D PUT S ^("X")="S DIFF=1 X:$D(^UTILITY($J,1)) ^(1)" D NEW G N
 I DIWF'[DIW G U:X="_" D PUT,RCR^DIWW G N:$D(X)
 S X=DIW_$P(DIWX,DIW,1) S:DIWX[DIW!(DIWF'[DIW) X=X_DIW D C ;DO NOT PUT GRATUITOUS "|" AT END, IF DIWF["|"
N K X S DIWX=$P(DIWX,DIW,2,99) I DIWX]"" D ST:$D(DIWP) G DIW
D K DIWP D PUT,PRE:DIWTC S:DIWTC DIWI="" Q
 ;
ST S DIWI=$E(DIWI,1,$L(DIWI)-1) K DIWP Q
 ;
DIWI S DIWI=$J("",+$P(DIWF,"I",2)) I DIWF["L",$D(D)#2 S DIWLL=D
 Q
PUT S I=^UTILITY($J,"W",DIWL),^(DIWL,I,0)=DIWI I DIWF["L",$D(DIWLL) S ^("L")=DIWLL
 Q
L ;
 S DIWTC=1 G LN
 ;
TAB I X="" S X=DIW G C
 S J=$P(DIWT,",",DIWTC),DIWTC=DIWTC+1 S:X?3A1P.P.N.E J=$E(X,5,9) S:J?1"""".E1"""" J=$E(J,2,$L(J)-1)
 I J'>0 S %=$P(DIWX,DIW,2) Q:%=""  S J=$S(J<0:1-$L(%)-J,J="C":DIWR-DIWL-$L(%)\2,1:0)
 S J=J-1-$L(DIWI) Q:J<1  S X=$J("",J)
C K DIWP I DIWTC S DIWI=DIWI_X Q
B S Z=DIWR-DIWL+1-$L(DIWI) G FULL:$F(X," ")-1>Z F %=Z:-1 I " "[$E(X,%) S:$E(X,%+1)=" " %=%+1 Q
 S Z=$E(X,1,%-1),X=$E(X,%+1,999) I Z]"" S DIWI=DIWI_Z G S:X]"" S %=$E(Z,$L(Z)) S:%'=" " DIWI=DIWI_$J("",%="."+1),DIWP=1 Q
FULL I $P(DIWF,"I",2)'<$L(DIWI) S DIWI=DIWI_$P(X," ",1),X=$P(X," ",2,999)
S D PUT,NEW G B:X]"" Q
 ;
U S I=^UTILITY($J,"W",DIWL) I $D(DIWFU) S ^(DIWL,I,"U",$L(DIWI)+1)="" K DIWFU G N
 S ^(DIWL,I,"U",$L(DIWI)+1)=X,DIWFU=1 G N
 ;
NEW D DIWI
PRE S I=^UTILITY($J,"W",DIWL),^(DIWL)=I+1,^(DIWL,I+1,0)="" I DIWF["D" S ^(0)=" ",^UTILITY($J,"W",DIWL)=I+2,^(DIWL,I+2,0)=""
 I $D(DIWFU) S ^("U",1+$P(DIWF,"I",2))="_"
 G P:DIWF'["R"!DIWTC K % Q:'$D(^UTILITY($J,"W",DIWL,I,0))
 S Y=^(0),%=$L(Y) F %=%:-1 Q:$A(Y,%)-32
 S Y=$E(Y,1,%),J=DIWR-DIWL-%+1,%X=0 G P:J<1
 F %=1:1 S %(%)=$P(Y," ",1),Y=$P(Y," ",2,999) G:Y="" PAD:%-1,P I $E(%(%),$L(%(%)))?.P S:%=1&(%(%)="") %=0,%X=%X+1 S:%&J J=J-1,%(%)=%(%)_" "
PAD I J F Y=%\2+1:1:%-1,%\2:-1 S %(Y)=%(Y)_" ",J=J-1 G PAD:Y=1!'J
 S Y=%(%) F %=%-1:-1:1 S Y=%(%)_" "_Y
 S ^(0)=$J("",%X)_Y K %
P I DIWF["W" G NX^DIWW

DIWW
DIWW ;SFISC/GFT-OUTPUT WP LINE ;5NOV2007
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=0:1 G:$D(DN) QQ:'DN Q:$D(^UTILITY($J,"W"))<9  D T G:$D(DN) QQ:'DN D 0
T W:$X !
B Q:$S($D(DN):'DN,1:0)  I '$D(DIWF) S DIWF=""
 I '$D(DIOT(2)),$D(IOSL),$Y+$S($P(DIWF,"B",2):$P(DIWF,"B",2),1:2)'<IOSL,$D(^UTILITY($J,1))#2,^(1)?1U1P1E.E X ^(1) I $D(DN),'DN S D0="zzzzzz",W=9999999 Q
 F I=$Y+2:1:+$P(DIWF,"T",2) W !
 Q
 ;
A ;
 D 0 G DIWW
 ;
NX ;
 W:$X+1>DIWL ! D B G:$D(DN) Q:'DN
0 ;
 S I=999999,%="" F  S %=$O(^UTILITY($J,"W",%)) Q:%=""  S:$O(^(%,""))<I I=$O(^(""))
1 S %="" F  S %=$O(^UTILITY($J,"W",%)) Q:%=""  I $D(^(%,I)) D W I $D(^UTILITY($J,"W",%))<9 K ^(%) I $O(^(""))="" K DIWI,DIWX,DIWTC
 S:%="" %=-1 G Q
 ;
W G X:^(I,0)="",O:'$D(DIWF) I DIWF[" " S DIWF=$P(DIWF," ",1)_$P(DIWF," ",2) G X:^(0)?." "
 W:$X+(%>0)>% ! I DIWF["L",$D(^("L")) W $E(^("L")_"   ",1,4)
O W ?%-1,^(0)
X D U:$D(^("U")) I $D(^("X")) S Y=^("X") D K X Y Q
K K ^UTILITY($J,"W",%,I) Q
 ;
U Q:'$D(IOST)  Q:IOST'?1"P".E  W $C(13) F DE=1:1:$S($D(^("L")):%+3,1:%-1) W " "
 S DE=1
UU S %Y=$O(^UTILITY($J,"W",%,I,"U","")) I %Y="" S %Y=$L(^UTILITY($J,"W",%,I,0))+1 S:'$D(DIWFWU) DIWFWU=" " D UUU K DIWFWU Q
 S Y=^(%Y) K ^(%Y) I Y="" D UUU K DIWFWU G UU
 S DIWFWU=Y F DE=DE:1 G UU:DE'<%Y W " "
UUU I $D(DIWFWU) F DE=DE:1 Q:DE'<%Y  W DIWFWU
Q Q
QQ K DIWI,DIWX,DIWTC Q
 ;
RCR ;
 N DA,M,DQI,DA
 F M="DIWX","DICMX","DIC","D","D0","D1","D2","D3","D4","D5","D6","D7","Y","I","J" M %=@M N @M M @M=%
 S DQI="Y(",DA="X(",DICMX="X DICMX",DICOMP="ST" S:$D(DIA("P"))#2 J(0)=DIA("P") D EN1^DICOMP
 I '$D(X) Q:DIWF'["?"!(IO(0)=IO)!$D(IO("C"))  U IO(0) W $C(7),!,$P(@(I(0)_"D0,0)"),U),"---",!?4,$P(DIWX,DIW)_": " R X:DTIME,! U IO G BACK
 I Y["m" S DICMX=$S(Y["w":"D ^DIWP",1:"S DIWX=X,DIWTC=1 D DIW^DIWP S DIWI=$J("""","_$L(DIWI)_")") X X S X="" G BACK
 I Y["X" S X=DIW_X_DIW G BACK
 I $P(DIWX,"SETPAGE(",1)="" S ^(DIWL,^UTILITY($J,"W",DIWL),"X")=X,X="" G BACK
 S DICMX=Y["D" X X I DICMX S Y=X X ^DD("DD") S X=Y
 I $P(DIWX,"INDENT(")="" S X=$J(X,$P(DIWF,"I",2)-$L(DIWI)-1)
BACK D C^DIWP:X]"" S X=""
 Q
 ;
DIQ ;
 S DIWF=$E("N",C["L")_"W"_$E("|X",C["X"!(C["x")+1),DIWL=2,DIWR=IOM,X=O_":   " K ^UTILITY($J,"W")
 S W=0 F  D  S W=$O(@(D(DL-1)_"W)")) Q:W'>0!(S=0)  S X=^(W,0)
 .D ^DIWP
 .N W D LF^DIQ
 G DIWW
 ;
H G H^DIO2
DT G DT^DIO2
 ;
N W ! G B

DIX
DIX ;SFISC/GFT,NHRC/DRH-STATISTICS ;05:46 PM  16 Dec 1999
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 S DIK="^DOPT(""DIX"","
 G F:$D(^DOPT("DIX",3)) S ^(0)="STATISTICAL ROUTINE^1.01^" F I=1:1:3 S ^DOPT("DIX",I,0)=$E($T(F+I),4,99)
 D IXALL^DIK
F S DIC=DIK,DIC(0)="AEQZ" D ^DIC Q:Y<0  D @($P(Y(0),U,2,3)) W !! G DIX
 ;;DESCRIPTIVE STATISTICS^D^DIXC
 ;;SCATTERGRAM^^DIG
 ;;HISTOGRAM^^DIH
 ;;ESTIMATED LINEAR CORRELATION COEFFICIENTS^C^DIX2
 ;;COEFFICIENTS OF DETERMINATION^D^DIX2
 ;;RANDOM SAMPLE - DESCRIPTIVE STATISTICS^RS^DIX3
 ;;GENERATE RANDOM NUMBERS (WITH REPLACEMENT)^R^DIX3
DHDR ;
 S:$D(^%ZTSK) %ZIS="Q" D ^%ZIS Q:POP!$D(IO("Q"))
DQ U IO S:+DHDR'=0 DIXMM=+DHDR S:'$D(DHDR) DHDR="" I DHDR="" G HDR
 I $E(IOST)="C" S DIFF=1
SITE W:$D(DIFF)&($Y) @IOF S DIFF=1 W:$D(^DD("SITE"))&(DHDR["S") !,"(",^("SITE"),")"
 I $D(DIC) I DHDR["F",@("$D("_DIC_"0))") W "  ",$P(^(0),U,1)," FILE"
 I $D(DUZ)#2,DHDR["U",$S($D(^VA(200,+DUZ,0)):1,1:$D(^DIC(3,+DUZ,0))) W "  USER: ",$P(^(0),U,1)," "
 W ?(DIXMM-(DHDR["T"*10)-($D(PG)*10)-18) ;**CCO/NI ALLOW SPACE AT RIGHT
DT W $$DATE^DIUTL(DT) I $D(PG) W "  ",$$EZBLD^DIALOG(7095,PG) S PG=PG+1 ;**CCO/NI  DATE FORMAT AND PAGE
HDR F J=1:1 Q:'$D(DHDR(J))  W !?(DHDR["C"*(DIXMM-$L(DHDR(J))\2)),$E(DHDR(J),1,DIXMM)
 W ! Q:DHDR'["L"
LINE F %=1:1:DIXMM W "-"
 W ! Q

DIXC
DIXC ;SFISC/GFT-DESCRIPTIVE STATS, CORRELATION MATRIX ;22APR2010
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 N DIXSKIP,DJ S DIXSKIP=1,DJ=$P G DESCX
D N SZ,SZT,DJ,DN,DHDR,DS,DIXSKIP
 D DESC G DESCX
 ;
C D CORR G CORRX
 ;
SQR S Y=0 Q:X'>0  S Y=1+X/2
L S T=Y,Y=X/T+T/2 G L:Y<T
 K T Q
 ;
DLCOR S DJ=IO(0),U="^",SZ=0
 F SZT=1:1 S:$D(^DOSV(0,DJ,"CP",SZT)) SZ=SZT Q:'$D(^DOSV(0,DJ,0,SZT,"S"))  Q:'$D(^DOSV(0,DJ,"F",SZT))  S DN(SZT)=$E($P(^(SZT),U,3),1,8)
 S SZT=SZT-1 Q
 ;
DESC ;CALCULATE THE DESCRIPTIVE STATISTICS
 D DLCOR K DS F I=1:1:SZT I $D(^DOSV(0,DJ,0,I,"Q")) S X=^("Q")-((^("S")*^("S"))/^("N"))/(^("N")) D SQR S ^("D")=Y
 Q
 ;
DESCX ;PRINT DESCRIPTIVE STATS
 N DIXDELIM,DHDR,DIFF,%ZIS
 S:$D(^%ZTSK) %ZIS="Q" D ^%ZIS G Q:POP
 S DIFF=$D(^DOSV(0,DJ,1))!$D(^(2))!$D(^(3))
 I DIFF,$G(IOT)="HFS" W !,"USE COMMA AS DELIMITER FOR SPEADSHEET" S %=2 D YN^DICN G Q:%<1 S:%=1 DIXDELIM=","
 I $D(IO("Q")) D  G KL
 .F I="DIFF","DIX*","^DOSV(0,$I,","SZT","DN*" S ZTSAVE(I)=""
 .S ZTIO=ION_";"_IOST_";"_IOM_";"_IOSL,ZTRTN="DQ^DIXC"
 .D ^%ZTLOAD
D1 I '$G(DIXSKIP),$D(SZT) S DHDR="77CUST",DHDR(1)="DESCRIPTIVE STATISTICS" D DQ^DIX D:SZT  G KL:'DIFF
 .W !!,?13,"N OF",?39,"STANDARD"
 .W !,?13,"CASES",?25,"MEAN",?39,"DEVIATION",?54,"MINIMUM",?69,"MAXIMUM"
 .F I=1:1:SZT D
 ..W !,DN(I),?10
 ..I $D(^DOSV(0,DJ,0,I,"N")) W $J(^("N"),6) W:^("N") $J(^("S")/^("N"),15,4)
 ..F X="D","L","H" W $S($D(^(X)):$J(^(X),15,4),1:$J("",15))
 .D EOP^DIG Q
  D STATS^DIG($NA(^DOSV(0,DJ)),.DIXDELIM) Q
  ;
CORR ;CALCULATE THE CORRELATION MATRIX
 K ^UTILITY($J),ERR I $O(^DOSV(0,IO(0),1))'>0 W !!,"*****     AT LEAST TWO VARIABLES MUST BE DEFINED     *****" S ERR=1 Q
 D DLCOR ;F I=1:1:SZ I ^DOSV(0,IO(0),"BY",I,"H")=^("L") W $C(7),!,"CAN'T COMPUTE CORRELATION MATRIX--",DN(I+100)," IS SINGLE-VALUED" S ERR=1 G KL
 F I=2:1:SZ S N=^DOSV(0,DJ,0,I,"N"),S=^("S"),C=^DOSV(0,DJ,"CP",I,I) F J=1:1:I-1 I $D(^DOSV(0,DJ,"CP",I,J)) D C1
 G KL
C1 S X=N*C-(S*S)*(N*^DOSV(0,DJ,"CP",J,J))-(^DOSV(0,DJ,0,J,"S")*^("S"))
 D SQR S (^UTILITY($J,J,I),^UTILITY($J,I,J))=(N*^DOSV(0,DJ,"CP",I,J))-(S*^DOSV(0,DJ,0,J,"S"))/Y
 Q
CORRX ;OUTPUT THE CORRELATION MATRIX
 G:$D(ERR) KL K DHDR S DHDR="72TSU",DHDR(1)="CORRELATION MATRIX",DHDR(2)="" D DHDR^DIX G Q:POP
 F I=1:1:SZ S ^UTILITY($J,I,I)=1 I $D(^UTILITY($J,I,I)) W ?I*10-2,$J(DN(I),10)
 F I=1:1:SZ I $D(^UTILITY($J,I,I)) W !,DN(I) F J=1:1:I I $D(^UTILITY($J,I,J)) W ?J*10,$J(^UTILITY($J,I,J),8,4)
 W !!
KL W:$E(IOST)'="C"&($Y) @IOF I IO(0)'=IO D CLOSE^DIO4
Q U $P K C,DHDR,I,II,J,JJ,N,POP,S,X,Y,Z,DJ,DN,SZ,SZT,DIFF
 Q
 ;
 ;
DQ ;FOR QUEUED OUTPUT
 S DJ=$I G D1

DMLAC000
DMLAC000 ; VEN/SMH - Convert DSS's Language file to FM 22.2 Lang File; 18-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 D DTNOLF^DICRW ; Init ST
 K ^UTILITY("DIT",$J) ; Bye bye
 D ^DMLAC001,^DMLAC002,^DMLAC003,^DMLAC004,^DMLAC005 ; Load conversion tables in ^UTILITY("DIT")
 ; ZEXCEPT: IOP
 S IOP="0;P-OTHER;80;9999999"
 D P^DITP ; Repoint
 QUIT
 ;
 ;
 ;
PRIVATE ; Code to create DMLAC data routines for conversion. Run on a VXVISTA system.
 ; Create arrays for P^DITP.
 S U="^"
 N OV,NV ; Old value, new value for IENS
 K ^UTILITY("DIT",$J)
 N FOREIGN S FOREIGN="/home/sam/emptyENV2/g/mumps.gld" ; This database contains the new codes.
 ;
 ; Create conversion table using 3 letter code as lookup key (D Index).
 N I S I=""
 F  S I=$O(^DI(.85,"D",I)) Q:I=""  S OV=$O(^(I,"")),NV=$O(^|FOREIGN|DI(.85,"D",I,"")) D 
 . W I,?5,^DI(.85,OV,0) W:NV ?60,^|FOREIGN|DI(.85,NV,0) W ! ; NV is conditional b/c we don't have a value for QAA-QZZ
 . S ^UTILITY("DIT",$J,OV)=NV ; IEN form for regular pointers
 . S ^UTILITY("DIT",$J,OV_";DI(.85,")=NV_";DI(.85," ; VP form for variable pointers
 ;
 ; Create Pointings array
 ; S ^UTILITY("DIT",$J,0,n)=(sub)file#^pointing_field#^2nd piece of 0 node from DD for the field.
 N I S I=""
 F  S I=$O(^DD(.85,0,"PT",I)) Q:'I  D
 . N FILE S FILE=I
 . N FLD S FLD=$O(^(I,""))
 . N DD02 S DD02=$P(^DD(FILE,FLD,0),"^",2)
 . S ^UTILITY("DIT",$J,0,I)=FILE_U_FLD_U_DD02
 ;
 ; Rest is for generating the routines containing the data using DIFROM
 S DH=" F I=1:2 S X=$T(Q+I) Q:X=""""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y" ; 1st code line
 N DL S DL=0 ; Line number
 N GREF S GREF=$NA(^UTILITY("DIT",$J)) ; Global reference for $Q                                                                    
 N LREF S LREF=$E(GREF,1,$L(GREF)-1)  ; Last reference -- w/o the comma.
 F  S GREF=$Q(@GREF) Q:GREF'[LREF  D  ; Loop until the Global doesn't match itself.
 . S DL=DL+1                     ; next line
 . N REF2STORE S REF2STORE=GREF  ; We need to change the stored reference for the destination system.
 . S $P(REF2STORE,",",2)="$J"    ; Remove our job number, and just put $J. Destination system will resolve it.
 . S ^UTILITY($J,DL,0)=REF2STORE ; Store ref
 . S DL=DL+1                     ; next line
 . S ^UTILITY($J,DL,0)="="_@GREF ; store the value.
 ;
 N DRN S DRN=1 ; Routine Number
 N DN S DN="DMLAC" ; Routine Prefix
 N DILN2 S DILN2=" ;;22.2T2;VA FILEMAN;;Dec 03, 2012" ; Second Line
 N DIFRM S DIFRM=^DD("ROU") ; Max rou size
 D FILE^DIFROM3 ; Save code - Creates routines DMLAC001 and forward
 QUIT

DMLAC001
DMLAC001 ; ; 18-DEC-2012 ; 1/27/13 3:45pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY("DIT",$J,0,.847)
 ;;=.847^.01^M*P.85'X
 ;;^UTILITY("DIT",$J,0,2)
 ;;=2^21601.02^*P.85'O
 ;;^UTILITY("DIT",$J,0,200)
 ;;=200^200.07^P.85'
 ;;^UTILITY("DIT",$J,0,8989.3)
 ;;=8989.3^207^P.85'
 ;;^UTILITY("DIT",$J,21600001)
 ;;=16
 ;;^UTILITY("DIT",$J,21600002)
 ;;=8
 ;;^UTILITY("DIT",$J,21600003)
 ;;=9
 ;;^UTILITY("DIT",$J,21600004)
 ;;=13
 ;;^UTILITY("DIT",$J,21600005)
 ;;=14
 ;;^UTILITY("DIT",$J,21600006)
 ;;=15
 ;;^UTILITY("DIT",$J,21600007)
 ;;=209
 ;;^UTILITY("DIT",$J,21600008)
 ;;=17
 ;;^UTILITY("DIT",$J,21600009)
 ;;=19
 ;;^UTILITY("DIT",$J,21600010)
 ;;=20
 ;;^UTILITY("DIT",$J,21600011)
 ;;=21
 ;;^UTILITY("DIT",$J,21600012)
 ;;=22
 ;;^UTILITY("DIT",$J,21600013)
 ;;=23
 ;;^UTILITY("DIT",$J,21600014)
 ;;=24
 ;;^UTILITY("DIT",$J,21600015)
 ;;=212
 ;;^UTILITY("DIT",$J,21600016)
 ;;=25
 ;;^UTILITY("DIT",$J,21600017)
 ;;=26
 ;;^UTILITY("DIT",$J,21600018)
 ;;=398
 ;;^UTILITY("DIT",$J,21600019)
 ;;=29
 ;;^UTILITY("DIT",$J,21600020)
 ;;=214
 ;;^UTILITY("DIT",$J,21600021)
 ;;=10
 ;;^UTILITY("DIT",$J,21600022)
 ;;=396
 ;;^UTILITY("DIT",$J,21600023)
 ;;=30
 ;;^UTILITY("DIT",$J,21600024)
 ;;=33
 ;;^UTILITY("DIT",$J,21600025)
 ;;=354
 ;;^UTILITY("DIT",$J,21600026)
 ;;=31
 ;;^UTILITY("DIT",$J,21600027)
 ;;=218
 ;;^UTILITY("DIT",$J,21600028)
 ;;=32
 ;;^UTILITY("DIT",$J,21600029)
 ;;=35
 ;;^UTILITY("DIT",$J,21600030)
 ;;=36
 ;;^UTILITY("DIT",$J,21600031)
 ;;=219
 ;;^UTILITY("DIT",$J,21600032)
 ;;=221
 ;;^UTILITY("DIT",$J,21600033)
 ;;=37
 ;;^UTILITY("DIT",$J,21600034)
 ;;=38
 ;;^UTILITY("DIT",$J,21600035)
 ;;=39
 ;;^UTILITY("DIT",$J,21600036)
 ;;=40
 ;;^UTILITY("DIT",$J,21600037)
 ;;=41
 ;;^UTILITY("DIT",$J,21600038)
 ;;=226
 ;;^UTILITY("DIT",$J,21600039)
 ;;=225
 ;;^UTILITY("DIT",$J,21600040)
 ;;=46
 ;;^UTILITY("DIT",$J,21600041)
 ;;=43
 ;;^UTILITY("DIT",$J,21600042)
 ;;=44
 ;;^UTILITY("DIT",$J,21600043)
 ;;=42
 ;;^UTILITY("DIT",$J,21600044)
 ;;=47
 ;;^UTILITY("DIT",$J,21600045)
 ;;=45
 ;;^UTILITY("DIT",$J,21600046)
 ;;=224
 ;;^UTILITY("DIT",$J,21600047)
 ;;=48
 ;;^UTILITY("DIT",$J,21600048)
 ;;=49
 ;;^UTILITY("DIT",$J,21600049)
 ;;=50
 ;;^UTILITY("DIT",$J,21600050)
 ;;=51
 ;;^UTILITY("DIT",$J,21600051)
 ;;=230
 ;;^UTILITY("DIT",$J,21600052)
 ;;=52
 ;;^UTILITY("DIT",$J,21600053)
 ;;=231
 ;;^UTILITY("DIT",$J,21600054)
 ;;=53
 ;;^UTILITY("DIT",$J,21600055)
 ;;=55
 ;;^UTILITY("DIT",$J,21600056)
 ;;=56
 ;;^UTILITY("DIT",$J,21600057)
 ;;=452
 ;;^UTILITY("DIT",$J,21600058)
 ;;=227
 ;;^UTILITY("DIT",$J,21600059)
 ;;=58
 ;;^UTILITY("DIT",$J,21600060)
 ;;=59
 ;;^UTILITY("DIT",$J,21600061)
 ;;=60
 ;;^UTILITY("DIT",$J,21600062)
 ;;=229
 ;;^UTILITY("DIT",$J,21600063)
 ;;=63
 ;;^UTILITY("DIT",$J,21600064)
 ;;=61
 ;;^UTILITY("DIT",$J,21600065)
 ;;=62
 ;;^UTILITY("DIT",$J,21600066)
 ;;=64
 ;;^UTILITY("DIT",$J,21600067)
 ;;=54
 ;;^UTILITY("DIT",$J,21600068)
 ;;=65
 ;;^UTILITY("DIT",$J,21600069)
 ;;=235
 ;;^UTILITY("DIT",$J,21600070)
 ;;=128
 ;;^UTILITY("DIT",$J,21600071)
 ;;=66
 ;;^UTILITY("DIT",$J,21600072)
 ;;=233
 ;;^UTILITY("DIT",$J,21600073)
 ;;=67
 ;;^UTILITY("DIT",$J,21600074)
 ;;=234
 ;;^UTILITY("DIT",$J,21600075)
 ;;=69
 ;;^UTILITY("DIT",$J,21600076)
 ;;=73
 ;;^UTILITY("DIT",$J,21600077)
 ;;=70
 ;;^UTILITY("DIT",$J,21600078)
 ;;=68
 ;;^UTILITY("DIT",$J,21600079)
 ;;=75
 ;;^UTILITY("DIT",$J,21600080)
 ;;=79
 ;;^UTILITY("DIT",$J,21600081)
 ;;=356
 ;;^UTILITY("DIT",$J,21600082)
 ;;=76
 ;;^UTILITY("DIT",$J,21600083)
 ;;=78
 ;;^UTILITY("DIT",$J,21600084)
 ;;=77
 ;;^UTILITY("DIT",$J,21600085)
 ;;=71
 ;;^UTILITY("DIT",$J,21600086)
 ;;=456
 ;;^UTILITY("DIT",$J,21600087)
 ;;=80
 ;;^UTILITY("DIT",$J,21600088)
 ;;=72
 ;;^UTILITY("DIT",$J,21600089)
 ;;=239
 ;;^UTILITY("DIT",$J,21600090)
 ;;=83
 ;;^UTILITY("DIT",$J,21600091)
 ;;=84
 ;;^UTILITY("DIT",$J,21600092)
 ;;=85
 ;;^UTILITY("DIT",$J,21600093)
 ;;=89
 ;;^UTILITY("DIT",$J,21600094)
 ;;=90
 ;;^UTILITY("DIT",$J,21600095)
 ;;=91
 ;;^UTILITY("DIT",$J,21600096)
 ;;=86
 ;;^UTILITY("DIT",$J,21600097)
 ;;=92
 ;;^UTILITY("DIT",$J,21600098)
 ;;=88
 ;;^UTILITY("DIT",$J,21600099)
 ;;=184
 ;;^UTILITY("DIT",$J,21600100)
 ;;=242
 ;;^UTILITY("DIT",$J,21600101)
 ;;=94
 ;;^UTILITY("DIT",$J,21600102)
 ;;=95
 ;;^UTILITY("DIT",$J,21600103)
 ;;=96
 ;;^UTILITY("DIT",$J,21600104)
 ;;=97
 ;;^UTILITY("DIT",$J,21600105)
 ;;=269
 ;;^UTILITY("DIT",$J,21600106)
 ;;=98
 ;;^UTILITY("DIT",$J,21600107)
 ;;=455
 ;;^UTILITY("DIT",$J,21600108)
 ;;=102
 ;;^UTILITY("DIT",$J,21600109)
 ;;=99
 ;;^UTILITY("DIT",$J,21600110)
 ;;=100
 ;;^UTILITY("DIT",$J,21600111)
 ;;=101
 ;;^UTILITY("DIT",$J,21600112)
 ;;=243
 ;;^UTILITY("DIT",$J,21600113)
 ;;=462
 ;;^UTILITY("DIT",$J,21600114)
 ;;=103
 ;;^UTILITY("DIT",$J,21600115)
 ;;=362
 ;;^UTILITY("DIT",$J,21600116)
 ;;=104
 ;;^UTILITY("DIT",$J,21600117)
 ;;=105
 ;;^UTILITY("DIT",$J,21600118)
 ;;=106
 ;;^UTILITY("DIT",$J,21600119)
 ;;=107
 ;;^UTILITY("DIT",$J,21600120)
 ;;=27
 ;;^UTILITY("DIT",$J,21600121)
 ;;=108
 ;;^UTILITY("DIT",$J,21600122)
 ;;=109
 ;;^UTILITY("DIT",$J,21600123)
 ;;=1
 ;;^UTILITY("DIT",$J,21600124)
 ;;=363
 ;;^UTILITY("DIT",$J,21600125)
 ;;=111
 ;;^UTILITY("DIT",$J,21600126)
 ;;=112
 ;;^UTILITY("DIT",$J,21600127)
 ;;=113
 ;;^UTILITY("DIT",$J,21600128)
 ;;=114
 ;;^UTILITY("DIT",$J,21600129)
 ;;=115
 ;;^UTILITY("DIT",$J,21600130)
 ;;=117
 ;;^UTILITY("DIT",$J,21600131)
 ;;=116
 ;;^UTILITY("DIT",$J,21600132)
 ;;=118
 ;;^UTILITY("DIT",$J,21600133)
 ;;=119
 ;;^UTILITY("DIT",$J,21600134)
 ;;=5
 ;;^UTILITY("DIT",$J,21600135)
 ;;=250
 ;;^UTILITY("DIT",$J,21600136)
 ;;=120
 ;;^UTILITY("DIT",$J,21600137)
 ;;=4
 ;;^UTILITY("DIT",$J,21600138)
 ;;=364
 ;;^UTILITY("DIT",$J,21600139)
 ;;=399
 ;;^UTILITY("DIT",$J,21600140)
 ;;=122
 ;;^UTILITY("DIT",$J,21600141)
 ;;=121
 ;;^UTILITY("DIT",$J,21600142)
 ;;=123
 ;;^UTILITY("DIT",$J,21600143)
 ;;=125
 ;;^UTILITY("DIT",$J,21600144)
 ;;=124
 ;;^UTILITY("DIT",$J,21600145)
 ;;=126
 ;;^UTILITY("DIT",$J,21600146)
 ;;=131
 ;;^UTILITY("DIT",$J,21600147)
 ;;=132
 ;;^UTILITY("DIT",$J,21600148)
 ;;=252
 ;;^UTILITY("DIT",$J,21600149)
 ;;=134
 ;;^UTILITY("DIT",$J,21600150)
 ;;=2
 ;;^UTILITY("DIT",$J,21600151)
 ;;=133
 ;;^UTILITY("DIT",$J,21600152)
 ;;=135
 ;;^UTILITY("DIT",$J,21600153)
 ;;=127
 ;;^UTILITY("DIT",$J,21600154)
 ;;=167
 ;;^UTILITY("DIT",$J,21600155)
 ;;=129
 ;;^UTILITY("DIT",$J,21600156)
 ;;=352
 ;;^UTILITY("DIT",$J,21600157)
 ;;=365
 ;;^UTILITY("DIT",$J,21600158)
 ;;=400
 ;;^UTILITY("DIT",$J,21600159)
 ;;=136
 ;;^UTILITY("DIT",$J,21600160)
 ;;=137
 ;;^UTILITY("DIT",$J,21600161)
 ;;=138
 ;;^UTILITY("DIT",$J,21600162)
 ;;=139
 ;;^UTILITY("DIT",$J,21600163)
 ;;=28
 ;;^UTILITY("DIT",$J,21600164)
 ;;=12
 ;;^UTILITY("DIT",$J,21600165)
 ;;=140
 ;;^UTILITY("DIT",$J,21600166)
 ;;=473
 ;;^UTILITY("DIT",$J,21600167)
 ;;=141
 ;;^UTILITY("DIT",$J,21600168)
 ;;=142
 ;;^UTILITY("DIT",$J,21600169)
 ;;=143
 ;;^UTILITY("DIT",$J,21600170)
 ;;=144
 ;;^UTILITY("DIT",$J,21600171)
 ;;=145
 ;;^UTILITY("DIT",$J,21600172)
 ;;=146
 ;;^UTILITY("DIT",$J,21600173)
 ;;=18
 ;;^UTILITY("DIT",$J,21600174)
 ;;=147
 ;;^UTILITY("DIT",$J,21600175)
 ;;=148
 ;;^UTILITY("DIT",$J,21600176)
 ;;=254
 ;;^UTILITY("DIT",$J,21600177)
 ;;=149
 ;;^UTILITY("DIT",$J,21600178)
 ;;=151
 ;;^UTILITY("DIT",$J,21600179)
 ;;=152
 ;;^UTILITY("DIT",$J,21600180)
 ;;=150
 ;;^UTILITY("DIT",$J,21600181)
 ;;=93
 ;;^UTILITY("DIT",$J,21600182)
 ;;=463
 ;;^UTILITY("DIT",$J,21600183)
 ;;=153
 ;;^UTILITY("DIT",$J,21600184)
 ;;=154
 ;;^UTILITY("DIT",$J,21600185)
 ;;=155
 ;;^UTILITY("DIT",$J,21600186)
 ;;=158
 ;;^UTILITY("DIT",$J,21600187)
 ;;=156
 ;;^UTILITY("DIT",$J,21600188)
 ;;=157
 ;;^UTILITY("DIT",$J,21600189)
 ;;=390
 ;;^UTILITY("DIT",$J,21600190)
 ;;=257
 ;;^UTILITY("DIT",$J,21600191)
 ;;=165
 ;;^UTILITY("DIT",$J,21600192)
 ;;=164
 ;;^UTILITY("DIT",$J,21600193)
 ;;=159
 ;;^UTILITY("DIT",$J,21600194)
 ;;=163
 ;;^UTILITY("DIT",$J,21600195)
 ;;=258
 ;;^UTILITY("DIT",$J,21600196)
 ;;=161
 ;;^UTILITY("DIT",$J,21600197)
 ;;=259
 ;;^UTILITY("DIT",$J,21600198)
 ;;=162
 ;;^UTILITY("DIT",$J,21600199)
 ;;=166
 ;;^UTILITY("DIT",$J,21600200)
 ;;=261
 ;;^UTILITY("DIT",$J,21600201)
 ;;=262
 ;;^UTILITY("DIT",$J,21600202)
 ;;=6
 ;;^UTILITY("DIT",$J,21600203)
 ;;=169
 ;;^UTILITY("DIT",$J,21600204)
 ;;=329
 ;;^UTILITY("DIT",$J,21600205)
 ;;=168
 ;;^UTILITY("DIT",$J,21600206)
 ;;=171
 ;;^UTILITY("DIT",$J,21600207)
 ;;=170
 ;;^UTILITY("DIT",$J,21600208)
 ;;=180
 ;;^UTILITY("DIT",$J,21600209)
 ;;=173
 ;;^UTILITY("DIT",$J,21600210)
 ;;=174
 ;;^UTILITY("DIT",$J,21600211)
 ;;=175
 ;;^UTILITY("DIT",$J,21600212)
 ;;=177
 ;;^UTILITY("DIT",$J,21600213)
 ;;=178
 ;;^UTILITY("DIT",$J,21600214)
 ;;=265
 ;;^UTILITY("DIT",$J,21600215)
 ;;=183
 ;;^UTILITY("DIT",$J,21600216)
 ;;=179
 ;;^UTILITY("DIT",$J,21600217)
 ;;=185
 ;;^UTILITY("DIT",$J,21600218)
 ;;=186
 ;;^UTILITY("DIT",$J,21600219)
 ;;=172
 ;;^UTILITY("DIT",$J,21600220)
 ;;=187
 ;;^UTILITY("DIT",$J,21600221)
 ;;=266
 ;;^UTILITY("DIT",$J,21600222)
 ;;=188
 ;;^UTILITY("DIT",$J,21600223)
 ;;=189
 ;;^UTILITY("DIT",$J,21600224)
 ;;=190
 ;;^UTILITY("DIT",$J,21600225)
 ;;=192
 ;;^UTILITY("DIT",$J,21600226)
 ;;=193
 ;;^UTILITY("DIT",$J,21600227)
 ;;=191
 ;;^UTILITY("DIT",$J,21600228)
 ;;=197
 ;;^UTILITY("DIT",$J,21600229)
 ;;=195
 ;;^UTILITY("DIT",$J,21600230)
 ;;=196
 ;;^UTILITY("DIT",$J,21600231)
 ;;=198
 ;;^UTILITY("DIT",$J,21600232)
 ;;=199
 ;;^UTILITY("DIT",$J,21600233)
 ;;=200
 ;;^UTILITY("DIT",$J,21600234)
 ;;=181
 ;;^UTILITY("DIT",$J,21600235)
 ;;=182
 ;;^UTILITY("DIT",$J,21600236)
 ;;=268
 ;;^UTILITY("DIT",$J,21600237)
 ;;=204
 ;;^UTILITY("DIT",$J,21600238)
 ;;=201
 ;;^UTILITY("DIT",$J,21600239)
 ;;=202
 ;;^UTILITY("DIT",$J,21600240)
 ;;=203
 ;;^UTILITY("DIT",$J,21600241)
 ;;=205
 ;;^UTILITY("DIT",$J,21600242)
 ;;=206
 ;;^UTILITY("DIT",$J,21600243)
 ;;=207
 ;;^UTILITY("DIT",$J,21600244)
 ;;=208
 ;;^UTILITY("DIT",$J,21600245)
 ;;=322
 ;;^UTILITY("DIT",$J,21600246)
 ;;=323
 ;;^UTILITY("DIT",$J,21600247)
 ;;=324
 ;;^UTILITY("DIT",$J,21600248)
 ;;=325
 ;;^UTILITY("DIT",$J,21600249)
 ;;=326
 ;;^UTILITY("DIT",$J,21600250)
 ;;=327
 ;;^UTILITY("DIT",$J,21600251)
 ;;=328
 ;;^UTILITY("DIT",$J,21600252)
 ;;=371
 ;;^UTILITY("DIT",$J,21600253)
 ;;=331
 ;;^UTILITY("DIT",$J,21600254)
 ;;=338

DMLAC002
DMLAC002 ; ; 18-DEC-2012 ; 1/27/13 3:45pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY("DIT",$J,21600255)
 ;;=333
 ;;^UTILITY("DIT",$J,21600256)
 ;;=332
 ;;^UTILITY("DIT",$J,21600257)
 ;;=130
 ;;^UTILITY("DIT",$J,21600258)
 ;;=334
 ;;^UTILITY("DIT",$J,21600259)
 ;;=335
 ;;^UTILITY("DIT",$J,21600260)
 ;;=336
 ;;^UTILITY("DIT",$J,21600261)
 ;;=337
 ;;^UTILITY("DIT",$J,21600262)
 ;;=339
 ;;^UTILITY("DIT",$J,21600263)
 ;;=340
 ;;^UTILITY("DIT",$J,21600264)
 ;;=341
 ;;^UTILITY("DIT",$J,21600265)
 ;;=357
 ;;^UTILITY("DIT",$J,21600266)
 ;;=342
 ;;^UTILITY("DIT",$J,21600267)
 ;;=343
 ;;^UTILITY("DIT",$J,21600268)
 ;;=346
 ;;^UTILITY("DIT",$J,21600269)
 ;;=350
 ;;^UTILITY("DIT",$J,21600270)
 ;;=353
 ;;^UTILITY("DIT",$J,21600271)
 ;;=223
 ;;^UTILITY("DIT",$J,21600272)
 ;;=355
 ;;^UTILITY("DIT",$J,21600273)
 ;;=359
 ;;^UTILITY("DIT",$J,21600274)
 ;;=345
 ;;^UTILITY("DIT",$J,21600275)
 ;;=370
 ;;^UTILITY("DIT",$J,21600276)
 ;;=349
 ;;^UTILITY("DIT",$J,21600277)
 ;;=360
 ;;^UTILITY("DIT",$J,21600278)
 ;;=366
 ;;^UTILITY("DIT",$J,21600279)
 ;;=361
 ;;^UTILITY("DIT",$J,21600280)
 ;;=367
 ;;^UTILITY("DIT",$J,21600281)
 ;;=313
 ;;^UTILITY("DIT",$J,21600282)
 ;;=274
 ;;^UTILITY("DIT",$J,21600283)
 ;;=344
 ;;^UTILITY("DIT",$J,21600284)
 ;;=347
 ;;^UTILITY("DIT",$J,21600285)
 ;;=348
 ;;^UTILITY("DIT",$J,21600286)
 ;;=351
 ;;^UTILITY("DIT",$J,21600287)
 ;;=272
 ;;^UTILITY("DIT",$J,21600288)
 ;;=369
 ;;^UTILITY("DIT",$J,21600289)
 ;;=372
 ;;^UTILITY("DIT",$J,21600290)
 ;;=373
 ;;^UTILITY("DIT",$J,21600291)
 ;;=276
 ;;^UTILITY("DIT",$J,21600292)
 ;;=277
 ;;^UTILITY("DIT",$J,21600293)
 ;;=87
 ;;^UTILITY("DIT",$J,21600294)
 ;;=368
 ;;^UTILITY("DIT",$J,21600295)
 ;;=358
 ;;^UTILITY("DIT",$J,21600296)
 ;;=273
 ;;^UTILITY("DIT",$J,21600297)
 ;;=110
 ;;^UTILITY("DIT",$J,21600298)
 ;;=279
 ;;^UTILITY("DIT",$J,21600299)
 ;;=282
 ;;^UTILITY("DIT",$J,21600300)
 ;;=380
 ;;^UTILITY("DIT",$J,21600301)
 ;;=375
 ;;^UTILITY("DIT",$J,21600302)
 ;;=376
 ;;^UTILITY("DIT",$J,21600303)
 ;;=378
 ;;^UTILITY("DIT",$J,21600304)
 ;;=377
 ;;^UTILITY("DIT",$J,21600305)
 ;;=379
 ;;^UTILITY("DIT",$J,21600306)
 ;;=330
 ;;^UTILITY("DIT",$J,21600307)
 ;;=382
 ;;^UTILITY("DIT",$J,21600308)
 ;;=381
 ;;^UTILITY("DIT",$J,21600309)
 ;;=383
 ;;^UTILITY("DIT",$J,21600310)
 ;;=280
 ;;^UTILITY("DIT",$J,21600311)
 ;;=384
 ;;^UTILITY("DIT",$J,21600312)
 ;;=389
 ;;^UTILITY("DIT",$J,21600313)
 ;;=388
 ;;^UTILITY("DIT",$J,21600314)
 ;;=386
 ;;^UTILITY("DIT",$J,21600315)
 ;;=402
 ;;^UTILITY("DIT",$J,21600316)
 ;;=387
 ;;^UTILITY("DIT",$J,21600317)
 ;;=374
 ;;^UTILITY("DIT",$J,21600318)
 ;;=417
 ;;^UTILITY("DIT",$J,21600319)
 ;;=285
 ;;^UTILITY("DIT",$J,21600320)
 ;;=81
 ;;^UTILITY("DIT",$J,21600321)
 ;;=74
 ;;^UTILITY("DIT",$J,21600322)
 ;;=391
 ;;^UTILITY("DIT",$J,21600323)
 ;;=392
 ;;^UTILITY("DIT",$J,21600324)
 ;;=393
 ;;^UTILITY("DIT",$J,21600325)
 ;;=394
 ;;^UTILITY("DIT",$J,21600326)
 ;;=395
 ;;^UTILITY("DIT",$J,21600327)
 ;;=397
 ;;^UTILITY("DIT",$J,21600328)
 ;;=405
 ;;^UTILITY("DIT",$J,21600329)
 ;;=406
 ;;^UTILITY("DIT",$J,21600330)
 ;;=407
 ;;^UTILITY("DIT",$J,21600331)
 ;;=408
 ;;^UTILITY("DIT",$J,21600332)
 ;;=409
 ;;^UTILITY("DIT",$J,21600333)
 ;;=288
 ;;^UTILITY("DIT",$J,21600334)
 ;;=289
 ;;^UTILITY("DIT",$J,21600335)
 ;;=414
 ;;^UTILITY("DIT",$J,21600336)
 ;;=410
 ;;^UTILITY("DIT",$J,21600337)
 ;;=413
 ;;^UTILITY("DIT",$J,21600338)
 ;;=422
 ;;^UTILITY("DIT",$J,21600339)
 ;;=415
 ;;^UTILITY("DIT",$J,21600340)
 ;;=411
 ;;^UTILITY("DIT",$J,21600341)
 ;;=403
 ;;^UTILITY("DIT",$J,21600342)
 ;;=418
 ;;^UTILITY("DIT",$J,21600343)
 ;;=290
 ;;^UTILITY("DIT",$J,21600344)
 ;;=419
 ;;^UTILITY("DIT",$J,21600345)
 ;;=412
 ;;^UTILITY("DIT",$J,21600346)
 ;;=421
 ;;^UTILITY("DIT",$J,21600347)
 ;;=420
 ;;^UTILITY("DIT",$J,21600348)
 ;;=7
 ;;^UTILITY("DIT",$J,21600349)
 ;;=291
 ;;^UTILITY("DIT",$J,21600350)
 ;;=404
 ;;^UTILITY("DIT",$J,21600351)
 ;;=416
 ;;^UTILITY("DIT",$J,21600352)
 ;;=
 ;;^UTILITY("DIT",$J,21600353)
 ;;=423
 ;;^UTILITY("DIT",$J,21600354)
 ;;=424
 ;;^UTILITY("DIT",$J,21600355)
 ;;=425
 ;;^UTILITY("DIT",$J,21600356)
 ;;=426
 ;;^UTILITY("DIT",$J,21600357)
 ;;=293
 ;;^UTILITY("DIT",$J,21600358)
 ;;=429
 ;;^UTILITY("DIT",$J,21600359)
 ;;=430
 ;;^UTILITY("DIT",$J,21600360)
 ;;=428
 ;;^UTILITY("DIT",$J,21600361)
 ;;=431
 ;;^UTILITY("DIT",$J,21600362)
 ;;=34
 ;;^UTILITY("DIT",$J,21600363)
 ;;=11
 ;;^UTILITY("DIT",$J,21600364)
 ;;=438
 ;;^UTILITY("DIT",$J,21600365)
 ;;=439
 ;;^UTILITY("DIT",$J,21600366)
 ;;=524
 ;;^UTILITY("DIT",$J,21600367)
 ;;=304
 ;;^UTILITY("DIT",$J,21600368)
 ;;=294
 ;;^UTILITY("DIT",$J,21600369)
 ;;=432
 ;;^UTILITY("DIT",$J,21600370)
 ;;=440
 ;;^UTILITY("DIT",$J,21600371)
 ;;=443
 ;;^UTILITY("DIT",$J,21600372)
 ;;=441
 ;;^UTILITY("DIT",$J,21600373)
 ;;=450
 ;;^UTILITY("DIT",$J,21600374)
 ;;=444
 ;;^UTILITY("DIT",$J,21600375)
 ;;=445
 ;;^UTILITY("DIT",$J,21600376)
 ;;=297
 ;;^UTILITY("DIT",$J,21600377)
 ;;=401
 ;;^UTILITY("DIT",$J,21600378)
 ;;=298
 ;;^UTILITY("DIT",$J,21600379)
 ;;=448
 ;;^UTILITY("DIT",$J,21600380)
 ;;=451
 ;;^UTILITY("DIT",$J,21600381)
 ;;=454
 ;;^UTILITY("DIT",$J,21600382)
 ;;=300
 ;;^UTILITY("DIT",$J,21600383)
 ;;=299
 ;;^UTILITY("DIT",$J,21600384)
 ;;=301
 ;;^UTILITY("DIT",$J,21600385)
 ;;=457
 ;;^UTILITY("DIT",$J,21600386)
 ;;=458
 ;;^UTILITY("DIT",$J,21600387)
 ;;=436
 ;;^UTILITY("DIT",$J,21600388)
 ;;=434
 ;;^UTILITY("DIT",$J,21600389)
 ;;=295
 ;;^UTILITY("DIT",$J,21600390)
 ;;=433
 ;;^UTILITY("DIT",$J,21600391)
 ;;=160
 ;;^UTILITY("DIT",$J,21600392)
 ;;=437
 ;;^UTILITY("DIT",$J,21600393)
 ;;=435
 ;;^UTILITY("DIT",$J,21600394)
 ;;=449
 ;;^UTILITY("DIT",$J,21600395)
 ;;=453
 ;;^UTILITY("DIT",$J,21600396)
 ;;=461
 ;;^UTILITY("DIT",$J,21600397)
 ;;=459
 ;;^UTILITY("DIT",$J,21600398)
 ;;=460
 ;;^UTILITY("DIT",$J,21600399)
 ;;=302
 ;;^UTILITY("DIT",$J,21600400)
 ;;=464
 ;;^UTILITY("DIT",$J,21600401)
 ;;=3
 ;;^UTILITY("DIT",$J,21600402)
 ;;=442
 ;;^UTILITY("DIT",$J,21600403)
 ;;=465
 ;;^UTILITY("DIT",$J,21600404)
 ;;=446
 ;;^UTILITY("DIT",$J,21600405)
 ;;=447
 ;;^UTILITY("DIT",$J,21600406)
 ;;=281
 ;;^UTILITY("DIT",$J,21600407)
 ;;=471
 ;;^UTILITY("DIT",$J,21600408)
 ;;=466
 ;;^UTILITY("DIT",$J,21600409)
 ;;=468
 ;;^UTILITY("DIT",$J,21600410)
 ;;=469
 ;;^UTILITY("DIT",$J,21600411)
 ;;=467
 ;;^UTILITY("DIT",$J,21600412)
 ;;=470
 ;;^UTILITY("DIT",$J,21600413)
 ;;=472
 ;;^UTILITY("DIT",$J,21600414)
 ;;=82
 ;;^UTILITY("DIT",$J,21600415)
 ;;=474
 ;;^UTILITY("DIT",$J,21600416)
 ;;=476
 ;;^UTILITY("DIT",$J,21600417)
 ;;=307
 ;;^UTILITY("DIT",$J,21600418)
 ;;=479
 ;;^UTILITY("DIT",$J,21600419)
 ;;=480
 ;;^UTILITY("DIT",$J,21600420)
 ;;=481
 ;;^UTILITY("DIT",$J,21600421)
 ;;=488
 ;;^UTILITY("DIT",$J,21600422)
 ;;=482
 ;;^UTILITY("DIT",$J,21600423)
 ;;=483
 ;;^UTILITY("DIT",$J,21600424)
 ;;=477
 ;;^UTILITY("DIT",$J,21600425)
 ;;=475
 ;;^UTILITY("DIT",$J,21600426)
 ;;=484
 ;;^UTILITY("DIT",$J,21600427)
 ;;=485
 ;;^UTILITY("DIT",$J,21600428)
 ;;=486
 ;;^UTILITY("DIT",$J,21600429)
 ;;=487
 ;;^UTILITY("DIT",$J,21600430)
 ;;=489
 ;;^UTILITY("DIT",$J,21600431)
 ;;=492
 ;;^UTILITY("DIT",$J,21600432)
 ;;=194
 ;;^UTILITY("DIT",$J,21600433)
 ;;=490
 ;;^UTILITY("DIT",$J,21600434)
 ;;=478
 ;;^UTILITY("DIT",$J,21600435)
 ;;=493
 ;;^UTILITY("DIT",$J,21600436)
 ;;=494
 ;;^UTILITY("DIT",$J,21600437)
 ;;=491
 ;;^UTILITY("DIT",$J,21600438)
 ;;=495
 ;;^UTILITY("DIT",$J,21600439)
 ;;=497
 ;;^UTILITY("DIT",$J,21600440)
 ;;=496
 ;;^UTILITY("DIT",$J,21600441)
 ;;=500
 ;;^UTILITY("DIT",$J,21600442)
 ;;=498
 ;;^UTILITY("DIT",$J,21600443)
 ;;=311
 ;;^UTILITY("DIT",$J,21600444)
 ;;=499
 ;;^UTILITY("DIT",$J,21600445)
 ;;=213
 ;;^UTILITY("DIT",$J,21600446)
 ;;=501
 ;;^UTILITY("DIT",$J,21600447)
 ;;=503
 ;;^UTILITY("DIT",$J,21600448)
 ;;=502
 ;;^UTILITY("DIT",$J,21600449)
 ;;=504
 ;;^UTILITY("DIT",$J,21600450)
 ;;=505
 ;;^UTILITY("DIT",$J,21600451)
 ;;=506
 ;;^UTILITY("DIT",$J,21600452)
 ;;=507
 ;;^UTILITY("DIT",$J,21600453)
 ;;=508
 ;;^UTILITY("DIT",$J,21600454)
 ;;=509
 ;;^UTILITY("DIT",$J,21600455)
 ;;=510
 ;;^UTILITY("DIT",$J,21600456)
 ;;=511
 ;;^UTILITY("DIT",$J,21600457)
 ;;=512
 ;;^UTILITY("DIT",$J,21600458)
 ;;=513
 ;;^UTILITY("DIT",$J,21600459)
 ;;=514
 ;;^UTILITY("DIT",$J,21600460)
 ;;=515
 ;;^UTILITY("DIT",$J,21600461)
 ;;=516
 ;;^UTILITY("DIT",$J,21600462)
 ;;=316
 ;;^UTILITY("DIT",$J,21600463)
 ;;=521
 ;;^UTILITY("DIT",$J,21600464)
 ;;=518
 ;;^UTILITY("DIT",$J,21600465)
 ;;=519
 ;;^UTILITY("DIT",$J,21600466)
 ;;=520
 ;;^UTILITY("DIT",$J,21600467)
 ;;=303
 ;;^UTILITY("DIT",$J,21600468)
 ;;=517
 ;;^UTILITY("DIT",$J,21600469)
 ;;=522
 ;;^UTILITY("DIT",$J,21600470)
 ;;=176
 ;;^UTILITY("DIT",$J,21600471)
 ;;=523
 ;;^UTILITY("DIT",$J,21600472)
 ;;=525
 ;;^UTILITY("DIT",$J,21600473)
 ;;=526
 ;;^UTILITY("DIT",$J,21600474)
 ;;=527
 ;;^UTILITY("DIT",$J,21600475)
 ;;=528
 ;;^UTILITY("DIT",$J,21600476)
 ;;=320
 ;;^UTILITY("DIT",$J,21600477)
 ;;=529
 ;;^UTILITY("DIT",$J,21600478)
 ;;=57
 ;;^UTILITY("DIT",$J,21600479)
 ;;=531
 ;;^UTILITY("DIT",$J,21600480)
 ;;=532
 ;;^UTILITY("DIT",$J,21600481)
 ;;=321
 ;;^UTILITY("DIT",$J,21600482)
 ;;=533
 ;;^UTILITY("DIT",$J,21600483)
 ;;=534
 ;;^UTILITY("DIT",$J,21600484)
 ;;=385
 ;;^UTILITY("DIT",$J,21600485)
 ;;=530
 ;;^UTILITY("DIT",$J,"21600001;DI(.85,")
 ;;=16;DI(.85,
 ;;^UTILITY("DIT",$J,"21600002;DI(.85,")
 ;;=8;DI(.85,
 ;;^UTILITY("DIT",$J,"21600003;DI(.85,")
 ;;=9;DI(.85,
 ;;^UTILITY("DIT",$J,"21600004;DI(.85,")
 ;;=13;DI(.85,
 ;;^UTILITY("DIT",$J,"21600005;DI(.85,")
 ;;=14;DI(.85,
 ;;^UTILITY("DIT",$J,"21600006;DI(.85,")
 ;;=15;DI(.85,
 ;;^UTILITY("DIT",$J,"21600007;DI(.85,")
 ;;=209;DI(.85,
 ;;^UTILITY("DIT",$J,"21600008;DI(.85,")
 ;;=17;DI(.85,
 ;;^UTILITY("DIT",$J,"21600009;DI(.85,")
 ;;=19;DI(.85,
 ;;^UTILITY("DIT",$J,"21600010;DI(.85,")
 ;;=20;DI(.85,
 ;;^UTILITY("DIT",$J,"21600011;DI(.85,")
 ;;=21;DI(.85,
 ;;^UTILITY("DIT",$J,"21600012;DI(.85,")
 ;;=22;DI(.85,
 ;;^UTILITY("DIT",$J,"21600013;DI(.85,")
 ;;=23;DI(.85,
 ;;^UTILITY("DIT",$J,"21600014;DI(.85,")
 ;;=24;DI(.85,
 ;;^UTILITY("DIT",$J,"21600015;DI(.85,")
 ;;=212;DI(.85,
 ;;^UTILITY("DIT",$J,"21600016;DI(.85,")
 ;;=25;DI(.85,
 ;;^UTILITY("DIT",$J,"21600017;DI(.85,")
 ;;=26;DI(.85,
 ;;^UTILITY("DIT",$J,"21600018;DI(.85,")
 ;;=398;DI(.85,

DMLAC003
DMLAC003 ; ; 18-DEC-2012 ; 1/27/13 3:45pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY("DIT",$J,"21600019;DI(.85,")
 ;;=29;DI(.85,
 ;;^UTILITY("DIT",$J,"21600020;DI(.85,")
 ;;=214;DI(.85,
 ;;^UTILITY("DIT",$J,"21600021;DI(.85,")
 ;;=10;DI(.85,
 ;;^UTILITY("DIT",$J,"21600022;DI(.85,")
 ;;=396;DI(.85,
 ;;^UTILITY("DIT",$J,"21600023;DI(.85,")
 ;;=30;DI(.85,
 ;;^UTILITY("DIT",$J,"21600024;DI(.85,")
 ;;=33;DI(.85,
 ;;^UTILITY("DIT",$J,"21600025;DI(.85,")
 ;;=354;DI(.85,
 ;;^UTILITY("DIT",$J,"21600026;DI(.85,")
 ;;=31;DI(.85,
 ;;^UTILITY("DIT",$J,"21600027;DI(.85,")
 ;;=218;DI(.85,
 ;;^UTILITY("DIT",$J,"21600028;DI(.85,")
 ;;=32;DI(.85,
 ;;^UTILITY("DIT",$J,"21600029;DI(.85,")
 ;;=35;DI(.85,
 ;;^UTILITY("DIT",$J,"21600030;DI(.85,")
 ;;=36;DI(.85,
 ;;^UTILITY("DIT",$J,"21600031;DI(.85,")
 ;;=219;DI(.85,
 ;;^UTILITY("DIT",$J,"21600032;DI(.85,")
 ;;=221;DI(.85,
 ;;^UTILITY("DIT",$J,"21600033;DI(.85,")
 ;;=37;DI(.85,
 ;;^UTILITY("DIT",$J,"21600034;DI(.85,")
 ;;=38;DI(.85,
 ;;^UTILITY("DIT",$J,"21600035;DI(.85,")
 ;;=39;DI(.85,
 ;;^UTILITY("DIT",$J,"21600036;DI(.85,")
 ;;=40;DI(.85,
 ;;^UTILITY("DIT",$J,"21600037;DI(.85,")
 ;;=41;DI(.85,
 ;;^UTILITY("DIT",$J,"21600038;DI(.85,")
 ;;=226;DI(.85,
 ;;^UTILITY("DIT",$J,"21600039;DI(.85,")
 ;;=225;DI(.85,
 ;;^UTILITY("DIT",$J,"21600040;DI(.85,")
 ;;=46;DI(.85,
 ;;^UTILITY("DIT",$J,"21600041;DI(.85,")
 ;;=43;DI(.85,
 ;;^UTILITY("DIT",$J,"21600042;DI(.85,")
 ;;=44;DI(.85,
 ;;^UTILITY("DIT",$J,"21600043;DI(.85,")
 ;;=42;DI(.85,
 ;;^UTILITY("DIT",$J,"21600044;DI(.85,")
 ;;=47;DI(.85,
 ;;^UTILITY("DIT",$J,"21600045;DI(.85,")
 ;;=45;DI(.85,
 ;;^UTILITY("DIT",$J,"21600046;DI(.85,")
 ;;=224;DI(.85,
 ;;^UTILITY("DIT",$J,"21600047;DI(.85,")
 ;;=48;DI(.85,
 ;;^UTILITY("DIT",$J,"21600048;DI(.85,")
 ;;=49;DI(.85,
 ;;^UTILITY("DIT",$J,"21600049;DI(.85,")
 ;;=50;DI(.85,
 ;;^UTILITY("DIT",$J,"21600050;DI(.85,")
 ;;=51;DI(.85,
 ;;^UTILITY("DIT",$J,"21600051;DI(.85,")
 ;;=230;DI(.85,
 ;;^UTILITY("DIT",$J,"21600052;DI(.85,")
 ;;=52;DI(.85,
 ;;^UTILITY("DIT",$J,"21600053;DI(.85,")
 ;;=231;DI(.85,
 ;;^UTILITY("DIT",$J,"21600054;DI(.85,")
 ;;=53;DI(.85,
 ;;^UTILITY("DIT",$J,"21600055;DI(.85,")
 ;;=55;DI(.85,
 ;;^UTILITY("DIT",$J,"21600056;DI(.85,")
 ;;=56;DI(.85,
 ;;^UTILITY("DIT",$J,"21600057;DI(.85,")
 ;;=452;DI(.85,
 ;;^UTILITY("DIT",$J,"21600058;DI(.85,")
 ;;=227;DI(.85,
 ;;^UTILITY("DIT",$J,"21600059;DI(.85,")
 ;;=58;DI(.85,
 ;;^UTILITY("DIT",$J,"21600060;DI(.85,")
 ;;=59;DI(.85,
 ;;^UTILITY("DIT",$J,"21600061;DI(.85,")
 ;;=60;DI(.85,
 ;;^UTILITY("DIT",$J,"21600062;DI(.85,")
 ;;=229;DI(.85,
 ;;^UTILITY("DIT",$J,"21600063;DI(.85,")
 ;;=63;DI(.85,
 ;;^UTILITY("DIT",$J,"21600064;DI(.85,")
 ;;=61;DI(.85,
 ;;^UTILITY("DIT",$J,"21600065;DI(.85,")
 ;;=62;DI(.85,
 ;;^UTILITY("DIT",$J,"21600066;DI(.85,")
 ;;=64;DI(.85,
 ;;^UTILITY("DIT",$J,"21600067;DI(.85,")
 ;;=54;DI(.85,
 ;;^UTILITY("DIT",$J,"21600068;DI(.85,")
 ;;=65;DI(.85,
 ;;^UTILITY("DIT",$J,"21600069;DI(.85,")
 ;;=235;DI(.85,
 ;;^UTILITY("DIT",$J,"21600070;DI(.85,")
 ;;=128;DI(.85,
 ;;^UTILITY("DIT",$J,"21600071;DI(.85,")
 ;;=66;DI(.85,
 ;;^UTILITY("DIT",$J,"21600072;DI(.85,")
 ;;=233;DI(.85,
 ;;^UTILITY("DIT",$J,"21600073;DI(.85,")
 ;;=67;DI(.85,
 ;;^UTILITY("DIT",$J,"21600074;DI(.85,")
 ;;=234;DI(.85,
 ;;^UTILITY("DIT",$J,"21600075;DI(.85,")
 ;;=69;DI(.85,
 ;;^UTILITY("DIT",$J,"21600076;DI(.85,")
 ;;=73;DI(.85,
 ;;^UTILITY("DIT",$J,"21600077;DI(.85,")
 ;;=70;DI(.85,
 ;;^UTILITY("DIT",$J,"21600078;DI(.85,")
 ;;=68;DI(.85,
 ;;^UTILITY("DIT",$J,"21600079;DI(.85,")
 ;;=75;DI(.85,
 ;;^UTILITY("DIT",$J,"21600080;DI(.85,")
 ;;=79;DI(.85,
 ;;^UTILITY("DIT",$J,"21600081;DI(.85,")
 ;;=356;DI(.85,
 ;;^UTILITY("DIT",$J,"21600082;DI(.85,")
 ;;=76;DI(.85,
 ;;^UTILITY("DIT",$J,"21600083;DI(.85,")
 ;;=78;DI(.85,
 ;;^UTILITY("DIT",$J,"21600084;DI(.85,")
 ;;=77;DI(.85,
 ;;^UTILITY("DIT",$J,"21600085;DI(.85,")
 ;;=71;DI(.85,
 ;;^UTILITY("DIT",$J,"21600086;DI(.85,")
 ;;=456;DI(.85,
 ;;^UTILITY("DIT",$J,"21600087;DI(.85,")
 ;;=80;DI(.85,
 ;;^UTILITY("DIT",$J,"21600088;DI(.85,")
 ;;=72;DI(.85,
 ;;^UTILITY("DIT",$J,"21600089;DI(.85,")
 ;;=239;DI(.85,
 ;;^UTILITY("DIT",$J,"21600090;DI(.85,")
 ;;=83;DI(.85,
 ;;^UTILITY("DIT",$J,"21600091;DI(.85,")
 ;;=84;DI(.85,
 ;;^UTILITY("DIT",$J,"21600092;DI(.85,")
 ;;=85;DI(.85,
 ;;^UTILITY("DIT",$J,"21600093;DI(.85,")
 ;;=89;DI(.85,
 ;;^UTILITY("DIT",$J,"21600094;DI(.85,")
 ;;=90;DI(.85,
 ;;^UTILITY("DIT",$J,"21600095;DI(.85,")
 ;;=91;DI(.85,
 ;;^UTILITY("DIT",$J,"21600096;DI(.85,")
 ;;=86;DI(.85,
 ;;^UTILITY("DIT",$J,"21600097;DI(.85,")
 ;;=92;DI(.85,
 ;;^UTILITY("DIT",$J,"21600098;DI(.85,")
 ;;=88;DI(.85,
 ;;^UTILITY("DIT",$J,"21600099;DI(.85,")
 ;;=184;DI(.85,
 ;;^UTILITY("DIT",$J,"21600100;DI(.85,")
 ;;=242;DI(.85,
 ;;^UTILITY("DIT",$J,"21600101;DI(.85,")
 ;;=94;DI(.85,
 ;;^UTILITY("DIT",$J,"21600102;DI(.85,")
 ;;=95;DI(.85,
 ;;^UTILITY("DIT",$J,"21600103;DI(.85,")
 ;;=96;DI(.85,
 ;;^UTILITY("DIT",$J,"21600104;DI(.85,")
 ;;=97;DI(.85,
 ;;^UTILITY("DIT",$J,"21600105;DI(.85,")
 ;;=269;DI(.85,
 ;;^UTILITY("DIT",$J,"21600106;DI(.85,")
 ;;=98;DI(.85,
 ;;^UTILITY("DIT",$J,"21600107;DI(.85,")
 ;;=455;DI(.85,
 ;;^UTILITY("DIT",$J,"21600108;DI(.85,")
 ;;=102;DI(.85,
 ;;^UTILITY("DIT",$J,"21600109;DI(.85,")
 ;;=99;DI(.85,
 ;;^UTILITY("DIT",$J,"21600110;DI(.85,")
 ;;=100;DI(.85,
 ;;^UTILITY("DIT",$J,"21600111;DI(.85,")
 ;;=101;DI(.85,
 ;;^UTILITY("DIT",$J,"21600112;DI(.85,")
 ;;=243;DI(.85,
 ;;^UTILITY("DIT",$J,"21600113;DI(.85,")
 ;;=462;DI(.85,
 ;;^UTILITY("DIT",$J,"21600114;DI(.85,")
 ;;=103;DI(.85,
 ;;^UTILITY("DIT",$J,"21600115;DI(.85,")
 ;;=362;DI(.85,
 ;;^UTILITY("DIT",$J,"21600116;DI(.85,")
 ;;=104;DI(.85,
 ;;^UTILITY("DIT",$J,"21600117;DI(.85,")
 ;;=105;DI(.85,
 ;;^UTILITY("DIT",$J,"21600118;DI(.85,")
 ;;=106;DI(.85,
 ;;^UTILITY("DIT",$J,"21600119;DI(.85,")
 ;;=107;DI(.85,
 ;;^UTILITY("DIT",$J,"21600120;DI(.85,")
 ;;=27;DI(.85,
 ;;^UTILITY("DIT",$J,"21600121;DI(.85,")
 ;;=108;DI(.85,
 ;;^UTILITY("DIT",$J,"21600122;DI(.85,")
 ;;=109;DI(.85,
 ;;^UTILITY("DIT",$J,"21600123;DI(.85,")
 ;;=1;DI(.85,
 ;;^UTILITY("DIT",$J,"21600124;DI(.85,")
 ;;=363;DI(.85,
 ;;^UTILITY("DIT",$J,"21600125;DI(.85,")
 ;;=111;DI(.85,
 ;;^UTILITY("DIT",$J,"21600126;DI(.85,")
 ;;=112;DI(.85,
 ;;^UTILITY("DIT",$J,"21600127;DI(.85,")
 ;;=113;DI(.85,
 ;;^UTILITY("DIT",$J,"21600128;DI(.85,")
 ;;=114;DI(.85,
 ;;^UTILITY("DIT",$J,"21600129;DI(.85,")
 ;;=115;DI(.85,
 ;;^UTILITY("DIT",$J,"21600130;DI(.85,")
 ;;=117;DI(.85,
 ;;^UTILITY("DIT",$J,"21600131;DI(.85,")
 ;;=116;DI(.85,
 ;;^UTILITY("DIT",$J,"21600132;DI(.85,")
 ;;=118;DI(.85,
 ;;^UTILITY("DIT",$J,"21600133;DI(.85,")
 ;;=119;DI(.85,
 ;;^UTILITY("DIT",$J,"21600134;DI(.85,")
 ;;=5;DI(.85,
 ;;^UTILITY("DIT",$J,"21600135;DI(.85,")
 ;;=250;DI(.85,
 ;;^UTILITY("DIT",$J,"21600136;DI(.85,")
 ;;=120;DI(.85,
 ;;^UTILITY("DIT",$J,"21600137;DI(.85,")
 ;;=4;DI(.85,
 ;;^UTILITY("DIT",$J,"21600138;DI(.85,")
 ;;=364;DI(.85,
 ;;^UTILITY("DIT",$J,"21600139;DI(.85,")
 ;;=399;DI(.85,
 ;;^UTILITY("DIT",$J,"21600140;DI(.85,")
 ;;=122;DI(.85,
 ;;^UTILITY("DIT",$J,"21600141;DI(.85,")
 ;;=121;DI(.85,
 ;;^UTILITY("DIT",$J,"21600142;DI(.85,")
 ;;=123;DI(.85,
 ;;^UTILITY("DIT",$J,"21600143;DI(.85,")
 ;;=125;DI(.85,
 ;;^UTILITY("DIT",$J,"21600144;DI(.85,")
 ;;=124;DI(.85,
 ;;^UTILITY("DIT",$J,"21600145;DI(.85,")
 ;;=126;DI(.85,
 ;;^UTILITY("DIT",$J,"21600146;DI(.85,")
 ;;=131;DI(.85,
 ;;^UTILITY("DIT",$J,"21600147;DI(.85,")
 ;;=132;DI(.85,
 ;;^UTILITY("DIT",$J,"21600148;DI(.85,")
 ;;=252;DI(.85,
 ;;^UTILITY("DIT",$J,"21600149;DI(.85,")
 ;;=134;DI(.85,
 ;;^UTILITY("DIT",$J,"21600150;DI(.85,")
 ;;=2;DI(.85,
 ;;^UTILITY("DIT",$J,"21600151;DI(.85,")
 ;;=133;DI(.85,
 ;;^UTILITY("DIT",$J,"21600152;DI(.85,")
 ;;=135;DI(.85,
 ;;^UTILITY("DIT",$J,"21600153;DI(.85,")
 ;;=127;DI(.85,
 ;;^UTILITY("DIT",$J,"21600154;DI(.85,")
 ;;=167;DI(.85,
 ;;^UTILITY("DIT",$J,"21600155;DI(.85,")
 ;;=129;DI(.85,
 ;;^UTILITY("DIT",$J,"21600156;DI(.85,")
 ;;=352;DI(.85,
 ;;^UTILITY("DIT",$J,"21600157;DI(.85,")
 ;;=365;DI(.85,
 ;;^UTILITY("DIT",$J,"21600158;DI(.85,")
 ;;=400;DI(.85,
 ;;^UTILITY("DIT",$J,"21600159;DI(.85,")
 ;;=136;DI(.85,
 ;;^UTILITY("DIT",$J,"21600160;DI(.85,")
 ;;=137;DI(.85,
 ;;^UTILITY("DIT",$J,"21600161;DI(.85,")
 ;;=138;DI(.85,
 ;;^UTILITY("DIT",$J,"21600162;DI(.85,")
 ;;=139;DI(.85,
 ;;^UTILITY("DIT",$J,"21600163;DI(.85,")
 ;;=28;DI(.85,
 ;;^UTILITY("DIT",$J,"21600164;DI(.85,")
 ;;=12;DI(.85,
 ;;^UTILITY("DIT",$J,"21600165;DI(.85,")
 ;;=140;DI(.85,
 ;;^UTILITY("DIT",$J,"21600166;DI(.85,")
 ;;=473;DI(.85,
 ;;^UTILITY("DIT",$J,"21600167;DI(.85,")
 ;;=141;DI(.85,
 ;;^UTILITY("DIT",$J,"21600168;DI(.85,")
 ;;=142;DI(.85,
 ;;^UTILITY("DIT",$J,"21600169;DI(.85,")
 ;;=143;DI(.85,
 ;;^UTILITY("DIT",$J,"21600170;DI(.85,")
 ;;=144;DI(.85,
 ;;^UTILITY("DIT",$J,"21600171;DI(.85,")
 ;;=145;DI(.85,
 ;;^UTILITY("DIT",$J,"21600172;DI(.85,")
 ;;=146;DI(.85,
 ;;^UTILITY("DIT",$J,"21600173;DI(.85,")
 ;;=18;DI(.85,
 ;;^UTILITY("DIT",$J,"21600174;DI(.85,")
 ;;=147;DI(.85,
 ;;^UTILITY("DIT",$J,"21600175;DI(.85,")
 ;;=148;DI(.85,
 ;;^UTILITY("DIT",$J,"21600176;DI(.85,")
 ;;=254;DI(.85,
 ;;^UTILITY("DIT",$J,"21600177;DI(.85,")
 ;;=149;DI(.85,
 ;;^UTILITY("DIT",$J,"21600178;DI(.85,")
 ;;=151;DI(.85,
 ;;^UTILITY("DIT",$J,"21600179;DI(.85,")
 ;;=152;DI(.85,
 ;;^UTILITY("DIT",$J,"21600180;DI(.85,")
 ;;=150;DI(.85,
 ;;^UTILITY("DIT",$J,"21600181;DI(.85,")
 ;;=93;DI(.85,
 ;;^UTILITY("DIT",$J,"21600182;DI(.85,")
 ;;=463;DI(.85,
 ;;^UTILITY("DIT",$J,"21600183;DI(.85,")
 ;;=153;DI(.85,
 ;;^UTILITY("DIT",$J,"21600184;DI(.85,")
 ;;=154;DI(.85,
 ;;^UTILITY("DIT",$J,"21600185;DI(.85,")
 ;;=155;DI(.85,
 ;;^UTILITY("DIT",$J,"21600186;DI(.85,")
 ;;=158;DI(.85,
 ;;^UTILITY("DIT",$J,"21600187;DI(.85,")
 ;;=156;DI(.85,
 ;;^UTILITY("DIT",$J,"21600188;DI(.85,")
 ;;=157;DI(.85,
 ;;^UTILITY("DIT",$J,"21600189;DI(.85,")
 ;;=390;DI(.85,
 ;;^UTILITY("DIT",$J,"21600190;DI(.85,")
 ;;=257;DI(.85,
 ;;^UTILITY("DIT",$J,"21600191;DI(.85,")
 ;;=165;DI(.85,
 ;;^UTILITY("DIT",$J,"21600192;DI(.85,")
 ;;=164;DI(.85,

DMLAC004
DMLAC004 ; ; 18-DEC-2012 ; 1/27/13 3:45pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY("DIT",$J,"21600193;DI(.85,")
 ;;=159;DI(.85,
 ;;^UTILITY("DIT",$J,"21600194;DI(.85,")
 ;;=163;DI(.85,
 ;;^UTILITY("DIT",$J,"21600195;DI(.85,")
 ;;=258;DI(.85,
 ;;^UTILITY("DIT",$J,"21600196;DI(.85,")
 ;;=161;DI(.85,
 ;;^UTILITY("DIT",$J,"21600197;DI(.85,")
 ;;=259;DI(.85,
 ;;^UTILITY("DIT",$J,"21600198;DI(.85,")
 ;;=162;DI(.85,
 ;;^UTILITY("DIT",$J,"21600199;DI(.85,")
 ;;=166;DI(.85,
 ;;^UTILITY("DIT",$J,"21600200;DI(.85,")
 ;;=261;DI(.85,
 ;;^UTILITY("DIT",$J,"21600201;DI(.85,")
 ;;=262;DI(.85,
 ;;^UTILITY("DIT",$J,"21600202;DI(.85,")
 ;;=6;DI(.85,
 ;;^UTILITY("DIT",$J,"21600203;DI(.85,")
 ;;=169;DI(.85,
 ;;^UTILITY("DIT",$J,"21600204;DI(.85,")
 ;;=329;DI(.85,
 ;;^UTILITY("DIT",$J,"21600205;DI(.85,")
 ;;=168;DI(.85,
 ;;^UTILITY("DIT",$J,"21600206;DI(.85,")
 ;;=171;DI(.85,
 ;;^UTILITY("DIT",$J,"21600207;DI(.85,")
 ;;=170;DI(.85,
 ;;^UTILITY("DIT",$J,"21600208;DI(.85,")
 ;;=180;DI(.85,
 ;;^UTILITY("DIT",$J,"21600209;DI(.85,")
 ;;=173;DI(.85,
 ;;^UTILITY("DIT",$J,"21600210;DI(.85,")
 ;;=174;DI(.85,
 ;;^UTILITY("DIT",$J,"21600211;DI(.85,")
 ;;=175;DI(.85,
 ;;^UTILITY("DIT",$J,"21600212;DI(.85,")
 ;;=177;DI(.85,
 ;;^UTILITY("DIT",$J,"21600213;DI(.85,")
 ;;=178;DI(.85,
 ;;^UTILITY("DIT",$J,"21600214;DI(.85,")
 ;;=265;DI(.85,
 ;;^UTILITY("DIT",$J,"21600215;DI(.85,")
 ;;=183;DI(.85,
 ;;^UTILITY("DIT",$J,"21600216;DI(.85,")
 ;;=179;DI(.85,
 ;;^UTILITY("DIT",$J,"21600217;DI(.85,")
 ;;=185;DI(.85,
 ;;^UTILITY("DIT",$J,"21600218;DI(.85,")
 ;;=186;DI(.85,
 ;;^UTILITY("DIT",$J,"21600219;DI(.85,")
 ;;=172;DI(.85,
 ;;^UTILITY("DIT",$J,"21600220;DI(.85,")
 ;;=187;DI(.85,
 ;;^UTILITY("DIT",$J,"21600221;DI(.85,")
 ;;=266;DI(.85,
 ;;^UTILITY("DIT",$J,"21600222;DI(.85,")
 ;;=188;DI(.85,
 ;;^UTILITY("DIT",$J,"21600223;DI(.85,")
 ;;=189;DI(.85,
 ;;^UTILITY("DIT",$J,"21600224;DI(.85,")
 ;;=190;DI(.85,
 ;;^UTILITY("DIT",$J,"21600225;DI(.85,")
 ;;=192;DI(.85,
 ;;^UTILITY("DIT",$J,"21600226;DI(.85,")
 ;;=193;DI(.85,
 ;;^UTILITY("DIT",$J,"21600227;DI(.85,")
 ;;=191;DI(.85,
 ;;^UTILITY("DIT",$J,"21600228;DI(.85,")
 ;;=197;DI(.85,
 ;;^UTILITY("DIT",$J,"21600229;DI(.85,")
 ;;=195;DI(.85,
 ;;^UTILITY("DIT",$J,"21600230;DI(.85,")
 ;;=196;DI(.85,
 ;;^UTILITY("DIT",$J,"21600231;DI(.85,")
 ;;=198;DI(.85,
 ;;^UTILITY("DIT",$J,"21600232;DI(.85,")
 ;;=199;DI(.85,
 ;;^UTILITY("DIT",$J,"21600233;DI(.85,")
 ;;=200;DI(.85,
 ;;^UTILITY("DIT",$J,"21600234;DI(.85,")
 ;;=181;DI(.85,
 ;;^UTILITY("DIT",$J,"21600235;DI(.85,")
 ;;=182;DI(.85,
 ;;^UTILITY("DIT",$J,"21600236;DI(.85,")
 ;;=268;DI(.85,
 ;;^UTILITY("DIT",$J,"21600237;DI(.85,")
 ;;=204;DI(.85,
 ;;^UTILITY("DIT",$J,"21600238;DI(.85,")
 ;;=201;DI(.85,
 ;;^UTILITY("DIT",$J,"21600239;DI(.85,")
 ;;=202;DI(.85,
 ;;^UTILITY("DIT",$J,"21600240;DI(.85,")
 ;;=203;DI(.85,
 ;;^UTILITY("DIT",$J,"21600241;DI(.85,")
 ;;=205;DI(.85,
 ;;^UTILITY("DIT",$J,"21600242;DI(.85,")
 ;;=206;DI(.85,
 ;;^UTILITY("DIT",$J,"21600243;DI(.85,")
 ;;=207;DI(.85,
 ;;^UTILITY("DIT",$J,"21600244;DI(.85,")
 ;;=208;DI(.85,
 ;;^UTILITY("DIT",$J,"21600245;DI(.85,")
 ;;=322;DI(.85,
 ;;^UTILITY("DIT",$J,"21600246;DI(.85,")
 ;;=323;DI(.85,
 ;;^UTILITY("DIT",$J,"21600247;DI(.85,")
 ;;=324;DI(.85,
 ;;^UTILITY("DIT",$J,"21600248;DI(.85,")
 ;;=325;DI(.85,
 ;;^UTILITY("DIT",$J,"21600249;DI(.85,")
 ;;=326;DI(.85,
 ;;^UTILITY("DIT",$J,"21600250;DI(.85,")
 ;;=327;DI(.85,
 ;;^UTILITY("DIT",$J,"21600251;DI(.85,")
 ;;=328;DI(.85,
 ;;^UTILITY("DIT",$J,"21600252;DI(.85,")
 ;;=371;DI(.85,
 ;;^UTILITY("DIT",$J,"21600253;DI(.85,")
 ;;=331;DI(.85,
 ;;^UTILITY("DIT",$J,"21600254;DI(.85,")
 ;;=338;DI(.85,
 ;;^UTILITY("DIT",$J,"21600255;DI(.85,")
 ;;=333;DI(.85,
 ;;^UTILITY("DIT",$J,"21600256;DI(.85,")
 ;;=332;DI(.85,
 ;;^UTILITY("DIT",$J,"21600257;DI(.85,")
 ;;=130;DI(.85,
 ;;^UTILITY("DIT",$J,"21600258;DI(.85,")
 ;;=334;DI(.85,
 ;;^UTILITY("DIT",$J,"21600259;DI(.85,")
 ;;=335;DI(.85,
 ;;^UTILITY("DIT",$J,"21600260;DI(.85,")
 ;;=336;DI(.85,
 ;;^UTILITY("DIT",$J,"21600261;DI(.85,")
 ;;=337;DI(.85,
 ;;^UTILITY("DIT",$J,"21600262;DI(.85,")
 ;;=339;DI(.85,
 ;;^UTILITY("DIT",$J,"21600263;DI(.85,")
 ;;=340;DI(.85,
 ;;^UTILITY("DIT",$J,"21600264;DI(.85,")
 ;;=341;DI(.85,
 ;;^UTILITY("DIT",$J,"21600265;DI(.85,")
 ;;=357;DI(.85,
 ;;^UTILITY("DIT",$J,"21600266;DI(.85,")
 ;;=342;DI(.85,
 ;;^UTILITY("DIT",$J,"21600267;DI(.85,")
 ;;=343;DI(.85,
 ;;^UTILITY("DIT",$J,"21600268;DI(.85,")
 ;;=346;DI(.85,
 ;;^UTILITY("DIT",$J,"21600269;DI(.85,")
 ;;=350;DI(.85,
 ;;^UTILITY("DIT",$J,"21600270;DI(.85,")
 ;;=353;DI(.85,
 ;;^UTILITY("DIT",$J,"21600271;DI(.85,")
 ;;=223;DI(.85,
 ;;^UTILITY("DIT",$J,"21600272;DI(.85,")
 ;;=355;DI(.85,
 ;;^UTILITY("DIT",$J,"21600273;DI(.85,")
 ;;=359;DI(.85,
 ;;^UTILITY("DIT",$J,"21600274;DI(.85,")
 ;;=345;DI(.85,
 ;;^UTILITY("DIT",$J,"21600275;DI(.85,")
 ;;=370;DI(.85,
 ;;^UTILITY("DIT",$J,"21600276;DI(.85,")
 ;;=349;DI(.85,
 ;;^UTILITY("DIT",$J,"21600277;DI(.85,")
 ;;=360;DI(.85,
 ;;^UTILITY("DIT",$J,"21600278;DI(.85,")
 ;;=366;DI(.85,
 ;;^UTILITY("DIT",$J,"21600279;DI(.85,")
 ;;=361;DI(.85,
 ;;^UTILITY("DIT",$J,"21600280;DI(.85,")
 ;;=367;DI(.85,
 ;;^UTILITY("DIT",$J,"21600281;DI(.85,")
 ;;=313;DI(.85,
 ;;^UTILITY("DIT",$J,"21600282;DI(.85,")
 ;;=274;DI(.85,
 ;;^UTILITY("DIT",$J,"21600283;DI(.85,")
 ;;=344;DI(.85,
 ;;^UTILITY("DIT",$J,"21600284;DI(.85,")
 ;;=347;DI(.85,
 ;;^UTILITY("DIT",$J,"21600285;DI(.85,")
 ;;=348;DI(.85,
 ;;^UTILITY("DIT",$J,"21600286;DI(.85,")
 ;;=351;DI(.85,
 ;;^UTILITY("DIT",$J,"21600287;DI(.85,")
 ;;=272;DI(.85,
 ;;^UTILITY("DIT",$J,"21600288;DI(.85,")
 ;;=369;DI(.85,
 ;;^UTILITY("DIT",$J,"21600289;DI(.85,")
 ;;=372;DI(.85,
 ;;^UTILITY("DIT",$J,"21600290;DI(.85,")
 ;;=373;DI(.85,
 ;;^UTILITY("DIT",$J,"21600291;DI(.85,")
 ;;=276;DI(.85,
 ;;^UTILITY("DIT",$J,"21600292;DI(.85,")
 ;;=277;DI(.85,
 ;;^UTILITY("DIT",$J,"21600293;DI(.85,")
 ;;=87;DI(.85,
 ;;^UTILITY("DIT",$J,"21600294;DI(.85,")
 ;;=368;DI(.85,
 ;;^UTILITY("DIT",$J,"21600295;DI(.85,")
 ;;=358;DI(.85,
 ;;^UTILITY("DIT",$J,"21600296;DI(.85,")
 ;;=273;DI(.85,
 ;;^UTILITY("DIT",$J,"21600297;DI(.85,")
 ;;=110;DI(.85,
 ;;^UTILITY("DIT",$J,"21600298;DI(.85,")
 ;;=279;DI(.85,
 ;;^UTILITY("DIT",$J,"21600299;DI(.85,")
 ;;=282;DI(.85,
 ;;^UTILITY("DIT",$J,"21600300;DI(.85,")
 ;;=380;DI(.85,
 ;;^UTILITY("DIT",$J,"21600301;DI(.85,")
 ;;=375;DI(.85,
 ;;^UTILITY("DIT",$J,"21600302;DI(.85,")
 ;;=376;DI(.85,
 ;;^UTILITY("DIT",$J,"21600303;DI(.85,")
 ;;=378;DI(.85,
 ;;^UTILITY("DIT",$J,"21600304;DI(.85,")
 ;;=377;DI(.85,
 ;;^UTILITY("DIT",$J,"21600305;DI(.85,")
 ;;=379;DI(.85,
 ;;^UTILITY("DIT",$J,"21600306;DI(.85,")
 ;;=330;DI(.85,
 ;;^UTILITY("DIT",$J,"21600307;DI(.85,")
 ;;=382;DI(.85,
 ;;^UTILITY("DIT",$J,"21600308;DI(.85,")
 ;;=381;DI(.85,
 ;;^UTILITY("DIT",$J,"21600309;DI(.85,")
 ;;=383;DI(.85,
 ;;^UTILITY("DIT",$J,"21600310;DI(.85,")
 ;;=280;DI(.85,
 ;;^UTILITY("DIT",$J,"21600311;DI(.85,")
 ;;=384;DI(.85,
 ;;^UTILITY("DIT",$J,"21600312;DI(.85,")
 ;;=389;DI(.85,
 ;;^UTILITY("DIT",$J,"21600313;DI(.85,")
 ;;=388;DI(.85,
 ;;^UTILITY("DIT",$J,"21600314;DI(.85,")
 ;;=386;DI(.85,
 ;;^UTILITY("DIT",$J,"21600315;DI(.85,")
 ;;=402;DI(.85,
 ;;^UTILITY("DIT",$J,"21600316;DI(.85,")
 ;;=387;DI(.85,
 ;;^UTILITY("DIT",$J,"21600317;DI(.85,")
 ;;=374;DI(.85,
 ;;^UTILITY("DIT",$J,"21600318;DI(.85,")
 ;;=417;DI(.85,
 ;;^UTILITY("DIT",$J,"21600319;DI(.85,")
 ;;=285;DI(.85,
 ;;^UTILITY("DIT",$J,"21600320;DI(.85,")
 ;;=81;DI(.85,
 ;;^UTILITY("DIT",$J,"21600321;DI(.85,")
 ;;=74;DI(.85,
 ;;^UTILITY("DIT",$J,"21600322;DI(.85,")
 ;;=391;DI(.85,
 ;;^UTILITY("DIT",$J,"21600323;DI(.85,")
 ;;=392;DI(.85,
 ;;^UTILITY("DIT",$J,"21600324;DI(.85,")
 ;;=393;DI(.85,
 ;;^UTILITY("DIT",$J,"21600325;DI(.85,")
 ;;=394;DI(.85,
 ;;^UTILITY("DIT",$J,"21600326;DI(.85,")
 ;;=395;DI(.85,
 ;;^UTILITY("DIT",$J,"21600327;DI(.85,")
 ;;=397;DI(.85,
 ;;^UTILITY("DIT",$J,"21600328;DI(.85,")
 ;;=405;DI(.85,
 ;;^UTILITY("DIT",$J,"21600329;DI(.85,")
 ;;=406;DI(.85,
 ;;^UTILITY("DIT",$J,"21600330;DI(.85,")
 ;;=407;DI(.85,
 ;;^UTILITY("DIT",$J,"21600331;DI(.85,")
 ;;=408;DI(.85,
 ;;^UTILITY("DIT",$J,"21600332;DI(.85,")
 ;;=409;DI(.85,
 ;;^UTILITY("DIT",$J,"21600333;DI(.85,")
 ;;=288;DI(.85,
 ;;^UTILITY("DIT",$J,"21600334;DI(.85,")
 ;;=289;DI(.85,
 ;;^UTILITY("DIT",$J,"21600335;DI(.85,")
 ;;=414;DI(.85,
 ;;^UTILITY("DIT",$J,"21600336;DI(.85,")
 ;;=410;DI(.85,
 ;;^UTILITY("DIT",$J,"21600337;DI(.85,")
 ;;=413;DI(.85,
 ;;^UTILITY("DIT",$J,"21600338;DI(.85,")
 ;;=422;DI(.85,
 ;;^UTILITY("DIT",$J,"21600339;DI(.85,")
 ;;=415;DI(.85,
 ;;^UTILITY("DIT",$J,"21600340;DI(.85,")
 ;;=411;DI(.85,
 ;;^UTILITY("DIT",$J,"21600341;DI(.85,")
 ;;=403;DI(.85,
 ;;^UTILITY("DIT",$J,"21600342;DI(.85,")
 ;;=418;DI(.85,
 ;;^UTILITY("DIT",$J,"21600343;DI(.85,")
 ;;=290;DI(.85,
 ;;^UTILITY("DIT",$J,"21600344;DI(.85,")
 ;;=419;DI(.85,
 ;;^UTILITY("DIT",$J,"21600345;DI(.85,")
 ;;=412;DI(.85,
 ;;^UTILITY("DIT",$J,"21600346;DI(.85,")
 ;;=421;DI(.85,
 ;;^UTILITY("DIT",$J,"21600347;DI(.85,")
 ;;=420;DI(.85,
 ;;^UTILITY("DIT",$J,"21600348;DI(.85,")
 ;;=7;DI(.85,
 ;;^UTILITY("DIT",$J,"21600349;DI(.85,")
 ;;=291;DI(.85,
 ;;^UTILITY("DIT",$J,"21600350;DI(.85,")
 ;;=404;DI(.85,
 ;;^UTILITY("DIT",$J,"21600351;DI(.85,")
 ;;=416;DI(.85,
 ;;^UTILITY("DIT",$J,"21600352;DI(.85,")
 ;;=;DI(.85,
 ;;^UTILITY("DIT",$J,"21600353;DI(.85,")
 ;;=423;DI(.85,
 ;;^UTILITY("DIT",$J,"21600354;DI(.85,")
 ;;=424;DI(.85,
 ;;^UTILITY("DIT",$J,"21600355;DI(.85,")
 ;;=425;DI(.85,
 ;;^UTILITY("DIT",$J,"21600356;DI(.85,")
 ;;=426;DI(.85,
 ;;^UTILITY("DIT",$J,"21600357;DI(.85,")
 ;;=293;DI(.85,
 ;;^UTILITY("DIT",$J,"21600358;DI(.85,")
 ;;=429;DI(.85,
 ;;^UTILITY("DIT",$J,"21600359;DI(.85,")
 ;;=430;DI(.85,
 ;;^UTILITY("DIT",$J,"21600360;DI(.85,")
 ;;=428;DI(.85,
 ;;^UTILITY("DIT",$J,"21600361;DI(.85,")
 ;;=431;DI(.85,
 ;;^UTILITY("DIT",$J,"21600362;DI(.85,")
 ;;=34;DI(.85,
 ;;^UTILITY("DIT",$J,"21600363;DI(.85,")
 ;;=11;DI(.85,
 ;;^UTILITY("DIT",$J,"21600364;DI(.85,")
 ;;=438;DI(.85,
 ;;^UTILITY("DIT",$J,"21600365;DI(.85,")
 ;;=439;DI(.85,

DMLAC005
DMLAC005 ; ; 18-DEC-2012 ; 1/27/13 3:45pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) S @X=Y
Q Q
 ;;^UTILITY("DIT",$J,"21600366;DI(.85,")
 ;;=524;DI(.85,
 ;;^UTILITY("DIT",$J,"21600367;DI(.85,")
 ;;=304;DI(.85,
 ;;^UTILITY("DIT",$J,"21600368;DI(.85,")
 ;;=294;DI(.85,
 ;;^UTILITY("DIT",$J,"21600369;DI(.85,")
 ;;=432;DI(.85,
 ;;^UTILITY("DIT",$J,"21600370;DI(.85,")
 ;;=440;DI(.85,
 ;;^UTILITY("DIT",$J,"21600371;DI(.85,")
 ;;=443;DI(.85,
 ;;^UTILITY("DIT",$J,"21600372;DI(.85,")
 ;;=441;DI(.85,
 ;;^UTILITY("DIT",$J,"21600373;DI(.85,")
 ;;=450;DI(.85,
 ;;^UTILITY("DIT",$J,"21600374;DI(.85,")
 ;;=444;DI(.85,
 ;;^UTILITY("DIT",$J,"21600375;DI(.85,")
 ;;=445;DI(.85,
 ;;^UTILITY("DIT",$J,"21600376;DI(.85,")
 ;;=297;DI(.85,
 ;;^UTILITY("DIT",$J,"21600377;DI(.85,")
 ;;=401;DI(.85,
 ;;^UTILITY("DIT",$J,"21600378;DI(.85,")
 ;;=298;DI(.85,
 ;;^UTILITY("DIT",$J,"21600379;DI(.85,")
 ;;=448;DI(.85,
 ;;^UTILITY("DIT",$J,"21600380;DI(.85,")
 ;;=451;DI(.85,
 ;;^UTILITY("DIT",$J,"21600381;DI(.85,")
 ;;=454;DI(.85,
 ;;^UTILITY("DIT",$J,"21600382;DI(.85,")
 ;;=300;DI(.85,
 ;;^UTILITY("DIT",$J,"21600383;DI(.85,")
 ;;=299;DI(.85,
 ;;^UTILITY("DIT",$J,"21600384;DI(.85,")
 ;;=301;DI(.85,
 ;;^UTILITY("DIT",$J,"21600385;DI(.85,")
 ;;=457;DI(.85,
 ;;^UTILITY("DIT",$J,"21600386;DI(.85,")
 ;;=458;DI(.85,
 ;;^UTILITY("DIT",$J,"21600387;DI(.85,")
 ;;=436;DI(.85,
 ;;^UTILITY("DIT",$J,"21600388;DI(.85,")
 ;;=434;DI(.85,
 ;;^UTILITY("DIT",$J,"21600389;DI(.85,")
 ;;=295;DI(.85,
 ;;^UTILITY("DIT",$J,"21600390;DI(.85,")
 ;;=433;DI(.85,
 ;;^UTILITY("DIT",$J,"21600391;DI(.85,")
 ;;=160;DI(.85,
 ;;^UTILITY("DIT",$J,"21600392;DI(.85,")
 ;;=437;DI(.85,
 ;;^UTILITY("DIT",$J,"21600393;DI(.85,")
 ;;=435;DI(.85,
 ;;^UTILITY("DIT",$J,"21600394;DI(.85,")
 ;;=449;DI(.85,
 ;;^UTILITY("DIT",$J,"21600395;DI(.85,")
 ;;=453;DI(.85,
 ;;^UTILITY("DIT",$J,"21600396;DI(.85,")
 ;;=461;DI(.85,
 ;;^UTILITY("DIT",$J,"21600397;DI(.85,")
 ;;=459;DI(.85,
 ;;^UTILITY("DIT",$J,"21600398;DI(.85,")
 ;;=460;DI(.85,
 ;;^UTILITY("DIT",$J,"21600399;DI(.85,")
 ;;=302;DI(.85,
 ;;^UTILITY("DIT",$J,"21600400;DI(.85,")
 ;;=464;DI(.85,
 ;;^UTILITY("DIT",$J,"21600401;DI(.85,")
 ;;=3;DI(.85,
 ;;^UTILITY("DIT",$J,"21600402;DI(.85,")
 ;;=442;DI(.85,
 ;;^UTILITY("DIT",$J,"21600403;DI(.85,")
 ;;=465;DI(.85,
 ;;^UTILITY("DIT",$J,"21600404;DI(.85,")
 ;;=446;DI(.85,
 ;;^UTILITY("DIT",$J,"21600405;DI(.85,")
 ;;=447;DI(.85,
 ;;^UTILITY("DIT",$J,"21600406;DI(.85,")
 ;;=281;DI(.85,
 ;;^UTILITY("DIT",$J,"21600407;DI(.85,")
 ;;=471;DI(.85,
 ;;^UTILITY("DIT",$J,"21600408;DI(.85,")
 ;;=466;DI(.85,
 ;;^UTILITY("DIT",$J,"21600409;DI(.85,")
 ;;=468;DI(.85,
 ;;^UTILITY("DIT",$J,"21600410;DI(.85,")
 ;;=469;DI(.85,
 ;;^UTILITY("DIT",$J,"21600411;DI(.85,")
 ;;=467;DI(.85,
 ;;^UTILITY("DIT",$J,"21600412;DI(.85,")
 ;;=470;DI(.85,
 ;;^UTILITY("DIT",$J,"21600413;DI(.85,")
 ;;=472;DI(.85,
 ;;^UTILITY("DIT",$J,"21600414;DI(.85,")
 ;;=82;DI(.85,
 ;;^UTILITY("DIT",$J,"21600415;DI(.85,")
 ;;=474;DI(.85,
 ;;^UTILITY("DIT",$J,"21600416;DI(.85,")
 ;;=476;DI(.85,
 ;;^UTILITY("DIT",$J,"21600417;DI(.85,")
 ;;=307;DI(.85,
 ;;^UTILITY("DIT",$J,"21600418;DI(.85,")
 ;;=479;DI(.85,
 ;;^UTILITY("DIT",$J,"21600419;DI(.85,")
 ;;=480;DI(.85,
 ;;^UTILITY("DIT",$J,"21600420;DI(.85,")
 ;;=481;DI(.85,
 ;;^UTILITY("DIT",$J,"21600421;DI(.85,")
 ;;=488;DI(.85,
 ;;^UTILITY("DIT",$J,"21600422;DI(.85,")
 ;;=482;DI(.85,
 ;;^UTILITY("DIT",$J,"21600423;DI(.85,")
 ;;=483;DI(.85,
 ;;^UTILITY("DIT",$J,"21600424;DI(.85,")
 ;;=477;DI(.85,
 ;;^UTILITY("DIT",$J,"21600425;DI(.85,")
 ;;=475;DI(.85,
 ;;^UTILITY("DIT",$J,"21600426;DI(.85,")
 ;;=484;DI(.85,
 ;;^UTILITY("DIT",$J,"21600427;DI(.85,")
 ;;=485;DI(.85,
 ;;^UTILITY("DIT",$J,"21600428;DI(.85,")
 ;;=486;DI(.85,
 ;;^UTILITY("DIT",$J,"21600429;DI(.85,")
 ;;=487;DI(.85,
 ;;^UTILITY("DIT",$J,"21600430;DI(.85,")
 ;;=489;DI(.85,
 ;;^UTILITY("DIT",$J,"21600431;DI(.85,")
 ;;=492;DI(.85,
 ;;^UTILITY("DIT",$J,"21600432;DI(.85,")
 ;;=194;DI(.85,
 ;;^UTILITY("DIT",$J,"21600433;DI(.85,")
 ;;=490;DI(.85,
 ;;^UTILITY("DIT",$J,"21600434;DI(.85,")
 ;;=478;DI(.85,
 ;;^UTILITY("DIT",$J,"21600435;DI(.85,")
 ;;=493;DI(.85,
 ;;^UTILITY("DIT",$J,"21600436;DI(.85,")
 ;;=494;DI(.85,
 ;;^UTILITY("DIT",$J,"21600437;DI(.85,")
 ;;=491;DI(.85,
 ;;^UTILITY("DIT",$J,"21600438;DI(.85,")
 ;;=495;DI(.85,
 ;;^UTILITY("DIT",$J,"21600439;DI(.85,")
 ;;=497;DI(.85,
 ;;^UTILITY("DIT",$J,"21600440;DI(.85,")
 ;;=496;DI(.85,
 ;;^UTILITY("DIT",$J,"21600441;DI(.85,")
 ;;=500;DI(.85,
 ;;^UTILITY("DIT",$J,"21600442;DI(.85,")
 ;;=498;DI(.85,
 ;;^UTILITY("DIT",$J,"21600443;DI(.85,")
 ;;=311;DI(.85,
 ;;^UTILITY("DIT",$J,"21600444;DI(.85,")
 ;;=499;DI(.85,
 ;;^UTILITY("DIT",$J,"21600445;DI(.85,")
 ;;=213;DI(.85,
 ;;^UTILITY("DIT",$J,"21600446;DI(.85,")
 ;;=501;DI(.85,
 ;;^UTILITY("DIT",$J,"21600447;DI(.85,")
 ;;=503;DI(.85,
 ;;^UTILITY("DIT",$J,"21600448;DI(.85,")
 ;;=502;DI(.85,
 ;;^UTILITY("DIT",$J,"21600449;DI(.85,")
 ;;=504;DI(.85,
 ;;^UTILITY("DIT",$J,"21600450;DI(.85,")
 ;;=505;DI(.85,
 ;;^UTILITY("DIT",$J,"21600451;DI(.85,")
 ;;=506;DI(.85,
 ;;^UTILITY("DIT",$J,"21600452;DI(.85,")
 ;;=507;DI(.85,
 ;;^UTILITY("DIT",$J,"21600453;DI(.85,")
 ;;=508;DI(.85,
 ;;^UTILITY("DIT",$J,"21600454;DI(.85,")
 ;;=509;DI(.85,
 ;;^UTILITY("DIT",$J,"21600455;DI(.85,")
 ;;=510;DI(.85,
 ;;^UTILITY("DIT",$J,"21600456;DI(.85,")
 ;;=511;DI(.85,
 ;;^UTILITY("DIT",$J,"21600457;DI(.85,")
 ;;=512;DI(.85,
 ;;^UTILITY("DIT",$J,"21600458;DI(.85,")
 ;;=513;DI(.85,
 ;;^UTILITY("DIT",$J,"21600459;DI(.85,")
 ;;=514;DI(.85,
 ;;^UTILITY("DIT",$J,"21600460;DI(.85,")
 ;;=515;DI(.85,
 ;;^UTILITY("DIT",$J,"21600461;DI(.85,")
 ;;=516;DI(.85,
 ;;^UTILITY("DIT",$J,"21600462;DI(.85,")
 ;;=316;DI(.85,
 ;;^UTILITY("DIT",$J,"21600463;DI(.85,")
 ;;=521;DI(.85,
 ;;^UTILITY("DIT",$J,"21600464;DI(.85,")
 ;;=518;DI(.85,
 ;;^UTILITY("DIT",$J,"21600465;DI(.85,")
 ;;=519;DI(.85,
 ;;^UTILITY("DIT",$J,"21600466;DI(.85,")
 ;;=520;DI(.85,
 ;;^UTILITY("DIT",$J,"21600467;DI(.85,")
 ;;=303;DI(.85,
 ;;^UTILITY("DIT",$J,"21600468;DI(.85,")
 ;;=517;DI(.85,
 ;;^UTILITY("DIT",$J,"21600469;DI(.85,")
 ;;=522;DI(.85,
 ;;^UTILITY("DIT",$J,"21600470;DI(.85,")
 ;;=176;DI(.85,
 ;;^UTILITY("DIT",$J,"21600471;DI(.85,")
 ;;=523;DI(.85,
 ;;^UTILITY("DIT",$J,"21600472;DI(.85,")
 ;;=525;DI(.85,
 ;;^UTILITY("DIT",$J,"21600473;DI(.85,")
 ;;=526;DI(.85,
 ;;^UTILITY("DIT",$J,"21600474;DI(.85,")
 ;;=527;DI(.85,
 ;;^UTILITY("DIT",$J,"21600475;DI(.85,")
 ;;=528;DI(.85,
 ;;^UTILITY("DIT",$J,"21600476;DI(.85,")
 ;;=320;DI(.85,
 ;;^UTILITY("DIT",$J,"21600477;DI(.85,")
 ;;=529;DI(.85,
 ;;^UTILITY("DIT",$J,"21600478;DI(.85,")
 ;;=57;DI(.85,
 ;;^UTILITY("DIT",$J,"21600479;DI(.85,")
 ;;=531;DI(.85,
 ;;^UTILITY("DIT",$J,"21600480;DI(.85,")
 ;;=532;DI(.85,
 ;;^UTILITY("DIT",$J,"21600481;DI(.85,")
 ;;=321;DI(.85,
 ;;^UTILITY("DIT",$J,"21600482;DI(.85,")
 ;;=533;DI(.85,
 ;;^UTILITY("DIT",$J,"21600483;DI(.85,")
 ;;=534;DI(.85,
 ;;^UTILITY("DIT",$J,"21600484;DI(.85,")
 ;;=385;DI(.85,
 ;;^UTILITY("DIT",$J,"21600485;DI(.85,")
 ;;=530;DI(.85,

DMLAI001
DMLAI001 ; ; 31-JAN-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(.85,0,"GL")
 ;;=^DI(.85,
 ;;^DIC("B","LANGUAGE",.85)
 ;;=
 ;;^DIC(.85,"%",0)
 ;;=^1.005
 ;;^DIC(.85,"%D",0)
 ;;=^^27^27^3121101^
 ;;^DIC(.85,"%D",1,0)
 ;;=The LANGUAGE file is used both to officially identify a language, and to
 ;;^DIC(.85,"%D",2,0)
 ;;=store MUMPS code needed to do language-specific conversions of data such
 ;;^DIC(.85,"%D",3,0)
 ;;=as dates and numbers.
 ;;^DIC(.85,"%D",4,0)
 ;;= 
 ;;^DIC(.85,"%D",5,0)
 ;;=Fileman distributes entries for the following languages:
 ;;^DIC(.85,"%D",6,0)
 ;;= ID Number (.001)       Name (.01)
 ;;^DIC(.85,"%D",7,0)
 ;;=                1       English
 ;;^DIC(.85,"%D",8,0)
 ;;=                2       German
 ;;^DIC(.85,"%D",9,0)
 ;;=                3       Spanish
 ;;^DIC(.85,"%D",10,0)
 ;;=                4       French
 ;;^DIC(.85,"%D",11,0)
 ;;=                5       Finnish
 ;;^DIC(.85,"%D",12,0)
 ;;=                6       Italian
 ;;^DIC(.85,"%D",13,0)
 ;;=                7       Portuguese
 ;;^DIC(.85,"%D",14,0)
 ;;=               10       Arabic
 ;;^DIC(.85,"%D",15,0)
 ;;=               11       Russian
 ;;^DIC(.85,"%D",16,0)
 ;;=               12       Greek
 ;;^DIC(.85,"%D",17,0)
 ;;=               18       Hebrew
 ;;^DIC(.85,"%D",18,0)
 ;;= 
 ;;^DIC(.85,"%D",19,0)
 ;;=The ISO-639-1 and ISO-639-2 compatible language file is distributed in the
 ;;^DIC(.85,"%D",20,0)
 ;;=DILAINIT routines, shipped with Fileman 22.2.
 ;;^DIC(.85,"%D",21,0)
 ;;= 
 ;;^DIC(.85,"%D",22,0)
 ;;=A pointer to this file from the TRANSLATION multiple on the DIALOG file
 ;;^DIC(.85,"%D",23,0)
 ;;=also allows non-English text to be returned via FileMan calls.
 ;;^DIC(.85,"%D",24,0)
 ;;= 
 ;;^DIC(.85,"%D",25,0)
 ;;=A note to VISTA developers: Although users can select entries by name, 
 ;;^DIC(.85,"%D",26,0)
 ;;=software should use the official two or three letter codes to eliminiate 
 ;;^DIC(.85,"%D",27,0)
 ;;=mistakes resulting from languages that have similar spelling.
 ;;^DIC(.85,"%MSC")
 ;;=3121114.111954
 ;;^DD(.85,0)
 ;;=FIELD^^10^20
 ;;^DD(.85,0,"DT")
 ;;=3121101
 ;;^DD(.85,0,"ID",.02)
 ;;=W "   ",$P(^(0),U,2)
 ;;^DD(.85,0,"ID",.03)
 ;;=W "   ",$P(^(0),U,3)
 ;;^DD(.85,0,"IX","F",.8501,.01)
 ;;=
 ;;^DD(.85,0,"NM","LANGUAGE")
 ;;=
 ;;^DD(.85,0,"PT",.007,.001)
 ;;=
 ;;^DD(.85,0,"PT",.008,.001)
 ;;=
 ;;^DD(.85,0,"PT",.009,.001)
 ;;=
 ;;^DD(.85,0,"PT",.4,709.1)
 ;;=
 ;;^DD(.85,0,"PT",.4,1819.1)
 ;;=
 ;;^DD(.85,0,"PT",.847,.01)
 ;;=
 ;;^DD(.85,0,"PT",.85,.08)
 ;;=
 ;;^DD(.85,0,"PT",.85,.09)
 ;;=
 ;;^DD(.85,0,"PT",1.008,.001)
 ;;=
 ;;^DD(.85,0,"PT",200,200.07)
 ;;=
 ;;^DD(.85,0,"PT",8989.3,207)
 ;;=
 ;;^DD(.85,.001,0)
 ;;=ID NUMBER^NJ10,0^^ ^K:+X'=X!(X>9999999999)!(X<1)!(X?.E1"."1.N) X
 ;;^DD(.85,.001,3)
 ;;=Type a number between 1 and 9999999999, 0 decimal digits.
 ;;^DD(.85,.001,21,0)
 ;;=^^3^3^3121031^^
 ;;^DD(.85,.001,21,1,0)
 ;;=A number that is used to uniquely identify a language.  This number
 ;;^DD(.85,.001,21,2,0)
 ;;=corresponds to the Kernel system variable DUZ("LANG"), which is set
 ;;^DD(.85,.001,21,3,0)
 ;;=during Kernel signon to signify which language Fileman should use.
 ;;^DD(.85,.001,23,0)
 ;;=^^31^31^3121031^
 ;;^DD(.85,.001,23,1,0)
 ;;=Entries in this file are standardized, with the contents controlled by 
 ;;^DD(.85,.001,23,2,0)
 ;;=the Fileman Primary Development Team. The ID Number field is used to help 
 ;;^DD(.85,.001,23,3,0)
 ;;=protect referential integrity in VISTA databases during upgrades to the 
 ;;^DD(.85,.001,23,4,0)
 ;;=file. ID Number assignment corresponds to the order in which languages 
 ;;^DD(.85,.001,23,5,0)
 ;;=were added to the file. They were added in segments.
 ;;^DD(.85,.001,23,6,0)
 ;;= 
 ;;^DD(.85,.001,23,7,0)
 ;;=The first segment consists of language numbers 1-7, 10-12, and 18, which 
 ;;^DD(.85,.001,23,8,0)
 ;;=were the first eleven languages added, in order. English is first because 
 ;;^DD(.85,.001,23,9,0)
 ;;=Fileman was originally written in English. German is second because 
 ;;^DD(.85,.001,23,10,0)
 ;;=Marcus Werners of Germany led the effort to create Fileman's dialog 
 ;;^DD(.85,.001,23,11,0)
 ;;=framework, to make translating VISTA into other languages easier. 
 ;;^DD(.85,.001,23,12,0)
 ;;=Spanish, French, Finnish, Italian, and Portuguese follow in the order in 
 ;;^DD(.85,.001,23,13,0)
 ;;=which the Fileman team was approached by potential translators about 
 ;;^DD(.85,.001,23,14,0)
 ;;=adding those languages to the file (though Finnish actually predates all 
 ;;^DD(.85,.001,23,15,0)
 ;;=other translation efforts except English). Arabic was assigned ID Number 
 ;;^DD(.85,.001,23,16,0)
 ;;=10 instead of 8 in recognition of the debt English owes Arabic for 
 ;;^DD(.85,.001,23,17,0)
 ;;=introducing the decimal numbering system to Europe. Russian and Greek 
 ;;^DD(.85,.001,23,18,0)
 ;;=were the next two translations the Fileman team was approached about. I 
 ;;^DD(.85,.001,23,19,0)
 ;;=do not recall why for Hebrew we skipped ahead to ID Number 18, but I'm 
 ;;^DD(.85,.001,23,20,0)
 ;;=sure there was a reason.
 ;;^DD(.85,.001,23,21,0)
 ;;= 
 ;;^DD(.85,.001,23,22,0)
 ;;=Thereafter, languages are added in segments, in order by Name, starting 
 ;;^DD(.85,.001,23,23,0)
 ;;=with ID Number 8. The segments correspond to the ISO 639 language 
 ;;^DD(.85,.001,23,24,0)
 ;;=standards, in order (639-1 languages in segment two, 639-2 in three, and 
 ;;^DD(.85,.001,23,25,0)
 ;;=so on). Each language has one unique record in this file, so wherever a 
 ;;^DD(.85,.001,23,26,0)
 ;;=language in one segment has already been included in an earlier segment, 
 ;;^DD(.85,.001,23,27,0)
 ;;=it is not included in the later segment (e.g., Greek was in segment one, 
 ;;^DD(.85,.001,23,28,0)
 ;;=so it is not also added as a duplicate in segment two).
 ;;^DD(.85,.001,23,29,0)
 ;;= 
 ;;^DD(.85,.001,23,30,0)
 ;;=This segmented approach makes it comparatively easy to upgrade the file 
 ;;^DD(.85,.001,23,31,0)
 ;;=in discrete batches, to keep the update projects manageable.
 ;;^DD(.85,.001,"DT")
 ;;=3121031
 ;;^DD(.85,.01,0)
 ;;=NAME^RFJ60^^0;1^K:$L(X)>60!($L(X)<1) X
 ;;^DD(.85,.01,.1)
 ;;=Language-Name
 ;;^DD(.85,.01,3)
 ;;=Answer must be 1-60 characters in length.
 ;;^DD(.85,.01,21,0)
 ;;=^^10^10^3121031^
 ;;^DD(.85,.01,21,1,0)
 ;;=Enter the English name of the language, not the native name. 
 ;;^DD(.85,.01,21,2,0)
 ;;= 
 ;;^DD(.85,.01,21,3,0)
 ;;=The default is the English name from ISO 639, converted where necessary to
 ;;^DD(.85,.01,21,4,0)
 ;;=ASCII. Where the ISO 639 standards disagree (cf. "Central Khmer" in ISO
 ;;^DD(.85,.01,21,5,0)
 ;;=639-1 to "Khmer" in ISO 639-3), the most recent standard's spelling is
 ;;^DD(.85,.01,21,6,0)
 ;;=used.
 ;;^DD(.85,.01,21,7,0)
 ;;= 
 ;;^DD(.85,.01,21,8,0)
 ;;=However, this use of ISO 639's spelling as a default is overridden in 
 ;;^DD(.85,.01,21,9,0)
 ;;=several different ways to improve consistency across entries and to 
 ;;^DD(.85,.01,21,10,0)
 ;;=reduce selection error.
 ;;^DD(.85,.01,23,0)
 ;;=^^63^63^3121031^
 ;;^DD(.85,.01,23,1,0)
 ;;=This is the English name of the language, not the native name. It 
 ;;^DD(.85,.01,23,2,0)
 ;;=defaults to the English name from ISO 639, mixed case, converted where 
 ;;^DD(.85,.01,23,3,0)
 ;;=necessary to ASCII. Where the ISO 639 standards disagree (cf. "Central 
 ;;^DD(.85,.01,23,4,0)
 ;;=Khmer" in ISO 639-1 to "Khmer" in ISO 639-3), the most recent standard's 
 ;;^DD(.85,.01,23,5,0)
 ;;=spelling is used.
 ;;^DD(.85,.01,23,6,0)
 ;;= 
 ;;^DD(.85,.01,23,7,0)
 ;;=However, this use of ISO 639's spelling as a default is overridden in 
 ;;^DD(.85,.01,23,8,0)
 ;;=several different ways to improve consistency across entries and to 
 ;;^DD(.85,.01,23,9,0)
 ;;=reduce selection error.
 ;;^DD(.85,.01,23,10,0)
 ;;= 
 ;;^DD(.85,.01,23,11,0)
 ;;=For example, for most modern languages, the form of the name that 
 ;;^DD(.85,.01,23,12,0)
 ;;=includes the word "Modern" and the parenthesized dates is an alternate 
 ;;^DD(.85,.01,23,13,0)
 ;;=name, but ISO 639 reverses that with Modern Greek. In this file, we 
 ;;^DD(.85,.01,23,14,0)
 ;;=reassert the pattern by making the ISO 639 name "Greek, Modern (1453-)" 
 ;;^DD(.85,.01,23,15,0)
 ;;=an alternate name and making the name "Greek" instead.
 ;;^DD(.85,.01,23,16,0)
 ;;= 
 ;;^DD(.85,.01,23,17,0)
 ;;=Since most users of these systems are medical professionals rather than 
 ;;^DD(.85,.01,23,18,0)
 ;;=linguists or historians, we emphasize modern languages and group 
 ;;^DD(.85,.01,23,19,0)
 ;;=historical ones away from the modern names to reduce accidents. For 
 ;;^DD(.85,.01,23,20,0)
 ;;=example, "French, Old (842-ca.1400)" as so named in ISO 639-2 is used as 
 ;;^DD(.85,.01,23,21,0)
 ;;=an alternate name for "Old French" in this file, to move the obsolete 
 ;;^DD(.85,.01,23,22,0)
 ;;=form of the language away from the modern one. Thus, "Old" languages, 
 ;;^DD(.85,.01,23,23,0)
 ;;="Ancient" ones, and "Middle" ones will tend to sort together. However, 
 ;;^DD(.85,.01,23,24,0)
 ;;=languages whose names look like historical ones, such as "Old Church 
 ;;^DD(.85,.01,23,25,0)
 ;;=Slavonic", that are still living languages or in active liturgical use 
 ;;^DD(.85,.01,23,26,0)
 ;;=are kept in this form if that is how they are best known.
 ;;^DD(.85,.01,23,27,0)
 ;;= 
 ;;^DD(.85,.01,23,28,0)
 ;;=Also, such forms that include parenthetical dates are changed to remove 
 ;;^DD(.85,.01,23,29,0)
 ;;=the dates and parentheses from the Name field; the original forms and 
 ;;^DD(.85,.01,23,30,0)
 ;;=variants are preserved in the Alternate Name field.
 ;;^DD(.85,.01,23,31,0)
 ;;= 
 ;;^DD(.85,.01,23,32,0)
 ;;=For similar reasons, language collections like "Banda languages" are 
 ;;^DD(.85,.01,23,33,0)
 ;;=renamed as "Languages, Banda" to move them away from individual language 
 ;;^DD(.85,.01,23,34,0)
 ;;=a patient might speak, like "Banda-Banda". The same was preserved from 
 ;;^DD(.85,.01,23,35,0)
 ;;=ISO 639 with creoles and pidgins (such as "Creoles and Pidgins, 
 ;;^DD(.85,.01,23,36,0)
 ;;=Portuguese-Based"), which are collective languages, to kepp them separate 
 ;;^DD(.85,.01,23,37,0)
 ;;=from the individual languages they might be confused with (such as 
 ;;^DD(.85,.01,23,38,0)
 ;;="Portuguese"). However, individual languages like "Haitian Creole" and 
 ;;^DD(.85,.01,23,39,0)
 ;;="Chinook Jargon" whose ISO 639 names makes them sound like language 
 ;;^DD(.85,.01,23,40,0)
 ;;=collections are nevertheless left as is, since these are the names they 
 ;;^DD(.85,.01,23,41,0)
 ;;=are known by and since the distinguishing part of the name does come 
 ;;^DD(.85,.01,23,42,0)
 ;;=first, allowing for unambiguous selection.
 ;;^DD(.85,.01,23,43,0)
 ;;= 
 ;;^DD(.85,.01,23,44,0)
 ;;=Where the language name from ISO 639 is a list of alternative names, as 
 ;;^DD(.85,.01,23,45,0)
 ;;=in "Catalan, Valencian", the dominant name (based on other code sets, 
 ;;^DD(.85,.01,23,46,0)
 ;;=Ethnologue, Wikipedia, e.g. "Catalan") is used as the Name, with the 
 ;;^DD(.85,.01,23,47,0)
 ;;=other name(s) (e.g., "Valencian") added to the Alternate Name field.
 ;;^DD(.85,.01,23,48,0)
 ;;= 
 ;;^DD(.85,.01,23,49,0)
 ;;=As a general rule (except in the case of language collections), ISO 639 
 ;;^DD(.85,.01,23,50,0)
 ;;=names that use commas to invert a language name (like "Sorbian, Upper") 
 ;;^DD(.85,.01,23,51,0)
 ;;=are corrected (like "Upper Sorbian"), and the ISO 639 name is made an 
 ;;^DD(.85,.01,23,52,0)
 ;;=Alternate Name. We do not try to use commas in the Name field to group 
 ;;^DD(.85,.01,23,53,0)
 ;;=together all related languages or dialects, though we do in the Alternate 
 ;;^DD(.85,.01,23,54,0)
 ;;=Name field.
 ;;^DD(.85,.01,23,55,0)
 ;;= 
 ;;^DD(.85,.01,23,56,0)
 ;;=In the Name field, parenthetical comments are generally restricted to 
 ;;^DD(.85,.01,23,57,0)
 ;;=distinguishing between unrelated languages that have the same name, like 
 ;;^DD(.85,.01,23,58,0)
 ;;="Lele (Democratic Republic of Congo)" and "Lele (Papua New Guinea)". The 
 ;;^DD(.85,.01,23,59,0)
 ;;=parenthetical words will be (in order of preference) a country, a people, 
 ;;^DD(.85,.01,23,60,0)
 ;;=or an alternate name of the language, so long as it distinguishes it from 
 ;;^DD(.85,.01,23,61,0)
 ;;=the other identically named languages. To date, we have not had to change 
 ;;^DD(.85,.01,23,62,0)
 ;;=any of the ISO 639 names we've imported to make or correct these 
 ;;^DD(.85,.01,23,63,0)
 ;;=distinctions, but we stand ready to do so to enforce this pattern.
 ;;^DD(.85,.01,"DT")
 ;;=3121031
 ;;^DD(.85,.02,0)
 ;;=TWO LETTER CODE^FJ2^^0;2^K:$L(X)>2!($L(X)<2) X
 ;;^DD(.85,.02,3)
 ;;=Answer must be 2 characters in length.
 ;;^DD(.85,.02,21,0)
 ;;=^^3^3^3121101^^
 ;;^DD(.85,.02,21,1,0)
 ;;=Enter the two-letter code defined for this language in the ISO 639-1
 ;;^DD(.85,.02,21,2,0)
 ;;=standard. Not every language has a two-letter code; for those that do not
 ;;^DD(.85,.02,21,3,0)
 ;;=leave this field blank.
 ;;^DD(.85,.02,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.02,23,1,0)
 ;;=Future versions of this file wil include an optional key on this field.
 ;;^DD(.85,.02,"DT")
 ;;=3121101
 ;;^DD(.85,.03,0)
 ;;=THREE LETTER CODE^FJ3^^0;3^K:$L(X)>3!($L(X)<3) X
 ;;^DD(.85,.03,3)
 ;;=Answer must be 3 characters in length.
 ;;^DD(.85,.03,21,0)
 ;;=^^2^2^3121101^^^^
 ;;^DD(.85,.03,21,1,0)
 ;;=Enter the three-letter code defined for this language in the ISO 639-2/B
 ;;^DD(.85,.03,21,2,0)
 ;;=standard.
 ;;^DD(.85,.03,23,0)
 ;;=^^2^2^3121101^
 ;;^DD(.85,.03,23,1,0)
 ;;=When this file is upgraded to ISO-639-6, an optional key will be added to 
 ;;^DD(.85,.03,23,2,0)
 ;;=this field.
 ;;^DD(.85,.03,"DT")
 ;;=3121101
 ;;^DD(.85,.04,0)
 ;;=FOUR LETTER CODE^FJ4^^0;4^K:$L(X)>4!($L(X)<4) X
 ;;^DD(.85,.04,3)
 ;;=Answer must be 4 characters in length.
 ;;^DD(.85,.04,21,0)
 ;;=^^1^1^3121101^^^
 ;;^DD(.85,.04,21,1,0)
 ;;=Enter the four letter code associated with the language in ISO-639-6. 
 ;;^DD(.85,.04,23,0)
 ;;=^^3^3^3121101^
 ;;^DD(.85,.04,23,1,0)
 ;;=This field is currently not used in this version of the release (as of
 ;;^DD(.85,.04,23,2,0)
 ;;=Fileman V22.2). In a future version when this file is upgraded to 
 ;;^DD(.85,.04,23,3,0)
 ;;=ISO-639-6, a key will be added to this field.
 ;;^DD(.85,.04,"DT")
 ;;=3121101

DMLAI002
DMLAI002 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DD(.85,.05,0)
 ;;=ALTERNATE THREE LETTER CODE^FJ3^^0;5^K:$L(X)>3!($L(X)<3) X
 ;;^DD(.85,.05,3)
 ;;=Answer must be 3 characters in length.
 ;;^DD(.85,.05,21,0)
 ;;=^^4^4^3121101^
 ;;^DD(.85,.05,21,1,0)
 ;;=This is the alternate three letter code for a language. This will only be 
 ;;^DD(.85,.05,21,2,0)
 ;;=used in cases where the language abbreviation is different in English 
 ;;^DD(.85,.05,21,3,0)
 ;;=than in the native language. E.g. GER instead of DEU; for German instead 
 ;;^DD(.85,.05,21,4,0)
 ;;=of Deutsch. This alternate abbreviation can be found in ISO 639-2/B.
 ;;^DD(.85,.05,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.05,23,1,0)
 ;;=In a future version of Fileman, this field will have an optional key.
 ;;^DD(.85,.05,"DT")
 ;;=3121101
 ;;^DD(.85,.06,0)
 ;;=SCOPE^S^I:Individual;M:Macrolanguage;C:Collective;S:Special;L:Local;^0;6^Q
 ;;^DD(.85,.06,3)
 ;;=Select a language's scope
 ;;^DD(.85,.06,21,0)
 ;;=^^12^12^3121031^
 ;;^DD(.85,.06,21,1,0)
 ;;=Enter the Scope of a Language.
 ;;^DD(.85,.06,21,2,0)
 ;;= 
 ;;^DD(.85,.06,21,3,0)
 ;;=Individual if the language is an individually identifiable language 
 ;;^DD(.85,.06,21,4,0)
 ;;=(e.g. 'Cantonese').
 ;;^DD(.85,.06,21,5,0)
 ;;= 
 ;;^DD(.85,.06,21,6,0)
 ;;=Macrolanguage if the language encopasses several other languages (e.g. 
 ;;^DD(.85,.06,21,7,0)
 ;;='Chinese')
 ;;^DD(.85,.06,21,8,0)
 ;;= 
 ;;^DD(.85,.06,21,9,0)
 ;;=Collective if the language is a language group (e.g. 'Languages, 
 ;;^DD(.85,.06,21,10,0)
 ;;=Sino-Tibetan')
 ;;^DD(.85,.06,21,11,0)
 ;;= 
 ;;^DD(.85,.06,21,12,0)
 ;;=Special and Local are reserved for specific entries.
 ;;^DD(.85,.06,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.06,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.06,"DT")
 ;;=3121101
 ;;^DD(.85,.07,0)
 ;;=TYPE^S^L:Living;C:Constructed;A:Ancient;H:Historical;E:Extinct;^0;7^Q
 ;;^DD(.85,.07,.1)
 ;;=Historical Status
 ;;^DD(.85,.07,3)
 ;;=Select a choice.
 ;;^DD(.85,.07,21,0)
 ;;=^^12^12^3121101^^
 ;;^DD(.85,.07,21,1,0)
 ;;=Living means that the language is spoken today (e.g. English).
 ;;^DD(.85,.07,21,2,0)
 ;;= 
 ;;^DD(.85,.07,21,3,0)
 ;;=Constructed means that the language is artificial (e.g. Esperanto).
 ;;^DD(.85,.07,21,4,0)
 ;;= 
 ;;^DD(.85,.07,21,5,0)
 ;;=Ancient means that the language is very old and not spoken any more (e.g.
 ;;^DD(.85,.07,21,6,0)
 ;;=Ancient Egyptian).
 ;;^DD(.85,.07,21,7,0)
 ;;= 
 ;;^DD(.85,.07,21,8,0)
 ;;=Historical means that the language was being used in the Medieval times 
 ;;^DD(.85,.07,21,9,0)
 ;;=and is not spoken any more (e.g. Old High German).
 ;;^DD(.85,.07,21,10,0)
 ;;= 
 ;;^DD(.85,.07,21,11,0)
 ;;=Extinct means that the language was being used recently but has died out 
 ;;^DD(.85,.07,21,12,0)
 ;;=(e.g. Cornish).
 ;;^DD(.85,.07,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.07,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.07,"DT")
 ;;=3121101
 ;;^DD(.85,.08,0)
 ;;=LINGUISTIC CATEGORY^*P.85'^DI(.85,^0;8^S DIC("S")="I $P(^(0),U,6)=""C""" D ^DIC K DIC S DIC=$G(DIE),X=+Y K:Y<0 X
 ;;^DD(.85,.08,3)
 ;;=Select a choice.
 ;;^DD(.85,.08,12)
 ;;=Only collective languages are selectable
 ;;^DD(.85,.08,12.1)
 ;;=S DIC("S")="I $P(^(0),U,6)=""C"""
 ;;^DD(.85,.08,21,0)
 ;;=^^1^1^3121101^^
 ;;^DD(.85,.08,21,1,0)
 ;;=Enter a language collection to which this language belongs.
 ;;^DD(.85,.08,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.08,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.08,"DT")
 ;;=3121101
 ;;^DD(.85,.09,0)
 ;;=MEMBER OF LANGUAGE SET^*P.85'^DI(.85,^0;9^S DIC("S")="I $P(^(0),U,6)=""M""" D ^DIC K DIC S DIC=$G(DIE),X=+Y K:Y<0 X
 ;;^DD(.85,.09,3)
 ;;=Enter a choice.
 ;;^DD(.85,.09,12)
 ;;=You may only select Macrolanguages
 ;;^DD(.85,.09,12.1)
 ;;=S DIC("S")="I $P(^(0),U,6)=""M"""
 ;;^DD(.85,.09,21,0)
 ;;=^^3^3^3121101^
 ;;^DD(.85,.09,21,1,0)
 ;;=If this language is a dialect of a macrolanguage, select the 
 ;;^DD(.85,.09,21,2,0)
 ;;=macrolanguage to which it belongs. (E.g. Cantonese is a dialect of 
 ;;^DD(.85,.09,21,3,0)
 ;;=Chinese; thus Chinese is Cantonese's macrolanguage.)
 ;;^DD(.85,.09,23,0)
 ;;=^^1^1^3121101^
 ;;^DD(.85,.09,23,1,0)
 ;;=The current version of this file does not distribute data for this field.
 ;;^DD(.85,.09,"DT")
 ;;=3121101
 ;;^DD(.85,1,0)
 ;;=ALTERNATE NAME^.8501^^1;0
 ;;^DD(.85,10,0)
 ;;=DESCRIPTION^.8502^^10;0
 ;;^DD(.85,10,"DT")
 ;;=3121031
 ;;^DD(.85,10.1,0)
 ;;=ORDINAL NUMBER FORMAT^K^^ORD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.1,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.1,9)
 ;;=@
 ;;^DD(.85,10.1,21,0)
 ;;=^^6^6^2941121^^^^
 ;;^DD(.85,10.1,21,1,0)
 ;;=MUMPS code used to transfer a number in Y to its ordinal equivalent in
 ;;^DD(.85,10.1,21,2,0)
 ;;=this language. The code should set Y to the ordinal equivalent without
 ;;^DD(.85,10.1,21,3,0)
 ;;=altering any other variables in the environment.  Ex. in English:
 ;;^DD(.85,10.1,21,4,0)
 ;;=       Y=1     becomes         Y=1ST
 ;;^DD(.85,10.1,21,5,0)
 ;;=       Y=2     becomes         Y=2ND
 ;;^DD(.85,10.1,21,6,0)
 ;;=       Y=3     becomes         Y=3RD  etc.
 ;;^DD(.85,10.1,"DT")
 ;;=2940307
 ;;^DD(.85,10.2,0)
 ;;=DATE/TIME FORMAT^K^^DD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.2,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.2,9)
 ;;=@
 ;;^DD(.85,10.2,21,0)
 ;;=^^6^6^2941121^^^
 ;;^DD(.85,10.2,21,1,0)
 ;;=MUMPS code used to transfer a date or date/time in Y from FileMan internal
 ;;^DD(.85,10.2,21,2,0)
 ;;=format, to printable format equivalent to English MMM DD,YYYY@HH.MM.SS.
 ;;^DD(.85,10.2,21,3,0)
 ;;=The code should set Y to the output, without altering any other variables
 ;;^DD(.85,10.2,21,4,0)
 ;;=in the environment.  Ex. in English:
 ;;^DD(.85,10.2,21,5,0)
 ;;= 
 ;;^DD(.85,10.2,21,6,0)
 ;;=       Y=2940612.031245        becomes         Y=JUN 12,1994@03:12:45
 ;;^DD(.85,10.2,"DT")
 ;;=2940307
 ;;^DD(.85,10.21,0)
 ;;=DATE/TIME FORMAT (FMTE)^K^^FMTE;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.21,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.21,9)
 ;;=@
 ;;^DD(.85,10.21,21,0)
 ;;=^^22^22^2941122^
 ;;^DD(.85,10.21,21,1,0)
 ;;=MUMPS code used to transfer a date or date/time in Y from FileMan internal
 ;;^DD(.85,10.21,21,2,0)
 ;;=format, to printable format based on the various outputs from routine
 ;;^DD(.85,10.21,21,3,0)
 ;;=FMTE^DILIBF.  This is an extrinsic function.  Coming in to this MUMPS
 ;;^DD(.85,10.21,21,4,0)
 ;;=code, in addition to the internal date in Y, a third parameter will be
 ;;^DD(.85,10.21,21,5,0)
 ;;=defined to contain flags equivalent to the flag passed as the second input
 ;;^DD(.85,10.21,21,6,0)
 ;;=parameter to FMTE^DILIBF. The code should set Y to the output, without
 ;;^DD(.85,10.21,21,7,0)
 ;;=altering any other variables in the environment.  The output should be
 ;;^DD(.85,10.21,21,8,0)
 ;;=formatted based on these flags:
 ;;^DD(.85,10.21,21,9,0)
 ;;= 
 ;;^DD(.85,10.21,21,10,0)
 ;;= 1    MMM DD, YYYY@HH:MM:SS
 ;;^DD(.85,10.21,21,11,0)
 ;;= 2    MM/DD/YY@HH:MM:SS     no leading zeroes on month,day
 ;;^DD(.85,10.21,21,12,0)
 ;;= 3    DD/MM/YY@HH:MM:SS     no leading zeroes on month,day
 ;;^DD(.85,10.21,21,13,0)
 ;;= 4    YY/MM/DD@HH:MM:SS
 ;;^DD(.85,10.21,21,14,0)
 ;;= 5    MMM DD,YYYY@HH:MM:SS  no space before year,no leading zero on day
 ;;^DD(.85,10.21,21,15,0)
 ;;= 6    MM-DD-YYYY @ HH:MM:SS spaces separate time 
 ;;^DD(.85,10.21,21,16,0)
 ;;= 7    MM-DD-YYYY@HH:MM:SS   no leading zeroes on month,day
 ;;^DD(.85,10.21,21,17,0)
 ;;= 
 ;;^DD(.85,10.21,21,18,0)
 ;;=letters in the flag
 ;;^DD(.85,10.21,21,19,0)
 ;;= S    return always seconds
 ;;^DD(.85,10.21,21,20,0)
 ;;= U    return uppercase month names
 ;;^DD(.85,10.21,21,21,0)
 ;;= P    return time as am,pm
 ;;^DD(.85,10.21,21,22,0)
 ;;= D    return only date part
 ;;^DD(.85,10.21,"DT")
 ;;=2940624
 ;;^DD(.85,10.22,0)
 ;;=TIME^K^^TIME;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.22,3)
 ;;=This is Standard MUMPS code for the output of time only.
 ;;^DD(.85,10.22,9)
 ;;=@
 ;;^DD(.85,10.22,21,0)
 ;;=^^2^2^2960318^
 ;;^DD(.85,10.22,21,1,0)
 ;;=The code stored here will be used to get formatted output of the time
 ;;^DD(.85,10.22,21,2,0)
 ;;=part belonging to a FileMan Date/Time value.
 ;;^DD(.85,10.22,"DT")
 ;;=2960318
 ;;^DD(.85,10.3,0)
 ;;=CARDINAL NUMBER FORMAT^K^^CRD;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.3,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.3,9)
 ;;=@
 ;;^DD(.85,10.3,21,0)
 ;;=^^5^5^2941121^^
 ;;^DD(.85,10.3,21,1,0)
 ;;=MUMPS code used to transfer a number in Y to its cardinal equivalent in
 ;;^DD(.85,10.3,21,2,0)
 ;;=this language. The code should set Y to the cardinal equivalent without
 ;;^DD(.85,10.3,21,3,0)
 ;;=altering any other variables in the environment.  Ex. in English:
 ;;^DD(.85,10.3,21,4,0)
 ;;=       Y=2000     becomes         Y=2,000
 ;;^DD(.85,10.3,21,5,0)
 ;;=       Y=1234567  becomes         Y=1,234,567
 ;;^DD(.85,10.3,"DT")
 ;;=2940308
 ;;^DD(.85,10.4,0)
 ;;=UPPERCASE CONVERSION^K^^UC;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.4,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.4,9)
 ;;=@
 ;;^DD(.85,10.4,21,0)
 ;;=^^4^4^2941121^
 ;;^DD(.85,10.4,21,1,0)
 ;;=MUMPS code used to convert text in Y to its upper-case equivalent in
 ;;^DD(.85,10.4,21,2,0)
 ;;=this language. The code should set Y to the external format without
 ;;^DD(.85,10.4,21,3,0)
 ;;=altering any other variables in the environment.  In English, changes
 ;;^DD(.85,10.4,21,4,0)
 ;;=   abCdeF      to: ABCDEF
 ;;^DD(.85,10.4,"DT")
 ;;=2940308
 ;;^DD(.85,10.5,0)
 ;;=LOWERCASE CONVERSION^K^^LC;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,10.5,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,10.5,9)
 ;;=@
 ;;^DD(.85,10.5,21,0)
 ;;=^^4^4^2941121^
 ;;^DD(.85,10.5,21,1,0)
 ;;=MUMPS code used to convert text in Y to its lower-case equivalent in  
 ;;^DD(.85,10.5,21,2,0)
 ;;=this language. The code should set Y to the external format without
 ;;^DD(.85,10.5,21,3,0)
 ;;=altering any other variables in the environment.  In English, changes:
 ;;^DD(.85,10.5,21,4,0)
 ;;=    ABcdEFgHij         to:  abcdefghij
 ;;^DD(.85,10.5,"DT")
 ;;=2940308
 ;;^DD(.85,20.2,0)
 ;;=DATE INPUT^K^^20.2;E1,245^K:$L(X)>245 X D:$D(X) ^DIM
 ;;^DD(.85,20.2,3)
 ;;=This is Standard MUMPS code.
 ;;^DD(.85,20.2,9)
 ;;=@
 ;;^DD(.85,20.2,"DT")
 ;;=2940714
 ;;^DD(.8501,0)
 ;;=ALTERNATE NAME SUB-FIELD^^.01^1
 ;;^DD(.8501,0,"DT")
 ;;=3121101
 ;;^DD(.8501,0,"IX","B",.8501,.01)
 ;;=
 ;;^DD(.8501,0,"NM","ALTERNATE NAME")
 ;;=
 ;;^DD(.8501,0,"UP")
 ;;=.85
 ;;^DD(.8501,.01,0)
 ;;=ALTERNATE NAME^MFJ60^^0;1^K:$L(X)>60!($L(X)<1) X
 ;;^DD(.8501,.01,1,0)
 ;;=^.1
 ;;^DD(.8501,.01,1,1,0)
 ;;=.8501^B
 ;;^DD(.8501,.01,1,1,1)
 ;;=S ^DI(.85,DA(1),1,"B",$E(X,1,30),DA)=""
 ;;^DD(.8501,.01,1,1,2)
 ;;=K ^DI(.85,DA(1),1,"B",$E(X,1,30),DA)
 ;;^DD(.8501,.01,1,2,0)
 ;;=.85^F
 ;;^DD(.8501,.01,1,2,1)
 ;;=S ^DI(.85,"F",$E(X,1,30),DA(1),DA)=""
 ;;^DD(.8501,.01,1,2,2)
 ;;=K ^DI(.85,"F",$E(X,1,30),DA(1),DA)
 ;;^DD(.8501,.01,1,2,3)
 ;;=WHOLE FILE CROSS REFERENCE FOR ALTERNATE NAME
 ;;^DD(.8501,.01,1,2,"%D",0)
 ;;=^^1^1^3121101^
 ;;^DD(.8501,.01,1,2,"%D",1,0)
 ;;=Whole file cross-reference for ALTERNATE NAME multiple.
 ;;^DD(.8501,.01,1,2,"DT")
 ;;=3121101
 ;;^DD(.8501,.01,3)
 ;;=Answer must be 1-60 characters in length.
 ;;^DD(.8501,.01,21,0)
 ;;=^^2^2^3121101^^
 ;;^DD(.8501,.01,21,1,0)
 ;;=This field contains other synonyms for a language.
 ;;^DD(.8501,.01,21,2,0)
 ;;=E.g. for Greek, synonyms include Ellinika and Romaic.
 ;;^DD(.8501,.01,"DT")
 ;;=3121101
 ;;^DD(.8502,0)
 ;;=DESCRIPTION SUB-FIELD^^.01^1
 ;;^DD(.8502,0,"DT")
 ;;=3121031
 ;;^DD(.8502,0,"NM","DESCRIPTION")
 ;;=
 ;;^DD(.8502,0,"UP")
 ;;=.85
 ;;^DD(.8502,.01,0)
 ;;=DESCRIPTION^Wx^^0;1
 ;;^DD(.8502,.01,3)
 ;;=Enter an optional language description
 ;;^DD(.8502,.01,"DT")
 ;;=3121031
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",0)
 ;;=.85^B^Regular new-style B Index^R^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",1)
 ;;=S ^DI(.85,"B",X,DA)=""
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",2)
 ;;=K ^DI(.85,"B",X,DA)
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",2.5)
 ;;=K ^DI(.85,"B")
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",11.1,1,0)
 ;;=1^F^.85^.01^^1^F
 ;;^UTILITY("KX",$J,"IX",.85,.85,"B",11.1,1,3)
 ;;=
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",0)
 ;;=.85^C^Regular new style index on two letter language codes^R^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",1)
 ;;=S ^DI(.85,"C",X,DA)=""
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",2)
 ;;=K ^DI(.85,"C",X,DA)
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",2.5)
 ;;=K ^DI(.85,"C")
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"C",11.1,1,0)
 ;;=1^F^.85^.02^^1^F
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",0)
 ;;=.85^D^Regular new-style index for three letter abbreviations for languages^R^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",1)
 ;;=S ^DI(.85,"D",$E(X,1,30),DA)=""
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",2)
 ;;=K ^DI(.85,"D",$E(X,1,30),DA)
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",2.5)
 ;;=K ^DI(.85,"D")
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"D",11.1,1,0)
 ;;=1^F^.85^.03^30^1^F
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",0)
 ;;=.85^E^(Pseudo-)Mnemonic index for the Alternate three letter code^MU^^F^IR^I^.85^^^^^LS
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,0)
 ;;=^^6^6^3121031^
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,1,0)
 ;;=This will add entries to the D index for the three letter code a la the 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,2,0)
 ;;=mnemonic style.
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,3,0)
 ;;= 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,4,0)
 ;;=If you need re-cross-reference this field, you need to kill of the 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,5,0)
 ;;=entries in the regular D index, set the D index, and then set this index 
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",.1,6,0)
 ;;=to update the D with the mnemonic xrefs.
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",1)
 ;;=S ^DI(.85,"D",X,DA)=1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",2)
 ;;=K ^DI(.85,"D",X,DA)

DMLAI003
DMLAI003 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",.85,.85,"E",11.1,1,0)
 ;;=1^F^.85^.05^^1^F
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"A",0)
 ;;=.85^A^P^1046
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"A",2,0)
 ;;=^.312IA^1^1
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"A",2,1,0)
 ;;=.01^.85^1
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"B",0)
 ;;=.85^B^S^1048
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"B",2,0)
 ;;=^.312IA^1^1
 ;;^UTILITY("KX",$J,"KEY",.85,.85,"B",2,1,0)
 ;;=.03^.85^1
 ;;^UTILITY("KX",$J,"KEYPTR",.85,.85,"A")
 ;;=.85^B
 ;;^UTILITY("KX",$J,"KEYPTR",.85,.85,"B")
 ;;=.85^D

DMLAI004
DMLAI004 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,.85)
 ;;=^DI(.85,
 ;;^UTILITY(U,$J,.85,0)
 ;;=LANGUAGE^.85I^18^533
 ;;^UTILITY(U,$J,.85,1,0)
 ;;=ENGLISH^EN^ENG
 ;;^UTILITY(U,$J,.85,1,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,1,1,1,0)
 ;;=MODERN ENGLISH (1500-)
 ;;^UTILITY(U,$J,.85,1,1,2,0)
 ;;=ENGLISH,MODERN (1500-)
 ;;^UTILITY(U,$J,.85,1,"CRD")
 ;;=I Y S Y=$FN(Y,",")
 ;;^UTILITY(U,$J,.85,1,"DD")
 ;;=S:Y Y=$S($E(Y,4,5):$P("JAN^FEB^MAR^APR^MAY^JUN^JUL^AUG^SEP^OCT^NOV^DEC","^",+$E(Y,4,5))_" ",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_",",1:"")_($E(Y,1,3)+1700)_$P("@"_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),"^",Y[".")
 ;;^UTILITY(U,$J,.85,1,"FMTE")
 ;;=N RTN,%T S %T="."_$E($P(Y,".",2)_"000000",1,7),%F=$G(%F),RTN="F"_$S(%F<1:1,%F>7:1,1:+%F\1)_"^DILIBF" D @RTN S Y=%R
 ;;^UTILITY(U,$J,.85,1,"LC")
 ;;=S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
 ;;^UTILITY(U,$J,.85,1,"ORD")
 ;;=I $G(Y) S Y=Y_$S(Y#10=1&(Y#100-11):"ST",Y#10=2&(Y#100-12):"ND",Y#10=3&(Y#100-13):"RD",1:"TH")
 ;;^UTILITY(U,$J,.85,1,"TIME")
 ;;=S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),1:"")
 ;;^UTILITY(U,$J,.85,1,"UC")
 ;;=S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 ;;^UTILITY(U,$J,.85,2,0)
 ;;=GERMAN^DE^DEU^^GER
 ;;^UTILITY(U,$J,.85,2,1,0)
 ;;=^.8501^7^7
 ;;^UTILITY(U,$J,.85,2,1,1,0)
 ;;=GERMAN, STANDARD
 ;;^UTILITY(U,$J,.85,2,1,2,0)
 ;;=STANDARD GERMAN
 ;;^UTILITY(U,$J,.85,2,1,3,0)
 ;;=DEUTSCH
 ;;^UTILITY(U,$J,.85,2,1,4,0)
 ;;=DEUTSCH SPRACHE
 ;;^UTILITY(U,$J,.85,2,1,5,0)
 ;;=TEDESCO
 ;;^UTILITY(U,$J,.85,2,1,6,0)
 ;;=MODERN GERMAN (1500-)
 ;;^UTILITY(U,$J,.85,2,1,7,0)
 ;;=GERMAN,MODERN (1500-)
 ;;^UTILITY(U,$J,.85,2,"CRD")
 ;;=S:$G(Y) Y=$TR($FN(Y,","),",",".")
 ;;^UTILITY(U,$J,.85,2,"DD")
 ;;=S:Y Y=$S($E(Y,6,7):$E(Y,6,7)_".",1:"")_$S($E(Y,4,5):$E(Y,4,5)_".",1:"")_($E(Y,1,3)+1700)_$P(" "_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),"^",Y[".")
 ;;^UTILITY(U,$J,.85,2,"LC")
 ;;=S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\","abcdefghijklmnopqrstuvwxyz{}|")
 ;;^UTILITY(U,$J,.85,2,"ORD")
 ;;=S:$G(Y) Y=Y_"."
 ;;^UTILITY(U,$J,.85,2,"TIME")
 ;;=S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),1:"")
 ;;^UTILITY(U,$J,.85,2,"UC")
 ;;=S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz{}|","ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\")
 ;;^UTILITY(U,$J,.85,3,0)
 ;;=SPANISH^ES^SPA
 ;;^UTILITY(U,$J,.85,3,1,0)
 ;;=^.8501^5^5
 ;;^UTILITY(U,$J,.85,3,1,1,0)
 ;;=CASTILIAN
 ;;^UTILITY(U,$J,.85,3,1,2,0)
 ;;=CASTELLANO
 ;;^UTILITY(U,$J,.85,3,1,3,0)
 ;;=ESPANOL
 ;;^UTILITY(U,$J,.85,3,1,4,0)
 ;;=MODERN SPANISH (1500-)
 ;;^UTILITY(U,$J,.85,3,1,5,0)
 ;;=SPANISH, MODERN (1500-)
 ;;^UTILITY(U,$J,.85,4,0)
 ;;=FRENCH^FR^FRA^^FRE
 ;;^UTILITY(U,$J,.85,4,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,4,1,1,0)
 ;;=FRANCAIS
 ;;^UTILITY(U,$J,.85,4,1,2,0)
 ;;=MODERN FRENCH (1600-)
 ;;^UTILITY(U,$J,.85,4,1,3,0)
 ;;=FRENCH, MODERN (1600-)
 ;;^UTILITY(U,$J,.85,5,0)
 ;;=FINNISH^FI^FIN
 ;;^UTILITY(U,$J,.85,5,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,5,1,1,0)
 ;;=SUOMEA
 ;;^UTILITY(U,$J,.85,5,1,2,0)
 ;;=SUOMI
 ;;^UTILITY(U,$J,.85,5,1,3,0)
 ;;=SUOMEN KIELI
 ;;^UTILITY(U,$J,.85,5,"DD")
 ;;=X:$G(Y) ^DD("DD")
 ;;^UTILITY(U,$J,.85,5,"ORD")
 ;;=I $G(Y) S Y=Y_"."
 ;;^UTILITY(U,$J,.85,6,0)
 ;;=ITALIAN^IT^ITA
 ;;^UTILITY(U,$J,.85,6,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,6,1,1,0)
 ;;=ITALIANO
 ;;^UTILITY(U,$J,.85,6,1,2,0)
 ;;=LINGUA ITALIANA
 ;;^UTILITY(U,$J,.85,7,0)
 ;;=PORTUGUESE^PT^POR
 ;;^UTILITY(U,$J,.85,7,1,0)
 ;;=^.8501^4^4
 ;;^UTILITY(U,$J,.85,7,1,1,0)
 ;;=PORTUGUES
 ;;^UTILITY(U,$J,.85,7,1,2,0)
 ;;=LINGUA PORTUGUESA
 ;;^UTILITY(U,$J,.85,7,1,3,0)
 ;;=MODERN PORTUGUESE (1516-)
 ;;^UTILITY(U,$J,.85,7,1,4,0)
 ;;=PORTUGUESE, MODERN (1516-)
 ;;^UTILITY(U,$J,.85,8,0)
 ;;=ABKHAZ^AB^ABK
 ;;^UTILITY(U,$J,.85,8,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,8,1,1,0)
 ;;=ABKHAZIAN
 ;;^UTILITY(U,$J,.85,8,1,2,0)
 ;;=ABXAZO
 ;;^UTILITY(U,$J,.85,9,0)
 ;;=ACHINESE^^ACE
 ;;^UTILITY(U,$J,.85,10,0)
 ;;=ARABIC^AR^ARA
 ;;^UTILITY(U,$J,.85,10,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,10,1,1,0)
 ;;=AL-'ARABIYYAH
 ;;^UTILITY(U,$J,.85,10,1,2,0)
 ;;='ARABI
 ;;^UTILITY(U,$J,.85,11,0)
 ;;=RUSSIAN^RU^RUS
 ;;^UTILITY(U,$J,.85,11,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,11,1,1,0)
 ;;=RUSSKI
 ;;^UTILITY(U,$J,.85,11,1,2,0)
 ;;=RUSSKIY YAZYK
 ;;^UTILITY(U,$J,.85,12,0)
 ;;=GREEK^EL^ELL^^GRE
 ;;^UTILITY(U,$J,.85,12,1,0)
 ;;=^.8501^9^9
 ;;^UTILITY(U,$J,.85,12,1,1,0)
 ;;=ELLINIKA
 ;;^UTILITY(U,$J,.85,12,1,2,0)
 ;;=ELLINIKI GLOSSA
 ;;^UTILITY(U,$J,.85,12,1,3,0)
 ;;=GRAECAE
 ;;^UTILITY(U,$J,.85,12,1,4,0)
 ;;=GREC
 ;;^UTILITY(U,$J,.85,12,1,5,0)
 ;;=GRECO
 ;;^UTILITY(U,$J,.85,12,1,6,0)
 ;;=NEO-HELLENIC
 ;;^UTILITY(U,$J,.85,12,1,7,0)
 ;;=ROMAIC
 ;;^UTILITY(U,$J,.85,12,1,8,0)
 ;;=MODERN GREEK (1453-)
 ;;^UTILITY(U,$J,.85,12,1,9,0)
 ;;=GREEK, MODERN (1453-)
 ;;^UTILITY(U,$J,.85,13,0)
 ;;=ACOLI^^ACH
 ;;^UTILITY(U,$J,.85,14,0)
 ;;=ADANGME^^ADA
 ;;^UTILITY(U,$J,.85,15,0)
 ;;=ADYGHE^^ADY
 ;;^UTILITY(U,$J,.85,15,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,15,1,1,0)
 ;;=ADYGEI
 ;;^UTILITY(U,$J,.85,16,0)
 ;;=AFAR^AA^AAR
 ;;^UTILITY(U,$J,.85,16,1,0)
 ;;=^.8501^4^4
 ;;^UTILITY(U,$J,.85,16,1,1,0)
 ;;=QAFAR AF
 ;;^UTILITY(U,$J,.85,16,1,2,0)
 ;;='AFAR AF
 ;;^UTILITY(U,$J,.85,16,1,3,0)
 ;;=ADAL
 ;;^UTILITY(U,$J,.85,16,1,4,0)
 ;;=AFARAF
 ;;^UTILITY(U,$J,.85,17,0)
 ;;=AFRIHILI^^AFH
 ;;^UTILITY(U,$J,.85,18,0)
 ;;=HEBREW^HE^HEB
 ;;^UTILITY(U,$J,.85,18,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,18,1,1,0)
 ;;=IVRIT
 ;;^UTILITY(U,$J,.85,18,1,2,0)
 ;;=MODERN HEBREW (1881-)
 ;;^UTILITY(U,$J,.85,18,1,3,0)
 ;;=HEBREW, MODERN (1881-)
 ;;^UTILITY(U,$J,.85,19,0)
 ;;=AFRIKAANS^AF^AFR
 ;;^UTILITY(U,$J,.85,20,0)
 ;;=AINU^^AIN
 ;;^UTILITY(U,$J,.85,21,0)
 ;;=AKAN^AK^AKA
 ;;^UTILITY(U,$J,.85,22,0)
 ;;=AKKADIAN^^AKK
 ;;^UTILITY(U,$J,.85,23,0)
 ;;=ALBANIAN^SQ^SQI^^ALB
 ;;^UTILITY(U,$J,.85,23,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,23,1,1,0)
 ;;=SHQIP
 ;;^UTILITY(U,$J,.85,23,1,2,0)
 ;;=GJUHA SHQIPE
 ;;^UTILITY(U,$J,.85,24,0)
 ;;=ALEUT^^ALE
 ;;^UTILITY(U,$J,.85,25,0)
 ;;=ALTAI, SOUTHERN^^ALT
 ;;^UTILITY(U,$J,.85,25,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,25,1,1,0)
 ;;=SOUTHERN ALTAI
 ;;^UTILITY(U,$J,.85,26,0)
 ;;=AMHARIC^AM^AMH
 ;;^UTILITY(U,$J,.85,26,1,0)
 ;;=^.8501^4^4
 ;;^UTILITY(U,$J,.85,26,1,1,0)
 ;;=ABYSSINIAN
 ;;^UTILITY(U,$J,.85,26,1,2,0)
 ;;=AMARIGNA
 ;;^UTILITY(U,$J,.85,26,1,3,0)
 ;;=AMARINYA
 ;;^UTILITY(U,$J,.85,26,1,4,0)
 ;;=ETHIOPIAN
 ;;^UTILITY(U,$J,.85,27,0)
 ;;=ANCIENT EGYPTIAN^^EGY
 ;;^UTILITY(U,$J,.85,27,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,27,1,1,0)
 ;;=EGYPTIAN, ANCIENT
 ;;^UTILITY(U,$J,.85,28,0)
 ;;=ANCIENT GREEK^^GRC
 ;;^UTILITY(U,$J,.85,28,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,28,1,1,0)
 ;;=GREEK, ANCIENT (TO 1453)
 ;;^UTILITY(U,$J,.85,29,0)
 ;;=ANGIKA^^ANP
 ;;^UTILITY(U,$J,.85,30,0)
 ;;=ARAGONESE^AN^ARG
 ;;^UTILITY(U,$J,.85,30,1,0)
 ;;=^.8501^6^6
 ;;^UTILITY(U,$J,.85,30,1,1,0)
 ;;=ALTOARAGONES
 ;;^UTILITY(U,$J,.85,30,1,2,0)
 ;;=ARAGOIERAZ
 ;;^UTILITY(U,$J,.85,30,1,3,0)
 ;;=ARAGONES
 ;;^UTILITY(U,$J,.85,30,1,4,0)
 ;;=FABLA ARAGONESA
 ;;^UTILITY(U,$J,.85,30,1,5,0)
 ;;=HIGH ARAGONESE
 ;;^UTILITY(U,$J,.85,30,1,6,0)
 ;;=PATUES
 ;;^UTILITY(U,$J,.85,31,0)
 ;;=ARAPAHO^^ARP
 ;;^UTILITY(U,$J,.85,32,0)
 ;;=ARAWAK^^ARW
 ;;^UTILITY(U,$J,.85,33,0)
 ;;=ARMENIAN^HY^HYE^^ARM
 ;;^UTILITY(U,$J,.85,33,1,0)
 ;;=^.8501^7^7
 ;;^UTILITY(U,$J,.85,33,1,1,0)
 ;;=HAYEREN
 ;;^UTILITY(U,$J,.85,33,1,2,0)
 ;;=ARMJANSKI YAZYK
 ;;^UTILITY(U,$J,.85,33,1,3,0)
 ;;=ENA
 ;;^UTILITY(U,$J,.85,33,1,4,0)
 ;;=ERMENI DILI
 ;;^UTILITY(U,$J,.85,33,1,5,0)
 ;;=ERMENICE
 ;;^UTILITY(U,$J,.85,33,1,6,0)
 ;;=HAIEREN
 ;;^UTILITY(U,$J,.85,33,1,7,0)
 ;;=SOMKHURI
 ;;^UTILITY(U,$J,.85,34,0)
 ;;=AROMANIAN^^RUP
 ;;^UTILITY(U,$J,.85,34,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,34,1,1,0)
 ;;=ARUMANIAN
 ;;^UTILITY(U,$J,.85,34,1,2,0)
 ;;=MACEDO-ROMANIAN
 ;;^UTILITY(U,$J,.85,35,0)
 ;;=ASSAMESE^AS^ASM
 ;;^UTILITY(U,$J,.85,35,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,35,1,1,0)
 ;;=ASAMBE
 ;;^UTILITY(U,$J,.85,35,1,2,0)
 ;;=ASAMI
 ;;^UTILITY(U,$J,.85,35,1,3,0)
 ;;=ASAMIYA
 ;;^UTILITY(U,$J,.85,36,0)
 ;;=ASTURIAN^^AST
 ;;^UTILITY(U,$J,.85,36,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,36,1,1,0)
 ;;=BABLE
 ;;^UTILITY(U,$J,.85,36,1,2,0)
 ;;=LEONESE
 ;;^UTILITY(U,$J,.85,36,1,3,0)
 ;;=ASTURLEONESE
 ;;^UTILITY(U,$J,.85,37,0)
 ;;=AVARIC^AV^AVA
 ;;^UTILITY(U,$J,.85,38,0)
 ;;=AVESTAN^AE^AVE
 ;;^UTILITY(U,$J,.85,39,0)
 ;;=AWADHI^^AWA
 ;;^UTILITY(U,$J,.85,40,0)
 ;;=AYMARA^AY^AYM
 ;;^UTILITY(U,$J,.85,41,0)
 ;;=AZERBAIJANI^AZ^AZE
 ;;^UTILITY(U,$J,.85,42,0)
 ;;=BALINESE^^BAN
 ;;^UTILITY(U,$J,.85,43,0)
 ;;=BALUCHI^^BAL
 ;;^UTILITY(U,$J,.85,44,0)
 ;;=BAMBARA^BM^BAM
 ;;^UTILITY(U,$J,.85,45,0)
 ;;=BASA^^BAS
 ;;^UTILITY(U,$J,.85,46,0)
 ;;=BASHKIR^BA^BAK
 ;;^UTILITY(U,$J,.85,47,0)
 ;;=BASQUE^EU^EUS^^BAQ
 ;;^UTILITY(U,$J,.85,47,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,47,1,1,0)
 ;;=EUSKARA
 ;;^UTILITY(U,$J,.85,48,0)
 ;;=BEJA^^BEJ
 ;;^UTILITY(U,$J,.85,48,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,48,1,1,0)
 ;;=BEDAWIYET
 ;;^UTILITY(U,$J,.85,49,0)
 ;;=BELARUSIAN^BE^BEL
 ;;^UTILITY(U,$J,.85,50,0)
 ;;=BEMBA^^BEM
 ;;^UTILITY(U,$J,.85,51,0)
 ;;=BENGALI^BN^BEN
 ;;^UTILITY(U,$J,.85,52,0)
 ;;=BHOJPURI^^BHO
 ;;^UTILITY(U,$J,.85,53,0)
 ;;=BIKOL^^BIK
 ;;^UTILITY(U,$J,.85,54,0)
 ;;=BILIN^^BYN
 ;;^UTILITY(U,$J,.85,54,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,54,1,1,0)
 ;;=BLIN
 ;;^UTILITY(U,$J,.85,55,0)
 ;;=BINI^^BIN
 ;;^UTILITY(U,$J,.85,55,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,55,1,1,0)
 ;;=EDO
 ;;^UTILITY(U,$J,.85,56,0)
 ;;=BISLAMA^BI^BIS
 ;;^UTILITY(U,$J,.85,57,0)
 ;;=BLISSYMBOLS^^ZBL
 ;;^UTILITY(U,$J,.85,57,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,57,1,1,0)
 ;;=BLISSYMBOLICS
 ;;^UTILITY(U,$J,.85,57,1,2,0)
 ;;=BLISS
 ;;^UTILITY(U,$J,.85,58,0)
 ;;=BOSNIAN^BS^BOS
 ;;^UTILITY(U,$J,.85,59,0)
 ;;=BRAJ^^BRA
 ;;^UTILITY(U,$J,.85,60,0)
 ;;=BRETON^BR^BRE
 ;;^UTILITY(U,$J,.85,61,0)
 ;;=BUGINESE^^BUG
 ;;^UTILITY(U,$J,.85,62,0)
 ;;=BULGARIAN^BG^BUL
 ;;^UTILITY(U,$J,.85,63,0)
 ;;=BURIAT^^BUA
 ;;^UTILITY(U,$J,.85,64,0)
 ;;=BURMESE^MY^MYA^^BUR
 ;;^UTILITY(U,$J,.85,64,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,64,1,1,0)
 ;;=MYANMAR LANGUAGE
 ;;^UTILITY(U,$J,.85,65,0)
 ;;=CADDO^^CAD
 ;;^UTILITY(U,$J,.85,66,0)
 ;;=CATALAN^CA^CAT
 ;;^UTILITY(U,$J,.85,66,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,66,1,1,0)
 ;;=VALENCIAN
 ;;^UTILITY(U,$J,.85,67,0)
 ;;=CEBUANO^^CEB
 ;;^UTILITY(U,$J,.85,68,0)
 ;;=CHAGATAI^^CHG
 ;;^UTILITY(U,$J,.85,69,0)
 ;;=CHAMORRO^CH^CHA
 ;;^UTILITY(U,$J,.85,70,0)
 ;;=CHECHEN^CE^CHE
 ;;^UTILITY(U,$J,.85,71,0)
 ;;=CHEROKEE^^CHR
 ;;^UTILITY(U,$J,.85,72,0)
 ;;=CHEYENNE^^CHY
 ;;^UTILITY(U,$J,.85,73,0)
 ;;=CHIBCHA^^CHB
 ;;^UTILITY(U,$J,.85,74,0)
 ;;=CHICHEWA^NY^NYA
 ;;^UTILITY(U,$J,.85,74,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,74,1,1,0)
 ;;=CHEWA
 ;;^UTILITY(U,$J,.85,74,1,2,0)
 ;;=NYANJA
 ;;^UTILITY(U,$J,.85,75,0)
 ;;=CHINESE^ZH^ZHO^^CHI
 ;;^UTILITY(U,$J,.85,76,0)
 ;;=CHINOOK JARGON^^CHN
 ;;^UTILITY(U,$J,.85,77,0)
 ;;=CHIPEWYAN^^CHP
 ;;^UTILITY(U,$J,.85,77,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,77,1,1,0)
 ;;=DENE SULINE
 ;;^UTILITY(U,$J,.85,78,0)
 ;;=CHOCTAW^^CHO
 ;;^UTILITY(U,$J,.85,79,0)
 ;;=CHUUKESE^^CHK
 ;;^UTILITY(U,$J,.85,80,0)
 ;;=CHUVASH^CV^CHV
 ;;^UTILITY(U,$J,.85,81,0)
 ;;=CLASSICAL NEWARI^^NWC
 ;;^UTILITY(U,$J,.85,81,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,81,1,1,0)
 ;;=OLD NEWARI
 ;;^UTILITY(U,$J,.85,81,1,2,0)
 ;;=CLASSICAL NEPAL BHASA
 ;;^UTILITY(U,$J,.85,82,0)
 ;;=CLASSICAL SYRIAC^^SYC
 ;;^UTILITY(U,$J,.85,83,0)
 ;;=COPTIC^^COP
 ;;^UTILITY(U,$J,.85,84,0)
 ;;=CORNISH^KW^COR
 ;;^UTILITY(U,$J,.85,85,0)
 ;;=CORSICAN^CO^COS
 ;;^UTILITY(U,$J,.85,86,0)
 ;;=CREE^CR^CRE
 ;;^UTILITY(U,$J,.85,87,0)
 ;;=CREEK^^MUS
 ;;^UTILITY(U,$J,.85,88,0)
 ;;=CREOLES AND PIDGINS^^CRP
 ;;^UTILITY(U,$J,.85,89,0)
 ;;=CREOLES AND PIDGINS, ENGLISH-BASED^^CPE
 ;;^UTILITY(U,$J,.85,90,0)
 ;;=CREOLES AND PIDGINS, FRENCH-BASED^^CPF
 ;;^UTILITY(U,$J,.85,91,0)
 ;;=CREOLES AND PIDGINS, PORTUGUESE-BASED^^CPP
 ;;^UTILITY(U,$J,.85,92,0)
 ;;=CRIMEAN TATAR^^CRH
 ;;^UTILITY(U,$J,.85,92,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,92,1,1,0)
 ;;=CRIMEAN TURKISH
 ;;^UTILITY(U,$J,.85,93,0)
 ;;=CROATIAN^HR^HRV
 ;;^UTILITY(U,$J,.85,94,0)
 ;;=CZECH^CS^CES^^CZE
 ;;^UTILITY(U,$J,.85,95,0)
 ;;=DAKOTA^^DAK
 ;;^UTILITY(U,$J,.85,96,0)
 ;;=DANISH^DA^DAN
 ;;^UTILITY(U,$J,.85,97,0)
 ;;=DARGWA^^DAR
 ;;^UTILITY(U,$J,.85,98,0)
 ;;=DELAWARE^^DEL
 ;;^UTILITY(U,$J,.85,99,0)
 ;;=DINKA^^DIN
 ;;^UTILITY(U,$J,.85,100,0)
 ;;=DIVEHI^DV^DIV
 ;;^UTILITY(U,$J,.85,100,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,100,1,1,0)
 ;;=DHIVEHI
 ;;^UTILITY(U,$J,.85,100,1,2,0)
 ;;=MALDIVIAN
 ;;^UTILITY(U,$J,.85,101,0)
 ;;=DOGRI^^DOI
 ;;^UTILITY(U,$J,.85,102,0)
 ;;=DOGRIB^^DGR
 ;;^UTILITY(U,$J,.85,103,0)
 ;;=DUALA^^DUA
 ;;^UTILITY(U,$J,.85,104,0)
 ;;=DUTCH^NL^NLD^^DUT
 ;;^UTILITY(U,$J,.85,104,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,104,1,1,0)
 ;;=FLEMISH
 ;;^UTILITY(U,$J,.85,105,0)
 ;;=DYULA^^DYU
 ;;^UTILITY(U,$J,.85,106,0)
 ;;=DZONGKHA^DZ^DZO
 ;;^UTILITY(U,$J,.85,107,0)
 ;;=EFIK^^EFI
 ;;^UTILITY(U,$J,.85,108,0)
 ;;=EKAJUK^^EKA
 ;;^UTILITY(U,$J,.85,109,0)
 ;;=ELAMITE^^ELX
 ;;^UTILITY(U,$J,.85,110,0)
 ;;=ERZYA^^MYV
 ;;^UTILITY(U,$J,.85,111,0)
 ;;=ESPERANTO^EO^EPO
 ;;^UTILITY(U,$J,.85,112,0)
 ;;=ESTONIAN^ET^EST
 ;;^UTILITY(U,$J,.85,113,0)
 ;;=EWE^EE^EWE
 ;;^UTILITY(U,$J,.85,114,0)
 ;;=EWONDO^^EWO
 ;;^UTILITY(U,$J,.85,115,0)
 ;;=FANG^^FAN
 ;;^UTILITY(U,$J,.85,116,0)
 ;;=FANTI^^FAT
 ;;^UTILITY(U,$J,.85,117,0)
 ;;=FAROESE^FO^FAO
 ;;^UTILITY(U,$J,.85,118,0)
 ;;=FIJIAN^FJ^FIJ
 ;;^UTILITY(U,$J,.85,119,0)
 ;;=FILIPINO^^FIL
 ;;^UTILITY(U,$J,.85,119,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,119,1,1,0)
 ;;=PILIPINO
 ;;^UTILITY(U,$J,.85,120,0)
 ;;=FON^^FON
 ;;^UTILITY(U,$J,.85,121,0)
 ;;=FRISIAN, EASTERN^^FRS
 ;;^UTILITY(U,$J,.85,121,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,121,1,1,0)
 ;;=EASTERN FRISIAN
 ;;^UTILITY(U,$J,.85,122,0)
 ;;=FRISIAN, NORTHERN^^FRR
 ;;^UTILITY(U,$J,.85,122,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,122,1,1,0)
 ;;=NORTHERN FRISIAN
 ;;^UTILITY(U,$J,.85,123,0)
 ;;=FRISIAN, WEST^FY^FRY

DMLAI005
DMLAI005 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,.85,123,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,123,1,1,0)
 ;;=WEST FRISIAN
 ;;^UTILITY(U,$J,.85,123,1,2,0)
 ;;=WESTERN FRISIAN
 ;;^UTILITY(U,$J,.85,124,0)
 ;;=FRIULIAN^^FUR
 ;;^UTILITY(U,$J,.85,125,0)
 ;;=FULA^FF^FUL
 ;;^UTILITY(U,$J,.85,125,1,0)
 ;;=^.8501^4^4
 ;;^UTILITY(U,$J,.85,125,1,1,0)
 ;;=FULANI
 ;;^UTILITY(U,$J,.85,125,1,2,0)
 ;;=FULAH
 ;;^UTILITY(U,$J,.85,125,1,3,0)
 ;;=PULAAR
 ;;^UTILITY(U,$J,.85,125,1,4,0)
 ;;=PULAR
 ;;^UTILITY(U,$J,.85,126,0)
 ;;=GA^^GAA
 ;;^UTILITY(U,$J,.85,127,0)
 ;;=GAELIC^GD^GLA
 ;;^UTILITY(U,$J,.85,127,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,127,1,1,0)
 ;;=SCOTS GAELIC
 ;;^UTILITY(U,$J,.85,127,1,2,0)
 ;;=SCOTTISH GAELIC
 ;;^UTILITY(U,$J,.85,128,0)
 ;;=GALIBI CARIB^^CAR
 ;;^UTILITY(U,$J,.85,129,0)
 ;;=GALICIAN^GL^GLG
 ;;^UTILITY(U,$J,.85,130,0)
 ;;=GANDA^LG^LUG
 ;;^UTILITY(U,$J,.85,131,0)
 ;;=GAYO^^GAY
 ;;^UTILITY(U,$J,.85,132,0)
 ;;=GBAYA^^GBA
 ;;^UTILITY(U,$J,.85,133,0)
 ;;=GEEZ^^GEZ
 ;;^UTILITY(U,$J,.85,134,0)
 ;;=GEORGIAN^KA^KAT^^GEO
 ;;^UTILITY(U,$J,.85,135,0)
 ;;=GILBERTESE^^GIL
 ;;^UTILITY(U,$J,.85,136,0)
 ;;=GONDI^^GON
 ;;^UTILITY(U,$J,.85,137,0)
 ;;=GORONTALO^^GOR
 ;;^UTILITY(U,$J,.85,138,0)
 ;;=GOTHIC^^GOT
 ;;^UTILITY(U,$J,.85,139,0)
 ;;=GREBO^^GRB
 ;;^UTILITY(U,$J,.85,140,0)
 ;;=GUARANI^GN^GRN
 ;;^UTILITY(U,$J,.85,141,0)
 ;;=GUJARATI^GU^GUJ
 ;;^UTILITY(U,$J,.85,142,0)
 ;;=GWICH'IN^^GWI
 ;;^UTILITY(U,$J,.85,143,0)
 ;;=HAIDA^^HAI
 ;;^UTILITY(U,$J,.85,144,0)
 ;;=HAITIAN CREOLE^HT^HAT
 ;;^UTILITY(U,$J,.85,145,0)
 ;;=HAUSA^HA^HAU
 ;;^UTILITY(U,$J,.85,146,0)
 ;;=HAWAIIAN^^HAW
 ;;^UTILITY(U,$J,.85,147,0)
 ;;=HERERO^HZ^HER
 ;;^UTILITY(U,$J,.85,148,0)
 ;;=HILIGAYNON^^HIL
 ;;^UTILITY(U,$J,.85,149,0)
 ;;=HINDI^HI^HIN
 ;;^UTILITY(U,$J,.85,150,0)
 ;;=HIRI MOTU^HO^HMO
 ;;^UTILITY(U,$J,.85,151,0)
 ;;=HITTITE^^HIT
 ;;^UTILITY(U,$J,.85,152,0)
 ;;=HMONG^^HMN
 ;;^UTILITY(U,$J,.85,152,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,152,1,1,0)
 ;;=MONG
 ;;^UTILITY(U,$J,.85,153,0)
 ;;=HUNGARIAN^HU^HUN
 ;;^UTILITY(U,$J,.85,154,0)
 ;;=HUPA^^HUP
 ;;^UTILITY(U,$J,.85,155,0)
 ;;=IBAN^^IBA
 ;;^UTILITY(U,$J,.85,156,0)
 ;;=ICELANDIC^IS^ISL^^ICE
 ;;^UTILITY(U,$J,.85,157,0)
 ;;=IDO^IO^IDO
 ;;^UTILITY(U,$J,.85,158,0)
 ;;=IGBO^IG^IBO
 ;;^UTILITY(U,$J,.85,159,0)
 ;;=ILOKO^^ILO
 ;;^UTILITY(U,$J,.85,160,0)
 ;;=INARI SAMI^^SMN
 ;;^UTILITY(U,$J,.85,161,0)
 ;;=INDONESIAN^ID^IND
 ;;^UTILITY(U,$J,.85,162,0)
 ;;=INGUSH^^INH
 ;;^UTILITY(U,$J,.85,163,0)
 ;;=INTERLINGUA^IA^INA
 ;;^UTILITY(U,$J,.85,164,0)
 ;;=INTERLINGUE^IE^ILE
 ;;^UTILITY(U,$J,.85,164,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,164,1,1,0)
 ;;=OCCIDENTAL
 ;;^UTILITY(U,$J,.85,165,0)
 ;;=INUKTITUT^IU^IKU
 ;;^UTILITY(U,$J,.85,166,0)
 ;;=INUPIAQ^IK^IPK
 ;;^UTILITY(U,$J,.85,167,0)
 ;;=IRISH^GA^GLE
 ;;^UTILITY(U,$J,.85,168,0)
 ;;=JAPANESE^JA^JPN
 ;;^UTILITY(U,$J,.85,169,0)
 ;;=JAVANESE^JV^JAV
 ;;^UTILITY(U,$J,.85,170,0)
 ;;=JUDEO-ARABIC^^JRB
 ;;^UTILITY(U,$J,.85,171,0)
 ;;=JUDEO-PERSIAN^^JPR
 ;;^UTILITY(U,$J,.85,172,0)
 ;;=KABARDIAN^^KBD
 ;;^UTILITY(U,$J,.85,173,0)
 ;;=KABYLE^^KAB
 ;;^UTILITY(U,$J,.85,174,0)
 ;;=KACHIN^^KAC
 ;;^UTILITY(U,$J,.85,174,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,174,1,1,0)
 ;;=JINGPHO
 ;;^UTILITY(U,$J,.85,175,0)
 ;;=KALAALLISUT^KL^KAL
 ;;^UTILITY(U,$J,.85,175,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,175,1,1,0)
 ;;=GREENLANDIC
 ;;^UTILITY(U,$J,.85,176,0)
 ;;=KALMYK^^XAL
 ;;^UTILITY(U,$J,.85,176,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,176,1,1,0)
 ;;=OIRAT
 ;;^UTILITY(U,$J,.85,177,0)
 ;;=KAMBA^^KAM
 ;;^UTILITY(U,$J,.85,178,0)
 ;;=KANNADA^KN^KAN
 ;;^UTILITY(U,$J,.85,179,0)
 ;;=KANURI^KR^KAU
 ;;^UTILITY(U,$J,.85,180,0)
 ;;=KARA-KALPAK^^KAA
 ;;^UTILITY(U,$J,.85,181,0)
 ;;=KARACHAY-BALKAR^^KRC
 ;;^UTILITY(U,$J,.85,182,0)
 ;;=KARELIAN^^KRL
 ;;^UTILITY(U,$J,.85,183,0)
 ;;=KASHMIRI^KS^KAS
 ;;^UTILITY(U,$J,.85,184,0)
 ;;=KASHUBIAN^^CSB
 ;;^UTILITY(U,$J,.85,185,0)
 ;;=KAWI^^KAW
 ;;^UTILITY(U,$J,.85,186,0)
 ;;=KAZAKH^KK^KAZ
 ;;^UTILITY(U,$J,.85,187,0)
 ;;=KHASI^^KHA
 ;;^UTILITY(U,$J,.85,188,0)
 ;;=KHMER^KM^KHM
 ;;^UTILITY(U,$J,.85,188,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,188,1,1,0)
 ;;=CENTRAL KHMER
 ;;^UTILITY(U,$J,.85,189,0)
 ;;=KHOTANESE^^KHO
 ;;^UTILITY(U,$J,.85,189,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,189,1,1,0)
 ;;=SAKAN
 ;;^UTILITY(U,$J,.85,190,0)
 ;;=KIKUYU^KI^KIK
 ;;^UTILITY(U,$J,.85,190,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,190,1,1,0)
 ;;=GIKUYU
 ;;^UTILITY(U,$J,.85,191,0)
 ;;=KIMBUNDU^^KMB
 ;;^UTILITY(U,$J,.85,192,0)
 ;;=KINYARWANDA^RW^KIN
 ;;^UTILITY(U,$J,.85,193,0)
 ;;=KIRGHIZ^KY^KIR
 ;;^UTILITY(U,$J,.85,193,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,193,1,1,0)
 ;;=KYRGYZ
 ;;^UTILITY(U,$J,.85,194,0)
 ;;=KLINGON^^TLH
 ;;^UTILITY(U,$J,.85,194,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,194,1,1,0)
 ;;=TLHINGAN-HOL
 ;;^UTILITY(U,$J,.85,195,0)
 ;;=KOMI^KV^KOM
 ;;^UTILITY(U,$J,.85,196,0)
 ;;=KONGO^KG^KON
 ;;^UTILITY(U,$J,.85,197,0)
 ;;=KONKANI^^KOK
 ;;^UTILITY(U,$J,.85,198,0)
 ;;=KOREAN^KO^KOR
 ;;^UTILITY(U,$J,.85,199,0)
 ;;=KOSRAEAN^^KOS
 ;;^UTILITY(U,$J,.85,200,0)
 ;;=KPELLE^^KPE
 ;;^UTILITY(U,$J,.85,201,0)
 ;;=KUANYAMA^KJ^KUA
 ;;^UTILITY(U,$J,.85,201,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,201,1,1,0)
 ;;=KWANYAMA
 ;;^UTILITY(U,$J,.85,202,0)
 ;;=KUMYK^^KUM
 ;;^UTILITY(U,$J,.85,203,0)
 ;;=KURDISH^KU^KUR
 ;;^UTILITY(U,$J,.85,204,0)
 ;;=KURUKH^^KRU
 ;;^UTILITY(U,$J,.85,205,0)
 ;;=KUTENAI^^KUT
 ;;^UTILITY(U,$J,.85,206,0)
 ;;=LADINO^^LAD
 ;;^UTILITY(U,$J,.85,207,0)
 ;;=LAHNDA^^LAH
 ;;^UTILITY(U,$J,.85,208,0)
 ;;=LAMBA^^LAM
 ;;^UTILITY(U,$J,.85,209,0)
 ;;=LANGUAGES, AFRO-ASIATIC^^AFA
 ;;^UTILITY(U,$J,.85,210,0)
 ;;=LANGUAGES, ALACALUFAN^^AQA
 ;;^UTILITY(U,$J,.85,211,0)
 ;;=LANGUAGES, ALGIC^^AQL
 ;;^UTILITY(U,$J,.85,212,0)
 ;;=LANGUAGES, ALGONQUIAN^^ALG
 ;;^UTILITY(U,$J,.85,213,0)
 ;;=LANGUAGES, ALTAIC^^TUT
 ;;^UTILITY(U,$J,.85,214,0)
 ;;=LANGUAGES, APACHE^^APA
 ;;^UTILITY(U,$J,.85,215,0)
 ;;=LANGUAGES, ARAUAN^^AUF
 ;;^UTILITY(U,$J,.85,216,0)
 ;;=LANGUAGES, ARAWAKAN^^AWD
 ;;^UTILITY(U,$J,.85,217,0)
 ;;=LANGUAGES, ARMENIAN^^HYX
 ;;^UTILITY(U,$J,.85,218,0)
 ;;=LANGUAGES, ARTIFICIAL^^ART
 ;;^UTILITY(U,$J,.85,219,0)
 ;;=LANGUAGES, ATHAPASCAN^^ATH
 ;;^UTILITY(U,$J,.85,220,0)
 ;;=LANGUAGES, ATLANTIC-CONGO^^ALV
 ;;^UTILITY(U,$J,.85,221,0)
 ;;=LANGUAGES, AUSTRALIAN^^AUS
 ;;^UTILITY(U,$J,.85,222,0)
 ;;=LANGUAGES, AUSTRO-ASIATIC^^AAV
 ;;^UTILITY(U,$J,.85,223,0)
 ;;=LANGUAGES, AUSTRONESIAN^^MAP
 ;;^UTILITY(U,$J,.85,224,0)
 ;;=LANGUAGES, BALTIC^^BAT
 ;;^UTILITY(U,$J,.85,225,0)
 ;;=LANGUAGES, BAMILEKE^^BAI
 ;;^UTILITY(U,$J,.85,226,0)
 ;;=LANGUAGES, BANDA^^BAD
 ;;^UTILITY(U,$J,.85,227,0)
 ;;=LANGUAGES, BANTU^^BNT
 ;;^UTILITY(U,$J,.85,228,0)
 ;;=LANGUAGES, BASQUE^^EUQ
 ;;^UTILITY(U,$J,.85,229,0)
 ;;=LANGUAGES, BATAK^^BTK
 ;;^UTILITY(U,$J,.85,230,0)
 ;;=LANGUAGES, BERBER^^BER
 ;;^UTILITY(U,$J,.85,231,0)
 ;;=LANGUAGES, BIHARI^BH^BIH
 ;;^UTILITY(U,$J,.85,232,0)
 ;;=LANGUAGES, CADDOAN^^CDD
 ;;^UTILITY(U,$J,.85,233,0)
 ;;=LANGUAGES, CAUCASIAN^^CAU
 ;;^UTILITY(U,$J,.85,234,0)
 ;;=LANGUAGES, CELTIC^^CEL
 ;;^UTILITY(U,$J,.85,235,0)
 ;;=LANGUAGES, CENTRAL AMERICAN INDIAN^^CAI
 ;;^UTILITY(U,$J,.85,236,0)
 ;;=LANGUAGES, CENTRAL MALAYO-POLYNESIAN^^PLF
 ;;^UTILITY(U,$J,.85,237,0)
 ;;=LANGUAGES, CENTRAL SUDANIC^^CSU
 ;;^UTILITY(U,$J,.85,238,0)
 ;;=LANGUAGES, CHADIC^^CDC
 ;;^UTILITY(U,$J,.85,239,0)
 ;;=LANGUAGES, CHAMIC^^CMC
 ;;^UTILITY(U,$J,.85,240,0)
 ;;=LANGUAGES, CHIBCHAN^^CBA
 ;;^UTILITY(U,$J,.85,241,0)
 ;;=LANGUAGES, CHINESE^^ZHX
 ;;^UTILITY(U,$J,.85,242,0)
 ;;=LANGUAGES, CUSHITIC^^CUS
 ;;^UTILITY(U,$J,.85,243,0)
 ;;=LANGUAGES, DRAVIDIAN^^DRA
 ;;^UTILITY(U,$J,.85,244,0)
 ;;=LANGUAGES, EAST GERMANIC^^GME
 ;;^UTILITY(U,$J,.85,245,0)
 ;;=LANGUAGES, EAST SLAVIC^^ZLE
 ;;^UTILITY(U,$J,.85,246,0)
 ;;=LANGUAGES, EASTERN MALAYO-POLYNESIAN^^PQE
 ;;^UTILITY(U,$J,.85,247,0)
 ;;=LANGUAGES, EASTERN SUDANIC^^SDV
 ;;^UTILITY(U,$J,.85,248,0)
 ;;=LANGUAGES, EGYPTIAN^^EGX
 ;;^UTILITY(U,$J,.85,249,0)
 ;;=LANGUAGES, ESKIMO-ALEUT^^ESX
 ;;^UTILITY(U,$J,.85,250,0)
 ;;=LANGUAGES, FINNO-UGRIAN^^FIU
 ;;^UTILITY(U,$J,.85,251,0)
 ;;=LANGUAGES, FORMOSAN^^FOX
 ;;^UTILITY(U,$J,.85,252,0)
 ;;=LANGUAGES, GERMANIC^^GEM
 ;;^UTILITY(U,$J,.85,253,0)
 ;;=LANGUAGES, GREEK^^GRK
 ;;^UTILITY(U,$J,.85,254,0)
 ;;=LANGUAGES, HIMACHALI^^HIM
 ;;^UTILITY(U,$J,.85,255,0)
 ;;=LANGUAGES, HMONG-MIEN^^HMX
 ;;^UTILITY(U,$J,.85,256,0)
 ;;=LANGUAGES, HOKAN^^HOK
 ;;^UTILITY(U,$J,.85,257,0)
 ;;=LANGUAGES, IJO^^IJO
 ;;^UTILITY(U,$J,.85,258,0)
 ;;=LANGUAGES, INDIC^^INC
 ;;^UTILITY(U,$J,.85,259,0)
 ;;=LANGUAGES, INDO-EUROPEAN^^INE
 ;;^UTILITY(U,$J,.85,260,0)
 ;;=LANGUAGES, INDO-IRANIAN^^IIR
 ;;^UTILITY(U,$J,.85,261,0)
 ;;=LANGUAGES, IRANIAN^^IRA
 ;;^UTILITY(U,$J,.85,262,0)
 ;;=LANGUAGES, IROQUOIAN^^IRO
 ;;^UTILITY(U,$J,.85,263,0)
 ;;=LANGUAGES, ITALIC^^ITC
 ;;^UTILITY(U,$J,.85,264,0)
 ;;=LANGUAGES, JAPANESE^^JPX
 ;;^UTILITY(U,$J,.85,265,0)
 ;;=LANGUAGES, KAREN^^KAR
 ;;^UTILITY(U,$J,.85,266,0)
 ;;=LANGUAGES, KHOISAN^^KHI
 ;;^UTILITY(U,$J,.85,267,0)
 ;;=LANGUAGES, KORDOFANIAN^^KDO
 ;;^UTILITY(U,$J,.85,268,0)
 ;;=LANGUAGES, KRU^^KRO
 ;;^UTILITY(U,$J,.85,269,0)
 ;;=LANGUAGES, LAND DAYAK^^DAY
 ;;^UTILITY(U,$J,.85,270,0)
 ;;=LANGUAGES, MALAYO-POLYNESIAN^^POZ
 ;;^UTILITY(U,$J,.85,271,0)
 ;;=LANGUAGES, MANDE^^DMN
 ;;^UTILITY(U,$J,.85,272,0)
 ;;=LANGUAGES, MANOBO^^MNO
 ;;^UTILITY(U,$J,.85,273,0)
 ;;=LANGUAGES, MAYAN^^MYN
 ;;^UTILITY(U,$J,.85,274,0)
 ;;=LANGUAGES, MON-KHMER^^MKH
 ;;^UTILITY(U,$J,.85,275,0)
 ;;=LANGUAGES, MONGOLIAN^^XGN
 ;;^UTILITY(U,$J,.85,276,0)
 ;;=LANGUAGES, MULTIPLE^^MUL
 ;;^UTILITY(U,$J,.85,277,0)
 ;;=LANGUAGES, MUNDA^^MUN
 ;;^UTILITY(U,$J,.85,278,0)
 ;;=LANGUAGES, NA-DENE^^XND
 ;;^UTILITY(U,$J,.85,279,0)
 ;;=LANGUAGES, NAHUATL^^NAH
 ;;^UTILITY(U,$J,.85,280,0)
 ;;=LANGUAGES, NIGER-KORDOFANIAN^^NIC
 ;;^UTILITY(U,$J,.85,281,0)
 ;;=LANGUAGES, NILO-SAHARAN^^SSA
 ;;^UTILITY(U,$J,.85,282,0)
 ;;=LANGUAGES, NORTH AMERICAN INDIAN^^NAI
 ;;^UTILITY(U,$J,.85,283,0)
 ;;=LANGUAGES, NORTH CAUCASIAN^^CCN
 ;;^UTILITY(U,$J,.85,284,0)
 ;;=LANGUAGES, NORTH GERMANIC^^GMQ
 ;;^UTILITY(U,$J,.85,285,0)
 ;;=LANGUAGES, NUBIAN^^NUB
 ;;^UTILITY(U,$J,.85,286,0)
 ;;=LANGUAGES, OMOTIC^^OMV
 ;;^UTILITY(U,$J,.85,287,0)
 ;;=LANGUAGES, OTO-MANGUEAN^^OMQ
 ;;^UTILITY(U,$J,.85,288,0)
 ;;=LANGUAGES, OTOMIAN^^OTO
 ;;^UTILITY(U,$J,.85,289,0)
 ;;=LANGUAGES, PAPUAN^^PAA
 ;;^UTILITY(U,$J,.85,290,0)
 ;;=LANGUAGES, PHILIPPINE^^PHI
 ;;^UTILITY(U,$J,.85,291,0)
 ;;=LANGUAGES, PRAKRIT^^PRA
 ;;^UTILITY(U,$J,.85,292,0)
 ;;=LANGUAGES, QUECHUAN^^QWE
 ;;^UTILITY(U,$J,.85,293,0)
 ;;=LANGUAGES, ROMANCE^^ROA
 ;;^UTILITY(U,$J,.85,294,0)
 ;;=LANGUAGES, SALISHAN^^SAL
 ;;^UTILITY(U,$J,.85,295,0)
 ;;=LANGUAGES, SAMI^^SMI
 ;;^UTILITY(U,$J,.85,296,0)
 ;;=LANGUAGES, SAMOYEDIC^^SYD
 ;;^UTILITY(U,$J,.85,297,0)
 ;;=LANGUAGES, SEMITIC^^SEM
 ;;^UTILITY(U,$J,.85,298,0)
 ;;=LANGUAGES, SIGN^^SGN
 ;;^UTILITY(U,$J,.85,298,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,298,1,1,0)
 ;;=SIGN LANGUAGES
 ;;^UTILITY(U,$J,.85,299,0)
 ;;=LANGUAGES, SINO-TIBETAN^^SIT
 ;;^UTILITY(U,$J,.85,300,0)
 ;;=LANGUAGES, SIOUAN^^SIO
 ;;^UTILITY(U,$J,.85,301,0)
 ;;=LANGUAGES, SLAVIC^^SLA
 ;;^UTILITY(U,$J,.85,302,0)
 ;;=LANGUAGES, SONGHAI^^SON
 ;;^UTILITY(U,$J,.85,303,0)
 ;;=LANGUAGES, SORBIAN^^WEN
 ;;^UTILITY(U,$J,.85,304,0)
 ;;=LANGUAGES, SOUTH AMERICAN INDIAN^^SAI
 ;;^UTILITY(U,$J,.85,305,0)
 ;;=LANGUAGES, SOUTH CAUCASIAN^^CCS
 ;;^UTILITY(U,$J,.85,306,0)
 ;;=LANGUAGES, SOUTH SLAVIC^^ZLS
 ;;^UTILITY(U,$J,.85,307,0)
 ;;=LANGUAGES, TAI^^TAI
 ;;^UTILITY(U,$J,.85,308,0)
 ;;=LANGUAGES, TIBETO-BURMAN^^TBQ
 ;;^UTILITY(U,$J,.85,309,0)
 ;;=LANGUAGES, TRANS-NEW GUINEA^^NGF
 ;;^UTILITY(U,$J,.85,310,0)
 ;;=LANGUAGES, TUNGUS^^TUW
 ;;^UTILITY(U,$J,.85,311,0)
 ;;=LANGUAGES, TUPI^^TUP
 ;;^UTILITY(U,$J,.85,312,0)
 ;;=LANGUAGES, TURKIC^^TRK
 ;;^UTILITY(U,$J,.85,313,0)
 ;;=LANGUAGES, UNCODED^^MIS
 ;;^UTILITY(U,$J,.85,314,0)
 ;;=LANGUAGES, URALIC^^URJ
 ;;^UTILITY(U,$J,.85,315,0)
 ;;=LANGUAGES, UTO-AZTECAN^^AZC
 ;;^UTILITY(U,$J,.85,316,0)
 ;;=LANGUAGES, WAKASHAN^^WAK
 ;;^UTILITY(U,$J,.85,317,0)
 ;;=LANGUAGES, WEST GERMANIC^^GMW
 ;;^UTILITY(U,$J,.85,318,0)
 ;;=LANGUAGES, WEST SLAVIC^^ZLW
 ;;^UTILITY(U,$J,.85,319,0)
 ;;=LANGUAGES, WESTERN MALAYO-POLYNESIAN^^PQW
 ;;^UTILITY(U,$J,.85,320,0)
 ;;=LANGUAGES, YUPIK^^YPK
 ;;^UTILITY(U,$J,.85,321,0)
 ;;=LANGUAGES, ZANDE^^ZND
 ;;^UTILITY(U,$J,.85,322,0)
 ;;=LAO^LO^LAO
 ;;^UTILITY(U,$J,.85,323,0)
 ;;=LATIN^LA^LAT
 ;;^UTILITY(U,$J,.85,324,0)
 ;;=LATVIAN^LV^LAV
 ;;^UTILITY(U,$J,.85,325,0)
 ;;=LEZGHIAN^^LEZ
 ;;^UTILITY(U,$J,.85,326,0)
 ;;=LIMBURGAN^LI^LIM
 ;;^UTILITY(U,$J,.85,326,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,326,1,1,0)
 ;;=LIMBURGISH
 ;;^UTILITY(U,$J,.85,326,1,2,0)
 ;;=LIMBURGER
 ;;^UTILITY(U,$J,.85,327,0)
 ;;=LINGALA^LN^LIN
 ;;^UTILITY(U,$J,.85,328,0)
 ;;=LITHUANIAN^LT^LIT
 ;;^UTILITY(U,$J,.85,329,0)
 ;;=LOJBAN^^JBO
 ;;^UTILITY(U,$J,.85,330,0)
 ;;=LOW GERMAN^^NDS
 ;;^UTILITY(U,$J,.85,330,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,330,1,1,0)
 ;;=LOW SAXON
 ;;^UTILITY(U,$J,.85,330,1,2,0)
 ;;=GERMAN, LOW
 ;;^UTILITY(U,$J,.85,330,1,3,0)
 ;;=SAXON, LOW
 ;;^UTILITY(U,$J,.85,331,0)
 ;;=LOZI^^LOZ
 ;;^UTILITY(U,$J,.85,332,0)
 ;;=LUBA-KATANGA^LU^LUB
 ;;^UTILITY(U,$J,.85,333,0)
 ;;=LUBA-LULUA^^LUA
 ;;^UTILITY(U,$J,.85,334,0)
 ;;=LUISENO^^LUI
 ;;^UTILITY(U,$J,.85,335,0)
 ;;=LUNDA^^LUN
 ;;^UTILITY(U,$J,.85,336,0)
 ;;=LUO (KENYA AND TANZANIYA)^^LUO
 ;;^UTILITY(U,$J,.85,337,0)
 ;;=LUSHAI^^LUS
 ;;^UTILITY(U,$J,.85,338,0)
 ;;=LUXEMBOURGISH^LB^LTZ
 ;;^UTILITY(U,$J,.85,338,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,338,1,1,0)
 ;;=LETZEBURGESCH
 ;;^UTILITY(U,$J,.85,339,0)
 ;;=MACEDONIAN^MK^MKD^^MAC
 ;;^UTILITY(U,$J,.85,340,0)
 ;;=MADURESE^^MAD
 ;;^UTILITY(U,$J,.85,341,0)
 ;;=MAGAHI^^MAG
 ;;^UTILITY(U,$J,.85,342,0)
 ;;=MAITHILI^^MAI
 ;;^UTILITY(U,$J,.85,343,0)
 ;;=MAKASAR^^MAK
 ;;^UTILITY(U,$J,.85,344,0)
 ;;=MALAGASY^MG^MLG
 ;;^UTILITY(U,$J,.85,345,0)
 ;;=MALAY^MS^MSA^^MAY
 ;;^UTILITY(U,$J,.85,346,0)
 ;;=MALAYALAM^ML^MAL
 ;;^UTILITY(U,$J,.85,347,0)
 ;;=MALTESE^MT^MLT
 ;;^UTILITY(U,$J,.85,348,0)
 ;;=MANCHU^^MNC
 ;;^UTILITY(U,$J,.85,349,0)
 ;;=MANDAR^^MDR
 ;;^UTILITY(U,$J,.85,350,0)
 ;;=MANDINGO^^MAN
 ;;^UTILITY(U,$J,.85,351,0)
 ;;=MANIPURI^^MNI
 ;;^UTILITY(U,$J,.85,352,0)
 ;;=MANX^GV^GLV

DMLAI006
DMLAI006 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,.85,353,0)
 ;;=MAORI^MI^MRI^^MAO
 ;;^UTILITY(U,$J,.85,354,0)
 ;;=MAPUDUNGUN^^ARN
 ;;^UTILITY(U,$J,.85,354,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,354,1,1,0)
 ;;=MAPUCHE
 ;;^UTILITY(U,$J,.85,355,0)
 ;;=MARATHI^MR^MAR
 ;;^UTILITY(U,$J,.85,356,0)
 ;;=MARI^^CHM
 ;;^UTILITY(U,$J,.85,357,0)
 ;;=MARSHALLESE^MH^MAH
 ;;^UTILITY(U,$J,.85,358,0)
 ;;=MARWARI^^MWR
 ;;^UTILITY(U,$J,.85,359,0)
 ;;=MASAI^^MAS
 ;;^UTILITY(U,$J,.85,360,0)
 ;;=MENDE^^MEN
 ;;^UTILITY(U,$J,.85,361,0)
 ;;=MI'KMAQ^^MIC
 ;;^UTILITY(U,$J,.85,361,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,361,1,1,0)
 ;;=MICMAC
 ;;^UTILITY(U,$J,.85,362,0)
 ;;=MIDDLE DUTCH^^DUM
 ;;^UTILITY(U,$J,.85,362,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,362,1,1,0)
 ;;=DUTCH, MIDDLE (CA.1050-1350)
 ;;^UTILITY(U,$J,.85,363,0)
 ;;=MIDDLE ENGLISH^^ENM
 ;;^UTILITY(U,$J,.85,363,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,363,1,1,0)
 ;;=MIDDLE ENGLISH (1100-1500)
 ;;^UTILITY(U,$J,.85,363,1,2,0)
 ;;=ENGLISH, MIDDLE (1100-1500)
 ;;^UTILITY(U,$J,.85,364,0)
 ;;=MIDDLE FRENCH^^FRM
 ;;^UTILITY(U,$J,.85,364,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,364,1,1,0)
 ;;=MIDDLE FRENCH (CA. 1400-1600)
 ;;^UTILITY(U,$J,.85,364,1,2,0)
 ;;=FRENCH, MIDDLE (CA. 1400-1600)
 ;;^UTILITY(U,$J,.85,365,0)
 ;;=MIDDLE HIGH GERMAN^^GMH
 ;;^UTILITY(U,$J,.85,365,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,365,1,1,0)
 ;;=MIDDLE HIGH GERMAN (CA. 1050-1500)
 ;;^UTILITY(U,$J,.85,365,1,2,0)
 ;;=GERMAN, MIDDLE HIGH (CA. 1050-1500)
 ;;^UTILITY(U,$J,.85,366,0)
 ;;=MIDDLE IRISH^^MGA
 ;;^UTILITY(U,$J,.85,366,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,366,1,1,0)
 ;;=MIDDLE IRISH (900-1200)
 ;;^UTILITY(U,$J,.85,366,1,2,0)
 ;;=IRISH, MIDDLE (900-1200)
 ;;^UTILITY(U,$J,.85,367,0)
 ;;=MINANGKABAU^^MIN
 ;;^UTILITY(U,$J,.85,368,0)
 ;;=MIRANDESE^^MWL
 ;;^UTILITY(U,$J,.85,369,0)
 ;;=MOHAWK^^MOH
 ;;^UTILITY(U,$J,.85,370,0)
 ;;=MOKSHA^^MDF
 ;;^UTILITY(U,$J,.85,371,0)
 ;;=MONGO^^LOL
 ;;^UTILITY(U,$J,.85,372,0)
 ;;=MONGOLIAN^MN^MON
 ;;^UTILITY(U,$J,.85,373,0)
 ;;=MOSSI^^MOS
 ;;^UTILITY(U,$J,.85,374,0)
 ;;=N'KO^^NQO
 ;;^UTILITY(U,$J,.85,375,0)
 ;;=NAURU^NA^NAU
 ;;^UTILITY(U,$J,.85,376,0)
 ;;=NAVAJO^NV^NAV
 ;;^UTILITY(U,$J,.85,376,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,376,1,1,0)
 ;;=NAVAHO
 ;;^UTILITY(U,$J,.85,377,0)
 ;;=NDEBELE, NORTH^ND^NDE
 ;;^UTILITY(U,$J,.85,377,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,377,1,1,0)
 ;;=NORTH NDEBELE
 ;;^UTILITY(U,$J,.85,378,0)
 ;;=NDEBELE, SOUTH^NR^NBL
 ;;^UTILITY(U,$J,.85,378,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,378,1,1,0)
 ;;=SOUTH NDEBELE
 ;;^UTILITY(U,$J,.85,379,0)
 ;;=NDONGA^NG^NDO
 ;;^UTILITY(U,$J,.85,380,0)
 ;;=NEAPOLITAN^^NAP
 ;;^UTILITY(U,$J,.85,381,0)
 ;;=NEPAL BHASA^^NEW
 ;;^UTILITY(U,$J,.85,381,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,381,1,1,0)
 ;;=NEWARI
 ;;^UTILITY(U,$J,.85,382,0)
 ;;=NEPALI^NE^NEP
 ;;^UTILITY(U,$J,.85,383,0)
 ;;=NIAS^^NIA
 ;;^UTILITY(U,$J,.85,384,0)
 ;;=NIUEAN^^NIU
 ;;^UTILITY(U,$J,.85,385,0)
 ;;=NO LINGUISTIC CONTENT^^ZXX
 ;;^UTILITY(U,$J,.85,385,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,385,1,1,0)
 ;;=NOT APPLICABLE
 ;;^UTILITY(U,$J,.85,386,0)
 ;;=NOGAI^^NOG
 ;;^UTILITY(U,$J,.85,387,0)
 ;;=NORWEGIAN^NO^NOR
 ;;^UTILITY(U,$J,.85,388,0)
 ;;=NORWEGIAN BOKMAL^NB^NOB
 ;;^UTILITY(U,$J,.85,388,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,388,1,1,0)
 ;;=BOKMAL, NORWEGIAN
 ;;^UTILITY(U,$J,.85,389,0)
 ;;=NORWEGIAN NYNORSK^NN^NNO
 ;;^UTILITY(U,$J,.85,389,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,389,1,1,0)
 ;;=NYNORSK, NORWEGIAN
 ;;^UTILITY(U,$J,.85,390,0)
 ;;=NUOSU^II^III
 ;;^UTILITY(U,$J,.85,390,1,0)
 ;;=^.8501^5^5
 ;;^UTILITY(U,$J,.85,390,1,1,0)
 ;;=BLACK YI
 ;;^UTILITY(U,$J,.85,390,1,2,0)
 ;;=LIANGSHAN YI
 ;;^UTILITY(U,$J,.85,390,1,3,0)
 ;;=NORTHERN YI
 ;;^UTILITY(U,$J,.85,390,1,4,0)
 ;;=NOSU YI
 ;;^UTILITY(U,$J,.85,390,1,5,0)
 ;;=SICHUAN YI
 ;;^UTILITY(U,$J,.85,391,0)
 ;;=NYAMWEZI^^NYM
 ;;^UTILITY(U,$J,.85,392,0)
 ;;=NYANKOLE^^NYN
 ;;^UTILITY(U,$J,.85,393,0)
 ;;=NYORO^^NYO
 ;;^UTILITY(U,$J,.85,394,0)
 ;;=NZIMA^^NZI
 ;;^UTILITY(U,$J,.85,395,0)
 ;;=OCCITAN^OC^OCI
 ;;^UTILITY(U,$J,.85,395,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,395,1,1,0)
 ;;=OCCITAN (POST 1500)
 ;;^UTILITY(U,$J,.85,396,0)
 ;;=OFFICIAL ARAMAIC^^ARC
 ;;^UTILITY(U,$J,.85,396,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,396,1,1,0)
 ;;=OFFICIAL ARAMAIC (700-300 BCE)
 ;;^UTILITY(U,$J,.85,396,1,2,0)
 ;;=ARAMAIC, OFFICIAL (700-300 BCE)
 ;;^UTILITY(U,$J,.85,397,0)
 ;;=OJIBWE^OJ^OJI
 ;;^UTILITY(U,$J,.85,397,1,0)
 ;;=^.8501^4^4
 ;;^UTILITY(U,$J,.85,397,1,1,0)
 ;;=OJIBWA
 ;;^UTILITY(U,$J,.85,397,1,2,0)
 ;;=OJIBWAY
 ;;^UTILITY(U,$J,.85,397,1,3,0)
 ;;=CHIPPEWA
 ;;^UTILITY(U,$J,.85,397,1,4,0)
 ;;=ANISHINAABEMOWIN
 ;;^UTILITY(U,$J,.85,398,0)
 ;;=OLD ENGLISH^^ANG
 ;;^UTILITY(U,$J,.85,398,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,398,1,1,0)
 ;;=OLD ENGLISH (CA. 450-1100)
 ;;^UTILITY(U,$J,.85,398,1,2,0)
 ;;=ENGLISH, OLD (CA. 450-1100)
 ;;^UTILITY(U,$J,.85,399,0)
 ;;=OLD FRENCH^^FRO
 ;;^UTILITY(U,$J,.85,399,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,399,1,1,0)
 ;;=OLD FRENCH (842-CA. 1400)
 ;;^UTILITY(U,$J,.85,399,1,2,0)
 ;;=FRENCH, OLD (842-CA. 1400)
 ;;^UTILITY(U,$J,.85,400,0)
 ;;=OLD HIGH GERMAN^^GOH
 ;;^UTILITY(U,$J,.85,400,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,400,1,1,0)
 ;;=OLD HIGH GERMAN (CA. 750-1050)
 ;;^UTILITY(U,$J,.85,400,1,2,0)
 ;;=GERMAN, OLD HIGH (CA. 750-1050)
 ;;^UTILITY(U,$J,.85,401,0)
 ;;=OLD IRISH^^SGA
 ;;^UTILITY(U,$J,.85,401,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,401,1,1,0)
 ;;=OLD IRISH (TO 900)
 ;;^UTILITY(U,$J,.85,401,1,2,0)
 ;;=IRISH, OLD (TO 900)
 ;;^UTILITY(U,$J,.85,402,0)
 ;;=OLD NORSE^^NON
 ;;^UTILITY(U,$J,.85,402,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,402,1,1,0)
 ;;=NORSE, OLD
 ;;^UTILITY(U,$J,.85,403,0)
 ;;=OLD PERSIAN^^PEO^^PEO
 ;;^UTILITY(U,$J,.85,403,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,403,1,1,0)
 ;;=OLD PERSIAN (CA. 600-400 B.C.)
 ;;^UTILITY(U,$J,.85,403,1,2,0)
 ;;=PERSIAN, OLD (CA. 600-400 B.C.)
 ;;^UTILITY(U,$J,.85,404,0)
 ;;=OLD PROVENCAL^^PRO^^PRO
 ;;^UTILITY(U,$J,.85,404,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,404,1,1,0)
 ;;=OLD PROVENCAL (TO 1500)
 ;;^UTILITY(U,$J,.85,404,1,2,0)
 ;;=PROVENCAL, OLD (TO 1500)
 ;;^UTILITY(U,$J,.85,405,0)
 ;;=ORIYA^OR^ORI
 ;;^UTILITY(U,$J,.85,406,0)
 ;;=OROMO^OM^ORM
 ;;^UTILITY(U,$J,.85,407,0)
 ;;=OSAGE^^OSA
 ;;^UTILITY(U,$J,.85,408,0)
 ;;=OSSETIAN^OS^OSS
 ;;^UTILITY(U,$J,.85,408,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,408,1,1,0)
 ;;=OSSETIC
 ;;^UTILITY(U,$J,.85,409,0)
 ;;=OTTOMAN TURKISH^^OTA^^OTA
 ;;^UTILITY(U,$J,.85,409,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,409,1,1,0)
 ;;=OTTOMAN TURKISH (1500-1928)
 ;;^UTILITY(U,$J,.85,409,1,2,0)
 ;;=TURKISH, OTTOMAN (1500-1928)
 ;;^UTILITY(U,$J,.85,410,0)
 ;;=PAHLAVI^^PAL
 ;;^UTILITY(U,$J,.85,411,0)
 ;;=PALAUAN^^PAU
 ;;^UTILITY(U,$J,.85,412,0)
 ;;=PALI^PI^PLI
 ;;^UTILITY(U,$J,.85,413,0)
 ;;=PAMPANGA^^PAM
 ;;^UTILITY(U,$J,.85,413,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,413,1,1,0)
 ;;=KAPAMPANGAN
 ;;^UTILITY(U,$J,.85,414,0)
 ;;=PANGASINAN^^PAG
 ;;^UTILITY(U,$J,.85,415,0)
 ;;=PAPIAMENTO^^PAP
 ;;^UTILITY(U,$J,.85,416,0)
 ;;=PASHTO^PS^PUS
 ;;^UTILITY(U,$J,.85,416,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,416,1,1,0)
 ;;=PUSHTO
 ;;^UTILITY(U,$J,.85,417,0)
 ;;=PEDI^^NSO
 ;;^UTILITY(U,$J,.85,417,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,417,1,1,0)
 ;;=SEPEDI
 ;;^UTILITY(U,$J,.85,417,1,2,0)
 ;;=NORTHERN SOTHO
 ;;^UTILITY(U,$J,.85,417,1,3,0)
 ;;=SOTHO, NORTHERN
 ;;^UTILITY(U,$J,.85,418,0)
 ;;=PERSIAN^FA^FAS^^PER
 ;;^UTILITY(U,$J,.85,418,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,418,1,1,0)
 ;;=FARSI
 ;;^UTILITY(U,$J,.85,419,0)
 ;;=PHOENICIAN^^PHN
 ;;^UTILITY(U,$J,.85,420,0)
 ;;=POHNPEIAN^^PON
 ;;^UTILITY(U,$J,.85,421,0)
 ;;=POLISH^PL^POL
 ;;^UTILITY(U,$J,.85,422,0)
 ;;=PUNJABI^PA^PAN
 ;;^UTILITY(U,$J,.85,422,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,422,1,1,0)
 ;;=PANJABI
 ;;^UTILITY(U,$J,.85,423,0)
 ;;=QUECHUA^QU^QUE
 ;;^UTILITY(U,$J,.85,424,0)
 ;;=RAJASTHANI^^RAJ
 ;;^UTILITY(U,$J,.85,425,0)
 ;;=RAPANUI^^RAP
 ;;^UTILITY(U,$J,.85,426,0)
 ;;=RAROTONGAN^^RAR
 ;;^UTILITY(U,$J,.85,426,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,426,1,1,0)
 ;;=COOK ISLANDS MAORI
 ;;^UTILITY(U,$J,.85,428,0)
 ;;=ROMANIAN^RO^RON^^RUM
 ;;^UTILITY(U,$J,.85,428,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,428,1,1,0)
 ;;=MOLDAVIAN
 ;;^UTILITY(U,$J,.85,428,1,2,0)
 ;;=MOLDOVAN
 ;;^UTILITY(U,$J,.85,429,0)
 ;;=ROMANSH^RM^ROH
 ;;^UTILITY(U,$J,.85,430,0)
 ;;=ROMANY^^ROM
 ;;^UTILITY(U,$J,.85,431,0)
 ;;=RUNDI^RN^RUN
 ;;^UTILITY(U,$J,.85,431,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,431,1,1,0)
 ;;=KIRUNDI
 ;;^UTILITY(U,$J,.85,432,0)
 ;;=SAMARITAN ARAMAIC^^SAM
 ;;^UTILITY(U,$J,.85,433,0)
 ;;=SAMI, LULE^^SMJ
 ;;^UTILITY(U,$J,.85,433,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,433,1,1,0)
 ;;=LULE SAMI
 ;;^UTILITY(U,$J,.85,434,0)
 ;;=SAMI, NORTHERN^SE^SME
 ;;^UTILITY(U,$J,.85,434,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,434,1,1,0)
 ;;=NORTHERN SAMI
 ;;^UTILITY(U,$J,.85,435,0)
 ;;=SAMI, SKOLT^^SMS
 ;;^UTILITY(U,$J,.85,435,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,435,1,1,0)
 ;;=SKOLT SAMI
 ;;^UTILITY(U,$J,.85,436,0)
 ;;=SAMI, SOUTHERN^^SMA
 ;;^UTILITY(U,$J,.85,436,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,436,1,1,0)
 ;;=SOUTHERN SAMI
 ;;^UTILITY(U,$J,.85,437,0)
 ;;=SAMOAN^SM^SMO
 ;;^UTILITY(U,$J,.85,438,0)
 ;;=SANDAWE^^SAD
 ;;^UTILITY(U,$J,.85,439,0)
 ;;=SANGO^SG^SAG
 ;;^UTILITY(U,$J,.85,440,0)
 ;;=SANSKRIT^SA^SAN
 ;;^UTILITY(U,$J,.85,441,0)
 ;;=SANTALI^^SAT
 ;;^UTILITY(U,$J,.85,442,0)
 ;;=SARDINIAN^SC^SRD
 ;;^UTILITY(U,$J,.85,443,0)
 ;;=SASAK^^SAS
 ;;^UTILITY(U,$J,.85,444,0)
 ;;=SCOTS^^SCO
 ;;^UTILITY(U,$J,.85,445,0)
 ;;=SELKUP^^SEL
 ;;^UTILITY(U,$J,.85,446,0)
 ;;=SERBIAN^SR^SRP
 ;;^UTILITY(U,$J,.85,447,0)
 ;;=SERER^^SRR
 ;;^UTILITY(U,$J,.85,448,0)
 ;;=SHAN^^SHN
 ;;^UTILITY(U,$J,.85,449,0)
 ;;=SHONA^SN^SNA
 ;;^UTILITY(U,$J,.85,450,0)
 ;;=SICILIAN^^SCN
 ;;^UTILITY(U,$J,.85,451,0)
 ;;=SIDAMO^^SID
 ;;^UTILITY(U,$J,.85,452,0)
 ;;=SIKSIKA^^BLA
 ;;^UTILITY(U,$J,.85,453,0)
 ;;=SINDHI^SD^SND
 ;;^UTILITY(U,$J,.85,454,0)
 ;;=SINHALA^SI^SIN
 ;;^UTILITY(U,$J,.85,454,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,454,1,1,0)
 ;;=SINHALESE
 ;;^UTILITY(U,$J,.85,455,0)
 ;;=SLAVE (ATHAPASKAN)^^DEN
 ;;^UTILITY(U,$J,.85,455,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,455,1,1,0)
 ;;=SLAVEY
 ;;^UTILITY(U,$J,.85,456,0)
 ;;=SLAVONIC, CHURCH^CU^CHU
 ;;^UTILITY(U,$J,.85,456,1,0)
 ;;=^.8501^5^5
 ;;^UTILITY(U,$J,.85,456,1,1,0)
 ;;=CHURCH SLAVONIC
 ;;^UTILITY(U,$J,.85,456,1,2,0)
 ;;=CHURCH SLAVIC
 ;;^UTILITY(U,$J,.85,456,1,3,0)
 ;;=OLD CHURCH SLAVONIC
 ;;^UTILITY(U,$J,.85,456,1,4,0)
 ;;=OLD BULGARIAN
 ;;^UTILITY(U,$J,.85,456,1,5,0)
 ;;=OLD SLAVONIC
 ;;^UTILITY(U,$J,.85,457,0)
 ;;=SLOVAK^SK^SLK^^SLO
 ;;^UTILITY(U,$J,.85,458,0)
 ;;=SLOVENIAN^SL^SLV
 ;;^UTILITY(U,$J,.85,458,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,458,1,1,0)
 ;;=SLOVENE
 ;;^UTILITY(U,$J,.85,459,0)
 ;;=SOGDIAN^^SOG
 ;;^UTILITY(U,$J,.85,460,0)
 ;;=SOMALI^SO^SOM
 ;;^UTILITY(U,$J,.85,461,0)
 ;;=SONINKE^^SNK
 ;;^UTILITY(U,$J,.85,462,0)
 ;;=SORBIAN, LOWER^^DSB
 ;;^UTILITY(U,$J,.85,462,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,462,1,1,0)
 ;;=LOWER SORBIAN
 ;;^UTILITY(U,$J,.85,463,0)
 ;;=SORBIAN, UPPER^^HSB
 ;;^UTILITY(U,$J,.85,463,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,463,1,1,0)
 ;;=UPPER SORBIAN
 ;;^UTILITY(U,$J,.85,464,0)
 ;;=SOTHO, SOUTHERN^ST^SOT
 ;;^UTILITY(U,$J,.85,464,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,464,1,1,0)
 ;;=SOUTHERN SOTHO
 ;;^UTILITY(U,$J,.85,465,0)
 ;;=SRANAN TONGO^^SRN
 ;;^UTILITY(U,$J,.85,466,0)
 ;;=SUKUMA^^SUK
 ;;^UTILITY(U,$J,.85,467,0)
 ;;=SUMERIAN^^SUX
 ;;^UTILITY(U,$J,.85,468,0)
 ;;=SUNDANESE^SU^SUN
 ;;^UTILITY(U,$J,.85,469,0)
 ;;=SUSU^^SUS
 ;;^UTILITY(U,$J,.85,470,0)
 ;;=SWAHILI^SW^SWA
 ;;^UTILITY(U,$J,.85,471,0)
 ;;=SWATI^SS^SSW
 ;;^UTILITY(U,$J,.85,472,0)
 ;;=SWEDISH^SV^SWE
 ;;^UTILITY(U,$J,.85,473,0)
 ;;=SWISS GERMAN^^GSW
 ;;^UTILITY(U,$J,.85,473,1,0)
 ;;=^.8501^3^3
 ;;^UTILITY(U,$J,.85,473,1,1,0)
 ;;=GERMAN, SWISS
 ;;^UTILITY(U,$J,.85,473,1,2,0)
 ;;=ALEMANNIC
 ;;^UTILITY(U,$J,.85,473,1,3,0)
 ;;=ALSATIAN
 ;;^UTILITY(U,$J,.85,474,0)
 ;;=SYRIAC^^SYR
 ;;^UTILITY(U,$J,.85,475,0)
 ;;=TAGALOG^TL^TGL
 ;;^UTILITY(U,$J,.85,476,0)
 ;;=TAHITIAN^TY^TAH
 ;;^UTILITY(U,$J,.85,477,0)
 ;;=TAJIK^TG^TGK
 ;;^UTILITY(U,$J,.85,478,0)
 ;;=TAMASHEK^^TMH
 ;;^UTILITY(U,$J,.85,479,0)
 ;;=TAMIL^TA^TAM
 ;;^UTILITY(U,$J,.85,480,0)
 ;;=TATAR^TT^TAT
 ;;^UTILITY(U,$J,.85,481,0)
 ;;=TELUGU^TE^TEL
 ;;^UTILITY(U,$J,.85,482,0)
 ;;=TERENO^^TER
 ;;^UTILITY(U,$J,.85,483,0)
 ;;=TETUM^^TET
 ;;^UTILITY(U,$J,.85,484,0)
 ;;=THAI^TH^THA
 ;;^UTILITY(U,$J,.85,485,0)
 ;;=TIBETAN^BO^BOD^^TIB
 ;;^UTILITY(U,$J,.85,485,1,0)
 ;;=^.8501^2^2
 ;;^UTILITY(U,$J,.85,485,1,1,0)
 ;;=TIBETAN STANDARD
 ;;^UTILITY(U,$J,.85,485,1,2,0)
 ;;=TIBETAN, CENTRAL
 ;;^UTILITY(U,$J,.85,486,0)
 ;;=TIGRE^^TIG
 ;;^UTILITY(U,$J,.85,487,0)
 ;;=TIGRINYA^TI^TIR
 ;;^UTILITY(U,$J,.85,488,0)
 ;;=TIMNE^^TEM
 ;;^UTILITY(U,$J,.85,489,0)
 ;;=TIV^^TIV
 ;;^UTILITY(U,$J,.85,490,0)
 ;;=TLINGIT^^TLI
 ;;^UTILITY(U,$J,.85,491,0)
 ;;=TOK PISIN^^TPI
 ;;^UTILITY(U,$J,.85,492,0)
 ;;=TOKELAU^^TKL
 ;;^UTILITY(U,$J,.85,493,0)
 ;;=TONGA (NYASA)^^TOG
 ;;^UTILITY(U,$J,.85,494,0)
 ;;=TONGA (TONGA ISLANDS)^TO^TON
 ;;^UTILITY(U,$J,.85,494,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,494,1,1,0)
 ;;=TONGA ISLANDS
 ;;^UTILITY(U,$J,.85,495,0)
 ;;=TSIMSHIAN^^TSI
 ;;^UTILITY(U,$J,.85,496,0)
 ;;=TSONGA^TS^TSO
 ;;^UTILITY(U,$J,.85,497,0)
 ;;=TSWANA^TN^TSN
 ;;^UTILITY(U,$J,.85,498,0)
 ;;=TUMBUKA^^TUM
 ;;^UTILITY(U,$J,.85,499,0)
 ;;=TURKISH^TR^TUR
 ;;^UTILITY(U,$J,.85,500,0)
 ;;=TURKMEN^TK^TUK
 ;;^UTILITY(U,$J,.85,501,0)
 ;;=TUVALU^^TVL
 ;;^UTILITY(U,$J,.85,502,0)
 ;;=TUVINIAN^^TYV
 ;;^UTILITY(U,$J,.85,503,0)
 ;;=TWI^TW^TWI
 ;;^UTILITY(U,$J,.85,504,0)
 ;;=UDMURT^^UDM
 ;;^UTILITY(U,$J,.85,505,0)
 ;;=UGARITIC^^UGA
 ;;^UTILITY(U,$J,.85,506,0)
 ;;=UIGHUR^UG^UIG
 ;;^UTILITY(U,$J,.85,506,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,506,1,1,0)
 ;;=UYGHUR
 ;;^UTILITY(U,$J,.85,507,0)
 ;;=UKRAINIAN^UK^UKR
 ;;^UTILITY(U,$J,.85,508,0)
 ;;=UMBUNDU^^UMB
 ;;^UTILITY(U,$J,.85,509,0)
 ;;=UNDETERMINED^^UND
 ;;^UTILITY(U,$J,.85,510,0)
 ;;=URDU^UR^URD
 ;;^UTILITY(U,$J,.85,511,0)
 ;;=UZBEK^UZ^UZB
 ;;^UTILITY(U,$J,.85,512,0)
 ;;=VAI^^VAI

DMLAI007
DMLAI007 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(.85)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,.85,513,0)
 ;;=VENDA^VE^VEN
 ;;^UTILITY(U,$J,.85,514,0)
 ;;=VIETNAMESE^VI^VIE
 ;;^UTILITY(U,$J,.85,515,0)
 ;;=VOLAPUK^VO^VOL
 ;;^UTILITY(U,$J,.85,516,0)
 ;;=VOTIC^^VOT
 ;;^UTILITY(U,$J,.85,517,0)
 ;;=WALLOON^WA^WLN
 ;;^UTILITY(U,$J,.85,518,0)
 ;;=WARAY^^WAR
 ;;^UTILITY(U,$J,.85,519,0)
 ;;=WASHO^^WAS
 ;;^UTILITY(U,$J,.85,520,0)
 ;;=WELSH^CY^CYM^^WEL
 ;;^UTILITY(U,$J,.85,521,0)
 ;;=WOLAITTA^^WAL
 ;;^UTILITY(U,$J,.85,521,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,521,1,1,0)
 ;;=WOLAYTTA
 ;;^UTILITY(U,$J,.85,522,0)
 ;;=WOLOF^WO^WOL
 ;;^UTILITY(U,$J,.85,523,0)
 ;;=XHOSA^XH^XHO
 ;;^UTILITY(U,$J,.85,524,0)
 ;;=YAKUT^^SAH
 ;;^UTILITY(U,$J,.85,525,0)
 ;;=YAO^^YAO
 ;;^UTILITY(U,$J,.85,526,0)
 ;;=YAPESE^^YAP
 ;;^UTILITY(U,$J,.85,527,0)
 ;;=YIDDISH^YI^YID
 ;;^UTILITY(U,$J,.85,528,0)
 ;;=YORUBA^YO^YOR
 ;;^UTILITY(U,$J,.85,529,0)
 ;;=ZAPOTEC^^ZAP
 ;;^UTILITY(U,$J,.85,530,0)
 ;;=ZAZA^^ZZA
 ;;^UTILITY(U,$J,.85,530,1,0)
 ;;=^.8501^5^5
 ;;^UTILITY(U,$J,.85,530,1,1,0)
 ;;=DIMILI
 ;;^UTILITY(U,$J,.85,530,1,2,0)
 ;;=DIMLI
 ;;^UTILITY(U,$J,.85,530,1,3,0)
 ;;=KIRDKI
 ;;^UTILITY(U,$J,.85,530,1,4,0)
 ;;=KIRMANJKI
 ;;^UTILITY(U,$J,.85,530,1,5,0)
 ;;=ZAZAKI
 ;;^UTILITY(U,$J,.85,531,0)
 ;;=ZENAGA^^ZEN
 ;;^UTILITY(U,$J,.85,532,0)
 ;;=ZHUANG^ZA^ZHA
 ;;^UTILITY(U,$J,.85,532,1,0)
 ;;=^.8501^1^1
 ;;^UTILITY(U,$J,.85,532,1,1,0)
 ;;=CHUANG
 ;;^UTILITY(U,$J,.85,533,0)
 ;;=ZULU^ZU^ZUL
 ;;^UTILITY(U,$J,.85,534,0)
 ;;=ZUNI^^ZUN

DMLAI008
DMLAI008 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 I DSEC F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(.85,0,"AUDIT")
 ;;=
 ;;^DIC(.85,0,"DD")
 ;;=^
 ;;^DIC(.85,0,"DEL")
 ;;=^
 ;;^DIC(.85,0,"LAYGO")
 ;;=^
 ;;^DIC(.85,0,"RD")
 ;;=
 ;;^DIC(.85,0,"WR")
 ;;=^

DMLAI009
DMLAI009 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"SBF",.85,.85)
 ;;=
 ;;^UTILITY(U,$J,"SBF",.85,.8501)
 ;;=
 ;;^UTILITY(U,$J,"SBF",.85,.8502)
 ;;=

DMLAINI1
DMLAINI1 ; VEN/SMH - Init - I changed init to be silent ; 22-JAN-2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; LOADS AND INDEXES DD'S
 ;
 K DIF,DIK,D,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DFR,DTN,DIX,DZ D DT^DICRW S %=1,U="^",DSEC=1
 S NO=$P("I 0^I $D(@X)#2,X[U",U,%) I %<1 K DIFQ Q
ASK I %=1,$D(DIFQ(0)) S DSEC=1 ; W !,"SHALL I WRITE OVER FILE SECURITY CODES" S %=2 D YN^DICN S DSEC=%=1 I %<1 K DIFQ Q  VEN/SMH
 Q:'$D(DIFQ)  ; S %=2 W !!,"ARE YOU SURE EVERYTHING'S OK" D YN^DICN I %-1 K DIFQ Q  VEN/SMH
 I $D(DIFKEP) F DIDIU=0:0 S DIDIU=$O(DIFKEP(DIDIU)) Q:DIDIU'>0  S DIU=DIDIU,DIU(0)=DIFKEP(DIDIU) D EN^DIU2
 D DT^DICRW K ^UTILITY(U,$J),^UTILITY("DIK",$J) D WAIT^DICD
 S DN="^DMLAI" F R=1:1:9 D @(DN_$$B36(R)) W "."
 F  S D=$O(^UTILITY(U,$J,"SBF","")) Q:D'>0  K:'DIFQ(D) ^(D) S D=$O(^(D,"")) I D>0  K ^(D) D IX
KEYSNIX ; Keys and new style indexes installer ; new in FM V22.2
 N DIFRSA S DIFRSA=$NA(^UTILITY("KX",$J)) ; Tran global for Keys and Indexes
 N DIFRFILE S DIFRFILE=0 ; Loop through files
 F  S DIFRFILE=$O(@DIFRSA@("IX",DIFRFILE)) Q:'DIFRFILE  D
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . N DIFRD S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA) ; install New Style Indexes
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA) ; install keys
 K @DIFRSA ; kill off tran global
 ; VEN/SMH v22.2: Below I added a K D1 because it leaks from the call causing the key matching algo to fail.
DATA W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0
 I DIFQR(D) S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=DIFQR(D)'=2 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 K D1 Q:'$D(^(D0,0))  S Z=^(0) D I^DITR
 K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA
 ;
W S Y=$P($T(@X),";",2) W !,"NOTE: This package also contains "_Y_"S",! Q:'$D(DIFQ(0))
 S %=1 W ?6,"SHALL I WRITE OVER EXISTING "_Y_"S OF THE SAME NAME" D YN^DICN I '% W !?6,"Answer YES to replace the current "_Y_"S with the incoming ones." G W
 S:%=2 DIFQ(X)=0 K:%<0 DIFQ
 Q
 ;
OPT ;OPTION
RTN ;ROUTINE DOCUMENTATION NOTE
FUN ;FUNCTION
BUL ;BULLETIN
KEY ;SECURITY KEY
HEL ;HELP FRAME
DIP ;PRINT TEMPLATE
DIE ;INPUT TEMPLATE
DIB ;SORT TEMPLATE
DIS ;FORM
REM ;REMOTE PROCEDURE
 ;
SBF ;FILE AND SUB FILE NUMBERS
IX W "." S DIK="A" F %=0:0 S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," G IXALL^DIK
 Q
B36(X) Q $$N(X\(36*36)#36+1)_$$N(X\36#36+1)_$$N(X#36+1)
N(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

DMLAINI2
DMLAINI2 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J),DIC S DIDUZ=0 S:$D(DUZ)#2 DIDUZ=DUZ S DUZ=.5
 I $D(^DIC(9.2,0))#2,^(0)?1"HEL".E S (DIC,DLAYGO)=9.2,N="HEL",DIC(0)="LX" G ADD
 Q
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R'>0  S X=$P(^(R,0),U,1) W "." K DA D ^DIC I Y>0,'$D(DIFQ(N))!$P(Y,U,3) S ^UTILITY("DIFROM",$J,N,X)=+Y K ^DIC(9.2,+Y,1),^(2),^(3),^(10) S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y D %XY^%RCR
 S DIK=DIC
HELP S R=$O(^UTILITY("DIFROM",$J,N,R)) Q:R=""  W !,"'"_R_"' Help Frame filed." S DA=^(R)
 F X=0:0 S X=$O(^DIC(9.2,DA,2,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$P(I,U,2) S:Y]"" Y=$O(^DIC(9.2,"B",Y,0)) S ^(0)=$P(^DIC(9.2,DA,2,X,0),U,1)_U_$S(Y>0:Y,1:"")_U_$P(^(0),U,3,99)
 S I=0 F X=0:0 S X=$O(^DIC(9.2,DA,10,X)) Q:'X  I $D(^(X,0)) S Y=$P(^(0),U),Y=$S(Y]"":$O(^MAG("B",Y,0)),1:0) S:Y $P(^DIC(9.2,DA,10,X,0),U)=Y,I=I+1,%=X I 'Y K ^DIC(9.2,DA,10,X,0)
 I I S $P(^DIC(9.2,DA,10,0),U,3,4)=%_U_I
IX D IX1^DIK G HELP
 ;
U I $D(DIRUT) S DIFQ=1
 W ! Q
REP S DIR(0)="Y",DIR("A")="Shall I change the NAME of the file to "_DIF
 S DIR("??")="^D REP^DIFROMH1",DIR("B")="NO" D ^DIR G U:$D(DIRUT)
 I Y S DIE=1,DIFQ=0,DA=N,DR=".01////"_DIF D ^DIE Q
 S DIR("A")="Shall I replace your file with mine"
 S DIR("??")="^D AG^DIFROMH1" D ^DIR G U:$D(DIRUT)!'Y
 S DIU(0)="E",DIR("A")="Do you want to keep the Data"
 S DIR("??")="^D CHG^DIFROMH1" D ^DIR G U:$D(DIRUT)
 S:'Y DIU(0)=DIU(0)_"D"
 S DIR("A")="Do you want to keep the Templates"
 S DIR("??")="^D TEMP^DIFROMH1" D ^DIR G U:$D(DIRUT) S:'Y DIU(0)=DIU(0)_"T"
 S DIFQ(N)=1,DIFKEP(N)=DIU(0) W !?15," (",DIF,") " Q

DMLAINI3
DMLAINI3 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J) S DIC(0)="LX",(DIC,DLAYGO)=3.6,N="BUL" D ADD:$D(^XMB(3.6,0))
 S X=0 F R=0:0 S X=$O(^UTILITY("DIFROM",$J,N,X)) Q:X=""  W !,"'",X,"' BULLETIN FILED -- Remember to add mail groups for new bulletins."
 I $D(^DIC(9.4,0))#2,^(0)?1"PACK".E S N="PKG",(DIC,DLAYGO)=9.4 D ADD
 G NP:'$D(DA) S %=+$O(^DIC(9.4,DA,22,"B",DIFROM,0)) I $D(^DIC(9.4,DA,22,%,0)) S $P(^(0),U,3)=DT
 I $D(^DIC(9.4,DA,0))#2 S %=$P(^(0),U,4) I %]"" S %=$O(^DIC(9.2,"B",%,0)) S:%]"" $P(^DIC(9.4,DA,0),U,4)=%
OR I $D(^ORD(100.99))&$O(^UTILITY(U,$J,"OR","")) D EN^DMLAINI4
NP K DIC,^UTILITY("DIFROM",$J) S DIC(0)="LX" I $D(^DIC(19,0))#2,^(0)?1"OPTION".E S (DIC,DLAYGO)=19,N="OPT" D ADD,OP
 I $D(^DIC(19.1,0))#2,($P(^(0),U)?1"SECUR".E)!($P(^(0),U)="KEY") S (DIC,DLAYGO)=19.1,N="KEY" D ADD K ^UTILITY("DIFROM",$J)
 I $D(^DIC(9.8,0))#2,^(0)?1"ROUTINE^".E S (DIC,DLAYGO)=9.8,N="RTN" D ADD
 S DIC=.5,DLAYGO=0,N="FUN" D ADD
 I $P($G(^DIC(8994,0)),U)="REMOTE PROCEDURE" S (DIC,DLAYGO)=8994,N="REM" D ADD
 S DIC("S")="I $P(^(0),U,4)=DIFL" F N="DIPT","DIBT","DIE" S DIC=U_N_"(" D ADD
 K DIC("S") S N="DIST(.404,",DIC=U_N,DLAYGO=.404 D ADD
 S DIC("S")="I $P(^(0),U,8)=DIFL",N="DIST(.403,",DIC=U_N,DLAYGO=.403 D ADD
 K ^UTILITY(U,$J),DIC,DLAYGO F DIFR="DIE","DIPT" D DIEZ
 K ^UTILITY("DIFROM",$J) Q
DIEZ I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 E  S DISYS=^DD("OS")
 Q:'$D(^DD("OS",DISYS,"ZS"))
 S DIFR1=""
DZ1 S DIFR1=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1)) Q:DIFR1=""
 F DIFR2=0:0 S DIFR2=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  S Y=DIFR2 I $D(@(U_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD"),DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 G DZ1
 ;
OP S R=$O(^UTILITY("DIFROM",$J,N,R)) I R="" K ^UTILITY("DIFROM",$J) G Q
 W !,"'"_R_"' Option Filed" S DA=+^UTILITY("DIFROM",$J,N,R) G:$P(^(R),U,2,3)="XUCORE^"!($P(^(R),U,2,3)="XUCOMMAND^") OP
 I $D(^DIC(19,DA,220)) S %=$P(^(220),U) S:%]"" %=$O(^XMB(3.6,"B",%,0)) S $P(^DIC(19,DA,220),U)=%,%=$P(^(220),U,3) S:%]"" %=$O(^XMB(3.8,"B",%,0)) S $P(^DIC(19,DA,220),U,3)=%
 S %=$P(^DIC(19,DA,0),U,12) S:%]"" %=$O(^DIC(9.4,"B",%,0))
 S $P(^DIC(19,DA,0),U,12)=%,%=$P(^(0),U,7),(DZ,DIX)=0
 D:$D(^DIC(19,DA,10,"B")) KAD(DA) S:%]"" %=$O(^DIC(9.2,"B",%,0)) S $P(^DIC(19,DA,0),U,7)=%,%=$P(^(0),U,4),%="MOQXL"[% K ^(10,"B"),^("C")
 F X=0:0 S X=$O(^DIC(19,DA,10,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$S($D(^(U)):^(U),1:"") K ^DIC(19,DA,10,X) I Y]"",% S D=$O(^DIC(19,"B",Y,0)) I D S ^DIC(19,DA,10,X,0)=D_U_$P(I,U,2,9),DZ=DZ+1,DIX=X
 S:% ^DIC(19,DA,10,0)="^19.01PI^"_DIX_U_DZ D IX1^DIK G OP
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R=""  S X=$P(^(R,0),U),DIFL=$S(N="DIST(.403,":$P(^(0),U,8),N="DIST(.404,":$P(^(0),U,2),1:$P(^(0),U,4)) W "." K DA D ^DIC I Y>0,'$D(DIFQ($E(N,1,3)))!$P(Y,U,3) S Y=Y_U D A
Q Q
A I N="BUL" K % S %(0)=$G(@(DIC_"+Y,2,0)")) F %=0:0 S %=$O(@(DIC_"+Y,2,%)")) Q:'%  S %(%)=$G(^(%,0))
 K:N'="KEY"&(N'="OPT") @(DIC_"+Y)") S ^UTILITY("DIFROM",$J,N,X)=Y S:$E(N,1,2)="DI" ^(X,+Y)="" S:N="PKG" DIFROM(0)=+Y Q:$P(Y,U,2,3)="XUCORE^"!($P(Y,U,2,3)="XUCOMMAND^")
 I N="BUL",%(0)]"" S @(DIC_"+Y,2,0)")=%(0) F %=0:0 S %=$O(%(%)) Q:'%  S @(DIC_"+Y,2,%,0)")=%(%)
 I $E(N,1,2)="DI",('DIFL)!('$D(^DD(+DIFL))) D
 .W !,"**WARNING--"_$S(N="DIE":"INPUT",N="DIPT":"PRINT",N="DIBT":"SORT",1:"FORM or BLOCK")_$S(N'["DIST":" template ",1:" ")_$P(Y,U,2)_" has been installed,",!,"but associated file "_DIFL_" is not on your system!"
 .Q
 I N="OPT" S:$P(^DIC(19,+Y,0),U,6)]"" DIOPT=$P(^(0),U,6) I $O(^UTILITY(U,$J,N,R,1,0)) K ^DIC(19,+Y,1)
 I N="DIST(.403," D BLK
 S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y,DIK=DIC D %XY^%RCR
 D IX1^DIK:N'="OPT" I N="OPT",$D(DIOPT) S:$P(^DIC(19,DA,0),U,6)="" $P(^(0),U,6)=DIOPT K DIOPT
 I N="DIST(.403," D
 .N DIFRVAL S DIFRVAL=$$VAL^DIFROMSS(.403,DA)
 .I DIFRVAL W !,"Compiling form: ",$P(^DIST(.403,DA,0),U) D EN^DDSZ(DA) Q
 .W !,"ERROR: Form: ",$P(^DIST(.403,DA,0),U)," cannot be compiled"
 .Q
 Q
BLK F J=0:0 S J=$O(^UTILITY(U,$J,N,R,40,J)) Q:'J  I $D(^(J,0)) S %=$P(^(0),U,2) S:%]"" %=$O(^DIST(.404,"B",%,0)) S:% $P(^UTILITY(U,$J,N,R,40,J,0),U,2)=% D B1
 K A0,A1,A2,J,L Q
B1 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,40,L)) Q:'L  S A0=$G(^(L,0)),%=$P(A0,U) I %]"" S %=$O(^DIST(.404,"B",%,0)) I % S $P(A0,U)=%,^UTILITY(U,$J,N,R,40,J,"BLK",%,0)=A0 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,40,L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,"BLK",%,X)=^(X)
 .Q
 S A0=$G(^UTILITY(U,$J,N,R,40,J,40,0)) Q:A0=""  K ^UTILITY(U,$J,N,R,40,J,40) S (A1,A2)=0
 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L)) Q:'L  S ^UTILITY(U,$J,N,R,40,J,40,L,0)=^(L,0),A1=L,A2=A2+1 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,40,L,X)=^(X)
 .Q
 S $P(A0,U,3,4)=A1_U_A2,^UTILITY(U,$J,N,R,40,J,40,0)=A0 K ^UTILITY(U,$J,N,R,40,J,"BLK")
 Q
KAD(D0) N D1,X
 S X=0 F  S X=$O(^DIC(19,D0,10,"B",X)) Q:X'>0  S D1=0 F  S D1=$O(^DIC(19,D0,10,"B",X,D1)) Q:D1'>0  K ^DIC(19,"AD",X,D0,D1)
 Q

DMLAINI4
DMLAINI4 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
EN S DA(1)=1,DIK="^ORD(100.99,1,5," I $D(^ORD(100.99,1,5,DA)) D ^DIK
 S %X="^UTILITY(U,$J,""OR"","_$O(^UTILITY(U,$J,"OR",""))_",",%Y=DIK_DA_","
 S:'$D(^ORD(100.99,1,5,0)) ^(0)="^100.995P^^" S $P(^(0),U,3,4)=DA_U_($P(^(0),U,4)+1)
 D %XY^%RCR S $P(^ORD(100.99,1,5,DA,0),U)=DA,%=$P(^(0),U,4)
 I %]"" S %=$O(^ORD(100.98,"B",%,0)) I %>0 S $P(^ORD(100.99,1,5,DA,0),U,4)=%
 D OR
 S DA(1)=1 D IX1^DIK
 Q
OR S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,1,N)) Q:'N  S X=$P(^(N,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,0)=% S X=N,I=I+1,(R,J)=0,Y="" D OR1
 S:I $P(^ORD(100.99,1,5,DA,1,0),U,3,4)=X_U_I S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,5,N)) Q:'N  S X=$P(^(N,0),U,3) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% $P(^ORD(100.99,1,5,DA,5,N,0),U,3)=% S X=N,I=I+1
 S:I $P(^ORD(100.99,1,5,DA,5,0),U,3,4)=X_U_I K N,R,X,Y,I,J
 Q
OR1 N X F  S R=$O(^ORD(100.99,1,5,DA,1,N,1,R)) Q:'R  S X=$P(^(R,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,1,R,0)=% S Y=R,J=J+1
 S:J $P(^ORD(100.99,1,5,DA,1,N,1,0),U,3,4)=Y_U_J
 Q
ADDP N I,J,N,R,DA,DLAYGO,DO S %=""
 S DIC="^ORD(101,",DIC(0)="LX",DLAYGO=101 D FILE^DICN K DIC Q:Y=-1  S %=+Y Q

DMLAINI5
DMLAINI5 ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DIF",$J) S DIFRDIFI=1 F I=1:1:2 S ^UTILITY("DIF",$J,DIFRDIFI)=$T(IXF+I),DIFRDIFI=DIFRDIFI+1
 Q
IXF ;;
 ;;.85I;LANGUAGE;^DI(.85,;0;y;y;;n;;;y;o;n
 ;;

DMLAINIT
DMLAINIT ; ; 06-DEC-2012
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K DIF,DIFQ,DIFQR,DIFQN,DIK,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DIFROM,DFR,DTN,DIX,DZ,DIRUT,DTOUT,DUOUT
 S DIOVRD=1,U="^",DIFQ=0,DIFROM="22.2T0" W !,"This version (#22.2T0) of 'DMLAINIT' was created on 06-DEC-2012"
 W !?9,"(at FILEMAN.MUMPS.ORG, by VA FILEMAN 22.2T0)",!
 I $D(^DD("VERSION")),^("VERSION")'<22.2 G GO
 ;W !,"FIRST, I'LL FRESHEN UP YOUR VA FILEMAN...." D N^DINIT
 I ^DD("VERSION")<22.2 W !,"but I need version 22.2 of the VA FileMan!" G Q
GO ;
EN ; ENTER HERE TO BYPASS THE PRE-INIT PROGRAM
 S DIFQ=0 K DIRUT,DTOUT,DUOUT
 F DIFRIR=1:1:1 S DIFRRTN="^DMLAINI"_$E("5",DIFRIR) D @DIFRRTN
 W:1 !,"I AM GOING TO SET UP THE FOLLOWING FILES:" F I=1:2:2 S DIF(I)=^UTILITY("DIF",$J,I) D 1 G Q:DIFQ!$D(DIRUT) K DIF(I)
 S DIFROM="22.2T0" D PKG:'$D(DIFROM(0)),^DMLAINI1 G Q:'$D(DIFQ) S DIK(0)="AB"
 F DIF=1:2:2 S %=^UTILITY("DIF",$J,DIF),DIK=$P(%,";",5),N=$P(%,";",3),D=$P(%,";",4)_U_N D D K DIFQ(N)
 K DIFQR D ^DMLAINI2,^DMLAINI3
 L  S DUZ=DIDUZ W:1 !,$C(7),"OK, I'M DONE.",!,"NO"_$P("TE THAT FILE",U,DSEC)_" SECURITY-CODE PROTECTION HAS BEEN MADE"
 I DIFROM F DIF=1:2:2 S %=^UTILITY("DIF",$J,DIF),N=+$P(%,";",3) I N,$P(%,";",8)="y" S ^DD(N,0,"VR")=DIFROM
 I DIFROM(0)>0 F %="PRE","INI","INIT" S:$D(DIFROM(%)) $P(^DIC(9.4,DIFROM(0),%),U,2)=DIFROM(%)
 I $G(DIFQN) S $P(^(0),U,3,4)=$P(DIFQN,U,2)_U_($P(^DIC(0),U,4)+DIFQN) K DIFQN
 S:DIFROM(0)>0 ^DIC(9.4,DIFROM(0),"VERSION")=DIFROM G Q^DIFROM0
D S:$D(^DIC(+N,0))[0 ^(0)=D S X=$D(@(DIK_"0)")),^(0)=D_U_$S(X#2:$P(^(0),U,3,9),1:U)
 S DIFQR=DIFQR(+N) I ^DD("VERSION")>17.5,$D(^DD(+N,0,"DIK"))#2 S X=^("DIK"),Y=+N,DMAX=^DD("ROU") D EN^DIKZ
 I DIFQR D IXALL^DIK:$O(@(DIK_"0)")) W "."
 Q
R G REP^DMLAINI2
 ;
1 S N=+$P(DIF(I),";",3),DIF=$P(DIF(I),";",4),S=$P(DIF(I),";",5)
 W !!?3,N,?13,DIF,$P("  (Partial Definition)",U,$P(DIF(I),";",6)),$P("  (including data)",U,$P(DIF(I),";",13)="y") S Z=$S($D(^DIC(N,0))#2:^(0),1:"")
 I Z="" S DIFQ(N)=1,DIFQN=$G(DIFQN)+1_U_N G S
 I $L($P(Z,DIF)) W $C(7),!,"*BUT YOU ALREADY HAVE '",$P(Z,U),"' AS FILE #",N,"!" D R Q:DIFQ  G S:$D(DIFKEP(N)),1
 S DIFQ(N)=$P(DIF(I),";",7)'="n"
 I $L(Z) W $C(7),!,"Note:  You already have the '",$P(Z,U),"' File." S DIFQ(0)=1
 S %=$E(^UTILITY("DIF",$J,I+1),4,245) I %]"" X % S DIFQ(N)=$T W:'$T !,"Screen on this Data Dictionary did not pass--DD will not be installed!" G S
 I $L(Z),$P(DIF(I),";",10)="y" S DIR("A")="Shall I write over the existing Data Definition",DIR("??")="^D DD^DIFROMH1",DIR("B")="YES",DIR(0)="Y" D ^DIR S DIFQ(N)=Y
S S DIFQR(N)=0 Q:$P(DIF(I),";",13)'="y"!$D(DIRUT)
 I $P(DIF(I),";",15)="y",$O(@(S_"0)"))>0 S DIF=$P(DIF(I),";",14)="o",DIR("A")="Want my data "_$P("merged with^to overwrite",U,DIF+1)_" yours",DIR("??")="^D DTA^DIFROMH1",DIR(0)="Y" D ^DIR S DIFQR(N)=$S('Y:Y,1:Y+DIF) Q
 S %=$P(DIF(I),";",14)="o" W !,$C(7),"I will ",$P("MERGE^OVERWRITE",U,%+1)," your data with mine." S DIFQR(N)=%+1
 Q
Q W $C(7),!!,"NO UPDATING HAS OCCURRED!" G Q^DIFROM0
 ;
PKG S X=$P($T(IXF),";",3),DIC="^DIC(9.4,",DIC(0)="",DIC("S")="I $P(^(0),U,2)="""_$P(X,U,2)_"""",X=$P(X,U) D ^DIC S DIFROM(0)=+Y K DIC
 Q
 ;
IXF ;;;1

DMSQ
DMSQ ;SFISC/EZ-CALLS INTO SQLI CODE ;10/30/97  16:25
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
SETUP ;entry point to begin SQLI projection process
 ;gives interactive user a chance to cancel out before continuing
 ;requires programmer mode (DUZ(0)="@")
 I $D(ZTQUEUED) D RUN Q
 I $$WAIT^DMSQT1 D  Q
 . W !?5,"Another SQLI projection is already running right now."
 . W !?5,"Try later if you want to re-run the SQLI projection."
 S DIR(0)="Y",DIR("B")="NO"
 S DIR("A")="This process takes several hours.  Want to Continue"
 S DIR("?",1)="This will project FileMan data dictionary information into SQLI files."
 S DIR("?",2)="It may consume up to 30Mb of space in a full hospital account."
 S DIR("?",3)=" "
 S DIR("?",4)="It is safe to run on all systems, even if you don't have SQLI-to-SQL mapping."
 S DIR("?",5)="(Note: SQLI print options won't report anything if SQLI files are empty.)"
 S DIR("?",6)=" "
 S DIR("?",7)="To experiment, you can run this and then use the purge option afterwards."
 S DIR("?",8)="(It isn't necessary to run the purge option beforehand, by the way.)"
 S DIR("?",9)=" "
 S DIR("?",10)="If you do have SQLI-to-SQL mapping, be aware that this is step 2 of 3:"
 S DIR("?",11)=" "
 S DIR("?",12)="  (1) Populate the SQLI Key Word file - KW^DMSQD(SCR,ERR)"
 S DIR("?",13)="  (2) Run this utility - SETUP^DMSQ"
 S DIR("?",14)="  (3) Run your SQLI-to-SQL mapper (vendor product)"
 S DIR("?",15)=" "
 S DIR("?")="These 3 steps should be done in sequence, one right after the other."
 D ^DIR K DIR Q:'Y
 I $G(DUZ(0))'["@" W !,"PROGRAMMER MODE REQUIRED (NOTHING DONE)",! Q
 W !!?5,"Running this job on your terminal (HOME device) will tie up"
 W !?5,"your terminal for the several hours it takes to run, but you"
 W !?5,"will see the job's status as it's running."
 W !!?5,"Queuing will send it to the background for processing.  The"
 W !?5,"status will be apparent from the printed output (if there's an"
 W !?5,"error, it's text will be printed).  TaskMan/Kernel tools can also"
 W !?5,"be used to determine whether the job ran to completion or not."
 W !!?5,"Don't send this directly to a printer (without queuing) unless"
 W !?5,"you are prepared to tie up your terminal AND the printer for"
 W !?5,"the duration of the process.",!
 S %ZIS="QM" D ^%ZIS Q:POP
 I $D(IO("Q")) D  Q
 . S ZTRTN="RUN^DMSQ",ZTDESC="SQLI PROJECTION"
 . D ^%ZTLOAD D HOME^%ZIS K IO("Q")
 S:IO'=IO(0) DMDOT="" D RUN
EXIT K DMDOT
 Q
RUN ;runs the projection of all files (called from SETUP)
 U IO
 I $G(DUZ(0))'["@" W !,"PROGRAMMER MODE REQUIRED (NOTHING DONE)",! Q
 I $$WAIT^DMSQT1 D  Q
 . W !?5,"Another SQLI projection is being run right now.  So"
 . W !?5,"this attempt to re-run the projection is aborted."
 D ALLF^DMSQF(1) ;using param=1 schema/domains/datatypes (re)done
 D ^%ZISC
 S:$D(ZTQUEUED) ZTREQ="@"
 Q
RUNONE ;re-runs the projection of one file - for testing purposes only.
 ;if the selected file has subfiles, they will not be processed.
 ;to process one subfile, use the subfile number in this call.
 ;to select a (sub)file, it must already be an SQLI Table (re-runs only).
 I $G(DUZ(0))'["@" W !,"PROGRAMMER MODE REQUIRED (NOTHING DONE)",! Q
 N DM1,DM2,DMQ,DMFN S DMQ="" D ASK
 I DMQ W !?5,"No file selected; nothing done." Q
 D ONEF^DMSQF(DMFN) W !?5,"Done.  See SQLI files for changes."
 Q
ASK ; select (sub)file number
 S DM1=$O(^DMSQ("T","C",0)),DM2=$O(^DMSQ("T","C",99999999999),-1)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="File or Subfile Number"
 S DIR("?")="Enter the number of a file or subfile to re-project"
 D ^DIR S:$D(DIRUT) DMQ=1 K DIR Q:DMQ  S DMFN=Y
 I '$D(^DMSQ("T","C",DMFN)) D  G ASK
 . W !?5,"Invalid selection:  no SQLI table for this (sub)file."
 Q
PURGE ;entry point to clear data from SQLI files, all except keywords
 ;requires programmer mode (DUZ(0)="@")
 ;header nodes of the files are reset, indicating empty status
 N I
 I $G(DUZ(0))'["@" W !,"PROGMODE REQUIRED (NOTHING DONE)",! Q
 I $$WAIT^DMSQT1 D  Q
 . W !?5,"Purging can't be done right now.  The SQLI structures"
 . W !?5,"are in the process of being built, a job that might take"
 . W !?5,"a few hours.  So try again later (when the job finishes)."
 S DIR("A")="Removes all records from SQLI files. Continue"
 S DIR("?",1)="Clears all SQLI files (between 1.52 and 1.53) except SQLI_KEY_WORD."
 S DIR("?",2)="(You can re-generate SQLI data at a future time as needed.)",DIR("?",3)=" "
 S DIR("?")="Data can be cleared if you don't have an SQL system or you don't use SQLI."
 S DIR(0)="Y",DIR("B")="NO" D ^DIR K DIR Q:$D(DIRUT)!(Y'=1)
 W !,"Working..."
 F I="S","KF","T","E","C","P","F","EX","ET","DT","DM","OF" D CLF^DMSQU(I)
 W "Done!"
 Q

DMSQD
DMSQD ;SFISC/JHM-SETUP FOR DATATYPE AND DOMAIN ;5/7/98  14:53
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
LCKF ;BUILD KEY FORMAT FOR LONG CHARACTER FIELDS
 N KFI,DTI,KIE,KIX
 S KFI=$O(^DMSQ("KF","B","LONG_CHARACTER",""))
 S DTI=$O(^DMSQ("DT","B","CHARACTER",""))
 I 'DTI D F(2) S DTI=$O(^DMSQ("DT","B","CHARACTER","")) I 'DTI Q
 S KIE="$E({I},1,30)",KIX="S {K}="_KIE
 S IEN=$S(KFI:KFI,1:"+1")_",",TT=1.5213
 S FDA(TT,IEN,.01)="LONG_CHARACTER" ;NAME
 S FDA(TT,IEN,1)=DTI ;DATA TYPE
 S FDA(TT,IEN,2)="Truncate long free text fields to 30 characters" ;COMM
 S FDA(TT,IEN,3)=KIE ;EXPRESSION FORMAT
 S FDA(TT,IEN,4)=KIX ;EXECUTE FORMAT
 S KFI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'KFI D ERR^DMSQU(TT,"","KEY FORMAT: LONG_CHARACTER INSERT FAILED")
 Q
VPTOF(F,FI) ;BUILD OUTPUT FORMAT FOR VARIABLE POINTER FILE F, FIELD FI
 N TI,ON,OI,TT,IEN,BE,FDA,ERR S TI=$O(^DMSQ("T","C",F,"")) Q:'TI ""
 S T=^DMSQ("T",TI,0),ON=$$SQLK^DMSQU($P(T,U)_"_VPOF",30)
 S OI=$O(^DMSQ("OF","B",ON,"")),TT=1.5214,IEN=$S(OI:OI,1:"+1")_","
 S BE="$$EXT^DMSQU("_F_","_FI_","""",{B})"
 S FDA(TT,IEN,.01)=ON ;OF NAME
 S FDA(TT,IEN,1)=2 ; BASE DATA TYPE IS CHARACTER
 S FDA(TT,IEN,2)="Variable pointer output format" ; COMMENT
 S FDA(TT,IEN,3)=BE ; OUTPUT TRANSFORM
 S OI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'OI D ERR^DMSQU(TI,FI,"OUTPUT FORMAT: INSERT OF VARIABLE POINTER OUTPUT FORMAT FAILED")
 Q OI
PTROF(F) ;BUILD OUTPUT FORMAT FOR POINTER TO TABLE FI
 N TI,ON,OI,TT,IEN,BE,FDA,ERR S TI=$O(^DMSQ("T","C",F,"")) Q:'TI ""
 S T=^DMSQ("T",TI,0),ON=$$SQLK^DMSQU($P(T,U)_"_PTOF",30)
 S OI=$O(^DMSQ("OF","B",ON,"")),TT=1.5214,IEN=$S(OI:OI,1:"+1")_","
 S BE="$S('{B}:"""",1:$$GET^DMSQU("_F_",{B}_"","",.01))"
 S FDA(TT,IEN,.01)=ON ;OF NAME
 S FDA(TT,IEN,1)=3 ; BASE DATA TYPE IS INTEGER
 S FDA(TT,IEN,2)="Output format for pointer to "_$P(T,U) ; COMMENT
 S FDA(TT,IEN,3)=BE ; OUTPUT TRANSFORM
 S OI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'OI D ERR^DMSQU(TI,FI,"OUTPUT FORMAT: INSERT OF POINTER OUTPUT FORMAT FAILED")
 Q OI
BE ;;$P($P("{S}",";"_{B}_":",2),";")
SETOF(SD) ;BUILD PUTPUT FORMAT FOR SET DEFINITION SD
 N ON,OI,FDA,ERR,BE,TT,IEN,SL
 I SD?1P.E S $E(SD,1)="Z" ;"  " IS USED FOR DEFAULT CODE
 S ON=$$SQLK^DMSQU(SD,30),OI=$O(^DMSQ("OF","B",ON,""))
 S:$E(SD)'=";" SD=";"_SD S:$E(SD,$L(SD))'=";" SD=SD_";"
 S BE=$P($T(BE),";;",2,99),BE=$P(BE,"{S}")_SD_$P(BE,"{S}",2)
 ;BUILD OUTPUT FORMAT
 S TT=1.5214,IEN=$S(OI:OI,1:"+1")_","
 S FDA(TT,IEN,.01)=ON ;OUTPUT FORMAT NAME
 S FDA(TT,IEN,1)=2 ;CHARACTER DATA TYPE
 S FDA(TT,IEN,2)="Set output format" ;COMMENT
 S FDA(TT,IEN,3)=BE ;OUTPUT TRANSFORM EXPRESSION
 S OI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'OI D ERR^DMSQU($G(F),$G(FI),"OUTPUT FORMAT: INSERT OF SET-OF-CODES OUTPUT FORMAT FAILED")
 Q OI
 ;KW SOURCE ARRAY MUST HAVE THE FORM:
 ;   SRC(I)=KW : FOR EVERY I THERE MUST BE A KEYWORD
 ;SRC MAY BE LOCAL OR GLOBAL, BUT MUST WORK IN THE SYNTAX @SRC@(I)
 ;CALL: D KW("^SRC",.ERR)
KW(SRC,ERR) ;LOAD KEYWORD GLOBAL FROM ARRAY SRC
 ;RETURN ERRORS IN ERR: D KW^DMSQD("^SRC(,1,",.ERROR)
 Q:$G(SRC)=""  I $G(DUZ(0))'["@" S ERR="ACCESS DENIED" Q
 N E,DIERR,I,TT,KW,IEN,FDA,@$$NEW^DMSQU K ERR D ENV^DMSQU
 S TT=1.52101,I=""
 I $O(@SRC@(""))="" S ERR="INVALID OR MISSING KEYWORD ARRAY" Q
 F  S I=$O(@SRC@(I)) Q:I=""!$D(ERR)  D
 . S KW=$G(@SRC@(I)) Q:KW=""
 . S IEN=$O(^DMSQ("K","B",KW,""))
 . S IEN=$S(IEN:IEN,1:"+1")_","
 . D VAL^DIE(TT,IEN,.01,"F",.KW,"","FDA","E")
 . I $D(DIERR) S ERR=E("DIERR",1,"TEXT",1) Q
 . S IEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 . I $D(ERR)!'IEN S ERR="KEYWORD-$$PUT FAILED"
 Q
DMDT F I=1:1 Q:$T(@I)=""  D F(I)
 S $P(^DMSQ("DM",0),U,3)=99
 Q
F(DI) N I,FDA,FDB,ERR,IEN,TT,EO
 S TT=1.5212,IEN=$S($D(^DMSQ("DM",DI)):DI,1:"+1")_","
 F I=0:1 S T=$T(@DI+I) Q:T>DI  D
 . S FDA(TT,IEN,$P(T,";",3))=$P(T,";",4,99)
 I FDA(TT,IEN,1)=DI D  Q:$D(ERR)
 . N DIEN S DIEN=$S($D(^DMSQ("DT",DI)):DI,1:"+1")_","
 . S FDB(1.5211,DIEN,.01)=FDA(TT,IEN,.01)
 . S FDB(1.5211,DIEN,1)=FDA(TT,IEN,2)
 . S EO=$$PUT^DMSQU(DIEN,"FDB","ERR")
 . I $D(ERR) D ERR^DMSQU(1.5211,"","DATA TYPE: INSERT OF DATA TYPE RECORD FAILED")
 S EO=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(1.5212,"","DOMAIN: INSERT OF DOMAIN RECORD FAILED")
 Q
1 ;;.01;PRIMARY_KEY
 ;;1;1
 ;;2;Table domain, used for primary and foreign keys
2 ;;.01;CHARACTER
 ;;1;2
 ;;2;Free Text less than 256 characters
 ;;4;30
3 ;;.01;INTEGER
 ;;1;3
 ;;2;Up to 15 numeric characters without leading zeroes
 ;;4;10
4 ;;.01;NUMERIC
 ;;1;4
 ;;2;Up to 15 numeric characters with at most one decimal point
 ;;4;10
 ;;5;2
5 ;;.01;DATE
 ;;1;5
 ;;2;Base date is M $H format, ODBC = YYYY-MM-DD
 ;;4;8
6 ;;.01;TIME
 ;;1;6
 ;;2;Base is M $H format, ODBC = HH:MM:SS[.S...]
 ;;4;8
7 ;;.01;MOMENT
 ;;1;7
 ;;2;Base is M $H format
 ;;4;17
8 ;;.01;BOOLEAN
 ;;1;8
 ;;2;YES or NO, internally 1 or 0
 ;;4;3
9 ;;.01;MEMO
 ;;1;9
 ;;2;Huge character string up to 32KB long
 ;;4;70
10 ;;.01;FM_DATE
 ;;1;5
 ;;2;Handle base-internal translation of FileMan internal date w/o time
 ;;4;8
 ;;8;S %H={B} D YMD^%DTC S {I}=X
 ;;10;S X={I} D H^%DTC S {B}=%H
 ;;11;D
11 ;;.01;FM_MOMENT
 ;;1;7
 ;;2;Base-internal of FileMan internal date with optional time
 ;;4;17
 ;;8;S %H={B} D YMD^%DTC S {I}=X_$S($G(%):%,1:"")
 ;;10;S X={I} D H^%DTC S:$G(%T)=86400 %T=0,%H=%H+1 S {B}=%H_$S($G(%T)]"":","_%T,1:"")
 ;;11;DT
12 ;;.01;FM_BOOLEAN
 ;;1;2
 ;;2;Translate FileMan logical to ODBC
 ;;7;$S({B}="":0,1:{B})
 ;;9;$S({I}:{I},1:"")
 ;;11;B
13 ;;.01;POINTER
 ;;1;3
 ;;2;Pointer to FileMan files in FILE - no subfiles
 ;;4;10
 ;;11;P
14 ;;.01;WORD_PROCESSING
 ;;1;9
 ;;2;FileMan WORD-PROCESSING data type
 ;;4;70
 ;;11;W
15 ;;.01;SET_OF_CODES
 ;;1;2
 ;;2;FileMan SET-OF-CODES data type
 ;;4;13
 ;;11;S
16 ;;.01;VARIABLE_POINTER
 ;;1;2
 ;;2;FileMan VARIABLE POINTER data type
 ;;4;13
 ;;11;V
17 ;;.01;FM_MUMPS
 ;;1;2
 ;;2;FileMan MUMPS data type
 ;;4;245
 ;;11;K
18 ;;.01;FM_DATE_TIME
 ;;1;7
 ;;2;Base-internal of FileMan internal date with required time
 ;;4;17
 ;;8;S %H={B} S:'$P(%H,",",2) %H=%H-1_",86400" D YMD^%DTC S {I}=X_$S($G(%):%,1:"")
 ;;10;S X={I} D H^%DTC S:$G(%T)=86400 %T=0,%H=%H+1 S {B}=%H_","_(+$G(%T))
 ;;11;DTR
99 ;;END FLAG

DMSQE
DMSQE ;SFISC/EZ-DISPLAY ERRORS ;11/26/97  13:57
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
MAIN ; main driver
 N DMF,DMFI,DMFE,DMFNM,DMFINM,DMQ
 S DMQ=""
 D CHK,PRT:'DMQ
 Q
CHK ; check for existence of SQLI data in DMSQ global
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! S DMQ=1 Q
 I $$WAIT^DMSQT1 D  S DMQ=1 Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 Q
PRT ; print errors along with file/subfile/field number/name
 S DIC=1.52192,L=0,BY="3",(FR,TO)=""
 S DMF="$P($G(^DMSQ(""EX"",D0,0)),U,1)"
 S DMFI="$P($G(^DMSQ(""EX"",D0,0)),U,2)"
 ;S DMFE="$P($G(^DMSQ(""EX"",D0,0)),U,5)"
 ;can include Dialog file codes/text at a later time, when SQLI does
 ;a better job of keeping hold of the error from DBS calls to the
 ;Updater, Filer, DD Retriver, etc.
 S DMFNM="$O(^DD("_DMF_",0,""NM"",0))"
 ; use NM node for files & subfiles 
 S DMFINM="$S("_DMFI_":$P($G(^DD("_DMF_","_DMFI_",0)),U,1),1:"""")"
 S DHIT="W ?11,@DMFNM,"" "",?40,@DMFI,"" "",?50,@DMFINM,!"
 S FLDS="INTERNAL(#.01);""FILE"";S,"" "";X,2;C12;"""""
 D EN1^DIP Q

DMSQF
DMSQF ;SFISC/JHM-INITIALIZE SQLI_FILE ;11/17/97  13:28
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
INI ;INITIALIZE ^DMSQ - CLEAR ALL TABLES
 N I F I="S","KF","T","E","C","P","F","EX","ET","DT","DM","OF" D CLF^DMSQU(I)
 D DMDT^DMSQD,LCKF^DMSQD ;INSTALL DOMAINS, DATA TYPES AND KEY FORMATS
 D SCHEMA^DMSQS ;BUILD STANDARD SQLI SCHEMA
 Q
ET(T) D ET^DMSQU(T)
 Q
ALLF(I) ;INITIALIZE IF I. COMPILE ALL FILES, TABLE ELEMENTS AND INDICIES
 I $G(DUZ(0))'["@" Q
 N @$$NEW^DMSQU
 N GF,PE,%H,F,IEN,IENL,FCI,FDI,T,TI,TT,KFI,KIE,KIX,KL,LK,FI,CEI,CI,FKI
 N ET,TCT S ET=$H D INI:I,ENV^DMSQU
 S (TCT,F)=0 F  S F=$O(^DIC(F)) Q:'F  D STORE(F),SF(F,""):TI
 W ! D ET(ET) W ! S (TCT,TI)=0
 F  S TI=$O(^DMSQ("T",TI)) Q:'TI  D
 . D E(TI) I $D(ZTQUEUED)!$D(DMDOT) S TCT=TCT+1 W:$Y>29 ! W:TCT#20=1 "."
 . E  W $C(13),"Columns of ",TI
 W ! D ET(ET) W !
 S CEI="",TCT=0 F  S CEI=$O(^DMSQ("E","C",13,CEI)) Q:CEI=""  D
 . S CI=$O(^DMSQ("C","B",CEI,""))
 . I CI S FKI=$$FK^DMSQF1(CI) I FKI D
 . . I $D(ZTQUEUED)!$D(DMDOT) S TCT=TCT+1 W:$Y>29 ! W:TCT#20=1 "."
 . . E  W $C(13),"Foreign key ",FKI
 W ! D ET(ET) W !
 S (TCT,TI)=0 F  S TI=$O(^DMSQ("T",TI)) Q:'TI  D
 . Q:$P(^DMSQ("T",TI,0),U,4)  D INDEX^DMSQF2(TI)
 . I $D(ZTQUEUED)!$D(DMDOT) S TCT=TCT+1 W:$Y>29 ! W:TCT#20=1 "."
 . E  W $C(13),"Index ",TI
 . D PFK^DMSQF2(TI)
 W ! D ET(ET)
 Q
ONEF(F) ;COMPILE FILE F, COLUMNS AND INDICIES
 I $G(DUZ(0))'="@" Q
 I '$$FIL^DMSQU(F) D ERR^DMSQU(F,"","ONEF: NO PARENT STRUCTURE") Q
 N @$$NEW^DMSQU,TI,CEI,CI,FKI D ENV^DMSQU
 S TI=$$FILE(F) I 'TI Q
 D E(TI) S CEI="" F  S CEI=$O(^DMSQ("E","D",TI,CEI)) Q:'CEI  D
 . S E=^DMSQ("E",CEI,0) Q:$P(E,U,2)'=13
 . S CI=$O(^DMSQ("C","B",CEI,"")) Q:'CI
 . S FKI=$$FK^DMSQF1(CI)
 D PFK^DMSQF2(TI)
 I '$P(^DMSQ("T",TI,0),U,4) D INDEX^DMSQF2(TI)
 Q
SF(P,F) ;RECURSIVELY PARSE AND COMPILE SUBFILES (F) OF PARENT FILE (P)
 F  S F=$O(^DD(P,"SB",F)) Q:'F  D
 . I $G(^DD(F,0,"UP"))'=P D ERR^DMSQU(F,P,"SUBFILE: BAD UP-LINK TO PARENT") Q
 . D STORE(F),SF(F,""):TI
 Q
STORE(F) S TI=$$FILE(F)
 I $D(ZTQUEUED)!$D(DMDOT) S TCT=TCT+1 W:$Y>29 ! W:TCT#20=1 "."
 E  W:TI $C(13),"Table ",TI
 Q
E(TI) ;BUILD COLUMNS
 N LK,F,FI,CI
 S F=$P(^DMSQ("T",TI,0),U,7),FI=.001
 F  S FI=$O(^DD(F,FI)) Q:'FI  S CI=$$C(F,FI)
 Q
FILE(F) ;COMPILE SQLI FOR FILE #F
 N TI,DS,P,X,TF,IEN,FIL,NM,FDA
 S TI=$O(^DMSQ("T","C",F,""))
 I F=.6!(F=1.1) D ERR^DMSQU(F,"","FILE: NOT FILEMAN COMPATIBLE") Q ""
 I $D(^DIC(F)) D  Q:$D(ERR) ""
 . K ERR,DIERR D FILE^DID(F,"","NAME;DESCRIPTION","FIL","ERR")
 . I $D(ERR) D ERR^DMSQU(F,"","FILE: NO DESCRIPTION") Q
 . I '$D(FIL("DESCRIPTION")) D ERR^DMSQU(F,"","FILE: NULL DESCRIPTION") Q
 . S DS=$E($G(FIL("DESCRIPTION",1)),1,60)
 . F  Q:DS'[U  S DS=$P(DS,U)_"<94>"_$P(DS,U,2,99)
 E  D  I 'P D ERR^DMSQU(F,"","FILE: SUBFILE WITHOUT PARENT") Q ""
 . S FIL("NAME")=$O(^DD(F,0,"NM","")),P=$G(^DD(F,0,"UP"))
 . I P S DS="Subfile of "_$O(^DD(P,0,"NM",""))
 I $G(FIL("NAME"))="" D ERR^DMSQU(F,"","FILE: NO NAME") Q ""
 I FIL("NAME")?1"*".E D ERR^DMSQU(F,"","FILE: OBSOLETE") Q ""
 S X=$$ROOT^DMSQU(F)
 I X="^" D ERR^DMSQU(F,"","FILE: NO GLOBAL ROOT") Q ""
 S FIL("GLOBAL NAME")=X
 S NM=$$FNB^DMSQU(F,TI) I NM="" D ERR^DMSQU(F,"","FILE: CAN'T BUILD SQL NAME") Q ""
 S TF=1.5215,IEN=$S(TI:TI,1:"+1")_","
 K FDA
 S FDA(TF,IEN,.01)=NM ;LABEL
 S FDA(TF,IEN,1)=1 ;SCHEMA SQLI
 S FDA(TF,IEN,2)=DS ;DESCRIPTION
 S FDA(TF,IEN,4)=1 ;VERSION NUMBER
 S FDA(TF,IEN,6)=F ;SOURCE FILE
 S FDA(TF,IEN,7)=DT ;UPDATE DATE
 S FDA(TF,IEN,8)=FIL("GLOBAL NAME") ;FULL GLOBAL REFERENCE
 S TI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,"","FILE: INSERT OF TABLE FAILED")
 I TI S X=$$PK^DMSQF1(TI)
 Q TI
GETEXEC ;S {V}=$$GET1^DIQ({F},{IENS},{FI})
C(F,FI) ;GENERATE NON-KEY ELEMENT/COLUMNS FOR FILE F, FIELD FI
 I '$G(DIFM) D ENV^DMSQU
 N RQ,OF,P,WP,FDA,CI,CEI,TI,TN,DM,DEF,CM,CN,TP,W,S,TT,IEN,X,CX,FX,XX
 N G,PC,E
 S CI=$O(^DMSQ("C","D",F,FI,"")),CEI=$S(CI:$P(^DMSQ("C",CI,0),U),1:"")
 I CI,'CEI D ERR^DMSQU(F,FI,"COLUMN: NO CORRESPONDING TABLE ELEMENT") Q ""
 S TI=$O(^DMSQ("T","C",F,""))
 I 'TI D ERR^DMSQU(F,FI,"COLUMN: NO ASSOCIATED TABLE") Q ""
 I $P(^DMSQ("T",TI,0),U,4) Q "" ;SKIP INDEX TABLES
 S TN=$P(^DMSQ("T",TI,0),U)
 S DM=$$DOM^DMSQU(F,FI,.DEF)
 I $D(ERR)!$D(DIERR) D ERR^DMSQU(F,FI,"COLUMN: CAN'T GET FIELD ELEMENTS") Q ""
 I DM="" D ERR^DMSQU(F,FI,"COLUMN: NULL FIELD TYPE (DOMAIN)") Q ""
 I DEF("LABEL")?1"*".E Q ""
 I DEF("LABEL")?.P D ERR^DMSQU(F,FI,"COLUMN: INVALID FIELD LABEL") Q ""
 S CN=$$CN^DMSQU(TI,CEI,DEF("LABEL")),TP=DEF("TYPE")
 S WP=TP="WORD-PROCESSING",CM=DEF("DESCRIPTION")
 F  Q:CM'[U  S CM=$P(CM,U)_"<94>"_$P(CM,U,2,99)
 I CM="" S CM="Column header for "_TN_"."_CN
 I DEF("MULTIPLE-VALUED"),'WP Q ""
 I WP,FI=.01 S $P(DM,U)="CHARACTER"
 S OF="" I TP="SET" S X=DEF("POINTER"),OF=$$SETOF^DMSQD(.X)
 S (CX,FX,XX)="" I "COMPUTED,POINTER,VARIABLE-POINTER"[TP D
 . N IEN S IEN=""""_$$VIEN^DMSQU(TI)_""""
 . S XX=1,FX="S {V}=$$GET^DMSQU("_F_","_IEN_","_FI_")"
 . I TP="COMPUTED" S CX=DEF("INPUT TRANSFORM")
 I TP="POINTER" S OF=$$PTROF^DMSQD(+$P(DEF("SPECIFIER"),"P",2))
 E  I TP="VARIABLE-POINTER" S OF=$$VPTOF^DMSQD(F,FI)
 S W=$P(DM,U,2),S=$P(DM,U,3)
 I S<0 D ERR^DMSQU(F,FI,"COLUMN: DECIMAL DEFAULT IS NEGATIVE") Q ""
 S RQ=$S(WP:0,FI=.01:1,DEF("SPECIFIER")["R"&$D(^DD(F,0,"ID",FI)):1,1:0)
 S DM=$P(DM,U),DI=$O(^DMSQ("DM","B",DM,""))
 I 'DI D ERR^DMSQU(F,FI,"COLUMN: FIELD TYPE NOT KNOWN TO SQLI") Q ""
 ;DEFINE COLUMN ELEMENT
 S TT=1.5216,IEN=$S(CEI:CEI,1:"+1")_","
 S FDA(TT,IEN,.01)=CN ;COLUMN NAME
 S FDA(TT,IEN,1)=DI ;DOMAIN
 S FDA(TT,IEN,2)=TI ;COLUMN TABLE
 S FDA(TT,IEN,3)="C" ;TYPE C = COLUMN
 S FDA(TT,IEN,4)=CM ;DESCRIPTION
 S CEI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,FI,"COLUMN: INSERT OF COLUMN ELEMENT FAILED") Q ""
 ;DEFINE COLUMN
 S TT=1.5217,IEN=$S(CI:CI,1:"+1")_","
 S FDA(TT,IEN,.01)=CEI ;COLUMN TABLE ELEMENT
 S FDA(TT,IEN,1)=F ;FILEMAN FILE NUMBER
 S FDA(TT,IEN,2)=W ;FIELD LENGTH
 S FDA(TT,IEN,3)=S ;DECIMAL POINTS
 S FDA(TT,IEN,4)=FI ;FILEMAN FIELD NUMBER
 S FDA(TT,IEN,5)=RQ ;REQUIRED FLAG
 I XX D  G CPUT:TP="COMPUTED"
 . S FDA(TT,IEN,7)=1
 . S:CX]"" FDA(TT,IEN,13)=CX ; DIRECT COMPUTATION EXECUTE
 . S:FX]"" FDA(TT,IEN,14)=FX ; FILEMAN $$GET1^DIQ EXECUTE
 S FDA(TT,IEN,6)=0 ;SECURITY FLAG - NEED LOGIC TO SET THIS RIGHT
 S FDA(TT,IEN,7)=0 ;NOT CALCULATED
 S P=$$PAR^DMSQU(TI,DEF("GLOBAL SUBSCRIPT LOCATION"),.G,.PC,.E)
 I DEF("TYPE")="MUMPS" S PC=""
 S FDA(TT,IEN,8)=P ;PARENT COLUMN (LAST PRIMARY KEY)
 S FDA(TT,IEN,9)=G ;GLOBAL FRAGMENT
 I PC,'WP S FDA(TT,IEN,10)=PC ;PIECE (WP .01 FIELDS ARE REALLY TYPE K!)
 E  D:E 
 . S FDA(TT,IEN,11)=+E,FDA(TT,IEN,12)=$P(E,",",2) ;EXTRACT FROM TO
 I DEF("POINTER")]"" S FDA(TT,IEN,15)=DEF("POINTER") ; POINTER OR SET
 I OF S FDA(TT,IEN,16)=OF ; OUTPUT FORMAT IF ANY
CPUT S CI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D
 . D ERR^DMSQU(F,FI,"COLUMN: INSERT OF COLUMN RECORD FAILED")
CQ Q CI

DMSQF1
DMSQF1 ;SFISC/JHM-INITIALIZE SQLI_FILE (CONT) ;5/7/98  14:53
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
PK(TI) ;GENERATE PRIMARY KEY ELEMENTS AND COLUMNS FOR TABLE IDENTIFIER TI
 I '$G(DIFM) D ENV^DMSQU
 N X,N,G,PAR,PEI,TIEN,T,DIERR S T=1.5215,TIEN=TI_","
 K DIERR D GETS^DIQ(T,TIEN,".01;6;8","I","X")
 I $D(DIERR) D ERR^DMSQU(999999999,"","PRIMARY KEY: CAN'T GET TABLE DATA") Q ""
 S N=X(T,TIEN,.01,"I"),G=X(T,TIEN,8,"I"),F=X(T,TIEN,6,"I")
 K FDA S TT=1.5212,DI=$O(^DMSQ("DM","C",TI,"")) ;BUILD DOMAIN
 S IEN=$S(DI:DI,1:"+1")_"," ;TABLE DOMAIN
 S FDA(TT,IEN,.01)=N_"_ID" ;DOMAIN NAME
 S FDA(TT,IEN,1)=1 ;DATA TYPE = PRIMARY KEY
 S FDA(TT,IEN,2)="Domain of table "_N ;COMMENT
 S FDA(TT,IEN,3)=TI ;TABLE ID
 S DI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I 'DI D ERR^DMSQU(F,"","PRIMARY KEY: DOMAIN INSERT FAILED") Q ""
 ; BUILD PRIMARY KEY TABLE ELEMENT
 S PEI=$O(^DMSQ("E","F",TI,"P","")),IEN=$S(PEI:PEI,1:"+1")_",",TT=1.5216
 S FDA(TT,IEN,.01)=N_"_PK" ;TABLE ELEMENT NAME
 S FDA(TT,IEN,1)=DI ;TE DOMAIN SAME AS TABLE
 S FDA(TT,IEN,2)=TI ;TABLE ID
 S FDA(TT,IEN,3)="P" ;TYPE = PRIMARY KEY
 S FDA(TT,IEN,4)="Primary key header for table "_N ;COMMENT
 S PEI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I 'PEI D ERR^DMSQU(F,"","PRIMARY KEY: TABLE ELEMENT INSERT FAILED") Q ""
 ;BUILD TABLE PRIMARY KEYS
 S F=$$GET^DMSQU(1.5215,TI_",",6,"I","","ERR"),KL=$$KL^DMSQU(F),PAR=""
 I $D(ERR)!'F D ERR^DMSQU(F,"","PRIMARY KEY: CAN'T GET TABLE'S FILE #") Q ""
 F I=1:1:$L(G,"{K}")-1 D PKI(PEI,I,$P(KL,",",I),$P(G,"{K}",I),.PAR)
 Q CEI
PKI(PEI,SEQ,F,GF,PAR) ;BUILD COLUMN ELEMENT, COLUMN AND PRIMARY KEY DEFS
 N TN,KI,KN,PI,CI,DM,W,S,TT,I,DI,ERR
 S TN=$$GET^DMSQU(1.5216,PEI_",",2,"","","ERR")
 I TN="" D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: CAN'T GET DATA FOR MASTER TABLE") Q ""
 S KI=$O(^DMSQ("T","C",F,""))
 I 'KI D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: MISSING TABLE RECORD") Q ""
 S KN=$$GET^DMSQU(1.5215,KI_",",.01),(CI,CEI)=""
 S PI=$O(^DMSQ("P","C",PEI,SEQ,""))
 I PI K ERR,DIERR D  Q:'CI!'CEI
 . S CI=$$GET^DMSQU(1.5218,PI_",",1,"I","","ERR")
 . I $D(ERR) D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: TABLE MISSING COLUMN POINTER") Q
 . I CI S CEI=$$GET^DMSQU(1.5217,CI_",",.01,"I","","ERR")
 . I $D(ERR) D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: CAN'T GET COLUMN'S TABLE ELEMENT") Q
 . I 'CI!('CEI) D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: MISSING COLUMN POINTER") Q
 ;DEFINE COLUMN ELEMENT
 S IEN=$S(CEI:CEI,1:"+1")_",",TT=1.5216
 S DM=$$DOM^DMSQU(F,.001),W=$P(DM,U,2),S=$P(DM,U,3),DM=$P(DM,U)
 I DM=""!("FM_DATE_TIME;FM_MOMENT;FM_DATE;INTEGER;NUMERIC"'[DM) S DM="INTEGER",W=10
 S DI=$O(^DMSQ("DM","B",DM,""))
 S FDA(TT,IEN,.01)=$$KWC^DMSQU(KN_"_ID") ;COLUMN NAME = TABLE_NAME_ID
 S FDA(TT,IEN,1)=DI ;DOMAIN
 S FDA(TT,IEN,2)=TI ;TABLE ID
 S FDA(TT,IEN,3)="C" ; TYPE = COLUMN
 S FDA(TT,IEN,4)="Primary key #"_SEQ_" of table "_TN ; COMMENT
 S CEI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: COLUMN ELEMENT INSERT FAILED") Q
 ;DEFINE COLUMN
 S TT=1.5217,CI=$O(^DMSQ("C","B",CEI,"")),IEN=$S(CI:CI,1:"+1")_","
 S FDA(TT,IEN,.01)=CEI ;COL ELEMENT ID
 S FDA(TT,IEN,2)=W ;WIDTH
 S:S FDA(TT,IEN,3)=S ;SCALE
 S FDA(TT,IEN,5)=1 ;REQUIRED
 S FDA(TT,IEN,7)=0 ;BASE COLUMN
 S FDA(TT,IEN,9)=GF ;GLOBAL FRAGMENT
 S FDA(TT,IEN,8)=PAR ;PARENT
 S CI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: COLUMN INSERT FAILED") Q
 S PAR=CI
 ;DEFINE PRIMARY KEY
 S TT=1.5218,PI=$O(^DMSQ("P","C",PEI,SEQ,"")),IEN=$S(PI:PI,1:"+1")_","
 S FDA(TT,IEN,.01)=PEI ; TABLE ELEMENT
 S FDA(TT,IEN,1)=CI ; COLUMN
 S FDA(TT,IEN,2)=SEQ ; SEQUENCE NUMBER
 S FDA(TT,IEN,3)=0 ; ALWAYS START AT 0
 S FDA(TT,IEN,4)="'{K}" ; STOP AT EXPRESSION
 S CI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,SEQ,"INDEX PRIMARY KEY: TABLE ELEMENT INSERT FAILED")
 Q
FK(CI) ;DEFINE FOREIGN KEY FOR POINTER COLUMN CI
 N C,CEI,CE,CN,F,FI,TI,SP,FF,FIEN,FTI,FTN,FPEI,FPE,FPI,FNM,TT,IEN,FDA
 S C=^DMSQ("C",CI,0)
 S CEI=$P(C,U),CE=^DMSQ("E",CEI,0),CN=$P(CE,U) Q:$P(CE,U,2)'=13 ""
 S F=$P(C,U,5),FI=$P(C,U,6) I 'F!'FI Q ""
 S TI=$P(CE,U,3),SP=$P(^DD(F,FI,0),U,2)
 S FF=+$P(SP,"P",2)
 I 'FF D ERR^DMSQU(F,FI,"FOREIGN KEY: NO POINTED-TO FILE IN SPECIFIER") Q ""
 S FTI=$O(^DMSQ("T","C",FF,""))
 I 'FTI D ERR^DMSQU(F,FI,"FOREIGN KEY: NO TABLE FOR POINTED-TO FILE") Q ""
 S FTN=$P(^DMSQ("T",FTI,0),U)
 S FPEI=$O(^DMSQ("E","F",FTI,"P",""))
 I 'FPEI D ERR^DMSQU(F,FI,"FOREIGN KEY: NO PRIMARY KEY TABLE ELEMENT") Q ""
 S FPE=^DMSQ("E",FPEI,0),FDI=$P(FPE,U,2)
 S FPI=$O(^DMSQ("P","B",FPEI,""))
 I 'FPI D ERR^DMSQU(F,FI,"FOREIGN KEY: NO ASSOCIATED PRIMARY KEY") Q ""
 S FCI=$P(^DMSQ("P",FPI,0),U,2)
 S FNM=CN_"_FK",IEN=$O(^DMSQ("E","G",TI,FNM,""))
 ;BUILD FOREIGN KEY TABLE ELEMENT
 S TT=1.5216,IEN=$S(IEN:IEN,1:"+1")_","
 S FDA(TT,IEN,.01)=FNM ;FOREIGN KEY NAME
 S FDA(TT,IEN,1)=FDI ;DOMAIN = FOREIGN KEY TABLE DOMAIN
 S FDA(TT,IEN,2)=TI ;TABLE ID
 S FDA(TT,IEN,3)="F" ;TYPE F = FOREIGN KEY
 S FDA(TT,IEN,4)="Foreign key to "_FTN ;COMMENT
 S FIEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,FI,"FOREIGN KEY: TABLE ELEMENT INSERT FAILED") Q ""
 ;BUILD FOREIGN KEY COLUMN ELEMENT
 S TT=1.5219,IEN=$O(^DMSQ("F","B",FIEN,"")),IEN=$S(IEN:IEN,1:"+1")_","
 S FDA(TT,IEN,.01)=FIEN ;FK TABLE ELEMENT ID
 S FDA(TT,IEN,1)=FPI ;FOREIGN TABLE PRIMARY KEY ELEMENT ID
 S FDA(TT,IEN,2)=CI ;COLUMN ID IN LOCAL TABLE
 S FIEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,FI,"FOREIGN KEY: COLUMN ELEMENT INSERT FAILED")
 Q FIEN

DMSQF2
DMSQF2 ;SFISC/JHM-BUILD INDEX AND PARENT FOREIGN KEYS ;7/28/97  11:10
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
PFK(TI) ;BUILD FOREIGN KEYS FOR PARENT TABLES
 N T,GL,FL,PEI,S,TE,TC
 D INIT F I=1:1:$O(TE(""),-1)-1 D BFK(I)
 Q
BFK(L) ;BUILD A LEVEL L FOREIGN KEY FOR TABLE PRIMARY KEYS
 N I,FF,FTI,FT,FTN,FKN,FPEI,FPE,IEN,TT,FDA,ERR,FIEN,PI
 S FF=$P(FL,",",L),FTI=$O(^DMSQ("T","C",FF,"")) Q:FTI=""
 S FT=^DMSQ("T",FTI,0),FTN=$P(FT,U),FKN=FTN_"_PFK"
 S FPEI=$O(^DMSQ("E","F",FTI,"P","")) Q:FPEI=""
 S FPE=^DMSQ("E",FPEI,0),FDI=$P(FPE,U,2)
 ;BUILD FOREIGN KEY TABLE ELEMENT
 S IEN=$O(^DMSQ("E","G",TI,FKN,"")),TT=1.5216,IEN=$S(IEN:IEN,1:"+1")_","
 S FDA(TT,IEN,.01)=FKN ; FOREIGN KEY NAME
 S FDA(TT,IEN,1)=FDI ; DOMAIN OF FOREIGN TABLE
 S FDA(TT,IEN,2)=TI ; FOREIGN KEY IS IN THIS TABLE
 S FDA(TT,IEN,3)="F" ; TYPE F FOR FOREIGN KEY
 S FDA(TT,IEN,4)="Foreign key to ancestor "_FTN ; COMMENT
 S FIEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'FIEN D ERR^DMSQU(F,L,"FOREIGN KEY: ANCESTOR FOREIGN KEY INSERT FAILED") Q
 S (IENL,FKI)=""
 F I=1:1:L S FKI=$O(^DMSQ("F","B",FIEN,FKI)) Q:FKI=""  D
 . S $P(IENL,U,I)=FKI
 F I=1:1:L D BFKI(I)
 Q
BFKI(L) ;BUILD FOREIGN KEY COLUMN ELEMENT
 S CEI=$P(TC(L),U),CI=$O(^DMSQ("C","B",CEI,""))
 I 'CI D ERR^DMSQU(F,L,"FOREIGN KEY: NO POINTED-TO COLUMN AT LEVEL") Q
 S PI=$O(^DMSQ("P","C",FPEI,L,""))
 I 'PI D ERR^DMSQU(F,L,"FOREIGN KEY: NO ANCESTOR PRIMARY KEY") Q
 ;BUILD FK COLUMN
 S FI=$P(IENL,U,I),TT=1.5219,IEN=$S(FI:FI,1:"+1")_","
 S FDA(TT,IEN,.01)=FIEN ; FK TABLE ELEMENT ID
 S FDA(TT,IEN,1)=PI ; FOREIGN PRIMARY KEY ID
 S FDA(TT,IEN,2)=CI ; LOCAL PRIMARY KEY COLUMN ID
 S FI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'FI D ERR^DMSQU(F,L,"FOREIGN KEY: ANCESTOR FOREIGN KEY COLUMN INSERT FAILED")
 Q
INIT ;SET PRIMARY KEY VARIABLES FOR TABLE TI
 N S,P,PI,K,KCI,KC,PEI
 S S=0,T=^DMSQ("T",TI,0),GL=^(1),(F,P,FL)=$P(T,U,7)
 F  S P=$G(^DD(P,0,"UP")) Q:P=""  S FL=P_","_FL
 S PEI=$O(^DMSQ("E","F",TI,"P","")),PI=""
 F  S PI=$O(^DMSQ("P","B",PEI,PI)) Q:PI=""  D
 . S K=^DMSQ("P",PI,0),S=$P(K,U,3),KCI=$P(K,U,2),KC=^DMSQ("C",KCI,0)
 . S TE(S)=$P(^DMSQ("E",$P(KC,U),0),U,1,2),TC(S)=KC
 Q
INDEX(TI) ;BUILD ALL REGULAR INDICIES FOR TABLE TI
 I '$G(DIFM) D ENV^DMSQU
 N T,GL,FL,PI,K,TE,TC,KC,KCI,IN,FI,CI,IC,IE,I,IF,IX,C,CEI,L,TN,CN,INM,IEI,IEN,FDA,ERR,TIEN,PIEN,DIEN,CIEN
 D INIT S FI=0
FI S FI=$O(^DD(F,FI)) Q:'FI  S IN=0
IN S IN=$O(^DD(F,FI,1,IN)) G FI:'IN D IDX(F,FI,IN,.TC,.TE) G IN
 ;
IDX(F,FI,IN,TC,TE) ;BUILD INDEX
 N P,S,IGL,IC,IE,I,IF,IX,CI,ITI,CEI,CE,L,TN,GF,INM1,INM2,TN1,TN2
 S I=$G(^DD(F,FI,1,IN,0)) I $P(I,U,3)]"" Q
 I I="" D ERR^DMSQU(F,FI,"INDEX: MISSING DATA DICTIONARY DATA") Q
 S IF=+I,IX=$P(I,U,2) I IX=""!'IF Q
 I $G(^DD(F,FI,1,IN,1))'[",DA)" D  Q
 . D ERR^DMSQU(F,FI,"INDEX: IRREGULAR FORMAT")
 S CI=$O(^DMSQ("C","D",F,FI,"")),ITI=$$T(IF)
 I 'CI D ERR^DMSQU(F,FI,"INDEX: NO ASSOCIATED COLUMN RECORD") Q
 F L=$L(FL,","):-1:1 Q:$P(FL,",",L)=IF
 M IC=TC,IE=TE
 S C=^DMSQ("C",CI,0),CEI=$P(C,U),CE=^DMSQ("E",CEI,0)
 S IC(L-.5)=C,IE(L-.5)=CE
 ;S TN=$P(T,U),CN=$P(CE,U),INM=$$SQLI^DMSQU(TN_"_X"_IX_"_"_CN,30)
 S TN=$P(T,U),TN1=$E(TN,1,$L(TN)-1),TN2=$E(TN,$L(TN)),CN=$P(CE,U)
 S INM1=$$SQLI^DMSQU(TN1,18),INM2=$$SQLI^DMSQU("X"_IX_"_"_CN,10)
 S INM=INM1_TN2_"_"_INM2
 S IGL=GL,GF=$P(IGL,"{K}",L)_$C(34)_IX_$C(34)_",{K},"
 S $P(IGL,"{K}",L)=GF F I=L+1:1:$L(GL,"{K}") S $P(IGL,"{K}",I)=","
 S IEI=$O(^DMSQ("T","B",INM,""))
 ;BUILD TABLE
 S TT=1.5215,IEN=$S(IEI:IEI,1:"+1")_","
 S FDA(TT,IEN,.01)=INM ; INDEX TABLE NAME
 S FDA(TT,IEN,1)=1 ; SCHEMA SQLI
 S FDA(TT,IEN,2)="Index of "_TN_" by "_CN ;COMMENT
 S FDA(TT,IEN,3)=TI ; MASTER TABLE ID
 S FDA(TT,IEN,4)=1 ; VERSION NUMBER
 S FDA(TT,IEN,7)=DT ; UPDATE DATE
 S FDA(TT,IEN,8)=IGL ; GLOBAL NAME
 S TIEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,FI,"INDEX: TABLE INSERT FAILED") Q
 S DIEN=$O(^DMSQ("DM","C",TIEN,""))
 ; BUILD TABLE DOMAIN
 S TT=1.5212,IEN=$S(DIEN:DIEN,1:"+1")_","
 S FDA(TT,IEN,.01)=$$SQLI^DMSQU(INM_"_ID",30) ; DOMAIN NAME
 S FDA(TT,IEN,1)=1 ; TYPE = PRIMARY KEY
 S FDA(TT,IEN,2)="Domain of table "_INM ; COMMENT
 S FDA(TT,IEN,3)=TIEN ; TABLE ID
 S DIEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,FI,"INDEX: TABLE DOMAIN INSERT FAILED") Q
 S PIEN=$O(^DMSQ("E","F",TIEN,"P",""))
 ;BUILD PRIMARY KEY HEADER ELEMENT
 S TT=1.5216,IEN=$S(PIEN:PIEN,1:"+1")_","
 S FDA(TT,IEN,.01)=$$SQLI^DMSQU(INM_"_PK",30) ; PRIMARY KEY NAME
 S FDA(TT,IEN,1)=DIEN ; TABLE DOMAIN
 S FDA(TT,IEN,2)=TIEN ; TABLE ID
 S FDA(TT,IEN,3)="P" ; TYPE = P FOR PRIMARY KEY
 S FDA(TT,IEN,4)="Primary key header for "_INM ; COMMENT
 S PIEN=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR) D ERR^DMSQU(F,FI,"INDEX: PRIMARY KEY ELEMENT INSERT FAILED") Q
 S S=0,(K,P)="" F  S K=$O(IE(K)) Q:K=""  D
 . S S=S+1 D PKI(S,PIEN,$P(IGL,"{K}",S),IE(K),IC(K),.P)
 Q
PKI(S,PEI,G,E,C,P) ;BUILD COLUMN ELEMENT, COLUMN AND PRIMARY KEY ELEMENT
 N ICN,CI,CEI,PI,W,KFI S (CI,CEI,PI,KFI)="",W=$P(C,U,2)
 I W>30 S KFI=$O(^DMSQ("KF","B","LONG_CHARACTER",""))
 S PI=$O(^DMSQ("P","C",PEI,S,""))
 I PI S CI=$P($G(^DMSQ("P",PI,0)),U,2)
 I CI S CEI=$P($G(^DMSQ("C",CI,0)),U)
 S ICN=$P(E,U)
 ;BUILD COLUMN ELEMENT
 S TT=1.5216,IEN=$S(CEI:CEI,1:"+1")_","
 S FDA(TT,IEN,.01)=ICN ; COLUMN NAME
 S FDA(TT,IEN,1)=$P(E,U,2) ; DOMAIN ID
 S FDA(TT,IEN,2)=TIEN ; TABLE ID
 S FDA(TT,IEN,3)="C" ; TYPE = COLUMN
 S FDA(TT,IEN,4)="Index Primary Key #"_S_" for "_INM_"."_ICN
 S CEI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'CEI D ERR^DMSQU(F,FI,"INDEX: COLUMN ELEMENT INSERT FAILED") Q
 ;BUILD COLUMN
 S TT=1.5217,IEN=$S(CI:CI,1:"+1")_","
 S FDA(TT,IEN,.01)=CEI ; COLUMN ELEMENT ID
 I P S FDA(TT,IEN,8)=P ; PARENT POINTER
 S FDA(TT,IEN,9)=G ; GLOBAL FRAGMENT
 S CI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'CI D ERR^DMSQU(F,FI,"INDEX: COLUMN INSERT FAILED")
 ;BUILD PRIMARY KEY
 S TT=1.5218,IEN=$S(PI:PI,1:"+1")_","
 S FDA(TT,IEN,.01)=PEI ; PRIMARY KEY HEADER ID
 S FDA(TT,IEN,1)=CI ; COLUMN ID
 S FDA(TT,IEN,2)=S ; KEY SEQUENCE
 I KFI S FDA(TT,IEN,7)=KFI ; KEY FORMAT
 S PI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'PI D ERR^DMSQU(F,FI,"INDEX: PRIMARY KEY INSERT FAILED")
 S P=CI
 Q
T(F) Q $O(^DMSQ("T","C",F,""))

DMSQP
DMSQP ;SFISC/EZ-PRINT SQLI TABLE POINTERS ;10/30/97  16:49
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
EN1 ; in pointers (to this table from others)
 D DT^DICRW S DMQ="" D  D EXIT
 . D OK,ASK:'DMQ,CHK:'DMQ,PR1:'DMQ
 Q
EN2 ; out pointers (from this table out)
 D DT^DICRW S DMQ="" D  D EXIT
 . D OK,ASK:'DMQ,CHK:'DMQ,CHK1:'DMQ,PR2:'DMQ
 Q
OK ; check if okay to run
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! S DMQ=1 Q
 I $$WAIT^DMSQT1 D  S DMQ=1 Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 Q
ASK S DIC="1.5215",DIC(0)="QEAM" ; select starting-point table
 D ^DIC K DIC S DMY=+Y S:$D(DTOUT)!$D(DUOUT)!(Y=-1) DMQ=1
 Q
CHK I '$D(^DMSQ("E","F",DMY,"F")) S DMQ=1 W !,?5,"NO POINTERS",!
 Q
CHK1 ; check file access needed for navigation in PR2 report
 I DUZ(0)'="@" F DIFILE=1.5212 D  K DIAC
 . S DIAC="RD" D EN^DIAC S:'% DMQ=1
 D:DMQ 
 . W !!?5,"You need 'Read' access to one SQLI file to run this report."
 . W !?5,"It is file 1.5212."
 . W !!?5,"Contact your system manager to be granted single file access.",!
 Q
PR1 S DIC="1.5216",L=0 ; only foreign keys (screen-out primary)
 S DIS(0)="I '$D(^DMSQ(""E"",""E"",""P"",D0))"
 S DHD="TABLES POINTING TO "_$P(^DMSQ("T",DMY,0),U,1)
 S FLDS="""FROM TABLE: "";S;C5,!E_TABLE;X"
 S FLDS(1)="""VIA FOREIGN KEY: "";C5,E_NAME;X"
 S DMY1=$O(^DMSQ("DM","C",DMY,0))
 S BY(0)="^DMSQ(""E"",""C"",DMY1,",L(0)=1 D EN1^DIP
 Q
PR2 S DIC="1.5216",L=0
 S DHD="TABLES POINTED-TO BY "_$P(^DMSQ("T",DMY,0),U,1)
 S FLDS="""TO TABLE: "";S;C5,E_DOMAIN:,!DM_TABLE;X"
 S FLDS(1)="""VA FOREIGN KEY: "";C5,E_NAME;X"
 S BY(0)="DMSQ(""E"",""F"",DMY,""F"",",L(0)=1 D EN1^DIP
 Q
EXIT K DMY,DMY1,DMQ Q 

DMSQP1
DMSQP1 ;SFISC/EZ-PRINT SAMPLE SQLI STATS ;10/30/97  17:06
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
OK ; check if okay to run
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! S DMQ=1 Q 
 I $$WAIT^DMSQT1 D  S DMQ=1 Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 Q
EN1 ; print total regular tables
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI TABLE COUNT (EXCLUDING INDEX-TYPE)"
 S DIC="1.5215",L=0,FLDS="!T_NAME;""REGULAR TABLES"""
 S BY="3",(FR,TO)="@"
 D EN1^DIP K DMQ Q
EN2 ; print total columns
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI COLUMN COUNT FOR ALL TABLES"
 S DIC="1.5217",L=0,FLDS="!(#.01);""COLUMNS"""
 S BY="NUMBER",(FR,TO)=""
 D EN1^DIP K DMQ Q
EN3 ; print totals for indexes
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI INDEX COUNT (INDEX-TYPE TABLES)"
 S DIC="1.5215",L=0,FLDS="!T_NAME;""INDEXES"""
 S BY(0)="^DMSQ(""T"",""E"",",L(0)=2
 D EN1^DIP K DMQ Q
EN4 ; print totals for types of table elements
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI TABLE ELEMENT TYPE TOTALS"
 S DIC="1.5216",L=0,FLDS="!E_TYPE"
 S BY(0)="^DMSQ(""E"",""E"",",L(0)=2
 S DISPAR(0,1)="+^;""TYPE= "";C1;S"
 S DISPAR(0,1,"OUT")="S Y=$$EXTERNAL^DILFD(1.5216,3,,Y)"
 D EN1^DIP K DMQ Q
EN5 ; print totals for columns in tables
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI COLUMN TOTALS BY TABLE"
 S DIC="1.5216",L=0,FLDS="!(#.01);"""""
 S BY(0)="^DMSQ(""E"",""F"",",L(0)=3
 S DISPAR(0,1)="^;S;C1;""TABLE: """
 S DISPAR(0,1,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)"
 S DISPAR(0,2)="+^;",(FR(0,2),TO(0,2))="C"
 D EN1^DIP K DMQ Q
EN6 ; show totals of EN5 largest to smallest
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI TABLES SORTED BY TOTAL COLUMNS" K ^TMP("DMSQ",$J)
 S DM=0 F  S DM=$O(^DMSQ("E","F",DM)) Q:DM'>0  D
 . S DM1=0 F  S DM1=$O(^DMSQ("E","F",DM,DM1)) Q:DM1=""  D
 .. Q:DM1'="C"  S (DM2,DMC)=0
 .. F  S DM2=$O(^DMSQ("E","F",DM,DM1,DM2)) Q:DM2'>0  S DMC=DMC+1
 .. S:DMC DMC1=9999999-DMC,^TMP("DMSQ",$J,DMC1,DMC,DM)=""
 S DIC="1.5215",L=0,FLDS="T_NAME;C20"
 S BY(0)="^TMP(""DMSQ"",$J,",L(0)=3
 S DISPAR(0,2)="^;C1;S;""COLUMN COUNT:  """
 D EN1^DIP
 K DM,DM1,DM2,DMC,DMC1,^TMP("DMSQ",$J) Q
EN7 ; print total columns just for regular tables
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI COLUMN COUNT FOR REGULAR TABLES (EXCLUDING INDEXES)"
 S DIC="1.5217",L=0,FLDS="!(#.01);""COLUMNS"""
 S BY="NUMBER",(FR,TO)=""
 S DIS(0)="I '$P(^DMSQ(""T"",$P(^DMSQ(""E"",$P(^DMSQ(""C"",D0,0),U,1),0),U,3),0),U,4)"
 D EN1^DIP K DMQ Q
EN8 ; print total columns, regular tables, excluding Table_IDs
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI COLUMN COUNT, REGULAR TABLES, EXCLUDING TABLE_IDS"
 S DIC="1.5217",L=0,FLDS="!(#.01);""COLUMNS"""
 S BY(0)="^DMSQ(""C"",""D"",",L(0)=3
 D EN1^DIP K DMQ Q
EN9 ; print subtotals by domain for regular table columns
 S DMQ="" D OK I DMQ K DMQ Q
 S DHD="SQLI COLUMN COUNT BY DOMAIN (REGULAR TABLES, EXCLUDING TABLE_IDS)"
 S DIC="1.5216",L=0,FLDS="!(#.01);""COLUMNS"""
 S BY(0)="^DMSQ(""E"",""C"",",L(0)=2
 S DISPAR(0,1)="+^;""DOMAIN= "";C1;S"
 S DISPAR(0,1,"OUT")="S:Y Y=$P(^DMSQ(""DM"",Y,0),U,1)"
 S DIS(0)="I $P(^DMSQ(""E"",D0,0),U,4)'=""P"",$P($G(^DMSQ(""C"",D0,0)),U,5)"
 D EN1^DIP K DMQ Q

DMSQP2
DMSQP2 ;SFISC/EZ-PRINT SQLI'S DD INFORMATION ;10/30/97  17:29
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
EN ; for a single file or number range, show SQLI projection of fields
 S DMQ="" D CHK,CHK1:'DMQ,ASK:'DMQ,ASK1:'DMQ,PRT:'DMQ,EXIT Q
EN1 ; display file numbers below this one (subfiles)
 D INIT,CHK,ASK:'DMQ,ZIS:'DMQ,DN:'DMQ,EXIT Q
EN2 ; display file numbers above
 D INIT,CHK,ASK:'DMQ,ZIS:'DMQ,UP:'DMQ,EXIT Q
EN3 ; file number choices to use in EN, EN1, EN2
 D INIT,CHK,LST:'DMQ,EXIT Q
INIT S DMQ="" D DT^DICRW Q
ZIS D ^%ZIS S:POP DMQ=1 Q
EXIT K DMFN,DMFN1,DMX,DMX1,DMNODE,DMY,DM1,DM2,DMQ Q
CHK ; check for existence of SQLI data in DMSQ global
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! S DMQ=1 Q
 I $$WAIT^DMSQT1 D  S DMQ=1 Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 Q
 Q
CHK1 ; check file access needed for navigation in PRT report
 I DUZ(0)'="@" F DIFILE=1.5211,1.5212,1.5214,1.5216 D  K DIAC
 . S DIAC="RD" D EN^DIAC S:'% DMQ=1
 D:DMQ 
 . W !!?5,"You need 'Read' access to four SQLI files to run this report."
 . W !?5,"They are files 1.5211, 1.5212, 1.5214, and 1.5216."
 . W !!?5,"Contact your system manager to be granted single file access.",!
 Q
ASK ; select file numbers
 S DM1=$O(^DMSQ("T","C",0)),DM2=$O(^DMSQ("T","C",99999999999),-1)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="Starting File Number"
 S DIR("?")="Enter the number of the file, e.g. 200 or 1.5215"
 S DIR("B")=.401 D ^DIR S:$D(DIRUT) DMQ=1 K DIR Q:DMQ  S DMFN=Y
 I '$D(^DMSQ("T","C",DMFN)) W !,"SQLI table not found." G ASK
 Q
ASK1 S DIR("B")=DMFN ; default to one file (not a range)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="  Ending File Number"
 S DIR("?")="Optionally enter a larger number for a range, e.g. 1.5217"
 D ^DIR S:$D(DTOUT)!$D(DUOUT) DMQ=1 K DIR Q:DMQ  S DMFN1=Y
 I '$D(^DMSQ("T","C",DMFN1)) D  G ASK1
 . W !!?5,"There isn't a table for the file number you've entered."
 . W !?5,"(The highest possible number is "_DM2_".)",!
 I DMFN1'=DMFN,DMFN1'>DMFN D  G ASK1
 . W !!?5,"Enter a LARGER number to get a range."
 . W !?5,"The highest possible number here is "_DM2_".",!
 Q
PRT ; report
 S DIC="1.5217",L=0,DHD="SQLI PROJECTION OF FIELDS AS COLUMNS"
 S FLDS="INTERNAL(#4);C1;S;X,.01;C15;X,7;C15;X,5;C42;X,""C_COMPUTE: "";C20"
 S FLDS(1)="13;X,""C_FM_EXEC: "";C20,14;C31;X,""C_OUTPUT_FORMAT: "";C20"
 S FLDS(2)="16:.01;X,""OF_DATA_TYPE: "";C23,16:1;X"
 S FLDS(3)="""OF_EXT_EXPR: "";C24,16:3;C37;X,""E_DOMAIN: "";C15,.01:1:.01;X"
 S FLDS(4)="""DM_DATA_TYPE: "";C42,.01:1:1:.01;X"
 S FLDS(5)="""C_WIDTH/C_SCALE: "";C15,2;X,""/"";X,3;X"
 S FLDS(6)="""DM_WIDTH/DM_SCALE: "";C42,.01:1:4;X,""/"";X,.01:1:5;X"
 S BY(0)="^DMSQ(""C"",""D"",",L(0)=3,FR(0,1)=DMFN,TO(0,1)=DMFN1
 S DISPAR(0,1)="^;""SQLI TABLE NAME: "";S2"
 S DISPAR(0,1,"OUT")="S:Y Y=$O(^DMSQ(""T"",""C"",Y,0)) S Y=$P($G(^DMSQ(""T"",Y,0)),U,1)_"" (""_$P($G(^DMSQ(""T"",Y,0)),U,7)_"")"""
 D EN1^DIP Q
DN ; downward
 S DMX=$O(^DMSQ("T","C",DMFN,0)) ; get table ien
 S DMX=$O(^DMSQ("DM","C",DMX,0)) ; get domain ien (dm_table x-ref)
 S DMX=$P(^DMSQ("DM",DMX,0),U,1) ; get domain name
 S DMX1=0 F  S DMX1=$O(^DMSQ("E","B",DMX,DMX1)) Q:(DMQ)!(DMX1'>0)  D
 . S DMNODE=^DMSQ("T",$P(^DMSQ("E",DMX1,0),U,3),0)
 . Q:$P(DMNODE,U,4)  S DMY=$P(DMNODE,U,7)
 . I $Y+2>IOSL D PAGE I $D(DIRUT) S DMQ=1 Q
 . W !?5,DMY,?20,$$EXTERNAL^DILFD(1.5215,6,"",DMY)
 Q
UP ; upward
 S DMX=$O(^DMSQ("T","C",DMFN,0)) ; get table ien
 S DMX1=0 F  S DMX1=$O(^DMSQ("E","F",DMX,"F",DMX1)) Q:(DMQ)!(DMX1'>0)  D
 . S DMY=$P(^DMSQ("T",$P(^DMSQ("DM",$P(^DMSQ("E",DMX1,0),U,2),0),U,4),0),U,7)
 . I $Y+2>IOSL D PAGE I $D(DIRUT) S DMQ=1 Q
 . W !?5,DMY,?20,$$EXTERNAL^DILFD(1.5215,6,"",DMY)
 Q
PAGE I IOST["C-" S DIR(0)="E" D ^DIR K DIR W @IOF
 Q
LST ; list file names and SQLI tables by file number
 S DIC="1.5215",L=0,BY="@INTERNAL(#6);""FILE NUMBER: """
 S FLDS="INTERNAL(#6);""FILE#"";S,6;C15;L30;""FILEMAN FILE NAME"""
 S FLDS(1)=".01;C48;""SQLI TABLE NAME"""
 S DHD="SQLI TABLES BY FILE NUMBER"
 D EN1^DIP Q

DMSQP3
DMSQP3 ;SFISC/EZ-DISPLAY POINTER COUNTS ;10/30/97  17:42
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ; show individual table counts of links
 S DMQ="" D OK I DMQ K DMQ Q
 D PREASK I $D(DIRUT)!(DMQ) K DMQ Q
 D DT^DICRW,HOME^%ZIS
 D ASK D:'DMQ ASK1 D:'DMQ CLEAR,PAIRS,CNT,BUILD,PRT D EXIT Q
EN1 ; show summary counts of table links
 S DMQ="" D OK I DMQ K DMQ Q
 D PREASK I $D(DIRUT)!(DMQ) K DMQ Q
 D DT^DICRW,HOME^%ZIS D  D EXIT
 . D ASK2 Q:DMQ  D CLEAR,PAIRS,CNT,BUILD,TOTS
 . S DMDHD=$S(DMYN:"LISTING",1:"COUNTS")
 . S DMFLDS=$S(DMYN:"!INTERNAL(#6);"""",.01;""""",1:"!(#.01);""""")
 . S DMANS=""
 . F  D MENU Q:$D(DIRUT)  D READ Q:$D(DIRUT)!(DMANS=9)  D
 .. D:DMANS=1 PRT3^DMSQP4
 .. D:DMANS=2 PRT4^DMSQP4
 .. D:DMANS=3 PRT5^DMSQP4
 .. D:DMANS=4 PRT6^DMSQP4
 .. D:DMANS=5 PRT7^DMSQP4
 .. ; word-processing tables could be done calling PRT2^DMSQP4,
 .. ; see commented code in BUILD for some ideas about how.
 Q
MENU ; present a choice of reports, now that TMP arrays are built
 S DIR(0)="E" D ^DIR K DIR Q:$D(DIRUT)  W @IOF
 W !!!!!?9,"(1) SELF  Tables with Self-referential Pointers"
 W !?9,"(2) UP    Tables with Upward Links"
 W !?9,"(3) DOWN  Tables Linked from Below"
 W !?9,"(4) OUT   Tables Pointing Outward"
 W !?9,"(5) IN    Tables with Incoming Pointers"
 W !!?9,"(9) QUIT  Exit this Menu"
 W !! Q
READ ; reader for the menu
 S DIR(0)="SMA^1:SELF;2:UP;3:DOWN;4:OUT;5:IN;9:QUIT"
 S DIR("A")="Select a report: " D ^DIR S DMANS=Y K DIR
 Q
EXIT K DOT,DMANS,DMFILE,DMWP,DMFK,DMPFK,DMSR,DME,DMF,DMCOL,DMDM,DMYN
 K DMX,DMY,DMCT,DMBFK,DMBPFK,DMQ,DMFN,DMFN1,DMTBL,DMCI,DMEI,DMDI
 K DM1,DM2,DM3,DM4,DM5,DM6,DM7,DMDHD,DMFLDS
 K DMC1,DMC2,DMC3,DMC4,DMC5,DMC6,DMC7
 K DMCN2,DMCN3,DMCN4,DMCN5,DMCN6,DMCN7,DMCN8
CLEAR K ^TMP("DM",$J),^TMP("DMT",$J),^TMP("DMTN",$J)
 K ^TMP("DMP1",$J),^TMP("DMP2",$J)
 K ^TMP("DMCT1",$J),^TMP("DMCT2",$J),^TMP("DMFQ2",$J),^TMP("DMFQ3",$J)
 K ^TMP("DMFQ4",$J),^TMP("DMFQ5",$J),^TMP("DMFQ6",$J),^TMP("DMFQ7",$J)
 Q
OK ; check of okay to run
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! S DMQ=1 Q
 I $$WAIT^DMSQT1 D  S DMQ=1 Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 Q
PREASK ; confirm that it's okay to wait for interactive processing
 S DIR(0)="Y",DIR("A")="This can take 1-2 minutes.  Continue"
 S DIR("B")="NO" D ^DIR K DIR S:Y=0 DMQ=1
 Q
ASK ; select file numbers
 S DM1=$O(^DMSQ("T","C",0)),DM2=$O(^DMSQ("T","C",99999999999),-1)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="Starting File Number"
 S DIR("?")="Enter the number of the file, e.g. 200 or 1.5215"
 S DIR("B")=.401 D ^DIR S:$D(DIRUT) DMQ=1 K DIR Q:DMQ  S DMFN=Y
 I '$D(^DMSQ("T","C",DMFN)) W !,"SQLI table not found." G ASK
 Q
ASK1 S DIR("B")=DMFN ; default to one file (not a range)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="  Ending File Number"
 S DIR("?")="Optionally enter a larger number for a range, e.g. 1.5217"
 D ^DIR S:$D(DTOUT)!$D(DUOUT) DMQ=1 K DIR Q:DMQ  S DMFN1=Y
 I '$D(^DMSQ("T","C",DMFN1)) D  G ASK1
 . W !!?5,"There isn't a table for the file number you've entered."
 . W !?5,"(The highest possible number is "_DM2_".)",!
 I DMFN1'=DMFN,DMFN1'>DMFN D  G ASK1
 . W !!?5,"Enter a LARGER number to get a range."
 . W !?5,"The highest possible number here is "_DM2_".",!
 Q
ASK2 ; prompt for style of listing (summary counts or detail)
 S DIR("A")="These reports show counts.  Or would you prefer details"
 S DIR(0)="Y",DIR("B")="NO" D ^DIR K DIR S DMYN=Y S:$D(DIRUT) DMQ=1
 Q
BUILD ;
 S (DOT,DMFILE)=0
 F  S DMFILE=$O(^DMSQ("T","C",DMFILE)) Q:DMFILE'>0  D
 . S DOT=DOT+1 W:DOT#20=1 "."
 . S (DMWP,DMFK,DMPFK,DMSR)=0,DMX=$O(^DMSQ("T","C",DMFILE,0))
 . I '$D(^DMSQ("E","F",DMX,"F")) D DEFINE Q
 . ;word-processing domains are character, so DMWP never set
 . ;perhaps use dbs field retriever to get type (e.g. wp)
 . ;S DMCI=$O(^DMSQ("C","D",DMFILE,.01,0)) D:DMCI
 . ;. S DMEI=$P(^DMSQ("C",DMCI,0),U,1)
 . ;. S DMDI=$P(^DMSQ("E",DMEI,0),U,2)
 . ;. S:DMDI=$O(^DMSQ("DM","B","WORD_PROCESSING",0)) DMWP=DMWP+1
 . S DME=0 F  S DME=$O(^DMSQ("E","F",DMX,"F",DME)) Q:DME'>0  D
 .. S DMF=$O(^DMSQ("F","B",DME,0))
 .. S DMCOL=$P(^DMSQ("F",DMF,0),U,3)
 .. S:$P(^DMSQ("C",DMCOL,0),U,5) DMFK=DMFK+1
 .. S:'$P(^DMSQ("C",DMCOL,0),U,5) DMPFK=DMPFK+1
 .. S DMDM=$P(^DMSQ("E",DME,0),U,2)
 .. S DMY=$P(^DMSQ("DM",DMDM,0),U,4)
 .. S:DMX=DMY DMSR=DMSR+1
 .. D:$O(^DMSQ("E","F",DMX,"F",DME))="" DEFINE
 Q
DEFINE ;
 S DMBFK=0 S:$D(^TMP("DMCT1",$J,DMX))=1 DMBFK=^(DMX)
 S DMBPFK=0 S:$D(^TMP("DMCT2",$J,DMX))=1 DMBPFK=^(DMX)
 S ^TMP("DM",$J,DMFILE,DMWP,DMSR,DMPFK,DMBPFK,DMFK,DMBFK,DMX)=""
 Q
TOTS ;
 S (DOT,DM1,DMC1,DMC2,DMC3,DMC4,DMC5,DMC6,DMC7)=0
 S (DMCN2,DMCN3,DMCN4,DMCN5,DMCN6,DMCN7,DMCN8)=0
 F  S DM1=$O(^TMP("DM",$J,DM1)) Q:DM1=""  D
 . S DOT=DOT+1 W:DOT#20=1 "."
 . S DMTBL=$O(^DMSQ("T","C",DM1,0)),DMC1=DMC1+1,DM2=""
 . F  S DM2=$O(^TMP("DM",$J,DM1,DM2)) Q:DM2=""  D
 .. S ^TMP("DMFQ2",$J,999-DM2,DM2,DMTBL)=""
 .. S:DM2 DMCN2=DMCN2+1 S DMC2=DMC2+DM2,DM3=""
 .. F  S DM3=$O(^TMP("DM",$J,DM1,DM2,DM3)) Q:DM3=""  D
 ... S ^TMP("DMFQ3",$J,9999-DM3,DM3,DMTBL)=""
 ... S:DM3 DMCN3=DMCN3+1 S DMC3=DMC3+DM3,DM4=""
 ... F  S DM4=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4)) Q:DM4=""  D
 .... S ^TMP("DMFQ4",$J,DM2,9999-DM4,DM4,DMTBL)=""
 .... S:DM4 DMCN4=DMCN4+1 S DMC4=DMC4+DM4,DM5=""
 .... F  S DM5=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4,DM5)) Q:DM5=""  D
 ..... S ^TMP("DMFQ5",$J,9999-DM5,DM5,DMTBL)=""
 ..... S:DM5 DMCN5=DMCN5+1 S DMC5=DMC5+DM5,DM6=""
 ..... F  S DM6=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4,DM5,DM6)) Q:DM6=""  D
 ...... S ^TMP("DMFQ6",$J,9999-DM6,DM6,DMTBL)=""
 ...... S:DM6 DMCN6=DMCN6+1 S DMC6=DMC6+DM6,DM7=""
 ...... F  S DM7=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4,DM5,DM6,DM7)) Q:DM7=""  D
 ....... S ^TMP("DMFQ7",$J,9999-DM7,DM7,DMTBL)=""
 ....... S:DM7 DMCN7=DMCN7+1 S DMC7=DMC7+DM7
 ....... S:'(DM4+DM5+DM6+DM7) DMCN8=DMCN8+1
 S ^TMP("DMTN",$J,DMC1,DMCN2,DMCN3,DMCN4,DMCN5,DMCN6,DMCN7,DMCN8)=""
 S ^TMP("DMT",$J,DMC1,DMC2,DMC3,DMC4,DMC5,DMC6,DMC7)=""
 Q
PAIRS ; build array with to-table and from-tables that point
 S (DOT,DMFILE)=0 W !,"Please wait..."
 F  S DMFILE=$O(^DMSQ("T","C",DMFILE)) Q:DMFILE'>0  D
 . S DOT=DOT+1 W:DOT#20=1 "."
 . S DMX=$O(^DMSQ("T","C",DMFILE,0))
 . S DME=0 F  S DME=$O(^DMSQ("E","F",DMX,"F",DME)) Q:DME'>0  D
 .. S DMDM=$P(^DMSQ("E",DME,0),U,2)
 .. S DMY=$P(^DMSQ("DM",DMDM,0),U,4)
 .. S DMF=$O(^DMSQ("F","B",DME,0)) ; get foreign key ien
 .. S DMCOL=$P(^DMSQ("F",DMF,0),U,3) ; get column pointer
 .. I $P(^DMSQ("C",DMCOL,0),U,5) S ^TMP("DMP1",$J,DMY,DMX,DMF)=""
 .. E  S ^TMP("DMP2",$J,DMY,DMX)=""
 Q
CNT ; get reference counts
 S DM1=0 W "." F  S DM1=$O(^TMP("DMP1",$J,DM1)) Q:DM1'>0  D
 . S (DM2,DMCT)=0
 . F  S DM2=$O(^TMP("DMP1",$J,DM1,DM2)) Q:DM2'>0  D
 .. S DM3=0
 .. F  S DM3=$O(^TMP("DMP1",$J,DM1,DM2,DM3)) Q:DM3'>0  S DMCT=DMCT+1
 .. S ^TMP("DMCT1",$J,DM1)=DMCT
 S DM1=0 F  S DM1=$O(^TMP("DMP2",$J,DM1)) Q:DM1'>0  D
 . S (DM2,DMCT)=0
 . F  S DM2=$O(^TMP("DMP2",$J,DM1,DM2)) Q:DM2'>0  S DMCT=DMCT+1
 . S ^TMP("DMCT2",$J,DM1)=DMCT
 Q
PRT ;
 S DIC="1.5215",L=0,DHD="SQLI TABLE POINTER COUNTS"
 S FLDS="""SQLI TABLE NAME: "";C28;S,.01;X"
 S BY(0)="^TMP(""DM"",$J,",L(0)=8,FR(0,1)=DMFN,TO(0,1)=DMFN1
 S DISPAR(0,1)="^;""FILE/SUBFILE: "";C1;S"
 S DISPAR(0,1,"OUT")="S Y=Y_""  ""_$S($D(^DIC(Y)):$P(^(Y,0),U),1:$O(^DD(Y,0,""NM"",0)))"
 ;S DISPAR(0,2)="^;""WORD-PROCESSING TABLE? "";C50"
 ;S DISPAR(0,2,"OUT")="S Y=$S(+Y:""YES"",1:""NO"")"
 S DISPAR(0,3)="^;""SELF-REFERENTIAL POINTERS: "";C18"
 S DISPAR(0,4)="^;""POINTERS DOWNWARD TO THIS SUBFILE: "";C10;S"
 S DISPAR(0,5)="^;""POINTERS UPWARD FROM DEEPER SUBFILES: "";C7"
 S DISPAR(0,6)="^;""POINTERS OUTWARD TO OTHER FILES: "";C12;S"
 S DISPAR(0,7)="^;""POINTERS INWARD FROM OTHER FILES: "";C11"
 D EN1^DIP Q

DMSQP4
DMSQP4 ;ISCSF/EZ-POINTER COUNTS CONTINUED ;7/28/97  11:09
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PRT2 ;
 S DIC="1.5215",L=0,FLDS=DMFLDS
 S DHD="SQLI WORD-PROCESSING TABLE "_DMDHD_" - SUBSET OF SUBFILES"
 S BY(0)="^TMP(""DMFQ2"",$J,",L(0)=3
 S DISPAR(0,2)="+^;""WORD-PROCESSING? "";S;C1"
 S DISPAR(0,2,"OUT")="S Y=$S(+Y:""YES"",1:""NO"")"
 D EN1^DIP Q
PRT3 ;
 S DIC="1.5215",L=0,FLDS=DMFLDS
 S DHD="SQLI POINTING TABLE "_DMDHD_" - SELF-REFERENTIAL POINTERS"
 S BY(0)="^TMP(""DMFQ3"",$J,",L(0)=3
 S DISPAR(0,2)="+^;""TIMES POINTED-TO BY ITSELF: "";S;C1"
 D EN1^DIP Q
PRT4 ;
 S DIC="1.5215",L=0,FLDS=DMFLDS
 S DHD="SQLI POINTING TABLE "_DMDHD_" - UPWARD FROM THIS SUBFILE LEVEL"
 S BY(0)="^TMP(""DMFQ4"",$J,",L(0)=4
 ;S DISPAR(0,1)="+^;""WORD-PROCESSING? "";S;C8"
 ;S DISPAR(0,1,"OUT")="S Y=$S(+Y:""YES"",1:""NO"")"
 S DISPAR(0,3)="+^;""TIMES POINTING UPWARD (SUBFILE LEVELS): "";S;C1"
 D EN1^DIP Q
PRT5 ;
 S DIC="1.5215",L=0,FLDS=DMFLDS
 S DHD="SQLI POINTED-TO TABLE "_DMDHD_" - UP FROM ONE OR MORE SUBFILE LEVELS"
 S BY(0)="^TMP(""DMFQ5"",$J,",L(0)=3
 S DISPAR(0,2)="+^;""TIMES POINTED-TO FROM BELOW: "";S;C1"
 D EN1^DIP Q
PRT6 ;
 S DIC="1.5215",L=0,FLDS=DMFLDS
 S DHD="SQLI POINTING TABLE "_DMDHD_" (EXCLUDES SUBFILE POINTERS)"
 S BY(0)="^TMP(""DMFQ6"",$J,",L(0)=3
 S DISPAR(0,2)="+^;""TIMES POINTING (GOING OUTWARD): "";S;C1"
 D EN1^DIP Q
PRT7 ;
 S DIC="1.5215",L=0,FLDS=DMFLDS
 S DHD="SQLI POINTED-TO TABLE "_DMDHD_" (EXCLUDES SUBFILE POINTERS)"
 S BY(0)="^TMP(""DMFQ7"",$J,",L(0)=3
 S DISPAR(0,2)="+^;""TIMES POINTED-TO (COMING INWARD): "";S;C1"
 D EN1^DIP Q

DMSQP5
DMSQP5 ;SFISC/EZ-DD LISTING USING SQLI ;10/30/97  17:46
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
EN ; for a single file or number range, display DD information
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! Q
 I $$WAIT^DMSQT1 D  Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 D DT^DICRW S DMQ="" D ASK G EXIT:DMQ D ASK1 G EXIT:DMQ
 S %ZIS="Q" D ^%ZIS G EXIT:POP
 I $D(IO("Q")) D  G EXIT
 . S ZTRTN="DQ^DMSQP5",ZTSAVE("DMFN")="",ZTSAVE("DMFN1")=""
 . D ^%ZTLOAD
 D DQ
EXIT D ^%ZISC
 K DMFN,DMFN1,DM1,DM2,DMQ
 Q
ASK ; select file numbers
 W !,"WARNING:  REPORT JUST WRITES TO THE SCREEN WITHOUT PAGE BREAKS"
 W !,"          (INTENDED FOR SCREEN CAPTURES) SO PICK ONE TABLE"
 W !,"          OR A SMALL RANGE WHEN TESTING",!
 S DM1=$O(^DMSQ("T","C",0)),DM2=$O(^DMSQ("T","C",99999999999),-1)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="Starting File Number"
 S DIR("?")="Enter the number of the file, e.g. 200 or 1.5215"
 S DIR("B")=1.521 D ^DIR S:$D(DIRUT) DMQ=1 K DIR Q:DMQ  S DMFN=Y
 I '$D(^DMSQ("T","C",DMFN)) W !,"SQLI table not found." G ASK
 Q
ASK1 S DIR("B")=DMFN ; default to one file (not a range)
 S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="  Ending File Number"
 S DIR("?")="Optionally enter a larger number for a range, e.g. 1.5217"
 D ^DIR S:$D(DTOUT)!$D(DUOUT) DMQ=1 K DIR Q:DMQ  S DMFN1=Y
 I '$D(^DMSQ("T","C",DMFN1)) D  G ASK1
 . W !!?5,"There isn't a table for the file number you've entered."
 . W !?5,"(The highest possible number is "_DM2_".)",!
 I DMFN1'=DMFN,DMFN1'>DMFN D  G ASK1
 . W !!?5,"Enter a LARGER number to get a range."
 . W !?5,"The highest possible number here is "_DM2_".",!
 Q
DQ ; print DD information in file number order
 ; find file number links (from subfiles or pointers)
 U IO
 N DMQ,FI,TI,EI,CI,PEI,PI,FEI,FKI
 N GBL,PARLNK,LINK,PTRLNK,FLD,FLDGBL,ID,PIECE,EXTRACT,FN,DMSQTMP,TN,EN
 S DMQ="",FI=$O(^DMSQ("T","C",DMFN),-1)
 F  S FI=$O(^DMSQ("T","C",FI)) Q:(DMQ)!(FI>DMFN1)!(FI'>0)  D
 . S TI=0 F  S TI=$O(^DMSQ("T","C",FI,TI)) Q:(DMQ)!(TI'>0)  D
 .. S TN=$P(^DMSQ("T",TI,0),U,1)
 .. S (EI,GBL,PARLNK)=""
 .. F  S EI=$O(^DMSQ("E","F",TI,"C",EI)) Q:(DMQ)!(EI'>0)  D
 ... D PAGE I $D(DIRUT) S DMQ=1 Q
 ... D RPT
 Q
PAGE ; do page breaks if using a terminal (C-) device
 I ($Y+6>IOSL)&(IOST["C-") S DIR(0)="E" D ^DIR K DIR W @IOF
 Q
RPT ;
 I $P(^DMSQ("E",EI,0),U,2)=14 Q   ;exclude wp fields here
 ;include the subfiles created from wp fields later on
 S EN=$P(^DMSQ("E",EI,0),U,1)
 S (LINK,PTRLNK,FLD,FLDGBL,ID)=""
 S CI=$O(^DMSQ("C","B",EI,""))
 S PEI=$O(^DMSQ("E","F",TI,"P",""))
 S PI="" F  S PI=$O(^DMSQ("P","B",PEI,PI)) Q:PI'>0  D
 . I CI=$P(^DMSQ("P",PI,0),U,2) D
 .. S GBL=GBL_^DMSQ("C",CI,1)_"{K}",ID=1
 S FEI=0 F  S FEI=$O(^DMSQ("E","F",TI,"F",FEI)) Q:FEI'>0  D
 . S FKI=$O(^DMSQ("F","B",FEI,""))
 . I FKI,CI=$P(^DMSQ("F",FKI,0),U,3) D
 .. S LINK=$P(^DMSQ("T",$P(^DMSQ("DM",$P(^DMSQ("E",FEI,0),U,2),0),U,4),0),U,7)
 .. S:ID PARLNK=LINK S:'ID PTRLNK=LINK
 Q:ID  D   ;just process non-ID columns (regular fields)
 . S FLD=$P(^DMSQ("C",CI,0),U,6) I $D(^DMSQ("C",CI,1)) D
 .. S FLDGBL=GBL_^DMSQ("C",CI,1)
 .. S PIECE=$P(^DMSQ("C",CI,0),U,11)
 .. S EXTRACT=$P(^DMSQ("C",CI,0),U,12)_","_$P(^(0),U,13)
 .. S:PIECE FLDGBL="$P("_FLDGBL_",U,"_PIECE_")"
 .. S:EXTRACT FLDGBL="$E("_FLDGBL_","_EXTRACT_")"
 D FIELD^DID(FI,FLD,"","LABEL;TYPE","DMSQTMP")
 S FN=$S($D(^DIC(FI)):$P(^(FI,0),U),1:$O(^DD(FI,0,"NM","")))
 W !,FI_" "_FN,!?($L(FI)-3),"TBL:"_TN
 W !?10,FLD_" "_$G(DMSQTMP("LABEL")),!?($L(FLD)+7),"COL:"_EN
 W !?20,$G(DMSQTMP("TYPE"))
 W:PTRLNK ?32,"TO: "_PTRLNK
 W:PARLNK ?52,"SUBFILE OF: "_PARLNK
 W !?20,FLDGBL
 Q

DMSQP6
DMSQP6 ;SFISC/EZ-DISPLAY TABLE GROUPINGS ;10/30/97  17:51
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
INIT ; initialize variables and clear tmp arrays
 D DT^DICRW
 S DMUCI="" I $D(^%ZOSF("UCI"))#2 X ^%ZOSF("UCI") S DMUCI=Y
CLEAR K ^TMP("DMPAIRS",$J),^TMP("DMCNT",$J),^TMP("DMLIST",$J)
 K ^TMP("DMFLAT",$J),^TMP("DMFIN",$J),^TMP("DMSHR",$J)
 Q
EXIT ; kill vars
 K DMANS,DMFILE,DMFTIEN,DMTTIEN,DMFK,DMDM,DMTR,DM3,J
 K DMCT,DM,DM1,DM2,DMX,DMX1,DMGRP,DMGCNT,DMG,DMAX,DMT,DMTOT,DMQ
 K DMSHRC,DMUCI,DMSPEC,DMSPECN,DMSPECG,DMQQ
 Q
PREASK ; confirm that it's okay to wait for interactive processing
 S DIR(0)="Y",DIR("A")="This can take 5-10 minutes.  Continue"
 S DIR("B")="NO" D ^DIR K DIR S:Y=0 DMQQ=1
 Q
ASK ; ask for a cutoff on pointed-to file references
 S DIR(0)="NO^0:1000",DIR("A")="Maximum pointing references",DIR("B")=5
 S DIR("?",1)="This cutoff is used as an upper limit on pointer links.  Tables with"
 S DIR("?",2)="more links than this upper limit are displayed as the set of shared tables.",DIR("?",3)=" "
 S DIR("?",4)="Others with common pointer links are then grouped together.  The resulting"
 S DIR("?",5)="subsets could be used in SQL Grant statements.",DIR("?",6)=" "
 S DIR("?")="Try using cutoffs between 3 and 10, comparing results."
 D ^DIR K DIR S DMANS=Y S:$D(DIRUT) DMQQ=1
 Q
ASK1 ; ask for a specific table of interest
 S DIC="1.5215",DIC(0)="QEAM",DIC("S")="I '$P(^(0),U,4)"
 S DIC("A")="Select a Table of Special Interest (Optional): "
 D ^DIC K DIC S DMSPEC=$S(Y=-1:"",1:+Y) S:$D(DTOUT)!$D(DUOUT) DMQQ=1
 S:DMSPEC DMSPECN=$P(^DMSQ("T",DMSPEC,0),U,1) S DMSPECG=""
 Q
EN ; find groups of tables that point to one another
 I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! Q
 I $$WAIT^DMSQT1 D  Q
 . W !?5,"Try later.  SQLI is being re-built right now."
 S DMQQ="" D PREASK I $D(DIRUT)!(DMQQ) K DMQQ Q
 D  D CLEAR,EXIT
 . D INIT,ASK Q:DMQQ  D ASK1 Q:DMQQ
 . D PAIRS,CNT,OTH,GRP,PRT D:DMSPEC PRT3 D PRT2
 Q
PRT ; print shared table list
 W !!,?9,"LISTING OF SHARED TABLES"
 S DIC="1.5215",L=0
 S DHD="SHARED TABLES = "_DMSHRC_"  (CUTOFF OF "_DMANS_")   "_DMUCI
 S FLDS=".01;C5;"""","" (""_INTERNAL(#6)_"")"";X"
 S BY(0)="^TMP(""DMSHR"",$J,",L(0)=2
 D EN1^DIP Q
PRT1 ; detailed report showing pointer links within groups
 W !!,?9,"DETAILED GROUP REPORT"
 S DIC="1.5215",L=0
 S DHD="DETAIL OF GROUPS = "_DMGCNT_"  (CUTOFF OF "_DMANS_")   "_DMUCI
 S FLDS="""FROM TABLE: "";C5,.01;X,"" (""_INTERNAL(#6)_"")"";X"
 S BY(0)="^TMP(""DMLIST"",$J,",L(0)=3
 S DISPAR(0,1)="^;""GROUP: "";S2"
 S DISPAR(0,1,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
 S DISPAR(0,2)="^;""TO TABLE: "";S;C1"
 S DISPAR(0,2,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
 D EN1^DIP Q
PRT2 ; print final list of tables by group
 W !!,?9,"COMPLETE REPORT OF ALL GROUPS"
 S DIC="1.5215",L=0
 S DHD="TABLE GROUPS = "_DMGCNT_"  (CUTOFF OF "_DMANS_")   "_DMUCI
 S FLDS=".01;C5;"""","" (""_INTERNAL(#6)_"")"";X"
 S BY(0)="^TMP(""DMFIN"",$J,",L(0)=4
 S DISPAR(0,2)="^;""TABLE COUNT="";C1;S2"
 S DISPAR(0,3)="^;""GROUP: "";C15"
 S DISPAR(0,3,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
 D EN1^DIP Q
PRT3 ; just show the group that includes the specified table
 W !!,?9,"PRINT OF JUST ONE GROUP (INCLUDING THE SPECIFIED TABLE)"
 I 'DMSPECG&$D(^TMP("DMCNT",$J,DMSPEC)) W !!,"The selected table doesn't fall in a group; see the shared set." Q
 I 'DMSPECG W !!,"There isn't a group for the selected table; it doesn't have pointer links." Q
 S DIC="1.5215",L=0
 S DHD="GROUP INCLUDING "_DMSPECN_"  (CUTOFF OF "_DMANS_")   "_DMUCI
 S FLDS=".01;C5;"""","" (""_INTERNAL(#6)_"")"";X"
 S BY(0)="^TMP(""DMFIN"",$J,",L(0)=4
 S DISPAR(0,2)="^;""TABLE COUNT="";C1;S2"
 S DISPAR(0,3)="^;""GROUP: "";C15",(FR(0,3),TO(0,3))=DMSPECG
 S DISPAR(0,3,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
 D EN1^DIP Q
PAIRS ; build array with to-table and from-tables that link
 S DMFILE=0
 W !,"...... Please wait.  Reports take a few minutes to process ...... "
 F  S DMFILE=$O(^DMSQ("T","C",DMFILE)) Q:DMFILE'>0  D
 . S DMFTIEN=$O(^DMSQ("T","C",DMFILE,0))
 . S DMFK=0
 . F  S DMFK=$O(^DMSQ("E","F",DMFTIEN,"F",DMFK)) Q:DMFK'>0  D
 .. S DMDM=$P(^DMSQ("E",DMFK,0),U,2)
 .. S DMTTIEN=$P(^DMSQ("DM",DMDM,0),U,4)
 .. S:(DMTTIEN'=DMFTIEN) ^TMP("DMPAIRS",$J,DMTTIEN,DMFTIEN)=""
 Q
CNT ; get reference counts
 S DM1=0
 F  S DM1=$O(^TMP("DMPAIRS",$J,DM1)) Q:DM1'>0  D
 . S DM2=0,DMCT=0,DMFILE=$P(^DMSQ("T",DM1,0),U,7)
 . F  S DM2=$O(^TMP("DMPAIRS",$J,DM1,DM2)) Q:DM2'>0  D
 .. S DMCT=DMCT+1
 . S ^TMP("DMCNT",$J,DM1)=DMCT
 Q
GRP ; group the sets of shared tables
 S DMGRP=0
 F  S DMGRP=$O(^TMP("DMPAIRS",$J,DMGRP)) Q:DMGRP'>0  W "." D
 . K DMSCR S DMSCR(DMGRP)="" F J=1:1:5 D
 .. S DM1=0 F  S DM1=$O(^TMP("DMPAIRS",$J,DM1)) Q:DM1'>0  D
 ... S DM2=0 F  S DM2=$O(^TMP("DMPAIRS",$J,DM1,DM2)) Q:DM2'>0  D
 .... S (DMX,DMQ)=0
 .... F  Q:DMQ  S DMX=$O(DMSCR(DMX)) Q:DMX'>0  D
 ..... S:DMX=DM1 DMSCR(DM2)="",DMQ=1
 ..... S:DMX=DM2 DMSCR(DM1)="",DMQ=1
 .... I DMQ D
 ..... S ^TMP("DMLIST",$J,DMGRP,DM1,DM2)=""
 ..... S ^TMP("DMFLAT",$J,DMGRP,DM1)="",^TMP("DMFLAT",$J,DMGRP,DM2)=""
 ..... K ^TMP("DMPAIRS",$J,DM1,DM2)
 S (DMGCNT,DM)=0
 F  S DM=$O(^TMP("DMLIST",$J,DM)) Q:DM'>0  S DMGCNT=DMGCNT+1
 S DM=0 F  S DM=$O(^TMP("DMFLAT",$J,DM)) Q:DM'>0  D
 . S (DMX,DMT,DMAX)=0 F  S DMX=$O(^TMP("DMFLAT",$J,DM,DMX)) Q:DMX'>0  D
 .. S DMTOT=$G(^TMP("DMCNT",$J,DMX)),DMT=DMT+1
 .. I DMTOT>DMAX S DMAX=DMTOT,DMG=DMX
 . S DMX1=0 F  S DMX1=$O(^TMP("DMFLAT",$J,DM,DMX1)) Q:DMX1'>0  D
 .. S DMTR=99999999-DMT,^TMP("DMFIN",$J,DMTR,DMT,DMG,DMX1)=""
 .. S:DMSPEC=DMX1 DMSPECG=DMG
 Q
OTH ; process with other factor, i.e. cutoff on pointer link limit
 S (DM1,DMSHRC)=0,^TMP("DMSHR",$J,0,0)=""
 F  S DM1=$O(^TMP("DMPAIRS",$J,DM1)) Q:DM1'>0  D
 . I $G(^TMP("DMCNT",$J,DM1))>DMANS D
 .. S DM2=0,DMSHRC=DMSHRC+1
 .. S ^TMP("DMSHR",$J,99999-($G(^TMP("DMCNT",$J,DM1))),DM1)=""
 .. F  S DM2=$O(^TMP("DMPAIRS",$J,DM1,DM2)) Q:DM2'>0  D
 ... K ^TMP("DMPAIRS",$J,DM1,DM2)
 .. S DM2=0 F  S DM2=$O(^TMP("DMPAIRS",$J,DM2)) Q:DM2'>0  D
 ... S DM3=0 F  S DM3=$O(^TMP("DMPAIRS",$J,DM2,DM3)) Q:DM3'>0  D
 .... I DM1=DM3 K ^TMP("DMPAIRS",$J,DM2,DM3)
 Q

DMSQS
DMSQS ;SFISC/JHM-BUILD STANDARD SCHEMA ;7/31/97  13:55
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
SCHEMA ;BUILD OR REPLACE SQLI SCHEMA
 N SI,TT,IEN,FDA
 S SI=$O(^DMSQ("S","B","SQLI",""))
 S TT=1.521,IEN=$S(SI:SI,1:"+1")_","
 S FDA(TT,IEN,.01)="SQLI" ; SCHEMA NAME
 S FDA(TT,IEN,2)="FileMan SQL/ODBC interface tables" ; COMMENT
 S SI=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'SI D ERR^DMSQU(1.521,"","SCHEMA: RECORD INSERT FAILED")
 Q
ALLS Q:$G(DUZ(0))'["@"  N TI,@$$NEW^DMSQU D ENV^DMSQU S TI=0
 F  S TI=$O(^DMSQ("T",TI)) Q:'TI  D STEXE
 Q
STATS(TI) ;DO NODE STATISTICS FOR TABLE TI
 Q:$G(DUZ(0))'["@"  ;NOT FOR NON-PROGRAMMERS
 Q:'$D(^DMSQ("T",TI,0))  ;NO GLOBAL STRUCTURE ON FILE
 N @$$NEW^DMSQU D ENV^DMSQU
STEXE N T,MT,G,G0,CND,K,O,INI,C,MC,I,CT,TT,IEN,FDA,ERR,PI,PEI,F
 S T=^DMSQ("T",TI,0),MT=$P(T,U,4),(G0,G)=$G(^(1)) Q:G=""
 S CND=$S(MT:"K(OI)]""""",1:"K(OI)"),INI=$S(MT:"",1:0),MC=5000
 S (CT,O)=0,F="{K}" F  Q:G'[F  D
 . S O=O+1,K="K("_O_")"
 . S G(O)=$P(G,F)_K_")",C(O)=0,G=$P(G,F)_K_$P(G,F,2,9)
 S K(1)=INI D CNT(1)
 I CT=MC S OI=1 D
 . F I=2:1:O S C(I)=C(I)/C(1)
 . F  S K(1)=$O(@G(1)),@("K="_CND) Q:'K  S C(1)=C(1)+1
 . F I=2:1:O S C(I)=C(I)*C(1) I C(I)["." D
 . . S C(I)=$S(C(I)<10:+$J(C(I),"",2),C(I)<100:+$J(C(I),"",1),1:C(I)\1)
 K ^STATS(TI) M ^STATS(TI)=C ;REMOVE AFTER DEBUG
 ;STORE T_ROW_COUNT IN SQLI_TABLE
 S TT=1.5215,IEN=TI_"," K FDA
 S FDA(TT,IEN,5)=C(O) ;NUMBER OF ROWS IN TABLE
 S C=$$PUT^DMSQU(IEN,"FDA","ERR")
 I $D(ERR)!'C D ERR^DMSQU(TT,"","STATS: RECORD INSERT FAILED")
 ;STORE P_ROW_COUNT IN SQLI_PRIMARY_KEY
 S TT=1.5218,PEI=$O(^DMSQ("E","D",TI,"")),PI=0
 F I=1:1 S PI=$O(^DMSQ("P","B",PEI,PI)) Q:'PI  D
 . S IEN=PI_"," K FDA
 . S FDA(TT,IEN,5)=C(I) ;ESTIMATED ROW COUNT FOR THIS LEVEL
 . S C=$$PUT^DMSQU(IEN,"FDA","ERR")
 . I $D(ERR)!'C D ERR^DMSQU(TT,5,"STATS: KEY COUNT INSERT FAILED")
 Q
CNT(OI) ;ACCUMULATE NODE COUNT
 F  S K(OI)=$O(@G(OI)) D  Q:'OI
 . I @CND D
 . . S CT=CT+1,C(OI)=C(OI)+1 I CT=MC S OI=0
 . . E  I OI<O S OI=OI+1,K(OI)=INI
 . E  S OI=OI-1
 Q
EP ;EDIT PROTECT ALL SQLI FILES
 Q:$G(DUZ(0))'="@"  N DMF,DMFI W !,"EDIT-PROTECTING SQLI FILES..."
 S DMF=1.520
 F  S DMF=$O(^DD(DMF)) Q:DMF>1.52192  S DMFI=0 W DMF D
 . F  S DMFI=$O(^DD(DMF,DMFI)) Q:'DMFI  D
 . . W ?10,DMFI,?20,$G(^DD(DMF,DMFI,9))
 . . S ^(9)="^" W "->^",!
 W "Done" Q
EU ;EDIT UNPPROTECT ALL SQLI FILES
 Q:$G(DUZ(0))'="@"  N DMF,DMFI W !,"EDIT-UNPROTECTING SQLI FILES..."
 S DMF=1.520
 F  S DMF=$O(^DD(DMF)) Q:DMF>1.52192  S DMFI=0 W DMF D
 . F  S DMFI=$O(^DD(DMF,DMFI)) Q:'DMFI  D
 . . W ?10,DMFI,?20,$G(^DD(DMF,DMFI,9))
 . . S ^(9)="@" W "->@",!
 W "Done" Q

DMSQT
DMSQT ;SFISC/EZ-TROUBLE SHOOTING ;11/13/97  12:25
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ; DMQ - status flag for flow of control
 ; DMTDATE, DMEDATE - dates when Tables and Errors last updates
 ; DMLTBL - last table
 ; DMLFILE, DMNFILE - last file being processed, next one to be done
 ; DMLCOL, DMCNODE - last column processed, that column's node
 ; DMLCTE, DMLCTBL - last column's table element and table
 ; DMLCFILE, DMLCFLD - the last column's file and field reference
 ; DMNCFLD - what would be the next column's field reference
 ; (using ^DD to see what field is coming up next for processing)
 ; DMNCFILE - what would be the next column's file reference
 ; DMPARENT - parent to a subfile, may itself be a subfile
 ; DMTOPFLD - the top (upper) level field number for a subfile
 ; DMNXTFLD - the next field in the upper file to be processed
 ; DMNEXTF - the next file to be processed, coming up a subfile path
 ; DMNEXTSF - the next subfile to be processed, up from a subfile path
 ; DMNAME - the name of a file or subfile
 ; DMLFK, DMLFKTE - last foreign key, and it's last table element
 ; DMFKTBL - foreign key table, pointer from table element record
 ; DMPKTE - primary key table element record
 ; DMKEYS, DMC - keys (primary keys), and a counter
 ; DMFKFILE - foreign key file, the table element pointer
 ; DMASTER - the master table for this index table
 ; DMLO, DMLOF - where SQLI left off when building index tables
 ; So DMLO would be the last regular table where SQLI left off
 ; and DMLOF would be that table's file number.
EN ; main driver logic
 ; follows flow of ALLF^DMSQF, checking that each step completed
 I $$WAIT^DMSQT1 D  Q
 . W !?5,"Try again later.  An SQLI projection is running right"
 . W !?5,"now.  It might take a few hours to finish, but then you"
 . W !?5,"can try again and get a final status report."
 S %ZIS="QM" D ^%ZIS Q:POP
 I $D(IO("Q")) D  Q
 . S ZTRTN="DQ^DMSQT",ZTDESC="SQLI DIAGNOSTICS REPORT"
 . D ^%ZTLOAD D HOME^%ZIS K IO("Q")
DQ U IO D INIT D
 . D DATE
 . D SCHEMA D PAGE Q:$D(DIRUT)
 . D A D PAGE Q:$D(DIRUT)
 . D B D PAGE Q:$D(DIRUT)
 . D C D PAGE Q:$D(DIRUT)
 . D D D PAGE Q:$D(DIRUT)
 D @$S($D(DIRUT):"EXIT",DMQ=1:"DONE",DMQ=2:"ERROR",1:"EXIT")
 D ^%ZISC S:$D(ZTQUEUED) ZTREQ="@"
 Q
INIT ; initialize variables
 S DMQ="" D DT^DICRW
 S DMTDATE=$P($G(^DMSQ("T",1,0)),U,8)
 S DMEDATE=$O(^DMSQ("EX","D",0))
 S DMLTBL=$O(^DMSQ("T",999999999999999999999999),-1)
 S DMLCOL=$O(^DMSQ("C",999999999999999999999999),-1)
 S DMLFK=$O(^DMSQ("F",999999999999999999999999),-1)
 Q
PAGE K DIRUT I $Y+4>IOSL S DIR(0)="E" D:IOST["C-" ^DIR W @IOF
 Q
DATE ; check when projection run, compare with today
 S Y=DT D DD^%DT W !?10,"          TODAY'S DATE: ",Y,!
 I 'DMTDATE D
 . W !?5,"No date associated with first SQLI Table record."
 I 'DMEDATE D
 . W !?5,"No dates found in the SQLI Error Log."
 I DMTDATE'=DMEDATE D
 . W !?5,"Different dates on Table and Error Log files."
 S Y=DMTDATE D DD^%DT W !?10,"LAST SQLI TABLE UPDATE: ",Y
 S Y=DMEDATE D DD^%DT W !?10,"LAST SQLI ERROR UPDATE: ",Y,!
 ;I DMTDATE,DMEDATE,DT'=DMTDATE,DT'=DMEDATE D
 I (DMTDATE!DMEDATE)&(DT'=DMTDATE!(DT'=DMEDATE)) D
 . W !?5,"SQLI was run in the past.  DDs may have changed since then.",!
 Q
SCHEMA ; check if schema node set
 I '$O(^DMSQ("S",0)) S DMQ=2 D  Q
 . W !?5,"No SQLI Schema records.  Has the SQLI projection been run?"
 Q
A ; were all regular tables built?
 I 'DMLTBL S DMQ=2 D  Q
 . W !!?5,"No records in the SQLI Table file."
 I $P(^DMSQ("T",DMLTBL,0),U,4) D  Q
 . W !?5,"All regular tables appear to have been built."
 S DMLFILE=$P(^DMSQ("T",DMLTBL,0),U,7) I 'DMLFILE S DMQ=2 Q
 ;. W !!?5,"Not all files appear to have been built as tables."
 W !?5,"The last regular file to be processed was ",DMLFILE,"."
 S DMNFILE=+$O(^DIC(DMLFILE)) I DMNFILE S DMQ=2 D  Q
 . W !?5,"The next one, file ",DMNFILE," may be the problem."
 . D BADFILE(DMNFILE)
 S DMNFILE=+$O(^DD(DMLFILE)) I DMNFILE S DMQ=2 D  Q
 . I $D(^DD(DMNFILE,0,"UP")) D
 .. W !?5,"The next one, subfile ",DMNFILE," may be the problem."
 .. D BADFILE(DMNFILE)
 Q
B ; were all columns built?
 I 'DMLCOL S DMQ=2 D  Q
 . W !!?5,"No records in the SQLI Column file."
 S DMLCTE=$P(^DMSQ("C",DMLCOL,0),U,1)
 S DMLCTBL=$P($G(^DMSQ("E",DMLCTE,0)),U,3)
 I DMLCTBL=DMLTBL D  Q
 . W !!?5,"Columns have been built for the last table processed."
 S DMQ=2 D
 . W !!?5,"It looks like not all columns were processed."
 S DMCNODE=^DMSQ("C",DMLCOL,0)
 S DMLCFILE=$P(DMCNODE,U,5),DMLCFLD=$P(DMCNODE,U,6)
 I DMLCFILE,DMLCFLD D
 . W !?5,"The last file processed was ",DMLCFILE,"."
 . W !?5,"The last field processed was ",DMLCFLD,"."
 . S DMNCFLD=$O(^DD(DMLCFILE,DMLCFLD)) I +DMNCFLD D  Q
 .. W !!?5,"The next field to be processed looks like ",DMNCFLD,"."
 .. D BADFILE(DMLCFILE)
 . I $D(^DIC(DMLCFILE)) S DMNCFILE=$O(^DIC(DMLCFILE)) I +DMNCFILE D  Q
 .. W !?5,"Having finished with all fields of ",DMLCFILE,", SQLI was probably"
 .. W !?5,"trying to process ",DMNCFILE,", the next file."
 .. D BADFILE(DMNCFILE)
 . S DMPARENT=$G(^DD(DMLCFILE,0,"UP")) I DMPARENT D
 .. W !?5,"The last one (",DMLCFILE,") is a subfile of ",DMPARENT,"."
 .. S DMTOPFLD=$O(^DD(DMPARENT,"SB",DMLCFILE,0))
 .. W !?5,"It is field ",DMTOPFLD," of file ",DMPARENT,"."
 .. S DMNXTFLD=$O(^DD(DMPARENT,DMTOPFLD)) I +DMNXTFLD D
 ... W !?5,"The next field to be processed looks like ",DMNXTFLD,"."
 ... D BADFILE(DMPARENT)
 .. I '+DMNXTFLD D
 ... W !?5,"That looks like the last field in ",DMPARENT,"."
 ... I $D(^DIC(DMPARENT)) D  Q
 .... S DMNEXTF=$O(^DIC(DMPARENT)) I +DMNEXTF D
 ..... W !?5,"The next file to be processed looks like ",DMNEXTF,"."
 ..... D BADFILE(DMNEXTF)
 ... S DMNEXTSF=$G(^DD(DMPARENT,0,"UP")) I DMNEXTSF D  Q
 .... W !?5,"The next subfile to be processed looks like ",DMNEXTSF,"."
 .... D BADFILE(DMNEXTSF)
 Q
BADFILE(NUM) ;
 S DMNAME=$P($G(^DIC(NUM,0)),U,1)
 I 'DMNAME S DMNAME=$O(^DD(NUM,0,"NM",0))
 D PAGE Q:$D(DIRUT)
 W !!?5,"SUGGESTION: Investigate this file/subfile as the potential"
 W !?5,"source of the problem.  That's:  ",NUM,"  ",DMNAME,!
 Q
C ; were all foreign keys built?
 I 'DMLFK S DMQ=2 D  Q
 . W !!?5,"No foreign key records have been built."
 S DMLFKTE=$O(^DMSQ("E","E","F",999999999999),-1)
 I 'DMLFKTE S DMQ=2 D  Q
 . W !?5,"No table elements have been built for foreign keys."
 S DMFKTBL=$P(^DMSQ("E",DMLFKTE,0),U,3)
 S DMPKTE=$O(^DMSQ("E","F",DMFKTBL,"P",0))
 S (DMKEYS,DMC)=0
 F  S DMKEYS=$O(^DMSQ("P","B",DMPKTE,DMKEYS)) Q:DMKEYS=""  S DMC=DMC+1
 S DMFKFILE=$P(^DMSQ("T",DMFKTBL,0),U,7)
 I DMC>1 D  Q
 . W !!?5,"All regular foreign keys have been built (FKs)."
 . W !?5,"Parent foreign keys (PFKs) have also been built, the"
 . W !?5,"last one being for file/subfile ",DMFKFILE,"."
 I DMC'>1 S DMQ=2 D  Q
 . W !!?5,"Only regular foreign keys (FKs) have been processed."
 . W !?5,"The last was for file/subfile ",DMFKFILE,"."
 Q
D ; were all index tables built?
 I 'DMLTBL S DMQ=2 D  Q
 . W !!?5,"No records for SQLI index tables."
 S DMASTER=$P(^DMSQ("T",DMLTBL,0),U,4) I 'DMASTER S DMQ=2 D  Q
 . W !!?5,"Index tables don't appear to have been built."
 S DMLO=$O(^DMSQ("T",DMASTER)) I 'DMLO S DMQ=2 Q
 S DMLOF=$P(^DMSQ("T",DMLO,0),U,7) I DMLOF D
 . ; find out if any indexes remain to be processed
 . S DMLOOP=DMASTER F  S DMLOOP=$O(^DMSQ("T",DMLOOP)) Q:DMLOOP'>0  D
 .. Q:$P(^DMSQ("T",DMLOOP,0),U,4)
 .. S:$$IDX^DMSQT1(DMLOOP) DMQ=2
 I DMQ=2 W !!?5,"Index processing stopped at file ",DMLOF,"." Q
 S DMQ=1
 W !!?5,"All index tables appear to have been built.  The last was for"
 W !?5,"file/subfile ",$P(^DMSQ("T",DMASTER,0),U,7),"."
 Q
DONE ; come here if all checks succeed
 W !!?5,"No problems detected in SQLI data structures themselves.",!
 Q
ERROR ; come here on error
 W !!?5,"Problems found in SQLI data structures."
 W !?5,"---------------------------------------"
 W !?5,"See SQLI Site Manual, trouble-shooting section, for ideas about"
 W !?5,"how to investigate the problem.  For example, RUNONE^DMSQ may be"
 W !?5,"used to explore a potential problem file."
 Q
EXIT K DMQ,DMTDATE,DMEDATE,DMLTBL,DMLFILE,DMNFILE
 K DMLCOL,DMLCTE,DMLCTBL,DMCNODE,DMLCFILE,DMLCFLD,DMNCFLD
 K DMNCFILE,DMPARENT
 K DMTOPFLD,DMNXTFLD,DMNEXTF,DMNEXTSF,DMNAME,DMLFK,DMLFKTE,DMFKTBL
 K DMPKTE,DMKEYS,DMC,DMFKFILE,DMASTER,DMLO,DMLOF,DMLOOP
 Q

DMSQT1
DMSQT1 ;SFISC/EZ-STATUS CHECK ;11/13/97  12:08
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
WAIT() ; extrinsic function, checks if SQLI is running (you must wait)
 ; returns 1 if nodes in ^DMSQ are changing, null otherwise
 D DT^DICRW N J,FLG,DM S FLG=""
 D SET H 2 D CHK
 I FLG Q 1
 E  Q ""
SET ; set the DM array with current record counts
 S J=""
 F  S J=$O(^DMSQ(J)) Q:J=""  S DM(J)=$P(^(J,0),U,3)
 Q
CHK ; check whether the counts have changed
 S J=""
 F  S J=$O(^DMSQ(J)) Q:J=""  S:DM(J)'=$P(^(J,0),U,3) FLG=1
 Q
IDX(TI) ; extrinsic function, checks for indexes on table TI
 ; returns 1 if there are more indexes to process
 ; see INDEX^DMSQF2 for similar index checking code
 N F,FI,IN,I,IF,IX,CI,FLG D DT^DICRW S FLG=""
 S F=$P(^DMSQ("T",TI,0),U,7)
 S FI=0 F  S FI=$O(^DD(F,FI)) Q:'FI  D
 . S IN=0 F  S IN=$O(^DD(F,FI,1,IN)) Q:'IN  D
 .. S I=$G(^DD(F,FI,1,IN,0))
 .. I $P(I,U,3)]"" Q   ; not a regular index
 .. I I="" Q           ; no data at DD location
 .. S IF=+I,IX=$P(I,U,2) I IX=""!'IF Q  ; no file # or index name
 .. I $G(^DD(F,FI,1,IN,1))'[",DA)" Q  ; last subscript isn't DA
 .. S CI=$O(^DMSQ("C","D",F,FI,"")) Q:'CI  ; missing column
 .. S FLG=2  ; this index is a candidate for projection
 I FLG=2 Q 1
 E  Q ""

DMSQU
DMSQU ;SFISC/JHM-SQLI UTILITIES ;5/13/98  12:03
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
SOC(T,B) ;TRANSLATE BASE CODE B TO EXTERNAL FORM FROM TEXT T
 Q $P($P(T,";"_B_":",2),";")
NEW() ;Extrinsic function returns comma-list of variables to NEW
 Q "DI,DIQUIET,DIFM"
ENV Q:$G(DUZ(0))'["@"
 K ERR I $G(DIFM),$G(U)="^",$G(DT),$D(DUZ) D CLEAN^DIEFU Q
 S DIQUIET=1,DIFM=1 D INIZE^DIEFU
 Q
EXT(F,FI,FLG,INT,MSG) ;SQLI ENTRY TO EXTERNAL^DILFD
 D ENV Q $$EXTERNAL^DILFD(F,FI,FLG,INT,$G(MSG))
GET(F,IEN,FI,FLG,BUF,MSG) ;SQLI ENTRY TO GET1^DIQ
 D ENV Q $$GET1^DIQ(F,IEN,FI,$G(FLG),$G(BUF),$G(MSG))
CLF(S) D ENV N X
 S X=$P($G(^DMSQ(S,0)),"^",1,2)_"^" I X'="^" K ^DMSQ(S) S ^DMSQ(S,0)=X
 Q
CLN D CLF("DT"),CLF("DM") Q
VIEN(TI) ;RETURN VIRTUAL IENS FOR TI
 N I,S S S=""
 F I=$L(^DMSQ("T",TI,1),"{K}")-1:-1:1 S S=S_"{K"_I_"},"
 Q S
ET(T) ;REPORT ELAPSED TIME SINCE T ($H FORMAT)
 W ?30,"Time elapsed: ",$$TM($$TD(T,$H))," (HH:MM:SS)"
 Q
TD(T,N) ;RETURNS TIME DIFERENCE OF N(OW)-T(HEN) $H FORMATS
 Q N-T*86400+$P(N,",",2)-$P(T,",",2)
TM(S) ;RETURN TEXT VALUE OF TIME S SECONDS AS HH:MM:SS
 Q $E(S\3600+100,2,3)_":"_$E(S\60#60+100,2,3)_":"_$E(S#60+100,2,3)
PAR(TI,NP,G,P,E) ;GET PARENT, GBL FRAGMENT, AND PIECE OR EXTRACT
 ;CALLED: S PAR=$$PAR^DMSQU(TABLE_ID,NODE;PIECE,.GBL_FRAG,.PC,.EX)
 N PEI,PI,SQ,CI,E1,E2 D ENV
 S PEI=$O(^DMSQ("E","F",TI,"P","")) Q:'PEI ""
 S SQ=$O(^DMSQ("P","C",PEI,""),-1) Q:'SQ ""
 S PI=$O(^DMSQ("P","C",PEI,SQ,"")),CI=$P(^DMSQ("P",PI,0),U,2)
 S G=","_$$SS($P(NP,";"))_")",E=""
 S P=$P(NP,";",2) I P'["E" S:P]"" P=+P
 E  S E=+$P(P,"E",2)_","_(+$P(NP,",",2)),P=""
 Q CI
ERR(F,FI,T) ;ERROR LOGGER
 N TI,EI,FE S FE=$G(ERR("DIERR",1)) D ENV
 I T?1NN,$D(^DMSQ("ET",T)) S TI=T
 E  S TI=$O(^DMSQ("ET","B",T,"")) I 'TI D
 . F TI=$P($G(^DMSQ("ET",0)),U,4)+1:1 Q:'$D(^(TI))
 . S $P(^DMSQ("ET",0),U,3,4)=TI_U_TI,^(TI,0)=T,^DMSQ("ET","B",T,TI)=""
 S EI=$P($G(^DMSQ("EX",0)),U,4)+1,$P(^(0),U,3,4)=EI_U_EI
 S ^DMSQ("EX",EI,0)=F_U_FI_U_TI_U_DT_U_FE,^DMSQ("EX","B",F,EI)=""
 S ^DMSQ("EX","C",TI,EI)="",^DMSQ("EX","D",DT,EI)=""
 I FE S ^DMSQ("EX","E",FE,EI)=""
 Q
ATTR ;;TYPE;FIELD LENGTH;DECIMAL DEFAULT;INPUT TRANSFORM;GLOBAL SUBSCRIPT LOCATION;POINTER;TITLE;SPECIFIER;DESCRIPTION;MULTIPLE-VALUED;LABEL
DOM(F,FI,DEF,ERR) ;GET FIELD ATTRIBUTES - DEF AND ERR ARE OPTIONAL
 ;RETURNS DOMAIN:WIDTH:SCALE ALLWAYS, ARRAYS DEF AND ERR OPTIONALLY
 N T,W,S,X K DEF D ENV
 I '$D(^DD(F,FI,0))#10 Q ""
 D FIELD^DID(F,FI,"",$P($T(ATTR),";;",2),"DEF","ERR")
 I $D(ERR)!$D(DIERR) D  Q T
 . S T=$$DM(F,FI,.DEF) I T]"" D ENV,ERR(F,FI,"FIELD: CALL TO RETRIEVE ATTRIBUTES FAILED")
 S T=DEF("TYPE"),W=DEF("FIELD LENGTH"),S=DEF("DECIMAL DEFAULT")
 S:W W=+W S:S?1N.E S=+S
 S I=DEF("INPUT TRANSFORM"),W=$S(I["$L(X)>":+$P(I,"$L(X)>",2),1:W)
 I T["MUMPS" S W=245,T="FM_MUMPS"
 E  I T["SET" S T="SET_OF_CODES"
 E  I T["DATE/TIME" D
 . S X=$P($P(DEF("INPUT TRANSFORM"),"%DT=""",2),"""")
 . S T=$S(X["R":"FM_DATE_TIME",X["T":"FM_MOMENT",1:"FM_DATE")
 E  I T["NUMERIC",'S S T="INTEGER",S=""
 E  I T["FREE TEXT" S T="CHARACTER"
 E  I T["COMPUTED" S T=$S(S:"NUMERIC",S=0:"INTEGER",1:"CHARACTER")
 E  I T["BOOLEAN" S T="FM_FLAG"
 E  I T["VARIABLE-POINTER" S T="VARIABLE_POINTER"
 E  I T["POINTER" S T="POINTER"
 E  I T["WORD-PROCESSING" S T="WORD_PROCESSING",W=80
 S F=$G(DEF("DESCRIPTION",1)) K DEF("DESCRIPTION")
 S DEF("DESCRIPTION")=$P(F,".")
 Q T_U_W_U_S
DM(F,FI,DEF) ;BUILD META-DATA FOR ONE FIELD (USE WHEN FIELD^DID FAILS!!)
 D ENV N CK,H,IT,SP,P,D,EX,LD,DP,TYP,DM,X
 K DEF S H=$G(^DD(F,FI,0)) Q:H="" ""
 S DEF("LABEL")=$P(H,U),(PE,DEF("GLOBAL SUBSCRIPT LOCATION"))=$P(H,U,4)
 S (IT,DEF("INPUT TRANSFORM"))=$P(H,U,5),(SP,DEF("SPECIFIER"))=$P(H,U,2)
 S DEF("DESCRIPTION")=$P($G(^DD(F,FI,21,1,0)),".")
 S (P,DEF("POINTER"))=$P(H,U,3),DEF("MULTIPLE-VALUED")=SP["M"!SP
 S D=$TR(SP,"aeAIMOn'X*","") ;IGNORE CHILD DESCRIPTORS
 S EX=$P($P(PE,";",2),"E",2)
 I EX F I=1:1 I $E(EX,I)?.A S EX=$E(EX,1,I-1) Q
 S LD=$P(D,"J",2),DP=+$P(LD,",",2) I LD,'DP S LD=+LD
 I LD="" S CK=$P(IT,"$L(X)>",2) I CK S LD=+CK
 I LD="",$P(EX,",",2) S LD=$P(EX,",",2)-EX+1
 S:DP LD=(+LD)_U_DP,DEF("DECIMAL DEFAULT")=DP
 I LD S DEF("FIELD LENGTH")=+LD,LD=U_LD
 S TYP=$S(DP:"N",D["N":"I",D["D":"D",D["P":"P",D["V":"V",D["B":"B",D["K":"K",D["S":"S",D["W":"W",1:"F")
 I TYP="N" S DM="NUMERIC"_LD,DEF("TYPE")="NUMERIC"
 E  I TYP="W" D
 . S DM="WORD_PROCESSING",LD="^80",DEF("TYPE")="WORD-PROCESSING"
 E  I TYP="P" S DM="POINTER",LD="^10",DEF("TYPE")="POINTER"
 E  I TYP="S" D  S DM="SET_OF_CODES"_LD,DEF("TYPE")="SET"
 . N I,X,W S W=1
 . F I=1:1:$L(P,":") S X=$L($P($P(";"_P,":",I),";",2)) S:X>W W=X
 . S LD=U_W
 E  I TYP="I" S DM="INTEGER"_LD,DEF("TYPE")="NUMERIC"
 E  I TYP="V" S DM="VARIABLE_POINTER",DEF("TYPE")="VARIABLE-POINTER"
 E  I TYP="B" S DM="FM_FLAG",DEF("TYPE")="BOOLEAN"
 E  I TYP="D" S X=$P($P($P(H,"^",5),"%DT=",2),"""",2) D
 . I X'["T",X'["R" S DM="FM_DATE"
 . E  I X["R" S DM="FM_DATE_TIME"
 . E  S DM="FM_MOMENT"
 . S DEF("TYPE")="DATE"
 E  I TYP="K" S DM="FM_MUMPS^245",DEF("TYPE")="MUMPS"
 E  S DM="CHARACTER"_$S(LD]"":LD,1:"(80)"),DEF("TYPE")="FREE TEXT"
 Q DM
KL(TI) ;RETURN IEN LIST OF TABLE
 N KL,P S KL=TI
 F  S P=$G(^DD(TI,0,"UP")) Q:P=""  S KL=P_","_KL,TI=P
 Q KL
PUT(I,A,E) ;FILE OR UPDATE
 ;GIVEN I=IEN AND A=FDA ARRAY RETURN IEN AND ERR
 K @E D ENV
 I I?1N.E D
 . D FILE^DIE("",A,E)
 E  D
 . N O D UPDATE^DIE("",A,"O",E) S I=$G(O(1))
 Q $S($D(@E):0,1:+I)
KWC(N) ;RETURN N AS A NON-KEYWORD
 I N]"",$D(^DMSQ("K","B",N)) N X,I S X=$$SQLI(N,25),N=X_1 D
 . F I=2:1 Q:'$D(^DMSQ("K","B",N))  S N=X_I ; AVOID KEYWORDS
 Q N
FNB(F,TI) ;BUILD SQL FILE NAME
 ;EXTRINSIC FUNCTION, ALL PARAMETERS REQUIRED & PASSED BY VALUE
 ;INPUT: F=FILEMAN FILE NUMBER, TI=SQLI IEN
 ;OUTPUT: STANDARD SQLI TABLE LABEL, UNIQUE BY SCHEMA, AND NOT
 ;        A KEY WORD
 N NM,F1,SP,P,I,X,J
 S NM="",F1=F,SP="" F  D  Q:'P
 . S P=$G(^DD(F1,0,"UP"))
 . I P S NM=$O(^DD(F1,0,"NM",""))_SP_NM,SP="_",F1=P
 S NM=$P($G(^DIC(F1,0)),"^")_SP_NM
 I NM=""!(NM["__")!($E(NM,$L(NM))="_")!(NM?1"_".E) Q ""
 F I=1:1:$L(NM,"_")-1 D
 . S X=$P(NM,"_",I)
 . F J=I+1:1:$L(NM,"_") S:$P(NM,"_",J)=X $P(NM,"_",J)=""
 S NM=$$SQLI(NM,26)
 F I=1:1 Q:'$D(^DMSQ("T","B",NM))!($O(^(NM,""))=TI)  S NM=NM_I
 Q $$KWC(NM)
CN(T,C,N) ;BUILD COLUMN NAME N UNIQUE BY TABLE T, COLUMN ELEMENT C
 ;EXTRINSIC FUNCTION, ALL PARAMETERS REQUIRED & PASSED BY VALUE
 ;INPUT: T=SQLI_TABLE EIN, C=SQLI_COLUMN EIN, N=FIELD NAME
 ;FIELD NAME ARE GENERATED FOR PRIMARY AND FOREIGN KEY COLUMNS
 ;OUTPUT: STANDARD SQLI COLUMN LABELS, UNIQUE BY TABLE, NOT KEYWORDS
 N I,X,% I N]"" D
 . S N=$$KWC($$SQLI(N,26)),%="",X=N
 . F I=1:1 S %=$O(^DMSQ("E","G",T,N,"")) Q:%=C!'%  S N=X_I
 Q N
SQLK(T,L) ;RETURN SQL IDENTIFIER NOT A KEYWORD
 ;EXTRINSIC FUNCTION, ALL PARAMETERS REQUIRED & PASSED BY VALUE
 ;SEE $$SQLI FOR DESCRIPTION OF INPUT/OUTPUT
 Q $$KWC($$SQLI(T,L))
SQLI(T,L) ;RETURN VALID SQL IDENTIFIER OF LENGTH L OR LESS BASED ON T
 ;EXTRINSIC FUNCTION, ALL PARAMETERS REQUIRED & PASSED BY VALUE
 ;INPUT: T=FREE TEXT, L=MAXIMUM OUTPUT LENGTH
 ;OUTPUT: AN SQLI STANDARD SQL IDENTIFIER
 N I,PL,T1
 I $TR(T,"_")?.UN,$L(T)'>L G SQLIX ;SKIP PROCESSING FOR SIMPLE CASE
 ;CONVERT LOWER TO UPPER CASE, MOST PUNCTUATION TO UNDERLINES
 S T=$TR(T," -abcdefghijklmnopqrstuvwxyz!@#$%^&*()_-+=|\}]{[:;""'?/>.<,~`","__ABCDEFGHIJKLMNOPQRSTUVWXYZ_________________________________")
 ;REMOVE DOUBLE UNDERLINES
 F  Q:T'["__"  S T=$P(T,"__")_"_"_$P(T,"__",2,99)
 I T?1"_".E S T=$E(T,2,999) ;REMOVE INITIAL UNDERLINE
 I $E(T,$L(T))="_" S T=$E(T,1,$L(T)-1) ;REMOVE TRAILING UNDERLINE
 ;COMPRESSION
 I $L(T)>L D
 . S PL=$L(T,"_") ;1) REDUCE SIZE OF _ PIECES
 . F I=PL-1:-1:2,PL,1 S $P(T,"_",I)=$$SQZ($P(T,"_",I)) Q:$L(T)'>L
 ;2) CONVERT _ PIECES TO INITIAL LETTERS
 I $L(T)>L F I=PL-1:-1:2,PL,1 S $P(T,"_",I)=$E($P(T,"_",I)) Q:$L(T)'>L
 ;3) COMPRESS OVERHANG INTO ONE ALPHA-NUMBERIC CHARACTER
 I $L(T)>L S T=$E(T,1,L-1)_$TR($E(T,L,999),"_")
SQLIX F  Q:$E(T,$L(T))'="_"  S $E(T,$L(T))="" ;REMOVE TRAILING _S
 F  Q:$E(T)'="_"  S $E(T)="" ;REMOVE LEADING _S
 I T?1N.E S T="N"_T ;AVOID INITIAL DIGIT
 I $L(T)>L S T=$E(T,1,$S($E(T,L)="_":L-1,1:L)) ;4) JUST TRUNCATE IT
 Q T
SQZ(T) ;RETURN MNEMONIC VALUE OF T
 I $L(T)>5 S T=$E(T,1,4) S:"AEIOU"[$E(T,4) T=$E(T,1,3)
 Q T
ROOT(F) ;GET GLOBAL NAME SYNTAX FOR A SUBFILE (F)
 N G,P,FI
 S G="{K})" F  D  Q:G["^"
 . S P=$G(^DD(F,0,"UP"))
 . I P D
 . . S FI=$O(^DD(P,"SB",F,""))
 . . I FI S F=P,G="{K},"_$$SS($P($P(^DD(F,FI,0),"^",4),";"))_","_G
 . . E  S G="^"
 . E  I $D(^DIC(F,0,"GL")) S G=^("GL")_G
 . E  S G="^"
 Q G
SS(T) ;CONVERT T TO A VALID SUBSCRIPT (QUOTES)
 I T?1N.N
 E  I T?.N1"."1N.N
 E  S T=$C(34)_T_$C(34)
 Q T
FIL(SF) ;EXTRINSIC FUNCTION RETURNS FILE CONTAINING FILE OR SUBFILE SF
 N F F  S F=SF,SF=$G(^DD(SF,0,"UP")) Q:SF=""
 Q $S($D(^DIC(F,0)):F,1:"")
TBL(TI) ;EXTRINSIC FUNCTION RETURNS TABLE CONTAINING TABLE OR SUBTABLE TI
 N F S F=$P($G(^DMSQ("T",TI,0)),U,7)
 I F S F=$$FIL(F) I F S F=$O(^DMSQ("T","C",F,""))
 Q F

DMUDIC00
DMUDIC00 ; VEN/SMH - A few ^DIC API Unit Tests; 13 JAN 2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 S IO=$PRINCIPAL
 N DIQUIET S DIQUIET=1
 D DT^DICRW
 D EN^XTMUNIT($T(+0),1)
 QUIT
 ;
STARTUP ; Create files 1009.802 (Shadow State) and 1009.801 (Broken File)
 D ^DMUFINIT ; Customized by yours truly to be silent
 QUIT
 ;
SHUTDOWN ; Delete files 1009.802 and 1009.801 from the system
 N DIU F DIU=1009.801,1009.802 S DIU(0)="DT" D EN^DIU0 ; Data and DD; Templates too!
 QUIT
 ;
SETUP    ; Remove DBS Output and Variables
 D CLEAN^DILF ; Remove DBS variables from ST
 K ^TMP("DILIST",$J) ; Remove Output from DBS Server
 QUIT
 ;
 ;TEARDOWN ; Not used
 ;
FINDC ; @TEST - FIND^DIC with computed fields in return field list
 D FIND^DIC(1009.802,,"@;.01;1;COUNT(COUNTY)","","AL") ; Exercise computed fields.
 ; ^TMP("DILIST",26063,0)="3^*^0^"
 ; ^TMP("DILIST",26063,0,"MAP")=".01^1^C4"
 ; ^TMP("DILIST",26063,2,1)=1
 ; ^TMP("DILIST",26063,2,2)=2
 ; ^TMP("DILIST",26063,2,3)=100
 ; ^TMP("DILIST",26063,"ID",1,.01)="ALABAMA"
 ; ^TMP("DILIST",26063,"ID",1,1)="AL"
 ; ^TMP("DILIST",26063,"ID",1,"C4",1)=67
 ; ^TMP("DILIST",26063,"ID",2,.01)="ALASKA"
 ; ^TMP("DILIST",26063,"ID",2,1)="AK"
 ; ^TMP("DILIST",26063,"ID",2,"C4",1)=29
 ; ^TMP("DILIST",26063,"ID",3,.01)="ALBERTA"
 ; ^TMP("DILIST",26063,"ID",3,1)="AB"
 ; ^TMP("DILIST",26063,"ID",3,"C4",1)=1
 ;
 ; ZEXCEPT: DIERR ; Comes from the ST
 I $D(DIERR) D FAIL^XTMUNIT("Fileman errored.") QUIT
 ;
 N COUNTISZERO S COUNTISZERO=0
 ;
 N I F I=0:0 S I=$O(^TMP("DILIST",$J,"ID",I)) Q:'I  Q:COUNTISZERO  D
 . I ^TMP("DILIST",$J,"ID",I,"C4",1)=0 S COUNTISZERO=1
 ;
 D CHKEQ^XTMUNIT(COUNTISZERO,0,"Count of counties should be at least one")
 ;
FINDE ; @TEST - Find with "E" flag to return all results in spite of errors.
 ;
 ; This is my broken file. Let's see if we can return the entries without
 ; the "E" flag and then with the "E" flag.
 D FIND^DIC(1009.801,,"@;.01;.02;.03;.04;.05;.06","","BAD") ; Search for entries starting with "BAD"
 ;
 ; WATCH FOR NAKED REFERENCES
 N I F I=0:0 S I=$O(^TMP("DILIST",$J,"ID",I)) Q:'I  D
 . Q:^(I,.01)'="BAD POINTER"
 . D CHKEQ^XTMUNIT($D(^(.03)),0,".03 node is not supposed to exist")
 ;
 ; Do this again with the "E" flag
 D FIND^DIC(1009.801,,"@;.01;.02;.03;.04;.05;.06","E","BAD") ; Search for entries starting with "BAD"
 ;
 ; WATCH FOR NAKED REFERENCES
 N I F I=0:0 S I=$O(^TMP("DILIST",$J,"ID",I)) Q:'I  D
 . Q:^(I,.01)'="BAD POINTER"
 . D CHKEQ^XTMUNIT($D(^(.03)),1,".03 node supposed to exist")
 QUIT
 ;
LISTC ; @TEST - LIST^DIC with computed fields in the field list.
 ;
 D LIST^DIC(1009.802,,"@;.01;1;COUNT(COUNTY)")
 ;
 ; ZEXCEPT: DIERR ; Comes from the ST
 I $D(DIERR) D FAIL^XTMUNIT("Fileman errored.") QUIT
 ;
 N COUNTISZERO S COUNTISZERO=0
 ;
 N I F I=0:0 S I=$O(^TMP("DILIST",$J,"ID",I)) Q:'I  Q:COUNTISZERO  D
 . I ^TMP("DILIST",$J,"ID",I,"C4",1)=0 S COUNTISZERO=1
 ;
 D CHKEQ^XTMUNIT(COUNTISZERO,0,"Count of counties should be at least one")
 QUIT
 ;
LISTE ; @TEST - LIST^DIC with "E" flag to return all results in spite of errors.
 ;
 ; This is my broken file. Let's see if we can return the entries without
 ; the "E" flag and then with the "E" flag.
 D LIST^DIC(1009.801,,"@;.01;.02;.03;.04;.05;.06") ; Get all entries
 ;
 ; WATCH FOR NAKED REFERENCES
 N I F I=0:0 S I=$O(^TMP("DILIST",$J,"ID",I)) Q:'I  D
 . Q:^(I,.01)'="BAD POINTER"
 . D CHKEQ^XTMUNIT($D(^(.03)),0,".03 node is not supposed to exist")
 ;
 ; Do this again with the "E" flag
 D FIND^DIC(1009.801,,"@;.01;.02;.03;.04;.05;.06","E") ; Search for entries starting with "BAD"
 ;
 ; WATCH FOR NAKED REFERENCES
 N I F I=0:0 S I=$O(^TMP("DILIST",$J,"ID",I)) Q:'I  D
 . Q:^(I,.01)'="BAD POINTER"
 . D CHKEQ^XTMUNIT($D(^(.03)),1,".03 node supposed to exist")
 QUIT
 ;
LISTX1 ; @TEST - LIST^DIC with the new X flag -- Sort by Unindexed field
 D LIST^DIC(1009.802,,"@;.01;5",,,,,5) ; Try to sort by Capital (Unindexed); no X flag
 D CHKTF^XTMUNIT(^TMP("DILIST",$J,"ID",1,5)'="HARTFORD","Without X flag, first entry shouldn't be Hartford")
 ;
 D LIST^DIC(1009.802,,"@;.01;5","X",,,,5) ; Try again, this time with X
 D CHKTF^XTMUNIT(^TMP("DILIST",$J,"ID",1,5)="HARTFORD","With X flag, first entry should be Hartford")
 ;
 QUIT
 ;
LISTX2 ; @TEST - LIST^DIC with the new X flag -- Sort by Computed Expression
 D LIST^DIC(1009.802,,.01,"",,,,"COUNT(COUNTY)>100") ; Get all states with more than 100 counties
 D CHKTF^XTMUNIT(+^TMP("DILIST",$J,0)'=7,"We SHOULDN'T be getting 7 states sans the X flag")
 ;
 D LIST^DIC(1009.802,,.01,"X",,,,"COUNT(COUNTY)>100") ; Get all states with more than 100 counties
 D CHKEQ^XTMUNIT(+^TMP("DILIST",$J,0),7,"We expect 7 states with more than 100 counties")
 ;
 QUIT
 ;
LISTX3 ; @TEST - LIST^DIC with the new X flag -- Sort by Sort Template
 ; First, create the sort template
 N DMUST ; Holds Sort Template Text
 S DMUST(1)="SORT BY: -COUNT(COUNTY)" ; Sort by the reverse of number of counties
 S DMUST(2)="From:"
 S DMUST(3)="To:"
 S DMUST(4)="   WITHIN COUNT(COUNTY), SORT BY: $E(NAME,1,3)=""NEW""" ; Only get the States whose names start with NEW
 ;
 N RET ; RP style return reference variable
 D BUILDNEW^DIBTED(.RET,1009.802,$NA(DMUST),"DMU NEW STATES W MOST COUNTIES")
 ;
 D CHKTF^XTMUNIT($P(^DIBT(+RET,0),U)="DMU NEW STATES W MOST COUNTIES","Template not created correctly")
 ;
 D LIST^DIC(1009.802,,".01;COUNT(COUNTY)","",,,,"[DMU NEW STATES W MOST COUNTIES]")
 D CHKTF^XTMUNIT(+$G(^TMP("DILIST",$J,0))'=6,"6 states' names start with NEW, but template not used")
 ;
 D LIST^DIC(1009.802,,".01;COUNT(COUNTY)","X",,,,"[DMU NEW STATES W MOST COUNTIES]")
 D CHKEQ^XTMUNIT(+^TMP("DILIST",$J,0),6,"6 states' names start with NEW")
 D CHKEQ^XTMUNIT(^TMP("DILIST",$J,"ID",1,.01),"NEW YORK","Of the ""NEW"" states, New York has the most counties")
 QUIT

DMUDIQ00
DMUDIQ00 ;VEN/LGC - UNIT TESTING FM DIQ ; 3/6/13 11:44am
 ;;22.2;VA FILEMAN;;Mar 28, 2013;1/7/2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 S IO=$PRINCIPAL
 N DIQUIET S DIQUIET=1
 D DT^DICRW
 D EN^XTMUNIT($T(+0),1)
 QUIT
 ;
 ;
TGET1DIQ ; @TEST - $$GET1^DIQ Single Data Retriever
 ; DIQ     $$GET1^DIQ( ): Single Data Retriever
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 3.5.42
 ; Test using with DIKK EDIT form entry in FORM file which
 ;   is distributed with Fileman
 ; Test Method: 
 ;  1. Set file number to .403, record to .3101
 ;     NOTE: Selecting FM file delivered with FM
 ;  2. Pull "GL" nodes from the DD for this file and its subfiles for
 ;     each field number defined in DD
 ;  3. Check the result of the $GET1^DIQ against the data
 ;     pulled directly from the global node and piece
 ;     as defined in DD
 ;  4. Failure defined as any incidence of failure to match
 ;
 S FNMBR=.403,RECORD=.3101
 N ERR S ERR=0
 N FARRAY
 ; Build an array of all the GL nodes (file and subfile) 
 D PULLDD(FNMBR,.FARRAY)
 ; Now run through each file and subfile to compare entiries
 ;  for this record.  Do by finding node with data and using
 ;  GL to pull each piece of the node, then compare with a
 ;  $$GET1 call with the "I" flag.  If even one difference 
 ;  is found, the test ends in failure.
 N SUBF S SUBF=0
 F  S SUBF=$O(FARRAY(SUBF)) Q:'SUBF  D TGET1(FNMBR,RECORD,SUBF)
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"GET1^DIQ Single Data Retriever failed.")
 Q
 ; Enter with a file or subfile number, the record in the file
 ;  to use for evaluation, and the subfile to evaluate.  
 ; Note that if we are evaluating the top file, the subfile
 ;  arrives empty and is set to be the same as the file number
 ;  immediately upon entering the subroutine.
 ;   FNMBR   =  File number being evaluated (e.g. .403)
 ;   RECORD  =  Record in file to use (e.g. .3010)
 ;   SUBF    =  Subfile to evaluate (e.g. .4032 )
TGET1(FNMBR,RECORD,SUBF) ;
 S:$G(SUBF)="" SUBF=FNMBR
 ; Gather all GL nodes in the DD for this file/subfile and
 ;  any subfiles noted in the DD
 D PULLDD(SUBF,.POO)
 N NODE,SNODE,QLBN
 ; Get global where this file stored
 ; Set stop node to node global minus the last subscript
 S NODE=$NA(^DIC(FNMBR,0,"GL")),NODE=@NODE_RECORD_")"
 Q:'$D(@$Q(@NODE))
 S QLBN=$QL(NODE)
 S SNODE=$P($P(NODE,",",1,$QL(NODE)),")")
 ; Run through every global node associated with this file
 ;   and/or subfile and send to the subroutine to compare each
 ;   piece of the global entry against a $$GET1 call
 I SUBF=FNMBR D  Q
 . D TGET1B(RECORD,NODE,SUBF,FNMBR,SNODE,QLBN)
 F  S NODE=$Q(@NODE) Q:NODE'[SNODE  D
 . I +$P(@NODE,"^",2)=+SUBF D
 .. D TGET1B(RECORD,NODE,SUBF,FNMBR,SNODE,QLBN)
 Q
 ; Run through all matching global nodes.  Compare the 
 ;  pieces of data for each as described by the GL
 ;  and compare to the $$GET1 call for the represented
 ;  field
TGET1B(RECORD,NODE,SUBF,FNMBR,SNODE,QLBN) ;
 N GET1,BYPIECE,DSS
 N CNT S CNT=$QL(NODE)
 I SUBF=FNMBR S SNODE=$P(SNODE,",",1,$QL(NODE))
 E  S SNODE=$P(SNODE,",",1,$QL(NODE)-1)
 N SSCNT S SSCNT=$QL($Q(@NODE))
 ;
 F  S NODE=$Q(@NODE) Q:NODE'[SNODE  Q:'$QS(NODE,CNT)  D
 . Q:SSCNT<$QL(NODE)
 . S DSS=$QS(NODE,$QL(NODE)) ; Note terminal or Data SubScript 
 . S IENS=$$BLDIENS(QLBN,NODE) ; Build an appropriate IENS
 . N PIECE S PIECE=0
 . F  S PIECE=$O(POO(SUBF,"GL",DSS,PIECE)) Q:PIECE=""  D
 ..  S FIELD=$O(POO(SUBF,"GL",DSS,PIECE,""))
 ..  S GET1=$$GET1^DIQ(SUBF,IENS,FIELD,"I")
 ..  I PIECE S BYPIECE=$P(@NODE,"^",PIECE)
 ..  E  S BYPIECE=@NODE
 ..  S:GET1'=BYPIECE ERR=1
 Q
 ;
 ;
 ;
TDDIQ ; @TEST - D^DIQ Conversion of Internal to External date
 ; Convert Date
 ; Takes internal date in Y and coverts to the external form
 ; DIQ     D^DIQ: Display
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 2.3.40
 ; Test Method: 
 ;  1. Build an array of random dates
 ;  2. Convert each to the external format with D^DIQ call
 ;  3. Convert each back to the FM date with the ^%DT call
 ;     and check for match
 ;  4. Failure defined as any incidence of failure to match
 N ERR,CNT,XARRAY,Y,YY S CNT=1000 D MKDTARR(.XARRAY,CNT)
 S ERR=0
 N NODE S NODE=$NA(XARRAY)
 F  S NODE=$Q(@NODE) Q:NODE'["XARRAY"  D
 . S Y=@NODE D D^DIQ S YY=Y
 . S X=$P(Y,"@") D ^%DT S Y=Y_"."_$TR($P(YY,"@",2),":")
 . I Y'=@NODE D
 .. S ERR=1
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"D^DIQ Date Conversion Internal to External failed.")
 Q
 ;
 ;
 ;
TDTDIQ ; @TEST - DT^DIQ Convert and Display Date
 ; DIQ     DT^DIQ: Display
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 2.3.41
 ; Test Method:
 ;  1. Build an array of random dates
 ;  2. Convert each to the external format with DT^DIQ call
 ;     and capture the returned result
 ;  3. Convert each back to the FM date with the ^%DT call
 ;     and check for match
 ;  4. Failure defined as any incidence of failure to match
 N ERR,CNT,POO,XARRAY,Y,YY S CNT=1000 D MKDTARR(.XARRAY,CNT)
 S ERR="0"
 N NODE S NODE=$NA(XARRAY)
 N CMD S CMD="DT^DIQ"
 F  S NODE=$Q(@NODE) Q:NODE'["XARRAY"  D
 . S CMD="S Y=@NODE D DT^DIQ"
 . D INTWRAP(CMD,.POO)
 . S YY=Y
 . S X=$P(Y,"@") D ^%DT S Y=Y_"."_$TR($P(YY,"@",2),":")
 . I Y'=@NODE D
 ..  S ERR=1
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"DT^DIQ Date Convert and Display failed.")
 Q
 ;
 ;
 ;
TENDIQ ; @TEST - EN^DIQ Display a Range of Data Elements
 ; DIQ     EN^DIQ: Display
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 2.3.42
 ; Testing Process
 ;   Use the EN^DIQ call to retrieve all data from the first
 ;   entry in the LANGUAGE [.85] file as distributed in
 ;   FM 22.2 at X1DATA
 ; Test Method: 
 ;  1. Set file number to .85
 ;     NOTE: Selecting FM file delivered with FM
 ;  2. Pull "GL" nodes from the DD for this file and
 ;     each field number defined in DD
 ;  3. Capture the text from the EN^DIQ call.
 ;     NOTE: To mitigate problems due to match failures due
 ;     to multiple " marks and added spaces in the return
 ;     text, these are removed.
 ;  4. Pull the node and piece directly from the global as
 ;     indicated by the DD.  
 ;     Note: " and spaces removed (see 3 above)
 ;  5. Search the text retrieved with the EN^DIQ call for
 ;     the field name being evaluated.  If found, check
 ;     the data retrieved from the global node and piece
 ;     directly as being contained in the EN^DIQ call.
 ;     NOTE: Sadly, demanding 1) the field name be found
 ;           in the EN^DIQ text was necessary as the FM
 ;           call sometimes shortens the field name
 ;           (perhaps for text compression?) and 2) needing
 ;           to remove " and space characters, then
 ;           3) seaching for a match as a 'contained in' 
 ;           process mitigates the strength of the testing.
 ;           I was unable to think around these issues and 
 ;           would gladly accept correction/advice - poo
 ;           
 N FNMBR,ERR,RECORD S FNMBR=.85,RECORD=1,ERR=0
 D PULLDD(FNMBR,.POO)
 N XXDIC S XXDIC=^DIC(FNMBR,0,"GL")
 N ALLPPP,ANS1,CMD,FNAME
 S CMD="K DA,DR S DIC=XXDIC,DA=1,DIQ(0)="""" D EN^DIQ"
 K PPP
 D INTWRAP(.CMD,.PPP)
 N CNT S CNT=0
 F  S CNT=$O(PPP(CNT)) Q:'CNT  S ALLPPP=$G(ALLPPP)_PPP(CNT)
 S ALLPPP=$TR(ALLPPP," "),ALLPPP=$TR(ALLPPP,"""")
 ;
 ; Go down GL for file and get each name
 N FNAME,FNAMEC,OK S FNAME=""
 N BDDGLBL S BDDGLBL="^DD("_FNMBR_",""B"")"
 S BDDGLBL=$NA(@BDDGLBL),OK=$P(BDDGLBL,")")
 F  S BDDGLBL=$Q(@BDDGLBL) Q:BDDGLBL'[OK  D  Q:ERR
 .  Q:@BDDGLBL
 .  S FNAME=$QS(BDDGLBL,3)
 .  S FNAME=$TR(FNAME_":",""""),FNAME=$TR(FNAME," ")
 .  Q:ALLPPP'[FNAME
 .  S FLDNUM=$QS(BDDGLBL,4)
 .  D TMPFN(FLDNUM,.POO) Q:NODE=""
 .  S:NODE'=+NODE NODE=""""_NODE_""""
 .  S GLBL=XXDIC_RECORD_","_NODE_")" ;W !,"GLBL=",GLBL
 .  S GLBL=$NA(@GLBL) ;W " NEW GLBL=",GLBL
 .  Q:'($D(@GLBL)#2)
 .  I PIECE S ANS1=$P(@GLBL,"^",PIECE)
 .  E  S ANS1=@GLBL
 .  Q:'$L(ANS1)
 .  S ANS1=$TR(FNAME_$G(ANS1),""""),ANS1=$TR(ANS1," ")
 .  S:ALLPPP'[ANS1 ERR=1
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"EN^DIQ Display Range of Data Elements failed.")
 Q
TMPFN(FLDNUM,POO) N GLNODE S GLNODE=$NA(POO(0)),GLNODE=$Q(@GLNODE)
TMPFN1 S:GLNODE="" (NODE,PIECE)="" Q:GLNODE=""  S NODE=$QS(GLNODE,3),PIECE=$QS(GLNODE,4) Q:$QS(GLNODE,5)=FLDNUM  S GLNODE=$Q(@GLNODE) G TMPFN1
 Q
 ;
 ;
 ;
TGETS ; @TEST - GETS^DIQ Data Retriever
 ; DIQ     GETS^DIQ( ): Data Retriever
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 3.5.43
 ; Testing Process
 ;   Use the GETS^DIQ call to retrieve all data from a given
 ;   file entry and compare to the nodes as described in the GL
 ; Test Method: 
 ;  1. Set file number to .85, record to 1
 ;     NOTE: Selecting FM file delivered with FM
 ;  2. Perform GETS^DIQ
 ;  3. Pull "GL" nodes from the DD for this file for
 ;     each field number defined in DD
 ;  4. Check the data obtained from each node and piece in
 ;     the file global as defined in the DD with the same
 ;     information returned in the GETS array
 ;  5. Failure defined as any incidence of failure to match
 N FNMBR,RECORD,ERR,ARRAY,POO,OK
 S FNMBR=.85,RECORD=1,ERR=0
 D GETS^DIQ(FNMBR,"1,","**","I","ARRAY")
 D PULLDD(FNMBR,.POO)
 N GLBLDD
 S GLBLDD="POO("_FNMBR_")",GLBLDD=$NA(@GLBLDD),OK=$P(GLBLDD,")")_","
 N ANS1,FLDNUM,GLBLA,GLBLDATA,NODE,PIECE
 F  S GLBLDD=$Q(@GLBLDD) Q:GLBLDD'[OK  D
 . S NODE=$QS(GLBLDD,3),PIECE=$QS(GLBLDD,4),FLDNUM=$QS(GLBLDD,5)
 . S:NODE'=+NODE NODE=""""_NODE_""""
 . S GLBLDATA=^DIC(FNMBR,0,"GL")_RECORD_","_NODE_")"
 . S GLBLDATA=$NA(@GLBLDATA)
 . Q:'($D(@GLBLDATA)#2)
 . I PIECE'=+PIECE S ANS1=@GLBLDATA
 . E  S ANS1=$P(@GLBLDATA,"^",PIECE)
 . S GLBLA="ARRAY("_FNMBR_","""_RECORD_","","_FLDNUM_",""I"")"
 . S GLBLA=$NA(@GLBLA)
 . S:ANS1'=@GLBLA ERR=1
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"GETS^DIQ Data Retriever failed.")
 Q
 ;
 ;
 ;
TYDIQ ; @TEST - Y^DIQ Convert Internal Form of any Data Element to External Form
 ;   (Equivalent DS is $$EXTERNAL^DILFD)
 ; DIQ     Y^DIQ: Display
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 2.3.43
 ; Test Method: 
 ;  1. Run through data saved in this routine (X1DATA) for testing
 ;     NOTE: Selecting FM files delivered with FM
 ;  2. Parse into the variables needed for the Y^DIQ call
 ;  3. Run the Y^DIQ call and check result matches expected
 ;  4. Failure defined as any incidence of failure to match
 ;  NOTE: I would like to work further on this and change to
 ;        a direct translation of the DD to allow for a more
 ;        thorough and powerful testing
 N C,CNT,ERR,FILE,FIELD,Y,RSLT
 S ERR=0
 F  S CNT=$G(CNT)+1 Q:'$L($P($T(X1DATA+CNT),";;",2))  D
 . S Y=$P($T(X1DATA+CNT),";;",2)
 . S FILE=$P(Y,"^"),FIELD=$P(Y,"^",2),RSLT=$P(Y,"^",4),Y=$P(Y,"^",3)
 . S C=$P(^DD(FILE,FIELD,0),"^",2)
 . D Y^DIQ
 . I Y'[RSLT S ERR=0
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"Y^DIQ Data Element Conversion Internal to External failed.")
 Q
 ;
 ;
 ;
TENDIQ1 ; @TEST - EN^DIQ1 Retrieve Data from a File for a Particular Entry
 ; Retrieve Data from a File for a Particular Entry
 ; DIQ1     EN^DIQ1: Data Retrieval
 ; VA FM PRG MAN 22.0 March 1999, Revised May 2011 2.3.44
 ;   (Equivalent DS are $$GETS^DIQ and $$GET1^DIQ
 ; Test Method: 
 ;  1. Set file number to .85, record to 1
 ;     NOTE: Selecting FM file delivered with FM
 ;  2. Get file global from DIC
 ;  3. Pull "GL" nodes from the DD for this file and run through
 ;     each field number defined in DD
 ;  4. Check the results of the EN^DIQ1 call stored in the 
 ;     ^UTILITY global against the data pulled directly from
 ;     the global node and piece defined in DD
 ;  5. Failure defined as any incidence of failure to match
 N FNMBR,RECORD,Y
 S FNMBR=.85,RECORD=1
 N ERR S ERR=0
 D TENDIQ1A(FNMBR,RECORD)
 S Y=ERR
 D CHKEQ^XTMUNIT(Y,0,"EN^DIQ1 Data from File for Particular Entry failed.")
 Q
 ;
TENDIQ1A(FNMBR,RECORD) N ANS1,ANS2,DA,DDNODE,DIC,DIQ,DR,FIELD,GLOBAL,NODE,PIECE,POO,SDNODE
 D PULLDD(FNMBR,.POO)
 N GLBL S GLBL=^DIC(FNMBR,0,"GL")
 S DDNODE=$NA(POO(FNMBR,"GL")),SDDNODE=$P(DDNODE,")")
 F  S DDNODE=$Q(@DDNODE) Q:DDNODE'[SDDNODE  D
 .  S NODE=$QS(DDNODE,3)
 .  S PIECE=$QS(DDNODE,4)
 .  S FIELD=$QS(DDNODE,5)
 .  K ^UTILITY("DIQ1",$J)
 .  S DIC=FNMBR,DA=RECORD,DR=FIELD,DIQ(0)="I" D EN^DIQ1
 .  S ANS1=$G(^UTILITY("DIQ1",$J,FNMBR,RECORD,FIELD,"I"))
 .  S GLOBAL=GLBL_RECORD_","_NODE_")"
 .  I NODE'=0,'NODE S GLOBAL=GLBL_RECORD_","""_NODE_""")"
 .  I $D(@$NA(@GLOBAL))#2 D
 ..  I PIECE S ANS2=$P(@$NA(@GLOBAL),"^",PIECE)
 ..  E  S ANS2=@$NA(@GLOBAL)
 ..  I ANS1'=ANS2 S ERR=1
 Q
 ;
 ;
 ; Build array of randome dates
 ; Returns such as : XDATA(n)=2451209.212358
MKDTARR(XDATA,NMBR) ;
 K XDATA
 N X,Y,Z,STRTYR,YEAR,DAY,HOURS,MINS,MONTH,SECS
 S STRTYR=150
 F Z=1:1:NMBR D
 .  S YEAR=STRTYR+$R(200)
 .  S MONTH=$TR($J($R(12)+1,2)," ","0")
 .  S DAY=$TR($J($R(28)+1,2)," ","0")
 .  S HOURS=$TR($J($R(24),2)," ","0")
 .  S MINS=$TR($J($R(60),2)," ","0")
 .  S SECS=$TR($J($R(60),2)," ","0") S:SECS="00" SECS=""
 .  S YEAR=YEAR_MONTH_DAY_"."_HOURS_MINS_SECS
 .  S XDATA(Z)=YEAR
 S X="FEB 29, 2000" D ^%DT S $P(XDATA(Z-3),".")=Y
 S X="FEB 29, 2012" D ^%DT S $P(XDATA(Z-2),".")=Y
 Q
 ;
 ; INTWRAP pulled directly from DMUDT000 in case each unit test
 ;  routine needs to be independent of any other
INTWRAP(CMD,ARR) ; Interactive Prompt Wrapper. Write prompt to file and read back
 ; CMD is command to execute by value
 ; ARR Return Array pass by reference. New before passing as we only add contents here.
 N F S F="test"_$J_".txt"
 D OPEN^%ZISH("FILE",$$DEFDIR^%ZISH(),F,"W") ; Write mode
 U IO
 X CMD
 D CLOSE^%ZISH("FILE")
 D OPEN^%ZISH("FILE",$$DEFDIR^%ZISH(),F,"R") ; Read mode
 U IO
 N I F I=1:1 R ARR(I):0 Q:$$STATUS^%ZISH()   ; Read until $ZEOF
 D CLOSE^%ZISH("FILE")
 N DELARR S DELARR(F)=""
 N % S %=$$DEL^%ZISH($$DEFDIR^%ZISH(),$NA(DELARR)) ; Delete file
 U $P
 QUIT
 ;
 ; Build an array matching all of a file and subfile's
 ;  "GL" subscripted nodes
 ; Enter with
 ;   STUB  = a parent file number (e.g. 2, 200, .403)
 ;   PDD   = the name of the array to return
 ; Exits with
 ;   Array named in PDD
PULLDD(STUB,PDD) K PDD N NODE S NODE="^DD("_STUB_")"
 F  S NODE=$Q(@NODE) Q:$QS(NODE,1)'=STUB  D
 .  I $QS(NODE,2)="GL" S @$TR(NODE,"^","P")=""
 .  I $QS(NODE,2)="SB" D PD($QS(NODE,3))
 Q
 ;
PD(STUB) N NODE S NODE="^DD("_STUB_")"
 F  S NODE=$Q(@NODE) Q:$QS(NODE,1)'=STUB  D
 .  I $QS(NODE,2)="GL" S @$TR(NODE,"^","P")=""
 .  I $QS(NODE,2)="SB" D PD($QS(NODE,3))
 Q
 ;
BLDIENS(QLBN,NODE) ;
 N IENS
 N I F I=QLBN:1:$QL(NODE) S:'(I#2) IENS=$QS(NODE,I)_","_$G(IENS)
 Q $G(IENS)
 ;
 ;;
X1DATA ;;
 ;;.84^1.2^13^VA FILEMAN^
 ;;.83^1^y^YES, NUMBER IS IN USE^
 ;;.83^1^n^NOT IN USE^
 ;;

DMUDT000
DMUDT000 ; VEN/SMH - Unit Test Driver for Date Utilities; 04-MAR-2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;
 S IO=$PRINCIPAL
 N DIQUIET S DIQUIET=1
 D DT^DICRW
 D EN^XTMUNIT($T(+0),1)
 QUIT
 ;
 ;STARTUP  ; Not used
 ;SHUTDOWN ; Not used
 ;SETUP    ; Not used
 ;TEARDOWN ; Not used
 ;
%DTFUT ; @TEST - %DT Future Assumed Flag
 N %DT,X,Y
 S %DT="F",X="NOV 11, 2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3801111,"Future Date Test Full Failed.")
 S %DT="F",X="NOV 2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3801100,"Future Date Test Month Year Only Failed.")
 S %DT="F",X="2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3800000,"Future Date Test Year Only Failed.")
 S %DT="F",X="2000" D ^%DT
 D CHKEQ^XTMUNIT(Y,3000000,"Past Date Test failed.")
 N YEAR S YEAR=$E(DT,1,3)+1700-10 ; Get a year 10 years in the past
 N YEAR2D S YEAR2D=$E(YEAR,3,4) ; Get the last 2 digits of the year
 S %DT="F" S X="03"_"11"_YEAR2D D ^%DT
 N EXPRESULT S EXPRESULT=YEAR-1700+100_"0311"
 D CHKEQ^XTMUNIT(Y,EXPRESULT,"Future Date: Past 2 digit year wasn't interpreted to be in the future")
 QUIT
 ;
%DTPAST ; @TEST - %DT="P" - Past assumed flag
 N %DT,X,Y
 S %DT="P",X="NOV 11,2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3801111,"Past Date Test Full Failed.")
 S %DT="P",X="NOV 2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3801100,"Past Date Test Month Year only failed.")
 S %DT="P",X="2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3800000,"Past Date Test Year only failed.")
 N YEAR S YEAR=$E(DT,1,3)+1700+10 ; Get a year 10 years in the future
 N YEAR2D S YEAR2D=$E(YEAR,3,4)
 S %DT="P" S X="03"_"11"_YEAR2D D ^%DT
 N EXPRESULT S EXPRESULT=YEAR-1700-100_"0311"
 D CHKEQ^XTMUNIT(Y,EXPRESULT,"Past Date: Future 2 digit year wasn't interpreteed to be in the past")
 QUIT
 ;
%DTI ; @TEST - Internationl Dates
 N %DT,X,Y
 S %DT="I",X="3/11/2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3801103,"dd/mm/yyyy input failed")
 S %DT="I",X="APR 3,2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3800403,"mmm dd,yyyy input failed")
 S %DT="I",X="5 APR 2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3800405,"dd mmm yyyy input failed")
 S %DT="I",X="8 APRIL 2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,3800408,"dd mmmm yyyy input failed")
 S %DT="I",X="31 APRIL 2080" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"Invalid date test failed")
 S %DT="I",X="03112010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3101103,"ddmmyyyy input failed")
 QUIT
 ;
%DTINT ; @TEST - Interactive dates; %DT("AE") - Ask and Echo
 N %DT,X,Y
 S %DT="A"
 N CMD S CMD="D ^%DT"
 N ARR
 D INTWRAP(CMD,.ARR)
 D CHKEQ^XTMUNIT(ARR(2),"DATE: ","Date prompt not issued")
 ;
 N %DT
 S %DT="A"
 S %DT("A")="YABADABADO"
 N ARR
 N CMD S CMD="D ^%DT"
 D INTWRAP(CMD,.ARR)
 D CHKEQ^XTMUNIT(ARR(2),"YABADABADO","%DT(""A"") not honored")
 ;
 N %DT
 S %DT="A"
 S %DT("B")="T+12M"
 N CMD S CMD="D ^%DT"
 D INTWRAP(CMD,.ARR)
 D CHKEQ^XTMUNIT(ARR(2),"DATE: T+12M//","%DT(""B"") not honored")
 ;
 ; Can't seem to get that to work in Mumps alone
 ; N %DT
 ; S %DT="AE"
 ; S %DT("B")="T+12M"
 ; N CMD S CMD="D ^%DT"
 ; D INTWRAP(CMD,.ARR)
 ; D CHKEQ^XTMUNIT(ARR(2),"","Echo not honored")
 ;
%DTM ; @TEST - %DT="M" only month and year input is allowed
 N %DT,X,Y
 S %DT="M"
 S X="1 JAN 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""M"" not honored")
 S X="JAN 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3100100,"%DT=""M"" didn't work correctly")
 S X="2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3100000,"%DT=""M"" didn't work correctly 2")
 S X="4/2002" D ^%DT
 D CHKEQ^XTMUNIT(Y,3020400,"%DT=""M"" didn't work correctly 3")
 QUIT
 ;
%DTN ; @TEST - %DT="N" - Pure Numeric Input is not allowed
 N %DT,X,Y
 S %DT="N"
 S X="2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""N"" not honored 1")
 S X="03012010" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""N"" not honored 2")
 S X="03 01 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3100301,"%DT=""N"" failed")
 QUIT
 ;
%DTR ; @TEST - %DT="R" - Requires Time Input
 N %DT,X,Y
 S %DT="R"
 S X="2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""R"" not honored 1")
 S X="03012010" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""R"" not honored 2")
 S X="T@10" D ^%DT
 D CHKEQ^XTMUNIT(Y,DT_"."_1,"%DT=""R"" T@10 failed")
 S X="NOV 12 2012@11:22" D ^%DT
 D CHKEQ^XTMUNIT(Y,3121112.1122,"%DT=""R"" NOV 12 2012@11:22 failed")
 QUIT
 ;
%DTT ; @TEST - %DT="T" - Allows Time Input
 N %DT,X,Y
 S %DT="T"
 S X="2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3100000,"%DT=""T"" not honored 1")
 S X="03012010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3100301,"%DT=""T"" not honored 2")
 S X="T@22:15" D ^%DT
 D CHKEQ^XTMUNIT(Y,DT_"."_2215,"%DT=""T"" failing on T@22:15")
 S X="T@22:15:22" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""T"" NOT failing on T@22:15:22")
 S X="NOW" D ^%DT
 D CHKTF^XTMUNIT($L($P(Y,".",2))=4,"%DT=""T"" is returning seconds when it shouldn't")
 QUIT
 ;
%DTS ; @TEST - %DT="TS" or "RS" - Return Seconds
 N %DT,X,Y
 S %DT="TS",X="NOW" D ^%DT
 D CHKTF^XTMUNIT($L($P(Y,".",2))=6,"%DT=""TS"" is not returning seconds when it should")
 S %DT="RS",X="3/6/2016@11:22:44" D ^%DT
 D CHKEQ^XTMUNIT(Y,3160306.112244,"%DT=""RS"" is not returning seconds when it should")
 S %DT="S",X="NOW" D ^%DT
 D CHKEQ^XTMUNIT(Y,DT,"%DT=""S"" by itself without T or R should do nothing")
 QUIT
 ;
%DTX ; @TEST - %DT="X" - Exact (month and day) input is required
 N %DT,X,Y
 S %DT="X",X="2000" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"%DT=""X"" not honored")
 S %DT="X",X="T" D ^%DT
 D CHKEQ^XTMUNIT(Y,DT,"TODAY should work with %DT=""X""")
 S %DT="X",X="12 DECEMBER 2033" D ^%DT
 D CHKEQ^XTMUNIT(Y,3331212,"12 DECEMBER 2033 should work with %DT=""X""")
 QUIT
 ;
%DT0 ; @TEST - %DT(0) - Limit dates to or from %DT(0)
 N %DT,X,Y
 S %DT(0)=3101031
 S X="10 OCTOBER 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"10 OCTOBER 2010 is before 3101031 and invalid")
 S X="31 OCTOBER 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3101031,"31 OCTOBER 2010 should be valid (At Limit)")
 S X="22 JANUARY 2013" D ^%DT
 D CHKEQ^XTMUNIT(Y,3130122,"22 JANUARY 2013 should be valid (After Limit)")
 ;
 S %DT(0)=-3101031
 S X="10 OCTOBER 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3101010,"10 OCTOBER 2010 is before 3101031 and valid")
 S X="31 OCTOBER 2010" D ^%DT
 D CHKEQ^XTMUNIT(Y,3101031,"31 OCTOBER 2010 should be valid (At Limit)")
 S X="22 JANUARY 2013" D ^%DT
 D CHKEQ^XTMUNIT(Y,-1,"22 JANUARY 2013 should be invalid (After Limit)")
 QUIT
 ;
DDUPDT ; @TEST - Internal Format to External Format - DD^%DT
 ; Test normal operation first
 N %DT
 N Y S Y="3130522" D DD^%DT
 D CHKEQ^XTMUNIT(Y,"MAY 22, 2013","3130522 didn't convert to external properly")
 N Y S Y="3130522.22" D DD^%DT
 D CHKEQ^XTMUNIT(Y,"MAY 22, 2013@22:00","3130522.22 didn't convert to external properly")
 N Y S Y="3130522.2211" D DD^%DT
 D CHKEQ^XTMUNIT(Y,"MAY 22, 2013@22:11","3130522.2211 didn't convert to external properly")
 N Y S Y="3130522.221144" D DD^%DT
 D CHKEQ^XTMUNIT(Y,"MAY 22, 2013@22:11:44","3130522.221144 didn't convert to external properly")
 ;
 N Y S Y=3130000 D DD^%DT
 D CHKEQ^XTMUNIT(Y,2013,"3130000 didn't convert to external properly")
 N Y S Y=3131200 D DD^%DT
 D CHKEQ^XTMUNIT(Y,"DEC 2013","3131200 didn't convert to external properly")
 ;
 ; Test force seconds return (%DT="S")
 D
 . N %DT,Y S %DT="S"
 . S Y=3130522.22 D DD^%DT
 . D CHKEQ^XTMUNIT(Y,"MAY 22, 2013@22:00:00","Seconds not returned when requested")
 ;
 ; Test bad Input - %DT accepts it anyways.
 N Y S Y=5 D DD^%DT
 D CHKEQ^XTMUNIT(Y,1705,"5 should convert to 1705")
 ;
 ; Test l10n
 S DUZ("LANG")=2 ; German
 N Y S Y=3130522.2211 D DD^%DT
 D CHKEQ^XTMUNIT(Y,"22.05.2013 22:11","Date didn't convert correctly into German format")
 S DUZ("LANG")="" ; Reset
 QUIT
 ;
INTWRAP(CMD,ARR) ; Interactive Prompt Wrapper. Write prompt to file and read back.
 ; CMD is command to execute by value
 ; ARR Return Array pass by reference. New before passing as we only add contents here.
 N F S F="test"_$J_".txt"
 D OPEN^%ZISH("FILE",$$DEFDIR^%ZISH(),F,"W") ; Write mode
 U IO
 X CMD
 D CLOSE^%ZISH("FILE")
 D OPEN^%ZISH("FILE",$$DEFDIR^%ZISH(),F,"R") ; Read mode
 U IO
 N I F I=1:1 R ARR(I):0 Q:$$STATUS^%ZISH()   ; Read until $ZEOF
 D CLOSE^%ZISH("FILE")
 N DELARR S DELARR(F)=""
 N % S %=$$DEL^%ZISH($$DEFDIR^%ZISH(),$NA(DELARR)) ; Delete file
 U $P
 QUIT

DMUDTC00
DMUDTC00 ; VEN/SMH - Unit Test Driver for %DTC Utilities; 04-MAR-2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;
 S IO=$PRINCIPAL
 N DIQUIET S DIQUIET=1
 D DT^DICRW
 D EN^XTMUNIT($T(+0),1)
 QUIT
 ;
 ;STARTUP  ; Not used
 ;SHUTDOWN ; Not used
 ;SETUP    ; Not used
 ;TEARDOWN ; Not used
 ;
%DTC ; @TEST - %DTC - Returns the number of days between two dates
 ; Input: X1 and X2
 ; Output: X (days difference) and %Y (1=valid dates; 0=invalid dates)
 N X1,X2,X,%Y
 S X1=3101112.22,X2=3101116.08
 D ^%DTC
 D CHKEQ^XTMUNIT(X,-4,"Difference between X1=3101112.22 and X2=3101116.08 is 4 days")
 D CHKEQ^XTMUNIT(%Y,1,"Dates are supposed to be valid")
 ;
 N X1,X2,X,%Y
 S X1=3101100,X2=3101116.08
 D ^%DTC
 D CHKEQ^XTMUNIT(%Y,0,"This difference of dates is uncomputable as an inexact date is used")
 ;
 N X1,X2,X,%Y
 S X1=3001231,X2=2991231
 D ^%DTC
 D CHKEQ^XTMUNIT(X,366,"Millenium year has 366 days")
 ;
 N X1,X2,X,%Y
 S X1=3011231,X2=3001231
 D ^%DTC
 D CHKEQ^XTMUNIT(X,365,"2001 has 365 days")
 ;
 N X1,X2,X,%Y
 S X1=3041231,X2=3031231
 D ^%DTC
 D CHKEQ^XTMUNIT(X,366,"2004 has 366 days")
 ;
 N X1,X2,X,%Y
 S X1=4001231,X2=3991231
 D ^%DTC
 D CHKEQ^XTMUNIT(X,365,"2100 has 365 days")
 ;
 N X1,X2,X,%Y
 S X1=4501231,X2=2991231 ; 151 years. Check for numeric overflows.
 D ^%DTC
 D CHKEQ^XTMUNIT(X,365.24*151\1+1,"Numeric overflow")
 ;
 QUIT
 ;
C ; @TEST - C^%DTC - Adds and subtracts dates
 ; Input: X1 = Start Date, X2= Number of days to add or remove
 ; X is the output. %H -> Horolog value
 N X,X1,X2,%H
 S X1=3101229.103139,X2=-2
 D C^%DTC
 D CHKEQ^XTMUNIT(X,3101227.103139,"2 days weren't subtracted correctly")
 N LASTH S LASTH=%H
 N %H,%T,%Y
 D H^%DTC ; Input is X
 D CHKEQ^XTMUNIT(%H,LASTH,"Horolog conversion failed")
 D CHKEQ^XTMUNIT(%T,(10*60*60)+(31*60)+39,"Seconds since mid conversion failed")
 ;
 N X,X1,X2,%H
 S X1=3101229.103139,X2=3
 D C^%DTC
 D CHKEQ^XTMUNIT(X,3110101.103139,"3 days weren't added correctly")
 N LASTH S LASTH=%H
 N %H,%T,%Y
 D H^%DTC ; Input is X
 D CHKEQ^XTMUNIT(%H,LASTH,"Horolog conversion failed")
 D CHKEQ^XTMUNIT(%T,(10*60*60)+(31*60)+39,"Seconds since mid conversion failed")
 QUIT
COMMA ; @TEST - COMMA^%DTC - Format the number with a comma
 ; Input: X - Number you want to format. X2 = Number of decimal digits.
 ; Append $ to X2 to output a dollar amount.
 ; Input: X3 - Length of desired output. 12 characters if not specified.
 ; Output: X
 ;
 N X,X2,X3
 S X="123332.229" D COMMA^%DTC
 D CHKEQ^XTMUNIT($L(X),12,"Default length is wrong")
 D CHKEQ^XTMUNIT(X," 123,332.23 ","Comma value is wrong")
 ;
 N X,X2,X3
 S X="123332.229",X2=1 D COMMA^%DTC
 D CHKEQ^XTMUNIT($L(X),12,"Default length is wrong 2")
 D CHKEQ^XTMUNIT(X,"  123,332.2 ","Comma value is wrong 2")
 ;
 N X,X2,X3
 S X="123332.2291",X2="3$" D COMMA^%DTC
 D CHKEQ^XTMUNIT($L(X),13,"Default length is wrong 3")
 D CHKEQ^XTMUNIT(X,"$123,332.229 ","Comma value is wrong 3")
 ;
 N X,X2,X3
 S X="123332.2291",X2="3$",X3=15 D COMMA^%DTC
 D CHKEQ^XTMUNIT($L(X),15,"Length isn't 15")
 D CHKEQ^XTMUNIT(X,"  $123,332.229 ","Comma value is wrong 4")
 ;
 N X,X2,X3
 S X="123.22",X2="3$" D COMMA^%DTC
 D CHKEQ^XTMUNIT($L(X),12,"Default length is wrong 5")
 D CHKEQ^XTMUNIT(X,"   $123.220 ","Comma value is wrong 5")
 ;
 N X,X2,X3
 S X="ABCDEDFGHIJK",X2=1 D COMMA^%DTC
 D CHKEQ^XTMUNIT($L(X),12,"Default length is wrong 6")
 D CHKEQ^XTMUNIT(X,"        0.0 ","Comma value is wrong 6")
 QUIT
 ;
DW ; @TEST - DW^%DTC - Return the day of week
 ; Input: X - FM Date
 ; Output: %H - $H date, %T - Seconds since midnight,
 ;   %Y: Numeric Day of Week, X: Alpha day of week
 N X,%H,%T,%Y
 S X="3121228.224422" D DW^%DTC
 D CHKEQ^XTMUNIT(X,"FRIDAY","28DEC2012 is a Friday")
 D CHKEQ^XTMUNIT(%H,"62819","Horolog not correctly translated")
 D CHKEQ^XTMUNIT(%T,(22*60*60)+(44*60)+22,"Number of seconds since midnight incorrect")
 D CHKEQ^XTMUNIT(%Y,5,"Should be 5 for Friday")
 ;
 N X,%H,%T,%Y
 S X="3100000" D DW^%DTC
 D CHKEQ^XTMUNIT(X,"","Imprecise date - should be null")
 D CHKEQ^XTMUNIT(%H,"61727","Horolog not correctly translated 2")
 D CHKEQ^XTMUNIT(%T,0,"Imprecise date - seconds should be zero")
 D CHKEQ^XTMUNIT(%Y,-1,"Imprecise date - %Y should be -1")
 ;
 N X,%H,%T,%Y
 S X="ABCDEF" D DW^%DTC
 D CHKEQ^XTMUNIT(X,"","Invalid input - empty string expected")
 D CHKEQ^XTMUNIT(%H,0,"Invalid input - %H should be 0")
 D CHKEQ^XTMUNIT(%T,0,"Invalid input - %T should be 0")
 D CHKEQ^XTMUNIT(%Y,-1,"Invalid input - %Y should be -1")
 ;
 N X,%H,%T,%Y
 S X=5 D DW^%DTC
 D CHKEQ^XTMUNIT(X,"","Invalid input - empty string expected")
 D CHKEQ^XTMUNIT(%H,0,"Invalid input - %H should be 0")
 D CHKEQ^XTMUNIT(%T,0,"Invalid input - %T should be 0")
 D CHKEQ^XTMUNIT(%Y,-1,"Invalid input - %Y should be -1")
 QUIT
 ;
H ; @TEST - H^%DTC - Convert an FM Date to a $H format date/time
 ; Input: X - FM Date
 ; Output: %H - $H date, %T - Seconds since midnight,
 ;   %Y: Numeric Day of Week
 N X,%H,%T,%Y
 S X="3121228.224422" D H^%DTC
 D CHKEQ^XTMUNIT(%H,"62819","Horolog not correctly translated")
 D CHKEQ^XTMUNIT(%T,(22*60*60)+(44*60)+22,"Number of seconds since midnight incorrect")
 D CHKEQ^XTMUNIT(%Y,5,"Should be 5 for Friday")
 ;
 N X,%H,%T,%Y
 S X="3100000" D H^%DTC
 D CHKEQ^XTMUNIT(%H,"61727","Horolog not correctly translated 2")
 D CHKEQ^XTMUNIT(%T,0,"Imprecise date - seconds should be zero")
 D CHKEQ^XTMUNIT(%Y,-1,"Imprecise date - %Y should be -1")
 ;
 N X,%H,%T,%Y
 S X="ABCDEF" D H^%DTC
 D CHKEQ^XTMUNIT(%H,0,"Invalid input - %H should be 0")
 D CHKEQ^XTMUNIT(%T,0,"Invalid input - %T should be 0")
 D CHKEQ^XTMUNIT(%Y,-1,"Invalid input - %Y should be -1")
 ;
 N X,%H,%T,%Y
 S X=5 D H^%DTC
 D CHKEQ^XTMUNIT(%H,0,"Invalid input - %H should be 0")
 D CHKEQ^XTMUNIT(%T,0,"Invalid input - %T should be 0")
 D CHKEQ^XTMUNIT(%Y,-1,"Invalid input - %Y should be -1")
 QUIT
 ;
HELP ; @TEST - Exercise Help, no checks.
 N REDBG S REDBG=$C(27)_"[41m" ; Red Background ANSI
 N WHTFG S WHTFG=$C(27)_"[37m" ; White Forground ANSI
 N RESET S RESET=$C(27)_"[0m"  ; Reset to original ANSI
 N X  ; Looper variable
 ;
 ; Test %DT flags
 F X="A","E","F","I","M","N","P","R","SR","ST","T","X","" D
 . N %DT S %DT=X
 . W !
 . W REDBG_WHTFG
 . W !,"%DT: ",%DT
 . W RESET
 . D HELP^%DTC
 ;
 ; Test %DT(0)
 N X,Y ; Loopers
 F X="3101231","T+30" F Y="-","+" D
 . N %DT S %DT(0)=Y_X,%DT="I"
 . W !
 . W REDBG_WHTFG
 . W !,"%DT(0): ",%DT(0)
 . W RESET
 . D HELP^%DTC
 QUIT
 ;
NOW ; @TEST - Tests NOW^%DTC
 ; Input: None
 ; Output: 
 ; - %  -> VA FileMan date/time down to the second.
 ; - %H -> $H date/time.
 ; %I(1) -> The numeric value of the month.
 ; %I(2) -> The numeric value of the day.
 ; %I(3) -> The numeric value of the year.
 ; X -> VA FileMan date only.
 N %,%H,%I,X
 D NOW^%DTC
 D CHKEQ^XTMUNIT($L(%,"."),2,"No date/time provided when they should be")
 D CHKTF^XTMUNIT($L($P(%,".",2))>2,"Hours and minutes not provided when they should be")
 D CHKEQ^XTMUNIT(%I(1),+$E(DT,4,5),"Month incorrect")
 D CHKEQ^XTMUNIT(%I(2),+$E(DT,6,7),"Day incorrect")
 D CHKEQ^XTMUNIT(%I(3),$E(DT,1,3),"Year incorrect")
 D CHKEQ^XTMUNIT(X,DT,"VA Fileman date only incorrect")
 QUIT
 ;
S ; @TEST - Test S^%DTC
 ; Input: % - Number of seconds since midnight
 ; Output: % - Decimal part of Fileman Date
 N % S %=1 D S^%DTC
 D CHKEQ^XTMUNIT(%,.000001,"1 second didn't convert correctly")
 N % S %=(13*60*60)+(48*60)+47 D S^%DTC ; 1:48:47 PM
 D CHKEQ^XTMUNIT(%,.134847,"1:48:47 didn't convert correctly")
 N % S %=0 D S^%DTC
 D CHKEQ^XTMUNIT(%,0,"0 didn't convert correctly")
 N % S %="ABCDEF" D S^%DTC
 D CHKEQ^XTMUNIT(%,0,"ABCDEF didn't convert correctly")
 N % S %="1abcdef" D S^%DTC
 D CHKEQ^XTMUNIT(%,.000001,"1abcdef didn't convert correctly")
 QUIT
YMD ; @TEST - Test YMD^%DTC
 ; Input: %H - $H format date/time
 ; Output: % - Time down to second in FM format
 ;       : X - date in Fileman format
 N %H,%,X
 S %H=$H D YMD^%DTC
 N FMTIME S FMTIME=$$FMTFDHT(%H)
 D CHKEQ^XTMUNIT(%,FMTIME,"Time didn't convert correctly")
 D CHKEQ^XTMUNIT(X,DT,"Date didn't convert correctly")
 ;
 ; Check date sans time
 N %H,%,X
 S %H=$P($H,",") D YMD^%DTC
 D CHKEQ^XTMUNIT(%,0,"Time didn't convert correctly 2")
 D CHKEQ^XTMUNIT(X,DT,"Date didn't convert correctly 2")
 ;
 ; Now check invalid inputs
 N %H,%,X
 S %H=0 D YMD^%DTC
 D CHKEQ^XTMUNIT(%,0,"Time should be zero for $H of 0")
 D CHKEQ^XTMUNIT(X,"","Date should be null? for $H of 0")
 ;
 N %H,%,X
 S %H=1 D YMD^%DTC
 D CHKEQ^XTMUNIT(%,0,"Time should be zero for $H of 1")
 D CHKEQ^XTMUNIT(X,1410101,"Date for $H of 1 is 1410101")
 ;
 N %H,%,X
 S %H="HELLO" D YMD^%DTC
 D CHKEQ^XTMUNIT(%,0,"Time should be zero for $H of ""HELLO""")
 D CHKEQ^XTMUNIT(X,"","Date should be null for $H of 0")
 ;
 N %H,%,X
 S %H="1HELLO" D YMD^%DTC
 D CHKEQ^XTMUNIT(%,0,"Time should be zero for $H of ""1HELLO""")
 D CHKEQ^XTMUNIT(X,1410101,"Date for $H of ""1HELLO"" should be 1410101")
 QUIT
 ;
YX ; @TEST - Test YX^%DTC
 ; Input: %H - a $Horolog date
 ; Output: Y - Date in external format
 ;       : X - Date in Fileman Format
 ;       : % - Time in Fileman decimal format
 ;
 ; $H cum datetime
 N %H,Y,X,%
 S %H="62823,40271" D YX^%DTC
 D CHKEQ^XTMUNIT(Y,"JAN 01, 2013@11:11:11","$H didn't convert correctly")
 D CHKEQ^XTMUNIT(X,3130101,"Fileman date didn't get produced correctly")
 D CHKEQ^XTMUNIT(%,.111111,"Fileman time didn't get produced correctly")
 ;
 ; $H sans time
 N %H,Y,X,%
 S %H=62823 D YX^%DTC
 D CHKEQ^XTMUNIT(Y,"JAN 01, 2013","$H didn't convert correctly 2")
 D CHKEQ^XTMUNIT(X,3130101,"Fileman date didn't get produced correctly 2")
 D CHKEQ^XTMUNIT(%,0,"Fileman time should be zero for $H of 62823")
 ;
 ; Invalid input
 N %H,Y,X,%
 S %H=0 D YX^%DTC
 D CHKEQ^XTMUNIT(Y,0,"$H of 0 should produce zero date")
 D CHKEQ^XTMUNIT(X,"","$H of 0 should produced a empty fileman date")
 D CHKEQ^XTMUNIT(%,0,"$H of 0 should produce zero time")
 ; 
 ; Invalid input again
 N %H,Y,X,%
 S %H="HELLO" D YX^%DTC
 D CHKEQ^XTMUNIT(Y,0,"$H of ""HELLO"" should produce zero date")
 D CHKEQ^XTMUNIT(X,"","$H of ""HELLO"" should produce a zero fileman date")
 D CHKEQ^XTMUNIT(%,0,"$H of ""HELLO"" should produce zero time")
 ;
 ; Slightly invalid input
 N %H,Y,X,%
 S %H="62823HELLO" D YX^%DTC
 D CHKEQ^XTMUNIT(Y,"JAN 01, 2013","$H of 62823HELLO should be JAN 01, 2013")
 D CHKEQ^XTMUNIT(X,3130101,"$H of 62823HELLO should be FM Date 3130101")
 D CHKEQ^XTMUNIT(%,0,"$H of 62823HELLO should be FM time zero")
 QUIT
 ;
FMTFDHT(%H) ; $$ ; Fileman Time from $H Time; Private to DMU routines
 ; Input %H: By Value: Seconds portion of $H
 ; Output: Fileman decimal representing the time
 N SECONDS,REM ; seconds, remainder
 S SECONDS=$P(%H,",",2)
 N FMHR S FMHR=SECONDS/60/60\1 S:$L(FMHR)=1 FMHR="0"_FMHR ; derive hours
 S REM=SECONDS-(60*60*FMHR) ; remainder seconds after hours
 N FMMIN S FMMIN=REM/60\1 S:$L(FMMIN)=1 FMMIN="0"_FMMIN ; minutes
 S REM=SECONDS-(60*60*FMHR)-(60*FMMIN) ; remainder
 N FMSEC S FMSEC=REM ; seconds
 S:$L(FMSEC)=1 FMSEC="0"_FMSEC ; and pad zero if one digit
 N FMTIME S FMTIME="."_FMHR_FMMIN_FMSEC,FMTIME=+FMTIME ; create FM time number; remove extra trailing zeroes.
 QUIT FMTIME
 ;
INTWRAP(CMD,ARR) ; Interactive Prompt Wrapper. Write prompt to file and read back.
 ; CMD is command to execute by value
 ; ARR Return Array pass by reference. New before passing as we only add contents here.
 N F S F="test"_$J_".txt"
 D OPEN^%ZISH("FILE",$$DEFDIR^%ZISH(),F,"W") ; Write mode
 U IO
 X CMD
 D CLOSE^%ZISH("FILE")
 D OPEN^%ZISH("FILE",$$DEFDIR^%ZISH(),F,"R") ; Read mode
 U IO
 N I F I=1:1 R ARR(I):0 Q:$$STATUS^%ZISH()   ; Read until $ZEOF
 D CLOSE^%ZISH("FILE")
 N DELARR S DELARR(F)=""
 N % S %=$$DEL^%ZISH($$DEFDIR^%ZISH(),$NA(DELARR)) ; Delete file
 U $P
 QUIT

DMUFI001
DMUFI001 ; ; 10-JAN-2013
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(1009.801)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(1009.801,0,"GL")
 ;;=^DMU(1009.801,
 ;;^DIC("B","BROKEN FILE",1009.801)
 ;;=
 ;;^DD(1009.801,0)
 ;;=FIELD^^.06^6
 ;;^DD(1009.801,0,"DT")
 ;;=3130110
 ;;^DD(1009.801,0,"IX","B",1009.801,.01)
 ;;=
 ;;^DD(1009.801,0,"IX","C",1009.801,.02)
 ;;=
 ;;^DD(1009.801,0,"NM","BROKEN FILE")
 ;;=
 ;;^DD(1009.801,.01,0)
 ;;=NAME^RF^^0;1^K:$L(X)>60!($L(X)<3)!'(X'?1P.E) X
 ;;^DD(1009.801,.01,.008,2,0)
 ;;=NAME
 ;;^DD(1009.801,.01,1,0)
 ;;=^.1
 ;;^DD(1009.801,.01,1,1,0)
 ;;=1009.801^B
 ;;^DD(1009.801,.01,1,1,1)
 ;;=S ^DMU(1009.801,"B",$E(X,1,30),DA)=""
 ;;^DD(1009.801,.01,1,1,2)
 ;;=K ^DMU(1009.801,"B",$E(X,1,30),DA)
 ;;^DD(1009.801,.01,3)
 ;;=Answer must be 3-60 characters in length.
 ;;^DD(1009.801,.01,"DT")
 ;;=3130109
 ;;^DD(1009.801,.02,0)
 ;;=POINTER^P.85'^DI(.85,^0;2^Q
 ;;^DD(1009.801,.02,.008,2,0)
 ;;=POINTER
 ;;^DD(1009.801,.02,1,0)
 ;;=^.1
 ;;^DD(1009.801,.02,1,1,0)
 ;;=1009.801^C
 ;;^DD(1009.801,.02,1,1,1)
 ;;=S ^DMU(1009.801,"C",$E(X,1,30),DA)=""
 ;;^DD(1009.801,.02,1,1,2)
 ;;=K ^DMU(1009.801,"C",$E(X,1,30),DA)
 ;;^DD(1009.801,.02,1,1,"DT")
 ;;=3130109
 ;;^DD(1009.801,.02,"DT")
 ;;=3130109
 ;;^DD(1009.801,.03,0)
 ;;=DATE^D^^0;3^S %DT="E" D ^%DT S X=Y K:X<1 X
 ;;^DD(1009.801,.03,.008,2,0)
 ;;=DATUM
 ;;^DD(1009.801,.03,3)
 ;;=(No range limit on date)
 ;;^DD(1009.801,.03,"DT")
 ;;=3130109
 ;;^DD(1009.801,.04,0)
 ;;=SET^S^M:MALE;F:FEMALE;^0;4^Q
 ;;^DD(1009.801,.04,.007,2,0)
 ;;=MANNCHEN;WEIBCHEN
 ;;^DD(1009.801,.04,.008,2,0)
 ;;=SATZ
 ;;^DD(1009.801,.04,"DT")
 ;;=3130109
 ;;^DD(1009.801,.05,0)
 ;;=NUMBER^NJ3,0^^0;5^K:+X'=X!(X>999)!(X<0)!(X?.E1"."1.N) X
 ;;^DD(1009.801,.05,.008,2,0)
 ;;=ANZAHL
 ;;^DD(1009.801,.05,3)
 ;;=Type a number between 0 and 999, 0 decimal digits.
 ;;^DD(1009.801,.05,"DT")
 ;;=3130109
 ;;^DD(1009.801,.06,0)
 ;;=LOOPY OUTPUT TRANSFORM^DOX^^0;6^S %DT="E" D ^%DT S:Y>0 X=Y K:('X&(X'="HELLO WORLD")) X
 ;;^DD(1009.801,.06,.008,2,0)
 ;;=LOOPY AUSGABE UMZUWANDELN
 ;;^DD(1009.801,.06,2)
 ;;=S Y(0)=Y S:Y="HELLO SAM" Y="HELLO WORLD"
 ;;^DD(1009.801,.06,2.1)
 ;;=S:Y="HELLO SAM" Y="HELLO WORLD"
 ;;^DD(1009.801,.06,3)
 ;;=(No range limit on date)
 ;;^DD(1009.801,.06,"DT")
 ;;=3130110
 ;;^UTILITY("KX",$J,"IX",1009.801,1009.801,"D",0)
 ;;=1009.801^D^DATE XREF^R^^F^IR^I^1009.801^^^^^LS
 ;;^UTILITY("KX",$J,"IX",1009.801,1009.801,"D",1)
 ;;=S ^DMU(1009.801,"D",X,DA)=""
 ;;^UTILITY("KX",$J,"IX",1009.801,1009.801,"D",2)
 ;;=K ^DMU(1009.801,"D",X,DA)
 ;;^UTILITY("KX",$J,"IX",1009.801,1009.801,"D",2.5)
 ;;=K ^DMU(1009.801,"D")
 ;;^UTILITY("KX",$J,"IX",1009.801,1009.801,"D",11.1,0)
 ;;=^.114IA^1^1
 ;;^UTILITY("KX",$J,"IX",1009.801,1009.801,"D",11.1,1,0)
 ;;=1^F^1009.801^.03^^1^F

DMUFI002
DMUFI002 ; ; 10-JAN-2013 ; 1/27/13 3:46pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.801)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.801)
 ;;=^DMU(1009.801,
 ;;^UTILITY(U,$J,1009.801,0)
 ;;=BROKEN FILE^1009.801^13^9
 ;;^UTILITY(U,$J,1009.801,2,0)
 ;;=BAD POINTER^6666^3111111^F^44
 ;;^UTILITY(U,$J,1009.801,3,0)
 ;;=BAD DATE^2^ABCDEF^M^78
 ;;^UTILITY(U,$J,1009.801,4,0)
 ;;=BAD SET^12^2441122^U^777
 ;;^UTILITY(U,$J,1009.801,5,0)
 ;;=BAD NUMBER^18^3331201^F^ABCDEF
 ;;^UTILITY(U,$J,1009.801,7,0)
 ;;=BAD C (POINTER) XREF^4^3220504^M^234
 ;;^UTILITY(U,$J,1009.801,8,0)
 ;;=BAD D (DATE) XREF^5^3220801^M^342
 ;;^UTILITY(U,$J,1009.801,9,0)
 ;;=LOOPY OUTPUT TRANSFORM^^^^^HELLO LINDA
 ;;^UTILITY(U,$J,1009.801,11,0)
 ;;=NORMAL ENTRY^1^3221111^M^33
 ;;^UTILITY(U,$J,1009.801,13,0)
 ;;=THIRTY-TWO CHARACTER LIMIT ENTRY

DMUFI003
DMUFI003 ; ; 10-JAN-2013 ; 1/27/13 3:46pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQ(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^DIC(1009.802,0,"GL")
 ;;=^DMU(1009.802,
 ;;^DIC("B","SHADOW STATE",1009.802)
 ;;=
 ;;^DIC(1009.802,"%D",0)
 ;;=^^5^5^3031105^
 ;;^DIC(1009.802,"%D",1,0)
 ;;=This file contains the name of the state (or outlying area) as issued
 ;;^DIC(1009.802,"%D",2,0)
 ;;=by the Department of Veterans Affairs and issued in M-1, Part I,
 ;;^DIC(1009.802,"%D",3,0)
 ;;=Appendix B.  These entries should remain as distributed and should not be
 ;;^DIC(1009.802,"%D",4,0)
 ;;=edited or updated unless done via a software upgrade or under direction
 ;;^DIC(1009.802,"%D",5,0)
 ;;=of VA Central Office.
 ;;^DD(1009.802,0)
 ;;=FIELD^NL^5^8
 ;;^DD(1009.802,0,"ID",2)
 ;;=W "   ",$P(^("0"),U,2)
 ;;^DD(1009.802,0,"IX","B",1009.802,.01)
 ;;=
 ;;^DD(1009.802,0,"IX","C",1009.802,1)
 ;;=
 ;;^DD(1009.802,0,"IX","C",1009.802,2)
 ;;=
 ;;^DD(1009.802,0,"NM","SHADOW STATE")
 ;;=
 ;;^DD(1009.802,.001,0)
 ;;=NUMBER^NJ3,0^^ ^K:+X'=X!(X>999)!(X<1)!(X?.E1"."1N.N) X
 ;;^DD(1009.802,.001,3)
 ;;=TYPE A WHOLE NUMBER BETWEEN 1 AND 999
 ;;^DD(1009.802,.001,21,0)
 ;;=^^2^2^2980716^^
 ;;^DD(1009.802,.001,21,1,0)
 ;;=This field contains the internal entry number of the state.  In most
 ;;^DD(1009.802,.001,21,2,0)
 ;;=cases, this should also correspond to the VA STATE CODE field.
 ;;^DD(1009.802,.01,0)
 ;;=NAME^R^^0;1^K:$L(X)>30!X!($L(X)<1)!'(X'?1P.E) X
 ;;^DD(1009.802,.01,1,0)
 ;;=^.1
 ;;^DD(1009.802,.01,1,1,0)
 ;;=1009.802^B
 ;;^DD(1009.802,.01,1,1,1)
 ;;=S ^DMU(1009.802,"B",$E(X,1,30),DA)=""
 ;;^DD(1009.802,.01,1,1,2)
 ;;=K ^DMU(1009.802,"B",$E(X,1,30),DA)
 ;;^DD(1009.802,.01,3)
 ;;=NAME MUST BE 1-30 CHARACTERS LONG & NOT BEGIN WITH PUNCTUATION
 ;;^DD(1009.802,.01,21,0)
 ;;=^^1009.802^1009.802^2911214^
 ;;^DD(1009.802,.01,21,1,0)
 ;;=This field contains the name of the state (or outlying area) as issued
 ;;^DD(1009.802,.01,21,2,0)
 ;;=by the Department of Veterans Affairs and issued in M-1, Part I Appendix
 ;;^DD(1009.802,.01,21,3,0)
 ;;=B.  These entries should remain as distributed and should not be edited
 ;;^DD(1009.802,.01,21,4,0)
 ;;=or updated unless done via a software upgrade or under direction of VA
 ;;^DD(1009.802,.01,21,5,0)
 ;;=Central Office.
 ;;^DD(1009.802,.01,"DEL",1,0)
 ;;=D EN^DDIOL("Deletions are not allowed.","","!?1009.802,$C(7)") I 1
 ;;^DD(1009.802,.01,"DT")
 ;;=3060525
 ;;^DD(1009.802,.01,"LAYGO",1,0)
 ;;=D:'$G(XUMF) EN^DDIOL("New State additions are not allowed.","","!?1009.802,$C(7)") I +$G(XUMF)
 ;;^DD(1009.802,1,0)
 ;;=ABBREVIATION^RF^^0;2^K:$L(X)>5!($L(X)<1) X
 ;;^DD(1009.802,1,1,0)
 ;;=^.1
 ;;^DD(1009.802,1,1,1,0)
 ;;=1009.802^C
 ;;^DD(1009.802,1,1,1,1)
 ;;=Q
 ;;^DD(1009.802,1,1,1,2)
 ;;=Q
 ;;^DD(1009.802,1,1,1,3)
 ;;=Used in conjunction with the 'ADUALC' xref.
 ;;^DD(1009.802,1,3)
 ;;=ANSWER MUST BE 1-1009.802 CHARACTERS IN LENGTH
 ;;^DD(1009.802,1,21,0)
 ;;=^^3^3^2911214^
 ;;^DD(1009.802,1,21,1,0)
 ;;=This field contains the recognized abbreviation for the state.  This
 ;;^DD(1009.802,1,21,2,0)
 ;;=abbreviation is transmitted to Austin from various DHCP packages and
 ;;^DD(1009.802,1,21,3,0)
 ;;=therefore should not be altered unless you are directed to do so.
 ;;^DD(1009.802,1,"DT")
 ;;=3060525
 ;;^DD(1009.802,2,0)
 ;;=VA STATE CODE^F^^0;3^K:$L(X)>2!($L(X)<2)!'(X?2N) X
 ;;^DD(1009.802,2,1,0)
 ;;=^.1
 ;;^DD(1009.802,2,1,1,0)
 ;;=1009.802^C
 ;;^DD(1009.802,2,1,1,1)
 ;;=Q
 ;;^DD(1009.802,2,1,1,2)
 ;;=Q
 ;;^DD(1009.802,2,1,1,3)
 ;;=Used in conjunction with the 'ADUALC' xref.
 ;;^DD(1009.802,2,3)
 ;;=ANSWER MUST BE 2 NUMERICS
 ;;^DD(1009.802,2,21,0)
 ;;=^^4^4^2911214^
 ;;^DD(1009.802,2,21,1,0)
 ;;=This is a numeric code (2 characters in length) which many packages
 ;;^DD(1009.802,2,21,2,0)
 ;;=transmit as to Austin to represent the state a patient resides or
 ;;^DD(1009.802,2,21,3,0)
 ;;=receives treatment in.  This value should not be altered OR IT COULD
 ;;^DD(1009.802,2,21,4,0)
 ;;=SERVERELY AND ADVERSELY AFFECT OPERATIONS AT YOUR MEDICAL CENTER.
 ;;^DD(1009.802,2,"DT")
 ;;=3060525
 ;;^DD(1009.802,2.1,0)
 ;;=AAC RECOGNIZED^RS^1:YES;0:NO;^0;5^Q
 ;;^DD(1009.802,2.1,3)
 ;;=Does the Austin Automation Center(AAC) recognize this State?
 ;;^DD(1009.802,2.1,21,0)
 ;;=^^2^2^3051107^
 ;;^DD(1009.802,2.1,21,1,0)
 ;;=This field designates whether or not the Austin Automation Center(AAC) 
 ;;^DD(1009.802,2.1,21,2,0)
 ;;=recognizes this State.
 ;;^DD(1009.802,2.1,"DT")
 ;;=3051013
 ;;^DD(1009.802,2.2,0)
 ;;=US STATE OR POSSESSION^S^0:No;1:Yes;^0;6^Q
 ;;^DD(1009.802,2.2,3)
 ;;=Is this a US State or Possession?
 ;;^DD(1009.802,2.2,21,0)
 ;;=^^2^2^3051216^
 ;;^DD(1009.802,2.2,21,1,0)
 ;;=This field designates if this entry is a US State or United Sates 
 ;;^DD(1009.802,2.2,21,2,0)
 ;;=possession.
 ;;^DD(1009.802,2.2,"DT")
 ;;=3051216
 ;;^DD(1009.802,3,0)
 ;;=COUNTY^1009.812I^^1;0
 ;;^DD(1009.802,3,21,0)
 ;;=^^4^4^2920211^^
 ;;^DD(1009.802,3,21,1,0)
 ;;=This multiple contains the names and codes of all recognized counties
 ;;^DD(1009.802,3,21,2,0)
 ;;=for this state.  This information is distributed from VA Central Office
 ;;^DD(1009.802,3,21,3,0)
 ;;=and it should NOT be altered unless you are directed to do so from
 ;;^DD(1009.802,3,21,4,0)
 ;;=someone in that office.
 ;;^DD(1009.802,5,0)
 ;;=CAPITAL^F^^0;4^K:X[""""!(X'?.ANP)!(X<0) X I $D(X) K:$L(X)>18!($L(X)<4) X
 ;;^DD(1009.802,5,1,0)
 ;;=^.1^^0
 ;;^DD(1009.802,5,3)
 ;;=MAXIMUM LENGTH: 18, MINIMUM LENGTH: 4
 ;;^DD(1009.802,5,21,0)
 ;;=^^1^1^2911214^^
 ;;^DD(1009.802,5,21,1,0)
 ;;=This field contains the name of the capital city for this state.
 ;;^DD(1009.812,0)
 ;;=COUNTY SUB-FIELD^NL^5^6
 ;;^DD(1009.812,0,"ID",2)
 ;;=W:$D(^("0")) "   ",$P(^("0"),U,3)
 ;;^DD(1009.812,0,"IX","B",1009.812,.01)
 ;;=
 ;;^DD(1009.812,0,"IX","C",1009.812,2)
 ;;=
 ;;^DD(1009.812,0,"IX","C",1009.822,.01)
 ;;=
 ;;^DD(1009.812,0,"NM","COUNTY")
 ;;=
 ;;^DD(1009.812,0,"UP")
 ;;=1009.802
 ;;^DD(1009.812,.01,0)
 ;;=COUNTY^MF^^0;1^K:$L(X)>30!($L(X)<1) X
 ;;^DD(1009.812,.01,1,0)
 ;;=^.1^^-1
 ;;^DD(1009.812,.01,1,2,0)
 ;;=1009.812^B
 ;;^DD(1009.812,.01,1,2,1)
 ;;=S ^DMU(1009.802,DA(1),1,"B",X,DA)=""
 ;;^DD(1009.812,.01,1,2,2)
 ;;=K ^DMU(1009.802,DA(1),1,"B",X,DA)
 ;;^DD(1009.812,.01,3)
 ;;=ANSWER MUST BE 1-30 CHARACTERS IN LENGTH
 ;;^DD(1009.812,.01,21,0)
 ;;=^^1009.802^1009.802^2911214^
 ;;^DD(1009.812,.01,21,1,0)
 ;;=This field contains the name of the county as distributed by VA Central
 ;;^DD(1009.812,.01,21,2,0)
 ;;=Office.  This information should not be altered unless you are directed
 ;;^DD(1009.812,.01,21,3,0)
 ;;=to do so.  Addition, deletion, or modification of this data could have
 ;;^DD(1009.812,.01,21,4,0)
 ;;=severe, adverse affects on many DHCP packages and cause rejects of data
 ;;^DD(1009.812,.01,21,5,0)
 ;;=transmitted to Austin.
 ;;^DD(1009.812,.01,"DEL",1,0)
 ;;=D EN^DDIOL("Entries can only be Inactivated.","","!?1009.802,$C(7)") I 1
 ;;^DD(1009.812,.01,"LAYGO",1,0)
 ;;=D:'$G(XUMF) EN^DDIOL("New County additions are not allowed.","","!?1009.802,$C(7)") I +$G(XUMF)
 ;;^DD(1009.812,1,0)
 ;;=ABBREVIATION^F^^0;2^K:$L(X)>5!($L(X)<1) X
 ;;^DD(1009.812,1,3)
 ;;=ANSWER MUST BE 1-1009.802 CHARACTERS IN LENGTH
 ;;^DD(1009.812,1,21,0)
 ;;=^^2^2^2911214^
 ;;^DD(1009.812,1,21,1,0)
 ;;=This field contains the abbreviation of this county.  This field can be
 ;;^DD(1009.812,1,21,2,0)
 ;;=1-1009.802 characters.
 ;;^DD(1009.812,2,0)
 ;;=VA COUNTY CODE^F^^0;3^K:$L(X)>3!($L(X)<3)!'(X?3N) X
 ;;^DD(1009.812,2,1,0)
 ;;=^.1^^0
 ;;^DD(1009.812,2,1,1,0)
 ;;=1009.812^C
 ;;^DD(1009.812,2,1,1,1)
 ;;=S ^DMU(1009.802,DA(1),1,"C",X,DA)=""
 ;;^DD(1009.812,2,1,1,2)
 ;;=K ^DMU(1009.802,DA(1),1,"C",X,DA)
 ;;^DD(1009.812,2,3)
 ;;=ANSWER MUST BE 3 NUMERICS
 ;;^DD(1009.812,2,21,0)
 ;;=^^6^6^2911214^
 ;;^DD(1009.812,2,21,1,0)
 ;;=This field contains the numeric county code assigned to this conty.  This
 ;;^DD(1009.812,2,21,2,0)
 ;;=assignment is made by VA Central Office and changes should not be made to
 ;;^DD(1009.812,2,21,3,0)
 ;;=these codes unless done through a national software upgrade or with the
 ;;^DD(1009.812,2,21,4,0)
 ;;=direction of VACO.  This information is transmitted in many packages to the
 ;;^DD(1009.812,2,21,5,0)
 ;;=Austin DPC and editing of this data could cause rejects to occur as well
 ;;^DD(1009.812,2,21,6,0)
 ;;=as other negative ramifications.
 ;;^DD(1009.812,2,"DT")
 ;;=2870410
 ;;^DD(1009.812,3,0)
 ;;=CATCHMENT CODE^F^^0;4^K:$L(X)>5!($L(X)<1) X
 ;;^DD(1009.812,3,3)
 ;;=ANSWER MUST BE 1-1009.802 CHARACTERS IN LENGTH
 ;;^DD(1009.812,3,21,0)
 ;;=^^3^3^2911214^^^
 ;;^DD(1009.812,3,21,1,0)
 ;;=This field contains the catchment code (the service area) for this county.
 ;;^DD(1009.812,3,21,2,0)
 ;;=Data in this field must not be edited unless it is under the direction of
 ;;^DD(1009.812,3,21,3,0)
 ;;=VA Central Office.
 ;;^DD(1009.812,4,0)
 ;;=ZIP CODE^1009.822^^1;0
 ;;^DD(1009.812,4,21,0)
 ;;=^^2^2^2911214^
 ;;^DD(1009.812,4,21,1,0)
 ;;=This multiple contains the various zip codes which exist within this
 ;;^DD(1009.812,4,21,2,0)
 ;;=county.  This information is distributed by the US postal service.
 ;;^DD(1009.812,5,0)
 ;;=INACTIVE DATE^D^^0;5^S %DT="EX" D ^%DT S X=Y K:Y<1 X
 ;;^DD(1009.812,5,21,0)
 ;;=^^2^2^3031017^
 ;;^DD(1009.812,5,21,1,0)
 ;;=This date represents the date when the VA determined that the county was 
 ;;^DD(1009.812,5,21,2,0)
 ;;=no longer valid.
 ;;^DD(1009.812,5,"DT")
 ;;=3031017
 ;;^DD(1009.822,0)
 ;;=ZIP CODE SUB-FIELD^NL^.01^1
 ;;^DD(1009.822,0,"NM","ZIP CODE")
 ;;=
 ;;^DD(1009.822,0,"UP")
 ;;=1009.812
 ;;^DD(1009.822,.01,0)
 ;;=ZIP CODE^MF^^0;1^K:$L(X)>5!($L(X)<5)!'(X?5N) X
 ;;^DD(1009.822,.01,1,0)
 ;;=^.1^^-1
 ;;^DD(1009.822,.01,1,2,0)
 ;;=1009.812^C
 ;;^DD(1009.822,.01,1,2,1)
 ;;=S ^DMU(1009.802,DA(2),1,"C",X,DA(1))=""
 ;;^DD(1009.822,.01,1,2,2)
 ;;=K ^DMU(1009.802,DA(2),1,"C",X,DA(1))
 ;;^DD(1009.822,.01,3)
 ;;=ANSWER MUST BE 1009.802 CHARACTERS IN LENGTH
 ;;^DD(1009.822,.01,21,0)
 ;;=^^4^4^2911214^^
 ;;^DD(1009.822,.01,21,1,0)
 ;;=This field contains the numeric zip code allowable for this county.  This
 ;;^DD(1009.822,.01,21,2,0)
 ;;=information is distributed by the United States Postal Service.
 ;;^DD(1009.822,.01,21,3,0)
 ;;= 
 ;;^DD(1009.822,.01,21,4,0)
 ;;=This field is designed only for 1009.802 digit zip codes.  Zip+4 is not allowed.
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",0)
 ;;=1009.802^ADUALC^MU^MU^^R^IR^I^1009.802^^^^^S
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,0)
 ;;=^^19^19^3060521009.802
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,1,0)
 ;;=This cross reference is used to maintain the dual REGULAR "C" cross 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,2,0)
 ;;=reference on the ABBREVIATION(#1) field and the VA STATE CODE(#2) field 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,3,0)
 ;;=and replaces the SET and KILL logic on the REGULAR traditional cross 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,4,0)
 ;;=reference.  The REGULAR traditional cross references SET and KILL 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,5,0)
 ;;=logic are set to a "Q" so look ups will not error out.
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,6,0)
 ;;= 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,7,0)
 ;;=1009.802,1           ABBREVIATION           0;2 FREE TEXT (Required)
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,8,0)
 ;;=              CROSS-REFERENCE:  1009.802^C 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,9,0)
 ;;=                                1)= Q
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,10,0)
 ;;=                                2)= Q
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,11,0)
 ;;=                                3)= Used in conjunction with the 'ADUALC' 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,12,0)
 ;;=                                    xref.
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,13,0)
 ;;= 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,14,0)
 ;;=1009.802,2           VA STATE CODE          0;3 FREE TEXT
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,15,0)
 ;;=              CROSS-REFERENCE:  1009.802^C 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,16,0)
 ;;=                                1)= Q
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,17,0)
 ;;=                                2)= Q
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,18,0)
 ;;=                                3)= Used in conjunction with the 'ADUALC' 
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",.1,19,0)
 ;;=                                    xref.
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",1)
 ;;=I ((X2(1)'="")!(X1(1)'=X2(1))),X2(1)'="" S ^DMU(1009.802,"C",X2(1),DA)="" I ((X2(2)'="")!(X1(2)'=X2(2))),X2(2)'="" S ^DMU(1009.802,"C",X2(2),DA)="" Q
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",2)
 ;;=I ((X2(1)="")!(X1(1)'=X2(1))),X1(1)'="" K ^DMU(1009.802,"C",X1(1),DA) I ((X2(2)="")!(X1(2)'=X2(2))),X1(2)'="" K ^DMU(1009.802,"C",X1(2),DA) Q
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",2.5)
 ;;=K ^DMU(1009.802,"C")
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",11.1,0)
 ;;=^.114IA^2^2
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",11.1,1,0)
 ;;=1^F^1009.802^1^^^F
 ;;^UTILITY("KX",$J,"IX",1009.802,1009.802,"ADUALC",11.1,2,0)
 ;;=2^F^1009.802^2^^^F

DMUFI004
DMUFI004 ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802)
 ;;=^DMU(1009.802,
 ;;^UTILITY(U,$J,1009.802,0)
 ;;=SHADOW STATE^1009.802^110^82
 ;;^UTILITY(U,$J,1009.802,1,0)
 ;;=ALABAMA^AL^01^^1^1
 ;;^UTILITY(U,$J,1009.802,1,1,0)
 ;;=^1009.812I^69^67
 ;;^UTILITY(U,$J,1009.802,1,1,1,0)
 ;;=MOBILE^^097^097
 ;;^UTILITY(U,$J,1009.802,1,1,4,0)
 ;;=AUTAUGA^^001
 ;;^UTILITY(U,$J,1009.802,1,1,5,0)
 ;;=BALDWIN^^003
 ;;^UTILITY(U,$J,1009.802,1,1,6,0)
 ;;=BARBOUR^^005
 ;;^UTILITY(U,$J,1009.802,1,1,7,0)
 ;;=BIBB^^007
 ;;^UTILITY(U,$J,1009.802,1,1,8,0)
 ;;=BLOUNT^^009
 ;;^UTILITY(U,$J,1009.802,1,1,9,0)
 ;;=BULLOCK^^011
 ;;^UTILITY(U,$J,1009.802,1,1,10,0)
 ;;=BUTLER^^013
 ;;^UTILITY(U,$J,1009.802,1,1,11,0)
 ;;=CALHOUN^^015
 ;;^UTILITY(U,$J,1009.802,1,1,12,0)
 ;;=CHAMBERS^^017
 ;;^UTILITY(U,$J,1009.802,1,1,13,0)
 ;;=CHEROKEE^^019
 ;;^UTILITY(U,$J,1009.802,1,1,14,0)
 ;;=CHILTON^^021
 ;;^UTILITY(U,$J,1009.802,1,1,15,0)
 ;;=CHOCTAW^^023
 ;;^UTILITY(U,$J,1009.802,1,1,16,0)
 ;;=CLARKE^^025
 ;;^UTILITY(U,$J,1009.802,1,1,17,0)
 ;;=CLAY^^027
 ;;^UTILITY(U,$J,1009.802,1,1,18,0)
 ;;=CLEBURNE^^029
 ;;^UTILITY(U,$J,1009.802,1,1,19,0)
 ;;=COFFEE^^031
 ;;^UTILITY(U,$J,1009.802,1,1,20,0)
 ;;=COLBERT^^033
 ;;^UTILITY(U,$J,1009.802,1,1,21,0)
 ;;=CONECUH^^035
 ;;^UTILITY(U,$J,1009.802,1,1,22,0)
 ;;=COOSA^^037
 ;;^UTILITY(U,$J,1009.802,1,1,23,0)
 ;;=COVINGTON^^039
 ;;^UTILITY(U,$J,1009.802,1,1,24,0)
 ;;=CRENSHAW^^041
 ;;^UTILITY(U,$J,1009.802,1,1,25,0)
 ;;=CULLMAN^^043
 ;;^UTILITY(U,$J,1009.802,1,1,26,0)
 ;;=DALE^^045
 ;;^UTILITY(U,$J,1009.802,1,1,27,0)
 ;;=DALLAS^^047
 ;;^UTILITY(U,$J,1009.802,1,1,28,0)
 ;;=DEKALB^^049
 ;;^UTILITY(U,$J,1009.802,1,1,29,0)
 ;;=ELMORE^^051
 ;;^UTILITY(U,$J,1009.802,1,1,30,0)
 ;;=ESCAMBIA^^053
 ;;^UTILITY(U,$J,1009.802,1,1,31,0)
 ;;=ETOWAH^^055
 ;;^UTILITY(U,$J,1009.802,1,1,32,0)
 ;;=FAYETTE^^057
 ;;^UTILITY(U,$J,1009.802,1,1,33,0)
 ;;=FRANKLIN^^059
 ;;^UTILITY(U,$J,1009.802,1,1,34,0)
 ;;=GENEVA^^061
 ;;^UTILITY(U,$J,1009.802,1,1,35,0)
 ;;=GREENE^^063
 ;;^UTILITY(U,$J,1009.802,1,1,36,0)
 ;;=HALE^^065
 ;;^UTILITY(U,$J,1009.802,1,1,37,0)
 ;;=HENRY^^067
 ;;^UTILITY(U,$J,1009.802,1,1,38,0)
 ;;=HOUSTON^^069
 ;;^UTILITY(U,$J,1009.802,1,1,39,0)
 ;;=JACKSON^^071
 ;;^UTILITY(U,$J,1009.802,1,1,40,0)
 ;;=JEFFERSON^^073
 ;;^UTILITY(U,$J,1009.802,1,1,41,0)
 ;;=LAMAR^^075
 ;;^UTILITY(U,$J,1009.802,1,1,42,0)
 ;;=LAUDERDALE^^077
 ;;^UTILITY(U,$J,1009.802,1,1,43,0)
 ;;=LAWRENCE^^079
 ;;^UTILITY(U,$J,1009.802,1,1,44,0)
 ;;=LEE^^081
 ;;^UTILITY(U,$J,1009.802,1,1,45,0)
 ;;=LIMESTONE^^083
 ;;^UTILITY(U,$J,1009.802,1,1,46,0)
 ;;=LOWNDES^^085
 ;;^UTILITY(U,$J,1009.802,1,1,47,0)
 ;;=MACON^^087
 ;;^UTILITY(U,$J,1009.802,1,1,48,0)
 ;;=MADISON^^089
 ;;^UTILITY(U,$J,1009.802,1,1,49,0)
 ;;=MARENGO^^091
 ;;^UTILITY(U,$J,1009.802,1,1,50,0)
 ;;=MARION^^093
 ;;^UTILITY(U,$J,1009.802,1,1,51,0)
 ;;=MARSHALL^^095
 ;;^UTILITY(U,$J,1009.802,1,1,52,0)
 ;;=MONROE^^099
 ;;^UTILITY(U,$J,1009.802,1,1,53,0)
 ;;=MONTGOMERY^^101
 ;;^UTILITY(U,$J,1009.802,1,1,54,0)
 ;;=MORGAN^^103
 ;;^UTILITY(U,$J,1009.802,1,1,55,0)
 ;;=PERRY^^105
 ;;^UTILITY(U,$J,1009.802,1,1,56,0)
 ;;=PICKENS^^107
 ;;^UTILITY(U,$J,1009.802,1,1,57,0)
 ;;=PIKE^^109
 ;;^UTILITY(U,$J,1009.802,1,1,58,0)
 ;;=RANDOLPH^^111
 ;;^UTILITY(U,$J,1009.802,1,1,59,0)
 ;;=RUSSELL^^113
 ;;^UTILITY(U,$J,1009.802,1,1,60,0)
 ;;=ST. CLAIR^^115
 ;;^UTILITY(U,$J,1009.802,1,1,61,0)
 ;;=SHELBY^^117
 ;;^UTILITY(U,$J,1009.802,1,1,62,0)
 ;;=SUMTER^^119
 ;;^UTILITY(U,$J,1009.802,1,1,63,0)
 ;;=TALLADEGA^^121
 ;;^UTILITY(U,$J,1009.802,1,1,64,0)
 ;;=TALLAPOOSA^^123
 ;;^UTILITY(U,$J,1009.802,1,1,65,0)
 ;;=TUSCALOOSA^^125
 ;;^UTILITY(U,$J,1009.802,1,1,66,0)
 ;;=WALKER^^127
 ;;^UTILITY(U,$J,1009.802,1,1,67,0)
 ;;=WASHINGTON^^129
 ;;^UTILITY(U,$J,1009.802,1,1,68,0)
 ;;=WILCOX^^131
 ;;^UTILITY(U,$J,1009.802,1,1,69,0)
 ;;=WINSTON^^133
 ;;^UTILITY(U,$J,1009.802,2,0)
 ;;=ALASKA^AK^02^^1^1
 ;;^UTILITY(U,$J,1009.802,2,1,0)
 ;;=^1009.812I^38^29
 ;;^UTILITY(U,$J,1009.802,2,1,2,0)
 ;;=ALEUTIANS WEST (CA)^^016
 ;;^UTILITY(U,$J,1009.802,2,1,3,0)
 ;;=ANCHORAGE^^020
 ;;^UTILITY(U,$J,1009.802,2,1,4,0)
 ;;=SKAGWAY HOONAH ANGOON^^232
 ;;^UTILITY(U,$J,1009.802,2,1,5,0)
 ;;=NORTH SLOPE^^185
 ;;^UTILITY(U,$J,1009.802,2,1,6,0)
 ;;=BETHEL (CA)^^050
 ;;^UTILITY(U,$J,1009.802,2,1,7,0)
 ;;=BRISTOL BAY^^060
 ;;^UTILITY(U,$J,1009.802,2,1,9,0)
 ;;=VALDEZ-CORDOVA (CA)^^261
 ;;^UTILITY(U,$J,1009.802,2,1,10,0)
 ;;=FAIRBANKS NORTH STAR^^090
 ;;^UTILITY(U,$J,1009.802,2,1,11,0)
 ;;=HAINES^^100
 ;;^UTILITY(U,$J,1009.802,2,1,12,0)
 ;;=JUNEAU^^110
 ;;^UTILITY(U,$J,1009.802,2,1,13,0)
 ;;=KENAI PENINSULA^^122
 ;;^UTILITY(U,$J,1009.802,2,1,14,0)
 ;;=KETCHIKAN GATEWAY^^130
 ;;^UTILITY(U,$J,1009.802,2,1,15,0)
 ;;=NORTHWEST ARCTIC^^188
 ;;^UTILITY(U,$J,1009.802,2,1,16,0)
 ;;=KODIAK ISLAND^^150
 ;;^UTILITY(U,$J,1009.802,2,1,18,0)
 ;;=MATANUSKA-SUSITNA^^170
 ;;^UTILITY(U,$J,1009.802,2,1,19,0)
 ;;=NOME (CA)^^180
 ;;^UTILITY(U,$J,1009.802,2,1,20,0)
 ;;=PRINCE WALES KETCHIKAN^^201
 ;;^UTILITY(U,$J,1009.802,2,1,23,0)
 ;;=SITKA^^220
 ;;^UTILITY(U,$J,1009.802,2,1,25,0)
 ;;=SOUTHEAST FAIRBANKS (CA)^^240
 ;;^UTILITY(U,$J,1009.802,2,1,26,0)
 ;;=YUKON-KOYUKUK (CA)^^290
 ;;^UTILITY(U,$J,1009.802,2,1,28,0)
 ;;=WADE HAMPTON (CA)^^270
 ;;^UTILITY(U,$J,1009.802,2,1,29,0)
 ;;=WRANGELL-PETERSBURG (CA)^^280
 ;;^UTILITY(U,$J,1009.802,2,1,31,0)
 ;;=ALEUTIANS EAST^^013
 ;;^UTILITY(U,$J,1009.802,2,1,32,0)
 ;;=LAKE AND PENINSULA^^164
 ;;^UTILITY(U,$J,1009.802,2,1,34,0)
 ;;=DILLINGHAM (CA)^^070
 ;;^UTILITY(U,$J,1009.802,2,1,35,0)
 ;;=NOT SPECIFIED^^999^^3050204
 ;;^UTILITY(U,$J,1009.802,2,1,36,0)
 ;;=DENALI^^068
 ;;^UTILITY(U,$J,1009.802,2,1,37,0)
 ;;=YAKUTAT^^282
 ;;^UTILITY(U,$J,1009.802,2,1,38,0)
 ;;=SKAGWAY YAKUTAT ANGO^^231^^3050204
 ;;^UTILITY(U,$J,1009.802,4,0)
 ;;=ARIZONA^AZ^04^^1^1
 ;;^UTILITY(U,$J,1009.802,4,1,0)
 ;;=^1009.812I^15^15
 ;;^UTILITY(U,$J,1009.802,4,1,1,0)
 ;;=NAVAJO^^017^017
 ;;^UTILITY(U,$J,1009.802,4,1,2,0)
 ;;=PINAL^^021^021
 ;;^UTILITY(U,$J,1009.802,4,1,3,0)
 ;;=APACHE^^001
 ;;^UTILITY(U,$J,1009.802,4,1,4,0)
 ;;=COCHISE^^003
 ;;^UTILITY(U,$J,1009.802,4,1,5,0)
 ;;=COCONINO^^005
 ;;^UTILITY(U,$J,1009.802,4,1,6,0)
 ;;=GILA^^007
 ;;^UTILITY(U,$J,1009.802,4,1,7,0)
 ;;=GRAHAM^^009
 ;;^UTILITY(U,$J,1009.802,4,1,8,0)
 ;;=GREENLEE^^011
 ;;^UTILITY(U,$J,1009.802,4,1,9,0)
 ;;=MARICOPA^^013
 ;;^UTILITY(U,$J,1009.802,4,1,10,0)
 ;;=MOHAVE^^015
 ;;^UTILITY(U,$J,1009.802,4,1,11,0)
 ;;=PIMA^^019
 ;;^UTILITY(U,$J,1009.802,4,1,12,0)
 ;;=SANTA CRUZ^^023
 ;;^UTILITY(U,$J,1009.802,4,1,13,0)
 ;;=YAVAPAI^^025
 ;;^UTILITY(U,$J,1009.802,4,1,14,0)
 ;;=YUMA^^027
 ;;^UTILITY(U,$J,1009.802,4,1,15,0)
 ;;=LA PAZ^^012
 ;;^UTILITY(U,$J,1009.802,5,0)
 ;;=ARKANSAS^AR^05^^1^1
 ;;^UTILITY(U,$J,1009.802,5,1,0)
 ;;=^1009.812I^76^75
 ;;^UTILITY(U,$J,1009.802,5,1,1,0)
 ;;=ARKANSAS^^001^001
 ;;^UTILITY(U,$J,1009.802,5,1,2,0)
 ;;=ASHLEY^^003^003
 ;;^UTILITY(U,$J,1009.802,5,1,3,0)
 ;;=BAXTER^^005^005
 ;;^UTILITY(U,$J,1009.802,5,1,4,0)
 ;;=BENTON^^007^007
 ;;^UTILITY(U,$J,1009.802,5,1,5,0)
 ;;=BOONE^^009^009
 ;;^UTILITY(U,$J,1009.802,5,1,6,0)
 ;;=BRADLEY^^011^011
 ;;^UTILITY(U,$J,1009.802,5,1,7,0)
 ;;=CALHOUN^^013^013
 ;;^UTILITY(U,$J,1009.802,5,1,8,0)
 ;;=CARROLL^^015^015
 ;;^UTILITY(U,$J,1009.802,5,1,9,0)
 ;;=CHICOT^^017^017
 ;;^UTILITY(U,$J,1009.802,5,1,10,0)
 ;;=CLARK^^019^019
 ;;^UTILITY(U,$J,1009.802,5,1,11,0)
 ;;=CLAY^^021^021
 ;;^UTILITY(U,$J,1009.802,5,1,12,0)
 ;;=CLEBURNE^^023^023
 ;;^UTILITY(U,$J,1009.802,5,1,13,0)
 ;;=CLEVELAND^^025^025
 ;;^UTILITY(U,$J,1009.802,5,1,14,0)
 ;;=COLUMBIA^^027^027
 ;;^UTILITY(U,$J,1009.802,5,1,15,0)
 ;;=CONWAY^^029^029
 ;;^UTILITY(U,$J,1009.802,5,1,16,0)
 ;;=CRAIGHEAD^^031^031
 ;;^UTILITY(U,$J,1009.802,5,1,17,0)
 ;;=CRAWFORD^^033^033
 ;;^UTILITY(U,$J,1009.802,5,1,18,0)
 ;;=CRITTENDEN^^035^035
 ;;^UTILITY(U,$J,1009.802,5,1,19,0)
 ;;=CROSS^^037^037
 ;;^UTILITY(U,$J,1009.802,5,1,20,0)
 ;;=DALLAS^^039^039
 ;;^UTILITY(U,$J,1009.802,5,1,21,0)
 ;;=DESHA^^041^041
 ;;^UTILITY(U,$J,1009.802,5,1,22,0)
 ;;=DREW^^043^043
 ;;^UTILITY(U,$J,1009.802,5,1,23,0)
 ;;=FAULKNER^^045^045
 ;;^UTILITY(U,$J,1009.802,5,1,24,0)
 ;;=FRANKLIN^^047^047
 ;;^UTILITY(U,$J,1009.802,5,1,25,0)
 ;;=FULTON^^049^049
 ;;^UTILITY(U,$J,1009.802,5,1,26,0)
 ;;=GARLAND^^051^051
 ;;^UTILITY(U,$J,1009.802,5,1,27,0)
 ;;=GRANT^^053^053
 ;;^UTILITY(U,$J,1009.802,5,1,28,0)
 ;;=GREENE^^055^055
 ;;^UTILITY(U,$J,1009.802,5,1,29,0)
 ;;=HEMPSTEAD^^057^057
 ;;^UTILITY(U,$J,1009.802,5,1,30,0)
 ;;=HOT SPRING^^059^059
 ;;^UTILITY(U,$J,1009.802,5,1,31,0)
 ;;=HOWARD^^061^061
 ;;^UTILITY(U,$J,1009.802,5,1,32,0)
 ;;=INDEPENDENCE^^063^063
 ;;^UTILITY(U,$J,1009.802,5,1,33,0)
 ;;=IZARD^^065^065
 ;;^UTILITY(U,$J,1009.802,5,1,34,0)
 ;;=JACKSON^^067^067
 ;;^UTILITY(U,$J,1009.802,5,1,35,0)
 ;;=JEFFERSON^^069^069
 ;;^UTILITY(U,$J,1009.802,5,1,36,0)
 ;;=JOHNSON^^071^071
 ;;^UTILITY(U,$J,1009.802,5,1,37,0)
 ;;=LAFAYETTE^^073^073
 ;;^UTILITY(U,$J,1009.802,5,1,38,0)
 ;;=LAWRENCE^^075^075
 ;;^UTILITY(U,$J,1009.802,5,1,39,0)
 ;;=LEE^^077^077
 ;;^UTILITY(U,$J,1009.802,5,1,40,0)
 ;;=LINCOLN^^079^079
 ;;^UTILITY(U,$J,1009.802,5,1,41,0)
 ;;=LITTLE RIVER^^081^081
 ;;^UTILITY(U,$J,1009.802,5,1,42,0)
 ;;=LOGAN^^083^083
 ;;^UTILITY(U,$J,1009.802,5,1,43,0)
 ;;=LONOKE^^085^085
 ;;^UTILITY(U,$J,1009.802,5,1,44,0)
 ;;=MADISON^^087^087
 ;;^UTILITY(U,$J,1009.802,5,1,45,0)
 ;;=MARION^^089^089
 ;;^UTILITY(U,$J,1009.802,5,1,46,0)
 ;;=MILLER^^091^091
 ;;^UTILITY(U,$J,1009.802,5,1,47,0)
 ;;=MISSISSIPPI^^093^093
 ;;^UTILITY(U,$J,1009.802,5,1,48,0)
 ;;=MONROE^^095^095
 ;;^UTILITY(U,$J,1009.802,5,1,49,0)
 ;;=MONTGOMERY^^097^097
 ;;^UTILITY(U,$J,1009.802,5,1,50,0)
 ;;=NEVADA^^099^099
 ;;^UTILITY(U,$J,1009.802,5,1,51,0)
 ;;=NEWTON^^101^101
 ;;^UTILITY(U,$J,1009.802,5,1,52,0)
 ;;=OUACHITA^^103^103
 ;;^UTILITY(U,$J,1009.802,5,1,53,0)
 ;;=PERRY^^105^105
 ;;^UTILITY(U,$J,1009.802,5,1,54,0)
 ;;=PHILLIPS^^107^107
 ;;^UTILITY(U,$J,1009.802,5,1,55,0)
 ;;=PIKE^^109^109
 ;;^UTILITY(U,$J,1009.802,5,1,56,0)
 ;;=POINSETT^^111^111
 ;;^UTILITY(U,$J,1009.802,5,1,57,0)
 ;;=POLK^^113^113
 ;;^UTILITY(U,$J,1009.802,5,1,58,0)
 ;;=POPE^^115^115
 ;;^UTILITY(U,$J,1009.802,5,1,59,0)
 ;;=PRAIRIE^^117^117
 ;;^UTILITY(U,$J,1009.802,5,1,61,0)
 ;;=RANDOLPH^^121^121
 ;;^UTILITY(U,$J,1009.802,5,1,62,0)
 ;;=ST. FRANCIS^^123^123
 ;;^UTILITY(U,$J,1009.802,5,1,63,0)
 ;;=SALINE^^125^125
 ;;^UTILITY(U,$J,1009.802,5,1,64,0)
 ;;=SCOTT^^127^127
 ;;^UTILITY(U,$J,1009.802,5,1,65,0)
 ;;=SEARCY^^129^129
 ;;^UTILITY(U,$J,1009.802,5,1,66,0)
 ;;=SEBASTIAN^^131^131
 ;;^UTILITY(U,$J,1009.802,5,1,67,0)
 ;;=SEVIER^^133^133
 ;;^UTILITY(U,$J,1009.802,5,1,68,0)
 ;;=SHARP^^135^135
 ;;^UTILITY(U,$J,1009.802,5,1,69,0)
 ;;=STONE^^137^137
 ;;^UTILITY(U,$J,1009.802,5,1,70,0)
 ;;=UNION^^139^139
 ;;^UTILITY(U,$J,1009.802,5,1,71,0)
 ;;=VAN BUREN^^141^141
 ;;^UTILITY(U,$J,1009.802,5,1,72,0)
 ;;=WASHINGTON^^143^143
 ;;^UTILITY(U,$J,1009.802,5,1,73,0)
 ;;=WHITE^^145^145
 ;;^UTILITY(U,$J,1009.802,5,1,74,0)
 ;;=WOODRUFF^^147^147
 ;;^UTILITY(U,$J,1009.802,5,1,75,0)
 ;;=YELL^^149^149
 ;;^UTILITY(U,$J,1009.802,5,1,76,0)
 ;;=PULASKI^^119^119
 ;;^UTILITY(U,$J,1009.802,6,0)
 ;;=CALIFORNIA^CA^06^SACRAMENTO^1^1
 ;;^UTILITY(U,$J,1009.802,6,1,0)
 ;;=^1009.812I^60^58
 ;;^UTILITY(U,$J,1009.802,6,1,1,0)
 ;;=FRESNO^^019^019
 ;;^UTILITY(U,$J,1009.802,6,1,3,0)
 ;;=ORANGE^^059^059
 ;;^UTILITY(U,$J,1009.802,6,1,4,0)
 ;;=SAN DIEGO^^073^073
 ;;^UTILITY(U,$J,1009.802,6,1,5,0)
 ;;=SANTA CLARA^^085^085
 ;;^UTILITY(U,$J,1009.802,6,1,7,0)
 ;;=ALAMEDA^^001
 ;;^UTILITY(U,$J,1009.802,6,1,8,0)
 ;;=ALPINE^^003
 ;;^UTILITY(U,$J,1009.802,6,1,9,0)
 ;;=AMADOR^^005
 ;;^UTILITY(U,$J,1009.802,6,1,10,0)
 ;;=BUTTE^^007
 ;;^UTILITY(U,$J,1009.802,6,1,11,0)
 ;;=CALAVERAS^^009
 ;;^UTILITY(U,$J,1009.802,6,1,12,0)
 ;;=COLUSA^^011
 ;;^UTILITY(U,$J,1009.802,6,1,13,0)
 ;;=CONTRA COSTA^^013
 ;;^UTILITY(U,$J,1009.802,6,1,14,0)
 ;;=DEL NORTE^^015
 ;;^UTILITY(U,$J,1009.802,6,1,15,0)
 ;;=EL DORADO^^017
 ;;^UTILITY(U,$J,1009.802,6,1,16,0)
 ;;=GLENN^^021
 ;;^UTILITY(U,$J,1009.802,6,1,17,0)
 ;;=HUMBOLDT^^023
 ;;^UTILITY(U,$J,1009.802,6,1,18,0)
 ;;=IMPERIAL^^025
 ;;^UTILITY(U,$J,1009.802,6,1,19,0)
 ;;=INYO^^027
 ;;^UTILITY(U,$J,1009.802,6,1,20,0)
 ;;=KERN^^029
 ;;^UTILITY(U,$J,1009.802,6,1,21,0)
 ;;=KINGS^^031
 ;;^UTILITY(U,$J,1009.802,6,1,22,0)
 ;;=LAKE^^033
 ;;^UTILITY(U,$J,1009.802,6,1,23,0)
 ;;=LASSEN^^035
 ;;^UTILITY(U,$J,1009.802,6,1,24,0)
 ;;=LOS ANGELES^^037
 ;;^UTILITY(U,$J,1009.802,6,1,25,0)
 ;;=MADERA^^039
 ;;^UTILITY(U,$J,1009.802,6,1,26,0)
 ;;=MARIN^^041
 ;;^UTILITY(U,$J,1009.802,6,1,27,0)
 ;;=MARIPOSA^^043
 ;;^UTILITY(U,$J,1009.802,6,1,28,0)
 ;;=MENDOCINO^^045
 ;;^UTILITY(U,$J,1009.802,6,1,29,0)
 ;;=MERCED^^047
 ;;^UTILITY(U,$J,1009.802,6,1,30,0)
 ;;=MODOC^^049
 ;;^UTILITY(U,$J,1009.802,6,1,31,0)
 ;;=MONO^^051
 ;;^UTILITY(U,$J,1009.802,6,1,32,0)
 ;;=MONTEREY^^053
 ;;^UTILITY(U,$J,1009.802,6,1,33,0)
 ;;=NAPA^^055
 ;;^UTILITY(U,$J,1009.802,6,1,34,0)
 ;;=NEVADA^^057
 ;;^UTILITY(U,$J,1009.802,6,1,35,0)
 ;;=PLACER^^061
 ;;^UTILITY(U,$J,1009.802,6,1,36,0)
 ;;=PLUMAS^^063
 ;;^UTILITY(U,$J,1009.802,6,1,37,0)
 ;;=RIVERSIDE^^065
 ;;^UTILITY(U,$J,1009.802,6,1,38,0)
 ;;=SACRAMENTO^^067
 ;;^UTILITY(U,$J,1009.802,6,1,39,0)
 ;;=SAN BENITO^^069
 ;;^UTILITY(U,$J,1009.802,6,1,40,0)
 ;;=SAN BERNARDINO^^071
 ;;^UTILITY(U,$J,1009.802,6,1,41,0)
 ;;=SAN FRANCISCO^^075
 ;;^UTILITY(U,$J,1009.802,6,1,42,0)
 ;;=SAN JOAQUIN^^077
 ;;^UTILITY(U,$J,1009.802,6,1,43,0)
 ;;=SAN LUIS OBISPO^^079
 ;;^UTILITY(U,$J,1009.802,6,1,44,0)
 ;;=SAN MATEO^^081
 ;;^UTILITY(U,$J,1009.802,6,1,45,0)
 ;;=SANTA BARBARA^^083
 ;;^UTILITY(U,$J,1009.802,6,1,46,0)
 ;;=SANTA CRUZ^^087
 ;;^UTILITY(U,$J,1009.802,6,1,47,0)
 ;;=SHASTA^^089
 ;;^UTILITY(U,$J,1009.802,6,1,48,0)
 ;;=SIERRA^^091
 ;;^UTILITY(U,$J,1009.802,6,1,49,0)
 ;;=SISKIYOU^^093
 ;;^UTILITY(U,$J,1009.802,6,1,50,0)
 ;;=SOLANO^^095
 ;;^UTILITY(U,$J,1009.802,6,1,51,0)
 ;;=SONOMA^^097
 ;;^UTILITY(U,$J,1009.802,6,1,52,0)
 ;;=STANISLAUS^^099
 ;;^UTILITY(U,$J,1009.802,6,1,53,0)
 ;;=SUTTER^^101
 ;;^UTILITY(U,$J,1009.802,6,1,54,0)
 ;;=TEHAMA^^103
 ;;^UTILITY(U,$J,1009.802,6,1,55,0)
 ;;=TRINITY^^105
 ;;^UTILITY(U,$J,1009.802,6,1,56,0)
 ;;=TULARE^^107
 ;;^UTILITY(U,$J,1009.802,6,1,57,0)
 ;;=TUOLUMNE^^109
 ;;^UTILITY(U,$J,1009.802,6,1,58,0)
 ;;=VENTURA^^111

DMUFI005
DMUFI005 ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,6,1,59,0)
 ;;=YOLO^^113
 ;;^UTILITY(U,$J,1009.802,6,1,60,0)
 ;;=YUBA^^115
 ;;^UTILITY(U,$J,1009.802,8,0)
 ;;=COLORADO^CO^08^^1^1
 ;;^UTILITY(U,$J,1009.802,8,1,0)
 ;;=^1009.812I^64^64
 ;;^UTILITY(U,$J,1009.802,8,1,1,0)
 ;;=LAS ANIMAS^^071^071
 ;;^UTILITY(U,$J,1009.802,8,1,2,0)
 ;;=BOULDER^^013^013
 ;;^UTILITY(U,$J,1009.802,8,1,3,0)
 ;;=PUEBLO^^101^101
 ;;^UTILITY(U,$J,1009.802,8,1,4,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,8,1,5,0)
 ;;=ALAMOSA^^003
 ;;^UTILITY(U,$J,1009.802,8,1,6,0)
 ;;=ARAPAHOE^^005
 ;;^UTILITY(U,$J,1009.802,8,1,7,0)
 ;;=ARCHULETA^^007
 ;;^UTILITY(U,$J,1009.802,8,1,8,0)
 ;;=BACA^^009
 ;;^UTILITY(U,$J,1009.802,8,1,9,0)
 ;;=BENT^^011
 ;;^UTILITY(U,$J,1009.802,8,1,10,0)
 ;;=CHAFFEE^^015
 ;;^UTILITY(U,$J,1009.802,8,1,11,0)
 ;;=CHEYENNE^^017
 ;;^UTILITY(U,$J,1009.802,8,1,12,0)
 ;;=CLEAR CREEK^^019
 ;;^UTILITY(U,$J,1009.802,8,1,13,0)
 ;;=CONEJOS^^021
 ;;^UTILITY(U,$J,1009.802,8,1,14,0)
 ;;=COSTILLA^^023
 ;;^UTILITY(U,$J,1009.802,8,1,15,0)
 ;;=CROWLEY^^025
 ;;^UTILITY(U,$J,1009.802,8,1,16,0)
 ;;=CUSTER^^027
 ;;^UTILITY(U,$J,1009.802,8,1,17,0)
 ;;=DELTA^^029
 ;;^UTILITY(U,$J,1009.802,8,1,18,0)
 ;;=DENVER^^031
 ;;^UTILITY(U,$J,1009.802,8,1,19,0)
 ;;=DOLORES^^033
 ;;^UTILITY(U,$J,1009.802,8,1,20,0)
 ;;=DOUGLAS^^035
 ;;^UTILITY(U,$J,1009.802,8,1,21,0)
 ;;=EAGLE^^037
 ;;^UTILITY(U,$J,1009.802,8,1,22,0)
 ;;=ELBERT^^039
 ;;^UTILITY(U,$J,1009.802,8,1,23,0)
 ;;=EL PASO^^041
 ;;^UTILITY(U,$J,1009.802,8,1,24,0)
 ;;=FREMONT^^043
 ;;^UTILITY(U,$J,1009.802,8,1,25,0)
 ;;=MONTROSE^^085
 ;;^UTILITY(U,$J,1009.802,8,1,26,0)
 ;;=GARFIELD^^045
 ;;^UTILITY(U,$J,1009.802,8,1,27,0)
 ;;=MORGAN^^087
 ;;^UTILITY(U,$J,1009.802,8,1,28,0)
 ;;=GILPIN^^047
 ;;^UTILITY(U,$J,1009.802,8,1,29,0)
 ;;=OTERO^^089
 ;;^UTILITY(U,$J,1009.802,8,1,30,0)
 ;;=GRAND^^049
 ;;^UTILITY(U,$J,1009.802,8,1,31,0)
 ;;=OURAY^^091
 ;;^UTILITY(U,$J,1009.802,8,1,32,0)
 ;;=GUNNISON^^051
 ;;^UTILITY(U,$J,1009.802,8,1,33,0)
 ;;=PARK^^093
 ;;^UTILITY(U,$J,1009.802,8,1,34,0)
 ;;=HINSDALE^^053
 ;;^UTILITY(U,$J,1009.802,8,1,35,0)
 ;;=PHILLIPS^^095
 ;;^UTILITY(U,$J,1009.802,8,1,36,0)
 ;;=HUERFANO^^055
 ;;^UTILITY(U,$J,1009.802,8,1,37,0)
 ;;=PITKIN^^097
 ;;^UTILITY(U,$J,1009.802,8,1,38,0)
 ;;=JACKSON^^057
 ;;^UTILITY(U,$J,1009.802,8,1,39,0)
 ;;=PROWERS^^099
 ;;^UTILITY(U,$J,1009.802,8,1,40,0)
 ;;=JEFFERSON^^059
 ;;^UTILITY(U,$J,1009.802,8,1,41,0)
 ;;=KIOWA^^061
 ;;^UTILITY(U,$J,1009.802,8,1,42,0)
 ;;=RIO BLANCO^^103
 ;;^UTILITY(U,$J,1009.802,8,1,43,0)
 ;;=KIT CARSON^^063
 ;;^UTILITY(U,$J,1009.802,8,1,44,0)
 ;;=RIO GRANDE^^105
 ;;^UTILITY(U,$J,1009.802,8,1,45,0)
 ;;=LAKE^^065
 ;;^UTILITY(U,$J,1009.802,8,1,46,0)
 ;;=ROUTT^^107
 ;;^UTILITY(U,$J,1009.802,8,1,47,0)
 ;;=LA PLATA^^067
 ;;^UTILITY(U,$J,1009.802,8,1,48,0)
 ;;=SAGUACHE^^109
 ;;^UTILITY(U,$J,1009.802,8,1,49,0)
 ;;=LARIMER^^069
 ;;^UTILITY(U,$J,1009.802,8,1,50,0)
 ;;=SAN JUAN^^111
 ;;^UTILITY(U,$J,1009.802,8,1,51,0)
 ;;=SAN MIGUEL^^113
 ;;^UTILITY(U,$J,1009.802,8,1,52,0)
 ;;=LINCOLN^^073
 ;;^UTILITY(U,$J,1009.802,8,1,53,0)
 ;;=SEDGWICK^^115
 ;;^UTILITY(U,$J,1009.802,8,1,54,0)
 ;;=LOGAN^^075
 ;;^UTILITY(U,$J,1009.802,8,1,55,0)
 ;;=SUMMIT^^117
 ;;^UTILITY(U,$J,1009.802,8,1,56,0)
 ;;=MESA^^077
 ;;^UTILITY(U,$J,1009.802,8,1,57,0)
 ;;=TELLER^^119
 ;;^UTILITY(U,$J,1009.802,8,1,58,0)
 ;;=MINERAL^^079
 ;;^UTILITY(U,$J,1009.802,8,1,59,0)
 ;;=WASHINGTON^^121
 ;;^UTILITY(U,$J,1009.802,8,1,60,0)
 ;;=MOFFAT^^081
 ;;^UTILITY(U,$J,1009.802,8,1,61,0)
 ;;=WELD^^123
 ;;^UTILITY(U,$J,1009.802,8,1,62,0)
 ;;=MONTEZUMA^^083
 ;;^UTILITY(U,$J,1009.802,8,1,63,0)
 ;;=YUMA^^125
 ;;^UTILITY(U,$J,1009.802,8,1,64,0)
 ;;=BROOMFIELD^^014
 ;;^UTILITY(U,$J,1009.802,9,0)
 ;;=CONNECTICUT^CT^09^HARTFORD^1^1
 ;;^UTILITY(U,$J,1009.802,9,1,0)
 ;;=^1009.812I^8^8
 ;;^UTILITY(U,$J,1009.802,9,1,1,0)
 ;;=NEW LONDON^^011^011
 ;;^UTILITY(U,$J,1009.802,9,1,2,0)
 ;;=LITCHFIELD^^005^005
 ;;^UTILITY(U,$J,1009.802,9,1,3,0)
 ;;=FAIRFIELD^^001
 ;;^UTILITY(U,$J,1009.802,9,1,4,0)
 ;;=MIDDLESEX^^007
 ;;^UTILITY(U,$J,1009.802,9,1,5,0)
 ;;=TOLLAND^^013
 ;;^UTILITY(U,$J,1009.802,9,1,6,0)
 ;;=HARTFORD^^003
 ;;^UTILITY(U,$J,1009.802,9,1,7,0)
 ;;=NEW HAVEN^^009
 ;;^UTILITY(U,$J,1009.802,9,1,8,0)
 ;;=WINDHAM^^015
 ;;^UTILITY(U,$J,1009.802,10,0)
 ;;=DELAWARE^DE^10^^1^1
 ;;^UTILITY(U,$J,1009.802,10,1,0)
 ;;=^1009.812I^3^3
 ;;^UTILITY(U,$J,1009.802,10,1,1,0)
 ;;=KENT^^001
 ;;^UTILITY(U,$J,1009.802,10,1,2,0)
 ;;=NEW CASTLE^^003
 ;;^UTILITY(U,$J,1009.802,10,1,3,0)
 ;;=SUSSEX^^005
 ;;^UTILITY(U,$J,1009.802,11,0)
 ;;=DISTRICT OF COLUMBIA^DC^11^^1^1
 ;;^UTILITY(U,$J,1009.802,11,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,11,1,1,0)
 ;;=DISTRICT OF COLUMBIA^^001
 ;;^UTILITY(U,$J,1009.802,12,0)
 ;;=FLORIDA^FL^12^^1^1
 ;;^UTILITY(U,$J,1009.802,12,1,0)
 ;;=^1009.812I^69^68
 ;;^UTILITY(U,$J,1009.802,12,1,2,0)
 ;;=ALACHUA^^001
 ;;^UTILITY(U,$J,1009.802,12,1,3,0)
 ;;=HAMILTON^^047
 ;;^UTILITY(U,$J,1009.802,12,1,4,0)
 ;;=OKALOOSA^^091
 ;;^UTILITY(U,$J,1009.802,12,1,5,0)
 ;;=BAKER^^003
 ;;^UTILITY(U,$J,1009.802,12,1,6,0)
 ;;=HARDEE^^049
 ;;^UTILITY(U,$J,1009.802,12,1,7,0)
 ;;=OKEECHOBEE^^093
 ;;^UTILITY(U,$J,1009.802,12,1,8,0)
 ;;=BAY^^005
 ;;^UTILITY(U,$J,1009.802,12,1,9,0)
 ;;=HENDRY^^051
 ;;^UTILITY(U,$J,1009.802,12,1,10,0)
 ;;=ORANGE^^095
 ;;^UTILITY(U,$J,1009.802,12,1,11,0)
 ;;=BRADFORD^^007
 ;;^UTILITY(U,$J,1009.802,12,1,12,0)
 ;;=HERNANDO^^053
 ;;^UTILITY(U,$J,1009.802,12,1,13,0)
 ;;=OSCEOLA^^097
 ;;^UTILITY(U,$J,1009.802,12,1,14,0)
 ;;=BREVARD^^009
 ;;^UTILITY(U,$J,1009.802,12,1,15,0)
 ;;=HIGHLANDS^^055
 ;;^UTILITY(U,$J,1009.802,12,1,16,0)
 ;;=PALM BEACH^^099
 ;;^UTILITY(U,$J,1009.802,12,1,17,0)
 ;;=BROWARD^^011
 ;;^UTILITY(U,$J,1009.802,12,1,18,0)
 ;;=HILLSBOROUGH^^057
 ;;^UTILITY(U,$J,1009.802,12,1,19,0)
 ;;=PASCO^^101
 ;;^UTILITY(U,$J,1009.802,12,1,20,0)
 ;;=CALHOUN^^013
 ;;^UTILITY(U,$J,1009.802,12,1,21,0)
 ;;=HOLMES^^059
 ;;^UTILITY(U,$J,1009.802,12,1,22,0)
 ;;=PINELLAS^^103
 ;;^UTILITY(U,$J,1009.802,12,1,23,0)
 ;;=CHARLOTTE^^015
 ;;^UTILITY(U,$J,1009.802,12,1,24,0)
 ;;=INDIAN RIVER^^061
 ;;^UTILITY(U,$J,1009.802,12,1,25,0)
 ;;=POLK^^105
 ;;^UTILITY(U,$J,1009.802,12,1,26,0)
 ;;=CITRUS^^017
 ;;^UTILITY(U,$J,1009.802,12,1,27,0)
 ;;=JACKSON^^063
 ;;^UTILITY(U,$J,1009.802,12,1,28,0)
 ;;=PUTNAM^^107
 ;;^UTILITY(U,$J,1009.802,12,1,29,0)
 ;;=CLAY^^019
 ;;^UTILITY(U,$J,1009.802,12,1,30,0)
 ;;=JEFFERSON^^065
 ;;^UTILITY(U,$J,1009.802,12,1,31,0)
 ;;=ST. JOHNS^^109
 ;;^UTILITY(U,$J,1009.802,12,1,32,0)
 ;;=COLLIER^^021
 ;;^UTILITY(U,$J,1009.802,12,1,33,0)
 ;;=LAFAYETTE^^067
 ;;^UTILITY(U,$J,1009.802,12,1,34,0)
 ;;=ST. LUCIE^^111
 ;;^UTILITY(U,$J,1009.802,12,1,35,0)
 ;;=COLUMBIA^^023
 ;;^UTILITY(U,$J,1009.802,12,1,36,0)
 ;;=LAKE^^069
 ;;^UTILITY(U,$J,1009.802,12,1,37,0)
 ;;=SANTA ROSA^^113
 ;;^UTILITY(U,$J,1009.802,12,1,38,0)
 ;;=MIAMI-DADE^^086
 ;;^UTILITY(U,$J,1009.802,12,1,39,0)
 ;;=LEE^^071
 ;;^UTILITY(U,$J,1009.802,12,1,40,0)
 ;;=SARASOTA^^115
 ;;^UTILITY(U,$J,1009.802,12,1,41,0)
 ;;=DESOTO^^027
 ;;^UTILITY(U,$J,1009.802,12,1,42,0)
 ;;=LEON^^073
 ;;^UTILITY(U,$J,1009.802,12,1,43,0)
 ;;=SEMINOLE^^117
 ;;^UTILITY(U,$J,1009.802,12,1,44,0)
 ;;=DIXIE^^029
 ;;^UTILITY(U,$J,1009.802,12,1,45,0)
 ;;=LEVY^^075
 ;;^UTILITY(U,$J,1009.802,12,1,46,0)
 ;;=SUMTER^^119
 ;;^UTILITY(U,$J,1009.802,12,1,47,0)
 ;;=DUVAL^^031
 ;;^UTILITY(U,$J,1009.802,12,1,48,0)
 ;;=LIBERTY^^077
 ;;^UTILITY(U,$J,1009.802,12,1,49,0)
 ;;=SUWANNEE^^121
 ;;^UTILITY(U,$J,1009.802,12,1,50,0)
 ;;=ESCAMBIA^^033
 ;;^UTILITY(U,$J,1009.802,12,1,51,0)
 ;;=MADISON^^079
 ;;^UTILITY(U,$J,1009.802,12,1,52,0)
 ;;=TAYLOR^^123
 ;;^UTILITY(U,$J,1009.802,12,1,53,0)
 ;;=FLAGLER^^035
 ;;^UTILITY(U,$J,1009.802,12,1,54,0)
 ;;=MANATEE^^081
 ;;^UTILITY(U,$J,1009.802,12,1,55,0)
 ;;=UNION^^125
 ;;^UTILITY(U,$J,1009.802,12,1,56,0)
 ;;=FRANKLIN^^037
 ;;^UTILITY(U,$J,1009.802,12,1,57,0)
 ;;=MARION^^083
 ;;^UTILITY(U,$J,1009.802,12,1,58,0)
 ;;=VOLUSIA^^127
 ;;^UTILITY(U,$J,1009.802,12,1,59,0)
 ;;=GADSDEN^^039
 ;;^UTILITY(U,$J,1009.802,12,1,60,0)
 ;;=MARTIN^^085
 ;;^UTILITY(U,$J,1009.802,12,1,61,0)
 ;;=WAKULLA^^129
 ;;^UTILITY(U,$J,1009.802,12,1,62,0)
 ;;=GILCHRIST^^041
 ;;^UTILITY(U,$J,1009.802,12,1,63,0)
 ;;=MONROE^^087
 ;;^UTILITY(U,$J,1009.802,12,1,64,0)
 ;;=WALTON^^131
 ;;^UTILITY(U,$J,1009.802,12,1,65,0)
 ;;=GLADES^^043
 ;;^UTILITY(U,$J,1009.802,12,1,66,0)
 ;;=NASSAU^^089
 ;;^UTILITY(U,$J,1009.802,12,1,67,0)
 ;;=WASHINGTON^^133
 ;;^UTILITY(U,$J,1009.802,12,1,68,0)
 ;;=GULF^^045
 ;;^UTILITY(U,$J,1009.802,12,1,69,0)
 ;;=DADE^^025
 ;;^UTILITY(U,$J,1009.802,13,0)
 ;;=GEORGIA^GA^13^^1^1
 ;;^UTILITY(U,$J,1009.802,13,1,0)
 ;;=^1009.812I^159^159
 ;;^UTILITY(U,$J,1009.802,13,1,1,0)
 ;;=APPLING^^001
 ;;^UTILITY(U,$J,1009.802,13,1,2,0)
 ;;=CAMDEN^^039
 ;;^UTILITY(U,$J,1009.802,13,1,3,0)
 ;;=CRAWFORD^^079
 ;;^UTILITY(U,$J,1009.802,13,1,4,0)
 ;;=ATKINSON^^003
 ;;^UTILITY(U,$J,1009.802,13,1,5,0)
 ;;=CANDLER^^043
 ;;^UTILITY(U,$J,1009.802,13,1,6,0)
 ;;=CRISP^^081
 ;;^UTILITY(U,$J,1009.802,13,1,7,0)
 ;;=BACON^^005
 ;;^UTILITY(U,$J,1009.802,13,1,8,0)
 ;;=CARROLL^^045
 ;;^UTILITY(U,$J,1009.802,13,1,9,0)
 ;;=DADE^^083
 ;;^UTILITY(U,$J,1009.802,13,1,10,0)
 ;;=BAKER^^007
 ;;^UTILITY(U,$J,1009.802,13,1,11,0)
 ;;=CATOOSA^^047
 ;;^UTILITY(U,$J,1009.802,13,1,12,0)
 ;;=DAWSON^^085
 ;;^UTILITY(U,$J,1009.802,13,1,13,0)
 ;;=BALDWIN^^009
 ;;^UTILITY(U,$J,1009.802,13,1,14,0)
 ;;=CHARLTON^^049
 ;;^UTILITY(U,$J,1009.802,13,1,15,0)
 ;;=DECATUR^^087
 ;;^UTILITY(U,$J,1009.802,13,1,16,0)
 ;;=BANKS^^011
 ;;^UTILITY(U,$J,1009.802,13,1,17,0)
 ;;=CHATHAM^^051
 ;;^UTILITY(U,$J,1009.802,13,1,18,0)
 ;;=DEKALB^^089
 ;;^UTILITY(U,$J,1009.802,13,1,19,0)
 ;;=BARROW^^013
 ;;^UTILITY(U,$J,1009.802,13,1,20,0)
 ;;=CHATTAHOOCHEE^^053
 ;;^UTILITY(U,$J,1009.802,13,1,21,0)
 ;;=DODGE^^091
 ;;^UTILITY(U,$J,1009.802,13,1,22,0)
 ;;=BARTOW^^015
 ;;^UTILITY(U,$J,1009.802,13,1,23,0)
 ;;=CHATTOOGA^^055
 ;;^UTILITY(U,$J,1009.802,13,1,24,0)
 ;;=DOOLY^^093
 ;;^UTILITY(U,$J,1009.802,13,1,25,0)
 ;;=BEN HILL^^017
 ;;^UTILITY(U,$J,1009.802,13,1,26,0)
 ;;=CHEROKEE^^057
 ;;^UTILITY(U,$J,1009.802,13,1,27,0)
 ;;=DOUGHERTY^^095
 ;;^UTILITY(U,$J,1009.802,13,1,28,0)
 ;;=BERRIEN^^019
 ;;^UTILITY(U,$J,1009.802,13,1,29,0)
 ;;=CLARKE^^059
 ;;^UTILITY(U,$J,1009.802,13,1,30,0)
 ;;=DOUGLAS^^097
 ;;^UTILITY(U,$J,1009.802,13,1,31,0)
 ;;=BIBB^^021
 ;;^UTILITY(U,$J,1009.802,13,1,32,0)
 ;;=CLAY^^061
 ;;^UTILITY(U,$J,1009.802,13,1,33,0)
 ;;=EARLY^^099
 ;;^UTILITY(U,$J,1009.802,13,1,34,0)
 ;;=BLECKLEY^^023
 ;;^UTILITY(U,$J,1009.802,13,1,35,0)
 ;;=CLAYTON^^063
 ;;^UTILITY(U,$J,1009.802,13,1,36,0)
 ;;=ECHOLS^^101
 ;;^UTILITY(U,$J,1009.802,13,1,37,0)
 ;;=BRANTLEY^^025
 ;;^UTILITY(U,$J,1009.802,13,1,38,0)
 ;;=CLINCH^^065
 ;;^UTILITY(U,$J,1009.802,13,1,39,0)
 ;;=EFFINGHAM^^103
 ;;^UTILITY(U,$J,1009.802,13,1,40,0)
 ;;=BROOKS^^027
 ;;^UTILITY(U,$J,1009.802,13,1,41,0)
 ;;=COBB^^067
 ;;^UTILITY(U,$J,1009.802,13,1,42,0)
 ;;=ELBERT^^105
 ;;^UTILITY(U,$J,1009.802,13,1,43,0)
 ;;=BRYAN^^029
 ;;^UTILITY(U,$J,1009.802,13,1,44,0)
 ;;=COFFEE^^069
 ;;^UTILITY(U,$J,1009.802,13,1,45,0)
 ;;=EMANUEL^^107
 ;;^UTILITY(U,$J,1009.802,13,1,46,0)
 ;;=BULLOCH^^031
 ;;^UTILITY(U,$J,1009.802,13,1,47,0)
 ;;=COLQUITT^^071
 ;;^UTILITY(U,$J,1009.802,13,1,48,0)
 ;;=EVANS^^109
 ;;^UTILITY(U,$J,1009.802,13,1,49,0)
 ;;=BURKE^^033
 ;;^UTILITY(U,$J,1009.802,13,1,50,0)
 ;;=COLUMBIA^^073
 ;;^UTILITY(U,$J,1009.802,13,1,51,0)
 ;;=FANNIN^^111
 ;;^UTILITY(U,$J,1009.802,13,1,52,0)
 ;;=BUTTS^^035
 ;;^UTILITY(U,$J,1009.802,13,1,53,0)
 ;;=COOK^^075
 ;;^UTILITY(U,$J,1009.802,13,1,54,0)
 ;;=FAYETTE^^113
 ;;^UTILITY(U,$J,1009.802,13,1,55,0)
 ;;=CALHOUN^^037
 ;;^UTILITY(U,$J,1009.802,13,1,56,0)
 ;;=COWETA^^077
 ;;^UTILITY(U,$J,1009.802,13,1,57,0)
 ;;=FLOYD^^115
 ;;^UTILITY(U,$J,1009.802,13,1,58,0)
 ;;=FORSYTH^^117
 ;;^UTILITY(U,$J,1009.802,13,1,59,0)
 ;;=LOWNDES^^185
 ;;^UTILITY(U,$J,1009.802,13,1,60,0)
 ;;=SPALDING^^255
 ;;^UTILITY(U,$J,1009.802,13,1,61,0)
 ;;=FRANKLIN^^119
 ;;^UTILITY(U,$J,1009.802,13,1,62,0)
 ;;=LUMPKIN^^187
 ;;^UTILITY(U,$J,1009.802,13,1,63,0)
 ;;=STEPHENS^^257
 ;;^UTILITY(U,$J,1009.802,13,1,64,0)
 ;;=FULTON^^121
 ;;^UTILITY(U,$J,1009.802,13,1,65,0)
 ;;=MCDUFFIE^^189
 ;;^UTILITY(U,$J,1009.802,13,1,66,0)
 ;;=STEWART^^259
 ;;^UTILITY(U,$J,1009.802,13,1,67,0)
 ;;=GILMER^^123
 ;;^UTILITY(U,$J,1009.802,13,1,68,0)
 ;;=MCINTOSH^^191
 ;;^UTILITY(U,$J,1009.802,13,1,69,0)
 ;;=SUMTER^^261
 ;;^UTILITY(U,$J,1009.802,13,1,70,0)
 ;;=GLASCOCK^^125
 ;;^UTILITY(U,$J,1009.802,13,1,71,0)
 ;;=MACON^^193
 ;;^UTILITY(U,$J,1009.802,13,1,72,0)
 ;;=TALBOT^^263
 ;;^UTILITY(U,$J,1009.802,13,1,73,0)
 ;;=GLYNN^^127
 ;;^UTILITY(U,$J,1009.802,13,1,74,0)
 ;;=MADISON^^195
 ;;^UTILITY(U,$J,1009.802,13,1,75,0)
 ;;=TALIAFERRO^^265
 ;;^UTILITY(U,$J,1009.802,13,1,76,0)
 ;;=GORDON^^129
 ;;^UTILITY(U,$J,1009.802,13,1,77,0)
 ;;=MARION^^197
 ;;^UTILITY(U,$J,1009.802,13,1,78,0)
 ;;=TATTNALL^^267
 ;;^UTILITY(U,$J,1009.802,13,1,79,0)
 ;;=GRADY^^131
 ;;^UTILITY(U,$J,1009.802,13,1,80,0)
 ;;=MERIWETHER^^199
 ;;^UTILITY(U,$J,1009.802,13,1,81,0)
 ;;=TAYLOR^^269
 ;;^UTILITY(U,$J,1009.802,13,1,82,0)
 ;;=GREENE^^133
 ;;^UTILITY(U,$J,1009.802,13,1,83,0)
 ;;=MILLER^^201
 ;;^UTILITY(U,$J,1009.802,13,1,84,0)
 ;;=TELFAIR^^271
 ;;^UTILITY(U,$J,1009.802,13,1,85,0)
 ;;=GWINNETT^^135
 ;;^UTILITY(U,$J,1009.802,13,1,86,0)
 ;;=MITCHELL^^205
 ;;^UTILITY(U,$J,1009.802,13,1,87,0)
 ;;=TERRELL^^273
 ;;^UTILITY(U,$J,1009.802,13,1,88,0)
 ;;=HABERSHAM^^137
 ;;^UTILITY(U,$J,1009.802,13,1,89,0)
 ;;=MONROE^^207
 ;;^UTILITY(U,$J,1009.802,13,1,90,0)
 ;;=THOMAS^^275
 ;;^UTILITY(U,$J,1009.802,13,1,91,0)
 ;;=HALL^^139
 ;;^UTILITY(U,$J,1009.802,13,1,92,0)
 ;;=MONTGOMERY^^209
 ;;^UTILITY(U,$J,1009.802,13,1,93,0)
 ;;=TIFT^^277
 ;;^UTILITY(U,$J,1009.802,13,1,94,0)
 ;;=HANCOCK^^141
 ;;^UTILITY(U,$J,1009.802,13,1,95,0)
 ;;=MORGAN^^211
 ;;^UTILITY(U,$J,1009.802,13,1,96,0)
 ;;=TOOMBS^^279
 ;;^UTILITY(U,$J,1009.802,13,1,97,0)
 ;;=HARALSON^^143
 ;;^UTILITY(U,$J,1009.802,13,1,98,0)
 ;;=MURRAY^^213
 ;;^UTILITY(U,$J,1009.802,13,1,99,0)
 ;;=TOWNS^^281
 ;;^UTILITY(U,$J,1009.802,13,1,100,0)
 ;;=HARRIS^^145
 ;;^UTILITY(U,$J,1009.802,13,1,101,0)
 ;;=MUSCOGEE^^215
 ;;^UTILITY(U,$J,1009.802,13,1,102,0)
 ;;=TREUTLEN^^283
 ;;^UTILITY(U,$J,1009.802,13,1,103,0)
 ;;=HART^^147

DMUFI006
DMUFI006 ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,13,1,104,0)
 ;;=NEWTON^^217
 ;;^UTILITY(U,$J,1009.802,13,1,105,0)
 ;;=TROUP^^285
 ;;^UTILITY(U,$J,1009.802,13,1,106,0)
 ;;=HEARD^^149
 ;;^UTILITY(U,$J,1009.802,13,1,107,0)
 ;;=OCONEE^^219
 ;;^UTILITY(U,$J,1009.802,13,1,108,0)
 ;;=TURNER^^287
 ;;^UTILITY(U,$J,1009.802,13,1,109,0)
 ;;=HENRY^^151
 ;;^UTILITY(U,$J,1009.802,13,1,110,0)
 ;;=OGLETHORPE^^221
 ;;^UTILITY(U,$J,1009.802,13,1,111,0)
 ;;=TWIGGS^^289
 ;;^UTILITY(U,$J,1009.802,13,1,112,0)
 ;;=HOUSTON^^153
 ;;^UTILITY(U,$J,1009.802,13,1,113,0)
 ;;=PAULDING^^223
 ;;^UTILITY(U,$J,1009.802,13,1,114,0)
 ;;=UNION^^291
 ;;^UTILITY(U,$J,1009.802,13,1,115,0)
 ;;=IRWIN^^155
 ;;^UTILITY(U,$J,1009.802,13,1,116,0)
 ;;=PEACH^^225
 ;;^UTILITY(U,$J,1009.802,13,1,117,0)
 ;;=UPSON^^293
 ;;^UTILITY(U,$J,1009.802,13,1,118,0)
 ;;=JACKSON^^157
 ;;^UTILITY(U,$J,1009.802,13,1,119,0)
 ;;=PICKENS^^227
 ;;^UTILITY(U,$J,1009.802,13,1,120,0)
 ;;=WALKER^^295
 ;;^UTILITY(U,$J,1009.802,13,1,121,0)
 ;;=JASPER^^159
 ;;^UTILITY(U,$J,1009.802,13,1,122,0)
 ;;=PIERCE^^229
 ;;^UTILITY(U,$J,1009.802,13,1,123,0)
 ;;=WALTON^^297
 ;;^UTILITY(U,$J,1009.802,13,1,124,0)
 ;;=JEFF DAVIS^^161
 ;;^UTILITY(U,$J,1009.802,13,1,125,0)
 ;;=PIKE^^231
 ;;^UTILITY(U,$J,1009.802,13,1,126,0)
 ;;=WARE^^299
 ;;^UTILITY(U,$J,1009.802,13,1,127,0)
 ;;=JEFFERSON^^163
 ;;^UTILITY(U,$J,1009.802,13,1,128,0)
 ;;=POLK^^233
 ;;^UTILITY(U,$J,1009.802,13,1,129,0)
 ;;=WARREN^^301
 ;;^UTILITY(U,$J,1009.802,13,1,130,0)
 ;;=JENKINS^^165
 ;;^UTILITY(U,$J,1009.802,13,1,131,0)
 ;;=PULASKI^^235
 ;;^UTILITY(U,$J,1009.802,13,1,132,0)
 ;;=WASHINGTON^^303
 ;;^UTILITY(U,$J,1009.802,13,1,133,0)
 ;;=JOHNSON^^167
 ;;^UTILITY(U,$J,1009.802,13,1,134,0)
 ;;=PUTNAM^^237
 ;;^UTILITY(U,$J,1009.802,13,1,135,0)
 ;;=WAYNE^^305
 ;;^UTILITY(U,$J,1009.802,13,1,136,0)
 ;;=JONES^^169
 ;;^UTILITY(U,$J,1009.802,13,1,137,0)
 ;;=QUITMAN^^239
 ;;^UTILITY(U,$J,1009.802,13,1,138,0)
 ;;=WEBSTER^^307
 ;;^UTILITY(U,$J,1009.802,13,1,139,0)
 ;;=LAMAR^^171
 ;;^UTILITY(U,$J,1009.802,13,1,140,0)
 ;;=RABUN^^241
 ;;^UTILITY(U,$J,1009.802,13,1,141,0)
 ;;=WHEELER^^309
 ;;^UTILITY(U,$J,1009.802,13,1,142,0)
 ;;=LANIER^^173
 ;;^UTILITY(U,$J,1009.802,13,1,143,0)
 ;;=RANDOLPH^^243
 ;;^UTILITY(U,$J,1009.802,13,1,144,0)
 ;;=WHITE^^311
 ;;^UTILITY(U,$J,1009.802,13,1,145,0)
 ;;=LAURENS^^175
 ;;^UTILITY(U,$J,1009.802,13,1,146,0)
 ;;=RICHMOND^^245
 ;;^UTILITY(U,$J,1009.802,13,1,147,0)
 ;;=WHITFIELD^^313
 ;;^UTILITY(U,$J,1009.802,13,1,148,0)
 ;;=LEE^^177
 ;;^UTILITY(U,$J,1009.802,13,1,149,0)
 ;;=ROCKDALE^^247
 ;;^UTILITY(U,$J,1009.802,13,1,150,0)
 ;;=WILCOX^^315
 ;;^UTILITY(U,$J,1009.802,13,1,151,0)
 ;;=LIBERTY^^179
 ;;^UTILITY(U,$J,1009.802,13,1,152,0)
 ;;=SCHLEY^^249
 ;;^UTILITY(U,$J,1009.802,13,1,153,0)
 ;;=WILKES^^317
 ;;^UTILITY(U,$J,1009.802,13,1,154,0)
 ;;=LINCOLN^^181
 ;;^UTILITY(U,$J,1009.802,13,1,155,0)
 ;;=SCREVEN^^251
 ;;^UTILITY(U,$J,1009.802,13,1,156,0)
 ;;=WILKINSON^^319
 ;;^UTILITY(U,$J,1009.802,13,1,157,0)
 ;;=LONG^^183
 ;;^UTILITY(U,$J,1009.802,13,1,158,0)
 ;;=SEMINOLE^^253
 ;;^UTILITY(U,$J,1009.802,13,1,159,0)
 ;;=WORTH^^321
 ;;^UTILITY(U,$J,1009.802,15,0)
 ;;=HAWAII^HI^15^^1^1
 ;;^UTILITY(U,$J,1009.802,15,1,0)
 ;;=^1009.812I^5^5
 ;;^UTILITY(U,$J,1009.802,15,1,1,0)
 ;;=HAWAII^^001
 ;;^UTILITY(U,$J,1009.802,15,1,2,0)
 ;;=KALAWAO^^005
 ;;^UTILITY(U,$J,1009.802,15,1,3,0)
 ;;=MAUI^^009
 ;;^UTILITY(U,$J,1009.802,15,1,4,0)
 ;;=HONOLULU^^003
 ;;^UTILITY(U,$J,1009.802,15,1,5,0)
 ;;=KAUAI^^007
 ;;^UTILITY(U,$J,1009.802,16,0)
 ;;=IDAHO^ID^16^^1^1
 ;;^UTILITY(U,$J,1009.802,16,1,0)
 ;;=^1009.812I^44^44
 ;;^UTILITY(U,$J,1009.802,16,1,1,0)
 ;;=ADA^^001
 ;;^UTILITY(U,$J,1009.802,16,1,2,0)
 ;;=BENEWAH^^009
 ;;^UTILITY(U,$J,1009.802,16,1,3,0)
 ;;=BONNER^^017
 ;;^UTILITY(U,$J,1009.802,16,1,4,0)
 ;;=ADAMS^^003
 ;;^UTILITY(U,$J,1009.802,16,1,5,0)
 ;;=BINGHAM^^011
 ;;^UTILITY(U,$J,1009.802,16,1,6,0)
 ;;=BONNEVILLE^^019
 ;;^UTILITY(U,$J,1009.802,16,1,7,0)
 ;;=BANNOCK^^005
 ;;^UTILITY(U,$J,1009.802,16,1,8,0)
 ;;=BLAINE^^013
 ;;^UTILITY(U,$J,1009.802,16,1,9,0)
 ;;=BOUNDARY^^021
 ;;^UTILITY(U,$J,1009.802,16,1,10,0)
 ;;=BEAR LAKE^^007
 ;;^UTILITY(U,$J,1009.802,16,1,11,0)
 ;;=BOISE^^015
 ;;^UTILITY(U,$J,1009.802,16,1,12,0)
 ;;=BUTTE^^023
 ;;^UTILITY(U,$J,1009.802,16,1,13,0)
 ;;=CAMAS^^025
 ;;^UTILITY(U,$J,1009.802,16,1,14,0)
 ;;=GOODING^^047
 ;;^UTILITY(U,$J,1009.802,16,1,15,0)
 ;;=NEZ PERCE^^069
 ;;^UTILITY(U,$J,1009.802,16,1,16,0)
 ;;=CANYON^^027
 ;;^UTILITY(U,$J,1009.802,16,1,17,0)
 ;;=IDAHO^^049
 ;;^UTILITY(U,$J,1009.802,16,1,18,0)
 ;;=ONEIDA^^071
 ;;^UTILITY(U,$J,1009.802,16,1,19,0)
 ;;=CARIBOU^^029
 ;;^UTILITY(U,$J,1009.802,16,1,20,0)
 ;;=JEFFERSON^^051
 ;;^UTILITY(U,$J,1009.802,16,1,21,0)
 ;;=OWYHEE^^073
 ;;^UTILITY(U,$J,1009.802,16,1,22,0)
 ;;=CASSIA^^031
 ;;^UTILITY(U,$J,1009.802,16,1,23,0)
 ;;=JEROME^^053
 ;;^UTILITY(U,$J,1009.802,16,1,24,0)
 ;;=PAYETTE^^075
 ;;^UTILITY(U,$J,1009.802,16,1,25,0)
 ;;=CLARK^^033
 ;;^UTILITY(U,$J,1009.802,16,1,26,0)
 ;;=KOOTENAI^^055
 ;;^UTILITY(U,$J,1009.802,16,1,27,0)
 ;;=POWER^^077
 ;;^UTILITY(U,$J,1009.802,16,1,28,0)
 ;;=CLEARWATER^^035
 ;;^UTILITY(U,$J,1009.802,16,1,29,0)
 ;;=LATAH^^057
 ;;^UTILITY(U,$J,1009.802,16,1,30,0)
 ;;=SHOSHONE^^079
 ;;^UTILITY(U,$J,1009.802,16,1,31,0)
 ;;=CUSTER^^037
 ;;^UTILITY(U,$J,1009.802,16,1,32,0)
 ;;=LEMHI^^059
 ;;^UTILITY(U,$J,1009.802,16,1,33,0)
 ;;=TETON^^081
 ;;^UTILITY(U,$J,1009.802,16,1,34,0)
 ;;=ELMORE^^039
 ;;^UTILITY(U,$J,1009.802,16,1,35,0)
 ;;=LEWIS^^061
 ;;^UTILITY(U,$J,1009.802,16,1,36,0)
 ;;=TWIN FALLS^^083
 ;;^UTILITY(U,$J,1009.802,16,1,37,0)
 ;;=FRANKLIN^^041
 ;;^UTILITY(U,$J,1009.802,16,1,38,0)
 ;;=LINCOLN^^063
 ;;^UTILITY(U,$J,1009.802,16,1,39,0)
 ;;=VALLEY^^085
 ;;^UTILITY(U,$J,1009.802,16,1,40,0)
 ;;=FREMONT^^043
 ;;^UTILITY(U,$J,1009.802,16,1,41,0)
 ;;=MADISON^^065
 ;;^UTILITY(U,$J,1009.802,16,1,42,0)
 ;;=WASHINGTON^^087
 ;;^UTILITY(U,$J,1009.802,16,1,43,0)
 ;;=GEM^^045
 ;;^UTILITY(U,$J,1009.802,16,1,44,0)
 ;;=MINIDOKA^^067
 ;;^UTILITY(U,$J,1009.802,17,0)
 ;;=ILLINOIS^IL^17^^1^1
 ;;^UTILITY(U,$J,1009.802,17,1,0)
 ;;=^1009.812I^102^102
 ;;^UTILITY(U,$J,1009.802,17,1,1,0)
 ;;=COOK^^031^031
 ;;^UTILITY(U,$J,1009.802,17,1,2,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,17,1,3,0)
 ;;=HARDIN^^069
 ;;^UTILITY(U,$J,1009.802,17,1,4,0)
 ;;=MORGAN^^137
 ;;^UTILITY(U,$J,1009.802,17,1,5,0)
 ;;=ALEXANDER^^003
 ;;^UTILITY(U,$J,1009.802,17,1,6,0)
 ;;=HENDERSON^^071
 ;;^UTILITY(U,$J,1009.802,17,1,7,0)
 ;;=MOULTRIE^^139
 ;;^UTILITY(U,$J,1009.802,17,1,8,0)
 ;;=BOND^^005
 ;;^UTILITY(U,$J,1009.802,17,1,9,0)
 ;;=HENRY^^073
 ;;^UTILITY(U,$J,1009.802,17,1,10,0)
 ;;=OGLE^^141
 ;;^UTILITY(U,$J,1009.802,17,1,11,0)
 ;;=BOONE^^007
 ;;^UTILITY(U,$J,1009.802,17,1,12,0)
 ;;=IROQUOIS^^075
 ;;^UTILITY(U,$J,1009.802,17,1,13,0)
 ;;=PEORIA^^143
 ;;^UTILITY(U,$J,1009.802,17,1,14,0)
 ;;=BROWN^^009
 ;;^UTILITY(U,$J,1009.802,17,1,15,0)
 ;;=JACKSON^^077
 ;;^UTILITY(U,$J,1009.802,17,1,16,0)
 ;;=PERRY^^145
 ;;^UTILITY(U,$J,1009.802,17,1,17,0)
 ;;=BUREAU^^011
 ;;^UTILITY(U,$J,1009.802,17,1,18,0)
 ;;=JASPER^^079
 ;;^UTILITY(U,$J,1009.802,17,1,19,0)
 ;;=PIATT^^147
 ;;^UTILITY(U,$J,1009.802,17,1,20,0)
 ;;=CALHOUN^^013
 ;;^UTILITY(U,$J,1009.802,17,1,21,0)
 ;;=JEFFERSON^^081
 ;;^UTILITY(U,$J,1009.802,17,1,22,0)
 ;;=PIKE^^149
 ;;^UTILITY(U,$J,1009.802,17,1,23,0)
 ;;=CARROLL^^015
 ;;^UTILITY(U,$J,1009.802,17,1,24,0)
 ;;=JERSEY^^083
 ;;^UTILITY(U,$J,1009.802,17,1,25,0)
 ;;=POPE^^151
 ;;^UTILITY(U,$J,1009.802,17,1,26,0)
 ;;=CASS^^017
 ;;^UTILITY(U,$J,1009.802,17,1,27,0)
 ;;=JO DAVIESS^^085
 ;;^UTILITY(U,$J,1009.802,17,1,28,0)
 ;;=PULASKI^^153
 ;;^UTILITY(U,$J,1009.802,17,1,29,0)
 ;;=CHAMPAIGN^^019
 ;;^UTILITY(U,$J,1009.802,17,1,30,0)
 ;;=JOHNSON^^087
 ;;^UTILITY(U,$J,1009.802,17,1,31,0)
 ;;=PUTNAM^^155
 ;;^UTILITY(U,$J,1009.802,17,1,32,0)
 ;;=CHRISTIAN^^021
 ;;^UTILITY(U,$J,1009.802,17,1,33,0)
 ;;=KANE^^089
 ;;^UTILITY(U,$J,1009.802,17,1,34,0)
 ;;=RANDOLPH^^157
 ;;^UTILITY(U,$J,1009.802,17,1,35,0)
 ;;=CLARK^^023
 ;;^UTILITY(U,$J,1009.802,17,1,36,0)
 ;;=KANKAKEE^^091
 ;;^UTILITY(U,$J,1009.802,17,1,37,0)
 ;;=RICHLAND^^159
 ;;^UTILITY(U,$J,1009.802,17,1,38,0)
 ;;=CLAY^^025
 ;;^UTILITY(U,$J,1009.802,17,1,39,0)
 ;;=KENDALL^^093
 ;;^UTILITY(U,$J,1009.802,17,1,40,0)
 ;;=ROCK ISLAND^^161
 ;;^UTILITY(U,$J,1009.802,17,1,41,0)
 ;;=CLINTON^^027
 ;;^UTILITY(U,$J,1009.802,17,1,42,0)
 ;;=KNOX^^095
 ;;^UTILITY(U,$J,1009.802,17,1,43,0)
 ;;=ST. CLAIR^^163
 ;;^UTILITY(U,$J,1009.802,17,1,44,0)
 ;;=COLES^^029
 ;;^UTILITY(U,$J,1009.802,17,1,45,0)
 ;;=LAKE^^097
 ;;^UTILITY(U,$J,1009.802,17,1,46,0)
 ;;=SALINE^^165
 ;;^UTILITY(U,$J,1009.802,17,1,47,0)
 ;;=LA SALLE^^099
 ;;^UTILITY(U,$J,1009.802,17,1,48,0)
 ;;=SANGAMON^^167
 ;;^UTILITY(U,$J,1009.802,17,1,49,0)
 ;;=CRAWFORD^^033
 ;;^UTILITY(U,$J,1009.802,17,1,50,0)
 ;;=LAWRENCE^^101
 ;;^UTILITY(U,$J,1009.802,17,1,51,0)
 ;;=SCHUYLER^^169
 ;;^UTILITY(U,$J,1009.802,17,1,52,0)
 ;;=CUMBERLAND^^035
 ;;^UTILITY(U,$J,1009.802,17,1,53,0)
 ;;=LEE^^103
 ;;^UTILITY(U,$J,1009.802,17,1,54,0)
 ;;=SCOTT^^171
 ;;^UTILITY(U,$J,1009.802,17,1,55,0)
 ;;=DEKALB^^037
 ;;^UTILITY(U,$J,1009.802,17,1,56,0)
 ;;=LIVINGSTON^^105
 ;;^UTILITY(U,$J,1009.802,17,1,57,0)
 ;;=SHELBY^^173
 ;;^UTILITY(U,$J,1009.802,17,1,58,0)
 ;;=DE WITT^^039
 ;;^UTILITY(U,$J,1009.802,17,1,59,0)
 ;;=LOGAN^^107
 ;;^UTILITY(U,$J,1009.802,17,1,60,0)
 ;;=STARK^^175
 ;;^UTILITY(U,$J,1009.802,17,1,61,0)
 ;;=DOUGLAS^^041
 ;;^UTILITY(U,$J,1009.802,17,1,62,0)
 ;;=MCDONOUGH^^109
 ;;^UTILITY(U,$J,1009.802,17,1,63,0)
 ;;=STEPHENSON^^177
 ;;^UTILITY(U,$J,1009.802,17,1,64,0)
 ;;=DUPAGE^^043
 ;;^UTILITY(U,$J,1009.802,17,1,65,0)
 ;;=MCHENRY^^111
 ;;^UTILITY(U,$J,1009.802,17,1,66,0)
 ;;=TAZEWELL^^179
 ;;^UTILITY(U,$J,1009.802,17,1,67,0)
 ;;=EDGAR^^045
 ;;^UTILITY(U,$J,1009.802,17,1,68,0)
 ;;=MCLEAN^^113
 ;;^UTILITY(U,$J,1009.802,17,1,69,0)
 ;;=UNION^^181
 ;;^UTILITY(U,$J,1009.802,17,1,70,0)
 ;;=EDWARDS^^047
 ;;^UTILITY(U,$J,1009.802,17,1,71,0)
 ;;=MACON^^115
 ;;^UTILITY(U,$J,1009.802,17,1,72,0)
 ;;=VERMILION^^183
 ;;^UTILITY(U,$J,1009.802,17,1,73,0)
 ;;=EFFINGHAM^^049
 ;;^UTILITY(U,$J,1009.802,17,1,74,0)
 ;;=MACOUPIN^^117
 ;;^UTILITY(U,$J,1009.802,17,1,75,0)
 ;;=WABASH^^185
 ;;^UTILITY(U,$J,1009.802,17,1,76,0)
 ;;=FAYETTE^^051
 ;;^UTILITY(U,$J,1009.802,17,1,77,0)
 ;;=MADISON^^119
 ;;^UTILITY(U,$J,1009.802,17,1,78,0)
 ;;=WARREN^^187
 ;;^UTILITY(U,$J,1009.802,17,1,79,0)
 ;;=FORD^^053
 ;;^UTILITY(U,$J,1009.802,17,1,80,0)
 ;;=MARION^^121
 ;;^UTILITY(U,$J,1009.802,17,1,81,0)
 ;;=WASHINGTON^^189
 ;;^UTILITY(U,$J,1009.802,17,1,82,0)
 ;;=FRANKLIN^^055
 ;;^UTILITY(U,$J,1009.802,17,1,83,0)
 ;;=MARSHALL^^123
 ;;^UTILITY(U,$J,1009.802,17,1,84,0)
 ;;=WAYNE^^191
 ;;^UTILITY(U,$J,1009.802,17,1,85,0)
 ;;=FULTON^^057
 ;;^UTILITY(U,$J,1009.802,17,1,86,0)
 ;;=MASON^^125
 ;;^UTILITY(U,$J,1009.802,17,1,87,0)
 ;;=WHITE^^193
 ;;^UTILITY(U,$J,1009.802,17,1,88,0)
 ;;=GALLATIN^^059
 ;;^UTILITY(U,$J,1009.802,17,1,89,0)
 ;;=MASSAC^^127
 ;;^UTILITY(U,$J,1009.802,17,1,90,0)
 ;;=WHITESIDE^^195
 ;;^UTILITY(U,$J,1009.802,17,1,91,0)
 ;;=GREENE^^061
 ;;^UTILITY(U,$J,1009.802,17,1,92,0)
 ;;=MENARD^^129
 ;;^UTILITY(U,$J,1009.802,17,1,93,0)
 ;;=WILL^^197
 ;;^UTILITY(U,$J,1009.802,17,1,94,0)
 ;;=GRUNDY^^063
 ;;^UTILITY(U,$J,1009.802,17,1,95,0)
 ;;=MERCER^^131
 ;;^UTILITY(U,$J,1009.802,17,1,96,0)
 ;;=WILLIAMSON^^199
 ;;^UTILITY(U,$J,1009.802,17,1,97,0)
 ;;=HAMILTON^^065
 ;;^UTILITY(U,$J,1009.802,17,1,98,0)
 ;;=MONROE^^133
 ;;^UTILITY(U,$J,1009.802,17,1,99,0)
 ;;=WINNEBAGO^^201
 ;;^UTILITY(U,$J,1009.802,17,1,100,0)
 ;;=HANCOCK^^067
 ;;^UTILITY(U,$J,1009.802,17,1,101,0)
 ;;=MONTGOMERY^^135
 ;;^UTILITY(U,$J,1009.802,17,1,102,0)
 ;;=WOODFORD^^203
 ;;^UTILITY(U,$J,1009.802,18,0)
 ;;=INDIANA^IN^18^^1^1
 ;;^UTILITY(U,$J,1009.802,18,1,0)
 ;;=^1009.812I^95^92
 ;;^UTILITY(U,$J,1009.802,18,1,2,0)
 ;;=JASPER^^073^073
 ;;^UTILITY(U,$J,1009.802,18,1,3,0)
 ;;=LA PORTE^^091^091
 ;;^UTILITY(U,$J,1009.802,18,1,4,0)
 ;;=MARION^^097^097
 ;;^UTILITY(U,$J,1009.802,18,1,5,0)
 ;;=ST. JOSEPH^^141^141
 ;;^UTILITY(U,$J,1009.802,18,1,6,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,18,1,7,0)
 ;;=HENDRICKS^^063
 ;;^UTILITY(U,$J,1009.802,18,1,8,0)
 ;;=PIKE^^125
 ;;^UTILITY(U,$J,1009.802,18,1,9,0)
 ;;=ALLEN^^003
 ;;^UTILITY(U,$J,1009.802,18,1,10,0)
 ;;=HENRY^^065
 ;;^UTILITY(U,$J,1009.802,18,1,11,0)
 ;;=PORTER^^127
 ;;^UTILITY(U,$J,1009.802,18,1,12,0)
 ;;=BARTHOLOMEW^^005
 ;;^UTILITY(U,$J,1009.802,18,1,13,0)
 ;;=HOWARD^^067
 ;;^UTILITY(U,$J,1009.802,18,1,14,0)
 ;;=POSEY^^129
 ;;^UTILITY(U,$J,1009.802,18,1,15,0)
 ;;=BENTON^^007
 ;;^UTILITY(U,$J,1009.802,18,1,16,0)
 ;;=HUNTINGTON^^069
 ;;^UTILITY(U,$J,1009.802,18,1,17,0)
 ;;=PULASKI^^131
 ;;^UTILITY(U,$J,1009.802,18,1,18,0)
 ;;=BLACKFORD^^009
 ;;^UTILITY(U,$J,1009.802,18,1,19,0)
 ;;=JACKSON^^071
 ;;^UTILITY(U,$J,1009.802,18,1,20,0)
 ;;=PUTNAM^^133
 ;;^UTILITY(U,$J,1009.802,18,1,21,0)
 ;;=BOONE^^011
 ;;^UTILITY(U,$J,1009.802,18,1,22,0)
 ;;=RANDOLPH^^135
 ;;^UTILITY(U,$J,1009.802,18,1,23,0)
 ;;=BROWN^^013
 ;;^UTILITY(U,$J,1009.802,18,1,24,0)
 ;;=JAY^^075
 ;;^UTILITY(U,$J,1009.802,18,1,25,0)
 ;;=RIPLEY^^137
 ;;^UTILITY(U,$J,1009.802,18,1,27,0)
 ;;=JEFFERSON^^077
 ;;^UTILITY(U,$J,1009.802,18,1,28,0)
 ;;=RUSH^^139
 ;;^UTILITY(U,$J,1009.802,18,1,29,0)
 ;;=CASS^^017
 ;;^UTILITY(U,$J,1009.802,18,1,30,0)
 ;;=JENNINGS^^079
 ;;^UTILITY(U,$J,1009.802,18,1,31,0)
 ;;=CLARK^^019
 ;;^UTILITY(U,$J,1009.802,18,1,32,0)
 ;;=JOHNSON^^081
 ;;^UTILITY(U,$J,1009.802,18,1,33,0)
 ;;=SCOTT^^143
 ;;^UTILITY(U,$J,1009.802,18,1,34,0)
 ;;=CLAY^^021
 ;;^UTILITY(U,$J,1009.802,18,1,35,0)
 ;;=KNOX^^083
 ;;^UTILITY(U,$J,1009.802,18,1,36,0)
 ;;=SHELBY^^145
 ;;^UTILITY(U,$J,1009.802,18,1,37,0)
 ;;=CLINTON^^023
 ;;^UTILITY(U,$J,1009.802,18,1,38,0)
 ;;=KOSCIUSKO^^085
 ;;^UTILITY(U,$J,1009.802,18,1,39,0)
 ;;=SPENCER^^147
 ;;^UTILITY(U,$J,1009.802,18,1,40,0)
 ;;=CRAWFORD^^025
 ;;^UTILITY(U,$J,1009.802,18,1,41,0)
 ;;=LAGRANGE^^087
 ;;^UTILITY(U,$J,1009.802,18,1,42,0)
 ;;=STARKE^^149
 ;;^UTILITY(U,$J,1009.802,18,1,43,0)
 ;;=DAVIESS^^027
 ;;^UTILITY(U,$J,1009.802,18,1,44,0)
 ;;=LAKE^^089
 ;;^UTILITY(U,$J,1009.802,18,1,45,0)
 ;;=STEUBEN^^151
 ;;^UTILITY(U,$J,1009.802,18,1,46,0)
 ;;=DEARBORN^^029
 ;;^UTILITY(U,$J,1009.802,18,1,47,0)
 ;;=SULLIVAN^^153

DMUFI007
DMUFI007 ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,18,1,48,0)
 ;;=DECATUR^^031
 ;;^UTILITY(U,$J,1009.802,18,1,49,0)
 ;;=LAWRENCE^^093
 ;;^UTILITY(U,$J,1009.802,18,1,50,0)
 ;;=SWITZERLAND^^155
 ;;^UTILITY(U,$J,1009.802,18,1,51,0)
 ;;=DE KALB^^033
 ;;^UTILITY(U,$J,1009.802,18,1,52,0)
 ;;=MADISON^^095
 ;;^UTILITY(U,$J,1009.802,18,1,53,0)
 ;;=TIPPECANOE^^157
 ;;^UTILITY(U,$J,1009.802,18,1,54,0)
 ;;=DELAWARE^^035
 ;;^UTILITY(U,$J,1009.802,18,1,55,0)
 ;;=TIPTON^^159
 ;;^UTILITY(U,$J,1009.802,18,1,56,0)
 ;;=DUBOIS^^037
 ;;^UTILITY(U,$J,1009.802,18,1,57,0)
 ;;=MARSHALL^^099
 ;;^UTILITY(U,$J,1009.802,18,1,58,0)
 ;;=UNION^^161
 ;;^UTILITY(U,$J,1009.802,18,1,59,0)
 ;;=ELKHART^^039
 ;;^UTILITY(U,$J,1009.802,18,1,60,0)
 ;;=MARTIN^^101
 ;;^UTILITY(U,$J,1009.802,18,1,61,0)
 ;;=VANDERBURGH^^163
 ;;^UTILITY(U,$J,1009.802,18,1,62,0)
 ;;=FAYETTE^^041
 ;;^UTILITY(U,$J,1009.802,18,1,63,0)
 ;;=MIAMI^^103
 ;;^UTILITY(U,$J,1009.802,18,1,64,0)
 ;;=VERMILLION^^165
 ;;^UTILITY(U,$J,1009.802,18,1,65,0)
 ;;=FLOYD^^043
 ;;^UTILITY(U,$J,1009.802,18,1,66,0)
 ;;=MONROE^^105
 ;;^UTILITY(U,$J,1009.802,18,1,67,0)
 ;;=VIGO^^167
 ;;^UTILITY(U,$J,1009.802,18,1,68,0)
 ;;=FOUNTAIN^^045
 ;;^UTILITY(U,$J,1009.802,18,1,69,0)
 ;;=MONTGOMERY^^107
 ;;^UTILITY(U,$J,1009.802,18,1,70,0)
 ;;=WABASH^^169
 ;;^UTILITY(U,$J,1009.802,18,1,71,0)
 ;;=FRANKLIN^^047
 ;;^UTILITY(U,$J,1009.802,18,1,72,0)
 ;;=MORGAN^^109
 ;;^UTILITY(U,$J,1009.802,18,1,73,0)
 ;;=WARREN^^171
 ;;^UTILITY(U,$J,1009.802,18,1,74,0)
 ;;=FULTON^^049
 ;;^UTILITY(U,$J,1009.802,18,1,75,0)
 ;;=NEWTON^^111
 ;;^UTILITY(U,$J,1009.802,18,1,76,0)
 ;;=WARRICK^^173
 ;;^UTILITY(U,$J,1009.802,18,1,77,0)
 ;;=GIBSON^^051
 ;;^UTILITY(U,$J,1009.802,18,1,78,0)
 ;;=NOBLE^^113
 ;;^UTILITY(U,$J,1009.802,18,1,79,0)
 ;;=WASHINGTON^^175
 ;;^UTILITY(U,$J,1009.802,18,1,80,0)
 ;;=GRANT^^053
 ;;^UTILITY(U,$J,1009.802,18,1,81,0)
 ;;=OHIO^^115
 ;;^UTILITY(U,$J,1009.802,18,1,82,0)
 ;;=WAYNE^^177
 ;;^UTILITY(U,$J,1009.802,18,1,83,0)
 ;;=GREENE^^055
 ;;^UTILITY(U,$J,1009.802,18,1,84,0)
 ;;=ORANGE^^117
 ;;^UTILITY(U,$J,1009.802,18,1,85,0)
 ;;=WELLS^^179
 ;;^UTILITY(U,$J,1009.802,18,1,86,0)
 ;;=HAMILTON^^057
 ;;^UTILITY(U,$J,1009.802,18,1,87,0)
 ;;=OWEN^^119
 ;;^UTILITY(U,$J,1009.802,18,1,88,0)
 ;;=WHITE^^181
 ;;^UTILITY(U,$J,1009.802,18,1,89,0)
 ;;=HANCOCK^^059
 ;;^UTILITY(U,$J,1009.802,18,1,90,0)
 ;;=PARKE^^121
 ;;^UTILITY(U,$J,1009.802,18,1,91,0)
 ;;=WHITLEY^^183
 ;;^UTILITY(U,$J,1009.802,18,1,93,0)
 ;;=HARRISON^^061
 ;;^UTILITY(U,$J,1009.802,18,1,94,0)
 ;;=PERRY^^123
 ;;^UTILITY(U,$J,1009.802,18,1,95,0)
 ;;=CARROLL^^015
 ;;^UTILITY(U,$J,1009.802,19,0)
 ;;=IOWA^IA^19^^1^1
 ;;^UTILITY(U,$J,1009.802,19,1,0)
 ;;=^1009.812I^100^99
 ;;^UTILITY(U,$J,1009.802,19,1,2,0)
 ;;=JASPER^^099^099
 ;;^UTILITY(U,$J,1009.802,19,1,3,0)
 ;;=ADAIR^^001
 ;;^UTILITY(U,$J,1009.802,19,1,4,0)
 ;;=CARROLL^^027
 ;;^UTILITY(U,$J,1009.802,19,1,5,0)
 ;;=DECATUR^^053
 ;;^UTILITY(U,$J,1009.802,19,1,6,0)
 ;;=ADAMS^^003
 ;;^UTILITY(U,$J,1009.802,19,1,7,0)
 ;;=CASS^^029
 ;;^UTILITY(U,$J,1009.802,19,1,8,0)
 ;;=DELAWARE^^055
 ;;^UTILITY(U,$J,1009.802,19,1,9,0)
 ;;=ALLAMAKEE^^005
 ;;^UTILITY(U,$J,1009.802,19,1,10,0)
 ;;=CEDAR^^031
 ;;^UTILITY(U,$J,1009.802,19,1,11,0)
 ;;=DES MOINES^^057
 ;;^UTILITY(U,$J,1009.802,19,1,12,0)
 ;;=APPANOOSE^^007
 ;;^UTILITY(U,$J,1009.802,19,1,13,0)
 ;;=CERRO GORDO^^033
 ;;^UTILITY(U,$J,1009.802,19,1,14,0)
 ;;=DICKINSON^^059
 ;;^UTILITY(U,$J,1009.802,19,1,15,0)
 ;;=AUDUBON^^009
 ;;^UTILITY(U,$J,1009.802,19,1,16,0)
 ;;=CHEROKEE^^035
 ;;^UTILITY(U,$J,1009.802,19,1,17,0)
 ;;=DUBUQUE^^061
 ;;^UTILITY(U,$J,1009.802,19,1,18,0)
 ;;=BENTON^^011
 ;;^UTILITY(U,$J,1009.802,19,1,19,0)
 ;;=CHICKASAW^^037
 ;;^UTILITY(U,$J,1009.802,19,1,20,0)
 ;;=EMMET^^063
 ;;^UTILITY(U,$J,1009.802,19,1,21,0)
 ;;=BLACK HAWK^^013
 ;;^UTILITY(U,$J,1009.802,19,1,22,0)
 ;;=CLARKE^^039
 ;;^UTILITY(U,$J,1009.802,19,1,23,0)
 ;;=FAYETTE^^065
 ;;^UTILITY(U,$J,1009.802,19,1,24,0)
 ;;=BOONE^^015
 ;;^UTILITY(U,$J,1009.802,19,1,25,0)
 ;;=CLAY^^041
 ;;^UTILITY(U,$J,1009.802,19,1,26,0)
 ;;=FLOYD^^067
 ;;^UTILITY(U,$J,1009.802,19,1,27,0)
 ;;=BREMER^^017
 ;;^UTILITY(U,$J,1009.802,19,1,28,0)
 ;;=CLAYTON^^043
 ;;^UTILITY(U,$J,1009.802,19,1,29,0)
 ;;=FRANKLIN^^069
 ;;^UTILITY(U,$J,1009.802,19,1,30,0)
 ;;=BUCHANAN^^019
 ;;^UTILITY(U,$J,1009.802,19,1,31,0)
 ;;=CLINTON^^045
 ;;^UTILITY(U,$J,1009.802,19,1,32,0)
 ;;=FREMONT^^071
 ;;^UTILITY(U,$J,1009.802,19,1,33,0)
 ;;=BUENA VISTA^^021
 ;;^UTILITY(U,$J,1009.802,19,1,34,0)
 ;;=CRAWFORD^^047
 ;;^UTILITY(U,$J,1009.802,19,1,35,0)
 ;;=GREENE^^073
 ;;^UTILITY(U,$J,1009.802,19,1,36,0)
 ;;=BUTLER^^023
 ;;^UTILITY(U,$J,1009.802,19,1,37,0)
 ;;=DALLAS^^049
 ;;^UTILITY(U,$J,1009.802,19,1,38,0)
 ;;=GRUNDY^^075
 ;;^UTILITY(U,$J,1009.802,19,1,39,0)
 ;;=CALHOUN^^025
 ;;^UTILITY(U,$J,1009.802,19,1,40,0)
 ;;=DAVIS^^051
 ;;^UTILITY(U,$J,1009.802,19,1,41,0)
 ;;=GUTHRIE^^077
 ;;^UTILITY(U,$J,1009.802,19,1,42,0)
 ;;=HAMILTON^^079
 ;;^UTILITY(U,$J,1009.802,19,1,43,0)
 ;;=LYON^^119
 ;;^UTILITY(U,$J,1009.802,19,1,44,0)
 ;;=RINGGOLD^^159
 ;;^UTILITY(U,$J,1009.802,19,1,45,0)
 ;;=HANCOCK^^081
 ;;^UTILITY(U,$J,1009.802,19,1,46,0)
 ;;=MADISON^^121
 ;;^UTILITY(U,$J,1009.802,19,1,47,0)
 ;;=SAC^^161
 ;;^UTILITY(U,$J,1009.802,19,1,48,0)
 ;;=HARDIN^^083
 ;;^UTILITY(U,$J,1009.802,19,1,49,0)
 ;;=MAHASKA^^123
 ;;^UTILITY(U,$J,1009.802,19,1,50,0)
 ;;=SCOTT^^163
 ;;^UTILITY(U,$J,1009.802,19,1,51,0)
 ;;=HARRISON^^085
 ;;^UTILITY(U,$J,1009.802,19,1,52,0)
 ;;=MARION^^125
 ;;^UTILITY(U,$J,1009.802,19,1,53,0)
 ;;=SHELBY^^165
 ;;^UTILITY(U,$J,1009.802,19,1,54,0)
 ;;=HENRY^^087
 ;;^UTILITY(U,$J,1009.802,19,1,55,0)
 ;;=MARSHALL^^127
 ;;^UTILITY(U,$J,1009.802,19,1,56,0)
 ;;=SIOUX^^167
 ;;^UTILITY(U,$J,1009.802,19,1,57,0)
 ;;=HOWARD^^089
 ;;^UTILITY(U,$J,1009.802,19,1,58,0)
 ;;=MILLS^^129
 ;;^UTILITY(U,$J,1009.802,19,1,59,0)
 ;;=STORY^^169
 ;;^UTILITY(U,$J,1009.802,19,1,60,0)
 ;;=HUMBOLDT^^091
 ;;^UTILITY(U,$J,1009.802,19,1,61,0)
 ;;=MITCHELL^^131
 ;;^UTILITY(U,$J,1009.802,19,1,62,0)
 ;;=TAMA^^171
 ;;^UTILITY(U,$J,1009.802,19,1,63,0)
 ;;=IDA^^093
 ;;^UTILITY(U,$J,1009.802,19,1,64,0)
 ;;=MONONA^^133
 ;;^UTILITY(U,$J,1009.802,19,1,65,0)
 ;;=TAYLOR^^173
 ;;^UTILITY(U,$J,1009.802,19,1,66,0)
 ;;=IOWA^^095
 ;;^UTILITY(U,$J,1009.802,19,1,67,0)
 ;;=MONROE^^135
 ;;^UTILITY(U,$J,1009.802,19,1,68,0)
 ;;=UNION^^175
 ;;^UTILITY(U,$J,1009.802,19,1,69,0)
 ;;=JACKSON^^097
 ;;^UTILITY(U,$J,1009.802,19,1,70,0)
 ;;=MONTGOMERY^^137
 ;;^UTILITY(U,$J,1009.802,19,1,71,0)
 ;;=VAN BUREN^^177
 ;;^UTILITY(U,$J,1009.802,19,1,72,0)
 ;;=MUSCATINE^^139
 ;;^UTILITY(U,$J,1009.802,19,1,73,0)
 ;;=WAPELLO^^179
 ;;^UTILITY(U,$J,1009.802,19,1,74,0)
 ;;=JEFFERSON^^101
 ;;^UTILITY(U,$J,1009.802,19,1,75,0)
 ;;=O'BRIEN^^141
 ;;^UTILITY(U,$J,1009.802,19,1,76,0)
 ;;=WARREN^^181
 ;;^UTILITY(U,$J,1009.802,19,1,77,0)
 ;;=JOHNSON^^103
 ;;^UTILITY(U,$J,1009.802,19,1,78,0)
 ;;=OSCEOLA^^143
 ;;^UTILITY(U,$J,1009.802,19,1,79,0)
 ;;=WASHINGTON^^183
 ;;^UTILITY(U,$J,1009.802,19,1,80,0)
 ;;=JONES^^105
 ;;^UTILITY(U,$J,1009.802,19,1,81,0)
 ;;=PAGE^^145
 ;;^UTILITY(U,$J,1009.802,19,1,82,0)
 ;;=WAYNE^^185
 ;;^UTILITY(U,$J,1009.802,19,1,83,0)
 ;;=KEOKUK^^107
 ;;^UTILITY(U,$J,1009.802,19,1,84,0)
 ;;=PALO ALTO^^147
 ;;^UTILITY(U,$J,1009.802,19,1,85,0)
 ;;=WEBSTER^^187
 ;;^UTILITY(U,$J,1009.802,19,1,86,0)
 ;;=KOSSUTH^^109
 ;;^UTILITY(U,$J,1009.802,19,1,87,0)
 ;;=PLYMOUTH^^149
 ;;^UTILITY(U,$J,1009.802,19,1,88,0)
 ;;=WINNEBAGO^^189
 ;;^UTILITY(U,$J,1009.802,19,1,89,0)
 ;;=LEE^^111
 ;;^UTILITY(U,$J,1009.802,19,1,90,0)
 ;;=POCAHONTAS^^151
 ;;^UTILITY(U,$J,1009.802,19,1,91,0)
 ;;=WINNESHIEK^^191
 ;;^UTILITY(U,$J,1009.802,19,1,92,0)
 ;;=LINN^^113
 ;;^UTILITY(U,$J,1009.802,19,1,93,0)
 ;;=POLK^^153
 ;;^UTILITY(U,$J,1009.802,19,1,94,0)
 ;;=WOODBURY^^193
 ;;^UTILITY(U,$J,1009.802,19,1,95,0)
 ;;=LOUISA^^115
 ;;^UTILITY(U,$J,1009.802,19,1,96,0)
 ;;=POTTAWATTAMIE^^155
 ;;^UTILITY(U,$J,1009.802,19,1,97,0)
 ;;=WORTH^^195
 ;;^UTILITY(U,$J,1009.802,19,1,98,0)
 ;;=LUCAS^^117
 ;;^UTILITY(U,$J,1009.802,19,1,99,0)
 ;;=POWESHIEK^^157
 ;;^UTILITY(U,$J,1009.802,19,1,100,0)
 ;;=WRIGHT^^197
 ;;^UTILITY(U,$J,1009.802,20,0)
 ;;=KANSAS^KS^20^^1^1
 ;;^UTILITY(U,$J,1009.802,20,1,0)
 ;;=^1009.812I^108^105
 ;;^UTILITY(U,$J,1009.802,20,1,1,0)
 ;;=ALLEN^^001^001
 ;;^UTILITY(U,$J,1009.802,20,1,2,0)
 ;;=ANDERSON^^003^003
 ;;^UTILITY(U,$J,1009.802,20,1,3,0)
 ;;=ATCHISON^^005^005
 ;;^UTILITY(U,$J,1009.802,20,1,4,0)
 ;;=BARBER^^007^007
 ;;^UTILITY(U,$J,1009.802,20,1,5,0)
 ;;=BARTON^^009^009
 ;;^UTILITY(U,$J,1009.802,20,1,6,0)
 ;;=BOURBON^^011^011
 ;;^UTILITY(U,$J,1009.802,20,1,7,0)
 ;;=BROWN^^013^013
 ;;^UTILITY(U,$J,1009.802,20,1,8,0)
 ;;=BUTLER^^015^015
 ;;^UTILITY(U,$J,1009.802,20,1,9,0)
 ;;=CHASE^^017^017
 ;;^UTILITY(U,$J,1009.802,20,1,10,0)
 ;;=CHAUTAUQUA^^019^019
 ;;^UTILITY(U,$J,1009.802,20,1,11,0)
 ;;=CHEROKEE^^021^021
 ;;^UTILITY(U,$J,1009.802,20,1,12,0)
 ;;=CHEYENNE^^023^023
 ;;^UTILITY(U,$J,1009.802,20,1,13,0)
 ;;=CLARK^^025^025
 ;;^UTILITY(U,$J,1009.802,20,1,14,0)
 ;;=CLAY^^027^027
 ;;^UTILITY(U,$J,1009.802,20,1,15,0)
 ;;=CLOUD^^029^029
 ;;^UTILITY(U,$J,1009.802,20,1,16,0)
 ;;=COFFEY^^031^031
 ;;^UTILITY(U,$J,1009.802,20,1,17,0)
 ;;=COMANCHE^^033^033
 ;;^UTILITY(U,$J,1009.802,20,1,18,0)
 ;;=COWLEY^^035^035
 ;;^UTILITY(U,$J,1009.802,20,1,19,0)
 ;;=CRAWFORD^^037^037
 ;;^UTILITY(U,$J,1009.802,20,1,20,0)
 ;;=DECATUR^^039^039
 ;;^UTILITY(U,$J,1009.802,20,1,21,0)
 ;;=DICKINSON^^041^041
 ;;^UTILITY(U,$J,1009.802,20,1,22,0)
 ;;=DONIPHAN^^043^043
 ;;^UTILITY(U,$J,1009.802,20,1,23,0)
 ;;=DOUGLAS^^045^045
 ;;^UTILITY(U,$J,1009.802,20,1,24,0)
 ;;=EDWARDS^^047^047
 ;;^UTILITY(U,$J,1009.802,20,1,27,0)
 ;;=ELLSWORTH^^053^053
 ;;^UTILITY(U,$J,1009.802,20,1,28,0)
 ;;=FINNEY^^055^055
 ;;^UTILITY(U,$J,1009.802,20,1,29,0)
 ;;=FORD^^057^057
 ;;^UTILITY(U,$J,1009.802,20,1,30,0)
 ;;=FRANKLIN^^059^059
 ;;^UTILITY(U,$J,1009.802,20,1,31,0)
 ;;=GEARY^^061^061
 ;;^UTILITY(U,$J,1009.802,20,1,32,0)
 ;;=GOVE^^063^063
 ;;^UTILITY(U,$J,1009.802,20,1,33,0)
 ;;=GRAHAM^^065^065
 ;;^UTILITY(U,$J,1009.802,20,1,34,0)
 ;;=GRANT^^067^067
 ;;^UTILITY(U,$J,1009.802,20,1,35,0)
 ;;=GRAY^^069^069
 ;;^UTILITY(U,$J,1009.802,20,1,36,0)
 ;;=GREELEY^^071^071
 ;;^UTILITY(U,$J,1009.802,20,1,37,0)
 ;;=GREENWOOD^^073^073
 ;;^UTILITY(U,$J,1009.802,20,1,38,0)
 ;;=HAMILTON^^075^075
 ;;^UTILITY(U,$J,1009.802,20,1,39,0)
 ;;=HARPER^^077^077
 ;;^UTILITY(U,$J,1009.802,20,1,40,0)
 ;;=HARVEY^^079^079
 ;;^UTILITY(U,$J,1009.802,20,1,41,0)
 ;;=HASKELL^^081^081
 ;;^UTILITY(U,$J,1009.802,20,1,42,0)
 ;;=HODGEMAN^^083^083
 ;;^UTILITY(U,$J,1009.802,20,1,43,0)
 ;;=JACKSON^^085^085
 ;;^UTILITY(U,$J,1009.802,20,1,44,0)
 ;;=JEFFERSON^^087^087
 ;;^UTILITY(U,$J,1009.802,20,1,45,0)
 ;;=JEWELL^^089^089
 ;;^UTILITY(U,$J,1009.802,20,1,46,0)
 ;;=JOHNSON^^091^091
 ;;^UTILITY(U,$J,1009.802,20,1,47,0)
 ;;=KEARNY^^093^093
 ;;^UTILITY(U,$J,1009.802,20,1,48,0)
 ;;=KINGMAN^^095^095
 ;;^UTILITY(U,$J,1009.802,20,1,49,0)
 ;;=KIOWA^^097^097
 ;;^UTILITY(U,$J,1009.802,20,1,50,0)
 ;;=LABETTE^^099^099
 ;;^UTILITY(U,$J,1009.802,20,1,51,0)
 ;;=LANE^^101^101
 ;;^UTILITY(U,$J,1009.802,20,1,52,0)
 ;;=LEAVENWORTH^^103^103
 ;;^UTILITY(U,$J,1009.802,20,1,53,0)
 ;;=LINCOLN^^105^105
 ;;^UTILITY(U,$J,1009.802,20,1,54,0)
 ;;=LINN^^107^107
 ;;^UTILITY(U,$J,1009.802,20,1,55,0)
 ;;=LOGAN^^109^109
 ;;^UTILITY(U,$J,1009.802,20,1,56,0)
 ;;=LYON^^111^111
 ;;^UTILITY(U,$J,1009.802,20,1,57,0)
 ;;=MCPHERSON^^113^113
 ;;^UTILITY(U,$J,1009.802,20,1,58,0)
 ;;=MARION^^115^115
 ;;^UTILITY(U,$J,1009.802,20,1,59,0)
 ;;=MARSHALL^^117^117
 ;;^UTILITY(U,$J,1009.802,20,1,60,0)
 ;;=MEADE^^119^119
 ;;^UTILITY(U,$J,1009.802,20,1,61,0)
 ;;=MIAMI^^121^121
 ;;^UTILITY(U,$J,1009.802,20,1,62,0)
 ;;=MITCHELL^^123^123
 ;;^UTILITY(U,$J,1009.802,20,1,63,0)
 ;;=MONTGOMERY^^125^125
 ;;^UTILITY(U,$J,1009.802,20,1,64,0)
 ;;=MORRIS^^127^127
 ;;^UTILITY(U,$J,1009.802,20,1,65,0)
 ;;=MORTON^^129^129
 ;;^UTILITY(U,$J,1009.802,20,1,66,0)
 ;;=NEMAHA^^131^131
 ;;^UTILITY(U,$J,1009.802,20,1,67,0)
 ;;=NEOSHO^^133^133
 ;;^UTILITY(U,$J,1009.802,20,1,68,0)
 ;;=NESS^^135^135
 ;;^UTILITY(U,$J,1009.802,20,1,69,0)
 ;;=NORTON^^137^137
 ;;^UTILITY(U,$J,1009.802,20,1,70,0)
 ;;=OSAGE^^139^139
 ;;^UTILITY(U,$J,1009.802,20,1,71,0)
 ;;=OSBORNE^^141^141
 ;;^UTILITY(U,$J,1009.802,20,1,72,0)
 ;;=OTTAWA^^143^143
 ;;^UTILITY(U,$J,1009.802,20,1,73,0)
 ;;=PAWNEE^^145^145
 ;;^UTILITY(U,$J,1009.802,20,1,74,0)
 ;;=PHILLIPS^^147^147
 ;;^UTILITY(U,$J,1009.802,20,1,75,0)
 ;;=POTTAWATOMIE^^149^149
 ;;^UTILITY(U,$J,1009.802,20,1,76,0)
 ;;=PRATT^^151^151
 ;;^UTILITY(U,$J,1009.802,20,1,77,0)
 ;;=RAWLINS^^153^153
 ;;^UTILITY(U,$J,1009.802,20,1,78,0)
 ;;=RENO^^155^155
 ;;^UTILITY(U,$J,1009.802,20,1,79,0)
 ;;=REPUBLIC^^157^157
 ;;^UTILITY(U,$J,1009.802,20,1,80,0)
 ;;=RICE^^159^159
 ;;^UTILITY(U,$J,1009.802,20,1,81,0)
 ;;=RILEY^^161^161
 ;;^UTILITY(U,$J,1009.802,20,1,82,0)
 ;;=ROOKS^^163^163
 ;;^UTILITY(U,$J,1009.802,20,1,83,0)
 ;;=RUSH^^165^165
 ;;^UTILITY(U,$J,1009.802,20,1,84,0)
 ;;=RUSSELL^^167^167
 ;;^UTILITY(U,$J,1009.802,20,1,85,0)
 ;;=SALINE^^169^169
 ;;^UTILITY(U,$J,1009.802,20,1,86,0)
 ;;=SCOTT^^171^171
 ;;^UTILITY(U,$J,1009.802,20,1,87,0)
 ;;=SEDGWICK^^173^173
 ;;^UTILITY(U,$J,1009.802,20,1,88,0)
 ;;=SEWARD^^175^175
 ;;^UTILITY(U,$J,1009.802,20,1,89,0)
 ;;=SHAWNEE^^177^177
 ;;^UTILITY(U,$J,1009.802,20,1,90,0)
 ;;=SHERIDAN^^179^179
 ;;^UTILITY(U,$J,1009.802,20,1,91,0)
 ;;=SHERMAN^^181^181
 ;;^UTILITY(U,$J,1009.802,20,1,92,0)
 ;;=SMITH^^183^183
 ;;^UTILITY(U,$J,1009.802,20,1,93,0)
 ;;=STAFFORD^^185^185
 ;;^UTILITY(U,$J,1009.802,20,1,94,0)
 ;;=STANTON^^187^187
 ;;^UTILITY(U,$J,1009.802,20,1,95,0)
 ;;=STEVENS^^189^189
 ;;^UTILITY(U,$J,1009.802,20,1,96,0)
 ;;=SUMNER^^191^191
 ;;^UTILITY(U,$J,1009.802,20,1,97,0)
 ;;=THOMAS^^193^193
 ;;^UTILITY(U,$J,1009.802,20,1,98,0)
 ;;=TREGO^^195^195
 ;;^UTILITY(U,$J,1009.802,20,1,99,0)
 ;;=WABAUNSEE^^197^197
 ;;^UTILITY(U,$J,1009.802,20,1,100,0)
 ;;=WALLACE^^199^199
 ;;^UTILITY(U,$J,1009.802,20,1,101,0)
 ;;=WASHINGTON^^201^201
 ;;^UTILITY(U,$J,1009.802,20,1,102,0)
 ;;=WICHITA^^203^203
 ;;^UTILITY(U,$J,1009.802,20,1,103,0)
 ;;=WILSON^^205^205
 ;;^UTILITY(U,$J,1009.802,20,1,104,0)
 ;;=WOODSON^^207^207
 ;;^UTILITY(U,$J,1009.802,20,1,105,0)
 ;;=WYANDOTTE^^209^209

DMUFI008
DMUFI008 ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,20,1,107,0)
 ;;=ELK^^049
 ;;^UTILITY(U,$J,1009.802,20,1,108,0)
 ;;=ELLIS^^051
 ;;^UTILITY(U,$J,1009.802,21,0)
 ;;=KENTUCKY^KY^21^^1^1
 ;;^UTILITY(U,$J,1009.802,21,1,0)
 ;;=^1009.812I^120^120
 ;;^UTILITY(U,$J,1009.802,21,1,1,0)
 ;;=ADAIR^^001
 ;;^UTILITY(U,$J,1009.802,21,1,2,0)
 ;;=FLEMING^^069
 ;;^UTILITY(U,$J,1009.802,21,1,3,0)
 ;;=LINCOLN^^137
 ;;^UTILITY(U,$J,1009.802,21,1,4,0)
 ;;=ALLEN^^003
 ;;^UTILITY(U,$J,1009.802,21,1,5,0)
 ;;=FLOYD^^071
 ;;^UTILITY(U,$J,1009.802,21,1,6,0)
 ;;=LIVINGSTON^^139
 ;;^UTILITY(U,$J,1009.802,21,1,7,0)
 ;;=ANDERSON^^005
 ;;^UTILITY(U,$J,1009.802,21,1,8,0)
 ;;=FRANKLIN^^073
 ;;^UTILITY(U,$J,1009.802,21,1,9,0)
 ;;=LOGAN^^141
 ;;^UTILITY(U,$J,1009.802,21,1,10,0)
 ;;=BALLARD^^007
 ;;^UTILITY(U,$J,1009.802,21,1,11,0)
 ;;=FULTON^^075
 ;;^UTILITY(U,$J,1009.802,21,1,12,0)
 ;;=LYON^^143
 ;;^UTILITY(U,$J,1009.802,21,1,13,0)
 ;;=BARREN^^009
 ;;^UTILITY(U,$J,1009.802,21,1,14,0)
 ;;=GALLATIN^^077
 ;;^UTILITY(U,$J,1009.802,21,1,15,0)
 ;;=MCCRACKEN^^145
 ;;^UTILITY(U,$J,1009.802,21,1,16,0)
 ;;=BATH^^011
 ;;^UTILITY(U,$J,1009.802,21,1,17,0)
 ;;=GARRARD^^079
 ;;^UTILITY(U,$J,1009.802,21,1,18,0)
 ;;=MCCREARY^^147
 ;;^UTILITY(U,$J,1009.802,21,1,19,0)
 ;;=BELL^^013
 ;;^UTILITY(U,$J,1009.802,21,1,20,0)
 ;;=GRANT^^081
 ;;^UTILITY(U,$J,1009.802,21,1,21,0)
 ;;=MCLEAN^^149
 ;;^UTILITY(U,$J,1009.802,21,1,22,0)
 ;;=BOONE^^015
 ;;^UTILITY(U,$J,1009.802,21,1,23,0)
 ;;=GRAVES^^083
 ;;^UTILITY(U,$J,1009.802,21,1,24,0)
 ;;=MADISON^^151
 ;;^UTILITY(U,$J,1009.802,21,1,25,0)
 ;;=BOURBON^^017
 ;;^UTILITY(U,$J,1009.802,21,1,26,0)
 ;;=GRAYSON^^085
 ;;^UTILITY(U,$J,1009.802,21,1,27,0)
 ;;=MAGOFFIN^^153
 ;;^UTILITY(U,$J,1009.802,21,1,28,0)
 ;;=BOYD^^019
 ;;^UTILITY(U,$J,1009.802,21,1,29,0)
 ;;=GREEN^^087
 ;;^UTILITY(U,$J,1009.802,21,1,30,0)
 ;;=MARION^^155
 ;;^UTILITY(U,$J,1009.802,21,1,31,0)
 ;;=BOYLE^^021
 ;;^UTILITY(U,$J,1009.802,21,1,32,0)
 ;;=GREENUP^^089
 ;;^UTILITY(U,$J,1009.802,21,1,33,0)
 ;;=MARSHALL^^157
 ;;^UTILITY(U,$J,1009.802,21,1,34,0)
 ;;=BRACKEN^^023
 ;;^UTILITY(U,$J,1009.802,21,1,35,0)
 ;;=HANCOCK^^091
 ;;^UTILITY(U,$J,1009.802,21,1,36,0)
 ;;=MARTIN^^159
 ;;^UTILITY(U,$J,1009.802,21,1,37,0)
 ;;=BREATHITT^^025
 ;;^UTILITY(U,$J,1009.802,21,1,38,0)
 ;;=HARDIN^^093
 ;;^UTILITY(U,$J,1009.802,21,1,39,0)
 ;;=MASON^^161
 ;;^UTILITY(U,$J,1009.802,21,1,40,0)
 ;;=BRECKINRIDGE^^027
 ;;^UTILITY(U,$J,1009.802,21,1,41,0)
 ;;=HARLAN^^095
 ;;^UTILITY(U,$J,1009.802,21,1,42,0)
 ;;=MEADE^^163
 ;;^UTILITY(U,$J,1009.802,21,1,43,0)
 ;;=BULLITT^^029
 ;;^UTILITY(U,$J,1009.802,21,1,44,0)
 ;;=HARRISON^^097
 ;;^UTILITY(U,$J,1009.802,21,1,45,0)
 ;;=MENIFEE^^165
 ;;^UTILITY(U,$J,1009.802,21,1,46,0)
 ;;=BUTLER^^031
 ;;^UTILITY(U,$J,1009.802,21,1,47,0)
 ;;=HART^^099
 ;;^UTILITY(U,$J,1009.802,21,1,48,0)
 ;;=MERCER^^167
 ;;^UTILITY(U,$J,1009.802,21,1,49,0)
 ;;=CALDWELL^^033
 ;;^UTILITY(U,$J,1009.802,21,1,50,0)
 ;;=HENDERSON^^101
 ;;^UTILITY(U,$J,1009.802,21,1,51,0)
 ;;=METCALFE^^169
 ;;^UTILITY(U,$J,1009.802,21,1,52,0)
 ;;=CALLOWAY^^035
 ;;^UTILITY(U,$J,1009.802,21,1,53,0)
 ;;=HENRY^^103
 ;;^UTILITY(U,$J,1009.802,21,1,54,0)
 ;;=MONROE^^171
 ;;^UTILITY(U,$J,1009.802,21,1,55,0)
 ;;=CAMPBELL^^037
 ;;^UTILITY(U,$J,1009.802,21,1,56,0)
 ;;=HICKMAN^^105
 ;;^UTILITY(U,$J,1009.802,21,1,57,0)
 ;;=MONTGOMERY^^173
 ;;^UTILITY(U,$J,1009.802,21,1,58,0)
 ;;=CARLISLE^^039
 ;;^UTILITY(U,$J,1009.802,21,1,59,0)
 ;;=HOPKINS^^107
 ;;^UTILITY(U,$J,1009.802,21,1,60,0)
 ;;=MORGAN^^175
 ;;^UTILITY(U,$J,1009.802,21,1,61,0)
 ;;=CARROLL^^041
 ;;^UTILITY(U,$J,1009.802,21,1,62,0)
 ;;=JACKSON^^109
 ;;^UTILITY(U,$J,1009.802,21,1,63,0)
 ;;=MUHLENBERG^^177
 ;;^UTILITY(U,$J,1009.802,21,1,64,0)
 ;;=CARTER^^043
 ;;^UTILITY(U,$J,1009.802,21,1,65,0)
 ;;=JEFFERSON^^111
 ;;^UTILITY(U,$J,1009.802,21,1,66,0)
 ;;=NELSON^^179
 ;;^UTILITY(U,$J,1009.802,21,1,67,0)
 ;;=CASEY^^045
 ;;^UTILITY(U,$J,1009.802,21,1,68,0)
 ;;=JESSAMINE^^113
 ;;^UTILITY(U,$J,1009.802,21,1,69,0)
 ;;=NICHOLAS^^181
 ;;^UTILITY(U,$J,1009.802,21,1,70,0)
 ;;=CHRISTIAN^^047
 ;;^UTILITY(U,$J,1009.802,21,1,71,0)
 ;;=JOHNSON^^115
 ;;^UTILITY(U,$J,1009.802,21,1,72,0)
 ;;=OHIO^^183
 ;;^UTILITY(U,$J,1009.802,21,1,73,0)
 ;;=CLARK^^049
 ;;^UTILITY(U,$J,1009.802,21,1,74,0)
 ;;=KENTON^^117
 ;;^UTILITY(U,$J,1009.802,21,1,75,0)
 ;;=OLDHAM^^185
 ;;^UTILITY(U,$J,1009.802,21,1,76,0)
 ;;=CLAY^^051
 ;;^UTILITY(U,$J,1009.802,21,1,77,0)
 ;;=KNOTT^^119
 ;;^UTILITY(U,$J,1009.802,21,1,78,0)
 ;;=OWEN^^187
 ;;^UTILITY(U,$J,1009.802,21,1,79,0)
 ;;=CLINTON^^053
 ;;^UTILITY(U,$J,1009.802,21,1,80,0)
 ;;=KNOX^^121
 ;;^UTILITY(U,$J,1009.802,21,1,81,0)
 ;;=OWSLEY^^189
 ;;^UTILITY(U,$J,1009.802,21,1,82,0)
 ;;=CRITTENDEN^^055
 ;;^UTILITY(U,$J,1009.802,21,1,83,0)
 ;;=LARUE^^123
 ;;^UTILITY(U,$J,1009.802,21,1,84,0)
 ;;=PENDLETON^^191
 ;;^UTILITY(U,$J,1009.802,21,1,85,0)
 ;;=CUMBERLAND^^057
 ;;^UTILITY(U,$J,1009.802,21,1,86,0)
 ;;=LAUREL^^125
 ;;^UTILITY(U,$J,1009.802,21,1,87,0)
 ;;=PERRY^^193
 ;;^UTILITY(U,$J,1009.802,21,1,88,0)
 ;;=DAVIESS^^059
 ;;^UTILITY(U,$J,1009.802,21,1,89,0)
 ;;=LAWRENCE^^127
 ;;^UTILITY(U,$J,1009.802,21,1,90,0)
 ;;=PIKE^^195
 ;;^UTILITY(U,$J,1009.802,21,1,91,0)
 ;;=EDMONSON^^061
 ;;^UTILITY(U,$J,1009.802,21,1,92,0)
 ;;=LEE^^129
 ;;^UTILITY(U,$J,1009.802,21,1,93,0)
 ;;=POWELL^^197
 ;;^UTILITY(U,$J,1009.802,21,1,94,0)
 ;;=ELLIOTT^^063
 ;;^UTILITY(U,$J,1009.802,21,1,95,0)
 ;;=LESLIE^^131
 ;;^UTILITY(U,$J,1009.802,21,1,96,0)
 ;;=PULASKI^^199
 ;;^UTILITY(U,$J,1009.802,21,1,97,0)
 ;;=ESTILL^^065
 ;;^UTILITY(U,$J,1009.802,21,1,98,0)
 ;;=LETCHER^^133
 ;;^UTILITY(U,$J,1009.802,21,1,99,0)
 ;;=ROBERTSON^^201
 ;;^UTILITY(U,$J,1009.802,21,1,100,0)
 ;;=FAYETTE^^067
 ;;^UTILITY(U,$J,1009.802,21,1,101,0)
 ;;=LEWIS^^135
 ;;^UTILITY(U,$J,1009.802,21,1,102,0)
 ;;=ROCKCASTLE^^203
 ;;^UTILITY(U,$J,1009.802,21,1,103,0)
 ;;=ROWAN^^205
 ;;^UTILITY(U,$J,1009.802,21,1,104,0)
 ;;=TAYLOR^^217
 ;;^UTILITY(U,$J,1009.802,21,1,105,0)
 ;;=WASHINGTON^^229
 ;;^UTILITY(U,$J,1009.802,21,1,106,0)
 ;;=RUSSELL^^207
 ;;^UTILITY(U,$J,1009.802,21,1,107,0)
 ;;=TODD^^219
 ;;^UTILITY(U,$J,1009.802,21,1,108,0)
 ;;=WAYNE^^231
 ;;^UTILITY(U,$J,1009.802,21,1,109,0)
 ;;=SCOTT^^209
 ;;^UTILITY(U,$J,1009.802,21,1,110,0)
 ;;=TRIGG^^221
 ;;^UTILITY(U,$J,1009.802,21,1,111,0)
 ;;=WEBSTER^^233
 ;;^UTILITY(U,$J,1009.802,21,1,112,0)
 ;;=SHELBY^^211
 ;;^UTILITY(U,$J,1009.802,21,1,113,0)
 ;;=TRIMBLE^^223
 ;;^UTILITY(U,$J,1009.802,21,1,114,0)
 ;;=WHITLEY^^235
 ;;^UTILITY(U,$J,1009.802,21,1,115,0)
 ;;=SIMPSON^^213
 ;;^UTILITY(U,$J,1009.802,21,1,116,0)
 ;;=UNION^^225
 ;;^UTILITY(U,$J,1009.802,21,1,117,0)
 ;;=WOLFE^^237
 ;;^UTILITY(U,$J,1009.802,21,1,118,0)
 ;;=SPENCER^^215
 ;;^UTILITY(U,$J,1009.802,21,1,119,0)
 ;;=WARREN^^227
 ;;^UTILITY(U,$J,1009.802,21,1,120,0)
 ;;=WOODFORD^^239
 ;;^UTILITY(U,$J,1009.802,22,0)
 ;;=LOUISIANA^LA^22^^1^1
 ;;^UTILITY(U,$J,1009.802,22,1,0)
 ;;=^1009.812I^64^64
 ;;^UTILITY(U,$J,1009.802,22,1,1,0)
 ;;=ACADIA^^001
 ;;^UTILITY(U,$J,1009.802,22,1,2,0)
 ;;=IBERIA^^045
 ;;^UTILITY(U,$J,1009.802,22,1,3,0)
 ;;=ST. CHARLES^^089
 ;;^UTILITY(U,$J,1009.802,22,1,4,0)
 ;;=ALLEN^^003
 ;;^UTILITY(U,$J,1009.802,22,1,5,0)
 ;;=IBERVILLE^^047
 ;;^UTILITY(U,$J,1009.802,22,1,6,0)
 ;;=ST. HELENA^^091
 ;;^UTILITY(U,$J,1009.802,22,1,7,0)
 ;;=ASCENSION^^005
 ;;^UTILITY(U,$J,1009.802,22,1,8,0)
 ;;=JACKSON^^049
 ;;^UTILITY(U,$J,1009.802,22,1,9,0)
 ;;=ST. JAMES^^093
 ;;^UTILITY(U,$J,1009.802,22,1,10,0)
 ;;=ASSUMPTION^^007
 ;;^UTILITY(U,$J,1009.802,22,1,11,0)
 ;;=JEFFERSON^^051
 ;;^UTILITY(U,$J,1009.802,22,1,12,0)
 ;;=ST. JOHN THE BAPTIST^^095
 ;;^UTILITY(U,$J,1009.802,22,1,13,0)
 ;;=AVOYELLES^^009
 ;;^UTILITY(U,$J,1009.802,22,1,14,0)
 ;;=JEFFERSON DAVIS^^053
 ;;^UTILITY(U,$J,1009.802,22,1,15,0)
 ;;=BEAUREGARD^^011
 ;;^UTILITY(U,$J,1009.802,22,1,16,0)
 ;;=ST. LANDRY^^097
 ;;^UTILITY(U,$J,1009.802,22,1,17,0)
 ;;=BIENVILLE^^013
 ;;^UTILITY(U,$J,1009.802,22,1,18,0)
 ;;=LAFAYETTE^^055
 ;;^UTILITY(U,$J,1009.802,22,1,19,0)
 ;;=ST. MARTIN^^099
 ;;^UTILITY(U,$J,1009.802,22,1,20,0)
 ;;=BOSSIER^^015
 ;;^UTILITY(U,$J,1009.802,22,1,21,0)
 ;;=LAFOURCHE^^057
 ;;^UTILITY(U,$J,1009.802,22,1,22,0)
 ;;=ST. MARY^^101
 ;;^UTILITY(U,$J,1009.802,22,1,23,0)
 ;;=CADDO^^017
 ;;^UTILITY(U,$J,1009.802,22,1,24,0)
 ;;=LA SALLE^^059
 ;;^UTILITY(U,$J,1009.802,22,1,25,0)
 ;;=ST. TAMMANY^^103
 ;;^UTILITY(U,$J,1009.802,22,1,26,0)
 ;;=CALCASIEU^^019
 ;;^UTILITY(U,$J,1009.802,22,1,27,0)
 ;;=LINCOLN^^061
 ;;^UTILITY(U,$J,1009.802,22,1,28,0)
 ;;=TANGIPAHOA^^105
 ;;^UTILITY(U,$J,1009.802,22,1,29,0)
 ;;=CALDWELL^^021
 ;;^UTILITY(U,$J,1009.802,22,1,30,0)
 ;;=LIVINGSTON^^063
 ;;^UTILITY(U,$J,1009.802,22,1,31,0)
 ;;=TENSAS^^107
 ;;^UTILITY(U,$J,1009.802,22,1,32,0)
 ;;=CAMERON^^023
 ;;^UTILITY(U,$J,1009.802,22,1,33,0)
 ;;=MADISON^^065
 ;;^UTILITY(U,$J,1009.802,22,1,34,0)
 ;;=TERREBONNE^^109
 ;;^UTILITY(U,$J,1009.802,22,1,35,0)
 ;;=CATAHOULA^^025
 ;;^UTILITY(U,$J,1009.802,22,1,36,0)
 ;;=MOREHOUSE^^067
 ;;^UTILITY(U,$J,1009.802,22,1,37,0)
 ;;=UNION^^111
 ;;^UTILITY(U,$J,1009.802,22,1,38,0)
 ;;=CLAIBORNE^^027
 ;;^UTILITY(U,$J,1009.802,22,1,39,0)
 ;;=NATCHITOCHES^^069
 ;;^UTILITY(U,$J,1009.802,22,1,40,0)
 ;;=VERMILION^^113
 ;;^UTILITY(U,$J,1009.802,22,1,41,0)
 ;;=CONCORDIA^^029
 ;;^UTILITY(U,$J,1009.802,22,1,42,0)
 ;;=ORLEANS^^071
 ;;^UTILITY(U,$J,1009.802,22,1,43,0)
 ;;=VERNON^^115
 ;;^UTILITY(U,$J,1009.802,22,1,44,0)
 ;;=DE SOTO^^031
 ;;^UTILITY(U,$J,1009.802,22,1,45,0)
 ;;=OUACHITA^^073
 ;;^UTILITY(U,$J,1009.802,22,1,46,0)
 ;;=WASHINGTON^^117
 ;;^UTILITY(U,$J,1009.802,22,1,47,0)
 ;;=EAST BATON ROUGE^^033
 ;;^UTILITY(U,$J,1009.802,22,1,48,0)
 ;;=PLAQUEMINES^^075
 ;;^UTILITY(U,$J,1009.802,22,1,49,0)
 ;;=POINTE COUPEE^^077
 ;;^UTILITY(U,$J,1009.802,22,1,50,0)
 ;;=WEBSTER^^119
 ;;^UTILITY(U,$J,1009.802,22,1,51,0)
 ;;=WEST BATON ROUGE^^121
 ;;^UTILITY(U,$J,1009.802,22,1,52,0)
 ;;=EAST CARROLL^^035
 ;;^UTILITY(U,$J,1009.802,22,1,53,0)
 ;;=RAPIDES^^079
 ;;^UTILITY(U,$J,1009.802,22,1,54,0)
 ;;=EAST FELICIANA^^037
 ;;^UTILITY(U,$J,1009.802,22,1,55,0)
 ;;=RED RIVER^^081
 ;;^UTILITY(U,$J,1009.802,22,1,56,0)
 ;;=WEST CARROLL^^123
 ;;^UTILITY(U,$J,1009.802,22,1,57,0)
 ;;=EVANGELINE^^039
 ;;^UTILITY(U,$J,1009.802,22,1,58,0)
 ;;=RICHLAND^^083
 ;;^UTILITY(U,$J,1009.802,22,1,59,0)
 ;;=WEST FELICIANA^^125
 ;;^UTILITY(U,$J,1009.802,22,1,60,0)
 ;;=FRANKLIN^^041
 ;;^UTILITY(U,$J,1009.802,22,1,61,0)
 ;;=SABINE^^085
 ;;^UTILITY(U,$J,1009.802,22,1,62,0)
 ;;=WINN^^127
 ;;^UTILITY(U,$J,1009.802,22,1,63,0)
 ;;=GRANT^^043
 ;;^UTILITY(U,$J,1009.802,22,1,64,0)
 ;;=ST. BERNARD^^087
 ;;^UTILITY(U,$J,1009.802,23,0)
 ;;=MAINE^ME^23^^1^1
 ;;^UTILITY(U,$J,1009.802,23,1,0)
 ;;=^1009.812I^16^16
 ;;^UTILITY(U,$J,1009.802,23,1,1,0)
 ;;=WASHINGTON^^029^029
 ;;^UTILITY(U,$J,1009.802,23,1,2,0)
 ;;=ANDROSCOGGIN^^001
 ;;^UTILITY(U,$J,1009.802,23,1,3,0)
 ;;=KENNEBEC^^011
 ;;^UTILITY(U,$J,1009.802,23,1,4,0)
 ;;=PISCATAQUIS^^021
 ;;^UTILITY(U,$J,1009.802,23,1,5,0)
 ;;=AROOSTOOK^^003
 ;;^UTILITY(U,$J,1009.802,23,1,6,0)
 ;;=KNOX^^013
 ;;^UTILITY(U,$J,1009.802,23,1,7,0)
 ;;=SAGADAHOC^^023
 ;;^UTILITY(U,$J,1009.802,23,1,8,0)
 ;;=CUMBERLAND^^005
 ;;^UTILITY(U,$J,1009.802,23,1,9,0)
 ;;=LINCOLN^^015
 ;;^UTILITY(U,$J,1009.802,23,1,10,0)
 ;;=SOMERSET^^025
 ;;^UTILITY(U,$J,1009.802,23,1,11,0)
 ;;=FRANKLIN^^007
 ;;^UTILITY(U,$J,1009.802,23,1,12,0)
 ;;=OXFORD^^017
 ;;^UTILITY(U,$J,1009.802,23,1,13,0)
 ;;=WALDO^^027
 ;;^UTILITY(U,$J,1009.802,23,1,14,0)
 ;;=HANCOCK^^009
 ;;^UTILITY(U,$J,1009.802,23,1,15,0)
 ;;=PENOBSCOT^^019
 ;;^UTILITY(U,$J,1009.802,23,1,16,0)
 ;;=YORK^^031
 ;;^UTILITY(U,$J,1009.802,24,0)
 ;;=MARYLAND^MD^24^^1^1
 ;;^UTILITY(U,$J,1009.802,24,1,0)
 ;;=^1009.812I^24^24
 ;;^UTILITY(U,$J,1009.802,24,1,1,0)
 ;;=ANNE ARUNDEL^^003^003
 ;;^UTILITY(U,$J,1009.802,24,1,2,0)
 ;;=PRINCE GEORGE'S^^033^033
 ;;^UTILITY(U,$J,1009.802,24,1,3,0)
 ;;=ALLEGANY^^001
 ;;^UTILITY(U,$J,1009.802,24,1,4,0)
 ;;=DORCHESTER^^019
 ;;^UTILITY(U,$J,1009.802,24,1,5,0)
 ;;=QUEEN ANNE'S^^035
 ;;^UTILITY(U,$J,1009.802,24,1,6,0)
 ;;=FREDERICK^^021
 ;;^UTILITY(U,$J,1009.802,24,1,7,0)
 ;;=ST. MARY'S^^037
 ;;^UTILITY(U,$J,1009.802,24,1,8,0)
 ;;=BALTIMORE^^005
 ;;^UTILITY(U,$J,1009.802,24,1,9,0)
 ;;=GARRETT^^023
 ;;^UTILITY(U,$J,1009.802,24,1,10,0)
 ;;=SOMERSET^^039
 ;;^UTILITY(U,$J,1009.802,24,1,11,0)
 ;;=CALVERT^^009
 ;;^UTILITY(U,$J,1009.802,24,1,12,0)
 ;;=HARFORD^^025
 ;;^UTILITY(U,$J,1009.802,24,1,13,0)
 ;;=TALBOT^^041
 ;;^UTILITY(U,$J,1009.802,24,1,14,0)
 ;;=CAROLINE^^011
 ;;^UTILITY(U,$J,1009.802,24,1,15,0)
 ;;=HOWARD^^027
 ;;^UTILITY(U,$J,1009.802,24,1,16,0)
 ;;=WASHINGTON^^043
 ;;^UTILITY(U,$J,1009.802,24,1,17,0)
 ;;=CARROLL^^013
 ;;^UTILITY(U,$J,1009.802,24,1,18,0)
 ;;=KENT^^029
 ;;^UTILITY(U,$J,1009.802,24,1,19,0)
 ;;=WICOMICO^^045
 ;;^UTILITY(U,$J,1009.802,24,1,20,0)
 ;;=CECIL^^015
 ;;^UTILITY(U,$J,1009.802,24,1,21,0)
 ;;=MONTGOMERY^^031
 ;;^UTILITY(U,$J,1009.802,24,1,22,0)
 ;;=WORCESTER^^047
 ;;^UTILITY(U,$J,1009.802,24,1,23,0)
 ;;=CHARLES^^017
 ;;^UTILITY(U,$J,1009.802,24,1,24,0)
 ;;=BALTIMORE (CITY)^^510
 ;;^UTILITY(U,$J,1009.802,25,0)
 ;;=MASSACHUSETTS^MA^25^^1^1
 ;;^UTILITY(U,$J,1009.802,25,1,0)
 ;;=^1009.812I^14^14
 ;;^UTILITY(U,$J,1009.802,25,1,1,0)
 ;;=BARNSTABLE^^001
 ;;^UTILITY(U,$J,1009.802,25,1,2,0)
 ;;=FRANKLIN^^011
 ;;^UTILITY(U,$J,1009.802,25,1,3,0)
 ;;=NORFOLK^^021
 ;;^UTILITY(U,$J,1009.802,25,1,4,0)
 ;;=BERKSHIRE^^003
 ;;^UTILITY(U,$J,1009.802,25,1,5,0)
 ;;=HAMPDEN^^013
 ;;^UTILITY(U,$J,1009.802,25,1,6,0)
 ;;=PLYMOUTH^^023
 ;;^UTILITY(U,$J,1009.802,25,1,7,0)
 ;;=BRISTOL^^005
 ;;^UTILITY(U,$J,1009.802,25,1,8,0)
 ;;=HAMPSHIRE^^015
 ;;^UTILITY(U,$J,1009.802,25,1,9,0)
 ;;=SUFFOLK^^025
 ;;^UTILITY(U,$J,1009.802,25,1,10,0)
 ;;=DUKES^^007
 ;;^UTILITY(U,$J,1009.802,25,1,11,0)
 ;;=MIDDLESEX^^017
 ;;^UTILITY(U,$J,1009.802,25,1,12,0)
 ;;=WORCESTER^^027
 ;;^UTILITY(U,$J,1009.802,25,1,13,0)
 ;;=ESSEX^^009
 ;;^UTILITY(U,$J,1009.802,25,1,14,0)
 ;;=NANTUCKET^^019
 ;;^UTILITY(U,$J,1009.802,26,0)
 ;;=MICHIGAN^MI^26^LANSING^1^1
 ;;^UTILITY(U,$J,1009.802,26,1,0)
 ;;=^1009.812I^84^83
 ;;^UTILITY(U,$J,1009.802,26,1,1,0)
 ;;=CHIPPEWA^^033^033
 ;;^UTILITY(U,$J,1009.802,26,1,2,0)
 ;;=CLARE^^035^035
 ;;^UTILITY(U,$J,1009.802,26,1,4,0)
 ;;=GRAND TRAVERSE^^055^055
 ;;^UTILITY(U,$J,1009.802,26,1,5,0)
 ;;=MACOMB^^099^099

DMUFI009
DMUFI009 ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,26,1,6,0)
 ;;=ALCONA^^001
 ;;^UTILITY(U,$J,1009.802,26,1,7,0)
 ;;=GENESEE^^049
 ;;^UTILITY(U,$J,1009.802,26,1,8,0)
 ;;=MACKINAC^^097
 ;;^UTILITY(U,$J,1009.802,26,1,9,0)
 ;;=ALGER^^003
 ;;^UTILITY(U,$J,1009.802,26,1,10,0)
 ;;=GLADWIN^^051
 ;;^UTILITY(U,$J,1009.802,26,1,11,0)
 ;;=ALLEGAN^^005
 ;;^UTILITY(U,$J,1009.802,26,1,12,0)
 ;;=GOGEBIC^^053
 ;;^UTILITY(U,$J,1009.802,26,1,13,0)
 ;;=MANISTEE^^101
 ;;^UTILITY(U,$J,1009.802,26,1,14,0)
 ;;=ALPENA^^007
 ;;^UTILITY(U,$J,1009.802,26,1,15,0)
 ;;=MARQUETTE^^103
 ;;^UTILITY(U,$J,1009.802,26,1,16,0)
 ;;=ANTRIM^^009
 ;;^UTILITY(U,$J,1009.802,26,1,17,0)
 ;;=GRATIOT^^057
 ;;^UTILITY(U,$J,1009.802,26,1,18,0)
 ;;=MASON^^105
 ;;^UTILITY(U,$J,1009.802,26,1,19,0)
 ;;=ARENAC^^011
 ;;^UTILITY(U,$J,1009.802,26,1,20,0)
 ;;=HILLSDALE^^059
 ;;^UTILITY(U,$J,1009.802,26,1,21,0)
 ;;=MECOSTA^^107
 ;;^UTILITY(U,$J,1009.802,26,1,22,0)
 ;;=BARAGA^^013
 ;;^UTILITY(U,$J,1009.802,26,1,23,0)
 ;;=HOUGHTON^^061
 ;;^UTILITY(U,$J,1009.802,26,1,24,0)
 ;;=MENOMINEE^^109
 ;;^UTILITY(U,$J,1009.802,26,1,25,0)
 ;;=BARRY^^015
 ;;^UTILITY(U,$J,1009.802,26,1,26,0)
 ;;=HURON^^063
 ;;^UTILITY(U,$J,1009.802,26,1,27,0)
 ;;=MIDLAND^^111
 ;;^UTILITY(U,$J,1009.802,26,1,28,0)
 ;;=BAY^^017
 ;;^UTILITY(U,$J,1009.802,26,1,29,0)
 ;;=INGHAM^^065
 ;;^UTILITY(U,$J,1009.802,26,1,30,0)
 ;;=MISSAUKEE^^113
 ;;^UTILITY(U,$J,1009.802,26,1,31,0)
 ;;=BENZIE^^019
 ;;^UTILITY(U,$J,1009.802,26,1,32,0)
 ;;=IONIA^^067
 ;;^UTILITY(U,$J,1009.802,26,1,33,0)
 ;;=MONROE^^115
 ;;^UTILITY(U,$J,1009.802,26,1,34,0)
 ;;=BERRIEN^^021
 ;;^UTILITY(U,$J,1009.802,26,1,35,0)
 ;;=IOSCO^^069
 ;;^UTILITY(U,$J,1009.802,26,1,36,0)
 ;;=MONTCALM^^117
 ;;^UTILITY(U,$J,1009.802,26,1,37,0)
 ;;=BRANCH^^023
 ;;^UTILITY(U,$J,1009.802,26,1,38,0)
 ;;=IRON^^071
 ;;^UTILITY(U,$J,1009.802,26,1,39,0)
 ;;=MONTMORENCY^^119
 ;;^UTILITY(U,$J,1009.802,26,1,40,0)
 ;;=CALHOUN^^025
 ;;^UTILITY(U,$J,1009.802,26,1,41,0)
 ;;=ISABELLA^^073
 ;;^UTILITY(U,$J,1009.802,26,1,42,0)
 ;;=MUSKEGON^^121
 ;;^UTILITY(U,$J,1009.802,26,1,43,0)
 ;;=CASS^^027
 ;;^UTILITY(U,$J,1009.802,26,1,44,0)
 ;;=JACKSON^^075
 ;;^UTILITY(U,$J,1009.802,26,1,45,0)
 ;;=NEWAYGO^^123
 ;;^UTILITY(U,$J,1009.802,26,1,46,0)
 ;;=CHARLEVOIX^^029
 ;;^UTILITY(U,$J,1009.802,26,1,47,0)
 ;;=KALAMAZOO^^077
 ;;^UTILITY(U,$J,1009.802,26,1,48,0)
 ;;=OAKLAND^^125
 ;;^UTILITY(U,$J,1009.802,26,1,49,0)
 ;;=CHEBOYGAN^^031
 ;;^UTILITY(U,$J,1009.802,26,1,50,0)
 ;;=KALKASKA^^079
 ;;^UTILITY(U,$J,1009.802,26,1,51,0)
 ;;=OCEANA^^127
 ;;^UTILITY(U,$J,1009.802,26,1,52,0)
 ;;=KENT^^081
 ;;^UTILITY(U,$J,1009.802,26,1,53,0)
 ;;=OGEMAW^^129
 ;;^UTILITY(U,$J,1009.802,26,1,54,0)
 ;;=KEWEENAW^^083
 ;;^UTILITY(U,$J,1009.802,26,1,55,0)
 ;;=ONTONAGON^^131
 ;;^UTILITY(U,$J,1009.802,26,1,56,0)
 ;;=CLINTON^^037
 ;;^UTILITY(U,$J,1009.802,26,1,57,0)
 ;;=LAKE^^085
 ;;^UTILITY(U,$J,1009.802,26,1,58,0)
 ;;=OSCEOLA^^133
 ;;^UTILITY(U,$J,1009.802,26,1,59,0)
 ;;=CRAWFORD^^039
 ;;^UTILITY(U,$J,1009.802,26,1,60,0)
 ;;=LAPEER^^087
 ;;^UTILITY(U,$J,1009.802,26,1,61,0)
 ;;=OSCODA^^135
 ;;^UTILITY(U,$J,1009.802,26,1,62,0)
 ;;=DELTA^^041
 ;;^UTILITY(U,$J,1009.802,26,1,63,0)
 ;;=LEELANAU^^089
 ;;^UTILITY(U,$J,1009.802,26,1,64,0)
 ;;=OTSEGO^^137
 ;;^UTILITY(U,$J,1009.802,26,1,65,0)
 ;;=LENAWEE^^091
 ;;^UTILITY(U,$J,1009.802,26,1,66,0)
 ;;=DICKINSON^^043
 ;;^UTILITY(U,$J,1009.802,26,1,67,0)
 ;;=OTTAWA^^139
 ;;^UTILITY(U,$J,1009.802,26,1,68,0)
 ;;=EATON^^045
 ;;^UTILITY(U,$J,1009.802,26,1,69,0)
 ;;=LIVINGSTON^^093
 ;;^UTILITY(U,$J,1009.802,26,1,70,0)
 ;;=PRESQUE ISLE^^141
 ;;^UTILITY(U,$J,1009.802,26,1,71,0)
 ;;=EMMET^^047
 ;;^UTILITY(U,$J,1009.802,26,1,72,0)
 ;;=LUCE^^095
 ;;^UTILITY(U,$J,1009.802,26,1,73,0)
 ;;=ROSCOMMON^^143
 ;;^UTILITY(U,$J,1009.802,26,1,74,0)
 ;;=SAGINAW^^145
 ;;^UTILITY(U,$J,1009.802,26,1,75,0)
 ;;=SCHOOLCRAFT^^153
 ;;^UTILITY(U,$J,1009.802,26,1,76,0)
 ;;=WASHTENAW^^161
 ;;^UTILITY(U,$J,1009.802,26,1,77,0)
 ;;=ST. CLAIR^^147
 ;;^UTILITY(U,$J,1009.802,26,1,78,0)
 ;;=SHIAWASSEE^^155
 ;;^UTILITY(U,$J,1009.802,26,1,79,0)
 ;;=WAYNE^^163
 ;;^UTILITY(U,$J,1009.802,26,1,80,0)
 ;;=ST. JOSEPH^^149
 ;;^UTILITY(U,$J,1009.802,26,1,81,0)
 ;;=TUSCOLA^^157
 ;;^UTILITY(U,$J,1009.802,26,1,82,0)
 ;;=WEXFORD^^165
 ;;^UTILITY(U,$J,1009.802,26,1,83,0)
 ;;=SANILAC^^151
 ;;^UTILITY(U,$J,1009.802,26,1,84,0)
 ;;=VAN BUREN^^159
 ;;^UTILITY(U,$J,1009.802,27,0)
 ;;=MINNESOTA^MN^27^^1^1
 ;;^UTILITY(U,$J,1009.802,27,1,0)
 ;;=^1009.812I^88^87
 ;;^UTILITY(U,$J,1009.802,27,1,2,0)
 ;;=AITKIN^^001
 ;;^UTILITY(U,$J,1009.802,27,1,3,0)
 ;;=ITASCA^^061
 ;;^UTILITY(U,$J,1009.802,27,1,4,0)
 ;;=PIPESTONE^^117
 ;;^UTILITY(U,$J,1009.802,27,1,5,0)
 ;;=ANOKA^^003
 ;;^UTILITY(U,$J,1009.802,27,1,6,0)
 ;;=JACKSON^^063
 ;;^UTILITY(U,$J,1009.802,27,1,7,0)
 ;;=POLK^^119
 ;;^UTILITY(U,$J,1009.802,27,1,8,0)
 ;;=BECKER^^005
 ;;^UTILITY(U,$J,1009.802,27,1,9,0)
 ;;=KANABEC^^065
 ;;^UTILITY(U,$J,1009.802,27,1,10,0)
 ;;=POPE^^121
 ;;^UTILITY(U,$J,1009.802,27,1,11,0)
 ;;=BELTRAMI^^007
 ;;^UTILITY(U,$J,1009.802,27,1,12,0)
 ;;=KANDIYOHI^^067
 ;;^UTILITY(U,$J,1009.802,27,1,13,0)
 ;;=RAMSEY^^123
 ;;^UTILITY(U,$J,1009.802,27,1,14,0)
 ;;=BENTON^^009
 ;;^UTILITY(U,$J,1009.802,27,1,15,0)
 ;;=KITTSON^^069
 ;;^UTILITY(U,$J,1009.802,27,1,16,0)
 ;;=RED LAKE^^125
 ;;^UTILITY(U,$J,1009.802,27,1,17,0)
 ;;=BIG STONE^^011
 ;;^UTILITY(U,$J,1009.802,27,1,18,0)
 ;;=KOOCHICHING^^071
 ;;^UTILITY(U,$J,1009.802,27,1,19,0)
 ;;=REDWOOD^^127
 ;;^UTILITY(U,$J,1009.802,27,1,20,0)
 ;;=BLUE EARTH^^013
 ;;^UTILITY(U,$J,1009.802,27,1,21,0)
 ;;=LAC QUI PARLE^^073
 ;;^UTILITY(U,$J,1009.802,27,1,22,0)
 ;;=RENVILLE^^129
 ;;^UTILITY(U,$J,1009.802,27,1,23,0)
 ;;=BROWN^^015
 ;;^UTILITY(U,$J,1009.802,27,1,24,0)
 ;;=LAKE^^075
 ;;^UTILITY(U,$J,1009.802,27,1,25,0)
 ;;=RICE^^131
 ;;^UTILITY(U,$J,1009.802,27,1,26,0)
 ;;=CARLTON^^017
 ;;^UTILITY(U,$J,1009.802,27,1,27,0)
 ;;=LAKE OF THE WOODS^^077
 ;;^UTILITY(U,$J,1009.802,27,1,28,0)
 ;;=CARVER^^019
 ;;^UTILITY(U,$J,1009.802,27,1,29,0)
 ;;=ROCK^^133
 ;;^UTILITY(U,$J,1009.802,27,1,30,0)
 ;;=ROSEAU^^135
 ;;^UTILITY(U,$J,1009.802,27,1,31,0)
 ;;=CASS^^021
 ;;^UTILITY(U,$J,1009.802,27,1,32,0)
 ;;=LE SUEUR^^079
 ;;^UTILITY(U,$J,1009.802,27,1,33,0)
 ;;=ST. LOUIS^^137
 ;;^UTILITY(U,$J,1009.802,27,1,34,0)
 ;;=CHIPPEWA^^023
 ;;^UTILITY(U,$J,1009.802,27,1,35,0)
 ;;=LINCOLN^^081
 ;;^UTILITY(U,$J,1009.802,27,1,36,0)
 ;;=SCOTT^^139
 ;;^UTILITY(U,$J,1009.802,27,1,37,0)
 ;;=CHISAGO^^025
 ;;^UTILITY(U,$J,1009.802,27,1,38,0)
 ;;=LYON^^083
 ;;^UTILITY(U,$J,1009.802,27,1,39,0)
 ;;=SHERBURNE^^141
 ;;^UTILITY(U,$J,1009.802,27,1,40,0)
 ;;=CLAY^^027
 ;;^UTILITY(U,$J,1009.802,27,1,41,0)
 ;;=MCLEOD^^085
 ;;^UTILITY(U,$J,1009.802,27,1,42,0)
 ;;=SIBLEY^^143
 ;;^UTILITY(U,$J,1009.802,27,1,43,0)
 ;;=CLEARWATER^^029
 ;;^UTILITY(U,$J,1009.802,27,1,44,0)
 ;;=MAHNOMEN^^087
 ;;^UTILITY(U,$J,1009.802,27,1,45,0)
 ;;=STEARNS^^145
 ;;^UTILITY(U,$J,1009.802,27,1,46,0)
 ;;=COOK^^031
 ;;^UTILITY(U,$J,1009.802,27,1,47,0)
 ;;=MARSHALL^^089
 ;;^UTILITY(U,$J,1009.802,27,1,48,0)
 ;;=STEELE^^147
 ;;^UTILITY(U,$J,1009.802,27,1,49,0)
 ;;=COTTONWOOD^^033
 ;;^UTILITY(U,$J,1009.802,27,1,50,0)
 ;;=MARTIN^^091
 ;;^UTILITY(U,$J,1009.802,27,1,51,0)
 ;;=STEVENS^^149
 ;;^UTILITY(U,$J,1009.802,27,1,52,0)
 ;;=CROW WING^^035
 ;;^UTILITY(U,$J,1009.802,27,1,53,0)
 ;;=MEEKER^^093
 ;;^UTILITY(U,$J,1009.802,27,1,54,0)
 ;;=SWIFT^^151
 ;;^UTILITY(U,$J,1009.802,27,1,55,0)
 ;;=DAKOTA^^037
 ;;^UTILITY(U,$J,1009.802,27,1,56,0)
 ;;=MILLE LACS^^095
 ;;^UTILITY(U,$J,1009.802,27,1,57,0)
 ;;=TODD^^153
 ;;^UTILITY(U,$J,1009.802,27,1,58,0)
 ;;=DODGE^^039
 ;;^UTILITY(U,$J,1009.802,27,1,59,0)
 ;;=MORRISON^^097
 ;;^UTILITY(U,$J,1009.802,27,1,60,0)
 ;;=TRAVERSE^^155
 ;;^UTILITY(U,$J,1009.802,27,1,61,0)
 ;;=DOUGLAS^^041
 ;;^UTILITY(U,$J,1009.802,27,1,62,0)
 ;;=MOWER^^099
 ;;^UTILITY(U,$J,1009.802,27,1,63,0)
 ;;=WABASHA^^157
 ;;^UTILITY(U,$J,1009.802,27,1,64,0)
 ;;=FARIBAULT^^043
 ;;^UTILITY(U,$J,1009.802,27,1,65,0)
 ;;=MURRAY^^101
 ;;^UTILITY(U,$J,1009.802,27,1,66,0)
 ;;=WADENA^^159
 ;;^UTILITY(U,$J,1009.802,27,1,67,0)
 ;;=FILLMORE^^045
 ;;^UTILITY(U,$J,1009.802,27,1,68,0)
 ;;=NICOLLET^^103
 ;;^UTILITY(U,$J,1009.802,27,1,69,0)
 ;;=WASECA^^161
 ;;^UTILITY(U,$J,1009.802,27,1,70,0)
 ;;=FREEBORN^^047
 ;;^UTILITY(U,$J,1009.802,27,1,71,0)
 ;;=NOBLES^^105
 ;;^UTILITY(U,$J,1009.802,27,1,72,0)
 ;;=WASHINGTON^^163
 ;;^UTILITY(U,$J,1009.802,27,1,73,0)
 ;;=GOODHUE^^049
 ;;^UTILITY(U,$J,1009.802,27,1,74,0)
 ;;=NORMAN^^107
 ;;^UTILITY(U,$J,1009.802,27,1,75,0)
 ;;=WATONWAN^^165
 ;;^UTILITY(U,$J,1009.802,27,1,76,0)
 ;;=GRANT^^051
 ;;^UTILITY(U,$J,1009.802,27,1,77,0)
 ;;=OLMSTED^^109
 ;;^UTILITY(U,$J,1009.802,27,1,78,0)
 ;;=WILKIN^^167
 ;;^UTILITY(U,$J,1009.802,27,1,79,0)
 ;;=HENNEPIN^^053
 ;;^UTILITY(U,$J,1009.802,27,1,80,0)
 ;;=OTTER TAIL^^111
 ;;^UTILITY(U,$J,1009.802,27,1,81,0)
 ;;=WINONA^^169
 ;;^UTILITY(U,$J,1009.802,27,1,82,0)
 ;;=HOUSTON^^055
 ;;^UTILITY(U,$J,1009.802,27,1,83,0)
 ;;=PENNINGTON^^113
 ;;^UTILITY(U,$J,1009.802,27,1,84,0)
 ;;=WRIGHT^^171
 ;;^UTILITY(U,$J,1009.802,27,1,85,0)
 ;;=HUBBARD^^057
 ;;^UTILITY(U,$J,1009.802,27,1,86,0)
 ;;=PINE^^115
 ;;^UTILITY(U,$J,1009.802,27,1,87,0)
 ;;=YELLOW MEDICINE^^173
 ;;^UTILITY(U,$J,1009.802,27,1,88,0)
 ;;=ISANTI^^059
 ;;^UTILITY(U,$J,1009.802,28,0)
 ;;=MISSISSIPPI^MS^28^^1^1
 ;;^UTILITY(U,$J,1009.802,28,1,0)
 ;;=^1009.812I^83^82
 ;;^UTILITY(U,$J,1009.802,28,1,1,0)
 ;;=COAHOMA^^027^027
 ;;^UTILITY(U,$J,1009.802,28,1,2,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,28,1,3,0)
 ;;=CHICKASAW^^017
 ;;^UTILITY(U,$J,1009.802,28,1,4,0)
 ;;=DESOTO^^033
 ;;^UTILITY(U,$J,1009.802,28,1,5,0)
 ;;=ALCORN^^003
 ;;^UTILITY(U,$J,1009.802,28,1,6,0)
 ;;=CHOCTAW^^019
 ;;^UTILITY(U,$J,1009.802,28,1,7,0)
 ;;=FORREST^^035
 ;;^UTILITY(U,$J,1009.802,28,1,9,0)
 ;;=CLAIBORNE^^021
 ;;^UTILITY(U,$J,1009.802,28,1,10,0)
 ;;=FRANKLIN^^037
 ;;^UTILITY(U,$J,1009.802,28,1,11,0)
 ;;=ATTALA^^007
 ;;^UTILITY(U,$J,1009.802,28,1,12,0)
 ;;=CLARKE^^023
 ;;^UTILITY(U,$J,1009.802,28,1,13,0)
 ;;=GEORGE^^039
 ;;^UTILITY(U,$J,1009.802,28,1,14,0)
 ;;=BENTON^^009
 ;;^UTILITY(U,$J,1009.802,28,1,15,0)
 ;;=CLAY^^025
 ;;^UTILITY(U,$J,1009.802,28,1,16,0)
 ;;=GREENE^^041
 ;;^UTILITY(U,$J,1009.802,28,1,17,0)
 ;;=BOLIVAR^^011
 ;;^UTILITY(U,$J,1009.802,28,1,18,0)
 ;;=GRENADA^^043
 ;;^UTILITY(U,$J,1009.802,28,1,19,0)
 ;;=CALHOUN^^013
 ;;^UTILITY(U,$J,1009.802,28,1,20,0)
 ;;=COPIAH^^029
 ;;^UTILITY(U,$J,1009.802,28,1,21,0)
 ;;=HANCOCK^^045
 ;;^UTILITY(U,$J,1009.802,28,1,22,0)
 ;;=CARROLL^^015
 ;;^UTILITY(U,$J,1009.802,28,1,23,0)
 ;;=COVINGTON^^031
 ;;^UTILITY(U,$J,1009.802,28,1,24,0)
 ;;=HARRISON^^047
 ;;^UTILITY(U,$J,1009.802,28,1,25,0)
 ;;=HINDS^^049
 ;;^UTILITY(U,$J,1009.802,28,1,26,0)
 ;;=MADISON^^089
 ;;^UTILITY(U,$J,1009.802,28,1,27,0)
 ;;=SIMPSON^^127
 ;;^UTILITY(U,$J,1009.802,28,1,28,0)
 ;;=HOLMES^^051
 ;;^UTILITY(U,$J,1009.802,28,1,29,0)
 ;;=MARION^^091
 ;;^UTILITY(U,$J,1009.802,28,1,30,0)
 ;;=SMITH^^129
 ;;^UTILITY(U,$J,1009.802,28,1,31,0)
 ;;=HUMPHREYS^^053
 ;;^UTILITY(U,$J,1009.802,28,1,32,0)
 ;;=MARSHALL^^093
 ;;^UTILITY(U,$J,1009.802,28,1,33,0)
 ;;=STONE^^131
 ;;^UTILITY(U,$J,1009.802,28,1,34,0)
 ;;=ISSAQUENA^^055
 ;;^UTILITY(U,$J,1009.802,28,1,35,0)
 ;;=MONROE^^095
 ;;^UTILITY(U,$J,1009.802,28,1,36,0)
 ;;=SUNFLOWER^^133
 ;;^UTILITY(U,$J,1009.802,28,1,37,0)
 ;;=ITAWAMBA^^057
 ;;^UTILITY(U,$J,1009.802,28,1,38,0)
 ;;=MONTGOMERY^^097
 ;;^UTILITY(U,$J,1009.802,28,1,39,0)
 ;;=TALLAHATCHIE^^135
 ;;^UTILITY(U,$J,1009.802,28,1,40,0)
 ;;=JACKSON^^059
 ;;^UTILITY(U,$J,1009.802,28,1,41,0)
 ;;=NESHOBA^^099
 ;;^UTILITY(U,$J,1009.802,28,1,42,0)
 ;;=TATE^^137
 ;;^UTILITY(U,$J,1009.802,28,1,43,0)
 ;;=JASPER^^061
 ;;^UTILITY(U,$J,1009.802,28,1,44,0)
 ;;=NEWTON^^101
 ;;^UTILITY(U,$J,1009.802,28,1,45,0)
 ;;=TIPPAH^^139
 ;;^UTILITY(U,$J,1009.802,28,1,46,0)
 ;;=JEFFERSON^^063
 ;;^UTILITY(U,$J,1009.802,28,1,47,0)
 ;;=NOXUBEE^^103
 ;;^UTILITY(U,$J,1009.802,28,1,48,0)
 ;;=TISHOMINGO^^141
 ;;^UTILITY(U,$J,1009.802,28,1,49,0)
 ;;=JEFFERSON DAVIS^^065
 ;;^UTILITY(U,$J,1009.802,28,1,50,0)
 ;;=OKTIBBEHA^^105
 ;;^UTILITY(U,$J,1009.802,28,1,51,0)
 ;;=TUNICA^^143
 ;;^UTILITY(U,$J,1009.802,28,1,52,0)
 ;;=JONES^^067
 ;;^UTILITY(U,$J,1009.802,28,1,53,0)
 ;;=PANOLA^^107
 ;;^UTILITY(U,$J,1009.802,28,1,54,0)
 ;;=UNION^^145
 ;;^UTILITY(U,$J,1009.802,28,1,55,0)
 ;;=KEMPER^^069
 ;;^UTILITY(U,$J,1009.802,28,1,56,0)
 ;;=PEARL RIVER^^109
 ;;^UTILITY(U,$J,1009.802,28,1,57,0)
 ;;=WALTHALL^^147
 ;;^UTILITY(U,$J,1009.802,28,1,58,0)
 ;;=LAFAYETTE^^071
 ;;^UTILITY(U,$J,1009.802,28,1,59,0)
 ;;=PERRY^^111
 ;;^UTILITY(U,$J,1009.802,28,1,60,0)
 ;;=WARREN^^149
 ;;^UTILITY(U,$J,1009.802,28,1,61,0)
 ;;=LAMAR^^073
 ;;^UTILITY(U,$J,1009.802,28,1,62,0)
 ;;=PIKE^^113
 ;;^UTILITY(U,$J,1009.802,28,1,63,0)
 ;;=WASHINGTON^^151
 ;;^UTILITY(U,$J,1009.802,28,1,64,0)
 ;;=LAUDERDALE^^075
 ;;^UTILITY(U,$J,1009.802,28,1,65,0)
 ;;=PONTOTOC^^115
 ;;^UTILITY(U,$J,1009.802,28,1,66,0)
 ;;=WAYNE^^153
 ;;^UTILITY(U,$J,1009.802,28,1,67,0)
 ;;=LAWRENCE^^077
 ;;^UTILITY(U,$J,1009.802,28,1,68,0)
 ;;=PRENTISS^^117
 ;;^UTILITY(U,$J,1009.802,28,1,69,0)
 ;;=WEBSTER^^155
 ;;^UTILITY(U,$J,1009.802,28,1,70,0)
 ;;=LEAKE^^079
 ;;^UTILITY(U,$J,1009.802,28,1,71,0)
 ;;=QUITMAN^^119
 ;;^UTILITY(U,$J,1009.802,28,1,72,0)
 ;;=WILKINSON^^157
 ;;^UTILITY(U,$J,1009.802,28,1,73,0)
 ;;=LEE^^081
 ;;^UTILITY(U,$J,1009.802,28,1,74,0)
 ;;=RANKIN^^121
 ;;^UTILITY(U,$J,1009.802,28,1,75,0)
 ;;=WINSTON^^159
 ;;^UTILITY(U,$J,1009.802,28,1,76,0)
 ;;=LEFLORE^^083
 ;;^UTILITY(U,$J,1009.802,28,1,77,0)
 ;;=SCOTT^^123
 ;;^UTILITY(U,$J,1009.802,28,1,78,0)
 ;;=YALOBUSHA^^161
 ;;^UTILITY(U,$J,1009.802,28,1,79,0)
 ;;=LINCOLN^^085
 ;;^UTILITY(U,$J,1009.802,28,1,80,0)
 ;;=SHARKEY^^125
 ;;^UTILITY(U,$J,1009.802,28,1,81,0)
 ;;=YAZOO^^163
 ;;^UTILITY(U,$J,1009.802,28,1,82,0)
 ;;=LOWNDES^^087
 ;;^UTILITY(U,$J,1009.802,28,1,83,0)
 ;;=AMITE^^005
 ;;^UTILITY(U,$J,1009.802,29,0)
 ;;=MISSOURI^MO^29^^1^1
 ;;^UTILITY(U,$J,1009.802,29,1,0)
 ;;=^1009.812I^116^115
 ;;^UTILITY(U,$J,1009.802,29,1,1,0)
 ;;=MCDONALD^^119^119
 ;;^UTILITY(U,$J,1009.802,29,1,2,0)
 ;;=NODAWAY^^147^147
 ;;^UTILITY(U,$J,1009.802,29,1,3,0)
 ;;=PHELPS^^161^161
 ;;^UTILITY(U,$J,1009.802,29,1,5,0)
 ;;=COLE^^051^051
 ;;^UTILITY(U,$J,1009.802,29,1,6,0)
 ;;=BOONE^^019^019

DMUFI00A
DMUFI00A ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,29,1,7,0)
 ;;=JASPER^^097^097
 ;;^UTILITY(U,$J,1009.802,29,1,8,0)
 ;;=RIPLEY^^181^181
 ;;^UTILITY(U,$J,1009.802,29,1,9,0)
 ;;=BARRY^^009^009
 ;;^UTILITY(U,$J,1009.802,29,1,10,0)
 ;;=JEFFERSON^^099^099
 ;;^UTILITY(U,$J,1009.802,29,1,11,0)
 ;;=GREENE^^077^077
 ;;^UTILITY(U,$J,1009.802,29,1,12,0)
 ;;=JACKSON^^095^095
 ;;^UTILITY(U,$J,1009.802,29,1,13,0)
 ;;=ADAIR^^001
 ;;^UTILITY(U,$J,1009.802,29,1,14,0)
 ;;=ANDREW^^003
 ;;^UTILITY(U,$J,1009.802,29,1,15,0)
 ;;=ATCHISON^^005
 ;;^UTILITY(U,$J,1009.802,29,1,16,0)
 ;;=AUDRAIN^^007
 ;;^UTILITY(U,$J,1009.802,29,1,17,0)
 ;;=BARTON^^011
 ;;^UTILITY(U,$J,1009.802,29,1,18,0)
 ;;=BATES^^013
 ;;^UTILITY(U,$J,1009.802,29,1,19,0)
 ;;=BENTON^^015
 ;;^UTILITY(U,$J,1009.802,29,1,20,0)
 ;;=BOLLINGER^^017
 ;;^UTILITY(U,$J,1009.802,29,1,21,0)
 ;;=BUCHANAN^^021
 ;;^UTILITY(U,$J,1009.802,29,1,22,0)
 ;;=BUTLER^^023
 ;;^UTILITY(U,$J,1009.802,29,1,23,0)
 ;;=CALDWELL^^025
 ;;^UTILITY(U,$J,1009.802,29,1,24,0)
 ;;=CALLAWAY^^027
 ;;^UTILITY(U,$J,1009.802,29,1,25,0)
 ;;=CAMDEN^^029
 ;;^UTILITY(U,$J,1009.802,29,1,26,0)
 ;;=CAPE GIRARDEAU^^031
 ;;^UTILITY(U,$J,1009.802,29,1,27,0)
 ;;=CARROLL^^033
 ;;^UTILITY(U,$J,1009.802,29,1,28,0)
 ;;=CARTER^^035
 ;;^UTILITY(U,$J,1009.802,29,1,29,0)
 ;;=CASS^^037
 ;;^UTILITY(U,$J,1009.802,29,1,30,0)
 ;;=CEDAR^^039
 ;;^UTILITY(U,$J,1009.802,29,1,31,0)
 ;;=CHARITON^^041
 ;;^UTILITY(U,$J,1009.802,29,1,32,0)
 ;;=CHRISTIAN^^043
 ;;^UTILITY(U,$J,1009.802,29,1,33,0)
 ;;=CLARK^^045
 ;;^UTILITY(U,$J,1009.802,29,1,34,0)
 ;;=CLAY^^047
 ;;^UTILITY(U,$J,1009.802,29,1,35,0)
 ;;=CLINTON^^049
 ;;^UTILITY(U,$J,1009.802,29,1,36,0)
 ;;=JOHNSON^^101
 ;;^UTILITY(U,$J,1009.802,29,1,37,0)
 ;;=COOPER^^053
 ;;^UTILITY(U,$J,1009.802,29,1,38,0)
 ;;=KNOX^^103
 ;;^UTILITY(U,$J,1009.802,29,1,39,0)
 ;;=CRAWFORD^^055
 ;;^UTILITY(U,$J,1009.802,29,1,40,0)
 ;;=LACLEDE^^105
 ;;^UTILITY(U,$J,1009.802,29,1,41,0)
 ;;=DADE^^057
 ;;^UTILITY(U,$J,1009.802,29,1,42,0)
 ;;=LAFAYETTE^^107
 ;;^UTILITY(U,$J,1009.802,29,1,43,0)
 ;;=DALLAS^^059
 ;;^UTILITY(U,$J,1009.802,29,1,44,0)
 ;;=LAWRENCE^^109
 ;;^UTILITY(U,$J,1009.802,29,1,45,0)
 ;;=DAVIESS^^061
 ;;^UTILITY(U,$J,1009.802,29,1,46,0)
 ;;=LEWIS^^111
 ;;^UTILITY(U,$J,1009.802,29,1,47,0)
 ;;=DEKALB^^063
 ;;^UTILITY(U,$J,1009.802,29,1,48,0)
 ;;=LINCOLN^^113
 ;;^UTILITY(U,$J,1009.802,29,1,49,0)
 ;;=DENT^^065
 ;;^UTILITY(U,$J,1009.802,29,1,50,0)
 ;;=LINN^^115
 ;;^UTILITY(U,$J,1009.802,29,1,51,0)
 ;;=DOUGLAS^^067
 ;;^UTILITY(U,$J,1009.802,29,1,52,0)
 ;;=LIVINGSTON^^117
 ;;^UTILITY(U,$J,1009.802,29,1,53,0)
 ;;=DUNKLIN^^069
 ;;^UTILITY(U,$J,1009.802,29,1,54,0)
 ;;=FRANKLIN^^071
 ;;^UTILITY(U,$J,1009.802,29,1,55,0)
 ;;=MACON^^121
 ;;^UTILITY(U,$J,1009.802,29,1,56,0)
 ;;=GASCONADE^^073
 ;;^UTILITY(U,$J,1009.802,29,1,57,0)
 ;;=MADISON^^123
 ;;^UTILITY(U,$J,1009.802,29,1,58,0)
 ;;=GENTRY^^075
 ;;^UTILITY(U,$J,1009.802,29,1,59,0)
 ;;=MARIES^^125
 ;;^UTILITY(U,$J,1009.802,29,1,60,0)
 ;;=MARION^^127
 ;;^UTILITY(U,$J,1009.802,29,1,61,0)
 ;;=GRUNDY^^079
 ;;^UTILITY(U,$J,1009.802,29,1,62,0)
 ;;=MERCER^^129
 ;;^UTILITY(U,$J,1009.802,29,1,63,0)
 ;;=HARRISON^^081
 ;;^UTILITY(U,$J,1009.802,29,1,64,0)
 ;;=MILLER^^131
 ;;^UTILITY(U,$J,1009.802,29,1,65,0)
 ;;=HENRY^^083
 ;;^UTILITY(U,$J,1009.802,29,1,66,0)
 ;;=MISSISSIPPI^^133
 ;;^UTILITY(U,$J,1009.802,29,1,67,0)
 ;;=HICKORY^^085
 ;;^UTILITY(U,$J,1009.802,29,1,68,0)
 ;;=MONITEAU^^135
 ;;^UTILITY(U,$J,1009.802,29,1,69,0)
 ;;=HOLT^^087
 ;;^UTILITY(U,$J,1009.802,29,1,70,0)
 ;;=MONROE^^137
 ;;^UTILITY(U,$J,1009.802,29,1,71,0)
 ;;=HOWARD^^089
 ;;^UTILITY(U,$J,1009.802,29,1,72,0)
 ;;=MONTGOMERY^^139
 ;;^UTILITY(U,$J,1009.802,29,1,73,0)
 ;;=HOWELL^^091
 ;;^UTILITY(U,$J,1009.802,29,1,74,0)
 ;;=MORGAN^^141
 ;;^UTILITY(U,$J,1009.802,29,1,75,0)
 ;;=IRON^^093
 ;;^UTILITY(U,$J,1009.802,29,1,76,0)
 ;;=NEW MADRID^^143
 ;;^UTILITY(U,$J,1009.802,29,1,77,0)
 ;;=NEWTON^^145
 ;;^UTILITY(U,$J,1009.802,29,1,78,0)
 ;;=OREGON^^149
 ;;^UTILITY(U,$J,1009.802,29,1,79,0)
 ;;=RAY^^177
 ;;^UTILITY(U,$J,1009.802,29,1,80,0)
 ;;=SHELBY^^205
 ;;^UTILITY(U,$J,1009.802,29,1,81,0)
 ;;=OSAGE^^151
 ;;^UTILITY(U,$J,1009.802,29,1,82,0)
 ;;=REYNOLDS^^179
 ;;^UTILITY(U,$J,1009.802,29,1,83,0)
 ;;=STODDARD^^207
 ;;^UTILITY(U,$J,1009.802,29,1,84,0)
 ;;=OZARK^^153
 ;;^UTILITY(U,$J,1009.802,29,1,85,0)
 ;;=STONE^^209
 ;;^UTILITY(U,$J,1009.802,29,1,86,0)
 ;;=PEMISCOT^^155
 ;;^UTILITY(U,$J,1009.802,29,1,87,0)
 ;;=ST. CHARLES^^183
 ;;^UTILITY(U,$J,1009.802,29,1,88,0)
 ;;=SULLIVAN^^211
 ;;^UTILITY(U,$J,1009.802,29,1,89,0)
 ;;=PERRY^^157
 ;;^UTILITY(U,$J,1009.802,29,1,90,0)
 ;;=ST. CLAIR^^185
 ;;^UTILITY(U,$J,1009.802,29,1,91,0)
 ;;=TANEY^^213
 ;;^UTILITY(U,$J,1009.802,29,1,92,0)
 ;;=PETTIS^^159
 ;;^UTILITY(U,$J,1009.802,29,1,93,0)
 ;;=ST. FRANCOIS^^187
 ;;^UTILITY(U,$J,1009.802,29,1,94,0)
 ;;=TEXAS^^215
 ;;^UTILITY(U,$J,1009.802,29,1,95,0)
 ;;=ST. LOUIS^^189
 ;;^UTILITY(U,$J,1009.802,29,1,96,0)
 ;;=VERNON^^217
 ;;^UTILITY(U,$J,1009.802,29,1,97,0)
 ;;=PIKE^^163
 ;;^UTILITY(U,$J,1009.802,29,1,98,0)
 ;;=ST. GENEVIEVE^^186
 ;;^UTILITY(U,$J,1009.802,29,1,99,0)
 ;;=WARREN^^219
 ;;^UTILITY(U,$J,1009.802,29,1,100,0)
 ;;=PLATTE^^165
 ;;^UTILITY(U,$J,1009.802,29,1,101,0)
 ;;=SALINE^^195
 ;;^UTILITY(U,$J,1009.802,29,1,102,0)
 ;;=WASHINGTON^^221
 ;;^UTILITY(U,$J,1009.802,29,1,103,0)
 ;;=POLK^^167
 ;;^UTILITY(U,$J,1009.802,29,1,104,0)
 ;;=SCHUYLER^^197
 ;;^UTILITY(U,$J,1009.802,29,1,105,0)
 ;;=WAYNE^^223
 ;;^UTILITY(U,$J,1009.802,29,1,106,0)
 ;;=PULASKI^^169
 ;;^UTILITY(U,$J,1009.802,29,1,107,0)
 ;;=SCOTLAND^^199
 ;;^UTILITY(U,$J,1009.802,29,1,108,0)
 ;;=WEBSTER^^225
 ;;^UTILITY(U,$J,1009.802,29,1,109,0)
 ;;=PUTNAM^^171
 ;;^UTILITY(U,$J,1009.802,29,1,110,0)
 ;;=SCOTT^^201
 ;;^UTILITY(U,$J,1009.802,29,1,111,0)
 ;;=WORTH^^227
 ;;^UTILITY(U,$J,1009.802,29,1,112,0)
 ;;=RALLS^^173
 ;;^UTILITY(U,$J,1009.802,29,1,113,0)
 ;;=SHANNON^^203
 ;;^UTILITY(U,$J,1009.802,29,1,114,0)
 ;;=WRIGHT^^229
 ;;^UTILITY(U,$J,1009.802,29,1,115,0)
 ;;=RANDOLPH^^175
 ;;^UTILITY(U,$J,1009.802,29,1,116,0)
 ;;=ST. LOUIS (CITY)^^510
 ;;^UTILITY(U,$J,1009.802,30,0)
 ;;=MONTANA^MT^30^^1^1
 ;;^UTILITY(U,$J,1009.802,30,1,0)
 ;;=^1009.812I^57^57
 ;;^UTILITY(U,$J,1009.802,30,1,1,0)
 ;;=CUSTER^^017^017
 ;;^UTILITY(U,$J,1009.802,30,1,2,0)
 ;;=BEAVERHEAD^^001
 ;;^UTILITY(U,$J,1009.802,30,1,3,0)
 ;;=HILL^^041
 ;;^UTILITY(U,$J,1009.802,30,1,4,0)
 ;;=PRAIRIE^^079
 ;;^UTILITY(U,$J,1009.802,30,1,5,0)
 ;;=BIG HORN^^003
 ;;^UTILITY(U,$J,1009.802,30,1,6,0)
 ;;=JEFFERSON^^043
 ;;^UTILITY(U,$J,1009.802,30,1,7,0)
 ;;=RAVALLI^^081
 ;;^UTILITY(U,$J,1009.802,30,1,8,0)
 ;;=BLAINE^^005
 ;;^UTILITY(U,$J,1009.802,30,1,9,0)
 ;;=JUDITH BASIN^^045
 ;;^UTILITY(U,$J,1009.802,30,1,10,0)
 ;;=RICHLAND^^083
 ;;^UTILITY(U,$J,1009.802,30,1,11,0)
 ;;=BROADWATER^^007
 ;;^UTILITY(U,$J,1009.802,30,1,12,0)
 ;;=LAKE^^047
 ;;^UTILITY(U,$J,1009.802,30,1,13,0)
 ;;=ROOSEVELT^^085
 ;;^UTILITY(U,$J,1009.802,30,1,14,0)
 ;;=CARBON^^009
 ;;^UTILITY(U,$J,1009.802,30,1,15,0)
 ;;=LEWIS AND CLARK^^049
 ;;^UTILITY(U,$J,1009.802,30,1,16,0)
 ;;=ROSEBUD^^087
 ;;^UTILITY(U,$J,1009.802,30,1,17,0)
 ;;=CARTER^^011
 ;;^UTILITY(U,$J,1009.802,30,1,18,0)
 ;;=SANDERS^^089
 ;;^UTILITY(U,$J,1009.802,30,1,19,0)
 ;;=CASCADE^^013
 ;;^UTILITY(U,$J,1009.802,30,1,20,0)
 ;;=LIBERTY^^051
 ;;^UTILITY(U,$J,1009.802,30,1,21,0)
 ;;=SHERIDAN^^091
 ;;^UTILITY(U,$J,1009.802,30,1,22,0)
 ;;=CHOUTEAU^^015
 ;;^UTILITY(U,$J,1009.802,30,1,23,0)
 ;;=LINCOLN^^053
 ;;^UTILITY(U,$J,1009.802,30,1,24,0)
 ;;=SILVER BOW^^093
 ;;^UTILITY(U,$J,1009.802,30,1,25,0)
 ;;=MCCONE^^055
 ;;^UTILITY(U,$J,1009.802,30,1,26,0)
 ;;=STILLWATER^^095
 ;;^UTILITY(U,$J,1009.802,30,1,27,0)
 ;;=DANIELS^^019
 ;;^UTILITY(U,$J,1009.802,30,1,28,0)
 ;;=MADISON^^057
 ;;^UTILITY(U,$J,1009.802,30,1,29,0)
 ;;=SWEET GRASS^^097
 ;;^UTILITY(U,$J,1009.802,30,1,30,0)
 ;;=DAWSON^^021
 ;;^UTILITY(U,$J,1009.802,30,1,31,0)
 ;;=MEAGHER^^059
 ;;^UTILITY(U,$J,1009.802,30,1,32,0)
 ;;=TETON^^099
 ;;^UTILITY(U,$J,1009.802,30,1,33,0)
 ;;=DEER LODGE^^023
 ;;^UTILITY(U,$J,1009.802,30,1,34,0)
 ;;=MINERAL^^061
 ;;^UTILITY(U,$J,1009.802,30,1,35,0)
 ;;=TOOLE^^101
 ;;^UTILITY(U,$J,1009.802,30,1,36,0)
 ;;=FALLON^^025
 ;;^UTILITY(U,$J,1009.802,30,1,37,0)
 ;;=MISSOULA^^063
 ;;^UTILITY(U,$J,1009.802,30,1,38,0)
 ;;=TREASURE^^103
 ;;^UTILITY(U,$J,1009.802,30,1,39,0)
 ;;=FERGUS^^027
 ;;^UTILITY(U,$J,1009.802,30,1,40,0)
 ;;=MUSSELSHELL^^065
 ;;^UTILITY(U,$J,1009.802,30,1,41,0)
 ;;=VALLEY^^105
 ;;^UTILITY(U,$J,1009.802,30,1,42,0)
 ;;=FLATHEAD^^029
 ;;^UTILITY(U,$J,1009.802,30,1,43,0)
 ;;=PARK^^067
 ;;^UTILITY(U,$J,1009.802,30,1,44,0)
 ;;=WHEATLAND^^107
 ;;^UTILITY(U,$J,1009.802,30,1,45,0)
 ;;=GALLATIN^^031
 ;;^UTILITY(U,$J,1009.802,30,1,46,0)
 ;;=PETROLEUM^^069
 ;;^UTILITY(U,$J,1009.802,30,1,47,0)
 ;;=WIBAUX^^109
 ;;^UTILITY(U,$J,1009.802,30,1,48,0)
 ;;=GARFIELD^^033
 ;;^UTILITY(U,$J,1009.802,30,1,49,0)
 ;;=PHILLIPS^^071
 ;;^UTILITY(U,$J,1009.802,30,1,50,0)
 ;;=YELLOWSTONE^^111
 ;;^UTILITY(U,$J,1009.802,30,1,51,0)
 ;;=GLACIER^^035
 ;;^UTILITY(U,$J,1009.802,30,1,52,0)
 ;;=PONDERA^^073
 ;;^UTILITY(U,$J,1009.802,30,1,53,0)
 ;;=YELLOWSTONE NATIONAL PARK^^113
 ;;^UTILITY(U,$J,1009.802,30,1,54,0)
 ;;=GOLDEN VALLEY^^037
 ;;^UTILITY(U,$J,1009.802,30,1,55,0)
 ;;=POWDER RIVER^^075
 ;;^UTILITY(U,$J,1009.802,30,1,56,0)
 ;;=GRANITE^^039
 ;;^UTILITY(U,$J,1009.802,30,1,57,0)
 ;;=POWELL^^077
 ;;^UTILITY(U,$J,1009.802,31,0)
 ;;=NEBRASKA^NE^31^^1^1
 ;;^UTILITY(U,$J,1009.802,31,1,0)
 ;;=^1009.812I^93^93
 ;;^UTILITY(U,$J,1009.802,31,1,1,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,31,1,2,0)
 ;;=FRONTIER^^063
 ;;^UTILITY(U,$J,1009.802,31,1,3,0)
 ;;=NANCE^^125
 ;;^UTILITY(U,$J,1009.802,31,1,4,0)
 ;;=ANTELOPE^^003
 ;;^UTILITY(U,$J,1009.802,31,1,5,0)
 ;;=FURNAS^^065
 ;;^UTILITY(U,$J,1009.802,31,1,6,0)
 ;;=NEMAHA^^127
 ;;^UTILITY(U,$J,1009.802,31,1,7,0)
 ;;=ARTHUR^^005
 ;;^UTILITY(U,$J,1009.802,31,1,8,0)
 ;;=GAGE^^067
 ;;^UTILITY(U,$J,1009.802,31,1,9,0)
 ;;=NUCKOLLS^^129
 ;;^UTILITY(U,$J,1009.802,31,1,10,0)
 ;;=BANNER^^007
 ;;^UTILITY(U,$J,1009.802,31,1,11,0)
 ;;=GARDEN^^069
 ;;^UTILITY(U,$J,1009.802,31,1,12,0)
 ;;=OTOE^^131
 ;;^UTILITY(U,$J,1009.802,31,1,13,0)
 ;;=BLAINE^^009
 ;;^UTILITY(U,$J,1009.802,31,1,14,0)
 ;;=GARFIELD^^071
 ;;^UTILITY(U,$J,1009.802,31,1,15,0)
 ;;=PAWNEE^^133
 ;;^UTILITY(U,$J,1009.802,31,1,16,0)
 ;;=BOONE^^011
 ;;^UTILITY(U,$J,1009.802,31,1,17,0)
 ;;=GOSPER^^073
 ;;^UTILITY(U,$J,1009.802,31,1,18,0)
 ;;=PERKINS^^135
 ;;^UTILITY(U,$J,1009.802,31,1,19,0)
 ;;=BOX BUTTE^^013
 ;;^UTILITY(U,$J,1009.802,31,1,20,0)
 ;;=GRANT^^075
 ;;^UTILITY(U,$J,1009.802,31,1,21,0)
 ;;=PHELPS^^137
 ;;^UTILITY(U,$J,1009.802,31,1,22,0)
 ;;=BOYD^^015
 ;;^UTILITY(U,$J,1009.802,31,1,23,0)
 ;;=GREELEY^^077
 ;;^UTILITY(U,$J,1009.802,31,1,24,0)
 ;;=PIERCE^^139
 ;;^UTILITY(U,$J,1009.802,31,1,25,0)
 ;;=BROWN^^017
 ;;^UTILITY(U,$J,1009.802,31,1,26,0)
 ;;=HALL^^079
 ;;^UTILITY(U,$J,1009.802,31,1,27,0)
 ;;=PLATTE^^141
 ;;^UTILITY(U,$J,1009.802,31,1,28,0)
 ;;=BUFFALO^^019
 ;;^UTILITY(U,$J,1009.802,31,1,29,0)
 ;;=HAMILTON^^081
 ;;^UTILITY(U,$J,1009.802,31,1,30,0)
 ;;=POLK^^143
 ;;^UTILITY(U,$J,1009.802,31,1,31,0)
 ;;=BURT^^021
 ;;^UTILITY(U,$J,1009.802,31,1,32,0)
 ;;=HARLAN^^083
 ;;^UTILITY(U,$J,1009.802,31,1,33,0)
 ;;=RED WILLOW^^145
 ;;^UTILITY(U,$J,1009.802,31,1,34,0)
 ;;=BUTLER^^023
 ;;^UTILITY(U,$J,1009.802,31,1,35,0)
 ;;=HAYES^^085
 ;;^UTILITY(U,$J,1009.802,31,1,36,0)
 ;;=RICHARDSON^^147
 ;;^UTILITY(U,$J,1009.802,31,1,37,0)
 ;;=CASS^^025
 ;;^UTILITY(U,$J,1009.802,31,1,38,0)
 ;;=HITCHCOCK^^087
 ;;^UTILITY(U,$J,1009.802,31,1,39,0)
 ;;=ROCK^^149
 ;;^UTILITY(U,$J,1009.802,31,1,40,0)
 ;;=CEDAR^^027
 ;;^UTILITY(U,$J,1009.802,31,1,41,0)
 ;;=HOLT^^089
 ;;^UTILITY(U,$J,1009.802,31,1,42,0)
 ;;=SALINE^^151
 ;;^UTILITY(U,$J,1009.802,31,1,43,0)
 ;;=CHASE^^029
 ;;^UTILITY(U,$J,1009.802,31,1,44,0)
 ;;=HOOKER^^091
 ;;^UTILITY(U,$J,1009.802,31,1,45,0)
 ;;=SARPY^^153
 ;;^UTILITY(U,$J,1009.802,31,1,46,0)
 ;;=CHERRY^^031
 ;;^UTILITY(U,$J,1009.802,31,1,47,0)
 ;;=HOWARD^^093
 ;;^UTILITY(U,$J,1009.802,31,1,48,0)
 ;;=SAUNDERS^^155
 ;;^UTILITY(U,$J,1009.802,31,1,49,0)
 ;;=CHEYENNE^^033
 ;;^UTILITY(U,$J,1009.802,31,1,50,0)
 ;;=JEFFERSON^^095
 ;;^UTILITY(U,$J,1009.802,31,1,51,0)
 ;;=SCOTTS BLUFF^^157
 ;;^UTILITY(U,$J,1009.802,31,1,52,0)
 ;;=CLAY^^035
 ;;^UTILITY(U,$J,1009.802,31,1,53,0)
 ;;=JOHNSON^^097
 ;;^UTILITY(U,$J,1009.802,31,1,54,0)
 ;;=SEWARD^^159
 ;;^UTILITY(U,$J,1009.802,31,1,55,0)
 ;;=COLFAX^^037
 ;;^UTILITY(U,$J,1009.802,31,1,56,0)
 ;;=KEARNEY^^099
 ;;^UTILITY(U,$J,1009.802,31,1,57,0)
 ;;=SHERIDAN^^161
 ;;^UTILITY(U,$J,1009.802,31,1,58,0)
 ;;=CUMING^^039
 ;;^UTILITY(U,$J,1009.802,31,1,59,0)
 ;;=KEITH^^101
 ;;^UTILITY(U,$J,1009.802,31,1,60,0)
 ;;=SHERMAN^^163
 ;;^UTILITY(U,$J,1009.802,31,1,61,0)
 ;;=CUSTER^^041
 ;;^UTILITY(U,$J,1009.802,31,1,62,0)
 ;;=KEYA PAHA^^103
 ;;^UTILITY(U,$J,1009.802,31,1,63,0)
 ;;=SIOUX^^165
 ;;^UTILITY(U,$J,1009.802,31,1,64,0)
 ;;=DAKOTA^^043
 ;;^UTILITY(U,$J,1009.802,31,1,65,0)
 ;;=KIMBALL^^105
 ;;^UTILITY(U,$J,1009.802,31,1,66,0)
 ;;=STANTON^^167
 ;;^UTILITY(U,$J,1009.802,31,1,67,0)
 ;;=DAWES^^045
 ;;^UTILITY(U,$J,1009.802,31,1,68,0)
 ;;=KNOX^^107
 ;;^UTILITY(U,$J,1009.802,31,1,69,0)
 ;;=THAYER^^169
 ;;^UTILITY(U,$J,1009.802,31,1,70,0)
 ;;=DAWSON^^047
 ;;^UTILITY(U,$J,1009.802,31,1,71,0)
 ;;=LANCASTER^^109
 ;;^UTILITY(U,$J,1009.802,31,1,72,0)
 ;;=THOMAS^^171
 ;;^UTILITY(U,$J,1009.802,31,1,73,0)
 ;;=DEUEL^^049
 ;;^UTILITY(U,$J,1009.802,31,1,74,0)
 ;;=LINCOLN^^111
 ;;^UTILITY(U,$J,1009.802,31,1,75,0)
 ;;=THURSTON^^173
 ;;^UTILITY(U,$J,1009.802,31,1,76,0)
 ;;=DIXON^^051
 ;;^UTILITY(U,$J,1009.802,31,1,77,0)
 ;;=LOGAN^^113
 ;;^UTILITY(U,$J,1009.802,31,1,78,0)
 ;;=VALLEY^^175
 ;;^UTILITY(U,$J,1009.802,31,1,79,0)
 ;;=DODGE^^053
 ;;^UTILITY(U,$J,1009.802,31,1,80,0)
 ;;=LOUP^^115
 ;;^UTILITY(U,$J,1009.802,31,1,81,0)
 ;;=WASHINGTON^^177
 ;;^UTILITY(U,$J,1009.802,31,1,82,0)
 ;;=DOUGLAS^^055
 ;;^UTILITY(U,$J,1009.802,31,1,83,0)
 ;;=MCPHERSON^^117
 ;;^UTILITY(U,$J,1009.802,31,1,84,0)
 ;;=WAYNE^^179
 ;;^UTILITY(U,$J,1009.802,31,1,85,0)
 ;;=DUNDY^^057
 ;;^UTILITY(U,$J,1009.802,31,1,86,0)
 ;;=MADISON^^119
 ;;^UTILITY(U,$J,1009.802,31,1,87,0)
 ;;=WEBSTER^^181
 ;;^UTILITY(U,$J,1009.802,31,1,88,0)
 ;;=FILLMORE^^059

DMUFI00B
DMUFI00B ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,31,1,89,0)
 ;;=MERRICK^^121
 ;;^UTILITY(U,$J,1009.802,31,1,90,0)
 ;;=WHEELER^^183
 ;;^UTILITY(U,$J,1009.802,31,1,91,0)
 ;;=FRANKLIN^^061
 ;;^UTILITY(U,$J,1009.802,31,1,92,0)
 ;;=MORRILL^^123
 ;;^UTILITY(U,$J,1009.802,31,1,93,0)
 ;;=YORK^^185
 ;;^UTILITY(U,$J,1009.802,32,0)
 ;;=NEVADA^NV^32^^1^1
 ;;^UTILITY(U,$J,1009.802,32,1,0)
 ;;=^1009.812I^17^17
 ;;^UTILITY(U,$J,1009.802,32,1,1,0)
 ;;=CHURCHILL^^001
 ;;^UTILITY(U,$J,1009.802,32,1,2,0)
 ;;=HUMBOLDT^^013
 ;;^UTILITY(U,$J,1009.802,32,1,3,0)
 ;;=NYE^^023
 ;;^UTILITY(U,$J,1009.802,32,1,4,0)
 ;;=CLARK^^003
 ;;^UTILITY(U,$J,1009.802,32,1,5,0)
 ;;=LANDER^^015
 ;;^UTILITY(U,$J,1009.802,32,1,6,0)
 ;;=PERSHING^^027
 ;;^UTILITY(U,$J,1009.802,32,1,7,0)
 ;;=DOUGLAS^^005
 ;;^UTILITY(U,$J,1009.802,32,1,8,0)
 ;;=LINCOLN^^017
 ;;^UTILITY(U,$J,1009.802,32,1,9,0)
 ;;=STOREY^^029
 ;;^UTILITY(U,$J,1009.802,32,1,10,0)
 ;;=ELKO^^007
 ;;^UTILITY(U,$J,1009.802,32,1,11,0)
 ;;=LYON^^019
 ;;^UTILITY(U,$J,1009.802,32,1,12,0)
 ;;=WASHOE^^031
 ;;^UTILITY(U,$J,1009.802,32,1,13,0)
 ;;=ESMERALDA^^009
 ;;^UTILITY(U,$J,1009.802,32,1,14,0)
 ;;=WHITE PINE^^033
 ;;^UTILITY(U,$J,1009.802,32,1,15,0)
 ;;=EUREKA^^011
 ;;^UTILITY(U,$J,1009.802,32,1,16,0)
 ;;=MINERAL^^021
 ;;^UTILITY(U,$J,1009.802,32,1,17,0)
 ;;=CARSON CITY^^510
 ;;^UTILITY(U,$J,1009.802,33,0)
 ;;=NEW HAMPSHIRE^NH^33^^1^1
 ;;^UTILITY(U,$J,1009.802,33,1,0)
 ;;=^1009.812I^10^10
 ;;^UTILITY(U,$J,1009.802,33,1,1,0)
 ;;=BELKNAP^^001
 ;;^UTILITY(U,$J,1009.802,33,1,2,0)
 ;;=GRAFTON^^009
 ;;^UTILITY(U,$J,1009.802,33,1,3,0)
 ;;=ROCKINGHAM^^015
 ;;^UTILITY(U,$J,1009.802,33,1,4,0)
 ;;=CARROLL^^003
 ;;^UTILITY(U,$J,1009.802,33,1,5,0)
 ;;=HILLSBOROUGH^^011
 ;;^UTILITY(U,$J,1009.802,33,1,6,0)
 ;;=STRAFFORD^^017
 ;;^UTILITY(U,$J,1009.802,33,1,7,0)
 ;;=CHESHIRE^^005
 ;;^UTILITY(U,$J,1009.802,33,1,8,0)
 ;;=MERRIMACK^^013
 ;;^UTILITY(U,$J,1009.802,33,1,9,0)
 ;;=SULLIVAN^^019
 ;;^UTILITY(U,$J,1009.802,33,1,10,0)
 ;;=COOS^^007
 ;;^UTILITY(U,$J,1009.802,34,0)
 ;;=NEW JERSEY^NJ^34^^1^1
 ;;^UTILITY(U,$J,1009.802,34,1,0)
 ;;=^1009.812I^21^21
 ;;^UTILITY(U,$J,1009.802,34,1,1,0)
 ;;=ATLANTIC^^001
 ;;^UTILITY(U,$J,1009.802,34,1,2,0)
 ;;=GLOUCESTER^^015
 ;;^UTILITY(U,$J,1009.802,34,1,3,0)
 ;;=OCEAN^^029
 ;;^UTILITY(U,$J,1009.802,34,1,4,0)
 ;;=BERGEN^^003
 ;;^UTILITY(U,$J,1009.802,34,1,5,0)
 ;;=HUDSON^^017
 ;;^UTILITY(U,$J,1009.802,34,1,6,0)
 ;;=PASSAIC^^031
 ;;^UTILITY(U,$J,1009.802,34,1,7,0)
 ;;=BURLINGTON^^005
 ;;^UTILITY(U,$J,1009.802,34,1,8,0)
 ;;=HUNTERDON^^019
 ;;^UTILITY(U,$J,1009.802,34,1,9,0)
 ;;=SALEM^^033
 ;;^UTILITY(U,$J,1009.802,34,1,10,0)
 ;;=CAMDEN^^007
 ;;^UTILITY(U,$J,1009.802,34,1,11,0)
 ;;=MERCER^^021
 ;;^UTILITY(U,$J,1009.802,34,1,12,0)
 ;;=SOMERSET^^035
 ;;^UTILITY(U,$J,1009.802,34,1,13,0)
 ;;=CAPE MAY^^009
 ;;^UTILITY(U,$J,1009.802,34,1,14,0)
 ;;=MIDDLESEX^^023
 ;;^UTILITY(U,$J,1009.802,34,1,15,0)
 ;;=SUSSEX^^037
 ;;^UTILITY(U,$J,1009.802,34,1,16,0)
 ;;=CUMBERLAND^^011
 ;;^UTILITY(U,$J,1009.802,34,1,17,0)
 ;;=MONMOUTH^^025
 ;;^UTILITY(U,$J,1009.802,34,1,18,0)
 ;;=UNION^^039
 ;;^UTILITY(U,$J,1009.802,34,1,18,1,0)
 ;;=^1009.822^1^1
 ;;^UTILITY(U,$J,1009.802,34,1,18,1,1,0)
 ;;=12901
 ;;^UTILITY(U,$J,1009.802,34,1,19,0)
 ;;=ESSEX^^013
 ;;^UTILITY(U,$J,1009.802,34,1,20,0)
 ;;=MORRIS^^027
 ;;^UTILITY(U,$J,1009.802,34,1,21,0)
 ;;=WARREN^^041
 ;;^UTILITY(U,$J,1009.802,35,0)
 ;;=NEW MEXICO^NM^35^^1^1
 ;;^UTILITY(U,$J,1009.802,35,1,0)
 ;;=^1009.812I^37^34
 ;;^UTILITY(U,$J,1009.802,35,1,1,0)
 ;;=BERNALILLO^^001^001
 ;;^UTILITY(U,$J,1009.802,35,1,2,0)
 ;;=CATRON^^003^003
 ;;^UTILITY(U,$J,1009.802,35,1,3,0)
 ;;=CHAVES^^005^005
 ;;^UTILITY(U,$J,1009.802,35,1,4,0)
 ;;=COLFAX^^007^007
 ;;^UTILITY(U,$J,1009.802,35,1,5,0)
 ;;=CURRY^^009^009
 ;;^UTILITY(U,$J,1009.802,35,1,6,0)
 ;;=DEBACA^^011^011
 ;;^UTILITY(U,$J,1009.802,35,1,7,0)
 ;;=DONA ANA^^013^013
 ;;^UTILITY(U,$J,1009.802,35,1,8,0)
 ;;=EDDY^^015^015
 ;;^UTILITY(U,$J,1009.802,35,1,9,0)
 ;;=GRANT^^017^017
 ;;^UTILITY(U,$J,1009.802,35,1,10,0)
 ;;=GUADALUPE^^019^019
 ;;^UTILITY(U,$J,1009.802,35,1,11,0)
 ;;=HARDING^^021^021
 ;;^UTILITY(U,$J,1009.802,35,1,12,0)
 ;;=HIDALGO^^023^023
 ;;^UTILITY(U,$J,1009.802,35,1,13,0)
 ;;=LEA^^025^025
 ;;^UTILITY(U,$J,1009.802,35,1,14,0)
 ;;=LINCOLN^^027^027
 ;;^UTILITY(U,$J,1009.802,35,1,15,0)
 ;;=LOS ALAMOS^^028^028
 ;;^UTILITY(U,$J,1009.802,35,1,16,0)
 ;;=LUNA^^029^029
 ;;^UTILITY(U,$J,1009.802,35,1,17,0)
 ;;=MCKINLEY^^031^031
 ;;^UTILITY(U,$J,1009.802,35,1,18,0)
 ;;=MORA^^033^033
 ;;^UTILITY(U,$J,1009.802,35,1,19,0)
 ;;=OTERO^^035^ 
 ;;^UTILITY(U,$J,1009.802,35,1,20,0)
 ;;=RIO ARRIBA^^039^039
 ;;^UTILITY(U,$J,1009.802,35,1,21,0)
 ;;=ROOSEVELT^^041^041
 ;;^UTILITY(U,$J,1009.802,35,1,22,0)
 ;;=SANDOVAL^^043^043
 ;;^UTILITY(U,$J,1009.802,35,1,23,0)
 ;;=SAN JUAN^^045^045
 ;;^UTILITY(U,$J,1009.802,35,1,24,0)
 ;;=SAN MIGUEL^^047^047
 ;;^UTILITY(U,$J,1009.802,35,1,25,0)
 ;;=SANTA FE^^049^049
 ;;^UTILITY(U,$J,1009.802,35,1,26,0)
 ;;=SIERRA^^051^051
 ;;^UTILITY(U,$J,1009.802,35,1,27,0)
 ;;=SOCORRO^^053^053
 ;;^UTILITY(U,$J,1009.802,35,1,28,0)
 ;;=TAOS^^055^055
 ;;^UTILITY(U,$J,1009.802,35,1,29,0)
 ;;=TORRANCE^^057^057
 ;;^UTILITY(U,$J,1009.802,35,1,30,0)
 ;;=UNION^^059^059
 ;;^UTILITY(U,$J,1009.802,35,1,31,0)
 ;;=VALENCIA^^061^061
 ;;^UTILITY(U,$J,1009.802,35,1,35,0)
 ;;=QUAY^^037
 ;;^UTILITY(U,$J,1009.802,35,1,36,0)
 ;;=CIBOLA^^006
 ;;^UTILITY(U,$J,1009.802,35,1,37,0)
 ;;=ZZSAN MIGUEL^^999^^3050204
 ;;^UTILITY(U,$J,1009.802,36,0)
 ;;=NEW YORK^NY^36^^1^1
 ;;^UTILITY(U,$J,1009.802,36,1,0)
 ;;=^1009.812I^96^63
 ;;^UTILITY(U,$J,1009.802,36,1,1,0)
 ;;=ALBANY^AL^001
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,0)
 ;;=^1009.822^8^8
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,1,0)
 ;;=12208
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,2,0)
 ;;=12202
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,3,0)
 ;;=12201
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,4,0)
 ;;=12205
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,5,0)
 ;;=12206
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,6,0)
 ;;=12209
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,7,0)
 ;;=12208
 ;;^UTILITY(U,$J,1009.802,36,1,1,1,8,0)
 ;;=12054
 ;;^UTILITY(U,$J,1009.802,36,1,2,0)
 ;;=ULSTER^UL^111
 ;;^UTILITY(U,$J,1009.802,36,1,3,0)
 ;;=GREENE^GR^039
 ;;^UTILITY(U,$J,1009.802,36,1,4,0)
 ;;=SCHENECTADY^SCHE^093
 ;;^UTILITY(U,$J,1009.802,36,1,5,0)
 ;;=SCHOHARIE^SCHO^095
 ;;^UTILITY(U,$J,1009.802,36,1,6,0)
 ;;=DELAWARE^DE^025
 ;;^UTILITY(U,$J,1009.802,36,1,7,0)
 ;;=SULLIVAN^SU^105
 ;;^UTILITY(U,$J,1009.802,36,1,8,0)
 ;;=OTSEGO^OT^077
 ;;^UTILITY(U,$J,1009.802,36,1,9,0)
 ;;=MONTGOMERY^MO^057
 ;;^UTILITY(U,$J,1009.802,36,1,10,0)
 ;;=FULTON^FU^035
 ;;^UTILITY(U,$J,1009.802,36,1,11,0)
 ;;=SARATOGA^SA^091
 ;;^UTILITY(U,$J,1009.802,36,1,12,0)
 ;;=HAMILTON^HA^041
 ;;^UTILITY(U,$J,1009.802,36,1,13,0)
 ;;=FRANKLIN^FR^033
 ;;^UTILITY(U,$J,1009.802,36,1,14,0)
 ;;=WARREN^WA^113
 ;;^UTILITY(U,$J,1009.802,36,1,15,0)
 ;;=ESSEX^ES^031
 ;;^UTILITY(U,$J,1009.802,36,1,16,0)
 ;;=CLINTON^CL^019
 ;;^UTILITY(U,$J,1009.802,36,1,17,0)
 ;;=WASHINGTON^WA^115
 ;;^UTILITY(U,$J,1009.802,36,1,18,0)
 ;;=RENSSELAER^RE^083
 ;;^UTILITY(U,$J,1009.802,36,1,19,0)
 ;;=COLUMBIA^CO^021
 ;;^UTILITY(U,$J,1009.802,36,1,20,0)
 ;;=DUTCHESS^CO^027
 ;;^UTILITY(U,$J,1009.802,36,1,44,0)
 ;;=ZZLANE^^999^^3050204
 ;;^UTILITY(U,$J,1009.802,36,1,51,0)
 ;;=JEFFERSON^^045
 ;;^UTILITY(U,$J,1009.802,36,1,56,0)
 ;;=QUEENS^^081^081
 ;;^UTILITY(U,$J,1009.802,36,1,57,0)
 ;;=ONTARIO^^069
 ;;^UTILITY(U,$J,1009.802,36,1,58,0)
 ;;=ALLEGANY^^003
 ;;^UTILITY(U,$J,1009.802,36,1,59,0)
 ;;=GENESEE^^037
 ;;^UTILITY(U,$J,1009.802,36,1,60,0)
 ;;=ORANGE^^071
 ;;^UTILITY(U,$J,1009.802,36,1,60,1,0)
 ;;=^1009.822^1^1
 ;;^UTILITY(U,$J,1009.802,36,1,60,1,1,0)
 ;;=12054
 ;;^UTILITY(U,$J,1009.802,36,1,61,0)
 ;;=BRONX^^005
 ;;^UTILITY(U,$J,1009.802,36,1,62,0)
 ;;=ORLEANS^^073
 ;;^UTILITY(U,$J,1009.802,36,1,63,0)
 ;;=BROOME^^007
 ;;^UTILITY(U,$J,1009.802,36,1,64,0)
 ;;=OSWEGO^^075
 ;;^UTILITY(U,$J,1009.802,36,1,65,0)
 ;;=CATTARAUGUS^^009
 ;;^UTILITY(U,$J,1009.802,36,1,66,0)
 ;;=HERKIMER^^043
 ;;^UTILITY(U,$J,1009.802,36,1,67,0)
 ;;=CAYUGA^^011
 ;;^UTILITY(U,$J,1009.802,36,1,68,0)
 ;;=PUTNAM^^079
 ;;^UTILITY(U,$J,1009.802,36,1,69,0)
 ;;=CHAUTAUQUA^^013
 ;;^UTILITY(U,$J,1009.802,36,1,70,0)
 ;;=KINGS^^047
 ;;^UTILITY(U,$J,1009.802,36,1,71,0)
 ;;=CHEMUNG^^015
 ;;^UTILITY(U,$J,1009.802,36,1,72,0)
 ;;=LEWIS^^049
 ;;^UTILITY(U,$J,1009.802,36,1,73,0)
 ;;=CHENANGO^^017
 ;;^UTILITY(U,$J,1009.802,36,1,74,0)
 ;;=LIVINGSTON^^051
 ;;^UTILITY(U,$J,1009.802,36,1,75,0)
 ;;=RICHMOND^^085
 ;;^UTILITY(U,$J,1009.802,36,1,76,0)
 ;;=MADISON^^053
 ;;^UTILITY(U,$J,1009.802,36,1,77,0)
 ;;=ROCKLAND^^087
 ;;^UTILITY(U,$J,1009.802,36,1,78,0)
 ;;=MONROE^^055
 ;;^UTILITY(U,$J,1009.802,36,1,79,0)
 ;;=ST. LAWRENCE^^089
 ;;^UTILITY(U,$J,1009.802,36,1,80,0)
 ;;=CORTLAND^^023
 ;;^UTILITY(U,$J,1009.802,36,1,81,0)
 ;;=NASSAU^^059
 ;;^UTILITY(U,$J,1009.802,36,1,82,0)
 ;;=NEW YORK^^061
 ;;^UTILITY(U,$J,1009.802,36,1,83,0)
 ;;=ERIE^^029
 ;;^UTILITY(U,$J,1009.802,36,1,84,0)
 ;;=NIAGARA^^063
 ;;^UTILITY(U,$J,1009.802,36,1,85,0)
 ;;=SCHUYLER^^097
 ;;^UTILITY(U,$J,1009.802,36,1,86,0)
 ;;=ONEIDA^^065
 ;;^UTILITY(U,$J,1009.802,36,1,87,0)
 ;;=SENECA^^099
 ;;^UTILITY(U,$J,1009.802,36,1,88,0)
 ;;=ONONDAGA^^067
 ;;^UTILITY(U,$J,1009.802,36,1,89,0)
 ;;=STEUBEN^^101
 ;;^UTILITY(U,$J,1009.802,36,1,90,0)
 ;;=SUFFOLK^^103
 ;;^UTILITY(U,$J,1009.802,36,1,91,0)
 ;;=WESTCHESTER^^119
 ;;^UTILITY(U,$J,1009.802,36,1,92,0)
 ;;=WYOMING^^121
 ;;^UTILITY(U,$J,1009.802,36,1,93,0)
 ;;=TIOGA^^107
 ;;^UTILITY(U,$J,1009.802,36,1,94,0)
 ;;=YATES^^123
 ;;^UTILITY(U,$J,1009.802,36,1,95,0)
 ;;=TOMPKINS^^109
 ;;^UTILITY(U,$J,1009.802,36,1,96,0)
 ;;=WAYNE^^117
 ;;^UTILITY(U,$J,1009.802,37,0)
 ;;=NORTH CAROLINA^NC^37^^1^1
 ;;^UTILITY(U,$J,1009.802,37,1,0)
 ;;=^1009.812I^100^100
 ;;^UTILITY(U,$J,1009.802,37,1,1,0)
 ;;=ALAMANCE^^001
 ;;^UTILITY(U,$J,1009.802,37,1,2,0)
 ;;=FRANKLIN^^069
 ;;^UTILITY(U,$J,1009.802,37,1,3,0)
 ;;=ORANGE^^135
 ;;^UTILITY(U,$J,1009.802,37,1,4,0)
 ;;=ALEXANDER^^003
 ;;^UTILITY(U,$J,1009.802,37,1,5,0)
 ;;=GASTON^^071
 ;;^UTILITY(U,$J,1009.802,37,1,6,0)
 ;;=PAMLICO^^137
 ;;^UTILITY(U,$J,1009.802,37,1,7,0)
 ;;=ALLEGHANY^^005
 ;;^UTILITY(U,$J,1009.802,37,1,8,0)
 ;;=GATES^^073
 ;;^UTILITY(U,$J,1009.802,37,1,9,0)
 ;;=PASQUOTANK^^139
 ;;^UTILITY(U,$J,1009.802,37,1,10,0)
 ;;=ANSON^^007
 ;;^UTILITY(U,$J,1009.802,37,1,11,0)
 ;;=GRAHAM^^075
 ;;^UTILITY(U,$J,1009.802,37,1,12,0)
 ;;=PENDER^^141
 ;;^UTILITY(U,$J,1009.802,37,1,13,0)
 ;;=ASHE^^009
 ;;^UTILITY(U,$J,1009.802,37,1,14,0)
 ;;=GRANVILLE^^077
 ;;^UTILITY(U,$J,1009.802,37,1,15,0)
 ;;=PERQUIMANS^^143
 ;;^UTILITY(U,$J,1009.802,37,1,16,0)
 ;;=AVERY^^011
 ;;^UTILITY(U,$J,1009.802,37,1,17,0)
 ;;=GREENE^^079
 ;;^UTILITY(U,$J,1009.802,37,1,18,0)
 ;;=PERSON^^145
 ;;^UTILITY(U,$J,1009.802,37,1,19,0)
 ;;=BEAUFORT^^013
 ;;^UTILITY(U,$J,1009.802,37,1,20,0)
 ;;=GUILFORD^^081
 ;;^UTILITY(U,$J,1009.802,37,1,21,0)
 ;;=PITT^^147
 ;;^UTILITY(U,$J,1009.802,37,1,22,0)
 ;;=BERTIE^^015
 ;;^UTILITY(U,$J,1009.802,37,1,23,0)
 ;;=HALIFAX^^083
 ;;^UTILITY(U,$J,1009.802,37,1,24,0)
 ;;=POLK^^149
 ;;^UTILITY(U,$J,1009.802,37,1,25,0)
 ;;=BLADEN^^017
 ;;^UTILITY(U,$J,1009.802,37,1,26,0)
 ;;=HARNETT^^085
 ;;^UTILITY(U,$J,1009.802,37,1,27,0)
 ;;=RANDOLPH^^151
 ;;^UTILITY(U,$J,1009.802,37,1,28,0)
 ;;=BRUNSWICK^^019
 ;;^UTILITY(U,$J,1009.802,37,1,29,0)
 ;;=HAYWOOD^^087
 ;;^UTILITY(U,$J,1009.802,37,1,30,0)
 ;;=RICHMOND^^153
 ;;^UTILITY(U,$J,1009.802,37,1,31,0)
 ;;=BUNCOMBE^^021
 ;;^UTILITY(U,$J,1009.802,37,1,32,0)
 ;;=HENDERSON^^089
 ;;^UTILITY(U,$J,1009.802,37,1,33,0)
 ;;=ROBESON^^155
 ;;^UTILITY(U,$J,1009.802,37,1,34,0)
 ;;=BURKE^^023
 ;;^UTILITY(U,$J,1009.802,37,1,35,0)
 ;;=HERTFORD^^091
 ;;^UTILITY(U,$J,1009.802,37,1,36,0)
 ;;=ROCKINGHAM^^157
 ;;^UTILITY(U,$J,1009.802,37,1,37,0)
 ;;=CABARRUS^^025
 ;;^UTILITY(U,$J,1009.802,37,1,38,0)
 ;;=HOKE^^093
 ;;^UTILITY(U,$J,1009.802,37,1,39,0)
 ;;=ROWAN^^159
 ;;^UTILITY(U,$J,1009.802,37,1,40,0)
 ;;=CALDWELL^^027
 ;;^UTILITY(U,$J,1009.802,37,1,41,0)
 ;;=HYDE^^095
 ;;^UTILITY(U,$J,1009.802,37,1,42,0)
 ;;=RUTHERFORD^^161
 ;;^UTILITY(U,$J,1009.802,37,1,43,0)
 ;;=CAMDEN^^029
 ;;^UTILITY(U,$J,1009.802,37,1,44,0)
 ;;=IREDELL^^097
 ;;^UTILITY(U,$J,1009.802,37,1,45,0)
 ;;=SAMPSON^^163
 ;;^UTILITY(U,$J,1009.802,37,1,46,0)
 ;;=CARTERET^^031
 ;;^UTILITY(U,$J,1009.802,37,1,47,0)
 ;;=JACKSON^^099
 ;;^UTILITY(U,$J,1009.802,37,1,48,0)
 ;;=SCOTLAND^^165
 ;;^UTILITY(U,$J,1009.802,37,1,49,0)
 ;;=CASWELL^^033
 ;;^UTILITY(U,$J,1009.802,37,1,50,0)
 ;;=JOHNSTON^^101
 ;;^UTILITY(U,$J,1009.802,37,1,51,0)
 ;;=STANLY^^167
 ;;^UTILITY(U,$J,1009.802,37,1,52,0)
 ;;=CATAWBA^^035
 ;;^UTILITY(U,$J,1009.802,37,1,53,0)
 ;;=JONES^^103
 ;;^UTILITY(U,$J,1009.802,37,1,54,0)
 ;;=STOKES^^169
 ;;^UTILITY(U,$J,1009.802,37,1,55,0)
 ;;=CHATHAM^^037
 ;;^UTILITY(U,$J,1009.802,37,1,56,0)
 ;;=LEE^^105
 ;;^UTILITY(U,$J,1009.802,37,1,57,0)
 ;;=SURRY^^171
 ;;^UTILITY(U,$J,1009.802,37,1,58,0)
 ;;=CHEROKEE^^039
 ;;^UTILITY(U,$J,1009.802,37,1,59,0)
 ;;=LENOIR^^107
 ;;^UTILITY(U,$J,1009.802,37,1,60,0)
 ;;=SWAIN^^173
 ;;^UTILITY(U,$J,1009.802,37,1,61,0)
 ;;=CHOWAN^^041
 ;;^UTILITY(U,$J,1009.802,37,1,62,0)
 ;;=LINCOLN^^109
 ;;^UTILITY(U,$J,1009.802,37,1,63,0)
 ;;=TRANSYLVANIA^^175
 ;;^UTILITY(U,$J,1009.802,37,1,64,0)
 ;;=CLAY^^043
 ;;^UTILITY(U,$J,1009.802,37,1,65,0)
 ;;=MCDOWELL^^111
 ;;^UTILITY(U,$J,1009.802,37,1,66,0)
 ;;=TYRRELL^^177
 ;;^UTILITY(U,$J,1009.802,37,1,67,0)
 ;;=CLEVELAND^^045
 ;;^UTILITY(U,$J,1009.802,37,1,68,0)
 ;;=MACON^^113
 ;;^UTILITY(U,$J,1009.802,37,1,69,0)
 ;;=UNION^^179
 ;;^UTILITY(U,$J,1009.802,37,1,70,0)
 ;;=COLUMBUS^^047
 ;;^UTILITY(U,$J,1009.802,37,1,71,0)
 ;;=MADISON^^115
 ;;^UTILITY(U,$J,1009.802,37,1,72,0)
 ;;=VANCE^^181
 ;;^UTILITY(U,$J,1009.802,37,1,73,0)
 ;;=CRAVEN^^049
 ;;^UTILITY(U,$J,1009.802,37,1,74,0)
 ;;=MARTIN^^117
 ;;^UTILITY(U,$J,1009.802,37,1,75,0)
 ;;=WAKE^^183
 ;;^UTILITY(U,$J,1009.802,37,1,76,0)
 ;;=CUMBERLAND^^051
 ;;^UTILITY(U,$J,1009.802,37,1,77,0)
 ;;=MECKLENBURG^^119
 ;;^UTILITY(U,$J,1009.802,37,1,78,0)
 ;;=WARREN^^185
 ;;^UTILITY(U,$J,1009.802,37,1,79,0)
 ;;=CURRITUCK^^053
 ;;^UTILITY(U,$J,1009.802,37,1,80,0)
 ;;=MITCHELL^^121
 ;;^UTILITY(U,$J,1009.802,37,1,81,0)
 ;;=WASHINGTON^^187

DMUFI00C
DMUFI00C ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,37,1,82,0)
 ;;=DARE^^055
 ;;^UTILITY(U,$J,1009.802,37,1,83,0)
 ;;=MONTGOMERY^^123
 ;;^UTILITY(U,$J,1009.802,37,1,84,0)
 ;;=WATAUGA^^189
 ;;^UTILITY(U,$J,1009.802,37,1,85,0)
 ;;=DAVIDSON^^057
 ;;^UTILITY(U,$J,1009.802,37,1,86,0)
 ;;=MOORE^^125
 ;;^UTILITY(U,$J,1009.802,37,1,87,0)
 ;;=WAYNE^^191
 ;;^UTILITY(U,$J,1009.802,37,1,88,0)
 ;;=DAVIE^^059
 ;;^UTILITY(U,$J,1009.802,37,1,89,0)
 ;;=NASH^^127
 ;;^UTILITY(U,$J,1009.802,37,1,90,0)
 ;;=WILKES^^193
 ;;^UTILITY(U,$J,1009.802,37,1,91,0)
 ;;=DUPLIN^^061
 ;;^UTILITY(U,$J,1009.802,37,1,92,0)
 ;;=NEW HANOVER^^129
 ;;^UTILITY(U,$J,1009.802,37,1,93,0)
 ;;=WILSON^^195
 ;;^UTILITY(U,$J,1009.802,37,1,94,0)
 ;;=DURHAM^^063
 ;;^UTILITY(U,$J,1009.802,37,1,95,0)
 ;;=NORTHAMPTON^^131
 ;;^UTILITY(U,$J,1009.802,37,1,96,0)
 ;;=YADKIN^^197
 ;;^UTILITY(U,$J,1009.802,37,1,97,0)
 ;;=EDGECOMBE^^065
 ;;^UTILITY(U,$J,1009.802,37,1,98,0)
 ;;=ONSLOW^^133
 ;;^UTILITY(U,$J,1009.802,37,1,99,0)
 ;;=YANCEY^^199
 ;;^UTILITY(U,$J,1009.802,37,1,100,0)
 ;;=FORSYTH^^067
 ;;^UTILITY(U,$J,1009.802,38,0)
 ;;=NORTH DAKOTA^ND^38^^1^1
 ;;^UTILITY(U,$J,1009.802,38,1,0)
 ;;=^1009.812I^53^53
 ;;^UTILITY(U,$J,1009.802,38,1,1,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,38,1,2,0)
 ;;=BOWMAN^^011
 ;;^UTILITY(U,$J,1009.802,38,1,3,0)
 ;;=DICKEY^^021
 ;;^UTILITY(U,$J,1009.802,38,1,4,0)
 ;;=BARNES^^003
 ;;^UTILITY(U,$J,1009.802,38,1,5,0)
 ;;=BURKE^^013
 ;;^UTILITY(U,$J,1009.802,38,1,6,0)
 ;;=DIVIDE^^023
 ;;^UTILITY(U,$J,1009.802,38,1,7,0)
 ;;=BENSON^^005
 ;;^UTILITY(U,$J,1009.802,38,1,8,0)
 ;;=BURLEIGH^^015
 ;;^UTILITY(U,$J,1009.802,38,1,9,0)
 ;;=DUNN^^025
 ;;^UTILITY(U,$J,1009.802,38,1,10,0)
 ;;=BILLINGS^^007
 ;;^UTILITY(U,$J,1009.802,38,1,11,0)
 ;;=CASS^^017
 ;;^UTILITY(U,$J,1009.802,38,1,12,0)
 ;;=EDDY^^027
 ;;^UTILITY(U,$J,1009.802,38,1,13,0)
 ;;=BOTTINEAU^^009
 ;;^UTILITY(U,$J,1009.802,38,1,14,0)
 ;;=CAVALIER^^019
 ;;^UTILITY(U,$J,1009.802,38,1,15,0)
 ;;=EMMONS^^029
 ;;^UTILITY(U,$J,1009.802,38,1,16,0)
 ;;=FOSTER^^031
 ;;^UTILITY(U,$J,1009.802,38,1,17,0)
 ;;=MERCER^^057
 ;;^UTILITY(U,$J,1009.802,38,1,18,0)
 ;;=SHERIDAN^^083
 ;;^UTILITY(U,$J,1009.802,38,1,19,0)
 ;;=GOLDEN VALLEY^^033
 ;;^UTILITY(U,$J,1009.802,38,1,20,0)
 ;;=MORTON^^059
 ;;^UTILITY(U,$J,1009.802,38,1,21,0)
 ;;=SIOUX^^085
 ;;^UTILITY(U,$J,1009.802,38,1,22,0)
 ;;=GRAND FORKS^^035
 ;;^UTILITY(U,$J,1009.802,38,1,23,0)
 ;;=MOUNTRAIL^^061
 ;;^UTILITY(U,$J,1009.802,38,1,24,0)
 ;;=SLOPE^^087
 ;;^UTILITY(U,$J,1009.802,38,1,25,0)
 ;;=GRANT^^037
 ;;^UTILITY(U,$J,1009.802,38,1,26,0)
 ;;=NELSON^^063
 ;;^UTILITY(U,$J,1009.802,38,1,27,0)
 ;;=STARK^^089
 ;;^UTILITY(U,$J,1009.802,38,1,28,0)
 ;;=GRIGGS^^039
 ;;^UTILITY(U,$J,1009.802,38,1,29,0)
 ;;=OLIVER^^065
 ;;^UTILITY(U,$J,1009.802,38,1,30,0)
 ;;=STEELE^^091
 ;;^UTILITY(U,$J,1009.802,38,1,31,0)
 ;;=HETTINGER^^041
 ;;^UTILITY(U,$J,1009.802,38,1,32,0)
 ;;=PEMBINA^^067
 ;;^UTILITY(U,$J,1009.802,38,1,33,0)
 ;;=STUTSMAN^^093
 ;;^UTILITY(U,$J,1009.802,38,1,34,0)
 ;;=KIDDER^^043
 ;;^UTILITY(U,$J,1009.802,38,1,35,0)
 ;;=PIERCE^^069
 ;;^UTILITY(U,$J,1009.802,38,1,36,0)
 ;;=TOWNER^^095
 ;;^UTILITY(U,$J,1009.802,38,1,37,0)
 ;;=LAMOURE^^045
 ;;^UTILITY(U,$J,1009.802,38,1,38,0)
 ;;=RAMSEY^^071
 ;;^UTILITY(U,$J,1009.802,38,1,39,0)
 ;;=TRAILL^^097
 ;;^UTILITY(U,$J,1009.802,38,1,40,0)
 ;;=LOGAN^^047
 ;;^UTILITY(U,$J,1009.802,38,1,41,0)
 ;;=RANSOM^^073
 ;;^UTILITY(U,$J,1009.802,38,1,42,0)
 ;;=WALSH^^099
 ;;^UTILITY(U,$J,1009.802,38,1,43,0)
 ;;=MCHENRY^^049
 ;;^UTILITY(U,$J,1009.802,38,1,44,0)
 ;;=RENVILLE^^075
 ;;^UTILITY(U,$J,1009.802,38,1,45,0)
 ;;=WARD^^101
 ;;^UTILITY(U,$J,1009.802,38,1,46,0)
 ;;=MCINTOSH^^051
 ;;^UTILITY(U,$J,1009.802,38,1,47,0)
 ;;=RICHLAND^^077
 ;;^UTILITY(U,$J,1009.802,38,1,48,0)
 ;;=WELLS^^103
 ;;^UTILITY(U,$J,1009.802,38,1,49,0)
 ;;=MCKENZIE^^053
 ;;^UTILITY(U,$J,1009.802,38,1,50,0)
 ;;=ROLETTE^^079
 ;;^UTILITY(U,$J,1009.802,38,1,51,0)
 ;;=WILLIAMS^^105
 ;;^UTILITY(U,$J,1009.802,38,1,52,0)
 ;;=MCLEAN^^055
 ;;^UTILITY(U,$J,1009.802,38,1,53,0)
 ;;=SARGENT^^081
 ;;^UTILITY(U,$J,1009.802,39,0)
 ;;=OHIO^OH^39^^1^1
 ;;^UTILITY(U,$J,1009.802,39,1,0)
 ;;=^1009.812I^89^88
 ;;^UTILITY(U,$J,1009.802,39,1,2,0)
 ;;=LOGAN^^091^091
 ;;^UTILITY(U,$J,1009.802,39,1,3,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,39,1,4,0)
 ;;=MUSKINGUM^^119
 ;;^UTILITY(U,$J,1009.802,39,1,5,0)
 ;;=ALLEN^^003
 ;;^UTILITY(U,$J,1009.802,39,1,6,0)
 ;;=HANCOCK^^063
 ;;^UTILITY(U,$J,1009.802,39,1,7,0)
 ;;=NOBLE^^121
 ;;^UTILITY(U,$J,1009.802,39,1,8,0)
 ;;=ASHLAND^^005
 ;;^UTILITY(U,$J,1009.802,39,1,9,0)
 ;;=HARDIN^^065
 ;;^UTILITY(U,$J,1009.802,39,1,10,0)
 ;;=OTTAWA^^123
 ;;^UTILITY(U,$J,1009.802,39,1,11,0)
 ;;=ASHTABULA^^007
 ;;^UTILITY(U,$J,1009.802,39,1,12,0)
 ;;=HARRISON^^067
 ;;^UTILITY(U,$J,1009.802,39,1,13,0)
 ;;=PAULDING^^125
 ;;^UTILITY(U,$J,1009.802,39,1,14,0)
 ;;=ATHENS^^009
 ;;^UTILITY(U,$J,1009.802,39,1,15,0)
 ;;=HENRY^^069
 ;;^UTILITY(U,$J,1009.802,39,1,16,0)
 ;;=PERRY^^127
 ;;^UTILITY(U,$J,1009.802,39,1,17,0)
 ;;=AUGLAIZE^^011
 ;;^UTILITY(U,$J,1009.802,39,1,18,0)
 ;;=HIGHLAND^^071
 ;;^UTILITY(U,$J,1009.802,39,1,19,0)
 ;;=PICKAWAY^^129
 ;;^UTILITY(U,$J,1009.802,39,1,20,0)
 ;;=BELMONT^^013
 ;;^UTILITY(U,$J,1009.802,39,1,21,0)
 ;;=HOCKING^^073
 ;;^UTILITY(U,$J,1009.802,39,1,22,0)
 ;;=PIKE^^131
 ;;^UTILITY(U,$J,1009.802,39,1,23,0)
 ;;=BROWN^^015
 ;;^UTILITY(U,$J,1009.802,39,1,24,0)
 ;;=HOLMES^^075
 ;;^UTILITY(U,$J,1009.802,39,1,25,0)
 ;;=PORTAGE^^133
 ;;^UTILITY(U,$J,1009.802,39,1,26,0)
 ;;=BUTLER^^017
 ;;^UTILITY(U,$J,1009.802,39,1,27,0)
 ;;=HURON^^077
 ;;^UTILITY(U,$J,1009.802,39,1,28,0)
 ;;=PREBLE^^135
 ;;^UTILITY(U,$J,1009.802,39,1,29,0)
 ;;=CARROLL^^019
 ;;^UTILITY(U,$J,1009.802,39,1,30,0)
 ;;=JACKSON^^079
 ;;^UTILITY(U,$J,1009.802,39,1,31,0)
 ;;=PUTNAM^^137
 ;;^UTILITY(U,$J,1009.802,39,1,32,0)
 ;;=CHAMPAIGN^^021
 ;;^UTILITY(U,$J,1009.802,39,1,33,0)
 ;;=JEFFERSON^^081
 ;;^UTILITY(U,$J,1009.802,39,1,34,0)
 ;;=RICHLAND^^139
 ;;^UTILITY(U,$J,1009.802,39,1,35,0)
 ;;=CLARK^^023
 ;;^UTILITY(U,$J,1009.802,39,1,36,0)
 ;;=KNOX^^083
 ;;^UTILITY(U,$J,1009.802,39,1,37,0)
 ;;=ROSS^^141
 ;;^UTILITY(U,$J,1009.802,39,1,38,0)
 ;;=CLERMONT^^025
 ;;^UTILITY(U,$J,1009.802,39,1,39,0)
 ;;=LAKE^^085
 ;;^UTILITY(U,$J,1009.802,39,1,40,0)
 ;;=SANDUSKY^^143
 ;;^UTILITY(U,$J,1009.802,39,1,41,0)
 ;;=CLINTON^^027
 ;;^UTILITY(U,$J,1009.802,39,1,42,0)
 ;;=LAWRENCE^^087
 ;;^UTILITY(U,$J,1009.802,39,1,43,0)
 ;;=SCIOTO^^145
 ;;^UTILITY(U,$J,1009.802,39,1,44,0)
 ;;=COLUMBIANA^^029
 ;;^UTILITY(U,$J,1009.802,39,1,45,0)
 ;;=LICKING^^089
 ;;^UTILITY(U,$J,1009.802,39,1,46,0)
 ;;=SENECA^^147
 ;;^UTILITY(U,$J,1009.802,39,1,47,0)
 ;;=COSHOCTON^^031
 ;;^UTILITY(U,$J,1009.802,39,1,48,0)
 ;;=SHELBY^^149
 ;;^UTILITY(U,$J,1009.802,39,1,49,0)
 ;;=CRAWFORD^^033
 ;;^UTILITY(U,$J,1009.802,39,1,50,0)
 ;;=LORAIN^^093
 ;;^UTILITY(U,$J,1009.802,39,1,51,0)
 ;;=STARK^^151
 ;;^UTILITY(U,$J,1009.802,39,1,52,0)
 ;;=CUYAHOGA^^035
 ;;^UTILITY(U,$J,1009.802,39,1,53,0)
 ;;=LUCAS^^095
 ;;^UTILITY(U,$J,1009.802,39,1,54,0)
 ;;=SUMMIT^^153
 ;;^UTILITY(U,$J,1009.802,39,1,55,0)
 ;;=DARKE^^037
 ;;^UTILITY(U,$J,1009.802,39,1,56,0)
 ;;=MADISON^^097
 ;;^UTILITY(U,$J,1009.802,39,1,57,0)
 ;;=TRUMBULL^^155
 ;;^UTILITY(U,$J,1009.802,39,1,58,0)
 ;;=DEFIANCE^^039
 ;;^UTILITY(U,$J,1009.802,39,1,59,0)
 ;;=MAHONING^^099
 ;;^UTILITY(U,$J,1009.802,39,1,60,0)
 ;;=TUSCARAWAS^^157
 ;;^UTILITY(U,$J,1009.802,39,1,61,0)
 ;;=DELAWARE^^041
 ;;^UTILITY(U,$J,1009.802,39,1,62,0)
 ;;=MARION^^101
 ;;^UTILITY(U,$J,1009.802,39,1,63,0)
 ;;=UNION^^159
 ;;^UTILITY(U,$J,1009.802,39,1,64,0)
 ;;=ERIE^^043
 ;;^UTILITY(U,$J,1009.802,39,1,65,0)
 ;;=MEDINA^^103
 ;;^UTILITY(U,$J,1009.802,39,1,66,0)
 ;;=VAN WERT^^161
 ;;^UTILITY(U,$J,1009.802,39,1,67,0)
 ;;=FAIRFIELD^^045
 ;;^UTILITY(U,$J,1009.802,39,1,68,0)
 ;;=MEIGS^^105
 ;;^UTILITY(U,$J,1009.802,39,1,69,0)
 ;;=VINTON^^163
 ;;^UTILITY(U,$J,1009.802,39,1,70,0)
 ;;=FAYETTE^^047
 ;;^UTILITY(U,$J,1009.802,39,1,71,0)
 ;;=MERCER^^107
 ;;^UTILITY(U,$J,1009.802,39,1,72,0)
 ;;=WARREN^^165
 ;;^UTILITY(U,$J,1009.802,39,1,73,0)
 ;;=FRANKLIN^^049
 ;;^UTILITY(U,$J,1009.802,39,1,74,0)
 ;;=MIAMI^^109
 ;;^UTILITY(U,$J,1009.802,39,1,75,0)
 ;;=WASHINGTON^^167
 ;;^UTILITY(U,$J,1009.802,39,1,76,0)
 ;;=FULTON^^051
 ;;^UTILITY(U,$J,1009.802,39,1,77,0)
 ;;=MONROE^^111
 ;;^UTILITY(U,$J,1009.802,39,1,78,0)
 ;;=WAYNE^^169
 ;;^UTILITY(U,$J,1009.802,39,1,79,0)
 ;;=GALLIA^^053
 ;;^UTILITY(U,$J,1009.802,39,1,80,0)
 ;;=MONTGOMERY^^113
 ;;^UTILITY(U,$J,1009.802,39,1,81,0)
 ;;=WILLIAMS^^171
 ;;^UTILITY(U,$J,1009.802,39,1,82,0)
 ;;=GEAUGA^^055
 ;;^UTILITY(U,$J,1009.802,39,1,83,0)
 ;;=MORGAN^^115
 ;;^UTILITY(U,$J,1009.802,39,1,84,0)
 ;;=WOOD^^173
 ;;^UTILITY(U,$J,1009.802,39,1,85,0)
 ;;=GREENE^^057
 ;;^UTILITY(U,$J,1009.802,39,1,86,0)
 ;;=MORROW^^117
 ;;^UTILITY(U,$J,1009.802,39,1,87,0)
 ;;=WYANDOT^^175
 ;;^UTILITY(U,$J,1009.802,39,1,88,0)
 ;;=GUERNSEY^^059
 ;;^UTILITY(U,$J,1009.802,39,1,89,0)
 ;;=HAMILTON^^061
 ;;^UTILITY(U,$J,1009.802,40,0)
 ;;=OKLAHOMA^OK^40^^1^1
 ;;^UTILITY(U,$J,1009.802,40,1,0)
 ;;=^1009.812I^77^77
 ;;^UTILITY(U,$J,1009.802,40,1,1,0)
 ;;=KAY^^071^4
 ;;^UTILITY(U,$J,1009.802,40,1,2,0)
 ;;=CIMARRON^^025^4
 ;;^UTILITY(U,$J,1009.802,40,1,3,0)
 ;;=TEXAS^^139^4
 ;;^UTILITY(U,$J,1009.802,40,1,4,0)
 ;;=BEAVER^^007^4
 ;;^UTILITY(U,$J,1009.802,40,1,5,0)
 ;;=HARPER^^059^4
 ;;^UTILITY(U,$J,1009.802,40,1,6,0)
 ;;=ELLIS^^045^4
 ;;^UTILITY(U,$J,1009.802,40,1,7,0)
 ;;=ROGER MILLS^^129^4
 ;;^UTILITY(U,$J,1009.802,40,1,8,0)
 ;;=BECKHAM^^009^4
 ;;^UTILITY(U,$J,1009.802,40,1,9,0)
 ;;=GREER^^055^4
 ;;^UTILITY(U,$J,1009.802,40,1,10,0)
 ;;=HARMON^^057^4
 ;;^UTILITY(U,$J,1009.802,40,1,11,0)
 ;;=JACKSON^^065^4
 ;;^UTILITY(U,$J,1009.802,40,1,12,0)
 ;;=NOWATA^^105^5
 ;;^UTILITY(U,$J,1009.802,40,1,13,0)
 ;;=CRAIG^^035^5
 ;;^UTILITY(U,$J,1009.802,40,1,14,0)
 ;;=OTTAWA^^115^5
 ;;^UTILITY(U,$J,1009.802,40,1,15,0)
 ;;=MAYES^^097^5
 ;;^UTILITY(U,$J,1009.802,40,1,16,0)
 ;;=DELAWARE^^041^6
 ;;^UTILITY(U,$J,1009.802,40,1,17,0)
 ;;=CHEROKEE^^021^5
 ;;^UTILITY(U,$J,1009.802,40,1,18,0)
 ;;=ADAIR^^001^6
 ;;^UTILITY(U,$J,1009.802,40,1,19,0)
 ;;=SEQUOYAH^^135^5
 ;;^UTILITY(U,$J,1009.802,40,1,20,0)
 ;;=LE FLORE^^079^5
 ;;^UTILITY(U,$J,1009.802,40,1,21,0)
 ;;=PUSHMATAHA^^127^5
 ;;^UTILITY(U,$J,1009.802,40,1,22,0)
 ;;=MCCURTAIN^^089^5
 ;;^UTILITY(U,$J,1009.802,40,1,23,0)
 ;;=CHOCTAW^^023^5
 ;;^UTILITY(U,$J,1009.802,40,1,24,0)
 ;;=WOODS^^151^4
 ;;^UTILITY(U,$J,1009.802,40,1,25,0)
 ;;=WOODWARD^^153^4
 ;;^UTILITY(U,$J,1009.802,40,1,26,0)
 ;;=DEWEY^^043^3
 ;;^UTILITY(U,$J,1009.802,40,1,27,0)
 ;;=CUSTER^^039^3
 ;;^UTILITY(U,$J,1009.802,40,1,28,0)
 ;;=WASHITA^^149^3
 ;;^UTILITY(U,$J,1009.802,40,1,29,0)
 ;;=KIOWA^^075^3
 ;;^UTILITY(U,$J,1009.802,40,1,30,0)
 ;;=TILLMAN^^141^4
 ;;^UTILITY(U,$J,1009.802,40,1,31,0)
 ;;=ALFALFA^^003^4
 ;;^UTILITY(U,$J,1009.802,40,1,32,0)
 ;;=MAJOR^^093^3
 ;;^UTILITY(U,$J,1009.802,40,1,33,0)
 ;;=BLAINE^^011^3
 ;;^UTILITY(U,$J,1009.802,40,1,34,0)
 ;;=GRANT^^053^4
 ;;^UTILITY(U,$J,1009.802,40,1,35,0)
 ;;=OSAGE^^113^4
 ;;^UTILITY(U,$J,1009.802,40,1,36,0)
 ;;=WASHINGTON^^147^5
 ;;^UTILITY(U,$J,1009.802,40,1,37,0)
 ;;=TULSA^^143^5
 ;;^UTILITY(U,$J,1009.802,40,1,38,0)
 ;;=ROGERS^^131^5
 ;;^UTILITY(U,$J,1009.802,40,1,39,0)
 ;;=WAGONER^^145^5
 ;;^UTILITY(U,$J,1009.802,40,1,40,0)
 ;;=MUSKOGEE^^101^5
 ;;^UTILITY(U,$J,1009.802,40,1,41,0)
 ;;=MCINTOSH^^091^5
 ;;^UTILITY(U,$J,1009.802,40,1,42,0)
 ;;=HASKELL^^061^5
 ;;^UTILITY(U,$J,1009.802,40,1,43,0)
 ;;=PITTSBURG^^121^5
 ;;^UTILITY(U,$J,1009.802,40,1,44,0)
 ;;=LATIMER^^077^5
 ;;^UTILITY(U,$J,1009.802,40,1,45,0)
 ;;=COAL^^029^5
 ;;^UTILITY(U,$J,1009.802,40,1,46,0)
 ;;=ATOKA^^005^5
 ;;^UTILITY(U,$J,1009.802,40,1,47,0)
 ;;=JOHNSTON^^069^4
 ;;^UTILITY(U,$J,1009.802,40,1,48,0)
 ;;=MARSHALL^^095^4
 ;;^UTILITY(U,$J,1009.802,40,1,49,0)
 ;;=BRYAN^^013^5
 ;;^UTILITY(U,$J,1009.802,40,1,50,0)
 ;;=CARTER^^019^4
 ;;^UTILITY(U,$J,1009.802,40,1,51,0)
 ;;=JEFFERSON^^067^4
 ;;^UTILITY(U,$J,1009.802,40,1,52,0)
 ;;=COTTON^^033^4
 ;;^UTILITY(U,$J,1009.802,40,1,53,0)
 ;;=LOVE^^085^4
 ;;^UTILITY(U,$J,1009.802,40,1,54,0)
 ;;=CADDO^^015^3
 ;;^UTILITY(U,$J,1009.802,40,1,55,0)
 ;;=COMANCHE^^031^3
 ;;^UTILITY(U,$J,1009.802,40,1,56,0)
 ;;=STEPHENS^^137^3
 ;;^UTILITY(U,$J,1009.802,40,1,57,0)
 ;;=GARVIN^^049^3
 ;;^UTILITY(U,$J,1009.802,40,1,58,0)
 ;;=MURRAY^^099^3
 ;;^UTILITY(U,$J,1009.802,40,1,59,0)
 ;;=PONTOTOC^^123^3
 ;;^UTILITY(U,$J,1009.802,40,1,60,0)
 ;;=HUGHES^^063^5
 ;;^UTILITY(U,$J,1009.802,40,1,61,0)
 ;;=SEMINOLE^^133^3
 ;;^UTILITY(U,$J,1009.802,40,1,62,0)
 ;;=OKFUSKEE^^107^3
 ;;^UTILITY(U,$J,1009.802,40,1,63,0)
 ;;=OKMULGEE^^111^5
 ;;^UTILITY(U,$J,1009.802,40,1,64,0)
 ;;=CREEK^^037^5
 ;;^UTILITY(U,$J,1009.802,40,1,65,0)
 ;;=PAWNEE^^117^3
 ;;^UTILITY(U,$J,1009.802,40,1,66,0)
 ;;=NOBLE^^103^3
 ;;^UTILITY(U,$J,1009.802,40,1,67,0)
 ;;=GARFIELD^^047^3
 ;;^UTILITY(U,$J,1009.802,40,1,68,0)
 ;;=KINGFISHER^^073^2
 ;;^UTILITY(U,$J,1009.802,40,1,69,0)
 ;;=CANADIAN^^017^2
 ;;^UTILITY(U,$J,1009.802,40,1,70,0)
 ;;=GRADY^^051^2
 ;;^UTILITY(U,$J,1009.802,40,1,71,0)
 ;;=MCCLAIN^^087^2
 ;;^UTILITY(U,$J,1009.802,40,1,72,0)
 ;;=CLEVELAND^^027^2
 ;;^UTILITY(U,$J,1009.802,40,1,73,0)
 ;;=POTTAWATOMIE^^125^2
 ;;^UTILITY(U,$J,1009.802,40,1,74,0)
 ;;=LINCOLN^^081^2
 ;;^UTILITY(U,$J,1009.802,40,1,75,0)
 ;;=PAYNE^^119^2
 ;;^UTILITY(U,$J,1009.802,40,1,76,0)
 ;;=LOGAN^^083^2
 ;;^UTILITY(U,$J,1009.802,40,1,77,0)
 ;;=OKLAHOMA^^109^1
 ;;^UTILITY(U,$J,1009.802,40,1,77,1,0)
 ;;=^1009.822^2^2
 ;;^UTILITY(U,$J,1009.802,40,1,77,1,1,0)
 ;;=73120
 ;;^UTILITY(U,$J,1009.802,40,1,77,1,2,0)
 ;;=73104
 ;;^UTILITY(U,$J,1009.802,41,0)
 ;;=OREGON^OR^41^^1^1
 ;;^UTILITY(U,$J,1009.802,41,1,0)
 ;;=^1009.812I^36^36
 ;;^UTILITY(U,$J,1009.802,41,1,1,0)
 ;;=LINCOLN^^041^041
 ;;^UTILITY(U,$J,1009.802,41,1,2,0)
 ;;=BAKER^^001
 ;;^UTILITY(U,$J,1009.802,41,1,3,0)
 ;;=HARNEY^^025
 ;;^UTILITY(U,$J,1009.802,41,1,4,0)
 ;;=MORROW^^049
 ;;^UTILITY(U,$J,1009.802,41,1,5,0)
 ;;=BENTON^^003
 ;;^UTILITY(U,$J,1009.802,41,1,6,0)
 ;;=HOOD RIVER^^027
 ;;^UTILITY(U,$J,1009.802,41,1,7,0)
 ;;=MULTNOMAH^^051
 ;;^UTILITY(U,$J,1009.802,41,1,8,0)
 ;;=CLACKAMAS^^005
 ;;^UTILITY(U,$J,1009.802,41,1,9,0)
 ;;=JACKSON^^029
 ;;^UTILITY(U,$J,1009.802,41,1,10,0)
 ;;=POLK^^053

DMUFI00D
DMUFI00D ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,41,1,11,0)
 ;;=CLATSOP^^007
 ;;^UTILITY(U,$J,1009.802,41,1,12,0)
 ;;=JEFFERSON^^031
 ;;^UTILITY(U,$J,1009.802,41,1,13,0)
 ;;=SHERMAN^^055
 ;;^UTILITY(U,$J,1009.802,41,1,14,0)
 ;;=COLUMBIA^^009
 ;;^UTILITY(U,$J,1009.802,41,1,15,0)
 ;;=JOSEPHINE^^033
 ;;^UTILITY(U,$J,1009.802,41,1,16,0)
 ;;=TILLAMOOK^^057
 ;;^UTILITY(U,$J,1009.802,41,1,17,0)
 ;;=COOS^^011
 ;;^UTILITY(U,$J,1009.802,41,1,18,0)
 ;;=KLAMATH^^035
 ;;^UTILITY(U,$J,1009.802,41,1,19,0)
 ;;=UMATILLA^^059
 ;;^UTILITY(U,$J,1009.802,41,1,20,0)
 ;;=CROOK^^013
 ;;^UTILITY(U,$J,1009.802,41,1,21,0)
 ;;=LAKE^^037
 ;;^UTILITY(U,$J,1009.802,41,1,22,0)
 ;;=UNION^^061
 ;;^UTILITY(U,$J,1009.802,41,1,23,0)
 ;;=CURRY^^015
 ;;^UTILITY(U,$J,1009.802,41,1,24,0)
 ;;=LANE^^039
 ;;^UTILITY(U,$J,1009.802,41,1,25,0)
 ;;=WALLOWA^^063
 ;;^UTILITY(U,$J,1009.802,41,1,26,0)
 ;;=DESCHUTES^^017
 ;;^UTILITY(U,$J,1009.802,41,1,27,0)
 ;;=WASCO^^065
 ;;^UTILITY(U,$J,1009.802,41,1,28,0)
 ;;=DOUGLAS^^019
 ;;^UTILITY(U,$J,1009.802,41,1,29,0)
 ;;=LINN^^043
 ;;^UTILITY(U,$J,1009.802,41,1,30,0)
 ;;=WASHINGTON^^067
 ;;^UTILITY(U,$J,1009.802,41,1,31,0)
 ;;=GILLIAM^^021
 ;;^UTILITY(U,$J,1009.802,41,1,32,0)
 ;;=MALHEUR^^045
 ;;^UTILITY(U,$J,1009.802,41,1,33,0)
 ;;=WHEELER^^069
 ;;^UTILITY(U,$J,1009.802,41,1,34,0)
 ;;=GRANT^^023
 ;;^UTILITY(U,$J,1009.802,41,1,35,0)
 ;;=MARION^^047
 ;;^UTILITY(U,$J,1009.802,41,1,36,0)
 ;;=YAMHILL^^071
 ;;^UTILITY(U,$J,1009.802,42,0)
 ;;=PENNSYLVANIA^PA^42^^1^1
 ;;^UTILITY(U,$J,1009.802,42,1,0)
 ;;=^1009.812I^67^67
 ;;^UTILITY(U,$J,1009.802,42,1,1,0)
 ;;=PHILADELPHIA^^101^101
 ;;^UTILITY(U,$J,1009.802,42,1,2,0)
 ;;=BUCKS^^017^017
 ;;^UTILITY(U,$J,1009.802,42,1,3,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,42,1,4,0)
 ;;=BEDFORD^^009
 ;;^UTILITY(U,$J,1009.802,42,1,5,0)
 ;;=ALLEGHENY^^003
 ;;^UTILITY(U,$J,1009.802,42,1,6,0)
 ;;=BERKS^^011
 ;;^UTILITY(U,$J,1009.802,42,1,7,0)
 ;;=BUTLER^^019
 ;;^UTILITY(U,$J,1009.802,42,1,8,0)
 ;;=ARMSTRONG^^005
 ;;^UTILITY(U,$J,1009.802,42,1,9,0)
 ;;=BLAIR^^013
 ;;^UTILITY(U,$J,1009.802,42,1,10,0)
 ;;=CAMBRIA^^021
 ;;^UTILITY(U,$J,1009.802,42,1,11,0)
 ;;=BEAVER^^007
 ;;^UTILITY(U,$J,1009.802,42,1,12,0)
 ;;=BRADFORD^^015
 ;;^UTILITY(U,$J,1009.802,42,1,13,0)
 ;;=CAMERON^^023
 ;;^UTILITY(U,$J,1009.802,42,1,14,0)
 ;;=CARBON^^025
 ;;^UTILITY(U,$J,1009.802,42,1,15,0)
 ;;=INDIANA^^063
 ;;^UTILITY(U,$J,1009.802,42,1,16,0)
 ;;=PERRY^^099
 ;;^UTILITY(U,$J,1009.802,42,1,17,0)
 ;;=CENTRE^^027
 ;;^UTILITY(U,$J,1009.802,42,1,18,0)
 ;;=JEFFERSON^^065
 ;;^UTILITY(U,$J,1009.802,42,1,19,0)
 ;;=CHESTER^^029
 ;;^UTILITY(U,$J,1009.802,42,1,20,0)
 ;;=JUNIATA^^067
 ;;^UTILITY(U,$J,1009.802,42,1,21,0)
 ;;=PIKE^^103
 ;;^UTILITY(U,$J,1009.802,42,1,22,0)
 ;;=CLARION^^031
 ;;^UTILITY(U,$J,1009.802,42,1,23,0)
 ;;=LACKAWANNA^^069
 ;;^UTILITY(U,$J,1009.802,42,1,24,0)
 ;;=POTTER^^105
 ;;^UTILITY(U,$J,1009.802,42,1,25,0)
 ;;=CLEARFIELD^^033
 ;;^UTILITY(U,$J,1009.802,42,1,26,0)
 ;;=LANCASTER^^071
 ;;^UTILITY(U,$J,1009.802,42,1,27,0)
 ;;=SCHUYLKILL^^107
 ;;^UTILITY(U,$J,1009.802,42,1,28,0)
 ;;=CLINTON^^035
 ;;^UTILITY(U,$J,1009.802,42,1,29,0)
 ;;=LAWRENCE^^073
 ;;^UTILITY(U,$J,1009.802,42,1,30,0)
 ;;=SNYDER^^109
 ;;^UTILITY(U,$J,1009.802,42,1,31,0)
 ;;=COLUMBIA^^037
 ;;^UTILITY(U,$J,1009.802,42,1,32,0)
 ;;=LEBANON^^075
 ;;^UTILITY(U,$J,1009.802,42,1,33,0)
 ;;=SOMERSET^^111
 ;;^UTILITY(U,$J,1009.802,42,1,34,0)
 ;;=CRAWFORD^^039
 ;;^UTILITY(U,$J,1009.802,42,1,35,0)
 ;;=LEHIGH^^077
 ;;^UTILITY(U,$J,1009.802,42,1,36,0)
 ;;=SULLIVAN^^113
 ;;^UTILITY(U,$J,1009.802,42,1,37,0)
 ;;=CUMBERLAND^^041
 ;;^UTILITY(U,$J,1009.802,42,1,38,0)
 ;;=LUZERNE^^079
 ;;^UTILITY(U,$J,1009.802,42,1,39,0)
 ;;=SUSQUEHANNA^^115
 ;;^UTILITY(U,$J,1009.802,42,1,40,0)
 ;;=DAUPHIN^^043
 ;;^UTILITY(U,$J,1009.802,42,1,41,0)
 ;;=LYCOMING^^081
 ;;^UTILITY(U,$J,1009.802,42,1,42,0)
 ;;=TIOGA^^117
 ;;^UTILITY(U,$J,1009.802,42,1,43,0)
 ;;=DELAWARE^^045
 ;;^UTILITY(U,$J,1009.802,42,1,44,0)
 ;;=MCKEAN^^083
 ;;^UTILITY(U,$J,1009.802,42,1,45,0)
 ;;=UNION^^119
 ;;^UTILITY(U,$J,1009.802,42,1,46,0)
 ;;=ELK^^047
 ;;^UTILITY(U,$J,1009.802,42,1,47,0)
 ;;=VENANGO^^121
 ;;^UTILITY(U,$J,1009.802,42,1,48,0)
 ;;=ERIE^^049
 ;;^UTILITY(U,$J,1009.802,42,1,49,0)
 ;;=MIFFLIN^^087
 ;;^UTILITY(U,$J,1009.802,42,1,50,0)
 ;;=WARREN^^123
 ;;^UTILITY(U,$J,1009.802,42,1,51,0)
 ;;=FAYETTE^^051
 ;;^UTILITY(U,$J,1009.802,42,1,52,0)
 ;;=MONROE^^089
 ;;^UTILITY(U,$J,1009.802,42,1,53,0)
 ;;=WASHINGTON^^125
 ;;^UTILITY(U,$J,1009.802,42,1,54,0)
 ;;=FOREST^^053
 ;;^UTILITY(U,$J,1009.802,42,1,55,0)
 ;;=MONTGOMERY^^091
 ;;^UTILITY(U,$J,1009.802,42,1,56,0)
 ;;=WAYNE^^127
 ;;^UTILITY(U,$J,1009.802,42,1,57,0)
 ;;=FRANKLIN^^055
 ;;^UTILITY(U,$J,1009.802,42,1,58,0)
 ;;=MONTOUR^^093
 ;;^UTILITY(U,$J,1009.802,42,1,59,0)
 ;;=WESTMORELAND^^129
 ;;^UTILITY(U,$J,1009.802,42,1,60,0)
 ;;=FULTON^^057
 ;;^UTILITY(U,$J,1009.802,42,1,61,0)
 ;;=NORTHAMPTON^^095
 ;;^UTILITY(U,$J,1009.802,42,1,62,0)
 ;;=WYOMING^^131
 ;;^UTILITY(U,$J,1009.802,42,1,63,0)
 ;;=GREENE^^059
 ;;^UTILITY(U,$J,1009.802,42,1,64,0)
 ;;=NORTHUMBERLAND^^097
 ;;^UTILITY(U,$J,1009.802,42,1,65,0)
 ;;=YORK^^133
 ;;^UTILITY(U,$J,1009.802,42,1,66,0)
 ;;=HUNTINGDON^^061
 ;;^UTILITY(U,$J,1009.802,42,1,67,0)
 ;;=MERCER^^085
 ;;^UTILITY(U,$J,1009.802,44,0)
 ;;=RHODE ISLAND^RI^44^^1^1
 ;;^UTILITY(U,$J,1009.802,44,1,0)
 ;;=^1009.812I^5^5
 ;;^UTILITY(U,$J,1009.802,44,1,1,0)
 ;;=BRISTOL^^001
 ;;^UTILITY(U,$J,1009.802,44,1,2,0)
 ;;=NEWPORT^^005
 ;;^UTILITY(U,$J,1009.802,44,1,3,0)
 ;;=WASHINGTON^^009
 ;;^UTILITY(U,$J,1009.802,44,1,4,0)
 ;;=KENT^^003
 ;;^UTILITY(U,$J,1009.802,44,1,5,0)
 ;;=PROVIDENCE^^007
 ;;^UTILITY(U,$J,1009.802,45,0)
 ;;=SOUTH CAROLINA^SC^45^^1^1
 ;;^UTILITY(U,$J,1009.802,45,1,0)
 ;;=^1009.812I^46^46
 ;;^UTILITY(U,$J,1009.802,45,1,1,0)
 ;;=ABBEVILLE^^001
 ;;^UTILITY(U,$J,1009.802,45,1,2,0)
 ;;=DILLON^^033
 ;;^UTILITY(U,$J,1009.802,45,1,3,0)
 ;;=LEXINGTON^^063
 ;;^UTILITY(U,$J,1009.802,45,1,4,0)
 ;;=AIKEN^^003
 ;;^UTILITY(U,$J,1009.802,45,1,5,0)
 ;;=DORCHESTER^^035
 ;;^UTILITY(U,$J,1009.802,45,1,6,0)
 ;;=MCCORMICK^^065
 ;;^UTILITY(U,$J,1009.802,45,1,7,0)
 ;;=ALLENDALE^^005
 ;;^UTILITY(U,$J,1009.802,45,1,8,0)
 ;;=EDGEFIELD^^037
 ;;^UTILITY(U,$J,1009.802,45,1,9,0)
 ;;=MARION^^067
 ;;^UTILITY(U,$J,1009.802,45,1,10,0)
 ;;=ANDERSON^^007
 ;;^UTILITY(U,$J,1009.802,45,1,11,0)
 ;;=FAIRFIELD^^039
 ;;^UTILITY(U,$J,1009.802,45,1,12,0)
 ;;=MARLBORO^^069
 ;;^UTILITY(U,$J,1009.802,45,1,13,0)
 ;;=BAMBERG^^009
 ;;^UTILITY(U,$J,1009.802,45,1,14,0)
 ;;=FLORENCE^^041
 ;;^UTILITY(U,$J,1009.802,45,1,15,0)
 ;;=NEWBERRY^^071
 ;;^UTILITY(U,$J,1009.802,45,1,16,0)
 ;;=BARNWELL^^011
 ;;^UTILITY(U,$J,1009.802,45,1,17,0)
 ;;=GEORGETOWN^^043
 ;;^UTILITY(U,$J,1009.802,45,1,18,0)
 ;;=OCONEE^^073
 ;;^UTILITY(U,$J,1009.802,45,1,19,0)
 ;;=BEAUFORT^^013
 ;;^UTILITY(U,$J,1009.802,45,1,20,0)
 ;;=GREENVILLE^^045
 ;;^UTILITY(U,$J,1009.802,45,1,21,0)
 ;;=ORANGEBURG^^075
 ;;^UTILITY(U,$J,1009.802,45,1,22,0)
 ;;=BERKELEY^^015
 ;;^UTILITY(U,$J,1009.802,45,1,23,0)
 ;;=GREENWOOD^^047
 ;;^UTILITY(U,$J,1009.802,45,1,24,0)
 ;;=PICKENS^^077
 ;;^UTILITY(U,$J,1009.802,45,1,25,0)
 ;;=CALHOUN^^017
 ;;^UTILITY(U,$J,1009.802,45,1,26,0)
 ;;=HAMPTON^^049
 ;;^UTILITY(U,$J,1009.802,45,1,27,0)
 ;;=RICHLAND^^079
 ;;^UTILITY(U,$J,1009.802,45,1,28,0)
 ;;=CHARLESTON^^019
 ;;^UTILITY(U,$J,1009.802,45,1,29,0)
 ;;=HORRY^^051
 ;;^UTILITY(U,$J,1009.802,45,1,30,0)
 ;;=SALUDA^^081
 ;;^UTILITY(U,$J,1009.802,45,1,31,0)
 ;;=CHEROKEE^^021
 ;;^UTILITY(U,$J,1009.802,45,1,32,0)
 ;;=JASPER^^053
 ;;^UTILITY(U,$J,1009.802,45,1,33,0)
 ;;=SPARTANBURG^^083
 ;;^UTILITY(U,$J,1009.802,45,1,34,0)
 ;;=CHESTER^^023
 ;;^UTILITY(U,$J,1009.802,45,1,35,0)
 ;;=KERSHAW^^055
 ;;^UTILITY(U,$J,1009.802,45,1,36,0)
 ;;=SUMTER^^085
 ;;^UTILITY(U,$J,1009.802,45,1,37,0)
 ;;=CHESTERFIELD^^025
 ;;^UTILITY(U,$J,1009.802,45,1,38,0)
 ;;=LANCASTER^^057
 ;;^UTILITY(U,$J,1009.802,45,1,39,0)
 ;;=UNION^^087
 ;;^UTILITY(U,$J,1009.802,45,1,40,0)
 ;;=CLARENDON^^027
 ;;^UTILITY(U,$J,1009.802,45,1,41,0)
 ;;=LAURENS^^059
 ;;^UTILITY(U,$J,1009.802,45,1,42,0)
 ;;=WILLIAMSBURG^^089
 ;;^UTILITY(U,$J,1009.802,45,1,43,0)
 ;;=COLLETON^^029
 ;;^UTILITY(U,$J,1009.802,45,1,44,0)
 ;;=LEE^^061
 ;;^UTILITY(U,$J,1009.802,45,1,45,0)
 ;;=YORK^^091
 ;;^UTILITY(U,$J,1009.802,45,1,46,0)
 ;;=DARLINGTON^^031
 ;;^UTILITY(U,$J,1009.802,46,0)
 ;;=SOUTH DAKOTA^SD^46^^1^1
 ;;^UTILITY(U,$J,1009.802,46,1,0)
 ;;=^1009.812I^67^67
 ;;^UTILITY(U,$J,1009.802,46,1,1,0)
 ;;=AURORA^^003
 ;;^UTILITY(U,$J,1009.802,46,1,2,0)
 ;;=BENNETT^^007
 ;;^UTILITY(U,$J,1009.802,46,1,3,0)
 ;;=BROOKINGS^^011
 ;;^UTILITY(U,$J,1009.802,46,1,4,0)
 ;;=BEADLE^^005
 ;;^UTILITY(U,$J,1009.802,46,1,5,0)
 ;;=BON HOMME^^009
 ;;^UTILITY(U,$J,1009.802,46,1,6,0)
 ;;=BROWN^^013
 ;;^UTILITY(U,$J,1009.802,46,1,7,0)
 ;;=BRULE^^015
 ;;^UTILITY(U,$J,1009.802,46,1,8,0)
 ;;=HAMLIN^^057
 ;;^UTILITY(U,$J,1009.802,46,1,9,0)
 ;;=MINER^^097
 ;;^UTILITY(U,$J,1009.802,46,1,10,0)
 ;;=BUFFALO^^017
 ;;^UTILITY(U,$J,1009.802,46,1,11,0)
 ;;=HAND^^059
 ;;^UTILITY(U,$J,1009.802,46,1,12,0)
 ;;=MINNEHAHA^^099
 ;;^UTILITY(U,$J,1009.802,46,1,13,0)
 ;;=BUTTE^^019
 ;;^UTILITY(U,$J,1009.802,46,1,14,0)
 ;;=HANSON^^061
 ;;^UTILITY(U,$J,1009.802,46,1,15,0)
 ;;=MOODY^^101
 ;;^UTILITY(U,$J,1009.802,46,1,16,0)
 ;;=CAMPBELL^^021
 ;;^UTILITY(U,$J,1009.802,46,1,17,0)
 ;;=HARDING^^063
 ;;^UTILITY(U,$J,1009.802,46,1,18,0)
 ;;=PENNINGTON^^103
 ;;^UTILITY(U,$J,1009.802,46,1,19,0)
 ;;=CHARLES MIX^^023
 ;;^UTILITY(U,$J,1009.802,46,1,20,0)
 ;;=HUGHES^^065
 ;;^UTILITY(U,$J,1009.802,46,1,21,0)
 ;;=PERKINS^^105
 ;;^UTILITY(U,$J,1009.802,46,1,22,0)
 ;;=CLARK^^025
 ;;^UTILITY(U,$J,1009.802,46,1,23,0)
 ;;=HUTCHINSON^^067
 ;;^UTILITY(U,$J,1009.802,46,1,24,0)
 ;;=POTTER^^107
 ;;^UTILITY(U,$J,1009.802,46,1,25,0)
 ;;=CLAY^^027
 ;;^UTILITY(U,$J,1009.802,46,1,26,0)
 ;;=HYDE^^069
 ;;^UTILITY(U,$J,1009.802,46,1,27,0)
 ;;=ROBERTS^^109
 ;;^UTILITY(U,$J,1009.802,46,1,28,0)
 ;;=CODINGTON^^029
 ;;^UTILITY(U,$J,1009.802,46,1,29,0)
 ;;=JACKSON^^071
 ;;^UTILITY(U,$J,1009.802,46,1,30,0)
 ;;=SANBORN^^111
 ;;^UTILITY(U,$J,1009.802,46,1,31,0)
 ;;=CORSON^^031
 ;;^UTILITY(U,$J,1009.802,46,1,32,0)
 ;;=JERAULD^^073
 ;;^UTILITY(U,$J,1009.802,46,1,33,0)
 ;;=SHANNON^^113
 ;;^UTILITY(U,$J,1009.802,46,1,34,0)
 ;;=CUSTER^^033
 ;;^UTILITY(U,$J,1009.802,46,1,35,0)
 ;;=JONES^^075
 ;;^UTILITY(U,$J,1009.802,46,1,36,0)
 ;;=SPINK^^115
 ;;^UTILITY(U,$J,1009.802,46,1,37,0)
 ;;=DAVISON^^035
 ;;^UTILITY(U,$J,1009.802,46,1,38,0)
 ;;=KINGSBURY^^077
 ;;^UTILITY(U,$J,1009.802,46,1,39,0)
 ;;=STANLEY^^117
 ;;^UTILITY(U,$J,1009.802,46,1,40,0)
 ;;=DAY^^037
 ;;^UTILITY(U,$J,1009.802,46,1,41,0)
 ;;=LAKE^^079
 ;;^UTILITY(U,$J,1009.802,46,1,42,0)
 ;;=SULLY^^119
 ;;^UTILITY(U,$J,1009.802,46,1,43,0)
 ;;=DEUEL^^039
 ;;^UTILITY(U,$J,1009.802,46,1,44,0)
 ;;=LAWRENCE^^081
 ;;^UTILITY(U,$J,1009.802,46,1,45,0)
 ;;=TODD^^121
 ;;^UTILITY(U,$J,1009.802,46,1,46,0)
 ;;=DEWEY^^041
 ;;^UTILITY(U,$J,1009.802,46,1,47,0)
 ;;=LINCOLN^^083
 ;;^UTILITY(U,$J,1009.802,46,1,48,0)
 ;;=TRIPP^^123
 ;;^UTILITY(U,$J,1009.802,46,1,49,0)
 ;;=DOUGLAS^^043
 ;;^UTILITY(U,$J,1009.802,46,1,50,0)
 ;;=LYMAN^^085
 ;;^UTILITY(U,$J,1009.802,46,1,51,0)
 ;;=TURNER^^125
 ;;^UTILITY(U,$J,1009.802,46,1,52,0)
 ;;=EDMUNDS^^045
 ;;^UTILITY(U,$J,1009.802,46,1,53,0)
 ;;=MCCOOK^^087
 ;;^UTILITY(U,$J,1009.802,46,1,54,0)
 ;;=UNION^^127
 ;;^UTILITY(U,$J,1009.802,46,1,55,0)
 ;;=FALL RIVER^^047
 ;;^UTILITY(U,$J,1009.802,46,1,56,0)
 ;;=MCPHERSON^^089
 ;;^UTILITY(U,$J,1009.802,46,1,57,0)
 ;;=WALWORTH^^129
 ;;^UTILITY(U,$J,1009.802,46,1,58,0)
 ;;=FAULK^^049
 ;;^UTILITY(U,$J,1009.802,46,1,59,0)
 ;;=MARSHALL^^091
 ;;^UTILITY(U,$J,1009.802,46,1,60,0)
 ;;=WASHABAUGH^^131^^3050204
 ;;^UTILITY(U,$J,1009.802,46,1,61,0)
 ;;=GRANT^^051
 ;;^UTILITY(U,$J,1009.802,46,1,62,0)
 ;;=MEADE^^093
 ;;^UTILITY(U,$J,1009.802,46,1,63,0)
 ;;=YANKTON^^135
 ;;^UTILITY(U,$J,1009.802,46,1,64,0)
 ;;=GREGORY^^053
 ;;^UTILITY(U,$J,1009.802,46,1,65,0)
 ;;=MELLETTE^^095
 ;;^UTILITY(U,$J,1009.802,46,1,66,0)
 ;;=ZIEBACH^^137
 ;;^UTILITY(U,$J,1009.802,46,1,67,0)
 ;;=HAAKON^^055
 ;;^UTILITY(U,$J,1009.802,47,0)
 ;;=TENNESSEE^TN^47^NASHVILLE^1^1
 ;;^UTILITY(U,$J,1009.802,47,1,0)
 ;;=^1009.812I^95^95
 ;;^UTILITY(U,$J,1009.802,47,1,1,0)
 ;;=DAVIDSON^DVDSN^037^037
 ;;^UTILITY(U,$J,1009.802,47,1,2,0)
 ;;=CUMBERLAND^^035^035
 ;;^UTILITY(U,$J,1009.802,47,1,3,0)
 ;;=RUTHERFORD^^149^149
 ;;^UTILITY(U,$J,1009.802,47,1,4,0)
 ;;=ANDERSON^^001
 ;;^UTILITY(U,$J,1009.802,47,1,5,0)
 ;;=FENTRESS^^049
 ;;^UTILITY(U,$J,1009.802,47,1,6,0)
 ;;=LAUDERDALE^^097
 ;;^UTILITY(U,$J,1009.802,47,1,7,0)
 ;;=BEDFORD^^003
 ;;^UTILITY(U,$J,1009.802,47,1,8,0)
 ;;=FRANKLIN^^051
 ;;^UTILITY(U,$J,1009.802,47,1,9,0)
 ;;=LAWRENCE^^099
 ;;^UTILITY(U,$J,1009.802,47,1,10,0)
 ;;=BENTON^^005
 ;;^UTILITY(U,$J,1009.802,47,1,11,0)
 ;;=GIBSON^^053
 ;;^UTILITY(U,$J,1009.802,47,1,12,0)
 ;;=LEWIS^^101
 ;;^UTILITY(U,$J,1009.802,47,1,13,0)
 ;;=BLEDSOE^^007
 ;;^UTILITY(U,$J,1009.802,47,1,14,0)
 ;;=GILES^^055
 ;;^UTILITY(U,$J,1009.802,47,1,15,0)
 ;;=LINCOLN^^103
 ;;^UTILITY(U,$J,1009.802,47,1,16,0)
 ;;=BLOUNT^^009
 ;;^UTILITY(U,$J,1009.802,47,1,17,0)
 ;;=GRAINGER^^057
 ;;^UTILITY(U,$J,1009.802,47,1,18,0)
 ;;=LOUDON^^105
 ;;^UTILITY(U,$J,1009.802,47,1,19,0)
 ;;=BRADLEY^^011
 ;;^UTILITY(U,$J,1009.802,47,1,20,0)
 ;;=GREENE^^059
 ;;^UTILITY(U,$J,1009.802,47,1,21,0)
 ;;=MCMINN^^107
 ;;^UTILITY(U,$J,1009.802,47,1,22,0)
 ;;=CAMPBELL^^013
 ;;^UTILITY(U,$J,1009.802,47,1,23,0)
 ;;=GRUNDY^^061
 ;;^UTILITY(U,$J,1009.802,47,1,24,0)
 ;;=MCNAIRY^^109
 ;;^UTILITY(U,$J,1009.802,47,1,25,0)
 ;;=CANNON^^015
 ;;^UTILITY(U,$J,1009.802,47,1,26,0)
 ;;=HAMBLEN^^063
 ;;^UTILITY(U,$J,1009.802,47,1,27,0)
 ;;=MACON^^111
 ;;^UTILITY(U,$J,1009.802,47,1,28,0)
 ;;=CARROLL^^017
 ;;^UTILITY(U,$J,1009.802,47,1,29,0)
 ;;=HAMILTON^^065
 ;;^UTILITY(U,$J,1009.802,47,1,30,0)
 ;;=MADISON^^113
 ;;^UTILITY(U,$J,1009.802,47,1,31,0)
 ;;=CARTER^^019
 ;;^UTILITY(U,$J,1009.802,47,1,32,0)
 ;;=HANCOCK^^067
 ;;^UTILITY(U,$J,1009.802,47,1,33,0)
 ;;=MARION^^115
 ;;^UTILITY(U,$J,1009.802,47,1,34,0)
 ;;=CHEATHAM^^021
 ;;^UTILITY(U,$J,1009.802,47,1,35,0)
 ;;=HARDEMAN^^069
 ;;^UTILITY(U,$J,1009.802,47,1,36,0)
 ;;=MARSHALL^^117
 ;;^UTILITY(U,$J,1009.802,47,1,37,0)
 ;;=CHESTER^^023

DMUFI00E
DMUFI00E ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,47,1,38,0)
 ;;=HARDIN^^071
 ;;^UTILITY(U,$J,1009.802,47,1,39,0)
 ;;=MAURY^^119
 ;;^UTILITY(U,$J,1009.802,47,1,40,0)
 ;;=CLAIBORNE^^025
 ;;^UTILITY(U,$J,1009.802,47,1,41,0)
 ;;=HAWKINS^^073
 ;;^UTILITY(U,$J,1009.802,47,1,42,0)
 ;;=MEIGS^^121
 ;;^UTILITY(U,$J,1009.802,47,1,43,0)
 ;;=CLAY^^027
 ;;^UTILITY(U,$J,1009.802,47,1,44,0)
 ;;=HAYWOOD^^075
 ;;^UTILITY(U,$J,1009.802,47,1,45,0)
 ;;=MONROE^^123
 ;;^UTILITY(U,$J,1009.802,47,1,46,0)
 ;;=COCKE^^029
 ;;^UTILITY(U,$J,1009.802,47,1,47,0)
 ;;=HENDERSON^^077
 ;;^UTILITY(U,$J,1009.802,47,1,48,0)
 ;;=MONTGOMERY^^125
 ;;^UTILITY(U,$J,1009.802,47,1,49,0)
 ;;=COFFEE^^031
 ;;^UTILITY(U,$J,1009.802,47,1,50,0)
 ;;=HENRY^^079
 ;;^UTILITY(U,$J,1009.802,47,1,51,0)
 ;;=MOORE^^127
 ;;^UTILITY(U,$J,1009.802,47,1,52,0)
 ;;=CROCKETT^^033
 ;;^UTILITY(U,$J,1009.802,47,1,53,0)
 ;;=HICKMAN^^081
 ;;^UTILITY(U,$J,1009.802,47,1,54,0)
 ;;=MORGAN^^129
 ;;^UTILITY(U,$J,1009.802,47,1,55,0)
 ;;=HOUSTON^^083
 ;;^UTILITY(U,$J,1009.802,47,1,56,0)
 ;;=OBION^^131
 ;;^UTILITY(U,$J,1009.802,47,1,57,0)
 ;;=HUMPHREYS^^085
 ;;^UTILITY(U,$J,1009.802,47,1,58,0)
 ;;=OVERTON^^133
 ;;^UTILITY(U,$J,1009.802,47,1,59,0)
 ;;=DECATUR^^039
 ;;^UTILITY(U,$J,1009.802,47,1,60,0)
 ;;=JACKSON^^087
 ;;^UTILITY(U,$J,1009.802,47,1,61,0)
 ;;=PERRY^^135
 ;;^UTILITY(U,$J,1009.802,47,1,62,0)
 ;;=DEKALB^^041
 ;;^UTILITY(U,$J,1009.802,47,1,63,0)
 ;;=JEFFERSON^^089
 ;;^UTILITY(U,$J,1009.802,47,1,64,0)
 ;;=PICKETT^^137
 ;;^UTILITY(U,$J,1009.802,47,1,65,0)
 ;;=DICKSON^^043
 ;;^UTILITY(U,$J,1009.802,47,1,66,0)
 ;;=JOHNSON^^091
 ;;^UTILITY(U,$J,1009.802,47,1,67,0)
 ;;=POLK^^139
 ;;^UTILITY(U,$J,1009.802,47,1,68,0)
 ;;=DYER^^045
 ;;^UTILITY(U,$J,1009.802,47,1,69,0)
 ;;=KNOX^^093
 ;;^UTILITY(U,$J,1009.802,47,1,70,0)
 ;;=PUTNAM^^141
 ;;^UTILITY(U,$J,1009.802,47,1,71,0)
 ;;=FAYETTE^^047
 ;;^UTILITY(U,$J,1009.802,47,1,72,0)
 ;;=LAKE^^095
 ;;^UTILITY(U,$J,1009.802,47,1,73,0)
 ;;=RHEA^^143
 ;;^UTILITY(U,$J,1009.802,47,1,74,0)
 ;;=ROANE^^145
 ;;^UTILITY(U,$J,1009.802,47,1,75,0)
 ;;=STEWART^^161
 ;;^UTILITY(U,$J,1009.802,47,1,76,0)
 ;;=WARREN^^177
 ;;^UTILITY(U,$J,1009.802,47,1,77,0)
 ;;=ROBERTSON^^147
 ;;^UTILITY(U,$J,1009.802,47,1,78,0)
 ;;=SULLIVAN^^163
 ;;^UTILITY(U,$J,1009.802,47,1,79,0)
 ;;=WASHINGTON^^179
 ;;^UTILITY(U,$J,1009.802,47,1,80,0)
 ;;=SUMNER^^165
 ;;^UTILITY(U,$J,1009.802,47,1,81,0)
 ;;=WAYNE^^181
 ;;^UTILITY(U,$J,1009.802,47,1,82,0)
 ;;=SCOTT^^151
 ;;^UTILITY(U,$J,1009.802,47,1,83,0)
 ;;=TIPTON^^167
 ;;^UTILITY(U,$J,1009.802,47,1,84,0)
 ;;=WEAKLEY^^183
 ;;^UTILITY(U,$J,1009.802,47,1,85,0)
 ;;=SEQUATCHIE^^153
 ;;^UTILITY(U,$J,1009.802,47,1,86,0)
 ;;=TROUSDALE^^169
 ;;^UTILITY(U,$J,1009.802,47,1,87,0)
 ;;=WHITE^^185
 ;;^UTILITY(U,$J,1009.802,47,1,88,0)
 ;;=SEVIER^^155
 ;;^UTILITY(U,$J,1009.802,47,1,89,0)
 ;;=UNICOI^^171
 ;;^UTILITY(U,$J,1009.802,47,1,90,0)
 ;;=WILLIAMSON^^187
 ;;^UTILITY(U,$J,1009.802,47,1,91,0)
 ;;=SHELBY^^157
 ;;^UTILITY(U,$J,1009.802,47,1,92,0)
 ;;=UNION^^173
 ;;^UTILITY(U,$J,1009.802,47,1,93,0)
 ;;=WILSON^^189
 ;;^UTILITY(U,$J,1009.802,47,1,94,0)
 ;;=SMITH^^159
 ;;^UTILITY(U,$J,1009.802,47,1,95,0)
 ;;=VAN BUREN^^175
 ;;^UTILITY(U,$J,1009.802,48,0)
 ;;=TEXAS^TX^48^^1^1
 ;;^UTILITY(U,$J,1009.802,48,1,0)
 ;;=^1009.812I^255^254
 ;;^UTILITY(U,$J,1009.802,48,1,1,0)
 ;;=ANDERSON^^001^001
 ;;^UTILITY(U,$J,1009.802,48,1,2,0)
 ;;=ANDREWS^^003^003
 ;;^UTILITY(U,$J,1009.802,48,1,3,0)
 ;;=ANGELINA^^005^005
 ;;^UTILITY(U,$J,1009.802,48,1,4,0)
 ;;=ARANSAS^^007^007
 ;;^UTILITY(U,$J,1009.802,48,1,5,0)
 ;;=ARCHER^^009^009
 ;;^UTILITY(U,$J,1009.802,48,1,6,0)
 ;;=ARMSTRONG^^011^011
 ;;^UTILITY(U,$J,1009.802,48,1,7,0)
 ;;=ATASCOSA^^013^013
 ;;^UTILITY(U,$J,1009.802,48,1,8,0)
 ;;=AUSTIN^^015^015
 ;;^UTILITY(U,$J,1009.802,48,1,9,0)
 ;;=BAILEY^^017^017
 ;;^UTILITY(U,$J,1009.802,48,1,10,0)
 ;;=BANDERA^^019^019
 ;;^UTILITY(U,$J,1009.802,48,1,11,0)
 ;;=BASTROP^^021^021
 ;;^UTILITY(U,$J,1009.802,48,1,12,0)
 ;;=BAYLOR^^023^023
 ;;^UTILITY(U,$J,1009.802,48,1,13,0)
 ;;=BEE^^025^025
 ;;^UTILITY(U,$J,1009.802,48,1,14,0)
 ;;=BELL^^027^027
 ;;^UTILITY(U,$J,1009.802,48,1,15,0)
 ;;=BEXAR^^029^029
 ;;^UTILITY(U,$J,1009.802,48,1,16,0)
 ;;=BLANCO^^031^031
 ;;^UTILITY(U,$J,1009.802,48,1,17,0)
 ;;=BORDEN^^033^033
 ;;^UTILITY(U,$J,1009.802,48,1,18,0)
 ;;=BOSQUE^^035^035
 ;;^UTILITY(U,$J,1009.802,48,1,19,0)
 ;;=BOWIE^^037^037
 ;;^UTILITY(U,$J,1009.802,48,1,20,0)
 ;;=BRAZORIA^^039^039
 ;;^UTILITY(U,$J,1009.802,48,1,21,0)
 ;;=BRAZOS^^041^041
 ;;^UTILITY(U,$J,1009.802,48,1,22,0)
 ;;=BREWSTER^^043^043
 ;;^UTILITY(U,$J,1009.802,48,1,23,0)
 ;;=BRISCOE^^045^045
 ;;^UTILITY(U,$J,1009.802,48,1,24,0)
 ;;=BROOKS^^047^047
 ;;^UTILITY(U,$J,1009.802,48,1,25,0)
 ;;=BROWN^^049^049
 ;;^UTILITY(U,$J,1009.802,48,1,26,0)
 ;;=BURLESON^^051^051
 ;;^UTILITY(U,$J,1009.802,48,1,27,0)
 ;;=BURNET^^053^053
 ;;^UTILITY(U,$J,1009.802,48,1,28,0)
 ;;=CALDWELL^^055^055
 ;;^UTILITY(U,$J,1009.802,48,1,29,0)
 ;;=CALHOUN^^057^057
 ;;^UTILITY(U,$J,1009.802,48,1,30,0)
 ;;=CALLAHAN^^059^059
 ;;^UTILITY(U,$J,1009.802,48,1,31,0)
 ;;=CAMERON^^061^061
 ;;^UTILITY(U,$J,1009.802,48,1,32,0)
 ;;=CAMP^^063^063
 ;;^UTILITY(U,$J,1009.802,48,1,33,0)
 ;;=CARSON^^065^065
 ;;^UTILITY(U,$J,1009.802,48,1,34,0)
 ;;=CASS^^067^067
 ;;^UTILITY(U,$J,1009.802,48,1,35,0)
 ;;=CASTRO^^069^069
 ;;^UTILITY(U,$J,1009.802,48,1,36,0)
 ;;=CHAMBERS^^071^071
 ;;^UTILITY(U,$J,1009.802,48,1,37,0)
 ;;=CHEROKEE^^073^073
 ;;^UTILITY(U,$J,1009.802,48,1,38,0)
 ;;=CHILDRESS^^075^075
 ;;^UTILITY(U,$J,1009.802,48,1,39,0)
 ;;=CLAY^^077^077
 ;;^UTILITY(U,$J,1009.802,48,1,40,0)
 ;;=COCHRAN^^079^079
 ;;^UTILITY(U,$J,1009.802,48,1,41,0)
 ;;=COKE^^081^081
 ;;^UTILITY(U,$J,1009.802,48,1,42,0)
 ;;=COLEMAN^^083^083
 ;;^UTILITY(U,$J,1009.802,48,1,43,0)
 ;;=COLLIN^^085^085
 ;;^UTILITY(U,$J,1009.802,48,1,44,0)
 ;;=COLLINGSWORTH^^087^087
 ;;^UTILITY(U,$J,1009.802,48,1,45,0)
 ;;=COLORADO^^089^089
 ;;^UTILITY(U,$J,1009.802,48,1,46,0)
 ;;=COMAL^^091^091
 ;;^UTILITY(U,$J,1009.802,48,1,47,0)
 ;;=COMANCHE^^093^093
 ;;^UTILITY(U,$J,1009.802,48,1,48,0)
 ;;=CONCHO^^095^095
 ;;^UTILITY(U,$J,1009.802,48,1,49,0)
 ;;=COOKE^^097^097
 ;;^UTILITY(U,$J,1009.802,48,1,50,0)
 ;;=CORYELL^^099^099
 ;;^UTILITY(U,$J,1009.802,48,1,51,0)
 ;;=COTTLE^^101^101
 ;;^UTILITY(U,$J,1009.802,48,1,52,0)
 ;;=CRANE^^103^103
 ;;^UTILITY(U,$J,1009.802,48,1,53,0)
 ;;=CROCKETT^^105^105
 ;;^UTILITY(U,$J,1009.802,48,1,54,0)
 ;;=CROSBY^^107^107
 ;;^UTILITY(U,$J,1009.802,48,1,55,0)
 ;;=CULBERSON^^109^109
 ;;^UTILITY(U,$J,1009.802,48,1,56,0)
 ;;=DALLAM^^111^111
 ;;^UTILITY(U,$J,1009.802,48,1,57,0)
 ;;=DALLAS^^113^113
 ;;^UTILITY(U,$J,1009.802,48,1,58,0)
 ;;=DAWSON^^115^115
 ;;^UTILITY(U,$J,1009.802,48,1,59,0)
 ;;=DEAF SMITH^^117^117
 ;;^UTILITY(U,$J,1009.802,48,1,60,0)
 ;;=DELTA^^119^119
 ;;^UTILITY(U,$J,1009.802,48,1,61,0)
 ;;=DENTON^^121^121
 ;;^UTILITY(U,$J,1009.802,48,1,62,0)
 ;;=DEWITT^^123^123
 ;;^UTILITY(U,$J,1009.802,48,1,63,0)
 ;;=DICKENS^^125^125
 ;;^UTILITY(U,$J,1009.802,48,1,64,0)
 ;;=DIMMIT^^127^127
 ;;^UTILITY(U,$J,1009.802,48,1,65,0)
 ;;=DONLEY^^129^129
 ;;^UTILITY(U,$J,1009.802,48,1,66,0)
 ;;=DUVAL^^131^131
 ;;^UTILITY(U,$J,1009.802,48,1,67,0)
 ;;=EASTLAND^^133^133
 ;;^UTILITY(U,$J,1009.802,48,1,68,0)
 ;;=ECTOR^^135^135
 ;;^UTILITY(U,$J,1009.802,48,1,69,0)
 ;;=EDWARDS^^137^137
 ;;^UTILITY(U,$J,1009.802,48,1,70,0)
 ;;=ELLIS^^139^139
 ;;^UTILITY(U,$J,1009.802,48,1,71,0)
 ;;=EL PASO^^141^141
 ;;^UTILITY(U,$J,1009.802,48,1,72,0)
 ;;=ERATH^^143^143
 ;;^UTILITY(U,$J,1009.802,48,1,73,0)
 ;;=FALLS^^145^145
 ;;^UTILITY(U,$J,1009.802,48,1,74,0)
 ;;=FANNIN^^147^147
 ;;^UTILITY(U,$J,1009.802,48,1,75,0)
 ;;=FAYETTE^^149^149
 ;;^UTILITY(U,$J,1009.802,48,1,76,0)
 ;;=FISHER^^151^151
 ;;^UTILITY(U,$J,1009.802,48,1,77,0)
 ;;=FLOYD^^153^153
 ;;^UTILITY(U,$J,1009.802,48,1,78,0)
 ;;=FOARD^^155^155
 ;;^UTILITY(U,$J,1009.802,48,1,79,0)
 ;;=FORT BEND^^157^157
 ;;^UTILITY(U,$J,1009.802,48,1,80,0)
 ;;=FRANKLIN^^159^159
 ;;^UTILITY(U,$J,1009.802,48,1,81,0)
 ;;=FREESTONE^^161^161
 ;;^UTILITY(U,$J,1009.802,48,1,82,0)
 ;;=FRIO^^163^163
 ;;^UTILITY(U,$J,1009.802,48,1,83,0)
 ;;=GAINES^^165^165
 ;;^UTILITY(U,$J,1009.802,48,1,84,0)
 ;;=GALVESTON^^167^167
 ;;^UTILITY(U,$J,1009.802,48,1,85,0)
 ;;=GARZA^^169^169
 ;;^UTILITY(U,$J,1009.802,48,1,86,0)
 ;;=GILLESPIE^^171^171
 ;;^UTILITY(U,$J,1009.802,48,1,87,0)
 ;;=GLASSCOCK^^173^173
 ;;^UTILITY(U,$J,1009.802,48,1,88,0)
 ;;=GOLIAD^^175^175
 ;;^UTILITY(U,$J,1009.802,48,1,89,0)
 ;;=GONZALES^^177^177
 ;;^UTILITY(U,$J,1009.802,48,1,90,0)
 ;;=GRAY^^179^179
 ;;^UTILITY(U,$J,1009.802,48,1,91,0)
 ;;=GRAYSON^^181^181
 ;;^UTILITY(U,$J,1009.802,48,1,92,0)
 ;;=GREGG^^183^183
 ;;^UTILITY(U,$J,1009.802,48,1,93,0)
 ;;=GRIMES^^185^185
 ;;^UTILITY(U,$J,1009.802,48,1,94,0)
 ;;=GUADALUPE^^187^187
 ;;^UTILITY(U,$J,1009.802,48,1,95,0)
 ;;=HALE^^189^189
 ;;^UTILITY(U,$J,1009.802,48,1,96,0)
 ;;=HALL^^191^191
 ;;^UTILITY(U,$J,1009.802,48,1,97,0)
 ;;=HAMILTON^^193^193
 ;;^UTILITY(U,$J,1009.802,48,1,98,0)
 ;;=HANSFORD^^195^195
 ;;^UTILITY(U,$J,1009.802,48,1,99,0)
 ;;=HARDEMAN^^197^197
 ;;^UTILITY(U,$J,1009.802,48,1,100,0)
 ;;=HARDIN^^199^199
 ;;^UTILITY(U,$J,1009.802,48,1,101,0)
 ;;=HARRIS^^201^201
 ;;^UTILITY(U,$J,1009.802,48,1,102,0)
 ;;=HARRISON^^203^203
 ;;^UTILITY(U,$J,1009.802,48,1,103,0)
 ;;=HARTLEY^^205^205
 ;;^UTILITY(U,$J,1009.802,48,1,104,0)
 ;;=HASKELL^^207^207
 ;;^UTILITY(U,$J,1009.802,48,1,105,0)
 ;;=HAYS^^209^209
 ;;^UTILITY(U,$J,1009.802,48,1,106,0)
 ;;=HEMPHILL^^211^211
 ;;^UTILITY(U,$J,1009.802,48,1,107,0)
 ;;=HENDERSON^^213^213
 ;;^UTILITY(U,$J,1009.802,48,1,108,0)
 ;;=HIDALGO^^215^215
 ;;^UTILITY(U,$J,1009.802,48,1,109,0)
 ;;=HILL^^217^217
 ;;^UTILITY(U,$J,1009.802,48,1,110,0)
 ;;=HOCKLEY^^219^219
 ;;^UTILITY(U,$J,1009.802,48,1,111,0)
 ;;=HOOD^^221^221
 ;;^UTILITY(U,$J,1009.802,48,1,112,0)
 ;;=HOPKINS^^223^223
 ;;^UTILITY(U,$J,1009.802,48,1,113,0)
 ;;=HOUSTON^^225^225
 ;;^UTILITY(U,$J,1009.802,48,1,114,0)
 ;;=HOWARD^^227^227
 ;;^UTILITY(U,$J,1009.802,48,1,115,0)
 ;;=HUDSPETH^^229^229
 ;;^UTILITY(U,$J,1009.802,48,1,116,0)
 ;;=HUNT^^231^231
 ;;^UTILITY(U,$J,1009.802,48,1,117,0)
 ;;=HUTCHINSON^^233^233
 ;;^UTILITY(U,$J,1009.802,48,1,118,0)
 ;;=IRION^^235^235
 ;;^UTILITY(U,$J,1009.802,48,1,119,0)
 ;;=JACK^^237^237
 ;;^UTILITY(U,$J,1009.802,48,1,120,0)
 ;;=JACKSON^^239^239
 ;;^UTILITY(U,$J,1009.802,48,1,121,0)
 ;;=JASPER^^241^241
 ;;^UTILITY(U,$J,1009.802,48,1,122,0)
 ;;=JEFF DAVIS^^243^243
 ;;^UTILITY(U,$J,1009.802,48,1,123,0)
 ;;=JEFFERSON^^245^245
 ;;^UTILITY(U,$J,1009.802,48,1,124,0)
 ;;=JIM HOGG^^247^247
 ;;^UTILITY(U,$J,1009.802,48,1,125,0)
 ;;=JIM WELLS^^249^249
 ;;^UTILITY(U,$J,1009.802,48,1,126,0)
 ;;=JOHNSON^^251^251
 ;;^UTILITY(U,$J,1009.802,48,1,127,0)
 ;;=JONES^^253^253
 ;;^UTILITY(U,$J,1009.802,48,1,128,0)
 ;;=KARNES^^255^255
 ;;^UTILITY(U,$J,1009.802,48,1,129,0)
 ;;=KAUFMAN^^257^257
 ;;^UTILITY(U,$J,1009.802,48,1,130,0)
 ;;=KENDALL^^259^259
 ;;^UTILITY(U,$J,1009.802,48,1,131,0)
 ;;=KENEDY^^261^261
 ;;^UTILITY(U,$J,1009.802,48,1,132,0)
 ;;=KENT^^263^263
 ;;^UTILITY(U,$J,1009.802,48,1,133,0)
 ;;=KERR^^265^265
 ;;^UTILITY(U,$J,1009.802,48,1,134,0)
 ;;=KIMBLE^^267^267
 ;;^UTILITY(U,$J,1009.802,48,1,135,0)
 ;;=KING^^269^269
 ;;^UTILITY(U,$J,1009.802,48,1,136,0)
 ;;=KINNEY^^271^271
 ;;^UTILITY(U,$J,1009.802,48,1,137,0)
 ;;=KLEBERG^^273^273
 ;;^UTILITY(U,$J,1009.802,48,1,138,0)
 ;;=KNOX^^275^275
 ;;^UTILITY(U,$J,1009.802,48,1,139,0)
 ;;=LAMAR^^277^277
 ;;^UTILITY(U,$J,1009.802,48,1,140,0)
 ;;=LAMB^^279^279
 ;;^UTILITY(U,$J,1009.802,48,1,141,0)
 ;;=LAMPASAS^^281^281
 ;;^UTILITY(U,$J,1009.802,48,1,142,0)
 ;;=LA SALLE^^283^283
 ;;^UTILITY(U,$J,1009.802,48,1,143,0)
 ;;=LAVACA^^285^285
 ;;^UTILITY(U,$J,1009.802,48,1,144,0)
 ;;=LEE^^287^287
 ;;^UTILITY(U,$J,1009.802,48,1,145,0)
 ;;=LEON^^289^289
 ;;^UTILITY(U,$J,1009.802,48,1,146,0)
 ;;=LIBERTY^^291^291
 ;;^UTILITY(U,$J,1009.802,48,1,147,0)
 ;;=LIMESTONE^^293^293
 ;;^UTILITY(U,$J,1009.802,48,1,148,0)
 ;;=LIPSCOMB^^295^295
 ;;^UTILITY(U,$J,1009.802,48,1,149,0)
 ;;=LIVE OAK^^297^297
 ;;^UTILITY(U,$J,1009.802,48,1,150,0)
 ;;=LLANO^^299^299
 ;;^UTILITY(U,$J,1009.802,48,1,151,0)
 ;;=LOVING^^301^301
 ;;^UTILITY(U,$J,1009.802,48,1,152,0)
 ;;=LUBBOCK^^303^303
 ;;^UTILITY(U,$J,1009.802,48,1,153,0)
 ;;=LYNN^^305^305
 ;;^UTILITY(U,$J,1009.802,48,1,154,0)
 ;;=MCCULLOCH^^307^307
 ;;^UTILITY(U,$J,1009.802,48,1,155,0)
 ;;=MCLENNAN^^309^309
 ;;^UTILITY(U,$J,1009.802,48,1,156,0)
 ;;=MCMULLEN^^311^311
 ;;^UTILITY(U,$J,1009.802,48,1,157,0)
 ;;=MADISON^^313^313
 ;;^UTILITY(U,$J,1009.802,48,1,158,0)
 ;;=MARION^^315^315
 ;;^UTILITY(U,$J,1009.802,48,1,159,0)
 ;;=MARTIN^^317^317
 ;;^UTILITY(U,$J,1009.802,48,1,160,0)
 ;;=MASON^^319^319
 ;;^UTILITY(U,$J,1009.802,48,1,161,0)
 ;;=MATAGORDA^^321^321
 ;;^UTILITY(U,$J,1009.802,48,1,162,0)
 ;;=MAVERICK^^323^323
 ;;^UTILITY(U,$J,1009.802,48,1,163,0)
 ;;=MEDINA^^325^325
 ;;^UTILITY(U,$J,1009.802,48,1,164,0)
 ;;=MENARD^^327^327
 ;;^UTILITY(U,$J,1009.802,48,1,165,0)
 ;;=MIDLAND^^329^329
 ;;^UTILITY(U,$J,1009.802,48,1,166,0)
 ;;=MILAM^^331^331
 ;;^UTILITY(U,$J,1009.802,48,1,167,0)
 ;;=MILLS^^333^333
 ;;^UTILITY(U,$J,1009.802,48,1,168,0)
 ;;=MITCHELL^^335^335
 ;;^UTILITY(U,$J,1009.802,48,1,169,0)
 ;;=MONTAGUE^^337^337
 ;;^UTILITY(U,$J,1009.802,48,1,170,0)
 ;;=MONTGOMERY^^339^339
 ;;^UTILITY(U,$J,1009.802,48,1,171,0)
 ;;=MOORE^^341^341
 ;;^UTILITY(U,$J,1009.802,48,1,172,0)
 ;;=MORRIS^^343^343
 ;;^UTILITY(U,$J,1009.802,48,1,173,0)
 ;;=MOTLEY^^345^345
 ;;^UTILITY(U,$J,1009.802,48,1,174,0)
 ;;=NACOGDOCHES^^347^347
 ;;^UTILITY(U,$J,1009.802,48,1,175,0)
 ;;=NAVARRO^^349^349
 ;;^UTILITY(U,$J,1009.802,48,1,176,0)
 ;;=NEWTON^^351^351
 ;;^UTILITY(U,$J,1009.802,48,1,177,0)
 ;;=NOLAN^^353^353
 ;;^UTILITY(U,$J,1009.802,48,1,178,0)
 ;;=NUECES^^355^355
 ;;^UTILITY(U,$J,1009.802,48,1,179,0)
 ;;=OCHILTREE^^357^357
 ;;^UTILITY(U,$J,1009.802,48,1,180,0)
 ;;=OLDHAM^^359^359
 ;;^UTILITY(U,$J,1009.802,48,1,181,0)
 ;;=ORANGE^^361^361
 ;;^UTILITY(U,$J,1009.802,48,1,182,0)
 ;;=PALO PINTO^^363^363
 ;;^UTILITY(U,$J,1009.802,48,1,183,0)
 ;;=PANOLA^^365^365
 ;;^UTILITY(U,$J,1009.802,48,1,184,0)
 ;;=PARKER^^367^367
 ;;^UTILITY(U,$J,1009.802,48,1,185,0)
 ;;=PARMER^^369^369
 ;;^UTILITY(U,$J,1009.802,48,1,186,0)
 ;;=PECOS^^371^371

DMUFI00F
DMUFI00F ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,48,1,187,0)
 ;;=POLK^^373^373
 ;;^UTILITY(U,$J,1009.802,48,1,188,0)
 ;;=POTTER^^375^375
 ;;^UTILITY(U,$J,1009.802,48,1,189,0)
 ;;=PRESIDIO^^377^377
 ;;^UTILITY(U,$J,1009.802,48,1,190,0)
 ;;=RAINS^^379^379
 ;;^UTILITY(U,$J,1009.802,48,1,191,0)
 ;;=RANDALL^^381^381
 ;;^UTILITY(U,$J,1009.802,48,1,192,0)
 ;;=REAGAN^^383^383
 ;;^UTILITY(U,$J,1009.802,48,1,193,0)
 ;;=REAL^^385^385
 ;;^UTILITY(U,$J,1009.802,48,1,194,0)
 ;;=RED RIVER^^387^387
 ;;^UTILITY(U,$J,1009.802,48,1,195,0)
 ;;=REEVES^^389^389
 ;;^UTILITY(U,$J,1009.802,48,1,196,0)
 ;;=REFUGIO^^391^391
 ;;^UTILITY(U,$J,1009.802,48,1,197,0)
 ;;=ROBERTS^^393^393
 ;;^UTILITY(U,$J,1009.802,48,1,198,0)
 ;;=ROBERTSON^^395^395
 ;;^UTILITY(U,$J,1009.802,48,1,199,0)
 ;;=ROCKWALL^^397^397
 ;;^UTILITY(U,$J,1009.802,48,1,200,0)
 ;;=RUNNELS^^399^399
 ;;^UTILITY(U,$J,1009.802,48,1,201,0)
 ;;=RUSK^^401^401
 ;;^UTILITY(U,$J,1009.802,48,1,202,0)
 ;;=SABINE^^403^403
 ;;^UTILITY(U,$J,1009.802,48,1,203,0)
 ;;=SAN AUGUSTINE^^405^405
 ;;^UTILITY(U,$J,1009.802,48,1,204,0)
 ;;=SAN JACINTO^^407^407
 ;;^UTILITY(U,$J,1009.802,48,1,205,0)
 ;;=SAN PATRICIO^^409^409
 ;;^UTILITY(U,$J,1009.802,48,1,206,0)
 ;;=SAN SABA^^411^411
 ;;^UTILITY(U,$J,1009.802,48,1,207,0)
 ;;=SCHLEICHER^^413^413
 ;;^UTILITY(U,$J,1009.802,48,1,208,0)
 ;;=SCURRY^^415^415
 ;;^UTILITY(U,$J,1009.802,48,1,209,0)
 ;;=SHACKELFORD^^417^417
 ;;^UTILITY(U,$J,1009.802,48,1,210,0)
 ;;=SHELBY^^419^419
 ;;^UTILITY(U,$J,1009.802,48,1,211,0)
 ;;=SHERMAN^^421^421
 ;;^UTILITY(U,$J,1009.802,48,1,212,0)
 ;;=SMITH^^423^423
 ;;^UTILITY(U,$J,1009.802,48,1,213,0)
 ;;=SOMERVELL^^425^425
 ;;^UTILITY(U,$J,1009.802,48,1,214,0)
 ;;=STARR^^427^427
 ;;^UTILITY(U,$J,1009.802,48,1,215,0)
 ;;=STEPHENS^^429^431
 ;;^UTILITY(U,$J,1009.802,48,1,216,0)
 ;;=STONEWALL^^433^433
 ;;^UTILITY(U,$J,1009.802,48,1,217,0)
 ;;=SUTTON^^435^435
 ;;^UTILITY(U,$J,1009.802,48,1,218,0)
 ;;=SWISHER^^437^437
 ;;^UTILITY(U,$J,1009.802,48,1,219,0)
 ;;=TARRANT^TRRNT^439^439
 ;;^UTILITY(U,$J,1009.802,48,1,220,0)
 ;;=TAYLOR^^441^441
 ;;^UTILITY(U,$J,1009.802,48,1,221,0)
 ;;=TERRELL^^443^443
 ;;^UTILITY(U,$J,1009.802,48,1,222,0)
 ;;=TERRY^^445^445
 ;;^UTILITY(U,$J,1009.802,48,1,223,0)
 ;;=THROCKMORTON^^447^447
 ;;^UTILITY(U,$J,1009.802,48,1,224,0)
 ;;=TITUS^^449^449
 ;;^UTILITY(U,$J,1009.802,48,1,225,0)
 ;;=TOM GREEN^^451^451
 ;;^UTILITY(U,$J,1009.802,48,1,226,0)
 ;;=TRAVIS^^453^453
 ;;^UTILITY(U,$J,1009.802,48,1,227,0)
 ;;=TRINITY^^455^455
 ;;^UTILITY(U,$J,1009.802,48,1,228,0)
 ;;=TYLER^^457^457
 ;;^UTILITY(U,$J,1009.802,48,1,229,0)
 ;;=UPSHUR^^459^459
 ;;^UTILITY(U,$J,1009.802,48,1,230,0)
 ;;=UPTON^^461^461
 ;;^UTILITY(U,$J,1009.802,48,1,231,0)
 ;;=UVALDE^^463^463
 ;;^UTILITY(U,$J,1009.802,48,1,232,0)
 ;;=VAL VERDE^^465^465
 ;;^UTILITY(U,$J,1009.802,48,1,233,0)
 ;;=VAN ZANDT^^467^467
 ;;^UTILITY(U,$J,1009.802,48,1,234,0)
 ;;=VICTORIA^^469^469
 ;;^UTILITY(U,$J,1009.802,48,1,235,0)
 ;;=WALKER^^471^471
 ;;^UTILITY(U,$J,1009.802,48,1,236,0)
 ;;=WALLER^^473^473
 ;;^UTILITY(U,$J,1009.802,48,1,237,0)
 ;;=WARD^^475^475
 ;;^UTILITY(U,$J,1009.802,48,1,238,0)
 ;;=WASHINGTON^^477^477
 ;;^UTILITY(U,$J,1009.802,48,1,239,0)
 ;;=WEBB^^479^479
 ;;^UTILITY(U,$J,1009.802,48,1,240,0)
 ;;=WHARTON^^481^481
 ;;^UTILITY(U,$J,1009.802,48,1,241,0)
 ;;=WHEELER^^483^483
 ;;^UTILITY(U,$J,1009.802,48,1,242,0)
 ;;=WICHITA^^485^485
 ;;^UTILITY(U,$J,1009.802,48,1,243,0)
 ;;=WILBARGER^^487^487
 ;;^UTILITY(U,$J,1009.802,48,1,244,0)
 ;;=WILLACY^^489^489
 ;;^UTILITY(U,$J,1009.802,48,1,245,0)
 ;;=WILLIAMSON^^491^491
 ;;^UTILITY(U,$J,1009.802,48,1,246,0)
 ;;=WILSON^^493^493
 ;;^UTILITY(U,$J,1009.802,48,1,247,0)
 ;;=WINKLER^^495^495
 ;;^UTILITY(U,$J,1009.802,48,1,248,0)
 ;;=WISE^^497^497
 ;;^UTILITY(U,$J,1009.802,48,1,249,0)
 ;;=WOOD^^499^499
 ;;^UTILITY(U,$J,1009.802,48,1,250,0)
 ;;=YOAKUM^^501^501
 ;;^UTILITY(U,$J,1009.802,48,1,251,0)
 ;;=YOUNG^^503^503
 ;;^UTILITY(U,$J,1009.802,48,1,252,0)
 ;;=ZAPATA^^505^505
 ;;^UTILITY(U,$J,1009.802,48,1,253,0)
 ;;=ZAVALA^^507^507
 ;;^UTILITY(U,$J,1009.802,48,1,255,0)
 ;;=STERLING^^431
 ;;^UTILITY(U,$J,1009.802,49,0)
 ;;=UTAH^UT^49^^1^1
 ;;^UTILITY(U,$J,1009.802,49,1,0)
 ;;=^1009.812I^29^29
 ;;^UTILITY(U,$J,1009.802,49,1,1,0)
 ;;=SALT LAKE^^035^035
 ;;^UTILITY(U,$J,1009.802,49,1,2,0)
 ;;=BEAVER^^001
 ;;^UTILITY(U,$J,1009.802,49,1,3,0)
 ;;=IRON^^021
 ;;^UTILITY(U,$J,1009.802,49,1,4,0)
 ;;=SEVIER^^041
 ;;^UTILITY(U,$J,1009.802,49,1,5,0)
 ;;=BOX ELDER^^003
 ;;^UTILITY(U,$J,1009.802,49,1,6,0)
 ;;=JUAB^^023
 ;;^UTILITY(U,$J,1009.802,49,1,7,0)
 ;;=SUMMIT^^043
 ;;^UTILITY(U,$J,1009.802,49,1,8,0)
 ;;=CACHE^^005
 ;;^UTILITY(U,$J,1009.802,49,1,9,0)
 ;;=KANE^^025
 ;;^UTILITY(U,$J,1009.802,49,1,10,0)
 ;;=TOOELE^^045
 ;;^UTILITY(U,$J,1009.802,49,1,11,0)
 ;;=CARBON^^007
 ;;^UTILITY(U,$J,1009.802,49,1,12,0)
 ;;=MILLARD^^027
 ;;^UTILITY(U,$J,1009.802,49,1,13,0)
 ;;=UINTAH^^047
 ;;^UTILITY(U,$J,1009.802,49,1,14,0)
 ;;=DAGGETT^^009
 ;;^UTILITY(U,$J,1009.802,49,1,15,0)
 ;;=MORGAN^^029
 ;;^UTILITY(U,$J,1009.802,49,1,16,0)
 ;;=UTAH^^049
 ;;^UTILITY(U,$J,1009.802,49,1,17,0)
 ;;=DAVIS^^011
 ;;^UTILITY(U,$J,1009.802,49,1,18,0)
 ;;=PIUTE^^031
 ;;^UTILITY(U,$J,1009.802,49,1,19,0)
 ;;=WASATCH^^051
 ;;^UTILITY(U,$J,1009.802,49,1,20,0)
 ;;=DUCHESNE^^013
 ;;^UTILITY(U,$J,1009.802,49,1,21,0)
 ;;=RICH^^033
 ;;^UTILITY(U,$J,1009.802,49,1,22,0)
 ;;=WASHINGTON^^053
 ;;^UTILITY(U,$J,1009.802,49,1,23,0)
 ;;=EMERY^^015
 ;;^UTILITY(U,$J,1009.802,49,1,24,0)
 ;;=WAYNE^^055
 ;;^UTILITY(U,$J,1009.802,49,1,25,0)
 ;;=GARFIELD^^017
 ;;^UTILITY(U,$J,1009.802,49,1,26,0)
 ;;=SAN JUAN^^037
 ;;^UTILITY(U,$J,1009.802,49,1,27,0)
 ;;=WEBER^^057
 ;;^UTILITY(U,$J,1009.802,49,1,28,0)
 ;;=GRAND^^019
 ;;^UTILITY(U,$J,1009.802,49,1,29,0)
 ;;=SANPETE^^039
 ;;^UTILITY(U,$J,1009.802,50,0)
 ;;=VERMONT^VT^50^^1^1
 ;;^UTILITY(U,$J,1009.802,50,1,0)
 ;;=^1009.812I^14^14
 ;;^UTILITY(U,$J,1009.802,50,1,1,0)
 ;;=ADDISON^^001
 ;;^UTILITY(U,$J,1009.802,50,1,2,0)
 ;;=FRANKLIN^^011
 ;;^UTILITY(U,$J,1009.802,50,1,3,0)
 ;;=RUTLAND^^021
 ;;^UTILITY(U,$J,1009.802,50,1,4,0)
 ;;=BENNINGTON^^003
 ;;^UTILITY(U,$J,1009.802,50,1,5,0)
 ;;=GRAND ISLE^^013
 ;;^UTILITY(U,$J,1009.802,50,1,6,0)
 ;;=WASHINGTON^^023
 ;;^UTILITY(U,$J,1009.802,50,1,7,0)
 ;;=CALEDONIA^^005
 ;;^UTILITY(U,$J,1009.802,50,1,8,0)
 ;;=LAMOILLE^^015
 ;;^UTILITY(U,$J,1009.802,50,1,9,0)
 ;;=WINDHAM^^025
 ;;^UTILITY(U,$J,1009.802,50,1,10,0)
 ;;=CHITTENDEN^^007
 ;;^UTILITY(U,$J,1009.802,50,1,11,0)
 ;;=ORANGE^^017
 ;;^UTILITY(U,$J,1009.802,50,1,12,0)
 ;;=WINDSOR^^027
 ;;^UTILITY(U,$J,1009.802,50,1,13,0)
 ;;=ESSEX^^009
 ;;^UTILITY(U,$J,1009.802,50,1,14,0)
 ;;=ORLEANS^^019
 ;;^UTILITY(U,$J,1009.802,51,0)
 ;;=VIRGINIA^VA^51^^1^1
 ;;^UTILITY(U,$J,1009.802,51,1,0)
 ;;=^1009.812I^140^137
 ;;^UTILITY(U,$J,1009.802,51,1,2,0)
 ;;=ACCOMACK^^001
 ;;^UTILITY(U,$J,1009.802,51,1,3,0)
 ;;=ESSEX^^057
 ;;^UTILITY(U,$J,1009.802,51,1,4,0)
 ;;=LUNENBURG^^111
 ;;^UTILITY(U,$J,1009.802,51,1,6,0)
 ;;=FAIRFAX (CITY)^^600
 ;;^UTILITY(U,$J,1009.802,51,1,7,0)
 ;;=MADISON^^113
 ;;^UTILITY(U,$J,1009.802,51,1,8,0)
 ;;=ALLEGHANY^^005
 ;;^UTILITY(U,$J,1009.802,51,1,9,0)
 ;;=FAUQUIER^^061
 ;;^UTILITY(U,$J,1009.802,51,1,10,0)
 ;;=MATHEWS^^115
 ;;^UTILITY(U,$J,1009.802,51,1,11,0)
 ;;=AMELIA^^007
 ;;^UTILITY(U,$J,1009.802,51,1,12,0)
 ;;=FLOYD^^063
 ;;^UTILITY(U,$J,1009.802,51,1,13,0)
 ;;=MECKLENBURG^^117
 ;;^UTILITY(U,$J,1009.802,51,1,14,0)
 ;;=AMHERST^^009
 ;;^UTILITY(U,$J,1009.802,51,1,15,0)
 ;;=FLUVANNA^^065
 ;;^UTILITY(U,$J,1009.802,51,1,16,0)
 ;;=MIDDLESEX^^119
 ;;^UTILITY(U,$J,1009.802,51,1,17,0)
 ;;=APPOMATTOX^^011
 ;;^UTILITY(U,$J,1009.802,51,1,18,0)
 ;;=FRANKLIN (CITY)^^620
 ;;^UTILITY(U,$J,1009.802,51,1,19,0)
 ;;=MONTGOMERY^^121
 ;;^UTILITY(U,$J,1009.802,51,1,20,0)
 ;;=ARLINGTON^^013
 ;;^UTILITY(U,$J,1009.802,51,1,21,0)
 ;;=FREDERICK^^069
 ;;^UTILITY(U,$J,1009.802,51,1,22,0)
 ;;=INDEPENDENT CITY NANSEMOND^^695^^3050204
 ;;^UTILITY(U,$J,1009.802,51,1,23,0)
 ;;=AUGUSTA^^015
 ;;^UTILITY(U,$J,1009.802,51,1,24,0)
 ;;=GILES^^071
 ;;^UTILITY(U,$J,1009.802,51,1,25,0)
 ;;=NELSON^^125
 ;;^UTILITY(U,$J,1009.802,51,1,26,0)
 ;;=BATH^^017
 ;;^UTILITY(U,$J,1009.802,51,1,27,0)
 ;;=GLOUCESTER^^073
 ;;^UTILITY(U,$J,1009.802,51,1,28,0)
 ;;=NEW KENT^^127
 ;;^UTILITY(U,$J,1009.802,51,1,29,0)
 ;;=BEDFORD (CITY)^^515
 ;;^UTILITY(U,$J,1009.802,51,1,30,0)
 ;;=GOOCHLAND^^075
 ;;^UTILITY(U,$J,1009.802,51,1,31,0)
 ;;=NORTHAMPTON^^131
 ;;^UTILITY(U,$J,1009.802,51,1,32,0)
 ;;=BLAND^^021
 ;;^UTILITY(U,$J,1009.802,51,1,33,0)
 ;;=GRAYSON^^077
 ;;^UTILITY(U,$J,1009.802,51,1,34,0)
 ;;=NORTHUMBERLAND^^133
 ;;^UTILITY(U,$J,1009.802,51,1,35,0)
 ;;=BOTETOURT^^023
 ;;^UTILITY(U,$J,1009.802,51,1,36,0)
 ;;=GREENE^^079
 ;;^UTILITY(U,$J,1009.802,51,1,37,0)
 ;;=NOTTOWAY^^135
 ;;^UTILITY(U,$J,1009.802,51,1,38,0)
 ;;=BRUNSWICK^^025
 ;;^UTILITY(U,$J,1009.802,51,1,39,0)
 ;;=GREENSVILLE^^081
 ;;^UTILITY(U,$J,1009.802,51,1,40,0)
 ;;=ORANGE^^137
 ;;^UTILITY(U,$J,1009.802,51,1,41,0)
 ;;=BUCHANAN^^027
 ;;^UTILITY(U,$J,1009.802,51,1,42,0)
 ;;=HALIFAX^^083
 ;;^UTILITY(U,$J,1009.802,51,1,43,0)
 ;;=PAGE^^139
 ;;^UTILITY(U,$J,1009.802,51,1,44,0)
 ;;=BUCKINGHAM^^029
 ;;^UTILITY(U,$J,1009.802,51,1,45,0)
 ;;=HANOVER^^085
 ;;^UTILITY(U,$J,1009.802,51,1,46,0)
 ;;=PATRICK^^141
 ;;^UTILITY(U,$J,1009.802,51,1,47,0)
 ;;=CAMPBELL^^031
 ;;^UTILITY(U,$J,1009.802,51,1,48,0)
 ;;=HENRICO^^087
 ;;^UTILITY(U,$J,1009.802,51,1,49,0)
 ;;=PITTSYLVANIA^^143
 ;;^UTILITY(U,$J,1009.802,51,1,50,0)
 ;;=CAROLINE^^033
 ;;^UTILITY(U,$J,1009.802,51,1,51,0)
 ;;=HENRY^^089
 ;;^UTILITY(U,$J,1009.802,51,1,52,0)
 ;;=POWHATAN^^145
 ;;^UTILITY(U,$J,1009.802,51,1,53,0)
 ;;=CARROLL^^035
 ;;^UTILITY(U,$J,1009.802,51,1,54,0)
 ;;=HIGHLAND^^091
 ;;^UTILITY(U,$J,1009.802,51,1,55,0)
 ;;=PRINCE EDWARD^^147
 ;;^UTILITY(U,$J,1009.802,51,1,56,0)
 ;;=CHARLES CITY^^036
 ;;^UTILITY(U,$J,1009.802,51,1,57,0)
 ;;=ISLE OF WIGHT^^093
 ;;^UTILITY(U,$J,1009.802,51,1,58,0)
 ;;=PRINCE GEORGE^^149
 ;;^UTILITY(U,$J,1009.802,51,1,59,0)
 ;;=CHARLOTTE^^037
 ;;^UTILITY(U,$J,1009.802,51,1,60,0)
 ;;=JAMES CITY^^095
 ;;^UTILITY(U,$J,1009.802,51,1,61,0)
 ;;=PRINCE WILLIAM^^153
 ;;^UTILITY(U,$J,1009.802,51,1,62,0)
 ;;=CHESTERFIELD^^041
 ;;^UTILITY(U,$J,1009.802,51,1,63,0)
 ;;=KING AND QUEEN^^097
 ;;^UTILITY(U,$J,1009.802,51,1,64,0)
 ;;=PULASKI^^155
 ;;^UTILITY(U,$J,1009.802,51,1,65,0)
 ;;=CLARKE^^043
 ;;^UTILITY(U,$J,1009.802,51,1,66,0)
 ;;=KING GEORGE^^099
 ;;^UTILITY(U,$J,1009.802,51,1,67,0)
 ;;=RAPPAHANNOCK^^157
 ;;^UTILITY(U,$J,1009.802,51,1,68,0)
 ;;=CRAIG^^045
 ;;^UTILITY(U,$J,1009.802,51,1,69,0)
 ;;=KING WILLIAM^^101
 ;;^UTILITY(U,$J,1009.802,51,1,70,0)
 ;;=RICHMOND (CITY)^^760
 ;;^UTILITY(U,$J,1009.802,51,1,71,0)
 ;;=CULPEPER^^047
 ;;^UTILITY(U,$J,1009.802,51,1,72,0)
 ;;=LANCASTER^^103
 ;;^UTILITY(U,$J,1009.802,51,1,74,0)
 ;;=CUMBERLAND^^049
 ;;^UTILITY(U,$J,1009.802,51,1,75,0)
 ;;=LEE^^105
 ;;^UTILITY(U,$J,1009.802,51,1,76,0)
 ;;=ROCKBRIDGE^^163
 ;;^UTILITY(U,$J,1009.802,51,1,77,0)
 ;;=DICKENSON^^051
 ;;^UTILITY(U,$J,1009.802,51,1,78,0)
 ;;=LOUDOUN^^107
 ;;^UTILITY(U,$J,1009.802,51,1,79,0)
 ;;=ROCKINGHAM^^165
 ;;^UTILITY(U,$J,1009.802,51,1,80,0)
 ;;=DINWIDDIE^^053
 ;;^UTILITY(U,$J,1009.802,51,1,81,0)
 ;;=LOUISA^^109
 ;;^UTILITY(U,$J,1009.802,51,1,82,0)
 ;;=RUSSELL^^167
 ;;^UTILITY(U,$J,1009.802,51,1,83,0)
 ;;=SCOTT^^169
 ;;^UTILITY(U,$J,1009.802,51,1,84,0)
 ;;=STAFFORD^^179
 ;;^UTILITY(U,$J,1009.802,51,1,85,0)
 ;;=WASHINGTON^^191
 ;;^UTILITY(U,$J,1009.802,51,1,86,0)
 ;;=SHENANDOAH^^171
 ;;^UTILITY(U,$J,1009.802,51,1,87,0)
 ;;=SURRY^^181
 ;;^UTILITY(U,$J,1009.802,51,1,88,0)
 ;;=WESTMORELAND^^193
 ;;^UTILITY(U,$J,1009.802,51,1,89,0)
 ;;=SMYTH^^173
 ;;^UTILITY(U,$J,1009.802,51,1,90,0)
 ;;=SUSSEX^^183
 ;;^UTILITY(U,$J,1009.802,51,1,91,0)
 ;;=WISE^^195
 ;;^UTILITY(U,$J,1009.802,51,1,92,0)
 ;;=SOUTHAMPTON^^175
 ;;^UTILITY(U,$J,1009.802,51,1,93,0)
 ;;=TAZEWELL^^185
 ;;^UTILITY(U,$J,1009.802,51,1,94,0)
 ;;=WYTHE^^197
 ;;^UTILITY(U,$J,1009.802,51,1,95,0)
 ;;=SPOTSYLVANIA^^177
 ;;^UTILITY(U,$J,1009.802,51,1,96,0)
 ;;=WARREN^^187
 ;;^UTILITY(U,$J,1009.802,51,1,97,0)
 ;;=YORK^^199
 ;;^UTILITY(U,$J,1009.802,51,1,98,0)
 ;;=ALEXANDRIA (CITY)^^510
 ;;^UTILITY(U,$J,1009.802,51,1,99,0)
 ;;=PORTSMOUTH (CITY)^^740
 ;;^UTILITY(U,$J,1009.802,51,1,100,0)
 ;;=FREDERICKSBURG (CITY)^^630
 ;;^UTILITY(U,$J,1009.802,51,1,101,0)
 ;;=RADFORD (CITY)^^750
 ;;^UTILITY(U,$J,1009.802,51,1,102,0)
 ;;=BRISTOL (CITY)^^520
 ;;^UTILITY(U,$J,1009.802,51,1,103,0)
 ;;=GALAX (CITY)^^640
 ;;^UTILITY(U,$J,1009.802,51,1,104,0)
 ;;=BUENA VISTA (CITY)^^530
 ;;^UTILITY(U,$J,1009.802,51,1,105,0)
 ;;=HAMPTON (CITY)^^650
 ;;^UTILITY(U,$J,1009.802,51,1,106,0)
 ;;=CHARLOTTESVILLE (CITY)^^540
 ;;^UTILITY(U,$J,1009.802,51,1,107,0)
 ;;=HARRISONBURG (CITY)^^660
 ;;^UTILITY(U,$J,1009.802,51,1,108,0)
 ;;=SALEM (CITY)^^775
 ;;^UTILITY(U,$J,1009.802,51,1,109,0)
 ;;=CHESAPEAKE (CITY)^^550
 ;;^UTILITY(U,$J,1009.802,51,1,110,0)
 ;;=HOPEWELL (CITY)^^670
 ;;^UTILITY(U,$J,1009.802,51,1,111,0)
 ;;=SOUTH BOSTON (IC)^^780^^3050204
 ;;^UTILITY(U,$J,1009.802,51,1,112,0)
 ;;=CLIFTON FORGE (CITY)^^560
 ;;^UTILITY(U,$J,1009.802,51,1,113,0)
 ;;=LEXINGTON (CITY)^^678
 ;;^UTILITY(U,$J,1009.802,51,1,114,0)
 ;;=STAUNTON (CITY)^^790
 ;;^UTILITY(U,$J,1009.802,51,1,115,0)
 ;;=COLONIAL HEIGHTS (CITY)^^570
 ;;^UTILITY(U,$J,1009.802,51,1,116,0)
 ;;=LYNCHBURG (CITY)^^680
 ;;^UTILITY(U,$J,1009.802,51,1,117,0)
 ;;=SUFFOLK (CITY)^^800
 ;;^UTILITY(U,$J,1009.802,51,1,118,0)
 ;;=COVINGTON (CITY)^^580
 ;;^UTILITY(U,$J,1009.802,51,1,119,0)
 ;;=MARTINSVILLE (CITY)^^690
 ;;^UTILITY(U,$J,1009.802,51,1,120,0)
 ;;=VIRGINIA BEACH (CITY)^^810
 ;;^UTILITY(U,$J,1009.802,51,1,121,0)
 ;;=DANVILLE (CITY)^^590
 ;;^UTILITY(U,$J,1009.802,51,1,122,0)
 ;;=NEWPORT NEWS (CITY)^^700
 ;;^UTILITY(U,$J,1009.802,51,1,123,0)
 ;;=WAYNESBORO (CITY)^^820
 ;;^UTILITY(U,$J,1009.802,51,1,124,0)
 ;;=EMPORIA (CITY)^^595
 ;;^UTILITY(U,$J,1009.802,51,1,125,0)
 ;;=NORFOLK (CITY)^^710
 ;;^UTILITY(U,$J,1009.802,51,1,126,0)
 ;;=WILLIAMSBURG (CITY)^^830
 ;;^UTILITY(U,$J,1009.802,51,1,127,0)
 ;;=NORTON (CITY)^^720
 ;;^UTILITY(U,$J,1009.802,51,1,128,0)
 ;;=WINCHESTER (CITY)^^840
 ;;^UTILITY(U,$J,1009.802,51,1,129,0)
 ;;=FALLS CHURCH (CITY)^^610
 ;;^UTILITY(U,$J,1009.802,51,1,130,0)
 ;;=PETERSBURG (CITY)^^730

DMUFI00G
DMUFI00G ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,51,1,131,0)
 ;;=RICHMOND^^159
 ;;^UTILITY(U,$J,1009.802,51,1,132,0)
 ;;=ROANOKE^^161
 ;;^UTILITY(U,$J,1009.802,51,1,133,0)
 ;;=ROANOKE (CITY)^^770
 ;;^UTILITY(U,$J,1009.802,51,1,134,0)
 ;;=ALBEMARLE^^003
 ;;^UTILITY(U,$J,1009.802,51,1,135,0)
 ;;=BEDFORD^^019
 ;;^UTILITY(U,$J,1009.802,51,1,136,0)
 ;;=FAIRFAX^^059
 ;;^UTILITY(U,$J,1009.802,51,1,137,0)
 ;;=FRANKLIN^^067
 ;;^UTILITY(U,$J,1009.802,51,1,138,0)
 ;;=MANASSAS (CITY)^^683
 ;;^UTILITY(U,$J,1009.802,51,1,139,0)
 ;;=MANASSAS PARK (CITY)^^685
 ;;^UTILITY(U,$J,1009.802,51,1,140,0)
 ;;=POQUOSON (CITY)^^735
 ;;^UTILITY(U,$J,1009.802,53,0)
 ;;=WASHINGTON^WA^53^OLYMPIA^1^1
 ;;^UTILITY(U,$J,1009.802,53,1,0)
 ;;=^1009.812I^39^39
 ;;^UTILITY(U,$J,1009.802,53,1,1,0)
 ;;=KING^^033^033
 ;;^UTILITY(U,$J,1009.802,53,1,2,0)
 ;;=YAKIMA^^077^077
 ;;^UTILITY(U,$J,1009.802,53,1,3,0)
 ;;=CLARK^^011^011
 ;;^UTILITY(U,$J,1009.802,53,1,4,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,53,1,5,0)
 ;;=GRAYS HARBOR^^027
 ;;^UTILITY(U,$J,1009.802,53,1,6,0)
 ;;=PIERCE^^053
 ;;^UTILITY(U,$J,1009.802,53,1,7,0)
 ;;=ASOTIN^^003
 ;;^UTILITY(U,$J,1009.802,53,1,8,0)
 ;;=ISLAND^^029
 ;;^UTILITY(U,$J,1009.802,53,1,9,0)
 ;;=SAN JUAN^^055
 ;;^UTILITY(U,$J,1009.802,53,1,10,0)
 ;;=BENTON^^005
 ;;^UTILITY(U,$J,1009.802,53,1,11,0)
 ;;=JEFFERSON^^031
 ;;^UTILITY(U,$J,1009.802,53,1,12,0)
 ;;=SKAGIT^^057
 ;;^UTILITY(U,$J,1009.802,53,1,13,0)
 ;;=CHELAN^^007
 ;;^UTILITY(U,$J,1009.802,53,1,14,0)
 ;;=SKAMANIA^^059
 ;;^UTILITY(U,$J,1009.802,53,1,15,0)
 ;;=CLALLAM^^009
 ;;^UTILITY(U,$J,1009.802,53,1,16,0)
 ;;=KITSAP^^035
 ;;^UTILITY(U,$J,1009.802,53,1,17,0)
 ;;=SNOHOMISH^^061
 ;;^UTILITY(U,$J,1009.802,53,1,18,0)
 ;;=KITTITAS^^037
 ;;^UTILITY(U,$J,1009.802,53,1,19,0)
 ;;=SPOKANE^^063
 ;;^UTILITY(U,$J,1009.802,53,1,20,0)
 ;;=COLUMBIA^^013
 ;;^UTILITY(U,$J,1009.802,53,1,21,0)
 ;;=KLICKITAT^^039
 ;;^UTILITY(U,$J,1009.802,53,1,22,0)
 ;;=STEVENS^^065
 ;;^UTILITY(U,$J,1009.802,53,1,23,0)
 ;;=COWLITZ^^015
 ;;^UTILITY(U,$J,1009.802,53,1,24,0)
 ;;=LEWIS^^041
 ;;^UTILITY(U,$J,1009.802,53,1,25,0)
 ;;=THURSTON^^067
 ;;^UTILITY(U,$J,1009.802,53,1,26,0)
 ;;=DOUGLAS^^017
 ;;^UTILITY(U,$J,1009.802,53,1,27,0)
 ;;=LINCOLN^^043
 ;;^UTILITY(U,$J,1009.802,53,1,28,0)
 ;;=WAHKIAKUM^^069
 ;;^UTILITY(U,$J,1009.802,53,1,29,0)
 ;;=FERRY^^019
 ;;^UTILITY(U,$J,1009.802,53,1,30,0)
 ;;=MASON^^045
 ;;^UTILITY(U,$J,1009.802,53,1,31,0)
 ;;=WALLA WALLA^^071
 ;;^UTILITY(U,$J,1009.802,53,1,32,0)
 ;;=FRANKLIN^^021
 ;;^UTILITY(U,$J,1009.802,53,1,33,0)
 ;;=OKANOGAN^^047
 ;;^UTILITY(U,$J,1009.802,53,1,34,0)
 ;;=WHATCOM^^073
 ;;^UTILITY(U,$J,1009.802,53,1,35,0)
 ;;=GARFIELD^^023
 ;;^UTILITY(U,$J,1009.802,53,1,36,0)
 ;;=PACIFIC^^049
 ;;^UTILITY(U,$J,1009.802,53,1,37,0)
 ;;=WHITMAN^^075
 ;;^UTILITY(U,$J,1009.802,53,1,38,0)
 ;;=GRANT^^025
 ;;^UTILITY(U,$J,1009.802,53,1,39,0)
 ;;=PEND OREILLE^^051
 ;;^UTILITY(U,$J,1009.802,54,0)
 ;;=WEST VIRGINIA^WV^54^^1^1
 ;;^UTILITY(U,$J,1009.802,54,1,0)
 ;;=^1009.812I^56^55
 ;;^UTILITY(U,$J,1009.802,54,1,1,0)
 ;;=OHIO^^069^069
 ;;^UTILITY(U,$J,1009.802,54,1,3,0)
 ;;=BARBOUR^^001
 ;;^UTILITY(U,$J,1009.802,54,1,4,0)
 ;;=CLAY^^015
 ;;^UTILITY(U,$J,1009.802,54,1,5,0)
 ;;=HANCOCK^^029
 ;;^UTILITY(U,$J,1009.802,54,1,6,0)
 ;;=BERKELEY^^003
 ;;^UTILITY(U,$J,1009.802,54,1,7,0)
 ;;=DODDRIDGE^^017
 ;;^UTILITY(U,$J,1009.802,54,1,8,0)
 ;;=HARDY^^031
 ;;^UTILITY(U,$J,1009.802,54,1,9,0)
 ;;=BOONE^^005
 ;;^UTILITY(U,$J,1009.802,54,1,10,0)
 ;;=FAYETTE^^019
 ;;^UTILITY(U,$J,1009.802,54,1,11,0)
 ;;=HARRISON^^033
 ;;^UTILITY(U,$J,1009.802,54,1,12,0)
 ;;=BRAXTON^^007
 ;;^UTILITY(U,$J,1009.802,54,1,13,0)
 ;;=GILMER^^021
 ;;^UTILITY(U,$J,1009.802,54,1,14,0)
 ;;=JACKSON^^035
 ;;^UTILITY(U,$J,1009.802,54,1,15,0)
 ;;=BROOKE^^009
 ;;^UTILITY(U,$J,1009.802,54,1,16,0)
 ;;=GRANT^^023
 ;;^UTILITY(U,$J,1009.802,54,1,17,0)
 ;;=JEFFERSON^^037
 ;;^UTILITY(U,$J,1009.802,54,1,18,0)
 ;;=CABELL^^011
 ;;^UTILITY(U,$J,1009.802,54,1,19,0)
 ;;=GREENBRIER^^025
 ;;^UTILITY(U,$J,1009.802,54,1,20,0)
 ;;=KANAWHA^^039
 ;;^UTILITY(U,$J,1009.802,54,1,21,0)
 ;;=CALHOUN^^013
 ;;^UTILITY(U,$J,1009.802,54,1,22,0)
 ;;=HAMPSHIRE^^027
 ;;^UTILITY(U,$J,1009.802,54,1,23,0)
 ;;=LEWIS^^041
 ;;^UTILITY(U,$J,1009.802,54,1,24,0)
 ;;=LINCOLN^^043
 ;;^UTILITY(U,$J,1009.802,54,1,25,0)
 ;;=NICHOLAS^^067
 ;;^UTILITY(U,$J,1009.802,54,1,26,0)
 ;;=SUMMERS^^089
 ;;^UTILITY(U,$J,1009.802,54,1,27,0)
 ;;=LOGAN^^045
 ;;^UTILITY(U,$J,1009.802,54,1,28,0)
 ;;=TAYLOR^^091
 ;;^UTILITY(U,$J,1009.802,54,1,29,0)
 ;;=MCDOWELL^^047
 ;;^UTILITY(U,$J,1009.802,54,1,30,0)
 ;;=PENDLETON^^071
 ;;^UTILITY(U,$J,1009.802,54,1,31,0)
 ;;=TUCKER^^093
 ;;^UTILITY(U,$J,1009.802,54,1,32,0)
 ;;=MARION^^049
 ;;^UTILITY(U,$J,1009.802,54,1,33,0)
 ;;=PLEASANTS^^073
 ;;^UTILITY(U,$J,1009.802,54,1,34,0)
 ;;=TYLER^^095
 ;;^UTILITY(U,$J,1009.802,54,1,35,0)
 ;;=MARSHALL^^051
 ;;^UTILITY(U,$J,1009.802,54,1,36,0)
 ;;=POCAHONTAS^^075
 ;;^UTILITY(U,$J,1009.802,54,1,37,0)
 ;;=UPSHUR^^097
 ;;^UTILITY(U,$J,1009.802,54,1,38,0)
 ;;=MASON^^053
 ;;^UTILITY(U,$J,1009.802,54,1,39,0)
 ;;=PRESTON^^077
 ;;^UTILITY(U,$J,1009.802,54,1,40,0)
 ;;=WAYNE^^099
 ;;^UTILITY(U,$J,1009.802,54,1,41,0)
 ;;=MERCER^^055
 ;;^UTILITY(U,$J,1009.802,54,1,42,0)
 ;;=PUTNAM^^079
 ;;^UTILITY(U,$J,1009.802,54,1,43,0)
 ;;=WEBSTER^^101
 ;;^UTILITY(U,$J,1009.802,54,1,44,0)
 ;;=MINERAL^^057
 ;;^UTILITY(U,$J,1009.802,54,1,45,0)
 ;;=RALEIGH^^081
 ;;^UTILITY(U,$J,1009.802,54,1,46,0)
 ;;=WETZEL^^103
 ;;^UTILITY(U,$J,1009.802,54,1,47,0)
 ;;=MINGO^^059
 ;;^UTILITY(U,$J,1009.802,54,1,48,0)
 ;;=RANDOLPH^^083
 ;;^UTILITY(U,$J,1009.802,54,1,49,0)
 ;;=WIRT^^105
 ;;^UTILITY(U,$J,1009.802,54,1,50,0)
 ;;=MONONGALIA^^061
 ;;^UTILITY(U,$J,1009.802,54,1,51,0)
 ;;=RITCHIE^^085
 ;;^UTILITY(U,$J,1009.802,54,1,52,0)
 ;;=WOOD^^107
 ;;^UTILITY(U,$J,1009.802,54,1,53,0)
 ;;=MONROE^^063
 ;;^UTILITY(U,$J,1009.802,54,1,54,0)
 ;;=ROANE^^087
 ;;^UTILITY(U,$J,1009.802,54,1,55,0)
 ;;=WYOMING^^109
 ;;^UTILITY(U,$J,1009.802,54,1,56,0)
 ;;=MORGAN^^065
 ;;^UTILITY(U,$J,1009.802,55,0)
 ;;=WISCONSIN^WI^55^^1^1
 ;;^UTILITY(U,$J,1009.802,55,1,0)
 ;;=^1009.812I^72^72
 ;;^UTILITY(U,$J,1009.802,55,1,1,0)
 ;;=JEFFERSON^^055^055
 ;;^UTILITY(U,$J,1009.802,55,1,2,0)
 ;;=ADAMS^^001
 ;;^UTILITY(U,$J,1009.802,55,1,3,0)
 ;;=IOWA^^049
 ;;^UTILITY(U,$J,1009.802,55,1,4,0)
 ;;=POLK^^095
 ;;^UTILITY(U,$J,1009.802,55,1,5,0)
 ;;=ASHLAND^^003
 ;;^UTILITY(U,$J,1009.802,55,1,6,0)
 ;;=IRON^^051
 ;;^UTILITY(U,$J,1009.802,55,1,7,0)
 ;;=PORTAGE^^097
 ;;^UTILITY(U,$J,1009.802,55,1,8,0)
 ;;=BARRON^^005
 ;;^UTILITY(U,$J,1009.802,55,1,9,0)
 ;;=JACKSON^^053
 ;;^UTILITY(U,$J,1009.802,55,1,10,0)
 ;;=PRICE^^099
 ;;^UTILITY(U,$J,1009.802,55,1,11,0)
 ;;=BAYFIELD^^007
 ;;^UTILITY(U,$J,1009.802,55,1,12,0)
 ;;=RACINE^^101
 ;;^UTILITY(U,$J,1009.802,55,1,13,0)
 ;;=BROWN^^009
 ;;^UTILITY(U,$J,1009.802,55,1,14,0)
 ;;=JUNEAU^^057
 ;;^UTILITY(U,$J,1009.802,55,1,15,0)
 ;;=RICHLAND^^103
 ;;^UTILITY(U,$J,1009.802,55,1,16,0)
 ;;=BUFFALO^^011
 ;;^UTILITY(U,$J,1009.802,55,1,17,0)
 ;;=KENOSHA^^059
 ;;^UTILITY(U,$J,1009.802,55,1,18,0)
 ;;=ROCK^^105
 ;;^UTILITY(U,$J,1009.802,55,1,19,0)
 ;;=BURNETT^^013
 ;;^UTILITY(U,$J,1009.802,55,1,20,0)
 ;;=KEWAUNEE^^061
 ;;^UTILITY(U,$J,1009.802,55,1,21,0)
 ;;=RUSK^^107
 ;;^UTILITY(U,$J,1009.802,55,1,22,0)
 ;;=CALUMET^^015
 ;;^UTILITY(U,$J,1009.802,55,1,23,0)
 ;;=LA CROSSE^^063
 ;;^UTILITY(U,$J,1009.802,55,1,24,0)
 ;;=ST. CROIX^^109
 ;;^UTILITY(U,$J,1009.802,55,1,25,0)
 ;;=CHIPPEWA^^017
 ;;^UTILITY(U,$J,1009.802,55,1,26,0)
 ;;=LAFAYETTE^^065
 ;;^UTILITY(U,$J,1009.802,55,1,27,0)
 ;;=SAUK^^111
 ;;^UTILITY(U,$J,1009.802,55,1,28,0)
 ;;=CLARK^^019
 ;;^UTILITY(U,$J,1009.802,55,1,29,0)
 ;;=LANGLADE^^067
 ;;^UTILITY(U,$J,1009.802,55,1,30,0)
 ;;=SAWYER^^113
 ;;^UTILITY(U,$J,1009.802,55,1,31,0)
 ;;=COLUMBIA^^021
 ;;^UTILITY(U,$J,1009.802,55,1,32,0)
 ;;=LINCOLN^^069
 ;;^UTILITY(U,$J,1009.802,55,1,33,0)
 ;;=SHAWANO^^115
 ;;^UTILITY(U,$J,1009.802,55,1,34,0)
 ;;=CRAWFORD^^023
 ;;^UTILITY(U,$J,1009.802,55,1,35,0)
 ;;=MANITOWOC^^071
 ;;^UTILITY(U,$J,1009.802,55,1,36,0)
 ;;=SHEBOYGAN^^117
 ;;^UTILITY(U,$J,1009.802,55,1,37,0)
 ;;=DANE^^025
 ;;^UTILITY(U,$J,1009.802,55,1,38,0)
 ;;=MARATHON^^073
 ;;^UTILITY(U,$J,1009.802,55,1,39,0)
 ;;=TAYLOR^^119
 ;;^UTILITY(U,$J,1009.802,55,1,40,0)
 ;;=DODGE^^027
 ;;^UTILITY(U,$J,1009.802,55,1,41,0)
 ;;=MARINETTE^^075
 ;;^UTILITY(U,$J,1009.802,55,1,42,0)
 ;;=TREMPEALEAU^^121
 ;;^UTILITY(U,$J,1009.802,55,1,43,0)
 ;;=DOOR^^029
 ;;^UTILITY(U,$J,1009.802,55,1,44,0)
 ;;=MARQUETTE^^077
 ;;^UTILITY(U,$J,1009.802,55,1,45,0)
 ;;=VERNON^^123
 ;;^UTILITY(U,$J,1009.802,55,1,46,0)
 ;;=DOUGLAS^^031
 ;;^UTILITY(U,$J,1009.802,55,1,47,0)
 ;;=MENOMINEE^^078
 ;;^UTILITY(U,$J,1009.802,55,1,48,0)
 ;;=VILAS^^125
 ;;^UTILITY(U,$J,1009.802,55,1,49,0)
 ;;=DUNN^^033
 ;;^UTILITY(U,$J,1009.802,55,1,50,0)
 ;;=MILWAUKEE^^079
 ;;^UTILITY(U,$J,1009.802,55,1,51,0)
 ;;=WALWORTH^^127
 ;;^UTILITY(U,$J,1009.802,55,1,52,0)
 ;;=EAU CLAIRE^^035
 ;;^UTILITY(U,$J,1009.802,55,1,53,0)
 ;;=MONROE^^081
 ;;^UTILITY(U,$J,1009.802,55,1,54,0)
 ;;=WASHBURN^^129
 ;;^UTILITY(U,$J,1009.802,55,1,55,0)
 ;;=FLORENCE^^037
 ;;^UTILITY(U,$J,1009.802,55,1,56,0)
 ;;=OCONTO^^083
 ;;^UTILITY(U,$J,1009.802,55,1,57,0)
 ;;=WASHINGTON^^131
 ;;^UTILITY(U,$J,1009.802,55,1,58,0)
 ;;=FOND DU LAC^^039
 ;;^UTILITY(U,$J,1009.802,55,1,59,0)
 ;;=ONEIDA^^085
 ;;^UTILITY(U,$J,1009.802,55,1,60,0)
 ;;=WAUKESHA^^133
 ;;^UTILITY(U,$J,1009.802,55,1,61,0)
 ;;=FOREST^^041
 ;;^UTILITY(U,$J,1009.802,55,1,62,0)
 ;;=OUTAGAMIE^^087
 ;;^UTILITY(U,$J,1009.802,55,1,63,0)
 ;;=WAUPACA^^135
 ;;^UTILITY(U,$J,1009.802,55,1,64,0)
 ;;=GRANT^^043
 ;;^UTILITY(U,$J,1009.802,55,1,65,0)
 ;;=OZAUKEE^^089
 ;;^UTILITY(U,$J,1009.802,55,1,66,0)
 ;;=WAUSHARA^^137
 ;;^UTILITY(U,$J,1009.802,55,1,67,0)
 ;;=GREEN^^045
 ;;^UTILITY(U,$J,1009.802,55,1,68,0)
 ;;=PEPIN^^091
 ;;^UTILITY(U,$J,1009.802,55,1,69,0)
 ;;=WINNEBAGO^^139
 ;;^UTILITY(U,$J,1009.802,55,1,70,0)
 ;;=GREEN LAKE^^047
 ;;^UTILITY(U,$J,1009.802,55,1,71,0)
 ;;=PIERCE^^093
 ;;^UTILITY(U,$J,1009.802,55,1,72,0)
 ;;=WOOD^^141
 ;;^UTILITY(U,$J,1009.802,56,0)
 ;;=WYOMING^WY^56^^1^1
 ;;^UTILITY(U,$J,1009.802,56,1,0)
 ;;=^1009.812I^23^23
 ;;^UTILITY(U,$J,1009.802,56,1,1,0)
 ;;=ALBANY^^001
 ;;^UTILITY(U,$J,1009.802,56,1,2,0)
 ;;=FREMONT^^013
 ;;^UTILITY(U,$J,1009.802,56,1,3,0)
 ;;=NATRONA^^025
 ;;^UTILITY(U,$J,1009.802,56,1,4,0)
 ;;=BIG HORN^^003
 ;;^UTILITY(U,$J,1009.802,56,1,5,0)
 ;;=GOSHEN^^015
 ;;^UTILITY(U,$J,1009.802,56,1,6,0)
 ;;=NIOBRARA^^027
 ;;^UTILITY(U,$J,1009.802,56,1,7,0)
 ;;=CAMPBELL^^005
 ;;^UTILITY(U,$J,1009.802,56,1,8,0)
 ;;=HOT SPRINGS^^017
 ;;^UTILITY(U,$J,1009.802,56,1,9,0)
 ;;=PARK^^029
 ;;^UTILITY(U,$J,1009.802,56,1,10,0)
 ;;=CARBON^^007
 ;;^UTILITY(U,$J,1009.802,56,1,11,0)
 ;;=JOHNSON^^019
 ;;^UTILITY(U,$J,1009.802,56,1,12,0)
 ;;=PLATTE^^031
 ;;^UTILITY(U,$J,1009.802,56,1,13,0)
 ;;=CONVERSE^^009
 ;;^UTILITY(U,$J,1009.802,56,1,14,0)
 ;;=LARAMIE^^021
 ;;^UTILITY(U,$J,1009.802,56,1,15,0)
 ;;=SHERIDAN^^033
 ;;^UTILITY(U,$J,1009.802,56,1,16,0)
 ;;=CROOK^^011
 ;;^UTILITY(U,$J,1009.802,56,1,17,0)
 ;;=LINCOLN^^023
 ;;^UTILITY(U,$J,1009.802,56,1,18,0)
 ;;=SUBLETTE^^035
 ;;^UTILITY(U,$J,1009.802,56,1,19,0)
 ;;=SWEETWATER^^037
 ;;^UTILITY(U,$J,1009.802,56,1,20,0)
 ;;=UINTA^^041
 ;;^UTILITY(U,$J,1009.802,56,1,21,0)
 ;;=WESTON^^045
 ;;^UTILITY(U,$J,1009.802,56,1,22,0)
 ;;=TETON^^039
 ;;^UTILITY(U,$J,1009.802,56,1,23,0)
 ;;=WASHAKIE^^043
 ;;^UTILITY(U,$J,1009.802,60,0)
 ;;=AMERICAN SAMOA^AS^60^^1^1
 ;;^UTILITY(U,$J,1009.802,60,1,0)
 ;;=^1009.812I^6^6
 ;;^UTILITY(U,$J,1009.802,60,1,1,0)
 ;;=EASTERN (DISTRICT)^^010
 ;;^UTILITY(U,$J,1009.802,60,1,2,0)
 ;;=MANU'A (DISTRICT)^^020
 ;;^UTILITY(U,$J,1009.802,60,1,3,0)
 ;;=ROSE ISLAND^^030
 ;;^UTILITY(U,$J,1009.802,60,1,4,0)
 ;;=SWAINS ISLAND^^040
 ;;^UTILITY(U,$J,1009.802,60,1,5,0)
 ;;=WESTERN (DISTRICT)^^050
 ;;^UTILITY(U,$J,1009.802,60,1,6,0)
 ;;=ALL OTHER^^999
 ;;^UTILITY(U,$J,1009.802,64,0)
 ;;=FEDERATED STATES OF MICRONESIA^FM^64^^1^1
 ;;^UTILITY(U,$J,1009.802,64,1,0)
 ;;=^1009.812I^5^5
 ;;^UTILITY(U,$J,1009.802,64,1,1,0)
 ;;=CHUUK^^002
 ;;^UTILITY(U,$J,1009.802,64,1,2,0)
 ;;=KOSRAE^^005
 ;;^UTILITY(U,$J,1009.802,64,1,3,0)
 ;;=POHNPEI^^040
 ;;^UTILITY(U,$J,1009.802,64,1,4,0)
 ;;=YAP^^060
 ;;^UTILITY(U,$J,1009.802,64,1,5,0)
 ;;=FEDERATED STATES OF MICRO^^003
 ;;^UTILITY(U,$J,1009.802,66,0)
 ;;=GUAM^GU^66^^1^1
 ;;^UTILITY(U,$J,1009.802,66,1,0)
 ;;=^1009.812I^2^2
 ;;^UTILITY(U,$J,1009.802,66,1,1,0)
 ;;=999
 ;;^UTILITY(U,$J,1009.802,66,1,2,0)
 ;;=GUAM^^010
 ;;^UTILITY(U,$J,1009.802,68,0)
 ;;=MARSHALL ISLANDS^MH^68^^1^1
 ;;^UTILITY(U,$J,1009.802,68,1,0)
 ;;=^1009.812I^34^34
 ;;^UTILITY(U,$J,1009.802,68,1,1,0)
 ;;=AILINGINAE^^007
 ;;^UTILITY(U,$J,1009.802,68,1,2,0)
 ;;=AILINGLAPLAP^^010
 ;;^UTILITY(U,$J,1009.802,68,1,3,0)
 ;;=AILUK^^030
 ;;^UTILITY(U,$J,1009.802,68,1,4,0)
 ;;=ARNO^^040
 ;;^UTILITY(U,$J,1009.802,68,1,5,0)
 ;;=AUR^^050
 ;;^UTILITY(U,$J,1009.802,68,1,6,0)
 ;;=BIKAR^^060
 ;;^UTILITY(U,$J,1009.802,68,1,7,0)
 ;;=BIKINI^^070
 ;;^UTILITY(U,$J,1009.802,68,1,8,0)
 ;;=BOKAK^^073
 ;;^UTILITY(U,$J,1009.802,68,1,9,0)
 ;;=EBON^^080
 ;;^UTILITY(U,$J,1009.802,68,1,10,0)
 ;;=ENEWETAK^^090
 ;;^UTILITY(U,$J,1009.802,68,1,11,0)
 ;;=ERIKUB^^100
 ;;^UTILITY(U,$J,1009.802,68,1,12,0)
 ;;=JABAT^^110
 ;;^UTILITY(U,$J,1009.802,68,1,13,0)
 ;;=JALUIT^^120
 ;;^UTILITY(U,$J,1009.802,68,1,14,0)
 ;;=JEMO^^130
 ;;^UTILITY(U,$J,1009.802,68,1,15,0)
 ;;=KILI^^140
 ;;^UTILITY(U,$J,1009.802,68,1,16,0)
 ;;=KWAJALEIN^^150
 ;;^UTILITY(U,$J,1009.802,68,1,17,0)
 ;;=LAE^^160
 ;;^UTILITY(U,$J,1009.802,68,1,18,0)
 ;;=LIB^^170
 ;;^UTILITY(U,$J,1009.802,68,1,19,0)
 ;;=LIKIEP^^180
 ;;^UTILITY(U,$J,1009.802,68,1,20,0)
 ;;=MAJURO^^190
 ;;^UTILITY(U,$J,1009.802,68,1,21,0)
 ;;=MALOELAP^^300
 ;;^UTILITY(U,$J,1009.802,68,1,22,0)
 ;;=MEJIT^^310
 ;;^UTILITY(U,$J,1009.802,68,1,23,0)
 ;;=MILI^^320
 ;;^UTILITY(U,$J,1009.802,68,1,24,0)
 ;;=NAMORIK^^330
 ;;^UTILITY(U,$J,1009.802,68,1,25,0)
 ;;=NAMU^^340
 ;;^UTILITY(U,$J,1009.802,68,1,26,0)
 ;;=RONGELAP^^350
 ;;^UTILITY(U,$J,1009.802,68,1,27,0)
 ;;=RONGRIK^^360
 ;;^UTILITY(U,$J,1009.802,68,1,28,0)
 ;;=TOKE^^385
 ;;^UTILITY(U,$J,1009.802,68,1,29,0)
 ;;=UJAE^^390
 ;;^UTILITY(U,$J,1009.802,68,1,30,0)
 ;;=UJELANG^^400

DMUFI00H
DMUFI00H ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q:'DIFQR(1009.802)  F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,1009.802,68,1,31,0)
 ;;=UTRIK^^410
 ;;^UTILITY(U,$J,1009.802,68,1,32,0)
 ;;=WOTHO^^420
 ;;^UTILITY(U,$J,1009.802,68,1,33,0)
 ;;=WOTJE^^430
 ;;^UTILITY(U,$J,1009.802,68,1,34,0)
 ;;=MARSHALL ISLANDS^^020
 ;;^UTILITY(U,$J,1009.802,69,0)
 ;;=NORTHERN MARIANA ISLANDS^MP^69^^1^1
 ;;^UTILITY(U,$J,1009.802,69,1,0)
 ;;=^1009.812I^5^5
 ;;^UTILITY(U,$J,1009.802,69,1,1,0)
 ;;=NORTHERN ISLANDS^^085
 ;;^UTILITY(U,$J,1009.802,69,1,2,0)
 ;;=ROTA^^100
 ;;^UTILITY(U,$J,1009.802,69,1,3,0)
 ;;=SAIPAN^^110
 ;;^UTILITY(U,$J,1009.802,69,1,4,0)
 ;;=TINIAN^^120
 ;;^UTILITY(U,$J,1009.802,69,1,5,0)
 ;;=NORTHERN MARIANA ISLANDS^^010
 ;;^UTILITY(U,$J,1009.802,70,0)
 ;;=PALAU^PW^70^^1^0
 ;;^UTILITY(U,$J,1009.802,70,1,0)
 ;;=^1009.812I^18^18
 ;;^UTILITY(U,$J,1009.802,70,1,1,0)
 ;;=AIMELIIK^^002
 ;;^UTILITY(U,$J,1009.802,70,1,2,0)
 ;;=AIRAI^^004
 ;;^UTILITY(U,$J,1009.802,70,1,3,0)
 ;;=ANGAUR^^010
 ;;^UTILITY(U,$J,1009.802,70,1,4,0)
 ;;=KAYANGEL^^100
 ;;^UTILITY(U,$J,1009.802,70,1,5,0)
 ;;=KOROR^^150
 ;;^UTILITY(U,$J,1009.802,70,1,6,0)
 ;;=MELEKEOK^^212
 ;;^UTILITY(U,$J,1009.802,70,1,7,0)
 ;;=NGARAARD^^214
 ;;^UTILITY(U,$J,1009.802,70,1,8,0)
 ;;=NGARCHELONG^^218
 ;;^UTILITY(U,$J,1009.802,70,1,9,0)
 ;;=NGARDMAU^^222
 ;;^UTILITY(U,$J,1009.802,70,1,10,0)
 ;;=NGAREMLENGUI^^223
 ;;^UTILITY(U,$J,1009.802,70,1,11,0)
 ;;=NGATPANG^^224
 ;;^UTILITY(U,$J,1009.802,70,1,12,0)
 ;;=NGCHESAR^^226
 ;;^UTILITY(U,$J,1009.802,70,1,13,0)
 ;;=NGIWAL^^228
 ;;^UTILITY(U,$J,1009.802,70,1,14,0)
 ;;=PELELIU^^350
 ;;^UTILITY(U,$J,1009.802,70,1,15,0)
 ;;=SONSOROL^^370
 ;;^UTILITY(U,$J,1009.802,70,1,16,0)
 ;;=HATOBOHEI^^050
 ;;^UTILITY(U,$J,1009.802,70,1,17,0)
 ;;=NGEREMLENGUI^^227
 ;;^UTILITY(U,$J,1009.802,70,1,18,0)
 ;;=PALAU^^030
 ;;^UTILITY(U,$J,1009.802,72,0)
 ;;=PUERTO RICO^PR^72^^1^1
 ;;^UTILITY(U,$J,1009.802,72,1,0)
 ;;=^1009.812I^79^79
 ;;^UTILITY(U,$J,1009.802,72,1,1,0)
 ;;=999^^^^3050204
 ;;^UTILITY(U,$J,1009.802,72,1,2,0)
 ;;=CULEBRA^^049
 ;;^UTILITY(U,$J,1009.802,72,1,3,0)
 ;;=VIEQUES^^147
 ;;^UTILITY(U,$J,1009.802,72,1,4,0)
 ;;=ADJUNTAS^^001
 ;;^UTILITY(U,$J,1009.802,72,1,5,0)
 ;;=AGUADA^^003
 ;;^UTILITY(U,$J,1009.802,72,1,6,0)
 ;;=AGUADILLA^^005
 ;;^UTILITY(U,$J,1009.802,72,1,7,0)
 ;;=AGUAS BUENAS^^007
 ;;^UTILITY(U,$J,1009.802,72,1,8,0)
 ;;=AIBONITO^^009
 ;;^UTILITY(U,$J,1009.802,72,1,9,0)
 ;;=ANASCO^^011
 ;;^UTILITY(U,$J,1009.802,72,1,10,0)
 ;;=ARECIBO^^013
 ;;^UTILITY(U,$J,1009.802,72,1,11,0)
 ;;=ARROYO^^015
 ;;^UTILITY(U,$J,1009.802,72,1,12,0)
 ;;=BARCELONETA^^017
 ;;^UTILITY(U,$J,1009.802,72,1,13,0)
 ;;=BARRANQUITAS^^019
 ;;^UTILITY(U,$J,1009.802,72,1,14,0)
 ;;=BAYAMON^^021
 ;;^UTILITY(U,$J,1009.802,72,1,15,0)
 ;;=CABO ROJO^^023
 ;;^UTILITY(U,$J,1009.802,72,1,16,0)
 ;;=CAGUAS^^025
 ;;^UTILITY(U,$J,1009.802,72,1,17,0)
 ;;=CAMUY^^027
 ;;^UTILITY(U,$J,1009.802,72,1,18,0)
 ;;=CANOVANAS^^029
 ;;^UTILITY(U,$J,1009.802,72,1,19,0)
 ;;=CAROLINA^^031
 ;;^UTILITY(U,$J,1009.802,72,1,20,0)
 ;;=CATANO^^033
 ;;^UTILITY(U,$J,1009.802,72,1,21,0)
 ;;=CAYEY^^035
 ;;^UTILITY(U,$J,1009.802,72,1,22,0)
 ;;=CEIBA^^037
 ;;^UTILITY(U,$J,1009.802,72,1,23,0)
 ;;=CIALES^^039
 ;;^UTILITY(U,$J,1009.802,72,1,24,0)
 ;;=CIDRA^^041
 ;;^UTILITY(U,$J,1009.802,72,1,25,0)
 ;;=COAMO^^043
 ;;^UTILITY(U,$J,1009.802,72,1,26,0)
 ;;=COMERIO^^045
 ;;^UTILITY(U,$J,1009.802,72,1,27,0)
 ;;=COROZAL^^047
 ;;^UTILITY(U,$J,1009.802,72,1,28,0)
 ;;=DORADO^^051
 ;;^UTILITY(U,$J,1009.802,72,1,29,0)
 ;;=FAJARDO^^053
 ;;^UTILITY(U,$J,1009.802,72,1,30,0)
 ;;=FLORIDA^^054
 ;;^UTILITY(U,$J,1009.802,72,1,31,0)
 ;;=GUANICA^^055
 ;;^UTILITY(U,$J,1009.802,72,1,32,0)
 ;;=GUAYAMA^^057
 ;;^UTILITY(U,$J,1009.802,72,1,33,0)
 ;;=GUAYANILLA^^059
 ;;^UTILITY(U,$J,1009.802,72,1,34,0)
 ;;=GUAYNABO^^061
 ;;^UTILITY(U,$J,1009.802,72,1,35,0)
 ;;=GURABO^^063
 ;;^UTILITY(U,$J,1009.802,72,1,36,0)
 ;;=HATILLO^^065
 ;;^UTILITY(U,$J,1009.802,72,1,37,0)
 ;;=HORMIGUEROS^^067
 ;;^UTILITY(U,$J,1009.802,72,1,38,0)
 ;;=HUMACAO^^069
 ;;^UTILITY(U,$J,1009.802,72,1,39,0)
 ;;=ISABELA^^071
 ;;^UTILITY(U,$J,1009.802,72,1,40,0)
 ;;=JAYUYA^^073
 ;;^UTILITY(U,$J,1009.802,72,1,41,0)
 ;;=JUANA DIAZ^^075
 ;;^UTILITY(U,$J,1009.802,72,1,42,0)
 ;;=JUNCOS^^077
 ;;^UTILITY(U,$J,1009.802,72,1,43,0)
 ;;=LAJAS^^079
 ;;^UTILITY(U,$J,1009.802,72,1,44,0)
 ;;=LARES^^081
 ;;^UTILITY(U,$J,1009.802,72,1,45,0)
 ;;=LAS MARIAS^^083
 ;;^UTILITY(U,$J,1009.802,72,1,46,0)
 ;;=LAS PIEDRAS^^085
 ;;^UTILITY(U,$J,1009.802,72,1,47,0)
 ;;=LOIZA^^087
 ;;^UTILITY(U,$J,1009.802,72,1,48,0)
 ;;=LUQUILLO^^089
 ;;^UTILITY(U,$J,1009.802,72,1,49,0)
 ;;=MANATI^^091
 ;;^UTILITY(U,$J,1009.802,72,1,50,0)
 ;;=MARICAO^^093
 ;;^UTILITY(U,$J,1009.802,72,1,51,0)
 ;;=MAUNABO^^095
 ;;^UTILITY(U,$J,1009.802,72,1,52,0)
 ;;=MAYAGUEZ^^097
 ;;^UTILITY(U,$J,1009.802,72,1,53,0)
 ;;=MOCA^^099
 ;;^UTILITY(U,$J,1009.802,72,1,54,0)
 ;;=MOROVIS^^101
 ;;^UTILITY(U,$J,1009.802,72,1,55,0)
 ;;=NAGUABO^^103
 ;;^UTILITY(U,$J,1009.802,72,1,56,0)
 ;;=NARANJITO^^105
 ;;^UTILITY(U,$J,1009.802,72,1,57,0)
 ;;=OROCOVIS^^107
 ;;^UTILITY(U,$J,1009.802,72,1,58,0)
 ;;=PATILLAS^^109
 ;;^UTILITY(U,$J,1009.802,72,1,59,0)
 ;;=PENUELAS^^111
 ;;^UTILITY(U,$J,1009.802,72,1,60,0)
 ;;=PONCE^^113
 ;;^UTILITY(U,$J,1009.802,72,1,61,0)
 ;;=QUEBRADILLAS^^115
 ;;^UTILITY(U,$J,1009.802,72,1,62,0)
 ;;=RINCON^^117
 ;;^UTILITY(U,$J,1009.802,72,1,63,0)
 ;;=RIO GRANDE^^119
 ;;^UTILITY(U,$J,1009.802,72,1,64,0)
 ;;=SABANA GRANDE^^121
 ;;^UTILITY(U,$J,1009.802,72,1,65,0)
 ;;=SALINAS^^123
 ;;^UTILITY(U,$J,1009.802,72,1,66,0)
 ;;=SAN GERMAN^^125
 ;;^UTILITY(U,$J,1009.802,72,1,67,0)
 ;;=SAN LORENZO^^129
 ;;^UTILITY(U,$J,1009.802,72,1,68,0)
 ;;=SAN SEBASTIAN^^131
 ;;^UTILITY(U,$J,1009.802,72,1,69,0)
 ;;=SANTA ISABEL^^133
 ;;^UTILITY(U,$J,1009.802,72,1,70,0)
 ;;=TOA ALTA^^135
 ;;^UTILITY(U,$J,1009.802,72,1,71,0)
 ;;=TOA BAJA^^137
 ;;^UTILITY(U,$J,1009.802,72,1,72,0)
 ;;=TRUJILLO ALTO^^139
 ;;^UTILITY(U,$J,1009.802,72,1,73,0)
 ;;=UTUADO^^141
 ;;^UTILITY(U,$J,1009.802,72,1,74,0)
 ;;=VEGA ALTA^^143
 ;;^UTILITY(U,$J,1009.802,72,1,75,0)
 ;;=VEGA BAJA^^145
 ;;^UTILITY(U,$J,1009.802,72,1,76,0)
 ;;=VILLALBA^^149
 ;;^UTILITY(U,$J,1009.802,72,1,77,0)
 ;;=YABUCOA^^151
 ;;^UTILITY(U,$J,1009.802,72,1,78,0)
 ;;=YAUCO^^153
 ;;^UTILITY(U,$J,1009.802,72,1,79,0)
 ;;=SAN JUAN^^127
 ;;^UTILITY(U,$J,1009.802,74,0)
 ;;=U.S. MINOR OUTLYING ISLANDS^UM^74^^1^1
 ;;^UTILITY(U,$J,1009.802,74,1,0)
 ;;=^1009.812I^10^10
 ;;^UTILITY(U,$J,1009.802,74,1,1,0)
 ;;=JOHNSTON ISLAND^200^200
 ;;^UTILITY(U,$J,1009.802,74,1,2,0)
 ;;=MIDWAY ISLANDS^300^300
 ;;^UTILITY(U,$J,1009.802,74,1,3,0)
 ;;=WAKE ISLAND^450^450
 ;;^UTILITY(U,$J,1009.802,74,1,4,0)
 ;;=NAVASSA ISLAND^350^350
 ;;^UTILITY(U,$J,1009.802,74,1,5,0)
 ;;=BAKER ISLAND^050^050
 ;;^UTILITY(U,$J,1009.802,74,1,6,0)
 ;;=HOWLAND ISLAND^100^100
 ;;^UTILITY(U,$J,1009.802,74,1,7,0)
 ;;=JARVIS ISLAND^150^150
 ;;^UTILITY(U,$J,1009.802,74,1,8,0)
 ;;=KINGMAN REEF^250^250
 ;;^UTILITY(U,$J,1009.802,74,1,9,0)
 ;;=PALMYRA ATOLL^400^400
 ;;^UTILITY(U,$J,1009.802,74,1,10,0)
 ;;=ALL OTHER^999^999
 ;;^UTILITY(U,$J,1009.802,78,0)
 ;;=VIRGIN ISLANDS^VI^78^^1^1
 ;;^UTILITY(U,$J,1009.802,78,1,0)
 ;;=^1009.812I^5^5
 ;;^UTILITY(U,$J,1009.802,78,1,1,0)
 ;;=999
 ;;^UTILITY(U,$J,1009.802,78,1,2,0)
 ;;=ST. CROIX^^010
 ;;^UTILITY(U,$J,1009.802,78,1,3,0)
 ;;=ST. JOHN^^020
 ;;^UTILITY(U,$J,1009.802,78,1,4,0)
 ;;=ST. THOMAS^^030
 ;;^UTILITY(U,$J,1009.802,78,1,5,0)
 ;;=ALL OTHER^^999
 ;;^UTILITY(U,$J,1009.802,90,0)
 ;;=FOREIGN COUNTRY^FG^90^^1^0
 ;;^UTILITY(U,$J,1009.802,90,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,90,1,1,0)
 ;;=ALL OTHER FOREIGN^^999
 ;;^UTILITY(U,$J,1009.802,91,0)
 ;;=MEXICO^MX^92^^1^0
 ;;^UTILITY(U,$J,1009.802,91,1,0)
 ;;=^1009.812I^4^4
 ;;^UTILITY(U,$J,1009.802,91,1,1,0)
 ;;=260
 ;;^UTILITY(U,$J,1009.802,91,1,2,0)
 ;;=595
 ;;^UTILITY(U,$J,1009.802,91,1,3,0)
 ;;=CANADA^^260
 ;;^UTILITY(U,$J,1009.802,91,1,4,0)
 ;;=MEXICO^^595
 ;;^UTILITY(U,$J,1009.802,93,0)
 ;;=EUROPE^EU^93^^1^0
 ;;^UTILITY(U,$J,1009.802,93,1,0)
 ;;=^1009.812I^2^2
 ;;^UTILITY(U,$J,1009.802,93,1,1,0)
 ;;=999
 ;;^UTILITY(U,$J,1009.802,93,1,2,0)
 ;;=EUROPE^^999
 ;;^UTILITY(U,$J,1009.802,96,0)
 ;;=PHILIPPINES^PH^96^^1^0
 ;;^UTILITY(U,$J,1009.802,96,1,0)
 ;;=^1009.812I^2^2
 ;;^UTILITY(U,$J,1009.802,96,1,1,0)
 ;;=725
 ;;^UTILITY(U,$J,1009.802,96,1,2,0)
 ;;=PHILIPINES^^725
 ;;^UTILITY(U,$J,1009.802,98,0)
 ;;=CANADA^CANAD^91^^0^0
 ;;^UTILITY(U,$J,1009.802,98,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,98,1,1,0)
 ;;=CANADA^^260
 ;;^UTILITY(U,$J,1009.802,99,0)
 ;;=QUEBEC^QC^80^^1^0
 ;;^UTILITY(U,$J,1009.802,99,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,99,1,1,0)
 ;;=QUEBEC^^260
 ;;^UTILITY(U,$J,1009.802,100,0)
 ;;=ALBERTA^AB^58^^1^0
 ;;^UTILITY(U,$J,1009.802,100,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,100,1,1,0)
 ;;=ALBERTA^^260
 ;;^UTILITY(U,$J,1009.802,101,0)
 ;;=BRITISH COLUMBIA^BC^59^^1^0
 ;;^UTILITY(U,$J,1009.802,101,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,101,1,1,0)
 ;;=BRITISH COLUMBIA^^260
 ;;^UTILITY(U,$J,1009.802,102,0)
 ;;=MANITOBA^MB^61^^1^0
 ;;^UTILITY(U,$J,1009.802,102,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,102,1,1,0)
 ;;=MANITOBA^^260
 ;;^UTILITY(U,$J,1009.802,103,0)
 ;;=NEW BRUNSWICK^NB^62^^1^0
 ;;^UTILITY(U,$J,1009.802,103,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,103,1,1,0)
 ;;=NEW BRUNSWICK^^260
 ;;^UTILITY(U,$J,1009.802,104,0)
 ;;=NEWFOUNDLAND^NF^63^^1^0
 ;;^UTILITY(U,$J,1009.802,104,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,104,1,1,0)
 ;;=NEWFOUNDLAND^^260
 ;;^UTILITY(U,$J,1009.802,105,0)
 ;;=NOVA SCOTIA^NS^65^^1^0
 ;;^UTILITY(U,$J,1009.802,105,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,105,1,1,0)
 ;;=NOVA SCOTIA^^260
 ;;^UTILITY(U,$J,1009.802,106,0)
 ;;=NORTHWEST TERRITORIES^NT^73^^1^0
 ;;^UTILITY(U,$J,1009.802,106,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,106,1,1,0)
 ;;=NORTHWEST TERRITORIES^^260
 ;;^UTILITY(U,$J,1009.802,107,0)
 ;;=ONTARIO^ON^75^^1^0
 ;;^UTILITY(U,$J,1009.802,107,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,107,1,1,0)
 ;;=ONTARIO^^260
 ;;^UTILITY(U,$J,1009.802,108,0)
 ;;=PRINCE EDWARD ISLAND^PE^77^^1^0
 ;;^UTILITY(U,$J,1009.802,108,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,108,1,1,0)
 ;;=PRINCE EDWARD ISLAND^^260
 ;;^UTILITY(U,$J,1009.802,109,0)
 ;;=SASKATCHEWAN^SK^82^^1^0
 ;;^UTILITY(U,$J,1009.802,109,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,109,1,1,0)
 ;;=SASKATCHEWAN^^260
 ;;^UTILITY(U,$J,1009.802,110,0)
 ;;=YUKON TERRITORY^YT^83^^1^0
 ;;^UTILITY(U,$J,1009.802,110,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,110,1,1,0)
 ;;=YUKON TERRITORY^^260
 ;;^UTILITY(U,$J,1009.802,111,0)
 ;;=ARMED FORCES AMER (EXC CANADA)^AA^85^^1^1
 ;;^UTILITY(U,$J,1009.802,111,1,0)
 ;;=^1009.812I^2^2
 ;;^UTILITY(U,$J,1009.802,111,1,1,0)
 ;;=ARMED FORCES AMER (EXC CA^^260
 ;;^UTILITY(U,$J,1009.802,111,1,2,0)
 ;;=ARMED FORCES^^000
 ;;^UTILITY(U,$J,1009.802,112,0)
 ;;=ARMED FORCES AF,EU,ME,CA^AE^87^^1^1
 ;;^UTILITY(U,$J,1009.802,112,1,0)
 ;;=^1009.812I^2^2
 ;;^UTILITY(U,$J,1009.802,112,1,1,0)
 ;;=ARMED FORCES AF,EU,ME,CA^^260
 ;;^UTILITY(U,$J,1009.802,112,1,2,0)
 ;;=ARMED FORCES^^000
 ;;^UTILITY(U,$J,1009.802,113,0)
 ;;=ARMED FORCES PACIFIC^AP^88^^1^1
 ;;^UTILITY(U,$J,1009.802,113,1,0)
 ;;=^1009.812I^2^2
 ;;^UTILITY(U,$J,1009.802,113,1,1,0)
 ;;=ARMED FORCES PACIFIC^^260
 ;;^UTILITY(U,$J,1009.802,113,1,2,0)
 ;;=ARMED FORCES^^000
 ;;^UTILITY(U,$J,1009.802,114,0)
 ;;=NUNAVUT PROVINCE^NU^94^^1^0
 ;;^UTILITY(U,$J,1009.802,114,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,114,1,1,0)
 ;;=NUNAVUT PROVINCE^^260
 ;;^UTILITY(U,$J,1009.802,115,0)
 ;;=UNKNOWN^UN^99^^1^0
 ;;^UTILITY(U,$J,1009.802,115,1,0)
 ;;=^1009.812I^1^1
 ;;^UTILITY(U,$J,1009.802,115,1,1,0)
 ;;=OTHER^^999

DMUFI00I
DMUFI00I ; ; 10-JAN-2013 ; 1/27/13 3:47pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 F I=1:2 S X=$T(Q+I) Q:X=""  S Y=$E($T(Q+I+1),4,999),X=$E(X,4,999) S:$A(Y)=126 I=I+1,Y=$E(Y,2,999)_$E($T(Q+I+1),5,999) S:$A(Y)=61 Y=$E(Y,2,999) X NO E  S @X=Y
Q Q
 ;;^UTILITY(U,$J,"PKG",218,0)
 ;;=FILEMAN EXTENSIONS FILES^DMUF^Package contains files for Fileman Extensions
 ;;^UTILITY(U,$J,"PKG",218,1,0)
 ;;=^^4^4^3130110^
 ;;^UTILITY(U,$J,"PKG",218,1,1,0)
 ;;=Package contains files for Fileman Extensions.
 ;;^UTILITY(U,$J,"PKG",218,1,2,0)
 ;;= 
 ;;^UTILITY(U,$J,"PKG",218,1,3,0)
 ;;=These are Unit Test or Documentation related and are not necessary for 
 ;;^UTILITY(U,$J,"PKG",218,1,4,0)
 ;;=the functioning of Fileman.
 ;;^UTILITY(U,$J,"PKG",218,4,0)
 ;;=^9.44PA^2^2
 ;;^UTILITY(U,$J,"PKG",218,4,1,0)
 ;;=1009.801
 ;;^UTILITY(U,$J,"PKG",218,4,1,222)
 ;;=y^y^^n^^^y^o^n
 ;;^UTILITY(U,$J,"PKG",218,4,2,0)
 ;;=1009.802
 ;;^UTILITY(U,$J,"PKG",218,4,2,222)
 ;;=y^y^^n^^^y^o^n
 ;;^UTILITY(U,$J,"PKG",218,4,"B",1009.801,1)
 ;;=
 ;;^UTILITY(U,$J,"PKG",218,4,"B",1009.802,2)
 ;;=
 ;;^UTILITY(U,$J,"PKG",218,22,0)
 ;;=^9.49I^1^1
 ;;^UTILITY(U,$J,"PKG",218,22,1,0)
 ;;=0.1^3130110
 ;;^UTILITY(U,$J,"PKG",218,22,"B","0.1",1)
 ;;=
 ;;^UTILITY(U,$J,"PKG",218,"DIPT",0)
 ;;=^9.46
 ;;^UTILITY(U,$J,"SBF",1009.801,1009.801)
 ;;=
 ;;^UTILITY(U,$J,"SBF",1009.802,1009.802)
 ;;=
 ;;^UTILITY(U,$J,"SBF",1009.802,1009.812)
 ;;=
 ;;^UTILITY(U,$J,"SBF",1009.802,1009.822)
 ;;=

DMUFINI1
DMUFINI1 ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ; LOADS AND INDEXES DD'S
 ;
 K DIF,DIK,D,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DFR,DTN,DIX,DZ D DT^DICRW S %=1,U="^",DSEC=1
 S NO=$P("I 0^I $D(@X)#2,X[U",U,%) I %<1 K DIFQ Q
ASK I %=1,$D(DIFQ(0)) S DSEC=1 ; W !,"SHALL I WRITE OVER FILE SECURITY CODES" S %=2 D YN^DICN S DSEC=%=1 I %<1 K DIFQ Q
 Q:'$D(DIFQ)  ; S %=2 W !!,"ARE YOU SURE EVERYTHING'S OK" D YN^DICN I %-1 K DIFQ Q
 I $D(DIFKEP) F DIDIU=0:0 S DIDIU=$O(DIFKEP(DIDIU)) Q:DIDIU'>0  S DIU=DIDIU,DIU(0)=DIFKEP(DIDIU) D EN^DIU2
 D DT^DICRW K ^UTILITY(U,$J),^UTILITY("DIK",$J) D WAIT^DICD
 S DN="^DMUFI" F R=1:1:18 D @(DN_$$B36(R)) W "."
 F  S D=$O(^UTILITY(U,$J,"SBF","")) Q:D'>0  K:'DIFQ(D) ^(D) S D=$O(^(D,"")) I D>0  K ^(D) D IX
KEYSNIX ; Keys and new style indexes installer ; new in FM V22.2
 N DIFRSA S DIFRSA=$NA(^UTILITY("KX",$J)) ; Tran global for Keys and Indexes
 N DIFRFILE S DIFRFILE=0 ; Loop through files
 F  S DIFRFILE=$O(@DIFRSA@("IX",DIFRFILE)) Q:'DIFRFILE  D
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . N DIFRD S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA) ; install New Style Indexes
 . K ^TMP("DIFROMS2",$J,"TRIG")
 . S DIFRD=0
 . F  S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA) ; install keys
 K @DIFRSA ; kill off tran global
 ; VEN/SMH v22.2: Below I added a K D1 because it leaks from the call causing the key matching algo to fail.
DATA W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0
 I DIFQR(D) S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=DIFQR(D)'=2 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 K D1 Q:'$D(^(D0,0))  S Z=^(0) D I^DITR
 K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA
 ;
W S Y=$P($T(@X),";",2) W !,"NOTE: This package also contains "_Y_"S",! Q:'$D(DIFQ(0))
 S %=1 W ?6,"SHALL I WRITE OVER EXISTING "_Y_"S OF THE SAME NAME" D YN^DICN I '% W !?6,"Answer YES to replace the current "_Y_"S with the incoming ones." G W
 S:%=2 DIFQ(X)=0 K:%<0 DIFQ
 Q
 ;
OPT ;OPTION
RTN ;ROUTINE DOCUMENTATION NOTE
FUN ;FUNCTION
BUL ;BULLETIN
KEY ;SECURITY KEY
HEL ;HELP FRAME
DIP ;PRINT TEMPLATE
DIE ;INPUT TEMPLATE
DIB ;SORT TEMPLATE
DIS ;FORM
REM ;REMOTE PROCEDURE
 ;
SBF ;FILE AND SUB FILE NUMBERS
IX W "." S DIK="A" F %=0:0 S DIK=$O(^DD(D,DIK)) Q:DIK=""  K ^(DIK)
 S DA(1)=D,DIK="^DD("_D_"," D IXALL^DIK
 I $D(^DIC(D,"%",0)) S DIK="^DIC(D,""%""," G IXALL^DIK
 Q
B36(X) Q $$N(X\(36*36)#36+1)_$$N(X\36#36+1)_$$N(X#36+1)
N(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

DMUFINI2
DMUFINI2 ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J),DIC S DIDUZ=0 S:$D(DUZ)#2 DIDUZ=DUZ S DUZ=.5
 I $D(^DIC(9.2,0))#2,^(0)?1"HEL".E S (DIC,DLAYGO)=9.2,N="HEL",DIC(0)="LX" G ADD
 Q
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R'>0  S X=$P(^(R,0),U,1) W "." K DA D ^DIC I Y>0,'$D(DIFQ(N))!$P(Y,U,3) S ^UTILITY("DIFROM",$J,N,X)=+Y K ^DIC(9.2,+Y,1),^(2),^(3),^(10) S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y D %XY^%RCR
 S DIK=DIC
HELP S R=$O(^UTILITY("DIFROM",$J,N,R)) Q:R=""  W !,"'"_R_"' Help Frame filed." S DA=^(R)
 F X=0:0 S X=$O(^DIC(9.2,DA,2,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$P(I,U,2) S:Y]"" Y=$O(^DIC(9.2,"B",Y,0)) S ^(0)=$P(^DIC(9.2,DA,2,X,0),U,1)_U_$S(Y>0:Y,1:"")_U_$P(^(0),U,3,99)
 S I=0 F X=0:0 S X=$O(^DIC(9.2,DA,10,X)) Q:'X  I $D(^(X,0)) S Y=$P(^(0),U),Y=$S(Y]"":$O(^MAG("B",Y,0)),1:0) S:Y $P(^DIC(9.2,DA,10,X,0),U)=Y,I=I+1,%=X I 'Y K ^DIC(9.2,DA,10,X,0)
 I I S $P(^DIC(9.2,DA,10,0),U,3,4)=%_U_I
IX D IX1^DIK G HELP
 ;
U I $D(DIRUT) S DIFQ=1
 W ! Q
REP S DIR(0)="Y",DIR("A")="Shall I change the NAME of the file to "_DIF
 S DIR("??")="^D REP^DIFROMH1",DIR("B")="NO" D ^DIR G U:$D(DIRUT)
 I Y S DIE=1,DIFQ=0,DA=N,DR=".01////"_DIF D ^DIE Q
 S DIR("A")="Shall I replace your file with mine"
 S DIR("??")="^D AG^DIFROMH1" D ^DIR G U:$D(DIRUT)!'Y
 S DIU(0)="E",DIR("A")="Do you want to keep the Data"
 S DIR("??")="^D CHG^DIFROMH1" D ^DIR G U:$D(DIRUT)
 S:'Y DIU(0)=DIU(0)_"D"
 S DIR("A")="Do you want to keep the Templates"
 S DIR("??")="^D TEMP^DIFROMH1" D ^DIR G U:$D(DIRUT) S:'Y DIU(0)=DIU(0)_"T"
 S DIFQ(N)=1,DIFKEP(N)=DIU(0) W !?15," (",DIF,") " Q

DMUFINI3
DMUFINI3 ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
 K ^UTILITY("DIFROM",$J) S DIC(0)="LX",(DIC,DLAYGO)=3.6,N="BUL" D ADD:$D(^XMB(3.6,0))
 S X=0 F R=0:0 S X=$O(^UTILITY("DIFROM",$J,N,X)) Q:X=""  W !,"'",X,"' BULLETIN FILED -- Remember to add mail groups for new bulletins."
 I $D(^DIC(9.4,0))#2,^(0)?1"PACK".E S N="PKG",(DIC,DLAYGO)=9.4 D ADD
 G NP:'$D(DA) S %=+$O(^DIC(9.4,DA,22,"B",DIFROM,0)) I $D(^DIC(9.4,DA,22,%,0)) S $P(^(0),U,3)=DT
 I $D(^DIC(9.4,DA,0))#2 S %=$P(^(0),U,4) I %]"" S %=$O(^DIC(9.2,"B",%,0)) S:%]"" $P(^DIC(9.4,DA,0),U,4)=%
OR I $D(^ORD(100.99))&$O(^UTILITY(U,$J,"OR","")) D EN^DMUFINI4
NP K DIC,^UTILITY("DIFROM",$J) S DIC(0)="LX" I $D(^DIC(19,0))#2,^(0)?1"OPTION".E S (DIC,DLAYGO)=19,N="OPT" D ADD,OP
 I $D(^DIC(19.1,0))#2,($P(^(0),U)?1"SECUR".E)!($P(^(0),U)="KEY") S (DIC,DLAYGO)=19.1,N="KEY" D ADD K ^UTILITY("DIFROM",$J)
 I $D(^DIC(9.8,0))#2,^(0)?1"ROUTINE^".E S (DIC,DLAYGO)=9.8,N="RTN" D ADD
 S DIC=.5,DLAYGO=0,N="FUN" D ADD
 I $P($G(^DIC(8994,0)),U)="REMOTE PROCEDURE" S (DIC,DLAYGO)=8994,N="REM" D ADD
 S DIC("S")="I $P(^(0),U,4)=DIFL" F N="DIPT","DIBT","DIE" S DIC=U_N_"(" D ADD
 K DIC("S") S N="DIST(.404,",DIC=U_N,DLAYGO=.404 D ADD
 S DIC("S")="I $P(^(0),U,8)=DIFL",N="DIST(.403,",DIC=U_N,DLAYGO=.403 D ADD
 K ^UTILITY(U,$J),DIC,DLAYGO F DIFR="DIE","DIPT" D DIEZ
 K ^UTILITY("DIFROM",$J) Q
DIEZ I ^DD("VERSION")>17.4,'$D(DISYS) D OS^DII
 E  S DISYS=^DD("OS")
 Q:'$D(^DD("OS",DISYS,"ZS"))
 S DIFR1=""
DZ1 S DIFR1=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1)) Q:DIFR1=""
 F DIFR2=0:0 S DIFR2=$O(^UTILITY("DIFROM",$J,DIFR,DIFR1,DIFR2)) Q:'DIFR2  S Y=DIFR2 I $D(@(U_DIFR_"(Y,""ROU"")")) K ^("ROU") I $D(^("ROUOLD")) S X=^("ROUOLD"),DMAX=^DD("ROU") D:X]"" @("EN^DI"_$E(DIFR,3)_"Z")
 G DZ1
 ;
OP S R=$O(^UTILITY("DIFROM",$J,N,R)) I R="" K ^UTILITY("DIFROM",$J) G Q
 W !,"'"_R_"' Option Filed" S DA=+^UTILITY("DIFROM",$J,N,R) G:$P(^(R),U,2,3)="XUCORE^"!($P(^(R),U,2,3)="XUCOMMAND^") OP
 I $D(^DIC(19,DA,220)) S %=$P(^(220),U) S:%]"" %=$O(^XMB(3.6,"B",%,0)) S $P(^DIC(19,DA,220),U)=%,%=$P(^(220),U,3) S:%]"" %=$O(^XMB(3.8,"B",%,0)) S $P(^DIC(19,DA,220),U,3)=%
 S %=$P(^DIC(19,DA,0),U,12) S:%]"" %=$O(^DIC(9.4,"B",%,0))
 S $P(^DIC(19,DA,0),U,12)=%,%=$P(^(0),U,7),(DZ,DIX)=0
 D:$D(^DIC(19,DA,10,"B")) KAD(DA) S:%]"" %=$O(^DIC(9.2,"B",%,0)) S $P(^DIC(19,DA,0),U,7)=%,%=$P(^(0),U,4),%="MOQXL"[% K ^(10,"B"),^("C")
 F X=0:0 S X=$O(^DIC(19,DA,10,X)) Q:'X  S I=$S($D(^(X,0)):^(0),1:0),Y=$S($D(^(U)):^(U),1:"") K ^DIC(19,DA,10,X) I Y]"",% S D=$O(^DIC(19,"B",Y,0)) I D S ^DIC(19,DA,10,X,0)=D_U_$P(I,U,2,9),DZ=DZ+1,DIX=X
 S:% ^DIC(19,DA,10,0)="^19.01PI^"_DIX_U_DZ D IX1^DIK G OP
 ;
ADD F R=0:0 S R=$O(^UTILITY(U,$J,N,R)) Q:R=""  S X=$P(^(R,0),U),DIFL=$S(N="DIST(.403,":$P(^(0),U,8),N="DIST(.404,":$P(^(0),U,2),1:$P(^(0),U,4)) W "." K DA D ^DIC I Y>0,'$D(DIFQ($E(N,1,3)))!$P(Y,U,3) S Y=Y_U D A
Q Q
A I N="BUL" K % S %(0)=$G(@(DIC_"+Y,2,0)")) F %=0:0 S %=$O(@(DIC_"+Y,2,%)")) Q:'%  S %(%)=$G(^(%,0))
 K:N'="KEY"&(N'="OPT") @(DIC_"+Y)") S ^UTILITY("DIFROM",$J,N,X)=Y S:$E(N,1,2)="DI" ^(X,+Y)="" S:N="PKG" DIFROM(0)=+Y Q:$P(Y,U,2,3)="XUCORE^"!($P(Y,U,2,3)="XUCOMMAND^")
 I N="BUL",%(0)]"" S @(DIC_"+Y,2,0)")=%(0) F %=0:0 S %=$O(%(%)) Q:'%  S @(DIC_"+Y,2,%,0)")=%(%)
 I $E(N,1,2)="DI",('DIFL)!('$D(^DD(+DIFL))) D
 .W !,"**WARNING--"_$S(N="DIE":"INPUT",N="DIPT":"PRINT",N="DIBT":"SORT",1:"FORM or BLOCK")_$S(N'["DIST":" template ",1:" ")_$P(Y,U,2)_" has been installed,",!,"but associated file "_DIFL_" is not on your system!"
 .Q
 I N="OPT" S:$P(^DIC(19,+Y,0),U,6)]"" DIOPT=$P(^(0),U,6) I $O(^UTILITY(U,$J,N,R,1,0)) K ^DIC(19,+Y,1)
 I N="DIST(.403," D BLK
 S %X="^UTILITY(U,$J,N,R,",%Y=DIC_"+Y,",DA=+Y,DIK=DIC D %XY^%RCR
 D IX1^DIK:N'="OPT" I N="OPT",$D(DIOPT) S:$P(^DIC(19,DA,0),U,6)="" $P(^(0),U,6)=DIOPT K DIOPT
 I N="DIST(.403," D
 .N DIFRVAL S DIFRVAL=$$VAL^DIFROMSS(.403,DA)
 .I DIFRVAL W !,"Compiling form: ",$P(^DIST(.403,DA,0),U) D EN^DDSZ(DA) Q
 .W !,"ERROR: Form: ",$P(^DIST(.403,DA,0),U)," cannot be compiled"
 .Q
 Q
BLK F J=0:0 S J=$O(^UTILITY(U,$J,N,R,40,J)) Q:'J  I $D(^(J,0)) S %=$P(^(0),U,2) S:%]"" %=$O(^DIST(.404,"B",%,0)) S:% $P(^UTILITY(U,$J,N,R,40,J,0),U,2)=% D B1
 K A0,A1,A2,J,L Q
B1 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,40,L)) Q:'L  S A0=$G(^(L,0)),%=$P(A0,U) I %]"" S %=$O(^DIST(.404,"B",%,0)) I % S $P(A0,U)=%,^UTILITY(U,$J,N,R,40,J,"BLK",%,0)=A0 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,40,L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,"BLK",%,X)=^(X)
 .Q
 S A0=$G(^UTILITY(U,$J,N,R,40,J,40,0)) Q:A0=""  K ^UTILITY(U,$J,N,R,40,J,40) S (A1,A2)=0
 F L=0:0 S L=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L)) Q:'L  S ^UTILITY(U,$J,N,R,40,J,40,L,0)=^(L,0),A1=L,A2=A2+1 D
 .N X S X=0
 .F  S X=$O(^UTILITY(U,$J,N,R,40,J,"BLK",L,X)) Q:X=""  S ^UTILITY(U,$J,N,R,40,J,40,L,X)=^(X)
 .Q
 S $P(A0,U,3,4)=A1_U_A2,^UTILITY(U,$J,N,R,40,J,40,0)=A0 K ^UTILITY(U,$J,N,R,40,J,"BLK")
 Q
KAD(D0) N D1,X
 S X=0 F  S X=$O(^DIC(19,D0,10,"B",X)) Q:X'>0  S D1=0 F  S D1=$O(^DIC(19,D0,10,"B",X,D1)) Q:D1'>0  K ^DIC(19,"AD",X,D0,D1)
 Q

DMUFINI4
DMUFINI4 ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 ;
EN S DA(1)=1,DIK="^ORD(100.99,1,5," I $D(^ORD(100.99,1,5,DA)) D ^DIK
 S %X="^UTILITY(U,$J,""OR"","_$O(^UTILITY(U,$J,"OR",""))_",",%Y=DIK_DA_","
 S:'$D(^ORD(100.99,1,5,0)) ^(0)="^100.995P^^" S $P(^(0),U,3,4)=DA_U_($P(^(0),U,4)+1)
 D %XY^%RCR S $P(^ORD(100.99,1,5,DA,0),U)=DA,%=$P(^(0),U,4)
 I %]"" S %=$O(^ORD(100.98,"B",%,0)) I %>0 S $P(^ORD(100.99,1,5,DA,0),U,4)=%
 D OR
 S DA(1)=1 D IX1^DIK
 Q
OR S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,1,N)) Q:'N  S X=$P(^(N,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,0)=% S X=N,I=I+1,(R,J)=0,Y="" D OR1
 S:I $P(^ORD(100.99,1,5,DA,1,0),U,3,4)=X_U_I S (N,I)=0,X=""
 F  S N=$O(^ORD(100.99,1,5,DA,5,N)) Q:'N  S X=$P(^(N,0),U,3) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% $P(^ORD(100.99,1,5,DA,5,N,0),U,3)=% S X=N,I=I+1
 S:I $P(^ORD(100.99,1,5,DA,5,0),U,3,4)=X_U_I K N,R,X,Y,I,J
 Q
OR1 N X F  S R=$O(^ORD(100.99,1,5,DA,1,N,1,R)) Q:'R  S X=$P(^(R,0),U) I X]"" S %=$O(^ORD(101,"B",X,0)) D:'% ADDP S:% ^ORD(100.99,1,5,DA,1,N,1,R,0)=% S Y=R,J=J+1
 S:J $P(^ORD(100.99,1,5,DA,1,N,1,0),U,3,4)=Y_U_J
 Q
ADDP N I,J,N,R,DA,DLAYGO,DO S %=""
 S DIC="^ORD(101,",DIC(0)="LX",DLAYGO=101 D FILE^DICN K DIC Q:Y=-1  S %=+Y Q

DMUFINI5
DMUFINI5 ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 K ^UTILITY("DIF",$J) S DIFRDIFI=1 F I=1:1:4 S ^UTILITY("DIF",$J,DIFRDIFI)=$T(IXF+I),DIFRDIFI=DIFRDIFI+1
 Q
IXF ;;FILEMAN EXTENSIONS FILES^DMUF
 ;;1009.801;BROKEN FILE;^DMU(1009.801,;0;y;y;;n;;;y;o;n
 ;;
 ;;1009.802;SHADOW STATE;^DMU(1009.802,;0;y;y;;n;;;y;o;n
 ;;

DMUFINIS
DMUFINIS ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
PAC(PKG,VER) ; called from package init (DIFROM7 created this routine)
 ; PKG = $T(IXF) of the INIT routine.
 ; VER is an array that is contained in DIFROM from the INIT routine
 ;
 N %,%I,%H,DATE,DIFROM,NOW,PACKAGE,RUN,SERVER,SITE,START,X,XMDUZ,XMSUB,XMTEXT,XMY,Y K ^TMP("DMUFINIS",$J)
 ;
 ; Site tracking updates only occur if run in a VA production primary domain
 ; account.
 I $G(^XMB("NETNAME"))'[".VA.GOV" Q
 Q:'$D(^%ZOSF("UCI"))  Q:'$D(^%ZOSF("PROD"))
 X ^%ZOSF("UCI") I Y'=^%ZOSF("PROD") Q
 ;
 S SERVER="S.A5CSTS@FORUM.VA.GOV"
 S PACKAGE=$P($P(PKG,";",3),U)
 S SITE=$G(^XMB("NETNAME"))
 S START=$P($G(^DIC(9.4,VER(0),"PRE")),U,2) I '$L(START) S START="Unknown"
 D  ; check if ok to use kernel functions
 .S X="XLFDT" X ^%ZOSF("TEST") I $T D  Q
 ..S NOW=$$HTFM^XLFDT($H)
 ..S RUN="Unknown" I START S RUN=$$FMDIFF^XLFDT(NOW,START,3)
 ..S START=$$FMTE^XLFDT(START)
 ..S DATE=NOW\1
 ..S NOW=$$FMTE^XLFDT(NOW)
 .D NOW^%DTC S NOW=%,DATE=X
 .S RUN="" ; don't bother to compute
 .S Y=START D DD^%DT S START=Y
 .S Y=NOW D DD^%DT S NOW=Y
 ;
 ; Message for server
 S ^TMP("DMUFINIS",$J,1,0)="PACKAGE INSTALL"
 S ^TMP("DMUFINIS",$J,2,0)="SITE: "_SITE
 S ^TMP("DMUFINIS",$J,3,0)="PACKAGE: "_PACKAGE
 S ^TMP("DMUFINIS",$J,4,0)="VERSION: "_VER
 S ^TMP("DMUFINIS",$J,5,0)="Start time: "_START
 S ^TMP("DMUFINIS",$J,6,0)="Completion time: "_NOW
 S ^TMP("DMUFINIS",$J,7,0)="Run time: "_RUN
 S ^TMP("DMUFINIS",$J,8,0)="DATE: "_DATE
 ;
 ; Data is sent to server on FORUM - S.A5CSTS
 S XMY(SERVER)="",XMDUZ=.5,XMTEXT="^TMP(""DMUFINIS"",$J,",XMSUB=PACKAGE_" VERSION "_VER_" INSTALLATION"
 D ^XMD
 K ^TMP("DMUFINIS",$J)
 Q

DMUFINIT
DMUFINIT ; ; 10-JAN-2013 ; 1/27/13 3:48pm
 ;;22.2;VA FILEMAN;;Mar 28, 2013
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 K DIF,DIFQ,DIFQR,DIFQN,DIK,DDF,DDT,DTO,D0,DLAYGO,DIC,DIDUZ,DIR,DA,DIFROM,DFR,DTN,DIX,DZ,DIRUT,DTOUT,DUOUT
 S DIOVRD=1,U="^",DIFQ=0,DIFROM="0.1" W !,"This version (#0.1) of 'DMUFINIT' was created on 10-JAN-2013"
 W !?9,"(at V22P2.FILEMAN.MUMPS.ORG, by VA FILEMAN 22.2T1)",!
 I $D(^DD("VERSION")),^("VERSION")'<22.2 G GO
 ;W !,"FIRST, I'LL FRESHEN UP YOUR VA FILEMAN...." D N^DINIT
 ; I ^DD("VERSION")<22.2 W !,"but I need version 22.2 of the VA FileMan!" G Q ;VEN/SMH
GO ;
EN ; ENTER HERE TO BYPASS THE PRE-INIT PROGRAM
 S DIFQ=0 K DIRUT,DTOUT,DUOUT
 F DIFRIR=1:1:1 S DIFRRTN="^DMUFINI"_$E("5",DIFRIR) D @DIFRRTN
 W:1 !,"I AM GOING TO SET UP THE FOLLOWING FILES:" F I=1:2:4 S DIF(I)=^UTILITY("DIF",$J,I) D 1 G Q:DIFQ!$D(DIRUT) K DIF(I)
 S DIFROM="0.1" D PKG:'$D(DIFROM(0)),^DMUFINI1 G Q:'$D(DIFQ) S DIK(0)="AB"
 F DIF=1:2:4 S %=^UTILITY("DIF",$J,DIF),DIK=$P(%,";",5),N=$P(%,";",3),D=$P(%,";",4)_U_N D D K DIFQ(N)
 K DIFQR D ^DMUFINI2,^DMUFINI3
 L  S DUZ=DIDUZ W:1 !,$C(7),"OK, I'M DONE.",!,"NO"_$P("TE THAT FILE",U,DSEC)_" SECURITY-CODE PROTECTION HAS BEEN MADE"
 I DIFROM F DIF=1:2:4 S %=^UTILITY("DIF",$J,DIF),N=+$P(%,";",3) I N,$P(%,";",8)="y" S ^DD(N,0,"VR")=DIFROM
 I DIFROM(0)>0 F %="PRE","INI","INIT" S:$D(DIFROM(%)) $P(^DIC(9.4,DIFROM(0),%),U,2)=DIFROM(%)
 I $G(DIFQN) S $P(^(0),U,3,4)=$P(DIFQN,U,2)_U_($P(^DIC(0),U,4)+DIFQN) K DIFQN
 I DIFROM,$D(^%ZTSK) S X="DMUFINIS" X ^%ZOSF("TEST") D:$T PAC^DMUFINIS($T(IXF),.DIFROM)
 S:DIFROM(0)>0 ^DIC(9.4,DIFROM(0),"VERSION")=DIFROM G Q^DIFROM0
D S:$D(^DIC(+N,0))[0 ^(0)=D S X=$D(@(DIK_"0)")),^(0)=D_U_$S(X#2:$P(^(0),U,3,9),1:U)
 S DIFQR=DIFQR(+N) I ^DD("VERSION")>17.5,$D(^DD(+N,0,"DIK"))#2 S X=^("DIK"),Y=+N,DMAX=^DD("ROU") D EN^DIKZ
 I DIFQR D IXALL^DIK:$O(@(DIK_"0)")) W "."
 Q
R G REP^DMUFINI2
 ;
1 S N=+$P(DIF(I),";",3),DIF=$P(DIF(I),";",4),S=$P(DIF(I),";",5)
 W !!?3,N,?13,DIF,$P("  (Partial Definition)",U,$P(DIF(I),";",6)),$P("  (including data)",U,$P(DIF(I),";",13)="y") S Z=$S($D(^DIC(N,0))#2:^(0),1:"")
 I Z="" S DIFQ(N)=1,DIFQN=$G(DIFQN)+1_U_N G S
 I $L($P(Z,DIF)) W $C(7),!,"*BUT YOU ALREADY HAVE '",$P(Z,U),"' AS FILE #",N,"!" D R Q:DIFQ  G S:$D(DIFKEP(N)),1
 S DIFQ(N)=$P(DIF(I),";",7)'="n"
 I $L(Z) W $C(7),!,"Note:  You already have the '",$P(Z,U),"' File." S DIFQ(0)=1
 S %=$E(^UTILITY("DIF",$J,I+1),4,245) I %]"" X % S DIFQ(N)=$T W:'$T !,"Screen on this Data Dictionary did not pass--DD will not be installed!" G S
 I $L(Z),$P(DIF(I),";",10)="y" S DIR("A")="Shall I write over the existing Data Definition",DIR("??")="^D DD^DIFROMH1",DIR("B")="YES",DIR(0)="Y" D ^DIR S DIFQ(N)=Y
S S DIFQR(N)=0 Q:$P(DIF(I),";",13)'="y"!$D(DIRUT)
 I $P(DIF(I),";",15)="y",$O(@(S_"0)"))>0 S DIF=$P(DIF(I),";",14)="o",DIR("A")="Want my data "_$P("merged with^to overwrite",U,DIF+1)_" yours",DIR("??")="^D DTA^DIFROMH1",DIR(0)="Y" D ^DIR S DIFQR(N)=$S('Y:Y,1:Y+DIF) Q
 S %=$P(DIF(I),";",14)="o" W !,$C(7),"I will ",$P("MERGE^OVERWRITE",U,%+1)," your data with mine." S DIFQR(N)=%+1
 Q
Q W $C(7),!!,"NO UPDATING HAS OCCURRED!" G Q^DIFROM0
 ;
PKG S X=$P($T(IXF),";",3),DIC="^DIC(9.4,",DIC(0)="",DIC("S")="I $P(^(0),U,2)="""_$P(X,U,2)_"""",X=$P(X,U) D ^DIC S DIFROM(0)=+Y K DIC
 Q
 ;
IXF ;;FILEMAN EXTENSIONS FILES^DMUF;1



