MOVE-CORRESPONDING ~ TO / APPEND LINES OF

홍예림·2023년 7월 12일
0

SAP ABAP(개편중...)

목록 보기
26/55
post-thumbnail

INTRO

  • 인터널 테이블에 APPEND를 통해 데이터를 생성한다 (값 또는 변수를 저장)
  • 기존에 있던 다른 인터널 테이블에 데이터를 채우는 작업을 배울 것.
  • 지금까지 배운 지식의 종합

인터널테이블에 정보 채우기

  • 다른 ITAB의 DATA 중 원하는 조건에 맞는 레코드만 출력용 ITAB에 담는 법
<* gs_list = 출력용 *>
DATA : BEGIN OF gs_list,
        carrid     TYPE scarr-carrid,
        connect_no TYPE spfli-connect_no,
        connid     TYPE spfli-connid,
        countryfr  TYPE spfli-countryfr,
        countryto  TYPE spfli-countryto,
        fltime     TYPE spfli-fltime,
        deptime    TYPE spfli-deptime,
       END OF gs_list,

       gt_list LIKE TABLE OF gs_list,
       gs_spfli TYPE spfli,
       gt_spfli TYPE TABLE OF spfli.

CLEAR   : gs_list, gs_spfli.
REFRESH : gt_list, gt_spfli.

<* 다른 ITAB의 DATA  원하는 조건에 맞는 레코드만 출력용 ITAB에 담는법 학습 *>
<* spfli의 데이터를 가져와 gt_spfli에 담는다 *>
SELECT carrid connid countryfr cityfrom airpfrom countryto
       cityto airpto fltime    deptime  arrtime  distance
       distid fltype period
  INTO CORRESPONDING FIELDS OF TABLE gt_spfli
  FROM spfli.

<* 에러캐치문 *>
  IF sy-subrc NE 0.
     WRITE : 'Data not found'.
     STOP.
  ENDIF.

<* CARRID  'DL','KO','LH'인 레코드만 출력용 ITAB에 저장하기 *>
LOOP AT gt_list INTO gs_list.

  IF gs_spfli-carrid EQ 'DL' OR
     gs_spfli-carrid EQ 'KO' OR
     gs_spfli-carrid EQ 'LH'.

    gs_list-carrid    = gs_spfli-carrid.
    gs_list-connid    = gs_spfli-connid.
    gs_list-countryfr = gs_spfli-countryfr.
    gs_list-countryto = gs_spfli-countryto.
    gs_list-fltime    = gs_spfli-fltime.
    gs_list-deptime   = gs_spfli-deptime.

<* 적재 : gt_list는 텅텅 비어있으므로 MODIFY가 아니라  APPEND를 사용한다 *>
    APPEND gs_list TO gt_list.
    CLEAR  gs_list. <" 다음 사용을 위해  CLEAR한다 *>

  ENDIF.

ENDLOOP.

데이터 할당 방법들

<할당 연산자>
    gs_list-carrid    = gs_spfli-carrid.
    gs_list-connid    = gs_spfli-connid.
    gs_list-countryfr = gs_spfli-countryfr.
    gs_list-countryto = gs_spfli-countryto.
    gs_list-fltime    = gs_spfli-fltime.
    gs_list-deptime   = gs_spfli-deptime.
    
<MOVE 구문>
    MOVE : gs_spfli-carrid TO gs_list-carrid,
       gs_spfli-connid     TO gs_list-connid,
       gs_spfli-countryfr  TO gs_list-countryfr,
       gs_spfli-countryto  TO gs_list-countryto,
       gs_spfli-fltime     TO gs_list-fltime, 
       gs_spfli-deptime    TO gs_list-deptime. 
       
 <MOVE-CORRESPONDING 구문>
 	   MOVE-CORRESPONDING gs_spfli TO gs_list.

EQ 연산자

  • 주는 WA와 받는 WA의 구조가 동일해야 한다.
<받는 필드> = <주는 필드>

