COBOLプログラムのパターンを学ぼう!「1対1のマッチング処理」| 応用ガイド

COBOL(コボル)言語の1対1のマッチング処理とは

応用-MATCH1-イメージ

COBOL(コボル)言語の「1対1のマッチング処理」とは?

例えば社員の基本情報を持つマスターファイルがあるとします。このマスターファイルは社員番号がキーとなっており他の社員番号とは重複しないファイルになります。次にトランザクションファイルを考えてみます。

例えば社員が2025年に取得した資格情報を持つファイルがあるとします。このトランザクションファイルも社員番号がキーとなっています。このように同じユニークな社員番号をレコードとして持つファイル同士のマッチング処理を1対1のマッチング処理と言います。では早速プログラムを作成してみましょう。

COBOL(コボル)言語の「1対1のマッチング処理」の処理構成

今回用意したサンプルプログラムの説明をします。このサンプルプログラムは、マスターファイルとトランザクションファイルをそれぞれ読み込み、マッチングキーとして6桁の社員番号を比較していくというプログラムになります。

①社員番号がマッチした場合は、In01のマスターファイルの「社員番号とマッチ」したことがわかるようにメッセージを出力します。その後、次のIn01のレコードを読み込んで再度マッチング処理を行います。

②社員番号がアンマッチの場合は、In01のマスタ?ファイルの「社員番号とアンマッチ」したことがわかるようにメッセージを出力します。その後、次のIn02のレコードを読み込んで再度マッチング処理を行います。

1対1のマッチング処理はこのように①②の処理を繰り返した後、In01のマスターファイルのレコードが読めなくなった場合に処理を終了させます。

使用例:

応用-1対1のマッチング処理を使用したプログラム1-使用例

※マスターファイルとトランザクションファイルはそれぞれキー項目でユニークなレコードになっており、キー項目でソートされている事が前提の処理になっています。

In01.txt
応用-1対1のマッチング処理を使用したプログラム1-入力ファイル1

In02.txt
応用-1対1のマッチング処理を使用したプログラム1-入力ファイル2

実行結果:
応用-1対1のマッチング処理を使用したプログラム1-実行結果1

COBOL(コボル)「1対1のマッチング処理」の応用的な使い方

1対1のマッチング処理の基本的な処理構成と使い方について理解いただけたでしょうか。今度は、応用的な使い方について考えていきましょう。先程ご紹介したサンプルプログラムはIN01のマスターファイルを更新する処理はありませんでしたが、一般的な業務プログラムでは定期的にマスターファイルを更新していることが少なくありません。

今回は1対1のマッチング処理の後にIn02トランザクションファイルの2025年の資格取得数をIn01マスターファイルの資格数に加算して新しいマスターファイル(Out01)を作成するというプログラムを作ってみましょう。しっかり内容を理解して実際のプログラム作成に活用いただければと思います。

