| 1 | ACKQSEL ;HIRMFO/BH-QUASAR Utility Routine ;  04/01/99 
 | 
|---|
| 2 |  ;;3.0;QUASAR;;Feb 11, 2000
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine SHOULD NOT be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | SELECT(ACKTYP,ACKIN,ACKOUT,ACKFLD,ACKHLP,ACKDEF) ; generic prompt to select from a list
 | 
|---|
| 7 |  ;  input: ACKTYP  1=one only, 2=many, 3=many or 'ALL'.
 | 
|---|
| 8 |  ;         ACKIN   array/global containing valid items
 | 
|---|
| 9 |  ;                  where @ACKIN@(name) exists
 | 
|---|
| 10 |  ;         ACKOUT  array/global specifying where to put selected items
 | 
|---|
| 11 |  ;                  where @ACKOUT@(name)="" and @ACKOUT=null or '^'
 | 
|---|
| 12 |  ;         ACKFLD   field name^max len
 | 
|---|
| 13 |  ;                   (used in prompt and list of items)
 | 
|---|
| 14 |  ;         ACKHLP   mumps execute for help (displayed for both ? and ??)
 | 
|---|
| 15 |  ;         ACKDEF   Default type^value 
 | 
|---|
| 16 |  ;                   if type is 1,default displayed with prompt and //
 | 
|---|
| 17 |  ;                   if type is 2, default appears on spacebar return   
 | 
|---|
| 18 |  ;         ^TMP("ACKQSEL",$J,1) used during this program
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  ;  initialise variables
 | 
|---|
| 21 |  N DIR,ACKEXIT,ACKSEL,DIWL,DIWR,DIWF,ACKNUM,ACKNXT,ACKMTCH,ACKADD,X,ACKEOF
 | 
|---|
| 22 |  N ACKDONE,ACKLIST
 | 
|---|
| 23 |  S:$G(ACKDEF)="" ACKDEF=0
 | 
|---|
| 24 |  K @ACKOUT
 | 
|---|
| 25 |  K ^TMP("ACKQSEL",$J,1)
 | 
|---|
| 26 |  S DIWL=1,DIWR=80,DIWF=""
 | 
|---|
| 27 |  ; prompt for the field
 | 
|---|
| 28 |  S ACKNUM=0,ACKEXIT=0    ; number selected so far, exit flag
 | 
|---|
| 29 |  ; loop until user has finished selecting 
 | 
|---|
| 30 |  ;   (will exit after 1 if ACKTYP=1)
 | 
|---|
| 31 |  F  D SELECT2 Q:ACKEXIT
 | 
|---|
| 32 |  ; kill temp list
 | 
|---|
| 33 |  K ^TMP("ACKQSEL",$J,1)
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 | SELECTX ; exit point
 | 
|---|
| 36 |  Q
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 | SELECT2 ; prompt the user
 | 
|---|
| 39 |  K DIR S DIR("A")="Select "_$P(ACKFLD,U,1),DIR(0)="FO^1:"_$P(ACKFLD,U,2)
 | 
|---|
| 40 |  ; change field to optional if one or more already selected
 | 
|---|
| 41 |  I $O(@ACKOUT@(""))'="" S DIR(0)="FO^1:"_$P(ACKFLD,U,2)
 | 
|---|
| 42 |  S DIR("?")="^"_ACKHLP
 | 
|---|
| 43 |  I ACKTYP>1 S DIR("?")=DIR("?")_" S ACKLIST=2 D SELHELP^ACKQSEL"
 | 
|---|
| 44 |  S DIR("??")="^"_ACKHLP_" S ACKLIST=1 D SELHELP^ACKQSEL"
 | 
|---|
| 45 |  I +ACKDEF=1 S DIR("B")=$$UP($P(ACKDEF,U,2))
 | 
|---|
| 46 |  D ^DIR
 | 
|---|
| 47 |  S X=$$UP(X) ; convert input to upper case
 | 
|---|
| 48 |  I X=" ",+ACKDEF=2 S X=$$UP($P(ACKDEF,U,2)) W "   ",X
 | 
|---|
| 49 |  I X?1"^"1.E W !,"Jumping not allowed." K DUOUT Q
 | 
|---|
| 50 |  I $D(DTOUT) S @ACKOUT="T",ACKEXIT=1 Q          ; timed out
 | 
|---|
| 51 |  I $D(DUOUT)!(X="^") S @ACKOUT="^",ACKEXIT=1 Q  ; user quit
 | 
|---|
| 52 |  I X="" S @ACKOUT="",ACKEXIT=1 Q  ; null entered (ie. done)
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ; validate the input
 | 
|---|
| 55 |  S ACKSEL=X,ACKMTCH=0,ACKNUM=0,ACKADD=1
 | 
