여기에 올라온 자료를 봤는데도 이해가 안되네요.. 머리가 나쁜건가;;;
정확한 의미와 사용법을 알려주세요
댓글 7
-
SSong
2007.11.15 01:34
-
SkyDream
2007.11.15 02:04
SUBMIT, CHECK, IF, WHILE or SELECT 문장에서 IN 이라는 연산자(operator)를 사용할때
IN 다음에 오는 변수는 internal table형태가 와야 하며 그 구조가 정해져 있습니다.
예를들어 sel이라는 internal table을 사용한다고 할때 sel의 구조는 항상 다음과 같은 구조로 되어 있어야 합니다.
DATA: BEGIN OF sel OCCURS 10,
SIGN(1), "I : include, E : Exclude ...
OPTION(2), "EQ: =, NE: <> ...
LOW LIKE table-field, "하한값
HIGH LIKE table-field, "상한값
END OF sel.
위와 같은 구조로 internal table을 선언하는 방법은 아래 2가지가 있습니다. 물론 위의 방법대로 선언해도 됩니다.
1) RANGES sel FOR table-field.
2) SELECT-OPTIONS sel For table-field.
이렇게 선언하면 위의 Internal table선언한 것과 동일합니다.
한 가지 SELECT문에서의 사용예는....
(결재년월 P_MONTH를 입력받아서 해당월의 DATA를 가져오는 예 - 결재월의 1일 부터 말일까지를 조회기간으로 설정)
RANGES r_csetdt FOR ztrmst11v-zcsetdt. "결재일 기간
* 해당월의 시작일/말일 계산
MOVE 'I' TO r_csetdt-sign.
MOVE 'BT' TO r_csetdt-option.
CONCATENATE p_month '01' INTO r_csetdt-low.
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
day_in = r_csetdt-low "해당월 1일
IMPORTING
last_day_of_month = r_csetdt-high "해당월 말일
EXCEPTIONS
day_in_no_date = 1
OTHERS = 2.
APPEND r_csetdt.
SELECT * ....
FROM ztrmst11v
WHERE zcsetdt IN r_csetdt. <--- 여기서 사용.
editor에서 RANGES에 대해 F1을 누르면 자세하게 설명되어 있습니다. 참고하세요.
-
썬바바
2007.11.15 20:55
주의하실 사항은 Range도 일종의 테이블 구조로 되어 있습니다. 하지만 그 range로 만들어진 것에 넣을 때 record수가 제한이 있다는것
명심해야 할것같네요..너무 많은 레코드를 넣으면 short dump떨어집니다...
-
BEST!!
2007.11.16 00:17
감사합니다..그래도 아리송 하네요..ㅠㅠ -
뱅가니
2007.12.06 19:10
잘모르겠지만 감사합니다. 좋은자료..계속 부탁드려요. -
초향이
2007.12.07 23:52
좋은 내용 감사드려요.. -
릴렉군주
2017.09.14 22:20
좋은 내용 잘보고 갑니다.
ranges 변수를 쉽게 설명 하자면 SELECT WHRE 절에서 IN 절로 많이 사용됩니다.
그러면 그냥 IN를 사용하면 되지 왜 어렵게 ranges 변수를 사용하냐면 ...
예를 들어서
날짜 IN ('200701','200702') 이렇게 된다고 생각해 봅시다 .
꼭 이두개만 사용된다면 모를 테지만 그게 아니라 사용자가 날짜를 지정한다고 생각해 봅시다 .
즉 '200701' ,'200702' ,'200703' ,'200704' 이렇게 가져 올때도 있고 안가져 와야 할때도 있고
유동적으로 가져 와야 한다면 IN 절로 만들기가 조금 곤란합니다 .
그래서 ranges 변수를 사용하여 인터널 테이블에 담아서 유동적 IN 절을 만들수 가 있는겁니다 .
IMTART-SIGN = 'I'. ---> INCLUSIVE (I), Exclusive(E)
IMTART-OPTION = 'EQ'. ---> EQ (같다), BT (사이) , GE(이상), LE(이하) ,GT(초과),LT(미만),NE(같지않다) ,CP(패턴포함)
IMTART-LOW = '200701' ---> FROM 값
IMTART-HIGH = --> TO 값
APPEND IMTART.
IMTART-SIGN = 'I'.
IMTART-OPTION = 'EQ'.
IMTART-LOW = '200702'
APPEND IMTART.
IMTART-SIGN = 'I'.
IMTART-OPTION = 'EQ'.
IMTART-LOW = '200703'
APPEND IMTART.
IMTART-SIGN = 'I'.
IMTART-OPTION = 'EQ'.
IMTART-LOW = '200704'
APPEND IMTART.
이렇게 하고
날짜 IN IMTART
이렇게 사용한다면 얼마든지 인터널 테이블을 이용해서 데이타를 가져 올수 있겠죠 ~~
보통 저는 한 인터널 테이블에서 특정 필드값에 해당하는 데이타를 가져 와야 할때
인터널 테이블을 ranges 에 담아서 IN 절에 비교 해서 많이 사용합니다 .
한번 만들어 보시면 이해가 잘 될꺼라 생각이 듭니다 . ^^