본문 바로가기

Easy Abap 2.0

[2주차] Chapter 5 Internal Table Part 2

1. 인터벌 테이블 명령어

 

1) 인터널 테이블 값 할당

  • 다른 변수와 같이 인터널 테이블도 MOVE 구문을 사용하여 값을 할당할 수 있다.
  • 인터널 테이블 타입이 같아야 한다.
  • 헤더 라인이 있으면 헤더 라인과 인터널 테이블 이름은 같다.
    이것을 구분하기 위해 인터널 테이블의 Body를 [ ] 기호를 이용해 구분한다.
    대괄호 기호 [ ] 는 헤더라인이 있는 인터널 테이블의 Body 내용을 가리킨다.
    즉, 헤더 라인이 있는 인터널 테이블의 이름은 헤더 라인을 의미하고,
    헤더 라인이 없는 인터널 테이블의 이름은 자기 자신이 된다.

    예시) DATA gt_itab1 TYPE STANDARD TABLE OF t_line WITH HEADER LINE,
                         gt_itab2 TYPE STANDARD TABLE OF t_line,
    헤더 라인 유무라는 이유 때문에 예시를 통해서
    MOVE gt_itab1 [ ] TO gt_itab2가 나온다.

2) 인터널 테이블 초기화

  • 다른 변수와 같이 인터널 테이블도 CLEAR 할 수 있다.
  • 인터널 테이블을 초기화하는 구문은 CLEAR, REFRESH, FREE가 있다.
  • 헤더 라인이 있을 때는 헤더 라인 초기화 시 CLEAR가 사용되고 
    인터널 테이블의 BODY는 REFRESH 또는 FREE가 사용되지만

    헤더 라인이 없을 떄는 인터널 테이블 BODY 에서 CLEAR, REFRESH, FREE 모두 사용된다. 
  • CLEAR 구문은 메모리 공간을 반환한다. 
    그러나 처음 메모리 양을 요구한 정보는 삭제하지 않는다.

    REFRESH 구문은 인터널 테이블의 데이터만 지우고, 메모리 공간은 그대로 가지고 있다.
    메모리 공간을 반환하려면 FREE 구문을 이용한다.

    정리를 하면

    CLEAR 구문은 인터널 테이블의 내용을 지우고 할당된 메모리도 반환하는 반면에,
    REFRESH 구문은 테이블의 내용만 삭제한다.

    REFRESH 구문을 사용하였다면, FREE 구문도 사용하여 메모리의 사용을 최소화하는 것이 필요하다.

3) 인터널 테이블 정렬

 

3.1) SORT

  • Standard 또는 Hashed Type의 인터널 테이블을 정렬 할 수 있다.
  • 테이블 키가 선언되지 않은 경우는 문자 타입의 칼럼들을 구성하여 Key 값으로 만든다.
  • SORT 정렬의 기본값은 ASCENDING(오름차순) 이다.

3.2) SORT 칼럼 지정

 

정렬이 필요한 칼럼을 임의로 지정하고 싶을 때는 다음 구문을 사용

 

더보기

SORT ITAB [ASCENDING/DESCENDING]

          BY f1 [ASCENDING/DESCENDING]

          ...

                   fn [ASCENDING/DESCENDING].'

 

이 구문을 이용하면 Table Key를 이용하지 않고 f1~fn 칼럼(※ 250개 한정)을 기준으로 정렬한다.
만약 f1~fn 칼럼의 값 중에 null이 존재하면 그 라인은 무시한다. 

 

3.3) Stable SORT

 

SORT 명령어를 사용할 때 마다 Sort Sequence(순서)가 계속 변한다.

Stable Sort 구문을 활용하면 Sort Sequence가 보존된다. 하지만 정렬 시간이 더 소요되는 단점이 있다.

Stable 온션은 같은 데이터라도 처음 위치한 순서가 SORT에 의해서 순번이 변경되지 않도록 하는 것이다.

 

[Stable 옵션 예시]

 

     숫자 5개 있다고 가정

더보기

5   4   3   2   1

문자열들이 위치한 순번을 숫자 뒤에 표시

더보기

5(1)   4(2)   3(3)    5(4)    2(5)

이 숫자들을 정렬하게 되면 ,처음에 존재했던 5라는 숫자끼리는 위치가 변동되지 않고 정렬이 되는데
이것을 STABLE SORT라고 한다.

더보기

2(5)   3(3)   4(2)   5(1)   5(4)

 

4) 인터널 테이블 속성 알아내기

 

인터널 테이블 속성을 알고자 할 경우에는 DESCRIBE 구문을 사용한다.

 

구문 예시)

더보기

DESCRIBE TABLE itab [LINES gv_line]  [OCCURS gv_init]  [KIND gv_kind] .

LINES : LINES는 인터널 테이블에 존재하는 현재 라인 수를 반환

OCCURS : 인터널 테이블의 초기 라인 수 반환

KIND: 인터널 테이블의 종류 반환

 

'T'는 Standard Table
'S'는 Sorted Table

'H'는 Hashed Table   의미

 

