シェルスクリプトマガジン

特集1 COBOL入門(Vol.86記載)

著者:比毛 寛之

レガシー問題や技術者不足などで話題の多いプログラミング言語が「COBOL」です 。古い言語というイメージがありますが、ISOから2023年の新規格が公表されたことでも分かるように、現在も進化を続けています。本特集では、COBOLの現状を紹介しつつ、「opensource COBOL 4J」というオープンソースソフトウエアのCOBOLコンパイラを使ってCOBOL言語の基本を解説します。

シェルスクリプトマガジン Vol.86は以下のリンク先でご購入できます。

図1 「HELLO WORLD!」という文字列を表示するCOBOLのサンプルコード

----+----1----+----2----+----3----+----4----+----5
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLOWORLD.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MY-TEXT PIC X(20).
       PROCEDURE DIVISION.
       MAIN-RTN.
           MOVE "HELLO WORLD!" TO MY-TEXT.
           DISPLAY MY-TEXT.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5

図4 COBOLのサンプルコード

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MYCOBOL.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MY-GRP.
      *    03  MY-WORK-X     PIC X(10).                                 20230804
           03  MY-WORK-X2    PIC X(10).                                 20230804
           03  MY-WORK-9     PIC 9(05).
      ********************************************
       PROCEDURE DIVISION.
      ********************************************
       PROC1 SECTION.
       PROC1-000.
      *    MOVE "ABC" TO MY-WORK-X.                                     20230804
           MOVE "DEF" TO MY-WORK-X2.                                    20230804
           MOVE 100   TO MY-WORK-9.
       PROC1-900.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8

図5 コンソールからの入力と画面への出力をするサンプルコード

----+----1----+----2----+----3----+----4----+----5----+
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MY-NAME PIC X(20).
       PROCEDURE DIVISION.
       MAIN-RTN.
           DISPLAY "Enter your name: " NO ADVANCING.
           ACCEPT  MY-NAME.
           DISPLAY "Hello " MY-NAME.
       MAIN-EXIT.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+

図6 ファイルにデータを出力するサンプルコード

----+----1----+----2----+----3----+----4----+----5----+----6----+----7
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPWRITE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO "EMPFILE"
                  ORGANIZATION IS INDEXED
                  ACCESS MODE  IS  DYNAMIC
                  RECORD KEY   IS  EMP-CD
                  FILE STATUS  IS  EMP-STS.
       DATA DIVISION.
       FILE SECTION.
       FD  EMP-FILE.
       01  EMP-REC.
           03  EMP-CD         PIC X(04).
           03  EMP-NAME       PIC X(20).
           03  EMP-DPT-CD     PIC X(02).
           03  EMP-ENT-DATE   PIC 9(08).
       WORKING-STORAGE SECTION.
       01  EMP-STS            PIC  9(02).
       PROCEDURE DIVISION.
       MAIN-CONTROL SECTION.
       MAIN-000.
           DISPLAY "*** Creating Employee file ***".
           OPEN  OUTPUT EMP-FILE.
      *
           MOVE  "0011"            TO   EMP-CD.
           MOVE  "Saitama Saburo"  TO   EMP-NAME.
           MOVE  "01"              TO   EMP-DPT-CD.
           MOVE  20020401          TO   EMP-ENT-DATE.
           WRITE EMP-REC.
      *                        ----+----+----+----+----+----+----+
           WRITE EMP-REC FROM "0012Chiba Jiro          0219990401".
           WRITE EMP-REC FROM "0013Tokyo Taro          0319970401".
           WRITE EMP-REC FROM "0014Kanagawa Shiro      0120120401".
           WRITE EMP-REC FROM "0015Niigata  Goroo      0220010401".
      *                        ----+----+----+----+----+----+----+
           CLOSE EMP-FILE.
       MAIN-900.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7

図7 ファイル中のレコードを読み出して画面に表示するサンプルコード

