COBOLのOCCURS句とは?OCCURS句の書式や使い方を解説
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)を持ってきます。
※上図の例でデータが月順に並んでいるのは、この順番で書きこまれている前提だからです。
添字に「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に細分化されています。主なDIVISIONとSECTION、記述項目を以下にまとめます。
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によりますと、起こる、生じる、発生する、浮かぶ、見出される、存在する、などの意味です)「指定の回数分発生する」ということなのでしょうか。
それはさておき、この「表」と「添字」の利用方法を理解しておけば、プログラム作成の際に簡単にできる部分が増えますので、是非慣れていってください。
コメント