MainframeMaster

COBOL Tutorial

COBOL POSITION

The POSITION concept in COBOL represents comprehensive data positioning and sophisticated location tracking capabilities within enterprise programming environments, providing advanced string positioning mechanisms for precise data placement, enhanced character location features for text processing operations, and intelligent position management capabilities that enable accurate data positioning, optimal string parsing workflows, and systematic location tracking while maintaining position accuracy, ensuring efficient text processing, and enabling flexible positioning architectures across business applications requiring exact data placement, character-level processing, and reliable position management throughout sophisticated text parsing and data extraction scenarios.

POSITION in String Operations

String Positioning and Location Tracking
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
*> POSITION usage in string operations WORKING-STORAGE SECTION. 01 WS-STRING-OPERATIONS. 05 WS-SOURCE-STRING PIC X(100) VALUE "JOHN,DOE,MANAGER,75000,CHICAGO,IL,60601". 05 WS-PARSED-DATA. 10 WS-FIRST-NAME PIC X(20). 10 WS-LAST-NAME PIC X(20). 10 WS-TITLE PIC X(20). 10 WS-SALARY PIC X(10). 10 WS-CITY PIC X(20). 10 WS-STATE PIC X(5). 10 WS-ZIP-CODE PIC X(10). 05 WS-POSITION-DATA. 10 WS-NAME-POSITION PIC 9(3). 10 WS-TITLE-POSITION PIC 9(3). 10 WS-SALARY-POSITION PIC 9(3). 10 WS-CITY-POSITION PIC 9(3). 10 WS-STATE-POSITION PIC 9(3). 10 WS-ZIP-POSITION PIC 9(3). 01 WS-STRING-POINTER PIC 9(3) VALUE 1. 01 WS-CURRENT-POSITION PIC 9(3). PROCEDURE DIVISION. DEMONSTRATE-STRING-POSITIONING. DISPLAY "=== STRING POSITIONING OPERATIONS ===" *> Parse string with position tracking UNSTRING WS-SOURCE-STRING DELIMITED BY "," INTO WS-FIRST-NAME DELIMITER IN WS-DELIMITER-1 POSITION IN WS-NAME-POSITION WS-LAST-NAME DELIMITER IN WS-DELIMITER-2 POSITION IN WS-TITLE-POSITION WS-TITLE DELIMITER IN WS-DELIMITER-3 POSITION IN WS-SALARY-POSITION WS-SALARY DELIMITER IN WS-DELIMITER-4 POSITION IN WS-CITY-POSITION WS-CITY DELIMITER IN WS-DELIMITER-5 POSITION IN WS-STATE-POSITION WS-STATE DELIMITER IN WS-DELIMITER-6 POSITION IN WS-ZIP-POSITION WS-ZIP-CODE WITH POINTER WS-STRING-POINTER END-UNSTRING *> Display parsed data with positions DISPLAY "Parsed Data with Positions:" DISPLAY "First Name: " WS-FIRST-NAME " (Position: " WS-NAME-POSITION ")" DISPLAY "Last Name: " WS-LAST-NAME " (Position: " WS-TITLE-POSITION ")" DISPLAY "Title: " WS-TITLE " (Position: " WS-SALARY-POSITION ")" DISPLAY "Salary: " WS-SALARY " (Position: " WS-CITY-POSITION ")" DISPLAY "City: " WS-CITY " (Position: " WS-STATE-POSITION ")" DISPLAY "State: " WS-STATE " (Position: " WS-ZIP-POSITION ")" DISPLAY "ZIP: " WS-ZIP-CODE *> Advanced position tracking TRACK-FIELD-POSITIONS. 01 WS-RECORD-LAYOUT. 05 WS-FIELD-POSITIONS OCCURS 10 TIMES. 10 WS-FIELD-NAME PIC X(15). 10 WS-START-POS PIC 9(3). 10 WS-END-POS PIC 9(3). 10 WS-FIELD-LENGTH PIC 9(3). MOVE "FIRST_NAME" TO WS-FIELD-NAME(1) MOVE WS-NAME-POSITION TO WS-START-POS(1) COMPUTE WS-END-POS(1) = WS-TITLE-POSITION - 1 COMPUTE WS-FIELD-LENGTH(1) = WS-END-POS(1) - WS-START-POS(1) + 1 MOVE "LAST_NAME" TO WS-FIELD-NAME(2) MOVE WS-TITLE-POSITION TO WS-START-POS(2) COMPUTE WS-END-POS(2) = WS-SALARY-POSITION - 1 COMPUTE WS-FIELD-LENGTH(2) = WS-END-POS(2) - WS-START-POS(2) + 1 DISPLAY "Field Layout Analysis:" PERFORM VARYING FIELD-INDEX FROM 1 BY 1 UNTIL FIELD-INDEX > 2 DISPLAY "Field: " WS-FIELD-NAME(FIELD-INDEX) DISPLAY " Start: " WS-START-POS(FIELD-INDEX) DISPLAY " End: " WS-END-POS(FIELD-INDEX) DISPLAY " Length: " WS-FIELD-LENGTH(FIELD-INDEX) END-PERFORM
String Processing
Position Tracking
Data Location

