COBOL入門 Mission3-4

処 理 内 容 PROGRAM-ID 難易度 言語
指定したプログラムを表示する LST004 1 COBOL
1:処理図
2:処理概要

[LST003に条件追加]
任意のプログラムを指定して画面に表示する

最初にガイドメッセージを表示する
Display "program-name x(06) type-in"

☆外部ファイル名を組み立てるには
   プログラム名は6桁だけ受け取り
    前後の文字列を作業領域で組み立てる。

   c:     \cobol    \??????   .cbl
    ↑      ↑         ↑       ↑
  装置名  フォルダ名  プログラム名  拡張子

※図は手違いでLST030になってます
3:ファイル名称 I-O 外部ファイル名 編成 KP/KL RL/BF access
(1)ソースプログラム in c:\cobol\??????.cbl seq  /  72/1
4:その他
外部ファイル名 (c:\cobol\??????.cbl) の中の ?????? 以外の部分をあらかじめ作業領域に作成しておいて組み立てる
 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                LST004.
 ENVIRONMENT                DIVISION.
 INPUT-OUTPUT               SECTION.
 FILE-CONTROL.
     SELECT  F1  ASSIGN  TO  f1idt
*                            ~~~~~ 外部ファイル名(代名詞)
                 STATUS  FST  ACCESS  MODE  IS  SEQUENTIAL.
 DATA                       DIVISION.
 FILE                       SECTION.
 FD  F1.
 01  F1R                    PIC X(72).
 WORKING-STORAGE            SECTION.
 01  FST                    PIC X(02).
 01  CNT                    PIC 9(02) VALUE 0.
 01  F1IDT.
*          (この中で外部ファイル名を組み立てる)
     03                     PIC X(09) VALUE "c:\cobol\".
     03 IDT                 PIC X(06).
     03                     PIC X(04) VALUE ".cbl".
 PROCEDURE                  DIVISION.
     DISPLAY  "PROGRAM-NAME X(06) TYPE-IN"
*    (プログラム名 6桁を受け取る)
     ACCEPT  IDT
     OPEN  INPUT  F1
     PERFORM  UNTIL  FST  NOT  =  "00"
         READ  F1
               END      DISPLAY  "<<< LST004 - ENDED >>>"
               NOT END  DISPLAY  F1R
                        ADD  1  TO  CNT
                        IF  CNT  =  20
                            THEN  STOP  "!!! OK  CLICK  !!!"
                                  MOVE  0  TO  CNT
                            ELSE  CONTINUE
                        END-IF
         END-READ
     END-PERFORM
     CLOSE  F1
     STOP  RUN.

整構造にするとこうなります

**** not open program 整構造化 ****
 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                LST004.
 ENVIRONMENT                DIVISION.
 INPUT-OUTPUT               SECTION.
 FILE-CONTROL.
     SELECT  F1  ASSIGN  TO  F1IDT      STATUS  FST
                         ACCESS  MODE  IS  SEQUENTIAL.
 DATA                       DIVISION.
 FILE                       SECTION.
 FD  F1.
 01  F1R                    PIC X(72).
 WORKING-STORAGE            SECTION.
 01  FST                    PIC X(02).
 01  F1IDT.
     03                     PIC X(09) VALUE "c:\cobol\".
     03  IDT                PIC X(06).
     03                     PIC X(04) VALUE ".cbl".
 01  CNT                    PIC 9(02) VALUE 0.
 PROCEDURE                  DIVISION.
     DISPLAY  "PROGRAM-NAME X(06) TYPE-IN"
     ACCEPT   IDT
     OPEN  INPUT  F1
     IF  FST  =  "00"
*    ^^^^^^^^^^^^^^^^ (OPEN出来たかどうかの判定をする)
         THEN  PERFORM  UNTIL  FST  NOT  =  "00"
                   READ  F1
                      END       DISPLAY  "<<< LST004 - ENDED >>>"
                      NOT  END  DISPLAY  F1R
                                ADD  1  TO  CNT
                                IF  CNT  =  20
                                    THEN STOP "!!!  OK  CLICK!!!"
                                         MOVE  0  TO  CNT
                                    ELSE  CONTINUE
                                END-IF
                   END-READ
               END-PERFORM
               CLOSE  F1
*              [ OPEN 出来た時だけ  CLOSE命令 が実行される ]
         ELSE  DISPLAY  "!!! PROGRAM NOT-FOUND !!!"
     END-IF
     STOP  RUN.

ファイルステータスを利用しない場合どうなるか?

*  file status を使わない場合

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                LST004.
 ENVIRONMENT                DIVISION.
 INPUT-OUTPUT               SECTION.
 FILE-CONTROL.
     SELECT  F1  ASSIGN  TO  F1IDT      ACCESS  MODE  IS  SEQUENTIAL.
*                            ^^^^^      外部ファイル名(代名詞)
 DATA                       DIVISION.
 FILE                       SECTION.
 FD  F1.
 01  F1R                    PIC X(72).
 WORKING-STORAGE            SECTION.
 01  EID                    PIC X(01).
 01  F1IDT.
*    ^^^^^ ここで外部ファイル名を組み立てる
     03                     PIC X(09) VALUE "c:\cobol\".
     03  IDT                PIC X(06).
     03                     PIC X(04) VALUE ".cbl".
 01  CNT                    PIC 9(02) VALUE 0.
 PROCEDURE                  DIVISION.
     DISPLAY  "PROGRAM-NAME X(06) TYPE-IN"
     ACCEPT   IDT
     OPEN  INPUT  F1