인터널 테이블의 속성을 반환하는 이 3가지 옵션 중에서 LINES가 주로 사용된다.

 

인터널 테이블에 Line을 삽입하는 명령어는 
INSERT, APPEND, COLLECT가 있다.

 

INSERT와 APPEND는 인터널 테이블의 마지막 라인에 데이터를 삽입하는 기능은 같지만

INSERT 구문은 Table Type에 따라 다른 기능을 수행하게 된다.

 

COLLECT 구문은 같은 Key가 있으면 숫자 타입은 SUM을 수행하고, 없으면 데이터를 추가하게 된다.

 

2. 인터널 테이블 데이터 추가

 

2.1) INSERT 구문

  • Table Key를 이용해 한 라인 추가
    더보기
    예시)  INSERT line INTO TABLE itab
    한 라인을 삽입하려면 위 구문을 사용하며, Key 값을 이용해서 인터널 테이블에 라인을 추가한다.

     - INSERT가 성공하면 , 시스템 변수 SY-SUBRC에 0이 저장된다.
     - 인터널 테이블이 UNIQUE KEY 값을 가지는 경우라면, 
       INSERT 구문 수행 시 같은 Key 값이 존재하면 SY-SUBRC에 4 값을 반환하고 덤프 에러를 발생X

  • Table Key를 이용해 여러 라인 추가
    더보기
    예시) INSERT line of itab1 [From n1] [To n2] INTO TABLE itab2

       INSERT 구문을 이용하여 여러 라인을 삽입할 수 있다.
       단, itab1과 itab2 테이블은 같은 Line Type이어야 한다.

 

  • Index를 이용해 한 라인 추가

    index 구문을 이용하면 Index 값 위치에 라인을 삽입할 수 있다.
    이 때는 Hashed Type의 인터널 테이블에는 사용할 수 없다.
    성공하게 된다면, SY-SUBRC 변수는 0 , SY-TABIX 변수는 Index 값을 반환한다.
    더보기
    예시) INSERT line INTO itab [Index idx]

 

  • 인터널 테이블 타입에 따른 INSERT 효과


테이블 타입 효과
Standard Table 데이터는 인터널 테이블의 마지막 위치에 추가된다.
APPEND 구문과 같은 효과를 가진다.
Sorted Table 데이터는 인터널 테이블의 순서에 따라 추가된다.
Non-Unique Key 타입이라면,
Duplicate Line은 같은 Key 위에 추가된다.
Hahsed table 데이터는 Table Key의 Hash Index 순서에 따라 추가된다.

 

 

2.2) APPEND 구문을 이용한 Table Line 추가


INSERT 구문은 Key와 Index를 이용해 인터널 테이블에 데이터를 추가할 수 있지만, 
APPEND 구문은 Index만 이용할 수 있다.
즉, Hashed Type의 인터널 테이블에서는 APPEND를 사용할 수 없다.

 

  • 한 라인 추가
    더보기
    예시)  APPEND Line To itab
  • 여러 라인 추가
    더보기
    예시)

    1. APPEND Lines of itab1 To itab2

    2, APPEND Lines of itab1 [From n1] [To n2] To itab2.인터널 테이블 itab1의 인덱스 n1~ n2 사이의 값을 itab2에 추가 가능하다.

 

  • 인터널 테이블 타입에 따른 APPEND 효과

테이블 타입 효과
Standard Table 추가되는 데이터는 인터널 테이블의 마지막 위치에 추가된다.
SORTED BY 옵션을 이용하여 Key 값 기준으로
DESCENDING 정렬을 하면서 추가할 수 있다.
Sorted Table 데이터가 정렬된 상태로 인터널 테이블에 추가되도록
Logic(로직)을 구성해야 한다.

그렇지 않으면 Dump Error가 발생한다.
Hashed Table APPEND 구문을 사용할 수 없다.

 

  • APPEND INITIAL LINE

    인터널 테이블을 빈 공간에 미리 생성 한 후, 라인을 추가할 수 있다.
    더보기
    예시) APPEND INITIAL LINE TO itab         
              ~         
             APPEND wa TO itab.
    SORTED BY 구문을 사용하면, 칼럼 f를 기준으로 DESCENDING 정렬을 수행하여 추가한다.
    이 때는 Standard Type의 인터널 테이블만 효력이 있으며, INITIAL SIZE 크기를 지정해야 한다.
    더보기
    예시) APPEND wa TO itab SORTED BY f.

2.3) COLLECT 구문

 

COLLECT 구문을 이용하여 인터널 테이블의 숫자 타입 칼럼을 합산하는 기능을 수행한다.

더보기

예시) COLLECT wa INTO itab

  • Key 값을 제외한 칼럼들Numeric Type(f, i, p)으로 선언되어야 한다.
  • COLLECT 구문을 수행하면, 같은 key 값이 있을 떄숫자  타입 칼럼을 합산하고 
    없을 때는 APPEND 기능을 수행한다
  • Key 값이 없는 테이블CHAR 타입 칼럼들을 기준으로 같은 작업 수행한다.