COBOL REDEFINES句の使用方法まとめ~あの項目を再定義しよう

COBOLプログラム内では、ある項目が扱うデータの型や桁数を指定しますが、文字タイプであれば、[PIC X(010)]などと記述します。この項目に、[01ABCDEFGH]というデータを転送するのは何ら問題ありませんが、先頭の[01]部分だけ計算したい、あるいは3~10桁目の[ABCDEFGH]だけを取り出したい場合に、この[PIC X(010)]を[PIC 9(002)]と[PIC X(008)]にわけたくなりますね。そんな時にREDEFINES句を使用して、利用しやすい形に項目を定義しなおします。

最初からそのように定義しておけばいいのでは、と思われるかもしれませんが、機能追加、修正などで後から必要になる場合もあり、使用頻度は高い記述です。

1.REDEFINES句の基本的な使い方

あるデータ項目を別のレイアウトで参照できるようにすることを「再定義」と言います。この「再定義」を行う時にREDEFINES句を使用します。

たとえばWORKING-STORAGE SECTIONで 

03 WRK-YMD  PIC 9(6) 

と定義すると、数字6桁の項目として使用できますが、ここから先頭の2桁だけ取りだしたい、3~6桁目だけを取り出したい、といった場合などにREDEFINES句で「再定義」を行っておくと、この項目が使いやすくなります。

1-1.REDEFINES句の書式

以下の書式で記述します。

レベル番号 データ名1 データ項目の定義
レベル番号 データ名2 REDEFINES データ名1

また、使用時にはいくつかの注意点があります。

・データ項目のレベル番号が、01、66、88の項目には使用できません。

【例】

※「FILE SECTION.」では01レベルで記述できませんが、「WORKING-STORAGE SECTION.」内では01レベルでも記述できます。

・再定義するデータ名に、REDEFINESを含んではいけない。

上記の中では、「01  INFILE-SONO1-REC」に、REDEFINESが含まれる記述はできません。

・データ名1とデータ名2は同じレベル番号を使用する。

「IN-FILE-YMD」と「IN-FILE-YMD-R」は、同じ03レベルのデータ番号を使用しています。

同じレベル番号を使用すれば何度でも再定義できますが、これを以下のようにはできません。

※データ項目のレベル番号は、データの階層従属関係を表わすために使用しています。66、77、88はあらかじめ使用用途が定義されている特殊な番号です。

  • 66・・・RENAMES句を使用してデータ項目を再編成する場合に使用します
  • 77・・・独立したデータ項目用の記述をする場合に使用します。他の項目と従属関係はありません。
  • 88・・・特定の条件を定義する場合に使用します

1-2.REDEFINES句の使用例

【例1】日付を「年」「月」「日」にわけて使用したい

IN-FILE-YMD」には西暦で日付が入っているとします。「IN-FILE-YMD」のまま扱うと、年月日全て含んだ8桁のデータを取りだしてしまいますが、再定義を行い「IN-FILE-YYYY」を使用すると年だけが取り出せます。

 【例2】最初に値をセットしたまた再定義したい

【例3】項目タイプを変更したい

2.REDEFINESとRENAMESの違い

ざっくりまとめますと、REDEFINESはひとつの項目を細かくすることができ、RENAMESは複数の項目をまとめることができます。RENAMEを記述する時のレベル番号は66です。

以下は使用例です。

レベル66でのIN-FILE-RANKの使い方!

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

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

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

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

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

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

  • 1~6文字   ・・・一連番号領域 プログラムの行番号
  • 7文字目    ・・・標識領域 その行に何が記述されているのかを示す
  • 8~11文字  ・・・A領域 各部の開始宣言やデータ項目のレベル番号を記述する。
  • 12~72文字 ・・・B領域 命令文や作業領域のレベル番号を記述する
  • 73~80文字 ・・・見出し領域 コンパイル対象外のコメント領域

COBOLのコーディングフォーマットの基本!!

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

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

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

IDENTIFICATION DIVISION(見出し部)

  • PROGRAM-ID. <プログラム名>.
  • AUTHOR <作成者>.
  • DATE-WRITTEN <作成日>. 自動更新されません

ENVIRONMENT DIVISION  (環境設定部)

  • CONFIGURATION SECTION.
  • SOURCE-COMPUTER. <コンピュータ名>.
  • OBJECT-COMPUTER. <コンピュータ名>.
  • INPUT-OUTPUT SECTION.
  • FILE-CONTROL.

DATA DIVISION(データ部) REDEFINES句はここで使用します。

  • FILE SECTION.     (使用する入出力ファイルのデータ項目について定義します)
  • WORKING-STORAGE SECTION.(一時的なデータの保存場所など、作業領域を定義します。)
  • LINKAGE SECTION.   (外部プログラムとのデータのやりとりに関する情報を定義します)

PROCEDURE DIVISION   (手続き部)

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

4.まとめ

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

ある集団項目内の、データの桁数を変えたいなぁ、データタイプを変えたいなぁ、と思ったらREDEFINES句を思い出してください。