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など)のマニュアルを参照してください。
帳票出力は奥が深いテーマですが、基本を押さえることが大切です。色々なパターンを試してみてくださいね!