SAP/ABAP 기초

(ABAB) RANGES와 SELECT-OPTION에 대하여

haramang 2021. 6. 15. 23:54

- RANGES와 SELECT-OPTIONS 둘 다 SELECTION-SCREEN에서 범위를 지정하기 위해 사용하는데 둘 사이의 차이점을 알아보도록 하자.

 

- 일단 시작하기 앞서 SELECT-OPTIONS와 RANGES의 필드 구조를 먼저 보자.


1. SIGN - 포함여부
   I(INCLUDE) 포함, E(EXCLUDE) 제외
2. OPTION - 논리연산자
   EQ - EQUAL
   NE - NOT EQUAL
   LE - LESS OR EQUAL
   LT - LESS THAN
   GE - GREATER OR EQUAL
   GT - GREATER THAN
   BT - BETWEEN
   NB - NOT BETWEEN
   CP - CONTAINS PATTERN ( SQL문의 IN과 같다고 함)
   NP - DOES NOT CONTAIN PATTERN ( SQL문의 NOT IN과 같다고 함)
3. LOW
   하위 값
4. HIGH
   상위 값

 

 

1. RANGES

  • SELECTION-SCREEN에 보여지지 않는다.
  • 프로그램 내에서 직접 선언해야 한다. (INTERNAL TABLEF로 만들어 짐)
예제1과 예제2는 똑같이 다음과 같이 셋팅 함.

SIGN='I' -        INCLUDE (포함)
OPTION = 'BT'  BETWEEN (사이)
LOW = 'AA'      A부터
HIGH = 'LH'      LH까지


* RANGES 예제1)

* RANGES로 S_CARID2라는 RAGES 변수를 생성하고, SIGN, OPTION, LOW, HIGH 값을 셋팅한 후 APPEND로 INTERNAL TABLE에 값을 추가한다. 즉, SIGN, OPTION, LOW, HIGH필드를 직접 셋팅한 후, RANGES 변수(INTERNAL TABLE)인 S_CARID2에 넣겠다는 소리.

RANGES S_CARID2 FOR SPFLI-CARRID.
S_CARID2-SIGN = 'I'.
S_CARID2-OPTION = 'BT'.
S_CARID2-LOW = 'AA'.
S_CARID2-HIGH = 'LH'.
APPEND S_CARID2.

SELECT *
       FROM SPFLI
       WHERE CARRID IN @S_CARID2
       INTO TABLE @DATA(SPFLI_TAB2).
BREAK-POINT.


* RANGES 예제2)
TYPES CARRID_RANGE TYPE RANGE OF SPFLI-CARRID.
DATA(carrid_range) = VALUE carrid_range(
  ( sign = 'I' option = 'BT' low = 'AA' high = 'LH') ).
SELECT *
       FROM SPFLI
       WHERE CARRID IN @CARRID_RANGE
       INTO TABLE @DATA(SPFLI_TAB3). 
BREAK-POINT.


우선, SPFLI_TAB2와 SPFLI_TAB3 테이블들에 들어가있는 데이터들은 같아야 한다.
SPFLI테이블에서 CARRID가 AA부터 LH까지인 데이터의 갯수를 먼저 파악해보자!
16개의 데이터가 SPFLI_TAB2와 SPFLI_TAB3에 들어야 있어야 하며, 나머지 CONNID, CITYFROM 등 모두 데이터가 동일해야 한다.

SPFLI_TAB2의 데이터를 보자.
다음으로 SPFLI_TAB3의 데이터를 보자.
둘 다 동일하며, SPFLI 테이블에서 CARRID가 AA와 LH사이의 모든 데이터들을 가져왔다.

즉, RAGES는 SELECT-OPTIONS와 다르게 SELECTION-SCREEN에 보여지진 않지만, 프로그램 내에서 가져올 데이터들의 RANGE를 직접 정해서 가져올 때 사용된다고 보면 될 것 같다.

 

