현재 파라미터로 입력값을 받아서
move p_WERKS1 to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat.
무브해서 gt_list1으로 모디파이 시켰었는데요
셀렉트 옵션으로 입력값을 바꾸는 과정에서
move s_WERKS1 to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat
s_WERKS1 의 값이 1000~9000이라 가정했을때 gt_list1-werks의 값으로 다 들어가야 하는데요
이럴떄 어떤구문을 쓰면 될까요? 전 레인지를 써야 하나 해서 이렇게 해봤는데요
RANGES: R_WERKS1 FOR MARC-WERKS .
IF S_WERKS1 IS NOT INITIAL.
R_WERKS1-sign = 'I'.
R_WERKS1-option = 'EQ'.
CONCATENATE S_WERKS1-LOW ' ' INTO r_WERKS1-low.
CONCATENATE S_WERKS1-HIGH ' ' INTO r_WERKS1-HIGH.
APPEND R_WERKS1. CLEAR R_WERKS1.
ENDIF.
이렇게 레인지 변수로 하고
무브를 해주려고 했는데..
move r_WERKS1 to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat.
이렇게는 원하는 값으로 안들어가네요 .. ^^;;
무브 말고 딴걸 써야 하는건지 레인지 변수가 아닌건지 헷갈려서요
알려주시면 감사하겠습니다 ~
*********************************************************************
답변 감사합니다.
저는
SELECT-OPTIONS : S_WERKS1 FOR marc-WERKS .으로 주었구요.
제가 하려고 하는건 S_WERKS1입력값에 low값은 1 high 값은 4으로 주었을떄
1,2,3 ,4모두 가져오려고 하는건데요
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_LIST5
FROM MARC
WHERE WERKS IN S_WERKS1
AND MATNR IN S_MATNR1.
GT_LIST5에서 값이 '2'가 포함되어있다면
2는
move GT_LIST5-werks to GT_LIST1-werks .
MOVE GT_LIST5-pstat TO GT_LIST1-pstat.
MOVE 'O' TO GT_LIST1-P_STATUS. 이런식으로 해서 o로 모디파이해주고요
GT_LIST5 에 없는 1, 3, 4는
move 1 to GT_LIST1-werks .
MOVE GT_LIST5-pstat TO GT_LIST1-pstat.
MOVE 'X' TO GT_LIST1-P_STATUS.
move 3 to GT_LIST1-werks .
MOVE GT_LIST5-pstat TO GT_LIST1-pstat.
MOVE 'X' TO GT_LIST1-P_STATUS. 1,3, 4은 x로 하고 싶은건데요
현재 말씀하신걸로 봐서 레인지를 쓰는건 아닌듯 하여
loop at S_WERKS1.
move S_WERKS1 to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat.
endloop.
이렇게 해보려고 하니 ibt가 들어가고
loop at S_WERKS1.
move S_WERKS1-low to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat.
move S_WERKS1-high to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat.
endloop.
이렇게 하니 중간값인 3은 나오지 않는데요
이럴땐 어떤식으로 해야 하나요?
댓글 6
-
아밥 잭
2010.09.10 01:08
-
Kate
2010.09.10 01:11
질문의 요지가 정확히 뭔지 모르겠지만.. 레인지로 받으려면 처음부터 select-options 로 받으면 되는데
왜 파라미터로 받아서 그걸 굳이 레인지변수에 담으시려는건가요?
그리고
move r_WERKS1 to GT_LIST1-werks .
MOVE 'X' TO GT_LIST1-P_STATUS.
MOVE '' TO GT_LIST1-pstat.
요 부분에서요....
r_werks1 요건 일종의 스트럭쳐(헤더라고봤을 때)이고
gt_list1-werks 이거는 일종의 필드라고 볼 수 있어서
무브를 이렇게 사용한 것 자체가 이상하네요.
사족이지만~
select-options나 range나 둘 다 테이블인데..
range변수는 주로 select-options로 받은 변수로
function을 호출할 때 범위를 넘겨주기 위해 사용한답니다. -
맑은하늘
2010.09.10 01:21
기본적으로 LIST 의 레코드 1건과 S_WERKS 로 입력받은 조건은 서로 매핑되기 힘들어요
조건이 반드시 1건(I,EQ,LOW)만 들어온다면 가능하겠지만 그렇지 않다면 조건으로 들어온
WERKS 와 LIST의 WERKS 는 구조가 다르기 때문에 위처럼 코딩할 수 없습니다.
위와 같은 경우는 S_WERKS 를 조건으로하는 데이터로 선택된 데이터가 LIST의 WERKS가
될 수 있을 뿐이죠. 위와 같이 하시려면
DATA : BEGIN OF GT_LIST1 OCCURS 0,
...
WERKS TYPE RANGE OF WERKS_D,
...
END OF GT_LSIT1.
와 같은 경우일 뿐일 겁니다. 그러나 위 프로그램은 이런게 아닐 것이라고 사료됩니다.
원하는 것이 무엇인지 잘 살펴보신후 LIST에 들어가야할 플랜트가 어디서 오는 것인지
먼저 살펴보셔야 할 것 같네요. 즐밥하세요. ^^
-
맑은하늘
2010.09.10 02:04
select 해서 조건에 해당하는 werks 가 gt_list5 에 들어갔을 거구요
그럼
if gt_list5-werks = '2'.
MOVE 'O' TO GT_LIST1-P_STATUS.
else.
MOVE 'X' TO GT_LIST1-P_STATUS.
endif.
라고 하시면 될 것 같은데요..^^;;
-
Kate
2010.09.11 03:09
그러니까 님이 하고싶은게..
범위안에 있는 값들을 GT_LIST5에 읽어와서
있으면 status = o
없으면 status = x
로 GT_LIST1에 모디파이하고 싶다.. 이 말씀이신거죠?
1. 일단 앞에서 쓰신 것 처럼 GT_LIST5에 값을 읽어오구요.
2. GT_LIST1을 loop 돌리면서 READ TABLE GT_LIST5 WITH KEY WERKS = GT_LIST1-WERKS.하셔서
3. IF SY-SUBRC = 0. GT_LIST1-PSTATUS = 'O'. ELSE. GT_LIST1-PSTATUS = 'X'. ENDIF.
4. MODIFY GT_LIST1.
하시면 될 것 같네요....
GT_LIST1 이 테이블이 빈테이블이라면 S_WERKS1의 범위만큼 loop돌리시면서
GT_LIST1-WERKS에 값을 채우신다음 1~4의 과정을 하시면 될거 같네요...
질문의 내용으로 지금 정확히 알 수 없는게 있는데요.....
예시처럼 low값을 1 high값을 4, 이렇게 연속된 숫자로 추측이 가능한 경우라면 1과 4 사이에 2와 3이 있다는 걸 알 수가 있지만..
아마도 werks 값이라면 꼭 규칙적인 값이 있으리라고 장담을 할 수가 없을 것같은데...
일단은 GT_LIST1에 들어가야할 모든 WERKS 값을 먼저 구해오는 것이 순서인거 같네요..
-
Kate
2010.09.11 03:23
마지막문장에 덧붙이자면, 질문을 제가 잘못이해한 것 같기도해서 그런데...
아밥콩님께서 GT_LIST5에 데이터를 SELECT 해올 때, S_WERKS1의 범위 안에 있는 값을 읽어온다고 했는데...
S_WERKS에 해당하는게 1~4라면....
1, 2, 3, 4에 해당하는 값이 GT_LIST5에 있을 수도 있고 없을 수도 있잖아요~ (범위일 뿐이니까요)
그런데, 이렇게 읽어오고나면, GT_LIST5에 2와 4 값이 없다고 한들, '2'와 '4'가 빠졌다는걸 알 수가 없다는거죠..
즉, 1~4라고 할 때 1.5일 수도 있고 2.3 일수도 있잖아요?
그렇기 때문에 GT_LIST1에 들어가야할 모든 WERKS 값이 필요하다라고 쓴거입니다.
일단, range는 테이블이라고 생각하면되고요. 따라서 여러개가 있으면 loop문으로 읽을 수 있습니다.
그리고 다음문장은 안됩니다.
move r_WERKS1 to GT_LIST1-werks .
gt_list1-werks는 필드이기 때문에 r_werks1안의 정보를 쭐 때 low,high를 정확히 적어주어야합니다.'
즉, move r_werks1-low to gt_list10werks.
또는 move r_werks1-high to gt_list10werks.
따라서 이런 규칙을 참조하여 데이더는 가공하세요.
감사합니다.