[ABAP] DB Table-ITAB 조인(join), FOR ALL ENTRIES

홍예림·2023년 8월 3일
0

SAP ABAP(개편중...)

목록 보기
49/55
post-thumbnail

DB Table의 인터널테이블 생성 시, 다른 ITAB에 있는 필드를 기준으로 데이터를 조회한다.

신문법에서는 JOIN 시 ITAB을 사용할 수 있으나(INNER JOIN lt_data AS a), 구문법에서는 불가능해 FOR ALL ENTRIES 구문을 사용했다.

순서

  1. DB테이블의 ITAB, 조건ITAB, ITAB의 복사본 선언 및 데이터 할당
  2. 조건ITAB에서 조건에 맞는 레코드만 남긴다.
    • DELETE gt_scarr WHERE currcode NE 'EUR'.
  3. 조건ITAB을 복사한 ITAB'을 만든다.
    • MOVE-CORRESPONDING 문 사용해 복사
  4. DB테이블과 매칭할 필드를 기준으로 ITAB'을 중복제거한다.
    • SORT <ITAB'> BY <기준필드>
    • DELETE ADJACENT DUPLICATES <ITAB'> COMPARING <기준필드>
  5. ITAB'을 기준으로 DB테이블의 ITAB에 데이터를 담는다.
    • 이니셜 체크 IF <ITAB'> IS NOT INITIAL.
    • SELECT
      • FOR ALL ENTRIES IN <ITAB'>
      • WHERE <기준필드> EQ <ITAB'-기준필드>

0. 선언하기

DATA : BEGIN OF gs_sflight, <" --- 매칭 필드를 포함한 조건ITAB 선언>
         carrid     TYPE sflight-carrid,
         connid     TYPE sflight-connid,
         fldate     TYPE sflight-fldate,
         price      TYPE sflight-price,
         currency   TYPE sflight-currency,
         planetype  TYPE sflight-planetype,
         seatsmax   TYPE sflight-seatsmax,
         seatsocc   TYPE sflight-seatsocc,
         paymentsum TYPE sflight-paymentsum,
         seatsmax_b TYPE sflight-seatsmax_b,
         seatsocc_b TYPE sflight-seatsocc_b,
         seatsmax_f TYPE sflight-seatsmax_f,
         seatsocc_f TYPE sflight-seatsocc_f,
       END OF gs_sflight,
       gt_sflight LIKE TABLE OF gs_sflight,

       BEGIN OF gs_sbook, <" --- DB테이블의 ITAB 선언>
         carrid     TYPE sbook-carrid,
         connid     TYPE sbook-connid,
         fldate     TYPE sbook-fldate,
         bookid     TYPE sbook-bookid,
         custtype   TYPE sbook-custtype,
         forcuram   TYPE sbook-forcuram,
         forcurkey  TYPE sbook-forcurkey,
         order_date TYPE sbook-order_date,
       END OF gs_sbook,
       gt_sbook LIKE TABLE OF gs_sbook,

       BEGIN OF ls_key, <" -- ITAB' 선언. 매칭 기준 : CARRID, CONNID, FLDATE>
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
         fldate TYPE sflight-fldate,
       END OF ls_key,
       lt_key LIKE TABLE OF ls_key.


CLEAR   : gs_sflight, gs_sbook.
REFRESH : gt_sflight, gt_sbook, lt_key.

1. ITAB에서 조건에 맞는 레코드만 남기기

SELECT carrid connid fldate price currency planetype
       seatsmax seatsocc paymentsum seatsmax_b
       seatsocc_b seatsmax_f seatsocc_f
  INTO CORRESPONDING FIELDS OF TABLE gt_sflight
  FROM sflight
 WHERE carrid IN ('DL', 'LH').


DELETE gt_sflight WHERE planetype EQ 'A380-800'
                     OR planetype EQ 'A340-600'.

2. 조건ITAB을 복사한 ITAB'을 만들기

만들어둔 ITAB을 변형시키지 않고 매칭용 필드만 뽑아내기 위함이다.

MOVE-CORRESPONDING gt_sflight TO lt_key.

3. ITAB'에서 중복제거

중복제거하면 매칭 기준(KEY)가 될 레코드만 남는다.

SORT lt_key BY carrid connid fldate.
DELETE ADJACENT DUPLICATES FROM lt_key COMPARING carrid connid fldate.

4.DB테이블의 ITAB에 데이터를 담기

매핑 키를 담은 ITAB'을 기준으로, DB테이블의 ITAB에 레코드를 담는다.

  • FOR ALL ENTRIES 를 사용한다.
  • WHERE문의 조건은 반드시 and로 추가한다. 헤더가 있는 테이블이어도 동일하다.
IF lt_key IS NOT INITIAL.

  SELECT carrid   connid   fldate   bookid
         custtype forcuram forcurkey order_date
    INTO CORRESPONDING FIELDS OF TABLE gt_sbook
    FROM sbook
     FOR ALL ENTRIES IN lt_key
   WHERE carrid EQ lt_key-carrid
     AND connid EQ lt_key-connid
     AND fldate EQ lt_key-fldate.

ENDIF.
profile
SYNC 5반 2023.07 - 2023.12

0개의 댓글