본문 바로가기

Easy Abap 2.0

[4주차] Chapter 4 Modularization[Subroutine & Function]

1. OVERVIEW- FUNCTION(함수)

 

Function은 Subroutine과 유사하게 기능별로 모듈화하고 재사용이 가능하도록 지원한다.

Subroutine이 Local Modularization이라고 하면, 
Function Module은 Global Modularization이라고 한다.

 

Subroutine과 Function은 다음과 같은 차이점이 있다.

 

  • Function Module은 Function Group이라고 불리는 POOL에 소속되어야 한다.
  • Function Module은 예외 처리 기능을 제공하여 에러가 발생하면 예외 사항을 호출한 프로그램에 전달할 수 있다.
  • Function Module은 호출 프로그램에 상관없이 Stand-alone모드에서 테스트 가능하다.

Function을 호출할 때 Input 파라미터를 입력하고, Function 수행 결과를 Output 파라미터로 받게 된다.

Function은 Function Group(Type F 프로그램)에 소속되어 동작한다.
Function Group개발 패키지처럼 유사한 기능의  Function 등을 모아놓은 Container을 의미한다.

 

[1] Function Module

 

Function Module은 중앙 라이브러리(R/3 Repository)에 저장되는 특별한 Global 서브루틴이다.

하나의 프로그램에서 같은 기능의 구문을 여러 번 사용하면 스크립트가 길어지고, 변경 사항이 발생할 경우

구문마다 수정해야 하는 비효율적인 문제가 발생하게 된다.
이 때 Function을 이용한 모듈화를 구현하여 재사용을 제공하고 스크립트 수를 줄일 수 있다.

 

<Function 모듈의 인터페이스>

 

Function 모듈의 인터페이스 설명
Import Parameters Function Module에 전달하는 값이며, 선택 사항
Export Parameters Function Module로부터 ABAP 프로그램에 전달받는 값이며,
선택사항
Changing Parameters Function Module에 값을 넘기고, 그 값을 바꿀 수 있다.
Tables 인터널 테이블을 Function Module에 전달하고 받을 수 있다.
Exceptions 에러에 대한 정보를 제공한다.

 

[2] Function Group

 

Function Group은 여러 Function Module을 모아 놓은 컨테이너이지만 직접 실행할 수는 없다.

Function을 호출하였을 때, 시스템은 호출한 프로그램의 인터널 세션 안으로 Function Group 전체를 Load한다.

이것은 Function Group 내에서 데이터를 공유하고,

스크린을 생성해서 호출하고, PERFORM subroutine 등을 공유할 수 있도록 한다.

 

그러나 주의해야 할 점은 Function이 실행될 때 이 Function이 소속된
Group 내의 모든 Function이 영향을 받는다는 것이다.

이것은 Function 하나의 에러가 발생하면, 동일 Group 내의 모든 Function이 실행되지 않는다.

그래서 Group 내에 중요한 Function을 많이 생성하는 것은 검토가 필요하다.

특히 인터페이스에 사용되는 RFC [ SAP 인터페이스 프로토콜(규칙, 규약) ]인 경우는 더욱 신중을 요구한다.

 

Function Group의 이름은 26자까지 가능하다.

Function Builder 또는 T-CODE: SE80을 통해 Function Group을 생성하게 되면 시스템은
자동으로 Main Program과 Include Program을 생성한다.

이 때 Main Program의 이름은 'SAPL'이 Function Group 앞에 붙어 구성된다.

Program SAPL<fgrp>는 다음의 INCLUDE 프로그램을 포함하게 된다.

 

Include를 포함하는 Main 프로그램 설명
L <fgrp> TOP. Functon-Pool 구문을 포함하고 있다.
Function Group 전체에 사용할 수 있는 전역 변수를 선언한다.
L <fgrp> UXX. Include 프로그램 L <fgrp>U01 같이 기술한다.
이것은 실제 Function Module을 포함하고 있다.

 

2. FUNCTION GROUP 생성

 

<Function Group 생성 순서>

 

  1. T-CODE: SE80에서 마우스 오른쪽 버틍을 이용하여 생성 가능하다.

 

2. 'Z'로 시작하는 Function Group 명을 입력한다.
    영문과 숫자를 포함하여 26자까지 가능하다.

    일반적으로 Function Group명은 모듈명을 사용하며 뒤에 01과 같이 차례대로 번호를 붙인다.

 

 

 

3. T-CODE: SE80에서 패키지 조회하면 Naming한 Function Group이 조회된다.

여기서 주목할 점은 Function Group을 생성하면 L < >TOP, L < > UXX 2개의 Include를
포함하는 Main 프로그램이 자동으로 생성된다는 것이다.

 

 

