MainframeMaster

COBOL Tutorial

COBOL CHANGED Status Flag

The CHANGED status flag in COBOL is a powerful feature for detecting data modification in screen-based and interactive applications. This flag automatically tracks whether data fields have been modified by user input, enabling efficient screen processing, data validation, and selective field updates in forms-based applications where it's essential to identify which specific fields have been altered during user interaction, optimizing database performance and maintaining data integrity through targeted updates and comprehensive audit trails for regulatory compliance and business process automation.

Understanding CHANGED Flag

The CHANGED flag is automatically set by COBOL runtime when a field's value is modified through terminal input or screen operations. It provides a mechanism to detect which fields have been changed without manually comparing old and new values, enabling sophisticated screen processing workflows and optimized database operations in enterprise-scale applications.

Key Features:

  • Automatic modification detection for screen section fields and terminal I/O
  • Screen field change tracking with precise field-level granularity
  • Selective processing capabilities for performance optimization and efficiency
  • Form validation support with comprehensive field-level change awareness
  • Database update optimization through selective field modification detection
  • Integration with audit logging systems for compliance and change 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
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
*> Basic CHANGED flag usage with comprehensive change tracking DATA DIVISION. WORKING-STORAGE SECTION. 01 SCREEN-CONTROL-FLAGS. 05 CUSTOMER-ID-CHANGED PIC X VALUE 'N'. 88 CUSTOMER-ID-MODIFIED VALUE 'Y'. 05 CUSTOMER-NAME-CHANGED PIC X VALUE 'N'. 88 CUSTOMER-NAME-MODIFIED VALUE 'Y'. 05 CUSTOMER-PHONE-CHANGED PIC X VALUE 'N'. 88 CUSTOMER-PHONE-MODIFIED VALUE 'Y'. 05 CUSTOMER-EMAIL-CHANGED PIC X VALUE 'N'. 88 CUSTOMER-EMAIL-MODIFIED VALUE 'Y'. 01 CUSTOMER-DATA. 05 CUSTOMER-ID PIC 9(8). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-PHONE PIC X(15). 05 CUSTOMER-EMAIL PIC X(40). 05 CUSTOMER-STATUS PIC X(10). 01 ORIGINAL-DATA. 05 ORIG-CUSTOMER-ID PIC 9(8). 05 ORIG-CUSTOMER-NAME PIC X(30). 05 ORIG-CUSTOMER-PHONE PIC X(15). 05 ORIG-CUSTOMER-EMAIL PIC X(40). 05 ORIG-CUSTOMER-STATUS PIC X(10). 01 CHANGE-STATISTICS. 05 TOTAL-FIELDS-CHECKED PIC 9(3) VALUE ZERO. 05 FIELDS-CHANGED PIC 9(3) VALUE ZERO. 05 VALIDATION-PASSES PIC 9(3) VALUE ZERO. 05 VALIDATION-FAILURES PIC 9(3) VALUE ZERO. PROCEDURE DIVISION. MAIN-SCREEN-PROCESSING. PERFORM INITIALIZE-SCREEN-DATA PERFORM DISPLAY-ENTRY-SCREEN PERFORM PROCESS-CHANGED-FIELDS PERFORM DISPLAY-CHANGE-SUMMARY. INITIALIZE-SCREEN-DATA. MOVE CUSTOMER-DATA TO ORIGINAL-DATA MOVE 'N' TO CUSTOMER-ID-CHANGED CUSTOMER-NAME-CHANGED CUSTOMER-PHONE-CHANGED CUSTOMER-EMAIL-CHANGED MOVE ZERO TO TOTAL-FIELDS-CHECKED FIELDS-CHANGED VALIDATION-PASSES VALIDATION-FAILURES. PROCESS-CHANGED-FIELDS. ADD 1 TO TOTAL-FIELDS-CHECKED IF CUSTOMER-ID NOT = ORIG-CUSTOMER-ID MOVE 'Y' TO CUSTOMER-ID-CHANGED ADD 1 TO FIELDS-CHANGED DISPLAY "Customer ID changed: " ORIG-CUSTOMER-ID " -> " CUSTOMER-ID PERFORM VALIDATE-CUSTOMER-ID END-IF ADD 1 TO TOTAL-FIELDS-CHECKED IF CUSTOMER-NAME NOT = ORIG-CUSTOMER-NAME MOVE 'Y' TO CUSTOMER-NAME-CHANGED ADD 1 TO FIELDS-CHANGED DISPLAY "Customer Name changed" PERFORM VALIDATE-CUSTOMER-NAME END-IF ADD 1 TO TOTAL-FIELDS-CHECKED IF CUSTOMER-PHONE NOT = ORIG-CUSTOMER-PHONE MOVE 'Y' TO CUSTOMER-PHONE-CHANGED ADD 1 TO FIELDS-CHANGED DISPLAY "Customer Phone changed" PERFORM VALIDATE-CUSTOMER-PHONE END-IF ADD 1 TO TOTAL-FIELDS-CHECKED IF CUSTOMER-EMAIL NOT = ORIG-CUSTOMER-EMAIL MOVE 'Y' TO CUSTOMER-EMAIL-CHANGED ADD 1 TO FIELDS-CHANGED DISPLAY "Customer Email changed" PERFORM VALIDATE-CUSTOMER-EMAIL END-IF. VALIDATE-CUSTOMER-ID. IF CUSTOMER-ID = ZERO OR CUSTOMER-ID > 99999999 ADD 1 TO VALIDATION-FAILURES DISPLAY "ERROR: Invalid Customer ID" ELSE ADD 1 TO VALIDATION-PASSES DISPLAY "Customer ID validation: PASSED" END-IF. VALIDATE-CUSTOMER-NAME. IF CUSTOMER-NAME = SPACES ADD 1 TO VALIDATION-FAILURES DISPLAY "ERROR: Customer Name cannot be blank" ELSE ADD 1 TO VALIDATION-PASSES DISPLAY "Customer Name validation: PASSED" END-IF. VALIDATE-CUSTOMER-PHONE. IF CUSTOMER-PHONE = SPACES ADD 1 TO VALIDATION-FAILURES DISPLAY "ERROR: Phone number required" ELSE ADD 1 TO VALIDATION-PASSES DISPLAY "Phone validation: PASSED" END-IF. VALIDATE-CUSTOMER-EMAIL. IF CUSTOMER-EMAIL = SPACES ADD 1 TO VALIDATION-FAILURES DISPLAY "ERROR: Email address required" ELSE ADD 1 TO VALIDATION-PASSES DISPLAY "Email validation: PASSED" END-IF. DISPLAY-CHANGE-SUMMARY. DISPLAY "=== Change Processing Summary ===" DISPLAY "Total Fields Checked: " TOTAL-FIELDS-CHECKED DISPLAY "Fields Changed: " FIELDS-CHANGED DISPLAY "Validations Passed: " VALIDATION-PASSES DISPLAY "Validation Failures: " VALIDATION-FAILURES.

