導入
第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する場面を想像してみてください。