LIKEDS(データ構造名)

LIKEDS キーワードは、データ構造、データ構造のサブフィールド、プロトタイプされた戻り値、または プロトタイプ・パラメーターを、別のデータ構造と同様に定義するために使用します。 新たな項目のサブフィールドは、LIKEDS キーワードのパラメーターとして指定されている親データ構造のサブフィールドと同じになります。

LIKEDS を使用して定義されているデータ構造は、親データ構造が修飾されていない場合でも、 自動的に修飾されます。 サブフィールドは、修飾表記 DSNAME.SUBFIELDNAME を使用して参照する必要があります。 親データ構造に名前が付いていないサブフィールドがある場合、 子データ構造も同じ名前無しのサブフィールドを持ちます。

LIKEDS は、修飾されたデータ構造のサブフィールドに関してコーディングすることができます。 LIKEDS がデータ構造のサブフィールド定義でコーディングされる場合、 サブフィールドのデータ構造は自動的に QUALIFIED として定義されます。 LIKEDS サブフィールドのデータ構造のサブフィールドは、完全修飾形式 "ds.subf.subfa" で 参照されます。LIKEDS を使用して定義されたサブフィールドは、 それ自体がデータ構造であり、データ構造が必要な任意の場所で使用することができます。

ALIGN キーワードおよび ALTSEQ キーワードの値は、新しいデータ構造によって継承されます。OCCURS、DIM、NOOPT、および INZ の各キーワードの値は継承されません。 親データ構造と同じ方法でサブフィールドを初期化するには、INZ(*LIKEDS) を指定します。

図 119. LIKEDS を使用したデータ構造の定義
 * Data structure qualDs is a qualified data structure
 * with two named subfields and one unnamed subfield
D qualDs          DS                   QUALIFIED
D  a1                           10A
D                                2A
D  a2                            5P 0 DIM(3)
 * Data structure unqualDs is a non-qualified data structure
 * with one named subfield and one unnamed subfield
D unqualDs        DS
D  b1                            5A
D                                5A
 * Data structure likeQual is defined LIKEDS(qualDs)
D likeQual        DS                  LIKEDS(qualDs)
 * Data structure likeUnqual is defined LIKEDS(unqualDs)
D likeUnqual      DS                  LIKEDS(unqualDs)
 /FREE
        // Set values in the subfields of the
        // parent data structures.
        qualDs.a1 = 'abc';
        qualDs.a2(1) = 25;
        b1 = 'xyz';

        // Set values in the subfields of the
        // child data structures.
        likeQual.a1 = 'def';
        likeQual.a2(2) = -250;
        likeUnqual.b1 = 'rst';

        // Display some of the subfields
        dsply likeQual.a1;  // displays 'def'
        dsply b1;           // displays 'xyz'
図 120. INZ(*LIKEDS) の使用
D sysName         DS                  qualified
D   lib                         10A   inz('*LIBL')
D   obj                         10A
D userSpace       DS                  LIKEDS(sysName) INZ(*LIKEDS)
 // The variable "userSpace" was initialized with *LIKEDS, so the
 // first 'lib' subfield was initialized to '*LIBL'.  The second
 // 'obj' subfield must be set using a calculation.
C                   eval      userSpace.obj = 'TEMPSPACE'
図 121. サブプロシージャー内のデータ構造パラメーターの使用
P createSpace     B
D createSpace     PI
D  name                               LIKEDS(sysName)
 /free
     if name.lib = *blanks;
          name.lib = '*LIBL';
     endif;
     QUSCRTUS (name : *blanks : 4096 : ' ' : '*USE' : *blanks);
 /end-free
P createSpace     E