THE RELATIVE FILE ORGANIZATION

In this file organization, the records of the file are stored one after another both physically and logically. That is, record with sequence number 16 is located just after the 15th record.

In contrast to SEQ files, records of a RELATIVE file can be accessed by specifying the record sequence number in the READ statement (the KEY) and without needing to read all the previous records.

It is the programmer's responsibility to take care of the record sizes in files. You must be careful when declaring record structures for files. Any mistake you make in record sizes will cause your program to read/write erroneous information. This is especially dangerous if the file contents are being altered (changed, updated).

Please note that you must provide the record structure to have a special field allocated to contain the KEY, that is the record sequence number.

RELATIVE files can have RANDOM or SEQUENTIAL ACCESS MODEs. If the ACCESS MODE is declared to be RANDOM in the corresponding SELECT statement, the program can read the record with key value 2345 and then the record with key=3, then record 2344 etc etc. In short, one can access any record of a relative file, in any order, provided that the KEY value is specified before the READ statement is executed.

If the ACCESS MODE is SEQUENTIAL, that means the records of the file will be accesses in their physical sequential order (just like SEQUENTIAL and LINE SEQUENTIAL files) and no specific KEY value be given for the READ statements; but instead, the NEXT clause will appear in READ statements meaning "Go get the record with the next consecutive key value.

        SELECT MYFILE ASSIGN TO DISK "MYFILE.DAT" 
               ORGANIZATION IS RELATIVE
               ACCESS MODE IS RANDOM
               RECORD KEY IS M-IDNO.

        SELECT MYFILE-2 ASSIGN TO DISK "C:\DATADIR\MYFILE2.TXT"
               ORGANIZATION IS RELATIVE
               ACCESS MODE IS SEQUENTIAL
               RECORD KEY IS M-IDNO.

In the FILE-SECTION, you must provide fields for the KEY, the numerical M-IDNO in this example, in the FD block of the RELATIVE file;

        FD   MYFILE.
        01   MYFILE-REC.
             02  M-IDNO        PIC 9999.
             02  M-NAME        PIC X(16).
             02  M-SURNAME     PIC X(16).
             02  M-BIRTHDATE.
                 03 M-BD-YEAR  PIC 9999.
                 03 M-BD-MONTH PIC 99.
                 03 M-BD-DAY   PIC 99.

Note : Since the key field will contain integer, record sequence numbers; you should declare the field to be numerical and take care that it is wide enough to carry all possible values for the key value. For example, if your file is expected to have 200,000 records in it, the key field should declared at least 6 bytes ( PIC 999999 ) so that it can hold the values 1 through 200,000. A key field declaration of "PIC 999" would let use a file of max 999 records in it.

PROCEDURE DIVISION Considerations

Like all files, relative files must be OPENed before they can be processes and CLOSEd when they are not needed anymore.

Relative files can be opened for :

  1. OUTPUT
  2. INPUT
  3. I-O (Input-Output)

Opening a relative file for OUTPUT means that the program will only issue WRITE statements to a NON-EXISTING and JUST CREATED file. Therefore, when you open a file for OUTPUT, COBOL assumes that the file does not exist and try to create a new one. IF THE FILE EXISTS, ITS CONTENTS WILL BE CLEARED WHEN OPENED AND ASSUMED TO BE A BRAND NEW FILE INTO WHICH RECORDS WILL BE ADDED. You should be very careful when opening a file for OUTPUT. One small mistake and all your valuable records are lost forever.

