MainframeMaster

COBOL Tutorial

COBOL END-SEARCH Statement

The END-SEARCH statement represents a fundamental component of table handling and array processing in COBOL, serving as an explicit scope terminator that clearly defines the boundaries of SEARCH statement blocks. This statement embodies modern data structure management principles by providing unambiguous termination points for table search operations, enabling sophisticated search algorithms for complex data structures, and supporting the development of efficient data processing applications that require precise control over table access patterns and search result handling.

In contemporary enterprise COBOL development, END-SEARCH plays a vital role in creating sophisticated data lookup systems that must handle large tables, complex search criteria, and various data organization patterns. By providing explicit termination for SEARCH blocks, this statement enables developers to implement comprehensive table processing logic while maintaining code clarity and ensuring that search operations are properly bounded and controlled within the application's data access flow.

Basic END-SEARCH Usage

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
IDENTIFICATION DIVISION. PROGRAM-ID. END-SEARCH-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMPLOYEE-TABLE. 05 EMPLOYEE-COUNT PIC 9(3) VALUE 10. 05 EMPLOYEE-ENTRIES OCCURS 1 TO 100 TIMES DEPENDING ON EMPLOYEE-COUNT ASCENDING KEY IS EMP-ID INDEXED BY EMP-INDEX. 10 EMP-ID PIC X(10). 10 EMP-NAME PIC X(30). 10 EMP-DEPARTMENT PIC X(15). 10 EMP-SALARY PIC 9(7)V99. 10 EMP-HIRE-DATE PIC X(8). 01 DEPARTMENT-TABLE. 05 DEPT-COUNT PIC 9(2) VALUE 5. 05 DEPT-ENTRIES OCCURS 5 TIMES INDEXED BY DEPT-INDEX. 10 DEPT-CODE PIC X(5). 10 DEPT-NAME PIC X(20). 10 DEPT-MANAGER PIC X(30). 10 DEPT-BUDGET PIC 9(9)V99. 01 SEARCH-CONTROLS. 05 SEARCH-KEY PIC X(10). 05 SEARCH-RESULT PIC X VALUE 'N'. 88 ITEM-FOUND VALUE 'Y'. 88 ITEM-NOT-FOUND VALUE 'N'. 05 SEARCH-COUNT PIC 9(5) VALUE 0. 05 SUCCESSFUL-SEARCHES PIC 9(5) VALUE 0. 05 FAILED-SEARCHES PIC 9(5) VALUE 0. 01 PROCESSING-FLAGS. 05 CONTINUE-FLAG PIC X VALUE 'Y'. 88 CONTINUE-PROCESSING VALUE 'Y'. 88 STOP-PROCESSING VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-TABLES PERFORM DEMONSTRATE-LINEAR-SEARCH PERFORM DEMONSTRATE-BINARY-SEARCH PERFORM DEMONSTRATE-COMPLEX-SEARCHES PERFORM DISPLAY-SEARCH-STATISTICS STOP RUN. INITIALIZE-TABLES. DISPLAY 'Initializing employee and department tables...' *> Initialize employee table MOVE 'EMP001' TO EMP-ID(1) MOVE 'JOHN SMITH' TO EMP-NAME(1) MOVE 'IT' TO EMP-DEPARTMENT(1) MOVE 75000.00 TO EMP-SALARY(1) MOVE '20220115' TO EMP-HIRE-DATE(1) MOVE 'EMP002' TO EMP-ID(2) MOVE 'JANE DOE' TO EMP-NAME(2) MOVE 'HR' TO EMP-DEPARTMENT(2) MOVE 65000.00 TO EMP-SALARY(2) MOVE '20220301' TO EMP-HIRE-DATE(2) MOVE 'EMP003' TO EMP-ID(3) MOVE 'BOB JOHNSON' TO EMP-NAME(3) MOVE 'FINANCE' TO EMP-DEPARTMENT(3) MOVE 80000.00 TO EMP-SALARY(3) MOVE '20210920' TO EMP-HIRE-DATE(3) MOVE 'EMP004' TO EMP-ID(4) MOVE 'ALICE BROWN' TO EMP-NAME(4) MOVE 'IT' TO EMP-DEPARTMENT(4) MOVE 72000.00 TO EMP-SALARY(4) MOVE '20220510' TO EMP-HIRE-DATE(4) MOVE 'EMP005' TO EMP-ID(5) MOVE 'CHARLIE WILSON' TO EMP-NAME(5) MOVE 'SALES' TO EMP-DEPARTMENT(5) MOVE 68000.00 TO EMP-SALARY(5) MOVE '20220220' TO EMP-HIRE-DATE(5) *> Initialize additional employees MOVE 'EMP006' TO EMP-ID(6) MOVE 'DIANA CLARK' TO EMP-NAME(6) MOVE 'MARKETING' TO EMP-DEPARTMENT(6) MOVE 70000.00 TO EMP-SALARY(6) MOVE 'EMP007' TO EMP-ID(7) MOVE 'EDWARD DAVIS' TO EMP-NAME(7) MOVE 'IT' TO EMP-DEPARTMENT(7) MOVE 78000.00 TO EMP-SALARY(7) MOVE 'EMP008' TO EMP-ID(8) MOVE 'FIONA MILLER' TO EMP-NAME(8) MOVE 'HR' TO EMP-DEPARTMENT(8) MOVE 66000.00 TO EMP-SALARY(8) MOVE 'EMP009' TO EMP-ID(9) MOVE 'GEORGE TAYLOR' TO EMP-NAME(9) MOVE 'FINANCE' TO EMP-DEPARTMENT(9) MOVE 82000.00 TO EMP-SALARY(9) MOVE 'EMP010' TO EMP-ID(10) MOVE 'HELEN ANDERSON' TO EMP-NAME(10) MOVE 'SALES' TO EMP-DEPARTMENT(10) MOVE 69000.00 TO EMP-SALARY(10) *> Initialize department table MOVE 'IT' TO DEPT-CODE(1) MOVE 'INFORMATION TECHNOLOGY' TO DEPT-NAME(1) MOVE 'JOHN SMITH' TO DEPT-MANAGER(1) MOVE 500000.00 TO DEPT-BUDGET(1) MOVE 'HR' TO DEPT-CODE(2) MOVE 'HUMAN RESOURCES' TO DEPT-NAME(2) MOVE 'JANE DOE' TO DEPT-MANAGER(2) MOVE 300000.00 TO DEPT-BUDGET(2) MOVE 'FIN' TO DEPT-CODE(3) MOVE 'FINANCE' TO DEPT-NAME(3) MOVE 'BOB JOHNSON' TO DEPT-MANAGER(3) MOVE 400000.00 TO DEPT-BUDGET(3) MOVE 'SAL' TO DEPT-CODE(4) MOVE 'SALES' TO DEPT-NAME(4) MOVE 'CHARLIE WILSON' TO DEPT-MANAGER(4) MOVE 600000.00 TO DEPT-BUDGET(4) MOVE 'MKT' TO DEPT-CODE(5) MOVE 'MARKETING' TO DEPT-NAME(5) MOVE 'DIANA CLARK' TO DEPT-MANAGER(5) MOVE 350000.00 TO DEPT-BUDGET(5) DISPLAY 'Tables initialized successfully'. DEMONSTRATE-LINEAR-SEARCH. DISPLAY 'Demonstrating linear search operations...' *> Search for specific employee by ID MOVE 'EMP003' TO SEARCH-KEY PERFORM SEARCH-EMPLOYEE-LINEAR MOVE 'EMP007' TO SEARCH-KEY PERFORM SEARCH-EMPLOYEE-LINEAR MOVE 'EMP999' TO SEARCH-KEY *> Non-existent employee PERFORM SEARCH-EMPLOYEE-LINEAR DISPLAY 'Linear search demonstrations completed'. SEARCH-EMPLOYEE-LINEAR. SET ITEM-NOT-FOUND TO TRUE ADD 1 TO SEARCH-COUNT SEARCH EMPLOYEE-ENTRIES AT END DISPLAY 'Employee not found: ' SEARCH-KEY SET ITEM-NOT-FOUND TO TRUE ADD 1 TO FAILED-SEARCHES WHEN EMP-ID(EMP-INDEX) = SEARCH-KEY DISPLAY 'Employee found: ' SEARCH-KEY DISPLAY 'Name: ' EMP-NAME(EMP-INDEX) DISPLAY 'Department: ' EMP-DEPARTMENT(EMP-INDEX) DISPLAY 'Salary: ' EMP-SALARY(EMP-INDEX) DISPLAY 'Hire Date: ' EMP-HIRE-DATE(EMP-INDEX) SET ITEM-FOUND TO TRUE ADD 1 TO SUCCESSFUL-SEARCHES END-SEARCH. DEMONSTRATE-BINARY-SEARCH. DISPLAY 'Demonstrating binary search operations...' *> Binary search requires sorted table (already sorted by EMP-ID) MOVE 'EMP002' TO SEARCH-KEY PERFORM SEARCH-EMPLOYEE-BINARY MOVE 'EMP008' TO SEARCH-KEY PERFORM SEARCH-EMPLOYEE-BINARY MOVE 'EMP000' TO SEARCH-KEY *> Non-existent employee PERFORM SEARCH-EMPLOYEE-BINARY DISPLAY 'Binary search demonstrations completed'. SEARCH-EMPLOYEE-BINARY. SET ITEM-NOT-FOUND TO TRUE ADD 1 TO SEARCH-COUNT SEARCH ALL EMPLOYEE-ENTRIES AT END DISPLAY 'Employee not found (binary): ' SEARCH-KEY SET ITEM-NOT-FOUND TO TRUE ADD 1 TO FAILED-SEARCHES WHEN EMP-ID(EMP-INDEX) = SEARCH-KEY DISPLAY 'Employee found (binary): ' SEARCH-KEY DISPLAY 'Name: ' EMP-NAME(EMP-INDEX) DISPLAY 'Department: ' EMP-DEPARTMENT(EMP-INDEX) DISPLAY 'Salary: ' EMP-SALARY(EMP-INDEX) DISPLAY 'Index position: ' EMP-INDEX SET ITEM-FOUND TO TRUE ADD 1 TO SUCCESSFUL-SEARCHES END-SEARCH. DEMONSTRATE-COMPLEX-SEARCHES. DISPLAY 'Demonstrating complex search operations...' PERFORM SEARCH-BY-DEPARTMENT PERFORM SEARCH-BY-SALARY-RANGE PERFORM SEARCH-MULTIPLE-CONDITIONS DISPLAY 'Complex search demonstrations completed'. SEARCH-BY-DEPARTMENT. DISPLAY 'Searching employees by department: IT' SET EMP-INDEX TO 1 PERFORM UNTIL EMP-INDEX > EMPLOYEE-COUNT SEARCH EMPLOYEE-ENTRIES AT END EXIT PERFORM WHEN EMP-DEPARTMENT(EMP-INDEX) = 'IT' DISPLAY 'IT Employee: ' EMP-NAME(EMP-INDEX) DISPLAY 'ID: ' EMP-ID(EMP-INDEX) DISPLAY 'Salary: ' EMP-SALARY(EMP-INDEX) SET EMP-INDEX UP BY 1 END-SEARCH END-PERFORM. SEARCH-BY-SALARY-RANGE. DISPLAY 'Searching employees with salary >= 75000' SET EMP-INDEX TO 1 PERFORM UNTIL EMP-INDEX > EMPLOYEE-COUNT SEARCH EMPLOYEE-ENTRIES AT END EXIT PERFORM WHEN EMP-SALARY(EMP-INDEX) >= 75000 DISPLAY 'High Salary Employee: ' EMP-NAME(EMP-INDEX) DISPLAY 'ID: ' EMP-ID(EMP-INDEX) DISPLAY 'Salary: ' EMP-SALARY(EMP-INDEX) DISPLAY 'Department: ' EMP-DEPARTMENT(EMP-INDEX) SET EMP-INDEX UP BY 1 END-SEARCH END-PERFORM. SEARCH-MULTIPLE-CONDITIONS. DISPLAY 'Searching IT employees with salary >= 75000' SET EMP-INDEX TO 1 PERFORM UNTIL EMP-INDEX > EMPLOYEE-COUNT SEARCH EMPLOYEE-ENTRIES AT END EXIT PERFORM WHEN EMP-DEPARTMENT(EMP-INDEX) = 'IT' AND EMP-SALARY(EMP-INDEX) >= 75000 DISPLAY 'IT High Earner: ' EMP-NAME(EMP-INDEX) DISPLAY 'ID: ' EMP-ID(EMP-INDEX) DISPLAY 'Salary: ' EMP-SALARY(EMP-INDEX) SET EMP-INDEX UP BY 1 END-SEARCH END-PERFORM. DISPLAY-SEARCH-STATISTICS. DISPLAY 'Search Operation Statistics:' DISPLAY 'Total searches performed: ' SEARCH-COUNT DISPLAY 'Successful searches: ' SUCCESSFUL-SEARCHES DISPLAY 'Failed searches: ' FAILED-SEARCHES IF SEARCH-COUNT > 0 COMPUTE SUCCESSFUL-SEARCHES = (SUCCESSFUL-SEARCHES / SEARCH-COUNT) * 100 DISPLAY 'Success rate: ' SUCCESSFUL-SEARCHES '%' END-IF.

