오늘은 NEW SYNTAX의 2번째 Table Expressions, 테이블 표현식이다!
READ TABLE을 대체할 수 있는 신 문법으로, 내부 테이블이나 표준 테이블의 특정 행에 직접 접근할 수 있다.
기존에 없었던 새로운 접근 방식으로, 개발자가 코드를 더 간결하고 읽기 쉽게 만들 수 있도록 돕는다.
지난 포스팅에서 정리한 데이터 인라인 선언 방식을 적용하여, 함께 사용한다면 코드가 더 간결해 질 수 있다.
# 데이터 인라신 선언은 이전 포스팅 참고!
2025.03.05 - [SAP/NEW SYNTAX] - [SAP ABAP] NEW SYNTAX # - 데이터 인라인 선언( Inline Declarations )
[SAP ABAP] NEW SYNTAX # - 데이터 인라인 선언( Inline Declarations )
SAP의 ERP 시스템은 방대한 데이터를 효율적으로 관리하는 것이 핵심이다. 기존 ABAP Old SYNTAX는 오랫동안 사용되어 왔지만, 대량의 데이터를 처리할 때 성능 문제와 제한 사항이 존재했었다. 그러
roblige.tistory.com
일단은 늘 하던대로, 얼마나 간결해지는 지 예시부터 보자.

READ TABLE은 SAP 개발을 하면서 많이 쓰는 구문 중의 하나이다. 우리가 자주 쓰는 구문이 사진의 NEW SYNTAX처럼 사용을 할 수 있다. 기존의 4줄의 코드는 데이터 인라인 선언과 테이블 표현식을 사용하여 1줄이 되었다.
테이블 표현식의 코드를 해석하면 LV_CARRID2를 만들고, GT_DATA 테이블의 1번 INDEX(첫줄)를 찾고 1번 INDEX의 CARRID 값을 넣어라! 가 된다. 이런식으로 간결하게 표현할 수 있는게 큰 장점이다.
해당 예시는 여러가지 경우에서 변수에 값을 넣는 부분이지만 내가 공부하면서 느낀 거는 다양한 코드들을 정말 간결하게 표현할 수 있는 것 같다.
하지만,
이 테이블 표현식을 사용하려면 우리는 아래의 2가지 사항을 정확하게 숙지해야 한다.
- 값을 할당할 때, 테이블에 데이터가 존재하지 않으면 ITAB_LINE_NOT_FOUND 이라는 Runtime Errors(덤프)가 발생한다.
- SY-SUBRC 는 존재하지 않는다. 데이터가 들어가도 SY-SUBRC 는 4 값을 가진다.
자세한 내용은 아래에서 예시와 함께 보자.
1. READ TABLE INDEX

처음 예시랑 똑같은 내용이다.
테이블에 데이터를 스트럭쳐로 옮기는 경우 해당 코드를 작성할 수 있다.
하지만!! 가장 중요한 사항은 해당 INDEX에 대한 데이터가 존재하지 않으면 ITAB_LINE_NOT_FOUND 이라는 Runtime Errors(덤프)가 생긴다.

테이블 표현식은 데이터가 존재하지 않는다면 무조건 덤프를 낸다.
"근데 우리가 개발하다 보면은 TABLE에 데이터가 존재할 수도 있고, 없을 수도 있는데 그런 상황에서는 쓰지 못할까? "
그래서 열심히 구글링과 SAP docu을 찾아봤다.
역시 해결 방법이 존재했었다.
1) TRY-CATCH를 이용하여 해결하기.

해당 코드는 TRY-CATCH를 이용해 데이터가 없을 경우, CATCH 로 빠지게 했다.
프로그램을 실행시키면

덤프가 나지 않고 CATCH로 빠지게 된다.
TRY-CATCH를 이용해 데이터가 없는 경우에 대한 로직을 작성하여 이 부분을 해결 할 수 있었다.
그러나 만약 반복되는 코드일 경우 TRY-CATCH로 인해 가독성이 더 안좋질 수도 있다.
그래서 두번째 방법이 존재하더라...
2) VALUE와 OPTIONAL 이용하여 해결하기.
VALUE 구문은 NEW SYNTAX에서 핵심 중에 핵심이다. 제일 많이 본 것 같다.

스트럭쳐와 변수에 데이터를 집어넣는 과정이다.
OPTIONAL의 역할은 테이블에 원하는 데이터가 없을 때, CX_SY_ITAB_LINE_NOT_FOUND 예외가 발생하지 않도록 막아준다. 이녀석의 정확한 역할은 값이 있으면 넣고 없으면 패스~ 느낌인거 같다.
그렇기 때문에 데이터가 없을 가능성이 있다면 잊지말고 항상 써줘야 한다.
2. READ TABLE ~ WITH KEY.
WITH KEY 뒤 조건에 맞는 스트럭쳐를 테이블에서 가져오는 구문이다.

