파라미터 타입 정의
PERFORM 에서는 TYPE C의 변수 gv_val을 넘기고, FORM구문 내의 파라미터는 TYPE I로 선언하게 되면 구문에러가 발생한다.
- Formal Parameter는 아래 3가지 방법으로 타입을 정의할 수 있다.
1. Generic Type사용
FORM subr CHANGING p_val.
2. Actual Parameter와 같은 타입 사용
FORM subr CHANGING p_val TYPE d.
3. Actual Parameter와 같은 타입의 변수 사용
FORM subr CHANGING p_val LIKE gv_val.
파라미터와 구조체
=> 결과: A B
- formal parameter은 모든 ABAP data type이 허용되기 때문에 구조체도 사용할 수 있다.
- 구조체를 파라미터로 사용할 때는 TYPE, LIKE뿐 아닌 STRUCTURE구문을 이용해 구조체 타입을 정의할 수 있다.
- 만약 구조체 전달 시, 타입 지정을 하지 않으면 에러가 나기 때문에 이 경우에는 필드심볼을 이용해야한다.
파라미터와 인터널 테이블
- 마찬가지로 서브루틴의 파라미터 타입을 정의하는 구문에서 인터널 테이블 타입도 사용이 가능하다.
- using, changing 키워드도 사용할 수 있다.
한번 내가 짜보고 싶어서 gpt한테 문제 내달라고했다.
TYPES : BEGIN OF t_student,
name TYPE c LENGTH 50,
time TYPE i,
END OF t_student.
TYPES : t_itabs TYPE TABLE OF t_student.
DATA : s_itabs TYPE t_itabs,
tv_str TYPE t_student.
tv_str-name = 'Minho'.
tv_str-time = 8.
APPEND tv_str TO s_itabs.
tv_str-name = 'JiSoo'.
tv_str-time = 9.
APPEND tv_str TO s_itabs.
tv_str-name = 'Hanao'.
tv_str-time = 7.
APPEND tv_str TO s_itabs.
tv_str-name = 'Hyuno'.
tv_str-time = 10.
APPEND tv_str TO s_itabs.
PERFORM tv_test USING s_itabs.
*&---------------------------------------------------------------------*
*& Form tv_test
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> S_ITABS
*&---------------------------------------------------------------------*
FORM tv_test USING p_s_itabs TYPE t_itabs.
READ TABLE p_s_itabs WITH KEY time = 9 INTO tv_str.
IF sy-subrc = 0.
WRITE : tv_str-name.
ENDIF .
ENDFORM.
READ TABLE에서 '>=9' 키워드를 쓰니 에러가 나서 일단 =9 로 출력해봄
jisoo가 나왔다.
알고보니, 정확히 read table ... with key는 정확히 일치하는 한 줄만 찾는 용도라서 조건 비교는 되지 않는다.
FORM tv_test USING p_s_itabs TYPE t_itabs.
DATA : lv_str TYPE t_student.
LOOP AT p_s_itabs INTO lv_str.
IF lv_str-time >= 9.
WRITE: / lv_str-name, 'is late!'.
ENDIF.
ENDLOOP.
ENDFORM.
이와 같이 하면 Jisoo, hyuno 가 late했다고 뜬다.
TYPE ANY TABLE 키워드
- type any table키워드가 나오면, 이렇게 에러가 뜬다.
이런식으로 동적 파라미터를 받으면 된다.
TABLES 구문
TYPES : BEGIN OF t_str,
col1 TYPE c,
col2 TYPE i,
END OF t_str.
TYPES : t_itab TYPE TABLE OF t_str.
DATA : gt_itab TYPE t_itab.
PERFORM testsitab TABLES gt_itab.
PERFORM writee_data TABLES gt_itab.
*&---------------------------------------------------------------------*
*& Form testsitab
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_ITAB
*&---------------------------------------------------------------------*
FORM testsitab TABLES p_itab TYPE t_itab.
DATA ls_str TYPE t_str.
ls_str-col1 = 'A'.
ls_str-col2 = 1.
APPEND ls_str TO p_itab.
ls_str-col1 = 'B'.
ls_str-col2 = 2.
APPEND ls_str TO p_itab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form writee_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_ITAB
*&---------------------------------------------------------------------*
FORM writee_data TABLES p_gt_itab LIKE gt_itab.
DATA ls_str TYPE t_str.
LOOP AT p_gt_itab INTO ls_str.
WRITE: / ls_str-col1, ls_str-col2.
ENDLOOP.
ENDFORM.
- 옛날 구문이기 때문에 USING, CHANGING을 요즘에는 쓰지만, 예전 개발 프로그램과의 호환성을 위해 현재도 많이 사용하고 있다.
여기서 testsitab은 t_itab을 받고,
wrtiee_data는 gt_itab을 받는 걸 알 수 있다.
이런 차이는 왜 나는 걸까?
키워드 | 의미 | 설명 |
TYPE | 타입 참조 | 정의된 타입 이름을 기반으로 변수나 파라미터를 정의할 때 사용 |
LIKE | 변수 참조 | 이미 선언된 실제 변수의 구조나 속성을 그대로 따라감 |
TYPE과 LIKE의 차이가 있기 때문이다.
t_itab은 명확하게 선언된 타입이므로 TYPE뒤에 쓰이며,
gt_itab은 이미 선언된 변수이므로 LIKE뒤에 쓰인다.
TYPES : BEGIN OF t_score,
name TYPE c LENGTH 50,
score TYPE i,
END OF t_score.
DATA : gt_score TYPE TABLE OF t_score,
gs_score TYPE t_score.
gs_score-name = 'Konie'.
gs_score-score = 96.
APPEND gs_score TO gt_score.
gs_score-name = 'monie'.
gs_score-score = 84.
APPEND gs_score TO gt_score.
gs_score-name = 'yonie'.
gs_score-score = 90.
APPEND gs_score TO gt_score.
gs_score-name = 'tonie'.
gs_score-score = 90.
APPEND gs_score TO gt_score.
PERFORM print_score TABLES gt_score.
*---------------------------------------------------------------------*
* FORM print_score
*---------------------------------------------------------------------*
FORM print_score TABLES pt_score LIKE gt_score.
DATA: ls_score TYPE t_score.
SORT pt_score BY score DESCENDING.
LOOP AT pt_score INTO ls_score.
IF ls_score-score >= 90.
WRITE: / ls_score-name, ls_score-score.
ENDIF.
ENDLOOP.
ENDFORM.
하다보니, data와 types의 차이가 궁금해졌다...!
항목 | types | data |
목적 | **자료형(타입)**을 정의함 | **실제 변수(데이터)**를 선언함 |
메모리 | ❌ 없음 (정의만 함) | ✅ 있음 (메모리 공간 생성됨) |
사용 시기 | 변수 선언 전에 타입 만들 때, 재사용할 타입 정의 | 실제 프로그램에서 값 담고 싶을 때 |
예시 | TYPES: t_num TYPE i. | DATA: gv_num TYPE i. |
TYPES: t_score TYPE i. " t_score는 '정수형 타입' 정의만 함 (메모리 없음)
DATA: gv_score TYPE t_score. " 실제 변수 gv_score를 선언하고, 타입은 t_score 사용
- TYPES → 틀 만드는 것 (형틀, 설계도)
- DATA → 진짜 값 담는 통 만드는 것 (실제 메모리 공간)
'SAP' 카테고리의 다른 글
easy abap 19. ABAP 내의 순환반복문 3가지 (0) | 2025.05.10 |
---|---|
easy abap 18. subroutine (0) | 2025.05.10 |
easy abap 16. subroutine parameter- call by value, call by reference, call by value and result (0) | 2025.05.10 |
easy abap 15. 효율적인 SQL 구문 작성 (0) | 2025.05.09 |
easy abap 14. modify (0) | 2025.05.09 |