Advanced Position Operations

Complex Positioning and Data Extraction
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
*> Advanced position operations for data processing 01 WS-XML-PROCESSING. 05 WS-XML-STRING PIC X(500) VALUE "12345John Doe1500.75". 05 WS-TAG-POSITIONS OCCURS 10 TIMES. 10 WS-TAG-NAME PIC X(20). 10 WS-START-TAG-POS PIC 9(3). 10 WS-END-TAG-POS PIC 9(3). 10 WS-CONTENT-START PIC 9(3). 10 WS-CONTENT-END PIC 9(3). 05 WS-EXTRACTED-VALUES. 10 WS-CUSTOMER-ID PIC X(10). 10 WS-CUSTOMER-NAME PIC X(30). 10 WS-CUSTOMER-BALANCE PIC X(15). 01 WS-CSV-PROCESSING. 05 WS-CSV-RECORD PIC X(200) VALUE '"Product A","Electronics","$299.99","In Stock","Warehouse A"'. 05 WS-QUOTE-POSITIONS OCCURS 20 TIMES. 10 WS-QUOTE-START PIC 9(3). 10 WS-QUOTE-END PIC 9(3). 05 WS-CSV-FIELDS. 10 WS-PRODUCT-NAME PIC X(30). 10 WS-CATEGORY PIC X(20). 10 WS-PRICE PIC X(15). 10 WS-STATUS PIC X(15). 10 WS-LOCATION PIC X(20). PROCEDURE DIVISION. PROCESS-XML-POSITIONS. DISPLAY "=== XML POSITION PROCESSING ===" *> Find and extract XML tag positions MOVE 1 TO WS-SEARCH-POSITION MOVE 1 TO WS-TAG-COUNT *> Find customer ID PERFORM FIND-XML-TAG-POSITION USING "" "" "ID" 1 *> Find customer name PERFORM FIND-XML-TAG-POSITION USING "" "" "NAME" 2 *> Find customer balance PERFORM FIND-XML-TAG-POSITION USING "" "" "BALANCE" 3 *> Extract values based on positions PERFORM EXTRACT-XML-VALUES DISPLAY "Extracted XML Data:" DISPLAY " ID: " WS-CUSTOMER-ID DISPLAY " Name: " WS-CUSTOMER-NAME DISPLAY " Balance: " WS-CUSTOMER-BALANCE FIND-XML-TAG-POSITION. USING START-TAG END-TAG TAG-NAME TAG-INDEX. *> Find start tag position INSPECT WS-XML-STRING(WS-SEARCH-POSITION:) TALLYING WS-CHAR-COUNT FOR CHARACTERS BEFORE INITIAL START-TAG COMPUTE WS-START-TAG-POS(TAG-INDEX) = WS-SEARCH-POSITION + WS-CHAR-COUNT *> Calculate content start position COMPUTE WS-CONTENT-START(TAG-INDEX) = WS-START-TAG-POS(TAG-INDEX) + FUNCTION LENGTH(START-TAG) *> Find end tag position INSPECT WS-XML-STRING(WS-CONTENT-START(TAG-INDEX):) TALLYING WS-CHAR-COUNT FOR CHARACTERS BEFORE INITIAL END-TAG COMPUTE WS-CONTENT-END(TAG-INDEX) = WS-CONTENT-START(TAG-INDEX) + WS-CHAR-COUNT - 1 MOVE TAG-NAME TO WS-TAG-NAME(TAG-INDEX) DISPLAY "Tag: " TAG-NAME DISPLAY " Content Position: " WS-CONTENT-START(TAG-INDEX) " to " WS-CONTENT-END(TAG-INDEX) EXTRACT-XML-VALUES. *> Extract customer ID COMPUTE WS-EXTRACT-LENGTH = WS-CONTENT-END(1) - WS-CONTENT-START(1) + 1 MOVE WS-XML-STRING(WS-CONTENT-START(1):WS-EXTRACT-LENGTH) TO WS-CUSTOMER-ID *> Extract customer name COMPUTE WS-EXTRACT-LENGTH = WS-CONTENT-END(2) - WS-CONTENT-START(2) + 1 MOVE WS-XML-STRING(WS-CONTENT-START(2):WS-EXTRACT-LENGTH) TO WS-CUSTOMER-NAME *> Extract customer balance COMPUTE WS-EXTRACT-LENGTH = WS-CONTENT-END(3) - WS-CONTENT-START(3) + 1 MOVE WS-XML-STRING(WS-CONTENT-START(3):WS-EXTRACT-LENGTH) TO WS-CUSTOMER-BALANCE PROCESS-CSV-POSITIONS. DISPLAY " " DISPLAY "=== CSV POSITION PROCESSING ===" *> Find quoted field positions MOVE 1 TO WS-SEARCH-POSITION MOVE 0 TO WS-QUOTE-COUNT PERFORM VARYING CHAR-INDEX FROM 1 BY 1 UNTIL CHAR-INDEX > FUNCTION LENGTH(WS-CSV-RECORD) IF WS-CSV-RECORD(CHAR-INDEX:1) = '"' ADD 1 TO WS-QUOTE-COUNT IF WS-QUOTE-COUNT IS ODD MOVE CHAR-INDEX TO WS-QUOTE-START((WS-QUOTE-COUNT + 1) / 2) ELSE MOVE CHAR-INDEX TO WS-QUOTE-END(WS-QUOTE-COUNT / 2) END-IF END-IF END-PERFORM *> Extract CSV fields based on quote positions PERFORM EXTRACT-CSV-FIELDS DISPLAY "Extracted CSV Data:" DISPLAY " Product: " WS-PRODUCT-NAME DISPLAY " Category: " WS-CATEGORY DISPLAY " Price: " WS-PRICE DISPLAY " Status: " WS-STATUS DISPLAY " Location: " WS-LOCATION EXTRACT-CSV-FIELDS. *> Extract each quoted field PERFORM VARYING FIELD-INDEX FROM 1 BY 1 UNTIL FIELD-INDEX > 5 COMPUTE WS-FIELD-START = WS-QUOTE-START(FIELD-INDEX) + 1 COMPUTE WS-FIELD-LENGTH = WS-QUOTE-END(FIELD-INDEX) - WS-QUOTE-START(FIELD-INDEX) - 1 EVALUATE FIELD-INDEX WHEN 1 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-PRODUCT-NAME WHEN 2 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-CATEGORY WHEN 3 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-PRICE WHEN 4 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-STATUS WHEN 5 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-LOCATION END-EVALUATE END-PERFORM

