2017-03-22 101 views
1

我已經創建了一個數據結構數組,我想看看基於組合鍵。即在下面的DS我想查找並獲得索引如果tblName和tblElement和tblDivision匹配,然後返回tblRes值。RPGLE數據結構數組查找

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

這解決了這個問題。謝謝。一個問題,因爲我將在運行時添加元素,添加每個元素後對數組進行排序將是很耗時的權利。實際情況是,每次我想盡可能緩存結果來減少IO,而不是每次查看文件。我非常想知道你對此的看法。排序和查找會花費時間還是文件IO? – Sekar