[ 自宅でCOBOL_目次 ]

SEARCH文のサンプル



コーディングする

このサンプルプログラム(サブプロ)はブロックコードからブロック名を取得する。
ソースの作成場所と名前は以下の通り。
→C:/cygwin/home/各ユーザID/cobol/GETBLK.COB
       IDENTIFICATION DIVISION.
       PROGRAM-ID. GETBLK.
      *------------------------------------------------------------
      * ブロック名取得プログラム
      *------------------------------------------------------------
       AUTHOR.     JIRO SUZUKI.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       COPY BLKTBL.
       01 CNS-AREA.
         03 CNS-RTNCD.
           05 CNS-RTNCD-NORMAL    PIC X(02) VALUE "00".
           05 CNS-RTNCD-UNMATCH   PIC X(02) VALUE "04".
           05 CNS-RTNCD-NOENTRY   PIC X(02) VALUE "99".
         03 CNS-NUMBER-OF-PREFECT PIC 9(02) COMP-3 VALUE 47.
         03 CNS-MATCH             PIC 9(01) COMP-3 VALUE 1.
       LINKAGE SECTION.
       COPY IO-BLK.
       PROCEDURE DIVISION USING IO-BLK.
       MAIN SECTION.
         MOVE CNS-RTNCD-NORMAL TO RTNCD.
         MOVE SPACE TO BLKNAMEKANA  OF IO-BLK.
         MOVE SPACE TO BLKNAMEKANJI OF IO-BLK.
      *
         IF BLKCD OF IO-BLK = SPACE              
            MOVE CNS-RTNCD-NOENTRY TO RTNCD  *>入力エラー
         END-IF.
      *
         IF RTNCD = CNS-RTNCD-NORMAL
           SET IDX-BLK TO 1
           SEARCH BLK-REC
             AT END
               MOVE CNS-RTNCD-UNMATCH TO RTNCD
             WHEN BLKCD OF BLKTBL(IDX-BLK) = BLKCD OF IO-BLK
               MOVE BLKNAMEKANA  OF BLKTBL(IDX-BLK)
                 TO BLKNAMEKANA  OF IO-BLK
               MOVE BLKNAMEKANJI OF BLKTBL(IDX-BLK)
                 TO BLKNAMEKANJI OF IO-BLK
           END-SEARCH
         END-IF.
      *
         GOBACK.



コピー句を作成する

インターフェースレコードのコピー句を作成する。
コピー句の作成場所と名前は以下の通り。
→C:/cygwin/home/各ユーザID/copy/IO-BLK.COB
       01 IO-BLK.
         03 BLKCD               PIC X(02).
         03 RTNCD               PIC X(02).
         03 BLKNAMEKANA         PIC X(10).
         03 BLKNAMEKANJI        PIC N(10).
         03                     PIC X(16).



ブロックテーブルを作成する

コピー句の作成場所と名前は以下を参照のこと。
→C:/cygwin/home/各ユーザID/copy/BLKTBL.COB
       01 BLKTBL.  *>ブロックテーブル
         03 BLKTBL-VALUE.
           05        PIC X(32) VALUE "01ホッカイドウ   北海道       ".
           05        PIC X(32) VALUE "02トウホク      東北        ".
           05        PIC X(32) VALUE "03カントウ      関東        ".
           05        PIC X(32) VALUE "04コウシンエツ    甲信越       ".
           05        PIC X(32) VALUE "05ホクリク      北陸        ".
           05        PIC X(32) VALUE "06トウカイ      東海        ".
           05        PIC X(32) VALUE "07カンサイ      関西        ".
           05        PIC X(32) VALUE "08チュウゴク    中国        ".
           05        PIC X(32) VALUE "09シコク       四国        ".
           05        PIC X(32) VALUE "10キュウシュウ    九州        ".
         03 BLKTBL-R            REDEFINES BLKTBL-VALUE.
           05 BLK-REC           OCCURS  10 INDEXED BY IDX-BLK.
             07 BLKCD           PIC X(02).
             07 BLKNAMEKANA     PIC X(10).
             07 BLKNAMEKANJI    PIC N(10).



