COBOLのREDEFINES句とは?項目を再定義する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の項目には使用できません。
【例】
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.
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 (環境設定部)
- 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句を思い出してください。
コメント