[SAP] INTERNAL TABLE_읽기

이안·2024년 2월 19일

SAP

목록 보기
10/30
post-thumbnail

1. 기본 READ 구문

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.

2. TABLE KEY 이용

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.

3. WORK AREA 할당

1) 기본 WORK AREA 할당 (많이 사용)

* 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.

2) COMPARING 옵션

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.

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. "지정한 필드 ZMNAME만 가져오기
	IF SY-SUBRC = 0.
		WRITE :/ GS_STUDENT-ZCODE, GS_STUDENT-ZKNAME, GS_MAJOR-ZMNAME.
	ELSE.
		WRITE :/ '데이터 가져오기 실패'.
	ENDIF.
ENDLOOP.

4. INDEX 이용

* 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.

0개의 댓글