Method "GET_SELECTED_ROW"는 ALV를 제어함에 있어 많이 사용되는 Method 중 하나로, ALV Report에서 ALV Standard 선택 박스를 선택 후 선택된 라인의 위치 정보(인터널 테이블 Index)를 가져오기 위해 사용된다.
가볍게 사용되는 Method지만, 정확히 모르고 썼다가는 에러가 날 수도 있으니 한번 알아보도록 하자.
일반적으로 다음과 같이 호출하여 사용한다.
Method "GET_SELECTED_ROW"의 Importing Parameter 반환 값을 보면 "LT_ROW_NO"는 Field "ROW_ID"에, "LT_INDEX_ROWS"는 Field "INDEX"에 선택된 라인의 정보( 인터널 테이블 Index )가 들어가 있는 것을 확인할 수 있다.
그런 다음 "LT_ROW_NO" 또는 "LT_INDEX_ROWS"에 담긴 정보로 "LOOP" 또는 "READ TABLE"구문을 이용하여 ALV Output 인터널 테이블의 선택 라인을 찾아 후속 처리하면 된다.
이번에는 일반 ALV Output Data가 아닌 ALV의 Standard 기능인 Total과 Subtotal 기능을 특정 필드에 활성화시킨 후 추가된 Total라인과 Subtotal 라인을 선택해보자.
1번째 라인 - ALV 기존 Output 데이터
2번째 라인 - 필드 ID(LH)와 Plane Type(A319)의 Occupied 중간 합계
3번째 라인 - 필드 ID(LH)와 Plane Type(A330-300)의 Occupied 중간 합계
4번째 라인 - 필드 ID(LH)의 Occupied 중간 합계
5번째 라인 - Occupied 총합계
Method "GET_SELECTED_ROW" Importing Parameter 결과 값을 보면, 다음과 같이 기존 ALV Output Data( 첫 번째 라인 )와 ALV 합계 기능에 의해 생긴 Data( 2 ~ 5번째 라인 )의 반환 값이 다른 것을 확인할 수 있다.
Method "GET_SELECTED_ROW"의 Parameter Field 반환 값을 다음과 같이 정리해 볼 수 있다.
모든 프로그램이 개발자의 의도대로 사용된다면, 에러 없는 완벽한 프로그램이 되겠지만, 항상 사용자 입장에서는
개발자의 의도와 다른 방향으로 사용될 수 있다는 점을 인지하고 있어야 한다.
만약 ALV의 Total(Sub Total) 합계 기능으로 인해 추가로 생긴 합계 라인을 실수 또는 어떠한(?) 의도로 선택을 하고 다음 프로세스를 진행하였다면 어떻게 되었을까?
다음과 같이 소스코드를 작성하였다면 아마 문제가 생겼을 것이다.
Case #1 은 Method "GET_SELECTED_ROW"의 Parameter "et_index_rows" 사용 시합계 라인을 선택한 경우로,
Field "INDEX"에는 인터널 테이블 "GT_TIAB"의 Index가 아닌 ALV 합계 라인들 중 에서의 Index를 반환하므로 잘못된 데이터를 찾아오게 된다.
Case #2는 Method "GET_SELECTED_ROW"의 Parameter "et_row_no" 사용 시 합계 라인 선택한 경우로,
Field "ROW_ID"에는 '마이너스(-)' 또는 '0'으로 반환하기 때문에 "READ TABLE" 구문 뒤에 "SY-SUBRC = 0"을 체크하지 않았다면, 실제 인터널 테이블 "GT_ITAB"에는 존재하지 않은 Index 이므로 덤프가 발생하며 해당 프로그램은 종료된다. ( 해당 사례는 "READ TABLE" 구문에서는 100% 'SY-SUBRC = 0'일 거라고 확신하고 생략한 듯하다.)
2가지 사례는 실제 고객사 운영을 하다 보면 이미 개발되어 있는 프로그램에서 종종 볼 수 있는데, 어떻게 보면 해당 구문들은 합계 라인을 선택하지 않는 한 전혀 문제가 되진 않는다. 그래도 이런 예외 상황의 오류를 조금이라도 줄이는 것이 우리의 업이기에 프로그래밍 시 조심할 필요는 있지 않을까 싶다.
결론
: ALV 라인 선택 시 Method "GET_SELECTED_ROW"에 반환된 정보는 Output Data와 (Sub) Total Data가 다르다.
: Method "GET_SELECTED_ROW" 사용 시 ALV 합계 라인 정보를 제어하는 것이 아니면, Parameter "et_row_id"의 Field "ROW_ID"를 사용하자. ( SY-SUBRC = '0' 은 반드시 체크 )
'ABAP Working Lv. > ALV' 카테고리의 다른 글
|ALV| Column Optimize ( After ALV Refresh ) (1) | 2023.11.01 |
---|---|
|ALV| Event DATA_CHANGED와 DATA_CHANGED_FINISHED 차이 (3) | 2022.08.09 |
|ALV| EDIT 모드 (0) | 2022.07.25 |
|ALV| Toolbar Button 제어 (Feat. TOOLBAR Event) (0) | 2022.07.19 |
|ALV| 개별 Cell 제어 ( feat. STYLE 필드 ) (1) | 2022.07.14 |