サンプルプログラム:

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. MATCH11_SAMPLE02.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5. FILE-CONTROL.
  6. SELECT IN01-FILE
  7. ASSIGN TO "in01.txt"
  8. ORGANIZATION IS LINE SEQUENTIAL.
  9. SELECT IN02-FILE
  10. ASSIGN TO "in02.txt"
  11. ORGANIZATION IS LINE SEQUENTIAL.
  12. SELECT OUT01-FILE
  13. ASSIGN TO "out01.txt"
  14. ORGANIZATION IS LINE SEQUENTIAL.
  15. DATA DIVISION.
  16. FILE SECTION.
  17. FD IN01-FILE.
  18. 01 IN01.
  19. 03 IN01-KEY PIC X(06).
  20. 03 IN01-SHIKAKU-SU PIC 99.
  21. FD IN02-FILE.
  22. 01 IN02.
  23. 03 IN02-KEY PIC X(06).
  24. 03 IN02-SHIKAKU-SU2025 PIC 9.
  25. FD OUT01-FILE.
  26. 01 OUT01.
  27. 03 OUT01-KEY PIC X(06).
  28. 03 OUT01-SHIKAKU-SU PIC 99.
  29. WORKING-STORAGE SECTION.
  30. 01 SW-AREA.
  31. 03 SW-IN01-END PIC X(01).
  32. 01 CST-AREA.
  33. 03 CST-1X PIC X(01) VALUE '1'.
  34. PROCEDURE DIVISION.
  35. *> -------------------------------------------
  36. MATCH-RTN SECTION.
  37. *> 初期処理
  38. PERFORM INIT-RTN.
  39. *> 主処理
  40. PERFORM MAIN-RTN
  41. UNTIL SW-IN01-END = CST-1X.
  42. *> 終了処理
  43. PERFORM END-RTN.
  44. STOP RUN.
  45. MATCH-EXIT.
  46. *> -------------------------------------------
  47. *> 1.初期処理(ファイルオープン)
  48. INIT-RTN SECTION.
  49. OPEN INPUT IN01-FILE.
  50. OPEN INPUT IN02-FILE.
  51. OPEN OUTPUT OUT01-FILE.
  52. PERFORM READ01-RTN.
  53. PERFORM READ02-RTN.
  54. INIT-EXIT.
  55. *> -------------------------------------------
  56. *> 2.ファイル読み込み処理(IN01)
  57. READ01-RTN SECTION.
  58. *> 入力ファイルREAD
  59. READ IN01-FILE AT END
  60. DISPLAY "READ IN01 END"
  61. MOVE CST-1X TO SW-IN01-END
  62. GO TO READ01-EXIT
  63. END-READ.
  64. READ01-EXIT.
  65. *> -------------------------------------------
  66. *> 3.ファイル読み込み処理(IN02)
  67. READ02-RTN SECTION.
  68. *> 入力ファイルREAD
  69. READ IN02-FILE AT END
  70. MOVE HIGH-VALUE TO IN02-KEY
  71. GO TO READ02-EXIT
  72. END-READ.
  73. READ02-EXIT.
  74. *> -------------------------------------------
  75. *> 4.主処理(マッチング処理)
  76. MAIN-RTN SECTION.
  77. IF IN01-KEY = IN02-KEY
  78. THEN
  79. MOVE IN01-KEY TO OUT01-KEY
  80. COMPUTE OUT01-SHIKAKU-SU = IN01-SHIKAKU-SU + IN02-SHIKAKU-SU2025
  81. WRITE OUT01
  82. PERFORM READ01-RTN
  83. ELSE
  84. IF IN01-KEY < IN02-KEY
  85. THEN
  86. MOVE IN01 TO OUT01
  87. WRITE OUT01
  88. PERFORM READ01-RTN
  89. END-IF
  90. IF IN01-KEY > IN02-KEY
  91. PERFORM READ02-RTN
  92. END-IF
  93. END-IF.
  94. MAIN-EXIT.
  95. *> -------------------------------------------
  96. *> 5.終了処理(ファイルクローズ)
  97. END-RTN SECTION.
  98. CLOSE IN01-FILE.
  99. CLOSE IN02-FILE.
  100. CLOSE OUT01-FILE.
  101. END-EXIT.
  102. *> -------------------------------------------
  103. END PROGRAM MATCH11_SAMPLE02.

In01.txt
応用-1対1のマッチング処理を使用したプログラム2-入力ファイル1

In02.txt
応用-1対1のマッチング処理を使用したプログラム2-入力ファイル2

Out01.txt
応用-1対1のマッチング処理を使用したプログラム2-実行結果1

実行結果:
応用-1対1のマッチング処理を使用したプログラム2-実行結果2

練習問題

最後に練習問題にチャレンジしてみましょう。

問)

先程の応用プログラムではマスターファイルの更新のみを行いました。実際の業務ではマッチした情報の更新を行うだけでなく、アンマッチした情報の分析なども行うことがあります。アンマッチした時にOut02ファイルに社員番号がわかるように出力するにはどのようにプログラムを修正すればいいでしょうか?

答え)

以下のように処理を変更します。

まずファイル定義についてOut02の定義を行います。追加イメージはOut01の定義を参考にしてみてください。PROCEDURE DIVISION以降は追加したOut02のファイルオープン、クローズ処理を追加します。

あとはアンマッチ処理を修正します。「MOVE IN01 TO OUT01」「WRITE OUT01」行を「MOVE IN01 TO OUT02」「WRITE OUT02」とすればアンマッチ分だけのファイルを作成することができます。

この記事を読んだ人は、こちらの記事も読んでいます

あなたのCOBOL技術を活かしませんか?

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

|  基礎  |  応用  |  勉強  |  試験 |  辞書  |

取引企業様 募集中
COBOL技術者 募集
COBOL魂
COBOL入門