[COBOLのはじめ方] Part23: 簡易マスタ検索プログラムの作成

COBOL

はじめに

お疲れ様です!😊 いよいよミニプロジェクトのステップに入りましたね。ここでは、これまでの学習で身につけた知識を総動員して、より実践的なプログラムを作成していきます。

今回のテーマは「簡易マスタ検索プログラムの作成」です。これは、多くの業務システムで基本となる処理の一つです。ファイルから特定の情報を探し出す、というシンプルな動作ですが、COBOLのファイル処理や制御構文、データ定義の理解を深める絶好の機会となります。

このプロジェクトを通して、以下のスキルを実践的に活用します。

  • ファイル定義(FD句)とレコードレイアウトの設計
  • ファイルのOPEN、READ、CLOSE処理
  • ACCEPT文によるユーザー入力の受け付け
  • DISPLAY文による結果表示
  • IF文を使った条件分岐による検索ロジックの実装
  • PERFORM文による繰り返し処理
  • ファイル終端(AT END)の処理

さあ、一緒に頑張りましょう!💪

マスタファイルとは?

まず、「マスタファイル」について簡単に説明します。マスタファイルとは、業務を行う上で基本となる情報をまとめたファイルのことです。例えば、以下のようなものがあります。

  • 商品マスタ: 商品コード、商品名、単価などの情報
  • 顧客マスタ: 顧客コード、氏名、住所、電話番号などの情報
  • 社員マスタ: 社員番号、氏名、所属部署などの情報

これらのマスタファイルは、日々の取引データ(トランザクションデータ)と連携して、様々な処理(売上集計、請求書発行など)に使われます。

今回は、簡単な「商品マスタ」を例に、検索プログラムを作成します。商品コードを入力すると、対応する商品名と単価を表示するプログラムを目指しましょう。

今回使用するマスタファイルの構造

今回は、以下のような構造を持つシーケンシャルファイル(`PRODUCT.MST` というファイル名とします)を使用します。1行が1つの商品データを表します。

桁数 (Bytes) 項目名 内容 データ型 (PIC句)
5 商品コード 商品を一意に識別するコード PIC X(5)
20 商品名 商品の名前 PIC X(20)
8 単価 商品の単価(整数) PIC 9(8)

PRODUCT.MST (例):

P0001リンゴ             00000150
P0002ミカン             00000080
P0003バナナ             00000100
S0001エンピツ           00000050
S0002ノート             00000120

※ 商品名は日本語を想定していますが、環境によっては文字化けする可能性があるため、ここでは半角英数カナで表現しています。実際の環境に合わせて調整してください。 ※ 単価は8桁の数字で、ゼロ埋めされています。

プログラムの設計

作成するプログラム(`MSTSRCH1.COB`)の処理フローは以下のようになります。

  1. プログラム開始
  2. 商品マスタファイル(`PRODUCT.MST`)を入力モードで開く (OPEN INPUT)
  3. ユーザーに検索したい商品コードの入力を促すメッセージを表示 (DISPLAY)
  4. ユーザーからの商品コード入力を受け付ける (ACCEPT)
  5. ファイルから1レコードずつ読み込む処理を繰り返す (PERFORM UNTIL)
    • ファイルから1レコード読み込む (READ)
    • ファイルの終端に達したら、繰り返しを終了 (AT END)
    • 読み込んだレコードの商品コードと、入力された商品コードが一致するか比較 (IF)
    • 一致した場合:
      • 商品名と単価を表示 (DISPLAY)
      • 検索処理を終了(繰り返しを抜けるためのフラグを立てるなど)
  6. 検索結果の表示
    • 商品が見つかった場合は、その旨を表示(上記5-3-1で表示済みでも良い)
    • 商品が見つからなかった場合(ループが終了しても見つからなかった場合)は、その旨を表示 (IF)
  7. 商品マスタファイルを閉じる (CLOSE)
  8. プログラム終了 (STOP RUN)

エラー処理として、ファイルオープン時のエラーチェックや、検索しても該当データが見つからなかった場合のメッセージ表示なども考慮します。

実装 (サンプルコード)

それでは、上記設計に基づいてCOBOLプログラムを作成してみましょう。 GnuCOBOLでの動作を想定しています。

ファイル (`MSTSRCH1.COB`):


IDENTIFICATION DIVISION.
PROGRAM-ID. MSTSRCH1.
AUTHOR. Your Name.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT PRODUCT-MST ASSIGN TO "PRODUCT.MST"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS WS-FS-PRODUCT.

DATA DIVISION.
FILE SECTION.
FD  PRODUCT-MST.
01  PRODUCT-RECORD.
    05 PR-CODE         PIC X(5).
    05 PR-NAME         PIC X(20).
    05 PR-PRICE        PIC 9(8).

WORKING-STORAGE SECTION.
01  WS-FLAGS.
    05 WS-EOF-FLG      PIC X(1)  VALUE 'N'. *> End Of File Flag
       88 EOF                    VALUE 'Y'.
    05 WS-FOUND-FLG    PIC X(1)  VALUE 'N'. *> Found Flag
       88 FOUND                  VALUE 'Y'.

01  WS-FILE-STATUS.
    05 WS-FS-PRODUCT   PIC X(2). *> PRODUCT.MST File Status

01  WS-INPUT-AREA.
    05 WS-IN-CODE      PIC X(5).

01  WS-DISPLAY-AREA.
    05 WS-DSP-PRICE    PIC ZZZ,ZZZ,ZZ9. *> 表示用に編集

