本文へスキップ
BecomeCoder

COBOLコース · 第9章 プログラムを分割する ― COPY句とサブプログラム · レッスン45

COPY句 ― 共通定義を再利用する

ローカル実施

導入

第3章で学んだような「顧客レコードのレイアウト」を、複数のプログラムで使い回したいことがよくあります。同じ定義を何度も書き写すのは、修正漏れや入力ミスの温床です。COBOLにはこれを防ぐ COPY句 があります。

説明

COPY句は、別のファイルに書いたコードを、コンパイル時にその場所へ丸ごと展開する仕組みです。多くの言語での #include(Cなど)や import(一部の意味では)に近い発想です。

まず、共通のレコード定義を別ファイル(コピー句ファイル、.cpy という拡張子がよく使われます)に用意します。

      *> customer-record.cpy
       01  CUSTOMER-RECORD.
           05  CUST-ID          PIC 9(6).
           05  CUST-NAME        PIC X(20).
           05  CUST-BALANCE     PIC 9(8)V99.

このファイルを、使いたいプログラムの中から呼び出します。

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       COPY "customer-record.cpy".
  • COPY "customer-record.cpy". … コンパイル時に、この行が customer-record.cpy の中身(01 CUSTOMER-RECORD. 以下すべて)にそのまま置き換わります

複数のプログラム(顧客登録プログラム、残高照会プログラム、請求書発行プログラムなど)が同じ CUSTOMER-RECORD の定義を使うとき、それぞれのプログラムに同じコードを手で書き写すのではなく、共通のcopy句ファイル1つを参照するようにしておけば、レイアウトを変更したいときに1か所を直すだけで全プログラムに反映されます。

graph TD
    CPY["customer-record.cpy<br/>(共通のレコード定義)"] --> P1["顧客登録プログラム"]
    CPY --> P2["残高照会プログラム"]
    CPY --> P3["請求書発行プログラム"]

COPY句は REPLACING を使うと、一部の名前を差し替えて展開することもできます。

           COPY "customer-record.cpy" REPLACING CUST-ID BY NEW-CUST-ID.

実務の大規模なCOBOLシステムでは、この「共通のcopy句ファイル群」がプロジェクト全体の一貫性を支える重要な資産になっています。

試すには

第3章で書いた 01 WS-PERSON(氏名・年齢・給与)の集団項目を、独立した1つのcopy句ファイルとして切り出すつもりで書いてみましょう。同じ定義を複数のプログラムでCOPYする場面を想像してみてください。