|---|
| 56 |  I $E(ACKSEL)="-",$L(ACKSEL)>1 S ACKADD=2,ACKSEL=$E(ACKSEL,2,$L(ACKSEL))
 | 
|---|
| 57 |  S ACKNXT=ACKSEL
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ; if ALL selected then transfer all entries to selected list
 | 
|---|
| 60 |  I ACKTYP=3,ACKSEL="ALL" D  Q
 | 
|---|
| 61 |  . I ACKADD=1 D  S ACKEXIT=1 Q             ;all selected
 | 
|---|
| 62 |  . . S ACKNXT="" F  S ACKNXT=$O(@ACKIN@(ACKNXT)) Q:ACKNXT=""  D
 | 
|---|
| 63 |  . . . S @ACKOUT@(ACKNXT)=""
 | 
|---|
| 64 |  . I ACKADD=2 K @ACKOUT        ;all de-selected
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  ; if no matches then quit
 | 
|---|
| 67 |  I ACKADD=1,'$D(@ACKIN@(ACKSEL)) S ACKNXT=$O(@ACKIN@(ACKSEL)) I ACKNXT="" W "     ??" Q
 | 
|---|
| 68 |  I ACKADD=2,'$D(@ACKOUT@(ACKSEL)) S ACKNXT=$O(@ACKOUT@(ACKSEL)) I ACKNXT="" W "     ??" Q
 | 
|---|
| 69 |  I $E(ACKNXT,1,$L(ACKSEL))'=ACKSEL W "     ??" Q
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  ; if only one match then quit
 | 
|---|
| 72 |  I ACKADD=1,$E($O(@ACKIN@(ACKNXT)),1,$L(ACKSEL))'=ACKSEL D  Q
 | 
|---|
| 73 |  . S @ACKOUT@(ACKNXT)=""
 | 
|---|
| 74 |  . I ACKTYP=1 S ACKEXIT=1
 | 
|---|
| 75 |  . ;S X=ACKSEL D ^DIWP,^DIWW
 | 
|---|
| 76 |  . W $E(ACKNXT,$L(ACKSEL)+1,$L(ACKNXT)) W:ACKTYP'=1 "    selected"
 | 
|---|
| 77 |  . S ACKSEL=ACKNXT
 | 
|---|
| 78 |  I ACKADD=2,$E($O(@ACKOUT@(ACKNXT)),1,$L(ACKSEL))'=ACKSEL D  Q
 | 
|---|
| 79 |  . K @ACKOUT@(ACKNXT)
 | 
|---|
| 80 |  . ;S X=ACKSEL D ^DIWP,^DIWW
 | 
|---|
| 81 |  . W $E(ACKNXT,$L(ACKSEL)+1,$L(ACKNXT)) W:ACKTYP'=1 "    de-selected"
 | 
|---|
| 82 |  . S ACKSEL=ACKNXT
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  ; to get here, there must be 2 or more matches
 | 
|---|
| 85 |  I ACKADD=2 Q  ;multiple de-selection not allowed
 | 
|---|
| 86 |  K ^TMP("ACKQSEL",$J,1)
 | 
|---|
| 87 |  S X="|SETTAB(5,10)|" D ^DIWP S X=" " D ^DIWP
 | 
|---|
| 88 |  I $D(@ACKIN@(ACKSEL)) D
 | 
|---|
| 89 |  . S ACKMTCH=1,X="|TAB|1|TAB|"_ACKSEL D ^DIWP
 | 
|---|
| 90 |  . S ^TMP("ACKQSEL",$J,1,ACKMTCH)=ACKSEL
 | 
|---|
| 91 |  S ACKEOF=0  ; indicates end of file reached
 | 
|---|
| 92 |  S ACKNUM="" ; number selected by user
 | 
|---|
| 93 |  ; loop to display all matching items
 | 
|---|
| 94 |  S ACKNXT=ACKSEL F  D SELECT3 Q:ACKEOF  Q:ACKNUM]""
 | 
|---|
| 95 |  ; if item selected then add to file
 | 
|---|
| 96 |  I ACKNUM?1.N D
 | 
|---|
| 97 |  . S ACKSEL=^TMP("ACKQSEL",$J,1,ACKNUM)
 | 
|---|
| 98 |  . S @ACKOUT@(ACKSEL)=""
 | 
|---|
| 99 |  . ; if only one selection required then exit
 | 
|---|
| 100 |  . I ACKTYP=1 S ACKEXIT=1 Q
 | 
|---|
| 101 |  Q
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 | SELECT3 ; choose from multiple matching entries
 | 
|---|
| 104 |  S ACKDONE=0 ; indicates next five have been displayed
 | 
|---|
| 105 |  F  S ACKNXT=$O(@ACKIN@(ACKNXT)) D  Q:ACKDONE
 | 
