2017-03-22 6 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

이렇게하면 문제가 해결됩니다. 감사. 하나의 질문이지만 런타임에 요소를 추가 할 것이므로 모든 요소를 ​​추가 한 후에 배열을 정렬하는 것은 시간이 많이 걸릴 것입니다. 실제 시나리오에서는 IO를 줄이기 위해 가능한 한 결과를 캐시 할 때마다 파일을 조사하는 대신 나는 이것에 대한 당신의 의견을 알고 싶습니다. 정렬 및 조회 시간이 오래 걸리겠습니까? 아니면 IO 파일입니까? – Sekar