본문 바로가기

SAP/ABAP

Loop 구문과 Collect 구문의 구조

최종 작성일: 2024-05-29

목표: Loop 구문과 Collect 구문의 구조를 파악하여 다음번에 쓸 수 있도록 할것

 

 

1)Report(해당 프로그램명) 선언

REPORT : ZTEST_LOOP.

2)데이터 선언

types : begin  of  테이블 명

           필드명(해당 값의 자릿수) type 문자 형태  -> 테이블 안에 변수 선언부

            end     of 테이블 명

DATA:  workarea(보통 행)과 internal table( 해당 행을 쌓는 테이블)을 한쌍으로 선언하는 것이 보통임

TYPES: BEGIN OF t_loop,
      id(10)  TYPE C,
      name(10) TYPE C,
      parameter(10) TYPE P,
      END OF t_loop.
      
DATA : wa TYPE t_loop,
       it TYPE TABLE OF t_loop.

3)변수 별 값 할당

4)값을 Internal Table에 쌓기: COLLECT wa(workarea, 보통 행) INTO it(internal table, 행을 쌓는 공간)

                                                -> wa(행 단위의 값)을 it(internal table)에 쌓는 것

wa-id ='id01'.
wa-name ='test01'.
wa-parameter=100.

"option01.
append wa into it.
clear wa
"option02.
collect wa into it.
clear wa.

wa-id = 'id02'.
wa-name ='test02'
wa-parameter = 200.
collect wa into it.
clear wa.

wa-id = 'id03'.
wa-name ='test03'.
wa-parameter = 300.
collect wa into it.
clear wa.

wa-id ='id04'.
wa-name ='test04'.
wa-parameter=400.
collect wa into it.
clear wa.

 

 

5) LOOP AT  it(internal table에 쌓은 값을) INTO wa(행단위로 하나씩 쌓아)

   ENDLOOP.

-> internal table상 행을 하나씩 불러와서 wa 라는 행에 쌓음.

-> 따라서 해당 loop구문의 마지막은 it 테이블 상 마지막 행을 불러왔을 때임

LOOP AT it INTO WA.

IF sy-subrc = 0.
   WRITE /wa-id, wa-name, wa-parameter.
  ELSE 
   WRITE 'FALE'.
  ENDIF.
END LOOP.
it(INTERNAL TABLE)
테이블 정보


비고
PID PMANE PAMOUNT
IFB1 IFB WASHING MACHINE 61000 WA 1번
(LOOP구문 1번째)
-> LOOP구문 특성 상
한 행씩 불러옴
IFB2 IFB SPLIT AC 70000 WA 2번 
(LOOP구문 2번째)

 

Loop 구문 (tistory.com) 

 

Loop 구문

최초 작성일: 2024-05-29목적: loop 구문 이해하기 *&---------------------------------------------------------------------**& Report ZTEST_LOOP*&---------------------------------------------------------------------**&*&--------------------------

how2bethecoder.tistory.com

 

 

예시)

 

*&---------------------------------------------------------------------*
*& Report ZTEST_LOOP
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_LOOP.

DATA : BEGIN OF ITAB OCCURS 0, " ocurs는 테이블

NUM1 TYPE I , "integer = 숫자 , 정수 / 초기값이 0 이다

NUM2 TYPE I ,

NUM3 TYPE I ,

END OF ITAB .

"begind of ~ end of 선언 문이 나오면 'with header' 테이블 구조로 행과 테에블이 동시에 itab 이라는 이름으로 생성

DO 10 TIMES . " do문을  10번 실행"

ITAB-NUM1 = sy-index.

"clear itab-num2.

DO 10 TIMES .

ITAB-NUM2 = sy-index .

ITAB-NUM3 = ITAB-NUM1 * ITAB-NUM2 .

append itab.

ENDDO .

ENDDO .

LOOP AT ITAB .

WRITE : / ITAB-NUM1, '*' , ITAB-NUM2 , '=' , ITAB-NUM3 .

ENDLOOP .


"반복문에서 시스템 변수가 중요
" sy-index do문을 실행할 때 몇번째 실행중인가를 보여주는것
" sy-tabix loop 문을 실행할때 append를 실행할때 등 테이블을 작업하는 구문에서 몇번째 행을 작업중인가를 보여줌(테이블을 컨트롤 하는 것)

 

 

1) internal table structure creation

types: begin of table 명~ end of table명

TYPES : BEGIN OF T_TEST,
        ID TYPE C,
        NAME TYPE C,
        PARAMETER TYPE P
        END OD T_TEST.

 

2) data & internal table declaration

work area인 행과 해당 행을 쌓을 internal table을 선언

DATA: wa TYPE t_test,
      it TYPE TABLE OF t_test.

3)internaltable에 값을 입력해(work area - 행 단위로)

wa-id = 'id01'.
wa-name ='test01'
wa-parameter = 10.

"option01.
clear wa
append wa into it

"option02.
clear wa.
collect wa into it.

wa-id = 'id02'.
wa-name = 'test02'.
wa-parameter =20.
clear wa
collect wa into it.

wa-id ='id03'.
wa-name = 'test03'.
wa-parameter = 30.
collect wa into it.

4)internaltable에 쌓은 모든 값을 읽어 ( 행단위로 읽으니까 loop구문을 사용함)

LOOP AT IT INTO WA. "IT 테이블에 쌓은 것은 WA의 행단위로 하나씩 불러와
IF SY-SUBRC = O.
  WRITE : / wa-id,wa-name,wa-parameter.
ELSE.
  WRITE : ' No Record Found'.
 END IF.
 ENDLOOP.
*&---------------------------------------------------------------------*
*& Report ZTEST_COLLECT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_COLLECT.

* internal table Structure creation
"같은 것 끼리 집계하는 것이 collect 문임

TYPES: BEGIN OF t_product,
       pid(10)     TYPE C,
       pname(40)   TYPE C,
       pamount(10) TYPE P, "pack number (실수)
       END OF t_product.

* Data & internal table declaration
DATA: wa TYPE t_product,
      it TYPE TABLE OF t_product.

* inserting data to the internal table of INDEX 1
wa-pid     = 'IFB1'.
wa-pname   = 'IFB WASHING MACHINE'.
wa-pamount = 31000.
COLLECT wa INTO it.

* inserting data to the internal table of INDEX 1
wa-pid     = 'IFB1'.
wa-pname   = 'IFB WASHING MACHINE'.
wa-pamount = 30000.
COLLECT wa INTO it.

* inserting data to the internal table of INDEX 2
wa-pid     = 'IFB2'.
wa-pname   = 'IFB SPLIT AC'.
wa-pamount = 38000.
COLLECT wa INTO it.

* inserting data to the internal table of INDEX 2
wa-pid     = 'IFB2'.
wa-pname   = 'IFB SPLIT AC'.
wa-pamount = 32000.
COLLECT wa INTO it.

* Reading internal table for all the records
LOOP AT it INTO wa.
  IF sy-subrc = 0.
    WRITE :/ wa-pid, wa-pname, wa-pamount.
  ELSE.
    WRITE 'No Record Found'.
  ENDIF.
ENDLOOP.

'SAP > ABAP' 카테고리의 다른 글

sort + collect  (0) 2024.06.03
ALV로 집계테이블 만들기 (LOOP AT, COLLECT)  (0) 2024.05.31
COLLECT 구문  (0) 2024.05.29
Loop 구문  (1) 2024.05.29
중첩 Join시 유의 사항  (0) 2024.05.29