3. 인터널 테이블 종류
- 인터널 테이블 종류는 개별 Entry에 접근하는 방법을 결정하며, 3가지 종류로 구분된다.
- STANDARD TABLE - INDEX TABLE
- SORTED TABLE - INDEX TABLE
- HASHED TABLE
1. Standard Table
- 순차적 Index를 가지는 테이블이며 Tree 구조를 이루고 있다.
- READ, MODIFY, DELETE 구문으 사용할 때도 Index를 사용
- 키는 항상 Non-unique로 선언해야한다. 따라서 WITH UNIQUE 구문을 사용할 수 없다.
DATA: itab TYPE STANDARD TABLE OF <t_str>
WITH NON-UNIQUE KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
<예제 5-5> - Standard 타입 인터널 테이블 선언하여 데이터 추가, 출력하는 프로그램
***1. STURCTURE Type 선언
*TYPES : BEGIN OF t_line,
* field1 TYPE c LENGTH 5,
* field2 TYPE c LENGTH 4,
* field3 TYPE i,
* END OF t_line.
*
***2. Standard Table 타입 선언
*TYPES t_tab TYPE STANDARD TABLE OF t_line WITH NON-UNIQUE DEFAULT KEY.
*
***3. Internal table 선언
*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. "Enjoy ABAP 1"
- 인터널 테이블의 key를 선언할 때 개발자가 직접 정의하는 칼럼을 User Define Key라고 한다.
<인터널 테이블의 개별 Line에 접근하는 문장>
DATA gt_itab TYPE STANDARD TABLE OF t_line WITH KEY field1.
2. Sorted Table
- Sorted Table은 Key 값으로 항상 정렬된 인터널 테이블 타입이다.
- 즉 개발자가 원하는 Key값으로 항상 정렬된 결고로 인터널 테이블에 저장하는 경우 사용한다.
- Index 또는 Key로 해당 Row를 찾아갈 수 있다.
- Standard Table은 WITH NON-UNIQUE만 사용가능하나 Sorted Table은 WITH UNIQUE도 사용할 수 있다.
- Sorted Table은 이미 정렬되어 있기 때문에 Sort 명령어를 사용하면 오류가 발생한다.
<예제 5-6> - Sorted Type의 인터널 테이블선언, 2개 entry 추가
***1. 스트럭쳐 타입 선언
*TYPES : BEGIN OF t_line,
* col TYPE c,
* seq TYPE i,
* END OF t_line.
*
***2. Sorted 테이블 타입 선언
*TYPES t_tab TYPE SORTED TABLE OF t_line WITH UNIQUE KEY col.
*
***3. 인터널 테이블 선언
*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. "B 1"
- INSERT가 아니라 APPEND를 쓰면 오류가 난다고 한다.
- Sorted Table은 자동으로 정렬해주는데 INSERT구문을 쓰면 알아서 값을 적절한 위치에 넣어주지만 APPEND구문을 쓰면 무조건 맨 밑에 값을 추가해주기 때문에 오류가 나는 "것 같다."ㅋㅋㅋ
3. Hashed Table
- 순차적인 Index를 갖고 있지 않고, Hash 값으로 계산된 Key 값으로만 탐색 가능하다.
- Hashed Table은 반드시 Unique하게 선언되어야 한다.
- Hashed Type의 인터널 테이블은 Index가 엇어서 READ TABLE ~ INDEX 구문을 사용할 수 없다.
- 대신 READ TABLE ~ WITH TABLE KEY 또는 WITH KEY 구문을 이용해서 인터널 테이블에 접근할 수 있다.
<예제 5-7>
***1. structure type 선언
*TYPES : BEGIN OF t_line,
* col TYPE c,
* seq TYPE i,
* END OF t_line.
*
***2. hashed table 타입 선언
*TYPES t_tab TYPE HASHED TABLE OF t_line WITH UNIQUE KEY col.
*
***3. internal table 선언
*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. "A 2"
4. 인터널 테이블 속도 비교
1. Standard vs. Sorted Table
- Standard Table의 Key Access 속도는 인터널 테이블의 Line 수에 따라 선형 종속적으로 증가한다.
- Sorted Table의 Key Access 속도는 인터널 테이블의 Line 수에 따라 지수 함수로 증가한다.
- 즉 테이블의 건수가 증가할 수 록 Sorted Table의 탐색 속도가 월등히 빠르다.
- APPEND 구문 : Standard table이 더 빠르다.
- READ 구문 : Sorted Table이 더 빠르다.
2. BINARY SEARCH(Standard Internal Table)
- Standard Table은 반드시 SORT 구문으로 정렬한 후 BINARY SEARCH로 수행해야 한다.
(2, 1, 5, 6, 3, 7, 9, 4, 8, 10)의 데이터 중 '9'를 BINARY SEARCH가 어떻게 탐색하는가?
1. SORT 명령어로 (1, 2, 3, ~ , 10) 으로 정렬한다.
2. 중간값(5)와 '9'를 비교.
3. (6~10)의 중간값(8)과 '9'를 비교.
4. '9' 찾음.
=> 3번의 시도로 찾앗다. / Full Scan 하면 순서대로 8번 시도만에 찾게 될 것이다.
<예제 5-11> - BINARY SEARCH 하지 않는 경우
*TYPES: BEGIN OF line,
* col1 TYPE i,
* col2 TYPE i,
* col3 TYPE i,
* END OF line.
*
*DATA itab TYPE STANDARD TABLE OF line WITH KEY col1 WITH HEADER LINE.
*
*DO 10000000 TIMES.
* itab-col1 = sy-index.
* itab-col2 = sy-index.
* itab-col3 = sy-index.
* INSERT TABLE itab.
*ENDDO.
*
*SORT itab BY col1 col2 col3.
*
*READ TABLE itab WITH KEY col1 = 5000 col2 = 100 col3 = 999999.
<예제 5-12> - BINARY SEARCH 사용하는 경우
*TYPES: BEGIN OF line,
* col1 TYPE i,
* col2 TYPE i,
* col3 TYPE i,
* END OF line.
*
*DATA itab TYPE STANDARD TABLE OF line WITH KEY col1 WITH HEADER LINE.
*
*DO 10000000 TIMES.
* itab-col1 = sy-index.
* itab-col2 = sy-index.
* itab-col3 = sy-index.
* INSERT TABLE itab.
*ENDDO.
*
*SORT itab BY col1 col2 col3.
*
*READ TABLE itab WITH KEY col1 = 5000 col2 = 100 col3 = 999999 BINARY SEARCH.
- BINARY SEARCH가 일반 Search보다 READ 속도가 더 빠르지만, 데이터 건수가 많을 수록 SORT하는데 들어가는 시간이 BINARY SEARCH로 얻을 수 잇는 시간 감소량보다 더 많을 수 있기에 적절히 사용해야한다.
3. BINARY SEARCH vs. Sorted
- Sorted Table에서 READ 구문을 사용하는 것이 Standard Table에서 Sort 쓰고 BINARY SEARCH 쓰는 것 보다 속도가 더 빠르다.
<예제 5-13> - Sorted Table에서 READ 구문을 사용하기
*TYPES: BEGIN OF line,
* col1 TYPE i,
* col2 TYPE i,
* col3 TYPE i,
* END OF line.
*
*DATA itab TYPE SORTED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE.
*
*DO 10000000 TIMES.
* itab-col1 = sy-index.
* itab-col2 = sy-index.
* itab-col3 = sy-index.
* INSERT TABLE itab.
*ENDDO.
*
*READ TABLE itab WITH KEY col1 = 5000 col2 = 100 col3 = 999999.
4. Hashed Table 속도 측정
<예제 5-14>
*TYPES: BEGIN OF line,
* col1 TYPE i,
* col2 TYPE i,
* col3 TYPE i,
* END OF line.
*
*DATA itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE.
*
*DO 15000000 TIMES.
* itab-col1 = sy-index.
* itab-col2 = sy-index.
* itab-col3 = sy-index.
* INSERT TABLE itab.
*ENDDO.
*
*READ TABLE itab WITH KEY col1 = 999999.
<구문 별 인터널 테이블 타입에 따른 속도 차이>
- APPEND : Standard > Hashed > Sorted
- READ : Hashed > Sorted > Standard
<인터널 테이블 타입에 따른 접근 방법 차이>
Stnadard table | Sorted Table | Hash Table | |
Index Access | Yes | Yes | No |
Key Access | Yes | Yes | Yes |
Key Values | Not Unique | Unique / Not Unique | Unique |
권장되는 Access 방법 | Index 권장 | Key 권장 | Key만 사용 |
5. 인터널 테이블 명령어
1. 인터널 테이블 값 할당
- 인터널 테이블도 MOVE 구문을 사용해 값 할당 가능.
- 헤더라인 있는 인터널 테이블은 헤더라인 값만 복사.
MOVE itab1 TO itab2. ( "itab2 = itab1"과 같다.)
- BODY를 복사하고 싶으면
MOVE itab1 [ ] To itab2 [ ]. ("itab2 [ ] = itab1 [ ]"과 같다.)
- 다만 itab 타입이 같아야 한다.
<예제 5-15>
*TYPES: BEGIN OF t_line,
* col1 TYPE i,
* col2 TYPE i,
* END OF t_line.
*
*DATA: gt_itab1 TYPE STANDARD TABLE OF t_line WITH HEADER LINE, * gt_itab2 TYPE STANDARD TABLE OF t_line,
* gs_wa LIKE LINE OF gt_itab2.
*
*DO 5 TIMES.
* gt_itab1-col1 = sy-index.
* gt_itab1-col2 = sy-index * 2.
* INSERT TABLE gt_itab1.
*ENDDO.
*
*MOVE gt_itab1[] TO gt_itab2.
*
*LOOP AT gt_itab2 INTO gs_wa.
* WRITE: / gs_wa-col1, gs_wa-col2.
*ENDLOOP.
2. 인터널 테이블 초기화
<인터널 테이블 초기화하는 구문>
(1) CLEAR
- 메모리 공간을 반환하지만 처음 메모리 양을 요구한 정보는 삭제하지 않는다.(?? value 값은 삭제하지 않는다는말임?)
- 헤더라인이 있는 인터널 테이블이라면 CLEAR 구문으로 헤더라인만 삭제한다.
- 헤더라인이 없는 인터널 테이블이라면 CLEAR ITAB만으로도 BODY를 Clear 한다.
- 헤더라인이 있는 인터널 테이블의 BODY를 삭제하려면 "CLEAR ITAB[ ]."으로 한다.
(2) REFRESH
- 인터널 테이블의 데이터만 지우고, 메모리 공간은 그대로 갖고 있다.(????????)
- 테이블 내용만 삭제한다.
(3) FREE
- 테이블 내용을 삭제하고, 메모리 공간을 반환한다.(??????)
<예제 5-16>
*DATA: BEGIN OF gs_line,
* col1 TYPE i,
* col2(1) TYPE c,
* END OF gs_line.
*
*DATA: gt_itab LIKE STANDARD TABLE OF gs_line.
*
*gs_line-col1 = 1.
*gs_line-col2 = 'A'.
*INSERT gs_line INTO TABLE gt_itab.
*
* REFRESH gt_itab. 1. REFRESH로 인터널 테이블 초기화
(** FREE itab. )
(** CLEAR itab. )
*
*IF gt_itab IS INITIAL. 2. IF문 돌아감.(WRITE구문 수행)
* WRITE : 'Internal table has no data.'.
* FREE gt_itab. 3. FREE gt_itab으로 메모리 사용 반환(????????)
*ENDIF.
Q) 차이를 잘 모르겠음.
3. 인터널 테이블 정렬
1. SORT
- Standard나 hashed 타입의 인터널 테이블을 정렬하기 위해서
SORT ITAB [ASCENDING | DESCENDING]
를 사용한다.
- SORT 정렬의 기본 값은 ASCENDING이다.
- Sorted Table에서 SORT명령어를 사용하면 Syntax Error를 만나게 된다.
2. SORT 칼럼 지정
- 정렬이 필요한 칼럼을 임의로 지정하고 싶은 경우.
SORT ITAB [ ASCENDING | DESCENDING ]
BY f1 [ ASCENDING | DESCENDING ]
....
fn [ ASCENDING | DESCENDING ].
3. Stable SORT
- SORT 명령어 사용하면 Sort Sequence가 변하는데 Stable Sort 구문을 활용하면 Sort Sequence가 보존된다.
SORT Itab ... STABLE.
- STABLE SORT가 뭐냐면 예를들어
1) [ 3, 1, 2, 1] 의 문자열이 있는데
2) 1이 두개 있지만 순서대로 나타내자면 [ 3(1), 1(2), 2(3), 1(4)]로 나타낼 수 있다.
3) 이 문자열을 정렬하면 [ 1(2), 1(4), 2(3), 3(1) ] 로 중복된 숫자 1끼리도 순서가 정렬이 된다는 것.
<예제 5-17>
* DATA : BEGIN OF gs_line,
* col1 TYPE c,
* col2 TYPE i,
* END OF gs_line.
*
* DATA gt_itab LIKE STANDARD TABLE OF gs_line WITH NON-UNIQUE KEY col1.
*
* gs_line-col1 = 'B'.
* gs_line-col2 = 3.
* APPEND gs_line TO gt_itab.
*
* gs_line-col1 = 'C'.
* gs_line-col2 = 4.
* APPEND gs_line TO gt_itab.
*
* gs_line-col1 = 'A'.
* gs_line-col2 = 2.
* APPEND gs_line TO gt_itab.
*
* gs_line-col1 = 'A'.
* gs_line-col2 = 1.
* APPEND gs_line TO gt_itab.
*
* SORT gt_itab.
* PERFORM write_data.
*
* SORT gt_itab BY col1 col2.
* PERFORM write_data.
*
* SORT gt_itab BY col1 DESCENDING col2 ASCENDING.
* PERFORM write_data.
*
* FORM write_data .
* LOOP AT gt_itab INTO gs_line.
* WRITE : / gs_line-col1, gs_line-col2.
* ENDLOOP.
* ULINE.
* ENDFORM.
4. 인터널 테이블 속성 알아내기
- 인터널 테이블 속성을 알려면 DESCRIBE구문을 사용.
- LINES는 인터널 테이블에 존재하는 현재 라인 수 반환
- OCCURS는 인터널 테이블의 초기 라인 수를 반환
- KIND는 인터널 테이블의 종류를 반환
- 'T'는 Standard table, 'S'는 Sorted Table, 'H'는 Hashed table을 의미
DESCRIBE TABLE itab [ LINES gv_line] [OCCURS gv_init] [KIND gv_kind].
<예제 5-18>
*DATA: BEGIN OF gs_line,
* col1 TYPE c,
* col2 TYPE i,
* END OF gs_line.
*
*DATA gt_itab LIKE STANDARD TABLE OF gs_line INITIAL SIZE 10.
*
*DATA: gv_line TYPE i.
*
*DO 20 TIMES.
* gs_line-col1 = sy-index.
* gs_line-col2 = sy-index * 2.
* INSERT gs_line INTO TABLE gt_itab.
*ENDDO.
*
*DESCRIBE TABLE gt_itab LINES gv_line.
*WRITE: / 'Internal Table Line is :', gv_line. "Internal Table Line is : 20"
Q) 이게 어디 필요함??????
출처: https://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788965400288
Easy ABAP 2.0 - 교보문고
기본 이론과 실무 예제로 새롭게 꾸민『Easy ABAP 2.0』. 기본 이론과 예제 프로그램의 실습으로 단계적으로 ABAP 프로그램을 완성해갈 수 있도록 구성된 교재이다. 이론 부분은 1장 ~ 11장으로 구성��
www.kyobobook.co.kr
'어쩌다 SAP > 어쩌다 ABAP' 카테고리의 다른 글
10일차) Debugging (0) | 2020.09.07 |
---|---|
9일차) 인터널 테이블 데이터 추가, 변경, 삭제, 읽기 (0) | 2020.09.04 |
7일차) Overview: Function, GROUDP 생성 MODULE~ 인터널 테이블과 헤더라인 (0) | 2020.09.02 |
6일차) Subroutine 정의, Subroutine 파라미터 (0) | 2020.08.31 |
5일차) NATIVE SQL (0) | 2020.08.28 |