Once you open a relative file in Output mode, you are expected to write records in the INCREASING and CONSECUTIVE order of keys. That is, before writing the record with key 98 (98th record) you should first write the first 97 records(.

Opening a relative file for INPUT means that the program will only issue READ statements to an EXISTING file. Therefore, when you open a file for INPUT, COBOL assumes that the file exists and try to access it. IF THE FILE DOES NOT EXIST, AN ERROR MESSAGE WILL BE ISSUED INDICATING THAT THE MENTIONED FILE COULD NOT BE FOUND.

If you have declared the ACCESS MODE to be RANDOM, before each READ statement, you are supposed to move a valid KEY value to the record field variable that is declared as the RECORD KEY.

For instance;

     OPEN INPUT MYFILE.
     ....    
     MOVE 23  TO M-IDNO.
     READ MYFILE.

Good programmers should take precautions in their program to avoid error messages and subsequent abnormal terminations is an INVALID value for the record key specified before the READ statement.

The INVALID KEY clause handles this in COBOL.

    MOVE 2300  TO M-IDNO.
    READ MYFILE INVALID KEY  PERFORM OUT-OF-RANGE.

The INVALID KEY condition raises if the value in M-IDNO is zero, negative or has a value greater than the total number of records in the file.

If you have declared the ACCESS MODE as SEQUENTIAL, you should use the NEXT clause in the READ statement. Like

      READ MYFILE NEXT AT END PEFORM NO-MORE-RECORDS.

When you are finished with a file you must CLOSE it.

       CLOSE NEW-FILE.
       CLOSE OLD-FILE NEW-FILE.

You can close more than one files with a single CLOSE statement. When a COBOL program terminates, all files mentioned in the program are automatically closed; therefore you will not get an error message for those files you forget to close or do not close at all. Please note that relying on COBOL to close your files is not a proper programming style. Although not absolutely necessary, you should close your files when you are done with them.

In order to rewind a relative file with ACCESS MODE RANDOM, you do not need to rewind it when you need to go the first record. Just move 1 to the record key and issue a READ statement.

Simple INPUT-OUTPUT Statements for RELATIVE Files.

Once you open a relative file, you can use READ or WRITE statements to read or append records to this file. You cannot use a READ statement for a file opened for OUTPUT and similarly you cannot use a WRITE statement for a file you have opened for INPUT.

A typical READ statement for RANDOM access mode looks like :

       MOVE 123 TO M-IDNO.
       READ MY-FILE.

A good programmer must check whether the READ statement could find a record to read successfully. That means; the programmer must check whether there were any records with the indicated key value when the statement was executed. The situation can be checked with the following construct :

       READ MY-FILE  INVALID KEY PERFORM  NO-RECORDS-FOUND.

The construct tells the COBOL compiler to execute the paragraph labeled NO-RECORDS-FOUND when the READ statement cannot find any record with the key value stored in the key field variable.

Once your program EXECUTES a successful READ statement, the information in the data record that was just brought into memory will be available in the corresponding variables mentioned in your record description declaration (the FD block).

When you want to put records in a relative file, you have to open it for OUTPUT. The COBOL statement that is used to put records into a file is the WRITE statement. The important pointa that you should be careful with are that,

  1. the file should be opened
  2. new values for the field variables of the FD record description must be moved to proper variables of the record
  3. the value of the KEY VARIABLE must have a valid value and this valid value should be one greater than the the key value of the record written previously,
  4. the RECORD NAME is specified in the WRITE statement and NOT the FILE NAME.


UPDATING RECORDS OF A RELATIVE FILE

Sometimes you need to make some small changes in the contents of a file. Of course it possible to create a brand new file with the new, modified contents but this is not practical. COBOL provides you with an OPEN I-O mode with which you can modify only the required record in a file.

In other words, there is another file opening mode; the I-O mode; and another special REWRITE statement. Suppose that you want to change the surname field of the 20th record of a relative file (originally "AYFER") into "AYFEROGLU".

The program that you can write could read like

    SELECT MYFILE ASSIGN TO DISK "MYFILE.DAT" 
                   ORGANIZATION IS RELATIVE
                   ACCESS MODE IS RANDOM
                   RECORD KEY IS M-IDNO.
     ....
     FD   MYFILE.
     01   MYFILE-REC.
          02  M-IDNO        PIC 9999.
          02  M-NAME        PIC X(16).
          02  M-SURNAME     PIC X(16).
          02  M-BIRTHDATE.
              03 M-BD-YEAR  PIC 9999.
              03 M-BD-MONTH PIC 99.
              03 M-BD-DAY   PIC 99.
 
     PROCEDURE DIVISION.
         ....
         OPEN I-O MYFILE.
         ....
         MOVE 20 TO M-IDNO.
         READ MYFILE INVALID KEY PERFORM KEY-ERROR.
    *
    * TO MAKE SURE THAT WE ARE ON THE CORRECT RECORD
    *
         IF M-SURNAME NOT = "AYFER" DISPLAY "WRONG RECORD"                         
                                    DISPLAY "RECORD NOT UPDATED"                         
                                    CLOSE MYFILE
                                    STOP RUN.
         MOVE "AYFEROGLU" TO M-SURNAME.
         REWRITE MYFILE-REC.
         .....
         CLOSE MYFILE.
         .....

DELETING RECORDS OF A RELATIVE FILE

It is NOT possible to delete records of a relative file. If you do not want a specific record to be kept in a relative file any more, all you can do is to modify the contents of the record so that it contains some special values that your program will recognize as deleted (remember to open the file in I-O mode and REWRITE a new record).

ADVANTAGES of RELATIVE FILES

  1. Quite easy to process,
  2. If you can know the key value of the record that you need to find, there is no need for a search and you can access the record almost instantaneously,

DISADVANTAGE of RELATIVE FILES

Can be only used in conjunction with consecutive numerical keys. If you key value range is 1-1000, you must have records for all 1000 possible keys, that is, your file must have exactly 1000 records. If, for example, you are planning to use student ID numbers as numerical key values and the student id numbers are like 9653421232 (10 digits), you file must contain 9,999,999,999 records and this doesn't make sense. Of course, you should modify the student ID number structure to start from1 and extend till a few thousand.

This disadvantage (only numerical and consecutive values for the key value) is overcome with a completely different file structure, nameky the INDEXED SEQUENTIAL FILE.





Back to FILES page...