본문 바로가기

Easy Abap 2.0

[2주차] Chapter 5 Internal Table Part 3

3. 인터널 테이블 데이터 변경

 

1) Table Key를 이용해 한 라인 변경

더보기

MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2...]

다음 구문을 사용하여 Key 값 기준으로 인터널 테이블의 라인을 변경한다.

인터널 테이블이 Non-Unique Key이고 중복된 값이 존재할 때 MODIFY 구문을 수행할 때는 첫 번째 라인이 변경된다.

헤더 라인이 있는 경우는 FROM wa 구문을 생략할 수 있다.

TRANSPORTING 구문을 이용하여 해당 칼럼만 변경할 수 있다.

 

2) WHERE 조건을 이용해 여러 라인 변경

 

하나 이상의 라인을 변경하고자 할 경우에는 WHERE 구문을 사용한다.

더보기

MODIFY TABLE itab FROM wa TRANSPORTING f1 f2...WHERE condition.

 

※ 참고사항

 

인터널 테이블을 LOOP 처리할 때 다음 4가지 구문 사용 가능

구문 설명
AT FIRST. 인터널 테이블의 첫 번째 값이 실행될 때 수행된다.
AT NEW f1.  칼럼 f1에 새로운 값이 들어올 때 수행된다.
AT END OF f1. 칼럼 f1의 값이 마지막일 때 수행된다.
AT LAST. 인터널 테이블의 마지막 값이 실행될 때 수행된다.

 

3) INDEX를 이용해 한 라인 변경

 

Index를 이용하여 해당 라인의 값을 변경할 수 있다.
Index를 이용해 값을 변경하기 때문에 당연히 Standard, Sorted Type의 인터널 테이블에서만 사용할 수 있다.

LOOP 구문 내에서는 Index 옵션은 생략할 수 있으며, 이 경우 현재 인터널 테이블의 Line Index 값을 변경하게 된다.

더보기

MODIFY itab FROM wa [ INDEX idx] [TRANSPORTING f1 f2...]

 

4. 인터널 테이블 데이터 삭제

 

1) Table Key를 이용해 한 라인 삭제

 

Key 값 기준으로 인터널 테이블의 라인을 삭제한다.

Non-Unique Key로 설정된 Standard Type의 경우
WITH TABLE KEY 구문은 중복된 Key 데이터 중에서 한 건만 삭제한다.

더보기
DELETE TABLE itab [ FROM wa].

 

DELETE TABLE itab WITH TABLE KEY k1 = f1...kn = fn.

2) WHERE 조건을 이용해 여러 라인 삭제

 

하나 이상의 라인을 삭제하려면 WHERE 구문을 사용한다.

WHERE 조건은 논리 연산으로 구성된 여러 칼럼의 조건들이 추가될 수 있다.

더보기

DELETE TABLE WHERE condition.

3) Index를 이용해 삭제

 

index를 이용해 여러 라인을 한 번에 삭제할 수도 있다. 

당연히 Hashed Type의 인터널 테이블에서는 사용할 수 없다.
다음 구문은 Index n1~n2 사이의 LIne을 삭제한다.

FROM n1 구문만 사용하면, n1번째 Index 이후의 모든 데이터를 삭제한다.

이와 반대로 TO n2 구문만 사용하면, 처음부터 n2 번째 존재하는 데이터가 삭제된다.

더보기

DELETE itab FROM n1 TO n2.

DELETE itab FROM n1.

DELETE itab TO n2.

4) ADJACENT DUPLICATE 구문을 이용해 중복 라인 삭제

 

ADJACENT DUPLICATE 구문을 이용하여 중복된 라인을 삭제할 수 있다.

이 구문을 수행하기 이전에 SORT 구문으로 인터널 테이블을 정렬해야 원하는 결과를 얻을 수 있다.

COMPARING 구문을 사용하지 않으면, Table Key 값이 중복된 데이터를 삭제한다.

이미 학습하였듯이, Key 값을 선언하지 않은 경우는 문자열의 선행 필드들이 Default Key로 구성된다.

더보기

DELETE ADJACENT DUPLICATE ENTRIES FROM itab [COMPARING f1 f2...|ALL FIELDS].

 

5. 인터널 테이블 읽기

 

인터널 테이블에서 원하는 데이터를 얻으려면 READ 구문을 사용한다.

만약, 헤더 라인이 있으면 해당 데이터는 헤더라인으로 복사되고, 그렇지 않으면 Work Area(Body)에 복사된다.

 

1) Table Key 이용

 

Key 값을 이용하여 값을 찾을 수 있다.

RESULT는 Read 결과를 저장하게 되는 Work Area이다.

헤더 라인이 존재하는 인터널 테이블은 Into~이하를 생략하고
인터널 테이블 이름 자체를 Work Area로 사용하여도 된다(= Header Line).

성공하면 SY-SUBRC 변수에 0을 반환하고, 실패하면 4를 반환한다.

SY-TABIX 변수는 LINE의 INDEX를 반환한다.

 

더보기

READ TABLE itab FROM wa INTO RESULT.

READ TABLE itab WITH TABLE KEY k1 = f1 . kn = fn INTO result.

 

2) Work Area 할당

 

READ 구문 수행 결과를 Work Area로 할당하는 구문이다.

더보기

READ TABLE itab WITH KEY k1..INTO wa
[COMPARING f1 f2...|ALL FIELDS] [TRANSPORTING f1 f1...|ALL FIELDS  | NO FIELDS].

2.1) READ 구문의 COMPARING 옵션

 

COMPARING 구문은 READ 구문의 결과값에 비교 조건을 추가한다.

즉, COMPARING 구문 다음에 기술된 Field들이
Work Area 값과 인터널 테이블에 존재하는 값이 같으면 SY-SUBRC = 0을 반환하고 같지 않으면 2를 반환한다.

 

2.2) READ 구문의 TRANSPORTING 옵션

 

TRANSPORTING은 READ 한 결과를 해당 칼럼만 Target에 저장하는 기능을 수행한다.

 

2.3) INDEX를 이용해 READ 구문 수행

 

인덱스를 이용하여 해당 라인의 값을 읽을 수 있다.

인덱스를 이용하기 떄문에 Hashed Type의 인터널 테이블에서는 사용할 수 없다.

성공 시에는 SY-SUBRC 변수에 0을 반환하고 실패 시에는 4를 반환한다.

그리고 SY-TABIX에는 인터널 테이블의 Index 순번이 저장된다.

더보기

READ TABLE itab INDEX idx INTO result.

2.4) READ BINARY SEARCH

 

Standard Type의 인터널 테이블을 READ 할 때 BINARY SEARCH를 이용할 수 있다.

BINARY SEARCH 대상 칼럼을 기준으로 정렬한 후 사용하며, READ 속도가 일반 READ 속도보다 훨씬 빠르다.

더보기

READ TABLE itab WITH KEY k1 = f1...kn = fn INTO result BINARY SEARCH.