はじめに
COBOLプログラミングを進めていくと、同じようなデータ定義や処理手順を複数のプログラムで使いたい場面が出てきます。そんな時に大活躍するのが COPY
文です!
COPY
文は、別のファイル(コピーブック または 原始文ライブラリ要素 と呼ばれます)に書かれたCOBOLのコードを、指定した場所に取り込むための命令です。これにより、コードの再利用性が格段に向上し、開発や保守の効率が大幅にアップします。
このステップでは、COPY
文の基本的な使い方から、そのメリット、そして便利な REPLACING
句について学んでいきましょう!
COPY文の基本的な使い方
COPY
文の基本的な構文は非常にシンプルです。
COPY コピーブック名.
ここで、「コピーブック名」には、取り込みたいコードが書かれている外部ファイルの名前を指定します。このファイルは通常、.cpy
や .cob
などの拡張子を持ちます(環境によって異なります)。
COPY
文は、主に以下のDIVISIONで使用されます。
- DATA DIVISION: レコードレイアウトやデータ項目定義など、共通のデータ構造を複数のプログラムで共有する場合によく使われます。
- PROCEDURE DIVISION: 共通のサブルーチンや処理ロジック(例えば、エラー処理や日付計算など)を部品化して再利用する場合に使われます。
コンパイル時、COBOLコンパイラは COPY
文を見つけると、指定されたコピーブックの内容をその場所に展開してから、プログラム全体のコンパイルを行います。まるで、その場にコードが直接書かれているかのように扱われます。
COPY文のメリット
COPY
文を使うことには、多くのメリットがあります。
メリット | 説明 |
---|---|
再利用性の向上 | 共通のデータ定義や処理ロジックを一度だけ作成し、多くのプログラムで使い回すことができます。これにより、開発工数を削減できます。 |
保守性の向上 | 共通部分に修正が必要になった場合、コピーブックを一つ修正するだけで、それを利用している全てのプログラムに修正内容が反映されます。修正漏れを防ぎ、保守作業が効率化されます。 |
標準化の促進 | プロジェクト内で使用するデータ形式や、特定の処理手順をコピーブックとして提供することで、コーディングスタイルの統一や標準化を図ることができます。 |
可読性の向上 | 複雑なデータ定義や定型的な処理ロジックをコピーブックにまとめることで、プログラム本体は主要な処理の流れに集中でき、コードがスッキリとして読みやすくなります。 |
具体的な使用例
ここでは、DATA DIVISION
でレコード定義を共有する例を見てみましょう。
1. コピーブックの作成 (例: MYREC.cpy)
まず、共通で使いたいレコード定義を記述したコピーブックファイルを作成します。
*> コピーブック: MYREC.cpy
01 MY-RECORD.
05 MY-KEY PIC 9(05).
05 MY-NAME PIC X(20).
05 MY-VALUE PIC S9(07)V99 COMP-3.
05 MY-TIMESTAMP PIC X(26). *> 日時情報など
2. メインプログラムでの利用
次に、このコピーブックをメインプログラムの WORKING-STORAGE SECTION
などで COPY
文を使って取り込みます。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-PROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
*---------------------------------------
* レコード定義をコピーブックから取り込む
*---------------------------------------
COPY MYREC.
*---------------------------------------
01 WK-WORK-AREA.
05 WK-COUNT PIC 9(03) VALUE 0.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY 'プログラム開始'.
* コピーブックで定義したデータ項目を使用
MOVE 10001 TO MY-KEY OF MY-RECORD.
MOVE 'テスト顧客名' TO MY-NAME OF MY-RECORD.
MOVE +12345.67 TO MY-VALUE OF MY-RECORD.
MOVE FUNCTION CURRENT-DATE TO MY-TIMESTAMP OF MY-RECORD.
DISPLAY 'キー : ' MY-KEY OF MY-RECORD.
DISPLAY '名前 : ' MY-NAME OF MY-RECORD.
DISPLAY '値 : ' MY-VALUE OF MY-RECORD.
DISPLAY 'タイムスタンプ: ' MY-TIMESTAMP OF MY-RECORD.
STOP RUN.
* --- ここに他の処理が続く ---
このように COPY MYREC.
と記述するだけで、MYREC.cpy
ファイルの内容がその場に展開され、MY-RECORD
などのデータ項目がプログラム内で使えるようになります。
REPLACING句による置換
COPY
文には、コピーブックの内容の一部を置換しながら取り込む REPLACING
句という便利な機能があります。
構文は以下のようになります。
COPY コピーブック名
REPLACING ==置換対象文字列1== BY ==置換後文字列1==
==置換対象文字列2== BY ==置換後文字列2==
... .
==置換対象文字列==
: コピーブック内で置換したい部分文字列を指定します。区切り文字==
は他の記号 (::
や++
など) でも構いませんが、コード内で使われていない記号を選ぶ必要があります。==置換後文字列==
: 置換対象文字列を置き換える新しい文字列を指定します。
使用例:
先ほどのコピーブック MYREC.cpy
を使い、データ項目名を少し変えて利用したい場合を考えます。
WORKING-STORAGE SECTION.
*---------------------------------------------------------
* コピーブック MYREC を利用し、特定の文字列を置換する
*---------------------------------------------------------
COPY MYREC
REPLACING ==MY-RECORD== BY ==CUSTOMER-DATA==
==MY-KEY== BY ==CUST-ID==
==MY-NAME== BY ==CUST-NAME==.
*---------------------------------------------------------
* 上記のCOPY文は、コンパイル時に以下のように展開されるイメージ
*
* 01 CUSTOMER-DATA. *> MY-RECORD が CUSTOMER-DATA に置換
* 05 CUST-ID PIC 9(05). *> MY-KEY が CUST-ID に置換
* 05 CUST-NAME PIC X(20). *> MY-NAME が CUST-NAME に置換
* 05 MY-VALUE PIC S9(07)V99 COMP-3. *> 置換指定なし
* 05 MY-TIMESTAMP PIC X(26). *> 置換指定なし
*---------------------------------------------------------
PROCEDURE DIVISION.
MOVE 54321 TO CUST-ID OF CUSTOMER-DATA.
MOVE '別の顧客' TO CUST-NAME OF CUSTOMER-DATA.
MOVE +987.65 TO MY-VALUE OF CUSTOMER-DATA. *> 置換されなかった項目
DISPLAY '顧客ID: ' CUST-ID OF CUSTOMER-DATA.
DISPLAY '顧客名: ' CUST-NAME OF CUSTOMER-DATA.
DISPLAY '値 : ' MY-VALUE OF CUSTOMER-DATA.
...
REPLACING
句を使うことで、一つのコピーブックを元にして、少しだけ異なるバリエーションのコードを簡単に生成できます。ただし、多用しすぎると、元のコピーブックの内容が分かりにくくなる可能性もあるため、注意が必要です。
注意点とベストプラクティス
- コピーブックの管理: プロジェクト内で使用するコピーブックは、バージョン管理システムなどで適切に管理し、誰がいつ、どのような変更を加えたかを追跡できるようにしましょう。
- 命名規則: コピーブックの名前や、コピーブック内で定義されるデータ項目名には、一貫性のある命名規則を適用することが推奨されます。これにより、どのプログラムでどのコピーブックが使われているか、データ項目が何を表すかが分かりやすくなります。
- 依存関係の明確化: あるコピーブックが別のコピーブックを
COPY
する(ネストする)ことも可能ですが、依存関係が複雑になりすぎないように注意が必要です。 - 循環コピーの禁止: コピーブックAがコピーブックBを
COPY
し、コピーブックBがコピーブックAをCOPY
するような循環参照は、コンパイルエラーの原因となります。 REPLACING
句のバランス:REPLACING
句は便利ですが、乱用するとコードの可読性を損なう可能性があります。置換が多くなりすぎる場合は、コピーブックを分けるなどの設計見直しを検討しましょう。
まとめ
COPY
文は、COBOLにおけるコード再利用の基本的な仕組みです。
- 共通のデータ定義や処理ロジックをコピーブックにまとめる。
- プログラム内で
COPY
文を使ってそれらを取り込む。 - 必要に応じて
REPLACING
句で部分的な置換を行う。
これらのテクニックを習得することで、より効率的で、保守しやすく、標準化されたCOBOLプログラムを作成できるようになります。ぜひ積極的に活用してみてください!
次は、いよいよ実務的な処理として、「Step 6: 帳票出力とフォーマット制御」に進みましょう!
参考情報
より詳細な情報や他の使い方については、以下のドキュメントなどを参照してください。
- GnuCOBOL Programmer’s Guide: GnuCOBOLの公式マニュアルには、COPY文に関する詳細な説明が含まれています。(※最新の公式ドキュメントをご確認ください)
- COBOL入門サイトなど: 様々な入門サイトでCOPY文の使い方が解説されています。 (例: チュートリアルポイントのCOBOL解説など。URLは検索してご確認ください。)