Interactive programming in COBOL enables programs to communicate with users during execution, creating dynamic, user-driven applications. Unlike batch programs that run automatically without user interaction, interactive programs use ACCEPT and DISPLAY statements to receive input and provide output in real-time. This capability is essential for data entry systems, menu-driven applications, user interfaces, and any program that requires user decisions or input during execution.
This comprehensive guide will teach you how to create interactive COBOL programs using ACCEPT and DISPLAY, build menu-driven interfaces, validate user input, handle errors gracefully, and follow best practices for creating user-friendly interactive applications. Whether you're building data entry systems, user interfaces, or programs that require real-time user interaction, mastering interactive programming is crucial for modern COBOL development.
Interactive programming refers to programs that communicate with users during execution. These programs:
Interactive programs differ from batch programs in several key ways:
| Aspect | Interactive Programs | Batch Programs |
|---|---|---|
| User Communication | Real-time communication with users via ACCEPT and DISPLAY | No user interaction during execution |
| Execution Flow | Dynamic flow based on user choices and input | Predetermined execution path |
| Input Source | Terminal/console input from users | File input, predefined data |
| Output Destination | Immediate display to users | Files, reports, databases |
| Use Cases | Data entry, menus, user interfaces, interactive tools | Reports, data processing, automated jobs |
| Execution Timing | Runs when user initiates, responds immediately | Scheduled runs, processes large volumes |
The ACCEPT statement reads input from external sources (typically the terminal or console) and stores it in a program variable. ACCEPT pauses program execution and waits for the user to enter data, then continues after the input is received.
1ACCEPT identifier [FROM mnemonic-name]
Components:
1234567891011121314WORKING-STORAGE SECTION. 01 USER-NAME PIC X(30). 01 USER-AGE PIC 9(3). PROCEDURE DIVISION. MAIN-PARA. DISPLAY "Enter your name: " WITH NO ADVANCING ACCEPT USER-NAME DISPLAY "Enter your age: " WITH NO ADVANCING ACCEPT USER-AGE DISPLAY "Hello, " USER-NAME "! You are " USER-AGE " years old." STOP RUN.
In this example, the program prompts for the user's name and age, accepts the input, and then displays a personalized message. The WITH NO ADVANCING clause keeps the prompt and input on the same line for a cleaner interface.
ACCEPT can also retrieve system information without requiring user input:
123456789101112131415WORKING-STORAGE SECTION. 01 CURRENT-DATE PIC 9(8). 01 CURRENT-TIME PIC 9(8). 01 USER-ID PIC X(20). PROCEDURE DIVISION. MAIN-PARA. ACCEPT CURRENT-DATE FROM DATE YYYYMMDD ACCEPT CURRENT-TIME FROM TIME ACCEPT USER-ID FROM USER NAME DISPLAY "Current Date: " CURRENT-DATE DISPLAY "Current Time: " CURRENT-TIME DISPLAY "User ID: " USER-ID STOP RUN.
These forms of ACCEPT retrieve information from the system rather than waiting for user input. This is useful for logging, timestamps, and system identification.
The DISPLAY statement outputs data to the standard output device (typically the terminal or console). DISPLAY is used to show messages, prompts, results, and any information the user needs to see.
123DISPLAY identifier-1 [identifier-2 ...] [UPON mnemonic-name] [WITH NO ADVANCING]
Components:
1234567891011121314151617181920WORKING-STORAGE SECTION. 01 CUSTOMER-NAME PIC X(30) VALUE 'JOHN SMITH'. 01 ACCOUNT-BALANCE PIC 9(8)V99 VALUE 12345.67. PROCEDURE DIVISION. MAIN-PARA. *> Display literal text DISPLAY "Welcome to Customer Management System" *> Display variable values DISPLAY "Customer: " CUSTOMER-NAME DISPLAY "Balance: $" ACCOUNT-BALANCE *> Display with WITH NO ADVANCING for prompts DISPLAY "Enter customer ID: " WITH NO ADVANCING *> Display multiple items DISPLAY "ID: " CUSTOMER-ID " | Name: " CUSTOMER-NAME STOP RUN.
Menu-driven interfaces allow users to select from a list of options, making programs more user-friendly and easier to navigate. A menu typically displays options, accepts the user's choice, performs the selected operation, and loops back to show the menu again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061WORKING-STORAGE SECTION. 01 MENU-CHOICE PIC X(1). 01 CONTINUE-FLAG PIC X(1) VALUE 'Y'. 88 CONTINUE-PROGRAM VALUE 'Y'. 88 EXIT-PROGRAM VALUE 'N'. PROCEDURE DIVISION. MAIN-MENU. PERFORM UNTIL EXIT-PROGRAM PERFORM DISPLAY-MENU PERFORM GET-MENU-CHOICE PERFORM PROCESS-CHOICE END-PERFORM STOP RUN. DISPLAY-MENU. DISPLAY " " DISPLAY "=== CUSTOMER MANAGEMENT SYSTEM ===" DISPLAY "1. Add Customer" DISPLAY "2. View Customer" DISPLAY "3. Update Customer" DISPLAY "4. Delete Customer" DISPLAY "5. Exit" DISPLAY "Enter your choice (1-5): " WITH NO ADVANCING. GET-MENU-CHOICE. ACCEPT MENU-CHOICE. PROCESS-CHOICE. EVALUATE MENU-CHOICE WHEN '1' PERFORM ADD-CUSTOMER WHEN '2' PERFORM VIEW-CUSTOMER WHEN '3' PERFORM UPDATE-CUSTOMER WHEN '4' PERFORM DELETE-CUSTOMER WHEN '5' MOVE 'N' TO CONTINUE-FLAG DISPLAY "Thank you for using the system!" WHEN OTHER DISPLAY "Invalid choice. Please select 1-5." END-EVALUATE. ADD-CUSTOMER. DISPLAY "Adding customer..." *> Add customer logic here DISPLAY "Customer added successfully." VIEW-CUSTOMER. DISPLAY "Viewing customer..." *> View customer logic here UPDATE-CUSTOMER. DISPLAY "Updating customer..." *> Update customer logic here DELETE-CUSTOMER. DISPLAY "Deleting customer..." *> Delete customer logic here.
This menu structure provides a clear, navigable interface. The menu displays options, accepts the user's choice, processes it using EVALUATE, and loops back until the user chooses to exit. Each menu option calls a specific procedure to handle that function.
A more robust menu includes input validation to ensure users enter valid choices:
123456789101112131415161718192021222324252627282930313233343536373839WORKING-STORAGE SECTION. 01 MENU-CHOICE PIC X(1). 01 VALID-CHOICE PIC X(1) VALUE 'N'. 88 CHOICE-IS-VALID VALUE 'Y'. 88 CHOICE-IS-INVALID VALUE 'N'. 01 RETRY-COUNT PIC 9(2) VALUE 0. 01 MAX-RETRIES PIC 9(2) VALUE 3. PROCEDURE DIVISION. MAIN-MENU. PERFORM UNTIL EXIT-PROGRAM PERFORM DISPLAY-MENU PERFORM GET-VALID-CHOICE IF CHOICE-IS-VALID PERFORM PROCESS-CHOICE END-IF END-PERFORM STOP RUN. GET-VALID-CHOICE. MOVE 'N' TO VALID-CHOICE MOVE 0 TO RETRY-COUNT PERFORM UNTIL CHOICE-IS-VALID OR RETRY-COUNT >= MAX-RETRIES ACCEPT MENU-CHOICE IF MENU-CHOICE >= '1' AND MENU-CHOICE <= '5' MOVE 'Y' TO VALID-CHOICE ELSE ADD 1 TO RETRY-COUNT IF RETRY-COUNT < MAX-RETRIES DISPLAY "Invalid choice. Please enter 1-5: " WITH NO ADVANCING ELSE DISPLAY "Maximum retries exceeded. Exiting menu." MOVE 'N' TO CONTINUE-FLAG END-IF END-IF END-PERFORM.
This enhanced menu validates the user's choice, provides error messages for invalid input, limits retry attempts, and handles edge cases gracefully. This creates a more robust and user-friendly interface.
Input validation is critical in interactive programs to ensure data quality, prevent errors, and provide a good user experience. Validation checks input for format, range, type, and business rules before processing.
Common validation types include:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657WORKING-STORAGE SECTION. 01 USER-INPUT PIC X(20). 01 NUMERIC-VALUE PIC 9(5). 01 VALID-INPUT PIC X(1) VALUE 'N'. 88 INPUT-IS-VALID VALUE 'Y'. 88 INPUT-IS-INVALID VALUE 'N'. 01 RETRY-COUNT PIC 9(2) VALUE 0. 01 MAX-RETRIES PIC 9(2) VALUE 3. 01 ERROR-MESSAGE PIC X(50). PROCEDURE DIVISION. MAIN-PARA. PERFORM GET-VALID-NUMBER IF INPUT-IS-VALID DISPLAY "You entered: " NUMERIC-VALUE ELSE DISPLAY "Could not get valid input after " MAX-RETRIES " attempts" END-IF STOP RUN. GET-VALID-NUMBER. MOVE 'N' TO VALID-INPUT MOVE 0 TO RETRY-COUNT PERFORM UNTIL INPUT-IS-VALID OR RETRY-COUNT >= MAX-RETRIES DISPLAY "Enter a number (1-99999): " WITH NO ADVANCING ACCEPT USER-INPUT PERFORM VALIDATE-INPUT IF INPUT-IS-INVALID ADD 1 TO RETRY-COUNT DISPLAY ERROR-MESSAGE IF RETRY-COUNT < MAX-RETRIES DISPLAY "Please try again. Attempts remaining: " (MAX-RETRIES - RETRY-COUNT) END-IF END-IF END-PERFORM. VALIDATE-INPUT. MOVE 'Y' TO VALID-INPUT MOVE SPACES TO ERROR-MESSAGE *> Check if input is numeric IF USER-INPUT IS NOT NUMERIC MOVE 'N' TO VALID-INPUT MOVE "Input must be numeric" TO ERROR-MESSAGE EXIT PARAGRAPH END-IF *> Convert to numeric and check range MOVE USER-INPUT TO NUMERIC-VALUE IF NUMERIC-VALUE < 1 OR NUMERIC-VALUE > 99999 MOVE 'N' TO VALID-INPUT MOVE "Number must be between 1 and 99999" TO ERROR-MESSAGE END-IF.
This validation pattern accepts input, validates it using multiple checks, displays helpful error messages, allows retries with a limit, and only proceeds when input is valid. The validation is comprehensive and user-friendly.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859WORKING-STORAGE SECTION. 01 CUSTOMER-ID-INPUT PIC X(10). 01 CUSTOMER-ID PIC X(10). 01 VALID-ID PIC X(1) VALUE 'N'. 88 ID-IS-VALID VALUE 'Y'. 01 RETRY-COUNT PIC 9(2) VALUE 0. 01 MAX-RETRIES PIC 9(2) VALUE 3. PROCEDURE DIVISION. MAIN-PARA. PERFORM GET-VALID-CUSTOMER-ID IF ID-IS-VALID DISPLAY "Valid customer ID accepted: " CUSTOMER-ID END-IF STOP RUN. GET-VALID-CUSTOMER-ID. MOVE 'N' TO VALID-ID MOVE 0 TO RETRY-COUNT PERFORM UNTIL ID-IS-VALID OR RETRY-COUNT >= MAX-RETRIES DISPLAY "Enter customer ID (format: CUST######): " WITH NO ADVANCING ACCEPT CUSTOMER-ID-INPUT PERFORM VALIDATE-CUSTOMER-ID IF ID-IS-VALID MOVE CUSTOMER-ID-INPUT TO CUSTOMER-ID ELSE ADD 1 TO RETRY-COUNT DISPLAY "Invalid format. Customer ID must start with 'CUST' " "followed by 6 digits." IF RETRY-COUNT < MAX-RETRIES DISPLAY "Attempts remaining: " (MAX-RETRIES - RETRY-COUNT) END-IF END-IF END-PERFORM. VALIDATE-CUSTOMER-ID. MOVE 'Y' TO VALID-ID *> Check length IF FUNCTION LENGTH(FUNCTION TRIM(CUSTOMER-ID-INPUT)) NOT = 10 MOVE 'N' TO VALID-ID EXIT PARAGRAPH END-IF *> Check prefix IF CUSTOMER-ID-INPUT(1:4) NOT = 'CUST' MOVE 'N' TO VALID-ID EXIT PARAGRAPH END-IF *> Check that remaining characters are numeric IF CUSTOMER-ID-INPUT(5:6) IS NOT NUMERIC MOVE 'N' TO VALID-ID END-IF.
This example demonstrates complex validation that checks multiple conditions: length, prefix format, and numeric suffix. The validation is thorough and provides specific error messages to guide users.
Effective error handling in interactive programs provides immediate feedback, prevents program crashes, and guides users to correct errors. Good error handling includes clear error messages, retry mechanisms, and graceful degradation.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849WORKING-STORAGE SECTION. 01 USER-INPUT PIC X(50). 01 PROCESSING-FLAG PIC X(1) VALUE 'Y'. 88 CONTINUE-PROCESSING VALUE 'Y'. 88 STOP-PROCESSING VALUE 'N'. 01 ERROR-COUNT PIC 9(3) VALUE 0. 01 SUCCESS-COUNT PIC 9(3) VALUE 0. PROCEDURE DIVISION. MAIN-PARA. PERFORM PROCESS-WITH-ERROR-HANDLING DISPLAY "Processing complete. Successes: " SUCCESS-COUNT " Errors: " ERROR-COUNT STOP RUN. PROCESS-WITH-ERROR-HANDLING. PERFORM UNTIL STOP-PROCESSING DISPLAY "Enter data (or 'EXIT' to quit): " WITH NO ADVANCING ACCEPT USER-INPUT IF FUNCTION UPPER-CASE(USER-INPUT) = 'EXIT' MOVE 'N' TO PROCESSING-FLAG ELSE PERFORM PROCESS-INPUT END-IF END-PERFORM. PROCESS-INPUT. *> Attempt to process input IF USER-INPUT = SPACES ADD 1 TO ERROR-COUNT DISPLAY "ERROR: Input cannot be empty" ELSE IF USER-INPUT IS NUMERIC PERFORM VALIDATE-AND-PROCESS-NUMERIC ELSE PERFORM VALIDATE-AND-PROCESS-TEXT END-IF END-IF. VALIDATE-AND-PROCESS-NUMERIC. *> Additional validation and processing ADD 1 TO SUCCESS-COUNT DISPLAY "Numeric input processed successfully". VALIDATE-AND-PROCESS-TEXT. *> Additional validation and processing ADD 1 TO SUCCESS-COUNT DISPLAY "Text input processed successfully".
This error handling pattern tracks errors and successes, provides clear error messages, allows users to exit gracefully, and continues processing even when errors occur. This creates a robust, user-friendly program.
Here's a complete example that demonstrates interactive programming concepts:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181IDENTIFICATION DIVISION. PROGRAM-ID. INTERACTIVE-CUSTOMER-SYSTEM. AUTHOR. MainframeMaster Tutorial. REMARKS. Complete interactive program demonstrating ACCEPT, DISPLAY, menu-driven interface, input validation, and error handling. DATA DIVISION. WORKING-STORAGE SECTION. 01 MENU-CHOICE PIC X(1). 01 CONTINUE-FLAG PIC X(1) VALUE 'Y'. 88 CONTINUE-PROGRAM VALUE 'Y'. 88 EXIT-PROGRAM VALUE 'N'. 01 CUSTOMER-DATA. 05 CUSTOMER-ID PIC X(10). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-BALANCE PIC 9(8)V99 VALUE 0. 01 INPUT-VALIDATION. 05 VALID-INPUT PIC X(1) VALUE 'N'. 88 INPUT-IS-VALID VALUE 'Y'. 88 INPUT-IS-INVALID VALUE 'N'. 05 RETRY-COUNT PIC 9(2) VALUE 0. 05 MAX-RETRIES PIC 9(2) VALUE 3. 05 ERROR-MESSAGE PIC X(80). PROCEDURE DIVISION. MAIN-PROGRAM. DISPLAY "========================================" DISPLAY " CUSTOMER MANAGEMENT SYSTEM" DISPLAY "========================================" DISPLAY " " PERFORM UNTIL EXIT-PROGRAM PERFORM DISPLAY-MAIN-MENU PERFORM GET-MENU-CHOICE PERFORM PROCESS-MENU-CHOICE END-PERFORM DISPLAY " " DISPLAY "Thank you for using the Customer Management System!" STOP RUN. DISPLAY-MAIN-MENU. DISPLAY " " DISPLAY "=== MAIN MENU ===" DISPLAY "1. Add New Customer" DISPLAY "2. View Customer Information" DISPLAY "3. Update Customer Balance" DISPLAY "4. Display All Customers" DISPLAY "5. Exit" DISPLAY " " DISPLAY "Enter your choice (1-5): " WITH NO ADVANCING. GET-MENU-CHOICE. ACCEPT MENU-CHOICE. PROCESS-MENU-CHOICE. EVALUATE MENU-CHOICE WHEN '1' PERFORM ADD-CUSTOMER WHEN '2' PERFORM VIEW-CUSTOMER WHEN '3' PERFORM UPDATE-BALANCE WHEN '4' PERFORM DISPLAY-ALL-CUSTOMERS WHEN '5' MOVE 'N' TO CONTINUE-FLAG WHEN OTHER DISPLAY "Invalid choice. Please select 1-5." END-EVALUATE. ADD-CUSTOMER. DISPLAY " " DISPLAY "=== ADD NEW CUSTOMER ===" PERFORM GET-VALID-CUSTOMER-ID IF INPUT-IS-VALID PERFORM GET-CUSTOMER-NAME IF INPUT-IS-VALID PERFORM GET-CUSTOMER-BALANCE IF INPUT-IS-VALID DISPLAY " " DISPLAY "Customer added successfully!" DISPLAY "ID: " CUSTOMER-ID DISPLAY "Name: " CUSTOMER-NAME DISPLAY "Balance: $" CUSTOMER-BALANCE END-IF END-IF END-IF. GET-VALID-CUSTOMER-ID. MOVE 'N' TO VALID-INPUT MOVE 0 TO RETRY-COUNT PERFORM UNTIL INPUT-IS-VALID OR RETRY-COUNT >= MAX-RETRIES DISPLAY "Enter Customer ID (10 characters): " WITH NO ADVANCING ACCEPT CUSTOMER-ID IF CUSTOMER-ID = SPACES ADD 1 TO RETRY-COUNT MOVE "Customer ID cannot be empty" TO ERROR-MESSAGE DISPLAY ERROR-MESSAGE ELSE IF FUNCTION LENGTH(FUNCTION TRIM(CUSTOMER-ID)) < 5 ADD 1 TO RETRY-COUNT MOVE "Customer ID must be at least 5 characters" TO ERROR-MESSAGE DISPLAY ERROR-MESSAGE ELSE MOVE 'Y' TO VALID-INPUT END-IF END-IF IF INPUT-IS-INVALID AND RETRY-COUNT < MAX-RETRIES DISPLAY "Please try again. Attempts remaining: " (MAX-RETRIES - RETRY-COUNT) END-IF END-PERFORM. GET-CUSTOMER-NAME. MOVE 'N' TO VALID-INPUT MOVE 0 TO RETRY-COUNT PERFORM UNTIL INPUT-IS-VALID OR RETRY-COUNT >= MAX-RETRIES DISPLAY "Enter Customer Name (max 30 characters): " WITH NO ADVANCING ACCEPT CUSTOMER-NAME IF CUSTOMER-NAME = SPACES ADD 1 TO RETRY-COUNT DISPLAY "Customer name cannot be empty" ELSE MOVE 'Y' TO VALID-INPUT END-IF END-PERFORM. GET-CUSTOMER-BALANCE. MOVE 'N' TO VALID-INPUT MOVE 0 TO RETRY-COUNT PERFORM UNTIL INPUT-IS-VALID OR RETRY-COUNT >= MAX-RETRIES DISPLAY "Enter Customer Balance: " WITH NO ADVANCING ACCEPT CUSTOMER-BALANCE IF CUSTOMER-BALANCE IS NOT NUMERIC ADD 1 TO RETRY-COUNT DISPLAY "Balance must be numeric" ELSE IF CUSTOMER-BALANCE < 0 ADD 1 TO RETRY-COUNT DISPLAY "Balance cannot be negative" ELSE MOVE 'Y' TO VALID-INPUT END-IF END-IF END-PERFORM. VIEW-CUSTOMER. DISPLAY " " DISPLAY "=== VIEW CUSTOMER ===" DISPLAY "Customer ID: " CUSTOMER-ID DISPLAY "Customer Name: " CUSTOMER-NAME DISPLAY "Balance: $" CUSTOMER-BALANCE. UPDATE-BALANCE. DISPLAY " " DISPLAY "=== UPDATE CUSTOMER BALANCE ===" DISPLAY "Current balance: $" CUSTOMER-BALANCE PERFORM GET-CUSTOMER-BALANCE IF INPUT-IS-VALID DISPLAY "Balance updated to: $" CUSTOMER-BALANCE END-IF. DISPLAY-ALL-CUSTOMERS. DISPLAY " " DISPLAY "=== ALL CUSTOMERS ===" DISPLAY "ID: " CUSTOMER-ID " | Name: " CUSTOMER-NAME " | Balance: $" CUSTOMER-BALANCE.
This complete example demonstrates all key interactive programming concepts: menu-driven interface, input validation with retry loops, error handling, user prompts, and structured program flow. It provides a solid foundation for building interactive COBOL applications.
Follow these best practices to create effective, user-friendly interactive programs:
123DISPLAY "Enter value: " WITH NO ADVANCING ACCEPT USER-VALUE DISPLAY "You entered: " USER-VALUE
123456789MOVE 'N' TO VALID-INPUT PERFORM UNTIL INPUT-IS-VALID DISPLAY "Enter value: " WITH NO ADVANCING ACCEPT USER-VALUE PERFORM VALIDATE-INPUT IF INPUT-IS-INVALID DISPLAY "Invalid input. Please try again." END-IF END-PERFORM
123456MOVE 'Y' TO CONTINUE-FLAG PERFORM UNTIL EXIT-PROGRAM PERFORM DISPLAY-MENU ACCEPT MENU-CHOICE PERFORM PROCESS-CHOICE END-PERFORM
1234567DISPLAY "Are you sure? (Y/N): " WITH NO ADVANCING ACCEPT CONFIRM-RESPONSE IF FUNCTION UPPER-CASE(CONFIRM-RESPONSE) = 'Y' PERFORM CONFIRMED-ACTION ELSE DISPLAY "Action cancelled." END-IF
Think of interactive programming like having a conversation:
So interactive programming is just a way for your COBOL program to have a conversation with the user - asking questions, getting answers, and responding based on what the user says!
Complete these exercises to reinforce your understanding:
Create a program that asks for the user's name, age, and favorite color, then displays a personalized message using all three pieces of information.
Create an interactive number guessing game where the program generates a random number (or uses a fixed number), prompts the user to guess, provides feedback (too high, too low, correct), and allows multiple guesses until the user gets it right.
Create a menu-driven calculator that allows users to select operations (add, subtract, multiply, divide), enter two numbers, perform the calculation, display the result, and return to the menu. Include input validation for numeric input.
Create a data entry system that accepts customer information (ID, name, email, phone) with validation for each field. Validate that IDs are alphanumeric, names are alphabetic, emails contain '@', and phone numbers are numeric. Allow retries for invalid input.
Create a program with a main menu and sub-menus. The main menu has options like "Customer Management" and "Order Management". Each option leads to a sub-menu with specific functions. Include navigation back to the main menu and an exit option at each level.
1. What is the primary purpose of interactive programming in COBOL?
2. Which statement is used to get input from the user in COBOL?
3. What does WITH NO ADVANCING do in a DISPLAY statement?
4. How do you create a menu-driven interface in COBOL?
5. What is the best way to validate user input in an interactive program?
6. What is the difference between interactive and batch COBOL programs?
7. How do you create a loop that continues until valid input is received?
8. What should you always include when validating user input?