LZFG05001TOP  Include는 ZFG05001 Group 내의 모든 Function Module이
사용할 수 있는 전역 변수를 선언하게 된다는 것이고,

LZFG05001UXX Include는 Function Group에 Function Module을 생성하게 되면

스크립트가 자동으로 추가된다는 점이다.

 

 

3. FUNCTION MODULE

 

[1] Function Module 리스트 검색

 

Function Module을 생성하기 이전에 구현하고자 하는 Function이 존재하는 지 확인해야한다.

T-CODE:SE37(Function Builder)에서 문자열을 두 개로 나누는 Function Module을 검색해본다.

 

 

1) STRING_SP로 시작하는 Function Module을 검색하려면,
    'STRING_SP*'를 입력하고 F4 키를 눌러본다.

 

  ※참고사항 
    Wild Card에는 다음의 두 가지가 있다.
    *  : 임의의 문자열
    + : 임의의 한 문자

 

2) 아래 그림과 같이 'STRING_SP'로 시작하는 Function Module 리스트를 검색할 수 있다.

리스트에서 STRING_SPLIT 함수의 내역을 보면 아래 그림에는 나와있지 않지만
원래는 (Obsolete)라는 내용이 포함되어 있다.

이것은 폐기된 함수이며, SAP사에서 해당 Function을 더는 유지보수하지 않는다는 것이다.

이러한 함수는 가급적 사용하지 않는 것이 바람직하다.

 

 

3) 1)에서 입력 필드에 값을 입력하지 않고, F4 키를 입력하면 Information System을 이용해

검색조건을 입력할 수 있다. 

 

4) 패키지와 같이 영역을 제한하여 Function Module을 검색할 수 있다.

 

 

[2] Function Module의 세부 내용

 

se37 화면에서 'STRING_SPLIT_AT_POSITION' Function Module을 선택하고 display 버튼을 클릭한다.

클릭하면 아래 화면처럼 조회된다.

 

 

1) Attributes

 

[Attributes] 탭에는 Function Module이 소속된 Group, 생성인(작성자), 생성일, 패키지 등의 General Data와 
Processing Type 정보가 조회된다.

 

<General Data>

General Data 설명
Edit Lock Edit Lock 플래그는 다른 개발자에 의해서 변경이 일어나는 것을 막기 위함이다.

Edit Lock을 설정한 개발자만이 Function을 수정할 수 있다.
Global Global 플래그를 체크하면, Function Module 내의 변수를
Function Group의 Global 데이터로 선언하게 된다.

 

<Processing Type>

 

Processing Type 설명
Normal function module 일반적으로 사용하는 Function module 형태이다.
Remote-enabled module 동일 시스템 내에서 비동기적으로 호출되거나
다른 시스템으로부터 호출될 때 사용하며 
이 항목이 설정한 함수를 RFC라 부른다.
Update Module 일괄적으로 데이터베이스를 변경하기 위해 
추가적인 Function을 포함하는 형태이다.
SAP Bundling(묶기) 기술의 하나이다.

 

2) Import 파라미터

 

Function Module을 호출한 ABAP 프로그램에서 변수값을 전달받는 목적으로 사용된다.

 

<Import 파라미터에 사용되는 항목>

필드 설명
Type 파라미터의 타입 유형을 지정한다.
'TYPE' , 'LIKE' , 'TYPE REF TO'
Associated Type 데이터 타입이나 참조할 특정 테이블의 필드를 지정한다.
Default Value 파라미터의 초기값을 설정한다.
Optional 파라미터를 선택 사항으로 설정한다.
Passing Value 파라미터를 전달받을 때 새로운 메모리에
값을 복사하여 작업한다.

 

 

3) Export 파라미터

 

Function Module에서 ABAP 프로그램으로 값을 전달하는 목적으로 사용되는 파라미터이다.

 

 

 

4) Changing 파라미터

 

Function Module을 호출할 ABAP 프로그램과 Parameter를 동시에 주고받을 수 있다.

 

 

 

5) Tables 파라미터

 

Tables 파라미터는 하나의 값이 아닌 복수의 값, 즉 인터널 테이블의 내용을 주고 받을 수 있다.

 

 

6) Exceptions

 

Exceptions Parameter를 사용하면 Function Module이 실행되는 동안 발생하는 예외사항을 처리할 수 있다.

 

 

[3] Function Module 생성

 

이 함수는 두 개의 파라미터를 Import 받아서 나누기(Divide)를 수행하고 결과를 Export 하게 된다.


<Fucntion Module 생성 순서>

 

1)  T-CODE: SE37을 싱행하고 나서 Function Module 이름을 입력하고 create 버튼을 누른다
(※ 참고사항: T-CODE: SE80에서 Function Group 명을 입력한 다음 마우스 오른쪽 버튼을 이용하여 
Function Module을 생성할 수도 있다.



2) Function Module 명에 자신이 정한 Module 명을 적고 Function Group 명도 앞에서 생성한대로 입력한다.
 

 

 

 

