Deleting Record from Variable Length PS File
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.