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

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

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

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

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

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

主な編集記号

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です