본문 바로가기

SAP셀프스터디/22일만에 이지아밥 1회독 하기

[chapter04] Modularization (subroutine & function)

최초 작성일: 23년 2월 23일

최종 작성일:

 

01.Overview: Subroutine

Subroutine은 form으로 시작하여 end form으로 종료되는 구문을 의미하며,

스크립트의 모듈화, 재사용, 구조화를 주목적으로 한다.

모듈화는 의미있는 기능들을 모아놓은 프로그램 블록을 의미하며 재사용이 가능한 특성이 있어야 한다.

스크립트가 너무길어지면 유지보수 하기가 어려우므로 기능별로 블록화하여 프로그램을 구조화하는 것이 바람직하다. 

기능별 또는 의미 있는 구문들이 모듈화되어 전체적인 흐름을 쉽게 파악하여 수정할 수 있도록 하는 것은 아주 중요한 기술 중의 하나이다.

02.Subroutine의 정의

 subroutine은 form으로 시작하여 end form으로 종료되는 구문을 의미한다.

PERFORM. * PERFORM구문으로 SUBROUTINE을 호출하게 되면

FORM. * FORM 구문으로 수행하게 된다. SUBROUTINE을 FORM구문과 같은 것으로 간주하면 된다.

ENDFORM. * FORM 구문은 프로그램 내부/외부에서 호출할 수있다.

subroutine 생성 방법

REPORT  ZSUBROUTIN_EDU17.

PERFORM WRITE_DATA.

FORM write_data.
  WRITE 'Subroutine Test'.
ENDFORM.

03. Subroutine 파라미터

파라미터는 Subroutine을 호출하는 구문과 호출받는 구문 사이에 주고받는 값을 의미한다.

subroutine내에서는 파라미터는 data구문으로 정의하는 일반적인 local 변수와 같다.

subroutine을 호출할 때 사용되는 파라미터를 actual parameter라 하고

subroutine에서 사용되는 파라미터를 formal parameter라 정의한다.

PERFORM의 USING, CHANGING구문을 사용하여 파라미터를 선언하며

subroutine과 그 순서를 같게 지정해야한다.

파라미터는 abap의 모든 기본 data type, field symbol, internal table 등을 사용할 수 있다

03-01. 파라미터 전달방법

subroutine은 using 과 changing 구문으로 파라미터를 주고받게 되는 데 3가지 유형으로 분류된다.

  • call by value : 넘겨주는 변수(actual parameter)와 받는 변수(formal parameter)가 물리적으로 다른 메모리 영역을 가지고 있다.
  • call by reference : 물리적으로 같은 메모리 영역을 공유하여 넘겨주며 값은 주소이다.
  • call by value and result : 변수의 값을 넘겨주고 받는 구문에서 작업을 성공적으로 수행하였을 경우 변경된 값을 돌려준다.물리적으로 다른 영역을 사용한다.

03-01-01. call by value

call by value는 using 키워드 다음에 파라미터를 사용하고 value구문으로 완성한다.

value 구문에서 formal parametersms는 자신의 메모리를 가진다.

subroutine을 호출할때, actual parameter의 값은 formal parameter에 복사된다.

하지만, formal parameter의 값이 변경되더라도 actual parameter에는 영향을 미치지 않는다.

FORM subr USING ... VALUE (pi) [TYPE <t> | LIKE <f>].
DATA: gv_val TYPE C LENGTH 20 VALUE 'Call by value'. * gv_val 이 actual parameter
PERFORM call_byvalue USING gv_val.
FORM call_byvalue USING VALUE p_val.  *p_val이 formal parameter
  WRITE: p_val.
ENDFORM.

FORM구문에서 USING과 VALUE 키워드를 같이 사용하면 새로운 메모리에 값을 복사하여 값을 전달 받는다.

03-01-02. call by reference

changing 키워드 다음에 파라미터를 사용하면, subroutine에 전달된 파라미터 값이 변경된다.

DATA: gv_val TYPE C LENGTH 20 VALUE 'call by reference.'.
WRITE: / gv_val.

PERFORM call_byref CHANGING gv_val.
WRITE: / gv_val.

FORM call_byref CHANGING p_val.
p_val = ' value has been changed.'.
WRITE:/ p_val.
ENDFORM.

