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

COBOL(コボル)言語でよく使われるマッチング処理とは?

応用-マッチング処理-イメージ

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

COBOL(コボル)プログラムの処理パターンの1つであるマッチング処理は、商品コード、商品名など、一度決めるとほとんど変更する事のないファイル(マスターファイル)と、商品の受注データや在庫データなど、頻繁に情報が更新されるようなファイル(トランザクションファイル)を突き合わせして処理を行う事を意味します。

突き合わせをする時は、それぞれのファイルに共通するキー項目(例えば商品コード)を使用して、そのキー項目が一致する場合、一致しない場合を判定しながら処理を進める事が一般的な使い方になります。

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

実際マッチングの基本的な処理構成について見ていきましょう。この処理構成を理解する事が今回の処理の理解につながります。

[基本的な処理構成]

1.初期処理、2.主処理、3.終了処理

各処理で実施する処理内容は以下の通りです。

※処理はマスターファイル、トランザクションファイルのそれぞれのレコードがキー順にソートされている事が前提です。

1.初期処理 ファイルオープン処理を行います。
さらにマッチングする2つのファイルについて、1件目のファイル読み込み処理 を行います。
2.主処理 最初にファイルを読み込むのは、この後、マッチング処理を行うためです。
マッチング処理を行います。この時、2つのファイルに共通するキー項目を比較しま す。
比較した結果、ファイル編集や出力処理を行い、次のレコードを読み込みます。
3.終了処理 ファイルクローズ処理を行います。

基本的な処理構成を見ていただければおわかりになるかと思いますが、1.初期処理、3.終了処理はファイル操作の共通の処理になり、2.主処理のマッチング処理を業務要件に合わせて記述する事で、様々な処理要件に対応する事ができます。では基本的な処理構成について記述したサンプルプログラム(使用例1)を用意しましたので、その書き方について見ていきましょう。

使用例1:

応用-マッチング処理-使用例1

応用-マッチング処理-使用例

応用-マッチング処理-使用例

使用例1は、2つのファイルを読み込み、2つのファイルに共通するキー項目を比較してマッチング処理を行っています。キー項目が一致する場合は、IN01ファイルの内容をOUT01ファイルに出力し、一致しない場合は、IN01ファイルの内容をOUT02ファイルに出力するというプログラムになります。

マッチング処理はファイル読み込み処理を頻繁に行うため、使用例のようにファイル読み込み処理を主処理とは別に定義しておくとプログラムが読みやすくなるかと思います。

入力ファイル(in01.txt):

応用-マッチング処理-入力ファイル

入力ファイル(in02.txt):

応用-マッチング処理-入力ファイル

実行結果:

応用-マッチング処理-実行結果

出力ファイル(out01.txt):

応用-マッチング処理-出力ファイル

出力ファイル(out02.txt):

応用-マッチング処理-出力ファイル

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

マッチング処理の基本的な処理構成と書き方について理解いただけたでしょうか。今度は、応用的な使い方について考えていきましょう。

先ほどご紹介したサンプルプログラムは、2つのファイルの一致不一致を判断し、それぞれ別のファイルに出力するというプログラムでしたが、一致不一致を判断し、同じファイルに出力するような使い方もよく行われます。

では、具体的なサンプルプログラム(使用例2)を用意しましたので、しっかり内容を理解して実際のプログラム作成に活用いただければと思います。

使用例2:

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. MATCH_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(04).
  20. 03 IN01-SUJI PIC 99.
  21. FD IN02-FILE.
  22. 01 IN02.
  23. 03 IN02-KEY PIC X(04).
  24. 03 IN02-SUJI PIC 99.
  25. FD OUT01-FILE.
  26. 01 OUT01.
  27. 03 OUT01-KEY PIC X(04).
  28. 03 OUT01-SUJI 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. MOVE IN02-SUJI TO OUT01-SUJI
  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 MATCH_SAMPLE02.

使用例2は、使用例1とほとんど同じような処理の流れになっていますが、出力ファイルがOUT01ファイルだけになっています。具体的には、キー項目が一致しない場合でもIN01ファイルの内容をOUT01ファイルに出力しています。このようにレコード数はそのままで、一部のレコードのみを更新するという使い方もよく行われます。

入力ファイル(in01.txt):

応用-マッチング処理-入力ファイル

入力ファイル(in02.txt):

応用-マッチング処理-入力ファイル

実行結果:

応用-マッチング処理-実行結果

出力ファイル(out01.txt):

応用-マッチング処理-出力ファイル

練習問題

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

問)

先ほどまでのサンプルプログラムはマッチングするキー項目を年(4桁)としていました。では、使用例1のキー項目を年月単位にするためには、どのようにプログラムを修正しないといけないでしょうか?

答え)

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

まず、ファイルに定義している項目長を4桁から6桁に修正します。必要に応じて項目名も修正しましょう。プログラムの修正は以上で、後は処理に利用する実際のデータも年月にして結果を確認してみましょう。

今回は年を年月に変更するという内容でしたが、全く関連のない2つ以上の項目をキー項目として利用する場合は、比較用の変数を予め用意して比較はこの変数同士で行うのがいいでしょう。こうしておく事でキー項目が変更された場合でも、プログラムの修正を最小限にする事ができます。

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

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

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

COBOL入門のカテゴリー

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