DDS ;SFISC/MLH,MKO - MAIN ROUTINE ;18MAR2017
 ;;22.2;VA FileMan;**3,5**;Jan 05, 2016;Build 28
 ;;Per VA Directive 6402, this routine should not be modified.
 ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
 ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
 ;;Licensed under the terms of the Apache License, Version 2.0.
 ;GFT;**1003,1004,1028,1043,1045,1055,1057**
 ;
 N DIE,DX,DY,X,Y,DDSATOP
 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  --  do all the PAGES
 F  D PG Q:DDACT="Q"
 Q
 ;
PG ;Load page
 N DDSMX,DDSMY,DDSMOUSE,FND
 S DDACT="N"
 D EN^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) D
 .. N P S P=$P($G(^DIST(.403,+DDS,21)),U) Q:P=""  Q:$O(^(40,"B",P,""))'=DDSPG  ;CONVERT PAGE TO ITS INTERNAL NUMBER
 .. S DDSDASV=DDSDA,DDSDLSV=DDSDL
 .. M DDSORGSV=DDSDAORG
 .. K DA,@$$D0(DDSDL),DDSDAORG ;IF IT'S (REALLY) A RECORD SELECTION PAGE FORGET DA
 .. 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)="" ;Stack 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  ;Process what came from the RECORD SELECTION PAGE now that we've returned from it
 .. 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 ;Unstack DDSSC
 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 ;FROM DDSU
 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
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDDS   6404     printed  Sep 23, 2025@20:19:02                                                                                                                                                                                                         Page 2
DDS       ;SFISC/MLH,MKO - MAIN ROUTINE ;18MAR2017
 +1       ;;22.2;VA FileMan;**3,5**;Jan 05, 2016;Build 28
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
 +4       ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
 +5       ;;Licensed under the terms of the Apache License, Version 2.0.
 +6       ;GFT;**1003,1004,1028,1043,1045,1055,1057**
 +7       ;
 +8        NEW DIE,DX,DY,X,Y,DDSATOP
 +9        IF '$DATA(DIFM)
               NEW DIFM
               SET DIFM=1
               DO INIZE^DIEFU
 +10      ;
 +11       DO EN^DDS0(.DDSFILE,DR,.DA)
 +12       IF $GET(DIERR)
               if $GET(DDSPARM)'["E"
                   Begin DoDot:1
 +13                   WRITE !,$CHAR(7)_$$EZBLD^DIALOG(3000)
 +14                   DO MSG^DIALOG("BW")
 +15                   SET DIMSG=""
                   End DoDot:1
               GOTO END^DDS0
 +16      ;
 +17       NEW DR
 +18       if $GET(^DIST(.403,+DDS,11))'?."^"
               XECUTE ^(11)
 +19       FOR 
               DO PG
               if DDACT="Q"
                   QUIT 
 +20       if $GET(^DIST(.403,+DDS,12))'?."^"
               XECUTE ^(12)
 +21      ;
 +22       if $GET(@DDSREFT@("HLP"))>0
               DO HLP^DDSMSG()
 +23       GOTO END^DDS0
 +24      ;
PROC      ;Main loop  --  do all the PAGES
 +1        FOR 
               DO PG
               if DDACT="Q"
                   QUIT 
 +2        QUIT 
 +3       ;
