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