Dynamic programming in COBOL enables programs to adapt and allocate resources at runtime rather than at compile time. This includes dynamic tables with variable sizes, dynamic program calls, runtime flexibility in data structures, and adaptive behavior based on runtime conditions. Understanding dynamic programming is essential for building flexible COBOL applications that can handle variable amounts of data, adapt to different runtime scenarios, and efficiently use system resources in mainframe environments.
Dynamic programming techniques allow COBOL programs to:
These capabilities make COBOL programs more flexible and efficient, especially when dealing with variable or unknown data volumes.
Dynamic tables use the DEPENDING ON clause to vary their size at runtime:
1234level-number data-name OCCURS 1 TO max-size TIMES DEPENDING ON size-field [INDEXED BY index-name].
Components:
12345678910111213141516171819202122232425262728293031323334353637383940WORKING-STORAGE SECTION. 01 TABLE-SIZE PIC 9(4) VALUE 0. 01 MAX-SIZE PIC 9(4) VALUE 1000. 01 CUSTOMER-TABLE. 05 CUSTOMER-ENTRY OCCURS 1 TO 1000 TIMES DEPENDING ON TABLE-SIZE INDEXED BY CUST-INDEX. 10 CUSTOMER-ID PIC 9(5). 10 CUSTOMER-NAME PIC X(30). 10 CUSTOMER-BALANCE PIC 9(8)V99. PROCEDURE DIVISION. MAIN-PARA. *> Read number of customers from input ACCEPT TABLE-SIZE *> Validate size IF TABLE-SIZE > MAX-SIZE DISPLAY "ERROR: Size exceeds maximum" STOP RUN END-IF IF TABLE-SIZE = 0 DISPLAY "No customers to process" STOP RUN END-IF *> Process the dynamic table PERFORM PROCESS-CUSTOMERS STOP RUN. PROCESS-CUSTOMERS. PERFORM VARYING CUST-INDEX FROM 1 BY 1 UNTIL CUST-INDEX > TABLE-SIZE *> Read customer data ACCEPT CUSTOMER-ID(CUST-INDEX) ACCEPT CUSTOMER-NAME(CUST-INDEX) ACCEPT CUSTOMER-BALANCE(CUST-INDEX) END-PERFORM.
This example demonstrates a dynamic table where the size is determined at runtime based on input. The table can hold up to 1000 elements, but only TABLE-SIZE elements are active.
12345678910111213141516171819202122232425262728293031WORKING-STORAGE SECTION. 01 ITEM-COUNT PIC 9(4) VALUE 50. 01 ITEM-TABLE. 05 ITEM-ENTRY OCCURS 1 TO 500 TIMES DEPENDING ON ITEM-COUNT INDEXED BY ITEM-INDEX. 10 ITEM-CODE PIC 9(5). 10 ITEM-NAME PIC X(30). PROCEDURE DIVISION. MAIN-PARA. *> Start with 50 items MOVE 50 TO ITEM-COUNT PERFORM PROCESS-ITEMS *> Add more items ADD 25 TO ITEM-COUNT PERFORM PROCESS-ITEMS *> Reduce items SUBTRACT 10 FROM ITEM-COUNT PERFORM PROCESS-ITEMS STOP RUN. PROCESS-ITEMS. DISPLAY "Processing " ITEM-COUNT " items" PERFORM VARYING ITEM-INDEX FROM 1 BY 1 UNTIL ITEM-INDEX > ITEM-COUNT *> Process ITEM-ENTRY(ITEM-INDEX) END-PERFORM.
You can change the table size by modifying the DEPENDING ON field. The table adapts to the new size immediately.
Always validate dynamic table sizes to prevent errors:
12345678910111213141516171819202122232425262728293031323334353637383940WORKING-STORAGE SECTION. 01 TABLE-COUNT PIC 9(4) VALUE 0. 01 MAX-TABLE-SIZE PIC 9(4) VALUE 1000. 01 MIN-TABLE-SIZE PIC 9(4) VALUE 1. 01 CUSTOMER-TABLE. 05 CUSTOMER-ENTRY OCCURS 1 TO 1000 TIMES DEPENDING ON TABLE-COUNT INDEXED BY CUST-INDEX. 10 CUSTOMER-DATA PIC X(50). PROCEDURE DIVISION. MAIN-PARA. *> Get table size from input ACCEPT TABLE-COUNT *> Validate size IF TABLE-COUNT < MIN-TABLE-SIZE DISPLAY "ERROR: Size too small: " TABLE-COUNT MOVE MIN-TABLE-SIZE TO TABLE-COUNT DISPLAY "Using minimum size: " TABLE-COUNT END-IF IF TABLE-COUNT > MAX-TABLE-SIZE DISPLAY "ERROR: Size exceeds maximum: " TABLE-COUNT DISPLAY "Maximum allowed: " MAX-TABLE-SIZE MOVE MAX-TABLE-SIZE TO TABLE-COUNT DISPLAY "Using maximum size: " TABLE-COUNT END-IF IF TABLE-COUNT = 0 DISPLAY "WARNING: Table size is zero" DISPLAY "No processing will occur" END-IF *> Now safe to use table IF TABLE-COUNT > 0 PERFORM PROCESS-TABLE END-IF STOP RUN.
Validation ensures the table size is within acceptable limits and prevents runtime errors from invalid subscripts or indices.
Dynamic program calls allow selecting which program to call at runtime:
1234567891011121314151617*> Static call (compile-time program name) CALL "CALCULATE-TAX" USING AMOUNT TAX-RATE TAX-AMOUNT END-CALL *> Dynamic call (runtime program name) WORKING-STORAGE SECTION. 01 PROGRAM-NAME PIC X(30) VALUE 'CALCULATE-TAX'. PROCEDURE DIVISION. MAIN-PARA. *> Call program using variable CALL PROGRAM-NAME USING AMOUNT TAX-RATE TAX-AMOUNT ON EXCEPTION DISPLAY "Program " PROGRAM-NAME " not found" END-CALL.
Dynamic calls use a variable for the program name, allowing runtime selection of which program to execute.
1234567891011121314151617181920212223242526272829303132333435WORKING-STORAGE SECTION. 01 CALCULATION-TYPE PIC X(10). 01 PROGRAM-NAME PIC X(30). 01 AMOUNT PIC 9(8)V99. 01 RESULT PIC 9(8)V99. PROCEDURE DIVISION. MAIN-PARA. ACCEPT CALCULATION-TYPE ACCEPT AMOUNT *> Select program based on type EVALUATE CALCULATION-TYPE WHEN 'TAX' MOVE 'CALCULATE-TAX' TO PROGRAM-NAME WHEN 'DISCOUNT' MOVE 'CALCULATE-DISCOUNT' TO PROGRAM-NAME WHEN 'COMMISSION' MOVE 'CALCULATE-COMMISSION' TO PROGRAM-NAME WHEN OTHER DISPLAY "Unknown calculation type" STOP RUN END-EVALUATE *> Call selected program dynamically CALL PROGRAM-NAME USING AMOUNT RETURNING RESULT ON EXCEPTION DISPLAY "ERROR: Program " PROGRAM-NAME " not found" END-CALL DISPLAY "Result: " RESULT STOP RUN.
This example demonstrates selecting which calculation program to call based on runtime input, providing flexibility in program execution.
Dynamic programming enables handling variable-length records and variable numbers of items:
1234567891011121314151617181920212223242526272829303132333435363738394041WORKING-STORAGE SECTION. 01 RECORD-COUNT PIC 9(6) VALUE 0. 01 MAX-RECORDS PIC 9(6) VALUE 10000. 01 TRANSACTION-TABLE. 05 TRANSACTION-ENTRY OCCURS 1 TO 10000 TIMES DEPENDING ON RECORD-COUNT INDEXED BY TRANS-INDEX. 10 TRANS-DATE PIC 9(8). 10 TRANS-AMOUNT PIC 9(8)V99. 10 TRANS-DESCRIPTION PIC X(50). PROCEDURE DIVISION. MAIN-PARA. *> Read records until end of file PERFORM UNTIL END-OF-FILE READ INPUT-FILE AT END SET END-OF-FILE TO TRUE NOT AT END ADD 1 TO RECORD-COUNT IF RECORD-COUNT > MAX-RECORDS DISPLAY "WARNING: Exceeded maximum records" SET END-OF-FILE TO TRUE ELSE MOVE INPUT-RECORD TO TRANSACTION-ENTRY(RECORD-COUNT) END-IF END-READ END-PERFORM *> Process only the records actually read DISPLAY "Processing " RECORD-COUNT " transactions" PERFORM PROCESS-TRANSACTIONS STOP RUN. PROCESS-TRANSACTIONS. PERFORM VARYING TRANS-INDEX FROM 1 BY 1 UNTIL TRANS-INDEX > RECORD-COUNT *> Process TRANSACTION-ENTRY(TRANS-INDEX) END-PERFORM.
This pattern allows processing variable numbers of records, adapting to the actual data volume encountered at runtime.
Follow these best practices:
123456789101112131415161718*> Process variable number of input items MOVE 0 TO ITEM-COUNT PERFORM UNTIL END-OF-INPUT READ INPUT-FILE AT END SET END-OF-INPUT TO TRUE NOT AT END ADD 1 TO ITEM-COUNT IF ITEM-COUNT <= MAX-ITEMS MOVE INPUT-RECORD TO ITEM-TABLE(ITEM-COUNT) END-IF END-READ END-PERFORM *> Process items actually read IF ITEM-COUNT > 0 PERFORM PROCESS-ITEMS END-IF
123456789101112131415*> Select program based on runtime condition EVALUATE PROCESSING-TYPE WHEN 'TYPE-A' MOVE 'PROCESS-TYPE-A' TO PROGRAM-NAME WHEN 'TYPE-B' MOVE 'PROCESS-TYPE-B' TO PROGRAM-NAME WHEN OTHER MOVE 'PROCESS-DEFAULT' TO PROGRAM-NAME END-EVALUATE CALL PROGRAM-NAME USING PROCESSING-DATA ON EXCEPTION PERFORM HANDLE-PROGRAM-ERROR END-CALL
1234567891011121314151617*> Start with estimated size MOVE ESTIMATED-SIZE TO TABLE-COUNT *> Process and adjust as needed PERFORM PROCESS-DATA *> If more space needed, increase IF NEED-MORE-SPACE IF TABLE-COUNT < MAX-SIZE ADD INCREMENT TO TABLE-COUNT END-IF END-IF *> If too much space, reduce IF HAVE-EXCESS-SPACE SUBTRACT DECREMENT FROM TABLE-COUNT END-IF
Think of dynamic programming like a flexible container:
So dynamic programming is like having flexible containers and tools that you can adjust based on what you need, rather than having everything fixed in advance!
Complete these exercises to reinforce your understanding:
Create a dynamic table that can hold 1 to 100 items. Read a number from input, set the table size, then read that many items into the table and display them.
Create a dynamic table and demonstrate resizing it multiple times during program execution. Start with 10 items, add 20 more, then reduce by 5, displaying the count at each step.
Create a program that accepts a calculation type (ADD, SUBTRACT, MULTIPLY, DIVIDE) and dynamically calls the appropriate calculation program based on the input.
Create a program that reads a variable number of records from a file into a dynamic table, then processes only the records actually read. Handle the case where no records are found.
Create a dynamic table with proper validation: check for zero size, maximum size, and handle errors appropriately. Include error messages and default behaviors.
1. What clause makes a table dynamic in COBOL?
2. How do you change a dynamic table size at runtime?
3. What is required for dynamic program calls?
4. What is the maximum size of a dynamic table determined by?
5. What should you do before using a dynamic table?
6. What is a key advantage of dynamic programming?