2008년 10월 6일 월요일

ABAP - Internal Table: APPEND, INSERT, DELETE,.

Internal Tablle에서 삭제를 경우는 delete, 변경을 경우에는 modify, 특정데이터를 검색할 경우에는 read table 사용

1) APPEND

명령은 데이터를 추가할 경우에 사용됩니다. 물론 INSERT명령도 자료를 추가하는 명령이지만 차이점이라고 한다면 INSERT 특정한 위치를 지정할 있으며 APPEND 기존의 데이터들에 추가하는 것으로 제일 마지막에 위치하게 됩니다.

Option으로는 다음과 같습니다.

1. APPEND [wa TO | INITIAL LINE TO] itab.

[ ]부분을 제외하면 Internal Table itab Header부분의 내용을 추가하게 됩니다.

[ ]부분을 포함하면 Working Area wa Internal Table itab 같은 형식의 레코드이어야 하며 같은 형식일 경우 wa 내용이 itab 추가 됩니다. Option 사용하기 위하여는 Internal Table 형식이 Standard 또는 Sorted Table이어야 합니다. INITIAL LINE TO 사용하면 각각의 필드에 Initial값이 채워지며 Initial값으로 구성된 레코드가 생성됩니다. [ ] 부분이 생략되면 현재의 itab Header 있는 값으로 레코드가 생성됩니다. 레코드를 추가하면 시스템 변수 sy-tabix Internal Table 생성한 레코드의 값을 저장하게 됩니다. 만약 Internal Table Sorted Table 형식이라면 레코드의 값을 추가한 다음 sort 주어야 합니다. 그렇지 않으면 Error 발생하게 됩니다.

다음은 예제 프로그램입니다.

Examples Generate a list with customer numbers:

TABLES SCUSTOM.

DATA: CUSTOMER TYPE STANDARD TABLE OF SCUSTOM-ID WITH

NON_UNIQUE DEFAULT KEY.

APPEND SCUSTOM-ID TO CUSTOMER.

Append a blank line or a line with its initial value to the above list:

APPEND INITIAL LINE TO CUSTOMER

Generate a compressed list with plane data

PARAMETERS: SEATS_LO LIKE SAPLANE-SEATSMAX DEFAULT 30,

SEATS_HI LIKE SAPLANE-SEATSMAX DEFAULT 50.

DATA: PLANE TYPE STANDARD TABLE OF SAPLANE WITH

NON-UNIQUE DEFAULT KEY,

PLANE_NEEDED LIKE SAPLANE WITH HEADER LINE.

LOOP AT PLANE INTO PLANE_NEEDED

WHERE SEATSMAX BETWEEN SEATS_LO AND SEATS_HI.

APPEND PLANE_NEEDED.

ENDLOOP.

다음의 사항은 Performance 관련되어 유의하여야 사항입니다.

1. Header Line 있는 Internal Table 사용할 Header Line 불필요한 할당은 피하는 것이 좋습니다. 값을 할당하여 테이블에 레코드를 생성하는 것은 APPEND wa TO itab. 사용하는 것이 itab = wa APPEND itab 각각 사용하는 것과 동일한 효과를 거두지만 수행 속도는 빠릅니다. The same applies to COLLECT and INSERT.

2. In contrast to COLLECT, APPEND 같은 Key값을 가지고 있는 레코드가 있는지를 검사하지 않습니다. 고로 it is considerably faster than COLLECT. If the COLLECT logic is not needed or lines with an identical default key cannot occur in a particular situation, you should always use APPEND instead of COLLECT.

3. 실행시간은 필드들의 수와 Table Line ( Size) 클수록 시간이 많이 소요 됩니다. 대략 Size 100 byte 경우 10 msn정도 소요 됩니다. (msn : standardized microseconds).

4. 하나의 Internal Table 레코드를 다른 Internal Table Append 경우 Loop보다는 3~4 정도 빠른 APPEND LINES OF 사용하기 바랍니다.

2. APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.