WRITE구문은 gv_val 변수를 선언할 떄 지정한 value 값이 출력되고 두번쨰 WRITE구문은 FORM구문에서 변경한 문자열이 출력된다.

VALUE구문을 사용하지 않으면, USING구문과 CHANGING구문은 모두 Call by refernce를 이용하게 된다.

FORM구문 내에서 VALUE구문을 사용하지 않으면 USING과 CHANGING구문의 기능은 같다.

단지, 가독성 차원에서 '사용','변경'한다는 것을 명시적으로 표현하기 위해 구분하는 것이다.

USING은 데이터를 전달하고, CHANGING은 데이터를 전달하고 변경한다는 의미를 가진다.

Actual parameter의 값이 subroutine내에서 자동으로 변경되는 것을 피하려면 using과 value 구문을 함께 사용해야한다.

03-01-03. call by value and result.

changing 키워드 다음에 파라미터를 사용하고, value구문으로 완성한다.

using 구문과 value구문이 함께 사용되면 subroutine 내에서 actual parameter 값을 변경할 수 없으나 (call by value),chaning 구문과 value 구문이 함께 사용되면 subroutine이 정상적으로 종료될 경우 actual parameter 값이 변경된다. 즉, chaing구문은 항상 value 구문과 함께 사용하는 것이 바람직하다.

DATA: gv_val1 TYPE I VALUE 2.
DATA: gv_val2 TYPE I VALUE 3.
DATA: gv_sum TYPE I.

PERFORM sum_data USING gv_val1 gv_val2
                 CHANGING gv_sum.
WRITE: / 'gv_sum is' , gv_sum.

FORM sum_data USING value(p_val1)
                    value(p_val2)
              CHANGING value(p_sum).
p_sum = p_val1 + p_val2.

ENDFORM.

03-02. 파라미터 타입 정의

FORM구문 내의 Formal parameter는 type과 like 구문을 이용해 모든 abap 데이터 타입을 사용할 수 있다.

타입을 명시적으로 지정하지 않으면 generic type으로 정의되고 actual parameter의 기술적 속성을 상속받게 된다. 이때 type conversion이 가능한 타입을 사용해야한다.

PERFORM구문에서는 TYPE C의 변수 gv_val을 넘겨주고 FORM구문 내의 파라미터는 TYPE I를 선언하게 되므로 구문 에러가 발생하게 된다.

기본 타입 d,f,i,t를 perform구문에서 사용했다면 form구문의 파라미터도 같은 타입을 사용해야한다.

DATA gv_val TYPE d.
PERFORM call_byref USING gv_val.

위 구문과 같이 type d를 파라미터로 form구문에 전달했다면, formal parameter는 다음 3가지 방법을 사용해서 타입을 정의할 수 있다.

  • generic type 사용 : FORM call_byref USING p_val.
  • actual parameter와 같은 타입 사용 :FORM call_byref USING p_val TYPE d.
  • actual parameter와 같은 타입의 변수 사용 : FORM call_byref USING p_val LIKE gv_val.

03-03.파라미터와 구조체

formal parameter는 모든 abap data type이 허용되기 때문에 구조체도 당연히 사용할 수 있다.

구조체를 파라미터로 사용할 때는 TYPE, LIKE 뿐만 아니라 STRUCTURE 구문을 이용해 구조체 타입을 정의할 수 있다.

DATA: BEGIN OF gs_str,
col1 TYPE i VALUE 1,
col2 TYPE i VALUE 2,
END OF gs_str.

PERFORM write_data USING gs_str.
FORM write_data USING p_str STRUCTURE gs_str.
WRITE: p_str-col1, p_str-col2.
ENDFORM.

구조체를 파라미터로 전달 할때 타입을 명시적으로 지정하지 않으면 어떻게 될까? -> 구조체에 col1이 없다는 에러가 발생한다.

이처럼 구조체를 전달 할 때 타입을 지정하지 않았으면 구조체 칼럼을 write하거나 인식하려할떄 필드 심볼을 이용해야한다.

FIELD-SYMBOLS <fs>.
FORM write_data USING ps_str.
	ASSIGN COMPONENT 1 OF STRUCTURE ps_str TO <fs>.
    WRITE <fs>.
    ASSIGN COMPONENT 2 OF STRUCTURE ps_str TO <fs>.
    WRITE <fs>.
 ENDFORM.