2. SELECT-OPTION

  • SELECTION-SCREEN에 보여진다.
  • SELECT-OPTIONS 변수가 자동으로 생성된다. (INTERNAL TABLE로 만들어 짐)
SELECT-OPTIONS으로 S_CARRID를 만들면 INTERNAL TABLE이 스스로 만들어진다! RANGES와는 다름!

이때, S_CARRID를 만들기 위해 사용된 SPFLI_WA-CARRID에 뭐가 들어있는지 확인해보자.

SPFLI_WA-CARRID에는 다음과 같은 항목들이 담겨져 있다. (돋보기를 누르면 다음과 같은 POSSIBLE ENTRY 뜸)

그럼 프로그램을 실행했을 때, SPFLI_WA-CARRID와 같은 POSSIBLE ENTRY가 뜨는지 확인해보자.

동일한 POSSIBLE ENTRY가 뜬다!

즉, 코드에서
SELECT-OPTIONS s_carrid FOR spfli_wa-carrid.
구문은 SPFLI_WA-CARRID에서 POSSIBLE ENTRY를 가져와 S_CARRID라는 변수(INTERNAL TABLE)에 자동으로 할당해 주는 것을 알 수 있다.


 

 

종합 예제



*&---------------------------------------------------------------------*
*& SELECT-OPTIONS 예제
*&---------------------------------------------------------------------*

TABLES SPFLI.


* SELECT-OPTIONS 생성 - SPFLI_WA의 CARRID 의 SELECT-OPTIONS 리스트를 가져옴.
SELECT-OPTIONS S_CARID1 FOR SPFLI-CARRID.

 
* SPFLI에서 CARRID가 S_CARID1에 셋팅된 필드의 값을 가져와 SPFLI_TAB1에 저장한다.
SELECT *
       FROM SPFLI
       WHERE CARRID IN @S_CARID1
       INTO TABLE @DATA(SPFLI_TAB1).
 
 

*&---------------------------------------------------------------------*
*& RANGES 예제
*&---------------------------------------------------------------------*

 

* RANGES 예제1)
* S_CARID2에 SPFLI-CARRID의 POSSIBLE ENTRY를 가져온다. (INTERNAL TABLE로 생성 됨)
* S_CARID2에 SIGN, OPTION, LOW, HIGH필드를 셋팅 후 APPEND.

RANGES S_CARID2 FOR SPFLI-CARRID.
S_CARID2-SIGN = 'I'.
S_CARID2-OPTION = 'BT'.
S_CARID2-LOW = 'AA'.
S_CARID2-HIGH = 'LH'.
APPEND S_CARID2.

 



* SPFLI에서 CARRID가 S_CARID2에 셋팅된 필드의 값을 가져와 SPFLI_TAB2에 저장한다.
SELECT *
       FROM SPFLI
       WHERE CARRID IN @S_CARID2
       INTO TABLE @DATA(SPFLI_TAB2).
BREAK-POINT.

 


* RANGES 예제2)
TYPES CARRID_RANGE TYPE RANGE OF SPFLI-CARRID.

 
DATA(carrid_range) = VALUE carrid_range(
  ( sign = 'I' option = 'BT' low = 'AA' high = 'LH') ).
 
SELECT *
       FROM SPFLI
       WHERE CARRID IN @CARRID_RANGE
       INTO TABLE @DATA(SPFLI_TAB3).
BREAK-POINT.

'SAP > ABAP 기초' 카테고리의 다른 글

(ABAP) FUNCTION MODULES - 1  (0) 2021.06.17
(ABAP) OPERATOR 종류  (0) 2021.06.17
(ABAP) REPORT 와 MODULE-POOL 프로그램의 차이  (0) 2021.06.15
(ABAP) FIELD SYMBOL과 CASTING  (0) 2021.06.14
(ABAP) REFRESH, CLEAR, FREE에 대하여  (0) 2021.06.14