Program logic in CICS refers to the structure, patterns, and conventions used when coding CICS applications. Understanding CICS-specific programming patterns is essential for creating robust, efficient, and maintainable mainframe applications.
CICS programs are invoked as transactions, which means they start from a known state and execute until completion:
12345678910111213141516PROGRAM-ID. ORDER-PROCESSOR IS PROCESSING PROGRAM. WORKING-STORAGE SECTION. 01 WS-CURRENT-DATE PIC X(10). 01 WS-TRANSACTION-ID PIC X(4) VALUE 'ORD1'. PROCEDURE DIVISION. 0000-MAIN-LOGIC. PERFORM INITIALIZE-PROGRAM PERFORM READ-TERMINAL-INPUT PERFORM VALIDATE-INPUT-DATA PERFORM PROCESS-BUSINESS-LOGIC PERFORM WRITE-TERMINAL-OUTPUT PERFORM TERMINATE-PROGRAM 0000-EXIT. EXEC CICS RETURN END-EXEC.
CICS programs typically maintain state through working storage variables and external data storage:
1234567891011WORKING-STORAGE SECTION. 01 WS-PROGRAM-STATE. 10 WS-INITIALIZATION-COMPLETE PIC X(1) VALUE 'N'. 10 WS-DATA-VALIDATION-STATUS PIC X(1) VALUE 'N'. 10 WS-PROCESSING-STATUS PIC X(1) VALUE 'N'. 10 WS-OUTPUT-GENERATED PIC X(1) VALUE 'N'. 01 WS-CURRENT-TIME. 10 WS-HOURS PIC 99. 10 WS-MINUTES PIC 99. 10 WS-SECONDS PIC 99.
Initialize program state at startup:
123456789101112131415161718INITIALIZE-PROGRAM. MOVE 'N' TO WS-INITIALIZATION-COMPLETE MOVE 'N' TO WS-DATA-VALIDATION-STATUS MOVE 'N' TO WS-PROCESSING-STATUS MOVE 'N' TO WS-OUTPUT-GENERATED EXEC CICS ASKTIME ABSTIME(WS-ABSOLUTE-TIME) RESP(WS-RESPONSE) END-EXEC. EXEC CICS FORMATTIME ABSTIME(WS-ABSOLUTE-TIME) TIME(WS-CURRENT-TIME) RESP(WS-RESPONSE) END-EXEC. MOVE 'Y' TO WS-INITIALIZATION-COMPLETE.
Simple sequential processing from input to output:
123456SEQUENTIAL-PROCESSING. PERFORM READ-INPUT-DATA PERFORM PROCESS-BUSINESS-RULES PERFORM UPDATE-DATABASE PERFORM SEND-OUTPUT-DATA PERFORM CLEANUP-RESOURCES.
Interactive programs presenting multiple options:
123456789101112131415161718192021MENU-DRIVEN-PATTERN. PERFORM DISPLAY-MENU-OPTIONS PERFORM UNTIL WS-EXIT-SELECTED PERFORM READ-USER-SELECTION EVALUATE WS-USER-SELECTION WHEN '1' PERFORM OPTION-CREATE-ACCOUNT WHEN '2' PERFORM OPTION-INQUIRE-ACCOUNT WHEN '3' PERFORM OPTION-UPDATE-ACCOUNT WHEN 'D' PERFORM OPTION-DELETE-ACCOUNT WHEN 'X' SET WS-EXIT-SELECTED TO TRUE WHEN OTHER PERFORM DISPLAY-INVALID-SELECTION END-EVALUATE END-PERFORM.
Programs that validate input before processing:
123456789101112131415VALIDATION-DRIVEN-PATTERN. PERFORM READ-INPUT-DATA PERFORM UNTIL WS-VALIDATION-SUCCESSFUL PERFORM VALIDATE-DATA-FORMAT PERFORM VALIDATE-DATA-CONTENT PERFORM VALIDATE-BUSINESS-RULES IF WS-VALIDATION-SUCCESSFUL PERFORM PROCESS-VALIDATED-DATA ELSE PERFORM DISPLAY-VALIDATION-ERRORS PERFORM READ-INPUT-DATA-AGAIN END-IF END-PERFORM.
Always check CICS response codes for successful completion:
123456789101112131415161718192021222324WORKING-STORAGE SECTION. 01 WS-RESPONSE-CODES. 02 WS-RESPONSE PIC S9(8) COMP. 02 WS-RESPONSE2 PIC S9(8) COMP. PROCEDURE DIVISION. STANDARD-CICS-CALL. EXEC CICS READ FILE('CUSTOMER') INTO(WS-CUSTOMER-RECORD) RIDFLD(WS-CUSTOMER-ID) RESP(WS-RESPONSE) END-EXEC. EVALUATE WS-RESPONSE WHEN DFHRESP(NORMAL) PERFORM PROCESS-CUSTOMER-RECORD WHEN DFHRESP(NOTFND) PERFORM HANDLE-CUSTOMER-NOT-FOUND WHEN DFHRESP(FILEERR) WHEN DFHRESP(IOERR) PERFORM HANDLE-FILE-ERROR WHEN OTHER PERFORM HANDLE-UNEXPECTED-ERROR END-EVALUATE.
Implement fallback logic when primary operations fail:
12345678910111213141516GRACEFUL-DEGRADATION. PERFORM ATTEMPT-PRIMARY-PROCESSING P IF WS-PRIMARY-SUCCESSFUL PERFORM PRIMARY-PROCESSING-COMPLETION ELSE DISPLAY 'WARNING: Primary processing failed' PERFORM ATTEMPT-SECONDARY-PROCESSING IF WS-SECONDARY-SUCCESSFUL DISPLAY 'Secondary processing successful' ELSE PERFORM HANDLE-COMPLETE-FAILURE END-IF END-IF.
Standard pattern for database operations:
123456789101112131415161718192021222324DATABASE-ACCESS-PATTERN. * Open transaction context PERFORM BEGIN-TRANSACTION PERFORM VARYING WS-RECORD-COUNT FROM 1 BY 1 UNTIL WS-RECORD-COUNT > WS-TOTAL-RECORDS PERFORM READ-DATABASE-RECORD IF WS-RESPONSE = DFHRESP(NORMAL) PERFORM UPDATE-RECORD-FIELDS PERFORM WRITE-DATABASE-RECORD ELSE PERFORM HANDLE-DATABASE-ERROR END-IF END-PERFORM. * Commit transaction PERFORM COMMIT-TRANSACTION. BEGIN-TRANSACTION. EXEC CICS START TRANSID('SQ02') RESP(WS-RESPONSE) END-EXEC.
Sequential file processing:
12345678910111213141516171819202122232425262728SEQUENTIAL-FILE-PATTERN. EXEC CICS STARTBR FILE('ORDER-FILE') GTEQ KEY(WS-START-KEY) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE = DFHRESP(NORMAL) PERFORM UNTIL WS-END-OF-FILE EXEC CICS READNEXT FILE('ORDER-FILE') INTO(WS-ORDER-RECORD) RESP(WS-RESPONSE) END-EXEC EVALUATE WS-RESPONSE WHEN DFHRESP(NORMAL) PERFORM PROCESS-ORDER-RECORD WHEN DFHRESP(END) SET WS-END-OF-FILE TO TRUE WHEN OTHER PERFORM HANDLE-FILE-ERROR SET WS-END-OF-FILE TO TRUE END-EVALUATE END-PERFORM EXEC CICS ENDBR FILE('ORDER-FILE') RESP(WS-RESPONSE) END-EXEC END-IF.
Standard pattern for update operations:
1234567891011121314151617READ-MODIFY-WRITE-PATTERN. PERFORM READ-DATABASE-RECORD IF WS-RESPONSE = DFHRESP(NORMAL) PERFORM UPDATE-RECORD-FIELDS * Check if modification is needed IF WS-DATA-CHANGED PERFORM WRITE-DATABASE-RECORD IF WS-RESPONSE NOT = DFHRESP(NORMAL) PERFORM HANDLE-WRITE-ERROR END-IF END-IF ELSE PERFORM HANDLE-READ-ERROR END-IF.
Handle abend conditions gracefully:
1234567891011121314151617181920212223WORKING-STORAGE SECTION. 01 WS-ABEND-HANDLER. 02 WS-ABEND-AVAILABLE PIC X(1). 02 WS-ABEND-TIME PIC X(26). HANDLE-ABEND-LOGIC. PERFORM RESET-RESPONSE-AREA * Start abend monitoring EXEC CICS HANDLE ABEND LABEL(ABEND-EXIT-ONLY) RESP(WS-RESPONSE) END-EXEC. * Perform potentially problematic operation PERFORM HIGH-RISK-OPERATION * Normal completion EXEC CICS RETURN END-EXEC. ABEND-EXIT-ONLY. EXEC CICS ASSIGN ABEND-INFO(WS-ABEND-TIME) RESP(WS-RESPONSE) END-EXEC.
Dedicated module for handling screen I/O:
1234567891011121314151617181920SCREEN-PROCESSING-MODULE. PERFORM MAP-NAME-RETRIEVEBUSINESS EVALUATE WS-RESPONSE WHEN DFHRESP(NORMAL) MOVE EIBAID TO WS-PF-KEY EVALUATE WS-PF-KEY WHEN DFHPF1 PERFORM PROCESS-FUNCTION-1 WHEN DFHPF2 PERFORM PROCESS-FUNCTION-2 WHEN DFHENTER PERFORM PROCESS-ENTER-KEY WHEN OTHER PERFORM DISPLAY-INVALID-KEY END-EVALUATE WHEN DFHRESP(MAPERROR) PERFORM HANDLE-MAP-ERROR END-EVALUATE.
Separate business logic from I/O operations:
123456789BUSINESS-LOGIC-MODULE. * Validate business rules PERFORM VALIDATE-CUSTOMER-CREDIT PERFORM VALIDATE-PRODUCT-AVAILABILITY PERFORM CALCULATE-ORDER-TOTAL PERFORM APPLY-DISCOUNTS PERFORM CALCULATE-TAX PERFORM COMPUTE-FINAL-COST PERFORM UPDATE-INVENTORY-LEVELS.
Design efficient data structures for performance:
| Operation | Best Practice | Avoid |
|---|---|---|
| File Access | Use exact keys | Full table scans |
| Memory Usage | Reuse storage areas | Frequent GETMAIN/FREEMAIN |
| Resource Acquisition | Acquire once, use multiple | Multiple allocate/deallocate |
| Error Handling | Check after operations | Ignore response codes |
Optimize resource usage in programs:
1234567891011121314151617RESOURCE-OPTIMIZATION. * Allocate resources at initialization EXEC CICS GETMAIN SET(WS-BUFFER-PTR) LENGTH(WS-BUFFER-LENGTH) INITIMG(SPACES) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE = DFHRESP(NORMAL) SET ADDRESS OF WS-BUFFER TO WS-BUFFER-PTR * Use buffer for multiple operations... END-IF. * Free resources at termination FINALE-CLEANUP. IF WS-BUFFER-PTR NOT = NULL EXEC CICS FREEMAIN DATA(WS-BUFFER-PTR) RESP(WS-RESPONSE) END-EXEC END-IF.
Structure programs for easy testing:
12345678910111213TESTABLE-PROGRAM-STRUCTURE. * Main entry point PROCEDURE DIVISION USING WS-TEST-PARMS. PERFORM INITIALIZE-PROGRAM PERFORM MAIN-LOGIC PERFORM TERMINATE-PROGRAM. MAIN-LOGIC. IF WS-TEST-MODE = 'Y' PERFORM DUMMY-PROGRAM-ACTION ELSE PERFORM REAL-PROGRAM-ACTION END-IF.
Design for integration testing:
1234567891011INTEGRATION-TESTING-LOGIC. * Check if running in test environment PERFORM GET-CURRENT-RESTART-TICKET PERFORM CHECK-RESTART-TICKET IF WS-RECOVERY-SUCCESSFUL = 'Y' PERFORM LOG-TEST-COMPLETION PERFORM MARK-TICKET-COMPLETE END-IF. PERFORM TICKET-TRACKING-FUNCTION.