파라미터 타입 정의

 

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  진짜 값 담는 통 만드는 것 (실제 메모리 공간)

 

+ Recent posts