[ 自宅で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"以下に記述できる。
といった違いがあります。機能は全くと言ってよいほど一緒ですが、結果的にこちらのソースの方がすっきりしています。
わかりやすいソースを心がける場合、こちらの方が好ましいかもしれません。