=======================================================================
     USER CUSTOMIZED PRINTER SETTINGS
     =======================================================================
     PRODUCT:  R:BASE       VERSION :  3.1 Or Higher
     =======================================================================
     AREA   :  PROGRAMMING  CATEGORY:  USER CUSTOMIZATION    DOCUMENT#: 667
     =======================================================================
 
 
     From:  Greg Lambert
            11108 Chennault Beach Rd. #124
            Mukilteo, WA 98275
            (206) 347-5625
 
 
     User customization.  A difficult programming choice for even the
     most experienced programmer.  Often, users want the flexibility to
     select peripherals and variables for their own situation.  This can
     provide a programming headache.
 
     While developing an application, the need arose for the end-user to
     select a different printer for report printing.  This quick and
     easy command file was developed to tackle just that problem.
 
     Define the tables
     -----------------
     Two tables are used.  The first table, PRINTERS, contains three
     columns:  an indexed printer number (PRINT_NUM, INTEGER), the file
     name (FILE_ID, TEXT 8), and the long printer name (PRINT_NAME, TEXT
     30).  PRINT_NUM is an autonumbered and indexed column that just
     offers a quick method of identifying printers. FILE_ID is the printer
     definition (.PRD) file for each printer type. Finally, PRINT_NAME is
     the long name of the printer.  You can find these names in the
     beginning of each printer definition file.
 
     The second of the two tables, FACTOR, stores the printer number to
     load the correct printer definition file and an id number identifying
     the user.  FACTOR can also be used to store other variables and
     constants.  This table needs at least these two columns, EMP_NUM
     (INTEGER) and PRINT_NUM (INTEGER).
 
     PRINT_NUM in the FACTOR table is linked to PRINT_NUM (the printer
     number) in the PRINTERS table.  The column EMP_NUM is used to
     locate the correct application settings for the current user.  Using
     a table that stores application variables is an ideal method to
     customize user settings.  The column EMP_NUM could be linked to
     the same column in a table called EMPLOYEE.  The query searches for
     the employee number as it relates to the employee who is running the
     application.  The employee is found by using the CVAL function to get
     the name as specified in the RBASE.CFG file.  Now every user can have
     different printer or other settings when the application is executed.
 
     Load the data
     -------------
     All the desired printer names with their corresponding printer file
     names are loaded into the PRINTERS table. The first value entered in
     the PRINTERS table should be R:BASE's default printer file,
     NONE.PRD.  Load each row of the PRINTERS table with the file id and
     the printer name.  The printer number is an autonumbered field and
     increments as you enter each printer.  For example, to load the
     default printer, enter this information into the PRINTERS table:
 
 
 
 
 
 
            FILE_ID         PRINT_NAME
            -------         --------------
            NONE            Default
 
     To load HP Laserjet printers you would enter:
 
            FILE_ID         PRINT_NAME
            -------         --------------
            HPLASER1        HP LaserjetII
            HPLASER1        HP LaserjetIIP
            HPLASER1        HP LaserjetIII
 
     The same printer file, HPLASER1.PRD, is used for a number of
     different printers.  Enter each printer name separately, but refer
     all to the same printer file.  This lets the user pick the printer by
     the printer name; they don't need to know the file R:BASE uses. When
     you enter printers, you don't need to enter the extension .PRD.
 
     Now load the table FACTOR with the EMP_NUM for each employee. When
     the user selects a printer, the FACTOR table will be updated with
     that selection.
 
     Modify the application
     ----------------------
     Use the following commands in the application's startup file to set
     up a default printer for each user based on the FACTOR table. These
     commands query the FACTOR table to locate the printer number, and
     query the PRINTERS table to find the corresponding printer name.
 
      SET VAR vnum = emp_num IN employee WHERE empfname =(CVAL('name'))
      SET VAR pnum = print_num IN factor WHERE emp_num = .vnum
      SET VAR vfiles = file_id IN printers WHERE print_num = .pnum
      SET PRINTER &vfiles
 
     R:BASE sets the current printer to the printer specified by the
     variable VFILES.  If no printer has ever been selected by the user,
     the printer is set to NONE (the R:BASE default).  The printer files
     (.PRD) need to be in the current directory or in the directory with
     the R:BASE program files.
 
     Add a menu selection to the application menu (such as Change Printer)
     to run the command file, PRINTERS.CMD.  When you run the command
     file, it displays a scrolling menu with an alphabetical listing of
     the printer names.  The command used to display the menu is:
 
       CHOOSE choice FROM #VALUES FOR DISTINCT print_name FROM PRINTERS +
         ORDER BY print_name AT 7 25 RED ON GRAY CLEAR FOOTING
 
     Scroll down to the correct printer, and press [ENTER].  PRINTERS.CMD
     then sets the variable VFILES to the variable FILE_ID that holds the
     newly selected printer file.  The table FACTOR is updated with the
     new printer number.  If the [ESC] key is pressed from the menu, no
     changes are made and the command file returns to where it was called
     from.  Additional function key trapping can be added to the code. For
     example, to enchance user support, add code lines to trap the [F1]
     key (help).
 
 
 
 
 
 
 
 
 
 
     Whether a single or multi-user environment is in effect, customized
     printer settings are quick and easy to implement with this short
     command file.  Now it can be easy to set up the printer for a
     complicated report, or to switch printers for different reports.
 
 
     *(*****************************************)
     *( PRINTERS.CMD                            )
     *(                                         )
     *( To select a printer from the list of    )
     *( available ones                          )
     *(*****************************************)
 
     SET MESSAGES OFF
     SET ERROR MESSAGES OFF
     SET NULL ' '
 
     SET V choice TEXT,prtemp TEXT,vfiles TEXT,newnum INT, printer TEXT
     SET V vnum = emp_num IN employee WHERE empfname =(CVAL('name'))
     SET V pnum = print_num IN factor WHERE emp_num = .vnum
     SET V printer = print_name IN printers WHERE print_num = .pnum
 
     LABEL printchoice
     CLS
     WRITE 'ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ+
     ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»' AT 1 1
     WRITE 'º  PROGRAM NAME -                                       +
            SELECT PRINTER  º' AT 2 1
     WRITE 'ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ+
     ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ' AT 3 1
     WRITE 'Current printer: ',.printer AT 5 15 YELLOW ON BLUE
     WRITE 'Current printer: ',.printer AT 5 15 YELLOW ON BLUE
     WRITE 'Scroll down to select your printer.' AT 6 15
 
     CHOOSE choice FROM #VALUES FOR DISTINCT print_name FROM printers +
       ORDER BY print_name AT 7 25 RED ON GRAY CLEAR FOOTING
 
     IF choice = '[ESC]' THEN
       GOTO endprog
     ENDIF
     SET V prtemp = print_name IN printers WHERE print_name = .choice
     IF choice = .prtemp THEN
        SET V vfiles = file_id, newnum = print_num +
          IN printers WHERE print_name = .choice
        UPDATE factor SET print_num = .newnum WHERE emp_num = .vnum
        SET PRINTER &vfiles
        GOTO endprog
     ELSE
        GOTO printchoice
     ENDIF
 
     LABEL endprog
     CLEAR V choice,printer,vfiles,newnum,pnum
     CLS
 
     SET MESSAGES ON
     SET ERROR MESSAGES ON
     RETURN