PG        ;Load page
 +1        NEW DDSMX,DDSMY,DDSMOUSE,FND
 +2        SET DDACT="N"
 +3        DO EN^DDS1(DDSPG)
 +4        IF $GET(DIERR)
               Begin DoDot:1
 +5                NEW P
                   SET P(1)=$PIECE($GET(^DIST(.403,+DDS,40,DDSPG,0)),U)
                   SET P(2)=$PIECE($GET(^(1)),U)
 +6                if P(2)=""
                       SET P(2)="unnamed"
 +7                DO BLD^DIALOG(3041,.P)
                   DO ERR^DDSMSG
                   HANG 2
 +8                SET DDACT="Q"
               End DoDot:1
               QUIT 
 +9       ;
 +10      ;Pre-action, save old and get next page
 +11       SET DDSOPB=DDSPG
 +12       IF $GET(^DIST(.403,+DDS,40,DDSPG,11))'?."^"
               DO PA(^(11))
               if DDACT="NP"
                   QUIT 
 +13       SET DDSNP=$$NP^DDS5(.Y)
           if 'Y
               SET DDSNP=""
 +14      ;
 +15      ;Get DDO and DDSBK
 +16       IF $SELECT($DATA(DDSBR)[0:1,1:$DATA(@DDSREFS@(DDSPG,$SELECT(DDO:+DDSBK,1:0),DDO,"N"))[0)
               Begin DoDot:1
 +17               SET DDO=+$GET(@DDSREFS@(DDSPG,"FIRST"))
                   SET DDSBK=$PIECE($GET(^("FIRST")),",",2)
               End DoDot:1
 +18       IF 'DDSBK
               Begin DoDot:1
 +19               DO BLD^DIALOG(3055,"number "_$PIECE($GET(^DIST(.403,+DDS,40,DDSPG,0)),U)_$SELECT($GET(^(1))]"":" ("_$PIECE($GET(^(1)),U)_")",1:""))
 +20               DO ERR^DDSMSG
                   HANG 2
 +21               SET DDACT="Q"
               End DoDot:1
               QUIT 
 +22      ;
 +23      ;Get DDSPOP and update DDSSC array
 +24      ;If we're going to another page
 +25       IF '$DATA(DDSPGUP)
               Begin DoDot:1
 +26               SET DDSLN=^DIST(.403,+DDS,40,DDSPG,0)
                   SET DDSPOP=$PIECE(DDSLN,U,6)
 +27               if 'DDSPOP
                       KILL DDSSC
SEL                IF $DATA(DDSSEL)
                       Begin DoDot:2
 +1       ;CONVERT PAGE TO ITS INTERNAL NUMBER
                           NEW P
                           SET P=$PIECE($GET(^DIST(.403,+DDS,21)),U)
                           if P=""
                               QUIT 
                           if $ORDER(^(40,"B",P,""))'=DDSPG
                               QUIT 
 +2                        SET DDSDASV=DDSDA
                           SET DDSDLSV=DDSDL
 +3                        MERGE DDSORGSV=DDSDAORG
 +4       ;IF IT'S (REALLY) A RECORD SELECTION PAGE FORGET DA
                           KILL DA,@$$D0(DDSDL),DDSDAORG
 +5                        SET (DA,D0,DDSDAORG)=""
                           SET DDSDA="0,"
                           SET DDSDL=0
                       End DoDot:2
 +6                IF '$DATA(DDSSC("B",DDSPG))
                       Begin DoDot:2
 +7       ;Stack DDSSC
                           SET DDSSC=$GET(DDSSC)+1
                           SET DDSSC(DDSSC)=DDSPG
                           SET DDSSC("B",DDSPG,DDSSC)=""
 +8                        if DDSPOP
                               SET $PIECE(DDSSC(DDSSC),U,2,3)=$PIECE(DDSLN,U,3)_U_$PIECE(DDSLN,U,7)
 +9                        IF $GET(DDSSTK)
                               SET $PIECE(DDSSC(DDSSC),U,4)=1
                               KILL DDSSTK
 +10                       KILL DDSPOP
                       End DoDot:2
 +11              IF '$TEST
                       Begin DoDot:2
 +12                       if $PIECE($GET(DDSSC(+$GET(DDSSC))),U)=DDSPG
                               QUIT 
 +13                       NEW I,J,S
 +14                       SET I=$ORDER(DDSSC("B",DDSPG,""))
                           SET S=DDSSC(I)
                           KILL DDSSC("B",DDSPG,I)
 +15                       FOR J=I:1:DDSSC-1
                               Begin DoDot:3
 +16                               KILL DDSSC("B",$PIECE(DDSSC(J+1),U),J)
 +17                               SET DDSSC(J)=DDSSC(J+1)
                                   SET DDSSC("B",$PIECE(DDSSC(J),U),J)=""
                               End DoDot:3
 +18                       SET DDSSC(DDSSC)=S
                           SET DDSSC("B",DDSPG,DDSSC)=""
                       End DoDot:2
               End DoDot:1
 +19      ;
 +20      ;If we've moving up from a pop-up page
 +21      IF '$TEST
               KILL DDSPGUP
 +22      ;
 +23      ;Paint the page
 +24       DO RP^DDSR(DDSSC(DDSSC),DDSSC=1)
 +25      ;
P1         FOR 
               DO BLK
               if "^Q^NP^"[(U_DDACT_U)
                   QUIT 
 +1       ;
 +2       ;PAGE Post action, print any help
 +3        if $GET(^DIST(.403,+DDS,40,+DDSOPB,12))'?."^"
               DO PA(^(12))
 +4        if $GET(@DDSREFT@("HLP"))>0
               DO HLP^DDSMSG()
 +5        if "^NB^N^"[(U_DDACT_U)
               GOTO P1
 +6       ;
 +7        IF DDACT="Q"
               Begin DoDot:1
 +8                IF '$PIECE(DDSSC(DDSSC),U,4)
                       Begin DoDot:2
 +9       ;Process what came from the RECORD SELECTION PAGE now that we've returned from it
                           IF $GET(DDSSEL)
                               DO GDA^DDSRSEL
                               if 'DA
                                   QUIT 
 +10                       if $GET(DDSSC)>1
                               DO CLEAR^DDSBOX($PIECE(DDSSC(DDSSC),U,2),$PIECE(DDSSC(DDSSC),U,3))
 +11                       if DDSSC>1
                               SET DDSPG=$PIECE(DDSSC(DDSSC-1),U)
                               SET DDACT="N"
                               SET DDSPGUP=1
                       End DoDot:2
 +12      ;Unstack DDSSC
                   KILL DDSSC("B",$PIECE(DDSSC(DDSSC),U),DDSSC),DDSSC(DDSSC)
                   SET DDSSC=DDSSC-1
               End DoDot:1
 +13       QUIT 
 +14      ;
BLK        SET DDACT="N"
           SET DDSOSV=0
 +1       ;
 +2        IF $DATA(@DDSREFS@(DDSPG,DDSBK))[0
               SET DDACT="Q"
               QUIT 
 +3        SET DDSLN=@DDSREFS@(DDSPG,DDSBK)
 +4       ;
 +5        SET DDSDN=$PIECE(DDSLN,U,4)
           SET DDSTP=$PIECE(DDSLN,U,5)
 +6        SET DDSREP=$PIECE(DDSLN,U,7)
           SET DDSPTB=$PIECE(DDSLN,U,8)
 +7        if 'DDSDN
               KILL DDSDN
           if DDSTP="e"
               KILL DDSTP
           if 'DDSPTB
               KILL DDSPTB
           if DDSREP'>1
               KILL DDSREP
 +8       ;
 +9       ;NEW WHEN WE GO INTO MULTIPLE!!
           IF $DATA(DDSPTB)!$DATA(DDSREP)
               NEW DDP,DDSDA,DIE
               Begin DoDot:1
 +10               SET DDP=$PIECE(DDSLN,U,3)
DIE       ;Get Entry Number
                   SET DDSDA=$PIECE(@DDSREFT@(DDSPG,DDSBK),U)
                   IF DDSDA'>0
                       IF $GET(^(DDSBK,"COMP MUL"))=""
                           SET DIE=$GET(DIE)
                           QUIT 
 +1                SET DIE=@DDSREFT@(DDSPG,DDSBK,DDSDA,"GL")
               End DoDot:1
 +2       ;
 +3        IF $DATA(DDSPTB)
               NEW DA,@$$D0(DDSDL),DDSDL
               Begin DoDot:1
 +4                SET DDSPTB=@DDSREFS@(DDSPG,DDSBK,"PTB")
 +5                SET DDSDL=$LENGTH(DDSDA,",")-2
 +6                SET (D0,DA)=+DDSDA
               End DoDot:1
 +7       ;
 +8        IF $DATA(DDSREP)
               NEW DDSDL,DA
               Begin DoDot:1
 +9                SET DDSREP=$PIECE(@DDSREFT@(DDSPG,DDSBK,DDSDA),U,2,999)
 +10      ;2-arg $G -- go to empty line if none other specified
                   SET DDSDA=$GET(@DDSREFT@(DDSPG,DDSBK,$PIECE(DDSREP,U),$PIECE(DDSREP,U,4)),"0,"_DDSDA)
 +11               if '$PIECE(DDSREP,U,7)
                       SET DDSDA=$PIECE(DDSDA,",")_","
 +12               SET DDSDL=$LENGTH(DDSDA,",")-2
               End DoDot:1
 +13      IF $TEST
               NEW @$$D0(DDSDL)
               Begin DoDot:1
 +14               DO BLDDA(DDSDA)
 +15      ;If this is a new subEntry, start at 1st editable field
                   if 'DA
                       SET DDO=+$PIECE(DDSREP,U,8)
               End DoDot:1
 +16      ;
PTB        IF $DATA(DDSPTB)
               IF '$DATA(DDSREP)
                   IF 'DDSDA
                       IF DDSDAORG
                           Begin DoDot:1
 +1                            NEW DDSBK0
 +2                            SET DDSBK0=DDSBK
 +3                            FOR 
                                   SET DDSBK=$$NB^DDS5(.Y)
                                   if DDSBK=DDSBK0!'Y!$GET(@DDSREFT@(DDSPG,DDSBK))
                                       QUIT 
 +4                            if Y
                                   QUIT 
 +5                            IF DDSNP]""
                                   SET DDSPG=DDSNP
                                   SET DDACT="NP"
                                   QUIT 
 +6                            SET DDSPG=$$PP^DDS5(.Y)
                               IF Y
                                   SET DDACT="NP"
                                   QUIT 
 +7                            SET DDACT="Q"
                           End DoDot:1
                           QUIT 
 +8       ;
 +9        SET $PIECE(DDSOPB,U,2)=DDSBK
 +10       IF $GET(^DIST(.403,+DDS,40,DDSPG,40,DDSBK,11))'?."^"
               DO PA(^(11))
               if DDACT="NP"
                   QUIT 
 +11       IF $GET(^DIST(.404,DDSBK,11))'?."^"
               DO PA(^(11))
               if DDACT="NP"
                   QUIT 
1          IF $SELECT($DATA(DDSBR)[0:1,1:$DATA(@DDSREFS@(DDSPG,$SELECT(DDO:+DDSBK,1:0),DDO,"N"))[0)
               Begin DoDot:1
 +1       ;First field
                   SET DDO=$PIECE(@DDSREFS@(DDSPG,DDSBK),U,9)
               End DoDot:1
 +2        KILL DDSLN
 +3       ;
B1         DO ^DDS01
 +1       ;
 +2        IF $GET(^DIST(.403,+DDS,40,DDSPG,40,$PIECE(DDSOPB,U,2),12))'?."^"
               DO PA(^(12))
               if DDACT="N"
                   GOTO B1
 +3        IF $GET(^DIST(.404,$PIECE(DDSOPB,U,2),12))'?."^"
               DO PA(^(12))
               if DDACT="N"
                   GOTO B1
 +4        QUIT 
 +5       ;
BLDDA(DDSDA) ;
 +1        NEW I
 +2        SET (DA,@("D"_DDSDL))=$PIECE(DDSDA,",")
 +3        FOR I=1:1:DDSDL
               SET (DA(I),@("D"_(DDSDL-I)))=$PIECE(DDSDA,",",I+1)
 +4        QUIT 
 +5       ;
D0(DL)    ;Given DL, return string D0,D1,...,Dn
 +1        NEW I,S
 +2        SET S=""
           FOR I=0:1:DL
               SET S=S_"D"_I_","
 +3        if S?.E1","
               SET S=$EXTRACT(S,1,$LENGTH(S)-1)
 +4        QUIT S
 +5       ;
CLRMSG    ;FROM DDSU
 +1       ;GFT  ** IF WE WERE KEEPING SOMETHING IN HELP AREA, HOLD UP 2 SECONDS  ISB-0603-31054
           IF $GET(DDSKM)
               HANG 2
               KILL DDSKM
 +2       ;CLEAR WHOLE COMMAND AREA
           KILL DDQ
           SET DDSH=1
           SET (DDM,DX)=0
           SET DY=DDSHBX+1
           XECUTE DDXY
           WRITE $PIECE(DDGLCLR,DDGLDEL,3)
 +3        NEW I
           FOR 
               SET I=$ORDER(DDSMOUSE(DDSHBX))
               if I+1=IOSL!'I
                   QUIT 
               KILL DDSMOUSE(I)
 +4        QUIT 
 +5       ;
PA(DDSPA) ;
 +1        NEW DDSBRORG
           if $DATA(DDSBR)#2
               SET DDSBRORG=DDSBR
 +2       ;PRE-ACTION OR POST-ACTION
           KILL DDSBR
           XECUTE DDSPA
 +3        IF $DATA(DDSBR)[0
               if $DATA(DDSBRORG)#2
                   SET DDSBR=DDSBRORG
               QUIT 
 +4        DO BR^DDS2
 +5        QUIT 
 +6       ;
 +7       ;
 +8       ;
 +9       ;
 +10      ;
 +11      ;
RESET     ;Programmer entry point to reset terminal and cleanup
 +1        DO INIT^DDGLIB0()
           if $GET(DIERR)
               DO MSG^DIALOG("BW")
 +2        WRITE $PIECE($GET(DDGLVID),DDGLDEL,10)
 +3        KILL DDSPARM
 +4        SET DDSREFT="^TMP(""DDS"",$J)"
 +5        DO END^DDS0
 +6        GOTO RESET^DDGF
 +7       ;
RUN       ;Run a form
 +1        GOTO ^DDSRUN
CLONE     ;Clone a form
 +1        GOTO ^DDSCLONE
PRINT     ;Print a form
 +1        GOTO ^DDSPRNT
DFRM      ;Delete a form
 +1        GOTO ^DDSDFRM
DBLK      ;Delete unused blocks
 +1        GOTO ^DDSDBLK