How to display a scrollable list using Cobol Screens

Viewed 185

I am creating a COBOL application using the screen section (Library where you can lend books).

How I can create a scrollable list using Screen Section? Can it be implemented so that you can scroll through that list using certain keys?

In my application I have screens where lists are displayed but there I am displaying a limited number of items and then a key has to be pressed to see further items.

But now I have a more complex situation.

This is the code I would like to "convert" into the screen section mode:

       IDENTIFICATION DIVISION. 
       PROGRAM-ID. RETBOOK.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION. 
       FILE-CONTROL. 

           COPY "SLCUST.cbl".
           COPY "SLBOOK.cbl".
           COPY "SLLOAN.cbl".

       DATA DIVISION. 
       FILE SECTION. 

           COPY "FDCUST.cbl".
           COPY "FDBOOK.cbl".
           COPY "FDLOAN.cbl".

       WORKING-STORAGE SECTION. 

           COPY "WSALPHA".

       77 A-PAUSE                   PIC X.
       77 LOAN-FILE-AT-END          PIC X.
       77 THE-CUSTOMER-ID           PIC 9(5).
       77 THE-CUSTOMER-LAST-NAME    PIC X(20).
       77 THE-CUSTOMER-FIRST-NAME   PIC X(20).
       77 THE-BOOK-TO-RETURN-ID     PIC 9(5).
       77 LOAN-FOUND                PIC X.

       PROCEDURE DIVISION.
       PROGRAM-BEGIN.
           PERFORM DO-RETURN.

       PROGRAM-EXIT.
           EXIT PROGRAM.

       PROGRAM-DONE.
           STOP RUN.

       OPEN-FILES.
           OPEN I-O CUSTOMER-FILE.
           OPEN I-O BOOK-FILE.
           OPEN I-O LOAN-FILE.

       CLOSE-FILES.
           CLOSE CUSTOMER-FILE.
           CLOSE BOOK-FILE.
           CLOSE LOAN-FILE.

       DO-RETURN.
           PERFORM OPEN-FILES.
           PERFORM FIND-CUSTOMER.
           PERFORM DISPLAY-LOANED-BOOK-IDS.
           IF LOAN-FOUND = "Y"
              PERFORM RETURN-BOOK
           ELSE
              DISPLAY "No loans available".
           PERFORM CLOSE-FILES.

       FIND-CUSTOMER.
           PERFORM ENTER-CUSTOMER-ID.
           PERFORM GET-CUSTOMER-BY-ID.

       ENTER-CUSTOMER-ID.
           DISPLAY "Enter id of customer to find.".
           ACCEPT THE-CUSTOMER-ID.

       GET-CUSTOMER-BY-ID.
           CALL "CUSTBYID" USING THE-CUSTOMER-ID.
           DISPLAY "Press any key to continue.".
           ACCEPT A-PAUSE.
       
       DISPLAY-LOANED-BOOK-IDS.
           PERFORM FIND-LENT-BOOKS-OF-CUSTOMER.

       FIND-LENT-BOOKS-OF-CUSTOMER.
           PERFORM READ-CUSTOMER-DATA.
           PERFORM DISPLAY-CUSTOMER-DATA.
           PERFORM INIT-DATA. 
           MOVE CUSTOMER-ID TO LOAN-CUSTOMER.
           PERFORM READ-LOAN-DATA.

       INIT-DATA.
           MOVE SPACES TO LOAN-RECORD.

       READ-CUSTOMER-DATA.
           MOVE THE-CUSTOMER-ID TO CUSTOMER-ID.
           READ CUSTOMER-FILE RECORD 
               INVALID KEY  
                   DISPLAY "CUSTOMER NOT FOUND".

       READ-LOAN-DATA.
           MOVE "Y" TO LOAN-FOUND
           START LOAN-FILE
               KEY = LOAN-CUSTOMER
               INVALID KEY 
                   DISPLAY "No lent books."
                   MOVE "N" TO LOAN-FOUND
                   MOVE "Y" TO LOAN-FILE-AT-END
           END-START.

           PERFORM READ-NEXT-LOAN-DATA
               UNTIL LOAN-FILE-AT-END = "Y".


       READ-NEXT-LOAN-DATA.
           IF LOAN-CUSTOMER = CUSTOMER-ID
               READ LOAN-FILE NEXT RECORD 
                AT END 
                    MOVE "Y" TO LOAN-FILE-AT-END
                PERFORM DISPLAY-LOAN-DATA
           ELSE
               MOVE "Y" TO LOAN-FILE-AT-END.

           

       DISPLAY-CUSTOMER-DATA.
           DISPLAY "Lent books of".
           DISPLAY CUSTOMER-FIRST-NAME.
           DISPLAY CUSTOMER-LAST-NAME.

       DISPLAY-LOAN-DATA.
           DISPLAY "Loan id : " LOAN-ID.
           DISPLAY "Loan Book : " LOAN-BOOK.


       RETURN-BOOK.
           CALL "LOANDEL".
       

