ここでは、コボルの表記方法・定数・変数などについて説明します。定数や変数は色々なパターンがあり、全て網羅し使いこなすのは困難です。私も基本的なものしか憶えていません。実際にプログラムを作成するにあたり、最低限憶えなければいけないことのみ重点的に説明します。しっかり身につけて下さい。
では早速お手元のコーディング用紙を見て下さい。えっ持ってない?じゃあ無くても構いません。COBOLでは1行に80桁まで記述ができます。(桁のことをカラムと言います。以後の表記はカラムで記述します。)
まず大きく分けて一連番号領域・標識領域・A領域・B領域・プログラム識別領域という5つに分類できます。では順に説明します。
プログラム行を識別するために使用されます。コーディング上は書く必要はありません。プログラム翻訳時にこの領域は無視され、番号は自動的に振られます。憶えなくて構いません。また、市販されているエディターでは、この部分自体を省いた形式で利用するソフトが大半を占めています。
通常のコーディング時は空白のままで使用しません。コメントをつける場合や前の行からの文字列が続いている場合にはココに特定の文字を記述します。
- *(アスタリスク)コメント行とし、以下のカラムをコメントとして使用できます。
- -(ハイフン)文字列のつなぎとみなし、以下のカラム記述を前行からの続きだとみなします。
- /(スラッシュ)翻訳リスト時にここで改頁されます。また以下のカラムはコメントとして使用できます。
各部や節の見出し(○△ DIVISION や □△ SECTION)、段落の見出し等を記述します。またDATA部のFD句やレコード記述の01、作業領域節の01,77,88なんかも同様にここから記述を始めます。
各段落を構成する文(命令文も含む)を記述する場所です。ピリオドも必ずこの中で収まるようにしなければなりません。いわばメインの領域と言っても過言ではないでしょう。いや少し大袈裟ですね。
ここは全てコメントとして扱われ、プログラム翻訳時には無視されます。書く必要はありません。たまに間違えて73カラム目にピリオドつけるバカがいます。コンパイルエラーを見て「どこがエラーだゴルァァ」なんてゴリラみたいな顔で叫んでます。ええ私ですとも。
COBOLでは特定の文字と記号以外は受け付けてくれません。年寄りなんで仕方ありません。じゃあ使える文字と数字、記号を一気に紹介します。暗記パンとか画面に押し付けて無理矢理記憶しましょう。
なお、英小文字は対応する英大文字と同じとみなされます。但し英大文字と英小文字を合わせの文字定数、コメントなんかには任意の文字を使っても構いません。
COBOLで使用可能な文字列の紹介をします。これは大きく利用者定義語と予約語に分類できます。利用者定義語とは利用者、つまりアナタが勝手に名前をつけられる文字(文字列)のことを差しています。予約語とはFILEやSECTION、MOVEやWRITE、HIGH-VALUE、ZEROなどなど、予めCOBOL言語上で利用する定義をされている文字列や数値を差しています。以下に簡単な解説を掲載します。
利用者定義語には以下のものがある
必要語・補助語・表意定数・特殊文字などがある
プログラムの構文を規定するための幹になる語
プログラムの構文を規定するための幹になる語であるが、文章を整えるために記述するもので、記述しなくても翻訳結果に変わりはない。
プログラムでよく使われる値には、固有のデータ名がつけられている
- ZERO,ZEROS,ZEROES:何桁かの0
- SPACE,SPACES:1つ以上の空白が連続する文字列を意味する
- QUOTE,QUOTES:1つ以上の引用符が連続する文字列を意味する
- HIGH-VALUE,HIGH-VALUES:最高の値を有する文字列
- LOW-VALUE,LOW-VALUES:最小の値を有する文字列
- ALL定数:指定した文字定数を1回以上反復し連続させた文字列を意味する
部分参照とは、データ項目に対して最左端の文字と長さを指定する事によってデータ項目を定義することが可能になります。例えば、こんな感じで…
01 text pic x(10) value "ABCDEFGHIJ".
textという10桁の文字項目にA~Jまでのアルファベットが入っています。この3桁目から7桁目までの5文字を表示してみると、以下のようになります。
        Display text ( 3 : 5 )
表示結果 ==> CDEFG
構文は以下の通りです。
形式
 
| データ名1(最左端文字位置:[長さ]) | 
構文規則
一般規則
時々COBOL熟練者様からもお便りを戴きます。その中で自分が初めてCOBOL言語に触れたとき、クセがあるなと気づいた点を指摘していただきました。この場を借りてお礼申し上げます。私もCOBOLに慣れ過ぎ、すっかり忘れていました。言われてみればナルホドと頷くものばかりです。例題を挙げながら解説します。現時点で命令語や文法は理解しなくて構いません。必ず後々この頁を見直す時が訪れます。
※他にも何か気づいた点がございましたらメールでお知らせ下さると助かります。
 
