COBOL言語の相対ファイルとファイル制御について解説!|基礎ガイド

COBOL(コボル)言語の相対ファイルとファイル制御の書き方とは

基礎-相対ファイル-イメージ

COBOL(コボル)言語の相対ファイルとは?

相対ファイルは、ファイル内のレコード番号によってレコードを識別するためのファイルです。相対ファイルではファイル内でのレコードを順ファイルのように順番にアクセスすることができますし、ランダムでアクセスすることも可能です。

ランダムでのアクセスでは、レコードに対する相対キーとしてデータ項目を定義します。

また、相対ファイルでは指定したキーから物理的な位置を計算できるため、順ファイルに比べてアクセスが高速なため、検索に優れており、レコードの更新や削除などの処理を行うこともできます。

相対ファイルの記述例:

*>入出力節
INPUT-OUTPUT      SECTION.
*>ファイル管理段落
FILE-CONTROL.
*>ファイルの宣言
SELECT [ファイル項目] ASSIGN TO [ファイル名]
*>ファイル編成の宣言
ORGANIZATION IS RELATIVE
ACCESS MODE IS [DYNAMICまたはRANDOM]
RELATIVE KEY IS [キー項目].

*>ファイル節
FILE       SECTION.
*>ファイル記述項
FD [ファイル項目]

*>手続き部
PROCEDURE       DIVISION.

*>ファイル処理
OPEN [モード] [ファイル項目].
読み込み:READ
書き込み:WRITE
更新:REWRITE
ファイルを閉じる:CLOSE

相対ファイルを作成して出力する

ここでは、相対ファイルのレコードを作成して保存し、相対ファイルを読み込んでディスプレイに出力する方法を紹介します。

サンプル:相対ファイルを作成して出力する(1/2)
基礎-相対ファイル-サンプル1

サンプル:相対ファイルを作成して出力する(2/2)
基礎-相対ファイル-サンプル2

実行結果:
基礎-相対ファイル-実行結果

このサンプルプログラムでは、ファイル管理段落でファイルを定義し、ORGANIZATION IS RELATIVEで相対ファイルであることを示しています。相対キーはRELATIVE KEYで記述します。

相対キーはレコードを書き込むときや読み込むときにレコード番号を指定する必要があります。

相対ファイルを新規作成する場合はOPEN文でオープンモードを出力(OUTPUT)で指定し、既存のファイルに追加する場合は入出力両用モード(I-O)を指定します。また相対ファイルを読み込むときのREAD文は、NEXTを指定する必要があります。

COBOL(コボル)言語の相対ファイルを扱う上での注意点

1. 相対ファイルや索引ファイルは、ファイル管理段落(FILE-CONTROL)でファイルの宣言を正しく行わないと、ファイル処理が失敗する場合もあります。

2. 相対ファイルは可変長のレコードを定義することができますが、使用しない領域まで埋めてしまうため、大きなサイズを指定するとディスク領域が無駄になってしまう可能性もあります。

3. 相対ファイルからのレコード削除は、ファイルから論理的にレコードを取り除くため、物理的には新しいレコードが追加されるまでファイルにデータが残り続けます。そのため、レコードをファイルから物理的に削除するにはREWRITE文を使用して、レコードを空白で上書きするなどの対応が必要です。

練習問題

相対ファイルを作成してWRITE文でレコードを書き込んで保存し、DELETE文で相対キーを指定してレコードを削除するプログラムを作成してみましょう。

削除時の相対キー指定はACCEPT文で入力します。DELETE文でレコードを削除後に相対ファイルをREAD文で読み込んで、指定した相対キーのレコードが削除されていることを確認します。

回答:相対ファイルのレコードを削除する

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. RELATIVE_FILE_SAMPLE02.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5. FILE-CONTROL.
  6. SELECT SAMPLE-FILE ASSIGN TO "sample.txt"
  7. ORGANIZATION IS RELATIVE
  8. ACCESS MODE IS DYNAMIC
  9. RELATIVE KEY IS KEY-NUM.
  10. DATA DIVISION.
  11. FILE SECTION.
  12. FD SAMPLE-FILE.
  13. 01 TEST-RECORD.
  14. 03 OUT-FILE-REC PIC X(50).
  15. WORKING-STORAGE SECTION.
  16. *>相対キー
  17. 01 KEY-NUM PIC 9.
  18. *>削除キー
  19. 01 DELETE-NUM PIC 9.
  20. *>レコードを5件までに設定
  21. 01 TEST-RECORD-NUM PIC 9 VALUE 5.
  22. *>読み込み判定処理
  23. 01 HANTEI PIC X.
  24. 88 READ-END VALUE "1".
  25. PROCEDURE DIVISION.
  26. *>------------------------------
  27. *> 相対ファイルの作成
  28. *>------------------------------
  29. OPEN OUTPUT SAMPLE-FILE.
  30. MOVE 1 TO KEY-NUM
  31. PERFORM TEST-RECORD-NUM TIMES
  32. DISPLAY "レコードを入力してください ("KEY-NUM "/5)
  33. >> " WITH NO ADVANCING
  34. ACCEPT OUT-FILE-REC
  35. WRITE TEST-RECORD
  36. INVALID KEY
  37. DISPLAY "書き込み失敗"
  38. NOT INVALID KEY
  39. DISPLAY "書き込み成功:"OUT-FILE-REC
  40. END-WRITE
  41. ADD 1 TO KEY-NUM
  42. END-PERFORM
  43. CLOSE SAMPLE-FILE.
  44. *>------------------------------
  45. *> レコードを削除
  46. *>------------------------------
  47. OPEN I-O SAMPLE-FILE.
  48. DISPLAY "削除する相対キーを入力してください。(1-5)
  49. >> " WITH NO ADVANCING
  50. ACCEPT DELETE-NUM.
  51. MOVE DELETE-NUM TO KEY-NUM
  52. DELETE SAMPLE-FILE RECORD
  53. INVALID KEY
  54. DISPLAY "削除失敗-->"KEY-NUM
  55. NOT INVALID KEY
  56. DISPLAY "削除成功-->"KEY-NUM
  57. END-DELETE.
  58. CLOSE SAMPLE-FILE.
  59. *>------------------------------
  60. *> 相対ファイルの読み込み
  61. *>------------------------------
  62. DISPLAY "相対ファイルの読み込み"
  63. OPEN INPUT SAMPLE-FILE.
  64. PERFORM UNTIL READ-END
  65. READ SAMPLE-FILE NEXT
  66. AT END
  67. SET READ-END TO TRUE
  68. NOT AT END
  69. DISPLAY OUT-FILE-REC
  70. END-READ
  71. END-PERFORM.
  72. CLOSE SAMPLE-FILE.
  73. DISPLAY "プログラム終了".
  74. STOP RUN.

■実行結果
基礎-相対ファイル-実行結果

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門