【初心者向け】COBOL帳票設計の基本を徹底解説

2025年4月13日日曜日

COBOL

COBOL 帳票設計 実務、このキーワードで検索してたどり着いたあなたは、きっと「COBOLで帳票作るって、どうやるの?」「実務で使える帳票設計スキルを身につけたい!」そんな風に思っているはず。

COBOLの帳票設計って、なんだか古臭くて難しそう…なんてイメージがあるかもしれませんね。でも大丈夫! 実は、基本の流れとコツさえ掴めば、誰でも実務でバッチリ使える帳票が作れるようになるんです。

この記事では、COBOLの帳票設計をこれから始める、もしくは始めたばかりのあなたに向けて、帳票設計のイロハから、実際のプログラミング、現場で役立つ注意点まで解説していきます。

この記事で学べること

  • COBOLにおける帳票設計の基本と考え方
  • 実務での帳票設計の具体的なステップ
  • 帳票出力に必要なCOBOLプログラムの書き方
  • 実践的なサンプルコードとその解説
  • 帳票設計で失敗しないための注意点やコツ

さあ、肩の力を抜いて、一緒にCOBOL帳票設計の世界を探検してみましょう!

COBOL帳票設計とは?実務で理解すべき基本

まず、「帳票(ちょうひょう)」って何?というところから始めましょう。

帳票とは、簡単に言うと、お仕事で使う色々な書類のことです。請求書、納品書、売上レポート、給与明細… これらは全部、帳票の一種なんですよ。

特にCOBOLが活躍するような、会社の基幹システム(会社の心臓部みたいなシステム)では、お金の計算結果や取引の記録など、間違いが許されない情報を正確に紙やデータで出力するために、帳票がめちゃくちゃ使われています。

なぜ帳票設計がそんなに大事かというと、帳票は会社の業務そのものを映し出す鏡だからです。見やすい帳票は仕事の効率を上げますし、逆に分かりにくい帳票はミスを誘発しかねません。

だから、COBOLプログラマーにとって、正確で見やすい帳票を設計するスキルは、実務でとっても重宝されるスキルなんです。

実務の第一歩!COBOL帳票設計の基本的な流れ

じゃあ、実際に帳票ってどうやって作っていくんでしょうか?

いきなりパソコンに向かってカタカタ始めるわけじゃありません。実務では、だいたいこんな流れで進めていきます。

  1. 要件定義 → どんな帳票が必要なのか? をしっかり決める。
  2. レイアウト設計 → 帳票の見た目、デザインを決める。
  3. プログラム設計 → どうやってCOBOLで帳票を作るか、処理の流れを考える。
  4. 実装(コーディング)  実際にCOBOLプログラムを書く。
  5. テスト → 作った帳票が正しいか、念入りにチェックする。

この流れを意識するだけで、手戻りが少なく、スムーズに開発を進められます。
(ここに帳票設計の基本的な流れを示す簡単なフロー図を入れると、より分かりやすくなります)

【要件定義】出力項目と帳票の目的を明確に

最初のステップ、要件定義。これは、帳票設計の土台作りです。

「誰が」「何のために」「どんな情報が載った」帳票を見たいのか? を、使う人(ユーザーさん)によーく聞くことから始まります。

例えば、売上レポートを作るなら、

  • 期間はいつからいつまで?
  • どの商品の売上? 店舗ごと?
  • 合計金額は出す? 消費税は?
  • どんな順番で並べる?

…みたいに、帳票に載せるべき情報(出力項目)や、計算の方法、表示のルールなどを、具体的かつ正確に決めていきます。

ここで曖昧な点を残してしまうと、後で「あれ?これじゃなかった…」なんてことになりがち。しっかりコミュニケーションを取って、認識を合わせておくのが肝心ですよ。

【レイアウト設計】見やすさと正確性を両立する

要件が決まったら、次は帳票の見た目、レイアウトをデザインします。

方眼紙やExcel、専用のツールなどを使って、どこに、何を、どんな風に印刷するかを決めていく作業です。

考えるポイントはこんな感じ。

  • 項目名 → 何の情報かパッと見て分かるように。
  • 印字位置と桁数 → 数字は右寄せ、文字は左寄せが基本。桁あふれしないように余裕を持って。
  • 罫線 → 見やすくするために線を引く。
  • ヘッダーとフッター → ページ番号やタイトル、日付などを各ページに入れる。
  • 改ページ → どこで次のページに移るか。キリの良いところで改ページしたいですよね。

このレイアウト設計書が、後のプログラミングの「設計図」になります。 

細かいところまでしっかり決めておくと、コーディングがぐっと楽になりますよ。
(簡単な帳票レイアウト設計書の例を図で示すとイメージが湧きやすいです)