IDENTIFICATION. DIVISION. * ENVIRON.MENT DIVISION. * CONFIGURATION. SECTION. こういう簡単なエラーはわかり易いのでいいんですけどね
IDENTIFICATION DIVISION * FILE-CONTROL これも簡単ですね。どの予約語にピリオドが必須なのか、よく覚えましょう。
IDENTIFICATIONDIVISION. PROGRAM-ID.12345678. 当たり前のことですが、予約語(命令語)の直後に連続して英数字を書いていたら、 誰だって意味がわかりません。それは機械でも同じことです。ピリオドがあってもダメ なものはダメですよ!
 DATE DIVISION.
*
      WRITO A FROM B.
*
      DISPLEY "ABC".
えっと、話になりません。以上です。必死に覚えましょう。
PROGRAM-ID. 12345678. * PROGRAM-ID. @1234567. プログラム名は必ず英字で始まる必要があります。
PROGRAM-ID. ABC123456. プログラム名は8文字以内で収まらなければなりません。最低3文字以上の名前にしましょう。
01 W-TEXT PIC X(4) VALUE "". *> 正解は以下の通り ↓ 01 W-TEXT PIC X(4) VALUE SPACE. *>もしくは↓ 01 W-TEXT PIC X(4) VALUE " ". これも他言語ではよく利用されますが、COBOLでは禁止になっています。注意して下さい。
01 IN-CNT PIC 9(2) VALUE 100. 01 W-TEXT PIC X(4) VALUE "ABCDE". 桁数以上の初期値は設定できません。結構頻繁に見かけるエラーです。
01 IN-CNT PIC 9(4) VALUE 100. *>データは"0100"になる 01 W-TEXT PIC X(6) VALUE "ABCDE". *>データは"ABCDE "になる 桁数以内であれば必ずしも桁数に達している必要はありません。 空いた列には数字であればゼロ、文字であれば空白が入ります。
LINKAGE SECTION. 01 L-PARA1 PIC X(1). 01 L-PARA2 PIC X(5). PROCEDURE DIVISION USING L-PARA1. *> 正解は以下の通り ↓ PROCEDURE DIVISION USING L-PARA1 L-PARA2. 外部パラメータを利用する場合、独立項目(01レベル)は全て記述する必要があります。
 LINKAGE SECTION.
 01  L-PARA.
     03  L-P1  PIC X(1).
     03  L-P2  PIC X(5).
 PROCEDURE DIVISION USING L-P1 L-P2.
   *> 正解は以下の通り ↓
 PROCEDURE DIVISION USING L-PARA.
集団項目の場合、LINKAGE SECTIONの指定は、必ずトップ項目を記述しなければなりません。
         IF  A = ZERO
            MOVE  1  TO  B.
            MOVE  2  TO  C.
         END-IF.
ピリオドは文の終わりを意味します。上記の場合ではEND-IFの記述と同じ扱いになります。
MOVE 2 TO C は無条件で処理、最後の END-IF はエラーとなります。
         IF  A = ZERO
            MOVE  1  TO  B.
         IF  A = ZERO
           MOVE  1  TO  B
           MOVE  2  TO  C.
         PERFORM UNTIL IN-REC = HIGHVALUE
            PERFORM  READ-R.
         READ  IN-FILE
            AT END
               MOVE  HIGH-VALUE TO IN-REC.
        START  IN-FILE
            INVALID  "1" TO FLAG.
       SEARCH  WK-TABLE
           AT END  MOVE  1 TO FLAG
           WHEN  WK-AAA(IDX) = ZZ-AAA
               MOVE  99  TO  FLAG.
このように、命令の終了である"END"は、ピリオドをつける事で省略可能になります。
(END-IF,END-READ,END-PERFORM,END-START,END-STRING、などなど)
私個人の意見としては、命令文はIF~END-IF,PERFORM~END-PERFORMのように、
必ずEND-XXXXで終わるのが基本だと思います。また省略することで混乱の原因にもな
りお薦めできません。必ず"END"の記述するように心掛けましょう。
...1.T..*....2....*....3....*....4....*....5....*....6....*....7.
     MOVE   1    TO   B   C   D   E   F   G   H   I   J   K   L   M  N  O  P.
このMOVE命令はLまでで、以降のM~Pまでは無視されます。
また80カラムを超える行は翻訳ソフトによって扱えません。
折り返す場合には7カラム目に"-"を記述しましょう。
記述するなら以下のようになります。
...1.T..*....2....*....3....*....4....*....5....*....6....*....7.
     MOVE   1    TO   B   C   D   E   F   G   H   I   J   K   L
-                     M   N   O   P.
 LOOP  SECTION.
     PERFORM   OPEN-R
     EVALUATE  TRUE
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-M
         WHEN MST-KEY < TRN-KEY
                PERFORM WRITE-R
                PERFORM   READ-T
                PERFORM   READ-M
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-T
     END-EVALUATE
     PERFORM CLOSE-R
 LOOP-E. EXIT.
