[ABAP] USING, CHANGING, TABLES

SAPCO·2024년 6월 21일
0

- [ABAP]

목록 보기
17/18

0. Intro

USING, CHANGING, TABLES는 Subroutine에서 Parameter를 전달하기 위해 사용된다.

1. Parameter

1-1. Actual parameter

  • PERFORM문 단계의 Parameter
PERFORM fanme USING p1 p2 p3.

1-2.Formal Parameter

  • FORM문 단계의 Parameter
FORM fname USING p1 p2 p3.
~
ENDFORM.

1-3. Parameter type

  • untyped formal parameter
    • Actual Parameter를 통해 정해지지 않은 유형의 Parameter를 Formal Parameter에게 전달할 수 있다.
    • 이 경우 Formal parameter은 Actual Parameter의 속성을 사용한다.
* Actual  Parameter
PERFORM fanme USING p1 p2 p3.

* Formal Parameter
FORM fname USING p1 p2 p3.
~
ENDFORM.
  • typed formal parameter
    • Structure를 전달할 때는 항상 Typed Parameter를 사용해야한다.
      프로그램 실행 시에만 Structure로 넘어온 Formal Parameter를 인지하기 때문에 Structure 필드에 접근하지 못한다.
* Formal Parameter
FORM fname USING p1 TYPE t.
~
ENDFORM.

1-4. rule

  • Actual, Formal 파라미터의 개수는 같아야한다.
PERFORM fanme USING p1 p2 p3.

FORM fname USING p1 p2 p3.
~
ENDFORM.
  • USING 다음 CHANGING이 와야한다.
PERFORM fanme USING p1 CHANGING p2.
  • Actual Parameter가 Subroutine 호출 이후 변한다면 CHANGING, 변하지 않는다면 USING 사용.
    • 개발자들이 코드를 식별하는데 도움을 주기위해 사용.
    • 실제로는 USING, CHANGING 혼합해서 사용해도 결과는 바뀌지 않는다(문서화적 관점).
    • USING은 Input관점. CHANGING은 Output 관점에서 사용.

2. Passing Parameters to Subroutine

2-1. 전달 방법

- Pass By Reference

  • 참조에(메모리 주소값) 의해 전달.
  • Internal Table을 전달할 때 데이터의 복사가 이루어지지 않고 추가 메모리를 사용하고 싶지 않을 때 사용.
FORM fname USING p1.
ENDFORM.

FORM fname CHANGING p1.
ENDFORM.

FORM fname USING p1 CHANGING p2.
ENDFORM.

- Pass By Value

  • 값(직접) 전달
FORM fname USING VALUE (p1) VALUE (p2).
ENDFORM.

FORM fname USING VALUE (p1) CHANGING p2.
ENDFORM.

- Pass by Value and Result

  • 값 전달하는 Output parameter
  • pass by value와 pass by reference와는 다르다.
    pass by value는 직접적인 값 복사가 이루어지는것으로 Formal Parameter의 값이 Actual Parameter로 복사가 되고, 이후 Actual Parameter의 값이 변경되어도 Formal Parameter의 값이 변경되지 않는다.
    pass by reference는 Formal Parameter의 메모리 주소값을 Actual Parameter에 전달하므로, 이후 Actual Parameter의 값을 변경하면 Formal Parameter의 값도 변경된다.
  • Pass by value and result는 Formal Parameter의 값을 Actual Parameter의 값으로 복사하여 전달하는 것은 pass by value와 동일 하지만, ENDFORM, CHECK, EXIT와 같이 Subroutine이 종료될 때 Formal Parameter의 값이 Actual Parameter의 값으로 복사되어 최종적으로는 Actual Parameter의 값이 변경된다는 것이다.
    만약 Subroutine에서 오류발생으로 종료된다면 Actual Parameter은 그대로 유지된다. 모든 조건이 충족될 때만 Actual Parameter을 변경한다.

2-2. USING

  • using : pass by reference
  • using value : pass by value
  • ex)
DATA : l_v1 TYPE c VALUE 'O',
       l_v2 TYPE c VALUE 'O'.

PERFORM using USING l_v1.
WRITE : / '4. USING : ', l_v1,/.

PERFORM using_value USING l_v2.
WRITE : / '4. USING VALUE : ', l_v2,/.

FORM using USING pl_v1.
  WRITE : / '1. USING : ', l_v1.
  pl_v1 = '-'.
  WRITE : / '2. USING : ', pl_v1.
  WRITE : / '3. USING : ', l_v1.
ENDFORM.

FORM using_value USING VALUE(pl_v2).
  WRITE : / '1. USING VALUE : ', l_v2.
  pl_v2 = '-'.
  WRITE : / '2. USING VALUE : ', pl_v2.
  WRITE : / '3. USING VALUE : ', l_v2.
ENDFORM.

2-3. CHANGING

  • changing : pass by reference
  • changing value : pass by value and result
DATA : l_v1 TYPE c VALUE 'O',
       l_v2 TYPE c VALUE 'O'.

PERFORM changing CHANGING l_v1.
WRITE : / '4. USING : ', l_v1,/.

PERFORM changing_value CHANGING l_v2.
WRITE : / '4. USING VALUE : ', l_v2,/.

FORM changing CHANGING pl_v1.
  WRITE : / '1. USING : ', l_v1.
  pl_v1 = '-'.
  WRITE : / '2. USING : ', pl_v1.
  WRITE : / '3. USING : ', l_v1.
ENDFORM.

FORM changing_value CHANGING VALUE(pl_v2).
  WRITE : / '1. USING VALUE : ', l_v2.
  pl_v2 = '-'.
  WRITE : / '2. USING VALUE : ', pl_v2.
  WRITE : / '3. USING VALUE : ', l_v2.
ENDFORM.

3. Passing TABLE Parameters to Subroutine

3-1. TABLES

  • Internal Table과 Header Line을 전달 가능하다.
  • TABLES 구문은 구식이므로 USING과 CHANGING으로 대체 사용 가능하다.
  • Internal Table을 전달할 때는 Typed Parameter를 사용해야한다.
    Formal Parameter에 LOOP, READ 같은 구문을 사용한다면
    Syntext Check시 오류가 발생한다. Untyped Formal Parameter를 사용할 때 Internal Table로 인식할 수 있는 방법이 없어서 Formal Parameter에 Table Type을 명시해주어야 한다.
TYPES : BEGIN OF tyname,
		 field1 type ftype,
        END OF  tyname.
FORM fname USING ptname TYPE STANDARD TABLE OF tyname.

ENDFORM.

* 지역 Table Type 선언
TYPES : BEGIN OF tyname,
		 field1 type ftype,
        END OF  tyname.
TYPES : tbname TYPE tyname OCCURS 0.

FORM fname USING ptname TYPE tbname.

ENDFORM.

* 글로벌 Table Type 선언

3-2. USING, CHANGING

  • TABLES 대신 USING고 CHANGING 대체로 사용 가능하고, 권장.
profile
SAP CO

0개의 댓글