1. 導入: 報告書作成の「準備体操」INITIATE文の重要性
COBOLで業務報告書を作る際、データ処理の前に「準備」が欠かせません。
例えば、集計表を作るなら合計をゼロから始めたいし、新しいページには「ページ1」と表示したいですよね?
この「準備」を確実に行ってくれるのが、今回ご紹介するINITIATE文です。
もしこの準備を忘れると、前回の処理の残骸が残ってしまったり、ページ番号がおかしくなったりと、せっかくの報告書が台無しになってしまうことも。
INITIATE文は、報告書作成機能を正しく、そして安全に利用するための、まさに「報告書の準備体操」とも言える重要な命令なんです。
2. 基礎知識: INITIATE文が「何を」初期化するのか
COBOLの報告書作成機能(REPORT WRITER機能)は、プログラムが自動でページ番号を振ったり、合計を計算したり、ヘッダーやフッターを生成したりする非常に便利な機能です。
INITIATE文は、この報告書作成機能の内部状態を、これから新しい報告書を作り始めるのに最適な状態にリセットします。具体的には、以下の項目を初期化します。
- PAGE-COUNTER: 報告書の現在のページ番号を管理する内部カウンタです。INITIATE文により「1」にリセットされます。新しい報告書は必ず1ページ目から始まりますよね。
- SUM句の合計領域: 報告書グループ内で定義された「SUM句」による合計値が格納される内部領域です。INITIATE文により「0」にリセットされます。新しい集計はゼロから始めるのが鉄則です。
- 内部状態: 報告書作成機能の内部的な状態を「準備完了」に設定します。これにより、次にデータを出力するGENERATE文が正しく機能するようになります。
これらの初期化によって、プログラムは毎回クリーンな状態から報告書作成を開始できるわけです。
3. 実装/解決策: INITIATE文は「いつ」使うのか
INITIATE文は、GENERATE文(データを出力する命令)を呼び出す前に、必ず一度だけ実行する必要があります。
通常は、必要なファイルオープンなどの初期処理が終わった直後、メインの処理ループに入る前に記述します。
論理的な流れとしては以下のようになります。
- 必要なファイルをオープンする。
- INITIATE文で報告書作成機能を初期化する。
- 入力ファイルを読み込みながら、GENERATE文で報告書にデータを出力していく。
- TERMINATE文で報告書を終了する。
- ファイルをクローズする。
非常にシンプルで、使い方も簡単です。
INITIATE [報告書名].
このように、INITIATEの後に、DATA DIVISIONのREPORT SECTIONで定義した報告書の名前を指定します。
4. サンプルプログラム: INITIATE文を使ったシンプルな報告書作成
それでは、実際にINITIATE文を使った簡単なCOBOLプログラムを見てみましょう。
この例では、架空の売上データを元にシンプルな集計報告書を作成します。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO 'SALES.DAT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT REPORT-OUT ASSIGN TO 'SALES_REPORT.LST'.
DATA DIVISION.
FILE SECTION.
FD SALES-FILE.
01 SALES-RECORD.
05 SALES-ITEM-CODE PIC X(05).
05 SALES-AMOUNT PIC 9(07).
FD REPORT-OUT
REPORT IS SALES-REPORT.
REPORT SECTION.
RD SALES-REPORT
CONTROLS ARE (FINAL)
PAGE LIMIT IS 10 LINES
HEADING 1
FIRST DETAIL 3
LAST DETAIL 7
FOOTING 9.
01 REPORT-HEADING TYPE IS RH.
05 LINE NUMBER IS 1.
10 COLUMN NUMBER IS 20 VALUE IS "売上報告書".
01 DETAIL-LINE TYPE IS DETAIL.
05 LINE NUMBER IS NEXT.
10 COLUMN NUMBER IS 5 PIC X(05) SOURCE IS SALES-ITEM-CODE.
10 COLUMN NUMBER IS 15 PIC 9(07) SOURCE IS SALES-AMOUNT.
01 REPORT-FOOTING TYPE IS RF.
05 LINE NUMBER IS 9.
10 COLUMN NUMBER IS 5 VALUE IS "合計:".
10 COLUMN NUMBER IS 15 PIC 9(07) SUM SALES-AMOUNT.
WORKING-STORAGE SECTION.
01 WS-EOF-FLAG PIC X VALUE 'N'.
88 END-OF-SALES-FILE VALUE 'Y'.
PROCEDURE DIVISION.
MAIN-LOGIC.
OPEN INPUT SALES-FILE
OUTPUT REPORT-OUT.
INITIATE SALES-REPORT. > ★ここがINITIATE文!報告書機能を初期化します。
PERFORM READ-SALES-FILE.
PERFORM PROCESS-SALES-RECORDS
UNTIL END-OF-SALES-FILE.
TERMINATE SALES-REPORT. > 報告書作成を終了し、レポートを出力します。
CLOSE SALES-FILE
REPORT-OUT.
STOP RUN.
READ-SALES-FILE.
READ SALES-FILE
AT END SET END-OF-SALES-FILE TO TRUE
END-READ.
PROCESS-SALES-RECORDS.
GENERATE DETAIL-LINE. > 読み込んだデータを元に詳細行を生成します。
PERFORM READ-SALES-FILE.
(※上記コードはREPORT WRITER機能の概念的なサンプルです。SUM句はCONTROL BREAKと組み合わせて使用されることが多いですが、ここでは簡易的にFINALでの合計としています。より実用的なREPORT WRITER機能は複雑になるため、INITIATE文に焦点を当てています。)
このプログラムでは、ファイルから売上データを読み込み、それを元に「SALES-REPORT」という名前の報告書を作成します。
注目してほしいのは、INITIATE SALES-REPORT. の行です。
ここで報告書機能が初期化され、PAGE-COUNTER は1に、そしてSUM SALES-AMOUNT が計算する合計領域は0にリセットされます。これにより、常に新しい状態から報告書作成が開始されるのです。
5. 応用・注意点: INITIATE文を忘れるとどうなる?
INITIATE忘れの悲劇
もしINITIATE文を書き忘れたり、誤ったタイミングで実行しなかった場合、どうなるでしょうか?
多くの場合、プログラムは実行時エラー(ランタイムエラー)で異常終了します。これは、報告書作成機能が「準備完了」状態になっていないため、GENERATE文が正しく動作できないからです。
特に、既存のプログラムを修正する際や、REPORT WRITER機能を初めて使う際には、このINITIATE文の記述漏れがよくあるミスですので、十分注意してください。
複数回報告書を作成する場合
もし一つのプログラムで、全く異なる内容の報告書を複数作成する場合(例えば、月次報告書と年次報告書を連続して作成するなど)、それぞれの報告書に対して個別にINITIATE文とTERMINATE文を実行する必要があります。
例えば、
INITIATE MONTHLY-REPORT.
PERFORM PROCESS-MONTHLY-DATA.
TERMINATE MONTHLY-REPORT.
INITIATE YEARLY-REPORT.
PERFORM PROCESS-YEARLY-DATA.
TERMINATE YEARLY-REPORT.
このように、各報告書処理の開始時にそれぞれINITIATE文を記述します。
デバッグのヒント
報告書機能で期待通りの出力が得られない場合、まずINITIATE文が正しく記述されているか、そして適切なタイミングで実行されているかを確認することがデバッグの第一歩です。
特にPAGE-COUNTERが「1」にならない、SUM句の合計がおかしい、といった現象はINITIATE文の不備が原因である可能性が高いです。
INITIATE文は地味な命令かもしれませんが、COBOLの報告書作成機能を安全かつ確実に利用するための、まさに縁の下の力持ちです。
この重要な「準備体操」を忘れずに、皆さんのCOBOLプログラムをしっかり動かしてくださいね!

コメント