OpenCOBOL基礎(一)

1-1.Pro*COBOL使用例

      ******************************************************************
      * Pro*COBOLを勉強しないといけないです。              *
      ******************************************************************
      *A===B===========================================================R
      * 【見直し部】
      * 見出し部はCOBOLプログラムを識別するための部で、見出し部のみ節はありません。
      * PROGRAM-IDには作成するプログラム名などの情報を記述します。
      *A===B===========================================================R
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST_PCO.
      *A===B===========================================================R
      * 【環境部】
      * 環境部はプログラムを適用するコンピュータ名や、
      * 環境変数などの情報の定義を行う構成節(CONFIGURATION SECTION)と、
      * プログラムファイルを使用する場合に記述する入出力節(INPUT-OUTPUT SECTION)があります。
      *A===B===========================================================R
       ENVIRONMENT DIVISION.
      * 構成セクション
       CONFIGURATION SECTION.
      *A===B===========================================================R
      * 【データ部】
      * データ部はファイル節(FILE SECTION)
      *           作業場所節(WORKNG-STORAGE SECTION)
      *           連絡節(LINKAGE SECTION)
      *           通信節(COMMUNICATION SECTION)などから構成されます。
      * 主にプログラムで使用するデータ項目やファイルのレコードの宣言を行います。
      *A===B===========================================================R
       DATA DIVISION.
        WORKING-STORAGE SECTION.
        01 WORK-AREA.
          03 WORK-GROUP-1.
            05 WORK-NUM PIC 9(3).
            05 WORK-SUM PIC 9(3).
          03 WORK-GROUP-2.
            05 WORK-NUM1 PIC 9(3).
            05 WORK-NUM2 PIC 9(3).
            05 WORK-SUM2 PIC 9(3).
      *A===B===========================================================R
      * 【手続き部】
      * 手続き部では主に各種処理を宣言したり、
      * 実行される手続きやエラーになった場合の処理内容を記述します。
      * また、STOP文を記述すれば、プログラムを終了することができます。 
      *A===B===========================================================R
       PROCEDURE DIVISION.
        MAIN SECTION.
      * 結果を出力する
           DISPLAY "Hello, Pro*COBOL!".
       STOP RUN.

1-2.DISPLAY文

       IDENTIFICATION DIVISION.
        PROGRAM-ID. DISPLAY_INPUT_SAMPLE02.
       ENVIRONMENT DIVISION.
        CONFIGURATION SECTION.
       DATA DIVISION.
        WORKING-STORAGE SECTION.
         01 INPUT-RECORD.
           03 IN-DATA-NUM PIC X(3).
           03 IN-DATA-STR PIC X(9).
       PROCEDURE DIVISION.
        MAIN.
      *>----------------------------------------------------
      *> コンソールに入力
      *>----------------------------------------------------
       DISPLAY "数値を入力してください。>> " WITH NO ADVANCING.
          ACCEPT IN-DATA-NUM FROM CONSOLE.
      *>----------------------------------------------------
      *> 入力した値が数値か判定する
      *>----------------------------------------------------
          IF IN-DATA-NUM IS NUMERIC THEN
              DISPLAY "IN-DATA-NUM = "IN-DATA-NUM UPON CONSOLE
          ELSE
              DISPLAY "数値以外が入力されました。"
          END-IF.
      *>----------------------------------------------------
      *> 環境変数から入力
      *>----------------------------------------------------
          ACCEPT IN-DATA-STR FROM DATE.
      *>----------------------------------------------------
      *> 入力した値が数値か判定する
      *>----------------------------------------------------
          IF IN-DATA-STR IS NUMERIC THEN
              DISPLAY "IN-DATA-STR = "IN-DATA-STR UPON CONSOLE
          ELSE
              DISPLAY "数値以外が入力されました。["IN-DATA-STR"]"
          END-IF.
       STOP RUN.