03-04.파라미터와 인터널 테이블

 

03-04-01. USING, CHANGING 구문

인터널 테이블을 Subroutine의 파라미터로 사용할 때도 using, changing 키워드를 사용할 수 있다.

TYPES : BEGIN OF t_str,
col1 TYPE C,
col2 TYPE I,
END OF t_str.

TYPES: t_itab TYPE TABLE OF t_str.
DATA: gs_str TYPE t_str,
      gt_itab TYPE t_itab.

gs_str-col1 = 'A'.
gs_str-col2 = 1.

append gs_str to gt_itab.

gs_str-col1 = 'B'.
gs_str-col2 = 2.

APPEND gs_str TO gt_itab.

PERFORM test_itab USING gt_itab.

FORM test_itab USING p_itab TYPE t_itab.
READ TABLE p_itab WITH KEY col1 = 'A' INTO gs_str.
IF sy-subrc EQ 0.
  WRITE: gs_str-col1, gs_str-col2.
ENDIF.
ENDFORM.

form의 파라미터가 type any table로 정의되어 pt_itab 인터널 테이블의 내부구조(칼럼)을 알수 없기 때문이다. 즉, col1이 인터널 테이블에 존재하는 지 알 수 없는 것.

form의 파라미터를 tyep any table로 정의하면 다음과 같이 read구문을 동적으로 변경해야한다.

DATA gv_name(10) TYPE C VALUE 'col1'.

PERFORM test_itab USING gt_itab.

FORM test_itab USING p_itab TYPE ANY TABLE.
READ TABLE p_itab WITH KEY (gv_name) = 'a' INTO gs_str.
IF sy-subrc EQ 0.
  WRITE: gs_str-col1, gs_str-col2.
ENDIF.
ENDFORM.

-파라미터에 사용된 인터널 테이블도 다음 3가지 방법을 사용할 수 있다.

1)generic type 사용

FORM subr CHANGING p_itab TYPE TABLE/ANY TABLE/ INDEX TABLE/STANDARD TABLE/HASHED TABLE/SORTED TABLE/.

2)actual parameter와 같은 인터널 테이블 타입 사용

FORM subr CHANGING p_itab TYPE t_itab.

3)actual parameter와 같은 타입의 인터널 테이블 사용

FORM subr CHANGING p_itab LIKT gt_itab.

03-04-02. TABLES 구문 -> r3이전 버전에 사용되는 것

04.subroutine 호출

subroutine을 호출하는 방법에는 internal, external 두 가지가 존재한다.

perform구문을 이용하여 abap 프로그램내에서 subroutine을 호출할 수 있으며, 다른 abap 프로그램 내의 subroutine도 호출하여 사용할 수 있다.

PERFORM subrc.  * internal call
PERFORM subrc (prog) [IF FOUND]. *external call

04-01. 내부 subroutine 호출

같은 abap 프로그램에서 선언한 subroutine을 호출하려면 단순히 perform 구문으로 이름만 지정하면 된다.

DATA: gv_val1(10) TYPE C VALUE 'connect',
      gv_val2(10) TYPE C VALUE 'to',
      gv_val3(10) TYPE C.

PERFORM concatenate USING gv_val1 gv_val2
                    CHANGING gv_val3.
FORM concatenate USING p_val1 p_val2
                 CHANGING p_val3.
CONCATENATE p_val1 p_val2 INTO p_val3.
WRITE: 'result is', p_val3.

ENDFORM.

04-02. 외부 subroutine 호출

ABAP 프로그램은 다른 프로그램의 Subroutine을 호출하여 사용할 수 있도록 지원한다.

외부 프로그램을 호출할때는 [IF FOUND]구문을 사용하여, 해당 subroutine이 존재하는 지 체크하는 것이 바람직하다. 체크 하지 않을때 subroutine이 존재하지 않으면 덤프 에러가 발생한다.

PERFORM concate_string(z04_09) IF FOUND
						USING gv_first gv_second
                        CHANGING gv_result.

04-03. subroutine 동적 호출

04-03-01. subroutine  name 동적 지정

