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