COBOL言語の「BLOCK CONTAINS句」とブロック化を解説! | 用語辞典

COBOL(コボル)言語の予約語BLOCK CONTAINS句を使った命令文の書き方とは

辞典・辞書-BLOCK-イメージ

COBOL(コボル)言語のBLOCK CONTAINS句とは?

磁気テープやフロッピーディスクなどの記憶媒体は、複数のレコードが集まってブロック(BLOCK)を構成しています。ブロック化している理由については、ファイルの使用効率や処理速度を向上させるためと言われています。

BLOCK CONTAINS句では、「1つのブロックにいくつレコードが存在しているか」を設定します。

そのため、レコードの個数がシステムによって予め規定されているときに、レコードのサイズを明確にするために記述すると言ってもよいでしょう。

書き方1:

BLOCK CONTAINS 整数 RECORDS.または、CHARACTERS.

書き方2:

BLOCK 整数.

書き方3:

BLOCK CONTAINS [整数1 TO] 整数2 RECORDSまたは、CHARACTERS.

BLOCK CONTAINS句はFD句(ファイル記述項)に記述します。RECORDSはレコード数を表し、CHARACTERSを指定するときは、物理レコードを保管するときのバイト数を記述します。

また、書き方2のように省略形で記述することもできます。

整数にはレコードのサイズを指定します。書き方3のように整数1と整数2を両方指定すると、ブロックの最小の大きさと最大の大きさを指定することができます。

1つのブロックにレコードが5つ存在する場合は、以下のようにFD句にBLOCK CONTAINS句を記述します。

辞典・辞書-BLOCK-記述例

BLOCK CONTAINS句は、1ブロックに1レコードの場合もRECORDSと記述する必要があります。

BLOCK CONTAINS句のCOBOL(コボル)言語における基本事項やルールについて

  1. BLOCK CONTAINS 整数 RECORDS CHARACTERSなどの間の空白や改行は、自由に指定できます。
  2. BLOCK CONTAINS句は、予めレコードのサイズが決められているファイルに対して、注記項として取扱います。
  3. 整数には、レコードのサイズを整数値で指定する必要があります。
  4. 整数1と整数2の両方を記述した場合は、それぞれのブロックの最小の大きさと最大の大きさを表します。
  5. CHARACTERSを指定するときは、ブロックの大きさとして、含まれる英数字や日本語文字の種類に関係なく、ブロックの格納に必要なバイト数を指定します。

COBOL(コボル)言語のBLOCK CONTAINS句を扱う上での注意点

BLOCK CONTAINS句で対応するファイルは、すべてBLOCK CONTAINS句で指定した整数の範囲内で一致している必要があります。

BLOCK CONTAINS句は、あくまでレコードや文字バイト数を明示的に指定するもので、実際に使用するファイルのレコードのサイズが異なっても、エラーなどは発生しません。

WRITE文などのレコードの追記によってレコードのサイズが変更になるような、可変長レコードに対しては整数1と整数2を記述して、最小値と最大値を指定する必要があります。

以下では、使用するファイルのレコード数の最小値が5、最大値が10の場合に整数1、整数2にレコード数をそれぞれ値を指定しています。

辞典・辞書-BLOCK-注意点1

また、ブロックのレコード数を特に指定しないことを表したいなら、「BLOCK CONTAINS 0 RECORDS」のように整数に0を指定します。

辞典・辞書-BLOCK-注意点2

BLOCK CONTAINS句を使ったCOBOL(コボル)プログラムの活用法

BLOCK CONTAINS句は、磁気テープやフロッピーディスクを使用していたころに、256バイトなどの単位のブロックにいくつレコードが入っているか記述するもので、現在では使用する頻度は少ないと言えるでしょう。

しかし、BLOCK CONTAINS句は、ファイルのレコード数を明確に表すことができます。そのため、レコード数を明示的に示せば、予め必要なレコード数分を保存するためのデータ項目を、用意しておくことができます。

以下にBLOCK CONTAINS句を使用した、簡単なサンプルを紹介します。

読み込むファイルは予め用意しておきます。ここでは、わかりやすい行順編成のフラット形式で記述しています。

test.txt-------------------

AAAAA

BBBBB

CCCCC

DDDDD

EEEEE

----------------------------

   
  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. BLOCKCONTAINS_SAMPLE.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5.  
  6.  
  7. FILE-CONTROL.
  8. SELECT TEST-FILE ASSIGN TO 'test.txt'
  9. ORGANIZATION IS LINE SEQUENTIAL
  10. SHARING WITH READ ONLY
  11. FILE STATUS IS IN-FILE-STATUS.
  12.  
  13.  
  14. DATA DIVISION.
  15. FILE SECTION.
  16. FD TEST-FILE
  17. BLOCK CONTAINS 5 RECORDS.
  18. 01 IN-FILE-REC PIC X(5).
  19.  
  20.  
  21. WORKING-STORAGE SECTION.
  22. 01 IN-FILE-STATUS PIC XX.
  23. 01 WORK-AREA.
  24. 03 WORK-DATA-ITEM OCCURS 5 PIC X(5).
  25. 01 WORK-COUNT PIC 9(1) VALUE 1.
  26.  
  27. PROCEDURE DIVISION.
  28.  
  29. *>ファイルオープン
  30. OPEN INPUT TEST-FILE.
  31.  
  32. PERFORM UNTIL IN-FILE-STATUS NOT = "00"
  33.  
  34. READ TEST-FILE
  35.  
  36. *>配列にレコードを格納
  37. MOVE IN-FILE-REC TO WORK-DATA-ITEM(WORK-COUNT)
  38.  
  39. *>カウント項目を加算
  40. ADD 1 TO WORK-COUNT
  41.  
  42. END-PERFORM.
  43.  
  44. DISPLAY WORK-AREA.
  45.  
  46.  
  47. *>ファイルをクローズ
  48. CLOSE TEST-FILE.
  49.  
  50. STOP RUN.

実行結果:

辞典・辞書-BLOCK-実行結果

サンプルではBLOCK CONTAINS句を指定して、レコード数が5であることを指定しています。

そのため、読み込むレコード数が予めわかっているので、レコード数を保存する項目(ここでは配列)をレコード数分用意しておくことができます。

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

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

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

COBOL入門のカテゴリー

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