PROCEDURE DIVISION.
MAIN-PROC.
    *> ファイルオープン
    OPEN INPUT PRODUCT-MST.

    *> ファイルステータスチェック (正常でなければ終了)
    IF WS-FS-PRODUCT NOT = "00"
       DISPLAY "ERROR: PRODUCT.MST OPEN FAILED. STATUS: " WS-FS-PRODUCT
       STOP RUN
    END-IF.

    *> 検索コード入力
    DISPLAY "検索する商品コードを入力してください (5桁): ".
    ACCEPT WS-IN-CODE.

    *> 検索処理の実行
    PERFORM SEARCH-PRODUCT UNTIL EOF OR FOUND.

    *> 結果表示
    IF FOUND
       DISPLAY "検索結果が見つかりました。"
       *> ※個別の情報はSEARCH-PRODUCT内で表示済み
    ELSE
       DISPLAY "入力された商品コードは見つかりませんでした。"
    END-IF.

    *> ファイルクローズ
    CLOSE PRODUCT-MST.

    *> プログラム終了
    STOP RUN.

SEARCH-PRODUCT.
    *> ファイル読み込み
    READ PRODUCT-MST
       AT END
          MOVE 'Y' TO WS-EOF-FLG
       NOT AT END
          *> コード比較
          IF PR-CODE = WS-IN-CODE
             *> 一致したらフラグを立てて表示
             MOVE 'Y' TO WS-FOUND-FLG
             MOVE PR-PRICE TO WS-DSP-PRICE *> 表示用に編集
             DISPLAY "----------------------------------------"
             DISPLAY "商品コード: " PR-CODE
             DISPLAY "商品名    : " PR-NAME
             DISPLAY "単価      : " WS-DSP-PRICE "円"
             DISPLAY "----------------------------------------"
          END-IF
    END-READ.

END PROGRAM MSTSRCH1.

💡 コードのポイント:

  • FILE-CONTROL句で、使用するファイル名 (`PRODUCT.MST`) とファイル編成 (`LINE SEQUENTIAL`)、ファイルステータスを受け取る変数を指定します。
  • FD句で、ファイルのレコードレイアウトを定義します。
  • WORKING-STORAGE SECTIONで、ファイルステータス、EOFフラグ、検索結果フラグ、入力用変数、表示用編集変数などを定義します。
  • OPEN INPUTでファイルを開きます。直後にファイルステータスをチェックし、正常(”00″)でなければエラーメッセージを表示して終了します。
  • ACCEPT文でユーザーからの入力を受け取ります。
  • PERFORM SEARCH-PRODUCT UNTIL EOF OR FOUNDで、ファイルの終端に達するか、データが見つかるまでSEARCH-PRODUCT段落を繰り返し実行します。
  • READ文でファイルを1レコード読み込みます。AT ENDでファイルの終端を検知し、EOFフラグを立てます。
  • NOT AT ENDで、レコードが読み込めた場合の処理を書きます。入力されたコード(WS-IN-CODE)とレコードのコード(PR-CODE)を比較します。
  • 一致した場合(IF PR-CODE = WS-IN-CODE)、見つかったフラグ(WS-FOUND-FLG)を立て、DISPLAY文で結果を表示します。単価はMOVE文で編集項目(WS-DSP-PRICE)に移してから表示すると、カンマ編集などができて見やすくなります。
  • 繰り返し処理が終わった後、FOUNDフラグを見て、最終的な結果メッセージを表示します。
  • 最後にCLOSE文でファイルを閉じます。

実行とテスト

作成したプログラムをテストしてみましょう。

  1. テストデータの準備: 上記「今回使用するマスタファイルの構造」で示した例のような内容で、`PRODUCT.MST` という名前のテキストファイルを作成します。文字コードは環境に合わせてください(Shift_JISやUTF-8など)。
  2. コンパイル: GnuCOBOLがインストールされている環境で、以下のコマンドを実行してコンパイルします。 `-x` オプションで実行可能ファイルを生成します。
    
    cobc -x MSTSRCH1.COB
    
    エラーが出なければ、`MSTSRCH1` (Windowsの場合は `MSTSRCH1.exe`) という実行可能ファイルが生成されます。
  3. 実行: 生成された実行可能ファイルを実行します。
    
    ./MSTSRCH1
    
    (Windowsの場合は `MSTSRCH1.exe`)
  4. 動作確認: プログラムが実行されると、「検索する商品コードを入力してください (5桁): 」と表示されるので、`PRODUCT.MST` に存在する商品コード(例: `P0002`)を入力してEnterキーを押します。該当する商品の情報が表示されれば成功です。 🎉
    検索する商品コードを入力してください (5桁): P0002
    ----------------------------------------
    商品コード: P0002
    商品名    : ミカン
    単価      :       80円
    ----------------------------------------
    検索結果が見つかりました。
    
    次に、存在しない商品コード(例: `X9999`)を入力して、見つからない旨のメッセージが表示されることも確認しましょう。
    検索する商品コードを入力してください (5桁): X9999
    入力された商品コードは見つかりませんでした。
    

まとめ

今回は、簡易的なマスタ検索プログラムを作成しました。ファイルから特定の情報を探し出すという基本的な処理を通して、COBOLのファイル操作、条件分岐、繰り返し処理の組み合わせ方を学べたかと思います。

このプログラムはさらに、以下のような拡張も考えられます。

  • 繰り返し検索できるようにする。
  • 検索キーの一部を入力して検索できるようにする(部分一致検索)。
  • 索引編成ファイル(Indexed Sequential File)を使用して、より高速な検索を実現する。

今回のミニプロジェクトで得た経験を活かして、次の「CSVファイルとの連携処理」にも挑戦していきましょう!✨

参考情報

より深く学習したい方向けの参考情報です。

コメント

タイトルとURLをコピーしました