목차
4. 소스변환 - 2단계
LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT).
DATA(LO_CONVERT) = NEW LCL_CONVERT( ).
GS_ITAB = CORRESPONDING #( LS_SFLIGHT ).
GS_ITAB = VALUE #( BASE GS_ITAB
ICON = COND #( WHEN LS_SFLIGHT-PRICE > 1000 THEN ICON_LED_RED
WHEN LS_SFLIGHT-PRICE > 500 THEN ICON_LED_YELLOW
ELSE ICON_LED_GREEN )
CARRNAME = |항공사이름: { VALUE #( LT_SCARR[ CARRID = LS_SFLIGHT-CARRID ]-CARRNAME OPTIONAL ) }|
BOOKCNT = REDUCE I( INIT CNT = 0 FOR WA IN LT_SBOOK WHERE ( CARRID = LS_SFLIGHT-CARRID AND
CONNID = LS_SFLIGHT-CONNID AND
FLDATE = LS_SFLIGHT-FLDATE )
NEXT CNT = CNT + 1 )
CARRID = |{ GS_ITAB-CARRID ALPHA = OUT } |
PRICE = COND #( WHEN GS_ITAB-CURRENCY <> 'KRW'
THEN LO_CONVERT->CONVERT_LOCAL_CURRENCY( EXPORTING PRICE = GS_ITAB-PRICE
FCURR = GS_ITAB-CURRENCY
LCURR = 'KRW' ) )
).
APPEND GS_ITAB TO GT_ITAB.
ENDLOOP.
GS_ITAB의 필드에 값을 대입하는 부분을 VALUE 연산자를 사용하여 필드 하나하나에 대입하도록 수정하였습니다.
그전에 CORRESPONDING 연산자를 사용하여 모든필드를 한번 대입하고 VALUE 연산자에서 BASE를 사용하고 나머지 필드에만 값을 대입하도록 되어 있습니다.
CARRNAME필드에 값을 대입하는 부분이 기존엔 2줄이었는데 한줄로 수정하였습니다.
기존에는 LV_CARRNAME이라는 변수에 한번 값을 옮겼었는데 위 예제처럼 CONCATENATE안쪽에서 VALUE 연산자를 사용할 수 있습니다.
조금 복잡해지긴 했지만 배웠던 부분을 벗어난 구문은 없습니다.
이제 CORRESPONDING 연산자와 VALUE 연산자를 따로 사용했는데 하나로 합쳐보겠습니다.
5. 소스변환 - 3단계
LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT).
DATA(LO_CONVERT) = NEW LCL_CONVERT( ).
GS_ITAB = CORRESPONDING #( LS_SFLIGHT ).
GS_ITAB = VALUE #( BASE GS_ITAB
ICON = COND #( WHEN LS_SFLIGHT-PRICE > 1000 THEN ICON_LED_RED
WHEN LS_SFLIGHT-PRICE > 500 THEN ICON_LED_YELLOW
ELSE ICON_LED_GREEN )
~~~~~
기존로직의 3번째 줄을 보면 GS_ITAB = CORRESPONDING #( LS_SFLIGHT ).입니다.
즉 GS_ITAB 대신 CORRESPONDING #( LS_SFLIGHT ).을 사용해도 된다는 뜻입니다.
4번째줄의 BASE GS_ITAB대신 BASE CORRESPONDING #( LS_SFLIGHT ) 으로 수정하면 됩니다.
이렇게 되면 VALUE 연산자 안쪽에서 CORRESPONDING 연산자 사용이 가능해 집니다.
전체소스를 보면 아래와 같습니다.
LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT).
DATA(LO_CONVERT) = NEW LCL_CONVERT( ).
GS_ITAB = VALUE #( BASE CORRESPONDING #( LS_SFLIGHT )
ICON = COND #( WHEN LS_SFLIGHT-PRICE > 1000 THEN ICON_LED_RED
WHEN LS_SFLIGHT-PRICE > 500 THEN ICON_LED_YELLOW
ELSE ICON_LED_GREEN )
CARRNAME = |항공사이름: { VALUE #( LT_SCARR[ CARRID = LS_SFLIGHT-CARRID ]-CARRNAME OPTIONAL ) }|
BOOKCNT = REDUCE I( INIT CNT = 0 FOR WA IN LT_SBOOK WHERE ( CARRID = LS_SFLIGHT-CARRID AND
CONNID = LS_SFLIGHT-CONNID AND
FLDATE = LS_SFLIGHT-FLDATE )
NEXT CNT = CNT + 1 )
CARRID = |{ GS_ITAB-CARRID ALPHA = OUT } |
PRICE = COND #( WHEN GS_ITAB-CURRENCY <> 'KRW'
THEN LO_CONVERT->CONVERT_LOCAL_CURRENCY( EXPORTING PRICE = GS_ITAB-PRICE
FCURR = GS_ITAB-CURRENCY
LCURR = 'KRW' ) )
).
APPEND GS_ITAB TO GT_ITAB.
ENDLOOP.
이제 마지막으로 LOOP문 대신 FOR문으로 수정을 하고 LOOP 안에서 객체를 선언한 부분을 LET~IN 구문을 사용하도록 수정해 보겠습니다.
6. 소스변환 - 4단계
GT_ITAB = VALUE #( LET LO_CONVERT = NEW LCL_CONVERT( ) IN
FOR LS_SFLIGHT IN LT_SFLIGHT (
VALUE #( BASE CORRESPONDING #( LS_SFLIGHT )
ICON = COND #( WHEN LS_SFLIGHT-PRICE > 1000 THEN ICON_LED_RED
WHEN LS_SFLIGHT-PRICE > 500 THEN ICON_LED_YELLOW
ELSE ICON_LED_GREEN )
CARRNAME = |항공사이름: { VALUE #( LT_SCARR[ CARRID = LS_SFLIGHT-CARRID ]-CARRNAME OPTIONAL ) }|
BOOKCNT = REDUCE I( INIT CNT = 0 FOR WA IN LT_SBOOK WHERE ( CARRID = LS_SFLIGHT-CARRID AND
CONNID = LS_SFLIGHT-CONNID AND
FLDATE = LS_SFLIGHT-FLDATE )
NEXT CNT = CNT + 1 )
CARRID = |{ GS_ITAB-CARRID ALPHA = OUT } |
PRICE = COND #( WHEN GS_ITAB-CURRENCY <> 'KRW'
THEN LO_CONVERT->CONVERT_LOCAL_CURRENCY( EXPORTING PRICE = GS_ITAB-PRICE
FCURR = GS_ITAB-CURRENCY
LCURR = 'KRW' ) ) ) )
).
LOOP 대신 FOR 문을 사용하기 위해서 전체적으로 VALUE 연산자를 감쌌습니다.
그리고 LET 구문으로 CLASS의 객체를 생성하여 임시 객체변수에 담고 아랫쪽에서 사용하였습니다.
어떠신가요? 단계별로 하나씩 로직을 변환해보니 어렵지않게 NEW ABAP으로 변환이 가능하지 않나요?
익숙하지 않아서 불편하다고 과거 구문을 고집하기 보다 쉬운것부터 하나씩 사용해 보면 어떨까요?