[COBOLのはじめ方] Part19: 帳票出力とフォーマット制御

COBOLは、企業の基幹システムで広く使われており、請求書や売上レポートなどの「帳票」を出力する処理は非常に重要です。このステップでは、COBOLプログラムで帳票を出力し、その見た目を整える「フォーマット制御」の基本を学びます。💪

ここでは、COBOLの基本的な機能であるWRITE文を使った帳票出力方法を中心に解説します。


Warning: Undefined array key “is_admin” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 113

Warning: Undefined array key “is_category_top” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 118

Warning: Undefined array key “is_top” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 124

帳票レイアウトの準備 (DATA DIVISION) 📐

帳票の各行の見た目(レイアウト)は、DATA DIVISIONWORKING-STORAGE SECTION などで定義します。PICTURE句(PIC句)を使って、データ項目(変数)の桁数や種類(数字、文字など)を指定しますが、さらに「編集記号」を使うことで、出力時のフォーマットを細かく制御できます。

例えば、数値をそのまま出力すると 12345 のようになりますが、編集記号を使えば 12,345***12,345 のように見やすく整形できます。✨

主な編集記号

よく使われる編集記号には以下のようなものがあります。

記号 意味 例 (元データ: 12345, -123) PIC句の例 出力例
9 数字 12345 PIC 9(5) 12345
Z 先行ゼロを空白に置き換える(ゼロ抑制) 00123 PIC ZZZZ9   123
, カンマ挿入 12345 PIC ZZZ,ZZ9  12,345
. 小数点 123.45 (内部: 123V45) PIC ZZZ.99 123.45
- 負の場合にマイナス記号を表示 -123 PIC -ZZ9 -123
+ 正の場合に’+’, 負の場合に’-‘を表示 123, -123 PIC +ZZ9 +123, -123
CR / DB 負の場合にCR/DBを表示(貸方/借方) -123 PIC ZZZ9CR  123CR
* 先行ゼロをアスタリスクに置き換える(チェックプロテクション) 00123 PIC *****9 ***123
B 空白挿入 “ABC” + “DEF” PIC X(3)BX(3) ABC DEF
0 ゼロ挿入 123 PIC 90909 10203
/ スラッシュ挿入 20250330 PIC 9(4)/9(2)/9(2) 2025/03/30
$ 通貨記号(環境により異なる場合あり) 12345 PIC $ZZ,ZZ9.99  $12,345.00

これらの編集記号を組み合わせて、帳票の各項目を見やすい形に整形します。例えば、金額を表示する項目なら PIC ZZZ,ZZZ,ZZ9 のように定義します。

帳票1行分のレイアウト定義例

WORKING-STORAGE SECTION に、帳票の明細行のレイアウトを定義する例です。


       WORKING-STORAGE SECTION.
       01 DETAIL-LINE.
          05 FILLER         PIC X(01) VALUE SPACE.  *> 行頭の空白
          05 PRINT-ITEM-CODE  PIC X(10).            *> 商品コード
          05 FILLER         PIC X(03) VALUE SPACES. *> 区切り空白
          05 PRINT-ITEM-NAME  PIC X(20).            *> 商品名 (日本語の場合は N など)
          05 FILLER         PIC X(03) VALUE SPACES. *> 区切り空白
          05 PRINT-QUANTITY   PIC ZZZZ9.            *> 数量 (ゼロ抑制)
          05 FILLER         PIC X(03) VALUE SPACES. *> 区切り空白
          05 PRINT-PRICE      PIC ZZZ,ZZ9.          *> 単価 (カンマ付きゼロ抑制)
          05 FILLER         PIC X(03) VALUE SPACES. *> 区切り空白
          05 PRINT-AMOUNT     PIC ZZZ,ZZZ,ZZ9.      *> 金額 (カンマ付きゼロ抑制)
          05 FILLER         PIC X(58) VALUE SPACES. *> 行末までの空白埋め (132桁プリンタ想定)
        

上記のように、FILLER項目にVALUE SPACESを指定して空白(スペース)を定義し、各項目の間隔を調整します。また、PIC句の編集記号を使って、数値を見やすく整形しています。

帳票の出力 (PROCEDURE DIVISION) 🖨️

DATA DIVISION で定義した帳票レイアウト(レコード)を使って、実際にファイルへ出力する処理は PROCEDURE DIVISION に記述します。