*    !!! << ファイルステータスを使っていないので判定できない >> !!!

     PERFORM  UNTIL  EID  =  "E"
         READ  F1
               END        MOVE  "E"  TO  EID
                          DISPLAY  " <<< LST004 - ENDED >>>"
               NOT  END   DISPLAY  F1R
                          ADD  1  TO  CNT
                          IF  CNT  =  20
                              THEN  STOP  "!!! OK CLICK !!!"
                                    MOVE  0  TO  CNT
                              ELSE  CONTINUE
                          END-IF
         END-READ
     END-PERFORM
     CLOSE  F1   STOP  RUN.

上記のプログラムの場合、ファイルのオープンができなくても以降の処理が流れてしまいます。まぁ実際にはコンピュータ側から処理の強制終了をされますが、こういう記述は出来る限り避けましょう。どんな状況でもキチンと動作させること。それが大事なのですから。

PERFORM制御の場合

*  PERFORM制御 *      

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                LST004.
 ENVIRONMENT                DIVISION.
 INPUT-OUTPUT               SECTION.
 FILE-CONTROL.
     SELECT  F1  ASSIGN  TO  F1IDT      STATUS  状態
                         ACCESS  MODE  IS  SEQUENTIAL.
 DATA                       DIVISION.
 FILE                       SECTION.
 FD  F1.
 01  F1R                    PIC X(72).
 WORKING-STORAGE            SECTION.
 01  状態                   PIC X(02).
 01  F1IDT.
     03                     PIC  X(09) VALUE "c:\cobol\".
     03  名前               PIC  X(06).
     03                     PIC  X(04) VALUE ".cbl".
 01  行数                   PIC  9(02) VALUE 0.
 PROCEDURE                  DIVISION.
 制御.   PERFORM  前処理  THRU  前出口
         PERFORM  繰処理  THRU  繰出口  UNTIL  状態  NOT  =  "00"
         PERFORM  後処理  THRU  後出口
         STOP  RUN.
 前処理. DISPLAY  "プログラム名 6桁 タイプイン"
         ACCEPT  名前
         OPEN  INPUT  F1
         PERFORM  読処理  THRU  読出口
 前出口. EXIT.
 繰処理. DISPLAY  F1R
         ADD  1  TO  行数
         IF  行数  =  20
             THEN  STOP  "!!! OK  CLICK !!!
                   MOVE  0  TO  行数
             ELSE  CONTINUE
         END-IF
         PERFORM  読処理  THRU  読出口
 繰出口. EXIT.
 後処理. DISPLAY  "<<< LST004 - 終了>>>"
         CLOSE F1
 後出口. EXIT.
 読処理. READ  F1
             END       CONTINUE
             NOT  END  CONTINUE
         END  READ
 読出口. EXIT.

これがいわゆるCOBOLの王道パターンですね。前処理、本処理、後処理と制御を大きく分けた上、さらに各処理で処理単位にブロック化する。この手のコードが本当に多いです。良いか悪いかは別として…。

PERFORM制御&ステータス制御した場合

*PERFORM制御でファイルステータスを使用

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                LST004.
 ENVIRONMENT                DIVISION.
 INPUT-OUTPUT               SECTION.
 FILE-CONTROL.
     SELECT  F1  ASSIGN  TO  F1IDT      STATUS  STS
                         ACCESS  MODE  IS  SEQUENTIAL.
 DATA                       DIVISION.
 FILE                       SECTION.
 FD  F1.
 01  F1R                    PIC X(72).
 WORKING-STORAGE            SECTION.
 01  STS                    PIC X(02).
 01  FLG                    PIC X(01) VALUE SPACE.
 01  F1IDT.
     03                     PIC  X(09) VALUE "c:\cobol\".
     03  NAMAE              PIC  X(06).
     03                     PIC  X(04) VALUE ".cbl".
 01  LCNT                   PIC  9(02) VALUE 0.
 PROCEDURE                  DIVISION.
 MAIN.   PERFORM  MAE  THRU  MAE-E
         PERFORM  LOOP THRU  LOOP-E  UNTIL  STS  NOT  =  "00"
         PERFORM  ATO  THRU  ATO-E
         STOP  RUN.
 MAE.    DISPLAY  "プログラム名 6桁 タイプイン"
         ACCEPT  NAMAE
         OPEN  INPUT  F1
         IF  STS  NOT  =  "00"
             THEN  MOVE  "N"  TO  FLG
                   DISPLAY  "!!! PROGRAM NOT-FOUND !!!"
             ELSE  PERFORM  READ-R  THRU  READ-E
         END-IF
 MAE-E.  EXIT.
 LOOP.   DISPLAY  F1R
         ADD  1  TO  LCNT
         IF  LCNT  =  20
             THEN  STOP  "!!! OK  CLICK !!!"
                   MOVE  0  TO  LCNT
             ELSE  CONTINUE
         END-IF
         PERFORM  READ-R  THRU  READ-E
 LOOP-E. EXIT.
 ATO.    IF  FLG  =  "N"
             THEN  CONTINUE
             ELSE  DISPLAY "<<< LST004 - 終了 >>>"
                   CLOSE  F1
         END-IF
 ATO-E. 
 READ-R. READ  F1
             END       CONTINUE
             NOT  END  CONTINUE
         END  READ
 READ-E. EXIT.
*  [OPEN 出来ない時 OPEN-ERR だけは表示される]

うん、これが一番しっくりきますね。おっと、計らずも「うんこ」と言ってしまいました。すみません。えっと、このプログラムならファイルステータスにてファイルのオープンが出来なかった場合にも対応しています。若干ソースに余計な手間をかけてる感じを受けますが、より正確なプログラムというのはIF,THEN,ELSE,END-IFをキッチリ書くかどうかで決まるとも言えますね。


<< Back    Index    Next >>   < Top >