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)」というルールで統一して覚えることを強くお勧めします。この一貫性が、バグ(プログラムのミス)のない綺麗なコードを作る秘訣です。
まとめ
今回はCOBOLにおける帳票出力の重要な仕組みであるWRITE AFTER ADVANCINGについて詳しく理解しました。COBOLは業務システムや帳票処理に強いプログラミング言語であり、単にデータを出力するだけではなく、人間が読みやすいレイアウトを作ることが求められます。その中でもWRITE AFTER ADVANCINGは、改行制御や改ページ制御を行うための非常に重要な命令です。 まず基本となるのは、行送りの制御です。WRITE文に続けてAFTER ADVANCINGと数値を指定することで、何行分進めるかを自由にコントロールできます。この仕組みによって、見出しのあとに空白行を入れたり、データを読みやすく整列させたりすることが可能になります。特に帳票レイアウト設計では、この行間の調整が読みやすさに直結するため、実務でも頻繁に利用される重要なテクニックです。 次に重要なのが改ページ制御です。AFTER ADVANCING PAGEを使うことで、現在のページを終了し、新しいページの先頭に移動することができます。これは大量データを扱うバッチ処理や報告書作成において不可欠な機能です。一定件数ごとにページを分割することで、印刷物としても見やすく整理された帳票を作成できます。 また実務では、単純にページを切り替えるだけでなく、ページごとに見出しを再表示することが重要になります。これによりどのページを見ても内容が分かる帳票になります。WRITE AFTER ADVANCING PAGEの直後に見出しを出力する処理を組み込むことで、より実践的な帳票が完成します。 さらに、行数カウンターを利用した自動改ページの仕組みも重要なポイントです。一定の行数を超えたら改ページしカウンターをリセットするという処理を組み込むことで、どれだけデータが増えても安定したレイアウトを維持できます。このような制御はCOBOLの業務システムでは基本的な設計パターンとなっています。 注意点として、BEFORE ADVANCINGとAFTER ADVANCINGの違いを理解することも大切です。一般的にはAFTER ADVANCINGの方が直感的で扱いやすく、実務でも広く使われています。統一して使用することでバグの発生を防ぐことができます。 以下に、改ページと行送りを組み合わせた実践的なサンプルを示します。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 LINE-COUNT PIC 9(3) VALUE 0.
PROCEDURE DIVISION.
OPEN OUTPUT PRINT-FILE.
PERFORM 100 TIMES
IF LINE-COUNT > 5 THEN
WRITE PRINT-REC AFTER ADVANCING PAGE
MOVE 0 TO LINE-COUNT
MOVE "--- 新しいページ ---" TO PRINT-REC
WRITE PRINT-REC AFTER ADVANCING 1 LINE
ELSE
MOVE "データ行" TO PRINT-REC
WRITE PRINT-REC AFTER ADVANCING 1 LINE
ADD 1 TO LINE-COUNT
END-IF
END-PERFORM.
CLOSE PRINT-FILE.
STOP RUN.
実行結果のイメージは以下の通りです。
データ行
データ行
データ行
データ行
データ行
データ行
--- 新しいページ ---
データ行
データ行
このようにWRITE AFTER ADVANCINGを活用することで、COBOLの帳票出力は単なる文字出力から一歩進んだ「レイアウト制御」へと進化します。初心者の方はまず1行送りと改ページの基本を理解し、その後カウンター制御や見出し再出力といった応用へと進むことで、実務レベルの帳票作成スキルを身につけることができます。繰り返しコードを書いて動きを確認することで理解が深まりますので、ぜひ手を動かしながら習得していきましょう。
生徒
「WRITE AFTER ADVANCINGでこんなに細かく帳票を制御できるとは思いませんでした」
先生
「COBOLは帳票処理に特化した機能が豊富なので、レイアウト制御がとても得意なんです」
生徒
「行送りと改ページの違いもはっきり分かりました」
先生
「その理解はとても大切です。特にPAGE指定は実務でよく使います」
生徒
「行数をカウントして自動でページを変える仕組みも面白かったです」
先生
「その通りです。大規模データでも安定した帳票を作るための基本テクニックです」
生徒
「これで実際の帳票作成にも挑戦できそうです」
先生
「ぜひ実践してみてください。理解が一気に深まりますよ」