REPORT z5week_hw_0226.
TABLES: sflight, scarr, spfli.
TYPE-POOLS: slsis.
TYPES: BEGIN OF t_sflight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
price TYPE sflight-price,
currency TYPE sflight-currency,
seatsmax TYPE sflight-seatsmax,
END OF t_sflight.
DATA: it_sflight TYPE SORTED TABLE OF t_sflight WITH NON-UNIQUE KEY carrid connid,
wa_sflight TYPE t_sflight.
DATA: it_collect TYPE STANDARD TABLE OF t_sflight INITIAL SIZE 0,
it_collect2 TYPE STANDARD TABLE OF t_sflight INITIAL SIZE 0,
wa_collect TYPE t_sflight.
TYPES: BEGIN OF t_move,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
price TYPE sflight-price,
currency TYPE sflight-currency,
seatsmax TYPE sflight-seatsmax,
carrname TYPE scarr-carrname,
url TYPE scarr-url,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
deptime TYPE spfli-deptime,
arrtime TYPE spfli-arrtime,
END OF t_move.
DATA: it_move TYPE STANDARD TABLE OF t_move,
wa_move TYPE t_move.
TYPES: BEGIN OF t_scarr,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
url TYPE scarr-url,
END OF t_scarr.
DATA: it_scarr TYPE STANDARD TABLE OF t_scarr,
wa_scarr TYPE t_scarr.
TYPES: BEGIN OF t_spfli,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
deptime TYPE spfli-deptime,
arrtime TYPE spfli-arrtime,
END OF t_spfli.
DATA: it_spfli TYPE STANDARD TABLE OF t_spfli,
wa_spfli TYPE t_spfli.
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
gd_tab_group TYPE slis_t_sp_group_alv,
gd_layout TYPE slis_layout_alv,
gd_repid LIKE sy-repid.
DATA : t TYPE slis_t_sp_group_alv.
SELECTION-SCREEN BEGIN OF BLOCK part6 WITH FRAME TITLE TEXT-006.
SELECT-OPTIONS s_carrid FOR sflight-carrid.
SELECTION-SCREEN END OF BLOCK part6.
FORM data_retrieval.
DATA: ld_color(1) TYPE c.
" sflight 테이블에서 데이터 조회
SELECT carrid connid price currency seatsmax
FROM sflight
INTO TABLE it_sflight
WHERE carrid IN s_carrid.
LOOP AT it_sflight INTO wa_sflight.
COLLECT wa_sflight INTO it_collect.
ENDLOOP.
" scarr 테이블에서 데이터 조회
SELECT carrid carrname url
FROM scarr
INTO TABLE it_scarr
WHERE carrid IN s_carrid.
" spfli 테이블에서 데이터 조회
SELECT carrid connid cityfrom cityto deptime arrtime
FROM spfli
INTO TABLE it_spfli
WHERE carrid IN s_carrid.
" 데이터 처리 및 집계
LOOP AT it_collect INTO wa_collect.
CLEAR: wa_move, wa_scarr, wa_spfli.
" wa_collect의 값을 wa_move로 복사
MOVE-CORRESPONDING wa_collect TO wa_move.
" scarr에서 항공사 정보를 조회
SELECT SINGLE carrname, url FROM scarr WHERE carrid = @wa_move-carrid
INTO (@wa_move-carrname, @wa_move-url).
" spfli에서 공항 정보를 조회
READ TABLE it_spfli WITH KEY carrid = wa_move-carrid
connid = wa_move-connid
INTO wa_spfli.
IF sy-subrc = 0.
" wa_spfli의 데이터를 wa_move로 이동
wa_move-cityfrom = wa_spfli-cityfrom.
wa_move-cityto = wa_spfli-cityto.
wa_move-deptime = wa_spfli-deptime.
wa_move-arrtime = wa_spfli-arrtime.
ENDIF.
" wa_move를 it_move에 추가
APPEND wa_move TO it_move.
ENDLOOP.
ENDFORM. " DATA_RETRIEVAL
MOVE-CORRESPONDING
는 두 구조(혹은 내포된 구조) 간에 동일한 이름의 필드를 자동으로 매핑하여 값을 복사하는 ABAP 구문.
두 구조가 서로 다르더라도 구조간의 필드명이 동일한 경우, 필드들 간의 값을 자동으로 이동시키는 방식으로 동작한다. ( 행/테이블 )
MOVE-CORRESPONDING wa_collect TO wa_move.
SELECT SINGLE은 데이터베이스 테이블에서 한 개의 레코드만 조회할 때 사용되는 SQL 구문.
결과로 여러 레코드가 조회된다면 조건에 맞는 첫 번째 레코드만 반환한다.
기본적으로 SELECT SINGLE은 하나의 레코드만 반환하므로, 여러 개의 레코드를 반환하는 SELECT와는 달리 INTO 구문을 사용해 하나의 변수 또는 구조체에 값을 담는다.
SELECT SINGLE carrname, url
FROM scarr
WHERE carrid = @wa_move-carrid
INTO (@wa_move-carrname, @wa_move-url).
READ TABLE은 내부 테이블에서 특정 조건을 만족하는 레코드를 조회하는 구문
해당 레코드가 테이블에 존재하는지 여부를 확인하고, sy-subrc 시스템 변수를 통해 결과를 알 수 있다.
READ TABLE it_spfli WITH KEY carrid = wa_move-carrid
connid = wa_move-connid
INTO wa_spfli.