
READ TABLE ITAB FROM WA ( INTO RESULT )
* RESULT : READ결과를 저장하는 WORK AREA
* 성공하면 SY-SUBRC = 0 / 실패하면 SY-SUBRC = 4
SY-SUBRC = 0 → 동일하다, 값이 있다
SY-SUBRC = 2 → 값이 다르다
SY-SUBRC = 4 → 해당 조건으로는 인터널테이블 내 데이터가 없다
* 인터널 테이블에 키값 지정 (READ 대상에 지정)
* 미작성시 SYNTAX에러는 발생하지 않지만 READ 불가능
DATA : GT_MAJOR LIKE TABLE GS_MAJOR WITH NON-UNIQUE KEY ZCODE.
" ...
LOOP AT GT_STUDENT INTO GS_STUDENT.
CLEAR : GS_MAJOR.
* 필요한 데이터의 키 값을 GS_MAJOR에 담기
* GS_STUDENT-ZCODE
MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR.
* GS_MAJOR에 담은 키값을 기반으로 GT_MAJOR의 정보를 읽어 결과를 GS_MAJOR에 넣기
READ TABLE GT_MAJOR FROM GS_MAJOR INTO GS_MAJOR.
IF SY-SUBRC = 0.
"LOOP를 두번이 아닌 한번 돌림으로 퍼포먼스 향상
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.
READ TABLE ITBA WITH TABLE KEY 조건 (INTO RESULT).
* RESULT -> READ결과를 저장하는 WORK AREA
* 인터널 테이블에 키값 지정 (READ 대상에 지정)
* 미작성시 SYNTAX에러 발생
DATA : GT_MAJOR LIKE TABLE GS_MAJOR WITH NON-UNIQUE KEY ZCODE.
"...
LOOP AT GT_STUDENT INTO GS_STUDENT.
CLEAR : GS_MAJOR.
* GS_MAJOR에 MOVE하지않아도 가능
* 인터널테이블 선언에서 미리 지정한 KEY값에 맞게 지정
READ TABLE GT_MAJOR WITH TABLE KEY ZCODE = GS_STUDENT-ZCODE INTO GS_MAJOR.
IF SY-SUBRC = 0.
"LOOP를 두번이 아닌 한번 돌림으로 퍼포먼스 향상
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.
* KEY 설정 굳이 하지 않아도 됨
DATA : GT_MAJOR LIKE TABLE OF GS_MAJOR.
"...
LOOP AT GT_STUDENT INTO GS_STUDENT.
CLEAR : GS_MAJOR.
* KEY FIELD 지정 후 READ
READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE INTO GS_MAJOR.
* 지정해야할 KEY FIELD 2개 이상일 경우 콤마(,)없이 지정 후 READ
READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE
ZPERNR = GS_STUDENT-ZPERNR
INTO GS_MAJOR.
IF SY-SUBRC = 0.
"LOOP를 두번이 아닌 한번 돌림으로 퍼포먼스 향상
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.
READ구문 수행 결과를 WORK AREA로 할당하는 구문
READ TABLE ITAB INTO WA COMPARING F1.
* COMPARING구문 다음에 기술된 필드들이 WORK AREA값과 인터널테이블에 존재하는 값이
* 같으면 SY_SUBRC = 0을 반환, 같지 않으면 2를 반환
LOOP AT GT_STUDENT INTO GS_STUDENT.
CLEAR : GS_MAJOR.
MOVE-CORRESPONDING GS_STUDENT TO GS_MAJOR. "1. KEY FIELD GS_MAJOR에 이동 후
READ TABLE GT_MAJOR WITH KEY ZCODE = GS_STUDENT-ZCODE
INTO GS_MAJOR
COMPARING ZCODE. "2. KEY FIELD GS_MAJOR헤더에 이동 후
IF SY-SUBRC = 0.
"3. READ TABLE로 GT_MAJOR 인터널테이블 값을 일고 결과값을 GS_MAJOR에 넣은 후
"GS_MAJOR와 GT_MAJOR의 ZCODE가 같은지 한번 더 비교
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.
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. "지정한 필드 ZMNAME만 가져오기
IF SY-SUBRC = 0.
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.
* SORT를 통해 데이터 정렬은 필수
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 SY-SUBRC = 0.
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.
READ TABLE시 데이터를 빠르게 찾아내기 위해 사용
LOOP안에서 인터널테이블 READ시 FULL SCAN을 하여 프로그램 성능 저하
→ 이진탐색 알고리즘 기법을 통해 반반 나눠 중간에 있는 것을 검사하고 동일한 키를 가진 레코드 중에 첫번째를 계속 찾아서 SEARCH
선행조건 : SORT를 통해 데이터 정렬
* SORT 필수
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 SY-SUBRC = 0.
WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
ELSE.
WRITE :/ '데이터 가져오기 실패'.
ENDIF.
ENDLOOP.