COBOL言語の「SEARCH文」を活用して表内検索をしよう! | 用語辞典

COBOL(コボル)言語の予約語SEARCH、AT END、WHEN、END-SEARCHを使った表内検索とは

辞典・辞書-SEARCH-イメージ

COBOL(コボル)言語のSEARCH~AT END~WHEN~END-SEARCH文とは?

SEARCH(英語)は、日本語に訳すると「探す」、AT ENDは「終了したとき」、WHEN(英語)は「いつ」という意味です。

COBOL(コボル)言語のSEARCH~AT END~WHEN~END-SEARCH文は、表を検索しWHENの検索条件に一致するとWHEN以下の処理を実行します。

SEARCH文の形式:SEARCH~AT END~WHEN~END-SEARCH

SEARCH~AT END~WHEN~END-SEARCHでは、検索表領域内にWHENの検索条件に一致するデータがある場合に、WHENからEND-SEARCHの間に書かれた命令を実行します。検索表領域内にWHENの検索条件に一致するデータがない場合には、AT ENDからWHENの間に書かれた命令を実行します。

■書式

SEARCH  検索表領域名

   AT END

     検索条件に一致するデータがない場合に実行する命令群

   WHEN  検索条件

     検索条件に一致するデータがある場合に実行する命令群

END-SEARCH.

■構文規則

 <検索表領域名>

  検索する表領域名を記述します。

 <検索条件に一致するデータがない場合に実行する命令群>

  検索条件に一致するデータがない場合に実行する命令を記述します。命令は複数でも単数でもかまいません。

 <検索条件>

  検索する表領域の検索条件を論理式で記述します。検索対象項目に指定する要素番号は、表領域を定義したときに「INDEXED BY」で指定した検索用のインデックス項目を指定します。

 <検索条件に一致するデータがある場合に実行する命令群>

  検索条件に一致するデータがある場合に実行する命令を記述します。命令は複数でも単数でもかまいません。

■使用例

 実際にSEARCH~AT END~WHEN~END-SEARCHを使用したプログラム例をご紹介します。

辞典・辞書-SEARCH-使用例

このプログラムは、コンソールに商品番号の入力を促すメッセージを表示し、入力された商品番号を商品テーブルから検索し、商品名と値段を表示するプログラムです。該当する商品番号がない場合は、商品コードの再入力を促します。

■実行結果

はじめに商品番号入力を促すメッセージが表示されます。

辞典・辞書-SEARCH-実行結果

数字の5を入力してみます。

辞典・辞書-SEARCH-入力例1

「メロン (900円)」が表示され、プログラムが終了しました。

SEARCH文のCOBOL(コボル)言語における基本事項やルールについて

SEARCH文のWHEN句に指定できる論理式はIF文と同様です。使用できる記号と演算子をご紹介します。

記号/演算子

意味

論理式の例

論理式の意味

等しい

A = B

AとBが等しい場合、真

NOT  =

等しくない

A NOT = B

AとBが異なる場合、真

>

より大きい

A > B

AがBより大きい場合、真

>=

以上

A >= B

AがBより大きい、または等しい場合、真

<

より小さい

A < B

AがBより小さい場合、真

<=

以下

A <= B

AがBより小さい、または等しい場合、真

AND

かつ

A = B AND C = D

両方が成り立つ場合、真

OR

または

A = B OR C = D

どちらかが成り立つ場合、真

NOT

否定

NOT A > B

「A > B」が成り立たない場合、真

論理式に使用する記号や演算子には、評価される順番があります。

記号である「=」、「NOT =」、「>」、「>=」、「<」、「<=」は、左から評価され、評価の優先順位を変える場合はカッコで括ると先に評価されます。また、記号は演算子である「AND」、「OR」、「NOT」よりも先に評価されます。

演算子である「AND」、「OR」、「NOT」も左から評価され、カッコで括ることによって先に評価させることができます。

COBOL(コボル)言語のSEARCH文を使うときの注意点

SEARCH文は、検索を実行する前に、表領域を定義したときに「INDEXED BY」で指定した検索用のインデックス項目にSET文で検索を開始するインデックスを設定してから、検索を実行しなければなりません。

SEARCH文を使ったCOBOL(コボル)プログラムの活用方法

検索にはインデックス項目の値から、配列の最後までを順番に検索する逐次検索と、データの検索範囲を2分して検索する2分検索の2つの検索方法があります。

