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 구문
TABLES은 USING과 CHANGING 대신 사용 할 수 있다.
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 정리
끝.
기준대로
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.
'.SAP > ..ABAP' 카테고리의 다른 글
SAP Search Help Display 변경(설정)하기 (0) | 2023.06.02 |
---|---|
SAP 다국어 지원( 번역 ) (1) | 2023.05.09 |
SAP Internal Table 비교하는 방법( Workarea 포함 ) (3) | 2023.04.24 |
SAP Web Repository( 웹 저장소 ) 정리( 로직, 저장, 덮어쓰기 ) (0) | 2023.04.23 |
SAP GUI Status(상태) 버튼 제거, 분리하기 (2) | 2023.04.23 |