300x250

SAP Subroutine에 대하여


기본적으로 

FORM.

..

..

ENDFORM.

으로 끝나는 구문이다. 

 

이 글의 목표는 서브루틴을 보고 뭐가 뭔지 또는 언제 VALUE문쓰고 언제는 안 쓰는지 에 대한 글이다. 

#참고 전문적인 용어보단 쉬운 단어를 사용하겠다.

 

우선 Subroutine(서브루틴)은 

쉽게 말하자면 재사용되는 로직이 여러 개 있으면 서브루틴을 사용한다고 생각하면 된다. 

 

 

바로 시작해 보자.

 

 

쉽게 생각하기


USING : 값을 던지기만 하기 

CHANGING : 값을 던져서 가져오기 

TABLES : USING + CHANGING 

# 이것에 대해서는 밑에서 설명하겠다. 

 

바로 다음으로 넘어가 보자.

 

어떠한 기준을 잡아야 하는가


PERORM문을 보면서 어떤 서브루틴은 USING 쓰고 어떤 것은 CHANGING 쓰고 어떤 것은 TABLES 쓰고.. 이해가 잘 안 가고 헷갈릴 것이다.

 

USING은 값을 던지기만 하기

CHANGING은 값을 던지고 가져오기

TABLES은 USING과 CHANGING 합친 것

 

이러한 기준을 잡을 것이다.

 

기준을 잡는 이유는 쉽게 이해하기 위해서도 있지만 서브루틴을 보고 명시적으로 표현해서 구분하기 위해서이다.

 

 

 

USING만 썼을 때 CHANGING만 썼을 때 Call by Reference )


로직

 

우리가 앞으로 중심적으로 봐야 할 것은 

- LV_VALUE1

- LV_VALUE2 

이 변수들이다.

 

변수들의 값이 바뀌는가 or 안 바뀌는가를 봐야 하기 때문이다.

 

로직을 실행을 시켜보면 

결과

다음과 같이 변경이 되어서 나오는 것이다. 

 

( Using과 Changing만 썼을 때값이 변경이 되어서 나온다. )

 

참고로

# VALUE문을 사용하지 않으면 USING과 CHANGING 하고는 똑같은 기능이라고 볼 수 있다. 

그래서 PERFORM 구문에서 CHANGING으로 변경해도 에러가 나지 않는다.

 

 

USING VALUE문을 썼을 때 ( Call by Value )


로직

 

LV_VALUE1 or LV_VALUE2 변수들을 다시 한번 봐보자.

결과

 

VALUE문을 사용을 한다면 값은 변경이 되지 않는다. 

 

( Using Value을 썼을 때값이 변경되지 않는다. )

 

CHANGING VALUE문 사용 ( Call by Value and Result )


# 이 부분은 글 설명으로 넘어가겠다.

 

그 이유는 Using과 Changing만 썼을 때( Call by Reference )와  Changing Value를 사용할 때 ( Call by Value and Result ) 똑같이 값이 변경이 되어서 나오기 때문이다.

 

공통점값이 변경이 되어서 나오는 것이 공통점

 

차이점은 

Call by Reference메모리 주소서로 공유해서변경이 되는 것이고,

Call by Value and Result각 메모리 주소다르지만? 값을 변경해서 변경된 값보내는 것이다.

# 여기서 메모리 주소넘겨주는 변수받는 변수의 메모리이다.

 

 

Value을 붙여야 하는 이유는? ( 결론 )


이러한 여러 예제를 보여준 이유가 우리의 기준을 생각해 보면 

 

USING은 값을 보내는 것

CHANGING은 값을 던지고 가져오기

였다.

 

그런데 

 

USING만 사용해서 을 보냈는데 값이 변경이 될 가능성도 있기도 하며

 

변수의 값이 변경이 되는 것을 막기 위해서는  VALUE문을 사용해야한다.

 

또한 위에서 말했듯이 명시적으로 표현을 해서 구분하기 위함 있는 것이기 때문에 Value을 사용하는 것이다. 

 

 

TABLES 구문


TABLESUSINGCHANGING 대신 사용 할 수 있다.

