フィールドの再定義

再定義は、フィールドのフォーマットを変更したり、単一フィールドを複数のセグメントに分割したりするために使用します。

このドキュメントでは、次のトピックについて説明します。


DEFINE DATA ステートメントの REDEFINE オプションの使用

DEFINE DATA ステートメントの REDEFINE オプションは、単一のフィールド(ユーザー定義変数またはデータベースフィールド)を 1 つ以上の新しいフィールドとして再定義するために使用できます。グループも再定義できます。

重要:
ダイナミック変数は再定義には使用できません。

REDEFINE オプションは、フォーマットに関係なく、フィールドのバイト位置を左から右に再定義します。バイト位置は、元のフィールドと再定義されたフィールド(複数可)の間で一致している必要があります。

再定義は元のフィールド定義の直後に指定する必要があります。

例 1

以下の例では、データベースフィールド BIRTH を、3 つの新しいユーザー定義変数として再定義しています。

DEFINE DATA LOCAL                 
01 EMPLOY-VIEW VIEW OF STAFFDDM  
  02 NAME                        
  02 BIRTH                       
  02 REDEFINE BIRTH              
     03 #BIRTH-YEAR  (N4)          
     03 #BIRTH-MONTH (N2)         
     03 #BIRTH-DAY   (N2)           
END-DEFINE 
   ...

例 2:

以下の例では、グループ #VAR2(フォーマット N および P の 2 つのユーザー定義変数で構成)を、フォーマット A の 1 つの変数として再定義しています。

DEFINE DATA LOCAL                    
01 #VAR1 (A15)                  
01 #VAR2                        
  02 #VAR2A (N4.1)             
  02 #VAR2B (P6.2)             
01 REDEFINE #VAR2 
  02 #VAR2RD (A10)
END-DEFINE 
   ...

FILLER nX 表記を使用して、再定義するフィールドに n バイトの充填バイト(使用しないセグメント)を定義できます。末尾の充填バイトの定義は任意です。

例 3:

以下の例では、ユーザー定義変数 #FIELD を 3 つの新しいユーザー定義変数(それぞれフォーマット/長さが A2)として再定義しています。FILLER 表記によって、元のフィールドの 3 ~ 4、および 7 ~ 10 バイト目を使用しないことが示されています。

DEFINE DATA LOCAL 
1 #FIELD (A12)                       
1 REDEFINE #FIELD 
  2 #RFIELD1 (A2) 
  2 FILLER 2X 
  2 #RFIELD2 (A2) 
  2 FILLER 4X 
  2 #RFIELD3 (A2) 
END-DEFINE 
...

再定義の使用方法を示すプログラム例

以下のプログラムは、再定義の使用方法を示しています。

** Example 'DDATAX01': DEFINE DATA
************************************************************************
DEFINE DATA LOCAL
01 VIEWEMP VIEW OF EMPLOYEES
  02 NAME
  02 FIRST-NAME
  02 SALARY   (1:1)
*
01 #PAY       (N9)
01 REDEFINE #PAY
  02 FILLER   3X
  02 #USD     (N3)
  02 #OOO     (N3)
END-DEFINE
*
READ (3) VIEWEMP BY NAME STARTING FROM 'JONES'
  MOVE SALARY (1) TO #PAY
  DISPLAY NAME FIRST-NAME #PAY #USD #OOO
END-READ
END

プログラム DDATAX01 の出力:

#PAY およびその再定義でできたフィールドがどのように表示されるかに注意してください。

Page      1                                                  04-11-11  14:15:54
 
        NAME              FIRST-NAME         #PAY    #USD #OOO
-------------------- -------------------- ---------- ---- ----
 
JONES                VIRGINIA                  46000   46    0
JONES                MARSHA                    50000   50    0
JONES                ROBERT                    31000   31    0