1. ファイルを開く (OPEN)

まず、帳票を出力する先のファイルを OUTPUT モードで開きます。ENVIRONMENT DIVISIONFILE-CONTROL で定義したファイル名を使います。


       OPEN OUTPUT REPORT-FILE.
        

2. データを出力する (WRITE)

WRITE文を使って、定義したレコード(帳票の1行)を出力します。WORKING-STORAGE SECTION などで定義した項目にデータをセット(MOVE文など)してから出力するのが一般的です。

WRITE ファイルのレコード名 FROM データ項目名 という形式を使うと、MOVE文を使わずに直接データ項目を出力できて便利です。


       *> WORKING-STORAGE SECTION で定義した DETAIL-LINE にデータをセットする処理 (MOVE など)
       MOVE ITEM-CODE  TO PRINT-ITEM-CODE.
       MOVE ITEM-NAME  TO PRINT-ITEM-NAME.
       MOVE QUANTITY   TO PRINT-QUANTITY.
       MOVE PRICE      TO PRINT-PRICE.
       MOVE AMOUNT     TO PRINT-AMOUNT.

       *> DETAIL-LINE を REPORT-RECORD に書き出す
       WRITE REPORT-RECORD FROM DETAIL-LINE.
        

REPORT-RECORD は、FD(ファイル記述項)で定義された、REPORT-FILE に対応するレコード名です。

3. 改行制御 (ADVANCING)

帳票では、改行の制御が重要です。WRITE文に ADVANCING句を追加することで、出力前後の改行数を指定できます。

  • BEFORE ADVANCING n LINES: n行改行してから出力します。
  • AFTER ADVANCING n LINES: 出力してからn行改行します。 (こちらが一般的によく使われます)
  • AFTER ADVANCING PAGE: 次のページの先頭から出力します。(改ページ)

       *> 1行改行してから DETAIL-LINE を出力
       WRITE REPORT-RECORD FROM DETAIL-LINE
           BEFORE ADVANCING 1 LINE.

       *> DETAIL-LINE を出力してから 2行改行
       WRITE REPORT-RECORD FROM DETAIL-LINE
           AFTER ADVANCING 2 LINES.

       *> ヘッダーを出力して改ページ
       WRITE REPORT-RECORD FROM HEADER-LINE
           AFTER ADVANCING PAGE.
        

💡 ADVANCING句を省略した場合の動作は、COBOL処理系(コンパイラ)の設定によって異なる場合がありますが、多くの場合 AFTER ADVANCING 1 LINE と同じ動作になります。

4. ファイルを閉じる (CLOSE)

帳票の出力がすべて終わったら、必ずファイルを閉じます。


       CLOSE REPORT-FILE.
        

簡単なサンプルコード 📝

