SAP/ABAP

ABAP RANGE 변수를 PERFORM 문의 파라메터로 사용하기

그녀는애교쟁이 2014. 9. 4. 00:00
반응형

RANGE 변수는 참으로 신기한 변수 형태이다. 다른 언어에서는 없는 특이한 변수형이긴 하다. ABAP 에서도 특이한 부분인데 Internal Table 도 아닌 것이 그렇다고 변수도 아닌 것이 그 중간쯤의 형태를 가지고 있다. 오늘 포스팅 하고자 하는 내용은 이 특이한 RANGE 변수를 PERFORM 문에서 파라메터로 사용하는 방법이다. 결론부터 말하자면 RANGE 변수도 TABLE 처럼 PERFORM 문에 사용하면 된다는 것이다. 프로그래밍 할 때 RANGE 변수를 선언 하는 부분을 제외하면 Internal Table 로 생각하고 개발을 한다면 더 쉽게 개발을 할 수 있다


RANGE 변수는 성능 개선을 위해 사용하기도 하는데, RANGE 변수에는 데이터가 무한대로 들어가는게 아니라는게 중요하다. 얼마인지 기억이 안나지만 10,000건은 안 들어가고 에러가 나서 FOR ALL ENTRIES 로 변경했던 경험이 있었다. 이건 다른 이야기는 이만 줄이고 나중에 포스팅 할 기회가 된다면 그 때 다뤄 보도록 하겠다. 


아래의 코드를 설명하자면 TOP 에 전역변수로 RANGE 변수를 선언한 이후에 Perform 문에서 파라메터 부분에 Table 을 넣듯이 Tables ~ Structure 구문을 이용하여 선언하면 되겠다. 그리고 RANGE 변수는 SIGN, OPTION, LOW, HIGH 를 가진 Table 구조로 인식하여 1일~말일까지의 날짜를 넣어주었다.


" Include ***Top 에 전역 변수로 Ranges 로 변수를 선언한다.
RANGES : GR_DATE FOR SY-DATUM.



" Include ***F00 에 Perform 문에 테이블을 파라메터로 사용하는 것과 같이 선언한다.
FORM GET_DATE_RANGE TABLES PR_BUDAT STRUCTURE GR_DATE.

  DATA LR_BUDAT LIKE RANGE OF SY-DATUM WITH HEADER LINE.

  LR_BUDAT-SIGN   = 'I'.
  LR_BUDAT-OPTION = 'BT'.
  CONCATENATE P_GJAHR SO_MONAT-LOW '01' INTO LR_BUDAT-LOW.

  CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
    EXPORTING
      DAY_IN            = LR_BUDAT-LOW
    IMPORTING
      LAST_DAY_OF_MONTH = LR_BUDAT-HIGH
    EXCEPTIONS
      DAY_IN_NO_DATE    = 1
      OTHERS            = 2.

  APPEND LR_BUDAT TO PR_BUDAT.

ENDFORM.                    " GET_DATE_RANGE