1-3.MOVE文

       IDENTIFICATION DIVISION.
        PROGRAM-ID. MOVE_SAMPLE04.
      *>文字列を扱う定数を定義する
       DATA DIVISION.
        WORKING-STORAGE SECTION.
         01 TEST-MOVE1 PIC x(3).
         01 TEST-MOVE2 PIC x(3).
         01 TEST-MOVE3 PIC x(3).
         01 TEST-MOVE4 PIC x(3).
         01 TEST-MOVE5 PIC x(3).
         
         01 TEST-MOVE_NUM1 PIC 9(2).
         01 TEST-MOVE_NUM2 PIC 9(2).
         01 TEST-MOVE_NUM3 PIC 9(2).
         01 TEST-MOVE_NUM4 PIC 9(2).
         01 TEST-MOVE_NUM5 PIC 9(2).
      *
       PROCEDURE DIVISION.
        MAIN SECTION.
         
      *>項目TEST-MOVE1に文字列を設定
            MOVE "ABC" TO TEST-MOVE1.
         
      *>それぞれの項目にTEST-MOVE1の値を転記する
            MOVE TEST-MOVE1 TO TEST-MOVE2 TEST-MOVE3
            TEST-MOVE4 TEST-MOVE5.
         
      *>項目TEST-MOVE_NUM1に数値を設定
            MOVE 3 TO TEST-MOVE_NUM1.
         
      *>それぞれの項目にTEST_MOVE_NUM1の値を転記する
            MOVE TEST-MOVE_NUM1 TO TEST-MOVE_NUM2 TEST-MOVE_NUM3
                                   TEST-MOVE_NUM4 TEST-MOVE_NUM5.
         
      *>結果を出力
            DISPLAY "["TEST-MOVE2 TEST-MOVE3 TEST-MOVE4 TEST-MOVE5"]".
      *               UPON CONSOLE.
            DISPLAY "["TEST-MOVE_NUM2 TEST-MOVE_NUM3 TEST-MOVE_NUM4
                     TEST-MOVE_NUM5"]" UPON CONSOLE.
       STOP RUN.

1-4.SUBTRACT関数

  ******************************************************************
  * ここでは、減算した結果を出力するプログラムを作成してみましょう *
  * 値を減算するにはSUBTRACT文を使用します。 
  * SUBTRACT文は以下のように記述します。 
  * 「SUBTRACT 減算する項目 FROM 減算対象項目.」 
  * 「減算対象項目 = 減算対象項目 – 減算する項目」となります。 
  ******************************************************************
  *A===B===========================================================R
  * 【見直し部】
  * 見出し部はCOBOLプログラムを識別するための部で、見出し部のみ節はありません。
  * PROGRAM-IDには作成するプログラム名などの情報を記述します。
  *A===B===========================================================R
   IDENTIFICATION DIVISION.
   PROGRAM-ID. SUBTRACT_SAMPLE.
  *A===B===========================================================R
  * 【環境部】
  * 環境部はプログラムを適用するコンピュータ名や、
  * 環境変数などの情報の定義を行う構成節(CONFIGURATION SECTION)と、
  * プログラムファイルを使用する場合に記述する入出力節(INPUT-OUTPUT SECTION)があります。
  *A===B===========================================================R
   ENVIRONMENT DIVISION.
  * 構成セクション
   CONFIGURATION SECTION.
  *A===B===========================================================R
  * 【データ部】
  * データ部はファイル節(FILE SECTION)
  *           作業場所節(WORKNG-STORAGE SECTION)
  *           連絡節(LINKAGE SECTION)
  *           通信節(COMMUNICATION SECTION)などから構成されます。
  * 主にプログラムで使用するデータ項目やファイルのレコードの宣言を行います。
  *A===B===========================================================R
   DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 WORK-AREA.
      03 WORK-GROUP-1.
        05 WORK-NUM PIC 9(3).
        05 WORK-SUM PIC 9(3).
      03 WORK-GROUP-2.
        05 WORK-NUM1 PIC 9(3).
        05 WORK-NUM2 PIC 9(3).
        05 WORK-SUM2 PIC 9(3).
  *A===B===========================================================R
  * 【手続き部】
  * 手続き部では主に各種処理を宣言したり、
  * 実行される手続きやエラーになった場合の処理内容を記述します。
  * また、STOP文を記述すれば、プログラムを終了することができます。 
  *A===B===========================================================R
   PROCEDURE DIVISION.
    MAIN SECTION.
  * 値を設定する
       MOVE 100 TO WORK-NUM.
       MOVE 300 TO WORK-SUM.
  * WORK-SUMに減算した結果を保存する
       SUBTRACT WORK-NUM FROM WORK-SUM.
  * 結果を出力する
       DISPLAY "結果①: "WORK-SUM.
  * COMPUTE「-」で減算
       COMPUTE WORK-SUM = WORK-SUM - WORK-NUM.
  * 結果を出力する
       DISPLAY "結果②: "WORK-SUM.
  *-----------------------------------------------------------------
  * 値を設定する
       MOVE 100 TO WORK-NUM1.
       MOVE 200 TO WORK-NUM2.
  * ADDで加算
       ADD WORK-NUM1 WORK-NUM2 TO WORK-SUM2.
  * 結果を出力する
       DISPLAY "結果③: "WORK-SUM2.
   STOP RUN.