COBOLでの帳票プログラム作成:基本構文を理解する

さあ、いよいよCOBOLプログラミングの話に入っていきましょう!

帳票を出力するためには、COBOLのいくつかの「お決まりの書き方」を知っておく必要があります。

ここでは、帳票出力に最低限必要な、特に使う構文をピックアップして紹介しますね。

  • ENVIRONMENT DIVISIONSELECT句: 使うファイル(帳票ファイル)をプログラムに教える。
  • DATA DIVISIONFD句: 帳票ファイルの詳しい情報(レコードの長さとか)を定義する。
  • PROCEDURE DIVISIONOPEN文: 帳票ファイルを使えるように開く。
  • PROCEDURE DIVISIONWRITE文: 実際に帳票にデータを書き込む。
  • PROCEDURE DIVISIONCLOSE文: 使い終わった帳票ファイルを閉じる。

これらの構文が、帳票プログラムの骨組みになります。まずは「ふーん、こんなのがあるんだ」くらいでOKです!

【ファイル定義(FD句)】帳票ファイルの仕様を決める

FD句(ファイル記述項)は、帳票ファイルのプロフィールを書くところ、みたいなイメージです。

ここで、帳票ファイルの名前、1行あたりの文字数(レコード長)、プリンター制御文字を使うかどうかなどを定義します。

例えば、こんな感じ。

DATA DIVISION.
FILE SECTION.
FD  PRINT-FILE
    RECORD CONTAINS 132 CHARACTERS
    LABEL RECORDS ARE OMITTED
    LINAGE IS 60 LINES AT TOP 3 AT BOTTOM 3.
01  PRINT-REC       PIC X(132).

簡単に説明すると、

  • FD PRINT-FILE → PRINT-FILE という名前のファイルを定義しますよ、という意味。
  • RECORD CONTAINS 132 CHARACTERS → 1行は132文字ですよ、という意味。この桁数はレイアウト設計と一致させる必要があります。
  • LABEL RECORDS ARE OMITTED → ファイルの先頭や末尾に特別な管理情報(ラベルレコード)は無いですよ、という意味。帳票ファイルではだいたいコレ。
  • LINAGE IS 60 LINES ... → 1ページあたりの行数や余白を指定する場合に使います(省略可能)。
  • 01 PRINT-REC PIC X(132) → 実際にデータを書き込むための領域(レコード)を定義。ここでは132文字分の領域を確保しています。

最初は難しく感じるかもしれませんが、だいたい決まった書き方があるので、慣れてしまえば大丈夫です!

【WRITE文と改ページ制御】データを書き込み、紙面を制御する

データを帳票に書き込む主役が WRITE文です。

FD句で定義したレコード領域(上の例だと `PRINT-REC`)に書き込みたいデータをセットして、WRITE文を実行すると、その内容が帳票ファイルに出力されます。

MOVE 'これはテストです。' TO PRINT-REC.
WRITE PRINT-REC.

ただ書き込むだけじゃなく、改行や改ページもコントロールしたいですよね。
そこで使うのが BEFORE/AFTER ADVANCING句です。

  • WRITE PRINT-REC AFTER ADVANCING 1 LINE.: 1行改行してからデータを書き込む。
  • WRITE PRINT-REC AFTER ADVANCING PAGE.: 改ページしてからデータを書き込む。
  • WRITE PRINT-REC BEFORE ADVANCING 1 LINE.: データを書き込んでから1行改行する。

この`ADVANCING`句を使いこなすことが、キレイな帳票を作るためのキモになります。

実務では、印刷した行数をカウントしておいて、一定の行数(例えば50行)を超えたら、ヘッダー(タイトル行とか)を印刷して `AFTER ADVANCING PAGE` で改ページする、といった処理をよく書きます。

実践!COBOL帳票設計のサンプルプログラムと解説

理屈だけだとピンとこないかもしれないので、簡単なサンプルプログラムを見てみましょう!
ここでは、シンプルな商品一覧リストを出力するプログラムを例にします。

(※注意:これはあくまで簡単な例です。エラー処理などは省略しています)

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLELIST.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT PRINT-FILE ASSIGN TO 'SYSOUT'.  *> 出力先を指定
DATA DIVISION.
FILE SECTION.
FD  PRINT-FILE
    RECORD CONTAINS 80 CHARACTERS
    LABEL RECORDS ARE OMITTED.
01  PRINT-REC       PIC X(80).

