Deleting Record from Variable Length PS File Example


Info! Physical deletion of a record from sequential file is not possible. Only logical deletion (spacing out) is possible.

Scenario - Deleting a record (EMP-ID = E0004) from a variable length PS (Sequential) file.

Input file -

 BROWSE    MATEPK.EMPLOYEE.VINPFILE                   Line 00000000 Col 001 080 
 Command ===>                                                  Scroll ===> CSR  
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
********************************* Top of Data **********************************
E0001EMPLOYEE1      MANAGER   0000200000         EMPLOYEE RECORD 1
E0002EMPLOYEE2      TL        0000150000         EMP REC 2
E0003EMPLOYEE3      SE        0000050000         EMP 3
E0004EMPLOYEE4      SSE       0000040000
E0005EMPLOYEE5      SE        0000040000         EMP 5
******************************** Bottom of Data ********************************

Code -

----+----1----+----2----+----3----+----4----+----5----+
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SEQVFLDL.
       AUTHOR. MTH.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
      * EMPFILE Definition
           SELECT EMPFILE ASSIGN TO INPUT01
           ORGANIZATION IS SEQUENTIAL
           ACCESS MODE  IS SEQUENTIAL
           FILE STATUS  IS WS-FS1.

       DATA DIVISION.
       FILE SECTION.
      * EMPFILE structure definition
       FD EMPFILE
           RECORD VARYING FROM 40 TO 80 CHARACTERS
                  DEPENDING ON EMPREC-LEN
           RECORDING MODE  IS  V.
      * EMPFILE record structure definition
       01 EMP-RECORD80.
          05 EMP-ID        PIC X(05).
          05 EMP-NAME      PIC X(15).
          05 EMP-DESG      PIC X(10).
          05 EMP-SALARY    PIC 9(10).
          05 FILLER        PIC X(40).
 
       WORKING-STORAGE SECTION.
       01 WS-VAR.
          05 EMPREC-LEN    PIC 9(02).
          05 WS-FS1        PIC 9(02).
          05 WS-EOF-SW     PIC X(01).
             88 WS-EOF         VALUE 'Y'.
             88 WS-NOT-EOF     VALUE 'N'.

       PROCEDURE DIVISION.
      * Opening EMPFILE for reading
           OPEN I-O EMPFILE.

      * Loop for reading all records from EMPFILE
           SET  WS-NOT-EOF      TO  TRUE.
           PERFORM UNTIL WS-EOF
                READ EMPFILE
                         AT END SET WS-EOF TO TRUE     
                     NOT AT END PERFORM 1000-UPDATE-REC
                                   THRU 1000-EXIT
                END-READ
           END-PERFORM.
      * Closing EMPFILE
           CLOSE EMPFILE.
           STOP RUN.

       1000-UPDATE-REC.

           IF EMP-ID EQUAL "E0004"
              MOVE SPACES TO EMP-RECORD80(1:EMPREC-LEN)                      
              REWRITE EMP-RECORD80
           END-IF.

       1000-EXIT.
            EXIT.

Run JCL -

//MATEPKF  JOB MSGLEVEL=(1,1),NOTIFY=&SYSUID        
//*
//STEP01  EXEC PGM=SEQVFLDL
//STEPLIB  DD  DSN=MATEPK.COBOL.LOADLIB,DISP=SHR
//INPUT01  DD  DSN=MATEPK.EMPLOYEE.VINPFILE,DISP=SHR
//SYSOUT   DD  SYSOUT=*

File After REWRITE -

 BROWSE    MATEPK.EMPLOYEE.VINPFILE                   Line 00000000 Col 001 080 
 Command ===>                                                  Scroll ===> CSR  
********************************* Top of Data **********************************
E0001EMPLOYEE1      MANAGER   0000200000         EMPLOYEE RECORD 1
E0002EMPLOYEE2      TL        0000150000         EMP REC 2
E0003EMPLOYEE3      SE        0000050000         EMP 3

E0005EMPLOYEE5      SE        0000040000         EMP 5 
******************************** Bottom of Data ********************************

Explaining Example -

In the above example:

  • Variable length sequential file (PS file) is used as an input file and trying to delete the record with employee ID (E0004).
  • ORGANIZATION and ACCESS MODE should be sequential.
  • File should declare with RECORD VARYING...DEPENDING clause to read the file record along with length.
  • It validates the employee ID (E0004) and if it matches, space out the entire record and rewrite it to the file.

As specified above, only logical deletion is possible. So we need to space out the entire record and rewrite it.