----+----1----+----2----+----3----+----4----+----5----+----6----+
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPLIST.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO "EMPFILE"
                  ORGANIZATION IS INDEXED
                  ACCESS MODE  IS  DYNAMIC
                  RECORD KEY   IS  EMP-CD
                  FILE STATUS  IS  EMP-STS.
       DATA DIVISION.
       FILE SECTION.
       FD  EMP-FILE.
       01  EMP-REC.
           03  EMP-CD         PIC X(04).
           03  EMP-NAME       PIC X(20).
           03  EMP-DPT-CD     PIC X(02).
           03  EMP-ENT-DATE   PIC 9(08).
       WORKING-STORAGE SECTION.
       01  EMP-STS            PIC 9(02).
       01  DSP-REC.
           03  DSP-CD         PIC X(04).
           03  FILLER         PIC X.
           03  DSP-NAME       PIC X(20).
           03  FILLER         PIC XX.
           03  DSP-DPT-CD     PIC X(02).
           03  FILLER         PIC X.
           03  DSP-ENT-DATE   PIC 9999/99/99.
       PROCEDURE DIVISION.
       MAIN-CONTROL SECTION.
       MAIN-000.
           OPEN  INPUT EMP-FILE.
           DISPLAY "*** Employee List ***".
           DISPLAY "ID   Employee Name        Dpt Enter date".
           DISPLAY "---- -------------------- --- ----------".
           PERFORM UNTIL (EMP-STS NOT = ZERO)
             READ EMP-FILE NEXT
               AT END
                  DISPLAY "EOF"
               NOT AT END
                  MOVE   EMP-CD         TO   DSP-CD
                  MOVE   EMP-NAME       TO   DSP-NAME
                  MOVE   EMP-DPT-CD     TO   DSP-DPT-CD
                  MOVE   EMP-ENT-DATE   TO   DSP-ENT-DATE
                  DISPLAY DSP-REC
             END-READ
           END-PERFORM.
           CLOSE EMP-FILE.
       MAIN-900.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+

図9 「EMPSEARCH.cbl」ファイルに記述するコード

----+----1----+----2----+----3----+----4----+----5----+----6----+-
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPSEARCH.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WK-AREA.
         03  WK-CD        PIC X(04).
         03  WK-NAME      PIC X(20).
         03  WK-DPT-CD    PIC X(02).
         03  WK-ENT-DATE  PIC 9(08).
         03  WK-RETURN    PIC 9(01).
       PROCEDURE DIVISION.
       MAIN-RTN.
           DISPLAY "*** Employee Search ***".
           DISPLAY "Code:     : " NO ADVANCING.
           ACCEPT  WK-CD.
           CALL   "EMPREAD" USING WK-CD, WK-NAME, WK-DPT-CD,
                                  WK-ENT-DATE, WK-RETURN.
           IF WK-RETURN = ZERO
              DISPLAY "Name      : " WK-NAME
              DISPLAY "Dept code : " WK-DPT-CD
              DISPLAY "Enter date: " WK-ENT-DATE
           ELSE
              DISPLAY "Employee not found!"
           END-IF.
       MAIN-EXIT.
           STOP RUN.
----+----1----+----2----+----3----+----4----+----5----+----6----+-

図10 「EMPREAD.cbl」ファイルに記述するコード

----+----1----+----2----+----3----+----4----+----5----+----6----+----7
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EMPREAD.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO "EMPFILE"
                  ORGANIZATION IS INDEXED
                  ACCESS MODE  IS  DYNAMIC
                  RECORD KEY   IS  EMP-CD
                  FILE STATUS  IS  EMP-STS.
       DATA DIVISION.
       FILE SECTION.
       FD  EMP-FILE.
       01  EMP-REC.
           03  EMP-CD         PIC X(04).
           03  EMP-NAME       PIC X(20).
           03  EMP-DPT-CD     PIC X(02).
           03  EMP-ENT-DATE   PIC 9(08).
       WORKING-STORAGE SECTION.
       01  EMP-STS            PIC  9(02).
       LINKAGE SECTION.
       01  LK-CD              PIC X(04).
       01  LK-NAME            PIC X(20).
       01  LK-DPT-CD          PIC X(02).
       01  LK-ENT-DATE        PIC 9(08).
       01  LK-RETURN          PIC 9(01).
       PROCEDURE DIVISION     USING     LK-CD, LK-NAME, LK-DPT-CD,
                                        LK-ENT-DATE, LK-RETURN.
       MAIN-CONTROL SECTION.
       MAIN-000.
           INITIALIZE EMP-REC.
           MOVE  ZERO         TO   LK-RETURN.
           OPEN  INPUT EMP-FILE.
           MOVE  LK-CD        TO   EMP-CD.
           READ  EMP-FILE KEY IS   EMP-CD
             INVALID KEY
                 MOVE  1      TO   LK-RETURN
           END-READ.
           MOVE  EMP-NAME     TO   LK-NAME.
           MOVE  EMP-DPT-CD   TO   LK-DPT-CD.
           MOVE  EMP-ENT-DATE TO   LK-ENT-DATE.
           CLOSE EMP-FILE.
       MAIN-900.
           EXIT PROGRAM.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7

図11 「EmpSearchDemo.java」ファイルに記述するコード

import jp.osscons.opensourcecobol.libcobj.ui.*;

public class EmpSearchDemo {
    public static void main(String[] args) throws Exception {
        EMPREAD prog = new EMPREAD();
        CobolResultSet rs = prog.execute("0011", "", "", 0, 0);
        System.out.println("*** Employee Search from Java ***");
        System.out.println("Code      : " + rs.getString(1));
        System.out.println("Name      : " + rs.getString(2));
        System.out.println("Dept code : " + rs.getString(3));
        System.out.println("Enter date: " + rs.getInt(4));
    }
}