COBOLは、企業の基幹システムで広く使われており、請求書や売上レポートなどの「帳票」を出力する処理は非常に重要です。このステップでは、COBOLプログラムで帳票を出力し、その見た目を整える「フォーマット制御」の基本を学びます。
ここでは、COBOLの基本的な機能であるWRITE
文を使った帳票出力方法を中心に解説します。
帳票レイアウトの準備 (DATA DIVISION)
帳票の各行の見た目(レイアウト)は、DATA DIVISION
の WORKING-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 DIVISION
の FILE-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 DIVISION
のWORKING-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など)のマニュアルを参照してください。
帳票出力は奥が深いテーマですが、基本を押さえることが大切です。色々なパターンを試してみてくださいね!