COBOLの帳票出力と編集!ページ数管理と改ページ制御の応用例
生徒
「先生、COBOLで大量のデータを印刷するとき、キリの良いところで次の紙に切り替えたり、ページ番号を振ったりするにはどうすればいいんですか?」
先生
「それは『帳票出力(ちょうひょうしゅつりょく)』という、COBOLが最も得意とする分野ですね。ページ数管理や改ページ制御という技術を使います。」
生徒
「難しそうですね…。プログラミングの経験が全くなくても、仕組みを理解することはできますか?」
先生
「大丈夫ですよ!身近な書類やノートをイメージすれば簡単です。基本から一歩ずつ、丁寧に解説していきますね。」
1. 帳票出力と改ページ制御の基本
パソコンを使ってお仕事をする際、請求書や納品書、売上の一覧表などを紙に印刷したり、PDFとして保存したりすることがあります。これらをITの世界では帳票(ちょうひょう)と呼びます。 COBOLというプログラミング言語は、この「きれいに整った書類」を作るのが非常に得意です。
例えば、1,000人分の名簿を印刷するとします。1枚の紙には30人分しか書けない場合、31人目は新しい紙の先頭に書く必要がありますよね。 このように、決まった行数に達したときに新しい用紙へ移る操作を改ページ制御と言います。
また、それぞれの紙に「1ページ」「2ページ」と番号を振るのがページ数管理です。 これらをプログラムで行うには、「今、何行目まで書いたかな?」「今、何ページ目かな?」という情報を、プログラムの中に「変数(へんすう)」という名前の箱を作って覚えさせておく必要があります。
2. カウンタ変数の役割(行数とページ数)
プログラムでページを管理するために、まず「数えるための道具」を用意します。これをカウンタと呼びます。 料理をするときに「何分焼いたか」をタイマーで測るのと似ています。
具体的には、以下の2つのカウンタを準備します。
- 行数カウンタ: 現在のページに何行書いたかを数えます。
- ページカウンタ: 今が何枚目の紙かを数えます。
COBOLでは、データ部(DATA DIVISION)という場所に、これらの数字を入れるための場所を定義します。
例えば、行数を LINE-COUNT、ページ数を PAGE-COUNT と名付けます。
3. 改ページのタイミングを決める「条件分岐」
改ページを行うには、以前学習した「if文(イフぶん)」を使います。 「もし、行数が30行を超えたら、新しい紙にする」という命令を出すわけです。
新しいページにする際、プログラムの中では以下のような手順を踏みます。
- ページカウンタに1を足す(1ページ進める)。
- 行数カウンタを0にリセットする(新しい紙の0行目に戻る)。
- 新しいページの最初に見出し(タイトルや項目名)を書き込む。
この一連の流れを正確に書くことで、何枚になっても崩れないきれいな表が出来上がります。
4. サンプルプログラムで流れを確認
では、実際にどのように書くのか、簡単な例を見てみましょう。 ここでは、1ページに5行だけ印刷するという、非常に小さな帳票をイメージしたコードを紹介します。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-REPORT.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 行数を数える箱(最大2桁)
01 LINE-COUNT PIC 9(02) VALUE 0.
* ページ数を数える箱(最大3桁)
01 PAGE-COUNT PIC 9(03) VALUE 0.
* 繰り返しを数える箱
01 I PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
MAIN-PROCESS.
* 最初に1ページ目としての処理を開始
PERFORM NEW-PAGE-RTN
* 12回繰り返してデータを出す(5行ごとに改ページされるはず)
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 12
IF LINE-COUNT >= 5 THEN
PERFORM NEW-PAGE-RTN
END-IF
DISPLAY "データNo: " I " を印刷中..."
ADD 1 TO LINE-COUNT
END-PERFORM.
STOP RUN.
* 改ページ処理の部品
NEW-PAGE-RTN.
ADD 1 TO PAGE-COUNT
MOVE 0 TO LINE-COUNT
DISPLAY "------------------------------"
DISPLAY "--- " PAGE-COUNT " ページ目の見出し ---"
DISPLAY "------------------------------"
* 見出しを書いたので行数をカウント
ADD 3 TO LINE-COUNT.
5. 実行結果の解説
上記のプログラムを動かすと、以下のような結果が表示されます。 5行表示されるたびに、新しいページの見出しが出てくる様子に注目してください。
------------------------------
--- 001 ページ目の見出し ---
------------------------------
データNo: 01 を印刷中...
データNo: 02 を印刷中...
データNo: 03 を印刷中...
------------------------------
--- 002 ページ目の見出し ---
------------------------------
データNo: 04 を印刷中...
データNo: 05 を印刷中...
データNo: 06 を印刷中...
データNo: 07 を印刷中...
データNo: 08 を印刷中...
------------------------------
--- 003 ページ目の見出し ---
------------------------------
データNo: 09 を印刷中...
データNo: 10 を印刷中...
データNo: 11 を印刷中...
データNo: 12 を印刷中...
このように、プログラムが自動で行数を数え、「もし5行目になったら」という約束を守って動いていることがわかりますね。 実際の現場では、5行ではなく30行や50行といった単位で制御を行います。
6. 応用:グループごとの改ページ(キーブレイク)
さらに高度な応用例として、キーブレイクによる改ページがあります。 これは、「部署が変わったら新しいページにする」とか「日付が変わったら新しいページにする」といった制御のことです。
例えば、学校のクラス名簿を作るとき、1組のデータが終わって2組が始まるときに、ページも新しくなると見やすいですよね。 この場合、「前のデータのクラス名」と「今のデータのクラス名」を比較して、変わった瞬間に改ページ処理を実行します。
初心者のうちは、「行数を数える」という基本をしっかりマスターしましょう。 それができるようになれば、グループごとの改ページも、ページの一番下に合計金額を出す「フッター処理」も、同じ考え方で書けるようになります。
7. 編集用記号を使って見た目を整える
帳票出力において、改ページと同じくらい大切なのが「数字の見た目」です。 COBOLには編集用記号という便利な機能があります。
例えば、銀行の通帳のように「1234567」という数字を「1,234,567」とカンマ区切りにしたり、お金を表す「¥」マークを付けたりすることです。 これを「編集(へんしゅう)」と呼びます。
プログラムの中で計算するときは純粋な数字を使いますが、紙に書くときだけは人間が見やすいように加工します。
COBOLのデータ定義(PIC句)で PIC 9,999,999 のように書くだけで、自動的にカンマが入るようになるのです。
これこそが、COBOLが「事務処理用言語」として長年愛されている理由の一つです。
8. まとめ:帳票出力は「段取り」がすべて
COBOLでの帳票出力とページ管理について学んできました。 一見難しそうに見えますが、やっていることは「今どこまで書いたかメモする」「規定の行数になったら紙を取り替える」という、私たちが手書きで表を作るときと同じ動作です。
プログラミング未経験の方は、まず「コンピュータは勝手に空気を読んで改ページしてくれない」ということを知ってください。 人間が一つひとつ、「行数を数えてね」「条件に合ったら見出しを書いてね」と指示を出す必要があります。 でも、一度指示を正しく書けば、何万枚という書類もミスなく一瞬で作ってくれるのがプログラムの素晴らしいところです。
最初は行数カウンタがズレてしまったり、ページ番号がずっと「1」のままだったりという失敗をすることもあります。 しかし、そのたびに「どこで数え間違えたかな?」とプログラムを見直すことが、上達への近道です。