3) [Attributes] 탭에서는 Default Value 그대로 사용하고, [Import] 탭에서 입력받을 2개의 파라미터를 정의한다.

 

 

 

4) [Export] 탭에서는 ABAP 프로그램에 결과값을 전달할 파라미터 E_RESULT를 정수형 타입 I로 정의한다.

 

 

 

5) [Exceptions] 탭에서는 0으로 나누는 경우 프로그램 Dump Error를 방지하기 위해 Exception DV_ZERO를 정의한다.

 

 

6) 아래 그림과 같이 스크립트를 완료한다. 점검 및 활성화 버튼을 클릭하면 Function Module 생성 작업이 완료된다.

    Function Module을 활성화하기 전에 Function Group을 먼저 활성화해야 한다.

 

 

[4] Function Module 테스트

 

1) 실행 아이콘을 클릭하거나 F8 키를 입력한다.

 

2) Import Parameter에 '10','2'를 입력하고 실행 버튼을 누른다.

    이 상태에서 상단의 저장 버튼을 클릭하면 입력한 테스트 데이터를 저장할 수 있다.
    Input 값이 많은 Function인 경우는 테스트할 때마다 데이터를 입력해야 하므로 테스트 데이터를 

    미리 저장한 다음 호출하면 시간을 절약 할 수있다.

 

테스트 데이터 디렉토리 들어가서 저장된 테스트 데이터를 불러온다.

 

 

3) 테스트 실행 버튼을 누르면, Function 실행 결과 화면이 조회되고 결과값이 출력된다.

 

 

4) 다시 2단계로 돌아와 I_NUM2 파라미터에 '0'을 입력하면 Exception이 호출된다.

나누기 값이 0일 경우 예외 처리를 하지 않으면 Dump Error가 발생한다.

 

 

 

 

 

[5] Function Module 호출

 

앞에서 만든 Function Module을 호출하는 간단한 ABAP 프로그램을 만들어본다.

 

1) 프로그램 하나 생성하고 아래 그림처럼 패턴 버튼을 클릭한다.

 

2) 아래 그림처럼 함수 'ZFM_05001'을 Call Function 필드에 입력 후 확인버튼 누른다.

    패턴 기능은 Function  이외에도 ABAP Object, SELECT 구문, Authority check 등의 
    구문을 정해진 포맷에 맞게 스크립트를 자동으로 생성해준다.

 


3) 아래 그림과 같이 해당 Function Module의 스크립트가 자동으로 생성된다.
Function을 만들 때 Import로 선언한 파라미터가 ABAP 프로그램 내에는
EXPORTING 위치에 존재하고, Export로 선언한 파라미터는 IMPORTING 위치에 존재한다.

IF SY-SUBRC = 1. 구문은 Function을 호출할 때 나누기 값을 0으로 전달하면,
Exception 처리가 되어 시스템 변수에 '1'이라는 값이 전달된다.

 

=> Function Module을 ABAP 프로그램에서 호출하면 파라미터는 Function Module에서 정의한 Type과 같은 
     Type을 정의해야 한다. 그렇지 않으면 타입 불일치 Dump Error가 발생한다.

 

4)  아래 그림과 같이 Result : 5인 결과값을 얻을 수 있다.

     만약 , 해당 리포트 프로그램에서 I_NUM2 파라미터에 '0'을 입력했을 때는 
     Function Module의 Exception이 호출되어, SY-SUBRC =1 에러가 발생한다.
     0으로 나눙 수 없다는 Error 메시지가 출력되는 것이다.

 

5) Function Module을 ABAP 프로그램에서 호출할 때의 값을 바로 Test data로 저장하는 방법에 대해서 추가로 알아본다.
    Function Module을 호출하는 라인에 디버깅(debugging)을 설정한다.
   표준 함수는 많은 파라미터를 가진 경우가 흔하다.
   이 방법을 이용하면, 함수 테스트 시 효율적으로 접근할 수 있다.

 

 

6) ABAP 프로그램에서 Function Module을 호출하는 지점에서 중단점이 활성화되면,
   다음 단계 버튼으로 함수 소스로 이동한다.

 

7) 아래 그림처럼 버튼을 클릭하면, Function Module에서 전달된 파라미터 값을
Test Data로 저장할 수 있는 팝업이 열린다.

 

8) 'Save Parameters as Test Data(SE37)' 선택해서 내용을 입력하고 저장한다.

 

 

9) T-CODE: SE37로 이동해서 Test Data Directory를 확인해보면 
    디버깅 화면에서 저장한 테스트 데이터가 저잗되어 있다.