MOVE ~ TO ...

  • 데이터 직접 한 개씩 할당하는 구문
    • 요즘에는 한 개 할당하는 경우, 연산자를 사용한다.
MOVE <주는 필드> TO <받는 필드>

MOVE-CORRESPONDING ~ TO ...

  • 데이터를 워크에어리어에 할당한다
  • 주는 WA와 받는 WA의 구조가 달라도 된다.
  • 실행할 때마다 이전의 데이터 위에 새 데이터가 덮어씌워진다.
MOVE-CORRESPONDING <주는 WA> TO <받는 WA>

데이터 일괄 적재하기

  • INTO CORRESPONDING FIELDS OF와 비슷한 개념

    • 여러개의 필드를 일괄로 넣기
      : SELECT ~ CORRESPONDING FIELDS OF + TABLE + 테이블(ITAB)명
    • 한 개의 데이터를 넣기
      : SELECT SINGLE ~ CORRESPONDING FIELDS OF + WA(변수)명
  • MOVE-CORRESPONDING

MOVE-CORRESPONDING <주는 테이블> TO <받는 테이블>
  • 여러 개의 데이터 할당
    : + 테이블(ITAB)명
  • 한 개의 데이터 할당
    : + WA(변수)명

MOVE-CORRESPONDING ~ to ... KEEPING TARGET LINES.

  • 기존의 데이터 위에 덧씌우는게 아니라, 밑에 덧붙이는 식으로 합친다.
MOVE-CORRESPONDING <주는 테이블> TO <받는 테이블> KEEPING TARGET LINES.

APPEND LINES OF

참고하기 https://seollal.tistory.com/725

gt_data_bak[] = gt_data[]. "헤더가 있고, 인터널테이블 사이에 구조가 똑같을 때 사용
gt_data_bak   = gt_data.
APPEND LINES OF gt_data TO gt_data_bak. "모든 라인들에 데이터 추가하기.

MOVE-CORRESPONDING gt_data[] TO gt_data_bak[]. "헤더가 있고, 인터널테이블 사이에 구조가 다를 때 사용
MOVE-CORRESPONDING gt_data   TO gt_data_bak. "필드를 찾아가서 모든 라인들을 덮어쓰기.
MOVE-CORRESPONDING gt_data   TO gt_data_bak KEEPING TARGET LINES. "필드를 찾아가서 모든 라인들을 덮어쓰되 이전 데이터를 보존하기.

실습 과제

1)

문제

풀이

* 1)
DATA : BEGIN OF gs_print,
        carrid    TYPE scarr-carrid,
        carrname  TYPE scarr-carrname,
        connid    TYPE sflight-connid,
        fldate    TYPE sflight-fldate,
        price     TYPE sflight-price,
        currency  TYPE sflight-currency,
        planetype TYPE sflight-planetype,
        url       TYPE scarr-url,
       END OF gs_print,
* 2)
       gt_print LIKE TABLE OF gs_print,
       gs_fli   LIKE gs_print,
       gt_fli   LIKE TABLE OF gs_print.

CLEAR   : gs_print.
REFRESH : gt_print, gt_fli.

SELECT a~carrid a~carrname a~url
       b~connid b~fldate   b~price b~currency b~planetype
  INTO CORRESPONDING FIELDS OF TABLE gt_fli
  FROM scarr AS a
 INNER
  JOIN sflight AS b
    ON a~carrid EQ b~carrid
 WHERE a~carrid IN ('AA', 'UA', 'QF').

IF sy-subrc NE 0.
   WRITE : 'Data not found'.
   STOP.
ENDIF.

* 3)
LOOP AT gt_fli into gs_fli.

  IF gs_fli-currency     EQ 'AUD'
     OR gs_fli-planetype EQ 'A380-800'.

     gs_fli-currency = 'KRW'.
     MOVE-CORRESPONDING gs_fli TO gs_print.

    APPEND gs_print to gt_print.
    CLEAR  gs_print.

  ENDIF.

ENDLOOP.

BREAK-POINT.

검증

profile
SYNC 3기 5반 2023.07 - 2023.12

0개의 댓글