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

折乃 杏

折乃 杏

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

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データ項目の定義
レベル番号データ名2REDEFINESデータ名1

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

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

【例】

FD  INFILE-SONO1.
01  INFILE-SONO1-REC.       ←ここには使用できません
    03  IN-FILE-YMD    PIC  9(8).
    03  IN-FILE-YMD-R  REDEFINES  IN-FILE-YMD.       ←ここは使用OK
        05  IN-FILE-YYYY  PIC  9(4).
        05  IN-FILE-MM    PIC  9(2).
        05  IN-FILE-DD    PIC  9(2).

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

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

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

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

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

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

    03  IN-FILE-YMD    PIC  9(8).
        05  IN-FILE-YMD-R  REDEFINES  IN-FILE-YMD

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

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

1-2.REDEFINES句の使用例

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

    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)

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

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

WORKING-STRAGE SECTION.
01  SYOKI-WORD01  PIC X(009)  VALUE "X64X86AMD"
01  SYOKI-WORD01-R  REDEFINES  SYOKI-WORD01.   ←ここにOCCURS句は使用できません。
    03  SYORI-WRD-03  OCCURS 3.
        05  SYORI-WRD-XX    PIC  X(003).

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

WORKING-STRAGE SECTION.
01  CODE-CHK.
03  CODE01  PIC  X(009).
01  CODE-CHK-R  REDEFINES  CODE-CHK.   
    03  CODE11  PIC  9(002).
    03  CODE12  PIC  X(007).

2.REDEFINESとRENAMESの違い

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

以下は使用例です。

01  INFILE-SONO1-REC.
    03  IN-FILE-YMD    PIC  9(8).
    03  IN-FILE-YMD-R  REDEFINES  IN-FILE-YMD. 
        05  IN-FILE-YYYY  PIC  9(4).
        05  IN-FILE-MM    PIC  9(2).
        05  IN-FILE-DD    PIC  9(2).
    03  IN-FILE-CODE    PIC  X(12).
    03  IN-FILE-CODE-R  REDEFINES  IN-FILE-CODE. 
        05  IN-FILE-RANK1  PIC  X(1).
        05  IN-FILE-RANK2  PIC  X(1).
        05  IN-FILE-RANK3  PIC  X(1).
        05  IN-FILE-RANK4  PIC  X(1).
        05  IN-FILE-RANK5  PIC  X(1).
        05  IN-FILE-NUM    PIC  9(7).
66  IN-FILE-MEMBER  RENAMES  IN-FILE-RANK1  THRU  IN-FILE-RANK4.

レベル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句を思い出してください。

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

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

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

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

コメント

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