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