복수개의 레코드를 itab 추가하고자 경우에 사용하게 됩니다.

itab1 idx1레코드에서 idx2레코드 까지의 복수개 레코드를 itab2 마지막 위치에 추가하게 됩니다. 역시 Option 또한 앞의 경우와 마찬가지로 Internal Table 형식이 Standard 또는 Sorted Table이어야 합니다. 레코드를 추가하면 시스템 변수 sy-tabix Internal Table 생성한 레코드의 값을 저장하게 됩니다. 만약 Internal Table Sorted Table 형식이라면 레코드의 값을 추가한 다음 sort 주어야 합니다. 그렇지 않으면 Error 발생하게 됩니다.

다음은 예제 프로그램입니다.

Example Merge two tables containing integers

DATA: ITAB1 TYPE STANDARD TABLE OF I WITH NON-UNIQUE

DEFAULT KEY INITIAL SIZE 100,

ITAB 2 TYPE STANDARD TABLE OF I WITH NON-UNIQUE

DEFAULT KEY INITIAL SIZE 100.

APPEND 2 TO ITAB1.

APPEND 3 TO ITAB1.

APPEND 5 TO ITAB1.

APPEND 7 TO ITAB1.

APPEND 3 TO ITAB2.

APPEND INITIAL LINE TO ITAB2.

APPEND LINES OF ITAB1 FROM 2 TO 20 TO ITAB2.

위의 예제의 결과로 ITAB2 5개의 레코드를 가지며 값은 3, 0, 3, 5, 7이다.

3. APPEND [wa TO] itab SORTED BY f.

Option itab 데이터를 추가하고 필드 f 기준으로 하여 정렬하게 됩니다. 물론 추가한다는 것은 제일 마지막이 되겠죠? Option 사용하는 것은 Standard Table에만 적용됩니다.

다음은 예제 프로그램입니다.

Example

TYPES: BEGIN OF Companies_Type,

NAME(10), SALES TYPE I,

END OF Companies_Type.

DATA Companies TYPE STANDARD TABLE OF Companies_Type INITIAL SIZE 3,

WA_COMPANIES TYPE Companies_Type.

WA_COMPANIES-NAME = 'big'.

WA_COMPANIES-SALES = 90.

APPEND WA_COMPANIES TO COMPANIES.

WA_COMPANIES-NAME = 'small'.

WA_COMPANIES-SALES = 10.

APPEND WA_COMPANIES TO COMPANIES.

WA_COMPANIES-NAME = 'too small'.

WA_COMPANIES-SALES = 5.

APPEND WA_COMPANIES TO COMPANIES.

WA_COMPANIES-NAME = 'middle'.

WA_COMPANIES-SALES = 50.

APPEND WA_COMPANIES TO COMPANIES SORTED BY SALES.

위의 프로그램에서 최초 3개의 크기로 설정했습니다. 따라서 WA_COMPANIES-NAME = 'too small' 값은 WA_COMPANIES-NAME = 'middle' 추가되어 정렬 키에 의해 정렬된 결과는 4번째 순위가 되므로 없어지게 됩니다. SORTED BY 사용하시면 시스템은 항상 전체 테이블의 내용을 찾습니다. 따라서 단순히 APPEND 사용하시고 SORT문을 사용하시는 것이 좋습니다.

다음은 실행시 발생하는 Error 형식입니다.

- TABLE_INVALID_INDEX: Invalid index value (<= 0) in a FROM, TO or INDEX specification.

- ITABILLEGAL_SORT_ORDER: Sort order is incorrect following an APPEND to a sorted table.

- ITAB_DUPLICATE_KEY_IDX_OP: Inserting a key with indentical key to an existing entry where the target table is defined with UNIQUE.

2) INSERT

INSERT APPEND 달리 TABLE내의 특정한 위치에 레코드를 삽입하고자 경우에 사용하게 됩니다. 다음의 4가지 형태로 데이터를 삽입할 있습니다.

1. INSERT [wa INTO | INITIAL LINE INTO] itab [INDEX idx].

