home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / brokcode.zip / STDARROW.MDL < prev    next >
Text File  |  1989-10-16  |  54KB  |  1,330 lines

  1. *GLOBAL***** STDARROW MODEL  VERSION 2009 **************************************
  2.  OMIT('##-END-##')
  3.  This model will allow arrows to be added to both the TABLE and SELTABLE
  4.  routines. This is done with two implicit variables up_arrow" and down_arrow".
  5. ##-END-##
  6.  
  7.          INCLUDE('STD_KEYS.CLA')
  8.          INCLUDE('CTL_KEYS.CLA')
  9.          INCLUDE('ALT_KEYS.CLA')
  10.          INCLUDE('SHF_KEYS.CLA')
  11.  
  12. REJECT_KEY   EQUATE(CTRL_ESC)
  13. ACCEPT_KEY   EQUATE(CTRL_ENTER)
  14. TRUE         EQUATE(1)
  15. FALSE         EQUATE(0)
  16.  
  17.          MAP
  18.            PROC(G_OPENFILES)
  19.            @RUNMAP
  20.            @MODULES
  21.          .
  22.          EJECT('FILE LAYOUTS')
  23.          @FILE
  24.          EJECT('GLOBAL MEMORY VARIABLES')
  25. ACTION         SHORT                 !0 = NO ACTION
  26.                          !1 = ADD RECORD
  27.                          !2 = CHANGE RECORD
  28.                          !3 = DELETE RECORD
  29.                          !4 = LOOKUP FIELD
  30.          @MEMORY
  31.  
  32.          EJECT('CODE SECTION')
  33.   CODE
  34.   SETHUE(7,0)                     !SET WHITE ON BLACK
  35.   BLANK                         !  AND BLANK
  36.   HELP(@HELPFILE)                 !OPEN THE HELP FILE
  37.   G_OPENFILES                     !OPEN OR CREATE FILES
  38.   SETHUE()                     !    THE SCREEN
  39.   @BASEPROC                     !CALL THE BASE PROCEDURE
  40.   RETURN                     !EXIT TO DOS
  41.  
  42. G_OPENFILES  PROCEDURE                 !OPEN FILES & CHECK FOR ERROR
  43.   CODE
  44.   @OPENFILES                     !OPEN EACH FILE
  45.   BLANK                         !BLANK THE SCREEN
  46.  
  47.   @RUNPROC
  48.  
  49. *MENU***************************************************************************
  50. @PROCNAME    PROCEDURE
  51.  
  52. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  53.               @PAINTS
  54.               @STRINGS
  55.               @VARIABLES
  56.               ENTRY,USE(?FIRST_FIELD)
  57.               @FIELDS
  58.               MENU,USE(?MENU_FIELD),REQ
  59.                 @CHOICES
  60.          .          .
  61.  
  62.   EJECT
  63.   CODE
  64.   OPEN(SCREEN)                     !OPEN THE MENU SCREEN
  65.   SETCURSOR                     !TURN OFF ANY CURSOR
  66.   @SETUP                     !CALL SETUP PROCEDURE
  67.   LOOP                         !LOOP UNTIL USER EXITS
  68.     @LOOKUPS                     !DISPLAY FROM OTHER FILES
  69.     @SHOW                     !DISPLAY STRING VARIABLES
  70.     @COMPUTE                     !DISPLAY COMPUTED FIELDS
  71.     @CONDITIONAL                 !DISPLAY CONDITIONAL FIELDS
  72.     @RESULT                     !MOVE RESULTING VALUES
  73.     ALERT                     !TURN OFF ALL ALERTED KEYS
  74.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  75.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  76.     @ALERT                     !ALERT HOT KEYS
  77.     ACCEPT                     !READ A FIELD OR MENU CHOICE
  78.     @CHECKHOT                     !ON HOT KEY, CALL PROCEDURE
  79.     IF KEYCODE() = REJECT_KEY THEN RETURN.     !RETURN ON SCREEN REJECT
  80.  
  81.     EDIT_RANGE# = FIELD()             !SET ONE FIELD EDIT RANGE
  82.     IF KEYCODE() = ACCEPT_KEY             !ON SCREEN ACCEPT KEY
  83.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  84.       EDIT_RANGE# = ?MENU_FIELD - 1         !  AND EDIT REMAINING FIELDS
  85.       SELECT(?MENU_FIELD)             !  IF OK THEN START HERE NEXT
  86.     .                         !
  87.  
  88.     LOOP FIELD# = FIELD() TO EDIT_RANGE#     !EDIT FIELDS IN THE EDIT RANGE
  89.  
  90.       CASE FIELD#                 !JUMP TO FIELD EDIT ROUTINE
  91.       OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  92.     IF KEYCODE() = ESC_KEY THEN RETURN.     !  RETURN ON ESC KEY
  93.  
  94.       @EDITS                     !EDIT ROUTINES GO HERE
  95.       OF ?MENU_FIELD                 !FROM THE MENU FIELD
  96.     EXECUTE CHOICE()             !  CALL THE SELECTED PROCEDURE
  97.       @MENU                     !
  98.   . . . .
  99. *TABLE**************************************************************************
  100. ! This model is a copy of the standard model with changes being annotated with
  101. ! a !*!.  This procedure will place arrows in the table corresponding to data
  102. ! either above or below the view screen.  To get arrows in your table, add a
  103. ! calculated field on the top and bottom of the table at least two spaces
  104. ! from any scrolling data.  Use calculated fields and refer to up_arrow"
  105. ! and down_arrow".
  106. @PROCNAME    PROCEDURE
  107.  
  108. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  109.               @PAINTS
  110.               @STRINGS
  111.               @VARIABLES
  112.               ENTRY,USE(?FIRST_FIELD)
  113.               @FIELDS
  114.               @PREPOINT
  115.               REPEAT(@COUNT),EVERY(@PROWS),INDEX(NDX)
  116.           @PLOC        POINT(@PROWS,@COLS),USE(?POINT),ESC(?-1)
  117.                 @SCROLLVARIABLES
  118.          .          .
  119.  
  120. NDX         BYTE                 !REPEAT INDEX FOR POINT FIELD
  121. ROW         BYTE                 !ACTUAL ROW OF SCROLL AREA
  122. COL         BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  123. MAX         LONG                 !LESSER OF COUNT AND RECORDS
  124. COUNT         BYTE(@COUNT)             !NUMBER OF ITEMS TO SCROLL
  125. ROWS         BYTE(@ROWS)             !NUMBER OF ROWS TO SCROLL
  126. COLS         BYTE(@COLS)             !NUMBER OF COLUMNS TO SCROLL
  127.  
  128. @SAVETOTALS
  129.  
  130.   EJECT
  131.   CODE
  132.   ACTION# = ACTION                 !SAVE ACTION
  133.   OPEN(SCREEN)                     !OPEN THE SCREEN
  134.   SETCURSOR                     !TURN OFF ANY CURSOR
  135.   @SETUP                     !CALL SETUP PROCEDURE
  136.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  137.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  138.   COL = COL(?POINT)                 !  LEFT COLUMN OF SCROLL AREA
  139.   @TOTALCALC                     !BUILD TABLE TOTAL FIELDS
  140.   IF ACTION = 4                     !IF THIS IS A LOOKUP REQUEST
  141. !   DO FIND_RECORD                 !  POSITION FILE
  142. !   GET(@FILENAME,POINTER#)             !  REFRESH CURRENT RECORD
  143.     SET(@KEYNAME,@KEYNAME)             !  FIND IT IN THE FILE
  144.     NEXT(@FILENAME)                 !    AND READ IT
  145.     POINTER# = POINTER(@FILENAME)         !  SAVE POINTER TO CURRENT
  146.     SKIP(@FILENAME,-1)                 !  MAKE IT THE TOP RECORD
  147.     GET(@FILENAME,POINTER#)               !*!v! AND REFRESH CURRENT RECORD
  148.     DO SHOW_TABLE                   !*!^! FILL SCROLL AREA
  149.   ELSE                         !OTHERWISE
  150.     SET(@KEYNAME)                 !  SET TO FIRST RECORD IN FILE
  151.     DO SHOW_TABLE                 !  FILL SCROLL AREA
  152.   .
  153.   RECORDS# = TRUE                 !INITIALIZE RECORDS FLAG
  154.   LOOP                         !LOOP UNTIL USER EXITS
  155.     MAX = RECORDS(@KEYNAME)             !SET LESSER OF FILE RECORD
  156.     IF MAX > COUNT THEN MAX = COUNT.         !  COUNT AND SCROLL ITEM COUNT
  157.     ACTION = ACTION#                 !RESTORE ACTION
  158.     POINTER# = 0                 !CLEAR ADD POINTER
  159.     !-----                     !*! ARROW INSERT
  160.     SAVE#=POINTER(@KEYNAME)             !*!     "
  161.     SET(@KEYNAME)                 !*!     "
  162.     PREVIOUS(@FILENAME)                 !*!     "
  163.     END#=POINTER(@KEYNAME)             !*!     "
  164.     SET(@KEYNAME,SAVE#)                 !*!     "
  165.     NEXT(@FILENAME)                 !*!     "
  166.     !-----                     !*! ARROW INSERT
  167.     @TOTSHOW                     !DISPLAY TOTAL AMOUNT ON SCREEN
  168.     @LOOKUPS                     !DISPLAY FROM OTHER FILES
  169.     @SHOW                     !DISPLAY STRING VARIABLES
  170.     @COMPUTE                     !DISPLAY COMPUTED FIELDS
  171.     @CONDITIONAL                 !DISPLAY CONDITIONAL FIELDS
  172.     @RESULT                     !MOVE RESULTING VALUES
  173.     IF ~RECORDS(@KEYNAME)             !IF THERE ARE NO RECORDS
  174.       CLEAR(@PRE:RECORD)             !  CLEAR RECORD AREA
  175.       ACTION = 1                 !  SET ACTION TO ADD
  176.       @AUTONUMKEY                 !  AUTO INCREMENT KEY FIELD
  177.       @UPDATE                     !  CALL FORM FOR FIRST RECORD
  178.       IF ~RECORDS(@KEYNAME) THEN BREAK.         !  IF ADD ABORTED THEN EXIT
  179.       DO SHOW_RECORD                 !    PERFORM ALL CALCULATIONS
  180.       @TOTPLUS                     !    UPDATE TOTAL FIELDS
  181.       SET(@KEYNAME)                 !  SET TO NEW RECORD
  182.       DO SHOW_TABLE                 !  FILL SCROLL AREA
  183.       NDX = 1                     !  PUT SELECTOR BAR ON TOP ITEM
  184.       MAX = 1                     !  MAXIMUM DISPLAYED IS 1
  185.     .                         !
  186.     ALERT                     !RESET ALERTED KEYS
  187.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  188.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  189.     @ALERT                     !ALERT HOT KEY
  190.     ACCEPT                     !READ A FIELD
  191.     @TABLEHOT                     !ON HOT KEY, CALL PROCEDURE
  192.     IF KEYCODE() = REJECT_KEY THEN BREAK.     !RETURN ON SCREEN REJECT KEY
  193.  
  194.     EDIT_RANGE# = FIELD()             !SET ONE FIELD EDIT RANGE
  195.     IF KEYCODE() = ACCEPT_KEY AND |         !ON SCREEN ACCEPT KEY
  196.        EDIT_RANGE# <> ?POINT             ! AND NOT ON THE POINT FIELD
  197.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  198.       EDIT_RANGE# = ?POINT - 1             !  AND EDIT REMAINING FIELDS
  199.       SELECT(?POINT)                 !  IF OK THEN START HERE NEXT
  200.     .                         !
  201.  
  202.     LOOP FIELD# = FIELD() TO EDIT_RANGE#     !EDIT FIELDS IN THE EDIT RANGE
  203.  
  204.       CASE FIELD#                 !JUMP TO FIELD EDIT ROUTINE
  205.       OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  206.     IF KEYCODE() = ESC_KEY    OR |         !  RETURN ON ESC KEY
  207.        RECORDS# = FALSE             !  OR NO RECORDS
  208.          RETURN
  209.     .
  210.       @EDITS                     !EDIT ROUTINES GO HERE
  211.     RECORDS# = TRUE                 !  ASSUME RECORDS ARE HERE
  212.       @INITLOCATE                 !SHOW CURSOR FOR LOCATOR
  213.       OF ?POINT                     !FROM THE POINT FIELD
  214.     @LOCATE                     !  PERFORM LOCATOR LOGIC
  215.     CASE KEYCODE()                 !  PROCESS THE KEYSTROKE
  216.     OF INS_KEY                 !INSERT KEY
  217.       CLEAR(@PRE:RECORD)             !  CLEAR RECORD AREA
  218.       ACTION = 1                 !  SET ACTION TO ADD
  219.       @AUTONUMKEY                 !  AUTO INCREMENT KEY FIELD
  220.       @TOTCHECK                 !  SAVE TOTAL FIELD AMOUNT
  221.       @UPDATE                 !  CALL FORM FOR NEW RECORD
  222.       @AUTONUMESC                 !  RECORD NOT ADDED
  223.       IF ~ACTION                 !  IF A NEW RECORD WAS ADDED
  224.         POINTER# = POINTER(@FILENAME)     !    REMEMBER WHICH RECORD
  225.         SET(@KEYNAME,@KEYNAME)         !    SET TO NEW RECORD AND
  226.         SKIP(@FILENAME,-1)             !    MAKE IT THE TOP ITEM
  227.         DO SHOW_TABLE             !    DISPLAY THAT PAGE
  228.       .
  229.     OF ENTER_KEY                 !ENTER KEY OR
  230.     OROF ACCEPT_KEY                 !CTRL ENTER KEY
  231.       DO GET_RECORD                 !  READ THE SELECTED RECORD
  232.       IF ACTION = 4 AND KEYCODE() = ENTER_KEY!  IF THIS IS A LOOKUP REQUEST
  233.         ACTION = 0                 !    SET ACTION TO COMPLETE
  234.         RETURN                 !    AND RETURN TO CALLER
  235.       .                     !
  236.       ACTION = 2                 !  SET ACTION TO CHANGE
  237.       @TOTCHECK                 !  SAVE TOTAL FIELD AMOUNT
  238.       @UPDATE                 !  CALL FORM TO CHANGE RECORD
  239.       IF ~ACTION                 !  IF THE RECORD WAS CHANGED
  240.         POINTER# = POINTER(@FILENAME)     !    REMEMBER WHICH RECORD
  241.         SET(@KEYNAME,@KEYNAME)         !    SET TO CHANGED RECORD
  242.         SKIP(@FILENAME,-1)             !    MAKE IT THE TOP ITEM
  243.         DO SHOW_TABLE             !    AND DISPLAY THAT PAGE
  244.       ELSE                     !  OTHERWISE
  245.         SET(@KEYNAME,@KEYNAME)         !    SET TO CHANGED RECORD
  246.         SKIP(@FILENAME,-ndx)         !    MAKE IT THE TOP ITEM
  247.         DO SHOW_TABLE             !    AND DISPLAY THAT PAGE
  248.  
  249.       .
  250.     OF DEL_KEY                 !DELETE KEY
  251.       DO GET_RECORD                 !  READ THE SELECTED RECORD
  252.       ACTION = 3                 !  SET ACTION TO DELETE
  253.       @TOTSAVE                 !  SAVE TOTAL FIELD AMOUNT
  254.       @UPDATE                 !  CALL FORM TO DELETE RECORD
  255.       IF ~ACTION                 !  IF RECORD WAS DELETED
  256.         @TOTMINUS                 !    SUBTRACT FROM TOTAL FLDS
  257.         SKIP(@FILENAME,-NDX)         !    SET NEXT RECORD ON TOP
  258.         DO SHOW_TABLE             !    AND DISPLAY THAT PAGE
  259.       ELSE                     !  OTHERWISE
  260.         SKIP(@FILENAME,(MAX-NDX))         !  SKIP BACK TO SAME PAGE
  261.       .
  262.     OF DOWN_KEY                 !DOWN ARROW KEY
  263.       IF NOT EOF(@FILENAME)             !  IF THERE ARE MORE RECORDS
  264.         SKIP(@FILENAME,-COUNT+1)         !*! ARROW INSERT
  265.         DO SHOW_TABLE             !*! ARROW INSERT
  266.       .
  267.     OF PGDN_KEY                 !PAGE DOWN KEY
  268.       IF EOF(@FILENAME)             !  ON THE LAST PAGE
  269.         NDX = MAX                 !    POINT TO BOTTOM ITEM
  270.       ELSE                     !  OTHERWISE
  271.         DO SHOW_TABLE             !    DISPLAY NEXT PAGE
  272.       .
  273.     OF CTRL_PGDN                 !CTRL-PAGE DOWN KEY
  274.       NDX = MAX                 !  POINT TO BOTTOM ITEM
  275.       IF NOT EOF(@FILENAME)             !  ON THE LAST PAGE
  276.         SET(@KEYNAME)             !    SET TO BOTTOM RECORD MINUS
  277.         SKIP(@FILENAME,-COUNT)         !    ONE PAGE OF RECORDS
  278.         DO SHOW_TABLE             !    DISPLAY THE LAST PAGE
  279.       .
  280.     OF UP_KEY                 !UP ARROW KEY
  281.       SKIP(@FILENAME,-(COUNT-1))         !    SET TO TOP RECORD MINUS 1
  282.       IF NOT BOF(@FILENAME)             !  IF THERE IS A PRIOR RECORD
  283.         PREVIOUS(@FILENAME)             !     READ THE TOP RECORD
  284.         IF NOT ERROR()             !    IF READ A RECORD
  285.           SKIP(@FILENAME,-1)         !*! ARROW INSERT
  286.           DO SHOW_TABLE             !*! ARROW INSERT
  287.         ELSIF ERRORCODE() = 33         !    ELSIF RECORD NOT AVAILABLE
  288.           NEXT(@FILENAME)             !     RETRIEVE FIRST ONE
  289.       . .
  290.       SKIP(@FILENAME,COUNT-1)         !  SET RECORD FOR NEXT PAGE
  291.  
  292.     OF PGUP_KEY                 !PAGE UP KEY
  293.       SKIP(@FILENAME,-(COUNT-1))         !  SET TO TOP RECORD MINUS ONE
  294.       IF BOF(@FILENAME)             !  IF THERE IS NO PRIOR RECORD
  295.         NDX = 1                 !    THEN POINT TO TOP ITEM
  296.         SKIP(@FILENAME,COUNT-1)         !    SET RECORD FOR THIS PAGE
  297.       ELSE                     !  OTHERWISE
  298.         SKIP(@FILENAME,-(COUNT+1))         !    SET RECORD FOR PRIOR PAGE
  299.         DO SHOW_TABLE             !    AND DISPLAY THE PAGE
  300.       .
  301.     OF CTRL_PGUP                 !CTRL-PAGE UP KEY
  302.       SET(@KEYNAME)                 !  SET TO FIRST RECORD
  303.       NDX = 1                 !  POINT TO TOP ITEM
  304.       DO SHOW_TABLE                 !  AND DISPLAY THE PAGE
  305.     .
  306.   . . .
  307.   RETURN                     !RETURN TO CALLER
  308.  
  309.  
  310. SHOW_TABLE ROUTINE                 !DISPLAY A PAGE OF RECORDS
  311.   SKIP(@FILENAME,COUNT-1)             !  SET TO THE BOTTOM RECORD
  312.   IF EOF(@FILENAME)                 !  FOR A PARTIAL PAGE
  313.     SET(@KEYNAME)                 !    SET TO THE LAST RECORD
  314.     DOWN_ARROW"=' '                 !*!
  315.     SKIP(@FILENAME,-COUNT)             !    AND BACK UP ONE PAGE
  316.   ELSE                         !  OTHERWISE
  317.     NEXT(@FILENAME)                 !*!
  318.     IF POINTER(@KEYNAME)=END# OR EOF(@FILENAME)     !*!
  319.        DOWN_ARROW"=' '                 !*!
  320.     ELSE                     !*!
  321.        DOWN_ARROW"=''                 !*!
  322.     .                         !*!
  323.     PREVIOUS(@FILENAME)                 !*!
  324.     SKIP(@FILENAME,-(COUNT-1))             !    SET RECORD FOR THIS PAGE
  325.   .                         !*!
  326.   NEXT(@FILENAME)                 !*!
  327.   IF POINTER(@KEYNAME)=1 OR BOF(@FILENAME)     !*!
  328.      UP_ARROW"=' '                 !*!
  329.   ELSE                         !*!
  330.      UP_ARROW"=''                 !*!
  331.   .                         !*!
  332.   PREVIOUS(@FILENAME)                 !*!
  333.   NDX# = NDX                     !  SAVE REPEAT INDEX
  334.   LOOP NDX = 1 TO COUNT                 !  LOOP THRU THE SCROLL AREA
  335.     IF EOF(@FILENAME) THEN BREAK.         !    BREAK ON END OF FILE
  336.     NEXT(@FILENAME)                 !    READ THE NEXT RECORD
  337.     DO SHOW_RECORD                 !    AND DISPLAY IT
  338.     IF POINTER(@FILENAME) = POINTER#         !POINT TO CORRECT RECORD
  339.        NDX# = NDX                 !
  340.        @DOTOTALS                 !*!
  341.   . .
  342.   NDX = NDX#                     !  RESTORE REPEAT INDEX
  343.   CLEAR(@PRE:RECORD)                 !  CLEAR RECORD AREA
  344.   IF RECORDS(@KEYNAME) < COUNT             !  IF RECORDS DO NOT FILL
  345.      NDX#= RECORDS(@KEYNAME) * @PROWS         !     GET NUMBER TIMES SIZE
  346.      BLANK(ROW + NDX#,COL,ROWS-NDX#,COLS)     !     BLANK REMAINING AREA
  347.   .
  348. SHOW_RECORD ROUTINE                 !DISPLAY A RECORD
  349.   @LOOKUPSCROLL                     !  DISPLAY FROM OTHER FILES
  350.   @SHOWSCROLL                     !  DISPLAY STRING VARIABLES
  351.   @COMPUTESCROLL                 !  DISPLAY COMPUTED FIELDS
  352.   @CONDITIONALSCRL                 !  DISPLAY CONDITIONAL FIELDS
  353.   @RESULTSCROLL                     !  ASSIGN RESULT FIELDS
  354.  
  355. GET_RECORD ROUTINE                 !READ SELECTED RECORD
  356.   SKIP(@FILENAME,-(MAX-NDX+1))             !  SET TO SELECTED RECORD
  357.   NEXT(@FILENAME)                 !    AND READ IT
  358.  
  359. FIND_RECORD ROUTINE                 !LOCATE REQUESTED RECORD
  360.   SET(@KEYNAME,@KEYNAME)             !  SET TO REQUESTED RECORD
  361.   IF EOF(@FILENAME)                 !  IF BEYOND END OF FILE
  362.     PREVIOUS(@FILENAME)                 !    GET THE LAST RECORD
  363.   ELSE                         !  ELSE
  364.     NEXT(@FILENAME)                 !    READ THIS RECORD
  365.   .
  366.   POINTER# = POINTER(@FILENAME)             !  SAVE ITS RECORD POINTER
  367.   SKIP(@FILENAME,-1)                 !  MAKE IT THE TOP RECORD
  368.   DO SHOW_TABLE                     !  AND FILL THE SCROLL AREA
  369.  
  370. SAME_PAGE ROUTINE                 !SET TO SAME PAGE ROUTINE
  371.   POINTER# = POINTER(@FILENAME)             !  SAVE ITS RECORD POINTER
  372.   GET(@FILENAME,POINTER#)             !  GET THE RECORD
  373.   SET(@KEYNAME,@KEYNAME)             !  SET TO THE SAME RECORD
  374.   SKIP(@FILENAME,-1)                 !  SKIP TO TOP OF SAME PAGE
  375.  
  376. @COMPUTETOTS                     !CALCULATE TOTAL FIELDS
  377. *SELTABLE***********************************************************************
  378. ! See table header for explanation of changes.
  379. @PROCNAME    PROCEDURE
  380.  
  381. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  382.               @PAINTS
  383.               @STRINGS
  384.               @VARIABLES
  385.               ENTRY,USE(?FIRST_FIELD)
  386.               @FIELDS
  387.               @PREPOINT
  388.               REPEAT(@COUNT),EVERY(@PROWS),INDEX(NDX)
  389.           @PLOC        POINT(@PROWS,@COLS),USE(?POINT),ESC(?-1)
  390.                 @SCROLLVARIABLES
  391.          .          .
  392.  
  393. PTR         LONG                 !ENTRY POINTER FOR KEY TABLE
  394. NDX         BYTE                 !REPEAT INDEX FOR POINT AREA
  395. ROW         BYTE                 !ACTUAL ROW OF SCROLL AREA
  396. COL         BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  397. COUNT         BYTE(@COUNT)             !NUMBER OF ITEMS TO SCROLL
  398. ROWS         BYTE(@ROWS)             !NUMBER OF ROWS TO SCROLL
  399. COLS         BYTE(@COLS)             !NUMBER OF COLUMNS TO SCROLL
  400.  
  401. TABLE         TABLE                 !TABLE OF RECORD KEYS
  402. TBLPTR           LONG                 !  POINTER TO DATA RECORD
  403. KEY           GROUP,PRE(TBL)             !  RECORD KEY FIELDS
  404.          @COMPONENTS
  405.          . .
  406. @SAVEITEMS
  407. @SAVETOTALS
  408.  
  409.   EJECT
  410.   CODE
  411.   ACTION# = ACTION                 !SAVE ACTION
  412.   OPEN(SCREEN)                     !OPEN THE SCREEN
  413.   SETCURSOR                     !TURN OFF ANY CURSOR
  414.   @SETUP                     !CALL SETUP PROCEDURE
  415.   @INITSELECTS                     !SAVE SELECTOR FIELDS
  416.   PTR = 1                     !START AT TABLE ENTRY
  417.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  418.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  419.   COL = COL(?POINT)                 !LEFT COLUMN OF SCROLL AREA
  420.   RECORDS# = TRUE                 !INITIALIZE RECORDS FLAG
  421.   LOOP                         !LOOP UNTIL USER EXITS
  422.     ACTION = ACTION#                 !RESTORE ACTION
  423.     @RESTSELECTS                 !RESTORE SELECTOR FIELDS
  424.     @TOTSHOW
  425.     @LOOKUPS                     !DISPLAY FROM OTHER FILES
  426.     @SHOW                     !DISPLAY STRING VARIABLES
  427.     @COMPUTE                     !DISPLAY COMPUTED FIELDS
  428.     @CONDITIONAL                 ! 2008
  429.     @RESULT                     !MOVE RESULTING VALUES
  430.     ALERT                     !RESET ALERTED KEYS
  431.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  432.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  433.     @ALERT                     !ALERT HOT KEY
  434.     ACCEPT                     !READ A FIELD
  435.     MEM:MESSAGE = ''                 !CLEAR MESSAGE AREA
  436.     @TABLEHOT                     !ON HOT KEY, CALL PROCEDURE
  437.     IF KEYCODE() = REJECT_KEY THEN BREAK.     !RETURN ON SCREEN REJECT KEY
  438.  
  439.     EDIT_RANGE# = FIELD()             !SET ONE FIELD EDIT RANGE
  440.     IF KEYCODE() = ACCEPT_KEY  AND |         !ON SCREEN ACCEPT KEY
  441.        EDIT_RANGE# <> ?POINT             ! AND NOT ON THE POINT FIELD
  442.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  443.       EDIT_RANGE# = ?POINT - 1             !  AND EDIT REMAINING FIELDS
  444.       SELECT(?POINT)                 !  IF OK THEN START HERE NEXT
  445.     .                         !
  446.  
  447.     LOOP FIELD# = FIELD() TO EDIT_RANGE#     !EDIT FIELDS IN THE EDIT RANGE
  448.  
  449.       CASE FIELD#                 !JUMP TO FIELD EDIT ROUTINE
  450.  
  451.       OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  452.     IF KEYCODE() = ESC_KEY OR |         !  RETURN ON ESC KEY
  453.        RECORDS# = FALSE             !  OR NO RECORDS
  454.          FREE(TABLE)             !  FREE THE TABLE OF POINTS
  455.          RETURN                 !  RETURN TO CALLER
  456.     .
  457.       @EDITS                     !EDIT ROUTINES GO HERE
  458.     RECORDS# = TRUE                 !  ASSUME THERE ARE RECORDS
  459.       @INITLOCATE
  460.       OF ?POINT                     !PROCESS THE POINT FIELD
  461.     IF ~RECORDS(TABLE)             !IF THERE ARE NO RECORDS
  462.       CLEAR(@PRE:RECORD)             !  CLEAR RECORD AREA
  463.       UPDATE                 !  UPDATE ALL FIELDS
  464.       ACTION = 1                 !  SET ACTION TO ADD
  465.       @AUTONUMKEY                 ! 2008
  466.       @TOTCHECK
  467.       @UPDATE                 !  CALL FORM FOR FIRST RECORD
  468.       IF ~ACTION                 !  IF RECORD WAS ADDED
  469.         DO ADD_TABLE             !    THEN ADD NEW TABLE ENTRY
  470.         DO SORT_TABLE             !    SORT THE TABLE
  471.         DO SHOW_TABLE             !    AND DISPLAY FIRST PAGE
  472.       .
  473.       IF ~RECORDS(TABLE)             !  IF ADD ABORTED TRY AGAIN
  474.           RECORDS# = FALSE             !    INDICATE NO RECORDS
  475.           SELECT(?-1)             !    SELECT PREVIOUS FIELD
  476.           BREAK                 !    END THE EDITS
  477.       .
  478.       CYCLE                     !  CONTINUE THE EDIT
  479.     .
  480.     @LOCATE
  481.     CASE KEYCODE()                 !PROCESS THE KEYSTROKE
  482.  
  483.     OF ENTER_KEY                 !ENTER KEY OR
  484.     OROF ACCEPT_KEY                 !CTRL-ENTER KEY
  485.       DO GET_RECORD                 !  READ THE SELECTED RECORD
  486.       IF ERROR()                 !  IF RECORD HAS BEEN DELETED
  487.         MEM:MESSAGE = ERROR()         !    TELL USER WHAT HAPPENED
  488.         SELECT(?)                 !    STAY IN THE POINT FIELD
  489.         DO BUILD_TABLE             !    REBUILD TABLE
  490.         DO SORT_TABLE             !    SORT IT
  491.         DO SHOW_TABLE             !    SHOW IT
  492.         BREAK                 !    AND GET ANOTHER KEY
  493.       .
  494.       IF ACTION = 4 AND KEYCODE() = ENTER_KEY!  IF THIS IS A LOOKUP REQUEST
  495.         ACTION = 0                 !    SET ACTION TO COMPLETE
  496.         FREE(TABLE)                 !    FREE THE TABLE OF POINTS
  497.         RETURN                 !    RETURN TO CALLER
  498.       .
  499.       ACTION = 2                 !  SET ACTION TO CHANGE
  500.       @TOTSAVE
  501.       @UPDATE                 !  CALL FORM TO CHANGE RECORD
  502.       IF ~ACTION                 !  IF THE RECORD WAS CHANGED
  503.         @TOTMINUS
  504.         DELETE(TABLE)             !    DELETE OLD TABLE ENTRY
  505.         DO ADD_TABLE             !    ADD NEW TABLE ENTRY
  506.         DO SORT_TABLE             !    SORT THE TABLE
  507.         DO SHOW_TABLE             !    AND DISPLAY THAT PAGE
  508.       .
  509.     OF INS_KEY                 !INS KEY
  510.       CLEAR(@PRE:RECORD)             !  CLEAR RECORD AREA
  511.       UPDATE                 !  UPDATE ALL FIELDS
  512.       ACTION = 1                 !  SET ACTION TO ADD
  513.       @AUTONUMKEY                 ! 2008
  514.       @UPDATE                 !  CALL FORM FOR NEW RECORD
  515.       IF ~ACTION                 !  IF RECORD WAS ADDED
  516.         DO ADD_TABLE             !    ADD NEW TABLE ENTRY
  517.         DO SORT_TABLE             !    SORT THE TABLE
  518.         DO SHOW_TABLE             !    AND DISPLAY THAT PAGE
  519.       .
  520.     OF DEL_KEY                 !DEL KEY
  521.       DO GET_RECORD                 !  READ THE SELECTED RECORD
  522.       IF ERROR()                 !  IF RECORD HAS BEEN DELETED
  523.         MEM:MESSAGE = ERROR()         !    TELL USER WHAT HAPPENED
  524.         SELECT(?)                 !    STAY ON THE POINT FIELD
  525.         DO BUILD_TABLE             !    REBUILD TABLE
  526.         DO SORT_TABLE             !    SORT IT
  527.         DO SHOW_TABLE             !    SHOW IT
  528.         BREAK                 !    AND GET ANOTHER KEY
  529.       .
  530.       @TOTSAVE
  531.       ACTION = 3                 !  SET ACTION TO DELETE
  532.       @UPDATE                 !  CALL FORM TO DELETE RECORD
  533.       IF ~ACTION                 !  IF RECORD WAS DELETED
  534.         @TOTMINUS
  535.         DELETE(TABLE)             !    DELETE TABLE ENTRY
  536.         DO SHOW_TABLE             !    AND DISPLAY THAT PAGE
  537.       .
  538.     OF DOWN_KEY                 !DOWN ARROW KEY
  539.       IF PTR <= RECORDS(TABLE)-COUNT     !  IF THERE ARE MORE ENTRIES
  540.         PTR += 1                 !    SET TO THE NEXT ENTRY
  541.         TBLPTR = -1                 !*!
  542.         DO SHOW_TABLE             !*!
  543.       .
  544.     OF UP_KEY                 !UP ARROW KEY
  545.       IF PTR > 1                 !  IF THERE IS A PRIOR RECORD
  546.         PTR -= 1                 !    SET TO PRIOR RECORD
  547.         TBLPTR = -1
  548.         DO SHOW_TABLE
  549.       .
  550.  
  551.     OF PGDN_KEY                 !PAGE DOWN KEY
  552.       IF PTR >= RECORDS(TABLE)-COUNT+1     !  ON THE LAST PAGE
  553.         NDX = COUNT.             !    POINT TO BOTTOM ITEM
  554.       PTR += COUNT                 !  OTHERWISE
  555.       TBLPTR = -1                 !  NOT SET TO A RECORD
  556.       DO SHOW_TABLE                 !    DISPLAY THE NEXT PAGE
  557.  
  558.     OF PGUP_KEY                 !PAGE UP KEY
  559.       IF PTR = 1 THEN NDX = 1.         !  ON FIRST PAGE POINT TO TOP
  560.       PTR -= ROWS                 !  OTHERWISE BACK UP 1 PAGE
  561.       IF PTR < 1                 !*!
  562.          PTR = 1                 !*!
  563.          NDX = 1                 !*!
  564.       .                     !*!
  565.       TBLPTR = -1                 !  NOT SET TO A RECORD
  566.       DO SHOW_TABLE                 !  AND DISPLAY IT
  567.  
  568.     OF CTRL_PGDN                 !CTRL-PAGE DOWN KEY
  569.       PTR = RECORDS(TABLE) - COUNT + 1     !  SET TO LAST PAGE
  570.       NDX = COUNT                 !  POINT TO BOTTOM ITEM
  571.       TBLPTR = -1                 !  NOT SET TO A RECORD
  572.       DO SHOW_TABLE                 !  DISPLAY THE LAST PAGE
  573.  
  574.     OF CTRL_PGUP                 !CTRL-PAGE UP
  575.       PTR = 1                 !  POINT TO FIRST RECORD
  576.       NDX = 1                 !  POINT TO TOP ITEM
  577.       TBLPTR = -1                 !  NOT SET TO A RECORD
  578.       DO SHOW_TABLE                 !  AND DISPLAY THE FIRST PAGE
  579.     .
  580.   . . .                         !
  581.  
  582.   FREE(TABLE)                     !FREE MEMORY TABLE
  583.   RETURN                     !AND RETURN TO CALLER
  584.  
  585. BUILD_TABLE ROUTINE                 !BUILD MEMORY TABLE
  586.   FREE(TABLE)                     !EMPTY THE TABLE
  587.   CLEAR(@PRE:RECORD)                 ! 2008
  588.   @TOTCLEAR
  589.   @RESTSELECTS                     ! 2008
  590.   @READTABLE
  591. ! UPDATE                     ! 2008
  592. ! @RESULT                     ! 2008
  593.   @READTABLE                     !DO SELECTOR OR FILTER
  594.   TBLPTR = -1                     !INITIALIZE TO NO RECORD
  595.   DO SHOW_TABLE                     !DISPLAY A PAGE OF RECORDS
  596.  
  597. ADD_TABLE ROUTINE                 !ADD ENTRY TO MEMORY TABLE
  598.   @CHECKADD                     !
  599.   IF ~(@FILTER) THEN EXIT.             !  EXIT IF FILTERED OUT
  600.   @SETCOMPONENTS                 !  MOVE KEY COMPONENTS
  601.   TBLPTR = POINTER(@FILENAME)             !  SAVE DATA RECORD POINTER
  602.   ADD(TABLE)                     !  ADD NEW TABLE ENTRY
  603.   IF ERROR()                     !  IF OUT OF MEMORY
  604.     MEM:MESSAGE = ERROR()             !    INFORM USER
  605.     BEEP                     !    SOUND ALARM
  606.   .
  607.   SETHUE(BACKHUE(ROW,COL),BACKHUE(ROW,COL))     !TURN OFF DISPLAY
  608.   DO SHOW_LINE                     !  CALC SCROLLING LINE FIELDS
  609.   @TOTPLUS                     !  ADD TO TOTALS
  610.   SETHUE()
  611.  
  612. SORT_TABLE ROUTINE                 !SORT TABLE ENTRIES
  613.   TBLPTR# = TBLPTR                 !  SAVE DATA RECORD POINTER
  614.   @SORTTABLE                     !  SORT THE TABLE
  615.   LOOP PTR = 1 TO RECORDS(TABLE)         !  LOOK UP THE SAVED POINTER
  616.     GET(TABLE,PTR)                 !    SO WE WILL STILL POINT
  617.     IF TBLPTR = TBLPTR# THEN EXIT.         !    AT THE SAME RECORD
  618.   .
  619.  
  620. SHOW_TABLE ROUTINE                 !DISPLAY A PAGE OF RECORDS
  621.   IF PTR > RECORDS(TABLE)-COUNT+1         !  FOR A PARTIAL PAGE
  622.     DOWN_ARROW"=' '                 !*!
  623.     PTR = RECORDS(TABLE)-COUNT+1         !    SET TO THE LAST RECORD
  624.   ELSE                         !*!
  625.     IF (COUNT+PTR-1) = RECORDS(TABLE)         !*!
  626.        DOWN_ARROW"=' '                 !*!
  627.     ELSE                     !*!
  628.        DOWN_ARROW"=''                 !*!
  629.     .
  630.   .                         !*!
  631.   IF PTR < 1 THEN PTR = 1.             !    AND BACK UP ONE PAGE
  632.   IF PTR=1                     !*!
  633.      UP_ARROW"=' '                 !*!
  634.   ELSE                         !*!
  635.      UP_ARROW"=''
  636.   .                         !*!
  637.   TBLPTR# = TBLPTR                 !  SAVE DATA RECORD POINTER
  638.   NDX# = NDX                     !  SAVE REPEAT INDEX
  639.   LOOP NDX = 1 TO COUNT                 !  LOOP THRU THE SCROLL AREA
  640.     DO SHOW_RECORD                 !    DISPLAY A RECORD
  641.     IF TBLPTR# = TBLPTR THEN NDX# = NDX.     !    POINT TO CORRECT RECORD
  642.   .                         !
  643.   NDX = NDX#                     !  RESTORE REPEAT INDEX
  644.   IF NDX > RECORDS(TABLE) THEN NDX = RECORDS(TABLE).!SHOWING THE LAST
  645.   CLEAR(@PRE:RECORD)                 !  CLEAR RECORD AREA
  646.   IF RECORDS(TABLE) < COUNT             !  IF RECORDS DO NOT FILL
  647.      NDX#= RECORDS(TABLE) * @PROWS         !     GET NUMBER TIMES SIZE
  648.      BLANK(ROW + NDX#,COL,ROWS-NDX#,COLS)     !     BLANK REMAINING AREA
  649.   .
  650.  
  651. SHOW_RECORD ROUTINE                 !DISPLAY A RECORD
  652.   TBLPTR = 0                     !  START WITH NO RECORD
  653.   GET(TABLE,PTR+NDX-1)                 !  GET THE TABLE ENTRY
  654.   IF ~ERROR()                     !  IF THERE IS ONE
  655.     GET(@FILENAME,TBLPTR)             !    READ A DATA RECORD
  656.     IF ~ERROR()
  657.       @RESTSELECTS                 !    RESTORE SELECTOR FIELDS
  658.       @LOOKUPSCROLL                 !    DISPLAY FROM OTHER FILES
  659.       @SHOWSCROLL                 !    DISPLAY STRING VARIABLES
  660.       @COMPUTESCROLL                 !    DISPLAY COMPUTED FIELDS
  661.       @CONDITIONALSCRL                 ! 2008
  662.       @RESULTSCROLL                 ! 2008
  663.   . .
  664.  
  665. SHOW_LINE    ROUTINE                 !DISPLAY SCROLLING LINE
  666.   @LOOKUPSCROLL                     !    DISPLAY FROM OTHER FILES
  667.   @SHOWSCROLL                     !    DISPLAY STRING VARIABLES
  668.   @COMPUTESCROLL                 !    DISPLAY COMPUTED FIELDS
  669.   @CONDITIONALSCRL                 !    DISPLAY CONDITIONAL FIELDS
  670.   @RESULTSCROLL                     !    ASSIGN RESULT FIELDS
  671.  
  672. GET_RECORD ROUTINE                 !READ SELECTED RECORD
  673.   GET(TABLE,PTR+NDX-1)                 !  GET THE TABLE ENTRY
  674.   GET(@FILENAME,TBLPTR)                 !  READ THE DATA RECORD
  675.  
  676. FIND_RECORD ROUTINE                 !LOCATE REQUESTED RECORD
  677.   @SETCOMPONENTS                 !  MOVE THEM TO THE TABLE
  678.   GET(TABLE,KEY)                 !  GET THE TABLE ENTRY
  679.   PTR = POINTER(TABLE)                 !  SET RECORD POINTER
  680.   IF ~PTR THEN PTR = RECORDS(TABLE).         !  SET TO LAST IF NO POINTER
  681.   GET(TABLE,PTR)                 !  AND READ THE DATA RECORD
  682.   DO SHOW_TABLE                     !  DISPLAY THAT PAGE
  683.  
  684. SAME_PAGE ROUTINE                 !SET TO SAME PAGE ROUTINE
  685.   DO SORT_TABLE                     !  SORT THE TABLE
  686.  
  687. @COMPUTETOTS
  688. *FORM***************************************************************************
  689. @PROCNAME    PROCEDURE
  690.  
  691. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  692.               @PAINTS
  693.               @STRINGS
  694.               @VARIABLES
  695.               ENTRY,USE(?FIRST_FIELD)
  696.               @FIELDS
  697.               @PAUSE
  698.               ENTRY,USE(?LAST_FIELD)
  699.               PAUSE(''),USE(?DELETE_FIELD)
  700.          .
  701.  
  702.   EJECT
  703.   CODE
  704.   OPEN(SCREEN)                     !OPEN THE SCREEN
  705.   SETCURSOR                     !TURN OFF ANY CURSOR
  706.   @SETUP                     !CALL SETUP PROCEDURE
  707.   DISPLAY                     !DISPLAY THE FIELDS
  708.   EXECUTE ACTION                 !SET THE CURRENT RECORD POINTER
  709.     POINTER# = 0                 !  NO RECORD FOR ADD
  710.     POINTER# = POINTER(@FILENAME)         !  CURRENT RECORD FOR CHANGE
  711.     POINTER# = POINTER(@FILENAME)         !  CURRENT RECORD FOR CHANGE
  712.   .
  713.   LOOP                         !LOOP THRU ALL THE FIELDS
  714.     MEM:MESSAGE = CENTER(MEM:MESSAGE,SIZE(MEM:MESSAGE)) !DISPLAY ACTION MESSAGE
  715.     @LOOKUPS                     !DISPLAY FROM OTHER FILES
  716.     @SHOW                     !DISPLAY STRING VARIABLES
  717.     @COMPUTE                     !DISPLAY COMPUTED FIELDS
  718.     @CONDITIONAL                 !DISPLAY CONDITIONAL FIELDS
  719.     @RESULT                     !MOVE RESULTING VALUES
  720.     ALERT                     !RESET ALERTED KEYS
  721.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  722.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  723.     @ALERT                     !ALERT HOT KEY
  724.     ACCEPT                     !READ A FIELD
  725.     @CHECKHOT                     !ON HOT KEY, CALL PROCEDURE
  726.     IF KEYCODE() = REJECT_KEY THEN RETURN.     !RETURN ON SCREEN REJECT KEY
  727.     EXECUTE ACTION                 !SET ACTION MESSAGE
  728.       MEM:MESSAGE = 'Record will be Added'     !
  729.       MEM:MESSAGE = 'Record will be Changed'     !
  730.       MEM:MESSAGE = 'Press Enter to Delete'     !
  731.     .
  732.     EDIT_RANGE# = FIELD()             !SET ONE FIELD EDIT RANGE
  733.     IF KEYCODE() = ACCEPT_KEY             !ON SCREEN ACCEPT KEY
  734.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  735.       EDIT_RANGE# = FIELDS()             !  AND EDIT REMAINING FIELDS
  736.     .                         !
  737.     LOOP FIELD# = FIELD() TO EDIT_RANGE#     !EDIT FIELDS IN THE EDIT RANGE
  738.       CASE FIELD#                 !JUMP TO FIELD EDIT ROUTINE
  739.       OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  740.     IF KEYCODE() = ESC_KEY THEN RETURN.     !  RETURN ON ESC KEY
  741.     IF ACTION = 3 THEN SELECT(?DELETE_FIELD).!  OR CONFIRM FOR DELETE
  742.  
  743.       @EDITS                     !EDIT ROUTINES GO HERE
  744.       OF ?LAST_FIELD                 !FROM THE LAST FIELD
  745.     EXECUTE ACTION                 !  UPDATE THE FILE
  746.       ADD(@FILENAME)             !    ADD NEW RECORD
  747.       PUT(@FILENAME)             !    CHANGE EXISTING RECORD
  748.       DELETE(@FILENAME)             !    DELETE EXISTING RECORD
  749.     .
  750.     IF ERROR() THEN STOP(ERROR()).         !  CHECK FOR UNEXPECTED ERROR
  751.     PUT(@FILENAME2)                 !  UPDATE SECONDARY FILES
  752.     PUT(@FILENAME3)                 !  UPDATE SECONDARY FILES
  753.     PUT(@FILENAME4)                 !  UPDATE SECONDARY FILES
  754.     @NEXTFORM                 !  CALL NEXT FORM PROCEDURE
  755.     ACTION = 0                 !  SET ACTION TO COMPLETE
  756.     RETURN                     !  AND RETURN TO CALLER
  757.  
  758.       OF ?DELETE_FIELD                 !FROM THE DELETE FIELD
  759.     IF KEYCODE() = ENTER_KEY |         !  ON ENTER KEY
  760.     OR KEYCODE() = ACCEPT_KEY         !  OR CTRL-ENTER KEY
  761.       SELECT(?LAST_FIELD)             !    DELETE THE RECORD
  762.     ELSE                     !  OTHERWISE
  763.       BEEP                     !    BEEP AND ASK AGAIN
  764.   . . . .
  765.  
  766. *MEMFORM************************************************************************
  767. @PROCNAME    PROCEDURE
  768.  
  769. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  770.               @PAINTS
  771.               @STRINGS
  772.               @VARIABLES
  773.               ENTRY,USE(?FIRST_FIELD)
  774.               @FIELDS
  775.               @PAUSE
  776.               ENTRY,USE(?LAST_FIELD)
  777.          .
  778.  
  779.   EJECT
  780.   CODE
  781.   OPEN(SCREEN)                     !OPEN THE SCREEN
  782.   SETCURSOR                     !TURN OFF ANY CURSOR
  783.   @SETUP                     !CALL SETUP PROCEDURE
  784.   DISPLAY                     !DISPLAY THE FIELDS
  785.   LOOP                         !LOOP THRU ALL THE FIELDS
  786.     @LOOKUPS                     !DISPLAY FROM OTHER FILES
  787.     @SHOW                     !DISPLAY STRING VARIABLES
  788.     @COMPUTE                     !DISPLAY COMPUTED FIELDS
  789.     @CONDITIONAL                 !DISPLAY CONDITIONAL FIELDS
  790.     @RESULT                     !MOVE RESULTING VALUES
  791.     ALERT                     !RESET ALERTED KEYS
  792.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  793.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  794.     @ALERT                     !ALERT HOT KEY
  795.     ACCEPT                     !READ A FIELD
  796.     @CHECKHOT                     !ON HOT KEY, CALL PROCEDURE
  797.     IF KEYCODE() = REJECT_KEY THEN RETURN.     !RETURN ON SCREEN REJECT KEY
  798.     EDIT_RANGE# = FIELD()             !SET ONE FIELD EDIT RANGE
  799.     IF KEYCODE() = ACCEPT_KEY             !ON SCREEN ACCEPT KEY
  800.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  801.       EDIT_RANGE# = FIELDS()             !  AND EDIT REMAINING FIELDS
  802.     .                         !
  803.     LOOP FIELD# = FIELD() TO EDIT_RANGE#     !EDIT FIELDS IN THE EDIT RANGE
  804.       CASE FIELD#                 !JUMP TO FIELD EDIT ROUTINE
  805.       OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  806.     IF KEYCODE() = ESC_KEY THEN RETURN.     !  RETURN ON ESC KEY
  807.  
  808.       @EDITS                     !EDIT ROUTINES GO HERE
  809.       OF ?LAST_FIELD                 !FROM THE LAST FIELD
  810.     PUT(@FILENAME2)                 !  UPDATE SECONDARY FILES
  811.     PUT(@FILENAME3)                 !  UPDATE SECONDARY FILES
  812.     PUT(@FILENAME4)                 !  UPDATE SECONDARY FILES
  813.     @NEXTFORM                 !  CALL NEXT FORM PROCEDURE
  814.     ACTION = 0                 !  SET ACTION TO COMPLETE
  815.     RETURN                     !  AND RETURN TO CALLER
  816.   . . .
  817.  
  818. *REPORT*************************************************************************
  819.  
  820. @PROCNAME    PROCEDURE
  821.  
  822. REPORT         @REPORT
  823.  
  824. @SAVEITEMS
  825.  
  826.   CODE
  827.   DONE# = 0                     !TURN OFF DONE FLAG
  828.   @SETUP                     !CALL SETUP PROCEDURE
  829.   @INITSELECTS                     !SAVE SELECTOR FIELDS
  830.   CLEAR(@PRE:RECORD)                 !MAKE SURE RECORD CLEARED
  831.   @RESTSELECTS                     !RESTORE SELECTOR CRITERIA
  832.   BUILD(@INDEX)                     !BUILD FILE INDEX
  833.   @INITREPORT                     !INIT REPORT VARIABLES
  834.   @RPTHEADER                     !DO REPORT HEADER COMPUTES
  835.   PRINT(TTL:RPT_HEAD)                 !PRINT TITLE PAGE
  836.   @PRINTMEMO                     !PRINT ANY MEMO FILES
  837.   CLOSE(TITLE)                     !CLOSE TITLE REPORT
  838.   @SETFILE                     !SET TO FIRST RECORD
  839.   @PAGEFOOTER                     !DO PAGE FOOTER COMPUTES
  840.   @PAGEHEADER                     !DO PAGE HEADER COMPUTES
  841.   DO NEXT_RECORD                 !READ FIRST RECORD
  842.   @PAGEHEADER                     !DO PAGE HEADER COMPUTES
  843.   OPEN(REPORT)                     !OPEN THE REPORT
  844.   @FIRSTBREAK                     !PRINT INITIAL BREAK HEADERS
  845.   LOOP UNTIL DONE#                 !READ ALL RECORDS IN FILE
  846.     SAVE_LINE# = MEM:LINE             !  SAVE LINE NUMBER
  847.     LAST_REC# = POINTER(@FILENAME)
  848.     @RUNTOTALS                     !  ACCUMULATE RUNNING TOTALS
  849.     @INITDETAIL                     !  SET UP FOR DETAIL LINE
  850.     PRINT(RPT:DETAIL)                 !  PRINT DETAIL LINES
  851.     DO CHECK_PAGE                 !  DO PAGE BREAK IF NEEDED
  852.     @PRINTMEMO                     !  PRINT ANY MEMO FIELD
  853.     @TOTALS                     !  ACCUMULATE TOTALS
  854.     @PAGEFOOTER                     !  DO PAGE FOOTER COMPUTES
  855.     @PAGEHEADER                     !  DO PAGE HEADER COMPUTES
  856.     @PAGEEJECT                     !  GO TO NEW PAGE
  857.     DO NEXT_RECORD                 !  GET NEXT RECORD
  858.     @CHECKBREAK                     !  CHECK FOR BREAK
  859.   .                         !
  860.   @LASTBREAK                     !  PRINT ENDING BREAK FOOTERS
  861.   @RPTFOOTER                     !DO REPORT FOOTER COMPUTES
  862.   PRINT(RPT:RPT_FOOT)                 !PRINT GRAND TOTALS
  863.   DO CHECK_PAGE                     !  DO PAGE BREAK IF NEEDED
  864.   @PRINTMEMO                     !  PRINT ANY MEMO FIELD
  865.   CLOSE(REPORT)                     !CLOSE REPORT
  866.   RETURN                     !RETURN TO CALLER
  867.  
  868.  
  869. NEXT_RECORD ROUTINE                 !GET NEXT RECORD
  870.   LOOP UNTIL EOF(@FILENAME)             !  READ UNTIL END OF FILE
  871.     NEXT(@FILENAME)                 !    READ NEXT RECORD
  872.     @CHECKSELECT                 !    STOP IF PAST SELECTOR
  873.     @DETAIL                     !    DO DETAIL COMPUTES
  874.     IF ~(@FILTER) THEN CYCLE.             !    IF FILTERED OUT, GET NEXT
  875.     EXIT                     !    EXIT THE ROUTINE
  876.   .                         !
  877.   DONE# = 1                     !  ON EOF, SET DONE FLAG
  878.  
  879. CHECK_PAGE ROUTINE                 !CHECK FOR NEW PAGE
  880.   IF MEM:LINE <= SAVE_LINE#             !  ON PAGE OVERFLOW
  881.     @INITPAGE                     !    INIT PAGE VARIABLES
  882.   .
  883.   LOOP UNTIL NOT KEYBOARD()             !LOOK FOR KEYSTROKE
  884.     ASK
  885.     IF KEYCODE() = REJECT_KEY THEN RETURN.     !ABORT REPORT
  886.   .
  887.  
  888. @BREAKRTN                     !CHECK FOR GROUP BREAK
  889. *MEMREPORT**********************************************************************
  890.  
  891. @PROCNAME    PROCEDURE
  892.  
  893. REPORT         @REPORT
  894.  
  895.   CODE
  896.   @SETUP                     !CALL SETUP PROCEDURE
  897.   @INITREPORT                     !INIT REPORT VARIABLES
  898.   @RPTHEADER                     !DO REPORT HEADER COMPUTES
  899.   PRINT(TTL:RPT_HEAD)                 !PRINT TITLE PAGE
  900.   @MEMMEMO                     !PRINT ANY MEMO FILES
  901.   CLOSE(TITLE)                     !CLOSE TITLE REPORT
  902.   @PAGEFOOTER                     !DO PAGE FOOTER COMPUTES
  903.   @PAGEHEADER                     !DO PAGE HEADER COMPUTES
  904.   OPEN(REPORT)                     !OPEN REPORT BODY
  905.   @MEMMEMO                     !PRINT ANY MEMO FIELD
  906.   @DETAIL                     !DO DETAIL COMPUTES
  907.   @RUNTOTALS                     !ACCUMULATE RUNNING TOTALS
  908.   @INITDETAIL                     !SET UP FOR DETAIL RECORD
  909.   PRINT(RPT:DETAIL)                 !PRINT DETAIL LINES
  910.   @MEMMEMO                     !PRINT ANY MEMO FIELD
  911.   @TOTALS                     !ACCUMULATE TOTALS
  912.   @MEMMEMO                     !PRINT ANY MEMO FIELD
  913.   @PAGEFOOTER                     !DO PAGE FOOTER COMPUTES
  914.   @RPTFOOTER                     !DO REPORT FOOTER COMPUTES
  915.   PRINT(RPT:RPT_FOOT)                 !PRINT REPORT FOOTER
  916.   @MEMMEMO                     !PRINT ANY MEMO FIELD
  917.   CLOSE(REPORT)                     !CLOSE REPORT
  918.   RETURN                     !RETURN TO CALLER
  919.  
  920. *PRINTMEMO**********************************************************************
  921.     @MEMOLEN                     !DETERMINE MEMO SIZE
  922.     J# = 2                     !START WITH SECOND ROW
  923.     LOOP                     !LOOP THRU ALL USED ROWS
  924.       MEMODONE# = 0                 !  NO MEMOS DONE YET
  925.       @SETMEMO                     !  SET THE MEMO VARIABLES
  926.       IF MEMODONE# = 0                 !  ALL MEMOS PRINTED
  927.     DO CHECK_PAGE                 !  DO PAGE BREAK IF NEEDED
  928.     BREAK                     !  EXIT MEMO PRINT LOOP
  929.       .                         !
  930.       @PRTDETAIL                 !  AND PRINT IT
  931.       J# += 1                     !  INCREMENT COUNTER
  932.       DO CHECK_PAGE                 !  DO PAGE BREAK IF NEEDED
  933.     .
  934. *SETMEMO************************************************************************
  935.       IF J# <= @MEMOTMP#             !IF IN THE RANGE OF THIS MEMO
  936.     @MEMOVAR = @MEMOROW[J#]             !  MOVE A MEMO FIELD ROW
  937.     MEMODONE# = 1                 !  MEMO HAS BEEN MOVED
  938.       ELSE                     !OTHERWISE
  939.     @MEMOVAR = ''                 !  NO MEMO TO DO
  940.       .                         ! END OF SETMEMO
  941. *MEMOLEN************************************************************************
  942.     LOOP @MEMOTMP# = @MEMOSIZE TO 2 BY -1     !BACKSCAN THE MEMO FIELD TO
  943.       IF @MEMOROW[@MEMOTMP#] <> '' THEN BREAK.     ! FIND NUMBER OF ROWS USED
  944.     .                         ! END OF MEMOLEN
  945. *PRTDETAIL**********************************************************************
  946.       PRINT(@MEMDETAIL)                 !PRINT THE DETAIL RECORD
  947. *MEMMEMO************************************************************************
  948.   @MEMOLEN                     !DETERMINE MEMO SIZE
  949.   J# = 2                     !START WITH ROW 2
  950.   LOOP                         !LOOP THRU ALL USED ROWS
  951.     MEMODONE# = 0                 !  NO MEMOS DONE YET
  952.     @SETMEMO                     !  SET THE MEMO VARIABLES
  953.     IF MEMODONE# = 0 THEN BREAK.         !  ALL MEMOS PRINTED
  954.     @PRTDETAIL                     !  AND PRINT IT
  955.     J# += 1                     !  INCREMENT COUNTER
  956.   .
  957. *ALERT**************************************************************************
  958.     ALERT(@HOTKEY)                 !ALERT HOT KEY
  959. *TODO***************************************************************************
  960. @PROCNAME    PROCEDURE                 !THIS PROCEDURE IS NOT DEFINED
  961.  
  962.   CODE                         !
  963.   RETURN                     !RETURN TO CALLER
  964. *SHOWMEMO***********************************************************************
  965.     R# = ROW(@SCRMEMO)                 !SAVE ROW OF MEMO
  966.     C# = COL(@SCRMEMO)                 !SAVE COL OF MEMO
  967.     SETHUE(FOREHUE(R#,C#),BACKHUE(R#,C#))     !RETRIEVE COLOR OF MEMO
  968.     LOOP I# = 1 TO @MEMOROWS             !DISPLAY MEMO FIELD BY ROWS
  969.       SHOW(R#+I#-1,C#,@MEMOROW[I#],@S@MEMOCOLS)     !SHOW NEXT ROW
  970.     .
  971.     SETHUE                     !TURN OFF COLOR
  972. *INRANGE************************************************************************
  973.     IF ~INRANGE(@FIELD,@LOWER,@UPPER)     !IF FIELD IS OUT OF RANGE
  974.       BEEP                     !  SOUND KEYBOARD ALARM
  975.       SELECT(?@FIELD)             !  AND STAY ON THIS FIELD
  976.       BREAK                     !
  977.     .
  978. *REQUIRED***********************************************************************
  979.     IF @FIELD = ''                 !IF REQUIRED FIELD IS EMPTY
  980.       BEEP                     !  SOUND KEYBOARD ALARM
  981.       SELECT(?@FIELD)             !  AND STAY ON THIS FIELD
  982.       BREAK                     !
  983.     .
  984. *NOTREQUIRED********************************************************************
  985.     IF @FIELD = ''                 !IF NOT REQUIRED THEN
  986.       @EDITPROC                 !  CALL THE EDIT PROCEDURE
  987.       CYCLE                     !  END THE EDIT
  988.     .
  989. *UNIQUEKEY**********************************************************************
  990.     GET(@FILENAME,@ACCESSKEY)         !READ THE RECORD BY KEY
  991.     IF NOT ERROR()                 !IF A RECORD IS FOUND
  992.       IF POINTER(@FILENAME) <> POINTER#     !  BUT NOT THE SAME RECORD
  993.         CLEAR(@PRE:RECORD)             !    CLEAR IN CASE OF ADD
  994.         GET(@FILENAME,POINTER#)         !    RE-READ THE OLD RECORD
  995.         UPDATE                 !    RE-UPDATE THE RECORD
  996.         MEM:MESSAGE = 'CREATES DUPLICATE KEY'!    MOVE AN ERROR MESSAGE
  997.         SELECT(?@FIELD)             !    STAY ON THE SAME FIELD
  998.         BEEP                 !    SOUND THE KEYBOARD ALARM
  999.         BREAK                 !    AND LOOP AGAIN
  1000.     . .
  1001.     GET(@FILENAME,POINTER#)             !  RE-READ THE OLD RECORD
  1002.     UPDATE                     !  AND RE-UPDATE THE RECORD
  1003. *SETTOP*************************************************************************
  1004.   SET(@KEYNAME)                     !SET TO FIRST RECORD
  1005. *SETSELECT**********************************************************************
  1006.   SET(@KEYNAME,@KEYNAME)             !SET TO FIRST SELECTED RECORD
  1007. *INITLOCATE*********************************************************************
  1008.     OF ?PRE_POINT                 !
  1009.       IF KEYCODE() = ESC_KEY OR |         !  IF GOING UP
  1010.       KEYCODE() = UP_KEY OR |             !    THE SCREEN
  1011.       RECORDS# = FALSE                 !    OR NO RECORDS ON SCREEN
  1012.     SCR:LOCATOR = ''             !    CLEAR LOCATOR
  1013.     SELECT(?-1)                 !    AND GO TO PREVIOUS FIELD
  1014.     SETCURSOR                 !    AND TURN CURSOR OFF
  1015.       ELSE                     !  OTHERWISE, GOING DOWN
  1016.     LEN# = 0                 !    RESET TO START OF LOCATOR
  1017.     SETCURSOR(ROW(SCR:LOCATOR),COL(SCR:LOCATOR)) !AND TURN CURSOR ON
  1018.       .
  1019. *PREPOINT***********************************************************************
  1020.               ENTRY,USE(?PRE_POINT)
  1021. *LOCATE*************************************************************************
  1022.       IF KEYCODE() > 31               |     !THE DISPLAYABLE CHARACTERS
  1023.       AND KEYCODE() < 255             !ARE USED TO LOCATE RECORDS
  1024.     IF LEN# < SIZE(SCR:LOCATOR)         !  IF THERE IS ROOM LEFT
  1025.       SCR:LOCATOR = SUB(SCR:LOCATOR,1,LEN#) & CHR(KEYCODE())
  1026.       LEN# += 1                 !    INCREMENT THE LENGTH
  1027.     .
  1028.       ELSIF KEYCODE() = BS_KEY             !BACKSPACE UNTYPES A CHARACTER
  1029.     IF LEN# > 0                 !  IF THERE ARE CHARACTERS LEFT
  1030.       LEN# -= 1                 !    DECREMENT THE LENGTH
  1031.       SCR:LOCATOR = SUB(SCR:LOCATOR,1,LEN#)     !    ERASE THE LAST CHARACTER
  1032.     .
  1033.       ELSE                     !FOR ANY OTHER CHARACTER
  1034.     LEN# = 0                 !  ZERO THE LENGTH
  1035.     SCR:LOCATOR = ''             !  ERASE THE LOCATOR FIELD
  1036.       .
  1037.       SETCURSOR(ROW(SCR:LOCATOR),COL(SCR:LOCATOR)+LEN#) !AND RESET THE CURSOR
  1038.       @SETLOCATE
  1039.       IF KEYBOARD() > 31           |     !THE DISPLAYABLE CHARACTERS
  1040.       AND KEYBOARD() < 255           |     !ARE USED TO LOCATE RECORDS
  1041.       OR  KEYBOARD() = BS_KEY             !INCLUDE BACKSPACE
  1042.     CYCLE
  1043.       .
  1044.       IF LEN# > 0 THEN DO FIND_RECORD.         !    AND FIND THE RECORD
  1045. *STRLOCATE**********************************************************************
  1046.       @LOCFIELD = CLIP(SCR:LOCATOR)         !    UPDATE THE KEY FIELD
  1047. *PICLOCATE**********************************************************************
  1048.       @LOCFIELD = DEFORMAT(SCR:LOCATOR)         !    UPDATE THE KEY FIELD
  1049. *SELECTOR***********************************************************************
  1050.       SET(@KEYNAME,@KEYNAME)             !SET AT FIRST SELECTED RECORD
  1051.       LOOP UNTIL EOF(@FILENAME)             !LOOP UNTIL END OF FILE
  1052.     NEXT(@FILENAME)                 !  READ A RECORD
  1053.     @CHECKSELECT                 !  CHECK THAT IT IS SELECTED
  1054.     DO ADD_TABLE                 !  AND ADD TO MEMORY TABLE
  1055.       .
  1056. *FILTER*************************************************************************
  1057.       BUFFER(@FILENAME,.25)             !USE 1/4TH OF MEMORY FOR BUFFER
  1058.       SET(@FILENAME)                 !READ DATA RECORD SEQUENCE
  1059.       LOOP UNTIL EOF(@FILENAME)             !LOOP UNTIL END OF FILE
  1060.     NEXT(@FILENAME)                 !  READ A RECORD
  1061.     DO ADD_TABLE                 !  ADD IT TO MEMORY TABLE
  1062.       .
  1063.       FREE(@FILENAME)                 !FREE MEMORY USED FOR BUFFERING
  1064.       DO SORT_TABLE                 !SORT TABLE INTO KEY SEQUENCE
  1065.       PTR = 1                     !DISPLAY FROM TOP OF TANLE
  1066. *VALIDATE***********************************************************************
  1067.     @ACCESSFIELD = @FIELD             !MOVE RELATED FIELDS
  1068.     GET(@FILENAME,@ACCESSKEY)         !READ THE RECORD
  1069.     IF ERROR()                 !IF NO RECORD IS FOUND
  1070.       MEM:MESSAGE = 'RECORD NOT FOUND'     !  MOVE AN ERROR MESSAGE
  1071.       BEEP                     !  SOUND THE KEYBOARD ALARM
  1072.       SELECT(?@FIELD)             !  AND STAY ON THE SAME FIELD
  1073.     .
  1074. *ENTERTABLE*********************************************************************
  1075.     @ACCESSFIELD = @FIELD             !MOVE RELATED FIELDS
  1076.     GET(@FILENAME,@ACCESSKEY)         !READ THE RECORD
  1077.     IF ERROR()                 !IF NO RECORD IS FOUND
  1078.       ACTION# = ACTION             !  SAVE ACTION
  1079.       ACTION = 4                 !  REQUEST TABLE LOOKUP
  1080.       @LOOKUP                 !  CALL LOOKUP PROCEDURE
  1081.       IF ACTION                 !  NO SELECTION WAS MADE
  1082.         SELECT(?@FIELD)             !    STAY ON FIELD
  1083.         ACTION = ACTION#             !    RESTORE ACTION
  1084.         CYCLE                 !    GO TO TOP OF LOOP
  1085.       .
  1086.       @FIELD = @ACCESSFIELD             !  MOVE LOOKUP FIELD
  1087.       DISPLAY(?@FIELD)             !  AND DISPLAY IT
  1088.       ACTION = ACTION#             !  RESTORE ACTION
  1089.     .
  1090. *AUTOTABLE**********************************************************************
  1091.     @ACCESSFIELD = @FIELD             !MOVE RELATED FIELDS
  1092.     GET(@FILENAME,@ACCESSKEY)         !READ THE RECORD
  1093.     ACTION# = ACTION             !SAVE ACTION
  1094.     ACTION = 4                 !REQUEST TABLE LOOKUP
  1095.     @LOOKUP                     !CALL LOOKUP PROCEDURE
  1096.     IF ACTION                 !NO SELECTION WAS MADE
  1097.       SELECT(?@FIELD-1)             ! BACK UP ONE FIELD
  1098.       ACTION = ACTION#             ! RESTORE ACTION
  1099.       CYCLE                     ! GO TO TOP OF LOOP
  1100.     .
  1101.     @LOOKFIELD = @ACCESSFIELD         !SAVE LOOKUP FIELD
  1102.     @FIELD = @ACCESSFIELD             !MOVE LOOKUP FIELD
  1103.     DISPLAY(?@FIELD)             !AND DISPLAY IT
  1104.     ACTION = ACTION#             !RESTORE ACTION
  1105. *HOTTABLE***********************************************************************
  1106.     IF KEYCODE() = @HOTKEY             !IF HOT KEY PRESSED
  1107.       UPDATE                 !  UPDATE ALL FIELDS
  1108.       @ACCESSFIELD = @FIELD             !  MOVE RELATED FIELDS
  1109.       GET(@FILENAME,@ACCESSKEY)         !  READ THE RECORD
  1110.       ACTION# = ACTION             !  SAVE ACTION
  1111.       ACTION = 4                 !  REQUEST TABLE LOOKUP
  1112.       @LOOKUP                 !  CALL LOOKUP PROCEDURE
  1113.       IF ACTION                 !  NO SELECTION WAS MADE
  1114.         SELECT(?@FIELD)             !   BACK UP ONE FIELD
  1115.         ACTION = ACTION#             !   RESTORE ACTION
  1116.         CYCLE                 !   GO TO TOP OF LOOP
  1117.       .
  1118.       @FIELD = @ACCESSFIELD             !  MOVE LOOKUP FIELD
  1119.       DISPLAY(?@FIELD)             !  AND DISPLAY IT
  1120.       ACTION = ACTION#             !  RESTORE ACTION
  1121.     .
  1122. *NEXTFORM***********************************************************************
  1123.     IF ACTION <> 3                 !IF THIS IS NOT A DELETE
  1124.       ACTION = 2                 !  SET ACTION TO CHANGE MODE
  1125.       @NEXTPAGE                 !  CALL NEXT FORM PROCEDURE
  1126.       IF ACTION                 !  IF RECORD WAS NOT CHANGED
  1127.         SELECT(?LAST_FIELD - 1)         !    SELECT THE LAST ENTRY
  1128.         BREAK                 !    AND LOOP AGAIN
  1129.     . .
  1130. *PAUSE**************************************************************************
  1131.       OF ?PAUSE_FIELD                 !ON PAUSE FIELD
  1132.     IF KEYCODE() <> ENTER_KEY  |         !IF NOT ENTER KEY
  1133.     AND KEYCODE() <> ACCEPT_KEY         !AND NOT CTRL-ENTER KEY
  1134.       BEEP                     !  SOUND KEYBOARD ALARM
  1135.       SELECT(?PAUSE_FIELD)             !  AND STAY ON PAUSE FIELD
  1136.     .
  1137. *LOOKUPS************************************************************************
  1138.     UPDATE                     !UPDATE RECORD KEYS
  1139.     @ACCESSFIELD = @FIELD             !MOVE RELATED KEY FIELDS
  1140.     GET(@FILENAME,@ACCESSKEY)             !READ THE RECORD
  1141.     IF ERROR() THEN CLEAR(@PRE:RECORD).         !IF NOT FOUND, CLEAR RECORD
  1142.     @SCRFIELD = @LOOKUPFIELD             !DISPLAY LOOKUP FIELD
  1143. *LOOKUPSCROLL*******************************************************************
  1144.     @ACCESSFIELD = @FIELD             !MOVE RELATED KEY FIELDS
  1145.     GET(@FILENAME,@ACCESSKEY)             !READ THE RECORD
  1146.     IF ERROR() THEN CLEAR(@PRE:RECORD).         !IF NOT FOUND, CLEAR RECORD
  1147.     @SCRFIELD = @LOOKUPFIELD             !DISPLAY LOOKUP FIELD
  1148. *OPENFILES**********************************************************************
  1149.   SHOW(25,1,CENTER('OPENING FILE: ' & '@FILENAME',80)) !DISPLAY FILE NAME
  1150.   OPEN(@FILENAME)                 !OPEN THE FILE
  1151.   IF ERROR()                     !OPEN RETURNED AN ERROR
  1152.     CASE ERRORCODE()                 ! CHECK FOR SPECIFIC ERROR
  1153.     OF 46                     !  KEYS NEED TO BE REQUILT
  1154.       SETHUE(0,7)                 !  BLACK ON WHITE
  1155.       SHOW(25,1,CENTER('REBUILDING KEY FILES FOR @FILENAME',80)) !INDICATE MSG
  1156.       BUILD(@FILENAME)                 !  CALL THE BUILD PROCEDURE
  1157.       SETHUE(7,0)                 !  WHITE ON BLACK
  1158.       BLANK(25,1,1,80)                 !  BLANK THE MESSAGE
  1159.     @CREATEFILE                     !  IF NOT FOUND, THEN CREATE
  1160.     ELSE                     ! ANY OTHER ERROR
  1161.       LOOP;STOP('@FILENAME: ' & ERROR()).     !  STOP EXECUTION
  1162.   . .
  1163.  
  1164. *CREATEFILE*********************************************************************
  1165.     OF 2                     !IF NOT FOUND,
  1166.       CREATE(@FILENAME)                 ! CREATE
  1167. *SAVEITEMS**********************************************************************
  1168.          GROUP,PRE(SAV)
  1169.            @BREAKFIELDS
  1170.            @SELECTFIELDS
  1171.          .
  1172. *SAVETOTALS*********************************************************************
  1173. TOT_GROUP    GROUP,PRE(TOT)             !TABLE TOTAL FIELDS
  1174.            @TOTALFIELDS
  1175.          .
  1176. *TOTALCALC**********************************************************************
  1177.   BUFFER(@FILENAME,.25)                 !USE 1/4TH OF MEMORY FOR BUFFER
  1178.   @TOTCLEAR                     !ZERO TOTALS
  1179.   SET(@FILENAME)                 !READ DATA RECORD SEQUENCE
  1180.   SETHUE(BACKHUE(ROW,COL),BACKHUE(ROW,COL))     !TURN OFF DISPAY
  1181.   LOOP UNTIL EOF(@FILENAME)             !LOOP UNTIL END OF FILE
  1182.     NEXT(@FILENAME)                 !  READ A RECORD
  1183.     DO SHOW_RECORD                 !  DO COMPUTEDS, CONDS, & LKUPS
  1184.     @TOTPLUS                     !  ADD IT TO TOTAL AMOUNT
  1185.   .
  1186.   SETHUE()                     !TURN OFF SETHUE
  1187.   FREE(@FILENAME)                 !FREE MEMORY USED FOR BUFFERING
  1188. *DOTOTALS***********************************************************************
  1189.       IF ACTN# THEN DO COMP_TOTALS.         !CALCULATE TABLE TOTALS
  1190. *COMPUTETOTS********************************************************************
  1191. COMP_TOTALS  ROUTINE                 !CALCULATE TOTAL FIELDS
  1192.   CASE ACTN#                     !CHECK FOR ADD,REV,DEL
  1193.   OF INS_KEY                     !ADD NEW AMOUNT TO TOTAL
  1194.     @TOTPLUS
  1195.   OF ENTER_KEY                     !REVISE TOTAL AMOUNT
  1196.     @TOTCHANGE
  1197.   .
  1198.   ACTN# = ''
  1199. *TOTCHECK***********************************************************************
  1200.       ACTN# = KEYCODE()             !SAVE ACTION FOR COMP_TOTALS
  1201.       @TOTSAVE
  1202. *TOTCLEAR***********************************************************************
  1203.   CLEAR(TOT_GROUP)                 !ZERO TOTALS
  1204.   @TOTCLEARIMPL                     !ZERO AVERAGE CALC IMPLICITS
  1205. *TOTESC*************************************************************************
  1206.         ACTN# = ''                 !RESET ACTN
  1207. *INITBREAK**********************************************************************
  1208.   @SAVEFIELD = @FIELD                 !SAVE BREAK FIELD
  1209. *INITSELECTS********************************************************************
  1210.     @SAVEFIELD = @FIELD                 !SAVE SELECTOR FIELD
  1211. *RESTSELECTS********************************************************************
  1212.     @FIELD = @SAVEFIELD                 !RESTORE SELECTOR FIELD
  1213. *SORTTABLE**********************************************************************
  1214.   SORT(TABLE,@COMPONENT)             !SORT TABLE INTO KEY SEQUENCE
  1215. *CHECKSELECT********************************************************************
  1216.     IF @FIELD <> @SAVEFIELD THEN BREAK.     !BREAK ON END OF SELECTION
  1217. *CHECKADD***********************************************************************
  1218.   IF @FIELD <> @SAVEFIELD THEN EXIT.         !EXIT ON END OF SELECTION
  1219. *CHECKHOT***********************************************************************
  1220.       IF KEYCODE() = @HOTKEY             !ON HOT KEY
  1221.     @HOTPROC                 !  CALL HOT KEY PROCEDURE
  1222.     SELECT(?)                 !  DO SAME FIELD AGAIN
  1223.     CYCLE                     !  AND LOOP AGAIN
  1224.       .
  1225. *TABLEHOT***********************************************************************
  1226.       IF KEYCODE() = @HOTKEY             !ON HOT KEY
  1227.     IF FIELD() = ?POINT THEN DO GET_RECORD.     !  READ RECORD IF NEEDED
  1228.     @HOTPROC                 !  CALL HOT KEY PROCEDURE
  1229.     DO SAME_PAGE                 !  RESET TO SAME PAGE
  1230.     DO SHOW_TABLE                 !  DISPLAY A PAGE OF RECORDS
  1231.     CYCLE                     !  AND LOOP AGAIN
  1232.       .
  1233. *BUILDTABLE*********************************************************************
  1234.   PTR = 1                     !START AT TABLE ENTRY
  1235.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  1236.   DO BUILD_TABLE                 !BUILD MEMORY TABLE OK KEYS
  1237. *AUTONUMKEY*********************************************************************
  1238.       DO GET_RECORD                 !READ CURRENT SCREEN RECORD
  1239.       SAVPTR# = POINTER(@FILENAME)         ! AND SAVE POSITION
  1240.       SET(@KEYNAME)                 !SET TO HIGHEST KEY VALUE
  1241.       PREVIOUS(@FILENAME)             !READ LAST KEY RECORD
  1242.       KEYFIELD# = @INCFIELD + 1         !INCREMENT FIELD
  1243.       CLEAR(@PRE:RECORD)             !CLEAR LAST KEY RECORD
  1244.       @INCFIELD = KEYFIELD#             !LOAD KEY FIELD
  1245. *AUTONUMESC*********************************************************************
  1246.       IF ACTION                 !FORM WAS NOT COMPLETED
  1247.         @TOTESC                 !CLEAR TOTAL FIELD CALCULATIONS
  1248.         POINTER# = SAVPTR#             !SET POINTER TO PROPER REC
  1249.         GET(@FILENAME,POINTER#)         !READ RECORD
  1250.         SET(@KEYNAME,@KEYNAME)         !POSITION FILE
  1251.         SKIP(@FILENAME,-1)             !BACK UP ONE
  1252.         DO SHOW_TABLE             !RE-DISPLAY PAGE
  1253.       .
  1254. *AUTONUMSEL*********************************************************************
  1255.       GET(TABLE,RECORDS(TABLE))         !READ HIGHEST KEY VALUE
  1256.       IF ERROR() THEN CLEAR(TABLE).         !ZERO FIELDS IF EMPTY TABLE
  1257.       @RESTSELECTS                 !LOAD PRIOR KEY FIELDS
  1258.       @INCFIELD = @TABLEFIELD + 1         !LOAD INCREMENT FIELD
  1259. *CONDITIONAL********************************************************************
  1260.       IF @IFCOND                 !EVALUATE CONDITION
  1261.     @IFCONDTRUE                 !  CONDITION IS TRUE
  1262.       ELSE                     !OTHERWISE
  1263.     @IFCONDFALSE                 !  CONDITION IS FALSE
  1264.       .
  1265. *RUNMAP*************************************************************************
  1266.            PROC(G_RUNPROC)             !GLOBAL MODULE RUN PROCEDURE
  1267. *RUNPROC************************************************************************
  1268. G_RUNPROC    PROCEDURE(DOSPROG)             !GLOBAL RUN PROCEDURE
  1269. DOSPROG         STRING(12)                 !PROGRAM TO RUN
  1270. SCREEN         SCREEN    WINDOW(25,80),HUE(7,0,0). !SAVE WINDOW
  1271.  
  1272.   CODE
  1273.   OPEN(SCREEN)                     !SAVE CURRENT SCREEN
  1274.   SETCURSOR(25,1)                 !POSITION CURSOR AT BOTTOM
  1275.   RUN(DOSPROG)                     !RUN DOS PROGRAM
  1276.   CLOSE(SCREEN)                     !RESTORE SCREEN
  1277.   RETURN                     !EXIT BACK TO CALLING MENU
  1278. *RUNCODE************************************************************************
  1279.       G_RUNPROC('@RUNDESC')             !RUN DOS PROGRAM
  1280. *FIRSTBREAK*********************************************************************
  1281.   BRK_FLAG# = 0                     !CLEAR BREAK LEVEL FLAG
  1282.   DO PRT_BRK_HDRS                 !PRINT GROUP HEADER(S)
  1283. *CHECKBREAK*********************************************************************
  1284.     DO CHECK_BREAK                 !  CHECK FOR GROUP BREAK
  1285. *LASTBREAK**********************************************************************
  1286.   BRK_FLAG# = 0                     !CLEAR BREAK LEVEL FLAG
  1287.   DO PRT_BRK_FTRS                 !PRINT GROUP FOOTER(S)
  1288. *BREAKRTN***********************************************************************
  1289. CHECK_BREAK  ROUTINE                 !CHECK FOR GROUP BREAK
  1290.   @COMPAREBREAK                     !GENERATE IF STATEMENTS
  1291.  
  1292. PRT_BRK_HDRS ROUTINE                 !DO GROUP HEADERS
  1293.   @BREAKHEADER                     !PRINT HEADERS
  1294.   @INITBREAK                     !INITIALIZE BREAK FIELDS
  1295.  
  1296. PRT_BRK_FTRS ROUTINE                 !DO GROUP FOOTERS
  1297.   GET(@FILENAME,LAST_REC#)             !REREAD PREVIOUS RECORD
  1298.   @BREAKFOOTER                     !PRINT FOOTERS
  1299.   SKIP(@FILENAME,-1)                 !BACKUP ONE RECORD
  1300.   NEXT(@FILENAME)                 !AND REREAD IT
  1301. *COMPAREBREAK*******************************************************************
  1302.   IF @FIELD <> @SAVEFIELD             !BREAK ON NEW GROUP
  1303.     BRK_FLAG# = @BRKNUM                 !SET BREAK LEVEL
  1304.     DO PRT_BRK_FTRS                 !PRINT FOOTERS FOR THIS LEVEL
  1305.     DO PRT_BRK_HDRS                 !PRINT HEADERS FOR THIS LEVEL
  1306.     EXIT                     !RETURN TO REPORT
  1307.   .
  1308. *BREAKHEADER********************************************************************
  1309.   IF BRK_FLAG# <= @BRKNUM             !CHECK BREAK LEVEL
  1310.     @INITGROUP                     ! INIT GROUP VARIABLES
  1311.     @GRPHEADER                     ! DO HEADER COMPUTES
  1312.     PRINT(GRP_HEAD@BRKNUM)             ! PRINT GROUP HEADER
  1313.     @PRINTMEMO                     ! PRINT ANY MEMO FIELD
  1314.     DO CHECK_PAGE                 ! DO PAGE BREAK IF NEEDED
  1315.   .
  1316. *BREAKFOOTER********************************************************************
  1317.   IF BRK_FLAG# <= @BRKNUM             !CHECK BREAK LEVEL
  1318.     @GRPFOOTER                     ! DO FOOTER COMPUTES
  1319.     PRINT(GRP_FOOT@BRKNUM)             ! PRINT GROUP FOOTER
  1320.     @PRINTMEMO                     ! PRINT ANY MEMO FIELD
  1321.     DO CHECK_PAGE                 ! DO PAGE BREAK IF NEEDED
  1322.     @PAGEEJECT                     ! GO TO NEW PAGE
  1323.   .
  1324. *PAGEEJECT**********************************************************************
  1325.     MEM:LINE = 0                 !  SET FOR CALL TO CHECK_PAGE
  1326.     DO CHECK_PAGE                 !  INITIALIZE PAGE VARIABLES
  1327.     PRINT(PAGE_FOOT)                 !  PRINT PAGE FOOTER
  1328.     PRINT(PAGE_HEAD)                 !  PRINT PAGE HEADER
  1329. ********************************************************************************
  1330.