DATA : gv_first(10) TYPE C VALUE 'Dynamic',
	   gv_second(10) TYPE C VALUE 'CALL',
       gv_result(20) TYPE C.
DATA: gv_pname(8) TYPE C VALUE 'Z04_09',
	  gv_subname(20) TYPE C VLAUE "CONCATE_STRING'.
     
     
 TRANSLATE GV_PNAME TO UPPER CASE.



PERFORM (gv_subname) IN PROGRAM (gs_pname) IF FOUND
	USING gv_first gv_second
    CHANGING gv_result.

Subroutine을 동적으로 호출하고 있다. 동적 구문을 사용할 때는 프로그램 이름과 서브루틴 이름을 반드시 대문자로 지정해야하며, 예제에서는 translate 명령응 사용해 대문자로 변환하였다.

04-03-02. list를 이용한 subroutine 호출

DO 2 TIMES.

PERFORM SY-INDEX OF subr1 subr2.

ENDDO.

FORM subr1.
  write / ' 1 subrc line has been called'.
ENDFORM.

FORM subr2.
  write / '2 subrc line has been called'.
ENDFORM.

05.subroutine 종료

subroutine은 end form 구문을 만나게 되면 정상적으로 종료된다.

그러나 EXIT, CHECK 구문을 활용하여 Subroutine 수행 중에 종료할 수 있다.

exit구문을 만나게 되면 바로 subroutine을 빠져나오고,  check구문은 값을 비요하여 참일 경우에만 이후 구문을 수행하게 된다.

PARAMETERS: P_VAL TYPE CHAR10.
PERFORM END_SUBR USING P_VAL.

FORM END_SUBR USING VALUE(P_VAL).

CASE P_VAL.
  WHEN 'EXIT'.
  	WRITE 'Subroutine EXIT'.
    EXIT.
   WHEN 'CHECK'.
   	WRITE 'Value CHECK'.
    CHECK P_VAL NE 'CHECK'.
   WEHN OTHERS.
 ENDCASE.
 
 	WRITE 'Subroutine is normally ended'.
 ENDFORM.

06.temporary subroutine -> 요건 코드를 읽어보 무슨 이야기 인지 잘 모르겠어서 좀 익숙해지면 그때 다시 공부하자

메인 메모리에서 동작하는 동적 서브루틴을 정의할 수 있다.

아래 구문은 실행 중인 프로그램의 main 메모리에 subroutine pool을  생성하게 된다.

subroutine pool의 소스코드를 <itab> 인터널 테이블에 삽입하며, 8자리 type c의 <prog> 서브루틴 프로그램을 생성하게 된다.

즉, 동적으로 서브루틴을 사용하고자 하 ㄹ경우 서브루틴 풀(프로그램)을 생성하여 사용할 수 있다.

이것은 인터널 테이블을 동적으로 선언해야하는 경우 등에 아주 유용하게 사용된다.

 

예를 들어 사용자가 매출금액을 기간으로 설정해서 조회하는 프로그램이 있다고 가정하자.

사용자는 동적으로 해당일을 선택할 수 있기 떄문에 인터널 테이블의 칼럼수르 ㄹ미리 정의하기가 곤란하다.

이럴 때는 generate 구문을 이용하면 입력된 일수 만큼 인터널 테이블을 동적으로 선언할 수 있다.

이 외에도 동적 인터널 테이블을 생성하는 방법은 여러가지가 있다.

서브 루틴 풀은 생성된 프로그램이 실행된 상태에서만 존재하게 된다. 하나의 프로그램에 36개 까지 서브루틴 풀을 생성할 수 있다.

에러가 발생하게 되면 sy-subrc = 8 이 반환된다.

GENERATE Subroutine POOL <itab> NAME <prog>.

07.PERFORM ON COMMIT( 225 페이지에 해당 내용이 있으며, 좀 익숙해지면 클래식 디버깅 통해서 다시 확인해보자)

subroutine을 호출 할 때 on commit/rollback 옵션을 사용하면, commit work 또는 roll back work 구문을 만날 떄 form이 실행된다.

  • using perform on commit : commit work를 만나면 서브루틴 구문을 호출한다.
  • using perform on rollback : rollback work를 만나면 서브 루틴 구문을 호출한다.
DATA: gs_scarr LIKE scarr,
      gv_flg TYPE C.