サブプロを実行するドライバプログラムを作成する

ソースの作成場所と名前は以下を参照のこと。
→C:/cygwin/home/各ユーザID/cobol/DRV00002.COB
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DRV00002.
       AUTHOR.     JIRO SUZUKI.
      *------------------------------------------------------------
      * ブロック名取得確認用ドライバー
      *------------------------------------------------------------
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WORK-AREA.
         03 W-BLKCD     PIC X(02).
         03 W-BLKCD-R   REDEFINES W-BLKCD PIC 9(02).
         03 IDX         PIC 9(02) COMP-3.
       COPY IO-BLK.
       PROCEDURE DIVISION.
       MAIN SECTION.
         DISPLAY "----- ブロックメイ シュトク(PGM=GETBLK) TEST START -----".
      *
         INITIALIZE IO-BLK.
         MOVE SPACE TO IO-BLK.
      *
         MOVE 1 TO IDX.
         PERFORM UNTIL IDX > 10
           MOVE IDX TO W-BLKCD-R
           MOVE W-BLKCD TO BLKCD OF IO-BLK
           CALL "GETBLK" USING IO-BLK
           DISPLAY "--- ノーマル ケース ---" 
           DISPLAY "BLKCD=" BLKCD OF IO-BLK 
           DISPLAY "RTNCD=" RTNCD OF IO-BLK 
           DISPLAY "BLKNAMEKANA =" BLKNAMEKANA OF IO-BLK 
           DISPLAY "BLKNAMEKANJI=" BLKNAMEKANJI OF IO-BLK 
           ADD 1 TO IDX
         END-PERFORM.
      *
         INITIALIZE IO-BLK.
         MOVE SPACE TO IO-BLK.
         MOVE SPACE TO BLKCD OF IO-BLK.
         CALL "GETBLK" USING IO-BLK.
         DISPLAY "--- ニュウリョクエラー ケース ---" .
         DISPLAY "BLKCD=" BLKCD OF IO-BLK .
         DISPLAY "RTNCD=" RTNCD OF IO-BLK .
         DISPLAY "BLKNAMEKANA =" BLKNAMEKANA OF IO-BLK .
         DISPLAY "BLKNAMEKANJI=" BLKNAMEKANJI OF IO-BLK .
      *
         INITIALIZE IO-BLK.
         MOVE SPACE TO IO-BLK.
         MOVE "00" TO BLKCD OF IO-BLK.
         CALL "GETBLK" USING IO-BLK.
         DISPLAY "--- アンマッチ ケース ---" .
         DISPLAY "BLKCD=" BLKCD OF IO-BLK .
         DISPLAY "RTNCD=" RTNCD OF IO-BLK .
         DISPLAY "BLKNAMEKANA =" BLKNAMEKANA OF IO-BLK .
         DISPLAY "BLKNAMEKANJI=" BLKNAMEKANJI OF IO-BLK .
      *
         INITIALIZE IO-BLK.
         MOVE SPACE TO IO-BLK.
         MOVE "03" TO BLKCD OF IO-BLK.
         CALL "GETBLK" USING IO-BLK.
         DISPLAY "--- ノーマル ケース ---" .
         DISPLAY "BLKCD=" BLKCD OF IO-BLK .
         DISPLAY "RTNCD=" RTNCD OF IO-BLK .
         DISPLAY "BLKNAMEKANA =" BLKNAMEKANA OF IO-BLK .
         DISPLAY "BLKNAMEKANJI=" BLKNAMEKANJI OF IO-BLK .
      *
         DISPLAY "----- ブロックメイ シュトク(PGM=GETBLK) TEST END   -----".
         STOP RUN.



コメント

このプログラムのソースをサブプロの作り方のソースと比較すると、
(1)テーブルのインデックスを加算するロジックが不要になる。
(2)テーブルとマッチしなかったときの処理を"AT END"以下に記述できる。
といった違いがあります。機能は全くと言ってよいほど一緒ですが、結果的にこちらのソースの方がすっきりしています。
わかりやすいソースを心がける場合、こちらの方が好ましいかもしれません。