WITH KEY를 입력하지 않고 대괄호([ ]) 사이에 해당 조건을 바로 나열해주면 된다.
3. TRANSPORTING NO FIELDS.
우리는 원하는 조건의 데이터가 있는 지 확인하기 위해 TRANSPORTING NO FIELDS를 사용했다.
그리고 IF SY-SUBRC를 이용해 데이터 존재 여부를 체크했었다.
하지만 테이블 표현식을 사용할 때는 처음에 주의사항으로 이야기했던
2. SY-SUBRC는 존재하지 않는다. 데이터가 들어가도 SY-SUBRC 는 4 값을 가진다
이거를 기억해야 한다.
내가 직접 테스트 해본 결과, 데이터가 들어가도 이녀석들은 무조건 SY-SUBRC 4를 내뱉는다.
그러면 같은 상황에서 데이터 핸들링을 하려면 어떻게 해야 할까?

그래서 테이블 표현식에서는 두 가지 키워드가 존재한다.
# LINE_EXISTS와 LINE_INDEX.
1) LINE_EXISTS.
LINE_EXISTS는 조건에 맞는 테이블의 데이터 존재 여부를 확인해준다. 한마디로 ‘IF SUBRC = 0’ 이랑 같은 의미를 지낸다.
해당 조건에 DATA 여부를 확인하고, 존재하면 IF 문을 타게 된다.
2) LINE_INDEX.
LINE_INDEX는 해당 조건에 맞는 INDEX 값을 반환해준다.
인터널 테이블에 조건에 맞는 데이터가 몇번 INDEX에 있는 지 반환을 하게 된다.


기존에는 SY-TABIX로 인덱스 값을 확인했다면,
테이블 표현식은 LINE_INDEX 키워드를 사용해서 조건에 맞는 데이터의 인덱스 값을 추출할 수 있다.
실행 결과를 보면 CARRID가 FJ라는 데이터는 6번 INDEX에 존재하는 점을 알 수 있다.
만약 데이터가 없는 경우는 0 값을 반환한다. 또한 INDEX가 존재할 수 없는 Hashed Table이나 Hashed Secondary Key를 사용한 경우에는 -1을 반환한다.
4. FIELD-SYMBOL ASSIGN.
필드심볼에 할당에 대한 테이블 표현식이다.

OLD 버전에서 IF조건문이 없고 데이터가 존재하지 않아도 덤프가 나지않는다.
하지만 테이블 표현식은 데이터 없으면 가차없이! 덤프나기 때문에 무조건 IF 조건문으로 감싸줘야한다.

이렇게 반겨준다.

25번에 데이터가 존재하지 않는 경우, 두 경우에 덤프 에러가 뜨지 않는다 .
근데 여기서 중요한 점은
SAP에서 해당 테이블 표현식을 쓸 때, IS ASSGIN 말고 SY-SUBRC를 사용하라고 권장을 한다. (SY-SUBRC 사용 못한다고 할때는 언제고…?)
이 경우에는 놀랍게도 기존에 4값만 들어오던 SY-SUBRC가 0값이 들어오게 된다........
이 부분에 대해서 찾아봤는데 필드 심볼의 할당은 ASSIGN을 사용하는 방법이 올바르지만, 여러 개발자의 유지보수 등을 고려하여 SY-SUBRC를 권장하는 거라고 한다. ( 어떤 개발자든 직관적으로 성공! 실패! 를 구분할 수 있다나 머라나.... )
# 응용
4-1. TABLE에서 데이터 변경

MODIFY로 인터널 테이블에서 값을 수정하는 과정을 간단하게 바꿀 수 있다.
NEW SYNTAX를 해석해보면 GT_SCARR테이블의 CARRID가 ‘AA’인 ROW의 CARRNAME을 ‘비행기’로 변경해라 가 될 수 있다.
다만 여기서도 해당 조건의 데이터가 없다면, ITAB_LINE_NOT_FOUND 가 반긴다는 것...

그렇기 때문에 나는 위 사진처럼 LINE_EXISTS를 사용하여 덤프를 방지 시킨다.

물론 TRY CATCH도 가능하다.
4-2. 2개의 테이블 데이터 핸들링.
GT_SCARR 의 특정 데이터의 값을 LT_DATA에 APPPEND 하는 상황이라고 가정.


둘 다 동일한 값을 가진다
4-3. F4 서치헬프 함수로 띄우는 과정에서 적용하기
실제 내가 적용했던 방법이다.
서치헬프에서 클릭한 값을 받아서 CALL FUNCTION 'DYNP_VALUES_UPDATE’에 사용하는 상황이다.

잘 참고하면 좋겠고 도움이 되었으면 좋겠다!
올바르고 정답이 있는 코드는 없다고 생각한다.
잘못된 코드는 있지만 올바른 코드는 없다! 각자 상황에 맞게 잘 활용하기를 바란다!
'SAP > NEW SYNTAX' 카테고리의 다른 글
[SAP ABAP] NEW SYNTAX #3 - CONV 연산자(데이터 변환) (0) | 2025.03.17 |
---|---|
[SAP ABAP] NEW SYNTAX # - 데이터 인라인 선언( Inline Declarations ) (1) | 2025.03.05 |