MainframeMaster

CICS Program Logic

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.

Core CICS Programming Concepts

Transaction-Based Programming

CICS programs are invoked as transactions, which means they start from a known state and execute until completion:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PROGRAM-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.

State Management

CICS programs typically maintain state through working storage variables and external data storage:

cobol
1
2
3
4
5
6
7
8
9
10
11
WORKING-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:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
INITIALIZE-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.

Program Flow Patterns

Linear Processing Pattern

Simple sequential processing from input to output:

cobol
1
2
3
4
5
6
SEQUENTIAL-PROCESSING. PERFORM READ-INPUT-DATA PERFORM PROCESS-BUSINESS-RULES PERFORM UPDATE-DATABASE PERFORM SEND-OUTPUT-DATA PERFORM CLEANUP-RESOURCES.

Menu-Driven Pattern

Interactive programs presenting multiple options:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MENU-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.

Validation-Driven Pattern

Programs that validate input before processing:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
VALIDATION-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.

Error Handling Logic

Response Code Checking

Always check CICS response codes for successful completion:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WORKING-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.

Graceful Degradation

Implement fallback logic when primary operations fail:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GRACEFUL-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.

Data Access Patterns

Database Access Pattern

Standard pattern for database operations:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DATABASE-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.

File Access Pattern

Sequential file processing:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SEQUENTIAL-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.

Transaction Control Logic

The READ/MODIFY/WRITE Pattern

Standard pattern for update operations:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
READ-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.

Abend Handling Pattern

Handle abend conditions gracefully:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
WORKING-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.

Modular Design Patterns

Screen Processing Module

Dedicated module for handling screen I/O:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SCREEN-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.

Business Logic Module

Separate business logic from I/O operations:

cobol
1
2
3
4
5
6
7
8
9
BUSINESS-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.

Performance Considerations

Efficient Data Structures

Design efficient data structures for performance:

OperationBest PracticeAvoid
File AccessUse exact keysFull table scans
Memory UsageReuse storage areasFrequent GETMAIN/FREEMAIN
Resource AcquisitionAcquire once, use multipleMultiple allocate/deallocate
Error HandlingCheck after operationsIgnore response codes

Resource Optimization

Optimize resource usage in programs:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
RESOURCE-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.

Testing Strategies

Unit Testing Patterns

Structure programs for easy testing:

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
TESTABLE-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.

Integration Testing

Design for integration testing:

cobol
1
2
3
4
5
6
7
8
9
10
11
INTEGRATION-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.

Best Practices Summary

Program Organization

  • Always include proper initialization logic
  • Separate I/O logic from business logic
  • Use meaningful paragraph names
  • Implement comprehensive error handling
  • Clean up resources before termination

Error Handling

  • Check all CICS response codes
  • Log errors for debugging
  • Provide meaningful error messages
  • Implement graceful degradation
  • Never ignore unexpected conditions

Performance

  • Avoid unnecessary CICS commands
  • Use efficient data structures
  • Minimize resource allocation/deallocation
  • Optimize file access patterns
  • Monitor resource usage