COBOLの帳票出力を極める!WRITE AFTER ADVANCINGの改ページ制御
生徒
「COBOLで印刷用のデータを作っているのですが、一行ずつじゃなくて、キリのいいところで次のページに移動させるにはどうすればいいですか?」
先生
「それなら『WRITE AFTER ADVANCING』という命令を使います。これを使うと、文字を書いた後に好きな数だけ行を飛ばしたり、新しいページに切り替えたりできるんですよ。」
生徒
「ADVANCING……『進める』という意味ですね!紙を送り出すイメージでしょうか?」
先生
「その通りです!昔ながらのプリンターで紙をガチャンと送る動きを想像すると分かりやすいですよ。詳しく解説していきますね!」
1. WRITE AFTER ADVANCINGとは?
COBOL(コボル)というプログラミング言語が得意とする仕事の一つに、大量の「帳票(ちょうひょう)」作成があります。帳票とは、請求書や売上報告書といった、印刷して使う書類のことです。こうした書類を作るとき、単に文字を並べるだけでなく、「ここは1行あける」「ここからは新しいページに印刷する」といった、紙のコントロールが必要になります。
そこで使われるのがWRITE AFTER ADVANCING(ライト・アフター・アドバンシング)という命令です。直訳すると「書き込み、その後に進める」となります。コンピュータに対して、「この一行を書き込んだら、紙をこれだけ進めてね」と指示を出すための重要な仕組みなのです。パソコンを触ったことがない方でも、タイプライターで一行打った後にレバーで紙を上に送る様子をイメージすれば、この命令の役割がスッと理解できるはずです。
2. 改行(行送り)の基本:数値指定
まずは最もシンプルな「行送り」から学びましょう。例えば、2行分あけて次の文字を書きたいときは、WRITE レコード名 AFTER ADVANCING 2 LINESと書きます。この「2」という数字を変えることで、1行送り、3行送りなど、自由自在にレイアウトを調整できます。
事務処理の現場では、見出しを書いた後に少し隙間をあけてデータを並べることが多いので、この数値指定は非常によく使われます。逆に、まったく行を進めたくないときは「0」を指定することもありますが、基本的には「1」や「2」を使って、読みやすい書類を作っていくことになります。プログラミング未経験でも、算数の数字を入れ替えるだけなのでとても簡単です。
* 1行書いて1行進める(通常の改行)
WRITE PRINT-REC AFTER ADVANCING 1 LINE.
* 1行書いて3行進める(2行分あける)
WRITE PRINT-REC AFTER ADVANCING 3 LINES.
3. 改ページ(ページ替え)の魔法:PAGE指定
帳票が長くなってくると、1枚の紙には収まりきらなくなります。キリのいいところで次の新しい紙に切り替えたい時に使うのがPAGE(ページ)指定です。WRITE レコード名 AFTER ADVANCING PAGEと書くだけで、コンピュータは「今の紙はここまでにして、次の真っさらなページの一行目に行こう!」と判断してくれます。
これを改ページ制御(かいページせいぎょ)と呼びます。例えば、1ページに10件のデータを載せると決めた場合、10件書き終わった瞬間にこの命令を実行すれば、11件目は必ず次のページの先頭に印刷されるようになります。まるで本をめくるように、自動的にページが切り替わる様子は、プログラムを作っていて非常に達成感がある瞬間です。
4. 行数を数えて自動で改ページする方法
現実のプログラムでは、「今、何行目まで書いたかな?」というのをコンピュータに数えさせ、一定の行数(例えば50行)を超えたら自動で改ページさせるという手法をよく使います。これには、前回学習したif文と、行数を数えるための「カウンター」という変数(箱)を組み合わせます。
「もしカウンターが50を超えたら、改ページしてカウンターを0に戻す」という命令を繰り返すことで、何千件、何万件という膨大なデータでも、綺麗にページが分かれた報告書が完成します。こうした「繰り返し」と「条件判断」の組み合わせは、COBOLで事務処理を行う際の大原則です。パズルを組み立てるように、一歩ずつ処理の流れを考えていきましょう。
* 行数を数えて改ページする例
IF LINE-COUNT > 50 THEN
WRITE PRINT-REC AFTER ADVANCING PAGE
MOVE 0 TO LINE-COUNT
ELSE
WRITE PRINT-REC AFTER ADVANCING 1 LINE
ADD 1 TO LINE-COUNT
END-IF.
5. 便利な機能:見出し(ヘッダー)の再出力
改ページをした直後には、新しいページの先頭に「売上報告書」というタイトルや、「日付」「ページ番号」をもう一度表示したいですよね。これを見出し(ヘッダー)と呼びます。改ページ制御を行う際は、この「見出しを出力する処理」をセットで行うのがプロの書き方です。
具体的には、ADVANCING PAGEでページを切り替えた直後に、見出し用の別のレコードをWRITEします。これにより、2ページ目、3ページ目にも必ずタイトルが表示され、誰が見ても分かりやすい書類になります。こうした「気配り」をプログラムに盛り込むことで、使い勝手の良いシステムが生まれるのです。パソコンに慣れていなくても、「自分が紙で見るときにどうなっていてほしいか」を想像することが一番の上達への近道です。
6. 特殊な制御: mnemonic-name(呼び名)の使用
現場の古いシステムなどでは、数字やPAGEという言葉の代わりに、あらかじめ決めておいた「呼び名」を使って改ページを指定することもあります。これは、使用するプリンターの種類によって改ページの仕組みが微妙に異なる場合に対応するための古い名残です。
例えば、ADVANCING C01(チャンネル01までスキップ)といった書き方です。最近の環境ではあまり見かけませんが、もし先輩が書いたコードに不思議なアルファベットが出てきたら、「これも改ページや特殊な行送りのための呼び名なんだな」と思い出してください。基本はPAGEや数値で十分通用しますので、まずは基本をしっかり押さえましょう。
7. 実際のプログラム全体の流れ(サンプルコード)
ここで、ファイルを開いて、1行書き、改ページをして、もう1行書くという一連の流れをプログラムで見てみましょう。全体の構造を眺めることで、どこで「紙送り」の指示を出しているのかがより明確になります。COBOLは上から順番に命令が実行されるので、物語を読むように追ってみてください。
PROCEDURE DIVISION.
* 1. ファイルを開く
OPEN OUTPUT PRINT-FILE.
* 2. 1ページ目のタイトルを書く
MOVE "--- 月間売上報告書 ---" TO PRINT-REC.
WRITE PRINT-REC AFTER ADVANCING 1 LINE.
* 3. 2行あけてデータを書く
MOVE "商品名: ノートパソコン" TO PRINT-REC.
WRITE PRINT-REC AFTER ADVANCING 3 LINES.
* 4. 新しいページに切り替えて、2ページ目を書く
MOVE "--- 2ページ目(続き) ---" TO PRINT-REC.
WRITE PRINT-REC AFTER ADVANCING PAGE.
* 5. ファイルを閉じる
CLOSE PRINT-FILE.
STOP RUN.
(出力イメージ)
[1ページ目]
--- 月間売上報告書 ---
商品名: ノートパソコン
[2ページ目]
--- 2ページ目(続き) ---
8. 改ページ制御で注意すべき「BEFORE」との違い
実は、AFTER ADVANCING(書いた後に進める)の他に、BEFORE ADVANCING(書く前に進める)という書き方も存在します。しかし、現在の日本の開発現場では、圧倒的にAFTERの方が好んで使われます。なぜなら、「書いてから一行下がる」という動きが、私たちがノートに文字を書く感覚と一致していて間違いが少ないからです。
もしBEFOREとAFTERが混ざってしまうと、1行に2回分の上書きが起きてしまったり、意図しない空白行ができたりと、トラブルの原因になります。初心者の方は、まずは「書いたら進む(AFTER)」というルールで統一して覚えることを強くお勧めします。この一貫性が、バグ(プログラムのミス)のない綺麗なコードを作る秘訣です。