Advanced Screen Processing with CHANGED

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
*> Advanced screen processing using CHANGED flag for complex forms DATA DIVISION. WORKING-STORAGE SECTION. 01 SCREEN-CONTROL-SYSTEM. 05 TOTAL-FIELDS PIC 9(3) VALUE 15. 05 CHANGED-FIELDS PIC 9(3) VALUE ZERO. 05 VALIDATION-ERRORS PIC 9(3) VALUE ZERO. 05 SCREEN-STATUS PIC X(10) VALUE "READY". 88 SCREEN-READY VALUE "READY". 88 SCREEN-CHANGED VALUE "CHANGED". 88 SCREEN-ERROR VALUE "ERROR". 01 FIELD-CHANGE-TRACKING. 05 FIELD-CHANGES OCCURS 15 TIMES. 10 FC-FIELD-NAME PIC X(20). 10 FC-OLD-VALUE PIC X(50). 10 FC-NEW-VALUE PIC X(50). 10 FC-CHANGED PIC X VALUE 'N'. 88 FIELD-WAS-CHANGED VALUE 'Y'. 10 FC-VALIDATED PIC X VALUE 'N'. 88 FIELD-IS-VALID VALUE 'Y'. 10 FC-TIMESTAMP PIC X(26). 10 FC-USER-ID PIC X(8). 01 CUSTOMER-SCREEN-DATA. 05 CUST-ID PIC 9(8). 05 CUST-NAME PIC X(30). 05 CUST-ADDRESS PIC X(50). 05 CUST-PHONE PIC X(15). 05 CUST-EMAIL PIC X(40). 05 CUST-STATUS PIC X(10). 05 CUST-CREDIT-LIMIT PIC 9(7)V99. 05 CUST-DISCOUNT-PCT PIC 9(2)V99. 01 ORIGINAL-SCREEN-DATA. 05 ORIG-CUST-ID PIC 9(8). 05 ORIG-CUST-NAME PIC X(30). 05 ORIG-CUST-ADDRESS PIC X(50). 05 ORIG-CUST-PHONE PIC X(15). 05 ORIG-CUST-EMAIL PIC X(40). 05 ORIG-CUST-STATUS PIC X(10). 05 ORIG-CUST-CREDIT-LIMIT PIC 9(7)V99. 05 ORIG-CUST-DISCOUNT-PCT PIC 9(2)V99. 01 VALIDATION-RULES. 05 MIN-CREDIT-LIMIT PIC 9(7)V99 VALUE 100.00. 05 MAX-CREDIT-LIMIT PIC 9(7)V99 VALUE 999999.99. 05 MAX-DISCOUNT-PCT PIC 9(2)V99 VALUE 50.00. PROCEDURE DIVISION. ADVANCED-SCREEN-PROCESSING. PERFORM INITIALIZE-SCREEN-SYSTEM PERFORM DISPLAY-CUSTOMER-SCREEN PERFORM PROCESS-SCREEN-CHANGES PERFORM VALIDATE-CHANGED-FIELDS PERFORM UPDATE-CHANGED-DATA. INITIALIZE-SCREEN-SYSTEM. MOVE ZERO TO CHANGED-FIELDS VALIDATION-ERRORS MOVE "READY" TO SCREEN-STATUS MOVE CUSTOMER-SCREEN-DATA TO ORIGINAL-SCREEN-DATA MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-TIMESTAMP *> Initialize field tracking PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > TOTAL-FIELDS MOVE 'N' TO FC-CHANGED(WS-I) FC-VALIDATED(WS-I) MOVE SPACES TO FC-FIELD-NAME(WS-I) FC-OLD-VALUE(WS-I) FC-NEW-VALUE(WS-I) FC-USER-ID(WS-I) MOVE SPACES TO FC-TIMESTAMP(WS-I) END-PERFORM. PROCESS-SCREEN-CHANGES. MOVE ZERO TO CHANGED-FIELDS *> Check each field for changes PERFORM CHECK-CUSTOMER-ID-CHANGE PERFORM CHECK-CUSTOMER-NAME-CHANGE PERFORM CHECK-CUSTOMER-ADDRESS-CHANGE PERFORM CHECK-CUSTOMER-PHONE-CHANGE PERFORM CHECK-CUSTOMER-EMAIL-CHANGE PERFORM CHECK-CUSTOMER-STATUS-CHANGE PERFORM CHECK-CREDIT-LIMIT-CHANGE PERFORM CHECK-DISCOUNT-PCT-CHANGE IF CHANGED-FIELDS > ZERO MOVE "CHANGED" TO SCREEN-STATUS DISPLAY "Screen contains " CHANGED-FIELDS " changed fields" ELSE DISPLAY "No changes detected on screen" END-IF. CHECK-CUSTOMER-ID-CHANGE. IF CUST-ID NOT = ORIG-CUST-ID ADD 1 TO CHANGED-FIELDS MOVE "CUSTOMER_ID" TO FC-FIELD-NAME(1) MOVE ORIG-CUST-ID TO FC-OLD-VALUE(1) MOVE CUST-ID TO FC-NEW-VALUE(1) MOVE 'Y' TO FC-CHANGED(1) MOVE WS-CURRENT-TIMESTAMP TO FC-TIMESTAMP(1) MOVE WS-USER-ID TO FC-USER-ID(1) DISPLAY "Customer ID changed: " ORIG-CUST-ID " -> " CUST-ID END-IF. CHECK-CUSTOMER-NAME-CHANGE. IF CUST-NAME NOT = ORIG-CUST-NAME ADD 1 TO CHANGED-FIELDS MOVE "CUSTOMER_NAME" TO FC-FIELD-NAME(2) MOVE ORIG-CUST-NAME TO FC-OLD-VALUE(2) MOVE CUST-NAME TO FC-NEW-VALUE(2) MOVE 'Y' TO FC-CHANGED(2) MOVE WS-CURRENT-TIMESTAMP TO FC-TIMESTAMP(2) MOVE WS-USER-ID TO FC-USER-ID(2) DISPLAY "Customer Name changed" END-IF. CHECK-CREDIT-LIMIT-CHANGE. IF CUST-CREDIT-LIMIT NOT = ORIG-CUST-CREDIT-LIMIT ADD 1 TO CHANGED-FIELDS MOVE "CREDIT_LIMIT" TO FC-FIELD-NAME(7) MOVE ORIG-CUST-CREDIT-LIMIT TO FC-OLD-VALUE(7) MOVE CUST-CREDIT-LIMIT TO FC-NEW-VALUE(7) MOVE 'Y' TO FC-CHANGED(7) MOVE WS-CURRENT-TIMESTAMP TO FC-TIMESTAMP(7) MOVE WS-USER-ID TO FC-USER-ID(7) DISPLAY "Credit Limit changed" END-IF. CHECK-DISCOUNT-PCT-CHANGE. IF CUST-DISCOUNT-PCT NOT = ORIG-CUST-DISCOUNT-PCT ADD 1 TO CHANGED-FIELDS MOVE "DISCOUNT_PCT" TO FC-FIELD-NAME(8) MOVE ORIG-CUST-DISCOUNT-PCT TO FC-OLD-VALUE(8) MOVE CUST-DISCOUNT-PCT TO FC-NEW-VALUE(8) MOVE 'Y' TO FC-CHANGED(8) MOVE WS-CURRENT-TIMESTAMP TO FC-TIMESTAMP(8) MOVE WS-USER-ID TO FC-USER-ID(8) DISPLAY "Discount Percentage changed" END-IF. VALIDATE-CHANGED-FIELDS. MOVE ZERO TO VALIDATION-ERRORS PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8 IF FC-CHANGED(WS-I) = 'Y' PERFORM VALIDATE-FIELD-CHANGE END-IF END-PERFORM IF VALIDATION-ERRORS > ZERO MOVE "ERROR" TO SCREEN-STATUS DISPLAY "Validation errors found: " VALIDATION-ERRORS END-IF. VALIDATE-FIELD-CHANGE. EVALUATE FC-FIELD-NAME(WS-I) WHEN "CUSTOMER_ID" PERFORM VALIDATE-CUSTOMER-ID-FIELD WHEN "CUSTOMER_NAME" PERFORM VALIDATE-CUSTOMER-NAME-FIELD WHEN "CUSTOMER_ADDRESS" PERFORM VALIDATE-CUSTOMER-ADDRESS-FIELD WHEN "CUSTOMER_PHONE" PERFORM VALIDATE-CUSTOMER-PHONE-FIELD WHEN "CUSTOMER_EMAIL" PERFORM VALIDATE-CUSTOMER-EMAIL-FIELD WHEN "CUSTOMER_STATUS" PERFORM VALIDATE-CUSTOMER-STATUS-FIELD WHEN "CREDIT_LIMIT" PERFORM VALIDATE-CREDIT-LIMIT-FIELD WHEN "DISCOUNT_PCT" PERFORM VALIDATE-DISCOUNT-PCT-FIELD END-EVALUATE. VALIDATE-CREDIT-LIMIT-FIELD. IF CUST-CREDIT-LIMIT < MIN-CREDIT-LIMIT OR CUST-CREDIT-LIMIT > MAX-CREDIT-LIMIT ADD 1 TO VALIDATION-ERRORS DISPLAY "Credit limit must be between " MIN-CREDIT-LIMIT " and " MAX-CREDIT-LIMIT ELSE MOVE 'Y' TO FC-VALIDATED(WS-I) END-IF. VALIDATE-DISCOUNT-PCT-FIELD. IF CUST-DISCOUNT-PCT < ZERO OR CUST-DISCOUNT-PCT > MAX-DISCOUNT-PCT ADD 1 TO VALIDATION-ERRORS DISPLAY "Discount percentage must be between 0 and " MAX-DISCOUNT-PCT "%" ELSE MOVE 'Y' TO FC-VALIDATED(WS-I) END-IF. UPDATE-CHANGED-DATA. IF SCREEN-STATUS = "CHANGED" AND VALIDATION-ERRORS = ZERO PERFORM UPDATE-DATABASE-RECORDS PERFORM LOG-FIELD-CHANGES PERFORM RESET-CHANGE-FLAGS DISPLAY "Update completed successfully" ELSE DISPLAY "Update cancelled due to validation errors" END-IF. LOG-FIELD-CHANGES. DISPLAY "=== Detailed Change Log ===" PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8 IF FC-CHANGED(WS-I) = 'Y' DISPLAY "Field: " FC-FIELD-NAME(WS-I) DISPLAY "User: " FC-USER-ID(WS-I) DISPLAY "Old Value: " FC-OLD-VALUE(WS-I) DISPLAY "New Value: " FC-NEW-VALUE(WS-I) DISPLAY "Timestamp: " FC-TIMESTAMP(WS-I) DISPLAY "Validated: " FC-VALIDATED(WS-I) DISPLAY "---" END-IF END-PERFORM. RESET-CHANGE-FLAGS. *> Reset for next screen operation MOVE CUSTOMER-SCREEN-DATA TO ORIGINAL-SCREEN-DATA PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8 MOVE 'N' TO FC-CHANGED(WS-I) FC-VALIDATED(WS-I) END-PERFORM MOVE "READY" TO SCREEN-STATUS.