このようにPROCEDURE内で独自に作成した処理別のSECTIONを利用
する場合には、SECTIONの最後の行には必ずピリオドが必要です。
上記の例では最後の命令である、「PERFORM CLOSE-R」にピリオドを
つけ、「PERFORM CLOSE-R.」としなくてはなりません。
勿論、各命令の最後に全てピリオドをつけても構いません。
以下の2つの例はどちらでもOKになります。
 LOOP  SECTION.
     PERFORM   OPEN-R
     EVALUATE  TRUE
         WHEN MST-KEY < TRN-KEY
                PERFORM   READ-M
         WHEN MST-KEY = TRN-KEY
                PERFORM   WRITE-R
                PERFORM   READ-T
                PERFORM   READ-M
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-T
     END-EVALUATE
     PERFORM CLOSE-R.
 LOOP-E. EXIT.
 LOOP  SECTION.
     PERFORM   OPEN-R.
     EVALUATE  TRUE
         WHEN MST-KEY < TRN-KEY
                PERFORM   READ-M
         WHEN MST-KEY = TRN-KEY
                PERFORM   WRITE-R
                PERFORM   READ-T
                PERFORM   READ-M
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-T
     END-EVALUATE.
     PERFORM CLOSE-R.
 LOOP-E. EXIT.
上記の2パターンは全く同じ動作をします。全ての文の最後にピリオドをつけてもいいし、
最後の一行にだけピリオドをつけても動作は変わらない、ということを理解して下さい。
         IF  A = ZERO
           THEN
               MOVE  1  TO  B
         END-IF
IF文はIF  THEN  ELSE  END-IFというのが一連の流れなんですが、COBOLの場合、
THENの記述は省略が可能になっています。別に書いても構いません。エラーにもなりま
せん。ですが、現状ではほとんど記述を省略されています。
| 
 | ||||||||
| 
 | ||||||||
| 
 | 
色々と憶えることはありますが、実際のプログラムのソースコードを見ながら解説したほうがわかり易いと思います。
まずBasic言語の場合の記述から。
PRINT "*** HIYOKO-GUMI ***";
続いてC言語の場合。
#include <stdio.h>
main()
{
  printf("*** HIYOKO-GUMI ***\n");
}
最後にCOBOL言語の記述です。
 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                DSP001.
 PROCEDURE                  DIVISION.
    DISPLAY  "*** HIYOKO GUMI ***"
    STOP RUN.
どうですか?同じ一行を表示するだけなのに、言語によって記述がこんなにも違うのです。明かにCOBOLのソースコードは書くのが面倒ですよね。COBOLというのは、記述式の言語なので、必ず書かなければならないキーワードが沢山あります。その点、Basicは命令文だけで済んでいます。これこそが言語の特徴であり違いと言えます。
 
COBOLには必ず『●● DIVISION.』という文が書かれています。COBOLは、この文節を1つの区切りとしプログラムを記述します。このDIVISIONは全部で4つあり、書く場所も、順序も、利用目的も最初から決まっています。
プログラムの名前などを記述します
ファイルを利用する場合など、実行環境を記述します
プログラムで使用するデータ項目について記述します
実際のプログラム(命令語)を記述します
COBOLは必ずこの4つの段落で構成されています。順序もこの通りでなければいけません。COBOLプログラムに慣れないうちは難解に感じますが、あまり難しく考えないで下さい。COBOL言語の決まり事です。そういうものなんだと思って下さい。逆に考えれば記述場所が決められているお陰で、他人が作成したプログラムであってもある程度の事は瞬時に理解できます。現段階では、4つの部に分けて記述しなきゃいけないってコトが理解できればOK!
 
まず最初に登場する見出し部について簡単に説明します。
 PROCEDURE          DIVISION.
    DISPLAY "*** HIYOKO GUMI ***"
    STOP RUN.
色つきの行が見出し部になります。特に赤色で表示している箇所は、COBOLプログラムでは必ず書く必要があります。
 
見出し部には、プログラムを識別するための情報を記述します。注意点として、プログラム名が挙げられます。他プログラムからコピーした場合には、プログラム名の変更を必ず行ないましょう。同じプログラム名のままコンパイルを行なうと、大事なオブジェクトが上書きされる危険があります。プログラム名の約束として、必ず英字から始まる8桁以内の英数字で表記します。
その他のDIVISIONに関しては、登場する都度に説明します。
 
最後に書く部がこの「手続き部」になります。
IDENTIFICATION DIVISION. PROGRAM-ID. DSP001. PROCEDURE DIVISION以降が実際のプログラムになります。 必ず各部、各節の最後にピリオドをつけること!
色つきの行が手続き部です。ここがCOBOLの心臓になる命令語の記述場所です。結局、この部がないとCOBOLプログラムは成り立ちません。「ファイルを読んで下さい」、「ファイルに書いて下さい」、「今日の日付は?」、「表の中に同じ名前はあるか探して」などなど、コンピュータにやってほしい事を上から順番に記述します。こう考えると、BASIC言語などは、いきなり手続き部から書くことができますね。プログラムは、他人がみてもわかりやすいプログラムを作るよう努めましょう。
その他のDIVISIONに関しては、登場する都度に説明します。