MainframeMaster

COBOL Tutorial

COBOL PERFORM and END-PERFORM

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.

Basic PERFORM Operations

Fundamental PERFORM Syntax
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
*> 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
Flow Control
Loop Processing
Modular Programming

Advanced PERFORM Techniques

Complex PERFORM 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
*> 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

Complete PERFORM System Implementation

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
IDENTIFICATION 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"

PERFORM Features and Capabilities

Execution Control
  • • Simple procedure execution
  • • Conditional execution control
  • • Fixed repetition counts
  • • Counter-based iterations
Loop Variations
  • • PERFORM UNTIL conditions
  • • PERFORM VARYING with counters
  • • PERFORM TIMES for fixed loops
  • • Multi-variable VARYING loops
Inline Processing
  • • END-PERFORM block structure
  • • Embedded logic execution
  • • Nested control structures
  • • Complex conditional logic
Program Organization
  • • Modular code structure
  • • Procedure reusability
  • • Structured programming support
  • • Clear program flow control

Best Practices