添字を使ってすぐ取れる。COBOL OCCURS句でテーブル定義。

折乃 杏

折乃 杏

インフラエンジニア/ヘルプデスク(COBOLも経験あり)/ボールド歴3年

COBOLでは、繰り返しデータを定義する際に使用する「OCCURS句」があります。繰り返しデータは「表」または「表データ」や「テーブル」と呼ばれたりもしますが、OCCURS句は、これを効率よく使用するための定義方法です。

まずは「OCCURS句」「表」「添字」この3つの言葉を覚えて、COBOLでの「表」の定義と利用方法の基礎を覚えましょう。


1.OCCURS句って?

OCCURS句は表の定義のために使用しますが、COBOLで「表」とはどのようなデータを指すのでしょう。

例として月ごとの売上額が保存されているデータがあるとします。「月ごと」ですから、1年分を1レコードで保存するとしたら、12カ月分の項目が必要になります。そして、なぜか各月を「1月」「2月」という表記ではなく「睦月」「如月」と陰暦で表示をするため名称も一緒に保存しているとします。そのまま並べると下記のようになります。

    03  IN-FILE-M1    PIC  N(004).     ←陰暦名
    03  IN-FILE-KINGAKU1  PIC 9(007).     ←金額
    03  IN-FILE-M2    PIC  N(004).
    03  IN-FILE-KINGAKU2  PIC 9(007).   
    03  IN-FILE-M3    PIC  N(004).
    03  IN-FILE-KINGAKU3  PIC 9(007).  
       ・
       ・
       ・ 
    03  IN-FILE-M12    PIC  N(004).
    03  IN-FILE-KINGAKU12  PIC 9(007).  

このままでも使用できないことはありませんが、同じ属性、同じバイト数の項目を全て項目名を変えて定義するのは面倒です。(同じ項目名を定義することはできないので重複しないようにしなければなりません)

そこで、OCCURS句を使用し「表」として定義をして、ラクをしようというわけです。IN-FILE-Mは必ず陰暦名が入りますし、IN-FILE-KINGAKUには必ずその月の売上額が入ります。

このように、同じ目的で使用する項目の集団を「表」と呼んでいます。

1-1.OCCURS句の書式

上記の例をOCCURS句を使用して書き換えてみましょう。以下のように3行で済みます。

    03   URIAGE-TBL  OCCURS 12      ←表の名前と繰り返し数を指定
         05  IN-FILE-M    PIC  N(004).     ←繰り返す項目(陰暦名)
         05  IN-FILE-KINGAKU  PIC 9(007).     ←      (金額)

OCCURS 12」なので、日本語4文字(8バイト)と数字7バイトを12回繰り返して180バイト使用していることになります。

この例は1年=12カ月なので、12回繰り返せばよいため繰り返し回数を「12」とそのまま指定しています。もしも、将来1年が12カ月ではなくなり、年ごとに月数が異なる時代が来た場合は、ここをその都度変更できるようにしておかなければなりません。その場合は以下のような記述になります。

  03   URIAGE. 
     05   URIAGE-TBL2 OCCURS 1 TO 30 DEPENDING ON TUKI-MAX INDEXED BY TUKI-IDX. ←30カ月まで対応
       07  IN-FILE-M        PIC  N(004).     ←陰暦名
       07  IN-FILE-KINGAKU  PIC  9(007).       ←金額
(略)
**
PROCEDURE            DIVISION.
**
(略)
  MOVE  20  TO  TUKI-MAX.             ←月数の設定。この場合URIAGE-TBL2のレコード数は20になります。

1-2.PERFORM命令との違い

PERFORM命令は一連の「処理」を繰り返すための命令文です。

記述する場所もPERFORM命令はPROCEDURE DIVISIONに記述しますが、OCCURS句はDATA DIVISIONで記述します。

1-3.REDEFINES句との違い

REDEFINES句は、同じエリアを使って再定義することを示しています。

    03  IN-FILE-YMD    PIC  9(008).
    03  IN-FILE-YMD-R  REDEFINES  IN-FILE-YMD.   
        05  IN-FILE-YYYY  PIC  9(004).
        05  IN-FILE-MM    PIC  9(002).
        05  IN-FILE-DD    PIC  9(002).

上記の例ですと、8バイトの項目を4-2-2、と分けました、と定義していますので、実際に使用しているのは8バイトのままです。


2.OCCURS句の使用例

それでは表のデータをどのように使用するのでしょうか。ここで「添字」の出番です。「添字」は「表の中のx番目」と指定する役割があります。

以下の例では1から12まで順番に「IN-FILE-M」と「IN-FILE-KINGAKU」のデータを画面に表示します。

DATA                          DIVISION.
WORKING-STORAGE               SECTION.
      03   WTUKI              PIC 9(002)   ←添字用項目
     03   URIAGE-TBL  OCCURS 12 
         05  IN-FILE-M        PIC  N(004). 
         05  IN-FILE-KINGAKU  PIC  9(007). 