SEARCH文による通常の検索は逐次検索ですが、ALL句を指定することによって、2分検索で検索させることができます。ただし、2分検索する表領域の定義のときに、KEY ISでキー項目を指定する必要があります。表領域のキー項目は、昇順、または降順にデータが格納されている必要があります。

では、「COBOL(コボル)言語のSEARCH~AT END~WHEN~END-SEARCH文とは?」でご紹介したサンプルプログラムを2分検索による検索に変更してみましょう。

変更箇所は、赤マーカーの部分です。

   
  1. ******************************************************************
  2. * Author:
  3. * Date:
  4. * Purpose:
  5. * Tectonics: cobc
  6. ******************************************************************
  7. IDENTIFICATION DIVISION.
  8. PROGRAM-ID. SEARCH-SUMPLE2.
  9. DATA DIVISION.
  10. FILE SECTION.
  11. WORKING-STORAGE SECTION.
  12. 01 WORKING-AREA.
  13. *  コンソール入力&表示バッファ
  14.  03 CONSOLE-INPUT PIC 9(01).
  15.  03 DISP_BUF PIC X(20).
  16.  
  17. *  商品テーブル
  18. 01 SHOHIN_TBL_MASTER.
  19.  03 TBL_SIZE PIC 9(01).
  20.  03 SHOHIN_TBL OCCURS 0 TO 5
  21. DEPENDING ON TBL_SIZE
  22. ASCENDING KEY IS HINBAN
  23. INDEXED BY TBL_IDX.
  24. 05 HINBAN PIC 9(01).
  25. 05 HINMEI PIC X(10).
  26. 05 NEDAN PIC 9(03).
  27.  
  28. PROCEDURE DIVISION.
  29. *-------------------------------------------
  30. * 主手続
  31. *-------------------------------------------
  32. MAIN-PROCEDURE.
  33. * コンソール入力エリアの初期化
  34. MOVE ZERO TO CONSOLE-INPUT.
  35.  
  36. * 商品テーブルの初期化
  37. SET TBL_SIZE TO 5.
  38. MOVE 1 TO HINBAN(1).
  39. MOVE 2 TO HINBAN(2).
  40. MOVE 3 TO HINBAN(3).
  41. MOVE 4 TO HINBAN(4).
  42. MOVE 5 TO HINBAN(5).
  43. MOVE "みかん" TO HINMEI(1).
  44. MOVE "りんご" TO HINMEI(2).
  45. MOVE "バナナ" TO HINMEI(3).
  46. MOVE "いちご" TO HINMEI(4).
  47. MOVE "メロン" TO HINMEI(5).
  48. MOVE 100 TO NEDAN(1).
  49. MOVE 200 TO NEDAN(2).
  50. MOVE 250 TO NEDAN(3).
  51. MOVE 600 TO NEDAN(4).
  52. MOVE 900 TO NEDAN(5).
  53.  
  54. EXEC-DISPLAY-INPUT-PROC.
  55. * コンソール表示&入力
  56. DISPLAY "商品番号を入力してください(1~5)".
  57. ACCEPT CONSOLE-INPUT FROM CONSOLE.
  58.  
  59. * 商品テーブルの検索
  60. SET TBL_IDX TO 1.
  61. SEARCH ALL SHOHIN_TBL
  62. AT END
  63. DISPLAY "1~5の値を入力してください"
  64. GO TO EXEC-DISPLAY-INPUT-PROC
  65.  
  66. WHEN HINBAN(TBL_IDX) = CONSOLE-INPUT
  67. MOVE SPACE TO DISP_BUF
  68. STRING HINMEI(TBL_IDX) " " "(" NEDAN(TBL_IDX) "円)"
  69. DELIMITED BY SPACE
  70. INTO DISP_BUF
  71. DISPLAY DISP_BUF
  72. END-SEARCH.
  73.  
  74. END-PROC.
  75. STOP RUN.
  76. END PROGRAM SEARCH-SUMPLE2.

■実行結果

はじめに商品番号入力を促すメッセージが表示されます。

辞典・辞書-SEARCH-実行結果

数字の5を入力してみます。

辞典・辞書-SEARCH-入力例1

「メロン (900円)」が表示され、プログラムが終了しました。

表領域の検索を自分でプログラミングすると、何10ステップものコーディングとデバッグが必要ですが、SEARCH文を使えば、10ステップとかからず、デバッグも簡単です。「できるだけ自分で作らないプログラム」がバグを内包しないプログラムですので、表領域の検索は、ぜひSEARCH文を活用しましょう。

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

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

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

COBOL入門のカテゴリー

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

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