메뉴 건너뛰기

SAP 한국 커뮤니티



ABAP [Subroutine] 명령어 정리표

문바이 2011.06.01 19:48 조회 수 : 43856 추천:5

다른 프로그램에도 있는 개념

Call by value

Call by Reference

 

그런던 ABAP에서 이를 보다 확장시킨 개념으로 사용하고 있습니다.

이 기본개념부터 차근차근 이해하고 있어야 내가 원하는 서브루틴을 만들고 남이만든것을 볼수 있습니다.

 

사견이 있어 객관적이지 못함점을 이해해 주시기 바랍니다.(죄송합니다. ㅠㅠ)

 

Sub-Routine 정리 

용어설명

Actual Parameter 

Main 프로그램 입장에서 ( 서브루티 호출시 나의 자원을 넘겨주니까/ 그건 현실적 매개변수이다) 

Formal Parameter

Main 프로그램 입장에서 ( 서브루틴에 이미 선언 명시되어있어 그렇게 사용해야만 하는 매개변수이다) 

Input Parameter

sub  프로그램 입장에서 ( Using명령에 의해 변경될필요가 없는 매개변수를 말한다.)      

Output Parameter 

sub  프로그램 입장에서 ( Changing명령에 의해 변경될필요가 있는 매개변수를 말한다.)   

그럼 이 용어를 이해 했으면 이런말을 할 수 있어야 한다.        
Subroutine구성시 Formal Parameter의 구성원들을 먼저 생각해 놓아야 한다.        
그리고 Formal Parameter구성원이 결정되었으면 sub프로그램내에서 가공을 어떻게 할지에 따라서        
Input Parameter와 Output Parameter를 구분하여야 한다.        
메인프로그램에서는 서브루틴 호출시 Formal parameter에 맞추워 Actual Parmeter를 넘겨주어야한다  

 

Parameter 구성방법 (Interface(전달방법)에 따른 구성)        

Call by Value

Actual, Formal Parameter가 각자 다른 변수영역을 사용한다.

(명령어 Value에 주목하라)      

Call by Reference

Actual Parameter의 메모리번지를 공유하여 같은곳을 바라본다.

(생략시 Default로 사용됨)      

Call by Value and Result

Actual, Formal Parameter가 각자 다른 변수영역을 사용한다

( 서브루틴 정상종료후 Actual을 변경한다)      

FORM sub1 USING p1 TYPE c  
                VALUE(p2) TYPE c  
                VALUE(p3) TYPE p  


          CHANGING p4 TYPE c  
                VALUE(p5) TYPE c.  


   CHECK sy-subrc = 0.  
   EXIT.  
ENDFORM.  

Call by Reference ReadOnly( Actual의 메모리주소를 공유해서 사용한다 )     
Call by value ( Actual, formal 각자 변수메모리 영역을 따로 관리한다)     
Call by value ( Actual, formal 각자 변수메모리 영역을 따로 관리한다)

                        p의 decimal 은 actual에서 상속받는다     
Call by Reference ( Actual의 메모리주소를 공유해서 사용한다)     
Call by Value and Result( Actual, formal 각자 변수메모리 영역을 따로 관리한후

                                        성공유무에 따라 호출자변경)     
  참이면 서브루틴을 계속진행하다     
  서브루틴을 탈출한다     

 

 

Parameter 구성방법 (매개변수의 유형에 따른 구성)/ 사용방법은 아래의 샘플코드를 참조하도록 한다        

FORM sub1        
          TABLES   p5_itab LIKE      a3_itab[] "[itab(header line)] / 구조를 알고있음        
          CHANGING p1_stru TYPE      any       "[structure]         / 구조를 모름(Field Symbol사용)        
                   p2_stru STRUCTURE a1_stru   "[structure]            / 구조를 알고있음        
                   p3_itab TYPE ANY TABLE      "[itab]                    / 구조를 모름(Field Symbol사용)        
                   p4_itab LIKE      a3_itab.  "[itab]                              / 구조를 알고있음        
ENDFORM.        

 

 

SubRoutine Call(호출) 방법

Internal

PERFORM sub1 TABLES itab[]  CHANGING wa1 wa1 itab itab.