Database Integration with Change Detection

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
*> Database integration using CHANGED flag for selective updates DATA DIVISION. WORKING-STORAGE SECTION. 01 DATABASE-UPDATE-CONTROL. 05 UPDATE-COUNT PIC 9(4) VALUE ZERO. 05 INSERT-COUNT PIC 9(4) VALUE ZERO. 05 ERROR-COUNT PIC 9(3) VALUE ZERO. 05 TRANSACTION-STATUS PIC X(10) VALUE "PENDING". 88 TRANS-PENDING VALUE "PENDING". 88 TRANS-COMMITTED VALUE "COMMITTED". 88 TRANS-ROLLEDBACK VALUE "ROLLEDBACK". 01 SQL-STATEMENTS. 05 UPDATE-CUSTOMER-SQL PIC X(200) VALUE "UPDATE CUSTOMERS SET ". 05 WHERE-CLAUSE PIC X(50) VALUE " WHERE CUSTOMER_ID = ?". 05 DYNAMIC-SQL PIC X(500). 01 CHANGE-AUDIT-LOG. 05 AUDIT-RECORD. 10 AUDIT-USER-ID PIC X(8). 10 AUDIT-TABLE PIC X(20). 10 AUDIT-FIELD PIC X(20). 10 AUDIT-OLD-VAL PIC X(50). 10 AUDIT-NEW-VAL PIC X(50). 10 AUDIT-TIMESTAMP PIC X(26). 10 AUDIT-ACTION PIC X(10). 01 PERFORMANCE-METRICS. 05 SELECTIVE-UPDATES PIC 9(6) VALUE ZERO. 05 FULL-UPDATES PIC 9(6) VALUE ZERO. 05 UPDATE-TIME-START PIC 9(8). 05 UPDATE-TIME-END PIC 9(8). 05 UPDATE-DURATION PIC 9(4)V99. PROCEDURE DIVISION. DATABASE-INTEGRATION-PROCESSING. PERFORM INITIALIZE-DATABASE-UPDATE PERFORM BUILD-SELECTIVE-UPDATE-SQL PERFORM EXECUTE-DATABASE-UPDATES PERFORM COMMIT-OR-ROLLBACK-TRANSACTION PERFORM DISPLAY-PERFORMANCE-METRICS. INITIALIZE-DATABASE-UPDATE. MOVE ZERO TO UPDATE-COUNT INSERT-COUNT ERROR-COUNT SELECTIVE-UPDATES FULL-UPDATES MOVE "PENDING" TO TRANSACTION-STATUS MOVE FUNCTION CURRENT-DATE TO AUDIT-TIMESTAMP MOVE WS-USER-ID TO AUDIT-USER-ID MOVE "CUSTOMERS" TO AUDIT-TABLE MOVE FUNCTION CURRENT-DATE(9:8) TO UPDATE-TIME-START. BUILD-SELECTIVE-UPDATE-SQL. MOVE SPACES TO DYNAMIC-SQL STRING "UPDATE CUSTOMERS SET " DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING MOVE 'N' TO WS-FIRST-FIELD *> Build SQL for changed fields only PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8 IF FC-CHANGED(WS-I) = 'Y' AND FC-VALIDATED(WS-I) = 'Y' PERFORM ADD-FIELD-TO-UPDATE-SQL END-IF END-PERFORM *> Add WHERE clause STRING DYNAMIC-SQL DELIMITED BY " " WHERE-CLAUSE DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING DISPLAY "Generated Selective SQL: " DYNAMIC-SQL. ADD-FIELD-TO-UPDATE-SQL. IF WS-FIRST-FIELD = 'Y' STRING DYNAMIC-SQL DELIMITED BY " " ", " DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING ELSE MOVE 'Y' TO WS-FIRST-FIELD END-IF EVALUATE FC-FIELD-NAME(WS-I) WHEN "CUSTOMER_NAME" STRING DYNAMIC-SQL DELIMITED BY " " "CUSTOMER_NAME = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING WHEN "CUSTOMER_ADDRESS" STRING DYNAMIC-SQL DELIMITED BY " " "CUSTOMER_ADDRESS = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING WHEN "CUSTOMER_PHONE" STRING DYNAMIC-SQL DELIMITED BY " " "CUSTOMER_PHONE = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING WHEN "CUSTOMER_EMAIL" STRING DYNAMIC-SQL DELIMITED BY " " "CUSTOMER_EMAIL = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING WHEN "CUSTOMER_STATUS" STRING DYNAMIC-SQL DELIMITED BY " " "CUSTOMER_STATUS = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING WHEN "CREDIT_LIMIT" STRING DYNAMIC-SQL DELIMITED BY " " "CREDIT_LIMIT = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING WHEN "DISCOUNT_PCT" STRING DYNAMIC-SQL DELIMITED BY " " "DISCOUNT_PCT = ?" DELIMITED BY SIZE INTO DYNAMIC-SQL END-STRING END-EVALUATE. EXECUTE-DATABASE-UPDATES. *> Execute the selective update EXEC SQL PREPARE UPDATE_STMT FROM :DYNAMIC-SQL END-EXEC IF SQLCODE = 0 PERFORM BIND-CHANGED-VALUES EXEC SQL EXECUTE UPDATE_STMT END-EXEC IF SQLCODE = 0 ADD 1 TO UPDATE-COUNT ADD 1 TO SELECTIVE-UPDATES PERFORM LOG-UPDATE-SUCCESS ELSE ADD 1 TO ERROR-COUNT PERFORM LOG-UPDATE-ERROR END-IF ELSE ADD 1 TO ERROR-COUNT DISPLAY "SQL Prepare Error: " SQLCODE END-IF. BIND-CHANGED-VALUES. MOVE 1 TO WS-PARAM-NUM PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8 IF FC-CHANGED(WS-I) = 'Y' AND FC-VALIDATED(WS-I) = 'Y' PERFORM BIND-PARAMETER-VALUE END-IF END-PERFORM *> Bind customer ID for WHERE clause EXEC SQL SET :CUST-ID = PARAMETER :WS-PARAM-NUM END-EXEC. BIND-PARAMETER-VALUE. EVALUATE FC-FIELD-NAME(WS-I) WHEN "CUSTOMER_NAME" EXEC SQL SET :CUST-NAME = PARAMETER :WS-PARAM-NUM END-EXEC WHEN "CUSTOMER_ADDRESS" EXEC SQL SET :CUST-ADDRESS = PARAMETER :WS-PARAM-NUM END-EXEC WHEN "CUSTOMER_PHONE" EXEC SQL SET :CUST-PHONE = PARAMETER :WS-PARAM-NUM END-EXEC WHEN "CUSTOMER_EMAIL" EXEC SQL SET :CUST-EMAIL = PARAMETER :WS-PARAM-NUM END-EXEC WHEN "CUSTOMER_STATUS" EXEC SQL SET :CUST-STATUS = PARAMETER :WS-PARAM-NUM END-EXEC WHEN "CREDIT_LIMIT" EXEC SQL SET :CUST-CREDIT-LIMIT = PARAMETER :WS-PARAM-NUM END-EXEC WHEN "DISCOUNT_PCT" EXEC SQL SET :CUST-DISCOUNT-PCT = PARAMETER :WS-PARAM-NUM END-EXEC END-EVALUATE ADD 1 TO WS-PARAM-NUM. LOG-UPDATE-SUCCESS. PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8 IF FC-CHANGED(WS-I) = 'Y' MOVE FC-FIELD-NAME(WS-I) TO AUDIT-FIELD MOVE FC-OLD-VALUE(WS-I) TO AUDIT-OLD-VAL MOVE FC-NEW-VALUE(WS-I) TO AUDIT-NEW-VAL MOVE "UPDATE" TO AUDIT-ACTION PERFORM WRITE-AUDIT-RECORD END-IF END-PERFORM. COMMIT-OR-ROLLBACK-TRANSACTION. MOVE FUNCTION CURRENT-DATE(9:8) TO UPDATE-TIME-END COMPUTE UPDATE-DURATION = UPDATE-TIME-END - UPDATE-TIME-START IF ERROR-COUNT = ZERO EXEC SQL COMMIT END-EXEC MOVE "COMMITTED" TO TRANSACTION-STATUS DISPLAY "Transaction committed successfully" DISPLAY "Updated records: " UPDATE-COUNT ELSE EXEC SQL ROLLBACK END-EXEC MOVE "ROLLEDBACK" TO TRANSACTION-STATUS DISPLAY "Transaction rolled back due to errors" DISPLAY "Error count: " ERROR-COUNT END-IF. DISPLAY-PERFORMANCE-METRICS. DISPLAY "=== Database Update Performance ===" DISPLAY "Selective Updates: " SELECTIVE-UPDATES DISPLAY "Full Table Updates: " FULL-UPDATES DISPLAY "Update Duration: " UPDATE-DURATION " seconds" DISPLAY "Transaction Status: " TRANSACTION-STATUS IF SELECTIVE-UPDATES > 0 DISPLAY "Performance Optimization: ENABLED" DISPLAY "Changed Fields Only: YES" ELSE DISPLAY "Performance Optimization: DISABLED" DISPLAY "Full Record Updates: YES" END-IF.

