SAP 인터널 테이블을 조작할 때 많이 사용되는 ABAP Binary Search Sort 에 대한 유용한 팁을 정리해 보았습니다.
Checking Sort 옵션을 활성화하게 되면, 개발자가 Binary Search 관련 처리를 할 때 Sort 관련 코딩 실수를 할 수 있는 부분을 미리 사전에 방지 할 수 있습니다.
ABAP Binary Search시 반드시 정렬된 상태이어야 함
마스터 테이블 등의 Binary Search를 할 목적인 인터널 테이블의 경우에는, 반드시 사전에 Sort가 되어야 합니다.
만약 Sort가 되지 않은 상태에서 Binary Search를 하게 되면 의도하지 않는 잘 못된 값이 선택(Read Table) 되거나 SY-SUBRC 8로 탐색에 실패하게 됩니다.
따라서 항상 Design Time에서 Sort 여부가 결정이 되어야 하는데, 깜박 Sort 를 하지 않았을 수도 있고, Sort는 되었으나 원래의 데이터 성격이 Uniqueness를 확보하지 못하는 키 형태로 Sort되어 실제 Binary Search 시에는 실패가 발생할 수 있습니다.
아래의 예시는 ‘001’, ‘011’, ‘003’ 순서로 아이템을 등록한 후 정렬 없이 Binary Search를 하는 예시입니다.
TYPES : BEGIN OF TY_STR,
STR TYPE STRING,
END OF TY_STR.
DATA : LS_STR TYPE TY_STR.
DATA : LT_STR TYPE STANDARD TABLE OF TY_STR.
DATA : LV_STRING TYPE STRING.
LS_STR-STR = '001'.
APPEND LS_STR TO LT_STR.
LS_STR-STR = '011'.
APPEND LS_STR TO LT_STR.
LS_STR-STR = '003'.
APPEND LS_STR TO LT_STR.
READ TABLE LT_STR INTO LS_STR
WITH KEY
STR = '011'
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WRITE : / '성공'.
ELSE.
WRITE : / '실패'.
ENDIF.
위의 예시의 경우, 정렬이 되지 않았으므로 011 키 값으로 찾는 Binary Search는 실패하게 되며, SY-SUBRC 는 8 로 리턴됨을 확인할 수 있습니다.
프로그램 디버깅 옵션 활성화 – Checking Sorting
이러한 경우, Debugger 옵션에서 ‘Check sorting before READ BINARY SEARCH ‘을 활성화 하면 Sort 여부를 확인할 수 있습니다.
메뉴 > Change Debugger Profile, Settings > Check sorting before READ BINARY SEARCH
이 옵션을 활성화 한 후 디버깅을 시도했을 때 만약 인터널 테이블의 데이터가 정렬되어 있지 않다면 Runtime error가 발생하게 됩니다.
Sort 여부의 판정
이 옵션은 SORT 구문을 사용했음을 체크하는 것이 아니라 실제 인터널 테이블의 SORT 여부를 확인하는 것입니다.
SORT 구문을 미리 사용하지 않았지만 우연히 정렬 상태인 경우는 정상적으로 덤프 없이 제대로 정렬된 것으로 인식됩니다.
또, SORT를 미리 처리했더라도 Uniqueness가 확보되지 않는 키로 Binary Search를 처리하는 경우에는 Runtime Error가 발생하게 됩니다.
즉, 실제 key 구문을 기준으로 Binary Search 할 데이터가 잘 못 구성된 경우를 걸려줍니다.
Read Table 과 관련된 SY-SUBRC 처리는 아래의 글을 참고 할 수 있습니다.
낮은 버전의 SAP ERP의 경우 활성화 방법
만약 ECC 버전의 SAP ERP의 하위버전에의 이 옵션은 Classic Debugger를 통해 활성화 할 수 있습니다.
New Debugger를 사용하는 경우에는 디버깅 도중에라도 Debugger 메뉴에서 Classic Debugger로 전환하면 됩니다.
이상으로 ABAP Binary Search 처리시 유용하게 사용할 수 있는 Checking Sorting 옵션을 알아보았습니다.
Binary Search 와 관련된 SAP의 설명은 아래의 공식 문서 중 System fields 항목에서 확인할 수 있습니다.