(ABAP 코드) INTERNAL TABLE 코드
MovEManagE님의 블로그에 있는 코드를 참조하여 작성하였습니다.
https://blog.naver.com/PostView.nhn?blogId=l_yh6&logNo=221465830902
예제1) INTERNAL TABLE 속성 확인하기.
*속성값을 저장할 변수 선언
DATA CHECK_ITAB TYPE I.
DATA CHECK_ITAB2 TYPE C.
DESCRIBE TABLE ITAB_02 LINES CHECK_ITAB. " 총 라인 수
DESCRIBE TABLE ITAB_02 OCCURS CHECK_ITAB. " 초기 라인 수 반환
DESCRIBE TABLE ITAB_02 KIND CHECK_ITAB2. " INTERNAL TABLE의 타입 반환
" T: STANDARD / S: SORTED / H: HASHED
예제2) COLLECT 사용하기.
*COLLECT: INTERNAL TABLE의 숫자 타입 칼럼을 합산해주는 기능
* 데이터 선언
DATA: BEGIN OF GS_LINE,
CARRID TYPE SFLIGHT-CARRID,
CONNID TYPE SFLIGHT-CONNID,
PAYMENTSUM TYPE SFLIGHT-PAYMENTSUM,
END OF GS_LINE.
* INTERNAL TABLE 선언DATA: GT_ITAB LIKE TABLE OF GS_LINE WITH NON-UNIQUE KEY CARRID CONNID,
GT_SUM LIKE TABLE OF GS_LINE WITH NON-UNIQUE KEY CARRID CONNID.
* WORK AREA 선언DATA GS_STR LIKE LINE OF GT_ITAB.
* SFLIGHT의 데이터를 GT_ITAB 에 저장SELECT CARRID
CONNID
PAYMENTSUM INTO CORRESPONDING FIELDS OF TABLE GT_ITAB FROM SFLIGHT.
* COLLECT을 사용하여 합산된 값 결과를 GT_SUM으로 저장.
* 값을 합산하는 기준은 키 (CARRID, CONNID). 중복되는 모든 값을 합산한다.LOOP AT GT_ITAB INTO GS_STR.
COLLECT GS_STR INTO GT_SUM.
ENDLOOP.
* GROUP BY를 사용해도 같은 결과가 나온다.
SELECT CARRID CONNID SUM( PAYMENTSUM ) AS PAYMENTSUM
INTO CORRESPONDING FIELDS OF TABLE GT_ITAB FROM SFLIGHT
GROUP BY CARRID CONNID.
예제3) INTERNAL TABLE 수정.
DATA: BEGIN OF GS_LINE,
COL1 TYPE C,
COL2 TYPE I,
COL3 TYPE SY-DATUM,
END OF GS_LINE.
DATA GT_ITAB LIKE TABLE OF GS_LINE WITH NON-UNIQUE KEY CO1 COL2.
gs_line-col1 = 'AA'.
gs_line-col2 = 50.
INSERT gs_line INTO TABLE gt_itab.
gs_line-col1 = 'AA'.
gs_line-col2 = 26.
INSERT gs_line INTO TABLE gt_itab.
gs_line-col1 = 'AA'.
gs_line-col2 = 50.
gs_line-col3 = '20201029'.
MODIFY GT_ITAB FROM GS_LINE.
BREAK-POINT.
* WHERE 조건에서 수행.
DATA: BEGIN OF GS_LINE,
CARRID TYPE SFLIGHT-CARRID,
CONNID TYPE SFLIGHT-CONNID,
CARRNAME TYPE SCARR-CARRNAME,
END OF GS_LINE.
DATA GT_ITAB LIKE TABLE OF GS_LINE
SELECT CARRID CONNID INTO CORRESPONDING FIELDS OF TABLE GT_ITAB FROM SFLIGHT.
* LOOP
LOOP AT GT_ITAB INTO GS_LINE.
AT NEW CARRID. " CARRID 필드 시작할 때,
* SCARR 테이블에 있는 CARRNAME을 GS_LINE-CARRNAME으로 저장 (CARRID 가 서로 같을 경우)
SELECT SINGLE CARRNAME INTO GS_LINE-CARRNAME
FROM SCARR
WHERE CARRID = GS_LINE-CARRID.
* GT_ITAB에 CARRNAME 필드를 GS_LINE에 있는 CARRNAME 필드로 업데이트
* TRANSPORTING 다음에 지정된 필드만 업데이트 된다.
* WHERE 절로 해당 되는 모든 필드에 데이터 업데이트 가능.
MODIFY GT_ITAB FROM GS_LINE TRANSPORTING CARRNAME WHERE CARRID = GS_LINE-CARRID.
ENDAT.
ENDLOOP.
BREAK-POINT.
예제3) INTERNAL TABLE 읽기.
* BINARY SEARCH를 위해서 검색조건으로 정렬이 먼저 되어있어야 한다.
* CARRID기준으로 DATA를 READ하였지만, TRANSPORTING에 의해서 CARRID와 CARRNAME만 저장
* 되고 나머지 필드는 초기값을 갖게 된다.
* CARRID 기준으로 정렬
SORT GT_ITAB BY CARRID.
DATA GS_LINE2 LIKE GS_LINE.
* GT_ITAB에 있는 데이터 중 CARRID가 'AA' 인 것만 BINARY SEARCH를 이용해 찾은 후,
* CARRID, CARRNAME 필드만 GS_LINE2 에저장.
READ TABLE GT_ITAB INTO GS_LINE
WITH KEY CARRID = 'AA'
BINARY SEARCH
TRANSPORTING CARRID CARRNAME.
* INDEX로 읽기
READ TABLE GT_ITAB INTO GS_LINE INDEX 2.