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.
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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125*> 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224*> 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238*> 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.
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.
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.
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.
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.
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.
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.
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.
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