Advanced END-SEARCH Patterns

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
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-END-SEARCH. DATA DIVISION. WORKING-STORAGE SECTION. 01 PRODUCT-CATALOG. 05 PRODUCT-COUNT PIC 9(4) VALUE 50. 05 PRODUCT-ENTRIES OCCURS 1 TO 1000 TIMES DEPENDING ON PRODUCT-COUNT ASCENDING KEY IS PRODUCT-CODE ASCENDING KEY IS CATEGORY-CODE INDEXED BY PROD-INDEX, PROD-INDEX2. 10 PRODUCT-CODE PIC X(10). 10 CATEGORY-CODE PIC X(5). 10 PRODUCT-NAME PIC X(40). 10 UNIT-PRICE PIC 9(7)V99. 10 STOCK-QUANTITY PIC 9(7). 10 REORDER-LEVEL PIC 9(5). 10 SUPPLIER-CODE PIC X(8). 10 PRODUCT-STATUS PIC X(2). 01 SUPPLIER-TABLE. 05 SUPPLIER-COUNT PIC 9(3) VALUE 10. 05 SUPPLIER-ENTRIES OCCURS 10 TIMES ASCENDING KEY IS SUPPLIER-CODE INDEXED BY SUPP-INDEX. 10 SUPPLIER-CODE PIC X(8). 10 SUPPLIER-NAME PIC X(30). 10 CONTACT-PERSON PIC X(25). 10 PHONE-NUMBER PIC X(15). 10 RATING PIC 9V99. 01 SALES-HISTORY. 05 SALES-COUNT PIC 9(5) VALUE 100. 05 SALES-ENTRIES OCCURS 1 TO 10000 TIMES DEPENDING ON SALES-COUNT ASCENDING KEY IS SALE-DATE ASCENDING KEY IS PRODUCT-CODE INDEXED BY SALES-INDEX. 10 SALE-DATE PIC X(8). 10 PRODUCT-CODE PIC X(10). 10 QUANTITY-SOLD PIC 9(5). 10 SALE-PRICE PIC 9(7)V99. 10 CUSTOMER-ID PIC X(10). 01 ADVANCED-SEARCH-CONTROLS. 05 SEARCH-CRITERIA. 10 MIN-PRICE PIC 9(7)V99. 10 MAX-PRICE PIC 9(7)V99. 10 CATEGORY-FILTER PIC X(5). 10 STOCK-THRESHOLD PIC 9(7). 10 DATE-FROM PIC X(8). 10 DATE-TO PIC X(8). 05 SEARCH-RESULTS. 10 MATCHES-FOUND PIC 9(5) VALUE 0. 10 TOTAL-VALUE PIC 9(11)V99 VALUE 0. 10 AVERAGE-PRICE PIC 9(7)V99 VALUE 0. 01 COMPLEX-PROCESSING. 05 BATCH-CONTROLS. 10 BATCH-SIZE PIC 9(4) VALUE 100. 10 CURRENT-BATCH PIC 9(4) VALUE 0. 10 RECORDS-PROCESSED PIC 9(7) VALUE 0. 05 PERFORMANCE-METRICS. 10 SEARCH-START-TIME PIC X(14). 10 SEARCH-END-TIME PIC X(14). 10 ELAPSED-TIME PIC 9(7) VALUE 0. 10 SEARCHES-PER-SECOND PIC 9(5)V99 VALUE 0. 01 MULTI-DIMENSIONAL-SEARCH. 05 SEARCH-DIMENSIONS. 10 PRIMARY-KEY PIC X(10). 10 SECONDARY-KEY PIC X(5). 10 TERTIARY-CONDITION PIC X(20). 05 DIMENSION-RESULTS. 10 PRIMARY-MATCHES PIC 9(5) VALUE 0. 10 SECONDARY-MATCHES PIC 9(5) VALUE 0. 10 FINAL-MATCHES PIC 9(5) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-ADVANCED-TABLES PERFORM EXECUTE-PERFORMANCE-TESTING PERFORM DEMONSTRATE-MULTI-KEY-SEARCHES PERFORM DEMONSTRATE-RANGE-SEARCHES PERFORM DEMONSTRATE-COMPLEX-FILTERING PERFORM DEMONSTRATE-NESTED-SEARCHES PERFORM DISPLAY-COMPREHENSIVE-STATISTICS STOP RUN. INITIALIZE-ADVANCED-TABLES. DISPLAY 'Initializing advanced search tables...' *> Initialize product catalog with sample data PERFORM VARYING PROD-INDEX FROM 1 BY 1 UNTIL PROD-INDEX > 50 STRING 'PROD' DELIMITED BY SIZE PROD-INDEX DELIMITED BY SIZE INTO PRODUCT-CODE(PROD-INDEX) END-STRING EVALUATE FUNCTION MOD(PROD-INDEX, 5) WHEN 0 MOVE 'ELEC' TO CATEGORY-CODE(PROD-INDEX) WHEN 1 MOVE 'BOOK' TO CATEGORY-CODE(PROD-INDEX) WHEN 2 MOVE 'CLTH' TO CATEGORY-CODE(PROD-INDEX) WHEN 3 MOVE 'HOME' TO CATEGORY-CODE(PROD-INDEX) WHEN 4 MOVE 'SPRT' TO CATEGORY-CODE(PROD-INDEX) END-EVALUATE STRING 'PRODUCT NAME ' DELIMITED BY SIZE PROD-INDEX DELIMITED BY SIZE INTO PRODUCT-NAME(PROD-INDEX) END-STRING COMPUTE UNIT-PRICE(PROD-INDEX) = (FUNCTION RANDOM(PROD-INDEX) * 1000) + 10 COMPUTE STOCK-QUANTITY(PROD-INDEX) = FUNCTION RANDOM(PROD-INDEX) * 500 + 50 COMPUTE REORDER-LEVEL(PROD-INDEX) = STOCK-QUANTITY(PROD-INDEX) / 4 STRING 'SUPP' DELIMITED BY SIZE FUNCTION MOD(PROD-INDEX, 10) + 1 DELIMITED BY SIZE INTO SUPPLIER-CODE(PROD-INDEX) END-STRING MOVE 'AC' TO PRODUCT-STATUS(PROD-INDEX) END-PERFORM *> Initialize supplier table PERFORM VARYING SUPP-INDEX FROM 1 BY 1 UNTIL SUPP-INDEX > 10 STRING 'SUPP' DELIMITED BY SIZE SUPP-INDEX DELIMITED BY SIZE INTO SUPPLIER-CODE(SUPP-INDEX) END-STRING STRING 'SUPPLIER COMPANY ' DELIMITED BY SIZE SUPP-INDEX DELIMITED BY SIZE INTO SUPPLIER-NAME(SUPP-INDEX) END-STRING STRING 'CONTACT ' DELIMITED BY SIZE SUPP-INDEX DELIMITED BY SIZE INTO CONTACT-PERSON(SUPP-INDEX) END-STRING MOVE '555-0100' TO PHONE-NUMBER(SUPP-INDEX) COMPUTE RATING(SUPP-INDEX) = (FUNCTION RANDOM(SUPP-INDEX) * 5) + 1 END-PERFORM DISPLAY 'Advanced tables initialized successfully'. EXECUTE-PERFORMANCE-TESTING. DISPLAY 'Executing performance testing...' MOVE FUNCTION CURRENT-DATE TO SEARCH-START-TIME PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 10 PERFORM BATCH-SEARCH-OPERATIONS END-PERFORM MOVE FUNCTION CURRENT-DATE TO SEARCH-END-TIME PERFORM CALCULATE-PERFORMANCE-METRICS DISPLAY 'Performance testing completed'. BATCH-SEARCH-OPERATIONS. PERFORM VARYING PROD-INDEX FROM 1 BY 1 UNTIL PROD-INDEX > BATCH-SIZE ADD 1 TO RECORDS-PROCESSED *> Perform various search operations PERFORM SEARCH-PRODUCT-BY-CODE PERFORM SEARCH-PRODUCTS-BY-CATEGORY PERFORM SEARCH-LOW-STOCK-PRODUCTS END-PERFORM. SEARCH-PRODUCT-BY-CODE. STRING 'PROD' DELIMITED BY SIZE FUNCTION MOD(RECORDS-PROCESSED, 50) + 1 DELIMITED BY SIZE INTO PRIMARY-KEY END-STRING SEARCH ALL PRODUCT-ENTRIES AT END CONTINUE WHEN PRODUCT-CODE(PROD-INDEX) = PRIMARY-KEY ADD 1 TO PRIMARY-MATCHES END-SEARCH. SEARCH-PRODUCTS-BY-CATEGORY. EVALUATE FUNCTION MOD(RECORDS-PROCESSED, 5) WHEN 0 MOVE 'ELEC' TO CATEGORY-FILTER WHEN 1 MOVE 'BOOK' TO CATEGORY-FILTER WHEN 2 MOVE 'CLTH' TO CATEGORY-FILTER WHEN 3 MOVE 'HOME' TO CATEGORY-FILTER WHEN 4 MOVE 'SPRT' TO CATEGORY-FILTER END-EVALUATE SET PROD-INDEX TO 1 SEARCH PRODUCT-ENTRIES AT END CONTINUE WHEN CATEGORY-CODE(PROD-INDEX) = CATEGORY-FILTER ADD 1 TO SECONDARY-MATCHES END-SEARCH. SEARCH-LOW-STOCK-PRODUCTS. MOVE 100 TO STOCK-THRESHOLD SET PROD-INDEX TO 1 SEARCH PRODUCT-ENTRIES AT END CONTINUE WHEN STOCK-QUANTITY(PROD-INDEX) < STOCK-THRESHOLD ADD 1 TO FINAL-MATCHES END-SEARCH. DEMONSTRATE-MULTI-KEY-SEARCHES. DISPLAY 'Demonstrating multi-key search operations...' *> Search by primary and secondary keys MOVE 'PROD25' TO PRIMARY-KEY MOVE 'ELEC' TO SECONDARY-KEY SEARCH ALL PRODUCT-ENTRIES AT END DISPLAY 'Product not found with multi-key search' WHEN PRODUCT-CODE(PROD-INDEX) = PRIMARY-KEY AND CATEGORY-CODE(PROD-INDEX) = SECONDARY-KEY DISPLAY 'Multi-key match found:' DISPLAY 'Product: ' PRODUCT-NAME(PROD-INDEX) DISPLAY 'Price: ' UNIT-PRICE(PROD-INDEX) DISPLAY 'Stock: ' STOCK-QUANTITY(PROD-INDEX) END-SEARCH. DEMONSTRATE-RANGE-SEARCHES. DISPLAY 'Demonstrating range search operations...' MOVE 100.00 TO MIN-PRICE MOVE 500.00 TO MAX-PRICE MOVE 0 TO MATCHES-FOUND MOVE 0 TO TOTAL-VALUE SET PROD-INDEX TO 1 PERFORM UNTIL PROD-INDEX > PRODUCT-COUNT SEARCH PRODUCT-ENTRIES AT END EXIT PERFORM WHEN UNIT-PRICE(PROD-INDEX) >= MIN-PRICE AND UNIT-PRICE(PROD-INDEX) <= MAX-PRICE ADD 1 TO MATCHES-FOUND ADD UNIT-PRICE(PROD-INDEX) TO TOTAL-VALUE DISPLAY 'Range match: ' PRODUCT-NAME(PROD-INDEX) DISPLAY 'Price: ' UNIT-PRICE(PROD-INDEX) SET PROD-INDEX UP BY 1 END-SEARCH END-PERFORM IF MATCHES-FOUND > 0 COMPUTE AVERAGE-PRICE = TOTAL-VALUE / MATCHES-FOUND DISPLAY 'Range search results:' DISPLAY 'Matches found: ' MATCHES-FOUND DISPLAY 'Total value: ' TOTAL-VALUE DISPLAY 'Average price: ' AVERAGE-PRICE END-IF. DEMONSTRATE-COMPLEX-FILTERING. DISPLAY 'Demonstrating complex filtering operations...' MOVE 'ELEC' TO CATEGORY-FILTER MOVE 200.00 TO MIN-PRICE MOVE 100 TO STOCK-THRESHOLD MOVE 0 TO MATCHES-FOUND SET PROD-INDEX TO 1 PERFORM UNTIL PROD-INDEX > PRODUCT-COUNT SEARCH PRODUCT-ENTRIES AT END EXIT PERFORM WHEN CATEGORY-CODE(PROD-INDEX) = CATEGORY-FILTER AND UNIT-PRICE(PROD-INDEX) >= MIN-PRICE AND STOCK-QUANTITY(PROD-INDEX) < STOCK-THRESHOLD AND PRODUCT-STATUS(PROD-INDEX) = 'AC' ADD 1 TO MATCHES-FOUND DISPLAY 'Complex filter match:' DISPLAY 'Product: ' PRODUCT-NAME(PROD-INDEX) DISPLAY 'Category: ' CATEGORY-CODE(PROD-INDEX) DISPLAY 'Price: ' UNIT-PRICE(PROD-INDEX) DISPLAY 'Stock: ' STOCK-QUANTITY(PROD-INDEX) DISPLAY 'Supplier: ' SUPPLIER-CODE(PROD-INDEX) SET PROD-INDEX UP BY 1 END-SEARCH END-PERFORM DISPLAY 'Complex filter matches: ' MATCHES-FOUND. DEMONSTRATE-NESTED-SEARCHES. DISPLAY 'Demonstrating nested search operations...' *> Find products and their supplier information SET PROD-INDEX TO 1 PERFORM UNTIL PROD-INDEX > 10 *> Limit for demonstration SEARCH PRODUCT-ENTRIES AT END EXIT PERFORM WHEN PRODUCT-STATUS(PROD-INDEX) = 'AC' DISPLAY 'Active Product: ' PRODUCT-NAME(PROD-INDEX) DISPLAY 'Supplier Code: ' SUPPLIER-CODE(PROD-INDEX) *> Nested search for supplier details SEARCH ALL SUPPLIER-ENTRIES AT END DISPLAY 'Supplier details not found' WHEN SUPPLIER-CODE(SUPP-INDEX) = SUPPLIER-CODE(PROD-INDEX) DISPLAY 'Supplier: ' SUPPLIER-NAME(SUPP-INDEX) DISPLAY 'Contact: ' CONTACT-PERSON(SUPP-INDEX) DISPLAY 'Phone: ' PHONE-NUMBER(SUPP-INDEX) DISPLAY 'Rating: ' RATING(SUPP-INDEX) END-SEARCH DISPLAY '---' SET PROD-INDEX UP BY 1 END-SEARCH END-PERFORM. CALCULATE-PERFORMANCE-METRICS. *> Calculate elapsed time and performance metrics *> This is a simplified calculation COMPUTE ELAPSED-TIME = 1000 *> Simulated milliseconds IF ELAPSED-TIME > 0 COMPUTE SEARCHES-PER-SECOND = (RECORDS-PROCESSED * 1000) / ELAPSED-TIME END-IF DISPLAY 'Performance Metrics:' DISPLAY 'Records processed: ' RECORDS-PROCESSED DISPLAY 'Elapsed time (ms): ' ELAPSED-TIME DISPLAY 'Searches per second: ' SEARCHES-PER-SECOND. DISPLAY-COMPREHENSIVE-STATISTICS. DISPLAY 'Comprehensive Search Statistics:' DISPLAY '================================' DISPLAY 'Primary key matches: ' PRIMARY-MATCHES DISPLAY 'Secondary key matches: ' SECONDARY-MATCHES DISPLAY 'Complex filter matches: ' FINAL-MATCHES DISPLAY 'Total records processed: ' RECORDS-PROCESSED DISPLAY '' DISPLAY 'Table Information:' DISPLAY 'Products in catalog: ' PRODUCT-COUNT DISPLAY 'Suppliers in system: ' SUPPLIER-COUNT DISPLAY 'Sales records: ' SALES-COUNT DISPLAY '' DISPLAY 'Search Efficiency:' IF RECORDS-PROCESSED > 0 COMPUTE PRIMARY-MATCHES = (PRIMARY-MATCHES / RECORDS-PROCESSED) * 100 DISPLAY 'Primary key hit rate: ' PRIMARY-MATCHES '%' END-IF.

Best Practices and FAQ

Best Practices
  • • Always use END-SEARCH with conditional processing
  • • Use binary search (SEARCH ALL) for sorted tables
  • • Implement proper index management
  • • Handle AT END conditions appropriately
  • • Consider table size for performance
Common Mistakes
  • • Omitting END-SEARCH in complex structures
  • • Using linear search on large sorted tables
  • • Poor index initialization
  • • Missing AT END handling
  • • Inefficient search conditions