ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Internal Table] Internal table 개념
    SAP/Abap 2022. 1. 19. 14:44

    [Internal table: Overview]

    Internal table이란 Abap언어에서 가장 강력한 기능을 제공하는 것중 하나로 프로그램 내에서 직접 정의해 사용이 가능한 local table이다.
    • Abap의 internal table은 선언시 initial size를 지정하지만, 실제 메모리에는 해당 크기만큼 할당되지 않는다.
      • 즉, INSERT 또는 UPDATE구문으로 테이블에 데이터가 추가될때마다 추가된 line만큼 실제 메모리가 할당된다.
      • 선언된 initial size는 실제 메모리의 할당이 아닌 예약(reserve)의 의미를 갖는다.
    • Internal table의 명령어는 항상 할당과 추가가 쌍을 이루어야 한다.
      • 값이 할당되더라도 추가과정이 생략되면 internal table에는 해당 값이 존재하지 않는다.
    • Internal table의 최대 가용 size는 메모리 크기로 한정되며, 기본 2GB를 차지한다.
    Abap의 internal table은 동적인 구조체 배열(Dynamic Structure Array)이다.

     

     

    [Internal table 생성]

    일반적으로 Internal table은 해당하는 구조체 타입을 정의하고, 정의된 타입을 참고하여 생성된다.

    1) Local Table Type을 이용한 인터널 테이블 생성

    • 3단계 과정을 거쳐 인터널테이블을 생성한다.
    # First                                                                                                => 구조체 타입 선언
    TYPES : BEGIN OF t_str,
                ...
                END OF t_str.

    # Second                                                                                           => 구조체 타입을 참고하는 인터널 테이블 타입 선언
    TYPES t_itab TYPE STANDARD TABLE OF t_str WITH...

    # Third                                                                                               => 인터널테이블 타입을 참고하는 인터널테이블 선언
    DATA : gt_itab TYPE t_itab.
    • 일반적으로 실무에서는 위의 3개의 과정중 "Second" 과정을 제외한 2단계 선언법을 주로 사용한다.
      • 즉, 인터널테이블 타입 선언 없이 구조체 타입을 참고하여 인터널테이블을 생성한다.
    REPORT ZA05_01.
    
    TYPES : BEGIN OF s_type,				=> 구조체 타입 선언
      no(6)     TYPE c,
      name(10)  TYPE c,
      part(16)  TYPE c,
    END OF s_type.
    
    DATA gt_itab TYPE STANDARD TABLE OF s_type		=> 선언된 구조체 타입을 참고하여 인터널테이블 생성
      WITH NON-UNIQUE KEY no
      WITH HEADER LINE.
    
    gt_itab-no = '0001'.
    gt_itab-name = 'Easy ABAP'.
    gt_itab-part = 'SAP Team'.
    APPEND gt_itab.
    
    gt_itab-no = '0002'.
    gt_itab-name = 'Easy JAVA'.
    gt_itab-part = 'JAVA Team'.
    APPEND gt_itab.
    
    LOOP AT gt_itab.
      WRITE :/ gt_itab-no, gt_itab-name, gt_itab-part.
    ENDLOOP.
    • 위의 코드의 인터널테이블 생성부에서 TYPES 대신 LIKE 구문을 사용할 수도 있다.
    REPORT ZA05_01.
    
    ....
    
    DATA gt_itab LIKE STANDARD TABLE OF gs_type
      WITH NON-UNIQUE KEY no
      WITH HEADER LINE.
    
    ....

     

    2) Global abap dictionary type을 이용한 인터널테이블 생성

    • Abap dictionary 테이블이나, 구조체를 참고하여 인터널 테이블을 생성할 수 있다.
    REPORT ZA05_02.
    
    DATA gt_itab TYPE SORTED TABLE OF scarr WITH UNIQUE KEY carrid.
    
    DATA gs_str LIKE LINE OF gt_itab.
    
    SELECT * INTO TABLE gt_itab FROM scarr.
    
    LOOP AT gt_itab INTO gs_str.
      WRITE :/ gs_str-carrid, gs_str-carrname.
    ENDLOOP.
    • 1) Local table type을 이용한 생성법과는 달리 위의 예제에서는 LOOP AT구문에서 INTO구문을 사용해야 반복문이 동작한다.
      • 1)에서는 인터널테이블 생성시 WITH HEADER LINE 옵션을 줬지만, 2)에서는 해당 옵션을 주지 않았기 때문이다.
      • 이후 파트에서 바로 학습할 예정이다. 

     

     

     

    [Internal table과 헤더 라인(Header line)]

    Header line이란, Work area 이다.
    즉, 인터널테이블의 헤더라인은 인터널테이블 내 다수의 데이터 중 현재 작업중인 영역, 즉 work area를 의미한다.
    DATA <itab> TYPE <type> [WITH HEADER LINE].
    • LOOP작업 수행
      • Header line O: 개별 line이 차례대로 header line(work area)로 옮겨지고, 단순히 header line을 사용한다.
        • EX) INSERT TABLE itab    =>    INSERT TABLE itab FROM itab(header_line)
      • Header line X: 별도의 work area(구조체 변수)가 선언한 후 개별 line을 work area에 복사하여 사용한다.
        • EX) INSERT TABLE itab FROM wa
    Header Line이 없는 경우 Header Line이 있는 경우
    모든 Internal Table(Standard, Sorted, Hashed Type)
    INSERT wa INTO TABLE itab INSERT TABLE itab
    COLLECT wa INTO itab COLLECT itab
    READ TABLE itab... INTO wa READ TABLE itab
    MODIFY TABLE itab FROM wa... MODIFY TABLE itab...
    MODIFY itab FROM wa WHERE... MODIFY itab WHERE...
    DELETE TABLE itab FROM wa DELETE TABLE itab
    LOOP AT itab INTO wa LOOP AT itab
    Index Table(Standard, Sorted Type)
    APPEND wa TO itab APPEND itab
    INSERT wa INTO itab INSERT itab
    MODIFY itab FROM wa MODIFY itab

     

    • Header line이 있는 Internal table
    REPORT ZA05_03.
    
    TYPES : BEGIN OF t_str,
      col1 TYPE i,
      col2 TYPE i,
    END OF t_str.
    
    DATA : gt_itab TYPE TABLE OF t_str WITH HEADER LINE.
    
    DO 3 TIMES.
      gt_itab-col1 = sy-index.
      gt_itab-col2 = sy-index ** 2.
      APPEND gt_itab.
    ENDDO.
    
    LOOP AT gt_itab.
      WRITE :/ gt_itab-col1, gt_itab-col2.
    ENDLOOP.
    • Header line이 없는 Internal table
    REPORT ZA05_04.
    
    TYPES : BEGIN OF t_str,
      col1 TYPE i,
      col2 TYPE i,
    END OF t_str.
    
    DATA : gt_itab TYPE TABLE OF t_str.
    DATA : gs_str  LIKE LINE OF gt_itab.
    
    DO 3 TIMES.
      gs_str-col1 = sy-index.
      gs_str-col2 = sy-index ** 2.
      APPEND gs_str TO gt_itab..
    ENDDO.
    
    LOOP AT gt_itab INTO gs_str.
      WRITE :/ gs_str-col1, gs_str-col2.
    ENDLOOP.
    • Abap언어에 객체지향(Object Oriented)이 도입되면서 클래스 내부에서의 header line사용이 지원되지 않고, 전체적으로 header line의 미사용이 권장되지만, legacy 프로그램에서의 영향력때문에 여전히 많이 사용되는 개념이다.

     

     

    [Internal table의 종류]

    인터널테이블의 종류는 테이블 내 개별 entry에 접근하는 방식에 따라 달라진다.
    Table Type Index 유무 Key type Search type Search param
    Standard table O NON-UNIQUE 순차탐색 index, key
    Sorted table O UNIQUE | NON-UNIQUE 이진탐색 index, key
    Hashed table X UNIQUE 해시값 탐색 key의 해시값

     

     

    1) Standard Table

    DATA : itab TYPE STANDARD TABLE OF <t_str>
                            WITH NON-UNIQUE KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
    • Tree구조의 순차적 index 테이블.
      • index: 인터널테이블 내 데이터들이 위치하는 라인순번.
    • 테이블의 index와 key컬럼을 통해 개별 line의 데이터에 접근할 수 있다.
    • Standard table은 순차탐색(sequential search)을 이용한다.
    • Standard table의 key는 항상 WITH NON-UNIQUE로 선언되어야 한다.
    REPORT ZA05_05.
    
    TYPES : BEGIN OF t_line,
      field1 TYPE c LENGTH 5,
      field2 TYPE c LENGTH 4,
      field3 TYPE i,
    END OF t_line.
    
    TYPES : t_tab TYPE STANDARD TABLE OF t_line
                        WITH NON-UNIQUE DEFAULT KEY.
    
    DATA : gt_itab TYPE t_tab WITH HEADER LINE.
    
    gt_itab-field1 = 'Enjoy'.
    gt_itab-field2 = 'Abap'.
    gt_itab-field3 = 1.
    APPEND gt_itab.
    
    READ TABLE gt_itab INDEX 1.
    
    WRITE :/ gt_itab-field1, gt_itab-field2, gt_itab-field3.
    • KEY
      • DEFAULT KEY: 인터널테이블의 Type c의 모든 컬럼을 key컬럼으로 정의
      • User defined key: 개발자가 명시한 컬럼만 key컬럼으로 정의
        • ex) DATA gt_itab TYPE STANDARD TABLE OF t_line WITH KEY field1.
    • READ TABLE
      • 인터널테이블의 개별 line에 접근할 수 있는 구문.
        • ex) READ TABLE gt_itab INDEX 1.      => gt_itab 인터널테이블의 1번째 line 데이터를 READ.
      • 인터널테이블의 인덱스(index)뿐만 아니라 key 컬럼 값을 통해서도 개별 데이터에 접근이 가능하다.
        • key 컬럼 값을 통해 접근하기 위해서는 해당 테이블의 key컬럼 전체를 기술해야한다.
        • ex) READ TABLE gt_itab WITH TABLE KEY field1 = 'Enjoy' field2 = 'Abap'.

     

    2) Sorted Table

    DATA : itab TYPE STANDARD TABLE OF <t_str>
                            WITH [UNIQUE | NON-UNIQUE] KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
    • 항상 Table의 key값으로 정렬된 index 테이블.
    • 테이블의 index와 key컬럼을 통해 개별 line의 데이터에 접근할 수 있다.
    • Sorted table의 key는 WITH UNIQUE 또는 WITH NON-UNIQUE로 선언될 수 있다.
    • Sorted table은 이진탐색(binary search)을 이용한다.
    • Sorted table에서는 APPEND구문 대신 INSERT구문을 사용해야 한다.
      • APPEND구문 사용시 정렬과정에서 dump error가 발생함.
    REPORT ZA05_06.
    
    TYPES : BEGIN OF t_line,
      col TYPE c,
      seq TYPE i,
    END OF t_line.
    
    TYPES : t_tab TYPE SORTED TABLE OF t_line
                    WITH UNIQUE KEY col.
    
    DATA : gt_itab TYPE t_tab WITH HEADER LINE.
    
    gt_itab-col = 'B'.
    gt_itab-seq = '1'.
    INSERT TABLE gt_itab.
    
    gt_itab-col = 'A'.
    gt_itab-seq = '2'.
    INSERT TABLE gt_itab.
    
    CLEAR gt_itab.
    READ TABLE gt_itab INDEX 2.
    WRITE : / gt_itab-col, gt_itab-seq.

     

    3) Hashed Table

    DATA : itab TYPE STANDARD TABLE OF <t_str>
                            WITH UNIQUE KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
    • Standard, Sorted table과는 달리 index table이 아니다.
    • 테이블의 key컬럼만을 통해 개별 line의 데이터에 접근할 수 있다.
    • Hash값은 hash 알고리즘을 통해 계산된 key값을 의미한다.
      • 계산된 hash값을 통해 탐색이 이루어지며, 이를 통해 메모리에 저장된 주소값으로 직접 데이터에 접근이 가능하다.
    • Hashed table의 key는 항상 WITH UNIQUE로 선언되어야 한다.
    REPORT ZA05_07.
    
    TYPES : BEGIN OF t_line,
      col TYPE c,
      seq TYPE i,
    END OF t_line.
    
    TYPES : t_tab TYPE HASHED TABLE OF t_line
                    WITH UNIQUE KEY col.
    
    DATA : gt_itab TYPE t_tab WITH HEADER LINE.
    
    gt_itab-col = 'B'.
    gt_itab-seq = '1'.
    INSERT TABLE gt_itab.
    
    gt_itab-col = 'A'.
    gt_itab-seq = '2'.
    INSERT TABLE gt_itab.
    
    CLEAR gt_itab.
    READ TABLE gt_itab WITH TABLE KEY col = 'A'.
    WRITE : / gt_itab-col, gt_itab-seq.

     

    [Internal table : 속도비교]

    Table type Search type Search speed(Big O) Total speed
    Standard table Sequential search(순차탐색) O(n) APPEND 속도 빠름 / READ 속도 느림
    Sorted table Binary search(이진탐색) O(log(n)) APPEND 속도 가장 느림 / READ 속도 빠름
    Hashed table Hashed search(해시탐색) O(1) APPEND 속도 느림 / READ 속도 가장 빠름

     

    'SAP > Abap' 카테고리의 다른 글

    [Debugging] Debugger  (0) 2022.01.22
    [Internal Table] Internal table  (0) 2022.01.19
    [Modularization] Function  (0) 2022.01.18
    [Modularization] Subroutine  (0) 2022.01.17
    [Open SQL & Native SQL] Native SQL  (0) 2022.01.14
Designed by Tistory.