SELECT SINGLE * FROM scarr INTO gs_scarr
WHERE carrid = 'AA'.

PERFORM delete_data USING gs_scarr.

PERFORM insert_data ON COMMIT.

IF gv_flg = 'X'.
  COMMIT WORK.
ENDIF.

FORM delete_data USING VALUE(ps_scarr) TYPE scarr.

DELETE scarr FROM ps_scarr.
if sy-subrc  EQ 0.
gv_flg = 'X'.
ENDIF.
ENDFORM.

FORM insert_data.
  insert scarr from gs_scarr.
ENDFORM.

MACRO

1.Local MACRO

프로그램에서 같은 구문을 여러 번 사용해야한다면, MACRO에 포함하는 것이 바람직하다.

프로그램 선언부에 DEFINE ~ END-OF-DEFINITION을 선언하고 나서 MACRO이름과 파라미터로 호출하면 된다.

PERFORM 구문이 로직에 포함된 재사용 모듈이라면,MACRO는 단순히 코딩반복을 감소하려는 것이라고 볼 수 있다.

 

DATA: gv_val1 TYPE C VALUE 'a',
      gv_val2 TYPE C value 'b',
      gv_val3 type c.

DEFINE con.
  CONCATENATE &1 &2 INTO &3.
  dis &3.
END-OF-DEFINITION.

define dis.
 WRITE &1.
end-OF-DEFINITION.

con gv_val1 gv_val2 gv_val3.

2.GLOBAL MACRO

일반적으로 macro를 쓸 때 프로그램 내에서 DEFINE ~ END-OF-DEFINITION 을 사용한다.

이처럼 Local Macro를 사용하면, 다른 프로그램에서는 호출 할 수 없다는 단점이 있다.

global macro를 생성하면 모든 프로그램에서 사용할 수 있다.

global macro를 사용하려면 TRMAC 테이블을 유지보수 하면 된다.

BREAK도 GLOBAL MACRO이다

GLOBAL MACRO 생성 방법

T-CODE: SM30

DATA: gv_val1 type C value 'A',
	  gv_val2 TYPE C VALUE 'B',
      gv_val3 TYPE C.
 CONC gv_val1 gv_val2 gv_val3.

 

08.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 수행결과를 out put 파라미터로 받게 된다.

function은 function group(type F프로그램)에 소속되어 동작한다.

function group은 개발 패키지처럼 유사한 기능의 function 등을 모아놓은 container를 의미한다.

이 절의 키 포인트는 1) function group 생성 2) function module을 추가하여 3) abap 프로그램에서 function을 호출하는 것!!!!

08-01. Function module

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

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

변경 사항이 발생할 경우 구문마다 수정해야하는 비효율적인 문제가 발생하게 된다.

이때 function을 이용한 모듈화를 구현하여 재사용을 제공하고 스크립트 수를 줄일 수 있다.

functoin module의 인터페이스

  • import parameters : functin module에 전달하는 값이며 선택 사항이다
  • export paramters : function module로부터 abap 프로그램에 전달받는 값이며 선택 사항이다
  • changing parameters : function module에 값을 넘기고 그 값을 바꿀 수 있다.
  • tables: 인터널 테이블을 function module에 전달하고 받을 수 있다.
  • exceptions : 에러에 대한 정보를 제공한다.

08-02. Function group

function group은 여러 function module을 모아 놓은 container 이다.

function group은 직접 실행 할 수 없다.

function을 호출하였을때, 시스템은 호출한 프로그램의 internal 세션 안으로 function group 전체를 load 한다.

이것은 function group내에서 데이터를 공유하고 스크린을 생성해서 호출하고 perform subroutine 등을 공유 할 수 있도록 한다.

그리고 주의할 점은 function이 실행될 때 이 function이 소속된 group내의 모든 function이 영향을 받는 다는 것이다.

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

그래서 function group내에 중요한 function을 많이 생성하는 것은 검토가 필요하다. 특히, 인터페이스에 사용되는 RFC인 경우는 더욱 신중을 요구한다.

function group의 이름은 26자까지 가능하다.

function builder를 통해 function과 group을 생성하게 되면 시스템은 자동으로 main program과 include program을 생성한다.