WORKING-STORAGE SECTION.
01  WORK-AREA.
    05 W-LINE-COUNT  PIC 9(02) VALUE 0.   *> 行数カウンター
    05 W-PAGE-COUNT  PIC 9(02) VALUE 0.   *> ページカウンター
    05 W-MAX-LINES   PIC 9(02) VALUE 5.    *> 1ページの最大行数(例として小さく設定)
01  I                PIC 9(02) VALUE 0.    *> ループ用インデックス(DUMMY-DATA処理用)

01  HEADER-LINE.
    05 FILLER        PIC X(30) VALUE '商品リスト'.
    05 FILLER        PIC X(40) VALUE SPACES.
    05 FILLER        PIC X(05) VALUE 'PAGE:'.
    05 H-PAGE-NO     PIC Z9.
    05 FILLER        PIC X(03) VALUE SPACES.

01  DETAIL-LINE.
    05 D-CODE        PIC X(05).
    05 FILLER        PIC X(05) VALUE SPACES.
    05 D-NAME        PIC X(20).
    05 FILLER        PIC X(45) VALUE SPACES.

*> ダミーデータ (本来はファイルなどから読み込む)
01  DUMMY-DATA OCCURS 10 TIMES.
    05 DUMMY-CODE    PIC X(05).
    05 DUMMY-NAME    PIC X(20).

PROCEDURE DIVISION.
MAIN-PROC.
    *> 初期データ設定 (ダミー)
    MOVE 'A0001' TO DUMMY-CODE(1). MOVE 'りんご'   TO DUMMY-NAME(1).
    MOVE 'A0002' TO DUMMY-CODE(2). MOVE 'みかん'   TO DUMMY-NAME(2).
    MOVE 'B0011' TO DUMMY-CODE(3). MOVE 'バナナ'   TO DUMMY-NAME(3).
    MOVE 'C0101' TO DUMMY-CODE(4). MOVE 'ぶどう'   TO DUMMY-NAME(4).
    MOVE 'A0005' TO DUMMY-CODE(5). MOVE 'いちご'   TO DUMMY-NAME(5).
    MOVE 'D2001' TO DUMMY-CODE(6). MOVE 'メロン'   TO DUMMY-NAME(6).
    MOVE 'E0001' TO DUMMY-CODE(7). MOVE 'すいか'   TO DUMMY-NAME(7).

    OPEN OUTPUT PRINT-FILE.

    *> ヘッダー印刷処理の呼び出し
    PERFORM HEADER-PRINT.

    *> データ処理ループ (ダミーデータを順に処理)
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 7
        *> 行数チェックと改ページ処理
        IF W-LINE-COUNT >= W-MAX-LINES THEN
            PERFORM HEADER-PRINT
        END-IF

        *> 明細行編集
        MOVE DUMMY-CODE(I) TO D-CODE
        MOVE DUMMY-NAME(I) TO D-NAME

        *> 明細行印刷 (1行空けて印刷)
        WRITE PRINT-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES
        ADD 1 TO W-LINE-COUNT
    END-PERFORM.

    CLOSE PRINT-FILE.
    STOP RUN.

*>----------------------------------
*> ヘッダー印刷処理
*>----------------------------------
HEADER-PRINT.
    ADD 1 TO W-PAGE-COUNT.
    MOVE W-PAGE-COUNT TO H-PAGE-NO.
    WRITE PRINT-REC FROM HEADER-LINE AFTER ADVANCING PAGE. *> 改ページしてヘッダー印刷
    MOVE SPACES TO PRINT-REC.             *> 空行を印刷 (ヘッダー後のスペース)
    WRITE PRINT-REC AFTER ADVANCING 1 LINE.
    MOVE 0 TO W-LINE-COUNT.              *> 行数カウンターリセット
.

【実行結果イメージ】

商品リスト                                                PAGE:  1

A0001     りんご
A0002     みかん
B0011     バナナ
C0101     ぶどう
A0005     いちご

商品リスト                                                PAGE:  2

D2001     メロン
E0001     すいか

(※1ページ5行で改ページする設定なので、上記のような出力になります)

サンプルコードのポイント解説

