The PREVIOUS keyword in COBOL represents sophisticated backward navigation and comprehensive reverse file processing capabilities within enterprise data management environments, providing advanced file positioning mechanisms for previous record access, enhanced navigation features for bidirectional processing, and intelligent reverse positioning capabilities that enable precise backward file navigation, optimal reverse processing workflows, and systematic backward record access while maintaining file integrity, ensuring predictable navigation behavior, and enabling flexible file processing architectures across business applications requiring exact reverse navigation, comparative data analysis, and reliable backward file positioning throughout sophisticated data processing and audit trail scenarios.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303*> Basic PREVIOUS usage for file navigation ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TRANSACTION-FILE ASSIGN TO "TRANS.DAT" ORGANIZATION IS INDEXED ACCESS IS DYNAMIC RECORD KEY IS TRANS-ID FILE STATUS IS WS-FILE-STATUS. SELECT AUDIT-FILE ASSIGN TO "AUDIT.DAT" ORGANIZATION IS SEQUENTIAL ACCESS IS SEQUENTIAL FILE STATUS IS WS-AUDIT-STATUS. DATA DIVISION. FILE SECTION. FD TRANSACTION-FILE. 01 TRANSACTION-RECORD. 05 TRANS-ID PIC X(10). 05 TRANS-DATE PIC 9(8). 05 TRANS-AMOUNT PIC S9(7)V99 COMP-3. 05 TRANS-TYPE PIC X(3). 05 CUSTOMER-ID PIC X(8). 05 ACCOUNT-NUMBER PIC X(12). FD AUDIT-FILE. 01 AUDIT-RECORD. 05 AUDIT-TIMESTAMP PIC X(20). 05 AUDIT-USER PIC X(8). 05 AUDIT-ACTION PIC X(10). 05 AUDIT-DETAILS PIC X(100). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS PIC XX. 01 WS-AUDIT-STATUS PIC XX. 01 WS-NAVIGATION-FLAGS. 05 WS-EOF-FLAG PIC X VALUE 'N'. 05 WS-BOF-FLAG PIC X VALUE 'N'. 05 WS-DIRECTION PIC X VALUE 'F'. *> F=Forward, B=Backward 01 WS-PROCESSING-COUNTERS. 05 WS-RECORDS-READ PIC 9(6) VALUE 0. 05 WS-FORWARD-READS PIC 9(6) VALUE 0. 05 WS-BACKWARD-READS PIC 9(6) VALUE 0. 05 WS-NAVIGATION-ERRORS PIC 9(4) VALUE 0. 01 WS-CURRENT-POSITION. 05 WS-CURRENT-KEY PIC X(10). 05 WS-PREVIOUS-KEY PIC X(10). 05 WS-NEXT-KEY PIC X(10). PROCEDURE DIVISION. MAIN-NAVIGATION-DEMO. DISPLAY "=== PREVIOUS NAVIGATION DEMONSTRATION ===" PERFORM OPEN-FILES PERFORM DEMONSTRATE-BASIC-NAVIGATION PERFORM DEMONSTRATE-REVERSE-PROCESSING PERFORM DEMONSTRATE-COMPARATIVE-ANALYSIS PERFORM CLOSE-FILES DISPLAY "=== NAVIGATION DEMO COMPLETE ===" STOP RUN. OPEN-FILES. DISPLAY "Opening files for navigation..." OPEN I-O TRANSACTION-FILE IF WS-FILE-STATUS NOT = "00" DISPLAY "❌ Error opening transaction file: " WS-FILE-STATUS STOP RUN END-IF OPEN OUTPUT AUDIT-FILE IF WS-AUDIT-STATUS NOT = "00" DISPLAY "❌ Error opening audit file: " WS-AUDIT-STATUS STOP RUN END-IF DISPLAY "✅ Files opened successfully" DEMONSTRATE-BASIC-NAVIGATION. DISPLAY "Demonstrating basic PREVIOUS navigation..." *> Position to end of file first MOVE HIGH-VALUES TO TRANS-ID START TRANSACTION-FILE KEY IS LESS THAN TRANS-ID INVALID KEY DISPLAY "❌ Cannot position to end of file" GO TO END-BASIC-NAVIGATION END-START *> Read last record READ TRANSACTION-FILE PREVIOUS RECORD AT END DISPLAY "❌ No records in file" GO TO END-BASIC-NAVIGATION NOT AT END DISPLAY "✅ Last record: " TRANS-ID ADD 1 TO WS-BACKWARD-READS MOVE TRANS-ID TO WS-CURRENT-KEY END-READ *> Navigate backward through several records PERFORM VARYING RECORD-COUNT FROM 1 BY 1 UNTIL RECORD-COUNT > 5 PERFORM READ-PREVIOUS-RECORD END-PERFORM END-BASIC-NAVIGATION. EXIT. READ-PREVIOUS-RECORD. MOVE WS-CURRENT-KEY TO WS-PREVIOUS-KEY READ TRANSACTION-FILE PREVIOUS RECORD AT END DISPLAY "📄 Beginning of file reached" MOVE 'Y' TO WS-BOF-FLAG NOT AT END DISPLAY "⬅️ Previous record: " TRANS-ID ADD 1 TO WS-BACKWARD-READS ADD 1 TO WS-RECORDS-READ MOVE TRANS-ID TO WS-CURRENT-KEY *> Log navigation in audit file PERFORM LOG-NAVIGATION-EVENT END-READ LOG-NAVIGATION-EVENT. MOVE FUNCTION CURRENT-DATE TO AUDIT-TIMESTAMP MOVE "SYSTEM" TO AUDIT-USER MOVE "READ_PREV" TO AUDIT-ACTION STRING "Read previous record: " TRANS-ID " Amount: " TRANS-AMOUNT DELIMITED BY SIZE INTO AUDIT-DETAILS END-STRING WRITE AUDIT-RECORD INVALID KEY ADD 1 TO WS-NAVIGATION-ERRORS END-WRITE DEMONSTRATE-REVERSE-PROCESSING. DISPLAY " " DISPLAY "Demonstrating reverse processing..." *> Start from a specific position MOVE "TRANS-0050" TO TRANS-ID START TRANSACTION-FILE KEY IS EQUAL TO TRANS-ID INVALID KEY DISPLAY "❌ Cannot find starting position" GO TO END-REVERSE-PROCESSING END-START *> Process records in reverse order PERFORM PROCESS-RECORDS-BACKWARD END-REVERSE-PROCESSING. EXIT. PROCESS-RECORDS-BACKWARD. DISPLAY "Processing records in reverse chronological order..." PERFORM VARYING PROCESS-COUNT FROM 1 BY 1 UNTIL PROCESS-COUNT > 10 READ TRANSACTION-FILE PREVIOUS RECORD AT END DISPLAY "📄 Reached beginning of file" EXIT PERFORM NOT AT END PERFORM ANALYZE-TRANSACTION-TREND END-READ END-PERFORM ANALYZE-TRANSACTION-TREND. DISPLAY "Analyzing transaction: " TRANS-ID DISPLAY " Date: " TRANS-DATE DISPLAY " Amount: $" TRANS-AMOUNT DISPLAY " Type: " TRANS-TYPE *> Perform trend analysis comparing with previous transactions IF WS-PREVIOUS-KEY NOT = SPACES PERFORM COMPARE-WITH-PREVIOUS-TRANSACTION END-IF MOVE TRANS-ID TO WS-PREVIOUS-KEY COMPARE-WITH-PREVIOUS-TRANSACTION. DISPLAY " 📊 Comparing with previous transaction..." *> Example comparison logic IF TRANS-AMOUNT > PREVIOUS-AMOUNT DISPLAY " 📈 Amount increased from previous transaction" ELSE IF TRANS-AMOUNT < PREVIOUS-AMOUNT DISPLAY " 📉 Amount decreased from previous transaction" ELSE DISPLAY " ➡️ Amount same as previous transaction" END-IF END-IF DEMONSTRATE-COMPARATIVE-ANALYSIS. DISPLAY " " DISPLAY "Demonstrating comparative analysis using PREVIOUS..." *> Position to middle of file for comparative analysis MOVE "TRANS-0025" TO TRANS-ID START TRANSACTION-FILE KEY IS GREATER THAN OR EQUAL TO TRANS-ID INVALID KEY DISPLAY "❌ Cannot position for comparative analysis" GO TO END-COMPARATIVE-ANALYSIS END-START PERFORM BIDIRECTIONAL-ANALYSIS END-COMPARATIVE-ANALYSIS. EXIT. BIDIRECTIONAL-ANALYSIS. DISPLAY "Performing bidirectional analysis..." *> Read current record as baseline READ TRANSACTION-FILE NEXT RECORD AT END DISPLAY "❌ No current record for analysis" GO TO END-BIDIRECTIONAL NOT AT END DISPLAY "📍 Baseline record: " TRANS-ID MOVE TRANS-AMOUNT TO WS-BASELINE-AMOUNT MOVE TRANS-ID TO WS-BASELINE-KEY END-READ *> Look backward for previous patterns DISPLAY "Analyzing previous transactions..." PERFORM ANALYZE-PREVIOUS-PATTERN *> Return to baseline position MOVE WS-BASELINE-KEY TO TRANS-ID START TRANSACTION-FILE KEY IS EQUAL TO TRANS-ID END-START *> Look forward for future patterns DISPLAY "Analyzing subsequent transactions..." PERFORM ANALYZE-FORWARD-PATTERN END-BIDIRECTIONAL. EXIT. ANALYZE-PREVIOUS-PATTERN. PERFORM VARYING PATTERN-COUNT FROM 1 BY 1 UNTIL PATTERN-COUNT > 3 READ TRANSACTION-FILE PREVIOUS RECORD AT END DISPLAY "📄 No more previous records" EXIT PERFORM NOT AT END PERFORM COMPARE-TO-BASELINE END-READ END-PERFORM ANALYZE-FORWARD-PATTERN. PERFORM VARYING PATTERN-COUNT FROM 1 BY 1 UNTIL PATTERN-COUNT > 3 READ TRANSACTION-FILE NEXT RECORD AT END DISPLAY "📄 No more subsequent records" EXIT PERFORM NOT AT END PERFORM COMPARE-TO-BASELINE END-READ END-PERFORM COMPARE-TO-BASELINE. COMPUTE WS-AMOUNT-DIFF = TRANS-AMOUNT - WS-BASELINE-AMOUNT IF WS-AMOUNT-DIFF > 0 DISPLAY " 📈 " TRANS-ID " higher by $" WS-AMOUNT-DIFF ELSE IF WS-AMOUNT-DIFF < 0 COMPUTE WS-AMOUNT-DIFF = WS-AMOUNT-DIFF * -1 DISPLAY " 📉 " TRANS-ID " lower by $" WS-AMOUNT-DIFF ELSE DISPLAY " ➡️ " TRANS-ID " same amount as baseline" END-IF END-IF CLOSE-FILES. DISPLAY " " DISPLAY "Closing files and generating summary..." CLOSE TRANSACTION-FILE CLOSE AUDIT-FILE DISPLAY "📊 Navigation Summary:" DISPLAY " Total records read: " WS-RECORDS-READ DISPLAY " Forward reads: " WS-FORWARD-READS DISPLAY " Backward reads: " WS-BACKWARD-READS DISPLAY " Navigation errors: " WS-NAVIGATION-ERRORS IF WS-NAVIGATION-ERRORS = 0 DISPLAY "✅ Navigation completed without errors" ELSE DISPLAY "⚠️ " WS-NAVIGATION-ERRORS " navigation errors occurred" END-IF
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223*> Advanced PREVIOUS processing for complex workflows 01 WS-EMPLOYEE-HISTORY. 05 WS-EMPLOYEE-FILE PIC X(8) VALUE "EMP.DAT". 05 WS-CURRENT-EMPLOYEE PIC X(8). 05 WS-PREVIOUS-EMPLOYEE PIC X(8). 01 WS-SALARY-ANALYSIS. 05 WS-SALARY-HISTORY OCCURS 12 TIMES. 10 WS-MONTH PIC 99. 10 WS-SALARY-AMOUNT PIC 9(7)V99. 10 WS-BONUS-AMOUNT PIC 9(5)V99. 05 WS-HISTORY-COUNT PIC 99 VALUE 0. 01 WS-TREND-ANALYSIS. 05 WS-UPWARD-TRENDS PIC 99 VALUE 0. 05 WS-DOWNWARD-TRENDS PIC 99 VALUE 0. 05 WS-STABLE-PERIODS PIC 99 VALUE 0. 05 WS-VOLATILITY-INDEX PIC 9V999. 01 WS-COMPARISON-REPORT. 05 WS-REPORT-LINES OCCURS 50 TIMES. 10 WS-COMPARISON-TEXT PIC X(80). 05 WS-REPORT-COUNT PIC 99 VALUE 0. PROCEDURE DIVISION. ADVANCED-REVERSE-PROCESSING. DISPLAY "=== ADVANCED REVERSE PROCESSING ===" PERFORM INITIALIZE-PROCESSING PERFORM EMPLOYEE-HISTORY-ANALYSIS PERFORM SALARY-TREND-ANALYSIS PERFORM GENERATE-COMPARISON-REPORT PERFORM DISPLAY-ANALYSIS-RESULTS DISPLAY "=== ADVANCED PROCESSING COMPLETE ===" INITIALIZE-PROCESSING. DISPLAY "Initializing advanced reverse processing..." OPEN I-O EMPLOYEE-FILE IF WS-FILE-STATUS NOT = "00" DISPLAY "❌ Cannot open employee file" STOP RUN END-IF *> Position to end of file for reverse processing MOVE HIGH-VALUES TO EMPLOYEE-KEY START EMPLOYEE-FILE KEY IS LESS THAN EMPLOYEE-KEY INVALID KEY DISPLAY "❌ Cannot position to end of file" NOT INVALID KEY DISPLAY "✅ Positioned for reverse processing" END-START EMPLOYEE-HISTORY-ANALYSIS. DISPLAY "Analyzing employee history in reverse chronological order..." PERFORM VARYING ANALYSIS-COUNT FROM 1 BY 1 UNTIL ANALYSIS-COUNT > 100 READ EMPLOYEE-FILE PREVIOUS RECORD AT END DISPLAY "📄 Beginning of employee file reached" EXIT PERFORM NOT AT END PERFORM ANALYZE-EMPLOYEE-RECORD END-READ END-PERFORM ANALYZE-EMPLOYEE-RECORD. DISPLAY "Analyzing employee: " EMPLOYEE-ID *> Store current employee for comparison MOVE WS-CURRENT-EMPLOYEE TO WS-PREVIOUS-EMPLOYEE MOVE EMPLOYEE-ID TO WS-CURRENT-EMPLOYEE *> Build salary history IF WS-HISTORY-COUNT < 12 ADD 1 TO WS-HISTORY-COUNT MOVE SALARY-MONTH TO WS-MONTH(WS-HISTORY-COUNT) MOVE SALARY-AMOUNT TO WS-SALARY-AMOUNT(WS-HISTORY-COUNT) MOVE BONUS-AMOUNT TO WS-BONUS-AMOUNT(WS-HISTORY-COUNT) END-IF *> Perform employee comparison if we have previous employee IF WS-PREVIOUS-EMPLOYEE NOT = SPACES PERFORM COMPARE-EMPLOYEE-PROGRESSION END-IF COMPARE-EMPLOYEE-PROGRESSION. DISPLAY " Comparing with previous employee progression..." *> Compare salary progression IF SALARY-AMOUNT > PREVIOUS-SALARY-AMOUNT ADD 1 TO WS-UPWARD-TRENDS DISPLAY " 📈 Salary increased from previous analysis" ELSE IF SALARY-AMOUNT < PREVIOUS-SALARY-AMOUNT ADD 1 TO WS-DOWNWARD-TRENDS DISPLAY " 📉 Salary decreased from previous analysis" ELSE ADD 1 TO WS-STABLE-PERIODS DISPLAY " ➡️ Salary stable from previous analysis" END-IF END-IF *> Add to comparison report IF WS-REPORT-COUNT < 50 ADD 1 TO WS-REPORT-COUNT STRING "Employee " WS-CURRENT-EMPLOYEE " vs " WS-PREVIOUS-EMPLOYEE ": Salary progression analysis" DELIMITED BY SIZE INTO WS-COMPARISON-TEXT(WS-REPORT-COUNT) END-STRING END-IF SALARY-TREND-ANALYSIS. DISPLAY " " DISPLAY "Performing salary trend analysis..." *> Analyze salary history in reverse order PERFORM VARYING TREND-INDEX FROM WS-HISTORY-COUNT BY -1 UNTIL TREND-INDEX < 1 PERFORM ANALYZE-SALARY-TREND END-PERFORM *> Calculate volatility index IF WS-HISTORY-COUNT > 0 COMPUTE WS-VOLATILITY-INDEX = (WS-UPWARD-TRENDS + WS-DOWNWARD-TRENDS) / WS-HISTORY-COUNT END-IF ANALYZE-SALARY-TREND. DISPLAY "Analyzing month " WS-MONTH(TREND-INDEX) " salary: $" WS-SALARY-AMOUNT(TREND-INDEX) *> Compare with next month (previous in reverse order) IF TREND-INDEX < WS-HISTORY-COUNT COMPUTE NEXT-INDEX = TREND-INDEX + 1 IF WS-SALARY-AMOUNT(TREND-INDEX) > WS-SALARY-AMOUNT(NEXT-INDEX) DISPLAY " 📈 Increase from previous month" ELSE IF WS-SALARY-AMOUNT(TREND-INDEX) < WS-SALARY-AMOUNT(NEXT-INDEX) DISPLAY " 📉 Decrease from previous month" ELSE DISPLAY " ➡️ No change from previous month" END-IF END-IF END-IF GENERATE-COMPARISON-REPORT. DISPLAY " " DISPLAY "Generating comprehensive comparison report..." DISPLAY "📊 EMPLOYEE PROGRESSION ANALYSIS REPORT" DISPLAY "======================================" PERFORM VARYING REPORT-INDEX FROM 1 BY 1 UNTIL REPORT-INDEX > WS-REPORT-COUNT DISPLAY WS-COMPARISON-TEXT(REPORT-INDEX) END-PERFORM DISPLAY " " DISPLAY "TREND ANALYSIS SUMMARY:" DISPLAY " Upward trends: " WS-UPWARD-TRENDS DISPLAY " Downward trends: " WS-DOWNWARD-TRENDS DISPLAY " Stable periods: " WS-STABLE-PERIODS DISPLAY " Volatility index: " WS-VOLATILITY-INDEX DISPLAY-ANALYSIS-RESULTS. DISPLAY " " DISPLAY "=== REVERSE PROCESSING ANALYSIS RESULTS ===" DISPLAY "Processing Summary:" DISPLAY " Total employees analyzed: " ANALYSIS-COUNT DISPLAY " Salary history entries: " WS-HISTORY-COUNT DISPLAY " Comparison reports generated: " WS-REPORT-COUNT DISPLAY " " DISPLAY "Trend Analysis:" DISPLAY " Positive progressions: " WS-UPWARD-TRENDS DISPLAY " Negative progressions: " WS-DOWNWARD-TRENDS DISPLAY " Stable progressions: " WS-STABLE-PERIODS *> Determine overall trend IF WS-UPWARD-TRENDS > WS-DOWNWARD-TRENDS DISPLAY "✅ Overall positive employee progression trend" ELSE IF WS-DOWNWARD-TRENDS > WS-UPWARD-TRENDS DISPLAY "⚠️ Overall negative employee progression trend" ELSE DISPLAY "➡️ Stable employee progression trend" END-IF END-IF *> Volatility assessment IF WS-VOLATILITY-INDEX > 0.5 DISPLAY "⚠️ High volatility in employee progressions" ELSE IF WS-VOLATILITY-INDEX > 0.3 DISPLAY "📊 Moderate volatility in employee progressions" ELSE DISPLAY "✅ Low volatility in employee progressions" END-IF END-IF DISPLAY " " DISPLAY "📈 Recommendations:" IF WS-DOWNWARD-TRENDS > WS-UPWARD-TRENDS DISPLAY " • Review compensation policies" DISPLAY " • Investigate employee retention strategies" DISPLAY " • Analyze market competitiveness" END-IF IF WS-VOLATILITY-INDEX > 0.5 DISPLAY " • Standardize promotion criteria" DISPLAY " • Implement consistent review processes" DISPLAY " • Consider salary band guidelines" END-IF IF WS-UPWARD-TRENDS > (WS-DOWNWARD-TRENDS + WS-STABLE-PERIODS) DISPLAY " • Document successful progression practices" DISPLAY " • Consider expanding promotion opportunities" DISPLAY " • Maintain current compensation strategy" END-IF