簡単な売上レポート(ヘッダー、明細、フッター)を出力するサンプルコードです。入力データの読み込み部分は省略し、帳票出力部分に焦点を当てています。


       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE-REPORT.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT REPORT-FILE ASSIGN TO "report.txt"
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD REPORT-FILE.
       01 REPORT-RECORD    PIC X(132). *> 帳票ファイルの1行

       WORKING-STORAGE SECTION.
       01 W-ITEM-CODE      PIC X(10).
       01 W-ITEM-NAME      PIC X(20). *> 本来は日本語項目 N(10) など
       01 W-QUANTITY       PIC 9(5).
       01 W-PRICE          PIC 9(7).
       01 W-TOTAL-AMOUNT   PIC 9(9) VALUE ZERO.

       01 HEADER-LINE.
          05 FILLER         PIC X(55) VALUE SPACES.
          05 FILLER         PIC X(22) VALUE "*** 売上レポート ***".
          05 FILLER         PIC X(55) VALUE SPACES.

       01 DETAIL-LINE.
          05 FILLER         PIC X(01) VALUE SPACE.
          05 PRINT-ITEM-CODE  PIC X(10).
          05 FILLER         PIC X(03) VALUE SPACES.
          05 PRINT-ITEM-NAME  PIC X(20).
          05 FILLER         PIC X(03) VALUE SPACES.
          05 PRINT-QUANTITY   PIC ZZZZ9.
          05 FILLER         PIC X(03) VALUE SPACES.
          05 PRINT-PRICE      PIC ZZZ,ZZ9.
          05 FILLER         PIC X(03) VALUE SPACES.
          05 PRINT-AMOUNT     PIC ZZZ,ZZZ,ZZ9.
          05 FILLER         PIC X(58) VALUE SPACES.

       01 FOOTER-LINE.
          05 FILLER         PIC X(40) VALUE SPACES.
          05 FILLER         PIC X(10) VALUE "合計金額: ".
          05 PRINT-TOTAL-AMOUNT PIC ZZZ,ZZZ,ZZ9.
          05 FILLER         PIC X(70) VALUE SPACES.

       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           OPEN OUTPUT REPORT-FILE.

           *> ヘッダー出力 (改ページして出力)
           WRITE REPORT-RECORD FROM HEADER-LINE
               AFTER ADVANCING PAGE.
           *> ヘッダーの後、2行空ける
           WRITE REPORT-RECORD FROM SPACES
               AFTER ADVANCING 2 LINES.

           *> --- 明細データの処理ループ (本来はファイルREADなど) ---
           *> サンプルデータ1
           MOVE "ITEM001"   TO W-ITEM-CODE.
           MOVE "商品A"      TO W-ITEM-NAME.
           MOVE 120         TO W-QUANTITY.
           MOVE 500         TO W-PRICE.
           PERFORM PROCESS-DETAIL.

           *> サンプルデータ2
           MOVE "ITEM002"   TO W-ITEM-CODE.
           MOVE "商品B"      TO W-ITEM-NAME.
           MOVE 50         TO W-QUANTITY.
           MOVE 1200        TO W-PRICE.
           PERFORM PROCESS-DETAIL.

           *> --- ループ終了 ---

           *> フッターの前に2行空ける
           WRITE REPORT-RECORD FROM SPACES
               AFTER ADVANCING 2 LINES.

           *> フッター出力
           MOVE W-TOTAL-AMOUNT TO PRINT-TOTAL-AMOUNT.
           WRITE REPORT-RECORD FROM FOOTER-LINE
               AFTER ADVANCING 1 LINE.

           CLOSE REPORT-FILE.
           STOP RUN.

       PROCESS-DETAIL.
           *> 金額計算
           COMPUTE W-AMOUNT = W-QUANTITY * W-PRICE.
           *> 合計金額に加算
           ADD W-AMOUNT TO W-TOTAL-AMOUNT.

           *> 明細項目へデータをセット
           MOVE W-ITEM-CODE  TO PRINT-ITEM-CODE.
           MOVE W-ITEM-NAME  TO PRINT-ITEM-NAME.
           MOVE W-QUANTITY   TO PRINT-QUANTITY.
           MOVE W-PRICE      TO PRINT-PRICE.
           MOVE W-AMOUNT     TO PRINT-AMOUNT.

           *> 明細行を出力 (1行改行)
           WRITE REPORT-RECORD FROM DETAIL-LINE
               AFTER ADVANCING 1 LINE.

       END PROGRAM SAMPLE-REPORT.
        

このプログラムを実行すると、report.txt というファイルに整形された帳票が出力されます。

まとめ 🎉

今回は、COBOLで帳票を出力するための基本的な方法を学びました。

  • DATA DIVISIONWORKING-STORAGE SECTION で帳票のレイアウトを定義する。
  • PICTURE句の編集記号を使って、数値や文字列の見た目を整形する。
  • PROCEDURE DIVISION でファイルを OPEN OUTPUT し、WRITE文でデータを出力する。
  • ADVANCING句で改行や改ページを制御する。
  • 最後にファイルを CLOSE する。

これらの基本をマスターすれば、様々な形式の帳票を作成できるようになります。COBOLには、さらに高度な帳票作成機能として REPORT SECTION を使う「報告書作成機能(Report Writer)」や、LINAGE句によるページ管理機能などもありますが、まずは今回学んだWRITE文による出力方法をしっかり理解しましょう。

次のステップでは、日付処理やエラーハンドリングなど、より実務的な処理について学んでいきます。頑張りましょう!🚀

参考情報 📚

COBOLの文法や機能に関する詳細は、利用しているCOBOL処理系(GnuCOBOL, Micro Focus COBOL, IBM Enterprise COBOLなど)のマニュアルを参照してください。

帳票出力は奥が深いテーマですが、基本を押さえることが大切です。色々なパターンを試してみてくださいね!😊