home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / nrlpull.zip / NRLSYS.MDL < prev    next >
Text File  |  1989-04-17  |  55KB  |  1,057 lines

  1. *GLOBAL*************************************************************************
  2.           INCLUDE('\CLARION\STD_KEYS.CLA')
  3.           INCLUDE('\CLARION\CTL_KEYS.CLA')
  4.           INCLUDE('\CLARION\ALT_KEYS.CLA')
  5.           INCLUDE('\CLARION\SHF_KEYS.CLA')
  6.  
  7. REJECT_KEY   EQUATE(CTRL_ESC)
  8. ACCEPT_KEY   EQUATE(CTRL_ENTER)
  9. TRUE      EQUATE(1)
  10. FALSE          EQUATE(0)
  11.  
  12.           MAP
  13.             @MODULES
  14.           .
  15.           EJECT('FILE LAYOUTS')
  16.           @FILE
  17.           EJECT('GLOBAL MEMORY VARIABLES')
  18. ACTION         SHORT                     !0 = NO ACTION
  19.  
  20.                                !1 = ADD RECORD
  21.                                !2 = CHANGE RECORD
  22.                                !3 = DELETE RECORD
  23.                                !4 = LOOKUP FIELD
  24.           @MEMORY
  25.  
  26.           EJECT('CODE SECTION')
  27.   CODE
  28.   SETHUE(7,0)                       !SET WHITE ON BLACK
  29.   BLANK                             !  AND BLANK
  30.   SETHUE()                          !    THE SCREEN
  31.   HELP(@HELPFILE)                   !OPEN THE HELP FILE
  32.   @OPENFILES                        !OPEN OR CREATE FILES
  33.   @BASEPROC                         !CALL THE BASE PROCEDURE
  34.   RETURN                       !EXIT TO DOS
  35. *MENU***************************************************************************
  36. @PROCNAME    PROCEDURE
  37.  
  38. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  39.                  @PAINTS
  40.                  @STRINGS
  41.                  @VARIABLES
  42.                  ENTRY,USE(?FIRST_FIELD)
  43.                  @FIELDS
  44.                  MENU,USE(MENU_FIELD),REQ
  45.                    @CHOICES
  46.           .           .
  47. MENU_FIELD     STRING(80)
  48.   EJECT
  49.   CODE
  50.   OPEN(SCREEN)                      !OPEN THE MENU SCREEN
  51.   SETCURSOR                         !TURN OFF ANY CURSOR
  52.   @SETUP                       !CALL SETUP PROCEDURE
  53.   LOOP                              !LOOP UNTIL USER EXITS
  54.     @LOOKUPS                        !DISPLAY FROM OTHER FILES
  55.     @SHOW                      !DISPLAY STRING VARIABLES
  56.     @COMPUTE                        !DISPLAY COMPUTED FIELDS
  57.     @RESULT                         !MOVE RESULTING VALUES
  58.     ALERT                      !TURN OFF ALL ALERTED KEYS
  59.     ALERT(REJECT_KEY)                    !ALERT SCREEN REJECT KEY
  60.     ALERT(ACCEPT_KEY)                    !ALERT SCREEN ACCEPT KEY
  61.     @ALERT                          !ALERT HOT KEYS
  62.     ACCEPT                          !READ A FIELD OR MENU CHOICE
  63.     @CHECKHOT                       !ON HOT KEY, CALL PROCEDURE
  64.     IF KEYCODE() = REJECT_KEY THEN RETURN.    !RETURN ON SCREEN REJECT
  65.  
  66.     EDIT_RANGE# = FIELD()                !SET ONE FIELD EDIT RANGE
  67.     IF KEYCODE() = ACCEPT_KEY            !ON SCREEN ACCEPT KEY
  68.       UPDATE                        !  MOVE ALL FIELDS FROM SCREEN
  69.       EDIT_RANGE# = ?MENU_FIELD - 1           !  AND EDIT REMAINING FIELDS
  70.       SELECT(?MENU_FIELD)                !  IF OK THEN START HERE NEXT
  71.     .                               !
  72.  
  73.     LOOP FIELD# = FIELD() TO EDIT_RANGE#      !EDIT FIELDS IN THE EDIT RANGE
  74.  
  75.       CASE FIELD#                   !JUMP TO FIELD EDIT ROUTINE
  76.       OF ?FIRST_FIELD                    !FROM THE FIRST FIELD
  77.      IF KEYCODE() = ESC_KEY THEN RETURN.      !  RETURN ON ESC KEY
  78.  
  79.       @EDITS                        !EDIT ROUTINES GO HERE
  80.       OF ?MENU_FIELD                     !FROM THE MENU FIELD
  81.      EXECUTE CHOICE()               !  CALL THE SELECTED PROCEDURE
  82.        @MENU                        !
  83.   . . . .
  84. *TABLE**************************************************************************
  85. @PROCNAME    PROCEDURE
  86.  
  87. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  88.                  @PAINTS
  89.                  @STRINGS
  90.                  @VARIABLES
  91.                  ENTRY,USE(?FIRST_FIELD)
  92.                  @FIELDS
  93.                  @PREPOINT
  94.                  REPEAT(@COUNT),EVERY(@PROWS),INDEX(NDX)
  95.            @PLOC        POINT(@PROWS,@COLS),USE(?POINT),ESC(?-1)
  96.                    @SCROLLVARIABLES
  97.           .           .
  98.  
  99. NDX       BYTE                 !REPEAT INDEX FOR POINT FIELD
  100. ROW       BYTE                 !ACTUAL ROW OF SCROLL AREA
  101. COL       BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  102. MAX       LONG                 !LESSER OF COUNT AND RECORDS
  103. COUNT          BYTE(@COUNT)              !NUMBER OF ITEMS TO SCROLL
  104. ROWS      BYTE(@ROWS)               !NUMBER OF ROWS TO SCROLL
  105. COLS      BYTE(@COLS)               !NUMBER OF COLUMNS TO SCROLL
  106.  
  107.   EJECT
  108.   CODE
  109.   ACTION# = ACTION                  !SAVE ACTION
  110.   OPEN(SCREEN)                      !OPEN THE SCREEN
  111.   SETCURSOR                         !TURN OFF ANY CURSOR
  112.   @SETUP                       !CALL SETUP PROCEDURE
  113.   NDX = 1                      !PUT SELECTOR BAR ON TOP ITEM
  114.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  115.   COL = COL(?POINT)                 !  LEFT COLUMN OF SCROLL AREA
  116.   IF ACTION = 4                          !IF THIS IS A LOOKUP REQUEST
  117.     SET(@KEYNAME,@KEYNAME)               !  FIND IT IN THE FILE
  118.     NEXT(@FILENAME)                 !    AND READ IT
  119.     POINTER# = POINTER(@FILENAME)        !  SAVE POINTER TO CURRENT
  120.     SKIP(@FILENAME,-1)                   !  MAKE IT THE TOP RECORD
  121.     DO SHOW_TABLE                   !  FILL SCROLL AREA
  122.     GET(@FILENAME,POINTER#)              !  AND REFRESH CURRENT RECORD
  123.   ELSE                              !OTHERWISE
  124.     SET(@KEYNAME)                   !  SET TO FIRST RECORD IN FILE
  125.     DO SHOW_TABLE                   !  FILL SCROLL AREA
  126.   .
  127.   RECORDS# = TRUE                   !INITIALIZE RECORDS FLAG
  128.   LOOP                              !LOOP UNTIL USER EXITS
  129.     MAX = RECORDS(@KEYNAME)              !SET LESSER OF FILE RECORD
  130.     IF MAX > COUNT THEN MAX = COUNT.          !  COUNT AND SCROLL ITEM COUNT
  131.     ACTION = ACTION#                     !RESTORE ACTION
  132.     POINTER# = 0                    !CLEAR ADD POINTER
  133.     @LOOKUPS                        !DISPLAY FROM OTHER FILES
  134.     @SHOW                      !DISPLAY STRING VARIABLES
  135.     @COMPUTE                        !DISPLAY COMPUTED FIELDS
  136.     @RESULT                         !MOVE RESULTING VALUES
  137.     IF ~RECORDS(@KEYNAME)                !IF THERE ARE NO RECORDS
  138.       CLEAR(@PRE:RECORD)            !  CLEAR RECORD AREA
  139.       ACTION = 1                    !  SET ACTION TO ADD
  140.       @UPDATE                       !  CALL FORM FOR FIRST RECORD
  141.       IF ~RECORDS(@KEYNAME) THEN BREAK.       !  IF ADD ABORTED THEN EXIT
  142.       SET(@KEYNAME)                 !  SET TO NEW RECORD
  143.       DO SHOW_TABLE                 !  FILL SCROLL AREA
  144.       NDX = 1                       !  PUT SELECTOR BAR ON TOP ITEM
  145.       MAX = 1                       !  MAXIMUM DISPLAYED IS 1
  146.     .                               !
  147.     ALERT                      !RESET ALERTED KEYS
  148.     ALERT(REJECT_KEY)                    !ALERT SCREEN REJECT KEY
  149.     ALERT(ACCEPT_KEY)                    !ALERT SCREEN ACCEPT KEY
  150.     @ALERT                          !ALERT HOT KEY
  151.     ACCEPT                          !READ A FIELD
  152.     @TABLEHOT                       !ON HOT KEY, CALL PROCEDURE
  153.     IF KEYCODE() = REJECT_KEY THEN BREAK.     !RETURN ON SCREEN REJECT KEY
  154.  
  155.     EDIT_RANGE# = FIELD()                !SET ONE FIELD EDIT RANGE
  156.     IF KEYCODE() = ACCEPT_KEY AND |           !ON SCREEN ACCEPT KEY
  157.        EDIT_RANGE# <> ?POINT             ! AND NOT ON THE POINT FIELD
  158.       UPDATE                        !  MOVE ALL FIELDS FROM SCREEN
  159.       EDIT_RANGE# = ?POINT - 1                !  AND EDIT REMAINING FIELDS
  160.       SELECT(?POINT)                     !  IF OK THEN START HERE NEXT
  161.     .                               !
  162.  
  163.     LOOP FIELD# = FIELD() TO EDIT_RANGE#      !EDIT FIELDS IN THE EDIT RANGE
  164.  
  165.       CASE FIELD#                   !JUMP TO FIELD EDIT ROUTINE
  166.       OF ?FIRST_FIELD                    !FROM THE FIRST FIELD
  167.      IF KEYCODE() = ESC_KEY   OR |       !  RETURN ON ESC KEY
  168.         RECORDS# = FALSE            !  OR NO RECORDS
  169.           RETURN
  170.      .
  171.       @EDITS                        !EDIT ROUTINES GO HERE
  172.      RECORDS# = TRUE                     !  ASSUME RECORDS ARE HERE
  173.       @INITLOCATE                   !SHOW CURSOR FOR LOCATOR
  174.       OF ?POINT                          !FROM THE POINT FIELD
  175.      @LOCATE
  176.      CASE KEYCODE()                 !  PROCESS THE KEYSTROKE
  177.      OF INS_KEY                     !INSERT KEY
  178.        CLEAR(@PRE:RECORD)                !  CLEAR RECORD AREA
  179.        ACTION = 1                   !  SET ACTION TO ADD
  180.        @UPDATE                 !  CALL FORM FOR NEW RECORD
  181.        IF ~ACTION                   !  IF A NEW RECORD WAS ADDED
  182.          POINTER# = POINTER(@FILENAME)   !    REMEMBER WHICH RECORD
  183.          SET(@KEYNAME,@KEYNAME)          !    SET TO NEW RECORD AND
  184.          SKIP(@FILENAME,-1)              !    MAKE IT THE TOP ITEM
  185.          DO SHOW_TABLE              !    DISPLAY THAT PAGE
  186.        .
  187.      OF ENTER_KEY                   !ENTER KEY OR
  188.      OROF ACCEPT_KEY                     !CTRL ENTER KEY
  189.        DO GET_RECORD                     !  READ THE SELECTED RECORD
  190.        IF ACTION = 4 AND KEYCODE() = ENTER_KEY!  IF THIS IS A LOOKUP REQUEST
  191.          ACTION = 0                 !    SET ACTION TO COMPLETE
  192.          RETURN                     !    AND RETURN TO CALLER
  193.        .                       !
  194.        ACTION = 2                   !  SET ACTION TO CHANGE
  195.        @UPDATE                 !  CALL FORM TO CHANGE RECORD
  196.        IF ~ACTION                   !  IF THE RECORD WAS CHANGED
  197.          POINTER# = POINTER(@FILENAME)   !    REMEMBER WHICH RECORD
  198.          SET(@KEYNAME,@KEYNAME)          !    SET TO CHANGED RECORD
  199.          SKIP(@FILENAME,-1)              !    MAKE IT THE TOP ITEM
  200.          DO SHOW_TABLE              !    AND DISPLAY THAT PAGE
  201.        ELSE                         !  OTHERWISE
  202.          SKIP(@FILENAME,(MAX-NDX))       !  SKIP BACK TO SAME PAGE
  203.        .
  204.      OF DEL_KEY                     !DELETE KEY
  205.        DO GET_RECORD                     !  READ THE SELECTED RECORD
  206.        ACTION = 3                   !  SET ACTION TO DELETE
  207.        @UPDATE                 !  CALL FORM TO DELETE RECORD
  208.        IF ~ACTION                   !  IF RECORD WAS DELETED
  209.          SKIP(@FILENAME,-NDX)       !    SET NEXT RECORD ON TOP
  210.          DO SHOW_TABLE              !    AND DISPLAY THAT PAGE
  211.        ELSE                         !  OTHERWISE
  212.          SKIP(@FILENAME,(MAX-NDX))       !  SKIP BACK TO SAME PAGE
  213.        .
  214.      OF DOWN_KEY                    !DOWN ARROW KEY
  215.        IF NOT EOF(@FILENAME)             !  IF THERE ARE MORE RECORDS
  216.          SCROLL(ROW,COL,ROWS,COLS,ROWS(?POINT)) !  SCROLL THE SCREEN UP
  217.          NEXT(@FILENAME)            !    READ THE BOTTOM RECORD
  218.          DO SHOW_RECORD             !    AND DISPLAY IT
  219.        .
  220.      OF PGDN_KEY                    !PAGE DOWN KEY
  221.        IF EOF(@FILENAME)            !  ON THE LAST PAGE
  222.          NDX = MAX                  !    POINT TO BOTTOM ITEM
  223.        ELSE                         !  OTHERWISE
  224.          DO SHOW_TABLE              !    DISPLAY NEXT PAGE
  225.        .
  226.      OF CTRL_PGDN                   !CTRL-PAGE DOWN KEY
  227.        NDX = MAX                    !  POINT TO BOTTOM ITEM
  228.        IF NOT EOF(@FILENAME)             !  ON THE LAST PAGE
  229.          SET(@KEYNAME)              !    SET TO BOTTOM RECORD MINUS
  230.          SKIP(@FILENAME,-COUNT)          !   ONE PAGE OF RECORDS
  231.          DO SHOW_TABLE              !    DISPLAY THE LAST PAGE
  232.        .
  233.      OF UP_KEY                 !UP ARROW KEY
  234.        SKIP(@FILENAME,-(COUNT-1))        !    SET TO TOP RECORD MINUS 1
  235.        IF NOT BOF(@FILENAME)             !  IF THERE IS A PRIOR RECORD
  236.          PREVIOUS(@FILENAME)             !     READ THE TOP RECORD
  237.          IF NOT ERROR()             !    IF READ A RECORD
  238.            SCROLL(ROW,COL,ROWS,COLS,-(ROWS(?POINT)))! SCROLL THE SCREEN DOWN
  239.            DO SHOW_RECORD                !    AND DISPLAY IT
  240.          ELSIF ERRORCODE() = 33          !    ELSIF RECORD NOT AVAILABLE
  241.            NEXT(@FILENAME)               !    RETRIEVE FIRST ONE
  242.        . .
  243.        SKIP(@FILENAME,COUNT-1)           !  SET RECORD FOR NEXT PAGE
  244.  
  245.      OF PGUP_KEY                    !PAGE UP KEY
  246.        SKIP(@FILENAME,-(COUNT-1))        !  SET TO TOP RECORD MINUS ONE
  247.        IF BOF(@FILENAME)            !  IF THERE IS NO PRIOR RECORD
  248.          NDX = 1                    !    THEN POINT TO TOP ITEM
  249.          SKIP(@FILENAME,COUNT-1)         !    SET RECORD FOR THIS PAGE
  250.        ELSE                         !  OTHERWISE
  251.          SKIP(@FILENAME,-(COUNT+1))           !    SET RECORD FOR PRIOR PAGE
  252.          DO SHOW_TABLE              !    AND DISPLAY THE PAGE
  253.        .
  254.      OF CTRL_PGUP                   !CTRL-PAGE UP KEY
  255.        SET(@KEYNAME)                     !  SET TO FIRST RECORD
  256.        NDX = 1                 !  POINT TO TOP ITEM
  257.        DO SHOW_TABLE                     !  AND DISPLAY THE PAGE
  258.      .
  259.   . . .
  260.   RETURN                       !RETURN TO CALLER
  261.  
  262. SHOW_TABLE ROUTINE                  !DISPLAY A PAGE OF RECORDS
  263.   SKIP(@FILENAME,COUNT-1)                !  SET TO THE BOTTOM RECORD
  264.   IF EOF(@FILENAME)                 !  FOR A PARTIAL PAGE
  265.     SET(@KEYNAME)                   !    SET TO THE LAST RECORD
  266.     SKIP(@FILENAME,-COUNT)               !    AND BACK UP ONE PAGE
  267.   ELSE                              !  OTHERWISE
  268.     SKIP(@FILENAME,-(COUNT-1))                !    SET RECORD FOR THIS PAGE
  269.   .
  270.   NDX# = NDX                        !  SAVE REPEAT INDEX
  271.   LOOP NDX = 1 TO COUNT                  !  LOOP THRU THE SCROLL AREA
  272.     IF EOF(@FILENAME) THEN BREAK.        !    BREAK ON END OF FILE
  273.     NEXT(@FILENAME)                 !    READ THE NEXT RECORD
  274.     DO SHOW_RECORD                  !    AND DISPLAY IT
  275.     IF POINTER(@FILENAME) = POINTER# THEN NDX# = NDX.!POINT TO CORRECT RECORD
  276.   .
  277.   NDX = NDX#                        !  RESTORE REPEAT INDEX
  278.   CLEAR(@PRE:RECORD)                     !  CLEAR RECORD AREA
  279.   IF RECORDS(@KEYNAME) < COUNT                !  IF RECORDS DO NOT FILL
  280.      NDX#= RECORDS(@KEYNAME) * @PROWS         !     GET NUMBER TIMES SIZE
  281.      BLANK(ROW + NDX#,COL,ROWS-NDX#,COLS)     !     BLANK REMAINING AREA
  282.   .
  283.  
  284. SHOW_RECORD ROUTINE                 !DISPLAY A RECORD
  285.   @LOOKUPSCROLL                          !  DISPLAY FROM OTHER FILES
  286.   @SHOWSCROLL                       !  DISPLAY STRING VARIABLES
  287.   @COMPUTESCROLL                    !  DISPLAY COMPUTED FIELDS
  288.  
  289. GET_RECORD ROUTINE                  !READ SELECTED RECORD
  290.   SKIP(@FILENAME,-(MAX-NDX+1))                !  SET TO SELECTED RECORD
  291.   NEXT(@FILENAME)                   !    AND READ IT
  292.  
  293. FIND_RECORD ROUTINE                 !LOCATE REQUESTED RECORD
  294.   SET(@KEYNAME,@KEYNAME)            !  SET TO REQUESTED RECORD
  295.   IF EOF(@FILENAME)                 !  IF BEYOND END OF FILE
  296.     PREVIOUS(@FILENAME)                  !    GET THE LAST RECORD
  297.   ELSE                              !  ELSE
  298.     NEXT(@FILENAME)                 !    READ THIS RECORD
  299.   .
  300.   POINTER# = POINTER(@FILENAME)               !  SAVE ITS RECORD POINTER
  301.   SKIP(@FILENAME,-1)                     !  MAKE IT THE TOP RECORD
  302.   DO SHOW_TABLE                          !  AND FILL THE SCROLL AREA
  303.  
  304. SAME_PAGE ROUTINE                   !SET TO SAME PAGE ROUTINE
  305.   POINTER# = POINTER(@FILENAME)               !  SAVE ITS RECORD POINTER
  306.   GET(@FILENAME,POINTER#)                !  GET THE RECORD
  307.   SET(@KEYNAME,@KEYNAME)            !  SET TO THE SAME RECORD
  308.   SKIP(@FILENAME,-1)                     !  SKIP TO TOP OF SAME PAGE
  309. *SELTABLE***********************************************************************
  310. @PROCNAME    PROCEDURE
  311.  
  312. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  313.                  @PAINTS
  314.                  @STRINGS
  315.                  @VARIABLES
  316.                  ENTRY,USE(?FIRST_FIELD)
  317.                  @FIELDS
  318.                  @PREPOINT
  319.                  REPEAT(@COUNT),EVERY(@PROWS),INDEX(NDX)
  320.            @PLOC        POINT(@PROWS,@COLS),USE(?POINT),ESC(?-1)
  321.                    @SCROLLVARIABLES
  322.           .           .
  323.  
  324. PTR       LONG                 !ENTRY POINTER FOR KEY TABLE
  325. NDX       BYTE                 !REPEAT INDEX FOR POINT AREA
  326. ROW       BYTE                 !ACTUAL ROW OF SCROLL AREA
  327. COL       BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  328. COUNT          BYTE(@COUNT)              !NUMBER OF ITEMS TO SCROLL
  329. ROWS      BYTE(@ROWS)               !NUMBER OF ROWS TO SCROLL
  330. COLS      BYTE(@COLS)               !NUMBER OF COLUMNS TO SCROLL
  331.  
  332. TABLE          TABLE                     !TABLE OF RECORD KEYS
  333. TBLPTR           LONG                    !  POINTER TO DATA RECORD
  334. KEY         GROUP,PRE(TBL)               !  RECORD KEY FIELDS
  335.            @COMPONENTS
  336.           . .
  337. @SAVEITEMS
  338.  
  339.   EJECT
  340.   CODE
  341.   ACTION# = ACTION                  !SAVE ACTION
  342.   OPEN(SCREEN)                      !OPEN THE SCREEN
  343.   SETCURSOR                         !TURN OFF ANY CURSOR
  344.   @SETUP                       !CALL SETUP PROCEDURE
  345.   @INITSELECTS                      !SAVE SELECTOR FIELDS
  346.   PTR = 1                      !START AT TABLE ENTRY
  347.   NDX = 1                      !PUT SELECTOR BAR ON TOP ITEM
  348.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  349.   COL = COL(?POINT)                 !LEFT COLUMN OF SCROLL AREA
  350.   RECORDS# = TRUE                   !INITIALIZE RECORDS FLAG
  351.   LOOP                              !LOOP UNTIL USER EXITS
  352.     ACTION = ACTION#                     !RESTORE ACTION
  353.     @RESTSELECTS                    !RESTORE SELECTOR FIELDS
  354.     @LOOKUPS                        !DISPLAY FROM OTHER FILES
  355.     @SHOW                      !DISPLAY STRING VARIABLES
  356.     @COMPUTE                        !DISPLAY COMPUTED FIELDS
  357.     @RESULT                         !MOVE RESULTING VALUES
  358.     ALERT                      !RESET ALERTED KEYS
  359.     ALERT(REJECT_KEY)                    !ALERT SCREEN REJECT KEY
  360.     ALERT(ACCEPT_KEY)                    !ALERT SCREEN ACCEPT KEY
  361.     @ALERT                          !ALERT HOT KEY
  362.     ACCEPT                          !READ A FIELD
  363.     MEM:MESSAGE = ''                     !CLEAR MESSAGE AREA
  364.     @TABLEHOT                       !ON HOT KEY, CALL PROCEDURE
  365.     IF KEYCODE() = REJECT_KEY THEN BREAK.     !RETURN ON SCREEN REJECT KEY
  366.  
  367.     EDIT_RANGE# = FIELD()                !SET ONE FIELD EDIT RANGE
  368.     IF KEYCODE() = ACCEPT_KEY  AND |          !ON SCREEN ACCEPT KEY
  369.        EDIT_RANGE# <> ?POINT             ! AND NOT ON THE POINT FIELD
  370.       UPDATE                        !  MOVE ALL FIELDS FROM SCREEN
  371.       EDIT_RANGE# = ?POINT - 1                !  AND EDIT REMAINING FIELDS
  372.       SELECT(?POINT)                     !  IF OK THEN START HERE NEXT
  373.     .                               !
  374.  
  375.     LOOP FIELD# = FIELD() TO EDIT_RANGE#      !EDIT FIELDS IN THE EDIT RANGE
  376.  
  377.       CASE FIELD#                   !JUMP TO FIELD EDIT ROUTINE
  378.  
  379.       OF ?FIRST_FIELD                    !FROM THE FIRST FIELD
  380.      IF KEYCODE() = ESC_KEY OR |         !  RETURN ON ESC KEY
  381.         RECORDS# = FALSE            !  OR NO RECORDS
  382.           FREE(TABLE)               !  FREE THE TABLE OF POINTS
  383.           RETURN                    !  RETURN TO CALLER
  384.      .
  385.       @EDITS                        !EDIT ROUTINES GO HERE
  386.      RECORDS# = TRUE                     !  ASSUME THERE ARE RECORDS
  387.       @INITLOCATE
  388.       OF ?POINT                          !PROCESS THE POINT FIELD
  389.      IF ~RECORDS(TABLE)             !IF THERE ARE NO RECORDS
  390.        CLEAR(@PRE:RECORD)                !  CLEAR RECORD AREA
  391.        UPDATE                  !  UPDATE ALL FIELDS
  392.        ACTION = 1                   !  SET ACTION TO ADD
  393.        @UPDATE                 !  CALL FORM FOR FIRST RECORD
  394.        IF ~ACTION                   !  IF RECORD WAS ADDED
  395.          DO ADD_TABLE               !    THEN ADD NEW TABLE ENTRY
  396.          DO SORT_TABLE              !    SORT THE TABLE
  397.          DO SHOW_TABLE              !    AND DISPLAY FIRST PAGE
  398.        .
  399.        IF ~RECORDS(TABLE)                !  IF ADD ABORTED TRY AGAIN
  400.            RECORDS# = FALSE              !    INDICATE NO RECORDS
  401.            SELECT(?-1)              !    SELECT PREVIOUS FIELD
  402.            BREAK                    !    END THE EDITS
  403.        .
  404.        CYCLE                        !  CONTINUE THE EDIT
  405.      .
  406.      @LOCATE
  407.      CASE KEYCODE()                 !PROCESS THE KEYSTROKE
  408.  
  409.      OF ENTER_KEY                   !ENTER KEY OR
  410.      OROF ACCEPT_KEY                     !CTRL-ENTER KEY
  411.        DO GET_RECORD                     !  READ THE SELECTED RECORD
  412.        IF ERROR()                   !  IF RECORD HAS BEEN DELETED
  413.          MEM:MESSAGE = ERROR()           !    TELL USER WHAT HAPPENED
  414.          SELECT(?)                  !    STAY IN THE POINT FIELD
  415.          DO BUILD_TABLE             !    REBUILD TABLE
  416.          DO SORT_TABLE              !    SORT IT
  417.          DO SHOW_TABLE              !    SHOW IT
  418.          BREAK                 !    AND GET ANOTHER KEY
  419.        .
  420.        IF ACTION = 4 AND KEYCODE() = ENTER_KEY!  IF THIS IS A LOOKUP REQUEST
  421.          ACTION = 0                 !    SET ACTION TO COMPLETE
  422.          FREE(TABLE)                     !    FREE THE TABLE OF POINTS
  423.          RETURN                     !    RETURN TO CALLER
  424.        .
  425.        ACTION = 2                   !  SET ACTION TO CHANGE
  426.        @UPDATE                 !  CALL FORM TO CHANGE RECORD
  427.        IF ~ACTION                   !  IF THE RECORD WAS CHANGED
  428.          DELETE(TABLE)              !    DELETE OLD TABLE ENTRY
  429.          DO ADD_TABLE               !    ADD NEW TABLE ENTRY
  430.          DO SORT_TABLE              !    SORT THE TABLE
  431.          DO SHOW_TABLE              !    AND DISPLAY THAT PAGE
  432.        .
  433.      OF INS_KEY                     !INS KEY
  434.        CLEAR(@PRE:RECORD)                !  CLEAR RECORD AREA
  435.        UPDATE                  !  UPDATE ALL FIELDS
  436.        ACTION = 1                   !  SET ACTION TO ADD
  437.        @UPDATE                 !  CALL FORM FOR NEW RECORD
  438.        IF ~ACTION                   !  IF RECORD WAS ADDED
  439.          DO ADD_TABLE               !    ADD NEW TABLE ENTRY
  440.          DO SORT_TABLE              !    SORT THE TABLE
  441.          DO SHOW_TABLE              !    AND DISPLAY THAT PAGE
  442.        .
  443.      OF DEL_KEY                     !DEL KEY
  444.        DO GET_RECORD                     !  READ THE SELECTED RECORD
  445.        IF ERROR()                   !  IF RECORD HAS BEEN DELETED
  446.          MEM:MESSAGE = ERROR()           !    TELL USER WHAT HAPPENED
  447.          SELECT(?)                  !    STAY ON THE POINT FIELD
  448.          DO BUILD_TABLE             !    REBUILD TABLE
  449.          DO SORT_TABLE              !    SORT IT
  450.          DO SHOW_TABLE              !    SHOW IT
  451.          BREAK                 !    AND GET ANOTHER KEY
  452.        .
  453.        ACTION = 3                   !  SET ACTION TO DELETE
  454.        @UPDATE                 !  CALL FORM TO DELETE RECORD
  455.        IF ~ACTION                   !  IF RECORD WAS DELETED
  456.          DELETE(TABLE)              !   DELETE TABLE ENTRY
  457.          DO SHOW_TABLE              !   AND DISPLAY THAT PAGE
  458.        .
  459.      OF DOWN_KEY                    !DOWN ARROW KEY
  460.        IF PTR <= RECORDS(TABLE)-COUNT    !  IF THERE ARE MORE ENTRIES
  461.          SCROLL(ROW,COL,ROWS,COLS,ROWS(?POINT)) !  SCROLL THE SCREEN UP
  462.          PTR += 1                   !    SET TO THE NEXT ENTRY
  463.          DO SHOW_RECORD             !    AND DISPLAY THE RECORD
  464.        .
  465.      OF PGDN_KEY                    !PAGE DOWN KEY
  466.        IF PTR >= RECORDS(TABLE)-COUNT+1  !  ON THE LAST PAGE
  467.          NDX = COUNT.               !    POINT TO BOTTOM ITEM
  468.        PTR += COUNT                 !  OTHERWISE
  469.        TBLPTR = -1                  !  NOT SET TO A RECORD
  470.        DO SHOW_TABLE                     !    DISPLAY THE NEXT PAGE
  471.  
  472.      OF CTRL_PGDN                   !CTRL-PAGE DOWN KEY
  473.        PTR = RECORDS(TABLE) - COUNT + 1  !  SET TO LAST PAGE
  474.        NDX = COUNT                  !  POINT TO BOTTOM ITEM
  475.        TBLPTR = -1                  !  NOT SET TO A RECORD
  476.        DO SHOW_TABLE                     !  DISPLAY THE LAST PAGE
  477.  
  478.      OF UP_KEY                 !UP ARROW KEY
  479.        IF PTR > 1                   !  IF THERE IS A PRIOR RECORD
  480.          PTR -= 1                   !    SET TO PRIOR RECORD
  481.          SCROLL(ROW,COL,ROWS,COLS,-(ROWS(?POINT)))! SCROLL THE SCREEN DOWN
  482.          DO SHOW_RECORD             !    DISPLAY THE RECORD
  483.        .
  484.      OF PGUP_KEY                    !PAGE UP KEY
  485.        IF PTR = 1 THEN NDX = 1.          !  ON FIRST PAGE POINT TO TOP
  486.        PTR -= ROWS                  !  OTHERWISE BACK UP 1 PAGE
  487.        TBLPTR = -1                  !  NOT SET TO A RECORD
  488.        DO SHOW_TABLE                     !  AND DISPLAY IT
  489.  
  490.      OF CTRL_PGUP                   !CTRL-PAGE UP
  491.        PTR = 1                 !  POINT TO FIRST RECORD
  492.        NDX = 1                 !  POINT TO TOP ITEM
  493.        TBLPTR = -1                  !  NOT SET TO A RECORD
  494.        DO SHOW_TABLE                     !  AND DISPLAY THE FIRST PAGE
  495.      .
  496.   . . .                             !
  497.  
  498.   FREE(TABLE)                       !FREE MEMORY TABLE
  499.   RETURN                       !AND RETURN TO CALLER
  500.  
  501. BUILD_TABLE ROUTINE                 !BUILD MEMORY TABLE
  502.   FREE(TABLE)                       !EMPTY THE TABLE
  503.   @READTABLE                        !DO SELECTOR OR FILTER
  504.   TBLPTR = -1                       !INITIALIZE TO NO RECORD
  505.   DO SHOW_TABLE                          !DISPLAY A PAGE OF RECORDS
  506.  
  507. ADD_TABLE ROUTINE                   !ADD ENTRY TO MEMORY TABLE
  508.   @CHECKADD                         !
  509.   IF ~(@FILTER) THEN EXIT.               !  EXIT IF FILTERED OUT
  510.   @SETCOMPONENTS                    !  MOVE KEY COMPONENTS
  511.   TBLPTR = POINTER(@FILENAME)            !  SAVE DATA RECORD POINTER
  512.   ADD(TABLE)                        !  ADD NEW TABLE ENTRY
  513.   IF ERROR()                        !  IF OUT OF MEMORY
  514.     MEM:MESSAGE = ERROR()                !    INFORM USER
  515.     BEEP                       !   SOUND ALARM
  516.   .
  517. SORT_TABLE ROUTINE                  !SORT TABLE ENTRIES
  518.   TBLPTR# = TBLPTR                  !  SAVE DATA RECORD POINTER
  519.   @SORTTABLE                        !  SORT THE TABLE
  520.   LOOP PTR = 1 TO RECORDS(TABLE)         !  LOOK UP THE SAVED POINTER
  521.     GET(TABLE,PTR)                  !    SO WE WILL STILL POINT
  522.     IF TBLPTR = TBLPTR# THEN EXIT.       !   AT THE SAME RECORD
  523.   .
  524.  
  525. SHOW_TABLE ROUTINE                  !DISPLAY A PAGE OF RECORDS
  526.   IF PTR > RECORDS(TABLE)-COUNT+1        !  FOR A PARTIAL PAGE
  527.     PTR = RECORDS(TABLE)-COUNT+1.        !    SET TO THE LAST RECORD
  528.   IF PTR < 1 THEN PTR = 1.               !    AND BACK UP ONE PAGE
  529.   TBLPTR# = TBLPTR                  !  SAVE DATA RECORD POINTER
  530.   NDX# = NDX                        !  SAVE REPEAT INDEX
  531.   LOOP NDX = 1 TO COUNT                  !  LOOP THRU THE SCROLL AREA
  532.     DO SHOW_RECORD                  !    DISPLAY A RECORD
  533.     IF TBLPTR# = TBLPTR THEN NDX# = NDX.      !    POINT TO CORRECT RECORD
  534.   .                            !
  535.   NDX = NDX#                        !  RESTORE REPEAT INDEX
  536.   IF NDX > RECORDS(TABLE) THEN NDX = RECORDS(TABLE).!SHOWING THE LAST
  537.   CLEAR(@PRE:RECORD)                     !  CLEAR RECORD AREA
  538.   IF RECORDS(TABLE) < COUNT              !  IF RECORDS DO NOT FILL
  539.      NDX#= RECORDS(TABLE) * @PROWS       !     GET NUMBER TIMES SIZE
  540.      BLANK(ROW + NDX#,COL,ROWS-NDX#,COLS)     !     BLANK REMAINING AREA
  541.   .
  542.  
  543. SHOW_RECORD ROUTINE                 !DISPLAY A RECORD
  544.   TBLPTR = 0                        !  START WITH NO RECORD
  545.   GET(TABLE,PTR+NDX-1)                   !  GET THE TABLE ENTRY
  546.   IF ~ERROR()                       !  IF THERE IS ONE
  547.     GET(@FILENAME,TBLPTR)                !    READ A DATA RECORD
  548.     IF ~ERROR()
  549.       @RESTSELECTS                  !    RESTORE SELECTOR FIELDS
  550.       @LOOKUPSCROLL                 !    DISPLAY FROM OTHER FILES
  551.       @SHOWSCROLL                   !    DISPLAY STRING VARIABLES
  552.       @COMPUTESCROLL                     !    DISPLAY COMPUTED FIELDS
  553.   . .
  554.  
  555. GET_RECORD ROUTINE                  !READ SELECTED RECORD
  556.   GET(TABLE,PTR+NDX-1)                   !  GET THE TABLE ENTRY
  557.   GET(@FILENAME,TBLPTR)                  !  READ THE DATA RECORD
  558.  
  559. FIND_RECORD ROUTINE                 !LOCATE REQUESTED RECORD
  560.   @SETCOMPONENTS                    !  MOVE THEM TO THE TABLE
  561.   GET(TABLE,KEY)                    !  GET THE TABLE ENTRY
  562.   PTR = POINTER(TABLE)                   !  SET RECORD POINTER
  563.   IF ~PTR THEN PTR = RECORDS(TABLE).          !  SET TO LAST IF NO POINTER
  564.   GET(TABLE,PTR)                    !  AND READ THE DATA RECORD
  565.   DO SHOW_TABLE                          !  DISPLAY THAT PAGE
  566.  
  567. SAME_PAGE ROUTINE                   !SET TO SAME PAGE ROUTINE
  568.   DO SORT_TABLE                          !  SORT THE TABLE
  569. *FORM***************************************************************************
  570. @PROCNAME    PROCEDURE
  571.  
  572. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  573.                  @PAINTS
  574.                  @STRINGS
  575.                  @VARIABLES
  576.                  ENTRY,USE(?FIRST_FIELD)
  577.                  @FIELDS
  578.                  @PAUSE
  579.                  ENTRY,USE(?LAST_FIELD)
  580.                  PAUSE(''),USE(?DELETE_FIELD)
  581.           .
  582.  
  583.   EJECT
  584.   CODE
  585.   OPEN(SCREEN)                      !OPEN THE SCREEN
  586.   SETCURSOR                         !TURN OFF ANY CURSOR
  587.   @SETUP                       !CALL SETUP PROCEDURE
  588.   DISPLAY                      !DISPLAY THE FIELDS
  589.   EXECUTE ACTION                    !SET THE CURRENT RECORD POINTER
  590.     POINTER# = 0                    !  NO RECORD FOR ADD
  591.     POINTER# = POINTER(@FILENAME)        !  CURRENT RECORD FOR CHANGE
  592.   .
  593.   LOOP                              !LOOP THRU ALL THE FIELDS
  594.     MEM:MESSAGE = CENTER(MEM:MESSAGE,SIZE(MEM:MESSAGE)) !DISPLAY ACTION MESSAGE
  595.     @LOOKUPS                        !DISPLAY FROM OTHER FILES
  596.     @SHOW                      !DISPLAY STRING VARIABLES
  597.     @COMPUTE                        !DISPLAY COMPUTED FIELDS
  598.     @RESULT                         !MOVE RESULTING VALUES
  599.     ALERT                      !RESET ALERTED KEYS
  600.     ALERT(ACCEPT_KEY)                    !ALERT SCREEN ACCEPT KEY
  601.     ALERT(REJECT_KEY)                    !ALERT SCREEN REJECT KEY
  602.     @ALERT                          !ALERT HOT KEY
  603.     ACCEPT                          !READ A FIELD
  604.     @CHECKHOT                       !ON HOT KEY, CALL PROCEDURE
  605.     IF KEYCODE() = REJECT_KEY THEN RETURN.    !RETURN ON SCREEN REJECT KEY
  606.     EXECUTE ACTION                  !SET ACTION MESSAGE
  607.       MEM:MESSAGE = 'Record will be Added'    !
  608.       MEM:MESSAGE = 'Record will be Changed'  !
  609.       MEM:MESSAGE = 'Press Enter to Delete'   !
  610.     .
  611.     EDIT_RANGE# = FIELD()                !SET ONE FIELD EDIT RANGE
  612.     IF KEYCODE() = ACCEPT_KEY            !ON SCREEN ACCEPT KEY
  613.       UPDATE                        !  MOVE ALL FIELDS FROM SCREEN
  614.       EDIT_RANGE# = FIELDS()             !  AND EDIT REMAINING FIELDS
  615.     .                               !
  616.     LOOP FIELD# = FIELD() TO EDIT_RANGE#      !EDIT FIELDS IN THE EDIT RANGE
  617.       CASE FIELD#                   !JUMP TO FIELD EDIT ROUTINE
  618.       OF ?FIRST_FIELD                    !FROM THE FIRST FIELD
  619.      IF KEYCODE() = ESC_KEY THEN RETURN.      !  RETURN ON ESC KEY
  620.      IF ACTION = 3 THEN SELECT(?DELETE_FIELD).!  OR CONFIRM FOR DELETE
  621.  
  622.       @EDITS                        !EDIT ROUTINES GO HERE
  623.       OF ?LAST_FIELD                     !FROM THE LAST FIELD
  624.      EXECUTE ACTION                 !  UPDATE THE FILE
  625.        ADD(@FILENAME)               !    ADD NEW RECORD
  626.        PUT(@FILENAME)               !    CHANGE EXISTING RECORD
  627.        DELETE(@FILENAME)            !    DELETE EXISTING RECORD
  628.      .
  629.      IF ERROR() THEN STOP(ERROR()).           !  CHECK FOR UNEXPECTED ERROR
  630.      PUT(@FILENAME2)                     !  UPDATE SECONDARY FILES
  631.      PUT(@FILENAME3)                     !  UPDATE SECONDARY FILES
  632.      PUT(@FILENAME4)                     !  UPDATE SECONDARY FILES
  633.      @NEXTFORM                 !  CALL NEXT FORM PROCEDURE
  634.      ACTION = 0                     !  SET ACTION TO COMPLETE
  635.      RETURN                         !  AND RETURN TO CALLER
  636.  
  637.       OF ?DELETE_FIELD                   !FROM THE DELETE FIELD
  638.      IF KEYCODE() = ENTER_KEY |          !  ON ENTER KEY
  639.      OR KEYCODE() = ACCEPT_KEY           !  OR CTRL-ENTER KEY
  640.        SELECT(?LAST_FIELD)               !    DELETE THE RECORD
  641.      ELSE                      !  OTHERWISE
  642.        BEEP                         !    BEEP AND ASK AGAIN
  643.   . . . .
  644.  
  645. *MEMFORM************************************************************************
  646. @PROCNAME    PROCEDURE
  647.  
  648. SCREEN         SCREEN      PRE(SCR),@SCREENOPT
  649.                  @PAINTS
  650.                  @STRINGS
  651.                  @VARIABLES
  652.                  ENTRY,USE(?FIRST_FIELD)
  653.                  @FIELDS
  654.                  @PAUSE
  655.                  ENTRY,USE(?LAST_FIELD)
  656.           .
  657.  
  658.   EJECT
  659.   CODE
  660.   OPEN(SCREEN)                      !OPEN THE SCREEN
  661.   SETCURSOR                         !TURN OFF ANY CURSOR
  662.   @SETUP                       !CALL SETUP PROCEDURE
  663.   DISPLAY                      !DISPLAY THE FIELDS
  664.   LOOP                              !LOOP THRU ALL THE FIELDS
  665.     @LOOKUPS                        !DISPLAY FROM OTHER FILES
  666.     @SHOW                      !DISPLAY STRING VARIABLES
  667.     @COMPUTE                        !DISPLAY COMPUTED FIELDS
  668.     @RESULT                         !MOVE RESULTING VALUES
  669.     ALERT                      !RESET ALERTED KEYS
  670.     ALERT(ACCEPT_KEY)                    !ALERT SCREEN ACCEPT KEY
  671.     ALERT(REJECT_KEY)                    !ALERT SCREEN REJECT KEY
  672.     @ALERT                          !ALERT HOT KEY
  673.     ACCEPT                          !READ A FIELD
  674.     @CHECKHOT                       !ON HOT KEY, CALL PROCEDURE
  675.     IF KEYCODE() = REJECT_KEY THEN RETURN.    !RETURN ON SCREEN REJECT KEY
  676.     EDIT_RANGE# = FIELD()                !SET ONE FIELD EDIT RANGE
  677.     IF KEYCODE() = ACCEPT_KEY            !ON SCREEN ACCEPT KEY
  678.       UPDATE                        !  MOVE ALL FIELDS FROM SCREEN
  679.       EDIT_RANGE# = FIELDS()             !  AND EDIT REMAINING FIELDS
  680.     .                               !
  681.     LOOP FIELD# = FIELD() TO EDIT_RANGE#      !EDIT FIELDS IN THE EDIT RANGE
  682.       CASE FIELD#                   !JUMP TO FIELD EDIT ROUTINE
  683.       OF ?FIRST_FIELD                    !FROM THE FIRST FIELD
  684.      IF KEYCODE() = ESC_KEY THEN RETURN.      !  RETURN ON ESC KEY
  685.  
  686.       @EDITS                        !EDIT ROUTINES GO HERE
  687.       OF ?LAST_FIELD                     !FROM THE LAST FIELD
  688.      PUT(@FILENAME2)                     !  UPDATE SECONDARY FILES
  689.      PUT(@FILENAME3)                     !  UPDATE SECONDARY FILES
  690.      PUT(@FILENAME4)                     !  UPDATE SECONDARY FILES
  691.      @NEXTFORM                 !  CALL NEXT FORM PROCEDURE
  692.      ACTION = 0                     !  SET ACTION TO COMPLETE
  693.      RETURN                         !  AND RETURN TO CALLER
  694.   . . .
  695.  
  696. *REPORT*************************************************************************
  697.  
  698. @PROCNAME    PROCEDURE
  699.  
  700. REPORT         @REPORT
  701.  
  702. @SAVEITEMS
  703.  
  704.   CODE
  705.   DONE# = 0                         !TURN OFF DONE FLAG
  706.   @SETUP                       !CALL SETUP PROCEDURE
  707.   @INITSELECTS                      !SAVE SELECTOR FIELDS
  708.   BUILD(@INDEX)                          !BUILD FILE INDEX
  709.   @INITREPORT                       !INIT REPORT VARIABLES
  710.   @RPTHEADER                        !DO REPORT HEADER COMPUTES
  711.   PRINT(TTL:RPT_HEAD)                    !PRINT TITLE PAGE
  712.   @PRINTMEMO                        !PRINT ANY MEMO FILES
  713.   @SETFILE                          !SET TO FIRST RECORD
  714.   @PAGEFOOTER                       !DO PAGE FOOTER COMPUTES
  715.   @PAGEHEADER                       !DO PAGE HEADER COMPUTES
  716.   DO NEXT_RECORD                    !READ FIRST RECORD
  717.   @PAGEHEADER                       !DO PAGE HEADER COMPUTES
  718.   OPEN(REPORT)                      !OPEN THE REPORT
  719.   LOOP UNTIL DONE#                  !READ ALL RECORDS IN FILE
  720.     @INITBREAK                      !  SET BREAK CRITERIA
  721.     @INITGROUP                      !  INIT GROUP VARIABLES
  722.     @GRPHEADER                      !  DO HEADER COMPUTES
  723.     PRINT(RPT:GRP_HEAD)                  !  PRINT GROUP HEADER
  724.     DO CHECK_PAGE                   !  DO PAGE BREAK IF NEEDED
  725.     @PRINTMEMO                      !  PRINT ANY MEMO FIELD
  726.  
  727.     LOOP UNTIL DONE#                     !  READ ALL RECORDS IN GROUP
  728.       SAVE_LINE# = MEM:LINE              !    SAVE LINE NUMBER
  729.       @RUNTOTALS                    !    ACCUMULATE RUNNING TOTALS
  730.       @INITDETAIL                   !    SET UP FOR DETAIL LINE
  731.       PRINT(RPT:DETAIL)                  !    PRINT DETAIL LINES
  732.       DO CHECK_PAGE                 !    DO PAGE BREAK IF NEEDED
  733.       @PRINTMEMO                    !    PRINT ANY MEMO FIELD
  734.       @TOTALS                       !    ACCUMULATE TOTALS
  735.       @PAGEFOOTER                   !    DO PAGE FOOTER COMPUTES
  736.       @PAGEHEADER                   !    DO PAGE HEADER COMPUTES
  737.       DO NEXT_RECORD                     !    GET NEXT RECORD
  738.       @CHECKBREAK                   !    EXIT ON NEW GROUP
  739.     .                               !
  740.     @GRPFOOTER                      !  DO FOOTER COMPUTES
  741.     PRINT(RPT:GRP_FOOT)                  !  PRINT GROUP FOOTER
  742.     DO CHECK_PAGE                   !  DO PAGE BREAK IF NEEDED
  743.     @PRINTMEMO                      !  PRINT ANY MEMO FIELD
  744.   .                            !
  745.   @RPTFOOTER                        !DO REPORT FOOTER COMPUTES
  746.   PRINT(RPT:RPT_FOOT)                    !PRINT GRAND TOTALS
  747.   DO CHECK_PAGE                          !  DO PAGE BREAK IF NEEDED
  748.   @PRINTMEMO                        !  PRINT ANY MEMO FIELD
  749.   CLOSE(REPORT)                          !CLOSE REPORT
  750.   RETURN                       !RETURN TO CALLER
  751.  
  752.  
  753. NEXT_RECORD ROUTINE                 !GET NEXT RECORD
  754.   LOOP UNTIL EOF(@FILENAME)              !  READ UNTIL END OF FILE
  755.     NEXT(@FILENAME)                 !    READ NEXT RECORD
  756.     @CHECKSELECT                    !    STOP IF PAST SELECTOR
  757.     @DETAIL                         !    DO DETAIL COMPUTES
  758.     IF ~(@FILTER) THEN CYCLE.            !    IF FILTERED OUT, GET NEXT
  759.     EXIT                       !    EXIT THE ROUTINE
  760.   .                            !
  761.   DONE# = 1                         !  ON EOF, SET DONE FLAG
  762.  
  763. CHECK_PAGE ROUTINE                  !CHECK FOR NEW PAGE
  764.   IF MEM:LINE <= SAVE_LINE#              !  ON PAGE OVERFLOW
  765.     @INITPAGE                       !    INIT PAGE VARIABLES
  766.   .
  767.  
  768. *MEMREPORT**********************************************************************
  769.  
  770. @PROCNAME    PROCEDURE
  771.  
  772. REPORT         @REPORT
  773.  
  774.   CODE
  775.   @SETUP                       !CALL SETUP PROCEDURE
  776.   @INITREPORT                       !INIT REPORT VARIABLES
  777.   @RPTHEADER                        !DO REPORT HEADER COMPUTES
  778.   PRINT(TTL:RPT_HEAD)                    !PRINT TITLE PAGE
  779.   @PAGEFOOTER                       !DO PAGE FOOTER COMPUTES
  780.   @PAGEHEADER                       !DO PAGE HEADER COMPUTES
  781.   OPEN(REPORT)                      !OPEN REPORT BODY
  782.   @INITGROUP                        !INIT GROUP VARIABLES
  783.   @GRPHEADER                        !DO HEADER COMPUTES
  784.   PRINT(RPT:GRP_HEAD)                    !PRINT GROUP HEADER
  785.   @MEMMEMO                          !PRINT ANY MEMO FIELD
  786.   @DETAIL                      !DO DETAIL COMPUTES
  787.   @RUNTOTALS                        !ACCUMULATE RUNNING TOTALS
  788.   @INITDETAIL                       !SET UP FOR DETAIL RECORD
  789.   PRINT(RPT:DETAIL)                 !PRINT DETAIL LINES
  790.   @MEMMEMO                          !PRINT ANY MEMO FIELD
  791.   @TOTALS                      !ACCUMULATE TOTALS
  792.   @GRPFOOTER                        !DO FOOTER COMPUTES
  793.   PRINT(RPT:GRP_FOOT)                    !PRINT GROUP FOOTER
  794.   @MEMMEMO                          !PRINT ANY MEMO FIELD
  795.   @PAGEFOOTER                       !DO PAGE FOOTER COMPUTES
  796.   @RPTFOOTER                        !DO REPORT FOOTER COMPUTES
  797.   PRINT(RPT:RPT_FOOT)                    !PRINT REPORT FOOTER
  798.   @MEMMEMO                          !PRINT ANY MEMO FIELD
  799.   CLOSE(REPORT)                          !CLOSE REPORT
  800.   RETURN                       !RETURN TO CALLER
  801.  
  802. *PRINTMEMO**********************************************************************
  803.       @MEMOLEN                      !DETERMINE MEMO SIZE
  804.       J# = 2                        !START WITH SECOND ROW
  805.       LOOP                          !LOOP THRU ALL USED ROWS
  806.      MEMODONE# = 0                  !  NO MEMOS DONE YET
  807.      @SETMEMO                  !  SET THE MEMO VARIABLES
  808.      IF MEMODONE# = 0 THEN BREAK.        !  ALL MEMOS PRINTED
  809.      @PRTDETAIL                     !  AND PRINT IT
  810.      J# += 1                        !  INCREMENT COUNTER
  811.      DO CHECK_PAGE                  !  DO PAGE BREAK IF NEEDED
  812.       .
  813.       DO CHECK_PAGE                 !DO PAGE BREAK IF NEEDED
  814. *SETMEMO************************************************************************
  815.        IF J# <= @MEMOTMP#                !IF IN THE RANGE OF THIS MEMO
  816.            @MEMOVAR = @MEMOROW[J#]       !  MOVE A MEMO FIELD ROW
  817.            MEMODONE# = 1            !  MEMO HAS BEEN MOVED
  818.        ELSE                         !OTHERWISE
  819.            @MEMOVAR = ''            !  NO MEMO TO DO
  820.        .                       ! END OF SETMEMO
  821. *MEMOLEN************************************************************************
  822.       LOOP @MEMOTMP# = @MEMOSIZE TO 2 BY -1   !BACKSCAN THE MEMO FIELD TO
  823.      IF @MEMOROW[@MEMOTMP#] <> '' THEN BREAK. ! FIND NUMBER OF ROWS USED
  824.       .                             ! END OF MEMOLEN
  825. *PRTDETAIL**********************************************************************
  826.      PRINT(@MEMDETAIL)              !PRINT THE DETAIL RECORD
  827. *MEMMEMO************************************************************************
  828.   @MEMOLEN                          !DETERMINE MEMO SIZE
  829.   J# = 2                       !START WITH ROW 2
  830.   LOOP                              !LOOP THRU ALL USED ROWS
  831.     MEMODONE# = 0                   !  NO MEMOS DONE YET
  832.     @SETMEMO                        !  SET THE MEMO VARIABLES
  833.     IF MEMODONE# = 0 THEN BREAK.         !  ALL MEMOS PRINTED
  834.     @PRTDETAIL                      !  AND PRINT IT
  835.     J# += 1                         !  INCREMENT COUNTER
  836.   .
  837. *ALERT**************************************************************************
  838.     ALERT(@HOTKEY)                  !ALERT HOT KEY
  839. *TODO***************************************************************************
  840. @PROCNAME    PROCEDURE                   !THIS PROCEDURE IS NOT DEFINED
  841.  
  842.   CODE                              !
  843.   RETURN                       !RETURN TO CALLER
  844. *SHOWMEMO***********************************************************************
  845.     LOOP I# = 1 TO @MEMOROWS             !DISPLAY MEMO FIELD BY ROWS
  846.       SHOW(ROW(@SCRMEMO)+I#-1,COL(@SCRMEMO),@MEMOROW[I#],@S@MEMOCOLS)
  847.     .
  848. *INRANGE************************************************************************
  849.      IF ~INRANGE(@FIELD,@LOWER,@UPPER)   !IF FIELD IS OUT OF RANGE
  850.        BEEP                         !  SOUND KEYBOARD ALARM
  851.        SELECT(?@FIELD)              !  AND STAY ON THIS FIELD
  852.        BREAK                        !
  853.      .
  854. *REQUIRED***********************************************************************
  855.      IF @FIELD = ''                 !IF REQUIRED FIELD IS EMPTY
  856.        BEEP                         !  SOUND KEYBOARD ALARM
  857.        SELECT(?@FIELD)              !  AND STAY ON THIS FIELD
  858.        BREAK                        !
  859.      .
  860. *NOTREQUIRED********************************************************************
  861.      IF @FIELD = ''                 !IF NOT REQUIRED THEN
  862.        @EDITPROC                    !  CALL THE EDIT PROCEDURE
  863.        CYCLE                        !  END THE EDIT
  864.      .
  865. *UNIQUEKEY**********************************************************************
  866.      GET(@FILENAME,@ACCESSKEY)           !READ THE RECORD BY KEY
  867.      IF NOT ERROR()                 !IF A RECORD IS FOUND
  868.        IF POINTER(@FILENAME) <> POINTER#      !  BUT NOT THE SAME RECORD
  869.          CLEAR(@PRE:RECORD)              !    CLEAR IN CASE OF ADD
  870.          GET(@FILENAME,POINTER#)         !    RE-READ THE OLD RECORD
  871.          UPDATE                     !    RE-UPDATE THE RECORD
  872.          MEM:MESSAGE = 'CREATES DUPLICATE KEY'!    MOVE AN ERROR MESSAGE
  873.          SELECT(?@FIELD)            !    STAY ON THE SAME FIELD
  874.          BEEP                  !    SOUND THE KEYBOARD ALARM
  875.          BREAK                 !    AND LOOP AGAIN
  876.      . .
  877.      GET(@FILENAME,POINTER#)             !  RE-READ THE OLD RECORD
  878.      UPDATE                         !  AND RE-UPDATE THE RECORD
  879. *SETTOP*************************************************************************
  880.   SET(@KEYNAME)                          !SET TO FIRST RECORD
  881. *SETSELECT**********************************************************************
  882.   SET(@KEYNAME,@KEYNAME)            !SET TO FIRST SELECTED RECORD
  883. *INITLOCATE*********************************************************************
  884.     OF ?PRE_POINT                   !
  885.       IF KEYCODE() = ESC_KEY OR |        !  IF GOING UP
  886.       KEYCODE() = UP_KEY OR |            !    THE SCREEN
  887.       RECORDS# = FALSE                   !    OR NO RECORDS ON SCREEN
  888.      SCR:LOCATOR = ''               !    CLEAR LOCATOR
  889.      SELECT(?-1)                    !    AND GO TO PREVIOUS FIELD
  890.      SETCURSOR                 !   AND TURN CURSOR OFF
  891.       ELSE                          !  OTHERWISE, GOING DOWN
  892.      LEN# = 0                  !    RESET TO START OF LOCATOR
  893.      SETCURSOR(ROW(SCR:LOCATOR),COL(SCR:LOCATOR)) !AND TURN CURSOR ON
  894.       .
  895. *PREPOINT***********************************************************************
  896.                  ENTRY,USE(?PRE_POINT)
  897. *LOCATE*************************************************************************
  898.       IF KEYCODE() > 31               |  !THE DISPLAYABLE CHARACTERS
  899.       AND KEYCODE() < 255                !ARE USED TO LOCATE RECORDS
  900.      IF LEN# < SIZE(SCR:LOCATOR)         !  IF THERE IS ROOM LEFT
  901.        SCR:LOCATOR = SUB(SCR:LOCATOR,1,LEN#) & CHR(KEYCODE())
  902.        LEN# += 1                    !    INCREMENT THE LENGTH
  903.      .
  904.       ELSIF KEYCODE() = BS_KEY                !BACKSPACE UNTYPES A CHARACTER
  905.      IF LEN# > 0                    !  IF THERE ARE CHARACTERS LEFT
  906.        LEN# -= 1                    !    DECREMENT THE LENGTH
  907.        SCR:LOCATOR = SUB(SCR:LOCATOR,1,LEN#)  !    ERASE THE LAST CHARACTER
  908.      .
  909.       ELSE                          !FOR ANY OTHER CHARACTER
  910.      LEN# = 0                  !  ZERO THE LENGTH
  911.      SCR:LOCATOR = ''               !  ERASE THE LOCATOR FIELD
  912.       .
  913.       SETCURSOR(ROW(SCR:LOCATOR),COL(SCR:LOCATOR)+LEN#) !AND RESET THE CURSOR
  914.       @SETLOCATE
  915.       IF KEYBOARD() > 31         |  !THE DISPLAYABLE CHARACTERS
  916.       AND KEYBOARD() < 255            |  !ARE USED TO LOCATE RECORDS
  917.       OR  KEYBOARD() = BS_KEY            !INCLUDE BACKSPACE
  918.      CYCLE
  919.       .
  920.       IF LEN# > 0 THEN DO FIND_RECORD.        !    AND FIND THE RECORD
  921. *STRLOCATE**********************************************************************
  922.       @LOCFIELD = CLIP(SCR:LOCATOR)           !    UPDATE THE KEY FIELD
  923. *PICLOCATE**********************************************************************
  924.       @LOCFIELD = DEFORMAT(SCR:LOCATOR)       !    UPDATE THE KEY FIELD
  925. *SELECTOR***********************************************************************
  926.       SET(@KEYNAME,@KEYNAME)             !SET AT FIRST SELECTED RECORD
  927.       LOOP UNTIL EOF(@FILENAME)               !LOOP UNTIL END OF FILE
  928.      NEXT(@FILENAME)                     !  READ A RECORD
  929.      @CHECKSELECT                   !  CHECK THAT IT IS SELECTED
  930.      DO ADD_TABLE                   !  AND ADD TO MEMORY TABLE
  931.       .
  932. *FILTER*************************************************************************
  933.       BUFFER(@FILENAME,.25)              !USE 1/4TH OF MEMORY FOR BUFFER
  934.       SET(@FILENAME)                     !READ DATA RECORD SEQUENCE
  935.       LOOP UNTIL EOF(@FILENAME)               !LOOP UNTIL END OF FILE
  936.      NEXT(@FILENAME)                     !  READ A RECORD
  937.      DO ADD_TABLE                   !  ADD IT TO MEMORY TABLE
  938.       .
  939.       FREE(@FILENAME)                    !FREE MEMORY USED FOR BUFFERING
  940.       DO SORT_TABLE                 !SORT TABLE INTO KEY SEQUENCE
  941.       PTR = 1                       !DISPLAY FROM TOP OF TANLE
  942. *VALIDATE***********************************************************************
  943.      @ACCESSFIELD = @FIELD               !MOVE RELATED FIELDS
  944.      GET(@FILENAME,@ACCESSKEY)           !READ THE RECORD
  945.      IF ERROR()                     !IF NO RECORD IS FOUND
  946.        MEM:MESSAGE = 'RECORD NOT FOUND'  !  MOVE AN ERROR MESSAGE
  947.        BEEP                         !  SOUND THE KEYBOARD ALARM
  948.        SELECT(?@FIELD)              !  AND STAY ON THE SAME FIELD
  949.      .
  950. *ENTERTABLE*********************************************************************
  951.      @ACCESSFIELD = @FIELD               !MOVE RELATED FIELDS
  952.      GET(@FILENAME,@ACCESSKEY)           !READ THE RECORD
  953.      IF ERROR()                     !IF NO RECORD IS FOUND
  954.        ACTION# = ACTION             !  SAVE ACTION
  955.        ACTION = 4                   !  REQUEST TABLE LOOKUP
  956.        @LOOKUP                 !  CALL LOOKUP PROCEDURE
  957.        @FIELD = @ACCESSFIELD             !  MOVE LOOKUP FIELD
  958.        DISPLAY(?@FIELD)             !  AND DISPLAY IT
  959.        IF ACTION THEN SELECT(?@FIELD).   !  NO SELECTION WAS MADE
  960.        ACTION = ACTION#             !  RESTORE ACTION
  961.      .
  962. *AUTOTABLE**********************************************************************
  963.      @ACCESSFIELD = @FIELD               !MOVE RELATED FIELDS
  964.      GET(@FILENAME,@ACCESSKEY)           !READ THE RECORD
  965.      ACTION# = ACTION               !SAVE ACTION
  966.      ACTION = 4                     !REQUEST TABLE LOOKUP
  967.      @LOOKUP                        !CALL LOOKUP PROCEDURE
  968.      @LOOKFIELD = @ACCESSFIELD           !SAVE LOOKUP FIELD
  969.      @FIELD = @ACCESSFIELD               !MOVE LOOKUP FIELD
  970.      DISPLAY(?@FIELD)               !AND DISPLAY IT
  971.      IF ACTION THEN SELECT(?@FIELD-1).   !NO SELECTION WAS MADE
  972.      ACTION = ACTION#               !RESTORE ACTION
  973. *HOTTABLE***********************************************************************
  974.      IF KEYCODE() = @HOTKEY              !IF HOT KEY PRESSED
  975.        UPDATE                  !  UPDATE ALL FIELDS
  976.        @ACCESSFIELD = @FIELD             !  MOVE RELATED FIELDS
  977.        GET(@FILENAME,@ACCESSKEY)         !  READ THE RECORD
  978.        ACTION# = ACTION             !  SAVE ACTION
  979.        ACTION = 4                   !  REQUEST TABLE LOOKUP
  980.        @LOOKUP                 !  CALL LOOKUP PROCEDURE
  981.        @FIELD = left(@ACCESSFIELD)            !  MOVE LOOKUP FIELD
  982.        
  983.        DISPLAY(?@FIELD)             !  AND DISPLAY IT
  984.        IF ACTION THEN SELECT(?@FIELD).   !  NO SELECTION WAS MADE
  985.        ACTION = ACTION#             !  RESTORE ACTION
  986.      .
  987. *NEXTFORM***********************************************************************
  988.      IF ACTION <> 3                 !IF THIS IS NOT A DELETE
  989.        ACTION = 2                   !  SET ACTION TO CHANGE MODE
  990.        @NEXTPAGE                    !  CALL NEXT FORM PROCEDURE
  991.        IF ACTION                    !  IF RECORD WAS NOT CHANGED
  992.          SELECT(?LAST_FIELD - 1)         !    SELECT THE LAST ENTRY
  993.          BREAK                 !    AND LOOP AGAIN
  994.      . .
  995. *PAUSE**************************************************************************
  996.       OF ?PAUSE_FIELD                    !ON PAUSE FIELD
  997.      IF KEYCODE() <> ENTER_KEY  |        !IF NOT ENTER KEY
  998.      AND KEYCODE() <> ACCEPT_KEY         !AND NOT CTRL-ENTER KEY
  999.        BEEP                         !  SOUND KEYBOARD ALARM
  1000.        SELECT(?PAUSE_FIELD)              !  AND STAY ON PAUSE FIELD
  1001.      .
  1002. *LOOKUPS************************************************************************
  1003.     UPDATE                          !UPDATE RECORD KEYS
  1004.     @ACCESSFIELD = @FIELD                !MOVE RELATED KEY FIELDS
  1005.     GET(@FILENAME,@ACCESSKEY)            !READ THE RECORD
  1006.     IF ERROR() THEN CLEAR(@PRE:RECORD).       !IF NOT FOUND, CLEAR RECORD
  1007.     @SCRFIELD = @LOOKUPFIELD             !DISPLAY LOOKUP FIELD
  1008. *LOOKUPSCROLL*******************************************************************
  1009.     @ACCESSFIELD = @FIELD                !MOVE RELATED KEY FIELDS
  1010.     GET(@FILENAME,@ACCESSKEY)            !READ THE RECORD
  1011.     IF ERROR() THEN CLEAR(@PRE:RECORD).       !IF NOT FOUND, CLEAR RECORD
  1012.     @SCRFIELD = @LOOKUPFIELD             !DISPLAY LOOKUP FIELD
  1013. *OPENFILES**********************************************************************
  1014.   OPEN(@FILENAME)                   !OPEN THE FILE
  1015.   @CREATEFILE                       !IF NOT FOUND, THEN CREATE
  1016. *CREATEFILE*********************************************************************
  1017.   IF ERRORCODE() = 2 THEN CREATE(@FILENAME).  !IF NOT FOUND, THEN CREATE
  1018.  
  1019. *SAVEITEMS**********************************************************************
  1020.           GROUP,PRE(SAV)
  1021.             @BREAKFIELDS
  1022.             @SELECTFIELDS
  1023.           .
  1024. *INITBREAK**********************************************************************
  1025.     @SAVEFIELD = @FIELD                  !SAVE BREAK FIELD
  1026. *INITSELECTS********************************************************************
  1027.     @SAVEFIELD = @FIELD                  !SAVE SELECTOR FIELD
  1028. *RESTSELECTS********************************************************************
  1029.     @FIELD = @SAVEFIELD                  !RESTORE SELECTOR FIELD
  1030. *CHECKBREAK*********************************************************************
  1031.       IF @FIELD <> @SAVEFIELD THEN BREAK.     !BREAK ON NEW GROUP
  1032. *SORTTABLE**********************************************************************
  1033.   SORT(TABLE,@COMPONENT)            !SORT TABLE INTO KEY SEQUENCE
  1034. *CHECKSELECT********************************************************************
  1035.      IF @FIELD <> @SAVEFIELD THEN BREAK.      !BREAK ON END OF SELECTION
  1036. *CHECKADD***********************************************************************
  1037.   IF @FIELD <> @SAVEFIELD THEN EXIT.          !EXIT ON END OF SELECTION
  1038. *CHECKHOT***********************************************************************
  1039.       IF KEYCODE() = @HOTKEY             !ON HOT KEY
  1040.      @HOTPROC                  !  CALL HOT KEY PROCEDURE
  1041.      SELECT(?)                 !  DO SAME FIELD AGAIN
  1042.      CYCLE                          !  AND LOOP AGAIN
  1043.       .
  1044. *TABLEHOT***********************************************************************
  1045.       IF KEYCODE() = @HOTKEY             !ON HOT KEY
  1046.      IF FIELD() = ?POINT THEN DO GET_RECORD.  !  READ RECORD IF NEEDED
  1047.      @HOTPROC                  !  CALL HOT KEY PROCEDURE
  1048.      DO SAME_PAGE                   !  RESET TO SAME PAGE
  1049.      DO SHOW_TABLE                  !  DISPLAY A PAGE OF RECORDS
  1050.      CYCLE                          !  AND LOOP AGAIN
  1051.       .
  1052. *BUILDTABLE*********************************************************************
  1053.   PTR = 1
  1054.   NDX = 1
  1055.   DO BUILD_TABLE                    !BUILD MEMORY TABLE OK KEYS
  1056. ********************************************************************************
  1057.