형태는 index tables, standard 혹은 sorted tables에서만 사용 가능합니다. Wa INTO 사용하면 wa 내용이 하나의 레코드로 생성됩니다. INITIAL LINE INTO 사용하면 공백의 값을 가진 레코드가 하나 생성됩니다. 만약 [wa INTO | INITIAL LINE INTO] 생략하면 Header Line 내용이 새로운 레코드로 추가됩니다. Loop문장에서 레코드를 하나 생성하면 다음 번의 Loop시에 영향을 미치게 됩니다. 다음은 예제 프로그램입니다.

Example Adding values to a table of whole numbers:

DATA: VALUE TYPE I,

ITAB TYPE I OCCURS 100 WITH HEADER LINE.

ITAB = 5.

VALUE = 36.

INSERT ITAB INDEX 1.

INSERT VALUE INTO ITAB INDEX 2.

INSERT INITIAL LINE INTO ITAB INDEX 2.

2. INSERT [wa INTO INITIAL LINE INTO] TABLE itab.

위의 형태는 1번과는 달리 모든 형태의 Table 사용할 있습니다. 만약 itab Unique key 가지는 테이블인 경우, 키가 중복이면 레코드는 추가되지 않습니다.

다음은 각각의 테이블 형태일 자료가 추가되는 방법입니다.

- STANDARD TABLE:

테이블의 마지막에 레코드가 추가됩니다. APPEND 동일한 결과입니다.

- SORTED TABLE:

테이블 내의 적절한 위치에 자료가 추가됩니다. 테이블의 Key 의하여 위치가 결정됩니다.

- HASHED TABLE:

내부의 Hash정보에 의해 테이블 키에 따라 레코드가 위치하게 됩니다.

다음은 예제 프로그램입니다.

Example Construct a table sorted by name and age:

TYPES: BEGIN OF PERSON,

NAME(10) TYPE C,

AGE TYPE I,

END OF PERSON.

DATA: P TYPE PERSON, PTAB TYPE SORTED TABLE OF PERSON

WITH UNIQUE KEY NAME AGE.

P-NAME = 'Steve'. P-AGE = 20. INSERT P INTO TABLE PTAB.

P-NAME = 'Andy'. P-AGE = 20. INSERT P INTO TABLE PTAB.

P-NAME = 'Steve'. P-AGE = 17. INSERT P INTO TABLE PTAB.

P-NAME = 'Andy'. P-AGE = 20. INSERT P INTO TABLE PTAB.

위의 결과는 다음과 같습니다.

Andy 20

Steve 17

Steve 20

그리고 SY-SUBRC 4입니다.

3. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3].

위의 형식은 Internal table itab1 내용을 itab2 추가하게 됩니다. FROM, TO 포함되면 idx1에서 idx2까지의 레코드를 idx3에서부터 추가하게 됩니다. 앞서의 설명과 동일하게 itab2 Hashed any 형식의 Table 안됩니다. 만약 Loop문장에서 idx3 생략하면 현재 Loop line앞에 레코드가 추가됩니다. 기타 사항은 앞서의 설명과 동일합니다. 다음은 예제 프로그램입니다.

Example Insert one table of names into another table of names:

TYPES NAME(10) TYPE C.

DATA: NAME_TAB_1 TYPE STANDARD TABLE OF NAME WITH

NON-UNIQUE DEFAULT KEY INITIAL SIZE 5,

NAME_TAB_2 TYPE STANDARD TABLE OF NAME WITH

NON-UNIQUE DEFAULT KEY INITIAL SIZE 5.

APPEND 'Alice' TO NAME_TAB_1.

APPEND 'Martha' TO NAME_TAB_1.

APPEND 'Ruth' TO NAME_TAB_1.

APPEND 'Harry' TO NAME_TAB_2.

APPEND 'Walter' TO NAME_TAB_2.

INSERT LINES OF NAME_TAB_1 FROM 2 INTO NAME_TAB_2 INDEX 2.