PERFORM sub1 TABLES itab[]  CHANGING wa1 wa1 itab itab ON COMMIT.
PERFORM sub1 TABLES itab[]  CHANGING wa1 wa1 itab itab ON ROLLBACK.

같은프로그램에서 call할때

COMMIT를 만나 COMMIT되기호출  
ROLLBACK을만나ROLLBACK되기호출  

External

PERFORM sub1(pg1) TABLES itab[]  CHANGING wa1 wa1 itab itab

   IF FOUND

다른프로그램에서 call할때.
subroutine은  public속성을 가지고있음

Dynamic

Data:progname(8) TYPE c VALUE 'Z05_001',subrname(8) TYPE C.
subrname = 'concate'.
TRANSLATE subrname TO UPPER CASE.
PERFORM (subrname) IN PROGRAM (progname) IF FOUND.

Runtime에 서브루틴을 바꾸어 call할때

List

DO 3 TIMES.
   PERFORM SY-INDEX OF subr1 subr2 subr3.
ENDDO.

List를 이용한 Call

파라미터를 전달할 수 없다.

 

Sample Code( 서브루틴에서/ 지정되지 않은 구조체와 itab을 <FS>를 통해 어떻게 가공하는지 보시기 바랍니다)

DATA : a1_stru LIKE sflight,        
       a2_stru LIKE sflight,        
       a3_itab LIKE sflight OCCURS 0,        
       a4_itab LIKE sflight OCCURS 0,        
       a5_itab LIKE sflight OCCURS 0 WITH HEADER LINE.        
        
        
SELECT SINGLE *        
  INTO CORRESPONDING FIELDS OF a1_stru        
  FROM SFLIGHT.        
        
SELECT  *        
  INTO CORRESPONDING FIELDS OF TABLE a3_itab        
  FROM SFLIGHT.        
        
a2_stru   = a1_stru.        
a4_itab[] = a3_itab[].        
a5_itab[] = a3_itab[].        
        
    PERFORM demo        
     TABLES a5_itab        
   CHANGING a1_stru a2_stru a3_itab a4_itab.        
        
        
FORM DEMO        
          TABLES   p5_itab LIKE      a3_itab[]    "[itab(header line)]       /  구조를 알고있음        
          CHANGING p1_stru TYPE      any       "[structure]                 / 구조를 모름(Field Symbol사용)        
                   p2_stru STRUCTURE a1_stru     "[structure]                  / 구조를 알고있음        
                   p3_itab TYPE ANY TABLE         "[itab]                          / 구조를 모름(Field Symbol사용)        
                   p4_itab LIKE      a3_itab.               "[itab]                            / 구조를 알고있음        
        
     "명시적으로 선언된 항목은 기존에 하던 방법대로 가공하면 된다.        
     "p5_itab, p2_stru, p4_itab        
     DATA : ls_itab LIKE LINE OF a3_itab.        
        
        p5_itab-connid = '33'.        
        p2_stru-connid = '33'.        
        READ TABLE p4_itab INTO ls_itab INDEX 2.        
        
     "구조를 알지못하는 항목에 대해서 가공해보자.        
     "p1_stru, p3_itab        
     DATA : lv_key TYPE string.        
     FIELD-SYMBOLS : <fs_field> TYPE ANY,        
                                       <fs_stru> TYPE ANY.        
        
     ASSIGN COMPONENT 'CONNID' OF STRUCTURE p1_stru TO <fs_field>.        
     <fs_field> = '33'.        
        
     lv_key = 'CONNID'.        
     READ TABLE p3_itab WITH KEY (lv_key) = '0400' ASSIGNING <fs_stru>.        
     ASSIGN COMPONENT 'CONNID' OF STRUCTURE <fs_stru> TO <fs_field>.        
     <fs_field> = '33'.        
     MODIFY TABLE p3_itab FROM <fs_stru>.        
        
     LOOP at p3_itab ASSIGNING <fs_stru>.        
       ASSIGN COMPONENT 'CONNID' OF STRUCTURE <fs_stru> TO <fs_field>.        
        <fs_field> = '33'.        
       MODIFY TABLE p3_itab FROM <fs_stru>.        
     ENDLOOP.        
        
ENDFORM.