Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ACKQSEL

ACKQSEL.m

Go to the documentation of this file.
ACKQSEL ;HIRMFO/BH-QUASAR Utility Routine ;  04/01/99 
 ;;3.0;QUASAR;;Feb 11, 2000
 ;Per VHA Directive 10-93-142, this routine SHOULD NOT be modified.
 ;
 ;
SELECT(ACKTYP,ACKIN,ACKOUT,ACKFLD,ACKHLP,ACKDEF) ; generic prompt to select from a list
 ;  input: ACKTYP  1=one only, 2=many, 3=many or 'ALL'.
 ;         ACKIN   array/global containing valid items
 ;                  where @ACKIN@(name) exists
 ;         ACKOUT  array/global specifying where to put selected items
 ;                  where @ACKOUT@(name)="" and @ACKOUT=null or '^'
 ;         ACKFLD   field name^max len
 ;                   (used in prompt and list of items)
 ;         ACKHLP   mumps execute for help (displayed for both ? and ??)
 ;         ACKDEF   Default type^value 
 ;                   if type is 1,default displayed with prompt and //
 ;                   if type is 2, default appears on spacebar return   
 ;         ^TMP("ACKQSEL",$J,1) used during this program
 ;
 ;  initialise variables
 N DIR,ACKEXIT,ACKSEL,DIWL,DIWR,DIWF,ACKNUM,ACKNXT,ACKMTCH,ACKADD,X,ACKEOF
 N ACKDONE,ACKLIST
 S:$G(ACKDEF)="" ACKDEF=0
 K @ACKOUT
 K ^TMP("ACKQSEL",$J,1)
 S DIWL=1,DIWR=80,DIWF=""
 ; prompt for the field
 S ACKNUM=0,ACKEXIT=0    ; number selected so far, exit flag
 ; loop until user has finished selecting 
 ;   (will exit after 1 if ACKTYP=1)
 F  D SELECT2 Q:ACKEXIT
 ; kill temp list
 K ^TMP("ACKQSEL",$J,1)
 ;
SELECTX ; exit point
 Q
 ;
SELECT2 ; prompt the user
 K DIR S DIR("A")="Select "_$P(ACKFLD,U,1),DIR(0)="FO^1:"_$P(ACKFLD,U,2)
 ; change field to optional if one or more already selected
 I $O(@ACKOUT@(""))'="" S DIR(0)="FO^1:"_$P(ACKFLD,U,2)
 S DIR("?")="^"_ACKHLP
 I ACKTYP>1 S DIR("?")=DIR("?")_" S ACKLIST=2 D SELHELP^ACKQSEL"
 S DIR("??")="^"_ACKHLP_" S ACKLIST=1 D SELHELP^ACKQSEL"
 I +ACKDEF=1 S DIR("B")=$$UP($P(ACKDEF,U,2))
 D ^DIR
 S X=$$UP(X) ; convert input to upper case
 I X=" ",+ACKDEF=2 S X=$$UP($P(ACKDEF,U,2)) W "   ",X
 I X?1"^"1.E W !,"Jumping not allowed." K DUOUT Q
 I $D(DTOUT) S @ACKOUT="T",ACKEXIT=1 Q          ; timed out
 I $D(DUOUT)!(X="^") S @ACKOUT="^",ACKEXIT=1 Q  ; user quit
 I X="" S @ACKOUT="",ACKEXIT=1 Q  ; null entered (ie. done)
 ;
 ; validate the input
 S ACKSEL=X,ACKMTCH=0,ACKNUM=0,ACKADD=1
 I $E(ACKSEL)="-",$L(ACKSEL)>1 S ACKADD=2,ACKSEL=$E(ACKSEL,2,$L(ACKSEL))
 S ACKNXT=ACKSEL
 ;
 ; if ALL selected then transfer all entries to selected list
 I ACKTYP=3,ACKSEL="ALL" D  Q
 . I ACKADD=1 D  S ACKEXIT=1 Q             ;all selected
 . . S ACKNXT="" F  S ACKNXT=$O(@ACKIN@(ACKNXT)) Q:ACKNXT=""  D
 . . . S @ACKOUT@(ACKNXT)=""
 . I ACKADD=2 K @ACKOUT        ;all de-selected
 ;
 ; if no matches then quit
 I ACKADD=1,'$D(@ACKIN@(ACKSEL)) S ACKNXT=$O(@ACKIN@(ACKSEL)) I ACKNXT="" W "     ??" Q
 I ACKADD=2,'$D(@ACKOUT@(ACKSEL)) S ACKNXT=$O(@ACKOUT@(ACKSEL)) I ACKNXT="" W "     ??" Q
 I $E(ACKNXT,1,$L(ACKSEL))'=ACKSEL W "     ??" Q
 ;
 ; if only one match then quit
 I ACKADD=1,$E($O(@ACKIN@(ACKNXT)),1,$L(ACKSEL))'=ACKSEL D  Q
 . S @ACKOUT@(ACKNXT)=""
 . I ACKTYP=1 S ACKEXIT=1
 . ;S X=ACKSEL D ^DIWP,^DIWW
 . W $E(ACKNXT,$L(ACKSEL)+1,$L(ACKNXT)) W:ACKTYP'=1 "    selected"
 . S ACKSEL=ACKNXT
 I ACKADD=2,$E($O(@ACKOUT@(ACKNXT)),1,$L(ACKSEL))'=ACKSEL D  Q
 . K @ACKOUT@(ACKNXT)
 . ;S X=ACKSEL D ^DIWP,^DIWW
 . W $E(ACKNXT,$L(ACKSEL)+1,$L(ACKNXT)) W:ACKTYP'=1 "    de-selected"
 . S ACKSEL=ACKNXT
 ;
 ; to get here, there must be 2 or more matches
 I ACKADD=2 Q  ;multiple de-selection not allowed
 K ^TMP("ACKQSEL",$J,1)
 S X="|SETTAB(5,10)|" D ^DIWP S X=" " D ^DIWP
 I $D(@ACKIN@(ACKSEL)) D
 . S ACKMTCH=1,X="|TAB|1|TAB|"_ACKSEL D ^DIWP
 . S ^TMP("ACKQSEL",$J,1,ACKMTCH)=ACKSEL
 S ACKEOF=0  ; indicates end of file reached
 S ACKNUM="" ; number selected by user
 ; loop to display all matching items
 S ACKNXT=ACKSEL F  D SELECT3 Q:ACKEOF  Q:ACKNUM]""
 ; if item selected then add to file
 I ACKNUM?1.N D
 . S ACKSEL=^TMP("ACKQSEL",$J,1,ACKNUM)
 . S @ACKOUT@(ACKSEL)=""
 . ; if only one selection required then exit
 . I ACKTYP=1 S ACKEXIT=1 Q
 Q
 ;
