SAP·ABAP/ABAP

ABAP 신문법 - for in 예시

SEO_Joon 2025. 11. 5. 09:54

*&---------------------------------------------------------------------*
*& FOR IN 표현
*&
*& 인터널 테이블의 값을 다른 테이블로 옮길 때 사용합니다.
*&---------------------------------------------------------------------*

TABLES : EKPO.


TYPES : BEGIN OF GS_TEMP,
          EBELN TYPE EKPO-EBELN,
          EBELP TYPE EKPO-EBELP,
          MATNR TYPE EKPO-MATNR,
        END OF GS_TEMP,
        GT_TEMP TYPE TABLE OF GS_TEMP WITH EMPTY KEY.

TYPES : BEGIN OF GS_TEMP2,
          EBELN     TYPE EKPO-EBELN,
          EBELP     TYPE EKPO-EBELP,
          MATNR     TYPE EKPO-MATNR,
          PRICE     TYPE EKPO-NETPR,
          TEXT(100) TYPE C,
        END OF GS_TEMP2,
        GT_TEMP2 TYPE TABLE OF GS_TEMP2 WITH EMPTY KEY.

RANGES : LR_MATNR FOR EKPO-MATNR.
TYPES  : TR_MATNR LIKE RANGE OF LR_MATNR.

*DATA : LS_TEMP TYPE GS_TEMP,
*       LT_TEMP LIKE TABLE OF LS_TEMP.

**********************************************************************

SELECT *
  INTO TABLE @DATA(LT_EKPO)
  FROM EKPO
  UP TO 10 ROWS.

*DATA : LS_EKPO LIKE LINE OF LT_EKPO.

*--------------------------------------------------------------------*
* FOR~IN 기본사용
*--------------------------------------------------------------------*

"기존문법

*
*  LOOP AT LT_EKPO INTO LS_EKPO.
*
*    CLEAR LS_TEMP.
*    MOVE-CORRESPONDING LS_EKPO TO LS_TEMP.
*    APPEND LS_TEMP TO LT_TEMP.
*
*  ENDLOOP.

"신규문법
" LT_TEMP는 GT_TEMP의 구조를 가진다.
"LS_EKPO-EBELN의 값을 LS_TEMP-EBELN에 넣는다
"LS_EKPO-EBELP의 값을 LS_TEMP-EBELP에 넣는다
"LS_EKPO-MATNR의 값을 LS_TEMP-MATNR에 넣는다

"참고 / FOR 뒤에 스트럭쳐(LS_EKPO)는 자동으로 생성해줌
" 이때 LT_EKPO 의 데이터를 가지고 옴...

DATA(LT_TEMP) = VALUE GT_TEMP(
                               FOR LS_EKPO IN LT_EKPO
                                ( EBELN = LS_EKPO-EBELN
                                  EBELP = LS_EKPO-EBELP
                                  MATNR = LS_EKPO-MATNR )  ).


*DATA(LT_TEMP2) = VALUE GT_TEMP(
*                               FOR LS_MARA IN LT_MARA
*                                (
*                                  MATNR = LS_MARA-MATNR )  ).


*--------------------------------------------------------------------*
* FOR~IN WHERE 조건
*--------------------------------------------------------------------*

"기존 문법
*LOOP AT LT_EKPO INTO LS_EKPO WHERE EBELN = '4500000236'.
*
*  CLEAR LS_TEMP2.
*  MOVE-CORRESPONDING LT_EKPO TO LS_TEMP2.
*  APPEND LS_TEMP2 TO LT_TEMP2.
*
*ENDLOOP.


"신규 문법
DATA(LT_TEMP2) = VALUE GT_TEMP(
                                FOR LS_EKPO IN LT_EKPO
                                WHERE ( EBELN = '4500000236' )
                                ( EBELN = LS_EKPO-EBELN
                                  EBELP = LS_EKPO-EBELP
                                  MATNR = LS_EKPO-MATNR ) ).

*--------------------------------------------------------------------*
* FOR~IN~LET
*--------------------------------------------------------------------*

"TR_MATNR의 구조를 갖는다
"FOR 뒤에 스트럭쳐(LS_EKPO)는 자동으로 생성해줌
" => LT_EKPO 의 데이터를 가지고 옴...
"EBELN 값이 4500000236 ~ 4500000461 사이값을 가져옴
"LET은 임시로 변수 선언해 주는 것
" IN에 선언해준 값을 밀어 넣어줌


DATA(LT_TEMP3) = VALUE TR_MATNR(
                                  FOR LS_EKPO IN LT_EKPO
                                  WHERE ( EBELN BETWEEN 4500000236 AND 4500000461 )
                                  LET S      = 'I'
                                      O      = 'AA'
                                   IN SIGN   = S
                                      OPTION = O
                                    ( LOW    = LS_EKPO-MATNR ) ).


*** 기존문법으로 변환
*DATA : LS_TEMP3 LIKE LR_MATNR,
*       LT_TEMP3 LIKE TABLE OF LS_TEMP3.
*DATA : S(1) , O(2).
*
*LOOP AT LT_EKPO INTO LS_EKPO WHERE ( EBELN BETWEEN 4500000236 AND 4500000461 ).
*
*  S = 'I'.
*  O = 'BT'.
*
*  LS_TEMP3-SIGN   = S.
*  LS_TEMP3-OPTION = O.
*  LS_TEMP3-LOW    = LS_EKPO-MATNR.
*
*ENDLOOP.



*DATA(LT_TEMP4) = VALUE GT_TEMP2(
*                                FOR LS_EKPO IN LT_EKPO
*                                LET P = LS_EKPO-MENGE * LS_EKPO-NETPR
*                                 IN ( PRICE = P
*                                      EBELN = LS_EKPO-EBELN
*                                      EBELP = LS_EKPO-EBELP
*                                      MATNR = LS_EKPO-MATNR ) ) .



DATA(LT_TEMP5) = VALUE GT_TEMP2(
                                 FOR LS_EKPO IN LT_EKPO
                                 LET T = |{ LS_EKPO-MATNR ALPHA = OUT }_{ LS_EKPO-MENGE } 개|
                                     P = LS_EKPO-MENGE * LS_EKPO-NETPR
                                  IN TEXT  = T
                                     PRICE = P
                                   ( EBELN = LS_EKPO-EBELN
                                     EBELP = LS_EKPO-EBELP
                                     MATNR = LS_EKPO-MATNR ) ).

CL_DEMO_OUTPUT=>DISPLAY_DATA( LT_TEMP5 ).

*BREAK-POINT.