위의 결과는 NAME_TAB_1

Alice

Martha

Ruth

그리고 NAME_TAB_2

Harry

Martha

Ruth

Walter

됩니다.

4. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE itab2.

INSERT INTO TABLE 형식과 비교하여 보시기 바랍니다.

형식은 3번의 형식과 달리 table 형식에 대한 제약이 없습니다.

실행 Runtime errors 관련하여 다음의 사항이 있습니다.

- TABLE_INVALID_INDEX: 부적절한 (<= 0) in a FROM, TO or INDEX addition.

- ITAB_DUPLICATE_KEY: 이미 같은 키의 값으로 레코드가 생성되어있는 경우

- ITAB_ILLEGAL_SORT_ORDER: Sort테이블에서 중복 INSERT 경우

3) DELETE - Deleting from an Internal Table

Internal Table에서 하나 또는 복수개의 레코드를 삭제할 경우에 사용하게 됩니다. 만약 Loop문장 내에서 레코드를 삭제하면 다음 Loop에서 내용이 영향을 주게 됩니다. 다음의 7가지 형식이 있습니다.

1. DELETE itab.

형식은 Loop문장 에서 주로 사용하며 현재 Header 있는 위치의 레코드를 삭제하게 됩니다.

2. DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.

형식은 테이블 Key 주어진 조건을 만족하는 데이터를 삭제하게 됩니다. 만약 조건을 만족하는 레코드가 하나 이상이면 첫번째 데이터가 삭제됩니다.

- STANDARD TABLE:

The system starts searching for the entry at the start of the table. This means that generic deletion has linear costs.

- SORTED TABLE:

The system searches for the entry using the table key. Generic deletion for tables of this type has a logarithmic cost.

- HASHED TABLE:

The system uses the hash algorithm and the table key to locate the entry. The time required is constant. Tables with deleted entries require a preceding/following administration. The first deletion operation has to set this up, and therefore has linear costs. After the deletion, the space required for each table entry increases by 8 bytes.

3. DELETE TABLE itab [FROM wa].

2번의 형식과 유사함. Wa 필드명과 itab 필드명과 Match되어서 데이터가 Move됩니다. 만약 itab Header Line 있으면 Header Line 동일한 레코드가 삭제 됩니다.

4. DELETE itab INDEX idx.

Idx번째 레코드를 삭제합니다. 테이블은 Standard이거나 Sorted테이블이어야 합니다.

5. DELETE itab FROM idx1 TO idx2.

Itab idx1번째 레코드에서부터 idx2번째 레코드 까지를 삭제하게 됩니다.

6. DELETE itab WHERE logexp.

WHERE이하의 조건을 만족하는 레코드를 삭제하게 됩니다.(하나이상 삭제가능) 형식은 다음의 가지 형태를 부가적으로 사용할 있습니다.

- FROM idx1

조건을 적용시킬 레코드의 시작 위치

- TO idx2

조건을 적용시킬 레코드의 마지막 위치.

다음은 예제 프로그램입니다. 참고하시기 바랍니다.

Example Internal 테이블의 5 ~ 36까지의 레코드를 범위로 하여 문자 ‘A’, ‘B’, ‘C’

시작하는 문자들을 삭제합니다.

TYPES: BEGIN OF NAMETAB_TYPE,

NAME(30) TYPE C,

END OF NAMETAB_TYPE.

DATA: NAMETAB TYPE STANDARD TABLE OF NAMETAB_TYPE WITH

NON-UNIQUE DEFAULT KEY INITIAL SIZE 100.

...

DELETE NAMETAB FROM 5 TO 36 WHERE NAME CA 'ABC'.

7. DELETE ADJACENT DUPLICATES FROM itab.

Internal Table 중복되는 데이터들을 삭제하여 줍니다. 5개의 동일한 값을 가진 레코드가 존재한다면 4개의 레코드를 삭제하고 하나만 남기게 됩니다.

형식은 다음의 가지 Option 가질 있습니다.

