はじめに
お疲れ様です!😊 いよいよミニプロジェクトのステップに入りましたね。ここでは、これまでの学習で身につけた知識を総動員して、より実践的なプログラムを作成していきます。
今回のテーマは「簡易マスタ検索プログラムの作成」です。これは、多くの業務システムで基本となる処理の一つです。ファイルから特定の情報を探し出す、というシンプルな動作ですが、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`)の処理フローは以下のようになります。
- プログラム開始
- 商品マスタファイル(`PRODUCT.MST`)を入力モードで開く (OPEN INPUT)
- ユーザーに検索したい商品コードの入力を促すメッセージを表示 (DISPLAY)
- ユーザーからの商品コード入力を受け付ける (ACCEPT)
- ファイルから1レコードずつ読み込む処理を繰り返す (PERFORM UNTIL)
- ファイルから1レコード読み込む (READ)
- ファイルの終端に達したら、繰り返しを終了 (AT END)
- 読み込んだレコードの商品コードと、入力された商品コードが一致するか比較 (IF)
- 一致した場合:
- 商品名と単価を表示 (DISPLAY)
- 検索処理を終了(繰り返しを抜けるためのフラグを立てるなど)
- 検索結果の表示
- 商品が見つかった場合は、その旨を表示(上記5-3-1で表示済みでも良い)
- 商品が見つからなかった場合(ループが終了しても見つからなかった場合)は、その旨を表示 (IF)
- 商品マスタファイルを閉じる (CLOSE)
- プログラム終了 (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
文でファイルを閉じます。
実行とテスト
作成したプログラムをテストしてみましょう。
- テストデータの準備: 上記「今回使用するマスタファイルの構造」で示した例のような内容で、`PRODUCT.MST` という名前のテキストファイルを作成します。文字コードは環境に合わせてください(Shift_JISやUTF-8など)。
-
コンパイル:
GnuCOBOLがインストールされている環境で、以下のコマンドを実行してコンパイルします。 `-x` オプションで実行可能ファイルを生成します。
エラーが出なければ、`MSTSRCH1` (Windowsの場合は `MSTSRCH1.exe`) という実行可能ファイルが生成されます。cobc -x MSTSRCH1.COB
-
実行:
生成された実行可能ファイルを実行します。
(Windowsの場合は `MSTSRCH1.exe`)./MSTSRCH1
-
動作確認:
プログラムが実行されると、「検索する商品コードを入力してください (5桁): 」と表示されるので、`PRODUCT.MST` に存在する商品コード(例: `P0002`)を入力してEnterキーを押します。該当する商品の情報が表示されれば成功です。 🎉
次に、存在しない商品コード(例: `X9999`)を入力して、見つからない旨のメッセージが表示されることも確認しましょう。検索する商品コードを入力してください (5桁): P0002 ---------------------------------------- 商品コード: P0002 商品名 : ミカン 単価 : 80円 ---------------------------------------- 検索結果が見つかりました。
検索する商品コードを入力してください (5桁): X9999 入力された商品コードは見つかりませんでした。
まとめ
今回は、簡易的なマスタ検索プログラムを作成しました。ファイルから特定の情報を探し出すという基本的な処理を通して、COBOLのファイル操作、条件分岐、繰り返し処理の組み合わせ方を学べたかと思います。
このプログラムはさらに、以下のような拡張も考えられます。
- 繰り返し検索できるようにする。
- 検索キーの一部を入力して検索できるようにする(部分一致検索)。
- 索引編成ファイル(Indexed Sequential File)を使用して、より高速な検索を実現する。
今回のミニプロジェクトで得た経験を活かして、次の「CSVファイルとの連携処理」にも挑戦していきましょう!✨
参考情報
より深く学習したい方向けの参考情報です。
- GnuCOBOL 公式サイト: プロジェクトの詳細情報やドキュメントがあります。
https://www.gnu.org/software/gnucobol/ - COBOL入門サイト (外部): READ文やACCEPT/DISPLAY文などの基本的な使い方を解説しています。(※当サイトではありません)
- READ文について: https://www.cobol.jp/dictionary/d_read.html
- ACCEPT文について: https://www.cobol.jp/dictionary/d_accept.html
- DISPLAY文について: https://www.cobol.jp/dictionary/d_display.html
コメント