COBOLの帳票出力を徹底解説!LINE SEQUENTIALファイルで報告書作成
生徒
「COBOLで計算した結果を、画面に表示するだけでなく、メモ帳などのテキストファイルに保存して印刷できるようにしたいです!」
先生
「それには『LINE SEQUENTIAL(ライン・シーケンシャル)』という書き出し方を使うのが一番ですよ。」
生徒
「ライン・シーケンシャル……少し難しそうな名前ですね。普通のファイル保存と何が違うんですか?」
先生
「実は私たちが普段使っているテキストファイルと同じ形式のことなんです。一列ずつ順番に書き込んでいく、帳票作成の基本になります。実際のプログラム例を見ながら学んでいきましょう!」
1. LINE SEQUENTIALファイルとは?
COBOL(コボル)というプログラミング言語は、大量のデータを処理して「請求書」や「売上報告書」といった帳票(ちょうひょう)を作るのが得意な言語です。この帳票を、パソコンのメモ帳などで開ける形式で保存する方法がLINE SEQUENTIAL(行順次ファイル)です。
「SEQUENTIAL(シーケンシャル)」とは「順番に」という意味です。つまり、データの1行目、2行目、3行目……と順番に、まるでノートに一行ずつ文字を書いていくようにファイルへ書き込んでいく仕組みのことです。この形式で出力されたファイルは、Windowsのメモ帳やWordなどで開いて中身を確認したり、そのままプリンターで印刷したりすることができるため、事務処理の現場では非常によく使われます。
2. ファイルを出力するための準備:SELECTとASSIGN
COBOLでファイルを扱うときは、まずプログラムの冒頭で「これからファイルを使いますよ」という宣言をする必要があります。これをINPUT-OUTPUT SECTION(入出力節)と呼びます。ここで重要になるのが「SELECT句」と「ASSIGN句」です。
例えるなら、SELECTは「プログラムの中でのニックネーム」を決めることで、ASSIGNは「実際のパソコン上のファイル名」を紐付ける作業です。例えば、プログラムの中では「REPORT-FILE」という名前で呼び、実際には「SEIKYU.TXT」という名前で保存する、といった橋渡しをここで行います。ここで「ORGANIZATION IS LINE SEQUENTIAL」と書くことで、テキスト形式での保存が決定します。
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT REPORT-FILE ASSIGN TO "OUTPUT.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
3. データの入れ物を定義する:FDとレコード
次に、ファイルに書き込む「1行分の長さ」や「中身の構成」を決めます。これをDATA DIVISION(データ部)のFILE SECTION(ファイル節)に記述します。ここで使うのが「FD(File Description:ファイル記述項)」です。
例えば、1行が80文字の帳票を作りたい場合は、その中身が「名前20文字」「金額10文字」「空白50文字」といった具合に、細かく部屋割りを決めておきます。この「1行分のデータの固まり」のことをプログラミング用語でレコードと呼びます。帳票作成では、このレコードをきれいに整えることが、美しい報告書を作る第一歩になります。
DATA DIVISION.
FILE SECTION.
FD REPORT-FILE.
01 REPORT-RECORD.
05 CUSTOMER-NAME PIC X(20).
05 FILLER PIC X(05).
05 SALES-AMOUNT PIC ZZZ,ZZ9.
05 FILLER PIC X(48).
4. ファイルを開いて、書き込んで、閉じる手順
実際にファイルを扱うときの手順は、現実世界で「ノートに日記を書く」ときと同じです。まず「ノートを開く(OPEN)」、次に「文字を書く(WRITE)」、最後に「ノートを閉じる(CLOSE)」という3つのステップを踏みます。
COBOLでは「OPEN OUTPUT ファイル名」という命令で、書き込み専用としてファイルを開きます。もし指定したファイルがなければ新しく作られ、すでにある場合は中身が空っぽにリセットされて上書きされます。書き込みが終わったら必ず「CLOSE ファイル名」を忘れないようにしましょう。これを忘れると、せっかく書き込んだデータが保存されずに消えてしまうことがあるため、非常に重要なルールです。
5. 帳票出力の具体的なプログラム例
それでは、実際に「名前」と「売上金額」をテキストファイルに出力するシンプルなプログラム全体像を見てみましょう。ここでは、計算した結果を先ほど学んだレコード(1行分の入れ物)に「MOVE」という命令で移してから、ファイルに書き出しています。
プログラミング未経験の方は、「MOVE」はコピー、「WRITE」はファイルへの保存、と覚えると分かりやすいでしょう。このプログラムを実行すると、パソコンの中に「REPORT.TXT」という名前のファイルが出来上がります。
IDENTIFICATION DIVISION.
PROGRAM-ID. SALES-OUT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUT-F ASSIGN TO "REPORT.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OUT-F.
01 OUT-REC.
05 OUT-NAME PIC X(20).
05 FILLER PIC X(02).
05 OUT-AMT PIC ZZZ,ZZ9.
WORKING-STORAGE SECTION.
01 W-NAME PIC X(20) VALUE "田中 太郎".
01 W-AMT PIC 9(06) VALUE 125000.
PROCEDURE DIVISION.
OPEN OUTPUT OUT-F.
MOVE W-NAME TO OUT-NAME.
MOVE W-AMT TO OUT-AMT.
WRITE OUT-REC.
CLOSE OUT-F.
DISPLAY "ファイル出力が完了しました。".
STOP RUN.
(REPORT.TXTの中身)
田中 太郎 125,000
6. 見やすい帳票にするための工夫:ヘッダーと明細
実際のビジネス現場では、単にデータを並べるだけでなく、一番上に「売上報告書」というタイトルや、「日付」「項目名」などを印刷することが求められます。これらを見出し(ヘッダー)と呼びます。
ヘッダーを出力するには、データを出力する「WRITE」命令の前に、あらかじめ用意しておいた見出し用の文字列をファイルに書き込みます。また、たくさんのデータがある場合は、ループ処理(繰り返し)を使って、1件ずつ順番に「MOVE」と「WRITE」を繰り返していきます。こうすることで、何百件、何千件という大量のデータを、整然としたリスト形式でファイルに書き出すことができるのです。
7. 初心者が注意すべきエラー:ファイルパスと権限
プログラムがうまく動かないときに、特に初心者がハマりやすいポイントがあります。それは「ファイルがどこに保存されるか」と「書き込み禁止になっていないか」です。ASSIGN句でファイル名だけを書いた場合、通常はそのプログラムを実行している場所と同じフォルダにファイルが作られます。
また、もし出力しようとしているファイルが別のソフト(Excelやメモ帳など)ですでに開かれていると、COBOLのプログラムが「誰かが使っているから書き込めないよ!」とエラーを出して止まってしまいます。これをファイルロックと呼びます。実行する前には、同じ名前のファイルを閉じておくという習慣をつけましょう。パソコンの操作に慣れていない方は、まずこの「ファイルの場所」と「ソフトを閉じる」ことを意識してみてください。
8. 複数の行を書き出す繰り返し処理
最後に、より実践的な「複数のデータを一行ずつ書き出す」流れを確認しましょう。現実の仕事では、売上データは1つだけではありませんよね。例えば3人分のデータを書き出すときは、「MOVEしてWRITE」という作業を3回繰り返します。この「同じ作業を繰り返す」ことはコンピュータが最も得意とする分野です。
COBOLでは「PERFORM(パフォーム)」という命令を使って、決まった回数だけ処理を繰り返すことができます。一行書き出すたびに、ファイルの中では自動的に「改行(次の行へ移動)」が行われるのが、このLINE SEQUENTIALの最大の特徴です。まるでタイプライターが一行打つたびにガチャンと改行するように、自動で綺麗なリストが出来上がっていくのです。
PROCEDURE DIVISION.
OPEN OUTPUT OUT-F.
* 1行目の書き出し
MOVE "佐藤 花子" TO OUT-NAME
MOVE 50000 TO OUT-AMT
WRITE OUT-REC
* 2行目の書き出し
MOVE "鈴木 一郎" TO OUT-NAME
MOVE 75000 TO OUT-AMT
WRITE OUT-REC
CLOSE OUT-F.
(出力されたファイルの中身)
佐藤 花子 50,000
鈴木 一郎 75,000