SAP에서는 TABLES을 사용하지 말고 USING, CHANGING을 권하기는 하지만 현재에서도 많이 쓰이는 구문이다.

 

TABLES은  말 그대로 TABLE을 넘기는 것이라고 생각하면 된다. 

 

예제를 보자. 

 

로직

 

#1 . PERFORM의 TABLES 입장

우리가 봐야 할 것은 LT_TABLE이다.

분명히 LT_TABLE SCARR TABLE 형태인 (인터널테이블)이다. 

헤더라인이 없는 인터널 테이블 형식이다. 

 

#2. FORM... ENDFORM의 TABLES 입장

여기 입장은 PT_TABLE이 헤더라인이 있는 인터널 테이블인 것이다.

말 그대로 PT_TABLE에 Workarea가 있다는 것이다.

 

디버깅을 보자면 

다음과 같이 나오는 걸 볼 수 있다. 

 

이 말은 즉 TABLE만 넘기는 게 아니라 Workarea까지 만들어준다는 것이다.

 

이것을 활용하면 

이런 식으로 인터널 테이블 넘겨줘서 서브루틴 안에서 값을 변경시킬 수도 있는 것이다.

 

 

만약 인터널테이블과 워크에리어가 헷갈린다면 밑 링크를 클릭하시면 됩니다.

2023.04.09 - [.SAP/..ABAP] - SAP Workarea or Structure or Internal Table 정리

 

SAP Workarea or Structure or Internal Table 정리

이걸... 어떻게 하면 쉽게 이해를 하고 말을 할 수 있을까 고민을 많이 해봤다... 다른 블로그에서도 많이 나오지만은... 진짜 최대한 쉽게...정리를 해보겠다.. 우선 우리가 알아가기 전에 중요한

potato98.tistory.com

 

 

끝. 


기준대로 

USING은 값을 보내주고

CHANGING은 값을 보내 주고받아오고

TABLES은 둘 다..

 

VALUE문을 되도록이면 쓰는 게 좋다고 한다.

 

 

 

도움이 되셨으면 하단에 있는 광고 한번씩 눌러주세유!!

 

 

로직( 더 보기 )

USING, CHANGING, VALUE문 로직

더보기
DATA:
  LV_VALUE1 TYPE N VALUE 5,
  LV_VALUE2 TYPE N VALUE 5.


PERFORM XXX_PF
  USING
      LV_VALUE1
      LV_VALUE2.


WRITE:/ 'LV_VALUE1 = ',LV_VALUE1,
        'LV_VALUE2 = ',LV_VALUE2.

FORM XXX_PF
  USING
    PV_VALUE1
    PV_VALUE2.

  PV_VALUE1 = '3'.
  PV_VALUE2 = '1'.

ENDFORM.


*FORM XXX_PF
*    USING
*      VALUE(PV_VALUE1)
*      VALUE(PV_VALUE2).
*
*   PV_VALUE1 = '3'.
*   PV_VALUE2 = '1'.
*
*ENDFORM.

*FORM XXX_PF
*  CHANGING
*    PV_VALUE1
*    PV_VALUE2.
*
*  PV_VALUE1 = '3'.
*  PV_VALUE2 = '1'.
*
*ENDFORM.

*FORM XXX_PF
*  CHANGING
*    VALUE(PV_VALUE1)
*    VALUE(PV_VALUE2).
*
*  PV_VALUE1 = '3'.
*  PV_VALUE2 = '1'.
*
*ENDFORM.

 

TABLES 로직 

더보기
DATA:
  LT_TABLE TYPE TABLE OF SCARR.

SELECT *
  FROM Scarr
  INTO CORRESPONDING FIELDS OF TABLE LT_TABLE.


PERFORM XXX_PF
  TABLES
    LT_TABLE.


  CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).


FORM XXX_PF
  TABLES
    PT_TABLE LIKE LT_TABLE.

  LOOP AT PT_TABLE.

    PT_TABLE-CARRNAME = 'GAMJA'.

    MODIFY PT_TABLE.
  ENDLOOP.

ENDFORM.

 

 

 

728x90