COBOLの帳票出力と編集!データ集計(小計・総計)の書き方を徹底解説
生徒
「先生、COBOLでよく聞く『帳票(ちょうひょう)』って何ですか?あと、データの合計を出すプログラムの作り方も知りたいです!」
先生
「帳票というのは、簡単に言うとお仕事で使うレポートや伝票のことですよ。COBOLは、大量のデータから『売上合計』や『支店ごとの小計』を計算して、きれいに印刷用の画面に出すのがとても得意なんです。」
生徒
「なるほど、表計算ソフトの集計機能みたいなことをプログラムでするんですね。でも、計算結果をただ出すだけじゃなくて、見た目を整えるのは難しくないですか?」
先生
「大丈夫ですよ。COBOLには『編集用項目』という便利な仕組みがあって、数字にカンマを入れたり、¥マークを付けたりするのも簡単です。今日は集計の基本となる小計と総計の出し方を一緒に見ていきましょう!」
1. 帳票出力とデータ集計の基本
プログラミングにおける帳票出力(ちょうひょうしゅつりょく)とは、コンピュータの中に保存されているバラバラなデータを、人間が見て分かりやすい形式(表やレポート)に並び替えて表示・印刷することを指します。特に銀行の通帳や会社の売上伝票など、正確な数字が求められる分野でCOBOLは今でも主役として活躍しています。
データを集計する際、よく使われるのが小計(しょうけい)と総計(そうけい)という考え方です。
「支店ごと」「日付ごと」など、特定のグループごとにまとめた合計金額のことです。
すべてのデータの最終的な合計金額のことです。
これをプログラムで実現するためには、データを順番に読み込みながら、グループが変わったタイミングで計算結果を表示するという「コントロールブレイク」という手法を使います。少し難しそうに聞こえますが、仕組みは単純な「足し算」の積み重ねです。
2. 数字を見やすくする「編集用項目」とは?
計算した結果をそのまま表示すると、「0001500」のように頭にゼロが付いたり、桁数が分かりにくかったりします。これをお客さんに見せる「1,500円」という形式に変換するのが、COBOLの編集用項目(へんしゅうようこうもく)です。
変数を宣言する「PICTURE句(ピクチャく)」の中で、特別な記号を使うことで表示形式を指定できます。
- Z(ゼロサプレス): 数字の先頭にある「0」を空白(スペース)に置き換えます。
- ,(コンマ): 3桁ごとにコンマを挿入します。
- \(円記号): 数字の先頭に「¥」マークを付けます。
例えば、PIC Z,ZZ9 と書くと、1000という数字は 1,000 と表示され、1という数字は 1 と表示されます。これにより、帳票の見た目が一気にプロっぽくなります。
3. データ集計(小計・総計)のプログラム例
それでは、実際に売上データを読み込んで、小計と総計を出力するプログラムの書き方を見てみましょう。ここでは「店舗コード」が変わったタイミングでその店舗の小計を出し、最後に全体の総計を出す流れをイメージしてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. SALES-SUMMARY.
DATA DIVISION.
WORKING-STORAGE SECTION.
* -- 入力データの代わり(実際はファイルから読み込みます) --
01 WS-SALES-DATA.
05 FILLER PIC X(10) VALUE "SHOP-A0500".
05 FILLER PIC X(10) VALUE "SHOP-A0300".
05 FILLER PIC X(10) VALUE "SHOP-B0800".
* -- 計算用の変数 --
01 WS-COUNTERS.
05 WS-SUB-TOTAL PIC 9(7) VALUE 0.
05 WS-GRAND-TOTAL PIC 9(9) VALUE 0.
05 WS-PREV-SHOP PIC X(6) VALUE SPACES.
* -- 出力(帳票)の形を整えるための変数(編集用項目) --
01 WS-REPORT-LINE.
05 WS-REP-TITLE PIC X(10).
05 WS-REP-AMT PIC Z,ZZZ,ZZ9.
PROCEDURE DIVISION.
MAIN-PROCESS.
* 1店舗目のデータを処理する準備
MOVE "SHOP-A" TO WS-PREV-SHOP
DISPLAY "--- 売上集計レポート ---"
* 本来はここでデータを繰り返し読み込みますが、今回は流れを解説します
* --- SHOP-Aの1件目 ---
ADD 500 TO WS-SUB-TOTAL
* --- SHOP-Aの2件目 ---
ADD 300 TO WS-SUB-TOTAL
* --- SHOP-Aのグループが終わったので小計を出力 ---
MOVE "店舗小計" TO WS-REP-TITLE
MOVE WS-SUB-TOTAL TO WS-REP-AMT
DISPLAY WS-REP-LINE
* 総計に加算して小計をリセット
ADD WS-SUB-TOTAL TO WS-GRAND-TOTAL
MOVE 0 TO WS-SUB-TOTAL
* --- SHOP-Bの1件目 ---
MOVE "SHOP-B" TO WS-PREV-SHOP
ADD 800 TO WS-SUB-TOTAL
* --- SHOP-Bの小計を出力 ---
MOVE "店舗小計" TO WS-REP-TITLE
MOVE WS-SUB-TOTAL TO WS-REP-AMT
DISPLAY WS-REP-LINE
ADD WS-SUB-TOTAL TO WS-GRAND-TOTAL
* --- 最後に全体の総計を出力 ---
DISPLAY "------------------------"
MOVE "総合計 " TO WS-REP-TITLE
MOVE WS-GRAND-TOTAL TO WS-REP-AMT
DISPLAY WS-REP-LINE
STOP RUN.
このプログラムを実行すると、画面(または帳票)には以下のように整えられた数字が表示されます。
--- 売上集計レポート ---
店舗小計 800
店舗小計 800
------------------------
総合計 1,600
4. 初心者が覚えておきたいポイント
COBOLで帳票プログラムを作る際に、パソコンを触ったことがない方でも意識しておくと良い「基本のき」を解説します。
1. 加算(ADD)と代入(MOVE)の使い分け
プログラムでは、今ある数字に新しく足していくときは ADD を使い、別の場所に数字をコピーして持っていくときは MOVE を使います。
特に「編集用項目」に数字を渡すときは、必ず MOVE を使います。計算用の変数(9だけの定義)から、表示用の変数(Zやカンマがある定義)へ引っ越しさせるイメージです。
2. ゼロサプレスの魔法
前述の Z を使うテクニックは非常に重要です。もしこれを使わないと、100円の表示が 0000100 となってしまい、非常に読みづらい帳票になってしまいます。コンピュータは「空いている桁はとりあえず0で埋める」という性質があるため、人間が見る時だけ「0を消してね」と命令するのが Z の役割です。
3. データの初期化
小計を計算したあと、次のグループの計算を始める前に、小計用の変数を 0 に戻す(リセットする)ことを忘れてはいけません。これを忘れると、前のグループの数字がどんどん足されてしまい、おかしな計算結果になってしまいます。
5. 用語集:これだけは覚えよう
| 用語 | 説明 |
|---|---|
| ピクチャ句 (PIC) | 変数の「入れ物」の形を決めるルール。数字なら9、文字ならX、編集用ならZなどを使います。 |
| サプレス (Suppress) | 「抑える、隠す」という意味。余計な「0」を表示させない処理のことを指します。 |
| コントロールブレイク | 読み込んでいるデータの「種類(キー)」が変わった瞬間を察知して、集計処理などを行うこと。 |
| ワーキングストレージ | プログラムが動いている間、一時的に数字や文字を覚えておくための「メモ帳」のような場所です。 |
6. 実践的な帳票作りのヒント
実際の現場では、ただ数字を出すだけでなく、ページの区切りで「見出し」を出し直したり、ページ番号を振ったりすることもあります。
COBOLには LINAGE 句という「1ページに何行書くか」を決める機能もあり、大量印刷を前提とした設計が組み込まれています。
また、負の数(マイナス)を扱うときは、PICTURE句に - や CR(貸方記号)を付けることで、会計独特の表現も可能になります。こうした細やかな配慮ができる点が、長年COBOLが事務処理の王様と呼ばれている理由なのです。
まずは「数字をMOVEして、Zで整える」という感覚を掴むところから始めてみてください。それができれば、複雑な売上報告書も必ず作れるようになりますよ!
1. 帳票出力とデータ集計の基本" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
2. 数字を見やすくする「編集用項目」とは?" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
3. データ集計(小計・総計)のプログラム例" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
4. 初心者が覚えておきたいポイント" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
5. 用語集:これだけは覚えよう" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">
6. 実践的な帳票作りのヒント" onerror="this.onerror=null; this.src='/img/view/java-exception-introduce.jpg';">