1-5.IF文で単一分岐処理

       IDENTIFICATION DIVISION.
        PROGRAM-ID. QBDCOB05_IF.
       DATA DIVISION.
        FILE SECTION.
       WORKING-STORAGE SECTION.
        01 WORKING-AREA.
      * コンソール入力バッファ
        03 CONSOLE-INPUT PIC X(1).
         
       PROCEDURE DIVISION.
      *-------------------------------------------
      * 主手続
      *-------------------------------------------
       MAIN-PROCEDURE.
      * コンソール入力エリアの初期化
           MOVE SPACE TO CONSOLE-INPUT.
         
           EXEC-DISPLAY-INPUT-PROC.
      * コンソール表示&入力
           DISPLAY "数字を1文字入力してください".
           DISPLAY "0-8:CONTINUE  9:EXIT".
           ACCEPT CONSOLE-INPUT FROM CONSOLE.
         
      * 9以外が入力された場合、コンソール表示&入力を繰り返す
           IF (CONSOLE-INPUT >= 1) AND
              (CONSOLE-INPUT <= 8) THEN
                  GO TO EXEC-DISPLAY-INPUT-PROC
           ELSE IF (CONSOLE-INPUT = 9) THEN
                   DISPLAY "プログラムを終了します"
               ELSE
                   DISPLAY "1から9までの数字を入力してください"
                   GO TO EXEC-DISPLAY-INPUT-PROC
               END-IF
           END-IF.
         
       STOP RUN.

1-6.EVALUATE文で多分岐処理

   IDENTIFICATION DIVISION.
    PROGRAM-ID. QBDCOB06_EVALUATE.
   DATA DIVISION.
    FILE SECTION.
    WORKING-STORAGE SECTION.
     01 WORKING-AREA.
  * コンソール入力バッファ
      03 CONSOLE-INPUT PIC X(1).
  *>----------------------------------------------------
  *> 主手続
  *>----------------------------------------------------
   PROCEDURE DIVISION.
    MAIN-PROCEDURE.
  * コンソール入力エリアの初期化
       MOVE SPACE TO CONSOLE-INPUT.
       EXEC-DISPLAY-INPUT-PROC.
  * コンソール表示&入力
       DISPLAY "数字を1文字入力してください".
       DISPLAY "0-8:CONTINUE 9:EXIT".
       ACCEPT CONSOLE-INPUT FROM CONSOLE.
  * 9以外が入力された場合、コンソール表示&入力を繰り返す
       EVALUATE CONSOLE-INPUT
         WHEN 0 THRU 8
           GO TO EXEC-DISPLAY-INPUT-PROC
         WHEN 9
           DISPLAY "プログラムを終了します"
         WHEN OTHER
           DISPLAY "0から9までの数字を入力してください"
           GO TO EXEC-DISPLAY-INPUT-PROC
       END-EVALUATE.
   STOP RUN.

1-7.UNTIL文

      **********************************************
      * COBOLプログラムの作成  
      ***********************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID.loop.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 I PIC 9(2).
       01 CNT PIC 9(2).
       PROCEDURE DIVISION.
       MAIN.
        MOVE 0 TO I
        MOVE 0 TO CNT
           PERFORM UNTIL I >= 10
            ADD 1 TO I
            ADD I TO CNT
            DISPLAY "I=" I ", CNT=" CNT
           END-PERFORM.
           DISPLAY "CNT=" CNT
           STOP RUN.
           END PROGRAM loop.

1-8.CALCULATION文

      **********************************************
      * COBOLプログラムの作成  
      ***********************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. QBDCOB07_CALCULATION.
        ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
        DATA DIVISION.
       WORKING-STORAGE SECTION.
      *>----------------------------------------------------
      *> 数値項目を定義
      *>----------------------------------------------------
        01 SAMPLE-DATA.
      *>整数4桁、小数点以下5桁
         03 NUM-A        PIC 9(4)V9(5) VALUE 1111.12345.
      *>整数2桁、小数点以下5桁
         03 NUM-B        PIC 9(2)V9(5) VALUE 10.11356.
         03 SUM-DATA     PIC 9(5)V9(5).
       PROCEDURE DIVISION.
        MAIN.
      *>----------------------------------------------------
      *> 計算処理(COMPUTE)
      *>----------------------------------------------------
      *> 加算
           COMPUTE SUM-DATA = NUM-A + NUM-B.
           DISPLAY "加算結果:"SUM-DATA.
      *> 減算
           COMPUTE SUM-DATA = NUM-A - NUM-B.
           DISPLAY "減算結果:"SUM-DATA.
      *> 乗算
           COMPUTE SUM-DATA = NUM-A * NUM-B.
           DISPLAY "乗算結果:"SUM-DATA.
      *> 除算
           COMPUTE SUM-DATA = NUM-A / NUM-B.
           DISPLAY "除算結果:"SUM-DATA.
      *===========================================================
      *ADD文は「SUM-DATA = NUM-A + NUM-B」
      *SUBTRACT文は「SUM-DATA = NUM-A ? NUM-C」
      *MULTIPLY文は「SUM-DATA = NUM-A * NUM-B」
      *DIVIDE文は「SUM-DATA = NUM-A / NUM-C」 
      *===========================================================
       STOP RUN.

