- 인터널 테이블에서 원하는 데이터를 읽으려면 READ 구문을 사용한다.
- 만약 헤더라인이 있으면 해당 데이터가 헤더라인으로 복사되고, 그렇지 않으면 Work Area에 복사해야한다.
1. Table Key 이용
READ TABLE itab FROM wa INTO result.
READ TABLE itab WITH TABLE KEY k1 = f1.
kn = fn INTO result.
- Key 값을 이용해 값을 찾을 수 있다.
- result는 read 결과를 저장하게 되는 Work Area이다.
- 헤더라인이 존재하는 인터널 테이블은 into이하를 생략하고, 인터널 테이블 이름 자체를 Work Area로 사용해도 된다.
- 성공하면 Sy-subrc 변수에 0을 반환하고, 실패하면 4을 반환한다
DATA: BEGIN OF gs_line,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
END OF gs_line.
DATA gt_itab LIKE TABLE OF gs_line WITH NON-UNIQUE KEY carrid.
SELECT carrid carrname INTO CORRESPONDING FIELDS OF gt_itab FROM scarr.
gs_line-carrid = 'AA'.
READ TABLE gt_itab FROM gs_line INTO gs_line.
WRITE: / gs_line-carrid, gs_line-carrname.
CLEAR : gs_line.
READ TABLE gt_itab WITH TABLE KEY carrid = 'AB' INTO gs_line.
WRITE : / gs_line-carrid, gs_line-carrname.
AA AMERICAN Airlines
AB Air Berlin
- 여기서 왜 `READ TABLE gt_itab FROM gs_line INTO gs_line`이 되는 걸까?
- 같은 gs_line이라 헷갈렸다.
FROM gs_line – “찾을 조건”
- 비교대상
- gs_line 안에 들어 있는 값을 보고,
- gt_itab에서 이 값과 같은 행이 있는지 찾음
- gs_line-col1 = 'A' 이 상태에서 gt_itab 내부에 Col1 ='A'인 행을 찾는다.
INTO gs_line – “저장할 대상”
- 결과를 저장할 구조체
- 찾은 row가 있다면,
- 그 전체 행을 gs_line에 덮어씀 (즉, 복사해서 넣는다.)
| gt_itab (내부 테이블) |
|––––|––––|
| ‘A’ | 10 |
| ‘B’ | 20 |
그럼 둘 다 gs_line을 써도 되는 이유는 뭘까?
- 읽기용(FROM)과 쓰기용(INTO) 역할이 다르기 때문!
- From은 비교용, into는 결과저장용이다.
GPT공부법 시작.
- DATA gt_itab LIKE TABLE OF gs_line 으로 했을 땐 에러가 나지만, WITH ~ KEY 옵션을 주면 에러가 뜨지 않았다.
- gt_itab이 carrid 기준으로 정렬된 테이블은 아니지만, 내부적으로는 carrid를 검색 기준 필드로 간주할 수 있게한다.
- WITH TABLE KEY는 sorted, hashed에 주로 쓰이지만,
- STANDARD TABLE도 with non-unique key를 지정하면 명시적으로 키를 정의한 셈이 되어 사용할 수 있음
- 속도는 느릴 수 있고, 중복값 처리 주의해야함
2. Work Area할당
1. Read 구문의 comparing 옵션
- comparing 구문은 read구문의 결과값에 비교조건을 추가한다.
- 즉, comparing 구문 다음에 기술된 Field들이 work area값과 인터널 테이블에 존재하는 값이 같으면 sy-subrc = 0 을 반환하고, 같지 않으면 sy-suvbrc = 2를 반환한다.
- COMPARING 을 하면 값을 비교할 수 있다.
첫번째 write문은 2가 나오는데, 비교할 gs_line-col2가 없기 때문이고,
그 다음 comparing에서는 gs_line-col2값이 있기 때문에, 0이 나온다.
2. read 구문의 TRANSPORTING 옵션
- Transporting은 read한 결과를 해당 칼럼만 Target에 저장하는 기능을 수행한다.
Transporting의 이유
- 전체 필드가 필요하지 않을 때 : 성능 최적화 기능(불필요한 데이터 복사X)
- 특정 필드 하나만 비교하거나 출력할 때(필드 일부만 가져오기에 나머지는 비어있다!)
- 이 예제를 보고 의문이 든점:
gs_wa는 work area인데, 생각해보니 gs_line은 어떻게 work-area기능을 하는 걸까?
- DATA : ~ END OF gs_line 이라는 이름의 로컬 구조체 변수가 만들어짐 = 이 것도 구조체(work area)다.
- `READ TABLE gt_itab WITH TABLE KEY coll = 'A' INTO gs_wa.` 로 인해, gs_wa에 해당 행의 모든 값이 복사된다.
- `READ TABLE gt_itab WITH TABLE KEY coll = 'A' INTO gs_wa TRANSPORTING col2.` : gs_wa-col2만 복사된다.
Col1 is : Col2 is : First
-> 성능 최적화에는 좋지만, 복사 대상을 주의해야한다.
3. Index를 이용해 read구문 수행
READ TABLE itab INDEX idx INTO result.
-index를 이용하여 해당 라인의 값을 읽을 수 있음
- 성공 시, sy-subrc 변수에 0을 반환하고 실패 시에는 4를 반환한다.
- A를 세번째에 넣어지만, SORTED라 정렬된 상태라서 Index1번에 들어갔고, index1을 출력하니 잘 나오는 모습을 볼 수 있다!
4. READ BINARY SEARCH
- Standard type의 인터널 테이블을 read할 떄 binary search를 이용할 수 있다.
- binary search 대상 칼럼을 기준으로 정렬한 후 사용하며, Read 속도가 일반 속도보다 훨씬 빠르다.
READ TABLE itab WITH KEY k1 = f1 ... kn = fn INTO result BINARY SEARCH.
- binary를 하면 실행시간이 굉장히 빨라지며, application server에서 접근하기 때문에 데이터베이스에서 데이터를 가져오는 전자보다 효율적이다.
'SAP' 카테고리의 다른 글
easy abap 33. Abap Dictionary (0) | 2025.05.14 |
---|---|
easy abap 32. internal table 문제 풀기 (0) | 2025.05.14 |
easy abap 30. 인터널 테이블 삭제 (0) | 2025.05.13 |
easy abap 29. 인터널 테이블 데이터 변경 (0) | 2025.05.13 |
easy abap 28. collect (0) | 2025.05.13 |