SAP ABAP Provide ~ EndProvide 구문 이해

SAP HR 스탠다드 소스코드를 보면 Provide ~ EndProvide Statement를 이용하여

소스를 구현한 프로그램이나 Enhancement를 자주 발견합니다.

SAP Help 에서는 PROVIDE Statement를 이렇게 정의를 하고 있습니다.

“간격 경계에 지정된 대로 여러 테이블(Internal Table)에 대한 테이블 반복 입니다.”

번역을 해서 그런지 이해가 안됩니다. ㅠㅠ

보통 ABAP에서는 테이블 데이터를 인터널 테이블에 담아서 데이터를 수정하거나 추가하는

작업을 많이 진행하고 관련하여 인터널 테이블 갯수도 많아지게 됩니다. 이렇게 다수

인터널 테이블내 데이터가 각각 존재하기 때문에, Loop문을 통해 데이터를 CRUD 작업을

진행하는데 이게 인터널 테이블 갯수만큼 Loop를 돌려야 하기 때문에 많이 번거롭습니다.

이런 경우 Provide ~ EndProvide를 사용하면 소스코드를 많이 줄일 수 있습니다.

Provide 구문의 장점은 다음과 같습니다.

  • 여러개의 인터널 테이블을 하나의 반복문을 통해 원하는 필드 데이터만 취할 수 있습니다.
  • 반복 횟수를 인터널 테이블 데이터간 경계구간 갯수로 조정할 수 있습니다.

물론 Provide 구문을 이용하려면 인터널 테이블 컬럼이 아래 전제조건을 충족해야 합니다.

  • 인터널 테이블은 fully typed index tables
  • 모든 테이블이 D/I/N/T 데이터 타입을 갖는 두 개의 특별한 컬럼을 포함해야 한다.
    (예, 사번/시작일/종료일 을 모든 테이블이 컬럼으로 선언해야 한다.)

기본적인 Syntax는 아래와 같습니다.

PROVIDE f1 f2 … FROM itab1 ” 테이블 itab1에서 필드 fi, f2 등을 이용
g1 g2 … FROM itab2 ” 테이블 ita2에서 필드 gi, g2 등을 이용

FROM itabi

BETWEEN f AND g. ” 범위는 f와 g 사이에 해당하는 구간에서 반복
ENDPROVIDE. ” f와 g 구간과 테이블내 값들을 나누어 반복 횟수 결정

간단히 설명하면 이렇습니다. 특정 구간내에 값과 테이블내 각 값들에 의해 나누어지는 구간이
몇개가 되느냐에 따라 반복 횟수가 정해지게 됩니다.

바로 예제 소스코드를 보시죠.

DATA: BEGIN OF wa1,
        col1 TYPE i,
        col2 TYPE i,
        col3 TYPE string,
      END OF wa1.

DATA: BEGIN OF wa2,
        col1 TYPE i,
        col2 TYPE i,
        col3 TYPE string,
      END OF wa2.

DATA: itab1 LIKE STANDARD TABLE OF wa1,
      itab2 LIKE STANDARD TABLE OF wa2.

DATA: flag1(1) TYPE c,
      flag2(1) TYPE c.

itab1 = VALUE #( ( col1 = 1 col2 = 6  col3 = 'Itab1 Int1' )
                 ( col1 = 9 col2 = 12 col3 = 'Itab1 Int2' ) ).
itab2 = VALUE #( ( col1 = 4 col2 = 11 col3 = 'Itab2 Int1' ) ).

DATA output TYPE TABLE OF string WITH EMPTY KEY.
PROVIDE FIELDS col3 FROM itab1 INTO wa1
                               VALID flag1
                               BOUNDS col1 AND col2
        FIELDS col3 FROM itab2 INTO wa2
                               VALID flag2
                               BOUNDS col1 AND col2
        BETWEEN 2 AND 14.
  APPEND | { wa1-col1 WIDTH = 2 } { wa1-col2 WIDTH = 2 } {
             wa1-col3 } { flag1 } | TO output.
  APPEND | { wa2-col1 WIDTH = 2 } { wa2-col2 WIDTH = 2 } {
             wa2-col3 } { flag2 } | TO output.
  APPEND INITIAL LINE TO output.
ENDPROVIDE.
cl_demo_output=>display( output ).

저도 위 소스코드를 실행하여 결과를 확인해도 잘 이해를 못했는데,

아래 테이블내 데이터간 간격을 확인하며 결과를 보니 그제서야 위 로직을 이해하게 되었습니다.

위 소스코드에서 Itab1과 Itab2에 추가된 데이터 값을 펼쳐보면 아래와 같습니다.

출처 : https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapprovide.htm

Itab1의 첫번째 데이터 col1의 값은 1이고 col2의 값은 6이므로, 아래 Itabl1 Int1으로

표현할 수 있습니다. Itab1의 두번째 데이터 col1의 값은 9이고 col2의 값은 14이므로

Itab1 Int2의 영역으로 표현할 수 있습니다.

Itab2의 첫번째 데이터는 col1의 값은 4이고 col2의 값은 11이므로 Itab2 Int1의 영역에 해당합니다.

마지막으로 Provider 옵션에 BETWEEN 구문을 추가하여 2 ~ 14 까지 간격을 추가로 설정했습니다.

그럼 결국 Loop를 5번 돌게 됩니다.

  • 1번째 Loop : 2 ~ 3
  • 2번째 Loop : 4 ~ 6
  • 3번째 Loop : 7 ~ 8
  • 4번째 Loop : 9 ~ 12
  • 5번째 Loop : 12 ~ 12

5번 반복문을 돌면서 각 테이블내 필요한 필드를 조합하여 또 다른 하나의 테이블을 생성할 수 있습니다.
이를 LOOP STATEMENT로 구현한다면 엄청 길어지겠죠? 🙂

부족한 부분은 더 추가토록 하고 질문은 댓글로 달아주시면 확인 후 답변 드리겠습니다.

Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
kjson
kjson
1 year ago

이해가 잘 안되네요 ㅠ 혹시 이해하신 부분을 조금 더 자세하게 말씀해주실 수 있으실까요?? ^^