Best Practices and Guidelines

CHANGED Flag Implementation Guidelines:

  • Initialize change flags consistently before screen operations to ensure accurate tracking
  • Use selective processing for changed fields only to optimize database performance
  • Implement comprehensive validation for field changes before database updates
  • Log field changes for audit purposes and compliance requirements
  • Reset flags after successful updates to prepare for subsequent screen operations
  • Handle transaction boundaries carefully when multiple fields are changed
  • Implement rollback mechanisms for partial update failures
  • Use change timestamps for concurrency control and audit trails
  • Consider field-level security when processing changed data
  • Optimize screen refresh by updating only changed display areas
  • Monitor performance metrics to measure optimization effectiveness
  • Implement proper error handling for failed change detection operations

Comprehensive FAQ

Q: Does CHANGED work with all field types?

CHANGED status is primarily designed for screen section fields and terminal I/O operations. It works with alphanumeric, numeric, and edited fields in screen processing contexts. For Working-Storage fields, you need to implement manual change detection by comparing current values with saved original values using string comparison or arithmetic operations.

Q: How do I reset the CHANGED flag after processing?

The CHANGED flag is automatically reset when you redisplay the screen or field. You can also manually reset it by moving the current field values to your "original values" storage area after successful processing. This prepares the system for detecting the next set of changes and ensures accurate change tracking for subsequent operations.