|---|
| 106 |  . I (ACKNXT="")!($E(ACKNXT,1,$L(ACKSEL))'=ACKSEL) S ACKDONE=1,ACKEOF=1 Q
 | 
|---|
| 107 |  . S ACKMTCH=ACKMTCH+1,X="|TAB|"_ACKMTCH_"|TAB|"_ACKNXT D ^DIWP
 | 
|---|
| 108 |  . S ^TMP("ACKQSEL",$J,1,ACKMTCH)=ACKNXT
 | 
|---|
| 109 |  . I ACKMTCH#5=0 S ACKDONE=1
 | 
|---|
| 110 |  ; if the next entry on the list is null or does not match 
 | 
|---|
| 111 |  ;  the user entry then we are at end of file
 | 
|---|
| 112 |  I ACKNXT'="" D
 | 
|---|
| 113 |  . I $O(@ACKIN@(ACKNXT))="" S ACKEOF=1
 | 
|---|
| 114 |  . I $E($O(@ACKIN@(ACKNXT)),1,$L(ACKSEL))'=ACKSEL S ACKEOF=1
 | 
|---|
| 115 |  D ^DIWW
 | 
|---|
| 116 |  K DIR
 | 
|---|
| 117 |  S DIR("A")="Select",DIR(0)="NO^1:"_ACKMTCH_":0"
 | 
|---|
| 118 |  D ^DIR
 | 
|---|
| 119 |  S ACKNUM=X
 | 
|---|
| 120 |  I ACKNUM'="^",ACKNUM'?1.N S ACKNUM=""
 | 
|---|
| 121 |  I 'ACKEOF,ACKNUM'="^" S X=" " D ^DIWP
 | 
|---|
| 122 |  Q
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 | SELHELP ; display help for the select prompt
 | 
|---|
| 125 |  ;  called by Fileman as the Help routine for the item
 | 
|---|
| 126 |  ;   being prompted in the SELECT function above.
 | 
|---|
| 127 |  ;  not intended for use by other functions/routines.
 | 
|---|
| 128 |  ; requires the following 
 | 
|---|
| 129 |  ;  @ACKIN@(itm)   list of available items
 | 
|---|
| 130 |  ;  @ACKOUT@(itm)   currently selected items
 | 
|---|
| 131 |  ;  ACKLIST   which list to display 1=IN 2=OUT
 | 
|---|
| 132 |  ;  ACKFLD    the name of the field
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  N ACKITM,DIWL,DIWR,DIWF,X,ACKEXIT,ACK,DIR,ACKFILE
 | 
|---|
| 135 |  S ACKITM="",DIWL=1,DIWR=80,DIWF=""
 | 
|---|
| 136 |  S X="|SETTAB(10)|" D ^DIWP S X=" " D ^DIWP
 | 
|---|
| 137 |  I ACKLIST=2 D
 | 
|---|
| 138 |  . S X="    "_$S($O(@ACKOUT@(""))="":"No ",1:"The following ")
 | 
|---|
| 139 |  . S X=X_$P(ACKFLD,U,1)_"s have been selected so far..."
 | 
|---|
| 140 |  . D ^DIWP
 | 
|---|
| 141 |  I ACKLIST=1 D
 | 
|---|
| 142 |  . S X="    Choose from:"
 | 
|---|
| 143 |  . D ^DIWP
 | 
|---|
| 144 |  ; begin listing the items
 | 
|---|
| 145 |  S ACKITM="",ACKEXIT=0
 | 
|---|
| 146 |  F  D SELHELP2 Q:ACKEXIT
 | 
|---|
| 147 |  ; end
 | 
|---|
| 148 |  Q
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 | SELHELP2 ; list the next 10
 | 
|---|
| 151 |  S ACKFILE=$S(ACKLIST=1:ACKIN,1:ACKOUT)
 | 
|---|
| 152 |  S X=" " D ^DIWP
 | 
|---|
| 153 |  F ACK=1:1:10 S ACKITM=$O(@ACKFILE@(ACKITM)) Q:ACKITM=""  D
 | 
|---|
| 154 |  . S X="|TAB|"_ACKITM D ^DIWP
 | 
|---|
| 155 |  D ^DIWW
 | 
|---|
| 156 |  ; if end of list encountered then exit
 | 
|---|
| 157 |  I (ACKITM="")!($O(@ACKFILE@(ACKITM))="") S ACKEXIT=1 Q
 | 
|---|
| 158 |  ; prompt to continue
 | 
|---|
| 159 |  K DIR S DIR(0)="E"
 | 
|---|
| 160 |  D ^DIR
 | 
|---|
| 161 |  I X="^" S ACKEXIT=1
 | 
|---|
| 162 |  Q
 | 
|---|
| 163 | UP(X) ; convert X to uppercase
 | 
|---|
| 164 |  Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 | 
|---|