SAP에서 ABAP으로 Report 프로그램을 개발할 때 검색 조건을 입력 받기 위해 PARAMETER와 SELECT-OPTIONS 키워드를 사용하게 됩니다.
단일 조건 값을 입력 받을 때 PARAMETER를 주로 사용하게 되고, 인터널테이블 형식으로 다중 조건 값을 입력 받을 때 SELECT-OPTIONS를 사용하게 됩니다.
SELECT-OPTIONS를 사용할 경우 다양한 옵션을 지정할 수 있어 무척 편리하게 사용할 수 있습니다.
SELECT-OPTIONS로 입력 받은 변수는 SQL Query 문에서 ‘IN’ 키워드를 사용하여 쉽게 검색 데이터를 가져올 수 있습니다.
리포트 프로그램의 SELECTION-SCREEN에서 SELECT-OPTIONS로 변수를 선언하지 않아도 RANGES 키워드를 사용하거나 인터널테이블 형식을 직접 선언해서 동일한 형식의 변수를 만들어 사용할 수 있습니다.
SELECT-OPTIONS를 사용할 수 없는 스크린 프로그램(On-Line Program)에서는 이렇게 직접 SELECT-OPTIONS 변수를 만들어 사용하면 됩니다.
이번 글에서는 ABAP에서 RANGES를 사용하여 SELECT-OPTIONS 형식의 변수 만드는 방법 3가지에 대해 알아보겠습니다.
ABAP에서 Range Table(범위 테이블)을 만드는 3가지 방법
▶ 첫 번째로 인터널 테이블을 만들 때서 Range Table 형식으로 선언해서 만드는 방법입니다.
DATA: BEGIN OF so_sel OCCURS 0,
SIGN(1),
OPTION(2),
LOW LIKE f,
HIGH LIKE f,
END OF so_sel.
- 위와 같이 선언을 해 주면 so_sel 이라는 인터널 테이블이 만들어 지면서 Range Table의 성격을 가지게 됩니다.
▶ 두 번째는 RANGES 키워드를 사용하여 Range Table을 만드는 방법입니다.
RANGES so_sel FOR ztest-name.
- 위와 같이 선언을 해 주면 ztest 테이블의 name 컬럼의 데이터 형식을 갖는 so_sel 이라는 Range Table이 만들어 지게 됩니다.
▶ 세 번째는 DATA 선언에서 TYPE RANGE OF를 사용해서 Range Table을 만드는 방법입니다.
DATA so_sel TYPE RANGE OF ztest-name.
- 위와 같이 선언을 해 주면 ztest 테이블의 name 컬럼의 데이터 형식을 갖는 so_sel 이라는 Range Table이 만들어 지게 됩니다.
Range Table(범위 테이블)에 대한 이해
▶ Range Table(범위 테이블)은 쿼리 문이나 IF 문 또는 LOOP 등에서 “IN” 관계 연산자를 사용할 수 있는 특수한 구조의 인터널 테이블입니다.
1) SIGN : 포함할 것인지? 배제할 것인지? 선택 구성 요소
‘I‘ for “Inclusive”
‘E‘ for “Exclusive”
2) OPTION : Low와 High에서 받은 값을 어떻게 처리할 것인지 선택 구성 요소
EQ (EQual)
BT (BeTween … and …)
CP (Contains Pattern)
LE (Less than or Equal)
GE (Greater than or Equal)
NE (Not Equal to)
NB (Not Between … and …)
NP (Not contains Pattern)
GT (Greater Than)
LT (Less Than)
3) LOW : Low 입력 값 구성 요소
– the comparison value
– with BT, this is the lower limit of the range.
4) HIGH : High 입력 값 구성 요소
– with BT and NB, the higher limit of the range
SELECT-OPTONS 범위 테이블(Range Table) 사용 예제
▶ 앞에서 만든 Range Table을 ABAP에서 실제 사용하는 예제 입니다.
MOVE: ‘I’ TO so_sel-SIGN,
‘EQ’ TO so_sel-OPTION,
‘12345’ TO so_sel-LOW. ” HIGH 생략 가능
APPEND so_sel. CLEAR so_sel.
so_sel-SIGN = ‘I’
so_sel-OPTION = ‘BT’.
so_sel-LOW = ‘AAA’.
so_sel-HIGH = ‘DDD’.
APPEND so_sel. CLEAR so_sel.
SELECT name INTO wa_name
FROM ZTEST
WHERE name IN so_sel.
WRITE :/ wa_name.
ENDSELECT.
|
▷ 결과 : 12345, AAA에서 DDD까지의 데이터
결론
Range Table(범위 테이블)은 다양한 곳에서 사용할 수 있습니다. SQL 쿼리에서 IN 뿐만 아니라 IF 문이나 LOOP 문에서도 활용할 수 있습니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^