COBOLの帳票出力と編集を完全攻略!列揃えと桁位置調整のプロ技解説
生徒
「COBOLで請求書みたいな印刷物を作りたいんですけど、数字がガタガタになって綺麗に並びません!」
先生
「それは『帳票出力(ちょうひょうしゅつりょく)』の基本である列揃えと桁位置調整が必要ですね。COBOLは事務処理が得意な言語なので、専用のテクニックがあるんですよ。」
生徒
「難しそうですね。どうすれば銀行の通帳みたいに数字の桁を綺麗に揃えられるんですか?」
先生
「『編集記号(へんしゅうきごう)』という魔法を使います。それでは、基本的な使い方を見ていきましょう!」
1. 帳票出力とは?事務処理の要を理解する
まず「帳票(ちょうひょう)」という言葉ですが、これはビジネスの世界で使われる「書類」のことです。例えば、皆さんの家へ届く電気料金の通知書、スーパーでもらうレシート、会社で発行する請求書や給与明細などはすべて帳票の一種です。COBOLは、こうした大量のデータを紙に印刷したり、PDFとして出力したりするプログラムを作るのが非常に得意です。
プログラミング未経験の方が最初につまずくのは、画面に文字を出すことと、紙の上に「整列させて」出すことの違いです。コンピュータは指示がない限り、文字を左から詰めて並べてしまいます。これでは「100円」と「10,000円」を縦に並べたときに、桁がズレて非常に見づらくなってしまいます。これを解消するのが列揃え(れつぞろえ)と桁位置調整(けたいちちょうせい)の技術です。
2. 列揃えの基本:横の位置を指定する考え方
帳票を作るとき、まず考えなければいけないのが「どの項目をどの横位置に配置するか」です。COBOLではこれを、データを入れる箱(項目)の定義で行います。例えば、「商品名」は左から10文字目から書き始め、「金額」は50文字目から書き始める、といった設計図を最初に作ります。
これを実現するために、COBOLでは「レコード定義(れこーどていぎ)」というものを使います。レコードとは、一行分のデータの集まりのことです。この一行の中に、中身のない「空白」を意図的に作ることで、項目と項目の間を空け、列を揃えることができます。この空白を作るための便利な合言葉がFILLER(ふぃらー)です。詰め物という意味ですね。
3. 編集項目とPICTURE句の魔法
桁位置を揃えるための最も強力な武器が、編集項目(へんしゅうこうもく)です。COBOLではデータの種類や桁数をPICTURE句(ぴくちゃーく)というもので指定しますが、帳票用には特別な記号が用意されています。
例えば、数字の前に¥マークを付けたり、3桁ごとにカンマを入れたりするのは、人間がプログラムで一文字ずつ計算して入れるのではありません。「ここにカンマを入れてね」という予約記号をデータ定義の中に書いておくだけで、COBOLが自動的に見た目を整えてくれます。これを編集機能と呼びます。未経験の方でも、Excelの「セルの書式設定」のようなものだと思えば理解しやすいはずです。
4. 数字を右詰めで揃える「Z」記号のテクニック
事務用の書類で最も大切なのが「ゼロサプレス」という技術です。例えば、最大6桁の金額欄に「500円」を表示させるとき、普通に表示させると「000500」となってしまいます。これを「 500」のように、先頭の余計なゼロを空白に変えることをゼロサプレスと言います。
COBOLでは、数字を表す「9」の代わりに、ゼロサプレスを意味する「Z」という記号を使います。これを使うことで、自動的に右側に数字が寄り、桁数が違う数字を縦に並べても、下一桁がピシッと揃うようになります。見た目が美しくなるだけでなく、桁の読み間違いという致命的なミスを防ぐことができるのです。
WORKING-STORAGE SECTION.
01 WS-KINGAKU PIC 9(06) VALUE 1234.
01 WS-DISPLAY-AREA PIC ZZZ,ZZ9.
PROCEDURE DIVISION.
MOVE WS-KINGAKU TO WS-DISPLAY-AREA.
DISPLAY WS-DISPLAY-AREA.
実行結果は以下のようになります。先頭の「00」が消えて、見やすい形式になっていますね。
1,234
5. 通貨記号とカンマの挿入で読みやすさを追求
帳票には欠かせない¥マークやカンマ。これも列揃えの一部です。¥マークには、数字の直前にピッタリくっつく「浮動挿入(ふどうそうにゅう)」という出し方があります。もし数字が3桁なら3桁の直前に、5桁なら5桁の直前にマークが出ます。これにより、金額の改ざんを防ぐというセキュリティ上のメリットもあります。
カンマ(,)については、PICTURE句の中に書くだけで、もし数字がその桁に届いていなければカンマも自動的に表示しないという賢い動きをしてくれます。こうした細かい制御が定義だけで完結するため、COBOLのプログラムは非常に短く、かつ正確に帳票の見た目を作ることができるのです。
6. 小数点と符号の調整:正しい数値を伝える
科学計算や海外の通貨を扱う帳票では、小数点の位置を揃えることも重要です。ピリオド(.)記号を使うことで、小数点の位置を固定した列揃えが可能になります。また、マイナス(負の数)の場合に「-」や「△」を表示させる位置も調整できます。
初心者のうちは、数字の計算と「見た目の編集」を別々に考えるのがコツです。まず計算用の変数(箱)で正しく計算を行い、最後に帳票出力用の編集項目へ「MOVE(代入)」します。このMOVEの瞬間に、COBOLが裏側で列を揃え、記号を付け、綺麗に整形してくれるのです。この「移動するだけで整形される」仕組みがCOBOLの真髄です。
01 DATA-LIST.
03 ITEM-NAME PIC X(20).
03 FILLER PIC X(05).
03 PRICE PIC ZZZ,ZZ9.
03 FILLER PIC X(05).
03 TAX PIC ZZZ,ZZ9.
このように定義すれば、項目同士が常に5文字分空き、綺麗な表形式が維持されます。
7. 印字行の組み立てとヘッダー・フッター
帳票はデータだけではありません。一番上の「タイトル(ヘッダー)」や一番下の「ページ番号(フッター)」も列を揃えて配置する必要があります。ページ全体の幅(例えば80文字や132文字)を一つの大きな定規と考え、タイトルを中央に配置したり、日付を右端に配置したりします。
具体的には、ページ全体の幅を持つレコードを定義し、そこに各項目を一つずつ配置していきます。この時も、先ほどの「FILLER」や、文字を右に寄せる命令などを駆使します。一行一行、パズルのピースをはめていくような感覚で組み立てていくのが、COBOLプログラマの腕の見せ所です。
8. 実際に桁を揃えてみよう:実演コード
では、異なる桁数の数字を綺麗に縦に並べる例をコードで見てみましょう。商品名と金額を表示するシミュレーションです。未経験の方も、プログラムの「PROCEDURE(手続き)」部分で、MOVE命令を繰り返している点に注目してください。MOVEするたびに、PICTURE句の設定に沿ってデータが整形されます。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 LINE-FORMAT.
05 PRT-NAME PIC X(10).
05 FILLER PIC X(02) VALUE SPACE.
05 PRT-PRICE PIC ZZZ,ZZ9.
PROCEDURE DIVISION.
* 商品Aの表示
MOVE "RINGO" TO PRT-NAME.
MOVE 150 TO PRT-PRICE.
DISPLAY LINE-FORMAT.
* 商品Bの表示
MOVE "MELON" TO PRT-NAME.
MOVE 12500 TO PRT-PRICE.
DISPLAY LINE-FORMAT.
STOP RUN.
このプログラムを実行すると、以下の結果が得られます。金額の下一桁がしっかり揃っているのが分かりますね。
RINGO 150
MELON 12,500
9. 注意点:全角文字と半角文字のズレ
最後に、列揃えで最も注意すべき「文字幅」の話をします。日本語(全角文字)と英数字(半角文字)では、コンピュータの中での幅が違います。一般的に全角文字は半角文字の2倍の幅を取りますが、COBOLの定義で「PIC X(10)」とした場合、半角なら10文字ですが全角なら5文字分しか入りません。
帳票の列がガタガタになる原因の多くは、この全角・半角の計算ミスです。設計図を作る段階で、日本語を使う場所は2倍の文字数をカウントするように意識しましょう。この「文字数=バイト数」という考え方をマスターすれば、どんな複雑な帳票でも、定規で引いたように真っ直ぐな列揃えができるようになります。