メニューボタン
サポートチーム便り2010.10.20

長いデータ構造名を短くする

Question

IBM には、修飾データ構造を省略表現する方法はありますか。5 段階の深さに埋め込んだ XML (例: Inbound.BOL.number.type.commodity) があります。こういった名前を入力するのが面倒なのです。例えば、「Inbound.BOL,」より後の部分だけ入力して、残りを省略するような方法はありますか。

Answer

ある、とも、ない、とも言えます。特に、データ構造で使用されている接頭部を省略できるような方法はありません。しかし、入力時に短くする方法はあります。この問題について、私のお気に入りのアプローチをお見せします。

思うに、あなたのデータ構造は次のような感じなのでしょう。

D type_t  ds
    D  field1            2a
    D  field2            9p     0
    D  commodity         10a

    D number_t       ds               qualified
    D  something         8a
    D  otherthing        11p    3
    D  type                         likeds(type_t)

    D Bol_t          ds
    D  x                 10i    0
    D  y                 9p     2
    D  number                       likeds(number_t)

    D Inbound        ds               qualified inz
    D  foo               10a
    D  bar               7p     0
    D  bol                          likeds(bol_t)

入力に時間が掛かりすぎるのが不満だと思います。以下のようにキー入力しなければならないのでしょう。

if Inbound.bol.number.type.commodity = 'F2506';
            // do something
      endif;
      if Inbound.bol.number.type.field1 = 'XY';
            // do something
      endif;
      if Inbound.bol.number.type.field2 = 1234;
            // do something
      endif;

これが面倒だということにはまったく同感です。現実では、名前はこの例よりはるかに複雑になる場合が多々あります。こうした長い名前を入力するのは確かに戸惑うでしょう。1 つ簡単な (しかし直感では理解できないと思われる) 方法として、次のようにポインター・ロジックを使用する方法があります。

D type            ds              likeds(type_t)
   D                           based(p_type)
           p_type = %addr(Inbound.bol.number.type);

           if type.commodity = 'F2506';
                // do something
           endif;
           if type.field1 = 'XY';
                .. etc ..

型のフォーマットが Inbound.bol.number.type とまったく同じで、さらに LIKEDS キーワードのおかげで同じフォーマットであることがわかるため、これは効果大です。ポインター・ロジック (BASED キーワードおよび %ADDR() BIF) で、型データ構造を強制的にコンピューターのメモリーの Inbound.bol.number.type DS と同じスポットに入れます。同じメモリーにあるため、同じ値が入っていることになります。また、(データ構造の重ね合わせフィールドのように) 片方を変更すると、もう一方も変更されます。

ポインターを使用するのが嫌な場合 (多くの人がそうです) は、別の解決方法としてサブプロシージャーを使用する方法があります。データ構造の型レベルを処理するロジックを handleType() というサブプロシージャーに組み込み、その DS 部分をプロシージャーに渡すだけです。

handleType(Inbound.bol.number.type);

次に、プロシージャーは構造の型部分のみ認識すればよいのです。以下の例を見てください。

P handleType    B
  D handleType    PI
   D  type            likeds(type_t)
   /free
     if type.commodity = 'F2506';
       // do something;
     endif;
     ... etc. ...
   /end-free
   P        E

ポインターおよびプロシージャーの両方の技法で、DS を読み取り、それに変更を加えることができます。変更内容は元の DS に反映されます。

あわせて読みたい記事

PAGE TOP