1-9.SORT文

      **********************************************
      * COBOLプログラムの作成  
      ***********************************************
       IDENTIFICATION DIVISION.
        PROGRAM-ID. QBDCOB09_SORT.
       ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
          FILE-CONTROL.
      * 商品ファイル (入力ファイル)
          SELECT IN-FILE ASSIGN TO "dat/SHOHIN.txt"
                 ORGANIZATION IS LINE SEQUENTIAL.
      * 整列併合用ファイル (中間ファイル)
          SELECT ST-FILE ASSIGN TO "dat/ST01".
      * ソート後商品ファイル (出力ファイル)
          SELECT OUT-FILE ASSIGN TO "dat/SHOHIN-SORT.txt"
                 ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
        FILE SECTION.
      * 商品ファイル (入力ファイル)
        FD IN-FILE.
         01 IN-REC.
          03 IN-SHOHIN-CODE PIC 9(003).
          03 IN-SHOHIN-MEI PIC X(010).
          03 IN-SHOHIN-KAKAKU PIC 9(004).
      * 整列併合用ファイル (中間ファイル)
        SD ST-FILE.
         01 ST-REC.
          03 ST-SHOHIN-CODE PIC 9(003).
          03 ST-SHOHIN-MEI PIC X(010).
          03 ST-SHOHIN-KAKAKU PIC 9(004).
      * ソート後商品ファイル (出力ファイル)
        FD OUT-FILE.
         01 OUT-REC.
          03 OUT-SHOHIN-CODE PIC 9(003).
          03 OUT-SHOHIN-MEI PIC X(010).
          03 OUT-SHOHIN-KAKAKU PIC 9(004).
      *-------------------------------------------
      * 主手続
      *-------------------------------------------
       PROCEDURE DIVISION.
        MAIN-PROCEDURE.
           DISPLAY "ソート処理を開始します".
           SORT ST-FILE
            ON ASCENDING KEY ST-SHOHIN-CODE
            USING IN-FILE
            GIVING OUT-FILE.
           DISPLAY "ソート処理が終了しました".
       STOP RUN.

1-10.SEQUENTIALFILE文

      **********************************************
      * COBOLプログラムの作成  
      ***********************************************
       IDENTIFICATION DIVISION.
        PROGRAM-ID. QBDCOB10_SEQUENTIALFILE.
       ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
         FILE-CONTROL.
      *>------------------------------
      *> ファイルを指定する
      *>------------------------------
         SELECT SAMPLE-FILE ASSIGN TO 'sample.txt'
            ORGANIZATION IS LINE SEQUENTIAL
            FILE STATUS IS IN-FILE-STATUS.
       DATA DIVISION.
        FILE SECTION.
         FD SAMPLE-FILE.
          01 OUT-FILE-REC   PIC X(50).
          01 IN-FILE-REC    PIC X(50).
        WORKING-STORAGE SECTION.
          01 IN-FILE-STATUS PIC X(02).
          01 ITEM           PIC X(50).
       PROCEDURE DIVISION.
      *>------------------------------
      *> ファイルの書き込み
      *>------------------------------
           OPEN OUTPUT SAMPLE-FILE.
           DISPLAY "レコードの書き込み";
           PERFORM UNTIL ITEM = "99"
               DISPLAY "レコードを入力してください(終了:99)。>> "
               WITH NO ADVANCING ACCEPT ITEM
               IF ITEM NOT= "99" THEN
                   MOVE ITEM TO OUT-FILE-REC
                   WRITE OUT-FILE-REC
                   DISPLAY "WRITE: "OUT-FILE-REC
               END-IF
           END-PERFORM.
           CLOSE SAMPLE-FILE.
      *>------------------------------
      *> ファイルの読み込み
      *>------------------------------
           OPEN INPUT SAMPLE-FILE.
           DISPLAY "レコードの読み込み";
      *>1レコードずつ読み込む
           PERFORM UNTIL IN-FILE-STATUS NOT = "00"
             READ SAMPLE-FILE
              AT END
                 DISPLAY "READ END";
              NOT AT END
                 DISPLAY "READ: "IN-FILE-REC
             END-READ
           END-PERFORM.
           CLOSE SAMPLE-FILE.
       STOP RUN.

Follow me!