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 に反映されます。

ページトップ

ボタン