2017-03-22 15 views
1

私はデータ構造の配列を作成し、私はキーの組み合わせに基づいて見たいです。つまり、下のDSで、tblNameとtblElementとtblDivisionが一致している場合に検索してインデックスを取得し、次にtblRes値を返します。RPGLEデータStrucutre配列の参照

D TblAryDs  DS     qualified dim(9999)      
    D tblName      3           
    D tblElement     10           
    D tblDivision     5           
    D tblRes      2           

//Not Sure How to do the below lookup 
     idx = %lookup(tblName:TblAryDs(*).tblName) && %lookup(tblElement:TblAryDs(*).tblElement) && %lookup(tblDivision:TblAryDs(*).tblDivision);         
     if idx > *zeros;                     
     return TblAryDs(*).tblRes; 
     endif; 

答えて

4
D TblAryDs  DS     qualified dim(9999)      
D key 
D tblName      3a overlay(key)           
D tblElement     10a overlay(key:*next)           
D tblDivision     5a overlay(key:*next)           
D tblRes      2a   

    /FREE 
    idx = %lookup(tblName + tblElement + tblDivision 
        :TblAryDs(*).key); 
    if idx > *ZEROS; 
     return TblAryDs(idx).tblRes; 
    endif; 
    /END-FREE 

注:上記のコード化されたように、%LOOKUP()が全て9999個の要素を検索します。繰り返し異なる値を検索する必要がある場合は、ASCENDキーワードを配列に追加し、検索する前にSORTAを使用して並べ替えます。最後に、アレイで実際に使用されている要素数を記録します。

idx = %lookup(tblName + tblElement + tblDivision 
        : TblAryDs(*).key : nbrElemUsed); 

こう%LOOKUP()%は能動素子のはるかに高速バイナリ検索を実行します。

+0

私の配列に以下の要素がある場合、BIL-123-123-11とBIL-456-456-22と私は送信行を検索する必要があります。このコードは動作しません。ルックアップは常に最初の行を返します。 – Sekar

+0

@Sekar申し訳ありませんが、あなたが必要なものを誤解しました。今はどう? – Charles

+0

これは問題を解決します。ありがとう。 1つの質問ですが、実行時に要素を追加するので、すべての要素を追加した後に配列をソートするのは時間がかかるでしょう。実際のシナリオでは、IOを減らすためにできるだけ多くの結果をキャッシュするたびにファイルを調べるのではなく、私はあなたの意見を知りたいと思っています。ソートや検索に時間がかかりますか、ファイルIOですか? – Sekar