今のサンプルコード、ちょっと長かったですが、ポイントを絞って見ていきましょう。

  • `WORKING-STORAGE SECTION`
    • プログラムの中で使う変数(行数カウンター`W-LINE-COUNT`やページ番号`W-PAGE-COUNT`など)や、帳票の各行のレイアウト(`HEADER-LINE`, `DETAIL-LINE`)を定義しています。実際のデータ(ここでは`DUMMY-DATA`)も定義していますね。
  • `MAIN-PROC`
    • ここがメインの処理です。
      1. まず`OPEN OUTPUT PRINT-FILE.`で帳票ファイルを使える状態にします。
      2. `PERFORM HEADER-PRINT.`で最初のヘッダー(タイトル行とページ番号)を印刷します。`PERFORM`は別の処理(ここでは`HEADER-PRINT`)を呼び出す命令です。
      3. `PERFORM VARYING...` でデータの数だけループ処理をします。
      4. ループの中で、まず`IF W-LINE-COUNT >= W-MAX-LINES THEN...` で行数カウンターをチェック。もし最大行数に達していたら、再び`PERFORM HEADER-PRINT.`でヘッダーを印刷(改ページもここで行われます)。
      5. 次に、`MOVE`命令で`DUMMY-DATA`の内容を明細行のレイアウト`DETAIL-LINE`にセットします。
      6. `WRITE PRINT-REC FROM DETAIL-LINE...`で明細行を印刷し、`ADD 1 TO W-LINE-COUNT.`で行数カウンターを増やします。
      7. ループが終わったら、`CLOSE PRINT-FILE.`でファイルを閉じ、`STOP RUN.`でプログラムを終了します。
  • `HEADER-PRINT`
    • ヘッダー印刷専門の処理です。ページ番号を増やして、`AFTER ADVANCING PAGE` で改ページし、ヘッダー行を印刷。その後、行数カウンターを0にリセットしています。

どうでしょう? なんとなく処理の流れ、掴めましたか?

実際の帳票プログラムも、基本的にはこの「ヘッダー印刷」「明細印刷」「改ページ制御」の組み合わせでできています。

実務でハマらない!COBOL帳票設計の注意点とデバッグ

基本が分かったところで、実務で「うわっ!」とならないための注意点もいくつか押さえておきましょう。これを知っているだけで、トラブルを未然に防げますよ。

  • 桁あふれ
    • 数字項目は特に注意! 計算結果が用意した桁数を超えると、数字が切れちゃったり、エラーになったりします。最大値がどのくらいになるか、事前にしっかり見積もっておくのが大事。`PIC S9(5)V99`みたいに、桁数(`5`)と小数点以下の桁数(`2`)、符号(`S`)をしっかり定義しましょう。
  • 印字ズレ
    • レイアウト設計通りに印刷されないこと、あります。スペースの数え間違いとか、全角・半角の混在とかが原因になりがち。設計書とプログラムをよーく見比べてチェック!
  • 意図しない改ページ
    • 行数カウンターの管理ミスや、`ADVANCING`句の使い間違いで、変なところで改ページしちゃうことも。デバッグでカウンターの動きをしっかり追いましょう。
  • 集計項目の計算ミス
    • 合計や平均などを出す場合、計算タイミングや対象データを間違えると、帳票の信頼性がガタ落ちに。どのタイミングで、どの項目の合計を取るのか、ロジックを明確にしておく必要があります。
  • 文字コードの問題
    • 特に会社名や人名で使う「外字」(普通のパソコンでは出ない特殊な漢字)は要注意。システム環境によって文字化けすることがあります。事前にテストしておくのが吉。
  • テストデータの準備
    • 「正常なデータ」だけでなく、「異常なデータ(桁あふれしそうなデータ、0件データなど)」や「境界値データ(最大行数ピッタリのデータなど)」を用意してテストすることで、プログラムの弱点を見つけられます。
  • デバッグの基本
    • まずは怪しい箇所の変数の値を`DISPLAY`文で表示させて、動きを追うのが基本。焦らず、一つ一つ確認していくのが近道です。

失敗は誰にでもあります。でも、これらのポイントを頭に入れておけば、きっと乗り越えられます!

【まとめ】COBOL帳票設計の実務スキルを武器にする

お疲れ様でした! COBOLの帳票設計について、基本から実務での注意点まで、駆け足で見てきました。

ポイントをまとめると…

  • 帳票はCOBOLシステムで超使われる、大事な出力物!
  • 設計は「要件定義」→「レイアウト設計」→「プログラム設計」→「実装」→「テスト」の流れで進めるのが吉。
  • COBOLでは`FD`句でファイルを定義し、`WRITE`文と`ADVANCING`句で出力と改ページを制御する。
  • 行数カウンターを使った改ページ処理がキモ。
  • 桁あふれや印字ズレなどの「あるある」な失敗に注意して、しっかりテストする。

最初は覚えることが多くて大変かもしれませんが、今回学んだことを意識しながら、まずは簡単な帳票から実際に作ってみるのが一番の上達法です。

実際に手を動かしてみると、「あ、なるほど!」と腑に落ちる瞬間がきっと訪れますよ。

COBOLの帳票設計スキルは、今でも多くの現場で求められています。自信を持って、あなたの武器にしてくださいね! 応援しています!

【関連記事】

>> 今さら聞けない「COBOLとは?」

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