-
[ABAP] READ 구문 정리ABAP 2023. 10. 31. 23:37
*Result
SY-SUBRC = 0 “동일하다 SY-SUBRC = 2 “값이 다르다 SY-SUBRC = 4 “해당 조건으로는 인터널테이블 내 데이터가 없다
1. 기본 READ 구문
: 원하는 데이터를 찾고자 할 때 READ 사용.
READ TABLE <ITAB> FROM <WA> (INTO RESULT
[EX]
DATA : GS_STUDENT TYPE ZEDT17_001. DATA : GS_STUDENT LIKE TABLE OF GS_STUDENT. DATA : BEGIN OF GS_MAJOR, ZCODE LIKE ZEDT17_001-ZCODE, ZPERNR LIKE ZEDT17_001-ZPERNR, ZMNAME LIKE ZEDT17_001-ZMNAME, END OF GS_MAJOR. DATA : GT_MAJOR LIKE TABLE OF GS_MAJOR. CLEAR : GS_STUDENT,GT_STUDENT,GS_MAJOR,GT_MAJOR. GS_STUDENT-ZPERNR = '00000000001'. ... APPEND GS_STUDENT TO GT_STUDENT. GS_MAJOR-ZPERNR = '00000000001'. GS_MAJOR-MNAME = '경영학과'. ... APPEND GS_MAJOR TO GT_MAJOR. "각자 다른 인터널테이블에 데이터 입력 LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR. READ TABLE GT_MAJOR FROM GS_MAJOR INTO GS_MAJOR. IF ST-SUBRC = 0. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. "loop 한번만 돌려도 서로 다른 2개의 인터널테이블의 데이터를 출력 가능 ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
2. TABLE KEY
READ TABLE <ITAB> WITH TABLE KEY 조건 (INTO RESULT)
[EX]
DATA : GS_STUDENT TYPE ZEDT17_001. DATA : GS_STUDENT LIKE TABLE OF GS_STUDENT. DATA : BEGIN OF GS_MAJOR, ZCODE LIKE ZEDT17_001-ZCODE, ZPERNR LIKE ZEDT17_001-ZPERNR, ZMNAME LIKE ZEDT17_001-ZMNAME, END OF GS_MAJOR. DATA : GT_MAJOR LIKE TABLE OF GS_MAJOR WITH NON-UNIQUE KEY ZCODE. '' LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. READ TABLE GT_MAJOR WITH TABLE KEY ZCODE = GS_STUDENT-ZCODE. INTO GS_MAJOR. IF ST-SUBRC = 0. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
3. WORK AREA 할당
1) 기본
LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE ZPERNR = GS_STUDENT-ZPERNR INTO GS_MAJOR. IF ST-SUBRC = 0. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
2) comparing
: READ 구문 수행 결가를 WORK AREA로 할당하는 구문
→ 진짜 있는 데이터인지 확인하는 것
LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR. READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE INTO GS_MAJOR COMPARING ZCODE. IF ST-SUBRC = 0. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
3) transporting
: READ한 결과를 해당 칼럼만 타겟에 저장
LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR. READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE INTO GS_MAJOR TRANSPORTING ZMNAME. IF ST-SUBRC = 0. GS_STUDENT-ZKNAME = GS_MAJOR-ZKNAME. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
4. INDEX (거의 사용 X)
LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR. READ TABLE GT_MAJOR INTO GS_MAJOR INDEX SY-TABIX. IF ST-SUBRC = 0. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
5. READ BINARY SEARCH
: Read Table 시 데이터를 빠르게 찾아내기 위해 사용
LOOP 안에서 인터널테이블 READ시 FULL SCAN → 성능 저하
이진탐색 알고리즘 기법을 통해 search
*SORT 로 데이터 정렬 후 search
[EX]
SORT GT_STUDENT BY ZCODE. SORT GT_MAJOR BY ZCODE. LOOP AT GT_STUDENT INTO GS_STUDENT. CLEAR : GS_MAJOR. MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR. READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE INTO GS_MAJOR BINARY SEARCH. IF ST-SUBRC = 0. WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME. ELSE. WRITE :/ '데이터를 가져오지 못했습니다'. ENDIF. ENDLOOP.
'ABAP' 카테고리의 다른 글
[ABAP] Subscreen 생성하기 (0) 2024.01.23 [ABAP] Executable Program vs Module Pool Program (0) 2024.01.18 [ABAP] Change Request + Package 생성하기 (0) 2023.12.29 [ABAP] TABLE 생성하기 (1) 2023.11.20 [ABAP] DB TABLE 정리하기(1) (0) 2023.10.31