"Internal Table은 프로그램 내에서 정의하여 사용할 수 있는 Local Table이다."
Struture비교
# c언어에서의 구조체 선언
STRUCT s_type
{
CHAR no[6];
CHAR name[8];
CHAR part[16];
};
STRUCT s_type sawon.
#ABAP에서의 구조체 선언
TYPES : BEGIN OF s_type,
NO(6) TYPE C,
NAME(8) TYPE C,
PART(16) TYPE C,
END OF s_type.
DATA sawon TYPE s_type.
================================
Structure(구조체) 배열과 Internal Table
#C언어에서의 구조체 배열 선언
STRUCT sawon
{
char NO[6];
char NAME[8];
char part[16];
};
STRUCT s_type sawon[100]
#ABAP에서의 Internal Table 선언
TYPES : BEGIN OF s_type,
NO(6) TYPE C,
NAME(8) TYPE C,
PART(16) TYPE C,
END OF s_type.
TYPES t_type TYPE STANDARD TABLE OF s_type.
DATA sawon TYPE t_type INITIAL SIZE 100.
(s_type이라는 구조체 생성-> s_type을 타입으로하는 internale table 타입 정의-> t_type을 타입으로하는 sawon 테이블 선언)
=================================================================================================
*C언어에서의 배열을 선언할 때 미리 크기를 지정하는 반면, Internal Table은 INITIAL SIZE 구문으로 테이블 크기만 선언할 뿐 미리 메모리에 Load하지 않는다. 따라서 APPEND구문을 사용하여 Line이 추가될 때마다 메모리에 Load 해야 한다. 이러한 측면에서 Internal Table을 동적인 구조체 배열이라고 정의.
*Internal Table은 항상 할당과 추가구문이 쌍으로 움직여야 함.
=================================================================================================
[Internal Table 생성]
: 구조체 타입을 정의한 후 그 타입을 참고하여 생성하는 것이 일반적
# Local Table Type : 프로그램 내에서 Local Table Type을 생성하여, Internal Table 생성 시 참고
# lmplicit Table Type : ABAP Dictionary Table을 참고하여 Internal Table을 생성
# Global Table Type : ABAP Dictionary Table Type을 참고하여 Internal Table을 생성
=================================================================================================
[Internal Table의 라인 Type]
#Line Type
#Key
: Internal Table의 Row를 구분. Standard, User-defined Key 두 가지의 테이블 키가 존재.
: 키값은 Unique, Non-unique 하게 정의(Unique Key를 가지는 경우 중복된 값을 APPEND 할 수 없다.)
==================================================================================================
[Table Type]
Table 종류
#Standard Table
: 순차적인 인덱스를 가지는 테이블.
: Index를 이용하여 테이블 Entry를 찾을 때 가장 바람직한 테이블 구조.
: 키는 항상 Non-unique로 선언하여야 한다.
#Sorted Table
: Index 테이블
: 항상 정렬된 테이블
: Unique / Non-unique를 반드시 명시
#Hashed Table
: Index (x)
: hash 값으로 계산된 Key 값으로만 탐색
: 반드시 Unique하게 선언되어야 한다.
================================================================================================
[Header Line]
= Work Area.
= Internal Table 선언 시 WITH HEADER LINE 구문을 추가하면 생성
= Internal Table을 LOOP 처리하면서 개별 Line이 Header Line으로 옮겨 가는 과정.
#헤더라인을 선언한 경우
ex) LOOP AT itab
WRITE : ITAB-RCEPNO.
ENDLOOP.
ex) READ TABLE itab INDEX 2 // 2번째 라인이 헤더 라인으로 올라옴
#헤더라인을 선언하지 않은경우
ex)LOOP AT itab INTO work_area.
WRITE : work_area-carrid.
ENDLOOP.
ex) READ TABLE itab INDEX 2 INTO work_area // 정보를 옮긴후 사용
================================================================================================
ex) 헤더 라인이 존재하는 Internal Table 예제
REPORT Z07_001.
//line구조체생성
TYPES : BEGIN OF line,
col1 TYPE I,
col2 TYPE I,
END OF line.
//line구조체를 타입으로하는 HASHED TABLE itab 선언 ( 유니크 키는 col1, 헤더라인 사용)
DATA itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE.
//4번의 반복 col1(index번호) col2(index번호의 제곱) , itab에 삽입
DO 4 TIMES.
itab-col1 = sy-index.
itab-col2 = sy-index ** 2.
INSERT Table itab.
ENDDO.
//col1변수가 2인 라인을 읽음
itab-col1 = 2.
READ TABLE itab FROM itab.
//col2변수를 100으로 수정
itab-col2 = 100.
MODIFY TABLE itab.
//col1변수가 4인 라인은 지움
itab-col1 = 4.
DELETE TABLE itab.
//루프를 돌려 출력
LOOP AT itab.
WRITE : / itab-col1, itab-col2.
ENDLOOP.
===============================================================================================
ex) Header Line을 사용하지 않는 경우 예제
REORT Z07_005.
TYPES : BEGIN OF line,
col1 TYPE I,
col2 TYPE I,
END OF line,
DATA itab TYPE HASHED TABLE OF line WIHT UNIQUE KEY col1.
//Work Area 생성
DATA wa LIKE LINE OF itab.
DO 4 TIMES.
wa-col1 = sy-index.
wa-col2 = sy-index ** 2.
INSERT wa INTO TABLE itab. // Work Area에 삽입하고 itab으로 옮김
ENDDO.
wa-col1 = 2.
READ TABLE itab FROM wa INTO wa. // itab에 wa으로 col1변수가 2인것을 wa로 옮겨 읽음
wa-col2 = 100.
MODIFY TABLE itab FROM wa. // wa로부터 itab을 col2변수를 변경
wa-col1 = 4.
DELETE TABLE itab FROM wa. // wa로부터 col4인 것을 table에서 찾아 삭제
LOOP AT itab INTO wa.
WRITE : / wa-col1, wa-col2.
ENDLOOP