최종 작성일: 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번째) |
예시)
*&---------------------------------------------------------------------*
*& 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 |