The PERFORM and END-PERFORM statements in COBOL represent sophisticated program flow control and comprehensive iteration management capabilities within enterprise programming environments, providing advanced execution control mechanisms for modular programming, enhanced loop processing features for repetitive operations, and intelligent conditional execution patterns that enable structured program organization, optimal code reusability workflows, and systematic control flow requirements while maintaining execution efficiency, ensuring proper program structure, and enabling scalable programming architectures across business applications requiring controlled execution, iterative processing, and reliable program flow throughout sophisticated enterprise programming scenarios.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101*> Basic PERFORM statement variations PROCEDURE DIVISION. *> Simple PERFORM - execute paragraph once MAIN-PROCESSING. PERFORM INITIALIZE-PROGRAM PERFORM PROCESS-DATA PERFORM CLEANUP-PROGRAM STOP RUN. *> PERFORM TIMES - execute fixed number of times GENERATE-REPORTS. PERFORM PROCESS-MONTHLY-REPORT 12 TIMES PERFORM GENERATE-SUMMARY. *> PERFORM UNTIL - condition-controlled loop PROCESS-FILE-DATA. PERFORM READ-RECORD PERFORM UNTIL EOF-FLAG = 'Y' PERFORM VALIDATE-RECORD PERFORM PROCESS-RECORD PERFORM READ-RECORD END-PERFORM. *> PERFORM VARYING - counter-controlled loop CALCULATE-TOTALS. PERFORM VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 12 PERFORM CALCULATE-MONTHLY-TOTAL PERFORM UPDATE-YEAR-TO-DATE END-PERFORM. *> Inline PERFORM with END-PERFORM VALIDATE-CUSTOMER-DATA. PERFORM UNTIL ALL-VALIDATIONS-COMPLETE IF CUSTOMER-ID = SPACES DISPLAY "Error: Missing Customer ID" ADD 1 TO ERROR-COUNT END-IF IF CUSTOMER-NAME = SPACES DISPLAY "Error: Missing Customer Name" ADD 1 TO ERROR-COUNT END-IF MOVE 'Y' TO ALL-VALIDATIONS-COMPLETE END-PERFORM. *> PERFORM THRU - execute range of paragraphs PROCESS-TRANSACTION. PERFORM VALIDATE-TRANSACTION THRU WRITE-AUDIT-LOG PERFORM UPDATE-ACCOUNT-BALANCE. *> Nested PERFORM statements PROCESS-DEPARTMENTS. PERFORM VARYING DEPT-INDEX FROM 1 BY 1 UNTIL DEPT-INDEX > 10 PERFORM VARYING EMP-INDEX FROM 1 BY 1 UNTIL EMP-INDEX > 50 IF EMPLOYEE-DEPT(EMP-INDEX) = DEPT-INDEX PERFORM CALCULATE-EMPLOYEE-STATS END-IF END-PERFORM PERFORM CALCULATE-DEPT-TOTALS END-PERFORM. *> Individual paragraphs being performed INITIALIZE-PROGRAM. DISPLAY "Initializing program..." MOVE ZEROS TO WS-COUNTERS MOVE SPACES TO WS-WORK-AREAS OPEN INPUT CUSTOMER-FILE OPEN OUTPUT REPORT-FILE. READ-RECORD. READ CUSTOMER-FILE AT END MOVE 'Y' TO EOF-FLAG NOT AT END ADD 1 TO RECORD-COUNT END-READ. CALCULATE-MONTHLY-TOTAL. ADD MONTHLY-SALES(MONTH-INDEX) TO ANNUAL-TOTAL COMPUTE MONTHLY-AVERAGE = MONTHLY-SALES(MONTH-INDEX) / 30. VALIDATE-TRANSACTION. IF TRANSACTION-AMOUNT <= 0 MOVE 'N' TO TRANSACTION-VALID ELSE MOVE 'Y' TO TRANSACTION-VALID END-IF. PROCESS-TRANSACTION-DATA. IF TRANSACTION-VALID = 'Y' PERFORM UPDATE-ACCOUNT-BALANCE PERFORM LOG-TRANSACTION ELSE PERFORM LOG-ERROR END-IF. WRITE-AUDIT-LOG. MOVE CURRENT-DATE-TIME TO AUDIT-TIMESTAMP WRITE AUDIT-RECORD FROM AUDIT-ENTRY
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147*> Advanced PERFORM VARYING with multiple variables PROCESS-MULTI-DIMENSIONAL-DATA. PERFORM VARYING YEAR-INDEX FROM 1 BY 1 UNTIL YEAR-INDEX > 5 VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 12 VARYING DAY-INDEX FROM 1 BY 1 UNTIL DAY-INDEX > 31 IF SALES-DATA(YEAR-INDEX, MONTH-INDEX, DAY-INDEX) > 0 PERFORM ANALYZE-DAILY-SALES PERFORM UPDATE-TREND-ANALYSIS END-IF END-PERFORM. *> PERFORM with complex conditions PROCESS-CONDITIONAL-DATA. PERFORM VARYING RECORD-INDEX FROM 1 BY 1 UNTIL RECORD-INDEX > MAX-RECORDS OR ERROR-COUNT > MAX-ERRORS OR PROCESSING-COMPLETE = 'Y' PERFORM VALIDATE-RECORD-DATA IF RECORD-VALID = 'Y' PERFORM PROCESS-VALID-RECORD ELSE PERFORM HANDLE-INVALID-RECORD ADD 1 TO ERROR-COUNT END-IF IF RECORD-INDEX = MAX-RECORDS MOVE 'Y' TO PROCESSING-COMPLETE END-IF END-PERFORM. *> PERFORM with computed values DYNAMIC-PROCESSING. COMPUTE START-VALUE = CURRENT-YEAR - 5 COMPUTE END-VALUE = CURRENT-YEAR + 1 COMPUTE INCREMENT = 1 PERFORM VARYING YEAR-VALUE FROM START-VALUE BY INCREMENT UNTIL YEAR-VALUE > END-VALUE PERFORM PROCESS-YEARLY-DATA *> Dynamic increment adjustment IF YEAR-VALUE = CURRENT-YEAR COMPUTE INCREMENT = 2 END-IF END-PERFORM. *> PERFORM with table processing PROCESS-EMPLOYEE-TABLE. PERFORM VARYING EMP-SUBSCRIPT FROM 1 BY 1 UNTIL EMP-SUBSCRIPT > EMPLOYEE-COUNT *> Process individual employee PERFORM CALCULATE-GROSS-PAY PERFORM CALCULATE-DEDUCTIONS PERFORM CALCULATE-NET-PAY *> Conditional processing based on employee type EVALUATE EMPLOYEE-TYPE(EMP-SUBSCRIPT) WHEN 'MANAGER' PERFORM CALCULATE-MANAGEMENT-BONUS WHEN 'SALES' PERFORM CALCULATE-COMMISSION WHEN 'HOURLY' PERFORM CALCULATE-OVERTIME END-EVALUATE PERFORM WRITE-PAYROLL-RECORD END-PERFORM. *> Inline PERFORM with complex logic COMPREHENSIVE-VALIDATION. PERFORM UNTIL VALIDATION-COMPLETE = 'Y' MOVE 'Y' TO VALIDATION-COMPLETE *> Financial validation checks IF ACCOUNT-BALANCE < MINIMUM-BALANCE DISPLAY "Warning: Account balance below minimum" MOVE 'N' TO VALIDATION-COMPLETE PERFORM APPLY-MINIMUM-BALANCE-FEE END-IF *> Credit limit validation IF CREDIT-USED > CREDIT-LIMIT DISPLAY "Error: Credit limit exceeded" MOVE 'N' TO VALIDATION-COMPLETE PERFORM NOTIFY-CREDIT-DEPARTMENT END-IF *> Account status validation IF ACCOUNT-STATUS NOT = 'ACTIVE' DISPLAY "Error: Account not active" MOVE 'N' TO VALIDATION-COMPLETE PERFORM LOG-STATUS-ERROR END-IF *> Re-validation after corrections IF VALIDATION-COMPLETE = 'N' PERFORM GET-UPDATED-ACCOUNT-DATA END-IF END-PERFORM. *> PERFORM with error handling ROBUST-FILE-PROCESSING. PERFORM VARYING FILE-INDEX FROM 1 BY 1 UNTIL FILE-INDEX > FILE-COUNT OR CRITICAL-ERROR = 'Y' PERFORM OPEN-INPUT-FILE IF FILE-STATUS = '00' PERFORM PROCESS-FILE-RECORDS PERFORM CLOSE-INPUT-FILE ELSE DISPLAY "File error: " FILE-NAME(FILE-INDEX) ADD 1 TO FILE-ERROR-COUNT IF FILE-ERROR-COUNT > MAX-FILE-ERRORS MOVE 'Y' TO CRITICAL-ERROR DISPLAY "Critical: Too many file errors" END-IF END-IF END-PERFORM. *> Performance optimization with PERFORM OPTIMIZED-SEARCH. MOVE 'N' TO RECORD-FOUND MOVE 1 TO SEARCH-INDEX PERFORM UNTIL RECORD-FOUND = 'Y' OR SEARCH-INDEX > TABLE-SIZE IF SEARCH-KEY = TABLE-KEY(SEARCH-INDEX) MOVE 'Y' TO RECORD-FOUND MOVE TABLE-DATA(SEARCH-INDEX) TO FOUND-RECORD ELSE ADD 1 TO SEARCH-INDEX END-IF END-PERFORM IF RECORD-FOUND = 'Y' DISPLAY "Record found at position: " SEARCH-INDEX ELSE DISPLAY "Record not found" END-IF
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325IDENTIFICATION DIVISION. PROGRAM-ID. PERFORM-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. *> Employee payroll processing system 01 WS-PAYROLL-CONTROL. 05 WS-EMPLOYEE-COUNT PIC 9(4) VALUE 0. 05 WS-CURRENT-EMPLOYEE PIC 9(4) VALUE 0. 05 WS-PROCESSING-COMPLETE PIC X VALUE 'N'. 05 WS-ERROR-COUNT PIC 9(3) VALUE 0. 05 WS-MAX-ERRORS PIC 9(3) VALUE 10. 01 WS-PAYROLL-TOTALS. 05 WS-TOTAL-GROSS-PAY PIC 9(10)V99 VALUE 0. 05 WS-TOTAL-DEDUCTIONS PIC 9(10)V99 VALUE 0. 05 WS-TOTAL-NET-PAY PIC 9(10)V99 VALUE 0. 05 WS-TOTAL-EMPLOYEES PIC 9(4) VALUE 0. *> Employee data table 01 WS-EMPLOYEE-TABLE. 05 WS-EMPLOYEE-RECORD OCCURS 1000 TIMES INDEXED BY EMP-INDEX. 10 WS-EMP-ID PIC X(8). 10 WS-EMP-NAME PIC X(30). 10 WS-EMP-TYPE PIC X(10). 10 WS-HOURLY-RATE PIC 9(3)V99. 10 WS-HOURS-WORKED PIC 9(3)V9. 10 WS-GROSS-PAY PIC 9(6)V99. 10 WS-DEDUCTIONS PIC 9(5)V99. 10 WS-NET-PAY PIC 9(6)V99. *> Monthly sales analysis 01 WS-SALES-ANALYSIS. 05 WS-MONTHLY-SALES OCCURS 12 TIMES. 10 WS-SALES-AMOUNT PIC 9(8)V99. 10 WS-COMMISSION PIC 9(6)V99. 10 WS-BONUS PIC 9(5)V99. 05 WS-ANNUAL-TOTALS. 10 WS-TOTAL-SALES PIC 9(10)V99. 10 WS-TOTAL-COMMISSION PIC 9(8)V99. 10 WS-TOTAL-BONUS PIC 9(7)V99. *> Multi-dimensional reporting data 01 WS-QUARTERLY-REPORTS. 05 WS-QUARTER-DATA OCCURS 4 TIMES. 10 WS-MONTH-DATA OCCURS 3 TIMES. 15 WS-WEEK-DATA OCCURS 4 TIMES. 20 WS-DAILY-SALES PIC 9(6)V99. 20 WS-DAILY-CUSTOMERS PIC 9(4). PROCEDURE DIVISION. MAIN-PERFORM-DEMO. DISPLAY "=== PERFORM AND END-PERFORM DEMONSTRATION ===" PERFORM INITIALIZE-PAYROLL-SYSTEM PERFORM LOAD-EMPLOYEE-DATA PERFORM PROCESS-PAYROLL-CALCULATIONS PERFORM GENERATE-PAYROLL-REPORTS PERFORM ANALYZE-SALES-PERFORMANCE PERFORM GENERATE-QUARTERLY-ANALYSIS PERFORM DISPLAY-SYSTEM-STATISTICS DISPLAY "=== PERFORM DEMO COMPLETE ===" STOP RUN. *> ========================================== *> SYSTEM INITIALIZATION WITH PERFORM *> ========================================== INITIALIZE-PAYROLL-SYSTEM. DISPLAY "Initializing payroll processing system..." *> Initialize all counters and totals PERFORM CLEAR-WORKING-STORAGE PERFORM SET-PROCESSING-PARAMETERS PERFORM VALIDATE-SYSTEM-CONFIGURATION DISPLAY "✅ Payroll system initialized". CLEAR-WORKING-STORAGE. *> Clear all numeric fields using PERFORM TIMES PERFORM INITIALIZE-SINGLE-FIELD 1000 TIMES MOVE 0 TO WS-TOTAL-GROSS-PAY MOVE 0 TO WS-TOTAL-DEDUCTIONS MOVE 0 TO WS-TOTAL-NET-PAY. INITIALIZE-SINGLE-FIELD. *> This would be called 1000 times to clear each employee record MOVE SPACES TO WS-EMP-ID(WS-CURRENT-EMPLOYEE + 1) MOVE SPACES TO WS-EMP-NAME(WS-CURRENT-EMPLOYEE + 1) MOVE ZEROS TO WS-GROSS-PAY(WS-CURRENT-EMPLOYEE + 1). *> ========================================== *> DATA LOADING WITH PERFORM VARYING *> ========================================== LOAD-EMPLOYEE-DATA. DISPLAY "Loading employee data..." *> Load sample employee data using PERFORM VARYING PERFORM VARYING WS-CURRENT-EMPLOYEE FROM 1 BY 1 UNTIL WS-CURRENT-EMPLOYEE > 10 PERFORM CREATE-SAMPLE-EMPLOYEE ADD 1 TO WS-EMPLOYEE-COUNT END-PERFORM DISPLAY "✅ Loaded " WS-EMPLOYEE-COUNT " employee records". CREATE-SAMPLE-EMPLOYEE. *> Create sample employee data STRING "EMP" WS-CURRENT-EMPLOYEE DELIMITED BY SIZE INTO WS-EMP-ID(WS-CURRENT-EMPLOYEE) END-STRING STRING "Employee " WS-CURRENT-EMPLOYEE DELIMITED BY SIZE INTO WS-EMP-NAME(WS-CURRENT-EMPLOYEE) END-STRING EVALUATE WS-CURRENT-EMPLOYEE WHEN 1 THRU 3 MOVE "MANAGER" TO WS-EMP-TYPE(WS-CURRENT-EMPLOYEE) MOVE 75.00 TO WS-HOURLY-RATE(WS-CURRENT-EMPLOYEE) WHEN 4 THRU 7 MOVE "SALES" TO WS-EMP-TYPE(WS-CURRENT-EMPLOYEE) MOVE 25.00 TO WS-HOURLY-RATE(WS-CURRENT-EMPLOYEE) WHEN OTHER MOVE "HOURLY" TO WS-EMP-TYPE(WS-CURRENT-EMPLOYEE) MOVE 15.00 TO WS-HOURLY-RATE(WS-CURRENT-EMPLOYEE) END-EVALUATE COMPUTE WS-HOURS-WORKED(WS-CURRENT-EMPLOYEE) = 40 + (WS-CURRENT-EMPLOYEE * 2). *> ========================================== *> PAYROLL PROCESSING WITH COMPLEX PERFORM *> ========================================== PROCESS-PAYROLL-CALCULATIONS. DISPLAY "Processing payroll calculations..." PERFORM VARYING WS-CURRENT-EMPLOYEE FROM 1 BY 1 UNTIL WS-CURRENT-EMPLOYEE > WS-EMPLOYEE-COUNT OR WS-ERROR-COUNT > WS-MAX-ERRORS PERFORM CALCULATE-EMPLOYEE-PAY PERFORM VALIDATE-PAYROLL-CALCULATIONS IF WS-ERROR-COUNT <= WS-MAX-ERRORS PERFORM UPDATE-PAYROLL-TOTALS END-IF END-PERFORM DISPLAY "✅ Processed " WS-EMPLOYEE-COUNT " employee payrolls". CALCULATE-EMPLOYEE-PAY. *> Calculate gross pay with overtime PERFORM CALCULATE-GROSS-PAY PERFORM CALCULATE-DEDUCTIONS PERFORM CALCULATE-NET-PAY. CALCULATE-GROSS-PAY. IF WS-HOURS-WORKED(WS-CURRENT-EMPLOYEE) <= 40 COMPUTE WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) = WS-HOURS-WORKED(WS-CURRENT-EMPLOYEE) * WS-HOURLY-RATE(WS-CURRENT-EMPLOYEE) ELSE COMPUTE WS-REGULAR-PAY = 40 * WS-HOURLY-RATE(WS-CURRENT-EMPLOYEE) COMPUTE WS-OVERTIME-HOURS = WS-HOURS-WORKED(WS-CURRENT-EMPLOYEE) - 40 COMPUTE WS-OVERTIME-PAY = WS-OVERTIME-HOURS * WS-HOURLY-RATE(WS-CURRENT-EMPLOYEE) * 1.5 COMPUTE WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) = WS-REGULAR-PAY + WS-OVERTIME-PAY END-IF. CALCULATE-DEDUCTIONS. *> Calculate various deductions COMPUTE WS-FEDERAL-TAX = WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) * 0.20 COMPUTE WS-STATE-TAX = WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) * 0.05 COMPUTE WS-FICA-TAX = WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) * 0.0765 COMPUTE WS-INSURANCE = 125.00 COMPUTE WS-DEDUCTIONS(WS-CURRENT-EMPLOYEE) = WS-FEDERAL-TAX + WS-STATE-TAX + WS-FICA-TAX + WS-INSURANCE. CALCULATE-NET-PAY. COMPUTE WS-NET-PAY(WS-CURRENT-EMPLOYEE) = WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) - WS-DEDUCTIONS(WS-CURRENT-EMPLOYEE). *> ========================================== *> SALES ANALYSIS WITH NESTED PERFORM *> ========================================== ANALYZE-SALES-PERFORMANCE. DISPLAY "Analyzing sales performance..." *> Load sample sales data and analyze PERFORM LOAD-MONTHLY-SALES-DATA PERFORM CALCULATE-ANNUAL-TOTALS PERFORM ANALYZE-SALES-TRENDS DISPLAY "✅ Sales analysis complete". LOAD-MONTHLY-SALES-DATA. PERFORM VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 12 COMPUTE WS-SALES-AMOUNT(MONTH-INDEX) = 50000 + (MONTH-INDEX * 5000) + (MONTH-INDEX * MONTH-INDEX * 100) COMPUTE WS-COMMISSION(MONTH-INDEX) = WS-SALES-AMOUNT(MONTH-INDEX) * 0.05 COMPUTE WS-BONUS(MONTH-INDEX) = WS-SALES-AMOUNT(MONTH-INDEX) * 0.02 END-PERFORM. CALCULATE-ANNUAL-TOTALS. MOVE 0 TO WS-TOTAL-SALES MOVE 0 TO WS-TOTAL-COMMISSION MOVE 0 TO WS-TOTAL-BONUS PERFORM VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 12 ADD WS-SALES-AMOUNT(MONTH-INDEX) TO WS-TOTAL-SALES ADD WS-COMMISSION(MONTH-INDEX) TO WS-TOTAL-COMMISSION ADD WS-BONUS(MONTH-INDEX) TO WS-TOTAL-BONUS END-PERFORM. *> ========================================== *> QUARTERLY ANALYSIS WITH MULTI-PERFORM *> ========================================== GENERATE-QUARTERLY-ANALYSIS. DISPLAY "Generating quarterly analysis..." PERFORM VARYING QUARTER-INDEX FROM 1 BY 1 UNTIL QUARTER-INDEX > 4 VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 3 VARYING WEEK-INDEX FROM 1 BY 1 UNTIL WEEK-INDEX > 4 *> Generate sample daily sales data COMPUTE WS-DAILY-SALES(QUARTER-INDEX, MONTH-INDEX, WEEK-INDEX) = 1000 + (QUARTER-INDEX * 500) + (MONTH-INDEX * 200) + (WEEK-INDEX * 100) COMPUTE WS-DAILY-CUSTOMERS(QUARTER-INDEX, MONTH-INDEX, WEEK-INDEX) = 50 + (QUARTER-INDEX * 10) + (MONTH-INDEX * 5) + WEEK-INDEX END-PERFORM PERFORM ANALYZE-QUARTERLY-TRENDS DISPLAY "✅ Quarterly analysis complete". ANALYZE-QUARTERLY-TRENDS. PERFORM VARYING QUARTER-INDEX FROM 1 BY 1 UNTIL QUARTER-INDEX > 4 MOVE 0 TO QUARTER-TOTAL MOVE 0 TO QUARTER-CUSTOMERS PERFORM VARYING MONTH-INDEX FROM 1 BY 1 UNTIL MONTH-INDEX > 3 VARYING WEEK-INDEX FROM 1 BY 1 UNTIL WEEK-INDEX > 4 ADD WS-DAILY-SALES(QUARTER-INDEX, MONTH-INDEX, WEEK-INDEX) TO QUARTER-TOTAL ADD WS-DAILY-CUSTOMERS(QUARTER-INDEX, MONTH-INDEX, WEEK-INDEX) TO QUARTER-CUSTOMERS END-PERFORM DISPLAY "Quarter " QUARTER-INDEX ":" DISPLAY " Total Sales: $" QUARTER-TOTAL DISPLAY " Total Customers: " QUARTER-CUSTOMERS END-PERFORM. *> ========================================== *> VALIDATION AND ERROR HANDLING *> ========================================== VALIDATE-PAYROLL-CALCULATIONS. *> Inline PERFORM with comprehensive validation PERFORM UNTIL VALIDATION-COMPLETE = 'Y' MOVE 'Y' TO VALIDATION-COMPLETE IF WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) <= 0 DISPLAY "Error: Invalid gross pay for employee " WS-EMP-ID(WS-CURRENT-EMPLOYEE) ADD 1 TO WS-ERROR-COUNT MOVE 'N' TO VALIDATION-COMPLETE END-IF IF WS-NET-PAY(WS-CURRENT-EMPLOYEE) <= 0 DISPLAY "Error: Invalid net pay for employee " WS-EMP-ID(WS-CURRENT-EMPLOYEE) ADD 1 TO WS-ERROR-COUNT MOVE 'N' TO VALIDATION-COMPLETE END-IF IF WS-DEDUCTIONS(WS-CURRENT-EMPLOYEE) >= WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) DISPLAY "Warning: Deductions exceed gross pay for employee " WS-EMP-ID(WS-CURRENT-EMPLOYEE) END-IF END-PERFORM. UPDATE-PAYROLL-TOTALS. ADD WS-GROSS-PAY(WS-CURRENT-EMPLOYEE) TO WS-TOTAL-GROSS-PAY ADD WS-DEDUCTIONS(WS-CURRENT-EMPLOYEE) TO WS-TOTAL-DEDUCTIONS ADD WS-NET-PAY(WS-CURRENT-EMPLOYEE) TO WS-TOTAL-NET-PAY ADD 1 TO WS-TOTAL-EMPLOYEES. DISPLAY-SYSTEM-STATISTICS. DISPLAY " " DISPLAY "📊 PERFORM SYSTEM STATISTICS" DISPLAY "=============================" DISPLAY "Employees processed: " WS-TOTAL-EMPLOYEES DISPLAY "Total gross pay: $" WS-TOTAL-GROSS-PAY DISPLAY "Total deductions: $" WS-TOTAL-DEDUCTIONS DISPLAY "Total net pay: $" WS-TOTAL-NET-PAY DISPLAY "Processing errors: " WS-ERROR-COUNT DISPLAY "Annual sales total: $" WS-TOTAL-SALES DISPLAY " " DISPLAY "🎯 Key PERFORM Features Demonstrated:" DISPLAY " • Simple PERFORM for procedure calls" DISPLAY " • PERFORM TIMES for fixed iterations" DISPLAY " • PERFORM UNTIL for condition control" DISPLAY " • PERFORM VARYING for counter loops" DISPLAY " • Nested PERFORM statements" DISPLAY " • Inline PERFORM with END-PERFORM" DISPLAY " • Complex conditional logic" DISPLAY " • Multi-dimensional data processing"