【COBOL学習|実務向け】報告書作成の基本!FIRST DETAIL句で明細行の開始位置を自在に制御しよう

はじめに:報告書作成における明細行の配置の重要性

COBOLでの報告書作成において、明細行(DETAIL)がどこから印刷されるかは、報告書の可読性やレイアウトを決定する上で非常に重要です。特に、ページ見出し(PAGE HEADING)やコントロール見出し(CONTROL HEADING)が複数行にわたる場合、明細行が意図しない位置に印刷されてしまい、レイアウトが崩れることがあります。

このような課題を解決するために、本記事では `FIRST DETAIL` 句に焦点を当てて解説します。この句を使用することで、明細行の印刷開始位置を正確に制御し、見栄えの良い報告書を作成することが可能になります。

基礎知識:`FIRST DETAIL` 句とは?

`FIRST DETAIL` 句は、`REPORT SECTION` で使用される句の一つです。その主な役割は、「明細(DETAIL)レコードの印刷を開始する行番号を指定する」ことです。

通常、報告書はページの上部から順に印刷されていきます。しかし、ページ見出しやグループ見出しなど、明細行の前に印刷される項目が多い場合、それらの印刷位置によっては、明細行が意図しない行から印刷されてしまう可能性があります。

`FIRST DETAIL` 句は、このような状況下で、明細行が印刷され始めるべき「最初の行」を明示的に指定することで、レイアウトの崩れを防ぎます。

例えば、`PAGE LIMIT 60 FIRST DETAIL 5.` という記述があった場合、これは「この報告書は最大60行で構成され、明細行は5行目から印刷を開始する」という意味になります。つまり、1行目から4行目までは、見出しなどで使用される領域として確保されます。

実装:`FIRST DETAIL` 句の効果的な使い方

`FIRST DETAIL` 句は、`REPORT SECTION` 内の `SD` (Summary Description) または `FD` (File Description) の `RECORDING MODE IS V-RECORDING` 句、もしくは `PRINTING RECORD` 句の直後に記述します。

構文は以下の通りです。

FD 出力ファイル定義句
RECORDING MODE IS V-RECORDING.
01 出力レコード定義句.

PAGE LIMIT xxx FIRST DETAIL yyy.

ここで、`xxx` にはページあたりの最大行数を、`yyy` には明細行の開始行番号を指定します。

この句を指定することで、COBOLコンパイラは明細行の印刷開始位置を `yyy` 行目に調整します。これにより、ページ見出しやコントロール見出しとの間に適切なスペースを確保し、報告書全体のレイアウトを意図した通りに整えることができます。

サンプルプログラム

ここでは、`FIRST DETAIL` 句を使用した簡単な報告書作成のサンプルプログラムを示します。この例では、ページ見出しと明細行の間に5行のスペースを設けるように `FIRST DETAIL` 句を設定しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. FIRST-DETAIL-SAMPLE.
AUTHOR. ベテランCOBOL技術者.

DATA DIVISION.
REPORT SECTION.
SD REPORT-DATA.
01 PAGE-HEADING.
05 LINE NUMBER IS 1.
10 PIC X(40) VALUE ALL ”.
10 PIC X(10) VALUE ‘報告書タイトル’.
10 PIC X(40) VALUE ALL ”.
05 LINE NUMBER IS 2.
10 PIC X(50) VALUE SPACE.
10 PIC X(20) VALUE ‘作成日:’.
10 PIC X(10) VALUE ‘2023/10/27’.
05 LINE NUMBER IS 3.
10 PIC X(100) VALUE ALL ‘-‘.

01 DETAIL-LINE.
05 LINE NUMBER IS NEXT ROW. > DETAIL句で制御されるため、ここではNEXT ROWを使用
10 PIC X(5) VALUE SPACES.
10 PIC 9(5) TO DETAIL-ID.
10 PIC X(5) VALUE SPACES.
10 PIC X(20) TO DETAIL-NAME.
10 PIC X(10) VALUE SPACES.
10 PIC 9(8) TO DETAIL-AMOUNT PIC ZZZ,ZZZ.

PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM GENERATE-REPORT.
GOBACK.

GENERATE-REPORT.
REPORT-DATA.
—————————————————-

  • PAGE LIMIT: ページあたりの最大行数 (例: 25行)
  • FIRST DETAIL: 明細行の開始行番号 (例: 6行目から)

—————————————————-
PAGE LIMIT 25 FIRST DETAIL 6.

MOVE 1 TO DETAIL-ID.
MOVE ‘商品A’ TO DETAIL-NAME.
MOVE 15000 TO DETAIL-AMOUNT.
GENERATE DETAIL-LINE.

MOVE 2 TO DETAIL-ID.
MOVE ‘商品B’ TO DETAIL-NAME.
MOVE 25000 TO DETAIL-AMOUNT.
GENERATE DETAIL-LINE.

MOVE 3 TO DETAIL-ID.
MOVE ‘商品C’ TO DETAIL-NAME.
MOVE 30000 TO DETAIL-AMOUNT.
GENERATE DETAIL-LINE.

MOVE 4 TO DETAIL-ID.
MOVE ‘商品D’ TO DETAIL-NAME.
MOVE 45000 TO DETAIL-AMOUNT.
GENERATE DETAIL-LINE.
STOP POSITION 25. > ページ終端の指定(任意)

このサンプルでは、`PAGE LIMIT 25 FIRST DETAIL 6.` と指定しています。これにより、1行目から5行目まではPAGE-HEADINGが印刷され、6行目から明細行(DETAIL-LINE)が印刷されるようになります。

応用・注意点:現場で役立つヒント

  • `PAGE LIMIT` との連携: `FIRST DETAIL` 句は、`PAGE LIMIT` 句と組み合わせて使用することで、ページ全体のレイアウトをより厳密に制御できます。`PAGE LIMIT` でページあたりの最大行数を定義し、`FIRST DETAIL` で明細行の開始行を指定することで、見出しやフッターとの間で十分なスペースを確保できます。
  • `LINE NUMBER IS NEXT ROW` との関係: DETAIL句(明細レコード)の `LINE NUMBER` 句には、通常 `NEXT ROW` を指定します。これは、前の行の印刷が終わった次の行から印刷するという意味です。`FIRST DETAIL` 句は、この `NEXT ROW` がどの行から適用され始めるかを制御する役割を果たします。
  • デバッグのポイント: もし明細行が意図しない位置に印刷される場合は、まず `FIRST DETAIL` 句の指定値を確認してください。また、PAGE-HEADINGやCONTROL-HEADINGの `LINE NUMBER` 句の指定も合わせて確認し、行番号の重複や不足がないかチェックすることが重要です。
  • 可読性の向上: `FIRST DETAIL` 句で適切な行数を確保することで、報告書に余白が生まれ、全体的に見やすく、理解しやすい構成になります。特に、長期間にわたって参照される報告書では、この可読性の向上が大きなメリットとなります。

`FIRST DETAIL` 句を適切に活用することで、COBOLでの報告書作成の質を格段に向上させることができます。ぜひ、日々の開発業務で活用してみてください。

コメント

タイトルとURLをコピーしました