Q: Can CHANGED detect partial field modifications?

Yes, CHANGED detects any modification to a field, whether it's a complete replacement or partial changes. Even changing a single character in a field will trigger the CHANGED status. However, it doesn't provide information about what specifically changed within the field - you need additional logic to determine the exact changes.

Q: How does CHANGED work with database transactions?

CHANGED flag detection should be used to build selective UPDATE statements that only modify fields that have actually changed. This improves performance and reduces database locking. Always validate changed fields before committing transactions and implement proper rollback handling for failed updates to maintain data consistency.

Q: What's the best way to handle multiple changed fields?

Process all changed fields within a single transaction boundary when possible. Validate all fields first, then perform all updates together. If one update fails, roll back the entire transaction to maintain data consistency. Use field-level timestamps for audit trails and concurrency control in multi-user environments.

Q: Can I use CHANGED for performance optimization?

Absolutely! CHANGED enables significant performance optimizations by allowing selective processing. Only validate, transform, and update fields that have actually changed. This reduces CPU usage, database I/O, and network traffic in forms-based applications with many fields, especially in high-volume transaction processing environments.

Q: How do I implement audit trails with CHANGED flags?

Create audit log records for each changed field, capturing the old value, new value, timestamp, user ID, and field name. Store this information in audit tables for compliance reporting and change tracking. Include transaction IDs to group related changes and implement retention policies for audit data management.

Interactive Quiz

Test Your CHANGED Flag Knowledge

1. What is the primary purpose of the CHANGED flag?

2. When is the CHANGED flag automatically reset?

3. What's the main benefit of using CHANGED for database updates?

Answers: 1-B, 2-B, 3-B