이때 main program의 이름은 'SAPL'이 function group앞에 붙어 구성된다.

예를들어 fgrp라는 function troup의 main program 이름은 'saplfgrp'가 된다.

09. Function Group 생성

T-CODE: SE37

SE80에서도 CREATE 가능
FUNCTION GROUP을 생성하면 "L<>TOP","L<>UXX" 2개의 INCLUDE를 포함하는 MAIN 프로그램이 자동으로 생성된다는 것이다.

  •  L<>TOP :function-pool 구문을 포함하고 있다. function group 전체에 사용할 수 있는 전역변수를 선언한다.
  • L<>UXX : 실제 function module을 포함하고 있다. function group에 function module을 생성하게 되면 스크립트가 자동으로 추가된다.

10. Function Module

10-01. Function module 리스트 검색

T-CODE:SE37 에서 검색 가능

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

10-02. Function module의 세부 내용

 

10-03. function module 생성

1.CREATE FUNCTION MODULE

T-CODE: SE37, SE80

10-04. function module 테스트

T-CODE: SE80

위에 생성한 FUNCTION MODULE을 활성화해
각각 10,2를 입력해서 결과값을 확인해

10-05. function module 호출

T-CODE: SE80

<function module을 abap 프로그램에서 호출할 때의 값을 바로 test data로 저장하는 방법>

function module을 호출하는 지점에서 break point 설정하여 f8눌러서 활성화시킴
노란색 음영표시한 부분을 선택하면 소스코드로 넘어가야하는데 화면이 넘어가질 않음..

11. RFC

레거시와 r/3 시스템의 데이터를 인터페이스 하려면 r/3의 함수가 rfc함수로 정의 되어 있어야 한다.

sap erp를 도입하기 전 기업에서는 재무,인사,생산 등의 시스템이 각각 개별 언어 C, JAVA, 파워 빌더로 구축되어 있던 것이 일반적이다. 이러한 레거시 시스템들은 ERP를 도입하면서 대부분 사장되었지만, SAP와 병행하여 운영되는 시스템들도 존재하게 된다.

이경우, 레거시의 데이터를 SAP에 전달하거나, SAP 데이터를 레거시에서 조회해야하는데

SAP RFC를 통해서 이러한 작업을 수행하게 된다.

 

다양한 언어로 개발된 레거시 시스템과 SAP을 인터페이스 하려면 RFC만으로는 구현하기가 복잡하고 어려울 수 이싿. 이 문제를 해결하기 위해 WEBMETHODS를 구현하여 교환원 구실을 하도록 한다.

 

SAP 담당자는 RFC함수를 이용해 데이터를 EXPORT하고 WEBMETHODS가 데이터를 받아서 레거시에 전달해준다.

이와 마찬가지로 WEBMETHODS는 레거시에서 데이터를 받아서 SAP으로 전달하는 역할도 수행하게 된다.

 

FUNCTION 속성 중 Remote-enabled module을 선택하면, 다른 시스템 또는 다른 애플리케이션에서 sap function을 호출 할 수 있다. RFC의 정확한 의미는 cpi-c에 기초한 시스템 간의 communication 프로세스를 담당하는 sap interface protocol이다.

R/3시스템에서 CALL FUNCTION 구문은 같은 시스템 내에 있는 FUNCTION MODULE을 호출하게 된다.

REMOTE FUNCTION CALL(RFC)은 분산환경에서 다른 시스템의 FUNCTION MODULE을 실행할 수 있도록 한다.(분산 환경은 운영서버가 CO/FI/PP/HR/MM 모듈 서버, APO서버, CRM 서버 그리고 레거시 시스템 등과 같이 독립적인 서버들이 통합되어 운영되는 환경을 의미한다)

이러한 분산 환경에서 각 서버 간에 데이터를 주고 받으려면 rfc를 이용하여야 한다.

먼저 서버 간에는 RFC Destination 을 설정하여 연결하여야 하며, 다른 서버의 RFC를 호출 하려면 CALL FUNCTION 구문에 DESTINATION을 추가하여야 한다.

DESTINATION 파라미터는 T-CODE:SM59에서 이미 생성되어 RFCDES 테이블에 존재해야한다.

CALL FUNCTION 'ABC' DESTINATION 'dest'.