COBOLプログラムのパターンを学ぼう!「マッチング処理」 | 応用ガイド
COBOL(コボル)言語でよく使われるマッチング処理とは?
COBOL(コボル)言語の「マッチング処理」とは?
COBOL(コボル)プログラムの処理パターンの1つであるマッチング処理は、商品コード、商品名など、一度決めるとほとんど変更する事のないファイル(マスターファイル)と、商品の受注データや在庫データなど、頻繁に情報が更新されるようなファイル(トランザクションファイル)を突き合わせして処理を行う事を意味します。
突き合わせをする時は、それぞれのファイルに共通するキー項目(例えば商品コード)を使用して、そのキー項目が一致する場合、一致しない場合を判定しながら処理を進める事が一般的な使い方になります。
COBOL(コボル)言語の「マッチング処理」の処理構成
実際マッチングの基本的な処理構成について見ていきましょう。この処理構成を理解する事が今回の処理の理解につながります。
[基本的な処理構成]
1.初期処理、2.主処理、3.終了処理
各処理で実施する処理内容は以下の通りです。
※処理はマスターファイル、トランザクションファイルのそれぞれのレコードがキー順にソートされている事が前提です。
1.初期処理 |
ファイルオープン処理を行います。
さらにマッチングする2つのファイルについて、1件目のファイル読み込み処理 を行います。 |
2.主処理 |
最初にファイルを読み込むのは、この後、マッチング処理を行うためです。
マッチング処理を行います。この時、2つのファイルに共通するキー項目を比較しま す。 比較した結果、ファイル編集や出力処理を行い、次のレコードを読み込みます。 |
3.終了処理 | ファイルクローズ処理を行います。 |
基本的な処理構成を見ていただければおわかりになるかと思いますが、1.初期処理、3.終了処理はファイル操作の共通の処理になり、2.主処理のマッチング処理を業務要件に合わせて記述する事で、様々な処理要件に対応する事ができます。では基本的な処理構成について記述したサンプルプログラム(使用例1)を用意しましたので、その書き方について見ていきましょう。
使用例1:
使用例1は、2つのファイルを読み込み、2つのファイルに共通するキー項目を比較してマッチング処理を行っています。キー項目が一致する場合は、IN01ファイルの内容をOUT01ファイルに出力し、一致しない場合は、IN01ファイルの内容をOUT02ファイルに出力するというプログラムになります。
マッチング処理はファイル読み込み処理を頻繁に行うため、使用例のようにファイル読み込み処理を主処理とは別に定義しておくとプログラムが読みやすくなるかと思います。
入力ファイル(in01.txt):
入力ファイル(in02.txt):
実行結果:
出力ファイル(out01.txt):
出力ファイル(out02.txt):
COBOL(コボル)言語の「マッチング処理」の応用的な使い方
マッチング処理の基本的な処理構成と書き方について理解いただけたでしょうか。今度は、応用的な使い方について考えていきましょう。
先ほどご紹介したサンプルプログラムは、2つのファイルの一致不一致を判断し、それぞれ別のファイルに出力するというプログラムでしたが、一致不一致を判断し、同じファイルに出力するような使い方もよく行われます。
では、具体的なサンプルプログラム(使用例2)を用意しましたので、しっかり内容を理解して実際のプログラム作成に活用いただければと思います。
使用例2:
- IDENTIFICATION DIVISION.
- PROGRAM-ID. MATCH_SAMPLE02.
- ENVIRONMENT DIVISION.
- INPUT-OUTPUT SECTION.
- FILE-CONTROL.
- SELECT IN01-FILE
- ASSIGN TO "in01.txt"
- ORGANIZATION IS LINE SEQUENTIAL.
- SELECT IN02-FILE
- ASSIGN TO "in02.txt"
- ORGANIZATION IS LINE SEQUENTIAL.
- SELECT OUT01-FILE
- ASSIGN TO "out01.txt"
- ORGANIZATION IS LINE SEQUENTIAL.
- DATA DIVISION.
- FILE SECTION.
- FD IN01-FILE.
- 01 IN01.
- 03 IN01-KEY PIC X(04).
- 03 IN01-SUJI PIC 99.
- FD IN02-FILE.
- 01 IN02.
- 03 IN02-KEY PIC X(04).
- 03 IN02-SUJI PIC 99.
- FD OUT01-FILE.
- 01 OUT01.
- 03 OUT01-KEY PIC X(04).
- 03 OUT01-SUJI PIC 99.
- WORKING-STORAGE SECTION.
- 01 SW-AREA.
- 03 SW-IN01-END PIC X(01).
- 01 CST-AREA.
- 03 CST-1X PIC X(01) VALUE '1'.
- PROCEDURE DIVISION.
- *> -------------------------------------------
- MATCH-RTN SECTION.
- *> 初期処理
- PERFORM INIT-RTN.
- *> 主処理
- PERFORM MAIN-RTN
- UNTIL SW-IN01-END = CST-1X.
- *> 終了処理
- PERFORM END-RTN.
- STOP RUN.
- MATCH-EXIT.
- *> -------------------------------------------
- *> 1.初期処理(ファイルオープン)
- INIT-RTN SECTION.
- OPEN INPUT IN01-FILE.
- OPEN INPUT IN02-FILE.
- OPEN OUTPUT OUT01-FILE.
- PERFORM READ01-RTN.
- PERFORM READ02-RTN.
- INIT-EXIT.
- *> -------------------------------------------
- *> 2.ファイル読み込み処理(IN01)
- READ01-RTN SECTION.
- *> 入力ファイルREAD
- READ IN01-FILE AT END
- DISPLAY "READ IN01 END"
- MOVE CST-1X TO SW-IN01-END
- GO TO READ01-EXIT
- END-READ.
- READ01-EXIT.
- *> -------------------------------------------
- *> 3.ファイル読み込み処理(IN02)
- READ02-RTN SECTION.
- *> 入力ファイルREAD
- READ IN02-FILE AT END
- MOVE HIGH-VALUE TO IN02-KEY
- GO TO READ02-EXIT
- END-READ.
- READ02-EXIT.
- *> -------------------------------------------
- *> 4.主処理(マッチング処理)
- MAIN-RTN SECTION.
- IF IN01-KEY = IN02-KEY
- THEN
- MOVE IN01-KEY TO OUT01-KEY
- MOVE IN02-SUJI TO OUT01-SUJI
- WRITE OUT01
- PERFORM READ01-RTN
- ELSE
- IF IN01-KEY < IN02-KEY
- THEN
- MOVE IN01 TO OUT01
- WRITE OUT01
- PERFORM READ01-RTN
- END-IF
- IF IN01-KEY > IN02-KEY
- PERFORM READ02-RTN
- END-IF
- END-IF.
- MAIN-EXIT.
- *> -------------------------------------------
- *> 5.終了処理(ファイルクローズ)
- END-RTN SECTION.
- CLOSE IN01-FILE.
- CLOSE IN02-FILE.
- CLOSE OUT01-FILE.
- END-EXIT.
- *> -------------------------------------------
- END PROGRAM MATCH_SAMPLE02.
使用例2は、使用例1とほとんど同じような処理の流れになっていますが、出力ファイルがOUT01ファイルだけになっています。具体的には、キー項目が一致しない場合でもIN01ファイルの内容をOUT01ファイルに出力しています。このようにレコード数はそのままで、一部のレコードのみを更新するという使い方もよく行われます。
入力ファイル(in01.txt):
入力ファイル(in02.txt):
実行結果:
出力ファイル(out01.txt):
練習問題
最後に練習問題にチャレンジしてみましょう。
問)
先ほどまでのサンプルプログラムはマッチングするキー項目を年(4桁)としていました。では、使用例1のキー項目を年月単位にするためには、どのようにプログラムを修正しないといけないでしょうか?
答え)
以下のように処理を変更します。
まず、ファイルに定義している項目長を4桁から6桁に修正します。必要に応じて項目名も修正しましょう。プログラムの修正は以上で、後は処理に利用する実際のデータも年月にして結果を確認してみましょう。
今回は年を年月に変更するという内容でしたが、全く関連のない2つ以上の項目をキー項目として利用する場合は、比較用の変数を予め用意して比較はこの変数同士で行うのがいいでしょう。こうしておく事でキー項目が変更された場合でも、プログラムの修正を最小限にする事ができます。
この記事を読んだ人は、こちらの記事も読んでいます
あなたのCOBOL技術を活かしませんか?
COBOL入門のカテゴリー
1. 優良社員が多数在籍しています
2. 即日派遣、又は請負います
3. 安心価格で請負います
4. 同時、協力会社募集中です
1. 正社員
2. 契約社員
3. 個人事業主
などの
求人情報
が閲覧できます。
目指せ!COBOLダントツ一番企業。
創業当初の話や理念が閲覧できます。
応募条件
※2020年5月31日を以って、締切りました。
18歳~28歳の方。
正社員採用において、北川社長の著書『祈り方が9割』を読んで感想文を事前に提出すると、無条件で最終面接まで進むことができます。
COBOLとは、どのようなプログラミング言語なのか、初心者にもわかりやすく、文法の例をあげて解説してます。
COBOL入門の人気記事
- COBOL言語とは?プログラムの書き方やルールを解説!|基礎ガイド
- 【COBOL言語】条件分岐処理の代名詞「IF文」について知ろう|用語辞典
- COBOL言語の「MOVE文」とは?転記のルールをご紹介します|用語辞典
- COBOL言語の「STRING文」とは?文字連結の基礎知識と注意点|用語辞典
- 多枝分岐ってなに?COBOL言語の「EVALUATE文」を知ろう!|用語辞典
- COBOL言語の「PICTURE句」とは?基本事項を解説します!|用語辞典
- COBOL言語で計算処理をするなら「COMPUTE文」|用語辞典
- COBOL言語の「REDEFINES句」とは?使い方を確認しよう!|用語辞典
- 覚えておけば楽ができる?COBOL言語の「COPY文」の使い方|用語辞典
- COBOL言語の文字列操作のパターンを理解しよう!|基礎ガイド
- COBOL言語の初期化処理に重宝する「INITIALIZE文」とは?|用語辞典
- COBOL言語の「LOW-VALUE」の使い方について理解しよう!|基礎ガイド
- COBOL言語の「OCCURS句」について知ろう!学ぶべき基本とは|用語辞典
- COBOL言語初心者も安心! 難解「CALL文」をスッキリ解決|用語辞典
- COBOL言語の「PERFORM文」とは。実行制御について解説!|用語辞典
- COBOL言語の繰り返し処理のパターンを理解しよう!|基礎ガイド
- COBOL言語の「定数」の種類と使い方について理解しよう!|用語辞典
- COBOLのDBアクセスパターンを学ぼう!「FETCH」|応用ガイド
- COBOL言語の「DISPLAY文」は、ディスプレイ出力の為にある|用語辞典
- COBOL言語の「VARYING句」は便利?使用方法を学びましょう|用語辞典