Workbench 2
Unit 10. Modularization Techniques in ABAP
Lesson 2. Defining and Calling Subroutines
Subject : Subroutine에 Parameter 사용 시, Using과 Change
결론부터 말하자면, Subroutine을 수행한 결과는 Using 이나 Change나 같다. 그렇다면, 구지 나눠 쓰는 이유가 뭘까? 현업에 계신 분께 질문 드려 보았는데, 이는 가독성 때문이라는 답변을 얻을 수 있었다. Subroutine이 시작되는 'Perform [name] Using [변수1] [변수2] ..' 구문만 봐도 Subroutine내에서 변수 값을 그냥 가져다 쓰는건지, Subroutine이 끝나고 나면 변수에 담겨 있는 값이 바뀌어 나오는지 알 수 있다는 거다. 간단한 예제로 살펴보자.
Step 1.
일단 아래와 같이 3개의 변수를 선언하고, 각각 변에 값을 '100', '200' 그리고 '두 값의 합'을 대입하자.
Data : gv_int1 TYPE i,
gv_int2 TYPE i,
gv_result TYPE i.
gv_int1 = 100.
gv_int2 = 200.
gv_int3 = gv_int1 + gv_int2.
Step 2.
3개의 Global Variables를 Subroutine 내의 Parameter로 사용한다. 이때 2개는 Using, 한개는 Change로 사용한다.
PERFORM calc_percentage1 USING gv_int1 gv_int2
CHANGING gv_result.
위에서 설명 했듯이, 이 부분만 봐도 gv_int1과 gv_int2가 사용되고, gv_result의 값이 바뀌는 Logic이 담겨 있을것으로 유추가 가능하다.
Step 3.
Subroutine의 내용은 Parameter 의 값에 '100'씩을 더하고 '더한 값의 합'을 result 변수에 담는 것이다. 여기서 중요한 점은, 할 것은 Subroutine 내에서 사용되는 변수들은 새로 선언한게 아니라 Subroutine에 들어가기전에 선언되어 있던 변수들을 활용한다는 점이다. 물론, Subroutine내에서 지역 변수를 선언해서 사용할 수 있다. 다만, Subroutine 내에서만 사용가능하고 'Endform'을 만나는 순간 메모리에서 사라진다.
FORM calc_percentage1 USING lv_int1 lv_int2
CHANGING lv_result.
lv_int1 = lv_int1 + 100
lv_int2 = lv_int2 + 100
lv_result = lv_int1 + lv_int2
ENDFORM calc_percentage1.
중요하게 다루고 싶은 부분은, Parameter로 쓰이는 변수(lv_*)들이 Subroutine내에서 값이 변하면, Main 변수(gv_*)들도 값이 변한 다는 것이다. 어찌보면 당연한 이야기지만, 'VALUE'라는 옵션을 사용하게 되면 이야기가 달라진다.
Step 4.
FORM calc_percentage1 USING VALUE(lv_int1) VALUE(lv_int2)
CHANGING VALUE(lv_result).
lv_int1 = lv_int1 + 100
lv_int2 = lv_int2 + 100
lv_result = lv_int1 + lv_int2
ENDFORM calc_percentage1.
위와 같이 같이 변경 해주면 어떤점이 차이가 있을까? Subroutine의 로직을 타더라도 Main 변수(gv_*)들의 값은 변하지 않는 다는것이다. 즉, 100을 더하는 로직을 만나도 gv_int1은 '100' 이고 Lv_int1은 '200' 된다는 것이다. 즉, 변수에 담겨 있는 'Value' 값만 Subroutine에서 사용하게 되는 것이다.
Step 5.
그냥 Using을 쓰는 경우는 '1', Using Value를 사용하는 경우를 '2'로 구분하여 로직을 구성하였다. 아래 로직을 실행 후 첫 번째, 두 번째 란에 더하고 싶은 두 값을 넣고, 3번째 란에 '1' 혹은 '2'를 입력하자. 입력한 두개의 값은 gv_* 변수들에 담길것이고, 이 값들을 Parameter로 이용해 Subroutine이 실행 되는 과정에서 lv_* 변수들이 변할때 gv_* 변수들이 어떻게 변화 하는지 확인해보자.
REPORT YWB2_10_16A.
TYPES gty_result TYPE p LENGTH 16 DECIMALS 2.
PARAMETERS: pa_int1 TYPE i,
pa_int2 TYPE i,
pa_op TYPE c LENGTH 1.
DATA gv_result TYPE gty_result.
CASE pa_op.
WHEN '1'.
PERFORM calc_percentage1 USING pa_int1 pa_int2
CHANGING gv_result.
WHEN '2'.
PERFORM calc_percentage2 USING pa_int1 pa_int2
gv_result.
ENDCASE.
WRITE:/ 'gv_int1 = ', pa_int1,
'gv_int2 = ', pa_int2,
'gv_resutl = ',gv_result.
*&---------------------------------------------------------------------*
*& Form CALC_PERCENTAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_PA_INT1 text
* -->P_PA_INT2 text
* <--P_GV_RESULT text
*----------------------------------------------------------------------*
FORM CALC_PERCENTAGE1 USING lv_int1 lv_int2
CHANGING lv_result.
lv_int1 = lv_int1 + 100.
lv_int2 = lv_int2 + 100.
lv_result = lv_int1 + lv_int2.
WRITE:/ 'lv_int1 = ', lv_int1,
'lv_int2 = ', lv_int2,
'lv_resutl = ',lv_result.
ENDFORM. " CALC_PERCENTAGE
*&---------------------------------------------------------------------*
*& Form CALC_PERCENTAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_PA_INT1 text
* -->P_PA_INT2 text
* <--P_GV_RESULT text
*----------------------------------------------------------------------*
FORM CALC_PERCENTAGE2 USING VALUE(lv_int1)
VALUE(lv_int2)
VALUE(lv_result).
lv_int1 = lv_int1 + 100.
lv_int2 = lv_int2 + 100.
lv_result = lv_int1 + lv_int2.
WRITE:/ 'lv_int1 = ', lv_int1,
'lv_int2 = ', lv_int2,
'lv_resutl = ', lv_result.
ENDFORM. " CALC_PERCENTAGE
The End