- COMPARING f1 f2 ...

형태는 비교하는 내용이 필드 f1 f2 비교하게 됩니다.

- COMPARING ALL FIELDS

형태는 모든 필드들의 값을 비교하게 됩니다.

4) MODIFY - Changing an Internal Table

Internal Table 레코드 값들을 변경하고자 경우에 사용됩니다.

다음의 3가지 형태를 취할 있습니다.

1. MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 ... fn].

Index 가지는 테이블에 대하여 사용할 있으며 wa 기술하면 wa 내용으로 처리를 하게 되며 wa 기술하지 않으면 Header 내용을 가지고 처리하게 됩니다. Idx 기술하면 idx라인이 변경 되며 transport 기술하면 기술되어 있는 필드들만 수정됩니다.

2. MODIFY TABLE itab [FROM wa] [TRANSPORTING f1 ... fn].

1번과 동일한 내용이지만 모든 테이블에 대하여 사용할 있다는 점만 틀리게 됩니다.

- STANDARD TABLE:

The table is searched sequentially by its table key. The

first entry found is changed. The runtime required for the

search is in linear relation to the number of table

entries.

- SORTED TABLE:

The table is searched by its table key using a binary

search. In tables with a non-unique key (NON-UNIQUE) only

the first entry in the list of duplicates is changed. The

runtime required for the search is in logarithmic relation

to the number of table entries.

- HASHED TABLE:

The entry is found and changed by table key using the

internal hash administration. The runtime required is

essentially constant, since, unlike in standard or hashed

tables, it does not depend on the number of table entries.

3. MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond.

형식은 조건을 만족하는 레코드들에 대하여 변경을 합니다.

다음은 예제 프로그램입니다.

Example Reset a status flag universally

DATA: BEGIN OF TAB OCCURS 500,

FLAG TYPE C,

COMP(20) TYPE C,

END OF TAB.

CLEAR TAB-FLAG.

MODIFY TAB TRANSPORTING FLAG WHERE FLAG = 'X'.

다음은 실행 발생하는 오류 메세지의 형식들입니다.

- ITAB_ILLEGAL_COMPONENT: 필드 이름이 잘못 기술한 경우에 발생합니다.

- ITAB_ILLEGAL_TRANSP_COMP: Transporting리스트에 잘못된 필드를 기술한 경우에 발생합니다.

5) READ - Reading an Internal Table

Internal Table내의 레코드 값을 읽어 내고자 경우에 사용하며 결과 값은 다음과 같습니다.

SY-SUBRC = 0: 레코드 읽음. SY-TABIX 읽은 레코드의 위치 값을 가진다.

SY-SUBRC = 2: 레코드 읽음. SY-TABIX 읽은 레코드의 위치 값을 가진다.

COMPARING 형식을 사용한 경우 결과값을 가지게 됩니다.

SY-SUBRC = 4: 해당 레코드가 없슴.

SY-SUBRC = 8: 해당 레코드가 없슴.

READ TABLE문은 시스템 필드변수 SY-TFILL, SY-TLENG, SY-TOCCU 값을 채우게 됩니다.

READ TABLE문은 다음의 4가지 형식으로 사용이 가능합니다.

1. READ TABLE itab FROM wa [additions].

2. READ TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn [additions].

테이블 내의 레코드 위치를 찾기 위하여 정의된 테이블 값을 사용합니다.

- STANDARD TABLE:

The system searches from the start of the table. The

response time is in linear relation to the number of table

entries.

- SORTED TABLE:

The response time is in logarithmic relation to the number

of table entries.

- HASHED TABLE:

The response time is constant.

3. READ TABLE itab WITH KEY k1 = v1 ... kn = vn [BINARY SEARCH] [additions].

4. READ TABLE itab INDEX i [additions].

정확한 레코드의 위치를 선택하기 위하여 특정한 키값을 이용합니다. 만약 복수개의 레코드가 존재하면 시스템은 첫번째의 레코드를 선택합니다.