COBOLのWRITE BEFORE ADVANCINGを完全解説!改行制御のコツ
生徒
「COBOLで帳票を作っているのですが、文字を書き込んだ後に改行するのではなく、改行してから書き込むことはできますか?」
先生
「それなら『WRITE BEFORE ADVANCING』を使うのがピッタリです。これを使えば、文字を印刷する前に紙を送り出すタイミングをコントロールできるんですよ。」
生徒
「BEFORE……『~の前に』という意味ですね。AFTERとどう使い分ければいいんでしょうか?」
先生
「実は現場によってルールが違ったりしますが、基本を知れば簡単です。具体的な使い方と改行制御の仕組みを見ていきましょう!」
1. WRITE BEFORE ADVANCINGとは?
COBOL(コボル)というプログラミング言語は、企業の売上報告書や請求書といった「帳票(ちょうひょう)」を作るのが得意です。帳票を作るとき、コンピュータに対して「紙を何行進めてから文字を書いてください」や「文字を書いてから紙を進めてください」という命令を出します。WRITE BEFORE ADVANCING(ライト・ビフォー・アドバンシング)は、その名の通り「文字を書き出す前に、紙を送り出す(改行する)」ための命令です。
プログラミング未経験の方にとって「改行」は当たり前のことに感じるかもしれませんが、昔の大型コンピュータに繋がったプリンターは、人間が手書きでノートに書くように、一行ずつ物理的に紙を送り出す必要がありました。この「紙を送る動作」を専門用語で行送り(ぎょうおくり)と呼び、この命令を使うことで、狙った通りの位置に文字を印刷できるようになります。
2. BEFOREとAFTERの違いをマスターしよう
帳票出力には「BEFORE」と「AFTER」の2種類があります。この違いを理解することが、綺麗なレイアウトを作るための第一歩です。
- WRITE AFTER ADVANCING:文字を書いた「後」に紙を送る。(私たちが普通のペンで文字を書いてから、次の行に移動する感覚です)
- WRITE BEFORE ADVANCING:文字を書く「前」に紙を送る。(まず次の行へ移動してから、そこに文字を書く感覚です)
パソコンを触ったことがない方でも、スタンプをイメージしてみてください。スタンプを押す場所を先に決めてから押すか、押した後に次の場所へ移動するか、という順番の違いだけです。なぜ「BEFORE」があるかというと、特定の枠線の中に文字をピッタリ収めたい時や、特殊なプリンターの制御を行う際に、先に紙の位置を確定させておいた方が都合が良い場合があるからです。
3. 数値を使った行送りの指定方法
具体的に何行あけたいかは、数字を使って指定します。例えば、1行だけあけて書きたいときは「1 LINE」、3行あけてから書きたいときは「3 LINES」と記述します。この数字の部分を自由に書き換えることで、書類の余白を調整することができます。
事務処理の世界では、見出しと本文の間を少しあけて読みやすくすることが求められます。こうした細かいレイアウトの調整が、COBOLプログラムの重要な役割です。なお、「LINE」と「LINES」はどちらを書いてもコンピュータは正しく理解してくれますが、複数のときは「LINES」と書くのが一般的で丁寧な書き方とされています。
* 1行分進めてから書き込む
WRITE PRINT-REC BEFORE ADVANCING 1 LINE.
* 2行分あけてから書き込む(実質3行進む)
WRITE PRINT-REC BEFORE ADVANCING 3 LINES.
4. 改ページ制御を行うPAGE指定
1枚の紙に収まらないほど大量のデータを印刷するときは、新しいページに切り替える「改ページ」が必要です。この時もBEFORE ADVANCINGが活躍します。BEFORE ADVANCING PAGEと書くと、今の紙への書き込みを止め、新しい紙の先頭まで一気に紙を送り出してから、最初の文字を書き込みます。
これを改ページ制御(かいページせいぎょ)と呼びます。例えば、1ページに20件の売上データを載せると決めた場合、21件目のデータは新しいページに印刷しなければなりません。そんな時に「もし21件目なら、PAGEを使って次の紙に行ってね」という指示をプログラムに組み込むのです。これで、何百枚もある報告書も自動で綺麗に整えられます。
5. 実践的な帳票出力のプログラム例
それでは、実際にどのようにコードを書くのか見てみましょう。この例では、まず「タイトル」を書き、その後に「明細(めいさい)」と呼ばれる中身のデータを書き出しています。プログラミングが初めての方でも、MOVEという命令が「データを移す(準備する)」、WRITEが「実際に書き出す」という意味であることを知っていれば、流れが掴めるはずです。
IDENTIFICATION DIVISION.
PROGRAM-ID. LIST-OUT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRT-F ASSIGN TO "SYSLST"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD PRT-F.
01 PRT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 TITLE-MSG PIC X(20) VALUE "【売上日報】".
01 DATA-MSG PIC X(20) VALUE "商品A: 100円".
PROCEDURE DIVISION.
OPEN OUTPUT PRT-F.
* タイトルを準備して、1行進めてから書く
MOVE TITLE-MSG TO PRT-REC
WRITE PRT-REC BEFORE ADVANCING 1 LINE
* データを準備して、さらに1行進めてから書く
MOVE DATA-MSG TO PRT-REC
WRITE PRT-REC BEFORE ADVANCING 1 LINE
CLOSE PRT-F.
STOP RUN.
(出力結果のイメージ)
【売上日報】
商品A: 100円
6. mnemonic-name(呼び名)による高度な制御
現場によっては、数字だけでなく特別な「呼び名」を使って改行や改ページを制御することがあります。これをmnemonic-name(ニモニック・ネーム)と呼びます。これは、コンピュータごとに異なる特殊な動作(例えば、紙を一番上まで戻す、など)に自分なりの名前を付けて呼び出す方法です。
例えば、環境部(ENVIRONMENT DIVISION)であらかじめ「TOP-OF-PAGE」という名前を定義しておき、BEFORE ADVANCING TOP-OF-PAGEと使うことができます。パソコンのキーボードで特定のショートカットキーを押すようなものだと考えてください。これを使えば、より複雑な専用プリンターの制御も可能になりますが、まずは基本の数字や「PAGE」を覚えるだけで十分です。
7. 初心者が間違えやすいポイントと注意点
BEFORE ADVANCINGを使う時に最も注意しなければならないのは、「AFTER ADVANCINGと混ぜて使わない」というルールです。一つのプログラムの中で、ある行はBEFORE、ある行はAFTERとバラバラに使うと、紙の送り方が複雑になり、文字が重なって印刷されたり、逆に意図しない空白が何行もできてしまったりするトラブルの原因になります。
特にプログラミング未経験の方は、どちらか一方(多くの現場ではAFTERが主流ですが、歴史あるシステムではBEFOREも使われます)に統一して書く練習をしましょう。また、改ページをした後は、必ず今が何行目なのかを数えるカウンターをリセットするのも忘れないようにしてください。こうした小さな積み重ねが、バグ(プログラムの間違い)のない綺麗なシステムを作ること繋がります。
8. 改行制御を使いこなすためのステップ
最後に、改行制御をマスターするためのコツをお伝えします。それは、常に「自分が手書きで書類を作るとしたらどう動くか」をイメージすることです。COBOLは非常に人間味のある言語で、一つ一つの命令が事務作業の動作に基づいています。
最初は BEFORE ADVANCING 1 LINE を使って、画面やファイルに正しく一行ずつ出力されるかを確認するだけで大丈夫です。慣れてきたら、2行あけたり、ページを切り替えたりと、少しずつ装飾を増やしていきましょう。帳票出力は、自分が書いたプログラムの結果が目に見える形(書類)として現れるので、とてもやりがいのある分野です。今回学んだ「文字を書く前の行送り」を武器に、誰にとっても読みやすい素晴らしい帳票を作り上げてくださいね!