home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / supernet.zip / SUPERNET.MDL < prev   
Text File  |  1990-01-08  |  49KB  |  1,202 lines

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