이번에 설명할 AT ~ ENDAT 구문은 LOOP AT 구문 내에 사용 가능하며,
인터널 테이블의 시작과 마지막 행, 특정 필드 기준으로 데이터 변경의 시작과 마지막 행을 Catch 하여 원하는 로직을 넣을 수 있다.
실무에서는 주로 이런 경우 많이 사용된다.
- 특정 필드 기준으로 중간 합계 또는 총합계 산출 시
- 특정 필드 기준으로 Summary 인터널 테이블 재구성시
- 엑셀 업로드 시 Row와 Col으로 구성된 엑셀 데이터를 특정 인터널 테이블로 이관 시
LOOP AT 구문 내에 사용되는 AT ~ ENDAT 구문은 다음과 같이 4가지가 존재하며,
해당 AT구문에 맞는 인터널 테이블의 행이 Catch 되면, 그 안의 작성한 로직이 수행이 되는 구조다.
AT FIRST. ~ ENDAT. | 인터널테이블의 첫번째 행 ( SY-TABIX = '1' ) |
AT LAST. ~ ENDAT. | 인터널테이블의 마지막 행 |
AT NEW 필드명. ~ ENDAT. | 인터널테이블에서 명시한 필드의 값이 변경이 시작된 행 |
AT END OF 필드명. ~ ENDAT. | 인터널테이블에서 명시한 필드의 변경된 값이 끝나는 행 |
다음은 GT_ITAB에 표와 같이 데이터가 있을 때, AT ~ ENDAT 구문에서 Catch 되는 행을 보여주고 있다.
CARRID 필드 값이 'AC', 'AF', 'SQ'인 경우 데이터가 1건만 존재하므로 각 행마다 at new CARRID와 at end of CARRID 둘 다 수행되며, 'LH'인 경우 시작하는 3행에서 at new CARRID가, 끝나는 7행에서 at end of CARRID가 수행된다. at first는 첫째 행에서, at last는 마지막 행인 8행에서 수행된다.
여기서 주의해야 할 점은 예시 데이터 기준으로 만약 at new CONNID 구문을 사용했다면, 2행이 1행과 동일한 '820' 값임에도 at new CONNID 구문이 수행된다는 점이다. 이것은 at new CONNID 구문이 CONNID 필드만 보는 것이 아니라 그 앞에 선언된 필드(들) 또한 기준 필드로 인식하기 때문이다. 즉, at new CONNID는 앞 필드까지 포함한 at new CARRID + CONNID 의미로 보면 된다.
따라서 at new ~와 at end of ~ 사용 시에는 다음 사항을 꼭 체크하도록 하자.
- 명시한 필드 기준으로 인터널 테이블을 정렬할 것
- 명시된 필드가 인터널 테이블 필드 중 몇 번째 순서에 있는지 확인하고 사용할 것
AT ~ ENDAT 구문 내에서 LOOP AT 구문의 Work area는 다음과 같이 특별하게 동작하므로 코딩 시 유의해야 한다.
- AT 구문 내에서는 Work area 필드 중 Character-type 필드는 자릿수만큼 ' * ' 로 변환됨.
- AT 구문 내에서는 Work area 필드 중 Character-type 외 필드는 초기 값(Initial Value)으로 변환됨.
- at new ~ , at end of ~ 에서는 명시한 필드 포함하여 먼저 선언된 필드들은 기존 값 유지. (변환 없음)
- LOOP AT 구문 안에서 Work area 값을 변경해도 AT 구문을 들어갔다 나오면 다시 기존 값으로 원복 됨.
이러한 제약(?) 사항으로 실무에서는 Work area와 동일한 구조체를 별도로 선언 후 AT 구문 전에 Work area의 데이터를 해당 구조체에 담아 AT구문 내에서 활용하는 방법으로 사용한다.
하나 TIP이 있다면 LOOP AT 구문에 Work area를 사용하지 않고 ASSIGNING <Field symbol>을 사용한다면 AT ~ ENDAT 구문에서 이런 제약사항 없이 데이터를 쉽게 제어할 수 있다.
추가로 AT ~ ENDAT 구문 내에 데이터 합계 시 사용되는 " SUM. " 단독 구문이 있다. at first ~, at last ~ 는 전체 데이터 기준으로, at new ~, at end of ~ 는 명시한 필드의 데이터 기준으로 Numeric-type 필드가 합산되어 현재 Work area에 반영된다. 물론 앞서 말한 것과 같이 계산된 값은 at 구문을 빠져나오면 기존 값으로 돌아온다.
또한 LOOP AT 구문에 WHERE 조건을 넣었을 경우엔 AT 구문이 제대로 작동하지 않을 수 있기 때문에 피하는 것이 좋다. AT 구문은 해당 인터널 테이블의 전체 데이터 기준으로 라인을 체크하기 때문에 WHERE 조건으로 인해 AT 구문에 해당하는 행이 SKIP 될 수 있다.
'ABAP Basic Lv. > Concept' 카테고리의 다른 글
|ABAP개념정리| Function 구조 (0) | 2022.07.12 |
---|---|
|ABAP 개념정리| Table Work Area (0) | 2020.09.16 |
|ABAP 개념정리| TYPE과 LIKE의 차이 (2) | 2020.09.09 |
|ABAP 개념정리| Data Type (0) | 2020.09.08 |
|ABAP 개념정리| Data Object (0) | 2020.09.07 |