Code of "LOANDEL"

       IDENTIFICATION DIVISION. 
       PROGRAM-ID. LOANDEL.
       ENVIRONMENT DIVISION. 
       INPUT-OUTPUT SECTION. 
       FILE-CONTROL. 

           COPY "SLBOOK.cbl".
           COPY "SLLOAN.cbl".

       DATA DIVISION. 
       FILE SECTION.

           COPY "FDBOOK.cbl".
           COPY "FDLOAN.cbl".

       WORKING-STORAGE SECTION. 

       77 THE-BOOK-ID     PIC 9(5).
       77 LOAN-FOUND      PIC X.
       77 BOOK-FOUND      PIC X.
       77 LOAN-KEY        PIC 9(5).

       PROCEDURE DIVISION.
       PROGRAM-BEGIN.
           OPEN I-O LOAN-FILE.
           OPEN I-O BOOK-FILE.
           PERFORM MAIN-PROCESS.
           CLOSE LOAN-FILE.
           CLOSE BOOK-FILE.

       PROGRAM-EXIT.
           EXIT PROGRAM.

       PROGRAM-DONE.
           STOP RUN.

       MAIN-PROCESS.
           PERFORM ENTER-BOOK-ID-TO-RETURN.
           PERFORM DISPLAY-BOOK.
           PERFORM FIND-LOAN.
           IF LOAN-FOUND = "Y"
               PERFORM DISPLAY-LOAN
               PERFORM DELETE-LOAN
               PERFORM MAKE-BOOK-AVAILABLE
           ELSE 
               DISPLAY "Loan not found".

       ENTER-BOOK-ID-TO-RETURN.
           DISPLAY "Enter book id to return".
           ACCEPT THE-BOOK-ID.
           MOVE THE-BOOK-ID TO LOAN-BOOK.
           MOVE THE-BOOK-ID TO BOOK-ID.

       DISPLAY-BOOK.
           CALL "BOOKBYID" USING THE-BOOK-ID.

       FIND-LOAN.
           MOVE "Y" TO LOAN-FOUND.
           START LOAN-FILE 
               KEY = LOAN-BOOK
               INVALID KEY 
                   MOVE "N" TO LOAN-FOUND
                   DISPLAY "This book is not lent by the customer".

           READ LOAN-FILE NEXT RECORD.

       DELETE-LOAN.
           DELETE LOAN-FILE RECORD
               INVALID KEY
                   DISPLAY "Error deleting loan".

       DISPLAY-LOAN.
           DISPLAY "Loan to delete:".
           DISPLAY "Loan id : " LOAN-ID.
           DISPLAY "Loan customer : " LOAN-CUSTOMER.
           DISPLAY "Loan book : " LOAN-BOOK.
           DISPLAY "Loan date : " LOAN-DATE.
           DISPLAY "Loan return date : " LOAN-RETURN-DATE.

       MAKE-BOOK-AVAILABLE.
           PERFORM FIND-BOOK.
           MOVE "N" TO BOOK-LENT.
           MOVE "N" TO BOOK-OVERDUE.
           PERFORM SAVE-CHANGES.

       FIND-BOOK.
           MOVE "Y" TO BOOK-FOUND.
           READ BOOK-FILE RECORD
               INVALID KEY 
                   MOVE "N" TO BOOK-FOUND.
       
       SAVE-CHANGES.
           REWRITE BOOK-RECORD 
               INVALID KEY 
                   DISPLAY "Error rewriting book record".

Code of "BOOKBYID"

       IDENTIFICATION DIVISION. 
       PROGRAM-ID. BOOKBYID.
       ENVIRONMENT DIVISION. 
       INPUT-OUTPUT SECTION. 
       FILE-CONTROL. 

           COPY "SLBOOK.cbl".

       DATA DIVISION. 
       FILE SECTION. 

           COPY "FDBOOK.cbl".

       WORKING-STORAGE SECTION. 

       77 BOOK-FOUND      PIC X.

       LINKAGE SECTION. 

       77 THE-BOOK-ID     PIC 9(5).

       PROCEDURE DIVISION 
           USING THE-BOOK-ID.

       PROGRAM-BEGIN.
           PERFORM OPEN-FILE.
           PERFORM GET-BOOK-BY-ID.
           PERFORM CLOSE-FILE.

       PROGRAM-EXIT.
           EXIT PROGRAM.

       PROGRAM-DONE.
           STOP RUN.

       OPEN-FILE.
           OPEN I-O BOOK-FILE.

       CLOSE-FILE.
           CLOSE BOOK-FILE.

       GET-BOOK-BY-ID.
           MOVE THE-BOOK-ID TO BOOK-ID.
           PERFORM READ-BOOK.
           IF BOOK-FOUND = "Y"
               PERFORM DISPLAY-BOOK
           ELSE 
               DISPLAY "Book not found".

       READ-BOOK.
           MOVE "Y" TO BOOK-FOUND.
           READ BOOK-FILE RECORD 
               INVALID KEY 
               MOVE "N" TO BOOK-FOUND.

       DISPLAY-BOOK.
           DISPLAY "Title : " BOOK-TITLE.
           DISPLAY "Author : " BOOK-AUTHOR.
 

I am using SCREEN SECTION in my other programs and DISPLAY/ACCEPT and DISPLAY BLANK SCREEN (wrapped in a paragraph) to clear the screen. Navigation using arrows, TAB and ENTER is not sufficient in this situation because I also would like to navigate through the scrollable list using other keys for example F3/F4.How can I achieve this here ?

1 Answers

Answer to the question "How to create a scrollable list of records in SCREEEN SECTION":

The most portable way is to define a CRT STATUS (goes to SPECIAL NAMES paragraph) which can be queried after each ACCEPT. The actual values you receive differ between implementations with the biggest difference you'll see is between X/Open COBOL definition (3-byte status, partial binary) and COBOL 2002+ (4byte status), some COBOL implementations may even accept and handle both (like GnuCOBOL 3.2+ ;-).

Implementations commonly ship a copybook with values you can test against, as there was no specification for the COBOL environment used: GnuCOBOL as an example would have copy screenio. with 4-byte definitions as constants (level 78 constants, not all COBOL implementations have those, the standard would use 01 ... CONSTANT) and an implied 4-byte status, allowing checks like IF COB-CRT-STATUS = COB-SCR-PAGE-DOWN and similar. If you specify the CRT STATUS clause then query that, if it is a 3 byte one then you'd normally check the different parts.

Related