***
PROCEDURE            DIVISION.
**
(略)
***
PERFORM   VARYING   WTUKI  FROM  1  BY  1  UNTIL  WTUKI  =  12
DISPLAY IN-FILE-M(WTUKI)  UPON  CONSOLE            ←添字で「x番目」を指定
DISPLAY IN-FILE-KINGAKU(WTUKI)  UPON  CONSOLE         ←同上
 END-PERFORM.
*
STOP RUN. 

表の中で「x番目」と直接指定することもできます。その場合は以下のように指定します。

【例:5番目を表示させたい場合】

DISPLAY IN-FILE-M(5)  UPON  CONSOLE
DISPLAY IN-FILE-KINGAKU(5)  UPON  CONSOLE

イマイチわかりにくい・・と思った方はExcelの表をイメージしてみてください。今回の例では「OCCURS 12」なので12行の表です。そして添字で「5」と指定されたら5行目の陰暦名(皐月)と金額(6,108,600)を持ってきます。

Excelのイメージ

※上図の例でデータが月順に並んでいるのは、この順番で書きこまれている前提だからです。

添字に「0」を指定するとエラーになります。「1」以上の値を指定してください。また範囲外の値の指定(30までと設定したのに99を指定)や、添字項目が2桁しかないのに3桁の値を指定すると正しく動作しません。


3.補足 COBOLコーディングのルール

3-1.英大文字と英小文字の使い方

COBOLは大文字、小文字のどちらで記述してもかまいませんが、小文字は大文字と同等に扱われますので、「COBOLは大文字で記述」と覚えてしまっても差支えありません。

ただし、コメント行、英数字定数、PROGRAM-ID(コンパイルオプションにより同等とすることが可能)は区別されます。

3-2.コーディングフォーマット

1行の記述は80文字以内におさめる必要があり、行内はいくつかの領域に分かれています。

1~6文字   ・・・一連番号領域 プログラムの行番号

7文字目    ・・・標識領域 その行に何が記述されているのかを示す

8~11文字  ・・・A領域 各部の開始宣言やデータ項目のレベル番号を記述する。

12~72文字 ・・・B領域 命令文や作業領域のレベル番号を記述する

73~80文字 ・・・見出し領域 コンパイル対象外のコメント領域

コーディングフォーマット

3-3.COBOLは4つの部からできている

COBOLには4つのDIVISIONと呼ばれる区分けがあります。この4つのDIVISION(部)は必ず記述する必要があります。

DIVISIONの中は、さらにSECTIONに細分化されています。主なDIVISIONSECTION、記述項目を以下にまとめます。

IDENTIFICATION DIVISION(見出し部)

PROGRAM-ID. <プログラム名>.

AUTHOR <作成者>.

DATE-WRITTEN <作成日>. ※日付は自動更新されません

ENVIRONMENT DIVISION(環境設定部)

CONGIFURATION SECTION

SOURCE-COMPUTER. <コンピュータ名>.

OBJECT-COMPUTER. <コンピュータ名>.

INPUT-OUTPUT SECTION

FILE-CONTROL.

DATA DIVISION(データ部)※OCCURS句はここで記述します。

FILE SECTION.     (使用する入出力ファイルのデータ項目について定義します)

WORKING-STORAGE SECTION.(一時的なデータの保存場所など、作業領域を定義します。)

LINKAGE SECTION.   (外部プログラムとのデータのやりとりに関する情報を定義します)

PROCEDURE DIVISION(手続き部)

命令文が記述されるため、規定のSECTIONはありません。


4.さいごに

以上、OCCURS句についての基本的な使い方をまとめました。

ところで、COBOLで使用する単語は、ほとんど英単語そのまま(レコードを読む →READ、レコードを書き込む→WRITE、など)なのですが、何故この定義方法を「OCCURS」と命名したのか、時々疑問に思います(笑)(Weblioによりますと、起こる、生じる、発生する、浮かぶ、見出される、存在する、などの意味です)「指定の回数分発生する」ということなのでしょうか。

それはさておき、この「表」と「添字」の利用方法を理解しておけば、プログラム作成の際に簡単にできる部分が増えますので、是非慣れていってください。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め定年まで働けるエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって、エンジニアとしてだけでなくビジネスパーソンとして高い水準を目指し、社会や顧客に必要とされることで、関わる人々に感動を与える集団であろうと思っています。

  • 定年までIT業界で働くためのスキルが身につく「感動大学」と「技術勉強会」!
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な「人事評価制度」!
  • 理想のエンジニア像に近づくためのよきアドバイザー「専任コーチ制度」!
  • 稼動確認の徹底により実現できる平均残業時間17時間の働きやすい環境!

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

公式アカウントLINE限定!ボールドの内定確率が分かる無料診断実施中
公式アカウントLINE限定!
ボールドの内定確率が分かる無料診断実施中