home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / ext_key.zip / EXT_TBL.CLA < prev    next >
Text File  |  1992-04-10  |  12KB  |  313 lines

  1.      MEMBER('ext_key')
  2. ext_table    PROCEDURE(keyname)
  3.  
  4. SCREEN         SCREEN      PRE(SCR),WINDOW(21,71),AT(3,6),HUE(15,1)
  5.           ROW(1,1)     STRING('<201,205{69},187>')
  6.           ROW(2,1)     REPEAT(19);STRING('<186,0{69},186>') .
  7.           ROW(21,1)     STRING('<200,205{69},188>')
  8.           ROW(3,3)     STRING('Full Name {22}SSN {12}Age   Phone Number')
  9.               ENTRY,USE(?FIRST_FIELD)
  10.               ENTRY,USE(?PRE_POINT)
  11.               REPEAT(17),EVERY(1),INDEX(NDX)
  12.           ROW(4,2)        POINT(1,67),USE(?POINT),ESC(?-1)
  13. name           COL(3)     STRING(@s25)
  14. ssn           COL(34)    STRING(@P###-##-####P)
  15. age           COL(49)    STRING(@N3)
  16. area           COL(55)    STRING(@p(###)pB)
  17. phone           COL(60)    STRING(@P###-####P)
  18.          .          .
  19. keyname         external,key
  20.  
  21. NDX         BYTE                 !REPEAT INDEX FOR POINT AREA
  22. ROW         BYTE                 !ACTUAL ROW OF SCROLL AREA
  23. COL         BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  24. COUNT         BYTE(17)                 !NUMBER OF ITEMS TO SCROLL
  25. ROWS         BYTE(17)                 !NUMBER OF ROWS TO SCROLL
  26. COLS         BYTE(67)                 !NUMBER OF COLUMNS TO SCROLL
  27. FOUND         BYTE                 !RECORD FOUND FLAG
  28. NEWPTR         LONG                 !POINTER TO NEW RECORD
  29.  
  30. TABLE         TABLE,PRE(TBL)             !TABLE OF RECORD DATA
  31. PTR           LONG                 !  POINTER TO FILE RECORD
  32. name          STRING(@s25)
  33. ssn          STRING(@P###-##-####P)
  34. age          BYTE
  35. area          STRING(@p(###)pB)
  36. phone          STRING(@P###-####P)
  37.          .
  38.  
  39.   EJECT
  40.   CODE
  41.   ACTION# = ACTION                 !SAVE ACTION
  42.   OPEN(SCREEN)                     !OPEN THE SCREEN
  43.   SETCURSOR                     !TURN OFF ANY CURSOR
  44.   TBL:PTR = 1                     !START AT TABLE ENTRY
  45.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  46.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  47.   COL = COL(?POINT)                 !LEFT COLUMN OF SCROLL AREA
  48.   RECORDS# = TRUE                 !INITIALIZE RECORDS FLAG
  49.   CACHE(keyname,.25)                 !CACHE KEY FILE
  50.   IF ACTION = 4                     !  TABLE LOOKUP REQUEST
  51.     NEWPTR = POINTER(employee)             !  SET POINTER TO RECORD
  52.     IF NOT NEWPTR                 !  RECORD NOT PASSED TO TABLE
  53.       SET(keyname,keyname)             !    POSITION TO CLOSEST RECORD
  54.       NEXT(employee)                 !    READ RECORD
  55.       NEWPTR = POINTER(employee)         !    SET POINTER
  56.     .
  57.     DO FIND_RECORD                 !  POSITION FILE
  58.   ELSE
  59.     NDX = 1                     !  PUT SELECTOR BAR ON TOP ITEM
  60.     DO FIRST_PAGE                 !  BUILD MEMORY TABLE OF KEYS
  61.   .
  62.   RECORDS# = TRUE                 !  ASSUME THERE ARE RECORDS
  63.   LOOP                         !LOOP UNTIL USER EXITS
  64.     ACTION = ACTION#                 !RESTORE ACTION
  65.     ALERT                     !RESET ALERTED KEYS
  66.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  67.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  68.     ACCEPT                     !READ A FIELD
  69.     IF KEYCODE() = REJECT_KEY THEN BREAK.     !RETURN ON SCREEN REJECT KEY
  70.     IF    KEYCODE() = ACCEPT_KEY      |         !ON SCREEN ACCEPT KEY
  71.     AND FIELD() <> ?POINT             !BUT NOT ON THE POINT FIELD
  72.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  73.       SELECT(?)                     !  START WITH CURRENT FIELD
  74.       SELECT                     !  EDIT ALL FIELDS
  75.       CYCLE                     !  GO TO TOP OF LOOP
  76.     .
  77.  
  78.     CASE FIELD()                 !JUMP TO FIELD EDIT ROUTINE
  79.  
  80.     OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  81.       IF KEYCODE() = ESC_KEY   |         !  RETURN ON ESC KEY
  82.       OR RECORDS# = FALSE             !  OR NO RECORDS
  83.     BREAK                     !    EXIT PROCEDURE
  84.       .
  85.     OF ?PRE_POINT                 !PRE POINT FIELD CONDITION
  86.       IF KEYCODE() = ESC_KEY             !  BACKING UP?
  87.     SELECT(?-1)                 !    SELECT PREVIOUS FIELD
  88.       ELSE                     !  GOING FORWARD
  89.     SELECT(?POINT)                 !    SELECT MENU FIELD
  90.       .
  91.     OF ?POINT                     !PROCESS THE POINT FIELD
  92.       IF RECORDS(TABLE) = 0             !IF THERE ARE NO RECORDS
  93.     CLEAR(emp:RECORD)             !  CLEAR RECORD AREA
  94.     ACTION = 1                 !  SET ACTION TO ADD
  95.     GET(employee,0)                 !  CLEAR PENDING RECORD
  96.     upd_emp                     !  CALL FORM FOR NEW RECORD
  97.     NEWPTR = POINTER(employee)         !    SET POINTER TO NEW RECORD
  98.     DO FIRST_PAGE                 !  DISPLAY THE FIRST PAGE
  99.     IF RECORDS(TABLE) = 0             !  IF THERE AREN'T ANY RECORDS
  100.       RECORDS# = FALSE             !    INDICATE NO RECORDS
  101.       SELECT(?PRE_POINT-1)             !    SELECT THE PRIOR FIELD
  102.     .
  103.     CYCLE                     !    AND LOOP AGAIN
  104.       .
  105.       CASE KEYCODE()                 !PROCESS THE KEYSTROKE
  106.  
  107.       OF INS_KEY                 !INS KEY
  108.     CLEAR(emp:RECORD)             !  CLEAR RECORD AREA
  109.     ACTION = 1                 !  SET ACTION TO ADD
  110.     GET(employee,0)                 !  CLEAR PENDING RECORD
  111.     upd_emp                     !  CALL FORM FOR NEW RECORD
  112.     IF ~ACTION                 !  IF RECORD WAS ADDED
  113.       NEWPTR = POINTER(employee)         !    SET POINTER TO NEW RECORD
  114.       DO FIND_RECORD             !    POSITION IN FILE
  115.     .
  116.       OF ENTER_KEY                 !ENTER KEY
  117.       OROF ACCEPT_KEY                 !CTRL-ENTER KEY
  118.     DO GET_RECORD                 !  GET THE SELECTED RECORD
  119.     IF ACTION = 4 AND KEYCODE() = ENTER_KEY!    IF THIS IS A LOOKUP REQUEST
  120.       ACTION = 0                 !    SET ACTION TO COMPLETE
  121.       BREAK                     !    AND RETURN TO CALLER
  122.     .
  123.     IF ~ERROR()                 !  IF RECORD IS STILL THERE
  124.       ACTION = 2                 !    SET ACTION TO CHANGE
  125.       upd_emp                 !    CALL FORM TO CHANGE REC
  126.       IF ACTION THEN CYCLE.             !    IF SUCCESSFUL RE-DISPLAY
  127.     .
  128.     NEWPTR = POINTER(employee)         !    SET POINTER TO NEW RECORD
  129.     DO FIND_RECORD                 !    POSITION IN FILE
  130.       OF DEL_KEY                 !DEL KEY
  131.     DO GET_RECORD                 !  READ THE SELECTED RECORD
  132.     IF ~ERROR()                 !  IF RECORD IS STILL THERE
  133.       ACTION = 3                 !    SET ACTION TO DELETE
  134.       upd_emp                 !    CALL FORM TO DELETE
  135.       IF ~ACTION                 !    IF SUCCESSFUL
  136.         N# = NDX                 !    SAVE POINT INDEX
  137.         DO SAME_PAGE             !    RE-DISPLAY
  138.         NDX = N#                 !    RESTORE POINT INDEX
  139.     . .
  140.       OF DOWN_KEY                 !DOWN ARROW KEY
  141.     DO SET_NEXT                 !  POINT TO NEXT RECORD
  142.     DO FILL_NEXT                 !  FILL A TABLE ENTRY
  143.     IF FOUND                 !  FOUND A NEW RECORD
  144.       SCROLL(ROW,COL,ROWS,COLS,ROWS(?POINT)) !    SCROLL THE SCREEN UP
  145.       GET(TABLE,RECORDS(TABLE))         !  GET RECORD FROM TABLE
  146.       DO FILL_SCREEN             !  DISPLAY ON SCREEN
  147.     .
  148.  
  149.       OF PGDN_KEY                 !PAGE DOWN KEY
  150.     DO SET_NEXT                 !  POINT TO NEXT RECORD
  151.     DO NEXT_PAGE                 !  DISPLAY THE NEXT PAGE
  152.  
  153.       OF CTRL_PGDN                 !CTRL-PAGE DOWN KEY
  154.     DO LAST_PAGE                 !  DISPLAY THE LAST PAGE
  155.     NDX = RECORDS(TABLE)             !  POSITION POINT BAR
  156.  
  157.       OF UP_KEY                     !UP ARROW KEY
  158.     DO SET_PREV                 !  POINT TO PREVIOUS RECORD
  159.     DO FILL_PREV                 !  FILL A TABLE ENTRY
  160.     IF FOUND                 !  FOUND A NEW RECORD
  161.       SCROLL(ROW,COL,ROWS,COLS,-(ROWS(?POINT)))! SCROLL THE SCREEN DOWN
  162.       GET(TABLE,1)                 !  GET RECORD FROM TABLE
  163.       DO FILL_SCREEN             !  DISPLAY ON SCREEN
  164.     .
  165.  
  166.       OF PGUP_KEY                 !PAGE UP KEY
  167.     DO SET_PREV                 !  POINT TO PREVIOUS RECORD
  168.     DO PREV_PAGE                 !  DISPLAY THE PREVIOUS PAGE
  169.  
  170.       OF CTRL_PGUP                 !CTRL-PAGE UP
  171.     DO FIRST_PAGE                 !  DISPLAY THE FIRST PAGE
  172.     NDX = 1                     !  POSITION POINT BAR
  173.   . . .
  174.   FREE(TABLE)                     !FREE MEMORY TABLE
  175.   FREE(keyname)                     !FREE CACHE
  176.   RETURN                     !AND RETURN TO CALLER
  177.  
  178. SAME_PAGE ROUTINE                 !DISPLAY THE SAME PAGE
  179.   GET(TABLE,1)                     !  GET THE FIRST TABLE ENTRY
  180.   DO FILL_RECORD                 !  FILL IN THE RECORD
  181.   SET(keyname,keyname,TBL:PTR)             !  POSITION FILE
  182.   FREE(TABLE)                     !  EMPTY THE TABLE
  183.   DO NEXT_PAGE                     !  DISPLAY A FULL PAGE
  184.  
  185. FIRST_PAGE ROUTINE                 !DISPLAY FIRST PAGE
  186.   FREE(TABLE)                     !  EMPTY THE TABLE
  187.   CLEAR(emp:RECORD,-1)                 !  CLEAR RECORD TO LOW VALUES
  188.   CLEAR(TBL:PTR)                 !  ZERO RECORD POINTER
  189.   SET(keyname)                     !  POINT TO FIRST RECORD
  190.   LOOP NDX = 1 TO COUNT                 !  FILL UP THE TABLE
  191.     DO FILL_NEXT                 !    FILL A TABLE ENTRY
  192.     IF NOT FOUND THEN BREAK.             !    GET OUT IF NO RECORD
  193.   .
  194.   NDX = 1                     !  SET TO TOP OF TABLE
  195.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  196.  
  197. LAST_PAGE ROUTINE                 !DISPLAY LAST PAGE
  198.   NDX# = NDX                     !  SAVE SELECTOR POSITION
  199.   FREE(TABLE)                     !  EMPTY THE TABLE
  200.   CLEAR(emp:RECORD,1)                 !  CLEAR RECORD TO HIGH VALUES
  201.   CLEAR(TBL:PTR,1)                 !  CLEAR PTR TO HIGH VALUE
  202.   SET(keyname)                     !  POINT TO FIRST RECORD
  203.   LOOP NDX = COUNT TO 1 BY -1             !  FILL UP THE TABLE
  204.     DO FILL_PREV                 !    FILL A TABLE ENTRY
  205.     IF NOT FOUND THEN BREAK.             !    GET OUT IF NO RECORD
  206.   .                         !  END OF LOOP
  207.   NDX = NDX#                     !  RESTORE SELECTOR POSITION
  208.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  209.  
  210. FIND_RECORD ROUTINE                 !POSITION TO SPECIFIC RECORD
  211.   SET(keyname,keyname,NEWPTR)             !POSITION FILE
  212.   IF NEWPTR = 0                     !NEWPTR NOT SET
  213.     NEXT(employee)                 !  READ NEXT RECORD
  214.     NEWPTR = POINTER(employee)             !  SET NEWPTR
  215.     SKIP(employee,-1)                 !  BACK UP TO DISPLAY RECORD
  216.   .
  217.   FREE(TABLE)                     !  CLEAR THE RECORD
  218.   DO NEXT_PAGE                     !  DISPLAY A PAGE
  219.  
  220. NEXT_PAGE ROUTINE                 !DISPLAY NEXT PAGE
  221.   SAVECNT# = RECORDS(TABLE)             !  SAVE RECORD COUNT
  222.   LOOP COUNT TIMES                 !  FILL UP THE TABLE
  223.     DO FILL_NEXT                 !    FILL A TABLE ENTRY
  224.     IF NOT FOUND                 !    IF NONE ARE LEFT
  225.       IF NOT SAVECNT#                 !    IF REBUILDING TABLE
  226.     DO LAST_PAGE                 !    FILL IN RECORDS
  227.     EXIT                     !    EXIT OUT OF ROUTINE
  228.       .
  229.       BREAK                     !    EXIT LOOP
  230.   . .
  231.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  232.  
  233. SET_NEXT ROUTINE                 !POINT TO THE NEXT PAGE
  234.   GET(TABLE,RECORDS(TABLE))             !  GET THE LAST TABLE ENTRY
  235.   DO FILL_RECORD                 !  FILL IN THE RECORD
  236.   SET(keyname,keyname,TBL:PTR)             !  POSITION FILE
  237.   NEXT(employee)                 !  READ THE CURRENT RECORD
  238.  
  239. FILL_NEXT ROUTINE                 !FILL NEXT TABLE ENTRY
  240.   FOUND = FALSE                     !  ASSUME RECORD NOT FOUND
  241.   LOOP UNTIL EOF(employee)             !  LOOP UNTIL END OF FILE
  242.     NEXT(employee)                 !    READ THE NEXT RECORD
  243.     FOUND = TRUE                 !    SET RECORD FOUND
  244.     DO FILL_TABLE                 !    FILL IN THE TABLE ENTRY
  245.     ADD(TABLE)                     !    ADD LAST TABLE ENTRY
  246.     GET(TABLE,RECORDS(TABLE)-COUNT)         !    GET ANY OVERFLOW RECORD
  247.     DELETE(TABLE)                 !    AND DELETE IT
  248.     EXIT                     !    RETURN TO CALLER
  249.   .
  250. PREV_PAGE ROUTINE                 !DISPLAY PREVIOUS PAGE
  251.   LOOP COUNT TIMES                 !  FILL UP THE TABLE
  252.     DO FILL_PREV                 !    FILL A TABLE ENTRY
  253.     IF NOT FOUND THEN BREAK.             !    GET OUT IF NO RECORD
  254.   .
  255.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  256.  
  257. SET_PREV ROUTINE                 !POINT TO PREVIOUS PAGE
  258.   GET(TABLE,1)                     !  GET THE FIRST TABLE ENTRY
  259.   DO FILL_RECORD                 !  FILL IN THE RECORD
  260.   SET(keyname,keyname,TBL:PTR)             !  POSITION FILE
  261.   PREVIOUS(employee)                 !  READ THE CURRENT RECORD
  262.  
  263. FILL_PREV ROUTINE                 !FILL PREVIOUS TABLE ENTRY
  264.   FOUND = FALSE                     !  ASSUME RECORD NOT FOUND
  265.   LOOP UNTIL BOF(employee)             !  LOOP UNTIL BEGINNING OF FILE
  266.     PREVIOUS(employee)                 !    READ THE PREVIOUS RECORD
  267.     FOUND = TRUE                 !    SET RECORD FOUND
  268.     DO FILL_TABLE                 !    FILL IN THE TABLE ENTRY
  269.     ADD(TABLE,1)                 !    ADD FIRST TABLE ENTRY
  270.     GET(TABLE,COUNT+1)                 !    GET ANY OVERFLOW RECORD
  271.     DELETE(TABLE)                 !    AND DELETE IT
  272.     EXIT                     !    RETURN TO CALLER
  273.   .
  274. SHOW_PAGE ROUTINE                 !DISPLAY THE PAGE
  275.   NDX# = NDX                     !  SAVE SCREEN INDEX
  276.   LOOP NDX = 1 TO RECORDS(TABLE)         !  LOOP THRU THE TABLE
  277.     GET(TABLE,NDX)                 !    GET A TABLE ENTRY
  278.     DO FILL_SCREEN                 !    AND DISPLAY IT
  279.     IF TBL:PTR = NEWPTR                 !    SET INDEX FOR NEW RECORD
  280.       NDX# = NDX                 !    POINT TO CORRECT RECORD
  281.   . .
  282.   LOOP WHILE NDX <= COUNT             !  FINISH BLANKING THE SCREEN
  283.     BLANK(ROW(?POINT),COL(?POINT),ROWS(?POINT),COLS(?POINT))!BLANK A LINE
  284.     NDX += 1                     !   INCREMENT NDX
  285.   .
  286.   NDX = NDX#                     !  RESTORE SCREEN INDEX
  287.   NEWPTR = 0                     !  CLEAR NEW RECORD POINTER
  288.   CLEAR(emp:RECORD)                 !  CLEAR RECORD AREA
  289.  
  290. FILL_TABLE ROUTINE                 !MOVE FILE TO TABLE
  291.   tbl:ssn = emp:ssn
  292.   tbl:age = emp:age
  293.   tbl:area = emp:area
  294.   tbl:phone = emp:phone
  295.   TBL:PTR = POINTER(employee)             !  SAVE RECORD POINTER
  296.   tbl:name = upper(clip(emp:lname)&', '&emp:fname)
  297.  
  298. FILL_RECORD ROUTINE                 !MOVE TABLE TO FILE
  299.   emp:age = tbl:age
  300.  
  301. FILL_SCREEN ROUTINE                 !MOVE TABLE TO SCREEN
  302.   scr:name = tbl:name
  303.   scr:ssn = tbl:ssn
  304.   scr:age = tbl:age
  305.   scr:area = tbl:area
  306.   scr:phone = tbl:phone
  307.  
  308. GET_RECORD ROUTINE                 !GET SELECTED RECORD
  309.   GET(TABLE,NDX)                 !  GET TABLE ENTRY
  310.   GET(employee,TBL:PTR)                 !  GET THE RECORD
  311.  
  312.  
  313.