Sample File Read and Write with Arrays – COBOL Program

This sample Program demonstrates on how to read a file and load it into an array and use that array to search reference data. Based on the data findings write it into the output file.

  • Input Customer File – Customer Transactions file containing Customer Number, Name and Country code.
  • Input Country code reference file – Contains the Country code and its Name
  • Output File – Output file should contain the Customer name & Country Name.

Program Flow – If this needs to be coded without loading the country reference data into an array, for each customer transaction file record, country reference file needs to opened, read until the country code found and close it. Like that for every customer transaction record, country reference file needs to be opened, read & closed. This causes too many I/O operations. To avoid this and make the program efficient we use arrays in this program.

IDENTIFICATION DIVISION.
       PROGRAM-ID. ARRAY1.
      *
      * THIS PROGRAM IS TO DEMONSTRATE FILES AND ARRAY CONCEPTS
      *
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT CUST-TRAN       ASSIGN TO TRANDD
           FILE STATUS IS WW-STATUS1.
      *
           SELECT CNTRY-REF       ASSIGN TO CNTRY
           FILE STATUS IS WW-STATUS2.
      *
           SELECT CUST-OUT        ASSIGN TO OUTDD
           FILE STATUS IS WW-STATUS3.
      *
       DATA DIVISION.
       FILE SECTION.
       FD CUST-TRAN.
       01 WW-CUST-IN-REC.
          05 WW-CUST-NUM-I  PIC 999.
          05 WW-CUST-NAME-I PIC X(10).
          05 WW-CNTRY-CD-I  PIC XX.
      *
       FD CNTRY-REF.
       01 WW-CNTRY-REC.
          05 WW-CNTRY-REF-CD PIC XX.
          05 WW-CNTRY-NAME   PIC X(10).
      *
       FD CUST-OUT.
       01 WW-CUST-OUT-REC.
          05 WW-CUST-NAME-O PIC X(10).
          05 WW-CNTRY-NAME-O PIC X(10).
      *
       WORKING-STORAGE SECTION.
      *
       01 WW-CNTR-ARRAY.
          05 WW-CNTRY-REF OCCURS 10 TIMES.
             10 WW-CNTRY-CD-A   PIC XX.
             10 WW-CNTRY-NAME-A PIC X(10).
      *
       01 WW-STATUS.
          05 WW-STATUS1  PIC XX.
          05 WW-STATUS2  PIC XX.
          05 WW-STATUS3  PIC XX.

       01 WW-FLAGS.
          05 WW-CNTRY-FLAG PIC X.
             88 WW-CNTRY-FOUND VALUE 'Y'.
             88 WW-CNTRY-NOT-FOUND VALUE 'N'.

       01 WW-COUNTERS.
          05 WW-READ-CNT PIC 99.
          05 WW-WRITE-CNT PIC 99.
          05 WW-SUB1      PIC 99.
          05 WW-SUB2      PIC 99.
      *
       PROCEDURE DIVISION.
      *
           PERFORM 100-OPEN-FILES.
           PERFORM 150-LOAD-CNTRY-CODES.
           PERFORM 200-PROCESS-INPUT UNTIL WW-STATUS1 = '10'.
           PERFORM 300-CLOSE-FILES.
           DISPLAY 'READ COUNT:' WW-READ-CNT.
           DISPLAY 'WRITE COUNT:' WW-WRITE-CNT.

           STOP RUN.
      *
       100-OPEN-FILES.
      *
           OPEN INPUT CUST-TRAN
           IF WW-STATUS1 NOT = '00'
              DISPLAY 'FILE1 OPEN FAILED WITH:' WW-STATUS1
           END-IF.
      *
           OPEN INPUT CNTRY-REF
           IF WW-STATUS2 NOT = '00'
              DISPLAY 'FILE2 OPEN FAILED WITH:' WW-STATUS2
           END-IF.
      *
           OPEN INPUT CUST-OUT
           IF WW-STATUS3 NOT = '00'
              DISPLAY 'FILE3 OPEN FAILED WITH:' WW-STATUS3
           END-IF.
      *
       150-LOAD-CNTRY-CODES.
      *
           PERFORM UNTIL WW-STATUS2 = '10'
             READ CNTRY-REF
             ADD 1 TO WW-SUB1
             IF WW-STATUS2 = '00'
                 MOVE WW-CNTRY-REF-CD TO WW-CNTRY-CD-A(WW-SUB1)
                 MOVE WW-CNTRY-NAME   TO WW-CNTRY-NAME-A(WW-SUB1)
             ELSE
                IF WW-STATUS2 = '10'
                   DISPLAY 'END OF REF FILE REACHED '
                ELSE
                   DISPLAY 'READ CNTRY FILE FAILED WITH:' WW-STATUS2
                END-IF
             END-IF
           END-PERFORM.

       200-PROCESS-INPUT.
      *
           PERFORM 250-READ-CUST-INPUT.
           PERFORM 350-CHECK-THE-REF-ARRAY.
           PERFORM 600-WRITE-OUTPUT
           .

       250-READ-CUST-INPUT.
      *
           READ CUST-TRAN
           IF WW-STATUS2 = '00'
              ADD 1 TO WW-READ-CNT
           ELSE
              IF WW-STATUS2= '10'
                 DISPLAY 'END OF FILE REACHED'
              ELSE
                 DISPLAY 'READ FILE1 FAILED WITH:' WW-STATUS2
              END-IF
           END-IF.
      *
       300-CLOSE-FILES.
      *
           CLOSE CUST-TRAN
           IF WW-STATUS1 NOT = '00'
              DISPLAY 'FILE1 CLSE FAILED WITH:' WW-STATUS1
           END-IF.
      *
           CLOSE CNTRY-REF
           IF WW-STATUS2 NOT = '00'
              DISPLAY 'FILE2 CLSE FAILED WITH:' WW-STATUS2
           END-IF.
      *
           CLOSE CUST-OUT
           IF WW-STATUS3 NOT = '00'
              DISPLAY 'FILE3 CLSE FAILED WITH:' WW-STATUS3
           END-IF.
      *
       350-CHECK-THE-REF-ARRAY.
      *
           SET WW-CNTRY-NOT-FOUND TO TRUE.

           PERFORM VARYING WW-SUB2 FROM 1 BY 1 UNTIL
                   WW-SUB2 > 10 OR WW-CNTRY-FOUND
             IF WW-CNTRY-CD-I = WW-CNTRY-CD-A(WW-SUB2)
                SET WW-CNTRY-FOUND TO TRUE
             END-IF
           END-PERFORM.

           IF WW-CNTRY-FOUND
                MOVE WW-CNTRY-NAME-A(WW-SUB2) TO WW-CNTRY-NAME-O
                MOVE WW-CUST-NAME-I TO WW-CUST-NAME-O
           ELSE
                MOVE 'INVALID CNTRY'    TO  WW-CNTRY-NAME-O
                MOVE WW-CUST-NAME-I TO WW-CUST-NAME-O
           END-IF.

       600-WRITE-OUTPUT.
      *
           WRITE WW-CUST-OUT-REC.
           IF WW-STATUS3 = '00'
              ADD 1 TO WW-WRITE-CNT
           ELSE
              DISPLAY 'WRITE FAILED WITH:' WW-STATUS3
           END-IF.



Add a Comment

Your email address will not be published. Required fields are marked *