SELECT3 ; choose from multiple matching entries
 S ACKDONE=0 ; indicates next five have been displayed
 F  S ACKNXT=$O(@ACKIN@(ACKNXT)) D  Q:ACKDONE
 . I (ACKNXT="")!($E(ACKNXT,1,$L(ACKSEL))'=ACKSEL) S ACKDONE=1,ACKEOF=1 Q
 . S ACKMTCH=ACKMTCH+1,X="|TAB|"_ACKMTCH_"|TAB|"_ACKNXT D ^DIWP
 . S ^TMP("ACKQSEL",$J,1,ACKMTCH)=ACKNXT
 . I ACKMTCH#5=0 S ACKDONE=1
 ; if the next entry on the list is null or does not match 
 ;  the user entry then we are at end of file
 I ACKNXT'="" D
 . I $O(@ACKIN@(ACKNXT))="" S ACKEOF=1
 . I $E($O(@ACKIN@(ACKNXT)),1,$L(ACKSEL))'=ACKSEL S ACKEOF=1
 D ^DIWW
 K DIR
 S DIR("A")="Select",DIR(0)="NO^1:"_ACKMTCH_":0"
 D ^DIR
 S ACKNUM=X
 I ACKNUM'="^",ACKNUM'?1.N S ACKNUM=""
 I 'ACKEOF,ACKNUM'="^" S X=" " D ^DIWP
 Q
 ;
SELHELP ; display help for the select prompt
 ;  called by Fileman as the Help routine for the item
 ;   being prompted in the SELECT function above.
 ;  not intended for use by other functions/routines.
 ; requires the following 
 ;  @ACKIN@(itm)   list of available items
 ;  @ACKOUT@(itm)   currently selected items
 ;  ACKLIST   which list to display 1=IN 2=OUT
 ;  ACKFLD    the name of the field
 ;
 N ACKITM,DIWL,DIWR,DIWF,X,ACKEXIT,ACK,DIR,ACKFILE
 S ACKITM="",DIWL=1,DIWR=80,DIWF=""
 S X="|SETTAB(10)|" D ^DIWP S X=" " D ^DIWP
 I ACKLIST=2 D
 . S X="    "_$S($O(@ACKOUT@(""))="":"No ",1:"The following ")
 . S X=X_$P(ACKFLD,U,1)_"s have been selected so far..."
 . D ^DIWP
 I ACKLIST=1 D
 . S X="    Choose from:"
 . D ^DIWP
 ; begin listing the items
 S ACKITM="",ACKEXIT=0
 F  D SELHELP2 Q:ACKEXIT
 ; end
 Q
 ;
SELHELP2 ; list the next 10
 S ACKFILE=$S(ACKLIST=1:ACKIN,1:ACKOUT)
 S X=" " D ^DIWP
 F ACK=1:1:10 S ACKITM=$O(@ACKFILE@(ACKITM)) Q:ACKITM=""  D
 . S X="|TAB|"_ACKITM D ^DIWP
 D ^DIWW
 ; if end of list encountered then exit
 I (ACKITM="")!($O(@ACKFILE@(ACKITM))="") S ACKEXIT=1 Q
 ; prompt to continue
 K DIR S DIR(0)="E"
 D ^DIR
 I X="^" S ACKEXIT=1
 Q
UP(X) ; convert X to uppercase
 Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")