SAP/ABAP 코드

(ABAP 코드) INTERNAL TABLE 코드

haramang 2021. 6. 13. 14:21

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의 숫자 타입 칼럼을 합산해주는 기능

 

* 데이터 선언

DATABEGIN OF GS_LINE,

  CARRID TYPE SFLIGHT-CARRID,

  CONNID TYPE SFLIGHT-CONNID,

  PAYMENTSUM TYPE SFLIGHT-PAYMENTSUM,

  END OF GS_LINE.


* INTERNAL TABLE 선언

DATAGT_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 SUMPAYMENTSUM 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.