Complete POSITION System

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
IDENTIFICATION DIVISION. PROGRAM-ID. POSITION-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-POSITION-CONTROL. 05 WS-PROCESSING-COUNT PIC 9(4) VALUE 0. 05 WS-POSITION-ERRORS PIC 9(3) VALUE 0. 05 WS-EXTRACTION-COUNT PIC 9(4) VALUE 0. 01 WS-LOG-PROCESSING. 05 WS-LOG-RECORD PIC X(300) VALUE "2023-12-25 14:30:45 [INFO] User john.doe logged in from IP 192.168.1.100". 05 WS-LOG-COMPONENTS. 10 WS-LOG-DATE PIC X(10). 10 WS-LOG-TIME PIC X(8). 10 WS-LOG-LEVEL PIC X(10). 10 WS-LOG-MESSAGE PIC X(100). 10 WS-LOG-IP PIC X(15). PROCEDURE DIVISION. MAIN-POSITION-DEMO. DISPLAY "=== COMPREHENSIVE POSITION DEMO ===" PERFORM PARSE-LOG-ENTRIES PERFORM VALIDATE-POSITION-DATA PERFORM DISPLAY-EXTRACTION-RESULTS DISPLAY "=== POSITION DEMO COMPLETE ===" STOP RUN. PARSE-LOG-ENTRIES. DISPLAY "Parsing log entries with position tracking..." *> Parse log components using position-aware extraction UNSTRING WS-LOG-RECORD DELIMITED BY " " INTO WS-LOG-DATE WS-LOG-TIME WS-LOG-LEVEL DELIMITER IN WS-DELIMITER WS-LOG-MESSAGE COUNT IN WS-FIELD-COUNT END-UNSTRING ADD 1 TO WS-PROCESSING-COUNT ADD 1 TO WS-EXTRACTION-COUNT DISPLAY "✅ Log entry parsed successfully" DISPLAY-EXTRACTION-RESULTS. DISPLAY "📊 Position Processing Results:" DISPLAY " Records processed: " WS-PROCESSING-COUNT DISPLAY " Extractions: " WS-EXTRACTION-COUNT DISPLAY " Errors: " WS-POSITION-ERRORS DISPLAY " " DISPLAY "Extracted log components:" DISPLAY " Date: " WS-LOG-DATE DISPLAY " Time: " WS-LOG-TIME DISPLAY " Level: " WS-LOG-LEVEL DISPLAY " Message: " WS-LOG-MESSAGE

POSITION Features and Capabilities

String Processing
  • • Character position tracking
  • • Field boundary detection
  • • String parsing coordination
  • • Data extraction positioning
Data Location
  • • Tag position identification
  • • Field start/end tracking
  • • Content boundary detection
  • • Layout analysis support

Best Practices