Modularization
- Subroutine 은 FORM으로 시작하여 END FORM으로 종료되는 구문
- 스크립트의 모듈화, 재사용, 구조화를 주목적
- ABAP 프로그램에서는 PERFORM 구문을 이용한 Subroutine으로 유사한 기능 제공
- Function Module - 파라미터 값을 주고 받음
Subroutine 정의
- FORM으로 시작하여 ENDFORM 으로 종료되는 구문
- Subroutine을 FORM문과 같은 것으로 간주하면 된다.
- FORM 구문은 프로그램 내/외부에서 호출 가능
Subroutine 파라미터
- 파라미터는 Subroutine을 호출하는 구문과 호출받는 구문 사이에 주고 받는 값
- Actual Parameter = Subroutine을 호출할 때 사용되는 파라미터
- Formal Parameter = Subroutine에서 사용되는 파라미터
파라미터 전달방법
Subroutine은 Using과 Changing 구문으로 파라미터를 주고 받음
Call by Value
넘겨주는 변수(Actual Parameter)와 받는 변수(Formal Parameter)가 물리적으로 다른 메모리 영역을 가지고 있다.
FORM subr USING .. VALUE(pi) [TYPE <t>|LIKE <f>]
Subroutine을 호출할 때 Actual Parameter의 값은 Formal Parameter에 복사되지만 Formal Parameter의 값이 변하더라도 Actual Parameter에는 영향을 미치지 않는다.
Call by Reference
물리적으로 같은 메모리 영역을 공유하여 넘겨주며 값은 주소
CHANGING 키워드 다음에 파라미터를 사용하면 Subroutine에 전달된 파라미터 값이 변경된다.
FORM subr CHANGING ... pi [TYPE <t>|LIKE <f>] ...
Subroutine의 Formal Parameter는 자신의 메모리를 가지지 않는다. Subroutine이 호출되는 동안 Actual parameter의 주솟값을 가지고 있을 뿐
Subroutine을 호출 한 프로그램의 메모리에서 작업하게 된다.
CHANGING 대신 USING 사용해도 에러 발생 안함
단지 가독성 차원에서 사용, 병경한다는 걸 명시적으로 구분하기 위해 사용
Actual Parameter의 값이 Subroutine내에서 자동으로 변경되는 것을 피하려면 USING과 VALUE 구문을 함께 사용해야 한다.
Call by Value and Result
변수의 값을 넘겨주고 받는 구문에서 작업을 성공적으로 수행하였을 경우 변경된 값을 되돌려 준다. 물리적으로는 다른 영역
CHANGING 키워드 다음에 파라미터를 사용하고 VALUE 구문으로 완성
FORM subr CHANGING..VALUE(pi) [TYPE <t>|LIKE <f>].
USING구문과 VALUE구문이 함께 사용되면 Subroutine이 정상적으로 종료될 경우 Actual Parameter 값이 변경된다.
파라미터 타입 정의
- FORM 구문 내의 Formal Parameter는 TYPE과 LIKE 구문을 이용해 모든 ABAP 데이터 타입을 사용할 수 있다.
- 타입을 명시적으로 지정하지 않으면 Generic Type으로 정의되고 Actual Parameter의 기술적 속성을 상속받게 된다.
- Formal Parameter는 모든 ABAP Data Type이 허용되기에 구조체도 당연히 사용
- 단 구조체를 전달할때 타입을 지정하지 않았으면 구조체 칼럼을 write하거나 인식하려 할 때 필드 심볼을 이용해야 함
파라미터와 인터널 테이블
- USING CHANGING 구문
- 인터널 테이블을 Subroutine의 파라미터로 사용할 때도 USING, CHANGING 키워드를 사용할 수 있다.
- FORM문에 테이블 타입을 TYPE ANY TABLE을 주었다면 READ 구문을 동적으로 변경해야 한다. ( 이 부분 이해 안감, 2회독때 다시 보자)
TABLES 구문
- USING과 CHANGING 구문 대신 사용 가능
Subroutine 호출
- 호출하는 방법은 Internal, External 두가지 방법
* INTERNAL
PERFORM subr.
* EXTERNAL
PERFORM subr (prog) [IF FOUND].
- 외부 External Subroutine 호출시에는 [IF FOUND] 구문을 사용하여 해당 Subroutine이 존재하는지 체크하는 것이 바람직, 체크하지 않았을 때 Subroutine이 존재하지 않으면 덤프에러 발생
- 동적 호출 가능
- LIST를 이용한 호출 가능
DO 2 TIMES.
PERFORM SY-INDEX OF subr1 subr2.
ENDDO.
FORM subr1.
WRITE / 'subr1 is called'.
ENDFORM
FORM subr2.
WRITE / 'subr2 is called'.
ENDFORM
* 결과
*subr1 is called
*subr2 is called
'SAP > Easy ABAP' 카테고리의 다른 글
Ch 04 FUNCTION (0) | 2021.02.02 |
---|---|
Ch 03 OPEN SQL & NATIVE SQL - 3 (0) | 2021.01.18 |
Ch 03 OPEN SQL & NATIVE SQL - 2 (0) | 2021.01.14 |
Ch 03 OPEN SQL & NATIVE SQL - 1 (0) | 2021.01.12 |
Ch 02 Data Type - 2 (0) | 2021.01.08 |